From ac0d96bd742453722bbf770e9c9b1b4ba71dbce0 Mon Sep 17 00:00:00 2001 From: Jaysyn904 <68194417+Jaysyn904@users.noreply.github.com> Date: Wed, 14 Jul 2021 16:40:26 -0400 Subject: [PATCH] Gamma Age module files Added internal Gamma Age module files. --- gamma_age_v2/DMBookofJournalE.uti | Bin 0 -> 1153 bytes gamma_age_v2/Repute.fac | Bin 0 -> 2796 bytes gamma_age_v2/ab_desctrig_fnf.ncs | Bin 0 -> 234 bytes gamma_age_v2/ab_desctrig_fnf.nss | 78 + gamma_age_v2/ab_desctrig_mult.ncs | Bin 0 -> 124 bytes gamma_age_v2/ab_desctrig_mult.nss | 74 + gamma_age_v2/adventurers_inn.are | Bin 0 -> 3777 bytes gamma_age_v2/adventurers_inn.gic | Bin 0 -> 3070 bytes gamma_age_v2/adventurers_inn.git | Bin 0 -> 27851 bytes gamma_age_v2/albilope.utc | Bin 0 -> 5170 bytes gamma_age_v2/albilope001.utc | Bin 0 -> 4782 bytes gamma_age_v2/albilopegore.uti | Bin 0 -> 1106 bytes gamma_age_v2/albilopehide.uti | Bin 0 -> 1106 bytes gamma_age_v2/android.utc | Bin 0 -> 4915 bytes gamma_age_v2/android001.utc | Bin 0 -> 4910 bytes gamma_age_v2/android002.utc | Bin 0 -> 4911 bytes gamma_age_v2/android003.utc | Bin 0 -> 4913 bytes gamma_age_v2/androidproperti.uti | Bin 0 -> 2143 bytes gamma_age_v2/ark.utc | Bin 0 -> 6247 bytes gamma_age_v2/armyofthedeep.uti | Bin 0 -> 822 bytes gamma_age_v2/arn.utc | Bin 0 -> 5055 bytes gamma_age_v2/arnhide.uti | Bin 0 -> 963 bytes gamma_age_v2/array_example.ncs | Bin 0 -> 8346 bytes gamma_age_v2/array_example.nss | 143 + gamma_age_v2/ashlw002.uti | Bin 0 -> 713 bytes gamma_age_v2/ashlw003.uti | Bin 0 -> 713 bytes gamma_age_v2/ashto002.uti | Bin 0 -> 713 bytes gamma_age_v2/attercop.utc | Bin 0 -> 4891 bytes gamma_age_v2/attercophide.uti | Bin 0 -> 1106 bytes gamma_age_v2/autoclose_door.ncs | Bin 0 -> 137 bytes gamma_age_v2/autoclose_door.nss | 7 + gamma_age_v2/badder.utc | Bin 0 -> 6698 bytes gamma_age_v2/badderchainmail.uti | Bin 0 -> 1516 bytes gamma_age_v2/badderhelm.uti | Bin 0 -> 932 bytes gamma_age_v2/badderhelm001.uti | Bin 0 -> 935 bytes gamma_age_v2/badderhide.uti | Bin 0 -> 972 bytes gamma_age_v2/baddershield.uti | Bin 0 -> 739 bytes gamma_age_v2/bamutan.utc | Bin 0 -> 4747 bytes gamma_age_v2/bamutencarpace.uti | Bin 0 -> 1113 bytes gamma_age_v2/banded_lg.uti | Bin 0 -> 1754 bytes gamma_age_v2/banded_med.uti | Bin 0 -> 2013 bytes gamma_age_v2/banded_med_a.uti | Bin 0 -> 2017 bytes gamma_age_v2/banded_sm.uti | Bin 0 -> 1754 bytes gamma_age_v2/banded_st.uti | Bin 0 -> 1882 bytes gamma_age_v2/barxyn.utc | Bin 0 -> 6921 bytes gamma_age_v2/bench001.utp | Bin 0 -> 2053 bytes gamma_age_v2/besiepwres.utp | Bin 0 -> 2421 bytes gamma_age_v2/besiewidget.uti | Bin 0 -> 1190 bytes gamma_age_v2/bigoon.utc | Bin 0 -> 4833 bytes gamma_age_v2/blaash.utc | Bin 0 -> 5662 bytes gamma_age_v2/blight.utc | Bin 0 -> 5499 bytes gamma_age_v2/blightbite.uti | Bin 0 -> 972 bytes gamma_age_v2/blightbuffet.uti | Bin 0 -> 978 bytes gamma_age_v2/blighthide.uti | Bin 0 -> 1228 bytes gamma_age_v2/bloodbird.utc | Bin 0 -> 4885 bytes gamma_age_v2/bloodbirdhide.uti | Bin 0 -> 1494 bytes gamma_age_v2/bplate_med.uti | Bin 0 -> 2005 bytes gamma_age_v2/bplate_med002.uti | Bin 0 -> 2007 bytes gamma_age_v2/brutorz.utc | Bin 0 -> 5640 bytes gamma_age_v2/brutorzkick.uti | Bin 0 -> 975 bytes gamma_age_v2/buggem.utc | Bin 0 -> 5118 bytes gamma_age_v2/bulo.utc | Bin 0 -> 4830 bytes gamma_age_v2/bulo001.utc | Bin 0 -> 4989 bytes gamma_age_v2/bulohide.uti | Bin 0 -> 1478 bytes gamma_age_v2/calthen.utc | Bin 0 -> 5109 bytes gamma_age_v2/calthenbite.uti | Bin 0 -> 1104 bytes gamma_age_v2/carrin.utc | Bin 0 -> 11438 bytes gamma_age_v2/carrinhide.uti | Bin 0 -> 972 bytes gamma_age_v2/carrinstaff.uti | Bin 0 -> 1295 bytes gamma_age_v2/centurionrobot.utc | Bin 0 -> 6249 bytes gamma_age_v2/chain_sht_lg.uti | Bin 0 -> 1752 bytes gamma_age_v2/chain_sht_med.uti | Bin 0 -> 2011 bytes gamma_age_v2/chain_sht_sm.uti | Bin 0 -> 1752 bytes gamma_age_v2/chain_sht_st.uti | Bin 0 -> 1880 bytes gamma_age_v2/chainmail_lg.uti | Bin 0 -> 1750 bytes gamma_age_v2/chainmail_med.uti | Bin 0 -> 2009 bytes gamma_age_v2/chainmail_sm.uti | Bin 0 -> 1750 bytes gamma_age_v2/chainmail_st.uti | Bin 0 -> 1878 bytes gamma_age_v2/chair.uti | Bin 0 -> 1225 bytes gamma_age_v2/chair001.utp | Bin 0 -> 2065 bytes gamma_age_v2/chair1_sit.utp | Bin 0 -> 1863 bytes gamma_age_v2/chesexpropertie.uti | Bin 0 -> 1117 bytes gamma_age_v2/chessex.utc | Bin 0 -> 4790 bytes gamma_age_v2/chest002.utp | Bin 0 -> 1987 bytes gamma_age_v2/chest004.utp | Bin 0 -> 1998 bytes gamma_age_v2/civrobotproperti.uti | Bin 0 -> 1896 bytes gamma_age_v2/comclothes1.uti | Bin 0 -> 1508 bytes gamma_age_v2/comclothes10.uti | Bin 0 -> 1518 bytes gamma_age_v2/comclothes2.uti | Bin 0 -> 1508 bytes gamma_age_v2/comclothes3.uti | Bin 0 -> 1508 bytes gamma_age_v2/comclothes4.uti | Bin 0 -> 1508 bytes gamma_age_v2/comclothes5.uti | Bin 0 -> 1508 bytes gamma_age_v2/comclothes6.uti | Bin 0 -> 1508 bytes gamma_age_v2/comclothes7.uti | Bin 0 -> 1508 bytes gamma_age_v2/comclothes8.uti | Bin 0 -> 1508 bytes gamma_age_v2/comclothes9.uti | Bin 0 -> 1508 bytes gamma_age_v2/commonerspawner.utp | Bin 0 -> 2365 bytes gamma_age_v2/companionunitrob.utc | Bin 0 -> 4731 bytes gamma_age_v2/couch001.utp | Bin 0 -> 2033 bytes gamma_age_v2/creaturepalcus.itp | Bin 0 -> 133646 bytes gamma_age_v2/croaker.utc | Bin 0 -> 5562 bytes gamma_age_v2/cybohunter.utc | Bin 0 -> 9910 bytes gamma_age_v2/dabber.utc | Bin 0 -> 6824 bytes gamma_age_v2/dabberarnor.uti | Bin 0 -> 1504 bytes gamma_age_v2/dabbercloak.uti | Bin 0 -> 1168 bytes gamma_age_v2/dabberhide.uti | Bin 0 -> 972 bytes gamma_age_v2/dark_tunic.uti | Bin 0 -> 1602 bytes gamma_age_v2/deathbot.utc | Bin 0 -> 11089 bytes gamma_age_v2/debgon.utc | Bin 0 -> 5436 bytes gamma_age_v2/debgonproperti.uti | Bin 0 -> 1373 bytes gamma_age_v2/dem_color_text.utp | Bin 0 -> 1992 bytes gamma_age_v2/desolateanddespa.are | Bin 0 -> 12929 bytes gamma_age_v2/desolateanddespa.gic | Bin 0 -> 1224 bytes gamma_age_v2/desolateanddespa.git | Bin 0 -> 48315 bytes gamma_age_v2/dm_journal_entry.dlg | Bin 0 -> 1593 bytes gamma_age_v2/dmfi_500xp.uti | Bin 0 -> 1231 bytes gamma_age_v2/dmfi_activate.ncs | Bin 0 -> 15208 bytes gamma_age_v2/dmfi_activate.nss | 345 ++ gamma_age_v2/dmfi_afflict.uti | Bin 0 -> 1464 bytes gamma_age_v2/dmfi_arrays_inc.nss | 177 + gamma_age_v2/dmfi_buff.uti | Bin 0 -> 1138 bytes gamma_age_v2/dmfi_cond_dmw.ncs | Bin 0 -> 329 bytes gamma_age_v2/dmfi_cond_dmw.nss | 22 + gamma_age_v2/dmfi_custom_enc.are | Bin 0 -> 8013 bytes gamma_age_v2/dmfi_custom_enc.gic | Bin 0 -> 11609 bytes gamma_age_v2/dmfi_custom_enc.git | Bin 0 -> 28052 bytes gamma_age_v2/dmfi_db_biow_inc.ncs | Bin 0 -> 23 bytes gamma_age_v2/dmfi_db_biow_inc.nss | 66 + gamma_age_v2/dmfi_db_inc.ncs | Bin 0 -> 23 bytes gamma_age_v2/dmfi_db_inc.nss | 40 + gamma_age_v2/dmfi_db_nbde_inc.ncs | Bin 0 -> 23 bytes gamma_age_v2/dmfi_db_nbde_inc.nss | 65 + gamma_age_v2/dmfi_dicebag.uti | Bin 0 -> 1628 bytes gamma_age_v2/dmfi_dmbook.uti | Bin 0 -> 3883 bytes gamma_age_v2/dmfi_dmw.uti | Bin 0 -> 1764 bytes gamma_age_v2/dmfi_dmw_inc.ncs | Bin 0 -> 184 bytes gamma_age_v2/dmfi_dmw_inc.nss | 1198 ++++++ gamma_age_v2/dmfi_emote.uti | Bin 0 -> 1494 bytes gamma_age_v2/dmfi_en_ditto.uti | Bin 0 -> 1264 bytes gamma_age_v2/dmfi_encounte.uti | Bin 0 -> 1626 bytes gamma_age_v2/dmfi_execute.ncs | Bin 0 -> 180255 bytes gamma_age_v2/dmfi_execute.nss | 4193 ++++++++++++++++++++ gamma_age_v2/dmfi_exploder.uti | Bin 0 -> 1163 bytes gamma_age_v2/dmfi_faction.uti | Bin 0 -> 1233 bytes gamma_age_v2/dmfi_fx.uti | Bin 0 -> 1154 bytes gamma_age_v2/dmfi_getln_cbtpl.ncs | Bin 0 -> 74 bytes gamma_age_v2/dmfi_getln_cbtpl.nss | 35 + gamma_age_v2/dmfi_getln_inc.nss | 61 + gamma_age_v2/dmfi_init_inc.nss | 217 ++ gamma_age_v2/dmfi_jail_widget.uti | Bin 0 -> 1346 bytes gamma_age_v2/dmfi_music.uti | Bin 0 -> 1153 bytes gamma_age_v2/dmfi_mute.uti | Bin 0 -> 1304 bytes gamma_age_v2/dmfi_naming.uti | Bin 0 -> 1148 bytes gamma_age_v2/dmfi_onclienter.ncs | Bin 0 -> 6085 bytes gamma_age_v2/dmfi_onclienter.nss | 23 + gamma_age_v2/dmfi_onering.uti | Bin 0 -> 1168 bytes gamma_age_v2/dmfi_onmodhb.ncs | Bin 0 -> 320 bytes gamma_age_v2/dmfi_onmodhb.nss | 29 + gamma_age_v2/dmfi_onplychat.ncs | Bin 0 -> 3517 bytes gamma_age_v2/dmfi_onplychat.nss | 79 + gamma_age_v2/dmfi_onrest.ncs | Bin 0 -> 8506 bytes gamma_age_v2/dmfi_onrest.nss | 463 +++ gamma_age_v2/dmfi_pc_dicebag.uti | Bin 0 -> 1061 bytes gamma_age_v2/dmfi_pc_emote.uti | Bin 0 -> 1087 bytes gamma_age_v2/dmfi_pc_follow.uti | Bin 0 -> 1070 bytes gamma_age_v2/dmfi_pc_rest001.uti | Bin 0 -> 1196 bytes gamma_age_v2/dmfi_pc_rest002.uti | Bin 0 -> 1183 bytes gamma_age_v2/dmfi_pc_rest003.uti | Bin 0 -> 1184 bytes gamma_age_v2/dmfi_peace.uti | Bin 0 -> 1234 bytes gamma_age_v2/dmfi_playerbook.uti | Bin 0 -> 3286 bytes gamma_age_v2/dmfi_plchlishk_i.nss | 117 + gamma_age_v2/dmfi_plychat_exe.ncs | Bin 0 -> 117846 bytes gamma_age_v2/dmfi_plychat_exe.nss | 3910 +++++++++++++++++++ gamma_age_v2/dmfi_plychat_inc.ncs | Bin 0 -> 191 bytes gamma_age_v2/dmfi_plychat_inc.nss | 144 + gamma_age_v2/dmfi_remove.uti | Bin 0 -> 1369 bytes gamma_age_v2/dmfi_rest.utp | Bin 0 -> 1963 bytes gamma_age_v2/dmfi_rest001.utp | Bin 0 -> 1953 bytes gamma_age_v2/dmfi_rest002.utp | Bin 0 -> 1953 bytes gamma_age_v2/dmfi_rest003.utp | Bin 0 -> 1949 bytes gamma_age_v2/dmfi_restvfxobje.utp | Bin 0 -> 1880 bytes gamma_age_v2/dmfi_server.uti | Bin 0 -> 1341 bytes gamma_age_v2/dmfi_setting.utc | Bin 0 -> 4778 bytes gamma_age_v2/dmfi_sound.uti | Bin 0 -> 1170 bytes gamma_age_v2/dmfi_string_inc.nss | 71 + gamma_age_v2/dmfi_target.uti | Bin 0 -> 5784 bytes gamma_age_v2/dmfi_unact_nam02.ncs | Bin 0 -> 3440 bytes gamma_age_v2/dmfi_unact_nam02.nss | 12 + gamma_age_v2/dmfi_unact_nam03.ncs | Bin 0 -> 84 bytes gamma_age_v2/dmfi_unact_nam03.nss | 6 + gamma_age_v2/dmfi_unact_nam04.ncs | Bin 0 -> 2828 bytes gamma_age_v2/dmfi_unact_nam04.nss | 8 + gamma_age_v2/dmfi_unact_nam06.ncs | Bin 0 -> 3440 bytes gamma_age_v2/dmfi_unact_nam06.nss | 12 + gamma_age_v2/dmfi_unact_nam07.ncs | Bin 0 -> 84 bytes gamma_age_v2/dmfi_unact_nam07.nss | 6 + gamma_age_v2/dmfi_unact_nam08.ncs | Bin 0 -> 2828 bytes gamma_age_v2/dmfi_unact_nam08.nss | 8 + gamma_age_v2/dmfi_uncnd_nam01.ncs | Bin 0 -> 171 bytes gamma_age_v2/dmfi_uncnd_nam01.nss | 13 + gamma_age_v2/dmfi_uncnd_nam05.ncs | Bin 0 -> 183 bytes gamma_age_v2/dmfi_uncnd_nam05.nss | 13 + gamma_age_v2/dmfi_univ_1.ncs | Bin 0 -> 545 bytes gamma_age_v2/dmfi_univ_1.nss | 26 + gamma_age_v2/dmfi_univ_10.ncs | Bin 0 -> 513 bytes gamma_age_v2/dmfi_univ_10.nss | 27 + gamma_age_v2/dmfi_univ_2.ncs | Bin 0 -> 545 bytes gamma_age_v2/dmfi_univ_2.nss | 26 + gamma_age_v2/dmfi_univ_3.ncs | Bin 0 -> 557 bytes gamma_age_v2/dmfi_univ_3.nss | 27 + gamma_age_v2/dmfi_univ_4.ncs | Bin 0 -> 557 bytes gamma_age_v2/dmfi_univ_4.nss | 27 + gamma_age_v2/dmfi_univ_5.ncs | Bin 0 -> 557 bytes gamma_age_v2/dmfi_univ_5.nss | 27 + gamma_age_v2/dmfi_univ_6.ncs | Bin 0 -> 557 bytes gamma_age_v2/dmfi_univ_6.nss | 28 + gamma_age_v2/dmfi_univ_7.ncs | Bin 0 -> 591 bytes gamma_age_v2/dmfi_univ_7.nss | 27 + gamma_age_v2/dmfi_univ_8.ncs | Bin 0 -> 585 bytes gamma_age_v2/dmfi_univ_8.nss | 28 + gamma_age_v2/dmfi_univ_9.ncs | Bin 0 -> 553 bytes gamma_age_v2/dmfi_univ_9.nss | 27 + gamma_age_v2/dmfi_univ_cond.ncs | Bin 0 -> 11602 bytes gamma_age_v2/dmfi_univ_cond.nss | 363 ++ gamma_age_v2/dmfi_univ_dmw.ncs | Bin 0 -> 4275 bytes gamma_age_v2/dmfi_univ_dmw.nss | 334 ++ gamma_age_v2/dmfi_univ_listen.ncs | Bin 0 -> 1979 bytes gamma_age_v2/dmfi_univ_listen.nss | 115 + gamma_age_v2/dmfi_universal.dlg | Bin 0 -> 540062 bytes gamma_age_v2/dmfi_voice.utc | Bin 0 -> 4539 bytes gamma_age_v2/dmfi_voice.uti | Bin 0 -> 1657 bytes gamma_age_v2/dmfi_voice1.ncs | Bin 0 -> 924 bytes gamma_age_v2/dmfi_voice1.nss | 65 + gamma_age_v2/dmfi_voice_exe.ncs | Bin 0 -> 835 bytes gamma_age_v2/dmfi_voice_exe.nss | 53 + gamma_age_v2/dmfi_voicewidget.uti | Bin 0 -> 1633 bytes gamma_age_v2/dmfi_x_afflict.ncs | Bin 0 -> 12720 bytes gamma_age_v2/dmfi_x_afflict.nss | 377 ++ gamma_age_v2/dmfi_x_emote.ncs | Bin 0 -> 7667 bytes gamma_age_v2/dmfi_x_emote.nss | 218 ++ gamma_age_v2/dmfi_x_fx.ncs | Bin 0 -> 13501 bytes gamma_age_v2/dmfi_x_fx.nss | 288 ++ gamma_age_v2/dmfi_xp.uti | Bin 0 -> 1183 bytes gamma_age_v2/doorpalcus.itp | Bin 0 -> 732 bytes gamma_age_v2/encounterpalcus.itp | Bin 0 -> 680 bytes gamma_age_v2/encroach.utc | Bin 0 -> 4794 bytes gamma_age_v2/erdgon.utc | Bin 0 -> 5373 bytes gamma_age_v2/erdgonpropertie.uti | Bin 0 -> 1245 bytes gamma_age_v2/exterminategarb.uti | Bin 0 -> 1521 bytes gamma_age_v2/exterminator.utc | Bin 0 -> 5779 bytes gamma_age_v2/exterminator2.utc | Bin 0 -> 5016 bytes gamma_age_v2/ey_dpcon_erewood.are | Bin 0 -> 6054 bytes gamma_age_v2/ey_dpcon_erewood.gic | Bin 0 -> 2847 bytes gamma_age_v2/ey_dpcon_erewood.git | Bin 0 -> 37519 bytes gamma_age_v2/fdwarf.utc | Bin 0 -> 5430 bytes gamma_age_v2/felf.utc | Bin 0 -> 5512 bytes gamma_age_v2/felgon.utc | Bin 0 -> 6076 bytes gamma_age_v2/felgonproperti.uti | Bin 0 -> 1373 bytes gamma_age_v2/fen.utc | Bin 0 -> 5189 bytes gamma_age_v2/fengreatsword.uti | Bin 0 -> 806 bytes gamma_age_v2/fgnome.utc | Bin 0 -> 5522 bytes gamma_age_v2/fhalfelf.utc | Bin 0 -> 5468 bytes gamma_age_v2/fhalfling.utc | Bin 0 -> 5413 bytes gamma_age_v2/fhalforc.utc | Bin 0 -> 5328 bytes gamma_age_v2/fhuman.utc | Bin 0 -> 5354 bytes gamma_age_v2/fhuman_1.utc | Bin 0 -> 5363 bytes gamma_age_v2/fhuman_10.utc | Bin 0 -> 5364 bytes gamma_age_v2/fhuman_2.utc | Bin 0 -> 5363 bytes gamma_age_v2/fhuman_3.utc | Bin 0 -> 5363 bytes gamma_age_v2/fhuman_4.utc | Bin 0 -> 5363 bytes gamma_age_v2/fhuman_5.utc | Bin 0 -> 5363 bytes gamma_age_v2/fhuman_6.utc | Bin 0 -> 5363 bytes gamma_age_v2/fhuman_7.utc | Bin 0 -> 5363 bytes gamma_age_v2/fhuman_8.utc | Bin 0 -> 5363 bytes gamma_age_v2/fhuman_9.utc | Bin 0 -> 5363 bytes gamma_age_v2/firebug.utc | Bin 0 -> 5223 bytes gamma_age_v2/firefloatytexton.utt | Bin 0 -> 1410 bytes gamma_age_v2/flynn.utc | Bin 0 -> 5861 bytes gamma_age_v2/flynnfemale.utc | Bin 0 -> 5867 bytes gamma_age_v2/form_queen001.utc | Bin 0 -> 9997 bytes gamma_age_v2/form_taskmast001.utc | Bin 0 -> 5299 bytes gamma_age_v2/form_warrior001.utc | Bin 0 -> 5012 bytes gamma_age_v2/form_worker001.utc | Bin 0 -> 4868 bytes gamma_age_v2/frostedpits.are | Bin 0 -> 12913 bytes gamma_age_v2/frostedpits.gic | Bin 0 -> 3775 bytes gamma_age_v2/frostedpits.git | Bin 0 -> 93238 bytes gamma_age_v2/frozentimes.are | Bin 0 -> 12913 bytes gamma_age_v2/frozentimes.gic | Bin 0 -> 2757 bytes gamma_age_v2/frozentimes.git | Bin 0 -> 89025 bytes gamma_age_v2/gallusgallus.utc | Bin 0 -> 4658 bytes gamma_age_v2/gallusgallus001.utc | Bin 0 -> 5283 bytes gamma_age_v2/gator.utc | Bin 0 -> 4824 bytes gamma_age_v2/gatorbite.uti | Bin 0 -> 1097 bytes gamma_age_v2/gelgon.utc | Bin 0 -> 5692 bytes gamma_age_v2/gelgon001.utc | Bin 0 -> 5569 bytes gamma_age_v2/gelgon002.utc | Bin 0 -> 5691 bytes gamma_age_v2/gelgon003.utc | Bin 0 -> 6209 bytes gamma_age_v2/gelgonpropert001.uti | Bin 0 -> 1247 bytes gamma_age_v2/gelgonproperti.uti | Bin 0 -> 1373 bytes gamma_age_v2/generalstore.utm | Bin 0 -> 1475 bytes gamma_age_v2/glider.utc | Bin 0 -> 5229 bytes gamma_age_v2/glower.utc | Bin 0 -> 4946 bytes gamma_age_v2/glowring.uti | Bin 0 -> 973 bytes gamma_age_v2/goth.utc | Bin 0 -> 5674 bytes gamma_age_v2/gren.utc | Bin 0 -> 6253 bytes gamma_age_v2/gren001.utc | Bin 0 -> 6258 bytes gamma_age_v2/grenspear.uti | Bin 0 -> 794 bytes gamma_age_v2/gretvarl.utc | Bin 0 -> 5419 bytes gamma_age_v2/grey.utc | Bin 0 -> 4633 bytes gamma_age_v2/groak.utc | Bin 0 -> 4781 bytes gamma_age_v2/gz_chair_use.ncs | Bin 0 -> 224 bytes gamma_age_v2/gz_chair_use.nss | 31 + gamma_age_v2/habd_bandages.uti | Bin 0 -> 1546 bytes gamma_age_v2/habd_deathbag.utp | Bin 0 -> 2233 bytes gamma_age_v2/habd_deathtoken.uti | Bin 0 -> 1316 bytes gamma_age_v2/habd_dmdeath.uti | Bin 0 -> 1335 bytes gamma_age_v2/habd_dmtoken.uti | Bin 0 -> 1421 bytes gamma_age_v2/habd_include.ncs | Bin 0 -> 121 bytes gamma_age_v2/habd_include.nss | 1709 +++++++++ gamma_age_v2/habd_onpcdeath.ncs | Bin 0 -> 10562 bytes gamma_age_v2/habd_onpcdeath.nss | 732 ++++ gamma_age_v2/habd_onpcdying.ncs | Bin 0 -> 9212 bytes gamma_age_v2/habd_onpcdying.nss | 361 ++ gamma_age_v2/habd_onpcrespawn.ncs | Bin 0 -> 2105 bytes gamma_age_v2/habd_onpcrespawn.nss | 165 + gamma_age_v2/habd_rules.uti | Bin 0 -> 1325 bytes gamma_age_v2/halfplate_med.uti | Bin 0 -> 2018 bytes gamma_age_v2/hawkoid.utc | Bin 0 -> 5386 bytes gamma_age_v2/herlproperties.uti | Bin 0 -> 1369 bytes gamma_age_v2/herp.utc | Bin 0 -> 5380 bytes gamma_age_v2/hide_lg.uti | Bin 0 -> 1741 bytes gamma_age_v2/hide_med.uti | Bin 0 -> 2000 bytes gamma_age_v2/hide_sm.uti | Bin 0 -> 1741 bytes gamma_age_v2/hide_st.uti | Bin 0 -> 1869 bytes gamma_age_v2/hif_onacquireite.ncs | Bin 0 -> 79 bytes gamma_age_v2/hif_onacquireite.nss | 13 + gamma_age_v2/hif_onactivateit.ncs | Bin 0 -> 76 bytes gamma_age_v2/hif_onactivateit.nss | 13 + gamma_age_v2/hif_onclientente.ncs | Bin 0 -> 80 bytes gamma_age_v2/hif_onclientente.nss | 13 + gamma_age_v2/hif_onclientleav.ncs | Bin 0 -> 79 bytes gamma_age_v2/hif_onclientleav.nss | 13 + gamma_age_v2/hif_onheartbeat.ncs | Bin 0 -> 81 bytes gamma_age_v2/hif_onheartbeat.nss | 13 + gamma_age_v2/hif_onmoduleload.ncs | Bin 0 -> 78 bytes gamma_age_v2/hif_onmoduleload.nss | 13 + gamma_age_v2/hif_onplayerchat.ncs | Bin 0 -> 83 bytes gamma_age_v2/hif_onplayerchat.nss | 13 + gamma_age_v2/hif_onplayerdeat.ncs | Bin 0 -> 75 bytes gamma_age_v2/hif_onplayerdeat.nss | 13 + gamma_age_v2/hif_onplayerdyin.ncs | Bin 0 -> 75 bytes gamma_age_v2/hif_onplayerdyin.nss | 13 + gamma_age_v2/hif_onplayerequi.ncs | Bin 0 -> 76 bytes gamma_age_v2/hif_onplayerequi.nss | 13 + gamma_age_v2/hif_onplayerresp.ncs | Bin 0 -> 79 bytes gamma_age_v2/hif_onplayerresp.nss | 13 + gamma_age_v2/hif_onplayerrest.ncs | Bin 0 -> 71 bytes gamma_age_v2/hif_onplayerrest.nss | 13 + gamma_age_v2/hif_onplayeruneq.ncs | Bin 0 -> 80 bytes gamma_age_v2/hif_onplayeruneq.nss | 13 + gamma_age_v2/hif_onunaquireit.ncs | Bin 0 -> 82 bytes gamma_age_v2/hif_onunaquireit.nss | 13 + gamma_age_v2/hisser.utc | Bin 0 -> 6215 bytes gamma_age_v2/hisser001.utc | Bin 0 -> 6414 bytes gamma_age_v2/hisserhide.uti | Bin 0 -> 1100 bytes gamma_age_v2/hlslang_014.uti | Bin 0 -> 1021 bytes gamma_age_v2/hlslang_015.uti | Bin 0 -> 1029 bytes gamma_age_v2/hlslang_016.uti | Bin 0 -> 1032 bytes gamma_age_v2/hlslang_1.uti | Bin 0 -> 1007 bytes gamma_age_v2/hlslang_10.uti | Bin 0 -> 1021 bytes gamma_age_v2/hlslang_101.uti | Bin 0 -> 1031 bytes gamma_age_v2/hlslang_102.uti | Bin 0 -> 1031 bytes gamma_age_v2/hlslang_103.uti | Bin 0 -> 1031 bytes gamma_age_v2/hlslang_104.uti | Bin 0 -> 1031 bytes gamma_age_v2/hlslang_105.uti | Bin 0 -> 1031 bytes gamma_age_v2/hlslang_106.uti | Bin 0 -> 1031 bytes gamma_age_v2/hlslang_107.uti | Bin 0 -> 1031 bytes gamma_age_v2/hlslang_108.uti | Bin 0 -> 1031 bytes gamma_age_v2/hlslang_109.uti | Bin 0 -> 1031 bytes gamma_age_v2/hlslang_11.uti | Bin 0 -> 1019 bytes gamma_age_v2/hlslang_12.uti | Bin 0 -> 1020 bytes gamma_age_v2/hlslang_13.uti | Bin 0 -> 1009 bytes gamma_age_v2/hlslang_2.uti | Bin 0 -> 1007 bytes gamma_age_v2/hlslang_3.uti | Bin 0 -> 1010 bytes gamma_age_v2/hlslang_4.uti | Bin 0 -> 1009 bytes gamma_age_v2/hlslang_5.uti | Bin 0 -> 1005 bytes gamma_age_v2/hlslang_6.uti | Bin 0 -> 1016 bytes gamma_age_v2/hlslang_7.uti | Bin 0 -> 1018 bytes gamma_age_v2/hlslang_8.uti | Bin 0 -> 1016 bytes gamma_age_v2/hlslang_9.uti | Bin 0 -> 1023 bytes gamma_age_v2/holcut.utc | Bin 0 -> 4743 bytes gamma_age_v2/howler.utc | Bin 0 -> 5246 bytes gamma_age_v2/inc_array.nss | 504 +++ gamma_age_v2/indie.utc | Bin 0 -> 6217 bytes gamma_age_v2/indietouch.uti | Bin 0 -> 1228 bytes gamma_age_v2/innkeeper.utc | Bin 0 -> 4840 bytes gamma_age_v2/invisobj001.utp | Bin 0 -> 2039 bytes gamma_age_v2/it_arhelm004.uti | Bin 0 -> 919 bytes gamma_age_v2/it_creitemdrs001.uti | Bin 0 -> 1093 bytes gamma_age_v2/it_creitemunh001.uti | Bin 0 -> 1477 bytes gamma_age_v2/it_crewps003.uti | Bin 0 -> 1109 bytes gamma_age_v2/it_crewps016.uti | Bin 0 -> 981 bytes gamma_age_v2/itempalcus.itp | Bin 0 -> 182376 bytes gamma_age_v2/j_inc_walk.nss | 333 ++ gamma_age_v2/jaget.utc | Bin 0 -> 5236 bytes gamma_age_v2/jagethide.uti | Bin 0 -> 1097 bytes gamma_age_v2/jemagonproperti.uti | Bin 0 -> 1503 bytes gamma_age_v2/joardanz.utc | Bin 0 -> 5146 bytes gamma_age_v2/joardanzcow.utc | Bin 0 -> 5148 bytes gamma_age_v2/juog.utc | Bin 0 -> 5257 bytes gamma_age_v2/kailin.utc | Bin 0 -> 5877 bytes gamma_age_v2/kailin.uti | Bin 0 -> 1221 bytes gamma_age_v2/kailinbite.uti | Bin 0 -> 1101 bytes gamma_age_v2/kailinclaw.uti | Bin 0 -> 1101 bytes gamma_age_v2/kamodo.utc | Bin 0 -> 5342 bytes gamma_age_v2/kamodohide.uti | Bin 0 -> 1100 bytes gamma_age_v2/katkin.utc | Bin 0 -> 4957 bytes gamma_age_v2/katkin001.utc | Bin 0 -> 4960 bytes gamma_age_v2/keeshin.utc | Bin 0 -> 6542 bytes gamma_age_v2/kiikcee.utc | Bin 0 -> 5646 bytes gamma_age_v2/kiikceeproperti.uti | Bin 0 -> 1119 bytes gamma_age_v2/knighthelmet.uti | Bin 0 -> 1170 bytes gamma_age_v2/knightofgeneticp.utc | Bin 0 -> 6060 bytes gamma_age_v2/knightsplate.uti | Bin 0 -> 1875 bytes gamma_age_v2/latterbug.utc | Bin 0 -> 4992 bytes gamma_age_v2/leath_arm_lg.uti | Bin 0 -> 1753 bytes gamma_age_v2/leath_arm_med.uti | Bin 0 -> 2012 bytes gamma_age_v2/leath_arm_sm.uti | Bin 0 -> 1753 bytes gamma_age_v2/leath_arm_st.uti | Bin 0 -> 1881 bytes gamma_age_v2/lil.utc | Bin 0 -> 5940 bytes gamma_age_v2/lil001.utc | Bin 0 -> 5943 bytes gamma_age_v2/lilarrow.uti | Bin 0 -> 1030 bytes gamma_age_v2/limbo001.are | Bin 0 -> 13090 bytes gamma_age_v2/limbo001.gic | Bin 0 -> 1594 bytes gamma_age_v2/limbo001.git | Bin 0 -> 7684 bytes gamma_age_v2/loopur.utc | Bin 0 -> 5486 bytes gamma_age_v2/maarcl108.uti | Bin 0 -> 1754 bytes gamma_age_v2/mantabite.uti | Bin 0 -> 1097 bytes gamma_age_v2/mantahide.uti | Bin 0 -> 969 bytes gamma_age_v2/mantas.utc | Bin 0 -> 4863 bytes gamma_age_v2/marlock.utc | Bin 0 -> 5652 bytes gamma_age_v2/marlockfemale.utc | Bin 0 -> 5652 bytes gamma_age_v2/marlockproperti.uti | Bin 0 -> 1503 bytes gamma_age_v2/mdwarf.utc | Bin 0 -> 5522 bytes gamma_age_v2/medicalrobot.utc | Bin 0 -> 4719 bytes gamma_age_v2/melf.utc | Bin 0 -> 5520 bytes gamma_age_v2/menarl.utc | Bin 0 -> 5504 bytes gamma_age_v2/menarlhide.uti | Bin 0 -> 972 bytes gamma_age_v2/mgnome.utc | Bin 0 -> 5522 bytes gamma_age_v2/mhalfelf.utc | Bin 0 -> 5468 bytes gamma_age_v2/mhalfling.utc | Bin 0 -> 5413 bytes gamma_age_v2/mhalforc.utc | Bin 0 -> 5328 bytes gamma_age_v2/mhuman.utc | Bin 0 -> 5354 bytes gamma_age_v2/mhuman_1.utc | Bin 0 -> 5361 bytes gamma_age_v2/mhuman_10.utc | Bin 0 -> 5362 bytes gamma_age_v2/mhuman_2.utc | Bin 0 -> 5361 bytes gamma_age_v2/mhuman_3.utc | Bin 0 -> 5361 bytes gamma_age_v2/mhuman_4.utc | Bin 0 -> 5361 bytes gamma_age_v2/mhuman_5.utc | Bin 0 -> 5361 bytes gamma_age_v2/mhuman_6.utc | Bin 0 -> 5361 bytes gamma_age_v2/mhuman_7.utc | Bin 0 -> 5361 bytes gamma_age_v2/mhuman_8.utc | Bin 0 -> 5361 bytes gamma_age_v2/mhuman_9.utc | Bin 0 -> 5361 bytes gamma_age_v2/mmorpgspawner.utp | Bin 0 -> 2470 bytes gamma_age_v2/mod_ctrl_bk_set.ncs | Bin 0 -> 1118 bytes gamma_age_v2/mod_ctrl_bk_set.nss | 61 + gamma_age_v2/mod_ruleset.dlg | Bin 0 -> 8549 bytes gamma_age_v2/module.ifo | Bin 0 -> 3559 bytes gamma_age_v2/module.jrl | Bin 0 -> 100 bytes gamma_age_v2/mordmagman01.are | Bin 0 -> 4688 bytes gamma_age_v2/mordmagman01.gic | Bin 0 -> 440 bytes gamma_age_v2/mordmagman01.git | Bin 0 -> 2862 bytes gamma_age_v2/mordmagman02.are | Bin 0 -> 4688 bytes gamma_age_v2/mordmagman02.gic | Bin 0 -> 440 bytes gamma_age_v2/mordmagman02.git | Bin 0 -> 2862 bytes gamma_age_v2/mordmagman03.are | Bin 0 -> 4688 bytes gamma_age_v2/mordmagman03.gic | Bin 0 -> 440 bytes gamma_age_v2/mordmagman03.git | Bin 0 -> 2862 bytes gamma_age_v2/mordmagman04.are | Bin 0 -> 4688 bytes gamma_age_v2/mordmagman04.gic | Bin 0 -> 440 bytes gamma_age_v2/mordmagman04.git | Bin 0 -> 2862 bytes gamma_age_v2/mordmagman05.are | Bin 0 -> 4688 bytes gamma_age_v2/mordmagman05.gic | Bin 0 -> 440 bytes gamma_age_v2/mordmagman05.git | Bin 0 -> 2862 bytes gamma_age_v2/mordmagman06.are | Bin 0 -> 4688 bytes gamma_age_v2/mordmagman06.gic | Bin 0 -> 440 bytes gamma_age_v2/mordmagman06.git | Bin 0 -> 2862 bytes gamma_age_v2/movechair.utp | Bin 0 -> 2227 bytes gamma_age_v2/movestool.utp | Bin 0 -> 2229 bytes gamma_age_v2/narleps.utc | Bin 0 -> 17841 bytes gamma_age_v2/nbde_inc.nss | 747 ++++ gamma_age_v2/nthlai.utc | Bin 0 -> 11264 bytes gamma_age_v2/nw_c2_default4.ncs | Bin 0 -> 60637 bytes gamma_age_v2/nw_c2_default4.nss | 109 + gamma_age_v2/nw_c2_default5.ncs | Bin 0 -> 60818 bytes gamma_age_v2/nw_c2_default5.nss | 104 + gamma_age_v2/nw_s0_raisdead.ncs | Bin 0 -> 2581 bytes gamma_age_v2/nw_s0_raisdead.nss | 41 + gamma_age_v2/nw_s0_resserec.ncs | Bin 0 -> 2654 bytes gamma_age_v2/nw_s0_resserec.nss | 44 + gamma_age_v2/nw_s3_actitem01.ncs | Bin 0 -> 320 bytes gamma_age_v2/nw_s3_actitem01.nss | 32 + gamma_age_v2/nwnx.nss | 113 + gamma_age_v2/nwnx_admin.nss | 344 ++ gamma_age_v2/nwnx_appearance.nss | 73 + gamma_age_v2/nwnx_area.nss | 660 ++++ gamma_age_v2/nwnx_chat.nss | 158 + gamma_age_v2/nwnx_consts.nss | 182 + gamma_age_v2/nwnx_creature.nss | 2150 +++++++++++ gamma_age_v2/nwnx_damage.nss | 253 ++ gamma_age_v2/nwnx_data.nss | 351 ++ gamma_age_v2/nwnx_dialog.nss | 139 + gamma_age_v2/nwnx_effect.nss | 259 ++ gamma_age_v2/nwnx_elc.nss | 244 ++ gamma_age_v2/nwnx_encounter.nss | 285 ++ gamma_age_v2/nwnx_events.nss | 1590 ++++++++ gamma_age_v2/nwnx_feat.nss | 63 + gamma_age_v2/nwnx_feedback.nss | 519 +++ gamma_age_v2/nwnx_item.nss | 207 + gamma_age_v2/nwnx_itemprop.nss | 110 + gamma_age_v2/nwnx_lua.nss | 51 + gamma_age_v2/nwnx_object.nss | 834 ++++ gamma_age_v2/nwnx_player.nss | 963 +++++ gamma_age_v2/nwnx_player_qbs.nss | 207 + gamma_age_v2/nwnx_profiler.nss | 60 + gamma_age_v2/nwnx_race.nss | 90 + gamma_age_v2/nwnx_race_2da.nss | 70 + gamma_age_v2/nwnx_redis.nss | 5906 +++++++++++++++++++++++++++++ gamma_age_v2/nwnx_redis_lib.nss | 108 + gamma_age_v2/nwnx_redis_ps.nss | 23 + gamma_age_v2/nwnx_redis_short.nss | 5900 ++++++++++++++++++++++++++++ gamma_age_v2/nwnx_regex.nss | 42 + gamma_age_v2/nwnx_rename.nss | 80 + gamma_age_v2/nwnx_reveal.nss | 49 + gamma_age_v2/nwnx_ruby.nss | 23 + gamma_age_v2/nwnx_skillranks.nss | 283 ++ gamma_age_v2/nwnx_spellcheck.nss | 43 + gamma_age_v2/nwnx_sql.nss | 254 ++ gamma_age_v2/nwnx_tests.nss | 21 + gamma_age_v2/nwnx_tileset.nss | 371 ++ gamma_age_v2/nwnx_time.nss | 63 + gamma_age_v2/nwnx_util.nss | 602 +++ gamma_age_v2/nwnx_visibility.nss | 77 + gamma_age_v2/nwnx_weapon.nss | 330 ++ gamma_age_v2/nwnx_webhook.nss | 43 + gamma_age_v2/nwnx_webhook_rch.nss | 159 + gamma_age_v2/nyan.utc | Bin 0 -> 4787 bytes gamma_age_v2/obb.utc | Bin 0 -> 6881 bytes gamma_age_v2/obbhide.uti | Bin 0 -> 1091 bytes gamma_age_v2/on_pubsub.ncs | Bin 0 -> 504 bytes gamma_age_v2/on_pubsub.nss | 14 + gamma_age_v2/orlen.utc | Bin 0 -> 5218 bytes gamma_age_v2/parn.utc | Bin 0 -> 11698 bytes gamma_age_v2/parnclaw.uti | Bin 0 -> 1094 bytes gamma_age_v2/pierinhorl.utc | Bin 0 -> 7818 bytes gamma_age_v2/pitchfork.uti | Bin 0 -> 792 bytes gamma_age_v2/placeablepalcus.itp | Bin 0 -> 4943 bytes gamma_age_v2/placeablerespawn.utp | Bin 0 -> 2427 bytes gamma_age_v2/plate_med.uti | Bin 0 -> 2010 bytes gamma_age_v2/podog.utc | Bin 0 -> 6074 bytes gamma_age_v2/podog001.utc | Bin 0 -> 6077 bytes gamma_age_v2/podoghide.uti | Bin 0 -> 969 bytes gamma_age_v2/policearmor.uti | Bin 0 -> 1504 bytes gamma_age_v2/policehelmet.uti | Bin 0 -> 1170 bytes gamma_age_v2/policerobot.utc | Bin 0 -> 18363 bytes gamma_age_v2/portal_conv.dlg | Bin 0 -> 1517 bytes gamma_age_v2/portal_start.ncs | Bin 0 -> 1293 bytes gamma_age_v2/portal_start.nss | 89 + gamma_age_v2/prc_maze_01.are | Bin 0 -> 47034 bytes gamma_age_v2/prc_maze_01.gic | Bin 0 -> 14099 bytes gamma_age_v2/prc_maze_01.git | Bin 0 -> 328939 bytes gamma_age_v2/pwrespawner.utp | Bin 0 -> 2432 bytes gamma_age_v2/rakoxen.utc | Bin 0 -> 5178 bytes gamma_age_v2/rakrods.utc | Bin 0 -> 4791 bytes gamma_age_v2/randomencounters.utp | Bin 0 -> 2411 bytes gamma_age_v2/re_common_blkd.ncs | Bin 0 -> 337 bytes gamma_age_v2/re_common_blkd.nss | 33 + gamma_age_v2/re_common_spawn.ncs | Bin 0 -> 142786 bytes gamma_age_v2/re_common_spawn.nss | 81 + gamma_age_v2/re_commoner0.ncs | Bin 0 -> 1325 bytes gamma_age_v2/re_commoner0.nss | 96 + gamma_age_v2/re_commoner1.ncs | Bin 0 -> 2663 bytes gamma_age_v2/re_commoner1.nss | 169 + gamma_age_v2/re_commonspwnrhb.ncs | Bin 0 -> 52414 bytes gamma_age_v2/re_commonspwnrhb.nss | 139 + gamma_age_v2/re_custom.ncs | Bin 0 -> 1975 bytes gamma_age_v2/re_custom.nss | 125 + gamma_age_v2/re_custom1.ncs | Bin 0 -> 1988 bytes gamma_age_v2/re_custom1.nss | 125 + gamma_age_v2/re_cv_commoner.dlg | Bin 0 -> 3624 bytes gamma_age_v2/re_levspawnerhb.ncs | Bin 0 -> 50195 bytes gamma_age_v2/re_levspawnerhb.nss | 109 + gamma_age_v2/re_mmorpghb.ncs | Bin 0 -> 51568 bytes gamma_age_v2/re_mmorpghb.nss | 153 + gamma_age_v2/re_moditemdrop.ncs | Bin 0 -> 364 bytes gamma_age_v2/re_moditemdrop.nss | 38 + gamma_age_v2/re_modulehb.ncs | Bin 0 -> 1846 bytes gamma_age_v2/re_modulehb.nss | 30 + gamma_age_v2/re_onactivate.ncs | Bin 0 -> 119 bytes gamma_age_v2/re_onactivate.nss | 8 + gamma_age_v2/re_oncliententer.ncs | Bin 0 -> 326 bytes gamma_age_v2/re_oncliententer.nss | 31 + gamma_age_v2/re_onload.ncs | Bin 0 -> 504 bytes gamma_age_v2/re_onload.nss | 30 + gamma_age_v2/re_onrest.ncs | Bin 0 -> 2774 bytes gamma_age_v2/re_onrest.nss | 92 + gamma_age_v2/re_onunacquire.ncs | Bin 0 -> 376 bytes gamma_age_v2/re_onunacquire.nss | 38 + gamma_age_v2/re_or.ncs | Bin 0 -> 47746 bytes gamma_age_v2/re_or.nss | 59 + gamma_age_v2/re_placespawnhb.ncs | Bin 0 -> 1006 bytes gamma_age_v2/re_placespawnhb.nss | 44 + gamma_age_v2/re_pwrespawnerhb.ncs | Bin 0 -> 55361 bytes gamma_age_v2/re_pwrespawnerhb.nss | 235 ++ gamma_age_v2/re_rndenc.nss | 896 +++++ gamma_age_v2/re_sc_dialogue1.ncs | Bin 0 -> 117 bytes gamma_age_v2/re_sc_dialogue1.nss | 16 + gamma_age_v2/re_sc_dialogue10.ncs | Bin 0 -> 117 bytes gamma_age_v2/re_sc_dialogue10.nss | 16 + gamma_age_v2/re_sc_dialogue2.ncs | Bin 0 -> 117 bytes gamma_age_v2/re_sc_dialogue2.nss | 16 + gamma_age_v2/re_sc_dialogue3.ncs | Bin 0 -> 117 bytes gamma_age_v2/re_sc_dialogue3.nss | 16 + gamma_age_v2/re_sc_dialogue4.ncs | Bin 0 -> 117 bytes gamma_age_v2/re_sc_dialogue4.nss | 16 + gamma_age_v2/re_sc_dialogue5.ncs | Bin 0 -> 117 bytes gamma_age_v2/re_sc_dialogue5.nss | 16 + gamma_age_v2/re_sc_dialogue6.ncs | Bin 0 -> 117 bytes gamma_age_v2/re_sc_dialogue6.nss | 16 + gamma_age_v2/re_sc_dialogue7.ncs | Bin 0 -> 117 bytes gamma_age_v2/re_sc_dialogue7.nss | 16 + gamma_age_v2/re_sc_dialogue8.ncs | Bin 0 -> 148 bytes gamma_age_v2/re_sc_dialogue8.nss | 17 + gamma_age_v2/re_sc_dialogue9.ncs | Bin 0 -> 117 bytes gamma_age_v2/re_sc_dialogue9.nss | 16 + gamma_age_v2/re_spawnerhb.ncs | Bin 0 -> 50204 bytes gamma_age_v2/re_spawnerhb.nss | 108 + gamma_age_v2/re_spawnerhb_v2.ncs | Bin 0 -> 49269 bytes gamma_age_v2/re_spawnerhb_v2.nss | 93 + gamma_age_v2/re_table.nss | 1923 ++++++++++ gamma_age_v2/re_treasure.ncs | Bin 0 -> 2341 bytes gamma_age_v2/re_treasure.nss | 141 + gamma_age_v2/re_treasure0.ncs | Bin 0 -> 635 bytes gamma_age_v2/re_treasure0.nss | 52 + gamma_age_v2/re_treasure1.ncs | Bin 0 -> 2436 bytes gamma_age_v2/re_treasure1.nss | 145 + gamma_age_v2/re_trsr_table.nss | 2351 ++++++++++++ gamma_age_v2/re_widget.dlg | Bin 0 -> 7604 bytes gamma_age_v2/re_widget1.ncs | Bin 0 -> 2480 bytes gamma_age_v2/re_widget1.nss | 44 + gamma_age_v2/re_widget10.ncs | Bin 0 -> 127 bytes gamma_age_v2/re_widget10.nss | 6 + gamma_age_v2/re_widget11.ncs | Bin 0 -> 133 bytes gamma_age_v2/re_widget11.nss | 6 + gamma_age_v2/re_widget12.ncs | Bin 0 -> 206 bytes gamma_age_v2/re_widget12.nss | 13 + gamma_age_v2/re_widget13.ncs | Bin 0 -> 235 bytes gamma_age_v2/re_widget13.nss | 11 + gamma_age_v2/re_widget14.ncs | Bin 0 -> 141 bytes gamma_age_v2/re_widget14.nss | 7 + gamma_age_v2/re_widget15.ncs | Bin 0 -> 143 bytes gamma_age_v2/re_widget15.nss | 7 + gamma_age_v2/re_widget16.ncs | Bin 0 -> 52 bytes gamma_age_v2/re_widget16.nss | 4 + gamma_age_v2/re_widget17.ncs | Bin 0 -> 58 bytes gamma_age_v2/re_widget17.nss | 4 + gamma_age_v2/re_widget18.ncs | Bin 0 -> 204 bytes gamma_age_v2/re_widget18.nss | 11 + gamma_age_v2/re_widget19.ncs | Bin 0 -> 124 bytes gamma_age_v2/re_widget19.nss | 7 + gamma_age_v2/re_widget2.ncs | Bin 0 -> 668 bytes gamma_age_v2/re_widget2.nss | 21 + gamma_age_v2/re_widget20.ncs | Bin 0 -> 46475 bytes gamma_age_v2/re_widget20.nss | 6 + gamma_age_v2/re_widget21.ncs | Bin 0 -> 99 bytes gamma_age_v2/re_widget21.nss | 6 + gamma_age_v2/re_widget22.ncs | Bin 0 -> 101 bytes gamma_age_v2/re_widget22.nss | 7 + gamma_age_v2/re_widget23.ncs | Bin 0 -> 47 bytes gamma_age_v2/re_widget23.nss | 4 + gamma_age_v2/re_widget24.ncs | Bin 0 -> 53 bytes gamma_age_v2/re_widget24.nss | 4 + gamma_age_v2/re_widget25.ncs | Bin 0 -> 225 bytes gamma_age_v2/re_widget25.nss | 9 + gamma_age_v2/re_widget3.ncs | Bin 0 -> 324 bytes gamma_age_v2/re_widget3.nss | 19 + gamma_age_v2/re_widget4.ncs | Bin 0 -> 149 bytes gamma_age_v2/re_widget4.nss | 7 + gamma_age_v2/re_widget5.ncs | Bin 0 -> 129 bytes gamma_age_v2/re_widget5.nss | 8 + gamma_age_v2/re_widget6.ncs | Bin 0 -> 105 bytes gamma_age_v2/re_widget6.nss | 5 + gamma_age_v2/re_widget7.ncs | Bin 0 -> 105 bytes gamma_age_v2/re_widget7.nss | 5 + gamma_age_v2/re_widget8.ncs | Bin 0 -> 173 bytes gamma_age_v2/re_widget8.nss | 8 + gamma_age_v2/re_widget9.ncs | Bin 0 -> 175 bytes gamma_age_v2/re_widget9.nss | 8 + gamma_age_v2/redcloak.uti | Bin 0 -> 934 bytes gamma_age_v2/relanops.utc | Bin 0 -> 5335 bytes gamma_age_v2/relanopspropert.uti | Bin 0 -> 1121 bytes gamma_age_v2/rest_item.uti | Bin 0 -> 1021 bytes gamma_age_v2/riotshield.uti | Bin 0 -> 733 bytes gamma_age_v2/robohunter.utc | Bin 0 -> 7654 bytes gamma_age_v2/robotproperties.uti | Bin 0 -> 1883 bytes gamma_age_v2/rodcut.utc | Bin 0 -> 5199 bytes gamma_age_v2/rodqas.utc | Bin 0 -> 11023 bytes gamma_age_v2/ruinedminds001.are | Bin 0 -> 12916 bytes gamma_age_v2/ruinedminds001.gic | Bin 0 -> 1403 bytes gamma_age_v2/ruinedminds001.git | Bin 0 -> 14102 bytes gamma_age_v2/sarbis.utc | Bin 0 -> 4789 bytes gamma_age_v2/sarbis001.utc | Bin 0 -> 4836 bytes gamma_age_v2/sasquatch.utc | Bin 0 -> 5144 bytes gamma_age_v2/scale_lg.uti | Bin 0 -> 1743 bytes gamma_age_v2/scale_med.uti | Bin 0 -> 2002 bytes gamma_age_v2/scale_med_1.uti | Bin 0 -> 2148 bytes gamma_age_v2/scale_sm.uti | Bin 0 -> 1743 bytes gamma_age_v2/scale_st.uti | Bin 0 -> 1871 bytes gamma_age_v2/screamer.utc | Bin 0 -> 5327 bytes gamma_age_v2/screamerclaw.uti | Bin 0 -> 1106 bytes gamma_age_v2/screamerpropert.uti | Bin 0 -> 1505 bytes gamma_age_v2/securitityrobot.utc | Bin 0 -> 18293 bytes gamma_age_v2/securityarmor.uti | Bin 0 -> 1510 bytes gamma_age_v2/seeker.utc | Bin 0 -> 4818 bytes gamma_age_v2/sei_drop.ncs | Bin 0 -> 407 bytes gamma_age_v2/sei_drop.nss | 75 + gamma_age_v2/sei_move.dlg | Bin 0 -> 2010 bytes gamma_age_v2/sei_pickup.ncs | Bin 0 -> 197 bytes gamma_age_v2/sei_pickup.nss | 43 + gamma_age_v2/sei_sit.ncs | Bin 0 -> 164 bytes gamma_age_v2/sei_sit.nss | 34 + gamma_age_v2/sei_ta_isoccu.ncs | Bin 0 -> 61 bytes gamma_age_v2/sei_ta_isoccu.nss | 14 + gamma_age_v2/sei_talk.ncs | Bin 0 -> 49 bytes gamma_age_v2/sei_talk.nss | 14 + gamma_age_v2/sentryrobot.utc | Bin 0 -> 4912 bytes gamma_age_v2/sep.utc | Bin 0 -> 5408 bytes gamma_age_v2/sepbite.uti | Bin 0 -> 963 bytes gamma_age_v2/serenlous.utc | Bin 0 -> 8224 bytes gamma_age_v2/serf.utc | Bin 0 -> 6792 bytes gamma_age_v2/sergonpropertie.uti | Bin 0 -> 1501 bytes gamma_age_v2/servficebot.uti | Bin 0 -> 1509 bytes gamma_age_v2/servicehead.uti | Bin 0 -> 1171 bytes gamma_age_v2/servicerobot.utc | Bin 0 -> 6997 bytes gamma_age_v2/set_death_def_nw.ncs | Bin 0 -> 61 bytes gamma_age_v2/set_death_def_nw.nss | 33 + gamma_age_v2/set_death_habd.ncs | Bin 0 -> 61 bytes gamma_age_v2/set_death_habd.nss | 33 + gamma_age_v2/set_death_parth.ncs | Bin 0 -> 61 bytes gamma_age_v2/set_death_parth.nss | 33 + gamma_age_v2/set_death_res_pn.ncs | Bin 0 -> 61 bytes gamma_age_v2/set_death_res_pn.nss | 33 + gamma_age_v2/set_resp_custom.ncs | Bin 0 -> 63 bytes gamma_age_v2/set_resp_custom.nss | 33 + gamma_age_v2/set_resp_default.ncs | Bin 0 -> 63 bytes gamma_age_v2/set_resp_default.nss | 33 + gamma_age_v2/set_resp_mod_st.ncs | Bin 0 -> 63 bytes gamma_age_v2/set_resp_mod_st.nss | 33 + gamma_age_v2/set_rest_def_nwn.ncs | Bin 0 -> 60 bytes gamma_age_v2/set_rest_def_nwn.nss | 33 + gamma_age_v2/set_rest_dmfi.ncs | Bin 0 -> 60 bytes gamma_age_v2/set_rest_dmfi.nss | 33 + gamma_age_v2/set_rest_none.ncs | Bin 0 -> 60 bytes gamma_age_v2/set_rest_none.nss | 33 + gamma_age_v2/set_rest_sbr.ncs | Bin 0 -> 60 bytes gamma_age_v2/set_rest_sbr.nss | 33 + gamma_age_v2/set_rest_time.ncs | Bin 0 -> 60 bytes gamma_age_v2/set_rest_time.nss | 33 + gamma_age_v2/sibraspropertie.uti | Bin 0 -> 1501 bytes gamma_age_v2/sleeth.utc | Bin 0 -> 6457 bytes gamma_age_v2/sm_on_act.ncs | Bin 0 -> 12015 bytes gamma_age_v2/sm_on_act.nss | 55 + gamma_age_v2/sm_on_client_ent.ncs | Bin 0 -> 39453 bytes gamma_age_v2/sm_on_client_ent.nss | 170 + gamma_age_v2/sm_on_client_lv.ncs | Bin 0 -> 1052 bytes gamma_age_v2/sm_on_client_lv.nss | 9 + gamma_age_v2/sm_on_death.ncs | Bin 0 -> 10843 bytes gamma_age_v2/sm_on_death.nss | 123 + gamma_age_v2/sm_on_dying.ncs | Bin 0 -> 329 bytes gamma_age_v2/sm_on_dying.nss | 27 + gamma_age_v2/sm_on_mod_ld.ncs | Bin 0 -> 2815 bytes gamma_age_v2/sm_on_mod_ld.nss | 177 + gamma_age_v2/sm_on_respawn.ncs | Bin 0 -> 1792 bytes gamma_age_v2/sm_on_respawn.nss | 83 + gamma_age_v2/sm_on_rest.ncs | Bin 0 -> 1841 bytes gamma_age_v2/sm_on_rest.nss | 130 + gamma_age_v2/sm_on_unacquire.ncs | Bin 0 -> 1315 bytes gamma_age_v2/sm_on_unacquire.nss | 107 + gamma_age_v2/smovbai.utc | Bin 0 -> 4828 bytes gamma_age_v2/solblue.utp | Bin 0 -> 2000 bytes gamma_age_v2/soulbesh.utc | Bin 0 -> 5222 bytes gamma_age_v2/soundpalcus.itp | Bin 0 -> 728 bytes gamma_age_v2/spawnpoint.utw | Bin 0 -> 2156 bytes gamma_age_v2/spiderbot.utc | Bin 0 -> 4716 bytes gamma_age_v2/spikedclub.uti | Bin 0 -> 1044 bytes gamma_age_v2/splint_lg.uti | Bin 0 -> 1746 bytes gamma_age_v2/splint_med.uti | Bin 0 -> 2005 bytes gamma_age_v2/splint_sm.uti | Bin 0 -> 1746 bytes gamma_age_v2/splint_st.uti | Bin 0 -> 1874 bytes gamma_age_v2/squeeker.utc | Bin 0 -> 4839 bytes gamma_age_v2/sreelon.utc | Bin 0 -> 5898 bytes gamma_age_v2/sreelonandroi001.utc | Bin 0 -> 5498 bytes gamma_age_v2/sreelonandroid.utc | Bin 0 -> 6875 bytes gamma_age_v2/sreeloncyborg.utc | Bin 0 -> 6375 bytes gamma_age_v2/sreeloncyborgh.uti | Bin 0 -> 1770 bytes gamma_age_v2/sreelondronehead.uti | Bin 0 -> 1183 bytes gamma_age_v2/sreelonnegaswor.uti | Bin 0 -> 1310 bytes gamma_age_v2/sreelonrobot.utc | Bin 0 -> 6510 bytes gamma_age_v2/start_merchant.dlg | Bin 0 -> 1462 bytes gamma_age_v2/start_merchant.ncs | Bin 0 -> 146 bytes gamma_age_v2/start_merchant.nss | 17 + gamma_age_v2/starting_area.are | Bin 0 -> 8130 bytes gamma_age_v2/starting_area.gic | Bin 0 -> 2509 bytes gamma_age_v2/starting_area.git | Bin 0 -> 106965 bytes gamma_age_v2/starting_clothes.uti | Bin 0 -> 1614 bytes gamma_age_v2/startingmerchant.utc | Bin 0 -> 4762 bytes gamma_age_v2/startingmerchant.utm | Bin 0 -> 9774 bytes gamma_age_v2/stool.uti | Bin 0 -> 1227 bytes gamma_age_v2/stool001.utp | Bin 0 -> 2045 bytes gamma_age_v2/store_gen_start.dlg | Bin 0 -> 1577 bytes gamma_age_v2/store_gen_start.ncs | Bin 0 -> 141 bytes gamma_age_v2/store_gen_start.nss | 17 + gamma_age_v2/storepalcus.itp | Bin 0 -> 961 bytes gamma_age_v2/stud_leath_lg.uti | Bin 0 -> 1764 bytes gamma_age_v2/stud_leath_med.uti | Bin 0 -> 2023 bytes gamma_age_v2/stud_leath_sm.uti | Bin 0 -> 1764 bytes gamma_age_v2/stud_leath_st.uti | Bin 0 -> 1892 bytes gamma_age_v2/tarnzeb.utc | Bin 0 -> 6245 bytes gamma_age_v2/tarnzeb001.utc | Bin 0 -> 7463 bytes gamma_age_v2/tarnzebbark.uti | Bin 0 -> 1744 bytes gamma_age_v2/tarnzebvine.uti | Bin 0 -> 1104 bytes gamma_age_v2/tbrath.utc | Bin 0 -> 5068 bytes gamma_age_v2/teleport_auto.ncs | Bin 0 -> 645 bytes gamma_age_v2/teleport_auto.nss | 76 + gamma_age_v2/teleport_party.ncs | Bin 0 -> 1293 bytes gamma_age_v2/teleport_party.nss | 94 + gamma_age_v2/teleport_start.ncs | Bin 0 -> 1293 bytes gamma_age_v2/teleport_start.nss | 89 + gamma_age_v2/thequietofthemin.are | Bin 0 -> 7999 bytes gamma_age_v2/thequietofthemin.gic | Bin 0 -> 1929 bytes gamma_age_v2/thequietofthemin.git | Bin 0 -> 35249 bytes gamma_age_v2/thisisthesmal001.utt | Bin 0 -> 1084 bytes gamma_age_v2/thisisthesmallte.utt | Bin 0 -> 1429 bytes gamma_age_v2/throneevil001.utp | Bin 0 -> 2130 bytes gamma_age_v2/thronegood001.utp | Bin 0 -> 2154 bytes gamma_age_v2/tridentsoldior.utc | Bin 0 -> 4926 bytes gamma_age_v2/trigger_warn_dms.ncs | Bin 0 -> 136 bytes gamma_age_v2/trigger_warn_dms.nss | 17 + gamma_age_v2/triggerpalcus.itp | Bin 0 -> 1324 bytes gamma_age_v2/tsorsut.utc | Bin 0 -> 5710 bytes gamma_age_v2/tsorsut001.utc | Bin 0 -> 4707 bytes gamma_age_v2/tsorsutproperti.uti | Bin 0 -> 1119 bytes gamma_age_v2/tz_ed_ondeath.ncs | Bin 0 -> 1146 bytes gamma_age_v2/tz_ed_ondeath.nss | 132 + gamma_age_v2/tz_ed_ondying.ncs | Bin 0 -> 134 bytes gamma_age_v2/tz_ed_ondying.nss | 42 + gamma_age_v2/unsut.utc | Bin 0 -> 4697 bytes gamma_age_v2/utilityrobot.utc | Bin 0 -> 4719 bytes gamma_age_v2/vath.utc | Bin 0 -> 5674 bytes gamma_age_v2/vathbite.uti | Bin 0 -> 1094 bytes gamma_age_v2/veneamub.utc | Bin 0 -> 4885 bytes gamma_age_v2/vibrosword.uti | Bin 0 -> 1172 bytes gamma_age_v2/warbot.utc | Bin 0 -> 6539 bytes gamma_age_v2/waypoint001.utw | Bin 0 -> 602 bytes gamma_age_v2/waypointpalcus.itp | Bin 0 -> 878 bytes gamma_age_v2/wedlxon.utc | Bin 0 -> 5085 bytes gamma_age_v2/wedlxonbloom.utc | Bin 0 -> 5665 bytes gamma_age_v2/wedlxonspore.utc | Bin 0 -> 4849 bytes gamma_age_v2/winislean.utc | Bin 0 -> 6793 bytes gamma_age_v2/woon.utc | Bin 0 -> 7484 bytes gamma_age_v2/x2_sig_state.ncs | Bin 0 -> 89 bytes gamma_age_v2/x2_sig_state.nss | 18 + gamma_age_v2/yexil.utc | Bin 0 -> 12998 bytes gamma_age_v2/yexilhide.uti | Bin 0 -> 969 bytes gamma_age_v2/zarn.utc | Bin 0 -> 5077 bytes gamma_age_v2/zarnbite.uti | Bin 0 -> 1094 bytes gamma_age_v2/zarnproperties.uti | Bin 0 -> 1369 bytes 877 files changed, 53029 insertions(+) create mode 100644 gamma_age_v2/DMBookofJournalE.uti create mode 100644 gamma_age_v2/Repute.fac create mode 100644 gamma_age_v2/ab_desctrig_fnf.ncs create mode 100644 gamma_age_v2/ab_desctrig_fnf.nss create mode 100644 gamma_age_v2/ab_desctrig_mult.ncs create mode 100644 gamma_age_v2/ab_desctrig_mult.nss create mode 100644 gamma_age_v2/adventurers_inn.are create mode 100644 gamma_age_v2/adventurers_inn.gic create mode 100644 gamma_age_v2/adventurers_inn.git create mode 100644 gamma_age_v2/albilope.utc create mode 100644 gamma_age_v2/albilope001.utc create mode 100644 gamma_age_v2/albilopegore.uti create mode 100644 gamma_age_v2/albilopehide.uti create mode 100644 gamma_age_v2/android.utc create mode 100644 gamma_age_v2/android001.utc create mode 100644 gamma_age_v2/android002.utc create mode 100644 gamma_age_v2/android003.utc create mode 100644 gamma_age_v2/androidproperti.uti create mode 100644 gamma_age_v2/ark.utc create mode 100644 gamma_age_v2/armyofthedeep.uti create mode 100644 gamma_age_v2/arn.utc create mode 100644 gamma_age_v2/arnhide.uti create mode 100644 gamma_age_v2/array_example.ncs create mode 100644 gamma_age_v2/array_example.nss create mode 100644 gamma_age_v2/ashlw002.uti create mode 100644 gamma_age_v2/ashlw003.uti create mode 100644 gamma_age_v2/ashto002.uti create mode 100644 gamma_age_v2/attercop.utc create mode 100644 gamma_age_v2/attercophide.uti create mode 100644 gamma_age_v2/autoclose_door.ncs create mode 100644 gamma_age_v2/autoclose_door.nss create mode 100644 gamma_age_v2/badder.utc create mode 100644 gamma_age_v2/badderchainmail.uti create mode 100644 gamma_age_v2/badderhelm.uti create mode 100644 gamma_age_v2/badderhelm001.uti create mode 100644 gamma_age_v2/badderhide.uti create mode 100644 gamma_age_v2/baddershield.uti create mode 100644 gamma_age_v2/bamutan.utc create mode 100644 gamma_age_v2/bamutencarpace.uti create mode 100644 gamma_age_v2/banded_lg.uti create mode 100644 gamma_age_v2/banded_med.uti create mode 100644 gamma_age_v2/banded_med_a.uti create mode 100644 gamma_age_v2/banded_sm.uti create mode 100644 gamma_age_v2/banded_st.uti create mode 100644 gamma_age_v2/barxyn.utc create mode 100644 gamma_age_v2/bench001.utp create mode 100644 gamma_age_v2/besiepwres.utp create mode 100644 gamma_age_v2/besiewidget.uti create mode 100644 gamma_age_v2/bigoon.utc create mode 100644 gamma_age_v2/blaash.utc create mode 100644 gamma_age_v2/blight.utc create mode 100644 gamma_age_v2/blightbite.uti create mode 100644 gamma_age_v2/blightbuffet.uti create mode 100644 gamma_age_v2/blighthide.uti create mode 100644 gamma_age_v2/bloodbird.utc create mode 100644 gamma_age_v2/bloodbirdhide.uti create mode 100644 gamma_age_v2/bplate_med.uti create mode 100644 gamma_age_v2/bplate_med002.uti create mode 100644 gamma_age_v2/brutorz.utc create mode 100644 gamma_age_v2/brutorzkick.uti create mode 100644 gamma_age_v2/buggem.utc create mode 100644 gamma_age_v2/bulo.utc create mode 100644 gamma_age_v2/bulo001.utc create mode 100644 gamma_age_v2/bulohide.uti create mode 100644 gamma_age_v2/calthen.utc create mode 100644 gamma_age_v2/calthenbite.uti create mode 100644 gamma_age_v2/carrin.utc create mode 100644 gamma_age_v2/carrinhide.uti create mode 100644 gamma_age_v2/carrinstaff.uti create mode 100644 gamma_age_v2/centurionrobot.utc create mode 100644 gamma_age_v2/chain_sht_lg.uti create mode 100644 gamma_age_v2/chain_sht_med.uti create mode 100644 gamma_age_v2/chain_sht_sm.uti create mode 100644 gamma_age_v2/chain_sht_st.uti create mode 100644 gamma_age_v2/chainmail_lg.uti create mode 100644 gamma_age_v2/chainmail_med.uti create mode 100644 gamma_age_v2/chainmail_sm.uti create mode 100644 gamma_age_v2/chainmail_st.uti create mode 100644 gamma_age_v2/chair.uti create mode 100644 gamma_age_v2/chair001.utp create mode 100644 gamma_age_v2/chair1_sit.utp create mode 100644 gamma_age_v2/chesexpropertie.uti create mode 100644 gamma_age_v2/chessex.utc create mode 100644 gamma_age_v2/chest002.utp create mode 100644 gamma_age_v2/chest004.utp create mode 100644 gamma_age_v2/civrobotproperti.uti create mode 100644 gamma_age_v2/comclothes1.uti create mode 100644 gamma_age_v2/comclothes10.uti create mode 100644 gamma_age_v2/comclothes2.uti create mode 100644 gamma_age_v2/comclothes3.uti create mode 100644 gamma_age_v2/comclothes4.uti create mode 100644 gamma_age_v2/comclothes5.uti create mode 100644 gamma_age_v2/comclothes6.uti create mode 100644 gamma_age_v2/comclothes7.uti create mode 100644 gamma_age_v2/comclothes8.uti create mode 100644 gamma_age_v2/comclothes9.uti create mode 100644 gamma_age_v2/commonerspawner.utp create mode 100644 gamma_age_v2/companionunitrob.utc create mode 100644 gamma_age_v2/couch001.utp create mode 100644 gamma_age_v2/creaturepalcus.itp create mode 100644 gamma_age_v2/croaker.utc create mode 100644 gamma_age_v2/cybohunter.utc create mode 100644 gamma_age_v2/dabber.utc create mode 100644 gamma_age_v2/dabberarnor.uti create mode 100644 gamma_age_v2/dabbercloak.uti create mode 100644 gamma_age_v2/dabberhide.uti create mode 100644 gamma_age_v2/dark_tunic.uti create mode 100644 gamma_age_v2/deathbot.utc create mode 100644 gamma_age_v2/debgon.utc create mode 100644 gamma_age_v2/debgonproperti.uti create mode 100644 gamma_age_v2/dem_color_text.utp create mode 100644 gamma_age_v2/desolateanddespa.are create mode 100644 gamma_age_v2/desolateanddespa.gic create mode 100644 gamma_age_v2/desolateanddespa.git create mode 100644 gamma_age_v2/dm_journal_entry.dlg create mode 100644 gamma_age_v2/dmfi_500xp.uti create mode 100644 gamma_age_v2/dmfi_activate.ncs create mode 100644 gamma_age_v2/dmfi_activate.nss create mode 100644 gamma_age_v2/dmfi_afflict.uti create mode 100644 gamma_age_v2/dmfi_arrays_inc.nss create mode 100644 gamma_age_v2/dmfi_buff.uti create mode 100644 gamma_age_v2/dmfi_cond_dmw.ncs create mode 100644 gamma_age_v2/dmfi_cond_dmw.nss create mode 100644 gamma_age_v2/dmfi_custom_enc.are create mode 100644 gamma_age_v2/dmfi_custom_enc.gic create mode 100644 gamma_age_v2/dmfi_custom_enc.git create mode 100644 gamma_age_v2/dmfi_db_biow_inc.ncs create mode 100644 gamma_age_v2/dmfi_db_biow_inc.nss create mode 100644 gamma_age_v2/dmfi_db_inc.ncs create mode 100644 gamma_age_v2/dmfi_db_inc.nss create mode 100644 gamma_age_v2/dmfi_db_nbde_inc.ncs create mode 100644 gamma_age_v2/dmfi_db_nbde_inc.nss create mode 100644 gamma_age_v2/dmfi_dicebag.uti create mode 100644 gamma_age_v2/dmfi_dmbook.uti create mode 100644 gamma_age_v2/dmfi_dmw.uti create mode 100644 gamma_age_v2/dmfi_dmw_inc.ncs create mode 100644 gamma_age_v2/dmfi_dmw_inc.nss create mode 100644 gamma_age_v2/dmfi_emote.uti create mode 100644 gamma_age_v2/dmfi_en_ditto.uti create mode 100644 gamma_age_v2/dmfi_encounte.uti create mode 100644 gamma_age_v2/dmfi_execute.ncs create mode 100644 gamma_age_v2/dmfi_execute.nss create mode 100644 gamma_age_v2/dmfi_exploder.uti create mode 100644 gamma_age_v2/dmfi_faction.uti create mode 100644 gamma_age_v2/dmfi_fx.uti create mode 100644 gamma_age_v2/dmfi_getln_cbtpl.ncs create mode 100644 gamma_age_v2/dmfi_getln_cbtpl.nss create mode 100644 gamma_age_v2/dmfi_getln_inc.nss create mode 100644 gamma_age_v2/dmfi_init_inc.nss create mode 100644 gamma_age_v2/dmfi_jail_widget.uti create mode 100644 gamma_age_v2/dmfi_music.uti create mode 100644 gamma_age_v2/dmfi_mute.uti create mode 100644 gamma_age_v2/dmfi_naming.uti create mode 100644 gamma_age_v2/dmfi_onclienter.ncs create mode 100644 gamma_age_v2/dmfi_onclienter.nss create mode 100644 gamma_age_v2/dmfi_onering.uti create mode 100644 gamma_age_v2/dmfi_onmodhb.ncs create mode 100644 gamma_age_v2/dmfi_onmodhb.nss create mode 100644 gamma_age_v2/dmfi_onplychat.ncs create mode 100644 gamma_age_v2/dmfi_onplychat.nss create mode 100644 gamma_age_v2/dmfi_onrest.ncs create mode 100644 gamma_age_v2/dmfi_onrest.nss create mode 100644 gamma_age_v2/dmfi_pc_dicebag.uti create mode 100644 gamma_age_v2/dmfi_pc_emote.uti create mode 100644 gamma_age_v2/dmfi_pc_follow.uti create mode 100644 gamma_age_v2/dmfi_pc_rest001.uti create mode 100644 gamma_age_v2/dmfi_pc_rest002.uti create mode 100644 gamma_age_v2/dmfi_pc_rest003.uti create mode 100644 gamma_age_v2/dmfi_peace.uti create mode 100644 gamma_age_v2/dmfi_playerbook.uti create mode 100644 gamma_age_v2/dmfi_plchlishk_i.nss create mode 100644 gamma_age_v2/dmfi_plychat_exe.ncs create mode 100644 gamma_age_v2/dmfi_plychat_exe.nss create mode 100644 gamma_age_v2/dmfi_plychat_inc.ncs create mode 100644 gamma_age_v2/dmfi_plychat_inc.nss create mode 100644 gamma_age_v2/dmfi_remove.uti create mode 100644 gamma_age_v2/dmfi_rest.utp create mode 100644 gamma_age_v2/dmfi_rest001.utp create mode 100644 gamma_age_v2/dmfi_rest002.utp create mode 100644 gamma_age_v2/dmfi_rest003.utp create mode 100644 gamma_age_v2/dmfi_restvfxobje.utp create mode 100644 gamma_age_v2/dmfi_server.uti create mode 100644 gamma_age_v2/dmfi_setting.utc create mode 100644 gamma_age_v2/dmfi_sound.uti create mode 100644 gamma_age_v2/dmfi_string_inc.nss create mode 100644 gamma_age_v2/dmfi_target.uti create mode 100644 gamma_age_v2/dmfi_unact_nam02.ncs create mode 100644 gamma_age_v2/dmfi_unact_nam02.nss create mode 100644 gamma_age_v2/dmfi_unact_nam03.ncs create mode 100644 gamma_age_v2/dmfi_unact_nam03.nss create mode 100644 gamma_age_v2/dmfi_unact_nam04.ncs create mode 100644 gamma_age_v2/dmfi_unact_nam04.nss create mode 100644 gamma_age_v2/dmfi_unact_nam06.ncs create mode 100644 gamma_age_v2/dmfi_unact_nam06.nss create mode 100644 gamma_age_v2/dmfi_unact_nam07.ncs create mode 100644 gamma_age_v2/dmfi_unact_nam07.nss create mode 100644 gamma_age_v2/dmfi_unact_nam08.ncs create mode 100644 gamma_age_v2/dmfi_unact_nam08.nss create mode 100644 gamma_age_v2/dmfi_uncnd_nam01.ncs create mode 100644 gamma_age_v2/dmfi_uncnd_nam01.nss create mode 100644 gamma_age_v2/dmfi_uncnd_nam05.ncs create mode 100644 gamma_age_v2/dmfi_uncnd_nam05.nss create mode 100644 gamma_age_v2/dmfi_univ_1.ncs create mode 100644 gamma_age_v2/dmfi_univ_1.nss create mode 100644 gamma_age_v2/dmfi_univ_10.ncs create mode 100644 gamma_age_v2/dmfi_univ_10.nss create mode 100644 gamma_age_v2/dmfi_univ_2.ncs create mode 100644 gamma_age_v2/dmfi_univ_2.nss create mode 100644 gamma_age_v2/dmfi_univ_3.ncs create mode 100644 gamma_age_v2/dmfi_univ_3.nss create mode 100644 gamma_age_v2/dmfi_univ_4.ncs create mode 100644 gamma_age_v2/dmfi_univ_4.nss create mode 100644 gamma_age_v2/dmfi_univ_5.ncs create mode 100644 gamma_age_v2/dmfi_univ_5.nss create mode 100644 gamma_age_v2/dmfi_univ_6.ncs create mode 100644 gamma_age_v2/dmfi_univ_6.nss create mode 100644 gamma_age_v2/dmfi_univ_7.ncs create mode 100644 gamma_age_v2/dmfi_univ_7.nss create mode 100644 gamma_age_v2/dmfi_univ_8.ncs create mode 100644 gamma_age_v2/dmfi_univ_8.nss create mode 100644 gamma_age_v2/dmfi_univ_9.ncs create mode 100644 gamma_age_v2/dmfi_univ_9.nss create mode 100644 gamma_age_v2/dmfi_univ_cond.ncs create mode 100644 gamma_age_v2/dmfi_univ_cond.nss create mode 100644 gamma_age_v2/dmfi_univ_dmw.ncs create mode 100644 gamma_age_v2/dmfi_univ_dmw.nss create mode 100644 gamma_age_v2/dmfi_univ_listen.ncs create mode 100644 gamma_age_v2/dmfi_univ_listen.nss create mode 100644 gamma_age_v2/dmfi_universal.dlg create mode 100644 gamma_age_v2/dmfi_voice.utc create mode 100644 gamma_age_v2/dmfi_voice.uti create mode 100644 gamma_age_v2/dmfi_voice1.ncs create mode 100644 gamma_age_v2/dmfi_voice1.nss create mode 100644 gamma_age_v2/dmfi_voice_exe.ncs create mode 100644 gamma_age_v2/dmfi_voice_exe.nss create mode 100644 gamma_age_v2/dmfi_voicewidget.uti create mode 100644 gamma_age_v2/dmfi_x_afflict.ncs create mode 100644 gamma_age_v2/dmfi_x_afflict.nss create mode 100644 gamma_age_v2/dmfi_x_emote.ncs create mode 100644 gamma_age_v2/dmfi_x_emote.nss create mode 100644 gamma_age_v2/dmfi_x_fx.ncs create mode 100644 gamma_age_v2/dmfi_x_fx.nss create mode 100644 gamma_age_v2/dmfi_xp.uti create mode 100644 gamma_age_v2/doorpalcus.itp create mode 100644 gamma_age_v2/encounterpalcus.itp create mode 100644 gamma_age_v2/encroach.utc create mode 100644 gamma_age_v2/erdgon.utc create mode 100644 gamma_age_v2/erdgonpropertie.uti create mode 100644 gamma_age_v2/exterminategarb.uti create mode 100644 gamma_age_v2/exterminator.utc create mode 100644 gamma_age_v2/exterminator2.utc create mode 100644 gamma_age_v2/ey_dpcon_erewood.are create mode 100644 gamma_age_v2/ey_dpcon_erewood.gic create mode 100644 gamma_age_v2/ey_dpcon_erewood.git create mode 100644 gamma_age_v2/fdwarf.utc create mode 100644 gamma_age_v2/felf.utc create mode 100644 gamma_age_v2/felgon.utc create mode 100644 gamma_age_v2/felgonproperti.uti create mode 100644 gamma_age_v2/fen.utc create mode 100644 gamma_age_v2/fengreatsword.uti create mode 100644 gamma_age_v2/fgnome.utc create mode 100644 gamma_age_v2/fhalfelf.utc create mode 100644 gamma_age_v2/fhalfling.utc create mode 100644 gamma_age_v2/fhalforc.utc create mode 100644 gamma_age_v2/fhuman.utc create mode 100644 gamma_age_v2/fhuman_1.utc create mode 100644 gamma_age_v2/fhuman_10.utc create mode 100644 gamma_age_v2/fhuman_2.utc create mode 100644 gamma_age_v2/fhuman_3.utc create mode 100644 gamma_age_v2/fhuman_4.utc create mode 100644 gamma_age_v2/fhuman_5.utc create mode 100644 gamma_age_v2/fhuman_6.utc create mode 100644 gamma_age_v2/fhuman_7.utc create mode 100644 gamma_age_v2/fhuman_8.utc create mode 100644 gamma_age_v2/fhuman_9.utc create mode 100644 gamma_age_v2/firebug.utc create mode 100644 gamma_age_v2/firefloatytexton.utt create mode 100644 gamma_age_v2/flynn.utc create mode 100644 gamma_age_v2/flynnfemale.utc create mode 100644 gamma_age_v2/form_queen001.utc create mode 100644 gamma_age_v2/form_taskmast001.utc create mode 100644 gamma_age_v2/form_warrior001.utc create mode 100644 gamma_age_v2/form_worker001.utc create mode 100644 gamma_age_v2/frostedpits.are create mode 100644 gamma_age_v2/frostedpits.gic create mode 100644 gamma_age_v2/frostedpits.git create mode 100644 gamma_age_v2/frozentimes.are create mode 100644 gamma_age_v2/frozentimes.gic create mode 100644 gamma_age_v2/frozentimes.git create mode 100644 gamma_age_v2/gallusgallus.utc create mode 100644 gamma_age_v2/gallusgallus001.utc create mode 100644 gamma_age_v2/gator.utc create mode 100644 gamma_age_v2/gatorbite.uti create mode 100644 gamma_age_v2/gelgon.utc create mode 100644 gamma_age_v2/gelgon001.utc create mode 100644 gamma_age_v2/gelgon002.utc create mode 100644 gamma_age_v2/gelgon003.utc create mode 100644 gamma_age_v2/gelgonpropert001.uti create mode 100644 gamma_age_v2/gelgonproperti.uti create mode 100644 gamma_age_v2/generalstore.utm create mode 100644 gamma_age_v2/glider.utc create mode 100644 gamma_age_v2/glower.utc create mode 100644 gamma_age_v2/glowring.uti create mode 100644 gamma_age_v2/goth.utc create mode 100644 gamma_age_v2/gren.utc create mode 100644 gamma_age_v2/gren001.utc create mode 100644 gamma_age_v2/grenspear.uti create mode 100644 gamma_age_v2/gretvarl.utc create mode 100644 gamma_age_v2/grey.utc create mode 100644 gamma_age_v2/groak.utc create mode 100644 gamma_age_v2/gz_chair_use.ncs create mode 100644 gamma_age_v2/gz_chair_use.nss create mode 100644 gamma_age_v2/habd_bandages.uti create mode 100644 gamma_age_v2/habd_deathbag.utp create mode 100644 gamma_age_v2/habd_deathtoken.uti create mode 100644 gamma_age_v2/habd_dmdeath.uti create mode 100644 gamma_age_v2/habd_dmtoken.uti create mode 100644 gamma_age_v2/habd_include.ncs create mode 100644 gamma_age_v2/habd_include.nss create mode 100644 gamma_age_v2/habd_onpcdeath.ncs create mode 100644 gamma_age_v2/habd_onpcdeath.nss create mode 100644 gamma_age_v2/habd_onpcdying.ncs create mode 100644 gamma_age_v2/habd_onpcdying.nss create mode 100644 gamma_age_v2/habd_onpcrespawn.ncs create mode 100644 gamma_age_v2/habd_onpcrespawn.nss create mode 100644 gamma_age_v2/habd_rules.uti create mode 100644 gamma_age_v2/halfplate_med.uti create mode 100644 gamma_age_v2/hawkoid.utc create mode 100644 gamma_age_v2/herlproperties.uti create mode 100644 gamma_age_v2/herp.utc create mode 100644 gamma_age_v2/hide_lg.uti create mode 100644 gamma_age_v2/hide_med.uti create mode 100644 gamma_age_v2/hide_sm.uti create mode 100644 gamma_age_v2/hide_st.uti create mode 100644 gamma_age_v2/hif_onacquireite.ncs create mode 100644 gamma_age_v2/hif_onacquireite.nss create mode 100644 gamma_age_v2/hif_onactivateit.ncs create mode 100644 gamma_age_v2/hif_onactivateit.nss create mode 100644 gamma_age_v2/hif_onclientente.ncs create mode 100644 gamma_age_v2/hif_onclientente.nss create mode 100644 gamma_age_v2/hif_onclientleav.ncs create mode 100644 gamma_age_v2/hif_onclientleav.nss create mode 100644 gamma_age_v2/hif_onheartbeat.ncs create mode 100644 gamma_age_v2/hif_onheartbeat.nss create mode 100644 gamma_age_v2/hif_onmoduleload.ncs create mode 100644 gamma_age_v2/hif_onmoduleload.nss create mode 100644 gamma_age_v2/hif_onplayerchat.ncs create mode 100644 gamma_age_v2/hif_onplayerchat.nss create mode 100644 gamma_age_v2/hif_onplayerdeat.ncs create mode 100644 gamma_age_v2/hif_onplayerdeat.nss create mode 100644 gamma_age_v2/hif_onplayerdyin.ncs create mode 100644 gamma_age_v2/hif_onplayerdyin.nss create mode 100644 gamma_age_v2/hif_onplayerequi.ncs create mode 100644 gamma_age_v2/hif_onplayerequi.nss create mode 100644 gamma_age_v2/hif_onplayerresp.ncs create mode 100644 gamma_age_v2/hif_onplayerresp.nss create mode 100644 gamma_age_v2/hif_onplayerrest.ncs create mode 100644 gamma_age_v2/hif_onplayerrest.nss create mode 100644 gamma_age_v2/hif_onplayeruneq.ncs create mode 100644 gamma_age_v2/hif_onplayeruneq.nss create mode 100644 gamma_age_v2/hif_onunaquireit.ncs create mode 100644 gamma_age_v2/hif_onunaquireit.nss create mode 100644 gamma_age_v2/hisser.utc create mode 100644 gamma_age_v2/hisser001.utc create mode 100644 gamma_age_v2/hisserhide.uti create mode 100644 gamma_age_v2/hlslang_014.uti create mode 100644 gamma_age_v2/hlslang_015.uti create mode 100644 gamma_age_v2/hlslang_016.uti create mode 100644 gamma_age_v2/hlslang_1.uti create mode 100644 gamma_age_v2/hlslang_10.uti create mode 100644 gamma_age_v2/hlslang_101.uti create mode 100644 gamma_age_v2/hlslang_102.uti create mode 100644 gamma_age_v2/hlslang_103.uti create mode 100644 gamma_age_v2/hlslang_104.uti create mode 100644 gamma_age_v2/hlslang_105.uti create mode 100644 gamma_age_v2/hlslang_106.uti create mode 100644 gamma_age_v2/hlslang_107.uti create mode 100644 gamma_age_v2/hlslang_108.uti create mode 100644 gamma_age_v2/hlslang_109.uti create mode 100644 gamma_age_v2/hlslang_11.uti create mode 100644 gamma_age_v2/hlslang_12.uti create mode 100644 gamma_age_v2/hlslang_13.uti create mode 100644 gamma_age_v2/hlslang_2.uti create mode 100644 gamma_age_v2/hlslang_3.uti create mode 100644 gamma_age_v2/hlslang_4.uti create mode 100644 gamma_age_v2/hlslang_5.uti create mode 100644 gamma_age_v2/hlslang_6.uti create mode 100644 gamma_age_v2/hlslang_7.uti create mode 100644 gamma_age_v2/hlslang_8.uti create mode 100644 gamma_age_v2/hlslang_9.uti create mode 100644 gamma_age_v2/holcut.utc create mode 100644 gamma_age_v2/howler.utc create mode 100644 gamma_age_v2/inc_array.nss create mode 100644 gamma_age_v2/indie.utc create mode 100644 gamma_age_v2/indietouch.uti create mode 100644 gamma_age_v2/innkeeper.utc create mode 100644 gamma_age_v2/invisobj001.utp create mode 100644 gamma_age_v2/it_arhelm004.uti create mode 100644 gamma_age_v2/it_creitemdrs001.uti create mode 100644 gamma_age_v2/it_creitemunh001.uti create mode 100644 gamma_age_v2/it_crewps003.uti create mode 100644 gamma_age_v2/it_crewps016.uti create mode 100644 gamma_age_v2/itempalcus.itp create mode 100644 gamma_age_v2/j_inc_walk.nss create mode 100644 gamma_age_v2/jaget.utc create mode 100644 gamma_age_v2/jagethide.uti create mode 100644 gamma_age_v2/jemagonproperti.uti create mode 100644 gamma_age_v2/joardanz.utc create mode 100644 gamma_age_v2/joardanzcow.utc create mode 100644 gamma_age_v2/juog.utc create mode 100644 gamma_age_v2/kailin.utc create mode 100644 gamma_age_v2/kailin.uti create mode 100644 gamma_age_v2/kailinbite.uti create mode 100644 gamma_age_v2/kailinclaw.uti create mode 100644 gamma_age_v2/kamodo.utc create mode 100644 gamma_age_v2/kamodohide.uti create mode 100644 gamma_age_v2/katkin.utc create mode 100644 gamma_age_v2/katkin001.utc create mode 100644 gamma_age_v2/keeshin.utc create mode 100644 gamma_age_v2/kiikcee.utc create mode 100644 gamma_age_v2/kiikceeproperti.uti create mode 100644 gamma_age_v2/knighthelmet.uti create mode 100644 gamma_age_v2/knightofgeneticp.utc create mode 100644 gamma_age_v2/knightsplate.uti create mode 100644 gamma_age_v2/latterbug.utc create mode 100644 gamma_age_v2/leath_arm_lg.uti create mode 100644 gamma_age_v2/leath_arm_med.uti create mode 100644 gamma_age_v2/leath_arm_sm.uti create mode 100644 gamma_age_v2/leath_arm_st.uti create mode 100644 gamma_age_v2/lil.utc create mode 100644 gamma_age_v2/lil001.utc create mode 100644 gamma_age_v2/lilarrow.uti create mode 100644 gamma_age_v2/limbo001.are create mode 100644 gamma_age_v2/limbo001.gic create mode 100644 gamma_age_v2/limbo001.git create mode 100644 gamma_age_v2/loopur.utc create mode 100644 gamma_age_v2/maarcl108.uti create mode 100644 gamma_age_v2/mantabite.uti create mode 100644 gamma_age_v2/mantahide.uti create mode 100644 gamma_age_v2/mantas.utc create mode 100644 gamma_age_v2/marlock.utc create mode 100644 gamma_age_v2/marlockfemale.utc create mode 100644 gamma_age_v2/marlockproperti.uti create mode 100644 gamma_age_v2/mdwarf.utc create mode 100644 gamma_age_v2/medicalrobot.utc create mode 100644 gamma_age_v2/melf.utc create mode 100644 gamma_age_v2/menarl.utc create mode 100644 gamma_age_v2/menarlhide.uti create mode 100644 gamma_age_v2/mgnome.utc create mode 100644 gamma_age_v2/mhalfelf.utc create mode 100644 gamma_age_v2/mhalfling.utc create mode 100644 gamma_age_v2/mhalforc.utc create mode 100644 gamma_age_v2/mhuman.utc create mode 100644 gamma_age_v2/mhuman_1.utc create mode 100644 gamma_age_v2/mhuman_10.utc create mode 100644 gamma_age_v2/mhuman_2.utc create mode 100644 gamma_age_v2/mhuman_3.utc create mode 100644 gamma_age_v2/mhuman_4.utc create mode 100644 gamma_age_v2/mhuman_5.utc create mode 100644 gamma_age_v2/mhuman_6.utc create mode 100644 gamma_age_v2/mhuman_7.utc create mode 100644 gamma_age_v2/mhuman_8.utc create mode 100644 gamma_age_v2/mhuman_9.utc create mode 100644 gamma_age_v2/mmorpgspawner.utp create mode 100644 gamma_age_v2/mod_ctrl_bk_set.ncs create mode 100644 gamma_age_v2/mod_ctrl_bk_set.nss create mode 100644 gamma_age_v2/mod_ruleset.dlg create mode 100644 gamma_age_v2/module.ifo create mode 100644 gamma_age_v2/module.jrl create mode 100644 gamma_age_v2/mordmagman01.are create mode 100644 gamma_age_v2/mordmagman01.gic create mode 100644 gamma_age_v2/mordmagman01.git create mode 100644 gamma_age_v2/mordmagman02.are create mode 100644 gamma_age_v2/mordmagman02.gic create mode 100644 gamma_age_v2/mordmagman02.git create mode 100644 gamma_age_v2/mordmagman03.are create mode 100644 gamma_age_v2/mordmagman03.gic create mode 100644 gamma_age_v2/mordmagman03.git create mode 100644 gamma_age_v2/mordmagman04.are create mode 100644 gamma_age_v2/mordmagman04.gic create mode 100644 gamma_age_v2/mordmagman04.git create mode 100644 gamma_age_v2/mordmagman05.are create mode 100644 gamma_age_v2/mordmagman05.gic create mode 100644 gamma_age_v2/mordmagman05.git create mode 100644 gamma_age_v2/mordmagman06.are create mode 100644 gamma_age_v2/mordmagman06.gic create mode 100644 gamma_age_v2/mordmagman06.git create mode 100644 gamma_age_v2/movechair.utp create mode 100644 gamma_age_v2/movestool.utp create mode 100644 gamma_age_v2/narleps.utc create mode 100644 gamma_age_v2/nbde_inc.nss create mode 100644 gamma_age_v2/nthlai.utc create mode 100644 gamma_age_v2/nw_c2_default4.ncs create mode 100644 gamma_age_v2/nw_c2_default4.nss create mode 100644 gamma_age_v2/nw_c2_default5.ncs create mode 100644 gamma_age_v2/nw_c2_default5.nss create mode 100644 gamma_age_v2/nw_s0_raisdead.ncs create mode 100644 gamma_age_v2/nw_s0_raisdead.nss create mode 100644 gamma_age_v2/nw_s0_resserec.ncs create mode 100644 gamma_age_v2/nw_s0_resserec.nss create mode 100644 gamma_age_v2/nw_s3_actitem01.ncs create mode 100644 gamma_age_v2/nw_s3_actitem01.nss create mode 100644 gamma_age_v2/nwnx.nss create mode 100644 gamma_age_v2/nwnx_admin.nss create mode 100644 gamma_age_v2/nwnx_appearance.nss create mode 100644 gamma_age_v2/nwnx_area.nss create mode 100644 gamma_age_v2/nwnx_chat.nss create mode 100644 gamma_age_v2/nwnx_consts.nss create mode 100644 gamma_age_v2/nwnx_creature.nss create mode 100644 gamma_age_v2/nwnx_damage.nss create mode 100644 gamma_age_v2/nwnx_data.nss create mode 100644 gamma_age_v2/nwnx_dialog.nss create mode 100644 gamma_age_v2/nwnx_effect.nss create mode 100644 gamma_age_v2/nwnx_elc.nss create mode 100644 gamma_age_v2/nwnx_encounter.nss create mode 100644 gamma_age_v2/nwnx_events.nss create mode 100644 gamma_age_v2/nwnx_feat.nss create mode 100644 gamma_age_v2/nwnx_feedback.nss create mode 100644 gamma_age_v2/nwnx_item.nss create mode 100644 gamma_age_v2/nwnx_itemprop.nss create mode 100644 gamma_age_v2/nwnx_lua.nss create mode 100644 gamma_age_v2/nwnx_object.nss create mode 100644 gamma_age_v2/nwnx_player.nss create mode 100644 gamma_age_v2/nwnx_player_qbs.nss create mode 100644 gamma_age_v2/nwnx_profiler.nss create mode 100644 gamma_age_v2/nwnx_race.nss create mode 100644 gamma_age_v2/nwnx_race_2da.nss create mode 100644 gamma_age_v2/nwnx_redis.nss create mode 100644 gamma_age_v2/nwnx_redis_lib.nss create mode 100644 gamma_age_v2/nwnx_redis_ps.nss create mode 100644 gamma_age_v2/nwnx_redis_short.nss create mode 100644 gamma_age_v2/nwnx_regex.nss create mode 100644 gamma_age_v2/nwnx_rename.nss create mode 100644 gamma_age_v2/nwnx_reveal.nss create mode 100644 gamma_age_v2/nwnx_ruby.nss create mode 100644 gamma_age_v2/nwnx_skillranks.nss create mode 100644 gamma_age_v2/nwnx_spellcheck.nss create mode 100644 gamma_age_v2/nwnx_sql.nss create mode 100644 gamma_age_v2/nwnx_tests.nss create mode 100644 gamma_age_v2/nwnx_tileset.nss create mode 100644 gamma_age_v2/nwnx_time.nss create mode 100644 gamma_age_v2/nwnx_util.nss create mode 100644 gamma_age_v2/nwnx_visibility.nss create mode 100644 gamma_age_v2/nwnx_weapon.nss create mode 100644 gamma_age_v2/nwnx_webhook.nss create mode 100644 gamma_age_v2/nwnx_webhook_rch.nss create mode 100644 gamma_age_v2/nyan.utc create mode 100644 gamma_age_v2/obb.utc create mode 100644 gamma_age_v2/obbhide.uti create mode 100644 gamma_age_v2/on_pubsub.ncs create mode 100644 gamma_age_v2/on_pubsub.nss create mode 100644 gamma_age_v2/orlen.utc create mode 100644 gamma_age_v2/parn.utc create mode 100644 gamma_age_v2/parnclaw.uti create mode 100644 gamma_age_v2/pierinhorl.utc create mode 100644 gamma_age_v2/pitchfork.uti create mode 100644 gamma_age_v2/placeablepalcus.itp create mode 100644 gamma_age_v2/placeablerespawn.utp create mode 100644 gamma_age_v2/plate_med.uti create mode 100644 gamma_age_v2/podog.utc create mode 100644 gamma_age_v2/podog001.utc create mode 100644 gamma_age_v2/podoghide.uti create mode 100644 gamma_age_v2/policearmor.uti create mode 100644 gamma_age_v2/policehelmet.uti create mode 100644 gamma_age_v2/policerobot.utc create mode 100644 gamma_age_v2/portal_conv.dlg create mode 100644 gamma_age_v2/portal_start.ncs create mode 100644 gamma_age_v2/portal_start.nss create mode 100644 gamma_age_v2/prc_maze_01.are create mode 100644 gamma_age_v2/prc_maze_01.gic create mode 100644 gamma_age_v2/prc_maze_01.git create mode 100644 gamma_age_v2/pwrespawner.utp create mode 100644 gamma_age_v2/rakoxen.utc create mode 100644 gamma_age_v2/rakrods.utc create mode 100644 gamma_age_v2/randomencounters.utp create mode 100644 gamma_age_v2/re_common_blkd.ncs create mode 100644 gamma_age_v2/re_common_blkd.nss create mode 100644 gamma_age_v2/re_common_spawn.ncs create mode 100644 gamma_age_v2/re_common_spawn.nss create mode 100644 gamma_age_v2/re_commoner0.ncs create mode 100644 gamma_age_v2/re_commoner0.nss create mode 100644 gamma_age_v2/re_commoner1.ncs create mode 100644 gamma_age_v2/re_commoner1.nss create mode 100644 gamma_age_v2/re_commonspwnrhb.ncs create mode 100644 gamma_age_v2/re_commonspwnrhb.nss create mode 100644 gamma_age_v2/re_custom.ncs create mode 100644 gamma_age_v2/re_custom.nss create mode 100644 gamma_age_v2/re_custom1.ncs create mode 100644 gamma_age_v2/re_custom1.nss create mode 100644 gamma_age_v2/re_cv_commoner.dlg create mode 100644 gamma_age_v2/re_levspawnerhb.ncs create mode 100644 gamma_age_v2/re_levspawnerhb.nss create mode 100644 gamma_age_v2/re_mmorpghb.ncs create mode 100644 gamma_age_v2/re_mmorpghb.nss create mode 100644 gamma_age_v2/re_moditemdrop.ncs create mode 100644 gamma_age_v2/re_moditemdrop.nss create mode 100644 gamma_age_v2/re_modulehb.ncs create mode 100644 gamma_age_v2/re_modulehb.nss create mode 100644 gamma_age_v2/re_onactivate.ncs create mode 100644 gamma_age_v2/re_onactivate.nss create mode 100644 gamma_age_v2/re_oncliententer.ncs create mode 100644 gamma_age_v2/re_oncliententer.nss create mode 100644 gamma_age_v2/re_onload.ncs create mode 100644 gamma_age_v2/re_onload.nss create mode 100644 gamma_age_v2/re_onrest.ncs create mode 100644 gamma_age_v2/re_onrest.nss create mode 100644 gamma_age_v2/re_onunacquire.ncs create mode 100644 gamma_age_v2/re_onunacquire.nss create mode 100644 gamma_age_v2/re_or.ncs create mode 100644 gamma_age_v2/re_or.nss create mode 100644 gamma_age_v2/re_placespawnhb.ncs create mode 100644 gamma_age_v2/re_placespawnhb.nss create mode 100644 gamma_age_v2/re_pwrespawnerhb.ncs create mode 100644 gamma_age_v2/re_pwrespawnerhb.nss create mode 100644 gamma_age_v2/re_rndenc.nss create mode 100644 gamma_age_v2/re_sc_dialogue1.ncs create mode 100644 gamma_age_v2/re_sc_dialogue1.nss create mode 100644 gamma_age_v2/re_sc_dialogue10.ncs create mode 100644 gamma_age_v2/re_sc_dialogue10.nss create mode 100644 gamma_age_v2/re_sc_dialogue2.ncs create mode 100644 gamma_age_v2/re_sc_dialogue2.nss create mode 100644 gamma_age_v2/re_sc_dialogue3.ncs create mode 100644 gamma_age_v2/re_sc_dialogue3.nss create mode 100644 gamma_age_v2/re_sc_dialogue4.ncs create mode 100644 gamma_age_v2/re_sc_dialogue4.nss create mode 100644 gamma_age_v2/re_sc_dialogue5.ncs create mode 100644 gamma_age_v2/re_sc_dialogue5.nss create mode 100644 gamma_age_v2/re_sc_dialogue6.ncs create mode 100644 gamma_age_v2/re_sc_dialogue6.nss create mode 100644 gamma_age_v2/re_sc_dialogue7.ncs create mode 100644 gamma_age_v2/re_sc_dialogue7.nss create mode 100644 gamma_age_v2/re_sc_dialogue8.ncs create mode 100644 gamma_age_v2/re_sc_dialogue8.nss create mode 100644 gamma_age_v2/re_sc_dialogue9.ncs create mode 100644 gamma_age_v2/re_sc_dialogue9.nss create mode 100644 gamma_age_v2/re_spawnerhb.ncs create mode 100644 gamma_age_v2/re_spawnerhb.nss create mode 100644 gamma_age_v2/re_spawnerhb_v2.ncs create mode 100644 gamma_age_v2/re_spawnerhb_v2.nss create mode 100644 gamma_age_v2/re_table.nss create mode 100644 gamma_age_v2/re_treasure.ncs create mode 100644 gamma_age_v2/re_treasure.nss create mode 100644 gamma_age_v2/re_treasure0.ncs create mode 100644 gamma_age_v2/re_treasure0.nss create mode 100644 gamma_age_v2/re_treasure1.ncs create mode 100644 gamma_age_v2/re_treasure1.nss create mode 100644 gamma_age_v2/re_trsr_table.nss create mode 100644 gamma_age_v2/re_widget.dlg create mode 100644 gamma_age_v2/re_widget1.ncs create mode 100644 gamma_age_v2/re_widget1.nss create mode 100644 gamma_age_v2/re_widget10.ncs create mode 100644 gamma_age_v2/re_widget10.nss create mode 100644 gamma_age_v2/re_widget11.ncs create mode 100644 gamma_age_v2/re_widget11.nss create mode 100644 gamma_age_v2/re_widget12.ncs create mode 100644 gamma_age_v2/re_widget12.nss create mode 100644 gamma_age_v2/re_widget13.ncs create mode 100644 gamma_age_v2/re_widget13.nss create mode 100644 gamma_age_v2/re_widget14.ncs create mode 100644 gamma_age_v2/re_widget14.nss create mode 100644 gamma_age_v2/re_widget15.ncs create mode 100644 gamma_age_v2/re_widget15.nss create mode 100644 gamma_age_v2/re_widget16.ncs create mode 100644 gamma_age_v2/re_widget16.nss create mode 100644 gamma_age_v2/re_widget17.ncs create mode 100644 gamma_age_v2/re_widget17.nss create mode 100644 gamma_age_v2/re_widget18.ncs create mode 100644 gamma_age_v2/re_widget18.nss create mode 100644 gamma_age_v2/re_widget19.ncs create mode 100644 gamma_age_v2/re_widget19.nss create mode 100644 gamma_age_v2/re_widget2.ncs create mode 100644 gamma_age_v2/re_widget2.nss create mode 100644 gamma_age_v2/re_widget20.ncs create mode 100644 gamma_age_v2/re_widget20.nss create mode 100644 gamma_age_v2/re_widget21.ncs create mode 100644 gamma_age_v2/re_widget21.nss create mode 100644 gamma_age_v2/re_widget22.ncs create mode 100644 gamma_age_v2/re_widget22.nss create mode 100644 gamma_age_v2/re_widget23.ncs create mode 100644 gamma_age_v2/re_widget23.nss create mode 100644 gamma_age_v2/re_widget24.ncs create mode 100644 gamma_age_v2/re_widget24.nss create mode 100644 gamma_age_v2/re_widget25.ncs create mode 100644 gamma_age_v2/re_widget25.nss create mode 100644 gamma_age_v2/re_widget3.ncs create mode 100644 gamma_age_v2/re_widget3.nss create mode 100644 gamma_age_v2/re_widget4.ncs create mode 100644 gamma_age_v2/re_widget4.nss create mode 100644 gamma_age_v2/re_widget5.ncs create mode 100644 gamma_age_v2/re_widget5.nss create mode 100644 gamma_age_v2/re_widget6.ncs create mode 100644 gamma_age_v2/re_widget6.nss create mode 100644 gamma_age_v2/re_widget7.ncs create mode 100644 gamma_age_v2/re_widget7.nss create mode 100644 gamma_age_v2/re_widget8.ncs create mode 100644 gamma_age_v2/re_widget8.nss create mode 100644 gamma_age_v2/re_widget9.ncs create mode 100644 gamma_age_v2/re_widget9.nss create mode 100644 gamma_age_v2/redcloak.uti create mode 100644 gamma_age_v2/relanops.utc create mode 100644 gamma_age_v2/relanopspropert.uti create mode 100644 gamma_age_v2/rest_item.uti create mode 100644 gamma_age_v2/riotshield.uti create mode 100644 gamma_age_v2/robohunter.utc create mode 100644 gamma_age_v2/robotproperties.uti create mode 100644 gamma_age_v2/rodcut.utc create mode 100644 gamma_age_v2/rodqas.utc create mode 100644 gamma_age_v2/ruinedminds001.are create mode 100644 gamma_age_v2/ruinedminds001.gic create mode 100644 gamma_age_v2/ruinedminds001.git create mode 100644 gamma_age_v2/sarbis.utc create mode 100644 gamma_age_v2/sarbis001.utc create mode 100644 gamma_age_v2/sasquatch.utc create mode 100644 gamma_age_v2/scale_lg.uti create mode 100644 gamma_age_v2/scale_med.uti create mode 100644 gamma_age_v2/scale_med_1.uti create mode 100644 gamma_age_v2/scale_sm.uti create mode 100644 gamma_age_v2/scale_st.uti create mode 100644 gamma_age_v2/screamer.utc create mode 100644 gamma_age_v2/screamerclaw.uti create mode 100644 gamma_age_v2/screamerpropert.uti create mode 100644 gamma_age_v2/securitityrobot.utc create mode 100644 gamma_age_v2/securityarmor.uti create mode 100644 gamma_age_v2/seeker.utc create mode 100644 gamma_age_v2/sei_drop.ncs create mode 100644 gamma_age_v2/sei_drop.nss create mode 100644 gamma_age_v2/sei_move.dlg create mode 100644 gamma_age_v2/sei_pickup.ncs create mode 100644 gamma_age_v2/sei_pickup.nss create mode 100644 gamma_age_v2/sei_sit.ncs create mode 100644 gamma_age_v2/sei_sit.nss create mode 100644 gamma_age_v2/sei_ta_isoccu.ncs create mode 100644 gamma_age_v2/sei_ta_isoccu.nss create mode 100644 gamma_age_v2/sei_talk.ncs create mode 100644 gamma_age_v2/sei_talk.nss create mode 100644 gamma_age_v2/sentryrobot.utc create mode 100644 gamma_age_v2/sep.utc create mode 100644 gamma_age_v2/sepbite.uti create mode 100644 gamma_age_v2/serenlous.utc create mode 100644 gamma_age_v2/serf.utc create mode 100644 gamma_age_v2/sergonpropertie.uti create mode 100644 gamma_age_v2/servficebot.uti create mode 100644 gamma_age_v2/servicehead.uti create mode 100644 gamma_age_v2/servicerobot.utc create mode 100644 gamma_age_v2/set_death_def_nw.ncs create mode 100644 gamma_age_v2/set_death_def_nw.nss create mode 100644 gamma_age_v2/set_death_habd.ncs create mode 100644 gamma_age_v2/set_death_habd.nss create mode 100644 gamma_age_v2/set_death_parth.ncs create mode 100644 gamma_age_v2/set_death_parth.nss create mode 100644 gamma_age_v2/set_death_res_pn.ncs create mode 100644 gamma_age_v2/set_death_res_pn.nss create mode 100644 gamma_age_v2/set_resp_custom.ncs create mode 100644 gamma_age_v2/set_resp_custom.nss create mode 100644 gamma_age_v2/set_resp_default.ncs create mode 100644 gamma_age_v2/set_resp_default.nss create mode 100644 gamma_age_v2/set_resp_mod_st.ncs create mode 100644 gamma_age_v2/set_resp_mod_st.nss create mode 100644 gamma_age_v2/set_rest_def_nwn.ncs create mode 100644 gamma_age_v2/set_rest_def_nwn.nss create mode 100644 gamma_age_v2/set_rest_dmfi.ncs create mode 100644 gamma_age_v2/set_rest_dmfi.nss create mode 100644 gamma_age_v2/set_rest_none.ncs create mode 100644 gamma_age_v2/set_rest_none.nss create mode 100644 gamma_age_v2/set_rest_sbr.ncs create mode 100644 gamma_age_v2/set_rest_sbr.nss create mode 100644 gamma_age_v2/set_rest_time.ncs create mode 100644 gamma_age_v2/set_rest_time.nss create mode 100644 gamma_age_v2/sibraspropertie.uti create mode 100644 gamma_age_v2/sleeth.utc create mode 100644 gamma_age_v2/sm_on_act.ncs create mode 100644 gamma_age_v2/sm_on_act.nss create mode 100644 gamma_age_v2/sm_on_client_ent.ncs create mode 100644 gamma_age_v2/sm_on_client_ent.nss create mode 100644 gamma_age_v2/sm_on_client_lv.ncs create mode 100644 gamma_age_v2/sm_on_client_lv.nss create mode 100644 gamma_age_v2/sm_on_death.ncs create mode 100644 gamma_age_v2/sm_on_death.nss create mode 100644 gamma_age_v2/sm_on_dying.ncs create mode 100644 gamma_age_v2/sm_on_dying.nss create mode 100644 gamma_age_v2/sm_on_mod_ld.ncs create mode 100644 gamma_age_v2/sm_on_mod_ld.nss create mode 100644 gamma_age_v2/sm_on_respawn.ncs create mode 100644 gamma_age_v2/sm_on_respawn.nss create mode 100644 gamma_age_v2/sm_on_rest.ncs create mode 100644 gamma_age_v2/sm_on_rest.nss create mode 100644 gamma_age_v2/sm_on_unacquire.ncs create mode 100644 gamma_age_v2/sm_on_unacquire.nss create mode 100644 gamma_age_v2/smovbai.utc create mode 100644 gamma_age_v2/solblue.utp create mode 100644 gamma_age_v2/soulbesh.utc create mode 100644 gamma_age_v2/soundpalcus.itp create mode 100644 gamma_age_v2/spawnpoint.utw create mode 100644 gamma_age_v2/spiderbot.utc create mode 100644 gamma_age_v2/spikedclub.uti create mode 100644 gamma_age_v2/splint_lg.uti create mode 100644 gamma_age_v2/splint_med.uti create mode 100644 gamma_age_v2/splint_sm.uti create mode 100644 gamma_age_v2/splint_st.uti create mode 100644 gamma_age_v2/squeeker.utc create mode 100644 gamma_age_v2/sreelon.utc create mode 100644 gamma_age_v2/sreelonandroi001.utc create mode 100644 gamma_age_v2/sreelonandroid.utc create mode 100644 gamma_age_v2/sreeloncyborg.utc create mode 100644 gamma_age_v2/sreeloncyborgh.uti create mode 100644 gamma_age_v2/sreelondronehead.uti create mode 100644 gamma_age_v2/sreelonnegaswor.uti create mode 100644 gamma_age_v2/sreelonrobot.utc create mode 100644 gamma_age_v2/start_merchant.dlg create mode 100644 gamma_age_v2/start_merchant.ncs create mode 100644 gamma_age_v2/start_merchant.nss create mode 100644 gamma_age_v2/starting_area.are create mode 100644 gamma_age_v2/starting_area.gic create mode 100644 gamma_age_v2/starting_area.git create mode 100644 gamma_age_v2/starting_clothes.uti create mode 100644 gamma_age_v2/startingmerchant.utc create mode 100644 gamma_age_v2/startingmerchant.utm create mode 100644 gamma_age_v2/stool.uti create mode 100644 gamma_age_v2/stool001.utp create mode 100644 gamma_age_v2/store_gen_start.dlg create mode 100644 gamma_age_v2/store_gen_start.ncs create mode 100644 gamma_age_v2/store_gen_start.nss create mode 100644 gamma_age_v2/storepalcus.itp create mode 100644 gamma_age_v2/stud_leath_lg.uti create mode 100644 gamma_age_v2/stud_leath_med.uti create mode 100644 gamma_age_v2/stud_leath_sm.uti create mode 100644 gamma_age_v2/stud_leath_st.uti create mode 100644 gamma_age_v2/tarnzeb.utc create mode 100644 gamma_age_v2/tarnzeb001.utc create mode 100644 gamma_age_v2/tarnzebbark.uti create mode 100644 gamma_age_v2/tarnzebvine.uti create mode 100644 gamma_age_v2/tbrath.utc create mode 100644 gamma_age_v2/teleport_auto.ncs create mode 100644 gamma_age_v2/teleport_auto.nss create mode 100644 gamma_age_v2/teleport_party.ncs create mode 100644 gamma_age_v2/teleport_party.nss create mode 100644 gamma_age_v2/teleport_start.ncs create mode 100644 gamma_age_v2/teleport_start.nss create mode 100644 gamma_age_v2/thequietofthemin.are create mode 100644 gamma_age_v2/thequietofthemin.gic create mode 100644 gamma_age_v2/thequietofthemin.git create mode 100644 gamma_age_v2/thisisthesmal001.utt create mode 100644 gamma_age_v2/thisisthesmallte.utt create mode 100644 gamma_age_v2/throneevil001.utp create mode 100644 gamma_age_v2/thronegood001.utp create mode 100644 gamma_age_v2/tridentsoldior.utc create mode 100644 gamma_age_v2/trigger_warn_dms.ncs create mode 100644 gamma_age_v2/trigger_warn_dms.nss create mode 100644 gamma_age_v2/triggerpalcus.itp create mode 100644 gamma_age_v2/tsorsut.utc create mode 100644 gamma_age_v2/tsorsut001.utc create mode 100644 gamma_age_v2/tsorsutproperti.uti create mode 100644 gamma_age_v2/tz_ed_ondeath.ncs create mode 100644 gamma_age_v2/tz_ed_ondeath.nss create mode 100644 gamma_age_v2/tz_ed_ondying.ncs create mode 100644 gamma_age_v2/tz_ed_ondying.nss create mode 100644 gamma_age_v2/unsut.utc create mode 100644 gamma_age_v2/utilityrobot.utc create mode 100644 gamma_age_v2/vath.utc create mode 100644 gamma_age_v2/vathbite.uti create mode 100644 gamma_age_v2/veneamub.utc create mode 100644 gamma_age_v2/vibrosword.uti create mode 100644 gamma_age_v2/warbot.utc create mode 100644 gamma_age_v2/waypoint001.utw create mode 100644 gamma_age_v2/waypointpalcus.itp create mode 100644 gamma_age_v2/wedlxon.utc create mode 100644 gamma_age_v2/wedlxonbloom.utc create mode 100644 gamma_age_v2/wedlxonspore.utc create mode 100644 gamma_age_v2/winislean.utc create mode 100644 gamma_age_v2/woon.utc create mode 100644 gamma_age_v2/x2_sig_state.ncs create mode 100644 gamma_age_v2/x2_sig_state.nss create mode 100644 gamma_age_v2/yexil.utc create mode 100644 gamma_age_v2/yexilhide.uti create mode 100644 gamma_age_v2/zarn.utc create mode 100644 gamma_age_v2/zarnbite.uti create mode 100644 gamma_age_v2/zarnproperties.uti diff --git a/gamma_age_v2/DMBookofJournalE.uti b/gamma_age_v2/DMBookofJournalE.uti new file mode 100644 index 0000000000000000000000000000000000000000..ec6b891ecbdddcfc465f7c32ae7451f4e0c339f6 GIT binary patch literal 1153 zcmZ8g+iuh_5H-*Og>rAXJ^7i3l>i~}fP~uJN^G@-Rd?HWZ#-#3lQ@dKpdkK+@8H|u zoWxmn8R=v^+`pRH}92F*MTYU0{D5Y)4Mm6+QE8%ODPL~1AQC%4+Kg* z<_Gc#xCPv$5oH@1N7XT~3y}X&T!U79jB8M;8E^;SnO^|qW~UVQ$xTgRe)5uUC$6E| z^Yk-ry$!R69XweDFk$<+)AW6(5r8}SF$Zcwb}=8@sD z_N=3q6K5r#nmWAhJk#1$Qin|ZBx5DfZsPUSY`F+c)n^AE>YbZK-g{`Dn|#^Zpf*M1 zW`@rG7lHeii5ygwn7Z4~B?K9dx^lo@6nMR8;lJBr;oOx=zq(~znp|FCi;dnl&r8^& z6Mcvv?NWW*h3TU*)VLJeW<8p`lmC1lV4r!>;WG1@$#ihKFy+$Zd854qZFJ18QCi*T z)YXUhlzQhUR$VKQT_Zcw;(-%Fh= zeQ?D_MqFe7s?~t8;kSTofCI@v4j6}l1I1xtv$M(hA{=-Q4hLor;DGQJ Hd{g2tmgT+O literal 0 HcmV?d00001 diff --git a/gamma_age_v2/Repute.fac b/gamma_age_v2/Repute.fac new file mode 100644 index 0000000000000000000000000000000000000000..7bd714b5514d0e54c6466ba81dc5484bea69886e GIT binary patch literal 2796 zcmcJQyLU`c6vl5J-tTw?K@bEHkpw}In2`rbj39z|Op+T3lbM)IXcS6?QlV5RQz#Wm zg;JqZ_yha_I)2~SC+niA)L z4f9XaYngwUUdLQXvWmZ6nBIV{FT*N-%;Wr-Yp>jyYgXNQx0pxg zP|BlyavtQOag=*0&!Gs9*14Qdcpl}PKRagalk(Rc(vVi}t}fjnjm12QujleKM|iYH zr966H%A@=i^SC^fvxf7Go7OttB8FGbA8LN%Rf`!3ZiYJ5N%)(l4eQ*4D-tN}-#`Q6V zeUD{-f2;OHOxg5gW^+@iPz^PfnV!z1!>n|Fm>ru;rgPHqa3V~PhgsPN!ns^FnbQ6$ zhT9+2r?ZhoOVpF~zgj(5y;nU~y;lFH)mzmosz5`1RQ*$ZQ~gqXQvFeVQTcfQ*5 Le?8;>alU^5X8ezc literal 0 HcmV?d00001 diff --git a/gamma_age_v2/ab_desctrig_fnf.ncs b/gamma_age_v2/ab_desctrig_fnf.ncs new file mode 100644 index 0000000000000000000000000000000000000000..72cb889bbc487e0e33663042834bd7dc779b7d85 GIT binary patch literal 234 zcmeZs4ps;=)H85mU|@J92P7Cc6c}JMD+7Zh0}C@ql!XmM0tNmuK?Il?|NsC0g@FYk z#LB?wkyxzYmRXdVBBBgeYz$G%$gdy|(q0AD^aHF(ixDi8jwEywA{2sZ0m33CK4!2K UBa(s-1YBUwEX@FP=nn-30N$r9UjP6A literal 0 HcmV?d00001 diff --git a/gamma_age_v2/ab_desctrig_fnf.nss b/gamma_age_v2/ab_desctrig_fnf.nss new file mode 100644 index 00000000..9792378c --- /dev/null +++ b/gamma_age_v2/ab_desctrig_fnf.nss @@ -0,0 +1,78 @@ +/////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////// +/////////////// Created By /////////////// +/////////////// Abaddon, Angel of the Abyss /////////////// +/////////////// Contactabe via Bioware® /////////////// +/////////////// Forums and Private Message /////////////// +/////////////// Utilities: /////////////// +/////////////// __Abaddon__ /////////////// +/////////////// /////////////// +/////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////// +/////////////// All Scripts and Hakpak's are /////////////// +/////////////// distibuted as is, with no /////////////// +/////////////// warranty or responsibility /////////////// +/////////////// undertaken by the author. /////////////// +/////////////// Caveat Emptor! /////////////// +/////////////// This is freeware, You may /////////////// +/////////////// distribute it in its ORIGINAL /////////////// +/////////////// form at will, if this script /////////////// +/////////////// is used in any large projects such /////////////// +/////////////// as a PW or story module, the author /////////////// +/////////////// would like to be informed, merly as /////////////// +/////////////// a curtosey and indicator of both /////////////// +/////////////// applicability and success :) /////////////// +/////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////// +////////////// Script Name: ab_DescTrig /////////////// +////////////// File Name: Descriptive Triggers /////////////// +////////////// Author(s): Abaddon /////////////// +////////////// Galap /////////////// +/////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////// +// Commentary/Introduction: // +// ----------------------- // +// Fire and forget trigger. Grabs the name of the trigger +// its attatched to and displays it as floaty text on a PC +// only one time. +// Modified as per Nathraiben's suggestion so that individual tags are no longer +// required on the trigers. +/////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////// +////////////// Function Headers /////////////// +/////////////////////////////////////////////////////////////////// + +//Fires The name of the trigger at the entering PC* +// uses an int to make only fire once. +// Int is established on the PC +// String Variance == GetTag(of the trigger) + Has Fired +// *There is a GetIsPC check in this function. +void ab_Trig_Description_FireOnceOnly(); + +void ab_Trig_Description_FireOnceOnly() +{ + object oPC = GetEnteringObject(); + string sDesc = GetName(OBJECT_SELF); + //Determine that the trigger hasnt fired for this PC before + if (GetLocalInt(OBJECT_SELF, GetName(oPC) + "Has Fired") < 1) + { + //Determine that the PC is a valid object + if (GetIsObjectValid(oPC)) + { + //If conditional just to verify that it is a PC not a wandering NPC or something of that nature + if (GetIsPC(oPC)) + { + // I like floaty text :) soo much nicer and more in mood for a player + FloatingTextStringOnCreature(sDesc, oPC, FALSE); + //Set the Int so that it will no longer fire for the PC + SetLocalInt(OBJECT_SELF, GetName(oPC) + "Has Fired", 1); + } + } + } +} +void main() +{ +ab_Trig_Description_FireOnceOnly(); +} + diff --git a/gamma_age_v2/ab_desctrig_mult.ncs b/gamma_age_v2/ab_desctrig_mult.ncs new file mode 100644 index 0000000000000000000000000000000000000000..a85b0647c504ca95df0764cef746716cc148454f GIT binary patch literal 124 zcmeZs4ps;=)H85mU|^_`0}>1z3Jfrsm4QK$frS|)%EAUBfdYS-m>K{7|Nn!51<282 klm`i$APL=s2q{9efhE2G%>d~E(yR+NgIm#OSXgCgL~1n4#^I1`c8D0&s`aPcdE<3;+}y2itF+MjZoOA)f6r&)qFyqto=aw~cRqR6+T40)+ut~78rSLb{eE>X{GYhlJi9sQTsfKR z_giFui>tAh+TYpkjrrtxG81>UbEWx6X72Bm+#9`Ji7)q?i+ryhM#Jv;kRR28(7M;= zfH&6Ar3`o#Kl@x@*9luNbg|;y6 zmBM35)WXCxcLqD_PIlH^YB$`;&bl+bwSi!4T#*y$lNH#pLUG(zrjpM2s#gr^+H1|N z98|mFWMCJLOm>FH)4?=d-el}BH(4wz(YbNY7X3jlNVg=h3pPBKj7jV`swJ#B6xh=K z@R%Q^F8e~SR47KiZ<8I~U-l;bXsDL7>}SXhPEDWjrTTa}R!xsTZFwedyKTMUoxlIK z`*@HUpSL}}7u82NRk4@6Jy`RjE`Kzzeu*asg0f%prv}JQk4D@-w%uV&`w!N2SEQY4Z$IJ2A+lI;CXlf zUWAum7!HF6BTxh#RDFE9*L3~qg9zYd&@EMl3h0{*p$e}+1U1m{o`9pE?^NHnKK@tX zHFzD~fH&bScpFZ@Nq7g|h4~Nz|1Z&YWAOk0 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/adventurers_inn.gic b/gamma_age_v2/adventurers_inn.gic new file mode 100644 index 0000000000000000000000000000000000000000..e3affc706f951e22ff8d5b508e18063871858d60 GIT binary patch literal 3070 zcmaJ@Nsk*v7;Olv!K`85J{%-w#H5p%kO)N_m^ecck%Un^Fx*DvcG<2>ca_yuj$!JPY z@hp1|?Jp;??2o6jYzH6v`2GRyJ+%L#Y@vM?^$Aogi}e|_ShAMeG4?;X>VFFDNmQ7~ zD8HM?AFX8CehHO&x$f0O=34gC_UnmE|J(jI6Zx$~emjxhNo4xau6-|&-%sQZ5?K=Y z!?~@l$FBP6FL}W^#QJm8cFwN|sFnYL%sKqNn#}nQ&bD(@BHvDApUC$T z`TIovF_C{xjp4>$|GbmQqtLJ6E@3?Af!0o7?|8#bd+@Nmuh*<9ynKeO|66AYMqQ9)Mhf#^}6R!EoaWy&~{*bq1CW#9o&YF zOUj!v9U&JD3_T_$jRLy3r^L6QH&tP3(#ceGUVGME`c ziSwbW*n+Oc3Y~YhT;fkh1^Nymv|5iOIGKCBCAa53Na1EntR6|Nt*W$a4CevH z?8g|IDm&59J9xCob%nEIGhv#?NGJTNrP4Jg2A_93-Od5bMz3O|D=0^>XAlZ~>c!Ec zCR$a8p7^3Rv#=#IW@r?Hp&hvERWQyX?vc(VYE~7)epttS^9g`0%J~S|7+FDZO7CQ- z8LrWzGnE^eF@zWfz-aQY#&sRjmLN=wLlJYg4l&8#6eDY(4cxY%%2G_wm24=026(mv zWCr||@r5o+Wwo38P3lxl*i%M9VYXrRM#Y?pkJ(2q$N>9GQbWNn5FtJJb_hKa^1`ldkklFc+C1q1Cihd(#> z`v7D+m$>&EqO8XWyau@uHSsmU!?_wH3v!?)gmrAnvdOm93(^$Ic5;aumE)B<2A9Y+ zx_qe0W9;dD?rFcVNnp5lKz)u5-3Ux?@c7!wfHfC)-{+p*P2lXv^Lo5Slfbu zq{NNKHMN_EX8SCRZ#HVHhA1uI6x4m1%Rra90AvVh0YmC0vuL}WOUsLL3zWS9_jTRv9IK_(@$ZYFnT(wa zdEqLaNne6YGdG);*b~@0g$YZKgVHT58l3)KbSUy1SbyU|h2AZ27n`VGx-j)?)4nG| zSW`;^zN<=e>|nLqL9n&}C=DA#t70lsjgxJNT*_&=YJxPZl?^u@b2apAZ+1HkOD`K7 zySxWa3mgq5;M|e{kNFLdd;2U7SdQXEt2J*_kCg}UBD*=ShH>33Juda#)gmaVRJbU; zS|0&`2-~S17Tr*o!j0i!>X1pN6(}<}_KiIgTksvDq{jvo3{UB}w%gge8_(X0vdim< zB#+}4^v=$TLh*2lG;Yl{Hxn)`-V+zLWIdx2+5tRqWM?O`CI)o^)c8tI$Pk=a@ioPl z6JJSu9r4A%Tlaa?F6s-YEDz4*OX+3QS5RL=N%G!Uwm!hH)+RL9qn;0ZL)BF YYnyf-v`<@nMYs0&iav=-yL>tS2M(ss3IG5A literal 0 HcmV?d00001 diff --git a/gamma_age_v2/adventurers_inn.git b/gamma_age_v2/adventurers_inn.git new file mode 100644 index 0000000000000000000000000000000000000000..fb17086b7dd5169dd77b696f497e6744ca24664e GIT binary patch literal 27851 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 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/albilope.utc b/gamma_age_v2/albilope.utc new file mode 100644 index 0000000000000000000000000000000000000000..f2b76138744726fa19874e8099bfaf9ddceae816 GIT binary patch literal 5170 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 C)9RuC literal 0 HcmV?d00001 diff --git a/gamma_age_v2/albilopegore.uti b/gamma_age_v2/albilopegore.uti new file mode 100644 index 0000000000000000000000000000000000000000..65ce095f185f492d57855c5de26256b560438968 GIT binary patch literal 1106 zcmY*ZNlqg{5G;0vS=eC~X7CG;fD7V+JVt;eKo<7+Fyc~nC#FTUyVYGjz=%u1Ln%em?*>_LrymXfYO`*+&>9?4l(EMgc$VZ5Lf`XhyAqK${DV6PAe?ThdTK_ z0GvVNej5A7&%xPhoUir;0rxHjuuje;;3CA!@M^sGD!?9k&Zeya<-@?QkHs5^`7X-I z_hL*=-K%e@oLDN2ocgxp)H^CCn>K+XfcO3ibb*c}nX_K5q_~nBV}9F0nqCqtm3E%? zt&1Ndy0nR)ax6tZk24>q!*ZQ@Gm@c?Z(_mWJ9bcQ48M(An-8RTtu@lZza|LUK6O%2 zmF2d#{kt{>hNhNF-}Tp{=pDuQY;I|c@`C43yGSE(Et~t@s?y5SOmZJfaUSy|A-@mT zGwo5&-)A}|^q@__6R1UwUXLgmZQNe}B7!b^rhX literal 0 HcmV?d00001 diff --git a/gamma_age_v2/albilopehide.uti b/gamma_age_v2/albilopehide.uti new file mode 100644 index 0000000000000000000000000000000000000000..b911cc5f4e763ef5be7899069765819466620572 GIT binary patch literal 1106 zcmZ8h$xa(V5G@i&fb2k4viO3O6H>wjaWh7UkpNlP@d4%1_7u>f$1|E~AIOD#M7}9s zk$*|vo9TujCB3PotE;Npul;S9bVgg7U$;f%KJXpr0DtC0-a@it2Kr^o zeg&KN5^HV*n>FLi@h)RcEYAwbe2A=y3Fam~}70!4)(dtCcM0QQ3iPsEE zwH)RXhC>}fSAZQ*S`t=H)%sZPB;vx?z|=DgV$zP$@mo@;dz>*bZdabOI5 z?zAaYhX>wFE(d5BlKL*cliy9#J0;q^xurKNE6x$+C{NY(P3gZhk$#yMT6(M1q2(mO zzY52b!EEfWir5|XFz?WeU5wBl88?eQN}DXyW{1YV&A|Dm6YUm-nzC7U>b)j=%{Zu^ zWw^cIf%nFZt;38LHq{RZUvJ(1_#|UDtalEOKxW5R*0#yun8-Z1wU9+*4qwweumJGY zkg?p)*FkphHLwO7k}+ibN8l4cwv&-$B3Zo#ki}#g8AfLDU*R3F4!j3=5cZAz{{fW_ BgOC6K literal 0 HcmV?d00001 diff --git a/gamma_age_v2/android.utc b/gamma_age_v2/android.utc new file mode 100644 index 0000000000000000000000000000000000000000..0fa9e95b4b9e6e40c74c1345ad936a1b915532cc GIT binary patch literal 4915 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 E2FB4TrT_o{ literal 0 HcmV?d00001 diff --git a/gamma_age_v2/android003.utc b/gamma_age_v2/android003.utc new file mode 100644 index 0000000000000000000000000000000000000000..c6488404ee063917c4a0269bae648a172f45bc79 GIT binary patch literal 4913 zcmeH~*_PBq7{`Nv3k-{Z`xXQgWgLbX6kJexx@Tz^hPHcP+}rA;W;#qdX_D$$6h(2v z6<>fi&?oSC?}ZPbkKj3Sj+c7j(f>cG^nCaLc%k1p|J1LlQkAO8m&#XXX3Or`(V>x} zj^j*2Kdg70D@ZSFa-2z|zixG$YwH~6=k1QO3+c7n9jAiyFBqzwGB2>_AQWeIOz`u9 zUl4p;a7pl(VD??~SrI%gctSA8Tiib-xGMOB;FE$m_oD47!83wS3$6)%QE**wL-4HN zGlI_wo)i3%;FkrzBKTFouL*u#@Ed}gg5MOZ1h)ixf_=eS@Vwv!!EM2T;B$f(1&4w= zf+NAP;I82Ff)l~1U?aFEcuDZG;1$8Eg5MJSw%`kb-x2(-;ERIa6a2p5OM*YJd=t_E zI44u;b6d{b7nV08l}2C2C+rMBY{Po;dT1D8*#>Bk7ud!;$W0pt3b<2mrp5-UO#`06(OO}s-uUI|`zH0et@Hdv9 z0e=UkFFXqsMqexJMswjeH~P8%)_nheZoaquSJr{w+A(Oa{q7j2?YGQ0ZP4;@@GzMB zNeSXU&V6YN;{MBi%Ft2V!~LWJ{V4b+Fl`*-|CRe7W42#VKC3(3P#Im?P`^%$kWZ))vk6Xb>!=$-`uISbrc)cN{{XAdM zsh0#@6U2-%Fdns#SJ-Pgj+S(is^W%fTH{pvHlaLLRXJx`B}i4$QLWHEu+eKJa!M5) z7{(HX%>~gy+MLl`7uu`}LXmYEaWC>4+Drs_kF_vn7}K|ETJ3Z&Cl%&J)yU{1>2-}A z!gL%LnB6cF*L2dUXk{3k;T^{Q>X?{w!>GhyOf}^#ss-&-w5L{QgZ}zAj96T>uV_X| zYlih&%YZPR>+*8}BeFFsx7At(G^fJFI{cw1oKdEisIXKl`cz8G{gQd%e=nP)nQm-CwabP4Ax)6 zNAr9|b?`FivNj*2Se6z_^89$@*Xby0^(u@PdZK@|oWGa+etc~v>#pdp?+-CbhZ)E&@FX%R_MtAZ?S-z`%%qVMBQ=v9S_rJ$--08qS`aNz^k)OnYKRi6T z8-+Z=+TAG&H%ob~%VxM!Cyb|xbMCkQXmAyI+aPtrI9_zaU{SlZUZP!mCn|{CsUEsX zhur>cUL2(X`gPk`jca1JrCsHkc7l~-*0gnyxOxR^tg)>Py66ehciURQFIQb`FWMh; zF*=vd?5c2Ct)}jLu+T2ryFTCNkjvoHJ{gqT_LY&QujiZSE_cbTwxFAPZc(4oB|Yr6 z+ibnEK3U}B$j`j8Xn=g~l|=z|VlVErl-Xi?h$GB?X~5>vE_|}6N-~EmhJvm*fg;<3 zH)6;|zj4&copE!t-1M*?wucWL*$xg&(@U_w>JFY$%$IMM2Z;61252M1!wuJlFPDcH z{*d_N8i4q7+Y0fg#={5?Av>U*&@PCF3?42R9P%*1Lj(^GJT&mIz(WEL2RszG5WS4S z{~l;Bv=3r%&!B!k#2}u*`vGVWVvs%r9fTN+XF)j9QRpzlAe+JU5s1MwgJ=fN44OZL zK7u}mK7l@izJ$JlE<>L}Q_z2DO&Gj0$YF59pyoJKf*8D%p$aq(O+b?n*GC%HstVDE JPCzH2zX9XbD%Jo1 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/androidproperti.uti b/gamma_age_v2/androidproperti.uti new file mode 100644 index 0000000000000000000000000000000000000000..0639a6cdaabd3e7736e80ea1611ed1207bda84da GIT binary patch literal 2143 zcmb`I$yO6V6o$(IN1Sna1x1_q%MN#}H$1+IJ$AH;=kp-cB} zeFOdebQft{cv$3~^QCT0_g3B9x;H=ncHn6b=f;nqEAH;z1DP(H?hYHZ>Foc{reY!K zrcK3C(oLK0|LUeq#aPl!n=a40X;XPG>88!p;>K;d_5bG53nmoDZsfdt90k2Gy~|@z zgQ~4JLocy&wl!y$c=uk*mJ(ZMsx8w|%?pE1)}Qt2mXS%@s>MMw38F@OUj3498%eMf zSRPl^TTVA-zr_z;ylh)*W5uYItaVT-Nfg@DRC~CRc(soe9A=BkVYF_2!S~mh$otlo z;!51oIh@Qyz75M>oZL!B%5l`RaT3_pbfA-D{nhMxrn0h_tTvr@>~Y?zw-~w+^%uNw z#q}}m)ic}jkoG$(xPPN&3(cnW;&eW=Nn%Tr>2a`MuM@qjNA2?(ejEjUGdt&bX8h4k zO;w&2(k1HUH0#Bg;6Ho;GEzjUN==n`S30}f0 Yn1&gch1XDqH!ueksKPubZX1p7U+f&SGynhq literal 0 HcmV?d00001 diff --git a/gamma_age_v2/ark.utc b/gamma_age_v2/ark.utc new file mode 100644 index 0000000000000000000000000000000000000000..278b3d0e15be1296798a98f4704e8235396e1798 GIT binary patch literal 6247 zcmeI0Ta+9{8OIAl1W5=8C|*!2At(~q!~_L3N@i#FmTWeYnMsyQU{ljmGt+EO_oTaL zH|q^h)Og|Q4Ha*A!}|ri--6;fKB_e~0jQ3V)aI zyM*5@{2t-&7XBXRoR{wv{yyRF7k*0k2b^O$tIcR&1CI2U2;VMzm+-y9XN9+f9~T}8 zKPmiP;SUObRQThxIG>5U*2};t*Dzzl zJ~3SZ*jJ`k0FH<0mB9O}glp%Fk=?#QKak6aDJK z%0I8gVYka)`5yQ~ z&aa0*=KS^WC!BK}PdUE<{(I+qzy8_z8{vO-{wDZ8;Eem5flqv&`gA7eJYxEP>y)jO z?Qs4wovF>TMp?(->oe7VHg#m1XZ_j7|7@)Ow^(tl@f(%zKhAZ2qw*Q!T?^kT>hL+@ z>+m_kcKA)pXE=QyarG&$>tsKax!U=t?{65rdLOTPT_|5Co~Kg#*r{ea(~oPP(v4%BJc!7wtpZP=_~ zyGk`oU~y`kro%ML7tFvH&YNdsRb@D|CN*(jms)E>t7dH6vHS>ksouA7lJiWN>PecX zCd}tLWxi&!APt9kn8Zav%k*5$@=#6U6`N+pSD4G{TteeCZ33Q}V@#Q9VP?{SX-DpY z%~3m*L#o*@=l8r%i(%Z$mKH3({h3-Oj6_y7lTqAh+I%`JTdYS3w-Vztm(2|Z7?X+0 zqPaM?X*wF_t_$-?;lqmO^Njpr$X(HTs`kx#2DWITV2Yoio>q!{r zzLn}IO>LZyiw~NUV`m$w?Y5J6?T#Y!GReaL z?ZKkR#yyKpB222>4+DeGgk;5;smzA#~w%cYfnr_qu)t(ceR{d)IxF!G?% z4kN6JqNs?3_(74Mj!e(p!6IM9L%^o_R1Fp1GBhOnjsXo!cd?vL30e$o3p(QT`Z z?(qV;W1}!I!PiZS4#T5+8h2+m?TpeX5pdgo9^jneE10iHzG626 zZr`^6zLvR7=l1*(z-f0G;P#u_Zf>`^&F1!++iGs7uK?UWbKA`AvIbkhHgF}_4z2>+ z_Hw&>HQ@I48n6Rg3;5YN0d@jzQ@K6mVD^CP0k@yrc5=JPZ6>#u+*Wcsc`x`N_z?IB z;3w&Cz|-Kv;689acmO;I9s&=8kARPYkAaVaPk=|jC&8z{r@^D(GvKq}bKvvf3*a&E zMerr?W$+d7Rq#0Y8u&W+2KXlU7Wg*!4)`wk9{4_Z0z3(R0DcI51bz&D3VsHD0e%U7 z1x|yfz^}n9I0rme?(bfVm0KBZVQvEZKm|;KDyV@eFb!q^%4iTl&XONcmiG`ptUPXO<=!aBiQDuQfsik08Cl4L&sqqmUEuL zT@Y<*&-rLo*UsmRJ8&ChPZuQWl__^@z-K?PS(!54g3lcU`w7llJO_8rY8otX;8{pw zADsCI&S&lroZ$%04ahym;0xH7Y?^8-T`9UURO(h25?aadszk>Obeeof{Gc;ICXix~ zCsUi4N%@{}7|X;a!$e}t)1#`Hsy^i7uG zYh9#NL+9DM8QQVLBGWVEzv{L5ZJi=+qrfvm4<%lJ8n2%x{9#nV&u4Y7^cPjgo^mJ~ qTs=xku!BmX0;v=#j!L7#IERYj4O2l>4i!UXPz_WD6+tCX0mL8L9&XP7 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/arn.utc b/gamma_age_v2/arn.utc new file mode 100644 index 0000000000000000000000000000000000000000..c3d9c471bcd2419f5003e637f263821e62c20450 GIT binary patch literal 5055 zcmeH~OTQdN8O93|L@^{tq9BNLLbxd5kmQ7$qGry_IVS^$lkv=i;B~0!u9<00clFR+ zlgW5P#Y>cnF4(YR%SUkU%C$Q`0bhWvK2LYmoR^Je<1X*-_jLW=s_Lrhx2w9Vt_<4I ztLtm$pI1t~0{!!lQh!DI!CgvSLVDtuQkQR6D*h7qHl-H#A|L6$VJKE@USLd-U0X-+ zrr<5X+k)9oxVJ0#CBZKX-Vw|(hkJJgUl!aG{C&ZDg8PC8g0BdERq$28uL=Hv;2#S9 zk>DQ-{)yn93LXl6U9c8B5*!Oo1RKF)!4tt#!KvUk1n&#Z1m}XS;6m_B@SB25!IfYq zcrN&w;DzApf|r7SCiv%qeI=|o=!E^!AF@MO7)L#3_&!_R?U{9tLa(EMj8Bb9z#QK_5RHsa zPi<@mpC7f~xazo1nVb;(WpL>0DsWoVdV3D7OmY&aoZ+Jcj{?Ie~`PlP1_-~#sfdAq78SuY6 zKMVfE^K;-&JwFdVj2Fs&Ux1E#{ucNYm~-LV5RLpIbQ<@PzXP4|{9W)_&))-I@O%;c zBAC{K7=O;O4QL(h)7nk)KRLX+o2?(3{crXC5N>)5H`C^=Iye7LZ^i2W8!OK54s;T0 zkl&w8D17U-!2GXp?QcWRp>p7D@WAA=Ogpn@sy#DSYEQ=o)mFBZmX+JpdC1(+pK(=d zHZ!`^Ha5e-a%R-Fv5Dbk!&`4^Y~fhaSg$BusZ-ZY8oy(zxJ+j*Eo_}J&=X&?N!o?I zX39#33f-zFm%7^0F^jr<~!`qN2PqEj!7N&Ey1p)c2W&@4fi;-flf2w zs(vxIN#D4wv}v)I72GndtXp;S9M7b=QG<1@Gi5oSIX{G*q6k=*?-o5%<{hKmwDvcO zWVs=px$ku8Fs7c4_w~f6j*0bhkgnq2cOtlGp<}osJ21rSzyV=ApYgAz-2EL`d#Vo{ z&{du7?_oZK%w6r~rOsL*=$BI0D^lx1EA4q%8tYcsujuP5W*em$j|w{v)zu=+GMO<( z?4-Y46v^hb)JIdP9laROGmNruX^i$jS!V3SV2}utYVWm@H|EvqAral!)YEBCqn7H| zv+EM(s2d^Z-oI>j*&d#{eo2#1(?XBiRQ+}l~Wyg$DYa0Ku-N=f1K>d9La0lIEEVM1$ zDcse14taR8xHU>M%=$X3o$0Cyg}8t7&3QT-cAd$a%%0ASb7r-k+C`q@{nmZ)f~fAV z902>5e%-#vX!0OH0(GrJy0phZJmdN;M7`%~m6qG8aP)l&WwOdc@CVbh ziq5UAN4de8i?YH_qI~W!d6Ou$m5E)13dPtN8zn`Kkf(87I9f(kj%gH4=ef2;npBat zNi?r;qXtK1nqY24IbNxYiZa5?sQ}|>G%pil*CLEAinYa;EgEObXpy=pYL_N*Q*ER3 z5nfU;DRqwSE%Ho?HZY-@esWA#G>Hc0lc}q_<|omj_r(;SnP`cACy^^y37u-Y8rE8(cmm^BL~ zlvi8{F&_7rFV}u41i!FJy%@p`@SDXDGVlY4i+rTr-M)pw#`uUI@m@801N{ddOGzUD literal 0 HcmV?d00001 diff --git a/gamma_age_v2/arnhide.uti b/gamma_age_v2/arnhide.uti new file mode 100644 index 0000000000000000000000000000000000000000..c4c66dbe05178f721a740462b06017a22fdcefee GIT binary patch literal 963 zcmY*X$xg#C5HqX7`qrJmprPL_U0k(mU5$79YN?js4}X8-U#xG(g~BM!EJ zfb~TW*2%d9?D}{aK3I5H_N;~?{2EYy4EXh-`Uc|I=bP}{$2)ET=Ri-gGSyaYrMi_T zrA~Dvk(CTbwOti`ohI)R-{?$GIg_eylF}wcUY|3MV##gtln55}^s^iE&-RNp&r%jZxeQA}YXyeXP zu~wopcOCF&8NQy+pfPRomn0VcAL=`3hI(t6ym^5$#zFhTG4+WawjipFPfwrANuF0hAb}MSkK3Z<2d> literal 0 HcmV?d00001 diff --git a/gamma_age_v2/array_example.ncs b/gamma_age_v2/array_example.ncs new file mode 100644 index 0000000000000000000000000000000000000000..62f9eab42b348ca584fd735b1059bc311401887d GIT binary patch literal 8346 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 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/array_example.nss b/gamma_age_v2/array_example.nss new file mode 100644 index 00000000..53f13f8f --- /dev/null +++ b/gamma_age_v2/array_example.nss @@ -0,0 +1,143 @@ +//#include "inc_array" +#include "nwnx_time" + +// nwnx_data also includes inc_array, so don't double dip. +#include "nwnx_data" + +void Log(string msg) +{ + WriteTimestampedLogEntry(msg); +} + +void TestArrayOnModule() +{ + + string array = "test"; + + // By default, temporary arrays are created on the module. + Array_PushBack_Str(array, "BItem1"); + Array_PushBack_Str(array, "AItem2"); + Array_PushBack_Str(array, "AItem3"); + Array_PushBack_Str(array, "BItem2"); + Array_Debug_Dump(array, "After first load"); + + int foo = Array_Find_Str(array, "AItem3"); + Log("Found element AItem3 at index = " + IntToString(foo)); + + Array_Set_Str(array, 2, "Suck it up..."); + Array_Debug_Dump(array, "After set 2 = 'Suck it up...'"); + + Array_Erase(array, 1); + Array_Debug_Dump(array, "After delete 1"); + + Array_PushBack_Str(array, "MItem1"); + Array_PushBack_Str(array, "QItem2"); + Array_PushBack_Str(array, "NItem3"); + Array_PushBack_Str(array, "KItem2"); + + Array_Debug_Dump(array, "After add more"); + Array_SortAscending(array); + + Array_Debug_Dump(array, "After sort"); + + Array_Shuffle(array); + Array_Debug_Dump(array, "After shuffle"); + + Log( (Array_Contains_Str(array, "NItem3")) ? "Passed.. found it" : "Failed.. should have found it" ); + Log( (Array_Contains_Str(array, "KItem2")) ? "Passed.. found it" : "Failed.. should have found it" ); + Log( (Array_Contains_Str(array, "xxxxxx")) ? "Failed.. not found" : "Passed.. should not exist" ); + + Array_Clear(array); + // Load up the array with 100 entries + int i; + + struct NWNX_Time_HighResTimestamp b; + b = NWNX_Time_GetHighResTimeStamp(); + Log("Start Time: " + IntToString(b.seconds) + "." + IntToString(b.microseconds)); + for (i=0; i<1000; i++) + { + Array_PushBack_Str(array, IntToString(d100()) + " xxx " + IntToString(i)); + } + b = NWNX_Time_GetHighResTimeStamp(); + Log("Loaded 1000: " + IntToString(b.seconds) + "." + IntToString(b.microseconds)); + Array_Shuffle(array); + b = NWNX_Time_GetHighResTimeStamp(); + Log("Shuffled 1000: " + IntToString(b.seconds) + "." + IntToString(b.microseconds)); + for (i=5; i<995; i++) + { + // Delete the third entry a bunch of times + Array_Erase(array, 3); + } + b = NWNX_Time_GetHighResTimeStamp(); + Log("Delete ~990: " + IntToString(b.seconds) + "." + IntToString(b.microseconds)); + Array_Debug_Dump(array, "After mass insert/delete"); + +} + +void TestArrayOnChicken() +{ + string array="chicken"; + // Let's create an array "on" our favorite creature: the deadly nw_chicken + // Note - arrays aren't really attached to the item, but the module, and they + // are tagged with the objects string representation. + object oCreature = CreateObject(OBJECT_TYPE_CREATURE, "nw_chicken", GetStartingLocation()); + if (!GetIsObjectValid(oCreature)) + { + Log("NWNX_Creature test: Failed to create creature"); + return; + } + + Array_PushBack_Str(array, "BItem1", oCreature); + Array_PushBack_Str(array, "AItem2", oCreature); + Array_PushBack_Str(array, "AItem3", oCreature); + Array_PushBack_Str(array, "BItem2", oCreature); + Array_Debug_Dump(array, "After Chicken array load", oCreature); + +} + +void TestNWNXArray() +{ + Log(""); + Log("Start NWNX_Data test."); + string array = "test2"; + + NWNX_Data_Array_PushBack_Str(GetModule(), array, "XItem1"); + NWNX_Data_Array_PushBack_Str(GetModule(), array, "ZItem2"); + NWNX_Data_Array_PushBack_Str(GetModule(), array, "ZItem3"); + NWNX_Data_Array_PushBack_Str(GetModule(), array, "XItem2"); + Array_Debug_Dump(array, "After first load"); + + int foo = NWNX_Data_Array_Find_Str(GetModule(), array, "ZItem3"); + Log("Found element AItem3 at index = " + IntToString(foo)); + + NWNX_Data_Array_Set_Str(GetModule(), array, 2, "Suck it up..."); + Array_Debug_Dump(array, "After set 2 = 'Suck it up...'"); + + NWNX_Data_Array_Erase(NWNX_DATA_TYPE_STRING, GetModule(), array, 1); + Array_Debug_Dump(array, "After delete 1"); + + NWNX_Data_Array_PushBack_Str(GetModule(), array, "MItem1"); + NWNX_Data_Array_PushBack_Str(GetModule(), array, "QItem2"); + NWNX_Data_Array_PushBack_Str(GetModule(), array, "NItem3"); + NWNX_Data_Array_PushBack_Str(GetModule(), array, "KItem2"); + + Array_Debug_Dump(array, "After add more"); + NWNX_Data_Array_SortAscending(NWNX_DATA_TYPE_STRING, GetModule(), array); + + Array_Debug_Dump(array, "After sort"); + +} + +// Uncomment and assign to some event click. +/* */ +void main() +{ + Log("Start"); + + TestArrayOnModule(); + + TestArrayOnChicken(); + + TestNWNXArray(); +} +/* */ diff --git a/gamma_age_v2/ashlw002.uti b/gamma_age_v2/ashlw002.uti new file mode 100644 index 0000000000000000000000000000000000000000..eab2c3bb384e52aa5a9273a1bbb07e4470967fdb GIT binary patch literal 713 zcmY*X+fKqj5MA$h!%O0u5BdR`f-&)d7c37nLDEo^N3)>=G`5s<*O-|2d489kQ?>*q zIh@()%$X%;Ux&fX+rxeHNh!4jbbw3X8V7P~Td6kq2iyh!f_K4x2vFH`%*4eWm^#!u z0nn}vUA_apayd0_fg^x3cK~C5N#%|M{d!12F@cDD|w31XeP9Dx;T=b((xj+}D|)(h)N*l7&t3dHJ2^ zAeOmJCW*w*)6?ak`}JqKn2K4|{M^{p0ZC-@RF+a@IkI~E5n-Wg3e$X}za7UL66?D; z;(r!~_o(6}k0lLtVH?XzSmX;SY$B$Y@Ft;7#aanEZotp84F9GYS2b;B>6hmp9KokKWr+w>R><2E8fQGNGw_95j)Sfl@S|^L#ush4VC(X3|6&NYiK*;~z0M BSA75g literal 0 HcmV?d00001 diff --git a/gamma_age_v2/ashlw003.uti b/gamma_age_v2/ashlw003.uti new file mode 100644 index 0000000000000000000000000000000000000000..837ac11270957f7d274172b3997c386c8ead059a GIT binary patch literal 713 zcmY*X+fKqj5MA$h!%O0u5BdR`0x|J{7c37nLDEo^N3)>=G`1{h*O-|2d489kQ?>*r zIh@()%$X%;Uq->rYwN!GsFd0Qy1*rHjRU#8tyBm64eo(|z`NjI1gPveX5wNGOdaZ- z0BBc-F5dxPxttoez!AWiJAkpjqH@Op@}@i299MeW!QecDdYkv)?yBdM4KC_n-tEl6 zmDM?t2Y`APKpPlIwoJ8^p%g=zD)pob39MxJR7T%SbeeogJkXh-(v@P8Crg`{MfsiQ zAeMzqrisMR)3eo}`}OBKpGmQ<`KGYz1Cq#^R8~@DIkI~49$}$t3RCm1zZ1v*BsO<* z#Q(?(-lK|V6H6NE+%{H~FgHudZ6ZZK;Y~uFinS7S-GFbh4F9GYS2bPC(@)Q9(VV(- zj(PPsHglRY7{7I*UVrR)4SG|qWkOT=IA|gt1Epv_=lOVO3g>Am&7_GmkfzZr#vd`f BSAGBh literal 0 HcmV?d00001 diff --git a/gamma_age_v2/ashto002.uti b/gamma_age_v2/ashto002.uti new file mode 100644 index 0000000000000000000000000000000000000000..a942a33ff4fb437dd92004d7cf8651bf400194cf GIT binary patch literal 713 zcmY*X%TB^T6dm9AL`~ee&=1f6ZZu(oC6OkG4WKT~gkGSrWk_e-nD}{qm!4Cm1a5MA z?%cVLY0iBehF5QQw~c$H)CSN7&VfrD$jwcqTHqgW2mA}(2LHi8Mb04|Z#!W2c>s<8 zq^o`JZ-Fno&mPyn0l=CYfVR7!V#Xf)*q`$)eDIgQ?CZVwbVNShqaD890;5qE!(dI6e9tV4zQmQnQxdisQ8wtFu`W zeC3w!DDBzAl14gr^+hDg&0KPqi0vkPNu*P8PQtb?2uzmYZ_092(RS)gt=6D8Rj(ZV zayeFgiqm`lXbn2Ums+h(ZHlpUC@PnOB61nnisG}L%R^CEPk|^VMWlcfjbhRM0d#Oz AmjD0& literal 0 HcmV?d00001 diff --git a/gamma_age_v2/attercop.utc b/gamma_age_v2/attercop.utc new file mode 100644 index 0000000000000000000000000000000000000000..f832eb41fe2bf435bee8bc55e59eab2be6aec4d8 GIT binary patch literal 4891 zcmeH~Npsvp6vsst2;l4i!V+-yK!Ri90D-W0JmX~&#~Egvgx&OL+O}eiG?9Ajm>t3r z_9b6{D$W!aJ_4LM@C9<<%r~Im|8I3qo;jpAP{k!(_1F7#tM%0L^wjfoX1d&ec4*+p zu^&k8;#_<6xE2!2uUOM+h( z{EFaL1w@19{HEZy1ivl#9l`GkeoyfGf-edFK=6lxKN9@0;LCzP5&WrR=JaQd z*TD8+U^VP2Xgipeng5MFl2--aI=-D<(dg?Is1M?Gw>qZ3y>5*6_<;wswS}?vX2-ma zJ`Tef{j7r?fv{y*e^0~mzU=dTX7lUdwY-MwU|SE7Id=ne!ZEfTyB~2G*m`UuZ+1*S zTOhvkY+DOskJ|*_0rvO0Q;gpw#{yTN>)d9Qn*%g*t=V6KVnK8WjO+W~pLAIvzi zJplRn{a}tWmOGt=33fq@DbMYOcyIC^!F(oud>@#NbM{**_<&=Y2caXb|Bz!opM!Sn zyJ4>3kmcg=Fbtm!H2~EeABGJb55i`S`J68~=6$X>9)kVe@ln{H96t*Ci{r;&e{=je z>{Z9dVE=IZ1ni%VpM+(uGmgh0Hu6)@9yiWhJLLEo@Sx*o!N(jAgNMOvC5XApXEp-u zaN}jLZ`Wi04qR`}zwsmIFqhf>OP__u8$NHu;s4J8=640!iFb`W3jGeTjX~}e494w9 zu}@Bbx&N+)_#eW3i+j`wh<-c|fTwl46Dy|rX@nAU4!QI?x2)%JsvYDG6F zbvjyQDhc(>^m0cB<2q?+Zg{TM=5>-9o+(-_%}k~uQ*9Ofiq69<>X;}^?7*~|b2AH5 zPLoBQ<;qW}<~8}M2V*MasVZZ{R*7`isc=Ef>7b%RwLBg5;@>bLxbRTXtl+LS#OqoIg!QcGpNsMp z{qnq8(Lbl+g*x)V4^Ao5%~V|SL7#|BEsYZ6y_CCIrW4Z}KBX@9m_9N++f0+LpB^kl zaV!UB5j)u*Pt(@uV&tNU?)H>hIdp{D<4Yf_D zy27lWVY6!jIck~+y6c}#rsxm9vN+%9=r}IXNzpGEgZOLYXwk2zHXa63*7c(tVQFHd z=#M6?IuqsEc@?K~UEyCX70;!ZkGIWOcivwwAByv5a-CK5Y?SDte>xe7Q@fzX0s=UR z+hZ+kW4Kaud+)O!!!HX<%_v6J+o5u-^4y=q^`jTMQD>%Vbh{X=saPAMd+$>@ZMX4! z?Y($FR2O<30PipRHj-k%_Qzs1=Q6y3v^7mv)e^z6*M&yfvopi`uhKc6#4LacnF zJCBvvB=P+;Y1uUK7ocCHi66k$7^dx}GV7g(Gzqc2^|@Z&L6Z1WnavQt6u4rB_-+^J zfhBvtY0`ArfuGYCnVB%tOPzdhaH!8mYd&h(SDMk{-w6L2)z6M>%w{3PHLVY$t}9+vzp^;zPxv}Z}*5AB3@LA#+n z&|YXCv>!SEu>@!7eGobXvBVyLSW>f;W(m#Gc?dcRu|#HR%#xU;FiT*TzASlJ>axUT zY0Hv!7%D*{(C5$>(3j9x(AUrebR#}Re7N0Lpizir2FnW{AC?qsj1@}?+LI9TY7#mH F{SBBz{B{5U literal 0 HcmV?d00001 diff --git a/gamma_age_v2/attercophide.uti b/gamma_age_v2/attercophide.uti new file mode 100644 index 0000000000000000000000000000000000000000..91d4bed2339df9652f56c53d6fee9d44dce46727 GIT binary patch literal 1106 zcmah}!A=xG5G{mN1OY`9QIx%SB>^wQ+q#4>378GL?!kCzW(t_tvoo3LJ-~^t^DFol zd~doNmy?yesp{(LSKXc0^JA2B$6t2$4@6`h_yu%=<~~Mj}~=m&2H@1AtNzfa{+CD-nA|_F2E4G3#gd!QQck{iCfSV16xtdG7Hguo2={@a#e3xw${qyaw2Z#@hB`;NLJ2 z>@9o-M9$A4CMR>Wc$bmWXaCR1x=ny*;Jv*A#=uC6${MF<+MMZy$T!ny;?ErKa}tR-M!2&~FF)MS

woc3HD$n#I(tJd-V(f+a?lB6e?D)!NV=6cnvM$n-h|1w>S^zo#UkzUi*HgJv u2VVm@sD3JjivI-c08~2_NhMO%8vs>I^-^I}7XJ$Gfe*koz=N=F?Ee=!6@`HS literal 0 HcmV?d00001 diff --git a/gamma_age_v2/autoclose_door.ncs b/gamma_age_v2/autoclose_door.ncs new file mode 100644 index 0000000000000000000000000000000000000000..1ef3e2f52aba8f9b12deb564b35d6a57e4a0f931 GIT binary patch literal 137 zcmeZs4ps;=)H85mU|{H!0}>1z3JgqaENmbqBjf-7|9>#BNHYNGKRN;+F(6=(1(Cum nEDj487+4t?PBAJlFoTr-VPFAr*_hB&iXutspsR(Lt-t^PRBRr3 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/autoclose_door.nss b/gamma_age_v2/autoclose_door.nss new file mode 100644 index 00000000..e1709032 --- /dev/null +++ b/gamma_age_v2/autoclose_door.nss @@ -0,0 +1,7 @@ +void main() +{ +object oDoor = OBJECT_SELF; +AssignCommand(oDoor, ActionWait(5.0f)); +AssignCommand(oDoor, ActionCloseDoor(oDoor)); +// AssignCommand(oDoor, ActionDoCommand(SetLocked(oDoor, TRUE))); +} diff --git a/gamma_age_v2/badder.utc b/gamma_age_v2/badder.utc new file mode 100644 index 0000000000000000000000000000000000000000..f77bad9b21b76d2d97e6cff9ca491cbe57f9009b GIT binary patch literal 6698 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 F{{T5XMZ?5|@X55ud=v z@D3lqJDiimyCx%@_{@wwcAU)lGU|7}zIna=UMY0~*aBVwA5Yff&jqCt_#2B#eaHA4 zBSPvg3_~^d0!d>?S9Pvnya=F-^86I|+a}H$8^C#hYa)Plx*n=M&VX}o+Sz)j>YW4U zS!rBPW4-Vk+}qE�iaE#`veL%|0lx;$^UE0e=Y2d!#)AJnt~j*kg=7{sf%&NP7zS_zJj> zuY$h=XwLwCBfigbz}pLu4*>7`C9n&OB%fy5Ni1b7`$~0nDSan7Qk6w^tTS^g$&Sti zku535g_$~ICsm$)Kaq(u`$q7gNBW>%*gSiwE)Jxe#d@}MGY4eoY$kQ7Dm-+0d^p60 z&7?tQ|C_&=B>$BN_vVt`QBm?7-ZqQe76V*~^k-S6K8w>?kgxn8KPc=}3TLE@4F80I z&cr$CZ#5sRXY(9?lmC2bX-_AK6ysEzNv=)SLFNbGdy@Utt)_JFtJQO;GhW+5&VH!p z&Ze@=8c@}v&at-^fJJ~h#{Oar_B8v3`b1r#9#Mx_lV_mbP-mzw%K-I+Izs)RZcs0% i6VwOl0`-78!2a(5?05D#`+Egg1=z>zU-m8gmG%#gT=*~m literal 0 HcmV?d00001 diff --git a/gamma_age_v2/badderhelm.uti b/gamma_age_v2/badderhelm.uti new file mode 100644 index 0000000000000000000000000000000000000000..f95d5673a599e6517966e560dc68d19d19dbc88f GIT binary patch literal 932 zcmY*Y%T63I5Hy5GAdo;H5Qz)Q2}MdI$OUmg39|<#TF{CG#32Wqb;FM0!7Gos*rTPT+OBrLJUca4m*wvDx333>N~sy32Ydt!0{W*}rGCMGf2Gtd{6F|P_-7bg zta(F{Y#yF-)`1lO?TUGFw5rdEbH*{S46x@XKwD^C+_4DG9@^{H#d%BM+(BbMIp5C3y@%x3d&f_S>2RSaVZ`@@uk8zh(>P&*RQ~4NAjNv<$g&L=4q@!+#H-ADtl7zh-{IHt zAEat`cC~J)T;0=8+x2sqp8xvtdGJ*!)d9x92f!d8-#=373Y;7$^#}Y9{22Tn1}bY_ z(1~^k=A2{TC4hGID*9+upQ6thL*O~Uo+&_kQc=0%DSYM*%{g6AJQD(A79SsJS; pb;^}eq@*cj%7xvOEIYZ3((D41BIU!4lpLi-iS+==l2W3CXb(!3dw2i< literal 0 HcmV?d00001 diff --git a/gamma_age_v2/badderhide.uti b/gamma_age_v2/badderhide.uti new file mode 100644 index 0000000000000000000000000000000000000000..fa7af0cb4559b3ea4e3c6786f44b250fee457db0 GIT binary patch literal 972 zcmY*Y$xg#C6g2z3?{MMF0SS;0S15-@0#wn!8Ml5wMAAfwdjRoyd<=g9GqGL5lO}KR z^E^A5JjBuA^&zSwqb8uehSwb9a z83F4n9;}md71;Oj8ho&DSN3d#BK#&$zYO@TMtvJG-x+NO;5?pj7vOu2B`Z>GT=iW{#zFVeN!jR|Mg!Q^N*rAn_F7Lvf?>{-R4HpjxOzqt8~h| zkkTen-6TAT&)@y^RCn03??spnKAbn!y);yqKk9TCa!~8cb8~{r|2lC0L0>M5LUifY zQ?XW}Yj+&*XBpm}&+u(}+88Nc6C(#GQsO~2l+#tcdf3Kt^ABjo{JO4%EHEN9f#4p;ee+B>m literal 0 HcmV?d00001 diff --git a/gamma_age_v2/baddershield.uti b/gamma_age_v2/baddershield.uti new file mode 100644 index 0000000000000000000000000000000000000000..c7608b60216f644b209c5797b5cea078867df607 GIT binary patch literal 739 zcmY*X%T5C^3=HpADUUNq{enuA3qoAzR*01fT6Ie=oI>Na5xY&b2^W5Z&*M|TlTE6v zC2Jhl9(y}}8>gMgZMSzPgxF#quwSxY@dNmiU$xMx3RN6!;GY`+FS; zI}0B3=N!a+E;ydBkEvW0($R?Qh-O0crKQwS8GD9iDhvHh>Q$D+$pP7ErB_ayr7yud zRkU<^rb#iMoX1v=$wF3hvg=%8tXn@g$ek&urt<0B$?0d#14B_(n2q{Jr8X#4id-=c_A(2gp9C% D{H$Qj literal 0 HcmV?d00001 diff --git a/gamma_age_v2/bamutan.utc b/gamma_age_v2/bamutan.utc new file mode 100644 index 0000000000000000000000000000000000000000..4d839f702e3b2f0ab15b46a6449a61afefb63f2d GIT binary patch literal 4747 zcmeH~*?JU36vqnzQ4EWMilP!WLD@9H9Wj%cECV5oGl96rnwd({q^Eo6u1SdE0&ckL zjrYEScYdFDK7lXb6Zi&R=>OkUH90(h+{pR9|J1KeRiCb^uC6|FVWvEIarpSq^Gd0+ z&~NLN`T^zD%}P~K4s26u&pM@!Y*%U!<=K0c8bSFF49%*{AJ{1f?!sOcd|L1;f=2|G z1dj@4>=3gecuerP;0eK#f;o>6=Zs*^H~6OnpA$SS_`Kkn;8z9L1vdoG2)-crqTpG< zuL*u#@Ed~P6#SOpw*|i=cuw%Ug0j7@QUCof>#Bff8u!q$^mTD^(gOv zc7a*m14)Bh;dNC55Zmwa%|`nI8b*(e9w7b z*7?5C!Z>(sxHtVWx-SB~TgLyyNBM`?(dlcdvXpcc*o_oNd&!A_n@Er4f*<$p80%^6uw%CV>nu{`#FY!W2TNn zoICjhq&@T5c0E6h@|tJf=SR=OD1Y{R66G(RpF#P%=Vwv=;rTg~e|qM3<>a4_z#V7HpNZ)msrzV5EK?|XY4{@XpkbC*V1vuh0E8O=V-%})7?`K{phkLM=81H0j$F`aI#t*M*5 zZjeaSb<3csZ{tyx+iBei&MAFURh7D3qcfef%-qas*Qg1Tv`yB(T-6p$l3KPntEHLE zbY!b-SFf17l|@|}rOYxg9=+fi{BJo;mQ9xH(4m^wIPJcT>lT};oIkA+QFO&jJNv>6@6qN*BcFKIW79gkeZTAVVC>033gb~>1oj-9KT zSd(SFuJuEhO4EQvhv~FtvQEWlyI9mm)As79m~+GG%wkM6-CEKMMpaBpug*mM^>0|Q zxQI|O%#zj&>$O$^VLUh0XCr20YgS&=YZcI}j+g4#55YODZ7m-i=$)oqz#JJmIMsYbE8Cb36t6N~Qa=aXs1!z^8Uqif>0#2~I- zvKH%aut#0JqC0pP+_JtNLwCmg`YwbEt7kVPTUUARG^~c+0i*O-ce?PeP z3%SWEWSet2CYv(LCN9T1&qFX=SJcJzuAM!dbL?_2>dsZI>9~t(IyTmt{`*=^ zJ00wweuPa;-RW7KFlXfdTYq#FIq;}HRJ1YQ3jcj2Gw&O9m-pjszcMt}HuH0fVFzsW zj;`A%p*`mgXknh)e7p8rAk@>OU2KAI0qSlO1P2bjR@!N5yTwOHlNJuI0bk3z*aD#` zE1rKC3PSPuhiVTGA43jt)1>L2y`L19gr5i=^&6m#5dS)G`dkkFMc@(7G;;uA`n(n5 z=U_X;6rZ1p9nemQDLhkmre0ijrszz~nUXUVX9~{Ln<@7ov=`b3?S~FP2O*};hoHj{ zQ)H&bN1&q+Q{dy!35cmKQ`{kF7&-|tg=Ol>l$EI}Q&gs=Oi4e5K7&4ozJk7mzJtDp zzJP8(UqW9)-$0Yl|7m@gCNrI28o~5o1S&yH6L@4-pfPA1nt-@I!MILUh~*jY{1*mo B`I*&%kp(20jB*s~V@?j;uSf6Oo~ImU*kN)XPDg zt1G`*@j)v?WZ$~HEgN6f^M0LvR@mH^C#9kJsh)<7@j3dU?WuL=u~FUma|g!6*Ukb} zAD(#4zfMpvCXHQvA%CwZE>JAj=9bZ-?bt_>!@4jx*4Dock#So$*80-AgOZ&@|12I) zCX1OrYf^Raq2H;_T#C>?R<}q#sI`jRtPuQv894tux4ot@ZNs`V?=9O8?SQ|k@b;pI z?=#bC;ccF4+h}eBEEJggG_oAEp>FjlgHg!gc&DqjZ1YnO16#~Qpck@nfOx4^fi-{w z#$h4@FA0Z)mx7mpmw;>>`j@~ffSqtKIglLgO@PD9A?BcQ!1!}`3Ooaz11|v9P4)i* DqGyJP literal 0 HcmV?d00001 diff --git a/gamma_age_v2/banded_lg.uti b/gamma_age_v2/banded_lg.uti new file mode 100644 index 0000000000000000000000000000000000000000..50609aa0552f2eef734a450e11b3fbb7c8da9f44 GIT binary patch literal 1754 zcmZ8h+iuf95M7|L?##M{KGowe)@Qu!7>fCoN< z2cG#MILFzIw;t(u&g|^&jMwY)rPprkzhB?{D1?8t40cu(q3Xg%hk@h38z_HNbK9%X+jMfa5p8T~D_>zTolO;BNrh9l-T* z7u@x551jRA_W{QrfV)}`J^l#X*<(lGp8&4sryg&BJ6i-{ZQ2sRccwi9)=DPCvd34z zKiKi-@a&oWy|80E^OwLUfczD}Z$@)>f#a*?$n?QFd*UB2y? zS7X^PuxBWPV8r=+5TWVnQ} z)y+y#s7%c=+1QnFvepQAv#Dd$X{S5fi2s<=ZffUjOHL|#CE*`Tg`NZE0jeIAiL1Ga ze<_uX%1TA0s!%0Zk&4NFsE`W)6_H9v6{7M{@u+lEI4TuZYXFM?-;WBl46FcD bA}SD7g6cp8qViC2s5Dd2N76djhb@05K@OUu?$Xv)4fsVX9+Rpf*|A(csd+gPXh?`HmvdwvUe1CZYa?7Hk3;rkiD8t2Il5n8)9jLiW) z@VA_HUH>zu{dWJFlQrK1c>Z|S?gJlymPGwfr{YQC$%axDok%T}2%*gCrlZ5)llZGT z;y<<|Nhc2aX<&L;oPN!hUK(r!f(>cu&EdfOS?%h0Q<9x`Rgl~Tfd6$(cOt+zv=Hpm0FQhhfX~6op>WQeTmaR zl6t_Cko(*D@lwq}JKgTvuaEpVFD=~;?Hl@QIviLZpH@e_1acetMGu_6UPl)DebHQw zYUohXRBB6k|Eh^1oZj5SztP4niN79+Pnnr17ZO3)tYp#BiVnir(u(-OAhI`&RT8G+ zUuJI~{%u84_R7j7p?L5zpEDz%)S7q*%TLUI7$KiX=scqDV2M2vYngCKM4a e2AiZ7fCs=sfFk@D;D!AZcm_NNUI1LLyY}Bq#v0`S literal 0 HcmV?d00001 diff --git a/gamma_age_v2/banded_med_a.uti b/gamma_age_v2/banded_med_a.uti new file mode 100644 index 0000000000000000000000000000000000000000..86c7bfd906267c11910eac705376e37a765b3d77 GIT binary patch literal 2017 zcmb_d*=`d-5F8-kz6tl`goG<0kc0aOv7;!KoXA?6hzF!-?487`?0T%-HB$H@K7=3O zfp;{eCh z0UAoljB(ESkqKZ&drg+_7&zykaXgLv-8wk8^x^zsr$N}4b_Nj6dS(1Mho1+Rnl3ne z%;6Wo9|N>YfYf>!Txz%iPM>xa5Pl6@_V&8NZ-9&46oU2^AT{51cmZ5&97OU@IQ$Oy zOx|hI;ZxvJ=iQuhZ|(s!9>IO!ea;`CmHu)^*k>9L<2>0VLizu zoZY|XWa&Ixo+YCMy8W?QMEPE0v95ki?&Y*UB97vpc}$l%M0Nt$uc zNdw!?;`GbDX{W(INJ0P{xhNhP)`&>(PbGL>G^G?;! z?(4to`}T-9;9<*izz8u*nV->bEPwi_Sz>#bm?H5l&=`Bf8s z4w6BZ$j?x z<=0Eqx{Y+NBd3r2xG#0x2;~d?O&xZ{$IuiZ4uosQ95j;iX=q^T*d zAE*XC-0yKqYdVU}h6wYE6FRbezoGGjuKj=pC)`*rc8UJVU{!qi+ zwCtCaOhN(SgE9h)0{o*>NSS~S1pllQbSB{gK;fsTaZ(CAg`IVc0TgfwH${^|O@XE` zQ;;dd6krN31-Af<0}}w(ISEVw6iy1}Ti_i)!K6@9cqoh%L<%7Vkb*)X;bO2&Y5`aT Yo&wK+=Kvq=m%uCFHSh-Ddfm1E0f__~{r~^~ literal 0 HcmV?d00001 diff --git a/gamma_age_v2/banded_sm.uti b/gamma_age_v2/banded_sm.uti new file mode 100644 index 0000000000000000000000000000000000000000..825fcdaa6a40d7fabaaea5f9fd31c71035450573 GIT binary patch literal 1754 zcmZ8h+invv5H-+pr`*c@(zLYPS_&-^;*lm*MWnQfHlc5*aeiTBS1=_#{@B;z;uUR2_@N?&d_znLT z{v!N87@T;`2ka+s0l31z8J3DOzzyIk!2K^feh&Vf<1_Hv0CQZ!9%v|48uQ%y&p0gW zlXAaH0Bg{=p2qoMAFS=?T;l|1bMTx?yAF8Hep!!p6Y%^NxbNw9z~=*g2mB2{y9@X} z?t%Lr?t`-)?E&EVLvUZ~QNSOAdwb#u{8Pa9yb$mjxVJ?R)}}21d}rD-V69|AEC+lA z{DT{R4$q$1-wQX!Gk*zu0?1zh{FXF-7dXCJj*K6yQ(hK$e>Tjl12GBgEx>!lZ^(P` z73iuo)6%L)6_Gj=qAm;7v?@iaw3g{hoqSjEo=g=+wpG#3lguV&SmqfwV>PtNVWLo| zE04wt-Lo-}`H?CnV+~W-NdVHZMyv5w<#5N!{&5Ed-K4fQr{-_P@u@As+Fa5YItTlfKHT^{uHG{hN^v@>6m2Sq|fH|EV}KJsf&VNjp&aM#E^6;}BiE z>Ei~z$6%7hc{845h1gYA>L6dnLB5@vOyxFFMJwS=aPf(|UZOMV*^|tFee93>(v>~! zM;Px*J@PR=txPGR&c<;y1NU#(S6f-8Bwt6grB>Fe=C+&PFlmb0>mq1f52vK!gCbqR z*y?7bC{(6;nXK)~M6cC4snnV}MxFM$!;ScldF`flPPXKvvR4xR!ThUdfLVa5M`hw_ zuHs)xWuvlEQK>3a309kbzd{jIt9TkqsMn$8NQNe1!BEa{fLM;O; c0F{UeM3taAP=TmCR2(V|6^6<}MPdKMe?8I;p#T5? literal 0 HcmV?d00001 diff --git a/gamma_age_v2/banded_st.uti b/gamma_age_v2/banded_st.uti new file mode 100644 index 0000000000000000000000000000000000000000..ba6daad12e4543045745a514212a43ccaa843afb GIT binary patch literal 1882 zcmbVN*=`dt6gAMY@05K@OUu?$Xv_9Uld2+8T1Au4Cs5^N+-B67cr@c6l`rB$c;GYm z5F|KfVrSeDPh9Ebp6hF0Upvmpr*5;hv$nkYUI=jl_zaN$J}$%x{P~kY^x%i^zu>n| zVGRBc3{E`f2kbk5RAE0XKWAgQY2X-e8Q^-97iTT!zOO8wg5Lm`X^()Vf(bG2 z@dfa=cKk6sduD%6>=^I-DewUxe+D>n?}FotZV;aP6b}d9-3`;rKnVP+CdX+1Ta#;F z0(>ic7kq19fUZi?SQ-_mJWzW=)Mc)kMkPoU*3x|$N8ePqEfa;24VCw^C^eBD7J0_a zPz_DA7b!H~mHXp`_OmgN*}lprV-1~~NdVF@I#%OS#c;>S{y_&D+DYwLADO=%hDS>H zdvi%+l;!Nh*?N}ftSvLM8*FNnD&tlq4myKq=;y0(cM$Cl%Jo4dZmalfl$ZIg&T{S5 ztE(6%Df8Q^f8fW#CURcBRf&Uo)K_V_zEz3QzaGV2z7hu?hTaOo{2%|K-< z4IS$YmuTZv7dP;I3?^CJH{(fGh%IGg?B$Et%eOO~s?0CRioOy1E^|LGb#?%i>gJnqDoOos31HHu1Kr_uYorJ&*jed7y9cH Awg3PC literal 0 HcmV?d00001 diff --git a/gamma_age_v2/barxyn.utc b/gamma_age_v2/barxyn.utc new file mode 100644 index 0000000000000000000000000000000000000000..ada50cd446894b2b9dbbf814e384a8c312dda5c0 GIT binary patch literal 6921 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 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/bigoon.utc b/gamma_age_v2/bigoon.utc new file mode 100644 index 0000000000000000000000000000000000000000..78ac9d14ad56a8917a84a0dcd9846aef7dc969ba GIT binary patch literal 4833 zcmeH~*>W326owm;uqKWnVPCQ@5R(`uVGR&ji><_Qgk;C;q9wKLiAOWaOv{d06CeruDJ8u(ZdtZDWzti zKQ<`!Bif(uQfeCQ*jAM z{cU+T``s@1KEd}3en9Ypf*%5(f_SZmp{s7-N5Eqc?NP{&^%$7*pgj)x9PI$}K4?23 z#+ggz*ynV&i!=9oAm)m^SMWYC_X^|tAsYEWMmZmJ%;pJb!ud}+=K37UV&er~+usL6 zPeEK8>M+E2ANdGm9FL>rGs*bV&=tqL&NatJ(f;K47}{SQb6@=C_!+dnJAM}JpN{$M z`OES1X!&8`wO)Wmuu-@dUW91m6VP54e+fM1_+{|8<5$4P9G?WA0MiN(_dM5T658S7 zMXva=z@qb@;zN<^nE<9^||CAwqH#R^Oh|e^i_bF%(j`7Ur z*K-*>XL|imTT?e_-E@_z>$bruL#qTyYG-xN2WRwkt}68VMkhLIo95hF->4}Qbxblm zUDcLM6kGP>R*Msx=)hJxxnDAAI|=$Wh*{}iK6)|laKFVkS}{qg{Q=dqCYM%KbemmO z=7LrVQl0d4D|8oZ3|fi2rIHCO>ltqgLA01QXANr~+MEtT;i^VFh&l~pD?vVDEsXiv z9$Gc6_IkJ{9p<5GWKEI``qoWhCXPL32h7Gblk`eP+ojB(j5}+S;+`8;Cl+(6>GrZ- zG^%9UdTlNk=D%S@axp^5uu@w$qjXLlEg%I7(Syf4w+*lrrV06fj?ZW24N@zUF1&sQ*qoWuLLfes9p4G zcMxKhu?^Z74-|$bS~Qp>(xi&@Lg)M-9o{6e+cw#Ds%spj8rkle#vZjTB;EOEqgjrJ zyUhC=eG`TS4wCx?YmtA0J(~L^-NRyV%Q`}K)B7@0+2ek8rjMlVh@JEq%Q z@~b}L0{wh*`2Liu-o^`UtLxWp*}We}oowO#3GnlU_W``@+HtR??G`se9JTSn+U&fv zk7f5=Nw(&GDj14u?%e?v98>n=#!<_yH*RP&T5Sfl*-p%AKkbi?AOBZit2|(2(hSUF?|RcgIF{lhK@kI0T#s*&{60Z z#G;qQE{j|iw=8N|%(94O@yeo=#VU)`lTZPggua2kg{C3yuA4c@i=z^9QHClIiv*va TD%czIbqeAhIt|T0XP|!og*fyB literal 0 HcmV?d00001 diff --git a/gamma_age_v2/blaash.utc b/gamma_age_v2/blaash.utc new file mode 100644 index 0000000000000000000000000000000000000000..239b0102c1fc4efcb029ba4275938ca3974c421d GIT binary patch literal 5662 zcmeI0Tbmq38OI9(cnTp(R8*7>Bp78`API_!$n4A>1~$9H%p~!EE;Z9NGtG8)O}cA# zvz|bdgNmr2;sNjk>XjFM06&A*df|m%!AqY<|Nri)**7Q7fI^}vlvJ$aQSIO@wdza2J&U0WwrdY$L++zx>KycN0^dOP$s=r4Gd<1+tO-%pqapXD>YSY7X# zZ4W_zLk0N;=et6=VhPeC;D{SeO#`P0w| z&kukXJbwnvbHX+cLXU!J4TyIf-`NuMNAyo?*2#b6u-`7XedzYh+WRS7_8cy!&ns;% z|D9g()&JI4+}|zexIcr-V2^6WJO4_XH}?r6~;9cyaq*uoV$aqYOy zw@f)KlBr89Z&l1kkLwEmw`uboQh(Res6FdrM-?J*NwYId$}KTaS%unW5h6Cv*SzoNz9BXc>O_ z?i>8Ip8;V$m*meU{L0?9=0xvjK<9P3-Nk+gg&W$<3Y|8B)7KK$u}SViFU?s|nB2{a z&*+PDW*>za4QxIO&DCy_rm|oJ-^u){wej*!;=QTVy51elQq0o2WQhJiX=?JZ!6e}( z)$BIn$7khyk?`)&RNJYm(Mt8I-L-~2>IQJS&u``%><_D~>w8m^rVVyd=Nrz!{|0-s z&bM@im%%OT^GOM}3{X<%m-D#Gjj~^_Q#+oC{`GGCUh4KZZLaDr^f%uRb^Y1W6fHAK za#QCw^QF{Q6Y6clf$JC^bD^!^Ns*nO=TL@~4I6_b#jdZ4nyD_!P>JW4FU*qZR@<4Z zF6`*kIA`YPscEwe@3$I@f8f>ac?M8d zNAROF(NGt8vSSN7L+iGS#;M&cqd}33CobKKc5xd%8RPD6~k7;Q1i zVsyo*iqRCKC`M0=niwrHN_r4#Kugefq35CRK`%hxhkgM45PA`M3HlNAW9TQ)%g|4u zpFux|egVA#y$Zbs{Sx{W^lRuh&~KsFp*Nu4LBEIApsS#(q5pUPH{pX8v<$64s}TJY cjQg++Jp?@rtwU#^4QLbUK#xH5XBVRV2R(R>SO5S3 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/blight.utc b/gamma_age_v2/blight.utc new file mode 100644 index 0000000000000000000000000000000000000000..d8ce2d5434ac87efac7d59ab4e10349fc72e3292 GIT binary patch literal 5499 zcmeH~%aFic3!p<@&NNn%CQpynM@ozfPs)$Bh7e}jK^Xm$00z5lDZ^Srq!i% zmqs%@Lm(kQ9=xA_0ZVplS@AEhV9$aqvtkpzue(~lK8F*$VdpyMQ~m1ERkv?fmFiyV zHTAP+mQSBmN_`nRa6qX)Ab;XErJh0l&h1LQcY{*@x>KpMA5iMV-AX-&{5>Qzt0sSt zn4`K(Ey1gT*94yzye_yc_-Vnkr5=An@CCt}f-eg02FbiW`xWj|n~*8QWEz0y9_Vl=>|)6wBY=E%*lY`^dMkNhJ2Y z2|5gMjG8&;@mR;XpW+YF!73~BLy_y}_5d8`X6Q4}t zl{&&kB=$WD9YhB*jwW>rm}cAoF_Ax5Qe``iEwvX1x+~T*!!fo<_bf=M4+;LT;A4V6 z0_L9QTpxvAj{|=UOq-ZK4)GnBJ^|JB_k!t9ru!hi2a|^AU;6TR%#o@4`Gdr^6VMZp zPYQkj%rlF99)y_4pDd~3haxlkl;BTC=J$EHxx28G|=H9LQ@Em4(zdqc{O#iJ9 z&$@Mp=Qz*IHpFwA=iAfJKQK|v{}lW#xMwHR)C9X_i!D1;YRe2P9$BO{mlt8vOzO%F zb5&6_rc-NjlMU>4Z+~jld7CAcm!gJIIqBaaxhW(I6()9*|zSD1Wa`e~f7JL~82m0H$?`kS!-WtWYL?M=(O z7*o%K@_Fx*)m<08snmv<4`(T?^uY}<9w<$1HnK1hZc@#yM)KmUSiB^>JFw+) z+A`>+y5;Ix#~KZNI6amxW}6%jZ&|f>r#4L+9Hc5YLV*7*)@W63nF&4ymuxJ%0&eM} zrYf&y$rcyNm3EW*(M*hQ=GAwp`eV0+a=3cD#d@gPFBLX#*`dp9Rlb<5q`ow$y8{Pq zV0zfXw1y`|aj~E4I=tDS(RV3UeOc8^O;Oa1cz*SznVW96gPl~B9h2G+>|#GP{bYjg zTh7HFcy(t{0C0X;ENqz5L?+^*04tk83; zEt}}M&nKwQ^w{iLZOUq0Oi|&7dN$R;>&H%2V-(A}9rVQP>%JZMiPbLKb%n!0q)ots zX}Y9Mh9PkvY8P}d_kLRF#LqK5%>6`%vDL-SzV;bLb)nGH-0m-xG~^+SVYnzUt@Hi~U zZGly6vOp*1CUNBvzof@7r}9+cGdG9>!@E~LF+XXU?$|rMo!H?vo~gF?(O5C9PJz0; z;PxJ1(cK=~D{F01mwlF$JG_1XLp=>0 zhwg_?KqsLGpa&s_Y7apS%@~qB3@t$ny_TUzA%<8Ctr$|BfgXn#Ix%EosKgM7p%FtO zhC&R182T{eDMKCP4QK^=19}sB3wj&+8T51L7tk-EUqQcyegpA(blq>2-G@$nY*1ipZs(bE3-vs-B!63Zrdw_GPIh%3_)QhmvgC}V*R{wPY#Tc%dPlUb$I0T^w$Uj!=|ClpY6X)(`PN3vsuz#mKDzt zm9iNVk(zKA-eQ=E6&N_${z>)vkb2nJbaspHS>EnF-}eq{M}tsi*)MM*-j7X<{!|s z`E~s^?uw1cF>;2S-vn9!xlKB=nml4<{5Qx^a+ACyZ^##Nl3a`&JcLcIkz?#n{0Cb{ BeZK$z literal 0 HcmV?d00001 diff --git a/gamma_age_v2/blightbuffet.uti b/gamma_age_v2/blightbuffet.uti new file mode 100644 index 0000000000000000000000000000000000000000..057ac5dab62d6a14f03791f5a30946d4721bfc82 GIT binary patch literal 978 zcmY*Y%WfJm6g3Sreb6>-NFR$zd;#iXQ)S0PNsu5yKv{HWm^(14hZ)V7MWTLT*Zq+G zL37U7rf{V*_u=bvZFBfOAGQ}?J72yjr5*tj-~;fh=6v%+sUOH=_z3fb8vR(;rw7P5wQNsgLQJA0b?J(h7ZQOo&)TmCoio9RF46F!GgE9@O(4cJAiM@ zGrk8Fz+BSYXe(1GrxGjG)1?fpq*$tKl&!Q$?j^d_sh~2Da#bX`O|osZ&U_fj)+TWx z7&O;wx6yz58(plW+}HY9Y4-_&nazwis;WG*di8ULfxc;CvZMZP6dh3<&gPc>t|)nq zVB;(jGtq_p>?)HY%cZc1l%s?v@%f##&a=b{U@Zp2y{4%~6TpQd;{pW*jhnqSs)oaV z!C_2QxJK6(=&3X+hsv)54S))#vbmp1raGuxa!{#MDAh^zP&HI06&aM+LQKU`Y2+s! E0C>273IG5A literal 0 HcmV?d00001 diff --git a/gamma_age_v2/blighthide.uti b/gamma_age_v2/blighthide.uti new file mode 100644 index 0000000000000000000000000000000000000000..d5017d0ead9edd75480e0ee6cca30de882111c4e GIT binary patch literal 1228 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 WcmzBK_@jObJOiEsF97b>-TNO9aT;O( literal 0 HcmV?d00001 diff --git a/gamma_age_v2/bplate_med002.uti b/gamma_age_v2/bplate_med002.uti new file mode 100644 index 0000000000000000000000000000000000000000..258453eb08bf2b63eca971d301278b86a0539f52 GIT binary patch literal 2007 zcmb_d*=`dt6g5lPcgnt{rDZ9lv?=?Zq^gLNR?#H%1*FKyxXq|DaWpeQDj&i(@F7S% z@DqFp5}Y%!Gj7Ba;!0=kxxV(b$KyGE->eokmKTaog%JCJF7O8UxKD^B`0#)bE%+bs zzu>$Uw(JN%5(=d8mg z!TCP4bHJsH331+dx(k3^!$ojA7yDX%+2L0leihu>HA~>H1GeT3hZn%DO@Y`x)8O{o z-2}I5o&mROm<6|X3xs32H@8hA_xuj<79hV1*!uR2u>BrjZ5|{$MDX`*Bm4s31AnV& z*YiJX+Vk|UHM#T$0QZn*Z4vkYG*#3OWvV=tcxqFKvP@JpRS{B|)pSRO!Dr>K%SfSR zMJ1g$=%<11WqHO`U-i;pGf>!&rra71G|x&`##<^GwN-SIjslQIszWs_l{Gg~+1YMj zLer@p>RtUyzQ3!4J2!_^264i5SS!Vmj_Wc`Ti&WhsXVTY#a^Qu^xXV--0TKh-F&<^ z7S~nyDM<2sQ^$#R>XlW9H_7wssh5=;X&@@15-V zZvC;?(`{^eP06&Y;-!iXb&O3kanZ&Ve2?xZi~VLi%0mBCDnloq#ZJB+>%NN9Kqa++ zC&9!!=6H$5pq=jY?bkos3kQ+_arDC+jIaXEjq zydHwgC^?i3N*JYL0^sk>Uz4MGEpQ~S0m?t+oN`Yoqr6krDd$|wBtY4wTvMhg&y;1# zF=d$YOWCE|Qf3Rl6fh0&&$_?d^GD!KO>`_K2AKZ29jaUXA Z0=yC*15W^6)z5(Ezzg6d!1s0E{SPEm8rlE= literal 0 HcmV?d00001 diff --git a/gamma_age_v2/brutorz.utc b/gamma_age_v2/brutorz.utc new file mode 100644 index 0000000000000000000000000000000000000000..ef48e55c5a65c4527966aa77f0897ca091246153 GIT binary patch literal 5640 zcmeH~YnL2F8OKW!KusVhsCYpuAwVL_vTX1QYG!BlGO*cD-{1iyk`!T0+AcUR9oynp_3<-`U{>rr<8h@>3fu#oKPygSE=56l=|C!N?phEKQI)lE`MNrBD=Pp z;8nqEg4YFa2<{7hMlgM8+usy?Mevs3tAYoDImWh~ZNWpqJA$tXeopYN;Om0FCiv@u zzajW}!QT}8Ex~(&zb)7Z9tn;F$AYckeZgbF6Tyk#7X(iQr-C!VxnL)FCiq3ch2T=K z7hDNG5PT^3hTtQ?HwAx3@OK5jB=~!Rzc2V@!LJDZf#4qs{*mBU1-~Zvb-`~4{;}Yn z1m=AGX<#f*bs8Bb@Fd?a_`Kkyz_+2!(_lW;Wu^Xv2a-y?tkj{@LvNz z0sed7W$-@&UjqL#@RQ(w1^x{9-+@01z75W^ea@FNf%$!UAn+H!3xU4~ehSRF@DxNN zKMip`kiP^i1pYFZYlHb;f%r`$Uxqfpv<}3*jPGv++C=-bZu59Y#!%j|PN?#(+oX@Q zck4q_`&Rv1arpn316(sb=q%PCc@=sMqH&)KOH-|b`3?AA*5Q7*0dcS9R?vs&1NSI? z2L{M&`FZe;&1R|bcH5TQc3-J&6IoQ7+gehTe#>NS=B9aDQgvoCYYLM`c5mlsX4SgQ zW6Q%*u))OU&aUJlKZxmZdDXE_w(#4=Ej`aMq&3yF0b0^>M%)DnX!-9$@IE&@#;YmqKWUB zIoz*OcKV+I(!`B*LV++nxA@s+ zrao4iubXSzo6m=){90*?p50G!+oZ4NE2*m;8cq?wO>_@mXlwYVNY2-Dn}?A_ol%lv z*4J6x)Rbjgi2tv?SS7Q)zPDMEIWVd9-pHm&^;^&9_K(qz{D&1{T_)fsn=ipsm9JDBeu8np&*Q!#lyRKx*h);9#FiXmVKY-qv6UTZGsX_6v0OvT zqbi;13r{R9Eon?iH!e(8UTm7i3e^*H0N)E6xp7|mR67{CY-D`h9Rd^4xvD@{k;!#z z(}eE;D=W|WTBb=fEj2nc`XGrCS7DI5d{z4))EG}4$iu`>;41xY+MW*uLuew)ZHH|l zFj!h}&6H?1!r?f>FJ*HIa3YtP> zCT+69kl}LMuFFSZGr@pPh4sW>OXgU)ws>|q0iA?yhwgwF7T&>lH|D*A=Lw!ScyHuc zgXe!PLf&n8r@a@t58~aGcUG=l-cfls<(-swQQkp$_vD?EcTEkQh0Z|_Lg%4}pogJH zpbHT1hP)F#3N1jq`z=C`L%iehZpS;_CFn_rcQ@YIcvs^cjd!#9PKGD%V7zWt`Xj`1*sT~gG3+81J!lo;8F?LQ c4|KlmB=9syEs z`GfclJOy5|@Noc!jQR$&0qTiy`eT6KH}Vh26M*p%2ygs^ zJOZYYmzlOQk!m7yrLJ`)11mX}>KGQW&eDw}KXoqX^rebTTH3T&)$6PWiL7ioPX&Xf zdf^WG-`*c>7E*0{y`r+)0!d_xOq^8Rj;xNC5eE8AgMvZdr;pZaougWzcumfqtIj>-h?vnVGdM%x0O!%QJNEu6Ev{hpydn=LgoC|AA&s z-}!yq7PM(I+J?4o0S5r>O(DZ^CG8k&c!HdEqs^#KJOHy! Be}Mo1 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/buggem.utc b/gamma_age_v2/buggem.utc new file mode 100644 index 0000000000000000000000000000000000000000..e9ea8b0757dcf26c4db7a1f009159577b6a52228 GIT binary patch literal 5118 zcmeH~S$7mg6vswMT-^Ahf=>w^6Fe@sEcmow-me?8B6w2pl;AUhrv*PP_!+^^3Vu%TS;5Z> zenIez;1>mJ!BxRE!F9n#a6@oY@T_1@@HxSAf_=d)!GYjVa9i+s!I9uta3Z)PcwX>= z;6=epf?pE+vfx()zbg1O!LJLxAovZzZwh`(@Y{kf3VuiMyMiwXeoyfGmYJg;SjOwA zdf-@wlDtXqcFQ-z-w$S~29)|51*%G2Q0g1U@O<0lo7H!gSD}=~^KOB9Adcsl*YC4F z&g0Sw9ALIc%axg{d!B~@IL@um5$Ja4HYf-2x~!jsXl@?7CeKOdk8(9cW8XE@gn(^CpV5>rjfz zaw$j)GouFPZ zNzuzjEc+op7hNmGrB(~~r2WiQ3KA1VopxfUFdBvq(+*={*+i{^(aCID9}MeDgW{em ziH;J?sjO>rx@lCw)b!G%*NuNA5y8a>1+$o4*d7tDYwDQKHT7wayVt9hpVe0@plR*T zO&}kfb4(|lNc%Y#^bs#9hhC7lQSzNAGC|UHpVEt6<`|J_RKuX-x~m1x_obtO*va~E z7}kg8JsVBzne;-V<71X#;?*!7$oEaqG?*m9r1BHF`ngWry-7s3X3}(;(CDQqX?Beu zN0TaoZtLU07{|k1X6==>@%O(<&f{Ajq zUHf6PBgWSY*>lPI<84dQ;oNxLe8}3TViOfi!wXDS9}fooFr83k4gnm+dN~%j$I?pA3ERh+B2oZv@&N|`zA?D_kGHTtrnhddMzFh)wym3 z!0XF;8cE?u>qTETZ3d+EJQfiXjhcDmr}Gj0v-zr$vI#yOY&8BH_yUX8t ztYDcN$HBCP8*16YW^QcgBd>(Ao~)(TyLfP>ZW=SQE=$%}M>|U<*B&!VYMA?4+pcYz zxOy1W(?oG6pq?d)b6|0-g{`ViR@)K6poRsm$JXLD(!@1IX^yz5U?}E@t9Fnen6eu; z45~Iia6`Sp!i<;9)FQLcj@$kHNB-tmD|_@G5FI=u0?uGq7+QXb_;pzht$-Ljeq|U? z{ta=b$*)Wg#J`<25O=722>gp!2d#%TKpP=GHvXOPuY`Xi{Ce^4gMS_T+u&aY{}i@B zeb82D8?+tT0qul#LAxRT4e&2u540EJZhs%NAL6c_yLs;74?%|^-V}G~+?{h*&fPe7 z;oN<5*UjBFciHLg8f6X|gg%5mfb%7 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/bulo.utc b/gamma_age_v2/bulo.utc new file mode 100644 index 0000000000000000000000000000000000000000..f03017b4989fa8467616d9cb6109179d8beb3f20 GIT binary patch literal 4830 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 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/bulohide.uti b/gamma_age_v2/bulohide.uti new file mode 100644 index 0000000000000000000000000000000000000000..a466d0a0f549b64418ce1e3c7faad9bc5ae72187 GIT binary patch literal 1478 zcmb`H$!^p@5QYm#2zvsAeVed`Ex-gMPDsh*5Tg){GDB`0dd8K+iaoaMo8biXYcCo7F=1ZEcx+Q;WU6R$AD-28@nPW3613-5qQC+Z}A^Cbi@A!2E?UJm8|f zHR-HJlx!@~#0Cleom zMT|9;G01B6ug_tdlQ_q_qyuITD{l;p1HKZhO0K12W(2FBRnKZ?maxL-!E3-OVO2Bx zSjE$TRm*B+Rxz6x@O5wl+yuA4ZEy!Pzznzx?t%N@0pM%)2+V@V;0bsNo`L6J4!i&_ N0WY};82`V{^cNkLj&1+| literal 0 HcmV?d00001 diff --git a/gamma_age_v2/calthen.utc b/gamma_age_v2/calthen.utc new file mode 100644 index 0000000000000000000000000000000000000000..665581cb31928ae9eef9559cd21b9e8c301ecfe4 GIT binary patch literal 5109 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 Gi7x=*kfHwo literal 0 HcmV?d00001 diff --git a/gamma_age_v2/carrinhide.uti b/gamma_age_v2/carrinhide.uti new file mode 100644 index 0000000000000000000000000000000000000000..c16d5633d9301760edb31f01d4251f70c8134a73 GIT binary patch literal 972 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 Z;1qBwSOHE0rvu)D0l<5(5@=8czXKtuXG#D7 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/chain_sht_lg.uti b/gamma_age_v2/chain_sht_lg.uti new file mode 100644 index 0000000000000000000000000000000000000000..262b013ce96e6d88c638495b1d989886cf946b7f GIT binary patch literal 1752 zcmZ8h+iuh_5H-+pE%$Q2ZA;6w6xzP<2JKde6`@*Xm%i{&+{E2PP2wo=B9(9919;#w z_yGP0&Pn2pyCa><9FIMoIL`Sp>~(fGR@dJOAx;8)U=8>QLjQYKh;Q(7r-k?f{}=u& z{683+c)TR^~bqAdbEN7`e+j)$<9S?3wTXv>K_`JVX2*;QHqPzZuQm1&+V0M(W23TyU)0z;MNi8RVrrLPWz*pj8{8I>YcnWqDp#6MKHBU6QuZB+(EoSRr@Ri3;Ts?5X( zvBE|}IjR>n&u%1(kt!!+U0s?9K`<~nQFWxGvq*K(mxbB$KWLO{xi`iAK@?|hewq)Xcoenk{VCp8$@jQy^Fv*f+Nrmt61+*9 z-%-J#%l!|?IeBl2`&)6K@^-y9#nHbWCr*Bf`yXW%y7i~HulI52o{}a~#adSThTrV*g@0+9Cetp!(eHqIA z#Ey{f%4BRgKCMhCqK(zOoq_w81!^!Whk8Sup}tU8s3+{7_z(7B5H$b* literal 0 HcmV?d00001 diff --git a/gamma_age_v2/chain_sht_med.uti b/gamma_age_v2/chain_sht_med.uti new file mode 100644 index 0000000000000000000000000000000000000000..5185161b29a93a1e8a0e835f3bb059ea7f160ac1 GIT binary patch literal 2011 zcmb_d*-qRr6m=K6)0OVqK!I+Q7U;eYgHT5r&?qzIsVXvwArZ-Vlz1x9FY1T%tq=W$ zen_SEoFryU9;;sI#OM0j*Vm47^0C{jtu4&XKNmtA1VZ2)@acdMb7;stR1h5}CS#m5Zo|K&R)PZ9F=d1uU zl#(0cTr((KainaS?uc()F&ZO4pqKxwRnV`--V%ULgd+8My|v*4_ob`G$7 z4BXaq9()p@T_~FTc@a-r!zG7bcK8)=)=IkySbh!Mu65nvH^A)~-E?>j+}bz@&xtkx z*mrje-1f6x?twN{H2HHHPu9%+-_CoAId{O{1Dt;su=}!ig#GscYcnAEB|`hacA}jH z0)XSIIqkdnpE>PW{cBE?DINmM!@Kqf_zZMa(vPK4p2|G6Da4}8RMV&gq1;;9mvQt} z1*0TbE-wagGM4OSqfpq0oF|m9$LYZ!g>p`$5g}XMVGzMwLI;_>xM5k?;nsskkBh}DvReY}#Mm;xP^}AuT z6%OZn6~C?GFHts(cXgU+C*Puqv6EqZRr%Yl?=2(d#9I~LTa0|wAI@)8eAKT8u@kTO z-UrzW-24^a(;GPSmXan^>0Cp{I>jND{=D@Ycpu?z6z5HUHwyhzM#fG&_nmk<)qRzk zNM)^vH=*=*%IhUMgAKFOw{IW$abLP}Bep&C*JM1fK3=U%_!B6t@P{LC|9ZZv_xnn6 zJEARPWsGVrmE#*aNpO2hPl!=Jlu>Uz3(b0>0xHeS{7@yRoX8mUYPcM!nW?R)AQ~hT zQ2VoSIR$%9KB`S#ED5E9(nz@&0r+WB;+TQI27ade6;Mi9AROHppQP+QrR7awp)29jcuNhPyZ;kWn!KKL1a zfPbXtWHXy#yXvG*PtWvpCX@4J&}r?iEw8>8LYxMAzzXma0sZf3A-=)SoE72^{9pL< z@c&?N;uRmTU%)xw5`)^XRGb2?0W$#WU#|HX__dl(!G8cQ0$lSMpkb@Zm}l*16ju9_ zvfc%Nd(gO^#`%69+}q9J{?4v|a4zjC;5hqbOuG&^egm9+({2Ke&w}$zXt#iciV1PM z_H=gu*TY?p-}Cr=aP~@j066{--0k(qgKG7#1ATX?<;zu`OJ zD=<)LuBBChDg$*O#D*+Y$Ep;m%DN_$I{BfZ9hoYOY^pLWlH4XHtMZIHk;-gxkSJ_4 zkcXp%^|Kwz;!u_2v9>AgH~{Heqt&QXHQcu{JnCb^dQwlD6Z6-j=tK#BZ!T#Mi;{gf zTQ5>m^kiZ8f-QqmP28P`gMOT3ett3@#K~dYtPdvQp3>iwvdIrjQ5vt_hSGSGCcmS? zBR>wdkn{50i8$CuLX|h`yAv_`H$&~^C*t6f%p$-3L>!oX9C}wt8>?caZL}$Hh;_W` z;x@iVJkH|08IQ9IMr?Z~2c> zUs;5DN*$#}P&cWUY=!zb3s4WKgVaCj9`%koM}4ENQO~Gj)UOsW2k_OXPYb{zKpmp~ YP$Q@f)F0{&^@ch_eW9*UPuM^49~5s8TL1t6 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/chain_sht_st.uti b/gamma_age_v2/chain_sht_st.uti new file mode 100644 index 0000000000000000000000000000000000000000..d2d39075c6f7c9bfa34390c311037e3a95ce93f6 GIT binary patch literal 1880 zcmbVN*>2P@6gAMY@05L;mX@^?+OoYtJ5|*Yp&Dg|zJOHR#BHKx;!)y3DqqBh@F9E% z5}cF76E}}s>G+=OYhN$%ocY}Ew6>NPmfi^=jsaf*@;^s~ScE@&T!?S*3H)z(?*#hb z|H9zJQ#P=l08)khs`!~Irkezg02cwyM|p9s;#_yR;uG-ifztrzd<1A%zA)ywPFRNG zWaU}!6u>oToKNF;cOP8aj^X;&&Vz6)?E+vq_sf`e39$S!IQLDv0$4r;ZufK*d={Wx zD_zlEM{DRJbVz3O#Eo53+b@Vx1Ow z#+^{5Cf5+}`M9sGb2AP=dPXOzELC*(j12aBSg;z@P4uDhD`9x3 zgu6DUv`1OaeOOz`20H7?%xwGX8l~#kYs7vpic>e=jQdf%7uECqM%-1&_c*WfeVygn zskf>UoTScgs$k!Z{dMG=yw`~R)i_YYdcN0)v41^EoO~npH)I;R^&7FTcW~*Rk|t8w zVp}IV!zEVnl8xK=9?>|9`(`}O3h_x9nK=0(cJkd!4^?Jjm3uK?LKPoW&r9@1JLX_$ zzdq{Yz4YZyVtW{G$z)_>d|El6NLNeYXQE#YS)GTThHHtby{orA6JH`LjEBMy{&t=c|52n)< AZ~y=R literal 0 HcmV?d00001 diff --git a/gamma_age_v2/chainmail_lg.uti b/gamma_age_v2/chainmail_lg.uti new file mode 100644 index 0000000000000000000000000000000000000000..3ba0deb54d6ea2f184dd3259da358c0ea6bf31be GIT binary patch literal 1750 zcmZ8h%Wl*#6gANDC~qk5*R-_dRSGQ|Hb}HnRg4s>QD&&bhRTz1CsCbolz5QJhp^%U zSnvUS0Be2;&dJ0xZmx84&-JyhZye`*>b4qtZ`L;63L#DcZD1Yvfq?$ktPo$|=S~ap z2mUYoS@?f2IPshh*iYaLaGpVBSSn5cSAYuu>tC$+DR|cB_zdt4m;<<`1<R%IL6z4Xa6QZH~>~?DvnA@b~7D z<|r@NhqKK*HF;a+c0b%PC^e0PS{!!bWa#JXaW_r|@pOGyi`zWX+-Za|e zIK(R6aB&mgBc5b&-i#+%AwDWAwU;krFW=5hrgEF8B1m`>s`#k7UZOMV*`v&TebmQ& z>B^pVBaHW?9=RBwR;CoW%Es|@2JYW5Qkz+(Bwt6grB>Fe)^;_&Y0?z8w~C+#Q7n^T zDigi02MrAW2Arr+v`}!IUu^`u+P+ZxoWkPQVvVv-68^nZ=NVuYpaSsEWC5xz|4=Fi zi%?CeqErZ{np8a*vo^$8U+_^IzAAe|6N~?3zvrm;$`+)#>1FY>+Y6fj|Kq-y( z2ijj~zaLcUB--CFH0ll?urB~YxqWl^&w?M#Bi+XknmqvX90T?O#|w^S)m*_@4{JFB zaL#*xhEj54oNIpWy6RBTGT&ijPj7XqdPi>CAX0^~|PH3pzEG%)|)gR<%tX zg`bSSqGN-eMUys@u$_grmB;BfM3<3PW`EfD>e+>LcDRLB2W}@Iz%tYWR=oHftfWk-- zq)=0!Da;gP3NZzk!b`!W(3XHvU<{y;jsp|GBtW5j1-u3*loUt`4h4}yNCBkqQAj8t f+{`R62RsBG0gr(v0Dsocfakyq;3dHQx_kcv;%FS? literal 0 HcmV?d00001 diff --git a/gamma_age_v2/chainmail_sm.uti b/gamma_age_v2/chainmail_sm.uti new file mode 100644 index 0000000000000000000000000000000000000000..60de518e82a4eec0f5822e8b3fe8cdc8e789d47d GIT binary patch literal 1750 zcmZ8h%Wl*#6gANDC~qk5*R-@eOQB`M28nj6ijk((C^J-IL*-`N#;P-p5)V@O5LSEu z3qF7kV9hVVIhlCI&6Q5>xxV)GjpLk8y;fuA?egk7A;d|b1FQf)5YYdc7UB#1%xNM1 z!2g9m3;z!WCtmOY`w5%@&NHYCOT`J`3UC2n{fiYp1<(2%p905LzYES@Y4-rn?}Kwc+5^Dzhv0tgqkuQSz0HBJ586Dy{%DT@ ze?|-7e$FDef5#`_d@r8OQ-H=Ze+GQ0_;YxEOPaq6ob$3A89kQZ%F6=(Di~h|?^p3_ zcz$D^*Bjt7&{Jt&hkNcQ^IsqJ zabJ3J&-f9>JJJk&j87|5idn%}f(irZU7(1SRU zdXP$Oc8j!u;opE46^a%Lj`B;5ZYqrlg*xOEmarCUlzo!$@8uso1xy1}0REXQK(*x` zO66b?swq{J3gK0gDoKT!1*kSu7OEdrk7`GiqqwV}#TU8pKl6ZTL12hD&Gpa1{> literal 0 HcmV?d00001 diff --git a/gamma_age_v2/chainmail_st.uti b/gamma_age_v2/chainmail_st.uti new file mode 100644 index 0000000000000000000000000000000000000000..7888f016bde6d124e88b7968b33bb1ffe32414da GIT binary patch literal 1878 zcmbVN+iuf95M7|OwM7UvdTDWwhp9|7{;2bG$KKY3WGPw=1N zf5E>!f-(3%FgW#)Kd|orQn~#s_=zH>8wU;mX92E9d3CDb+&A9~ehhdG90$0j2GFp5 zZp?F^Z-Y=BEj;TT1Goo`>uH?t_rbko4)+&34Z{6sX8_^s_Z$ad^uo`B%bW`yp8%I$ zFM?M9+9g1Gx(qHoTmff~w5x#dYvAmab{!CY1DyNOZUVw@fy>(49!mnY4%;Rft*@72^l$r-moLS^n(lS{`lUFq zTX^Voqg~ge^Hm$!6c4e87bLFYeRPLeJa5LstWxic(~+0YV=v!GZDLXvnyeo3CKT~r zalKTtzvcE4dHbl3`_j@|k&H0j&{1DvyjmSoI13xZqZzn=y|!6O5~Fz>)zFb~&eT?l z`BfXoxV=RLjcIpv*o$=-ZDy{5;U9nq6@?H52l?3w?rz^veC3b8=M*cy7Hi~vlJIM$ z;*SC209A!wCJRu(`Gr!AScD2qWv1$g5>t7pdJ_N@jA}(irIJ!Xshm_yDkT+?%1A}5 z0F%HJK*gH|W&kQ173~G^5}=|{$*49|E-Dt4iV8&)p?dHz3&0}q40sOkTynm@kDV2@ literal 0 HcmV?d00001 diff --git a/gamma_age_v2/chair.uti b/gamma_age_v2/chair.uti new file mode 100644 index 0000000000000000000000000000000000000000..9fb685174f8c0413d90e048d035d38f74771bd7d GIT binary patch literal 1225 zcmZWoOK;RL5H`^ASh_sR>x9Ln7nBNmL7XUCBvvYD+g&Pg;NVTBjUkC6$JuHtZru1+ zz4E8v`|>C)jPzw59?y(pf1hS!eXte1e5I7S3`~G0!1qh7Ub~{y9_%kGN+pP&LSKje z4S`bk_<_6!t^qgcbg~MKt?C)D2C)9s&PG}Fw6jrCZ2<#-drkogb17VB?OxcQ!g@CV z_MmV-h56^_VDCO>$b?RALEiyxcVL(`8QbgZyU@M#XJyX)J_x-I^!*;d<{2mtfuymN zdemvo_!#&F%p@-}6J%eieK}O>t*K-jB=1tyu8U1(PbB$hazSuMs@U5ySXVSD^v8)5 z!5&&cqnSDCw>El|8h<3!S#0F0aOS|62A4@&stHeniN8(JuuGa`?n3@{l3XZpzBjjw zYF}}VUOu=)vWfBGMH`uTSBei-s$I)TI)B+6PfhE2SeAWv)Wf_pGtc@6{R5NLy^qo+ z?`pF{>;KKb`HNV#%TkPQ*E0!0#yjmesGsNfd!2`Si&JAgZ;-FMe=)1@QOSBfi}MTI z_w%3F3H({=>Z4Q_F6f2$rB1~xmO7-i(oF*m!<&$b*KwWC#aAwuNPl*xqlbM*V>?#>E1MbI5k{uM!7+=sc#7 zrUCzIJ54kk3#E_PLMW3riFe1xrbxt#k7Ab(2Wbf9 z>&?wLb(Iv+|Ld5dAsz`s!mj|Fk;EpUNn{e3q#%JvR1%cLBq>Q6l7)YsL?i)8ymf%r JM1t{}h(F_z(|!N| literal 0 HcmV?d00001 diff --git a/gamma_age_v2/chair001.utp b/gamma_age_v2/chair001.utp new file mode 100644 index 0000000000000000000000000000000000000000..57a1194acbc02272eaec1133e502fe1c54b1d9c3 GIT binary patch literal 2065 zcmZWq+m0JW5bcnJ1cM=ga0%BANeCpwyCgvZBqTO=R%-#Vwd;Vy3u=#h?Ph0sCf)5s z{tI5=f%_fa;2H4|{12Sd?y(0_(&;*VtE#ECt8R^k@`J0LD{lxP4go#jb>Of2miol~ zLR`ki+sB0X8|x>JV}Sevq2}2ZNs@=4Y3Bie9A?Cez=ObH;8TEdWU1nKG;yARJMmeX z!)3I^vvf6`a!q3>GSAddo!8DS%416v$5R;V zyN{=J#_|O4d73|&G~<5?_#I#lP6M<_{&eC{;u)aM#k1gbOwVyM$@59`TVDXa0LUfq zW#VU`ze=3B|2pxr(BC9}4*J`~&qIHg_)E~=Cw>9?hs0lo{xR`apnppIBJ|IRUxNMx zpuD$li%_h@N42%pnn4>R{`djxCZlej|D>FR2pw&HwHY1?owhNTNmnb2Qe7bB;t zo(?)o0j%fCfaBbF<%*@3UgYUx;DP(w`8sKw53JssrLZ|4Evi)l5&wVkxn)feld%_& zMdYulv~tR3>Bi15e#UC(&YjaXtd@6_n^^6AePA2kS99w4D2;^=O`bQVVqoJ7rECby zd#X^=RSGfJD$G__Fpn9i7Y23*@rE%D#ic>acD+k`@9SLatq@dp0ILJb7isSARXWeR z%7-ml7}%IGXQorlHy+qqHpd&+H!%0w_4K~6F-FF3*4tu7`96MOHk6J(KXJXBEUvGg zM=;GMtF7Vv8gIi@Sa1HE;2-Aj$zkrsbQt}wvL(b&xmpM#Ad`M#0J0u&t}6W!{%}dVBXn8 z*gV)Y*euv2*c{jt*bLYNSo|e$24Imt3!DSa11#b!-YnWI))#?G0E;q*1(+s(6y zwhFLs#2U~6+MxhlH4<&K2u(dd?zOc@tJ2886)+m-1>13$2_5HIs+PN#K?bgGMx&;2 z>?_&oyRtcMpQXbFqW=H-xvs+4Hlt6*}8C9|y9 zvWfRAIK91;(!@a+MWvzVD|aL2_7j5DdL@+efc zM%EvWmc5$D>iEKxNi;t{ZzJiRZH%tRW1GXEh=%(s-3@0Ez5F>LKf>Xa%|IVAq0K++ z7XED!Nn>Qa>OxkMI7aqi0_vbT?W9rA>7ELG6!e9rzWsu*@&BZa1C_oAHAQ*xXFffN zouOXtWZ@_nH|I8y$*{b{Gn8XW;26M=lzvJ+qf+Aen^O)b<&^L#fRfD;DbbW>O7aZA z5-GiuTuLn^meNW|rIb=aDV>zeSzr#JG*S}hfdzolN6DkqQQ|0Vlr%~iC5+NV$)Z$I Lq9{$2q&46lnTh8O literal 0 HcmV?d00001 diff --git a/gamma_age_v2/chesexpropertie.uti b/gamma_age_v2/chesexpropertie.uti new file mode 100644 index 0000000000000000000000000000000000000000..a10f0bb456213b587a1131697a987735c82bb7b1 GIT binary patch literal 1117 zcmbVM%TC)s6dfq9(()c#+qsGASlq!&`;3kQ%b#u{s)0l ztNei+1GBZIRO0P--lv)dkWxhe-%kR|-e%oHZzH{G0`mahoC1^?rxedw=l-J$%=tL; zy#-iTd9VzR$kem1EXVeBQ8}P?pPf^bWqS=YMcDU z{brK9NHJcUPg;YrVjn?H^F&Nrm-d^Bw9CAZ(xy_Kr0m4|kA6JW8Qj>%B2-5{^xM@p zCPe68X)_2uQtQm;W(DVuZead?EX|@2UAl84)=G5b+Cly-!`Jg3xE0??CBKT$=4YJz z(Gx>XkzcL)N@Fw%2_BYh+~)GQ%cHvp)k2bzXe8DYFb!~lxH!zgMIlkR7+eT00?9-2 k?*aP&^Rpq6k_2A|NN5t7WFyJ=2k{Bm26lj5fOSLt|2WTxZvX%Q literal 0 HcmV?d00001 diff --git a/gamma_age_v2/chessex.utc b/gamma_age_v2/chessex.utc new file mode 100644 index 0000000000000000000000000000000000000000..0319fe4e5d46264e7ce4d0ac26aa66d9cc7080da GIT binary patch literal 4790 zcmeH~$#xq>6o!ioBtQ~pf`mD90tq2FAp{6uS+Z;;jw2)|hA@ayt891N>Q=f-9++ps z%z_1vz=}Puz?uawz!UHQ@c-Ra;`(sl9LSQ?Ie*u8Z*^5y->NQMU79ZMxqR~Y@EN7l z1?cCsN_~U++uN0zK)rKFsp>6CUD*mo9dCml_3tQXR%KpLSi_x{ir_K9Rl(ze`5fQ3 zCitA-^MWS@bI!i+l;Dek>w=#b+z{LpJT3T=;LCz%1iv8oMZs4Dza;o&!LJB@Rd7r2 zYl5}lw%|Z;N3an*D|k-uyx>sqRly5_Bf(w4vEW2-Pw+Ltso+eo72FrRD0oTmvfvfL zuM2)d@SB3)68yH{cLcvH_&vez3;saxhk`#6{ITFq1YZ~Yso>8XbANyCcn#`JaIogi z|0=(d*Ql=@-$7Fp_TLC?g4oaVTJV17Tjv;+TF(m#>sxaw`fULJ0C60S@dSipLfrx-zeCOi$4y?yICApB{@bD5g{gM9n$=Fh zcM85s@GilA47%=y&Ovm#^wZK&fA z&oc6((7fXlsQHc2{}^=LF`x6Dfy+~WrFj>RQD%H?|!EJ+54b#j{>8^K9>Q$yH^?F99Iu1;0dZlO7xQRO^ z9duXqc@rm=Ek&s(sZDigYn{Tbm@G)co(&V88kmosD;nIjoWzSJ&9uLvmeu8vp{hDy zQ;qM>QVBDic6B>)4{Y|^seGl12`%#$UuMF1E^AF0p1&;9I*f#=nn^$IG>xr>#fbGN zVahZpwXD|d;+=FZ(0#t^skuZd>ns4ygcSL=CjJ43A0spd0wxwXLPjCz<%(~DQ)|y zj!Hi06QQjqVQl><<$ju)*bdwm^zwi?Mrvl;N!<6htEDiCq+=GbllFL$bjB7#7fq!m z_0nuV!YmUT1{e<%MJApzm?Xla%8gRzYCjviB%&Lbd^x{) zZO!|I-{Ks-Vt@Gdj0+#&OdE3T+O52|lem+wz3%|KSbOilc^4$zwziwy2uU2^%-ZCv ztcR8NO=-UDekvG>%kIrS)*Msz<0f(2EjeCjC|+uXwiTpish6D?J~PCqndM%Z;C*bE zf31uhPkNsE>!9@z|4}eJ3>PzAW@SA6`Rl-c23sIzd<-!&|LxEYXeY$Xo*6w?W;evl zof$hbb!ODoLUuL`~ zp;HhuTV}M(WSPM-b7jWLOqCfbGgD@y%tS|^5;O{Z0euNgKsRGj#Du4J1sa2x5sX7V SJ~gl}jMq7c`{+D03H<>Ay6YPN literal 0 HcmV?d00001 diff --git a/gamma_age_v2/chest002.utp b/gamma_age_v2/chest002.utp new file mode 100644 index 0000000000000000000000000000000000000000..5fc09fe6406419248100bbef72c0caffd785fa25 GIT binary patch literal 1987 zcmZWq*>W5;6ct$@Y#~5c!Yar@fW+8IsDej(rd)Orm??V#&+_`?UU=sd;2gEOrzvjL(LLI(q^s_uJCm_~|K{3_x0F)%07KwS;I|WvKX_3{2%bY--iPB4~(8;A0SEg5Ip0sjT~XrMc_f;B=9jnJJq;Yo=%)&u#Ea7)zeaO z>>0E%F75ut#j?LP=eNeSTYDJfF@SqH3lu5PBj9b!bKtE#3evW79>>uhZ(J{i)=6)~5lUhdH%s*TCnA zzXbn9;xEI0nK1)}cBhjr%VFt#vsn%dP*b)NWXu-lsq4p zDr_>s$i|HMY&H|#@yOn>IqtZffqEr=C`Xx%d*uGJRkzwP)h@m;8=U9or?%YTa%*)x zifPWKZ8Y3p?{3(N=>5+L>mwYF9BO~S1>^c%wv-y1TtblDVG22LMS<131^9mr=2C?X zs@h-YSAX&8w&x>|6K}6NnCvZA+e4jMoq1=q0YA>dTpK+Xvsh|oy(B68TBykU0>H5`s!_W ztb-R*)n0U?0#vRjGkgk80;d2TjK`)t^O@oELW!Xi@fqRsaTcItQDbBdL7_=o@E30CGnfkzXFt70KX6B`8MzyFf?PdOS$7lADT*9Lsy!S zFX~V@8*M|W>e2++m1b8CmD-#Jw=0#K$@?VZ8OS4asHrmA(GU<>#lq}Exa5=3tgwBZ9fgge!mvG5?&3Q58f1EXR%xjy{Wqr zWRy0r>@PMP`$c1XwTRMZ|o?o=ndjA+NLx0UTkR1J>w6oG)nQ4(40S>rqT| zG0NU>e=B!GE4;6MPKXb8IC7Z!eFlv2+iWQ{Fr|bbJKf~6*_boTI2fDDj@Xl%jepG~sHhLmvHrGtfbsZ)} zlMEw9(?_P!Zhuy|X;aR1CB_CFoUXm&x2_vk3D(%Lc87Xq%BifKiVN4*ZzJaagrzYa zL*LLF`sy8bq=OgJOugtuL0}P!6^F0Fao_}S5?}^csrlmYrD3&URpN`nmxM0}t2gt( zmx3<@Uk0Q~@g?93z{<~xe;#0kXJuzaXC-F^=k_#k0bqr`2wVa#16Kf6URGRgk`)CH;Fz|54I^mGp6(N1uCv6NDo$EqpKz zwt_>2z76BELPz-a9(yqIoi3o@8dkVY-#@?ZxArdk%>6MBJcGjbDcoOEw12r&uMJp6-N3P~C7EkZJOjlL5G3UjZ*)X8A zO&qG+m7Q)I+5gbSfyJg~7;oBN4}wiD%4hQxZE6Wjv)8Rh`8CGLQ` q;2yXS_}}*sJOYow6Yv!9zhnVC2X(LrJiy=Q1$YTw0p{UfdHMq$Q>>T( literal 0 HcmV?d00001 diff --git a/gamma_age_v2/comclothes1.uti b/gamma_age_v2/comclothes1.uti new file mode 100644 index 0000000000000000000000000000000000000000..32b9bf543c193dee1cd421560016b5a14b6243b5 GIT binary patch literal 1508 zcmZ8h+iuf95M7|Jhr2$$BJRqgKR0tlLL=}-tiJX9VKtjfz#8&NWwBGQ*7x7U% z@F#GN<4v|c(#f3h%+9XYnfW~Gx4yi2y|=HFItBK?SKzzT3;SnHsc-Q2*OmGW`xh3E z)IR{G%H5!-fpAsl8tf$yWhzU325i?pYrF?9f?U%FiL(n+?Qss8apL^KRP`=E^Q?r6 zvz~tr?&oqYGqJ`MSmqK}L8p0M`owk6=^M~4=ccDOq4_?IS--T86J81F|@0><>?l*!xIRuC!T^_Pdo#;H?a-2D1aT%-S6{SbMIZy z;RVE7koWx({0fewnB|d`P|8roN_C=A`c?{rDg-)?^6Zx+M^Pbo(vvba+015oTE*%2 z6PemO*43q5IuJvvb6J$C9uI949}lr%oixbxiTr~kIZ?vj zn@hTLQ}P@R2d2siNz8@YU=EZ}CA9k`>W~=oJQe{MS*{l z`+RC6)uu*aFNr($-?)~C50XO>Oi2Ai+hlwK`(6M8Uy literal 0 HcmV?d00001 diff --git a/gamma_age_v2/comclothes10.uti b/gamma_age_v2/comclothes10.uti new file mode 100644 index 0000000000000000000000000000000000000000..9641eaeeb0f5ba85ba64a05beb6e84f9dd127d3e GIT binary patch literal 1518 zcmZ8h+iuf95M7|9{3_YiZ9?N z;2hhVY(3KPoY~o(U9Uao+ho}J{{C(EgHq}Y&3w@2Eb*2YXX3FzIN3f7r=QY+Qr&c^)7+iajvJa zo_h}NZRc=*Yu7+Hmv$YnoaeRtro(SJ{Ib5v!L2>91pX;tYwkF_18(gZ2=}8s2P}U9zQ;k>Ztbck$L#&SY&h>`zslB+S8yKz z-uG+Z7??=D$U-B5l!4$U>4l{XjpRsG=IbcT(q9rEg}Gp)FJ)Au3zO=3m1jJRWp2`G zDlzJXvwC6k^pdccNx2&HbZJ%r$k^yi>QdG4*o4u^7#lW|Mwvb}|1geEm2mgw5^q_Q zJcqTzBG<(zEXi+_C+XbHx8q5Y&XV=|pcRiK`EFQG}KIPi3)3tVCo zcWvz9dnBtY?wj!{tJD`UVdmtk*vXFyy^zABQu-{kq7t#oxF-)orJ=%X15^|$2^EChOU0m4P$8%cR0Jvk6`%v~<=E-$ R@LgaJU?;PK*}3dk+JEfo^g;jt literal 0 HcmV?d00001 diff --git a/gamma_age_v2/comclothes2.uti b/gamma_age_v2/comclothes2.uti new file mode 100644 index 0000000000000000000000000000000000000000..41857dc4acd79a7ddfa0fa10716da378ad9cd976 GIT binary patch literal 1508 zcmZ8h+iuf95M7|JhEkH|w2Sme5h2WuaR1qnZ$O(uCB(&I**s7h4>+4AzjtE0)GKOnaY!&0(R?|HQoc~0j}u*w9^Y$?QsU2XQG{5xT@Yca5v8N zG}iOa!TsEvi=0r~C3w!IT?QQId0Cfs6>$6-xZC@>$2Y;B0<;^zPQ{eES$n!$fIGu& zkKgh5U2u1Ydmg_J?(Bgh@DBl3^O46};LaX{a1YuOz;T|})!hPb0km!4b;Xo=2G9HQ z-MBk3^&EH$@T@O@ufRz1S*ERoQid{Cs-sKkS;>*AtZyQnrN1OT)VW}!D`ixqGn<-e zm1o?GWopxLDlzKm$zoys3=&;Tq+E^#rnJidWN1w$i&E9_(CX-Dhz;vWgUlS8zaPiP zO89$oNiZ);p2OLGk(*+m3;R7hFetT(`;9mpCh64AH{(%~PLkF7un`X=`hK#jAy=GS;HLQPXT0sYlcy>JNL1dc!kNU#Kga0Cj}=LEWHUuy3gk)CKk}b%6cPzHb4% V6Z@Ney#;Io>|gdR`;~o4`wtz8^h5vv literal 0 HcmV?d00001 diff --git a/gamma_age_v2/comclothes3.uti b/gamma_age_v2/comclothes3.uti new file mode 100644 index 0000000000000000000000000000000000000000..10aaf511fa6e676ccc386ca0d5fa2c4a798ffcf5 GIT binary patch literal 1508 zcmZ8h+iuf95M7|JhEkH|whoZJG6@rJxQAMOsA}1gokkDdJVykvGvNt^NMSK(w z{0W@nc$2M1I+-&&JF{y$b3PBdtuK4qyZcJ1Q$PoJ4ZJ%&_kUKD`i6LaRjJ?bf8nvD z{=wj?y=x@3Azk&k27d`ao63`)0e0$`J>CNs0oHT@+S$3Q&Nv6oJJHV1UDfXbxLapE zjs5(4@I1HYGB?zA1)leyT?HKHeHqiP1CHMScW2-9_&WGKfOZSud9>SrtGxs6`rid- zUmEKizYp&2`M~23>wR$Qk;fl{yPi)x-U4^_6r@!L&piGd{7t>S0l!`IO?db2UVy&@ z_zYWsGp@Y__`Y8OUxA_I(@a|lr3_`HR9lzQwUQ%MSUUv;YpVHBZ-dvI6Oqo%l8^_*iIvvF6(=Z822}`%*!|8@PnSje*Z=snjd)SJ<&Fi zVka<}Dew~Oc-O@NzDKgi;(aq-WR?0TR%c$mioJZlFjFaPDrGO_KcTNPu~xdB`hx`~ z&+%_^pHHntCXaZAlzW^BYL=Td&L8)ii4(k7RQp-Vi!sc@hht~^HW$ZH_tEI>7no+_wNe V6X%= literal 0 HcmV?d00001 diff --git a/gamma_age_v2/comclothes4.uti b/gamma_age_v2/comclothes4.uti new file mode 100644 index 0000000000000000000000000000000000000000..8822a6c60463bcd3f65d414c41720256a50d2f6e GIT binary patch literal 1508 zcmZ8h%Wl&^6dj=DRo;~MqXAk9ERb5ds1PigL=}-tiJX8~Afds&iLKh1$eys^i})xO z{0W@nc#^4)bTa48ow+l%bI<2tul424>)m~&)G4qFz5?H!o{xW4l=_Bve^sg982@6# zl==r?sMfAg)Ihqba}DDq5M`>7`V6>J$E@)lya;kn4&~D95Pp?Bi1&LdrJL5Jq??>DL-5u_F z`ktrnL%U~q;OU3ZJezm~I{g^h)!guO3)-s2>&1-ke9yw-gF zZP4Kb#9NSeeF=UAhmub-Z6%a4l#xS&tW<|++I2;tYDf+sw-@`+LQp-4K#Ni-GCw{&e50iA9Ecb_vxG&kyv|Q$grYMb9 zuPqs#WSKvb=-7|LL*%@C(1^o!8p(9IKWN0bznNuTz7dBX^d$D{H{#Izz)KHA+eC_; zj>$}cmsrQUF7DuaB#SKGH{(TCsgGiH=H;u{%l8X2mBOY{1}XmueVvK5((BeAtYh*V z|0ehO)LLZnh-XN-$DW{Px!z%qbG?~Jv0b)4&Fm<(YyxL&zNWEwwGdTcE&3aMZ3SEf z>0k6MZl@2hU$~uqM312Vu(#+pyaW51zOoL|N9Z5)4f+Lrg1t*$pdZi&*#GR|7RYB} Tf3vSQ!7Y&e%f4m5vQLTsh7R;y literal 0 HcmV?d00001 diff --git a/gamma_age_v2/comclothes5.uti b/gamma_age_v2/comclothes5.uti new file mode 100644 index 0000000000000000000000000000000000000000..a1a2746d7502ca74b1ded18081b679c682028d8f GIT binary patch literal 1508 zcmZ8h+iuf95M7|JhEkH|w2SkgIDg+NrqKZhSjhujZKthW>iLKh%$lmb47x7U% z@F#GN<4v|6>157$c4x=y%=tX*wZ6Q0wX>^~IstTnm%#gzbN^>Wsc(pPSC#q={}&#Q z)IS(pwRVl9Hl(XMSKu!IC{uazQ^0l|v&IMDJit9YfOdNBsx!`jGfz7^cU8S};Ov#= z@~r3g!Smdji(FXSC3ttnWskF8)}>tq9KQz6+O+F{g*TZda z=4f{S$M1r>zVCVbKDayUfyW<$yPA(Y-U4^_7{tBf6Y$q{;;Hw1!{eLa?tY(vvsd2D z7U1kT$UA`d{Q~$33?-jt+Da&8C?loXx|E)k9I46z6X`7dCGmmI1y8zCMnyWcshL!H z#=Tf3HXWrBqn;kmH`c$ML>FTz7tcDTw2J^_U`;0TQq|*u)zQ%a2iA-FnK`z8FOH9u z@XzL!&a5cehqJvRH$`6;_ItQ*P-+BP@B<6)AHljZ)f5%(qgnU>4^&=jTd z>a``qn=JDO5*_(*xR0Ed4;pdUP9vEv_Xmv_{hL|l>Er9RD U`Q}`20Gj~kmvhT`<($&~1Cv?wA^-pY literal 0 HcmV?d00001 diff --git a/gamma_age_v2/comclothes6.uti b/gamma_age_v2/comclothes6.uti new file mode 100644 index 0000000000000000000000000000000000000000..30801876c1abc04e5f7a3c9f15854a08254b7675 GIT binary patch literal 1508 zcmZ8h+iuf95M7|JhEkH|w2c#B+Dg+OWql!qTjhujZKtjfzB&*ul$lmb47x7U% z@F#GN<4v|6>159A?9N`CIiCmJ)|c0>c6OCgCx8y{5_o@d?*FVP^$qdvs#3q<|H5NP z{e!_(bJs{}L%OPS1^xnnGL~Wr#=c8Q(9KYuA>mFYRzYoxE052-0)J=Gvg?0;YXSnV0 zJ08Ca?(TNagr z*#ewB2YCnZy?NKKz(De87F&s=jAW=(J1(VbB}b~V&?IrDe@S`}=Yo-rlu4ndR+~wc zXWUI?V)alt8z)D7Y*m z!rz-qf>}}W9M1NN+!VdIu-~J7gHp>lY{XH2tS5fH84t#KG+wTc8gWmupSoP;2c{^E zSFbG@ZnDfDNOI)I(LQosK5WEMTPHGIt`8eA&TnR!mv6+;$9R(Z^&4?ye&EqViS1a5 z?Z9NFz$4c2j*A0)kMSal_h!7vD)mWhoO$^w_VT^LOr@||%24y4(2Fy%R=S<~g9Rqf z@o#dUPpu^;Pq>GaZ`l*nEY~~ian3grDYnYi;mi)TWg|La^Em~>tA(gC)}p>qD^`G2 zfciz<;&SQ~`-RJ?N7Nze4||I}#xqb~s4MFLb%gps-Jo7jC#Vn91@JhEkH|w2c(t=IUo~qs+*f=>FpkQ;TU+81!_tNxO3coh5 z1T#~y4`+L()TSRB`#n0)NVW9CmLCnWeB#I3{xHkO+46qW^7~T!%&TR5s7ch QfK7n&%em#ea!zUg0TA5uLjV8( literal 0 HcmV?d00001 diff --git a/gamma_age_v2/comclothes8.uti b/gamma_age_v2/comclothes8.uti new file mode 100644 index 0000000000000000000000000000000000000000..f20c85baf9eff8ddf288758986582bb130159abf GIT binary patch literal 1508 zcmZ8h%Wl&^6dj=DRo;~MqXAk9ERb3@5rReIs3MXnkrNOLBxLNH#HyW%#uFBN5g)~Z zKY?=`PcrqDPVPCrGj}FV?)g0IwZ6Q0z28CQ9|03g& z`iDTO)^3p0fpXR78uBFoZK_Ou2H2}Ld%OoO0^HLB7-tu$I^!HT>x}b@RQ0<6&bu;P zo&EfK@I1HXG8fiy1=+2;>T%we_hVcK9KYf5n;zc;e*`dY0S_vs)a^Pm-2vPk?t1*5 z$M1WbJ>2?-;4a)b)QRu{Sn~gF_ z(Jvk^HrAiPBsOCym(K!S+NA&)Se?tFRrPpa%zek4}tyVg0=x8v>rhdJthm&kPS?!M+x-a?9tX$QH+LYSs*O46GWK}4;vcy*Yn(~H+1wNo~C~PhK}?Py!23FI}x)N=v*7T#9Hq= z9pLwvEUS3m)XS<;AH~MGSFf~J?;AZ6V>2nkjQ@mwoQt*6>()P5po;?kCinBHjYJm- z&ycdsnV@I6+2M?Hy`GBMEnA=Fc9dC~j59W$(=fbVP*t!O{f%C+2CM`0FZvd@)2BEu z+)h8D57B=(Tl5>=f&M~Y*#zh#^bh(5XOKQYf1oeW59kA&f6jdi;CJGDbFR069f0%8 Lx#hfaP8t6Jxs&ua literal 0 HcmV?d00001 diff --git a/gamma_age_v2/comclothes9.uti b/gamma_age_v2/comclothes9.uti new file mode 100644 index 0000000000000000000000000000000000000000..2e47d610d143c06878d5eac2867c9b9ca39a6540 GIT binary patch literal 1508 zcmZ8h+iuf95M7|JhEkH|w2c(vlg5aTbR1wLP$O(uCBxLMKY}L+2>kSWl5g)|^ ze*)(?-el{MPUg(c?(D^x^Lg0oe0lw9XICk80_XxSfp;h8{?Ce1-w^MvD)k%wFFc0S zKNws+ca5Ymr0Y6Y;4c6uQ+x7Lz;+X}#(UsAz%@O9c6#pWJ{)rb-i=oJS&as zX{_g;gZsHT7dfG^OYqFmE(4D9yl#)H9=`_8+O+F{iKL2Tq||;~NzY1&RBfS7;v)Yg>0w+7M!HfZCZF0|PwG75 zUMdrtk8(*-FCNbqHorj@o3T`ju|QXL5r7P=E@WP+9v;{@IT~QYW>UY<$L8;)>9G?2 z-dqyQOvQ6J+cTv${n*&=(Sb&(WgNERXprR-Ki`grSw7B|>!ViOm*Qt$E%QTdD(%(V zmjX9g<_{$~^5f_LIWHf!;%GllWV&1*wql%L&k8T!ilYzlB=zgJ;z<9%qlXgPOw4wm z3vKX-O}yjc0N*29WbxjN7g?n~ij4~|U&mg)Z}e1*&7}%+{uBCfA=XN-+kCJU^5nQEu4;PS|`-Vex7qs*Sa%Z|tuXU=^T# zQMb69JefOBSNB|%r6?VelrOi%Be7lSkP)1zkV+bD`&0Xo1pz@M*{dgHYy`USRm zBZ~e)|Mzd=1NjF+&ABxiL9Rp7&szX(ER7z9_7&*w0Ls-;`R}!0a}B~pPec24X!_z@ zg!eX7#4WI&vL2i3tA56=q#g|J&3S{&&{;-(9nBt<8Ba^m8xo z1J6SHgP^(p4}m`b=HMfM=b`;^u%V()fGQWC!d3v~vr_r*=lCjsXZ->=3$}v(G1#}E zd%IqRa5onY`>yFdcaZUGjcJOX(4%=2R)1qPbCUCFa_^js%ASt%VUM!CtHNlPyS zNwQcw=}FNO9D0B5(w-#gg*=r7mbBxv5IC82+TKAswHJ~Xx^i%0o#gpEb9xvv%8?#b zLw^2QoH}oW54`r|_qoaC-1pFRSh{S7A>Zz1V%Ne)XKC(oZQMz@JR0OW>xh$4*ubh? zZrHa?q4T7S((!gU3?gv+C|)Iv?XH#nG;Evg!6I8G5c~g6KKHFjd@}kDSw#M_Omwd8 zD6BYUL9R)Ap66oSvin%)=T?fMnsS8mRW`N1l(mkZOSegZM{~np^8+NW^?@6#!l48xJ9w8TzYAtjJ1Ul zH)=MU^&0Y3s76oQ^E6Q?B{waWp^JtZBAQ+l;?%y5%`8RKdaXTWeZ!r))bUJ-9!=G> zsv`A39UG_4Qe$1Aw$kyKtKnz&UcKhCq&fyK5}plAWw{$SKNr>47oxU|Rl7T?95r^7 z3ooO<$^maxJ)b8-zYf1eEHA?%IKe--ry9$=O1{~^qEn42On!k-{B!&QI5UYL4G+Ce z=MJNIH`Nv$3^&EEt=A4;YP^lIr}mY@Xgc-*hEJr`YN$(k^B1e!RMhgS;Z|vhuV|8;=GeFGp-v-(KPBxDltEr7&J z!X?p?U`ebbR1zr(l*CEGBvC5hHb6oo5#9mr0wg>V9SM%aMnby}kibY>+&GDf1Vv&Z KA(4n41OEc1{*?s) literal 0 HcmV?d00001 diff --git a/gamma_age_v2/companionunitrob.utc b/gamma_age_v2/companionunitrob.utc new file mode 100644 index 0000000000000000000000000000000000000000..bf7896ae578bedc73f3f7a2a344b5426fa8182d0 GIT binary patch literal 4731 zcmeH~*?!wZ6vn4?VN09P2FhAex>_N72s zZ+HcG11`Db5#SYg0`B4aq#5V*0q9lE@Aql`v*>7MbVfd2m@kiAJ$-WgtWxR{^!rw& zenQ#4PpN5?f9_JMu|=sPBT9{;JokW77f}8SL$@mP0%M8h+$w@61y2d4Z$ExUa8>X{ z!JL~PKP&jM;5orp1lI(=F1RkZA$VT!g5axy7X`l|_)WoY34UAfJA&U8{GQ;Z;P(Y< z!7ago;I?2RxFdK;@Uq}g@HN3Jf+N9Q!Li^(a8K}c!KvU(uoc`FyefE2@D0K1f24jXFUqta*iJZ^B&sc5Z6h20^)pW`ykIxg8iDuz?>%cazDhqqdip=dEWu> zix9^h6nseVVK9wjj^tGEQO7KvhQ?j}8OMA-$BMQR=Wx8>{CWac&XYO`@r;q5g>E`N zh4N>|&!POqF`x6Bae3_E@aywCB=;1giR z!a0aWeg!({+Fu19b$lLt-0^GRQ;siy&w^1H-UDts@*TAO2G_!NM>l#B-YVx?MDIKt@%5~BzVW!irZbj~ajeaYYORAXAG7s^#7{*IkbI$PF zM4Q)PB&w>B^y7BJ*r~AaSc?){j4ZCztlI5jO`3@ptQuRBrv09EQk9q%GQZs3{ zVzgb(>k~fG%Dux->hGD-pDj>|~w)$eo zUz!aoFYAp8Xi-Nib;N^joYS_S>Zs&5eI~TEB#f>1QtqdziS3~Ivc553`bbTumBf8N zT&;ysBpW)|J6WGjlJ?|k=yp@7S-sZjN0?<|!vOw3QDovJgGpkWRJmSiU+ZUsMPhdY zlZR7XW0Y#-(KUk@wJmJAt6z!d=ntzb`WrnHMI|~Z>LqKj{{}Hy)GNA+m%)&A^)SP> zw9r!2C*yXVfwIxBqhzTs{Oh&iy%ghd+HCI5`y0eV(Z7(Hv|>78Y>N7ocp^&j2{l%* zfwOo#=0cmoouWE8&%O;S3rejpLe%F?})xAQpgH=tg`fp5UK56f$5yVH3{;sD>TAy>B2u3$=zdW&d>ZdXgjn6V#>>{V%qFK{X<~>B6LuVkSuS{E+t};z!ddjqv=_u1srk_kZnQmTyN)Xe^ i@1Y-{8EA7)iap_{y8=x@{Mny|xIfakS5=7RMd&}v815qg literal 0 HcmV?d00001 diff --git a/gamma_age_v2/couch001.utp b/gamma_age_v2/couch001.utp new file mode 100644 index 0000000000000000000000000000000000000000..f5dee06cb317de3cb2365cd6674b4d13f2afd6d4 GIT binary patch literal 2033 zcmZWq+mahK5EUdL!Qc=e+yViGBm|P+U6N1*d17O;wdQ8mt^<#hcHFk7GNTzZ@@_2; z-0$$nr|=FR!H@6-aE`1Q571RdeOi~6)SBtOI~nT_Z}x7yp_IB07yz#Wf84*)XC6?h zi-GeemHHF?e?e3JhEQ{Eha}3w(Dd^lKn^$RMc^Ue7*GO~<0}=~6OnTcwo^yZ=2rB@ zxu+tB3cjf+?Y+6a7Vce37vwR3XE_a=BY`{u&_CtON`>}Ov~@q%aUSLIl?v@ywDp`P zVn5IFB=BjppNg92e;W7=U<{rC=#%_hx?!zlr=M=x-yx0{va&FGGJH`76*rM1B?e$H=ci{{&F3 zuT*GXZSh`k_0Lo2(F(z&SzXB68N4u8yisS>6OVcrsDsgG) z)53J3GmcH1Pyf~0|h2LF2D=LALdxL(M-!JTexXRQHhSrO7%hH?u zjJs@`q#g?M$64V6i4DB&$|uXz$u#uPbzIumaVXfMQfzB`H7=ZYCiTPBay4{3G6+0g20L(kJ6i{h_Q=ZKA|9Le-kaneypAkiq&>b@N|yCa<+tcz zWJAPUI-d*Qcx3O|3~yYofL)0j$Sk$tj68q39#%W18sZDHzHlM!-6^I=ch=9N80Ivo zz2W^@Z^K@AZ+}kMAMS8vzjXWDFznw%OR2HR#CsVIqRW1f=h(g3-~?E|SSAZ5wcnA= z_)}7vfp=h>eseu=8}?)&x+-QyS0Z_(5ApeFW2ZW`2dPi({JJj1&G6CcS>ZIME%5Bx znzDB);bxng{OA8GCo4%mu2R3mKsb~33*&WRMJL8;jDYvLoo=V^@SZZ&`$u|jk-96H z=(l@%m}O~EbvqThGI?w2io-*k3h(54Ns)Iu3-8O@8ym?2|Ge$}f1C&6{aG)L0mlKx zfkleNiA9NpjtPm0i$#aUhDC-6o(Y`AghhnK<1E0qvPiHvuqdz?um~{uGwCzgGs!c# tYv2OFBz_UN1Y8D~q?w$Vl$ngL0@na0T_#&5SteH|RR)$xl*#iJ@DH!oB3}Ri literal 0 HcmV?d00001 diff --git a/gamma_age_v2/creaturepalcus.itp b/gamma_age_v2/creaturepalcus.itp new file mode 100644 index 0000000000000000000000000000000000000000..a55afeebb4ca3a59719f0afc2563b9f31f7f1ee5 GIT binary patch literal 133646 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 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/cybohunter.utc b/gamma_age_v2/cybohunter.utc new file mode 100644 index 0000000000000000000000000000000000000000..68515c5f97c40a7fbf04ba7191d66d393354b91c GIT binary patch literal 9910 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 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dabberarnor.uti b/gamma_age_v2/dabberarnor.uti new file mode 100644 index 0000000000000000000000000000000000000000..1990b29e54895457369f162a1ed7c1749f52b11a GIT binary patch literal 1504 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 L`u91R?!kWn^OjRB literal 0 HcmV?d00001 diff --git a/gamma_age_v2/debgon.utc b/gamma_age_v2/debgon.utc new file mode 100644 index 0000000000000000000000000000000000000000..784e7f9b3b6cc9f92c8ea74f3a554f11d9224de1 GIT binary patch literal 5436 zcmeI0$$Jz<7{&_(+#sN!;>x}#2qAzgDwCNk10fk^5`v1xnwd({q^Eo6?n#I%E-3CR z?z`gl2YB`9#jAH8PaZvZ$M@~7ntVK-aMQ-`s?cYW@I?O`q0j8U3V#^ zMxlWPO8tbouvn@6sQ+1}RDGUOhp$#DLH*lurJAVEqM%#l`Gdk5=Cl+9_XzG4+$XqS za8d9+!JLa5e?ag7!GnT_1eXLK6kHZu5j-q-MDQWO^p%^>VZjdyen{}cf{zG(MDU}6 z#{@qnSPQNSt_iLSHiE|mPY9kA>J|f=>v3R`7FzpBMas;FE%16#SClQ-WU>{EB79*{hcEdaA`R zT!NasQt*1gor3oW?iV~P_%X}#F{Te@t@bMQ9V#@HI-%6}j$!$s&GXfdmajxD3(uns zOG!H3rItDOHP*&^*v%`%X8BC zqh12B@YoJ$!17YmTq8IaEO%)kUuBu&VEI$G*fy5Hc3IITrLFi zu6qOclpXj+u$#wCV9uB2X2{(G=i=^j71$lK+A@7fA3L9}1+&oi>maU`Ypt$E`GIq2kPG~---H9%lyv$ZTW80XD#1@x&sf7v2ZWMLf!-M zy&~TSZMA$qnC}?v4?ujE$a|q9V3r)j*yXe7hE`d79_-5bX3ml2d|x-a>c#6`^uzxf z1M}hF0<;G28o3Ah3u5Vo>?^4HQp<&X%tH8}AL6%->wFR7_mXSxK4=}B<#?Ci9>F8v zVbf^(Ix%Gvm(93RWnD8kyTc0cWNj=v9jcR|YjCgRyL7lWB z?dP1+`@N(TdO_kw$+x1&1WDU`Kp$^2$B4{$H4Iwra5dxkzBG)(ce33VhV`Cl&w3O4 zJUuhs@-fRW@oE?k9zO+uTHfa0A63VQ%?#* z+V1uBgpGi-oyQ_#q5(5){B%Cz_-uac$&Bgznx+nqrG`ayQ=JF{ZqfNS23D}ljNd}q z!_BwsVK+Cnw2_&dWJj`I2qojtpFSY&JhKXy3K|Ku= zcLLg3pg02-$6DB^>ST!>Aq;9*;1=6f+(ekTt|*NWHx&%U7;()O0t8cbXXoz!7?#Q-I(Kw-WKL~HA?`Tw=oC7Z-(Y@Q7C;Ljx{iBdx|8`E z_s0Cj@Vmp@rUT+0m5+e=7r#x*p%oDGD?T*lQ_Q27KQV7&zQjC<`4RIX=0mHYHPBjU z9kd?W0BwXeL7O4wFU(uEKwBZ^C)=Ry5c3e`A6?K+Xcxr%f_Vk=3FZ;ZADA~VUtpfV z{D64@^MSok4(f(pgIAQgHA*5LmxmNLLWgNL!UsOLZ3mOLtj8& zLSI2&L*GE(LT8|UXdW~ly3l=|hYt!+57Y~BzvukJeGUs_ko%nd&;WD*8iasF1jZL;_1Kiki^-CY}bXw%4*ZhjQY~t@nNq zz8(Dk-rdGQ94ax=&ole*%3x1ydE&|4&@O=vRH}hcZAXkF{eGTwk=0qs;xd?agOFid0+qX8S?mFpR3+K^9=V8zFWu>OSPOf&!*3C#?$(&3kT7{*%|mQ z;9c_`?*R=4k`<}8vMbfD>?`$AR}xvtuvE*o8R<0nF7X$g31+%djmo63iOK7Aj-yy| zo9rioOCIR4d(l5T-*h>a>SV5CDtj`3(YGcQ=c=CWTRl4HBcR{ZOU=ywb{x;RXvXF% zok>|Sk03iHmb9l!`_|3$N>fN_6REZnX5z<({&=cC8QQ}lM2A1*JJ7>4%y7J?(@7Y^ zwa&b6MsVZl4xB$9NxLXSmu@{3YbENsbl^YBaC?4)?-R>#Z1TdV`4kJ;)@(_2W!U;; z^49byY{c-hXxeNb?8fHl-VljJ%EIIiU=GX!HaZK9KG@JK6gDs$myN>WVS}!N4M6`a zcoroaaS5>TSad8l78!qV%isZc2p)mQUOYjQ325$iK{5$VI D##WDl literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dem_color_text.utp b/gamma_age_v2/dem_color_text.utp new file mode 100644 index 0000000000000000000000000000000000000000..b2e2de72f23bc5c6d64ed24efe43bb5e62088704 GIT binary patch literal 1992 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 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/desolateanddespa.gic b/gamma_age_v2/desolateanddespa.gic new file mode 100644 index 0000000000000000000000000000000000000000..c188395999f7adae0edb8faac8b771fe79ea58e6 GIT binary patch literal 1224 zcmaiz+e-pL6vn5r`@QUb+inmM5*85=J*X9igrJlUJ+$d!!nz~t`r!Z3pV(vnLw#TF zEC+IF;N$%KX2v;Z=InhwYdxK%(w9o9By=>O)FI;Mpi+~FA45u25Wf&z#7aV`7UDMs zf*OZlDQx={8CxU9wusF-#$n-)2p$zY7Bb^R$Xt5>@eJ~b;B&#(f^&ikg3E$m1lK}l zZ9I#$%|d3FT=?5?La@wtO89evdDmv|s^Cp9&tiQ%+pMv`^m(7Gnand!L*{+5ehzb= zX76#&{^O@&{B(?e5#wLQ_%|_rCdR*u@gLx`UiJpxiOf5G4Vmv$3z;>)L#FmeaMpM1 zpyNAMq0tWbTQ{4IN9v87*1nmebL&-g#|s=|hTFo`N|i8M6K2u1yLqpywcB?1ucbiy zj+ig|je6bjBj?%fwsgY_jDh`C$9{981f!Gs1K&4;nyM`H-@(;I?FY8YrMxSC*X+w_ z$bxpEJ!l`Afq1{{)p=+ET7;6&60{7hKARrV;e Y;X9gn=3@q#?mycP`$TOJV54-9~$p8QV literal 0 HcmV?d00001 diff --git a/gamma_age_v2/desolateanddespa.git b/gamma_age_v2/desolateanddespa.git new file mode 100644 index 0000000000000000000000000000000000000000..aa229add816dc0df8e2d29a4dd77d8f0574f5d6d GIT binary patch literal 48315 zcmeI52YeLO+J{$~(u)Y#g9@S|0)n8ZBqRX>0U`-iG%U#y7B<4Cs~f+G z@nObKGJdl0Y~#a?2aS&~o?~3G^WzgTKGJxe@lnRZ#zz|;V?1I!-*|!XsPRJMV~rOX zFE$=CUSfQl@lxaCjZZLsit$s8pJtpxvMg3-7(dhaMB|f;Pd0v*@hQfq8lPtTY~xgi zvTZoW__@Zdr>ouRC9OOU4)a()d@#zc&7j z@o$ZPXZ(BPKN$bf_)o@vHvWt8UyZ9FV6)>1@qHKLRg70PUd?!Q<28)$YJ4~2HI3IY zUfXyb<8_VKGhW|#1LF;iH!{Av@y5pYFy6#?Q{&By?`eE5<9i$5$N0X+_cOk~@dV?| zjUQnAK;s7)Z(+Qp@q>-GGJc5hLyaG1ytVPejkhs=gz>h{nFQK9SDpEq7r*ZOjQDjY zqiT8GiQs*BQUw_zlJv z8Nbo^V&hAUFEzf*_)W%dHhzooTaDjl{C4BZjo)GXPUCkOUt#=iNv}@so{b8y{{wXnch69OJphL&irM&oe&Cc-Z)8<713RjOQCKFdj8tXnd^kBICuz zW5!F2k279se7x}q#!qpslUR?`nKE<28-fGG5zw9piP4 z*E3$vwH#y zsVtfX5(9yyxL=O~yT$8KU}7M!5ANp|`uXh5876;IS$>tk&n7>Eiw}N%jNpEKe8p_% ztHw7Pf6e&o#@{f$$@rVb-!lHT@y*8HG5)Uc_l&=9`~%}38vn@n$HqS~{;BcLjDK$Y z3*%oJ|H}B+#=kNCt?}=Se{cK;<3Aez$@tI4e=+{6@h!%6a$HugjaM;V)p#}I)s5FM zzN_)wjMp??%Xn?$b&S_FUe9=a;|+{AG~USg?#3G%-@|wl<4uh>Grp&D#cOZl`#4uU zoWg}Wzdp{u{d%_vS3L?$3*k*Lj2=&tHuH zYJ7|FK=tzFcQIbYcva)oj8`{a!}zYocQanocrD|#jn^?=*LXeS^^G?$-q3g>D#CTKZgeH(%H=tpRn!G@v@zb2E-cHB;`a28v>*HqJufKtM<@s5-Uw;ct{zGN? zRRWt#euw)0@_|5xb8Sxq_v`W-Zkx#tY%>0)@wbe>ZG5xwcZ|Pl{5|9E8~?!ghsHlL z{;}~-jDKqUGvl8d|HAl}#=kQDwefF^e{1|Z{ zsqtpU_cXqj@x6`fT+c6mU*r2Z*Lw-Zn>$w>nbM%V{?0N!&-fza%Z;x#zSj5#<@}bHAny@d2`R= z>mPt?o0Sd(zkX?3{G{*U=eP7TnI3GsmGMKI>$47p=?V<#Fwk}>wFZ4ZrNhC`Z-eVN zP&xt>8zsd<%P5BJK>J>)eSG4r;~yhhzXNDlx!OhFkHVFduVYh5-r2MG%h62ya*uJY za{tnx)E!)3y z-9NYA|4iIe7y5vH^RB|QFX%UQ<@W>qRxQtf4$e=&JL9VR{h6X#aBK8{FH;J zD^PweC^kwV*y33rFw%G)?k}f!?w9v|S>HXNdXH{eU-2A&%OCgM{oI$V+;^WyzGA5D z%5&S#Fy}w+yNg-ZkN=stwpV@k1-R1I_T4jGIqJJF!nH3FKuO-*vv>>-z<2iD+qdu5 zJtf+A>brGshddE<&xAY)Ry*&8>ofF0M9AX?vC#FLCS3{5x#Jf4a>(m*4vRyFFv2x}d&A z_h<0$U;1v{SK;^F!=0<|*8LEF)OYKi2K6bbp8?ljt8egqYx{297oyLq+;{7K3zerf zTlYH1)pwtX`+diGxYA$Uck6x&eRL3ZMBjbE#F<`yt?yjt=0RnBcX7Q1iHiB}jfJjq zF{#{lFD75*sqeniZU3L?yVtO;AOCf@_P_e>*Knn+?Ym!h<*4u0eIYyh?!WfDTldyz z->L7`JudP@&_G?D1iB|f-VJoGgFG1ycdowsSm)}ydplR(J=D4S?$OTGcTaGxzI(cJ z_1%}@e&4NokCf8mlkMUZzg^04#r&yl`#WsIwru~-b+_*^`Frv7`|gPxG^!4j&%0H3 z{JwjJbM@V`@IUIiFK3zU(RW|(KC5!yeJAs}(i@78@h+WtS&ck7-TKmPmT zYR}box5kyWw(maNm7~799j?_AKuO-*v-ox%fa^F=IuLg8to+)lW?Pv2mhOE`4mRG( z_&@!cc}Ie*eW$)V(Rm`?&v_Dlvh!|uzVl@KH0LS!dCt{$&vmZ8`$p&LyYF_czWXuf z>brG+lD0v8x9v)J^jVerZrxAj_uaaeORm0qU)=9I4$+FFzq;>U%Qh>XLD&)J z-5(BbQr3639C~cod3Pu~!Mm3Jd*|K9x|me%yL-48>byG>*Y>OL_J14L16Q6_ul#%W zLh}55k<9{r{Kw#a-#tMqlD4+*KE;)zzWWTEkOmS!N#5ME_%HioUx+{G+_z zyZz5SoIKShr8c0kl+qEP*eL1u?i!#_w1ZtiNxw@gw(63O1eGuEV7w!)xGR5KfA6M< zL~X*pZ1z=eU(G;UaDNCUB)f4&7b@4%K3NO@b8x2 znZNDFz<+BD{k~iEOKpex?nA+M``fqf-_`Q!$8~S6T>ZH2yXD`%{PwLjM$2S@?w#Ep z{df`ww?0e#xazsuME&;NpM1H_y-s$netb0U_aozQrN6o#*L}2#=Z@;f1KaR>#JOzS zZ^iQp^8I+;;9T*%9rxq83Rn88&Pp|vx8P7?WlV*bf5Hp5>FQQQi#_r&PN*0!*gMK)OX#R>&H`lxgXEN$oJ#f$+_aG z`(pig_QRDb$1|S0&|xIM5H z_o?cBU!}_9_5v3}jYChtwatHK+&+zU{rJzuH3ri)H{JWIw6){*1+E;8+pohlR7(IQ z`Oa~B{CMi*MI`Q>oon)Y_o?!BqUzM|joWW@`%c%~mOD?xA9Sv9`+Dcy@Hd@n-2S=q z6nu;GRJW zm)Vxj+M0F$-8O8^x;vNoXN}=i7j#XiHT6qv_3w?_JF|?I*SKB(7e%gddm^rOpz=Md zcHG{RWvF^yz1@~^<|qo$XH_1zPaxm#$EP}1KYk(Z_aj&0N|pQZ9evO0FuuED`*$3- z-%3n=E1qjy44bjt>zpf|ui$<>-^G>w>Uiq^7yVu1`6Ds$hrt zT&Z$A$>MB{di(G|l+aH)%-^6tP@zcg-N z0ZO{wuJN+=MH5icGEE_Im-2n_0PFhke+u`(1+Tuhba|Q_Y`m56L!9e#4+Z=G%M>rA*5F@P*Y$Q?Cs)$-b~f2dNAT(|(-v23 z6vKAFVd5oSZ&#lBOI>eo?p)W~eb@DNy{Bb#Oex7bdG^QSb}gpnx{J5`{6u};?~U8v z;R|TrY25y~^F(}$^CY|;Uq;JxgMFPROa(uWr99S%ji1)QkLQ0HlHsnq}|YG>3l(LP#w^CY&rSzX0Y11#t&<8{(1k$ zZG(hVdHj&8PJy(euA{Ezi!0_q&_0%r06*m*>Zg^T3x0nT!gus|>?30GTk-sfd_SJM z(kaLl&)so9p8Kn_ApOjk*2$?wX%J z{6DQ)UTuiR@qU^9ct&L^PJWqweu%uSX+th4*stvW$@aYOys~qUxpVgH%Gdeb|7)|x z#aZVd+BWSYwPEYreo@=@F|KXX`+1=Bd*>iac;9b-zGq#3pJtNDtoPf&2rWR`+H;T` zmRC7C2g$<~_XJRqH}@>Qod@9BUZn$J7teOw{km0M`K_7i`zh%h#6Mq@F zaNZ4%I#0$6ou}Yqou}eO&b#B2ocF*dJMW2~3taP!Rir?pa8h*d?v+=dgr{hmKKL=mu{9OEL z=jY+iIG=$(>->Ctz4Ht3=bX>PpLaeBe*sqStNq-WBx{5*QHhFVt8t8`teKxOMq;zUMy9HOUsz*m{Ph4bZjZz9G`gcxdksI zAo}jNLXEoda&B|W=(F_RolWbP{RUB`@I5d7EE;Hkd7mElB#O z#B;ofXE(mP_G9IEu6UwrqGGFf%^P03?0l+o-zU5J@ys;w44HV2{fEVKqKW6ke-qE6 z+fFGvK2N;k;<9+onew8V0 zrM^!$@w~^yL3RHL(q0 zs}fjU*5BR1y8ga<(v`_1@RD9gmG@mdHxSVHR_&qEeDHmNGF;l8<69M}@2K&ul0UwU z&&9{L8pmpxrG6&UWw15l+sGQP&gJy6xBX1SM_%>97x|KInRa;wRTRpIm7oRF{w@ zfoleS_jj~?f>w3a-&ZpzgJJ+5uf> z82Lbo=eo{NH4r~%*L4Qc#H6B7Frz417%GZ|LmU7}`6I%if>>rjZc1(HXW6Y-(j7uuX4eK!UQlFCIa89>iEEWls&&P`{pN|(^KA#ebcppwqGTRp` zDGDW|hl_O_4$g=chhyQWUl)c{njczeesI4ceV?Ge%8*L)S)u&GNH7-aA1dx28p-v+ zU`~8Py{+N@YJ`i5V||19er9^G!fYU^urL%X3Kryqva==>h5|i81-T(psWL`|3ZgN+ z6Hgh@qF7Nd981fM&!>cnbBe-+{^kX;f_ZMq_#`=6FfLS7T(6E!J_=&2p8@^X32;m`;}5c;h6TTp9X~s@`|(jhDu#VRxlhfvw_TLNkMLADAqk3 zFEJw$)ov(DX~k*z`Fy8fB%YO45DOI*l@!L@CZtEBzIqGvjb?<3@>AHUqrCZU(cB5$ z%y-U=1vwH6@-l)sV}g01KuRblI3X)s7XQqc2`(k1gvQ4|*u4_33iE7Fh512YwQ}Vt zc~r1`1{)NNjOowu;Ai&L(HD#)`9bd)j%7r{1u?&r3BS%CF zO8mtGrQt}#W{f0ucD_e6nwvTtM#G`?Tr%TwE8UU7bTWyeGO z{Q;xsBTE9;y5(PZMg6TDT)wHE4XHFgw9ia)#$r2Kd>m~?d6PcEN9d}V&XnDqbM9L zGDDc2Q5v}N%?oI#VCNZ`lusDqoT>-^-!!T7_uVZ(gY3sVOI9hFU#PQ1Nig3L9 z)$v`SeXm_mnw=YB#25?a>0Dq=+jzn9EhNp!FLU`ikLWunJ0&%>e`Z!v554WBTEX~< zK=!B+^(Zo@J*AEemPBIhE6!GWw`0Y3kE%G^x#H}R6=yrtkAKjpP|=9+IKo`gRydYTO)V`fY}>Y@zVl5-#=l$TSom?#`6aPP%gRpfpE@WbgVlD1)7$Ag z!x`IobVg$TTS2xdFK*kuo%YScf3QK7n(|CmE8m_l z=Vxs@d*vMd2jx`wVrf~aeOPbjVG@aj%A;9Yxbrait;0k^htg)%ew^vu7pN|W1z%bi?CD$ZAV_t%X7NL80=mYc^r zIeMo-usFLkmR&aAZd=x^XFiw9&(Q+!#A=QE;ClWC7kh7+PbQ-vuU#G1PRj`;7nS6X zh!A*f^ewsZjjqEb*c|_j`fPJSFnfIaa86E9{)l!e${L%kA-$X~Ww@UPP^ZkN>dc1b+HLI8qeD((^HEAEltn2LKOIHuwr z3680_M}lK2?vdb_ihCqDrs5t6j;Xjuf@6;UU-=%5*dM6{u_9eX>N7#tdc$0>QcbDu zYFPuWn0RmJySM8HBiZ?R*~(T{JGG>Jf_dQ_{lFHC4C0bakqYSQ7r+k~;haM6%~HKt zH(o$Ir@h(-UFs zFA^;+PAHC!j728U>he=hNDXY8gdw!FrBVG*NCV7e$^^=bgo3%WwR!Q42=NgVRXNq6 zY0hSmZ2x_A2L(AQThz6TH$@AiOZO!owJQX1gsXZw9&KiD43gziv4k*drP}QA|ydK(8d20 zNQLgu1A0Ol^n%_n11^A>Fbgh%3t=`~47!zHKdoN|m%|*G3s=BA&}}nU!PPJy7Qi)d zEi8oV;Ci?L7Qv0M7?!|NSOz!2&2S6c3b(=SupD$t$(?W)tbn`W9=I1)!hLW*tb*0> z0IY!r;URb!9)U;UF?bxFfG1%sJO%6EX?O;nh4t_pJP$9xi|`U`fS2JFcojCnYw$X} z0h{1WcnjW!&F~Jq3-7`E@Bw@XAHm1)3498l!ROF!7xp{oF~c1}j~G4*I>FI!40HiK z()Tzx9=bvzBtbVwh7?GJ?$87DDBd*a1-&61`aoaMqj2>o(G#FQWI`4UfPpXw2Ez~- z3VKBDFgOWLhHMxPK^Or!pq?cJBSDYR9R*<+4Pzhz`A`5+D1@<41bTFC3`$@el)`wJ z0H?sIa2lKrXMi5BI}s*!x!)+ zd<9>_H}EZd2j9aF@FV;LKf^EZD{KKZbh|(ms0!7fI@Ew&VK=A=wLp)XtpjzT9@K{h z&=4BI?$8+afF{rsn!%p17w8eS`@p`iAM6ha&>Rkc1K}WO0WINRXa$FW9%*|Rw1&f> z4IBY&p&hh`BcTIygrlGnbOt>F_ZT=8PKPrfvuVL99ZdVJ+wumbLed*EJJ3HQPMunJbg1F!}jgoof^cmy7W z$KY{z0-l7m@D!|rr{NiR7S_Xa@I1T#FTzW(0bYhz;8oZNufgl^1|(EvpTj}W0$M>! zI2aCrL*X!J4SJ+v8#n^mLOW;=M?wea2uDFD=nO~0G0+9{2*%^!c<2g=kObWz8B!n> zx32D#^^vK3^=mUMBA7sD@&>u1(3kJYI7zBf125!*ny}U>!US&%m>=9-f2e;RSdRUV;tqGVE22whs1# z{ow#efaY)@90V<(B^(T`;1DB^XTn671e4(`m;zH_8k`N&;T$*@&Vw0nK3o7ZVHR8nv*9AR7%qWJ;WD@! z=D=LI0_MS$a1~q)^I-v81J}YrxDKv|8(rglhTEpSc29AKX&<@(ekXU$40HiKX6iUN9=bvzBtbVwh7?GJ?x06c^@KF&1-&61`aoak2N`ez^ankj zDhmd{Ko|srVF(O`6JZ#f1Sf+YNi`gTFamNQ7eX)+@?aE%VKnHmRT0RC0*FE(jD;d7 zh8UE4Q_|!a0lE8cfks{8}5O7VI|xL_roe!4G+K?cn}_fhv5-;6dr@e;R$#W*1}V; z4xWZ*;8|D?&%yKX0=x(>!3KC4UV&F(BfJK$!~Qim-a(I(>IuE!AZP(C;b738rauG@ zg~OmV91d;Z2xtrKK#!q15;{OfI0`yJXE+*;fi7??90$ikS4ads0;d}!Lkgrqcjy6W z&8o*(1o^LpbAulYET_&fF60X8`OkaP#fw%U8o23p#e06 zMzA|HhW#M{n!^EbARGiOpd}m(t>6$i6!f?l{i*!Jp$!}XZJ`~sha;f_bcCZokCf4$ z%|9AaAQiep573{)PlI028`7Z<^aVX~CIe1@{*Vb-FaQR^AQ%ioU?`jj`ZMzxfOb zHlyodH@WLHiR5ug5n$LAplb=ZYT~V1llfXu8|pw^s0a0-0W^e0usbw{J)j9Rg=X;I za!p#7tCGP_noj{uQ{A*X(?sYAY0wLLLpt<F!7v1d!ig{p zPJ)vm8-_y=MnDeaLI_4e9*lx8jD|4~fqW={C=|k2D1u^$K?#h5QWy^t;1oC&PJ`3o z3^)@e!X%gsXTcPh3e(_hP)w$SpEQ3CXnL-jp2sv1&W8(NCd`5hVK!U@7sDlRDO?7Z z!yK3kSHL{D60U-)VLmK?Yv5W~2-m^&a04uY8(}dlfu*nvZi1WP7Pu8|gWF*_+yQsO zU9bY~hI`;%SPA#R{jdsF!vnAe9)ySBVR!@{g~#A=cmke;wV;?h1%A@}I?(iKH+_a_ zBCLn!;CXlfUWAum1H25cz^kwkUW3=+4cG*4!dvh*Y=(E>U3d@PhY#RG_y|6RPvBGd z3_gc1;7j-lzJ_n$TlfyXhacca_z8Z7U*K2R0{Sw$KozJ8)u1}mfL&oXs0p>8Hq?Q- zP!H-u184~R3pCP;OVZt4eq%S?gJ~l9O_?@>Jz+1{8}@;HVL#X(5}-L800+WB&;nY* z!O#j0fkWXiXbp!$8#n^mLOW;=M?wea2uDFD=nO~0G0+8$h2!9O=n9FD1l=GRQXmz& zLl5W)Y0wLLLpt<27{Om20uxM@KTNGP^QD+WEc+o^L`)E z^dvW*?WRGdiR9-n&4mz*ggh7pVHgc#AOiVN08uD}u}}oX5Q7pJ2c<9`Ccr6hDx3zV z!x?ZUOoT}=8P0+!Fcqf3*)Sc>fpg(Jm;vX*1uzq4!G$mzE`p2U61WsDgUewK%!Mmp z9$X1m!PPJy7Qi*2m|n|tA^1sp9WRRM^-LGRVpt0N3*6wQH@fK(H(kawk@s(AdJEhN zx54eO9PWTS;VxJKcf&n!FRX<7;C@&ItKk7y0}sMO@Gv|AkHTZ{I6MJQ!diF=*1^;8 z3_J_#;W>C7UVs8Hq?Q-P!H-u184}1V0UN?dq5Lt3e8|o*bDZC|Igo=y72kO z!f|jsbOrte5_w6Ikm^7;JQ-3T6}m$Y=m}}i3wlF3^Z`N{=*v_|-p{$_YeEL|{UHkm zLJ%TQ3X@?9XuT8MG}BE7Fs()YAf|(12n>Z2VHlhQCqp(22Q52-X%6H<2u4C4jDj$X zhB2UJ^O+Vv6bfN16hSe>pajN&mL1P@0-OS;!f9|ioB?OTM3@Bn9%s4fRHioRy=mnA EA5g$d@&Et; literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dm_journal_entry.dlg b/gamma_age_v2/dm_journal_entry.dlg new file mode 100644 index 0000000000000000000000000000000000000000..887bb4be43cf1b8c6e459d7345fdae997e64ebe8 GIT binary patch literal 1593 zcmai!OK%e~5Xa4%mNyhAZvz3!D?;so9zZCh5h@DLP>Q%z+pOCx+1Sypw@D-(R}TFE zaDW3R4jlP@@c%pOZB$k2NWY!2J@$<4^~}|u$hR})=~*GfKClk%g5NuZI1N3yTZo4{ zgjm=k#9y?>_6l(i`X2;JjPV00fpKREQHS0IFipJ6Z72}}`m_IQZbOMb0O15e6+)YS z6xtlW0S*AJO`**(Y6?4Z6PU#9?l_X96JmxJh_-&w%5NDAoBG47S)hkykf zKMeYS{fsxr^-*ZX;M`+?d!YYu@Ci^(3{~O7ruX@rk9i-iJ(06r{$KKSxYjqYRsP>| zALjo9`22suW~`Gyg6(4cf)C@6X>4+5Z8XKx^doqo^=*Y67t%d)O1)idQBy1U?ZbN(XK3;1ef?SQEN)u z_r`SQHDru-4r8K%KXscw{z_+5K&Tyq+7u$7Xy58Z9>iem#tIU3 zO{atSMNh+IIxJd3yvkIO3%j}1NTo%F^Ey=g|GZS1Hd<4@CB%GMZAJ0Miteb2*~9&g zuGg?ZVk5okUB-29sTaiUrCxW$XPvh-2xe(32axxsjQ(cswjxELQxfxdRp@7S&sTMTv!iMTifBKRb&JiwqwO9|emE z9|Io&3&I58$?&mEf-`_c>l`=_E`W>R5|H3BxB{+%61WDg0~S&~Hs*XA+yTtj=j`*Q M_PN7!LLctqKkQl3aR2}S literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_500xp.uti b/gamma_age_v2/dmfi_500xp.uti new file mode 100644 index 0000000000000000000000000000000000000000..f90d0c91d8cb9d377ae096d4917b1c50581ca502 GIT binary patch literal 1231 zcmah}+iuf95M7|<67Ep$x8)5aR25Jq9%&PyMru*igo+2GY7}DqK23@`La{0w8rPL|l1E7IlCzQGaoxu4My1k&( zSLkoh7oh(@pwu;fAREA$YNb>Z*5`vwwFrPx-3Azc65u}9%)1iSpjREB1u*72KsjA2 z#eL@a%^=8GfV|{87uHZ!JpDXBUkCHiPq|pD>U#;_N5JI(I>~tjU_94Xfkt?5)=2+# zfVEPVfa+nOZ_p9sCUgWeoXpd3c0)nraI2JyZDSwWn9O zTncZc+_bDD*t2jw)t?UiEN`-d5A_brFljurcT6&EY*3pta5F<~ADzJcvyrUjxtOBf zPsDracItA#pQd=dVBxok(y`rLU0L~*KZcVd)U+a7tF!f{t9hN7#u@#-$KIPiM4~VM z`1oTEVq5Bc8%@OPiTx<0_Oa-Ej%m5oIyh*p&-8|gv(h>JB<5nbjBWNhc0M&WSsuCc z=`%ecZ`z`>B07sUi$`R#gGO`(Y swl+tOWAG5*=<&LI2aW+pY6;*7adg<;Y-|1{-39Ie_kjlh^EUba0=06iJOBUy literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_activate.ncs b/gamma_age_v2/dmfi_activate.ncs new file mode 100644 index 0000000000000000000000000000000000000000..bb781f0da9c2e5b9605f49ce38b1f9bff22ede7a GIT binary patch literal 15208 zcmb_jTWlRi8Qwh?Ut%ZCwMm*wr@6FA+BkM@Zd{QjsS^}%ZgrFZy;$pW*6~TsIcv@y z+i@Qt1p%sffCnyxr#=+52#Gg90ttx+q$1LX3L!wML@W9bsTH)e5|Ky=-~9i~?#!Ou zV>?M6?CkD;`R4!s`RAX1#;2be6&D8j`j0uz6O)@A{Ob}wTa4DrRmr5 z?(N&RZ_0Ph!5n_}(3hsyxa2qK+b8k2rSz>Dl)PposMFUE>FbYj2I=c=E>Dj)oPty= z&TMd?;}*U9fZq-Nw2+sO=pAc+Qflv-tcF#uerc>{>x202K0*YyNXZi}^Q;jD*J0Mo z6gOOmSOyVer{+c=W!k&s6YV=BU@%Vt9C`(C81ko5=}Md9v{y5^4&@(P4k+^9x=r%u zj3MPcrvL#fz8Fjkui=Yu%J;5R>X(E;^0rd6dMhX&?GxwcrhM_tj@e1CDdxa8>(!g0 z8HmuE6P3CcZ+N9Eely(p-0H1GC$}sQuN9uW<~TsxnIlWykT5p?hpoysF)YG%Bu`D1 zlpS+rBI`|(^=h()A2!+K&a=`k27U|?Fa9h|%TXg~>3ig5d_SDS_@qmZ;NjyUW22uR z5ZaTZ8g7D^Wm@Y*P^|{DO7G8!f}?GhE4}Z0$AAHUN!HWBtYEf;nHlD%fI(J^e72f= zHk5eYP$(RM0#eB#{8~=%BO(+-=)fb>;6d4)MzZOv!~`mkEvJ!8*DEt)#*ASoLu?)d zHwah8gx2(7(wCXk3iDzj%;n%?A*G-`LpWG~5u-fbRctw6?{*X8N?2lmD0ynp^of-C zjnJ!d#(ChL=$x0|>R_vo7vgu(2 zN*6+a$ZLXXswsmIb64_uV)zvEQV8yI2`tUk4WHMhflf}M{?(~!Q1%;ao$ihJz?0FN zn5b4toO(GFH|L;vmmcUoQ1bL-^YOf}ctP-BflU>OEmunZxOa(gELN=IwZ+~?&P9fq zPx8T3z)5yncp^h&qCSu+JHc&>X7dBLUkjR?=hN)5KUK2LYzyXvGxQrXej^j`-c+$B zt1Wa1S-CybfmE3Wr!A7L2JoM|FMn6rFGB8f9i^u||Bh zxR!lK+UVP1dpC$wu0L( zr4hR=oI~TXSE-KOMQ9oPws%es` zBs}NlIy46!c@yD&&vR<#ZU-u~ z+%_krO68JXZD)Q>YWUSUuHN3J&Bi*nXA1%0y#**@K<+o99WIrl>$xa}!k%c?K(C&m zpRhyv2MIBiBTpajV|!u%o8+$j$%Wg1Fu$V)1p7bll0jfru0^H1|M~R)n?%cwZOL8i z-u$D=nVbidGk;5rc!ku$j2Gl0c|LAeutkT=tv)b;e5I`QC%qX|`9$rP1)GvYGMn5! zg7khdTWL;WH{c5rFD_D2R$EIci*g_3>#<6`(yVw@4EW!2kG?O*e(2>5%zyc*Jr5ca zMd$QLC2ab2xuZDAA}cTWQKF&dG{gN*uREiky`V;H#~s$2}oL!k|hn@CZx%{9ED1NoCf(P-hcJB zVMb&hZcx%YV0Nx`*bA;<3RQvd9vV4qTV8hkIfWQ@;}Qrt)l|Gt^)DvWQ~mIwff(kq zO=~#!S$1x>2*xk_rDoWtoSe*iT~15hGd81Y)?C+up|1U`A;JY`j@;ELNNk%jr1xZ3 z>h2R{=l$A$(I|{6oJZ>ZSdSF$-xc*!jiQ#~9IaMa)DkV6PoE#4Cw!*gh~eHXs_Y$7 zA*lQPQY*y25!IojOZ8OuN5m_rCL)Msf5MxtHi^kj1JP2+b2g=-=84&nOHghgJv>4z zcW58Kh}o^j08JfSckwHpVbrb731kr?2q}HLU*Aq}`&Zq-JmNdHT$2a-!MBUd#Uq_&a5K9y>k&=)aen7d1oo zM)ph+U^ED>b2#2`H&QNhc2H5ZB3hzQH_mv~3Z3;Rx>(WP`4mM2O3}6jDq^}=(Z2Z< zMFdLG_5~_px>(Wv`4mM2O3}j$RK#?#q670OiU^dVM;54v>0(6(=Tj6BC`CIKsEFxe zMT7GxiU^dVoeNaNbg`nx=Tj6BC`G##sEFxeMTh276cH#zk1kLV(-~9RI%-i1&KGjB zuw2C*F|USW=UPy%OjJ~RohyWWIXf4UOr&EVf0p_Z=N=4UZMVEdNtsW=Q_?qQUL$=oC7&{KakHRPMlHu!|347YR=l38O}E@3V=yTjZ+9(d z9~v6Mp&Y8jxDt6dXAL$O7W$z^^$`?XxWLzK^N+{YXFAXlWbP>DW| z3j@T-i2GXcRDF+_<2Zx=z>|lcb;6(tzm1mg|R=%hmM{UIDvC z{iZx74WT}=(CY6q>>jf1l0VWDFWt;_KN&!?il?zxK+B;_od!!h_fE0uU8;wZm5HXM zWse?7JjHg?6w~iPofJTyc*8+$nGG7mkT@!})MP0@s)o3rqG|*)Sd|6r-9%KI%g8$?ik?-K6?wrjsbZ{%|?V)p+4+f1m?7CW?FaUTbZEK zSd*v?yAD&v6sJ_mTm(jTo@~>PO?i#xoP}>76JL_e!bT5>eltQH0m;R)q(T;9d*a1o z8x>(oM-k#xUv0M~tD*tl*4RJCfK-qeYNQqzqN&dd{gYR zVZP#lWH}WyWXf%E9r-$T9UdWJHCHWQ9;*jqUcFM2<~5S_vKyoojy7D#(U{6huH^Nb zGU&rG#HVrLOB^K?xIn1W)R_|}^c3L48zs{SFz-?sFi(MoKQ%2I$wA%1`t@k~>UfU{ z=@Yl_9+&a{kO3@`CXSXbW5tzeen?RGb<@w4#Lf8fd27drxe&F*AeOVAKQVzmMtQo? zf^q5JZ7&*#(^!+Jjl_AJbckW4zg95lw?G-J1!vg)fP8ZEW9Bc{@T3 zOX+urlG_X8zE?}LY45i)VYV_RajuVX9)tY5wI?eKn;3D5_j}%*2dT-}2I(l|-z`#} zNg>X}yqdfXWIDd*P$teKTN0%ap`-G=?XG7ON1B>Z$p~HY-Ate@d`YD1V$bWjw73wZ zjQF8kXgb&H-YqHNCGH`rz=pXUCbTm1e2*$x;)qHPcp%)!C8i?Y zvPa@7m;@q4qwZA)GFo~XHOQjMy!$0QZPZ9pYTg5Sc))@!6FQxlr4Oy$pkQ=ym6nZ8 zB2H4{RfMkVeLQWC(NR4W^4W$3BVPJ6%=}0&OQz$p2y*fxXD-_M;;M*kcPJluCX?KP zCsU`fst`P?qVxd_R3@QmE47wG+JO+7Quaj9QU#c>I)8yDV-=1H1+2!QMt1h;lNXMj zKW=+hi{`DF#?zvCp6yMitZR0~UW;}q%5%pqig6D&XvcjV&sPGzJxSXt8DWJZui!jH z$3Eo-eMc~7B`MVBE~*|c?SH02im5*fdhFhlV03uKJ;Yhdv!g+eA_ zhF~iS(wD5_BN5)zC92iB@~AzsZpQjjc#DtZ)95U$Ab2niBE6nOwb{Y`zJ8*QBD?4q zE2XCA^#^~rlcY70a-vE(&`N9oNfZhL{rxFG9*BWkrCNWV+5e$@zu6#7uI?#FIC71) zRXi@E(~~nBr4o$YT%*}-+>aPs*k^0D$@XHdLZK(qh{&JTO;Yx zpW<6eT5`y%a_Cq2?xmK_-owb!14A2&x0*~$&H+EaBhz&7|J4Z~zUdL@->9oDMyodo zz>budZjyjr7C=8gX)EUZy%96ISTV2!4JPF`26vhV^Pz&CLZq2Nd~Pwsry^oG9V17j z27%ivE5NKfH{?rqsU*Rr-`V)j4fzA{;_!ZU42!x~<6A`hsYmkQIt+hmT;guK@eTQX zc5I5Syp}v%hl>Y`q+(Czv=}0CLtr=S-%57^YP+{MCwEnQ3mUZ%{%A zo0zW0e?F2;OH$GD^=cd%8I&4Ti-Rrz8B)5AA*q#UjS!>o3y~+0j*V~KeBiI{&IsrK DBo^_b literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_activate.nss b/gamma_age_v2/dmfi_activate.nss new file mode 100644 index 00000000..24687f6c --- /dev/null +++ b/gamma_age_v2/dmfi_activate.nss @@ -0,0 +1,345 @@ +//:://///////////////////////////////////////////// +//:: DMFI - widget activation processor +//:: dmfi_activate +//::////////////////////////////////////////////// +/* + Functions to respond and process DMFI item activations. +*/ +//::////////////////////////////////////////////// +//:: Created By: The DMFI Team +//:: Created On: +//::////////////////////////////////////////////// +//:: 2008.05.25 tsunami282 - changes to invisible listeners to work with +//:: OnPlayerChat methods. +//:: 2008.07.10 tsunami282 - add Naming Wand to the exploder. +//:: 2008.08.15 tsunami282 - move init logic to new include. + +#include "dmfi_init_inc" + +//////////////////////////////////////////////////////////////////////// +void dmw_CleanUp(object oMySpeaker) +{ + int nCount; + int nCache; + DeleteLocalObject(oMySpeaker, "dmfi_univ_target"); + DeleteLocalLocation(oMySpeaker, "dmfi_univ_location"); + DeleteLocalObject(oMySpeaker, "dmw_item"); + DeleteLocalString(oMySpeaker, "dmw_repamt"); + DeleteLocalString(oMySpeaker, "dmw_repargs"); + nCache = GetLocalInt(oMySpeaker, "dmw_playercache"); + for(nCount = 1; nCount <= nCache; nCount++) + { + DeleteLocalObject(oMySpeaker, "dmw_playercache" + IntToString(nCount)); + } + DeleteLocalInt(oMySpeaker, "dmw_playercache"); + nCache = GetLocalInt(oMySpeaker, "dmw_itemcache"); + for(nCount = 1; nCount <= nCache; nCount++) + { + DeleteLocalObject(oMySpeaker, "dmw_itemcache" + IntToString(nCount)); + } + DeleteLocalInt(oMySpeaker, "dmw_itemcache"); + for(nCount = 1; nCount <= 10; nCount++) + { + DeleteLocalString(oMySpeaker, "dmw_dialog" + IntToString(nCount)); + DeleteLocalString(oMySpeaker, "dmw_function" + IntToString(nCount)); + DeleteLocalString(oMySpeaker, "dmw_params" + IntToString(nCount)); + } + DeleteLocalString(oMySpeaker, "dmw_playerfunc"); + DeleteLocalInt(oMySpeaker, "dmw_started"); +} + +//////////////////////////////////////////////////////////////////////// +void main() +{ + object oUser = OBJECT_SELF; + object oItem = GetLocalObject(oUser, "dmfi_item"); + object oOther = GetLocalObject(oUser, "dmfi_target"); + location lLocation = GetLocalLocation(oUser, "dmfi_location"); + string sItemTag = GetTag(oItem); + + // listening system initialization moved to new function + dmfiInitialize(oUser); + + dmw_CleanUp(oUser); + + if (GetStringLeft(sItemTag,8) == "hlslang_") + { + // Remove voice stuff + string ssLanguage = GetStringRight(sItemTag, GetStringLength(sItemTag) - 8); + SetLocalInt(oUser, "hls_MyLanguage", StringToInt(ssLanguage)); + SetLocalString(oUser, "hls_MyLanguageName", GetName(oItem)); + DelayCommand(1.0f, FloatingTextStringOnCreature("You are speaking " + GetName(oItem) + ". Type [(what you want to say in brackets)]", oUser, FALSE)); + return; + } + + if (GetStringLeft(sItemTag, 8) == "dmfi_pc_") + { + if (GetStringLeft(sItemTag, 12) == "dmfi_pc_rest") + { + CreateObject(OBJECT_TYPE_PLACEABLE, "dmfi_rest" + GetStringRight(sItemTag, 3), GetLocation(oUser)); + return; + } + if (sItemTag == "dmfi_pc_follow") + { + if (GetIsObjectValid(oOther)) + { + FloatingTextStringOnCreature("Now following "+ GetName(oOther),oUser, FALSE); + DelayCommand(2.0f, AssignCommand(oUser, ActionForceFollowObject(oOther, 2.0f))); + } + return; + } + SetLocalObject(oUser, "dmfi_univ_target", oUser); + SetLocalLocation(oUser, "dmfi_univ_location", lLocation); + SetLocalString(oUser, "dmfi_univ_conv", GetStringRight(sItemTag, GetStringLength(sItemTag) - 5)); + AssignCommand(oUser, ClearAllActions()); + AssignCommand(oUser, ActionStartConversation(OBJECT_SELF, "dmfi_universal", TRUE)); + return; + } + + if (GetStringLeft(sItemTag, 5) == "dmfi_") + { + int iPass = FALSE; + + if (GetIsDM(oUser) || GetIsDMPossessed(oUser)) + iPass = TRUE; + + if (!GetIsPC(oUser)) + iPass = TRUE; + + if (!iPass) + { + FloatingTextStringOnCreature("You cannot use this item." ,oUser, FALSE); + SendMessageToAllDMs(GetName(oUser)+ " is attempting to use a DM item."); + return; + } + + if (sItemTag == "dmfi_exploder") + { + if(!GetIsObjectValid(GetItemPossessedBy(oOther, "dmfi_afflict"))) CreateItemOnObject("dmfi_afflict", oOther); + if(!GetIsObjectValid(GetItemPossessedBy(oOther, "dmfi_dicebag"))) CreateItemOnObject("dmfi_dicebag", oOther); + if(!GetIsObjectValid(GetItemPossessedBy(oOther, "dmfi_pc_dicebag"))) CreateItemOnObject("dmfi_pc_dicebag", oOther); + if(!GetIsObjectValid(GetItemPossessedBy(oOther, "dmfi_pc_follow"))) CreateItemOnObject("dmfi_pc_follow", oOther); + if(!GetIsObjectValid(GetItemPossessedBy(oOther, "dmfi_pc_emote"))) CreateItemOnObject("dmfi_pc_emote", oOther); + if(!GetIsObjectValid(GetItemPossessedBy(oOther, "dmfi_server"))) CreateItemOnObject("dmfi_server", oOther); + if(!GetIsObjectValid(GetItemPossessedBy(oOther, "dmfi_emote"))) CreateItemOnObject("dmfi_emote", oOther); + if(!GetIsObjectValid(GetItemPossessedBy(oOther, "dmfi_encounter"))) CreateItemOnObject("dmfi_encounte", oOther); + if(!GetIsObjectValid(GetItemPossessedBy(oOther, "dmfi_faction"))) CreateItemOnObject("dmfi_faction", oOther); + if(!GetIsObjectValid(GetItemPossessedBy(oOther, "dmfi_fx"))) CreateItemOnObject("dmfi_fx", oOther); + if(!GetIsObjectValid(GetItemPossessedBy(oOther, "dmfi_music"))) CreateItemOnObject("dmfi_music", oOther); + if(!GetIsObjectValid(GetItemPossessedBy(oOther, "dmfi_sound"))) CreateItemOnObject("dmfi_sound", oOther); + if(!GetIsObjectValid(GetItemPossessedBy(oOther, "dmfi_voice"))) CreateItemOnObject("dmfi_voice", oOther); + if(!GetIsObjectValid(GetItemPossessedBy(oOther, "dmfi_xp"))) CreateItemOnObject("dmfi_xp", oOther); + if(!GetIsObjectValid(GetItemPossessedBy(oOther, "dmfi_500xp"))) CreateItemOnObject("dmfi_500xp", oOther); + if(!GetIsObjectValid(GetItemPossessedBy(oOther, "dmfi_en_ditto"))) CreateItemOnObject("dmfi_en_ditto", oOther); + if(!GetIsObjectValid(GetItemPossessedBy(oOther, "dmfi_mute"))) CreateItemOnObject("dmfi_mute", oOther); + if(!GetIsObjectValid(GetItemPossessedBy(oOther, "dmfi_peace"))) CreateItemOnObject("dmfi_peace", oOther); + if(!GetIsObjectValid(GetItemPossessedBy(oOther, "dmfi_voicewidget"))) CreateItemOnObject("dmfi_voicewidget", oOther); + if(!GetIsObjectValid(GetItemPossessedBy(oOther, "dmfi_remove"))) CreateItemOnObject("dmfi_remove", oOther); + if(!GetIsObjectValid(GetItemPossessedBy(oOther, "dmfi_dmw"))) CreateItemOnObject("dmfi_dmw", oOther); + if(!GetIsObjectValid(GetItemPossessedBy(oOther, "dmfi_target"))) CreateItemOnObject("dmfi_target", oOther); + if(!GetIsObjectValid(GetItemPossessedBy(oOther, "dmfi_buff"))) CreateItemOnObject("dmfi_buff", oOther); + if(!GetIsObjectValid(GetItemPossessedBy(oOther, "dmfi_dmbook"))) CreateItemOnObject("dmfi_dmbook", oOther); + if(!GetIsObjectValid(GetItemPossessedBy(oOther, "dmfi_playerbook"))) CreateItemOnObject("dmfi_playerbook", oOther); + if(!GetIsObjectValid(GetItemPossessedBy(oOther, "dmfi_jail_widget"))) CreateItemOnObject("dmfi_jail_widget", oOther); + // 2008.07.10 tsunami282 - add naming wand to the exploder + if(!GetIsObjectValid(GetItemPossessedBy(oOther, "dmfi_naming"))) CreateItemOnObject("dmfi_naming", oOther); + return; + } + if (sItemTag == "dmfi_peace") + { //This widget sets all creatures in the area to a neutral stance and clears combat. + object oArea = GetFirstObjectInArea(GetArea(oUser)); + object oP; + while (GetIsObjectValid(oArea)) + { + if (GetObjectType(oArea) == OBJECT_TYPE_CREATURE && !GetIsPC(oArea)) + { + AssignCommand(oArea, ClearAllActions()); + oP = GetFirstPC(); + while (GetIsObjectValid(oP)) + { + if (GetArea(oP) == GetArea(oUser)) + { + ClearPersonalReputation(oArea, oP); + SetStandardFactionReputation(STANDARD_FACTION_HOSTILE, 25, oP); + SetStandardFactionReputation(STANDARD_FACTION_COMMONER, 91, oP); + SetStandardFactionReputation(STANDARD_FACTION_MERCHANT, 91, oP); + SetStandardFactionReputation(STANDARD_FACTION_DEFENDER, 91, oP); + } + oP = GetNextPC(); + } + AssignCommand(oArea, ClearAllActions()); + } + oArea = GetNextObjectInArea(GetArea(oUser)); + } + } + + // update / remove invisible listeners as needed for onplayerchat + if (sItemTag == "dmfi_voicewidget") + { + object oVoice; + if (GetIsObjectValid(oOther)) // do we have a valid target creature? + { + // 2008.05.29 tsunami282 - we don't use creature listen stuff anymore + SetLocalObject(oUser, "dmfi_VoiceTarget", oOther); + + FloatingTextStringOnCreature("You have targeted " + GetName(oOther) + " with the Voice Widget", oUser, FALSE); + + if (GetLocalInt(GetModule(), "dmfi_voice_initial")!=1) + { + SetLocalInt(GetModule(), "dmfi_voice_initial", 1); + SendMessageToAllDMs("Listening Initialized: .commands, .skill checks, and much more now available."); + DelayCommand(4.0, FloatingTextStringOnCreature("Listening Initialized: .commands, .skill checks, and more available", oUser)); + } + return; + } + else // no valid target of voice wand + { + //Jump any existing Voice attached to the user + if (GetIsObjectValid(GetLocalObject(oUser, "dmfi_StaticVoice"))) + { + DestroyObject(GetLocalObject(oUser, "dmfi_StaticVoice")); + } + //Create the StationaryVoice + object oStaticVoice = CreateObject(OBJECT_TYPE_CREATURE, "dmfi_voice", GetLocation(oUser)); + //Set Ownership of the Voice to the User + SetLocalObject(oUser, "dmfi_StaticVoice", oVoice); + SetLocalObject(oUser, "dmfi_VoiceTarget", oStaticVoice); + DelayCommand(1.0f, FloatingTextStringOnCreature("A Stationary Voice has been created.", oUser, FALSE)); + return; + } + return; + } + if (sItemTag == "dmfi_mute") + { + SetLocalObject(oUser, "dmfi_univ_target", oUser); + SetLocalString(oUser, "dmfi_univ_conv", "voice"); + SetLocalInt(oUser, "dmfi_univ_int", 8); + ExecuteScript("dmfi_execute", oUser); + return; + } + //encounter ditto widget + if (sItemTag == "dmfi_en_ditto") + { + SetLocalObject(oUser, "dmfi_univ_target", oOther); + SetLocalLocation(oUser, "dmfi_univ_location", lLocation); + SetLocalString(oUser, "dmfi_univ_conv", "encounter"); + SetLocalInt(oUser, "dmfi_univ_int", GetLocalInt(oUser, "EncounterType")); + ExecuteScript("dmfi_execute", oUser); + return; + } + //Change target widget + if (sItemTag == "dmfi_target") + { + SetLocalObject(oUser, "dmfi_univ_target", oOther); + FloatingTextStringOnCreature("DMFI Target set to " + GetName(oOther),oUser); + } + //Destroy object widget + if (sItemTag == "dmfi_remove") + { + object oKillMe; + //Targeting Self + if (oUser == oOther) + { + oKillMe = GetNearestObject(OBJECT_TYPE_PLACEABLE, oUser); + FloatingTextStringOnCreature("Destroyed " + GetName(oKillMe) + "(" + GetTag(oKillMe) + ")", oUser, FALSE); + DelayCommand(0.1f, DestroyObject(oKillMe)); + } + else if (GetIsObjectValid(oOther)) //Targeting something else + { + FloatingTextStringOnCreature("Destroyed " + GetName(oOther) + "(" + GetTag(oOther) + ")", oUser, FALSE); + DelayCommand(0.1f, DestroyObject(oOther)); + } + else //Targeting the ground + { + int iReport = 0; + oKillMe = GetFirstObjectInShape(SHAPE_SPHERE, 2.0f, lLocation, FALSE, OBJECT_TYPE_ALL); + while (GetIsObjectValid(oKillMe)) + { + iReport++; + DestroyObject(oKillMe); + oKillMe = GetNextObjectInShape(SHAPE_SPHERE, 2.0f, lLocation, FALSE, OBJECT_TYPE_ALL); + } + FloatingTextStringOnCreature("Destroyed " + IntToString(iReport) + " objects.", oUser, FALSE); + } + return; + } + if (sItemTag == "dmfi_500xp") + { + SetLocalObject(oUser, "dmfi_univ_target", oOther); + SetLocalLocation(oUser, "dmfi_univ_location", lLocation); + SetLocalString(oUser, "dmfi_univ_conv", "xp"); + SetLocalInt(oUser, "dmfi_univ_int", 53); + ExecuteScript("dmfi_execute", oUser); + return; + } + if (sItemTag == "dmfi_jail_widget") + { + if (GetIsObjectValid(oOther) && !GetIsDM(oOther) && oOther != oUser) + { + object oJail = GetObjectByTag("dmfi_jail"); + if (!GetIsObjectValid(oJail)) + oJail = GetObjectByTag("dmfi_jail_default"); + AssignCommand(oOther, ClearAllActions()); + AssignCommand(oOther, JumpToObject(oJail)); + SendMessageToPC(oUser, GetName(oOther) + " (" + GetPCPublicCDKey(oOther) + ")/IP: " + GetPCIPAddress(oOther) + " - has been sent to Jail."); + } + return; + } + + if (sItemTag == "dmfi_encounter") + { + + if (GetIsObjectValid(GetWaypointByTag("DMFI_E1"))) + SetCustomToken(20771, GetName(GetWaypointByTag("DMFI_E1"))); + else + SetCustomToken(20771, "Encounter Invalid"); + if (GetIsObjectValid(GetWaypointByTag("DMFI_E2"))) + SetCustomToken(20772, GetName(GetWaypointByTag("DMFI_E2"))); + else + SetCustomToken(20772, "Encounter Invalid"); + if (GetIsObjectValid(GetWaypointByTag("DMFI_E3"))) + SetCustomToken(20773, GetName(GetWaypointByTag("DMFI_E3"))); + else + SetCustomToken(20773, "Encounter Invalid"); + if (GetIsObjectValid(GetWaypointByTag("DMFI_E4"))) + SetCustomToken(20774, GetName(GetWaypointByTag("DMFI_E4"))); + else + SetCustomToken(20774, "Encounter Invalid"); + if (GetIsObjectValid(GetWaypointByTag("DMFI_E5"))) + SetCustomToken(20775, GetName(GetWaypointByTag("DMFI_E5"))); + else + SetCustomToken(20775, "Encounter Invalid"); + if (GetIsObjectValid(GetWaypointByTag("DMFI_E6"))) + SetCustomToken(20776, GetName(GetWaypointByTag("DMFI_E6"))); + else + SetCustomToken(20776, "Encounter Invalid"); + if (GetIsObjectValid(GetWaypointByTag("DMFI_E7"))) + SetCustomToken(20777, GetName(GetWaypointByTag("DMFI_E7"))); + else + SetCustomToken(20777, "Encounter Invalid"); + if (GetIsObjectValid(GetWaypointByTag("DMFI_E8"))) + SetCustomToken(20778, GetName(GetWaypointByTag("DMFI_E8"))); + else + SetCustomToken(20778, "Encounter Invalid"); + if (GetIsObjectValid(GetWaypointByTag("DMFI_E9"))) + SetCustomToken(20779, GetName(GetWaypointByTag("DMFI_E9"))); + else + SetCustomToken(20779, "Encounter Invalid"); + } + if (sItemTag == "dmfi_afflict") + { + int nDNum; + + nDNum = GetLocalInt(oUser, "dmfi_damagemodifier"); + SetCustomToken(20780, IntToString(nDNum)); + } + + + SetLocalObject(oUser, "dmfi_univ_target", oOther); + SetLocalLocation(oUser, "dmfi_univ_location", lLocation); + SetLocalString(oUser, "dmfi_univ_conv", GetStringRight(sItemTag, GetStringLength(sItemTag) - 5)); + AssignCommand(oUser, ClearAllActions()); + AssignCommand(oUser, ActionStartConversation(OBJECT_SELF, "dmfi_universal", TRUE, FALSE)); + } +} + diff --git a/gamma_age_v2/dmfi_afflict.uti b/gamma_age_v2/dmfi_afflict.uti new file mode 100644 index 0000000000000000000000000000000000000000..6313c9e5a8d7f5b657d5f8fd4bd5203e8b56be2e GIT binary patch literal 1464 zcmY*Z&5qPY5H<-UWI_TVK$2S>a#)nrN)ScLA%|Udg|M_sM(l(rC)8t?Jq>NQ)!klX z6!A=XlRN^C0^etQmZ7AY>iYYtx?NL$t#Wz(>%qg{vn=}zyafLQ{`blxZ+xC*hj5%; z%d!&o{~)hJz6U{MxA_Bl0{#;GHIp%7+V~5-%vdZir7849 z>VuXH<~5{JE!UVDF;xP73WIHHdguCR7cBx5x5BIs8V*GMLAAo5x$zDy9Gc literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_arrays_inc.nss b/gamma_age_v2/dmfi_arrays_inc.nss new file mode 100644 index 00000000..b777fcc8 --- /dev/null +++ b/gamma_age_v2/dmfi_arrays_inc.nss @@ -0,0 +1,177 @@ +//:://///////////////////////////////////////////// +//:: DMFI - array functions include +//:: dmfi_arrays_inc +//::////////////////////////////////////////////// +/* + Functions to use object-attached local variables as arrays. +*/ +//::////////////////////////////////////////////// +//:: Created By: Noel +//:: Created On: November 17, 2001 +//::////////////////////////////////////////////// +//:: 2007.12.24 tsunami282 - yanked most of these routines from Bioware's +//:: nw_o0_itemmaker, then expanded for bounds management. + +int GetLocalArrayLowerBound(object oidObject, string sVarName); +int GetLocalArrayUpperBound(object oidObject, string sVarName); +void SetLocalArrayLowerBound(object oidObject, string sVarName, int nMin); +void SetLocalArrayUpperBound(object oidObject, string sVarName, int nMax); + +//////////////////////////////////////////////////////////////////////// +int GetLocalArrayInitialized(object oidObject, string sVarName) +{ + string sFullVarName = sVarName + "_INIT"; + return GetLocalInt(oidObject, sFullVarName); +} + +//////////////////////////////////////////////////////////////////////// +void InitializeLocalArray(object oidObject, string sVarName) +{ + int i, iBegin, iEnd; + string sFullVarName; + + if (GetLocalArrayInitialized(oidObject, sVarName)) + { + // wipe current contents + iBegin = GetLocalArrayLowerBound(oidObject, sVarName); + iEnd = GetLocalArrayUpperBound(oidObject, sVarName); + for (i = iEnd; i >= iBegin; i--) + { + sFullVarName = sVarName + IntToString(i); + DeleteLocalInt(oidObject, sFullVarName); + DeleteLocalFloat(oidObject, sFullVarName); + DeleteLocalString(oidObject, sFullVarName); + DeleteLocalObject(oidObject, sFullVarName); + DeleteLocalLocation(oidObject, sFullVarName); + } + } + + SetLocalArrayLowerBound(oidObject, sVarName, 0); + SetLocalArrayUpperBound(oidObject, sVarName, -1); + sFullVarName = sVarName + "_INIT"; + SetLocalInt(oidObject, sFullVarName, TRUE); +} + +//////////////////////////////////////////////////////////////////////// +int GetLocalArrayLowerBound(object oidObject, string sVarName) +{ + string sFullVarName = sVarName + "_MIN"; + return GetLocalInt(oidObject, sFullVarName); +} + +//////////////////////////////////////////////////////////////////////// +int GetLocalArrayUpperBound(object oidObject, string sVarName) +{ + string sFullVarName = sVarName + "_MAX"; + return GetLocalInt(oidObject, sFullVarName); +} + +//////////////////////////////////////////////////////////////////////// +void SetLocalArrayLowerBound(object oidObject, string sVarName, int nMin) +{ + string sFullVarName = sVarName + "_MIN"; + SetLocalInt(oidObject, sFullVarName, nMin); +} + +//////////////////////////////////////////////////////////////////////// +void SetLocalArrayUpperBound(object oidObject, string sVarName, int nMax) +{ + string sFullVarName = sVarName + "_MAX"; + SetLocalInt(oidObject, sFullVarName, nMax); +} + +//////////////////////////////////////////////////////////////////////// +int GetLocalArrayInt(object oidObject, string sVarName, int nVarNum) +{ + string sFullVarName = sVarName + IntToString(nVarNum) ; + return GetLocalInt(oidObject, sFullVarName); +} + +//////////////////////////////////////////////////////////////////////// +void SetLocalArrayInt(object oidObject, string sVarName, int nVarNum, int nValue) +{ + string sFullVarName = sVarName + IntToString(nVarNum) ; + SetLocalInt(oidObject, sFullVarName, nValue); + // update bounds + if (nVarNum < GetLocalArrayLowerBound(oidObject, sVarName)) + SetLocalArrayLowerBound(oidObject, sVarName, nVarNum); + if (nVarNum > GetLocalArrayUpperBound(oidObject, sVarName)) + SetLocalArrayUpperBound(oidObject, sVarName, nVarNum); +} + +//////////////////////////////////////////////////////////////////////// +float GetLocalArrayFloat(object oidObject, string sVarName, int nVarNum) +{ + string sFullVarName = sVarName + IntToString(nVarNum) ; + return GetLocalFloat(oidObject, sFullVarName); +} + +//////////////////////////////////////////////////////////////////////// +void SetLocalArrayFloat(object oidObject, string sVarName, int nVarNum, float fValue) +{ + string sFullVarName = sVarName + IntToString(nVarNum) ; + SetLocalFloat(oidObject, sFullVarName, fValue); + // update bounds + if (nVarNum < GetLocalArrayLowerBound(oidObject, sVarName)) + SetLocalArrayLowerBound(oidObject, sVarName, nVarNum); + if (nVarNum > GetLocalArrayUpperBound(oidObject, sVarName)) + SetLocalArrayUpperBound(oidObject, sVarName, nVarNum); +} + +//////////////////////////////////////////////////////////////////////// +string GetLocalArrayString(object oidObject, string sVarName, int nVarNum) +{ + string sFullVarName = sVarName + IntToString(nVarNum) ; + return GetLocalString(oidObject, sFullVarName); +} + +//////////////////////////////////////////////////////////////////////// +void SetLocalArrayString(object oidObject, string sVarName, int nVarNum, string nValue) +{ + string sFullVarName = sVarName + IntToString(nVarNum) ; + SetLocalString(oidObject, sFullVarName, nValue); + // update bounds + if (nVarNum < GetLocalArrayLowerBound(oidObject, sVarName)) + SetLocalArrayLowerBound(oidObject, sVarName, nVarNum); + if (nVarNum > GetLocalArrayUpperBound(oidObject, sVarName)) + SetLocalArrayUpperBound(oidObject, sVarName, nVarNum); +} + +//////////////////////////////////////////////////////////////////////// +object GetLocalArrayObject(object oidObject, string sVarName, int nVarNum) +{ + string sFullVarName = sVarName + IntToString(nVarNum) ; + return GetLocalObject(oidObject, sFullVarName); +} + +//////////////////////////////////////////////////////////////////////// +void SetLocalArrayObject(object oidObject, string sVarName, int nVarNum, object oidValue) +{ + string sFullVarName = sVarName + IntToString(nVarNum) ; + SetLocalObject(oidObject, sFullVarName, oidValue); + // update bounds + if (nVarNum < GetLocalArrayLowerBound(oidObject, sVarName)) + SetLocalArrayLowerBound(oidObject, sVarName, nVarNum); + if (nVarNum > GetLocalArrayUpperBound(oidObject, sVarName)) + SetLocalArrayUpperBound(oidObject, sVarName, nVarNum); +} + +//////////////////////////////////////////////////////////////////////// +location GetLocalArrayLocation(object oidObject, string sVarName, int nVarNum) +{ + string sFullVarName = sVarName + IntToString(nVarNum) ; + return GetLocalLocation(oidObject, sFullVarName); +} + +//////////////////////////////////////////////////////////////////////// +void SetLocalArrayLocation(object oidObject, string sVarName, int nVarNum, location locValue) +{ + string sFullVarName = sVarName + IntToString(nVarNum) ; + SetLocalLocation(oidObject, sFullVarName, locValue); + // update bounds + if (nVarNum < GetLocalArrayLowerBound(oidObject, sVarName)) + SetLocalArrayLowerBound(oidObject, sVarName, nVarNum); + if (nVarNum > GetLocalArrayUpperBound(oidObject, sVarName)) + SetLocalArrayUpperBound(oidObject, sVarName, nVarNum); +} + diff --git a/gamma_age_v2/dmfi_buff.uti b/gamma_age_v2/dmfi_buff.uti new file mode 100644 index 0000000000000000000000000000000000000000..8e0bde4200180232f798f856509d24ce6493f7fc GIT binary patch literal 1138 zcmZ8g+invv5H-*i2<2XGFUTK&Dgi=5JkcgXtkj~Y3FQ$v*-2{ZT`yj5Q4s21@Ckez zKfnVoaL%q%QbsyE7kkdw-kJB~Odmeqe)du+brBc>kAQC%I=y*Gso(H7)|ASjKS5uC z{sVzhcld$41ug^E=pN!}OamsaIY2SdI0XGw%TFzU^C;x3AO9{Ly&%pRyfLxR)BQ&O|wo`aot%?V4J$C{rR(nL-d5NIeas(%suB~rbtf@OHt3E6{-VI^B@exn7c={D(#&R$5o3q1cFJJ? zO{RCTs6Uu8XOFDzAjyyaV&CEK=&6$v3EJ5ho#^Pj!$%wE{1?6O4V}-8ogTY|W@&A7 zZOb{g^6y3M148rQn@ancmQo5lAhW8bwDl1=f}WWZA8ZtjhFVCdw|l+Q(_TLa+AG(S z#Vf4`Qb-KeH+7Fgb9PtQt?;hwYunuqnIeDBoCb4@tS)3?#KPQOO!|rBR^Hn%8 QoD@#T7Ql(%B#@u@3n&h@=l}o! literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_cond_dmw.ncs b/gamma_age_v2/dmfi_cond_dmw.ncs new file mode 100644 index 0000000000000000000000000000000000000000..42bd7e1dbb2266755b2b14ae755a2811b06a2976 GIT binary patch literal 329 zcmeZs4ps;=)H85mU|{rQVwPh70uBWR7FGtnl-#t;_>|mo|FpE?)DjjpkQ6HegE12` z0qfhV5t~J5oIv<1DI=ya39cUZe@9pyVbyM zWncuk{0Re#Gy{-+Aq$f629x%>3}7RmzLIwU^MEQv6j&J;Wtbpd#iE@DY}6YC1^{js BT2uf4 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_cond_dmw.nss b/gamma_age_v2/dmfi_cond_dmw.nss new file mode 100644 index 00000000..7008bacd --- /dev/null +++ b/gamma_age_v2/dmfi_cond_dmw.nss @@ -0,0 +1,22 @@ + +int StartingConditional() +{ + int nMyNum = GetLocalInt(OBJECT_SELF, "dmfi_dmwOffset"); + SetLocalInt(OBJECT_SELF, "dmfi_dmwOffset", nMyNum+1); + + object oMySpeaker = GetPCSpeaker(); + object oMyTarget = GetLocalObject(oMySpeaker, "dmfi_univ_target"); + location lMyLoc = GetLocalLocation(oMySpeaker, "dmfi_univ_location"); + + string sMyString = GetLocalString(oMySpeaker, "dmw_dialog" + IntToString(nMyNum)); + + if(sMyString == "") + { + return FALSE; + } + else + { + SetCustomToken(8000 + nMyNum, sMyString); + return TRUE; + } +} diff --git a/gamma_age_v2/dmfi_custom_enc.are b/gamma_age_v2/dmfi_custom_enc.are new file mode 100644 index 0000000000000000000000000000000000000000..15cc221788c8b96c411b0faa0f1381b4c8ee5393 GIT binary patch literal 8013 zcmc)PiGLL39mnyJ`v~_H?&VTMMF^;P6E=y7CM0GdfT+u`JIRh@XX5Tg5=F!tZ?IKS zTd!8dR$I?j?VW#R|i1!)s%SQZ$5sx3#U(YHd-eSbNjrd6;e$9xj!Tt3tHsTf|?lIyA zjQD^NziGskL;CAnZNxbv-ebhi8}aK#JYr~nJ{i;{8T^(1;Hiaf0Wk{%2Q^ z^b8f#wZZeGd5i9`We`TC6yf!ZdG<9loab6C6!TK zN{ZD+HhVx>YfSK2-anSOswx}oQ5(8el^+l7S3CjXaI_{8D`~&3H@9=IvKGTRI9Kr$ zeS~Rh6tJC!D(Ko7?xdA#^f_H0VVc2K*Pwe*KPf4m6-4EDwh=R3f~0<(8^+os5cTgo z?I5Y1`A}adUI3L*KP|+DFkZxVV;CRFc2gK1#rC`~Ud(ng)MrOS{h>OSU`H4q!&cX& z{l_9o$3+3#rABs zbiXeQP`gpz#yy_RaTQ%d9P_AT^mCl^H@e5T=aD(C;=Et8pYVE^TFezue=pBjADJBQt#)$G-JrM}uN<$GM?{ARD- zu?wZGjH=-LW^aAbDbzUauIFUgv(D{wicbFt%7;TEC?Djb!5EfLHy8B$?GnQ%IBr~2 zkZ+=Uf-YDd)SvFlSC#XrLMA+Xc)qH9J?U!C%{Tgf7mIX3eNq11$62h?T46Td?xr){ z#gd;-J6=XVr?gD0SBR39Icu8g8WPE%NTSxuXmC1(M61)mEsT5D`N2ti3@w!k%d}1y zEDq|Wt1s4QQBsS@T0GXms}_s3NIV)9&|F#N)ncg@N%gYS-D@#ai=bNk)S{#!be z*no}L1T6w@#`(Aa7b1-K&(7p(clmi=a1FC-Ttz^wEWjQ9uzI>fN{m znzNegdJ$X-{c*hm`V!C&xht>>SK=yMjcaf%uEX`%jT>+yZo&uG7jXbz!k6(Cyo#^lYxp`2;v4uT zzJ+h&JNPcXhu83Z`~W}1kMLvs1V6>=_!)kVU*MPc6@HE1;0^p1zr*kG2mBF#!k_Ub z{(`^aZ+HuT$3O5-9KyfwZ~O=U#sBbsybVqMBQOYqF$6;~48t)3BQXl2QGqcSi*Xo_ z37CjUn2afyifO3Cbj-j^%))HU!CWLT5A(4A3$X}C;wUV}(O80Ga4e3)QXG$ESdJ>J zz)GBe6LAt&;bfeGQ*jzj#~C;it5Js$0$hkRw!p?#WRQh}c61;I7Z+h0I+2G5ANoh_#VDYN61s5-wxb8V zxD=OR2QJ4>T!CG<5?A4BT!U+I9j?c2+<+T#6K=*WxD~fy5B5T7Arub6U<|=f48w4Y vz(|b3XjEVf#$p`CV*(~(5+-8`reYc@FɀSFWIb1)YP%)@*vfUf5qH*YF* literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_custom_enc.gic b/gamma_age_v2/dmfi_custom_enc.gic new file mode 100644 index 0000000000000000000000000000000000000000..646985aea810e9136f2ec80726db8843fd2a1843 GIT binary patch literal 11609 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 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_db_biow_inc.ncs b/gamma_age_v2/dmfi_db_biow_inc.ncs new file mode 100644 index 0000000000000000000000000000000000000000..ecb1c72d2b249d3cdcff5ed38020576abd2280f5 GIT binary patch literal 23 ccmeZs4ps;=)H85mU|1z3JeMi04)0gsQ>@~ literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_db_biow_inc.nss b/gamma_age_v2/dmfi_db_biow_inc.nss new file mode 100644 index 00000000..6a771177 --- /dev/null +++ b/gamma_age_v2/dmfi_db_biow_inc.nss @@ -0,0 +1,66 @@ +//DMFI Persistence wrapper functions +//This include file contains the wrapper functions for the +//persistent settings of the DMFI Wand and Widget package +//Advanced users can adapt this to the database system that +//they want to use for NWN. +// +//These functions use the Bioware database by default and use a primitive form +//of "caching" to avoid lots of database R/W + +//::////////////////////////////////////////////// +//:: Created By: The DMFI Team +//:: Created On: +//::////////////////////////////////////////////// +//:: 2008.07.10 tsunami282 - implemented alternate database support, initially +//:: for Knat's NBDE + + +const int DMFI_DB_TYPE = 1; + +void FlushDMFIPersistentData(string sDBName) +{ + // no flushing required for Bioware database +} + +int IsDMFIPersistentDataDirty(string sDBName) +{ + return FALSE; // bioware database system has no cache, so is never dirty +} + +//Int functions +int GetDMFIPersistentInt(string sDBName, string sDBSetting, object oPlayer = OBJECT_INVALID) +{ + int iReturn = GetCampaignInt(sDBName, sDBSetting, oPlayer); + return iReturn; +} + +void SetDMFIPersistentInt(string sDBName, string sDBSetting, int iDBValue, object oPlayer = OBJECT_INVALID) +{ + SetCampaignInt(sDBName, sDBSetting, iDBValue, oPlayer); +} + +//Float functions +float GetDMFIPersistentFloat(string sDBName, string sDBSetting, object oPlayer = OBJECT_INVALID) +{ + float fReturn = GetCampaignFloat(sDBName, sDBSetting, oPlayer); + return fReturn; +} + +void SetDMFIPersistentFloat(string sDBName, string sDBSetting, float fDBValue, object oPlayer = OBJECT_INVALID) +{ + SetCampaignFloat(sDBName, sDBSetting, fDBValue, oPlayer); +} + +//String functions +string GetDMFIPersistentString(string sDBName, string sDBSetting, object oPlayer = OBJECT_INVALID) +{ + string sReturn = GetCampaignString(sDBName, sDBSetting, oPlayer); + return sReturn; +} + +void SetDMFIPersistentString(string sDBName, string sDBSetting, string sDBValue, object oPlayer = OBJECT_INVALID) +{ + SetCampaignString(sDBName, sDBSetting, sDBValue, oPlayer); +} + +//void main (){} diff --git a/gamma_age_v2/dmfi_db_inc.ncs b/gamma_age_v2/dmfi_db_inc.ncs new file mode 100644 index 0000000000000000000000000000000000000000..ecb1c72d2b249d3cdcff5ed38020576abd2280f5 GIT binary patch literal 23 ccmeZs4ps;=)H85mU|1z3JeMi04)0gsQ>@~ literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_db_inc.nss b/gamma_age_v2/dmfi_db_inc.nss new file mode 100644 index 00000000..a96956cd --- /dev/null +++ b/gamma_age_v2/dmfi_db_inc.nss @@ -0,0 +1,40 @@ +//DMFI Persistence wrapper functions +//This include file contains the wrapper functions for the +//persistent settings of the DMFI Wand and Widget package +//Advanced users can adapt this to the database system that +//they want to use for NWN. + +//::////////////////////////////////////////////// +//:: Created By: The DMFI Team +//:: Created On: +//::////////////////////////////////////////////// +//:: 2008.07.10 tsunami282 - implemented alternate database support, initially +//:: for Knat's NBDE + +//Listen Pattern ** variable +//Change this to 0 to make the DMFI W&W more compatible with Jasperre's AI +const int LISTEN_PATTERN = 20600; + +const int DMFI_DB_TYPE_BIOWARE = 1; +const int DMFI_DB_TYPE_NBDE = 2; +const int DMFI_DB_TYPE_RESERVED_3 = 3; +const int DMFI_DB_TYPE_RESERVED_4 = 4; +const int DMFI_DB_TYPE_RESERVED_5 = 5; +const int DMFI_DB_TYPE_RESERVED_6 = 6; +const int DMFI_DB_TYPE_RESERVED_7 = 7; +const int DMFI_DB_TYPE_RESERVED_8 = 8; +const int DMFI_DB_TYPE_RESERVED_9 = 9; +const int DMFI_DB_TYPE_RESERVED_10 = 10; + +// *** DATABASE SELECTION *** +// Only choose one of the following #include lines. Comment out all the others! + +// Standard version uses the default Bioware database +#include "dmfi_db_biow_inc" + +// Alternate version: using Knat's NBDE +// This provides greatly increased speed, but necessitates occasional flushing to disk. +// Flushing requires you to add code to Your module OnHeartbeat event. +// #include "dmfi_db_nbde_inc" + +// void main (){} diff --git a/gamma_age_v2/dmfi_db_nbde_inc.ncs b/gamma_age_v2/dmfi_db_nbde_inc.ncs new file mode 100644 index 0000000000000000000000000000000000000000..ecb1c72d2b249d3cdcff5ed38020576abd2280f5 GIT binary patch literal 23 ccmeZs4ps;=)H85mU|1z3JeMi04)0gsQ>@~ literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_db_nbde_inc.nss b/gamma_age_v2/dmfi_db_nbde_inc.nss new file mode 100644 index 00000000..42c4ef5c --- /dev/null +++ b/gamma_age_v2/dmfi_db_nbde_inc.nss @@ -0,0 +1,65 @@ +//DMFI Persistence wrapper functions +// modified version for Knat's NBDE support + +//::////////////////////////////////////////////// +//:: Created By: The DMFI Team +//:: Created On: +//::////////////////////////////////////////////// +//:: 2008.07.10 tsunami282 - implemented alternate database support, initially +//:: for Knat's NBDE + +#include "nbde_inc" + +const int DMFI_DB_TYPE = 2; + +void FlushDMFIPersistentData(string sDBName) +{ + NBDE_SetCampaignInt(sDBName, "DMFI_DB_DIRTY", FALSE); + NBDE_FlushCampaignDatabase(sDBName); +} + +int IsDMFIPersistentDataDirty(string sDBName) +{ + return NBDE_GetCampaignInt(sDBName, "DMFI_DB_DIRTY"); +} + +//Int functions +int GetDMFIPersistentInt(string sDBName, string sDBSetting, object oPlayer = OBJECT_INVALID) +{ + int iReturn = NBDE_GetCampaignInt(sDBName, sDBSetting, oPlayer); + return iReturn; +} + +void SetDMFIPersistentInt(string sDBName, string sDBSetting, int iDBValue, object oPlayer = OBJECT_INVALID) +{ + NBDE_SetCampaignInt(sDBName, sDBSetting, iDBValue, oPlayer); + NBDE_SetCampaignInt(sDBName, "DMFI_DB_DIRTY", TRUE); +} + +//Float functions +float GetDMFIPersistentFloat(string sDBName, string sDBSetting, object oPlayer = OBJECT_INVALID) +{ + float fReturn = NBDE_GetCampaignFloat(sDBName, sDBSetting, oPlayer); + return fReturn; +} + +void SetDMFIPersistentFloat(string sDBName, string sDBSetting, float fDBValue, object oPlayer = OBJECT_INVALID) +{ + NBDE_SetCampaignFloat(sDBName, sDBSetting, fDBValue, oPlayer); + NBDE_SetCampaignInt(sDBName, "DMFI_DB_DIRTY", TRUE); +} + +//String functions +string GetDMFIPersistentString(string sDBName, string sDBSetting, object oPlayer = OBJECT_INVALID) +{ + string sReturn = NBDE_GetCampaignString(sDBName, sDBSetting, oPlayer); + return sReturn; +} + +void SetDMFIPersistentString(string sDBName, string sDBSetting, string sDBValue, object oPlayer = OBJECT_INVALID) +{ + NBDE_SetCampaignString(sDBName, sDBSetting, sDBValue, oPlayer); + NBDE_SetCampaignInt(sDBName, "DMFI_DB_DIRTY", TRUE); +} + +//void main (){} diff --git a/gamma_age_v2/dmfi_dicebag.uti b/gamma_age_v2/dmfi_dicebag.uti new file mode 100644 index 0000000000000000000000000000000000000000..a26caa7c8b4fd540a68f9611bc4b51896506af80 GIT binary patch literal 1628 zcmZ8h+m0JW5FH@lGK5+-X zC_li@@d-Te0sH}+Gc#TsN-lSIT~1Y3*VN^5Do?)~e0x7hlGnj=@E73UUhCF7ZzRcI zQ2c#6Npi@SZzjpxSpNZGN$&CwbPj$C{4NhY!6gAq@;UepnE3DYd%z}N_4`{`hu{=U zpFd~_La3IgCpLXZj89yez0>cpwEmRS{x}cDrkuq1hyDB5Gu{V1V`(uz?9asi2t4f_ zcvt2?`Nv>lk?w)pVqpD*f}TFb%9@cr1AhUo~#T1C6Iia<-V=^Xq2abfC>h8x+~hj??qW)Z#9 z4yqL|qRF-k1niCG&c9+m%=1?uj$_kh+|+@29BAfqb#qh4Z#v1m_B*Yk)$qtNlm5K# zua_*ERow3m(Se72muBS-5}uzL*Bs7(Hf4{^2;KQV3*5iTbhz88sXM*X7UeWL~{mMr!Y>;bHTGMP#AQktzw*jnc#D>U1liCI}^O z+P=UC(Te)L%rpeE(ew&Mds4amv-Y1^O=clYhq&6pU*gKSocnm$6*TbvQlWCT%3PCc zj*NctjbtcI6I2F$-O&Q@ggG8b0R>prnvW%Z&1%7T-BcOBI+!6!hPK*hTgcVT9RoTG z^$7!!g?7qlcR}z9c?kr(oc?U^y=y=wFJGn;Ej8BGH@L%vqCj?2X)dF^oSUKw-pfhB z&GS&$>S5tyX{;M$zC2CSC$-(!$~eIUfSauLa^Y7p!l$NAPDa*W>oUNRxoKu{k#NeFctmK^J9OL|A`*SvOCUO?u19SFq<`JL#FQU&| A-v9sr literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_dmbook.uti b/gamma_age_v2/dmfi_dmbook.uti new file mode 100644 index 0000000000000000000000000000000000000000..dd31ed567a082d186257ad5ce0008460dcca5da9 GIT binary patch literal 3883 zcma)9+ma(U8E(h{Xu>(1?tVJ8RWn;22NF^h<_ho3CJZ&ZGqvOF!c|J{R@;iZTSiik z*C`%@2jC63-~o6v_&%xIYZpr`U8UCPKc6IhF~5@MA5TB}G|RGYqTQnX678?wNd0?n zW!XQ!n`Qs{ewI~O|KJB%_HFe4#)mHZF@N~}fc7mkfbPF{FanwEk7)0qkv@Aikj;KK zjNeB8Hz4NdiSze?$h#Qx<34G#=STjeOM2fK#^@qG*9mth2lN6t@kmG#z6m5wDJ2H2Gub6Ir>k~sN*lt{s95!y4^G? z=x5qL({+|TQeIyL-C{d_*S1uR`C3;`RjaXbseS3pCK%hrea^2c-33z{4MuadOo+q( zVx`~3r72ELrI4DZcs0~>lb0S8M%WVdzbGjY1sPD26#P_G)Pt&{tRSPqDB>GFxs^Dnx_thH>MzBjh_KyEa` z!INKDY4H5)N`keGpK$K97%!a#++TX*H1&wYR3}ewFDByqwzZwEq;y(^-sy?dsx^&K zP9R1R(56ltAS)$< zco2dzKh&)a+CSt<5Cxed8iWEf0^Bxg2ZSSI3at-DbL_Y3E9*?y4MsQ;iR8RN0`0`F ztP5oye3X4lW+g;`ViimfwTtYw^wmTbec*H#C4%+JHDoZg>})>>*}_wSfw#wPr+J=F zy$CMjECY^#YBqV<431`P{1%Z zj3^>dUh3I{8uV%9tKNr%)_c<}r8qBSyE5g9u>uIGbglX(5IX<>Iz9f=xrju?9zfZq ziIfT3C=g508dyePGb;~(^5=mqfD-TG!>X0@pkD@IU>4B}5YFxSAtIyv1bmS85paki z6ev{&?LanK^?{tp!a+333jnIQ2ciHVI|V2#Ptc&&$dJfN-7APmkQi)xq~y0XH7i%T zT>IBKD$gIzXU{%=JeQ|8^T!Vve3TBQd1>7)+2vI>@2wMa5<<{AF=Bxf-5O=0EFPt2 zeUO)OGT8DcE|ZnFrUIQ)#6cy_LSB{&oDa;9lW6P#cUWW64$L7TaZx=CaKN|lrS5cb z8spa@-ctoauD~$elEFbO2GR3;M#s}gPyp=J0)>KgI_3jRYZ_()bS$7>!Ei#{*?1D6 zuIa8KMLD6wLl~P7l}ITGq%q}@wkq<7u!6uyLQDi0pi8kfI5Kvp2#Kxnm2DY1;}DdX zh$_}}R`=Jr^9=qxbmW+%kuMocqpm|hjQNuyKKgV%x|DWFMQxzT(XmnVUykChvmiEC5@)@m%{6*fO=ock2(3`S2z<}AyQg4E;CZb=WoRbr1 z9te&4lny)^M=p^R@*)NY0~Cj=v@8-RjkD`(xtQJFrGkMHy6r|E4bemok@{;TnF{Mb zt58K7Z=+FEhsoYCQaiYg_}8;XkFQbso4!TR)CVxrk18c6CC<4s(|O%_1l_$pjm1tO zezwx}?E>*X&_ZFa4dd`A1mxo8#bHRuquKS%v!j*Z?6R@dF6b|p%C$#(pD>^neO*Ju zbez97reb-|^WVx6ndK1mjlS0n4wJf$hjb!=nm&;rB}duwg5s%~Q_wR$vPEZnBAN7rk#KQ16Z|#DyEsN_Y}F2P z+i;Hhj_7U)fO`xUoYr5D1v#ItP$bWAnj*~pTOn>jp%!KR4Cx%8Y`pYg2BG4$rL-OI zXNtbcryZUT*xaig=fk~n@Xere-1*-+_gxJ-_#aE#ceDill!X~T8sffwiH#cfQ-rsq z8Sbnw1WV15Vle-_Mo$v54>6@9$7^NP+V*;{CDqrHRn wE*hVVMCTKc&n}|#DadCVpMHGe@ma>_7@vH6>hX!kr``K#e9G|&NBV640X14TD*ylh literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_dmw.uti b/gamma_age_v2/dmfi_dmw.uti new file mode 100644 index 0000000000000000000000000000000000000000..95ea7623292143bf28a2440bbf07b852c411fd73 GIT binary patch literal 1764 zcmZ8iS#KLR5Z)f?p`>?up?#RQ+JIspJ%A!WA8e~d1=zA+tz!fTP*A&EiSaHekX$KS z^r!Z}wBNUfqGW&(IkTK^hBL#_O*)mQKb`#eYmy{ygXiFH!T-F~tqtv^VBmd7k<&z{Daw z1h>h+`Xv=TeT9`dBYh421U<@E5FiVuRC`k?geZX(UrP`YSoLVvbzNw z_J`)Bd+q#bp1%fh=$j_zwGWJApi7tQa;|)Q+-c_CZM2U@hYQ0d%c9d&a1-w zl~=p(p<;s%O~VG7T>deY$)(&Xo3lXcI-9q~=Lavmk|c6^^RdIs$wh z#KF`DQC>@Jb6AEBU~m>rMAA3W8Rrni#=9lb-^kVM;+fRE$+D68Z8$y|jb;dQt%Ce4 zOBGCpkfUBXL>-=tM)U4^drxv?Y*yAe?~0aQS>|2B+7xjtmCC%sRkzSN-|TNSmK9Uw z^~RxT>}o8G?afOZk49I^7dnf3yMQ#;-ioth={7|%7Vjb=980c4^sYG;YcHZ#ZY;tLx*RzWTguTi7uX9-Hb&LNh&*(PPafE1b~mucx)<}tC1B1jhnN>S6Wh2 zA-F;&s%dj{s}*biDkG>@YDyh&Q(Y8HR)}>`AO(wP&`9VmV+*{N&c0I3QlmVrC+ng> zGRWq#W&o;^o%46BB|8?$W6MN#4WerMdC7O?*)2?4u9_46XAIAa&xOS2#aW7%($4IA uSUK}K>v^946`Yrx<$Qvix18CW*PN%EqkM{-(VWek$q&Jt!JNIsC;t!j9E}42 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_dmw_inc.ncs b/gamma_age_v2/dmfi_dmw_inc.ncs new file mode 100644 index 0000000000000000000000000000000000000000..0a7ef578e65a6564204e18a489aa7ce7c8395129 GIT binary patch literal 184 zcmeZs4ps;=)H85mU|`rG2P7Cc6d0J8S(q6Z*g#jqVV8(=|K?o=+gwT+apPX2dnV$#N@&T-6 WCYly42C%~fv>Ct-`Jlj{zyJW?89?Fy literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_dmw_inc.nss b/gamma_age_v2/dmfi_dmw_inc.nss new file mode 100644 index 00000000..4c117926 --- /dev/null +++ b/gamma_age_v2/dmfi_dmw_inc.nss @@ -0,0 +1,1198 @@ +// VOICE CONFIGURATION - NEW IN 1.07 and UP + +// Set this to 0 if you want to DISABLE listening by NPCs for performance reasons. +// See readme for additional information regarding possible issues and effects. +const int DMFI_LISTENING_GLOBAL = 1; + + +// NOTE: OMW_COLORS is an invisible object that must be present in your module. +// It has high ascii characters in the name and is used to get the color codes. +// This was ripped wholeheartedly by an example posted by Richterm on the bioboards. + +string DST_COLOR_TAGS = GetName(GetObjectByTag("dem_color_text")); +string DST_COLOR_WHITE = GetSubString(DST_COLOR_TAGS, 0, 6); +string DST_COLOR_YELLOW = GetSubString(DST_COLOR_TAGS, 6, 6); +string DST_COLOR_MAGENTA = GetSubString(DST_COLOR_TAGS, 12, 6); +string DST_COLOR_CYAN = GetSubString(DST_COLOR_TAGS, 18, 6); +string DST_COLOR_RED = GetSubString(DST_COLOR_TAGS, 24, 6); +string DST_COLOR_GREEN = GetSubString(DST_COLOR_TAGS, 30, 6); +string DST_COLOR_BLUE = GetSubString(DST_COLOR_TAGS, 36, 6); + +// Colors for each type of roll. Change the colors if you like. +string DMFI_ROLL_COLOR = DST_COLOR_CYAN; +string DST_COLOR_NORMAL = DST_COLOR_WHITE; + +int DMW_START_CUSTOM_TOKEN = 8000; + +//Retrieve targetting information +object oMySpeaker = GetLastSpeaker(); +object oMyTarget = GetLocalObject(oMySpeaker, "dmfi_univ_target"); +location lMyLoc = GetLocalLocation(oMySpeaker, "dmfi_univ_location"); + +// checks if a nearby object is destroyable +int dmwand_isnearbydestroyable(); +// Check if the target can be created with CreateObject +int dmwand_istargetcreateable(); +//Check if target is a destroyable object +int dmwand_istargetdestroyable(); +// checks if the wand was NOT clicked on an object +int dmwand_istargetinvalid(); +// check if the target has an inventory +int dmwand_istargetinventory(); +//Check if the target is not the wand's user +int dmwand_istargetnotme(); +//Check if target is an NPC or monster +int dmwand_istargetnpc(); +//Check if the target is a PC +int dmwand_istargetpc(); +//Check if the target is a PC and not me +int dmwand_istargetpcnme(); +// Check if the target is a PC or NPC +// uses the CON score currently +int dmwand_istargetpcornpc(); +//Check if the target is a PC or an npc and not me +int dmwand_istargetpcornpcnme(); +// Check if target is a placeable +int dmwand_istargetplaceable(); +//bulds the conversion +int dmwand_BuildConversationDialog(int nCurrent, int nChoice, string sConversation, string sParams); +int dmw_conv_ListPlayers(int nCurrent, int nChoice, string sParams = ""); +int dmw_conv_Start(int nCurrent, int nChoice, string sParams = ""); +void dmwand_BuildConversation(string sConversation, string sParams); +void dmwand_StartConversation(); + +// DMFI Color Text function. It returns a colored string. +// sText is the string that will be colored and sColor is the color +// options: yellow, magenta, cyan, red, green, blue - truncated at first letter +// Ex: sMsg = ColorText(sMsg, "y"); //Add the include file - yields yellow colored msg. +string ColorText(string sText, string sColor); +string ColorText(string sText, string sColor) +{ + string sApply = DST_COLOR_NORMAL; + string sTest = GetStringLowerCase(GetStringLeft(sColor, 1)); + if (sTest=="y") sApply = DST_COLOR_YELLOW; + else if (sTest == "m") sApply = DST_COLOR_MAGENTA; + else if (sTest == "c") sApply = DST_COLOR_CYAN; + else if (sTest == "r") sApply = DST_COLOR_RED; + else if (sTest == "g") sApply = DST_COLOR_GREEN; + else if (sTest == "b") sApply = DST_COLOR_BLUE; + + string sFinal = sApply + sText + DST_COLOR_NORMAL; + return sFinal; +} + + +int dmwand_isnearbydestroyable() +{ + object oMyTest = GetFirstObjectInShape(SHAPE_CUBE, 0.6, lMyLoc, FALSE, OBJECT_TYPE_ALL); + int nTargetType = GetObjectType(oMyTest); + return (GetIsObjectValid(oMyTest) && (! GetIsPC(oMyTest)) && ((nTargetType == OBJECT_TYPE_ITEM) || (nTargetType == OBJECT_TYPE_PLACEABLE) || (nTargetType == OBJECT_TYPE_CREATURE))); +} + +int dmwand_istargetcreateable() +{ + if(! GetIsObjectValid(oMyTarget)) { return FALSE; } + + int nTargetType = GetObjectType(oMyTarget); + return ((nTargetType == OBJECT_TYPE_ITEM) || (nTargetType == OBJECT_TYPE_PLACEABLE) || (nTargetType == OBJECT_TYPE_CREATURE)); +} + +int dmwand_istargetdestroyable() +{ + if(! GetIsObjectValid(oMyTarget)) { return FALSE; } + + int nTargetType = GetObjectType(oMyTarget); + if(! GetIsPC(oMyTarget)) + { + return ((nTargetType == OBJECT_TYPE_ITEM) || (nTargetType == OBJECT_TYPE_PLACEABLE) || (nTargetType == OBJECT_TYPE_CREATURE)); + } + return FALSE; +} + +int dmwand_istargetinvalid() +{ + return !GetIsObjectValid(oMyTarget); +} + +int dmwand_istargetinventory() +{ + return (GetIsObjectValid(oMyTarget) && GetHasInventory(oMyTarget)); +} + +int dmwand_istargetnotme() +{ + return (GetIsObjectValid(oMyTarget) && (oMySpeaker != oMyTarget)); +} + +int dmwand_istargetpc() +{ + return (GetIsObjectValid(oMyTarget) && GetIsPC(oMyTarget)); +} + +int dmwand_istargetpcnme() +{ + return (GetIsObjectValid(oMyTarget) && GetIsPC(oMyTarget) && (oMySpeaker != oMyTarget)); +} + +int dmwand_istargetpcornpc() +{ + return (GetIsObjectValid(oMyTarget) && GetAbilityScore(oMyTarget, ABILITY_CONSTITUTION)); +} + +int dmwand_istargetnpc() +{ + return (dmwand_istargetpcornpc() && (!GetIsPC(oMyTarget))); +} + +int dmwand_istargetpcornpcnme() +{ + return (dmwand_istargetpcornpc() && (oMySpeaker != oMyTarget)); +} + +int dmwand_istargetplaceable() +{ + if(! GetIsObjectValid(oMyTarget)) { return FALSE; } + + int nTargetType = GetObjectType(oMyTarget); + return (nTargetType == OBJECT_TYPE_PLACEABLE); +} + +int dmw_conv_Start(int nCurrent, int nChoice, string sParams = "") +{ + string sText = ""; + string sCall = ""; + string sCallParams = ""; + + switch(nCurrent) + { + case 0: + nCurrent = 0; + sText = "Hello there, DM. What can I do for you?"; + sCall = ""; + sCallParams = ""; + break; + + case 1: + nCurrent = 1; + if(dmwand_istargetpcnme()) + { + sText = "Penguin this player."; + sCall = "func_Toad"; + sCallParams = ""; + break; + } + case 2: + nCurrent = 2; + if(dmwand_istargetpcnme()) + { + sText = "Unpenguin this player."; + sCall = "func_Untoad"; + sCallParams = ""; + break; + } + case 3: + nCurrent = 3; + if(dmwand_istargetpcnme()) + { + sText = "Boot this player."; + sCall = "func_KickPC"; + sCallParams = ""; + break; + } + case 4: + nCurrent = 4; + if(dmwand_istargetinvalid()) + { + sText = "List all players..."; + sCall = "conv_ListPlayers"; + sCallParams = "func_PlayerListConv"; + break; + } + + case 5: + nCurrent = 5; + if(dmwand_istargetpcnme()) + { + sText = "Jump this player to my location."; + sCall = "func_JumpPlayerHere"; + sCallParams = ""; + break; + } + case 6: + nCurrent = 6; + if(dmwand_istargetpcnme()) + { + sText = "Jump me to this player's location."; + sCall = "func_JumpToPlayer"; + sCallParams = ""; + break; + } + case 7: + nCurrent = 7; + if(dmwand_istargetpcnme()) + { + sText = "Jump this player's party to my location."; + sCall = "func_JumpPartyHere"; + sCallParams = ""; + break; + } + default: + nCurrent = 0; + sText = ""; + sCall = ""; + sCallParams = ""; + break; + } + + SetLocalString(oMySpeaker, "dmw_dialog" + IntToString(nChoice), sText); + SetLocalString(oMySpeaker, "dmw_function" + IntToString(nChoice), sCall); + SetLocalString(oMySpeaker, "dmw_params" + IntToString(nChoice), sCallParams); + + return nCurrent; +} + +void DMFI_untoad(object oTarget, object oUser) +{ + if (GetLocalInt(oTarget, "toaded")==1) + { + effect eMyEffect = GetFirstEffect(oTarget); + while(GetIsEffectValid(eMyEffect)) + { + if(GetEffectType(eMyEffect) == EFFECT_TYPE_POLYMORPH || GetEffectType(eMyEffect) == EFFECT_TYPE_CUTSCENE_PARALYZE) + RemoveEffect(oTarget, eMyEffect); + + eMyEffect = GetNextEffect(oTarget); + } + } + else + { + FloatingTextStringOnCreature("Dude, he is no toad!", oUser); + } +} + +void DMFI_toad(object oTarget, object oUser) +{ + //This function now toggles the toad status hahnsoo: DMFI 1.08 + if (GetLocalInt(oTarget, "toaded") == 1) + { + effect eMyEffect = GetFirstEffect(oTarget); + while(GetIsEffectValid(eMyEffect)) + { + if(GetEffectType(eMyEffect) == EFFECT_TYPE_POLYMORPH || GetEffectType(eMyEffect) == EFFECT_TYPE_CUTSCENE_PARALYZE) + RemoveEffect(oTarget, eMyEffect); + + eMyEffect = GetNextEffect(oTarget); + } + FloatingTextStringOnCreature("Removed Penguin status from " + GetName(oTarget), oUser, FALSE); + SetLocalInt(oTarget, "toaded", 0); + } + else + { + effect ePenguin = EffectPolymorph(POLYMORPH_TYPE_PENGUIN); + effect eParalyze = EffectCutsceneParalyze(); + AssignCommand(oTarget, ApplyEffectToObject(DURATION_TYPE_PERMANENT, ePenguin, oTarget)); + AssignCommand(oTarget, ApplyEffectToObject(DURATION_TYPE_PERMANENT, eParalyze, oTarget)); + SetLocalInt(oTarget, "toaded", 1); + FloatingTextStringOnCreature("Added Penguin status to " + GetName(oTarget), oUser, FALSE); + } +} + +void DMFI_jail(object oOther, object oUser) +{ + if (GetIsObjectValid(oOther) && !GetIsDM(oOther) && oOther != oUser) + { + object oJail = GetObjectByTag("dmfi_jail"); + if (!GetIsObjectValid(oJail)) + oJail = GetObjectByTag("dmfi_jail_default"); + AssignCommand(oOther, ClearAllActions()); + AssignCommand(oOther, JumpToObject(oJail)); + SendMessageToPC(oUser, GetName(oOther) + " (" + GetPCPublicCDKey(oOther) + ")/IP: " + GetPCIPAddress(oOther) + " - has been sent to Jail."); + } +} + +void dmwand_KickPC(object oTarget, object oUser) +{ + // Create a lightning strike, thunder, scorch mark, and random small + // lightnings at target's location + location lMyLoc = GetLocation (oTarget); + AssignCommand( oUser, ApplyEffectAtLocation ( DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_LIGHTNING_M), lMyLoc)); + AssignCommand ( oUser, PlaySound ("as_wt_thundercl3")); + object oScorch = CreateObject ( OBJECT_TYPE_PLACEABLE, "plc_weathmark", lMyLoc, FALSE); + object oTargetArea = GetArea(oUser); + int nXPos, nYPos, nCount; + for(nCount = 0; nCount < 5; nCount++) + { + nXPos = Random(10) - 5; + nYPos = Random(10) - 5; + + vector vNewVector = GetPositionFromLocation(lMyLoc); + vNewVector.x += nXPos; + vNewVector.y += nYPos; + + location lNewLoc = Location(oTargetArea, vNewVector, 0.0); + AssignCommand( oUser, ApplyEffectAtLocation ( DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_LIGHTNING_S), lNewLoc)); + } + DelayCommand ( 20.0, DestroyObject ( oScorch)); + + SendMessageToAllDMs (GetName(oTarget) + " was booted from the game. PC CD KEY: " + GetPCPublicCDKey(oTarget) + " PC IP ADDRESS: " + GetPCIPAddress(oTarget)); + PrintString(GetName(oTarget) + " was booted from the game. PC CD KEY: " + GetPCPublicCDKey(oTarget) + " PC IP ADDRESS: " + GetPCIPAddress(oTarget)); + + // Kick the target out of the game + BootPC(oTarget); +} + +void dmwand_JumpPlayerHere() +{ + location lJumpLoc = GetLocation(oMySpeaker); + AssignCommand(oMyTarget, ClearAllActions()); + AssignCommand(oMyTarget, ActionJumpToLocation(lJumpLoc)); +} + +//Added by hahnsoo, jumps a party to the DM +void dmwand_JumpPartyHere() +{ + location lJumpLoc = GetLocation(oMySpeaker); + object oParty = GetFirstFactionMember(oMyTarget); + while (GetIsObjectValid(oParty)) + { + AssignCommand(oParty, ClearAllActions()); + AssignCommand(oParty, ActionJumpToLocation(lJumpLoc)); + oParty = GetNextFactionMember(oMyTarget); + } +} + +void dmwand_JumpToPlayer() +{ + location lJumpLoc = GetLocation(oMyTarget); + AssignCommand(oMySpeaker, ActionJumpToLocation(lJumpLoc)); +} + +void dmwand_PlayerListConv(string sParams) +{ + int nPlayer = StringToInt(sParams); + int nCache; + int nCount; + + object oPlayer = GetLocalObject(oMySpeaker, "dmw_playercache" + IntToString(nPlayer)); + oMyTarget = oPlayer; + SetLocalObject(oMySpeaker, "dmfi_univ_target", oMyTarget); + + //Go back to the first conversation level + dmwand_BuildConversation("Start", ""); +} + +//:://///////////////////////////////////////////// +//:: File: dmw_conv_inc +//:: +//:: Conversation functions for the DM's Helper +//::////////////////////////////////////////////// + +int dmwand_BuildConversationDialog(int nCurrent, int nChoice, string sConversation, string sParams) +{ + + if(TestStringAgainstPattern(sConversation, "ListPlayers")) + { + return dmw_conv_ListPlayers(nCurrent, nChoice, sParams); + } + + if(TestStringAgainstPattern(sConversation, "Start")) + { + return dmw_conv_Start(nCurrent, nChoice, sParams); + } + + return FALSE; +} + +void dmwand_BuildConversation(string sConversation, string sParams) +{ + int nLast; + int nTemp; + int nChoice = 1; + int nCurrent = 1; + int nMatch; + + if(TestStringAgainstPattern(sParams, "prev")) + { + //Get the number choice to start with + nCurrent = GetLocalInt(oMySpeaker, "dmw_dialogprev"); + + //Since we're going to the previous page, there will be a next + SetLocalString(oMySpeaker, "dmw_dialog9", "Next ->"); + SetLocalString(oMySpeaker, "dmw_function9", "conv_" + sConversation); + SetLocalString(oMySpeaker, "dmw_params9", "next"); + SetLocalInt(oMySpeaker, "dmw_dialognext", nCurrent); + + nChoice = 8; + for(;nChoice >= 0; nChoice--) + { + int nTemp1 = nCurrent; + int nTemp2 = nCurrent; + nMatch = nTemp2; + while((nCurrent == nMatch) && (nTemp2 > 0)) + { + nTemp2--; + nMatch = dmwand_BuildConversationDialog(nTemp2, nChoice, sConversation, sParams); + } + + if(nTemp2 <= 0) + { + //we went back too far for some reason, so make this choice blank + SetLocalString(oMySpeaker, "dmw_dialog" + IntToString(nChoice), ""); + SetLocalString(oMySpeaker, "dmw_function" + IntToString(nChoice), ""); + SetLocalString(oMySpeaker, "dmw_params" + IntToString(nChoice), ""); + } + nLast = nTemp; + nTemp = nTemp1; + nTemp1 = nMatch; + nCurrent = nMatch; + } + + if(nMatch > 0) + { + SetLocalString(oMySpeaker, "dmw_dialog1", "<- previous"); + SetLocalString(oMySpeaker, "dmw_function1", "conv_" + sConversation); + SetLocalString(oMySpeaker, "dmw_params1", "prev"); + SetLocalInt(oMySpeaker, "dmw_dialogprev", nLast); + } + + //fill the NPC's dialog spot + //(saved for last because the build process tromps on it) + dmwand_BuildConversationDialog(0, 0, sConversation, sParams); + } + else + { + //fill the NPC's dialog spot + dmwand_BuildConversationDialog(0, 0, sConversation, sParams); + + //No parameters specified, start at the top of the conversation + if(sParams == "") + { + nChoice = 1; + nCurrent = 1; + } + + //A "next->" choice was selected + if(TestStringAgainstPattern(sParams, "next")) + { + //get the number choice to start with + nCurrent = GetLocalInt(oMySpeaker, "dmw_dialognext"); + + //set this as the number for the "previous" choice to use + SetLocalInt(oMySpeaker, "dmw_dialogprev", nCurrent); + + //Set the first dialog choice to be "previous" + nChoice = 2; + SetLocalString(oMySpeaker, "dmw_dialog1", "<- Previous"); + SetLocalString(oMySpeaker, "dmw_function1", "conv_" + sConversation); + SetLocalString(oMySpeaker, "dmw_params1", "prev"); + } + + //Loop through to build the dialog list + for(;nChoice <= 10; nChoice++) + { + nMatch = dmwand_BuildConversationDialog(nCurrent, nChoice, sConversation, sParams); + //nLast will be the value of the choice before the last one + nLast = nTemp; + nTemp = nMatch; + if(nMatch > 0) { nCurrent = nMatch; } + if(nMatch == 0) { nLast = 0; } + nCurrent++; + } + + //If there were enough choices to fill 10 spots, make spot 9 a "next" + if(nLast > 0) + { + SetLocalString(oMySpeaker, "dmw_dialog9", "Next ->"); + SetLocalString(oMySpeaker, "dmw_function9", "conv_" + sConversation); + SetLocalString(oMySpeaker, "dmw_params9", "next"); + SetLocalInt(oMySpeaker, "dmw_dialognext", nLast); + } + } +} + +int dmw_conv_ListPlayers(int nCurrent, int nChoice, string sParams = "") +{ + string sText = ""; + string sCall = ""; + string sCallParams = ""; + object oPlayer; + int nCache; + + if((! TestStringAgainstPattern(sParams, "next")) && (! TestStringAgainstPattern(sParams, "prev"))) + { + //This is the first time running this function, so cache the objects + // of all players... we don't want our list swapping itself around every + // time you change a page + SetLocalString(oMySpeaker, "dmw_playerfunc", sParams); + int nCount = 1; + oPlayer = GetFirstPC(); + while(GetIsObjectValid(oPlayer)) + { + SetLocalObject(oMySpeaker, "dmw_playercache" + IntToString(nCount), oPlayer); + oPlayer = GetNextPC(); + nCount++; + } + nCount--; + SetLocalInt(oMySpeaker, "dmw_playercache", nCount); + } + + string sFunc = GetLocalString(oMySpeaker, "dmw_playerfunc"); + nCache = GetLocalInt(oMySpeaker, "dmw_playercache"); + + switch(nCurrent) + { + case 0: + nCurrent = 0; + sText = "Who would you like to work on?"; + sCall = ""; + sCallParams = ""; + break; + default: + //Find the next player in the cache who is valid + oPlayer = GetLocalObject(oMySpeaker, "dmw_playercache" + IntToString(nCurrent)); + while((! GetIsObjectValid(oPlayer)) && (nCurrent <= nCache)) + { + nCurrent++; + oPlayer = GetLocalObject(oMySpeaker, "dmw_playercache" + IntToString(nCurrent)); + } + + if(nCurrent > nCache) + { + //We've run out of cache, any other spots in this list should be + //skipped + nCurrent = 0; + sText = ""; + sCall = ""; + sCallParams = ""; + } + else + { + //We found a player, set up the list entry + sText = GetName(oPlayer) + " (" + GetPCPlayerName(oPlayer) + ")"; + sCall = sFunc; + sCallParams = IntToString(nCurrent); + } + break; + } + + SetLocalString(oMySpeaker, "dmw_dialog" + IntToString(nChoice), sText); + SetLocalString(oMySpeaker, "dmw_function" + IntToString(nChoice), sCall); + SetLocalString(oMySpeaker, "dmw_params" + IntToString(nChoice), sCallParams); + + return nCurrent; +} + +void dmwand_DoDialogChoice(int nChoice) +{ + string sCallFunction = GetLocalString(oMySpeaker, "dmw_function" + IntToString(nChoice)); + string sCallParams = GetLocalString(oMySpeaker, "dmw_params" + IntToString(nChoice)); + string sNav = ""; + + string sStart = GetStringLeft(sCallFunction, 5); + int nLen = GetStringLength(sCallFunction) - 5; + string sCall = GetSubString(sCallFunction, 5, nLen); + + if(TestStringAgainstPattern("conv_", sStart)) + { + dmwand_BuildConversation(sCall, sCallParams); + } + else + { + + if(TestStringAgainstPattern("PlayerListConv", sCall)) + { + dmwand_PlayerListConv(sCallParams); + return; + } + + if(TestStringAgainstPattern("Toad", sCall)) + { + DMFI_toad(oMyTarget, oMySpeaker); + return; + } + if(TestStringAgainstPattern("Untoad", sCall)) + { + DMFI_untoad(oMyTarget, oMySpeaker); + return; + } + if(TestStringAgainstPattern("KickPC", sCall)) + { + dmwand_KickPC(oMyTarget, oMySpeaker); + return; + } + + if(TestStringAgainstPattern("JumpPlayerHere", sCall)) + { + dmwand_JumpPlayerHere(); + return; + } + if(TestStringAgainstPattern("JumpToPlayer", sCall)) + { + dmwand_JumpToPlayer(); + return; + } + if(TestStringAgainstPattern("JumpPartyHere", sCall)) + { + dmwand_JumpPartyHere(); + return; + } + } +} + +//Smoking Function by Jason Robinson +location GetLocationAboveAndInFrontOf(object oPC, float fDist, float fHeight) +{ + float fDistance = -fDist; + object oTarget = (oPC); + object oArea = GetArea(oTarget); + vector vPosition = GetPosition(oTarget); + vPosition.z += fHeight; + float fOrientation = GetFacing(oTarget); + vector vNewPos = AngleToVector(fOrientation); + float vZ = vPosition.z; + float vX = vPosition.x - fDistance * vNewPos.x; + float vY = vPosition.y - fDistance * vNewPos.y; + fOrientation = GetFacing(oTarget); + vX = vPosition.x - fDistance * vNewPos.x; + vY = vPosition.y - fDistance * vNewPos.y; + vNewPos = AngleToVector(fOrientation); + vZ = vPosition.z; + vNewPos = Vector(vX, vY, vZ); + return Location(oArea, vNewPos, fOrientation); +} + +//Smoking Function by Jason Robinson +void SmokePipe(object oActivator) +{ + string sEmote1 = "*puffs on a pipe*"; + string sEmote2 = "*inhales from a pipe*"; + string sEmote3 = "*pulls a mouthful of smoke from a pipe*"; + float fHeight = 1.7; + float fDistance = 0.1; + // Set height based on race and gender + if (GetGender(oActivator) == GENDER_MALE) + { + switch (GetRacialType(oActivator)) + { + case RACIAL_TYPE_HUMAN: + case RACIAL_TYPE_HALFELF: fHeight = 1.7; fDistance = 0.12; break; + case RACIAL_TYPE_ELF: fHeight = 1.55; fDistance = 0.08; break; + case RACIAL_TYPE_GNOME: + case RACIAL_TYPE_HALFLING: fHeight = 1.15; fDistance = 0.12; break; + case RACIAL_TYPE_DWARF: fHeight = 1.2; fDistance = 0.12; break; + case RACIAL_TYPE_HALFORC: fHeight = 1.9; fDistance = 0.2; break; + } + } + else + { + // FEMALES + switch (GetRacialType(oActivator)) + { + case RACIAL_TYPE_HUMAN: + case RACIAL_TYPE_HALFELF: fHeight = 1.6; fDistance = 0.12; break; + case RACIAL_TYPE_ELF: fHeight = 1.45; fDistance = 0.12; break; + case RACIAL_TYPE_GNOME: + case RACIAL_TYPE_HALFLING: fHeight = 1.1; fDistance = 0.075; break; + case RACIAL_TYPE_DWARF: fHeight = 1.2; fDistance = 0.1; break; + case RACIAL_TYPE_HALFORC: fHeight = 1.8; fDistance = 0.13; break; + } + } + location lAboveHead = GetLocationAboveAndInFrontOf(oActivator, fDistance, fHeight); + // emotes + switch (d3()) + { + case 1: AssignCommand(oActivator, ActionSpeakString(sEmote1)); break; + case 2: AssignCommand(oActivator, ActionSpeakString(sEmote2)); break; + case 3: AssignCommand(oActivator, ActionSpeakString(sEmote3));break; + } + // glow red + AssignCommand(oActivator, ActionDoCommand(ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_LIGHT_RED_5), oActivator, 0.15))); + // wait a moment + AssignCommand(oActivator, ActionWait(3.0)); + // puff of smoke above and in front of head + AssignCommand(oActivator, ActionDoCommand(ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SMOKE_PUFF), lAboveHead))); + // if female, turn head to left + if ((GetGender(oActivator) == GENDER_FEMALE) && (GetRacialType(oActivator) != RACIAL_TYPE_DWARF)) + AssignCommand(oActivator, ActionPlayAnimation(ANIMATION_FIREFORGET_HEAD_TURN_LEFT, 1.0, 5.0)); +} + +void EmoteDance(object oPC) +{ + object oRightHand = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,oPC); + object oLeftHand = GetItemInSlot(INVENTORY_SLOT_LEFTHAND,oPC); + + AssignCommand(oPC,ActionUnequipItem(oRightHand)); + AssignCommand(oPC,ActionUnequipItem(oLeftHand)); + + AssignCommand(oPC,ActionPlayAnimation( ANIMATION_FIREFORGET_VICTORY2,1.0)); + AssignCommand(oPC,ActionDoCommand(PlayVoiceChat(VOICE_CHAT_LAUGH,oPC))); + AssignCommand(oPC,ActionPlayAnimation( ANIMATION_LOOPING_TALK_LAUGHING, 2.0, 2.0)); + AssignCommand(oPC,ActionPlayAnimation( ANIMATION_FIREFORGET_VICTORY1,1.0)); + AssignCommand(oPC,ActionPlayAnimation( ANIMATION_FIREFORGET_VICTORY3,2.0)); + AssignCommand(oPC,ActionPlayAnimation( ANIMATION_LOOPING_GET_MID, 3.0, 1.0)); + AssignCommand(oPC,ActionPlayAnimation( ANIMATION_LOOPING_TALK_FORCEFUL,1.0)); + AssignCommand(oPC,ActionPlayAnimation( ANIMATION_FIREFORGET_VICTORY2,1.0)); + AssignCommand(oPC,ActionDoCommand(PlayVoiceChat(VOICE_CHAT_LAUGH,oPC))); + AssignCommand(oPC,ActionPlayAnimation( ANIMATION_LOOPING_TALK_LAUGHING, 2.0, 2.0)); + AssignCommand(oPC,ActionPlayAnimation( ANIMATION_FIREFORGET_VICTORY1,1.0)); + AssignCommand(oPC,ActionPlayAnimation( ANIMATION_FIREFORGET_VICTORY3,2.0)); + AssignCommand(oPC,ActionDoCommand(PlayVoiceChat(VOICE_CHAT_LAUGH,oPC))); + AssignCommand(oPC,ActionPlayAnimation( ANIMATION_LOOPING_GET_MID, 3.0, 1.0)); + AssignCommand(oPC,ActionPlayAnimation( ANIMATION_FIREFORGET_VICTORY2,1.0)); + + AssignCommand(oPC,ActionDoCommand(ActionEquipItem(oLeftHand,INVENTORY_SLOT_LEFTHAND))); + AssignCommand(oPC,ActionDoCommand(ActionEquipItem(oRightHand,INVENTORY_SLOT_RIGHTHAND))); +} + +void SitInNearestChair(object oPC) +{ + object oSit,oRightHand,oLeftHand,oChair,oCouch,oBenchPew,oStool; + float fDistSit;int nth; + // get the closest chair, couch bench or stool + nth = 1;oChair = GetNearestObjectByTag("Chair", oPC,nth); + while(oChair != OBJECT_INVALID && GetSittingCreature(oChair) != OBJECT_INVALID) + {nth++;oChair = GetNearestObjectByTag("Chair", oPC,nth);} + + nth = 1;oCouch = GetNearestObjectByTag("Couch", oPC,nth); + while(oCouch != OBJECT_INVALID && GetSittingCreature(oCouch) != OBJECT_INVALID) + {nth++;oChair = GetNearestObjectByTag("Couch", oPC,nth);} + + nth = 1;oBenchPew = GetNearestObjectByTag("BenchPew", oPC,nth); + while(oBenchPew != OBJECT_INVALID && GetSittingCreature(oBenchPew) != OBJECT_INVALID) + {nth++;oChair = GetNearestObjectByTag("BenchPew", oPC,nth);} + /* 1.27 bug + nth = 1;oStool = GetNearestObjectByTag("Stool", oPC,nth); + while(oStool != OBJECT_INVALID && GetSittingCreature(oStool) != OBJECT_INVALID) + {nth++;oStool = GetNearestObjectByTag("Stool", oPC,nth);} + */ + // get the distance between the user and each object (-1.0 is the result if no + // object is found + float fDistanceChair = GetDistanceToObject(oChair); + float fDistanceBench = GetDistanceToObject(oBenchPew); + float fDistanceCouch = GetDistanceToObject(oCouch); + float fDistanceStool = GetDistanceToObject(oStool); + + // if any of the objects are invalid (not there), change the return value + // to a high number so the distance math can work + if (fDistanceChair == -1.0) + {fDistanceChair =1000.0;} + + if (fDistanceBench == -1.0) + {fDistanceBench = 1000.0;} + + if (fDistanceCouch == -1.0) + {fDistanceCouch = 1000.0;} + + if (fDistanceStool == -1.0) + {fDistanceStool = 1000.0;} + + // find out which object is closest to the PC + if (fDistanceChair 0) + { + sReturnString =sReturnString + "/" + sClassTwo + "(" + IntToString(nLevelTwo) + ")"; + } + + //If third class exists append to return string + if(nLevelThree > 0) + { + sReturnString =sReturnString + "/" + sClassThree + "(" + IntToString(nLevelThree) + ")"; + } + + return sReturnString; +} + +string dmwand_Gender(object oEntity) +{ + switch (GetGender(oEntity)) + { + case GENDER_MALE: return "Male"; break; + case GENDER_FEMALE: return "Female"; break; + case GENDER_BOTH: return "Both"; break; + case GENDER_NONE: return "None"; break; + case GENDER_OTHER: return "Other"; break; + } + + return "Weirdo"; +} + +string dmwand_ItemInfo(object oItem, int iInt) +{ + string sReturnString = ""; + string sBaseType = ""; + string sStacked = ""; + string sIdentified = ""; + string sGPValue = ""; + string sACValue = ""; + string sProperties = ""; + + switch(GetBaseItemType(oItem)) + { + case BASE_ITEM_AMULET: sBaseType ="Amulet";break; + case BASE_ITEM_ARMOR: sBaseType ="Armor";break; + case BASE_ITEM_ARROW: sBaseType ="Arrow";break; + case BASE_ITEM_BASTARDSWORD: sBaseType ="Bastard Sword";break; + case BASE_ITEM_BATTLEAXE: sBaseType ="Battle Axe";break; + case BASE_ITEM_BELT: sBaseType ="Belt";break; + case BASE_ITEM_BLANK_POTION : sBaseType ="Blank Potion";break; + case BASE_ITEM_BLANK_SCROLL : sBaseType ="Blank Scroll";break; + case BASE_ITEM_BLANK_WAND : sBaseType ="Blank Wand";break; + case BASE_ITEM_BOLT : sBaseType ="Bolt";break; + case BASE_ITEM_BOOK: sBaseType ="Book";break; + case BASE_ITEM_BOOTS: sBaseType ="Boots";break; + case BASE_ITEM_BRACER: sBaseType ="Bracer";break; + case BASE_ITEM_BULLET: sBaseType ="Bullet";break; + case BASE_ITEM_CBLUDGWEAPON: sBaseType ="Bludgeoning Weap.";break; + case BASE_ITEM_CLOAK: sBaseType ="Cloak";break; + case BASE_ITEM_CLUB: sBaseType ="Club";break; + case BASE_ITEM_CPIERCWEAPON: sBaseType ="Pierceing Weap.";break; + case BASE_ITEM_CREATUREITEM: sBaseType ="Creature Item";break; + case BASE_ITEM_CSLASHWEAPON: sBaseType ="Slash Weap.";break; + case BASE_ITEM_CSLSHPRCWEAP: sBaseType ="Slash/Pierce Weap.";break; + case BASE_ITEM_DAGGER: sBaseType ="Dagger";break; + case BASE_ITEM_DART: sBaseType ="Dart";break; + case BASE_ITEM_DIREMACE: sBaseType ="Mace";break; + case BASE_ITEM_DOUBLEAXE: sBaseType ="Double Axe";break; + case BASE_ITEM_DWARVENWARAXE : sBaseType ="Dwarven War Axe";break; + case BASE_ITEM_ENCHANTED_POTION : sBaseType ="Enchanted Potion";break; + case BASE_ITEM_ENCHANTED_SCROLL : sBaseType ="Enchanted Scroll";break; + case BASE_ITEM_ENCHANTED_WAND : sBaseType ="Enchanted Wand";break; + case BASE_ITEM_GEM: sBaseType ="Gem";break; + case BASE_ITEM_GLOVES: sBaseType ="Gloves";break; + case BASE_ITEM_GOLD: sBaseType ="Gold";break; + case BASE_ITEM_GREATAXE: sBaseType ="Great Axe";break; + case BASE_ITEM_GREATSWORD: sBaseType ="Great Sword";break; + case BASE_ITEM_GRENADE : sBaseType ="Grenade";break; + case BASE_ITEM_HALBERD: sBaseType ="Halberd";break; + case BASE_ITEM_HANDAXE: sBaseType ="Hand Axe";break; + case BASE_ITEM_HEALERSKIT: sBaseType ="Healers Kit";break; + case BASE_ITEM_HEAVYCROSSBOW: sBaseType ="Heavy Xbow";break; + case BASE_ITEM_HEAVYFLAIL: sBaseType ="Heavy Flail";break; + case BASE_ITEM_HELMET: sBaseType ="Helmet";break; + case BASE_ITEM_INVALID: sBaseType ="";break; + case BASE_ITEM_KAMA: sBaseType ="Kama";break; + case BASE_ITEM_KATANA: sBaseType ="Katana";break; + case BASE_ITEM_KEY: sBaseType ="Key";break; + case BASE_ITEM_KUKRI: sBaseType ="Kukri";break; + case BASE_ITEM_LARGEBOX: sBaseType ="Large Box";break; + case BASE_ITEM_LARGESHIELD: sBaseType ="Large Shield";break; + case BASE_ITEM_LIGHTCROSSBOW: sBaseType ="Light Xbow";break; + case BASE_ITEM_LIGHTFLAIL: sBaseType ="Light Flail";break; + case BASE_ITEM_LIGHTHAMMER: sBaseType ="Light Hammer";break; + case BASE_ITEM_LIGHTMACE: sBaseType ="Light Mace";break; + case BASE_ITEM_LONGBOW: sBaseType ="Long Bow";break; + case BASE_ITEM_LONGSWORD: sBaseType ="Long Sword";break; + case BASE_ITEM_MAGICROD: sBaseType ="Magic Rod";break; + case BASE_ITEM_MAGICSTAFF: sBaseType ="Magic Staff";break; + case BASE_ITEM_MAGICWAND: sBaseType ="Magic Wand";break; + case BASE_ITEM_MISCLARGE: sBaseType ="Misc. Large";break; + case BASE_ITEM_MISCMEDIUM: sBaseType ="Misc. Medium";break; + case BASE_ITEM_MISCSMALL: sBaseType ="Misc. Small";break; + case BASE_ITEM_MISCTALL: sBaseType ="Misc. Small";break; + case BASE_ITEM_MISCTHIN: sBaseType ="Misc. Thin";break; + case BASE_ITEM_MISCWIDE: sBaseType ="Misc. Wide";break; + case BASE_ITEM_MORNINGSTAR: sBaseType ="Morningstar";break; + case BASE_ITEM_POTIONS: sBaseType ="Potion";break; + case BASE_ITEM_QUARTERSTAFF: sBaseType ="Quarterstaff";break; + case BASE_ITEM_RAPIER: sBaseType ="Rapier";break; + case BASE_ITEM_RING: sBaseType ="Ring";break; + case BASE_ITEM_SCIMITAR: sBaseType ="Scimitar";break; + case BASE_ITEM_SCROLL: sBaseType ="Scroll";break; + case BASE_ITEM_SCYTHE: sBaseType ="Scythe";break; + case BASE_ITEM_SHORTBOW: sBaseType ="Shortbow";break; + case BASE_ITEM_SHORTSPEAR: sBaseType ="Short Spear";break; + case BASE_ITEM_SHORTSWORD: sBaseType ="Short Sword";break; + case BASE_ITEM_SHURIKEN: sBaseType ="Shuriken";break; + case BASE_ITEM_SICKLE: sBaseType ="Sickle";break; + case BASE_ITEM_SLING: sBaseType ="Sling";break; + case BASE_ITEM_SMALLSHIELD: sBaseType ="Small Shield";break; + case BASE_ITEM_SPELLSCROLL: sBaseType ="Spell Scroll";break; + case BASE_ITEM_THIEVESTOOLS: sBaseType ="Thieves Tools";break; + case BASE_ITEM_THROWINGAXE: sBaseType ="Throwing Axe";break; + case BASE_ITEM_TORCH: sBaseType ="Torch";break; + case BASE_ITEM_TOWERSHIELD: sBaseType ="Tower Shield";break; + case BASE_ITEM_TRAPKIT: sBaseType ="Trap Kit";break; + case BASE_ITEM_TRIDENT: sBaseType ="Trident";break; + case BASE_ITEM_TWOBLADEDSWORD: sBaseType ="2 Bladed Sword";break; + case BASE_ITEM_WARHAMMER: sBaseType ="Warhammer";break; + case BASE_ITEM_WHIP : sBaseType ="Whip";break; + } + + sReturnString = sStacked + GetName(oItem) + " (" + sBaseType + ")"; + return sReturnString; +} + +string dmwand_Inventory(object oEntity) +{ + + string sBaseType; + string sReturnString; + + sReturnString = sReturnString + "\nEquipped:\n"; + if(GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_ARMS, oMyTarget))){ sReturnString = sReturnString + "Arms: " + dmwand_ItemInfo(GetItemInSlot(INVENTORY_SLOT_ARMS, oMyTarget),0) + "\n"; } + if(GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_BELT, oMyTarget))){ sReturnString = sReturnString + "Belt: " + dmwand_ItemInfo(GetItemInSlot(INVENTORY_SLOT_BELT, oMyTarget),0) + "\n"; } + if(GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_BOOTS, oMyTarget))){ sReturnString = sReturnString + "Boots: " + dmwand_ItemInfo(GetItemInSlot(INVENTORY_SLOT_BOOTS, oMyTarget),0) + "\n"; } + if(GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_CHEST, oMyTarget))){ sReturnString = sReturnString + "Chest: " + dmwand_ItemInfo(GetItemInSlot(INVENTORY_SLOT_CHEST, oMyTarget),0) + "\n"; } + if(GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_CLOAK, oMyTarget))){ sReturnString = sReturnString + "Cloak: " + dmwand_ItemInfo(GetItemInSlot(INVENTORY_SLOT_CLOAK, oMyTarget),0) + "\n"; } + if(GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_HEAD, oMyTarget))){ sReturnString = sReturnString + "Head: " + dmwand_ItemInfo(GetItemInSlot(INVENTORY_SLOT_HEAD, oMyTarget),0) + "\n"; } + if(GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oMyTarget))){ sReturnString = sReturnString + "Left Hand: " + dmwand_ItemInfo(GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oMyTarget),0) + "\n"; } + if(GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_LEFTRING, oMyTarget))){ sReturnString = sReturnString + "Left Ring: " + dmwand_ItemInfo(GetItemInSlot(INVENTORY_SLOT_LEFTRING, oMyTarget),0) + "\n"; } + if(GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_NECK, oMyTarget))){ sReturnString = sReturnString + "Neck: " + dmwand_ItemInfo(GetItemInSlot(INVENTORY_SLOT_NECK, oMyTarget),0) + "\n"; } + if(GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oMyTarget))){ sReturnString = sReturnString + "Right Hand: " + dmwand_ItemInfo(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oMyTarget),0) + "\n"; } + if(GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_RIGHTRING, oMyTarget))){ sReturnString = sReturnString + "Right Ring: " + dmwand_ItemInfo(GetItemInSlot(INVENTORY_SLOT_RIGHTRING, oMyTarget),0) + "\n"; } + if(GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_ARROWS, oMyTarget))){ sReturnString = sReturnString + "Arrows: " + dmwand_ItemInfo(GetItemInSlot(INVENTORY_SLOT_ARROWS, oMyTarget),0) + "\n"; } + if(GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_BOLTS, oMyTarget))){ sReturnString = sReturnString + "Bolts: " + dmwand_ItemInfo(GetItemInSlot(INVENTORY_SLOT_BOLTS, oMyTarget),0) + "\n"; } + if(GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_BULLETS, oMyTarget))){ sReturnString = sReturnString + "Bullets: " + dmwand_ItemInfo(GetItemInSlot(INVENTORY_SLOT_BULLETS, oMyTarget),0) + "\n"; } + if(GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_CARMOUR, oMyTarget))){ sReturnString = sReturnString + "Creature Armor: " + dmwand_ItemInfo(GetItemInSlot(INVENTORY_SLOT_CARMOUR, oMyTarget),0) + "\n"; } + if(GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_CWEAPON_B, oMyTarget))){ sReturnString = sReturnString + "Creature Bite: " + dmwand_ItemInfo(GetItemInSlot(INVENTORY_SLOT_CWEAPON_B, oMyTarget),0) + "\n"; } + if(GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_CWEAPON_L, oMyTarget))){ sReturnString = sReturnString + "Creature Left: " + dmwand_ItemInfo(GetItemInSlot(INVENTORY_SLOT_CWEAPON_L, oMyTarget),0) + "\n"; } + if(GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_CWEAPON_R, oMyTarget))){ sReturnString = sReturnString + "Creature Right: " + dmwand_ItemInfo(GetItemInSlot(INVENTORY_SLOT_CWEAPON_R, oMyTarget),0) + "\n"; } + + object oItem = GetFirstItemInInventory(oEntity); + + while(oItem != OBJECT_INVALID) + { + sReturnString = sReturnString + "\n" + dmwand_ItemInfo(oItem, 0); + oItem = GetNextItemInInventory(oEntity); + }; + + return sReturnString; +} + +string dmwand_Race(object oEntity) +{ + switch (GetRacialType(oEntity)) + { + case RACIAL_TYPE_ABERRATION: return "Aberration"; break; + case RACIAL_TYPE_ALL: return "All"; break; + case RACIAL_TYPE_ANIMAL: return "Animal"; break; + case RACIAL_TYPE_BEAST: return "Beast"; break; + case RACIAL_TYPE_CONSTRUCT: return "Construct"; break; + case RACIAL_TYPE_DRAGON: return "Dragon"; break; + case RACIAL_TYPE_DWARF: return "Dwarf"; break; + case RACIAL_TYPE_ELEMENTAL: return "Elemental"; break; + case RACIAL_TYPE_ELF: return "Elf"; break; + case RACIAL_TYPE_FEY: return "Fey"; break; + case RACIAL_TYPE_GIANT: return "Giant"; break; + case RACIAL_TYPE_GNOME: return "Gnome"; break; + case RACIAL_TYPE_HALFELF: return "Half Elf"; break; + case RACIAL_TYPE_HALFLING: return "Halfling"; break; + case RACIAL_TYPE_HALFORC: return "Half Orc"; break; + case RACIAL_TYPE_HUMAN: return "Human"; break; + case RACIAL_TYPE_HUMANOID_GOBLINOID: return "Goblinoid"; break; + case RACIAL_TYPE_HUMANOID_MONSTROUS: return "Monstrous"; break; + case RACIAL_TYPE_HUMANOID_ORC: return "Orc"; break; + case RACIAL_TYPE_HUMANOID_REPTILIAN: return "Reptillian"; break; + case RACIAL_TYPE_MAGICAL_BEAST: return "Magical Beast"; break; + case RACIAL_TYPE_OOZE: return "Ooze"; break; + case RACIAL_TYPE_OUTSIDER: return "Outsider"; break; + case RACIAL_TYPE_SHAPECHANGER: return "Shapechanger"; break; + case RACIAL_TYPE_UNDEAD: return "Undead"; break; + case RACIAL_TYPE_VERMIN: return "Vermin"; break; + } + + return "Unknown"; +} +int DMFI_GetNetWorth(object oTarget) +{ + int n; + object oItem = GetFirstItemInInventory(oTarget); + while(GetIsObjectValid(oItem)) + { + n= n + GetGoldPieceValue(oItem); + oItem = GetNextItemInInventory(oTarget); + } + + + n = n + GetGoldPieceValue(GetItemInSlot(INVENTORY_SLOT_ARMS, oTarget)); + n = n + GetGoldPieceValue(GetItemInSlot(INVENTORY_SLOT_ARROWS, oTarget)); + n = n + GetGoldPieceValue(GetItemInSlot(INVENTORY_SLOT_BELT, oTarget)); + n = n + GetGoldPieceValue(GetItemInSlot(INVENTORY_SLOT_BOLTS, oTarget)); + n = n + GetGoldPieceValue(GetItemInSlot(INVENTORY_SLOT_BOOTS, oTarget)); + n = n + GetGoldPieceValue(GetItemInSlot(INVENTORY_SLOT_BULLETS, oTarget)); + n = n + GetGoldPieceValue(GetItemInSlot(INVENTORY_SLOT_CARMOUR, oTarget)); + n = n + GetGoldPieceValue(GetItemInSlot(INVENTORY_SLOT_CHEST, oTarget)); + n = n + GetGoldPieceValue(GetItemInSlot(INVENTORY_SLOT_CLOAK, oTarget)); + n = n + GetGoldPieceValue(GetItemInSlot(INVENTORY_SLOT_CWEAPON_B, oTarget)); + n = n + GetGoldPieceValue(GetItemInSlot(INVENTORY_SLOT_CWEAPON_L, oTarget)); + n = n + GetGoldPieceValue(GetItemInSlot(INVENTORY_SLOT_CWEAPON_R, oTarget)); + n = n + GetGoldPieceValue(GetItemInSlot(INVENTORY_SLOT_HEAD, oTarget)); + n = n + GetGoldPieceValue(GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oTarget)); + n = n + GetGoldPieceValue(GetItemInSlot(INVENTORY_SLOT_LEFTRING, oTarget)); + n = n + GetGoldPieceValue(GetItemInSlot(INVENTORY_SLOT_NECK, oTarget)); + n = n + GetGoldPieceValue(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oTarget)); + n = n + GetGoldPieceValue(GetItemInSlot(INVENTORY_SLOT_RIGHTRING, oTarget)); + return n; +} + +void DMFI_report(object oTarget, object oUser) +{ + string sSTR = IntToString(GetAbilityScore(oMyTarget,ABILITY_STRENGTH)); + string sINT = IntToString(GetAbilityScore(oMyTarget,ABILITY_INTELLIGENCE)); + string sDEX = IntToString(GetAbilityScore(oMyTarget,ABILITY_DEXTERITY)); + string sWIS = IntToString(GetAbilityScore(oMyTarget,ABILITY_WISDOM)); + string sCON = IntToString(GetAbilityScore(oMyTarget,ABILITY_CONSTITUTION)); + string sCHA = IntToString(GetAbilityScore(oMyTarget,ABILITY_CHARISMA)); + string sReport = "\n-------------------------------------------" + + "\nReported: " + IntToString(GetTimeHour()) + ":" + IntToString(GetTimeMinute()) + + "\nPlayer Name: " + GetPCPlayerName(oMyTarget) + + "\nPublic CDKey: " + GetPCPublicCDKey(oMyTarget) + + "\nChar Name: " + GetName(oMyTarget) + + "\n-------------------------------------------" + + "\nRace: " + dmwand_Race(oMyTarget) + + "\nClass: " + dmwand_ClassLevel(oMyTarget) + + "\nXP: " + IntToString(GetXP(oMyTarget)) + + "\nGender: " + dmwand_Gender(oMyTarget) + + "\nAlign: " + dmwand_Alignment(oMyTarget) + + "\nDeity: " + GetDeity(oMyTarget) + + "\n" + + "\nSTR: " + sSTR + + "\nINT: " + sINT + + "\nWIS: " + sWIS + + "\nDEX: " + sDEX + + "\nCON: " + sCON + + "\nCHA: " + sCHA + + "\n" + + "\nHP: " + IntToString(GetCurrentHitPoints(oMyTarget)) + + " of " + IntToString(GetMaxHitPoints(oMyTarget)) + + "\nAC: " + IntToString(GetAC(oMyTarget)) + + "\nGold: " + IntToString(GetGold(oMyTarget)) + + "\nNet Worth: " + IntToString(DMFI_GetNetWorth(oMyTarget) + GetGold(oMyTarget)) + + "\nInventory:\n " + dmwand_Inventory(oMyTarget) + + "\n-------------------------------------------"; + + SendMessageToPC(oUser, sReport); + SendMessageToAllDMs(sReport); +} diff --git a/gamma_age_v2/dmfi_emote.uti b/gamma_age_v2/dmfi_emote.uti new file mode 100644 index 0000000000000000000000000000000000000000..2281bd3f714b59aa24f56c6a070e34286a01f580 GIT binary patch literal 1494 zcmZuxU2j`O5WOvFfh8>zLZMIHA5aHDgjD4%jY(q^r&jDH5)Yt_@7P{)@9x#^x{(pe zPvqzDTF$w5osZIyj%Rmf=gjQh@w}Z3^y$v_PcMt2xDSkgXTab0I=%TxQTz_apAU+n zg#91r&!FE!po*{g133gf1-{@W3yv0`DZU3b0rJz&HE4_NyxxF*1t@?qM?465*r|ek zax;d){N&}a&+{6pji;UGZ`Z+mv{N1d>-A%-cYrT5pjyta@}B%pfI$x6U0DO|-vH#I zYys_KKz~a^mZ#8sGs<_s&j9bp_xKGY6RDfZBsr0IA~U>!i84r1!`;e}pPI`4CFQZH z1(v?VX|PSQ-nD-22c@`VXI7ACV&+|7{@q`gFqe33+xIbDZ?G6AUr9&Rn#ajZFUCli z4~;5+=lot--l4din<4wl5Lw4shQ5?)WJ3C}vy6goBqS^G$g+~WU*+o+dgYgTVcv;0*`sGZv~mCABv}`&(N-%^!C;)N4Le3p7e0#9 z*2N^I)PC0bFL4vSj1sn$YVQ_zRj(hcyP#T99hj=p_*PD^_EqIC^)X&lVnXezH+G+oX|`6&zIF2h}_CAuepA)X)d%o{_0u$sCFJomB6&Bz@#ByT#CE z8tbmp;e%RGeMpW=mO9t`QD3g9_7})9Sp-43PN}Oabt0uiJ9koQGdDqXOSFmCTKs^EJ^8H|@mUps<}dJvc=+ tfCm7l9H$$n8mAc}*He-chEs~|#|gs8!M@{E;xytE+5$LrIBm#J{0D=gDc%48 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_en_ditto.uti b/gamma_age_v2/dmfi_en_ditto.uti new file mode 100644 index 0000000000000000000000000000000000000000..e46bdd4bc1224f8d61859f86d2261fe41d1a29dd GIT binary patch literal 1264 zcmah}OK;Oa5MH3=5#CVVue||6sssp$3lePtYNQs0CbSo%Xlqa76}H#1H=uB+_yznz zZgAtufg60Ey>3%3jPzx8#xvi{u4eLX)Yn^2m!CXWN*x2<0~+{tM5!ClDV)Ed;{~O@ zK>vU~1N{dAr7rOYvId-}PlyfY)4`@%1VE{-1I#}PoC{~xeG$%}S8st1z?|;@<#?kM zzq8IyCP7XD1X_WAFNG3AwuH zSIQDlKMeF0I)Yq<=DW03hlWsg`vYnbdxk_>IW~o}N@uX$x;%UVo?Ek0tkZ*9w{+nMsove!Gb&CsOVE zx~}s31`b2-Qfa7a_t2Z@!w>~S&>(e(;#cDM5XF3LrgW!e#XefuaIvHVQ~Jk^XHdFA zN^hlFx9lX?vv55%obLEp(N+f^`W=~_wDr*5GU>FnL2a_Y%?gcu5P|#Wk*pMjn6mkv ziucm*HSK^u%kX-^!o0=Vt{qE0j;;6Z5&Ybub{cQN?rps8>sNW?rn#3=_ZX+QZ9Ear zL7WdK>(_sLd$31|t@NilMaR=3wGk$u(moNLn#yb0XZMNmdgiA0KZ=e@L0F7LpVYAj zO>CPyUhZ`E_ByLGy=IcUa!x-;cok;@)(WDngEb}hUm=bH1q04xIB zY3?$2n7hl_<*so@NyMGxp4gm6m2V+xD`U*VmnG19KCNq{E^Lmzv|1Efy53p9| zK>ZCcu}C+;{bgYNo{CIAVC9{Wegv~#*2tLu0A!&}TbrcE8jp2Z6pu{QS<(jPo}T*B z)b@>5&rGAx9B3?qZIkt`w^N=~>XKbrMWBUQ4F~gge{I4_q5Ry`-6#XvG#Q%_2Kn3r^}AB{+Ez^%?6sz(vx6ZW;5Q9!FH3mO zs#)5X>Pp|aq`yGVE+4yvFMe?NcqV^lhafMEtJo~NZbW;J$KBO=$j@{mkJY3u=mU|- zHri-jUnW8GFia$ z;*AK>@|)OKk-WU>YF;73*o0#*Y_-z#tGqVB`Y!I=5reX^ zlNhP-i!hP#8Z_SmvnsuNts#zf+*Rva=~{_vzp-v5_s>CP6@1smsq8HiN{m|b&fsGP z%WqjF-l_N{j^1Lc##0SjMIxv&&kM%$p7Ldn3InakND*O0EcsC A+W-In literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_execute.ncs b/gamma_age_v2/dmfi_execute.ncs new file mode 100644 index 0000000000000000000000000000000000000000..0c096a6650fe4ecbae7d6c883739d7eacbd8ed00 GIT binary patch literal 180255 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 E4|;RcF8}}l literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_execute.nss b/gamma_age_v2/dmfi_execute.nss new file mode 100644 index 00000000..5e6dc26e --- /dev/null +++ b/gamma_age_v2/dmfi_execute.nss @@ -0,0 +1,4193 @@ +//:://///////////////////////////////////////////// +//:: DMFI - Universal Wand executable +//:: dmfi_execute +//::////////////////////////////////////////////// +/* + Processing for all DMFI wands & widgets universal conversation choices. + + Credits: + Bioware - Dicebag + Arawen - Skill Check Wand (implemented with the Dicebag) + Jhenne (tallonzek@hotmail.com) \ Authors of the original FX Wand, + Doppleganger / DM Wand and Emote Wand + Demetrious - XP wand + Dezran (dezran@roguepenguin.com) - Rod of Affliction + Lurker - Music Wand + Oddbod - FX wand improvements + Ty Worsham (volition) - Sound Creator Beta + OldManWhistler - NPC corpse functions + + hahnsoo (hahns_shin@hotmail.com) - Final Improved FX wand, Universal wand scripts, + Encounter wand, DM Voice scripts, Faction wand, + Spirelands Resting system + J.R.R.Tolkien - References to the One Ring. +*/ +//::////////////////////////////////////////////// +//:: Created By: The DMFI Team +//:: Created On: +//::////////////////////////////////////////////// +//:: 2007.04.12 hahnsoo and Demetrious - version 1.08a +//:: 2007.12.12 Merle - fixes to DMFI rest system +//:: 2008.05.25 tsunami282 - updated for NWN 1.69 (DMFI OnPlayerChat event handling) +//:: 2008.05.26 tsunami282 - XP wand: grant percent XP based on each party member's level, not selected party member + +#include "dmfi_db_inc" +#include "dmfi_dmw_inc" +#include "x2_inc_toollib" +#include "dmfi_plychat_inc" +#include "dmfi_plchlishk_i" +#include "dmfi_getln_inc" + +int iNightMusic; +int iDayMusic; +int iBattleMusic; + +//////////////////////////////////////////////////////////////////////// +object DMFI_NextTarget(object oTarget, object oUser) +{ + object oNew; + + if (GetIsPC(oTarget)) + { + if (GetIsObjectValid(GetNextFactionMember(oTarget))) + oNew = GetNextFactionMember(oTarget); + else + oNew = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC, oTarget, 1); + } + else + oNew = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_NOT_PC, oTarget, 1); + + + if (!GetIsObjectValid(oNew)) + { + SendMessageToPC(oUser, "No valid target to transfer to."); + oNew = oTarget; + } + + SetLocalObject(oUser, "dmfi_univ_target", oNew); + SetCustomToken(20680, GetName(oNew)); + FloatingTextStringOnCreature("Target changed to: "+ GetName(oNew), oUser); + return oNew; +} + +//////////////////////////////////////////////////////////////////////// +//DMFI Creates the "settings" creature +void CreateSetting(object oUser) +{ + object oSetting = CreateObject(OBJECT_TYPE_CREATURE, "dmfi_setting", GetLocation(oUser)); + DelayCommand(0.5f, AssignCommand(oSetting, ActionSpeakString(GetLocalString(oUser, "EffectSetting") + " is currently set at " + FloatToString(GetLocalFloat(oUser, GetLocalString(oUser, "EffectSetting")))))); + SetLocalObject(oSetting, "MyMaster", oUser); + SetListenPattern(oSetting, "**", LISTEN_PATTERN); //listen to all text + SetLocalInt(oSetting, "hls_Listening", 1); //listen to all text + SetListening(oSetting, TRUE); //be sure NPC is listening +} + +//////////////////////////////////////////////////////////////////////// +//DMFI Processes the dice rolls +void RollDemBones(object oUser, int iBroadcast, int iMod = 0, string sAbility = "", int iNum = 1, int iSide = 20) +{ + + string sString = ""; + int iRoll = 0; + int iTotal = 0; + //Build the string + sString = sAbility+"Roll " + IntToString(iNum) + "d" + IntToString(iSide) + ": "; + while (iNum > 1) + { + iRoll = Random(iSide) + 1; + iTotal = iTotal + iRoll; + sString = sString + IntToString(iRoll) + " + "; + iNum--; + } + iRoll = Random(iSide) + 1; + iTotal = iTotal + iRoll; + sString = sString + IntToString(iRoll); + if (iMod) + { + iTotal = iTotal + iMod; + sString = sString + " + Modifier: " + IntToString(iMod); + } + sString = sString + " = Total: " + IntToString(iTotal); + + //Perform appropriate animation + if (GetLocalInt(oUser, "dmfi_dice_no_animate")!=1) + { + switch (GetLocalInt(oUser, "dmfi_univ_int")) + { + case 71: AssignCommand(oUser, PlayAnimation(ANIMATION_LOOPING_TALK_PLEADING, 1.0, 5.0f)); break; + case 72: AssignCommand(oUser, PlayAnimation(ANIMATION_FIREFORGET_PAUSE_SCRATCH_HEAD, 1.0)); break; + case 73: AssignCommand(oUser, PlayAnimation(ANIMATION_FIREFORGET_TAUNT, 1.0)); break; + case 74: AssignCommand(oUser, PlayAnimation(ANIMATION_FIREFORGET_HEAD_TURN_LEFT, 1.0)); break; + case 78: AssignCommand(oUser, PlayAnimation(ANIMATION_LOOPING_GET_LOW, 1.0, 5.0f)); break; + case 81: AssignCommand(oUser, PlayAnimation(ANIMATION_LOOPING_CONJURE1, 1.0, 5.0f)); break; + case 82: AssignCommand(oUser, PlayAnimation(ANIMATION_FIREFORGET_DODGE_SIDE, 1.0)); break; + case 83: AssignCommand(oUser, PlayAnimation(ANIMATION_FIREFORGET_TAUNT, 1.0)); break; + case 84: AssignCommand(oUser, PlayAnimation(ANIMATION_LOOPING_LISTEN, 1.0, 5.0f)); break; + case 85: AssignCommand(oUser, PlayAnimation(ANIMATION_FIREFORGET_PAUSE_SCRATCH_HEAD, 1.0)); break; + case 89: AssignCommand(oUser, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_BARD_SONG), oUser, 6.0f)); break; + case 91: AssignCommand(oUser, PlayAnimation(ANIMATION_LOOPING_TALK_PLEADING, 1.0, 5.0f)); break; + case 95: AssignCommand(oUser, PlayAnimation(ANIMATION_LOOPING_CONJURE2, 1.0, 5.0f)); break; + case 97: AssignCommand(oUser, PlayAnimation(ANIMATION_FIREFORGET_TAUNT, 1.0)); break; + case 98: AssignCommand(oUser, PlayAnimation(ANIMATION_FIREFORGET_DODGE_DUCK, 1.0)); break; + default: AssignCommand(oUser, PlayAnimation (ANIMATION_LOOPING_GET_MID, 1.0, 3.0)); break; + } + } + + sString = ColorText(sString, "cyan"); + //-------------------------------------------------------- + switch (iBroadcast) + { + case 3: break; //dm only + case 1: AssignCommand(oUser, SpeakString(sString , TALKVOLUME_SHOUT)); break; + case 2: AssignCommand(oUser, SpeakString(sString)); break; + default: if (GetIsPC(oUser)) SendMessageToPC(oUser, sString);break; + } + //-------------------------------------------------------- + AssignCommand(oUser, SpeakString( sString, TALKVOLUME_SILENT_SHOUT)); + return; +} + +//////////////////////////////////////////////////////////////////////// +//This function is for the DMFI PC Dicebag +void DoDiceBagFunction(int iDice, object oUser, int iDMOverride = 0) +{ + string sAbility = ""; + int iTrain =0; + int iNum = 0; + int iSide = 0; + int iMod = 0; + int iLeft; + if (iDice < 100) + iLeft = StringToInt(GetStringLeft(IntToString(iDice), 1)); + else + iLeft = 10; + int iRight = StringToInt(GetStringRight(IntToString(iDice), 1)); + switch (iDice) + { + case 61: iNum = 1; iSide = 20; sAbility="Strength Check, "; iMod = GetAbilityModifier(ABILITY_STRENGTH, oUser); break; + case 62: iNum = 1; iSide = 20; sAbility="Dexterity Check, "; iMod = GetAbilityModifier(ABILITY_DEXTERITY, oUser); break; + case 63: iNum = 1; iSide = 20; sAbility="Constitution Check, "; iMod = GetAbilityModifier(ABILITY_CONSTITUTION, oUser); break; + case 64: iNum = 1; iSide = 20; sAbility="Intelligence Check, "; iMod = GetAbilityModifier(ABILITY_INTELLIGENCE, oUser); break; + case 65: iNum = 1; iSide = 20; sAbility="Wisdom Check, "; iMod = GetAbilityModifier(ABILITY_WISDOM, oUser); break; + case 66: iNum = 1; iSide = 20; sAbility="Charisma Check, "; iMod = GetAbilityModifier(ABILITY_CHARISMA, oUser); break; + case 67: iNum = 1; iSide = 20; sAbility="Fortitude Save, "; iMod = GetFortitudeSavingThrow(oUser); break; + case 68: iNum = 1; iSide = 20; sAbility="Reflex Save, "; iMod = GetReflexSavingThrow(oUser); break; + case 69: iNum = 1; iSide = 20; sAbility="Will Save, "; iMod = GetWillSavingThrow(oUser); break; + + case 71: iNum = 1; iSide = 20; iTrain = 1; sAbility="Animal Empathy Check, "; iMod = GetSkillRank(SKILL_ANIMAL_EMPATHY, oUser); break; + case 72: iNum = 1; iSide = 20; sAbility="Appraise Check, "; iMod = GetSkillRank(SKILL_APPRAISE, oUser); break; + case 73: iNum = 1; iSide = 20; sAbility="Bluff Check, "; iMod = GetSkillRank(SKILL_BLUFF, oUser); break; + case 74: iNum = 1; iSide = 20; sAbility="Concentration Check, "; iMod = GetSkillRank(SKILL_CONCENTRATION, oUser); break; + case 75: iNum = 1; iSide = 20; sAbility="Craft Armor Check, "; iMod = GetSkillRank(SKILL_CRAFT_ARMOR, oUser); break; + case 76: iNum = 1; iSide = 20; sAbility="Craft Trap Check, "; iMod = GetSkillRank(SKILL_CRAFT_TRAP, oUser); break; + case 77: iNum = 1; iSide = 20; sAbility="Craft Weapon Check, "; iMod = GetSkillRank(SKILL_CRAFT_WEAPON, oUser); break; + case 78: iNum = 1; iSide = 20; iTrain = 1; sAbility="Disable Trap Check, "; iMod = GetSkillRank(SKILL_DISABLE_TRAP, oUser); break; + case 79: iNum = 1; iSide = 20; sAbility="Discipline Check, "; iMod = GetSkillRank(SKILL_DISCIPLINE, oUser); break; + + case 81: iNum = 1; iSide = 20; sAbility="Heal Check, "; iMod = GetSkillRank(SKILL_HEAL, oUser); break; + case 82: iNum = 1; iSide = 20; sAbility="Hide Check, "; iMod = GetSkillRank(SKILL_HIDE, oUser); break; + case 83: iNum = 1; iSide = 20; sAbility="Intimidate Check, "; iMod = GetSkillRank(SKILL_INTIMIDATE, oUser); break; + case 84: iNum = 1; iSide = 20; sAbility="Listen Check, "; iMod = GetSkillRank(SKILL_LISTEN, oUser); break; + case 85: iNum = 1; iSide = 20; sAbility="Lore Check, "; iMod = GetSkillRank(SKILL_LORE, oUser); break; + case 86: iNum = 1; iSide = 20; sAbility="Move Silently Check, "; iMod = GetSkillRank(SKILL_MOVE_SILENTLY, oUser); break; + case 87: iNum = 1; iSide = 20; iTrain = 1; sAbility="Open Lock Check, "; iMod = GetSkillRank(SKILL_OPEN_LOCK, oUser); break; + case 88: iNum = 1; iSide = 20; sAbility="Parry Check, "; iMod = GetSkillRank(SKILL_PARRY, oUser); break; + case 89: iNum = 1; iSide = 20; sAbility="Perform Check, "; iMod = GetSkillRank(SKILL_PERFORM, oUser); break; + // 2008.07.30 morderon - added ride check + case 90: iNum = 1; iSide = 20; sAbility="Ride, "; iMod = GetSkillRank(SKILL_RIDE, oUser); break; + case 91: iNum = 1; iSide = 20; sAbility="Persuade Check, "; iMod = GetSkillRank(SKILL_PERSUADE, oUser); break; + case 92: iNum = 1; iSide = 20; iTrain = 1; sAbility="Pick Pocket Check, "; iMod = GetSkillRank(SKILL_PICK_POCKET, oUser); break; + case 93: iNum = 1; iSide = 20; sAbility="Search Check, "; iMod = GetSkillRank(SKILL_SEARCH, oUser); break; + case 94: iNum = 1; iSide = 20; iTrain = 1; sAbility="Set Trap Check, "; iMod = GetSkillRank(SKILL_SET_TRAP, oUser); break; + case 95: iNum = 1; iSide = 20; iTrain = 1; sAbility="Spellcraft Check, "; iMod = GetSkillRank(SKILL_SPELLCRAFT, oUser); break; + case 96: iNum = 1; iSide = 20; sAbility="Spot Check, "; iMod = GetSkillRank(SKILL_SPOT, oUser); break; + case 97: iNum = 1; iSide = 20; sAbility="Taunt Check, "; iMod = GetSkillRank(SKILL_TAUNT, oUser); break; + case 98: iNum = 1; iSide = 20; iTrain = 1; sAbility="Tumble Check, "; iMod = GetSkillRank(SKILL_TUMBLE, oUser); break; + case 99: iNum = 1; iSide = 20; iTrain = 1; sAbility="Use Magic Device Check, "; iMod = GetSkillRank(SKILL_USE_MAGIC_DEVICE, oUser); break; + + case 101: SetLocalInt(oUser, "dmfi_dicebag", 2); SetDMFIPersistentInt("dmfi", "dmfi_dicebag", 2, oUser); SetCustomToken(20681, "Local"); FloatingTextStringOnCreature("Broadcast Mode set to Local", oUser, FALSE); return; break; + case 102: SetLocalInt(oUser, "dmfi_dicebag", 1); SetDMFIPersistentInt("dmfi", "dmfi_dicebag", 1, oUser); SetCustomToken(20681, "Global"); FloatingTextStringOnCreature("Broadcast Mode set to Global", oUser, FALSE); return; break; + case 103: SetLocalInt(oUser, "dmfi_dicebag", 0); SetDMFIPersistentInt("dmfi", "dmfi_dicebag", 0, oUser); SetCustomToken(20681, "Private"); FloatingTextStringOnCreature("Broadcast Mode set to Private", oUser, FALSE); return; break; + default: iNum = iRight; + + switch (iLeft) + { + case 1: iSide = 4; break; + case 2: iSide = 6; break; + case 3: iSide = 8; break; + case 4: iSide = 10; break; + case 5: iSide = 20; break; + } + break; + } + if ((iTrain)&&(iMod==0)) + { + string sMsg = ColorText("No dice roll: Skill requires training", "red"); + SendMessageToPC(oUser, sMsg); + AssignCommand(oUser, SpeakString( sMsg, TALKVOLUME_SILENT_SHOUT)); + return; + } + + + int iTell = GetLocalInt(oUser, "dmfi_dicebag"); + + if (iDMOverride) + iTell = iDMOverride; + + RollDemBones(oUser, iTell, iMod, sAbility, iNum, iSide); +} + +//////////////////////////////////////////////////////////////////////// +//By OldManWhistler for the DMFI Control Wand +void DestroyAllItems() +{ + if (GetIsDead(OBJECT_SELF)) + { + object oItem = GetFirstItemInInventory(); + while (GetIsObjectValid(oItem)) + { + DestroyObject(oItem); + oItem = GetNextItemInInventory(); + } + if (GetIsObjectValid(oItem=GetItemInSlot(INVENTORY_SLOT_ARMS))) + DestroyObject(oItem); + if (GetIsObjectValid(oItem=GetItemInSlot(INVENTORY_SLOT_ARROWS))) + DestroyObject(oItem); + if (GetIsObjectValid(oItem=GetItemInSlot(INVENTORY_SLOT_BELT))) + DestroyObject(oItem); + if (GetIsObjectValid(oItem=GetItemInSlot(INVENTORY_SLOT_BOLTS))) + DestroyObject(oItem); + if (GetIsObjectValid(oItem=GetItemInSlot(INVENTORY_SLOT_BOOTS))) + DestroyObject(oItem); + if (GetIsObjectValid(oItem=GetItemInSlot(INVENTORY_SLOT_BULLETS))) + DestroyObject(oItem); + if (GetIsObjectValid(oItem=GetItemInSlot(INVENTORY_SLOT_CARMOUR))) + DestroyObject(oItem); + if (GetIsObjectValid(oItem=GetItemInSlot(INVENTORY_SLOT_CHEST))) + DestroyObject(oItem); + if (GetIsObjectValid(oItem=GetItemInSlot(INVENTORY_SLOT_CLOAK))) + DestroyObject(oItem); + if (GetIsObjectValid(oItem=GetItemInSlot(INVENTORY_SLOT_CWEAPON_B))) + DestroyObject(oItem); + if (GetIsObjectValid(oItem=GetItemInSlot(INVENTORY_SLOT_CWEAPON_L))) + DestroyObject(oItem); + if (GetIsObjectValid(oItem=GetItemInSlot(INVENTORY_SLOT_CWEAPON_R))) + DestroyObject(oItem); + if (GetIsObjectValid(oItem=GetItemInSlot(INVENTORY_SLOT_HEAD))) + DestroyObject(oItem); + if (GetIsObjectValid(oItem=GetItemInSlot(INVENTORY_SLOT_LEFTHAND))) + DestroyObject(oItem); + if (GetIsObjectValid(oItem=GetItemInSlot(INVENTORY_SLOT_LEFTRING))) + DestroyObject(oItem); + if (GetIsObjectValid(oItem=GetItemInSlot(INVENTORY_SLOT_NECK))) + DestroyObject(oItem); + if (GetIsObjectValid(oItem=GetItemInSlot(INVENTORY_SLOT_RIGHTHAND))) + DestroyObject(oItem); + if (GetIsObjectValid(oItem=GetItemInSlot(INVENTORY_SLOT_RIGHTRING))) + DestroyObject(oItem); + } +} + +//////////////////////////////////////////////////////////////////////// +// Function to destroy a target, by OldManWhistler, for the DMFI Control Wand +void DestroyCreature(object oTarget) +{ + AssignCommand(oTarget,SetIsDestroyable(TRUE,FALSE,FALSE)); + DestroyObject(oTarget); +} + +//////////////////////////////////////////////////////////////////////// +//DMFI NPC Control Wand +void DoControlFunction(int iFaction, object oUser) +{ + object oTarget = GetLocalObject(oUser, "dmfi_univ_target"); + object oArea = GetArea(oUser); + object oChange; + float fAlignShift; + int nAlignShift; + int nReport; + int nMessage; + + object oAlignTarget = GetNearestObject(OBJECT_TYPE_CREATURE, oUser); + + fAlignShift = GetLocalFloat(oUser, "dmfi_reputation"); + + if (fAlignShift == 0.0f) + fAlignShift = 10.0f; + + + nAlignShift = FloatToInt(fAlignShift); + + switch (iFaction) + { + case 10: //Toggle the state of all the encounters in the area + if (GetLocalInt(oArea, "dmfi_encounter_inactive")) + { + oChange = GetFirstObjectInArea(oArea); + while (GetIsObjectValid(oChange)) + { + if (GetObjectType(oChange) == OBJECT_TYPE_ENCOUNTER) + SetEncounterActive(TRUE, oChange); + oChange = GetNextObjectInArea(oArea); + } + FloatingTextStringOnCreature("Bioware encounters are active",oUser, FALSE); + SetLocalInt(oArea, "dmfi_encounter_inactive", FALSE); + } + else + { + oChange = GetFirstObjectInArea(oArea); + while (GetIsObjectValid(oChange)) + { + if (GetObjectType(oChange) == OBJECT_TYPE_ENCOUNTER) + SetEncounterActive(FALSE, oChange); + if (GetObjectType(oChange) == OBJECT_TYPE_CREATURE) + { + if (GetIsEncounterCreature(oChange)) + DestroyObject(oChange); //Nuke any encounter creatures in the area + } + oChange = GetNextObjectInArea(oArea); + } + FloatingTextStringOnCreature("Bioware encounters deactivated",oUser, FALSE); + SetLocalInt(oArea, "dmfi_encounter_inactive", TRUE); + } + break; + case 11: ChangeToStandardFaction(oTarget, STANDARD_FACTION_HOSTILE); break; + case 12: ChangeToStandardFaction(oTarget, STANDARD_FACTION_COMMONER); break; + case 13: ChangeToStandardFaction(oTarget, STANDARD_FACTION_DEFENDER); break; + case 14: ChangeToStandardFaction(oTarget, STANDARD_FACTION_MERCHANT); break; + case 15: oChange = GetFirstObjectInArea(oArea); + while (GetIsObjectValid(oChange)) + { + if (GetObjectType(oChange) == OBJECT_TYPE_CREATURE && !GetIsPC(oChange)) + ChangeToStandardFaction(oChange, STANDARD_FACTION_HOSTILE); + oChange = GetNextObjectInArea(oArea); + }break; + case 16: oChange = GetFirstObjectInArea(oArea); + while (GetIsObjectValid(oChange)) + { + if (GetObjectType(oChange) == OBJECT_TYPE_CREATURE && !GetIsPC(oChange)) + ChangeToStandardFaction(oChange, STANDARD_FACTION_COMMONER); + oChange = GetNextObjectInArea(oArea); + }break; + case 17: oChange = GetFirstObjectInArea(oArea); + while (GetIsObjectValid(oChange)) + { + if (GetObjectType(oChange) == OBJECT_TYPE_CREATURE && !GetIsPC(oChange)) + ChangeToStandardFaction(oChange, STANDARD_FACTION_DEFENDER); + oChange = GetNextObjectInArea(oArea); + }break; + case 18: oChange = GetFirstObjectInArea(oArea); + while (GetIsObjectValid(oChange)) + { + if (GetObjectType(oChange) == OBJECT_TYPE_CREATURE && !GetIsPC(oChange)) + ChangeToStandardFaction(oChange, STANDARD_FACTION_MERCHANT); + oChange = GetNextObjectInArea(oArea); + }break; + case 21: oChange = GetFirstPC(); + while (GetIsObjectValid(oChange)) + { + SetStandardFactionReputation(STANDARD_FACTION_HOSTILE, 0, oChange); + SetStandardFactionReputation(STANDARD_FACTION_COMMONER, 100, oChange); + SetStandardFactionReputation(STANDARD_FACTION_DEFENDER, 100, oChange); + SetStandardFactionReputation(STANDARD_FACTION_MERCHANT, 100, oChange); + oChange = GetNextPC(); + }break; + case 22: oChange = GetFirstPC(); + while (GetIsObjectValid(oChange)) + { + SetStandardFactionReputation(STANDARD_FACTION_HOSTILE, 20, oChange); + SetStandardFactionReputation(STANDARD_FACTION_COMMONER, 91, oChange); + SetStandardFactionReputation(STANDARD_FACTION_DEFENDER, 100, oChange); + SetStandardFactionReputation(STANDARD_FACTION_MERCHANT, 50, oChange); + oChange = GetNextPC(); + }break; + case 23: oChange = GetFirstPC(); + while (GetIsObjectValid(oChange)) + { + SetStandardFactionReputation(STANDARD_FACTION_HOSTILE, 0 , oChange); + SetStandardFactionReputation(STANDARD_FACTION_COMMONER, 0, oChange); + SetStandardFactionReputation(STANDARD_FACTION_DEFENDER, 0, oChange); + SetStandardFactionReputation(STANDARD_FACTION_MERCHANT, 0, oChange); + oChange = GetNextPC(); + }break; + case 24: oChange = GetFirstPC(); + while (GetIsObjectValid(oChange)) + { + SetStandardFactionReputation(STANDARD_FACTION_HOSTILE, 100, oChange); + SetStandardFactionReputation(STANDARD_FACTION_COMMONER, 100, oChange); + SetStandardFactionReputation(STANDARD_FACTION_DEFENDER, 100, oChange); + SetStandardFactionReputation(STANDARD_FACTION_MERCHANT, 100, oChange); + oChange = GetNextPC(); + }break; + case 25: oChange = GetFirstObjectInArea(oArea); + while (GetIsObjectValid(oChange)) + { + if (GetObjectType(oChange) == OBJECT_TYPE_CREATURE) + { + SetStandardFactionReputation(STANDARD_FACTION_HOSTILE, 0, oChange); + SetStandardFactionReputation(STANDARD_FACTION_COMMONER, 0, oChange); + SetStandardFactionReputation(STANDARD_FACTION_DEFENDER, 0, oChange); + SetStandardFactionReputation(STANDARD_FACTION_MERCHANT, 0, oChange); + } + oChange = GetNextObjectInArea(oArea); + }break; + case 26: oChange = GetFirstObjectInArea(oArea); + while (GetIsObjectValid(oChange)) + { + if (GetObjectType(oChange) == OBJECT_TYPE_CREATURE) + { + AssignCommand(oChange, ClearAllActions(TRUE)); + SetStandardFactionReputation(STANDARD_FACTION_HOSTILE, 50, oChange); + SetStandardFactionReputation(STANDARD_FACTION_COMMONER, 50, oChange); + SetStandardFactionReputation(STANDARD_FACTION_DEFENDER, 50, oChange); + SetStandardFactionReputation(STANDARD_FACTION_MERCHANT, 50, oChange); + } + oChange = GetNextObjectInArea(oArea); + }break; + case 31: SetLocalObject(oUser, "dmfi_customfaction1", oTarget); nMessage = -1; break; + case 32: SetLocalObject(oUser, "dmfi_customfaction2", oTarget); nMessage = -1;break; + case 33: SetLocalObject(oUser, "dmfi_customfaction3", oTarget); nMessage = -1;break; + case 34: SetLocalObject(oUser, "dmfi_customfaction4", oTarget); nMessage = -1;break; + case 35: SetLocalObject(oUser, "dmfi_customfaction5", oTarget); nMessage = -1;break; + case 36: SetLocalObject(oUser, "dmfi_customfaction6", oTarget); nMessage = -1;break; + case 37: SetLocalObject(oUser, "dmfi_customfaction7", oTarget); nMessage = -1;break; + case 38: SetLocalObject(oUser, "dmfi_customfaction8", oTarget); nMessage = -1;break; + case 39: SetLocalObject(oUser, "dmfi_customfaction9", oTarget); nMessage = -1;break; + case 41: ChangeFaction(oTarget, GetLocalObject(oUser, "dmfi_customfaction1")); nMessage = -1;break; + case 42: ChangeFaction(oTarget, GetLocalObject(oUser, "dmfi_customfaction2")); nMessage = -1;break; + case 43: ChangeFaction(oTarget, GetLocalObject(oUser, "dmfi_customfaction3")); nMessage = -1;break; + case 44: ChangeFaction(oTarget, GetLocalObject(oUser, "dmfi_customfaction4")); nMessage = -1;break; + case 45: ChangeFaction(oTarget, GetLocalObject(oUser, "dmfi_customfaction5")); nMessage = -1;break; + case 46: ChangeFaction(oTarget, GetLocalObject(oUser, "dmfi_customfaction6")); nMessage = -1;break; + case 47: ChangeFaction(oTarget, GetLocalObject(oUser, "dmfi_customfaction7")); nMessage = -1;break; + case 48: ChangeFaction(oTarget, GetLocalObject(oUser, "dmfi_customfaction8")); nMessage = -1;break; + case 49: ChangeFaction(oTarget, GetLocalObject(oUser, "dmfi_customfaction9")); nMessage = -1;break; + case 51: RemoveHenchman(GetMaster(oTarget), oTarget); + SetLocalObject(oUser, "dmfi_henchman", oTarget); nMessage = -1;break; + case 52: RemoveHenchman(oTarget, GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oTarget)); + AddHenchman(oTarget, GetLocalObject(oUser, "dmfi_henchman")); nMessage = -1;break; + case 61: AssignCommand(oTarget, ClearAllActions()); AssignCommand(oTarget, ActionMoveAwayFromObject(oUser, TRUE)); nMessage = -1;break; + case 62: AssignCommand(oTarget, ClearAllActions()); AssignCommand(oTarget, ActionForceMoveToObject(oUser, TRUE, 2.0f, 30.0f)); nMessage = -1;break; + case 63: AssignCommand(oTarget, ClearAllActions()); AssignCommand(oTarget, ActionRandomWalk());nMessage = -1; break; + case 64: AssignCommand(oTarget, ClearAllActions()); AssignCommand(oTarget, ActionRest());nMessage = -1; break; + case 65: oChange = GetFirstObjectInArea(oArea); + while (GetIsObjectValid(oChange)) + { + if (GetObjectType(oChange) == OBJECT_TYPE_CREATURE && !GetIsPC(oChange)) + { + AssignCommand(oChange, ClearAllActions()); AssignCommand(oChange, ActionMoveAwayFromObject(oUser, TRUE)); + } + oChange = GetNextObjectInArea(oArea); + }nMessage = -1; break; + case 66: oChange = GetFirstObjectInArea(oArea); + while (GetIsObjectValid(oChange)) + { + if (GetObjectType(oChange) == OBJECT_TYPE_CREATURE && !GetIsPC(oChange)) + { + AssignCommand(oChange, ClearAllActions()); AssignCommand(oChange, ActionForceMoveToObject(oUser, TRUE, 2.0f, 30.0f)); + } + oChange = GetNextObjectInArea(oArea); + }nMessage = -1; break; + case 67: oChange = GetFirstObjectInArea(oArea); + while (GetIsObjectValid(oChange)) + { + if (GetObjectType(oChange) == OBJECT_TYPE_CREATURE && !GetIsPC(oChange)) + { + AssignCommand(oChange, ClearAllActions()); AssignCommand(oChange, ActionRandomWalk()); + } + oChange = GetNextObjectInArea(oArea); + }nMessage = -1; break; + case 68: oChange = GetFirstObjectInArea(oArea); + while (GetIsObjectValid(oChange)) + { + if (GetObjectType(oChange) == OBJECT_TYPE_CREATURE && !GetIsPC(oChange)) + { + AssignCommand(oChange, ClearAllActions()); AssignCommand(oChange, ActionRest()); + } + oChange = GetNextObjectInArea(oArea); + } nMessage = -1;break; + case 69: ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDisappear(), oTarget); + DestroyObject(oTarget, 1.0); nMessage = -1;break; + case 70: DestroyCreature(oTarget); nMessage = -1;break; + case 71: AssignCommand(oTarget, SetIsDestroyable(FALSE, TRUE, TRUE)); nMessage = -1;break; + case 72: AssignCommand(oTarget, SetIsDestroyable(FALSE, FALSE, TRUE)); nMessage = -1;break; + case 73: AssignCommand(oTarget, SetIsDestroyable(FALSE, FALSE, FALSE));nMessage = -1; break; + case 74: AssignCommand(oTarget, SetIsDestroyable(TRUE, FALSE, FALSE));nMessage = -1; break; + case 75: AssignCommand(oTarget, SetIsDestroyable(FALSE, TRUE, TRUE)); + DelayCommand(0.1, AssignCommand(oTarget, ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectDeath(), oTarget))); nMessage = -1;break; + case 76: AssignCommand(oTarget, SetIsDestroyable(FALSE, FALSE, TRUE)); + DelayCommand(0.1, AssignCommand(oTarget, ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectDeath(), oTarget))); nMessage = -1;break; + case 77: AssignCommand(oTarget, SetIsDestroyable(FALSE, FALSE, FALSE)); + DelayCommand(0.1, AssignCommand(oTarget, ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectDeath(), oTarget))); nMessage = -1;break; + case 78: AssignCommand(oTarget, SetIsDestroyable(TRUE, FALSE, FALSE)); + DelayCommand(0.1, AssignCommand(oTarget, ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectDeath(), oTarget)));nMessage = -1; break; + case 79: AssignCommand(oTarget, DestroyAllItems()); + DelayCommand(1.0, DestroyCreature(oTarget));nMessage = -1;break; + case 81: //AdjustReputation(oAlignTarget, oTarget, nAlignShift); + AdjustReputation(oTarget, oAlignTarget, nAlignShift); + nReport = GetReputation(oAlignTarget, oTarget); + FloatingTextStringOnCreature("Current Reputation: "+ GetName(oTarget) + " vs. " +GetName(oAlignTarget)+": " + IntToString(nReport), oUser); + nReport = GetReputation(oTarget, oAlignTarget); + FloatingTextStringOnCreature("Current Reputation: "+ GetName(oAlignTarget) + " vs. " +GetName(oTarget)+": " + IntToString(nReport), oUser); + break; + case 82: //AdjustReputation(oAlignTarget, oTarget, -nAlignShift); + AdjustReputation(oTarget, oAlignTarget, -nAlignShift); + nReport = GetReputation(oAlignTarget, oTarget); + FloatingTextStringOnCreature("Current Reputation: "+ GetName(oTarget) + " vs. " +GetName(oAlignTarget)+": " + IntToString(nReport), oUser); + nReport = GetReputation(oTarget, oAlignTarget); + FloatingTextStringOnCreature("Current Reputation: "+ GetName(oAlignTarget) + " vs. " +GetName(oTarget)+": " + IntToString(nReport), oUser); + break; + case 83: SetLocalString(oUser, "EffectSetting", "dmfi_reputation"); + CreateSetting(oUser);nMessage = -1; break; + case 84: nReport = GetReputation(oAlignTarget, oTarget); + FloatingTextStringOnCreature("Current Reputation: "+ GetName(oTarget) + " vs. " +GetName(oAlignTarget)+": " + IntToString(nReport), oUser); + nReport = GetReputation(oTarget, oAlignTarget); + FloatingTextStringOnCreature("Current Reputation: "+ GetName(oAlignTarget) + " vs. " +GetName(oTarget)+": " + IntToString(nReport), oUser); + nMessage = -1;break; + case 9: { + if (GetLocalInt(GetModule(), "dmfi_safe_factions")!=1) + { + SetLocalInt(GetModule(), "dmfi_safe_factions", 1); + SetDMFIPersistentInt("dmfi", "dmfi_safe_factions", 1, oUser); + FloatingTextStringOnCreature("Default non-hostile faction should ignore PC attacks",oUser, FALSE); + } + else + { + SetLocalInt(GetModule(), "dmfi_safe_factions", 0); + SetDMFIPersistentInt("dmfi", "dmfi_safe_factions", 0, oUser); + FloatingTextStringOnCreature("Bioware faction behavior restored",oUser, FALSE); + } + } + + default: nMessage = -1;break; + + } + + if (nMessage!=-1) + { + if (GetIsImmune(oTarget, IMMUNITY_TYPE_BLINDNESS)) + FloatingTextStringOnCreature("Targeted creature is blind immune - no attack will occur until new perception event is fired", oUser); + else + { + effect eInvis =EffectBlindness(); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eInvis, oTarget, 6.1); + FloatingTextStringOnCreature("Faction Adjusted - Perception event will fire in 6 seconds", oUser); + } + } + +} + +//////////////////////////////////////////////////////////////////////// +void IdenStuff(object oTarget) +{ + object oItem = GetFirstItemInInventory(oTarget); + while (GetIsObjectValid(oItem)) + { + if (GetIdentified(oItem)==FALSE) + SetIdentified(oItem, TRUE); + + oItem = GetNextItemInInventory(oTarget); + } +} + +//////////////////////////////////////////////////////////////////////// +void TakeStuff(int Level, object oTarget, object oUser) +{ + object oItem = GetFirstItemInInventory(oTarget); + while (GetIsObjectValid(oItem)) + { + DestroyObject(oItem); + oItem = GetNextItemInInventory(oTarget); + } + + if (Level == 1) + { + DestroyObject(GetItemInSlot(INVENTORY_SLOT_ARMS,oTarget)); + DestroyObject(GetItemInSlot(INVENTORY_SLOT_ARROWS,oTarget)); + DestroyObject(GetItemInSlot(INVENTORY_SLOT_BELT,oTarget)); + DestroyObject(GetItemInSlot(INVENTORY_SLOT_BOLTS,oTarget)); + DestroyObject(GetItemInSlot(INVENTORY_SLOT_BOOTS,oTarget)); + DestroyObject(GetItemInSlot(INVENTORY_SLOT_BULLETS,oTarget)); + DestroyObject(GetItemInSlot(INVENTORY_SLOT_CARMOUR,oTarget)); + DestroyObject(GetItemInSlot(INVENTORY_SLOT_CHEST,oTarget)); + DestroyObject(GetItemInSlot(INVENTORY_SLOT_CLOAK,oTarget)); + DestroyObject(GetItemInSlot(INVENTORY_SLOT_CWEAPON_B,oTarget)); + DestroyObject(GetItemInSlot(INVENTORY_SLOT_CWEAPON_L,oTarget)); + DestroyObject(GetItemInSlot(INVENTORY_SLOT_CWEAPON_R,oTarget)); + DestroyObject(GetItemInSlot(INVENTORY_SLOT_HEAD,oTarget)); + DestroyObject(GetItemInSlot(INVENTORY_SLOT_LEFTHAND,oTarget)); + DestroyObject(GetItemInSlot(INVENTORY_SLOT_LEFTRING,oTarget)); + DestroyObject(GetItemInSlot(INVENTORY_SLOT_NECK,oTarget)); + DestroyObject(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,oTarget)); + DestroyObject(GetItemInSlot(INVENTORY_SLOT_RIGHTRING,oTarget)); + } + FloatingTextStringOnCreature("DM Intervention: Inventory Destroyed by DM", oTarget); +} + +//////////////////////////////////////////////////////////////////////// +void TakeUber(object oTarget) +{ + int nMultiplier; + if (GetHitDice(oTarget)<11) + nMultiplier = 1; + else if (GetHitDice(oTarget)<16) + nMultiplier = 2; + else if (GetHitDice(oTarget)<20) + nMultiplier = 3; + else + nMultiplier = 5; + object oItem = GetFirstItemInInventory(oTarget); + while (GetIsObjectValid(oItem)) + { + if (GetGoldPieceValue(oItem)>1000*nMultiplier*GetHitDice(oTarget)) + DestroyObject(oItem); + oItem = GetNextItemInInventory(oTarget); + } + FloatingTextStringOnCreature("DM Intervention: Uber type items have been removed", oTarget); +} + +//////////////////////////////////////////////////////////////////////// +void RotateMe(object oTarget, int Amount, object oUser) +{ + location lLocation = GetLocation (oTarget); + if (GetObjectType(oTarget) != OBJECT_TYPE_PLACEABLE) + { + oTarget = GetNearestObject(OBJECT_TYPE_PLACEABLE, oUser); + FloatingTextStringOnCreature("Target was not a placable, used placeable closest to your avitar", oUser); + } + if (Amount == -2) + { + AssignCommand(oTarget, SetFacing(90.0)); + return; + } + if (Amount == -1) + { + AssignCommand(oTarget, SetFacing(0.0)); + return; + } + if (GetIsObjectValid(oTarget)) + AssignCommand(oTarget, SetFacing(GetFacing(oTarget)+Amount)); +} + +//////////////////////////////////////////////////////////////////////// +void DMFI_Object (object oTarget, int Action, object oUser) +{ + location lLocation = GetLocation (oTarget); + if (GetObjectType(oTarget) != OBJECT_TYPE_PLACEABLE) + { + oTarget = GetNearestObject(OBJECT_TYPE_PLACEABLE, oUser); + FloatingTextStringOnCreature("Target was not a placable, used placeable closest to your avitar", oUser); + } + if (GetIsObjectValid(oTarget)) + { + if (Action==1) + { + DestroyObject(oTarget); + DelayCommand(2.0, FloatingTextStringOnCreature(GetName(oTarget) + "destroyed. If 'static', you must leave and return to see effect.", oUser)); + } + else if (Action ==2) + { + AssignCommand(oTarget, PlayAnimation(ANIMATION_PLACEABLE_DEACTIVATE)); + DelayCommand(0.4,SetPlaceableIllumination(oTarget, FALSE)); + DelayCommand(0.5,RecomputeStaticLighting(GetArea(oTarget))); + } + else if (Action ==3) + { + AssignCommand(oTarget, PlayAnimation(ANIMATION_PLACEABLE_ACTIVATE)); + DelayCommand(0.4,SetPlaceableIllumination(oTarget, TRUE)); + DelayCommand(0.5,RecomputeStaticLighting(GetArea(oTarget))); + } + } +} + +//////////////////////////////////////////////////////////////////////// +void dmwand_SwapDayNight(int nDay) +{ + int nCurrentHour; + int nCurrentMinute = GetTimeMinute(); + int nCurrentSecond = GetTimeSecond(); + int nCurrentMilli = GetTimeMillisecond(); + + nCurrentHour = ((nDay == 1)?7:19); + + SetTime(nCurrentHour, nCurrentMinute, nCurrentSecond, nCurrentMilli); +} + +//////////////////////////////////////////////////////////////////////// +void dmwand_AdvanceTime(int nHours) +{ + int nCurrentHour = GetTimeHour(); + int nCurrentMinute = GetTimeMinute(); + int nCurrentSecond = GetTimeSecond(); + int nCurrentMilli = GetTimeMillisecond(); + + nCurrentHour += nHours; + SetTime(nCurrentHour, nCurrentMinute, nCurrentSecond, nCurrentMilli); +} + +//////////////////////////////////////////////////////////////////////// +void DMFI_Align(object oUser, object oTarget, int nAlign, int nParty) +{ + if (GetObjectType(oTarget)== OBJECT_TYPE_CREATURE) + { + int nAmount = GetLocalInt(oUser, "dmfi_alignshift"); + + if (nParty) + { + object oParty = GetFirstFactionMember(oTarget, TRUE); + while (GetIsObjectValid(oParty)) + { + AdjustAlignment(oParty, nAlign, nAmount); + oParty = GetNextFactionMember(oTarget, TRUE); + } + FloatingTextStringOnCreature("Party Alignment shifted by " + IntToString(nAmount), oUser); + } + else + { + AdjustAlignment(oTarget, nAlign, nAmount); + FloatingTextStringOnCreature("Target Alignment shifted by " + IntToString(nAmount), oUser); + } + } + else + FloatingTextStringOnCreature("Must target a creature for this action", oUser); + +} + +//////////////////////////////////////////////////////////////////////// +void DMFI_Roll(object oUser) +{ + object oStoreState = GetItemPossessedBy(oUser, "dmfi_dmw"); + int n = GetLocalInt(oUser, "dmfi_alignshift"); + if (n == 1) + n = 2; + else if (n ==2) + n = 5; + else if (n ==5) + n = 10; + else if (n == 10) + n = 1; + FloatingTextStringOnCreature("Adjustment changed to " + IntToString(n), oUser); + SetLocalInt(oUser, "dmfi_alignshift", n); + SetCustomToken(20781, IntToString(n)); + SetDMFIPersistentInt("dmfi", "dmfi_alignshift", n, oUser); +} + + +//////////////////////////////////////////////////////////////////////// +int GetAreaXAxis(object oArea) +{ + + location locTile; + int iX = 0; + int iY = 0; + vector vTile = Vector(0.0, 0.0, 0.0); + + for (iX = 0; iX < 32; ++iX) + { + vTile.x = IntToFloat(iX); + locTile = Location(oArea, vTile, 0.0); + int iRes = GetTileMainLight1Color(locTile); + if (iRes > 32 || iRes < 0) + return(iX); + } + + return 32; +} + +//////////////////////////////////////////////////////////////////////// +int GetAreaYAxis(object oArea) +{ + location locTile; + int iX = 0; + int iY = 0; + vector vTile = Vector(0.0, 0.0, 0.0); + + for (iY = 0; iY < 32; ++iY) + { + vTile.y = IntToFloat(iY); + locTile = Location(oArea, vTile, 0.0); + int iRes = GetTileMainLight1Color(locTile); + if (iRes > 32 || iRes < 0) + return(iY); + } + + return 32; +} + +//////////////////////////////////////////////////////////////////////// +void TilesetMagic(object oUser, int nEffect, int nType) +{ + int iXAxis = GetAreaXAxis(GetArea(oUser)); + int iYAxis = GetAreaYAxis(GetArea(oUser)); + int nBase = GetLocalInt(GetModule(), "dmfi_tileset"); + +// nType definitions: +// 0 fill +// 1 flood +// 2 groundcover + +// nBase definitions: +// 0 default +// 1 Sewer and City - raise the fill effect to -0.1 + + + float ZEffectAdjust = 0.0; + float ZTypeAdjust = 0.1; //default is groundcover + float ZTileAdjust = 0.0; + float ZFinalAxis; + +/* +if (nEffect == X2_TL_GROUNDTILE_ICE) + ZEffectAdjust = -1.0; // lower the effect based on trial and error +*/ + if (nEffect == X2_TL_GROUNDTILE_SEWER_WATER) + ZEffectAdjust = 0.8; + +//now sep based on nType + if (nType == 0) //fill + ZTypeAdjust=-2.0; + else if (nType ==1) + ZTypeAdjust = 2.0; + + ZFinalAxis = ZEffectAdjust + ZTypeAdjust + ZTileAdjust; + +//special case for filling of water and sewer regions + if ((nBase==1) && (nType==0)) + ZFinalAxis = -0.1; + + TLResetAreaGroundTiles(GetArea(oUser), iXAxis, iYAxis); + TLChangeAreaGroundTiles(GetArea(oUser), nEffect , iXAxis, iYAxis, ZFinalAxis); +} + +//////////////////////////////////////////////////////////////////////// +//New DM Wand by Demetrious +void DoNewDMThingy(int iChoice, object oUser) +{ + location lLocation = GetLocalLocation(oUser, "dmfi_univ_location"); + object oTarget = GetLocalObject(oUser, "dmfi_univ_target"); + int iXAxis = GetAreaXAxis(GetArea(oUser)); + int iYAxis = GetAreaYAxis(GetArea(oUser)); + object oCopy; object oParty; + int n; string sName; + + switch (iChoice) + { + case 11: TakeStuff(1, oTarget, oUser); break; + case 12: TakeStuff(0, oTarget, oUser); break; + case 13: IdenStuff(oTarget); break; + case 14: TakeUber(oTarget); break; + case 15: DMFI_NextTarget(oTarget, oUser);break; + case 20: DMFI_NextTarget(oTarget, oUser);break; + case 21: DMFI_Align(oUser, oTarget, ALIGNMENT_GOOD, 0);break; + case 22: DMFI_Align(oUser, oTarget, ALIGNMENT_EVIL, 0);break; + case 23: DMFI_Align(oUser, oTarget, ALIGNMENT_LAWFUL, 0);break; + case 24: DMFI_Align(oUser, oTarget, ALIGNMENT_CHAOTIC, 0);break; + case 25: DMFI_Align(oUser, oTarget, ALIGNMENT_GOOD, 1);break; + case 26: DMFI_Align(oUser, oTarget, ALIGNMENT_EVIL, 1);break; + case 27: DMFI_Align(oUser, oTarget, ALIGNMENT_LAWFUL, 1);break; + case 28: DMFI_Align(oUser, oTarget, ALIGNMENT_CHAOTIC, 1);break; + case 29: DMFI_Roll(oUser); break; + case 31: SendMessageToPC(oUser, "Item name: "+GetName(oTarget)); + SendMessageToPC(oUser, "Item value: "+IntToString(GetGoldPieceValue(oTarget))); + if (GetDroppableFlag(oTarget)) SendMessageToPC(oUser, "Droppable"); + else SendMessageToPC(oUser, "Not droppable"); + if (GetItemCursedFlag(oTarget)) SendMessageToPC(oUser, "Cursed"); + else SendMessageToPC(oUser, "Not cursed"); + if (GetPlotFlag(oTarget)) SendMessageToPC(oUser, "Plot related"); + else SendMessageToPC(oUser, "Not plot related"); + if (GetStolenFlag(oTarget)) SendMessageToPC(oUser, "Stolen"); + else SendMessageToPC(oUser, "Not stolen"); + SendMessageToPC(oUser, "Charges remaining: " + IntToString(GetItemCharges(oTarget))); + break; + + case 32: if (GetObjectType(oTarget)==OBJECT_TYPE_ITEM) + { + SetPlotFlag(oTarget, FALSE); DestroyObject(oTarget); + FloatingTextStringOnCreature(GetName(oTarget)+": Item destroyed", oUser); + } + else + { + FloatingTextStringOnCreature("Invalid target. Target item directly from inventory screen", oUser); + } + break; + case 33: if (GetObjectType(oTarget)==OBJECT_TYPE_ITEM) + { + SetItemCharges(oTarget, 0); + FloatingTextStringOnCreature( GetName(oTarget)+": Remaining charges removed", oUser); + } + else + { + FloatingTextStringOnCreature("Invalid target. Target item directly from inventory screen", oUser); + } + break; + + + case 34: if (GetObjectType(oTarget)==OBJECT_TYPE_ITEM) + { + SetItemCharges(oTarget, 999); + FloatingTextStringOnCreature( GetName(oTarget)+": Item fully recharged",oUser); break; + } + else + { + FloatingTextStringOnCreature("Invalid target. Target item directly from inventory screen", oUser); + } + break; + + case 35: if (GetObjectType(oTarget)==OBJECT_TYPE_ITEM) + { + if (GetDroppableFlag(oTarget)) + { + SetDroppableFlag(oTarget, FALSE); + FloatingTextStringOnCreature(GetName(oTarget)+": can NOT be dropped", oUser); + } + else + { + SetDroppableFlag(oTarget, TRUE); + FloatingTextStringOnCreature( GetName(oTarget)+": can be dropped", oUser); + } + } + else + { + FloatingTextStringOnCreature("Invalid target. Target item directly from inventory screen", oUser); + } + break; + + case 36: if (GetObjectType(oTarget)==OBJECT_TYPE_ITEM) + { + if (GetItemCursedFlag(oTarget)) + { + SetItemCursedFlag(oTarget, FALSE); + FloatingTextStringOnCreature(GetName(oTarget)+": NOT cursed", oUser); + } + else + { + SetItemCursedFlag(oTarget, TRUE); + FloatingTextStringOnCreature( GetName(oTarget)+": set to CURSED", oUser); + } + } + else + { + FloatingTextStringOnCreature("Invalid target. Target item directly from inventory screen", oUser); + } + break; + + case 37: if (GetObjectType(oTarget)==OBJECT_TYPE_ITEM) + { + if (GetPlotFlag(oTarget)) + { + SetPlotFlag(oTarget, FALSE); + FloatingTextStringOnCreature(GetName(oTarget)+": NOT plot related", oUser); + } + else + { + SetPlotFlag(oTarget, TRUE); + FloatingTextStringOnCreature( GetName(oTarget)+": set to PLOT", oUser); + } + } + else + { + FloatingTextStringOnCreature("Invalid target. Target item directly from inventory screen", oUser); + } + break; + case 38: if (GetObjectType(oTarget)==OBJECT_TYPE_ITEM) + { + if (GetStolenFlag(oTarget)) + { + SetStolenFlag(oTarget, FALSE); + FloatingTextStringOnCreature(GetName(oTarget)+": NOT stolen", oUser); + } + else + { + SetStolenFlag(oTarget, TRUE); + FloatingTextStringOnCreature( GetName(oTarget)+": set to Stolen", oUser); + } + } + else + { + FloatingTextStringOnCreature("Invalid target. Target item directly from inventory screen", oUser); + } + break; + + + case 41: DMFI_Object(oTarget, 1, oUser); break; + case 42: DMFI_Object(oTarget, 2, oUser);break; + case 43: DMFI_Object(oTarget, 3, oUser); break; + case 45: RotateMe(oTarget, -2, oUser);break; + case 46: RotateMe(oTarget, -1, oUser);break; + case 47: RotateMe(oTarget, 30, oUser);break; + case 48: RotateMe(oTarget, 45, oUser);break; + case 49: RotateMe(oTarget, 90, oUser);break; + case 40: RotateMe(oTarget, 180, oUser);break; + case 51: dmwand_AdvanceTime(1);break; + case 52: dmwand_AdvanceTime(4);break; + case 53: dmwand_AdvanceTime(8);break; + case 54: dmwand_AdvanceTime(24);break; + case 55: dmwand_SwapDayNight(0);break; + case 50: dmwand_SwapDayNight(1);break; + case 56: SetWeather(GetArea(oUser), WEATHER_CLEAR); break; + case 57: SetWeather(GetArea(oUser), WEATHER_RAIN); break; + case 58: SetWeather(GetArea(oUser), WEATHER_SNOW); break; + case 59: SetWeather(GetArea(oUser), WEATHER_USE_AREA_SETTINGS); break; + case 60: DMFI_report(oTarget, oUser); break; + case 61: DMFI_toad(oTarget, oUser); break; + case 62: DMFI_jail(oTarget, oUser); break; + case 63: AssignCommand(oUser, AddToParty( oUser, GetFactionLeader(oTarget)));break; + case 64: RemoveFromParty(oUser);break; + case 65: ExploreAreaForPlayer(GetArea(oTarget), oTarget); FloatingTextStringOnCreature("Map Given: Target", oUser);break; + case 66: { + FloatingTextStringOnCreature("Map Given: Party", oUser); + object oParty = GetFirstFactionMember(oTarget,TRUE); + while (GetIsObjectValid(oParty)) + { + ExploreAreaForPlayer(GetArea(oTarget), oTarget); + oParty = GetNextFactionMember(oTarget,TRUE); + } + break; + } + case 67: ExportAllCharacters();break; + case 68: dmwand_KickPC(oTarget, oUser);break; + case 69: sName = GetModuleName(); + StartNewModule(sName);break; + case 71: TilesetMagic(oUser, X2_TL_GROUNDTILE_WATER, 0);break; + case 72: TilesetMagic(oUser, X2_TL_GROUNDTILE_ICE, 0);break; + case 73: TilesetMagic(oUser, X2_TL_GROUNDTILE_LAVA, 0) ;break; + case 74: TilesetMagic(oUser, X2_TL_GROUNDTILE_SEWER_WATER, 0);break; + case 75: TilesetMagic(oUser, X2_TL_GROUNDTILE_WATER, 1);break; + case 76: TilesetMagic(oUser, X2_TL_GROUNDTILE_ICE, 1);break; + case 77: TilesetMagic(oUser, X2_TL_GROUNDTILE_LAVA, 1) ;break; + case 78: TilesetMagic(oUser, X2_TL_GROUNDTILE_SEWER_WATER, 1);break; + case 79: TLResetAreaGroundTiles(GetArea(oUser), iXAxis, iYAxis); break; + case 81: TilesetMagic(oUser, X2_TL_GROUNDTILE_ICE, 2);break; + case 82: TilesetMagic(oUser, X2_TL_GROUNDTILE_GRASS, 2);break; + case 83: TilesetMagic(oUser, X2_TL_GROUNDTILE_CAVEFLOOR, 2) ;break; + case 89: TLResetAreaGroundTiles(GetArea(oUser), iXAxis, iYAxis); break; + case 91: StoreCampaignObject("dmfi", "dmfi_copyplayer1", oTarget); + FloatingTextStringOnCreature("Target stored", oUser);break; + case 92: oParty = GetFirstFactionMember(oTarget, TRUE); + n=1; + while (GetIsObjectValid(oParty)) + { + StoreCampaignObject("dmfi", "dmfi_copyplayer"+IntToString(n), oParty); + SendMessageToPC(oUser, GetName(oParty) + " stored"); + n=n+1; + oParty = GetNextFactionMember(oTarget, TRUE); + } + FloatingTextStringOnCreature("Party stored", oUser); + break; + + case 93:n=1; + oCopy = RetrieveCampaignObject("dmfi", "dmfi_copyplayer"+IntToString(n), lLocation); + while (GetIsObjectValid(oCopy)) + { + ChangeToStandardFaction(oCopy, STANDARD_FACTION_COMMONER); + + n=n+1; + oCopy = RetrieveCampaignObject("dmfi", "dmfi_copyplayer"+IntToString(n), lLocation); + AssignCommand(oCopy, SetIsDestroyable(FALSE, TRUE, TRUE)); + } + break; + case 101: SetLocalInt(GetModule(), "dmfi_tileset" , 0); break; + case 102: SetLocalInt(GetModule(), "dmfi_tileset" , 1); break; //sewer/city + + default: break; + } + +} + +//////////////////////////////////////////////////////////////////////// +//This is for the DMFI Dicebag Wand +void DoDMDiceBagFunction(int iDice, object oUser) +{ + object oTarget = GetLocalObject(oUser, "dmfi_univ_target"); + if (!GetIsObjectValid(oTarget)) + oTarget = oUser; + int iOverride = GetLocalInt(oUser, "dmfi_dicebag"); + object oArea = GetArea(oUser); + object oRoll; + int iLeft; + if (iDice < 100) + iLeft = StringToInt(GetStringLeft(IntToString(iDice), 1)); + else + iLeft = 10; + switch (iLeft) + { + case 1: + case 2: + case 3: + case 4: //Single Creature Roll + DoDiceBagFunction(iDice+50, oTarget, iOverride); break; + case 5: + case 6: + case 7: + case 8://All PCs/NPCs in the area + oRoll = GetFirstObjectInArea(oArea); + while (GetIsObjectValid(oRoll)) + { + if ((GetIsPC(oTarget) && GetIsPC(oRoll)) || (!GetIsPC(oTarget) && !GetIsPC(oRoll) && GetObjectType(oRoll) == OBJECT_TYPE_CREATURE)) + DoDiceBagFunction(iDice+10, oRoll, iOverride); + oRoll = GetNextObjectInArea(oArea); + } + break; + case 10: { + switch (iDice) + { + case 101: SetLocalInt(oUser, "dmfi_dicebag", 2); SetDMFIPersistentInt("dmfi", "dmfi_dicebag", 2, oUser); SetCustomToken(20681, "Local"); FloatingTextStringOnCreature("Broadcast Mode set to Local", oUser, FALSE); return; break; + case 102: SetLocalInt(oUser, "dmfi_dicebag", 1); SetDMFIPersistentInt("dmfi", "dmfi_dicebag", 1, oUser); SetCustomToken(20681, "Global"); FloatingTextStringOnCreature("Broadcast Mode set to Global", oUser, FALSE); return; break; + case 103: SetLocalInt(oUser, "dmfi_dicebag", 0); SetDMFIPersistentInt("dmfi", "dmfi_dicebag", 0, oUser); SetCustomToken(20681, "Private"); FloatingTextStringOnCreature("Broadcast Mode set to Private", oUser, FALSE); return; break; + case 104: SetLocalInt(oUser, "dmfi_dicebag", 3); SetDMFIPersistentInt("dmfi", "dmfi_dicebag", 3, oUser); SetCustomToken(20681, "DM Only"); FloatingTextStringOnCreature("Broadcast Mode set to DM Only", oUser, FALSE); return; break; + case 105: DMFI_NextTarget(oTarget, oUser);break; + case 106: { + if (GetLocalInt(oUser, "dmfi_dice_no_animate")==1) + { + SetLocalInt(oUser, "dmfi_dice_no_animate", 0); + FloatingTextStringOnCreature("Rolls will show animation", oUser); + } + else + { + SetLocalInt(oUser, "dmfi_dice_no_animate", 1); + FloatingTextStringOnCreature("Rolls will NOT show animation", oUser); + } + } + } + } + default: break; + +/* +Demetrious - Saving code for all pcs in case I find a way to put it back into the dicebag. + + //All PCs + oRoll = GetFirstPC(); + while (GetIsObjectValid(oRoll)) + { + DoDiceBagFunction(iDice, oRoll, iOverride); + oRoll = GetNextPC(); + }break; +*/ + + + } +} + +//////////////////////////////////////////////////////////////////////// +void DoOneRingFunction(int iRing, object oUser) +{ + switch (iRing) + { + case 1: SetLocalString(oUser, "dmfi_univ_conv", "afflict"); break; + case 2: SetLocalString(oUser, "dmfi_univ_conv", "faction"); break; + case 3: SetLocalString(oUser, "dmfi_univ_conv", "dicebag"); break; + case 4: SetLocalString(oUser, "dmfi_univ_conv", "dmw"); break; + case 5: SetLocalString(oUser, "dmfi_univ_conv", "emote"); break; + case 6: SetLocalString(oUser, "dmfi_univ_conv", "encounter"); break; + case 7: SetLocalString(oUser, "dmfi_univ_conv", "fx"); break; + case 8: SetLocalString(oUser, "dmfi_univ_conv", "music"); break; + case 91: SetLocalString(oUser, "dmfi_univ_conv", "sound"); break; + case 92: SetLocalString(oUser, "dmfi_univ_conv", "voice"); break; + case 93: SetLocalString(oUser, "dmfi_univ_conv", "xp"); break; + case 94: SetLocalString(oUser, "dmfi_univ_conv", "buff");break; + default: SetLocalString(oUser, "dmfi_univ_conv", "dmw"); break; + } + AssignCommand(oUser, ClearAllActions()); + AssignCommand(oUser, ActionStartConversation(OBJECT_SELF, "dmfi_universal", TRUE)); +} + +//////////////////////////////////////////////////////////////////////// +//This function is for the DMFI Sound FX Wand +void DoSoundFunction(int iSound, object oUser) +{ + + location lLocation = GetLocalLocation(oUser, "dmfi_univ_location"); + float fDuration; + float fDelay; + object oTarget; + + if (GetIsDMPossessed(oUser)) + { + fDuration = GetLocalFloat(GetMaster(oUser), "dmfi_effectduration"); + fDelay = GetLocalFloat(GetMaster(oUser), "dmfi_sound_delay"); + } + else + { + fDuration = GetLocalFloat(oUser, "dmfi_effectduration"); + fDelay = GetLocalFloat(oUser, "dmfi_sound_delay"); + } + + switch (iSound) + { + case 11: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("as_an_batsflap1"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 12: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("as_an_bugsscary1"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 13: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("as_pl_crptvoice1"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 14: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("as_an_orcgrunt1"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 15: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("as_cv_minepick2"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 16: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("as_an_ratssqeak1"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 17: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("as_na_rockfallg1"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 18: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("as_na_rockfalgl2"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 19: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("as_wt_gustcavrn1"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 21: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("as_cv_belltower3"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 22: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("as_cv_claybreak3"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 23: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("as_cv_glasbreak2"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 24: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("as_cv_gongring3"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 25: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("as_pl_marketgrp4"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 26: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("al_cv_millwheel1"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 27: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("as_cv_sawing1"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 28: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("as_cv_bellwind1"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 29: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("al_cv_smithhamr2"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 31: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("al_na_firelarge1"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 32: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("al_na_lavapillr1"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 33: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("al_na_lavafire1"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 34: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("al_na_firelarge2"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 35: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("as_na_surf2"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 36: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("al_na_drips1"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 37: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("as_na_waterlap1"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 38: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("al_na_stream4"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 39: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("al_na_waterfall2"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 41: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("as_an_crynight3"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 42: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("as_na_bushmove1"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 43: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("as_an_birdsflap2"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 44: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("as_na_grassmove3"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 45: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("as_an_hawk1"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 46: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("as_na_leafmove3"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 47: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("as_an_gulls2"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 48: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("as_an_songbirds1"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 49: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("al_an_toads1"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 51: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("al_mg_beaker1"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 52: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("al_mg_cauldron1"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 53: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("al_mg_chntmagic1"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 54: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("al_mg_crystalev1"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 55: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("al_mg_crystalic1"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 56: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("al_mg_portal1"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 57: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("as_mg_telepin1"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 58: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("as_mg_telepout1"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 59: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("as_mg_frstmagic1"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 61: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("as_pl_tavclap1"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 62: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("as_pl_battlegrp7"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 63: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("as_pl_laughincf2"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 64: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("as_pl_comtntgrp3"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 65: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("as_pl_chantingm2"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 66: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("as_pl_cryingf2"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 67: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("as_pl_laughingf3"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 68: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("as_pl_chantingf2"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 69: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("as_pl_wailingm6"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 71: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("as_pl_evilchantm"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 72: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("as_an_crows2"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 73: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("as_pl_wailingcf1"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 74: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("as_pl_crptvoice2"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 75: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("as_pl_lafspook2"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 76: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("as_an_owlhoot1"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 77: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("as_an_wolfhowl1"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 78: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("as_pl_screamf3"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 79: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("as_pl_zombiem3"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 81: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("as_wt_gustsoft1"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 82: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("as_wt_thundercl3"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 83: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("as_wt_thunderds4"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + case 84: oTarget = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); DelayCommand(fDelay, AssignCommand(oTarget, PlaySound("as_wt_gusforst1"))); DelayCommand(20.0f, DestroyObject(oTarget)); break; + + //Settings + case 91: + SetLocalString(oUser, "EffectSetting", "dmfi_effectduration"); + CreateSetting(oUser); + break; + case 92: + SetLocalString(oUser, "EffectSetting", "dmfi_sound_delay"); + CreateSetting(oUser); + break; + case 93: + SetLocalString(oUser, "EffectSetting", "dmfi_beamduration"); + CreateSetting(oUser); + break; + case 94: //Change Day Music + iDayMusic = MusicBackgroundGetDayTrack(GetArea(oUser)) + 1; + if (iDayMusic > 33) iDayMusic = 49; + if (iDayMusic > 55) iDayMusic = 1; + MusicBackgroundStop(GetArea(oUser)); + MusicBackgroundChangeDay(GetArea(oUser), iDayMusic); + MusicBackgroundPlay(GetArea(oUser)); + break; + case 95: //Change Night Music + iNightMusic = MusicBackgroundGetDayTrack(GetArea(oUser)) + 1; + if (iNightMusic > 33) iNightMusic = 49; + if (iNightMusic > 55) iNightMusic = 1; + MusicBackgroundStop(GetArea(oUser)); + MusicBackgroundChangeNight(GetArea(oUser), iNightMusic); + MusicBackgroundPlay(GetArea(oUser)); + break; + case 96: //Play Background Music + MusicBackgroundPlay(GetArea(oUser)); + break; + case 97: //Stop Background Music + MusicBackgroundStop(GetArea(oUser)); + break; + case 98: //Change and Play Battle Music + iBattleMusic = MusicBackgroundGetBattleTrack(GetArea(oUser)) + 1; + if (iBattleMusic < 34 || iBattleMusic > 48) iBattleMusic = 34; + MusicBattleStop(GetArea(oUser)); + MusicBattleChange(GetArea(oUser), iBattleMusic); + MusicBattlePlay(GetArea(oUser)); + break; + case 99: //Stop Battle Music + MusicBattleStop(GetArea(oUser)); + break; + + default: break; + } + return; +} + +//////////////////////////////////////////////////////////////////////// +//This function is for the DMFI DM Voice +void DoVoiceFunction(int iSay, object oUser) +{ + object oMod = GetModule(); + object oTarget = GetLocalObject(oUser, "dmfi_univ_target"); + location lLocation = GetLocalLocation(oUser, "dmfi_univ_location"); + object oVoice; + string sSay; + + // Invalid target code - Loiter mode + if (!GetIsObjectValid(oTarget)) + { + switch (iSay) + { + case 8: + // // XXXX DM Spy Functionality - Currently BROKEN + // SetDMFIPersistentInt("dmfi", "dmfi_DMSpy", abs(GetDMFIPersistentInt("dmfi", "dmfi_DMSpy", oUser) - 1), oUser); + // if (GetDMFIPersistentInt("dmfi", "dmfi_DMSpy", oUser) == 1) + // FloatingTextStringOnCreature("DM Spy is on.", oUser, FALSE); + // else + // FloatingTextStringOnCreature("DM Spy is off.", oUser, FALSE); + // break; + + // v1.09 - eavesdrop at location + { + int hooknum = GetLocalInt(oUser, "dmfi_MyListenerHook"); + if (hooknum != 0) RemoveListenerHook(hooknum); + int hookparty = GetLocalInt(oUser, "dmfi_MyListenerPartyMode"); + int hookbcast = GetLocalInt(oUser, "dmfi_MyListenerBcastMode"); + hooknum = AppendListenerHook(2, OBJECT_INVALID, lLocation, + DMFI_CHANNELMASK_TALK|DMFI_CHANNELMASK_WHISPER, + hookparty, hookbcast, oUser); + if (hooknum != 0) + { + // move ditto voice to this location (destroying any existing one) + if (GetIsObjectValid(GetLocalObject(oUser, "dmfi_MyVoice"))) + { + DestroyObject(GetLocalObject(oUser, "dmfi_MyVoice")); + DeleteLocalObject(oUser, "dmfi_MyVoice"); + FloatingTextStringOnCreature("You have destroyed your previous Voice", oUser, FALSE); + } + oVoice = CreateObject(OBJECT_TYPE_CREATURE, "dmfi_voice", lLocation); + //Sets the Voice as the object to throw to. + SetLocalObject(oUser, "dmfi_VoiceTarget", oVoice); + //Set Ownership of the Voice to the User + SetLocalObject(oUser, "dmfi_MyVoice", oVoice); + DelayCommand(1.0f, FloatingTextStringOnCreature("The Voice is operational", oUser, FALSE)); + } + else + { + SendMessageToPC(oUser, "ERROR: could not append listener hook!"); + } + SetLocalInt(oUser, "dmfi_MyListenerHook", hooknum); + } + break; + + // case 9: //Destroy any existing Voice attached to the user + // if (GetIsObjectValid(GetLocalObject(oUser, "dmfi_MyVoice"))) + // { + // DestroyObject(GetLocalObject(oUser, "dmfi_MyVoice")); + // DeleteLocalObject(oUser, "dmfi_MyVoice"); + // FloatingTextStringOnCreature("You have destroyed your previous Voice", oUser, FALSE); + // } + // //Create the Voice + // oVoice = CreateObject(OBJECT_TYPE_CREATURE, "dmfi_voice", lLocation); + // //Sets the Voice as the object to throw to. + // SetLocalObject(oUser, "dmfi_VoiceTarget", oVoice); + // //Set Ownership of the Voice to the User + // SetLocalObject(oUser, "dmfi_MyVoice", oVoice); + // DelayCommand(1.0f, FloatingTextStringOnCreature("The Voice is operational", oUser, FALSE)); + // break; + + case 9: + // v1.09 - Toggle location range eavesdropping + { + int partylisten = GetLocalInt(oUser, "dmfi_MyListenerPartyMode"); + partylisten++; + if (partylisten > 2) partylisten = 0; + SetLocalInt(oUser, "dmfi_MyListenerPartyMode", partylisten); + string sRange; + if (partylisten == 0) sRange = "EARSHOT"; + else if (partylisten == 1) sRange = "AREA"; + else sRange = "MODULE"; + DelayCommand(1.0f, FloatingTextStringOnCreature("Location eavesdrop mode for new eavesdroppers set to " + sRange, oUser, FALSE)); + } + break; + + // Create a Loiter Voice + default: + oVoice = CreateObject(OBJECT_TYPE_CREATURE, "dmfi_voice", lLocation); + SetLocalInt(oVoice, "dmfi_Loiter", 1); + SetLocalString(oVoice, "dmfi_LoiterSay", GetDMFIPersistentString("dmfi", "hls206" + IntToString(iSay))); + break; + } + } + + // You targetted yourself = Record Mode + else if (oTarget == oUser) + { + switch (iSay) + { + // Toggle the mute / unmute NPC function + case 8: SetDMFIPersistentInt("dmfi", "dmfi_AllMute", abs(GetDMFIPersistentInt("dmfi", "dmfi_AllMute") - 1)); + if (GetDMFIPersistentInt("dmfi", "dmfi_AllMute") == 1) + FloatingTextStringOnCreature("All NPC conversations are muted", oUser, FALSE); + else + FloatingTextStringOnCreature("All NPC conversations are unmuted", oUser, FALSE); + break; + + // // XXXX Create a Ditto Voice - Duplicate functionality + // case 9: //Destroy any existing Voice attached to the user + // if (GetIsObjectValid(GetLocalObject(oUser, "dmfi_MyVoice"))) + // { + // DestroyObject(GetLocalObject(oUser, "dmfi_MyVoice")); + // DeleteLocalObject(oUser, "dmfi_MyVoice"); + // FloatingTextStringOnCreature("You have destroyed your previous Voice", oUser, FALSE); + // } + // //Create the Voice + // oVoice = CreateObject(OBJECT_TYPE_CREATURE, "dmfi_voice", lLocation); + // + // SetLocalObject(oUser, "dmfi_VoiceTarget", oVoice); + // //Set Ownership of the Voice to the User + // SetLocalObject(oUser, "dmfi_MyVoice", oVoice); + // DelayCommand(1.0f, FloatingTextStringOnCreature("The Voice is operational", oUser, FALSE)); + // break; + + case 9: + { + // v1.09 - toggle eavesdrop bcast - user/alldms + int hookbcast = GetLocalInt(oUser, "dmfi_MyListenerBcastMode"); + hookbcast = !hookbcast; + SetLocalInt(oUser, "dmfi_MyListenerBcastMode", hookbcast); + DelayCommand(1.0f, FloatingTextStringOnCreature("DM-Broadcast mode for new eavesdroppers set to " + (hookbcast ? "ON" : "OFF"), oUser, FALSE)); + } + + case 10: + // v1.09 - cancel eavesdrop mode + { + int hooknum = GetLocalInt(oUser, "dmfi_MyListenerHook"); + if (hooknum != 0) + { + RemoveListenerHook(hooknum); + DeleteLocalInt(oUser, "dmfi_MyListenerHook"); + } + + // destroy any existing ditto voice + if (GetIsObjectValid(GetLocalObject(oUser, "dmfi_MyVoice"))) + { + DestroyObject(GetLocalObject(oUser, "dmfi_MyVoice")); + DeleteLocalObject(oUser, "dmfi_MyVoice"); + FloatingTextStringOnCreature("You have destroyed your previous Voice", oUser, FALSE); + } + } + break; + + default: + // record a new phrase + FloatingTextStringOnCreature("Ready to record new phrase", oUser, FALSE); + SetLocalInt(oUser, "hls_EditPhrase", 20600 + iSay); + // set up to capture next spoken line of text + DMFI_get_line(oUser, TALKVOLUME_TALK, "dmfi_univ_listen", OBJECT_SELF); + break; + } + } + + // You targeted an NPC or Object - Say Something! + else + { + switch (iSay) + { + // Toggle a SINGLE NPC mute / unmute function + case 8: SetLocalInt(oTarget, "dmfi_Mute", abs(GetLocalInt(oTarget, "dmfi_Mute") - 1)); + break; + + case 9: + // XXXXX Set a Single NPC to listen and make it your target - VOICE WIDGET FUNCTION + // SetLocalObject(oUser, "dmfi_VoiceTarget", oTarget); + // if (!GetIsPC(oTarget)) + // { + // FloatingTextStringOnCreature(GetName(oTarget) + " is listening", oUser, FALSE); + // SetListenPattern(oTarget, "**", LISTEN_PATTERN); //listen to all text + // SetLocalInt(oTarget, "hls_Listening", 1); //listen to all text + // SetListening(oTarget, TRUE); //be sure NPC is listening + // } + // //You Targetted a PC - make a voice follow that sucker and listen. + // else + // { + // //delete any valid following voices to stop duplicates + // if (GetIsObjectValid(GetLocalObject(oTarget, "dmfi_VoiceFollow"))) + // { + // DestroyObject(GetLocalObject(oUser, "dmfi_VoiceFollow")); + // FloatingTextStringOnCreature("The prior voice following this character was destroyed", oUser, FALSE); + // } + // + // //Create the Voice + // oVoice = CreateObject(OBJECT_TYPE_CREATURE, "dmfi_voice", lLocation); + // //Sets the Voice as the object to throw to. + // DelayCommand(2.0, SetLocalObject(oTarget, "dmfi_VoiceFollow", oVoice)); //only set this for finding a duplicate later + // DelayCommand(2.0, SetLocalObject(oVoice, "dmfi_follow", oTarget)); //set up the player as something to follow + // DelayCommand(1.0f, FloatingTextStringOnCreature("The Voice will follow and listen to " +GetName(oTarget), oUser, FALSE)); + // } + // break; + + // v1.09 - eavesdrop on pc + { + int hooknum = GetLocalInt(oUser, "dmfi_MyListenerHook"); + if (hooknum != 0) RemoveListenerHook(hooknum); + int hookparty = GetLocalInt(oUser, "dmfi_MyListenerPartyMode"); + int hookbcast = GetLocalInt(oUser, "dmfi_MyListenerBcastMode"); + hooknum = AppendListenerHook(1, oTarget, lLocation, + DMFI_CHANNELMASK_TALK|DMFI_CHANNELMASK_WHISPER, + hookparty, hookbcast, oUser); + if (hooknum != 0) + { + SetLocalObject(oUser, "dmfi_VoiceTarget", oTarget); + if (GetIsPC(oTarget)) + { + // targetted PC - + // delete any valid following voices to stop duplicates + object oVoice = GetLocalObject(oTarget, "dmfi_VoiceFollow"); + if (GetIsObjectValid(oVoice)) + { + DestroyObject(oVoice); + DeleteLocalObject(oTarget, "dmfi_VoiceFollow"); + FloatingTextStringOnCreature("The prior voice following this character was destroyed", oUser, FALSE); + } + + // 08.05.13 tsunami282 - we don't use following voices anymore + // // Create the Voice + // oVoice = CreateObject(OBJECT_TYPE_CREATURE, "dmfi_voice", lLocation); + // // Sets the Voice as the object to throw to. + // DelayCommand(2.0, SetLocalObject(oTarget, "dmfi_VoiceFollow", oVoice)); //only set this for finding a duplicate later + // DelayCommand(2.0, SetLocalObject(oVoice, "dmfi_follow", oTarget)); //set up the player as something to follow + // DelayCommand(1.0f, FloatingTextStringOnCreature("The Voice will follow " +GetName(oTarget), oUser, FALSE)); + } + else + { + // targetted NPC - nothing else needed to do + } + } + else + { + SendMessageToPC(oUser, "ERROR: could not append listener hook!"); + } + SetLocalInt(oUser, "dmfi_MyListenerHook", hooknum); + } + break; + + case 10: + // v1.09 - Toggle PC single/party eavesdropping + { + // v1.09 - toggle eavesdrop mode - single/party + int partylisten = GetLocalInt(oUser, "dmfi_MyListenerPartyMode"); + partylisten++; + if (partylisten > 1) partylisten = 0; + SetLocalInt(oUser, "dmfi_MyListenerPartyMode", partylisten); + DelayCommand(1.0f, FloatingTextStringOnCreature("PC eavesdrop mode for new eavesdroppers set to " + (partylisten ? "PARTY" : "PC ONLY"), oUser, FALSE)); + } + break; + default: + sSay = GetDMFIPersistentString("dmfi", "hls206" + IntToString(iSay)); + AssignCommand(oTarget, SpeakString(sSay)); + break; + } + } +} + +//////////////////////////////////////////////////////////////////////// +//This function is for the DMFI Affliction Wand +void ReportImmunity(object oT, object oUser) +{ + SendMessageToPC(oUser, "Immunities Reported: (blank if none)"); + if (GetIsImmune(oT, IMMUNITY_TYPE_ABILITY_DECREASE)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Ability Decrease"); + if (GetIsImmune(oT, IMMUNITY_TYPE_AC_DECREASE)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE AC Decrease"); + if (GetIsImmune(oT, IMMUNITY_TYPE_ATTACK_DECREASE)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Attack Decrease"); + if (GetIsImmune(oT, IMMUNITY_TYPE_BLINDNESS)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Blindness"); + if (GetIsImmune(oT, IMMUNITY_TYPE_CHARM)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Charm"); + if (GetIsImmune(oT, IMMUNITY_TYPE_CONFUSED)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Confusion"); + if (GetIsImmune(oT, IMMUNITY_TYPE_CRITICAL_HIT)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Critical Hit"); + if (GetIsImmune(oT, IMMUNITY_TYPE_CURSED)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Cursed"); + if (GetIsImmune(oT, IMMUNITY_TYPE_DAMAGE_DECREASE)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Damage Decrease"); + if (GetIsImmune(oT, IMMUNITY_TYPE_DAMAGE_IMMUNITY_DECREASE)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Damage Immunity Decrease"); + if (GetIsImmune(oT, IMMUNITY_TYPE_DAZED)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Dazed"); + if (GetIsImmune(oT, IMMUNITY_TYPE_DEAFNESS)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Deafness"); + if (GetIsImmune(oT, IMMUNITY_TYPE_DEATH)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Death"); + if (GetIsImmune(oT, IMMUNITY_TYPE_DISEASE)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Disease"); + if (GetIsImmune(oT, IMMUNITY_TYPE_DOMINATE)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Dominate"); + if (GetIsImmune(oT, IMMUNITY_TYPE_ENTANGLE)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Entangle"); + if (GetIsImmune(oT, IMMUNITY_TYPE_FEAR)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Fear"); + if (GetIsImmune(oT, IMMUNITY_TYPE_KNOCKDOWN)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Knockdown"); + if (GetIsImmune(oT, IMMUNITY_TYPE_MIND_SPELLS)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Mind Spells"); + if (GetIsImmune(oT, IMMUNITY_TYPE_MOVEMENT_SPEED_DECREASE)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Movement Speed Decrease"); + if (GetIsImmune(oT, IMMUNITY_TYPE_NEGATIVE_LEVEL)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Negative Level"); + if (GetIsImmune(oT, IMMUNITY_TYPE_PARALYSIS)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Paralysis"); + if (GetIsImmune(oT, IMMUNITY_TYPE_POISON)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Poison"); + if (GetIsImmune(oT, IMMUNITY_TYPE_SAVING_THROW_DECREASE)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Saving Throw Decrease"); + if (GetIsImmune(oT, IMMUNITY_TYPE_SILENCE)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Silence"); + if (GetIsImmune(oT, IMMUNITY_TYPE_SKILL_DECREASE)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Skill Decrease"); + if (GetIsImmune(oT, IMMUNITY_TYPE_SLEEP)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Sleep"); + if (GetIsImmune(oT, IMMUNITY_TYPE_SLOW)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Slow"); + if (GetIsImmune(oT, IMMUNITY_TYPE_SNEAK_ATTACK)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Sneak Attack"); + if (GetIsImmune(oT, IMMUNITY_TYPE_SPELL_RESISTANCE_DECREASE)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Spell Resistance Decrease"); + if (GetIsImmune(oT, IMMUNITY_TYPE_STUN)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Stun"); + if (GetIsImmune(oT, IMMUNITY_TYPE_TRAP)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Trap"); +} + +//////////////////////////////////////////////////////////////////////// +void CheckForEffect(effect eA, object oT, object oUser) +{ + int Result = FALSE; + effect Check = GetFirstEffect(oT); + + while (GetIsEffectValid(Check)) + { + if (Check == eA) + Result = TRUE; + + Check = GetNextEffect(oT); + } + if (Result) + FloatingTextStringOnCreature("Affliction Wand Saving Throw Failure: " + GetName(oT), oUser); + else + FloatingTextStringOnCreature("Affliction Wand Saving Throw Success: No Effect: " + GetName(oT), oUser); +} + +//////////////////////////////////////////////////////////////////////// +void DoAfflictFunction(int iAfflict, object oUser) +{ + effect eEffect; + object oTarget = GetLocalObject(oUser, "dmfi_univ_target"); + float fDuration; + int nDNum; + effect eD; + effect eA; + effect eT; + effect eVis; + int nBug = 0; + int nSaveAmount; float fSaveAmount; + + if (GetIsDMPossessed(oUser)) + { + nDNum = GetLocalInt(GetMaster(oUser), "dmfi_damagemodifier"); + fDuration = GetLocalFloat(GetMaster(oUser), "dmfi_stunduration"); + fSaveAmount = GetLocalFloat(GetMaster(oUser), "dmfi_saveamount"); + } + else + { + nDNum = GetLocalInt(oUser, "dmfi_damagemodifier"); + fDuration = GetLocalFloat(oUser, "dmfi_stunduration"); + fSaveAmount = GetLocalFloat(oUser, "dmfi_saveamount"); + } + + nSaveAmount = FloatToInt(fSaveAmount); + + if (!(GetObjectType(oTarget) == OBJECT_TYPE_CREATURE) || + GetIsDM(oTarget)) + { + FloatingTextStringOnCreature("You must target a valid creature!", oUser, FALSE); + return; + } + switch (iAfflict) + { + case 11: eD= EffectDamage(d4(nDNum), DAMAGE_TYPE_MAGICAL, DAMAGE_POWER_PLUS_TWENTY); + eVis = EffectVisualEffect(VFX_COM_BLOOD_SPARK_SMALL); break; + case 12: eD = EffectDamage(d6(nDNum), DAMAGE_TYPE_MAGICAL, DAMAGE_POWER_PLUS_TWENTY); + eVis = EffectVisualEffect(VFX_COM_BLOOD_LRG_RED); break; + case 13: eD = EffectDamage(d8(nDNum), DAMAGE_TYPE_MAGICAL, DAMAGE_POWER_PLUS_TWENTY); + eVis = EffectVisualEffect(VFX_COM_BLOOD_LRG_RED); break; + case 14: eD = EffectDamage(d10(nDNum), DAMAGE_TYPE_MAGICAL, DAMAGE_POWER_PLUS_TWENTY); + eVis = EffectVisualEffect(VFX_COM_BLOOD_SPARK_SMALL); break; + case 15: eD = EffectDamage(d12(nDNum), DAMAGE_TYPE_MAGICAL, DAMAGE_POWER_PLUS_TWENTY); + eVis = EffectVisualEffect(VFX_COM_BLOOD_SPARK_SMALL); break; + case 16: eD = EffectDamage(GetCurrentHitPoints(oTarget)/4, DAMAGE_TYPE_MAGICAL, DAMAGE_POWER_PLUS_TWENTY); + eVis = EffectVisualEffect(VFX_COM_BLOOD_LRG_RED); break; + case 17: eD = EffectDamage(GetCurrentHitPoints(oTarget)/2, DAMAGE_TYPE_MAGICAL, DAMAGE_POWER_PLUS_TWENTY); + eVis = EffectVisualEffect(VFX_COM_BLOOD_LRG_RED); break; + case 18: eD = EffectDamage(GetCurrentHitPoints(oTarget) * 3 / 4, DAMAGE_TYPE_MAGICAL, DAMAGE_POWER_PLUS_TWENTY); + eVis =EffectVisualEffect(VFX_COM_CHUNK_RED_SMALL); break; + case 19: eD = EffectDamage(GetCurrentHitPoints(oTarget)-1, DAMAGE_TYPE_MAGICAL, DAMAGE_POWER_PLUS_TWENTY); + eVis =EffectVisualEffect(VFX_COM_CHUNK_RED_SMALL); break; + case 21: eA =EffectDisease(DISEASE_FILTH_FEVER); break; + case 22: eA =EffectDisease(DISEASE_MINDFIRE); break; + case 23: eA =EffectDisease(DISEASE_DREAD_BLISTERS); break; + case 24: eA =EffectDisease(DISEASE_SHAKES); break; + case 25: eA =EffectDisease(DISEASE_VERMIN_MADNESS); break; + case 26: eA =EffectDisease(DISEASE_DEVIL_CHILLS); break; + case 27: eA =EffectDisease(DISEASE_SLIMY_DOOM); break; + case 28: eA =EffectDisease(DISEASE_RED_ACHE); break; + case 29: eA =EffectDisease(DISEASE_ZOMBIE_CREEP); break; + case 31: eA =EffectDisease(DISEASE_BLINDING_SICKNESS); break; + case 32: eA =EffectDisease(DISEASE_CACKLE_FEVER); break; + case 33: eA =EffectDisease(DISEASE_BURROW_MAGGOTS); break; + case 34: eA =EffectDisease(DISEASE_RED_SLAAD_EGGS); break; + case 35: eA =EffectDisease(DISEASE_DEMON_FEVER); break; + case 36: eA =EffectDisease(DISEASE_GHOUL_ROT); break; + case 37: eA =EffectDisease(DISEASE_MUMMY_ROT); break; + case 38: eA =EffectDisease(DISEASE_SOLDIER_SHAKES); break; + case 39: eA =EffectDisease(DISEASE_SOLDIER_SHAKES); break; + case 41: eA =EffectPoison(POISON_TINY_SPIDER_VENOM); break; + case 42: eA =EffectPoison(POISON_ARANEA_VENOM); break; + case 43: eA =EffectPoison(POISON_MEDIUM_SPIDER_VENOM); break; + case 44: eA = EffectPoison(POISON_CARRION_CRAWLER_BRAIN_JUICE); break; + case 45: eA = EffectPoison(POISON_OIL_OF_TAGGIT); break; + case 46: eA = EffectPoison(POISON_ARSENIC); break; + case 47: eA = EffectPoison(POISON_GREENBLOOD_OIL); break; + case 48: eA = EffectPoison(POISON_NITHARIT); break; + case 49: eA = EffectPoison(POISON_PHASE_SPIDER_VENOM); break; + case 51: eA = EffectPoison(POISON_LICH_DUST); break; + case 52: eA = EffectPoison(POISON_SHADOW_ESSENCE); break; + case 53: eA = EffectPoison(POISON_LARGE_SPIDER_VENOM); break; + case 54: eA = EffectPoison(POISON_PURPLE_WORM_POISON); break; + case 55: eA = EffectPoison(POISON_IRON_GOLEM); break; + case 56: eA = EffectPoison(POISON_PIT_FIEND_ICHOR); break; + case 57: eA = EffectPoison(POISON_WYVERN_POISON); break; + case 58: eA = EffectPoison(POISON_BLACK_LOTUS_EXTRACT); break; + case 59: eA = EffectPoison(POISON_GARGANTUAN_SPIDER_VENOM); break; + case 60: eT = EffectPetrify(); break; + case 61: eT = EffectBlindness(); break; + case 62: eT = EffectCurse(4,4,4,4,4,4); break; + case 63: eT = EffectFrightened(); break; + case 64: eT = EffectStunned(); break; + case 65: eT = EffectSilence(); break; + case 66: eT = EffectSleep(); break; + case 67: eT = EffectSlow(); break; + case 68: eT = EffectKnockdown(); nBug = 1; break; + case 69: eD = EffectDamage( GetCurrentHitPoints(oTarget)-1, DAMAGE_TYPE_MAGICAL, DAMAGE_POWER_NORMAL); + AssignCommand( oTarget, ClearAllActions()); + AssignCommand( oTarget, ActionPlayAnimation( ANIMATION_LOOPING_DEAD_FRONT, 1.0, 99999.0)); + DelayCommand(0.5, SetCommandable( FALSE, oTarget)); break; + case 71: eA = EffectCutsceneDominated();break; + case 72: eA = EffectCutsceneGhost(); break; + case 73: eA = EffectCutsceneImmobilize(); break; + case 74: eA = EffectCutsceneParalyze(); break; + case 75: nBug = -1; break; //special case for combo death effect + case 81: eEffect = GetFirstEffect(oTarget); + while (GetIsEffectValid(eEffect)) + { + if (GetEffectType(eEffect) == EFFECT_TYPE_POISON) RemoveEffect(oTarget, eEffect); + eEffect = GetNextEffect(oTarget); + } break; + case 82: eEffect = GetFirstEffect(oTarget); + while (GetIsEffectValid(eEffect)) + { + if (GetEffectType(eEffect) == EFFECT_TYPE_DISEASE) RemoveEffect(oTarget, eEffect); + eEffect = GetNextEffect(oTarget); + } break; + case 83: eEffect = GetFirstEffect(oTarget); + while (GetIsEffectValid(eEffect)) + { + if (GetEffectType(eEffect) == EFFECT_TYPE_BLINDNESS) RemoveEffect(oTarget, eEffect); + eEffect = GetNextEffect(oTarget); + } break; + case 84: eEffect = GetFirstEffect(oTarget); + while (GetIsEffectValid(eEffect)) + { + if (GetEffectType(eEffect) == EFFECT_TYPE_CURSE) RemoveEffect(oTarget, eEffect); + eEffect = GetNextEffect(oTarget); + } break; + case 85: eEffect = GetFirstEffect(oTarget); + while (GetIsEffectValid(eEffect)) + { + if (GetEffectType(eEffect) == EFFECT_TYPE_FRIGHTENED) RemoveEffect(oTarget, eEffect); + eEffect = GetNextEffect(oTarget); + } break; + case 86: eEffect = GetFirstEffect(oTarget); + while (GetIsEffectValid(eEffect)) + { + if (GetEffectType(eEffect) == EFFECT_TYPE_STUNNED) RemoveEffect(oTarget, eEffect); + eEffect = GetNextEffect(oTarget); + } break; + case 87: eEffect = GetFirstEffect(oTarget); + while (GetIsEffectValid(eEffect)) + { + if (GetEffectType(eEffect) == EFFECT_TYPE_SILENCE) RemoveEffect(oTarget, eEffect); + eEffect = GetNextEffect(oTarget); + } break; + case 88: eEffect = GetFirstEffect(oTarget); + while (GetIsEffectValid(eEffect)) + { + RemoveEffect(oTarget, eEffect); + eEffect = GetNextEffect(oTarget); + } break; + case 89: SetCommandable(TRUE, oTarget); + AssignCommand(oTarget, ClearAllActions()); break; + case 80: eEffect = GetFirstEffect(oTarget); + while (GetIsEffectValid(eEffect)) + { + if (GetEffectType(eEffect) == EFFECT_TYPE_PETRIFY) RemoveEffect(oTarget, eEffect); + eEffect = GetNextEffect(oTarget); + } break;//Added July 5, 2003 + +// 99 is a duplicate instance - simple copy. - Demetrious + case 91: SetLocalString(oUser, "EffectSetting", "dmfi_stunduration"); + CreateSetting(oUser); + case 92: SetDMFIPersistentInt("dmfi", "DamageModifier", nDNum+1); SetCustomToken(20780, IntToString(nDNum+1));; break; + case 93: + if (nDNum==1) + { + FloatingTextStringOnCreature("Illegal operation: Minimum modifier is 1.", oUser); + break; + } + else + { + SetDMFIPersistentInt("dmfi", "DamageModifier", nDNum-1); SetCustomToken(20780, IntToString(nDNum-1)); ;break; + break; + } + case 94: ReportImmunity(oTarget, oUser); break; + case 95: DMFI_NextTarget(oTarget, oUser); break; + case 99: SetLocalString(oUser, "EffectSetting", "SaveEffectAmount"); + CreateSetting(oUser); break; + case 101: eT = EffectSavingThrowDecrease(SAVING_THROW_FORT, nSaveAmount); break; + case 102: eT = EffectSavingThrowDecrease(SAVING_THROW_REFLEX, nSaveAmount); break; + case 103: eT = EffectSavingThrowDecrease(SAVING_THROW_WILL, nSaveAmount); break; + case 104: eT = EffectSavingThrowIncrease(SAVING_THROW_FORT, nSaveAmount); break; + case 105: eT = EffectSavingThrowIncrease(SAVING_THROW_REFLEX, nSaveAmount); break; + case 106: eT = EffectSavingThrowIncrease(SAVING_THROW_WILL, nSaveAmount); break; + case 107: eT = EffectSavingThrowDecrease(SAVING_THROW_ALL, nSaveAmount); break; + case 108: eT = EffectSavingThrowIncrease(SAVING_THROW_ALL, nSaveAmount); break; + case 109: SetLocalString(oUser, "EffectSetting", "SaveEffectAmount"); + CreateSetting(oUser); + case 100: eEffect = GetFirstEffect(oTarget); + while (GetIsEffectValid(eEffect)) + { + if ((GetEffectType(eEffect) == EFFECT_TYPE_SAVING_THROW_INCREASE) + ||(GetEffectType(eEffect) == EFFECT_TYPE_SAVING_THROW_DECREASE)) + RemoveEffect(oTarget, eEffect); + eEffect = GetNextEffect(oTarget); + } break;//Added July 5, 2003 + + + + default: break; + } +//code down here to apply the effects an then go back and see if the +//player successfully saved or did not for the diseases and poisons. + + if ((GetEffectType(eD)!= EFFECT_TYPE_INVALIDEFFECT) || + (GetEffectType(eVis) != EFFECT_TYPE_INVALIDEFFECT)) + { + ApplyEffectToObject(DURATION_TYPE_PERMANENT, eD, oTarget); + ApplyEffectToObject(DURATION_TYPE_PERMANENT, eVis, oTarget); + return; + } + if (GetEffectType(eA)!= EFFECT_TYPE_INVALIDEFFECT) + { + ApplyEffectToObject(DURATION_TYPE_PERMANENT, eA, oTarget); + DelayCommand(5.0, CheckForEffect(eA, oTarget, oUser)); + return; + } + if ((GetEffectType(eT)!= EFFECT_TYPE_INVALIDEFFECT) || (nBug ==1)) + { + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eT, oTarget, fDuration); + + if ((GetEffectType(eT)==EFFECT_TYPE_SAVING_THROW_INCREASE) || + (GetEffectType(eT)==EFFECT_TYPE_SAVING_THROW_DECREASE)) + { + DelayCommand(1.0, FloatingTextStringOnCreature("Target Saves: Fortitude " + IntToString(GetFortitudeSavingThrow(oTarget)) + + " Reflex " + IntToString(GetReflexSavingThrow(oTarget)) + " Will " + IntToString(GetWillSavingThrow(oTarget)), oUser)); + } + return; + } + if (nBug == -1) + { + object oFollowMe = GetFirstFactionMember(oTarget, TRUE); + + if (!GetIsObjectValid(oFollowMe)) + oFollowMe = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC, oTarget, 1,CREATURE_TYPE_IS_ALIVE, TRUE); + + if (GetIsDM(oFollowMe) || GetIsDMPossessed(oFollowMe)) + oFollowMe = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC, oTarget, 2,CREATURE_TYPE_IS_ALIVE, TRUE); + + if (!GetIsObjectValid(oFollowMe)) + oFollowMe = oUser; + + AssignCommand(oFollowMe, ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectCutsceneDominated(), oTarget)); + ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectCutsceneGhost(), oTarget); + ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY), oTarget); + } + + return; +} + +//////////////////////////////////////////////////////////////////////// +//This function is for the DMFI XP Wand +void DoXPFunction(int iXP, object oUser) +{ + object oTarget = GetLocalObject(oUser, "dmfi_univ_target"); + object oPartyMember; + int iHD; + int iParty = 0; + int iPercent = 0; + int iReward = 0; + int iGold = 0; + int iValue = 0; + + string sFloating = "DM Granted Bonus"; + + switch (iXP) + { + case 8: DMFI_NextTarget(oTarget, oUser); return; break; + case 11: sFloating = "Roleplaying Bonus"; iPercent = 1; break; + case 12: sFloating = "Roleplaying Bonus"; iPercent = 2; break; + case 13: sFloating = "Roleplaying Bonus"; iPercent = 3; break; + case 14: sFloating = "Roleplaying Bonus"; iPercent = 4; break; + case 15: sFloating = "Roleplaying Bonus"; iPercent = 5; break; + case 21: sFloating = "Main Plot Bonus"; iPercent = 10; break; + case 22: sFloating = "Main Plot Bonus"; iPercent = 20; break; + case 23: sFloating = "Main Plot Bonus"; iPercent = 25; break; + case 24: sFloating = "Main Plot Bonus"; iPercent = 33; break; + case 25: sFloating = "Main Plot Bonus"; iPercent = 50; break; + case 31: sFloating = "Main Plot Bonus"; iPercent = 10; iParty = 1; break; + case 32: sFloating = "Main Plot Bonus"; iPercent = 20; iParty = 1; break; + case 33: sFloating = "Main Plot Bonus"; iPercent = 25; iParty = 1; break; + case 34: sFloating = "Main Plot Bonus"; iPercent = 33; iParty = 1; break; + case 35: sFloating = "Main Plot Bonus"; iPercent = 50; iParty = 1; break; + case 41: sFloating = "Best In Game Bonus"; iPercent = 2; break; + case 42: sFloating = "Best In Game Bonus"; iPercent = 5; break; + case 43: sFloating = "Best In Game Bonus"; iPercent = 10; break; + case 44: sFloating = "Best In Game Bonus"; iPercent = 20; break; + case 45: sFloating = "Best In Game Bonus"; iPercent = 25; break; + case 51: iParty = 1; iReward = 100; break; + case 52: iParty = 1; iReward = 250; break; + case 53: iParty = 1; iReward = 500; break; + case 54: iParty = 1; iReward = 1000; break; + case 55: iParty = 1; iReward = 2000; break; + case 61: iHD = GetHitDice(oTarget); + SendMessageToPC(oUser, GetName(oTarget) +" has received " + IntToString(GetLocalInt(oPartyMember, "dmfi_XPGiven")) + " DMFI WAND XP this session."); + SendMessageToPC(oUser, GetName(oTarget) +" currently has " + IntToString(GetXP(oTarget)) + " total XP."); + SendMessageToPC(oUser, GetName(oTarget) +" currently needs " + IntToString(((iHD * (iHD + 1)) / 2 * 1000) - GetXP(oTarget)) + " to level."); + SendMessageToPC(oUser, GetName(oTarget) +" has "+ IntToString(GetGold(oTarget)) + " gp."); + SendMessageToPC(oUser, GetName(oTarget) +" has items totaling " + IntToString(DMFI_GetNetWorth(oTarget)) + " in gp value."); + return; break; + case 62: oPartyMember=GetFirstFactionMember(oTarget, TRUE); + while (GetIsObjectValid(oPartyMember)==TRUE) + { + iGold = iGold + GetGold(oPartyMember); + iValue = iValue + DMFI_GetNetWorth(oPartyMember); + SendMessageToPC(oUser, GetName(oPartyMember) +" has " + IntToString(GetXP(oPartyMember)) + " XP total."); + oPartyMember = GetNextFactionMember(oTarget, TRUE); + } + SendMessageToPC(oUser, "The party has a total of "+ IntToString(iGold) + " gp."); + SendMessageToPC(oUser, "The party has items totaling " + IntToString(iValue) + " in gp value."); + return; break; + case 63: oPartyMember=GetFirstFactionMember(oTarget, TRUE); + while (GetIsObjectValid(oPartyMember)==TRUE) + { + SendMessageToPC(oUser, GetName(oPartyMember) +" has received " + IntToString(GetLocalInt(oPartyMember, "dmfi_XPGiven")) + " DMFI WAND XP this session."); + oPartyMember = GetNextFactionMember(oTarget, TRUE); + } + return; break; + case 64: oPartyMember=GetFirstFactionMember(oTarget, TRUE); + while (GetIsObjectValid(oPartyMember)==TRUE) + { + int iHD = GetHitDice(oPartyMember); + SendMessageToPC(oUser, GetName(oPartyMember) + " is level " + IntToString(GetHitDice(oPartyMember)) + " and needs " + IntToString(((iHD * (iHD + 1)) / 2 * 1000) - GetXP(oPartyMember)) + " XP to level up."); + oPartyMember = GetNextFactionMember(oTarget, TRUE); + } + return; break; + case 71: sFloating = "DM XP PENALTY"; iReward = -50; break; + case 72: sFloating = "DM XP PENALTY"; iReward = -100; break; + case 73: sFloating = "DM XP PENALTY"; iReward = -250; break; + case 74: sFloating = "DM XP PENALTY"; iReward = -500; break; + case 75: sFloating = "DM XP PENALTY"; iReward = -1000; break; + case 76: sFloating = "DM XP PENALTY"; iReward = -2000; break; + case 77: sFloating = "DM XP PENALTY"; iReward = -((GetHitDice(oTarget) * (GetHitDice(oTarget)-1))/2 * 1000); break; + case 78: sFloating = "DM XP PENALTY"; iReward = -((GetHitDice(oTarget) * (GetHitDice(oTarget)-1))/2 * 1000) - (((GetHitDice(oTarget)-1)*1000)/2); break; + case 79: sFloating = "DM XP PENALTY"; iReward = -((GetXP(oTarget))-(GetXP(oTarget))+1); break; + default: return; + } + + if (iParty==1) + { + // 2008.05.26 tsunami282 - grant percent XP based on each party member's level, not selected party member + int bUsePercent = FALSE; + if (iReward==0) bUsePercent = TRUE; + + oPartyMember=GetFirstFactionMember(oTarget, TRUE); + while (GetIsObjectValid(oPartyMember)) + { + if (bUsePercent) iReward = (GetHitDice(oPartyMember)*iPercent*10); + GiveXPToCreature(oPartyMember, iReward); + SetLocalInt(oPartyMember, "dmfi_XPGiven", GetLocalInt(oPartyMember, "dmfi_XPGiven") + iReward); + FloatingTextStringOnCreature(sFloating + ": " + IntToString(iReward), oPartyMember, FALSE); + SendMessageToAllDMs(GetName(oPartyMember) +" received a "+GetLocalString(oUser, "BonusType")+ " experience reward of "+ IntToString(iReward)+ "."); + oPartyMember = GetNextFactionMember(oTarget, TRUE); + } + // SendMessageToAllDMs("The entire party was granted "+ IntToString(iReward)+ " XP."); + } + + else //single player code + { + if (iReward==0) + iReward = (GetHitDice(oTarget)*iPercent*10); + + int nPrior = GetXP(oTarget); + + SetXP(oTarget, nPrior+iReward); + + SetLocalInt(oTarget, "dmfi_XPGiven", GetLocalInt(oTarget, "dmfi_XPGiven") + iReward); + FloatingTextStringOnCreature(sFloating + ": " + IntToString(iReward), oTarget, FALSE); + SendMessageToAllDMs(GetName(oTarget) +" received a "+GetLocalString(oUser, "BonusType")+ " experience reward of "+ IntToString(iReward)+ "."); + + } + return; +} + +//////////////////////////////////////////////////////////////////////// +//This function is for the DMFI Music Wand +void DoMusicFunction(int iMusic, object oUser) +{ + int iSet; + switch (iMusic) + { + case 11: MusicBackgroundPlay(GetArea(oUser)); return; break; + case 12: MusicBackgroundStop(GetArea(oUser)); DelayCommand(1.0, MusicBackgroundStop(GetArea(oUser))); return; break; + case 13: iSet = TRACK_BATTLE_WINTER; break; + case 14: iSet = TRACK_BATTLE_DESERT; break; + case 15: iSet = TRACK_DESERT_DAY; break; + case 16: iSet = TRACK_DESERT_NIGHT; break; + case 17: iSet = TRACK_WINTER_DAY;break; + case 18: iSet = TRACK_HOTU_UNDERMOUNTAIN; break; + case 19: iSet = TRACK_HOTU_WATERDEEP; break; + case 21: iSet = TRACK_HOTU_BATTLE_BOSS1; break; + case 22: iSet = TRACK_HOTU_BATTLE_BOSS2; break; + case 23: iSet = TRACK_HOTU_BATTLE_HELL; break; + case 24: iSet = TRACK_HOTU_THEME;break; + case 25: iSet = TRACK_HOTU_REBELCAMP;break; + case 26: iSet = TRACK_HOTU_QUEEN;break; + case 27: iSet = TRACK_HOTU_DRACOLICH;break; + case 28: iSet = TRACK_HOTU_FIREPLANE;break; + case 29: iSet = TRACK_HOTU_HELLFROZEOVER;break; + case 31: iSet = 34; break; + case 32: iSet = 35; break; + case 33: iSet = 36; break; + case 34: iSet = 37; break; + case 35: iSet = 38; break; + case 36: iSet = 39; break; + case 37: iSet = 40; break; + case 38: iSet = 41; break; + case 39: iSet = 42; break; + case 41: iSet = 43; break; + case 42: iSet = 44; break; + case 43: iSet = 45; break; + case 44: iSet = 46; break; + case 45: iSet = 47; break; + case 46: iSet = 48; break; + case 51: iSet = 15; break; + case 52: iSet = 16; break; + case 53: iSet = 17; break; + case 54: iSet = 18; break; + case 55: iSet = 19; break; + case 56: iSet = 20; break; + case 57: iSet = 21; break; + case 58: iSet = 29; break; + case 61: iSet = 22; break; + case 62: iSet = 23; break; + case 63: iSet = 24; break; + case 64: iSet = 56; break; + case 65: iSet = 25; break; + case 66: iSet = 26; break; + case 67: iSet = 27; break; + case 68: iSet = 49; break; + case 69: iSet = 50; break; + case 71: iSet = 28; break; + case 72: iSet = 7; break; + case 73: iSet = 8; break; + case 74: iSet = 9; break; + case 75: iSet = 10; break; + case 76: iSet = 11; break; + case 77: iSet = 12; break; + case 78: iSet = 13; break; + case 79: iSet = 14; break; + case 81: iSet = 1; break; + case 82: iSet = 2; break; + case 83: iSet = 3; break; + case 84: iSet = 4; break; + case 85: iSet = 5; break; + case 86: iSet = 6; break; + case 91: iSet = 30; break; + case 92: iSet = 31; break; + case 93: iSet = 32; break; + case 94: iSet = 33; break; + case 95: iSet = 51; break; + case 96: iSet = 52; break; + case 97: iSet = 53; break; + case 98: iSet = 54; break; + case 99: iSet = 55; break; + default: break; + } + + MusicBackgroundStop(GetArea(oUser)); + MusicBackgroundChangeDay(GetArea(oUser), iSet); + MusicBackgroundChangeNight(GetArea(oUser), iSet); + MusicBackgroundPlay(GetArea(oUser)); + return; +} + +//////////////////////////////////////////////////////////////////////// +//This function is for the DMFI Encounter Wand +void Spawn(string sCreature, location lCreature, int iTF = FALSE) +{ + CreateObject(OBJECT_TYPE_CREATURE, sCreature, lCreature, iTF); +} + +//////////////////////////////////////////////////////////////////////// +void CopyMon(object oMon, location lEncounter) +{ + object oCreature = CopyObject(oMon, lEncounter); + effect eEffect = GetFirstEffect(oMon); + while (GetIsEffectValid(eEffect)) + { + ApplyEffectToObject(DURATION_TYPE_PERMANENT, eEffect, oCreature); + eEffect = GetNextEffect(oMon); + } +} + +//////////////////////////////////////////////////////////////////////// +void CreateCustomEncounter(string Template, location lEncounter) +{ + object oWP = GetWaypointByTag(Template); + int n = 1; + object oMon = GetNearestCreatureToLocation(CREATURE_TYPE_IS_ALIVE, TRUE, GetLocation(oWP), n); + + while (GetIsObjectValid(oMon) && (GetDistanceBetween(oWP, oMon)<8.0) && (n<9)) + { + DelayCommand(IntToFloat(n), CopyMon(oMon, lEncounter)); + n=n+1; + oMon = GetNearestCreatureToLocation(CREATURE_TYPE_IS_ALIVE, TRUE, GetLocation(oWP), n); + } +} + +//////////////////////////////////////////////////////////////////////// +void CreateEncounter(int iEncounter, location lEncounter, object oUser) +{ + SetLocalInt(oUser, "EncounterType", iEncounter); + switch (iEncounter) + { + case 11: //Animal - Low Badger Encounter + SetLocalString(oUser, "EncounterName", "Low Badger"); + CreateObject(OBJECT_TYPE_CREATURE, "NW_BADGER", lEncounter, FALSE); + DelayCommand(1.0f, Spawn("NW_BADGER", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_BADGER", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_BADGER", lEncounter, FALSE)); + break; + case 12: //Animal - Low Canine Encounter + SetLocalString(oUser, "EncounterName", "Low Canine"); + CreateObject(OBJECT_TYPE_CREATURE, "NW_WOLF", lEncounter, FALSE); + DelayCommand(1.0f, Spawn("NW_WOLF", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_WOLF", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_WOLF", lEncounter, FALSE)); + break; + case 13: //Animal - Low Feline Encounter + SetLocalString(oUser, "EncounterName", "Low Feline"); + CreateObject(OBJECT_TYPE_CREATURE, "NW_COUGAR", lEncounter, FALSE); + DelayCommand(1.0f, Spawn("NW_COUGAR", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_COUGAR", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_COUGAR", lEncounter, FALSE)); + break; + case 14: //Animal - Low Bear Encounter + SetLocalString(oUser, "EncounterName", "Low Bear (Boss)"); + CreateObject(OBJECT_TYPE_CREATURE, "NW_BEARBLCK", lEncounter, FALSE); + DelayCommand(1.0f, Spawn("NW_BEARBLCK", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_BEARBLCK", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_BEARBRWN", lEncounter, FALSE)); + break; + case 15: //Animal - Boar Encounter + SetLocalString(oUser, "EncounterName", "Boar (Boss)"); + CreateObject(OBJECT_TYPE_CREATURE, "NW_BOAR", lEncounter, FALSE); + DelayCommand(1.0f, Spawn("NW_BOAR", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_BOAR", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_BOARDIRE", lEncounter, FALSE)); + break; + case 16: //Animal - Medium Feline Encounter + SetLocalString(oUser, "EncounterName", "Medium Feline"); + CreateObject(OBJECT_TYPE_CREATURE, "NW_LION", lEncounter, FALSE); + DelayCommand(1.0f, Spawn("NW_LION", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_LION", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_LION", lEncounter, FALSE)); + break; + case 17: //Animal - High Canine Encounter + SetLocalString(oUser, "EncounterName", "High Canine"); + CreateObject(OBJECT_TYPE_CREATURE, "NW_DIREWOLF", lEncounter, FALSE); + DelayCommand(1.0f, Spawn("NW_DIREWOLF", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_DIREWOLF", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_DIREWOLF", lEncounter, FALSE)); + break; + case 18: //Animal - High Feline Encounter + SetLocalString(oUser, "EncounterName", "High Feline"); + CreateObject(OBJECT_TYPE_CREATURE, "NW_DIRETIGER", lEncounter, FALSE); + DelayCommand(1.0f, Spawn("NW_BEASTMALAR001", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_BEASTMALAR001", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_BEASTMALAR001", lEncounter, FALSE)); + break; + case 19: //Animal - High Bear Encounter + SetLocalString(oUser, "EncounterName", "High Bear"); + CreateObject(OBJECT_TYPE_CREATURE, "NW_BEARDIRE", lEncounter, FALSE); + DelayCommand(1.0f, Spawn("NW_BEARDIRE", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_BEARDIRE", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_BEARDIREBOSS", lEncounter, FALSE)); + break; + + case 21: //Construct - Flesh Golem + SetLocalString(oUser, "EncounterName", "Flesh Golem"); + DelayCommand(1.0f, Spawn("NW_GOLFLESH", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_GOLFLESH", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_GOLFLESH", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_GOLFLESH", lEncounter, FALSE)); + break; + case 22: //Construct - Minogan + SetLocalString(oUser, "EncounterName", "Minogon"); + DelayCommand(1.0f, Spawn("NW_MINOGON", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_MINOGON", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_MINOGON", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_MINOGON", lEncounter, FALSE)); + break; + case 23: //Construct - Clay Golem + SetLocalString(oUser, "EncounterName", "Clay Golem"); + DelayCommand(1.0f, Spawn("NW_GolClay", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_GolClay", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_GolClay", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_GolClay", lEncounter, FALSE)); + break; + case 24: //Construct - Bone Golem + SetLocalString(oUser, "EncounterName", "Bone Golem"); + DelayCommand(1.0f, Spawn("NW_GolBone", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_GolBone", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_GolBone", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_GolBone", lEncounter, FALSE)); + break; + case 25: //Construct - Helmed Horror + SetLocalString(oUser, "EncounterName", "Helmed Horror"); + DelayCommand(1.0f, Spawn("NW_HELMHORR", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_HELMHORR", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_HELMHORR", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_HELMHORR", lEncounter, FALSE)); + break; + case 26: //Construct - Stone Golem + SetLocalString(oUser, "EncounterName", "Stone Golem"); + DelayCommand(1.0f, Spawn("NW_GOLSTONE", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_GOLSTONE", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_GOLSTONE", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_GOLSTONE", lEncounter, FALSE)); + break; + case 27: //Construct - Battle Horror + SetLocalString(oUser, "EncounterName", "Battle Horror"); + DelayCommand(1.0f, Spawn("NW_BATHORROR", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_BATHORROR", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_BATHORROR", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_BATHORROR", lEncounter, FALSE)); + break; + case 28: //Construct - Shield Guardian + SetLocalString(oUser, "EncounterName", "Shield Guardian"); + DelayCommand(1.0f, Spawn("NW_SHGUARD", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_SHGUARD", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_SHGUARD", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_SHGUARD", lEncounter, FALSE)); + break; + case 29: //Construct - Iron Golem + SetLocalString(oUser, "EncounterName", "Iron Golem"); + DelayCommand(1.0f, Spawn("NW_GOLIRON", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_GOLIRON", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_GOLIRON", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_GOLIRON", lEncounter, FALSE)); + break; + case 31: //Dragon - Adult White Dragon + SetLocalString(oUser, "EncounterName", "Adult White Dragon"); + DelayCommand(1.0f, Spawn("NW_DRGWHITE001", lEncounter, FALSE)); + break; + case 32: //Dragon - Adult Black Dragon + SetLocalString(oUser, "EncounterName", "Adult Black Dragon"); + DelayCommand(1.0f, Spawn("NW_DRGBLACK001", lEncounter, FALSE)); + break; + case 33: //Dragon - Adult Green Dragon + SetLocalString(oUser, "EncounterName", "Adult Green Dragon"); + DelayCommand(1.0f, Spawn("NW_DRGGREEN001", lEncounter, FALSE)); + break; + case 34: //Dragon - Adult Blue Dragon + SetLocalString(oUser, "EncounterName", "Adult Blue Dragon"); + DelayCommand(1.0f, Spawn("NW_DRGBLUE001", lEncounter, FALSE)); + break; + case 35: //Dragon - Adult Red Dragon + SetLocalString(oUser, "EncounterName", "Adult Red Dragon"); + DelayCommand(1.0f, Spawn("NW_DRGRED001", lEncounter, FALSE)); + break; + case 36: //Dragon - Old White Dragon + SetLocalString(oUser, "EncounterName", "Old White Dragon"); + DelayCommand(1.0f, Spawn("NW_DRGWHITE002", lEncounter, FALSE)); + break; + case 37: //Dragon - Old Blue Dragon + SetLocalString(oUser, "EncounterName", "Old Blue Dragon"); + DelayCommand(1.0f, Spawn("NW_DRGBLUE002", lEncounter, FALSE)); + break; + case 38: //Dragon - Old Red Dragon + SetLocalString(oUser, "EncounterName", "Old Red Dragon"); + DelayCommand(1.0f, Spawn("NW_DRGRED002", lEncounter, FALSE)); + break; + case 39: //Dragon - Ancient Red Dragon + SetLocalString(oUser, "EncounterName", "Ancient Red Dragon"); + DelayCommand(1.0f, Spawn("NW_DRGRED003", lEncounter, FALSE)); + break; + case 41: //Elemental - Air Elemental + SetLocalString(oUser, "EncounterName", "Air Elemental"); + DelayCommand(1.0f, Spawn("NW_AIR", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_AIR", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_AIR", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_AIR", lEncounter, FALSE)); + break; + case 42: //Elemental - Earth Elemental + SetLocalString(oUser, "EncounterName", "Earth Elemental"); + DelayCommand(1.0f, Spawn("NW_EARTH", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_EARTH", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_EARTH", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_EARTH", lEncounter, FALSE)); + break; + case 43: //Elemental - Fire Elemental + SetLocalString(oUser, "EncounterName", "Fire Elemental"); + DelayCommand(1.0f, Spawn("NW_FIRE", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_FIRE", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_FIRE", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_FIRE", lEncounter, FALSE)); + break; + case 44: //Elemental - Water Elemental + SetLocalString(oUser, "EncounterName", "Water Elemental"); + DelayCommand(1.0f, Spawn("NW_WATER", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_WATER", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_WATER", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_WATER", lEncounter, FALSE)); + break; + case 45: //Elemental - Huge Air Elemental + SetLocalString(oUser, "EncounterName", "Huge Air Elemental"); + DelayCommand(1.0f, Spawn("NW_AIRHUGE", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_AIRHUGE", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_AIRHUGE", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_AIRHUGE", lEncounter, FALSE)); + break; + case 46: //Elemental - Huge Earth Elemental + SetLocalString(oUser, "EncounterName", "Huge Earth Elemental"); + DelayCommand(1.0f, Spawn("NW_EARTHHUGE", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_EARTHHUGE", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_EARTHHUGE", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_EARTHHUGE", lEncounter, FALSE)); + break; + case 47: //Elemental - Huge Fire Elemental + SetLocalString(oUser, "EncounterName", "Huge Fire Elemental"); + DelayCommand(1.0f, Spawn("NW_FIREHUGE", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_FIREHUGE", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_FIREHUGE", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_FIREHUGE", lEncounter, FALSE)); + break; + case 48: //Elemental - Huge Water Elemental + SetLocalString(oUser, "EncounterName", "Huge Water Elemental"); + DelayCommand(1.0f, Spawn("NW_WATERHUGE", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_WATERHUGE", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_WATERHUGE", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_WATERHUGE", lEncounter, FALSE)); + break; + case 49: //Elemental - Elemental Swarm + SetLocalString(oUser, "EncounterName", "Elemental Swarm"); + DelayCommand(1.0f, Spawn("NW_AIRGREAT", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_EARTHGREAT", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_FIREGREAT", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_WATERGREAT", lEncounter, FALSE)); + break; + case 51: //Giant - Low Ogre + SetLocalString(oUser, "EncounterName", "Low Ogre"); + DelayCommand(1.0f, Spawn("NW_OGRE01", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_OGRE01", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_OGRE02", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_OGRE02", lEncounter, FALSE)); + break; + case 52: //Giant - Low Troll + SetLocalString(oUser, "EncounterName", "Low Troll"); + DelayCommand(1.0f, Spawn("NW_TROLL", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_TROLL", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_TROLL", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_TROLL", lEncounter, FALSE)); + break; + case 53: //Giant - High Ogre + SetLocalString(oUser, "EncounterName", "High Ogre"); + DelayCommand(1.0f, Spawn("NW_OGRECHIEF01", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_OGRECHIEF02", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_OGRECHIEF01", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_OGREMAGE02", lEncounter, FALSE)); + break; + case 54: //Giant - High Troll + SetLocalString(oUser, "EncounterName", "High Troll"); + DelayCommand(1.0f, Spawn("NW_TROLLCHIEF", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_TROLLCHIEF", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_TROLLWIZ", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_TROLLWIZ", lEncounter, FALSE)); + break; + case 55: //Giant - Ettin + SetLocalString(oUser, "EncounterName", "Ettin"); + DelayCommand(1.0f, Spawn("NW_ETTIN", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_ETTIN", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_ETTIN", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_ETTIN", lEncounter, FALSE)); + break; + case 56: //Giant - Hill Giant + SetLocalString(oUser, "EncounterName", "Hill Giant"); + DelayCommand(1.0f, Spawn("NW_GNTHILL", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_GNTHILL", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_GNTMOUNT", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_GNTMOUNT", lEncounter, FALSE)); + break; + case 57: //Giant - Frost Giant + SetLocalString(oUser, "EncounterName", "Frost Giant"); + DelayCommand(1.0f, Spawn("NW_GNTFROST", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_GNTFROST", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_GNTFROST", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_GNTFROST", lEncounter, FALSE)); + break; + case 58: //Giant - Fire Giant + SetLocalString(oUser, "EncounterName", "Fire Giant"); + DelayCommand(1.0f, Spawn("NW_GNTFIRE", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_GNTFIRE", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_GNTFIRE", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_GNTFIRE", lEncounter, FALSE)); + break; + case 59: //Giant - Ogre Mage (Boss) + SetLocalString(oUser, "EncounterName", "Ogre Mage (Boss)"); + DelayCommand(1.0f, Spawn("nw_ogreboss", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("nw_ogreboss", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_OGREMAGEBOSS", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_OGREMAGEBOSS", lEncounter, FALSE)); + break; + case 61: //Humanoid - Goblin + SetLocalString(oUser, "EncounterName", "Goblin"); + DelayCommand(1.0f, Spawn("NW_GOBLINA", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_GOBLINA", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_GOBLINA", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_GOBLINB", lEncounter, FALSE)); + break; + case 62: //Humanoid - Kobold + SetLocalString(oUser, "EncounterName", "Kobold"); + DelayCommand(1.0f, Spawn("NW_KOBOLD002", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_KOBOLD002", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_KOBOLD002", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_KOBOLD001", lEncounter, FALSE)); + break; + case 63: //Humanoid - Low Orc + SetLocalString(oUser, "EncounterName", "Low Orc"); + DelayCommand(1.0f, Spawn("NW_ORCB", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_ORCA", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_ORCA", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_ORCA", lEncounter, FALSE)); + break; + case 64: //Humanoid - High Orc (Wiz) + SetLocalString(oUser, "EncounterName", "High Orc (Wiz)"); + DelayCommand(1.0f, Spawn("NW_OrcChiefA", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_ORCCHIEFB", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_ORCCHIEFB", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_ORCWIZA", lEncounter, FALSE)); + break; + case 65: //Humanoid - Bugbear + SetLocalString(oUser, "EncounterName", "Bugbear"); + DelayCommand(1.0f, Spawn("NW_BUGBEARA", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_BUGBEARA", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_BUGBEARA", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_BUGBEARB", lEncounter, FALSE)); + break; + case 66: //Humanoid - Lizardfolk + SetLocalString(oUser, "EncounterName", "Lizardfolk"); + DelayCommand(1.0f, Spawn("NW_OLDWARRA", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_OLDWARRA", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_OLDWARRA", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_OLDWARB", lEncounter, FALSE)); + break; + case 67: //Humanoid - Minotaur (Wiz) + SetLocalString(oUser, "EncounterName", "Minotaur (Wiz)"); + DelayCommand(1.0f, Spawn("NW_MINOTAUR", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_MINOTAUR", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_MINOTAUR", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_MINWIZ", lEncounter, FALSE)); + break; + case 68: //Humanoid - Fey + SetLocalString(oUser, "EncounterName", "Fey (Mixed)"); + DelayCommand(1.0f, Spawn("NW_GRIG", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_GRIG", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_PIXIE", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_PIXIE", lEncounter, FALSE)); + break; + case 69: //Humanoid - Yuan-Ti (Mixed) + SetLocalString(oUser, "EncounterName", "Yuan-Ti (Mixed)"); + DelayCommand(1.0f, Spawn("NW_YUAN_TI001", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_YUAN_TI001", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_YUAN_TI002", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_YUAN_TI003", lEncounter, FALSE)); + break; + case 71: //Insects - Fire Beetle + SetLocalString(oUser, "EncounterName", "Fire Beetle"); + DelayCommand(1.0f, Spawn("NW_BTLFIRE", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_BTLFIRE", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_BTLFIRE", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_BTLFIRE", lEncounter, FALSE)); + break; + case 72: //Insects - Spitting Fire Beetle + SetLocalString(oUser, "EncounterName", "Spitting Fire Beetle"); + DelayCommand(1.0f, Spawn("NW_BTLFIRE02", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_BTLFIRE02", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_BTLFIRE02", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_BTLFIRE02", lEncounter, FALSE)); + break; + case 73: //Insects - Low Beetle (Mixed) + SetLocalString(oUser, "EncounterName", "Low Beetle (Mixed)"); + DelayCommand(1.0f, Spawn("NW_BTLBOMB", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_BTLBOMB", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_BTLSTINK", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_BTLFIRE02", lEncounter, FALSE)); + break; + case 74: //Insects - Giant Spider + SetLocalString(oUser, "EncounterName", "Giant Spider"); + DelayCommand(1.0f, Spawn("NW_SPIDGIANT", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_SPIDGIANT", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_SPIDGIANT", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_SPIDGIANT", lEncounter, FALSE)); + break; + case 75: //Insects - Sword Spider + SetLocalString(oUser, "EncounterName", "Sword Spider"); + DelayCommand(1.0f, Spawn("NW_SPIDSWRD", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_SPIDSWRD", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_SPIDSWRD", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_SPIDSWRD", lEncounter, FALSE)); + break; + case 76: //Insects - Wraith Spider + SetLocalString(oUser, "EncounterName", "Wraith Spider"); + DelayCommand(1.0f, Spawn("NW_SPIDWRA", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_SPIDWRA", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_SPIDWRA", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_SPIDWRA", lEncounter, FALSE)); + break; + case 77: //Insects - Stag Beetle + SetLocalString(oUser, "EncounterName", "Stag Beetle"); + DelayCommand(1.0f, Spawn("NW_BTLSTAG", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_BTLSTAG", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_BTLSTAG", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_BTLSTAG", lEncounter, FALSE)); + break; + case 78: //Insects - Dire Spider + SetLocalString(oUser, "EncounterName", "Dire Spider"); + DelayCommand(1.0f, Spawn("NW_SPIDDIRE", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_SPIDDIRE", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_SPIDDIRE", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_SPIDDIRE", lEncounter, FALSE)); + break; + case 79: //Insects - Queen Spider + SetLocalString(oUser, "EncounterName", "Queen Spider"); + DelayCommand(1.0f, Spawn("NW_SPIDERBOSS", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_SPIDERBOSS", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_SPIDERBOSS", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_SPIDERBOSS", lEncounter, FALSE)); + break; + case 81: //Undead - Low Zombie + SetLocalString(oUser, "EncounterName", "Zombie"); + DelayCommand(1.0f, Spawn("NW_ZOMBIE01", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_ZOMBIE02", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_ZOMBIE01", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_ZOMBIE02", lEncounter, FALSE)); + break; + case 82: //Undead - Low Skeleton + SetLocalString(oUser, "EncounterName", "Low Skeleton"); + DelayCommand(1.0f, Spawn("NW_SKELETON", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_SKELETON", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_SKELETON", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_SKELETON", lEncounter, FALSE)); + break; + case 83: //Undead - Ghoul + SetLocalString(oUser, "EncounterName", "Ghoul"); + DelayCommand(1.0f, Spawn("NW_GHOUL", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_GHOUL", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_GHOUL", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_GHOUL", lEncounter, FALSE)); + break; + case 84: //Undead - Shadow + SetLocalString(oUser, "EncounterName", "Shadow"); + DelayCommand(1.0f, Spawn("NW_SHADOW", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_SHADOW", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_SHADOW", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_SHADOW", lEncounter, FALSE)); + break; + case 85: //Undead - Mummy + SetLocalString(oUser, "EncounterName", "Mummy"); + DelayCommand(1.0f, Spawn("NW_MUMMY", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_MUMMY", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_MUMMY", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_MUMMY", lEncounter, FALSE)); + break; + case 86: //Undead - High Skeleton + SetLocalString(oUser, "EncounterName", "High Skeleton (Mixed)"); + DelayCommand(1.0f, Spawn("NW_SKELWARR01", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_SKELWARR02", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_SKELMAGE", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_SKELPRIEST", lEncounter, FALSE)); + break; + case 87: //Undead - Curst (Mixed) + SetLocalString(oUser, "EncounterName", "Curst (Mixed)"); + DelayCommand(1.0f, Spawn("NW_CURST001", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_CURST002", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_CURST003", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_CURST004", lEncounter, FALSE)); + break; + case 88: //Undead - Doom Knight + SetLocalString(oUser, "EncounterName", "Doom Knight"); + DelayCommand(1.0f, Spawn("NW_DOOMKGHT", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_DOOMKGHT", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_DOOMKGHT", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_DOOMKGHT", lEncounter, FALSE)); + break; + case 89: //Undead - Vampire (Mixed) + SetLocalString(oUser, "EncounterName", "Vampire (Mixed)"); + DelayCommand(1.0f, Spawn("NW_VAMPIRE001", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_VAMPIRE002", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_VAMPIRE003", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_VAMPIRE004", lEncounter, FALSE)); + break; + case 91: //NPC - Low Gypsy + SetLocalString(oUser, "EncounterName", "Low Gypsy"); + DelayCommand(1.0f, Spawn("NW_GYPMALE", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_GYPMALE", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_GYPFEMALE", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_GYPFEMALE", lEncounter, FALSE)); + break; + case 92: //NPC - Low Bandit + SetLocalString(oUser, "EncounterName", "Low Bandit"); + DelayCommand(1.0f, Spawn("NW_BANDIT001", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_BANDIT001", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_BANDIT001", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_BANDIT002", lEncounter, FALSE)); + break; + case 93: //NPC - Medium Bandit (Mixed) + SetLocalString(oUser, "EncounterName", "Medium Bandit (Mixed)"); + DelayCommand(1.0f, Spawn("NW_BANDIT005", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_BANDIT002", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_BANDIT003", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_BANDIT004", lEncounter, FALSE)); + break; + case 94: //NPC - Low Mercenary (Mixed) + SetLocalString(oUser, "EncounterName", "Low Mercenary (Mixed)"); + DelayCommand(1.0f, Spawn("NW_HUMANMERC001", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_HALFMERC001", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_DWARFMERC001", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_ELFMERC001", lEncounter, FALSE)); + break; + case 95: //NPC - Elf Ranger + SetLocalString(oUser, "EncounterName", "Elf Ranger"); + DelayCommand(1.0f, Spawn("NW_ELFRANGER005", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_ELFRANGER005", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_ELFRANGER005", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_ELFRANGER005", lEncounter, FALSE)); + break; + case 96: //NPC - Low Drow (Mixed) + SetLocalString(oUser, "EncounterName", "Low Drow (Mixed)"); + DelayCommand(1.0f, Spawn("NW_DROWFIGHT005", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_DROWMAGE005", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_DROWROGUE005", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_DROWCLER005", lEncounter, FALSE)); + break; + case 97: //NPC - Medium Mercenary (Mixed) + SetLocalString(oUser, "EncounterName", "Medium Mercenary (Mixed)"); + DelayCommand(1.0f, Spawn("NW_HUMANMERC004", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_HALFMERC004", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_DWARFMERC004", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_ELFMERC004", lEncounter, FALSE)); + break; + case 98: //NPC - High Drow (Mixed) + SetLocalString(oUser, "EncounterName", "High Drow (Mixed)"); + DelayCommand(1.0f, Spawn("NW_DROWFIGHT020", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_DROWMAGE020", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_DROWROGUE020", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_DROWCLER020", lEncounter, FALSE)); + break; + case 99: //NPC - High Mercenary (Mixed) + SetLocalString(oUser, "EncounterName", "High Mercenary (Mixed)"); + DelayCommand(1.0f, Spawn("NW_HUMANMERC006", lEncounter, FALSE)); + DelayCommand(2.0f, Spawn("NW_HALFMERC006", lEncounter, FALSE)); + DelayCommand(3.0f, Spawn("NW_DWARFMERC006", lEncounter, FALSE)); + DelayCommand(4.0f, Spawn("NW_ELFMERC006", lEncounter, FALSE)); + break; + case 101: // Custom Encounters + CreateCustomEncounter("DMFI_E1", lEncounter); break; + case 102: CreateCustomEncounter("DMFI_E2", lEncounter); break; + case 103: CreateCustomEncounter("DMFI_E3", lEncounter); break; + case 104: CreateCustomEncounter("DMFI_E4", lEncounter); break; + case 105: CreateCustomEncounter("DMFI_E5", lEncounter); break; + case 106: CreateCustomEncounter("DMFI_E6", lEncounter); break; + case 107: CreateCustomEncounter("DMFI_E7", lEncounter); break; + case 108: CreateCustomEncounter("DMFI_E8", lEncounter); break; + case 109: CreateCustomEncounter("DMFI_E9", lEncounter); break; + default: + break; + } + return; +} + +//////////////////////////////////////////////////////////////////////// +//An FX Wand function +void FXWand_Firestorm(object oDM) +{ + + // FireStorm Effect + location lDMLoc = GetLocation ( oDM); + + + // tell the DM object to rain fire and destruction + AssignCommand ( oDM, ApplyEffectAtLocation ( DURATION_TYPE_INSTANT, EffectVisualEffect ( VFX_FNF_METEOR_SWARM), lDMLoc)); + AssignCommand ( oDM, DelayCommand (1.0, ApplyEffectAtLocation ( DURATION_TYPE_INSTANT, EffectVisualEffect (VFX_FNF_SCREEN_SHAKE), lDMLoc))); + + // create some fires + object oTargetArea = GetArea(oDM); + int nXPos, nYPos, nCount; + for (nCount = 0; nCount < 15; nCount++) + { + nXPos = Random(30) - 15; + nYPos = Random(30) - 15; + + vector vNewVector = GetPosition(oDM); + vNewVector.x += nXPos; + vNewVector.y += nYPos; + + location lFireLoc = Location(oTargetArea, vNewVector, 0.0); + object oFire = CreateObject ( OBJECT_TYPE_PLACEABLE, "plc_flamelarge", lFireLoc, FALSE); + object oDust = CreateObject ( OBJECT_TYPE_PLACEABLE, "plc_dustplume", lFireLoc, FALSE); + DelayCommand ( 10.0, DestroyObject ( oFire)); + DelayCommand ( 14.0, DestroyObject ( oDust)); + } + +} + +//////////////////////////////////////////////////////////////////////// +//An FX Wand function +void FXWand_Earthquake(object oDM) +{ + // Earthquake Effect by Jhenne, 06/29/02 + // declare variables used for targetting and commands. + location lDMLoc = GetLocation ( oDM); + + // tell the DM object to shake the screen + AssignCommand( oDM, ApplyEffectAtLocation ( DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SCREEN_SHAKE), lDMLoc)); + AssignCommand ( oDM, DelayCommand( 2.8, ApplyEffectAtLocation ( DURATION_TYPE_INSTANT, EffectVisualEffect ( VFX_FNF_SCREEN_BUMP), lDMLoc))); + AssignCommand ( oDM, DelayCommand( 3.0, ApplyEffectAtLocation ( DURATION_TYPE_INSTANT, EffectVisualEffect ( VFX_FNF_SCREEN_SHAKE), lDMLoc))); + AssignCommand ( oDM, DelayCommand( 4.5, ApplyEffectAtLocation ( DURATION_TYPE_INSTANT, EffectVisualEffect ( VFX_FNF_SCREEN_BUMP), lDMLoc))); + AssignCommand ( oDM, DelayCommand( 5.8, ApplyEffectAtLocation ( DURATION_TYPE_INSTANT, EffectVisualEffect ( VFX_FNF_SCREEN_BUMP), lDMLoc))); + // tell the DM object to play an earthquake sound + AssignCommand ( oDM, PlaySound ("as_cv_boomdist1")); + AssignCommand ( oDM, DelayCommand ( 2.0, PlaySound ("as_wt_thunderds3"))); + AssignCommand ( oDM, DelayCommand ( 4.0, PlaySound ("as_cv_boomdist1"))); + // create a dust plume at the DM and clicking location + object oTargetArea = GetArea(oDM); + int nXPos, nYPos, nCount; + for (nCount = 0; nCount < 15; nCount++) + { + nXPos = Random(30) - 15; + nYPos = Random(30) - 15; + + vector vNewVector = GetPosition(oDM); + vNewVector.x += nXPos; + vNewVector.y += nYPos; + + location lDustLoc = Location(oTargetArea, vNewVector, 0.0); + object oDust = CreateObject ( OBJECT_TYPE_PLACEABLE, "plc_dustplume", lDustLoc, FALSE); + DelayCommand ( 4.0, DestroyObject ( oDust)); + } +} + +//////////////////////////////////////////////////////////////////////// +//An FX Wand function +void FXWand_Lightning(object oDM, location lDMLoc) +{ + // Lightning Strike by Jhenne. 06/29/02 + // tell the DM object to create a Lightning visual effect at targetted location + AssignCommand( oDM, ApplyEffectAtLocation ( DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_LIGHTNING_M), lDMLoc)); + // tell the DM object to play a thunderclap + AssignCommand ( oDM, PlaySound ("as_wt_thundercl3")); + // create a scorch mark where the lightning hit + object oScorch = CreateObject ( OBJECT_TYPE_PLACEABLE, "plc_weathmark", lDMLoc, FALSE); + object oTargetArea = GetArea(oDM); + int nXPos, nYPos, nCount; + for (nCount = 0; nCount < 5; nCount++) + { + nXPos = Random(10) - 5; + nYPos = Random(10) - 5; + + vector vNewVector = GetPositionFromLocation(lDMLoc); + vNewVector.x += nXPos; + vNewVector.y += nYPos; + + location lNewLoc = Location(oTargetArea, vNewVector, 0.0); + AssignCommand( oDM, ApplyEffectAtLocation ( DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_LIGHTNING_S), lNewLoc)); + } + DelayCommand ( 20.0, DestroyObject ( oScorch)); +} + +//////////////////////////////////////////////////////////////////////// +void FnFEffect(object oUser, int iVFX, location lEffect, float fDelay) +{ + if (fDelay>2.0) FloatingTextStringOnCreature("Delay effect created", oUser, FALSE); + DelayCommand( fDelay, ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(iVFX),lEffect)); +} + +//////////////////////////////////////////////////////////////////////// +void CreateEffects(int iEffect, location lEffect, object oUser) +{ + float fDelay; + float fDuration; + float fBeamDuration; + object oTarget; + + if (GetIsDMPossessed(oUser)) + { + fDelay = GetLocalFloat(GetMaster(oUser), "dmfi_effectdelay"); + fDuration = GetLocalFloat(GetMaster(oUser), "dmfi_effectduration"); + fBeamDuration = GetLocalFloat(GetMaster(oUser), "dmfi_beamduration"); + } + else + { + fDelay = GetLocalFloat(oUser, "dmfi_effectdelay"); + fDuration = GetLocalFloat(oUser, "dmfi_effectduration"); + fBeamDuration = GetLocalFloat(oUser, "dmfi_beamduration"); + } + + if (!GetIsObjectValid(GetLocalObject(oUser, "dmfi_univ_target"))) + oTarget = oUser; + else + oTarget = GetLocalObject(oUser, "dmfi_univ_target"); + switch (iEffect) + { + //SoU/HotU Duration Effects(must have a target) + case 101: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_BIGBYS_CLENCHED_FIST), oTarget, fDuration); break; + case 102: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_BIGBYS_CRUSHING_HAND), oTarget, fDuration); break; + case 103: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_BIGBYS_GRASPING_HAND), oTarget, fDuration); break; + case 104: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_BIGBYS_INTERPOSING_HAND), oTarget, fDuration); break; + case 105: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_ICESKIN), oTarget, fDuration); break; + case 106: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_INFERNO), oTarget, fDuration); break; + case 107: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_PIXIEDUST), oTarget, fDuration); break; + case 108: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY), oTarget, fDuration); break; + case 109: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_FREEZE_ANIMATION), oTarget, fDuration); break; + case 100: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_GHOSTLY_PULSE), oTarget, fDuration); break; + //Magical Duration Effects + case 10: ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_CALTROPS),lEffect, fDuration); break; + case 11: ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_TENTACLE),lEffect, fDuration); break; + case 12: ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_WEB_MASS),lEffect, fDuration); break; + case 13: FnFEffect(oUser, VFX_FNF_GAS_EXPLOSION_MIND,lEffect, fDelay); break; + case 14: FnFEffect(oUser, VFX_FNF_LOS_HOLY_30,lEffect, fDelay); break; + case 15: FnFEffect(oUser, VFX_FNF_LOS_EVIL_30,lEffect, fDelay); break; + case 16: FnFEffect(oUser, VFX_FNF_SMOKE_PUFF,lEffect, fDelay); break; + case 17: FnFEffect(oUser, VFX_FNF_GAS_EXPLOSION_NATURE,lEffect, fDelay); break; + case 18: FnFEffect(oUser, VFX_FNF_DISPEL_DISJUNCTION,lEffect, fDelay); break; + case 19: FnFEffect(oUser, VFX_FNF_GAS_EXPLOSION_EVIL,lEffect, fDelay); break; + //Magical Status Effects (must have a target) + case 21: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_PROT_BARKSKIN), oTarget, fDuration); break; + case 22: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_PROT_GREATER_STONESKIN), oTarget, fDuration); break; + case 23: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_ENTANGLE), oTarget, fDuration); break; + case 24: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_ETHEREAL_VISAGE), oTarget, fDuration); break; + case 25: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_GHOSTLY_VISAGE), oTarget, fDuration); break; + case 26: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_INVISIBILITY), oTarget, fDuration); break; + case 27: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_BARD_SONG), oTarget, fDuration); break; + case 28: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_GLOBE_INVULNERABILITY), oTarget, fDuration); break; + case 29: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_PARALYZED), oTarget, fDuration); break; + case 20: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_PROT_SHADOW_ARMOR), oTarget, fDuration); break; + //Magical Burst Effects + case 31: FnFEffect(oUser, VFX_FNF_FIREBALL,lEffect, fDelay); break; + case 32: FnFEffect(oUser, VFX_FNF_FIRESTORM,lEffect, fDelay); break; + case 33: FnFEffect(oUser, VFX_FNF_HORRID_WILTING,lEffect, fDelay); break; + case 34: FnFEffect(oUser, VFX_FNF_HOWL_WAR_CRY,lEffect, fDelay); break; + case 35: FnFEffect(oUser, VFX_FNF_IMPLOSION,lEffect, fDelay); break; + case 36: FnFEffect(oUser, VFX_FNF_PWKILL,lEffect, fDelay); break; + case 37: FnFEffect(oUser, VFX_FNF_PWSTUN,lEffect, fDelay); break; + case 38: FnFEffect(oUser, VFX_FNF_SOUND_BURST,lEffect, fDelay); break; + case 39: FnFEffect(oUser, VFX_FNF_STRIKE_HOLY,lEffect, fDelay); break; + case 30: FnFEffect(oUser, VFX_FNF_WORD,lEffect, fDelay); break; + //Lighting Effects + case 41: ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_BLACKOUT),lEffect, fDuration); break; + case 42: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_ANTI_LIGHT_10),oTarget, fDuration); break; + case 43: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_LIGHT_BLUE_20),oTarget, fDuration); break; + case 44: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_LIGHT_GREY_20),oTarget, fDuration); break; + case 45: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_LIGHT_ORANGE_20),oTarget, fDuration); break; + case 46: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_LIGHT_PURPLE_20),oTarget, fDuration); break; + case 47: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_LIGHT_RED_20),oTarget, fDuration); break; + case 48: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_LIGHT_WHITE_20),oTarget, fDuration); break; + case 49: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_LIGHT_YELLOW_20),oTarget, fDuration); break; + //Beam Effects + case 50: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBeam(VFX_BEAM_CHAIN, oUser, BODY_NODE_CHEST, FALSE), oTarget, fBeamDuration); break; + case 51: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBeam(VFX_BEAM_COLD, oUser, BODY_NODE_CHEST, FALSE), oTarget, fBeamDuration); break; + case 52: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBeam(VFX_BEAM_EVIL, oUser, BODY_NODE_CHEST, FALSE), oTarget, fBeamDuration); break; + case 53: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBeam(VFX_BEAM_FIRE, oUser, BODY_NODE_CHEST, FALSE), oTarget, fBeamDuration); break; + case 54: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBeam(VFX_BEAM_FIRE_LASH, oUser, BODY_NODE_CHEST, FALSE), oTarget, fBeamDuration); break; + case 55: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBeam(VFX_BEAM_HOLY, oUser, BODY_NODE_CHEST, FALSE), oTarget, fBeamDuration); break; + case 56: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBeam(VFX_BEAM_LIGHTNING, oUser, BODY_NODE_CHEST, FALSE), oTarget, fBeamDuration); break; + case 57: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBeam(VFX_BEAM_MIND, oUser, BODY_NODE_CHEST, FALSE), oTarget, fBeamDuration); break; + case 58: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBeam(VFX_BEAM_ODD, oUser, BODY_NODE_CHEST, FALSE), oTarget, fBeamDuration); break; + case 59: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBeam(VFX_BEAM_COLD, oUser, BODY_NODE_CHEST, FALSE), oTarget, fBeamDuration); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBeam(VFX_BEAM_EVIL, oUser, BODY_NODE_CHEST, FALSE), oTarget, fBeamDuration); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBeam(VFX_BEAM_FIRE, oUser, BODY_NODE_CHEST, FALSE), oTarget, fBeamDuration); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBeam(VFX_BEAM_FIRE_LASH, oUser, BODY_NODE_CHEST, FALSE), oTarget, fBeamDuration); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBeam(VFX_BEAM_HOLY, oUser, BODY_NODE_CHEST, FALSE), oTarget, fBeamDuration); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBeam(VFX_BEAM_LIGHTNING, oUser, BODY_NODE_CHEST, FALSE), oTarget, fBeamDuration); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBeam(VFX_BEAM_MIND, oUser, BODY_NODE_CHEST, FALSE), oTarget, fBeamDuration); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBeam(VFX_BEAM_ODD, oUser, BODY_NODE_CHEST, FALSE), oTarget, fBeamDuration); break; + + //Environmental Effects + case 60: FnFEffect(oUser, VFX_FNF_NATURES_BALANCE,lEffect, fDelay);break; + case 61: FXWand_Lightning(oTarget, lEffect); break; + case 62: FXWand_Firestorm(oTarget); break; + case 63: FXWand_Earthquake(oTarget); break; + case 64: FnFEffect(oUser, VFX_FNF_ICESTORM,lEffect, fDelay); break; + case 65: FnFEffect(oUser, VFX_FNF_SUNBEAM,lEffect, fDelay); break; + case 66: SetWeather(GetArea(oUser), WEATHER_CLEAR); break; + case 67: SetWeather(GetArea(oUser), WEATHER_RAIN); break; + case 68: SetWeather(GetArea(oUser), WEATHER_SNOW); break; + case 69: SetWeather(GetArea(oUser), WEATHER_USE_AREA_SETTINGS); break; + //Summon Effects + case 71: FnFEffect(oUser, VFX_FNF_SUMMON_MONSTER_1,lEffect, fDelay); break; + case 72: FnFEffect(oUser, VFX_FNF_SUMMON_MONSTER_2,lEffect, fDelay); break; + case 73: FnFEffect(oUser, VFX_FNF_SUMMON_MONSTER_3,lEffect, fDelay); break; + case 74: FnFEffect(oUser, VFX_FNF_SUMMON_CELESTIAL,lEffect, fDelay); break; + case 75: FnFEffect(oUser, VFX_FNF_SUMMONDRAGON,lEffect, fDelay); break; + case 76: FnFEffect(oUser, VFX_FNF_SUMMON_EPIC_UNDEAD,lEffect, fDelay); break; + case 77: FnFEffect(oUser, VFX_FNF_SUMMON_GATE,lEffect, fDelay); break; + case 78: FnFEffect(oUser, VFX_FNF_SUMMON_UNDEAD,lEffect, fDelay); break; + case 79: FnFEffect(oUser, VFX_FNF_UNDEAD_DRAGON,lEffect, fDelay); break; + case 70: FnFEffect(oUser, VFX_FNF_WAIL_O_BANSHEES,lEffect, fDelay); break; + //SoU/HotU Effects + case 80: ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(322), oTarget, fDuration); break; + case 81: ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(132), oTarget, fDuration); break; + case 82: ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(133), oTarget, fDuration); break; + case 83: ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(136), oTarget, fDuration); break; + case 84: ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(137), oTarget, fDuration); break; + case 85: FnFEffect(oUser, VFX_FNF_DEMON_HAND,lEffect, fDelay); break; + case 86: FnFEffect(oUser, VFX_FNF_ELECTRIC_EXPLOSION,lEffect, fDelay); break; + case 87: FnFEffect(oUser, VFX_FNF_GREATER_RUIN,lEffect, fDelay); break; + case 88: FnFEffect(oUser, VFX_FNF_MYSTICAL_EXPLOSION,lEffect, fDelay); break; + case 89: FnFEffect(oUser, VFX_FNF_SWINGING_BLADE,lEffect, fDelay); break; + //Settings + case 91: + SetLocalString(oUser, "EffectSetting", "dmfi_effectduration"); + CreateSetting(oUser); + break; + case 92: + SetLocalString(oUser, "EffectSetting", "dmfi_effectdelay"); + CreateSetting(oUser); + break; + case 93: + SetLocalString(oUser, "EffectSetting", "dmfi_beamduration"); + CreateSetting(oUser); + break; + case 94: //Change Day Music + iDayMusic = MusicBackgroundGetDayTrack(GetArea(oUser)) + 1; + if (iDayMusic > 33) iDayMusic = 49; + if (iDayMusic > 55) iDayMusic = 1; + MusicBackgroundStop(GetArea(oUser)); + MusicBackgroundChangeDay(GetArea(oUser), iDayMusic); + MusicBackgroundPlay(GetArea(oUser)); + break; + case 95: //Change Night Music + iNightMusic = MusicBackgroundGetDayTrack(GetArea(oUser)) + 1; + if (iNightMusic > 33) iNightMusic = 49; + if (iNightMusic > 55) iNightMusic = 1; + MusicBackgroundStop(GetArea(oUser)); + MusicBackgroundChangeNight(GetArea(oUser), iNightMusic); + MusicBackgroundPlay(GetArea(oUser)); + break; + case 96: //Play Background Music + MusicBackgroundPlay(GetArea(oUser)); + break; + case 97: //Stop Background Music + MusicBackgroundStop(GetArea(oUser)); + break; + case 98: //Change and Play Battle Music + iBattleMusic = MusicBackgroundGetBattleTrack(GetArea(oUser)) + 1; + if (iBattleMusic < 34 || iBattleMusic > 48) iBattleMusic = 34; + MusicBattleStop(GetArea(oUser)); + MusicBattleChange(GetArea(oUser), iBattleMusic); + MusicBattlePlay(GetArea(oUser)); + break; + case 99: //Stop Battle Music + MusicBattleStop(GetArea(oUser)); + break; + + default: break; + } + DeleteLocalObject(oUser, "EffectTarget"); + return; +} + +//////////////////////////////////////////////////////////////////////// +//This function is for the DMFI Emote Wand +void DoEmoteFunction(int iEmote, object oUser) +{ + object oTarget = GetLocalObject(oUser, "dmfi_univ_target"); + if (!GetIsObjectValid(oTarget)) + oTarget = oUser; + float fDur = 9999.0f; //Duration + + switch (iEmote) + { + case 1: AssignCommand(oTarget, PlayAnimation( ANIMATION_FIREFORGET_DODGE_SIDE, 1.0)); break; + case 2: AssignCommand(oTarget, PlayAnimation( ANIMATION_FIREFORGET_DRINK, 1.0)); break; + case 3: AssignCommand(oTarget, PlayAnimation( ANIMATION_FIREFORGET_DODGE_DUCK, 1.0)); break; + case 4: AssignCommand(oTarget, PlayAnimation( ANIMATION_LOOPING_DEAD_BACK, 1.0, fDur)); break; + case 5: AssignCommand(oTarget, PlayAnimation( ANIMATION_LOOPING_DEAD_FRONT, 1.0, fDur)); break; + case 6: AssignCommand(oTarget, PlayAnimation( ANIMATION_FIREFORGET_READ, 1.0)); DelayCommand(3.0f, AssignCommand(oTarget, PlayAnimation( ANIMATION_FIREFORGET_READ, 1.0)));break; + case 7: AssignCommand(oTarget, PlayAnimation( ANIMATION_LOOPING_SIT_CROSS, 1.0, fDur)); break; + case 81: AssignCommand(oTarget, PlayAnimation( ANIMATION_LOOPING_TALK_PLEADING, 1.0, fDur)); break; + case 82: AssignCommand(oTarget, PlayAnimation( ANIMATION_LOOPING_CONJURE1, 1.0, fDur)); break; + case 83: AssignCommand(oTarget, PlayAnimation( ANIMATION_LOOPING_CONJURE2, 1.0, fDur)); break; + case 84: AssignCommand(oTarget, PlayAnimation( ANIMATION_LOOPING_GET_LOW, 1.0, fDur)); break; + case 85: AssignCommand(oTarget, PlayAnimation( ANIMATION_LOOPING_GET_MID, 1.0, fDur)); break; + case 86: AssignCommand(oTarget, PlayAnimation( ANIMATION_LOOPING_MEDITATE, 1.0, fDur)); break; + case 87: AssignCommand(oTarget, PlayAnimation( ANIMATION_LOOPING_TALK_FORCEFUL, 1.0, fDur)); break; + case 88: AssignCommand(oTarget, PlayAnimation( ANIMATION_LOOPING_WORSHIP, 1.0, fDur)); break; + case 10: if (!GetLocalInt(oTarget, "hls_emotemute")) FloatingTextStringOnCreature("*emote* commands are off", oTarget, FALSE); + else FloatingTextStringOnCreature("*emote* commands are on", oTarget, FALSE); + SetLocalInt(oTarget, "hls_emotemute", abs(GetLocalInt(oTarget, "hls_emotemute") - 1)); break; + case 91: EmoteDance(oTarget); break; + case 92: AssignCommand(oTarget, PlayAnimation( ANIMATION_LOOPING_PAUSE_DRUNK, 1.0, fDur)); break; + case 93: AssignCommand(oTarget, ActionForceFollowObject(GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC, oTarget), 2.0f)); break; + case 94: SitInNearestChair(oTarget); break; + case 95: AssignCommand(oTarget, ActionPlayAnimation( ANIMATION_LOOPING_SIT_CROSS, 1.0, fDur)); DelayCommand(1.0f, AssignCommand(oTarget, PlayAnimation( ANIMATION_FIREFORGET_DRINK, 1.0))); DelayCommand(3.0f, AssignCommand(oTarget, PlayAnimation( ANIMATION_LOOPING_SIT_CROSS, 1.0, fDur)));break; + case 96: AssignCommand(oTarget, ActionPlayAnimation( ANIMATION_LOOPING_SIT_CROSS, 1.0, fDur)); DelayCommand(1.0f, AssignCommand(oTarget, PlayAnimation( ANIMATION_FIREFORGET_READ, 1.0))); DelayCommand(3.0f, AssignCommand(oTarget, PlayAnimation( ANIMATION_LOOPING_SIT_CROSS, 1.0, fDur)));break; + case 97: AssignCommand(oTarget, PlayAnimation( ANIMATION_LOOPING_SPASM, 1.0, fDur)); break; + case 98: SmokePipe(oTarget); break; + default: break; + } +} + +//////////////////////////////////////////////////////////////////////// +void DoBuff (int iChoice, object oUser) +{ + int nChoice = 0; + string sType; + object oTarget = GetLocalObject(oUser, "dmfi_univ_target"); + int Party = GetLocalInt(oUser, "dmfi_buff_party"); + int CL; + int nSpell1 = SPELL_ALL_SPELLS; + int nSpell2 = SPELL_ALL_SPELLS; + int nSpell3 = SPELL_ALL_SPELLS; + + + switch (iChoice) + { + case 10: nChoice = -1; break; + case 11: nChoice = SPELL_AURA_OF_VITALITY; break; + case 12: nChoice = SPELL_BARKSKIN; break; + case 13: nChoice = SPELL_BATTLETIDE; break; + case 14: nChoice = SPELL_BLESS; break; + case 16: nChoice = SPELL_CLAIRAUDIENCE_AND_CLAIRVOYANCE; break; + case 17: nChoice = SPELL_CLARITY; break; + case 18: nChoice = SPELL_DEATH_WARD; break; + case 19: nChoice = SPELL_DISPLACEMENT; break; + case 20: nChoice = -1; break; + case 21: nChoice = SPELL_DIVINE_FAVOR; break; + case 22: nChoice = SPELL_DIVINE_POWER; break; + case 23: nChoice = SPELL_ENDURE_ELEMENTS; break; + case 24: nChoice = SPELL_ENTROPIC_SHIELD; break; + case 25: nChoice = SPELL_ELEMENTAL_SHIELD; break; + case 26: nChoice = SPELL_ENERGY_BUFFER; break; + case 27: nChoice = SPELL_ETHEREAL_VISAGE; break; + case 28: nChoice = SPELL_GHOSTLY_VISAGE; break; + case 29: nChoice = SPELL_GLOBE_OF_INVULNERABILITY; break; + case 30: nChoice = -1; break; + case 31: nChoice = SPELL_SANCTUARY; break; + case 32: nChoice = SPELL_GREATER_STONESKIN; break; + case 33: nChoice = SPELL_GREATER_SPELL_MANTLE; break; + case 34: nChoice = SPELL_HASTE; break; + case 35: nChoice = SPELL_INVISIBILITY; break; + case 36: nChoice = SPELL_IMPROVED_INVISIBILITY; break; + case 37: nChoice = SPELL_LESSER_MIND_BLANK;break; + case 38: nChoice = SPELL_LESSER_SPELL_MANTLE; break; + case 39: nChoice = SPELL_MAGE_ARMOR; break; + case 40: nChoice = -1; break; + case 41: nChoice = SPELL_MESTILS_ACID_SHEATH; break; + case 42: nChoice = SPELL_MONSTROUS_REGENERATION; break; + case 43: nChoice = SPELL_PRAYER; break; + case 44: nChoice = SPELL_PREMONITION; break; + case 45: nChoice = SPELL_PROTECTION_FROM_ELEMENTS; break; + case 46: nChoice = SPELL_PROTECTION_FROM_SPELLS; break; + case 47: nChoice = SPELL_REGENERATE; break; + case 48: nChoice = SPELL_RESIST_ELEMENTS; break; + case 49: nChoice = SPELL_SHADOW_SHIELD; break; + case 50: nChoice = -1; break; + case 51: nChoice = SPELL_SHIELD; break; + case 52: nChoice = SPELL_SPELL_MANTLE; break; + case 53: nChoice = SPELL_SPELL_RESISTANCE; break; + case 54: nChoice = SPELL_STONE_BONES; break; + case 55: nChoice = SPELL_STONESKIN; break; + case 56: nChoice = SPELL_TENSERS_TRANSFORMATION; break; + case 57: nChoice = SPELL_TRUE_SEEING; break; + case 58: nChoice = SPELL_DARKNESS; break; + case 59: nChoice = SPELL_WAR_CRY; break; + case 60: nChoice = -1; break; + case 61: sType = "BARD_DEF"; break; + case 62: sType = "BARD_OFF"; break; + case 63: sType = "CLERIC_DEF"; break; + case 64: sType = "CLERIC_OFF"; break; + case 65: sType = "DRUID_DEF"; break; + case 66: sType = "DRUID_OFF"; break; + case 67: sType = "MAGE_DEF"; break; + case 68: sType = "MAGE_OFF"; break; + case 70: nChoice = -1; break; + case 71: sType = "ARMOR"; break; + case 72: sType = "ELEMENTAL"; break; + case 73: sType = "INVIS"; break; + case 74: sType = "MELEE"; break; + case 75: sType = "MIND"; break; + case 76: sType = "SHIELD"; break; + case 77: sType = "SP_PROT"; break; + case 78: sType = "STEALTH"; break; + + case 81: DMFI_NextTarget(oTarget, oUser); nChoice = -1; break; + case 82: SetLocalString(oUser, "dmfi_buff_level", "LOW"); nChoice = -1; + FloatingTextStringOnCreature("Buff level LOW", oUser); + SetCustomToken(20782, "Low"); + SetDMFIPersistentString("dmfi", "dmfi_buff_level", "LOW", oUser); + break; + case 83: SetLocalString(oUser, "dmfi_buff_level", "MID"); nChoice = -1; + FloatingTextStringOnCreature("Buff level MID", oUser); + SetCustomToken(20782, "Mid"); + SetDMFIPersistentString("dmfi", "dmfi_buff_level", "MID", oUser); + break; + case 84: SetLocalString(oUser, "dmfi_buff_level", "HIGH"); nChoice = -1; + FloatingTextStringOnCreature("Buff level HIGH", oUser); + SetCustomToken(20782, "High"); + SetDMFIPersistentString("dmfi", "dmfi_buff_level", "HIGH", oUser); + break; + case 85: SetLocalString(oUser, "dmfi_buff_level", "EPIC"); nChoice = -1; + FloatingTextStringOnCreature("Buff level EPIC", oUser); + SetCustomToken(20782, "Epic"); + SetDMFIPersistentString("dmfi", "dmfi_buff_level", "EPIC", oUser); + break; + case 86: { + if (GetLocalInt(oUser, "dmfi_buff_party")==1) + { + SetLocalInt(oUser, "dmfi_buff_party", 0); + FloatingTextStringOnCreature("Buff set to single target", oUser); + SetCustomToken(20783, "Single Target"); + SetDMFIPersistentInt("dmfi","dmfi_buff_party", 0, oUser); + } + else + { + SetLocalInt(oUser, "dmfi_buff_party", 1); + FloatingTextStringOnCreature("Buff set to party mode", oUser); + SetCustomToken(20783, "Party"); + SetDMFIPersistentInt("dmfi","dmfi_buff_party", 1, oUser); + } + } + case 80: nChoice = -1; break; + default: nChoice = -1; break; + } + + + if (nChoice==-1) + return; + +//set caster level based on set level + string sLevel = GetLocalString(oUser, "dmfi_buff_level"); + + if (sLevel == "LOW") CL = 5; + else if (sLevel == "MID") CL = 10; + else if (sLevel == "HIGH") CL = 15; + else if (sLevel == "EPIC") CL = 20; + + if (nChoice == 0) //only get here if nChoice NOT set + { + string BUFF_TYPE = sType + "_" + sLevel; + + if (BUFF_TYPE == "BARD_DEF_LOW") + { + nSpell1 = SPELL_RESISTANCE; + nSpell2 = SPELL_MAGE_ARMOR; + nSpell3 = SPELL_GHOSTLY_VISAGE; + } + else if (BUFF_TYPE =="BARD_OFF_LOW") + { + nSpell1 = SPELL_BULLS_STRENGTH; + nSpell2 = SPELL_MAGE_ARMOR; + nSpell3 = SPELL_MAGIC_WEAPON; + } + else if (BUFF_TYPE == "BARD_DEF_MID") + { + nSpell1 = SPELL_IMPROVED_INVISIBILITY; + nSpell2 = SPELL_GHOSTLY_VISAGE; + nSpell3 = SPELL_CLARITY; + } + else if (BUFF_TYPE == "BARD_OFF_MID") + { + nSpell1 = SPELL_WAR_CRY; + nSpell2 = SPELL_SUMMON_CREATURE_V; + nSpell3 = SPELL_ETHEREAL_VISAGE; + } + else if (BUFF_TYPE == "BARD_DEF_HIGH") + { + nSpell1 = SPELL_ETHEREAL_VISAGE; + nSpell2 = SPELL_IMPROVED_INVISIBILITY; + nSpell3 = SPELL_HASTE; + } + else if (BUFF_TYPE == "BARD_OFF_HIGH") + { + nSpell1 = SPELL_ETHEREAL_VISAGE; + nSpell2 = SPELL_SUMMON_CREATURE_V; + nSpell3 = SPELL_WAR_CRY; + } + else if (BUFF_TYPE == "BARD_DEF_EPIC") + { + nSpell1 = SPELL_ETHEREAL_VISAGE; + nSpell2 = SPELL_ENERGY_BUFFER; + nSpell3 = SPELL_IMPROVED_INVISIBILITY; + } + else if (BUFF_TYPE == "BARD_OFF_EPIC") + { + nSpell1 = SPELL_ETHEREAL_VISAGE; + nSpell2 = SPELL_SUMMON_CREATURE_VI; + nSpell3 = SPELL_MASS_HASTE; + } + + else if (BUFF_TYPE == "MAGE_DEF_LOW") + { + nSpell1 = SPELL_CLARITY; + nSpell2 = SPELL_GHOSTLY_VISAGE; + nSpell3 = SPELL_PROTECTION_FROM_ELEMENTS; + } + else if (BUFF_TYPE == "MAGE_OFF_LOW") + { + nSpell1 = SPELL_GHOSTLY_VISAGE; + nSpell2 = SPELL_DEATH_ARMOR; + nSpell3 = SPELL_HASTE; + } + else if (BUFF_TYPE == "MAGE_DEF_MID") + { + nSpell1 = SPELL_LESSER_SPELL_MANTLE; + nSpell2 = SPELL_STONESKIN; + nSpell3 = SPELL_ELEMENTAL_SHIELD; + } + else if (BUFF_TYPE == "MAGE_OFF_MID") + { + nSpell1 = SPELL_SPELL_MANTLE; + nSpell2 = SPELL_IMPROVED_INVISIBILITY; + nSpell3 = SPELL_SUMMON_CREATURE_V; + } + else if (BUFF_TYPE == "MAGE_DEF_HIGH") + { + nSpell1 = SPELL_SPELL_MANTLE; + nSpell2 = SPELL_SANCTUARY; + nSpell3 = SPELL_MINOR_GLOBE_OF_INVULNERABILITY; + } + else if (BUFF_TYPE == "MAGE_OFF_HIGH") + { + nSpell1 = SPELL_ETHEREAL_VISAGE; + nSpell2 = SPELL_SUMMON_CREATURE_VIII; + nSpell3 = SPELL_SPELL_MANTLE; + } + else if (BUFF_TYPE == "MAGE_DEF_EPIC") + { + nSpell1 = SPELL_PREMONITION; + nSpell2 = SPELL_SPELL_MANTLE; + nSpell3 = SPELL_GLOBE_OF_INVULNERABILITY; + } + else if (BUFF_TYPE == "MAGE_OFF_EPIC") + { + nSpell1 = SPELL_PREMONITION; + nSpell2 = SPELL_MORDENKAINENS_SWORD; + nSpell3 = SPELL_GLOBE_OF_INVULNERABILITY; + } + else if (BUFF_TYPE == "CLERIC_DEF_LOW") + { + nSpell1 = SPELL_PROTECTION_FROM_ELEMENTS; + nSpell2 = SPELL_CLARITY; + nSpell3 = SPELL_DARKVISION; + } + else if (BUFF_TYPE == "CLERIC_OFF_LOW") + { + nSpell1 = SPELL_PRAYER; + nSpell2 = SPELL_MAGIC_VESTMENT; + nSpell3 = SPELL_BULLS_STRENGTH; + } + else if (BUFF_TYPE == "CLERIC_MID_DEF") + { + nSpell1 = SPELL_SANCTUARY; + nSpell2 = SPELL_SPELL_RESISTANCE; + nSpell3 = SPELL_TRUE_SEEING; + } + else if (BUFF_TYPE == "CLERIC_OFF_MID") + { + nSpell1 = SPELL_SUMMON_CREATURE_VI; + nSpell2 = SPELL_BATTLETIDE; + nSpell3 = SPELL_MONSTROUS_REGENERATION; + } + else if (BUFF_TYPE == "CLERIC_DEF_HIGH") + { + nSpell1 = SPELL_SANCTUARY; + nSpell2 = SPELL_REGENERATE; + nSpell3 = SPELL_MONSTROUS_REGENERATION; + } + else if (BUFF_TYPE == "CLERIC_OFF_HIGH") + { + nSpell1 = SPELL_SUMMON_CREATURE_VIII; + nSpell2 = SPELL_REGENERATE; + nSpell3 = SPELL_BATTLETIDE; + } + else if (BUFF_TYPE == "CLERIC_DEF_EPIC") + { + nSpell1 = SPELL_UNDEATHS_ETERNAL_FOE; + nSpell2 = SPELL_REGENERATE; + nSpell3 = SPELL_SANCTUARY; + } + else if (BUFF_TYPE == "CLERIC_OFF_EPIC") + { + nSpell1 = SPELL_SUMMON_CREATURE_IX; + nSpell2 = SPELL_REGENERATE; + nSpell3 = SPELL_BATTLETIDE; + } + else if (BUFF_TYPE == "DRUID_DEF_LOW") + { + nSpell1 = SPELL_PROTECTION_FROM_ELEMENTS; + nSpell2 = SPELL_BARKSKIN; + nSpell3 = SPELL_ONE_WITH_THE_LAND; + } + else if (BUFF_TYPE == "DRUID_OFF_LOW") + { + nSpell1 = SPELL_GREATER_MAGIC_FANG; + nSpell2 = SPELL_BULLS_STRENGTH; + nSpell3 = SPELL_BLOOD_FRENZY; + } + else if (BUFF_TYPE == "DRUID_DEF_MID") + { + nSpell1 = SPELL_SPELL_RESISTANCE; + nSpell2 = SPELL_MONSTROUS_REGENERATION; + nSpell3 = SPELL_STONESKIN; + } + else if (BUFF_TYPE == "DRUID_OFF_MID") + { + nSpell1 = SPELL_STONESKIN; + nSpell2 = SPELL_FREEDOM_OF_MOVEMENT; + nSpell3 = SPELL_MASS_CAMOFLAGE; + } + else if (BUFF_TYPE == "DRUID_DEF_HIGH") + { + nSpell1 = SPELL_PREMONITION; + nSpell2 = SPELL_TRUE_SEEING; + nSpell3 = SPELL_GREATER_STONESKIN; + } + else if (BUFF_TYPE == "DRUID_OFF_HIGH") + { + nSpell1 = SPELL_SUMMON_CREATURE_VIII; + nSpell2 = SPELL_AURA_OF_VITALITY; + nSpell3 = SPELL_ENERGY_BUFFER; + } + else if (BUFF_TYPE == "DRUID_DEF_EPIC") + { + nSpell1 = SPELL_ELEMENTAL_SWARM; + nSpell2 = SPELL_PREMONITION; + nSpell3 = SPELL_TRUE_SEEING; + } + else if (BUFF_TYPE == "DRUID_OFF_EPIC") + { + nSpell1 = SPELL_PREMONITION; + nSpell2 = SPELL_SHAPECHANGE; + nSpell3 = SPELL_AURA_OF_VITALITY; + } + else if (BUFF_TYPE == "AMROR_LOW") + { + nSpell1 = SPELL_MAGE_ARMOR; + nSpell2 = SPELL_INVISIBILITY_PURGE; + } + else if (BUFF_TYPE == "ARMOR_MID") + { + nSpell1 = SPELL_MAGE_ARMOR; + nSpell2 = SPELL_DARKVISION; + nSpell3 = SPELL_INVISIBILITY_PURGE; + } + else if (BUFF_TYPE == "ARMOR_HIGH") + { + nSpell1 = SPELL_MAGE_ARMOR; + nSpell2 = SPELL_STONESKIN; + nSpell3 = SPELL_GHOSTLY_VISAGE; + } + else if (BUFF_TYPE == "ARMOR_EPIC") + { + nSpell1 = SPELL_GHOSTLY_VISAGE; + nSpell2 = SPELL_MAGE_ARMOR; + nSpell3 = SPELL_PREMONITION; + } + else if (BUFF_TYPE == "ELEMENTAL_LOW") + { + nSpell1 = SPELL_RESISTANCE; + nSpell2 = SPELL_ENDURE_ELEMENTS; + nSpell3 = SPELL_ENDURANCE; + } + else if (BUFF_TYPE == "ELEMENTAL_MID") + { + nSpell1 = SPELL_RESISTANCE; + nSpell2 = SPELL_RESIST_ELEMENTS; + nSpell3 = SPELL_ENDURANCE; + } + else if (BUFF_TYPE == "ELEMENTAL_HIGH") + { + nSpell1 = SPELL_ENDURANCE; + nSpell2 = SPELL_STONESKIN; + nSpell3 = SPELL_PROTECTION_FROM_ELEMENTS; + } + else if (BUFF_TYPE == "ELEMENTAL_EPIC") + { + nSpell1 = SPELL_STONESKIN; + nSpell2 = SPELL_ENERGY_BUFFER; + nSpell3 = SPELL_ENDURANCE; + } + else if (BUFF_TYPE == "INVIS_LOW") + { + nSpell1 = SPELL_CATS_GRACE; + nSpell2 = SPELL_INVISIBILITY; + } + else if (BUFF_TYPE == "INVIS_MID") + { + nSpell1 = SPELL_CATS_GRACE; + nSpell2 = SPELL_MAGE_ARMOR; + nSpell3 = SPELL_INVISIBILITY_SPHERE; + } + else if (BUFF_TYPE == "INVIS_HIGH") + { + nSpell1 = SPELL_MAGE_ARMOR; + nSpell2 = SPELL_CATS_GRACE; + nSpell3 = SPELL_IMPROVED_INVISIBILITY; + } + else if (BUFF_TYPE == "INVIS_EPIC") + { + nSpell1 = SPELL_MAGE_ARMOR; + nSpell2 = SPELL_HASTE; + nSpell3 = SPELL_SANCTUARY; + } + else if (BUFF_TYPE == "MELEE_LOW") + { + nSpell1 = SPELL_MAGIC_WEAPON; + nSpell2 = SPELL_BULLS_STRENGTH; + nSpell3 = SPELL_STONE_BONES; + } + else if (BUFF_TYPE == "MELEE_MID") + { + nSpell1 = SPELL_BULLS_STRENGTH; + nSpell2 = SPELL_STONESKIN; + nSpell3 = SPELL_GREATER_MAGIC_WEAPON; + } + else if (BUFF_TYPE == "MELEE_HIGH") + { + nSpell1 = SPELL_ENDURANCE; + nSpell2 = SPELL_GREATER_STONESKIN; + nSpell3 = SPELL_KEEN_EDGE; + } + else if (BUFF_TYPE == "MELEE_EPIC") + { + nSpell1 = SPELL_TENSERS_TRANSFORMATION; + nSpell2 = SPELL_PREMONITION; + nSpell3 = SPELL_BULLS_STRENGTH; + } + else if (BUFF_TYPE == "MIND_LOW") + { + nSpell1 = SPELL_RESISTANCE; + nSpell2 = SPELL_CLARITY; + } + else if (BUFF_TYPE == "MIND_MID") + { + nSpell1 = SPELL_RESISTANCE; + nSpell2 = SPELL_OWLS_WISDOM; + nSpell3 = SPELL_LESSER_MIND_BLANK; + } + else if (BUFF_TYPE == "MIND_HIGH") + { + nSpell1 = SPELL_OWLS_WISDOM; + nSpell2 = SPELL_MAGE_ARMOR; + nSpell3 = SPELL_LESSER_MIND_BLANK; + } + else if (BUFF_TYPE == "MIND_EPIC") + { + nSpell1 = SPELL_OWLS_WISDOM; + nSpell2 = SPELL_LESSER_MIND_BLANK; + nSpell3 = SPELL_HASTE; + } + else if (BUFF_TYPE == "SHIELD_LOW") + { + nSpell1 = SPELL_SHIELD; + nSpell2 = SPELL_INVISIBILITY; + } + else if (BUFF_TYPE == "SHIELD_MID") + { + nSpell1 = SPELL_SHIELD; + nSpell2 = SPELL_PRAYER; + nSpell3 = SPELL_INVISIBILITY_SPHERE; + } + else if (BUFF_TYPE == "SHIELD_HIGH") + { + nSpell1 = SPELL_SHIELD; + nSpell2 = SPELL_GHOSTLY_VISAGE; + nSpell3 = SPELL_ELEMENTAL_SHIELD; + } + else if (BUFF_TYPE == "SHIELD_EPIC") + { + nSpell1 = SPELL_SHIELD; + nSpell2 = SPELL_SHADOW_SHIELD; + nSpell3 = SPELL_SPELL_MANTLE; + } + else if (BUFF_TYPE == "SP_PROT_LOW") + { + nSpell1 = SPELL_SHIELD; + nSpell2 = SPELL_RESISTANCE; + nSpell3 = SPELL_GHOSTLY_VISAGE; + } + else if (BUFF_TYPE == "SP_PROT_MID") + { + nSpell1 = SPELL_RESISTANCE; + nSpell2 = SPELL_SHIELD; + nSpell3 = SPELL_LESSER_SPELL_MANTLE; + } + else if (BUFF_TYPE == "SP_PROT_HIGH") + { + nSpell1 = SPELL_SHIELD; + nSpell2 = SPELL_ETHEREAL_VISAGE; + nSpell3 = SPELL_GLOBE_OF_INVULNERABILITY; + } + else if (BUFF_TYPE == "SP_PROT_EPIC") + { + nSpell1 = SPELL_PROTECTION_FROM_SPELLS; + nSpell2 = SPELL_GREATER_SPELL_MANTLE; + nSpell3 = SPELL_ETHEREAL_VISAGE; + } + else if (BUFF_TYPE == "STEALTH_LOW") + { + nSpell1 = SPELL_CATS_GRACE; + nSpell2 = SPELL_CLAIRAUDIENCE_AND_CLAIRVOYANCE; + } + else if (BUFF_TYPE == "STEALTH_MID") + { + nSpell1 = SPELL_CATS_GRACE; + nSpell2 = SPELL_CLAIRAUDIENCE_AND_CLAIRVOYANCE; + nSpell3 = SPELL_DISPLACEMENT; + } + else if (BUFF_TYPE == "STEALTH_HIGH") + { + nSpell1 = SPELL_CLAIRAUDIENCE_AND_CLAIRVOYANCE; + nSpell2 = SPELL_CATS_GRACE; + nSpell3 = SPELL_IMPROVED_INVISIBILITY; + } + else if (BUFF_TYPE == "STEALTH_EPIC") + { + nSpell1 = SPELL_CATS_GRACE; + nSpell2 = SPELL_ETHEREAL_VISAGE; + nSpell3 = SPELL_IMPROVED_INVISIBILITY; + } + } + else + { + nSpell1 = nChoice; //set up the single buffs if they were initialized by the choice + } + + string sParty = "target"; + if (Party==1) + { + sParty = "party"; + object oParty = GetFirstFactionMember(oTarget, FALSE); + while (GetIsObjectValid(oParty)) + { + AssignCommand(oTarget, ClearAllActions()); + if (nSpell1!=SPELL_ALL_SPELLS) + AssignCommand(oTarget, ActionCastSpellAtObject(nSpell1, oTarget, METAMAGIC_ANY, TRUE, CL, PROJECTILE_PATH_TYPE_DEFAULT, TRUE)); + if (nSpell2!=SPELL_ALL_SPELLS) + AssignCommand(oTarget, ActionCastSpellAtObject(nSpell2, oTarget, METAMAGIC_ANY, TRUE, CL, PROJECTILE_PATH_TYPE_DEFAULT, TRUE)); + if (nSpell3!=SPELL_ALL_SPELLS) + AssignCommand(oTarget, ActionCastSpellAtObject(nSpell3, oTarget, METAMAGIC_ANY, TRUE, CL, PROJECTILE_PATH_TYPE_DEFAULT, TRUE)); + oParty = GetNextFactionMember (oTarget); + } + } + else + { + AssignCommand(oTarget, ClearAllActions()); + if (nSpell1!=SPELL_ALL_SPELLS) + AssignCommand(oTarget, ActionCastSpellAtObject(nSpell1, oTarget, METAMAGIC_ANY, TRUE, CL, PROJECTILE_PATH_TYPE_DEFAULT, TRUE)); + if (nSpell2!=SPELL_ALL_SPELLS) + AssignCommand(oTarget, ActionCastSpellAtObject(nSpell2, oTarget, METAMAGIC_ANY, TRUE, CL, PROJECTILE_PATH_TYPE_DEFAULT, TRUE)); + if (nSpell3!=SPELL_ALL_SPELLS) + AssignCommand(oTarget, ActionCastSpellAtObject(nSpell3, oTarget, METAMAGIC_ANY, TRUE, CL, PROJECTILE_PATH_TYPE_DEFAULT, TRUE)); + } + SendMessageToPC(oUser, "Buffs Applied to " + sParty + ". Caster Level: " + IntToString(CL)); +} + +//////////////////////////////////////////////////////////////////////// +void ToggleRestVariable(int iCurrent, int iChange, int iDefault, string sTextMessage = "", object oUser = OBJECT_INVALID, string sArea = "") +{ + string sOnOff = "ON"; + if (iCurrent & iChange) //If the variable already exists + { + if (iDefault) + { + sOnOff = "ON"; + } + else + { + sOnOff = "OFF"; + } //Remove the variable + SetDMFIPersistentInt("dmfi", "dmfi_r_" + sArea, iCurrent & ~iChange); + if (sTextMessage != "") + FloatingTextStringOnCreature(sTextMessage + sOnOff, oUser, FALSE); + } + else //if the variable doesn't already exist + { + if (iDefault) + { + sOnOff = "OFF"; + } + else + { + sOnOff = "ON"; + } //Add the variable + SetDMFIPersistentInt("dmfi", "dmfi_r_" + sArea, iCurrent | iChange); + if (sTextMessage != "") + FloatingTextStringOnCreature(sTextMessage + sOnOff, oUser, FALSE); + } +} + +//////////////////////////////////////////////////////////////////////// +void DoRestFunction(int iRest, object oUser) +{ + int iCurrentMod = GetDMFIPersistentInt("dmfi", "dmfi_r_"); + object oTarget = GetLocalObject(oUser, "dmfi_univ_target"); + object oArea = GetArea(oUser); + object oLoop; + string sAreaTag = GetTag(oArea); + int iCurrentArea = GetDMFIPersistentInt("dmfi", "dmfi_r_" + sAreaTag); + + switch (iRest) + { + //Rest All PCs in the area for DMs, Rest for PCs + case 7: + if (GetIsDM(oUser)) + { + oLoop = GetFirstPC(); + while (GetIsObjectValid(oLoop)) + { + if (oArea == GetArea(oLoop)) + ForceRest(oLoop); + oLoop = GetNextPC(); + } + } + else + { + SetLocalInt(oUser, "dmfi_r_bypass", TRUE); AssignCommand(oUser, ActionRest()); + SetLocalInt(oUser, "dmfi_r_init", TRUE); + int iTime = GetTimeSecond() + GetTimeMinute() * 60 + GetTimeHour() * 3600 + GetCalendarDay() * 24 * 3600 + GetCalendarMonth() *3600 * 24 * 28 + GetCalendarYear() * 24 * 28 * 12 * 3600; + SetLocalInt(oUser, "dmfi_r_startseconds", iTime); + AssignCommand(oUser, ActionRest()); + } break; + case 8: + SetLocalString(oUser, "dmfi_univ_conv", "pc_emote"); + AssignCommand(oUser, ClearAllActions()); + AssignCommand(oUser, ActionStartConversation(OBJECT_SELF, "dmfi_universal", TRUE)); break; + case 9: + SetLocalString(oUser, "dmfi_univ_conv", "pc_dicebag"); + AssignCommand(oUser, ClearAllActions()); + AssignCommand(oUser, ActionStartConversation(OBJECT_SELF, "dmfi_universal", TRUE)); break; + case 11: //Set Unlimited Rest (module): default is ON + iCurrentMod = iCurrentMod & ~0x00000002; //Remove No Rest, if it exists + //Toggle the current Unlimited Rest Variable + ToggleRestVariable(iCurrentMod, 0x00000001, TRUE, "GLOBAL: Unlimited Rest is ", oUser); break; + case 12: //Set No Rest (module): default is OFF + iCurrentMod = iCurrentMod | 0x00000001; //Remove Unlimited Rest, if it exists + //Toggle the current No Rest Variable + ToggleRestVariable(iCurrentMod, 0x00000002, FALSE, "GLOBAL: No Rest is ", oUser); break; + case 13: //Limit Rest by Time: default is OFF + ToggleRestVariable(iCurrentMod, 0x00000004, FALSE, "GLOBAL: Limited Rest - Time is ", oUser); break; + case 14: //Limit Rest by Placeables: default is OFF + ToggleRestVariable(iCurrentMod, 0x00000008, FALSE, "GLOBAL: Limited Rest - Placeables is ", oUser); break; + case 15: //Limit Rest by Armor: default is OFF + ToggleRestVariable(iCurrentMod, 0x00000010, FALSE, "GLOBAL: Limited Rest - Armor is ", oUser); break; + case 16: //Limit Hit Points healed from resting: default is OFF + ToggleRestVariable(iCurrentMod, 0x00000020, FALSE, "GLOBAL: Limit Hit Points is ", oUser); break; + case 17: //Allow spell memorization: default is ON + ToggleRestVariable(iCurrentMod, 0x00000040, TRUE, "GLOBAL: Spell Memorization is ", oUser); break; + case 21: //Set Unlimited Rest (Local) + if (iCurrentArea & 0x00000080) + iCurrentMod = iCurrentArea; + iCurrentMod = iCurrentMod & ~0x00000002; //Remove No Rest, if it exists + iCurrentMod = iCurrentMod | 0x00000080; //Add Area Override bitflag + ToggleRestVariable(iCurrentMod, 0x00000001, TRUE, "LOCAL: Unlimited Rest is ", oUser, sAreaTag); + break; + case 22: //Set No Rest (module) + if (iCurrentArea & 0x00000080) + iCurrentMod = iCurrentArea; + iCurrentMod = iCurrentMod | 0x00000001; //Remove Unlimited Rest, if it exists + iCurrentMod = iCurrentMod | 0x00000080; //Add Area Override bitflag + ToggleRestVariable(iCurrentMod, 0x00000002, FALSE, "LOCAL: No Rest is ", oUser, sAreaTag); + break; + case 23: //Limit Rest by Time: default is OFF + if (iCurrentArea & 0x00000080) + iCurrentMod = iCurrentArea; + iCurrentMod = iCurrentMod | 0x00000080; //Add Area Override bitflag + ToggleRestVariable(iCurrentMod, 0x00000004, FALSE, "LOCAL: Limited Rest - Time is ", oUser, sAreaTag); + break; + case 24: //Limit Rest by Placeables: default is OFF + if (iCurrentArea & 0x00000080) + iCurrentMod = iCurrentArea; + iCurrentMod = iCurrentMod | 0x00000080; //Add Area Override bitflag + ToggleRestVariable(iCurrentMod, 0x00000008, FALSE, "LOCAL: Limited Rest - Placeables is ", oUser, sAreaTag); + break; + case 25: //Limit Rest by Armor: default is OFF + if (iCurrentArea & 0x00000080) + iCurrentMod = iCurrentArea; + iCurrentMod = iCurrentMod | 0x00000080; //Add Area Override bitflag + ToggleRestVariable(iCurrentMod, 0x00000010, FALSE, "LOCAL: Limited Rest - Armor is ", oUser, sAreaTag); + break; + case 26: //Limit Hit Points healed from resting: default is OFF + if (iCurrentArea & 0x00000080) + iCurrentMod = iCurrentArea; + iCurrentMod = iCurrentMod | 0x00000080; //Add Area Override bitflag + ToggleRestVariable(iCurrentMod, 0x00000020, FALSE, "LOCAL: Limit Hit Points is ", oUser, sAreaTag); + break; + case 27: //Allow spell memorization: default is ON + if (iCurrentArea & 0x00000080) + iCurrentMod = iCurrentArea; + iCurrentMod = iCurrentMod | 0x00000080; //Add Area Override bitflag + ToggleRestVariable(iCurrentMod, 0x00000040, FALSE, "LOCAL: Spell Restriction is ", oUser, sAreaTag); + break; + case 28: //Reset area to module defaults + FloatingTextStringOnCreature("Area set to module defaults", oUser, FALSE); + SetDMFIPersistentInt("dmfi", "dmfi_r_" + sAreaTag, 0x00000000); + break; + case 31: //Set Time Limit to 1 game hour per day + if (iCurrentArea & 0x00000080) + { + iCurrentArea = iCurrentArea & ~0x00000f00; //Erase current setting + FloatingTextStringOnCreature("LOCAL: Time Limit set to 1 game hour per rest", oUser, FALSE); + SetDMFIPersistentInt("dmfi", "dmfi_r_" + sAreaTag, iCurrentArea | 0x00000100); + } + else + { + iCurrentMod = iCurrentMod & ~0x00000f00; //Erase current setting + FloatingTextStringOnCreature("GLOBAL: Time Limit set to 1 game hour per rest", oUser, FALSE); + SetDMFIPersistentInt("dmfi", "dmfi_r_", iCurrentMod | 0x00000100); + } break; + case 32: //Set Time Limit to 2 game hours per day + if (iCurrentArea & 0x00000080) + { + iCurrentArea = iCurrentArea & ~0x00000f00; //Erase current setting + FloatingTextStringOnCreature("LOCAL: Time Limit set to 2 game hours per rest", oUser, FALSE); + SetDMFIPersistentInt("dmfi", "dmfi_r_" + sAreaTag, iCurrentArea | 0x00000200); + } + else + { + iCurrentMod = iCurrentMod & ~0x00000f00; //Erase current setting + FloatingTextStringOnCreature("GLOBAL: Time Limit set to 2 game hours per rest", oUser, FALSE); + SetDMFIPersistentInt("dmfi", "dmfi_r_", iCurrentMod | 0x00000200); + } break; + case 33: //Set Time Limit to 4 game hours per day + if (iCurrentArea & 0x00000080) + { + iCurrentArea = iCurrentArea & ~0x00000f00; //Erase current setting + FloatingTextStringOnCreature("LOCAL: Time Limit set to 4 game hours per rest", oUser, FALSE); + SetDMFIPersistentInt("dmfi", "dmfi_r_" + sAreaTag, iCurrentArea | 0x00000300); + } + else + { + iCurrentMod = iCurrentMod & ~0x00000f00; //Erase current setting + FloatingTextStringOnCreature("GLOBAL: Time Limit set to 4 game hours per rest", oUser, FALSE); + SetDMFIPersistentInt("dmfi", "dmfi_r_", iCurrentMod | 0x00000300); + } break; + case 34: //Set Time Limit to 6 game hours per day + if (iCurrentArea & 0x00000080) + { + iCurrentArea = iCurrentArea & ~0x00000f00; //Erase current setting + FloatingTextStringOnCreature("LOCAL: Time Limit set to 6 game hours per rest", oUser, FALSE); + SetDMFIPersistentInt("dmfi", "dmfi_r_" + sAreaTag, iCurrentArea | 0x00000400); + } + else + { + iCurrentMod = iCurrentMod & ~0x00000f00; //Erase current setting + FloatingTextStringOnCreature("GLOBAL: Time Limit set to 6 game hours per rest", oUser, FALSE); + SetDMFIPersistentInt("dmfi", "dmfi_r_", iCurrentMod | 0x00000400); + } break; + case 35: //Set Time Limit to 8 game hours per day + if (iCurrentArea & 0x00000080) + { + iCurrentArea = iCurrentArea & ~0x00000f00; //Erase current setting + FloatingTextStringOnCreature("LOCAL: Time Limit set to 8 game hours per rest", oUser, FALSE); + SetDMFIPersistentInt("dmfi", "dmfi_r_" + sAreaTag, iCurrentArea | 0x00000500); + } + else + { + iCurrentMod = iCurrentMod & ~0x00000f00; //Erase current setting + FloatingTextStringOnCreature("GLOBAL: Time Limit set to 8 game hours per rest", oUser, FALSE); + SetDMFIPersistentInt("dmfi", "dmfi_r_", iCurrentMod | 0x00000500); + } break; + case 36: //Set Time Limit to 12 game hours per day + if (iCurrentArea & 0x00000080) + { + iCurrentArea = iCurrentArea & ~0x00000f00; //Erase current setting + FloatingTextStringOnCreature("LOCAL: Time Limit set to 12 game hours per rest", oUser, FALSE); + SetDMFIPersistentInt("dmfi", "dmfi_r_" + sAreaTag, iCurrentArea | 0x00000600); + } + else + { + iCurrentMod = iCurrentMod & ~0x00000f00; //Erase current setting + FloatingTextStringOnCreature("GLOBAL: Time Limit set to 12 game hours per rest", oUser, FALSE); + SetDMFIPersistentInt("dmfi", "dmfi_r_", iCurrentMod | 0x00000600); + } break; + case 37: //Set Time Limit to 24 game hours per day + if (iCurrentArea & 0x00000080) + { + iCurrentArea = iCurrentArea & ~0x00000f00; //Erase current setting + FloatingTextStringOnCreature("LOCAL: Time Limit set to 24 game hours per rest", oUser, FALSE); + SetDMFIPersistentInt("dmfi", "dmfi_r_" + sAreaTag, iCurrentArea | 0x00000700); + } + else + { + iCurrentMod = iCurrentMod & ~0x00000f00; //Erase current setting + FloatingTextStringOnCreature("GLOBAL: Time Limit set to 24 game hours per rest", oUser, FALSE); + SetDMFIPersistentInt("dmfi", "dmfi_r_", iCurrentMod | 0x00000700); + } + case 41: //Toggle placeable flag: DMFI Placeables (tag = dmfi_rest), by default ON + if (iCurrentArea & 0x00000080) + ToggleRestVariable(iCurrentArea, 0x00001000, TRUE, "LOCAL: DMFI Placeables are ", oUser, sAreaTag); + else + ToggleRestVariable(iCurrentMod, 0x00001000, TRUE, "GLOBAL: DMFI Placeables are ", oUser); + break; + case 42: //Toggle placeable flag: Campfires + if (iCurrentArea & 0x00000080) + ToggleRestVariable(iCurrentArea, 0x00002000, FALSE, "LOCAL: Campfire Placeables are ", oUser, sAreaTag); + else + ToggleRestVariable(iCurrentMod, 0x00002000, FALSE, "GLOBAL: Campfire Placeables are ", oUser); + break; + case 43: //Toggle placeable flag: Bed Rolls + if (iCurrentArea & 0x00000080) + ToggleRestVariable(iCurrentArea, 0x00004000, FALSE, "LOCAL: Bed Roll Placeables are ", oUser, sAreaTag); + else + ToggleRestVariable(iCurrentMod, 0x00004000, FALSE, "GLOBAL: Bed Roll Placeables are ", oUser); + break; + case 44: //Toggle placeable flag: Beds + if (iCurrentArea & 0x00000080) + ToggleRestVariable(iCurrentArea, 0x00008000, FALSE, "LOCAL: Bed Placeables are ", oUser, sAreaTag); + else + ToggleRestVariable(iCurrentMod, 0x00008000, FALSE, "GLOBAL: Bed Placeables are ", oUser); + break; + case 45: //Toggle placeable flag: Tents + if (iCurrentArea & 0x00000080) + ToggleRestVariable(iCurrentArea, 0x00010000, FALSE, "LOCAL: Tent Placeables are ", oUser, sAreaTag); + else + ToggleRestVariable(iCurrentMod, 0x00010000, FALSE, "GLOBAL: Tent Placeables are ", oUser); + break; + case 46: //Toggle placeable flag: Ignore Druids + if (iCurrentArea & 0x00000080) + ToggleRestVariable(iCurrentArea, 0x00020000, FALSE, "LOCAL: Ignore Druids for Placeable Checks is ", oUser, sAreaTag); + else + ToggleRestVariable(iCurrentMod, 0x00020000, FALSE, "GLOBAL: Ignore Druids for Placeable Checks is ", oUser); + break; + case 47: //Toggle placeable flag: Ignore Rangers + if (iCurrentArea & 0x00000080) + ToggleRestVariable(iCurrentArea, 0x00040000, FALSE, "LOCAL: Ignore Rangers for Placeable Checks is ", oUser, sAreaTag); + else + ToggleRestVariable(iCurrentMod, 0x00040000, FALSE, "GLOBAL: Ignore Rangers for Placeable Checks is ", oUser); + break; + case 48: //Toggle placeable flag: Ignore Barbarians + if (iCurrentArea & 0x00000080) + ToggleRestVariable(iCurrentArea, 0x00080000, FALSE, "LOCAL: Ignore Barbarians for Placeable Checks is ", oUser, sAreaTag); + else + ToggleRestVariable(iCurrentMod, 0x00080000, FALSE, "GLOBAL: Ignore Barbarians for Placeable Checks is ", oUser); + break; + case 51: //Set Armor Weight Restrictions + if (iCurrentArea & 0x00000080) + { + iCurrentArea = iCurrentArea & ~0x00f00000; //Erase current setting + FloatingTextStringOnCreature("LOCAL: Armor Restriction set to 2 pounds", oUser, FALSE); + SetDMFIPersistentInt("dmfi", "dmfi_r_" + sAreaTag, iCurrentArea | 0x00100000); + } + else + { + iCurrentMod = iCurrentMod & ~0x00f00000; //Erase current setting + FloatingTextStringOnCreature("GLOBAL: Armor Restriction set to 2 pounds", oUser, FALSE); + SetDMFIPersistentInt("dmfi", "dmfi_r_", iCurrentMod | 0x00100000); + } break; + case 52: //Set Armor Weight Restrictions + if (iCurrentArea & 0x00000080) + { + iCurrentArea = iCurrentArea & ~0x00f00000; //Erase current setting + FloatingTextStringOnCreature("LOCAL: Armor Restriction set to 6 pounds", oUser, FALSE); + SetDMFIPersistentInt("dmfi", "dmfi_r_" + sAreaTag, iCurrentArea | 0x00200000); + } + else + { + iCurrentMod = iCurrentMod & ~0x00f00000; //Erase current setting + FloatingTextStringOnCreature("GLOBAL: Armor Restriction set to 6 pounds", oUser, FALSE); + SetDMFIPersistentInt("dmfi", "dmfi_r_", iCurrentMod | 0x00200000); + } break; + case 53: //Set Armor Weight Restrictions + if (iCurrentArea & 0x00000080) + { + iCurrentArea = iCurrentArea & ~0x00f00000; //Erase current setting + FloatingTextStringOnCreature("LOCAL: Armor Restriction set to 11 pounds", oUser, FALSE); + SetDMFIPersistentInt("dmfi", "dmfi_r_" + sAreaTag, iCurrentArea | 0x00300000); + } + else + { + iCurrentMod = iCurrentMod & ~0x00f00000; //Erase current setting + FloatingTextStringOnCreature("GLOBAL: Armor Restriction set to 11 pounds", oUser, FALSE); + SetDMFIPersistentInt("dmfi", "dmfi_r_", iCurrentMod | 0x00300000); + } break; + case 54: //Set Armor Weight Restrictions + if (iCurrentArea & 0x00000080) + { + iCurrentArea = iCurrentArea & ~0x00f00000; //Erase current setting + FloatingTextStringOnCreature("LOCAL: Armor Restriction set to 16 pounds", oUser, FALSE); + SetDMFIPersistentInt("dmfi", "dmfi_r_" + sAreaTag, iCurrentArea | 0x00400000); + } + else + { + iCurrentMod = iCurrentMod & ~0x00f00000; //Erase current setting + FloatingTextStringOnCreature("GLOBAL: Armor Restriction set to 16 pounds", oUser, FALSE); + SetDMFIPersistentInt("dmfi", "dmfi_r_", iCurrentMod | 0x00400000); + } break; + case 55: //Set Armor Weight Restrictions + if (iCurrentArea & 0x00000080) + { + iCurrentArea = iCurrentArea & ~0x00f00000; //Erase current setting + FloatingTextStringOnCreature("LOCAL: Armor Restriction set to 31 pounds", oUser, FALSE); + SetDMFIPersistentInt("dmfi", "dmfi_r_" + sAreaTag, iCurrentArea | 0x00500000); + } + else + { + iCurrentMod = iCurrentMod & ~0x00f00000; //Erase current setting + FloatingTextStringOnCreature("GLOBAL: Armor Restriction set to 31 pounds", oUser, FALSE); + SetDMFIPersistentInt("dmfi", "dmfi_r_", iCurrentMod | 0x00500000); + } break; + case 56: //Set Armor Weight Restrictions + if (iCurrentArea & 0x00000080) + { + iCurrentArea = iCurrentArea & ~0x00f00000; //Erase current setting + FloatingTextStringOnCreature("LOCAL: Armor Restriction set to 41 pounds", oUser, FALSE); + SetDMFIPersistentInt("dmfi", "dmfi_r_" + sAreaTag, iCurrentArea | 0x00600000); + } + else + { + iCurrentMod = iCurrentMod & ~0x00f00000; //Erase current setting + FloatingTextStringOnCreature("GLOBAL: Armor Restriction set to 41 pounds", oUser, FALSE); + SetDMFIPersistentInt("dmfi", "dmfi_r_", iCurrentMod | 0x00600000); + } break; + case 57: //Set Armor Weight Restrictions + if (iCurrentArea & 0x00000080) + { + iCurrentArea = iCurrentArea & ~0x00f00000; //Erase current setting + FloatingTextStringOnCreature("LOCAL: Armor Restriction set to 46 pounds", oUser, FALSE); + SetDMFIPersistentInt("dmfi", "dmfi_r_" + sAreaTag, iCurrentArea | 0x00700000); + } + else + { + iCurrentMod = iCurrentMod & ~0x00f00000; //Erase current setting + FloatingTextStringOnCreature("GLOBAL: Armor Restriction set to 46 pounds", oUser, FALSE); + SetDMFIPersistentInt("dmfi", "dmfi_r_", iCurrentMod | 0x00700000); + } break; + case 61: //Set Hit Point restrictions + if (iCurrentArea & 0x00000080) + { + iCurrentArea = iCurrentArea & ~0x0f000000; //Erase current setting + FloatingTextStringOnCreature("LOCAL: No hitpoints regained on rest", oUser, FALSE); + SetDMFIPersistentInt("dmfi", "dmfi_r_" + sAreaTag, iCurrentArea | 0x01000000); + } + else + { + iCurrentMod = iCurrentMod & ~0x0f000000; //Erase current setting + FloatingTextStringOnCreature("GLOBAL: No hitpoints regained on rest", oUser, FALSE); + SetDMFIPersistentInt("dmfi", "dmfi_r_", iCurrentMod | 0x01000000); + } break; + case 62: //Set Hit Point restrictions + if (iCurrentArea & 0x00000080) + { + iCurrentArea = iCurrentArea & ~0x0f000000; //Erase current setting + FloatingTextStringOnCreature("LOCAL: 1 hitpoint/level regained on rest", oUser, FALSE); + SetDMFIPersistentInt("dmfi", "dmfi_r_" + sAreaTag, iCurrentArea | 0x02000000); + } + else + { + iCurrentMod = iCurrentMod & ~0x0f000000; //Erase current setting + FloatingTextStringOnCreature("GLOBAL: 1 hitpoint/level regained on rest", oUser, FALSE); + SetDMFIPersistentInt("dmfi", "dmfi_r_", iCurrentMod | 0x02000000); + } break; + case 63: //Set Hit Point restrictions + if (iCurrentArea & 0x00000080) + { + iCurrentArea = iCurrentArea & ~0x0f000000; //Erase current setting + FloatingTextStringOnCreature("LOCAL: (CON) hitpoints regained on rest", oUser, FALSE); + SetDMFIPersistentInt("dmfi", "dmfi_r_" + sAreaTag, iCurrentArea | 0x03000000); + } + else + { + iCurrentMod = iCurrentMod & ~0x0f000000; //Erase current setting + FloatingTextStringOnCreature("GLOBAL: (CON) hitpoints regained on rest", oUser, FALSE); + SetDMFIPersistentInt("dmfi", "dmfi_r_", iCurrentMod | 0x03000000); + } break; + case 64: //Set Hit Point restrictions + if (iCurrentArea & 0x00000080) + { + iCurrentArea = iCurrentArea & ~0x0f000000; //Erase current setting + FloatingTextStringOnCreature("LOCAL: 10 percent of hitpoints regained on rest", oUser, FALSE); + SetDMFIPersistentInt("dmfi", "dmfi_r_" + sAreaTag, iCurrentArea | 0x04000000); + } + else + { + iCurrentMod = iCurrentMod & ~0x0f000000; //Erase current setting + FloatingTextStringOnCreature("GLOBAL: 10 percent of hitpoints regained on rest", oUser, FALSE); + SetDMFIPersistentInt("dmfi", "dmfi_r_", iCurrentMod | 0x04000000); + } break; + case 65: //Set Hit Point restrictions + if (iCurrentArea & 0x00000080) + { + iCurrentArea = iCurrentArea & ~0x0f000000; //Erase current setting + FloatingTextStringOnCreature("LOCAL: 25 percent of hitpoints regained on rest", oUser, FALSE); + SetDMFIPersistentInt("dmfi", "dmfi_r_" + sAreaTag, iCurrentArea | 0x05000000); + } + else + { + iCurrentMod = iCurrentMod & ~0x0f000000; //Erase current setting + FloatingTextStringOnCreature("GLOBAL: 25 percent of hitpoints regained on rest", oUser, FALSE); + SetDMFIPersistentInt("dmfi", "dmfi_r_", iCurrentMod | 0x05000000); + } break; + case 66: //Set Hit Point restrictions + if (iCurrentArea & 0x00000080) + { + iCurrentArea = iCurrentArea & ~0x0f000000; //Erase current setting + FloatingTextStringOnCreature("LOCAL: 50 percent of hitpoints regained on rest", oUser, FALSE); + SetDMFIPersistentInt("dmfi", "dmfi_r_" + sAreaTag, iCurrentArea | 0x06000000); + } + else + { + iCurrentMod = iCurrentMod & ~0x0f000000; //Erase current setting + FloatingTextStringOnCreature("GLOBAL: 50 percent of hitpoints regained on rest", oUser, FALSE); + SetDMFIPersistentInt("dmfi", "dmfi_r_", iCurrentMod | 0x06000000); + } break; + case 67: //Set Hit Point restrictions + if (iCurrentArea & 0x00000080) + { + iCurrentArea = iCurrentArea & ~0x0f000000; //Erase current setting + FloatingTextStringOnCreature("LOCAL: 100 percent of hitpoints regained on rest", oUser, FALSE); + SetDMFIPersistentInt("dmfi", "dmfi_r_" + sAreaTag, iCurrentArea); + } + else + { + iCurrentMod = iCurrentMod & ~0x0f000000; //Erase current setting + FloatingTextStringOnCreature("GLOBAL: 100 percent of hitpoints regained on rest", oUser, FALSE); + SetDMFIPersistentInt("dmfi", "dmfi_r_", iCurrentMod); + } break; + case 101: //Use Rest Conversation Toggle + if (GetIsDM(oUser)) + ToggleRestVariable(iCurrentMod, 0x10000000, TRUE, "GLOBAL: Rest Conversation is ", oUser); + else + { + SetLocalInt(oUser, "dmfi_r_alternate", ANIMATION_LOOPING_MEDITATE); SetLocalInt(oUser, "dmfi_r_bypass", TRUE); AssignCommand(oUser, ActionRest()); + } break; + case 102: //Use Rest VFX + if (GetIsDM(oUser)) + ToggleRestVariable(iCurrentMod, 0x20000000, TRUE, "GLOBAL: Rest VFX are ", oUser); + else + { + SetLocalInt(oUser, "dmfi_r_alternate", ANIMATION_LOOPING_DEAD_FRONT); SetLocalInt(oUser, "dmfi_r_bypass", TRUE); AssignCommand(oUser, ActionRest()); + } break; + case 103: //Floating Text Feedback + if (GetIsDM(oUser)) + ToggleRestVariable(iCurrentMod, 0x40000000, TRUE, "GLOBAL: Floating Text Feedback is ", oUser); + else + { + SetLocalInt(oUser, "dmfi_r_alternate", ANIMATION_LOOPING_DEAD_BACK); SetLocalInt(oUser, "dmfi_r_bypass", TRUE); AssignCommand(oUser, ActionRest()); + } break; + case 104: //Immobilized Resting + if (GetIsDM(oUser)) + ToggleRestVariable(iCurrentMod, 0x80000000, TRUE, "GLOBAL: Immobile resting is ", oUser); + else + { + SetLocalInt(oUser, "dmfi_r_alternate", ANIMATION_LOOPING_WORSHIP); SetLocalInt(oUser, "dmfi_r_bypass", TRUE); AssignCommand(oUser, ActionRest()); + } break; + case 108: //All PCs in Area are Rested + break; + case 109: //All PCs are Rested + oLoop = GetFirstPC(); + while (GetIsObjectValid(oLoop)) + { + ForceRest(oLoop); + oLoop = GetNextPC(); + } + break; + } +} + +//////////////////////////////////////////////////////////////////////// +void main() +{ + string sDMFI = GetLocalString(OBJECT_SELF, "dmfi_univ_conv"); + int iDMFI = GetLocalInt(OBJECT_SELF, "dmfi_univ_int"); + location lDMFI = GetLocalLocation(OBJECT_SELF, "dmfi_univ_location"); + if (sDMFI == "emote" || sDMFI == "pc_emote") + DoEmoteFunction(iDMFI, OBJECT_SELF); + else if (sDMFI == "fx") + CreateEffects(iDMFI, lDMFI, OBJECT_SELF); + else if (sDMFI == "encounter") + CreateEncounter(iDMFI, lDMFI, OBJECT_SELF); + else if (sDMFI == "music") + DoMusicFunction(iDMFI, OBJECT_SELF); + else if (sDMFI == "xp") + DoXPFunction(iDMFI, OBJECT_SELF); + else if (sDMFI == "server") + dmwand_DoDialogChoice(iDMFI); + else if (sDMFI == "afflict") + DoAfflictFunction(iDMFI, OBJECT_SELF); + else if (sDMFI == "voice") + DoVoiceFunction(iDMFI, OBJECT_SELF); + else if (sDMFI == "sound") + DoSoundFunction(iDMFI, OBJECT_SELF); + else if (sDMFI == "onering") + DoOneRingFunction(iDMFI, OBJECT_SELF); + else if (sDMFI == "dicebag") + DoDMDiceBagFunction(iDMFI, OBJECT_SELF); + else if (sDMFI == "pc_dicebag") + DoDiceBagFunction(iDMFI, OBJECT_SELF); + else if (sDMFI == "faction") + DoControlFunction(iDMFI, OBJECT_SELF); + else if (sDMFI == "dmw") + DoNewDMThingy(iDMFI, OBJECT_SELF); + else if (sDMFI == "buff") + DoBuff(iDMFI, OBJECT_SELF); + else if (sDMFI == "rest") + DoRestFunction(iDMFI, OBJECT_SELF); + + DeleteLocalInt(OBJECT_SELF,"Tens"); +} + diff --git a/gamma_age_v2/dmfi_exploder.uti b/gamma_age_v2/dmfi_exploder.uti new file mode 100644 index 0000000000000000000000000000000000000000..77f39d4d36c5b71967dca2bfc46a79c7b9475aef GIT binary patch literal 1163 zcmZ8g+invv5H-+pSqcSOZcq4u2ar%DKp-Azo1z9aZPcW#ctTEg(zWoemt98?g!;md z@Cke&aL%q%T1GmVi#=y%otcASS0BDyd+|mobrI+T4}tF&TD^2hsTJ6d7L-a6{{ej! z`VRz3-Qf>p8@K{orxRrn8ma05umq6*X0$=8UPl|0>OGJE%=ryaF1JeYoZQTzus(Uo zcP-jbO+Mqif3^?SW}I>ZnA_}yHJ2lx8qQnMC;x4r8x#1g?1AwWfLxSSpm_}Fy9`9R z2c1UyKJ+Vq_4ppk;2cU`Ium4H>V26gwP9-M2FY>U$c`TyXTM3hYjQ!PBlWnlWw5?z z&gpkkDT19?L7|~JZWH70W@f5msZV2@z7D4jj6v{DTB;^I2xk0gfP(Q--}!U**VFVI z#o5|S*_>82`0GNwP81+a@b&@AZ?6#>YCd#oNq> z+*r3Z_W9FidW6wR$zuv_Q!#op(|a!Mnc@hY1SeI(X+HM=@EhR+aO64q3&0}4)#OTY l6}f^OYpxtujYM26t`*0g^g1ANN49_&zZ5;vo{{-{ny=B@03!Pfg$h|_<5<-D_4~I23wYtN)i7BeI5EQ z1WMiK2eJuV18&lZvJ8z>^#oV}$bT!^pjB_94NCP1=m5<5z$D1kRw=HNn>iHL=N9ta zh&EJ{&p7ul_QBebvZ+6}ZzKL0xDx@@aNdnR`R@UPn835L2gV-&JPTzNXf6Z#Ap=n! zL8sAv4E+Y+8F?Rj;2cX)s@}a52%QiBsT_ts};t98=S=eC@(oPVKhndGySeu6_yX~aIUSW7hvhE2m^fyC977kwz1IkK+q>ao)^ zFE4c9g9zBuoZ{Gq3~j`=y1MW5+Rm5p8uy;ZwJSAx=yp1%r=5)xy=k)2JExy#G!A@b z%lDZJg|T@zaRrBM@gCte!h7W4aDbM8Wqb8u^KT!{yga literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_fx.uti b/gamma_age_v2/dmfi_fx.uti new file mode 100644 index 0000000000000000000000000000000000000000..cf173f4083db1f711be740b99dba855cdab74cd6 GIT binary patch literal 1154 zcmZ8gT~E|N6de^%D}Ezt;=?>*LP*q@_~3)UhOh>7!>;I)WVXHCPHa0(I}0u`{2_mW zKg|a{r=3OcCa3pf=AJtv_W9Zia@5uL90_RAIDmPvZq&bjOsV&n;-%EkzR`y(Ma(gPt2U7?lJ!#_FR^Ga@ zU8mnqr1UnmfDbSzd3EsNydyKt=Mnmc zCZEoIP@5ufvqIzyz9vndny$HjFL{Q58U6aFZ(jXptwHhJz&8a;DU?VXNm!C%)#ADh~WpJ|us zW7|wkuDMytV_UnDM?*x?RAS$3MA6wkE_1#xHs6R{@jQw? z)^=h`q@q9Uq-^wfrr&2$ma?vUuBvjGm~tZZdRy&dl8jx#@d~$x)e3LVPG`q20E+-8 pl3O`}oIG|jCyg(}Y2ZY0n%M2^a=sKNh?B#KSphg9oDA|4e*y2tx~~8L literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_getln_cbtpl.ncs b/gamma_age_v2/dmfi_getln_cbtpl.ncs new file mode 100644 index 0000000000000000000000000000000000000000..758f1fc4f8a8e074af5efb30b2c24648557ab066 GIT binary patch literal 74 zcmeZs4ps;=)H85mU|{f)0}>1z3Jk0a%pM@Z4MeyzFf;!D|NjpI3kxd)qaKg4JV+HA RkOPwSWRzwA%6?H`005G(47~sV literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_getln_cbtpl.nss b/gamma_age_v2/dmfi_getln_cbtpl.nss new file mode 100644 index 00000000..1f218c4d --- /dev/null +++ b/gamma_age_v2/dmfi_getln_cbtpl.nss @@ -0,0 +1,35 @@ +//:://///////////////////////////////////////////// +//:: DMFI - DMFI_get_line callback template +//:: dmfi_getln_cbtpl +//::////////////////////////////////////////////// +/* + A template (skeleton) function for DMFI_get_line callback processing. + + Use this template to create your script to be invoked when your scripted call + to DMFI_get_line receives input. +*/ +//::////////////////////////////////////////////// +//:: Created By: tsunami282 +//:: Created On: 2008.05.21 +//::////////////////////////////////////////////// + +void main() +{ + int nVolume = GetPCChatVolume(); + object oShouter = GetPCChatSpeaker(); + string sSaid = GetPCChatMessage(); + + // you may wish to define an "abort" input message, such as a line + // containing a single period: + if (sSaid != ".") + { + // put your code here to process the input line (in sSaid) + + } + + // after processing, you will likely want to "eat" the text line, so it is + // not spoken or available for further processing. If you want the line to + // appear, either comment out the following line, or set it to: + // SetPCChatMessage(sSaid); + SetPCChatMessage(""); +} diff --git a/gamma_age_v2/dmfi_getln_inc.nss b/gamma_age_v2/dmfi_getln_inc.nss new file mode 100644 index 00000000..d9793a0b --- /dev/null +++ b/gamma_age_v2/dmfi_getln_inc.nss @@ -0,0 +1,61 @@ + +// DMFI_get_line: generic input line processing +// +// You can use this when you want to retrieve a spoken line of text. +// +// Specify the PC you want to listen to, the channel you want to listen on +// (often the TALK channel), and the name of the script to run when a line +// of text is heard. +// +// See the file dmfi_getln_cbtbl for a sample template script for processing +// the heard line. + +#include "dmfi_plychat_inc" + +const string DMFI_GETLINE_HOOK_HANDLE_VARNAME = "dmfi_getline_hookhandle"; + +/** + * + * @author tsunami282 + * @since 1.09 + * + * @param oSpeaker PC we want to listen to. + * @param iChannel voice channel to listen on (use TALKVOLUME_ constants). + * @param sEventScriptName sEventScriptName = name of script to call upon completion + * of input (cannot be blank). + * @param oRequester object requesting the result: the sEventScriptName script + * will be invoked with this as the caller, and therefore it + * must be valid at time of player chat event. + * @return handle (positive int) of the chat event hook +*/ +int DMFI_get_line(object oSpeaker, int iChannel, string sEventScriptName, + object oRequester = OBJECT_SELF) +{ + int hdlHook = 0; + + if (GetIsObjectValid(oSpeaker) && GetIsObjectValid(oRequester) && sEventScriptName != "") + { +// SendMessageToPC(GetFirstPC(), "getline - apply hook"); + hdlHook = DMFI_ChatHookAdd(sEventScriptName, oRequester, (1 << iChannel), + FALSE, oSpeaker, TRUE); +// SendMessageToPC(GetFirstPC(), "getline - hook handle returned is " + IntToString(hdlHook)); + SetLocalInt(oRequester, DMFI_GETLINE_HOOK_HANDLE_VARNAME, hdlHook); + } + + return hdlHook; +} + +/** + * + * + * + * @param hdlHookIn handle of hook handler that we want to un-hook. + * @param oRequester object requesting the result of DMFI_get_line +*/ +void DMFI_cancel_get_line(int hdlHookIn = 0, object oRequester = OBJECT_SELF) +{ + int hdlHook = hdlHookIn; + if (hdlHook == 0) hdlHook = GetLocalInt(oRequester, DMFI_GETLINE_HOOK_HANDLE_VARNAME); + DMFI_ChatHookRemove(hdlHook); +} + diff --git a/gamma_age_v2/dmfi_init_inc.nss b/gamma_age_v2/dmfi_init_inc.nss new file mode 100644 index 00000000..bef1c87b --- /dev/null +++ b/gamma_age_v2/dmfi_init_inc.nss @@ -0,0 +1,217 @@ + +#include "dmfi_db_inc" + +const int DMFI_DEFAULT_EMOTES_MUTED = FALSE; + +int dmfiInitialize(object oUser) +{ +//*************************************INITIALIZATION CODE*************************************** +//***************************************RUNS ONE TIME *************************************** + +//voice stuff is module wide + + if (GetLocalInt(GetModule(), "dmfi_initialized") != 1) + { + SendMessageToPC(oUser,":: DMFI Wands & Widgets System ::"); + int iLoop = 20610; + string sText; + while (iLoop < 20680) + { + sText = GetDMFIPersistentString("dmfi", "hls" + IntToString(iLoop)); + SetCustomToken(iLoop, sText); + iLoop++; + } + SendMessageToAllDMs("DMFI voice custom tokens initialized."); + + SetLocalInt(GetModule(), "dmfi_initialized", 1); + } + + +//remainder of settings are user based + + if ((GetLocalInt(oUser, "dmfi_initialized")!=1) && (GetIsDM(oUser) || GetIsDMPossessed(oUser))) + { + //if you have campaign variables set - use those settings + if (GetDMFIPersistentInt("dmfi", "Settings", oUser)==1) + { + FloatingTextStringOnCreature("DMFI Settings Restored", oUser, FALSE); + // SendMessageToPC(oUser, "DMFI Settings Restored"); + + int n = GetDMFIPersistentInt("dmfi", "dmfi_alignshift", oUser); + SetCustomToken(20781, IntToString(n)); + SetLocalInt(oUser, "dmfi_alignshift", n); + SendMessageToPC(oUser, "Settings: Alignment shift: "+IntToString(n)); + + n = GetDMFIPersistentInt("dmfi", "dmfi_safe_factions", oUser); + SetLocalInt(oUser, "dmfi_safe_factions", n); + SendMessageToPC(oUser, "Settings: Factions (1 is DMFI Safe Faction): "+IntToString(n)); + + n = GetDMFIPersistentInt("dmfi", "dmfi_damagemodifier", oUser); + SetLocalInt(oUser, "dmfi_damagemodifier",n); + SendMessageToPC(oUser, "Settings: Damage Modifier: "+IntToString(n)); + + n = GetDMFIPersistentInt("dmfi","dmfi_buff_party",oUser); + SetLocalInt(oUser, "dmfi_buff_party", n); + if (n==1) + SetCustomToken(20783, "Party"); + else + SetCustomToken(20783, "Single Target"); + + SendMessageToPC(oUser, "Settings: Buff Party (1 is Party): "+IntToString(n)); + + string sLevel = GetDMFIPersistentString("dmfi", "dmfi_buff_level", oUser); + SetCustomToken(20782, sLevel); + SetLocalString(oUser, "dmfi_buff_level", sLevel); + SendMessageToPC(oUser, "Settings: Buff Level: "+ sLevel); + + n = GetDMFIPersistentInt("dmfi", "dmfi_dicebag", oUser); + SetLocalInt(oUser, "dmfi_dicebag", n); + + string sText; + if (n==0) + { + SetCustomToken(20681, "Private"); + sText = "Private"; + } + else if (n==1) + { + SetCustomToken(20681, "Global"); + sText = "Global"; + } + else if (n==2) + { + SetCustomToken(20681, "Local"); + sText = "Local"; + } + else if (n==3) + { + SetCustomToken(20681, "DM Only"); + sText = "DM Only"; + } + SendMessageToPC(oUser, "Settings: Dicebag Reporting: "+sText); + + n = GetDMFIPersistentInt("dmfi", "dmfi_dice_no_animate", oUser); + SetLocalInt(oUser, "dmfi_dice_no_animate", n); + SendMessageToPC(oUser, "Settings: Roll Animations (1 is OFF): "+IntToString(n)); + + float f = GetDMFIPersistentFloat("dmfi", "dmfi_reputation", oUser); + SetLocalFloat(oUser, "dmfi_reputation", f); + SendMessageToPC(oUser, "Settings: Reputation Adjustment: "+FloatToString(f)); + + f = GetDMFIPersistentFloat("dmfi", "dmfi_effectduration", oUser); + SetLocalFloat(oUser, "dmfi_effectduration", f); + SendMessageToPC(oUser, "Settings: Effect Duration: "+FloatToString(f)); + + f = GetDMFIPersistentFloat("dmfi", "dmfi_sound_delay", oUser); + SetLocalFloat(oUser, "dmfi_sound_delay", f); + SendMessageToPC(oUser, "Settings: Sound Delay: "+FloatToString(f)); + + f = GetDMFIPersistentFloat("dmfi", "dmfi_beamduration", oUser); + SetLocalFloat(oUser, "dmfi_beamduration", f); + SendMessageToPC(oUser, "Settings: Beam Duration: "+FloatToString(f)); + + f = GetDMFIPersistentFloat("dmfi", "dmfi_stunduration", oUser); + SetLocalFloat(oUser, "dmfi_stunduration", f); + SendMessageToPC(oUser, "Settings: Stun Duration: "+FloatToString(f)); + + f = GetDMFIPersistentFloat("dmfi", "dmfi_saveamount", oUser); + SetLocalFloat(oUser, "dmfi_saveamount", f); + SendMessageToPC(oUser, "Settings: Save Adjustment: "+FloatToString(f)); + + f = GetDMFIPersistentFloat("dmfi", "dmfi_effectdelay", oUser); + SetLocalFloat(oUser, "dmfi_effectdelay", f); + SendMessageToPC(oUser, "Settings: Effect Delay: "+FloatToString(f)); + + + } + else + { + FloatingTextStringOnCreature("DMFI Default Settings Initialized", oUser, FALSE); + // SendMessageToPC(oUser, "DMFI Default Settings Initialized"); + + //Setting FOUR campaign variables so 1st use will be slow. + //Recommend initializing your preferences with no players or + //while there is NO fighting. + // SetLocalInt(oUser, "dmfi_initialized", 1); + SetDMFIPersistentInt("dmfi", "Settings", 1, oUser); + + SetCustomToken(20781, "5"); + SetLocalInt(oUser, "dmfi_alignshift", 5); + SetDMFIPersistentInt("dmfi", "dmfi_alignshift", 5, oUser); + SendMessageToPC(oUser, "Settings: Alignment shift: 5"); + + SetCustomToken(20783, "Single Target"); + SetLocalInt(oUser, "dmfi_buff_party", 0); + SetDMFIPersistentInt("dmfi", "dmfi_buff_party", 0, oUser); + SendMessageToPC(oUser, "Settings: Buff set to Single Target: "); + + SetCustomToken(20782, "Low"); + SetLocalString(oUser, "dmfi_buff_level", "LOW"); + SetDMFIPersistentString("dmfi", "dmfi_buff_level", "LOW", oUser); + SendMessageToPC(oUser, "Settings: Buff Level set to LOW: "); + + SetLocalInt(oUser, "dmfi_dicebag", 0); + SetCustomToken(20681, "Private"); + SetDMFIPersistentInt("dmfi", "dmfi_dicebag", 0, oUser); + SendMessageToPC(oUser, "Settings: Dicebag Rolls set to PRIVATE"); + + SetLocalInt(oUser, "", 0); + SetDMFIPersistentInt("dmfi", "dmfi_safe_factions", 0, oUser); + SendMessageToPC(oUser, "Settings: Factions set to BW base behavior"); + + SetLocalFloat(oUser, "dmfi_reputation", 5.0); + SetCustomToken(20784, "5"); + SetDMFIPersistentFloat("dmfi", "dmfi_reputation", 5.0, oUser); + SendMessageToPC(oUser, "Settings: Reputation adjustment: 5"); + + SetDMFIPersistentFloat("dmfi", "dmfi_effectduration", 60.0, oUser); + SetLocalFloat(oUser, "dmfi_effectduration", 60.0); + SetDMFIPersistentFloat("dmfi", "dmfi_sound_delay", 0.2, oUser); + SetLocalFloat(oUser, "dmfi_sound_delay", 0.2); + SetDMFIPersistentFloat("dmfi", "dmfi_beamduration", 5.0, oUser); + SetLocalFloat(oUser, "dmfi_beamduration", 5.0); + SetDMFIPersistentFloat("dmfi", "dmfi_stunduration", 1000.0, oUser); + SetLocalFloat(oUser, "dmfi_stunduration", 1000.0); + SetDMFIPersistentFloat("dmfi", "dmfi_saveamount", 5.0, oUser); + SetLocalFloat(oUser, "dmfi_saveamount", 5.0); + SetDMFIPersistentFloat("dmfi", "dmfi_effectdelay", 1.0, oUser); + SetLocalFloat(oUser, "dmfi_effectdelay", 1.0); + + SendMessageToPC(oUser, "Settings: Effect Duration: 60.0"); + SendMessageToPC(oUser, "Settings: Effect Delay: 1.0"); + SendMessageToPC(oUser, "Settings: Beam Duration: 5.0"); + SendMessageToPC(oUser, "Settings: Stun Duration: 1000.0"); + SendMessageToPC(oUser, "Settings: Sound Delay: 0.2"); + SendMessageToPC(oUser, "Settings: Save Adjustment: 5.0"); + } + } +//********************************END INITIALIZATION*************************** + + // inits for all users (DM & player) + if (GetLocalInt(oUser, "dmfi_initialized")!=1) + { + int bEmotesMuted; + if (GetDMFIPersistentInt("dmfi", "Settings", oUser)==1) + { + bEmotesMuted = GetDMFIPersistentInt("dmfi", "dmfi_emotemute", oUser); + } + else + { + bEmotesMuted = DMFI_DEFAULT_EMOTES_MUTED; + SetDMFIPersistentInt("dmfi", "dmfi_emotemute", bEmotesMuted, oUser); + } + SetLocalInt(oUser, "hls_emotemute", bEmotesMuted); + SendMessageToPC(oUser, "Settings: Emotes "+(bEmotesMuted ? "muted" : "unmuted")); + + SetLocalObject(oUser, "dmfi_VoiceTarget", OBJECT_INVALID); + SendMessageToPC(oUser, "Settings: Voice throw target cleared"); + + SetLocalObject(oUser, "dmfi_univ_target", oUser); + SendMessageToPC(oUser, "Settings: Command target set to self"); + + SetLocalInt(oUser, "dmfi_initialized", 1); + } + + return TRUE; // no errors detected +} + diff --git a/gamma_age_v2/dmfi_jail_widget.uti b/gamma_age_v2/dmfi_jail_widget.uti new file mode 100644 index 0000000000000000000000000000000000000000..364d39f83a94a9ef7a3f554968b70bf29f62a931 GIT binary patch literal 1346 zcmah}OK;RL5H`^ASl&?HFCW`WC5k{CX}45O)uO7qEf=Jfn|L=aNgTzF&~m8wRs0if zTsiS0;QJD1+j3!~Z#^@f`DX0Rcz+nlgICKdZ-o#SfKPw~ex4KJ5!MXOE$H9pg!l&g z&AbrTu>OHy5qJ0l*#s^%nh;6QuLhe7(gbM4LxB0`f!jf6-Pb`!84&?JfH^Bnf?RAD z!F|^G%_PWWfFb0&5_Bw0KK+b8-3Mz2N^u=}CpVzaQD}&qJXXiq_4hwcq=*Lq?~pz5jyJ$L)OndHulKau z(_o*2}Jep+_b!H0f_>M-j(v=3BPcQ&Y19=KVdwND~&{vy_^WvNxw z?q}M29j&+RfIrW1d%?oDl;mSGI#MPZeKE;IdxBq;gOC# zSbQ3CCvw)ev{mDrIYx;dt2#rxnwA!XAZ;R=WAtn1Z7$yzv8@Xa{yjax$F;QF>m48W z)~0e(rG>LrE~ZpQE;Yrw)cPF9Uyg0Q#KWJ|YEK4NBfKvr}30um?LBme*a literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_music.uti b/gamma_age_v2/dmfi_music.uti new file mode 100644 index 0000000000000000000000000000000000000000..8b0fee636b76f247e33a6435e4abdb9528aa6d15 GIT binary patch literal 1153 zcmZ8g+iuf95H-*O4dvc)d14>oB~pu!c%-yKL~7Hh3GE}=*pp<{wKrO?6&a!a3!lK( z@d)SG>s}b?crH70_TrgulYu&Y-{1Y1B*|@H1iS`*-fH#cog~?Sy}gzs8R9kcedxas zsN@+xkgvc!-~pW|>(D4oUICi``MFLTv`IhOpiDjkJ%BZT0LtA~C0r*rYbe~GyyV-6 zHdIs3IPQ^9L$aaH1(5?OQ*V~RxT0C7 zKggsAW@ZE%P4v7ijNko*_H!vOWBaZQmkx|^a8_EXCOi&0Js)Gkm^8BPM*d!w-JrO> zH%s;_U-BHC9Jx&FNc*tUMn>K(#Rnthq2WoQU&reu<7yh}Ww$%{aNdcY+Ac!>RNJca zL9O%1%^h0*Dg*Z~QrTNBMf-N$N(eGIXpaN_Jjd%r5C101XXblel_q_IAX~g^6}HI1 z(U*Zb;;K5+MaC|h&%zddJ?(O@SyH#LNpdt<_=W z&&8{^xp?c+^PSyKwO%;aPhI|wEqQfwIF0b;Y;-pK8n6y~7 XY<4y|pNIp*!QsGc0UQtx2KkA9Fp#;! literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_mute.uti b/gamma_age_v2/dmfi_mute.uti new file mode 100644 index 0000000000000000000000000000000000000000..c85ac83db092c23f3dc82d4acdbcac5727356dc2 GIT binary patch literal 1304 zcmah|+invv5H-+pSuW*L?gjkVzElE);E^;DYM_^>3FW0y(5>ZA4AZ9#~y zh_5UHSbxK?h@1R@Z2}i6Plz=7mt)KYWdbzf9>DsuKoWiSeHneU5$^!*v1W-yu=DjI zxX(VnSOmKW@Cf-XMITF5&pgkcoP)h1rML>ev1@Ry14|Lilao2t)4u^U#_#5g%-;ey zD{UF5E(YsuCZgTJ%6n-z*{9*$jRTRBpVe?S^Zkz#CE_md0^m%%;}viYbUw8z=soTC z^jL@u<#jjc9NU#`xskHwi%xe`u94|zKPt^M7*|yLjJv5Wf*Bi);Rk9`7slUqrpk%- z$GNui;W&WP56wT+3(A`cw4*2sNw-+P4&om#K!+aL>8gf)n^Af4F&i0$G+{UJCSu1yXZ7)BVbfN>F z;K{?}`|(fiJK{lRy!>31NH+0Ofhc6UCNo9lPw-#EQ9;hUmZ=`AnGJH}ich-qivPW= zUx8mwlB1(!V=gyUR(R*+YDVYKXQp_axsWSk*GDd2OOoBvOiZDy#9yYQDpHBJVM*04xI3J~dCRvxsk;nxvMg5o(uu ldJH@Pcwy8k^+ath1JoilNS#n0yzvLXLtq7X1h8+@{}0s-#$Nyc literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_naming.uti b/gamma_age_v2/dmfi_naming.uti new file mode 100644 index 0000000000000000000000000000000000000000..0ac9ac57fa1a9e10a5988016cf3419151008944d GIT binary patch literal 1148 zcmZ`&+iuf95M7|<5(*S3x3~R(D1uZ-eN7V~EVU?VLU}|Rdy-n%UTeJ;GD7_iK7r5U z3*a1kO;aRBI-Z@`oinrRnUBjzpC69KM@p%iz#Mo5e817@y<1A{V7u z0;Qht19=bJ0q)ZXvI~t+^%B?v$WKjxR=o~uP^uX)02uQNpxo}1;y$?V!Z+$1wgf&`@tsvV;~9vyen&<|0zH&$^pxCzO>O1>8dxm6&7`Ah-3xExFAF3Lhvu2Rc7Bp1*C@7g zGh|x3igomIY7@!k#`!m$XYOn%&ZknHq^u;^O}L&~)GObVeRlAn-lbV(y@&R>$?Dz) zwaEiFGj#UV3EaPkWm1-6T(_Tz_Y%#za=@SGc)ehuXOeuKelAR&78?yOd%W)z_QdS; zU8GSgw?CO8p>O*PO!f00-w)W6EVExL-Pl@tt7BBP5$!KTBb8_n>E!CqYP;4($4-o| zoeXtitsCkTZ86l=X*5hMe3Ox$WR=zCf82?rzUjyi(})`l2A7wE<3{_c<{igJV-CsI zonf`YJF~~x>pQ?Mz**!Ba`rfL>|=&=wm1izCC(B1oc+zW;p}i`I4cJLXM;0Ae&P>r CE4SMK literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_onclienter.ncs b/gamma_age_v2/dmfi_onclienter.ncs new file mode 100644 index 0000000000000000000000000000000000000000..1b9df64084b1a0486f3b621de9a246e2c03ef4d7 GIT binary patch literal 6085 zcmb_g&2QXP5ck^NByE#6P1A!ZxT<(x%-ikr2|#$$ArmcO9+0 zTiOFcAb~0_T;R-s8)yCmBoJ_@IB-OjI8*{bg?h-LQkgg7=l7o1-YP9Ubo1<)-~8Up zcxK+a@>YedOifJA8^+l8#|`*5z>K0{95(DezOswP@CO&Gji6Sox%H~sjNBHy9xzSI zDm;Gtc-yd1YxIZ#t4H)dL$z9??p3{}7kQ5F-F9oB_AiINXxbJa7Y5l0{xb$9PL@in zytHtctvbzG$j-4+6gsHC{IOXS4>{iQ5Bm_$2+Sf4zxv7iVO=TNphJzcy#aSs&ag#Css#DEi2-@%JHDDI7J0kuw%-@F58vw{^`WOmhGh)FaFUeLuLaU<8prSl;oAe{z4l?NEt84KPY5hO}% zj$3I!t}--LVuEm-1GuF4c0?k>5if(EArgHhE)iiFn;JJa-gfi4%fLvTg6FiH~V-_9bAHkV%o-0EYNO9j~ zH=Gs}7|b-1fp@26eCB~ELzp;1`1g~dLIsI3Nuln$9oJWPJiM)PzXtU|)EPC^(OamC z(p17`d8!{u5nbd4WHd%kOFu!ij6Xy8R6uo*k_GD3nzNyC`WB-AGvF#^>HR)fE9&h{0w-t?z9=SaW}u1$rIQj*bubV=CSz76??bWN3R=A6 zc7+aOEkg%OKp0IzS8WDWr|C7gdzBA;?|rlifmT9D*_f$|p}a3E=s8L8df@wP4o&bH z7=Hv;7Z$`PK!uk#RGAQ*F!fF%OrJo@-D*b;FQppSPf$jZ@nzd3m zFQE-qj*UDeUm6_3pxxxdnD1y+bm&4Z*)F{_(=qAa3P)#Uj{cM^_hXu_xlSX?r-Ps8 z((G1D^E@nh&IA6l`jZTX5$rf4`g`s@fvKw4gJ}iupOqFN!iP{-V+uy8DYG0dF+@hhY%FZiPmu#ht`4 zw(QoOwjVKJj9pewFEG)fMly0h3CSFqcl`}-3e((3JjSBEB0Qyt$SD{Bp+v)AI-{d! zNrPB2)$O_itD}Nx#>_h{wg+6`$kc1}L2rNrv6E9;K0D4hEe($nb_0LH>a1jk^Hk_Y za5`ez1SVUbplK}zH_>%876Fd6cy(2`C#NFv-K_LouDC{zmrkXtAU&L-SWFU3rl|=p zX(N>8A^^=8dr(9q4R@RdpwjC94pvGRP6h?&#-U)geEssu+>J|mbOpC$gz8QxZutqv zn|?mmyey-ZoKj+^%&)RFCv@4GyXkbiprv!L-~1Zy3n(vA-JIft-8}v>CUGWAoRg=m z`ls(7Se=smV1SB83+5=pfS&o%!u%HU%j(^ll{>cGLlp7Eb|m=gi$DJYC|$i)Lq2cY zd2%_hu}`~uql#Pn%@*$K7R&)I-$rNj?t#S*Z97*m2UyF3?3Pu0A>m8OBE@n*-}ngG zcJ&F>3-(>x&Xdz%LFt4{BGFHh+3c0ciAj`))*yJ^&hx8OUo)nIW?tBcMB^- zQiHxpArIX;Gx#$Fr};kp8D_uBd?#yq8u33xbM6g^viCn$F$7nG)r0`P zpfdwrCheELyTnO`$rTdbwH*XQMNYhi?DoU5zum+K@qq&i1n;~27L{K`l6zP9O(ESq zC?-q%kaI?wL@5?+wt|~1!ix&F?z;}$tD%y>#s$qUgx+p?ohm8xKz}P}G~k+5AcxeI zL)Wis=oGz#c{(wKv*@Tv!WbN2N6*kTee^d=8k4Xge&MEYHR;|60EaVF+D3pu0>J+t k_Jq0d|G-ps3Im=H-cJ9*=C06Y9>mmp3t!ub@KPfDAD>=rYybcN literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_onclienter.nss b/gamma_age_v2/dmfi_onclienter.nss new file mode 100644 index 00000000..c1c0de45 --- /dev/null +++ b/gamma_age_v2/dmfi_onclienter.nss @@ -0,0 +1,23 @@ +//:://///////////////////////////////////////////// +//:: DMFI - OnClientEnter event handler +//:: dmfi_onclienter +//::////////////////////////////////////////////// +/* + Event handler for the module-level OnClientEnter event. Initializes DMFI system. +*/ +//::////////////////////////////////////////////// +//:: 2008.08.02 tsunami282 - created. + +#include "dmfi_init_inc" + +//////////////////////////////////////////////////////////////////////// +void main() +{ + object oUser = GetEnteringObject(); + + // do any other module OnClientEnter work here + ExecuteScript("x3_mod_def_enter", OBJECT_SELF); + + // initialize DMFI + dmfiInitialize(oUser); +} diff --git a/gamma_age_v2/dmfi_onering.uti b/gamma_age_v2/dmfi_onering.uti new file mode 100644 index 0000000000000000000000000000000000000000..2db20b1b22685fe157cfddfbb2582c53167fb42d GIT binary patch literal 1168 zcmcIj%Z}4P5F8-OBP{O#i^RbPuDjCmkhq5I0ZR)+iHXDsP2!F{ieDO!4;%3Td;`DA z0jlirZo-|G$~|2@Q$1sKe~rRm@#f_9d!^KMU<$kdeq8JP;SHsZuzodADhB@({xd4u4Ow;U*N{}dfFZy$10I6i?3`kr+RV{dpIfMR z$FJeq^W?dI_a3b6CENN4Tf2`h`3D{(srk^yTt5Orf0%FOy~#fT_!im-XnzL$Qxe{u z!N-369R3}^Hy!~aXhxD(nRYUhdM0b7KImFPCpprsotG<}nXSa1buM7eq+VH5Ia3yG zo^cpU;mq0y3Pn2U4*KsT)i#m(lADyZy9}_HyE2nbs-@>nuQqcO^qZzxxwn5D$9odH zwRvRH*qZm~?Nb>`Hr3XhcFfe4l~`w_J~zCHk1zc5)Vx``i>j{*3cXE&xUoy^n(X&xsCzCkdCOffF132oZ3~7vNrPo$w@rR* z>eK`qYx0W8lVCVRbL?Ga@!yK^nY+IMVQc&i?0feA05||RpPWn1Bj=F4&AFonXM^*_ Z*<$ar=Q&rLC(aS)X9RFwI49I6{sMi}!=(TK literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_onmodhb.ncs b/gamma_age_v2/dmfi_onmodhb.ncs new file mode 100644 index 0000000000000000000000000000000000000000..f36cedd5d0c656491053a6c177bf43414159e5e2 GIT binary patch literal 320 zcmeZs4ps;=)H85mU|@8RV*mmU1qLQ&7FGt9l-#sTu*i3LkoaX*28K@zKnW=qUpLQq zUw@ZSAJ=#fSI3|bCs)Ui_z+KLZ)V2-|Ns90DPk~Y0(1T_u&^)#b+d^npz!5*6~LzI zq1dz@td@ZhWXu-^7HI|`{YMsLyNoUa%y1QEkSs(FCPsv_-hiED&J5Q0g@p}dDo`75 hg>igteoA~wYFd0o642osObQG*oxujNR)GOV0|2dTU4Z}q literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_onmodhb.nss b/gamma_age_v2/dmfi_onmodhb.nss new file mode 100644 index 00000000..af17502a --- /dev/null +++ b/gamma_age_v2/dmfi_onmodhb.nss @@ -0,0 +1,29 @@ + +#include "dmfi_db_inc" + +const int FLUSH_INTERVAL = 30; // seconds between database flushes to disk + +void main() +{ + // see if database is "dirty" (changed since last flush) + if (IsDMFIPersistentDataDirty("dmfi")) + { + // it is, so check if time to flush database + object oMod = GetModule(); + int iTick = GetLocalInt(oMod, "DMFI_MODULE_HEARTBEAT_TICK"); + int iSecsSinceFlush = iTick * 6; + if (iSecsSinceFlush >= FLUSH_INTERVAL) + { + FlushDMFIPersistentData("dmfi"); + iTick = 0; + } + else + { + iTick++; + } + SetLocalInt(oMod, "DMFI_MODULE_HEARTBEAT_TICK", iTick); + } + + // do any other module OnHeartbeat work here + ExecuteScript("x3_mod_def_hb", OBJECT_SELF); +} diff --git a/gamma_age_v2/dmfi_onplychat.ncs b/gamma_age_v2/dmfi_onplychat.ncs new file mode 100644 index 0000000000000000000000000000000000000000..da2c4c69b85231b85424d2676f4de37ecb2d5dd2 GIT binary patch literal 3517 zcmb_fy-yTT5P$n|7sL}GK_n`;3YA91_(8Bc;qXq5J92jr3**HgMxrJb#-Npjh1Oab zJLBJAVeE{B6$OO_g#|H~P!L5t`C8}A>~QZbd%J5C!tUMMncr`|XDJMpor%*Y`z{Kx z=Y6+;pC(5f6Zon5xNt;5SXp@)7N%t;;4f)fwj~8kD5)uHgPz83bHc`ZP1w7S$_R-APzZflDi4-&V-=0>5+Z^&VQJ?2v`gcV2F+UI9cnMIHX<*2wgV=VOOvUEw^NTm zdc0CBWk!n=R61UAjShqbAjLs=hJh$3fq*lTpnNoTTq#fHc!knXtUZ=2Pr~Vf65X6+ z911*FzbtC=m&ccsIRXD#Z`{2(UA=eb;pDCB_p4JgQ|K}Z%{c;rAcr7mS4Y!V+I#Q> zdVy5i5dGVu z!>cqF^D-?S@5Sa9y{zQF?wh1vICKNk7h3UYSQVp3~$~2QZ(P(#KSvftFE+^eVo}(5nVuh4u_|Y`4_i z?)sh5O6_~nYu}M65L>BXmj0kfhgBlWzfj~u%ZU}}m4nO)sR|Z9tKf%cmNiV&fXL#M zoA;*Ng7U7hNO`F5EYtvf^<9HktG;grLN~DM*0!QIFx2Z2X7p;F$>1(Cy!tkJ0|QDY l`GHqu12cBCHy5J3>5Jn{js9JM_yv3O^IIHmYL|6y{s8RA8lC_E literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_onplychat.nss b/gamma_age_v2/dmfi_onplychat.nss new file mode 100644 index 00000000..e91d7e93 --- /dev/null +++ b/gamma_age_v2/dmfi_onplychat.nss @@ -0,0 +1,79 @@ +//:://///////////////////////////////////////////// +//:: DMFI - OnPlayerChat event handler +//:: dmfi_onplychat +//::////////////////////////////////////////////// +/* + Event handler for the module-level OnPlayerChat event. Manages scripter-added + event scripts. +*/ +//::////////////////////////////////////////////// +//:: Created By: Merle, with help from mykael22000 and tsunami282 +//:: Created On: 2007.12.12 +//::////////////////////////////////////////////// +//:: 2007.12.27 tsunami282 - implemented hooking tree + +#include "dmfi_plychat_inc" + +const string DMFI_PLAYERCHAT_SCRIPTNAME = "dmfi_plychat_exe"; + +//////////////////////////////////////////////////////////////////////// +void main() +{ + int nVolume = GetPCChatVolume(); + object oShouter = GetPCChatSpeaker(); + + int bInvoke; + string sChatHandlerScript; + int maskChannels; + // int bListenAll; + object oRunner; + int bAutoRemove; + int bDirtyList = FALSE; + int iHook; + object oMod = GetModule(); +// SendMessageToPC(GetFirstPC(), "OnPlayerChat - process hooks"); + int nHooks = GetLocalArrayUpperBound(oMod, DMFI_CHATHOOK_HANDLE_ARRAYNAME); + for (iHook = nHooks; iHook > 0; iHook--) // reverse-order execution, last hook gets first dibs + { +// SendMessageToPC(GetFirstPC(), "OnPlayerChat -- process hook #" + IntToString(iHook)); + maskChannels = GetLocalArrayInt(oMod, DMFI_CHATHOOK_CHANNELS_ARRAYNAME, iHook); +// SendMessageToPC(GetFirstPC(), "OnPlayerChat -- channel heard=" + IntToString(nVolume) + ", soughtmask=" + IntToString(maskChannels)); + if (((1 << nVolume) & maskChannels) != 0) // right channel + { +// SendMessageToPC(GetFirstPC(), "OnPlayerChat --- channel matched"); + + bInvoke = FALSE; + if (GetLocalArrayInt(oMod, DMFI_CHATHOOK_LISTENALL_ARRAYNAME, iHook) != FALSE) + { + bInvoke = TRUE; + } + else + { + object oDesiredSpeaker = GetLocalArrayObject(oMod, DMFI_CHATHOOK_SPEAKER_ARRAYNAME, iHook); + if (oShouter == oDesiredSpeaker) bInvoke = TRUE; + } + if (bInvoke) // right speaker + { +// SendMessageToPC(GetFirstPC(), "OnPlayerChat --- speaker matched"); + sChatHandlerScript = GetLocalArrayString(oMod, DMFI_CHATHOOK_SCRIPT_ARRAYNAME, iHook); + oRunner = GetLocalArrayObject(oMod, DMFI_CHATHOOK_RUNNER_ARRAYNAME, iHook); +// SendMessageToPC(GetFirstPC(), "OnPlayerChat --- executing script '" + sChatHandlerScript + "' on object '" + GetName(oRunner) +"'"); + ExecuteScript(sChatHandlerScript, oRunner); + bAutoRemove = GetLocalArrayInt(oMod, DMFI_CHATHOOK_AUTOREMOVE_ARRAYNAME, iHook); + if (bAutoRemove) + { +// SendMessageToPC(GetFirstPC(), "OnPlayerChat --- scheduling autoremove"); + bDirtyList = TRUE; + SetLocalArrayInt(oMod, DMFI_CHATHOOK_HANDLE_ARRAYNAME, iHook, 0); + } + } + } + } + + if (bDirtyList) DMFI_ChatHookRemove(0); + + // always execute the DMFI parser + ExecuteScript(DMFI_PLAYERCHAT_SCRIPTNAME, OBJECT_SELF); + +} + diff --git a/gamma_age_v2/dmfi_onrest.ncs b/gamma_age_v2/dmfi_onrest.ncs new file mode 100644 index 0000000000000000000000000000000000000000..a8a862541cf7cd9231554cb539e1644b4ba4e738 GIT binary patch literal 8506 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 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_onrest.nss b/gamma_age_v2/dmfi_onrest.nss new file mode 100644 index 00000000..5ea59ee6 --- /dev/null +++ b/gamma_age_v2/dmfi_onrest.nss @@ -0,0 +1,463 @@ +/*DMFI Rest System Alpha by hahnsoo + +CONTENTS +-------- +Placeables>>Special>>Custom 5 - DMFI Bed Roll, DMFI Campfire, DMFI Invisible +Rest Object, DMFI Tent + +Items>>Special>>Custom5 - DMFI Bed Roll (100 gp), DMFI Firewood (1 gp), DMFI +Portable Tent (500 gp) (different gp values for different situations) + +Scripts - dmfi_onrest +(Yup, that's it) + +Description +----------- +This is a robust and versatile rest system that incorporates a LOT of options. +Perhaps too many, I don't know. I tried to find everything that folks would +possibly want in a resting system. The most important "feature" is the rest +conversation menu, which governs for both DM and Player the kind of resting that +is allowed. + +The ways you can control rest in this system are: +1) Global vs. Local - Restrict or release restrictions on resting based on world + settings or on a per-area basis +2) Unlimited vs. Limited vs. No Rest - Have the Players rest at any time they'd + like. Or Limit them according to certain parameters and toggles. Or don't + allow them to rest at all. You can set these both globally and locally + (Unlimited and No Rest areas). +3) Time restriction - The staple of most simple rest restrictions. You can limit + resting per 1, 2, 4, 8, 12, or 24 in-game hours, and the amount of real-time + minutes are calculated for the DM. Again, you can set these both globally + and locally. +4) Placeables - Popularized by Demetrious's Supply-Based Rest, this allows you + to restrict resting according to proximity to objects. It allows you to use + DMFI rest objects (tag = dmfi_restobject), campfires, bedrolls, beds, tents + (a "Name-based" rest placeable), and toggles to include/exclude certain + classes that typically don't care about such niceties. +5) Armor Restrictions - I'm not quite fond of this particular one, but it is a + standard feature of many rest systems and thus included in the package. + Allows you to set what weight of armor allows a PC to rest. +6) Set Hit Point Restrictions - Unlike the other restrictions, this does NOT + prevent resting. What it does is determine how many hitpoints are regained + upon resting, from a gradient of no hitpoints to all hitpoint, and some + interesting options in between (1 HP per level, per 3rd edition, which + skews against fighter classes and CON based HP gain, which skews in favor of + lower level characters). +7) Toggle Spell Memorization - This converts the "rest" into a "pseudorest" + which only heals HP. Useful for a "no spell memorization" zone locally, not + much use globally. +8) Various other "fluff" settings (Snoring, the rest conversation menu, + immobilized resting, floating text feedback). + +There is also a "big red button" option that simply full rests all PCs in the +area. Useful to quickly work around rest restrictions that you have previously +set up. + +Installation +------------ +Change your OnRest event script to the dmfi_onrest script. Or you can do an +external execute script call by using ExecuteScript("dmfi_onrest", OBJECT_SELF); +in your current script. + +The areas in your module should NOT have the "No Rest" box checked, in the areas +which you wish to use this system. + +Configuration +------------- +All configuration of the system is done in-game as a DM. To bring up the Rest +Configuration Menu, press R or the rest button. +The conversation will detail the settings you have in the area (whether you are +using the default Global settings or using the Local area settings to override) +and the particular restrictions that you have set. + +Settings are stored Persistently using the Bioware Database, per the DMFI W&W +default persistence options. If you want to use another database system, simply +edit the the dmfi_db_inc wrapper functions to your liking. + +Unlimited Rest means just that: No restrictions. You may have global +restrictions set up, but as long as Unlimited rest is set globally or locally, +they are ignored. +No Rest means just that: No resting allowed, regardless of restrictions. +Limited Rest means that the restrictions you have set globally or locally are in +effect. You can restrict resting as stated above in the Description. + +When you set any [LOCAL] Area variables, you automatically set the area to +"override" the global rest restrictions. This means that this area follows its +own rules, and isn't governed by the global rules. Setting the [LOCAL] Area +restrictions will copy the current global restriction variables, but after that, +the only way to go back to "global" is to select "Use default [GLOBAL] Module +settings" +Tip: The most useful way to use this is to simply set areas as Unlimited Rest or +No Rest, say an Inn Room or a combat zone, respectively. + +Player Notes +------------ +If you are using the DMFI Rest Menu (on by default), the rest restrictions (if +any) are displayed on your Rest Conversation Menu, telling you why you can't +rest (if you are restricted). You also have the option to access both the DMFI +Dicebag and the DMFI Emote wand directly from the Rest Menu. This allows you to +use emotes or dice checks WITHOUT having that silly "Use Unique Power" +animation. + +Included in this package is a way to do "Alternate Resting Animations". These +animations simply change the way you appear when you rest. Since they use the +ForceRest() function, it isn't a "true" rest... rather it sets you for a certain +amount of time (equal to a normal rest) as un-moveable, and applies the rest at +the end of that time. This just means you don't get the little egg timer. + +This is an ALPHA release, and I'm pretty sure I don't know everything about +Resting systems in the universe. I've tried to incorporate nearly all of the +elements I've seen in other available resting systems and encorporate them into +a small (single script), DMFI-integrated package. + +I would greatly appreciate feedback, suggestions, additions, omissions, bug +reports, whatever. Send them to me at hahns_shin@hotmail.com.*/ + +#include "dmfi_db_inc" +//This function calculates the resting duration based on PC Hit Dice +//Based off of restduration.2da +void FloatyText(string sText, object oPC, int iSettings) +{ + if (!(iSettings & 0x40000000)) + FloatingTextStringOnCreature(sText, oPC, FALSE); +} + +float GetRestDuration(object oPC) +{ + return 10.0f + 0.5f * IntToFloat(GetHitDice(oPC)); +} + +// This function is used as a wrapper for the Rest VFX Object +void DoRestVFX(object oPC, float fDuration, int nEffect) { + effect eEffect; + if (nEffect == -1) { + eEffect = EffectCutsceneImmobilize(); + } else { + eEffect = EffectVisualEffect(nEffect); + } + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, ExtraordinaryEffect(eEffect), oPC, fDuration); +} + + +//This function adds the Blindness/Snore effects +//Also adds cutscene immobilize to prevent movement +//Snoring should only occur at start, then follows on the module's hb +void ApplyRestVFX(object oPC, int iSettings) +{ + object oRestVFX = GetObjectByTag("dmfi_restvfxobject"); + effect eSnore = EffectVisualEffect(VFX_IMP_SLEEP); //Sleepy "ZZZ"s + float fDuration = GetRestDuration(oPC); + float fSeconds = 6.0f; + if (!(iSettings & 0x80000000)) //Immobile Resting flag + { + // Pass a -1 for EffectCutsceneImmobilize. + // For a visual effect, simply pass the VFX constant. + AssignCommand(oRestVFX, DoRestVFX(oPC, fDuration, -1)); + } + if (!(iSettings & 0x20000000)) //VFX flag + { + // AssignCommand(oRestVFX, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, ExtraordinaryEffect(eBlind), oPC, fDuration)); + AssignCommand(oRestVFX, DoRestVFX(oPC, fDuration, VFX_DUR_BLACKOUT)); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eSnore, oPC); + } +} + + +// Removes blindness & immobilize -- Merle +void RemoveRestVFX(object oPC) { + object oRestVFX = GetObjectByTag("dmfi_restvfxobject"); + effect eEffect = GetFirstEffect(oPC); + while (GetIsEffectValid(eEffect)) { + if (GetEffectCreator(eEffect) == oRestVFX) { + RemoveEffect(oPC, eEffect); + } + eEffect = GetNextEffect(oPC); + } +} + + +//This function gets the "Final HP" available to the PC after resting +int CalculateFinalHitPoints(object oPC, int iSettings) +{ + int iHP = (iSettings & 0x0f000000); + switch(iHP) + { + case 0x01000000: return 0; break; + case 0x02000000: return GetHitDice(oPC); break; + case 0x03000000: return GetAbilityScore(oPC, ABILITY_CONSTITUTION); break; + case 0x04000000: return GetMaxHitPoints(oPC)/10; break; + case 0x05000000: return GetMaxHitPoints(oPC)/4; break; + case 0x06000000: return GetMaxHitPoints(oPC)/2; break; + case 0x07000000: return GetMaxHitPoints(oPC); break; + default: return GetMaxHitPoints(oPC); break; + } + return GetMaxHitPoints(oPC); +} + +void RemoveMagicalEffects(object oPC) +{ + effect eEffect = GetFirstEffect(oPC); + while (GetIsEffectValid(eEffect)) + { + if (GetEffectSubType(eEffect) == SUBTYPE_MAGICAL) + RemoveEffect(oPC, eEffect); + eEffect = GetNextEffect(oPC); + } +} + +//This function simulates a rest without restoring spells +void DoPseudoRest(object oPC, int iSettings, int iSpells = FALSE) +{ + effect eSnore = EffectVisualEffect(VFX_IMP_SLEEP); + effect eBlind = EffectVisualEffect(VFX_DUR_BLACKOUT); + effect eStop = EffectCutsceneImmobilize(); + float fDuration = GetRestDuration(oPC); + float fSeconds = 6.0f; + int iAnimation = GetLocalInt(oPC, "dmfi_r_alternate"); + if (!iAnimation) + iAnimation = ANIMATION_LOOPING_SIT_CROSS; + AssignCommand(oPC, PlayAnimation(iAnimation, 1.0f, fDuration)); + DelayCommand(0.1, SetCommandable(FALSE, oPC)); + DelayCommand(fDuration, SetCommandable(TRUE, oPC)); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, ExtraordinaryEffect(eStop), oPC, fDuration); + if (!(iSettings & 0x20000000) && iAnimation != ANIMATION_LOOPING_MEDITATE && iAnimation != ANIMATION_LOOPING_WORSHIP) //If the No VFX flag is not set, do VFX + { + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, ExtraordinaryEffect(eBlind), oPC, fDuration); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eSnore, oPC); + while (fSeconds < fDuration) + { + DelayCommand(fSeconds, ApplyEffectToObject(DURATION_TYPE_INSTANT, eSnore, oPC)); + fSeconds += 6.0f; + } + } + if (!iSpells) + { + effect eHeal = EffectHeal(CalculateFinalHitPoints(oPC, iSettings)); //Heal the PC + DelayCommand(fDuration + 0.1f, ApplyEffectToObject(DURATION_TYPE_INSTANT, eHeal, oPC)); + DelayCommand(fDuration + 0.1f, RemoveMagicalEffects(oPC)); //Remove all magical effects from PC + } + else + { + DelayCommand(fDuration + 0.1f, ForceRest(oPC)); + } + DeleteLocalInt(oPC, "dmfi_r_alternate"); +} + +//This function determines if the PC is wearing heavy armor +int GetIsWearingHeavyArmor(object oPC, int iSettings) +{ + int iArmor = (iSettings & 0x00f00000); + object oArmor = GetItemInSlot(INVENTORY_SLOT_CHEST, oPC); + int iWeight = GetWeight(oArmor); + switch(iArmor) + { + default: + case 0x00100000: if (iWeight > 20) return TRUE; break; + case 0x00200000: if (iWeight > 60) return TRUE; break; + case 0x00300000: if (iWeight > 110) return TRUE; break; + case 0x00400000: if (iWeight > 160) return TRUE; break; + case 0x00500000: if (iWeight > 310) return TRUE; break; + case 0x00600000: if (iWeight > 410) return TRUE; break; + case 0x00700000: if (iWeight > 460) return TRUE; break; + } + return FALSE; +} + +//This function determines if the PC is near a resting placeable +int GetIsNearRestingObject(object oPC, int iSettings) +{ + if (iSettings & 0x00020000) //Ignore Druid + { + if (GetLevelByClass(CLASS_TYPE_DRUID, oPC)) + return TRUE; + } + if (iSettings & 0x00040000) //Ignore Ranger + { + if (GetLevelByClass(CLASS_TYPE_RANGER, oPC)) + return TRUE; + } + if (iSettings & 0x00080000) //Ignore Barb + { + if (GetLevelByClass(CLASS_TYPE_BARBARIAN, oPC)) + return TRUE; + } + object oPlaceable = GetFirstObjectInShape(SHAPE_SPHERE, 6.0f, GetLocation(oPC), TRUE, OBJECT_TYPE_PLACEABLE); + while (GetIsObjectValid(oPlaceable)) + { + if (!(iSettings & 0x00001000) && GetTag(oPlaceable) == "dmfi_rest") //DMFI Placeables: by default, ON + return TRUE; + if ((iSettings & 0x00002000) && GetStringLowerCase(GetName(oPlaceable)) == "campfire") //Campfires + return TRUE; + if ((iSettings & 0x00004000) && (GetStringLowerCase(GetName(oPlaceable)) == "bed roll" || GetStringLowerCase(GetName(oPlaceable)) == "bedroll")) //Bed rolls + return TRUE; + if ((iSettings & 0x00008000) && GetStringLowerCase(GetName(oPlaceable)) == "bed") //beds + return TRUE; + if ((iSettings & 0x00010000) && GetStringLowerCase(GetName(oPlaceable)) == "tent") //tents + return TRUE; + oPlaceable = GetNextObjectInShape(SHAPE_SPHERE, 6.0f, GetLocation(oPC), TRUE, OBJECT_TYPE_PLACEABLE); + } + return FALSE; +} + +// Updated to allow 6 hour breaks and to pass in a percentage if rest is interrupted +void SetNextRestTime(object oPC, int iSettings, float fPercentage = 1.0) +{ + if (fPercentage > 1.0 || fPercentage <= 0.0) { + fPercentage = 1.0; + } + int iHours = (iSettings & 0x00000f00); + int iTime = GetTimeHour() + GetCalendarDay() * 24 + GetCalendarMonth() * 24 * 28 + GetCalendarYear() * 24 * 28 * 12; + + switch(iHours) + { + default: + case 0x00000100: SetLocalInt(oPC, "dmfi_r_nextrest", iTime + FloatToInt(IntToFloat(1) * fPercentage)); break; + case 0x00000200: SetLocalInt(oPC, "dmfi_r_nextrest", iTime + FloatToInt(IntToFloat(2) * fPercentage)); break; + case 0x00000300: SetLocalInt(oPC, "dmfi_r_nextrest", iTime + FloatToInt(IntToFloat(4) * fPercentage)); break; + case 0x00000400: SetLocalInt(oPC, "dmfi_r_nextrest", iTime + FloatToInt(IntToFloat(6) * fPercentage)); break; + case 0x00000500: SetLocalInt(oPC, "dmfi_r_nextrest", iTime + FloatToInt(IntToFloat(8) * fPercentage)); break; + case 0x00000600: SetLocalInt(oPC, "dmfi_r_nextrest", iTime + FloatToInt(IntToFloat(12) * fPercentage)); break; + case 0x00000700: SetLocalInt(oPC, "dmfi_r_nextrest", iTime + FloatToInt(IntToFloat(24) * fPercentage)); break; + } +} + + +//This function determines whether or not you can rest. +int DMFI_CanIRest(object oPC, int iSettings) +{ + if (GetIsDM(oPC)) return TRUE; + if (iSettings & 0x00000002) //No Rest Override + { + if (iSettings & 0x00000080) + FloatyText("This is a No Rest area", oPC, iSettings); + return FALSE; + } + if (!(iSettings & 0x00000001)) //Unlimited Rest Override + { + if (iSettings & 0x00000080) + FloatyText("This is an Unlimited Rest area", oPC, iSettings); + return TRUE; + } + if ((iSettings & 0x00000004) && (iSettings & 0x00000001)) //Time restriction + { + int iTime = GetTimeHour() + GetCalendarDay() * 24 + GetCalendarMonth() * 24 * 28 + GetCalendarYear() * 24 * 28 * 12; + if (iTime < GetLocalInt(oPC, "dmfi_r_nextrest")) + { + FloatyText("You cannot rest at this time. You may rest again in " + IntToString(GetLocalInt(oPC, "dmfi_r_nextrest") - iTime) + " hours.", oPC, iSettings); + return FALSE; + } + } + if ((iSettings & 0x00000008) && (iSettings & 0x00000001)) //Placeable restriction + { + if (!GetIsNearRestingObject(oPC, iSettings)) + { + FloatyText("You are not near a rest placeable", oPC, iSettings); + return FALSE; + } + } + if ((iSettings & 0x00000010) && (iSettings & 0x00000001)) //Armor restriction + { + if (GetIsWearingHeavyArmor(oPC, iSettings)) + { + FloatyText("Your current armor is too heavy to rest", oPC, iSettings); + return FALSE; + } + } + return TRUE; +} + +void main() +{ + object oPC = GetLastPCRested(); + object oArea = GetArea(oPC); + int iSettings; + int iModSettings = GetDMFIPersistentInt("dmfi", "dmfi_r_"); + int iAreaSettings = GetDMFIPersistentInt("dmfi", "dmfi_r_" + GetTag(oArea)); + if (iAreaSettings & 0x00000080) + { + iSettings = iAreaSettings; + } + else + { + iSettings = iModSettings; + } + SetLocalInt(oPC, "dmfi_r_settings", iSettings); + + if (GetLastRestEventType()==REST_EVENTTYPE_REST_STARTED) + { + SetLocalInt(oPC, "dmfi_norest", !(DMFI_CanIRest(oPC, iSettings))); + SetLocalInt(oPC, "dmfi_r_hitpoints", GetCurrentHitPoints(oPC)); + if (GetIsDM(oPC) || (!(iSettings & 0x10000000) && !GetLocalInt(oPC, "dmfi_r_bypass"))) + { //If the Rest Conversation variable is set, then activate the rest conversation here. + AssignCommand(oPC, ClearAllActions()); + SetLocalString(oPC, "dmfi_univ_conv", "rest"); + AssignCommand(oPC, ActionStartConversation(oPC, "dmfi_universal", TRUE)); + return; + } + if (GetLocalInt(oPC, "dmfi_norest")) //PC cannot rest + { + AssignCommand(oPC, ClearAllActions()); + DeleteLocalInt(oPC, "dmfi_r_bypass"); + return; + } + if ((iSettings & 0x00000004) && (iSettings & 0x00000001)) //Time restriction + SetNextRestTime(oPC, iSettings); + + if (GetLocalInt(oPC, "dmfi_r_alternate") || ((iSettings & 0x00000040) && (iSettings & 0x00000001))) + { + AssignCommand(oPC, ClearAllActions()); + if ((iSettings & 0x00000040) && (iSettings & 0x00000001)) + FloatyText("You cannot regain your spells in this area",oPC, iSettings); + DoPseudoRest(oPC, iSettings, ((iSettings & 0x00000040) && (iSettings & 0x00000001))); + DeleteLocalInt(oPC, "dmfi_r_bypass"); + return; + } + else if (!(iSettings & 0x20000000)) + { //Rest VFX + ApplyRestVFX(oPC, iSettings); + } + if ((iSettings & 0x00000020) && (iSettings & 0x00000001)) + { //Auto Party Drop + FloatyText("You have been removed from the party to prevent rest canceling",oPC, iSettings); + RemoveFromParty(oPC); + } + } + else if (GetLastRestEventType()==REST_EVENTTYPE_REST_CANCELLED) + { + // Make sure that resting has been initialized and the start time has been set. Otherwise, the Cancelled Rest Event was fired by + // the Resting conversation. + if (GetLocalInt(oPC, "dmfi_r_init")) + { + int iTime = GetTimeSecond() + GetTimeMinute() * 60 + GetTimeHour() * 3600 + GetCalendarDay() * 24 * 3600 + GetCalendarMonth() *3600 * 24 * 28 + GetCalendarYear() * 24 * 28 * 12 * 3600; + int nTimeRested = iTime - GetLocalInt(oPC, "dmfi_r_startseconds"); + int nFullTime = FloatToInt(GetRestDuration(oPC)); + float fPercentage = IntToFloat(nTimeRested) / IntToFloat(nFullTime); + SetNextRestTime(oPC, iSettings, fPercentage); + // SendMessageToPC(oPC, "Rest interrupted; resting for " + IntToString(nTimeRested) + " out of " + IntToString(nFullTime) + " seconds (" + FloatToString(fPercentage) + "%)."); + SetLocalInt(oPC, "dmfi_r_init", FALSE); + if ((iSettings & 0x00000020) && GetCurrentHitPoints(oPC) > GetLocalInt(oPC, "dmfi_r_hitpoints") && iSettings & 0x00000001) //HP restriction + { + effect eDam = EffectDamage(GetMaxHitPoints(oPC) - GetLocalInt(oPC, "dmfi_r_hitpoints")); + FloatyText("Your hitpoints have been reset",oPC, iSettings); + AssignCommand(oPC, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oPC)); + + } + } + RemoveRestVFX(oPC); + } + else if (GetLastRestEventType()==REST_EVENTTYPE_REST_FINISHED) + { + if ((iSettings & 0x00000020) && (iSettings & 0x00000001)) //HP restriction + { + int iDam = GetMaxHitPoints(oPC) - GetLocalInt(oPC, "dmfi_r_hitpoints") - CalculateFinalHitPoints(oPC, iSettings); + if (iDam > 0) + { + effect eDam = EffectDamage(iDam); + FloatyText("You gain back limited HP from this rest",oPC, iSettings); + AssignCommand(oPC, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oPC)); + } + } + } + DeleteLocalInt(oPC, "dmfi_r_bypass"); +} diff --git a/gamma_age_v2/dmfi_pc_dicebag.uti b/gamma_age_v2/dmfi_pc_dicebag.uti new file mode 100644 index 0000000000000000000000000000000000000000..9ed977e565a597a8c571a48d4a1c474f48bcaf75 GIT binary patch literal 1061 zcmZ8g+m6#P5H*+OQkMI2m5}lQXeHox^faDNUh>_I zW4LBN^IW%E2hV1nb|2`*4={cXJdA+b*2o?qX2u zB69PDHojbe`4pC; z9VEkcmP+28B@Mf0H}?tg*qfCpwN2*YYy7%ou}LOwk@WE}V&5ixAtyv#?3n94wm6z$TzzDSA>;kQ5@XL6KA36!if> K5mUV6C;kELJej%x literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_pc_emote.uti b/gamma_age_v2/dmfi_pc_emote.uti new file mode 100644 index 0000000000000000000000000000000000000000..5806b74e3186ed0aebc0a61ba9eb1facd436e0c5 GIT binary patch literal 1087 zcmZ8g%Wl&^6dfL=5X!r}7D!&gCJ0!RC2fM#phBZ0lm&}uV&B-K+B23tSp@M_`~nL; zfDeLm>~TrB((!%F%(-_w_kNy@qO&*s*Kd_lmw_?x6!?Cr)q7Wz`UU?tbOL>FRjKRH ze;`omK0lCSU>CSaC&&&oXw(y64Avsnx6I{{D)=iT6w{~mA}4)Ct5f$;|bxhVTU^E03yG7#hu zbQ0{x(5#DhQzq{b1S^xk5 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_pc_follow.uti b/gamma_age_v2/dmfi_pc_follow.uti new file mode 100644 index 0000000000000000000000000000000000000000..ba7cb5229f79954df3ec5b0c7c9819154aef14cf GIT binary patch literal 1070 zcmZ8g%We}f6gAND2&EJ#uiY#VOC-vIu8=~q=sEyobw!uEYO< z!Ku6aft>)?fSXLB?ZSgbJp%Rs^52dz=+w&?gHpW(dI0zQ0BBcRr`RVq_t1DgdC7Mp z#&FGk*13Lj4xY_A?H16*`-oowoQa^3^8jGZ_zsZ94ZJI7VErCIF4`f`d<^*eEJS+% zZ({rqo^$bz{2o7nspO^8LB>*#Wueq-T}v7yN2{?@KiAHF6Z2l@g33_pd1cFBebMxp zr$&lk7gli4RA=qR_&ZqYDwF!6Ht==0NDxedchXWdO^ zZW*kqnsapa&Kq$fU4`duWmNf6s$iu)wVWj8>v%miS`n(C=AG)9>nhC8v|DvK zsC6E>c|x22TY>u*bLp3*=&J2I2|?0fI}Z5s9A7VHO6{9`Vb9C?`NBKrzdk{OGVkPa zhwTzfW((~S{GI5s z_hubN+yQn0z8=0Bz81a`Dvz&%uYt-X8&yta VQjxp{)lQXD-MlWj zaZo+qCD<{}^Azr99Wl<_(Y^*d%5@m5XDNX3SR-S!ZvyYbVcwf{GkzP0oXfELhk?EW zM7axt?-Dsb1e=^u;#)?}7$;|Z%l~n5-#vhL<-P9%KY?7Dw$@&Dq}!27sn@!b%u9o% zUbbwZYx7mgce)WoM$#3|wBFchzfM0ZW$I031jXn2U^p1Q>7jN9(#>P3?fl$XZkT7f-*Y?Ezjj}vJaXdGVq%+sCjwsu#50X-ygLxJNQs)h z>kSUROJ!4;y|&nM()qQu^(TmNj$-eyA4l7pS+Z%Ie6hA zf1Eq^9eb4X#d~m`Ncj|40eBVmI(wY+vJ9}7IT!3*_ALK54}nL(V}S3&yfOb@ZYZ9O literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_pc_rest002.uti b/gamma_age_v2/dmfi_pc_rest002.uti new file mode 100644 index 0000000000000000000000000000000000000000..5931a71e283b50fa71e2bdb3b15f3be51acec47c GIT binary patch literal 1183 zcmZux%T5$Q6fH%>H!ApkRa_f_u)rC8 z|3%N~u0n=*lhgN6Rp;KSxp%&#iQZjbS$m_DnghN98u)!dsYlQb!C%lzmz4Sj{R8?2 z^dAV6y2}sb1F+CqO69@69(<~K0F>$_!1EV@+rehu*TDw8dJ9|wc;-7mx!ftmb>?9X z%9T#Fd{<#J2ZiS;+|N4Ve&&vQZo-ao3kKH~0~n7rGDiCj@F^VTy;(QoOF-mYhTT34 z^gSTTeHg4Ea()grIitk4jGQq}&iI!9PWvtYeX(aJd zV5ybuGBeJeNdD0jf=FMQthSZ6<)mGwpX4&}c5DU3r{xp|~FtsB-6Wv9%=4NUFXJdil}O+^I~lGs%)>8#;>lfJwuFh6nlsL*xz}V=q<_huyl?Ca&`k;_5NIJ1AcmF z8*TB+>dZ`ZRttV~ZS)M+D+HKVqa`xotykFB=So7P6_&&{WQ(({<^hf%M~@@NQDdvI uEjczUog+lb=fDeq)w8|X)*O*#fbGjsV7szS`4{sTcmg~H_$165^Zy0fnVD?> literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_pc_rest003.uti b/gamma_age_v2/dmfi_pc_rest003.uti new file mode 100644 index 0000000000000000000000000000000000000000..707b4f0dd7891868a312047146fa38a16c2e1595 GIT binary patch literal 1184 zcmZ8h$!^p@5N#k~-x>C;#Ti9`kr3A~qX?q}hK$JxDeBlYNeg>y**%AF;unzk1P*)@ zpTQm8v%5l)lHSzP-LIXkSJ=)CsD%zko?|_Q{&wK|cXM1J1&OCoe z207oWj_(5O81Bw%s-ul6FgG#=LQ@ zBtc3nb+S=quJB(afA2~`WGrpg_&WG%-mTM5a+wD|^Mc}2x7QzxzoUKE>`8kV8&z#M zbYM(FRY*_Og{Q$~U#3VHH%*G_*#5OVKSpshH;;@KP0Kn|Hmh8UiEF}(J~C;lTAJXc z-SDg=`UmlPX1dr72eoDgAL>orZlMwS+pbus4{BFNZf5BH|2uI1c_wRhEw1U;3kgAz zabFJj%Mz~_J@i&y&iqcD?KIMc)z#rMtZd-D5_H`fz8shYsLY>MNYlB2swH#!j; z!cX^oYdt=%&D`8(jo`~$XFEdjJcq-?7Cn&(=~vj;Cu%~Z6V}8&WREWa%K&GPv&Wg^ ytg+YFmz*ii5@(2%Pk^TYD`$W6UYwBu!2V_5vR~P!{EvA6JOmyA{C{9x&HoR!|C`?c literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_peace.uti b/gamma_age_v2/dmfi_peace.uti new file mode 100644 index 0000000000000000000000000000000000000000..c2df35a53f34bcc089f882c875ba93b7db2e2732 GIT binary patch literal 1234 zcmah}$!-)e5H*mn3_FB<^9{H}0tDhnGEtO42^nREa6yWk=}Ow*9=F;ap~)fQ>kwbS z0r3ZX1iaVn&ccP#JeRBNdR2D2=KZjzH($&@f31`{1$+cF@au$9cc2}dKcSarl==$& z4f+D~9|)AX#sRVdoT+C@Wodps*;KOtDAjF%@h1VUbI!c4(j4^aEzkiN^Btg^Zj|CW z^ZaHI#;?xYH=qm?zEiR+sxK5IPv%9m0_ zD`C~Ll4MWQ@zh|l9j9fR9ek*FXtrJJp}lF`q_sh9ip0$fjeWQS=O2$`p)AEz&AO8q zrMJ|S1OB4G?IjD}CM$OA7Iu&1F`R6n_9^o7Ev+s0H14d_2;4SNf3VrEM83eITS>R~ zkM9%g^|71kNe~@#8??bsI}@U=B={=o=ygDKPIOs$oVf`4i;X#!%Skl+=JTD-{(fh1 zs#i=t4&Li0IVW2ox8patkA<;re&ma%d}D`4fl&*O!k5bzJOj)E>{@m!yOiC@$hPbG ry4iK?gonT*fM;cwu@l%;a{#-D-NP&5%jUn*UEm&YA9w&TZ=3%wdRDOm literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_playerbook.uti b/gamma_age_v2/dmfi_playerbook.uti new file mode 100644 index 0000000000000000000000000000000000000000..bd76770dc356a741fbeaa81e556b216a65ed44f8 GIT binary patch literal 3286 zcmbtX+in|07&d1Z4h6138s(}rj-{3hP~paLQq?6*qQ+^d5JKbK-@AinXSOr5aotDY z@wng-cn$de+4a^5K|*5W_0H)(ANOKDlTW`M-}`nj7`%b!5YOj$zQBUt-@iE+oQT2T zw~q#chgkoP_uF{?g@ISP^C3^V@ebaM=Mf%U9RPgrX*Yih?@2dj9A5!1eglU2h9?;B zwy#9vJFprFb+4v04BTVL0 z)kZ~nLg5K52ZI9@Xcno$aT>=iQ%1j{{6tlRokI$l*LBp+rgL7;ahAKc2TrTzsf+K^v3x7x=E`^8r8Ut)cL zed(6+EZve%oz6%yB4zXNCoH)O@CVit>1j!xEbie_ql{cSFE0~d)&ZuimT-{3Bo7}4 zAug=ZE0VRROYNEfM229p!1QBDxb$EqqjM&VcXi+jpR~Q+Gyn^SlUZG?E#})kX-9nYAe061tlz?5HM?O#tsqq+S>WmScoT7 z10V24dKsCA$?>zv^K+>S>pZq^Yj9?98ltv^EcK{+?g()(IiF4C)6?1XNItkYna*dY zC+GLY{(l`}I6QnTvr<`0hJ`l{413wYGloMk-%(3r>g*yN zxK4`RQW(qUu7MplOdy?YK`NJXSoi?t8Moeo&Xrk>tB#9o}A}I@u!R+6)jI+&I%R(TY5p7`l^#Oa4 zR6tqj%)tOHo=ma!(yd(wgw|_i;arIe=(xuNYNLMfKdAj90y;fjqa}t^Ik@ZanjeaT zR{gzU78KV+;CJohu*Id2VX7J$bP^Uvs8b4FmckI;Ub}!S00-{_87aZ<=8!~*q)MUM+b$|5(&0~rB+o>^JnRwf zODV+NI~>5Ap~8w?EGsEnCG={6Op!b{?d(fL^^oCYh)8b*3=Nqp2WRsxTMdP{*W+r{ zDO;F@TPN8$vXIbnL~EDOqFYP{aWk<1+eUo2VV1#*j6>O42tNcjL@rCvs{G_D4Z9=Sslx+rjgS&yP@Dq&Pp zl;EKRLL69C3+r-GgF}`DEC*31HY>_?WG=y5E`l-*=7E%lbfJWI2E;a>Ai(e!`GN0Q z3Hs15eua09#f1v-5=7woB0{Y~g@4#7QvpDclo4UAYZ4LZ7fhf&#DGO(;|MMaF(V2j z)UQ@AN_wyQ4F;9?iusWm{V zI0U+dD!^}E$=72ay#tama5!r=VvN|h?9qCmZ|@=_}~ zpB(=n#)WZ<{^Cv7&L5s$%-is0G54AG*8y=g!V%dwML4!^jPNmvRj<^4H3Ui&Y8w}l zKxWDQq(X40_z=Bs1eC0~jAe~MTePi#;^;@D$3!Lfh(m7Qxzpp`k=yQTog;7a*mn5* mrNG@de;M!>0e=ZF3hw;5L+4JPJACf!xua*4+`)6_&f{-#q`(9K literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_plchlishk_i.nss b/gamma_age_v2/dmfi_plchlishk_i.nss new file mode 100644 index 00000000..ac76a36a --- /dev/null +++ b/gamma_age_v2/dmfi_plchlishk_i.nss @@ -0,0 +1,117 @@ +//:://///////////////////////////////////////////// +//:: DMFI - internal player chat listener hooking include +//:: dmfi_plchlishk_i +//::////////////////////////////////////////////// +/* + Include file containing routines for managing the internal DMFI chain of + "listeners", which are now implemented as OnPlayerChat event handlers rather + than creatures. +*/ +//::////////////////////////////////////////////// +//:: Created By: tsunami282 +//:: Created On: 2008.03.24 +//::////////////////////////////////////////////// + +const int DMFI_LISTEN_ON_CHANNEL_TALK = 1; +const int DMFI_LISTEN_ON_CHANNEL_WHISPER = 1; +const int DMFI_LISTEN_ON_CHANNEL_SHOUT = 1; +const int DMFI_LISTEN_ON_CHANNEL_DM = 1; +const int DMFI_LISTEN_ON_CHANNEL_PARTY = 1; + +const string DMFI_EAVESDROP_HOOK_VARNAME = "dmfi_Eavesdrop"; + +const float WHISPER_DISTANCE = 1.0; +const float TALK_DISTANCE = 30.0; + +string sHookTypeVarname = DMFI_EAVESDROP_HOOK_VARNAME + "_Type"; // 1=PC (says), 2=NPC/location (hears) +string sHookCreatureVarname = DMFI_EAVESDROP_HOOK_VARNAME + "_Creature"; // must be valid for type 1, for type 2 object_invalid means location only +string sHookRangeModeVarname = DMFI_EAVESDROP_HOOK_VARNAME + "_RangeMode"; // listening range: for type 1, 0=pc only, 1=pc's party; for type 2, 0=earshot, 1=area, 2=module +string sHookLocationVarname = DMFI_EAVESDROP_HOOK_VARNAME + "_Location"; // for type 2, location of "listening post" +string sHookChannelsVarname = DMFI_EAVESDROP_HOOK_VARNAME + "_Channels"; // bitmask of TALKVOLUME channels to listen to +string sHookOwnerVarname = DMFI_EAVESDROP_HOOK_VARNAME + "_Owner"; // unique ID of owner of this hook (he who will get the captured text) +string sHookBcastDMsVarname = DMFI_EAVESDROP_HOOK_VARNAME + "_BcastDMs"; // 0=relay message to owner only, 1=broadcast to all DMs + +//////////////////////////////////////////////////////////////////////// +void RemoveListenerHook(int hooknum) +{ + int hooktype; + object hookcreature; + location hooklocation; + int hookchannels; + object hookowner; + int hookparty, hookbcast; + + int iHook = hooknum; + string siHook = "", siHookN = ""; + object oMod = GetModule(); + + while (1) + { + siHook = IntToString(iHook); + siHookN = IntToString(iHook+1); + + hooktype = GetLocalInt(oMod, sHookTypeVarname+siHookN); + if (hooktype != 0) + { + hookcreature = GetLocalObject(oMod, sHookCreatureVarname+siHookN); + hooklocation = GetLocalLocation(oMod, sHookLocationVarname+siHookN); + hookchannels = GetLocalInt(oMod, sHookChannelsVarname+siHookN); + hookowner = GetLocalObject(oMod, sHookOwnerVarname+siHookN); + hookparty = GetLocalInt(oMod, sHookRangeModeVarname+siHookN); + hookbcast = GetLocalInt(oMod, sHookBcastDMsVarname+siHookN); + + SetLocalInt(oMod, sHookTypeVarname+siHook, hooktype); + SetLocalObject(oMod, sHookCreatureVarname+siHook, hookcreature); + SetLocalLocation(oMod, sHookLocationVarname+siHook, hooklocation); + SetLocalInt(oMod, sHookChannelsVarname+siHook, hookchannels); + SetLocalObject(oMod, sHookOwnerVarname+siHook, hookowner); + SetLocalInt(oMod, sHookRangeModeVarname+siHook, hookparty); + SetLocalInt(oMod, sHookBcastDMsVarname+siHook, hookbcast); + } + else + { + DeleteLocalInt(oMod, sHookTypeVarname+siHook); + DeleteLocalObject(oMod, sHookCreatureVarname+siHook); + DeleteLocalLocation(oMod, sHookLocationVarname+siHook); + DeleteLocalInt(oMod, sHookChannelsVarname+siHook); + DeleteLocalObject(oMod, sHookOwnerVarname+siHook); + DeleteLocalInt(oMod, sHookRangeModeVarname+siHook); + DeleteLocalInt(oMod, sHookBcastDMsVarname+siHook); + + break; + } + iHook++; + } +} + +//////////////////////////////////////////////////////////////////////// +int AppendListenerHook(int hooktype, object hookcreature, location hooklocation, + int hookchannels, int hookparty, int hookbcast, object hookowner) +{ + int iHook = 0; + + if (hooktype != 0) + { + int iHookType; + string siHook = ""; + object oMod = GetModule(); + iHook = 1; + while (1) + { + siHook = IntToString(iHook); + iHookType = GetLocalInt(oMod, sHookTypeVarname+siHook); + if (iHookType == 0) break; // end of list + iHook++; + } + SetLocalInt(oMod, sHookTypeVarname+siHook, hooktype); + SetLocalObject(oMod, sHookCreatureVarname+siHook, hookcreature); + SetLocalLocation(oMod, sHookLocationVarname+siHook, hooklocation); + SetLocalInt(oMod, sHookChannelsVarname+siHook, hookchannels); + SetLocalObject(oMod, sHookOwnerVarname+siHook, hookowner); + SetLocalInt(oMod, sHookRangeModeVarname+siHook, hookparty); + SetLocalInt(oMod, sHookBcastDMsVarname+siHook, hookbcast); + } + + return iHook; +} + diff --git a/gamma_age_v2/dmfi_plychat_exe.ncs b/gamma_age_v2/dmfi_plychat_exe.ncs new file mode 100644 index 0000000000000000000000000000000000000000..a67bd100a17c19d57f0bcf5bbb41ad55efe3030d GIT binary patch literal 117846 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 RFsuWkdSJ6NQidtx{eRv0Yq$Ua literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_plychat_exe.nss b/gamma_age_v2/dmfi_plychat_exe.nss new file mode 100644 index 00000000..3b82ba91 --- /dev/null +++ b/gamma_age_v2/dmfi_plychat_exe.nss @@ -0,0 +1,3910 @@ +//:://///////////////////////////////////////////// +//:: DMFI - OnPlayerChat functions processor +//:: dmfi_plychat_exe +//::////////////////////////////////////////////// +/* + Processor for the OnPlayerChat-triggered DMFI functions. +*/ +//::////////////////////////////////////////////// +//:: Created By: The DMFI Team +//:: Created On: +//::////////////////////////////////////////////// +//:: 2007.12.12 Merle +//:: - revisions for NWN patch 1.69 +//:: 2008.03.24 tsunami282 +//:: - renamed from dmfi_voice_exe, updated to work with event hooking system +//:: 2008.06.23 Prince Demetri & Night Journey +//:: - added languages: Sylvan, Mulhorandi, Rashemi +//:: 2008.07.30 morderon +//:: - better emote processing, allow certain dot commands for PC's + +#include "x2_inc_switches" +#include "x0_i0_stringlib" +#include "dmfi_string_inc" +#include "dmfi_plchlishk_i" +#include "dmfi_db_inc" + +const int DMFI_LOG_CONVERSATION = TRUE; // turn on or off logging of conversation text + +//////////////////////////////////////////////////////////////////////// +int AppearType (string sCom) +{ +// 2008.03.24 tsunami282 - pull descriptions from 2da first; allow numerics + + // is it numeric? If so just convert and return + if (TestStringAgainstPattern("*n", sCom)) return StringToInt(sCom); + if (sCom == "ARANEA") + return APPEARANCE_TYPE_ARANEA; + if (sCom == "ALLIP") + return APPEARANCE_TYPE_ALLIP; + if (sCom == "ARCH_TARGET") + return APPEARANCE_TYPE_ARCH_TARGET; + if (sCom == "ARIBETH") + return APPEARANCE_TYPE_ARIBETH; + if (sCom == "ASABI_CHIEFTAIN") + return APPEARANCE_TYPE_ASABI_CHIEFTAIN; + if (sCom == "ASABI_SHAMAN") + return APPEARANCE_TYPE_ASABI_SHAMAN; + if (sCom == "ASABI_WARRIOR") + return APPEARANCE_TYPE_ASABI_WARRIOR; + if (sCom == "BADGER") + return APPEARANCE_TYPE_BADGER; + if (sCom == "BADGER_DIRE") + return APPEARANCE_TYPE_BADGER_DIRE; + if (sCom == "BALOR") + return APPEARANCE_TYPE_BALOR; + if (sCom == "BARTENDER") + return APPEARANCE_TYPE_BARTENDER; + if (sCom == "BASILISK") + return APPEARANCE_TYPE_BASILISK; + if (sCom == "BAT") + return APPEARANCE_TYPE_BAT; + if (sCom == "BAT_HORROR") + return APPEARANCE_TYPE_BAT_HORROR; + if (sCom == "BEAR_BLACK") + return APPEARANCE_TYPE_BEAR_BLACK; + if (sCom == "BEAR_BROWN") + return APPEARANCE_TYPE_BEAR_BROWN; + if (sCom == "BEAR_DIRE") + return APPEARANCE_TYPE_BEAR_DIRE; + if (sCom == "BEAR_KODIAK") + return APPEARANCE_TYPE_BEAR_KODIAK; + if (sCom == "BEAR_POLAR") + return APPEARANCE_TYPE_BEAR_POLAR; + if (sCom == "BEETLE_FIRE") + return APPEARANCE_TYPE_BEETLE_FIRE; + if (sCom == "BEETLE_SLICER") + return APPEARANCE_TYPE_BEETLE_SLICER; + if (sCom == "BEETLE_STAG") + return APPEARANCE_TYPE_BEETLE_STAG; + if (sCom == "BEETLE_STINK") + return APPEARANCE_TYPE_BEETLE_STINK; + if (sCom == "BEGGER") + return APPEARANCE_TYPE_BEGGER; + if (sCom == "BLOOD_SAILER") + return APPEARANCE_TYPE_BLOOD_SAILER; + if (sCom == "BOAR") + return APPEARANCE_TYPE_BOAR; + if (sCom == "BOAR_DIRE") + return APPEARANCE_TYPE_BOAR_DIRE; + if (sCom == "BODAK") + return APPEARANCE_TYPE_BODAK; + if (sCom == "BUGBEAR_A") + return APPEARANCE_TYPE_BUGBEAR_A; + if (sCom == "BUGBEAR_B") + return APPEARANCE_TYPE_BUGBEAR_B; + if (sCom == "BUGBEAR_CHIEFTAIN_A") + return APPEARANCE_TYPE_BUGBEAR_CHIEFTAIN_A; + if (sCom == "BUGBEAR_CHIEFTAIN_B") + return APPEARANCE_TYPE_BUGBEAR_CHIEFTAIN_B; + if (sCom == "BUGBEAR_SHAMAN_A") + return APPEARANCE_TYPE_BUGBEAR_SHAMAN_A; + if (sCom == "BUGBEAR_SHAMAN_B") + return APPEARANCE_TYPE_BUGBEAR_SHAMAN_B; + if (sCom == "CAT_CAT_DIRE") + return APPEARANCE_TYPE_CAT_CAT_DIRE; + if (sCom == "CAT_COUGAR") + return APPEARANCE_TYPE_CAT_COUGAR; + if (sCom == "CAT_CRAG_CAT") + return APPEARANCE_TYPE_CAT_CRAG_CAT; + if (sCom == "CAT_JAGUAR") + return APPEARANCE_TYPE_CAT_JAGUAR; + if (sCom == "CAT_KRENSHAR") + return APPEARANCE_TYPE_CAT_KRENSHAR; + if (sCom == "CAT_LEOPARD") + return APPEARANCE_TYPE_CAT_LEOPARD; + if (sCom == "CAT_LION") + return APPEARANCE_TYPE_CAT_LION; + if (sCom == "CAT_MPANTHER") + return APPEARANCE_TYPE_CAT_MPANTHER; + if (sCom == "CAT_PANTHER") + return APPEARANCE_TYPE_CAT_PANTHER; + if (sCom == "CHICKEN") + return APPEARANCE_TYPE_CHICKEN; + if (sCom == "COCKATRICE") + return APPEARANCE_TYPE_COCKATRICE; + if (sCom == "COMBAT_DUMMY") + return APPEARANCE_TYPE_COMBAT_DUMMY; + if (sCom == "CONVICT") + return APPEARANCE_TYPE_CONVICT; + if (sCom == "COW") + return APPEARANCE_TYPE_COW; + if (sCom == "CULT_MEMBER") + return APPEARANCE_TYPE_CULT_MEMBER; + if (sCom == "DEER") + return APPEARANCE_TYPE_DEER; + if (sCom == "DEER_STAG") + return APPEARANCE_TYPE_DEER_STAG; + if (sCom == "DEVIL") + return APPEARANCE_TYPE_DEVIL; + if (sCom == "DOG") + return APPEARANCE_TYPE_DOG; + if (sCom == "DOG_BLINKDOG") + return APPEARANCE_TYPE_DOG_BLINKDOG; + if (sCom == "DOG_DIRE_WOLF") + return APPEARANCE_TYPE_DOG_DIRE_WOLF; + if (sCom == "DOG_FENHOUND") + return APPEARANCE_TYPE_DOG_FENHOUND; + if (sCom == "DOG_HELL_HOUND") + return APPEARANCE_TYPE_DOG_HELL_HOUND; + if (sCom == "DOG_SHADOW_MASTIF") + return APPEARANCE_TYPE_DOG_SHADOW_MASTIF; + if (sCom == "DOG_WINTER_WOLF") + return APPEARANCE_TYPE_DOG_WINTER_WOLF; + if (sCom == "DOG_WORG") + return APPEARANCE_TYPE_DOG_WORG; + if (sCom == "DOG_WOLF") + return APPEARANCE_TYPE_DOG_WOLF; + if (sCom == "DOOM_KNIGHT") + return APPEARANCE_TYPE_DOOM_KNIGHT; + if (sCom == "DRAGON_BLACK") + return APPEARANCE_TYPE_DRAGON_BLACK; + if (sCom == "DRAGON_BLUE") + return APPEARANCE_TYPE_DRAGON_BLUE; + if (sCom == "DRAGON_BRASS") + return APPEARANCE_TYPE_DRAGON_BRASS; + if (sCom == "DRAGON_BRONZE") + return APPEARANCE_TYPE_DRAGON_BRONZE; + if (sCom == "DRAGON_COPPER") + return APPEARANCE_TYPE_DRAGON_COPPER; + if (sCom == "DRAGON_GOLD") + return APPEARANCE_TYPE_DRAGON_GOLD; + if (sCom == "DRAGON_GREEN") + return APPEARANCE_TYPE_DRAGON_GREEN; + if (sCom == "DRAGON_RED") + return APPEARANCE_TYPE_DRAGON_RED; + if (sCom == "DRAGON_SILVER") + return APPEARANCE_TYPE_DRAGON_SILVER; + if (sCom == "DRAGON_WHITE") + return APPEARANCE_TYPE_DRAGON_WHITE; + if (sCom == "DROW_CLERIC") + return APPEARANCE_TYPE_DROW_CLERIC; + if (sCom == "DROW_FIGHTER") + return APPEARANCE_TYPE_DROW_FIGHTER; + if (sCom == "DRUEGAR_CLERIC") + return APPEARANCE_TYPE_DRUEGAR_CLERIC; + if (sCom == "DRUEGAR_FIGHTER") + return APPEARANCE_TYPE_DRUEGAR_FIGHTER; + if (sCom == "DRYAD") + return APPEARANCE_TYPE_DRYAD; + if (sCom == "DWARF") + return APPEARANCE_TYPE_DWARF; + if (sCom == "DWARF_NPC_FEMALE") + return APPEARANCE_TYPE_DWARF_NPC_FEMALE; + if (sCom == "DWARF_NPC_MALE") + return APPEARANCE_TYPE_DWARF_NPC_MALE; + if (sCom == "ELEMENTAL_AIR") + return APPEARANCE_TYPE_ELEMENTAL_AIR; + if (sCom == "ELEMENTAL_AIR_ELDER") + return APPEARANCE_TYPE_ELEMENTAL_AIR_ELDER; + if (sCom == "ELEMENTAL_EARTH") + return APPEARANCE_TYPE_ELEMENTAL_EARTH; + if (sCom == "ELEMENTAL_EARTH_ELDER") + return APPEARANCE_TYPE_ELEMENTAL_EARTH_ELDER; + if (sCom == "ELEMENTAL_FIRE") + return APPEARANCE_TYPE_ELEMENTAL_FIRE; + if (sCom == "ELEMENTAL_FIRE_ELDER") + return APPEARANCE_TYPE_ELEMENTAL_FIRE_ELDER; + if (sCom == "ELEMENTAL_WATER") + return APPEARANCE_TYPE_ELEMENTAL_WATER; + if (sCom == "ELEMENTAL_WATER_ELDER") + return APPEARANCE_TYPE_ELEMENTAL_WATER_ELDER; + if (sCom == "ELF") + return APPEARANCE_TYPE_ELF; + if (sCom == "ELF_NPC_FEMALE") + return APPEARANCE_TYPE_ELF_NPC_FEMALE; + if (sCom == "ELF_NPC_MALE_01") + return APPEARANCE_TYPE_ELF_NPC_MALE_01; + if (sCom == "ELF_NPC_MALE_02") + return APPEARANCE_TYPE_ELF_NPC_MALE_02; + if (sCom == "ETTERCAP") + return APPEARANCE_TYPE_ETTERCAP; + if (sCom == "ETTIN") + return APPEARANCE_TYPE_ETTIN; + if (sCom == "FAERIE_DRAGON") + return APPEARANCE_TYPE_FAERIE_DRAGON; + if (sCom == "FAIRY") + return APPEARANCE_TYPE_FAIRY; + if (sCom == "FALCON") + return APPEARANCE_TYPE_FALCON; + if (sCom == "FEMALE_01") + return APPEARANCE_TYPE_FEMALE_01; + if (sCom == "FEMALE_02") + return APPEARANCE_TYPE_FEMALE_02; + if (sCom == "FEMALE_03") + return APPEARANCE_TYPE_FEMALE_03; + if (sCom == "FEMALE_04") + return APPEARANCE_TYPE_FEMALE_04; + if (sCom == "FORMIAN_MYRMARCH") + return APPEARANCE_TYPE_FORMIAN_MYRMARCH; + if (sCom == "FORMIAN_QUEEN") + return APPEARANCE_TYPE_FORMIAN_QUEEN; + if (sCom == "FORMIAN_WARRIOR") + return APPEARANCE_TYPE_FORMIAN_WARRIOR; + if (sCom == "FORMIAN_WORKER") + return APPEARANCE_TYPE_FORMIAN_WORKER; + if (sCom == "GARGOYLE") + return APPEARANCE_TYPE_GARGOYLE; + if (sCom == "GHAST") + return APPEARANCE_TYPE_GHAST; + if (sCom == "GHOUL") + return APPEARANCE_TYPE_GHOUL; + if (sCom == "GHOUL_LORD") + return APPEARANCE_TYPE_GHOUL_LORD; + if (sCom == "GIANT_FIRE") + return APPEARANCE_TYPE_GIANT_FIRE; + if (sCom == "GIANT_FIRE_FEMALE") + return APPEARANCE_TYPE_GIANT_FIRE_FEMALE; + if (sCom == "GIANT_FROST") + return APPEARANCE_TYPE_GIANT_FROST; + if (sCom == "GIANT_FROST_FEMALE") + return APPEARANCE_TYPE_GIANT_FROST_FEMALE; + if (sCom == "GIANT_HILL") + return APPEARANCE_TYPE_GIANT_HILL; + if (sCom == "GIANT_MOUNTAIN") + return APPEARANCE_TYPE_GIANT_MOUNTAIN; + if (sCom == "GNOLL_WARRIOR") + return APPEARANCE_TYPE_GNOLL_WARRIOR; + if (sCom == "GNOLL_WIZ") + return APPEARANCE_TYPE_GNOLL_WIZ; + if (sCom == "GNOME") + return APPEARANCE_TYPE_GNOME; + if (sCom == "GNOME_NPC_FEMALE") + return APPEARANCE_TYPE_GNOME_NPC_FEMALE; + if (sCom == "GNOME_NPC_MALE") + return APPEARANCE_TYPE_GNOME_NPC_MALE; + if (sCom == "GOBLIN_A") + return APPEARANCE_TYPE_GOBLIN_A; + if (sCom == "GOBLIN_B") + return APPEARANCE_TYPE_GOBLIN_B; + if (sCom == "GOBLIN_CHIEF_A") + return APPEARANCE_TYPE_GOBLIN_CHIEF_A; + if (sCom == "GOBLIN_CHIEF_B") + return APPEARANCE_TYPE_GOBLIN_CHIEF_B; + if (sCom == "GOBLIN_SHAMAN_A") + return APPEARANCE_TYPE_GOBLIN_SHAMAN_A; + if (sCom == "GOBLIN_SHAMAN_B") + return APPEARANCE_TYPE_GOBLIN_SHAMAN_B; + if (sCom == "GOLEM_BONE") + return APPEARANCE_TYPE_GOLEM_BONE; + if (sCom == "GOLEM_CLAY") + return APPEARANCE_TYPE_GOLEM_CLAY; + if (sCom == "GOLEM_FLESH") + return APPEARANCE_TYPE_GOLEM_FLESH; + if (sCom == "GOLEM_IRON") + return APPEARANCE_TYPE_GOLEM_IRON; + if (sCom == "GOLEM_STONE") + return APPEARANCE_TYPE_GOLEM_STONE; + if (sCom == "GORGON") + return APPEARANCE_TYPE_GORGON; + if (sCom == "GREY_RENDER") + return APPEARANCE_TYPE_GREY_RENDER; + if (sCom == "GYNOSPHINX") + return APPEARANCE_TYPE_GYNOSPHINX; + if (sCom == "HALF_ELF") + return APPEARANCE_TYPE_HALF_ELF; + if (sCom == "HALF_ORC") + return APPEARANCE_TYPE_HALF_ORC; + if (sCom == "HALF_ORC_NPC_FEMALE") + return APPEARANCE_TYPE_HALF_ORC_NPC_FEMALE; + if (sCom == "HALF_ORC_NPC_MALE_01") + return APPEARANCE_TYPE_HALF_ORC_NPC_MALE_01; + if (sCom == "HALF_ORC_NPC_MALE_02") + return APPEARANCE_TYPE_HALF_ORC_NPC_MALE_02; + if (sCom == "HALFLING") + return APPEARANCE_TYPE_HALFLING; + if (sCom == "HALFLING_NPC_FEMALE") + return APPEARANCE_TYPE_HALFLING_NPC_FEMALE; + if (sCom == "HALFLING_NPC_MALE") + return APPEARANCE_TYPE_HALFLING_NPC_MALE; + if (sCom == "HELMED_HORROR") + return APPEARANCE_TYPE_HELMED_HORROR; + if (sCom == "HEURODIS_LICH") + return APPEARANCE_TYPE_HEURODIS_LICH; + if (sCom == "HOBGOBLIN_WARRIOR") + return APPEARANCE_TYPE_HOBGOBLIN_WARRIOR; + if (sCom == "HOOK_HORROR") + return APPEARANCE_TYPE_HOOK_HORROR; + if (sCom == "HOBGOBLIN_WIZARD") + return APPEARANCE_TYPE_HOBGOBLIN_WIZARD; + if (sCom == "HOUSE_GUARD") + return APPEARANCE_TYPE_HOUSE_GUARD; + if (sCom == "HUMAN") + return APPEARANCE_TYPE_HUMAN; + if (sCom == "HUMAN_NPC_FEMALE_01") + return APPEARANCE_TYPE_HUMAN_NPC_FEMALE_01; + if (sCom == "HUMAN_NPC_FEMALE_02") + return APPEARANCE_TYPE_HUMAN_NPC_FEMALE_02; + if (sCom == "HUMAN_NPC_FEMALE_03") + return APPEARANCE_TYPE_HUMAN_NPC_FEMALE_03; + if (sCom == "HUMAN_NPC_FEMALE_04") + return APPEARANCE_TYPE_HUMAN_NPC_FEMALE_04; + if (sCom == "HUMAN_NPC_FEMALE_05") + return APPEARANCE_TYPE_HUMAN_NPC_FEMALE_05; + if (sCom == "HUMAN_NPC_FEMALE_06") + return APPEARANCE_TYPE_HUMAN_NPC_FEMALE_06; + if (sCom == "HUMAN_NPC_FEMALE_07") + return APPEARANCE_TYPE_HUMAN_NPC_FEMALE_07; + if (sCom == "HUMAN_NPC_FEMALE_08") + return APPEARANCE_TYPE_HUMAN_NPC_FEMALE_08; + if (sCom == "HUMAN_NPC_FEMALE_09") + return APPEARANCE_TYPE_HUMAN_NPC_FEMALE_09; + if (sCom == "HUMAN_NPC_FEMALE_10") + return APPEARANCE_TYPE_HUMAN_NPC_FEMALE_10; + if (sCom == "HUMAN_NPC_FEMALE_11") + return APPEARANCE_TYPE_HUMAN_NPC_FEMALE_11; + if (sCom == "HUMAN_NPC_FEMALE_12") + return APPEARANCE_TYPE_HUMAN_NPC_FEMALE_12; + if (sCom == "HUMAN_NPC_MALE_01") + return APPEARANCE_TYPE_HUMAN_NPC_MALE_01; + if (sCom == "HUMAN_NPC_MALE_02") + return APPEARANCE_TYPE_HUMAN_NPC_MALE_02; + if (sCom == "HUMAN_NPC_MALE_03") + return APPEARANCE_TYPE_HUMAN_NPC_MALE_03; + if (sCom == "HUMAN_NPC_MALE_04") + return APPEARANCE_TYPE_HUMAN_NPC_MALE_04; + if (sCom == "HUMAN_NPC_MALE_05") + return APPEARANCE_TYPE_HUMAN_NPC_MALE_05; + if (sCom == "HUMAN_NPC_MALE_06") + return APPEARANCE_TYPE_HUMAN_NPC_MALE_06; + if (sCom == "HUMAN_NPC_MALE_07") + return APPEARANCE_TYPE_HUMAN_NPC_MALE_07; + if (sCom == "HUMAN_NPC_MALE_08") + return APPEARANCE_TYPE_HUMAN_NPC_MALE_08; + if (sCom == "HUMAN_NPC_MALE_09") + return APPEARANCE_TYPE_HUMAN_NPC_MALE_09; + if (sCom == "HUMAN_NPC_MALE_10") + return APPEARANCE_TYPE_HUMAN_NPC_MALE_10; + if (sCom == "HUMAN_NPC_MALE_11") + return APPEARANCE_TYPE_HUMAN_NPC_MALE_11; + if (sCom == "HUMAN_NPC_MALE_12") + return APPEARANCE_TYPE_HUMAN_NPC_MALE_12; + if (sCom == "HUMAN_NPC_MALE_13") + return APPEARANCE_TYPE_HUMAN_NPC_MALE_13; + if (sCom == "HUMAN_NPC_MALE_14") + return APPEARANCE_TYPE_HUMAN_NPC_MALE_14; + if (sCom == "HUMAN_NPC_MALE_15") + return APPEARANCE_TYPE_HUMAN_NPC_MALE_15; + if (sCom == "HUMAN_NPC_MALE_16") + return APPEARANCE_TYPE_HUMAN_NPC_MALE_16; + if (sCom == "HUMAN_NPC_MALE_17") + return APPEARANCE_TYPE_HUMAN_NPC_MALE_17; + if (sCom == "HUMAN_NPC_MALE_18") + return APPEARANCE_TYPE_HUMAN_NPC_MALE_18; + if (sCom == "IMP") + return APPEARANCE_TYPE_IMP; + if (sCom == "INN_KEEPER") + return APPEARANCE_TYPE_INN_KEEPER; + if (sCom == "INTELLECT_DEVOURER") + return APPEARANCE_TYPE_INTELLECT_DEVOURER; + if (sCom == "INVISIBLE_HUMAN_MALE") + return APPEARANCE_TYPE_INVISIBLE_HUMAN_MALE; + if (sCom == "INVISIBLE_STALKER") + return APPEARANCE_TYPE_INVISIBLE_STALKER; + if (sCom == "KID_FEMALE") + return APPEARANCE_TYPE_KID_FEMALE; + if (sCom == "KID_MALE") + return APPEARANCE_TYPE_KID_MALE; + if (sCom == "KOBOLD_A") + return APPEARANCE_TYPE_KOBOLD_A; + if (sCom == "KOBOLD_B") + return APPEARANCE_TYPE_KOBOLD_B; + if (sCom == "KOBOLD_CHIEF_A") + return APPEARANCE_TYPE_KOBOLD_CHIEF_A; + if (sCom == "KOBOLD_CHIEF_B") + return APPEARANCE_TYPE_KOBOLD_CHIEF_B; + if (sCom == "KOBOLD_SHAMAN_A") + return APPEARANCE_TYPE_KOBOLD_SHAMAN_A; + if (sCom == "KOBOLD_SHAMAN_B") + return APPEARANCE_TYPE_KOBOLD_SHAMAN_B; + if (sCom == "LANTERN_ARCHON") + return APPEARANCE_TYPE_LANTERN_ARCHON; + if (sCom == "LICH") + return APPEARANCE_TYPE_LICH; + if (sCom == "LIZARDFOLK_A") + return APPEARANCE_TYPE_LIZARDFOLK_A; + if (sCom == "LIZARDFOLK_B") + return APPEARANCE_TYPE_LIZARDFOLK_B; + if (sCom == "LIZARDFOLK_SHAMAN_A") + return APPEARANCE_TYPE_LIZARDFOLK_SHAMAN_A; + if (sCom == "LIZARDFOLK_SHAMAN_B") + return APPEARANCE_TYPE_LIZARDFOLK_SHAMAN_B; + if (sCom == "LIZARDFOLK_WARRIOR_A") + return APPEARANCE_TYPE_LIZARDFOLK_WARRIOR_A; + if (sCom == "LIZARDFOLK_WARRIOR_B") + return APPEARANCE_TYPE_LIZARDFOLK_WARRIOR_B; + if (sCom == "LUSKAN_GUARD") + return APPEARANCE_TYPE_LUSKAN_GUARD; + if (sCom == "MALE_01") + return APPEARANCE_TYPE_MALE_01; + if (sCom == "MALE_02") + return APPEARANCE_TYPE_MALE_02; + if (sCom == "MALE_03") + return APPEARANCE_TYPE_MALE_03; + if (sCom == "MALE_04") + return APPEARANCE_TYPE_MALE_04; + if (sCom == "MALE_05") + return APPEARANCE_TYPE_MALE_05; + if (sCom == "MANTICORE") + return APPEARANCE_TYPE_MANTICORE; + if (sCom == "MEDUSA") + return APPEARANCE_TYPE_MEDUSA; + if (sCom == "MEPHIT_AIR") + return APPEARANCE_TYPE_MEPHIT_AIR; + if (sCom == "MEPHIT_DUST") + return APPEARANCE_TYPE_MEPHIT_DUST; + if (sCom == "MEPHIT_EARTH") + return APPEARANCE_TYPE_MEPHIT_EARTH; + if (sCom == "MEPHIT_FIRE") + return APPEARANCE_TYPE_MEPHIT_FIRE; + if (sCom == "MEPHIT_ICE") + return APPEARANCE_TYPE_MEPHIT_ICE; + if (sCom == "MEPHIT_MAGMA") + return APPEARANCE_TYPE_MEPHIT_MAGMA; + if (sCom == "MEPHIT_OOZE") + return APPEARANCE_TYPE_MEPHIT_OOZE; + if (sCom == "MEPHIT_SALT") + return APPEARANCE_TYPE_MEPHIT_SALT; + if (sCom == "MEPHIT_STEAM") + return APPEARANCE_TYPE_MEPHIT_STEAM; + if (sCom == "MEPHIT_WATER") + return APPEARANCE_TYPE_MEPHIT_WATER; + if (sCom == "MINOGON") + return APPEARANCE_TYPE_MINOGON; + if (sCom == "MINOTAUR") + return APPEARANCE_TYPE_MINOTAUR; + if (sCom == "MINOTAUR_CHIEFTAIN") + return APPEARANCE_TYPE_MINOTAUR_CHIEFTAIN; + if (sCom == "MINOTAUR_SHAMAN") + return APPEARANCE_TYPE_MINOTAUR_SHAMAN; + if (sCom == "MOHRG") + return APPEARANCE_TYPE_MOHRG; + if (sCom == "MUMMY_COMMON") + return APPEARANCE_TYPE_MUMMY_COMMON; + if (sCom == "MUMMY_FIGHTER_2") + return APPEARANCE_TYPE_MUMMY_FIGHTER_2; + if (sCom == "MUMMY_GREATER") + return APPEARANCE_TYPE_MUMMY_GREATER; + if (sCom == "MUMMY_WARRIOR") + return APPEARANCE_TYPE_MUMMY_WARRIOR; + if (sCom == "NW_MILITIA_MEMBER") + return APPEARANCE_TYPE_NW_MILITIA_MEMBER; + if (sCom == "NWN_AARIN") + return APPEARANCE_TYPE_NWN_AARIN; + if (sCom == "NWN_ARIBETH_EVIL") + return APPEARANCE_TYPE_NWN_ARIBETH_EVIL; + if (sCom == "NWN_HAEDRALINE") + return APPEARANCE_TYPE_NWN_HAEDRALINE; + if (sCom == "NWN_MAUGRIM") + return APPEARANCE_TYPE_NWN_MAUGRIM; + if (sCom == "NWN_MORAG") + return APPEARANCE_TYPE_NWN_MORAG; + if (sCom == "NWN_NASHER") + return APPEARANCE_TYPE_NWN_NASHER; + if (sCom == "NWN_SEDOS") + return APPEARANCE_TYPE_NWN_SEDOS; + if (sCom == "NYMPH") + return APPEARANCE_TYPE_NYMPH; + if (sCom == "OGRE") + return APPEARANCE_TYPE_OGRE; + if (sCom == "OGRE_CHIEFTAIN") + return APPEARANCE_TYPE_OGRE_CHIEFTAIN; + if (sCom == "OGRE_CHIEFTAINB") + return APPEARANCE_TYPE_OGRE_CHIEFTAINB; + if (sCom == "OGRE_MAGE") + return APPEARANCE_TYPE_OGRE_MAGE; + if (sCom == "OGRE_MAGEB") + return APPEARANCE_TYPE_OGRE_MAGEB; + if (sCom == "OGREB") + return APPEARANCE_TYPE_OGREB; + if (sCom == "OLD_MAN") + return APPEARANCE_TYPE_OLD_MAN; + if (sCom == "OLD_WOMAN") + return APPEARANCE_TYPE_OLD_WOMAN; + if (sCom == "ORC_A") + return APPEARANCE_TYPE_ORC_A; + if (sCom == "ORC_B") + return APPEARANCE_TYPE_ORC_B; + if (sCom == "ORC_CHIEFTAIN_A") + return APPEARANCE_TYPE_ORC_CHIEFTAIN_A; + if (sCom == "ORC_CHIEFTAIN_B") + return APPEARANCE_TYPE_ORC_CHIEFTAIN_B; + if (sCom == "ORC_SHAMAN_A") + return APPEARANCE_TYPE_ORC_SHAMAN_A; + if (sCom == "ORC_SHAMAN_B") + return APPEARANCE_TYPE_ORC_SHAMAN_B; + if (sCom == "OX") + return APPEARANCE_TYPE_OX; + if (sCom == "PENGUIN") + return APPEARANCE_TYPE_PENGUIN; + if (sCom == "PLAGUE_VICTIM") + return APPEARANCE_TYPE_PLAGUE_VICTIM; + if (sCom == "PROSTITUTE_01") + return APPEARANCE_TYPE_PROSTITUTE_01; + if (sCom == "PROSTITUTE_02") + return APPEARANCE_TYPE_PROSTITUTE_02; + if (sCom == "PSEUDODRAGON") + return APPEARANCE_TYPE_PSEUDODRAGON; + if (sCom == "QUASIT") + return APPEARANCE_TYPE_QUASIT; + if (sCom == "RAKSHASA_BEAR_MALE") + return APPEARANCE_TYPE_RAKSHASA_BEAR_MALE; + if (sCom == "RAKSHASA_TIGER_FEMALE") + return APPEARANCE_TYPE_RAKSHASA_TIGER_FEMALE; + if (sCom == "RAKSHASA_TIGER_MALE") + return APPEARANCE_TYPE_RAKSHASA_TIGER_MALE; + if (sCom == "RAKSHASA_WOLF_MALE") + return APPEARANCE_TYPE_RAKSHASA_WOLF_MALE; + if (sCom == "RAT") + return APPEARANCE_TYPE_RAT; + if (sCom == "RAT_DIRE") + return APPEARANCE_TYPE_RAT_DIRE; + if (sCom == "RAVEN") + return APPEARANCE_TYPE_RAVEN; + if (sCom == "SHADOW") + return APPEARANCE_TYPE_SHADOW; + if (sCom == "SHADOW_FIEND") + return APPEARANCE_TYPE_SHADOW_FIEND; + if (sCom == "SHIELD_GUARDIAN") + return APPEARANCE_TYPE_SHIELD_GUARDIAN; + if (sCom == "SHOP_KEEPER") + return APPEARANCE_TYPE_SHOP_KEEPER; + if (sCom == "SKELETAL_DEVOURER") + return APPEARANCE_TYPE_SKELETAL_DEVOURER; + if (sCom == "SKELETON_CHIEFTAIN") + return APPEARANCE_TYPE_SKELETON_CHIEFTAIN; + if (sCom == "SKELETON_COMMON") + return APPEARANCE_TYPE_SKELETON_COMMON; + if (sCom == "SKELETON_MAGE") + return APPEARANCE_TYPE_SKELETON_MAGE; + if (sCom == "SKELETON_WARRIOR") + return APPEARANCE_TYPE_SKELETON_WARRIOR; + if (sCom == "SKELETON_PRIEST") + return APPEARANCE_TYPE_SKELETON_PRIEST; + if (sCom == "SKELETON_WARRIOR_1") + return APPEARANCE_TYPE_SKELETON_WARRIOR_1; + if (sCom == "SKELETON_WARRIOR_2") + return APPEARANCE_TYPE_SKELETON_WARRIOR_2; + if (sCom == "SPHINX") + return APPEARANCE_TYPE_SPHINX; + if (sCom == "SPIDER_WRAITH") + return APPEARANCE_TYPE_SPIDER_WRAITH; + if (sCom == "STINGER") + return APPEARANCE_TYPE_STINGER; + if (sCom == "STINGER_CHIEFTAIN") + return APPEARANCE_TYPE_STINGER_CHIEFTAIN; + if (sCom == "STINGER_MAGE") + return APPEARANCE_TYPE_STINGER_MAGE; + if (sCom == "STINGER_WARRIOR") + return APPEARANCE_TYPE_STINGER_WARRIOR; + if (sCom == "SUCCUBUS") + return APPEARANCE_TYPE_SUCCUBUS; + if (sCom == "TROLL") + return APPEARANCE_TYPE_TROLL; + if (sCom == "TROLL_CHIEFTAIN") + return APPEARANCE_TYPE_TROLL_CHIEFTAIN; + if (sCom == "TROLL_SHAMAN") + return APPEARANCE_TYPE_TROLL_SHAMAN; + if (sCom == "UMBERHULK") + return APPEARANCE_TYPE_UMBERHULK; + if (sCom == "UTHGARD_ELK_TRIBE") + return APPEARANCE_TYPE_UTHGARD_ELK_TRIBE; + if (sCom == "UTHGARD_TIGER_TRIBE") + return APPEARANCE_TYPE_UTHGARD_TIGER_TRIBE; + if (sCom == "VAMPIRE_FEMALE") + return APPEARANCE_TYPE_VAMPIRE_FEMALE; + if (sCom == "VAMPIRE_MALE") + return APPEARANCE_TYPE_VAMPIRE_MALE; + if (sCom == "VROCK") + return APPEARANCE_TYPE_VROCK; + if (sCom == "WAITRESS") + return APPEARANCE_TYPE_WAITRESS; + if (sCom == "WAR_DEVOURER") + return APPEARANCE_TYPE_WAR_DEVOURER; + if (sCom == "WERECAT") + return APPEARANCE_TYPE_WERECAT; + if (sCom == "WERERAT") + return APPEARANCE_TYPE_WERERAT; + if (sCom == "WEREWOLF") + return APPEARANCE_TYPE_WEREWOLF; + if (sCom == "WIGHT") + return APPEARANCE_TYPE_WIGHT; + if (sCom == "WILL_O_WISP") + return APPEARANCE_TYPE_WILL_O_WISP; + if (sCom == "WRAITH") + return APPEARANCE_TYPE_WRAITH; + if (sCom == "WYRMLING_BLACK") + return APPEARANCE_TYPE_WYRMLING_BLACK; + if (sCom == "WYRMLING_BLUE") + return APPEARANCE_TYPE_WYRMLING_BLUE; + if (sCom == "WYRMLING_BRASS") + return APPEARANCE_TYPE_WYRMLING_BRASS; + if (sCom == "WYRMLING_BRONZE") + return APPEARANCE_TYPE_WYRMLING_BRONZE; + if (sCom == "WYRMLING_COPPER") + return APPEARANCE_TYPE_WYRMLING_COPPER; + if (sCom == "WYRMLING_GOLD") + return APPEARANCE_TYPE_WYRMLING_GOLD; + if (sCom == "WYRMLING_GREEN") + return APPEARANCE_TYPE_WYRMLING_GREEN; + if (sCom == "WYRMLING_RED") + return APPEARANCE_TYPE_WYRMLING_RED; + if (sCom == "WYRMLING_SILVER") + return APPEARANCE_TYPE_WYRMLING_SILVER; + if (sCom == "WYRMLING_WHITE") + return APPEARANCE_TYPE_WYRMLING_WHITE; + if (sCom == "YUAN_TI") + return APPEARANCE_TYPE_YUAN_TI; + if (sCom == "YUAN_TI_CHIEFTEN") + return APPEARANCE_TYPE_YUAN_TI_CHIEFTEN; + if (sCom == "YUAN_TI_WIZARD") + return APPEARANCE_TYPE_YUAN_TI_WIZARD; + if (sCom == "ZOMBIE") + return APPEARANCE_TYPE_ZOMBIE; + if (sCom == "ZOMBIE_ROTTING") + return APPEARANCE_TYPE_ZOMBIE_ROTTING; + if (sCom == "ZOMBIE_TYRANT_FOG") + return APPEARANCE_TYPE_ZOMBIE_TYRANT_FOG; + if (sCom == "ZOMBIE_WARRIOR_1") + return APPEARANCE_TYPE_ZOMBIE_WARRIOR_1; + if (sCom == "ZOMBIE_WARRIOR_2") + return APPEARANCE_TYPE_ZOMBIE_WARRIOR_2; + + // new 1.09 behavior - also check against the 2da + string s2daval; + int i = 0; + while (1) + { + s2daval = Get2DAString("appearance", "NAME", i); + if (s2daval == "") break; // end of file + s2daval = Get2DAString("appearance", "LABEL", i); + if (s2daval != "") + { + if (GetStringUpperCase(sCom) == GetStringUpperCase(s2daval)) return i; + } + i++; + } + return -1; +} + +//////////////////////////////////////////////////////////////////////// +void dmw_CleanUp(object oMySpeaker) +{ + int nCount; + int nCache; + //DeleteLocalObject(oMySpeaker, "dmfi_univ_target"); + DeleteLocalLocation(oMySpeaker, "dmfi_univ_location"); + DeleteLocalObject(oMySpeaker, "dmw_item"); + DeleteLocalString(oMySpeaker, "dmw_repamt"); + DeleteLocalString(oMySpeaker, "dmw_repargs"); + nCache = GetLocalInt(oMySpeaker, "dmw_playercache"); + for (nCount = 1; nCount <= nCache; nCount++) + { + DeleteLocalObject(oMySpeaker, "dmw_playercache" + IntToString(nCount)); + } + DeleteLocalInt(oMySpeaker, "dmw_playercache"); + nCache = GetLocalInt(oMySpeaker, "dmw_itemcache"); + for (nCount = 1; nCount <= nCache; nCount++) + { + DeleteLocalObject(oMySpeaker, "dmw_itemcache" + IntToString(nCount)); + } + DeleteLocalInt(oMySpeaker, "dmw_itemcache"); + for (nCount = 1; nCount <= 10; nCount++) + { + DeleteLocalString(oMySpeaker, "dmw_dialog" + IntToString(nCount)); + DeleteLocalString(oMySpeaker, "dmw_function" + IntToString(nCount)); + DeleteLocalString(oMySpeaker, "dmw_params" + IntToString(nCount)); + } + DeleteLocalString(oMySpeaker, "dmw_playerfunc"); + DeleteLocalInt(oMySpeaker, "dmw_started"); +} + +//////////////////////////////////////////////////////////////////////// +//Smoking Function by Jason Robinson +location GetLocationAboveAndInFrontOf(object oPC, float fDist, float fHeight) +{ + float fDistance = -fDist; + object oTarget = (oPC); + object oArea = GetArea(oTarget); + vector vPosition = GetPosition(oTarget); + vPosition.z += fHeight; + float fOrientation = GetFacing(oTarget); + vector vNewPos = AngleToVector(fOrientation); + float vZ = vPosition.z; + float vX = vPosition.x - fDistance * vNewPos.x; + float vY = vPosition.y - fDistance * vNewPos.y; + fOrientation = GetFacing(oTarget); + vX = vPosition.x - fDistance * vNewPos.x; + vY = vPosition.y - fDistance * vNewPos.y; + vNewPos = AngleToVector(fOrientation); + vZ = vPosition.z; + vNewPos = Vector(vX, vY, vZ); + return Location(oArea, vNewPos, fOrientation); +} + +//////////////////////////////////////////////////////////////////////// +//Smoking Function by Jason Robinson +void SmokePipe(object oActivator) +{ + string sEmote1 = "*puffs on a pipe*"; + string sEmote2 = "*inhales from a pipe*"; + string sEmote3 = "*pulls a mouthful of smoke from a pipe*"; + float fHeight = 1.7; + float fDistance = 0.1; + // Set height based on race and gender + if (GetGender(oActivator) == GENDER_MALE) + { + switch (GetRacialType(oActivator)) + { + case RACIAL_TYPE_HUMAN: + case RACIAL_TYPE_HALFELF: fHeight = 1.7; fDistance = 0.12; break; + case RACIAL_TYPE_ELF: fHeight = 1.55; fDistance = 0.08; break; + case RACIAL_TYPE_GNOME: + case RACIAL_TYPE_HALFLING: fHeight = 1.15; fDistance = 0.12; break; + case RACIAL_TYPE_DWARF: fHeight = 1.2; fDistance = 0.12; break; + case RACIAL_TYPE_HALFORC: fHeight = 1.9; fDistance = 0.2; break; + } + } + else + { + // FEMALES + switch (GetRacialType(oActivator)) + { + case RACIAL_TYPE_HUMAN: + case RACIAL_TYPE_HALFELF: fHeight = 1.6; fDistance = 0.12; break; + case RACIAL_TYPE_ELF: fHeight = 1.45; fDistance = 0.12; break; + case RACIAL_TYPE_GNOME: + case RACIAL_TYPE_HALFLING: fHeight = 1.1; fDistance = 0.075; break; + case RACIAL_TYPE_DWARF: fHeight = 1.2; fDistance = 0.1; break; + case RACIAL_TYPE_HALFORC: fHeight = 1.8; fDistance = 0.13; break; + } + } + location lAboveHead = GetLocationAboveAndInFrontOf(oActivator, fDistance, fHeight); + // emotes + switch (d3()) + { + case 1: AssignCommand(oActivator, ActionSpeakString(sEmote1)); break; + case 2: AssignCommand(oActivator, ActionSpeakString(sEmote2)); break; + case 3: AssignCommand(oActivator, ActionSpeakString(sEmote3));break; + } + // glow red + AssignCommand(oActivator, ActionDoCommand(ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_LIGHT_RED_5), oActivator, 0.15))); + // wait a moment + AssignCommand(oActivator, ActionWait(3.0)); + // puff of smoke above and in front of head + AssignCommand(oActivator, ActionDoCommand(ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SMOKE_PUFF), lAboveHead))); + // if female, turn head to left + if ((GetGender(oActivator) == GENDER_FEMALE) && (GetRacialType(oActivator) != RACIAL_TYPE_DWARF)) + AssignCommand(oActivator, ActionPlayAnimation(ANIMATION_FIREFORGET_HEAD_TURN_LEFT, 1.0, 5.0)); +} + +//////////////////////////////////////////////////////////////////////// +void ParseEmote(string sEmote, object oPC) +{ + // allow builder to suppress + if (GetLocalInt(GetModule(), "DMFI_SUPPRESS_EMOTES") != 0) return; + + // see if PC has muted their own emotes + if (GetLocalInt(oPC, "hls_emotemute") != 0) return; + + DeleteLocalInt(oPC, "dmfi_univ_int"); + object oRightHand = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,oPC); + object oLeftHand = GetItemInSlot(INVENTORY_SLOT_LEFTHAND,oPC); + + if (GetStringLeft(sEmote, 1) == "*") + { + int iToggle; + string sBuffer; + sBuffer = GetStringRight(sEmote, GetStringLength(sEmote)-1); + while (!iToggle && GetStringLength(sBuffer) > 1) + { + if (GetStringLeft(sBuffer,1) == "*") + iToggle = abs(iToggle - 1); + sBuffer = GetStringRight(sBuffer, GetStringLength(sBuffer)-1); + } + sEmote = GetStringLeft(sEmote, GetStringLength(sEmote)-GetStringLength(sBuffer)); + } + + int iSit; + object oArea; + object oChair; + // morderon - rewrote from here to end for better text case handling + string sLCEmote = GetStringLowerCase(sEmote); + //*emote* rolls + if ((FindSubString(sLCEmote, "strength") != -1)) + SetLocalInt(oPC, "dmfi_univ_int", 61); + else if ((FindSubString(sLCEmote, "dexterity") != -1)) + SetLocalInt(oPC, "dmfi_univ_int", 62); + else if ((FindSubString(sLCEmote, "constitution") != -1)) + SetLocalInt(oPC, "dmfi_univ_int", 63); + else if ((FindSubString(sLCEmote, "intelligence") != -1)) + SetLocalInt(oPC, "dmfi_univ_int", 64); + else if ((FindSubString(sLCEmote, "wisdom") != -1)) + SetLocalInt(oPC, "dmfi_univ_int", 65); + else if ((FindSubString(sLCEmote, "charisma") != -1)) + SetLocalInt(oPC, "dmfi_univ_int", 66); + else if ((FindSubString(sLCEmote, "fortitude") != -1)) + SetLocalInt(oPC, "dmfi_univ_int", 67); + else if ((FindSubString(sLCEmote, "reflex") != -1)) + SetLocalInt(oPC, "dmfi_univ_int", 68); + else if ((FindSubString(sLCEmote, "will") != -1)) + SetLocalInt(oPC, "dmfi_univ_int", 69); + else if ((FindSubString(sLCEmote, "animal empathy") != -1)) + SetLocalInt(oPC, "dmfi_univ_int", 71); + else if ((FindSubString(sLCEmote, "appraise") != -1)) + SetLocalInt(oPC, "dmfi_univ_int", 72); + else if ((FindSubString(sLCEmote, "bluff") != -1)) + SetLocalInt(oPC, "dmfi_univ_int", 73); + else if ((FindSubString(sLCEmote, "concentration") != -1)) + SetLocalInt(oPC, "dmfi_univ_int", 74); + else if ((FindSubString(sLCEmote, "craft armor") != -1)) + SetLocalInt(oPC, "dmfi_univ_int", 75); + else if ((FindSubString(sLCEmote, "craft trap") != -1)) + SetLocalInt(oPC, "dmfi_univ_int", 76); + else if ((FindSubString(sLCEmote, "craft weapon") != -1)) + SetLocalInt(oPC, "dmfi_univ_int", 77); + else if ((FindSubString(sLCEmote, "disable trap") != -1)) + SetLocalInt(oPC, "dmfi_univ_int", 78); + else if ((FindSubString(sLCEmote, "discipline") != -1)) + SetLocalInt(oPC, "dmfi_univ_int", 79); + else if ((FindSubString(sLCEmote, "heal") != -1)) + SetLocalInt(oPC, "dmfi_univ_int", 81); + else if ((FindSubString(sLCEmote, "hide") != -1)) + SetLocalInt(oPC, "dmfi_univ_int", 82); + else if ((FindSubString(sLCEmote, "intimidate") != -1)) + SetLocalInt(oPC, "dmfi_univ_int", 83); + else if ((FindSubString(sLCEmote, "listen") != -1)) + SetLocalInt(oPC, "dmfi_univ_int", 84); + else if ((FindSubString(sLCEmote, "lore") != -1)) + SetLocalInt(oPC, "dmfi_univ_int", 85); + else if ((FindSubString(sLCEmote, "move silently") != -1)) + SetLocalInt(oPC, "dmfi_univ_int", 86); + else if ((FindSubString(sLCEmote, "open lock") != -1)) + SetLocalInt(oPC, "dmfi_univ_int", 87); + else if ((FindSubString(sLCEmote, "parry") != -1)) + SetLocalInt(oPC, "dmfi_univ_int", 88); + else if ((FindSubString(sLCEmote, "perform") != -1)) + SetLocalInt(oPC, "dmfi_univ_int", 89); + else if ((FindSubString(sLCEmote, "persuade") != -1)) + SetLocalInt(oPC, "dmfi_univ_int", 91); + else if ((FindSubString(sLCEmote, "pick pocket") != -1)) + SetLocalInt(oPC, "dmfi_univ_int", 92); + else if ((FindSubString(sLCEmote, "search") != -1)) + SetLocalInt(oPC, "dmfi_univ_int", 93); + else if ((FindSubString(sLCEmote, "set trap") != -1)) + SetLocalInt(oPC, "dmfi_univ_int", 94); + else if ((FindSubString(sLCEmote, "spellcraft") != -1)) + SetLocalInt(oPC, "dmfi_univ_int", 95); + else if ((FindSubString(sLCEmote, "spot") != -1)) + SetLocalInt(oPC, "dmfi_univ_int", 96); + else if ((FindSubString(sLCEmote, "taunt") != -1)) + SetLocalInt(oPC, "dmfi_univ_int", 97); + else if ((FindSubString(sLCEmote, "tumble") != -1)) + SetLocalInt(oPC, "dmfi_univ_int", 98); + else if ((FindSubString(sLCEmote, "use magic device") != -1)) + SetLocalInt(oPC, "dmfi_univ_int", 99); + else if ((FindSubString(sLCEmote, "ride") != -1)) + SetLocalInt(oPC, "dmfi_univ_int", 90); + if (GetLocalInt(oPC, "dmfi_univ_int")) + { + SetLocalString(oPC, "dmfi_univ_conv", "pc_dicebag"); + ExecuteScript("dmfi_execute", oPC); + return; + } + + //*emote* + if (FindSubString(GetStringLowerCase(sEmote), "*bows") != -1 || + FindSubString(GetStringLowerCase(sEmote), " bows") != -1 || + FindSubString(GetStringLowerCase(sEmote), "curtsey") != -1) + AssignCommand(oPC, PlayAnimation(ANIMATION_FIREFORGET_BOW, 1.0)); + else if (FindSubString(GetStringLowerCase(sEmote), "drink") != -1 || + FindSubString(GetStringLowerCase(sEmote), "sips") != -1) + AssignCommand(oPC, PlayAnimation(ANIMATION_FIREFORGET_DRINK, 1.0)); + else if (FindSubString(GetStringLowerCase(sEmote), "drinks") != -1 && + FindSubString(GetStringLowerCase(sEmote), "sits") != -1) + { + AssignCommand(oPC, ActionPlayAnimation( ANIMATION_LOOPING_SIT_CROSS, 1.0, 99999.0f)); + DelayCommand(1.0f, AssignCommand(oPC, PlayAnimation( ANIMATION_FIREFORGET_DRINK, 1.0))); + DelayCommand(3.0f, AssignCommand(oPC, PlayAnimation( ANIMATION_LOOPING_SIT_CROSS, 1.0, 99999.0))); + } + else if (FindSubString(GetStringLowerCase(sEmote), "reads") != -1 && + FindSubString(GetStringLowerCase(sEmote), "sits") != -1) + { + AssignCommand(oPC, ActionPlayAnimation( ANIMATION_LOOPING_SIT_CROSS, 1.0, 99999.0f)); + DelayCommand(1.0f, AssignCommand(oPC, PlayAnimation( ANIMATION_FIREFORGET_READ, 1.0))); + DelayCommand(3.0f, AssignCommand(oPC, PlayAnimation( ANIMATION_LOOPING_SIT_CROSS, 1.0, 99999.0))); + } + else if (FindSubString(GetStringLowerCase(sEmote), "sit")!= -1) + { + AssignCommand(oPC, ActionPlayAnimation( ANIMATION_LOOPING_SIT_CROSS, 1.0, 99999.0f)); + } + else if (FindSubString(GetStringLowerCase(sEmote), "greet")!= -1 || + FindSubString(GetStringLowerCase(sEmote), "wave") != -1) + AssignCommand(oPC, PlayAnimation(ANIMATION_FIREFORGET_GREETING, 1.0)); + else if (FindSubString(GetStringLowerCase(sEmote), "yawn")!= -1 || + FindSubString(GetStringLowerCase(sEmote), "stretch") != -1 || + FindSubString(GetStringLowerCase(sEmote), "bored") != -1) + AssignCommand(oPC, PlayAnimation(ANIMATION_FIREFORGET_PAUSE_BORED, 1.0)); + else if (FindSubString(GetStringLowerCase(sEmote), "scratch")!= -1) + { + AssignCommand(oPC,ActionUnequipItem(oRightHand)); + AssignCommand(oPC,ActionUnequipItem(oLeftHand)); + AssignCommand(oPC, PlayAnimation(ANIMATION_FIREFORGET_PAUSE_SCRATCH_HEAD, 1.0)); + } + else if (FindSubString(GetStringLowerCase(sEmote), "*reads")!= -1 || + FindSubString(GetStringLowerCase(sEmote), " reads")!= -1|| + FindSubString(GetStringLowerCase(sEmote), "read")!= -1) + AssignCommand(oPC, PlayAnimation(ANIMATION_FIREFORGET_READ, 1.0)); + else if (FindSubString(GetStringLowerCase(sEmote), "salute")!= -1) + { + AssignCommand(oPC,ActionUnequipItem(oRightHand)); + AssignCommand(oPC,ActionUnequipItem(oLeftHand)); + AssignCommand(oPC, PlayAnimation(ANIMATION_FIREFORGET_SALUTE, 1.0)); + } + else if (FindSubString(GetStringLowerCase(sEmote), "steal")!= -1 || + FindSubString(GetStringLowerCase(sEmote), "swipe") != -1) + AssignCommand(oPC, PlayAnimation(ANIMATION_FIREFORGET_STEAL, 1.0)); + else if (FindSubString(GetStringLowerCase(sEmote), "taunt")!= -1 || + FindSubString(GetStringLowerCase(sEmote), "mock") != -1) + { + PlayVoiceChat(VOICE_CHAT_TAUNT, oPC); + AssignCommand(oPC, PlayAnimation(ANIMATION_FIREFORGET_TAUNT, 1.0)); + } + else if ((FindSubString(GetStringLowerCase(sEmote), "smokes") != -1)|| + (FindSubString(GetStringLowerCase(sEmote), "smoke") != -1)) + { + SmokePipe(oPC); + } + else if (FindSubString(GetStringLowerCase(sEmote), "cheer ")!= -1 || + FindSubString(GetStringLowerCase(sEmote), "cheer*")!= -1) + { + PlayVoiceChat(VOICE_CHAT_CHEER, oPC); + AssignCommand(oPC, PlayAnimation(ANIMATION_FIREFORGET_VICTORY1, 1.0)); + } + else if (FindSubString(GetStringLowerCase(sEmote), "hooray")!= -1) + { + PlayVoiceChat(VOICE_CHAT_CHEER, oPC); + AssignCommand(oPC, PlayAnimation(ANIMATION_FIREFORGET_VICTORY2, 1.0)); + } + else if (FindSubString(GetStringLowerCase(sEmote), "celebrate")!= -1) + { + PlayVoiceChat(VOICE_CHAT_CHEER, oPC); + AssignCommand(oPC, PlayAnimation(ANIMATION_FIREFORGET_VICTORY3, 1.0)); + } + else if (FindSubString(GetStringLowerCase(sEmote), "giggle")!= -1 && GetGender(oPC) == GENDER_FEMALE) + AssignCommand(oPC, PlaySound("vs_fshaldrf_haha")); + else if (FindSubString(GetStringLowerCase(sEmote), "flop")!= -1 || + FindSubString(GetStringLowerCase(sEmote), "prone")!= -1) + AssignCommand(oPC, ActionPlayAnimation(ANIMATION_LOOPING_DEAD_FRONT, 1.0, 99999.0)); + else if (FindSubString(GetStringLowerCase(sEmote), "bends")!= -1 || + FindSubString(GetStringLowerCase(sEmote), "stoop")!= -1) + AssignCommand(oPC, ActionPlayAnimation(ANIMATION_LOOPING_GET_LOW, 1.0, 99999.0)); + else if (FindSubString(GetStringLowerCase(sEmote), "fiddle")!= -1) + AssignCommand(oPC, ActionPlayAnimation(ANIMATION_LOOPING_GET_MID, 1.0, 5.0)); + else if (FindSubString(GetStringLowerCase(sEmote), "nod")!= -1 || + FindSubString(GetStringLowerCase(sEmote), "agree")!= -1) + AssignCommand(oPC, ActionPlayAnimation(ANIMATION_LOOPING_LISTEN, 1.0, 4.0)); + else if (FindSubString(GetStringLowerCase(sEmote), "peers")!= -1 || + FindSubString(GetStringLowerCase(sEmote), "scans")!= -1 || + FindSubString(GetStringLowerCase(sEmote), "search")!= -1) + AssignCommand(oPC,ActionPlayAnimation(ANIMATION_LOOPING_LOOK_FAR, 1.0, 99999.0)); + else if (FindSubString(GetStringLowerCase(sEmote), "*pray")!= -1 || + FindSubString(GetStringLowerCase(sEmote), " pray")!= -1 || + FindSubString(GetStringLowerCase(sEmote), "meditate")!= -1) + { + AssignCommand(oPC,ActionUnequipItem(oRightHand)); + AssignCommand(oPC,ActionUnequipItem(oLeftHand)); + AssignCommand(oPC,ActionPlayAnimation(ANIMATION_LOOPING_MEDITATE, 1.0, 99999.0)); + } + else if (FindSubString(GetStringLowerCase(sEmote), "drunk")!= -1 || + FindSubString(GetStringLowerCase(sEmote), "woozy")!= -1) + AssignCommand(oPC, ActionPlayAnimation(ANIMATION_LOOPING_PAUSE_DRUNK, 1.0, 99999.0)); + else if (FindSubString(GetStringLowerCase(sEmote), "tired")!= -1 || + FindSubString(GetStringLowerCase(sEmote), "fatigue")!= -1 || + FindSubString(GetStringLowerCase(sEmote), "exhausted")!= -1) + { + PlayVoiceChat(VOICE_CHAT_REST, oPC); + AssignCommand(oPC, ActionPlayAnimation(ANIMATION_LOOPING_PAUSE_TIRED, 1.0, 3.0)); + } + else if (FindSubString(GetStringLowerCase(sEmote), "fidget")!= -1 || + FindSubString(GetStringLowerCase(sEmote), "shifts")!= -1) + AssignCommand(oPC, ActionPlayAnimation(ANIMATION_LOOPING_PAUSE2, 1.0, 99999.0)); + else if (FindSubString(GetStringLowerCase(sEmote), "sits")!= -1 && + (FindSubString(GetStringLowerCase(sEmote), "floor")!= -1 || + FindSubString(GetStringLowerCase(sEmote), "ground")!= -1)) + AssignCommand(oPC, ActionPlayAnimation(ANIMATION_LOOPING_SIT_CROSS, 1.0, 99999.0)); + else if (FindSubString(GetStringLowerCase(sEmote), "demand")!= -1 || + FindSubString(GetStringLowerCase(sEmote), "threaten")!= -1) + AssignCommand(oPC, ActionPlayAnimation(ANIMATION_LOOPING_TALK_FORCEFUL, 1.0, 99999.0)); + else if (FindSubString(GetStringLowerCase(sEmote), "laugh")!= -1 || + FindSubString(GetStringLowerCase(sEmote), "chuckle")!= -1) + { + PlayVoiceChat(VOICE_CHAT_LAUGH, oPC); + AssignCommand(oPC, ActionPlayAnimation(ANIMATION_LOOPING_TALK_LAUGHING, 1.0, 2.0)); + } + else if (FindSubString(GetStringLowerCase(sEmote), "begs")!= -1 || + FindSubString(GetStringLowerCase(sEmote), "plead")!= -1) + AssignCommand(oPC, ActionPlayAnimation(ANIMATION_LOOPING_TALK_PLEADING, 1.0, 99999.0)); + else if (FindSubString(GetStringLowerCase(sEmote), "worship")!= -1) + AssignCommand(oPC, ActionPlayAnimation(ANIMATION_LOOPING_WORSHIP, 1.0, 99999.0)); + else if (FindSubString(GetStringLowerCase(sEmote), "snore")!= -1 || + FindSubString(GetStringLowerCase(sEmote), "*naps")!= -1 || + FindSubString(GetStringLowerCase(sEmote), " naps")!= -1|| + FindSubString(GetStringLowerCase(sEmote), "nap")!= -1) + ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_SLEEP), oPC); + else if (FindSubString(GetStringLowerCase(sEmote), "*sings")!= -1 || + FindSubString(GetStringLowerCase(sEmote), " sings")!= -1 || + FindSubString(GetStringLowerCase(sEmote), "hums")!= -1) + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_BARD_SONG), oPC, 6.0f); + else if (FindSubString(GetStringLowerCase(sEmote), "whistles")!= -1) + AssignCommand(oPC, PlaySound("as_pl_whistle2")); + else if (FindSubString(GetStringLowerCase(sEmote), "talks")!= -1 || + FindSubString(GetStringLowerCase(sEmote), "chats")!= -1) + AssignCommand(oPC, ActionPlayAnimation(ANIMATION_LOOPING_TALK_NORMAL, 1.0, 99999.0)); + else if (FindSubString(GetStringLowerCase(sEmote), "shakes head")!= -1) + { + AssignCommand(oPC, PlayAnimation(ANIMATION_FIREFORGET_HEAD_TURN_LEFT, 1.0, 0.25f)); + DelayCommand(0.15f, AssignCommand(oPC, PlayAnimation(ANIMATION_FIREFORGET_HEAD_TURN_RIGHT, 1.0, 0.25f))); + DelayCommand(0.40f, AssignCommand(oPC, PlayAnimation(ANIMATION_FIREFORGET_HEAD_TURN_LEFT, 1.0, 0.25f))); + DelayCommand(0.65f, AssignCommand(oPC, PlayAnimation(ANIMATION_FIREFORGET_HEAD_TURN_RIGHT, 1.0, 0.25f))); + } + else if (FindSubString(GetStringLowerCase(sEmote), "ducks")!= -1) + AssignCommand(oPC, ActionPlayAnimation(ANIMATION_FIREFORGET_DODGE_DUCK, 1.0, 99999.0)); + else if (FindSubString(GetStringLowerCase(sEmote), "dodge")!= -1) + AssignCommand(oPC, ActionPlayAnimation(ANIMATION_FIREFORGET_DODGE_SIDE, 1.0, 99999.0)); + else if (FindSubString(GetStringLowerCase(sEmote), "cantrip")!= -1) + AssignCommand(oPC, ActionPlayAnimation(ANIMATION_LOOPING_CONJURE1, 1.0, 99999.0)); + else if (FindSubString(GetStringLowerCase(sEmote), "spellcast")!= -1) + AssignCommand(oPC, ActionPlayAnimation(ANIMATION_LOOPING_CONJURE2, 1.0, 99999.0)); + else if (FindSubString(GetStringLowerCase(sEmote), "fall")!= -1 && + FindSubString(GetStringLowerCase(sEmote), "back")!= -1) + AssignCommand(oPC, ActionPlayAnimation(ANIMATION_LOOPING_DEAD_BACK, 1.0, 99999.0)); + else if (FindSubString(GetStringLowerCase(sEmote), "spasm")!= -1) + AssignCommand(oPC, ActionPlayAnimation(ANIMATION_LOOPING_SPASM, 1.0, 99999.0)); +} + +//////////////////////////////////////////////////////////////////////// +string ConvertCustom(string sLetter, int iRotate) +{ + if (GetStringLength(sLetter) > 1) + sLetter = GetStringLeft(sLetter, 1); + + //Functional groups for custom languages + //Vowel Sounds: a, e, i, o, u + //Hard Sounds: b, d, k, p, t + //Sibilant Sounds: c, f, s, q, w + //Soft Sounds: g, h, l, r, y + //Hummed Sounds: j, m, n, v, z + //Oddball out: x, the rarest letter in the alphabet + + string sTranslate = "aeiouAEIOUbdkptBDKPTcfsqwCFSQWghlryGHLRYjmnvzJMNVZxX"; + int iTrans = FindSubString(sTranslate, sLetter); + if (iTrans == -1) return sLetter; //return any character that isn't on the cipher + + //Now here's the tricky part... recalculating the offsets according functional + //letter group, to produce an huge variety of "new" languages. + + int iOffset = iRotate % 5; + int iGroup = iTrans / 5; + int iBonus = iTrans / 10; + int iMultiplier = iRotate / 5; + iOffset = iTrans + iOffset + (iMultiplier * iBonus); + + return GetSubString(sTranslate, iGroup * 5 + iOffset % 5, 1); +}//end ConvertCustom + +//////////////////////////////////////////////////////////////////////// +string ProcessCustom(string sPhrase, int iLanguage) +{ + string sOutput; + int iToggle; + while (GetStringLength(sPhrase) > 1) + { + if (GetStringLeft(sPhrase,1) == "*") + iToggle = abs(iToggle - 1); + if (iToggle) + sOutput = sOutput + GetStringLeft(sPhrase,1); + else + sOutput = sOutput + ConvertCustom(GetStringLeft(sPhrase, 1), iLanguage); + sPhrase = GetStringRight(sPhrase, GetStringLength(sPhrase)-1); + } + return sOutput; +} + +//////////////////////////////////////////////////////////////////////// +string ConvertDrow(string sLetter) +{ + if (GetStringLength(sLetter) > 1) + sLetter = GetStringLeft(sLetter, 1); + string sTranslate = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + int iTrans = FindSubString(sTranslate, sLetter); + + switch (iTrans) + { + case 0: return "il"; + case 26: return "Il"; + case 1: return "f"; + case 27: return "F"; + case 2: return "st"; + case 28: return "St"; + case 3: return "w"; + case 4: return "a"; + case 5: return "o"; + case 6: return "v"; + case 7: return "ir"; + case 33: return "Ir"; + case 8: return "e"; + case 9: return "vi"; + case 35: return "Vi"; + case 10: return "go"; + case 11: return "c"; + case 12: return "li"; + case 13: return "l"; + case 14: return "e"; + case 15: return "ty"; + case 41: return "Ty"; + case 16: return "r"; + case 17: return "m"; + case 18: return "la"; + case 44: return "La"; + case 19: return "an"; + case 45: return "An"; + case 20: return "y"; + case 21: return "el"; + case 47: return "El"; + case 22: return "ky"; + case 48: return "Ky"; + case 23: return "'"; + case 24: return "a"; + case 25: return "p'"; + case 29: return "W"; + case 30: return "A"; + case 31: return "O"; + case 32: return "V"; + case 34: return "E"; + case 36: return "Go"; + case 37: return "C"; + case 38: return "Li"; + case 39: return "L"; + case 40: return "E"; + case 42: return "R"; + case 43: return "M"; + case 46: return "Y"; + case 49: return "'"; + case 50: return "A"; + case 51: return "P'"; + + default: return sLetter; + } return ""; +} + +//////////////////////////////////////////////////////////////////////// +string ProcessDrow(string sPhrase) +{ + string sOutput; + int iToggle; + while (GetStringLength(sPhrase) > 1) + { + if (GetStringLeft(sPhrase,1) == "*") + iToggle = abs(iToggle - 1); + if (iToggle) + sOutput = sOutput + GetStringLeft(sPhrase,1); + else + sOutput = sOutput + ConvertDrow(GetStringLeft(sPhrase, 1)); + + sPhrase = GetStringRight(sPhrase, GetStringLength(sPhrase)-1); + } + return sOutput; +} + + +//////////////////////////////////////////////////////////////////////// +string ConvertLeetspeak(string sLetter) +{ + if (GetStringLength(sLetter) > 1) + sLetter = GetStringLeft(sLetter, 1); + string sTranslate = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + int iTrans = FindSubString(sTranslate, sLetter); + + switch (iTrans) + { + case 0: return "4"; + case 26: return "4"; + case 1: return "8"; + case 27: return "8"; + case 2: return "("; + case 28: return "("; + case 3: return "|)"; + case 29: return "|)"; + case 4: return "3"; + case 30: return "3"; + case 5: return "f"; + case 31: return "F"; + case 6: return "9"; + case 32: return "9"; + case 7: return "h"; + case 33: return "H"; + case 8: return "!"; + case 34: return "!"; + case 9: return "j"; + case 35: return "J"; + case 10: return "|<"; + case 36: return "|<"; + case 11: return "1"; + case 37: return "1"; + //case 12: return "/\/\"; + //case 38: return "/\/\"; + case 13: return "|\|"; + case 39: return "|\|"; + case 14: return "0"; + case 40: return "0"; + case 15: return "p"; + case 41: return "P"; + case 16: return "Q"; + case 42: return "Q"; + case 17: return "R"; + case 43: return "R"; + case 18: return "5"; + case 44: return "5"; + case 19: return "7"; + case 45: return "7"; + case 20: return "u"; + case 46: return "U"; + case 21: return "\/"; + case 47: return "\/"; + case 22: return "\/\/"; + case 48: return "\/\/"; + case 23: return "x"; + case 49: return "X"; + case 24: return "y"; + case 50: return "Y"; + case 25: return "2"; + case 51: return "2"; + default: return sLetter; + } + return ""; +}//end ConvertLeetspeak + +//////////////////////////////////////////////////////////////////////// +string ProcessLeetspeak(string sPhrase) +{ + string sOutput; + int iToggle; + while (GetStringLength(sPhrase) > 1) + { + if (GetStringLeft(sPhrase,1) == "*") + iToggle = abs(iToggle - 1); + if (iToggle) + sOutput = sOutput + GetStringLeft(sPhrase,1); + else + sOutput = sOutput + ConvertLeetspeak(GetStringLeft(sPhrase, 1)); + sPhrase = GetStringRight(sPhrase, GetStringLength(sPhrase)-1); + } + return sOutput; +} + +//////////////////////////////////////////////////////////////////////// +string ConvertInfernal(string sLetter) +{ + if (GetStringLength(sLetter) > 1) + sLetter = GetStringLeft(sLetter, 1); + string sTranslate = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + int iTrans = FindSubString(sTranslate, sLetter); + + switch (iTrans) + { + case 0: return "o"; + case 1: return "c"; + case 2: return "r"; + case 3: return "j"; + case 4: return "a"; + case 5: return "v"; + case 6: return "k"; + case 7: return "r"; + case 8: return "y"; + case 9: return "z"; + case 10: return "g"; + case 11: return "m"; + case 12: return "z"; + case 13: return "r"; + case 14: return "y"; + case 15: return "k"; + case 16: return "r"; + case 17: return "n"; + case 18: return "k"; + case 19: return "d"; + case 20: return "'"; + case 21: return "r"; + case 22: return "'"; + case 23: return "k"; + case 24: return "i"; + case 25: return "g"; + case 26: return "O"; + case 27: return "C"; + case 28: return "R"; + case 29: return "J"; + case 30: return "A"; + case 31: return "V"; + case 32: return "K"; + case 33: return "R"; + case 34: return "Y"; + case 35: return "Z"; + case 36: return "G"; + case 37: return "M"; + case 38: return "Z"; + case 39: return "R"; + case 40: return "Y"; + case 41: return "K"; + case 42: return "R"; + case 43: return "N"; + case 44: return "K"; + case 45: return "D"; + case 46: return "'"; + case 47: return "R"; + case 48: return "'"; + case 49: return "K"; + case 50: return "I"; + case 51: return "G"; + default: return sLetter; + } + return ""; +}//end ConvertInfernal + +//////////////////////////////////////////////////////////////////////// +string ProcessInfernal(string sPhrase) +{ + string sOutput; + int iToggle; + while (GetStringLength(sPhrase) > 1) + { + if (GetStringLeft(sPhrase,1) == "*") + iToggle = abs(iToggle - 1); + if (iToggle) + sOutput = sOutput + GetStringLeft(sPhrase,1); + else + sOutput = sOutput + ConvertInfernal(GetStringLeft(sPhrase, 1)); + sPhrase = GetStringRight(sPhrase, GetStringLength(sPhrase)-1); + } + return sOutput; +} + +//////////////////////////////////////////////////////////////////////// +string ConvertAbyssal(string sLetter) +{ + if (GetStringLength(sLetter) > 1) + sLetter = GetStringLeft(sLetter, 1); + string sTranslate = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + int iTrans = FindSubString(sTranslate, sLetter); + + switch (iTrans) + { + case 27: return "N"; + case 28: return "M"; + case 29: return "G"; + case 30: return "A"; + case 31: return "K"; + case 32: return "S"; + case 33: return "D"; + case 35: return "H"; + case 36: return "B"; + case 37: return "L"; + case 38: return "P"; + case 39: return "T"; + case 40: return "E"; + case 41: return "B"; + case 43: return "N"; + case 44: return "M"; + case 45: return "G"; + case 48: return "B"; + case 51: return "T"; + case 0: return "oo"; + case 26: return "OO"; + case 1: return "n"; + case 2: return "m"; + case 3: return "g"; + case 4: return "a"; + case 5: return "k"; + case 6: return "s"; + case 7: return "d"; + case 8: return "oo"; + case 34: return "OO"; + case 9: return "h"; + case 10: return "b"; + case 11: return "l"; + case 12: return "p"; + case 13: return "t"; + case 14: return "e"; + case 15: return "b"; + case 16: return "ch"; + case 42: return "Ch"; + case 17: return "n"; + case 18: return "m"; + case 19: return "g"; + case 20: return "ae"; + case 46: return "Ae"; + case 21: return "ts"; + case 47: return "Ts"; + case 22: return "b"; + case 23: return "bb"; + case 49: return "Bb"; + case 24: return "ee"; + case 50: return "Ee"; + case 25: return "t"; + default: return sLetter; + } + return ""; +}//end ConvertAbyssal + +//////////////////////////////////////////////////////////////////////// +string ProcessAbyssal(string sPhrase) +{ + string sOutput; + int iToggle; + while (GetStringLength(sPhrase) > 1) + { + if (GetStringLeft(sPhrase,1) == "*") + iToggle = abs(iToggle - 1); + if (iToggle) + sOutput = sOutput + GetStringLeft(sPhrase,1); + else + sOutput = sOutput + ConvertAbyssal(GetStringLeft(sPhrase, 1)); + sPhrase = GetStringRight(sPhrase, GetStringLength(sPhrase)-1); + } + return sOutput; +} + +//////////////////////////////////////////////////////////////////////// +string ConvertCelestial(string sLetter) +{ + if (GetStringLength(sLetter) > 1) + sLetter = GetStringLeft(sLetter, 1); + string sTranslate = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + int iTrans = FindSubString(sTranslate, sLetter); + + switch (iTrans) + { + case 0: return "a"; + case 1: return "p"; + case 2: return "v"; + case 3: return "t"; + case 4: return "el"; + case 5: return "b"; + case 6: return "w"; + case 7: return "r"; + case 8: return "i"; + case 9: return "m"; + case 10: return "x"; + case 11: return "h"; + case 12: return "s"; + case 13: return "c"; + case 14: return "u"; + case 15: return "q"; + case 16: return "d"; + case 17: return "n"; + case 18: return "l"; + case 19: return "y"; + case 20: return "o"; + case 21: return "j"; + case 22: return "f"; + case 23: return "g"; + case 24: return "z"; + case 25: return "k"; + case 26: return "A"; + case 27: return "P"; + case 28: return "V"; + case 29: return "T"; + case 30: return "El"; + case 31: return "B"; + case 32: return "W"; + case 33: return "R"; + case 34: return "I"; + case 35: return "M"; + case 36: return "X"; + case 37: return "H"; + case 38: return "S"; + case 39: return "C"; + case 40: return "U"; + case 41: return "Q"; + case 42: return "D"; + case 43: return "N"; + case 44: return "L"; + case 45: return "Y"; + case 46: return "O"; + case 47: return "J"; + case 48: return "F"; + case 49: return "G"; + case 50: return "Z"; + case 51: return "K"; + default: return sLetter; + } + return ""; +}//end ConvertCelestial + +//////////////////////////////////////////////////////////////////////// +string ProcessCelestial(string sPhrase) +{ + string sOutput; + int iToggle; + while (GetStringLength(sPhrase) > 1) + { + if (GetStringLeft(sPhrase,1) == "*") + iToggle = abs(iToggle - 1); + if (iToggle) + sOutput = sOutput + GetStringLeft(sPhrase,1); + else + sOutput = sOutput + ConvertCelestial(GetStringLeft(sPhrase, 1)); + sPhrase = GetStringRight(sPhrase, GetStringLength(sPhrase)-1); + } + return sOutput; +} + +//////////////////////////////////////////////////////////////////////// +string ConvertGoblin(string sLetter) +{ + if (GetStringLength(sLetter) > 1) + sLetter = GetStringLeft(sLetter, 1); + string sTranslate = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + int iTrans = FindSubString(sTranslate, sLetter); + + switch (iTrans) + { + case 0: return "u"; + case 1: return "p"; + case 2: return ""; + case 3: return "t"; + case 4: return "'"; + case 5: return "v"; + case 6: return "k"; + case 7: return "r"; + case 8: return "o"; + case 9: return "z"; + case 10: return "g"; + case 11: return "m"; + case 12: return "s"; + case 13: return ""; + case 14: return "u"; + case 15: return "b"; + case 16: return ""; + case 17: return "n"; + case 18: return "k"; + case 19: return "d"; + case 20: return "u"; + case 21: return ""; + case 22: return "'"; + case 23: return ""; + case 24: return "o"; + case 25: return "w"; + case 26: return "U"; + case 27: return "P"; + case 28: return ""; + case 29: return "T"; + case 30: return "'"; + case 31: return "V"; + case 32: return "K"; + case 33: return "R"; + case 34: return "O"; + case 35: return "Z"; + case 36: return "G"; + case 37: return "M"; + case 38: return "S"; + case 39: return ""; + case 40: return "U"; + case 41: return "B"; + case 42: return ""; + case 43: return "N"; + case 44: return "K"; + case 45: return "D"; + case 46: return "U"; + case 47: return ""; + case 48: return "'"; + case 49: return ""; + case 50: return "O"; + case 51: return "W"; + default: return sLetter; + } + return ""; +}//end ConvertGoblin + +//////////////////////////////////////////////////////////////////////// +string ProcessGoblin(string sPhrase) +{ + string sOutput; + int iToggle; + while (GetStringLength(sPhrase) > 1) + { + if (GetStringLeft(sPhrase,1) == "*") + iToggle = abs(iToggle - 1); + if (iToggle) + sOutput = sOutput + GetStringLeft(sPhrase,1); + else + sOutput = sOutput + ConvertGoblin(GetStringLeft(sPhrase, 1)); + sPhrase = GetStringRight(sPhrase, GetStringLength(sPhrase)-1); + } + return sOutput; +} + +//////////////////////////////////////////////////////////////////////// +string ConvertDraconic(string sLetter) +{ + if (GetStringLength(sLetter) > 1) + sLetter = GetStringLeft(sLetter, 1); + string sTranslate = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + int iTrans = FindSubString(sTranslate, sLetter); + + switch (iTrans) + { + case 0: return "e"; + case 26: return "E"; + case 1: return "po"; + case 27: return "Po"; + case 2: return "st"; + case 28: return "St"; + case 3: return "ty"; + case 29: return "Ty"; + case 4: return "i"; + case 5: return "w"; + case 6: return "k"; + case 7: return "ni"; + case 33: return "Ni"; + case 8: return "un"; + case 34: return "Un"; + case 9: return "vi"; + case 35: return "Vi"; + case 10: return "go"; + case 36: return "Go"; + case 11: return "ch"; + case 37: return "Ch"; + case 12: return "li"; + case 38: return "Li"; + case 13: return "ra"; + case 39: return "Ra"; + case 14: return "y"; + case 15: return "ba"; + case 41: return "Ba"; + case 16: return "x"; + case 17: return "hu"; + case 43: return "Hu"; + case 18: return "my"; + case 44: return "My"; + case 19: return "dr"; + case 45: return "Dr"; + case 20: return "on"; + case 46: return "On"; + case 21: return "fi"; + case 47: return "Fi"; + case 22: return "zi"; + case 48: return "Zi"; + case 23: return "qu"; + case 49: return "Qu"; + case 24: return "an"; + case 50: return "An"; + case 25: return "ji"; + case 51: return "Ji"; + case 30: return "I"; + case 31: return "W"; + case 32: return "K"; + case 40: return "Y"; + case 42: return "X"; + default: return sLetter; + } + return ""; +}//end ConvertDraconic + +//////////////////////////////////////////////////////////////////////// +string ProcessDraconic(string sPhrase) +{ + string sOutput; + int iToggle; + while (GetStringLength(sPhrase) > 1) + { + if (GetStringLeft(sPhrase,1) == "*") + iToggle = abs(iToggle - 1); + if (iToggle) + sOutput = sOutput + GetStringLeft(sPhrase,1); + else + sOutput = sOutput + ConvertDraconic(GetStringLeft(sPhrase, 1)); + sPhrase = GetStringRight(sPhrase, GetStringLength(sPhrase)-1); + } + return sOutput; +} + +//////////////////////////////////////////////////////////////////////// +string ConvertDwarf(string sLetter) +{ + if (GetStringLength(sLetter) > 1) + sLetter = GetStringLeft(sLetter, 1); + string sTranslate = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + int iTrans = FindSubString(sTranslate, sLetter); + + switch (iTrans) + { + case 0: return "az"; + case 26: return "Az"; + case 1: return "po"; + case 27: return "Po"; + case 2: return "zi"; + case 28: return "Zi"; + case 3: return "t"; + case 4: return "a"; + case 5: return "wa"; + case 31: return "Wa"; + case 6: return "k"; + case 7: return "'"; + case 8: return "a"; + case 9: return "dr"; + case 35: return "Dr"; + case 10: return "g"; + case 11: return "n"; + case 12: return "l"; + case 13: return "r"; + case 14: return "ur"; + case 40: return "Ur"; + case 15: return "rh"; + case 41: return "Rh"; + case 16: return "k"; + case 17: return "h"; + case 18: return "th"; + case 44: return "Th"; + case 19: return "k"; + case 20: return "'"; + case 21: return "g"; + case 22: return "zh"; + case 48: return "Zh"; + case 23: return "q"; + case 24: return "o"; + case 25: return "j"; + case 29: return "T"; + case 30: return "A"; + case 32: return "K"; + case 33: return "'"; + case 34: return "A"; + case 36: return "G"; + case 37: return "N"; + case 38: return "L"; + case 39: return "R"; + case 42: return "K"; + case 43: return "H"; + case 45: return "K"; + case 46: return "'"; + case 47: return "G"; + case 49: return "Q"; + case 50: return "O"; + case 51: return "J"; + default: return sLetter; + } return ""; +}//end ConvertDwarf + +//////////////////////////////////////////////////////////////////////// +string ProcessDwarf(string sPhrase) +{ + string sOutput; + int iToggle; + while (GetStringLength(sPhrase) > 1) + { + if (GetStringLeft(sPhrase,1) == "*") + iToggle = abs(iToggle - 1); + if (iToggle) + sOutput = sOutput + GetStringLeft(sPhrase,1); + else + sOutput = sOutput + ConvertDwarf(GetStringLeft(sPhrase, 1)); + sPhrase = GetStringRight(sPhrase, GetStringLength(sPhrase)-1); + } + return sOutput; +} + +//////////////////////////////////////////////////////////////////////// +string ConvertElven(string sLetter) +{ + if (GetStringLength(sLetter) > 1) + sLetter = GetStringLeft(sLetter, 1); + string sTranslate = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + int iTrans = FindSubString(sTranslate, sLetter); + + switch (iTrans) + { + case 0: return "il"; + case 26: return "Il"; + case 1: return "f"; + case 2: return "ny"; + case 28: return "Ny"; + case 3: return "w"; + case 4: return "a"; + case 5: return "o"; + case 6: return "v"; + case 7: return "ir"; + case 33: return "Ir"; + case 8: return "e"; + case 9: return "qu"; + case 35: return "Qu"; + case 10: return "n"; + case 11: return "c"; + case 12: return "s"; + case 13: return "l"; + case 14: return "e"; + case 15: return "ty"; + case 41: return "Ty"; + case 16: return "h"; + case 17: return "m"; + case 18: return "la"; + case 44: return "La"; + case 19: return "an"; + case 45: return "An"; + case 20: return "y"; + case 21: return "el"; + case 47: return "El"; + case 22: return "am"; + case 48: return "Am"; + case 23: return "'"; + case 24: return "a"; + case 25: return "j"; + + case 27: return "F"; + case 29: return "W"; + case 30: return "A"; + case 31: return "O"; + case 32: return "V"; + case 34: return "E"; + case 36: return "N"; + case 37: return "C"; + case 38: return "S"; + case 39: return "L"; + case 40: return "E"; + case 42: return "H"; + case 43: return "M"; + case 46: return "Y"; + case 49: return "'"; + case 50: return "A"; + case 51: return "J"; + + default: return sLetter; + } return ""; +} + +//////////////////////////////////////////////////////////////////////// +string ProcessElven(string sPhrase) +{ + string sOutput; + int iToggle; + while (GetStringLength(sPhrase) > 1) + { + if (GetStringLeft(sPhrase,1) == "*") + iToggle = abs(iToggle - 1); + if (iToggle) + sOutput = sOutput + GetStringLeft(sPhrase,1); + else + sOutput = sOutput + ConvertElven(GetStringLeft(sPhrase, 1)); + sPhrase = GetStringRight(sPhrase, GetStringLength(sPhrase)-1); + } + return sOutput; +} + +//////////////////////////////////////////////////////////////////////// +string ConvertGnome(string sLetter) +{ + if (GetStringLength(sLetter) > 1) + sLetter = GetStringLeft(sLetter, 1); + string sTranslate = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + int iTrans = FindSubString(sTranslate, sLetter); + + switch (iTrans) + { +//cipher based on English -> Al Baed + case 0: return "y"; + case 1: return "p"; + case 2: return "l"; + case 3: return "t"; + case 4: return "a"; + case 5: return "v"; + case 6: return "k"; + case 7: return "r"; + case 8: return "e"; + case 9: return "z"; + case 10: return "g"; + case 11: return "m"; + case 12: return "s"; + case 13: return "h"; + case 14: return "u"; + case 15: return "b"; + case 16: return "x"; + case 17: return "n"; + case 18: return "c"; + case 19: return "d"; + case 20: return "i"; + case 21: return "j"; + case 22: return "f"; + case 23: return "q"; + case 24: return "o"; + case 25: return "w"; + case 26: return "Y"; + case 27: return "P"; + case 28: return "L"; + case 29: return "T"; + case 30: return "A"; + case 31: return "V"; + case 32: return "K"; + case 33: return "R"; + case 34: return "E"; + case 35: return "Z"; + case 36: return "G"; + case 37: return "M"; + case 38: return "S"; + case 39: return "H"; + case 40: return "U"; + case 41: return "B"; + case 42: return "X"; + case 43: return "N"; + case 44: return "C"; + case 45: return "D"; + case 46: return "I"; + case 47: return "J"; + case 48: return "F"; + case 49: return "Q"; + case 50: return "O"; + case 51: return "W"; + default: return sLetter; + } return ""; +} + +//////////////////////////////////////////////////////////////////////// +string ProcessGnome(string sPhrase) +{ + string sOutput; + int iToggle; + while (GetStringLength(sPhrase) > 1) + { + if (GetStringLeft(sPhrase,1) == "*") + iToggle = abs(iToggle - 1); + if (iToggle) + sOutput = sOutput + GetStringLeft(sPhrase,1); + else + sOutput = sOutput + ConvertGnome(GetStringLeft(sPhrase, 1)); + sPhrase = GetStringRight(sPhrase, GetStringLength(sPhrase)-1); + } + return sOutput; +} + +//////////////////////////////////////////////////////////////////////// +string ConvertHalfling(string sLetter) +{ + if (GetStringLength(sLetter) > 1) + sLetter = GetStringLeft(sLetter, 1); + string sTranslate = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + int iTrans = FindSubString(sTranslate, sLetter); + + switch (iTrans) + { +//cipher based on Al Baed -> English + case 0: return "e"; + case 1: return "p"; + case 2: return "s"; + case 3: return "t"; + case 4: return "i"; + case 5: return "w"; + case 6: return "k"; + case 7: return "n"; + case 8: return "u"; + case 9: return "v"; + case 10: return "g"; + case 11: return "c"; + case 12: return "l"; + case 13: return "r"; + case 14: return "y"; + case 15: return "b"; + case 16: return "x"; + case 17: return "h"; + case 18: return "m"; + case 19: return "d"; + case 20: return "o"; + case 21: return "f"; + case 22: return "z"; + case 23: return "q"; + case 24: return "a"; + case 25: return "j"; + case 26: return "E"; + case 27: return "P"; + case 28: return "S"; + case 29: return "T"; + case 30: return "I"; + case 31: return "W"; + case 32: return "K"; + case 33: return "N"; + case 34: return "U"; + case 35: return "V"; + case 36: return "G"; + case 37: return "C"; + case 38: return "L"; + case 39: return "R"; + case 40: return "Y"; + case 41: return "B"; + case 42: return "X"; + case 43: return "H"; + case 44: return "M"; + case 45: return "D"; + case 46: return "O"; + case 47: return "F"; + case 48: return "Z"; + case 49: return "Q"; + case 50: return "A"; + case 51: return "J"; + default: return sLetter; + } return ""; +} + +//////////////////////////////////////////////////////////////////////// +string ProcessHalfling(string sPhrase) +{ + string sOutput; + int iToggle; + while (GetStringLength(sPhrase) > 1) + { + if (GetStringLeft(sPhrase,1) == "*") + iToggle = abs(iToggle - 1); + if (iToggle) + sOutput = sOutput + GetStringLeft(sPhrase,1); + else + sOutput = sOutput + ConvertHalfling(GetStringLeft(sPhrase, 1)); + sPhrase = GetStringRight(sPhrase, GetStringLength(sPhrase)-1); + } + return sOutput; +} + +//////////////////////////////////////////////////////////////////////// +string ConvertOrc(string sLetter) +{ + if (GetStringLength(sLetter) > 1) + sLetter = GetStringLeft(sLetter, 1); + string sTranslate = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + int iTrans = FindSubString(sTranslate, sLetter); + + switch (iTrans) + { + case 0: return "ha"; + case 26: return "Ha"; + case 1: return "p"; + case 2: return "z"; + case 3: return "t"; + case 4: return "o"; + case 5: return ""; + case 6: return "k"; + case 7: return "r"; + case 8: return "a"; + case 9: return "m"; + case 10: return "g"; + case 11: return "h"; + case 12: return "r"; + case 13: return "k"; + case 14: return "u"; + case 15: return "b"; + case 16: return "k"; + case 17: return "h"; + case 18: return "g"; + case 19: return "n"; + case 20: return ""; + case 21: return "g"; + case 22: return "r"; + case 23: return "r"; + case 24: return "'"; + case 25: return "m"; + case 27: return "P"; + case 28: return "Z"; + case 29: return "T"; + case 30: return "O"; + case 31: return ""; + case 32: return "K"; + case 33: return "R"; + case 34: return "A"; + case 35: return "M"; + case 36: return "G"; + case 37: return "H"; + case 38: return "R"; + case 39: return "K"; + case 40: return "U"; + case 41: return "B"; + case 42: return "K"; + case 43: return "H"; + case 44: return "G"; + case 45: return "N"; + case 46: return ""; + case 47: return "G"; + case 48: return "R"; + case 49: return "R"; + case 50: return "'"; + case 51: return "M"; + default: return sLetter; + } return ""; +} + +//////////////////////////////////////////////////////////////////////// +string ProcessOrc(string sPhrase) +{ + string sOutput; + int iToggle; + while (GetStringLength(sPhrase) > 1) + { + if (GetStringLeft(sPhrase,1) == "*") + iToggle = abs(iToggle - 1); + if (iToggle) + sOutput = sOutput + GetStringLeft(sPhrase,1); + else + sOutput = sOutput + ConvertOrc(GetStringLeft(sPhrase, 1)); + sPhrase = GetStringRight(sPhrase, GetStringLength(sPhrase)-1); + } + return sOutput; +} + +//////////////////////////////////////////////////////////////////////// +string ConvertAnimal(string sLetter) +{ + if (GetStringLength(sLetter) > 1) + sLetter = GetStringLeft(sLetter, 1); + string sTranslate = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + int iTrans = FindSubString(sTranslate, sLetter); + + switch (iTrans) + { + case 0: return "'"; + case 1: return "'"; + case 2: return "'"; + case 3: return "'"; + case 4: return "'"; + case 5: return "'"; + case 6: return "'"; + case 7: return "'"; + case 8: return "'"; + case 9: return "'"; + case 10: return "'"; + case 11: return "'"; + case 12: return "'"; + case 13: return "'"; + case 14: return "'"; + case 15: return "'"; + case 16: return "'"; + case 17: return "'"; + case 18: return "'"; + case 19: return "'"; + case 20: return "'"; + case 21: return "'"; + case 22: return "'"; + case 23: return "'"; + case 24: return "'"; + case 25: return "'"; + case 26: return "'"; + case 27: return "'"; + case 28: return "'"; + case 29: return "'"; + case 30: return "'"; + case 31: return "'"; + case 32: return "'"; + case 33: return "'"; + case 34: return "'"; + case 35: return "'"; + case 36: return "'"; + case 37: return "'"; + case 38: return "'"; + case 39: return "'"; + case 40: return "'"; + case 41: return "'"; + case 42: return "'"; + case 43: return "'"; + case 44: return "'"; + case 45: return "'"; + case 46: return "'"; + case 47: return "'"; + case 48: return "'"; + case 49: return "'"; + case 50: return "'"; + case 51: return "'"; + default: return sLetter; + } return ""; +} + +//////////////////////////////////////////////////////////////////////// +string ProcessAnimal(string sPhrase) +{ + string sOutput; + int iToggle; + while (GetStringLength(sPhrase) > 1) + { + if (GetStringLeft(sPhrase,1) == "*") + iToggle = abs(iToggle - 1); + if (iToggle) + sOutput = sOutput + GetStringLeft(sPhrase,1); + else + sOutput = sOutput + ConvertAnimal(GetStringLeft(sPhrase, 1)); + sPhrase = GetStringRight(sPhrase, GetStringLength(sPhrase)-1); + } + return sOutput; +} + +//////////////////////////////////////////////////////////////////////// +string ProcessCant(string sLetter) +{ + if (GetStringLength(sLetter) > 1) + sLetter = GetStringLeft(sLetter, 1); + + if (sLetter == "a" || sLetter == "A") return "*shields eyes*"; + if (sLetter == "b" || sLetter == "B") return "*blusters*"; + if (sLetter == "c" || sLetter == "C") return "*coughs*"; + if (sLetter == "d" || sLetter == "D") return "*furrows brow*"; + if (sLetter == "e" || sLetter == "E") return "*examines ground*"; + if (sLetter == "f" || sLetter == "F") return "*frowns*"; + if (sLetter == "g" || sLetter == "G") return "*glances up*"; + if (sLetter == "h" || sLetter == "H") return "*looks thoughtful*"; + if (sLetter == "i" || sLetter == "I") return "*looks bored*"; + if (sLetter == "j" || sLetter == "J") return "*rubs chin*"; + if (sLetter == "k" || sLetter == "K") return "*scratches ear*"; + if (sLetter == "l" || sLetter == "L") return "*looks around*"; + if (sLetter == "m" || sLetter == "M") return "*mmm hmm*"; + if (sLetter == "n" || sLetter == "N") return "*nods*"; + if (sLetter == "o" || sLetter == "O") return "*grins*"; + if (sLetter == "p" || sLetter == "P") return "*smiles*"; + if (sLetter == "q" || sLetter == "Q") return "*shivers*"; + if (sLetter == "r" || sLetter == "R") return "*rolls eyes*"; + if (sLetter == "s" || sLetter == "S") return "*scratches nose*"; + if (sLetter == "t" || sLetter == "T") return "*turns a bit*"; + if (sLetter == "u" || sLetter == "U") return "*glances idly*"; + if (sLetter == "v" || sLetter == "V") return "*runs hand through hair*"; + if (sLetter == "w" || sLetter == "W") return "*waves*"; + if (sLetter == "x" || sLetter == "X") return "*stretches*"; + if (sLetter == "y" || sLetter == "Y") return "*yawns*"; + if (sLetter == "z" || sLetter == "Z") return "*shrugs*"; + + return "*nods*"; +} + +//////////////////////////////////////////////////////////////////////// +string ConvertSylvan(string sLetter) +{ + if (GetStringLength(sLetter) > 1) + sLetter = GetStringLeft(sLetter, 1); + string sTranslate = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + int iTrans = FindSubString(sTranslate, sLetter); + + switch (iTrans) + { + case 0: return "i"; + case 1: return "ri"; + case 2: return "ba"; + case 3: return "ma"; + case 4: return "i"; + case 5: return "mo"; + case 6: return "yo"; + case 7: return "f"; + case 8: return "ya"; + case 9: return "ta"; + case 10: return "m"; + case 11: return "t"; + case 12: return "r"; + case 13: return "j"; + case 14: return "nu"; + case 15: return "wi"; + case 16: return "bo"; + case 17: return "w"; + case 18: return "ne"; + case 19: return "na"; + case 20: return "li"; + case 21: return "v"; + case 22: return "ni"; + case 23: return "ya"; + case 24: return "mi"; + case 25: return "og"; + case 26: return "I"; + case 27: return "Ri"; + case 28: return "Ba"; + case 29: return "Ma"; + case 30: return "I"; + case 31: return "Mo"; + case 32: return "Yo"; + case 33: return "F"; + case 34: return "Ya"; + case 35: return "Ta"; + case 36: return "M"; + case 37: return "T"; + case 38: return "R"; + case 39: return "J"; + case 40: return "Nu"; + case 41: return "Wi"; + case 42: return "Bo"; + case 43: return "W"; + case 44: return "Ne"; + case 45: return "Na"; + case 46: return "Li"; + case 47: return "V"; + case 48: return "Ni"; + case 49: return "Ya"; + case 50: return "Mi"; + case 51: return "Og"; + default: return sLetter; + } return ""; +} + +//////////////////////////////////////////////////////////////////////// +string ProcessSylvan(string sPhrase) +{ + string sOutput; + int iToggle; + while (GetStringLength(sPhrase) > 1) + { + if (GetStringLeft(sPhrase,1) == "*") + iToggle = abs(iToggle - 1); + if (iToggle) + sOutput = sOutput + GetStringLeft(sPhrase,1); + else + sOutput = sOutput + ConvertSylvan(GetStringLeft(sPhrase, 1)); + sPhrase = GetStringRight(sPhrase, GetStringLength(sPhrase)-1); + } + return sOutput; +} + +//////////////////////////////////////////////////////////////////////// +string ConvertRashemi(string sLetter) +{ + if (GetStringLength(sLetter) > 1) + sLetter = GetStringLeft(sLetter, 1); + string sTranslate = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + int iTrans = FindSubString(sTranslate, sLetter); + + switch (iTrans) + { + case 0: return "a"; + case 1: return "s"; + case 2: return "n"; + case 3: return "y"; + case 4: return "ov"; + case 5: return "d"; + case 6: return "sk"; + case 7: return "fr"; + case 8: return "u"; + case 9: return "o"; + case 10: return "f"; + case 11: return "r"; + case 12: return "z"; + case 13: return "s"; + case 14: return "o"; + case 15: return "j"; + case 16: return "sk"; + case 17: return " "; + case 18: return "or"; + case 19: return "ka"; + case 20: return "o"; + case 21: return "ka"; + case 22: return "ma"; + case 23: return "o"; + case 24: return "oj"; + case 25: return "y"; + case 26: return "A"; + case 27: return "S"; + case 28: return "N"; + case 29: return "Y"; + case 30: return "Ov"; + case 31: return "D"; + case 32: return "Sk"; + case 33: return "Fr"; + case 34: return "U"; + case 35: return "O"; + case 36: return "F"; + case 37: return "R"; + case 38: return "Z"; + case 39: return "S"; + case 40: return "O"; + case 41: return "J"; + case 42: return "Sk"; + case 43: return "M"; + case 44: return "Or"; + case 45: return "Ka"; + case 46: return "O"; + case 47: return "Ka"; + case 48: return "Ma"; + case 49: return "O"; + case 50: return "Oj"; + case 51: return "Y"; + default: return sLetter; + } return ""; +} + +//////////////////////////////////////////////////////////////////////// +string ProcessRashemi(string sPhrase) +{ + string sOutput; + int iToggle; + while (GetStringLength(sPhrase) > 1) + { + if (GetStringLeft(sPhrase,1) == "*") + iToggle = abs(iToggle - 1); + if (iToggle) + sOutput = sOutput + GetStringLeft(sPhrase,1); + else + sOutput = sOutput + ConvertRashemi(GetStringLeft(sPhrase, 1)); + sPhrase = GetStringRight(sPhrase, GetStringLength(sPhrase)-1); + } + return sOutput; +} + +//////////////////////////////////////////////////////////////////////// +string ConvertMulhorandi(string sLetter) +{ + if (GetStringLength(sLetter) > 1) + sLetter = GetStringLeft(sLetter, 1); + string sTranslate = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + int iTrans = FindSubString(sTranslate, sLetter); + + switch (iTrans) + { + case 0: return "ri"; + case 1: return "dj"; + case 2: return "p"; + case 3: return "al"; + case 4: return "a"; + case 5: return "j"; + case 6: return "y"; + case 7: return "u"; + case 8: return "o"; + case 9: return "f"; + case 10: return "ch"; + case 11: return "d"; + case 12: return "t"; + case 13: return "m"; + case 14: return "eh"; + case 15: return "k"; + case 16: return "ng"; + case 17: return "sh"; + case 18: return "th"; + case 19: return "s"; + case 20: return "e"; + case 21: return "z"; + case 22: return "p"; + case 23: return "qu"; + case 24: return "o"; + case 25: return "z"; + case 26: return "Ri"; + case 27: return "Dj"; + case 28: return "P"; + case 29: return "Al"; + case 30: return "A"; + case 31: return "J"; + case 32: return "Y"; + case 33: return "U"; + case 34: return "O"; + case 35: return "F"; + case 36: return "Ch"; + case 37: return "D"; + case 38: return "T"; + case 39: return "M"; + case 40: return "Eh"; + case 41: return "K"; + case 42: return "Ng"; + case 43: return "Sh"; + case 44: return "Th"; + case 45: return "S"; + case 46: return "E"; + case 47: return "Z"; + case 48: return "P"; + case 49: return "Qu"; + case 50: return "O"; + case 51: return "Z"; + default: return sLetter; + } return ""; +} + +//////////////////////////////////////////////////////////////////////// +string ProcessMulhorandi(string sPhrase) +{ + string sOutput; + int iToggle; + while (GetStringLength(sPhrase) > 1) + { + if (GetStringLeft(sPhrase,1) == "*") + iToggle = abs(iToggle - 1); + if (iToggle) + sOutput = sOutput + GetStringLeft(sPhrase,1); + else + sOutput = sOutput + ConvertMulhorandi(GetStringLeft(sPhrase, 1)); + sPhrase = GetStringRight(sPhrase, GetStringLength(sPhrase)-1); + } + return sOutput; +} + +//////////////////////////////////////////////////////////////////////// +string TranslateCommonToLanguage(int iLang, string sText) +{ + switch (iLang) + { + case 1: //Elven + return ProcessElven(sText); break; + case 2: //Gnome + return ProcessGnome(sText); break; + case 3: //Halfling + return ProcessHalfling(sText); break; + case 4: //Dwarf Note: Race 4 is normally Half Elf and Race 0 is normally Dwarf. This is changed. + return ProcessDwarf(sText); break; + case 5: //Orc + return ProcessOrc(sText); break; + case 6: //Goblin + return ProcessGoblin(sText); break; + case 7: //Draconic + return ProcessDraconic(sText); break; + case 8: //Animal + return ProcessAnimal(sText); break; + case 9: //Thieves Cant + return ProcessCant(sText); break; + case 10: //Celestial + return ProcessCelestial(sText); break; + case 11: //Abyssal + return ProcessAbyssal(sText); break; + case 12: //Infernal + return ProcessInfernal(sText); break; + case 13: + return ProcessDrow(sText); break; + case 14: // Sylvan + return ProcessSylvan(sText); break; + case 15: // Rashemi + return ProcessRashemi(sText); break; + case 16: // Mulhorandi + return ProcessMulhorandi(sText); break; + case 99: //1337 + return ProcessLeetspeak(sText); break; + default: if (iLang > 100) return ProcessCustom(sText, iLang - 100);break; + } + return ""; +} + +//////////////////////////////////////////////////////////////////////// +int GetDefaultRacialLanguage(object oPC, int iRename) +{ + switch (GetRacialType(oPC)) + { + case RACIAL_TYPE_DWARF: if (iRename) SetLocalString(oPC, "hls_MyLanguageName", "Dwarven");return 4; break; + case RACIAL_TYPE_ELF: + case RACIAL_TYPE_HALFELF: if (iRename) SetLocalString(oPC, "hls_MyLanguageName", "Elven");return 1; break; + case RACIAL_TYPE_GNOME: if (iRename) SetLocalString(oPC, "hls_MyLanguageName", "Gnome");return 2; break; + case RACIAL_TYPE_HALFLING: if (iRename) SetLocalString(oPC, "hls_MyLanguageName", "Halfling");return 3; break; + case RACIAL_TYPE_HUMANOID_ORC: + case RACIAL_TYPE_HALFORC: if (iRename) SetLocalString(oPC, "hls_MyLanguageName", "Orc");return 5; break; + case RACIAL_TYPE_HUMANOID_GOBLINOID: if (iRename) SetLocalString(oPC, "hls_MyLanguageName", "Goblin");return 6; break; + case RACIAL_TYPE_HUMANOID_REPTILIAN: + case RACIAL_TYPE_DRAGON: if (iRename) SetLocalString(oPC, "hls_MyLanguageName", "Draconic");return 7; break; + case RACIAL_TYPE_ANIMAL: if (iRename) SetLocalString(oPC, "hls_MyLanguageName", "Animal");return 8; break; + default: + if (GetLevelByClass(CLASS_TYPE_RANGER, oPC) || GetLevelByClass(CLASS_TYPE_DRUID, oPC)) + { + if (iRename) SetLocalString(oPC, "hls_MyLanguageName", "Animal"); + return 8; + } + if (GetLevelByClass(CLASS_TYPE_ROGUE, oPC)) + { + if (iRename) SetLocalString(oPC, "hls_MyLanguageName", "Thieves' Cant"); + return 9; + } + break; + } + return 0; +} + +//////////////////////////////////////////////////////////////////////// +int GetDefaultClassLanguage(object oPC) +{ + if (GetLevelByClass(CLASS_TYPE_RANGER, oPC) || GetLevelByClass(CLASS_TYPE_DRUID, oPC)) + return 8; + if (GetLevelByClass(CLASS_TYPE_ROGUE, oPC)) + return 9; + if ((GetSubRace(oPC)=="drow") ||(GetSubRace(oPC)=="DROW")||(GetSubRace(oPC)=="Drow")) + return 13; + if ((GetSubRace(oPC)=="fey") ||(GetSubRace(oPC)=="FEY")||(GetSubRace(oPC)=="Fey")) + return 14; + + return 0; +} + +//////////////////////////////////////////////////////////////////////// +int GetIsAlphanumeric(string sCharacter) +{ + if (sCharacter == "a" || + sCharacter == "b" || + sCharacter == "c" || + sCharacter == "d" || + sCharacter == "e" || + sCharacter == "f" || + sCharacter == "g" || + sCharacter == "h" || + sCharacter == "i" || + sCharacter == "j" || + sCharacter == "k" || + sCharacter == "l" || + sCharacter == "m" || + sCharacter == "n" || + sCharacter == "o" || + sCharacter == "p" || + sCharacter == "q" || + sCharacter == "r" || + sCharacter == "s" || + sCharacter == "t" || + sCharacter == "u" || + sCharacter == "v" || + sCharacter == "w" || + sCharacter == "x" || + sCharacter == "y" || + sCharacter == "z" || + sCharacter == "A" || + sCharacter == "B" || + sCharacter == "C" || + sCharacter == "D" || + sCharacter == "E" || + sCharacter == "F" || + sCharacter == "G" || + sCharacter == "H" || + sCharacter == "I" || + sCharacter == "J" || + sCharacter == "K" || + sCharacter == "L" || + sCharacter == "M" || + sCharacter == "N" || + sCharacter == "O" || + sCharacter == "P" || + sCharacter == "Q" || + sCharacter == "R" || + sCharacter == "S" || + sCharacter == "T" || + sCharacter == "U" || + sCharacter == "V" || + sCharacter == "W" || + sCharacter == "X" || + sCharacter == "Y" || + sCharacter == "Z" || + sCharacter == "1" || + sCharacter == "2" || + sCharacter == "3" || + sCharacter == "4" || + sCharacter == "5" || + sCharacter == "6" || + sCharacter == "7" || + sCharacter == "8" || + sCharacter == "9" || + sCharacter == "0") + return TRUE; + + return FALSE; +} + +//////////////////////////////////////////////////////////////////////// +void ParseCommand(object oTarget, object oCommander, string sComIn) +{ +// :: 2008.07.31 morderon / tsunami282 - allow certain . commands for +// :: PCs as well as DM's; allow shortcut targeting of henchies/pets +// :: 2009.07.25 civious / tsunami282 - correct language name parsing for .lang command + + int iOffset=0; + if (GetIsDM(oTarget) && (oTarget != oCommander)) return; //DMs can only be affected by their own .commands + + int bValidTarget = GetIsObjectValid(oTarget); + if (!bValidTarget) + { + DMFISendMessageToPC(oCommander, "No current command target - no commands will function.", FALSE, DMFI_MESSAGE_COLOR_ALERT); + return; + } + + // break into command and args + struct sStringTokenizer st = GetStringTokenizer(sComIn, " "); + st = AdvanceToNextToken(st); + string sCom = GetStringLowerCase(GetNextToken(st)); + string sArgs = LTrim(st.sRemaining); + + // ** commands usable by all pc's/dm's + if (GetStringLeft(sCom, 4) == ".loc") + { + SetLocalInt(oCommander, "dmfi_dicebag", 2); + SetCustomToken(20681, "Local"); + SetDMFIPersistentInt("dmfi", "dmfi_dicebag", 2, oCommander); + FloatingTextStringOnCreature("Broadcast Mode set to Local", oCommander, FALSE); return; + } + else if (GetStringLeft(sCom, 4) == ".glo") + { + SetLocalInt(oCommander, "dmfi_dicebag", 1); + SetCustomToken(20681, "Global"); + SetDMFIPersistentInt("dmfi", "dmfi_dicebag", 1, oCommander); + FloatingTextStringOnCreature("Broadcast Mode set to Global", oCommander, FALSE); return; + } + else if (GetStringLeft(sCom, 4) == ".pri") + { + SetLocalInt(oCommander, "dmfi_dicebag", 0); + SetCustomToken(20681, "Private"); + SetDMFIPersistentInt("dmfi", "dmfi_dicebag", 0, oCommander); + FloatingTextStringOnCreature("Broadcast Mode set to Private", oCommander, FALSE); return; + } + else if (GetStringLeft(sCom, 3) == ".dm") + { + SetLocalInt(oCommander, "dmfi_dicebag", 3); + SetCustomToken(20681, "DM Only"); + SetDMFIPersistentInt("dmfi", "dmfi_dicebag", 3, oCommander); + FloatingTextStringOnCreature("Broadcast Mode set to DM Only", oCommander, FALSE); return; + } + else if (GetStringLeft(sCom, 5) == ".aniy") + { + SetLocalInt(oCommander, "dmfi_dice_no_animate", 0); + FloatingTextStringOnCreature("Rolls will show animation", oCommander, FALSE); return; + } + else if (GetStringLeft(sCom, 5) == ".anin") + { + SetLocalInt(oCommander, "dmfi_dice_no_animate", 1); + FloatingTextStringOnCreature("Rolls will NOT show animation", oCommander, FALSE); return; + } + else if (GetStringLeft(sCom, 5) == ".emoy") // control emotes (based on Morderon code) + { + SetLocalInt(oCommander, "hls_emotemute", 0); + FloatingTextStringOnCreature("*emote* commands are on", oCommander, FALSE); + return; + } + else if (GetStringLeft(sCom, 5) == ".emon") // control emotes (based on Morderon code) + { + SetLocalInt(oCommander, "hls_emotemute", 1); + FloatingTextStringOnCreature("*emote* commands are off", oCommander, FALSE); + return; + } + else if (GetStringLeft(sCom, 4) == ".lan") //sets the language of the target + { + // check target allowed + if (!(GetIsDM(oCommander) || GetIsDMPossessed(oCommander) || + oTarget == oCommander || GetMaster(oTarget) == oCommander)) + { + FloatingTextStringOnCreature("You cannot perform this command on a creature you do not control.", oCommander, FALSE); + return; + } + + string sArgsLC = GetStringLowerCase(sArgs); + int iLang = 0; + string sLang = ""; + if (FindSubString(sArgsLC, "elven") != -1 || + FindSubString(sArgsLC, "elf") != -1) + { + iLang = 1; + sLang = "Elven"; + } + else if (FindSubString(sArgsLC, "gnom") != -1) + { + iLang = 2; + sLang = "Gnome"; + } + else if (FindSubString(sArgsLC, "halfling") != -1) + { + iLang = 3; + sLang = "Halfling"; + } + else if (FindSubString(sArgsLC, "dwar") != -1) + { + iLang = 4; + sLang = "Dwarven"; + } + else if (FindSubString(sArgsLC, "orc") != -1) + { + iLang = 5; + sLang = "Orc"; + } + else if (FindSubString(sArgsLC, "goblin") != -1) + { + iLang = 6; + sLang = "Goblin"; + } + else if (FindSubString(sArgsLC, "draconic") != -1) + { + iLang = 7; + sLang = "Draconic"; + } + else if (FindSubString(sArgsLC, "animal") != -1) + { + iLang = 8; + sLang = "Animal"; + } + else if (FindSubString(sArgsLC, "cant") != -1) + { + iLang = 9; + sLang = "Thieves' Cant"; + } + else if (FindSubString(sArgsLC, "celestial") != -1) + { + iLang = 10; + sLang = "Celestial"; + } + else if (FindSubString(sArgsLC, "abyssal") != -1) + { + iLang = 11; + sLang = "Abyssal"; + } + else if (FindSubString(sArgsLC, "infernal") != -1) + { + iLang = 12; + sLang = "Infernal"; + } + else if (FindSubString(sArgsLC, "drow") != -1) + { + iLang = 13; + sLang = "Drow"; + } + else if (FindSubString(sArgsLC, "sylvan") != -1) + { + iLang = 14; + sLang = "Sylvan"; + } + else if (FindSubString(sArgsLC, "rashemi") != -1) + { + iLang = 15; + sLang = "Rashemi"; + } + else if (FindSubString(sArgsLC, "mulhorandi") != -1) + { + iLang = 16; + sLang = "Mulhorandi"; + } + // see if target is allowed to speak that language + if (!GetIsDM(oCommander) && !GetIsDMPossessed(oCommander)) // DM's can set any language on anyone + { + // commander is not DM, so see if target can speak desired language: + // language must be default racial or class language, or target + // must have a language widget for it + if (!(GetIsObjectValid(GetItemPossessedBy(oTarget, "hlslang_"+IntToString(iLang))) || + GetDefaultRacialLanguage(oTarget, FALSE) == iLang || + GetDefaultClassLanguage(oTarget) == iLang)) + { + iLang = 0; + } + } + if (iLang > 0) + { + SetLocalInt(oTarget, "hls_MyLanguage", iLang); + SetLocalString(oTarget, "hls_MyLanguageName", sLang); + FloatingTextStringOnCreature("Language for "+GetName(oTarget)+" set to "+sLang, oCommander, FALSE); + } + else + { + FloatingTextStringOnCreature("Unable to set language - invalid target or language", oCommander, FALSE); + } + return; + } + + // that's all the PC commands, bail out if not DM + if (!GetIsDM(oCommander) && !GetIsDMPossessed(oCommander)) + { + DMFISendMessageToPC(oCommander, "DMFI dot command nonexistent or restricted to DM's - aborting.", FALSE, DMFI_MESSAGE_COLOR_ALERT); + return; + } + + if (GetStringLeft(sCom, 7) ==".appear") + { + string sNew = sArgs; + DMFISendMessageToPC(oCommander, "Setting target appearance to: " + sNew, FALSE, DMFI_MESSAGE_COLOR_STATUS); + int Appear = AppearType(sNew); + + if (Appear!=-1) + { + // SetCreatureAppearanceType(GetLocalObject(oCommander, "dmfi_univ_target"), Appear); + SetCreatureAppearanceType(oTarget, Appear); + } + else + { + FloatingTextStringOnCreature("Invalid Appearance Type", oCommander); + } + + + dmw_CleanUp(oCommander); + return; + } + + + if (GetStringLeft(sCom, 5) == ".stre") + iOffset= 11; + else if (GetStringLeft(sCom, 5) == ".dext") + iOffset = 12; + else if (GetStringLeft(sCom, 5) == ".cons") + iOffset = 13; + else if (GetStringLeft(sCom, 5) == ".inte") + iOffset = 14; + else if (GetStringLeft(sCom, 5) == ".wisd") + iOffset = 15; + else if (GetStringLeft(sCom, 5) == ".char") + iOffset = 16; + else if (GetStringLeft(sCom, 5) == ".fort") + iOffset = 17; + else if (GetStringLeft(sCom, 5) == ".refl") + iOffset = 18; + else if (GetStringLeft(sCom, 5) == ".anim") + iOffset = 21; + else if (GetStringLeft(sCom, 5) == ".appr") + iOffset = 22; + else if (GetStringLeft(sCom, 5) == ".bluf") + iOffset = 23; + else if (GetStringLeft(sCom, 5) == ".conc") + iOffset = 24; + else if (GetStringLeft(sCom, 9) == ".craft ar") + iOffset = 25; + else if (GetStringLeft(sCom, 9) == ".craft tr") + iOffset = 26; + else if (GetStringLeft(sCom, 9) == ".craft we") + iOffset = 27; + else if (GetStringLeft(sCom, 5) == ".disa") + iOffset = 28; + else if (GetStringLeft(sCom, 5) == ".disc") + iOffset = 29; + else if (GetStringLeft(sCom, 5) == ".heal") + iOffset = 31; + else if (GetStringLeft(sCom, 5) == ".hide") + iOffset = 32; + else if (GetStringLeft(sCom, 5) == ".inti") + iOffset = 33; + else if (GetStringLeft(sCom, 5) == ".list") + iOffset = 34; + else if (GetStringLeft(sCom, 5) == ".lore") + iOffset = 35; + else if (GetStringLeft(sCom, 5) == ".move") + iOffset = 36; + else if (GetStringLeft(sCom, 5) == ".open") + iOffset = 37; + else if (GetStringLeft(sCom, 5) == ".parr") + iOffset = 38; + else if (GetStringLeft(sCom, 5) == ".perf") + iOffset = 39; + else if (GetStringLeft(sCom, 5) == ".pers") + iOffset = 41; + else if (GetStringLeft(sCom, 5) == ".pick") + iOffset = 42; + else if (GetStringLeft(sCom, 5) == ".sear") + iOffset = 43; + else if (GetStringLeft(sCom, 6) == ".set t") + iOffset = 44; + else if (GetStringLeft(sCom, 5) == ".spel") + iOffset = 45; + else if (GetStringLeft(sCom, 5) == ".spot") + iOffset = 46; + else if (GetStringLeft(sCom, 5) == ".taun") + iOffset = 47; + else if (GetStringLeft(sCom, 5) == ".tumb") + iOffset = 48; + else if (GetStringLeft(sCom, 4) == ".use") + iOffset = 49; + + if (iOffset!=0) + { + if (FindSubString(sCom, "all") != -1 || FindSubString(sArgs, "all") != -1) + SetLocalInt(oCommander, "dmfi_univ_int", iOffset+40); + else + SetLocalInt(oCommander, "dmfi_univ_int", iOffset); + + SetLocalString(oCommander, "dmfi_univ_conv", "dicebag"); + if (GetIsObjectValid(oTarget)) + { + if (oTarget != GetLocalObject(oCommander, "dmfi_univ_target")) + { + SetLocalObject(oCommander, "dmfi_univ_target", oTarget); + FloatingTextStringOnCreature("DMFI Target set to "+GetName(oTarget), oCommander); + } + ExecuteScript("dmfi_execute", oCommander); + } + else + { + DMFISendMessageToPC(oCommander, "No valid DMFI target!", FALSE, DMFI_MESSAGE_COLOR_ALERT); + } + + dmw_CleanUp(oCommander); + return; + } + + + if (GetStringLeft(sCom, 4) == ".set") + { + // sCom = GetStringRight(sCom, GetStringLength(sCom) - 4); + while (sArgs != "") + { + if (GetStringLeft(sArgs, 1) == " " || + GetStringLeft(sArgs, 1) == "[" || + GetStringLeft(sArgs, 1) == "." || + GetStringLeft(sArgs, 1) == ":" || + GetStringLeft(sArgs, 1) == ";" || + GetStringLeft(sArgs, 1) == "*" || + GetIsAlphanumeric(GetStringLeft(sArgs, 1))) + sArgs = GetStringRight(sArgs, GetStringLength(sArgs) - 1); + else + { + SetLocalObject(GetModule(), "hls_NPCControl" + GetStringLeft(sArgs, 1), oTarget); + FloatingTextStringOnCreature("The Control character for " + GetName(oTarget) + " is " + GetStringLeft(sArgs, 1), oCommander, FALSE); + return; + } + } + FloatingTextStringOnCreature("Your Control Character is not valid. Perhaps you are using a reserved character.", oCommander, FALSE); + return; + } + else if (GetStringLeft(sCom, 4) == ".ani") + { + int iArg = StringToInt(sArgs); + AssignCommand(oTarget, ClearAllActions(TRUE)); + AssignCommand(oTarget, ActionPlayAnimation(iArg, 1.0, 99999.0f)); + return; + } + else if (GetStringLowerCase(GetStringLeft(sCom, 4)) == ".buf") + { + string sArgsLC = GetStringLowerCase(sArgs); + if (FindSubString(sArgsLC, "low") !=-1) + { + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectACIncrease(3, AC_NATURAL_BONUS), oTarget, 3600.0f); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_PROT_BARKSKIN), oTarget, 3600.0f); + AssignCommand(oTarget, ActionCastSpellAtObject(SPELL_RESISTANCE, oTarget, METAMAGIC_ANY, TRUE, 5, PROJECTILE_PATH_TYPE_DEFAULT, TRUE)); + AssignCommand(oTarget, ActionCastSpellAtObject(SPELL_GHOSTLY_VISAGE, oTarget, METAMAGIC_ANY, TRUE, 5, PROJECTILE_PATH_TYPE_DEFAULT, TRUE)); + AssignCommand(oTarget, ActionCastSpellAtObject(SPELL_CLARITY, oTarget,METAMAGIC_ANY, TRUE, 5, PROJECTILE_PATH_TYPE_DEFAULT, TRUE)); + FloatingTextStringOnCreature("Low Buff applied: " + GetName(oTarget), oCommander); return; + } + else if (FindSubString(sArgsLC, "mid") !=-1) + { + AssignCommand(oTarget, ActionCastSpellAtObject(SPELL_LESSER_SPELL_MANTLE, oTarget, METAMAGIC_ANY, TRUE, 10, PROJECTILE_PATH_TYPE_DEFAULT, TRUE)); + AssignCommand(oTarget, ActionCastSpellAtObject(SPELL_STONESKIN, oTarget, METAMAGIC_ANY, TRUE, 10, PROJECTILE_PATH_TYPE_DEFAULT, TRUE)); + AssignCommand(oTarget, ActionCastSpellAtObject(SPELL_ELEMENTAL_SHIELD, oTarget,METAMAGIC_ANY, TRUE, 10, PROJECTILE_PATH_TYPE_DEFAULT, TRUE)); + FloatingTextStringOnCreature("Mid Buff applied: " + GetName(oTarget), oCommander); return; + } + else if (FindSubString(sArgsLC, "high") !=-1) + { + AssignCommand(oTarget, ActionCastSpellAtObject(SPELL_SPELL_MANTLE, oTarget, METAMAGIC_ANY, TRUE, 15, PROJECTILE_PATH_TYPE_DEFAULT, TRUE)); + AssignCommand(oTarget, ActionCastSpellAtObject(SPELL_STONESKIN, oTarget, METAMAGIC_ANY, TRUE,15, PROJECTILE_PATH_TYPE_DEFAULT, TRUE)); + AssignCommand(oTarget, ActionCastSpellAtObject(SPELL_SHADOW_SHIELD, oTarget,METAMAGIC_ANY, TRUE, 15, PROJECTILE_PATH_TYPE_DEFAULT, TRUE)); + FloatingTextStringOnCreature("High Buff applied: " + GetName(oTarget), oCommander); return; + } + else if (FindSubString(sArgsLC, "epic") !=-1) + { + AssignCommand(oTarget, ActionCastSpellAtObject(SPELL_GREATER_SPELL_MANTLE, oTarget, METAMAGIC_ANY, TRUE, 20, PROJECTILE_PATH_TYPE_DEFAULT, TRUE)); + AssignCommand(oTarget, ActionCastSpellAtObject(SPELL_SPELL_RESISTANCE, oTarget, METAMAGIC_ANY, TRUE, 20, PROJECTILE_PATH_TYPE_DEFAULT, TRUE)); + AssignCommand(oTarget, ActionCastSpellAtObject(SPELL_SHADOW_SHIELD, oTarget,METAMAGIC_ANY, TRUE, 20, PROJECTILE_PATH_TYPE_DEFAULT, TRUE)); + AssignCommand(oTarget, ActionCastSpellAtObject(SPELL_CLARITY, oTarget,METAMAGIC_ANY, TRUE, 20, PROJECTILE_PATH_TYPE_DEFAULT, TRUE)); + FloatingTextStringOnCreature("Epic Buff applied: " + GetName(oTarget), oCommander); return; + } + else if (FindSubString(sArgsLC, "barkskin") != -1) + { + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectACIncrease(3, AC_NATURAL_BONUS), oTarget, 3600.0f); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_PROT_BARKSKIN), oTarget, 3600.0f); return; + } + else if (FindSubString(sArgsLC, "elements") != -1) + { + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectDamageResistance(DAMAGE_TYPE_COLD, 20, 40), oTarget, 3600.0f); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectDamageResistance(DAMAGE_TYPE_FIRE, 20, 40), oTarget, 3600.0f); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectDamageResistance(DAMAGE_TYPE_ACID, 20, 40), oTarget, 3600.0f); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectDamageResistance(DAMAGE_TYPE_SONIC, 20, 40), oTarget, 3600.0f); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectDamageResistance(DAMAGE_TYPE_ELECTRICAL, 20, 40), oTarget, 3600.0f); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_PROTECTION_ELEMENTS), oTarget, 3600.0f); return; + } + else if (FindSubString(sArgsLC, "haste") != -1) + { + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectHaste(), oTarget, 3600.0f); return; + } + else if (FindSubString(sArgsLC, "immortal") != -1) // tsunami282 added + { + SetImmortal(oTarget, TRUE); + FloatingTextStringOnCreature("The target is set to Immortal (cannot die).", oCommander, FALSE); return; + } + else if (FindSubString(sArgsLC, "mortal") != -1) // tsunami282 added + { + SetImmortal(oTarget, TRUE); + FloatingTextStringOnCreature("The target is set to Mortal (can die).", oCommander, FALSE); return; + } + else if (FindSubString(sArgsLC, "invis") != -1) + { + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectInvisibility(INVISIBILITY_TYPE_NORMAL), oTarget, 3600.0f); return; + } + else if (FindSubString(sArgsLC, "unplot") != -1) + { + SetPlotFlag(oTarget, FALSE); + FloatingTextStringOnCreature("The target is set to non-Plot.", oCommander, FALSE); return; + } + else if (FindSubString(sArgsLC, "plot") != -1) + { + SetPlotFlag(oTarget, TRUE); + FloatingTextStringOnCreature("The target is set to Plot.", oCommander, FALSE); return; + } + else if (FindSubString(sArgsLC, "stoneskin") != -1) + { + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectDamageReduction(10, DAMAGE_POWER_PLUS_THREE, 100), oTarget, 3600.0f); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_PROT_GREATER_STONESKIN), oTarget, 3600.0f); return; + } + else if (FindSubString(sArgsLC, "trues") != -1) + { + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectTrueSeeing(), oTarget, 3600.0f); return; + } + } + else if (GetStringLeft(sCom, 4) == ".dam") + { + int iArg = StringToInt(sArgs); + ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(iArg, DAMAGE_TYPE_MAGICAL, DAMAGE_POWER_NORMAL), oTarget); + ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_BLOOD_LRG_RED), oTarget); + FloatingTextStringOnCreature(GetName(oTarget) + " has taken " + IntToString(iArg) + " damage.", oCommander, FALSE); + return; + } + // 2008.05.29 tsunami282 - set description + else if (GetStringLeft(sCom, 5) == ".desc") + { + // object oTgt = GetLocalObject(oCommander, "dmfi_univ_target"); + if (GetIsObjectValid(oTarget)) + { + if (sArgs == ".") // single dot means reset to base description + { + SetDescription(oTarget); + } + else // assign new description + { + SetDescription(oTarget, sArgs); + } + FloatingTextStringOnCreature("Target's description set to " + GetDescription(oTarget), oCommander, FALSE); + } + else + { + FloatingTextStringOnCreature("Invalid target - command not processed.", oCommander, FALSE); + } + } + else if (GetStringLeft(sCom, 5) == ".dism") + { + DestroyObject(oTarget); + FloatingTextStringOnCreature(GetName(oTarget) + " dismissed", oCommander, FALSE); return; + } + else if (GetStringLeft(sCom, 4) == ".inv") + { + OpenInventory(oTarget, oCommander); + return; + } + else if (GetStringLeft(sCom, 4) == ".dmt") + { + SetLocalInt(GetModule(), "dmfi_DMToolLock", abs(GetLocalInt(GetModule(), "dmfi_DMToolLock") -1)); return; + } + // else if (GetStringLowerCase(GetStringLeft(sCom, 4)) == ".dms") + // { + // SetDMFIPersistentInt("dmfi", "dmfi_DMSpy", abs(GetDMFIPersistentInt("dmfi", "dmfi_DMSpy", oCommander) -1), oCommander); return; + // } + else if (GetStringLeft(sCom, 4) == ".fac") + { + string sArgsLC = GetStringLowerCase(sArgs); + if (FindSubString(sArgsLC, "hostile") != -1) + { + ChangeToStandardFaction(oTarget, STANDARD_FACTION_HOSTILE); + FloatingTextStringOnCreature("Faction set to hostile", oCommander, FALSE); + } + else if (FindSubString(sArgsLC, "commoner") != -1) + { + ChangeToStandardFaction(oTarget, STANDARD_FACTION_COMMONER); + FloatingTextStringOnCreature("Faction set to commoner", oCommander, FALSE); + } + else if (FindSubString(sArgsLC, "defender") != -1) + { + ChangeToStandardFaction(oTarget, STANDARD_FACTION_DEFENDER); + FloatingTextStringOnCreature("Faction set to defender", oCommander, FALSE); + } + else if (FindSubString(sArgsLC, "merchant") != -1) + { + ChangeToStandardFaction(oTarget, STANDARD_FACTION_MERCHANT); + FloatingTextStringOnCreature("Faction set to merchant", oCommander, FALSE); + } + else + { + DMFISendMessageToPC(oCommander, "Invalid faction name - command aborted.", FALSE, DMFI_MESSAGE_COLOR_ALERT); + return; + } + + // toggle blindness on the target, to cause a re-perception + if (GetIsImmune(oTarget, IMMUNITY_TYPE_BLINDNESS)) + { + DMFISendMessageToPC(oCommander, "Targeted creature is blind immune - no attack will occur until new perception event is fired", FALSE, DMFI_MESSAGE_COLOR_ALERT); + } + else + { + effect eInvis =EffectBlindness(); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eInvis, oTarget, 6.1); + DMFISendMessageToPC(oCommander, "Faction Adjusted - will take effect in 6 seconds", FALSE, DMFI_MESSAGE_COLOR_STATUS); + } + return; + } + else if (GetStringLeft(sCom, 4) == ".fle") + { + AssignCommand(oTarget, ClearAllActions(TRUE)); + AssignCommand(oTarget, ActionMoveAwayFromObject(oCommander, TRUE)); + return; + } + else if (GetStringLeft(sCom, 4) == ".fly") + { + ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDisappear(), oTarget); + return; + } + else if (GetStringLeft(sCom, 4) == ".fol") + { + int iArg = StringToInt(sArgs); + FloatingTextStringOnCreature(GetName(oTarget) + " will follow you for "+IntToString(iArg)+" seconds.", oCommander, FALSE); + AssignCommand(oTarget, ClearAllActions(TRUE)); + AssignCommand(oTarget, ActionForceMoveToObject(oCommander, TRUE, 2.0f, IntToFloat(iArg))); + DelayCommand(IntToFloat(iArg), FloatingTextStringOnCreature(GetName(oTarget) + " has stopped following you.", oCommander, FALSE)); + return; + } + else if (GetStringLeft(sCom, 4) == ".fre") + { + FloatingTextStringOnCreature(GetName(oTarget) + " frozen", oCommander, FALSE); + SetCommandable(TRUE, oTarget); + AssignCommand(oTarget, ClearAllActions(TRUE)); + DelayCommand(0.5f, SetCommandable(FALSE, oTarget)); + return; + } + else if (GetStringLeft(sCom, 4) == ".get") + { + while (sArgs != "") + { + if (GetStringLeft(sArgs, 1) == " " || + GetStringLeft(sArgs, 1) == "[" || + GetStringLeft(sArgs, 1) == "." || + GetStringLeft(sArgs, 1) == ":" || + GetStringLeft(sArgs, 1) == ";" || + GetStringLeft(sArgs, 1) == "*" || + GetIsAlphanumeric(GetStringLeft(sArgs, 1))) + sArgs = GetStringRight(sArgs, GetStringLength(sArgs) - 1); + else + { + object oJump = GetLocalObject(GetModule(), "hls_NPCControl" + GetStringLeft(sArgs, 1)); + if (GetIsObjectValid(oJump)) + { + AssignCommand(oJump, ClearAllActions()); + AssignCommand(oJump, ActionJumpToLocation(GetLocation(oCommander))); + } + else + { + FloatingTextStringOnCreature("Your Control Character is not valid. Perhaps you are using a reserved character.", oCommander, FALSE); + } + return; + } + } + FloatingTextStringOnCreature("Your Control Character is not valid. Perhaps you are using a reserved character.", oCommander, FALSE); + return; + + } + else if (GetStringLeft(sCom, 4) == ".got") + { + while (sArgs != "") + { + if (GetStringLeft(sArgs, 1) == " " || + GetStringLeft(sArgs, 1) == "[" || + GetStringLeft(sArgs, 1) == "." || + GetStringLeft(sArgs, 1) == ":" || + GetStringLeft(sArgs, 1) == ";" || + GetStringLeft(sArgs, 1) == "*" || + GetIsAlphanumeric(GetStringLeft(sArgs, 1))) + sArgs = GetStringRight(sArgs, GetStringLength(sArgs) - 1); + else + { + object oJump = GetLocalObject(GetModule(), "hls_NPCControl" + GetStringLeft(sArgs, 1)); + if (GetIsObjectValid(oJump)) + { + AssignCommand(oCommander, ClearAllActions()); + AssignCommand(oCommander, ActionJumpToLocation(GetLocation(oJump))); + } + else + { + FloatingTextStringOnCreature("Your Control Character is not valid. Perhaps you are using a reserved character.", oCommander, FALSE); + } + return; + } + } + FloatingTextStringOnCreature("Your Control Character is not valid. Perhaps you are using a reserved character.", oCommander, FALSE); + return; + } + else if (GetStringLeft(sCom, 4) == ".hea") + { + int iArg = StringToInt(sArgs); + ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectHeal(iArg), oTarget); + ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_HEALING_M), oTarget); + FloatingTextStringOnCreature(GetName(oTarget) + " has healed " + IntToString(iArg) + " HP.", oCommander, FALSE); + return; + } + else if (GetStringLeft(sCom, 4) == ".ite") + { + object oCreate = CreateItemOnObject(sArgs, oTarget, 1); + if (GetIsObjectValid(oCreate)) FloatingTextStringOnCreature("Item " + GetName(oCreate) + " created.", oCommander, FALSE); + return; + } + // 2008.05.29 tsunami282 - set name + else if (GetStringLeft(sCom, 5) == ".name") + { + // object oTgt = GetLocalObject(oCommander, "dmfi_univ_target"); + if (GetIsObjectValid(oTarget)) + { + if (sArgs == ".") // single dot means reset to base name + { + SetName(oTarget); + } + else // assign new name + { + SetName(oTarget, sArgs); + } + FloatingTextStringOnCreature("Target's name set to " + GetName(oTarget), oCommander, FALSE); + } + else + { + FloatingTextStringOnCreature("Invalid target - command not processed.", oCommander, FALSE); + } + } + else if (GetStringLeft(sCom, 4) == ".mut") + { + FloatingTextStringOnCreature(GetName(oTarget) + " muted", oCommander, FALSE); + SetLocalInt(oTarget, "dmfi_Mute", 1); + return; + } + else if (GetStringLeft(sCom, 4) == ".npc") + { + object oCreate = CreateObject(OBJECT_TYPE_CREATURE, sArgs, GetLocation(oTarget)); + if (GetIsObjectValid(oCreate)) + FloatingTextStringOnCreature("NPC " + GetName(oCreate) + " created.", oCommander, FALSE); + return; + } + else if (GetStringLeft(sCom, 4) == ".pla") + { + object oCreate = CreateObject(OBJECT_TYPE_PLACEABLE, sArgs, GetLocation(oTarget)); + if (GetIsObjectValid(oCreate)) + FloatingTextStringOnCreature("Placeable " + GetName(oCreate) + " created.", oCommander, FALSE); + return; + } + else if (GetStringLeft(sCom, 4) == ".rem") + { + effect eRemove = GetFirstEffect(oTarget); + while (GetIsEffectValid(eRemove)) + { + RemoveEffect(oTarget, eRemove); + eRemove = GetNextEffect(oTarget); + } + return; + } + else if (GetStringLeft(sCom, 4) == ".say") + { + int iArg = StringToInt(sArgs); + if (GetDMFIPersistentString("dmfi", "hls206" + IntToString(iArg)) != "") + { + AssignCommand(oTarget, SpeakString(GetDMFIPersistentString("dmfi", "hls206" + IntToString(iArg)))); + } + return; + } + else if (GetStringLeft(sCom, 4) == ".tar") + { + object oGet = GetFirstObjectInArea(GetArea(oCommander)); + while (GetIsObjectValid(oGet)) + { + if (FindSubString(GetName(oGet), sArgs) != -1) + { + // SetLocalObject(oCommander, "dmfi_VoiceTarget", oGet); + SetLocalObject(oCommander, "dmfi_univ_target", oGet); + FloatingTextStringOnCreature("You have targeted " + GetName(oGet) + " with the DMFI Targeting Widget", oCommander, FALSE); + return; + } + oGet = GetNextObjectInArea(GetArea(oCommander)); + } + FloatingTextStringOnCreature("Target not found.", oCommander, FALSE); + return; + } + else if (GetStringLeft(sCom, 4) == ".unf") + { + FloatingTextStringOnCreature(GetName(oTarget) + " unfrozen", oCommander, FALSE); + SetCommandable(TRUE, oTarget); return; + } + else if (GetStringLeft(sCom, 4) == ".unm") + { + FloatingTextStringOnCreature(GetName(oTarget) + " un-muted", oCommander, FALSE); + DeleteLocalInt(oTarget, "dmfi_Mute"); return; + } + else if (GetStringLeft(sCom, 4) == ".vfx") + { + int iArg = StringToInt(sArgs); + if (GetTag(oTarget) == "dmfi_voice") + ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(iArg), GetLocation(oTarget), 10.0f); + else + ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(iArg), oTarget, 10.0f); + return; + } + else if (GetStringLeft(sCom, 5) == ".vtar") + { + object oGet = GetFirstObjectInArea(GetArea(oCommander)); + while (GetIsObjectValid(oGet)) + { + if (FindSubString(GetName(oGet), sArgs) != -1) + { + SetLocalObject(oCommander, "dmfi_VoiceTarget", oGet); + FloatingTextStringOnCreature("You have targeted " + GetName(oGet) + " with the Voice Widget", oCommander, FALSE); + return; + } + oGet = GetNextObjectInArea(GetArea(oCommander)); + } + FloatingTextStringOnCreature("Target not found.", oCommander, FALSE); + return; + } +} + +//////////////////////////////////////////////////////////////////////// +void subTranslateToLanguage(string sSaid, object oShouter, int nVolume, + object oMaster, int iTranslate, string sLanguageName, + object oEavesdrop) +{ + string sVolume = "said"; + if (nVolume == TALKVOLUME_WHISPER) sVolume = "whispered"; + else if (nVolume == TALKVOLUME_SHOUT) sVolume = "shouted"; + else if (nVolume == TALKVOLUME_PARTY) sVolume = "said to the party"; + else if (nVolume == TALKVOLUME_SILENT_SHOUT) sVolume = "said to the DM's"; + + //Translate and Send or do Lore check + if (oEavesdrop == oMaster || + GetIsObjectValid(GetItemPossessedBy(oEavesdrop, "hlslang_" + IntToString(iTranslate))) || + GetIsObjectValid(GetItemPossessedBy(oEavesdrop, "babelfish")) || + iTranslate == GetDefaultRacialLanguage(oEavesdrop, 0) || + iTranslate == GetDefaultClassLanguage(oEavesdrop) || + GetIsDM(oEavesdrop) || + GetIsDMPossessed(oEavesdrop)) + { + DelayCommand(0.1, DMFISendMessageToPC(oEavesdrop, GetName(oShouter) + " " + sVolume + " in " + sLanguageName + ": " + sSaid, FALSE, DMFI_MESSAGE_COLOR_TRANSLATION)); + } + else + { + if (iTranslate != 9) + { + string sKnownLanguage; + if (d20() + GetSkillRank(SKILL_LORE, oEavesdrop) > 20) sKnownLanguage = sLanguageName; + else sKnownLanguage = "a language you do not recognize"; + DelayCommand(0.1, DMFISendMessageToPC(oEavesdrop, GetName(oShouter)+" "+sVolume+" something in "+sKnownLanguage+".", FALSE, DMFI_MESSAGE_COLOR_TRANSLATION)); + } + } +} + +//////////////////////////////////////////////////////////////////////// +string TranslateToLanguage(string sSaid, object oShouter, int nVolume, object oMaster) +{ +// arguments +// (return) = translated text +// sSaid = string to translate +// oShouter = object that spoke sSaid +// iVolume = TALKVOLUME setting of speaker +// oMaster = master of oShouter (if oShouter has no master, oMaster should equal oShouter) + + //Gets the current language that the character is speaking + int iTranslate = GetLocalInt(oShouter, "hls_MyLanguage"); + if (!iTranslate) iTranslate = GetDefaultRacialLanguage(oShouter, 1); + if (!iTranslate) + { + DMFISendMessageToPC(oMaster, "Translator Error: your message was dropped.", FALSE, DMFI_MESSAGE_COLOR_ALERT); + return ""; + } + + //Defines language name + string sLanguageName = GetLocalString(oShouter, "hls_MyLanguageName"); + + sSaid = GetStringRight(sSaid, GetStringLength(sSaid)-1); // toss the leading translate flag '[' + //Thieves' Cant character limit of 25 + if (iTranslate == 9 && GetStringLength(sSaid) > 25) + sSaid = GetStringLeft(sSaid, 25); + string sSpeak = TranslateCommonToLanguage(iTranslate, sSaid); + // lop off trailing ']' + if (GetStringRight(sSaid, 1) == "]") + sSaid = GetStringLeft(sSaid, GetStringLength(sSaid)-1); + // AssignCommand(oShouter, SpeakString(sSpeak)); // no need reissue translated speech, handled in player chat hook + + // send speech to everyone who should be able to hear + float fDistance = 20.0f; + if (nVolume == TALKVOLUME_WHISPER) + { + fDistance = 1.0f; + } + string sVolume = "said"; + if (nVolume == TALKVOLUME_WHISPER) sVolume = "whispered"; + else if (nVolume == TALKVOLUME_SHOUT) sVolume = "shouted"; + else if (nVolume == TALKVOLUME_PARTY) sVolume = "said to the party"; + else if (nVolume == TALKVOLUME_SILENT_SHOUT) sVolume = "said to the DM's"; + string sKnownLanguage; + + // send translated message to PC's in range who understand it + object oEavesdrop = GetFirstObjectInShape(SHAPE_SPHERE, fDistance, GetLocation(oShouter), FALSE, OBJECT_TYPE_CREATURE); + while (GetIsObjectValid(oEavesdrop)) + { + if (GetIsPC(oEavesdrop) || GetIsDM(oEavesdrop) || GetIsDMPossessed(oEavesdrop) || GetIsPossessedFamiliar(oEavesdrop)) + { + subTranslateToLanguage(sSaid, oShouter, nVolume, oMaster, iTranslate, sLanguageName, oEavesdrop); + } + oEavesdrop = GetNextObjectInShape(SHAPE_SPHERE, fDistance, GetLocation(oShouter), FALSE, OBJECT_TYPE_CREATURE); + } + + // send translated message to DM's in range + oEavesdrop = GetFirstPC(); + while (GetIsObjectValid(oEavesdrop)) + { + if (GetIsDM(oEavesdrop)) + { + if (GetArea(oShouter) == GetArea(oEavesdrop) && + GetDistanceBetweenLocations(GetLocation(oShouter), GetLocation(oEavesdrop)) <= fDistance) + { + subTranslateToLanguage(sSaid, oShouter, nVolume, oMaster, iTranslate, sLanguageName, oEavesdrop); + } + } + oEavesdrop = GetNextPC(); + } + return sSpeak; +} + +//////////////////////////////////////////////////////////////////////// +int RelayTextToEavesdropper(object oShouter, int nVolume, string sSaid) +{ +// arguments +// (return) - flag to continue processing text: X2_EXECUTE_SCRIPT_CONTINUE or +// X2_EXECUTE_SCRIPT_END +// oShouter - object that spoke +// nVolume - channel (TALKVOLUME) text was spoken on +// sSaid - text that was spoken + + int bScriptEnd = X2_EXECUTE_SCRIPT_CONTINUE; + + // sanity checks + if (GetIsObjectValid(oShouter)) + { + int iHookToDelete = 0; + int iHookType = 0; + int channels = 0; + int rangemode = 0; + string siHook = ""; + object oMod = GetModule(); + int iHook = 1; + while (1) + { + siHook = IntToString(iHook); + iHookType = GetLocalInt(oMod, sHookTypeVarname+siHook); + if (iHookType == 0) break; // end of list + + // check channel + channels = GetLocalInt(oMod, sHookChannelsVarname+siHook); + if (((1 << nVolume) & channels) != 0) + { + string sVol = (nVolume == TALKVOLUME_WHISPER ? "whispers" : "says"); + object oOwner = GetLocalObject(oMod, sHookOwnerVarname+siHook); + if (GetIsObjectValid(oOwner)) + { + // it's a channel for us to listen on, process + int bcast = GetLocalInt(oMod, sHookBcastDMsVarname+siHook); + // for type 1, see if speaker is the one we want (pc or party) + // for type 2, see if speaker says his stuff within ("earshot" / area / module) of listener's location + if (iHookType == 1) // listen to what a PC hears + { + object oListener; + location locShouter, locListener; + object oTargeted = GetLocalObject(oMod, sHookCreatureVarname+siHook); + if (GetIsObjectValid(oTargeted)) + { + rangemode = GetLocalInt(oMod, sHookRangeModeVarname+siHook); + if (rangemode) oListener = GetFirstFactionMember(oTargeted, FALSE); // everyone in party are our listeners + else oListener = oTargeted; // only selected PC is our listener + while (GetIsObjectValid(oListener)) + { + // check speaker: + // check within earshot + int bInRange = FALSE; + locShouter = GetLocation(oShouter); + locListener = GetLocation(oListener); + if (oShouter == oListener) + { + bInRange = TRUE; // the target can always hear himself + } + else if (GetAreaFromLocation(locShouter) == GetAreaFromLocation(locListener)) + { + float dist = GetDistanceBetweenLocations(locListener, locShouter); + if ((nVolume == TALKVOLUME_WHISPER && dist <= WHISPER_DISTANCE) || + (nVolume != TALKVOLUME_WHISPER && dist <= TALK_DISTANCE)) + { + bInRange = TRUE; + } + } + if (bInRange) + { + // relay what's said to the hook owner + string sMesg = "("+GetName(GetArea(oShouter))+") "+GetName(oShouter)+" "+sVol+": "+sSaid; + // if (bcast) SendMessageToAllDMs(sMesg); + // else SendMessageToPC(oOwner, sMesg); + DMFISendMessageToPC(oOwner, sMesg, bcast, DMFI_MESSAGE_COLOR_EAVESDROP); + } + if (rangemode == 0) break; // only check the target creature for rangemode 0 + if (bInRange) break; // once any party member hears shouter, we're done + oListener = GetNextFactionMember(oTargeted, FALSE); + } + } + else + { + // bad desired speaker, remove hook + iHookToDelete = iHook; + } + } + else if (iHookType == 2) // listen at location + { + location locShouter, locListener; + object oListener = GetLocalObject(oMod, sHookCreatureVarname+siHook); + if (oListener != OBJECT_INVALID) + { + locListener = GetLocation(oListener); + } + else + { + locListener = GetLocalLocation(oMod, sHookLocationVarname+siHook); + } + locShouter = GetLocation(oShouter); + rangemode = GetLocalInt(oMod, sHookRangeModeVarname+siHook); + int bInRange = FALSE; + if (rangemode == 0) + { + // check within earshot + if (GetAreaFromLocation(locShouter) == GetAreaFromLocation(locListener)) + { + float dist = GetDistanceBetweenLocations(locListener, locShouter); + if ((nVolume == TALKVOLUME_WHISPER && dist <= WHISPER_DISTANCE) || + (nVolume != TALKVOLUME_WHISPER && dist <= TALK_DISTANCE)) + { + bInRange = TRUE; + } + } + } + else if (rangemode == 1) + { + // check within area + if (GetAreaFromLocation(locShouter) == GetAreaFromLocation(locListener)) bInRange = TRUE; + } + else + { + // module-wide + bInRange = TRUE; + } + if (bInRange) + { + // relay what's said to the hook owner + string sMesg = "("+GetName(GetArea(oShouter))+") "+GetName(oShouter)+" "+sVol+": "+sSaid; + // if (bcast) SendMessageToAllDMs(sMesg); + // else SendMessageToPC(oOwner, sMesg); + DMFISendMessageToPC(oOwner, sMesg, bcast, DMFI_MESSAGE_COLOR_EAVESDROP); + } + } + else + { + WriteTimestampedLogEntry("ERROR: DMFI OnPlayerChat handler: invalid iHookType; removing hook."); + iHookToDelete = iHook; + } + } + else + { + // bad owner, delete hook + iHookToDelete = iHook; + } + } + + iHook++; + } + + // remove a bad hook: note we can only remove one bad hook this way, have to rely on subsequent calls to remove any others + if (iHookToDelete > 0) + { + RemoveListenerHook(iHookToDelete); + } + } + + return bScriptEnd; +} + +//////////////////////////////////////////////////////////////////////// +void main() +{ + int bScriptEnd = X2_EXECUTE_SCRIPT_CONTINUE; + int nVolume = GetPCChatVolume(); + object oShouter = GetPCChatSpeaker(); + string sSaid = GetPCChatMessage(); + +// SpawnScriptDebugger(); +// DMFISendMessageToPC(oShouter, IntToString(nVolume)+">> "+sSaid, FALSE, "737"); + + // pass on any heard text to registered listeners + // since listeners are set by DM's, pass the raw unprocessed command text to them + bScriptEnd = RelayTextToEavesdropper(oShouter, nVolume, sSaid); + + if (bScriptEnd == X2_EXECUTE_SCRIPT_CONTINUE) + { + // see if we're supposed to listen on this channel + if ((nVolume == TALKVOLUME_TALK && DMFI_LISTEN_ON_CHANNEL_TALK) || + (nVolume == TALKVOLUME_SILENT_SHOUT && DMFI_LISTEN_ON_CHANNEL_DM) || + (nVolume == TALKVOLUME_WHISPER && DMFI_LISTEN_ON_CHANNEL_WHISPER) || + (nVolume == TALKVOLUME_PARTY && DMFI_LISTEN_ON_CHANNEL_PARTY) || + (nVolume == TALKVOLUME_SHOUT && DMFI_LISTEN_ON_CHANNEL_SHOUT)) + { + // yes we are + // now see if we have a command to parse + // special chars: + // [ = speak in alternate language + // * = perform emote + // : = throw voice to last designated target + // ; = throw voice to master / animal companion / familiar / henchman / summon + // , = throw voice summon / henchman / familiar / animal companion / master + // . = command to execute + + int bChangedText = 0; + object oTarget = OBJECT_INVALID; + int iTargetType = 0; + + // eat leading whitespace + while (GetStringLeft(sSaid, 1) == " ") + { + sSaid = GetStringRight(sSaid, GetStringLength(sSaid)-1); + } + + string sLeadChar = GetStringLeft(sSaid, 1); + string s2ndChar = GetStringRight(GetStringLeft(sSaid, 2), 1); + + // check for target selection + if (s2ndChar != sLeadChar) // doubled leadins should be ignored + { + if (sLeadChar == ":") + { + if (GetIsDM(oShouter) || GetIsDMPossessed(oShouter)) + { + // last creature targeted with DMFI Voice Widget + iTargetType = 1; + oTarget = GetLocalObject(oShouter, "dmfi_VoiceTarget"); + } + else + { + // non-DM's can't target others + iTargetType = -1; + oTarget = OBJECT_INVALID; + } + } + else if (sLeadChar == ";") + { + // master / animal companion / familiar / henchman / summon + iTargetType = 2; + oTarget = GetMaster(oShouter); + if (!GetIsObjectValid(oTarget)) + { + oTarget = GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION, oShouter); + if (!GetIsObjectValid(oTarget)) + { + oTarget = GetAssociate(ASSOCIATE_TYPE_FAMILIAR, oShouter); + if (!GetIsObjectValid(oTarget)) + { + oTarget = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oShouter); + if (!GetIsObjectValid(oTarget)) + { + oTarget = GetAssociate(ASSOCIATE_TYPE_SUMMONED, oShouter); + } + } + } + } + } + else if (sLeadChar == ",") + { + // summon / henchman / familiar / animal companion / master + iTargetType = 3; + oTarget = GetAssociate(ASSOCIATE_TYPE_SUMMONED, oShouter); + if (!GetIsObjectValid(oTarget)) + { + oTarget = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oShouter); + if (!GetIsObjectValid(oTarget)) + { + oTarget = GetAssociate(ASSOCIATE_TYPE_FAMILIAR, oShouter); + if (!GetIsObjectValid(oTarget)) + { + oTarget = GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION, oShouter); + if (!GetIsObjectValid(oTarget)) + { + oTarget = GetMaster(oShouter); + } + } + } + } + } + + if (iTargetType != 0) + { + // eat the targeting character and any whitespace following it + sSaid = GetStringRight(sSaid, GetStringLength(sSaid)-1); + while (GetStringLeft(sSaid, 1) == " ") + { + sSaid = GetStringRight(sSaid, GetStringLength(sSaid)-1); + } + sLeadChar = GetStringLeft(sSaid, 1); + } + + // now parse special command char (.command, *emote, [lang) + if (sLeadChar == ".") + { + bChangedText = 1; + if (oTarget == OBJECT_INVALID) + { + // 2008.05.29 tsunami282 - no target set, so dot command uses DMFI targeting wand + oTarget = GetLocalObject(oShouter, "dmfi_univ_target"); + } + + if (GetIsObjectValid(oTarget)) + { + ParseCommand(oTarget, oShouter, sSaid); + sSaid = ""; + } + else + { + // target invalid + bChangedText = 1; + DMFISendMessageToPC(oShouter, "Invalid command target - not processed.", FALSE, DMFI_MESSAGE_COLOR_ALERT); + sSaid = ""; + } + } + else if (sLeadChar == "*") + { + bChangedText = 1; + if (oTarget == OBJECT_INVALID) oTarget = oShouter; // untargeted emotes apply to self + if (GetIsObjectValid(oTarget)) + { + ParseEmote(sSaid, oTarget); + } + else + { + // target invalid + bChangedText = 1; + DMFISendMessageToPC(oShouter, "Invalid emote target - not processed.", FALSE, DMFI_MESSAGE_COLOR_ALERT); + sSaid = ""; + } + } + else if (sLeadChar == "[") + { + bChangedText = 1; + if (oTarget == OBJECT_INVALID) oTarget = oShouter; // untargeted languages spoken by self + if (GetIsObjectValid(oTarget)) + { + sSaid = TranslateToLanguage(sSaid, oTarget, nVolume, oShouter); + } + else + { + // target invalid + bChangedText = 1; + DMFISendMessageToPC(oShouter, "Invalid language target - not processed.", FALSE, DMFI_MESSAGE_COLOR_ALERT); + sSaid = ""; + } + } + } + + if (iTargetType != 0) + { + // throw the message + if (sSaid != "") + { + bChangedText = 1; + AssignCommand(oTarget, SpeakString(sSaid, nVolume)); + if (DMFI_LOG_CONVERSATION) + { + PrintString(""+GetName(GetArea(oTarget))+ " " + GetName(oTarget) + ": " + sSaid + " "); + } + sSaid = ""; + } + } + else + { + // log what was said + if (DMFI_LOG_CONVERSATION && (sSaid != "")) + { + PrintString(""+GetName(GetArea(oShouter))+ " " + GetName(oShouter) + ": " + sSaid + " "); + } + } + + if (bChangedText) + { + SetPCChatMessage(sSaid); + bScriptEnd = X2_EXECUTE_SCRIPT_END; + } + } + } + + SetExecutedScriptReturnValue(bScriptEnd); +} diff --git a/gamma_age_v2/dmfi_plychat_inc.ncs b/gamma_age_v2/dmfi_plychat_inc.ncs new file mode 100644 index 0000000000000000000000000000000000000000..8593a33766da69a6902bc3fad43dcd4b17e3556e GIT binary patch literal 191 zcmeZs4ps;=)H85mU|`rU2P7Cc6d0J8S(t$=Mli`BsKChh|Ns9V3@p+NK>81gEF)f7 cCcLsNcx749WwjW3I_Rl9KvYIO{>0LJ`e5afEJ6#tW(F%;(K z6!P7QW2k97{hYs82lGWrb!TCG7vl}!UIf&X^M16+{{ZO3V6K%l(EkV^7iAroZU*#Y zI-)#*=AKcW0%*miK`+=s8mg(g7fkY{hlFubx3Ej| z_tJEUVlg*E_Q%e%j+q?UREn-~VXN_Uovp=%T>N3qN}@f9%TvAaAWZ66cJQIzz8MrV z5A8EkjAu5eO&PhFp|R&Pu>LBMy}B0Tn*W7_Af1Dz9PpPVb}w4EGif=@KRGGwS9t|5 z@A&NAynuah^sb|^>A~5F{xJ9~NzmtcI+DN}vpAcS4xx*_0Z%;3z5X^0(V6i&WKKj6 z$5p~Z^}DUDm-;-DN~gI4doj_0M;P*Iq)nx5lXJt5lT0Jr=){Q$V<(#$Hz^Tr)~2>j z=eR~MH=%Ue)XQ8ZM22>2JLZ|whfMUy*>ROFhnb>?QLH>| zZ9`k1dbqgIV0E*ZD74@@rU`0>T~_Pct)2gBnONSWVz^uhQ&l)hENC9zZnZ8hT7wC; zGpoF{eD@2-$mcfy$z$Px@&WT9uK=q68x0!_8w(o>qe#TY!AH(U!6v~+%*V^)W@BJO PU?W%u`0)AQ$xr+P))@)_ literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_rest.utp b/gamma_age_v2/dmfi_rest.utp new file mode 100644 index 0000000000000000000000000000000000000000..ed03792650adaa4ec8620f6aebf4ca8ecc688326 GIT binary patch literal 1963 zcmZ`)%aYVK6cynW2ni4#c?a`;W=Mckr7EkTT~pJ=!(B5CEGc#Oof&~GJF*&T_W2c7 zEMSobkQYf7`GHhrnNLa1QOj<#Kvl>0T@j&|zjh3;yNn+ar%RFxbYk3FwHU{klZ{qiXH*G&i)BkSM345T!4|ZY> z#eS~kFz__`??ub?zYqM2q^!XQ0AtBNj2uRN1T?kyxWhl;U~Hd8%e@`}z5~b;;QPpr z!u}BXG1wm?KMwmW@)NMnBR>iIBJxwPKSh2T_UFjY!2S~XS=e7AKL`6;9tIlie2X**J>$IevV zls5DYrKoc4Wku>0SyO6p>dO@=$_H{yHWAUw%UY1+e%cH1z0y7qSL-H0-+FOwT6sOn zIm?nBH$x$Qke5D?_(0Yb`DSXIOhOM+$5&fF4h27}#CE1vgVK4YjqlH1S3{?(RJ@Gi z0_Of~!NE7RcExO#H1N0?%)s%bd|ovAnU&RzxNQ2v&8jUR*8fU97p*BmF;+dQi27BP zXs7KszOg(A+h`xXsdHj|+r6ya#7bQ^0ZZ6l!)e2zbUN;sJny(Fv*CndH5B|*7ka%d zA$-w(qkRQ_s6f+^*=4NPj}R2PvQX`2l=*H*F0$yo9^XgS%<@FK0*^HZP zIKR%>uov08pA+UsI&9fb-G~#0`P*tKHPE?uFa0#8?3G1<+1m-It&?KS+;viW{@fIL z=vHVHtMtZFKfxTPHuwV){6{{?M)&YR;%|B-`ZoOGhN+V>3@19z%ZGI`=+%iY6Xs7W z&SJEg7@s`cFvu1<@kVY6<7Lvsafb=e{+x+sQ>@~ literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_rest001.utp b/gamma_age_v2/dmfi_rest001.utp new file mode 100644 index 0000000000000000000000000000000000000000..dd994c19cd421b1d2039be977f858853a46f7465 GIT binary patch literal 1953 zcmZ`)%aRmD6it+eA|fi_TMHZn6^G$r1mSMziizn^?2egcTpHQkcV<$mvdXM%i1`zj zxR3>c_yTodgg@ZU|Iu@@Gpmb*H{#SiH|y5T%$rrGZj6T6*5&0(SCvxxfE@T3`0J^; zKXy>5KN0^8{}24Phj4-Y3!`W5VUlP^;92K+fE;DiGVmPmH1G{T+dp^VdLVMfyZ zj5!r+G549s;ncIdMC;DY=b2CA+{w5W8rO0ZxD%6J08jbHz>~cQlEz<3gYYkR`0-B8 zi8#)+oCNO1_?76n{#Sud0QTTDfVt$aM-Hdn08%gB?C`gEGuqqHbFc3J_W<$?_&)Me z@b@D>4gVnWcj14Cd?M151^5FP=^b1b_E|OgT$j=g zslBOe7#m4h7uw5)G#j$5)auMv8&X!c*s`CwF((Z3x7|`|s0;C4`gttbtI86yw-ZoXr{%W!(n;ef zJQVsQh7{8L`dUBh>9XF&JB<(MiG(f0qg~Tv)%YvCqM0s=>UNV2drju6j3qOR_K){6 z}g6m9IOiTxu?&xWoBcbljnGsg03YFT9`4c#D zfCKx!9EjitxbZ*mo?5CdAIOMT`BIgYl2TQ#u209sjVl|M-%(241(d+sz+ZQ-{FxI< z{fYQ*_ZvzflpJ?L*P0840yJOLGt(`c@X|=kDu%1JetP2 zmdAiEQv7)GT>lfm6@Wc>5@0U*Q;EZ=r-9syXL|fu-c0sf^4#n5z?T4d0eqGCdHAmr ze*ylR#4o^qoA^ce?-IWR|9#>w!vB!?OYlD?{xbYeiN6B>bK&$*YkfZr0o4F5YoWB=Go_U?^gk4E02+`j)&aN5~l1x)l_;Sq@_Upmw*!w>lRXx**;!o1kZw zv+U@3z7_Mwwhob`3#v}!&a(9AndJU#(^-BTt*b47|T%*G*$QagTwEj9Z`QZfu5O2T!(6C6Uq7{7FOIg?$D`P0Gtbp< ze!a8dD602gC(Ms>*m79<87GYMcimEItgVC~!!nf|)K!Jqy9ubRi)!C|=%o!59twRH zLkekmZD&|)%c7Xn*5U)YBjE<(>7i+hdiD`s(L!5W-)@WXpe;gOuw>!T{@GDsLUH@h zSXm9?32Q17P&VapQw6@%dE8#RajIL?<|Z}ae~oLU&{JHG0mp$80DmU@iEx7y5DE={ z65P{ifIkEN1StL#{j)6(WF>XBq@#*MT#LskmAP;QtYk*{{i&R5{du- literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_rest003.utp b/gamma_age_v2/dmfi_rest003.utp new file mode 100644 index 0000000000000000000000000000000000000000..f203b08113b0cc3181e6ea79fd53589be0665859 GIT binary patch literal 1949 zcmZ`)$&wRC5G}LYW(O~rtudPocsvFi;p?D|iBYgfF(cqel%$-QGTqhf>Jr5K2ONE{ z4>sOe58SwN=YQb6Qgy32I3r$VW-XanS<>s9gMM=B(%i)#lu{o6Deyh;YSUEj-KNw_ z_^+YgK>xfQ1LQ4)ntMN@5oISdXrG6E3Q#UgRT#f% z*>f%X+m<~Kn{UCpd_C@ID0Obns%&6KCo3vJkh^Io?C%uzp14Za0lLlk{r#-)!H5H*F3V37<76CW7&;zp{J0eSUMaSfUiAy-oi@HZJ+1~$m#KIe#R6vj zwBX>IO1pfTB@K4G3^H(iF`G4we$UFvdMum%V54jri2C2_=YlnPXvT_17tz166z#Mf z#S=^YaE)f@Oq>(zo9QL(##XAT-mr-K)i!l_l-9&;lVvSe^=x>d*bN0g)wy14S_ogX zUvG}U4;`o{dUgr*`XM%jsb1)Iy~=pkB@&lBz6)yiJSz^evq(9)FfyUGYOeQoB$^P5-y4M6mS|Kp^`{Rpd?Nb YCW(>+Nn#`+k_btFBt8-zFL@bw2czo|d;kCd literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_restvfxobje.utp b/gamma_age_v2/dmfi_restvfxobje.utp new file mode 100644 index 0000000000000000000000000000000000000000..f00182de3dcdf690c36b911ad35b6bd78040015a GIT binary patch literal 1880 zcmZ`)+j0~)5LK|bBwS($2@r0}oy3U&n^fhEGCQ^9Eg-vPo67?frCqnp;2F)J(Yo+E zzrnxo5&RE1N7J)AP(@dr>C=*?CABnXo^B31&sLU}|24+^03^Uaz^4PXUpQn;K>Pvz zGyIFgc)-5E=sET$618LS%<~&Sjx^>0a1@vW9s#uZ+QsKVP5^Txu%Cfu{6cK0A17Pwr&{g5wD{@Pm|wM>YvI0MX?#XK z*MAoH2(Sj{0FEX9T{)aN4>Yy7(Bc=_sdh;{_j(zy0C@)(DZc_gR(=(JOZhc;QGOkM zTlo$69pyLS-zdKYpDMo%|5o`Q@VmO!sh_(uiC}u-z~n>;&)p7u5#|>9^e4- zWuO3PD*$WB+T90AVAFEtGkaW&|Fb!FSz992*r#Pk3ueT4$;-?JS(j>EP=M7*DApw} z_T-W5qraOKl_1G((v9Q0h1(Nf*(O2X1@V4T20O|)OV5s*t~h>}75rSLhOF!IZjyT8 zDHy}l`sy^+t{4wWajogiu<*g#H1zA&&8D|yB0$aDHl~m6#CvgJ+Pr4{ zmXoS#2K2DMhSSGGX*E1gGhVN$4O~1St%flJm)P9yOiPGZY~T&94RNf%EMCKU!w7?7 z(;!y6>1Dnrl8LN_V8^@2I&eIZcK=2xS=O~xSY?KRixuxB7{4qFZrKjMUO z{%N(08QM%jkba{1x<#I2c8!do-fiXE>1!`l*xPlp5LrsF~DCYUFi*JEj&=1F3z~JZjw{Ky9O@ SEdkUpY8N$&T1Abz5Bv`p!}T8k literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_server.uti b/gamma_age_v2/dmfi_server.uti new file mode 100644 index 0000000000000000000000000000000000000000..9cba6e7236ee4d90d633531ef368c15c20fb5f0b GIT binary patch literal 1341 zcmY*Z+invv5H-+pDdk>nZ&n|8KqwWUB3?@(L{M9zCT$;)vpY$)?5 z1Nb61XV*#7kyx*gH}92FSAhZW9Qb*q9XGEj^#}96Yf7cC@2)F# z6XQP!2KA61$S2?iaGOdLxGIFIXTT;vevSla)w?(cwfYQf0F3#?AjtK0P+TWBV<_C8 zF66rv=NOuJ+UdWV2ltDV>dwmiF6J+Rdl48K&ihd({{x^OgLziwK>H(rT$C-KDF(*J zG(>rVku{?{1$F_Rk@ffu&XE*VZh{<%Kaz=3AB>lNkOIq%?AyfT*$+t%O(C%K#3wGR zLT1Zmoq9i&GGvoXu+hj&+raqk&WxLiU)s9XhoyqaFxXsLs>VDFCiynRhS6z|+e`j? zX?lrbb#I1rYv-BALJn*y`M|jFy0r|Pt;B^){C>tvqCStuQ^R^3=G9_%@FCxk8RrWN z^%IlV3mw#^h}_(v)h|47{xXrhsuJVc^;|-bey>dj{6&H4MGbc*EhgDlFYddz7qIe< zFYXQhW$)l)U+<+wR_bBnq)$zm^0usck}gHqs%-@Q*o)U;Cfd4enw2Kky@Q58;}Xop z=^RDL%Bh}+3AK|~x-eOp&-KJQJvc>}E^J!oU^&miOdCC}%VehQBog?}#>SyN*Jrg4 zdS>&~>#^}!q9^dvtA^yt!;BVk;s>3;I;)F{{HW@3UI^Ih zwsOk~#RGNN6ow0M0s+TB5+FbTI|B(MWUw;>#=@O6ElmFRFXSxbt~N^J7y+K zVJ174ya8{(8}J4!+3^N!;Qzb3g+8_P2Qu_X_Tw?Ds>#?A23{2dH%qjfl!^;vw|lDKPPxf za8B^FV8(Va3xa0^7X{A>=3HFgl3>os)xRKkUhp}=3xdxJE(?B9a7A!c@S@-gf-eeQ z68w_jmj%Bf_*KEL34UGh8-idn(6&RI8*N8gB)|9J*VW%I z>K_oiQ}BZs^Ii`@*BBV~FvK;Y?SdXjC@nc&+M^K1O?wP-;~oWb&RoMW$jyB>n0*;{ z4|E{oy@K}%ejH3=`~3-}%znb^hI9ls9>f1_{vGSXcY%4)5Z()(fs@d$ zkYk=Fj>ochhxyWujHkeSzt|=R@vNpzL#R$HpYh+-hGQ;32XF(PKQj=|Xr5#IZt%Wr zGYj#%MVo_o9&tX*yH28h(R8}Lwx(j@iowBO(G7!3eJgrVY!`ILRnF@HSLM20qaz(O zOl@(!Yt*a>nkMRZSLJ0BgqBxQD~FMdv}a4r)GwI05qVwfg+WrWsM}e~w8)3Ss)=Il z8kFKPm$Gj~-QcAX*Me5?VjXpK-Op}V?bRbWrGoJ+a|UNiUeJzf3x@dxZBcu^a8)(z z1PuiE_Qm2DCX+LpQDX=DrdR?0hVLl8UCJh$CvWYqcqwR9yPlwI* zX)))j)se-R%DS)2DfbHdoh-!j+)e;37Qpd zl#T1!58FKvU$3RlC2fzl%_iYoy#9VjuV08wR4^?sFsXk&nD)bDK-Cp2;5=@RvCuHf zm6X!oA|i>)ioU$=-gnmqGjHVTo{zU8sY+HtbV&T7uiM!ZO#D0!0Ta!eRpaM<9mg&h z`X#>TpI&Fnv~uQh&+FDo)^yTNW$hblP5=GPhn)`gQ$NCRv(xfwG1}m1kD+=58B%th zC5bEEO>4o?>$ZxHtQ&@8aMmR@60Fr47H+o4Z7olZhg=_ zG3cHgbWabu6C=s(S3_*Xnz>>Iubvrn^`Lud&}|O7{kNBEz%LHJ3PaE)XfwoYnHenq zS@3JX%#iEBe-0xMzZ_gMW>MRq?a&U0nLjgrX8O$Vnb|X=XC}W3Vg}EQotgS5GzRU4 z_CR}~eGoHlX4(fJX4cH84?>3^X3mG9BM>uWX2y7IY63bAG4o}{%S@LUE;CzZw9I7R zfj)pfguaBnfxd;lgRVj!K_5e(K%YXNLD!(qp)a7Xps%4R=)bgX%%Yk7FzaDfGX-(K W`Vy%i5Ra5rsF7M4C80bbXFW+QcGuC`AqqnM06vFL z;K$&cU8hYM>FjuJ$CsV?Jm~1t*X>vDlu}oLF7Ooid8N^t*OYpO^@}y7Ed0NqH=zGQ zpwt6?Acw#W;1-P}>(D4wPk>E;{ETxATGdW#P^u3=3t-I#iy+qq>h{X|PRhLtO;E^r51`HUeV~(yc~_o+{)Yg$C|f}N7|@UCNU{xW z)A}*=8-RD@du)SqAjLE{QF;=3GQt~}Ae|@$!nGXv%;fHe*iWVqcn&0Fm77NA%Q{ZG zW2KC4P{`38YJ(#$l=P1x7&;2~;g`er@HGX|2y53F8Xe3z-+LVj= zL@Lp)WLl*QZ)dr*TdhI0&?oh;*KhU6lS!-|o;!Dub9UD1iIw2SWfMCzlQMYUI;q^) zl_uBd7zA1N-RF*tq+iCx+*e^@iuXk*+nFzR*rOLu0izZ^1v{S;um-FHoKQ|CCz6xM g%H@P}Iyhl`I(9$1o^Qs9;v{i`wg65HCx!gPKX5+4IRF3v literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_string_inc.nss b/gamma_age_v2/dmfi_string_inc.nss new file mode 100644 index 00000000..a81ddd9b --- /dev/null +++ b/gamma_age_v2/dmfi_string_inc.nss @@ -0,0 +1,71 @@ +//:://///////////////////////////////////////////// +//:: DMFI - string functions and constants +//:: dmfi_string_inc +//::////////////////////////////////////////////// +/* + Library of functions relating to strings for DMFI. +*/ +//::////////////////////////////////////////////// +//:: Created By: tsunami282 +//:: Created On: 2008.08.11 +//::////////////////////////////////////////////// + +#include "x3_inc_string" + +const string DMFI_MESSAGE_COLOR_ALERT = "733"; // default 733 - brite red +const string DMFI_MESSAGE_COLOR_STATUS = "773"; // default 773 - yellow +const string DMFI_MESSAGE_COLOR_EAVESDROP = "777"; // default 777 - white +const string DMFI_MESSAGE_COLOR_TRANSLATION = "555"; // default 733 - lite gray +const string DMFI_MESSAGE_COLOR_OTHER = ""; // default blank + +//////////////////////////////////////////////////////////////////////// +string LTrim(string sTrimMe, string sDelim = " ") +{ + int l; + + if (sDelim != "") + { + l = GetStringLength(sTrimMe); + while (GetStringLeft(sTrimMe, 1) == sDelim) + { + l--; + if (l < 1) + { + sTrimMe = ""; + break; + } + sTrimMe = GetStringRight(sTrimMe, l); + } + } + + return sTrimMe; +} + +//////////////////////////////////////////////////////////////////////// +void DMFISendMessageToPC(object oPC, string sMsg, int bAllDMs=FALSE, + string sRGB="") +{ + string sColMsg; + object oTarget = oPC; + if (bAllDMs) oTarget = GetFirstPC(); + while (GetIsObjectValid(oTarget)) + { + if ((!bAllDMs) || (GetIsDM(oTarget) || GetIsDMPossessed(oTarget))) + { + if (sRGB != "") + { + sColMsg = StringToRGBString(sMsg, sRGB); + } + else + { + sColMsg = sMsg; + } + SendMessageToPC(oTarget, sColMsg); + } + + if (!bAllDMs) break; + oTarget = GetNextPC(); + } + +} + diff --git a/gamma_age_v2/dmfi_target.uti b/gamma_age_v2/dmfi_target.uti new file mode 100644 index 0000000000000000000000000000000000000000..1e1c898653a9c56b808e4b9e45855d66d055aa10 GIT binary patch literal 5784 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 X{{tk&V8#R@5dzG1OwtS>Sp^0FIJ_4z literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_unact_nam03.nss b/gamma_age_v2/dmfi_unact_nam03.nss new file mode 100644 index 00000000..97b67f6f --- /dev/null +++ b/gamma_age_v2/dmfi_unact_nam03.nss @@ -0,0 +1,6 @@ +void main() +{ + object oPC = GetPCSpeaker(); + object oTarget = GetLocalObject(oPC, "dmfi_univ_target"); + SetName(oTarget, ""); +} diff --git a/gamma_age_v2/dmfi_unact_nam04.ncs b/gamma_age_v2/dmfi_unact_nam04.ncs new file mode 100644 index 0000000000000000000000000000000000000000..8d0be317ddd249b233bbd91db84ec22994dae1e3 GIT binary patch literal 2828 zcmcIm&ubGw6rTMRr3ukPw6&$W&>loV6j7;oS<{t-ZZ;)Ji--_}Mq8{ch@b}#UiuGs z^diNJApQk{C;bz=NIhAkU=Kk`i8Sf@=FQG#HknLT&=z*Pv)}u^H{W}2wtl{9FJ8KE z@g^bZ%xMBYM{RPB;9n!>iA~HDT{N^H2-?In4f=#{vlE1_+0nZ=CT*Xg&>N;jMwcGl zU#UN6JXu{?Yt)z5*B>t5TU%OfU_g@qf?U=$s?Z`PW7Q3O3D2lC&Q^tM3o^r8bc6l^ z#V?{8K$V*<-741e1*cXhm*?sQ$Dj3FB->+T)<+D~P;i$E@?5y=aZKOLhKT@9$qnym zqSiZP-HEZ%SWGozBRklL){Ns5VDY|1%#594re!99%Xo(C;16=booydiVJ~og`!PH&;o5wod6*gr|GbWGdBsr8r+hTu)~Ckg($RB1G>fMRBR(0NW=HljAKLw@X@YINOPh)W%XQ5WExTW$Uo4~Le^bJ8OS;QtrK-W(ja7;AW zBuv5q)ZQ1Sc{?^EFlSQ~-4f;o){qG@VRJ)p*60uH&8)kCRSJ{%t(TgDGQED{dd9Kp26k4!v5{}$K{<-mKO@M zIlR1p`o!~>m$$t?yu85jK`>S*FXtZY&DHoOuXtr{{asqdho!310fZO;ZR!V&FpM<%kFml0SU{S{bs&z=FNMvnTfnU zck%p%>q12C4-5F|(#4p-|9Z{|U8o(>s0pznR86SG(#jop_7#`zmW_L*)y0ajv|KDH zp+=)ol?XAegcV%w2^H4I5c!}|UNaWUE32i7s>pzd*cK`hMNbQGui@W)pll-cG2~bX z;WeR-NZ)>3ZJDn+bjQm9jx4qG#yWI#c@$PKDg^?e#9_027wU0}v;hKSI`Bkwm5^M4 z5>m-*5P#6BLb*~h=9iZj=5JSui&TwG)OVR`0n#xF7%9sknMkiK@2ZYP4?hFhy8`5D zBAS?)Oc@hX@xoL#J8ewGGl_H(>7lezTGvw+Gpb056b?L3Iz4A|$vLMtkX#D8IkSx_ z(?``iMJvxb_|w5I16{KaoPlqKu)CPy0-|BVyuI=hxzua{-}$#N+lshfPUW`k?Hh?Nc0_Aqp~92r|{Fnhv_-G*iMRWEiI?32S9Z7pW9hd+6- z+ps3P`pb*`FjngXcE46-{z;4956udi`3FHi1`WP#Z;A+gutfO6O%=+HRfjMh#gy2B?;o?D@444ol}EhOB64Aw-b+nRZux_S9jk(vFj-}$yoG}%OFS`bp{1wqk&sejI z83s>z66)*bx6>%&TAz4cPO#M@%A2Fq*Zxtusk3N*o2B5`P^~uEjME1bWbUrxU?WI2 l^#n6|MEM#doBGv%&E`tGY1z3Jk0a4DT3NSQ!LTa?>*7OY<_z;!6^X(o;*A8UO$P X{{tk&V8#R@5dzG1OwtS>Sp^0FIJ_4z literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_unact_nam07.nss b/gamma_age_v2/dmfi_unact_nam07.nss new file mode 100644 index 00000000..97b67f6f --- /dev/null +++ b/gamma_age_v2/dmfi_unact_nam07.nss @@ -0,0 +1,6 @@ +void main() +{ + object oPC = GetPCSpeaker(); + object oTarget = GetLocalObject(oPC, "dmfi_univ_target"); + SetName(oTarget, ""); +} diff --git a/gamma_age_v2/dmfi_unact_nam08.ncs b/gamma_age_v2/dmfi_unact_nam08.ncs new file mode 100644 index 0000000000000000000000000000000000000000..8d0be317ddd249b233bbd91db84ec22994dae1e3 GIT binary patch literal 2828 zcmcIm&ubGw6rTMRr3ukPw6&$W&>loV6j7;oS<{t-ZZ;)Ji--_}Mq8{ch@b}#UiuGs z^diNJApQk{C;bz=NIhAkU=Kk`i8Sf@=FQG#HknLT&=z*Pv)}u^H{W}2wtl{9FJ8KE z@g^bZ%xMBYM{RPB;9n!>iA~HDT{N^H2-?In4f=#{vlE1_+0nZ=CT*Xg&>N;jMwcGl zU#UN6JXu{?Yt)z5*B>t5TU%OfU_g@qf?U=$s?Z`PW7Q3O3D2lC&Q^tM3o^r8bc6l^ z#V?{8K$V*<-741e1*cXhm*?sQ$Dj3FB->+T)<+D~P;i$E@?5y=aZKOLhKT@9$qnym zqSiZP-HEZ%SWGozBRklL){Ns5VDY|1%#594re!99%Xo(C;16=booydiVJ~og`!PH&;o5wod6*gr|GbWGdBsr8r+hTu)~Ckg($RB1G>fMRBR(0NW=HljAKLw@X@YINOPh)W%XQ5WExTW$Uo4~Le^bJ8OS;QtrK-W(ja7;AW zBuv5q)ZQ1Sc{?^EFlSQ~-4f;o){qG@VRJ)p*60uH&8)kCRSJ{%t(TgDGQED{dd9Kp26k4!v5{}$K{<-mKO@M zIlR1p`o!~>m$$t?yu85jK`>S*FXtZY&DHQ2&CkuWyY80WtPR4Bo?KomM}B^ z|Ns97NQ%LXiG>-Y97*Ue6PWXdfdwQLaDtVAQ3j%l5iIcqtPxGsNhDQ_Amd*!ut+li P={K?<<9WdB4+;zblW#BW literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_uncnd_nam01.nss b/gamma_age_v2/dmfi_uncnd_nam01.nss new file mode 100644 index 00000000..603d42ca --- /dev/null +++ b/gamma_age_v2/dmfi_uncnd_nam01.nss @@ -0,0 +1,13 @@ +int StartingConditional() +{ + // set the custom tokens + object oPC = GetPCSpeaker(); + object oTarget = GetLocalObject(oPC, "dmfi_univ_target"); + + string sName = GetName(oTarget); + SetCustomToken(20680, sName); + string sOrigName = GetName(oTarget, TRUE); + SetCustomToken(20681, sOrigName); + + return TRUE; +} diff --git a/gamma_age_v2/dmfi_uncnd_nam05.ncs b/gamma_age_v2/dmfi_uncnd_nam05.ncs new file mode 100644 index 0000000000000000000000000000000000000000..0f8ab6d996997040ebf1141d428960ae542958df GIT binary patch literal 183 zcmeZs4ps;=)H85mU|`tJ#4HD-7&sIdSQ!}JF|e>Q2&CkuWyY80WtPR4Bo?KomM}B^ z|Ns97NQ%LXiG>-cnh{JgfF-_wB$!>8!JIz~EFh_XQ>+Y(GRSHf!O|bFsXdLPmJwvt V3kDWx1|a=L7UVJ>F#Cf70{|tkE}H-V literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_uncnd_nam05.nss b/gamma_age_v2/dmfi_uncnd_nam05.nss new file mode 100644 index 00000000..8c2aac6d --- /dev/null +++ b/gamma_age_v2/dmfi_uncnd_nam05.nss @@ -0,0 +1,13 @@ +int StartingConditional() +{ + // set the custom tokens + object oPC = GetPCSpeaker(); + object oTarget = GetLocalObject(oPC, "dmfi_univ_target"); + + string sName = GetDescription(oTarget); + SetCustomToken(20682, sName); + string sOrigName = GetDescription(oTarget, TRUE); + SetCustomToken(20683, sOrigName); + + return TRUE; +} diff --git a/gamma_age_v2/dmfi_univ_1.ncs b/gamma_age_v2/dmfi_univ_1.ncs new file mode 100644 index 0000000000000000000000000000000000000000..56f47a012709b79974ba0e79cbeba8aa00651d61 GIT binary patch literal 545 zcmeZs4ps;=)H85mU|>>|V*mmU1qN0IhIb4stPBDvxoMg4rFofU@g<2x>8T~mjQ{`t z{{fO>Fk=FeLI?#p`N@eTnfZBOC11cwW`dOPA(SNN=aqq_KY*o8LDDQCsd>d(Xj43ZMI;?$zD)FN(WG&QnFYS{DhQj0S4(m{&A0pbhsGX*{dd5A$-mjP}N RBIscuhVVZF4}`72000vQnO^_^ literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_univ_1.nss b/gamma_age_v2/dmfi_univ_1.nss new file mode 100644 index 00000000..4a303cdb --- /dev/null +++ b/gamma_age_v2/dmfi_univ_1.nss @@ -0,0 +1,26 @@ +void main() +{ + object oPC = GetPCSpeaker(); + object oTarget = GetLocalObject(oPC, "dmfi_univ_target"); + location lLocation = GetLocalLocation(oPC, "dmfi_univ_location"); + string sConv = GetLocalString(oPC, "dmfi_univ_conv"); + + if (GetLocalInt(oPC, "Tens")) + { + SetLocalInt(oPC, "dmfi_univ_int", 10*GetLocalInt(oPC, "Tens") + 1); + ExecuteScript("dmfi_execute", oPC); + DeleteLocalInt(oPC, "Tens"); + return; + } + else + { + if(sConv == "pc_emote" || sConv == "emote" || sConv == "server" || sConv == "onering") + { + SetLocalInt(oPC, "dmfi_univ_int", 1); + ExecuteScript("dmfi_execute", oPC); + } + else + SetLocalInt(oPC, "Tens", 1); + return; + } +} diff --git a/gamma_age_v2/dmfi_univ_10.ncs b/gamma_age_v2/dmfi_univ_10.ncs new file mode 100644 index 0000000000000000000000000000000000000000..6241d358cf36be2cab30e6634da286baaf3d0542 GIT binary patch literal 513 zcmeZs4ps;=)H85mU|?dDV*mmU1qN0IhIb4stPBDvxoMg4rFofU@g<2x>8T~mjQ{`t z{{fO>Fk=FeLI?#p`N@eTnfZBOC11cwW`dOPA(SNN=aqq_KY*o8LDDQCsd>dfKBN!vd&)qaZmxH8;Nm zsD@nuMU^a)D)zL*WKal!6oEY%3HKzqzCm)hHQ3?Gx(skb5kU(J86@RA5VisX0R1>|V*mmU1qN0IhIb4stPBDvxoMg4rFofU@g<2x>8T~mjQ{`t z{{fO>Fk=FeLI?#p`N@eTnfZBOC11cwW`dOPA(SNN=aqq_KY*o8LDDQCsd>d(Xj43ZMI;?$zD)FN(WG&QnFYS{DhQj0S4(m{&A0pbhsGX*{dd5A$-mjP}N RBIscuhVVZF4}`72000#WnPLC{ literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_univ_2.nss b/gamma_age_v2/dmfi_univ_2.nss new file mode 100644 index 00000000..22a124c6 --- /dev/null +++ b/gamma_age_v2/dmfi_univ_2.nss @@ -0,0 +1,26 @@ +void main() +{ + object oPC = GetPCSpeaker(); + object oTarget = GetLocalObject(oPC, "dmfi_univ_target"); + location lLocation = GetLocalLocation(oPC, "dmfi_univ_location"); + string sConv = GetLocalString(oPC, "dmfi_univ_conv"); + + if (GetLocalInt(oPC, "Tens")) + { + SetLocalInt(oPC, "dmfi_univ_int", 10*GetLocalInt(oPC, "Tens") + 2); + ExecuteScript("dmfi_execute", oPC); + DeleteLocalInt(oPC, "Tens"); + return; + } + else + { + if(sConv == "pc_emote" || sConv == "emote" || sConv == "server" || sConv == "onering") + { + SetLocalInt(oPC, "dmfi_univ_int", 2); + ExecuteScript("dmfi_execute", oPC); + } + else + SetLocalInt(oPC, "Tens", 2); + return; + } +} diff --git a/gamma_age_v2/dmfi_univ_3.ncs b/gamma_age_v2/dmfi_univ_3.ncs new file mode 100644 index 0000000000000000000000000000000000000000..4e23bd865490a1ad1ae627a66ac7ac5f636cd8f7 GIT binary patch literal 557 zcmeZs4ps;=)H85mU|`afV*mmU1qN0IhIb4stPBDvxoMg4rFofU@g<2x>8T~mjQ{`t z{{fO>Fk=FeLI?#p`N@eTnfZBOC11cwW`dOPA(SNN=aqq_KY*o8LDDQCsd>d(Xj43ZMI;?$zD)FN(WG&QnFYS{DhQj0S4(m{&A0TK!EGX*|Ic#gpu literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_univ_3.nss b/gamma_age_v2/dmfi_univ_3.nss new file mode 100644 index 00000000..20aff9cf --- /dev/null +++ b/gamma_age_v2/dmfi_univ_3.nss @@ -0,0 +1,27 @@ +void main() +{ + object oPC = GetPCSpeaker(); + object oTarget = GetLocalObject(oPC, "dmfi_univ_target"); + location lLocation = GetLocalLocation(oPC, "dmfi_univ_location"); + string sConv = GetLocalString(oPC, "dmfi_univ_conv"); + + if (GetLocalInt(oPC, "Tens")) + { + SetLocalInt(oPC, "dmfi_univ_int", 10*GetLocalInt(oPC, "Tens") + 3); + ExecuteScript("dmfi_execute", oPC); + DeleteLocalInt(oPC, "Tens"); + return; + } + else + { + if(sConv == "pc_emote" || sConv == "emote" || sConv == "server" || sConv == "onering") + { + SetLocalInt(oPC, "dmfi_univ_int", 3); + ExecuteScript("dmfi_execute", oPC); + return; + } + else + SetLocalInt(oPC, "Tens", 3); + return; + } +} diff --git a/gamma_age_v2/dmfi_univ_4.ncs b/gamma_age_v2/dmfi_univ_4.ncs new file mode 100644 index 0000000000000000000000000000000000000000..66fd8cd756448be747aff81adfb22dc0c5cad4c4 GIT binary patch literal 557 zcmeZs4ps;=)H85mU|`afV*mmU1qN0IhIb4stPBDvxoMg4rFofU@g<2x>8T~mjQ{`t z{{fO>Fk=FeLI?#p`N@eTnfZBOC11cwW`dOPA(SNN=aqq_KY*o8LDDQCsd>d(Xj43ZMI;?$zD)FN(WG&QnFYS{DhQj0S4(m{&A0TK!EGX*|Ic#gpu8T~mjQ{`t z{{fO>Fk=FeLI?#p`N@eTnfZBOC11cwW`dOPA(SNN=aqq_KY*o8LDDQCsd>d(Xj43ZMI;?$zD)FN(WG&QnFYS{DhQj0S4(m{&A0TK!EGX*|Ic#gpu8T~mjQ{`t z{{fO>Fk=FeLI?#p`N@eTnfZBOC11cwW`dOPA(SNN=aqq_KY*o8LDDQCsd>d(Xj43ZMI;?$zD)FN(WG&QnFYS{DhQj0S4(m{&A0TK!EGX*|Ic#gpuV*mmU1qN0IhIb4stPBDvxoMg4rFofU@g<2x>8T~mjQ{`t z{{fO>Fk=FeLI?#p`N@eTnfZBOC11cwW`dOPA(SNN=aqq_KY*o8LDDQCsd>d(Xj43ZMI;?$zD)FN(WG&QnFYS{DhQj0S4(lHcCAt_=hN-Zt{sQ?FABqUTQ e2or?&8LUCxXHeE8T~mjQ{`t z{{fO>Fk=FeLI?#p`N@eTnfZBOC11cwW`dOPA(SNN=aqq_KY*o8LDDQCsd>dQG%v#V%shzuAnMGSVO9ZE@qksOR-`7EmZSn5 z&w<5iMouPa2B7yo$O3I(X28cCkDEI%_j6+?+Ek`ng(ywsx1ymSmjQb>weic*V9Kq|n26$uFs3PJ8T~mjQ{`t z{{fO>Fk=FeLI?#p`N@eTnfZBOC11cwW`dOPA(SNN=aqq_KY*o8LDDQCsd>dYEy80A)*z2DDC;u7 R4Mju&EaZ@s^FY`N3;+^VoK*k- literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_univ_9.nss b/gamma_age_v2/dmfi_univ_9.nss new file mode 100644 index 00000000..a56a9fcf --- /dev/null +++ b/gamma_age_v2/dmfi_univ_9.nss @@ -0,0 +1,27 @@ +void main() +{ + object oPC = GetPCSpeaker(); + object oTarget = GetLocalObject(oPC, "dmfi_univ_target"); + location lLocation = GetLocalLocation(oPC, "dmfi_univ_location"); + string sConv = GetLocalString(oPC, "dmfi_univ_conv"); + + if (GetLocalInt(oPC, "Tens")) + { + SetLocalInt(oPC, "dmfi_univ_int", 10*GetLocalInt(oPC, "Tens") + 9); + ExecuteScript("dmfi_execute", oPC); + DeleteLocalInt(oPC, "Tens"); + return; + } + else + { + if(sConv == "server" || sConv == "voice" || sConv == "faction" || sConv == "rest") + { + SetLocalInt(oPC, "dmfi_univ_int", 9); + ExecuteScript("dmfi_execute", oPC); + return; + } + else + SetLocalInt(oPC, "Tens", 9); + return; + } +} diff --git a/gamma_age_v2/dmfi_univ_cond.ncs b/gamma_age_v2/dmfi_univ_cond.ncs new file mode 100644 index 0000000000000000000000000000000000000000..6d011990f4a45f08efb65d6eefa35aa9ef3dd64c GIT binary patch literal 11602 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 iTime) + sRest = sRest + "\nYou may rest again in " + IntToString(iNext - iTime) + " hours"; + } + if (iSettings & 0x00000008 && iSettings & 0x00000001) //Placeables + { + if (!(GetLevelByClass(CLASS_TYPE_DRUID, oPC) && (iSettings & 0x00020000)) || + !(GetLevelByClass(CLASS_TYPE_RANGER, oPC) && (iSettings & 0x00040000)) || + !(GetLevelByClass(CLASS_TYPE_BARBARIAN, oPC) && (iSettings & 0x00080000))) + { + object oPlaceable = GetFirstObjectInShape(SHAPE_SPHERE, 6.0f, GetLocation(oPC), TRUE, OBJECT_TYPE_PLACEABLE); + int iBreak = 0; + while (GetIsObjectValid(oPlaceable) && !iBreak) + { + if (!(iSettings & 0x00001000) && GetTag(oPlaceable) == "dmfi_rest") //DMFI Placeables: by default, ON + iBreak = 1; + if ((iSettings & 0x00002000) && GetStringLowerCase(GetName(oPlaceable)) == "campfire") //Campfires + iBreak = 1; + if ((iSettings & 0x00004000) && (GetStringLowerCase(GetName(oPlaceable)) == "bed roll" || GetStringLowerCase(GetName(oPlaceable)) == "bedroll")) //Bed rolls + iBreak = 1; + if ((iSettings & 0x00008000) && GetStringLowerCase(GetName(oPlaceable)) == "bed") //beds + iBreak = 1; + if ((iSettings & 0x00010000) && GetStringLowerCase(GetName(oPlaceable)) == "tent") //tents + iBreak = 1; + oPlaceable = GetNextObjectInShape(SHAPE_SPHERE, 6.0f, GetLocation(oPC), TRUE, OBJECT_TYPE_PLACEABLE); + } + if (!iBreak) + { + sRest = sRest + "\nYou are not near a rest placeable"; + } + } + } + if ((iSettings & 0x00000010) && iSettings & 0x00000001)//Armor + { + int iArmor = (iSettings & 0x00f00000); + object oArmor = GetItemInSlot(INVENTORY_SLOT_CHEST, oPC); + int iWeight = GetWeight(oArmor); + switch(iArmor) + { + default: + case 0x00100000: if (iWeight > 20) sRest = sRest + "\nYou cannot rest in armor heavier than Clothing"; break; + case 0x00200000: if (iWeight > 60) sRest = sRest + "\nYou cannot rest in armor heavier than Padded"; break; + case 0x00300000: if (iWeight > 110) sRest = sRest + "\nYou cannot rest in armor heavier than Leather"; break; + case 0x00400000: if (iWeight > 160) sRest = sRest + "\nYou cannot rest in armor heavier than Studded Leather"; break; + case 0x00500000: if (iWeight > 310) sRest = sRest + "\nYou cannot rest in armor heavier than Chain Shirt"; break; + case 0x00600000: if (iWeight > 410) sRest = sRest + "\nYou cannot rest in armor heavier than Chain Mail"; break; + case 0x00700000: if (iWeight > 460) sRest = sRest + "\nYou cannot rest in armor heavier than Banded Mail"; break; + } + } + if (iSettings & 0x00000020 && iSettings & 0x00000001) //Hit point limits + { + sRest = sRest + "\nOn Rest, you will regain "; + switch (iSettings & 0x0f000000) + { + case 0x01000000: sRest = sRest + "0 HP"; break; + case 0x02000000: sRest = sRest + IntToString(GetHitDice(oPC)) + " HP"; break; + case 0x03000000: sRest = sRest + IntToString(GetAbilityScore(oPC, ABILITY_CONSTITUTION)) + " HP"; break; + case 0x04000000: sRest = sRest + IntToString(GetMaxHitPoints(oPC)/10) + " HP"; break; + case 0x05000000: sRest = sRest + IntToString(GetMaxHitPoints(oPC)/4) + " HP"; break; + case 0x06000000: sRest = sRest + IntToString(GetMaxHitPoints(oPC)/2) + " HP"; break; + default: + case 0x07000000: sRest = sRest + "full HP"; break; + } + sRest = sRest + "\nResting will drop you from the party"; + } + if (iSettings & 0x00000040 && iSettings & 0x00000001) //Spell memorization + { + sRest = sRest + "\nYou cannot memorize spells here"; + } + SetCustomToken(20790, sRest); + } +} + +//////////////////////////////////////////////////////////////////////// +int StartingConditional() +{ + object oPC = GetPCSpeaker(); + DeleteLocalInt(oPC, "Tens"); + int iOffset = GetLocalInt(oPC, "dmfi_univ_offset")+1; + string sOffset = GetLocalString(oPC, "dmfi_univ_conv"); + SetLocalInt(oPC, "dmfi_univ_offset", iOffset); + + if (sOffset == "afflict" && iOffset==1) + return TRUE; + else if (sOffset == "pc_emote" && iOffset==2) + return TRUE; + else if (sOffset == "emote" && iOffset==2) + return TRUE; + else if (sOffset == "encounter" && iOffset==3) + return TRUE; + else if (sOffset == "fx" && iOffset==4) + return TRUE; + else if (sOffset == "music" && iOffset==5) + return TRUE; + else if (sOffset == "sound" && iOffset==6) + return TRUE; + else if (sOffset == "xp" && iOffset==7) + return TRUE; + else if (sOffset == "onering" && iOffset==8) + return TRUE; + else if (sOffset == "pc_dicebag" && iOffset==9) + { + SetLocalInt(oPC, "dmfi_univ_offset", 8); + + if (GetLocalInt(oPC, "dmfi_dicebag")==0) + SetCustomToken(20681, "Private"); + else if (GetLocalInt(oPC, "dmfi_dicebag")==1) + SetCustomToken(20681, "Global"); + else if (GetLocalInt(oPC, "dmfi_dicebag")==2) + SetCustomToken(20681, "Local"); + else if (GetLocalInt(oPC, "dmfi_dicebag")==3) + SetCustomToken(20681, "DM Only"); + + return TRUE; + } + else if (sOffset == "dicebag" && iOffset==10) + { + SetLocalInt(oPC, "dmfi_univ_offset", 9); + + if (GetLocalInt(oPC, "dmfi_dicebag")==0) + SetCustomToken(20681, "Private"); + else if (GetLocalInt(oPC, "dmfi_dicebag")==1) + SetCustomToken(20681, "Global"); + else if (GetLocalInt(oPC, "dmfi_dicebag")==2) + SetCustomToken(20681, "Local"); + else if (GetLocalInt(oPC, "dmfi_dicebag")==3) + SetCustomToken(20681, "DM Only"); + + string sName = GetName(GetLocalObject(oPC, "dmfi_univ_target")); + SetCustomToken(20680, sName); + + return TRUE; + } + else if (sOffset == "voice" && + GetIsObjectValid(GetLocalObject(oPC, "dmfi_univ_target")) && + oPC != GetLocalObject(oPC, "dmfi_univ_target") && + iOffset==11) + { + string sName = GetName(GetLocalObject(oPC, "dmfi_univ_target")); + SetCustomToken(20680, sName); + // pc range single/party + int hookparty = GetLocalInt(oPC, "dmfi_MyListenerPartyMode"); + if (hookparty == 0) SetCustomToken(20681, "*Single* / Party"); + else SetCustomToken(20681, "Single / *Party*"); + return TRUE; + } + else if (sOffset == "voice" && + !GetIsObjectValid(GetLocalObject(oPC, "dmfi_univ_target")) && + iOffset==12) + { + string sName = GetName(GetLocalObject(oPC, "dmfi_univ_target")); + SetCustomToken(20680, sName); + // loc range earshot/area/module + int hookparty = GetLocalInt(oPC, "dmfi_MyListenerPartyMode"); + if (hookparty == 0) SetCustomToken(20681, "*Earshot* / Area / Module"); + else if (hookparty == 1) SetCustomToken(20681, "Earshot / *Area* / Module"); + else SetCustomToken(20681, "Earshot / Area / *Module*"); + return TRUE; + } + else if (sOffset == "voice" && + GetIsObjectValid(GetLocalObject(oPC, "dmfi_univ_target")) && + oPC == GetLocalObject(oPC, "dmfi_univ_target") && + iOffset==13) + { + string sName = GetName(GetLocalObject(oPC, "dmfi_univ_target")); + SetCustomToken(20680, sName); + // self bcast one dm/all dm + int hookbcast = GetLocalInt(oPC, "dmfi_MyListenerBcastMode"); + if (hookbcast == 0) SetCustomToken(20681, "*Self* / All DMs"); + else SetCustomToken(20681, "Self / *All DMs*"); + return TRUE; + } + else if (sOffset == "faction" && iOffset==14) + { + int iLoop = 1; + string sName; + object sFaction; + while (iLoop < 10) + { + sFaction = GetLocalObject(oPC, "dmfi_customfaction" + IntToString(iLoop)); + sName = GetName(sFaction); + SetCustomToken(20690 + iLoop, sName + "'s Faction "); + iLoop++; + } + + SetCustomToken(20690, GetName(GetLocalObject(oPC, "dmfi_henchman"))); + SetCustomToken(20784, FloatToString(GetLocalFloat(oPC, "dmfi_reputation"))); + sName = GetName(GetLocalObject(oPC, "dmfi_univ_target")); + SetCustomToken(20680, sName); + return TRUE; + } + else if (sOffset == "dmw" && iOffset ==15) + { + SetCustomToken(20781, IntToString(GetLocalInt(oPC, "dmfi_alignshift"))); + return TRUE; + } + else if (sOffset == "buff" && iOffset ==16) + { + if (GetLocalInt(oPC, "dmfi_buff_party")==0) + SetCustomToken(20783, "Single Target"); + else + SetCustomToken(20783, "Party"); + SetCustomToken(20782, GetLocalString(oPC, "dmfi_buff_level")); + return TRUE; + } + else if (sOffset == "rest" && iOffset == 17 && !GetIsDM(oPC) && GetLocalInt(oPC, "dmfi_norest")) //This is the case of a No-Rest situation + { + SetRestTokens(oPC); + return TRUE; + } + else if (sOffset == "rest" && iOffset == 18 && !GetIsDM(oPC) && !GetLocalInt(oPC, "dmfi_norest")) //This is the case of a Rest situation + { + SetRestTokens(oPC); + return TRUE; + } + else if (sOffset == "rest" && iOffset == 19 && GetIsDM(oPC)) //This is the case of a DM activating the rest menu + { + SetRestTokens(oPC); + return TRUE; + } + else if (sOffset == "naming" && iOffset==20) + { + string sName = GetName(GetLocalObject(oPC, "dmfi_univ_target")); + SetCustomToken(20680, sName); + return TRUE; + } + return FALSE; +} diff --git a/gamma_age_v2/dmfi_univ_dmw.ncs b/gamma_age_v2/dmfi_univ_dmw.ncs new file mode 100644 index 0000000000000000000000000000000000000000..85fdfb125cbec824004a6484e9b8ebff06f9a84a GIT binary patch literal 4275 zcmc&%&u<%55PrLBJ8hgsZW~Z3ZTgfzTcwIcRh6h!g{tPlFSVAEh6}=2_BvhF-nG2z z{E!g*0o-~62~L2-fde3J9652|47VN-;t*9iW)=NArd3|4rz)3MrAE8yReQd-QH^TdbvJUX!^6XUUQ%z` z^m*#Yp%v6?kr()I*@Md$_JWFo&RV?lUzK}R(evPn!gCK$PgKrfV2YPpb^Y)tf_0oh zQY?aIGmKdPf*p9TMQ+pJ(r9nqgHx`+F^TAsLyJYSS3^o7avPVJiZHxp1MEQM=9~-c zUrxgP$BrctX`f*11@uA$Vor%@H0-FvMdDmD<%R zmDGY2%Qc1VuW)MgKfl5Pn@xYKndlgG&9N1Fw4exW5w*T~6EDY$Dk zcu~oud&qg>uDccK#kc5B6iUi)Bem%U!{u4HD#Z9(z{En^Q3~nPA$eI%-_p0IL`<7Qxi{cN`mr; z#NcZ79|)417WxhZ>cR_C=|UjxXn#bPl8o}k8Vwq-r<^2bSVnj6{+dLe&3YV)h9mKm#E2R7h1nV_Og z)(5O82l7d^Yv1`=qLT_o(*pFAG~|=p!MSacrN1vO(p-P;j%nEeKa!j%nE4k^*=&OW z%gUC5_TWSsED9kLLp{l6)OP^;CkFQO@fa-wD9Er$PAzTW3RYfd1_Uyw4C&F#+ogYv5Id|e9y|aAy~xcHJ(R% zDOQvrY^gJKIElF2z427Tnfjh8@?yvTz1&W>Z}aYK?KA zov#2b)2ko)9YEI!`sMq6XB_Y%!0-FfxbU-pce4E|nLED&{v(1vc_#>>(P<0vdtUuv zWqF*$?QekGH`HR}pMbnY$fw`;!if7J);lbh2PH4zzQ~>xv`9EW;52lRRrXt^3nrX0 zePEZsDL+gN`&V%45hwj_uiZ(j!7bU|*5L zXbyzTu}XULQaFOrNhrb_R|6q64k3Dh^H84{M#%aSggzmKF83=$ROp@)Z9iA3QwgmK z`;RM>S_3bUFgZrVL@fV%A}E>32bgjE8XxNwHuVAQbAQ)Y4y8A^X$hthwYGr>VJuM%9yRiM+e|5awi*3^+Xl D$o#_u literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_univ_dmw.nss b/gamma_age_v2/dmfi_univ_dmw.nss new file mode 100644 index 00000000..054708f1 --- /dev/null +++ b/gamma_age_v2/dmfi_univ_dmw.nss @@ -0,0 +1,334 @@ +//DMFI Universal Wand scripts by hahnsoo +int DMW_START_CUSTOM_TOKEN = 8000; + +//Retrieve targetting information +object oMySpeaker = GetLastSpeaker(); +object oMyTarget = GetLocalObject(oMySpeaker, "dmfi_univ_target"); +location lMyLoc = GetLocalLocation(oMySpeaker, "dmfi_univ_location"); + +int dmwand_isnearbydestroyable() +{ + object oMyTest = GetFirstObjectInShape(SHAPE_CUBE, 0.6, lMyLoc, FALSE, OBJECT_TYPE_ALL); + int nTargetType = GetObjectType(oMyTest); + return (GetIsObjectValid(oMyTest) && (! GetIsPC(oMyTest)) && ((nTargetType == OBJECT_TYPE_ITEM) || (nTargetType == OBJECT_TYPE_PLACEABLE) || (nTargetType == OBJECT_TYPE_CREATURE))); +} + +int dmwand_istargetcreateable() +{ + if(! GetIsObjectValid(oMyTarget)) { return FALSE; } + + int nTargetType = GetObjectType(oMyTarget); + return ((nTargetType == OBJECT_TYPE_ITEM) || (nTargetType == OBJECT_TYPE_PLACEABLE) || (nTargetType == OBJECT_TYPE_CREATURE)); +} + +int dmwand_istargetdestroyable() +{ + if(! GetIsObjectValid(oMyTarget)) { return FALSE; } + + int nTargetType = GetObjectType(oMyTarget); + if(! GetIsPC(oMyTarget)) + { + return ((nTargetType == OBJECT_TYPE_ITEM) || (nTargetType == OBJECT_TYPE_PLACEABLE) || (nTargetType == OBJECT_TYPE_CREATURE)); + } + return FALSE; +} + +int dmwand_istargetinvalid() +{ + return !GetIsObjectValid(oMyTarget); +} + +int dmwand_istargetinventory() +{ + return (GetIsObjectValid(oMyTarget) && GetHasInventory(oMyTarget)); +} + +int dmwand_istargetnotme() +{ + return (GetIsObjectValid(oMyTarget) && (oMySpeaker != oMyTarget)); +} + +int dmwand_istargetpcornpc() +{ + return (GetIsObjectValid(oMyTarget) && GetAbilityScore(oMyTarget, ABILITY_CONSTITUTION)); +} + +int dmwand_istargetnpc() +{ + return (dmwand_istargetpcornpc() && (! GetIsPC(oMyTarget))); +} + +int dmwand_istargetpc() +{ + return (GetIsObjectValid(oMyTarget) && GetIsPC(oMyTarget)); +} + +int dmwand_istargetpcnme() +{ + return (GetIsObjectValid(oMyTarget) && GetIsPC(oMyTarget) && (oMySpeaker != oMyTarget)); +} + +int dmwand_istargetpcornpcnme() +{ + return (dmwand_istargetpcornpc() && (oMySpeaker != oMyTarget)); +} + +int dmwand_istargetplaceable() +{ + if(! GetIsObjectValid(oMyTarget)) { return FALSE; } + + int nTargetType = GetObjectType(oMyTarget); + return (nTargetType == OBJECT_TYPE_PLACEABLE); +} + +int dmw_conv_Start(int nCurrent, int nChoice, string sParams = "") +{ + string sText = ""; + string sCall = ""; + string sCallParams = ""; + + switch(nCurrent) + { + case 0: + nCurrent = 0; + sText = "Welcome to the Server tool: This will allow you to find any player to perform simple functions."; + sCall = ""; + sCallParams = ""; + break; + + case 1: + nCurrent = 1; + if(dmwand_istargetpcnme()) + { + sText = "Penguin this player."; + sCall = "func_Toad"; + sCallParams = ""; + break; + } + case 2: + nCurrent = 2; + if(dmwand_istargetpcnme()) + { + sText = "Unpenguin this player."; + sCall = "func_Untoad"; + sCallParams = ""; + break; + } + case 3: + nCurrent = 3; + if(dmwand_istargetpcnme()) + { + sText = "Boot this player."; + sCall = "func_KickPC"; + sCallParams = ""; + break; + } + + case 4: + nCurrent = 4; + if(dmwand_istargetinvalid()) + { + sText = "List all players..."; + sCall = "conv_ListPlayers"; + sCallParams = "func_PlayerListConv"; + break; + } + + case 5: + nCurrent = 5; + if(dmwand_istargetpcnme()) + { + sText = "Jump this player to my location."; + sCall = "func_JumpPlayerHere"; + sCallParams = ""; + break; + } + case 6: + nCurrent = 6; + if(dmwand_istargetpcnme()) + { + sText = "Jump me to this player's location."; + sCall = "func_JumpToPlayer"; + sCallParams = ""; + break; + } + case 7: + nCurrent = 7; + if(dmwand_istargetpcnme()) + { + sText = "Jump this player's party to my location."; + sCall = "func_JumpPartyHere"; + sCallParams = ""; + break; + } + default: + nCurrent = 0; + sText = ""; + sCall = ""; + sCallParams = ""; + break; + } + + SetLocalString(oMySpeaker, "dmw_dialog" + IntToString(nChoice), sText); + SetLocalString(oMySpeaker, "dmw_function" + IntToString(nChoice), sCall); + SetLocalString(oMySpeaker, "dmw_params" + IntToString(nChoice), sCallParams); + + return nCurrent; +} + +int dmwand_BuildConversationDialog(int nCurrent, int nChoice, string sConversation, string sParams) +{ + if(TestStringAgainstPattern(sConversation, "Start")) + { + return dmw_conv_Start(nCurrent, nChoice, sParams); + } + return FALSE; +} + +void dmwand_BuildConversation(string sConversation, string sParams) +{ + int nLast; + int nTemp; + int nChoice = 1; + int nCurrent = 1; + int nMatch; + + if(TestStringAgainstPattern(sParams, "prev")) + { + //Get the number choice to start with + nCurrent = GetLocalInt(oMySpeaker, "dmw_dialogprev"); + + //Since we're going to the previous page, there will be a next + SetLocalString(oMySpeaker, "dmw_dialog9", "Next ->"); + SetLocalString(oMySpeaker, "dmw_function9", "conv_" + sConversation); + SetLocalString(oMySpeaker, "dmw_params9", "next"); + SetLocalInt(oMySpeaker, "dmw_dialognext", nCurrent); + + nChoice = 8; + for(;nChoice >= 0; nChoice--) + { + int nTemp1 = nCurrent; + int nTemp2 = nCurrent; + nMatch = nTemp2; + while((nCurrent == nMatch) && (nTemp2 > 0)) + { + nTemp2--; + nMatch = dmwand_BuildConversationDialog(nTemp2, nChoice, sConversation, sParams); + } + + if(nTemp2 <= 0) + { + //we went back too far for some reason, so make this choice blank + SetLocalString(oMySpeaker, "dmw_dialog" + IntToString(nChoice), ""); + SetLocalString(oMySpeaker, "dmw_function" + IntToString(nChoice), ""); + SetLocalString(oMySpeaker, "dmw_params" + IntToString(nChoice), ""); + } + nLast = nTemp; + nTemp = nTemp1; + nTemp1 = nMatch; + nCurrent = nMatch; + } + + if(nMatch > 0) + { + SetLocalString(oMySpeaker, "dmw_dialog1", "<- previous"); + SetLocalString(oMySpeaker, "dmw_function1", "conv_" + sConversation); + SetLocalString(oMySpeaker, "dmw_params1", "prev"); + SetLocalInt(oMySpeaker, "dmw_dialogprev", nLast); + } + + //fill the NPC's dialog spot + //(saved for last because the build process tromps on it) + dmwand_BuildConversationDialog(0, 0, sConversation, sParams); + } + else + { + //fill the NPC's dialog spot + dmwand_BuildConversationDialog(0, 0, sConversation, sParams); + + //No parameters specified, start at the top of the conversation + if(sParams == "") + { + nChoice = 1; + nCurrent = 1; + } + + //A "next->" choice was selected + if(TestStringAgainstPattern(sParams, "next")) + { + //get the number choice to start with + nCurrent = GetLocalInt(oMySpeaker, "dmw_dialognext"); + + //set this as the number for the "previous" choice to use + SetLocalInt(oMySpeaker, "dmw_dialogprev", nCurrent); + + //Set the first dialog choice to be "previous" + nChoice = 2; + SetLocalString(oMySpeaker, "dmw_dialog1", "<- Previous"); + SetLocalString(oMySpeaker, "dmw_function1", "conv_" + sConversation); + SetLocalString(oMySpeaker, "dmw_params1", "prev"); + } + + //Loop through to build the dialog list + for(;nChoice <= 10; nChoice++) + { + nMatch = dmwand_BuildConversationDialog(nCurrent, nChoice, sConversation, sParams); + //nLast will be the value of the choice before the last one + nLast = nTemp; + nTemp = nMatch; + if(nMatch > 0) { nCurrent = nMatch; } + if(nMatch == 0) { nLast = 0; } + nCurrent++; + } + + //If there were enough choices to fill 10 spots, make spot 9 a "next" + if(nLast > 0) + { + SetLocalString(oMySpeaker, "dmw_dialog9", "Next ->"); + SetLocalString(oMySpeaker, "dmw_function9", "conv_" + sConversation); + SetLocalString(oMySpeaker, "dmw_params9", "next"); + SetLocalInt(oMySpeaker, "dmw_dialognext", nLast); + } + } +} + +void dmwand_StartConversation() +{ + if(! GetIsObjectValid(oMySpeaker)) + { + return; + } + + dmwand_BuildConversation("Start", ""); +} + +int StartingConditional() +{ + object oPC = GetPCSpeaker(); + int nMyNum = 0; + + DeleteLocalInt(oPC, "Tens"); + DeleteLocalInt(oPC, "dmfi_univ_offset"); + SetLocalInt(OBJECT_SELF, "dmfi_dmwOffset", 1); + //Check whether this conversation has been started already, start it if not. + int nStarted = GetLocalInt(oMySpeaker, "dmw_started"); + if(! nStarted) + { + SetLocalInt(oMySpeaker, "dmw_started", 1); + dmwand_StartConversation(); + } + + string sMyString = GetLocalString(oMySpeaker, "dmw_dialog" + IntToString(nMyNum)); + + if(sMyString == "") + { + return FALSE; + } + else if (GetLocalString(oPC, "dmfi_univ_conv") == "server") + { + SetCustomToken(DMW_START_CUSTOM_TOKEN + nMyNum, sMyString); + return TRUE; + } + else + return FALSE; +} diff --git a/gamma_age_v2/dmfi_univ_listen.ncs b/gamma_age_v2/dmfi_univ_listen.ncs new file mode 100644 index 0000000000000000000000000000000000000000..597be450bc9e52a82dcee469d5c5811abd1e01d1 GIT binary patch literal 1979 zcma)7O-~b16n*c_v<0a^2rP_43kVp^|NFZWRTxc{9S0>HSnbJw5z3k{xo@65EtDs<85ym#KY=bih}yEm4d2jgRx7nI7q z9#QyoIVz*9CHlHaU$>Nh~1R z(%utZ|HECGCydCG1zSP$GfZ+v5td5zOE79f(3 z2eqK&ul$`4PP7;R{Wx<`f($2In$nN0)Q;ZDdZW1L1<}1q-EH`cW8rGTm@L13ikbKY zrNfsW;qGbW__D7C2X-Ip% z5YtlPJ776@Qqm&wYkGHPd&g|o#C5=%npKQMd4Sv|q0~-xrgJEkg|Z#(2Z%oBsDRZY z$u`d9S1P^}-_+qSU>+=BXUM6z4QJK&L#I@6!!_S?qMCy(s?~1(9^eDWG(Wdl^c4dK zEQ@RBf^i^o9(b(f4vRQt+oUD6{=1;x#AwMhGar>m^*&Cd*=0QH02k<^3fZKBTirmu z>d?T&JZWT1m{-RDPgCvcvDmL<9Q~Hwn3b%Fym`ufN93UjssY!z@i^^mjW?0bz4PRi z6t5(8OXnnEsO-a==+T@bMW}YgU~V9!s>N1mmszU#j=EvktR9jea>qHtGousOF{ zO>p9AIF%U8Ozhzid{8ozqqh=$`G_APUK|#h)Hdy2Acg-_e-_9=X=x?rq|*Y y9BCQXmREC literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_univ_listen.nss b/gamma_age_v2/dmfi_univ_listen.nss new file mode 100644 index 00000000..c1f928a4 --- /dev/null +++ b/gamma_age_v2/dmfi_univ_listen.nss @@ -0,0 +1,115 @@ + +// dmfi_univ_listen + +// template: dmfi_getln_cbtpl +// triggered from OnPlayerChat callback + +#include "dmfi_db_inc" + +void main() +{ + int nVolume = GetPCChatVolume(); + object oShouter = GetPCChatSpeaker(); + string sSaid = GetPCChatMessage(); + +// SendMessageToPC(GetFirstPC(), "ENTER dmfi_univ_listen: speaker=" + GetName(oShouter) + ", channel=" + IntToString(nVolume) + ", said=" + sSaid); + // first, lets deal with a getln event + string getln_mode = GetLocalString(OBJECT_SELF, "dmfi_getln_mode"); + if (getln_mode == "name") + { + if (sSaid != ".") + { + object oTarget = GetLocalObject(oShouter, "dmfi_univ_target"); + SetName(oTarget, sSaid); + } + DeleteLocalString(OBJECT_SELF, "dmfi_getln_mode"); + } + else if (getln_mode == "desc") + { + if (sSaid != ".") + { + object oTarget = GetLocalObject(oShouter, "dmfi_univ_target"); + SetDescription(oTarget, sSaid); + } + DeleteLocalString(OBJECT_SELF, "dmfi_getln_mode"); + } + else + { + // you may wish to define an "abort" input message, such as a line + // containing a single period: + if (sSaid != ".") + { + // put your code here to process the input line (in sSaid) + + if (GetIsDM(oShouter)) SetLocalInt(GetModule(), "dmfi_Admin" + GetPCPublicCDKey(oShouter), 1); + if (GetIsDMPossessed(oShouter)) SetLocalObject(GetMaster(oShouter), "dmfi_familiar", oShouter); + + object oTarget = GetLocalObject(oShouter, "dmfi_VoiceTarget"); + object oMaster = OBJECT_INVALID; + if (GetIsObjectValid(oTarget)) oMaster = oShouter; + + int iPhrase = GetLocalInt(oShouter, "hls_EditPhrase"); + + object oSummon; + + if (GetIsObjectValid(oShouter) && GetIsDM(oShouter)) + { + if (GetTag(OBJECT_SELF) == "dmfi_setting" && GetLocalString(oShouter, "EffectSetting") != "") + { + string sPhrase = GetLocalString(oShouter, "EffectSetting"); + SetLocalFloat(oShouter, sPhrase, StringToFloat(sSaid)); + SetDMFIPersistentFloat("dmfi", sPhrase, StringToFloat(sSaid), oShouter); + DeleteLocalString(oShouter, "EffectSetting"); + DelayCommand(0.5, ActionSpeakString("The setting " + sPhrase + " has been changed to " + FloatToString(GetLocalFloat(oShouter, sPhrase)))); + DelayCommand(1.5, DestroyObject(OBJECT_SELF)); + } + } + + if (GetIsObjectValid(oShouter) && GetIsPC(oShouter)) + { + if (sSaid != GetLocalString(GetModule(), "hls_voicebuffer")) + { + SetLocalString(GetModule(), "hls_voicebuffer", sSaid); + + // PrintString(""+GetName(GetArea(oShouter))+ " " + GetName(oShouter) + ": " + sSaid + " "); + + // if the phrase begins with .MyName, reparse the string as a voice throw + if (GetStringLeft(sSaid, GetStringLength("." + GetName(OBJECT_SELF))) == "." + GetName(OBJECT_SELF) && + (GetLocalInt(GetModule(), "dmfi_Admin" + GetPCPublicCDKey(oShouter)) || + GetIsDM(oShouter) || GetIsDMPossessed(oShouter))) + { + oTarget = OBJECT_SELF; + sSaid = GetStringRight(sSaid, GetStringLength(sSaid) - GetStringLength("." + GetName(OBJECT_SELF))); + if (GetStringLeft(sSaid, 1) == " ") sSaid = GetStringRight(sSaid, GetStringLength(sSaid) - 1); + sSaid = ":" + sSaid; + SetPCChatMessage(sSaid); +// SendMessageToPC(GetFirstPC(), "LEAVE(1) dmfi_univ_listen: speaker=" + GetName(oShouter) + ", channel=" + IntToString(nVolume) + ", said=" + sSaid); + return; // must bail out here to prevent clearing of message at end + } + + if (iPhrase) + { + if (iPhrase > 0) + { + SetCustomToken(iPhrase, sSaid); + SetDMFIPersistentString("dmfi", "hls" + IntToString(iPhrase), sSaid); + FloatingTextStringOnCreature("Phrase " + IntToString(iPhrase) + " has been recorded", oShouter, FALSE); + } + else if (iPhrase < 0) + { + + } + DeleteLocalInt(oShouter, "hls_EditPhrase"); + } + } + } + } + } + + // after processing, you will likely want to "eat" the text line, so it is + // not spoken or available for further processing + SetPCChatMessage(""); + +// SendMessageToPC(GetFirstPC(), "LEAVE(2) dmfi_univ_listen: speaker=" + GetName(oShouter) + ", channel=" + IntToString(nVolume) + ", said=" + sSaid); + +} diff --git a/gamma_age_v2/dmfi_universal.dlg b/gamma_age_v2/dmfi_universal.dlg new file mode 100644 index 0000000000000000000000000000000000000000..1c11deddf6be6c6359c45ca57ac71fe3ddb64617 GIT binary patch literal 540062 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

%x7X)7$kyMw$kyM<)L;Jjw*eSg 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 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_voice1.ncs b/gamma_age_v2/dmfi_voice1.ncs new file mode 100644 index 0000000000000000000000000000000000000000..943816614908731eba5759bae47fbf7ba9907c3f GIT binary patch literal 924 zcma)4y-EW?5T3c+I}(B+Xkj2kk1G!qMKonl+aN-~Hi${|ASPgfKV9+$K7gfQsfCZ= zD~Jg3A%qAPfw(h!d)$SH*<#rJ=G$*)zMaE^s(ZY(vAGW*?pHvqlnc^^O#Px6)S8`E zt8*Y5u;=nriLd=N)ptJaIcX+W4W*R^bkipRjs_(3|MMAlyOB>;I}4+IaA<_ z?n*-7WHR|7!@x&s6tgiXk5M0a%y?`>eJw|YsFf;GT+$9Gfix=TO`DE2#VhC{S$)J0 zK3WMrtKF@`)V=xjxzU*ZYf^to_uqP0X$&$PfW-okRa7PVGrmpRtfMjE4W-<3!@nbs z`;JkK42Sm^^nvEUUN7^BzXu=C6ONlm=lG<|bX=yF!x^z5%hRuCyn1pQ{mKr_#Ajjx b74T(%_yEq;&%nWOfY_aJkv#HvKXTz0Kt6xT literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_voice1.nss b/gamma_age_v2/dmfi_voice1.nss new file mode 100644 index 00000000..6aa2b0f6 --- /dev/null +++ b/gamma_age_v2/dmfi_voice1.nss @@ -0,0 +1,65 @@ +//:://///////////////////////////////////////////// +//:: Default On Heartbeat +//:: NW_C2_DEFAULT1 +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + This script will have people perform default + animations. +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: Nov 23, 2001 +//::////////////////////////////////////////////// +#include "dmfi_db_inc" + +void main() +{ + object oFollow = GetLocalObject(OBJECT_SELF, "dmfi_follow"); + int iLoiter = GetLocalInt(OBJECT_SELF, "dmfi_Loiter"); + + // Will fire ONE time only - makes the thing hard to see + if (!GetLocalInt(OBJECT_SELF, "hls_invis")) + { + SetListenPattern(OBJECT_SELF, "**", LISTEN_PATTERN); //listen to all text + SetLocalInt(OBJECT_SELF, "hls_Listening", 1); //listen to all text + SetListening(OBJECT_SELF, TRUE); //be sure NPC is listening + + //leave it here rather than add the one time loop to EVERY creature through a OS script change + ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY), OBJECT_SELF); + ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectCutsceneGhost(), OBJECT_SELF); + SetLocalInt(OBJECT_SELF, "hls_invis",1); + } + + if (GetIsObjectValid(oFollow)) + { + if (GetArea(oFollow)==GetArea(OBJECT_SELF)) + { + AssignCommand(OBJECT_SELF, ClearAllActions(TRUE)); + AssignCommand(OBJECT_SELF, ActionForceFollowObject(oFollow)); + } + else + { + AssignCommand(OBJECT_SELF, ClearAllActions(TRUE)); + AssignCommand(OBJECT_SELF, ActionJumpToObject(oFollow)); + AssignCommand(OBJECT_SELF, ActionForceFollowObject(oFollow)); + } + } + // If just following and listening, then return. + if (!iLoiter) + return; + + // If in loiter mode, look for a PC and make the announcement when appropraite + object oPC = GetFirstObjectInShape(SHAPE_SPHERE, 10.0f, GetLocation(OBJECT_SELF), TRUE); + while(GetIsObjectValid(oPC)) + { + if (GetIsPC(oPC) && + !GetIsDM(oPC) && + iLoiter) + { + SpeakString(GetLocalString(OBJECT_SELF, "dmfi_LoiterSay")); + DestroyObject(OBJECT_SELF); + } + oPC = GetNextObjectInShape(SHAPE_SPHERE, 10.0f, GetLocation(OBJECT_SELF), TRUE); + } +} diff --git a/gamma_age_v2/dmfi_voice_exe.ncs b/gamma_age_v2/dmfi_voice_exe.ncs new file mode 100644 index 0000000000000000000000000000000000000000..d26a206669ec74cd67fc4e69b14ffeb5fe7d437a GIT binary patch literal 835 zcmZ`%OG`pg5I*PJt3A|^&_(n*;35!-q<0%B5!w`j;#O{Y^j`2$dKdkm7A>P+5cCIv zwk=w;Flu4ZqD5pgbFOA$cQJBizWL^x&pA%#WFfh_cEFgCUSjY~O6Fti7Q;6)c(2#{ zVy2Jr3%-oyUDJTbAv0aBSDfO0x$ZP5r@>tUpNU8e2;Pxp+xTS>_nIZyPXSMecq&%i zsX11Q3Liw0;?TWk03=M1LenX!yw$2Imr$RGVq3!WqoScyTn}03b8*}P(DMwpfud+I++e&(yYR`Z<5`#)q z+E!bhDAkZ9+iFx*S-MRLCA_mKinFBa)zf!JqBjIMU>I~}D?)Y!O5N#41!V(A&=L3>J;S2b(5k^E2CycF#l>jYxZ7ULz)t;%@X)!asO!s=T zIUxQdxBP?rgdE_#`LIo-BqhD+?wYDsRoy)`yOWXZ-5YNFVvP9|cnJvb=NV(JVJx6@ zpBVFQ#hABP?|x>?7Z~3|Fqo@+Kpq3S=#E55}gRac-_bopV-3vq3JVQDm2>~lG@Fp^HuYn>rtvzbeU5m zKe5x+v3qXiww`J@)@}I^j~AHiL|DYAHn%9AO z^zziFT8wQS@3xw8?Ppp?r{RfXCf$13m1lP5hjBUUqk|9mPV8aPYq;LC#k^mG+Lj$R zBed%i3)EjFx;dMvt=sp7#;Bw1HXZPnC3de{;Vz|R<_?a$OLXDVsm5D)#Sf{!ki1~q zPk+T1NgLU3jCjNQuk8X(^|Zs^@SNl>NXsXfSqTouuC*L#9dMN5Gl{v%X<}QYLz(1S zt5_f|ykzq#;mL;wgS+dp>B`1ww{oxNDr3I@p^aiIc{bjX=p|@`1yo$yAWJ{5CGtW< z$$Tx_F2agOgh<$RS^Ft1<-tB(U@Hq-fdD*qxyG@yuaF4xBp;Lw`A|lPSp?rPhhqzd z7$(?Yl!BtGR6LyPlQM>bjejqLai+DO!wsR6TJe=&=h|&250d^3NhYW_=Cxn6k8Js&gS&bI|WrEyi;r>Y$#`e6@U$n&68J(&63T6&5ccw t&4x{ojp+t(6CgkDBpVZ(+$zAP#%9Kb!$!lO#C70%;0NGGfN}fy9{{{TI~xE1 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_x_afflict.ncs b/gamma_age_v2/dmfi_x_afflict.ncs new file mode 100644 index 0000000000000000000000000000000000000000..c15e92d7562a76793161fb4c2952cbc1f9a86ea0 GIT binary patch literal 12720 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 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_x_afflict.nss b/gamma_age_v2/dmfi_x_afflict.nss new file mode 100644 index 00000000..85ce123a --- /dev/null +++ b/gamma_age_v2/dmfi_x_afflict.nss @@ -0,0 +1,377 @@ +#include "dmfi_db_inc" + + +object DMFI_NextTarget(object oTarget, object oUser) +{ + object oNew; + + if (GetIsPC(oTarget)) + { + if (GetIsObjectValid(GetNextFactionMember(oTarget))) + oNew = GetNextFactionMember(oTarget); + else + oNew = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC, oTarget, 1); + } + else + oNew = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_NOT_PC, oTarget, 1); + + + if (!GetIsObjectValid(oNew)) + { + SendMessageToPC(oUser, "No valid target to transfer to."); + oNew = oTarget; + } + + SetLocalObject(oUser, "dmfi_univ_target", oNew); + SetCustomToken(20680, GetName(oNew)); + FloatingTextStringOnCreature("Target changed to: "+ GetName(oNew), oUser); + return oNew; +} + +//DMFI Creates the "settings" creature +void CreateSetting(object oUser) +{ + object oSetting = CreateObject(OBJECT_TYPE_CREATURE, "dmfi_setting", GetLocation(oUser)); + DelayCommand(0.5f, AssignCommand(oSetting, ActionSpeakString(GetLocalString(oUser, "EffectSetting") + " is currently set at " + FloatToString(GetLocalFloat(oUser, GetLocalString(oUser, "EffectSetting")))))); + SetLocalObject(oSetting, "MyMaster", oUser); + SetListenPattern(oSetting, "**", LISTEN_PATTERN); //listen to all text + SetLocalInt(oSetting, "hls_Listening", 1); //listen to all text + SetListening(oSetting, TRUE); //be sure NPC is listening +} + +//This function is for the DMFI Affliction Wand +void ReportImmunity(object oT, object oUser) +{ + SendMessageToPC(oUser, "Immunities Reported: (blank if none)"); + if (GetIsImmune(oT, IMMUNITY_TYPE_ABILITY_DECREASE)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Ability Decrease"); + if (GetIsImmune(oT, IMMUNITY_TYPE_AC_DECREASE)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE AC Decrease"); + if (GetIsImmune(oT, IMMUNITY_TYPE_ATTACK_DECREASE)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Attack Decrease"); + if (GetIsImmune(oT, IMMUNITY_TYPE_BLINDNESS)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Blindness"); + if (GetIsImmune(oT, IMMUNITY_TYPE_CHARM)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Charm"); + if (GetIsImmune(oT, IMMUNITY_TYPE_CONFUSED)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Confusion"); + if (GetIsImmune(oT, IMMUNITY_TYPE_CRITICAL_HIT)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Critical Hit"); + if (GetIsImmune(oT, IMMUNITY_TYPE_CURSED)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Cursed"); + if (GetIsImmune(oT, IMMUNITY_TYPE_DAMAGE_DECREASE)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Damage Decrease"); + if (GetIsImmune(oT, IMMUNITY_TYPE_DAMAGE_IMMUNITY_DECREASE)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Damage Immunity Decrease"); + if (GetIsImmune(oT, IMMUNITY_TYPE_DAZED)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Dazed"); + if (GetIsImmune(oT, IMMUNITY_TYPE_DEAFNESS)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Deafness"); + if (GetIsImmune(oT, IMMUNITY_TYPE_DEATH)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Death"); + if (GetIsImmune(oT, IMMUNITY_TYPE_DISEASE)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Disease"); + if (GetIsImmune(oT, IMMUNITY_TYPE_DOMINATE)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Dominate"); + if (GetIsImmune(oT, IMMUNITY_TYPE_ENTANGLE)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Entangle"); + if (GetIsImmune(oT, IMMUNITY_TYPE_FEAR)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Fear"); + if (GetIsImmune(oT, IMMUNITY_TYPE_KNOCKDOWN)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Knockdown"); + if (GetIsImmune(oT, IMMUNITY_TYPE_MIND_SPELLS)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Mind Spells"); + if (GetIsImmune(oT, IMMUNITY_TYPE_MOVEMENT_SPEED_DECREASE)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Movement Speed Decrease"); + if (GetIsImmune(oT, IMMUNITY_TYPE_NEGATIVE_LEVEL)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Negative Level"); + if (GetIsImmune(oT, IMMUNITY_TYPE_PARALYSIS)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Paralysis"); + if (GetIsImmune(oT, IMMUNITY_TYPE_POISON)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Poison"); + if (GetIsImmune(oT, IMMUNITY_TYPE_SAVING_THROW_DECREASE)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Saving Throw Decrease"); + if (GetIsImmune(oT, IMMUNITY_TYPE_SILENCE)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Silence"); + if (GetIsImmune(oT, IMMUNITY_TYPE_SKILL_DECREASE)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Skill Decrease"); + if (GetIsImmune(oT, IMMUNITY_TYPE_SLEEP)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Sleep"); + if (GetIsImmune(oT, IMMUNITY_TYPE_SLOW)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Slow"); + if (GetIsImmune(oT, IMMUNITY_TYPE_SNEAK_ATTACK)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Sneak Attack"); + if (GetIsImmune(oT, IMMUNITY_TYPE_SPELL_RESISTANCE_DECREASE)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Spell Resistance Decrease"); + if (GetIsImmune(oT, IMMUNITY_TYPE_STUN)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Stun"); + if (GetIsImmune(oT, IMMUNITY_TYPE_TRAP)) + SendMessageToPC(oUser, GetName(oT) + " IMMUNE Trap"); +} + +void CheckForEffect(effect eA, object oT, object oUser) +{ + int Result = FALSE; + effect Check = GetFirstEffect(oT); + + while (GetIsEffectValid(Check)) + { + if (Check == eA) + Result = TRUE; + + Check = GetNextEffect(oT); + } + if (Result) + FloatingTextStringOnCreature("Affliction Wand Saving Throw Failure: " + GetName(oT), oUser); + else + FloatingTextStringOnCreature("Affliction Wand Saving Throw Success: No Effect: " + GetName(oT), oUser); +} + +void main() +{ + int iAfflict = GetLocalInt(OBJECT_SELF, "dmfi_univ_int"); + object oUser = OBJECT_SELF; + effect eEffect; + object oTarget = GetLocalObject(oUser, "dmfi_univ_target"); + float fDuration; + int nDNum; + effect eD; + effect eA; + effect eT; + effect eVis; + int nBug = 0; + int nSaveAmount; float fSaveAmount; + + nDNum = GetLocalInt(oUser, "dmfi_damagemodifier"); + fDuration = GetLocalFloat(oUser, "dmfi_stunduration"); + fSaveAmount = GetLocalFloat(oUser, "dmfi_saveamount"); + + nSaveAmount = FloatToInt(fSaveAmount); + + if (!(GetObjectType(oTarget) == OBJECT_TYPE_CREATURE) || + GetIsDM(oTarget)) + { + FloatingTextStringOnCreature("You must target a valid creature!", oUser, FALSE); + return; + } + switch(iAfflict) + { + case 11: eD= EffectDamage(d4(nDNum), DAMAGE_TYPE_MAGICAL, DAMAGE_POWER_PLUS_TWENTY); + eVis = EffectVisualEffect(VFX_COM_BLOOD_SPARK_SMALL); break; + case 12: eD = EffectDamage(d6(nDNum), DAMAGE_TYPE_MAGICAL, DAMAGE_POWER_PLUS_TWENTY); + eVis = EffectVisualEffect(VFX_COM_BLOOD_LRG_RED); break; + case 13: eD = EffectDamage(d8(nDNum), DAMAGE_TYPE_MAGICAL, DAMAGE_POWER_PLUS_TWENTY); + eVis = EffectVisualEffect(VFX_COM_BLOOD_LRG_RED); break; + case 14: eD = EffectDamage(d10(nDNum), DAMAGE_TYPE_MAGICAL, DAMAGE_POWER_PLUS_TWENTY); + eVis = EffectVisualEffect(VFX_COM_BLOOD_SPARK_SMALL); break; + case 15: eD = EffectDamage(d12(nDNum), DAMAGE_TYPE_MAGICAL, DAMAGE_POWER_PLUS_TWENTY); + eVis = EffectVisualEffect(VFX_COM_BLOOD_SPARK_SMALL); break; + case 16: eD = EffectDamage(GetCurrentHitPoints(oTarget)/4, DAMAGE_TYPE_MAGICAL, DAMAGE_POWER_PLUS_TWENTY); + eVis = EffectVisualEffect(VFX_COM_BLOOD_LRG_RED); break; + case 17: eD = EffectDamage(GetCurrentHitPoints(oTarget)/2, DAMAGE_TYPE_MAGICAL, DAMAGE_POWER_PLUS_TWENTY); + eVis = EffectVisualEffect(VFX_COM_BLOOD_LRG_RED); break; + case 18: eD = EffectDamage(GetCurrentHitPoints(oTarget) * 3 / 4, DAMAGE_TYPE_MAGICAL, DAMAGE_POWER_PLUS_TWENTY); + eVis =EffectVisualEffect(VFX_COM_CHUNK_RED_SMALL); break; + case 19: eD = EffectDamage(GetCurrentHitPoints(oTarget)-1, DAMAGE_TYPE_MAGICAL, DAMAGE_POWER_PLUS_TWENTY); + eVis =EffectVisualEffect(VFX_COM_CHUNK_RED_SMALL); break; + case 21: eA =EffectDisease(DISEASE_FILTH_FEVER); break; + case 22: eA =EffectDisease(DISEASE_MINDFIRE); break; + case 23: eA =EffectDisease(DISEASE_DREAD_BLISTERS); break; + case 24: eA =EffectDisease(DISEASE_SHAKES); break; + case 25: eA =EffectDisease(DISEASE_VERMIN_MADNESS); break; + case 26: eA =EffectDisease(DISEASE_DEVIL_CHILLS); break; + case 27: eA =EffectDisease(DISEASE_SLIMY_DOOM); break; + case 28: eA =EffectDisease(DISEASE_RED_ACHE); break; + case 29: eA =EffectDisease(DISEASE_ZOMBIE_CREEP); break; + case 31: eA =EffectDisease(DISEASE_BLINDING_SICKNESS); break; + case 32: eA =EffectDisease(DISEASE_CACKLE_FEVER); break; + case 33: eA =EffectDisease(DISEASE_BURROW_MAGGOTS); break; + case 34: eA =EffectDisease(DISEASE_RED_SLAAD_EGGS); break; + case 35: eA =EffectDisease(DISEASE_DEMON_FEVER); break; + case 36: eA =EffectDisease(DISEASE_GHOUL_ROT); break; + case 37: eA =EffectDisease(DISEASE_MUMMY_ROT); break; + case 38: eA =EffectDisease(DISEASE_SOLDIER_SHAKES); break; + case 39: eA =EffectDisease(DISEASE_SOLDIER_SHAKES); break; + case 41: eA =EffectPoison(POISON_TINY_SPIDER_VENOM); break; + case 42: eA =EffectPoison(POISON_ARANEA_VENOM); break; + case 43: eA =EffectPoison(POISON_MEDIUM_SPIDER_VENOM); break; + case 44: eA = EffectPoison(POISON_CARRION_CRAWLER_BRAIN_JUICE); break; + case 45: eA = EffectPoison(POISON_OIL_OF_TAGGIT); break; + case 46: eA = EffectPoison(POISON_ARSENIC); break; + case 47: eA = EffectPoison(POISON_GREENBLOOD_OIL); break; + case 48: eA = EffectPoison(POISON_NITHARIT); break; + case 49: eA = EffectPoison(POISON_PHASE_SPIDER_VENOM); break; + case 51: eA = EffectPoison(POISON_LICH_DUST); break; + case 52: eA = EffectPoison(POISON_SHADOW_ESSENCE); break; + case 53: eA = EffectPoison(POISON_LARGE_SPIDER_VENOM); break; + case 54: eA = EffectPoison(POISON_PURPLE_WORM_POISON); break; + case 55: eA = EffectPoison(POISON_IRON_GOLEM); break; + case 56: eA = EffectPoison(POISON_PIT_FIEND_ICHOR); break; + case 57: eA = EffectPoison(POISON_WYVERN_POISON); break; + case 58: eA = EffectPoison(POISON_BLACK_LOTUS_EXTRACT); break; + case 59: eA = EffectPoison(POISON_GARGANTUAN_SPIDER_VENOM); break; + case 60: eT = EffectPetrify(); break; + case 61: eT = EffectBlindness(); break; + case 62: eT = EffectCurse(4,4,4,4,4,4); break; + case 63: eT = EffectFrightened(); break; + case 64: eT = EffectStunned(); break; + case 65: eT = EffectSilence(); break; + case 66: eT = EffectSleep(); break; + case 67: eT = EffectSlow(); break; + case 68: eT = EffectKnockdown(); nBug = 1; break; + case 69: eD = EffectDamage( GetCurrentHitPoints(oTarget)-1, DAMAGE_TYPE_MAGICAL, DAMAGE_POWER_NORMAL); + AssignCommand( oTarget, ClearAllActions()); + AssignCommand( oTarget, ActionPlayAnimation( ANIMATION_LOOPING_DEAD_FRONT, 1.0, 99999.0)); + DelayCommand(0.5, SetCommandable( FALSE, oTarget)); break; + case 71: eA = EffectCutsceneDominated();break; + case 72: eA = EffectCutsceneGhost(); break; + case 73: eA = EffectCutsceneImmobilize(); break; + case 74: eA = EffectCutsceneParalyze(); break; + case 75: nBug = -1; break; //special case for combo death effect + case 81: eEffect = GetFirstEffect(oTarget); + while (GetIsEffectValid(eEffect)) + { + if (GetEffectType(eEffect) == EFFECT_TYPE_POISON) RemoveEffect(oTarget, eEffect); + eEffect = GetNextEffect(oTarget); + } break; + case 82: eEffect = GetFirstEffect(oTarget); + while (GetIsEffectValid(eEffect)) + { + if (GetEffectType(eEffect) == EFFECT_TYPE_DISEASE) RemoveEffect(oTarget, eEffect); + eEffect = GetNextEffect(oTarget); + } break; + case 83: eEffect = GetFirstEffect(oTarget); + while (GetIsEffectValid(eEffect)) + { + if (GetEffectType(eEffect) == EFFECT_TYPE_BLINDNESS) RemoveEffect(oTarget, eEffect); + eEffect = GetNextEffect(oTarget); + } break; + case 84: eEffect = GetFirstEffect(oTarget); + while (GetIsEffectValid(eEffect)) + { + if (GetEffectType(eEffect) == EFFECT_TYPE_CURSE) RemoveEffect(oTarget, eEffect); + eEffect = GetNextEffect(oTarget); + } break; + case 85: eEffect = GetFirstEffect(oTarget); + while (GetIsEffectValid(eEffect)) + { + if (GetEffectType(eEffect) == EFFECT_TYPE_FRIGHTENED) RemoveEffect(oTarget, eEffect); + eEffect = GetNextEffect(oTarget); + } break; + case 86: eEffect = GetFirstEffect(oTarget); + while (GetIsEffectValid(eEffect)) + { + if (GetEffectType(eEffect) == EFFECT_TYPE_STUNNED) RemoveEffect(oTarget, eEffect); + eEffect = GetNextEffect(oTarget); + } break; + case 87: eEffect = GetFirstEffect(oTarget); + while (GetIsEffectValid(eEffect)) + { + if (GetEffectType(eEffect) == EFFECT_TYPE_SILENCE) RemoveEffect(oTarget, eEffect); + eEffect = GetNextEffect(oTarget); + } break; + case 88: eEffect = GetFirstEffect(oTarget); + while (GetIsEffectValid(eEffect)) + { + RemoveEffect(oTarget, eEffect); + eEffect = GetNextEffect(oTarget); + } break; + case 89: SetCommandable(TRUE, oTarget); + AssignCommand(oTarget, ClearAllActions()); break; + case 80: eEffect = GetFirstEffect(oTarget); + while (GetIsEffectValid(eEffect)) + { + if (GetEffectType(eEffect) == EFFECT_TYPE_PETRIFY) RemoveEffect(oTarget, eEffect); + eEffect = GetNextEffect(oTarget); + } break;//Added July 5, 2003 + +// 99 is a duplicate instance - simple copy. - Demetrious + case 91: SetLocalString(oUser, "EffectSetting", "dmfi_stunduration"); + CreateSetting(oUser); + case 92: SetDMFIPersistentInt("dmfi", "DamageModifier", nDNum+1); SetCustomToken(20780, IntToString(nDNum+1));; break; + case 93: + if (nDNum==1) + { + FloatingTextStringOnCreature("Illegal operation: Minimum modifier is 1.", oUser); + break; + } + else + { + SetDMFIPersistentInt("dmfi", "DamageModifier", nDNum-1); SetCustomToken(20780, IntToString(nDNum-1)); ;break; + break; + } + case 94: ReportImmunity(oTarget, oUser); break; + case 95: DMFI_NextTarget(oTarget, oUser); break; + case 99: SetLocalString(oUser, "EffectSetting", "SaveEffectAmount"); + CreateSetting(oUser); break; + case 101: eT = EffectSavingThrowDecrease(SAVING_THROW_FORT, nSaveAmount); break; + case 102: eT = EffectSavingThrowDecrease(SAVING_THROW_REFLEX, nSaveAmount); break; + case 103: eT = EffectSavingThrowDecrease(SAVING_THROW_WILL, nSaveAmount); break; + case 104: eT = EffectSavingThrowIncrease(SAVING_THROW_FORT, nSaveAmount); break; + case 105: eT = EffectSavingThrowIncrease(SAVING_THROW_REFLEX, nSaveAmount); break; + case 106: eT = EffectSavingThrowIncrease(SAVING_THROW_WILL, nSaveAmount); break; + case 107: eT = EffectSavingThrowDecrease(SAVING_THROW_ALL, nSaveAmount); break; + case 108: eT = EffectSavingThrowIncrease(SAVING_THROW_ALL, nSaveAmount); break; + case 109: SetLocalString(oUser, "EffectSetting", "SaveEffectAmount"); + CreateSetting(oUser); + case 100: eEffect = GetFirstEffect(oTarget); + while (GetIsEffectValid(eEffect)) + { + if ((GetEffectType(eEffect) == EFFECT_TYPE_SAVING_THROW_INCREASE) + ||(GetEffectType(eEffect) == EFFECT_TYPE_SAVING_THROW_DECREASE)) + RemoveEffect(oTarget, eEffect); + eEffect = GetNextEffect(oTarget); + } break;//Added July 5, 2003 + + + + default: break; + } +//code down here to apply the effects an then go back and see if the +//player successfully saved or did not for the diseases and poisons. + + if ((GetEffectType(eD)!= EFFECT_TYPE_INVALIDEFFECT) || + (GetEffectType(eVis) != EFFECT_TYPE_INVALIDEFFECT)) + { + ApplyEffectToObject(DURATION_TYPE_PERMANENT, eD, oTarget); + ApplyEffectToObject(DURATION_TYPE_PERMANENT, eVis, oTarget); + return; + } + if (GetEffectType(eA)!= EFFECT_TYPE_INVALIDEFFECT) + { + ApplyEffectToObject(DURATION_TYPE_PERMANENT, eA, oTarget); + DelayCommand(5.0, CheckForEffect(eA, oTarget, oUser)); + return; + } + if ((GetEffectType(eT)!= EFFECT_TYPE_INVALIDEFFECT) || (nBug ==1)) + { + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eT, oTarget, fDuration); + + if ((GetEffectType(eT)==EFFECT_TYPE_SAVING_THROW_INCREASE) || + (GetEffectType(eT)==EFFECT_TYPE_SAVING_THROW_DECREASE)) + { + DelayCommand(1.0, FloatingTextStringOnCreature("Target Saves: Fortitude " + IntToString(GetFortitudeSavingThrow(oTarget)) + + " Reflex " + IntToString(GetReflexSavingThrow(oTarget)) + " Will " + IntToString(GetWillSavingThrow(oTarget)), oUser)); + } + return; + } + if (nBug == -1) + { + object oFollowMe = GetFirstFactionMember(oTarget, TRUE); + + if (!GetIsObjectValid(oFollowMe)) + oFollowMe = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC, oTarget, 1,CREATURE_TYPE_IS_ALIVE, TRUE); + + if (GetIsDM(oFollowMe) || GetIsDMPossessed(oFollowMe)) + oFollowMe = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC, oTarget, 2,CREATURE_TYPE_IS_ALIVE, TRUE); + + if (!GetIsObjectValid(oFollowMe)) + oFollowMe = oUser; + + AssignCommand(oFollowMe, ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectCutsceneDominated(), oTarget)); + ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectCutsceneGhost(), oTarget); + ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY), oTarget); + } + + return; +} diff --git a/gamma_age_v2/dmfi_x_emote.ncs b/gamma_age_v2/dmfi_x_emote.ncs new file mode 100644 index 0000000000000000000000000000000000000000..cc2e1134c31f71f3a11343fcb66e6d09cdbe2e1b GIT binary patch literal 7667 zcmeHLOKenC7(VyTohh`%@+tyt;SLJu1dLdMM6r~IEDZPnL{X#+?TnqYGgCV)3UPrL zR~kfd18gv+F%sj#xPXmB(wJgOqJ{)ax==yGf&~c}Sdi53{Qo)AIrq_CkeHYV$=sgr z{EzQH=l{>^*>zjoZOa~cbgd9g*XIfRo8$^7E~a$kv$?kZLT*o6uF&TsWKUd(W}E+n z#MCi~zI5;FnZB4cIy!nwDvK31HEvTQWi5!!m->xb!cvkA0vfj+XG7yEL4DVRqZOSP zG^`qTAwG7(Ky8ICG0>PoHyfy<(6E;{mlgVsfmSQ@3j=+X(RkiKcPO;WKwnenVFTT% z(8~terqJIFbQhzEuMITKXw?A&-L23QO_=|xlS`)JBmd2mZ86_*#fSQ+U_C8NJ24zVdupimL65e7yn2Fk zJz6cEc0?;!Kb+Q9S}v++3gV+4LqS7P6+}o*VEnrX+LJ@I-;JO>JyiSY2--73wW}g% z*M@03XCr7&3Dtf-f_5xads77M>QL>v2-?^tf(thGliYqfyGw1Ee6cT+@9)b{Jw+-~oPLV>&Z7=5Y=|V@zP4{NpVm2EW_I)v0H&!g=)uK}E{$RBNX^l^X z_o#Xoyf#_EqF0Iak{hjkQ&O@oMHs8Pu(7fSJlfBo^kCJAVPhQ)`bDQj zEJjeJw8io-LRd5jKcCwHYpC5)Nj!0yh^IWRLyB5F$+5(|ey zN;z50$M~EmH$|C?ae~TR*hW2B=W}J!@?>YAEFU{3lJ)OqDEV>bk=Z=v@z|harvOqI zqXAS9K8q%x3iquDS=TH6tcl>>Pda}mTI5lVbTOJ19j|CJr|_`bOgKP(hS(?WLhJv@ zz%`4N;jm4TxdIt^L$+!cXkEJSHc<<*Q2g1_A_ae3S5;4tIh{2=H!(!M9f)sfYQ5#V%EYlRz~LG0EFGy&vm; zlE!?lqh>OVovlH^o5N+ZyEl{W*z5MCyD|k%f8uHFp+^wWOuBQSi(9F@nHGwyTq0Y$_tL;=6&k8x z9xz-2;$m8=r$3u5xy6E;c6)L?nH0eKRIbpO?#`6lY;Q4N(XklP-Q6JN=8OG(o!S0w zT!h_HzSxy9MV-~Z969PZPYn;BBmY;VFDq-&?1>uMs;q&rF44s!i##F`^=2v#k%&gs ztE<>&pz1YOd~BfVHCLQ4Q1zNCJ~2=bS}3#NO9NG}xnhv!=qm1oh>21P70yG52>&|s zAz`R4#z^{GNPnNr`lLU*P#qwB2-1g}n|;#3ws%ANNMt6xd0~WW+h{= zK2;S@bNAnvAf#KwL6j48D)J!83Hl(www?xa^1~)bvoodT1pVnxm6rItli?F&Pp4Fc zCF6?)o!)@X^6?Gp&MvdAbgl6IsOw7C$}2|x>soo6GWx6X;^tDjflHY*u&=?@Vp}b7 z+~jw1v1c4T>;R#9WA8V9f1HuQ{!|8+y*3itlBd1Haa!gaIjY&~cYnDEg#S$!oEXW- z-vMy{CSD%t5y!lsb8v~VM45X{3!aXj*3T A1^@s6 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/dmfi_x_emote.nss b/gamma_age_v2/dmfi_x_emote.nss new file mode 100644 index 00000000..3b0c69f6 --- /dev/null +++ b/gamma_age_v2/dmfi_x_emote.nss @@ -0,0 +1,218 @@ +//Smoking Function by Jason Robinson +location GetLocationAboveAndInFrontOf(object oPC, float fDist, float fHeight) +{ + float fDistance = -fDist; + object oTarget = (oPC); + object oArea = GetArea(oTarget); + vector vPosition = GetPosition(oTarget); + vPosition.z += fHeight; + float fOrientation = GetFacing(oTarget); + vector vNewPos = AngleToVector(fOrientation); + float vZ = vPosition.z; + float vX = vPosition.x - fDistance * vNewPos.x; + float vY = vPosition.y - fDistance * vNewPos.y; + fOrientation = GetFacing(oTarget); + vX = vPosition.x - fDistance * vNewPos.x; + vY = vPosition.y - fDistance * vNewPos.y; + vNewPos = AngleToVector(fOrientation); + vZ = vPosition.z; + vNewPos = Vector(vX, vY, vZ); + return Location(oArea, vNewPos, fOrientation); +} + +//Smoking Function by Jason Robinson +void SmokePipe(object oActivator) +{ + string sEmote1 = "*puffs on a pipe*"; + string sEmote2 = "*inhales from a pipe*"; + string sEmote3 = "*pulls a mouthful of smoke from a pipe*"; + float fHeight = 1.7; + float fDistance = 0.1; + // Set height based on race and gender + if (GetGender(oActivator) == GENDER_MALE) + { + switch (GetRacialType(oActivator)) + { + case RACIAL_TYPE_HUMAN: + case RACIAL_TYPE_HALFELF: fHeight = 1.7; fDistance = 0.12; break; + case RACIAL_TYPE_ELF: fHeight = 1.55; fDistance = 0.08; break; + case RACIAL_TYPE_GNOME: + case RACIAL_TYPE_HALFLING: fHeight = 1.15; fDistance = 0.12; break; + case RACIAL_TYPE_DWARF: fHeight = 1.2; fDistance = 0.12; break; + case RACIAL_TYPE_HALFORC: fHeight = 1.9; fDistance = 0.2; break; + } + } + else + { + // FEMALES + switch (GetRacialType(oActivator)) + { + case RACIAL_TYPE_HUMAN: + case RACIAL_TYPE_HALFELF: fHeight = 1.6; fDistance = 0.12; break; + case RACIAL_TYPE_ELF: fHeight = 1.45; fDistance = 0.12; break; + case RACIAL_TYPE_GNOME: + case RACIAL_TYPE_HALFLING: fHeight = 1.1; fDistance = 0.075; break; + case RACIAL_TYPE_DWARF: fHeight = 1.2; fDistance = 0.1; break; + case RACIAL_TYPE_HALFORC: fHeight = 1.8; fDistance = 0.13; break; + } + } + location lAboveHead = GetLocationAboveAndInFrontOf(oActivator, fDistance, fHeight); + // emotes + switch (d3()) + { + case 1: AssignCommand(oActivator, ActionSpeakString(sEmote1)); break; + case 2: AssignCommand(oActivator, ActionSpeakString(sEmote2)); break; + case 3: AssignCommand(oActivator, ActionSpeakString(sEmote3));break; + } + // glow red + AssignCommand(oActivator, ActionDoCommand(ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_LIGHT_RED_5), oActivator, 0.15))); + // wait a moment + AssignCommand(oActivator, ActionWait(3.0)); + // puff of smoke above and in front of head + AssignCommand(oActivator, ActionDoCommand(ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SMOKE_PUFF), lAboveHead))); + // if female, turn head to left + if ((GetGender(oActivator) == GENDER_FEMALE) && (GetRacialType(oActivator) != RACIAL_TYPE_DWARF)) + AssignCommand(oActivator, ActionPlayAnimation(ANIMATION_FIREFORGET_HEAD_TURN_LEFT, 1.0, 5.0)); +} + +void EmoteDance(object oPC) +{ + object oRightHand = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,oPC); + object oLeftHand = GetItemInSlot(INVENTORY_SLOT_LEFTHAND,oPC); + + AssignCommand(oPC,ActionUnequipItem(oRightHand)); + AssignCommand(oPC,ActionUnequipItem(oLeftHand)); + + AssignCommand(oPC,ActionPlayAnimation( ANIMATION_FIREFORGET_VICTORY2,1.0)); + AssignCommand(oPC,ActionDoCommand(PlayVoiceChat(VOICE_CHAT_LAUGH,oPC))); + AssignCommand(oPC,ActionPlayAnimation( ANIMATION_LOOPING_TALK_LAUGHING, 2.0, 2.0)); + AssignCommand(oPC,ActionPlayAnimation( ANIMATION_FIREFORGET_VICTORY1,1.0)); + AssignCommand(oPC,ActionPlayAnimation( ANIMATION_FIREFORGET_VICTORY3,2.0)); + AssignCommand(oPC,ActionPlayAnimation( ANIMATION_LOOPING_GET_MID, 3.0, 1.0)); + AssignCommand(oPC,ActionPlayAnimation( ANIMATION_LOOPING_TALK_FORCEFUL,1.0)); + AssignCommand(oPC,ActionPlayAnimation( ANIMATION_FIREFORGET_VICTORY2,1.0)); + AssignCommand(oPC,ActionDoCommand(PlayVoiceChat(VOICE_CHAT_LAUGH,oPC))); + AssignCommand(oPC,ActionPlayAnimation( ANIMATION_LOOPING_TALK_LAUGHING, 2.0, 2.0)); + AssignCommand(oPC,ActionPlayAnimation( ANIMATION_FIREFORGET_VICTORY1,1.0)); + AssignCommand(oPC,ActionPlayAnimation( ANIMATION_FIREFORGET_VICTORY3,2.0)); + AssignCommand(oPC,ActionDoCommand(PlayVoiceChat(VOICE_CHAT_LAUGH,oPC))); + AssignCommand(oPC,ActionPlayAnimation( ANIMATION_LOOPING_GET_MID, 3.0, 1.0)); + AssignCommand(oPC,ActionPlayAnimation( ANIMATION_FIREFORGET_VICTORY2,1.0)); + + AssignCommand(oPC,ActionDoCommand(ActionEquipItem(oLeftHand,INVENTORY_SLOT_LEFTHAND))); + AssignCommand(oPC,ActionDoCommand(ActionEquipItem(oRightHand,INVENTORY_SLOT_RIGHTHAND))); +} + +void SitInNearestChair(object oPC) +{ + object oSit,oRightHand,oLeftHand,oChair,oCouch,oBenchPew,oStool; + float fDistSit;int nth; + // get the closest chair, couch bench or stool + nth = 1;oChair = GetNearestObjectByTag("Chair", oPC,nth); + while(oChair != OBJECT_INVALID && GetSittingCreature(oChair) != OBJECT_INVALID) + {nth++;oChair = GetNearestObjectByTag("Chair", oPC,nth);} + + nth = 1;oCouch = GetNearestObjectByTag("Couch", oPC,nth); + while(oCouch != OBJECT_INVALID && GetSittingCreature(oCouch) != OBJECT_INVALID) + {nth++;oChair = GetNearestObjectByTag("Couch", oPC,nth);} + + nth = 1;oBenchPew = GetNearestObjectByTag("BenchPew", oPC,nth); + while(oBenchPew != OBJECT_INVALID && GetSittingCreature(oBenchPew) != OBJECT_INVALID) + {nth++;oChair = GetNearestObjectByTag("BenchPew", oPC,nth);} + /* 1.27 bug + nth = 1;oStool = GetNearestObjectByTag("Stool", oPC,nth); + while(oStool != OBJECT_INVALID && GetSittingCreature(oStool) != OBJECT_INVALID) + {nth++;oStool = GetNearestObjectByTag("Stool", oPC,nth);} + */ + // get the distance between the user and each object (-1.0 is the result if no + // object is found + float fDistanceChair = GetDistanceToObject(oChair); + float fDistanceBench = GetDistanceToObject(oBenchPew); + float fDistanceCouch = GetDistanceToObject(oCouch); + float fDistanceStool = GetDistanceToObject(oStool); + + // if any of the objects are invalid (not there), change the return value + // to a high number so the distance math can work + if (fDistanceChair == -1.0) + {fDistanceChair =1000.0;} + + if (fDistanceBench == -1.0) + {fDistanceBench = 1000.0;} + + if (fDistanceCouch == -1.0) + {fDistanceCouch = 1000.0;} + + if (fDistanceStool == -1.0) + {fDistanceStool = 1000.0;} + + // find out which object is closest to the PC + if (fDistanceChair6F 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 Wrk*rytkG5w2.0) FloatingTextStringOnCreature("Delay effect created", oUser, FALSE); + DelayCommand( fDelay, ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(iVFX),lEffect)); +} + +void main() +{ + int iDayMusic, iNightMusic, iBattleMusic; + int iEffect = GetLocalInt(OBJECT_SELF, "dmfi_univ_int"); + location lEffect = GetLocalLocation(OBJECT_SELF, "dmfi_univ_location"); + object oUser = OBJECT_SELF; + float fDelay; + float fDuration; + float fBeamDuration; + object oTarget; + + fDelay = GetLocalFloat(oUser, "dmfi_effectdelay"); + fDuration = GetLocalFloat(oUser, "dmfi_effectduration"); + fBeamDuration = GetLocalFloat(oUser, "dmfi_beamduration"); + + if (!GetIsObjectValid(GetLocalObject(oUser, "dmfi_univ_target"))) + oTarget = oUser; + else + oTarget = GetLocalObject(oUser, "dmfi_univ_target"); + switch(iEffect) + { + //SoU/HotU Duration Effects(must have a target) + case 101: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_BIGBYS_CLENCHED_FIST), oTarget, fDuration); break; + case 102: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_BIGBYS_CRUSHING_HAND), oTarget, fDuration); break; + case 103: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_BIGBYS_GRASPING_HAND), oTarget, fDuration); break; + case 104: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_BIGBYS_INTERPOSING_HAND), oTarget, fDuration); break; + case 105: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_ICESKIN), oTarget, fDuration); break; + case 106: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_INFERNO), oTarget, fDuration); break; + case 107: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_PIXIEDUST), oTarget, fDuration); break; + case 108: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY), oTarget, fDuration); break; + case 109: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_FREEZE_ANIMATION), oTarget, fDuration); break; + case 100: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_GHOSTLY_PULSE), oTarget, fDuration); break; + //Magical Duration Effects + case 10: ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_CALTROPS),lEffect, fDuration); break; + case 11: ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_TENTACLE),lEffect, fDuration); break; + case 12: ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_WEB_MASS),lEffect, fDuration); break; + case 13: FnFEffect(oUser, VFX_FNF_GAS_EXPLOSION_MIND,lEffect, fDelay); break; + case 14: FnFEffect(oUser, VFX_FNF_LOS_HOLY_30,lEffect, fDelay); break; + case 15: FnFEffect(oUser, VFX_FNF_LOS_EVIL_30,lEffect, fDelay); break; + case 16: FnFEffect(oUser, VFX_FNF_SMOKE_PUFF,lEffect, fDelay); break; + case 17: FnFEffect(oUser, VFX_FNF_GAS_EXPLOSION_NATURE,lEffect, fDelay); break; + case 18: FnFEffect(oUser, VFX_FNF_DISPEL_DISJUNCTION,lEffect, fDelay); break; + case 19: FnFEffect(oUser, VFX_FNF_GAS_EXPLOSION_EVIL,lEffect, fDelay); break; + //Magical Status Effects (must have a target) + case 21: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_PROT_BARKSKIN), oTarget, fDuration); break; + case 22: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_PROT_GREATER_STONESKIN), oTarget, fDuration); break; + case 23: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_ENTANGLE), oTarget, fDuration); break; + case 24: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_ETHEREAL_VISAGE), oTarget, fDuration); break; + case 25: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_GHOSTLY_VISAGE), oTarget, fDuration); break; + case 26: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_INVISIBILITY), oTarget, fDuration); break; + case 27: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_BARD_SONG), oTarget, fDuration); break; + case 28: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_GLOBE_INVULNERABILITY), oTarget, fDuration); break; + case 29: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_PARALYZED), oTarget, fDuration); break; + case 20: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_PROT_SHADOW_ARMOR), oTarget, fDuration); break; + //Magical Burst Effects + case 31: FnFEffect(oUser, VFX_FNF_FIREBALL,lEffect, fDelay); break; + case 32: FnFEffect(oUser, VFX_FNF_FIRESTORM,lEffect, fDelay); break; + case 33: FnFEffect(oUser, VFX_FNF_HORRID_WILTING,lEffect, fDelay); break; + case 34: FnFEffect(oUser, VFX_FNF_HOWL_WAR_CRY,lEffect, fDelay); break; + case 35: FnFEffect(oUser, VFX_FNF_IMPLOSION,lEffect, fDelay); break; + case 36: FnFEffect(oUser, VFX_FNF_PWKILL,lEffect, fDelay); break; + case 37: FnFEffect(oUser, VFX_FNF_PWSTUN,lEffect, fDelay); break; + case 38: FnFEffect(oUser, VFX_FNF_SOUND_BURST,lEffect, fDelay); break; + case 39: FnFEffect(oUser, VFX_FNF_STRIKE_HOLY,lEffect, fDelay); break; + case 30: FnFEffect(oUser, VFX_FNF_WORD,lEffect, fDelay); break; + //Lighting Effects + case 41: ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_BLACKOUT),lEffect, fDuration); break; + case 42: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_ANTI_LIGHT_10),oTarget, fDuration); break; + case 43: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_LIGHT_BLUE_20),oTarget, fDuration); break; + case 44: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_LIGHT_GREY_20),oTarget, fDuration); break; + case 45: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_LIGHT_ORANGE_20),oTarget, fDuration); break; + case 46: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_LIGHT_PURPLE_20),oTarget, fDuration); break; + case 47: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_LIGHT_RED_20),oTarget, fDuration); break; + case 48: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_LIGHT_WHITE_20),oTarget, fDuration); break; + case 49: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_LIGHT_YELLOW_20),oTarget, fDuration); break; + //Beam Effects + case 50: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBeam(VFX_BEAM_CHAIN, oUser, BODY_NODE_CHEST, FALSE), oTarget, fBeamDuration); break; + case 51: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBeam(VFX_BEAM_COLD, oUser, BODY_NODE_CHEST, FALSE), oTarget, fBeamDuration); break; + case 52: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBeam(VFX_BEAM_EVIL, oUser, BODY_NODE_CHEST, FALSE), oTarget, fBeamDuration); break; + case 53: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBeam(VFX_BEAM_FIRE, oUser, BODY_NODE_CHEST, FALSE), oTarget, fBeamDuration); break; + case 54: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBeam(VFX_BEAM_FIRE_LASH, oUser, BODY_NODE_CHEST, FALSE), oTarget, fBeamDuration); break; + case 55: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBeam(VFX_BEAM_HOLY, oUser, BODY_NODE_CHEST, FALSE), oTarget, fBeamDuration); break; + case 56: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBeam(VFX_BEAM_LIGHTNING, oUser, BODY_NODE_CHEST, FALSE), oTarget, fBeamDuration); break; + case 57: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBeam(VFX_BEAM_MIND, oUser, BODY_NODE_CHEST, FALSE), oTarget, fBeamDuration); break; + case 58: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBeam(VFX_BEAM_ODD, oUser, BODY_NODE_CHEST, FALSE), oTarget, fBeamDuration); break; + case 59: ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBeam(VFX_BEAM_COLD, oUser, BODY_NODE_CHEST, FALSE), oTarget, fBeamDuration); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBeam(VFX_BEAM_EVIL, oUser, BODY_NODE_CHEST, FALSE), oTarget, fBeamDuration); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBeam(VFX_BEAM_FIRE, oUser, BODY_NODE_CHEST, FALSE), oTarget, fBeamDuration); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBeam(VFX_BEAM_FIRE_LASH, oUser, BODY_NODE_CHEST, FALSE), oTarget, fBeamDuration); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBeam(VFX_BEAM_HOLY, oUser, BODY_NODE_CHEST, FALSE), oTarget, fBeamDuration); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBeam(VFX_BEAM_LIGHTNING, oUser, BODY_NODE_CHEST, FALSE), oTarget, fBeamDuration); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBeam(VFX_BEAM_MIND, oUser, BODY_NODE_CHEST, FALSE), oTarget, fBeamDuration); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBeam(VFX_BEAM_ODD, oUser, BODY_NODE_CHEST, FALSE), oTarget, fBeamDuration); break; + + //Environmental Effects + case 60: FnFEffect(oUser, VFX_FNF_NATURES_BALANCE,lEffect, fDelay);break; + case 61: FXWand_Lightning(oTarget, lEffect); break; + case 62: FXWand_Firestorm(oTarget); break; + case 63: FXWand_Earthquake(oTarget); break; + case 64: FnFEffect(oUser, VFX_FNF_ICESTORM,lEffect, fDelay); break; + case 65: FnFEffect(oUser, VFX_FNF_SUNBEAM,lEffect, fDelay); break; + case 66: SetWeather(GetArea(oUser), WEATHER_CLEAR); break; + case 67: SetWeather(GetArea(oUser), WEATHER_RAIN); break; + case 68: SetWeather(GetArea(oUser), WEATHER_SNOW); break; + case 69: SetWeather(GetArea(oUser), WEATHER_USE_AREA_SETTINGS); break; + //Summon Effects + case 71: FnFEffect(oUser, VFX_FNF_SUMMON_MONSTER_1,lEffect, fDelay); break; + case 72: FnFEffect(oUser, VFX_FNF_SUMMON_MONSTER_2,lEffect, fDelay); break; + case 73: FnFEffect(oUser, VFX_FNF_SUMMON_MONSTER_3,lEffect, fDelay); break; + case 74: FnFEffect(oUser, VFX_FNF_SUMMON_CELESTIAL,lEffect, fDelay); break; + case 75: FnFEffect(oUser, VFX_FNF_SUMMONDRAGON,lEffect, fDelay); break; + case 76: FnFEffect(oUser, VFX_FNF_SUMMON_EPIC_UNDEAD,lEffect, fDelay); break; + case 77: FnFEffect(oUser, VFX_FNF_SUMMON_GATE,lEffect, fDelay); break; + case 78: FnFEffect(oUser, VFX_FNF_SUMMON_UNDEAD,lEffect, fDelay); break; + case 79: FnFEffect(oUser, VFX_FNF_UNDEAD_DRAGON,lEffect, fDelay); break; + case 70: FnFEffect(oUser, VFX_FNF_WAIL_O_BANSHEES,lEffect, fDelay); break; + //SoU/HotU Effects + case 80: ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(322), oTarget, fDuration); break; + case 81: ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(132), oTarget, fDuration); break; + case 82: ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(133), oTarget, fDuration); break; + case 83: ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(136), oTarget, fDuration); break; + case 84: ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(137), oTarget, fDuration); break; + case 85: FnFEffect(oUser, VFX_FNF_DEMON_HAND,lEffect, fDelay); break; + case 86: FnFEffect(oUser, VFX_FNF_ELECTRIC_EXPLOSION,lEffect, fDelay); break; + case 87: FnFEffect(oUser, VFX_FNF_GREATER_RUIN,lEffect, fDelay); break; + case 88: FnFEffect(oUser, VFX_FNF_MYSTICAL_EXPLOSION,lEffect, fDelay); break; + case 89: FnFEffect(oUser, VFX_FNF_SWINGING_BLADE,lEffect, fDelay); break; + //Settings + case 91: + SetLocalString(oUser, "EffectSetting", "dmfi_effectduration"); + CreateSetting(oUser); + break; + case 92: + SetLocalString(oUser, "EffectSetting", "dmfi_effectdelay"); + CreateSetting(oUser); + break; + case 93: + SetLocalString(oUser, "EffectSetting", "dmfi_beamduration"); + CreateSetting(oUser); + break; + case 94: //Change Day Music + iDayMusic = MusicBackgroundGetDayTrack(GetArea(oUser)) + 1; + if (iDayMusic > 33) iDayMusic = 49; + if (iDayMusic > 55) iDayMusic = 1; + MusicBackgroundStop(GetArea(oUser)); + MusicBackgroundChangeDay(GetArea(oUser), iDayMusic); + MusicBackgroundPlay(GetArea(oUser)); + break; + case 95: //Change Night Music + iNightMusic = MusicBackgroundGetDayTrack(GetArea(oUser)) + 1; + if (iNightMusic > 33) iNightMusic = 49; + if (iNightMusic > 55) iNightMusic = 1; + MusicBackgroundStop(GetArea(oUser)); + MusicBackgroundChangeNight(GetArea(oUser), iNightMusic); + MusicBackgroundPlay(GetArea(oUser)); + break; + case 96: //Play Background Music + MusicBackgroundPlay(GetArea(oUser)); + break; + case 97: //Stop Background Music + MusicBackgroundStop(GetArea(oUser)); + break; + case 98: //Change and Play Battle Music + iBattleMusic = MusicBackgroundGetBattleTrack(GetArea(oUser)) + 1; + if (iBattleMusic < 34 || iBattleMusic > 48) iBattleMusic = 34; + MusicBattleStop(GetArea(oUser)); + MusicBattleChange(GetArea(oUser), iBattleMusic); + MusicBattlePlay(GetArea(oUser)); + break; + case 99: //Stop Battle Music + MusicBattleStop(GetArea(oUser)); + break; + + default: break; + } + DeleteLocalObject(oUser, "EffectTarget"); + return; +} diff --git a/gamma_age_v2/dmfi_xp.uti b/gamma_age_v2/dmfi_xp.uti new file mode 100644 index 0000000000000000000000000000000000000000..384f1c86d609ad7b46d3cc1465af0f49f62cad94 GIT binary patch literal 1183 zcmZ8g%We}f6gAND2<2U%NGvR|pll*&g~WmdX(L3W7KJ7hcF4)xB%^x9qp?F6g!&u& z5}&}|z&SHcNx9OQ`>^l19?R$Bu&0lA+dHq6QWt?f@Cf*Eq467+lzNJIcTK4T^`G!p z;s3zk)LnjH?|>`7btci);nAwLfDM5B>}3pEwH;$ns@FgZV9yqtV3!-GxK3{N(8$3p z z(H_7jF@6aD65v1bKAwPcC|O}mkR$O&GEr*Jc}e z4Bt=p@NG|j?(0t`PxwAo*GcgEzuGV49c$gf>&ne_aC(}46+Lw>(G!tmgsWy1i>1aZ zsHF6IROukrrukHdnPhq~Lt!SIoBEm{Z)@Gr(^5=8x3i@1GgC;tk36U>Oquw);6r6a zyGcC(6?E}5Ha(Gct95$X+N*R|G6`ks=3Z}SKDbhh)Ly(AM78m1 vC0_OnVSR3GsyoWB(11^Cp;2O9AZUMd**5&zoJ=Wj1 JALstR*A_Tq7LWh{ literal 0 HcmV?d00001 diff --git a/gamma_age_v2/encounterpalcus.itp b/gamma_age_v2/encounterpalcus.itp new file mode 100644 index 0000000000000000000000000000000000000000..ac6085addc260cff443e4955283a4769abe64c8e GIT binary patch literal 680 zcmZ{i&q@Me6veM*S(>HhKSF5A7Oq6pg-Zhy2UJ7{@j-m2$X=vvd*3C`p}FH(FJrIA=J26;9^-Lvmh%&)>oYN^;iGYV|%zUM(D-Jl!l@M@pEH ud3-i|axdHg_sQMmpghEHrvTkS+zJ2p62z50KoyAbY7l$;*PDIL%{T%GK^F)B literal 0 HcmV?d00001 diff --git a/gamma_age_v2/encroach.utc b/gamma_age_v2/encroach.utc new file mode 100644 index 0000000000000000000000000000000000000000..e2b625a23fbdebd7f1180de592cf824510239429 GIT binary patch literal 4794 zcmeH~OM4VW6oy+aiW)8g-fvt51Thj+P(&s(lVl)-aV8M2j5R%#q)AWr&|Q-d?{`tW zEnMl!E&K)lf;)Hq0e^v8{l4m|$zj6-3wNC7`MTayRb5?us=DUP+3E7Ob0Y^29SMTq zH1y}{AovO8&-Vnu1j?-&gW%*HL2!N(7-e=J>QVj+Lvv8(1;!H9)+&Olg2x1p3+8kD zy*0rn1)mZ;DVTHi_f82uBe*X3HNg$RO~KQG&k8;#ct-H+g5MDQrr@^(zb*J3!RH0H z1ivd-32qAx1$P8%!Lx$r1kVeO1YZ!mAUGD>6`Tl81@{DB6r2gp1slPA!Ha^I1YZ)o zEciXa?+gAw@P~pw68y2?PXvD|_%p$u3;sgzmx8|%{I%fAg1-^`tz+)*D~?y896|+4 z?))F@mAoqW(eb@>h4KD}p&^L(-R*ca%H6JR4a(nmfvqhHTi)rI_uU2k0&$#m&`}7- zgdMMnlFy~jZ;a;WVdo5=^PsIS3fp%BnBO7q!%-9P8{;%^+*l*y$g#$8Hbb00ZA($u z>sG<{3w}WGgMuFt%-HZ7=CdAwF1vvr1^ah+4D9FeIG8b@Jppm}WfR!nW-M^O@|oOEA}j_p$ydh(_LHso=eiS?q%jIsa+LT%Y~WwX0W;bF2f9w`Tx+ zFX|w~bBg>dwBUFcCBGlmKL=fL%;)^-cm(A&$A?k=?)Z6>e>i>tpeJnZ;Y@L|U%z{kL}62$m(ZAPKpuD%TR zb|dD#qur=a(c|X({2yc9>KtzOzxnmL9jjZ5758@q+Kz9H=T8;l*~)Wl4B{uq?|mHF z2gmbK@U-ssVr6tg=M6oJ-vzW^EyclTMDbEnaNaSYMsKb=se7#o{3UsG?sGWf^VT0tJIkZuots8w26L*b za6!%KprS*yJRJ?<-!vk)7@?w>k*yfwwc>yaYh}qwYmFLxp1Da9sLIeB3S57I@ z&s1FUL7#|BJ&h9MM=AHSOebbgeOg@_FvrOBY&%W*zI(6~#j&iIMeL+Mo~E7ZV&tM3 z1e0oMwjX1bsfj|22a02z%xO##VG7EPQs+WHAG{=@8*00q8VbFFrrli=*rTS6pgaFe zGR5)mmPLEBr{lQ9K?=WQ4C1e`M+?8Ax>yWuS?5PN!qP@f;a8JRgBxX~UB&5KUyQGo zighXa<7+c^I6vNCKNRg}bDdT6Y?SE2Ka-5cshv=B0Rf!E<1rW7815AA;CuFUc(bt7 zj$-V3TUCx#p8H1JU%l9mdaat#-J-ItVr`5bd{5=H+r|3YXYqolE({z1pD%qozNjdk zrx&$bQTx1}?jQoT*E*eqS*pT$CW-u`%fpJsq^j!Ln4row-_APEzAt@in=Tz{b@Xg& z-mm=zSJ5lBh;Pri_92e7jjmm}#rJ-ibnNo`8{ikq?<;WRg=x2~%z8IMnuIvEhMbr8 zu=u_yvn%hXf}yzb-tA-AF=an)nzY@jtm3ab#I2YKwBYZ_sr^<&2xd6z4Moa z**ddyX6MYxnT>CQwnIChozO05H^i)Z540Cz_ROq#KXd?Mc6<hDDI-- zzAO3-eD=X}`~-dhpM3Ni=>OkcHMtz$@f@_y`A_}st?ugT+qbK$W~7>5b8OF!-S;Y` zjzI?(D)l4kl}nU5jQW@5N||{|ZM{LMNz~_8DCML63kA(8&mR=laHpjpxL0tW;C{ga zf{TI=3FcT_|AT^$2p$qVEVv~2sNk~Tir}i?5y6a)8^fsJFBYy^)Bo)A1K*b{tG@RVR*a8qy~I27Cxd`fU6I2N1;ZVR3kJR|tD z;90>>34U7eGlHKL{G8zD1)mZ8g5Vbgza;o&!Dj`(BKTFo=LEkd_;t(7xi>81^;ApX zSb&0JByHmHG}9Or_2!^}S7b;`;PDRm>*UF#;{zghTK3I8o%cimgT z=WNHff!#Q62Xl-pygu)N#} zyv_y7dr)7rychLPmYEm7TD}MMZdnryw?5DGCVxy!UGTs`2fUs ziToh6-SR_VzE|`=43#V&1Rn>p#HPG9cp{#*C^|8?iqWsJp@ z{@giN7ofFx*T}sP=X#bt$i9NAA58z1ddwo++W^Gx)&i&q@qRhi9fH;)5RUf>?iD-& zu9{}c*NG{cxNOFiD(kwz>7CN&MR78uo6b3?FELfF)iOHLLEVg1XIn<~o1kH$&grT& zX@W3eOIAu@ltkJ~ijB-Jn7AH!t;7q1)KS$F_QHA|4wuTw}6SwdV^{Rl;`AsF~Hi422~VH48>3ld0VkHfDRoJy#MPB^Xml*QfM^ zQ3X@ivsJGX|4Jf)iyjJwE8@9=c+D9gjOP-2)Z^-VuH+~6oBhqFXm;p5SPbTSo(0LFgx$F^Wo0wxtixA z>r+?W*KzC`aenWqw$~afCZ?G=OWHR{Vmj|rK5RDeeA8?32T`5s7yw>h+G!+(BenZ{ zJz+B-wey%nOf+bwjh~K39G{JkEtxYNU&}NQvDC5HM2(3s;PRV)OJD}e-1zNHTez^6 zEo|nZl|C{z9@&w!(z5*Y?y-g$ADeVpvdlVKSu(lym|0TC*t=}IwrS$*FleNS;!c2_ zC5m%ka;%5VnogG59>SoG32uqC;ug}xHAQKTxS^mc=7=-fNDvI!^&18?n;*EL<-yFD zmyFdTGt-J&-MjYv!_g&==-#!zD+_8X3USAYm%jXrEI*$7xGaPgL5v+2yo@I|XI%L5 zBeMkJ#)TgsE|~cYxDe&XX$7~sCwnN-}?0|Mc++=Wbu^ZY0?S;5`;HH6_1#S|!IpC&%n*nYD zxcKLypNsv2P!8&W-h|$Q-iF?R-i6LX??LZFA3ztN5225skD*VXPodAC&!I1%FQKoX zuc2?CZ=nHb9yA~Nug5u$7!;shs1M=-&c%m|8y4ms7dMBYLFfoH1Pwzah_O5hF<;A2 J1*$?L(BF7GDN}>L?dRxy%`sS6MJmgJqI}DL3kwc zOz{7`%$RGGl0H}UR#n}q^3QJ6INjO$x~G(y1Q%cf>_1d$8Tw{IDS_U`;x+VN=o#o+ z2$Xum59AO$ww6+H&Hm%D6ebPoawF_u7pC)()c;*;T9yw*#8S~es z%i@Wjr@yCwF(^Dwp}%?_j1lBTFrZ%oo_*zk8s#|W?bpzZL1A>}$GEc~yaV^zM}nRQ zK^9=}jl#X_K0~hm(`UHbzxrg}i-7OK{FZXb(OT!Gur#c;mF&oaE8 zAE92QjQjbZ2x)%8O13lZ1J>+!yQML{3Y#W0bKPc>yUpXhn6kp=VDYk9C&3h8Q?l^s zgN?yLVY9KxSb!`ZHq;te2lUT`Sd?sq zA@RT?oU>Uc?v8XaXFT@otg~}IcbknbuV1abRZ5)zHi4JG`;!y@b51FPcxzs%AMn56 zv84XN;L5!hNGe0RtaAnaB7ia~@KfM#s&&>#fb#&)>;kmY6IVXt3^;qDot?O{-Z}8F z&hs?Zi~HcS!=6jrP}ybpKNVkyID7nCtzV7!wTNGj_#*gkfOZ3rk|}i)KJ;-5JoIoI zobOM&0|b6I;`btcA3WHDK;Rz&d{^2dAn*n_?}hdlU>~$60Q;al1;Y9gcvxQs5BL5I zocGSVSpkAQ2YCnZzFz=+pey+}(_T_3QrTB(Ll@HYk|R}G%l33;zDs{c=e(ayDSFO~ zy|JS*&$!u_kvIEBP_U~9lY`Z7GSqG$#dIyPg`Wl>9d9$4lq#1yUiS_nzHbag=X6I~M1S6fMIqp{+CVUYeWL zAC}lW$JZ48KD8j9h6 fiUUP~Vn7jS033P_J701MSOz%E9AXYHhnDsqCLsMC literal 0 HcmV?d00001 diff --git a/gamma_age_v2/exterminator.utc b/gamma_age_v2/exterminator.utc new file mode 100644 index 0000000000000000000000000000000000000000..3a55f8d9111f60a6580efd1ec9e3cb2c1c1ccdd3 GIT binary patch literal 5779 zcmeI0S(h8d8HNiC2_eQd;IM?v1_K6+8OBZmaUj+*ni1A$gd~rhu!xdWGt*3~TXdIZ zNkSkb5W*Ig>|w!=2!2#>Pw-=cwcx&B_Qkh96l?^q2woMuCO8oMxZricq2Q6=NN_B8Ecgk* ziQrVQ6+98VA$U{pmf&r{-w^yw!QT@6q~LE0eoFAug1;m98NuHb{5`?X3Vu%T_XR&M z_y>Yt5d5Oxmju5o_!YrF6#S~-*95;V_zl5768vMqKN0*>!9NrHbHTq5{7b>V68vky zZwmg6;NJ@Vo#5X)X57Ce_-)7MBMni=lxD%ZkkbDU;&uG}L&4{(KRW&_i-fW6#SoT# zcKs!e+1{Nl?*gQsf@l}!NtXIN-uKf`uqSWlBJjNs+x-kQ2l2l2yAaLygV*xjd7qWy z{b{U==G1A&dy#$(Vqf+_H1eex<$cGNrS5hHYf^P$RyWIoQJ0RcY z5y6~u?jy9Lkgs!>;2FUjZ(nB?d<>#7<=oSbL!3|A7a-4H1p7Gn5|}Z^_~JW>@kC=B zaU5CpW$0taCj@^*@O@w!>))SI&R=!Rqxo&dF=zxpB&b|&EcKHv1y`AHH zB+iY)xpDY^!~oxk4@3WeJRiim$x_2&=J((d+ITW%arvs#5TBB z^r0FGJTD7g0e8)49BOOYCT*J)>?e9)a7kgcAW3agk9=lBf5KIz@!04@M+4LAZjX(c zH_^}}#pSBCW}?`#B)3+a*hB}mKFs~9Ne4+Vwn5BY75&kxd4c<_#L>Gn*E*$qSdt5G@CB3tAkLusuNG5VaM27 zkhjd3 zK$!ne_-8PN(kg3Qol`rb!}T`SpU-J(J4tj{@G-DdM1lt<5R3}@_7<$|WLGJvesLA&5lzDk)Y{Ia_MsmMoE#lo^K6AgSM+kmy z5zY@%3`-w5xjz>T+gzB_avjF26Vblj%;zPqkKN5?&H46<^_Q2QPEArZD?wy(e<>=5 zan>P3P8c?Dd-R1?!?$xas z<&|1GG}fA8KdZ!}5#~F)H-9k7TxNx_KZOIx?k6(x`{?HS*>i-7WJ2P$YCrj z>)+T6F@jm%ZnK3AZWKh?#>utFx=No{90qp7pA+T$!1jM0k^fT18wbXh(b?JF{8D3X zab||gEVq4Iv%R5N>8<(j+2bV@Wcdvmsv)4h_ zLp;VFfDS@8LN`H&pqn8cM{k7=Lp*lg4&4DAf$oHkLU%!Y0B*0G>toPyh{r-62YC$S z@$X)U$GsB}k9YS$_d`6!orFqI8RFJhh2|h0$L660h{vu6pi@u-T7;U=62#*Zk49(#D)c?WtIdJlRZ`T%14jNNnN|G&qdW8>!lm>I{6^TCvJ!q}Db F@?Wy>qW=H@ literal 0 HcmV?d00001 diff --git a/gamma_age_v2/exterminator2.utc b/gamma_age_v2/exterminator2.utc new file mode 100644 index 0000000000000000000000000000000000000000..6c4648cc028c0da329506635fbd38721ef38ebd6 GIT binary patch literal 5016 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 QpZ?35qgrTOFRnlBUxNgBi2wiq literal 0 HcmV?d00001 diff --git a/gamma_age_v2/felf.utc b/gamma_age_v2/felf.utc new file mode 100644 index 0000000000000000000000000000000000000000..1887d29bab2e25913ceef9d71e9e8408bb2c5599 GIT binary patch literal 5512 zcmeI0S$o?=6o!Y=vXm~+vX!+fEv0l{QYa9|PMQ?gF}B-4OL52cI8h@@t|TW7J7wSZ zeJeY6`~#l;0Qd)7aL;{RagKAxb$g!Y%X!btXfztljC^val3jUt$L8&QN~r?$ z>xD{v4}bPDr5=JmbA?iyE>P;HWlFW-_g$$}9{yh#s?`zxft4W?$5s)1Nbq67V}kD& z{D5HgZTmbb_(8$P1arK$eO2&r!CG)la9waiuo2u8JT7=bup{_{;7P%*;Fe%durIhR z_@v-Ka40wu+z~t_cv|o&!83v%7W|0dM+HA7_;JBc2!2xVQ-V(mep>J|f}a)qoZ#mL zzaaQU!7mAZS@0`@UlshC;MWDeA^1(fZ>7vN_m1Fq1-~cweZe0H{!s8of8 zrBDXqeHkBwXm%XD*4~@tiy`*Uwo4%HZSqp+IK;7B4$;Usj$&g!IFfJ@vwW54Q%DmTgqWpTWZGVH{8wKAa_-4T?1+NmkTJRdMwY30yuXTcN z5xidT2En(2t!=abe;Z``+$8vRFyAF@Gi2Lr5xiCKHo@D$d{?v`kma3%?Ydx_-J*O? z%3N1{5a*k=H*t#V@eYXZgM6ppeS+@-)7a+jm=eAxWx9T-L4aiv7q8iYn9ufe4B51t zE(dYFQiBk$B@aP7XUY4a(Dp$M@p6qQ_%z|73k{$^@ad z4MxJEJZjaDuCr<+mtK%_LLIbp%}sAu?$iSLNIBy~Gq!X1F~=JZs|7QimQ}RlicppP zj@KxgXvj%=EV_OqE>|PrNUMcs(r!{Z;zcG1I_)SOLf-c+#tjO7(FCoW(a}U45BQCl z0rAY`NCy$dRMhoJJ#H{Rbv;vYy7Qk2aJM4bR7*qXTJicg%*WwuTq;jEn9|w$xp8H} z8K0P~FU^UI#+`D)+4_nfgudu+z_^@SpOkTF2tyV1`8jcEz^R+|?DhFMF~;wA zTv0zKE)8oBYp8qwd=iWGIBax7WqsEVs^v+}1ucn(wUe&VB(CTv@_qg`kuiUtlq0d2 z5$DV){GBzd&)EQk_umtbVGgBbC$tRJn06;i*nhULprcNp-Hcu2!%kH69WS!IWII7% zyr^4zP@n2D`v^?4=6fC6TunQ!D+`)ft1{m2`;EaVCtbbB&GmG%<6@M4LCiUgEaor3%N#aZt zVZ9r?&m_+278XB`h%|OWOiK+VNj&H^O5B*U_1g8vJEDI*oxGQ%Jx;eM?#}kt-G52_ zq0j_5({wzO#G~GT>&FAa%5mL1ZjZ6h@RVHUT^mAAqFOQTRs!t#YTMw+>zSJ4;uMOD zvaSw8TZ#5@EILT)&6G*s(BR3A)2@z0rj=Y&)UJsl(>?#PeyfG`(d}V=)3{A0DEx;@ z`W=XWyt1M1nSjZWtmBnT$XI6Cwp|jKYJI9&PcLOPZHYHst#7Y3OjCE+X&qTZGvuxHbYyWtq{*Jo?APhoe=XU=1t6(`k=iK z^CIR$%!8Q!Fz;c$(+_2!0f^^M4jP1*w=iEBhM1omfbNCz&_SpGjY36;`9%qO8#)7h n0euO51APm92Ym&74fR78K=Yt;b-uZV{_mXQlGr$RoPXMX){uK& literal 0 HcmV?d00001 diff --git a/gamma_age_v2/felgon.utc b/gamma_age_v2/felgon.utc new file mode 100644 index 0000000000000000000000000000000000000000..7c62738b377a99531d8e2a901bd8a61b871e13e7 GIT binary patch literal 6076 zcmeI0*_Ra69mlT-xC93jmn=rMaYq~nLQsj)bWhK;3`5gB!w4$P?e056In`B7RW$>N zi5nP`s3D2_zVG{j`ofvAFXO3tumMMEC~bW#JozSA9%@;59Q)<~p6@8@jM*aF$Jj07 z4k)v-Dy?T*cgHQqLEPI0obZufg^@z~aWiV|h$Ee$>YS7Ve8>RSjF8i<)Z_ z$1)GF(2q|o8#|U?^<&$fZ);Xqj=SZgt|^7(xm!-@8s>@cAHdype+a+Xp7=*_ckNT* z94`y6@9yC=xVz5x?C1%$Tz*&Z>02E`f8c;dAH}emb1*F#FE{Ec7!|%ls_s ztj-4gwtbFuKA&^bzJ)oCVQK2wpYu?0%w!qh`c6L|80&qgx$dz40<*1*q zz5?}r>zo&yi#&EE_?z{gqW;?YD%9UvzYsM)p4|T;(1VG>xo|OHp|1vfpXomXORZl5 z=ey1ROTjhP*TDIHvg82c&u6n1EU^7~xGUeaySe*aU-!RtzlX1T;I|=T@xT7ux#kzZ zBD`z#0q_sNQUvxDRD)^H;eGzo_}paU_3ts{`sd<&c%MV(7~?Yw3<3UzI1-cqe`oN! za~W8IN$Grr@B!gt@KMuh`#Lcd6IaZHQWf1WIJ{emUKA%Iy5%~D^+8RQYqyP#bkH!h z(cNvM22Id3QTK3F-fn_0;g+nF!zhWgmz0`WyI|r*2|NzySmPEL}sEM1|7G%n)ZBO zc1$34vOO4v&4HbsjV69i>*x9ttV2+xPR%(hqC#`kkPN!HFK3F2=sN3(W8x9~7HWo_Gw5tcf7 zvi3mGtZvLnu~r?cmh?T@!DNl)j_*PRd9_OaMR1vB9VCTnj9*7{*Opz0I? zIE>3+oRNfOh2pYma= zh3A`Ii+>Q+scr+p>&tc;NzswEi@u(;Gazl}v51&x*z7cZIv%lqHa>32I@9sBO%oAI zJ7!N9e=-c13i01mSi!Px{4J(ixCqKE+{^@mee~G?dk%{CWZtg+TGLF_w!2x{Z} zWOCbM&XNYkKG$y7cAB_$7&Oy~;toJNn<%aWi(?~f)pc^5Jwq5Yu)xi+t+lX>Stum~&$OF%C;9h?Eq1ZM%}iRXZG!BW6Ha2Yrs^a191{a`s* z0hq@ze`DUpe2sY;^E2jU%*U9AG5=!TwFczCT5t=v72F1X5B7mSfIosif!o0y;7)KC zxEtI9?gjUO`@sX?LGTcG7(4hyanC{?|^r~d*FTW0r(Jn1U?3zfIovFa0HkE{@FjQ-zj>#Wngrd7>6 zqHNn#OkY>-bu-hiY$=t?q~6MyNf_^k>#4zX&+V5nI{YEuq24obhT~mrrg03{IuE`X zp&8G1;Qqx(x@9T4YSxW7C&^}$4*cgiUN4OB|BS^>m1S!ndZW@DkSf!Vk$Y8DS0bPc=$^v~jC zR&2y2z{X?IvDjE-{J`A-cfmbyA3OldpaUKP-tsYc0#?9N@C-Z$FTg5z37F^cy#D|R CMvtxl literal 0 HcmV?d00001 diff --git a/gamma_age_v2/fen.utc b/gamma_age_v2/fen.utc new file mode 100644 index 0000000000000000000000000000000000000000..bff5ac5af10199a927c34fce39baf7ea29011720 GIT binary patch literal 5189 zcmeH~OOqT&5yu;3VQlN+hcHh=*_J`J*K4s7Sbzb|&g@EK)~oT($^vXy*L2s+l((mA z)K$H!HBa;OJHlVVU%^){9DMc3M}jXvaNtS=0snt@^=#^7Ux`pgQhN_^u8pyi1xn_Tu!?D zfw0AJEj__&g4YGpcWZxHa9{8yMlAUGr@&mCwMOS zy5Lf<7aRmvg7*aP3%()vK=3Pqem`1-}vb(`b)j@w2@f`gR<@3#}CHkK3WgptQX$@)5LO7GoVSj+k2L z=U(UsycvQcXCbE+lq8=6N0a1!G5&cm{sl4qMeqic&-xPdwdk0+Y2)|`n6XkGfVOk{ zs^G7ITN@R}nac;E^i6rFX%goCVdxT+d|L1$g1-)?(B>O8HGC#An@6E5vHuv_49fTO zcr(^v417*2PXHJ{bs2gQi6!%WJ{S2c_@&6-1YeKL=e!#E9QfVH=fUqq{ucQC$lnJ4 zHS$y74$=`>biTnfbQsf_k&qlroz5u3l zpj^9LW2?}+m`q5wX+D+_&d1tBlTYlE`KEl*7#iza_P6rz|FH&m=JcRE54qjepxl34 z_v_G;7~D3qd9H)mGJea9lVnS$2A3AHZc86F^{gG-&^L9H&U|iksf*O?Y#+=`a>*2# z;m1Ri!PFEk@Jb^CSB6sC(B}aO=^3Avb{?!N>i)K#)NT9Ib;X`3y>1QqejvANvaVBJ z>T{lyp7pw%=}{gZIIKpcoKnx&!0(V&uGwPZcQy^bSt#4u=AxSnT~%a56V`3xagaNH z0xhKP`?DG5r1NH|Uj$Q@)jY%yHk@m*HrR9nQ_gxuhiTnkb=kqHnDa2`G9adbPIvXh zAU~--*tU!O4}(Z9JoF5|unq);!s_c`gUW$erw8axPojvoV|aCeZui zDo2zq*cARid2Wh{L6AsO(%tH0FIRpsNn|%Q^>W(Muu6vY>bi_I8b(NZ>|ZH1=?}AP zt`FxX&pUL|^gAIS{|0Nc>G$*uFM~@q_N_-+Mi^=OYelxjg>raZ=WbF7|9Zc9FO5BR zTd3W&{ub+@xqj7~vS-G&FirnTv6{O&py4hOxPiwb7RoyA6y3#sZpSdQv@^0fR((Cx z&9(RKMclu3y|VM2elW9UaG-M&f?4dRuA9y9e(PuP2U*=+bO5zKG0^xodnUfY+W*{S zm~m}&WNeE2K&(;Yr$K!-t($_Md2*Qc|ACDh`zQL_Q={NTS+6vHvElOEP7vghn(5*R zZ(lK)8e2bIQu|YzPSrlvG;Bw%3d$8~Md9U*MhCDdJWSvUqq#1!Wz`RAs=XSyFjaYl zqXCb|)C4(iXr>QTX=d8u9(o(YIX1k)GFH`G1*cZdtEsC>PhVc)tSfw8rHD@XUEDR( zy9UGU6pB6TEe@+D46Gpdsy!|%WW=k~VYR2Bj-v8LVexa41u9D} zboE1#_i0dPu%=A;sM7VWS*ow3cr|{ivHGUmhkQ*Af#kYGXJpH)wi+V>y^qN4xX#H0 zN6SP_3^G@`YBF6`N3aNx39f}&?!K|IlbP`jLTGmMi8wHCHhz2Eb4RE6vpN~CH^G^# z?YknYH+6dh`pu?p2k=LRJdJcX9zD1s#h=l!*zGl$`i2dA#0$1G6Z5J=3M98gQ zSB&Cb#)OVzAx}zJ`+ZmPe5s2je(ZAMw?U6WSpf3mnFR$4z4lN17?_3J2`E3xxr11! z-3#R=I|XGS#sZ9m7Yi;HS}d?wSh1jDA;kiUg_D9l2z?0pF!VI^5hx2F7CtO^Sm?08 zc^tX~Wg)W+eG{ei literal 0 HcmV?d00001 diff --git a/gamma_age_v2/fengreatsword.uti b/gamma_age_v2/fengreatsword.uti new file mode 100644 index 0000000000000000000000000000000000000000..84b2bebcf550387ce31954cf01fffbb82b62e9c9 GIT binary patch literal 806 zcmZ8f*-FDe6dm_{_gRV`AlmvM=!>SPfhwV`f(XLU+}2={DanZ75BWd-ke-uFV(W#I zyUg9fJr8}q@z^?Qo++hffHtrXoWh~Dvr4@{e?te*hjU8JL;paaikvkXP8OiqX9HLV zP^LDWjZ$^&Z1%VSRsq)B0+hv46*HD#ht6Min*CM)&Y-ZK!hVx`aCVi$T`J)&&(7JJ zu(zGf*p7Rr+6B%5&e;Q=fW9Q-SX=2z-j$(JS2`EpN`j|CI%c5b=u^Ubod_ar$p=|9 zwvkDTclv%Psf~t_;0OD9R2I6g_o}mzR*l^Pk@;{U9@A$!sKfC*r1oj>TH>+peK!k_3P2 zJaA(u=_nIz^AD4S2Z(3qB@zMDTIJ zCj_(aq|Z}=PYXUHnBz_AR|MZDSPQNSt_iLSHiAb5j|m!KvQULP~>b%V&i5uDV&N$|~rZxMW};MIcH2wp3gbD!9HKyt4Q zf;S4jP4Fhcd?$%*P5|i^DCu*n;B8>eC2c#D)Y&0;r{Gl;;?g`^9P_}vP=@AVU+^p&hL|SIvms%g zGYS7D_*cPy3jRZIRrLRt$p2k1_kPkp&r^==7}OK*S$+=>#C#mw3+DNA0^)azV?7D+ zEM?nM&;aVtPD30&%g#Vu$S<2l)7F708oy}p@hs|^K~dYXmgfg~-AFQXy2DkeX47a- zJ2g`&PdAM^Xq>w7+RasA+&FH)lE@0K7kJtV2IB)YWBi(DH3Q4#DT(puv8ZBvO}oyd z@qC?B81xJBs8v~AW6>bbTw2ERwb#&9JHBD5RrTZ}WsDU}M^(e?h~QvLi?jTKu_rBmro8NWzAO6cGd3rp-GAQHCZu1?VyL1#H_I>fSvAv~X`h?r zWBhK*7Ui@2;(&IrhT8YfMZQ>%14h?X+O=J;Qkvjg&?0|8Tk#r={IU)L*X3^$>36{| z1!6J7&zSSL&KTC`j03{^@9;-3htksHTDodP+Y?3Xza%rSgO;c5RIen_llyhd)pqDC!M3U@Q69=E|FkNqJh&;Ia~QF*CpY&*qH zB0m)bSnme!Gx9UKfyK`wBK9pG(^5rFfq!9H(UvvN>__cqGf%_P_ELB0p)f#50xJWTh5&!6vjN&Qzt=RjHd%-LivS zoo-jBTkUlBbh>*x-JVXjyVKphl*0+fQt_L3^_|7K)7{tU*28Cs8dvQJF1pY-Rs0h3 zi#iXQ4=sQgxpFEPsq#z8U)YPF#n2LnUtLb$GH5xp0$K?%l4JzA3gYWvWWorMks%{O zMuLn08TqY-)VtR^WuSg23o&vTfEcM9f(}DD=m?aDhM)p;6e>b* rKo_7-q0gW%p|7B?q0gZ&pk8PWG#9#9=bLNj|IRs@gvPn!{L}sg(>8q% literal 0 HcmV?d00001 diff --git a/gamma_age_v2/fhalfelf.utc b/gamma_age_v2/fhalfelf.utc new file mode 100644 index 0000000000000000000000000000000000000000..5f165a5a791e6a0ad9ff780c97737f9e7dc773ba GIT binary patch literal 5468 zcmeI0S(g(<6vqn$K}AqN#GO?UkY#3o!F4jp3=;^Mm;{E^SV<}~&2+j$cV~ui-}eRg zeP50begj{8^!N?@2A-pj>hVqg|6Y=tIX?If_niOK?^adcuCA`C&YdIW^tz+{JNgEd zQaR|SOO*N+<@qa=dH`kXYNZAjDD~Y+Fv_*7mCB&}2Zm;Kf`4Eo2-TsL1s@T7RPco0 zV}g$hX6z*9Nx`QCpBBvVCjBdd9~7(wR|VGu*99BF4Z)LwrvzJq&j_9tYzuA*b_BbE zTY}FD_5}Na1Ho;G=S}3Vii+?rj-rlT z(;=nS2)-7~`_k4%Mfmr+n0c@3Mg0xnr2mbAZxVd7;9CT*6TDvV2EiM_iERQT_u@NA z_*TKU3Em?3c5q@_6F|8QO5$u6dHG`&(jar@`VR?T#_L?J3RA{$1GYp~aJ|6OR*;Pk&W!PEp4AF0*9kk6^ccu3s!oS(sABkJ{(^cje6hZ(~&jjHRklkRHPvTa$>z*?350oSdM%vka2MNY0~8*Lk-bOWn~cp%$0&ZNO0 zu`E@(n5v&?`<;ixYQ}5i7A$J?Ql)S=W9o4mEb`bNck+yfr;OT5Eo0j$28sMs5MaF< zywAwb=q46FkBHc}d`wFfHIYB!)QjAh-F9uelWh@S&qnVh>W|Yc2*V}uI{PnbKjIrN zV;YuYB7fW&w%u?*SUI+x!|gE^8lIBNyknz?B$^fdP9q>WUz0v~@>;5D**Jy5s+b1w_x8Gjy>5T6JFtSo3CB|LTX^}s&AQj!*X!29XNfMZ+S6Qip>eACP3Jdt5wsX$ zuF4#hQ^A~+-%|dTUIsDeTn_QO%jsiIxe{6ht%jI0GFN1d$k)Lfgt;JdK<0kT`Izf5 z$6E)jhc-YPp-s?ch`Abbv@H;GvaQfIXgkE5YX`Iw+6D1E;~CZu4M5D9m@6?y8ie*k z%!QZ(G52B4!(4|s&JdJ>h9RCs8E6DzuEHE;3}Q}l5IO|qAm$u-XdEg)%qfb{ThOP_ oXVB-+SJ2ncH_#W*m(UQj09puLsPoOW^nd3ZT|?uXasFxl0*NGfYXATM literal 0 HcmV?d00001 diff --git a/gamma_age_v2/fhalfling.utc b/gamma_age_v2/fhalfling.utc new file mode 100644 index 0000000000000000000000000000000000000000..fee87aeb55e0efeefbdd56b535eb2ff8f0d6817e GIT binary patch literal 5413 zcmeI0*>W326oxyHKmu9F0!di26SBw7;y?h)k{v5iWFg6MLIO%lYS|NyW|Wzc9kYgg z-}imJrHTjOf_vV8H^>Foz!m)eEYgvSDjpy?RloZ?y-!bfkB-O7=?$m)_w)@YrH(^C zU$4}UNYCG_)Z<78S1NU6fl_m;lxiWpvRbL5NdJMMSUt)=uo8sq(8_|x1)mZ;A^5c5 zGlJQ7(&t&h=LA0{nDb5QR|KCItOZvE*96xE8^I01lY*xNTY@hLo)&BiZVGk;yMkMS zFADYq`+@_(ZNW2wX9ZspJSX@G!A}Z)O7PQypAr15;LC!a6a2j37X-g3_$9$F3w}lL ztAbw>{JP*b1ivZxEx~UKen;@Tg5MMTe$3o+9}50R@W+Bb5&Ws(&jf!i_=}jYLpp^) znBrLW7{|tuRZAh3-xM?Rw#9i1k}N4_Kg7P4KzWGc(&w3^ zCG%k0WNhXygV;aoE{Av?$SWZ3bfLPg4cpM zE^S?ugn!q^%&~44`FDVm`gaPxOYq%-?-9H~@J7L#1aAf>wgr%kwN)_RPm+JH;O&C% z11Gj40i-*jr0p)jyTN>av^`K#XRqLWg7*vV1M^+c`k{mm2tFwIkl@2Hb6*WWTyGlp z6pj0jdy4Oa{D9!2f*%CaSm&XTB7Qh#CW8>?N=rdxKJyTy)USh_LptQ>PX-D1D>V%9 z4keF3mt#JLlxLp#qtMqeXOaFC^KqoV#C!tjZ!zbP{vPv5q*r3*x%oThF{F#}GT46s zS{w5t;B8=@k0O*9zo&^^<7g$Wt;5x^4m=BGXd%u8zYF6K(}a09B+PpzVV<>w{}TL% z;6DZPe&krEpzZM)oB;2N`80SRnD@yUh~FWO&2J#@Mz%c*4WJI~9K`vsjK50{BEM{! zEn5esX#ApS;Ed~EYA<}x|w9=bdRf2t(MWAc50?lo@*I(%s6%9b(*WflyTgE zC6N_eFYvS#Wb2WiF@DXnT7l&{VMbX`#xlftJsYY~-McGW;Dr5QD zYwD^U4_InfJ^4r(V+C_!gbB-;^ecHY8|Rg^WeZo8+_qCMnP9|-&ttXAjn3|p| zTb=b!c^IvLI+fxGx>jr-y1CHp`o+?eg(dBl&-cqy*5p*Tyg1J<7<TCo&NKtHZA?)2&O8^bMyS-kX19SZu{IkAM&J=7UL7x`j8jv8H8 zY1ekWN@<#FL5uuRZN+;u^2<61T$jH!q|fhmDG-|(e#TtF->zYQb{!Dje~&+bHI$Z~ z($ZBE+MX`r{3V%r9ke}dr;<%RY6S(?a)P9nbldZc6Lhjq>PsDFAD(GcU8kK?SF@IF z%Zvv0s`QV!Zhd&hig&M4IX&BG+nA*rST*zqvTfr`8cY(~Ql*Qj`h~XNc}VPLyha|u zqDC!M3QseZ9>ZXh$Nrd;XMcFgsJzrNww+=pk)H|z?019r8TlFA#OCJ}5&M>pWvL=3 z@`s&zkq5I|u5EX+E&A89(R+#N<8}+e?vnmG=PxQB_l=h^4a+f+KjsYCZa5+A9NW%e zc+7={r{p&8*a&(O#fpBX5RlxjNgX_SEmgH_+(Kbi+Sb0G6rz6Uiw>f4Gh^a6G<>mb zwJO=bG^0iZZJQu4o%=8CHk;TVogS7n@B$k)Ufnw6@xLPR#~}Pg%G$1DJVrdSjLrWm zkH2D*Hp@Lzsm)YsaTjbtTkgzOYJHWuY3Q~c?C*8^dfjTTd$89%)awrPy8XTGffbxi zIG2jw!rSjH*1hiGUbh}TOVqe(Pjlae#--v1n;+GM&?1OIDT7fi#S(}gQ~qdP3N3?{ zL;Ub^`Bp-!pw-YCh`}L)!nF`z$9jlCAA>yxc?|9t)G?Ub0BwXeL7Sm1&{l{+8H2Iy z5QDEB&`xLVz3?S=M1ywG@w^+N|B21g8v4nqUb5r{z#gB=Dr3~m_IFqj#HQqT~@ z%P0d4Lkvn7jEq7IK8`~tpd54(%0pvN0b=k_gg$`2gua3pxO@kF5B&gr1APk(LJOel VpsRJgxu^bb%~2&Zt`*mx_AjFhb#4Fv literal 0 HcmV?d00001 diff --git a/gamma_age_v2/fhalforc.utc b/gamma_age_v2/fhalforc.utc new file mode 100644 index 0000000000000000000000000000000000000000..e962ae46def96b4c4648a7533083adde94bc0b6e GIT binary patch literal 5328 zcmeI0S(_6@6oyL$LB&A<5fydV6aiUg1{ho?lgttbnV4i45HVJg%A}c2cj)fSFzy?! zxbHjO`wzVF+JE4^7ybn9^!s{APUi6+zOED}r>m>0s&i(xoE|(iynkp^DK!OM zzDcQHQEs_SspnB%y+f(d8w*?XM#VEnQQJ#!CwjfTJSf5zm54uluZO+i7nS>jJq0I z2eJK@n6X9GuDEU$O7@|#Os=^(tck8$1HJ??&RXagbSuPoCn4UKKKC9i83*r~+?(~c zLyXV90}$6ec|Bx991D(%(8zbj%s4ncaArgmI6}I%sY^=TC3v&oyTQCKZA(;yfA5Kz z_qtcq-v>_mZxwvM;0FXhD0ootHo@Bk?*J#Z6Oi1C?iS0=M zvrq7&V9qyfKa})2Ao!r*LxP9Ee3!IgD2X#7_%N93gLVW;`Wywbp6hEA;(XJ%j%Zwu zk3oDNuXX5#uhTpRPiy-!7ckNk}B zYo65(EY}Gu%6dNT85L>QSu~!nlMY$GAdf{gscUS?X5yo*ez|GQH+${H6@J0ki0mTk+52G*+dr(Cx_v1rAs zSE-y{YIJOj(haN{;(=`2IP(UB#IjWBVyb?=<98nts~NA6Td=6nOO?XijH$q1to-%4LwT*437$ovjL4fsc@IE6yqgz<~JR)M>@-Zz{)I|P-Q!jF3_S&`W&UZw7 zy%fEds6S4(APkqp>+Zj(ebzT##xyL)ME;C3ZoA=tuySlWhudQ;G(07jdDkWpNi-|^ z-9|uiz9xO}iFY0xn{sKmD*yZ7Kh*^ zv;k+SQX8t&O+$C=;84Fi)bCdN-NXIvk$!iy-yQCEN7i#V;aDnu8!x}VS@*j~``vo@ zEYZbPdx6U?G)@)2%lxLUf>uM!H<@R0DwtRDTgumcTh0}#KvoId7-8=#HQCWv_- z^F8Kyd>zaqn9nhfWB$gxjrkh$v_WVav>n<3?Sytg%(s|l?S`0F?Sb|}`yl2``=JBS zL5SxW&#+-=1Y+L9e200?D0B>BKEphQ`3v(F<}1uo#-J254)H9?Kob!24dxls5c7)T z&lC2Gf)9yUQmR-fWCvihkk&5hJJyrKtDpvQ^ufceZINA{%_7v9UA9{^H2K^ Doc?Xe literal 0 HcmV?d00001 diff --git a/gamma_age_v2/fhuman.utc b/gamma_age_v2/fhuman.utc new file mode 100644 index 0000000000000000000000000000000000000000..2f213ca42ba67ca829e4cc196013cee8c2081aca GIT binary patch literal 5354 zcmeI0Yj+bx7{><$L`6VA@ou?_fKb{3#cR`~p@q=KB&8r?oF>y|>1H?VZd&U7e#QF@ z@0XW;0MGHAFZ~9713!Xq_5a`9NuTuSCxGXif9Chh%+Act&dlzU$x628bpL_AL8a6v zbmcmwen#4RlTuG3-FS;qM^-46-=tIv>93oW8bJCF48`h6{=mu*vSX_Vo)mmq@RZ;) zg3k(O+qTVff}aw6UNFaN>sJLoBUlTb7F-it7iN${fJX9Yhe_<6xE2!2uUOM+h({EFaL1-~Zvb-`~4epB#U zg5MVWj^K9%zbE*z;P(Z8AoxSU9|`_g@FyvA&3z{LbHQH-{!;K2!C$4k5@`dCF~#=l zGWM|sS_iTG`joL<)s8f86;jrrt%i6FQ=4b6<340NYoVjijnECyNr?T@=l-PGaqwE( zH}h|X*gos7hh|dVfb;^yv228BWE>;0u^k*GI6o2}$4SSwbV#XN1>YukE13P#Zcmc< z_l}g=*PSB&F0ieCx8QpO-z)e&!99Yv3EnQ4b8l@Y!1lFE@NU8P3*IC60kE~b7Le|P zY@7Q9KM3Yr(hfkj&OyPwf)5Gq1M|7j`XS2$f)5KmBG|4MuB$hlb>`8)^NCf{#8 z>0aY|Y-h@6z?sUXYvf>wdbH-)S>Y^ll`*nJk*E$ifOi79hs5|O9n5! zlCBvPbu8}$VKlCrHnX6+T$O3Hj1II{Gu6ss%c$eVtDB&6xhgh{=SM6_tmp?(pq*%} zp7=Qv)&i#$IX+J}j7QHV1?g|r_vTFyYFl9}EXpHN<#mlkV>~NqIVaRXQ%}2ThvoKk zAa5yWoMc zGC|O8Md=Um4-9hSSl|q^NYrvcfzIeiXVi&Xm8lKoQO{Q zj%~H z9Or_T_@mlM*J$EbbQJkMzbT~8_j5TCiy3~-T*B{?VSO$+AUyvre+qLbE!)u2Ra4rX zD`EfH%yAvH1MOz)A|G|4qVIT-Z6(_d0^>!U>{I$uhuKD8W~P0wZL6yV$8}}K4A!dj zkNbXoWZp?vuTllQFw=H1N=X4W`pGQRMJ0YfJ8aatS;?+ys zm`ml_^=I3neZ7!8m!v*Uw@Gf}ELgJd^kn-mvS(1H#I2-2%GDSZKIQ zF7uA%(UK@u^gD$Bd%oH_xbs?O+Hr9T#aUTbhoLP*{n!@`B;{t_q)%w%V%up|$0E~A zE-Gr*M3L#7e_6lT#QNy8ux6&wZfcLA1^?nm-vsezC#(9N2^iMMGG6;%d25kxuUQ|M zYHhw+OPk;&wDsOXwboayn;G49qeIo7@7}+tRVn<3?SytgyCFtg{7PViwHMk4 z?S~ja9e@r(y%0|`o?!jZ0K^E0kX=f7-w3act%Q literal 0 HcmV?d00001 diff --git a/gamma_age_v2/fhuman_1.utc b/gamma_age_v2/fhuman_1.utc new file mode 100644 index 0000000000000000000000000000000000000000..c7ddb244c41df9dc9ae635e55b99b4d1ffc13dc5 GIT binary patch literal 5363 zcmeI0hjtr96ow}u4G2z!&;m{mNl2WY5FnN%%QjJLA<1zzCQlt$8V~Xw9W$a@G zv>Iah%_(EMs(oqRGNi0STMn@eQ=7+jE1@xnaaKY7&@B+-ao@6E`WGRZ9S7UmzL|d; z#Q3b+1982Q*Fap09LrjWM#eD`8{^<8!TFK+I8HjYu|rDTF8B^G`=V`vEZ-UDB!BKo znSI?2{l1G&q|`l-t$(lJ&4TX}e81pc!CM4x6}$~>Z99O^N816}es>DqC3v^s2f)_$ zSU|cLvT^vHEk6jheeDOV`IAG!^-2vw zJmbiD=xWMCNVz|mKMehn@(9vjQ+^ETA1R+f`e(`oq<^J+7U|z9k0RxAX3R0D2a`@N zLYq^59J~+A{ZWFfl`SB>!O3LYn1}0Q9=I3y%~^(h!Lw`}VrrRZgJqsGmY0h9JVR|h z&q2mK2lb|VZ34VK<@4a(V4fQnAbxMy2Y+WW2HQRf^`Q=pzcbk{&qw~wJcay**9?j}mUn_M8r4mkS? z{U8do6OGgpKWD;P;Ityg_u`C-o=$5fN!IsfO%Q5ZVI(ZdBU0scjYT85v{lXtbqkk=gl5MfM3U7OLfP`9>sqP(!kFAX>~(^_a>Sma~;e%lr0i~Q2C_OOOJ{TC8ntjA%a>niKJ zeo!sXa4u+xKdhZ}jV69YN0IOIH-+^1eJ)30F~iT9EBL!$Sf2|HXvFJU9%=$}C@tI2 z(p3}Mohf1e+00QLwFB*D>>?j_qN4A3k&TjV2Z8aTPWD-SrNfL7n5jwMYuoB-&T(Ct zF@?1%{UP7456(L2>Q$y(YrJWLL1I~|Y$;Q})DAljiPenP$SqjX zsHMvBZpPH38!YnFAM-{T4^Nqtms`elGYpdWnJB_~H+Y|kpVLh&ejX92?}V6^N#rE{ zpjR((V=k0y*Pm{S_kMxPhhIG*=j8f!6vjGZ?0N9RIQsS-FBmc-R_}oce2|(+U*|ec29J>hr8V) zYdD;EEY+}uHPBtGyWQj6ZasdMr17LX!_^lXXN;dyep;77%b^v}N{Caziy1$u{E568 z;#IN-;^&vsw+>nlZGbjHybAIPxC!Ewk5>y`@pzTsm5x_AUg7x0dZ8`QR%jcv9ohly zgmyvvxxlN|9%wJL58_p7KXd@?2euBP( czK8muCD2mndYx~st^b>I6vf6l;{4P81?8r3HUIzs literal 0 HcmV?d00001 diff --git a/gamma_age_v2/fhuman_10.utc b/gamma_age_v2/fhuman_10.utc new file mode 100644 index 0000000000000000000000000000000000000000..c72dac1f8018c9eb4afe38d2bf4b9028c9adc976 GIT binary patch literal 5364 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 Z5LyB)g|652W^Dc6nxiN-t`XOt_Ag7^aUB2v literal 0 HcmV?d00001 diff --git a/gamma_age_v2/fhuman_3.utc b/gamma_age_v2/fhuman_3.utc new file mode 100644 index 0000000000000000000000000000000000000000..422b59bf94ea7c9471b4a246a773e9319a94633b GIT binary patch literal 5363 zcmeI0iFOlJ7{@QjreawYH?-^s2&H8em8MBUE1``^px_p6liOzKWG2i^TI#;yzHhiM z$2af+^!Nt8fp6d==>I=6H~rG1PXOOJ|K8ts_qlWLoqRo8$@ZQb*x!FlDK!FJyGf~^ zk@nrH)H6ueu2bsd5~ar1E7d~!+Xkf$A^iu2V)X?7z{(J^W2*>0EBKt?3Bl(DUl7c` zZJ$pHeoFAuf;nGXzbg2mU@dr3a7}Psun{~Zcv^5nup{`A;2FWL;HF?turIhJ__E+Y za40wu+!j15cuw#Y!SjNj75tpw=LNqY_(j1l34U4dD}rAY{F>m`1-~Kqs^B*Tza{u> z!S4uuSMYm+-xvIW;130VB=}>&pQOw^_nF|&1%Dy*blA}+#iXL>!f2FJEYX@g6{xxEZQc>@||%`^5?FU zIo93K@4NU!O5Fq5`u7UnEciab_Y3Y7yhZRlKgccE`7xw_qq<^P8hLqcxeU3vtSadSa z+2)iV2k!&(e3T$-WeZ4eaIzRT*5UeC2c89fbC%&;@ZLNNF}2LQ!7}d|%S%Ol-k~<1 z_aOT`2lb|BZ34VK<@4a(VBQ-SAbxK+27hO=54L?0>O&nGe`j)B-j)2Fc>?(r(`>mq zG9?q1%oNVDt{D_{EbjziG^U$2v!J_Nm1(t%4zyP@)yjO!s8hzPo1oKN6&uF$BbFpq z^n)nSPBdCi{G17Efzyf{--|OUdOEF{Bw62^H9@Fth0(AmuSk{GH5QHL(pEVq)In2E zy6J%B_GBO*DQBE$UW_o|c++8Z%e`H+HY#UodcNXx z);|+qv?A(MOL=sy*gkd(vAf`x$_)ogx=_B@uQZ(L#zJ{%kzX|KtP?JjSNtIKMSnxa z6h}Dswgik@=HTb&9oNU7Z&-Lzu$I6`69nGqCM=P&iIAI7yEI<=(@`K zt{+s(Gh7Q=;*V%2-J^+L(NX04{7oT!exJ*c*v#;A<_i8U820Ca0~+QVWN9{nn8N10xoT%tKUSxa8wu8WUQ78M1zS3d#5tyk--)r0IYR++8 znK6aED*aQwUmu=z(%q|6LC;OKUCh#toErKAxvuf14JL_gsj{U^{Zc#ZJS28AUL%iS zNu!o3$EO)fk72OMQ-9nWV}E$cq`cfRuA5;eiJyrg?019rnfN)~#OCJ}k@`-EWtl`y z;tzZE5)bA=xpw{Ow&-8aCGRDvkJ~MZyR-du&Ru3xP{`ZtgFM&7NUOaiw=@=3 zw5p?#X(o+|+BH#RI`?1JZ#J<%Iz6nKYP6f$s}3*_;6FLiZ$bQV$eSjb_p*)enSk+) ztin$IE04cfZJVCJRBN-(_CWmna{1Ol>!A(MMu?#xL%>ZCLq3KU4DlFBFr;HB#}JNhtQXn>ZH2Z$+o2uM zPG}dzp9>7N_CR}~eGo&b{m=oZ58}1Pt84%|1Thq12y_%;$a5TGh{Mo^Aq_(rhA<3W z2B8cz1o2ABLBmiUIt7hD3^f>HoQ4VzLy0kH94bN#6-v;j(AUs6(6`VJ(2vkh(09=H a&>*w~S_)mS>&?COe`}7S*tkYqf7-t)@o_5v literal 0 HcmV?d00001 diff --git a/gamma_age_v2/fhuman_4.utc b/gamma_age_v2/fhuman_4.utc new file mode 100644 index 0000000000000000000000000000000000000000..d35ae99df53abe62d36d01056be9eb631b78988d GIT binary patch literal 5363 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 as2^GaErqVv_2%CCzcoiuY+NI*KkZ+mfN>=N literal 0 HcmV?d00001 diff --git a/gamma_age_v2/fhuman_6.utc b/gamma_age_v2/fhuman_6.utc new file mode 100644 index 0000000000000000000000000000000000000000..778f62367b1925d7352fbcea5cd73d481d05754a GIT binary patch literal 5363 zcmeI0hjtr96ow}u2?2srA+&(gL#opg0>rXp*(QoDBsoq9pp2!lwef0K*S?5F)+%*+iBeHMw1Li;;`ntL$5;Wa zf>?e_$~dlSZ<@CZDeKUdLu|v;=CR$)P!3{0E1`bqR*3!a+;Uv{mmr#*2iw}QnSVRP z{#myN;(jHshPW3wmo*TLjB6w|_JgYg_ebL6I_cPk4k>kq;5)$_i?$K6d{>;4{JA@2 zj&%?8+fF`_Quji({(XWs3BF(O1A==6Zx*~o@K&(3Z2&$WZ98Pg-643V;9Y_r1Y6r} z0qGvd_QUsVc^{bXlC~eR`3Jy!H?%&;<{uP%2+VgyI}BMqBKWA_V}g&T%zbqN;(F6g zCW+#HdvU4!&Rr96t1+nIfiK|NS> zauM2;^5fvWV4jZ>WUXug=?zX6V3CEibtD}Z@E3Kj(SGcO|x4nAVM0qFavFQ3yQZxBG5{@*R zcqZ+pz89GwXt$zt3I*S{7*`neizaC1jE)+yKj7Er2gEa%BOOGTQ&HDu^t4eqQ`7Sm zr?dW<0HYOAr&`LRYsL1lTZr8Szf^8GSki^^#eSvXOg9$FON;!Xac7-yp}gV;p)dLy zFfJFO)BmWc%}BqL$5cgmVUb@NaB8Nt(7v$9$Nc@aE6Nx7rD5%14|T>bB)-^>!$#Lt z)_47&TAtxr&=P-GJLw)x{EChu-{)@%>GS(sj>Kk$pEFnScfqhf7aY)t*R?&=1lCYm zwxOk~CbT&lEN>{aOx`F?$H)=77-QUyIX)pjvUKXPj559GSWn>Lsvwx!CJGWE;tu=9}E&3KJG zf+dYwsvMtYEIo$7CQtn_Z3+3ANr`w``J(s+fq&{x9DDKYo*ExSl`FLo8oSAYwllWuafa}K-!p?Es z0*1$2Xn0C)^N!`wlPFg7JB0vyzuG!@@>*unad8X9Sy@+yp)ExH*cTlng40#mKcR%>Y&Y(net=Bl+r)w-F|Z8tjD?H=lOC%fIF-R`k&_e8gQ zxZ6Fln$wBrQVm$99jV}T;WnMFykkc zKap2K3|D#}etx-pYoT?}dT0a0P>>l!u0(VThpyLyR*}0b(dI3XMTUh@nCW`ULt4`WpHM`X2fL`VsmT c`VQ)cmOx9P|Lb~lZ~fPrqbN465!avg54K8iCjbBd literal 0 HcmV?d00001 diff --git a/gamma_age_v2/fhuman_7.utc b/gamma_age_v2/fhuman_7.utc new file mode 100644 index 0000000000000000000000000000000000000000..cf1c693cd43d51a0c96fb13c5b6b588b9733d846 GIT binary patch literal 5363 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 b_s{^e2wDu?sPoOW^?!4YqS!b`oPXNC)J}0a literal 0 HcmV?d00001 diff --git a/gamma_age_v2/fhuman_9.utc b/gamma_age_v2/fhuman_9.utc new file mode 100644 index 0000000000000000000000000000000000000000..a5e17573477b1803f6d79866da6637b940a7831b GIT binary patch literal 5363 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 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/flynn.utc b/gamma_age_v2/flynn.utc new file mode 100644 index 0000000000000000000000000000000000000000..aed0877681d11b81d01971ee84da29da819fef0e GIT binary patch literal 5861 zcmeI0*_RVV6vhhyS40F<+}Q;cWK(b_lT2o!!w`}TBcKkIq%zY^r#o~yGmI-LD&oH5 zf-A1L;0}8H13bs0KI)T?`WN`ZgMMEx@iyn+!NZ$+&-qfnd%L>2`gV0ySNclnnd_G? zUbadpWkGW%D)lwW-%eKQdX&4SDm8DMQr}Eds)2IRX-e%!`3DS#RhmCAmIw!y5!@*_ zE4WK=x8R)M>jbkear-@j*9h(vyjE~t@H)W-!9~F(!F__)3+@+ugWwHMnt-Y)n)!S@S(K=2O14+`EHF`vgn zf*%(Ah~P&BKPLEb!A}T&Qt(rPpBDU#;AaItCwQ0O=LNqY_(j1l3EnOEWx=lqel_9= zC?_Eq<57}l2%al=iQuaQcMC2>d<@#z3}#6U3H}N`Ty+v8jj>~)Nf6J8nf*FHim`uF zj>8WOQ)*x=S(nE1c=#Y1VLQh|%b^pY6QFA$UY9=SM_Swup38H14H~BEpr5Qe8R8sD zJ_X|Z81x0@B@v&BlE!v0y{nzPA=tFA2!5vv#+2Wl6HXWLGemrbh@T1O{qVYHK|7*` z&jz#Kv~wU{n|3b5e$&o_VrDLx3))PG=Q4-0peVI!HkiiT&w)B3o-24Bm~$)Z%!g>? z3jzvxLBuQ;LdzomLX=gA_j6GYTb*JbE)F>SS%iYmhFT19jUhANnLxJDnR>wNTJr{lL`RG$# zSBCYVQ5jRwV^iNux*D}?TLx;#o%Fk0x7s;kMcGuU zM~~K8HhSs$Rt4>WY}+`42AxEjRJxF=-qLEeZxY$9m|!>+G-|10FuJ-iM*T999{FpX zUbct3438HZ#t-`Pi1RzQw5-NJ&NuZinAf)PebauQ(r&$u=Nnv$KgjBE+X3+U(ho8z z0)d~k^X-Ez{sH0fTJbXO(aZH3e=~k02Mj7@%xQ%)Rlhe?WCH&?O7C$a{ocJd|ymNj4@B^J0!TKL85?l->LHt1E zBFPVbW|1GcQ=w_lbciYECXbuD84x#f+{AGa=cbLDHEz3Vs;--iTJU2nhp%oA}JKW@ObHf|tW`>&>ZeF-);bw)K6mCvd zLn){OdJTFVdIQ=6y$QVqy$!tsy$ihu?S|jUqbt# z15h_K4mt+wNM^f2Nj?qRD$}T^-w=_ p1GE9!2yKFHgl>XvhG-nu1JGtjLuIG}RUrfM+0>vxh|g*W`V-PME!_YB literal 0 HcmV?d00001 diff --git a/gamma_age_v2/flynnfemale.utc b/gamma_age_v2/flynnfemale.utc new file mode 100644 index 0000000000000000000000000000000000000000..11e39650c57fd7066a530baab8e265d78436c084 GIT binary patch literal 5867 zcmeI0*^?7h6vms)4Fm;LL`8N%c7|0^$t07Rz%Ya)Fzmxkax>FRr#o~y4C9K5isHWF zf(zn`3%DTYi&ef_>Z>pM>Wlw?TBYCDOXh^Cv9NekPt}+EJEw2ozJ2=ky?wJW7oWVT zY5w9BhGCe{^bv;f70O>OHH@_=505pBIYSKNn{kFwLD_VLVVp+!Ck%&;IDcR)5%w)1 zxJ7VMaI4@p!70IO1hX$u`|X0)3GNWQUT|9Q2EiG@S;0BM8wGC?+$ngo;4Ol;3f?Ao zyWkyycM9$jyi2eWoEKaWTokMYmjrhU?h(u}5aoHd;9kL&;Id#_up_u4c#mLLa8y=Ocn(X7{h9$W z#{P}D5I?XHLE)D?kH$JY{2NZ>xfekzp-Z5Pp%#eOrO$bd7WE^#Ca*!mRPFbZbw@*- z`^aM;&TFi98MGke%TdzU4yJeG5N`-JE-3up@q#hs*XM*QMf@repCIB_gLyx^?nLNd z*zh%A-Ye}|h}WiF2eIF@Nl?VsgP9B3WQgZ7ms6lHwZ>F1jk%u&HHSQ1FrNwMR@Rvb z(a1OW6!5H&SG zAY@*L?;hh#(9w{WpgbA!Qj}kZybR^{AumVyQ^+e&{u(mJ(H|k-#1hY!W8r3qMqUN+ zogv=>?GO1@@PUwT10M@{HTVRW7K507jxpwYVi=EuBl|n%xS*X~CmNTGpGzITk+7Y? z>JJu|=MKiQKZDhgalVJNv+pa2o_qX!+Bu(d|7kz}uYc~(^n7zQ6b&SxA(#;B3_s!{ zn4lu&8WS-m(1?E)an5H^{5!$NMLVYie=F*6J&4ZzQPdfZc_4~&j*6J`e#B=){U1b} zb8%GXcfp)1qd4bQGS@~Mq9vhl`Y~F;qoIFm9j-fV5K`!`Un!KFgQGahVG!e-_qe94 zfhHkAIbE(;%F`KL&1fu28CB3YRJWw*R=o~Yj)Lu~!8Kx)idL?&3%V=UU(rUZwu{=W zpKhdkwC#925?I=CJy)4tsu=hQT`jm~#WS7Y$>mh{z{#MvWAD{&RYet2)wG;Ojif5@ zP>SyWEn!xbTUL21ykNGLcjYZ5wCVK+RsG*i)9$Wzb?Ck@mQ$uBTqEn$>|$1XNi%3M zZ8_YA)Gbv_mCLv%Wd)&>?P=GoRlKkZ?T!-o=mBDrWGp}ET$Fyw2%0iiz)ey3S&@Z&wI!S7U7ZwBKb3U(;3 z<|-=|CB4n`(vE3+Q7iG9>uTGphu5inb!Ho`F6AA&7F9R;Ov{pi5^^W~R>vu}>@~w| z8b-V7E7dIY((%j!+5=gZw!1Yti8LAUOsu%OR;}M8vRlypaLOpuGP3^YYQq@y@<@8< zueUqc9_}(Yo~>xhim{Qvk9i*QuQ5ggKcUKa7#y;pZ&s0(JR*VLViz+UCHQ^Eav9IpzZQRx)!w=T;Ps{N zXHo=wKWVA%a0K{%9FvH4+x1>;`TY^~gZ}YI5cK<3(M4p;4~#5X{kC1wW%QHl4gYV7 z=J^rulRV5#jXc0JIXN;$u2-bv+i1J5tFXAMs7tD5d5ap|#f@&h(Ouf;E^BmGG`dZV z?vh4#WuvPa-Q|sLvC+j?!%hgdQ7&ML>RGsuU;h3Q$Yqby|8R(R&d&gTrZXe>3hsS7@CLc1;Z}xQ7;as- zW#LwZTa?vM3~GknfQ~|MLdT%DptqrSpm(A7p!cEU&KUhfLfp=)Cw^_96S6B;pfL%s2y4dbwKN(G_(QAKv^gU vZG<*KozP}z3$zv525pCSKszBC$8{I93sO)XDnLa@Lwq(Rs2k$5>Vf_OwDmCJ literal 0 HcmV?d00001 diff --git a/gamma_age_v2/form_queen001.utc b/gamma_age_v2/form_queen001.utc new file mode 100644 index 0000000000000000000000000000000000000000..2e67dff7c028728190875204aa81bfcd20c4213c GIT binary patch literal 9997 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 Z#y&R!jY37}IK+6CAoj^J#L;^K`UmW{9z*~D literal 0 HcmV?d00001 diff --git a/gamma_age_v2/form_warrior001.utc b/gamma_age_v2/form_warrior001.utc new file mode 100644 index 0000000000000000000000000000000000000000..f22e11f1983cde7ba90dac81171d188cded3be3c GIT binary patch literal 5012 zcmeH~>vq&s6vvNJ#7m_W5bxSTxhM!jTcD_Dr!$>)pqF8$P*ik0ojEO`nPkXhIxXJn z9TmmvT7JRxM0I3&!IOduf~N#? zoaEY~;4^~H3Z4->D|k-uyx@}HbAq|vWZa721;OV9Ul6<~_@dxf1-~Zvb-|YezajWd z!BxR;3D$y_1lI)D1slQ3f>#7z7VHSVB6wA>E4U%p6YL9a3ce~h5Zn?R3T_Kt6WkHJ zE_g%mHNkHSen;@Tg5MMTzTi#49|-T2n%6Q!_s25^?{g$_&JZ|fHP&&~7 zN^J$xXL%1q<8|902f%*rg|g87(0ve}F^)^0dy$sRgV*vJ+r4^_Ct+;69pZi^<29vt zUpY4CNF(F56&d@%t4p1>9qo*(qa)Xs*ux2++%5PK!H)`l%reJ%T+}}SPR4!`oXqJd zFy~Es8sgk(&p=!!Z2;o>8N)$aqELG*GxmESu7^A%cpsSaVEulGMm`Wx%m*#AcorJA z{&Ohn5bw{SsBUwdb2uDve0UxO=SCfYHZ31TdDC(RqV?ijS&@+t5>%P)XO!Q2ZkLNxMA(2%V^4IZ=nGS69l1w3wf z96SxCWg+fe-lqvDXX|s|#QqJlPa3aHo|D`Ak!_;Jw*7y>yw9}T=MdN4slOA4|8EcQ zU7d&cTqMlrFX2Hvg9-B;#JxKS@x8nSDnLCD-xX8P1+-6iMQ}&(b?|~|G+iBYQP2MO)C0D_m9a+g`n5!h#d`SaSU^ZW$kotzx5rHEGxS zUTA`#-3;v%W_&-vsKK0HGC?D6bQpj2C;a-xgjjPW)Io?jm2_=YuNcIqrZ*OxZu~2u z2rhceoAr2Ldqliae$h)!S1mfsI&WF-vcBbj7PY%t#(qdD=XBT(w3|(WKJA1h-|@nv zms~ptj2CvRXZ3oQ*+*cOmwd0CG*=zRb!EjeVkiA6->*-uIX0R~&FIc@+r=#X(5az6 zkn0+6#bA;MlggE|^(*aGcaey0%|zR&tkFtUqTMx(JsK_{=+>Y2=GY%r8K18-jq7IF zN$h9C5b-zIqp_dY4crWFS?fD3gk=deu|Mh6%iJip&TH3SX^Z}KC%!LndpvDn)LqhF zcR$4E&$mpFH_MJ^Vt?M7aQ$dPl~n|A2E$`6v;wXaZufak>aem}cFA$E>!Yfit6Qz) zB(9&l+IE`NVrUw1Wl6gx3{CfW%K423?r$^}4~Xh&*8y;R=|}yGig-M;X6zk}#%r27 zA`rFe!v<(nJ30s)KgeW`4Wf1$FD|^AB4a*TS>3pH%?}QE1B-DxCTq#hIFrnuk$EK- z@G2%i7cuJ|;wYROTAFFc0YArCGW~-UW9Pg7AnaptidZx8y>}DahnSt<8 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/form_worker001.utc b/gamma_age_v2/form_worker001.utc new file mode 100644 index 0000000000000000000000000000000000000000..33969d1bde4151bd38b40e896f9ef2715f6d51eb GIT binary patch literal 4868 zcmeH~$#&dC6ow0u0D<6yBtV#*2?Gg9$95(l#O)sJPCPW-P8`Ojy1Q&ER!bd8?I8>a zVG1*OfgBbrIfpGP-hek?!Jao@1OG3T+E;s)zUTa^@0Ln6T$QA&OLK+6%Ol5z&nTs4 zpue^#bqD1y4=Oc@^5{;b*6va2=UqzeMfuw!N=>2s7lzZSzypjWs$(k(E(tCRo)FA& z(rYV%F9^OUcuMfJV9r17XI5}k@Ed|_g6o3k1YZ(-S@68zD}vt?{FdOi1-~QsUBT}O zZU}x~uom1D+!EXtYy>X|UKG3}*b#hH@Umc6a7VBw*caRtd`)m5I20TS?g?HIyefE2 z@VemZf`w&1S>e{Gq2`WwODTD}+M z4xD7E#+3R21>3UbN6Qbz{>Fjl_d+`$UWdm!<}D~s*t)GKmy(XuHZXmb_dzsXcR#cQ zU_TE)B?zw!wH@L!z;Wqw-_X)|@LFDDyH^kMB#dnbAlEYI#rwgr@#=|}NN0 z&UUmXsg93aUuuu0fbucHj|<)>_zBA#>q+Rg?f5BhI@hPcoGa}aD6M}MoW|%mFxNyI zgcujba6go`IRNH3jQv5uhXfx6^E$S99-@(lVoLZ0%Pd}mhOPe+$~MINb0n_2d7gb8 zjX62IjDq)uItJacd>rK+%Q=)kS>_)3)iTHV-SP;^KP-=;{L}JDlz&@3h4LTEr%`Ul zz2mt2_UyBK7CdD674RuA_rj|Xjr6|SoLJ+ECiQQ1j)thzo^slHXhN~eQ0 zX?|p36)!SD(CbEa3RAwHVtjtaubQA!G&)*}{c*p&J}%Z=k8}`WPF3An){6%5Y3cPj zryu`%B!Y_`iiVlmh9O=X4hZwf`1204!VN1d=?w=ouifPu_Cs1ZqoZD+-FzDKNhhlM zju)l96na5myr^G2t=Ia@J_57Q^u1o%T&+5;D=QWdJLymOe!H~d*l6OvNUtvRT+Gss zoEG{6xvudR4JL^&sX{H^zS;}>i$ru=Cf-gpjaI52@2*Mg(Wr@_TYuJ@VSiX^)`!11LY_b)1v@yv>`cQhWa zYuboF+-d+Dpwn3OgJl!sawnMXP2l~+R~BsmsxPl!zwQS^-eA@E9ursoD5ovhigkDI zZd}DWUU?z>ZK?W}9K*6hM|Viiu*Xa#1q8|HGuyVi0IMw)?cbOXQ3 zl{19=cJMo~71{A36XXgbqQ6A?D*l5c6;5-ORU-Ku00w)yJUYP!3|=%zSwS z8ikk_GaqIi%>0*mFY{gIxy)~w*D{}F9ygOt=zC}q+KfpO6Ta_@PzhoV!Q6rI U;eM$=7ogM_vx^YVO+nMpf1HK%_W%F@ literal 0 HcmV?d00001 diff --git a/gamma_age_v2/frostedpits.are b/gamma_age_v2/frostedpits.are new file mode 100644 index 0000000000000000000000000000000000000000..581b362dc9a48bc123f36e615f8ec3fd3f054348 GIT binary patch literal 12913 zcmd_w2Xquw7r^ncASk`4SP4B8sfws5gd`LVBqUT@SdvMylI+CYMG{3RN>dcDqM-C< z#f}}U*s){BjvYHz{NLGq$z{*Cq)gyD-}&A-KlaY-%)9g6ym_-3CMh#DVPwxPJ$hS~ zm4uZ2EbHcdEvrv!%Q}|jN$o5vmCucQt~toE{M{|9&OVm4lfr7NBUrT7fUn(nvx;}9 zIDrk#HiJ}Ltl|YK-k{=bDsIH_nRlrTUA`AR(U<$R6JV6Q&hZ0#hX>UL&XUPl-D^(#lUpNo~7b-D&C@Et4?`6i7L)eafynTsCbi#x2w4Mf#r4fQ*nWc=c#zT zinpq`4gP)sm@amUToV#ARNd=?(`hl>ta^~T7$$C!W%;gdlrWeQ}MyX(q<`#zxSZ)L`n z>D#?AZ^XNf%rSUvuiV?rc-H6F^yi+MH{zY&%H%cMRA)TPzNWqUIx=;}-WSYzuh*~K z$4p+`&y_j9<`}BeUKyh%uWql-YsOOS_3I^Xy!(--8(oMofG6=DcxY74u4;Nb!0d$+PgPwAW1<&Ff{}Fnue(C#6($ej{6XZ?C@Z zSM_(DIR>xuRaNtPxi9G7S5?jH<^1Y-@_!|-mwwiNFT@+qW{#@KdD6?@3pF*KDzAxx;C9#w}^>>PX&S2&)`Mpt@yk5qY^qrZX?xay}F;}*v)-G=auzRYI0oZ=XJWDBbjzTuFN*o>F0Ro*VGw1o=u;7z3-dfu5$ma zYJ0uh7v#9BJD$Dd)%Shr+r2fe^mx|uhV;J_Iltzd%2+V5*Wa-^ujDc9)p=#Tl-TRY zOF!#*!;G=mdD678CiCj{>VDSqhR$o^J=M=TZ={!Nwx9KQj(7c*_UiI#L3MncEZU8cFuU&hh^E&4n)@sahyO>(KtVKCOd^rP?l5t zd3h5;cG>a(CqJpknGm3Q_ICm-yWd6Xa{^ffzFcQwBx}}$U8=KK*44?ft}ePa4+`q5k{=$s8$Zvg8lsXXO;w(o>O*(~EsM{%|Rq$gvgri&NarU^#1iX@93Ax-%as zzEZcsFDGFUm(ZM^!cNwB(j_pa3)6fi7dNW1EjS^`2)Eb&O|#HtuoE=gaM<5X{%_g6SwS z0-3mF0+xsQG9gOM_0a$g(Fl#v1WnNl@PQ*j#7Fa$%9jtmS#CbBRbBQO%9 zFdAcUI?lkEI16VZ8)M>OZ zT$ge^%f)^^F2E#Qh>I{8Q!o|Na4{~ybj-j^%))G3ipwwum*Wb|#XQW%mADF5;~HFx z>#zXV;|46mBHW0Zuoz3Q6w9z2E3gu)uo`Qy7B}M-+=|<9JMO?b+=;tzH}1i`xDWSZ zJs!Y=cnA;U5j={=umKzKIG(_hcnVMB8EnF{cn;6w1-yut@G>^z6}*bq@H*bWn|KRb z@HXDTyLb=p;{$w%t@sEZ;}d*}&+s|Ez&3n|ukba#!MFGh-(x#|z>oL|KjRntir=sU zzvB=5iNEkS{=rVj#lH{s#eUcywQvAxLta)r5C@?y>Y+XwpdlKeF`A$$n&Ds^ffg^Dgjz$Y4pe0(NHQJyp+MzuX(E%ON37v5ax}Yn%p*wn@CyvE&=!N6a8zNB13or>6;v!7O z6imf5T#QRF9WyW!voIT%;xf#^<+uWKF%R=`C9cBNxCYnaIxN8TxB&~X2sh#;EXEQn z#WF0%3arE`ti~Fw#m%?{x8gS3jytdpcj7MGjeBq}?!*09j|cD|9>T+T1drk|Y`{i5 zjwkRWp2E|32Al9Kp2PEa0Wabuyo}9w1+U^YypA{UCf>ppyp4D8F5biY_y8YbD?Y-< z_ynKgGklIOunk}0D}0S_@GZW>_t=gf@FRZ0&-ewu;y3KT@Aw0M;xGJ-f3Oqs2I4;0 z7yDs<)WQL%jXF3G2ca(Np*|X*A>?K9#%O}3XoiDv2o6Pa9EQVj1dhZ}I2tXGfR<>5 z)@XyaXovPlLzW2 zK`I7dAO>MDPQ__R!w?KbIx;W}naIL$jKD~Y!f1@a={N&t;w+qvY>b5u_~}Api%(I2S>L5XJ)aV-40qN literal 0 HcmV?d00001 diff --git a/gamma_age_v2/frostedpits.gic b/gamma_age_v2/frostedpits.gic new file mode 100644 index 0000000000000000000000000000000000000000..d1926d30a1769618ca98b138035b065b3c0c7489 GIT binary patch literal 3775 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 MbSJwA?{ByM2gfJw1poj5 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/frozentimes.are b/gamma_age_v2/frozentimes.are new file mode 100644 index 0000000000000000000000000000000000000000..2e9fd932949813ea34e295a0b352a6664f61d2e5 GIT binary patch literal 12913 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 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/frozentimes.git b/gamma_age_v2/frozentimes.git new file mode 100644 index 0000000000000000000000000000000000000000..42fcdbcbcb47c4a0773bd403419e52ddc6fc0fbf GIT binary patch literal 89025 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≫|T!mP4MK^Ru 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 LA8E{0)d&6oTI%1a literal 0 HcmV?d00001 diff --git a/gamma_age_v2/gallusgallus001.utc b/gamma_age_v2/gallusgallus001.utc new file mode 100644 index 0000000000000000000000000000000000000000..0226d833e77a43688d0721ce0d1766baecfcf8e5 GIT binary patch literal 5283 zcmeI0$$Jz<7{-fLk+2CUic8o80U>M(ib67zWgsNO%s^bwSTj>en)GxJ-8~7o?;`Gs zEAGq5lV>mf0p2}%^X4C*H+|pks>#QN2cE~1@;%R+`qfu8)zx2r)m@cim0aiXUE6l< zRZ3N$O>>p{9_8-~l{$>_{8FWIvy}REnNkxd4=h)zj`D99npKW}U@YNIEibrNaG&6Q z!2^N|f)5GiT-^ABf{zFu5h= zf=>%RBlroyPYQlY@Y8~y5&W#+=LA15_yxf)3VuoO%Yt7K{Hoxyf?pGS&N6fHb-`~~ z#!^)sXqdY4k0EIw04V%(?8aKF;aS zdH4gfMOx0!TyBMlkUV@T& z&$;k^Xyj!nWplqCywcY3dTZN?Hf8PZS~m#)jbP_rCHyym`EKI1Zidd)o?Ces^Skf-lC+l(feP-Jq{F`H5=^U>1zx?NQHC9&^ zE9Q3|`Vni*G2b<0em6GS1<(h!%Te`%Y5&zed=C#md_T>B3J~8*dT{CEETb~!j$&hY1=b*l*s=Av^qaz*E%xL9I)2MzE)D1Up)`}A*2otts zRt%#g(q2-iXZ5^^YmwJXyf8=|6+LcyW<@Rxrc4xT*P##>NpxmAtiE#-}ua3APw#0$pb(ILY!LTQg}ol{9*(a++NO$kC*VpxgRzFvRh2msxwc zX?(w%gJkvYBtiTQax|;wbpsEBDQoLqjIdPU$?Cm9y~ISBY1e)@-V)>M>Fl{={ju7T zbT~I&J0G(4W3h?yX3PsrRv!*}{4kwRc@hB}#N{y;S|5HXs_pgce7Lh(ch&Qe^{Ff8 z>o|6e_v5X_ zX+4LRh=~Txl=0K~i2m99*pfNZ`87=)5lbCQ#_{}HarU>XYX|qn{C|Ucr*p60pLXfY z3T~EV2aduG7JcLnDC?R1r7yLmr+1Fl&DiLK%bms6(aciJwa3hz8t!O`ZPzw=Ts;ix zY5KSypq{0VbKsR(3ma9PEV3hnK@G3H4qJuG&J{V9IXXFsRzB z!3`~FdP!{p%PoC;3>QCp{4C6c=0WozejXSd9aLi z@rcBu505-N>hOreqs?lFM;SgQ9$k3+=!DilYoT?}dT0a0qsK;Q6T~CNW@rnv72*+M z8?+tbQGrJU9u0OuyCEI{xb^3jpId!y@wv6m(W+x*U&f6x6lAI3z`l6-{YJ^4DwJf m#4T7q#P~2a+?H@VLSz0Nh6bS{&=52X6``XL<5{w08Rb8uY7o!> literal 0 HcmV?d00001 diff --git a/gamma_age_v2/gator.utc b/gamma_age_v2/gator.utc new file mode 100644 index 0000000000000000000000000000000000000000..ab7e42272d007ef5e3be4dc0ad6b59eed4aa8640 GIT binary patch literal 4824 zcmeH~*>W326o#8DK)^{%67~Sj9*7B!lduM`EO}AlI6`t_cF~gB_QazZd8XxsHH0ld zSf7C6nmb;BC*TF(1$YCh;Qwd3<>R6%#RbJxPSvmePIpgF&*`3?ql+`eflDWk4?nGx znudPgtkicXf4W1dNtA;-m72Omsnvd^_Mp6eSML7>L$fOK2gVZ3nUw^O2_6?bA(;2^ z*OmpJ6?{(cl;HD%Ie$OS1;G`;FA1&+t_hwId{OWv!Lx#27W|6fR|UT&_;tZ=2!2y= zUGQ6iwcv)}rr?%fBX~~myx;}Ff#A!67X^oc+kzv(vEYv2CBcc{RInA?6}&8XMewTN zHNkHSen;@Tg5MMTzTgi8UlIJF;H!c^68y2?PXvD|_%p%R1b;603&-5kUpn4|vJVw3 z)reAGqhPzbqSQB@QS+_iJ5fqw-`k)*h-2L9cr(gJT-_FwOWB}GZ3WX0S%y!=M#cQ!84}a3AHsjt$}{tC-RAu4i5p<7n9=srDVp zX+?%ujq4_x%8UiA6r?(7>qh8qSnDhpTF#~dRubB#Fa`tE8a2t!#hhuBGfB92>Q z%Ylm~{uk+$xo(JA#x`hTJWv>#Xx?Cw2$L#S3$4rDwD*vRZqsDjsjAUS)w10+i9Ko? z2)gqxMAIA(PnoyZIwlMY93=M()*}7}do=e;x{bx)mUVuRA}kHmOx9c#T z?~3vDO1>_6f4prr8_ti{+YfpB#ndDvGZ#cA_b)`FVVq5NNF@xPEM@8+7VrYub5bMTf>((|ezaal4K6&F;k?M0K&}0C<1t zXXA^C{C;NHxE0Or*D)?7H zuMXE+X0E>Amwbn-=;S-Yx2Ih4CQh@Ru3ft|_kJ9;vQ_sNz|U9RSKy>;#_fi-+uaCp z)Wm7k=e)FoHTO+Pw%~p$7>Wz--7Z!eQ}*M=QNt}Z9;iQBsRy>+Ow39r?F|PC z3lBplp;HiZUFNvVZJEib5-W3%uPq20yGL;hrWU)p_?(uW5P4M1dT!C Y5OV_`AO1)5#(15DxQEU`Q_y+nZ_5wx0{{R3 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/gatorbite.uti b/gamma_age_v2/gatorbite.uti new file mode 100644 index 0000000000000000000000000000000000000000..b0c34fb3ddeefb46c3cdac754c1e148fa92f17ef GIT binary patch literal 1097 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 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/gelgon002.utc b/gamma_age_v2/gelgon002.utc new file mode 100644 index 0000000000000000000000000000000000000000..91edc1bfc17197d26e51364869cb81bb5f2d51c0 GIT binary patch literal 5691 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 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/gelgonpropert001.uti b/gamma_age_v2/gelgonpropert001.uti new file mode 100644 index 0000000000000000000000000000000000000000..0f349e745ef44cf343330e1e95f6e33d5cd82ed6 GIT binary patch literal 1247 zcmb_cO-~d-5N#F2Z&dL6YY{)f#ejRzgBM&9m;`mhuH2iMVj1X}p3L+f@Z=BSCz1G* z^u3vGX7FgN9V5aH-AfeXgTKa+mI>f(IFEPFib&16@v}I!g>}<<1reM$Q^( zO4aF+)A7*=4gH~^vFFaOC&{@I-QN6UFfA+c2=>J$VureOYfWZY+CoZ~O0}JmiC-W4 z>#5On&m9+`JL-Y&SnrvT;d)n_X;`DQ&U|flXx8ls+&_0-}o~ literal 0 HcmV?d00001 diff --git a/gamma_age_v2/gelgonproperti.uti b/gamma_age_v2/gelgonproperti.uti new file mode 100644 index 0000000000000000000000000000000000000000..2081e9bddaa158999927cf7c255dbac13843faef GIT binary patch literal 1373 zcmb`H+fEcg5QbX?#j_%w53C1J5lNJoc)KnMP6B4buG}{}#X6y9dNR{{fmgnQ_dJMi zr~g0Q%?`vnt>oLPK2=rsR?XL8(%D^Kd;d`>H47YA14n0-x(~fNqm)4Zg#HDcVABHh zZwQo{=MUsFxX@Tir7inM%RUPBW#}l3c?Kll3P4zOJ=o`JKJjhw!FQ#e?Ocju?`$2*OEBNvDCuz1chyV}oE{wv5HM`&8+&4ZH%(8tXvgM}-lVFT zN0e=wis|dhz4J5u%9c{OOzN$SnS}9SxSkqJ_S|6^qr)Ha9qK(3XE@%~W)jD6t@GfU z5&U?%1NSdR(k)BTm0vgFoFp4Q9r(|4yj~dL{~3!J+oB92~^S!ndZW@DkSf!Vk$Y8DS0bQQb>^v~jC zR&2xtz{X?IvDjE-{J=c`55Xhw7(4-spaY%)-tswk0hYircnMyC*I)&_0nGDs-hTiL CWRI}` literal 0 HcmV?d00001 diff --git a/gamma_age_v2/generalstore.utm b/gamma_age_v2/generalstore.utm new file mode 100644 index 0000000000000000000000000000000000000000..d93e4565f500865f84c191b53e2af0357ae75b31 GIT binary patch literal 1475 zcmZWp%We}f6dm4BTHY*JAYFw8trUd<8zf-Shg3!MrP2bs$enQ#(-}J&ds6ZTEcgR{ zjK6_%JeeT{D<{6bzCQP1&pkQblTWXEuihj{as&7QJO;jBs^?#qlf(lbt|iGK^gl7L zV*ZVRDY?%-jAngxLB_FGe`P@ib#fQr%&`q{|27x%v5cAfE5H&!t{wpQ(KegQ^tSPWdW?qf`O~{OuHn-+7{nE!c+T0slFzIL71~Z%;mL{c_J@sv~YFA0}F}PCixSVz4IIss3ZKHO+j`CLSyr#`( zljr*`fFo|l^?}W2jUrm_8ed0~B>kX^g=NyWQv~G7845v$BRz3`aOnJ(ny+2Y`TN_o zzWLvBMFE0lnJkaA)uqZk^LPq1FTHtiyvUt;Ut(Z<2{-&yoSQI~FxJv(4|gP}QBO9!U(JG+UC?1q=|hH@$T9b7jAHjowm@Xd4po`I%QR%XedutDx0DF zh4HD*b7i%w{2Dn`o%R@?i7wflV$0&^&UVID!Oxtnh%Jcif)9$}s7{^;V6bS(Z6i*1Zf)E1Yg__N7j)jmcy9x1*y}O-c$n4BAGn)|czyrnm z#QS{V2e8Vr%1_`Y@P%*v1bzej|7W^44^mpCWorfJBH^Q%PUbzW8bTw4v1qo z=3Kh0k8?Vm4yx2LFpcH%lopRWjR82$)zDqgHP8wu2l2eDAAx9Y9y}+HvBRrXY=p6I zCp2t%HA+7JoC{uMsgdzIOO4}P2MybS@Oo?8x;81b9_-F_z3|^4c!S^@!S1{_fzR22 zZw9-$-U8-)X}3boe;e3c=SHyWv&k}J*ab1>w9Q$O=D`*)EN&Nkhh^TMT`BkWat^z#pT(UJ=S=N^_zorSg^cBHlzg`7-v^zw+=KGG<^3qX zvwQ&MkCvGiKU+SC@)yf@qx{V>zhS>yz8B>M%lDz|#LZ(a+z-*nhaf&DuZ%&x1>+@L*EyT;g6Vj2#BdEr8`GXIs;UyU zf_lXy170>_$q)J2Xke8G~FG$=d`BoH}AZfdg>Qimz7?GK(hC$19SM#3lOUD#q zC+mY@Snr?nY&7w`)bmp>6==|H+ouoGd1$kvU7+H%VgJ&r?2ZG;n{@bMXgJ zoo!bDJin}`kra-!KH%$Vn*nJ(kC%vvhRvMu)A@-0+5Fg&In((yO&t+S9m}VE4=)%l zoB6i^-e8#&aSbYfkk{*3H!9jLVWv>u6@l2x_i;U(elYl9;|F9Zv zxQXHdl^>4|h#QPfh>KaqoSPtifYw6mp!E>%5;ry6%y1LK%?mdz+^leu!p#XcC7Ylw zXfw10+6rxhwnIChoe(z>+&t`pc0=4G?1A<|+zfCN&;#v<4nVvpF7COg=VG3VcrM<# zXy;;`i*zo|xhU_2a!?=i7W6js4)iYc9`ru+0rVks9{LFS82SYI6#5MM9Qp$K5*mV- xnU~|4E!GN%ML#qEaS_G%Fg9GMaDhT&z8!&vp`*|UGzu|}C5U->3@Sqv=nqL66%GIZ literal 0 HcmV?d00001 diff --git a/gamma_age_v2/glower.utc b/gamma_age_v2/glower.utc new file mode 100644 index 0000000000000000000000000000000000000000..c7a3b03683470ff70608677b7914c53456bec29a GIT binary patch literal 4946 zcmeH~*_RVV6vj(gTtFNF6%}>ZQE(UrR8-W-B$Jsy$b=*?F6dB6YBJ6A61pohj4LiE z?mO;}KKSaZe}n&yuljwxWG*V_xSZn?_na^FtJ~F8)i>2QHzykT!IKAuMh+>ZYS6$+ zrM^e&u2JeJ+RXz>T|)a4+QKzT{d$X1r_lZegIneK0b>hyYz4vNf{TJD1WyVs2|gm2 zd&%Z63qB^eB6v!0Rq%1aeBNx%y5NT36M|0)o)-L+;HL#YBluatrvyJI_<6xIf=>(9 zf}4U{g4=?P;90>P!E=Hg!Dj@|3w8y2f_=e(;I81afuQb zGSXFSoM%1sb2`z6#2tTb6nv}T+XUY(c$45eQs!EBLKoAC?*emAw9OEonZ{Uh-?V!m zJ_qeyDBJfSm}3~jEXF{!72@_8`)v^SN8T=Y2blBHzZ0U7cg2+O?v&Zw2aTlt`%~s# z_r$)@QSM=H%*n?CX!zYwLlAQ%c^|}FNgjrnE6MvI=1MZxVXh<}fS4=E2O;K4GS3Bb zCHWzUxsv=a#9T=}1Tj~VAAy)F$&W&(A;$eNh(+0uVp>q`DB%`eCQoiYDqyu9}+|M~n}jmdIM zn5zrW7QBPxap(t#R)o@5Q%!)GcmK~Z%!iZEPG|*Gg186fpCgbF%sM9XUjR3Z*LAfu zH51j$Eb49D;_$u|oiMT$?PbogzO1Wq-LBE0_FHDAvD7tc!uV~&A}Y1&obdz8D~VNu z(1zNvrFPOUn5Y#xUF!sX>}cptIx=bUfxlqFNM{2|QB|fGRn#qBD)GCa6`V+io^HD7 zg7scAl#f&}j%7WT*|g(#qM3?e?M7>8#}!>w4|;yPZfwy>W~{maL)f=cRPsDLlXeqV z$+sp9dtIAup&SGm#sexr)r4NbXge48$Ab3Kn0V&8)uF|ns=76=J4O{uOD{E?e*EiJ z1Q#cC*{?_9o7V1p4d)>nQPH*+YB!e!ebTYj!0~N1 zOTHI|#XGisX%dfK1zE1VBcnOv`TjqBz( zNz%_*i})Ly(WGC{9=;47*|hIO2ul;5q(APrYdk2+*R>mTdSZUPn0znEc)V>ko-UiO ze;$(SCn6IT%&g;^q(9}4xk0?4`aA+y#`4$;t%y5CxBot8K0H|~*K}N*`q-6sbrfY6 zasT+)p3|KvS>q+ns&Y+kGwpR zy}!0~{^E>dXS@(6YpFV8zDlyB6ZVhIJ6DJ8qi)3f4m#pp6i#em*9vd{+0Y>RHXRif8rCs-0CetMox= z3$zv525pCSKs%vb&~AuTHLK}8&|ZjD^ANNTVs*@_m=AIQIta1qWwpyHm(?w+T2`~H zVp+YiYGt*`Ds>dfL1WPS&F2yaY6_R2Tn*(B#1<-s!hugnPe#uP7@`r5QtymGx#BX0A?Bo z%1D#l^<&m{rybwh>z*7|&y-T*U=!R0-^Yr$FricjwMGmPKM`jTzX1fb#t(14iZyEP@JcBKmmaLiBgX}2<|7ip6B>-6YO2C zSwvo92?@uS9XU?T74X32tB56dSCVViT|`hDAn!$Ng1iH<1@g^^ZICt3xC8Q?eTh?} zt+XU>$)i%2Iv3AMjHw}RlR%s3O~Qtb1tV9I2U(QbDCrO9S$m=MZS)uk8u_|cY;@n+ zlg@gQ|Bls?-2N6w+BPv#NDYVERtL{*G<1uaCi%DiA`JgYjP~Z1+91n$juQ1G6w}n1 zJuXI?S&~X-Bgt{c(AW&*&TW~udg3WIl{WD&7iCytz)On4n_U90{8C+ za*?K@vtr(ewc=eB$ANwvG$75l0n%(V H74^vIanbrYN-?<Yj~j|qQV_+jBs2!GN#*U(ee zaeJ!CXt)3+eYWtW!q*GmBD`IAxA48fUE!m`4+%di{Fv|)*2iOPr{OHsR;9j2fvUO$ z$Y9$=U^3vo6Rh+6=G!)&=UncD;C2Sf3nPnv$IVR><9<-6Yr!ONF}MZrxU9DTMluc_ zlgH*b7eTvpQ;~XS1_iGTSqnO?uS3aa zBHPyk&pNL&?^U+*I7h5+M0wo$CX}bFUx)H1>(`_F#X8UFSL>Tm{%-w7lz&>k3FSmw zJg$YC0fW8;@ZO_yt*xa4zyP?eccDD zMztBQY=XwmRc_FDe#k9xQcl(%a19_t}#?9^dB&~7T3^mZrA`HmMRy`<|wV7#!=yhD#RoP7kQzvz4QWOp^k{veyDf~mOZsc9hj@EW%>)_K?|3GzcX`dO9}TE5gbD1x z;V~9QD}E`ejr%!i!N1ThNcoX=Co_V&@}F+v|p*< z`bNj%AI$1dqXOaaWj&fn(Gb;JT|Hn|KvYlTA!33KGi=;wJYxTNeB2T@M&qlRGG;7l zXd3Xt!C6rLb0&F-HKE>yb|x*doxk9RINRvSe)K4&k8bEIoBqDRWPMDv4b^xVCEIIU zA0>=>n%%DL0!iw=SB{oQ@&nZ4C6YAYu~_meMIBDDJ@{S;kG9FSR;yxxB%6Y0btFSU zS6m%QwT`8MAt(L%UeT@$oY2H!>{xW-yO)#0H$R{JJn;#DPk(-ib5fW!@++8c1HK`c z6;1{Gdgnwk>ze^)0!}!yI%ads;+VZLYh$*?ERES2vodC53&29K2rLFmz*4XbEC(yV zO2DjX6<7_{0A@vN!8*X~hglD^osD1w5xfLm2Cslu!E4}k@CG;r-UM%fd;&fNpMlT8N$>?Y1-=Adfv>@7@D2DDd+R7bC3ZopcS-%WPbQH m!{D0b*UWa%0d{~+&;@c}C&+^W=mtGt7w83?=iRp4gYq9Bm?=d7 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/gren.utc b/gamma_age_v2/gren.utc new file mode 100644 index 0000000000000000000000000000000000000000..bf089b868e6694c4677c52151d2ce86a6e8ed5f1 GIT binary patch literal 6253 zcmeI0TbCSF8HTqS)JRAWP>BduLJ*WN2}x9tDCwD=lbKA~?hX+X=t!xF`6EU@f>WI26o!)nysM8-j;|Bf+uYrvz^bP6Uqxr-H5EvEZi#XM%IV zPH-W3OYpYf9l;a99~JyD!5MI_uQ5J<9kdT(nj1W0iL1jt zjQPD5qVYM6_d1N}mTQDW6nvN9w+jvg9};|6@ZI3rjsWVi?h*VB!S@QjPw+dzwY{qb-0z3#JdX-~ z0L=A3n}gn6l2XTT=e|ih4%KNN6np~AF`%7&0L1K)VLQt0dc+1e-h$) z1)FY}EZ22})x5PJBP{8Vk5;)~)0%Ovvytv6zQ9h=&t#LDCU%o5YI(gF zr^CFrZnk|`SI3EPRmT?Tpkv%pT;Y-6h6Y5Dfp7wtuLuoC<>9v=TwPO0xT`S$0 z-|j>)x^(t@x8IH8VKjT*-sQJUvK8mE=UtoSR^&Ht5_ZHi|8)~?O255?s*2}pyZrWi z9GdYg{n{=c^|wVLp6~M8D>}s-nwGy-`C>k<7(KxJNo>~ZY_czCmA|56KSwLStDUo! z-!;Rc9zEHkN_2A|VAQ)V8S+34G}sH3axI7wu{2Ii{tm#rNvZpD7~;=5OGZxjh? zXAG@0? zv#ax)uD|N}h1_IKvk|AJ^3SL9i7hLHnUf@IC?0j8Eg_|FRlR@KVQ5*{=*J0mnKEc0 z(Rp4!MEX@{M#5E#PZ#mHHw$g)#5iZB``LmWjWFJ2*}R~axy+`<`b-@_S)K@}$~RkP zx<73pJDW|=C5+ZKW1II{Hs=SR^!+B;%@5k~0 zxQy`N99qMZn|#Pp4&s$1!}h{wf;`aW`y_BS=$jz4csUtol1Y$S?CMF-Dl!vbP3kxe zR*I2M^SQaX!0d1i2AJD{i%gsa17pSkYKAK0So(*8Ze%8bMp`T-OucxBP6)7p1WCMQ zg4~2jF))>vBTf+EC1TS_upPT7NVz7>T$M?jM!Fxnz^15GSq_TD^vaJ0+mS&DsKF!% zb&A&>+mN#os928Hp@crFfqcUZiI6On$DWAin+FOf?a?RP#fO0l;MncpD5^62+%#yVjKU_|s_f>oH7#n}yJ8*HX_J28Wy34B1K$_*u*vpF)& z;=aj)JStG-!sRhu%Y5zP@LA=4? z&8!Y1^aL`~Xjb|_grf0w4KSLi$>xGRm>|rS6Q#79cTV&MW}_F?yUKnafbux-_4Ay& zN{A1X1O7R7^>SOOeVY!-jipWizuH*p0DQb)&h@ps$>(6x5Fa4>yqAx$t<;Y==w?t? z1zB-Vsa=dfhAP+j+O+TY6Ex_?bi23hqJcYp{6TVvPl^b<7ZWx`8+7@`;ab9~C_ez% zBR4?&`N9uD9)|dng$Fc#*zJS(6Je(2e{S3X z@n;5qV({k$58DBB2s#Yi4IP2*f%x;`Ug$oEKNoNKVP!nDe literal 0 HcmV?d00001 diff --git a/gamma_age_v2/gren001.utc b/gamma_age_v2/gren001.utc new file mode 100644 index 0000000000000000000000000000000000000000..7344af01c8cf570a7373bd1c8fe4b8382367ca53 GIT binary patch literal 6258 zcmeI0Ns}B$8HN+EFv7BIY=JGzQd*1+mdCOrK*j>pGd-gjJQ_9KEz5f=yE><rb zyL68Ueq8Vqf_s853)X`Bf;xBrw*^lG?+Bg>ep>K{1bID}ui&_-lf{F8D>k-w^yw!QT@6lHhL({*K`93jUtp z?+gBc;2#S9k!Q~JAA5c!-U&STrgPwH@TUDT#JD#?&-gf4##cCoUkmMnnC3N}vBcFK z-jDgc8lu|+F%93fAJZ|9KS0cfdE5`Z7TOCvga|B`_GLzftLs6tE}Q<>^8v@W`yq`8 z-+t|$AIwPeHg4ZFI^+xDf zpYd&AUzB>2;5Q3?i{Q5k4g?<(d|2=iaP5u)>auPZ{5HWHt2)k|g5M6V-8*W)`!1-C ze@yV*;NL=Y3(&huQtBSO>%5MG>$LX@J^|)9(Vc`i9(1Rmdc5BW=G>xt7sN59V>z5t z6u&*}Z@T*+&Jm`055#^XbAHu)M(}&Vbd2-9k}7_`XTHut0|HzFV!b(M7a^s7f0lJv zD!FYZ6paY&i2tER4zqcVeatAt!K_YjdW1cU9k9&R)e9H4B@EOk!ftz5uhas+Q zuE9s3Qz(n>(dzXd8P)%naq4mZZ}aill;v`)=>C_qRm!VrulB?L?;PNoc?{xG<6iVQ z#Pve^35e^F`#=vm4Nu0u4AGHwN!6o|7nd^QhfovoYi@z*>Ns698YkMBw#nOO6Z?q{ zO%WQUa%?5miR5Z6UmK0kCY@BiYpF9?R*apm z!n(CJmJv2=%VeXb(Jm_OMLU=-iZ*wg&K&C0(&3gK8r3wRo_6C||2Hy})vgu+7j%`qs$)M# zE4!dtoIA|VxdFoXUtwQDA4<0r$(5?qC7o=wvHt2f8`>3_ zP8#(jUyWVM#;L1wSt_#3q;BSYUhmA9d1Pj@Z_}cVt|oDkNRLg-RcW8IcCfr1``L^C zUOm|?64cVVI7EJ+Br)mGppuxDYN_2AJXz$kMq)N&7`X)78nINTT+Qfu6oX0b?F;D! z^Fu4E@XpvINrRbGcEdT$cZ2b)?4}-J@^g#ucATSI`tYgj<#f>I!kmZe#10FQzn)a% zQpLya=F05q{ATN~3cr|}tZ6pm)KvC`bTP4Ig)noHWF5t$E_5qMDNI%GpS2%a7B>2E zf?cNcT1s@D*MUgC=FCW#YWb-m9{1+HEu9$W%xphfvZE2kyDXaz^fH&(%&|T*15lPH zJgV}|wwdiu+sMvlQ*;TVwawV(y_U`S11N33Nj5V(p6{mk7iN9OX5f>nYloPQ$B*B8 z8`APV$p1o?-6tybLL9v)) z`LSRU8I*t;OoLFT`1Y|4IV*vRD^GF5pCWkk(I*ia0$V{VI>D>{E#wRwwXr?Ax2(G~dVYZworMq$GL~md=dr`f$ z?Drlhj{{$a=iFLC{H5IB!?CrOdrNKGbWrXtbpqJc?oxZ;4+e9tuif=N2b+fY3)$zb ze2l%N4&tDjL0uJO#f_ylF#;K?T<2@kzTZ^PpzG2}Z{nhX!`dN-_^*h-dof{Cv_Y4j z9j+#HFbzfb6MBKhmNuPn;|Ka%dQLkf;7tza zzVDQK-^YIIqjTH7S4wRFec%%4!XVpCrAFW%Z~(sAQfeFg3jvimhg6*GfZ68(I08_n z4xElsb>npQ=mLzfrUy`VD=KH~L1#T>zoOD^K<5k!>nZHF`VP*nbB>wd@wY^8Iu&^OVkSkL z+c;a4aoT<)3mZ>kiO^5aszUec&2=#ov-EkHu}cF=XtPABR;4?%dh!`!pi2spY%Tve ziq=}J&Sr`CRT#dbmSGl266nI-Ri35Y{%3b8J1DYT3LA?V#C&O>6R}qOzH8`ZX^O9P zmQsybAq$g>F0SEgV&(Ow_%FXA*a{it&g(l{)wzFWl}Riu-${kn!Yku7@Tz!CydqY! Yiv4*dybfLkuYnuq_PKR#n_H&*0X!UKW&i*H literal 0 HcmV?d00001 diff --git a/gamma_age_v2/gretvarl.utc b/gamma_age_v2/gretvarl.utc new file mode 100644 index 0000000000000000000000000000000000000000..4a7aac4149895ab5dc86e1d4ea61425dd5f5ca78 GIT binary patch literal 5419 zcmeI0X_FI07{?m~MdeaZ@#Yi|E&?68xWFf-Z16K@pn zTk*b?uV5ALt@0E21^fV(FMOl_|4dKzp{%m7eBle}s(FH}=N2lpAN8+GQO{9o@0CiOKz(+ZQZDL0P|&Ti{6S%j=D6ep_X^Gn z?i1WExFC3+V9q5Se?ag7!GnT_1Q!J#6kHNq7F-cLESUaD=P)Apu;BXy9}#@N;0FXh zDEJ}4qk@kL)`F{oYl7>7jo>lC4Z-7r9l^&0PY8AeHwAlweZeik#{~z1L&1^Yw%|#@ zQ-Y@j&j@~4@FRjB75tds#|1wj_=Mmm1wSSDX~EA3epc{vf}a`k4#&F-x(woYy%4WUo9me+od?h5Iq^JE zFM?Qj>|%&(p1cI&dgfg4ii->R3dMC%0t*b@*HG)?Nz81U> z;uK3P^m^c{V<3bL+MtHHcip0fs`ugGf! z^O>Bn?YE$2;W6uDN_c~1RvV!%Yu{>_&u3HI)}7%THpiU&+=hzJhS~!0ok-paO<3NB znroHq+o4mId7aaicc4CFc_->0Ebl`7ljYk{|7`gV)W2Bf-u9bi#?gE{FkWjnv>eP> zxEo?2?}50M$oD{-E#C{~x?=lY=&J2BQDz_a11SZO?+!@^6_j$8x^o{L|x; z(a(SU3&&sZ)qfcSd{^h7Rak3e?hilOb(aTQRDEEs-3!P3y?^))?}xa*a4#r8+za{6 z!C5KGPpbj}Hotc&q$7_V6gNEOvEEVmz!c=9y?bXXB z$~(!3Mc3yiZl@H&LbHi`(r(gJ@FEig?N(%`FyQ+s#s>`gMH4i0Mn~hZ-Q(A1dc-}K zBOOGTQ&HC@bi=5esp*-D)A4^f63)d4Im0jL*#dvf8X(N)9DBs!*ZOS9j_X+iG@{*! z65=6k9Mn-e&~7GmdcPADeaDN^QL^nIFkaMYKA@*N%rOEpR`tDhdbpZ$Tvs-X!FST` z^Zk17q+`9Q)PSBEYrB}GA2~IQ2XbBGH4G*RH>qqXQ$N-YJ2wgM)=V5uC5@w0IgYM= z#AsB7)2%(^4RSo(Wzt`68Q0Blki^bJ5&UluqlulbQvdxGC%EFibmfe(&+N(;6*ArkOMrwQHitbk}mZ`&Ial?W}V4_JKxco5Z z9~tQe!4KI!+sC9p_VG;ivn}QHSlV$}I^8u|H)EsYX{;=^4Xq@k(*BUKQo|iAvHjWx zOKSUGJr0-j1lUQqqz!mQ*8FBwM~mzTzE{I*ZlSfp7J?=13gSpfr-GpvDXG~;m|)83 zxV~4lQGy#<>P?M0(P%9&Q?0PIZTqgjH1MwJJ#MMoD&|4+A*Lhz45r7Jvhj16TL!lj zreupDZpHL6(;jXw%b?{DKUbMbF@@q2V#>r+i766OBc?=5g_r`ZgjPYTp*7H2XdT2< zW<9h4V#>l)WfQa+VoI_F+6poCV9L=2?SOVdOevU3Foj_1z?6Zh0#gL0222T<3NQue zhB8nO^b+(k^a}JU^cwU!^ak`M^cM6s^bYhc^d9s+^Z|4l`VjgE`WX5I`V{&M`W*TK z`V#sI`WpHM`WEVk=0J0y|GWRQ@Iemhh4N4zl=_FCFf5Eke!}dB2A~7bAT$IOp@UEf OqEE{Z{aS&Bp+5mo#Ula$ literal 0 HcmV?d00001 diff --git a/gamma_age_v2/grey.utc b/gamma_age_v2/grey.utc new file mode 100644 index 0000000000000000000000000000000000000000..0614ba0a84aa630d29abeccc5c3ab3cb9a4726f4 GIT binary patch literal 4633 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 PZ;aPzi09}GGz0wyQBdb! literal 0 HcmV?d00001 diff --git a/gamma_age_v2/gz_chair_use.ncs b/gamma_age_v2/gz_chair_use.ncs new file mode 100644 index 0000000000000000000000000000000000000000..a904cdbe96b436155428c448be4dc4b0697f5840 GIT binary patch literal 224 zcmeZs4ps;=)H85mU|@J42P7Cc6c|{TK@3&~22Ms6HYihuk(GhbivhxCX8iyE{|^Qh zppu)6@*ovc!9st)LRyS44p>SCN%bY5DGXYSO3Z8uV7WLQ0g!GW;E@H9qA;C6Wrr9Q a7?8BGF=18v1#Bf3x>{)lpbNh!FaQ9Xgf0F6 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/gz_chair_use.nss b/gamma_age_v2/gz_chair_use.nss new file mode 100644 index 00000000..a620d086 --- /dev/null +++ b/gamma_age_v2/gz_chair_use.nss @@ -0,0 +1,31 @@ +//:://///////////////////////////////////////////// +//:: gz_chair_use +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + +*/ +//::////////////////////////////////////////////// +//:: Created By: Dom Queron +//::////////////////////////////////////////////// + +// This script was explained by David Gaider/Bioware in this topic. +// You should read this topic if you are interested in Nwn scripting +// http://nwn.bioware.com/forums/viewtopic.html?topic=74275&forum=47 + + +void main() +{ + ClearAllActions(); + float fFacing = GetFacing(OBJECT_SELF); + object oPlayer = GetLastUsedBy(); + object oChair = OBJECT_SELF; + if (GetIsPC(oPlayer)) + { + if (GetIsObjectValid(oChair) && !GetIsObjectValid (GetSittingCreature(oChair))) + { + AssignCommand(oPlayer, ActionSit(oChair)); + AssignCommand(oPlayer, SetFacing(fFacing)); + } + } +} diff --git a/gamma_age_v2/habd_bandages.uti b/gamma_age_v2/habd_bandages.uti new file mode 100644 index 0000000000000000000000000000000000000000..d75e2edfc38868a37d495b7b499eb0a66950037c GIT binary patch literal 1546 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 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/habd_dmdeath.uti b/gamma_age_v2/habd_dmdeath.uti new file mode 100644 index 0000000000000000000000000000000000000000..e4c9a77ea14e6edd3b65d779b62eaccd03259aa8 GIT binary patch literal 1335 zcmah}+iuh_5H*)_S?*BoH>Pi$Qu+9bi258$c)AH*2K-7Qj4| zRiHT-jJN5CatC7ybezo7aSmcZ>VlmEVs^@q}H46$Si8TA|5)@@7IUymZyE1K!yWMJgh=vpS1P=Ti zzk=YsUM9ndl3v?YcD<^$U3D-X>ce;aw;z>K=Yh|F27aw5^$4Sb@h9dht4e)`ev0uL z#y=1Y>JC4UZQxQpQz~ueS6iI}+!SckGl2f*fa~p?ao@M|3mD1O1L$)~C&rVR9m#hEXt&q?oOAzj9*o`XVf;>RU~&(**@AX*-U8^)`E8&R{x@@^{Vu>blr^9} z7>wlWJ}or$t9VPB4w+B89i zQF1KTvf~ru>^Dh2nOtBQNJuJMM(c}uo%%49BHCjsNPcW4jbr=W%1kwpu&{0U5Elw2 zqv)M9RJC~&O)?!JV7qD0`G59rr0G8t%dzRQHLC*i=w#QY;`U4x-!zuJ%9m0_D`Cen zlUAR%zo$mCqc|_S=-@-XV{_y>3-v?eW}OadlegTA(CBA7@c%_38)Ye`YSx{^D8oUM z4*2sNr`KwD_nA3LzodEeQz>4;%p&R@BOlRVR}aL*Oyi^?e!(Vz?{9e<$v(hm+4c(h zw&cFdtg|Kwdc&QVdC;3qB-PP3q`lt0on%ob&L&gs3mr4jVLEe8n1z3JgrFEUXL+jEw*P|Np_jBFzA#|4<^P#Q-*0K$`(< K)&~U!1qJ}2R46h4 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/habd_include.nss b/gamma_age_v2/habd_include.nss new file mode 100644 index 00000000..26221719 --- /dev/null +++ b/gamma_age_v2/habd_include.nss @@ -0,0 +1,1709 @@ +// Hemophiliacs Always Bleed to Death v0_03 +// By Demtrious and OldManWhistler +// +// This file contains: +// - description +// - installation information +// - configuration settings +// - global constants +// - common functions + +/* +INTRODUCTION + +From the same fools who brought you PHB Familiars and UMD by the book, Supply Based +Resting, Party Loot Notification, Permanent Area Effect Spells, Speed Override, +Take Cover (PHB environment AC) and PHB Movement Skills (Balance, Climb, Jump, +Swim, Escape Artist). + +The main intent of this system is that players never instantly die. Player death +will always be caused by player action -- because help didn't reach them in time +and never because of a bad roll of the dice. They will always go through bleeding +before reaching death. There are stabilization checks (10% chance) and bandages +can bring you back to life on a DC 15 heal skill check as per PHB, except that +when stabilized you instantly go to 1 HP. + +One of the unfortunate side effect of playing a real-time game rather than a +turn-based game is that it can be very difficult to react to a player bleeding +in a timely matter. In turn-based play, your party members would know that you +are bleeding and be able to react within one or two round. This system seeks to +restore the ability for your party members to be aware and react. + +With the default settings of this system it should be very rare for low level +players to die if they have party members with them for support. Once they reach +higher levels and have the means to afford Resurrection and Raise Dead then the +time to bleed to death decreases. The intention is to make death a rare +occurrence. After all, with all those local clerics tossing out rez like candy, +its any wonder there's still undead around left to fight. + +The bleed/death system is intended for multiplayer use but CAN be used in solo +play. The respawn system is intended for multiplayer use only but can be used +for single party if the auto-raise feature is enabled. The auto-raise feature +can be configured to use up scrolls. The respawn system can be disabled or +easily replaced with a different system. + +This system was originally built with single-party DMed play in mind, but it +should be able to scale to ANY kind of play. This is the Swiss Army knife of +death systems. The same bleeding/death/respawn system can be used for henchmen +AS WELL as players, removing additional complexity from your module. + +If you want to want to support solo play with this script, then enable the fast +bleed option and set the solo auto-raise option to a very low value. That way +when a player bleeds/dies in solo play they do not have to wait long for help +that will never come. + +THANKS +- HCR team, at one time or another we must have stolen some of your ideas. +- Lazybones for coming up with a name for the system. +- Typhonius, DickNervous, Feds, Ochobee and Blewz for help with the initial play-testing. + +Apologies to anyone who is suffering, or knows someone who suffers with a +hereditary blood-coagulation disorder and takes offense at the name. We thought +it was a rather witty name for a system where players must always go through +bleeding before dying. No offense was intended. + +OTHER WORKS BY SAME AUTHORS + +Demetrious' Portfolio +http://nwvault.ign.com/portfolios/data/1055729301.shtml + +OldManWhistler's Portfolio +http://nwvault.ign.com/portfolios/data/1054937958.shtml +FEATURES + +IMPLEMENTATION NOTES + +- 4 scripts, 3 player items, 2 DM items, 1 placeable. The only NWN content +modified is Raise Dead and Resurrection spells, and the henchmen death scripts +should be modified if you want to enable henchman bleeding/respawn as ghost. +- It uses DelayCommand events scheduled on the players instead of heartbeats. +It only uses CPU cycles when players are bleeding, dying, dead, respawned or +entering/leaving the module. This removes the overhead of searching through the +player list on the heartbeat. +- Delayed commands are rescheduled at the start of a chain to prevent stalled +states when the CPU is overloaded and events start getting dropped. +- DelayCommand is *NOT* a recursive function, so there is no worry about CPU +performance hits. +- All settings are CONST variables that are evaluated at compile time to speed up execution. +- Henchmen only bleed/respawn if they have a master. Potions can be used on +bleeding henchmen as well as any of the normal means of healing another creature. +Henchmen bleeding is implemented by "faking" to 0 to -9 HP bleed with 10 to 0 HP. +FEATURES NOT IMPLEMENTED +- We considered having an option for limiting raising and resurrecting to same +party only (to prevent death penalty griefers) but you cannot invite dead players +to your party so we decided against that. +- We considered storing player location persistently, but all persistent location +systems I have seen require some kind of workaround to store the player location +over a module reset (most common being an additional script in the exit event of +every area). We figured it was better to leave such complexity out of this system +and let the end user choose the persistent location system that is right for their +needs. +- We do not include any kind of bind stone system. But our respawn system can +easily be removed (changing one line in the configuration) so that you can +replace it with the respawn system of your choice. +- Dropped items are not automatically picked up. Dropping large inventories is +laggy enough without adding additional processing. +- There is no ability to change the settings while the module is running. This +is because all the settings are constants to speed up execution. +- It is not possible to make familiars or animal companions bleed because there +is no scripting command for making them rejoin the party as a familiar/companion. +ITEMS: +- All items are stored under Custom5 in the palette or Chooser. +- Automatically given out to players who do not possess them on log in. +- All items have no weight, are worth no money and cannot be sold. +- Items cannot be transferred to other players or dropped. +- There is a Skull item that displays the player's bleed/death/lost XP/lost GP +statistics. +- There is a Bandages item that can stabilize a bleeding player on a DC 15 heal +check or make a respawned ghost follow the player using the bandages. +- There is a Rulebook item that displays how this system is configured for the +module. It displays the penalties as they would currently apply to the PC reading the book. +- There is a DM statistic item that can display the bleed/death/lost XP/lost GP +statistics for an entire party. +- There is a DM force death item that can instant kill players/henchmen without +putting them through the bleeding state. You can tie this in with the prevent +death feature to make death only happen when the DM decides it should. + +BLEEDING: +- Works for players as well as henchmen. +- 10% chance of self-stabilization to 1 HP. +- If going from living to -6 or lower you will be capped at -5 to give you a +good chance to be saved. +- If going from living to dead you will be set to -6 to -9 HP instead of dying. +- Free DC15 heal check bandages can be used to stabilize other players to 1 HP. +- Any healing will stabilize another player. +- Casting raise/rez on a bleeding player stabilizes them to 1 HP or more. (It is +a waste of a spell, but it works). +- Immune to damage while bleeding. You have to bleed to death. +- Regeneration items always stabilize players and keep them from ever dying. +(Defaults to leaving regeneration items on the player) +- Bleeding players are temporarily made invisible to make monsters change targets. +- Players can be made invisible for a configurable amount of time after bleeding +to give them a chance to heal or run away (default is 12 seconds). +- Possessed familiars die instead of bleeding. +- First bleed message tells the total time until death. +- Nearby party members are notified of the bleeding player every round, even +number of rounds between bleeding is greater than one. +- All DMs are notified of when players are bleeding/dying. (default on) +- Number of rounds between bleeding is based off of player level. (defaults to +giving low levels a long time between bleeding to reduce the chance of dying +since they can't afford Raise/Rez) +- Fast 1sec bleed when playing solo without a party. (default off) +- There is an option for preventing player death until they reach a certain +level. (default is 4). The DM Force Instant Death widget can bypass this setting. + +DEATH: +- Force auto-respawn after being dead for a specified time. (default 3 min) +- Force auto-raise after being dead or respawned for a specific time. (default off) +- Auto-raise can be configured to only work if the player possesses raise dead / +resurrection scrolls that are consumed in the process. If this is enabled then +the dying can never cause raise dead/resurrection scrolls to be dropped or destroyed. (default off) +- Additional force auto-raise timer for solo players only. (default off) +- Henchmen have their own separate auto-respawn and auto-raise timers. +- DMs can bring dead players back to life with no penalty by using a DM heal. + +HENCHMEN BLEEDING AND DEATH: +- The same bleeding/death/respawn system can be used for henchmen by modifying +your henchmen OnDeath scripts. Requires two additional lines to your henchmen +scripts and should be compatible with all henchmen AI provided that they use the +NW_ASC_BUSY condition properly. +- Henchmen support does not require any other modifications. + +PENALTIES: +- Separate % GP/XP penalties for respawn, raise dead and resurrection. +- XP penalty can be configured to prevent level loss (default no level loss). +- GP penalty can be configured to have a maximum amount to take (default 10,000gp max). +- If dropping/destruction of all gold is enable, then no gold will be lost to the +penalty (since the player drops the items before the penalty is applied). +- There is no penalty for henchmen bleed/death. +- User defined functions called at bleed, respawn, raise and rez that can be +used to apply other penalties without having to go deep into the internals of our code. + +ITEM DROPPING ON DEATH: +- Item dropping on player death can be configured as any combination of the +following options. Any options can be configured to do nothing (0), drop item (1) +or destroy item (2). The conditions are evaluated in an order of precedence. + - Drop nothing. (default) + - Drop all gold. (this will avoid any GP penalties since gold is dropped before + penalty applied) + - Drop equipped left-hand/right-hand items. + - Drop a random equipped item. + - Drop the most expensive equipped item. + - Drop all equipped items. + - Drop Raise Dead / Resurrection scrolls. + - Drop a random backpack item. + - Drop the most expensive backpack item. + - Drop all backpack items. +- Dropped items are NOT automatically re-equipped or picked up. +- If players forget to pick up items they dropped, they are automatically +reminded every 30 seconds. +- The placeable created to store dropped items is automatically destroyed when it empties. +- If all of the drop settings are disabled then the placeable is not created. +- There is an option to destroy dropped items rather than store them in a placeable. + +PERSISTENCE: +- Persistence can be disabled with a flag. (default enabled) +- Persistence only works with a multiplayer server. It has no effect in single +player (no OnClientLeave event in single player) +- Statistics to keep track of how many times the player has bled/died in total, +how many times since the server was restarted, and how much gold/XP the player +has lost in total from penalties. +- Persistent DB functions for storing bleed/death/respawn state. +- Auto-respawn and auto-raise timers are stored persistently at various increments. +- Players remain in the same state over module restarts, even with local vault +characters. +- Persistent data is stored with one DB write at OnClientLeave and one DB read +at OnClientEnter. It is very fast with minimal DB size (less than 1kb per player record). +- When bleed/death/respawn is restored at player log in, it does not reapply the +penalties or falsely increment the statistics. + +RESPAWN: +- Can be used with other respawn systems (default uses our system) +- Option to disable death GUI to remove respawn. (Default GUI enabled) +- Option to disable respawn button but leave death GUI (Default respawn button enabled) +- Additional system to respawn as a ghost with no player control. (default enabled) +- Using bandages on respawned ghost makes them follow you if you are in the same +party (simulates carrying a corpse). +- Living players can barter with respawned ghosts (simulates search the players +corpse for scrolls, except corpse has a say in what is taken). +- Respawned ghosts cannot be DM moved by shift-click. +- Respawned ghosts cannot be recovered in single player by using the dm_heal console +command. So the respawn state could be used as permanent death in a single player +game by setting the auto-respawn timer to 0.1. +- Casting raise or rez brings respawn ghost back to life, but applies raise/rez +penalty on top of respawn penalty. +- DMs can bring the "ghosted" PC back to life by toggling invulnerability (no +penalty). Casting raise or rez also works, but DM heal does not. + +*/ + + +// **************************************************************************** +// INSTALLATION +// **************************************************************************** + +/* +// If you are unsure of which scripts are currently associated with your module +event, go to your +// Module Properties and click on the Events tab. + +// #1: Change your Module OnPlayerDying script to "habd_onpcdying". + +// #2: Change your Module OnPlayerDeath script to "habd_onpcdeath". + +// #3: (Optional) Change your Module OnPlayerRespawn script to "habd_onpcrespawn". If you wish +// to use a different respawn system then make sure the HABD_RESPAWN_SCRIPT variable in +// "habd_include" is set to the script you want to use. + +// #4: Add the following line to your module OnActivateItem, OnClientEnter, +// OnClientLeave, OnUnAcquiredItem, nw_s0_raisdead, nw_s0_resserec scripts: +#include "habd_include" + +// #5: Add the following line to your module OnActivateItem script: +if (HABDOnActivateItem(GetItemActivator(), GetItemActivatedTarget(), GetItemActivated())) +return; + +// #6: Add the following lines to your module OnClientEnter script: +HABDGetDBOnClientEnter(GetEnteringObject()); +DelayCommand(6.0, HABDItemsOnClientEnter(GetEnteringObject())); + +// #7: Add the following line to your module OnClientLeave script: +HABDSetDBOnClientLeave(GetName(GetExitingObject())); + +// #8: Add the following line to your module OnUnAcquiredItem script: +if (HABDOnUnAcquiredItem(GetModuleItemLostBy(), GetModuleItemLost())) return; + +// #9&10 automatic: Imported the habd_nw_1_31.erf file to replace your nw_s0_raisdead +// and nw_s0_resserec scripts with SoU 1.31 compliant ones. + +// #9 manual: Open nw_s0_raisdead. It should look like: +if(GetIsDead(oTarget)) +{ +//Apply raise dead effect and VFX impact +ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eVis, GetLocation(oTarget)); +ApplyEffectToObject(DURATION_TYPE_INSTANT, eRaise, oTarget); +// HABD CODE START +// Apply the user defined effects. +HABDApplyPenaltyIfDead(oTarget, SPELL_RAISE_DEAD); +// HABD CODE END +} +// HABD CODE START +HABDCureRespawnGhost(oTarget, SPELL_RAISE_DEAD); +// HABD CODE END + +// #10 manual: Open nw_s0_resserec. It should look like: +if (GetIsDead(oTarget)) +{ +//Declare major variables +int nHealed = GetMaxHitPoints(oTarget); +effect eRaise = EffectResurrection(); +effect eHeal = EffectHeal(nHealed + 10); +effect eVis = EffectVisualEffect(VFX_IMP_RAISE_DEAD); +//Apply the heal, raise dead and VFX impact effect +ApplyEffectToObject(DURATION_TYPE_INSTANT, eRaise, oTarget); +ApplyEffectToObject(DURATION_TYPE_INSTANT, eHeal, oTarget); +ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eVis, GetLocation(oTarget)); +// HABD CODE START +HABDApplyPenaltyIfDead(oTarget, SPELL_RESURRECTION); +// HABD CODE END +} +// HABD CODE START +HABDCureRespawnGhost(oTarget, SPELL_RESURRECTION); +// HABD CODE END + +// #11.1: Optional, for bleeding/respawning henchmen open up your henchmen OnDeath event scripts (ie: nw_ch_ac7) and add the following line to the top: +#include "habd_include" +// #11.2: Add the following line as the first line inside of the main function. +void main() +{ + // HABD CODE START + if (HABDMakeHenchmanBleed()) return; + // HABD CODE END + +// #12: Open up "habd_include" and go to the configuration modification section. +// Change the configuration as it suits your needs. Make sure to save the include +// file and recompile your module to ensure that the settings take effect. + +See PDF file for additional information. +*/ + + +// **************************************************************************** +// CONFIGURATION - MODIFY THIS SECTION +// **************************************************************************** + +// BLEEDING SETTINGS +// +// HABD_SOLO_FAST_BLEED +// If set to TRUE, then players without a party go through the bleeding stage +// VERY fast. This is useful for single player modules or when people are +// playing solo in a multiplayer module. They will still have the stabilization +// chances from bleeding to death without having to wait such a long time to die. +// +// HABD_NERF_REGENERATION_ITEMS +// Regeneration items will cause the player to never bleed to death. This is +// how AD&D intended them to work. Unfortunately that also means that characters +// with regeneration items will never die with this bleeding system. This is why +// regeneration items should be very rare, yet few people set up their campaigns +// that way. +// If you set this variable to TRUE, it will enable a workaround that unequips +// regeneration items when the player starts bleeding. +// +// HABD_NO_DEATH_BEFORE_LEVEL +// This will turn death off until the players have reached a certain level. +// Players are NEVER notified that this setting is turned on (to prevent abuses). +// From the player's perspective it will always look like they are stabilizing. +// +// HABD_POST_BLEED_INVIS_DUR +// Setting this value greater than 0.0 will give players invisibility for the +// specified period of time after they recover from bleeding. This is to give +// them a chance to heal or run away. +// +// HABD_ROUNDS_PER_BLEED_* +// These variables are used to set how many rounds it takes to bleed -1 HP +// based on the player level. If you set the value to 0, the player will +// instantly bleed to death. Do not set to a negative value. + +const int HABD_SOLO_FAST_BLEED = TRUE; +const int HABD_NERF_REGENERATION_ITEMS = FALSE; +const int HABD_NO_DEATH_UNTIL_LEVEL = 0; +const float HABD_POST_BLEED_INVIS_DUR = 12.0; +const int HABD_ROUNDS_PER_BLEED_01 = 3; +const int HABD_ROUNDS_PER_BLEED_02 = 3; +const int HABD_ROUNDS_PER_BLEED_03 = 3; +const int HABD_ROUNDS_PER_BLEED_04 = 3; +const int HABD_ROUNDS_PER_BLEED_05 = 3; +const int HABD_ROUNDS_PER_BLEED_06 = 3; +const int HABD_ROUNDS_PER_BLEED_07 = 3; +const int HABD_ROUNDS_PER_BLEED_08 = 3; +const int HABD_ROUNDS_PER_BLEED_09 = 3; +const int HABD_ROUNDS_PER_BLEED_10 = 3; +const int HABD_ROUNDS_PER_BLEED_11 = 2; +const int HABD_ROUNDS_PER_BLEED_12 = 2; +const int HABD_ROUNDS_PER_BLEED_13 = 2; +const int HABD_ROUNDS_PER_BLEED_14 = 2; +const int HABD_ROUNDS_PER_BLEED_15 = 2; +const int HABD_ROUNDS_PER_BLEED_16 = 1; +const int HABD_ROUNDS_PER_BLEED_17 = 1; +const int HABD_ROUNDS_PER_BLEED_18 = 1; +const int HABD_ROUNDS_PER_BLEED_19 = 1; +const int HABD_ROUNDS_PER_BLEED_20 = 1; +// When Epic Levels are added in HoTU +const int HABD_ROUNDS_PER_BLEED_21 = 1; +const int HABD_ROUNDS_PER_BLEED_22 = 1; +const int HABD_ROUNDS_PER_BLEED_23 = 1; +const int HABD_ROUNDS_PER_BLEED_24 = 1; +const int HABD_ROUNDS_PER_BLEED_25 = 1; +const int HABD_ROUNDS_PER_BLEED_26 = 1; +const int HABD_ROUNDS_PER_BLEED_27 = 1; +const int HABD_ROUNDS_PER_BLEED_28 = 1; +const int HABD_ROUNDS_PER_BLEED_29 = 1; +const int HABD_ROUNDS_PER_BLEED_30 = 1; +const int HABD_ROUNDS_PER_BLEED_31 = 1; +const int HABD_ROUNDS_PER_BLEED_32 = 1; +const int HABD_ROUNDS_PER_BLEED_33 = 1; +const int HABD_ROUNDS_PER_BLEED_34 = 1; +const int HABD_ROUNDS_PER_BLEED_35 = 1; +const int HABD_ROUNDS_PER_BLEED_36 = 1; +const int HABD_ROUNDS_PER_BLEED_37 = 1; +const int HABD_ROUNDS_PER_BLEED_38 = 1; +const int HABD_ROUNDS_PER_BLEED_39 = 1; +const int HABD_ROUNDS_PER_BLEED_40 = 1; + + +// DM NOTIFICATION SETTINGS +// +// HABD_DM_NOTIFICATION_ON_BLEED +// If TRUE, it will SendMessageToAllDMs when a player bleeds. +// This can generate a lot of spam on the DM channel. It is only intended for +// use with single party games. +// +// HABD_DM_NOTIFICATION_ON_DEATH +// If TRUE, it will SendMessageToAllDMs when a player dies. +// +// HABD_DM_NOTIFICATION_ON_PENALTY +// If TRUE, it will SendMessageToAllDMs when a gets an XP/GP penalty from respawn/raise/rez. +// +// HABD_DM_DISPLAY_STATS_TO_ALL +// If TRUE, using the DM statistics item will display the statistics to all DMs. +// If FALSE, it will display only to the DM using the item. +// Setting it to TRUE is useful when you want to capture such info into your +// DM Client log file. +const int HABD_DM_NOTIFICATION_ON_BLEED = TRUE; +const int HABD_DM_NOTIFICATION_ON_DEATH = TRUE; +const int HABD_DM_NOTIFICATION_ON_PENALTY = TRUE; +const int HABD_DM_DISPLAY_STATS_TO_ALL = TRUE; + +// TIMER SETTINGS +// +// All timers start counting from the moment the player dies. +// +// HABD_FORCE_RESPAWN_TIMER (AUTO-RESPAWN) +// HABD_NPC_FORCE_RESPAWN_TIMER (AUTO-RESPAWN) +// Set this to a value greater than 0.0 to force respawn after a certain amount +// of time has lapsed. If players remain lying dead for long enough, they will +// be forced to respawn. Auto-respawn timer must be less than the auto-raise timer +// if the auto-raise timer is enabled. +// +// HABD_FORCE_RAISE_TIMER (AUTO-RAISE) +// HABD_NPC_FORCE_RAISE_TIMER (AUTO-RAISE) +// Set this to a value greater than 0.0 to force raise after a certain amount +// of time has lapsed after death. If players remain lying dead or respawned +// for long enough, they will be forced raised. Autorepawn timer must be +// less than the autoraise timer if the autoraise timer is enabled. +// +// HABD_SOLO_FORCE_RAISE_TIMER (AUTO-RAISE FOR SOLO ONLY +// Set this to a value greater than 0.0 to force raise solo players after a +// certain amount of time has lapsed after death. If the player remain lying +// dead or respawned for long enough, they will be forced to respawn. +// +// HABD_FORCE_RAISE_USES_SCROLLS +// Set this value to TRUE to have force raise consume scrolls. If the player or +// henchmen does not possess any standard raise/rez scrolls then they will not +// be force raised. Note: this will keep raise/rez scrolls from being +// dropped on player death. +const float HABD_FORCE_RESPAWN_TIMER = 0.0; +const float HABD_FORCE_RAISE_TIMER = 0.0; +const float HABD_SOLO_FORCE_RAISE_TIMER = 0.0; +const float HABD_NPC_FORCE_RESPAWN_TIMER = 0.0; +const float HABD_NPC_FORCE_RAISE_TIMER = 0.0; +const int HABD_FORCE_RAISE_USES_SCROLLS = FALSE; + +// PERSISTENCE SETTINGS +// +// HADB_DB_PERSISTENT +// If set to FALSE, persistent data won't be stored. If you are making a single +// player module, the persistent data won't be stored anyways because the +// OnClientLeave event shuts down the module before it writes to the database. +// +// HABD_DB_NAME +// The name of the database to store the persistent information. If you leave it +// with the default value then the same DB will be used for all modules you run. +// If you want to use different databases for different modules then change the +// name. +const int HADB_DB_PERSISTENT = TRUE; +const string HABD_DB_NAME = "HABD_MOD_DB"; + + +// PENALTY SETTINGS +// +// Set values for the respawn/raise/rez penalties. +// The value is a percentage of the total XP to get to the next level or +// the total GP coinage the player possesses. Set a value of 0 if you do not +// want a penalty. Set a value of 100 if you want the player to lose a level or +// to lose all of their GPs. +// If HABD_DROP_GOLD is set to TRUE, then the gold penalties won't do anything +// because gold is dropped before the penalties are applied. +// +// HABD_RESPAWN_*_LOSS +// Penalty for respawning. +// +// HABD_RAISE_*_LOSS +// Penalty for being raised from the dead. +// +// HABD_REZ_*_LOSS +// Penalty for being resurrected. +// +// HABD_NO_LEVEL_LOSS_FROM_XP_PENALTY +// Set this to FALSE to allow XP penalty to cause level loss. If set to TRUE +// then the penalties can cause a player to lose a level. +// +// HABD_MAX_GP_LOSS_FROM_GP_PENALTY +// Set this to a value greater than 0 to set a maximum GP loss. Regardless of +// the percentage penalty they will will only lose a maximum of that amount. +const int HABD_RESPAWN_XP_LOSS = 100; +const int HABD_RESPAWN_GP_LOSS = 0; +const int HABD_RAISE_XP_LOSS = 10; +const int HABD_RAISE_GP_LOSS = 0; +const int HABD_REZ_XP_LOSS = 5; +const int HABD_REZ_GP_LOSS = 0; +const int HABD_NO_LEVEL_LOSS_FROM_XP_PENALTY = FALSE; +const int HABD_MAX_GP_LOSS_FROM_GP_PENALTY = 10000; + +// ITEM DROP ON DEATH SETTINGS +// +// Set these constants to 1 if you would like to drop specific things at +// time of death. Set the constant to 2 if you would like to have the dropped item destroyed. +// Plot items are NEVER dropped or destroyed. The is an order of prescendence to the +// operations. +// +// Dropped items are NOT automatically repossessed when the player returns +// to life. This is to reduce lag. The placeable that stores the dropped items +// with automatically notify the player if it still contains items and +// self-destructs when it is empty of items. +// +// HABD_DROP_GOLD +// Drop or destroy all gold the player possesses. This happens before any penalties are +// applied, so the GP penalties will not do anything if this is enabled. +// +// HABD_DROP_WEAPON_SHIELD +// Drop or destroy the items equipped in the left and right hand slots. +// +// HABD_DROP_RANDOM_EQUIPPED +// Drop or destroy a random item from the players inventory on death. +// +// HABD_DROP_MOST_EXPENSIVE_EQUIPPED +// Drop or destroy the most expensive item the player has. +// +// HABD_DROP_EQUIPPED +// Drop or destroy all equipped items (including left and right hand slots). +// This setting overrides HABD_DROP_WEAPON_SHIELD. +// +// HABD_DROP_RAISE_REZ +// Drop or destroy any Raise Dead or Resurrection scrolls in the backpack. +// +// HABD_DROP_RANDOM_BACKPACK +// Drop or destroy a random item from the players inventory on death. +// +// HABD_DROP_MOST_EXPENSIVE_BACKPACK +// Drop or destroy the most expensive item the player has. +// +// HABD_DROP_BACKPACK +// Drop or destroy any items in the backpack (including Raise Dead / Resurrection) +// This setting overrides HABD_DROP_RAISE_REZ. +// +// 0 - off +// 1 - drop +// 2 - destroy +const int HABD_DROP_GOLD = 0; +const int HABD_DROP_WEAPON_SHIELD = 0; +const int HABD_DROP_RANDOM_EQUIPPED = 0; +const int HABD_DROP_MOST_EXPENSIVE_EQUIPPED = 0; +const int HABD_DROP_EQUIPPED = 1; +const int HABD_DROP_RAISE_REZ = 0; +const int HABD_DROP_RANDOM_BACKPACK = 0; +const int HABD_DROP_MOST_EXPENSIVE_BACKPACK = 0; +const int HABD_DROP_BACKPACK = 1; + + +// RESPAWN SETTINGS: +// +// HABD_RESPAWN_SCRIPT +// This is the script called when respawn is forced. It should be the same +// script as in your module OnPlayerRespawn script. Change this value if you +// want to use the auto-respawn feature with a different respawn system. +// +// HABD_RESPAWN_ALLOWED +// Set this to FALSE to turn off the death GUI. Players will lie there dead +// until someone raises them. +// +// HABD_INSTANT_RESPAWN_ALLOWED +// Set this to FALSE to turn off the respawn option in death GUI (if the death +// GUI is enabled). +// +// HABD_HENCHMEN_GHOST_RESPAWN +// Set this to TRUE to allow henchmen to respawn as ghosts the same way players +// do. If set to FALSE, it will perform the default henchmen death code of +// whatever henchmen AI you are using. +const string HABD_RESPAWN_SCRIPT = "habd_onpcrespawn"; +const int HABD_RESPAWN_ALLOWED = FALSE; +const int HABD_INSTANT_RESPAWN_ALLOWED = FALSE; +const int HABD_HENCHMEN_GHOST_RESPAWN = FALSE; + +// USER DEFINED FUNCTIONS: +// Modify these following functions to add additional status penalties, hooks +// into other systems, or whatever you want. They will be called on the Bleed, +// Respawn, Raise and Resurrection events. IMPORTANT: Do not give CON penalties +// on any events which would have the player at 1 HP (bleeding or raise) because +// you will just make them start bleeding again if their CON goes to a negative +// value. +// +// HABD_USERDEFINED_*_DESC +// If these strings have a value, then the information will be sent to the +// player when the event happens. This description will also be displayed in the +// death rulebook. +// +// HABDUserDefinedBleed() - Called after a player starts bleeding. +// HABDUserDefinedRespawn() - Called after a player respawns with the HABD +// respawn system. Not called with other respawn systems. +// HABDUserDefinedRaise() - Called when the Raise Dead spell is cast on a dead +// or respawned player. +// HABDUserDefinedResurrection() - Called when the Resurrection spell is cast on +// a dead or respawned player. +string HABD_USERDEFINED_BLEED_DESC = ""; +void HABDUserDefinedBleed() +{ + if (HABD_USERDEFINED_BLEED_DESC != "") SendMessageToPC(OBJECT_SELF, "HABD_BLEED: "+HABD_USERDEFINED_BLEED_DESC); +// Do not give the player a CON penalty (by stat penalty or curse effect) after +// stabilizing from bleed since they will only have 1 HP and it will most likely +// just start them bleeding again. +} + +string HABD_USERDEFINED_RESPAWN_DESC = ""; +void HABDUserDefinedRespawn() +{ + if (HABD_USERDEFINED_RESPAWN_DESC != "") SendMessageToPC(OBJECT_SELF, "HABD_RESPAWN: "+HABD_USERDEFINED_RESPAWN_DESC); +// You may have to toggle the plot flag in order to apply negative effects +// depending on whether or not the negative effect would be prevented by the +// the plot flag. +// int iPlotFlag = GetPlotFlag(OBJECT_SELF); +// SetPlotFlag(OBJECT_SELF, FALSE); + // Apply status effects here +// SetPlotFlag(OBJECT_SELF, iPlotFlag); +} + +string HABD_USERDEFINED_RAISE_DESC = ""; +void HABDUserDefinedRaise() +{ + if (HABD_USERDEFINED_RAISE_DESC != "") SendMessageToPC(OBJECT_SELF, "HABD_RAISE: "+HABD_USERDEFINED_RAISE_DESC); +// Do not give the player a CON penalty (by stat penalty or curse effect) after +// they are raised since they will only have 1 HP and it will most likely +// just start them bleeding again. +} + +string HABD_USERDEFINED_RESURRECTION_DESC = ""; +void HABDUserDefinedResurrection() +{ + if (HABD_USERDEFINED_RESURRECTION_DESC != "") SendMessageToPC(OBJECT_SELF, "HABD_RESURRECTION: "+HABD_USERDEFINED_RESURRECTION_DESC); +} + +// END OF CONFIGURATION + +// **************************************************************************** +// GLOBALS - DO NOT MODIFY +// **************************************************************************** + +// Item tags. We use constants for the item tags to prevent typos. +const string HABD_ITEM_TOKEN = "habd_deathtoken"; +const string HABD_ITEM_BANDAGES = "habd_bandages"; +const string HABD_ITEM_RULES = "habd_rules"; +const string HABD_ITEM_DM_TOKEN = "habd_dmtoken"; +const string HABD_ITEM_DM_DEATH = "habd_dmdeath"; + +// Placeable to store dropped items in. +const string HABD_PLACEABLE_BAG = "habd_deathbag"; +// How often the bag will check to see if it is empty before destroying itself. +const float HABD_BAG_SELF_DESTRUCT_TIMER = 30.0; +// List of all resurrection/raise dead scrolls +const string HABD_SCROLL_TAGS = ":NW_IT_SPDVSCR501:NW_IT_SPSCROL139:NW_IT_SPSCROL141:NW_IT_SPDVSCR702:"; + +// Player States. These values must all be unique. +const int HABD_STATE_PLAYER_ALIVE = 0; +const int HABD_STATE_PLAYER_BLEEDING = 1; +const int HABD_STATE_RESPAWNED_GHOST = 2; +const int HABD_STATE_PLAYER_DEAD = 3; +const int HABD_STATE_PLAYER_INSTANT_DEATH = 4; + +// Campaign database variable. The persistent information will be stored in the +// database with a 32 character variable name that consists of this variable + +// player's public CD key + character name. We use unique variable names per +// character rather than the built-in unique oPC parameter because oPC is not +// valid in the OnClientLeave event where we store the database. +const string HABD_PERSIST_NAME = ""; + +// Module level local variables. + +// Player HP while bleeding. +const string HABD_LAST_HP = "HABDLastHP"; +// Player state. +const string HABD_PLAYER_STATE = "HABDPCState"; +// Number of times player bled. +const string HABD_BLEED_COUNT = "HABDBleedCnt"; +// Number of times player died. +const string HABD_DEATH_COUNT = "HABDDeathCnt"; +// Amount of XP lost from the penalties. +const string HABD_LOST_XP_COUNT = "HABDLostXPCnt"; +// Amount of GP lost from the penalties. +const string HABD_LOST_GP_COUNT = "HABDLostGPCnt"; +// Number of times player bled since module load. +const string HABD_CURRENT_BLEED_COUNT = "HABDCBleedCnt"; +// Number of times player died since module load. +const string HABD_CURRENT_DEATH_COUNT = "HABDCDeathCnt"; +// Amount of XP lost from the penalties since module load. +const string HABD_CURRENT_LOST_XP_COUNT = "HABDCLostXPCnt"; +// Amount of GP lost from the penalties since module load. +const string HABD_CURRENT_LOST_GP_COUNT = "HABDCLostGPCnt"; +// 1 if the player was forced to respawn from DB (so that penalty isn't reapplied). +const string HABD_FORCED_RESPAWN = "HABDFRespawn"; +// Used to store a local array of the items the player was forced to unequipped +// because the item had the regeneration property. +const string HABD_UNEQUIPED_ITEMS = "HABDUneqdItems"; +// Used to track the object the respawned ghost is made to follow. +const string HABD_GHOST_AUTOFOLLOW = "HABDAutofollow"; +// Used to prevent updating the statistics when the states are reapplied from the DB. +const string HABD_PERSISTANT_REAPPLY = "HABDPReapply"; +// Used to store the player's CD key in the OnClientEnter event. +const string HABD_PERSISTANT_ID = "HABDPCID"; +// Used to store the player's respawn timer. +const string HABD_RESPAWN_TIMER = "HABDPRespawnT"; +// Used to store the player's raise timer. +const string HABD_RAISE_TIMER = "HABDPRaiseT"; +// Used to store the player's old relationship with Hostile faction. +const string HABD_OLD_FACTION = "HABDOldF"; +// Used to store the player's old relationship with Hostile faction. +const string HABD_OLD_FACTION_SET = "HABDOldFSet"; +// Who owns the items in the loot bag? +const string HABD_BAG_OWNER = "HABDBagOwn"; +// Is bleed notification already running? +const string HABD_REPORT_BLEED_RUNNING = "HABDBleedRep"; +// Is this a non-PC bleeding? +const string HABD_NPC_BLEED = "HABDNPCB"; +// Temporarily store the NPCs master +const string HABD_NPC_MASTER = "HABDNPCM"; +// Store the scroll that will be used to bring the player back if +// HABD_FORCE_RAISE_USES_SCROLLS is set to TRUE. +const string HABD_STORED_SCROLL = "HABDSRez"; + +// Turns on developer debugging information. Should not be used. +const int HABD_DEBUG = FALSE; + +// The name and version of this script. +const string HABD_VERSION = "Hemophiliacs Always Bleed to Death v0.03 ALPHA"; + +// **************************************************************************** +// COMMON FUNCTIONS +// **************************************************************************** + +string HABDGetPlayerStateName (object oPC) +{ + int iState = GetLocalInt(GetModule(), HABD_PLAYER_STATE+GetPCPlayerName(oPC)+GetName(oPC)); + switch(iState) + { + case HABD_STATE_PLAYER_ALIVE: return "alive"; + case HABD_STATE_PLAYER_BLEEDING: return "bleeding to death"; + case HABD_STATE_RESPAWNED_GHOST: return "respawned as a ghost"; + case HABD_STATE_PLAYER_DEAD: return "dead"; + case HABD_STATE_PLAYER_INSTANT_DEATH: return "instant death"; + } + return "Unknown State "+IntToString(iState); +} + +// **************************************************************************** + +// Applies XP/GP penalty to the player. Increments global statistics. +// oPC - the player to apply the penalty to. +// iPercXP - percentage of XP to remove (100% = 1 level) +// iPercGP - percentage of GP to remove (100% = all gold) +void HABDApplyPenalty(object oPC, int iPercXP, int iPercGP); + +void HABDApplyPenalty(object oPC, int iPercXP, int iPercGP) +{ + object oMod = GetModule(); + string sID = GetPCPlayerName(oPC)+GetName(oPC); + + // Do nothing if no penalty should be applied. + if ((iPercXP == 0) && (iPercGP == 0) || (!GetIsPC(oPC))) return; + + int nXP = GetXP(oPC); + int nPenalty = iPercXP * 10 * GetHitDice(oPC); //1000 = 100% penalty. + int nHD = GetHitDice(oPC); + int nMin = ((nHD * (nHD - 1)) / 2) * 1000; + + // Should we prevent the player from losing a level? + int nNewXP = nXP - nPenalty; + if (HABD_NO_LEVEL_LOSS_FROM_XP_PENALTY) + { + if (nNewXP < nMin) nNewXP = nMin; + } + // Should we limit the amount of gold taken from the player? + int nGoldToTake = FloatToInt(iPercGP * GetGold(oPC) / 100.0); //0.75 = 75% of players gold + if ( + (HABD_MAX_GP_LOSS_FROM_GP_PENALTY > 0) && + (nGoldToTake > HABD_MAX_GP_LOSS_FROM_GP_PENALTY) + ) + { + nGoldToTake = HABD_MAX_GP_LOSS_FROM_GP_PENALTY; + SendMessageToPC(oPC, "OOC: GP loss has reached maximum cap of "+IntToString(nGoldToTake)+" GP."); + } + // Increment statistics. + SetLocalInt(oMod, HABD_LOST_XP_COUNT+sID, GetLocalInt(oMod, HABD_LOST_XP_COUNT+sID)+nXP-nNewXP); + SetLocalInt(oMod, HABD_LOST_GP_COUNT+sID, GetLocalInt(oMod, HABD_LOST_GP_COUNT+sID)+nGoldToTake); + SetLocalInt(oMod, HABD_CURRENT_LOST_XP_COUNT+sID, GetLocalInt(oMod, HABD_CURRENT_LOST_XP_COUNT+sID)+nXP-nNewXP); + SetLocalInt(oMod, HABD_CURRENT_LOST_GP_COUNT+sID, GetLocalInt(oMod, HABD_CURRENT_LOST_GP_COUNT+sID)+nGoldToTake); + + // Apply XP penalty. + if (nNewXP < nXP) SetXP(oPC, nNewXP); + else + { + SendMessageToPC(oPC, "OOC: XP loss has reached minimum cap to prevent level loss."); + nPenalty = 0; + } + // Apply GP penalty. + AssignCommand(oPC, TakeGoldFromCreature(nGoldToTake, oPC, TRUE)); + // Notification. + string sMsg = "DEATH PENALTY APPLIED: " +GetName(oPC) + " " + IntToString(nPenalty) + " XP ("+IntToString(iPercXP)+"%), " + IntToString(nGoldToTake) + " GP ("+IntToString(iPercGP)+"%)."; + if (HABD_DM_NOTIFICATION_ON_PENALTY) SendMessageToAllDMs(sMsg); + SendMessageToPC(oPC, sMsg); + return; +} + +// **************************************************************************** + +// If the player is bleeding, it will stabilize them with no penalties. If the +// player is dead it will restore them to alive state and apply the penalty +// based on the spell used to restore them. This function does not guard against +// casting on living players because the raise/rez spells already do that. +// oPC - the dead/bleeding player. +// nSpell - SPELL_RAISE_DEAD or SPELL_RESURRECTION +void HABDApplyPenaltyIfDead(object oPC, int nSpell); + +void HABDApplyPenaltyIfDead(object oPC, int nSpell) +{ + object oMod = GetModule(); + string sID = GetPCPlayerName(oPC)+GetName(oPC); + // Check if casting raise/rez on a bleeding player + if (GetLocalInt(oMod, HABD_PLAYER_STATE+sID) == HABD_STATE_PLAYER_BLEEDING) + { + ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectHeal(1), oPC); + FloatingTextStringOnCreature("SUCCESS: stabilized "+GetName(oPC)+".", oPC); + return; + } + // Set player back to alive, assumed that the player is NOT in the alive + // state. Otherwise potential exploit of casting on living players to give + // them penalties. + SetLocalInt(oMod, HABD_PLAYER_STATE+sID, HABD_STATE_PLAYER_ALIVE); + if (nSpell == SPELL_RAISE_DEAD) + { + HABDApplyPenalty(oPC, HABD_RAISE_XP_LOSS, HABD_RAISE_GP_LOSS); + AssignCommand(oPC, HABDUserDefinedRaise()); + } + if (nSpell == SPELL_RESURRECTION) + { + HABDApplyPenalty(oPC, HABD_REZ_XP_LOSS, HABD_REZ_GP_LOSS); + AssignCommand(oPC, HABDUserDefinedResurrection()); + } +} + +// **************************************************************************** + +// Returns the party size of oPC's party. Party size does not include non-PCs. +int HABDGetPartySize (object oPC); + +int HABDGetPartySize (object oPC) +{ + int i = 0; + object oParty = GetFirstFactionMember(oPC); + while (GetIsObjectValid(oParty)) + { + i++; + oParty = GetNextFactionMember(oPC); + } + return (i); +} + +// **************************************************************************** + +// Returns the time interval in seconds that it takes for a player to bleed +// -1 HP. +// oPC - player to get the bleed duration for. +// iNotify - if TRUE and the player is solo then they will receive a warning +// that they are bleeding to death very fast because they do not +// have a party. +float HABDGetBleedTimer (object oPC, int iNotify = TRUE); + +float HABDGetBleedTimer (object oPC, int iNotify = TRUE) +{ + // Is fast bleeding for solo players enabled? + if (HABD_SOLO_FAST_BLEED) + { + // Is the player solo? + if (HABDGetPartySize(oPC) == 1) + { + // Should we warn them? + if (iNotify == TRUE) SendMessageToPC(oPC, "OOC: Bleeding to death very fast because you do not have a party to save you."); + return (1.0); + } + } + // Get the scaled bleed duration based on the player's level. + int iLevel = GetHitDice(oPC); + int iRounds = 1; + switch (iLevel) + { + case 01: iRounds = HABD_ROUNDS_PER_BLEED_01; break; + case 02: iRounds = HABD_ROUNDS_PER_BLEED_02; break; + case 03: iRounds = HABD_ROUNDS_PER_BLEED_03; break; + case 04: iRounds = HABD_ROUNDS_PER_BLEED_04; break; + case 05: iRounds = HABD_ROUNDS_PER_BLEED_05; break; + case 06: iRounds = HABD_ROUNDS_PER_BLEED_06; break; + case 07: iRounds = HABD_ROUNDS_PER_BLEED_07; break; + case 08: iRounds = HABD_ROUNDS_PER_BLEED_08; break; + case 09: iRounds = HABD_ROUNDS_PER_BLEED_09; break; + case 10: iRounds = HABD_ROUNDS_PER_BLEED_10; break; + case 11: iRounds = HABD_ROUNDS_PER_BLEED_11; break; + case 12: iRounds = HABD_ROUNDS_PER_BLEED_12; break; + case 13: iRounds = HABD_ROUNDS_PER_BLEED_13; break; + case 14: iRounds = HABD_ROUNDS_PER_BLEED_14; break; + case 15: iRounds = HABD_ROUNDS_PER_BLEED_15; break; + case 16: iRounds = HABD_ROUNDS_PER_BLEED_16; break; + case 17: iRounds = HABD_ROUNDS_PER_BLEED_17; break; + case 18: iRounds = HABD_ROUNDS_PER_BLEED_18; break; + case 19: iRounds = HABD_ROUNDS_PER_BLEED_19; break; + case 20: iRounds = HABD_ROUNDS_PER_BLEED_20; break; + case 21: iRounds = HABD_ROUNDS_PER_BLEED_21; break; + case 22: iRounds = HABD_ROUNDS_PER_BLEED_22; break; + case 23: iRounds = HABD_ROUNDS_PER_BLEED_23; break; + case 24: iRounds = HABD_ROUNDS_PER_BLEED_24; break; + case 25: iRounds = HABD_ROUNDS_PER_BLEED_25; break; + case 26: iRounds = HABD_ROUNDS_PER_BLEED_26; break; + case 27: iRounds = HABD_ROUNDS_PER_BLEED_27; break; + case 28: iRounds = HABD_ROUNDS_PER_BLEED_28; break; + case 29: iRounds = HABD_ROUNDS_PER_BLEED_29; break; + case 30: iRounds = HABD_ROUNDS_PER_BLEED_30; break; + case 31: iRounds = HABD_ROUNDS_PER_BLEED_31; break; + case 32: iRounds = HABD_ROUNDS_PER_BLEED_32; break; + case 33: iRounds = HABD_ROUNDS_PER_BLEED_33; break; + case 34: iRounds = HABD_ROUNDS_PER_BLEED_34; break; + case 35: iRounds = HABD_ROUNDS_PER_BLEED_35; break; + case 36: iRounds = HABD_ROUNDS_PER_BLEED_36; break; + case 37: iRounds = HABD_ROUNDS_PER_BLEED_37; break; + case 38: iRounds = HABD_ROUNDS_PER_BLEED_38; break; + case 39: iRounds = HABD_ROUNDS_PER_BLEED_39; break; + case 40: iRounds = HABD_ROUNDS_PER_BLEED_40; break; + } + if (HABD_DEBUG) return (6.0); + else return (iRounds * 6.0); +} + +// **************************************************************************** + +// Bring a respawned ghost back to life. +// oTarget - the respawned ghost player. +// nSpell - SPELL_RAISE_DEAD or SPELL_RESURRECTION +void HABDCureRespawnGhost(object oTarget, int nSpell); + +void HABDCureRespawnGhost(object oTarget, int nSpell) +{ + // Do nothing if cast on a player who is still dead. + if(!GetIsDead(oTarget)) + { + object oMod = GetModule(); + string sID = GetPCPlayerName(oTarget)+GetName(oTarget); + // If the player state wasn't respawned then do nothing. + if (GetLocalInt(GetModule(), HABD_PLAYER_STATE+sID) == HABD_STATE_RESPAWNED_GHOST) + { + FloatingTextStringOnCreature("OOC: You have been brought back to life.", oTarget, FALSE); + // Allow the player to take damage. + SetPlotFlag(oTarget, FALSE); + // Set the player back to alive. + SetLocalInt(GetModule(), HABD_PLAYER_STATE+sID, HABD_STATE_PLAYER_ALIVE); + ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_RAISE_DEAD), oTarget); + if (nSpell == SPELL_RAISE_DEAD) + { + HABDApplyPenalty(oTarget, HABD_RAISE_XP_LOSS, HABD_RAISE_GP_LOSS); + AssignCommand(oTarget, HABDUserDefinedRaise()); + } + if (nSpell == SPELL_RESURRECTION) + { + HABDApplyPenalty(oTarget, HABD_REZ_XP_LOSS, HABD_REZ_GP_LOSS); + AssignCommand(oTarget, HABDUserDefinedResurrection()); + } + } + } + } + +// **************************************************************************** + +// Unequip all regeneration items that a player is wearing. Items are stored +// as a local array so that they can be re-equipped later. +// oPC - the player to unequip the items for. +void HABDRegenerationItemsUnequip(object oPC); + +void HABDRegenerationItemsUnequip(object oPC) +{ + // If the player already has unequiped items they never had a re-equip + // call for then do nothing. WARNING: this could potential cause an + // exploit if players can find a way to come back to life without initiating + // the corresponding equip items call. + if (GetLocalInt(oPC, HABD_UNEQUIPED_ITEMS) != 0) return; + + // Go through the players inventory and unequip all of their regeneration + // items. + int iCount = 0; + int i; + object oItem; + object oNewItem; + for (i=0; i 0.0) sMsg = sMsg + "- you have "+FloatToString(HABD_POST_BLEED_INVIS_DUR,3,1)+" seconds of free movement after stabilization.\n"; + else sMsg = sMsg + "- monsters can see you to attack you as soon as you stabilize.\n"; + SendMessageToPC(oPC, sMsg); + + sMsg = "DEATH RULES:\n"; + if (HABD_SOLO_FORCE_RAISE_TIMER > 0.0) sMsg = sMsg + "- raise dead is forced for solo players when dead for more than "+FloatToString(HABD_SOLO_FORCE_RAISE_TIMER, 3,0)+" seconds.\n"; + else sMsg = sMsg + "- there is no solo player forced raise.\n"; + if (HABD_FORCE_RAISE_TIMER > 0.0) sMsg = sMsg + "- raise dead is forced when dead for more than "+FloatToString(HABD_FORCE_RAISE_TIMER, 3,0)+" seconds.\n"; + else sMsg = sMsg + "- there is no party player forced raise.\n"; + if (HABD_NPC_FORCE_RAISE_TIMER > 0.0) sMsg = sMsg + "- raise dead is forced for henchmen when dead for more than "+FloatToString(HABD_NPC_FORCE_RAISE_TIMER, 3,0)+" seconds.\n"; + else sMsg = sMsg + "- there is no henchmen forced raise.\n"; + if (HABD_FORCE_RAISE_USES_SCROLLS) sMsg = sMsg + "- forced raise uses raise dead/resurrection scrolls. If you run out you will not be raised.\n"; + if (HABD_FORCE_RESPAWN_TIMER > 0.0) sMsg = sMsg + "- respawn is forced when dead for more than "+FloatToString(HABD_FORCE_RESPAWN_TIMER, 3,0)+" seconds.\n"; + else sMsg = sMsg + "- there is no forced respawn.\n"; + if (HABD_NPC_FORCE_RESPAWN_TIMER > 0.0) sMsg = sMsg + "- respawn is forced for henchmen when dead for more than "+FloatToString(HABD_NPC_FORCE_RESPAWN_TIMER, 3,0)+" seconds.\n"; + else sMsg = sMsg + "- there is no henchmen forced respawn.\n"; + SendMessageToPC(oPC, sMsg); + + sMsg = "PENALTIES:\n"; + sMsg = sMsg + "- respawn has a "+IntToString(HABD_RESPAWN_XP_LOSS)+"% XP and "+IntToString(HABD_RESPAWN_GP_LOSS)+"% GP penalty ("+IntToString(HABD_RESPAWN_XP_LOSS*iXP/100)+" XP and "+IntToString(HABD_RESPAWN_GP_LOSS*iGP/100)+" GP for you).\n"; + sMsg = sMsg + "- raise dead has a "+IntToString(HABD_RAISE_XP_LOSS)+"% XP and "+IntToString(HABD_RAISE_GP_LOSS)+"% GP penalty ("+IntToString(HABD_RAISE_XP_LOSS*iXP/100)+" XP and "+IntToString(HABD_RAISE_GP_LOSS*iGP/100)+" GP for you).\n"; + sMsg = sMsg + "- resurrection has a "+IntToString(HABD_REZ_XP_LOSS)+"% XP and "+IntToString(HABD_REZ_GP_LOSS)+"% GP penalty ("+IntToString(HABD_REZ_XP_LOSS*iXP/100)+" XP and "+IntToString(HABD_REZ_GP_LOSS*iGP/100)+" GP for you).\n"; + if (HABD_NO_LEVEL_LOSS_FROM_XP_PENALTY) sMsg = sMsg + "- XP penalty CANNOT cause level loss.\n"; + else sMsg = sMsg + "- XP penalty CAN cause level loss.\n"; + if (HABD_MAX_GP_LOSS_FROM_GP_PENALTY > 0) sMsg = sMsg + "- GP penalty is capped at "+IntToString(HABD_MAX_GP_LOSS_FROM_GP_PENALTY)+" GP.\n"; + else sMsg = sMsg + "- is NOT capped.\n"; + SendMessageToPC(oPC, sMsg); + + sMsg = "ITEM DROPPING ON DEATH:\n"; + if ((HABD_DROP_GOLD == 0) && + (HABD_DROP_RAISE_REZ == 0) && + (HABD_DROP_BACKPACK == 0) && + (HABD_DROP_WEAPON_SHIELD == 0) && + (HABD_DROP_EQUIPPED == 0) && + (HABD_DROP_RANDOM_EQUIPPED == 0) && + (HABD_DROP_RANDOM_BACKPACK == 0) && + (HABD_DROP_MOST_EXPENSIVE_EQUIPPED == 0) && + (HABD_DROP_MOST_EXPENSIVE_BACKPACK == 0) + ) sMsg = sMsg + "- there is no item dropping/destruction on death.\n"; + if (HABD_DROP_GOLD > 0) sMsg = sMsg + "- all gold is "+HABDGetDropType(HABD_DROP_GOLD)+" on death.\n"; + if (HABD_DROP_WEAPON_SHIELD > 0) sMsg = sMsg + "- equipped left and right hand items are "+HABDGetDropType(HABD_DROP_WEAPON_SHIELD)+" on death.\n"; + if (HABD_DROP_RANDOM_EQUIPPED > 0) sMsg = sMsg + "- a random equipped item is "+HABDGetDropType(HABD_DROP_RANDOM_EQUIPPED)+" on death.\n"; + if (HABD_DROP_MOST_EXPENSIVE_EQUIPPED > 0) sMsg = sMsg + "- most expensive equipped item is "+HABDGetDropType(HABD_DROP_MOST_EXPENSIVE_EQUIPPED)+" on death.\n"; + if (HABD_DROP_EQUIPPED > 0) sMsg = sMsg + "- all equipped items are "+HABDGetDropType(HABD_DROP_EQUIPPED)+" on death.\n"; + if (HABD_DROP_RAISE_REZ > 0) sMsg = sMsg + "- raise dead/resurrection scrolls are "+HABDGetDropType(HABD_DROP_RAISE_REZ)+" on death.\n"; + if (HABD_DROP_RANDOM_BACKPACK > 0) sMsg = sMsg + "- a random backpack item is "+HABDGetDropType(HABD_DROP_RANDOM_BACKPACK)+" on death.\n"; + if (HABD_DROP_MOST_EXPENSIVE_BACKPACK > 0) sMsg = sMsg + "- most expensive backpack item is "+HABDGetDropType(HABD_DROP_MOST_EXPENSIVE_BACKPACK)+" on death.\n"; + if (HABD_DROP_BACKPACK > 0) sMsg = sMsg + "- all backpack items are "+HABDGetDropType(HABD_DROP_BACKPACK)+" on death.\n"; + SendMessageToPC(oPC, sMsg); + + sMsg = "RESPAWN:\n"; + if (HABD_RESPAWN_ALLOWED) + { + if (HABD_INSTANT_RESPAWN_ALLOWED) sMsg = sMsg + "- player controlled respawn IS allowed.\n"; + else sMsg = sMsg + "- player controlled respawn NOT allowed.\n"; + if (HABD_RESPAWN_SCRIPT == "habd_onpcrespawn") + { + sMsg = sMsg + "- on respawn you will become a ghost and lose control of your player.\n"; + sMsg = sMsg + "- other players can use bandages on your ghost to lead you to help.\n"; + sMsg = sMsg + "- raise or rez will bring the ghost back to life.\n"; + if (HABD_HENCHMEN_GHOST_RESPAWN) sMsg = sMsg + "- same respawn system is used for henchmen.\n"; + else sMsg = sMsg + "- custom respawn system used for henchmen (unknown).\n"; + } else sMsg = sMsg + "- custom respawn system used (unknown).\n"; + } else sMsg = sMsg + "- respawn is NOT allowed.\n"; + SendMessageToPC(oPC, sMsg); + + if ( + (HABD_USERDEFINED_BLEED_DESC != "") || + (HABD_USERDEFINED_RESPAWN_DESC != "") || + (HABD_USERDEFINED_RAISE_DESC != "") || + (HABD_USERDEFINED_RESURRECTION_DESC != "") + ) + { + sMsg = "ADDITIONAL:\n"; + if (HABD_USERDEFINED_BLEED_DESC != "") sMsg = sMsg+"OnBleedStabilized: "+HABD_USERDEFINED_BLEED_DESC+"\n"; + if (HABD_RESPAWN_SCRIPT == "habd_onpcrespawn") + { + if (HABD_USERDEFINED_RESPAWN_DESC != "") sMsg = sMsg+"OnRespawned: "+HABD_USERDEFINED_RESPAWN_DESC+"\n"; + } + if (HABD_USERDEFINED_RAISE_DESC != "") sMsg = sMsg+"OnRaised: "+HABD_USERDEFINED_RAISE_DESC+"\n"; + if (HABD_USERDEFINED_RESURRECTION_DESC != "") sMsg = sMsg+"OnRezzed: "+HABD_USERDEFINED_RESURRECTION_DESC+"\n"; + SendMessageToPC(oPC, sMsg); + } +} + +// **************************************************************************** + +// OnActivateItem event handler. Runs the corresponding functionality based on +// the item's tag. +// oPC - the player activating the item. +// oTarget - the player's target. +// oItem - the item they activated. +int HABDOnActivateItem(object oPC, object oTarget, object oItem); + +int HABDOnActivateItem(object oPC, object oTarget, object oItem) +{ + string sTag = GetTag(oItem); + // Have bandages at the top since they are usually time critical. + if (sTag == HABD_ITEM_BANDAGES) + { + HABDItemBandages(oPC, oTarget); + return TRUE; + } + if (sTag == HABD_ITEM_DM_DEATH) + { + HABDItemDMDeath(oPC, oTarget, oItem); + return TRUE; + } + if (sTag == HABD_ITEM_TOKEN) + { + HABDItemToken(oPC); + return TRUE; + } + if (sTag == HABD_ITEM_DM_TOKEN) + { + HABDItemDMToken(oPC, oTarget, oItem); + return TRUE; + } + if (sTag == HABD_ITEM_RULES) + { + HABDItemRules(oPC); + return TRUE; + } + return FALSE; +} + +// **************************************************************************** + +// Returns the ith element in a comma-separated-value string. If the element +// does not exist it returns an empty string. +// sStr - the CSV string. +// i - the ith element. +string HABDStrTok(string sStr, int i); + +string HABDStrTok(string sStr, int i) +{ + int iIndex = 1; + int iLast = 0; + int iPos = GetStringLength(sStr); + int iDelimiter = FindSubString(sStr, ","); + while (iDelimiter != -1) + { + if (iIndex == i) return GetStringLeft(GetStringRight(sStr, iPos), iDelimiter); + iIndex++; + iPos = iPos - iDelimiter - 1; + iDelimiter = FindSubString(GetStringRight(sStr, iPos), ","); + } + return ""; +} + +// **************************************************************************** + +// OnClientEnter event handler. Used to restore the information from the +// persistent DB. It also resets the bleeding/death/respawn state over +// server resets. +// oPC - player to restore information to. +void HABDGetDBOnClientEnter(object oPC); + +void HABDGetDBOnClientEnter(object oPC) +{ + // Remove any accidental states that might have been stored on the player + // file. + SetPlotFlag(oPC, FALSE); + SetCommandable(TRUE, oPC); + // This might screw things up if you are messing around with the faction + // system a lot. + SetStandardFactionReputation(STANDARD_FACTION_HOSTILE, 0, oPC); + + if (!HADB_DB_PERSISTENT) return; + + string sID = GetPCPlayerName(oPC)+GetName(oPC); + object oMod = GetModule(); + + // Store the player's public CD key. That information is needed for writing + // to the database in the OnClientLeave event (because you can't determine + // the player's CD key after they have left). + SetLocalString(oMod, HABD_PERSISTANT_ID+GetName(oPC), GetPCPlayerName(oPC)); + + // We use packed strings in the database to reduce database access since + // its slow. Database index is limited to 32 characters. + string sData = GetCampaignString(HABD_DB_NAME, GetStringLeft(HABD_PERSIST_NAME+sID, 32)); + // Load statistics + int iDCount = StringToInt(HABDStrTok(sData, 1)); + int iBCount = StringToInt(HABDStrTok(sData, 2)); + int iXCount = StringToInt(HABDStrTok(sData, 3)); + int iGCount = StringToInt(HABDStrTok(sData, 4)); + // Restore the counters. + SetLocalInt(oMod, HABD_DEATH_COUNT+sID, iDCount); + SetLocalInt(oMod, HABD_BLEED_COUNT+sID, iBCount); + SetLocalInt(oMod, HABD_LOST_XP_COUNT+sID, iXCount); + SetLocalInt(oMod, HABD_LOST_GP_COUNT+sID, iGCount); + // Load state + int iHP = StringToInt(HABDStrTok(sData, 5)); + int iState = StringToInt(HABDStrTok(sData, 6)); + int iRespawn = StringToInt(HABDStrTok(sData, 7)); + int iRaise = StringToInt(HABDStrTok(sData, 8)); + // Restore state. + SetLocalInt(oMod, HABD_PLAYER_STATE+sID, iState); + SetLocalInt(oMod, HABD_LAST_HP+sID, iHP); + // Only apply timers if they are enabled. Module settings could have changed. + if (HABD_FORCE_RESPAWN_TIMER > 0.0) SetLocalInt(oMod, HABD_RESPAWN_TIMER+sID, iRespawn); + if ((HABD_FORCE_RAISE_TIMER > 0.0) || (HABD_SOLO_FORCE_RAISE_TIMER > 0.0)) SetLocalInt(oMod, HABD_RAISE_TIMER+sID, iRaise); + // Reapply bleeding. + if (iState == HABD_STATE_PLAYER_BLEEDING) + { + SetLocalInt(oPC, HABD_PERSISTANT_REAPPLY, 1); + int iDmg = GetCurrentHitPoints(oPC) - iHP; + SendMessageToPC(oPC, "HABD_DB: Restoring bleeding by doing "+IntToString(iDmg)+" HP damage."); + ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectDamage(iDmg, DAMAGE_TYPE_MAGICAL, DAMAGE_POWER_PLUS_FIVE), oPC); + SetPlotFlag(oPC, TRUE); + } + // Reapply death. + if (iState == HABD_STATE_PLAYER_DEAD) + { + SetLocalInt(oPC, HABD_PERSISTANT_REAPPLY, 1); + SendMessageToPC(oPC, "HABD_DB: Restoring death."); + ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDeath(), oPC); + } + // Reapply respawn. + if (iState == HABD_STATE_RESPAWNED_GHOST) + { + SetLocalInt(oPC, HABD_PERSISTANT_REAPPLY, 1); + SendMessageToPC(oPC, "HABD_DB: Restoring ghost respawn."); + SetLocalInt(oPC, HABD_FORCED_RESPAWN, 1); + AssignCommand(oPC, ExecuteScript(HABD_RESPAWN_SCRIPT, oPC)); + } + + // Log stuff to the server log for debugging purposes. Remove this later + // to speed things up even more. + PrintString("HABD_DB: Restoring "+sID+" gives "+sData); + PrintString("HABD_DB: Restoring "+sID+" Death="+IntToString(iDCount)+" Bleed="+IntToString(iBCount)+" XPLost="+IntToString(iXCount)+" GPLost="+IntToString(iGCount)); + // Log stuff to the server log for debugging purposes. Remove this later + // to speed things up even more. + PrintString("HABD_DB: Restoring "+sID+" gives "+sData); + PrintString("HABD_DB: Restoring "+sID+" iHP="+IntToString(iHP)+" iState="+IntToString(iState)+" iRespawnTimer="+IntToString(iRespawn)+" iRaiseTimer="+IntToString(iRaise)); +} + +// **************************************************************************** + +// OnClientLeave event handler. Used to store the information from the +// persistent DB. It also resets the bleeding/death/respawn state over +// server resets. +// sName - name of the player to store information about. +void HABDSetDBOnClientLeave(string sName); + +void HABDSetDBOnClientLeave(string sName) +{ + if (!HADB_DB_PERSISTENT) return; + + object oMod = GetModule(); + // Note: GetPCPlayerName does not function in the OnClientLeave event. + // So use the player's name to get the shadowed version we stored in the + // OnClientEnter. + string sID = GetLocalString(oMod, HABD_PERSISTANT_ID+sName)+sName; + // Shadow module level variables to local variables. + int iHP = GetLocalInt(oMod, HABD_LAST_HP+sID); + int iState = GetLocalInt(oMod, HABD_PLAYER_STATE+sID); + int iRespawn = GetLocalInt(oMod, HABD_RESPAWN_TIMER+sID); + int iRaise = GetLocalInt(oMod, HABD_RAISE_TIMER+sID); + int iDCount = GetLocalInt(oMod, HABD_DEATH_COUNT+sID); + int iBCount = GetLocalInt(oMod, HABD_BLEED_COUNT+sID); + int iXCount = GetLocalInt(oMod, HABD_LOST_XP_COUNT+sID); + int iGCount = GetLocalInt(oMod, HABD_LOST_GP_COUNT+sID); + + // Pack data into a string to reduce database accesses. + string sData = IntToString(iDCount)+","+IntToString(iBCount)+","+IntToString(iXCount)+","+IntToString(iGCount)+","+IntToString(iHP)+","+IntToString(iState)+","+IntToString(iRespawn)+","+IntToString(iRaise)+",0"; + // Database index is limited to 32 characters. + SetCampaignString(HABD_DB_NAME, GetStringLeft(HABD_PERSIST_NAME+sID,32), sData); + + // Log stuff to the server log for debugging purposes. Remove this later + // to speed things up even more. + PrintString("HABD_DB: Storing "+sID+" iHP="+IntToString(iHP)+" iState="+IntToString(iState)+" iRespawnTimer="+IntToString(iRespawn)+" iRaiseTimer="+IntToString(iRaise)); + PrintString("HABD_DB: Storing "+sID+" Death="+IntToString(iDCount)+" Bleed="+IntToString(iBCount)+" XPLost="+IntToString(iXCount)+" GPLost="+IntToString(iGCount)); + PrintString("HABD_DB: Storing "+sID+" "+sData); +} + +// **************************************************************************** + +const int HABD_NW_ASC_IS_BUSY = 0x40000000; + +void HABDAssociateBusy() +{ + int nPlot = GetLocalInt(OBJECT_SELF, "NW_ASSOCIATE_MASTER"); + nPlot = nPlot | HABD_NW_ASC_IS_BUSY; + SetLocalInt(OBJECT_SELF, "NW_ASSOCIATE_MASTER", nPlot); +} + +void HABDAssociateNotBusy() +{ + int nPlot = GetLocalInt(OBJECT_SELF, "NW_ASSOCIATE_MASTER"); + nPlot = nPlot & ~HABD_NW_ASC_IS_BUSY; + SetLocalInt(OBJECT_SELF, "NW_ASSOCIATE_MASTER", nPlot); +} + +void HABDRecoverHenchmanInstantDeath() +{ + // Should regeneration items be removed from bleeding players? + if (HABD_NERF_REGENERATION_ITEMS) + { + AssignCommand(OBJECT_SELF, HABDRegenerationItemsUnequip(OBJECT_SELF)); + } + + // Keep the player from taking additional damage while bleeding. + SetPlotFlag(OBJECT_SELF, TRUE); + // Bring the player back from death and make them bleed. + ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectResurrection(), OBJECT_SELF); + int iBleed = 1+Random(4); + // Give them back their master. + //AddHenchman(GetLocalObject(oPC, HABD_NPC_MASTER), oPC); + ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectTemporaryHitpoints(10), OBJECT_SELF); + // Ten minutes should be enough for the NPC to bleed to death. + AssignCommand(OBJECT_SELF, ActionPlayAnimation(ANIMATION_LOOPING_DEAD_BACK, 1.0, 6.0)); + SetPlotFlag(OBJECT_SELF, FALSE); + // Will leave player at -6 to -9 + ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(iBleed, DAMAGE_TYPE_MAGICAL, DAMAGE_POWER_PLUS_FIVE), OBJECT_SELF); + SetPlotFlag(OBJECT_SELF, TRUE); + // stop nearby attackers + AssignCommand(OBJECT_SELF, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectInvisibility(INVISIBILITY_TYPE_NORMAL), OBJECT_SELF, 6.0)); +} + +int HABDMakeHenchmanBleed() +{ + // Only run on henchmen. + if (GetAssociate(ASSOCIATE_TYPE_HENCHMAN, GetMaster()) != OBJECT_SELF) return FALSE; + string sID = GetPCPlayerName(OBJECT_SELF)+GetName(OBJECT_SELF); + object oMod = GetModule(); + if (HABD_DEBUG) SpeakString("DEBUG: HABD OnHenchmanDeath, "+GetName(OBJECT_SELF)+", HP: "+IntToString(GetCurrentHitPoints(OBJECT_SELF))+", master: "+GetName(GetMaster(OBJECT_SELF))+", state:"+HABDGetPlayerStateName(OBJECT_SELF), TALKVOLUME_SHOUT); + + // Check to see if they have bled at all - if not then give them a chance to bleed. + int iState = GetLocalInt(oMod, HABD_PLAYER_STATE+sID); + if ((iState == HABD_STATE_PLAYER_DEAD) || (iState == HABD_STATE_PLAYER_BLEEDING)) + { + // The henchmen is supposed to be dead. + if (HABD_HENCHMEN_GHOST_RESPAWN) + { + // Run the ghost respawn on the henchman. + DelayCommand(1.0, ExecuteScript("habd_onpcdeath", OBJECT_SELF)); + SetLocalInt(OBJECT_SELF, HABD_NPC_BLEED, 1); + SetLocalObject(OBJECT_SELF, HABD_NPC_MASTER, GetMaster(OBJECT_SELF)); + } else { + // Run the normal death stuff. + SetIsDestroyable(TRUE, TRUE, TRUE); + HABDAssociateNotBusy(); + return FALSE; + } + } + else + { + // Player died without going through bleeding. + // Special state for this circumstance. + SetLocalInt(oMod, HABD_PLAYER_STATE+sID, HABD_STATE_PLAYER_INSTANT_DEATH); + // The henchman is supposed to be bleeding. + DelayCommand(1.0, ExecuteScript("habd_onpcdying", OBJECT_SELF)); + DelayCommand(0.5, HABDRecoverHenchmanInstantDeath()); + } + // Keep the associate from healing themselves. Stay dead, dammit! + HABDAssociateBusy(); + // Keep the corpse from fading because we have to bring it back from death. + SetIsDestroyable(FALSE, TRUE, TRUE); + // Check to see if they have bled at all - if not then give them a chance to bleed. + if (GetLocalInt(oMod, HABD_PLAYER_STATE+sID) != HABD_STATE_PLAYER_DEAD) + { + // Player died without going through bleeding. + // Special state for this circumstance. + SetLocalInt(oMod, HABD_PLAYER_STATE+sID, HABD_STATE_PLAYER_INSTANT_DEATH); + } + SetLocalInt(OBJECT_SELF, HABD_NPC_BLEED, 1); + SetLocalObject(OBJECT_SELF, HABD_NPC_MASTER, GetMaster(OBJECT_SELF)); + return TRUE; +} + diff --git a/gamma_age_v2/habd_onpcdeath.ncs b/gamma_age_v2/habd_onpcdeath.ncs new file mode 100644 index 0000000000000000000000000000000000000000..414c837bf24aed1407381b4618c38978aecaebec GIT binary patch literal 10562 zcmb_iTWlOx8J^jTbFu5B!AS~joZ|-5CUw%Lritp(B))7DQ^z)5J2VwlH1N(Fhd?B@aPLG2i+Ab7p5| zXX7+Uq9x|397_&8rjp_dPJ;IJ-xB9sFCboJ`h<{NLm7Wb=K_ozCj&>Luj> z;6waycWJow$A(A7CZ|V7G98)#&IVIy7l2otOeT#dZl~I*Pd+68u0Ff$WJv5PA+KmU zZrvrg!$+4W!bho|T^52gP6@>j+v5S-11UKKsZttZ>~Zf-6KM}gfMpvrAS|VD)~Pj_ z9?dtrhHtqV{vS}BLE(_@qC)P3@N3HJz99gbQ42BfH^eTI*unI`W>|&)cWC=;vtnv< zZ~UneLjVoBbOiEEl?spL{YH~1%x(0XwFJbDStr${(dZzJ#$(asU^*})1r1ZR5D{vH zfM#c0?tx6^$giBhZ9*6}{jK=Zh4?F(m^KngTJ80lVrF)5U0+@x5xbbiT^ z+WYtFz;0ticS9-`1(D>~geqmD6NW`{=sMGkz^wDk)YRyZn(=97RjjMVa;@waROR&P zed=UoSuHKs8|s`_Y^c+fnmS)uuBob5Yn)e&idytbRsCo{jU89Ta>K8k^~;T7rK|wz zEjKDlUZc36YC`?~n)b{-WLvk6umlIU`T;`!O-I9;t{qGf)P|QXXKpvYfvAK@cOSo_ z+OpUUS;N@RO~HA;HqssTxnOtpty3LRpQi(p-$4%z#=eUSP#tte++Ncus0l*AAO)p# zbTsQfA-el0*~g;avvMu^TE6t#d&T3o+!F53W19EUX5hn5ly7Z;ohM8XTBT!1$7A0= zlgS*`Vw>x4o4Cai+o08ro+lYLMl*rOq37H2=zWzuj)c!|jK`yIzWG+N9=*fhp_6e# zaNd6%JRXYa6$!OX>x`k{fFxSvq??UUu(fd^pa^ZO-uo{@`377FVWKYVeI?>To+pVL zQ}tRdY~^t%;=-HY5xB60$BsWmT&T})+J(1w8$-hZNj70Sa1nfMNsKmOYz}*Ng{r)C zMY=r%Io*qfn$92|cqw$MeuSe_h&)A0%BN39o~F#xuSK4w&C~Bjo@UI`AFx#Z0)l6~ zQt_JsjRXU-JDzv3y3~F9m%`Cjh<VK>vFQJ1YG*K)dJ4PnRp_%8HGzqMGnJZ2Bd)XBX+C8z=Y`D%2&Y z@>2(-HgE`SMoNJ8%8HBt9dw;0>FDl*jv)g5s2j8<4Ll-1mOs}MO!9L|n${3qH%cTz z7u@>wO<(rCTIswh6#YV<8nJGGacT`1xS{rvhRhpUVP51h4PhkRx6PIPXA0vDf2mF! zF_P)`9O?I*E^Q+BXQE>&o$5%5@=nB%GWS?jw``JuV$v!b66xg>5dkVPk?)X;JQ!e7<4dB*4veV(d(BD-nn{im z)(6u>F^FcWB_7` zTV1ArSCI3Z^{rCi^G7>uiw;+r1&A`)0{~#ZDM)u%W!4qIxa8*4z}N@ zjt%G4*m!QN&*W-gmGxBhPBOK|-Gaz`HDydfzsfA#F_s%18%hppaM=)WA(KHj#^kAx za1y(RIB}eungiyEocjD+ewI=WsQi=~$*C{Qjpt_7+~n-|gwjyMGdVRgJf6>u?NfWl zjW&9~^cz|_exEV{&2Esj~Wgq`pXiV(_>*fzNc*?8G3W$3v!Y16EcM3AgJ zAoU62P~fY;ZI{N0_=B3bI*HV!JuSvq}u%Tf;VQ6K8 zL+%(ZT9Rr;lJG9~D<4N)47TJAd0VR1xi)5}oqRj2X0E$D+Z4hrh=f1$^@}2t= z_t!eKhc88^MQH{*QYk$*-!)dN$VKCoN=mLBG(kmu+wLPnsaj{vu%E05H8t0%^An=M zar~5oG1n;`O1Oqp*%MSK2HSRvjSBJ`R5vpv4+Z*dX1S4=vP>jOUa&D`3l2#^UHbfr zaMm}~>T&r!!2v|(s0clxi#(yLC?mZDZ}qX2L22;ct%cJ>|uty z-sK5dcOtNZLp#9F&_~Y>O+QDYM(zwyI1qFS0XgRnfKA#YOL&{IcADQpt)_ce2fHb~ zdWW;1Em8Ggz);pVeqlkc7L^sV?!a@hX)TJ+0NDkTDP>07OwRHF;ab8Z-sKkYLA*>{f|yykL4H~+g{i{KqnTNonAsH+HmUE&BSpC z+0u}(9-@PZ3{4W8(V>YJ#X{S3AdiDs@&*g;kCAKET)2_%12(YPaJP!nK#J?V$IKdz zQVUXO_no2TcUzT!w3)T5Qm!tTSqS9UM~%QLeKT^3gk&mi?xmZD?Q#z_=)7I<#hPEK zvf7G}b-SAP7rf=VuNuWAzoz_>SFQVneWo>`ZXM!pWQGax{EYvsWev095=lFoMvhP> z2c;mb-AVu{dHJ9)1^MEB#~KU-z8%YI9>LHgbRe|WC$ zq@VF4H#GUhQ{%Iz^3!7{@}n~kJ+MD`fUi>%`v)J6J@{-Bf+zKufYx)itv#K2#uS$rgh1zKRYN zsV=+Loq}3PduBK_me4Kr!8RSz&DU>=kTnsUZ^oJLMTdSIpmpIKy4KIb&pXoh$j>K% z`ns$O^lso?vk4?esW+_~i3|2ruX3Fq(p7hvVjMYJ_f;l_1f@=@taE2lt-wowSfOCR za7qTw8im3J6J&{PSD?^`;Tx~bThhQc(al+GDiu}CZTeiu{qN7oiY>L<;`UxGr@k_a%b5m-XejQCc# z3r6sqp`h#JMlwZppdT*;O^GyTY(BG}GZ(1Df_Xb(iGDwUXf{GL{z6iS-W?+<8p_Y> z-X)Nal?1~Zzef`qQ6%biBBAYhzYf|^gUazcvP7V*GoecEeoMRvQ<2`rZ9tVG)71Mw7jGiyei)931^m5?wNp^ zQAei{gcJ@UK@m_Pb7swu^fZ}7VOoUuix0J5gTD!Am^wI=_46fu~tH@$_k%cR?aBTDf1RuN|_~#n=`c{q|td!?-u^`(-s>t1O>c zY+%mAP>vug6;Io@{tPFJjuK=33`my*PumSiHtdsq=SdB$Z3%U0^2 zVD9iE{iZ!` iHighestGP) + { + iHighestGP = iGP; + iHighestGPPos = iRandomCount; + } + } + } + } + iRandomEquipped = Random(iRandomCount)+1; + iRandomCount = 0; + // Drop the item. + for (i=0; i iHighestGP) + { + iHighestGP = iGP; + iHighestGPPos = iRandomCount; + } + } + } + } else { + // Increment the number of random items and check + // for the highest GP item. + iRandomCount++; + if (HABD_DROP_MOST_EXPENSIVE_BACKPACK != 0) + { + iGP = GetGoldPieceValue(oItem); + if (iGP > iHighestGP) + { + iHighestGP = iGP; + iHighestGPPos = iRandomCount; + } + } + } + } + oItem = GetNextItemInInventory(oPC); + } + iRandomBackpack = Random(iRandomCount)+1; + iRandomCount = 0; + // Drop the random item. + // Find the random item. + oItem = GetFirstItemInInventory(oPC); + while (GetIsObjectValid(oItem)) + { + if (HABD_FORCE_RAISE_USES_SCROLLS) + { + // Search through the scrolls and skill the raise/rez scrolls + iBaseItemType = GetBaseItemType(oItem); + if ((iBaseItemType == BASE_ITEM_SCROLL) || + (iBaseItemType == BASE_ITEM_SPELLSCROLL)) + { + // Default scrolls cannot be made plot so don't worry about it. + // See if it matches the tags we are looking for. + if (FindSubString(HABD_SCROLL_TAGS, ":"+GetTag(oItem)+":") == -1) + { + iRandomCount++; + // If this is the random item then drop it. + if ((HABD_DROP_RANDOM_BACKPACK != 0) && (iRandomCount == iRandomBackpack)) + { + if (HABD_DROP_RANDOM_BACKPACK == 2) DestroyObject(oItem); + else AssignCommand(oBag, ActionTakeItem(oItem, oPC)); + } + // If this is the most expensive item then drop it. + if ((HABD_DROP_MOST_EXPENSIVE_BACKPACK != 0) && (iRandomCount == iHighestGPPos)) + { + if (HABD_DROP_MOST_EXPENSIVE_BACKPACK == 2) DestroyObject(oItem); + else AssignCommand(oBag, ActionTakeItem(oItem, oPC)); + } + } + } else { + iRandomCount++; + // If this is the random item then drop it. + if ((HABD_DROP_RANDOM_BACKPACK != 0) && (iRandomCount == iRandomBackpack)) + { + if (HABD_DROP_RANDOM_BACKPACK == 2) DestroyObject(oItem); + else AssignCommand(oBag, ActionTakeItem(oItem, oPC)); + } + // If this is the most expensive item then drop it. + if ((HABD_DROP_MOST_EXPENSIVE_BACKPACK != 0) && (iRandomCount == iHighestGPPos)) + { + if (HABD_DROP_MOST_EXPENSIVE_BACKPACK == 2) DestroyObject(oItem); + else AssignCommand(oBag, ActionTakeItem(oItem, oPC)); + } + } + } + oItem = GetNextItemInInventory(oPC); + } + } + // Should we drop everything in the backpack that isn't plot? + if (HABD_DROP_BACKPACK != 0) + { + int iBaseItemType; + if (HABD_DROP_BACKPACK == 2) SendMessageToPC(oPC, "Destroying all backpack items."); + else SendMessageToPC(oPC, "Dropping all backpack items."); + oItem = GetFirstItemInInventory(oPC); + while (GetIsObjectValid(oItem)) + { + if (HABD_FORCE_RAISE_USES_SCROLLS) + { + // Search through the scrolls and skill the raise/rez scrolls + iBaseItemType = GetBaseItemType(oItem); + if ((iBaseItemType == BASE_ITEM_SCROLL) || + (iBaseItemType == BASE_ITEM_SPELLSCROLL)) + { + // Default scrolls cannot be made plot so don't worry about it. + // See if it matches the tags we are looking for. + if (FindSubString(HABD_SCROLL_TAGS, ":"+GetTag(oItem)+":") == -1) + if (GetIsObjectValid(oItem) && (!GetPlotFlag(oItem))) + { + if (HABD_DROP_BACKPACK == 2) DestroyObject(oItem); + else AssignCommand(oBag, ActionTakeItem(oItem, oPC)); + } + } else { + if (GetIsObjectValid(oItem) && (!GetPlotFlag(oItem))) + { + if (HABD_DROP_BACKPACK == 2) DestroyObject(oItem); + else AssignCommand(oBag, ActionTakeItem(oItem, oPC)); + } + } + } + oItem = GetNextItemInInventory(oPC); + } + } + return; +} + +// **************************************************************************** + +// Report that a player died. OBJECT_SELF is the dead player. +void ReportPlayerDeath(); + +void ReportPlayerDeath() +{ + object oPC = OBJECT_SELF; + + // Abort is not a player + if (!GetIsPC(oPC)) return; + + int iHPs = GetCurrentHitPoints(oPC); + // Abort if player isn't dying + if (iHPs > 0) return; + + // Display notification. + FloatingTextStringOnCreature(GetName(oPC)+" HAS DIED!", oPC); + // Vocal notification. + AssignCommand(oPC, PlayVoiceChat(VOICE_CHAT_DEATH, oPC)); + if (HABD_DM_NOTIFICATION_ON_DEATH) SendMessageToAllDMs("DEAD: "+GetName(oPC)+" HAS DIED"); + DelayCommand(0.2,FloatingTextStringOnCreature("OOC: YOU HAVE JUST DIED, SO BE QUIET UNTIL YOU ARE RAISED. -DM", oPC, FALSE)); +} + +// **************************************************************************** + +// Recover a player from instant death. This is one of the key functions of +// this death system. Instant death isn't possible, you always bleed. +// oPC - the player who instantly died. +void RecoverInstantDeath(object oPC); + +void RecoverInstantDeath(object oPC) +{ + // Should regeneration items be removed from bleeding players? + if (HABD_NERF_REGENERATION_ITEMS) + { + AssignCommand(oPC, HABDRegenerationItemsUnequip(oPC)); + } + + // Bring the player back from death and make them bleed. + ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectResurrection(),oPC); + int iBleed = 6+Random(4); + SetPlotFlag(oPC, FALSE); + // Will leave player at -6 to -9 + ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectDamage(iBleed, DAMAGE_TYPE_MAGICAL, DAMAGE_POWER_PLUS_FIVE), oPC); + SetPlotFlag(oPC, TRUE); + FloatingTextStringOnCreature("You nearly died! Bleeding starts at -"+IntToString(iBleed), oPC, FALSE); +} + +// **************************************************************************** +// Check to see if the player has any raise or resurrection scrolls on them. +// If they do have them then a local object will be set pointing to that item. +// oPC - the dead player. +// Returns the number of scrolls that they possess. +int CheckForRaiseRezScrolls(object oPC); + +int CheckForRaiseRezScrolls(object oPC) +{ + DeleteLocalObject(oPC, HABD_STORED_SCROLL); + int iStoredCost = 1000000; + int iCost = 0; + int iBaseItemType; + int iNumFound = 0; + object oItem = GetFirstItemInInventory(oPC); + while (GetIsObjectValid(oItem)) + { + // Search through the scrolls + iBaseItemType = GetBaseItemType(oItem); + if ((iBaseItemType == BASE_ITEM_SCROLL) || + (iBaseItemType == BASE_ITEM_SPELLSCROLL)) + { + // Default scrolls cannot be made plot so don't worry about it. + // See if it matches the tags we are looking for. + if (FindSubString(HABD_SCROLL_TAGS, ":"+GetTag(oItem)+":") != -1) + { + // Use the least expensive scroll the player has. + iCost = GetGoldPieceValue(oItem) / GetItemStackSize(oItem); + iNumFound = iNumFound + GetItemStackSize(oItem); + if (iCost < iStoredCost) + { + iStoredCost = iCost; + // Store the item because this is what we want to use to + // bring them back from the dead. + SetLocalObject(oPC, HABD_STORED_SCROLL, oItem); + } + } + } + oItem = GetNextItemInInventory(oPC); + } + return (iNumFound); +} + +// **************************************************************************** + +// Warn player that they will auto-respawn in fTime seconds. +// oPC - the dead player. +// fTime - the amount of time until auto-respawn. +void AutoRespawnWarning(object oPC, float fTime); + +void AutoRespawnWarning(object oPC, float fTime) +{ + // If the player is no longer dead then kill the warning. + if (!GetIsDead(oPC)) return; + if (GetLocalInt(GetModule(), HABD_PLAYER_STATE+GetPCPlayerName(oPC)+GetName(oPC)) != HABD_STATE_PLAYER_DEAD) return; + // Store + SetLocalInt(GetModule(), HABD_RESPAWN_TIMER+GetPCPlayerName(oPC)+GetName(oPC), FloatToInt(fTime)); + // Warn the player. + if(fTime > 1.0) FloatingTextStringOnCreature("OOC: "+GetName(oPC)+" will automatically respawn in "+FloatToString(fTime,4,1)+" seconds.", oPC, TRUE); + return; +} + +// **************************************************************************** + +// Warn player that they will auto-raise in fTime seconds. +// oPC - the dead player. +// fTime - the amount of time until auto-raise. +void AutoRaiseWarning(object oPC, float fTime); + +void AutoRaiseWarning(object oPC, float fTime) +{ + // If the player is no longer dead then kill the warning. + if (!GetIsDead(oPC)) return; + if (GetLocalInt(GetModule(), HABD_PLAYER_STATE+GetPCPlayerName(oPC)+GetName(oPC)) != HABD_STATE_PLAYER_DEAD) return; + // Store + SetLocalInt(GetModule(), HABD_RAISE_TIMER+GetPCPlayerName(oPC)+GetName(oPC), FloatToInt(fTime)); + // Warn the player. + if(fTime > 1.0) FloatingTextStringOnCreature("OOC: "+GetName(oPC)+" will automatically raise in "+FloatToString(fTime,4,1)+" seconds.", oPC, TRUE); + return; +} + +// **************************************************************************** + +// Forces a dead player to automatically respawn. +// oPC - the dead player who is being forced to respawn. +void ForceAutoRespawn(object oPC); + +void ForceAutoRespawn(object oPC) +{ + // Make sure the player is dead. + if (!GetIsDead(oPC) || + (GetLocalInt(GetModule(), HABD_PLAYER_STATE+GetPCPlayerName(oPC)+GetName(oPC)) != HABD_STATE_PLAYER_DEAD)) + { + DeleteLocalInt(GetModule(), HABD_RESPAWN_TIMER+GetPCPlayerName(oPC)+GetName(oPC)); + return; + } + + // Force the player to respawn. + SetLocalInt(oPC, HABD_FORCED_RESPAWN, 1); + AssignCommand(oPC, ExecuteScript(HABD_RESPAWN_SCRIPT, oPC)); + DeleteLocalInt(GetModule(), HABD_RESPAWN_TIMER+GetPCPlayerName(oPC)+GetName(oPC)); + FloatingTextStringOnCreature("OOC: Automatically respawning "+GetName(oPC)+" because timer elapsed.", oPC, TRUE); + return; +} + +// **************************************************************************** + +// Forces a dead player to automatically raise. +// oPC - the dead player who is being forced to raise. +void ForceAutoRaise(object oPC); + +void ForceAutoRaise(object oPC) +{ + // Make sure the player is dead. + int iState = GetLocalInt(GetModule(), HABD_PLAYER_STATE+GetPCPlayerName(oPC)+GetName(oPC)); + if ((iState != HABD_STATE_PLAYER_DEAD) && + (iState != HABD_STATE_RESPAWNED_GHOST)) + { + DeleteLocalInt(GetModule(), HABD_RAISE_TIMER+GetPCPlayerName(oPC)+GetName(oPC)); + return; + } + DeleteLocalInt(GetModule(), HABD_RAISE_TIMER+GetPCPlayerName(oPC)+GetName(oPC)); + // If force raise uses up scrolls, then do so. + if (HABD_FORCE_RAISE_USES_SCROLLS) + { + object oScroll = GetLocalObject(oPC, HABD_STORED_SCROLL); + if (GetItemPossessor(oScroll) == oPC) + { + int iStackSize = GetItemStackSize(oScroll); + // Only one item so destroy it, this is why it should only use scrolls. + // If it uses a charged item, then this could be wasted. + if (iStackSize == 1) DestroyObject(oScroll); + else SetItemStackSize(oScroll, iStackSize - 1); + } else { + FloatingTextStringOnCreature("OOC: Auto-raise aborted for "+GetName(oPC)+" because could not find any scrolls.", oPC, TRUE); + return; + } + DeleteLocalObject(oPC, HABD_STORED_SCROLL); + } + // Copy of Raise Dead spell script since you can't make a dead player cast raise at themself. + if (GetIsDead(oPC)) + { + ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_RAISE_DEAD), GetLocation(oPC)); + ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectResurrection(), oPC); + HABDApplyPenaltyIfDead(oPC, SPELL_RAISE_DEAD); + } else { + HABDCureRespawnGhost(oPC, SPELL_RAISE_DEAD); + } + // Force the player to respawn. + FloatingTextStringOnCreature("OOC: Automatically raising "+GetName(oPC)+" because timer elapsed.", oPC, TRUE); + return; +} + +// **************************************************************************** + +// Check if a player has spontaneously come back to life. +// oPC - the dead player. +// fTime - the duration to wait until the next health check. + +void CheckForDMHeal(object oPC, float fTime) +{ + object oMod = GetModule(); + string sID = GetPCPlayerName(oPC)+GetName(oPC); + // Check to see if the player is still alive. + int iState = GetLocalInt(oMod, HABD_PLAYER_STATE+sID); + if ( + (iState == HABD_STATE_RESPAWNED_GHOST) || + (iState == HABD_STATE_PLAYER_ALIVE) + ) return; + + // Quick little timer to check that PCs recover from a DM heal properly. + if (GetIsDead(oPC)) + { + DelayCommand(fTime, CheckForDMHeal(oPC, fTime)); + } else { + // Player has been DM healed. + SetPlotFlag(oPC, FALSE); + SetLocalInt(oMod, HABD_PLAYER_STATE+sID, HABD_STATE_PLAYER_ALIVE); + } +} + +// **************************************************************************** + +// This is the OnPlayerDeath event handler. + +void main() +{ + object oMod = GetModule(); + object oPC = GetLastPlayerDied(); + int iNPC = GetLocalInt(OBJECT_SELF, HABD_NPC_BLEED); + if (iNPC == 1) oPC = OBJECT_SELF; + string sID = GetPCPlayerName(oPC)+GetName(oPC); + + // If an NPC is running this script, then set up its master. The master was + // automatically wiped out when the henchman died. + if (iNPC) + { + if (!GetIsObjectValid(GetAssociate(ASSOCIATE_TYPE_HENCHMAN, GetLocalObject(OBJECT_SELF, HABD_NPC_MASTER)))) + AddHenchman(GetLocalObject(OBJECT_SELF, HABD_NPC_MASTER), oPC); + } + + if (HABD_DEBUG) SpeakString("DEBUG: HABD OnDeath, "+GetName(oPC)+", HP: "+IntToString(GetCurrentHitPoints(oPC))+", master: "+GetName(GetMaster(oPC))+", state:"+HABDGetPlayerStateName(oPC), TALKVOLUME_SHOUT); + + // Check to see if they have bled at all - if not then give them a chance to bleed. + if (GetLocalInt(oMod, HABD_PLAYER_STATE+sID) != HABD_STATE_PLAYER_DEAD) + { + // Player died without going through bleeding. + + // Keep the player from taking additional damage while bleeding. + SetPlotFlag(oPC, TRUE); + // Special state for this circumstance. + SetLocalInt(oMod, HABD_PLAYER_STATE+sID, HABD_STATE_PLAYER_INSTANT_DEATH); + // Bring the player to near-death. + AssignCommand(oPC, RecoverInstantDeath(oPC)); + // Force friendly to hostile faction. + if (!GetLocalInt(oPC, HABD_OLD_FACTION_SET)) + { + SetLocalInt(oPC, HABD_OLD_FACTION, GetStandardFactionReputation(STANDARD_FACTION_HOSTILE, oPC)); + SetLocalInt(oPC, HABD_OLD_FACTION_SET, 1); + } + SetStandardFactionReputation(STANDARD_FACTION_HOSTILE, 100, oPC); + // stop nearby attackers + AssignCommand(oPC, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectInvisibility(INVISIBILITY_TYPE_NORMAL), oPC, 6.0)); + return; + } + + // Player has properly died. + + // Check for a DM Heal. + AssignCommand(oPC, DelayCommand(6.0, CheckForDMHeal(oPC, 6.0))); + + // Ensure that plot is not still set. + SetPlotFlag(oPC, FALSE); + // Set playerstate to dead not dying. + SetLocalInt(oMod, HABD_PLAYER_STATE+sID, HABD_STATE_PLAYER_DEAD); + // Alert that the player died. + AssignCommand(oPC, ReportPlayerDeath()); + + // Check if we are re-entering this state from persistence. + if (GetLocalInt(oPC, HABD_PERSISTANT_REAPPLY) != 1) + { + // Set the auto-respawn/raise timers to maximum. + SetLocalInt(oMod, HABD_RESPAWN_TIMER+sID, FloatToInt(HABD_FORCE_RESPAWN_TIMER)); + if ((HABD_SOLO_FORCE_RAISE_TIMER > 0.0) && (HABDGetPartySize(oPC))) + { + SetLocalInt(oMod, HABD_RAISE_TIMER+sID, FloatToInt(HABD_SOLO_FORCE_RAISE_TIMER)); + } else { + SetLocalInt(oMod, HABD_RAISE_TIMER+sID, FloatToInt(HABD_FORCE_RAISE_TIMER)); + } + // Increment the counters. + SetLocalInt(oMod, HABD_CURRENT_DEATH_COUNT+sID, GetLocalInt(oMod, HABD_CURRENT_DEATH_COUNT+sID) + 1); + SetLocalInt(oMod, HABD_DEATH_COUNT+sID, GetLocalInt(oMod, HABD_DEATH_COUNT+sID) + 1); + } else { + // State was reapplied, do not increment the counters. + DeleteLocalInt(oPC, HABD_PERSISTANT_REAPPLY); + // Autoraise timers will use their persistent values. + } + + // Should we reequip any regeneraton items? + if (HABD_NERF_REGENERATION_ITEMS) + { + AssignCommand(oPC, HABDRegenerationItemsReEquip(oPC)); + } + + // Drop items + AssignCommand(oPC, DropItems(oPC)); + + // Respawn option can be disabled. + if (HABD_RESPAWN_ALLOWED) + { + PopUpDeathGUIPanel (oPC, HABD_INSTANT_RESPAWN_ALLOWED, TRUE, 0, "Press the Respawn button to respawn as a DM controlled ghost. "+IntToString(HABD_RESPAWN_XP_LOSS)+"% XP & "+IntToString(HABD_RESPAWN_GP_LOSS)+"% GP penalty applies."); + } else { + FloatingTextStringOnCreature("OOC: Respawn is turned off. You must wait for your party to help you, DM intervention or automatic respawn/raise.", oPC, FALSE); + } + + // Handle the auto-respawn and auto-raise timers. + float fRespawn = IntToFloat(GetLocalInt(oMod, HABD_RESPAWN_TIMER+sID)); + float fRaise = IntToFloat(GetLocalInt(oMod, HABD_RAISE_TIMER+sID)); + if (iNPC) + { + // The respawn timer must be less than the raise timer for it to execute. + if ((fRespawn > 0.0) && ((fRespawn < fRaise) || (fRaise == 0.0))) + { + AssignCommand(oPC, DelayCommand(HABD_NPC_FORCE_RESPAWN_TIMER, ForceAutoRespawn(oPC))); + } + if (fRaise > 0.0) + { + if (HABD_FORCE_RAISE_USES_SCROLLS) + { + if (CheckForRaiseRezScrolls(oPC) <= 0) + { + return; + } + } + AssignCommand(oPC, DelayCommand(HABD_NPC_FORCE_RAISE_TIMER, ForceAutoRaise(oPC))); + } + } else { + // The respawn timer must be less than the raise timer for it to execute. + if ((fRespawn > 0.0) && ((fRespawn < fRaise) || (fRaise == 0.0))) + { + AssignCommand(oPC, AutoRespawnWarning(oPC, fRespawn)); + AssignCommand(oPC, DelayCommand(0.5 * fRespawn, AutoRespawnWarning(oPC, 0.5 * fRespawn))); + AssignCommand(oPC, DelayCommand(0.75*fRespawn, AutoRespawnWarning(oPC, 0.25*fRespawn))); + AssignCommand(oPC, DelayCommand(9*fRespawn, AutoRespawnWarning(oPC, 0.1*fRespawn))); + AssignCommand(oPC, DelayCommand(fRespawn, ForceAutoRespawn(oPC))); + } + if (fRaise > 0.0) + { + if (HABD_FORCE_RAISE_USES_SCROLLS) + { + if (CheckForRaiseRezScrolls(oPC) <= 0) + { + FloatingTextStringOnCreature("OOC: Out of scrolls. You have to wait for help.", oPC, FALSE); + return; + } + } + AssignCommand(oPC, AutoRaiseWarning(oPC, fRaise)); + AssignCommand(oPC, DelayCommand(0.5 * fRaise, AutoRaiseWarning(oPC, 0.5 * fRaise))); + AssignCommand(oPC, DelayCommand(0.75*fRaise, AutoRaiseWarning(oPC, 0.25*fRaise))); + AssignCommand(oPC, DelayCommand(9*fRaise, AutoRaiseWarning(oPC, 0.1*fRaise))); + AssignCommand(oPC, DelayCommand(fRaise, ForceAutoRaise(oPC))); + } + } + // DO NOT ADD ANY CODE HERE. IT MIGHT NOT BE EXECUTED. +} + + + + diff --git a/gamma_age_v2/habd_onpcdying.ncs b/gamma_age_v2/habd_onpcdying.ncs new file mode 100644 index 0000000000000000000000000000000000000000..baa44305a56859ad83ac2b519de156f2a2552915 GIT binary patch literal 9212 zcmbtZeT-E{6~A9^zgd>;vLci+d~EqBtlexZ4W^~L3&=)bkpaB8p{G$8>uE&3 zM!Ifhm%3?O%?OKIA>!HYN6Ot#Hr~iu7>Q`04yIp;8Zg(DKvYNE;Ik>Vjj(0@y)be= zg%i6U`^4C|iGy-D@bzd~2obed1p&;;E`-p8Q=B_{WW&+YvF*sq54f~b!GcLFu`xwF zZZTfs_KKLz7zLc+rkvBJ17ugeTHCqTkPPCj=g>GtnU-6R#gp;RLX^Fzbr&~!W)cl zPb==cPM;#`n$ku|%YxVzRV}AJJy=r?SbZE|VSV<*4jIc_$TfX>R>4AX1QB}NLXk2F z{fdPm%@TUfLIXk1lRtk9!E^aiaXKX5z&51OZ6f{^#6=CRNEvt$1AC^z>SX?8IV`Ar zRpr%FM=RA@%Geh%Hh@nHDYO!33yS4xEnlv&-%|#CT6S^H={!(AUap)hD>`}Dr}f~V zsmLlce3lgI;Hmr*P9wMQ&z$4DfFnj*e7>JspT(HEM}M!K?_A80mEm4vZGanGy${@X z>k!V}`iG&vLEM-C`RNPiJ`R7wvwamYdWpUfwzR!Qqr|L8yZ#{1qM12Z|If@5UgZ@4 zy&FL9V9WE}6?`;vYKcv8FMA2Dd=fAtXctr5R5sfAYUj|n+BG)5U+oy$J-TajXrEeZ z#XW?^f;#T;+XW5BRj03I`IO%%3wx3B!ThX^9C6lzZbFUqvBSeS2{J`?(MJ|!+4ky8 z-7b7?;3%Mgp*qCb$ic&Apb)zz^qa8|yG^5RE5~COLLXfcw0w!zlQM!grt!F`E(S1fdapx?C6PC?IG z=t4oiZJ}L)Ua-(bg3efIx1g_C=zW5|ZlOJbzG0z@1^tnQ_6quzg?>!XpIYb=L4R(c z9~bnO7P?f>Ut8!hL4RkV_Y3+53tcYgI~MwYpzm4e3PG=0s1o#j3tcJb-z{{Np#QMY z)q?)hLe~g-%R>7E{m?=m6!c#fx>nGSEOZ^Cfu}cQ&`Z0`r>%;V#fe8#{JBiZ` znUvQvDd#dNr!y&E%%tqdq-@NjbQ8sEw1GF9Nx7Oy`9&t>wM@#(MB$^r@`5*=NqI7p zf;$Zyn8s~gCZ#ir;@-}ryq8J2lu4P%qY7-o_Z2ES>hl0f!Nf(vgJXinO0-0rH2 zV7JY%)gYDBi)o!XkQ;7Xm?T#>ERX4lzLP5#Z|+}FJ?DQzDl|;c6`KD7mDceQ$JrrZ zS6~~M3vFvB-Q(TisMO>JNiXRn3OCoA{u~W!VaLD)W88i4@ZT$P;jmcH2P-sBkBMEn znePO(P~85CiUFg;2J7uFNG(4Vd3b$r8NCp_FJlwAtNr38%zc z%#jGlCTT5Z_OG;<@nLKcb-*b;aTKtOnPJS@x7OPq93Lyt?f#AcT}(D1J9+qZ2|W(?Xq@;=9>3lg4gq8})S≦$ z;nP)Gp0bA}skV6R+r#~n=i_e^8H4L`$ibE{hN9na9Oqc~3?xfil4C(1)--|R z?vX^Pgt^_exZ|Y?H~v%S4<_zD#G0El%efrEI@}&~j)8gG_GeBMCnt4*!TvQ$z;Dqb zB#8#=MNvzKv9p}U!gA&}<|uQ-QsCk#=N^=I={@RR)HN>%h)ya%B_x;Q=>O%Wr ztCxsj^M-qiH|jl|CTaDiF+2t58e<`{v3c2m)EqdFw4pYIcdbNdo^?8u;oPSqlpn*Q z-Pwt^&@4K(437OIUFumWm}Y+{Z>gVvO!ZeD>va=GC$Xs@c3(~eMg47)g9OP5&X|$p zWTHZ!n^Bd=dnt86K0-Fv-xQgtT%kx)_%jx{*XmX5{4YZ+jg-snv6rD(yZN!V-~KJ) z+G>4M2yv-A|03`W=4UN3$eR+9P(iURVNHFUT(a`?A~1`N6Jt*H2aHM;2u2*XuO8+Z z=(LFq8fcz@&RD2<271;)%`?#R7Ah@R$8MEM3)XpwDyDDI4D2UbvlGYi_o!dxFe^jA zF=+_LtQlQ(!e=c4%xY#lY7t-}Ls(%Ea&>}Sj!8oKKg^e&s3{jj6@gp|JM>id2ON6( zM36Hf(JH6)&GzhG$Tz?}gu;3BoAdaqiNsBe2hDT{e%7N@GHd2g!n+{}MEji+7h= 0.0) ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectInvisibility(INVISIBILITY_TYPE_NORMAL), oPC, HABD_POST_BLEED_INVIS_DUR); + // Turn the plot flag off after a specific period of time. + SetPlotFlag(oPC, FALSE); + // Raises the player to 1 hp. + ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectHeal(1 - (GetCurrentHitPoints(oPC))), oPC); + SetLocalInt(oMod,HABD_PLAYER_STATE+sID, HABD_STATE_PLAYER_ALIVE); //set player state to alive + // If this is a henchmen, then take them out of the busy state. + if (iNPC) + { + HABDAssociateNotBusy(); + } + + // Keep the player from being attacked, stop nearby attackers + AssignCommand(oPC, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectInvisibility(INVISIBILITY_TYPE_NORMAL), oPC, 6.0)); + // Make the player hostile again. + SetStandardFactionReputation(STANDARD_FACTION_HOSTILE, GetLocalInt(oPC, HABD_OLD_FACTION), oPC); + DeleteLocalInt(oPC, HABD_OLD_FACTION_SET); + AssignCommand(oPC, ActionPlayAnimation(ANIMATION_LOOPING_PAUSE_DRUNK, 1.0, 5.0)); + + // Notify the player that they were healed. + DelayCommand(0.5, SendMessageToPC(oPC, "You have healed.")); + + // Apply user defined penalties. + AssignCommand(oPC, HABDUserDefinedBleed()); + + //Give a little visual effect for flare. + effect eVisual = EffectVisualEffect(VFX_IMP_RESTORATION); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eVisual, oPC); + + // If regeneration items were removed then reequip them. + if (HABD_NERF_REGENERATION_ITEMS) + { + AssignCommand(oPC, HABDRegenerationItemsReEquip(oPC)); + } + + // Fixes the inital respawn issue with monsters not reattacking. + //object oMonster = GetNearestCreature(CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_ENEMY, oPC, 1, CREATURE_TYPE_PERCEPTION, PERCEPTION_SEEN); + //DelayCommand(9.0, AssignCommand(oMonster, ActionAttack(oPC))); +} + +// **************************************************************************** + +// Returns TRUE if the player has stabilized by gaining any HP since the last +// time they bled. +int CheckForStabilization(object oPC); + +int CheckForStabilization(object oPC) +{ + object oMod = GetModule(); + string sID = GetPCPlayerName(oPC)+GetName(oPC); + //Section deals with possiblity for healing by other players + if (GetCurrentHitPoints(oPC) > GetLocalInt(oMod, HABD_LAST_HP+sID)) //if hitpoint have increased + { + DelayCommand(1.0, HealTo1HP(oPC)); + return TRUE; + } + return FALSE; +} + +// **************************************************************************** + +// Report the bleed count for OBJECT_SELF. +void ReportPlayerBleed(); + +void ReportPlayerBleed() +{ + object oPC = OBJECT_SELF; + object oMod = GetModule(); + string sID = GetPCPlayerName(oPC)+GetName(oPC); + int iHPs = GetCurrentHitPoints(oPC); + int iNPC = GetLocalInt(OBJECT_SELF, HABD_NPC_BLEED); + if (iNPC) iHPs = iHPs - 10; + + if ( + (GetLocalInt(oMod, HABD_PLAYER_STATE+sID) != HABD_STATE_PLAYER_BLEEDING) || // check if player is still bleeding + (iHPs > 0) || // player has healed + (iHPs <= -10) || // player is a goner, let the death script kick in + (CheckForStabilization(oPC)) // check if player has gained any HP + ) + { + DeleteLocalInt(oPC, HABD_REPORT_BLEED_RUNNING); + return; + } + // The delay will effect how often players are vocal about bleeding. + DelayCommand(6.0, AssignCommand(oPC, ReportPlayerBleed())); + + // Prevent calling this function multiple times + SetLocalInt(oPC, HABD_REPORT_BLEED_RUNNING, 1); + + DelayCommand(0.1, FloatingTextStringOnCreature(GetName(oPC)+" is bleeding to death! At "+IntToString(iHPs)+" hitpoints.", oPC)); + if (HABD_DM_NOTIFICATION_ON_BLEED) SendMessageToAllDMs(GetName(oPC)+" is bleeding to death! At "+IntToString(iHPs)+" hitpoints."); + PlayBleedVoice(oPC); + AssignCommand(oPC, ActionPlayAnimation(ANIMATION_LOOPING_DEAD_BACK, 1.0, 6.0)); +} + +// **************************************************************************** + +// This function exists to fix the problem that occurs in bleeding scripts +// when the summoned familiar is being possessed by the player (sorc or wiz). +// That creates a condition where GetIsPC returns true for the familiar. +// What usually happens is that when the possessed familiar dies, the player +// is trapped in its body until the DM manually kills the player. +// While stuck in the dead familiar, the player is unable to run the unpossess +// action and the bleed count on the familiar usually does not work properly. + +// This function DOES NOT kill the familiar when the player is bleeding if the player +// is not possessing the familiar. The familiar will be able to continue fighting +// for its unconcious and bleeding master. +// oTarget - the possibly "possessed" player. +int KillPet(object oTarget, int nEffect = TRUE, int nVisualEffectId = VFX_IMP_UNSUMMON); + +int KillPet(object oTarget, int nEffect = TRUE, int nVisualEffectId = VFX_IMP_UNSUMMON) +{ + // Usage: place in your bleeding script with a call that looks something like + // if (KillPet(oPC)) return; // abort from the bleed script, oPC no longer exists + + effect eDeath = EffectDeath(FALSE, FALSE); + effect eVis = EffectVisualEffect(nVisualEffectId); + object oCreature = oTarget; + if(GetIsObjectValid(oCreature)) + { + object oMaster = GetMaster(oCreature); + if(GetIsObjectValid(oMaster)) + { + //Is the creature a summoned associate + if(GetAssociate(ASSOCIATE_TYPE_FAMILIAR, oMaster) == oCreature) + { + //Apply the VFX and delay the destruction of the summoned monster so + //that the script and VFX can play. + if(nEffect) + DelayCommand(0.001,ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY,eVis,GetLocation(oCreature),1.0f)); + SetPlotFlag(oCreature, FALSE); + DelayCommand(0.002,FloatingTextStringOnCreature(GetName(oMaster)+" HAS LOST FAMILIAR '"+GetName(oCreature)+"'", oCreature)); + if (HABD_DM_NOTIFICATION_ON_BLEED) SendMessageToAllDMs(GetName(oMaster)+" HAS LOST FAMILIAR '"+GetName(oCreature)+"'"); + DelayCommand(0.003, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eDeath, oCreature)); + return TRUE; + } + } + } + return FALSE; +} + +// **************************************************************************** + +// Applies -1 HP to the player and checks for stabilization. +// fBleedTimer - the time duration between bleeding -1 HP. +void BleedToDeath(float fBleedTimer) +{ + object oMod = GetModule(); + object oPC = OBJECT_SELF; + string sID = GetPCPlayerName(oPC)+GetName(oPC); + int iNPC = GetLocalInt(OBJECT_SELF, HABD_NPC_BLEED); + if (HABD_DEBUG) SpeakString("DEBUG: HABD OnBleed, "+GetName(oPC)+", HP: "+IntToString(GetCurrentHitPoints(oPC))+", master: "+GetName(GetMaster(oPC))+", state:"+HABDGetPlayerStateName(oPC), TALKVOLUME_SHOUT); + + int iPlayerState = GetLocalInt(oMod, HABD_PLAYER_STATE+sID); + if (iPlayerState != HABD_STATE_PLAYER_BLEEDING) return; + if (CheckForStabilization(oPC)) return; + + // if you get here - you are dying and have not been healed + // so you need to roll to see if you stablize + int nSavingRoll = d10(); + + // Death can be disabled before a certain level by "faking" the stabilization + // check. Do not let the players know that death is disabled because it will + // only encourage them to be idiots. + if ((HABD_NO_DEATH_UNTIL_LEVEL) && (GetHitDice(oPC) < HABD_NO_DEATH_UNTIL_LEVEL)) + { + switch (GetCurrentHitPoints(oPC)) + { + case 10: + case -1: nSavingRoll = nSavingRoll + 2; break; + case 9: + case -2: nSavingRoll = nSavingRoll + 3; break; + case 8: + case -3: nSavingRoll = nSavingRoll + 4; break; + case 7: + case -4: nSavingRoll = nSavingRoll + 5; break; + case 6: + case -5: nSavingRoll = nSavingRoll + 6; break; + case 5: + case -6: nSavingRoll = nSavingRoll + 7; break; + case 4: + case -7: nSavingRoll = nSavingRoll + 8; break; + case 3: + case -8: nSavingRoll = nSavingRoll + 9; break; + case 2: + case -9: + default: nSavingRoll = nSavingRoll + 10; break; + } + } + + if (nSavingRoll > 9) //set to 9 for 3E - lower for easier stabilization + { + DelayCommand(1.0, HealTo1HP(oPC)); //call heal subroutine + // Always make it look like they rolled a 10 to stabilize + SendMessageToPC(oPC,"Saving Roll to stop bleeding (at "+IntToString(GetCurrentHitPoints(oPC))+") = 10"); + FloatingTextStringOnCreature(GetName(oPC)+" has self-stabilized.", oPC); + DelayCommand(6.0, SendMessageToPC(oPC, "In a life or death effort you have survived, alive but barely.")); + return; + } + //if you get here, you have not been healed and did not successfully stabilize + else + { + // Most important, keep the bleeding chain going. + DelayCommand(fBleedTimer, AssignCommand(oPC, BleedToDeath(fBleedTimer))); + SendMessageToPC(oPC,"Saving Roll to stop bleeding (at "+IntToString(GetCurrentHitPoints(oPC))+") = " +IntToString(nSavingRoll)); + SetPlotFlag(oPC, FALSE); + ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectDamage(1,DAMAGE_TYPE_MAGICAL,DAMAGE_POWER_PLUS_FIVE), oPC); + SetPlotFlag(oPC, TRUE); + // Update local variable with hitpoints for healing option. + SetLocalInt(oMod,HABD_LAST_HP+sID, GetCurrentHitPoints(oPC)); + + // if this is true then the player has died. + if (GetCurrentHitPoints(oPC) <= -10) + { + SendMessageToPC(oPC,"You have died."); + // Ensure that plot is not still set. + SetPlotFlag(oPC, FALSE); + // Set up the hostile faction again. + SetStandardFactionReputation(STANDARD_FACTION_HOSTILE, GetLocalInt(oPC, HABD_OLD_FACTION), oPC); + DeleteLocalInt(oPC, HABD_OLD_FACTION_SET); + // Set playerstate to dead not dying + SetLocalInt(oMod,HABD_PLAYER_STATE+sID, HABD_STATE_PLAYER_DEAD); + // OnPlayerDead script will be called after this. + // BleedToDeath will be called one more time, but it will instantly + // abort because the player is not in the bleeding state. + return; + } + } +} + +// **************************************************************************** + +// OnPlayerDying event handler. +void main() +{ + object oMod = GetModule(); + object oPC = GetLastPlayerDying(); + int iNPC = GetLocalInt(OBJECT_SELF, HABD_NPC_BLEED); + if (iNPC == 1) oPC = OBJECT_SELF; + string sID = GetPCPlayerName(oPC)+GetName(oPC); + + // If an NPC is running this script, then set up its master. The master was + // automatically wiped out when the henchman died. + if (iNPC) + { + if (!GetIsObjectValid(GetAssociate(ASSOCIATE_TYPE_HENCHMAN, GetLocalObject(OBJECT_SELF, HABD_NPC_MASTER)))) + AddHenchman(GetLocalObject(OBJECT_SELF, HABD_NPC_MASTER), oPC); + } + + if (HABD_DEBUG) SpeakString("DEBUG: HABD OnDying, "+GetName(oPC)+", HP: "+IntToString(GetCurrentHitPoints(oPC))+", master: "+GetName(GetMaster(oPC))+", state:"+HABDGetPlayerStateName(oPC), TALKVOLUME_SHOUT); + + // Check if bleeding is running on DM or DM possessed, then abort. + if(GetIsDM(oPC) || GetIsDM(GetMaster(oPC))) return; + + // whistler: if this is a player in a possessed familiar, then just kill it. + // Familiar penalties will kick in when familiar dies. + if (KillPet(oPC)) return; + + int iState = GetLocalInt(oMod,HABD_PLAYER_STATE+sID); + if ((iState == HABD_STATE_PLAYER_DEAD) || (iState == HABD_STATE_RESPAWNED_GHOST)) return; + + // Most important, issue the commands to start the bleeding chain. + float fBleedTimer = HABDGetBleedTimer(oPC); + AssignCommand(oPC, DelayCommand(fBleedTimer, BleedToDeath(fBleedTimer))); + if (GetLocalInt(oPC, HABD_REPORT_BLEED_RUNNING) == 0) DelayCommand(6.0, AssignCommand(oPC, ReportPlayerBleed())); + + int iHPs = GetCurrentHitPoints(oPC); + SetPlotFlag(oPC, TRUE); + // Force friendly to hostile faction. + if (!GetLocalInt(oPC, HABD_OLD_FACTION_SET)) + { + SetLocalInt(oPC, HABD_OLD_FACTION, GetStandardFactionReputation(STANDARD_FACTION_HOSTILE, oPC)); + SetLocalInt(oPC, HABD_OLD_FACTION_SET, 1); + } + SetStandardFactionReputation(STANDARD_FACTION_HOSTILE, 100, oPC); + // Keep the player from being attacked, stop nearby attackers + AssignCommand(oPC, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectInvisibility(INVISIBILITY_TYPE_NORMAL), oPC, 6.0)); + + // Allow a good chance for healing - will limit HP to -5 on a bleed level hit. + if ( + (iHPs<-5) && + (iState == HABD_STATE_PLAYER_ALIVE) + ) + { + int nHeal = -5 - iHPs; //should heal player to -5 + ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectHeal(nHeal), oPC); + } + + // Set the state variables. + iHPs = GetCurrentHitPoints(oPC); + SetLocalInt(oMod,HABD_PLAYER_STATE+sID, HABD_STATE_PLAYER_BLEEDING); + SetLocalInt(oMod,HABD_LAST_HP+sID, GetCurrentHitPoints(oPC)); + + // Check if we are re-entering this state from persistence. + if (GetLocalInt(oPC, HABD_PERSISTANT_REAPPLY) != 1) + { + // Increment the counters. + SetLocalInt(oMod, HABD_CURRENT_BLEED_COUNT+sID, GetLocalInt(oMod, HABD_CURRENT_BLEED_COUNT+sID) + 1); + SetLocalInt(oMod, HABD_BLEED_COUNT+sID, GetLocalInt(oMod, HABD_BLEED_COUNT+sID) + 1); + } else { + DeleteLocalInt(oPC, HABD_PERSISTANT_REAPPLY); + } + + // Nerf regeneration items. + if (HABD_NERF_REGENERATION_ITEMS) + { + AssignCommand(oPC, HABDRegenerationItemsUnequip(oPC)); + } + + // Notify that bleeding has started. + if (iNPC) iHPs = iHPs - 10; + string sMsg = GetName(oPC)+" is bleeding to death! At "+IntToString(iHPs)+" hitpoints. Will die in "+FloatToString((10 + iHPs)*fBleedTimer, 3, 0)+" seconds."; + if (HABD_DM_NOTIFICATION_ON_BLEED) SendMessageToAllDMs(sMsg); + FloatingTextStringOnCreature(sMsg, oPC); +} diff --git a/gamma_age_v2/habd_onpcrespawn.ncs b/gamma_age_v2/habd_onpcrespawn.ncs new file mode 100644 index 0000000000000000000000000000000000000000..27b456d27a11589400be42ac4cc4d67d64aa245b GIT binary patch literal 2105 zcmbVN&rcIU6rSCkBFYa@3pF9?D5-z~(QqK*#ZoGeAT$&ejR{%lN*l_yp%wJv+33}i zM@{?-yqNe0c=X@_6HGjq$iV|K95`U`+i!MhD@BYXWjgP@?|bik^JY2`PpMm%`z{R$ zQGeyMz+b%*G9;=#7X&>m7e%|++1c4p!mL9~<7jMX`1+JnEZ8fqtn~}AjaoA*6n-uQE#O>Kw zDm57&i%lnHZ^Tm5iKz;0NWLwkw61}^URAff>kWy&@(fs7M`mpBjv*OOmF$v30?16s zpby)kadTHRYRiKP(gmvyZ%|Q`CbSML6+0X!tqWDLrf+>xWwm_kiz=)1tuLwQJCqo* zbJ=Bw3P5hHA)Q~~Ja#|lIO(iAuS$89cI;B7M&MfnhL`jJI%#DWm96G8`C_R?>{G-_ z5T$GQa_}`}-D1ghOZz4p(V8Q)`KG(z=2u)r%@y0E=;EFc?jS$Lk>Oixs8K`pf92hh zf0=Ibf+#qaKu+GPliaPBy>+?{92gHO5}=XnvvJNkq$mA&xhgrx5Dtd%+~5Z1z-&j_ zG#mE7zcK#UG8UP*qH|)5R@J8X&5Urh)_oXyU?kR7&AaMb);OxKz%S*{2O%O+r2DRG z@kg(-rCFDr^SC=(C@*qqF;QOE9#g;w*Z1hXr3ANV45M7vIqvL&#jCS_~5C~TZ!L0}&A1ggpv^$vlZO?A@@7}p`J-7_) Oey!pSTcZU(b-w|StZT*q literal 0 HcmV?d00001 diff --git a/gamma_age_v2/habd_onpcrespawn.nss b/gamma_age_v2/habd_onpcrespawn.nss new file mode 100644 index 00000000..2fdcc03e --- /dev/null +++ b/gamma_age_v2/habd_onpcrespawn.nss @@ -0,0 +1,165 @@ +// Hemophiliacs Always Bleed to Death +// By Demtrious and OldManWhistler +// +// PLEASE READ "habd_include" FOR MORE INFORMATION. +// +// OnPlayerRespawn event handler. + +#include "habd_include" + +// Change this value if it is causing server lag. +const float GHOST_LOOP_TIMER = 6.0f; + +// **************************************************************************** + +// This function acts as a player heartbeat while the player is under the +// "respawn effect". +// oOldFollow - is the last object the player was told to follow. + +void Ghost(object oOldFollow = OBJECT_INVALID) +{ + object oMod = GetModule(); + object oPC = OBJECT_SELF; + string sID = GetPCPlayerName(oPC)+GetName(oPC); + + if (HABD_DEBUG) SpeakString("DEBUG: HABD OnGhostHB, "+GetName(oPC)+", PlotFlag:"+IntToString(GetPlotFlag(OBJECT_SELF))+", CommandableFlag:"+IntToString(GetCommandable())+", HP: "+IntToString(GetCurrentHitPoints(oPC))+", master: "+GetName(GetMaster(oPC))+", state:"+HABDGetPlayerStateName(oPC), TALKVOLUME_SHOUT); + + if ( + (GetPlotFlag(OBJECT_SELF)) && + (GetLocalInt(oMod, HABD_PLAYER_STATE+sID) == HABD_STATE_RESPAWNED_GHOST) + ) + { + // Is there someone to follow? + object oFollow = GetLocalObject(oPC, HABD_GHOST_AUTOFOLLOW); + HABDAssociateBusy(); + SetCommandable(TRUE); + // Most important, schedule the next iteration of the heartbeat. + DelayCommand(GHOST_LOOP_TIMER, Ghost(oFollow)); + if (GetIsObjectValid(oFollow)) + { + if (oFollow != oOldFollow) FloatingTextStringOnCreature(GetName(OBJECT_SELF)+" is now following "+ GetName(oFollow), oPC, TRUE); + if (GetArea(OBJECT_SELF) != GetArea(oFollow)) + { + SendMessageToPC(oPC, "Jumping to "+GetName(oFollow)); + // Not in same area, jump them there + ClearAllActions(); + ActionJumpToObject(oFollow); + } else { + // In same area, move them there + ClearAllActions(); + DelayCommand(0.5, ActionForceFollowObject(oFollow, 6.0f)); + } + } + // Remove their ability to control themselves + SetCommandable(FALSE); + } else { + // Respawn state has been removed. Restore the player to normal. + SetCommandable(TRUE); + SetPlotFlag(OBJECT_SELF, FALSE); + // Set playerstate to alive. + SetLocalInt(oMod, HABD_PLAYER_STATE+sID, HABD_STATE_PLAYER_ALIVE); + FloatingTextStringOnCreature("OOC: You shake off the ghostly effects.", OBJECT_SELF, FALSE); + // Restore the player's reputation with HOSTILE faction. + SetStandardFactionReputation(STANDARD_FACTION_HOSTILE, GetLocalInt(oPC, HABD_OLD_FACTION), oPC); + DeleteLocalInt(oPC, HABD_OLD_FACTION_SET); + effect eEffect = GetFirstEffect(OBJECT_SELF); + while(GetIsEffectValid(eEffect)) + { + // They are rezzed, remove sanctuary visual effects. + if (GetEffectType(eEffect) == EFFECT_TYPE_CONCEALMENT) + { + RemoveEffect(OBJECT_SELF, eEffect); + } + eEffect = GetNextEffect(OBJECT_SELF); + } + HABDAssociateNotBusy(); + AssignCommand(OBJECT_SELF, ClearAllActions()); + // Fixes the inital respawn issue with monsters not reattacking. + object oMonster = GetNearestCreature(CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_ENEMY,oPC, 1, CREATURE_TYPE_PERCEPTION, PERCEPTION_SEEN); + DelayCommand(9.0, AssignCommand(oMonster, ActionAttack(oPC))); + } +} + +// **************************************************************************** + +// OnPlayerRespawn event handler. + +void main() +{ + // Check to see if the system is supposed to run this script, otherwise + // it may be configured improperly. + if (HABD_RESPAWN_SCRIPT != "habd_onpcrespawn") + { + ExecuteScript(HABD_RESPAWN_SCRIPT, OBJECT_SELF); + return; + } + + object oPC; + // Catch if the script was forced to executed. + if (GetLocalInt(OBJECT_SELF, HABD_FORCED_RESPAWN) == 1) + { + oPC = OBJECT_SELF; + HABDAssociateBusy(); + } else { + oPC = GetLastRespawnButtonPresser(); + } + object oMod = GetModule(); + string sID = GetPCPlayerName(oPC)+GetName(oPC); + + if (HABD_DEBUG) SpeakString("DEBUG: HABD OnRespawn, "+GetName(oPC)+", HP: "+IntToString(GetCurrentHitPoints(oPC))+", master: "+GetName(GetMaster(oPC))+", state:"+HABDGetPlayerStateName(oPC), TALKVOLUME_SHOUT); + /* + // Set the player state to respawn. + SetLocalInt(oMod, HABD_PLAYER_STATE+sID, HABD_STATE_RESPAWNED_GHOST); //set playerstate to DM raised. + + // Make it look like something happened. + ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_DOOM), oPC); + */ + // Raise the player. + ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectResurrection(), oPC); + /* + // Most important, schedule the ghost heartbeat. + AssignCommand(oPC, DelayCommand(3.0, Ghost())); + + // If they have a master, set up the master as the autofollow. + if (GetIsObjectValid(GetMaster(oPC))) SetLocalObject(oPC, HABD_GHOST_AUTOFOLLOW, GetMaster(oPC)); + else + { + // Remove any old autofollow objects. + DeleteLocalObject(oPC, HABD_GHOST_AUTOFOLLOW); + } + + // Apply the user defined effects. + AssignCommand(oPC, HABDUserDefinedRespawn()); + */ + // Check if we are re-entering this state from persistence. + if (GetLocalInt(oPC, HABD_PERSISTANT_REAPPLY) != 1) + { + // Apply the respawn penalty. + HABDApplyPenalty(oPC, HABD_RESPAWN_XP_LOSS, HABD_RESPAWN_GP_LOSS); + } else { + DeleteLocalInt(oPC, HABD_PERSISTANT_REAPPLY); + } + /* + // Make them invulnerable + SetPlotFlag(oPC, TRUE); + + // Make them ignored by hostiles + if (!GetLocalInt(oPC, HABD_OLD_FACTION_SET)) + { + SetLocalInt(oPC, HABD_OLD_FACTION, GetStandardFactionReputation(STANDARD_FACTION_HOSTILE, oPC)); + SetLocalInt(oPC, HABD_OLD_FACTION_SET, 1); + } + SetStandardFactionReputation(STANDARD_FACTION_HOSTILE, 100, oPC); + + // Apply effects to make them a ghost. + // Don't set the concealment too high just incase they find a way to abuse the system. + effect eBad = EffectConcealment(1); + eBad = EffectLinkEffects(EffectVisualEffect(VFX_DUR_PROT_SHADOW_ARMOR), eBad); + eBad = EffectLinkEffects(EffectVisualEffect(VFX_DUR_GHOSTLY_VISAGE), eBad); + ApplyEffectToObject(DURATION_TYPE_PERMANENT, eBad, oPC); + + FloatingTextStringOnCreature("OOC: You are a ghost. Do not interact with the other players.", oPC, FALSE); + SetCommandable(FALSE, oPC); + */ +} + diff --git a/gamma_age_v2/habd_rules.uti b/gamma_age_v2/habd_rules.uti new file mode 100644 index 0000000000000000000000000000000000000000..2a86607e88947c99cf961bafe061c64a76499b3d GIT binary patch literal 1325 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 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/herp.utc b/gamma_age_v2/herp.utc new file mode 100644 index 0000000000000000000000000000000000000000..f7eb58105495c8ff9e5e33612b12f105c3f587f8 GIT binary patch literal 5380 zcmeI0S(g(<6vvBAQHKEm6;xywlvO}QMJ1EW5*RWe2@I}7C8?P-)9DV~omt#)K}AJz zUs2pw9{dV^0>6Nd`rdfVZ<2ibc4|31>cm3*Cr@H#~?dqx=s$^Fk-nn(h zZl%;AXxCh&&ZEqADYXyfuZxu0JWHuXiv3TJST1pB4O^;FE%%7yN?Y7X_aZ{F308E#s9`T}Z+? zD9OtNuM@mo@E*Yff-8cL3U&ogS)Pq+odmPw@dq4HRadbpjK1X%ri}R9d6qfe71qab zpXUL_b{fmeVoH8@Id}^?V?Xnu+n_6i1&~od~f>XN~GoNS|J105g@1Mh5rv00JCOuy2^HLoC z`y60?=b+#0!{|k6U%Pm|r~A@5|2#gN+xsDYx8^_t5Wj_-tMkwb1ifOKEmudTWWtge zRjQPAhVJeo-(UJ(e`sW7hX3Oc3hygnU?()1vCrH8$m$Pqds9>Y%BsuDxKn zT@B5C(le#rTARUo=58XLQtv>pgybx<}k|InqIdF%@-fT#p%*Gc`S3aXRrY zMSowxMS#pkeKfmyi#sv!J7PpxsOw^Z_R-`i>W+ zy=2=#V7#c~KA@*M%sv7$TJ^nldb*l)Tvs|q5j$D$_x*bBgkz(r)S#XmZMztyA2~Jj z2XbBGjTsCQVN%&rrhcp)c5V{Ut(iETN*ZUWa-3ZQ$kC{ZpxgS8S73j*%cQ;BGOn9p zCrLdMMToyajwbb-ZsK7uWo_LF5tb@ENxj#rmzXFs?b`Ln+M<6wnLL-|e7tQ@++EsV zCm)jbL!k+BX4LUaQXleqTt6OAc^m;8#N{y-S|5HXs-5>a_2JHHnX2O=>tk2e)nS-6 z;`hDB+fHjFADL$2ENa(8k?FioS-;uD^Np{?1EM(UC@)58c+$O4256519`&jC!GM*ES*2y6@HFlt_PodXf^U1Jhv5Z&r1*!1myK zHB4n)widRK5NT5oXG1y^bj55)t8JtLhMe~6dsUkWxS?(Y$87~ZMjtszz!)NaJ2~I; z_UA#|r*VzT&~QJ-wJyH_T@d$M-4NHv3@7(7i=ibD!_M_B_etCzabLv!5Wgqf|8U>K z{SNmzE1^};YG@6#7Fq|bhqzDK0BwZ0AK^Y^6SNuPeq$@N4dT9n`w8wNc0#)#?iaXE z;QoO70`3R658(Qr>wd2Hxz6YMelL`PdZ1UJ)6lEXYtR|!b?6P~P3SG?ZRj27UFbdN zedq(|L+B&uEc7w-33Lwn6#5MM9Qp$K68Z}I8u|wM7WxkQ9vXmVL9?O%`?JU*205q~ m>Vx_r#wRuABiAGQp#9JwbO0(qLr@Vq2$dklv~0@?%D(`XI~7_0 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/hide_lg.uti b/gamma_age_v2/hide_lg.uti new file mode 100644 index 0000000000000000000000000000000000000000..8de3476a581072cd31ea9749fc5d7b17f7df5008 GIT binary patch literal 1741 zcmZ8h*;3R%6m1mTcX8iF1VKdykaDUbHI*57rJ6}INs&yak{+w@Tl@eY{0#jr zJtxyWX>zMh?zy?Q_wKXT@3i(mtZjT0LYx7*z&h{~0sZeeA@<;B&I$1c{xAFm_=e;Gk3NI64~G#JkOYC_#WUr?5iwK zrBR_OLv zy0S0_;f_XEbsRL}uoovIKi`b|aWahS_F*ILs`PtO*7?3JO6~QxrBbY<&hM(hu^)#! z$a(po5rXqsZ^S5r_H^n;s}>VpXiSb*c+&qK!9P+{Sst z(=7Iz@iZ&MH)Uk%<*V4scMF}X!X&B;65a$GpV;dqdgDWLlDpGK|F|!Gd6>FCjQ3?a zb}^1tW)x9tlen(H{TmI`W}Yj_<%q6Kl`*QbZR^`Q%W!*bg!d6Akvd3+eA6o%wVv?3 zenqNPZSZO<;I-z%bt3I^J~G=6^{AR22_G#*U>2AID88&^TM7;zCdGqdN^zukQWz+f zoB+j2N76djhb@05K@OA7@`p)LE~rYen;R*@4b9+0YOd|O+!Gm-5el`rBmc<6`l zAxLnJ<7uWAPlziW-*bIu?%bJ7jz6_(mDSm)nHNf_gFpbh2fiFoY8pN|q||5l9r$1H zKMpH(2L3k;PTl7N_8mYfw;hN7Eco#}(|-)X?E_fn1h5}CT5v3@9u=JZyatW|obwT& zp_Sa2=bEScp*m7{TaRndIG@JxZXaCRjycHzg`I-uSQ=|v&VKE@du zS&+1ygxxGOojlLD=1V6FH$uUIwDe|wV)3j7I@y$T_g&Sb*=_*R%uFQxQu*s`R9JhjSGZ@VG zN^wJ?uVFgKw@i{6r{26o*vTNjBJC|V_7;(I^7T^e&4+F24(8WOG5R;X$jO&tZ%KE2 zw|*)1%sLLeE;+?{`te`{?q8=ZbKS0JZbvnA zBv~f4g<^cw#4&Df5kWJ8(3iDX{87A`m>CEJ1#}6yN`AtVm1Xh6UQCIxpP4eZl_)WJ zha}Vs>J>F&2;l#k|4B}!HuAqooulqk$EowwFzPzBjcriBhXLv}b(;E2U8WvWhpE5R zUFt1$mik%&MgVS$`Z)%S1Jp_C<6GbzKz*bxQfH`x)IaJT^^W>M-QZ?$GHMoh0z3tt V0nY(`qhA8A0Dc$W0Nk&;_dn8;7i0hc literal 0 HcmV?d00001 diff --git a/gamma_age_v2/hide_sm.uti b/gamma_age_v2/hide_sm.uti new file mode 100644 index 0000000000000000000000000000000000000000..cc5e1ebb8f36ff8da85f1b7b1b477e09f6eeb315 GIT binary patch literal 1741 zcmZ8h*-{fh6m1mTcX8h$f}kP_zUZ3}q)1huQj@?d)npoGik|e;Ovftx7C*oTKSRGu z&zW>*n%t^0_uRR+_wKXTYc=*it*m_(LYxCSz$)+)0sZe8A@<;>E(q}l{xAF`_hy<-cV(vVXH%8^BF$}T234MMD^>%W9;FHc_2luWq5C!y zSsbf!{I6+BI}Sj))@U{As`}lvvVYRWfUc;c&6)c3I6l)wI5wL!hegSGcv~+rQ*>lu z527uDuIjiw5l7u59fbMGxR<2IN!>o0h&xJuPs=*rGev2F{x+1xO6vTs>Ys#hw1r%d zZ%@S0M%q_--M&2$WBz8SgZxAsZOcI%_CFCv<`A3SR?;S_SZx|@3T&c_*L>W>c_ia3 z_M7oIE5wenQV01e4)UGC7#$#m!3S-{tx4QsfRws z(aMY>>TDF(6}W$czFN<7CAl2Yky=@+TAQxEX|fEr*F|_ANgAtzGUJ|qli(wC|V7G3z`EcO7p-1K=D}wC=3(?iVnqwB13VZ Ms8CEOBAh?*A1WCOAOHXW literal 0 HcmV?d00001 diff --git a/gamma_age_v2/hide_st.uti b/gamma_age_v2/hide_st.uti new file mode 100644 index 0000000000000000000000000000000000000000..1243d972c030526417c04b62cb7fa2593f88b285 GIT binary patch literal 1869 zcmbVNYflqF6de_Ozs2{fA_yv?fX{E10-;GI&9?B#gbdw*-LTu)>`qPa7x_c{A^s2( zJ!d=99U4D*lhb?d-aB_5JA1m_ZPs>H7MDK?Ax;5b0rKA`g;;{Wcv^^UcnSXtzJ3PJ z;Qzqj#0&nwegH_7_S5nUHl~{dP5@T{jz@cO)^g7K%JK>LPr!MAW7Yv0rZ0_o&U0lL zmOV(>?;OB6XdF*ty}u65?P@Nuz}jVa*3#J9ajw_ZUGw;LaITwn18{r_ocp5P1Qtpr z#4YRTZUb%&cfj3TcRha3$o1n$=G*yA;DXHP&}%`~_>m#5%7KiUl7 zYG%Q?XWBD>`{LQm0W^-82R>W=9Nw9`7p!^d9>ViH%8LWfckXNvBn1A|lh0`X+mmBo z1H3o97jJ+z&{b)cNTUK(1ZrQ1RavN}Q7KZTwRBG=@plz&$yDLVnkssEoS9hn%RJ*| zsQM<}j};c*l?TIt_O}tq{6H0>XANDLQ2^30I#I(`<>QW#y~7SBv_8^s4vH9i=N+ba1M7gfHi^Fn+5 zR#k$XRQWB{JM`mV1353>8jFL~xTmsed}}Pm`t>03@?&wZDf^+{e=H949uB>wq={6% z)X<5}afmivc5wsmBN}CK-i$|CA-*Uh6E9!JUcQ~{Oywq4MJwh_uo~mb=lH87H%S0KYnrpVcq01z3Jff4AO;I715ZIwa(sSXVqs}!Q7S7?jtMTsS78*N So1YS&lA0C|lm|;HFaQAg*bT%0 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/hif_onacquireite.nss b/gamma_age_v2/hif_onacquireite.nss new file mode 100644 index 00000000..effa7495 --- /dev/null +++ b/gamma_age_v2/hif_onacquireite.nss @@ -0,0 +1,13 @@ +// prc_onaquire,x2_mod_def_aqu +///////////////////////////////////////////////////////////////////// +// +// This script has been auto-generated by HakInstaller to call +// multiple handlers for the onacquireitem event. +// +///////////////////////////////////////////////////////////////////// + +void main() +{ + ExecuteScript("prc_onaquire", OBJECT_SELF); + ExecuteScript("x2_mod_def_aqu", OBJECT_SELF); +} diff --git a/gamma_age_v2/hif_onactivateit.ncs b/gamma_age_v2/hif_onactivateit.ncs new file mode 100644 index 0000000000000000000000000000000000000000..3cc571e0520a11ca0035c509b2dafd25ffe928ab GIT binary patch literal 76 zcmeZs4ps;=)H85mU|{f(0}>1z3Jff4AO;I717AT=a(sSXVsc4lSz<{lD^QjRF3DM( N3zUloN`l1|7y#GU488yW literal 0 HcmV?d00001 diff --git a/gamma_age_v2/hif_onactivateit.nss b/gamma_age_v2/hif_onactivateit.nss new file mode 100644 index 00000000..1a3da0c4 --- /dev/null +++ b/gamma_age_v2/hif_onactivateit.nss @@ -0,0 +1,13 @@ +// prc_onactivate,sm_on_act +///////////////////////////////////////////////////////////////////// +// +// This script has been auto-generated by HakInstaller to call +// multiple handlers for the onactivateitem event. +// +///////////////////////////////////////////////////////////////////// + +void main() +{ + ExecuteScript("prc_onactivate", OBJECT_SELF); + ExecuteScript("sm_on_act", OBJECT_SELF); +} diff --git a/gamma_age_v2/hif_onclientente.ncs b/gamma_age_v2/hif_onclientente.ncs new file mode 100644 index 0000000000000000000000000000000000000000..657b79c0f2abb6eb0d0234e3e57fe99006f08c88 GIT binary patch literal 80 zcmeZs4ps;=)H85mU|1z3Jff4AO;I719w4Da(sSXYFfB*mh literal 0 HcmV?d00001 diff --git a/gamma_age_v2/hif_onclientente.nss b/gamma_age_v2/hif_onclientente.nss new file mode 100644 index 00000000..c71be091 --- /dev/null +++ b/gamma_age_v2/hif_onclientente.nss @@ -0,0 +1,13 @@ +// prc_onenter,sm_on_client_ent +///////////////////////////////////////////////////////////////////// +// +// This script has been auto-generated by HakInstaller to call +// multiple handlers for the oncliententer event. +// +///////////////////////////////////////////////////////////////////// + +void main() +{ + ExecuteScript("prc_onenter", OBJECT_SELF); + ExecuteScript("sm_on_client_ent", OBJECT_SELF); +} diff --git a/gamma_age_v2/hif_onclientleav.ncs b/gamma_age_v2/hif_onclientleav.ncs new file mode 100644 index 0000000000000000000000000000000000000000..ad990590b16eef823fa7df69daad211914adfcad GIT binary patch literal 79 zcmeZs4ps;=)H85mU|{f<0}>1z3Jff4AO;I719w4Da(sSXPHJLVDl1Tm2`1z3Jff4AO;I71AjqLa(sSXMrvYFNm6QJ2`f;V2`1z3Jff4AO;I718+f5a(sSXZhlHmeqstMP?8BQ$5WgO Ol!^z+#pghz6c_;Uvkiy< literal 0 HcmV?d00001 diff --git a/gamma_age_v2/hif_onmoduleload.nss b/gamma_age_v2/hif_onmoduleload.nss new file mode 100644 index 00000000..dbb5c226 --- /dev/null +++ b/gamma_age_v2/hif_onmoduleload.nss @@ -0,0 +1,13 @@ +// prc_onmodload,sm_on_mod_ld +///////////////////////////////////////////////////////////////////// +// +// This script has been auto-generated by HakInstaller to call +// multiple handlers for the onmoduleload event. +// +///////////////////////////////////////////////////////////////////// + +void main() +{ + ExecuteScript("prc_onmodload", OBJECT_SELF); + ExecuteScript("sm_on_mod_ld", OBJECT_SELF); +} diff --git a/gamma_age_v2/hif_onplayerchat.ncs b/gamma_age_v2/hif_onplayerchat.ncs new file mode 100644 index 0000000000000000000000000000000000000000..8fe597f00f6edc791203a3ef7c560fc588229586 GIT binary patch literal 83 zcmeZs4ps;=)H85mU|1z3Jff4AO;I7gFr!1a(sSXK~7?2YEg1VVhJlyo(V3^ Qmy(;736`&fODZq`0AOqn#sB~S literal 0 HcmV?d00001 diff --git a/gamma_age_v2/hif_onplayerchat.nss b/gamma_age_v2/hif_onplayerchat.nss new file mode 100644 index 00000000..c1ca05df --- /dev/null +++ b/gamma_age_v2/hif_onplayerchat.nss @@ -0,0 +1,13 @@ +// prc_onplayerchat,dmfi_onplychat +///////////////////////////////////////////////////////////////////// +// +// This script has been auto-generated by HakInstaller to call +// multiple handlers for the onplayerchat event. +// +///////////////////////////////////////////////////////////////////// + +void main() +{ + ExecuteScript("prc_onplayerchat", OBJECT_SELF); + ExecuteScript("dmfi_onplychat", OBJECT_SELF); +} diff --git a/gamma_age_v2/hif_onplayerdeat.ncs b/gamma_age_v2/hif_onplayerdeat.ncs new file mode 100644 index 0000000000000000000000000000000000000000..fee5601d39bee54ce132cbedba53eb16e58f3665 GIT binary patch literal 75 zcmeZs4ps;=)H85mU|{f;0}>1z3Jff4AO;I719w4Da(sSXN@`+B1}jjC2_aLQ3zUdQ I$S5!X0JDq?KL7v# literal 0 HcmV?d00001 diff --git a/gamma_age_v2/hif_onplayerdeat.nss b/gamma_age_v2/hif_onplayerdeat.nss new file mode 100644 index 00000000..d4d89e86 --- /dev/null +++ b/gamma_age_v2/hif_onplayerdeat.nss @@ -0,0 +1,13 @@ +// prc_ondeath,sm_on_death +///////////////////////////////////////////////////////////////////// +// +// This script has been auto-generated by HakInstaller to call +// multiple handlers for the onplayerdeath event. +// +///////////////////////////////////////////////////////////////////// + +void main() +{ + ExecuteScript("prc_ondeath", OBJECT_SELF); + ExecuteScript("sm_on_death", OBJECT_SELF); +} diff --git a/gamma_age_v2/hif_onplayerdyin.ncs b/gamma_age_v2/hif_onplayerdyin.ncs new file mode 100644 index 0000000000000000000000000000000000000000..b07ca4288431156cffc2ba6ca571edacaec7332c GIT binary patch literal 75 zcmeZs4ps;=)H85mU|{f;0}>1z3Jff4AO;I719w4Da(sSXN@ZqVIxA3$2_aLQ3zUdQ I$S5!X0Jn+^X#fBK literal 0 HcmV?d00001 diff --git a/gamma_age_v2/hif_onplayerdyin.nss b/gamma_age_v2/hif_onplayerdyin.nss new file mode 100644 index 00000000..428df190 --- /dev/null +++ b/gamma_age_v2/hif_onplayerdyin.nss @@ -0,0 +1,13 @@ +// prc_ondying,sm_on_dying +///////////////////////////////////////////////////////////////////// +// +// This script has been auto-generated by HakInstaller to call +// multiple handlers for the onplayerdying event. +// +///////////////////////////////////////////////////////////////////// + +void main() +{ + ExecuteScript("prc_ondying", OBJECT_SELF); + ExecuteScript("sm_on_dying", OBJECT_SELF); +} diff --git a/gamma_age_v2/hif_onplayerequi.ncs b/gamma_age_v2/hif_onplayerequi.ncs new file mode 100644 index 0000000000000000000000000000000000000000..7ca177b3270d4acaa3fa316af54a783e4b1f4d81 GIT binary patch literal 76 zcmeZs4ps;=)H85mU|{f(0}>1z3Jff4AO;I717|@|a(rrGX=VW{P=X0A&R1a+pPQc& OpOTsek_JmEFaQ9xI}CyV literal 0 HcmV?d00001 diff --git a/gamma_age_v2/hif_onplayerequi.nss b/gamma_age_v2/hif_onplayerequi.nss new file mode 100644 index 00000000..f7fa8ee7 --- /dev/null +++ b/gamma_age_v2/hif_onplayerequi.nss @@ -0,0 +1,13 @@ +// prc_equip,x2_mod_def_equ +///////////////////////////////////////////////////////////////////// +// +// This script has been auto-generated by HakInstaller to call +// multiple handlers for the onplayerequipitem event. +// +///////////////////////////////////////////////////////////////////// + +void main() +{ + ExecuteScript("prc_equip", OBJECT_SELF); + ExecuteScript("x2_mod_def_equ", OBJECT_SELF); +} diff --git a/gamma_age_v2/hif_onplayerresp.ncs b/gamma_age_v2/hif_onplayerresp.ncs new file mode 100644 index 0000000000000000000000000000000000000000..152318e9c2d90399827325a9fbee7c7f89fc54b6 GIT binary patch literal 79 zcmeZs4ps;=)H85mU|{f<0}>1z3Jff4AO;I718+f5a(sSXQEG8PVtF1bP?8BDSDXu! Kibs}HU;qFK0S-F= literal 0 HcmV?d00001 diff --git a/gamma_age_v2/hif_onplayerresp.nss b/gamma_age_v2/hif_onplayerresp.nss new file mode 100644 index 00000000..c49729b2 --- /dev/null +++ b/gamma_age_v2/hif_onplayerresp.nss @@ -0,0 +1,13 @@ +// prc_onrespawn,sm_on_respawn +///////////////////////////////////////////////////////////////////// +// +// This script has been auto-generated by HakInstaller to call +// multiple handlers for the onplayerrespawn event. +// +///////////////////////////////////////////////////////////////////// + +void main() +{ + ExecuteScript("prc_onrespawn", OBJECT_SELF); + ExecuteScript("sm_on_respawn", OBJECT_SELF); +} diff --git a/gamma_age_v2/hif_onplayerrest.ncs b/gamma_age_v2/hif_onplayerrest.ncs new file mode 100644 index 0000000000000000000000000000000000000000..8aa84fd6086db2898a644f4482f17708f67e474b GIT binary patch literal 71 zcmeZs4ps;=)H85mU|?{U0}>1z3Jff4AO;I714ltoa(q#0aS1C>oCz+>Rh%22pNEi8 GU;qGX0}9Fj literal 0 HcmV?d00001 diff --git a/gamma_age_v2/hif_onplayerrest.nss b/gamma_age_v2/hif_onplayerrest.nss new file mode 100644 index 00000000..e83a048f --- /dev/null +++ b/gamma_age_v2/hif_onplayerrest.nss @@ -0,0 +1,13 @@ +// prc_rest,sm_on_rest +///////////////////////////////////////////////////////////////////// +// +// This script has been auto-generated by HakInstaller to call +// multiple handlers for the onplayerrest event. +// +///////////////////////////////////////////////////////////////////// + +void main() +{ + ExecuteScript("prc_rest", OBJECT_SELF); + ExecuteScript("sm_on_rest", OBJECT_SELF); +} diff --git a/gamma_age_v2/hif_onplayeruneq.ncs b/gamma_age_v2/hif_onplayeruneq.ncs new file mode 100644 index 0000000000000000000000000000000000000000..735449e844e01b061be14c690e9c249f3c17beb6 GIT binary patch literal 80 zcmeZs4ps;=)H85mU|1z3Jff4AO;I719w4Da(roCYGG++0V`072`(d0VHBU6 QpAw&vng&q-mR4W@00*fKPyhe` literal 0 HcmV?d00001 diff --git a/gamma_age_v2/hif_onplayeruneq.nss b/gamma_age_v2/hif_onplayeruneq.nss new file mode 100644 index 00000000..efab99cf --- /dev/null +++ b/gamma_age_v2/hif_onplayeruneq.nss @@ -0,0 +1,13 @@ +// prc_unequip,x2_mod_def_unequ +///////////////////////////////////////////////////////////////////// +// +// This script has been auto-generated by HakInstaller to call +// multiple handlers for the onplayerunequipitem event. +// +///////////////////////////////////////////////////////////////////// + +void main() +{ + ExecuteScript("prc_unequip", OBJECT_SELF); + ExecuteScript("x2_mod_def_unequ", OBJECT_SELF); +} diff --git a/gamma_age_v2/hif_onunaquireit.ncs b/gamma_age_v2/hif_onunaquireit.ncs new file mode 100644 index 0000000000000000000000000000000000000000..7ac12ea292a86767b33b883e4cba6eea96f7098c GIT binary patch literal 82 zcmeZs4ps;=)H85mU|1z3Jff4AO;I717AT=a(sSXXD^QjRF3De< O3zUloN+u&@6&L_TI1hLL literal 0 HcmV?d00001 diff --git a/gamma_age_v2/hif_onunaquireit.nss b/gamma_age_v2/hif_onunaquireit.nss new file mode 100644 index 00000000..03f75262 --- /dev/null +++ b/gamma_age_v2/hif_onunaquireit.nss @@ -0,0 +1,13 @@ +// prc_onunaquire,sm_on_unacquire +///////////////////////////////////////////////////////////////////// +// +// This script has been auto-generated by HakInstaller to call +// multiple handlers for the onunaquireitem event. +// +///////////////////////////////////////////////////////////////////// + +void main() +{ + ExecuteScript("prc_onunaquire", OBJECT_SELF); + ExecuteScript("sm_on_unacquire", OBJECT_SELF); +} diff --git a/gamma_age_v2/hisser.utc b/gamma_age_v2/hisser.utc new file mode 100644 index 0000000000000000000000000000000000000000..a4761ca175ffbba4a386bcdf00eec61ae763ed25 GIT binary patch literal 6215 zcmeI0S(hBO8HOtcLxOD#0kSVL7~{Zr@J7f&61Tf&gYkHn9(%HoOw?8CZZXxRc9m+{ zO~^tvoP8(z%0;e|UyzgQoRh!6ImyX&{z3A-RjQtk3ygDyb)QefsoCU8+l) zZFTv~{OJ!wQM3sizcq?p#`SLpqUb4HpT8@L4(yMj7w?OrXWkG+|9DFjCAj_v3Adv* ze~@@Zag{oP7X&W~UJ|@4ct!A&f@w?B|Ek~%g4YCJ6ud6@X~7$UyMpP5=2@2nUlzP2 z_~U{jcS@2f`e^v0;1b!P0&7cz~?f5 zkewklcCanm)HX-ap}?$rCv*t)$%mo4!EDZPGLi4DsJ8vh;E#skmBy@Ij*&7OrV zaF*UWBg}>1w}V$9KI|mhk3doM$~oFFS8@Gw0vFB= zH4oi~fs-GFjs-pmek|}Q@M7T8;LCx}fct^Zf+v9=178dLe(+0y9|yl2nEzpa3j9Iv zUjly!{C6<@`(cQQ%vj@^A%6s#3(Q#H`eFIUpw+T`aWu2-k7QP*kW;YRDrwy(uEV&`kMy;*+ab9d8MukS0yVh1{cHAr57UVxYu zp|CWgB{2VE{+Bv`M17{~_4EIz!+mub;(r*|{|dyha4&rl`e)eF$p041KZQ**8mHQu z4O48GeiUu!*r3`hE!w>BYkJfauIg81qt#5_b<}9rgE29y{ zq|>@+CG#fF%drn8tUA|VRbkDon|#zU+7GMzd6!Jji!pb-&OK~e*YS=Xn5bi7J>9f3 z|98D`E_&z~zRB(-_-ii%f<3RwZ&|)I@1^!o?`1$+I^EeoJT!%C+LyUbTaD9~tzUOG z^Gz@9GS5xsXT=xv)fuyo-1K`cE1T-k#HOh%=)-q1zvNu9uxo=i@jt33{W67>&f6IM zfzs4u0|O)Brl`HqN}er?*&yNF*i_-Pp;0U9R?)SL81+3kJ>)NDYwQoBtnYWnCQV!H zq|UdzhyM*?w9a?*2$R8(4S8F@Ej^Uf`GqXmV4&>X*QpznqJKT9=cTTX)#j`2n*L_- zP~X2)n7m{9HZyhpVs<`tl|kJdIB*q@hb>HtXeqL@_1u(UWO1u!Q$&4L)J}C#G&j+H z;Yw-8+biCT>cVxM8t=_)J+<9vg!!$W#UFTeXO;o*`7&R5QWRAA#Z(VM1XTGpHW8Dr znq8At_K5nmeY{f_R`!ie0*_S%w+(Fp=kV2+pA(wxo3F&n)g855atZRiT~=V@zhZNg zWq(F~6aA?(Cq@QsRO+&ULV)#8jC6LQf+Ev9M%iqrd)61q4~@cdH%e!T%FO^w&XI8_-U5RH`61s>>fH9^G9t5%w-dPIfN=+>Lm zjIlS^cuq~MAF2_iOO0%n%&Ed@|K3gLmSI6C>by-r+gji0iIk@mUOc?>sU zw3$(TGeYpF)aZmG)@qQua!l_$ev%_D9NMG?14ZvsESJH&>JH7EN-bQh)s@n~V?DzX zJw-M6hW<8#L7}iuD5K+H?NP%))?;TaJOUL*m^zOdnzrFN^J)u!KIj-@9hDipMT;hw zLY4#?qf6qN&;cyN6T%PH&vs9E)af9e=9f?2Y=hQZ^9t{e<8 z2ux&Z2bEKr=803V8Uxs+AuuerSlEa_%*5F3fKu#`CH6Hqvi7#k;AR+#sOAittC(DD zqKODgxO-Yf)KrxoA^4oZjHD*UcBU+Lk!m%xGDHdE$;879ZW-X|22D94ZT`+sFs}a% zn)?N}`52qe;c&lROeSgaE=#JNzG;Abz0)@Zc)LL~^|U_}dTbe@KeD((7g~pS@2T@ zKT+`01V2geQv^Rj@Y4hLU4AOyCk6!_f$oPMfQ~{BLdT$opyLof2|Nrv0?k1@^3Ow$ zLOj~@NYA7E8R#s;BRh}kJfibx&LcUG;yi-$=*=THkJ>z9pMzS^dFb2FccAY=--Esn z{Q&wQ^dsoU&`+S3pr1lNgMJSE0{SKNE9lqIZ=l~oe4W1O+uFBn_@VO%ho3ZiRe literal 0 HcmV?d00001 diff --git a/gamma_age_v2/hisser001.utc b/gamma_age_v2/hisser001.utc new file mode 100644 index 0000000000000000000000000000000000000000..a2bc5f402beafbcf8cdec8d14b3cf9c9d4557f58 GIT binary patch literal 6414 zcmeI0Tbmq38ONJr1Q!w$6coh@goChIHVJ|VDwCZ(k=@O*Gs&VxH#OZgGsSjyO}eXh zcTf~O;t9`Z#Pb35${X*!@EiCQxbO>jssDc;W?ybXF1+!PdY=FEud1uxs(S0Kn(jK+ zom1ye&7Ax|5Cogh%C$l8XIw8#1;H6yr`{F>hp!8QJKhll&tDY;uiP30BV7NDgxkR! ze~@@ZahckJ=LIhaUKG3}cv3}=LDY@OkXwq zd0OyC1%FKN#|2*y{0YII6uc$)qF^n!CpZ)w2{wZJf(L?!g00|Z1aAwD1t)@2!A|f< z@Fl^S;9Rg5TnOF~yeoK5@L2G(fN1Yu3@agFn<*2o*VoLpdHXdOp`Eutry<(9 zfq58UyUZV^F{Gv+e3s8teGY<~YG&P=p(ChIJ_y|k=HnbE6B%1ynP}%Q^jMV*j?`CP zZV~);aMKpH%SpnPIZ3xoCwZWY=)Ax5l_d?`jg6{@@q%OY)S0>hBT_*BZ8-&JD%+za0Z7KL}0NJPUrT<`ZE4AF<9!=t9k>z;VqFfuF1S{ot2sei;06 z&5wXzt(pIGf35jZ@ZW3xAow3(`ns8C^5YQK75PKZbj=?IbB(c_K6|?6C%_lMOf881 zXN)msUxR(7x$5$U%(!E^Tz$?7)8*<^HL5!FCDWDGuWDbu{+0CeO6UVX$Fg6?p6QoI=_carpvYUzf^~N_!7kbOYSwx5dFq|wyW{Ce-7uo%p}wg>zw{ZTM!rpWv_k3<&*sU4GN@Eq*`E4fTEow5j9m4a7rJ zxTbxP>A2N6eaZTDXH(x;nJco)q<&Jos`n;L8=2|%Tv{~MgIycPvY-#&$^4>o(fp3B zy@_`Vz1uHh^wN17!X7A&O*$~>B-|9tZM33iihMFicsDd!zio!oso&-7L8Q-miO?#L5x=UwoWh^4B0wwbGW64k}5x+MjH&2{rft0gF@KX zyVbl@^|9J~X|Az1iHGX`x!h!J)3>Rq@@Lc2u`4^&*@gpG&^-FWw16i?cCwzEGK?&2 z^=yo&FN@}4o#)L>JU@S_u%oSIZ<4BTUB||IGg(h_E=e%IWn27#SGOk_0Na=O(vzZ~ z%rC@xP)9(SpTj0%vK6yq;<7)Ye$_wTsS3;fjZ6fOl?68pZ4T$m&Yn=n^Ms@Mx8PU7 zQh8IYYM)u1g+rFfI>-ip!xkya{(^iLR@JHFi9xqi?9zcknDvh*Iz3)Op6YF*Y&z6E z>vQFYMq$w#rPD}dW`GSSSFW!XTdS)rwb|-)=T};5?anj`y-8ILm&S-zl_C!Dka9Xl zgDz9Mh`SlpiepucD_0t3y@|~TJA@6V)vonJm0;3TV$*0^6Y9Iv%Th+olRV2px8R3>rn5L6^Kvz4A^WNMMSi zlg;fLaiKMSObbclY8_*=sZo8CAcRzGbi@&BHOO2sqIVvd<%n~KXJUha!ulACW-y~V zLo=;n3m0p3sW9+Z&#**~Q4PMKzs+EfE9@4^=x|th)Nqj1*jWorpkjil^QfWOH?%XO zHt`n(!x(E)r0^Ddw2Mh}aGxtY`vuS19UB!o&Zn!{ZH5K^b8;$^_$Q-_t0B&)Wt#1q zT{XtE)(?gb;WMtDDs5Il!V#pXIdNB2gI;1hV0y6+ayT4C>A)r)Tpz=73VQ)+mNxKz z9U?|BOLoUFc>K^6gCPciiHz-_bV~Dh

_10qn3N=vZd4yb*zziILj|#n>kc>~3&m zXz%1! zWcpjfX0yM!E*Mq+3C;bSn|+8a=wN-nT1+Nt@-B_a{l0ks`D(v!3h<7DXzFQyQ*FUv zFzL=zoy$kq?VDRzSMW;H6`0~y-((9cGjzGJ>(XAm&0|1Q>F(CcP_vo^tSXgQpq_Ittwh-31+k?uPDx?uG7y zcnWbp^Z+ys@swc(dJvk0c#6Q&gHzB$5KjqsI>1u_o(Av~fM5Uo>gU%!zw-HY&#(F? zpcZr*`a1Lt=q2cz(6^v(L*IeE3w;mzKJ)|VhtQ9pA45NZehR$|{S0~q`Z@Fq=$Fv1 zpkG73fqo194&oQWAD|`ZD(GtH|K0y{@If1zhZdkksPPZKN|+dn{1Q0>tw5{L8gv#~ Uhn|8qAo{ce(WhPL9CRM~4@!P`w*UYD literal 0 HcmV?d00001 diff --git a/gamma_age_v2/hisserhide.uti b/gamma_age_v2/hisserhide.uti new file mode 100644 index 0000000000000000000000000000000000000000..f643db3d9c6f623c205f26b118327f7a116bb2a3 GIT binary patch literal 1100 zcmaJ>%T60H6m@y^MS-^T0kn`!H!Lc(l~9+ZVUdvlMPy)sx^Xf$#HuGV8aoSE@oD{# z{!4q#*rs9AE1kIy--qoS=RD6k7hgVp{;HH(1bzS=;P(TiwxBJ7IrJ~+Tj*~~O07cw zfk3Gj{6KoZ!`4!&i1yRyQ!N8%sWO1|3jo(?bMAh$(Ow+@PXN|@2Pi8+DXw$Q<&Yhe zdenYHzsImSgTi_W^XK=$c`4@^6QZm^Grk_dFehvPo6&v_ooaY)?vFVyfpm7}wig5a z3P|!A2Ja>H{19#Sq7C4fFrklX-6do`L6n3-p0p%Gzo#XX4IejJwoMGA|{T zS~;#p+L{|FPIW1W9Elq>ruL?qw(In>LZ;q~jbQV+z6yo$+nwm<- zN@&%F2VReU4lpn#^=)-8|F9_TwV0pHlJ2Z=+((j=su0`PjsFxP{idp=@kZRS;ZCA| z9gn95v!TDP({%L1esevvDMJ53+gb9_T9>gmCj|dr2F^bn$zffKZo;}1?P@*C!+G|%kJuH*e>4nYP{B=Vbv*5JCCgcoxv;-^zd@tlA xtNAWincf>YOsl@$?z#71u7NFgXq`1%8%%QPA>$2XRv<7wg zjPv~R9PGz9?HA>1LIEs)}n0y-D7|^8A$dN%r~Pw z12`A&$oDt{rs5i_gX~MYFGou4>Q*K}9JV^!s|#(-FDbuhCy0!tExc)hsjF_E{-l&D zm?I--G}W`1n7*T9?Pt=zrc$H24a*1eP+N(mx^NzJ@gqmWbSSg+mGe7gd8Nd1Z>Egq zzU3UfeXdKfnf75ABbl!o@xe&DXE;gn7wLK`pC5)r(|3>aPW7SfBW!-4?Y#F9*=ZWlKJHryK_=rk4&K8#yk7F4nPb~pUCq9~9&YouqsDu!P>cD({?rxK zvAo0dcmKs+!rxtNjm4SZ&D!tG8%#1t{>Pcq#tw?wol*{c*Wost&e)V9qu3~#Re%HV lPeAcg^vtBlDQ*gpVy2KOGzyGkQoIx`#kv7doV*z86Bn@Hi^c!| literal 0 HcmV?d00001 diff --git a/gamma_age_v2/hlslang_015.uti b/gamma_age_v2/hlslang_015.uti new file mode 100644 index 0000000000000000000000000000000000000000..8af2150dc164b577df729367bccc5264aaa4015f GIT binary patch literal 1029 zcmZ8gO>Yx15H%m=qm=LRb<2$liU_C@5*%og1Ca`>lF%!1cc+Pkon6_^AryW92YvuQ z7QuUKZ%G;HWjtfgo3Zou(`?*3df9*RN-1>_D1axxw+qSdTvF;M;$QF;{BQVc@PA-% z>K=b!?|`eo4F=h^;6bAv13Liu=?T!Nr+IxD{xz@-u;vt?T}e)HpWLjWu|IjqcRjD+ z+Ir@Besd1?W1e;s=+?Kez60FOfNMFs9Qp48A9Dfk${Coy50Hzt3$%{`|A2{X58?S{ zv_}Bv;vM-OKY*FI#_A{&2@^R{>Ocn>M{(F{?XWJjHD9Irpq(Hyl2CfnL{l%@ea7QT zmeHITL8F!#}tKFmAQ$F|EbKGJs8#h}(M zbF)K=|DC}7m!<4CjcA|tt;8tfQ5pyQ&f)cP1kEgLuzETF{Cu#-|BD*$v_kz&bXbTp zl*i^4>)-sBdxrR6-7CDo1icZeqBq;8DemX^?c8Z&`(^FEQx;wK!5)Iv*qmac=qR2o pfFA{i;YUF6vyx(`$SFvQnu6v9C^Sw>5mUSr?Jhu(Qk>)`{sQawj?Dl7 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/hlslang_016.uti b/gamma_age_v2/hlslang_016.uti new file mode 100644 index 0000000000000000000000000000000000000000..6488e5a8768482a0495748de05275f89464fa796 GIT binary patch literal 1032 zcmZ8g+iuh_5H*)_DdpaBd)jA&R$Y)P9#BQQ`_PqIh`LK(k(*3+E$ldQybnu(FW`X> z;9udK#3@@wIvLN{b7q{Je437XCvW<%-zuf90vYfe_;#iB8`qTjh4?po0k5trbqnqf zjNv0bUA70oMEgXg6BNmJK&+XzWj3^4(5r zxTcTs19GxBcLTsi(9JHA%_)0=FQXd*llHz5$o|-I9{$(zERV6yK`&MF<@u(dK{LbO+r3jjt+uG`K_IZ1-^8#6FyweK5+tI?# zeb8lLsF2lNQoQ>w_X_d;vX=#eA$lWmCI+*9-p2hDzn?j6Y(MwzJ3Dj(40aGS#{SeB ubw~ZI0sJrcukk;i{#i-AQ|HtqbxloEbJQBArH-jz>UI;LPN`4w6Mq5C;*T`| literal 0 HcmV?d00001 diff --git a/gamma_age_v2/hlslang_1.uti b/gamma_age_v2/hlslang_1.uti new file mode 100644 index 0000000000000000000000000000000000000000..bc711f53be76d5cd82d0308baac55515f9e68531 GIT binary patch literal 1007 zcmZ8fT~8D-6fN>0BBCOGy=~%)zCe%{ABDw)O;9%M$}1@|mz{>rbTaKqmhi@pHZ*uUSa;2A*$5dkb(b z-jVO&fw7de)j>|hp9(I0puG%&lvrx**k#(98_9p@QcyV*pEafq##QY)^Fc0EFqcNq zXsjpkVEXn8-Asg?qV=5*T}(d;&Pt?e%cG#Ps}UNeO+)J*?BCDx2Nd(Yd89vWJm=`_ zyUWE6brW`DW!Sh{nqb5q8%~n)S-PGYO)tW%?z)2y^N#g}?JCUAw4HW2sCAjR*&*it zcHsV1Ci`_Qx{2#nLXg2>90&YmiPuXRv{YDcbu~HP+!v<$TDVYZW4AL`exhRkHbUGQ8&Ou27iGeRls{$9o;*b9P}Y<) brAPTvx|9|rMcGoWlqu!81@I!2A^C|vz$%Gf literal 0 HcmV?d00001 diff --git a/gamma_age_v2/hlslang_10.uti b/gamma_age_v2/hlslang_10.uti new file mode 100644 index 0000000000000000000000000000000000000000..c110116209527bd972fa291478ad47e157a1229d GIT binary patch literal 1021 zcmZ8gJx?4l5H$&egpfcI^3|P`hBSzeh9U)U6r4oDiM!Auvpd{cc-O17uec};MSehj zY-)IK?G;BxdOM!6{buZa{y84>F7~!|_mxslfFbZ1_`MMQ>QkluApQ%V!~cVS4u1!O zQ*Zf!odC?FmrbUZbhUWHlRRge9S^_A^1EPkQww2MKl z%f!tJF@9Kq^H-T1*0ty+&RYpV2FI}-+(%jB_ELm@Q&?|xHM!i`<`baAJE>4+eX-($ z(U$s{pCrNFf4MJ+k7m6ST~yw=-e$qUr7ui%P`FTPW4AI_ex)29sv>BORVgxxjiOls n_!#&ID1LUso!w)i5GiH~nL?w$*d)bE(Ne4%0L4jBlApK-M{fjN5H*xSq2;TTuUiloxKu2?aHLI;^W9RwDe4L!@?SA~El)4Q}f!Dz0t=?~~DRqVTH+&BN2Y!Pd2B)_9 zfgJ(&fK3L`*5N^;UIAMG`RNJJs8Jl>f&T(L0J!H8pxy1A;yk&zhsOHkCExuxhU@k- z&-JT)upaZYhrlp?gz*#LaRgk)IpoOy6!;!D@T}~C`DXyRXgff68Su}Ui1q@WcSd^& zurHpG_wfsuOIceT6Roy(}aV}Lb z=SEOyt{45r_)QDlEW}^uQs={UfWa&{D?L@0o&}v<%up~cnp$^b{eGU`pjfTVEos|$ z_A%I3my4b1Ch$kYrj4tm2}boRh8 z{9XKS1p@VrqQQ3U!dSKDaWO zU`eYNl8h*n)kO%^-ha8bh!2*@kuEClT=K5q;M5nU`dqkBYGZdZSH7oSSIQ&mjO8ge t%8v3`2ly=b9QX_zvfTkFQ_7S4#9x%_j`jcm literal 0 HcmV?d00001 diff --git a/gamma_age_v2/hlslang_102.uti b/gamma_age_v2/hlslang_102.uti new file mode 100644 index 0000000000000000000000000000000000000000..4285f8e54d6df788661dd1e097f557e19f9e1882 GIT binary patch literal 1031 zcmZ8gO>fjN5H%l#Ld#bvU$-DGaH;6_!jU#b>Pic&x=XK>n@l$mP8`L~VNw492Yx_* zYf|85;YOmwXT68ZMk? zp7pD9upjfZN5HUtj5X(f5&;)DpT?N{&w%go0Bbn|^Unct(YAqb8SpQdi1remcSd^! za4xt?LypjF15~I2UyI!HPTas^vvt*=L`*F(bU)*_4|2#gJQKekEC7e zILBaLZ7yc2Th9*-o3^%*)|cWYB`1mTGQOUgb!UFr4Bf$pdFT4f3>n5J+H^wcy1KN8C@?kYq%mtQH|ud;jI$AwF0pN4lt;waNQ}i&IyW_2fjN5H*zY)$(1wZb4k&Qc?E8kv2u@N(-#IORtriOgC1YIEtOaqW%L8{Q>>4 z<-NoyTSj^r&)D;3oV@&+kCUU(_UA83soTI5cnh50>iy=LQWuCX;dA&a`1|xQIQ5(l z*a2`4*kBNC9Ue654X_E2pPm4X+KKBs@ZW%k0BgA0LXF+FYGc=5crqo~yq=o1Ct+C+-NA=>=laAB8OBH2wnGeRT}JMX zzl;B!!2PRCcI#Sn)9+geLB{(GV5uuhyuCiabEB}{>S}Sk^J(-BF*QDDg*r%EA6%JC zaHQ1>Nk$aP>LG+`^k42h;=N^Zpo_{omwYI=IQE69z7{T&+Su*Pl^?0smG+1_V|&Vt tvZH*~0sa>J9rzni{*)BUDRWAavZkadIZBOFa(v2{vfTnGQ_7S4#9yLVj{g7v literal 0 HcmV?d00001 diff --git a/gamma_age_v2/hlslang_104.uti b/gamma_age_v2/hlslang_104.uti new file mode 100644 index 0000000000000000000000000000000000000000..cb1ef0482c0998c6dbbdb008e839485a48b67dae GIT binary patch literal 1031 zcmZ8gO>fjN5H*xSOUrlpx&?88OGRl99BI=^U1@<;cj>iqlj+8)6GyRgSk!;Ofgiw+ zh4&JtY#HfgJY)OK*m?dw8zrZ^+aEtErEUWg;5Be{tM{8LO8r9o8$O5s1HVQOgHuoW zfgJ<)fDH!GR^dUTUICi``RNJJsGT^z1AheE2e{`7pxy1A;yk&zhsOHkCEt1+!*%mu)KLNhQ4LmD*VE!3EF4`8*T?YJfCZfH7=bh15 zhkfykypNy2Ov>8oASdEa-Y2g2E}r1Zb{q5 zvyZ{PxLoW+H-SGIHfdZfO)%oehMmNC5s#;)?Ri+#Lv`?>-co)(2N6 zV=QU)T#`KsWqA=owfkT0E#iYka;%HWJD0pGI5_i#sXiAjl-k(s%$4t{*QN4^I%9dt ujk2SBRslW>J_kMn%AbfjN5H*xSOUrlpx&?88OGT+FaimQvb)^MX-KE#cO{N>GP8`L~VNw492YvuQ z7T!yovSp-~@r*rh#>va~*(f>P-TwGVDRmo|0Iz|oTfN_0QR)}s-|#v7ANVzT7@T^_ z2kaQQ2W&8iwh9j#^$OSo$WKpzM(xD)9rz>QKERqQfOfZciu>ed4UPTDOTP8EhU@B? z=lSJ1*pGSI17KJ`#G11`ih%1lAIF&dPk?W+fOq8#%s&IjMcV?pmjVBriD)n2`OauB z0nWucvgc1=CS`4PkQ4DIa-r0L_A&}mVym;U%d|B=B>$>QLFQ0=)|fgNS9SZ0N4ZqN zTo^&4nV$EB@tGF7nTx;9rOt=z0E=mGR(h%~JqoRh8 z{9XL-1nysDvR~Jtn||L)2r@ck083q2;_dYTo*RYrR#)@0oez6&5L4rWR;Yut^}&_N z7)M$?mt>DZSw4hN?f#d0i}+xX9P6U;&L!^(F3x;ms?UWBr8agubLD&Lb*Vj~&e)!E uqwFZ3Re-+*e+T{sls_fKa>|^Nq^v1vN{&+FlpLS(rEIqV%9QdXKk*l}(~k-O literal 0 HcmV?d00001 diff --git a/gamma_age_v2/hlslang_106.uti b/gamma_age_v2/hlslang_106.uti new file mode 100644 index 0000000000000000000000000000000000000000..d2e8d8c075a8b8b4a006577313fdbee7b706f4a7 GIT binary patch literal 1031 zcmZ8gO>fjN5H%l#Ld#bvUlNBPE^w(@Dpee5Q>3o6z^c3STDi$|6V;BR*f}ifKj6R* z;K#yyiBq)8piwV@b%6Zz1ZdPw9N&ij4BQ8}=MtdZ>7C*{xw(hN`s5|wy*P&J z_A}4*%YCpO^Rx%RFn);fYv54?T*vu1#^iqje2W`+R`$UBQ-EBwO`y9B_-9N+dk)V# zqrCvw7thH1_zBF!)n-;p6i@(aH&WEc2gK2O^da5ox4LZA+qF`J!G49&>{XD-$v0R&5 z(zfyJW3VqS7cXSyL6`> za5foZNvr3Q>`^Goix8^a|8j2;A1sn1T~yw=fjN5H%l#Ld#bvUk9WhE^w(@dMHQQ6sapMu<9<4x z__6R_;*>2Ty^LpUzZpBv-)E!bWOwVsN2SzFU;?}XE^qXH{gzU{5dVhH;s3y|(!=1? z20ySP;4ZMnAleE%Xw*w!9UwnF0UEUv$G71>1NQ;$xddo;dZ#!~ZtkJ6K6%M^FOK25 z{mgUyav!Y6JnaE6j2~kB8h8`|*Kt0MG5MbW-{JrlF?n`b=A zr3&SFDJV44^L}IeriE_i;;(Y4^WiGMU>cl}o~lbvgU&9dC>R$_jJvjeKhLjGEZ63i zv~4{580?G7#Y}V)_@iNy#?{hWi}aRJdSuX|^(F-&3zktp w@{}88NBOJ(d=`8TdfjN5H%mAK+AXex}YE~^it9GvPaq!sVgn8>Mp%jZZh3iIB^s^heiDd9QXnJ zSa>gS%9fE{#xu6xjGgCi^Ko*zzq2<|O5Fsez-!?0M(;OoDfJ8SZ}=Sk5Byzv7@T^_ z59}CN2R0Z)TZ0FUdIf9(-DSW(XCm4Qc-|T9 zCBVLTM&8FyU@m2Cb&wPBCvu_Gq4qKkQevvJiOaM#KP3O6OF`yHeAbvc7*}=kjK{fD z!CV+Yp}Ai48{;=Ebh8kDl}nuuR{;jI;H>miU3wOD_I-weanaPeYwHj4{2Ik-ZEi{1 z#~aI&UQbH-Xf;P2dz*CY3qY4 zlL?lzdLhY(LRnpeQ0@Phdx!XNnH=k)^3Emi3l7eFVXBXX3#B%8Cv)XC^}13XQD-bq vxlwkM&l1Tr+)kNOl9V+iP03Me?2_$MzLf12K$%jWfjN5H%l#Ld#bvUnhdNz@=*Gh2CgWq^`8Us=M@Bxyf`B)sCasIV|cw;J^>y z$HIGwQ?`usGM=&hX6!tFpN*1}-K`HFl~Ol>3GfQIywUshTT1;x{2M-p{{z2D4}()1 z{J@TYyTBTQXe;obQ7?gYfc*3XXw*&|--iDT+y}Vl5}@7bo#H&XxrfI3zsjY~hpPaCX>dk*sxCbZI=h&nU|cjY?%MkOJikVpr>5;$Skyyx@S)$CJ~Kmx@rgF=5QAFV z$ldXG@xK)~f0fC8U5jq|c_Sgn=#T*{b=Knc`T*ax!g!;r`RUH~-W$Z!_@EW)AZ>kc zHW_0{tLKvJQ7Frc5USn(a&HkIERrK#RNlGdUBSVrFUsmu;eyqr*~*-KPrWXcN7Nb1 vQ*M+U<+B3tS@1dV8BqR|6t`36lq6+MNmFu^8oOlslrLqw2~eh#C;5rL)3lEr literal 0 HcmV?d00001 diff --git a/gamma_age_v2/hlslang_11.uti b/gamma_age_v2/hlslang_11.uti new file mode 100644 index 0000000000000000000000000000000000000000..4e282431d509a1a96bf08ac88708bc160ad373b8 GIT binary patch literal 1019 zcmZ8gO;6iE5M4^?C;f!da*KpiwHKt6OVv|Dav&0gh@@Q6#vbAoYp?6w98y*4fgiw+ z@|dr^gKJWJ8x#~=bw{d=X7uP%U7k;17HMf1AkT;zrL!}CE_di6#g3i3H%KV zPQB#=b^tsEo->HH1`itb0aypf&wZ{zqdvypLHA11!eDS!t;1^f>6`VvL6I(8#)b=X+^-k7Btu zOZxN5bB@-2xK!*&SE1WvMwKh23P${);UqC$#OtZ?d>R&I+Z}wEccQ1Z%`iUIcHYLI z)_LS+hbF!|f%_MU^vY6n)$CgdL57279PsBk-d>FGZ8GbvE@o%lErEHl zYfE)3Z?SyuzuXSu{YB?MXN7mJ^C{!v%x9+fp1F`~V|Npmf2J7jdLpQeJt;9tjgnad n_$zP*N}rNvW&0~phLkd8%(*Eq4oT@!vXts3KxtBv>h|jA!4^&kx6DZR-HJCy@#!O=%GKL zKeqSsUgE&gkzU3#_PiMTZ^VD#bNIjTkKq5o z;M6NVV8_5i;0c3hYw(~^Z-5Pe{M_dnH0pg^ufl%@)&bTu0PR8N6!*!^8XEhPmwb=o z8m_Hpp68e6U_a(*Pl0~@4C@i_JOZxed=X>vzXZ-=0q@EgnBN4*McV?}mjVBpiD=vK zd0g+nb1vSI@8cIRk+QZr$hr7)nJRUpy(B?OY_)dcGHuNd$xn4D$c)5ijj4liRlCnP z$)yTrY6OiYde#-j=djStO#Dr5=zO>duowqtrK4)oFD1QtR%VKg{zx6wAF? zGMqP_bM*Gr0`6Mbd-4C4!J=Y0%n zT}Ezp=;GTGxPO(&VO@)EC6#I`AxJWc0}fqT;_bx<-=?tM>S}hmx6e;RiT6^WcM!iexNAMqkrvPi_0Bt)u#eH(KhQ|KnCEt^@hHL7X z=lS(H*pGSIGoW4XVa@sX6W|)o=P4%t0q`vq@GNIw{sllT+7ZxP2K-AVlD&fGozY$c zoQv27jl$FszuEbx-OsUV>%OFUJt;R0xRGZ?LCn*Fjq~SuzCp3xn>aWqLg|swZJtwcX>qV?8l#hRtuZsoNOTx=h^c z5aZPey#Hb<=T#-z#eE|o$et~z^W61#@LC%qQKa#1Mml+@F{o-ot5nm cMDbC;6fea^QE@s7mO`aK`4$u;g-Cwl9~{z#uK)l5 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/hlslang_2.uti b/gamma_age_v2/hlslang_2.uti new file mode 100644 index 0000000000000000000000000000000000000000..ad373065fd222e991436d5c679ee0164f9a1a548 GIT binary patch literal 1007 zcmZ8fT~8D-6s;fli2{mWZ=3j{FBsv)M`1~16Vwg6@=D6gWv8K?PNvIFZr z1K=U>lu5P~c+jY~z$!rgCpiX3COMqOoO`v-W_*X1sdkxPwqj3(; z#XIsn0x%WVSRLg^!ja(8dpgJ{io;T8hrZC(TuAvtJ3(b%LeZKg8eezo%txiv(VQ8< zpsAjv#{3;tx}6CpB^&w>`AM1JBXh zcVCJf>o$H)m2vAEX`_*FXn2yGFY@)&WPTbKO+OucIPX-S+P=d4SlfA@gIc@H%?T<0 zw*&XD3)yWN(QR6{5~Gav({aG>99}PH&{AcC)%EOTn}3lC@0GHG{9EmvEK7gqzfF|$ z-ePc|t2%f;_)sx836-h8Rz5my>{j93M=JL3AjF+<5M@PqQ6?Nn`BV0s$tFsNvZkCV bJ<6BTrL-t1%9e7aOexPzfES?*$xqw>%_NCp literal 0 HcmV?d00001 diff --git a/gamma_age_v2/hlslang_3.uti b/gamma_age_v2/hlslang_3.uti new file mode 100644 index 0000000000000000000000000000000000000000..80fde1f0031940bf22977b97586fd8bdcac21049 GIT binary patch literal 1010 zcmZ8g%T60H6m_BW32kZVYZs{!f=#57O_xAeBob{SlCni+<|bp+Gaii{q#)LOEI&cd znen87E1kIy`<`n%Cx0fx&UvqU@IxuJ28@8Oz|E7!Z>}qKjrR5Xj2FbBh+o?;mHP@2<(z&2=B0i~18H_9Hb>_oVieRQj zFleG@O=JA_GhNNZFKd10!!kiI4$ewLRhP#>Cx6En7&ncqd$9i~O&?IK&Sp!0UU{CQ zwVy5(JJMD7-c&}FE2RoX{HftdV!nviQ{(w%Sd{H_@Zr1@eQDbY^K)(IZ4PRkM{Z7N z^8Y(<|00p2vJ_o4>sCUL;Yo8G@aH*RFJ{nEX1&$L?4rkChzf6&Ld6ZVomx}OR@L8o zwC@}8<3(qnv%)*q*~=JQ_{vle)?WeV zbUN$eP0rkp_MY2z&wif_d*^$*pT8)j?g1m8Xb)PaxK3{N&^VvGHQj&u|F{ITIlQa(@DQ{&lXnAhEO@Zr1@eQCQ2^K)%yT@GqpCho`| z^M5;V|0sCUL;eZLO@5&Od*CzOG6xLf^O)vKOYf<5yQmDScPu={GYFYey z|80AR{BYho(naN+>wPE~T=>FNUkevXZR~F5%8%6SVie+N97SPKU=+$4z&`*-b0(W8 g9txX+ruZmeikHWws3=?tmO`aKw*d;0LL@(N3wObaQUCw| literal 0 HcmV?d00001 diff --git a/gamma_age_v2/hlslang_5.uti b/gamma_age_v2/hlslang_5.uti new file mode 100644 index 0000000000000000000000000000000000000000..dfb87efac4e7c142958fbd4cf0f8cf596aacb431 GIT binary patch literal 1005 zcmZ8fO-~y!5OqtT&{Amm=*KOn7dU{_qDnmi;Xou>A`-YFvpZxhyzA}SIRtUx$MQSc z_jbJ@bflO0u;;!lXyk!z?9v(F6Gq4Ph|4ocRqqbuF3Vs*h8GAT~w$M1mb8@qX#`)wW-%^a>>VDRF ze|8VfW}Ws9XyX;c+-)@iuI79nbMk)x&SC@K${ko=2gpU+0O~&jev^f0AK}}#d_v5< z_(snB0}LfEtqyW7{#J-dIHrq3v5XS1a{t~~c> z?Uzf%_H`A$HI;tlN~wYoe`>f%%qQ`AYB0VIld_!-KI}Wx*S4)Nztncz=AhPj~bSu72?AQsJ#q_|?yuhHXu6$;SgUp3o8@rdde203SjzL@-$52!pLy^n_6hB4JnQWqPC~AtC b!lQU8TndYVqG%~rij?bb02CudNPglUB)o`) literal 0 HcmV?d00001 diff --git a/gamma_age_v2/hlslang_6.uti b/gamma_age_v2/hlslang_6.uti new file mode 100644 index 0000000000000000000000000000000000000000..40ed9f32a3643e87f7a71e21186fb1d0cbe29418 GIT binary patch literal 1016 zcmZ8fT~8B16dh4SwD^gFZ%yPuUz#Wh@lhy=G(l}>?JJq?Ub+)zcQ!lIhZ-LI0sL70 zfu6HFTM9Qhy&p68+&kOzdpzh)_IqExDy7zdA@Cl!deHdJL#6&AzlKlYZ{VN6|AWD) z*ZhH<02{zFCeha6L8Eqo4nY2=F$Rs=i}53P&gU6>96)>AIK^{vvxmm{sP1i>gcD-Bg$9tE9TjxaD@8d`Vf{$ZNlp;(>Gmj1l* z+@rN0E)_e}RruUghLtO&3P${?;U+O(#OJBed>R&II~{!3cdVzjtuUWxJ8yGP>pXIE zLX+R#!263t4$D$>)tp-iK?cXoI^fT9e7%@KOPTdn7qjyN{&Q4#s}w5nyPH~5P#dc! zY~H_D`+)pt(LK>w;hpP#%ov>e%oN`;7jkWEFLC)NN_ROCac!JPeNkuB%R0d6)IW94 iCTfWKrmm?$>X;g)#;7gsNZnGe)af=rUGi1rC;kKUdx{YN literal 0 HcmV?d00001 diff --git a/gamma_age_v2/hlslang_7.uti b/gamma_age_v2/hlslang_7.uti new file mode 100644 index 0000000000000000000000000000000000000000..dea9b502956949e4ed910ae3d82e4ee6756f8f0a GIT binary patch literal 1018 zcmZ8g%T60H6m@ASeb5$K`r1XRRKX?^Wl_YckSvHq+lZuWk(s$X zY<~dGnen87E1lez@59cSU*kdNWT*ROS1Gjw41tfpp9hUzeW=tG{A=hG`XBTY=o<)> zdd(lmA+Q2GrxRrv8g0}EU=?8hXVFF*^*P#)p!WdgSo0g8JZ_X?p1oN^;e7UGzo*fL zs_Pl&`Ncgrn{mnuptWDZW{+19P_@4nedgAIpRs^<&rPV=>#UIPLQU}`0AV`i>Ek`cV)?7;ZL+64>Uwl%TG8k9XdHRD? zieS!-V9;1kn!@#?R=&Gb>`+%>yNL`dS4tI(_#?wjqCbn*Q={own3e5x^uxYmeP-JT{S$4ct&i3^ zkG(me@&BK|{fk8Q%TjdJm2H=@XmEMGa9EpGsU;eg3a;B~v#5GLwvCf8rKt42swQ literal 0 HcmV?d00001 diff --git a/gamma_age_v2/hlslang_8.uti b/gamma_age_v2/hlslang_8.uti new file mode 100644 index 0000000000000000000000000000000000000000..325b5f5c0555faf72ee031c97b440ab37ca65bd9 GIT binary patch literal 1016 zcmZ8f%T60H6g34}+R_JrDs_YW7Cwi+gWrI^hry|B z{=klaC%|(i$=2aPqdowe0QsM#7&Pj0ir3&dpJ(jx0PS(>6wk@c9vbJ9mwZoC4A=Ct z&il)Ia5n3-7eE)kM7#sMN`PxPU#Fb>Tfk{*;9I!^>u&&Z(a6z!4EVP!Bzp&+r}#ZQ z_u?D*J+6U?xXS7%XA;ijN~r@KWEjQasIg<8X>0ySexjYAaws9IO%;tVn{(#FT*_#! zj9}12Pus@yJ1BHLm9VG{e29w#!8m#=Emcz>8vi`ySex5&|Sf0(6!K@D4 zqqCnr7dz5*{MJ@RwXdX(M#8b-CMln%=c)1RGR~`RI{2{fL|@vj!u(v@S(k%ayTr{2 zZT{~D-d|?YuPV`Xdu}C086LLlfZsWMy_7*qg$-7h(~Eunb5wYz6e_V_8mBF_v3$bj zz5i;TkRQx@N4hA3_q{I#gNsm@@<-vL)5h**-hHKX7ZVXT#);Gybw<6c1DsC%Q}=A5 ghNy4qni`~zsbOl2+TxDXE%i#B?f}#!Uqyc6FXtDE2><{9 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/hlslang_9.uti b/gamma_age_v2/hlslang_9.uti new file mode 100644 index 0000000000000000000000000000000000000000..2d17729468d40f28f9a2b8edbf728b5cf65332b4 GIT binary patch literal 1023 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 B8IAw| literal 0 HcmV?d00001 diff --git a/gamma_age_v2/inc_array.nss b/gamma_age_v2/inc_array.nss new file mode 100644 index 00000000..31370c45 --- /dev/null +++ b/gamma_age_v2/inc_array.nss @@ -0,0 +1,504 @@ +#include "nwnx_regex" + +/// @addtogroup data Data +/// @brief Provides a number of data structures for NWN code to use (simulated arrays) +/// @{ +/// @file nwnx_data.nss + +const int INVALID_INDEX = -1; +const int TYPE_FLOAT = 0; +const int TYPE_INTEGER = 1; +const int TYPE_OBJECT = 2; +const int TYPE_STRING = 3; + +/// @defgroup data_array_at Array At +/// @brief Returns the element at the index. +/// @ingroup data +/// @param obj The object. +/// @param tag The tag. +/// @param index The index. +/// @return The element of associated type. +/// @{ +string Array_At_Str(string tag, int index, object obj=OBJECT_INVALID); +float Array_At_Flt(string tag, int index, object obj=OBJECT_INVALID); +int Array_At_Int(string tag, int index, object obj=OBJECT_INVALID); +object Array_At_Obj(string tag, int index, object obj=OBJECT_INVALID); +/// @} + + +/// Clears the entire array, such that size==0. +void Array_Clear(string tag, object obj=OBJECT_INVALID); + +/// @defgroup data_array_contains Array Contains +/// @brief Checks if array contains the element. +/// @ingroup data +/// @param obj The object. +/// @param tag The tag. +/// @param element The element. +/// @return TRUE if the collection contains the element. +/// @{ +int Array_Contains_Flt(string tag, float element, object obj=OBJECT_INVALID); +int Array_Contains_Int(string tag, int element, object obj=OBJECT_INVALID); +int Array_Contains_Obj(string tag, object element, object obj=OBJECT_INVALID); +int Array_Contains_Str(string tag, string element, object obj=OBJECT_INVALID); +/// @} + +/// Copies the array of name otherTag over the array of name tag. +void Array_Copy(string tag, string otherTag, object obj=OBJECT_INVALID); + +/// Erases the element at index, and shuffles any elements from index size-1 to index + 1 left. +void Array_Erase(string tag, int index, object obj=OBJECT_INVALID); + +/// @defgroup data_array_find Array Find +/// @brief Get the index at which the element is located. +/// @ingroup data +/// @param obj The object. +/// @param tag The tag. +/// @param element The element. +/// @return Returns the index at which the element is located, or ARRAY_INVALID_INDEX. +/// @{ +int Array_Find_Flt(string tag, float element, object obj=OBJECT_INVALID); +int Array_Find_Int(string tag, int element, object obj=OBJECT_INVALID); +int Array_Find_Obj(string tag, object element, object obj=OBJECT_INVALID); +int Array_Find_Str(string tag, string element, object obj=OBJECT_INVALID); +/// @} + +/// @defgroup data_array_insert Array Insert +/// @brief Inserts the element at the index, where size > index >= 0. +/// @ingroup data +/// @param obj The object. +/// @param tag The tag. +/// @param index The index. +/// @param element The element. +/// @{ +void Array_Insert_Flt(string tag, int index, float element, object obj=OBJECT_INVALID); +void Array_Insert_Int(string tag, int index, int element, object obj=OBJECT_INVALID); +void Array_Insert_Obj(string tag, int index, object element, object obj=OBJECT_INVALID); +void Array_Insert_Str(string tag, int index, string element, object obj=OBJECT_INVALID); +/// @} + +/// @defgroup data_array_pushback Array Pushback +/// @brief Pushes an element to the back of the collection. +/// @remark Functionally identical to an insert at index size-1. +/// @ingroup data +/// @param obj The object. +/// @param tag The tag. +/// @param element The element. +/// @{ +void Array_PushBack_Flt(string tag, float element, object obj=OBJECT_INVALID); +void Array_PushBack_Int(string tag, int element, object obj=OBJECT_INVALID); +void Array_PushBack_Obj(string tag, object element, object obj=OBJECT_INVALID); +void Array_PushBack_Str(string tag, string element, object obj=OBJECT_INVALID); +/// @} + +/// Resizes the array. If the array is shrinking, it chops off elements at the ned. +void Array_Resize(string tag, int size, object obj=OBJECT_INVALID); + +/// Reorders the array such each possible permutation of elements has equal probability of appearance. +void Array_Shuffle(string tag, object obj=OBJECT_INVALID); + +/// Returns the size of the array. +int Array_Size(string tag, object obj=OBJECT_INVALID); + +/// Sorts the collection based on descending order. +void Array_SortAscending(string tag, int type=TYPE_STRING, object obj=OBJECT_INVALID); + +/// Sorts the collection based on descending order. +void Array_SortDescending(string tag, int type=TYPE_STRING, object obj=OBJECT_INVALID); + +/// @defgroup data_array_set Array Set +/// @brief Sets the element at the index, where size > index >= 0. +/// @ingroup data +/// @param obj The object. +/// @param tag The tag. +/// @param index The index. +/// @param element The element. +/// @{ +void Array_Set_Flt(string tag, int index, float element, object obj=OBJECT_INVALID); +void Array_Set_Int(string tag, int index, int element, object obj=OBJECT_INVALID); +void Array_Set_Obj(string tag, int index, object element, object obj=OBJECT_INVALID); +void Array_Set_Str(string tag, int index, string element, object obj=OBJECT_INVALID); +/// @} + +/// @} + +// +// Local Utility Functions. +// +string GetTableName(string tag, object obj=OBJECT_INVALID, int bare=FALSE) { + if (obj == OBJECT_INVALID) + obj = GetModule(); + + string sName = "array_" + ObjectToString(obj) + "_" + tag; + // Remove invalid characters from the tag rather than failing. + string sCleansed = NWNX_Regex_Replace(sName, "[^A-Za-z0-9_\$@#]", ""); + // But provide some feedback. + if (GetStringLength(sName) != GetStringLength(sCleansed) || GetStringLength(sCleansed) == 0) { + WriteTimestampedLogEntry("WARNING: Invalid table name detected for array with tag <" + tag + ">. Only characters (a-zA-Z0-9), _, @, $ and # are allowed. Using <"+sCleansed+"> instead."); + + } + + // BARE returns just the table name with no wrapping. + if (bare == TRUE) { + return sCleansed; + } + + // Table name wraped in quotes to avoid token expansion. + return "\""+sCleansed+"\""; +} + +string GetTableCreateString(string tag, object obj=OBJECT_INVALID) { + // for simplicity sake, everything is turned into a string. Possible enhancement + // to create specific tables for int/float/whatever. + return "CREATE TABLE IF NOT EXISTS " + GetTableName(tag, obj) + " ( ind INTEGER PRIMARY KEY, value TEXT )"; +} + +int TableExists(string tag, object obj=OBJECT_INVALID) { + string stmt = "SELECT name FROM sqlite_master WHERE type = 'table' AND name = @tablename"; + sqlquery sqlQuery = SqlPrepareQueryObject(GetModule(), stmt); + SqlBindString(sqlQuery, "@tablename", GetTableName(tag, obj)); + return SqlStep(sqlQuery); +} + +void ExecuteStatement(string statement, object obj=OBJECT_INVALID) { + if (obj == OBJECT_INVALID) + obj = GetModule(); + // There's no direct "execute this.." everything has to be prepared then executed. + //WriteTimestampedLogEntry("SQL: " + statement); + sqlquery sqlQuery = SqlPrepareQueryObject(GetModule(), statement); + SqlStep(sqlQuery); +} + +void CreateArrayTable(string tag, object obj=OBJECT_INVALID) { + string createStatement = GetTableCreateString(tag, obj); + ExecuteStatement(createStatement, obj); +} + +// Get the table row count. Returns -1 on error (0 is a valid number of rows in a table) +int GetRowCount(string tag, object obj=OBJECT_INVALID) { + if (obj == OBJECT_INVALID) + obj = GetModule(); + CreateArrayTable(tag, obj); + string stmt = "SELECT COUNT(1) FROM " + GetTableName(tag, obj); + sqlquery sqlQuery = SqlPrepareQueryObject(GetModule(), stmt); + if ( SqlStep(sqlQuery) ) { + return SqlGetInt(sqlQuery, 0); + } + return -1; +} + + +//////////////////////////////////////////////////////////////////////////////// +// return the value contained in location "index" +string Array_At_Str(string tag, int index, object obj=OBJECT_INVALID) +{ + // Just "create if not exists" to ensure it exists for the insert. + CreateArrayTable(tag, obj); + + string stmt = "SELECT value FROM " + GetTableName(tag, obj) + " WHERE ind = @ind"; + sqlquery sqlQuery = SqlPrepareQueryObject(GetModule(), stmt); + SqlBindInt(sqlQuery, "@ind", index); + if ( SqlStep(sqlQuery) ) { + return SqlGetString(sqlQuery, 0); + } + return ""; +} + +float Array_At_Flt(string tag, int index, object obj=OBJECT_INVALID) +{ + string st = Array_At_Str(tag, index, obj); + if (st == "") { + return 0.0; + } + return StringToFloat(st); +} + +int Array_At_Int(string tag, int index, object obj=OBJECT_INVALID) +{ + string st = Array_At_Str(tag, index, obj); + if (st == "") { + return 0; + } + return StringToInt(st); +} + +object Array_At_Obj(string tag, int index, object obj=OBJECT_INVALID) +{ + string st = Array_At_Str(tag, index, obj); + if (st == "") { + return OBJECT_INVALID; + } + return StringToObject(st); +} + +void Array_Clear(string tag, object obj=OBJECT_INVALID) +{ + ExecuteStatement("delete from "+GetTableName(tag, obj), obj); +} + +//////////////////////////////////////////////////////////////////////////////// +// Return true/value (1/0) if the array contains the value "element" +int Array_Contains_Str(string tag, string element, object obj=OBJECT_INVALID) +{ + CreateArrayTable(tag, obj); + string stmt = "SELECT COUNT(1) FROM "+GetTableName(tag, obj)+" WHERE value = @element"; + + sqlquery sqlQuery = SqlPrepareQueryObject(GetModule(), stmt); + SqlBindString(sqlQuery, "@element", element); + + int pos = -1; + if ( SqlStep(sqlQuery) ) { + pos = SqlGetInt(sqlQuery, 0); + if (pos > 0) { + return TRUE; + } + } + return FALSE; +} + +int Array_Contains_Flt(string tag, float element, object obj=OBJECT_INVALID) +{ + return Array_Contains_Str(tag, FloatToString(element), obj); +} + +int Array_Contains_Int(string tag, int element, object obj=OBJECT_INVALID) +{ + return Array_Contains_Str(tag, IntToString(element), obj); +} + +int Array_Contains_Obj(string tag, object element, object obj=OBJECT_INVALID) +{ + return Array_Contains_Str(tag, ObjectToString(element), obj); +} + + +//////////////////////////////////////////////////////////////////////////////// +void Array_Copy(string tag, string otherTag, object obj=OBJECT_INVALID) +{ + CreateArrayTable(otherTag, obj); + ExecuteStatement("INSERT INTO "+GetTableName(otherTag, obj)+" SELECT * FROM "+GetTableName(tag, obj), obj); +} + +//////////////////////////////////////////////////////////////////////////////// +void Array_Erase(string tag, int index, object obj=OBJECT_INVALID) +{ + int rows = GetRowCount(tag, obj); + // Silently fail if "index" is outside the range of valid indicies. + if (index >= 0 && index < rows) { + string stmt = "DELETE FROM "+GetTableName(tag, obj)+" WHERE ind = @ind"; + sqlquery sqlQuery = SqlPrepareQueryObject(GetModule(), stmt); + SqlBindInt(sqlQuery, "@ind", index); + SqlStep(sqlQuery); + + stmt = "UPDATE "+GetTableName(tag, obj)+" SET ind = ind - 1 WHERE ind > @ind"; + sqlQuery = SqlPrepareQueryObject(GetModule(), stmt); + SqlBindInt(sqlQuery, "@ind", index); + SqlStep(sqlQuery); + } +} + +//////////////////////////////////////////////////////////////////////////////// +// return the index in the array containing "element" +// if not found, return INVALID_INDEX +int Array_Find_Str(string tag, string element, object obj=OBJECT_INVALID) +{ + string stmt = "SELECT IFNULL(MIN(ind),@invalid_index) FROM "+GetTableName(tag, obj)+" WHERE value = @element"; + sqlquery sqlQuery = SqlPrepareQueryObject(GetModule(), stmt); + SqlBindInt(sqlQuery, "@invalid_index", INVALID_INDEX); + SqlBindString(sqlQuery, "@element", element); + if ( SqlStep(sqlQuery) ) { + return SqlGetInt(sqlQuery, 0); + } + return INVALID_INDEX; +} + +int Array_Find_Flt(string tag, float element, object obj=OBJECT_INVALID) +{ + return Array_Find_Str(tag, FloatToString(element), obj); +} + +int Array_Find_Int(string tag, int element, object obj=OBJECT_INVALID) +{ + return Array_Find_Str(tag, IntToString(element), obj); +} + +int Array_Find_Obj(string tag, object element, object obj=OBJECT_INVALID) +{ + return Array_Find_Str(tag, ObjectToString(element), obj); +} + +//////////////////////////////////////////////////////////////////////////////// +// Insert a new element into position 'index'. If index is beyond the number of rows in the array, +// this will quietly fail. This could be changed if you wanted to support sparse +// arrays. +void Array_Insert_Str(string tag, int index, string element, object obj=OBJECT_INVALID) +{ + int rows = GetRowCount(tag, obj); + // Index numbers are off by one, much like C arrays, so for "rows=10" - values are 0-9. + // It's not unreasonable to fail if you try to insert ind=10 into an array who's indexes + // only go to 9, but I guess it doesn't hurt as long as we're not allowing gaps in + // index numbers. + if (index >= 0 && index <= rows) { + // index is passed as an integer, so immune (as far as I know) to SQL injection for a one shot query. + ExecuteStatement("UPDATE "+GetTableName(tag, obj)+" SET ind = ind + 1 WHERE ind >= "+IntToString(index), obj); + // Element, however, is not. + string stmt = "INSERT INTO "+GetTableName(tag, obj)+" VALUES ( @ind, @element )"; + sqlquery sqlQuery = SqlPrepareQueryObject(GetModule(), stmt); + SqlBindInt(sqlQuery, "@ind", index); + SqlBindString(sqlQuery, "@element", element); + SqlStep(sqlQuery); + } +} + +void Array_Insert_Flt(string tag, int index, float element, object obj=OBJECT_INVALID) +{ + Array_Insert_Str(tag, index, FloatToString(element), obj); +} + +void Array_Insert_Int(string tag, int index, int element, object obj=OBJECT_INVALID) +{ + Array_Insert_Str(tag, index, IntToString(element), obj); +} + +void Array_Insert_Obj(string tag, int index, object element, object obj=OBJECT_INVALID) +{ + Array_Insert_Str(tag, index, ObjectToString(element), obj); +} + +//////////////////////////////////////////////////////////////////////////////// +// Insert a new element at the end of the array. +void Array_PushBack_Str(string tag, string element, object obj=OBJECT_INVALID) +{ + // If rowCount = 10, indexes are from 0 to 9, so this becomes the 11th entry at index 10. + int rowCount = GetRowCount(tag, obj); + + string stmt = "INSERT INTO "+GetTableName(tag, obj)+" VALUES ( @ind, @element )"; + sqlquery sqlQuery = SqlPrepareQueryObject(GetModule(), stmt); + SqlBindInt(sqlQuery, "@ind", rowCount); + SqlBindString(sqlQuery, "@element", element); + SqlStep(sqlQuery); +} + +void Array_PushBack_Flt(string tag, float element, object obj=OBJECT_INVALID) +{ + Array_PushBack_Str(tag, FloatToString(element), obj); +} + +void Array_PushBack_Int(string tag, int element, object obj=OBJECT_INVALID) +{ + Array_PushBack_Str(tag, IntToString(element), obj); +} + +void Array_PushBack_Obj(string tag, object element, object obj=OBJECT_INVALID) +{ + Array_PushBack_Str(tag, ObjectToString(element), obj); +} + +//////////////////////////////////////////////////////////////////////////////// +// Cuts the array off at size 'size'. Elements beyond size are removed. +void Array_Resize(string tag, int size, object obj=OBJECT_INVALID) +{ + // Int immune to sql injection so easier to one-shot it. + ExecuteStatement("DELETE FROM "+GetTableName(tag, obj)+" WHERE ind >= " + IntToString(size), obj); +} + +//////////////////////////////////////////////////////////////////////////////// +void Array_Shuffle(string tag, object obj=OBJECT_INVALID) +{ + string table = GetTableName(tag, obj, TRUE); + ExecuteStatement("CREATE TABLE " +table+ "_temp AS SELECT ROW_NUMBER() OVER(ORDER BY RANDOM())-1, value FROM " +table, obj); + ExecuteStatement("DELETE FROM " +table , obj); + ExecuteStatement("INSERT INTO " +table+ " SELECT * FROM " +table+ "_temp", obj); + ExecuteStatement("DROP TABLE " +table+ "_TEMP", obj); +} + +//////////////////////////////////////////////////////////////////////////////// +int Array_Size(string tag, object obj=OBJECT_INVALID) +{ + return GetRowCount(tag, obj); +} + +//////////////////////////////////////////////////////////////////////////////// +// Sort the array by value according to 'direction' (ASC or DESC). +// Supplying a type allows for correct numerical sorting of integers or floats. +void Array_Sort(string tag, string dir="ASC", int type=TYPE_STRING, object obj=OBJECT_INVALID) +{ + string table = GetTableName(tag, obj, TRUE); + string direction = GetStringUpperCase(dir); + + if ( ! (direction == "ASC" || direction == "DESC") ) { + WriteTimestampedLogEntry("WARNING: Invalid sort direction <" + direction + "> supplied. Defaulting to ASC."); + direction = "ASC"; + } + + // default orderBy for strings. + string orderBy = "ORDER BY value " + direction; + switch(type) { + case TYPE_INTEGER: + orderBy = "ORDER BY CAST(value AS INTEGER)" + direction; + break; + case TYPE_FLOAT: + orderBy = "ORDER BY CAST(value AS DECIMAL)" + direction; + break; + } + ExecuteStatement("CREATE TABLE " +table+ "_temp AS SELECT ROW_NUMBER() OVER(" + orderBy + ")-1, value FROM " +table, obj); + ExecuteStatement("DELETE FROM " +table, obj); + ExecuteStatement("INSERT INTO " +table+ " SELECT * FROM " +table+ "_temp", obj); + ExecuteStatement("DROP TABLE " +table+ "_temp", obj); +} + +void Array_SortAscending(string tag, int type=TYPE_STRING, object obj=OBJECT_INVALID) +{ + Array_Sort(tag, "ASC", type, obj); +} + +void Array_SortDescending(string tag, int type=TYPE_STRING, object obj=OBJECT_INVALID) +{ + Array_Sort(tag, "DESC", type, obj); +} + +//////////////////////////////////////////////////////////////////////////////// +// Set the value of array index 'index' to a 'element' +// This will quietly eat values if index > array size +void Array_Set_Str(string tag, int index, string element, object obj=OBJECT_INVALID) +{ + int rows = GetRowCount(tag, obj); + if (index >= 0 && index <= rows) { + string stmt = "UPDATE "+GetTableName(tag, obj)+" SET value = @element WHERE ind = @ind"; + sqlquery sqlQuery = SqlPrepareQueryObject(GetModule(), stmt); + SqlBindInt(sqlQuery, "@ind", rows); + SqlBindString(sqlQuery, "@element", element); + SqlStep(sqlQuery); + } +} + +void Array_Set_Flt(string tag, int index, float element, object obj=OBJECT_INVALID) +{ + Array_Set_Str(tag, index, FloatToString(element), obj); +} + +void Array_Set_Int(string tag, int index, int element, object obj=OBJECT_INVALID) +{ + Array_Set_Str(tag, index, IntToString(element), obj); +} + +void Array_Set_Obj(string tag, int index, object element, object obj=OBJECT_INVALID) +{ + Array_Set_Str(tag, index, ObjectToString(element), obj); +} + +void Array_Debug_Dump(string tag, string title = "xxx", object obj=OBJECT_INVALID) { + if (title != "xxx") { + WriteTimestampedLogEntry("== " + title + " ======================================"); + } + WriteTimestampedLogEntry("Table name = " + GetTableName(tag, obj)); + string stmt = "SELECT ind, value FROM " + GetTableName(tag, obj); + sqlquery sqlQuery = SqlPrepareQueryObject(GetModule(), stmt); + int ind = -1; + string value = ""; + while ( SqlStep(sqlQuery) ) { + ind = SqlGetInt(sqlQuery, 0); + value = SqlGetString(sqlQuery, 1); + WriteTimestampedLogEntry(tag + "[" + IntToString(ind) + "] = " + value); + } +} diff --git a/gamma_age_v2/indie.utc b/gamma_age_v2/indie.utc new file mode 100644 index 0000000000000000000000000000000000000000..38bcda8a2598b35db51e14d0e9c37fde293d6679 GIT binary patch literal 6217 zcmeI0TbLY08HOv6pkPQ45EVo_5Dr3IaD##xh1r?e-650RVP-a)gu|q!r)IX#2rS^iy*DCdIlMCzc%X+2fP&9Vk=eLo9G(>_Z?pQ z2*5=Dcxu@gu;r>J?KqFJ^~|sZkJ2Y#wu!=)JW8J&8POnSdh5K-kF9S-exLQTkUwVq zOUPfb{$=E^T0a~4Yu5Qqeare+kn@4@T3-bl;am$}15EU7fbTH<>tKuZZ@~FJvz}{^ z?;-s>a1)%V0JwJfoF;%{>x=L_t$H>StMjlr462pqhg7 zy8iG1f-vEcEY-p& ziL{qgI$617VmI;zi5D{Rz<6{oJ79l{VX$PPSmzBYaZSGVYErvARN*_!RPtgS^>y2~ z7iGFkANQpF ztf~?uCW?lG#15evhPkEc4MqQYU-n$G_ITTp zw7a~&(R#>^&&4JxnXVU@tUMb`_+dJr#v&%LipygxOp`cM6i4rKUWYq#3vJKGs!ywm zzK-MkAkHseHuMIqN@Dt1Wlj4gNzCYdDu(?&o^N_B{$N%YM+FG4FU#pnii)&6>Fb_d z0cp92O~gc1vt;~qJfeLzJ|4*`)A0>V2Q!vdtn-47XBavCx3XsRbzX;Zg$Ec;ZZhHs=7dzbg(FL$h@jq2ubnaTj!8oMgc`4ZUQXQqjTNmX>SSvi-}`P1VWn!3n$R z5zc_qUUp)v0=!>o-I9(xZf6eOd($(KvunInZPg0(LUs3^a%;!zOru$@w;F|=AI7`|enz6C5!_p_0ghMyo`S?NOA5;7=tp$99hX4jZe2NU#^N-bfID_#G zfI$fKA{8a3a_YP6GT;o&rt< z3|3DAr-Lnk!RQz`12E`hu*o2ED>w@6d51Gj@az>feQ>`%Z?!Oy_Y!7sp_;4W}C_$4?1?g96LUx8nP-+=qT zZ^8ZG0q{HUd+-PFNAM@`Ab1Eo4E_xM0v-X6g1>^tz~kU=;0f>~cnUlXo&nE-=fLye z1@Izx3A_yc4*mgN0sjQkU=273eAw4O5pz%iWiSb*Kt4YeI1|@6|7hC|s$d700kfb6 iE&z4V08KClc7l1Z3+x7az=hxB$}U8U34S;Jt0FcPn_3IfTUpEi#7v**|pzi=&dp7{e<;Zgr%=aD;xp)WUrvE;` zd@0L-yCmopI)bc1^Nu*5e22j%XB2XhD{}HYl*@ARJz}2m9^zX?PDgkNPR@G(uts>c zhrj?xrK}5WW#iR)u&f=N?*}eH~)MFlkU!7v}Hf`2~vZ-dxh3G%fRp za#-b340L1Pde5M#YH6&I_P{WcFg_2*Q^U!LJ+I^L;6uKtJ}IJy<6~V+;uzGr4BXto zkN?lW`Nx^;)wSrx#|yDml6{{J_{$Qv7e;s+GtQ0JYLbnf!1+thOk04ZnlRc+8D^)% z4({4~T{q3m!oUgZhc(0AoCD?o_8@zYt67^|8GD$$#2#Y*yaqM^);a4t*7Y)M_5^!@ iwZ)p^|K>5k%dFk6~KJDx%~r+ zDW%Rqzphv62Fh>mRB9UK&{n0c-KNy_dz9LN^2d9XnnC#|49%**AJ|C<)rp-F{DR=q zg2x5t1y2a(*x8sx!IOfg1arPw{~5t0!Dj@Y6+A1LamdD*6MSB9S@4U3D}t+nYl1Hb zeo64W;Fkqo6#Rq(xHlIvTIL1LC|n&PM2Y zh+}PnxR<;yea4QK%_Er`eBO_CH^f`9?-uBqV;nW=I>fo)xJitRBPTJAvkm$wb=7uP zve+T`KCoMgx?k{4(dPld4}y6g>LKXrci-bzsfQuXiM9*kylIa>i~;RYi0hy|24(d* zFzXr1-4J6(+mjYaEcSxghjG~_ct4oqu>Jrfyw5L=M^OIecogODj*p`J!|^ec8?hN2 z=Qy;}@fi4k;}hVcj-LY;!Hhefugv&;$?Rs#J*3^NPuk)#eD zz6+`E&xVZo+-AH^T$>a1JV&xVmjv^?$m)4sWX$t|^EnNTy7zP( zJmxqLJ_+WTGXZf9oKpcpb#iSHCEsz{WLhNW;1sxu`kLuy{K# zUKHCo-N`Cv^?;mQiV#s zb*UHk7m4ULP4YNZGEQY3kFd!Lf+b_RCSoSYf41&$N;2D0 z*2t7pHu8ENld_I!;>EC+i;cN)QkwJHO&}|I5M+eT|MX?A9P!Tu3^eJp<}PPw)UJ| z)HcVXaT)J&4AoUh>Zu<^&4f-7V0{RO28u|wM z61onJLwp+lD=}f-&RmB%4s(ogh83)9dHRD#YxXQ9j(w^`@>1@OM^zZ6v_t!dfax5vZegX`^UuPdeQ0(!t}z@K-o^tpSK zx`2hv(@OmX``^%%e<0M{+aif_KQ#St8#&ylr-3uT37`ZhCs!(rry}Pbgj1i!IepL< z_ud;hl)8^YlxA$6uY|EH*#LPE;9brFCrBU<0Q65ew^Cs|kFm1z9QRQ!tW+2;VyyN& z6z#mr!@y^8{z%lk|D(X~0CVsdK%eA~M-HW)0IFO(30~dlDK17~E-C!hXMoQmPoTeu z{1Wt+kv|LlRpgt{Uq^l!`kTnFKz|$gbI{*Keii!r$e)M)A@UcXe~kP^=$|5g3HoP% z^72ZB@s$Q|H~3bAZ-XF<{0A|3B_dI+xr!xw3;j|$22t}cCt z9tI|4%w-1$!Z#k6+a|{wS0^wp#r0%AGvSWBf3{v$ySnV-7iPS5{Q0SycDlT|ejdd% zXKCdP@7H)6TH(FGz_`uAR>jy$-;dG|D_n-5;oB zRf&t{_hH_7V{PtW-YJu%T_m}+he@iP>@V_s8BD1*Nhy-(1b?|ylH(atv|h=4GPTF1 zeI_$US!pL9Z*TLTf2W)-CHtt%`~nN3f`0r=`@|YSI0S$jYuX#FjaJv;Rb`q?mdR+A zxvRM(Z?}_vo@ch)Xq7PK^48SZ<6~{6xQc71cD~V?d0)J_wUy5B&o}M=uk%981G@(E za1uBLuvM`|u{E(Ju`IECvGuU!oCR3sS;o%;Y$eR=MSv}Xt%5Crt${6pt$;0nrJp6A xrJf}|0WJY7<(t4|;0nM}%@WPh%#zGf%o5Df%aY4d%M#1d%EYpivV`6M{smeTB@6%n literal 0 HcmV?d00001 diff --git a/gamma_age_v2/it_arhelm004.uti b/gamma_age_v2/it_arhelm004.uti new file mode 100644 index 0000000000000000000000000000000000000000..261bede632b8c4b98855e89254d873135a1cb4f4 GIT binary patch literal 919 zcmY*X%T60X5F8Q`!Ye>0+)Ew9Ycfbq*?Y|F7ox^rNDs>C{0y_`;3cyq~%X9)h z!E(+9xB{YGtp*>hYB%_t@e5o6+4Bb^KG&w&u>hYv#FyGs^A_QA2f==V^O|>XcdX(5 zh_7(=La+wQ8;Er<`n)~*-x~fVeBMN~YNI&gd+=$tz(bICZG)%ar4&=6yy^t%ifJ>?q*B!}@1e(8($6LI^A zHP+!N#GM!?*f*JFF^};qtJFZeHjR80H}XSgr{a7rWk2UP9cm-qOWF$uCAKK=YsK@_ zO73s8n}{je?E?zwXIe{xe>#O6g~ATzqqr%S=g!Ul_AV<3c2L@sC#6RTQ@WG~Cs3l4 c03}H&u7aFKxo|5bMrlz}EszqTbSN3(4Mm}N2LJ#7 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/it_creitemdrs001.uti b/gamma_age_v2/it_creitemdrs001.uti new file mode 100644 index 0000000000000000000000000000000000000000..63255fdbf725bd09f547c31a6311a8eb9d47652f GIT binary patch literal 1093 zcmZ8h+iuh_5H--!axbOaFYOBwyr7l}2_DOCB_egJ)h3h|q?MaYi-og^67NHKfsf#4 z`Y-(#I48DC%19?ONRj3;GTB??W%W*^Q`mg zHyM;#?!KPy8e-Ov|BNNzYTEjodCG5#})Xs5VPNSMxLAfv5R}Xajxwy z2L668et?+w!u8~Q8DetAp5t9cPE2+7KW7||oXj5rJOj`D2;eGnMga4Bc(p- zRuU&AraIfJa&65IDfV?K7#T{NH>P%`nsxKclR{?B92r6LnLhR#!*}paH^k0Whki4CXyXX;18wIq2emE(H!Jx3-wK?6mdj3Ei*Ee973U-w z`gXuymbkr;;deJ~nm1zb6BJFmxw%F0{@nKSjN_x~#}v!{muZqs2b0|-+Z_!jso&v+ zL$UAyEdYxE9|}cE4n7D9f)9Ygr{F0Piu?tz4v?QBr1&W0HGsmUxF{-$iGKu7fTzGS LfRB}RDO~!$4a9%F literal 0 HcmV?d00001 diff --git a/gamma_age_v2/it_creitemunh001.uti b/gamma_age_v2/it_creitemunh001.uti new file mode 100644 index 0000000000000000000000000000000000000000..1aad82489ac3da4056f969ebb7a151c9eeea9dcc GIT binary patch literal 1477 zcmb`H$!^p@5QYm#*muIdg(d8SNdgkrFo_gPnbBy*3CB@q+(|6#v1Ruh!YL2Hl^d_X zod@9p&w>R1@9qxHh!arK=c?YS%iUGI76#Mn3$ydDMdUEp1+T!5gCbX=V#l;93rV0GtE}LC!h*5cExFBNTZI zjsvb?ycEVy;W%UY9?^@)(dujc9fQq1C|pnB{CXUARW&51tg61J@#Wex4t6revtY{E zjMtw7&xY}F&V^b(=T?UYeGz!M1cPVyC!apnfAu-z{4-8}4*m{(oEWNPJWe0;c${^g z^?#?6|KXE&Px;$8x%M*P{qY=`zs#{vr+K1`?&`9uH$~p4QU^w-7^-A78>l3HucNj~ zHF}nGIVj@X#M!VKXFG`W(8Qau#>Itd%Pw@^=C&%fbh+2p%u2J@fYCEqqOGf{yJytk zT@M?&Nu4CyH-9mT_PMC<%_YrIQ8ErMtt`?>M-^ty_H>FY*M*67xf(MP*WPizC%w^z z*~$Ix@P~LqwUPK9w%1iM@@=?Qsq@VpZ2R{N{Qq#E7xP@J!j31}7#%FxaNs{paeA(W zI*LtyQ0N#}FdA+*8gne%j|+C3wtsZ$HjA(QwjYH3W_LLVms@M?6}!SFI1`WwGyx_7 z9|S?~fh0MB?HFn$*8_&@yu`?8OR literal 0 HcmV?d00001 diff --git a/gamma_age_v2/it_crewps003.uti b/gamma_age_v2/it_crewps003.uti new file mode 100644 index 0000000000000000000000000000000000000000..7befeefdadad649a4e0ac2c2192d24d8909a9277 GIT binary patch literal 1109 zcmZ8g*>2P@6gAMY@05L;FQ|sj1Bkcjw1`OUXfz3}kU%3hxh)pXByv1L<%xgdEBFWg z1*)AHmh=t=n_F*`QWtSwhyMeE zQ+N4+y$3F}ky1s7uZ5g$9RQ`;1$h2Ea3jR*yBT88tGB>afM?zTw2PfnTxXv#hl5@2 zT+4R_F?-N>o-y|?&%xet5Bo>EiGcN60jzVz+X0O40PI2Iy~)k`Js{qF19AIf;O_&` z9v~=y$hjY4az-O3xgsb33+;c-$R9bm=OOSK;JqIKAAwBD+G;OTX{K_l)V6LU@ls-` zwY@6W)_j*@tV=;NOM*jRgFJO5Tw4c z(owbL)a(3fiiTm+#8xZ&hefeMvD}+SMhn+)j%fQ;A$Fpjf7MkcuByd(Bh8-SBq2Wy z*Hh`@$e-4+JNPhfrjKl_Fh9_C5pz)MGH|m)m;c*=`_FS3*0pHYty}S4lAUfG@Rue2 zUdW((<7c^(Z*|k}51ym^bFeDLAx^uzs(ahU3zZ#T*>X&Ujt^%^HXBWM4<~8AzZE-B zz!VRKvj(gKd^i**DJWhFgb#ubfe(PfC*=#^B|yPblu?Wuh$&=>jUuDC`1YOvPl0Cu J@4~*Z|6gx^gGK-V literal 0 HcmV?d00001 diff --git a/gamma_age_v2/it_crewps016.uti b/gamma_age_v2/it_crewps016.uti new file mode 100644 index 0000000000000000000000000000000000000000..e19b145bef1e2d6c66db198e7f74a677f374a899 GIT binary patch literal 981 zcmY*Y>rT`_7##%!6&1O7`C+n8Kv;>F_zxBgO@K7p3em)DX4?;(*lwHYYzW53;C*-k zo=MNynL_!J)9*4f=S-W^Z)wy!+1`BrSt<1ph=I4j-v>S~&nfj2y+O{AZ;+Re{~?gn zDj$dgU=euACd2|VXw*Ki43Pg>s6nGPLp_iD1$YAR%vXT%$S1{ha$mjl1L`x#_ZXlC zgXbCC-@OO5+n|0M&r$H~ivZ5axdI%8I!L1P@46P|%&p!!>ec6B3>lM+j_IIJ>Vm_L#q>ryb;lP0sKcBY!l*4an7Oq@A0 z0-;o&`-9;*_@(W+G`F)s)wtURMdGSLJk@NRIGz1YAQ(2qMRjlgPM+VR=xX!GU}_uQ zqm82~mm=2I_5CEaRV~&TX$}o<68g*VdMcTY-DTaXgAeyj^|)v!>`!ztZF^AbGH_GD z_jfz+{*z30>RPn*>xDQc(Vo8!_{$PsFLdyzaih%2Mcr)mKfc5Gdi%~?G)}7Rr1wL{ zyG5%!gYYAquIz${0C6Ie;fb+ literal 0 HcmV?d00001 diff --git a/gamma_age_v2/itempalcus.itp b/gamma_age_v2/itempalcus.itp new file mode 100644 index 0000000000000000000000000000000000000000..b18723f8ab3f323839d45d29a64c1e1a4f22f77c GIT binary patch literal 182376 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 z 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 S#VJ8aN>Q3Jl%*Wy`F{YzKuI 9) + { + nTens++; + nNum = 0; + } + // Maybe change string prefix to use. + sNewString = GetStringPrefix("NW_GENERIC_WALKWAYS"); + if(sNewString != sWay) + { + WalkWayPoints(nRun, fPause); + return; + } + oTargetPoint = GetWaypointByTag(sWay + GetTag(OBJECT_SELF) + "_" + IntToString(nTens) + IntToString(nNum)); + } + // once there are no more waypoints available, decriment back to the last + // valid point. + nNum--; + if (nNum < 0) + { + nTens--; + nNum = 9; + } + + // start the cycle again going back to point 01 + oTargetPoint = GetWaypointByTag(sWay + GetTag(OBJECT_SELF) + "_" + IntToString(nTens) + IntToString(nNum)); + while(GetIsObjectValid(oTargetPoint)) + { + ActionWait(fPause); + ActionMoveToObject(oTargetPoint, nRun); + nNum--; + if (nNum < 0) + { + nTens--; + nNum = 9; + } + // Maybe change string prefix to use. + sNewString = GetStringPrefix("NW_GENERIC_WALKWAYS"); + if(sNewString != sWay) + { + WalkWayPoints(nRun, fPause); + return; + } + oTargetPoint = GetWaypointByTag(sWay + GetTag(OBJECT_SELF) + "_" + IntToString(nTens) + IntToString(nNum)); + } +} + +//:://///////////////////////////////////////////// +//:: Check Walkways +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + This function checks the passed in object to + see if they are supposed to be walking to + day or night postings. +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: Feb 26, 2002 +//::////////////////////////////////////////////// + +int CheckWayPoints(object oWalker) +{ + object oWay1; + object oWay2; + object oWay3; + object oWay4; + string sTag = GetTag(oWalker); + if(GetSpawnInCondition(NW_FLAG_DAY_NIGHT_POSTING)) + { + oWay2 = GetWaypointByTag("NIGHT_" + sTag); + oWay4 = GetWaypointByTag("WN_" + sTag + "_01"); + } + + oWay1 = GetWaypointByTag("POST_" + sTag); + oWay3 = GetWaypointByTag("WP_" + sTag + "_01"); + + if(GetIsObjectValid(oWay2) || GetIsObjectValid(oWay4) || GetIsObjectValid(oWay1) || GetIsObjectValid(oWay3)) + { + return TRUE; + } + return FALSE; +} + +// Returns the string to use - depending on day or night. +string GetStringPrefix(string sPrefix, object oWalker) +{ + if(GetIsDay() || GetIsDawn()) + { + return GetLocalString(OBJECT_SELF, sPrefix + "_DAY"); + } + else + { + return GetLocalString(OBJECT_SELF, sPrefix + "_NIGHT"); + } +} diff --git a/gamma_age_v2/jaget.utc b/gamma_age_v2/jaget.utc new file mode 100644 index 0000000000000000000000000000000000000000..9a0e9cf8a35d38732d7740a9b385f90002a083ec GIT binary patch literal 5236 zcmeI0>2?%F6vvBAMFK=XMMVvppdf^>sEC@$OqPL=3^Reak2N!uq)AWr&|Q-dSHul> z#eH91K_9>mK7lXb6Zi(6qyK+*^>A}M2mPSu_v4Y@1!9#+F z1&;_W3O*{BbIHaZ6?|OqnBZ~2CBY{Imjzb@GY;9kP6|FHcvA4gf*%q5sNly0KQ8zQ z!A}aV3Vuqk7F-it7u*nR1WyT`7Ca-^6MS0mtYBYoQ*akkf?pT>hGXX9n~w2% zsxDM4LrLB!c$?r}!ABe~MgI{nOVzK`S18~rbxx_TGe*rf9bT%wb-W6tG+uW#)CF<8 zs~mG)x4SydZwWiWR-{EzvM-I-vH36t<2ctq`=M*0mC!>F?@OO+1TC8fujMt#{86rk zXzaTN;yOZJ3vrF$T(FcSM#gfM7{^%$)lyesdF$AQ4k>lL;2Q+rD0rjbo4}j{?{zbD z!3}&1nDe7;f-=4poc*@jz>Fh}vCR7PfEh<>Gvq?6wt#88W-G*dlD7%oF8B^GjeT|` zl=4o;EbbJ1mt#JkT?zO1a}K**J&U^`&Y#)?ah)aag&13MFU0qsybn6>xDVw;$9(?Z zJ3fH&2ge6d{_OY=%3mDcgYs9${D%GJ_&$`sJ3h=3iNajCAEJ?uKzwJ&4?w#eKM3ag z!+Pc*-x+d0#BU%i2QmK4u>ok4tIvZoyBsfdoi5kspNu2>{1;=&@vrcu{SIUCZ$7&# zvHkmaGQSJZX1r_UL5OPsZ3uF&pc)2q&HTUh;hM?s7}vjL5Wf$cGyS7b51fqm2_6t! z22Yq~%h%SFO%?suH$?M#b16FCDSuhul(j ztQZ%YP5dV9r&YzknkZ_wtee7U7-pDs7z;}#Y8H&PGl@SCHWmiNZ?0G!S$7^= zsDi2Mg$b_{|B4mC#Rvt%9qT1Sye>H)%x955>BWou{ES}YPilX*jC{x{$Fyxn+RtS{ zAMtD{^a7iWl5a$-Uo{OeZqk4X- z?PHdq_39W8FRSNjo{y|g zs`9>$9%Tc!<+6dT z+-kCpyaGx((n+lQY+tourm8bpimY)Jtu&Le_LwPB$HdpVcI|Q`^TVK#WJz`b{4`6l z3apIvuvyb~wHqM}>R8>noENu{BUw|FBuF+D48;V=+%~cUQ_jW>gPKbY{Gje&zUtX( zJu>sHxYgTt=r0v(Wslz8gDaDW&UlUFoo7V(t>ZUkImCeRjK%#a1Gy67K9%2=E{JC( zejmA~W$<|xS_iF%Hb8t*Jmc_e!!r%fGCafZ?7}k(&ni5l@NCipZHBf$TcK^xc8F(; z9nemQX9=Dmc0s!#o)z{$dm)|)coyh`_Cp6C?)CXy=iZ)sdhX@9hv(j%dv@;Cxku;T zydTOz1JGO0+t54EyU=^k`_M(`1L#BOBj{u36X;XuGw5^Z3+PK|1iBK>G@kr^6re$f m`z!9NviNZCLSwFR?{W+pg^ojG5MwwFF&|6N38)NJpg#f3fDcAfJwP9GJ_4lcfeHQWGudV}k(>S- z>McPI){svZJAu)ct6Vr^fy|8tw)?FwN`mVAXN_lhNnbFTa8pfcW ztuDpy*Q`c&m;J50WX1ie=)GtfiUerXEeweYkNs;Sw z*!Y6dCh}MNOlM~gUhZ^yU-L5e+ea}7vL}|{Qt=Tj0E+-03m*xSnZ)vZ1YCYDJr{+G m{t8$Jxa3@JE+ChA72xu6X}MTjDE=96>=(cq@DgC()c+h{Zh^@F literal 0 HcmV?d00001 diff --git a/gamma_age_v2/jemagonproperti.uti b/gamma_age_v2/jemagonproperti.uti new file mode 100644 index 0000000000000000000000000000000000000000..7d8f1c94edced714b9a1916ac1a1e82904f13810 GIT binary patch literal 1503 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 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/juog.utc b/gamma_age_v2/juog.utc new file mode 100644 index 0000000000000000000000000000000000000000..47255d1e644507aa1b41604b11123d15185aea46 GIT binary patch literal 5257 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 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/kailin.uti b/gamma_age_v2/kailin.uti new file mode 100644 index 0000000000000000000000000000000000000000..00a9500f525d54e5c305b2b7fb9f35daae3f7088 GIT binary patch literal 1221 zcmbVM$x;+S5G@r%Tv1uXbzIP!5z55_5d;heIvk7%X5?N>Cs0B465TZiJozDB{RIBP zf717A!RAUvyw0qwte4r+ONdokJ%p_zliJ79f`c?>WQ zg|YsUpqJ=~vJA~TN}OxaCTFTA-D~2+mY1t=l7n(pPM%!>crW}GPXKZ0$W}N)kItKL-KFB5O{W^oiwI)rYikD*I6#5Ge<^nA!B_U4#sEyL^sFM zUikV|>n;{BMy|3FsJwgR^yGAegfVDnt4r})d47qao0~`a)23w|N%pE->`*uEQ}7I% zs+PtXX$OXt#PwNxJvEvhy0bcE2OsJk>qDD7TpwsVO>0o=B62fBSpSc}`2yhrU1Z*lc6Mr;MfoA}# Xe*wG%UI9JeHSh*_3%mnZPq(&z`W}Op literal 0 HcmV?d00001 diff --git a/gamma_age_v2/kailinbite.uti b/gamma_age_v2/kailinbite.uti new file mode 100644 index 0000000000000000000000000000000000000000..1b911cd67e8051e06d216f9b8cbb21996dbac95c GIT binary patch literal 1101 zcmZ8g$xa(V5N#630%T(e1Oo9rQlx|fxf+8M3xgbNIB{uv3euuy(MWkBz~g1G)M@T-8@ zdjtufoJTPxry4oQrJVdPwEsDkUpd*c2IzlVNBk2QN?Ldu?Z|6|`I+?-%|UI`$ju2&{?LK@XJcs>h1jxL_Y#71_nYH@KTYxX zVg^lKS?66gazQ?#_;=?)ij?J{b*-MuT64zlDfVsP6F{L;j4Hwv#1t?^MsZP8d~+MXCcqnP0i3Jz{{gA$fi?gD literal 0 HcmV?d00001 diff --git a/gamma_age_v2/kailinclaw.uti b/gamma_age_v2/kailinclaw.uti new file mode 100644 index 0000000000000000000000000000000000000000..9b244e3e9725a6c205ecaa9cb39bd141bb22ae3a GIT binary patch literal 1101 zcmZ8h%T5$Q6fG3Q7Y`NR0<$L}QA~6@HVY>VW@H9dZi?;;RH%NWyCw!#{+ge_o`2DE zy6eK=P0rj$-8#3b`}7=62EC)5?GK-gF?WFx?;fE5@KVpMZw|_ap%AUgr$gIp^cMu5drr z$@c)@3>x>-*gty?&eNVHHbh&7XMH7tWpb`YFn$7X295V7H|x&;z55#C_QAkE2h?65 z$N=Tsk1;vb$Vo2c)Vux9sr<^x{VxIDhxdL3dhEXSEsELM+>%V|hUZY*FEjBYTZi{uWmK1y)WJzJbUaDSFXHvg zczPTzDxD5KoOfc6y;hhXSwGbr)HaXYoY3Vr9k_pyO24Ya*4?_75M;319S8h*j;9wh zyqk0Dyem>~e^R}dJ2z6KEcdMI4PDVou+CSnpV(~7*NZ;1u?tCS6fQ->4{07)0QkXB xl-y0xa;JW96bc1Tv2OsI0EJF5stDH*Q@|7%#YIu^58(~)7T^um0nXL={{SXIfg}I` literal 0 HcmV?d00001 diff --git a/gamma_age_v2/kamodo.utc b/gamma_age_v2/kamodo.utc new file mode 100644 index 0000000000000000000000000000000000000000..1670cc5f54de03fa4966dfb1135d6c393415e21a GIT binary patch literal 5342 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 F^fyMr{3-wd literal 0 HcmV?d00001 diff --git a/gamma_age_v2/katkin001.utc b/gamma_age_v2/katkin001.utc new file mode 100644 index 0000000000000000000000000000000000000000..8fbdcb99c5510155e9d5edbb59d524bcedea24d4 GIT binary patch literal 4960 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 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/kiikcee.utc b/gamma_age_v2/kiikcee.utc new file mode 100644 index 0000000000000000000000000000000000000000..59d59b9fb7fc44f4cee36ae856be792f01f08a72 GIT binary patch literal 5646 zcmeI0>6Q~k7=}w0K?Pada35At5fBhjQ3=T`fnkVAhH)P&Nlm7iPIu_;FoXMoiaTzI ziu*S1`*x03;1ziM?-h6f`o7&&@#6;c9JS7Qx}K`)R9Ampy;O#)`JO!+*KXLNl)4Et zW-0Xp@>%nh+JXGtMM`ZxL8)ICEAU)zDM|o@Ee6QhHlI^3%^D9t-@~;e!K8d z;dcnv!fV3o!W+Vk@G;>{;p4(R;d_No2=|4zga^Vy;cemjgh#?-;fe5$@cqIkg-;1T zApB0@cL~2+_&vh!6@H)a`-MLs{6XOl2|p>&z|&8*KR!>%2afrgc3zj$uve+2%52yf$Pl7_q(%`MCA<$S18| zj{J~y9_Og_jmW31Z$kc~^(&D7Y<)BGU#xS!{APU%^53mrg?t7s7{_xpSOjN$uK`T- zt$_C){aUcv`gQO%))~KX>)YUMI8zQV{+wgm!7^LVIqTBj?QSmp-N*f>&iDW0{`Kv~ zSp3_sJD-UK@BvR2sTbJWPW8e0-2Z={e_wp~uIUGS56%PwfY+MO_99q?Nl-PdwyzUY zHgVaEDOJ{WgQjlk^P)Hz(k)jxsE;eET)S;_q=UK{tsZC_)o+4^;m55_rEwF430tyM z3Zo>_UQ%pi<${Upk=IVVFi0z^x@q^!vV0iqH&LwJ4#l`6Z&%f)>uf4=elr!kSVt{g z^X&mEomwPMsbIW>-^nhGctJBB9Ws2sGF7$bi=wK8ouE-MNuQVXSn@-DqIXjcqJRSxN-6KOx^fO{bAVX-S63GDmADl$2vYn z875vG{lR?S1WkiMB1|e@&NcRS;_gWzx^?qG=h;ViTE zO56B;j-6!XT#_LE26Hqk7jz33gHzU)y%=Gsp(ZQ$28}W&%3tl;51Sp)zn;vlOSV7m zwj}M&_1B#bS^IEoqJkOo0+W?@2iyHH9Z+Qg0UX5PF&3si{8ALV_p__RnbmVO&&RA! ztMa~%W7mk^_wMU>?a^XlT3KaD`zA?D_kPNUtro6tdMs`b)roEal15Hcq~$(eH|-Tq z%XvIBOf+cr8$Uh1*gqQ&Te8Y@JZ;lJgwl#R6P`CwH|8vq_`i#LZ}A&)XV%1Jfo$UM z=Gr>C*pSamxFX|9j4Lp%yn4V=una5*E5J&?71TvwHQ-8#E2K-o8o-s%TCfgq#lw{j zS2!ENCcu>pS1??;aK*xv3RfsxnQ%qIl?YcLTzPB*Ij|i(0iFa;fv3SU;4pX=JO`c! zFMt=p5%3Z?3SI`UfLFmW@EUj>yaC<>Z-KYLJK$aL9(W&o0H(o*;3M!c_yl|kJ_DbF zFTj`JEATb=27C*?0|Vd$Fa!M8uU#H7D1ctj2l@fy;}Yj<5$pgv!64WLhQMx60yls% SsDLUM273TwJYw@3k^cz-iz<-- literal 0 HcmV?d00001 diff --git a/gamma_age_v2/kiikceeproperti.uti b/gamma_age_v2/kiikceeproperti.uti new file mode 100644 index 0000000000000000000000000000000000000000..e85cdbd12a9eca16b2780454ed9e1b0bffe33fe7 GIT binary patch literal 1119 zcmah}O-~d-5G@o$@Cy;}TQ~jy6Ez`RaXByn$%a`ud1+<}=xooeZ_9DJPd~|Z?CqIVG(R+C!c6)XrasqZy3j8hKXqWFzI589 zYL`=QvQdhHA!y*rTk*Sjek;X%Z64`Q>V|zp`BvuY2B!9(x|Km)R$6U{m72QScj~<+dtE!oUlh2# z;DK8sYe$)C75e;uonK~Q%31#Y2VF>SHVYXZU)#J*=7i{3FxFZjl}RJgauHYpNLNyd zN%&Mq6+R6<2~v>sA^qP0?*Tqf7GYbY_y#~qlggwUX~w^ZSHNrF4e%CV-B|x0U6_g% literal 0 HcmV?d00001 diff --git a/gamma_age_v2/knighthelmet.uti b/gamma_age_v2/knighthelmet.uti new file mode 100644 index 0000000000000000000000000000000000000000..91c5264965b998c2ad982a8e9df0f3743ceed182 GIT binary patch literal 1170 zcmY*Y+iuf95S>EHwG;~Fercb0tkjkV1W&~k!Xiac6Y{_l+jyE-U1u$O^H9VW@I8D2 z{{`pRyT%>qWG*{9v!2ZPI!<>c2fO=kMdS)F1h#=cE3N*0RpcA|ja8AK(7&K>K>vk6 z$rJuSz5~~R+dz~x7$_r~z&gPCcY=+wvKwraly|@_fOkFulxwXLp0hUVP}rZsdN%>~ zpzuD0`TcjWcg$h`C>t=|2j?y{XF$0JM4LUMeZOZvfE{HE2J5rN!w}@#9szFv+K++w z2F~nhh*QV-GuX{gp`Qa$UcktL^AbAF>J{t>FxH~9#_NgJCweCG!PJ_1Ey5KUxT&%E z56!-qLJ>UDdRpbB&)uR)p`T{D@cCJ;Xf!snc(u{V+*C8IyIA6C-#IWw-dSx+HQ|vr z)AJD;hNPi&m+}v@>{5w-Z(d23Rn2!qId+-ap{e{{8yTqabFKCgXI+I*@b{yipx?YZ zMLqi6smQTpq%%jo0j zrU-B67qtHW49s^i)x)w>!_UFFRqr)Dq60}>QQ+Tc9sI7JFY?(OBd~>fF2w6}rCTB{ z_~+()=Tno=XKUXkE84_14{jseMs6$_x(ciTWFi^J`(zxMMuxEl8VjobHmw}_y?91o0b3o literal 0 HcmV?d00001 diff --git a/gamma_age_v2/knightofgeneticp.utc b/gamma_age_v2/knightofgeneticp.utc new file mode 100644 index 0000000000000000000000000000000000000000..5814687cf525139cedc3a51c859547174ff0ff08 GIT binary patch literal 6060 zcmeI0X_p*T9mX#Th%6D=L68B$jv>h;Bmva)bWdlRG?TWwLy&E9r~CGFG1XN~RrO2; zHxw6C+&~4FD6XKO;tt1epuACE`3?LAzSQTbZJwUv@lB5B@Phw2Pv77F*4^r^b^BF^@nmoNml(2oIiT%o4(#7aH@#X~w*IkuhV0GnW|iG{S$w@Yp=S9~eVK zr}m)mL&6UWv#ugN>nZrSuoYew?g{sWo$x?-MR+Le2|p^lD(nl7gahGFcr5&wa3mZH zC&ClqHQ{yP6T%z9j|+c9_@lxf6aKjHCxo96{-p4ygr5}twD4zyKP&t>;irT@FZ>1J zFA6^`{3YQp3x7rUtHNIsen$9N;jasSL-?D*&j~*-{4L>c3x7xWyTT`hzbE{C;TME| zkTciD4~2gu{A1yt2>(?0Md6o(e=!1_{W^jL8!*E&V$td7JS2gm(zvF1%BCm+)?I(bu!!Vx0DXIX1Mt z5XYN#2UPGrFy{p4)qaTmO*@bUhV$`Gh;@_i622RJe;&^{OJkZ3q?GXob7pW5Vq0ky zh|D=V2N`p`!ZuV>&VFhL*fwe&;{HyqL)>Tb3O{@KEn9>AV240 z-~>!#UvfQj-F+CE%i|va7xorsJ@IDghhiPQS=#gem?x+5j@%Dur`kWK(uS-B|Gf=7 zzaE56!+}}w-?1qb%&_2-63;WZi05Hj@Lwd&%ffF6|4o?ZVv+Z+63?@(h<{z;c{XsL zd#| zWYbQ$rZOHo8`+@embx2bXAZfb@1iohX$@TvCVY}vD~yuJdP$?7`85~!B5#~{VUR|2 z?Mj|93#wtT=AzgZ2^w)rj|x+_Jw9si%%Ii0*hV9}?B^ABCd-k&Qq6hEMwT@FJ>~@~ z@zSDO&*Qq*^Tjota1!)8E~$H2i7h`&B)e(EjnN42Wc@6*5hN~(CgUV;LNg2tOcN}I zEf+Ax3WHdA-g zZ+C_sx^(mTR=+#+R)(9;+gtpW^Vht1^LaOn;!w()b3QwwEPv7UR@HCU(NuZf+~T+A zyq+6x=5KEC(f)Aa%kwRMd%*^nLuLKV%$NDN;B4PiLqCj`I;-ppTIMfUFQ22C-?d2+ zhWxftpWi8+L?$!*nmd8tO~d@$bU+yYDgPMyP^~(&>Y8KLUu|Rk6_JZJnMBsF6q9_x zOIo29BtKfmVXv)7oWT^~$* zv@%S*9?Apxz6(|y8i{FXs_jbu(MepsBxW;)kxQ^`k;-(^)r_u3HJIeNe9e&jxU~7Dc`PVn|NZTE0YN^|>{d zk7!!o*!9r^X{z&A11$R_9IUv&VMxX|A)0@N;Vek)GW;G+)69f}8EofFHPf0zcq3jg zG%YjWj4J<3g`_YyMdkf$*yU4_q4k_?e3j+@0fP?PrI|z z?w)D)z_e?p-F?$;f7(q~>bY4j4xK-8N$$kyIePY*w;YA>dKmT3!MoZReZ6z%uCpT7 z@A;uk$C6#mGoEMo>ChPvzbkkLV0YrPqCD66{lh!@Hi&l!4gv4r7eE(67eVZH-mNc% zIDD5wS3tZo^Lv7KWZsQ=C!T?>fv$zFgSJE0LpMM-LYxjaL$^S;LbpM@qwauihj<_4 zKFPgt7TN>tg?P8z2knOrKzBmCGxDy;J0kCfyb~UTD$pFnJ+21LLv`p7v;Z}rd!WNm z6XG3h5jq0#F2*}p8|pw^=qSXy74KB{L%c)%8u|^y^4{w2|J~o5SEthF$etSenf=fC R%rW4%Kfkg0&B|}p{{UX{x+VYs literal 0 HcmV?d00001 diff --git a/gamma_age_v2/knightsplate.uti b/gamma_age_v2/knightsplate.uti new file mode 100644 index 0000000000000000000000000000000000000000..6ed67990f600c2d08bd6133242b7ca707d11a9ec GIT binary patch literal 1875 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 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/leath_arm_lg.uti b/gamma_age_v2/leath_arm_lg.uti new file mode 100644 index 0000000000000000000000000000000000000000..56b8197c5f9d4dbc967d4b4535f32bda2fb7c52d GIT binary patch literal 1753 zcmZ8h*>2N76dj;tFKgMi(1oRxLW_`iBu#~gWU9yseM8kWnI=}p8Oxp^m2cq#c;GYm z0lo;%ac1JFuXKFRnLC@u}`2sMoR2i&uZq^xGpTYSq z09=FN>+B!ygKPUfT;InP5cXwU1w7||{TkN;ek15}GvJFspIhJ@&$vBJ@wYAA|cjp9H)C?&B#4&yKMK@Z1^8fafdVzRxO)E}kLt z9Jr6?u8n8@0{94!zXbTr7;Dp1w!de+Ky6%mV;iwuP*K|ke?@3YBdnPYTFyFS)c$2EWtNKTwjz6Im z)T5e?x0Algs_{`xWB+ENgL+NJpXGQE&R^59Il!SuO4^aiH(N%V9Ea%ime(zOkI}4( z^QN9v;Va5Y9n?!5)H}J!RBjVhL@L)NrT{c8ZLiQ8Z76aq0&fc5;Q&< zCXJE?$vx2!X@oRD8XwJzMn{9AvC+_IWHhh_K*L%BXi$8|Re(lB1ENXL9B4o^9vTjf Nh6Y1pp`md9#D57V5S9P{ literal 0 HcmV?d00001 diff --git a/gamma_age_v2/leath_arm_med.uti b/gamma_age_v2/leath_arm_med.uti new file mode 100644 index 0000000000000000000000000000000000000000..d8e6f5900199c715e9f997d269d952cf197d6a6f GIT binary patch literal 2012 zcmb_d*>2P@6g5lP%Ubqr=mwNhXv@BpHdVz)(=y5oeL^bk#O*{)#-k*IRKAE0;gJVE zfe%4~a}s;vj(9>`>BQ&yI@dS0bNr!Mt*p<_%smrA90c0H0`T#G5VL5bLqY^-f1v$^ z_WNNWPNV$|LnEg6fPDoJ%I%xOe;R%~j}(s~H2VPNIRWekP8yDB#Z$vsj|UtB_|AKP zhEj54oO3cxJ5n@xzN6rrgJ$C#@7BS&?U-Q>G{#yumUarTob}o{&N%$6Gv=JbN1QR| z!TCPzLeb>Ui+I`^E`i%xFFX7SIP0KY1uVY?&T+KsfaN#9ZO)qxuYg;-1!DJW6rAf$ z8v`sK2e)G;7&JDCmg~SeZks;t;T_;DKzO-$URN&{T0Zl9}>V>Z>gwmSn1`nTiq0t)^Qt3csjeO~wj6 z%PMUpVK)nPCy&#w2C9>VTcN^&H05^jqIr64nQW`H-{pLKgOh>9nm3KEX+1hDf zLNlly={@5YgJ4ezcW%Do^^%lzSX)eDoz!KLZTKr1sY<^#;QNhs*m2{7ezP5Jx6Aka z0l%)I&tY1|n>tCglW$2y_>wZdrdm6$@2?={#A^e-zZAAqw|u`g;G=%si=6m?@4u6s zz|BA4`+5_LUQ;q_t7O*GkxsCP#-Fpkhy7^xqgZeH{iqPDDwB~D&wVFePjpu$S*X%l z$dh3FU30udqqmvucJ1yXKh8^2Zbr6;{<@5M*2mV$n3sUD!Y@bQ{B>GtvD;OWpCjrr zQdy>|%VxZ%;~1ycctQ+ET!0Ok#2c{+CeS}NSE>XR(yT}&U+L+}stUqhOsTQgjms(7 zdose$jk-happH>5h5-JX)G{XE-N65pcLDDJCZgt3MVc4|7cd<0-+)NE=sHJUn0 zO{Nx8gQ>mLTxx9vptg_Z~p_>{v7}S literal 0 HcmV?d00001 diff --git a/gamma_age_v2/leath_arm_sm.uti b/gamma_age_v2/leath_arm_sm.uti new file mode 100644 index 0000000000000000000000000000000000000000..a6bab60686bf64d4f06dda402b801850665269a9 GIT binary patch literal 1753 zcmZ8h*=`dt6gAMYm$mF$=)zJ;p+QJIlBTMNlvdFs^bJLB;x?mt;?azQRKA4|;DOKJ z2lyg5XJTjExzd??j<2`zc+S^etG54Pqy9++B!ygKPUfT;Inv5cXwU2R!F~{Tep|ekG- z{azmg{2@5^!FU9C{urG77*7DtpMv{2p9Q=I?&CQK&yKMK@Z1^8fafdVzRxO)E?yw> z9Jr5{u8n8@3iu3=zXtp~Yv2sFzbV-Cv5r(+7UZ`<`v&;X>37Kd-aME0z&D_$l2l8p zB9%w#P>3y=tCm#>N=3BIK0E7`K+yJayt_sU2C+OPE|B_tsES8v7qbJ(dJbD#&CFQig0ZXX-=}7`|#1o5|edg zX8X~O!BnMgS9H`J#pAGE)xA-CG%CkO72Q$#dz_c`p2>0(%(ta9-lVMWsljomqaDYdD_DzmZ5+c9r~( zKx)N7uh+VX)S5rAH|vno6vO!-i=d(K2j)*b2h0QfF=-GSPs8O;N`vJbG*lWXO@hWp z!=zEtAh{OMEHo7EpZE_a77)Au literal 0 HcmV?d00001 diff --git a/gamma_age_v2/leath_arm_st.uti b/gamma_age_v2/leath_arm_st.uti new file mode 100644 index 0000000000000000000000000000000000000000..937236f3a678cfcee72cf34cf075bc32356ff072 GIT binary patch literal 1881 zcmbVN*=`dt6gAMY@05KDU06yfv}JoFO@)Y*R?#H%2~@d>+l=aoM>7sm`651q58*?Q z;GBt_aYsCHr8DvB(GP2Y^&zKOH~kV!CPI7;qWje6$xA9Ot@k9G`-(17`uw*#u}1bEK<`ZcZu{Ay5hE#Naj&2@0jr`;I4;&~HK zzlU4key_I!eg~ZUpxp&LzX#4b+I_(D2jITv!+_Voy*&c)-)I(`=T4ggJf8>mH498S zdkoKW;69$XF@D3Rzz2Z*8Q^Wv5sp9igYZj0adF^Z1mnx#ec)d`IY#^6o}Bv<;2q*w zzXHAjU6rI-S{120QhP$I%Um_BN{}k7WqMM_-&KE0CJG}PD(_`+YGX4j@{F5(HMH?w ztg!j6+#gSL&&EJz`zoJ|HB4?N0Z7Lht;Vg2;f|HPgANvSMQv@4)Ytp{BQ3(UIi)em za_+-hJxfg1mYLm&J{q(t<5ne(I)iu^=Bsgc5bqDl`B5cqEB!6b%Y4^lxe5BMD~&fP z^INKS5XR9*I66xPk96m}GI@j3-%Wm9kO?`63ST?aZVqv$4usF>iv458d?=ozbp6O#RnKf83X@ z+|_=B@wU_>ALG-?gd**19G4Zif5V=tr>T;B9nqFrS*w~GuD)TC1h>~k&}Gd7*pXSX zliPU=&#jiCGK1J1NUb>Nr5f(<$Wj#ipFzkev|&Glg;AvVgQnn20n-3~m=qn(r-<`M zO3`KyiZsQU!b35o2vdA1y4({*mf}iLrI=C>DV`KfiX}yo;z&`f0TjVmfTG8DTmUF; p6t%a&JAk4_F{9v6yeL`}D~c3_gaX2I$MJ|Y;5EQMFus?6zrVGv7100y literal 0 HcmV?d00001 diff --git a/gamma_age_v2/lil.utc b/gamma_age_v2/lil.utc new file mode 100644 index 0000000000000000000000000000000000000000..92c614c8d800918f86e6c8693bb2244f1c9f3d5c GIT binary patch literal 5940 zcmeI0S(g(<7=}v)MFm7$QB(v}R0IUvH)fJqB4H*b1B2^WNoq3fbh=}AhcNEDsJP?4 z;lA(t&W(3oc&Wd@f8edYZ+BJZ!wZiW9`%CnoM-B(>gq~$b#*7-Y#hlg+O%fH>a&$n zSArcgl-k8|j#4F-^Oef)rPR-dDD@M{Hx5&3JIdb?IIQyggJ6l~H2Q@13m*_ZD7+y2 zV&UtB7lm&SJ|uitIOp!>bBXY>@QUye;Twf-5fdx^N?WTzEtHgm6#zHNq!_`@);T1L2|YmhfwZN5W&_iSV}YEy6p(w+f#U zex2~^h2J3jM&UOJzghS#!fzFRoABF(-y!@?;dcqYTlhBN_XxjN_%D;C=D~B_XR{rz#x&S>F317;L0|y5>x8C$Fa^PJ@H$mLu!6uVwHt?aO)0!$yK#8e zlsZEAk-`_ii-4bd6xe15=Gt&hjD>)6WgG+CwH*uRIx>y}uFoPk*O43#xOR-iS&^Qz z1kP*Y`AdbLApAr)gMCg)E%Rm8S)2@3+xjWCYhvl}N#c6=^Co8~u>%5*t{S&HA}0 zXJW&0-MOb2^z*?|+kOFjx%CU-tE^uH_pPskC)Ru5d=44ho4gm?Z#i(dZO_A9{FQSL zGXAPh*5mK@;r(I!lVfHh?iq8>I{f#0fX_@H;CqMO5BRQO3;_EGszErP_5W+1Va$#3 z=Q+KP>V`kOZImWV5GFj5MJbGuNP9`4p4Iavu0>ue@xmZ&7|{*eGb?gou*F2N zb{z_FiC;zC=+`wKD!A{1ycg@JsjI&Iz)HIs$xF%`FX3-^7o%R#h{uKufA2F!wC9Ve zs)X&JUNK3(myKBRL#7YiD8z+k6W65utf>$rCW_jv#7?0YhECHCLt)88&AidcL|X3+ z>r=hrnk$Kp63nTjYm>TRRNmC|)QHzz|4Jej7bD~ivybmS)V zbOko5{mC-+gKHepNjuVhk6ZLXFDZpykhoED?I88peb9z6lxzlf*KqT)C%yO*`&hBv!X(((P2% z=%p&@?i$1%O{!RQTOSUFI3BJtJ6>rS-|yidS-mGou>J;nG^^)z6E}lf*4Dik%Th&4 zR__byWp0$|pPu26W>(i#3ujAMq#QBB9G(}bQUEB6rW7DlA?VBVq-RCP8 zHk-KL>1Xo~R(Y~pfp9*up02EDNbCK+ZrB}>)^m8Nn5byB7(bn#=%3A(N3zBOUI#%E zMpIZqwvn#R1XtH8@H}_{>;x}@m%z*5 z74Rx}4ZIHC0B?e~z}w&*@Gf`{ybnGAAA*m-$KVt2DfkS04!!_ig0H~W;2SUq_5yo@ zJ@+%q3Hq=W{a^sN_2F+c2KO<4qpb%;umKE#VNe2>fHJ6n5wH<#0;7QIyxEqQqU3sC K1}+CzfIk55GED*i literal 0 HcmV?d00001 diff --git a/gamma_age_v2/lil001.utc b/gamma_age_v2/lil001.utc new file mode 100644 index 0000000000000000000000000000000000000000..bd20a8cd2f1190fde8a358309ff8bab18e21b156 GIT binary patch literal 5943 zcmeI0+nXFk8HXz|2|+>#2?|kSLJsC=&ZsD2c4zi5$z*pjv&rUw4mC5ivz_hf9=dxn zSwV^CsAxPyKtTfv9!NmsAmE8`$raq|U%-FB75skPRlOfv@Oa^)T;zM6ck8X{>YD1W zYr3cQ@I+zFkv-dYe^x2=C2)R$QkPj?t5k*Ma-~M*DfO=vO1**d;zyLaALZK!99BjC zL9j$~8biW|g^vgy6fj|m?a&bhn!91>m?UK2hc{IKvN!Y73v6@E?zgPHIg?~->eZtQO|GMyR2>+(=Zwddl@b3u!uJE(M zzbE|r!hc|$Yvq3H3s5dY!-r7PZx+5u_+H`rgqMXM72Xow6@IVqv%=2{e^mG->+>$lz zc0f1|K2Gfh9|l*0I{-hIbw0lsZXP_B=WrejJQ~wr-=%=hIQn&9KXBIxP5pWbg5%(E zs#ddtz#}z}8*)<$kJvmunwwHL3cpGCN_ZLYb3X>o+JQd~=bRWf1J0GP3b<=y{+LGw z=jHmWfisWf7GP7W*1{P)XC2_R(bo&#ApDbX2K#JGE%Qy*S!@Qp7mO`gk=~!JsbAj5 zIc&4-EItJ|f3h8nS>J)OZha@p!1^wf_gUxXoU^_MJ0HG-+lQtD*O)kgz0pBotUbLt7b~6s%{#blE<(Y#mSiN zxW=-6S5*ykyGBPkXqx)OY}cp}6SPc}pROv?CI}NA$)XZQNu<4`)XM5b6E`ETn|LAL zpqP(tX9w)xLKvJfQLJ5uQe5GyD34*?zBW!(KLG#SgiC$fFdOIvre-_Oqr^keDdybrU;$wVSQu{MitOwUPrjuTz{Q;NsQ7@^4UXZv^3cV;YL6SEg)TeXj z7?GK3gh9`BSAEa-Wy2J5C+j0&*cv+J*=%Bs>;6>F$1KCdYhpZ@@0*})FiE6I6{-WR zlf5{KerwO&UnLt&ay|91mBS9j|qb?+S{i7{>O(=R%7rp_T>D|WC&t(P?7n3E@oh`e;oNxnddQ9+j!jfFQ(j=Q z`gkzthv|fBGe}?=ACI{(hH<8-=HF-6hAV3hG&~=xK5Z)aI*#2zoL@>zM^x3&-94{c zpKGmX-z162zh8y0)4}~tKbwD$<(a$!;e2F0&8%oh>%+co+ZB=43wWrQsBBIdKb@cG zpUsy?vc?h~2SE}>vq&LZs-_#p^-35Y&5q}F`z0?%VR!CnfOjjeuWMTNbhXI${GB^@ zt-#s*Hxr(SY4EXI_WWfiWHXO(H^(-*?M6*w+3DT&mYJ$gyY;rzHgvOP>5j)-Z%thF zb@sTn3(nQUpp`B;cLM6!l5-7s%r?VLLnqhT5yGH}N97V*i@R8G?ogDjHa8Uv#ntAj zJuEd$*^L_p4ZG5CLDvNRdOz;B+Q?Aqjea~0U)=V?euS^zVq{N8QJ6kGnLECUn3M%z zAy@>i0!$jWzT8UiRkQ?fYr7QiXABd~?cH*~dvOEc)|6XPZbi8TT?x45Pt=|@~6>J0iiM1W<0NlcH>&7kH9b&45odyAO1{Za2@k!+5u1o2f-K^2NiG#R6z|) YfWzPjm;}u8QCl8E$$TFNC%~QH9dDma+yDRo literal 0 HcmV?d00001 diff --git a/gamma_age_v2/lilarrow.uti b/gamma_age_v2/lilarrow.uti new file mode 100644 index 0000000000000000000000000000000000000000..47d3fda0440c7fe93fffc30366285d7cab3fc0f0 GIT binary patch literal 1030 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 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/limbo001.gic b/gamma_age_v2/limbo001.gic new file mode 100644 index 0000000000000000000000000000000000000000..b90f2ded1fa3bca01543582bdb023f0f1e5d8ddc GIT binary patch literal 1594 zcma)6&2H2%5Dt{z@_XRG0g2IyLn|OsTaY+{7F3X`QfXI|8}cTz8*8(6WIK)aH8@q` zQFsrIJO|$!B}sAx^Az(o=KFI=vI+SO^6N&D ze7Tq;5AgpT@;T%W42a|^CQLCFu2C18=pwHT^y>rt#z4P0&~J6R$bR&;3owX&9#gQ2 z4rqzw6T zJ654~Ob6NrvjAluS{lZ6Sy~aZn6}|1grVLI0@GA;D74$V!`gra;(;s)h6_Y zv0bg$$j3(ZlDrt}&@v=Iz`I_uJ>TeBAD%BYBnbTE> zz=zPV&0fEaLZMExm)M>RPpY(L5py|P2afDC+85DuRv}nw01D}zq%`4@Gf;+-Iv6Ob zT(^91K1>c`(9$AMR_bgC_6lpkkU;E+oPc~=1#JzIKTTV!d_bjqj| z%f6%IqYoo`D4h|OC9+1-=cG)u31e|1X~Af}RxTfb#$U;P+a*IafG$Z}*OU$|=m>?1 zO$1SBPNo3fv++9U6Hf2rxQz?;fgaN?Z5`N#0?thAW80AJPjDHY#^6*%xm=r=IpUdh zM@gtFxNY)lo##+n&-PZ}B;#hSw2^ZSR6=50FO;Vl!+S2*D+NF#Y;Ovh-R28j4msI{ z;Iwj7(+u!lkjFJt3y!B}rHr1VBqc3@+Y;420xq2ukpe{J61`-uP_4?A(u~T(TW3_+ zroRO847j@O?2xFPzZ3NzF2EXJU|jI{Ldwe~FQUAJ@&d}M^{*ju@`8($xDCudbNmEY CCW$ow literal 0 HcmV?d00001 diff --git a/gamma_age_v2/limbo001.git b/gamma_age_v2/limbo001.git new file mode 100644 index 0000000000000000000000000000000000000000..48d1e5709e8829225282167e8005d16b54bc3a73 GIT binary patch literal 7684 zcmdU!2b>&L9mj`MY6`t1WJv;~=W^)Y?-**?~Ba_ATKb)3tFJI>Yv9cR`^$GLT)<1~=}60wcr?$84Y z)u)Kl3S*4kVzkaZ1dBm>JAGKab=Z)O=*#AJj!3lHQcxvsU&q6Zrs|-ks#9n3sp`x% zT4Q4PaotfIml{2q<1(XntYquN#eo}fC?dzrMf#ySq91=ANF zm8UT%Z#+x@#onNCYaaIjh5AuF^`-p%Oj>>J4@ZLZ0dOoR)V4zT2f^`55Cvq*!k`MhA^k^KQr4jke=lZ}K(H0kGpd-)N2V z9#GVd^Wh{r9;e#Z7&K1Dxgu@HX>~Hrq|7UgQ*)bwX<+B=Nwmgu7`$k-#xse|?D(%z z$HZhX(wP$HBxR8N2BjFT86sU=mzwCMyJvD8{LS0!00CQgGM)_A2+%M{e;mg z(N7w^3jLJPt>~xGiZ(EE@V-(0YW*>>#tM$@pz^ww4tU12nL$5`*4%Z%)6XaO)Em%C zom6~Jb)g+6wOD1cv39mtPd-Oo>&cNAKw6$0k5*s0_b192#N^}<|E=}p3{ys))Htmt zbyR2xm9LnV9OA$7q>WlnYK&@Do_x`?FHhQb0{(4S7q(RSUwKmdl(emW2M$41887)uVZnQjkhtcxn z4z%L6?vr<#HZ!z!7utG~H^X>ulqcC6tMNCF#!CP5o}6yR|9W_GHho!7&M{h^oNKf^S!Z+udY;kpWWCXi==nxB zp%)k}PcAfCo?K+KJh|9td2)%-^5jyq;{WU@CVo}Buso?Jm)>&bOS z%abRY_Vw&O4XxOjCqHP){J(ngbTj_f!;@#2xz)4#Orzz=vy7G}&o;UNeU8!c6Tz)dZ5P-b#03Ffr?*f zbfc)~4W*N&htf&YL+NI(7-pZ{_S&xF`;<$+S9HYu^vE!eK(@}0#{%QzUc+U1=* z;FooAgqk*02h-+MoX(WIpsIVPGb~4C*N@tg>Q1igmYTiDE0_TcrIP{2X}{u@`;%Up zV{I;m9&~pqs#QPks-kJ2TxLB6 zvs>MAPvBL!^O9J}^;oTAY^th^wSKW!m2@&eydvi69n#HizuP-FWu&=*`Ub0zj<48e zWP(=w9d%PE&dS8IYtO2^cCYAp=_qmw7@xFOp!$5acA6)i2oASg)$JP%f=k z+lTSc9GA=<(yb2T{s(7^`)R1DSgor`pIDP_WVZa^<@fm5ptL@}sgy7Dd6g(%DUGF0 zP1Yo`^tsc%F1|t$?c6G&4y(1&V}ecjO=f4RtDC2fTb*4^`D|<3%3NE=s(h}cy>m@E z*OJe6rq_1p8Tatgq2Js3okQ_dw$EQ5G5D0-v{D7TyH-l>rXa;a#on#%zFO<0rL`s9 zmCLMbYE5UdhmwAD-=U7i=)CNd3fHHa`rNQ`Iyu9uhN3miM(n4(UaCBR@l$TllPdXz zDD36V>Z{C375xofadXNo7u>*0`9Ug(9{{sbeeOmt)$Msfs!|BcOm+`vqc9cqd8vxu zLtFG3_4$=lAF0^|_AGXlR3$2hL2q|>%ADOx#X_=3_3`^@YjeIM)6sH5TQ-+Waaf-( z6x~Xt7;a*m@vPTmk*lT4ddytJvn25JK++t|*eh9E>C2}jde2kp@)fU;@1czSaKY)p z7|VG&7^rypO)A4w#_QUi?qFdvt6Mtq*<7ZpWiI*E^DH-MLEGKHUytYFMN8$v4a|)m zaNPg;?KrGz;z>F~*I)fhR%hbSE2v!6)RkVDi#txQYRNaXwq$cha;ka&J1MH`SI3H1 z>F^+m40R|EXS&i|>yj=t7u8*kAU%2cNx^^6z7}B^@LCjqLm0_%6pRKnvl}S%{X)N2 zWbeH|Hr6U@4#$JO9qa=dlD>23`?+S|K+rWD47w%tJ$xeQw$Ku#;4siT{1li9hr|)S21+9j@A?SOSzGG>B(7W$3 z&;V)ByRDw+&CmjRcU=Xopm)?`VKuCQcIbc%=<%lCJ^C(`g&Z6Q`rpA?(Ehp(w2!_K zPJ%bVn;{Qx0T;TV0NR>)Y&yJ3Ila&aKD-t55Gg`G1Q0?APKGj6Ac6td2%F#(*bJw_ z+u-eR8oUGE30vS@@NReyycgaF?}rb-2jO)15PTRu0%yRPa2A{m=fJse9-I#sz=d!T zY=w*A61WsDgO9@H@G-aoJ`SINPr{Y(Dfl#e20ja)gU`bk;41hcdRPd+zhwCt#BLM4tKx~xD)PzyWu&5foI`4_yhbA{se!9zrbJNZ}2?)9bSMJ;UDl4=%e&5Fbsyn2p9>YU^MIsyTR_T z2kZ&j>BqoW7zg8FZ`cR+h5cZEH~g~Qt{tZuL literal 0 HcmV?d00001 diff --git a/gamma_age_v2/loopur.utc b/gamma_age_v2/loopur.utc new file mode 100644 index 0000000000000000000000000000000000000000..a5c79c1defed70b17c914e136420afc32224adf8 GIT binary patch literal 5486 zcmeI0X>$}s7{?nqyaGW$#XH;}$c>_+lI&)ag^(<}IXuv%cej%anVnf?W|M#y-gw`5 zD_(fN@ReV|Pv95u6ZqCDOaK3wp5*~5mR9kG(x>X5{yk6k^z=N_)7zb)!A!^SwvAhN zDy8nF<|y?8%BW4Ly(m{+q15m!rH(FA>KMx37o!g4pDnlkS*qPieTxDv76qlgOBs>xEnkjO8rxn9 zwL$FTV#^%+avS3_46_0@H!0$Bp5^qqKX4KIxdgfux(s69T@dd}zYn6NVH{7`03R}l(RtjDP zz8zwGHAEw?i7DZ=mRYQWwp#yY%e?pcICgS3$FL#hhJNE$>A6n`J&LUl{wp18N5|?{`8p z@-B$q75OfR-xc|8XuIWmzy~bv2G_u}PKf#E9OFFgu<;BywZCJ|Z`#>yWL$F6I%)rJ zH*J#*#3OBnQw1!_PubM*1ayIHeAnpA^y(IhVl^e#`SX##C0;|9fEV3|DnF8b$}&tD5rQk%mz{#;cj2b-5~x8_$nelUTtI zqCh)QzLxk|6IKJK5jj40tQe0TODgQ&jPFgFAk=Atd{~gnuFB~utMZ&%w5${Apsp*f zyW(Sw76y>v$&Z zCZW6+nILF3B0GdW-%l}a(C-&aP|q42jmLhMUpvwzp1Bn1Ai|gmx;ml9jLMp-J~HUE z@?VNXa?wN9aL0YxkgwAY2;(`!A92Dn{LHvM!ynP^L=p2L4fgA(8ECgNO?s~r6@15w z(q1ynATVCk3h&d?EoL8q8LjwUGi|P>9M_eBQRGhgJ-%P-o^)(Bv3Jx{qfHm1^dqN= z{y?s4yfK48B26k&?5rJXhOLK0cB>|yPDPDYsua(zUd+*`f}~r2!0Ts!c*>-{)G)5w z$xaf#Gm4OZgE^Y`SzX7=;FPt#6Cy1YL=wN-s}(s>PSW4xTWX-7KnZzIPx?DdVP-y}Q?8EIb7FrHh3b*w=r!hQPwX@>5nDuce zD{+1I;il6l=Oa^3f(7lGC^D_@DdX4cc)#(z_y<{?XgL7hU;1$-MIiQbt{$^9Aoep@ zL`=|UCXE}9N3>7I$C@MqAbHDhA(f>$ROHsqcHWc&4Nmz)xmM z8o=sU_3ITK&9^=HUKJ}`oAts5=1E!=#FHc)3cBJXN!=!92!@>Y>w6VDLGVBey{WPj zm8*f7YJ`o=TXviiXqPR}fLUNF`Af@RkU7v?h`C~FnLqAwxMSuoNgKpd+X9HYZswe) zvPIBhXbHq$Bc8VSs(8BMsfwp5o}zeq;;D(JC7zNxpk>f!A%0Pc0jvO%P8fJe6#Pwn5t=J`_(IJZ127!BYiK6Ff!m^uSXCPYXOH?1nm_F6d?G z73fvyHRyHd4d_kiE$D6N1oRH{F7zJsKJ)?fA@mXSG4u&^68aSS4Eh}U0{Rj<1$_m5 z4SfUkLbITYp#OUQGsr;}>V|Sq55)X1H{989M?>R$+za(V`=EYk04hNHp(0d*nAbsw Lc^!g=p%LgWH*X@G literal 0 HcmV?d00001 diff --git a/gamma_age_v2/maarcl108.uti b/gamma_age_v2/maarcl108.uti new file mode 100644 index 0000000000000000000000000000000000000000..20667cb9f9d8d203a227134271c5fb82eb4516a0 GIT binary patch literal 1754 zcmZ8h*>2N76gAMYQ?{~iX=&LhZ2{5O)K%3;ZWKA8yirZ;X=2sRSoQ>|dz6Q;86W2kb=b_D-Za}{TiJOz6 z_};?Ttn)TB=OFHYM&E@tYq)3W`_Nn;@c=aXA+%Y;BTF}+4Hh7{N5mp%_T@3O8D|OF z?9sAS|D@Dx_Y@?!=g&a?3-xo*fOmm)B=^Al?ozX`X)w5^q4BG0$)n{0#PF zlEy+yU*^6%z#S2}Y-yPwRlrk$h@-DEY>PyqW=rNl7Nt5;qax3^70Qv04kC$(dSWo? zSbp81$ObZ>*10Oz(*UBYRV*h%71doWg2OH*EE{!Vb*z0e437q{_EtaA?Q= zHgZhVh<= z$0o+nii9RwViH#^aQ{YuY^JFc{2iwwVyU%kZI$g^l_a>mWrTN}2$2Qx+UiCFb${Pi zFN_YdD+W=}*oi{fC^njPbZPSn5f(1>8~q5r`1Ys$-DcBwz14Rgib{OU%cir;fU_W- zn6HyAM>pXsrIT3noNIvpL3&PGS0lhMH%-~zY^ h(xH~XWspup2ck>R9q2%G9y$)4h7Ln#p`&p9y+_aO$o8~~i-o+E%Z=bdn#bq;>| z#M6)`-vYoIH14Ny{dga&9qoAx;9mgTyBq*l_qYPz4)H3J!FcYM0PE66-gU(F#lUZj z#hZwEFI-Pf-WOwXvTs_v%gE`oBIJyBOHQ7N7C9Ne0zLse_iKPX_cSZ4aeArMrQV2~ zm`YntGfdTXo)3&oe`s=HGDYT8t3jC-F3pGaJjbm>hc3NI70vg|t=|~F&F`kX)#@?V z%q#aeK+tu$RZmr?yUq;mx+oYHb!?2w`PtOr_2j2 zU8>c2%1*-gJ{(WFqrST@Vs-GL-=68)nBn-^*ijsV+GK&775w=B3Y>p9(Bq;|Q~G(U z&S~q^w*&qx!|jC;e&@^#o$04e-yrvUe^RY&PBu<3OHIf3H6BwZ^(roktQ0K;!$(A6 z%mREY6bv_W6Gg#CK#@}P6g!3f4%h`KND48EdL1!^MuAaS6cqmq*!DKC1H1)TH`f0L Dw?}`z literal 0 HcmV?d00001 diff --git a/gamma_age_v2/mantahide.uti b/gamma_age_v2/mantahide.uti new file mode 100644 index 0000000000000000000000000000000000000000..fceac4110454f9506b1de0f56a9865ae8b255b03 GIT binary patch literal 969 zcmY*X$xg#C6g2z3@0^gha00O$I8xdJktix{;l{x<4~R&bC~*%({2af*&%jJ6K7NK zpiu#^2#|l?#h_6~E}n$H0NCT1D}Xj_onoKd-zT=f{WS8;0o+03dB&Wt-h;cnE%^X` z8Q}bi16;|u3V-P0H5Q%uw{q`>FT!sE<c@Rq9L@$wGQCGj(gYH{@)A_3u zqgp*J%qT(7F=;H8sw{Vm?!9-g&<(ZX^xu3f4F6G7ck@VnkQcm%w`Lkj+|s!@wUt($ zW|Esoira`carw|aPjv>*W|;Zy;KO~p`Z@L$=8rla_#D(aaopTs^S=qazu%KumWj@7 zKNe#oXxQt3KS}WSTm~&Ax^MJb6v{qoRCrZcO*Rj1(5>pf8dHnq6o))3DJU2UeiE1h nC~OLvhk1yipkOIf3Y0>jC@C6>g@U9IDL@Ku6QIy2F!B?>DDi$G literal 0 HcmV?d00001 diff --git a/gamma_age_v2/mantas.utc b/gamma_age_v2/mantas.utc new file mode 100644 index 0000000000000000000000000000000000000000..60f379f253882d541cc68dac88a8984fc3c6728e GIT binary patch literal 4863 zcmeH~*>W326o#8@5O5ZfuoJMekU&C6oDc#8uq=5|VmrceVs_CQwe5*VGs;ZMj#&d? z3Hx@*B@e(2j{r}=3-ACGZ$QES&veVjMOBIms<_Fi`gOiurl;q0PtVc$nR5Sy<3|Qh zDW%Rqzpq#7Tlk-ERcai*vQ4Sko0R%~yHdO0f4p6(8vI`{G^;XyVDzZYts;0t@TlN1 z!Mu;Zwkr6H;Io1!1WyW{63l1uW7Y&eFL+vTUGR+H^MWr3o)!Fp;1>nIB=}{)uLyos z@N0q_f?pS`1vdo;f?I-(;5otbf)@mbf-eeQ6dVa|3yuXRf;)mQ2~GuPg00}L;3dJ! zf-ehR5&VYWHwC{X_-(=O2!2=a6~XTbeqZoa!5;|zQ1C~BKNfsV@F#*lbQ{Ong4PF|ryBX?(IG*SA;C@%P0e&&Rfl?d6H2O_B ztzNf?0XWVr&7al@-EY=p7zR_Kgl96^fjHs^w4C^s^W zqTD#n4v6mzZD--~-(7<55PYZLy9D1Y_#QCdZQko%=$ae&KCr*{{b0_Owj1)#_5j$& z>p`&Z)9>opHUKf^v^|AWjQw7y1d;a%-Y@teFpYf<Am_rlWGk^jn{i|x?q%A4Ic729jWKV;;s4(Q+}{;w0Ph;lpAm>>>w0Ju;x~Y2 z%NWEyo(Bb&1y6!!OuG|lYo<*$ZRT)p>A>Lfo{ffSW~X%9S5D|PMOEr_j81hNn8wUX z$EYzAw+s(CXSD?rCzdUR)sobvI<(bRQLdOQNW+c|lQ^%K(etin;mS$8WYSFg4%MtC zUvD+412$C|7g{CEblTR<$lb8sZKm>(DkikdbG*%l@qE^pGR%o+Gdhe!QPq=f+^QQp z8WtngqQn+Gi{ENiZMX4EI&$UMnl$Zptee6_l6cHJOeHmwwkt;4g}gkRv{r`2GuN$7 zE#_3y!J?iws$v4YG86XVU$-K-7@=aA!L1tNwORmG<2BP&vthQTy}Y2;lxKCcIF0?_ zE2p&WraCJ5ppS>PmV~kOqm;X8YGT`~p469n%rR0k*G%HB@2-}^D3TR(h@C8tB}r>! zDRj|PYC`~i9 z&|UdlJjL+`B|q_fO7;`)(G-LTWBTGK8nYdSL4n%?_VPTFm(Z+^A-0~!BAXrU+iMJF=an)5;xsyfG(=w)p3_H{G9nel_ z7sNGU>d%y)sXkMDetwwJGnHow&(xhMdp|S)?Sb|}`=I?0Q||-NL5L|fQ|m*}VTdX8 z5r`=>Q)Q;eOpT92Cm^Q4OnsU1GSy{@%hZ-BEmK*huuNT*jl{WU3OP?ObtEs-g__q z0dG9>7x2gn@0`O6Z}5G)GxCjrymL6v6ye z1wSJAQNfQ1eq8W=!A}T&Qt(rPpBDU#;AaItC-{Ki=LNqY_(j1l34U4dD}rAY{F>m` z1-~KqO~G#oep~Q6g5MSVp5XTde<1in!5<0!Snwx;KNb9$;Lj~{Z+v0-NTgi^m{MQc z_&TKDSXLuSed~C?Qr|ho6W?3L_CCni#%gF4#CngnjN?FEWMfAoJr<%JQzUunVtnp6 z=)@C>dRWJG^dW>)8DhKiry!c^2cKoz><5i~p|R{5Xxj2xqz#CD;XBjFIHq!AJ*PmI z7OujvH831q13Mk$+B#zpRq9N^X9+$Vyc=R$=RgN+#pi-uJ?9BNU+@KjFBH69@CLyf z1#|43Z34KqE*895@Fjvd2Cn>NU}u**Kzaq_%4`vQC7Au7ZH3%eUj@FILD&%Fp1oS| zFxZXtHZbRqwjJX9(XN5GR%q8kt_;@;*A3SfzeyZ#+KwVoT#q{;&Kdaz!8d}}LyX@9 z(a5g9&3R;meJI;FlM2N3N{vA?mdBBHE$>3QXn6wZ0n3v}d3NyG zTcPhP--h%@%T=U5TjpB(#WMHGZ0r04CeUOAsV>>ZL;wuc#Gvd z;33O*fVW%bJKYGT-3jIU8R=cnMjO8y?CenN&V`j_WL&bW^S|QU-?Wu=7SY4;!{hM( zUISd;_dpx4*LeQi3vnOw?79zPjQjn5Xfw(<9u|DF;Az2o!A;YP1D%<=N$X}7XNC3* zsv6k1pQPE8?zv!9ALOc192=eJ&@-*(Qf$;N6Lw58cwE)GCX6!X6jqCpEYW^8*(v;r zNxj66Gd~LRKvU1zl0{OE!UdD0+7*~gYw`$INi&*yG6cbENoqw8ZxS$~ng(rYp;+ zy!7ki=&H!CuJG%lzGvd)=c_Ax^grqcB7cQnpU@%J(4hTl;fwV+VRT28qaaFJjd_j* zt?(zbZ`WwyH+7ap5&ve9KL2iMWMVPHub6%KT{f)GWd}4F9<)5v48~AexvQnCW^^!L z$NqD{DV_Bb9hBT6pYXF<O9a-2QP`$jA`T+tZS4~jeIv_ z=+O)ox%H>RDb|O#Eb<$%34#(UDg08FVZ9s7XW>_L4~w5ig!TOt!_r2i@W;YVof~sG zUkA}#U(~M`i+L%^<8;gN>Rf$;{a57gNlj8Qvwmm_e>xluqP#;`IYCfG^XLn098U^& zaDKWN-pnht{Q##-9x4YqObi+vV*_!qK3smviTCggS!?sL@$#8>eiU}{xpxo1FXr9_@O|;3 zUR!6YZ4FWA;Ty5adTETAcUeh3?XD}Riqr1gKIR-9374h?T3 zFSY|O7#g~I9oWxWUSbyGG#(nh_8)<@c6{R`!mDRKM~7p~?>N8NM?=Rz{Ck!I$${lv znD-riyH`Q0p*0Y{^PCLcWlw=lg-(NbSLJ<&b9feXHgpceyC?6Qyle7~$-CuxXalqn zx(M0?T?}o8E`ctEco)1Jx&qn)@vgTOx(ec*j^`rJ!fnuYh<7#K(XNB8hju_aA>O@s z=i*(9cP!qmMxYWj3h_*=FaGI{JAdwZ4Ukhf~lCp literal 0 HcmV?d00001 diff --git a/gamma_age_v2/marlockfemale.utc b/gamma_age_v2/marlockfemale.utc new file mode 100644 index 0000000000000000000000000000000000000000..22dac422cd9f03112d9886ef52dc7ccf39740dd1 GIT binary patch literal 5652 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 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/melf.utc b/gamma_age_v2/melf.utc new file mode 100644 index 0000000000000000000000000000000000000000..e93504b81e35ee8dedc6802ff0edd8a9f70f135f GIT binary patch literal 5520 zcmeI0$$Q&G7{&*hma?T#3T3A|rO?tQX&azG96M>!x{k5khTV+qNuoxUj3g%w`@WQY z-=XaM2V8sNFMvA-Zmb9H@V=79`J9If=k|M^H}m^uMxREbnUTL7u4LC8>EF>esFW%| zKQB}2JCrBSRqB3}CoWWK;0&dHT&+|KWp0g9d6fUa(5&v}A6OYeb!-*EhXo%IJSq52 z!FLH}Y#Z|)!S@QjPcX-8`&R`&AXp2o39bun2sVPJ1WyZ|5$p&)DtK0~E4V4x6YL9a z34Ty;AUG5p32qCX6Fe{YnBWD$4+(x)@FRjB75tds#|1wj_({P}34U7eGlHKL{G8zD z1-~HpMZw1fza;o&!LJB@Rq$(qUl;s_;5Sp|ntNODJA&U8{GQTa@|>A_Gg@x&~E4) z=xk^l;(h6J|I_R^cu#w8)}IgYUhLZoaqp2=LEKjy%LNdPjN>Ra#=((-bEV*`1Ya%q8o}!XbIxp>4T3j zKAQz^5qz!St%9!uTia#<<@Jz_d4u5XVEb-%i254^?-aaCa37fOiq;QV9uRET1^es~ z^?Ot1x*CKy-?W>OLUBFb4Do%CZxOst@U37P``i{&!ndc)VhCywV40+d*X(f2Cx6eZ6=*6)Xor#yy|dzkfH``@K}0Oj{7A4K^>%6XJOrF;nGFDVyL z{+;p!%4K+Aj9G+Mr+f!^J(&BW1X<(v*V<`LX5#cboEr1My-=1h`ufeX6BVgpRL|-F)mW`la%WgDGYF zqEG;td;@6VZuZF!fpKmqsyE(Vk!8mxi6XX)Ru# zU*co@e%lr8OZ?K9_OOOJ_s=K3SdU{yH&oVl{h(T&D+@Ym2incpMLy<4Mc?rv z8ztKg0^>!U>O=ZihZ!R+HXz{cvc4oSAYwllT+fuoJZ_J%(D0O8<{cYFB+;zscNziqe6@Y>I= zad8U8RasYup>0I}*cSnkb~9(vH#G8K+i6wDBhySSDr(n6k?EX&S-;uD`shUHX&QHm z2@3z=l70u`AFu4_dnRCVB-?o9f7Pu-y}hP4FxC28wVsCHCA3~|zFP0AHq4Z6yV0(0 zx3Al+b-TN}-96pzV7J@f?GCKsaN@C4!xmnAceCzx_jbFD_*s&RYwj$UTx^^weuw!z z?SYmk+6nP2 z2BDiE=10tnm=7@zV*bOtX9&tb!w}D*95e!rLd;vnAm%9tpo35zIs_G<38)A$&nQ7} rK_{Tkp)a7Xp>LpXp)aAYpdsiC=uGHToo}w8|2yZnBsR_+=b!d3rNMh9 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/menarl.utc b/gamma_age_v2/menarl.utc new file mode 100644 index 0000000000000000000000000000000000000000..b88e65e414863f270e193ac15cb3bf3b80325293 GIT binary patch literal 5504 zcmeH~%aD^A$A;x1Y#hNa^fT=nM~}l0S5wDBh8EzkH?B6$GnGpXN|NNj*`h7|rx>uADD;AaHWmN5UO;B$hv1fLh&68x;-w&0H7u3-8kJoh=l7X^Pw z@RtRDMetVze@*b$1%E^Ew%~6HHiCPC`+^68t>B^Hk>E&hEclY(9l?phw6MRMRT<}%F-xB<7!QT=5UBS-_z9#s4f?p8)qTrVVe_!wq1piR* z%YuI-_!ZCGf3FJuvEZKw{;6jiVYMHFZbpuys}6yg<0z|NK%7rQZ+cdzmHK7iYfAkp zFna!a!8fVjc;1IxCeC*|v>)Pg0`vKYeI0FD;SbWSRaWM=c@E?Lg~6QX{m`eNJD?9h zf51cdT$caD2Od_?fWf*%1hvHznbReaPlvrh_s47>vI{XAaQAFT1&OC?u7PavcH z)H3upIE(xw^tR_?;CDSA2miw}=e`{;l>JXY_jx`EKI)nK;wjIc25)%&47lt06u9U4 zDez^_p9Nn7b1!@jVj@2c9f1wx&qJp?(|=EU{vx>H`80SF%v6K8=efsLq1Q1#Q@zUm zEBo&MbN?{yd(F=?!1P{ysvbA`-0;Ky-yYzZX+XO;gMrVY9GLq)@Hx+G$nW-Nb{*_d zZGf5h9XkW@Kj3Dl3GqzxTl5U{CMFF0JHfvf{71om75o;sYsZtsINP>G+YXg#o4&=g zi?kl+h1)XYP`PQYE2`RLVoh$+zTNK5Csu9PbYSzvaMg-znmM*qsg>m}H?eCDs&c~? z{XCwyI7`clt{M5BRaVc^U7HssbZ8bW`T0=mrq8A({m#^g3zLscFYyoTOnbRpQp3iM z_py*J#_6co-m<*AF?CIxh@$Fb({#|WZauDMY$chidRD*9qB$O8O(yZ>)Y&|rPMkMk zGs^;&9k#NT&BqOETvV1iCrs;Qx|5bPxIWSZc%;C zTv;&Z$nCI~rPI(|&Eh1H6+`$=mN&9&u(lg}Z{q*V%!bnhR%R~lV?I!l*mPuJB;2Ix z?b_hdv{)<>-tF6RJGBjZsZP1O&R~za9-QvW=hH3DhgDYXorz778YijBHRs@ei#=ME z8)l4`!7b~{aRImVP*auH(m|UWWv|^N*=Q=}H?!)!RQ++tyS}WdC#EPuBgU^?p2m~yrnBR! zvSkwMoL!u!dNv;8{g%(-54^gwC;<3;SuQ;(D$4SDVn%)kl;t`;A~xT&yEZB95&bLs z*iu!N_D$>n9xE$ugEb~kc*SM7A3m47vY#tkc!`!R9Ca1lWZfl{yOGt^2pt#Nq&gl? za$6MfuGPnn>9K`{I?2+J#%{;%h(~aPp5bWZx=78AUDi#fBU7+9K2dW$EqLZNK0k%F zbSuo(v)DyCnvPBSL=hR*L?#^+i@}kNN0GBB8Ya=ai2EjiF#|k5#WzJ44ySA6BK9xz z(ClV;?5rN*l+f&6oDYhnazO0#D6<8v&9u>DGtfhfy*k%3e1g$s4$G`gaT1pG^^4Cf z{sFM=WR4**KHvbC%?#$QOwVEvtXk6XP!~})OErF$u(%|_va#m0k8w^9>@H4K*;mi3 znPe$ey7zAQF3NQ9%F6b@4!5IlE)V#MNp*Zfd%<(r$8NdHw;O*jLpe(a<1=ye z%!>Z8W5-MGB~c=H7FhQ2d`GpRqj*q$bGf1Mw_N_$--7&Bhz{gkp79Oi&hY=gAIv-T z0f;dIw?5-W-WBeF?u8f^@~|)tWcln{5j?>U#=t1Zq=m_*M^a%7Q zbQEIT^%(Rxv;;A(T85s47(X#?T7gbLCn3f~jE5KpG5%rP!+3{r4&xifHH>E%$DD?0 z&?@vZ=r!nd=nd%S5br@Z{8Rad|Hlnz4O)kIU!;GyXLv{C-S8~52{F-cymK<&g1D#7 OLoMi8s10?XF7zLAW0|@D literal 0 HcmV?d00001 diff --git a/gamma_age_v2/menarlhide.uti b/gamma_age_v2/menarlhide.uti new file mode 100644 index 0000000000000000000000000000000000000000..12846c5f5cfe5150d5da41518cbd74bf265ecc69 GIT binary patch literal 972 zcmY*Y$xg#C6g2z3@8W{QjROdf5LajqjRdHofitFgK!npoiF*L?d3*&w12eG=;YpLX z+4JmVau-K?_os&^=SrzjpbP8(A0y7sk0})+e}GTmKjEk0zhQ7{l@C}4m;&aQc$Z*?0M4LsKVzX!k((Wq}C<~yTp0i4G(ZUcPJv1EnOR&J%b zl_%U=R}xvt(5me!?`xC3OLC(#L8UEKzf238=7YM=JW6C>)2CE0DAvzzqkpzubongR zZ>^PA_BTP$v$+vRRhN5K_g{M$=ofWO{%`$7lKi7+&gPcZu&j8FVApvfrmIVP>?++d zFQl}oR97ia;`29uJ=GgN+P5N12OrKG>qiqR%wkICVC^I8FX5aUH z-w8X#f543+e*s)MQE=b@RB?sxn?-(dap9c2s&D%DdYhh}*F9HV~rPRGhFDz4P?;NFmT&`3TX?CSjIi&x!4raQ!41KVU{`Qc z@HxSrU|(<`xFvW}@RZ>5f~N)FFZcn$4+?%r@WX;15&Wp&#{@qv_zA&J3VurP(}JH7 z{H);T1V1nM1;H;0eo64lf?pB*s^HfIzaBGV?oGjO34UAfJA&U8{GQjsg3BRHvlli-^L-y--{!K($Y5xiC~=RUFZfaG2q z1aB0)N$_UDw}BJek^s`JP}1i%!P~)nm$V&FQfH^&+Xe3u+y&;lqIE+F?-tA$N%Hp! zPU3}e)dO+9Y5Su@F&^)L_&&&Y3O*qCE-;OC?hYy9dtzqN3)Km*6vS~eX8Ry~>3TVa zbjZ;qgM{%)^+Vj3$ytc|9r+-{eS|y!ajlXEp>Jb8g!H?Z43qBl_E~^d#(WgK4$SpYgc9TTH?d0`&BUd7xH#s4YoQFy!@A&iVHjeXF!zRp zxz8m0o8Vss|0(zn!Bx@!Un2i^!Cd=E|J+YGwqsCFyk_}5JP`A7a4(qq&k2a%Espgh z#66R3PeB8yLpu#|{46^Ibs@iO8ckaVrfB@4!N;?xYX(Ja%UYfvY#Dz#%niMg>mD!0ZSq)xL)9CD;SJ7)Qs_Kp4AL2m%Aj!qsO9(@ipx_ zlg9IPQen_9$gNgob&W-X+;eFe%hz5*SMB(QrB>CGkCZW1FdbD5uOpT-=2!A&D$Xlw z%NDLGxh-nzeug}<=h<5*ZQ=5=}F^i#!^4u)H*k{#DbEbW6 zmXGnfEnAe&@{0r7K@7F;pNo7Ej{`>6Rob;(uTq-eT+kwaKwEK)Mt)fbf$Q?OiS)bR zmjV&Y@H6H-t}}-CoN+*S{~i7a=1^LCTuWDtXnUfF^_OJkb6YgiCunCM(dXODK0Gs8b)8mHT}@fGEi*StSi`ymm{c#T|wMU7gj6s~4WJ#K>_kNqJh&;Ia~QF*CpY&*qH zB0m)bh(R+#NV|NR}?vno6 z>n|!F_KlY@qn2YLf5_>x-EcsN9NW&}_81EdPsuQETNXWuVnx4Q2uSwVqz<0Ema1Ad zcA+pUZEN383Q<4wMF&y2nKbbm>Oa@Anw7!8G@?cYZJQu4?foz9HX4YJb`J|0V~*P} zJfiR~m-tH%{(NOs*D)TCN3x7<|0{1H@{=}8JX5JnR%&q2`Ix)lPR$r@Ob)?df#8JKfz&Ih=4T6~BpB-&w3X-F=;IJ$#m^an+t+(1pgS;+L3T z)OpZ+XaU624yS@ARenkN3wsf?7+M1HtIO$I1}%qHKr11hBzb~d1@U$8WWp07Plh}Z z@+8O;AWwd)p*7H2XdSd3+5l~YHbI*qp47HLTcK^xc4!B*6S^JZZpIy~8`=%=B*hcd zKBx!U5AlS=lMzouJPGjx#FI}il!E#o?nD`=AId^JxeP!&sT_h1LpkUOl!u0(0(2BA tLT^A9piiOCpf91Xps%6Np)a6bXbv)C%G4y}u98E&w+;RSC{{s6weI@_^ literal 0 HcmV?d00001 diff --git a/gamma_age_v2/mhalfelf.utc b/gamma_age_v2/mhalfelf.utc new file mode 100644 index 0000000000000000000000000000000000000000..bf78b3b28e44a8e51eff4fc13a7d7a4288132c64 GIT binary patch literal 5468 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 T>w0rf{ok6SN@!dwu0QQx3Bz@H literal 0 HcmV?d00001 diff --git a/gamma_age_v2/mhalforc.utc b/gamma_age_v2/mhalforc.utc new file mode 100644 index 0000000000000000000000000000000000000000..aef6ef562487447c5b6af42dc3f33d2990368386 GIT binary patch literal 5328 zcmeI0S$h;k6oyL$LB*heh>99EML?D$Kyb}0Sq6s5I5Qz2;#f0N$u#Nd9=dxH;=ZrA z?>pZ654`c(f8f0r{sivy`+Auz&!fC@hfm`1-~KqO~G#oep~Q6g5MSVp5XTd ze<1in!5;~}B=}>&p9ua`@MnTQ7yL!cTytLu{#x)ig1;5~UCcM4Y$5z=$GvLTKI$3VBjCjLB!F@+l*HL5 z_)#$Do3%D-dgUimlX0?I2fPorFem%;c&XmiZZfOmnp zKT1$y{8lD*ouiq!J`dN%Ja8{mpjFrx{4UHuEEDG0kTB1gg#QuDvyX93L0jYfH47e$ z`80SZm}kWqh~F5-78c^r@C65L)s2 z(9MT#&o7mm7N)e&?0|ITk#r= z{E7|&*X8dB>GS(s4#Z-HpEVcpw`W+NJqLvM-{;R_4y9$9TDodh+Y2S^zofFDgN~=| zRI&bUe>ELAUy(zSw2P@XTDzbvj9RwPe}0teC@EmHwpbHpUmNc=alk z*GqF98>4gstB!ae+cwU;!630LRi>0`obUMEhs0{eYvdLzY4lR%a5rP>aT_f1*q?R^ zjEAR;+RJTY+bIT#{8SKNy&JsG$j|B)7C(=O*tdL4OAR%VKkhV2+?c&~ZM*Xw5nnGw z?+5QBj_S}jKb(Ks|F_3& A&;S4c literal 0 HcmV?d00001 diff --git a/gamma_age_v2/mhuman.utc b/gamma_age_v2/mhuman.utc new file mode 100644 index 0000000000000000000000000000000000000000..89faedc9a7613a42e8528ec24e35d8d11a155aed GIT binary patch literal 5354 zcmeI0>2}jb7={N5l(rNo(9*qOEoBW!fY3FL9g~1bT-zZ~O5KS)iA7||NOD5D?xlaXuCiru~UkJV`_{)@6B5j~Crr3U6 z#y-|S>mZh2pE975XX>>Ir+&U;d-S;AfBh>Jj8Q~ zd;+?X@+i`;QyxS5bIK=?{+jYBq`#+JK>A0@r;+}d@;K7JQl3D%8V`eg6`?IDKMvjj z=Kd%_*7)AEc8!ynxHb>}k9pu;s6eZ*FZf=VgqT|9*mqG9?q13|@LA zT{9@^Sl$W3Xk0gKW>l%y3cvjMKPN;*Xo_5m?%kAkv z-crsu(PC0H{+)8X*|0ip7SgIv4r96fz$_vZ<(y&uAt)=S=%Y2OAZ@Z#=nO_>!9@bE&|3c!6^*CyDU1fdO531!k z&IK*;N41l#(ZsLlDDr)NQ%Ilh=W-+#GyI&njNc{0`do5Ac>Z1f6y{J`wxOk~rnEa( z!v3?F<2q^w+RfNSKI%k8-|-^bO12#Y#)~@Hr}gCyvyH&aO#5EjR#yv->&lE7tX1is z@csJ8ypyh8r3!jsrtM;se&p299>{f#H)}9REK8LwW$G8(Vdo~Xn(-L91xp&WR5{+w zn0j=BMV|T--Z=_VFGkBHQFLQKmvauR>UtCzSj zm&&$dPTdLel(NqwAdQQVwuue1M>^2yKyIWyyUCh;e{Vb_lbgq7pE1$2+G&~TSr z<{itUB~h&CcM1Xae6@9O=e5kV|KdpB1o3AltNNY^7}m%#Ui)u(YmslSSs$2c zZN6Gdo8Tq1_1;3Y)>o~Y8QpfH!`*IQw>#bK9_eO!*)gJHB*zGjksBkn9%vi19ohlygmyu@Ax2#MN??Sw7upBy zhYmmop+itF#M6u?SU)rXF#=-ba|{}Ujzf%W7|}42VFbg-g%QgTl!1mJo1qPyu2DF%C^YMTikX3Hk*33SwmP4fH+q1N0;GE%Y5U1g(HpLjTwK=GywN NIY&`!oFmRZ?H?f;Z2tfN literal 0 HcmV?d00001 diff --git a/gamma_age_v2/mhuman_1.utc b/gamma_age_v2/mhuman_1.utc new file mode 100644 index 0000000000000000000000000000000000000000..b1cd4295925e8c7b7aa29127daff7f1694b593e2 GIT binary patch literal 5361 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 c^er?5t$SzW@LL literal 0 HcmV?d00001 diff --git a/gamma_age_v2/mhuman_2.utc b/gamma_age_v2/mhuman_2.utc new file mode 100644 index 0000000000000000000000000000000000000000..11b2e879e5b3cffedf12e73bc9197d792c372f73 GIT binary patch literal 5361 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 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/mhuman_4.utc b/gamma_age_v2/mhuman_4.utc new file mode 100644 index 0000000000000000000000000000000000000000..f6e73b235b3fb8b1b022c64b1eee5606b790c124 GIT binary patch literal 5361 zcmeI0iFOlJ7{@ONh{_JGxRf2sR@$ElY-9*J|~!c zCw-n5{G8wmf;r!$epT=bg0n51oube<2vcsmJTU(x8Qrg9E)~ul!Slp6MTQn z9P0t-#vVSAQd^;M+El>-X?gv;2q$^b^?;Ib_w1sc#q({f*%DZ)|&v* zeNfWpe!&O8e3!I?P*Ud*IC*D%BLA@9elXt^Z2(GmQ1B7KM+F~?nfvQF#Pz0~h!Vy9 z_!z|ZL4I8D6JWj%=AVRUWbQ#4`KgeiKSM}3S6T`pbI%S#N(~Kh4(X7iKN%!^c4`FT z-AB$sS7JVe^lHqbNUz77L;73HPb0k%^J%1i#GFU^XUtkZ;J8I- zYs}Apd%-*(B`C3S0!VLhv>3P6;pSKeo`nju0_TF?g$amh!n_X><~@_}a#5dmXp+x+ zkbRzkdg8M-3Emm=S@2#k?~QX1zc(C%zcbkf+n$H|P>06fnH-n*;|1sh@++pn!b=E)S zVYDLZR7+WOt=K+v^P#)wm&y$bOS)LT)UPzGnZ{yyX^CGn_MGJ}mRDTQcSV20#^yqF z`Y)K;tn^D+OjVTUm-wY&t7ck@?ej}~%-?O>qI`*88r2T=P-pynRAI%mFG>#x?$v~JtM;cmCT+nwrmk9507yWQj6?m)LYxSrDq z=Th}s*a6+ey4yY0?bgF*i5gGYv)p^3alQC4<%e|zv=UkcF<9YJFf8K-l|PWzKx?6O z5I??LzKzf(Xfw10Vj#!>kbxfqJ_Z&H@EAxipyPXD0LQ?s2igX0hju_ap?tod+Yz!97UmVjkx}_e*vu#a8>{S literal 0 HcmV?d00001 diff --git a/gamma_age_v2/mhuman_5.utc b/gamma_age_v2/mhuman_5.utc new file mode 100644 index 0000000000000000000000000000000000000000..5db7d886410f4d2fff2287aa581af237ebbb3118 GIT binary patch literal 5361 zcmeI0hjtr96ow}ufdGk9si8PMIL)!01_Ufib}S;>LXzWz0AeJKt&LZ^%I?aJ=_T|| zD4|2%fCu25ya8{(8}JAm`2Q`^l@B~Ya?kla-<`g*Gqbv$E~R_V3?3Xfu9O;wuHK^5 zHKhG_D)l_l4I7m@xk9OlO-eP9{=QkMA*BDnP^_NeA6OAWc4#HR(}K?ko)LUj@HxTk zJL&Vh;AaItCz$h1>X!w-AXp2o2(AjQ2{wXf1RHXea-A@vr03$AQId9@1>^ZTsgU*a@`_Yry2_$#CT^9neC;)K z#f}Fowkn={q>QnGB{9N`<;?lzNwXN|m9%9GR~6lsQ!AQa%!+!<+ioD5tE``GH1JH? zj&ie3U_7tY4B{!|TsOh6!lauwUL#|4P!IhPx3)AQp1BxkFTkAgx;n4tjLMj*UMgAb z^-p;iEsr|o!Wg<%Y#+M0(CzqzV%@@$cFLFgrMfj&@01so`FUe6SbnFx_Jm+-e^*q}I@19>Ib} zEmaIpGnO91V3WuGlrzcx@RU(`v1x2O#ZDqW6$IGt2JbWSGrEDz&nqJKEg#ELK~Ch4 zI<*21W~W@+?p#asuNR~D64l4;7KGg;{k6|uR6gw+FJopc$3*^=Gh(~pgs^jLJBQ&h z7aE?D+q`XK=t&eS`t3qMa=#{Z@Z{B0#jU<)FyNU$<6gFK9pf>&krmj* zf93HPYtp92Gv(?+xf*xDCbS-Bv0NP}*UYSL*}>s%cc9y?bh}5o-J{*^@osmp+Z|fZ z>4bAB`%UbC?qc2T9_w~%;j=`IEA~A1UT9n|eoXmcT?MU%ZiN_law!;=@q@}A$ZMf> zP!Gh9FPCp4vRgJ z#UBd{wECcZ(0=FubPzfO^+UYWc##c4Ll6TY20#pa81S5c7~n9lVL)>dVgSRyWf)39 zBM>j73^WRjK@2>`AqE-@Fit}`Xabsqrl35;K%oF#fxd&jhkk&5hJJy5g?@y7f`*|L X&`Rh=U2pEK|66kug~m1F`qTaes-SR4 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/mhuman_6.utc b/gamma_age_v2/mhuman_6.utc new file mode 100644 index 0000000000000000000000000000000000000000..441bab90ba3cb37c3eb9e9466168d2d30c58e645 GIT binary patch literal 5361 zcmeI0hjtr96o!Y82Bas{P@Eo|=GaaH0+uB^7Ljcs$#FsmVkC{NjaR$M?#hnoCG<`x zp+nw)2jHB%0dK$?@CY3E|1Hv$4?IC~&-p#yowl>HcV~4yRZ91q893N~Tq!jMUAtYW z>nQu~QtEk>8#XF+@;0T$H!0Ob`TJ(222uV4L$i98e_%xj)uELHPYFIFcv|pT!RG{X z?qtsMf}az7K`_^w^e+p3L9iBF5nL5q6Kn*}2%Z&O7iD0oh=Ew~}r5$pS@5FZ7X`m0_+`Pb2!2)YYl2@F{D$B+1-~Wuir}{eza#iv!S4xv zU+@QlKNS3t;Ex4=BKT9mp9%h4@E0*N=DrmCmEf-hekij+tMbb?iPFxnAf7+8x`T-`vl(~ zGq3dkbYlKEqIUMy@DSFC)S$) z%6(8W=YGKlz}#=zK`7~S2+Zd}>w}W|!-D(4$=CtGgMyC;J}UTF%#5$&5civQA}SQ) z@iBVY~ z>?4mtS7JVe@@mXuD6hwyMfqFIPoumM^J$cS#GFInq z2RY{%s3(5crolU7J`3Ip=DBeW;`fHv;O|V%!LjF|KJ=mScP6jPv+@FT0`(=+Xxch3 z1>+aY4Blm3HE3$vsO9;=gl;62Io;)|RI_Qcr=6-Pmlm5woia|%cjj>+f^04FGsdraRx_|%C#)!Ge$6|UcAa_S`8w&4_4D$GRHM4erfeo2lCga4HFU*} zFIa3D9F5%=+aCvk=#nv}Frd72TFoE1F=`ie}8)ZXkxMte5B*`cwm2;Axfp0Kz?$;9I;Uri%9yHNELrXS zPkFdn9(~G%QB18kK6G=T+wlvVc4pgW@mhEiI4TWEnBoN@e5V?4h)DT}xL@ zYkRJM_b;iO&_T=7b}9+-F)PTsmJ=kiq+6b6oS3*z^Y@+X~P+YJ|l$g%AlE|0a) zaF-18wvA#Y(X8mV8v)7rn)Jb)S5p!0+pUH75)H1{bBw*vxL^F3^253uS^=$uRzchfre*w~@(1!7Xf3o3 z;>VZUw-MR|ZHBf$Oaz$#GVx==$HamO9uo;BbbL-s;F!4eK--}0&<nAk9(ISDa=Vd63brJ!Mm z2T}$afkq)F9%B#_4JH_;p&T?0O+b@S9%7R literal 0 HcmV?d00001 diff --git a/gamma_age_v2/mhuman_7.utc b/gamma_age_v2/mhuman_7.utc new file mode 100644 index 0000000000000000000000000000000000000000..9b03dd88776da0a585a7ea25f70ef009faa83c88 GIT binary patch literal 5361 zcmeI0hjtr96o!Y82Bas{P@Eo|=GaaH0+uB!Hj!;1$#FsmVkC{NjaR$M?#hnoCG<`x zp+nw)2jHB%0dK$?@CY3E|1Hv$4?IC~&-p#yowl>HcV~4yRZ91q893N~Tq!jQUAtYW z>nQu~QtEk>8#XF+@;0T$H!0Ob`TJ(222uV4L$i98e_%xj)uELHPYFIFcv|pT!RG{X z?qtsMf}az7K`_^w^e+p3L9iBF5nL5q6Kn*}2%Z&O7iD0oh=Ew~}r5$pS@5FZ7X`m0_+`Pb2!2)YYl2@F{D$B+1-~Wuir}{eza#iv!S4xv zU+@QlKNS3t;Ex4=BKT9mp9%h4@E0*N=DrmCmEf-hekij+tMbb?iPFxnAf7+8x`T-`vl(~ zGq3dkbYlKEqIUMy@DSFC)S$) z%6(8W=YGKlz*Vn3DL-mK^pm~kfJ|BD7aQy3L-ORhashghPZ}w$kCq+3dSon z0`cr4XQ3-GpF(*x=24W_V;)2KTg*?Ryb<$hlz+sWL-}XS<0$`%c>?9%F;AjggH7jk z^U&6qp8@xR`F<3j#EJ=^yv5OG+}ekmV;}e~l%VB!FZf-Uf>E*mPg}uQE%GzQuXvHRW;4d_}mg7>vvnWXkX$NMzw<&YF|GW`63=ijjpM* zYr9^#ILE!9MgFL^;uwwmk`4mbk8n9KOvF~n!b0pa;~`P0}#Y3aI_ zuA0{NTmkQ2QaPc6mZ$Ah66B*+kasO7NM=d5JkK~myLwz-ZZqfb%uK~~T1j`cVA-~; zm_e*c|CH<2M&_+JdX>uQg_)L(Rl0#y#e5*!HqNZUA`zA^ zdZ}XgHe>5?83cLkPdXEv4|f^07n{bmQ=BC7Q$c`uH+Y_rpV18jKaYsmw|s0%1vQaB z;?xR!F+1(rc4u2+e!UPqm#9BZw;-G@nXmo+MeS3*@iJz{a!lk;I>WXbE(noh+c{hw zYoXyT8Rl)vVkXh7=(igI$@!Y}!JSuA70bpc6jr5e?fXe1`iH)lAZj=BCVoOAms(b{ zJQkQnG$^la69lGx{-xbU1M$(GVRfV4YG|i?j0pn&$q|1G!h~lWgL^o_b&SXCMt0y7 z|5e9dtjU;lo+(%7%hh-a4xz1c7RuHBa?Q->mK_}KcKf^CO1FEY+dbOt9`AMsy4}I` zTu!)_vfo4mbT{j6_gJ@E3-2WwT(RdEd!cc^_%Y>&bvd*GS_!R!xD`yx_(A0lRgL z#UBeyw0fa^(0=FubPzfO^+7z;c#sW1gAfxTCO}MlnDCr{nBXw6VM22fVgkd&We7?^ z!w?Uo3^W2|AtoN95EBh17^k5eG!9KblTaRFqELXYLf=8(Lq9-2L%%@3LO()3K||1O X&@$*|-EYR$|Lr-NLgOBB|7rgMnHO+a literal 0 HcmV?d00001 diff --git a/gamma_age_v2/mhuman_8.utc b/gamma_age_v2/mhuman_8.utc new file mode 100644 index 0000000000000000000000000000000000000000..5074b5eb86ebac5284a0604553f11c244ce436a6 GIT binary patch literal 5361 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 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/mod_ctrl_bk_set.ncs b/gamma_age_v2/mod_ctrl_bk_set.ncs new file mode 100644 index 0000000000000000000000000000000000000000..6e123e9881579c6ddd732738369b3a1a907488c6 GIT binary patch literal 1118 zcma)*!E4k&6vk(F6A&sQc(l}a5hJBqsfY+-Z8o+An_YHOy;){A<8~mKq?y@W@*nr$ zLBxZH!ulmmD5=|E0tu6s_j}*_-i+^#>C3AZy9bO}-?kX8d&Df8ZDc~5Go5QAVw1Ei#Uss4#|?c(lrR;$$|v#cJ9bT;ToQOpBzCy=q&nQ$#aDyouW z@PVWCXs>zw+<6lq+}mz<%i(c3~U3M9$zl;ZE4 zVi8Y7Mkp9X#3Q*7*D`-M?61q!_P<8C&7+S8eJZyKy(BibVSK3}N~YXM_^5>;lhAaYWkMMmx>SeC znfz&(R3mGXj)2^~3mGTj9COeHQz&fv4{mMT2XLR=#huQzNn%>^JWX)Cnlh2N>7I^8 to*&T3pil0=4@QH}H1>kv*gqWGth?7K&l^T}vp}0Si>qo;9?nZ*e*v0RZg>Cy literal 0 HcmV?d00001 diff --git a/gamma_age_v2/mod_ctrl_bk_set.nss b/gamma_age_v2/mod_ctrl_bk_set.nss new file mode 100644 index 00000000..cf781ced --- /dev/null +++ b/gamma_age_v2/mod_ctrl_bk_set.nss @@ -0,0 +1,61 @@ +// DMFI MP Starter Mod +// mod_ctrl_bk_set +// called from the module control settings conversation +// sends a message on the DM channel (to all DMs) with current settings + +void main () +{ + +// determine current module settings for rest, death, and respawn systems + +int restchoice = GetLocalInt(GetModule(), "rest_system"); +int deathchoice = GetLocalInt(GetModule(), "death_system"); +int rspchoice = GetLocalInt(GetModule(), "respawn_system"); + +// initialize message variables + +string msg1; +string msg2; +string msg3; + +// determine current rest system + +if (restchoice == 1) + msg1 = "Time-based rest (time interval between rests)"; +if (restchoice == 2) + msg1 = "Supply-based rest (requires tagged item)"; +if (restchoice == 3) + msg1 = "DMFI resting system"; +if (restchoice == 4) + msg1 = "Unlimited rest (normal NWN:EE system)"; +if (restchoice == 5) + msg1 = "Resting disabled"; + +// determine current death system + +if (deathchoice == 1) + msg2 = "Parthenon Easy Death System (PCs revivable if party member still alive)"; +if (deathchoice == 2) + msg2 = "HABD death / bleeding system"; +if (deathchoice == 3) + msg2 = "Unlimited respawn (no penalty)"; +if (deathchoice == 4) + msg2 = "Unlimited respawn (with penalty)"; + +// determine current respawn system + +if (rspchoice == 1) + msg3 = "Respawn location set to current PC location"; +if (rspchoice == 2) + msg3 = "Respawn location set to module starting location"; +if (rspchoice == 3) + msg3 = "Respawn location set to custom waypoint"; + +// send DM channel messages with settings +SendMessageToAllDMs("CURRENT MOD CONTROL SETTINGS"); +SendMessageToAllDMs(msg1); +SendMessageToAllDMs(msg2); +SendMessageToAllDMs(msg3); + +} + diff --git a/gamma_age_v2/mod_ruleset.dlg b/gamma_age_v2/mod_ruleset.dlg new file mode 100644 index 0000000000000000000000000000000000000000..f01fec13c8076808c82153d6b7284d16ad64e801 GIT binary patch literal 8549 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 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/module.ifo b/gamma_age_v2/module.ifo new file mode 100644 index 0000000000000000000000000000000000000000..1eb5372e6becac217275c6db70e5384fa683d538 GIT binary patch literal 3559 zcmcJR&u>*l6vwYW5GaLKMDYh|fuhKd(!K(M;*ZCBr7g6yQfR=KT<6_8eZA@Z@p|vP zSBeWaCd9;*i3y3u7#13Fsfi00>cWM_7+3rOy3iOFE?gKBe|*39&Ml|7GjWoW`J9i; zMnUBaLhgbbfM96OY%6(4F#VP7!-5YAJ|y_C;3oxht)-u%f}axnwBTccpAr15;O7KC zFSsiBxZs-Lx@CmQIU#sd@R;Cn!6yZu59TEGP~(`L z+pXM*8b_TA+e#frpWAIi&9OXh#+2=AA>1F`^$-KuVD;Bfv!A--d|xGVyyLu_ zbGbgYZ-Ufry!tu02l7|f*T-1*LdtSCfa_q{Y=wLegtjc)UuknMm^s68AB1yoe_J6h zF$gI47gfH-2f%MaxZVdLS1mt;`eVzC$0wE_M*WrLM^In4{3z<5Ecc=Q-ST$ScVR*F zzXP(>@=ow>%l+V^mUn?qT7C>XYx!|-)ADZcMaxfsU$?vme8uu!@P}Z=Xdi?zAn%8i z@g4y4Y`C@qkZX1<`7^=a2)-`(N5Q`e{!?%l60G#URdB!H{eq7Q9uYh%xG8u^@MXbo z3BD@$Bf*~v{u0di@J^eDFt>T9eTVjve-QkeV17uYO^@K6f`UO^~oR}Rgs?6Y0+OxwK7SX+p!-VS&+o}h>?pe6;pGkmA6pXpT=P6@2qN; zYCd0GXI>h#41MJDXEUm!Ii;PiotY#$8^T@QKN6dC*{xy~Qa_*jlhO{tH@h0_x|dXFL@aA)`JOkD=2v5cRx&Dn{!>qI_$g>$%fn{8U^E105U2p%`E2 z6Iyi&z3Q2c88&~@NV%%1-A;x7k;$q0xrq_prqYss2jqLC z`l?Oc*Qs=MO`oat9qilNSD!pFeyg92850cQb`^HgGat;kNjzVsNN=G>iQf)&$Skof zUY-=l3%#l#L{``a<(Z(Pj1J671M>p9-q=b#%+k(u>gze%-Hw&*w+*dOEz>}i4r~K* zW0i%*unqJW>W&WEtyP_=&i>V~+Fv`?i<^oCd2OSZ7ppvY%#B_%&uO$t=0H&pZ%W(D zXpo-`4i4q>N9vMx2Zy?&B=sZJj8r^$SSp94a!@M6QmIH~Xk8dYjf7LorO71(Jcx8g z&W!e3fysLHvg@}zT#`D~OG)DQ`Z`NOL|(-{u%&wZXfANQ{Ni(U?DZ(W14r!?SFIbw z@#+-lZuq|2P+1VCL9~vFhYNHAA&Ycqbh>^i30>tj8jbFP{N*T#eP*-FP}d|azG^bF zjPGOKZMFlqGsJ&7qh0Y;#{Vt3xUn-jpc?C?tfj-Skt7TJUF9Zh$moumZUtU$k};jx z(&BFdjivikdAjT~`XV>G(ia7p$LAf#d8wK+>RzBhQx%0`!ry8GV weUR;t9gv-ne#kBepIUrk?S}A4#gBh4WFLf2rUA$ZL>A8Zf9-{P{xAFa2M9Qi5&!@I literal 0 HcmV?d00001 diff --git a/gamma_age_v2/module.jrl b/gamma_age_v2/module.jrl new file mode 100644 index 0000000000000000000000000000000000000000..5f615b0e59c107f3443d8b1365ee7051014fbacd GIT binary patch literal 100 zcmeYY@=*vg)-$qTU|?VbVizbK0HqUvGzcVsNeImXWd8>OkPt`@KZpSZ&WRG?&O Ksl_l61_l5u$P4!X literal 0 HcmV?d00001 diff --git a/gamma_age_v2/mordmagman01.are b/gamma_age_v2/mordmagman01.are new file mode 100644 index 0000000000000000000000000000000000000000..4e861fad040641f5e14d7372cc2bce0a638b95b9 GIT binary patch literal 4688 zcmcha*LxII7>9@6yOrk91W}M;LB$f1V9{t4dc`g~-dm#$c4S=JO7KE$$q zCEYdFvQ8sCFu}6sbMKFdmbGY@WsRO{Sq{wV0diUdi8L>v!<8?`FdXlOwGYmb` z(6bCZJJIUb6JSx2x06)KoJ7m#T+q8qtG}hyPxE0qFD<<>? z&rX8W=VEjPIdkNSA`fLw0JMMAv18UXGR@*$PPY%0w$xf8(b8)jMuF z7Zo?vM=~yMBm2MOn(a;BLH(SzaUkt&p?*5Pns?H@$5-<~ruL>b*zwKaD2=Q4KU~~2 zR`0k+s=a;1?W?_miEFN-zT%qgHP_K#;+p;3*ZB4|uhRD!$ok!vjH&hw+2O|5>}RvR zaSh8FNL;hM{fV2#8tgh6%=l_tWNL4!`@3J6>$gAqa}E_(<1pUvc}IS7{pu z+g`QhaPvy{W&hRw+}HXw=X3l91MlZ`b*YCqtu4DwB`CM1_cy!c&)JT9W}+E)7M(jbMn!%*k9mh@=h+;5l78* z_HbvBH{B_3x=Zp^cgmaYtaagfuOqL>u{A2^`5l>T-c?V%{pes!v#Ji|6My1UuYv z;<7Pta+z$|b^UmRHx!&Mx4b!wQ^qr31P{GF^>dYcQddcX+oO3_vtRF5s@^T-cX~$s zX1~F8%9S=|Rph1F-xRv#I=9{P-5hr|dIdLh4^>b;nHo{~D4$Noqx|im`2fa z@Xj67IJpr7rN{=*LJd5Hw?YDf-85Sfn2IY#^S)^EYyEa8@M8(T4(_c*V{jL32 zdz$ty?WZF_=QEvcbRN?=OlJw5ee^#)5hlT8m;zH_8XN^WFX^15^O4R)IuGd_r1Ou? zJv#5`e?jLP8|HvIejdz+1)y_^&L=vT=scqHfW9O2UAhF+1pR;M|3i(?Kr-afnf!Fp zGvG{E1!uw8a1Q9ab}pO;=fee118blbwB^>rTDTAzU>#fp7ega7!Fp(h4R8sxKn6C# zCfE#H;8NHMmx2B-uYfDzDrkjm;6NK>LF-O?Njqpa*ZTJ0YS5-zfFk%1KnbpaGK8Sj z+6mW!wjFI(+RLtk>tPq%05`%-a5LNjx5903JKO$6cnBVb zN8nL-3?7Fk;7Qm6Pr=jh3_J_Z!SnC}ya+GB%kT=k3a`QI@CNLKH=!Heg16xv*az>z zes~YwhY#RG_y|6RPvBGd3_gc1-~fCHU%}UK5WazL;XC*qet;k0C-@nD0oi020z+XK a42Kag5=Oyj7z1Nr9E^tvFcBt!>i+|r6x22V literal 0 HcmV?d00001 diff --git a/gamma_age_v2/mordmagman01.gic b/gamma_age_v2/mordmagman01.gic new file mode 100644 index 0000000000000000000000000000000000000000..42a6c2d13f0874bdfb16325d7a76fc589b04f7fa GIT binary patch literal 440 zcmaJ-yQ%^)6g<8k2wGTJSZrZoWucAzDwhiuf)}k<4Z5&yB*wzO@U#3Yoxu~ax(9}t z^GY)L`HiFXWHg?NND){9P2iz?EQpk$Gw=X>2M@td1V|b{9pEln(gs3Mv&Ma%$r%Rg zC7`96{f_DixU0Gf?y0VU`>J_gq?-5hU9mHXzd92w(u+qvv(^QTRAPHNnVg+>%=4YS z=H7%MT?=hlp}YSouDo^TEB|xp;b7dSvPo`do8~?gmRYhh$u|2uNKfW}&^tZTD?QR1 MJ<$t;GsJ)K0>0rgumAu6 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/mordmagman01.git b/gamma_age_v2/mordmagman01.git new file mode 100644 index 0000000000000000000000000000000000000000..adb2b1f5e03828b7f00a1f34766e09559556bfe6 GIT binary patch literal 2862 zcmai0Npl-T6mCO8Fd<<{Si-7oWW`BrvjhV1NF&=KlBJRc2PmpkZK-2VG3pULEmwTw z00-d0m3{dE9N`SViQ)?1*V7}7DGIvkoA7P) zA)1hX+%LrMkiX0eu`(ybpAQJZxqqQSh{M1TxC~&5Yg~UXfTiMn;AMbq8SB}9)M-LM zb$e1)J-?^KIk)2b;m(xPPd3W?fD4`b8*M)b6#g6m z=iZ!8Uulb+;5@E<7&z|L9VEpOZWXGgqWo)c6=%cMzY1`AoQ0{Sj zs&B;GJGP`_d^1hT;}&{d?*@}$oMNeKtw|OSs?yp-&Gg*#OwUcv^iU;kbM$OV6Ui;V z82W}B<%ZmBA)>wUK7CUrlX6E5?`J1QRhn^Tu_jDYQ*fGy4xOa$2l_o+%TmJF#{?He-!^N7L`C(3ukkrJ2fMZ(x+tjgU6hlvXAlOjE-5 zk7wqw->Qt0C@s8Xy(_nO%L@2=|In+5MyzMwP+bqw3D3Cy$oywFUDdG0(MjY$@o0McCt(SZ(+=y!r5E!y656GRJ`90Bmk8vGfwOa$$fg1oTEh}sh6Hvz)8}>0i|JD8m(dK^- literal 0 HcmV?d00001 diff --git a/gamma_age_v2/mordmagman02.are b/gamma_age_v2/mordmagman02.are new file mode 100644 index 0000000000000000000000000000000000000000..6ca46b88d17d8bc2042f6421adc5c83ecb453d46 GIT binary patch literal 4688 zcmcha*LxII7>9@6yOrk91W}M;L5(FO!JrAjEJbW#vOCF+*_~N;HbNA8!`>BpSB#3- z8!Gm4<)xQi`X_j&?{7*t$wMCVB~z!*V$WEFJHCBvaD$^a+qcP zO1f*jWt~QPV3K7m_fhv*y&Cq`t+NNMyrryvc zL+>&4K|}v(=&8dG`B`J=?S|fM=>3NN-Ov{8(ff=7nc5^xs7Q|_rMNW)RF2}2P2{R) z3t$4M&Nfh)(a;7{K=ouQI~L?uWygU`T6JV9BVScjRgqSV?(S}`mcHgG6#aiQ-8p9Qt%FIZ#lA{cLG+OT_I|dY6b}UqZ-u*aWMy%EKcwG{knWSpVEJM#W z^c+LaO|<&;1Xz;f?Icw)FVXTjAN20h>ThZF(?XcZOG__;S&2RoJv-5h(Q^{5ICIhJ zvy&k8xfERi`9B#b66sS&Q(Kk_(&eD>kewPQ(RGEPSEA)dwhB_cI?;+X(70)T^^Kd( zMa50^k&KJm$o}uRW_#0jP(P<_987zgsh^Io=ACrk@zs2gslBNUb$l~8O5^JN4;MF$ z)i>^uYHxpW`)lt|;+pHIzqn?5&2==CxMn~1H@^MNtMq*avwrs_W2${acDV61``K)7 zT*I;k6W46-K;ovchPsZ1GQJuYncAD`f$mr4`W?vr90lSs)b)EgKGOBuU)=uYRocd( zwpVRA+`Q6#*?+Y^_qTq{`5eE&;QM)fZR#OTYs#)u3Cb<${Vi@e^a8)9&?cw7M@wvQ zimrL1*$tareS9TW6BLWCUkTHE-OiHZ%VSG}7c!aG6`b~-hZJfIa+y+4smZ(94%H#A zg07$3X$%6ty4dRBvnD76W#wzVwzkgD?a8kT+N+B}r?0i5=j5YjvA@92-zBsZ!9=nZh1=>r;KO72p)QU>gOu?q^^>Bw^#G5CcniS`$)9!n1UX~YZjAuHvqN7au2|Ay=S!Ho(8vBP}OS;*OeU+A)1UE9fK-7xf83$EOSj+e9J zvXjQ^*DI)Fml#SrXp6$eGsb4R1fAuqYu5yR7?dksXOUvr4sD9osEU_ep}&~u`&;|5 z_B8EZ+D}J=&SyH?=sc!#n9dS9`{;jqGE9M~Fb$@|3^)pOUeY;9=OdkqbRN<|ANjpHp~Nc`~p}Ai$LcTolkTw(RoDY0ewg4yL1_-3Htxi|A!i(fn>;|Gx_PH zXTX`T2F`-B;T+I;?OZqy&W8)28rDJ$Xv?jGb#Nin!+N*~E`|nZgbmOH8{raYh74?i z&9DWw!lkecE(85vUIACaRnP+4!GTuDg4Uh(k~Yw8uJ!G~)u2tc07dX2fD&8-We7p5 zwG*xdZ9Ceow3l56*TXKj0d9nw;AXf5ZiU<6cDMuXgu7rj+zt1@y>K7g4-deD@DMx< zkHDkw7(5P7z>}~Co`R?08F&_+gXiG|coANLm*Ew76<&ka;SJaeZ$dY`1#iPUun*pa z{qP>V4n0AU1egeuU@}Yr)&B>vZ`3#d literal 0 HcmV?d00001 diff --git a/gamma_age_v2/mordmagman02.gic b/gamma_age_v2/mordmagman02.gic new file mode 100644 index 0000000000000000000000000000000000000000..42a6c2d13f0874bdfb16325d7a76fc589b04f7fa GIT binary patch literal 440 zcmaJ-yQ%^)6g<8k2wGTJSZrZoWucAzDwhiuf)}k<4Z5&yB*wzO@U#3Yoxu~ax(9}t z^GY)L`HiFXWHg?NND){9P2iz?EQpk$Gw=X>2M@td1V|b{9pEln(gs3Mv&Ma%$r%Rg zC7`96{f_DixU0Gf?y0VU`>J_gq?-5hU9mHXzd92w(u+qvv(^QTRAPHNnVg+>%=4YS z=H7%MT?=hlp}YSouDo^TEB|xp;b7dSvPo`do8~?gmRYhh$u|2uNKfW}&^tZTD?QR1 MJ<$t;GsJ)K0>0rgumAu6 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/mordmagman02.git b/gamma_age_v2/mordmagman02.git new file mode 100644 index 0000000000000000000000000000000000000000..cd6de7871eb5a56138f222df389b0e2c70513dfc GIT binary patch literal 2862 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 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/mordmagman03.gic b/gamma_age_v2/mordmagman03.gic new file mode 100644 index 0000000000000000000000000000000000000000..42a6c2d13f0874bdfb16325d7a76fc589b04f7fa GIT binary patch literal 440 zcmaJ-yQ%^)6g<8k2wGTJSZrZoWucAzDwhiuf)}k<4Z5&yB*wzO@U#3Yoxu~ax(9}t z^GY)L`HiFXWHg?NND){9P2iz?EQpk$Gw=X>2M@td1V|b{9pEln(gs3Mv&Ma%$r%Rg zC7`96{f_DixU0Gf?y0VU`>J_gq?-5hU9mHXzd92w(u+qvv(^QTRAPHNnVg+>%=4YS z=H7%MT?=hlp}YSouDo^TEB|xp;b7dSvPo`do8~?gmRYhh$u|2uNKfW}&^tZTD?QR1 MJ<$t;GsJ)K0>0rgumAu6 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/mordmagman03.git b/gamma_age_v2/mordmagman03.git new file mode 100644 index 0000000000000000000000000000000000000000..7ba27bbc9bfc0c5865f6465004bf2d9319c23eae GIT binary patch literal 2862 zcmai0Npl-T6mCO8Fd<<{Si-7oWW@=#Spoq((#W=mWT~XV0g5VBTk6*%Vpm< zzyY{$WnX>(M>xZ8qPW8M_4G(%ih{2C=6$c1*KgkInb&KLsIs}Vu=t7);xJ%=4zPSk zh$iG8_X_bl(36REa8f;Q6bNKLR`pd?)6Wl0N+e{M%V# zY&qvO;AepCCcu8C=5?TGZ-DT;(cYWDub!_!{swR?0E8F^UQ9u_nI-FphyyvSZS*GB#Ej^wCzVwC(9(DEB!& z)i>hp9b3{dzL_TFaSOe!cZ10=PO;Rr)+CDuRcURaW_oUVrst+-dZ-e&IeIpwiR6}F z41Gh6azk#m5YhhlfW9e{Nx7qj_p=kDD$O{vSQDnHDL73;a@$+VMKc{7*dkQfz{F!4 zr`k=3)M%VYtGX)dsym3!#HL*}N_W*Q#dy_{G*dA0L6~Q-mg-$)GFcdCXse8wjIDpE zRXHezoc&Ic(#>gu)vo$*5*syieKcK;2X#N>#@l11OWTW1YOIm5ZRE>EWaKzhRt>xZ zGd*|M>2W5_DBmS?+`kNV;P`4X3mWydR=pkXHuZ8&;QxVm209+OVDv1ai1>}iN*bvL zK56SLIHgvb7=!aT?OvB=s8xoOnzvQFU%@F|Qc4}S<0L7mqODzqd^7~~P>$sGG=$J` zV0NZUpt}eZ9c{f1f9)0~xvsX0b}>qOEtM!0SSwv(+L{?DkN3tZNoq2)0WGw(i*7{+i7gU?|epGMPJMC^1M2+@Fzp>E|y7hoR zyjE(4Sxf4yz8Bl;OZ3ZQ@8-I%3K0216P2n04x3ia1CI!VMS*pUjmi^R%}*kR%lk{8vrXYD=Mqx3J?IS ihWv-}7}o(-yER}PxCyY*vceWI0d<_QVISl3U+r(z?0*pe literal 0 HcmV?d00001 diff --git a/gamma_age_v2/mordmagman04.are b/gamma_age_v2/mordmagman04.are new file mode 100644 index 0000000000000000000000000000000000000000..be1a13544ad431433223876bca41ab0a58a347dd GIT binary patch literal 4688 zcmcha*LxII7>9@6Aru?Up$VcOO-02Ll3=03Wc@p&7=biIAGv|EYoVs(WTk7oAl}lHwwk&Hh3?E`y zzmo18YgwyE4@|JE`P}3L)#Qg%hVgX zWa!<7K4|Da4P7<#ke}6t-fHMwhTd=J-wkci9=*>9kf}}5go^ZVQi@xnK;TCg(83`RQ2~q*X_zGV--%&6-Fn#@@Yqxmp%O5S3LKhM~t4 zL#F#xk&3m(F*SxOGL@N{XeHAOeGFRfCOZ}sTXr0*0loY2z>HX{>j}CfHa$tzmKlbg zY3Nyoo}Fm*>xr-^$=gY)WKN>xb1vxJrPbfk>ZkcIotKtg05cMO5_)E$7ouk+T5)Eh z)n_L|>T@x=0`h+fP$bf)lBTvK6{Jf+;~_gOPNM5FLoY|mk8A~`dS#*&tG{v6{yIEv zIu{i;)kiZfZX^4@veQ=g>FxNUC>!w47z-+6+I^(J&XMXekSkag6(nC zOjj>=7J1X1@}|2a-{Ves)1B22uJ=0giX2;`a-QFr$>v@4R9v{Za zbq4v&w(hmTj-)b4t2}MlVVp9a0V8fK(=vzq-nztZE~QhtYL z)Nl6dU8h`WXI4dCn*B|oTds9GJm1Z6XQNkeL-$Yx<&&uqm5=i2WK7DpHJ3I1PK9X{ zJvUw|$~VzHQ5P(a{I~VwSH$^DIh#E0o##U_s$cDU#l|2gu{rk2AO3u0{QcY%lyk1X zji9a{HaVTX*WqP(!KQeoQ!6^kq@SR3$(vOchPF`&9j%Y?MZ6ZB&Z6TlTeV*;&wHWm zusm&2rhCqA@3t#>*Zy~3_L8vV779!4hKe2LgRVl(4*Wv5-R{~>HtU9=*IsbtE_A${ z9haRjR=-|B9lOL(+CfJYHl8sy(%Wl)AXpN|N*=72RiN3$J zA8Sw3{-ynNBL$b#0L_L2_JZm#w1!PTHmw*W=(A%GHG17!$7 ztF;TR1#LUpuC$k32iL<+xB+g2o8V@+1#X4g;C8qJ?u5Hw7u*f^z`bxE+z$`HgYXbM z43EI0@EAM}Pr#F~8=iuv;Td=qo`dJ%1$Yr&f|ubHcoklQ*WnG=18>4!cnjW!cVHj9 z3;W?ccppB158)&D7(Rhd;WPLgzJLSpC42>6!$J54zJ>4Ld-wr2M@td1V|b{9pEln(gs3Mv&Ma%$r%Rg zC7`96{f_DixU0Gf?y0VU`>J_gq?-5hU9mHXzd92w(u+qvv(^QTRAPHNnVg+>%=4YS z=H7%MT?=hlp}YSouDo^TEB|xp;b7dSvPo`do8~?gmRYhh$u|2uNKfW}&^tZTD?QR1 MJ<$t;GsJ)K0>0rgumAu6 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/mordmagman04.git b/gamma_age_v2/mordmagman04.git new file mode 100644 index 0000000000000000000000000000000000000000..caa3dd43ad8ff5ae61116940fbd48e61a3163cb3 GIT binary patch literal 2862 zcmai0Npl-T6mCO8Fd<<{Si-7oWW@=#Spoq((#W=mWT~XV0g5VBTk6*%Vpm< zzyY{$WnX>(M>xZ8qPW8M_4G(%ih{2C=6$c1*KgkInb&KLsIs}Vu=t7);xJ%=4zPSk zh$iG8_X_bl(36REa8f;Q6bNKLR`pd?)6Wl0N+e{M%V# zY&qvO;AepCCcu8C=5?TGZ-DT;(cYWDub!_!{swR?0E8F^UQ9u_nI-FphyyvSZS*GB#Ej^wCzVwC(9(DEB!& z)i>hp9b3{dzL_TFaSOe!cZ10=PO;Rr)+CDuRcURaW_oUVrst+-dZ-e&IeIpwiR6}F z41Gh6azk#m5YhhlfW9e{Nx7qj_p=kDD$O{vSQDnHDL73;a@$+VMKc{7*dkQfz{F!4 zr`k=3)M%VYtGX)dsym3!#HL*}N_W*Q#dy_{G*dA0L6~Q-mg-$)GFcdCXse8wjIDpE zRXHezoc&Ic(#>gu)vo$*5*syieKcK;2X#N>#@l11OWTW1YOIm5ZRE>EWaKzhRt>xZ zGd*|M>2W5_DBmS?+`kNV;P`4X3mWydR=pkXHuZ8&;QxVm209+OVDv1ai1>}iN*bvL zK56SLIHgvb7=!aT?OvB=s8xoOnzvQFU%@F|Qc4}S<0L7mqODzqd^7~~P>$sGG=$J` zV0NZUpt}eZ9c{f1f9)0~xvsX0b}>qOEtM!0SSwv(+L{?DkN3tZNoq2)0WGw(i*7{+i7gU?|epGMPJMC^1M2+@Fzp>E|y7hoR zyjE(4Sxf4yz8Bl;%lwD(-ZSStW4-4nzVixa{NMP|Q9fB=t~YUPZ?Qkb@1;LHaDw3ZQ@8-I%3K0216P2n04x3ia1CI!VMS*pUjmi^R%}*kR%lk{8vrXYD=Mqx3J?IS ihWv-}7}o(-yER}PxCyY*vceWI0d<_QVISl3U+r(#?|%{i literal 0 HcmV?d00001 diff --git a/gamma_age_v2/mordmagman05.are b/gamma_age_v2/mordmagman05.are new file mode 100644 index 0000000000000000000000000000000000000000..775016c60f87a95d8f6dd35d30cf2953d4c02c2b GIT binary patch literal 4688 zcmcha*LxII7>9@6Aru?Up$VcOMHCfFNP>wb1hWvt7ACus?8xrSy0a0Y*c}g=1I_RpLfph%$)OmbL!5iZmF|dS1w(#+On+4Fnow* z{YtuXtYw`}dSHTO&F9`96D@1eFv}V}#j@(T|2IZrEe0N2dw?pD{>{*T8QP{`TBhF6 zB}4Bv^g%=aY3QnAbY`0+^BLlh890y%0Ss(TX!0 ztv)*$QlE>_6_Ec^fFhATl{B>_sUTen8V}iNaS~mZ8G1Qdeq<{k)hiRNSpAKg_SfNY z)48a)sXm%J_A|5`;sx$z9Bo(_?rD} zwl}U}Sp$h{wzofV(^!LDM}rw(jf+g}O?7|wD|7w!XMc_YaT)CTy&NCu`t2)jU-K$$ z<6zsXwj60*>Avj0+MoMczvg_7-(cYV+)$f(h|`*~>r{erTYA6MEr(v<_Y~UbboOY8 z^-j?>Z?w2!i>r^X#AO+hYG3Mw^uH@i)B z$g801CwH2Hz^^X0d-$vg3PD-w?beV$kJlt>`)V=vnM9@H2TQ7i^EC zX1aR0v&ft7lsDZa`5t%5o9?WJaJ|==SLE0lmGk`0Og8VTr{coRB`51ux+$V}D|n^a zs58iCwso%!b|jTaYMt)LVNG|oppLG|JAT$}alB+m;(W#rw#Rkid=%9uthL$ma~p!~ zZaHz;7&y61w(PooJi;3aPPbcb4dayY3>d*fuTTA4C7;w)Qt$R^p4IHv`IR2;mhwA1 zqkgkr?>gm5JF_bC((G>v-Eytl;rVWkI~%=%8@h)oD4$G?sC<-9Cu35+t+}l6cPdPy z=(+JyQND@piMn8UrxhQT=M)D>eo}iOsQB{_y83ewZQ(hfSJuMQcRG%P!MjO!WP& z{aAaN_Al+HBSGggoo#d;(>Y9M37viPKRpp9K^07fDKHhLfzC@hC+U2obCJ$NItS_e zqjQhWJNjSH`NoDhppKsh^I-w#oTBrI&LujJ=sckB2z{3>0X0GYU;6)0BQ%fr6LOnFVMQ|}RLKCcqX4n9iKnrAG zBW!|J*bJA#7Pt)be|ZI530FZIYy}6}Aq!e}+Dke>ySdi42UmkO-2xQBhX6`&4U{1S zt=2BM7PReXyV72E9b6AP;Rd)7Zi1WP7Pu8|gWKT_xD)PzU2r$t1NXvxa6dc%55hz6 zFgyZ}!ej6_JONL_Zg>iwhG*becn+S27vM#B30{U*;8l1HUWYee54;I`;VpO@-hqAa zF6@W*;C=W2K7^0pWB3F2M@td1V|b{9pEln(gs3Mv&Ma%$r%Rg zC7`96{f_DixU0Gf?y0VU`>J_gq?-5hU9mHXzd92w(u+qvv(^QTRAPHNnVg+>%=4YS z=H7%MT?=hlp}YSouDo^TEB|xp;b7dSvPo`do8~?gmRYhh$u|2uNKfW}&^tZTD?QR1 MJ<$t;GsJ)K0>0rgumAu6 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/mordmagman05.git b/gamma_age_v2/mordmagman05.git new file mode 100644 index 0000000000000000000000000000000000000000..0cf5bfe86ce31937a9ff0b96ee059850dc42ec80 GIT binary patch literal 2862 zcmai0Npl-T6mCO8Fd<<{Si-7oWW@=#0|Wx`NF&=KlBJRc2PmpkZK-2VG3pULEmwTw z00-d0m3{dE9N`SViQ)?1*V7}7DGIvkoA7P) zA)1hX+%LrMkiX0eu`(ybpAQJZxqqQSh{M1TxC~&5Yg~UXfTiMn;AMbq8SB}9)M-LM zb$e1)J-?^KIk)2b;m(xPPd3W?fD4`b8*M)b6#g6m z=iZ!8Uulb+;5@E<7&z|L9VEpOZWXGgqWo)c6=%cMzY1`AoQ0{Sj zs&B;GJGP`_d^1hT;}&{d?*@}$oMNeKtw|OSs?yp-&Gg*#OwUcv^iU;kbM$OV6Ui;V z82W}B<%ZmBA)>wUK7CUrlX6E5?`J1QRhn^Tu_jDYQ*fGy4xOa$2l_o+%TmJF#{?He-!^N7L`C(3ukkrJ2fMZ(x+tjgU6hlvXAlOjE-5 zk7wqw->Qt0C@s8Xy(_nO%L@2=|In+5MyzMwP+bqw3D3Cy$oywFUDdG0(MjY$@o0McCt(SZ(+=y!r5E!y656GRJ`90Bmk8vGfwOa$$fg1oTEh}sh6Hvz)8}>0i|JD8m+46rA literal 0 HcmV?d00001 diff --git a/gamma_age_v2/mordmagman06.are b/gamma_age_v2/mordmagman06.are new file mode 100644 index 0000000000000000000000000000000000000000..0d7bcbfb6e3656b0de6b25a9f98bac99e6291d3e GIT binary patch literal 4688 zcmcha*LxII7>9@6Aru?Up$VcOMG+NCNP>wb1hWvt7ACus?8xrSy0a0Y*c}g=1I_RpLfph%$)OmbL!5iZmF|dS1w(#+On+4Fnow* z{YtuXtYw`}dSHTO&F9`96D@1eFv}V}#j@(T|2IZrEe0N2dw?pD{>{*T8QP{`TBhF6 zB}4Bv^g%=aY3QnAbY`0+^BLlh890y%0Ss(TX!0 ztv)*$QlE>_6_Ec^fFhATl{B>_sUTen8V}iNaS~mZ8G1Qdeq<{k)hiRNSpAKg_SfNY z)48a)sXm%J_A|5`;sx$z9Bo(_?rD} zwl}U}Sp$h{wzofV(^!LDM}rw(jf+g}O?7|wD|7w!XMc_YaT)CTy&NCu`t2)jU-K$$ z<6zsXwj60*>Avj0+MoMczvg_7-(cYV+)$f(h|`*~>r{erTYA6MEr(v<_Y~UbboOY8 z^-j?>Z?w2!i>r^X#AO+hYG3Mw^uH@i)B z$g801CwH2Hz^^X0d-$vg3PD-w?beV$kJlt>`)V=vnM9@H2TQ7i^EC zX1aR0v&ft7lsDZa`5t%5o9?WJaJ|==SLE0lmGk`0Og8VTr{coRB`51ux+$V}D|n^a zs58iCwso%!b|jTaYMt)LVNG|oppLG|JAT$}alB+m;(W#rw#Rkid=%9uthL$ma~p!~ zZaHz;7&y61w(PooJi;3aPPbcb4dayY3>d*fuTTA4C7;w)Qt$R^p4IHv`IR2;mhwA1 zqkgkr?>gm5JF_bC((G>v-Eytl;rVWkI~%=%8@h)oD4$G?sC<-9Cu35+t+}l6cPdPy z=(+JyQND@piMn8UrxhQT=M)D>eo}iOsQB{_y83ewZQ(hfSJuMQcRG%P!MjO!WP& z{aAaN_Al+HBSGggoo#d;(>Y9M37viPKRpp9K^07fDKHhLfzC@hC+U2obCJ$NItS_e zqjQhWJNjSH`NoDhppKsh^I-w#oTBrI&LujJ=sckB2z{3>0X0GYU;6)0BQ%fr6LOnFVMQ|}RLKCcqX4n9iKnrAG zBW!|J*bJA#7Pt)be|ZI530FZIYy}6}Aq!e}+Dke>ySdi42UmkO-2xQBhX6`&4U{1S zt=2BM7PReXyV72E9b6AP;Rd)7Zi1WP7Pu8|gWKT_xD)PzU2r$t1NXvxa6dc%55hz6 zFgyZ}!ej6_JONL_Zg>iwhG*becn+S27vM#B30{U*;8l1HUWYee54;I`;VpO@-hqAa zF6@W*;C=W2K7^0pWB3F2M@td1V|b{9pEln(gs3Mv&Ma%$r%Rg zC7`96{f_DixU0Gf?y0VU`>J_gq?-5hU9mHXzd92w(u+qvv(^QTRAPHNnVg+>%=4YS z=H7%MT?=hlp}YSouDo^TEB|xp;b7dSvPo`do8~?gmRYhh$u|2uNKfW}&^tZTD?QR1 MJ<$t;GsJ)K0>0rgumAu6 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/mordmagman06.git b/gamma_age_v2/mordmagman06.git new file mode 100644 index 0000000000000000000000000000000000000000..475e0602bff239c944bc56f204f86c0092bdb914 GIT binary patch literal 2862 zcmai0Npl-T6mCO8Fd<<{Si-7oWW@=#2?PT1NF&=KlBJRc2PmpkZK-2VG3pULEmwTw z00-d0m3{dE9N`SViQ)?1*V7}7DGIvkoA7P) zA)1hX+%LrMkiX0eu`(ybpAQJZxqqQSh{M1TxC~&5Yg~UXfTiMn;2OZTjP>k4>NFvs zx;-hYp5IgAoLlkzaA(TtCmZE`zy;3_K`wgEy$epizUa@1halm;Yn1ezjkX^I3V)7( zb8pV4ue3!@a30q_44n1)Ban;<#~uaV0ciUea2H@Zo(uPU%yZ6p9QfGlPe9TK`tu~f zSg@VQg?m0#;!l_OGbR44=Uo3Bu;2|n4^I1R75B^^Cn1XdQ>FgXC4QzfhwshCIJ^LS zLIv$yE}Z}8J!c%5AI>Ge=sASA1TcqeJU<10(e>ny1|L9VEpOZWXGgqWo)c6=%cMzY1`AoQ0{Sj zs&B;GJGP`_d^1hT;}&{d?*@}$oMNeKtw|OSs?yp-&Gg*#OwUcv^iU;kbM$OV6Ui;V z82W}B<%ZmBA)>wUK7CUrlX6E5?`J1QRhn^Tu_jDYQ*fGy4xOa$2l_o+%TmJF#{?He-!^N7L`C(3ukkrJ2fMZ(x+tjgU6hlvXAlOjE-5 zk7wqw->Qt0C@s8Xy(_nO%L@2=|In+5MyzMwP+bqw3D3Cy$oywFUDdG0(MjY$@o0McCt(SZ(+=y!r5E!y656GRJ`90Bmk8vGfwOa$$fg1oTEh}sh6Hvz)8}>0i|JD8m+x34G literal 0 HcmV?d00001 diff --git a/gamma_age_v2/movechair.utp b/gamma_age_v2/movechair.utp new file mode 100644 index 0000000000000000000000000000000000000000..ef36a2b2d5b1c92c0551ad1af315bdf42c1037ef GIT binary patch literal 2227 zcmZWqOLH7G5FSE85`#k^;SrunNHC9h4N0h?s7e*iu3g?DVYloJa7)Rv?VTxWG>b+X zv%iHiR}O^tGgnSrxbsus`?Q+zB=q`IcT1Y?p4M33?a@$uaswgMVot& zF8M0@NEu>rFViwE<>W$zv7MXG*TUSjuoenyIR%`f0eKRrW1bE(i{Yu({L`)ZGcEgU zYtJ)rp0zv+d>#GgqGtWi1NQ*-;2gl*v|oreRPrKF_u?hkbxkjGG0H1Z^IcyBz5!?} zfbnUc2fmH=1?cah{TlT5(Y^@%L$ohJ{}}Dpp?`|@3iQv>egpcKXuk>lYqZ~j{w>;X zL;ns?E-zFVS6gTV6TdHl@OOo}OFSn&A@5)Cq$BwQkD?yO`UN`LTmiDf=O4kAU z){Aqqsn@%PSvGZAFNOU>Q~F@U0a3T*^I7g>9A+3gKHB(kDfok_*jD;vSUT@??)!_! zlabTYo_I-P0f+vg;Na(#cEut~FWB*Akb&!)=CEn>2Ud2nST_C9eA+Y+^*_+hb(_!5=rwcu4S_ogX&zeWzhYr*e1G|NK{Vq0zsX^#=y~=pE#E7hWuhV@*9ax@7dwpjr z#&mV%*BN18L&sb`nF!B#U~gN4Gp?V2Uy19G=62H_Gw+ z#^LcKY;&I0(QtmPv*9eFw?8N3M>xE)pSfKo4EdXGCCN}5@m~797_wUy1+q5@c(?Mu zA<&+lj7PdT3LFDSv!qwjDvz93 zDz9GBCh3wVO^PA~kq$|NXMnQ+>5eo3}rA>;D??AC7}?=l}o! literal 0 HcmV?d00001 diff --git a/gamma_age_v2/movestool.utp b/gamma_age_v2/movestool.utp new file mode 100644 index 0000000000000000000000000000000000000000..6f84c47d1f08e13fe4a3195a5b981cbddbf63ca0 GIT binary patch literal 2229 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 c#c%i>JMaho#9uI4{qKJd=c&Q(; Special > Custom 4 + name: Database + special database item with the resref "nbde_database" + don't touch this item... + +----------------------------------------------------------------------------- +--- Eliminated Restrictions ? +----------------------------------------------------------------------------- + +Biowares database system mimics the interface of Local Variables. +Instead of SetLocalInt() you use SetCampaignInt(), GetLocalInt() turns into +GetCampaignInt(). This makes it very easy to use, even for novice scripters. +But the normal bioware database does not consequently implement this approach. +Several stumbling blocks, slight differences to normal Set-/GetLocal functions, +may lead to severe functional problems and hard to track bugs if you try to +achieve a bit more complex goals... + +>>> 32-Char sVarName Limitation: +-------------------------------- + +the sVarName parameter in the original functions only accepts strings with a +maximum length of 32 chars. it will simply cut the string if it exceeds this +limit... + +example: + +SetCampaignInt("MYDB", "PREFIX" + GetTag(oArea), 100); + +The second parameter is the sVarName one, with the 32 char limit. The above +statement is a bit risky, because GetTag(oArea) could return a string with a +maximum length of 32. "PREFIX" has a length of 6 chars, so any area with a +tag of length >26 could lead to unintended sVarNames. + +Same for this example: + +SetCampaignInt("MYDB", GetName(oPC) + GetPCPlayerName(oPC), 100); + +same problem. GetName() alone may return a string with a length >32, which +could again lead to a problematic sVarName. + +NBDE completely eliminates the 32-char sVarName limitation and enables the +scripter to use the full scope of dynamically concatenated sVarNames, +without the need of hashing systems or other workarounds, which generally +consume a bit of extra cpu time... + +>>> UNIQUE sVarName Limitation: +------------------------------- + +the sVarName parameter in the original functions MUST be unique across the +entire database, regardless of the variable type. + +example: + +SetCampaignInt("MYDB", "TEST", 10); +SetCampaignString("MYDB", "TEST", "ABCD"); + +the second line will OVERWRITE the former integer variable "TEST" with a string. +This means a GetCampaignInt("MYDB", "TEST") returns 0 + +using NBDE eliminates this limitation. +It works now similar to LocalVariables (the intended goal) + +NBDE conversion of the above example: + +NBDE_SetCampaignInt("MYDB", "TEST", 10); +NBDE_SetCampaignString("MYDB", "TEST", "ABCD"); + +second line will not overwrite the integer variable + +NBDE_GetCampaignInt("MYDB", "TEST") returns the correct 10 +NBDE_GetCampaignString("MYDB", "TEST") returns "ABCD" + +The original function set contains only one delete command, called +DeleteCampaignVariable(), because of the unique nature of sVarNames. + +NBDE contains one delete command for each variable type, to account for the +possible non uniqueness: + +NBDE_DeleteCampaignInt() +NBDE_DeleteCampaignFloat() +NBDE_DeleteCampaignString() +NBDE_DeleteCampaignVector() +NBDE_DeleteCampaignLocation() + +this again now works similar to the LocalVariables interface, which also +gives you a delete command for each variable type: + +aka DeleteLoaclInt(), DeleteLocalFloat(), DeleteLocalString(), + DeleteLocalVector(), DeleteLocalLocation() + +>>> Broken Locations: +--------------------- + +the original SetCampaignLocation/GetCampaignLocation functions are not very +reliable, because they are using the areas object-id for reference, which +is a runtime generated ID. stored locations in the database can get invalid +if you change the area layout in the toolset (e.g. deleting old areas, etc.) + +nbde location functions are 100% reliable, as long as you use unique TAGs for +your areas. I repeat, you need to use UNIQUE TAGS for your areas... + +----------------------------------------------------------------------------- +--- No need to pack the database +----------------------------------------------------------------------------- + +NWN's database files grow very large, very fast, because deleted entries get +only "flagged" as deleted. but they still reside in the dabase file physically. + +to stop this evergrowing database, you usually call an external "pack" +utility which reorganizes the database files (deletion of flagged entries, +index re-ordering, etc.) + +unfortunately, the only working pack utility is the one you find in the +/utils directory, called DataPack.exe . But some people reported problems +on large database files... (i never had problems with this tool, though) + +the good news is, you don't need to touch this utility ever, while using +this extension. NBDE will automatically keep all your database files as +compact/small as possible. + +no external maintenance needed... + +NBDE_Delete commands immediately shrink your database in size (physically +deleted records) after a flushing command (read more about that in a minute). + +attention: +there is a known problem in the linux version: + +The DestroyCampaignDatabase command doesnt always work in linux. i think +this relates to the different file systems used. + +you should be ok using the following rules for your database +names (sCampaignName parameter): + + - max length 16 chars + - only use alphanumeric chars and underscore + - NO space + + +----------------------------------------------------------------------------- +--- Usage +----------------------------------------------------------------------------- + +first, include nbde_inc to all scripts using this extension: + +#include "nbde_inc" + +You basically use it the same way you would use the original +database. just add the NBDE_ prefix infront of the function. + +original example: + +int n = GetCampaignInt("MYDB", "MYVAR"); + +nbde conversion: + +#include "nbde_inc" + +int n = NBDE_GetCampaignInt("MYDB", "MYVAR"); + +Important differences: + +Database Flushing: +------------------ + +writing to the database will not issue a physical write directly. +You need to "Flush" a database in order to physically write the contents of +a complete database to your HD. this sounds slow, but its not, because of +the large overhead of standard SetCampaign calls... +Writing out a single integer via SetCampaignInt takes roughly +100ms (0.1 seconds), writing out an object with 1000 integers via +SetCampaignObject takes roughly 150ms. that's the whole +magic behind the system. it basically just consolidates your writes.. + +original example: + +SetCampaignInt("MYDB", "MYVAR1", 10); +SetCampaignInt("MYDB", "MYVAR2", 20); +SetCampaignInt("MYDB", "MYVAR3", 30); +SetCampaignInt("MYDB", "MYVAR4", 40); +SetCampaignInt("MYDB", "MYVAR5", 50); + +nbde conversion: + +NBDE_SetCampaignInt("MYDB", "MYVAR1", 10); +NBDE_SetCampaignInt("MYDB", "MYVAR2", 20); +NBDE_SetCampaignInt("MYDB", "MYVAR3", 30); +NBDE_SetCampaignInt("MYDB", "MYVAR4", 40); +NBDE_SetCampaignInt("MYDB", "MYVAR5", 50); +NBDE_FlushCampaignDatabase("MYDB"); + +the original example takes roughly half a second (500ms), +the converted example only 100ms. + +you can gain a lot of speed and do things impossible with the original +database using the right flushing scheme. you can flush critical data asap +but you can get away flushing not so critical stuff only once every few +minutes, or during onClientLeave, or once an Area is out of players, and so on... + +keep in mind: you can loose data if the server crashes before +you flushed your database. + +delete function: +---------------- + +the original version only got one delete function, DeleteCampaignVariable. +That's because of the unique nature of sVarNames... +NBDE eliminates this restriction and therefore exposes one delete +function for each data-type. + +original example: + +DeleteCampaignVariable("MYDB", "MYVAR"); + +you need to know the datatype of "MYVAR" in order to correctly convert this +line to NBDE. lets assume it's an integer... + +nbde conversion: + +NBDE_DeleteCampaignInt("MYDB", "MYVAR"); + + +Unloading a Database: +--------------------- + +nbde databases are kept in memory. NBDE_UnloadCampaignDatabase() unloads +the database with the name sCampaignName from memory. + +useful to unload databases you don't need often. unloading/reloading is quite +fast, so don't hesitate to use this regulary... + + +*/ + +// database item name, used as sVarName parameter in Store-/RetrieveCampaignObject +const string NBDE_DATABASE_ITEM_VARNAME = "+++_DATABASE_ITEM_+++"; + +// database item resref, needed for auto-creation +const string NBDE_DATABASE_ITEM_RESREF = "nbde_database"; + +// database index prefix +// used to index a database via Get/SetLocalObject +const string NBDE_INDEX_PREFIX = "NBDE_DATABASE_"; + +// database vault tag +// this vault is usually a container +const string NBDE_VAULT_TAG = "NBDE_VAULT"; + +// prefixes used to store locations/vectors as strings +// this should eliminate collisions with normal strings +const string NBDE_LOC_PREFIX = "¥Æ¥"; +const string NBDE_VEC_PREFIX = "ø£ø"; + +// This stores an int out to the specified campaign database +// The database name IS case sensitive and it must be the same for both set and get functions. +// If you want a variable to pertain to a specific player in the game, provide a player object. +// +// Improvements to original bioware function: +// Vastly improved writing speed... +// There is no limit on the length of sVarname (original function is limited to 32 chars) +// sVarname must NOT be unique. you can use the same sVarname with a different data-type +void NBDE_SetCampaignInt(string sCampaignName, string sVarname, int nInt, object oPlayer = OBJECT_INVALID); + +// This stores a float out to the specified campaign database +// The database name IS case sensitive and it must be the same for both set and get functions. +// If you want a variable to pertain to a specific player in the game, provide a player object. +// +// Improvements to original bioware function: +// Vastly improved writing speed... +// There is no limit on the length of sVarname (original function is limited to 32 chars) +// sVarname must NOT be unique. you can use the same sVarname with a different data-type +void NBDE_SetCampaignFloat(string sCampaignName, string sVarname, float flFloat, object oPlayer = OBJECT_INVALID); + +// This stores a string out to the specified campaign database +// The database name IS case sensitive and it must be the same for both set and get functions. +// If you want a variable to pertain to a specific player in the game, provide a player object. +// +// Improvements to original bioware function: +// Vastly improved writing speed... +// There is no limit on the length of sVarname (original function is limited to 32 chars) +// sVarname must NOT be unique. you can use the same sVarname with a different data-type +void NBDE_SetCampaignString(string sCampaignName, string sVarname, string sString, object oPlayer = OBJECT_INVALID); + +// This stores a location out to the specified campaign database +// The database name IS case sensitive and it must be the same for both set and get functions. +// If you want a variable to pertain to a specific player in the game, provide a player object. +// +// Improvements to original bioware function: +// Vastly improved writing speed... +// There is no limit on the length of sVarname (original function is limited to 32 chars) +// sVarname must NOT be unique. you can use the same sVarname with a different data-type +// +// Original function is not very reliable, because it is using the areas object-id, which is +// a runtime generated ID. Stored locations may turn invalid in case you change the area layout in the toolset. +// (e.g. deleting old areas) +// +// This function is 100% reliable, as long as you use unique TAGs for your areas +void NBDE_SetCampaignLocation(string sCampaignName, string sVarname, location locLocation, object oPlayer = OBJECT_SELF); + +// This stores a vector out to the specified campaign database +// The database name IS case sensitive and it must be the same for both set and get functions. +// If you want a variable to pertain to a specific player in the game, provide a player object. +// +// Improvements to original bioware function: +// Vastly improved writing speed... +// There is no limit on the length of sVarname (original function is limited to 32 chars) +// sVarname must NOT be unique. you can use the same sVarname with a different data-type +void NBDE_SetCampaignVector(string sCampaignName, string sVarname, vector vVector, object oPlayer = OBJECT_SELF); + +// This will read an int from the specified campaign database +// The database name IS case sensitive and it must be the same for both set and get functions. +// If you want a variable to pertain to a specific player in the game, provide a player object. +// +// Improvements to original bioware function: +// Improved reading speed... +// There is no limit on the length of sVarname (original function is limited to 32 chars) +// sVarname must NOT be unique. you can use the same sVarname with a different data-type +int NBDE_GetCampaignInt(string sCampaignName, string sVarname, object oPlayer = OBJECT_INVALID); + +// This will read a float from the specified campaign database +// The database name IS case sensitive and it must be the same for both set and get functions. +// If you want a variable to pertain to a specific player in the game, provide a player object. +// +// Improvements to original bioware function: +// Improved reading speed... +// There is no limit on the length of sVarname (original function is limited to 32 chars) +// sVarname must NOT be unique. you can use the same sVarname with a different data-type +float NBDE_GetCampaignFloat(string sCampaignName, string sVarname, object oPlayer = OBJECT_INVALID); + +// This will read a string from the specified campaign database +// The database name IS case sensitive and it must be the same for both set and get functions. +// If you want a variable to pertain to a specific player in the game, provide a player object. +// +// Improvements to original bioware function: +// Improved reading speed... +// There is no limit on the length of sVarname (original function is limited to 32 chars) +// sVarname must NOT be unique. you can use the same sVarname with a different data-type +string NBDE_GetCampaignString(string sCampaignName, string sVarname, object oPlayer = OBJECT_INVALID); + +// This will read a location from the specified campaign database +// The database name IS case sensitive and it must be the same for both set and get functions. +// If you want a variable to pertain to a specific player in the game, provide a player object. +// +// Improvements to original bioware function: +// Improved reading speed... +// There is no limit on the length of sVarname (original function is limited to 32 chars) +// sVarname must NOT be unique. you can use the same sVarname with a different data-type +// +// Original function is not very reliable, because it is using the areas object-id, which is +// a runtime generated ID. Stored locations may turn invalid in case you change the area layout in the toolset. +// (e.g. deleting old areas) +// +// This function is 100% reliable, as long as you use unique TAGs for your areas +location NBDE_GetCampaignLocation(string sCampaignName, string sVarname, object oPlayer = OBJECT_INVALID); + +// This will read a vector from the specified campaign database +// The database name IS case sensitive and it must be the same for both set and get functions. +// If you want a variable to pertain to a specific player in the game, provide a player object. +// +// Improvements to original bioware function: +// Improved reading speed... +// There is no limit on the length of sVarname (original function is limited to 32 chars) +// sVarname must NOT be unique. you can use the same sVarname with a different data-type +vector NBDE_GetCampaignVector(string sCampaignName, string sVarname, object oPlayer = OBJECT_INVALID); + +// this will remove an integer from the specified campaign database +// +// Improvements to original bioware function: +// This will physically delete the variable from the database, not only flagging it +// Database will shrink in size +// No need to pack your database ever +void NBDE_DeleteCampaignInt(string sCampaignName, string sVarname, object oPlayer = OBJECT_INVALID); + +// this will remove a float from the specified campaign database +// +// Improvements to original bioware function: +// This will physically delete the variable from the database, not only flagging it +// Database will shrink in size +// No need to pack your database ever +void NBDE_DeleteCampaignFloat(string sCampaignName, string sVarname, object oPlayer = OBJECT_INVALID); + +// This will remove a string from the specified campaign database +// +// Improvements to original bioware function: +// This will physically delete the variable from the database, not only flagging it +// Database will shrink in size +// No need to pack your database ever +void NBDE_DeleteCampaignString(string sCampaignName, string sVarname, object oPlayer = OBJECT_INVALID); + +// This will remove a location from the specified campaign database +// +// Improvements to original bioware function: +// This will physically delete the variable from the database, not only flagging it +// Database will shrink in size +// No need to pack your database ever +void NBDE_DeleteCampaignLocation(string sCampaignName, string sVarname, object oPlayer = OBJECT_INVALID); + +// This will remove a vector from the specified campaign database +// +// Improvements to original bioware function: +// This will physically delete the variable from the database, not only flagging it +// Database will shrink in size +// No need to pack your database ever +void NBDE_DeleteCampaignVector(string sCampaignName, string sVarname, object oPlayer = OBJECT_INVALID); + +// This will flush a database to disk with a SINGLE StoreCampaignObject() call +// +// Don't use this function in a rapid manner. +// Delay each call to this function by at least 1 second (using delaycommand) +// in order to eliminate possible spikes... +void NBDE_FlushCampaignDatabase(string sCampaignName); + +// NBDE databases are kept in memory. this commands unloads +// the database with the name sCampaignName from memory. +// +// Useful to unload databases you don't need often. +// Unloading/reloading is quite fast, so don't hesitate to use +// this regulary... +// +// Reloading happens automatically, btw... +void NBDE_UnloadCampaignDatabase(string sCampaignName); + + +// --------------------------- IMPLEMENTATION ---------------------------- +/* ----------------------------------------------------------------------- */ + +// everything not in here gets considered an illegal character +// - mixed up for additional security +const string HASH_INDEX = "#i!j$k%l{&M/n(o)p=q?r^¤Xs`Tu'v]AwBxCyDzE1F2-G3t;4I}5Y:J6_K7+Z[Lm9N\ l0kOjPhQ,gRfSeHdU8cVbWa."; + +const int HASH_PRIME = 3021377; + +// simple hash +// returns -1 if string contains illegal character +int NBDE_Hash(string sData) +{ + int nLen = GetStringLength(sData); + int i, nHash, nChar; + for(i=0;i>27)) ^ nChar; + } + return nHash % HASH_PRIME; +} + +// serialize location to padded string +string NBDE_LocationToString(location lLoc) +{ + // serialization garbage... more or less "redo if it screws" code + string sLoc = IntToString(FloatToInt(GetPositionFromLocation(lLoc).x*100)); + sLoc = (GetStringLength(sLoc) < 5) ? sLoc + GetStringLeft(" ",5 - GetStringLength(sLoc)) : GetStringLeft(sLoc,5); + sLoc += IntToString(FloatToInt(GetPositionFromLocation(lLoc).y*100)); + sLoc = (GetStringLength(sLoc) < 10) ? sLoc + GetStringLeft(" ",10 - GetStringLength(sLoc)) : GetStringLeft(sLoc,10); + sLoc += IntToString(FloatToInt(GetPositionFromLocation(lLoc).z*100)); + sLoc = (GetStringLength(sLoc) < 15) ? sLoc + GetStringLeft(" ",15 - GetStringLength(sLoc)) : GetStringLeft(sLoc,15); + sLoc += IntToString(FloatToInt(GetFacingFromLocation(lLoc)*100)); + sLoc = (GetStringLength(sLoc) < 20) ? sLoc + GetStringLeft(" ",20 - GetStringLength(sLoc)) : GetStringLeft(sLoc,20); + sLoc += GetTag(GetAreaFromLocation(lLoc)); + sLoc = (GetStringLength(sLoc) < 52) ? sLoc + GetStringLeft(" ",52 - GetStringLength(sLoc)) : GetStringLeft(sLoc,52); + return sLoc; +} + +// de-serialize string to location +location NBDE_StringToLocation(string sLoc) +{ + // fast de-serialize code using padded strings + vector vVec; + // build vector + vVec.x = StringToFloat(GetStringLeft(sLoc,5)) / 100; + vVec.y = StringToFloat(GetSubString(sLoc,5,5)) / 100; + vVec.z = StringToFloat(GetSubString(sLoc,10,5)) / 100;; + int nPad = FindSubString(GetSubString(sLoc, 20,32)," "); + // build & return location + return Location(GetObjectByTag((nPad != -1) ? GetSubString(sLoc, 20,nPad) : GetSubString(sLoc, 20,32)), vVec, StringToFloat(GetSubString(sLoc,15,5)) / 100); +} + +// serialize vector to padded string +string NBDE_VectorToString(vector vVec) +{ + // serialization garbage... more or less "redo if it screws" code + string sVec = IntToString(FloatToInt(vVec.x*100)); + sVec = (GetStringLength(sVec) < 5) ? sVec + GetStringLeft(" ",5 - GetStringLength(sVec)) : GetStringLeft(sVec,5); + sVec += IntToString(FloatToInt(vVec.y*100)); + sVec = (GetStringLength(sVec) < 10) ? sVec + GetStringLeft(" ",10 - GetStringLength(sVec)) : GetStringLeft(sVec,10); + sVec += IntToString(FloatToInt(vVec.z*100)); + sVec = (GetStringLength(sVec) < 15) ? sVec + GetStringLeft(" ",15 - GetStringLength(sVec)) : GetStringLeft(sVec,15); + return sVec; +} + +vector NBDE_StringToVector(string sVec) +{ + // fast de-serialize code using padded strings + vector vVec; + vVec.x = StringToFloat(GetStringLeft(sVec,5)) / 100; + vVec.y = StringToFloat(GetSubString(sVec,5,5)) / 100; + vVec.z = StringToFloat(GetSubString(sVec,10,5)) / 100; + return vVec; +} + +// returns player key with hopefully safe delimiter +string NBDE_GetPlayerKey(object oPC) +{ + return GetName(oPC)+"¤"+GetPCPlayerName(oPC); +} + +// returns database object for the specified campaign database +// +// - auto-creates database object in case it doesn't exist +// - builds index for fast access +// +// you usually don't need to use this function directly... +object NBDE_GetCampaignDatabaseObject(string sCampaignName) +{ + // get database item + object oDatabase = GetLocalObject(GetObjectByTag(NBDE_VAULT_TAG), NBDE_INDEX_PREFIX + sCampaignName); + // retrieve/create database if not indexed already + if(!GetIsObjectValid(oDatabase)) + { + // get database vault object + // this container holds all database objects/items + object oVault = GetObjectByTag(NBDE_VAULT_TAG); + // check for valid vault + if(!GetIsObjectValid(oVault)) + { + WriteTimestampedLogEntry("NBDE> Error: unable to locate '"+NBDE_VAULT_TAG+"' vault container object"); + return OBJECT_INVALID; + } + // one time load + oDatabase = RetrieveCampaignObject(sCampaignName, NBDE_DATABASE_ITEM_VARNAME, GetLocation(oVault), oVault); + // not found ? create it + if(!GetIsObjectValid(oDatabase)) oDatabase = CreateItemOnObject(NBDE_DATABASE_ITEM_RESREF, oVault); + // check for valid database object + if(!GetIsObjectValid(oDatabase)) + { + WriteTimestampedLogEntry("NBDE> Error: unable to create '"+sCampaignName+"' database object"); + return OBJECT_INVALID; + } + // index item for fast access + SetLocalObject(oVault, NBDE_INDEX_PREFIX + sCampaignName, oDatabase); + } + return oDatabase; +} + +// this will flush (aka write to disk) the specified campaign database in one big swoop +// +// don't use this function in a rapid manner. +// delay each subsequent call to this function by at least 1 second (using delaycommand) +// this way you completely eliminate cpu-spikes, no matter how many database +// you flush. +void NBDE_FlushCampaignDatabase(string sCampaignName) +{ + // get database vault, it holds all database items + object oVault = GetObjectByTag(NBDE_VAULT_TAG); + if(GetIsObjectValid(oVault)) + { + // get database item + object oDatabase = GetLocalObject(oVault, NBDE_INDEX_PREFIX + sCampaignName); + // store the whole database via one single StoreCampaignObject call + // all variables on the item get stored with the item + if(GetIsObjectValid(oDatabase)) + { + // delete database on each flush to keep it compact and clean + DestroyCampaignDatabase(sCampaignName); + // store database + StoreCampaignObject(sCampaignName, NBDE_DATABASE_ITEM_VARNAME , oDatabase); + } + // database not loaded, no need to flush... + } + else // vault container missing + WriteTimestampedLogEntry("NBDE> Error: unable to locate '"+NBDE_VAULT_TAG+"' vault container object"); +} + +void NBDE_UnloadCampaignDatabase(string sCampaignName) +{ + // get database vault, it holds all database items + object oVault = GetObjectByTag(NBDE_VAULT_TAG); + if(GetIsObjectValid(oVault)) + { + // get database item + object oDatabase = GetLocalObject(oVault, NBDE_INDEX_PREFIX + sCampaignName); + if(GetIsObjectValid(oDatabase)) + { + // delete index + DeleteLocalObject(oVault, NBDE_INDEX_PREFIX + sCampaignName); + // delete database object + DestroyObject(oDatabase); + } + // database not loaded, do nothing + } + else // vault container missing + WriteTimestampedLogEntry("NBDE> Error: unable to locate '"+NBDE_VAULT_TAG+"' vault container object"); +} + +void NBDE_SetCampaignInt(string sCampaignName, string sVarname, int nInt, object oPlayer = OBJECT_INVALID) +{ + SetLocalInt(NBDE_GetCampaignDatabaseObject(sCampaignName) , + ((GetIsObjectValid(oPlayer)) ? NBDE_GetPlayerKey(oPlayer) : "") + sVarname, nInt ); +} + +void NBDE_SetCampaignFloat(string sCampaignName, string sVarname, float fFloat, object oPlayer = OBJECT_INVALID) +{ + SetLocalFloat(NBDE_GetCampaignDatabaseObject(sCampaignName) , + ((GetIsObjectValid(oPlayer)) ? NBDE_GetPlayerKey(oPlayer) : "") + sVarname, fFloat); +} + +void NBDE_SetCampaignString(string sCampaignName, string sVarname, string sString, object oPlayer = OBJECT_INVALID) +{ + SetLocalString(NBDE_GetCampaignDatabaseObject(sCampaignName) , + ((GetIsObjectValid(oPlayer)) ? NBDE_GetPlayerKey(oPlayer) : "") + sVarname, sString); +} + +void NBDE_SetCampaignLocation(string sCampaignName, string sVarname, location locLocation, object oPlayer = OBJECT_SELF) +{ + SetLocalString( NBDE_GetCampaignDatabaseObject(sCampaignName) , + NBDE_LOC_PREFIX + ((GetIsObjectValid(oPlayer)) ? NBDE_GetPlayerKey(oPlayer) : "") + sVarname , + NBDE_LocationToString(locLocation) ); +} + +void NBDE_SetCampaignVector(string sCampaignName, string sVarname, vector vVector, object oPlayer = OBJECT_SELF) +{ + SetLocalString(NBDE_GetCampaignDatabaseObject(sCampaignName) , + NBDE_VEC_PREFIX + ((GetIsObjectValid(oPlayer)) ? NBDE_GetPlayerKey(oPlayer) : "") + sVarname , + NBDE_VectorToString(vVector) ); +} + +int NBDE_GetCampaignInt(string sCampaignName, string sVarname, object oPlayer = OBJECT_INVALID) +{ + return GetLocalInt(NBDE_GetCampaignDatabaseObject(sCampaignName) , + ((GetIsObjectValid(oPlayer)) ? NBDE_GetPlayerKey(oPlayer) : "") + sVarname ); +} + +float NBDE_GetCampaignFloat(string sCampaignName, string sVarname, object oPlayer = OBJECT_INVALID) +{ + return GetLocalFloat(NBDE_GetCampaignDatabaseObject(sCampaignName) , + ((GetIsObjectValid(oPlayer)) ? NBDE_GetPlayerKey(oPlayer) : "") + sVarname ); +} + +string NBDE_GetCampaignString(string sCampaignName, string sVarname, object oPlayer = OBJECT_INVALID) +{ + return GetLocalString(NBDE_GetCampaignDatabaseObject(sCampaignName) , + ((GetIsObjectValid(oPlayer)) ? NBDE_GetPlayerKey(oPlayer) : "") + sVarname ); +} + +location NBDE_GetCampaignLocation(string sCampaignName, string sVarname, object oPlayer = OBJECT_INVALID) +{ + return NBDE_StringToLocation( GetLocalString(NBDE_GetCampaignDatabaseObject(sCampaignName) , + NBDE_LOC_PREFIX + ((GetIsObjectValid(oPlayer)) ? NBDE_GetPlayerKey(oPlayer) : "") + sVarname) ); +} + +vector NBDE_GetCampaignVector(string sCampaignName, string sVarname, object oPlayer = OBJECT_INVALID) +{ + return NBDE_StringToVector( GetLocalString(NBDE_GetCampaignDatabaseObject(sCampaignName), + NBDE_VEC_PREFIX + ((GetIsObjectValid(oPlayer)) ? NBDE_GetPlayerKey(oPlayer) : "") + sVarname) ); +} + +void NBDE_DeleteCampaignInt(string sCampaignName, string sVarname, object oPlayer = OBJECT_INVALID) +{ + DeleteLocalInt(NBDE_GetCampaignDatabaseObject(sCampaignName) , + ((GetIsObjectValid(oPlayer)) ? NBDE_GetPlayerKey(oPlayer) : "") + sVarname); +} + +void NBDE_DeleteCampaignFloat(string sCampaignName, string sVarname, object oPlayer = OBJECT_INVALID) +{ + DeleteLocalFloat(NBDE_GetCampaignDatabaseObject(sCampaignName) , + ((GetIsObjectValid(oPlayer)) ? NBDE_GetPlayerKey(oPlayer) : "") + sVarname); +} + +void NBDE_DeleteCampaignString(string sCampaignName, string sVarname, object oPlayer = OBJECT_INVALID) +{ + DeleteLocalString(NBDE_GetCampaignDatabaseObject(sCampaignName) , + ((GetIsObjectValid(oPlayer)) ? NBDE_GetPlayerKey(oPlayer) : "") + sVarname); +} + +void NBDE_DeleteCampaignLocation(string sCampaignName, string sVarname, object oPlayer = OBJECT_INVALID) +{ + DeleteLocalString(NBDE_GetCampaignDatabaseObject(sCampaignName) , + NBDE_LOC_PREFIX + ((GetIsObjectValid(oPlayer)) ? NBDE_GetPlayerKey(oPlayer) : "") + sVarname); +} + +void NBDE_DeleteCampaignVector(string sCampaignName, string sVarname, object oPlayer = OBJECT_INVALID) +{ + DeleteLocalString(NBDE_GetCampaignDatabaseObject(sCampaignName) , + NBDE_VEC_PREFIX + ((GetIsObjectValid(oPlayer)) ? NBDE_GetPlayerKey(oPlayer) : "") + sVarname); +} + + diff --git a/gamma_age_v2/nthlai.utc b/gamma_age_v2/nthlai.utc new file mode 100644 index 0000000000000000000000000000000000000000..1f37e9691662adc1103934ec0671ae6aa153518b GIT binary patch literal 11264 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 SF6_o3co-#k1dn159>d2Yv~0To literal 0 HcmV?d00001 diff --git a/gamma_age_v2/nw_c2_default4.ncs b/gamma_age_v2/nw_c2_default4.ncs new file mode 100644 index 0000000000000000000000000000000000000000..728a4924e67deaa488fd15d5a722a8129fbfcec4 GIT binary patch literal 60637 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 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/nw_c2_default4.nss b/gamma_age_v2/nw_c2_default4.nss new file mode 100644 index 00000000..a0d3d504 --- /dev/null +++ b/gamma_age_v2/nw_c2_default4.nss @@ -0,0 +1,109 @@ +//::////////////////////////////////////////////////// +//:: 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" + +void main() +{ + // * if petrified, jump out + if (GetHasEffect(EFFECT_TYPE_PETRIFY, OBJECT_SELF) == TRUE) + { + return; + } + + // * If dead, exit directly. + if (GetIsDead(OBJECT_SELF) == TRUE) + { + return; + } + + + // See if what we just 'heard' matches any of our + // predefined patterns + int nMatch = GetListenPatternNumber(); + object oShouter = GetLastSpeaker(); + + + // 2008.05.25 tsunami282 - removed for NWN 1.69 (no longer needed) + //DMFI CODE ADDITIONS BEGIN HERE + // if (GetIsPC(oShouter) || GetIsDM(oShouter) || GetIsDMPossessed(oShouter)) + // { + // ExecuteScript("dmfi_voice_exe", OBJECT_SELF); + // } + + if (nMatch == -1 && GetIsPC(oShouter) &&(GetLocalInt(GetModule(), "dmfi_AllMute") || GetLocalInt(OBJECT_SELF, "dmfi_Mute"))) + { + SendMessageToAllDMs(GetName(oShouter) + " is trying to speak to a muted NPC, " + GetName(OBJECT_SELF) + ", in area " + GetName(GetArea(OBJECT_SELF))); + SendMessageToPC(oShouter, "This NPC is muted. A DM will be here shortly."); + return; + } + //DMFI CODE ADDITIONS END HERE + + + + 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 (GetHasEffect(EFFECT_TYPE_CHARMED) == TRUE) + { + ClearActions(CLEAR_NW_C2_DEFAULT4_29); + BeginConversation(); + } + } + // Respond to shouts from friendly non-PCs only + else if (GetIsObjectValid(oShouter) + && !GetIsPC(oShouter) + && GetIsFriend(oShouter)) + { + 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); + } + + // Send the user-defined event if appropriate + if(GetSpawnInCondition(NW_FLAG_ON_DIALOGUE_EVENT)) + { + SignalEvent(OBJECT_SELF, EventUserDefined(EVENT_DIALOGUE)); + } +} diff --git a/gamma_age_v2/nw_c2_default5.ncs b/gamma_age_v2/nw_c2_default5.ncs new file mode 100644 index 0000000000000000000000000000000000000000..9c839745bc52f170e2ebf0bef2a0d10ed3e0fa91 GIT binary patch literal 60818 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 z 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 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/nw_c2_default5.nss b/gamma_age_v2/nw_c2_default5.nss new file mode 100644 index 00000000..fa4d20ff --- /dev/null +++ b/gamma_age_v2/nw_c2_default5.nss @@ -0,0 +1,104 @@ +//:://///////////////////////////////////////////// +//:: 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" + +//DMFI CODE ADDITIONS***************************** +void SafeFaction(object oCurrent, object oAttacker) +{ + AssignCommand(oAttacker, ClearAllActions()); + AssignCommand(oCurrent, ClearAllActions()); + // * Note: waiting for Sophia to make SetStandardFactionReptuation to clear all personal reputation + if (GetStandardFactionReputation(STANDARD_FACTION_COMMONER, oAttacker) <= 10) + { SetLocalInt(oAttacker, "NW_G_Playerhasbeenbad", 10); // * Player bad + SetStandardFactionReputation(STANDARD_FACTION_COMMONER, 80, oAttacker); + } + if (GetStandardFactionReputation(STANDARD_FACTION_MERCHANT, oAttacker) <= 10) + { SetLocalInt(oAttacker, "NW_G_Playerhasbeenbad", 10); // * Player bad + SetStandardFactionReputation(STANDARD_FACTION_MERCHANT, 80, oAttacker); + } + if (GetStandardFactionReputation(STANDARD_FACTION_DEFENDER, oAttacker) <= 10) + { SetLocalInt(oAttacker, "NW_G_Playerhasbeenbad", 10); // * Player bad + SetStandardFactionReputation(STANDARD_FACTION_DEFENDER, 80, oAttacker); + } + + +} +//END DMFI CODE ADDITIONS************************* + +void main() +{ +//DMFI CODE ADDITIONS***************************** + if ((GetIsPC(GetLastAttacker()) && (GetLocalInt(GetModule(), "dmfi_safe_factions")==1))) + { + SafeFaction(OBJECT_SELF, GetLastAttacker()); + SpeakString("DM ALERT: Default non-hostile faction member attacked. Player: "+GetName(GetLastAttacker()), TALKVOLUME_SILENT_SHOUT); + SendMessageToAllDMs("DMFI Safe Faction setting is currently set to ignore."); + SendMessageToPC(GetLastAttacker(), "Script Fired."); + return; + } +//END DMFI CODE ADDITIONS**************************** + + 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); + } + } + + + if(GetSpawnInCondition(NW_FLAG_ATTACK_EVENT)) + { + SignalEvent(OBJECT_SELF, EventUserDefined(EVENT_ATTACKED)); + } +} + diff --git a/gamma_age_v2/nw_s0_raisdead.ncs b/gamma_age_v2/nw_s0_raisdead.ncs new file mode 100644 index 0000000000000000000000000000000000000000..c85af0249c70e8822f603c76e32f7fe0ca6d193c GIT binary patch literal 2581 zcmbtW-%C_M6rTHIHPlRM)gY?LMbxzIhY!&f#JVmeh%T;%Mi8rA+ojbNca;dDptlO& zd+njWpvV4z9(yP#*dQXPhk^(n47BZ=b7t=TaATtc=iWPW&Ud~u=Q}ey5lhM|r^Ba4 zglOqJBJj6I3O69C{*Mb<=@=A;M5$EzE(Huus$ojFu5xNLUc3(*hb+~26|T<%6%!k7 zlUl^|rsG&D1`&8*)5j)#JhqN1n-s^YuzF(|D@Fv$TesTESo;P=mtHr_0wvh9d#*V^ zDQ{BBKLnX?DLPi(Vlab%s5^Ergr(NY(UH+aELlhuJmU}y(HmznY?G_iDk-D8)m(WE za1%NLUNv1#6nldx!Q@OV7EdN4GG9o|XR?_)-VIqn=@V_5reuYKp@6X49m;0wu-eFv zY+R2pXllY-hqHcB$Y(Y^ zsRJ6Q0zFq3w5JA?Gvx8Ft447Q6VWQ^dt10vpM&)EMf1dJlfT{z;-cGlqfqax9;cbh zy1%^FZiGxIZ|f0P5nDxhw{$TYzTyAOs`)fb=n3VKkJTx=xYl+zJ)JMw4LKM#os9cd z&lE|uPl4~cBQL?a7vVlL7i6k%`#Rd0dX~Q|)rp8niEM*j|KwyWA}=LmHkZ%KbSf`b zz0^V)!dpt+&Md7h$%WL4%q?JxFzqNZ@+1`!fDP(lN(+Zgw%UK!8j3$uyXa)DMq z_~IkVVwiOTJqH;V+t?}V`@*9#hB)g~+FfcC1B`=J$YqbZ$nA=K>>ugZb8Zl&Oy>`q zWD+Q2mtA&a8%@y@`@4^;f2?Yri}lc^K2D!dr8`eDn5`#+%(5?oLQbx%dh6bDL1yvD zl4!z&?F&FPz95;Qy;x>`lMhkE5DVV8(Ube=g`+zki9yOuN>1IQ@#yqrnTStB$EW9H zG?5q|i;qUQR|Gk~CTnvpN-Y4L5>F0U$AoZbPW z`)xIE5Boh==7VOS?2D9h8^68}ypKNdc){ z5w^nh4Bij0YdkqKH5HFdk4;W!1en$!5Jw^|9^-6N(XIC&@?Uo$`D4%*q0L9Xb&qPz zWm1Q+IdJB3YdCDyJvr}r%W{4-w{|mKkn^d9TM{D6W){6LU2fIxIAUJ%MXR=b*QE>* zsXGygV8A&+zhfv{75aaF)c~{TpTxwg!KGO${hafq-$63KrCBQdYOcB8e2S`f8eEzH Rb?brde5(N^scrEn#c#O(oizXe literal 0 HcmV?d00001 diff --git a/gamma_age_v2/nw_s0_raisdead.nss b/gamma_age_v2/nw_s0_raisdead.nss new file mode 100644 index 00000000..9d9acd26 --- /dev/null +++ b/gamma_age_v2/nw_s0_raisdead.nss @@ -0,0 +1,41 @@ +//:://///////////////////////////////////////////// +//:: [Raise Dead] +//:: [NW_S0_RaisDead.nss] +//:: Copyright (c) 2000 Bioware Corp. +//::////////////////////////////////////////////// +//:: Brings a character back to life with 1 HP. +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: Jan 31, 2001 +//::////////////////////////////////////////////// +//:: Last Updated By: Preston Watamaniuk, On: April 11, 2001 +//:: VFX Pass By: Preston W, On: June 22, 2001 + +// DEATH CODE START +#include "habd_include" +// DEATH CODE END + + +void main() +{ + //Declare major variables + object oTarget = GetSpellTargetObject(); + effect eRaise = EffectResurrection(); + effect eVis = EffectVisualEffect(VFX_IMP_RAISE_DEAD); + + //Fire cast spell at event for the specified target + SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_RAISE_DEAD, FALSE)); + if(GetIsDead(oTarget)) + { + //Apply raise dead effect and VFX impact + ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eVis, GetLocation(oTarget)); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eRaise, oTarget); + // HABD CODE START + HABDApplyPenaltyIfDead(oTarget, SPELL_RAISE_DEAD); + // HABD CODE END + } + // HABD CODE START + HABDCureRespawnGhost(oTarget, SPELL_RAISE_DEAD); + // HABD CODE END +} + diff --git a/gamma_age_v2/nw_s0_resserec.ncs b/gamma_age_v2/nw_s0_resserec.ncs new file mode 100644 index 0000000000000000000000000000000000000000..3ace54918f8651a57e7b4afc082c79c38d7c9236 GIT binary patch literal 2654 zcmbtW-)mDz6rQ<1+NG_vXlfTkcQh31TD$&ukj)B`ra=p(4NVm*%PwiX-G)sYY0|PR zhzq`{_}*6^{0n^a5Abmx6cj3m2#P3(^r1p){N|jQo11twVhf#n@60*h`OcZ|%w#;1 zR~L>C9UB&+ap ziRi*$&5JR3_Z0*9Jdy;n9lMgQg+OiJf9~SaP=w z@vK46)H*0X>=)JZ_Fxa@=$~SB>skM_;sSCN+E`^4bTtOlZvg!@7W7~fC}+syH}4w7 zu}nm#qHpM*_UA|Xf+RWJPSqB!_aiOQXT7m!Pvk+jows#Yz1CieOek-8lXuZdyJHWd z;T!&UWz(l+LQja2ILKbLhxgj)qo@1IxFHA2rk8Oao0&C@FYf@~^M)UQbw9$rWG={5 z;~whiX6hyWlIBRDL^k0*Ffoxysk1p%Dpx9MzEDw1L1A_t!doc(Q(RbHP_uxMm9cWAdNG$-tkUYUP<%ug-9ppQbAoYE#$FZg3y)|F zamtO_ooy8Zj1vvWb&pu&Zp}XPo%G|JTSTeT`9hIw0(I=V%jeisSGd^v?&RG+&@j)N zb;F@Po_ucH8&7Yr~%x0!W zC&mo|Oq&phBM}$3aJK2_@+pXH>nF-bhKTf?h(s{poS@$=Vd!oAiXlw{ zb1giHiC2qDvsU{s9ZJ84WPnSvR{PlAbiaiZb(|KLCP2M7(5<&kpd_^o9+mh6N_4Z| literal 0 HcmV?d00001 diff --git a/gamma_age_v2/nw_s0_resserec.nss b/gamma_age_v2/nw_s0_resserec.nss new file mode 100644 index 00000000..eda598f7 --- /dev/null +++ b/gamma_age_v2/nw_s0_resserec.nss @@ -0,0 +1,44 @@ +//:://///////////////////////////////////////////// +//:: [Ressurection] +//:: [NW_S0_Ressurec.nss] +//:: Copyright (c) 2000 Bioware Corp. +//::////////////////////////////////////////////// +//:: Brings a character back to life with full +//:: health. +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: Jan 31, 2001 +//::////////////////////////////////////////////// +//:: Last Updated By: Preston Watamaniuk, On: April 11, 2001 +//:: VFX Pass By: Preston W, On: June 22, 2001 + +// DEATH CODE START +#include "habd_include" +// DEATH CODE END + +void main() +{ + //Get the spell target + object oTarget = GetSpellTargetObject(); + //Check to make sure the target is dead first + //Fire cast spell at event for the specified target + SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_RESURRECTION, FALSE)); + if (GetIsDead(oTarget)) + { + //Declare major variables + int nHealed = GetMaxHitPoints(oTarget); + effect eRaise = EffectResurrection(); + effect eHeal = EffectHeal(nHealed + 10); + effect eVis = EffectVisualEffect(VFX_IMP_RAISE_DEAD); + //Apply the heal, raise dead and VFX impact effect + ApplyEffectToObject(DURATION_TYPE_INSTANT, eRaise, oTarget); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eHeal, oTarget); + ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eVis, GetLocation(oTarget)); + // HABD CODE START + HABDApplyPenaltyIfDead(oTarget, SPELL_RESURRECTION); + // HABD CODE END + } + // HABD CODE START + HABDCureRespawnGhost(oTarget, SPELL_RESURRECTION); + // HABD CODE END +} diff --git a/gamma_age_v2/nw_s3_actitem01.ncs b/gamma_age_v2/nw_s3_actitem01.ncs new file mode 100644 index 0000000000000000000000000000000000000000..ec852d4a7fdbf2f3d8acd6ce93b1938e1eb1cb91 GIT binary patch literal 320 zcmeZs4ps;=)H85mU|@8RV*mmU1qN0I#%(}?K_5iiV_;zh3bQgZ{{R2~0|N_CXaysX zuxA1?SyOV;GUK_G!IFO%SX4nK=z%qGfW_XRY2e7nDb7jEO9$#Aadu>23OJU3XrB(W$xwFF%S&~~5+ykHeM`N@eTnfZBeH8YqY wOt^}~1v60fCy=9>p;{Ce03Ehaga7~l literal 0 HcmV?d00001 diff --git a/gamma_age_v2/nw_s3_actitem01.nss b/gamma_age_v2/nw_s3_actitem01.nss new file mode 100644 index 00000000..02575a9c --- /dev/null +++ b/gamma_age_v2/nw_s3_actitem01.nss @@ -0,0 +1,32 @@ +//:://///////////////////////////////////////////// +//:: Actuvate Item Script +//:: NW_S3_ActItem01 +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + This fires the event on the module that allows + for items to have special powers. +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: Dec 19, 2001 +//::////////////////////////////////////////////// +//:: Modified by The DMFI Team to handle activation of DMFI Wands & Widgets + +void main() +{ + object oItem = GetSpellCastItem(); + object oTarget = GetSpellTargetObject(); + location lLocal = GetSpellTargetLocation(); + + if (GetStringLeft(GetTag(oItem), 5) == "dmfi_" || + GetStringLeft(GetTag(oItem), 8) == "hlslang_") + { + SetLocalObject(OBJECT_SELF, "dmfi_item", oItem); + SetLocalObject(OBJECT_SELF, "dmfi_target", oTarget); + SetLocalLocation(OBJECT_SELF, "dmfi_location", lLocal); + ExecuteScript("dmfi_activate", OBJECT_SELF); + return; + } + SignalEvent(GetModule(), EventActivateItem(oItem, lLocal, oTarget)); +} diff --git a/gamma_age_v2/nwnx.nss b/gamma_age_v2/nwnx.nss new file mode 100644 index 00000000..fe8942cf --- /dev/null +++ b/gamma_age_v2/nwnx.nss @@ -0,0 +1,113 @@ +/// @addtogroup nwnx NWNX +/// @brief Functions for plugin developers. +/// @{ +/// @file nwnx.nss + +/// @brief Scripting interface to NWNX. +/// @param pluginName The plugin name. +/// @param functionName The function name (do not include NWNX_Plugin_). +void NWNX_CallFunction(string pluginName, string functionName); +/// @brief Pushes the specified type to the c++ side +/// @param pluginName The plugin name. +/// @param functionName The function name (do not include NWNX_Plugin_). +/// @param value The value of specified type to push. +void NWNX_PushArgumentInt(string pluginName, string functionName, int value); +/// @copydoc NWNX_PushArgumentInt() +void NWNX_PushArgumentFloat(string pluginName, string functionName, float value); +/// @copydoc NWNX_PushArgumentInt() +void NWNX_PushArgumentObject(string pluginName, string functionName, object value); +/// @copydoc NWNX_PushArgumentInt() +void NWNX_PushArgumentString(string pluginName, string functionName, string value); +/// @copydoc NWNX_PushArgumentInt() +void NWNX_PushArgumentEffect(string pluginName, string functionName, effect value); +/// @copydoc NWNX_PushArgumentInt() +void NWNX_PushArgumentItemProperty(string pluginName, string functionName, itemproperty value); +/// @brief Returns the specified type from the c++ side +/// @param pluginName The plugin name. +/// @param functionName The function name (do not include NWNX_Plugin_). +/// @return The value of specified type. +int NWNX_GetReturnValueInt(string pluginName, string functionName); +/// @copydoc NWNX_GetReturnValueInt() +float NWNX_GetReturnValueFloat(string pluginName, string functionName); +/// @copydoc NWNX_GetReturnValueInt() +object NWNX_GetReturnValueObject(string pluginName, string functionName); +/// @copydoc NWNX_GetReturnValueInt() +string NWNX_GetReturnValueString(string pluginName, string functionName); +/// @copydoc NWNX_GetReturnValueInt() +effect NWNX_GetReturnValueEffect(string pluginName, string functionName); +/// @copydoc NWNX_GetReturnValueInt() +itemproperty NWNX_GetReturnValueItemProperty(string pluginName, string functionName); + +/// @private +string NWNX_INTERNAL_BuildString(string pluginName, string functionName, string operation) +{ + return "NWNXEE!ABIv2!" + pluginName + "!" + functionName + "!" + operation; +} +/// @} + +void NWNX_CallFunction(string pluginName, string functionName) +{ + PlaySound(NWNX_INTERNAL_BuildString(pluginName, functionName, "CALL")); +} + +void NWNX_PushArgumentInt(string pluginName, string functionName, int value) +{ + SetLocalInt(OBJECT_INVALID, NWNX_INTERNAL_BuildString(pluginName, functionName, "PUSH"), value); +} + +void NWNX_PushArgumentFloat(string pluginName, string functionName, float value) +{ + SetLocalFloat(OBJECT_INVALID, NWNX_INTERNAL_BuildString(pluginName, functionName, "PUSH"), value); +} + +void NWNX_PushArgumentObject(string pluginName, string functionName, object value) +{ + SetLocalObject(OBJECT_INVALID, NWNX_INTERNAL_BuildString(pluginName, functionName, "PUSH"), value); +} + +void NWNX_PushArgumentString(string pluginName, string functionName, string value) +{ + SetLocalString(OBJECT_INVALID, NWNX_INTERNAL_BuildString(pluginName, functionName, "PUSH"), value); +} + +void NWNX_PushArgumentEffect(string pluginName, string functionName, effect value) +{ + TagEffect(value, NWNX_INTERNAL_BuildString(pluginName, functionName, "PUSH")); +} + +void NWNX_PushArgumentItemProperty(string pluginName, string functionName, itemproperty value) +{ + TagItemProperty(value, NWNX_INTERNAL_BuildString(pluginName, functionName, "PUSH")); +} + +int NWNX_GetReturnValueInt(string pluginName, string functionName) +{ + return GetLocalInt(OBJECT_INVALID, NWNX_INTERNAL_BuildString(pluginName, functionName, "POP")); +} + +float NWNX_GetReturnValueFloat(string pluginName, string functionName) +{ + return GetLocalFloat(OBJECT_INVALID, NWNX_INTERNAL_BuildString(pluginName, functionName, "POP")); +} + +object NWNX_GetReturnValueObject(string pluginName, string functionName) +{ + return GetLocalObject(OBJECT_INVALID, NWNX_INTERNAL_BuildString(pluginName, functionName, "POP")); +} + +string NWNX_GetReturnValueString(string pluginName, string functionName) +{ + return GetLocalString(OBJECT_INVALID, NWNX_INTERNAL_BuildString(pluginName, functionName, "POP")); +} + +effect NWNX_GetReturnValueEffect(string pluginName, string functionName) +{ + effect e; + return TagEffect(e, NWNX_INTERNAL_BuildString(pluginName, functionName, "POP")); +} + +itemproperty NWNX_GetReturnValueItemProperty(string pluginName, string functionName) +{ + itemproperty ip; + return TagItemProperty(ip, NWNX_INTERNAL_BuildString(pluginName, functionName, "POP")); +} diff --git a/gamma_age_v2/nwnx_admin.nss b/gamma_age_v2/nwnx_admin.nss new file mode 100644 index 00000000..bbb43df9 --- /dev/null +++ b/gamma_age_v2/nwnx_admin.nss @@ -0,0 +1,344 @@ +/// @addtogroup admin Administration +/// @brief Various admin related functions +/// @{ +/// @file nwnx_admin.nss +#include "nwnx" + +const string NWNX_Administration = "NWNX_Administration"; ///< @private + +/// @name Administration Options +/// @anchor admin_opts +/// +/// @{ +const int NWNX_ADMINISTRATION_OPTION_ALL_KILLABLE = 0; // TRUE/FALSE +const int NWNX_ADMINISTRATION_OPTION_NON_PARTY_KILLABLE = 1; // TRUE/FALSE +const int NWNX_ADMINISTRATION_OPTION_REQUIRE_RESURRECTION = 2; // TRUE/FALSE +const int NWNX_ADMINISTRATION_OPTION_LOSE_STOLEN_ITEMS = 3; // TRUE/FALSE +const int NWNX_ADMINISTRATION_OPTION_LOSE_ITEMS = 4; // TRUE/FALSE +const int NWNX_ADMINISTRATION_OPTION_LOSE_EXP = 5; // TRUE/FALSE +const int NWNX_ADMINISTRATION_OPTION_LOSE_GOLD = 6; // TRUE/FALSE +const int NWNX_ADMINISTRATION_OPTION_LOSE_GOLD_NUM = 7; +const int NWNX_ADMINISTRATION_OPTION_LOSE_EXP_NUM = 8; +const int NWNX_ADMINISTRATION_OPTION_LOSE_ITEMS_NUM = 9; +const int NWNX_ADMINISTRATION_OPTION_PVP_SETTING = 10; // 0 = No PVP, 1 = Party PVP, 2 = Full PVP +const int NWNX_ADMINISTRATION_OPTION_PAUSE_AND_PLAY = 11; // TRUE/FALSE +const int NWNX_ADMINISTRATION_OPTION_ONE_PARTY_ONLY = 12; // TRUE/FALSE +const int NWNX_ADMINISTRATION_OPTION_ENFORCE_LEGAL_CHARACTERS = 13; // TRUE/FALSE +const int NWNX_ADMINISTRATION_OPTION_ITEM_LEVEL_RESTRICTIONS = 14; // TRUE/FALSE +const int NWNX_ADMINISTRATION_OPTION_CDKEY_BANLIST_ALLOWLIST = 15; // TRUE/FALSE +const int NWNX_ADMINISTRATION_OPTION_DISALLOW_SHOUTING = 16; // TRUE/FALSE +const int NWNX_ADMINISTRATION_OPTION_SHOW_DM_JOIN_MESSAGE = 17; // TRUE/FALSE +const int NWNX_ADMINISTRATION_OPTION_BACKUP_SAVED_CHARACTERS = 18; // TRUE/FALSE +const int NWNX_ADMINISTRATION_OPTION_AUTO_FAIL_SAVE_ON_1 = 19; // TRUE/FALSE +const int NWNX_ADMINISTRATION_OPTION_VALIDATE_SPELLS = 20; // TRUE/FALSE +const int NWNX_ADMINISTRATION_OPTION_EXAMINE_EFFECTS = 21; // TRUE/FALSE +const int NWNX_ADMINISTRATION_OPTION_EXAMINE_CHALLENGE_RATING = 22; // TRUE/FALSE +const int NWNX_ADMINISTRATION_OPTION_USE_MAX_HITPOINTS = 23; // TRUE/FALSE +const int NWNX_ADMINISTRATION_OPTION_RESTORE_SPELLS_USES = 24; // TRUE/FALSE +const int NWNX_ADMINISTRATION_OPTION_RESET_ENCOUNTER_SPAWN_POOL = 25; // TRUE/FALSE +const int NWNX_ADMINISTRATION_OPTION_HIDE_HITPOINTS_GAINED = 26; // TRUE/FALSE +/// @} + +/// @name Administration Debug Types +/// @anchor admin_debug +/// +/// @{ +const int NWNX_ADMINISTRATION_DEBUG_COMBAT = 0; // TRUE/FALSE +const int NWNX_ADMINISTRATION_DEBUG_SAVING_THROW = 1; // TRUE/FALSE +const int NWNX_ADMINISTRATION_DEBUG_MOVEMENT_SPEED = 2; // TRUE/FALSE +const int NWNX_ADMINISTRATION_DEBUG_HIT_DIE = 3; // TRUE/FALSE +/// @} + +/// @brief Gets the current player password. +/// @return The current player password. +string NWNX_Administration_GetPlayerPassword(); + +/// @brief Sets the password for players to login. +/// @param password The password to use. +void NWNX_Administration_SetPlayerPassword(string password); + +/// @brief Clears the player password required to login. +void NWNX_Administration_ClearPlayerPassword(); + +/// @brief Gets the current DM password. +/// @return The current DM password. +string NWNX_Administration_GetDMPassword(); + +/// @brief Sets the password for DMs to login. +/// @param password The password to use. +void NWNX_Administration_SetDMPassword(string password); + +/// @brief Signals the server to immediately shut down. +void NWNX_Administration_ShutdownServer(); + +/// @brief Deletes the player character from the servervault +/// +/// The PC will be immediately booted from the game with a "Delete Character" message +/// +/// @param oPC The player to delete. +/// @param bPreserveBackup If true, it will leave the file on server, only appending ".deleted0" to the bic filename. +/// @param sKickMessage An optional kick message, if left blank it will default to "Delete Character" as reason. +void NWNX_Administration_DeletePlayerCharacter(object oPC, int bPreserveBackup = TRUE, string sKickMessage = ""); + +/// @brief Bans the provided IP. +/// @param ip The IP Address to ban. +void NWNX_Administration_AddBannedIP(string ip); + +/// @brief Removes the ban on the provided IP. +/// @param ip The IP Address to unban. +void NWNX_Administration_RemoveBannedIP(string ip); + +/// @brief Bans the provided Public CD Key. +/// @param key The Public CD Key to ban. +void NWNX_Administration_AddBannedCDKey(string key); + +/// @brief Removes the ban on the provided Public CD Key. +/// @param key The Public CD Key to unban. +void NWNX_Administration_RemoveBannedCDKey(string key); + +/// @brief Bans the provided playername. +/// @param playerName The player name (community name) to ban. +/// @warning A user can change their playername at will. +void NWNX_Administration_AddBannedPlayerName(string playerName); + +/// @brief Removes the ban on the provided playername. +/// @param playerName The player name (community name) to unban. +void NWNX_Administration_RemoveBannedPlayerName(string playerName); + +/// @brief Get a list of all banned IPs/Keys/names as a string. +/// @return A string with a listing of the banned IPs/Keys/names. +string NWNX_Administration_GetBannedList(); + +/// @brief Set the module's name as shown to the serverlist. +/// @param name The name to give the module. +void NWNX_Administration_SetModuleName(string name); + +/// @brief Set the server's name as shown to the serverlist. +/// @param name The name to give the server. +void NWNX_Administration_SetServerName(string name); + +/// @brief Returns the server's name as shown to the serverlist. +string NWNX_Administration_GetServerName(); + +/// @brief Get an @ref admin_opts "Administration Option" value. +/// @param option An @ref admin_opts "Administration Option". +/// @return The current setting for the supplied option from @ref admin_opts "Administration Options". +int NWNX_Administration_GetPlayOption(int option); + +/// @brief Set an @ref admin_opts "Administration Options" to a value. +/// @param option The option to adjust from @ref admin_opts "Administration Options". +/// @param value The new value for the option. +void NWNX_Administration_SetPlayOption(int option, int value); + +/// @brief Delete the TURD of playerName + characterName. +/// +/// At times a PC may get stuck in a permanent crash loop when attempting to log +/// in. This function allows administrators to delete their Temporary User +/// Resource Data where the PC's current location is stored allowing them to log +/// into the starting area. +/// +/// @param playerName The community (login name). +/// @param characterName The character name. +/// @return Returns TRUE if successful +int NWNX_Administration_DeleteTURD(string playerName, string characterName); + +/// @brief Get an @ref admin_debug "Administration Debug Type" value. +/// @param type An @ref admin_debug "Administration Debug Type". +/// @return The current value for the supplied debug type from @ref admin_debug "Administration Debug Types". +int NWNX_Administration_GetDebugValue(int type); + +/// @brief Set an @ref admin_debug "Administration Debug Type" to a value. +/// @param type The debug type to adjust from @ref admin_debug "Administration Debug Types". +/// @param state The new state for the debug type, TRUE or FALSE +void NWNX_Administration_SetDebugValue(int type, int state); + +/// @brief Reload all rules (2da stuff etc). +/// @warning DANGER, DRAGONS. Bad things may or may not happen. +void NWNX_Administration_ReloadRules(); + +/// @} + +string NWNX_Administration_GetPlayerPassword() +{ + string sFunc = "GetPlayerPassword"; + + NWNX_CallFunction(NWNX_Administration, sFunc); + return NWNX_GetReturnValueString(NWNX_Administration, sFunc); +} + +void NWNX_Administration_SetPlayerPassword(string password) +{ + string sFunc = "SetPlayerPassword"; + + NWNX_PushArgumentString(NWNX_Administration, sFunc, password); + NWNX_CallFunction(NWNX_Administration, sFunc); +} + +void NWNX_Administration_ClearPlayerPassword() +{ + string sFunc = "ClearPlayerPassword"; + + NWNX_CallFunction(NWNX_Administration, sFunc); +} + +string NWNX_Administration_GetDMPassword() +{ + string sFunc = "GetDMPassword"; + + NWNX_CallFunction(NWNX_Administration, sFunc); + return NWNX_GetReturnValueString(NWNX_Administration, sFunc); +} + +void NWNX_Administration_SetDMPassword(string password) +{ + string sFunc = "SetDMPassword"; + + NWNX_PushArgumentString(NWNX_Administration, sFunc, password); + NWNX_CallFunction(NWNX_Administration, sFunc); +} + +void NWNX_Administration_ShutdownServer() +{ + string sFunc = "ShutdownServer"; + + NWNX_CallFunction(NWNX_Administration, sFunc); +} + +void NWNX_Administration_DeletePlayerCharacter(object oPC, int bPreserveBackup = TRUE, string sKickMessage = "") +{ + string sFunc = "DeletePlayerCharacter"; + + NWNX_PushArgumentString(NWNX_Administration, sFunc, sKickMessage); + NWNX_PushArgumentInt(NWNX_Administration, sFunc, bPreserveBackup); + NWNX_PushArgumentObject(NWNX_Administration, sFunc, oPC); + NWNX_CallFunction(NWNX_Administration, sFunc); +} + +void NWNX_Administration_AddBannedIP(string ip) +{ + string sFunc = "AddBannedIP"; + + NWNX_PushArgumentString(NWNX_Administration, sFunc, ip); + NWNX_CallFunction(NWNX_Administration, sFunc); +} +void NWNX_Administration_RemoveBannedIP(string ip) +{ + string sFunc = "RemoveBannedIP"; + + NWNX_PushArgumentString(NWNX_Administration, sFunc, ip); + NWNX_CallFunction(NWNX_Administration, sFunc); +} +void NWNX_Administration_AddBannedCDKey(string key) +{ + string sFunc = "AddBannedCDKey"; + + NWNX_PushArgumentString(NWNX_Administration, sFunc, key); + NWNX_CallFunction(NWNX_Administration, sFunc); +} +void NWNX_Administration_RemoveBannedCDKey(string key) +{ + string sFunc = "RemoveBannedCDKey"; + + NWNX_PushArgumentString(NWNX_Administration, sFunc, key); + NWNX_CallFunction(NWNX_Administration, sFunc); +} +void NWNX_Administration_AddBannedPlayerName(string playerName) +{ + string sFunc = "AddBannedPlayerName"; + + NWNX_PushArgumentString(NWNX_Administration, sFunc, playerName); + NWNX_CallFunction(NWNX_Administration, sFunc); +} +void NWNX_Administration_RemoveBannedPlayerName(string playerName) +{ + string sFunc = "RemoveBannedPlayerName"; + + NWNX_PushArgumentString(NWNX_Administration, sFunc, playerName); + NWNX_CallFunction(NWNX_Administration, sFunc); +} +string NWNX_Administration_GetBannedList() +{ + string sFunc = "GetBannedList"; + + NWNX_CallFunction(NWNX_Administration, sFunc); + return NWNX_GetReturnValueString(NWNX_Administration, sFunc); +} + +void NWNX_Administration_SetModuleName(string name) +{ + string sFunc = "SetModuleName"; + + NWNX_PushArgumentString(NWNX_Administration, sFunc, name); + NWNX_CallFunction(NWNX_Administration, sFunc); +} + +void NWNX_Administration_SetServerName(string name) +{ + string sFunc = "SetServerName"; + + NWNX_PushArgumentString(NWNX_Administration, sFunc, name); + NWNX_CallFunction(NWNX_Administration, sFunc); +} + +string NWNX_Administration_GetServerName() +{ + string sFunc = "GetServerName"; + NWNX_CallFunction(NWNX_Administration, sFunc); + return NWNX_GetReturnValueString(NWNX_Administration, sFunc); +} + +int NWNX_Administration_GetPlayOption(int option) +{ + string sFunc = "GetPlayOption"; + + NWNX_PushArgumentInt(NWNX_Administration, sFunc, option); + NWNX_CallFunction(NWNX_Administration, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Administration, sFunc); +} + +void NWNX_Administration_SetPlayOption(int option, int value) +{ + string sFunc = "SetPlayOption"; + + NWNX_PushArgumentInt(NWNX_Administration, sFunc, value); + NWNX_PushArgumentInt(NWNX_Administration, sFunc, option); + NWNX_CallFunction(NWNX_Administration, sFunc); +} + +int NWNX_Administration_DeleteTURD(string playerName, string characterName) +{ + string sFunc = "DeleteTURD"; + + NWNX_PushArgumentString(NWNX_Administration, sFunc, characterName); + NWNX_PushArgumentString(NWNX_Administration, sFunc, playerName); + NWNX_CallFunction(NWNX_Administration, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Administration, sFunc); +} + +int NWNX_Administration_GetDebugValue(int type) +{ + string sFunc = "GetDebugValue"; + + NWNX_PushArgumentInt(NWNX_Administration, sFunc, type); + NWNX_CallFunction(NWNX_Administration, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Administration, sFunc); +} + +void NWNX_Administration_SetDebugValue(int type, int state) +{ + string sFunc = "SetDebugValue"; + + NWNX_PushArgumentInt(NWNX_Administration, sFunc, state); + NWNX_PushArgumentInt(NWNX_Administration, sFunc, type); + NWNX_CallFunction(NWNX_Administration, sFunc); +} + +void NWNX_Administration_ReloadRules() +{ + string sFunc = "ReloadRules"; + + NWNX_CallFunction(NWNX_Administration, sFunc); +} diff --git a/gamma_age_v2/nwnx_appearance.nss b/gamma_age_v2/nwnx_appearance.nss new file mode 100644 index 00000000..6f31140a --- /dev/null +++ b/gamma_age_v2/nwnx_appearance.nss @@ -0,0 +1,73 @@ +/// @addtogroup appearance Appearance +/// @brief Allows the appearance and some other things of creatures to be overridden per player. +/// @{ +/// @file nwnx_appearance.nss +#include "nwnx" + +const string NWNX_Appearance = "NWNX_Appearance"; ///< @private + +/// @name Appearance Types +/// @anchor appearance_types +/// +/// The various types of changes that can be made to how a PC is perceived. +/// @{ +const int NWNX_APPEARANCE_TYPE_APPEARANCE = 0; ///< APPEARANCE_TYPE_* or -1 to remove +const int NWNX_APPEARANCE_TYPE_GENDER = 1; ///< GENDER_* or -1 to remove + +/// @brief 0-GetMaxHitPoints(oCreature) or -1 to remove +/// @note This is visual only. Does not change the Examine Window health status. +const int NWNX_APPEARANCE_TYPE_HITPOINTS = 2; +const int NWNX_APPEARANCE_TYPE_HAIR_COLOR = 3; ///< 0-175 or -1 to remove +const int NWNX_APPEARANCE_TYPE_SKIN_COLOR = 4; ///< 0-175 or -1 to remove +const int NWNX_APPEARANCE_TYPE_PHENOTYPE = 5; ///< PHENOTYPE_* or -1 to remove +const int NWNX_APPEARANCE_TYPE_HEAD_TYPE = 6; ///< 0-? or -1 to remove +const int NWNX_APPEARANCE_TYPE_SOUNDSET = 7; ///< See soundset.2da or -1 to remove +const int NWNX_APPEARANCE_TYPE_TAIL_TYPE = 8; ///< CREATURE_TAIL_TYPE_* or see tailmodel.2da, -1 to remove +const int NWNX_APPEARANCE_TYPE_WING_TYPE = 9; ///< CREATURE_WING_TYPE_* or see wingmodel.2da, -1 to remove +const int NWNX_APPEARANCE_TYPE_FOOTSTEP_SOUND = 10; ///< 0-17 or see footstepsounds.2da, -1 to remove + +/// @brief See portraits.2da, -1 to remove +/// @note Does not change the Examine Window portrait. +const int NWNX_APPEARANCE_TYPE_PORTRAIT = 11; +///@} + +/// @brief Override a creature's appearance type for a player. +/// @param oPlayer The player who will see/hear things differently. +/// @param oCreature The target creature whose appearance type to alter for oPlayer. Can be a PC. +/// @param nType The @ref appearance_types "Appearance Type" to set or -1 to fully remove override. +/// @param nValue The new value for the appearance type. +void NWNX_Appearance_SetOverride(object oPlayer, object oCreature, int nType, int nValue); + +/// @brief Get a creature's appearance type for a player. +/// @param oPlayer The player who see/hear things differently. +/// @param oCreature The target creature whose appearance type is altered for oPlayer. Can be a PC. +/// @param nType The @ref appearance_types "Appearance Type" to get. +/// @return The value for the appearance type or -1 when not set. +int NWNX_Appearance_GetOverride(object oPlayer, object oCreature, int nType); + +/// @} + +void NWNX_Appearance_SetOverride(object oPlayer, object oCreature, int nType, int nValue) +{ + string sFunc = "SetOverride"; + + NWNX_PushArgumentInt(NWNX_Appearance, sFunc, nValue); + NWNX_PushArgumentInt(NWNX_Appearance, sFunc, nType); + NWNX_PushArgumentObject(NWNX_Appearance, sFunc, oCreature); + NWNX_PushArgumentObject(NWNX_Appearance, sFunc, oPlayer); + + NWNX_CallFunction(NWNX_Appearance, sFunc); +} + +int NWNX_Appearance_GetOverride(object oPlayer, object oCreature, int nType) +{ + string sFunc = "GetOverride"; + + NWNX_PushArgumentInt(NWNX_Appearance, sFunc, nType); + NWNX_PushArgumentObject(NWNX_Appearance, sFunc, oCreature); + NWNX_PushArgumentObject(NWNX_Appearance, sFunc, oPlayer); + + NWNX_CallFunction(NWNX_Appearance, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Appearance, sFunc); +} diff --git a/gamma_age_v2/nwnx_area.nss b/gamma_age_v2/nwnx_area.nss new file mode 100644 index 00000000..f1a9134f --- /dev/null +++ b/gamma_age_v2/nwnx_area.nss @@ -0,0 +1,660 @@ +/// @addtogroup area Area +/// @brief Functions exposing additional area properties as well as creating transitions. +/// @{ +/// @file nwnx_area.nss +#include "nwnx" + +const string NWNX_Area = "NWNX_Area"; ///< @private + +/// @name Area PVP Settings +/// @anchor area_pvp +/// @{ +const int NWNX_AREA_PVP_SETTING_NO_PVP = 0; +const int NWNX_AREA_PVP_SETTING_PARTY_PVP = 1; +const int NWNX_AREA_PVP_SETTING_FULL_PVP = 2; +const int NWNX_AREA_PVP_SETTING_SERVER_DEFAULT = 3; +/// @} + +/// @name Area Weather Settings +/// @anchor area_weather +/// @{ +const int NWNX_AREA_WEATHER_CHANCE_RAIN = 0; +const int NWNX_AREA_WEATHER_CHANCE_SNOW = 1; +const int NWNX_AREA_WEATHER_CHANCE_LIGHTNING = 2; +/// @} + +/// @name Area Day Night Cycle Settings +/// @anchor area_daynight +/// @{ +const int NWNX_AREA_DAYNIGHTCYCLE_CYCLE_DAY_NIGHT = 0; +const int NWNX_AREA_DAYNIGHTCYCLE_ALWAYS_BRIGHT = 1; +const int NWNX_AREA_DAYNIGHTCYCLE_ALWAYS_DARK = 2; +/// @} + +/// @name Area Sun/Moon Color Settings +/// @anchor area_color +/// @{ +const int NWNX_AREA_COLOR_TYPE_MOON_AMBIENT = 0; +const int NWNX_AREA_COLOR_TYPE_MOON_DIFFUSE = 1; +const int NWNX_AREA_COLOR_TYPE_SUN_AMBIENT = 2; +const int NWNX_AREA_COLOR_TYPE_SUN_DIFFUSE = 3; +/// @} + +/// @brief A tile info struct +struct NWNX_Area_TileInfo +{ + int nID; ///< The tile's ID + int nHeight; ///< The tile's height + int nOrientation; ///< The tile's orientation + int nGridX; ///< The tile's grid x position + int nGridY; ///< The tile's grid y position +}; + +/// @brief Gets the number of players in area. +/// @param area The area object. +/// @return The player count for the area. +int NWNX_Area_GetNumberOfPlayersInArea(object area); + +/// @brief Gets the creature that last entered area. +/// @param area The area object. +/// @return The most recent creature to enter the area. +object NWNX_Area_GetLastEntered(object area); + +/// @brief Gets the creature that last left area +/// @param area The area object. +object NWNX_Area_GetLastLeft(object area); + +/// @brief Get the PVP setting of area +/// @param area The area object. +/// @return Returns the @ref area_pvp "PVP Setting" for the area. +int NWNX_Area_GetPVPSetting(object area); + +/// @brief Set the PVP setting of area +/// @param area The area object. +/// @param pvpSetting One of @ref area_pvp the "PVP Settings". +void NWNX_Area_SetPVPSetting(object area, int pvpSetting); + +/// @brief Get the spot modifier of area +/// @param area The area object. +/// @return The value of the Spot skill modifier for this area. +int NWNX_Area_GetAreaSpotModifier(object area); + +/// @brief Set the spot modifier of area +/// @param area The area object. +/// @param spotModifier The modifier to the Spot skill for this area. +/// @sa NWNX_SkillRanks_SetAreaModifier() to change any skill modifier. +void NWNX_Area_SetAreaSpotModifier(object area, int spotModifier); + +/// @brief Get the listen modifer of area +/// @param area The area object. +/// @return The value of the Listen skill modifier for this area. +int NWNX_Area_GetAreaListenModifier(object area); + +/// @brief Set the listen modifier of area +/// @param area The area object. +/// @param listenModifier The modifier to the Listen skill for this area. +/// @sa NWNX_SkillRanks_SetAreaModifier() to change any skill modifier. +void NWNX_Area_SetAreaListenModifier(object area, int listenModifier); + +/// @brief Checks the No Resting area flag +/// @param area The area object. +/// @return TRUE if resting is not allowed in area. +int NWNX_Area_GetNoRestingAllowed(object area); + +/// @brief Set whether to disable resting in the area. +/// @param area The area object. +/// @param bNoRestingAllowed TRUE to disable resting in the area. +void NWNX_Area_SetNoRestingAllowed(object area, int bNoRestingAllowed); + +/// @brief Get the wind power in area +/// @param area The area object. +/// @return The wind power for the area. (0-2) +int NWNX_Area_GetWindPower(object area); + +/// @brief Set the wind power in area +/// @param area The area object. +/// @param windPower Set to 0, 1 or 2. +void NWNX_Area_SetWindPower(object area, int windPower); + +/// @brief Get the weather chance of type in area +/// @param type A @ref area_weather "Weather Setting". +/// @param area The area object. +/// @return The percentage chance for the weather type. (0-100) +int NWNX_Area_GetWeatherChance(object area, int type); + +/// @brief Set the weather chance of type in area +/// @param area The area object. +/// @param type A @ref area_weather "Weather Setting". +/// @param chance The chance this weather event occurs. +void NWNX_Area_SetWeatherChance(object area, int type, int chance); + +/// @brief Get the fog clip distance in area +/// @param area The area object. +/// @return The fog clip distance. +float NWNX_Area_GetFogClipDistance(object area); + +/// @brief Set the fog clip distance in area +/// @param area The area object. +/// @param distance The new fog clip distance. +void NWNX_Area_SetFogClipDistance(object area, float distance); + +/// @brief Get the shadow opacity of area +/// @param area The area object. +/// @return The shadow opacity for the area. (0-100) +int NWNX_Area_GetShadowOpacity(object area); + +/// @brief Set the shadow opacity of area +/// @param area The area object. +/// @param shadowOpacity The shadow opacity to set for the area (0-100). +void NWNX_Area_SetShadowOpacity(object area, int shadowOpacity); + +/// @brief Get the day/night cycle of area +/// @param area The area object. +/// @return The @ref area_daynight "Day Night Cycle Setting". +int NWNX_Area_GetDayNightCycle(object area); + +/// @brief Set the day/night cycle of area +/// @param area The area object. +/// @param type = A @ref area_daynight "Day Night Cycle Setting". +void NWNX_Area_SetDayNightCycle(object area, int type); + +/// @brief Get the Sun/Moon Ambient/Diffuse colors of area +/// @param area The area object. +/// @param type = A @ref area_color "Sun/Moon Color Setting". +/// @return A FOG_COLOR_* or a custom value, -1 on error. +int NWNX_Area_GetSunMoonColors(object area, int type); + +/// @brief Set the Sun/Moon Ambient/Diffuse colors of area +// type = NWNX_AREA_COLOR_TYPE_* +/// @param area The area object. +/// @param type = A @ref area_color "Sun/Moon Color Setting". +/// @param color = A FOG_COLOR_*. +/// @note The color can also be represented as a hex RGB number if specific color shades are desired. +/// The format of a hex specified color would be 0xFFEEDD where +/// * FF would represent the amount of red in the color +/// * EE would represent the amount of green in the color +/// * DD would represent the amount of blue in the color. +void NWNX_Area_SetSunMoonColors(object area, int type, int color); + +/// @brief Create and returns a transition (square shaped of specified size) at a location. +/// @param area The area object. +/// @param target A door or waypoint object. +/// @param x,y,z The position to create the transition. +/// @param size The size of the square. +/// @param tag If specified, the returning object will have this tag. +/// @sa NWNX_Object_SetTriggerGeometry() if you wish to draw the transition as something other than a square. +object NWNX_Area_CreateTransition(object area, object target, float x, float y, float z, float size = 2.0f, string tag=""); + +/// @brief Get the state of a tile animation loop. +/// @param oArea The area object. +/// @param fTileX, fTileY The coordinates of the tile. +/// @param nAnimLoop The loop to check. (1-3) +/// @return TRUE if the loop is enabled. +int NWNX_Area_GetTileAnimationLoop(object oArea, float fTileX, float fTileY, int nAnimLoop); + +/// @brief Set the state of a tile animation loop. +/// @param oArea The area object. +/// @param fTileX, fTileY The coordinates of the tile. +/// @param nAnimLoop The loop to set (1-3). +/// @param bEnabled TRUE or FALSE. +/// @note Requires clients to re-enter the area for it to take effect +void NWNX_Area_SetTileAnimationLoop(object oArea, float fTileX, float fTileY, int nAnimLoop, int bEnabled); + +/// @brief Get the name of the tile model from any location. +/// @param oArea The area name. +/// @param fTileX, fTileY The coordinates of the tile. +string NWNX_Area_GetTileModelResRef(object oArea, float fTileX, float fTileY); + +/// @brief Test to see if there's a direct, walkable line between two points in the area. +/// @param oArea The area object. +/// @param fStartX, fStartY The starting points. +/// @param fEndX, fEndY The ending points. +/// @param fPerSpace The personal space of a creature. Found in appearance.2da. +/// @param fHeight The height of a creature. Found in appearance.2da. +/// @param bIgnoreDoors Whether to ignore doors in the check. +/// @return +/// * 1 if there is a direct walkable line. +/// * -1 if the line is blocked by terrain. +/// * -2 if the line is blocked by a placeable. +/// * -3 if the line is blocked by a creature. +int NWNX_Area_TestDirectLine(object oArea, float fStartX, float fStartY, float fEndX, float fEndY, float fPerSpace, float fHeight, int bIgnoreDoors=FALSE); + +/// @brief Get if the area music is playing. +/// @param oArea The area object. +/// @param bBattleMusic Set to TRUE to get if the battle music is playing. +/// @return TRUE if music is playing +int NWNX_Area_GetMusicIsPlaying(object oArea, int bBattleMusic = FALSE); + +/// @brief Create and return a generic trigger (square shaped of specified size) at a location. +/// @param oArea The area object. +/// @param fX, fY, fZ The position to create the trigger. +/// @param sTag If specified, the returned trigger will have this tag. +/// @param fSize The size of the square. +/// @sa NWNX_Object_SetTriggerGeometry() if you wish to draw the trigger as something other than a square. +object NWNX_Area_CreateGenericTrigger(object oArea, float fX, float fY, float fZ, string sTag = "", float fSize = 1.0f); + +/// @brief Add oObject to the ExportGIT exclusion list, objects on this list won't be exported when NWNX_Area_ExportGIT() is called. +/// @param oObject The object to add +void NWNX_Area_AddObjectToExclusionList(object oObject); + +/// @brief Remove oObject from the ExportGIT exclusion list. +/// @param oObject The object to add +void NWNX_Area_RemoveObjectFromExclusionList(object oObject); + +/// @brief Export the .git file of oArea to the UserDirectory/nwnx folder, or to the location of sAlias. +/// @note Take care with local objects set on objects, they will likely not reference the same object after a server restart. +/// @param oArea The area to export the .git file of. +/// @param sFileName The filename, 16 characters or less and should be lowercase. If left blank the resref of oArea will be used. +/// @param bExportVarTable If TRUE, local variables set on oArea will be exported too. +/// @param bExportUUID If TRUE, the UUID of oArea will be exported, if it has one. +/// @param nObjectFilter One or more OBJECT_TYPE_* constants. These object will not be exported. For example OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR +/// will not export creatures and doors. Use OBJECT_TYPE_ALL to filter all objects or 0 to export all objects. +/// @param sAlias The alias of the resource directory to add the .git file to. Default: UserDirectory/nwnx +/// @return TRUE if exported successfully, FALSE if not. +int NWNX_Area_ExportGIT(object oArea, string sFileName = "", int bExportVarTable = TRUE, int bExportUUID = TRUE, int nObjectFilter = 0, string sAlias = "NWNX"); + +/// @brief Get the tile info of the tile at [fTileX, fTileY] in oArea. +/// @param oArea The area name. +/// @param fTileX, fTileY The coordinates of the tile. +/// @return A NWNX_Area_TileInfo struct with tile info. +struct NWNX_Area_TileInfo NWNX_Area_GetTileInfo(object oArea, float fTileX, float fTileY); + +/// @brief Export the .are file of oArea to the UserDirectory/nwnx folder, or to the location of sAlias. +/// @param oArea The area to export the .are file of. +/// @param sFileName The filename, 16 characters or less and should be lowercase. This will also be the resref of the area. +/// @param sNewName Optional new name of the area. Leave blank to use the current name. +/// @param sNewTag Optional new tag of the area. Leave blank to use the current tag. +/// @param sAlias The alias of the resource directory to add the .are file to. Default: UserDirectory/nwnx +/// @return TRUE if exported successfully, FALSE if not. +int NWNX_Area_ExportARE(object oArea, string sFileName, string sNewName = "", string sNewTag = "", string sAlias = "NWNX"); + +/// @} + +int NWNX_Area_GetNumberOfPlayersInArea(object area) +{ + string sFunc = "GetNumberOfPlayersInArea"; + + NWNX_PushArgumentObject(NWNX_Area, sFunc, area); + NWNX_CallFunction(NWNX_Area, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Area, sFunc); +} + +object NWNX_Area_GetLastEntered(object area) +{ + string sFunc = "GetLastEntered"; + + NWNX_PushArgumentObject(NWNX_Area, sFunc, area); + NWNX_CallFunction(NWNX_Area, sFunc); + + return NWNX_GetReturnValueObject(NWNX_Area, sFunc); +} + +object NWNX_Area_GetLastLeft(object area) +{ + string sFunc = "GetLastLeft"; + + NWNX_PushArgumentObject(NWNX_Area, sFunc, area); + NWNX_CallFunction(NWNX_Area, sFunc); + + return NWNX_GetReturnValueObject(NWNX_Area, sFunc); +} + +int NWNX_Area_GetPVPSetting(object area) +{ + string sFunc = "GetPVPSetting"; + + NWNX_PushArgumentObject(NWNX_Area, sFunc, area); + NWNX_CallFunction(NWNX_Area, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Area, sFunc); +} + +void NWNX_Area_SetPVPSetting(object area, int pvpSetting) +{ + string sFunc = "SetPVPSetting"; + + NWNX_PushArgumentInt(NWNX_Area, sFunc, pvpSetting); + NWNX_PushArgumentObject(NWNX_Area, sFunc, area); + NWNX_CallFunction(NWNX_Area, sFunc); +} + +int NWNX_Area_GetAreaSpotModifier(object area) +{ + string sFunc = "GetAreaSpotModifier"; + + NWNX_PushArgumentObject(NWNX_Area, sFunc, area); + NWNX_CallFunction(NWNX_Area, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Area, sFunc); +} + +void NWNX_Area_SetAreaSpotModifier(object area, int spotModifier) +{ + string sFunc = "SetAreaSpotModifier"; + + NWNX_PushArgumentInt(NWNX_Area, sFunc, spotModifier); + NWNX_PushArgumentObject(NWNX_Area, sFunc, area); + NWNX_CallFunction(NWNX_Area, sFunc); +} + +int NWNX_Area_GetAreaListenModifier(object area) +{ + string sFunc = "GetAreaListenModifier"; + + NWNX_PushArgumentObject(NWNX_Area, sFunc, area); + NWNX_CallFunction(NWNX_Area, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Area, sFunc); +} + +void NWNX_Area_SetAreaListenModifier(object area, int listenModifier) +{ + string sFunc = "SetAreaListenModifier"; + + NWNX_PushArgumentInt(NWNX_Area, sFunc, listenModifier); + NWNX_PushArgumentObject(NWNX_Area, sFunc, area); + NWNX_CallFunction(NWNX_Area, sFunc); +} + +int NWNX_Area_GetNoRestingAllowed(object area) +{ + string sFunc = "GetNoRestingAllowed"; + + NWNX_PushArgumentObject(NWNX_Area, sFunc, area); + NWNX_CallFunction(NWNX_Area, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Area, sFunc); +} + +void NWNX_Area_SetNoRestingAllowed(object area, int bNoRestingAllowed) +{ + string sFunc = "SetNoRestingAllowed"; + + NWNX_PushArgumentInt(NWNX_Area, sFunc, bNoRestingAllowed); + NWNX_PushArgumentObject(NWNX_Area, sFunc, area); + NWNX_CallFunction(NWNX_Area, sFunc); +} + +int NWNX_Area_GetWindPower(object area) +{ + string sFunc = "GetWindPower"; + + NWNX_PushArgumentObject(NWNX_Area, sFunc, area); + NWNX_CallFunction(NWNX_Area, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Area, sFunc); +} + +void NWNX_Area_SetWindPower(object area, int windPower) +{ + string sFunc = "SetWindPower"; + + NWNX_PushArgumentInt(NWNX_Area, sFunc, windPower); + NWNX_PushArgumentObject(NWNX_Area, sFunc, area); + NWNX_CallFunction(NWNX_Area, sFunc); +} + +int NWNX_Area_GetWeatherChance(object area, int type) +{ + string sFunc = "GetWeatherChance"; + + NWNX_PushArgumentInt(NWNX_Area, sFunc, type); + NWNX_PushArgumentObject(NWNX_Area, sFunc, area); + NWNX_CallFunction(NWNX_Area, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Area, sFunc); +} + +void NWNX_Area_SetWeatherChance(object area, int type, int chance) +{ + string sFunc = "SetWeatherChance"; + + NWNX_PushArgumentInt(NWNX_Area, sFunc, chance); + NWNX_PushArgumentInt(NWNX_Area, sFunc, type); + NWNX_PushArgumentObject(NWNX_Area, sFunc, area); + NWNX_CallFunction(NWNX_Area, sFunc); +} + +float NWNX_Area_GetFogClipDistance(object area) +{ + string sFunc = "GetFogClipDistance"; + + NWNX_PushArgumentObject(NWNX_Area, sFunc, area); + NWNX_CallFunction(NWNX_Area, sFunc); + + return NWNX_GetReturnValueFloat(NWNX_Area, sFunc); +} + +void NWNX_Area_SetFogClipDistance(object area, float distance) +{ + string sFunc = "SetFogClipDistance"; + + NWNX_PushArgumentFloat(NWNX_Area, sFunc, distance); + NWNX_PushArgumentObject(NWNX_Area, sFunc, area); + NWNX_CallFunction(NWNX_Area, sFunc); +} + +int NWNX_Area_GetShadowOpacity(object area) +{ + string sFunc = "GetShadowOpacity"; + + NWNX_PushArgumentObject(NWNX_Area, sFunc, area); + NWNX_CallFunction(NWNX_Area, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Area, sFunc); +} + +void NWNX_Area_SetShadowOpacity(object area, int shadowOpacity) +{ + string sFunc = "SetShadowOpacity"; + + NWNX_PushArgumentInt(NWNX_Area, sFunc, shadowOpacity); + NWNX_PushArgumentObject(NWNX_Area, sFunc, area); + NWNX_CallFunction(NWNX_Area, sFunc); +} + + +int NWNX_Area_GetDayNightCycle(object area) +{ + string sFunc = "GetDayNightCycle"; + + NWNX_PushArgumentObject(NWNX_Area, sFunc, area); + NWNX_CallFunction(NWNX_Area, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Area, sFunc); +} + +void NWNX_Area_SetDayNightCycle(object area, int type) +{ + string sFunc = "SetDayNightCycle"; + + NWNX_PushArgumentInt(NWNX_Area, sFunc, type); + NWNX_PushArgumentObject(NWNX_Area, sFunc, area); + NWNX_CallFunction(NWNX_Area, sFunc); +} + +int NWNX_Area_GetSunMoonColors(object area, int type) +{ + string sFunc = "GetSunMoonColors"; + + NWNX_PushArgumentInt(NWNX_Area, sFunc, type); + NWNX_PushArgumentObject(NWNX_Area, sFunc, area); + NWNX_CallFunction(NWNX_Area, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Area, sFunc); +} + +void NWNX_Area_SetSunMoonColors(object area, int type, int color) +{ + string sFunc = "SetSunMoonColors"; + + NWNX_PushArgumentInt(NWNX_Area, sFunc, color); + NWNX_PushArgumentInt(NWNX_Area, sFunc, type); + NWNX_PushArgumentObject(NWNX_Area, sFunc, area); + NWNX_CallFunction(NWNX_Area, sFunc); +} + +object NWNX_Area_CreateTransition(object area, object target, float x, float y, float z, float size = 2.0f, string tag="") +{ + string sFunc = "CreateTransition"; + + NWNX_PushArgumentString(NWNX_Area, sFunc, tag); + NWNX_PushArgumentFloat(NWNX_Area, sFunc, size); + NWNX_PushArgumentFloat(NWNX_Area, sFunc, z); + NWNX_PushArgumentFloat(NWNX_Area, sFunc, y); + NWNX_PushArgumentFloat(NWNX_Area, sFunc, x); + NWNX_PushArgumentObject(NWNX_Area, sFunc, target); + NWNX_PushArgumentObject(NWNX_Area, sFunc, area); + NWNX_CallFunction(NWNX_Area, sFunc); + + return NWNX_GetReturnValueObject(NWNX_Area, sFunc); +} + +int NWNX_Area_GetTileAnimationLoop(object oArea, float fTileX, float fTileY, int nAnimLoop) +{ + string sFunc = "GetTileAnimationLoop"; + + NWNX_PushArgumentInt(NWNX_Area, sFunc, nAnimLoop); + NWNX_PushArgumentFloat(NWNX_Area, sFunc, fTileY); + NWNX_PushArgumentFloat(NWNX_Area, sFunc, fTileX); + NWNX_PushArgumentObject(NWNX_Area, sFunc, oArea); + + NWNX_CallFunction(NWNX_Area, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Area, sFunc); +} + +void NWNX_Area_SetTileAnimationLoop(object oArea, float fTileX, float fTileY, int nAnimLoop, int bEnabled) +{ + string sFunc = "SetTileAnimationLoop"; + + NWNX_PushArgumentInt(NWNX_Area, sFunc, bEnabled); + NWNX_PushArgumentInt(NWNX_Area, sFunc, nAnimLoop); + NWNX_PushArgumentFloat(NWNX_Area, sFunc, fTileY); + NWNX_PushArgumentFloat(NWNX_Area, sFunc, fTileX); + NWNX_PushArgumentObject(NWNX_Area, sFunc, oArea); + + NWNX_CallFunction(NWNX_Area, sFunc); +} + +string NWNX_Area_GetTileModelResRef(object oArea, float fTileX, float fTileY) +{ + string sFunc = "GetTileModelResRef"; + NWNX_PushArgumentFloat(NWNX_Area, sFunc, fTileY); + NWNX_PushArgumentFloat(NWNX_Area, sFunc, fTileX); + NWNX_PushArgumentObject(NWNX_Area, sFunc, oArea); + + NWNX_CallFunction(NWNX_Area, sFunc); + + return NWNX_GetReturnValueString(NWNX_Area, sFunc); +} + +int NWNX_Area_TestDirectLine(object oArea, float fStartX, float fStartY, float fEndX, float fEndY, float fPerSpace, float fHeight, int bIgnoreDoors=FALSE) +{ + string sFunc = "TestDirectLine"; + + NWNX_PushArgumentInt(NWNX_Area, sFunc, bIgnoreDoors); + NWNX_PushArgumentFloat(NWNX_Area, sFunc, fHeight); + NWNX_PushArgumentFloat(NWNX_Area, sFunc, fPerSpace); + NWNX_PushArgumentFloat(NWNX_Area, sFunc, fEndY); + NWNX_PushArgumentFloat(NWNX_Area, sFunc, fEndX); + NWNX_PushArgumentFloat(NWNX_Area, sFunc, fStartY); + NWNX_PushArgumentFloat(NWNX_Area, sFunc, fStartX); + NWNX_PushArgumentObject(NWNX_Area, sFunc, oArea); + + NWNX_CallFunction(NWNX_Area, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Area, sFunc); +} + +int NWNX_Area_GetMusicIsPlaying(object oArea, int bBattleMusic = FALSE) +{ + string sFunc = "GetMusicIsPlaying"; + + NWNX_PushArgumentInt(NWNX_Area, sFunc, bBattleMusic); + NWNX_PushArgumentObject(NWNX_Area, sFunc, oArea); + NWNX_CallFunction(NWNX_Area, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Area, sFunc); +} + +object NWNX_Area_CreateGenericTrigger(object oArea, float fX, float fY, float fZ, string sTag = "", float fSize = 1.0f) +{ + string sFunc = "CreateGenericTrigger"; + + NWNX_PushArgumentFloat(NWNX_Area, sFunc, fSize); + NWNX_PushArgumentString(NWNX_Area, sFunc, sTag); + NWNX_PushArgumentFloat(NWNX_Area, sFunc, fZ); + NWNX_PushArgumentFloat(NWNX_Area, sFunc, fY); + NWNX_PushArgumentFloat(NWNX_Area, sFunc, fX); + NWNX_PushArgumentObject(NWNX_Area, sFunc, oArea); + NWNX_CallFunction(NWNX_Area, sFunc); + + return NWNX_GetReturnValueObject(NWNX_Area, sFunc); +} + +void NWNX_Area_AddObjectToExclusionList(object oObject) +{ + string sFunc = "AddObjectToExclusionList"; + + NWNX_PushArgumentObject(NWNX_Area, sFunc, oObject); + NWNX_CallFunction(NWNX_Area, sFunc); +} + +void NWNX_Area_RemoveObjectFromExclusionList(object oObject) +{ + string sFunc = "RemoveObjectFromExclusionList"; + + NWNX_PushArgumentObject(NWNX_Area, sFunc, oObject); + NWNX_CallFunction(NWNX_Area, sFunc); +} + +int NWNX_Area_ExportGIT(object oArea, string sFileName = "", int bExportVarTable = TRUE, int bExportUUID = TRUE, int nObjectFilter = 0, string sAlias = "NWNX") +{ + string sFunc = "ExportGIT"; + + NWNX_PushArgumentString(NWNX_Area, sFunc, sAlias); + NWNX_PushArgumentInt(NWNX_Area, sFunc, nObjectFilter); + NWNX_PushArgumentInt(NWNX_Area, sFunc, bExportUUID); + NWNX_PushArgumentInt(NWNX_Area, sFunc, bExportVarTable); + NWNX_PushArgumentString(NWNX_Area, sFunc, sFileName); + NWNX_PushArgumentObject(NWNX_Area, sFunc, oArea); + NWNX_CallFunction(NWNX_Area, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Area, sFunc); +} + +struct NWNX_Area_TileInfo NWNX_Area_GetTileInfo(object oArea, float fTileX, float fTileY) +{ + string sFunc = "GetTileInfo"; + + NWNX_PushArgumentFloat(NWNX_Area, sFunc, fTileY); + NWNX_PushArgumentFloat(NWNX_Area, sFunc, fTileX); + NWNX_PushArgumentObject(NWNX_Area, sFunc, oArea); + NWNX_CallFunction(NWNX_Area, sFunc); + + struct NWNX_Area_TileInfo str; + + str.nGridY = NWNX_GetReturnValueInt(NWNX_Area, sFunc); + str.nGridX = NWNX_GetReturnValueInt(NWNX_Area, sFunc); + str.nOrientation = NWNX_GetReturnValueInt(NWNX_Area, sFunc); + str.nHeight = NWNX_GetReturnValueInt(NWNX_Area, sFunc); + str.nID = NWNX_GetReturnValueInt(NWNX_Area, sFunc); + + return str; +} + +int NWNX_Area_ExportARE(object oArea, string sFileName, string sNewName = "", string sNewTag = "", string sAlias = "NWNX") +{ + string sFunc = "ExportARE"; + + NWNX_PushArgumentString(NWNX_Area, sFunc, sAlias); + NWNX_PushArgumentString(NWNX_Area, sFunc, sNewTag); + NWNX_PushArgumentString(NWNX_Area, sFunc, sNewName); + NWNX_PushArgumentString(NWNX_Area, sFunc, sFileName); + NWNX_PushArgumentObject(NWNX_Area, sFunc, oArea); + NWNX_CallFunction(NWNX_Area, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Area, sFunc); +} diff --git a/gamma_age_v2/nwnx_chat.nss b/gamma_age_v2/nwnx_chat.nss new file mode 100644 index 00000000..90ca95e4 --- /dev/null +++ b/gamma_age_v2/nwnx_chat.nss @@ -0,0 +1,158 @@ +/// @addtogroup chat Chat +/// @brief Functions related to chat. +/// @{ +/// @file nwnx_chat.nss +#include "nwnx" + +const string NWNX_Chat = "NWNX_Chat"; ///< @private + +/// @name Chat Channels +/// @anchor chat_channels +/// +/// Constants defining the various chat channels. +/// @{ +const int NWNX_CHAT_CHANNEL_PLAYER_TALK = 1; +const int NWNX_CHAT_CHANNEL_PLAYER_SHOUT = 2; +const int NWNX_CHAT_CHANNEL_PLAYER_WHISPER = 3; +const int NWNX_CHAT_CHANNEL_PLAYER_TELL = 4; +const int NWNX_CHAT_CHANNEL_SERVER_MSG = 5; +const int NWNX_CHAT_CHANNEL_PLAYER_PARTY = 6; +const int NWNX_CHAT_CHANNEL_PLAYER_DM = 14; +const int NWNX_CHAT_CHANNEL_DM_TALK = 17; +const int NWNX_CHAT_CHANNEL_DM_SHOUT = 18; +const int NWNX_CHAT_CHANNEL_DM_WHISPER = 19; +const int NWNX_CHAT_CHANNEL_DM_TELL = 20; +const int NWNX_CHAT_CHANNEL_DM_PARTY = 22; +const int NWNX_CHAT_CHANNEL_DM_DM = 30; +/// @} + +/// @brief Sends a chat message. +/// @remark If no target is provided, then it broadcasts to all eligible targets. +/// @param channel The @ref chat_channels "channel" to send the message. +/// @param message The message to send. +/// @param sender The sender of the message. +/// @param target The receiver of the message. +/// @return TRUE if successful, FALSE otherwise. +int NWNX_Chat_SendMessage(int channel, string message, object sender = OBJECT_SELF, object target = OBJECT_INVALID); + +/// @brief Registers the script which receives all chat messages. +/// @note If a script was previously registered, this one will take over. +/// @param script The script name to handle the chat events. +void NWNX_Chat_RegisterChatScript(string script); + +/// @brief Skips a chat message +/// @note Must be called from a chat or system script handler. +void NWNX_Chat_SkipMessage(); + +/// @brief Gets the chat @ref chat_channels "channel". +/// @note Must be called from a chat or system script handler. +/// @return The @ref chat_channels "channel" the message is sent. +int NWNX_Chat_GetChannel(); + +/// @brief Gets the message. +/// @note Must be called from a chat or system script handler. +/// @return The message sent. +string NWNX_Chat_GetMessage(); + +/// @brief Gets the sender of the message. +/// @note Must be called from a chat or system script handler. +/// @return The object sending the message. +object NWNX_Chat_GetSender(); + +/// @brief Gets the target of the message. +/// @note Must be called from an chat or system script handler. +/// @return The target of the message or OBJECT_INVALID if no target. +object NWNX_Chat_GetTarget(); + +/// @brief Sets the distance with which the player hears talks or whispers. +/// @remark Per player settings override server wide. +/// @param distance The distance in meters. +/// @param listener The listener, if OBJECT_INVALID then it will be set server wide. +/// @param channel The @ref chat_channels "channel" to modify the distance heard. Only applicable for talk and whisper. +void NWNX_Chat_SetChatHearingDistance(float distance, object listener = OBJECT_INVALID, int channel = NWNX_CHAT_CHANNEL_PLAYER_TALK); + +/// @brief Gets the distance with which the player hears talks or whisper +/// @param listener The listener, if OBJECT_INVALID then will return server wide setting. +/// @param channel The @ref chat_channels "channel". Only applicable for talk and whisper. +float NWNX_Chat_GetChatHearingDistance(object listener = OBJECT_INVALID, int channel = NWNX_CHAT_CHANNEL_PLAYER_TALK); + +/// @} + +int NWNX_Chat_SendMessage(int channel, string message, object sender = OBJECT_SELF, object target = OBJECT_INVALID) +{ + string sFunc = "SendMessage"; + + NWNX_PushArgumentObject(NWNX_Chat, sFunc, target); + NWNX_PushArgumentObject(NWNX_Chat, sFunc, sender); + NWNX_PushArgumentString(NWNX_Chat, sFunc, message); + NWNX_PushArgumentInt(NWNX_Chat, sFunc, channel); + NWNX_CallFunction(NWNX_Chat, sFunc); + return NWNX_GetReturnValueInt(NWNX_Chat, sFunc); +} + +void NWNX_Chat_RegisterChatScript(string script) +{ + string sFunc = "RegisterChatScript"; + + NWNX_PushArgumentString(NWNX_Chat, sFunc, script); + NWNX_CallFunction(NWNX_Chat, sFunc); +} + +void NWNX_Chat_SkipMessage() +{ + string sFunc = "SkipMessage"; + + NWNX_CallFunction(NWNX_Chat, sFunc); +} + +int NWNX_Chat_GetChannel() +{ + string sFunc = "GetChannel"; + + NWNX_CallFunction(NWNX_Chat, sFunc); + return NWNX_GetReturnValueInt(NWNX_Chat, sFunc); +} + +string NWNX_Chat_GetMessage() +{ + string sFunc = "GetMessage"; + + NWNX_CallFunction(NWNX_Chat, sFunc); + return NWNX_GetReturnValueString(NWNX_Chat, sFunc); +} + +object NWNX_Chat_GetSender() +{ + string sFunc = "GetSender"; + + NWNX_CallFunction(NWNX_Chat, sFunc); + return NWNX_GetReturnValueObject(NWNX_Chat, sFunc); +} + +object NWNX_Chat_GetTarget() +{ + string sFunc = "GetTarget"; + + NWNX_CallFunction(NWNX_Chat, sFunc); + return NWNX_GetReturnValueObject(NWNX_Chat, sFunc); +} + +void NWNX_Chat_SetChatHearingDistance(float distance, object listener = OBJECT_INVALID, int channel = NWNX_CHAT_CHANNEL_PLAYER_TALK) +{ + string sFunc = "SetChatHearingDistance"; + + NWNX_PushArgumentInt(NWNX_Chat, sFunc, channel); + NWNX_PushArgumentObject(NWNX_Chat, sFunc, listener); + NWNX_PushArgumentFloat(NWNX_Chat, sFunc, distance); + NWNX_CallFunction(NWNX_Chat, sFunc); +} + +float NWNX_Chat_GetChatHearingDistance(object listener = OBJECT_INVALID, int channel = NWNX_CHAT_CHANNEL_PLAYER_TALK) +{ + string sFunc = "GetChatHearingDistance"; + + NWNX_PushArgumentInt(NWNX_Chat, sFunc, channel); + NWNX_PushArgumentObject(NWNX_Chat, sFunc, listener); + NWNX_CallFunction(NWNX_Chat, sFunc); + return NWNX_GetReturnValueFloat(NWNX_Chat, sFunc); +} diff --git a/gamma_age_v2/nwnx_consts.nss b/gamma_age_v2/nwnx_consts.nss new file mode 100644 index 00000000..3562ec79 --- /dev/null +++ b/gamma_age_v2/nwnx_consts.nss @@ -0,0 +1,182 @@ +/// @ingroup nwnx +/// @addtogroup consts NWNX Constants +/// @brief Provides various NWScript <-> Engine Constants Translation Table functions +/// @{ +/// @file nwnx_consts.nss + +/// @brief Translates ANIMATION_LOOPING_* and ANIMATION_FIREFORGET_* constants to their engine equivalent. +/// @param nAnimation The nwn animation constant +/// @return The engine equivalent of the constant +int NWNX_Consts_TranslateNWScriptAnimation(int nAnimation); + +/// @brief Translates engine animation constants to their ANIMATION_LOOPING_* and ANIMATION_FIREFORGET_* equivalent. +/// @param nAnimation The engine animation constant +/// @return The NWScript equivalent of the constant or -1 if a nwscript equivalent doesn't exist +int NWNX_Consts_TranslateEngineAnimation(int nAnimation); + +/// @brief Translates OBJECT_TYPE_* constants to their engine equivalent. +/// @param nObjectType The nwn object type +/// @return The engine equivalent of the constant +int NWNX_Consts_TranslateNWScriptObjectType(int nObjectType); + + +int NWNX_Consts_TranslateNWScriptAnimation(int nAnimation) +{ + switch (nAnimation) + { + case ANIMATION_LOOPING_PAUSE: nAnimation = 0; break; + case ANIMATION_LOOPING_PAUSE2: nAnimation = 52; break; + case ANIMATION_LOOPING_LISTEN: nAnimation = 30; break; + case ANIMATION_LOOPING_MEDITATE: nAnimation = 32; break; + case ANIMATION_LOOPING_WORSHIP: nAnimation = 33; break; + case ANIMATION_LOOPING_LOOK_FAR: nAnimation = 48; break; + case ANIMATION_LOOPING_SIT_CHAIR: nAnimation = 36; break; + case ANIMATION_LOOPING_SIT_CROSS: nAnimation = 47; break; + case ANIMATION_LOOPING_TALK_NORMAL: nAnimation = 38; break; + case ANIMATION_LOOPING_TALK_PLEADING: nAnimation = 39; break; + case ANIMATION_LOOPING_TALK_FORCEFUL: nAnimation = 40; break; + case ANIMATION_LOOPING_TALK_LAUGHING: nAnimation = 41; break; + case ANIMATION_LOOPING_GET_LOW: nAnimation = 59; break; + case ANIMATION_LOOPING_GET_MID: nAnimation = 60; break; + case ANIMATION_LOOPING_PAUSE_TIRED: nAnimation = 57; break; + case ANIMATION_LOOPING_PAUSE_DRUNK: nAnimation = 58; break; + case ANIMATION_LOOPING_DEAD_FRONT: nAnimation = 6; break; + case ANIMATION_LOOPING_DEAD_BACK: nAnimation = 8; break; + case ANIMATION_LOOPING_CONJURE1: nAnimation = 15; break; + case ANIMATION_LOOPING_CONJURE2: nAnimation = 16; break; + case ANIMATION_LOOPING_SPASM: nAnimation = 93; break; + case ANIMATION_LOOPING_CUSTOM1: nAnimation = 97; break; + case ANIMATION_LOOPING_CUSTOM2: nAnimation = 98; break; + case ANIMATION_LOOPING_CUSTOM3: nAnimation = 101; break; + case ANIMATION_LOOPING_CUSTOM4: nAnimation = 102; break; + case ANIMATION_LOOPING_CUSTOM5: nAnimation = 103; break; + case ANIMATION_LOOPING_CUSTOM6: nAnimation = 104; break; + case ANIMATION_LOOPING_CUSTOM7: nAnimation = 105; break; + case ANIMATION_LOOPING_CUSTOM8: nAnimation = 106; break; + case ANIMATION_LOOPING_CUSTOM9: nAnimation = 107; break; + case ANIMATION_LOOPING_CUSTOM10: nAnimation = 108; break; + case ANIMATION_LOOPING_CUSTOM11: nAnimation = 109; break; + case ANIMATION_LOOPING_CUSTOM12: nAnimation = 110; break; + case ANIMATION_LOOPING_CUSTOM13: nAnimation = 111; break; + case ANIMATION_LOOPING_CUSTOM14: nAnimation = 112; break; + case ANIMATION_LOOPING_CUSTOM15: nAnimation = 113; break; + case ANIMATION_LOOPING_CUSTOM16: nAnimation = 114; break; + case ANIMATION_LOOPING_CUSTOM17: nAnimation = 115; break; + case ANIMATION_LOOPING_CUSTOM18: nAnimation = 116; break; + case ANIMATION_LOOPING_CUSTOM19: nAnimation = 117; break; + case ANIMATION_LOOPING_CUSTOM20: nAnimation = 118; break; + case ANIMATION_MOUNT1: nAnimation = 119; break; + case ANIMATION_DISMOUNT1: nAnimation = 120; break; + case ANIMATION_FIREFORGET_HEAD_TURN_LEFT: nAnimation = 53; break; + case ANIMATION_FIREFORGET_HEAD_TURN_RIGHT: nAnimation = 54; break; + case ANIMATION_FIREFORGET_PAUSE_SCRATCH_HEAD: nAnimation = 55; break; + case ANIMATION_FIREFORGET_PAUSE_BORED: nAnimation = 56; break; + case ANIMATION_FIREFORGET_SALUTE: nAnimation = 34; break; + case ANIMATION_FIREFORGET_BOW: nAnimation = 35; break; + case ANIMATION_FIREFORGET_STEAL: nAnimation = 37; break; + case ANIMATION_FIREFORGET_GREETING: nAnimation = 29; break; + case ANIMATION_FIREFORGET_TAUNT: nAnimation = 28; break; + case ANIMATION_FIREFORGET_VICTORY1: nAnimation = 44; break; + case ANIMATION_FIREFORGET_VICTORY2: nAnimation = 45; break; + case ANIMATION_FIREFORGET_VICTORY3: nAnimation = 46; break; + case ANIMATION_FIREFORGET_READ: nAnimation = 71; break; + case ANIMATION_FIREFORGET_DRINK: nAnimation = 70; break; + case ANIMATION_FIREFORGET_DODGE_SIDE: nAnimation = 90; break; + case ANIMATION_FIREFORGET_DODGE_DUCK: nAnimation = 91; break; + case ANIMATION_FIREFORGET_SPASM: nAnimation = 23; break; + default: nAnimation = 0; break; + } + + return nAnimation; +} + +int NWNX_Consts_TranslateEngineAnimation(int nAnimation) +{ + switch (nAnimation) + { + case 0: nAnimation = ANIMATION_LOOPING_PAUSE; break; + case 52: nAnimation = ANIMATION_LOOPING_PAUSE2; break; + case 30: nAnimation = ANIMATION_LOOPING_LISTEN; break; + case 32: nAnimation = ANIMATION_LOOPING_MEDITATE; break; + case 33: nAnimation = ANIMATION_LOOPING_WORSHIP; break; + case 48: nAnimation = ANIMATION_LOOPING_LOOK_FAR; break; + case 36: nAnimation = ANIMATION_LOOPING_SIT_CHAIR; break; + case 47: nAnimation = ANIMATION_LOOPING_SIT_CROSS; break; + case 38: nAnimation = ANIMATION_LOOPING_TALK_NORMAL; break; + case 39: nAnimation = ANIMATION_LOOPING_TALK_PLEADING; break; + case 40: nAnimation = ANIMATION_LOOPING_TALK_FORCEFUL; break; + case 41: nAnimation = ANIMATION_LOOPING_TALK_LAUGHING; break; + case 59: nAnimation = ANIMATION_LOOPING_GET_LOW; break; + case 60: nAnimation = ANIMATION_LOOPING_GET_MID; break; + case 57: nAnimation = ANIMATION_LOOPING_PAUSE_TIRED; break; + case 58: nAnimation = ANIMATION_LOOPING_PAUSE_DRUNK; break; + case 6: nAnimation = ANIMATION_LOOPING_DEAD_FRONT; break; + case 8: nAnimation = ANIMATION_LOOPING_DEAD_BACK; break; + case 15: nAnimation = ANIMATION_LOOPING_CONJURE1; break; + case 16: nAnimation = ANIMATION_LOOPING_CONJURE2; break; + case 93: nAnimation = ANIMATION_LOOPING_SPASM; break; + case 97: nAnimation = ANIMATION_LOOPING_CUSTOM1; break; + case 98: nAnimation = ANIMATION_LOOPING_CUSTOM2; break; + case 101: nAnimation = ANIMATION_LOOPING_CUSTOM3; break; + case 102: nAnimation = ANIMATION_LOOPING_CUSTOM4; break; + case 103: nAnimation = ANIMATION_LOOPING_CUSTOM5; break; + case 104: nAnimation = ANIMATION_LOOPING_CUSTOM6; break; + case 105: nAnimation = ANIMATION_LOOPING_CUSTOM7; break; + case 106: nAnimation = ANIMATION_LOOPING_CUSTOM8; break; + case 107: nAnimation = ANIMATION_LOOPING_CUSTOM9; break; + case 108: nAnimation = ANIMATION_LOOPING_CUSTOM10; break; + case 109: nAnimation = ANIMATION_LOOPING_CUSTOM11; break; + case 110: nAnimation = ANIMATION_LOOPING_CUSTOM12; break; + case 111: nAnimation = ANIMATION_LOOPING_CUSTOM13; break; + case 112: nAnimation = ANIMATION_LOOPING_CUSTOM14; break; + case 113: nAnimation = ANIMATION_LOOPING_CUSTOM15; break; + case 114: nAnimation = ANIMATION_LOOPING_CUSTOM16; break; + case 115: nAnimation = ANIMATION_LOOPING_CUSTOM17; break; + case 116: nAnimation = ANIMATION_LOOPING_CUSTOM18; break; + case 117: nAnimation = ANIMATION_LOOPING_CUSTOM19; break; + case 118: nAnimation = ANIMATION_LOOPING_CUSTOM20; break; + case 119: nAnimation = ANIMATION_MOUNT1; break; + case 120: nAnimation = ANIMATION_DISMOUNT1; break; + case 53: nAnimation = ANIMATION_FIREFORGET_HEAD_TURN_LEFT; break; + case 54: nAnimation = ANIMATION_FIREFORGET_HEAD_TURN_RIGHT; break; + case 55: nAnimation = ANIMATION_FIREFORGET_PAUSE_SCRATCH_HEAD; break; + case 56: nAnimation = ANIMATION_FIREFORGET_PAUSE_BORED; break; + case 34: nAnimation = ANIMATION_FIREFORGET_SALUTE; break; + case 35: nAnimation = ANIMATION_FIREFORGET_BOW; break; + case 37: nAnimation = ANIMATION_FIREFORGET_STEAL; break; + case 29: nAnimation = ANIMATION_FIREFORGET_GREETING; break; + case 28: nAnimation = ANIMATION_FIREFORGET_TAUNT; break; + case 44: nAnimation = ANIMATION_FIREFORGET_VICTORY1; break; + case 45: nAnimation = ANIMATION_FIREFORGET_VICTORY2; break; + case 46: nAnimation = ANIMATION_FIREFORGET_VICTORY3; break; + case 71: nAnimation = ANIMATION_FIREFORGET_READ; break; + case 70: nAnimation = ANIMATION_FIREFORGET_DRINK; break; + case 90: nAnimation = ANIMATION_FIREFORGET_DODGE_SIDE; break; + case 91: nAnimation = ANIMATION_FIREFORGET_DODGE_DUCK; break; + case 23: nAnimation = ANIMATION_FIREFORGET_SPASM; break; + default: nAnimation = -1; break; + } + + return nAnimation; +} + +int NWNX_Consts_TranslateNWScriptObjectType(int nObjectType) +{ + switch(nObjectType) + { + case OBJECT_TYPE_ALL: nObjectType = 0; break; + case OBJECT_TYPE_AREA_OF_EFFECT: nObjectType = 11; break; + case OBJECT_TYPE_CREATURE: nObjectType = 5; break; + case OBJECT_TYPE_DOOR: nObjectType = 10; break; + case OBJECT_TYPE_ENCOUNTER: nObjectType = 13; break; + case OBJECT_TYPE_ITEM: nObjectType = 6; break; + case OBJECT_TYPE_PLACEABLE: nObjectType = 9; break; + case OBJECT_TYPE_STORE: nObjectType = 14; break; + case OBJECT_TYPE_TRIGGER: nObjectType = 7; break; + case OBJECT_TYPE_WAYPOINT: nObjectType = 12; break; + default: nObjectType = 0; break; + } + + return nObjectType; +} +/// @} // End of consts diff --git a/gamma_age_v2/nwnx_creature.nss b/gamma_age_v2/nwnx_creature.nss new file mode 100644 index 00000000..0e3486a1 --- /dev/null +++ b/gamma_age_v2/nwnx_creature.nss @@ -0,0 +1,2150 @@ +/// @addtogroup creature Creature +/// @brief Functions exposing additional creature properties. +/// @{ +/// @file nwnx_creature.nss +#include "nwnx" + +const string NWNX_Creature = "NWNX_Creature"; ///< @private + +/// @name Creature Movement Rates +/// @anchor creature_movement_rates +/// +/// The various types of movement rates. +/// @{ +const int NWNX_CREATURE_MOVEMENT_RATE_PC = 0; +const int NWNX_CREATURE_MOVEMENT_RATE_IMMOBILE = 1; +const int NWNX_CREATURE_MOVEMENT_RATE_VERY_SLOW = 2; +const int NWNX_CREATURE_MOVEMENT_RATE_SLOW = 3; +const int NWNX_CREATURE_MOVEMENT_RATE_NORMAL = 4; +const int NWNX_CREATURE_MOVEMENT_RATE_FAST = 5; +const int NWNX_CREATURE_MOVEMENT_RATE_VERY_FAST = 6; +const int NWNX_CREATURE_MOVEMENT_RATE_DEFAULT = 7; +const int NWNX_CREATURE_MOVEMENT_RATE_DM_FAST = 8; +/// @} + +/// @name Creature Movement Types +/// @anchor creature_movement_types +/// +/// The various types of movement types. +/// @{ +const int NWNX_CREATURE_MOVEMENT_TYPE_STATIONARY = 0; +const int NWNX_CREATURE_MOVEMENT_TYPE_WALK = 1; +const int NWNX_CREATURE_MOVEMENT_TYPE_RUN = 2; +const int NWNX_CREATURE_MOVEMENT_TYPE_SIDESTEP = 3; +const int NWNX_CREATURE_MOVEMENT_TYPE_WALK_BACKWARDS = 4; +/// @} + +/// @name Cleric Domains +/// @anchor cleric_domains +/// +/// The clerical domains. +/// @{ +const int NWNX_CREATURE_CLERIC_DOMAIN_AIR = 0; +const int NWNX_CREATURE_CLERIC_DOMAIN_ANIMAL = 1; +const int NWNX_CREATURE_CLERIC_DOMAIN_DEATH = 3; +const int NWNX_CREATURE_CLERIC_DOMAIN_DESTRUCTION = 4; +const int NWNX_CREATURE_CLERIC_DOMAIN_EARTH = 5; +const int NWNX_CREATURE_CLERIC_DOMAIN_EVIL = 6; +const int NWNX_CREATURE_CLERIC_DOMAIN_FIRE = 7; +const int NWNX_CREATURE_CLERIC_DOMAIN_GOOD = 8; +const int NWNX_CREATURE_CLERIC_DOMAIN_HEALING = 9; +const int NWNX_CREATURE_CLERIC_DOMAIN_KNOWLEDGE = 10; +const int NWNX_CREATURE_CLERIC_DOMAIN_MAGIC = 13; +const int NWNX_CREATURE_CLERIC_DOMAIN_PLANT = 14; +const int NWNX_CREATURE_CLERIC_DOMAIN_PROTECTION = 15; +const int NWNX_CREATURE_CLERIC_DOMAIN_STRENGTH = 16; +const int NWNX_CREATURE_CLERIC_DOMAIN_SUN = 17; +const int NWNX_CREATURE_CLERIC_DOMAIN_TRAVEL = 18; +const int NWNX_CREATURE_CLERIC_DOMAIN_TRICKERY = 19; +const int NWNX_CREATURE_CLERIC_DOMAIN_WAR = 20; +const int NWNX_CREATURE_CLERIC_DOMAIN_WATER = 21; +/// @} + +/// @name Bonus Types +/// @anchor bonus_types +/// +/// Used with NWNX_Creature_GetTotalEffectBonus() these are the types of temporary bonuses from effects. +/// @{ +const int NWNX_CREATURE_BONUS_TYPE_ATTACK = 1; +const int NWNX_CREATURE_BONUS_TYPE_DAMAGE = 2; +const int NWNX_CREATURE_BONUS_TYPE_SAVING_THROW = 3; +const int NWNX_CREATURE_BONUS_TYPE_ABILITY = 4; +const int NWNX_CREATURE_BONUS_TYPE_SKILL = 5; +const int NWNX_CREATURE_BONUS_TYPE_TOUCH_ATTACK = 6; +/// @} + +/// @struct NWNX_Creature_SpecialAbility +/// @brief A creature special ability. +struct NWNX_Creature_SpecialAbility +{ + int id; ///< The spell id + int ready; ///< Whether it can be used + int level; ///< The level of the ability +}; + +/// @struct NWNX_Creature_MemorisedSpell +/// @brief A memorised spell structure. +struct NWNX_Creature_MemorisedSpell +{ + int id; ///< Spell ID + int ready; ///< Whether the spell can be cast + int meta; ///< Metamagic type, if any + int domain; ///< Clerical domain, if any +}; + +/// @brief Gives the creature a feat. +/// @param creature The creature object. +/// @param feat The feat id. +/// @remark Consider also using NWNX_Creature_AddFeatByLevel() to properly allocate the feat to a level +void NWNX_Creature_AddFeat(object creature, int feat); + +/// @brief Gives the creature a feat assigned at a level +/// @param creature The creature object. +/// @param feat The feat id. +/// @param level The level they gained the feat. +/// @remark Adds the feat to the stat list at the provided level. +void NWNX_Creature_AddFeatByLevel(object creature, int feat, int level); + +/// @brief Removes a feat from a creature. +/// @param creature The creature object. +/// @param feat The feat id. +void NWNX_Creature_RemoveFeat(object creature, int feat); + +/// @brief Determines if the creature knows a feat. +/// @note This differs from native @nwn{GetHasFeat} which returns FALSE if the feat has no more uses per day. +/// @param creature The creature object. +/// @param feat The feat id. +/// @return TRUE if the creature has the feat, regardless if they have any usages left or not. +int NWNX_Creature_GetKnowsFeat(object creature, int feat); + +/// @brief Returns the count of feats learned at the provided level. +/// @param creature The creature object. +/// @param level The level. +/// @return The count of feats. +int NWNX_Creature_GetFeatCountByLevel(object creature, int level); + +/// @brief Returns the feat learned at the level and index. +/// @param creature The creature object. +/// @param level The level. +/// @param index The index. Index bounds: 0 <= index < NWNX_Creature_GetFeatCountByLevel(). +/// @return The feat id at the index. +int NWNX_Creature_GetFeatByLevel(object creature, int level, int index); + +/// @brief Returns the creature level where the specified feat was learned. +/// @param creature The creature object. +/// @param feat The feat id. +/// @return The character level that the specified feat was granted, otherwise 0 if the creature does not have this feat. +int NWNX_Creature_GetFeatGrantLevel(object creature, int feat); + +/// @brief Get the total number of feats known by creature. +/// @param creature The creature object. +/// @return The total feat count for the creature. +int NWNX_Creature_GetFeatCount(object creature); + +/// @brief Returns the creature's feat at a given index +/// @param creature The creature object. +/// @param index The index. Index bounds: 0 <= index < NWNX_Creature_GetFeatCount(); +/// @return The feat id at the index. +int NWNX_Creature_GetFeatByIndex(object creature, int index); + +/// @brief Gets if creature meets feat requirements. +/// @param creature The creature object. +/// @param feat The feat id. +/// @return TRUE if creature meets all requirements to take given feat +int NWNX_Creature_GetMeetsFeatRequirements(object creature, int feat); + +/// @brief Gets the count of special abilities of the creature. +/// @param creature The creature object. +/// @return The total special ability count. +int NWNX_Creature_GetSpecialAbilityCount(object creature); + +/// @brief Returns the creature's special ability at a given index. +/// @param creature The creature object. +/// @param index The index. Index bounds: 0 <= index < NWNX_Creature_GetSpecialAbilityCount(). +/// @return An NWNX_Creature_SpecialAbility struct. +struct NWNX_Creature_SpecialAbility NWNX_Creature_GetSpecialAbility(object creature, int index); + +/// @brief Adds a special ability to a creature. +/// @param creature The creature object. +/// @param ability An NWNX_Creature_SpecialAbility struct. +void NWNX_Creature_AddSpecialAbility(object creature, struct NWNX_Creature_SpecialAbility ability); + +/// @brief Removes a special ability from a creature. +/// @param creature The creature object. +/// @param index The index. Index bounds: 0 <= index < NWNX_Creature_GetSpecialAbilityCount(). +void NWNX_Creature_RemoveSpecialAbility(object creature, int index); + +/// @brief Sets a special ability at the index for the creature. +/// @param creature The creature object. +/// @param index The index. Index bounds: 0 <= index < NWNX_Creature_GetSpecialAbilityCount(). +/// @param ability An NWNX_Creature_SpecialAbility struct. +void NWNX_Creature_SetSpecialAbility(object creature, int index, struct NWNX_Creature_SpecialAbility ability); + +/// @brief Get the class taken by the creature at the provided level. +/// @param creature The creature object. +/// @param level The level. +/// @return The class id. +int NWNX_Creature_GetClassByLevel(object creature, int level); + +/// @brief Sets the base AC for the creature. +/// @param creature The creature object. +/// @param ac The base AC to set for the creature. +void NWNX_Creature_SetBaseAC(object creature, int ac); + +/// @brief Get the base AC for the creature. +/// @param creature The creature object. +/// @return The base AC. +int NWNX_Creature_GetBaseAC(object creature); + +/// @brief Sets the ability score of the creature to the provided value. +/// @note Does not apply racial bonuses/penalties. +/// @param creature The creature object. +/// @param ability The ability constant. +/// @param value The value to set. +void NWNX_Creature_SetRawAbilityScore(object creature, int ability, int value); + +/// @brief Gets the ability score of the creature. +/// @note Does not apply racial bonuses/penalties. +/// @param creature The creature object. +/// @param ability The ability constant. +/// @return The ability score. +int NWNX_Creature_GetRawAbilityScore(object creature, int ability); + +/// @brief Adjusts the ability score of a creature. +/// @note Does not apply racial bonuses/penalties. +/// @param creature The creature object. +/// @param ability The ability constant. +/// @param modifier The modifier value. +void NWNX_Creature_ModifyRawAbilityScore(object creature, int ability, int modifier); + +/// @brief Gets the raw ability score a polymorphed creature had prior to polymorphing. +/// @note For Strength, Dexterity and Constitution only. +/// @param creature The creature object. +/// @param ability The ability constant. +/// @return The raw ability score. +int NWNX_Creature_GetPrePolymorphAbilityScore(object creature, int ability); + +/// @brief Gets the count of memorised spells for a creature's class at a level. +/// @param creature The creature object. +/// @param class The class id from classes.2da. (Not class index 0-2) +/// @param level The spell level. +/// @return The memorised spell count. +int NWNX_Creature_GetMemorisedSpellCountByLevel(object creature, int class, int level); + +/// @brief Gets the memorised spell at a class level's index. +/// @param creature The creature object. +/// @param class The class id from classes.2da. (Not class index 0-2) +/// @param level The spell level. +/// @param index The index. Index bounds: 0 <= index < NWNX_Creature_GetMemorisedSpellCountByLevel(). +/// @return An NWNX_Creature_MemorisedSpell() struct. +struct NWNX_Creature_MemorisedSpell NWNX_Creature_GetMemorisedSpell(object creature, int class, int level, int index); + +/// @brief Sets the memorised spell at a class level's index. +/// @param creature The creature object. +/// @param class The class id from classes.2da. (Not class index 0-2) +/// @param level The spell level. +/// @param index The index. Index bounds: 0 <= index < NWNX_Creature_GetMemorisedSpellCountByLevel(). +/// @param spell An NWNX_Creature_MemorisedSpell() struct. +void NWNX_Creature_SetMemorisedSpell(object creature, int class, int level, int index, struct NWNX_Creature_MemorisedSpell spell); + +/// @brief Gets the remaining spell slots (innate casting) at a class level's index. +/// @param creature The creature object. +/// @param class The class id from classes.2da. (Not class index 0-2) +/// @param level The spell level. +/// @return The remaining spell slot count. +int NWNX_Creature_GetRemainingSpellSlots(object creature, int class, int level); + +/// @brief Sets the remaining spell slots (innate casting) at a class level. +/// @param creature The creature object. +/// @param class The class id from classes.2da. (Not class index 0-2) +/// @param level The spell level. +/// @param slots The remaining spell slots to set. +void NWNX_Creature_SetRemainingSpellSlots(object creature, int class, int level, int slots); + +/// @brief Gets the maximum spell slots (innate casting) at a class level. +/// @param creature The creature object. +/// @param class The class id from classes.2da. (Not class index 0-2) +/// @param level The spell level. +/// @return The maximum spell slot count. +int NWNX_Creature_GetMaxSpellSlots(object creature, int class, int level); + +/// @brief Gets the known spell count (innate casting) at a class level. +/// @param creature The creature object. +/// @param class The class id from classes.2da. (Not class index 0-2) +/// @param level The spell level. +/// @return The known spell count. +int NWNX_Creature_GetKnownSpellCount(object creature, int class, int level); + +/// @brief Gets the known spell at a class level's index. +/// @param creature The creature object. +/// @param class The class id from classes.2da. (Not class index 0-2) +/// @param level The spell level. +/// @param index The index. Index bounds: 0 <= index < NWNX_Creature_GetKnownSpellCount(). +/// @return The spell id. +int NWNX_Creature_GetKnownSpell(object creature, int class, int level, int index); + +/// @brief Add a spell to a creature's spellbook for class. +/// @param creature The creature object. +/// @param class The class id from classes.2da. (Not class index 0-2) +/// @param level The spell level. +/// @param spellId The spell to remove. +void NWNX_Creature_AddKnownSpell(object creature, int class, int level, int spellId); + +/// @brief Remove a spell from creature's spellbook for class. +/// @param creature The creature object. +/// @param class The class id from classes.2da. (Not class index 0-2) +/// @param level The spell level. +/// @param spellId The spell to remove. +void NWNX_Creature_RemoveKnownSpell(object creature, int class, int level, int spellId); + +/// @brief Clear a specific spell from the creature's spellbook for class +/// @param creature The creature object. +/// @param class The class id from classes.2da. (Not class index 0-2) +/// @param spellId The spell to clear. +void NWNX_Creature_ClearMemorisedKnownSpells(object creature, int class, int spellId); + +/// @brief Clear the memorised spell of the creature for the class, level and index. +/// @param creature The creature object. +/// @param class The class id from classes.2da. (Not class index 0-2) +/// @param level The spell level. +/// @param index The index. Index bounds: 0 <= index < NWNX_Creature_GetMemorisedSpellCountByLevel(). +void NWNX_Creature_ClearMemorisedSpell(object creature, int class, int level, int index); + +/// @brief Gets the maximum hit points for creature for level. +/// @param creature The creature object. +/// @param level The level. +/// @return The maximum hit points a creature can have for the class at the provided level. +int NWNX_Creature_GetMaxHitPointsByLevel(object creature, int level); + +/// @brief Sets the maximum hit points for creature. +/// @param creature The creature object. +/// @param level The level. +/// @param value The amount to set the max hit points. +void NWNX_Creature_SetMaxHitPointsByLevel(object creature, int level, int value); + +/// @brief Set creature's movement rate. +/// @param creature The creature object. +/// @param rate The movement rate. +void NWNX_Creature_SetMovementRate(object creature, int rate); + +/// @brief Returns the creature's current movement rate factor. +/// @remark Base movement rate factor is 1.0. +/// @param creature The creature object. +/// @return The current movement rate factor. +float NWNX_Creature_GetMovementRateFactor(object creature); + +/// @brief Sets the creature's current movement rate factor. +/// @note Base movement rate factor is 1.0. +/// @param creature The creature object. +/// @param rate The rate to set. +void NWNX_Creature_SetMovementRateFactor(object creature, float rate); + +/// @brief Sets the creature's maximum movement rate cap. +/// @note Default movement rate cap is 1.5. +/// @param creature The creature object. +/// @param cap The cap to set. +void NWNX_Creature_SetMovementRateFactorCap(object creature, float cap); + +/// @brief Returns the creature's current movement type +/// @param creature The creature object. +/// @return An NWNX_CREATURE_MOVEMENT_TYPE_* constant. +int NWNX_Creature_GetMovementType(object creature); + +/// @brief Sets the maximum movement rate a creature can have while walking (not running) +/// @remark This allows a creature with movement speed enhancements to walk at a normal rate. +/// @param creature The creature object. +/// @param fWalkRate The walk rate to apply. Setting the value to -1.0 will remove the cap. +/// Default value is 2000.0, which is the base human walk speed. +void NWNX_Creature_SetWalkRateCap(object creature, float fWalkRate = 2000.0f); + +/// @brief Set creature's raw good/evil alignment value. +/// @param creature The creature object. +/// @param value The value to set. +void NWNX_Creature_SetAlignmentGoodEvil(object creature, int value); + +/// @brief Set creature's raw law/chaos alignment value. +/// @param creature The creature object. +/// @param value The value to set. +void NWNX_Creature_SetAlignmentLawChaos(object creature, int value); + +/// @brief Get the soundset index for creature. +/// @param creature The creature object. +/// @return The soundset used by the creature. +int NWNX_Creature_GetSoundset(object creature); + +/// @brief Set the soundset index for creature. +/// @param creature The creature object. +/// @param soundset The soundset index. +void NWNX_Creature_SetSoundset(object creature, int soundset); + +/// @brief Set the base ranks in a skill for creature +/// @param creature The creature object. +/// @param skill The skill id. +/// @param rank The value to set as the skill rank. +void NWNX_Creature_SetSkillRank(object creature, int skill, int rank); + +/// @brief Set the class ID in a particular position for a creature. +/// @param creature The creature object. +/// @param position Should be 0, 1, or 2 depending on how many classes the creature +/// has and which is to be modified. +/// @param classID A valid ID number in classes.2da and between 0 and 255. +void NWNX_Creature_SetClassByPosition(object creature, int position, int classID); + +/// @brief Set the level at the given position for a creature. +/// @note A creature should already have a class in that position. +/// @param creature The creature object. +/// @param position Should be 0, 1, or 2 depending on how many classes the creature +/// has and which is to be modified. +/// @param level The level to set. +void NWNX_Creature_SetLevelByPosition(object creature, int position, int level); + +/// @brief Set creature's base attack bonus (BAB). +/// @note Modifying the BAB will also affect the creature's attacks per round and its +/// eligibility for feats, prestige classes, etc. +/// @param creature The creature object. +/// @param bab The BAB value. Should be between 0 and 254. Setting BAB to 0 will cause the +/// creature to revert to its original BAB based on its classes and levels. A creature can +/// never have an actual BAB of zero. +/// @remark The base game has a function @nwn{SetBaseAttackBonus}, which actually sets +/// the bonus attacks per round for a creature, not the BAB. +void NWNX_Creature_SetBaseAttackBonus(object creature, int bab); + +/// @brief Gets the creatures current attacks per round (using equipped weapon). +/// @param creature The creature object. +/// @param bBaseAPR If TRUE, will return the base attacks per round, based on BAB and +/// equipped weapons, regardless of overrides set by calls to @nwn{SetBaseAttackBonus} builtin function. +/// @return The attacks per round. +int NWNX_Creature_GetAttacksPerRound(object creature, int bBaseAPR = FALSE); + +/// @brief Sets the creature gender. +/// @param creature The creature object. +/// @param gender The GENDER_ constant. +void NWNX_Creature_SetGender(object creature, int gender); + +/// @brief Restore all creature feat uses. +/// @param creature The creature object. +void NWNX_Creature_RestoreFeats(object creature); + +/// @brief Restore all creature special ability uses. +/// @param creature The creature object. +void NWNX_Creature_RestoreSpecialAbilities(object creature); + +/// @brief Restore all creature spells per day for given level. +/// @param creature The creature object. +/// @param level The level to restore. If -1, all spells are restored. +void NWNX_Creature_RestoreSpells(object creature, int level = -1); + +/// @brief Restore uses for all items carried by the creature. +/// @param creature The creature object. +void NWNX_Creature_RestoreItems(object creature); + +/// @brief Sets the creature size. +/// @param creature The creature object. +/// @param size Use CREATURE_SIZE_* constants. +void NWNX_Creature_SetSize(object creature, int size); + +/// @brief Gets the creature's remaining unspent skill points. +/// @param creature The creature object. +/// @return The remaining unspent skill points. +int NWNX_Creature_GetSkillPointsRemaining(object creature); + +/// @brief Sets the creature's remaining unspent skill points. +/// @param creature The creature object. +/// @param skillpoints The value to set. +void NWNX_Creature_SetSkillPointsRemaining(object creature, int skillpoints); + +/// @brief Sets the creature's racial type +/// @param creature The creature object. +/// @param racialtype The racial type to set. +void NWNX_Creature_SetRacialType(object creature, int racialtype); + +/// @brief Sets the creature's gold without sending a feedback message +/// @param creature The creature object. +/// @param gold The amount of gold to set for their creature. +void NWNX_Creature_SetGold(object creature, int gold); + +/// @brief Sets corpse decay time in milliseconds +/// @param creature The creature object. +/// @param nDecayTime The corpse decay time. +void NWNX_Creature_SetCorpseDecayTime(object creature, int nDecayTime); + +/// @brief Gets the creature's base save. +/// @param creature The creature object. +/// @param which One of SAVING_THROW_FORT, SAVING_THROW_REFLEX or SAVING_THROW_WILL +/// @return The base save value. +/// @note This will include any modifiers set in the toolset. +int NWNX_Creature_GetBaseSavingThrow(object creature, int which); + +/// @brief Sets the creature's base save. +/// @param creature The creature object. +/// @param which One of SAVING_THROW_FORT, SAVING_THROW_REFLEX or SAVING_THROW_WILL +/// @param value The base save value. +void NWNX_Creature_SetBaseSavingThrow(object creature, int which, int value); + +/// @brief Add levels of class to the creature, bypassing all validation +/// @param creature The creature object. +/// @param class The class id. +/// @param count The amount of levels of class to add. +/// @note This will not work on player characters. +void NWNX_Creature_LevelUp(object creature, int class, int count=1); + +/// @brief Remove last levels from a creature. +/// @param creature The creature object. +/// @param count The amount of levels to decrement. +/// @note This will not work on player characters. +void NWNX_Creature_LevelDown(object creature, int count=1); + +/// @brief Sets the creature's challenge rating +/// @param creature The creature object. +/// @param fCR The challenge rating. +void NWNX_Creature_SetChallengeRating(object creature, float fCR); + +/// @brief Returns the creature's highest attack bonus based on its own stats. +/// @note AB vs. Type and +AB on Gauntlets are excluded +/// @param creature The creature object. +/// @param isMelee +/// * TRUE: Get Melee/Unarmed Attack Bonus +/// * FALSE: Get Ranged Attack Bonus +/// * -1: Get Attack Bonus depending on the weapon creature has equipped in its right hand +/// Defaults to Melee Attack Bonus if weapon is invalid or no weapon +/// @param isTouchAttack If the attack was a touch attack. +/// @param isOffhand If the attack was with the offhand. +/// @param includeBaseAttackBonus Should the result include the base attack bonus. +/// @return The highest attack bonus. +int NWNX_Creature_GetAttackBonus(object creature, int isMelee = -1, int isTouchAttack = FALSE, int isOffhand = FALSE, int includeBaseAttackBonus = TRUE); + +/// @brief Get highest level version of feat possessed by creature. +/// @remark For feats that increment in power, for example, barbarian rage. +/// @param creature The creature object. +/// @param feat The feat id. +/// @return The highest level version of the feat. +int NWNX_Creature_GetHighestLevelOfFeat(object creature, int feat); + +/// @brief Get feat remaining uses. +/// @param creature The creature object. +/// @param feat The feat id. +/// @return The amount of remaining uses. +int NWNX_Creature_GetFeatRemainingUses(object creature, int feat); + +/// @brief Get feat total uses. +/// @param creature The creature object. +/// @param feat The feat id. +/// @return The total uses. +int NWNX_Creature_GetFeatTotalUses(object creature, int feat); + +/// @brief Set feat remaining uses. +/// @param creature The creature object. +/// @param feat The feat id. +/// @param uses The amount of remaining uses. +void NWNX_Creature_SetFeatRemainingUses(object creature, int feat, int uses); + +/// @brief Get total effect bonus +/// @remark This exposes the actual bonus value beyond a player's base scores to attack, damage bonus, saves, +/// skills, ability scores, and touch attack provided by spells, equipment, potions etc. +/// @param creature The creature object. +/// @param bonusType A @ref bonus_types "Bonus Type" +/// @param target A target object. Used to calculate bonuses versus specific races, alignments, etc. +/// @param isElemental If a damage bonus includes elemental damage. +/// @param isForceMax If the bonus should return the maximum possible. +/// @param savetype A SAVING_THROW_* constant. +/// @param saveSpecificType A SAVING_THROW_TYPE_* constant. +/// @param skill A skill id. +/// @param abilityScore An ABILITY_* constant. +/// @param isOffhand Whether the attack is an offhand attack. +/// @return The bonus value. +int NWNX_Creature_GetTotalEffectBonus(object creature, int bonusType=NWNX_CREATURE_BONUS_TYPE_ATTACK, object target=OBJECT_INVALID, int isElemental=0, int isForceMax=0, int savetype=-1, int saveSpecificType=-1, int skill=-1, int abilityScore=-1, int isOffhand=FALSE); + +/// @brief Set the original first or last name of creature +/// @param creature The creature object. +/// @param name The name to give the creature. +/// @param isLastName TRUE to change their last name, FALSE for first. +/// @note For PCs this will persist to the .bic file if saved. Requires a relog to update. +void NWNX_Creature_SetOriginalName(object creature, string name, int isLastName); + +/// @brief Get the original first or last name of creature +/// @param creature The creature object. +/// @param isLastName TRUE to get last name, FALSE for first name. +/// @return The original first or last name of the creature. +string NWNX_Creature_GetOriginalName(object creature, int isLastName); + +/// @brief Set creature's spell resistance +/// @param creature The creature object. +/// @param sr The spell resistance. +/// @warning This setting will be overwritten by effects and once those effects fade the old setting (typically 0) will be set. +void NWNX_Creature_SetSpellResistance(object creature, int sr); + +/// @brief Set creature's animal companion creature type +/// @param creature The master creature object. +/// @param type The type from ANIMAL_COMPANION_CREATURE_TYPE_*. +void NWNX_Creature_SetAnimalCompanionCreatureType(object creature, int type); + +/// @brief Set creature's familiar creature type +/// @param creature The master creature object. +/// @param type The type from FAMILIAR_CREATURE_TYPE_*. +void NWNX_Creature_SetFamiliarCreatureType(object creature, int type); + +/// @brief Set creature's animal companion's name +/// @param creature The master creature object. +/// @param name The name to give their animal companion. +void NWNX_Creature_SetAnimalCompanionName(object creature, string name); + +/// @brief Set creature's familiar's name +/// @param creature The master creature object. +/// @param name The name to give their familiar. +void NWNX_Creature_SetFamiliarName(object creature, string name); + +/// @brief Get whether the creature can be disarmed. +/// @param creature The creature object. +/// @return TRUE if the creature can be disarmed. +int NWNX_Creature_GetDisarmable(object creature); + +/// @brief Set whether a creature can be disarmed. +/// @param creature The creature object. +/// @param disarmable Set to TRUE if the creature can be disarmed. +void NWNX_Creature_SetDisarmable(object creature, int disarmable); + +/// @brief Gets one of creature's domains. +/// @param creature The creature object. +/// @param class The class id from classes.2da. (Not class index 0-2) +/// @param index The first or second domain. +/// @deprecated Use GetDomain(). This will be removed in future NWNX releases. +int NWNX_Creature_GetDomain(object creature, int class, int index); + +/// @brief Sets one of creature's domains. +/// @param creature The creature object. +/// @param class The class id from classes.2da. (Not class index 0-2) +/// @param index The first or second domain. +/// @param domain The domain constant to set. +void NWNX_Creature_SetDomain(object creature, int class, int index, int domain); + +/// @brief Gets the creature's specialist school. +/// @param creature The creature object. +/// @param class The class id from classes.2da. (Not class index 0-2) +/// @deprecated Use GetSpecialization(). This will be removed in future NWNX releases. +int NWNX_Creature_GetSpecialization(object creature, int class); + +/// @brief Sets creature's specialist school. +/// @param creature The creature object. +/// @param class The class id from classes.2da. (Not class index 0-2) +/// @param school The school constant. +void NWNX_Creature_SetSpecialization(object creature, int class, int school); + +/// @brief Sets oCreatures faction to be the faction with id nFactionId. +/// @param oCreature The creature. +/// @param nFactionId The faction id we want the creature to join. +void NWNX_Creature_SetFaction(object oCreature, int nFactionId); + +/// @brief Gets the faction id from oCreature +/// @param oCreature the creature we wish to query against +/// @return faction id as an integer, -1 when used against invalid creature or invalid object. +int NWNX_Creature_GetFaction(object oCreature); + +/// @brief Get whether a creature is flat-footed. +/// @param oCreature The creature object. +/// @return TRUE if the creature is flat-footed. +int NWNX_Creature_GetFlatFooted(object oCreature); + +/// @brief Serialize oCreature's quickbar to a base64 string +/// @param oCreature The creature. +/// @return A base64 string representation of oCreature's quickbar. +string NWNX_Creature_SerializeQuickbar(object oCreature); + +/// @brief Deserialize sSerializedQuickbar for oCreature +/// @param oCreature The creature. +/// @param sSerializedQuickbar A base64 string of a quickbar +/// @return TRUE on success +int NWNX_Creature_DeserializeQuickbar(object oCreature, string sSerializedQuickbar); + +/// @brief Sets a caster level modifier for oCreature +/// @param oCreature the target creature +/// @param nClass the class that this modifier will apply to +/// @param nModifier the modifier to apply +/// @param bPersist whether the modifier should be persisted to the .bic file if applicable +void NWNX_Creature_SetCasterLevelModifier(object oCreature, int nClass, int nModifier, int bPersist = FALSE); + +/// @brief Gets the current caster level modifier for oCreature +/// @param oCreature the target creature +/// @param nClass the creature caster class +/// @return the current caster level modifier for the creature +int NWNX_Creature_GetCasterLevelModifier(object oCreature, int nClass); + +/// @brief Sets a caster level override for oCreature +/// @param oCreature the target creature +/// @param nClass the class that this modifier will apply to +/// @param nCasterLevel the caster level override to apply +/// @param bPersist whether the override should be persisted to the .bic file if applicable +void NWNX_Creature_SetCasterLevelOverride(object oCreature, int nClass, int nCasterLevel, int bPersist = FALSE); + +/// @brief Gets the current caster level override for oCreature +/// @param oCreature the target creature +/// @param nClass the creature caster class +/// @return the current caster level override for the creature or -1 if not set +int NWNX_Creature_GetCasterLevelOverride(object oCreature, int nClass); + +/// @brief Move a creature to limbo. +/// @param oCreature The creature object. +void NWNX_Creature_JumpToLimbo(object oCreature); + +/// @brief Sets the critical hit multiplier modifier for the Creature +/// @param oCreature The target creature +/// @param nModifier The modifier to apply +/// @param nHand 0 for all attacks, 1 for Mainhand, 2 for Offhand +/// @param bPersist Whether the modifier should persist to .bic file if applicable +/// @param nBaseItem Applies the.modifier only when the attack used this baseitem. BASE_ITEM_GLOVES for Unarmed, '-1' for all +/// @note Persistence is activated each server reset by the first use of either 'SetCriticalMultiplier*' functions. Recommended to trigger on a dummy target OnModuleLoad to enable persistence. +void NWNX_Creature_SetCriticalMultiplierModifier(object oCreature, int nModifier, int nHand = 0, int bPersist = FALSE, int nBaseItem = -1); + +/// @brief Gets the critical hit multiplier modifier for the Creature +/// @param oCreature The target creature +/// @param nHand 0 for all attacks, 1 for Mainhand, 2 for Offhand +/// @param nBaseItem The baseitem modifer to retrieve. BASE_ITEM_GLOVES for Unarmed, '-1' for all +/// @return the current critical hit multiplier modifier for the creature +int NWNX_Creature_GetCriticalMultiplierModifier(object oCreature, int nHand = 0, int nBaseItem = -1); + +/// @brief Sets the critical hit multiplier override for the Creature. +/// @param oCreature The target creature +/// @param nOverride The override value to apply. -1 to clear override. +/// @param nHand 0 for all attacks, 1 for Mainhand, 2 for Offhand +/// @param bPersist Whether the modifier should persist to .bic file if applicable +/// @param nBaseItem Applies the.Override only when the attack used this baseitem. BASE_ITEM_GLOVES for Unarmed, '-1' for all +/// @note Persistence is activated each server reset by the first use of either 'SetCriticalMultiplier*' functions. Recommended to trigger on a dummy target OnModuleLoad to enable persistence. +void NWNX_Creature_SetCriticalMultiplierOverride(object oCreature, int nOverride, int nHand = 0, int bPersist = FALSE, int nBaseItem = -1); + +/// @brief Gets the critical hit multiplier override for the Creature +/// @param oCreature The target creature +/// @param nHand 0 for all attacks, 1 for Mainhand, 2 for Offhand +/// @param nBaseItem The baseitem Override to retrieve. BASE_ITEM_GLOVES for Unarmed, '-1' for all +/// @return the current critical hit multiplier override for the creature. No override == -1 +int NWNX_Creature_GetCriticalMultiplierOverride(object oCreature, int nHand = 0, int nBaseItem = -1); + +/// @brief Sets the critical hit range modifier for the creature. +/// @param oCreature The target creature +/// @param nModifier The modifier to apply. Positive modifiers reduce critical chance. (I.e. From 18-20, a +1 results in crit range of 19-20) +/// @param nHand 0 for all attacks, 1 for Mainhand, 2 for Offhand +/// @param bPersist Whether the modifier should persist to .bic file if applicable +/// @param nBaseItem Applies the.modifier only when the attack used this baseitem. BASE_ITEM_GLOVES for Unarmed, '-1' for all +/// @note Persistence is activated each server reset by the first use of either 'SetCriticalRange*' functions. Recommended to trigger on a dummy target OnModuleLoad to enable persistence. +void NWNX_Creature_SetCriticalRangeModifier(object oCreature, int nModifier, int nHand = 0, int bPersist = FALSE, int nBaseItem = -1); + +/// @brief Gets the critical hit range modifier for the creature. +/// @param oCreature The target creature +/// @param nHand 0 for all attacks, 1 for Mainhand, 2 for Offhand +/// @param nBaseItem The baseitem modifer to retrieve. BASE_ITEM_GLOVES for Unarmed, '-1' for all +/// @return the current critical hit range modifier for the creature +int NWNX_Creature_GetCriticalRangeModifier(object oCreature, int nHand = 0, int nBaseItem = -1); + +/// @brief Sets the critical hit range Override for the creature. +/// @param oCreature The target creature +/// @param nOverride The new minimum roll to crit. i.e nOverride of 15 results in crit range of 15-20. -1 to clear override. +/// @param nHand 0 for all attacks, 1 for Mainhand, 2 for Offhand +/// @param bPersist Whether the modifier should persist to .bic file if applicable +/// @param nBaseItem Applies the.Override only when the attack used this baseitem. BASE_ITEM_GLOVES for Unarmed, '-1' for all +/// @note Persistence is activated each server reset by the first use of either 'SetCriticalRange*' functions. Recommended to trigger on a dummy target OnModuleLoad to enable persistence. +void NWNX_Creature_SetCriticalRangeOverride(object oCreature, int nOverride, int nHand = 0, int bPersist = FALSE, int nBaseItem = -1); + +/// @brief Sets the critical hit range Override for the creature. +/// @param oCreature The target creature +/// @param nHand 0 for all attacks, 1 for Mainhand, 2 for Offhand +/// @param nBaseItem The baseitem Override to retrieve. BASE_ITEM_GLOVES for Unarmed, '-1' for all +/// @return the current critical hit range override for the creature. No override == -1 +int NWNX_Creature_GetCriticalRangeOverride(object oCreature, int nHand = 0, int nBaseItem = -1); + +/// @brief Add oAssociate as nAssociateType to oCreature +/// @warning Only basic checks are done so care must be taken when using this function +/// @param oCreature The creature to add oAssociate to +/// @param oAssociate The associate, must be a NPC +/// @param nAssociateType The associate type, one of ASSOCIATE_TYPE_*, except _NONE +void NWNX_Creature_AddAssociate(object oCreature, object oAssociate, int nAssociateType); + +/// @brief Set whether an effect icon is flashing or not. +/// @param oCreature The target creature. +/// @param nIconId The icon id, see effecticons.2da. +/// @param bFlashing TRUE for flashing, FALSE for not flashing. +void NWNX_Creature_SetEffectIconFlashing(object oCreature, int nIconId, int bFlashing); + +/// @brief Override the damage level of oCreature. +/// @note Damage levels are the damage state under a creature's name, for example: 'Near Death' +/// @param oCreature The target creature. +/// @param nDamageLevel A damage level, see damagelevels.2da. Allowed values: 0-255 or -1 to remove the override. +void NWNX_Creature_OverrideDamageLevel(object oCreature, int nDamageLevel); + +/// @brief Set the encounter source of oCreature. +/// @param oCreature The target creature. +/// @param oEncounter The source encounter +void NWNX_Creature_SetEncounter(object oCreature, object oEncounter); + +/// @brief Get the encounter source of oCreature. +/// @param oCreature The target creature. +/// @return The encounter, OBJECT_INVALID if not part of an encounter or on error +object NWNX_Creature_GetEncounter(object oCreature); + +/// @brief Get if oCreature is currently bartering. +/// @param oCreature The target creature. +/// @return TRUE if oCreature is bartering, FALSE if not or on error. +int NWNX_Creature_GetIsBartering(object oCreature); + +/// @brief Sets caster level for the last item used. Use in a spellhook or spell event before to set caster level for any spells cast from the item. +/// @param oCreature the creature who used the item. +/// @param nCasterLvl the desired caster level. +void NWNX_Creature_SetLastItemCasterLevel(object oCreature, int nCasterLvl); + +/// @brief Gets the caster level of the last item used. +/// @param oCreature the creature who used the item. +/// @return returns the creatures last used item's level. +int NWNX_Creature_GetLastItemCasterLevel(object oCreature); + +/// @brief Gets the Armor classed of attacked against versus +/// @param oAttacked The one being attacked +/// @param oVersus The one doing the attacking +/// @param nTouch TRUE for touch attacks +/// @return -255 on Error, Flat footed AC if oVersus is invalid or the Attacked AC versus oVersus. +int NWNX_Creature_GetArmorClassVersus(object oAttacked, object oVersus, int nTouch=FALSE); + +/// @brief Gets the current walk animation of oCreature. +/// @param oCreature The target creature. +/// @return -1 on Error, otherwise the walk animation number +int NWNX_Creature_GetWalkAnimation(object oCreature); + +/// @brief Sets the current walk animation of oCreature. +/// @param oCreature The target creature. +/// @param nAnimation The walk animation number. +void NWNX_Creature_SetWalkAnimation(object oCreature, int nAnimation); + +/// @brief Changes the attack modifier depending on the dice roll. Used to skip autofail on 1 and autosucceed on 20 as well. +/// @param oCreature The attacking creature, use OBJECT_INVALID for all. +/// @param nRoll The dice roll to modify. +/// @param nModifier The modifier to the attack, use 0 to turn off autofail for 1/autosucceed for 20 with no attack modifier value. +void NWNX_Creature_SetAttackRollOverride(object oCreature, int nRoll, int nModifier); + +/// @brief Works like the tweak but can be turned on and off for all creatures or single ones. +/// @param oCreature The parrying creature, use OBJECT_INVALID for all. +/// @param bParry TRUE to parry all attacks. +/// @note Use this command on_module_load instead of the NWNX_TWEAKS_PARRY_ALL_ATTACKS tweak if using NWNX_Creature_SetAttackRollOverride() +void NWNX_Creature_SetParryAllAttacks(object oCreature, int bParry); + +/// @brief Gets the NoPermanentDeath flag of oCreature. +/// @param oCreature The target creature. +/// @return TRUE/FALSE or -1 on error. +int NWNX_Creature_GetNoPermanentDeath(object oCreature); + +/// @brief Sets the NoPermanentDeath flag of oCreature. +/// @param oCreature The target creature. +/// @param bNoPermanentDeath TRUE/FALSE. +void NWNX_Creature_SetNoPermanentDeath(object oCreature, int bNoPermanentDeath); + +/// @brief Compute a safe location for oCreature. +/// @param oCreature The target creature. +/// @param vPosition The starting position. +/// @param fRadius The search radius around vPosition. +/// @param bWalkStraightLineRequired Whether the creature must be able to walk in a straight line to the position. +/// @return A safe location as vector, will return vPosition if one wasn't found. Returns {0.0, 0.0, 0.0} on error. +vector NWNX_Creature_ComputeSafeLocation(object oCreature, vector vPosition, float fRadius = 20.0f, int bWalkStraightLineRequired = TRUE); + +/// @brief Update oCreature's perception of oTargetCreature. +/// @param oCreature The creature. +/// @param oTargetCreature The target creature. +void NWNX_Creature_DoPerceptionUpdateOnCreature(object oCreature, object oTargetCreature); + +/// @} + +void NWNX_Creature_AddFeat(object creature, int feat) +{ + string sFunc = "AddFeat"; + NWNX_PushArgumentInt(NWNX_Creature, sFunc, feat); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +void NWNX_Creature_AddFeatByLevel(object creature, int feat, int level) +{ + string sFunc = "AddFeatByLevel"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, level); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, feat); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +void NWNX_Creature_RemoveFeat(object creature, int feat) +{ + string sFunc = "RemoveFeat"; + NWNX_PushArgumentInt(NWNX_Creature, sFunc, feat); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +int NWNX_Creature_GetKnowsFeat(object creature, int feat) +{ + string sFunc = "GetKnowsFeat"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, feat); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); + return NWNX_GetReturnValueInt(NWNX_Creature, sFunc); +} + +int NWNX_Creature_GetFeatCountByLevel(object creature, int level) +{ + string sFunc = "GetFeatCountByLevel"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, level); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); + return NWNX_GetReturnValueInt(NWNX_Creature, sFunc); +} + +int NWNX_Creature_GetFeatByLevel(object creature, int level, int index) +{ + string sFunc = "GetFeatByLevel"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, index); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, level); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); + return NWNX_GetReturnValueInt(NWNX_Creature, sFunc); +} + +int NWNX_Creature_GetFeatCount(object creature) +{ + string sFunc = "GetFeatCount"; + + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); + return NWNX_GetReturnValueInt(NWNX_Creature, sFunc); +} + +int NWNX_Creature_GetFeatGrantLevel(object creature, int feat) +{ + string sFunc = "GetFeatGrantLevel"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, feat); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + NWNX_CallFunction(NWNX_Creature, sFunc); + return NWNX_GetReturnValueInt(NWNX_Creature, sFunc); +} + +int NWNX_Creature_GetFeatByIndex(object creature, int index) +{ + string sFunc = "GetFeatByIndex"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, index); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); + return NWNX_GetReturnValueInt(NWNX_Creature, sFunc); +} + +int NWNX_Creature_GetMeetsFeatRequirements(object creature, int feat) +{ + string sFunc = "GetMeetsFeatRequirements"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, feat); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); + return NWNX_GetReturnValueInt(NWNX_Creature, sFunc); +} + +struct NWNX_Creature_SpecialAbility NWNX_Creature_GetSpecialAbility(object creature, int index) +{ + string sFunc = "GetSpecialAbility"; + + struct NWNX_Creature_SpecialAbility ability; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, index); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); + + ability.level = NWNX_GetReturnValueInt(NWNX_Creature, sFunc); + ability.ready = NWNX_GetReturnValueInt(NWNX_Creature, sFunc); + ability.id = NWNX_GetReturnValueInt(NWNX_Creature, sFunc); + + return ability; +} + +int NWNX_Creature_GetSpecialAbilityCount(object creature) +{ + string sFunc = "GetSpecialAbilityCount"; + + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + NWNX_CallFunction(NWNX_Creature, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Creature, sFunc); +} + +void NWNX_Creature_AddSpecialAbility(object creature, struct NWNX_Creature_SpecialAbility ability) +{ + string sFunc = "AddSpecialAbility"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, ability.id); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, ability.ready); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, ability.level); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +void NWNX_Creature_RemoveSpecialAbility(object creature, int index) +{ + string sFunc = "RemoveSpecialAbility"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, index); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +void NWNX_Creature_SetSpecialAbility(object creature, int index, struct NWNX_Creature_SpecialAbility ability) +{ + string sFunc = "SetSpecialAbility"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, ability.id); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, ability.ready); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, ability.level); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, index); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +int NWNX_Creature_GetClassByLevel(object creature, int level) +{ + string sFunc = "GetClassByLevel"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, level); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); + return NWNX_GetReturnValueInt(NWNX_Creature, sFunc); +} + +void NWNX_Creature_SetBaseAC(object creature, int ac) +{ + string sFunc = "SetBaseAC"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, ac); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +int NWNX_Creature_GetBaseAC(object creature) +{ + string sFunc = "GetBaseAC"; + + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); + return NWNX_GetReturnValueInt(NWNX_Creature, sFunc); +} + +void NWNX_Creature_SetRawAbilityScore(object creature, int ability, int value) +{ + string sFunc = "SetRawAbilityScore"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, value); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, ability); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +int NWNX_Creature_GetRawAbilityScore(object creature, int ability) +{ + string sFunc = "GetRawAbilityScore"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, ability); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); + return NWNX_GetReturnValueInt(NWNX_Creature, sFunc); +} + +void NWNX_Creature_ModifyRawAbilityScore(object creature, int ability, int modifier) +{ + string sFunc = "ModifyRawAbilityScore"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, modifier); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, ability); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +int NWNX_Creature_GetPrePolymorphAbilityScore(object creature, int ability) +{ + string sFunc = "GetPrePolymorphAbilityScore"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, ability); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); + return NWNX_GetReturnValueInt(NWNX_Creature, sFunc); +} + +struct NWNX_Creature_MemorisedSpell NWNX_Creature_GetMemorisedSpell(object creature, int class, int level, int index) +{ + string sFunc = "GetMemorisedSpell"; + struct NWNX_Creature_MemorisedSpell spell; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, index); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, level); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, class); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); + + spell.domain = NWNX_GetReturnValueInt(NWNX_Creature, sFunc); + spell.meta = NWNX_GetReturnValueInt(NWNX_Creature, sFunc); + spell.ready = NWNX_GetReturnValueInt(NWNX_Creature, sFunc); + spell.id = NWNX_GetReturnValueInt(NWNX_Creature, sFunc); + return spell; +} + +int NWNX_Creature_GetMemorisedSpellCountByLevel(object creature, int class, int level) +{ + string sFunc = "GetMemorisedSpellCountByLevel"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, level); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, class); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); + return NWNX_GetReturnValueInt(NWNX_Creature, sFunc); +} + +void NWNX_Creature_SetMemorisedSpell(object creature, int class, int level, int index, struct NWNX_Creature_MemorisedSpell spell) +{ + string sFunc = "SetMemorisedSpell"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, spell.id); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, spell.ready); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, spell.meta); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, spell.domain); + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, index); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, level); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, class); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +int NWNX_Creature_GetRemainingSpellSlots(object creature, int class, int level) +{ + string sFunc = "GetRemainingSpellSlots"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, level); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, class); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); + return NWNX_GetReturnValueInt(NWNX_Creature, sFunc); +} + +void NWNX_Creature_SetRemainingSpellSlots(object creature, int class, int level, int slots) +{ + string sFunc = "SetRemainingSpellSlots"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, slots); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, level); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, class); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +int NWNX_Creature_GetKnownSpell(object creature, int class, int level, int index) +{ + string sFunc = "GetKnownSpell"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, index); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, level); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, class); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); + return NWNX_GetReturnValueInt(NWNX_Creature, sFunc); +} + +int NWNX_Creature_GetKnownSpellCount(object creature, int class, int level) +{ + string sFunc = "GetKnownSpellCount"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, level); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, class); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); + return NWNX_GetReturnValueInt(NWNX_Creature, sFunc); +} + +void NWNX_Creature_RemoveKnownSpell(object creature, int class, int level, int spellId) +{ + string sFunc = "RemoveKnownSpell"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, spellId); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, level); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, class); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +void NWNX_Creature_AddKnownSpell(object creature, int class, int level, int spellId) +{ + string sFunc = "AddKnownSpell"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, spellId); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, level); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, class); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +void NWNX_Creature_ClearMemorisedKnownSpells(object creature, int class, int spellId) +{ + string sFunc = "ClearMemorisedKnownSpells"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, spellId); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, class); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +void NWNX_Creature_ClearMemorisedSpell(object creature, int class, int level, int index) +{ + string sFunc = "ClearMemorisedSpell"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, index); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, level); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, class); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +int NWNX_Creature_GetMaxSpellSlots(object creature, int class, int level) +{ + string sFunc = "GetMaxSpellSlots"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, level); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, class); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); + return NWNX_GetReturnValueInt(NWNX_Creature, sFunc); +} + + +int NWNX_Creature_GetMaxHitPointsByLevel(object creature, int level) +{ + string sFunc = "GetMaxHitPointsByLevel"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, level); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); + return NWNX_GetReturnValueInt(NWNX_Creature, sFunc); +} + +void NWNX_Creature_SetMaxHitPointsByLevel(object creature, int level, int value) +{ + string sFunc = "SetMaxHitPointsByLevel"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, value); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, level); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +void NWNX_Creature_SetMovementRate(object creature, int rate) +{ + string sFunc = "SetMovementRate"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, rate); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +float NWNX_Creature_GetMovementRateFactor(object creature) +{ + string sFunc = "GetMovementRateFactor"; + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); + return NWNX_GetReturnValueFloat(NWNX_Creature, sFunc); +} + +void NWNX_Creature_SetMovementRateFactor(object creature, float factor) +{ + string sFunc = "SetMovementRateFactor"; + + NWNX_PushArgumentFloat(NWNX_Creature, sFunc, factor); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +void NWNX_Creature_SetMovementRateFactorCap(object creature, float cap) +{ + string sFunc = "SetMovementRateFactorCap"; + + NWNX_PushArgumentFloat(NWNX_Creature, sFunc, cap); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +void NWNX_Creature_SetAlignmentGoodEvil(object creature, int value) +{ + string sFunc = "SetAlignmentGoodEvil"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, value); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +void NWNX_Creature_SetAlignmentLawChaos(object creature, int value) +{ + string sFunc = "SetAlignmentLawChaos"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, value); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +int NWNX_Creature_GetSoundset(object creature) +{ + string sFunc = "GetSoundset"; + + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); + return NWNX_GetReturnValueInt(NWNX_Creature, sFunc); +} + +void NWNX_Creature_SetSoundset(object creature, int soundset) +{ + string sFunc = "SetSoundset"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, soundset); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +void NWNX_Creature_SetSkillRank(object creature, int skill, int rank) +{ + string sFunc = "SetSkillRank"; + NWNX_PushArgumentInt(NWNX_Creature, sFunc, rank); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, skill); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +void NWNX_Creature_SetClassByPosition(object creature, int position, int classID) +{ + string sFunc = "SetClassByPosition"; + NWNX_PushArgumentInt(NWNX_Creature, sFunc, classID); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, position); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +void NWNX_Creature_SetLevelByPosition(object creature, int position, int level) +{ + string sFunc = "SetLevelByPosition"; + NWNX_PushArgumentInt(NWNX_Creature, sFunc, level); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, position); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +void NWNX_Creature_SetBaseAttackBonus(object creature, int bab) +{ + string sFunc = "SetBaseAttackBonus"; + NWNX_PushArgumentInt(NWNX_Creature, sFunc, bab); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +int NWNX_Creature_GetAttacksPerRound(object creature, int bBaseAPR = FALSE) +{ + string sFunc = "GetAttacksPerRound"; + NWNX_PushArgumentInt(NWNX_Creature, sFunc, bBaseAPR); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); + return NWNX_GetReturnValueInt(NWNX_Creature, sFunc); +} + +void NWNX_Creature_SetGender(object creature, int gender) +{ + string sFunc = "SetGender"; + NWNX_PushArgumentInt(NWNX_Creature, sFunc, gender); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +void NWNX_Creature_RestoreFeats(object creature) +{ + string sFunc = "RestoreFeats"; + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +void NWNX_Creature_RestoreSpecialAbilities(object creature) +{ + string sFunc = "RestoreSpecialAbilities"; + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +void NWNX_Creature_RestoreSpells(object creature, int level = -1) +{ + string sFunc = "RestoreSpells"; + NWNX_PushArgumentInt(NWNX_Creature, sFunc, level); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +void NWNX_Creature_RestoreItems(object creature) +{ + string sFunc = "RestoreItems"; + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +void NWNX_Creature_SetSize(object creature, int size) +{ + string sFunc = "SetSize"; + NWNX_PushArgumentInt(NWNX_Creature, sFunc, size); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +int NWNX_Creature_GetSkillPointsRemaining(object creature) +{ + string sFunc = "GetSkillPointsRemaining"; + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); + return NWNX_GetReturnValueInt(NWNX_Creature, sFunc); +} + + +void NWNX_Creature_SetSkillPointsRemaining(object creature, int skillpoints) +{ + string sFunc = "SetSkillPointsRemaining"; + NWNX_PushArgumentInt(NWNX_Creature, sFunc, skillpoints); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +void NWNX_Creature_SetRacialType(object creature, int racialtype) +{ + string sFunc = "SetRacialType"; + NWNX_PushArgumentInt(NWNX_Creature, sFunc, racialtype); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +int NWNX_Creature_GetMovementType(object creature) +{ + string sFunc = "GetMovementType"; + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); + return NWNX_GetReturnValueInt(NWNX_Creature, sFunc); +} + +void NWNX_Creature_SetWalkRateCap(object creature, float fWalkRate = 2000.0f) +{ + string sFunc = "SetWalkRateCap"; + NWNX_PushArgumentFloat(NWNX_Creature, sFunc, fWalkRate); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +void NWNX_Creature_SetGold(object creature, int gold) +{ + string sFunc = "SetGold"; + NWNX_PushArgumentInt(NWNX_Creature, sFunc, gold); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +void NWNX_Creature_SetCorpseDecayTime(object creature, int nDecayTime) +{ + string sFunc = "SetCorpseDecayTime"; + NWNX_PushArgumentInt(NWNX_Creature, sFunc, nDecayTime); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + + +int NWNX_Creature_GetBaseSavingThrow(object creature, int which) +{ + string sFunc = "GetBaseSavingThrow"; + NWNX_PushArgumentInt(NWNX_Creature, sFunc, which); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); + return NWNX_GetReturnValueInt(NWNX_Creature, sFunc); +} + +void NWNX_Creature_SetBaseSavingThrow(object creature, int which, int value) +{ + string sFunc = "SetBaseSavingThrow"; + NWNX_PushArgumentInt(NWNX_Creature, sFunc, value); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, which); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +void NWNX_Creature_LevelUp(object creature, int class, int count=1) +{ + string sFunc = "LevelUp"; + NWNX_PushArgumentInt(NWNX_Creature, sFunc, count); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, class); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +void NWNX_Creature_LevelDown(object creature, int count=1) +{ + string sFunc = "LevelDown"; + NWNX_PushArgumentInt(NWNX_Creature, sFunc, count); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +void NWNX_Creature_SetChallengeRating(object creature, float fCR) +{ + string sFunc = "SetChallengeRating"; + NWNX_PushArgumentFloat(NWNX_Creature, sFunc, fCR); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +int NWNX_Creature_GetAttackBonus(object creature, int isMelee = -1, int isTouchAttack = FALSE, int isOffhand = FALSE, int includeBaseAttackBonus = TRUE) +{ + string sFunc = "GetAttackBonus"; + + if (isMelee == -1) + { + object oWeapon = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, creature); + + if (GetIsObjectValid(oWeapon)) + { + isMelee = !GetWeaponRanged(oWeapon); + } + else + {// Default to melee for unarmed + isMelee = TRUE; + } + } + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, includeBaseAttackBonus); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, isOffhand); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, isTouchAttack); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, isMelee); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); + return NWNX_GetReturnValueInt(NWNX_Creature, sFunc); +} + +int NWNX_Creature_GetHighestLevelOfFeat(object creature, int feat) +{ + string sFunc = "GetHighestLevelOfFeat"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, feat); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); + return NWNX_GetReturnValueInt(NWNX_Creature, sFunc); +} + +int NWNX_Creature_GetFeatRemainingUses(object creature, int feat) +{ + string sFunc = "GetFeatRemainingUses"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, feat); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); + return NWNX_GetReturnValueInt(NWNX_Creature, sFunc); +} + +int NWNX_Creature_GetFeatTotalUses(object creature, int feat) +{ + string sFunc = "GetFeatTotalUses"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, feat); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); + return NWNX_GetReturnValueInt(NWNX_Creature, sFunc); +} + +void NWNX_Creature_SetFeatRemainingUses(object creature, int feat, int uses) +{ + string sFunc = "SetFeatRemainingUses"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, uses); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, feat); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +int NWNX_Creature_GetTotalEffectBonus(object creature, int bonusType=NWNX_CREATURE_BONUS_TYPE_ATTACK, object target=OBJECT_INVALID, int isElemental=0, int isForceMax=0, int savetype=-1, int saveSpecificType=-1, int skill=-1, int abilityScore=-1, int isOffhand=FALSE) +{ + string sFunc = "GetTotalEffectBonus"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, isOffhand); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, abilityScore); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, skill); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, saveSpecificType); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, savetype); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, isForceMax); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, isElemental); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, target); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, bonusType); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); + return NWNX_GetReturnValueInt(NWNX_Creature, sFunc); +} + +void NWNX_Creature_SetOriginalName(object creature, string name, int isLastName) +{ + string sFunc = "SetOriginalName"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, isLastName); + NWNX_PushArgumentString(NWNX_Creature, sFunc, name); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +string NWNX_Creature_GetOriginalName(object creature, int isLastName) +{ + string sFunc = "GetOriginalName"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, isLastName); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); + return NWNX_GetReturnValueString(NWNX_Creature, sFunc); +} + +void NWNX_Creature_SetSpellResistance(object creature, int sr) +{ + string sFunc = "SetSpellResistance"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, sr); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +void NWNX_Creature_SetAnimalCompanionCreatureType(object creature, int type) +{ + string sFunc = "SetAnimalCompanionCreatureType"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, type); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +void NWNX_Creature_SetFamiliarCreatureType(object creature, int type) +{ + string sFunc = "SetFamiliarCreatureType"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, type); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +void NWNX_Creature_SetAnimalCompanionName(object creature, string name) +{ + string sFunc = "SetAnimalCompanionName"; + + NWNX_PushArgumentString(NWNX_Creature, sFunc, name); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +void NWNX_Creature_SetFamiliarName(object creature, string name) +{ + string sFunc = "SetFamiliarName"; + + NWNX_PushArgumentString(NWNX_Creature, sFunc, name); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +int NWNX_Creature_GetDisarmable(object creature) +{ + string sFunc = "GetDisarmable"; + + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); + return NWNX_GetReturnValueInt(NWNX_Creature, sFunc); +} + +void NWNX_Creature_SetDisarmable(object creature, int disarmable) +{ + string sFunc = "SetDisarmable"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, disarmable); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +int NWNX_Creature_GetDomain(object creature, int class, int index) +{ + WriteTimestampedLogEntry("NWNX_Creature: GetDomain() is deprecated. Please use the basegame's GetDomain() instead"); + + return GetDomain(creature, index, class); +} + +void NWNX_Creature_SetDomain(object creature, int class, int index, int domain) +{ + string sFunc = "SetDomain"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, domain); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, index); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, class); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +int NWNX_Creature_GetSpecialization(object creature, int class) +{ + WriteTimestampedLogEntry("NWNX_Creature: GetSpecialization() is deprecated. Please use the basegame's GetSpecialization() instead"); + + return GetSpecialization(creature, class); +} + +void NWNX_Creature_SetSpecialization(object creature, int class, int school) +{ + string sFunc = "SetSpecialization"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, school); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, class); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, creature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +void NWNX_Creature_SetFaction(object oCreature, int nFactionId) +{ + string sFunc = "SetFaction"; + NWNX_PushArgumentInt(NWNX_Creature, sFunc, nFactionId); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, oCreature); + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +int NWNX_Creature_GetFaction(object oCreature) +{ + string sFunc = "GetFaction"; + NWNX_PushArgumentObject(NWNX_Creature, sFunc, oCreature); + NWNX_CallFunction(NWNX_Creature, sFunc); + return NWNX_GetReturnValueInt(NWNX_Creature, sFunc); +} + +int NWNX_Creature_GetFlatFooted(object oCreature) +{ + string sFunc = "GetFlatFooted"; + NWNX_PushArgumentObject(NWNX_Creature, sFunc, oCreature); + NWNX_CallFunction(NWNX_Creature, sFunc); + return NWNX_GetReturnValueInt(NWNX_Creature, sFunc); +} + +string NWNX_Creature_SerializeQuickbar(object oCreature) +{ + string sFunc = "SerializeQuickbar"; + + NWNX_PushArgumentObject(NWNX_Creature, sFunc, oCreature); + NWNX_CallFunction(NWNX_Creature, sFunc); + + return NWNX_GetReturnValueString(NWNX_Creature, sFunc); +} + +int NWNX_Creature_DeserializeQuickbar(object oCreature, string sSerializedQuickbar) +{ + string sFunc = "DeserializeQuickbar"; + + NWNX_PushArgumentString(NWNX_Creature, sFunc, sSerializedQuickbar); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, oCreature); + + NWNX_CallFunction(NWNX_Creature, sFunc); + return NWNX_GetReturnValueInt(NWNX_Creature, sFunc); +} + +void NWNX_Creature_SetCasterLevelModifier(object oCreature, int nClass, int nModifier, int bPersist = FALSE) +{ + string sFunc = "SetCasterLevelModifier"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, bPersist); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, nModifier); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, nClass); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, oCreature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +int NWNX_Creature_GetCasterLevelModifier(object oCreature, int nClass) +{ + string sFunc = "GetCasterLevelModifier"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, nClass); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, oCreature); + + NWNX_CallFunction(NWNX_Creature, sFunc); + return NWNX_GetReturnValueInt(NWNX_Creature, sFunc); +} + +void NWNX_Creature_SetCasterLevelOverride(object oCreature, int nClass, int nCasterLevel, int bPersist = FALSE) +{ + string sFunc = "SetCasterLevelOverride"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, bPersist); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, nCasterLevel); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, nClass); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, oCreature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +int NWNX_Creature_GetCasterLevelOverride(object oCreature, int nClass) +{ + string sFunc = "GetCasterLevelOverride"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, nClass); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, oCreature); + + NWNX_CallFunction(NWNX_Creature, sFunc); + return NWNX_GetReturnValueInt(NWNX_Creature, sFunc); +} + +void NWNX_Creature_JumpToLimbo(object oCreature) +{ + string sFunc = "JumpToLimbo"; + NWNX_PushArgumentObject(NWNX_Creature, sFunc, oCreature); + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +void NWNX_Creature_SetCriticalMultiplierModifier(object oCreature, int nModifier, int nHand = 0, int bPersist = FALSE, int nBaseItem = -1) +{ + string sFunc = "SetCriticalMultiplierModifier"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, nBaseItem); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, bPersist); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, nHand); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, nModifier); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, oCreature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +int NWNX_Creature_GetCriticalMultiplierModifier(object oCreature, int nHand = 0, int nBaseItem = -1) +{ + string sFunc = "GetCriticalMultiplierModifier"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, nBaseItem); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, nHand); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, oCreature); + + NWNX_CallFunction(NWNX_Creature, sFunc); + return NWNX_GetReturnValueInt(NWNX_Creature, sFunc); +} + +void NWNX_Creature_SetCriticalMultiplierOverride(object oCreature, int nOverride, int nHand = 0, int bPersist = FALSE, int nBaseItem = -1) +{ + string sFunc = "SetCriticalMultiplierOverride"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, nBaseItem); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, bPersist); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, nHand); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, nOverride); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, oCreature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +int NWNX_Creature_GetCriticalMultiplierOverride(object oCreature, int nHand = 0, int nBaseItem = -1) +{ + string sFunc = "GetCriticalMultiplierOverride"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, nBaseItem); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, nHand); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, oCreature); + + NWNX_CallFunction(NWNX_Creature, sFunc); + return NWNX_GetReturnValueInt(NWNX_Creature, sFunc); +} + +void NWNX_Creature_SetCriticalRangeModifier(object oCreature, int nModifier, int nHand = 0, int bPersist = FALSE, int nBaseItem = -1) +{ + string sFunc = "SetCriticalRangeModifier"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, nBaseItem); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, bPersist); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, nHand); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, nModifier); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, oCreature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +int NWNX_Creature_GetCriticalRangeModifier(object oCreature, int nHand = 0, int nBaseItem = -1) +{ + string sFunc = "GetCriticalRangeModifier"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, nBaseItem); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, nHand); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, oCreature); + + NWNX_CallFunction(NWNX_Creature, sFunc); + return NWNX_GetReturnValueInt(NWNX_Creature, sFunc); +} + +void NWNX_Creature_SetCriticalRangeOverride(object oCreature, int nOverride, int nHand = 0, int bPersist = FALSE, int nBaseItem = -1) +{ + string sFunc = "SetCriticalRangeOverride"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, nBaseItem); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, bPersist); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, nHand); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, nOverride); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, oCreature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +int NWNX_Creature_GetCriticalRangeOverride(object oCreature, int nHand = 0, int nBaseItem = -1) +{ + string sFunc = "GetCriticalRangeOverride"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, nBaseItem); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, nHand); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, oCreature); + + NWNX_CallFunction(NWNX_Creature, sFunc); + return NWNX_GetReturnValueInt(NWNX_Creature, sFunc); +} + +void NWNX_Creature_AddAssociate(object oCreature, object oAssociate, int nAssociateType) +{ + string sFunc = "AddAssociate"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, nAssociateType); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, oAssociate); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, oCreature); + + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +void NWNX_Creature_SetEffectIconFlashing(object oCreature, int nIconId, int bFlashing) +{ + string sFunc = "SetEffectIconFlashing"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, bFlashing); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, nIconId); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, oCreature); + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +void NWNX_Creature_OverrideDamageLevel(object oCreature, int nDamageLevel) +{ + string sFunc = "OverrideDamageLevel"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, nDamageLevel); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, oCreature); + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +void NWNX_Creature_SetEncounter(object oCreature, object oEncounter) +{ + string sFunc = "SetEncounter"; + + NWNX_PushArgumentObject(NWNX_Creature, sFunc, oEncounter); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, oCreature); + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +object NWNX_Creature_GetEncounter(object oCreature) +{ + string sFunc = "GetEncounter"; + + NWNX_PushArgumentObject(NWNX_Creature, sFunc, oCreature); + NWNX_CallFunction(NWNX_Creature, sFunc); + + return NWNX_GetReturnValueObject(NWNX_Creature, sFunc); +} + +int NWNX_Creature_GetIsBartering(object oCreature) +{ + string sFunc = "GetIsBartering"; + + NWNX_PushArgumentObject(NWNX_Creature, sFunc, oCreature); + NWNX_CallFunction(NWNX_Creature, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Creature, sFunc); +} + +void NWNX_Creature_SetLastItemCasterLevel(object oCreature, int nCasterLvl) +{ + string sFunc = "SetLastItemCasterLevel"; + NWNX_PushArgumentInt(NWNX_Creature, sFunc, nCasterLvl); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, oCreature); + NWNX_CallFunction(NWNX_Creature, sFunc); +} + + +int NWNX_Creature_GetLastItemCasterLevel(object oCreature) +{ + string sFunc = "GetLastItemCasterLevel"; + NWNX_PushArgumentObject(NWNX_Creature, sFunc, oCreature); + NWNX_CallFunction(NWNX_Creature, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Creature, sFunc); +} + +int NWNX_Creature_GetArmorClassVersus(object oAttacked, object oVersus, int nTouch=FALSE) +{ + string sFunc = "GetArmorClassVersus"; + NWNX_PushArgumentInt(NWNX_Creature, sFunc, nTouch); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, oVersus); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, oAttacked); + NWNX_CallFunction(NWNX_Creature, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Creature, sFunc); +} + +int NWNX_Creature_GetWalkAnimation(object oCreature) +{ + string sFunc = "GetWalkAnimation"; + NWNX_PushArgumentObject(NWNX_Creature, sFunc, oCreature); + NWNX_CallFunction(NWNX_Creature, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Creature, sFunc); +} + +void NWNX_Creature_SetWalkAnimation(object oCreature, int nAnimation) +{ + string sFunc = "SetWalkAnimation"; + NWNX_PushArgumentInt(NWNX_Creature, sFunc, nAnimation); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, oCreature); + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +void NWNX_Creature_SetAttackRollOverride(object oCreature, int nRoll, int nModifier) +{ + string sFunc = "SetAttackRollOverride"; + NWNX_PushArgumentInt(NWNX_Creature, sFunc, nModifier); + NWNX_PushArgumentInt(NWNX_Creature, sFunc, nRoll); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, oCreature); + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +void NWNX_Creature_SetParryAllAttacks(object oCreature, int bParry) +{ + string sFunc = "SetParryAllAttacks"; + NWNX_PushArgumentInt(NWNX_Creature, sFunc, bParry); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, oCreature); + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +int NWNX_Creature_GetNoPermanentDeath(object oCreature) +{ + string sFunc = "GetNoPermanentDeath"; + + NWNX_PushArgumentObject(NWNX_Creature, sFunc, oCreature); + NWNX_CallFunction(NWNX_Creature, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Creature, sFunc); +} + +void NWNX_Creature_SetNoPermanentDeath(object oCreature, int bNoPermanentDeath) +{ + string sFunc = "SetNoPermanentDeath"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, bNoPermanentDeath); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, oCreature); + NWNX_CallFunction(NWNX_Creature, sFunc); +} + +vector NWNX_Creature_ComputeSafeLocation(object oCreature, vector vPosition, float fRadius = 20.0f, int bWalkStraightLineRequired = TRUE) +{ + string sFunc = "ComputeSafeLocation"; + + NWNX_PushArgumentInt(NWNX_Creature, sFunc, bWalkStraightLineRequired); + NWNX_PushArgumentFloat(NWNX_Creature, sFunc, fRadius); + NWNX_PushArgumentFloat(NWNX_Creature, sFunc, vPosition.x); + NWNX_PushArgumentFloat(NWNX_Creature, sFunc, vPosition.y); + NWNX_PushArgumentFloat(NWNX_Creature, sFunc, vPosition.z); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, oCreature); + NWNX_CallFunction(NWNX_Creature, sFunc); + + vector v; + v.z = NWNX_GetReturnValueFloat(NWNX_Creature, sFunc); + v.y = NWNX_GetReturnValueFloat(NWNX_Creature, sFunc); + v.x = NWNX_GetReturnValueFloat(NWNX_Creature, sFunc); + + return v; +} + +void NWNX_Creature_DoPerceptionUpdateOnCreature(object oCreature, object oTargetCreature) +{ + string sFunc = "DoPerceptionUpdateOnCreature"; + + NWNX_PushArgumentObject(NWNX_Creature, sFunc, oTargetCreature); + NWNX_PushArgumentObject(NWNX_Creature, sFunc, oCreature); + NWNX_CallFunction(NWNX_Creature, sFunc); +} diff --git a/gamma_age_v2/nwnx_damage.nss b/gamma_age_v2/nwnx_damage.nss new file mode 100644 index 00000000..3e206ea2 --- /dev/null +++ b/gamma_age_v2/nwnx_damage.nss @@ -0,0 +1,253 @@ +/// @addtogroup damage Damage +/// @brief Run a script before damage and attack events allowing for modification. Includes function to arbitrarily apply damage. +/// @{ +/// @file nwnx_damage.nss +#include "nwnx" + +const string NWNX_Damage = "NWNX_Damage"; ///< @private + +/// @struct NWNX_Damage_DamageEventData +/// @brief Damage Event Data +struct NWNX_Damage_DamageEventData +{ + object oDamager; ///< The object that inflicted the damage. + int iBludgeoning; ///< Bludgeoning damage + int iPierce; ///< Piercing damage + int iSlash; ///< Slashing damage + int iMagical; ///< Magical damage + int iAcid; ///< Acid damage + int iCold; ///< Cold damage + int iDivine; ///< Divine damage + int iElectrical; ///< Electrical damage + int iFire; ///< Fire damage + int iNegative; ///< Negative damage + int iPositive; ///< Positive damage + int iSonic; ///< Sonic damage + int iBase; ///< Base damage +}; + +/// @struct NWNX_Damage_AttackEventData +/// @brief Attack Event Data +struct NWNX_Damage_AttackEventData +{ + object oTarget; ///< The target who took the damage + int iBludgeoning; ///< Bludgeoning damage + int iPierce; ///< Piercing damage + int iSlash; ///< Slashing damage + int iMagical; ///< Magical damage + int iAcid; ///< Acid damage + int iCold; ///< Cold damage + int iDivine; ///< Divine damage + int iElectrical; ///< Electrical damage + int iFire; ///< Fire damage + int iNegative; ///< Negative damage + int iPositive; ///< Positive damage + int iSonic; ///< Sonic damage + int iBase; ///< Base damage + int iAttackNumber; ///< 1-based index of the attack in current combat round + int iAttackResult; ///< 1=hit, 3=critical hit, 4=miss, 8=concealed + int iAttackType; ///< 1=main hand, 2=offhand, 3-5=creature, 6=haste + int iSneakAttack; ///< 0=neither, 1=sneak attack, 2=death attack, 3=both +}; + +/// @struct NWNX_Damage_DamageData +/// @brief Used for DealDamage +struct NWNX_Damage_DamageData +{ + int iBludgeoning; ///< Bludgeoning damage + int iPierce; ///< Piercing damage + int iSlash; ///< Slashing damage + int iMagical; ///< Magical damage + int iAcid; ///< Acid damage + int iCold; ///< Cold damage + int iDivine; ///< Divine damage + int iElectrical; ///< Electrical damage + int iFire; ///< Fire damage + int iNegative; ///< Negative damage + int iPositive; ///< Positive damage + int iSonic; ///< Sonic damage + int iPower; ///< For overcoming DR +}; + +/// @brief Sets the script to run with a damage event. +/// @param sScript The script that will handle the damage event. +/// @param oOwner An object if only executing for a specific object or OBJECT_INVALID for global. +void NWNX_Damage_SetDamageEventScript(string sScript, object oOwner=OBJECT_INVALID); + +/// @brief Get Damage Event Data +/// @return A NWNX_Damage_DamageEventData struct. +/// @note To use only in the Damage Event Script. +struct NWNX_Damage_DamageEventData NWNX_Damage_GetDamageEventData(); + +/// @brief Set Damage Event Data +/// @param data A NWNX_Damage_DamageEventData struct. +/// @note To use only in the Damage Event Script. +void NWNX_Damage_SetDamageEventData(struct NWNX_Damage_DamageEventData data); + +/// @brief Sets the script to run with an attack event. +/// @param sScript The script that will handle the attack event. +/// @param oOwner An object if only executing for a specific object or OBJECT_INVALID for global. +void NWNX_Damage_SetAttackEventScript(string sScript, object oOwner=OBJECT_INVALID); + +/// @brief Get Attack Event Data +/// @return A NWNX_Damage_AttackEventData struct. +/// @note To use only in the Attack Event Script. +struct NWNX_Damage_AttackEventData NWNX_Damage_GetAttackEventData(); + +/// @brief Set Attack Event Data +/// @param data A NWNX_Damage_AttackEventData struct. +/// @note To use only in the Attack Event Script. +void NWNX_Damage_SetAttackEventData(struct NWNX_Damage_AttackEventData data); + +/// @brief Deal damage to a target. +/// @remark Permits multiple damage types and checks enhancement bonus for overcoming DR. +/// @param data A NWNX_Damage_DamageData struct. +/// @param oTarget The target object on whom the damage is dealt. +/// @param oSource The source of the damage. +/// @param iRanged Whether the attack should be treated as ranged by the engine (for example when considering damage inflicted by Acid Sheath and other such effects) +void NWNX_Damage_DealDamage(struct NWNX_Damage_DamageData data, object oTarget, object oSource=OBJECT_SELF, int iRanged = FALSE); + +/// @} + +void NWNX_Damage_SetDamageEventScript(string sScript, object oOwner=OBJECT_INVALID) +{ + string sFunc = "SetEventScript"; + + NWNX_PushArgumentObject(NWNX_Damage, sFunc, oOwner); + NWNX_PushArgumentString(NWNX_Damage, sFunc, sScript); + NWNX_PushArgumentString(NWNX_Damage, sFunc, "DAMAGE"); + + NWNX_CallFunction(NWNX_Damage, sFunc); +} + +struct NWNX_Damage_DamageEventData NWNX_Damage_GetDamageEventData() +{ + string sFunc = "GetDamageEventData"; + struct NWNX_Damage_DamageEventData data; + + NWNX_CallFunction(NWNX_Damage, sFunc); + + data.oDamager = NWNX_GetReturnValueObject(NWNX_Damage, sFunc); + data.iBludgeoning = NWNX_GetReturnValueInt(NWNX_Damage, sFunc); + data.iPierce = NWNX_GetReturnValueInt(NWNX_Damage, sFunc); + data.iSlash = NWNX_GetReturnValueInt(NWNX_Damage, sFunc); + data.iMagical = NWNX_GetReturnValueInt(NWNX_Damage, sFunc); + data.iAcid = NWNX_GetReturnValueInt(NWNX_Damage, sFunc); + data.iCold = NWNX_GetReturnValueInt(NWNX_Damage, sFunc); + data.iDivine = NWNX_GetReturnValueInt(NWNX_Damage, sFunc); + data.iElectrical = NWNX_GetReturnValueInt(NWNX_Damage, sFunc); + data.iFire = NWNX_GetReturnValueInt(NWNX_Damage, sFunc); + data.iNegative = NWNX_GetReturnValueInt(NWNX_Damage, sFunc); + data.iPositive = NWNX_GetReturnValueInt(NWNX_Damage, sFunc); + data.iSonic = NWNX_GetReturnValueInt(NWNX_Damage, sFunc); + data.iBase = NWNX_GetReturnValueInt(NWNX_Damage, sFunc); + + return data; +} + +void NWNX_Damage_SetDamageEventData(struct NWNX_Damage_DamageEventData data) +{ + string sFunc = "SetDamageEventData"; + + NWNX_PushArgumentInt(NWNX_Damage, sFunc, data.iBase); + NWNX_PushArgumentInt(NWNX_Damage, sFunc, data.iSonic); + NWNX_PushArgumentInt(NWNX_Damage, sFunc, data.iPositive); + NWNX_PushArgumentInt(NWNX_Damage, sFunc, data.iNegative); + NWNX_PushArgumentInt(NWNX_Damage, sFunc, data.iFire); + NWNX_PushArgumentInt(NWNX_Damage, sFunc, data.iElectrical); + NWNX_PushArgumentInt(NWNX_Damage, sFunc, data.iDivine); + NWNX_PushArgumentInt(NWNX_Damage, sFunc, data.iCold); + NWNX_PushArgumentInt(NWNX_Damage, sFunc, data.iAcid); + NWNX_PushArgumentInt(NWNX_Damage, sFunc, data.iMagical); + NWNX_PushArgumentInt(NWNX_Damage, sFunc, data.iSlash); + NWNX_PushArgumentInt(NWNX_Damage, sFunc, data.iPierce); + NWNX_PushArgumentInt(NWNX_Damage, sFunc, data.iBludgeoning); + + NWNX_CallFunction(NWNX_Damage, sFunc); +} + +void NWNX_Damage_SetAttackEventScript(string sScript, object oOwner=OBJECT_INVALID) +{ + string sFunc = "SetEventScript"; + + NWNX_PushArgumentObject(NWNX_Damage, sFunc, oOwner); + NWNX_PushArgumentString(NWNX_Damage, sFunc, sScript); + NWNX_PushArgumentString(NWNX_Damage, sFunc, "ATTACK"); + + NWNX_CallFunction(NWNX_Damage, sFunc); +} + +struct NWNX_Damage_AttackEventData NWNX_Damage_GetAttackEventData() +{ + string sFunc = "GetAttackEventData"; + struct NWNX_Damage_AttackEventData data; + + NWNX_CallFunction(NWNX_Damage, sFunc); + + data.oTarget = NWNX_GetReturnValueObject(NWNX_Damage, sFunc); + data.iBludgeoning = NWNX_GetReturnValueInt(NWNX_Damage, sFunc); + data.iPierce = NWNX_GetReturnValueInt(NWNX_Damage, sFunc); + data.iSlash = NWNX_GetReturnValueInt(NWNX_Damage, sFunc); + data.iMagical = NWNX_GetReturnValueInt(NWNX_Damage, sFunc); + data.iAcid = NWNX_GetReturnValueInt(NWNX_Damage, sFunc); + data.iCold = NWNX_GetReturnValueInt(NWNX_Damage, sFunc); + data.iDivine = NWNX_GetReturnValueInt(NWNX_Damage, sFunc); + data.iElectrical = NWNX_GetReturnValueInt(NWNX_Damage, sFunc); + data.iFire = NWNX_GetReturnValueInt(NWNX_Damage, sFunc); + data.iNegative = NWNX_GetReturnValueInt(NWNX_Damage, sFunc); + data.iPositive = NWNX_GetReturnValueInt(NWNX_Damage, sFunc); + data.iSonic = NWNX_GetReturnValueInt(NWNX_Damage, sFunc); + data.iBase = NWNX_GetReturnValueInt(NWNX_Damage, sFunc); + data.iAttackNumber = NWNX_GetReturnValueInt(NWNX_Damage, sFunc); + data.iAttackResult = NWNX_GetReturnValueInt(NWNX_Damage, sFunc); + data.iAttackType = NWNX_GetReturnValueInt(NWNX_Damage, sFunc); + data.iSneakAttack = NWNX_GetReturnValueInt(NWNX_Damage, sFunc); + + return data; +} + +void NWNX_Damage_SetAttackEventData(struct NWNX_Damage_AttackEventData data) +{ + string sFunc = "SetAttackEventData"; + + NWNX_PushArgumentInt(NWNX_Damage, sFunc, data.iAttackResult); + NWNX_PushArgumentInt(NWNX_Damage, sFunc, data.iBase); + NWNX_PushArgumentInt(NWNX_Damage, sFunc, data.iSonic); + NWNX_PushArgumentInt(NWNX_Damage, sFunc, data.iPositive); + NWNX_PushArgumentInt(NWNX_Damage, sFunc, data.iNegative); + NWNX_PushArgumentInt(NWNX_Damage, sFunc, data.iFire); + NWNX_PushArgumentInt(NWNX_Damage, sFunc, data.iElectrical); + NWNX_PushArgumentInt(NWNX_Damage, sFunc, data.iDivine); + NWNX_PushArgumentInt(NWNX_Damage, sFunc, data.iCold); + NWNX_PushArgumentInt(NWNX_Damage, sFunc, data.iAcid); + NWNX_PushArgumentInt(NWNX_Damage, sFunc, data.iMagical); + NWNX_PushArgumentInt(NWNX_Damage, sFunc, data.iSlash); + NWNX_PushArgumentInt(NWNX_Damage, sFunc, data.iPierce); + NWNX_PushArgumentInt(NWNX_Damage, sFunc, data.iBludgeoning); + + NWNX_CallFunction(NWNX_Damage, sFunc); +} + +void NWNX_Damage_DealDamage(struct NWNX_Damage_DamageData data, object oTarget, object oSource, int iRanged = FALSE) +{ + string sFunc = "DealDamage"; + + NWNX_PushArgumentInt(NWNX_Damage, sFunc, iRanged); + NWNX_PushArgumentInt(NWNX_Damage, sFunc, data.iPower); + NWNX_PushArgumentInt(NWNX_Damage, sFunc, data.iSonic); + NWNX_PushArgumentInt(NWNX_Damage, sFunc, data.iPositive); + NWNX_PushArgumentInt(NWNX_Damage, sFunc, data.iNegative); + NWNX_PushArgumentInt(NWNX_Damage, sFunc, data.iFire); + NWNX_PushArgumentInt(NWNX_Damage, sFunc, data.iElectrical); + NWNX_PushArgumentInt(NWNX_Damage, sFunc, data.iDivine); + NWNX_PushArgumentInt(NWNX_Damage, sFunc, data.iCold); + NWNX_PushArgumentInt(NWNX_Damage, sFunc, data.iAcid); + NWNX_PushArgumentInt(NWNX_Damage, sFunc, data.iMagical); + NWNX_PushArgumentInt(NWNX_Damage, sFunc, data.iSlash); + NWNX_PushArgumentInt(NWNX_Damage, sFunc, data.iPierce); + NWNX_PushArgumentInt(NWNX_Damage, sFunc, data.iBludgeoning); + NWNX_PushArgumentObject(NWNX_Damage, sFunc, oTarget); + NWNX_PushArgumentObject(NWNX_Damage, sFunc, oSource); + + NWNX_CallFunction(NWNX_Damage, sFunc); +} diff --git a/gamma_age_v2/nwnx_data.nss b/gamma_age_v2/nwnx_data.nss new file mode 100644 index 00000000..b900de5b --- /dev/null +++ b/gamma_age_v2/nwnx_data.nss @@ -0,0 +1,351 @@ +/// @addtogroup data Data +/// @brief Provides a number of data structures for NWN code to use (simulated arrays) +/// @{ +/// @file nwnx_data.nss + +#include "inc_array" + +// All these calls just pass through to the Array code in inc_array to provide +// an NWNX_Data compatible API for ease of transition. + +const int NWNX_DATA_INVALID_INDEX = INVALID_INDEX; +const int NWNX_DATA_TYPE_FLOAT = TYPE_FLOAT; +const int NWNX_DATA_TYPE_INTEGER = TYPE_INTEGER; +const int NWNX_DATA_TYPE_OBJECT = TYPE_OBJECT; +const int NWNX_DATA_TYPE_STRING = TYPE_STRING; + +/// @defgroup data_array_at Array At +/// @brief Returns the element at the index. +/// @ingroup data +/// @param obj The object. +/// @param tag The tag. +/// @param index The index. +/// @return The element of associated type. +/// @{ +string NWNX_Data_Array_At_Str(object obj, string tag, int index); +float NWNX_Data_Array_At_Flt(object obj, string tag, int index); +int NWNX_Data_Array_At_Int(object obj, string tag, int index); +object NWNX_Data_Array_At_Obj(object obj, string tag, int index); +/// @} + + +/// Clears the entire array, such that size==0. +void NWNX_Data_Array_Clear(int type, object obj, string tag); + +/// @defgroup data_array_contains Array Contains +/// @brief Checks if array contains the element. +/// @ingroup data +/// @param obj The object. +/// @param tag The tag. +/// @param element The element. +/// @return TRUE if the collection contains the element. +/// @{ +int NWNX_Data_Array_Contains_Flt(object obj, string tag, float element); +int NWNX_Data_Array_Contains_Int(object obj, string tag, int element); +int NWNX_Data_Array_Contains_Obj(object obj, string tag, object element); +int NWNX_Data_Array_Contains_Str(object obj, string tag, string element); +/// @} + +/// Copies the array of name otherTag over the array of name tag. +void NWNX_Data_Array_Copy(int type, object obj, string tag, string otherTag); + +/// Erases the element at index, and shuffles any elements from index size-1 to index + 1 left. +void NWNX_Data_Array_Erase(int type, object obj, string tag, int index); + +/// @defgroup data_array_find Array Find +/// @brief Get the index at which the element is located. +/// @ingroup data +/// @param obj The object. +/// @param tag The tag. +/// @param element The element. +/// @return Returns the index at which the element is located, or ARRAY_INVALID_INDEX. +/// @{ +int NWNX_Data_Array_Find_Flt(object obj, string tag, float element); +int NWNX_Data_Array_Find_Int(object obj, string tag, int element); +int NWNX_Data_Array_Find_Obj(object obj, string tag, object element); +int NWNX_Data_Array_Find_Str(object obj, string tag, string element); +/// @} + +/// @defgroup data_array_insert Array Insert +/// @brief Inserts the element at the index, where size > index >= 0. +/// @ingroup data +/// @param obj The object. +/// @param tag The tag. +/// @param index The index. +/// @param element The element. +/// @{ +void NWNX_Data_Array_Insert_Flt(object obj, string tag, int index, float element); +void NWNX_Data_Array_Insert_Int(object obj, string tag, int index, int element); +void NWNX_Data_Array_Insert_Obj(object obj, string tag, int index, object element); +void NWNX_Data_Array_Insert_Str(object obj, string tag, int index, string element); +/// @} + +/// @defgroup data_array_pushback Array Pushback +/// @brief Pushes an element to the back of the collection. +/// @remark Functionally identical to an insert at index size-1. +/// @ingroup data +/// @param obj The object. +/// @param tag The tag. +/// @param element The element. +/// @{ +void NWNX_Data_Array_PushBack_Flt(object obj, string tag, float element); +void NWNX_Data_Array_PushBack_Int(object obj, string tag, int element); +void NWNX_Data_Array_PushBack_Obj(object obj, string tag, object element); +void NWNX_Data_Array_PushBack_Str(object obj, string tag, string element); +/// @} + +/// Resizes the array. If the array is shrinking, it chops off elements at the ned. +void NWNX_Data_Array_Resize(int type, object obj, string tag, int size); + +/// Reorders the array such each possible permutation of elements has equal probability of appearance. +void NWNX_Data_Array_Shuffle(int type, object obj, string tag); + +/// Returns the size of the array. +int NWNX_Data_Array_Size(int type, object obj, string tag); + +/// Sorts the collection based on descending order. +void NWNX_Data_Array_SortAscending(int type, object obj, string tag); + +/// Sorts the collection based on descending order. +void NWNX_Data_Array_SortDescending(int type, object obj, string tag); + +/// @defgroup data_array_set Array Set +/// @brief Sets the element at the index, where size > index >= 0. +/// @ingroup data +/// @param obj The object. +/// @param tag The tag. +/// @param index The index. +/// @param element The element. +/// @{ +void NWNX_Data_Array_Set_Flt(object obj, string tag, int index, float element); +void NWNX_Data_Array_Set_Int(object obj, string tag, int index, int element); +void NWNX_Data_Array_Set_Obj(object obj, string tag, int index, object element); +void NWNX_Data_Array_Set_Str(object obj, string tag, int index, string element); +/// @} + +/// @} + +//////////////////////////////////////////////////////////////////////////////// +// return the value contained in location "index" +string NWNX_Data_Array_At_Str(object obj, string tag, int index) +{ + WriteTimestampedLogEntry("WARNING: NWNX_Data is deprecated. You should migrate to Array (see inc_array)"); + return Array_At_Str(tag, index, obj); +} + +float NWNX_Data_Array_At_Flt(object obj, string tag, int index) +{ + WriteTimestampedLogEntry("WARNING: NWNX_Data is deprecated. You should migrate to Array (see inc_array)"); + return Array_At_Flt(tag, index, obj); +} + +int NWNX_Data_Array_At_Int(object obj, string tag, int index) +{ + WriteTimestampedLogEntry("WARNING: NWNX_Data is deprecated. You should migrate to Array (see inc_array)"); + return Array_At_Int(tag, index, obj); +} + +object NWNX_Data_Array_At_Obj(object obj, string tag, int index) +{ + WriteTimestampedLogEntry("WARNING: NWNX_Data is deprecated. You should migrate to Array (see inc_array)"); + return Array_At_Obj(tag, index, obj); +} + +void NWNX_Data_Array_Clear(int type, object obj, string tag) +{ + WriteTimestampedLogEntry("WARNING: NWNX_Data is deprecated. You should migrate to Array (see inc_array)"); + Array_Clear(tag, obj); +} + +//////////////////////////////////////////////////////////////////////////////// +// Return true/value (1/0) if the array contains the value "element" +int NWNX_Data_Array_Contains_Str(object obj, string tag, string element) +{ + WriteTimestampedLogEntry("WARNING: NWNX_Data is deprecated. You should migrate to Array (see inc_array)"); + return Array_Contains_Str(tag, element, obj); +} + +int NWNX_Data_Array_Contains_Flt(object obj, string tag, float element) +{ + WriteTimestampedLogEntry("WARNING: NWNX_Data is deprecated. You should migrate to Array (see inc_array)"); + return Array_Contains_Flt(tag, element, obj); +} + +int NWNX_Data_Array_Contains_Int(object obj, string tag, int element) +{ + WriteTimestampedLogEntry("WARNING: NWNX_Data is deprecated. You should migrate to Array (see inc_array)"); + return Array_Contains_Int(tag, element, obj); +} + +int NWNX_Data_Array_Contains_Obj(object obj, string tag, object element) +{ + WriteTimestampedLogEntry("WARNING: NWNX_Data is deprecated. You should migrate to Array (see inc_array)"); + return Array_Contains_Obj(tag, element, obj); +} + + +//////////////////////////////////////////////////////////////////////////////// +void NWNX_Data_Array_Copy(int type, object obj, string tag, string otherTag) +{ + WriteTimestampedLogEntry("WARNING: NWNX_Data is deprecated. You should migrate to Array (see inc_array)"); + Array_Copy(tag, otherTag, obj); +} + +//////////////////////////////////////////////////////////////////////////////// +void NWNX_Data_Array_Erase(int type, object obj, string tag, int index) +{ + WriteTimestampedLogEntry("WARNING: NWNX_Data is deprecated. You should migrate to Array (see inc_array)"); + Array_Erase(tag, index, obj); +} + +//////////////////////////////////////////////////////////////////////////////// +// return the index in the array containing "element" +// if not found, return NWNX_DATA_INVALID_INDEX +int NWNX_Data_Array_Find_Str(object obj, string tag, string element) +{ + WriteTimestampedLogEntry("WARNING: NWNX_Data is deprecated. You should migrate to Array (see inc_array)"); + return Array_Find_Str(tag, element, obj); +} + +int NWNX_Data_Array_Find_Flt(object obj, string tag, float element) +{ + WriteTimestampedLogEntry("WARNING: NWNX_Data is deprecated. You should migrate to Array (see inc_array)"); + return Array_Find_Flt(tag, element, obj); +} + +int NWNX_Data_Array_Find_Int(object obj, string tag, int element) +{ + WriteTimestampedLogEntry("WARNING: NWNX_Data is deprecated. You should migrate to Array (see inc_array)"); + return Array_Find_Int(tag, element, obj); +} + +int NWNX_Data_Array_Find_Obj(object obj, string tag, object element) +{ + WriteTimestampedLogEntry("WARNING: NWNX_Data is deprecated. You should migrate to Array (see inc_array)"); + return Array_Find_Obj(tag, element, obj); +} + +//////////////////////////////////////////////////////////////////////////////// +// Insert a new element into position 'index'. If index is beyond the number of rows in the array, +// this will quietly fail. This could be changed if you wanted to support sparse +// arrays. +void NWNX_Data_Array_Insert_Str(object obj, string tag, int index, string element) +{ + WriteTimestampedLogEntry("WARNING: NWNX_Data is deprecated. You should migrate to Array (see inc_array)"); + Array_Insert_Str(tag, index, element, obj); +} + +void NWNX_Data_Array_Insert_Flt(object obj, string tag, int index, float element) +{ + WriteTimestampedLogEntry("WARNING: NWNX_Data is deprecated. You should migrate to Array (see inc_array)"); + Array_Insert_Flt(tag, index, element, obj); +} + +void NWNX_Data_Array_Insert_Int(object obj, string tag, int index, int element) +{ + WriteTimestampedLogEntry("WARNING: NWNX_Data is deprecated. You should migrate to Array (see inc_array)"); + Array_Insert_Int(tag, index, element, obj); +} + +void NWNX_Data_Array_Insert_Obj(object obj, string tag, int index, object element) +{ + WriteTimestampedLogEntry("WARNING: NWNX_Data is deprecated. You should migrate to Array (see inc_array)"); + Array_Insert_Obj(tag, index, element, obj); +} + +//////////////////////////////////////////////////////////////////////////////// +// Insert a new element at the end of the array. +void NWNX_Data_Array_PushBack_Str(object obj, string tag, string element) +{ + WriteTimestampedLogEntry("WARNING: NWNX_Data is deprecated. You should migrate to Array (see inc_array)"); + Array_PushBack_Str(tag, element, obj); +} + +void NWNX_Data_Array_PushBack_Flt(object obj, string tag, float element) +{ + WriteTimestampedLogEntry("WARNING: NWNX_Data is deprecated. You should migrate to Array (see inc_array)"); + Array_PushBack_Flt(tag, element, obj); +} + +void NWNX_Data_Array_PushBack_Int(object obj, string tag, int element) +{ + WriteTimestampedLogEntry("WARNING: NWNX_Data is deprecated. You should migrate to Array (see inc_array)"); + Array_PushBack_Int(tag, element, obj); +} + +void NWNX_Data_Array_PushBack_Obj(object obj, string tag, object element) +{ + WriteTimestampedLogEntry("WARNING: NWNX_Data is deprecated. You should migrate to Array (see inc_array)"); + Array_PushBack_Obj(tag, element, obj); +} + +//////////////////////////////////////////////////////////////////////////////// +// Cuts the array off at size 'size'. Elements beyond size are removed. +void NWNX_Data_Array_Resize(int type, object obj, string tag, int size) +{ + WriteTimestampedLogEntry("WARNING: NWNX_Data is deprecated. You should migrate to Array (see inc_array)"); + Array_Resize(tag, size, obj); +} + +//////////////////////////////////////////////////////////////////////////////// +void NWNX_Data_Array_Shuffle(int type, object obj, string tag) +{ + WriteTimestampedLogEntry("WARNING: NWNX_Data is deprecated. You should migrate to Array (see inc_array)"); + Array_Shuffle(tag, obj); +} + +//////////////////////////////////////////////////////////////////////////////// +int NWNX_Data_Array_Size(int type, object obj, string tag) +{ + WriteTimestampedLogEntry("WARNING: NWNX_Data is deprecated. You should migrate to Array (see inc_array)"); + return Array_Size(tag, obj); +} + +//////////////////////////////////////////////////////////////////////////////// +// Sort the array by value according to 'direciton' (ASC or DESC) +// Note that this is a lexical sort, so sorting an array of ints or floats will have +// odd results +void NWNX_Data_Array_Sort(object obj, string tag, string direction) +{ + WriteTimestampedLogEntry("WARNING: NWNX_Data is deprecated. You should migrate to Array (see inc_array)"); + Array_Sort(tag, direction, TYPE_STRING, obj); +} + +void NWNX_Data_Array_SortAscending(int type, object obj, string tag) +{ + WriteTimestampedLogEntry("WARNING: NWNX_Data is deprecated. You should migrate to Array (see inc_array)"); + Array_SortAscending(tag, TYPE_STRING, obj); +} + +void NWNX_Data_Array_SortDescending(int type, object obj, string tag) +{ + WriteTimestampedLogEntry("WARNING: NWNX_Data is deprecated. You should migrate to Array (see inc_array)"); + Array_SortDescending(tag, TYPE_STRING, obj); +} + +//////////////////////////////////////////////////////////////////////////////// +// Set the value of array index 'index' to a 'element' +// This will quietly eat values if index > array size +void NWNX_Data_Array_Set_Str(object obj, string tag, int index, string element) +{ + WriteTimestampedLogEntry("WARNING: NWNX_Data is deprecated. You should migrate to Array (see inc_array)"); + Array_Set_Str(tag, index, element, obj); +} + +void NWNX_Data_Array_Set_Flt(object obj, string tag, int index, float element) +{ + WriteTimestampedLogEntry("WARNING: NWNX_Data is deprecated. You should migrate to Array (see inc_array)"); + Array_Set_Flt(tag, index, element, obj); +} + +void NWNX_Data_Array_Set_Int(object obj, string tag, int index, int element) +{ + WriteTimestampedLogEntry("WARNING: NWNX_Data is deprecated. You should migrate to Array (see inc_array)"); + Array_Set_Int(tag, index, element, obj); +} + +void NWNX_Data_Array_Set_Obj(object obj, string tag, int index, object element) +{ + WriteTimestampedLogEntry("WARNING: NWNX_Data is deprecated. You should migrate to Array (see inc_array)"); + Array_Set_Obj(tag, index, element, obj); +} diff --git a/gamma_age_v2/nwnx_dialog.nss b/gamma_age_v2/nwnx_dialog.nss new file mode 100644 index 00000000..744943b5 --- /dev/null +++ b/gamma_age_v2/nwnx_dialog.nss @@ -0,0 +1,139 @@ +/// @addtogroup dialog Dialog +/// @brief Functions exposing additional dialog properties +/// @{ +/// @file nwnx_dialog.nss + +#include "nwnx" + +const string NWNX_Dialog = "NWNX_Dialog"; ///< @private + +/// @name Dialog Node Types +/// @anchor dialog_node_types +/// @{ +const int NWNX_DIALOG_NODE_TYPE_INVALID = -1; +const int NWNX_DIALOG_NODE_TYPE_STARTING_NODE = 0; +const int NWNX_DIALOG_NODE_TYPE_ENTRY_NODE = 1; +const int NWNX_DIALOG_NODE_TYPE_REPLY_NODE = 2; +/// @} + +/// @name Dialog Script Types +/// @anchor dialog_script_types +/// @{ +const int NWNX_DIALOG_SCRIPT_TYPE_OTHER = 0; +const int NWNX_DIALOG_SCRIPT_TYPE_STARTING_CONDITIONAL = 1; +const int NWNX_DIALOG_SCRIPT_TYPE_ACTION_TAKEN = 2; +/// @} + +/// @name Dialog Languages +/// @anchor dialog_languages +/// @{ +const int NWNX_DIALOG_LANGUAGE_ENGLISH = 0; +const int NWNX_DIALOG_LANGUAGE_FRENCH = 1; +const int NWNX_DIALOG_LANGUAGE_GERMAN = 2; +const int NWNX_DIALOG_LANGUAGE_ITALIAN = 3; +const int NWNX_DIALOG_LANGUAGE_SPANISH = 4; +const int NWNX_DIALOG_LANGUAGE_POLISH = 5; +const int NWNX_DIALOG_LANGUAGE_KOREAN = 128; +const int NWNX_DIALOG_LANGUAGE_CHINESE_TRADITIONAL = 129; +const int NWNX_DIALOG_LANGUAGE_CHINESE_SIMPLIFIED = 130; +const int NWNX_DIALOG_LANGUAGE_JAPANESE = 131; +/// @} + +/// @brief Get the @ref dialog_node_types "Node Type" of the current text node +/// @return A @ref dialog_node_types "Node Type". If called out of dialog, returns NWNX_DIALOG_NODE_TYPE_INVALID +int NWNX_Dialog_GetCurrentNodeType(); + +/// @brief Get the @ref dialog_script_types "Script Type" of the current text node +/// @return A @ref dialog_script_types "Node Type". If called out of dialog, returns NWNX_DIALOG_SCRIPT_TYPE_OTHER +int NWNX_Dialog_GetCurrentScriptType(); + +/// @brief Get the absolute ID of the current node in the conversation +/// @note NWNX_DIALOG_NODE_TYPE_ENTRY_NODE and NWNX_DIALOG_NODE_TYPE_REPLY_NODE nodes +/// have different namespaces, so they can share the same ID +/// @return The absolute ID in the dialog. If called out of dialog, returns -1 +int NWNX_Dialog_GetCurrentNodeID(); + +/// @brief Get the index of the current node in the list of replies/entries. +/// @note The index is zero based, and counts items not displayed due to a StartingConditional. +/// @return The index of the current node. +int NWNX_Dialog_GetCurrentNodeIndex(); + +/// @brief Get the text of the current node +/// @param language The @ref dialog_languages "language" of the text. +/// @param gender The gender for the text. +string NWNX_Dialog_GetCurrentNodeText(int language=NWNX_DIALOG_LANGUAGE_ENGLISH, int gender=GENDER_MALE); + +/// @brief Set the text of the current node for given language/gender +/// @note This will only work in a starting conditional script (action take comes after the text is displayed) +/// @param text The text for the node. +/// @param language The @ref dialog_languages "language" of the text. +/// @param gender The gender for the text. +void NWNX_Dialog_SetCurrentNodeText(string text, int language=NWNX_DIALOG_LANGUAGE_ENGLISH, int gender=GENDER_MALE); + +/// @brief End a conversation oObject is involved in, it will fire the OnAbort script of the conversation +/// @warning Calling this from a conversation script will crash your server. +/// @param oObject The object in a conversation +void NWNX_Dialog_End(object oObject); + +/// @} + + +int NWNX_Dialog_GetCurrentNodeType() +{ + string sFunc = "GetCurrentNodeType"; + + NWNX_CallFunction(NWNX_Dialog, sFunc); + return NWNX_GetReturnValueInt(NWNX_Dialog, sFunc); +} + +int NWNX_Dialog_GetCurrentScriptType() +{ + string sFunc = "GetCurrentScriptType"; + + NWNX_CallFunction(NWNX_Dialog, sFunc); + return NWNX_GetReturnValueInt(NWNX_Dialog, sFunc); +} + +int NWNX_Dialog_GetCurrentNodeID() +{ + string sFunc = "GetCurrentNodeID"; + + NWNX_CallFunction(NWNX_Dialog, sFunc); + return NWNX_GetReturnValueInt(NWNX_Dialog, sFunc); +} + +int NWNX_Dialog_GetCurrentNodeIndex() +{ + string sFunc = "GetCurrentNodeIndex"; + + NWNX_CallFunction(NWNX_Dialog, sFunc); + return NWNX_GetReturnValueInt(NWNX_Dialog, sFunc); +} + +string NWNX_Dialog_GetCurrentNodeText(int language=NWNX_DIALOG_LANGUAGE_ENGLISH, int gender=GENDER_MALE) +{ + string sFunc = "GetCurrentNodeText"; + + NWNX_PushArgumentInt(NWNX_Dialog, sFunc, gender); + NWNX_PushArgumentInt(NWNX_Dialog, sFunc, language); + NWNX_CallFunction(NWNX_Dialog, sFunc); + return NWNX_GetReturnValueString(NWNX_Dialog, sFunc); +} + +void NWNX_Dialog_SetCurrentNodeText(string text, int language=NWNX_DIALOG_LANGUAGE_ENGLISH, int gender=GENDER_MALE) +{ + string sFunc = "SetCurrentNodeText"; + + NWNX_PushArgumentInt(NWNX_Dialog, sFunc, gender); + NWNX_PushArgumentInt(NWNX_Dialog, sFunc, language); + NWNX_PushArgumentString(NWNX_Dialog, sFunc, text); + NWNX_CallFunction(NWNX_Dialog, sFunc); +} + +void NWNX_Dialog_End(object oObject) +{ + string sFunc = "End"; + + NWNX_PushArgumentObject(NWNX_Dialog, sFunc, oObject); + NWNX_CallFunction(NWNX_Dialog, sFunc); +} diff --git a/gamma_age_v2/nwnx_effect.nss b/gamma_age_v2/nwnx_effect.nss new file mode 100644 index 00000000..fdc61035 --- /dev/null +++ b/gamma_age_v2/nwnx_effect.nss @@ -0,0 +1,259 @@ +/// @addtogroup effect Effect +/// @brief Utility functions to manipulate the builtin effect type. +/// @{ +/// @file nwnx_effect.nss +#include "nwnx" + +const string NWNX_Effect = "NWNX_Effect"; ///< @private + +/// An unpacked effect +struct NWNX_EffectUnpacked +{ + int nType; ///< @todo Describe + int nSubType; ///< @todo Describe + + float fDuration; ///< @todo Describe + int nExpiryCalendarDay; ///< @todo Describe + int nExpiryTimeOfDay; ///< @todo Describe + + object oCreator; ///< @todo Describe + int nSpellId; ///< @todo Describe + int bExpose; ///< @todo Describe + int bShowIcon; ///< @todo Describe + int nCasterLevel; ///< @todo Describe + + effect eLinkLeft; ///< @todo Describe + int bLinkLeftValid; ///< @todo Describe + effect eLinkRight; ///< @todo Describe + int bLinkRightValid; ///< @todo Describe + + int nNumIntegers; ///< @todo Describe + int nParam0; ///< @todo Describe + int nParam1; ///< @todo Describe + int nParam2; ///< @todo Describe + int nParam3; ///< @todo Describe + int nParam4; ///< @todo Describe + int nParam5; ///< @todo Describe + int nParam6; ///< @todo Describe + int nParam7; ///< @todo Describe + float fParam0; ///< @todo Describe + float fParam1; ///< @todo Describe + float fParam2; ///< @todo Describe + float fParam3; ///< @todo Describe + string sParam0; ///< @todo Describe + string sParam1; ///< @todo Describe + string sParam2; ///< @todo Describe + string sParam3; ///< @todo Describe + string sParam4; ///< @todo Describe + string sParam5; ///< @todo Describe + object oParam0; ///< @todo Describe + object oParam1; ///< @todo Describe + object oParam2; ///< @todo Describe + object oParam3; ///< @todo Describe + vector vParam0; ///< @todo Describe + vector vParam1; ///< @todo Describe + + string sTag; ///< @todo Describe +}; + +/// @brief Convert native effect type to unpacked structure. +/// @param e The effect to convert. +/// @return A constructed NWNX_EffectUnpacked. +struct NWNX_EffectUnpacked NWNX_Effect_UnpackEffect(effect e); + +/// @brief Convert unpacked effect structure to native type. +/// @param e The NWNX_EffectUnpacked structure to convert. +/// @return The effect. +effect NWNX_Effect_PackEffect(struct NWNX_EffectUnpacked e); + +/// @brief Set a script with optional data that runs when an effect expires +/// @param e The effect. +/// @param script The script to run when the effect expires. +/// @param data Any other data you wish to send back to the script. +/// @remark OBJECT_SELF in the script is the object the effect is applied to. +/// @note Only works for TEMPORARY and PERMANENT effects applied to an object. +effect NWNX_Effect_SetEffectExpiredScript(effect e, string script, string data = ""); + +/// @brief Get the data set with NWNX_Effect_SetEffectExpiredScript() +/// @note Should only be called from a script set with NWNX_Effect_SetEffectExpiredScript(). +/// @return The data attached to the effect. +string NWNX_Effect_GetEffectExpiredData(); + +/// @brief Get the effect creator. +/// @note Should only be called from a script set with NWNX_Effect_SetEffectExpiredScript(). +/// @return The object from which the effect originated. +object NWNX_Effect_GetEffectExpiredCreator(); + +/// @brief replace an already applied effect on an object +/// Only duration, subtype, tag and spell related fields can be overwritten. +/// @note eNew and eOld need to have the same type. +/// @return Number of internal effects updated. +int NWNX_Effect_ReplaceEffect(object obj, effect eOld, effect eNew); + +/// @} + +struct NWNX_EffectUnpacked NWNX_Effect_UnpackEffect(effect e) +{ + string sFunc = "UnpackEffect"; + + NWNX_PushArgumentEffect(NWNX_Effect, sFunc, e); + NWNX_CallFunction(NWNX_Effect, sFunc); + + struct NWNX_EffectUnpacked n; + n.sTag = NWNX_GetReturnValueString(NWNX_Effect, sFunc); + + float fZ = NWNX_GetReturnValueFloat(NWNX_Effect, sFunc); + float fY = NWNX_GetReturnValueFloat(NWNX_Effect, sFunc); + float fX = NWNX_GetReturnValueFloat(NWNX_Effect, sFunc); + n.vParam1 = Vector(fX, fY, fZ); + fZ = NWNX_GetReturnValueFloat(NWNX_Effect, sFunc); + fY = NWNX_GetReturnValueFloat(NWNX_Effect, sFunc); + fX = NWNX_GetReturnValueFloat(NWNX_Effect, sFunc); + n.vParam0 = Vector(fX, fY, fZ); + n.oParam3 = NWNX_GetReturnValueObject(NWNX_Effect, sFunc); + n.oParam2 = NWNX_GetReturnValueObject(NWNX_Effect, sFunc); + n.oParam1 = NWNX_GetReturnValueObject(NWNX_Effect, sFunc); + n.oParam0 = NWNX_GetReturnValueObject(NWNX_Effect, sFunc); + n.sParam5 = NWNX_GetReturnValueString(NWNX_Effect, sFunc); + n.sParam4 = NWNX_GetReturnValueString(NWNX_Effect, sFunc); + n.sParam3 = NWNX_GetReturnValueString(NWNX_Effect, sFunc); + n.sParam2 = NWNX_GetReturnValueString(NWNX_Effect, sFunc); + n.sParam1 = NWNX_GetReturnValueString(NWNX_Effect, sFunc); + n.sParam0 = NWNX_GetReturnValueString(NWNX_Effect, sFunc); + n.fParam3 = NWNX_GetReturnValueFloat(NWNX_Effect, sFunc); + n.fParam2 = NWNX_GetReturnValueFloat(NWNX_Effect, sFunc); + n.fParam1 = NWNX_GetReturnValueFloat(NWNX_Effect, sFunc); + n.fParam0 = NWNX_GetReturnValueFloat(NWNX_Effect, sFunc); + n.nParam7 = NWNX_GetReturnValueInt(NWNX_Effect, sFunc); + n.nParam6 = NWNX_GetReturnValueInt(NWNX_Effect, sFunc); + n.nParam5 = NWNX_GetReturnValueInt(NWNX_Effect, sFunc); + n.nParam4 = NWNX_GetReturnValueInt(NWNX_Effect, sFunc); + n.nParam3 = NWNX_GetReturnValueInt(NWNX_Effect, sFunc); + n.nParam2 = NWNX_GetReturnValueInt(NWNX_Effect, sFunc); + n.nParam1 = NWNX_GetReturnValueInt(NWNX_Effect, sFunc); + n.nParam0 = NWNX_GetReturnValueInt(NWNX_Effect, sFunc); + n.nNumIntegers = NWNX_GetReturnValueInt(NWNX_Effect, sFunc); + + n.bLinkRightValid = NWNX_GetReturnValueInt(NWNX_Effect, sFunc); + n.eLinkRight = NWNX_GetReturnValueEffect(NWNX_Effect, sFunc); + n.bLinkLeftValid = NWNX_GetReturnValueInt(NWNX_Effect, sFunc); + n.eLinkLeft = NWNX_GetReturnValueEffect(NWNX_Effect, sFunc); + + n.nCasterLevel = NWNX_GetReturnValueInt(NWNX_Effect, sFunc); + n.bShowIcon = NWNX_GetReturnValueInt(NWNX_Effect, sFunc); + n.bExpose = NWNX_GetReturnValueInt(NWNX_Effect, sFunc); + n.nSpellId = NWNX_GetReturnValueInt(NWNX_Effect, sFunc); + n.oCreator = NWNX_GetReturnValueObject(NWNX_Effect, sFunc); + + n.nExpiryTimeOfDay = NWNX_GetReturnValueInt(NWNX_Effect, sFunc); + n.nExpiryCalendarDay = NWNX_GetReturnValueInt(NWNX_Effect, sFunc); + n.fDuration = NWNX_GetReturnValueFloat(NWNX_Effect, sFunc); + + n.nSubType = NWNX_GetReturnValueInt(NWNX_Effect, sFunc); + n.nType = NWNX_GetReturnValueInt(NWNX_Effect, sFunc); + + return n; +} +effect NWNX_Effect_PackEffect(struct NWNX_EffectUnpacked e) +{ + string sFunc = "PackEffect"; + + NWNX_PushArgumentInt(NWNX_Effect, sFunc, e.nType); + NWNX_PushArgumentInt(NWNX_Effect, sFunc, e.nSubType); + + NWNX_PushArgumentFloat(NWNX_Effect, sFunc, e.fDuration); + NWNX_PushArgumentInt(NWNX_Effect, sFunc, e.nExpiryCalendarDay); + NWNX_PushArgumentInt(NWNX_Effect, sFunc, e.nExpiryTimeOfDay); + + NWNX_PushArgumentObject(NWNX_Effect, sFunc, e.oCreator); + NWNX_PushArgumentInt(NWNX_Effect, sFunc, e.nSpellId); + NWNX_PushArgumentInt(NWNX_Effect, sFunc, e.bExpose); + NWNX_PushArgumentInt(NWNX_Effect, sFunc, e.bShowIcon); + NWNX_PushArgumentInt(NWNX_Effect, sFunc, e.nCasterLevel); + + NWNX_PushArgumentEffect(NWNX_Effect, sFunc, e.eLinkLeft); + NWNX_PushArgumentInt(NWNX_Effect, sFunc, e.bLinkLeftValid); + NWNX_PushArgumentEffect(NWNX_Effect, sFunc, e.eLinkRight); + NWNX_PushArgumentInt(NWNX_Effect, sFunc, e.bLinkRightValid); + + NWNX_PushArgumentInt(NWNX_Effect, sFunc, e.nNumIntegers); + NWNX_PushArgumentInt(NWNX_Effect, sFunc, e.nParam0); + NWNX_PushArgumentInt(NWNX_Effect, sFunc, e.nParam1); + NWNX_PushArgumentInt(NWNX_Effect, sFunc, e.nParam2); + NWNX_PushArgumentInt(NWNX_Effect, sFunc, e.nParam3); + NWNX_PushArgumentInt(NWNX_Effect, sFunc, e.nParam4); + NWNX_PushArgumentInt(NWNX_Effect, sFunc, e.nParam5); + NWNX_PushArgumentInt(NWNX_Effect, sFunc, e.nParam6); + NWNX_PushArgumentInt(NWNX_Effect, sFunc, e.nParam7); + NWNX_PushArgumentFloat(NWNX_Effect, sFunc, e.fParam0); + NWNX_PushArgumentFloat(NWNX_Effect, sFunc, e.fParam1); + NWNX_PushArgumentFloat(NWNX_Effect, sFunc, e.fParam2); + NWNX_PushArgumentFloat(NWNX_Effect, sFunc, e.fParam3); + NWNX_PushArgumentString(NWNX_Effect, sFunc, e.sParam0); + NWNX_PushArgumentString(NWNX_Effect, sFunc, e.sParam1); + NWNX_PushArgumentString(NWNX_Effect, sFunc, e.sParam2); + NWNX_PushArgumentString(NWNX_Effect, sFunc, e.sParam3); + NWNX_PushArgumentString(NWNX_Effect, sFunc, e.sParam4); + NWNX_PushArgumentString(NWNX_Effect, sFunc, e.sParam5); + NWNX_PushArgumentObject(NWNX_Effect, sFunc, e.oParam0); + NWNX_PushArgumentObject(NWNX_Effect, sFunc, e.oParam1); + NWNX_PushArgumentObject(NWNX_Effect, sFunc, e.oParam2); + NWNX_PushArgumentObject(NWNX_Effect, sFunc, e.oParam3); + + NWNX_PushArgumentFloat(NWNX_Effect, sFunc, e.vParam0.x); + NWNX_PushArgumentFloat(NWNX_Effect, sFunc, e.vParam0.y); + NWNX_PushArgumentFloat(NWNX_Effect, sFunc, e.vParam0.z); + + NWNX_PushArgumentFloat(NWNX_Effect, sFunc, e.vParam1.x); + NWNX_PushArgumentFloat(NWNX_Effect, sFunc, e.vParam1.y); + NWNX_PushArgumentFloat(NWNX_Effect, sFunc, e.vParam1.z); + + NWNX_PushArgumentString(NWNX_Effect, sFunc, e.sTag); + + NWNX_CallFunction(NWNX_Effect, sFunc); + return NWNX_GetReturnValueEffect(NWNX_Effect, sFunc); +} + +effect NWNX_Effect_SetEffectExpiredScript(effect e, string script, string data = "") +{ + string sFunc = "SetEffectExpiredScript"; + + NWNX_PushArgumentString(NWNX_Effect, sFunc, data); + NWNX_PushArgumentString(NWNX_Effect, sFunc, script); + NWNX_PushArgumentEffect(NWNX_Effect, sFunc, e); + + NWNX_CallFunction(NWNX_Effect, sFunc); + + return NWNX_GetReturnValueEffect(NWNX_Effect, sFunc); +} + +string NWNX_Effect_GetEffectExpiredData() +{ + string sFunc = "GetEffectExpiredData"; + + NWNX_CallFunction(NWNX_Effect, sFunc); + + return NWNX_GetReturnValueString(NWNX_Effect, sFunc); +} + +object NWNX_Effect_GetEffectExpiredCreator() +{ + string sFunc = "GetEffectExpiredCreator"; + + NWNX_CallFunction(NWNX_Effect, sFunc); + + return NWNX_GetReturnValueObject(NWNX_Effect, sFunc); +} + +int NWNX_Effect_ReplaceEffect(object obj, effect eOld, effect eNew) +{ + string sFunc = "ReplaceEffect"; + + NWNX_PushArgumentEffect(NWNX_Effect, sFunc, eNew); + NWNX_PushArgumentEffect(NWNX_Effect, sFunc, eOld); + NWNX_PushArgumentObject(NWNX_Effect, sFunc, obj); + + NWNX_CallFunction(NWNX_Effect, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Effect, sFunc); +} diff --git a/gamma_age_v2/nwnx_elc.nss b/gamma_age_v2/nwnx_elc.nss new file mode 100644 index 00000000..05049633 --- /dev/null +++ b/gamma_age_v2/nwnx_elc.nss @@ -0,0 +1,244 @@ +/// @addtogroup elc ELC +/// @brief Replacement for ValidateCharacter: ELC & ILR +/// @{ +/// @file nwnx_elc.nss +#include "nwnx" + +const string NWNX_ELC = "NWNX_ELC"; ///< @private + + +/// @anchor elc_fail_type +/// @name ELC Failure Types +/// @{ +const int NWNX_ELC_VALIDATION_FAILURE_TYPE_NONE = 0; +const int NWNX_ELC_VALIDATION_FAILURE_TYPE_CHARACTER = 1; +const int NWNX_ELC_VALIDATION_FAILURE_TYPE_ITEM = 2; +const int NWNX_ELC_VALIDATION_FAILURE_TYPE_SKILL = 3; +const int NWNX_ELC_VALIDATION_FAILURE_TYPE_FEAT = 4; +const int NWNX_ELC_VALIDATION_FAILURE_TYPE_SPELL = 5; +const int NWNX_ELC_VALIDATION_FAILURE_TYPE_CUSTOM = 6; +/// @} + +/// @anchor elc_fail_subtype +/// @name ELC Failure Subtypes +/// @note By default these constants are commented out to avoid a +/// limitation on constants. Uncomment them as needed. +/// @{ +const int NWNX_ELC_SUBTYPE_NONE = 0; +/* +const int NWNX_ELC_SUBTYPE_SERVER_LEVEL_RESTRICTION = 1; +const int NWNX_ELC_SUBTYPE_LEVEL_HACK = 2; +const int NWNX_ELC_SUBTYPE_COLORED_NAME = 3; +const int NWNX_ELC_SUBTYPE_UNIDENTIFIED_EQUIPPED_ITEM = 4; +const int NWNX_ELC_SUBTYPE_MIN_EQUIP_LEVEL = 5; +const int NWNX_ELC_SUBTYPE_NON_PC_CHARACTER = 6; +const int NWNX_ELC_SUBTYPE_DM_CHARACTER = 7; +const int NWNX_ELC_SUBTYPE_NON_PLAYER_RACE = 8; +const int NWNX_ELC_SUBTYPE_NON_PLAYER_CLASS = 9; +const int NWNX_ELC_SUBTYPE_CLASS_LEVEL_RESTRICTION = 10; +const int NWNX_ELC_SUBTYPE_PRESTIGE_CLASS_REQUIREMENTS = 11; +const int NWNX_ELC_SUBTYPE_CLASS_ALIGNMENT_RESTRICTION = 12; +const int NWNX_ELC_SUBTYPE_STARTING_ABILITY_VALUE_MAX = 13; +const int NWNX_ELC_SUBTYPE_ABILITY_POINT_BUY_SYSTEM_CALCULATION = 14; +const int NWNX_ELC_SUBTYPE_CLASS_SPELLCASTER_INVALID_PRIMARY_STAT = 15; +const int NWNX_ELC_SUBTYPE_EPIC_LEVEL_FLAG = 16; +const int NWNX_ELC_SUBTYPE_TOO_MANY_HITPOINTS = 17; +const int NWNX_ELC_SUBTYPE_UNUSABLE_SKILL = 18; +const int NWNX_ELC_SUBTYPE_NOT_ENOUGH_SKILLPOINTS = 19; +const int NWNX_ELC_SUBTYPE_INVALID_NUM_RANKS_IN_CLASS_SKILL = 20; +const int NWNX_ELC_SUBTYPE_INVALID_NUM_RANKS_IN_NON_CLASS_SKILL = 21; +const int NWNX_ELC_SUBTYPE_INVALID_NUM_REMAINING_SKILL_POINTS = 22; +const int NWNX_ELC_SUBTYPE_INVALID_FEAT = 23; +const int NWNX_ELC_SUBTYPE_FEAT_REQUIRED_SPELL_LEVEL_NOT_MET = 24; +const int NWNX_ELC_SUBTYPE_FEAT_REQUIRED_BASE_ATTACK_BONUS_NOT_MET = 25; +const int NWNX_ELC_SUBTYPE_FEAT_REQUIRED_ABILITY_VALUE_NOT_MET = 26; +const int NWNX_ELC_SUBTYPE_FEAT_REQUIRED_SKILL_NOT_MET = 27; +const int NWNX_ELC_SUBTYPE_FEAT_REQUIRED_FEAT_NOT_MET = 28; +const int NWNX_ELC_SUBTYPE_TOO_MANY_FEATS_THIS_LEVEL = 29; +const int NWNX_ELC_SUBTYPE_FEAT_NOT_AVAILABLE_TO_CLASS = 30; +const int NWNX_ELC_SUBTYPE_FEAT_IS_NORMAL_FEAT_ONLY = 31; +const int NWNX_ELC_SUBTYPE_FEAT_IS_BONUS_FEAT_ONLY = 32; +const int NWNX_ELC_SUBTYPE_SPELL_INVALID_SPELL_GAIN_WIZARD = 33; +const int NWNX_ELC_SUBTYPE_SPELL_INVALID_SPELL_GAIN_BARD_SORCERER = 34; +const int NWNX_ELC_SUBTYPE_SPELL_INVALID_SPELL_GAIN_OTHER_CLASSES = 35; +const int NWNX_ELC_SUBTYPE_INVALID_SPELL = 36; +const int NWNX_ELC_SUBTYPE_SPELL_INVALID_SPELL_LEVEL = 37; +const int NWNX_ELC_SUBTYPE_SPELL_MINIMUM_ABILITY = 40; +const int NWNX_ELC_SUBTYPE_SPELL_RESTRICTED_SPELL_SCHOOL = 41; +const int NWNX_ELC_SUBTYPE_SPELL_ALREADY_KNOWN = 42; +const int NWNX_ELC_SUBTYPE_SPELL_WIZARD_EXCEEDS_NUMSPELLS_TO_ADD = 43; +const int NWNX_ELC_SUBTYPE_ILLEGAL_REMOVED_SPELL = 44; +const int NWNX_ELC_SUBTYPE_REMOVED_NOT_KNOWN_SPELL = 45; +const int NWNX_ELC_SUBTYPE_INVALID_NUM_SPELLS = 46; +const int NWNX_ELC_SUBTYPE_SPELL_LIST_COMPARISON = 47; +const int NWNX_ELC_SUBTYPE_SKILL_LIST_COMPARISON = 48; +const int NWNX_ELC_SUBTYPE_FEAT_LIST_COMPARISON = 49; +const int NWNX_ELC_SUBTYPE_MISC_SAVING_THROW = 50; +const int NWNX_ELC_SUBTYPE_NUM_FEAT_COMPARISON = 51; + */ +/// @} + +/// @brief Sets the script that runs whenever an ELC validation failure happens +/// @param sScript The script name. +void NWNX_ELC_SetELCScript(string sScript); + +/// @brief Enables a custom ELC Check that will call the ELC Script with the +/// NWNX_ELC_VALIDATION_FAILURE_TYPE_CUSTOM type. +/// @param bEnabled TRUE to use this check. +/// @note Only runs if you have an ELC script set, be sure to skip this check +/// if a player doesn't fail your custom check otherwise they won't be able to log in +void NWNX_ELC_EnableCustomELCCheck(int bEnabled); + +/// @brief Skip an ELC Validation Failure Event +/// @note Only to be called in the ELC Script +void NWNX_ELC_SkipValidationFailure(); + +/// @brief Get the validation failure type +/// @return A @ref elc_fail_type "Validation Failure Type" +/// @note Only to be called in the ELC Script +int NWNX_ELC_GetValidationFailureType(); + +/// @brief Get the validation failure subtype +/// @return A @ref elc_fail_subtype "Validation Failure Subtype" +/// @note Only to be called in the ELC Script +int NWNX_ELC_GetValidationFailureSubType(); + +/// @brief Get the failure message +/// @return The talk table strref the player receives. +/// @note Only to be called in the ELC Script +int NWNX_ELC_GetValidationFailureMessageStrRef(); + +/// @brief Set the failure message +/// @param nStrRef The talk table strref the player receives, must be > 0. +/// @note Only to be called in the ELC Script +void NWNX_ELC_SetValidationFailureMessageStrRef(int nStrRef); + +/// @brief Get the item that failed ILR validation +/// @return The object that caused the ILR validation failure. Returns OBJECT_INVALID on error. +/// @note Only to be called in the ELC Script during a +/// NWNX_ELC_VALIDATION_FAILURE_TYPE_ITEM validation failure. +object NWNX_ELC_GetValidationFailureItem(); + +/// @brief Get the character level at which the validation failure occurred +/// @return The character level or -1 on error. +/// @remark May not always return a level, depending on where the failure occurred. +/// @note Only to be called in the ELC Script +int NWNX_ELC_GetValidationFailureLevel(); + +/// @brief Get the ID of the skill that failed ELC validation +/// @return The skill ID or -1 on error. +/// @remark May not always return a skill id, depending on the validation failure subtype. +/// @note Only to be called in the ELC Script during a +/// NWNX_ELC_VALIDATION_FAILURE_TYPE_SKILL validation failure. +int NWNX_ELC_GetValidationFailureSkillID(); + +/// @brief Get the ID of the feat that failed ELC validation +/// @return The feat ID or -1 on error +/// @remark May not always return a feat id, depending on the validation failure subtype. +/// @note Only to be called in the ELC Script during a +/// NWNX_ELC_VALIDATION_FAILURE_TYPE_FEAT validation failure. +int NWNX_ELC_GetValidationFailureFeatID(); + +/// @brief Get the ID of the spell that failed ELC validation +/// @return The spell ID or -1 on error +/// @remark May not always return a spell id, depending on the validation failure subtype. +/// @note Only to be called in the ELC Script during a +/// NWNX_ELC_VALIDATION_FAILURE_TYPE_SPELL validation failure. +int NWNX_ELC_GetValidationFailureSpellID(); + +/// @} + +void NWNX_ELC_SetELCScript(string sScript) +{ + string sFunc = "SetELCScript"; + + NWNX_PushArgumentString(NWNX_ELC, sFunc, sScript); + NWNX_CallFunction(NWNX_ELC, sFunc); +} + +void NWNX_ELC_EnableCustomELCCheck(int bEnabled) +{ + string sFunc = "EnableCustomELCCheck"; + + NWNX_PushArgumentInt(NWNX_ELC, sFunc, bEnabled); + NWNX_CallFunction(NWNX_ELC, sFunc); +} + +void NWNX_ELC_SkipValidationFailure() +{ + string sFunc = "SkipValidationFailure"; + + NWNX_CallFunction(NWNX_ELC, sFunc); +} + +int NWNX_ELC_GetValidationFailureType() +{ + string sFunc = "GetValidationFailureType"; + + NWNX_CallFunction(NWNX_ELC, sFunc); + return NWNX_GetReturnValueInt(NWNX_ELC, sFunc); +} + +int NWNX_ELC_GetValidationFailureSubType() +{ + string sFunc = "GetValidationFailureSubType"; + + NWNX_CallFunction(NWNX_ELC, sFunc); + return NWNX_GetReturnValueInt(NWNX_ELC, sFunc); +} + +int NWNX_ELC_GetValidationFailureMessageStrRef() +{ + string sFunc = "GetValidationFailureMessageStrRef"; + + NWNX_CallFunction(NWNX_ELC, sFunc); + return NWNX_GetReturnValueInt(NWNX_ELC, sFunc); +} + +void NWNX_ELC_SetValidationFailureMessageStrRef(int nStrRef) +{ + string sFunc = "SetValidationFailureMessageStrRef"; + + NWNX_PushArgumentInt(NWNX_ELC, sFunc, nStrRef); + NWNX_CallFunction(NWNX_ELC, sFunc); +} + +object NWNX_ELC_GetValidationFailureItem() +{ + string sFunc = "GetValidationFailureItem"; + + NWNX_CallFunction(NWNX_ELC, sFunc); + return NWNX_GetReturnValueObject(NWNX_ELC, sFunc); +} + +int NWNX_ELC_GetValidationFailureLevel() +{ + string sFunc = "GetValidationFailureLevel"; + + NWNX_CallFunction(NWNX_ELC, sFunc); + return NWNX_GetReturnValueInt(NWNX_ELC, sFunc); +} + +int NWNX_ELC_GetValidationFailureSkillID() +{ + string sFunc = "GetValidationFailureSkillID"; + + NWNX_CallFunction(NWNX_ELC, sFunc); + return NWNX_GetReturnValueInt(NWNX_ELC, sFunc); +} + +int NWNX_ELC_GetValidationFailureFeatID() +{ + string sFunc = "GetValidationFailureFeatID"; + + NWNX_CallFunction(NWNX_ELC, sFunc); + return NWNX_GetReturnValueInt(NWNX_ELC, sFunc); +} + +int NWNX_ELC_GetValidationFailureSpellID() +{ + string sFunc = "GetValidationFailureSpellID"; + + NWNX_CallFunction(NWNX_ELC, sFunc); + return NWNX_GetReturnValueInt(NWNX_ELC, sFunc); +} diff --git a/gamma_age_v2/nwnx_encounter.nss b/gamma_age_v2/nwnx_encounter.nss new file mode 100644 index 00000000..8857184f --- /dev/null +++ b/gamma_age_v2/nwnx_encounter.nss @@ -0,0 +1,285 @@ +/// @addtogroup encounter Encounter +/// @brief Functions exposing additional encounter properties. +/// @{ +/// @file nwnx_encounter.nss +#include "nwnx" + +const string NWNX_Encounter = "NWNX_Encounter"; ///< @private + +/// @brief A creature list entry for an encounter. +struct NWNX_Encounter_CreatureListEntry +{ + string resref; ///< The resref. + float challengeRating; ///< The challenge rating. + int unique; ///< Creature will be unique to the encounter. + int alreadyUsed; //< Creature has already been used. +}; + + +/// @brief Get the number of creatures in the encounter list +/// @param encounter The encounter object. +/// @return The number of creatures in the encounter list. +int NWNX_Encounter_GetNumberOfCreaturesInEncounterList(object encounter); + +/// @brief Gets the encounter creature list entry at the specified index +/// @param encounter The encounter object. +/// @param index The index of the creature in the encounter list. +/// @return An NWNX_Encounter_CreatureListEntry. +struct NWNX_Encounter_CreatureListEntry NWNX_Encounter_GetEncounterCreatureByIndex(object encounter, int index); + +/// @brief Set the encounter creature list entry at the specified index +/// @param encounter The encounter object. +/// @param index The index of the creature in the encounter list. +/// @param creatureEntry The NWNX_Encounter_CreatureListEntry. +void NWNX_Encounter_SetEncounterCreatureByIndex(object encounter, int index, struct NWNX_Encounter_CreatureListEntry creatureEntry); + +/// @brief Get the faction id of encounter +/// @param encounter The encounter object. +/// @return The faction id. +int NWNX_Encounter_GetFactionId(object encounter); + +/// @brief Set the faction id of encounter. +/// @param encounter The encounter object. +/// @param factionId The faction id. +void NWNX_Encounter_SetFactionId(object encounter, int factionId); + +/// @brief Get if encounter is player triggered only. +/// @param encounter The encounter object. +/// @return TRUE if encounter is player triggered only. +int NWNX_Encounter_GetPlayerTriggeredOnly(object encounter); + +/// @brief Set if encounter is player triggered only. +/// @param encounter The encounter object. +/// @param playerTriggeredOnly TRUE/FALSE +void NWNX_Encounter_SetPlayerTriggeredOnly(object encounter, int playerTriggeredOnly); + +/// @brief Get the reset time of encounter. +/// @param encounter The encounter object. +/// @return The seconds the encounter is defined to reset. +int NWNX_Encounter_GetResetTime(object encounter); + +/// @brief Set the reset time of encounter. +/// @param encounter The encounter object. +/// @param resetTime The seconds the encounter will reset. +void NWNX_Encounter_SetResetTime(object encounter, int resetTime); + +/// @brief Get the number of spawn points of encounter. +/// @param encounter The encounter object. +/// @return The count of the spawn points for the encounter. +int NWNX_Encounter_GetNumberOfSpawnPoints(object encounter); + +/// @brief Gets the spawn point list entry at the specified index +/// @param encounter The encounter object. +/// @param index The index of the spawn point in the encounter list. +/// @return Location of spawn point. +location NWNX_Encounter_GetSpawnPointByIndex(object encounter, int index); + +/// @brief Get the minimum amount of creatures that encounter will spawn. +/// @param encounter The encounter object. +/// @return the minimal amount. +int NWNX_Encounter_GetMinNumSpawned(object encounter); + +/// @brief Get the maximum amount of creatures that encounter will spawn. +/// @param encounter The encounter object. +/// @return the maximal amount. +int NWNX_Encounter_GetMaxNumSpawned(object encounter); + +/// @brief Get the current number of creatures that are spawned and alive +/// @param encounter The encounter object. +/// @return amount of creatures +int NWNX_Encounter_GetCurrentNumSpawned(object encounter); + +/// @brief Get the geometry of an encounter +/// @param oEncounter: The encounter object. +/// @return A string of vertex positions. +string NWNX_Encounter_GetGeometry(object oEncounter); + +/// @brief Set the geometry of an encounter with a list of vertex positions +/// @param oTrigger The encounter object. +/// @param sGeometry Needs to be in the following format -> {x.x, y.y, z.z} or {x.x, y.y} +/// Example Geometry: "{1.0, 1.0, 0.0}{4.0, 1.0, 0.0}{4.0, 4.0, 0.0}{1.0, 4.0, 0.0}" +/// +/// @remark The Z position is optional and will be calculated dynamically based +/// on terrain height if it's not provided. +/// +/// @remark The minimum number of vertices is 3. +void NWNX_Encounter_SetGeometry(object oTrigger, string sGeometry); + +/// @} + +int NWNX_Encounter_GetNumberOfCreaturesInEncounterList(object encounter) +{ + string sFunc = "GetNumberOfCreaturesInEncounterList"; + + NWNX_PushArgumentObject(NWNX_Encounter, sFunc, encounter); + NWNX_CallFunction(NWNX_Encounter, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Encounter, sFunc); +} + +struct NWNX_Encounter_CreatureListEntry NWNX_Encounter_GetEncounterCreatureByIndex(object encounter, int index) +{ + string sFunc = "GetEncounterCreatureByIndex"; + struct NWNX_Encounter_CreatureListEntry creatureEntry; + + NWNX_PushArgumentInt(NWNX_Encounter, sFunc, index); + NWNX_PushArgumentObject(NWNX_Encounter, sFunc, encounter); + + NWNX_CallFunction(NWNX_Encounter, sFunc); + + creatureEntry.alreadyUsed = NWNX_GetReturnValueInt(NWNX_Encounter, sFunc); + creatureEntry.unique = NWNX_GetReturnValueInt(NWNX_Encounter, sFunc); + creatureEntry.challengeRating = NWNX_GetReturnValueFloat(NWNX_Encounter, sFunc); + creatureEntry.resref = NWNX_GetReturnValueString(NWNX_Encounter, sFunc); + + return creatureEntry; +} + +void NWNX_Encounter_SetEncounterCreatureByIndex(object encounter, int index, struct NWNX_Encounter_CreatureListEntry creatureEntry) +{ + string sFunc = "SetEncounterCreatureByIndex"; + + NWNX_PushArgumentInt(NWNX_Encounter, sFunc, creatureEntry.alreadyUsed); + NWNX_PushArgumentInt(NWNX_Encounter, sFunc, creatureEntry.unique); + NWNX_PushArgumentFloat(NWNX_Encounter, sFunc, creatureEntry.challengeRating); + NWNX_PushArgumentString(NWNX_Encounter, sFunc, creatureEntry.resref); + NWNX_PushArgumentInt(NWNX_Encounter, sFunc, index); + NWNX_PushArgumentObject(NWNX_Encounter, sFunc, encounter); + + NWNX_CallFunction(NWNX_Encounter, sFunc); +} + +int NWNX_Encounter_GetFactionId(object encounter) +{ + string sFunc = "GetFactionId"; + + NWNX_PushArgumentObject(NWNX_Encounter, sFunc, encounter); + NWNX_CallFunction(NWNX_Encounter, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Encounter, sFunc); +} + +void NWNX_Encounter_SetFactionId(object encounter, int factionId) +{ + string sFunc = "SetFactionId"; + + NWNX_PushArgumentInt(NWNX_Encounter, sFunc, factionId); + NWNX_PushArgumentObject(NWNX_Encounter, sFunc, encounter); + + NWNX_CallFunction(NWNX_Encounter, sFunc); +} + +int NWNX_Encounter_GetPlayerTriggeredOnly(object encounter) +{ + string sFunc = "GetPlayerTriggeredOnly"; + + NWNX_PushArgumentObject(NWNX_Encounter, sFunc, encounter); + NWNX_CallFunction(NWNX_Encounter, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Encounter, sFunc); +} + +void NWNX_Encounter_SetPlayerTriggeredOnly(object encounter, int playerTriggeredOnly) +{ + string sFunc = "SetPlayerTriggeredOnly"; + + NWNX_PushArgumentInt(NWNX_Encounter, sFunc, playerTriggeredOnly); + NWNX_PushArgumentObject(NWNX_Encounter, sFunc, encounter); + + NWNX_CallFunction(NWNX_Encounter, sFunc); +} + +int NWNX_Encounter_GetResetTime(object encounter) +{ + string sFunc = "GetResetTime"; + + NWNX_PushArgumentObject(NWNX_Encounter, sFunc, encounter); + NWNX_CallFunction(NWNX_Encounter, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Encounter, sFunc); +} + +void NWNX_Encounter_SetResetTime(object encounter, int resetTime) +{ + string sFunc = "SetResetTime"; + + NWNX_PushArgumentInt(NWNX_Encounter, sFunc, resetTime); + NWNX_PushArgumentObject(NWNX_Encounter, sFunc, encounter); + + NWNX_CallFunction(NWNX_Encounter, sFunc); +} + +int NWNX_Encounter_GetNumberOfSpawnPoints(object encounter) +{ + string sFunc = "GetNumberOfSpawnPoints"; + + NWNX_PushArgumentObject(NWNX_Encounter, sFunc, encounter); + NWNX_CallFunction(NWNX_Encounter, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Encounter, sFunc); +} + +location NWNX_Encounter_GetSpawnPointByIndex(object encounter, int index) +{ + string sFunc = "GetSpawnPointByIndex"; + + NWNX_PushArgumentInt(NWNX_Encounter, sFunc, index); + NWNX_PushArgumentObject(NWNX_Encounter, sFunc, encounter); + NWNX_CallFunction(NWNX_Encounter, sFunc); + + float o = NWNX_GetReturnValueFloat(NWNX_Encounter, sFunc); + float z = NWNX_GetReturnValueFloat(NWNX_Encounter, sFunc); + float y = NWNX_GetReturnValueFloat(NWNX_Encounter, sFunc); + float x = NWNX_GetReturnValueFloat(NWNX_Encounter, sFunc); + + return Location(GetArea(encounter), Vector(x, y, z), o); +} + +int NWNX_Encounter_GetMinNumSpawned(object encounter) +{ + string sFunc = "GetMinNumSpawned"; + + NWNX_PushArgumentObject(NWNX_Encounter, sFunc, encounter); + NWNX_CallFunction(NWNX_Encounter, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Encounter, sFunc); +} + +int NWNX_Encounter_GetMaxNumSpawned(object encounter) +{ + string sFunc = "GetMaxNumSpawned"; + + NWNX_PushArgumentObject(NWNX_Encounter, sFunc, encounter); + NWNX_CallFunction(NWNX_Encounter, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Encounter, sFunc); +} + +int NWNX_Encounter_GetCurrentNumSpawned(object encounter) +{ + string sFunc = "GetCurrentNumSpawned"; + + NWNX_PushArgumentObject(NWNX_Encounter, sFunc, encounter); + NWNX_CallFunction(NWNX_Encounter, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Encounter, sFunc); +} + +string NWNX_Encounter_GetGeometry(object oEncounter) +{ + string sFunc = "GetGeometry"; + + NWNX_PushArgumentObject(NWNX_Encounter, sFunc, oEncounter); + NWNX_CallFunction(NWNX_Encounter, sFunc); + + return NWNX_GetReturnValueString(NWNX_Encounter, sFunc); +} + +void NWNX_Encounter_SetGeometry(object oEncounter, string sGeometry) +{ + string sFunc = "SetGeometry"; + + NWNX_PushArgumentString(NWNX_Encounter, sFunc, sGeometry); + NWNX_PushArgumentObject(NWNX_Encounter, sFunc, oEncounter); + NWNX_CallFunction(NWNX_Encounter, sFunc); +} diff --git a/gamma_age_v2/nwnx_events.nss b/gamma_age_v2/nwnx_events.nss new file mode 100644 index 00000000..cd22c034 --- /dev/null +++ b/gamma_age_v2/nwnx_events.nss @@ -0,0 +1,1590 @@ +/// @addtogroup events Events +/// @brief Provides an interface for plugins to create event-based systems, and exposes some events through that interface. +/// @{ +/// @file nwnx_events.nss +#include "nwnx" + +const string NWNX_Events = "NWNX_Events"; ///< @private + +/** + # Events +__________________________________________ + ## Associate Events + - NWNX_ON_ADD_ASSOCIATE_BEFORE + - NWNX_ON_ADD_ASSOCIATE_AFTER + - NWNX_ON_REMOVE_ASSOCIATE_BEFORE + - NWNX_ON_REMOVE_ASSOCIATE_AFTER + + `OBJECT_SELF` = The owner of the associate. + + Event Data Tag | Type | Notes + ----------------------|--------|------- + ASSOCIATE_OBJECT_ID | object | Convert to object with StringToObject() + +_______________________________________ + ## Stealth Events + - NWNX_ON_STEALTH_ENTER_BEFORE + - NWNX_ON_STEALTH_ENTER_AFTER + - NWNX_ON_STEALTH_EXIT_BEFORE + - NWNX_ON_STEALTH_EXIT_AFTER + + `OBJECT_SELF` = The creature entering or exiting stealth. + + @note NWNX_ON_{ENTER|EXIT}_STEALTH_{BEFORE|AFTER} has been deprecated. Please use these new event names. +_______________________________________ + ## Detect Events + - NWNX_ON_DETECT_ENTER_BEFORE + - NWNX_ON_DETECT_ENTER_AFTER + - NWNX_ON_DETECT_EXIT_BEFORE + - NWNX_ON_DETECT_EXIT_AFTER + + `OBJECT_SELF` = The creature entering or exiting detect mode. + +_______________________________________ + ## Examine Events + - NWNX_ON_EXAMINE_OBJECT_BEFORE + - NWNX_ON_EXAMINE_OBJECT_AFTER + + `OBJECT_SELF` = The player examining the object + + Event Data Tag | Type | Notes + ----------------------|--------|------- + EXAMINEE_OBJECT_ID | object | Convert to object with StringToObject() + TRAP_EXAMINE_SUCCESS | int | For trap examine only, whether the examine succeeded + +_______________________________________ + ## Faction Events + - NWNX_ON_SET_NPC_FACTION_REPUTATION_BEFORE + - NWNX_ON_SET_NPC_FACTION_REPUTATION_AFTER + + `OBJECT_SELF` = The module + + Event Data Tag | Type | Notes + ----------------------|--------|------- + FACTION_ID | int | Not the STANDARD_FACTION_* constants. See nwnx_creature->GetFaction(). + SUBJECT_FACTION_ID | int | Not the STANDARD_FACTION_* constants. See nwnx_creature->GetFaction(). + PREVIOUS_REPUTATION | int | + NEW_REPUTATION | int | Not yet clamped between 0-100. In the AFTER event, this will equal the EventResult set in the BEFORE event. + +_______________________________________ + ## Validate Use Item Events + - NWNX_ON_VALIDATE_USE_ITEM_BEFORE + - NWNX_ON_VALIDATE_USE_ITEM_AFTER + + `OBJECT_SELF` = The creature using the item + + Event Data Tag | Type | Notes | + ------------------------|--------|-------| + ITEM_OBJECT_ID | object | Convert to object with StringToObject()| + BEFORE_RESULT | int | TRUE/FALSE, only in _AFTER events| + + @note The event result should be one of: + "0" - Equip denied + "1" - Equip okay + "2" - Swap currently equipped item + "3" - Unequip items in both hands before equipping + @note Setting the result of this event will NOT prevent the item from being equipped, only used (e.g. scrolls/wands). See the "NWNX_ON_VALIDATE_ITEM_EQUIP_*" events to control equip behaviour. + @note If the BEFORE event is not skipped, BEFORE_RESULT is the value of running the function normally. Otherwise, this is the set result value. + +_______________________________________ + ## Use Item Events + - NWNX_ON_USE_ITEM_BEFORE + - NWNX_ON_USE_ITEM_AFTER + + `OBJECT_SELF` = The creature using the item + + Event Data Tag | Type | Notes | + ------------------------|--------|-------| + ITEM_OBJECT_ID | object | Convert to object with StringToObject()| + TARGET_OBJECT_ID | object | Convert to object with StringToObject()| + ITEM_PROPERTY_INDEX | int | | + ITEM_SUB_PROPERTY_INDEX | int | | + TARGET_POSITION_X | float | | + TARGET_POSITION_Y | float | | + TARGET_POSITION_Z | float | | + USE_CHARGES | int | | + + @note You can set the event result to "0" (send feedback to the client that the item cannot be used, default) + or "1" to suppress that feedback. + +_______________________________________ + ## Item Container Events + - NWNX_ON_ITEM_INVENTORY_OPEN_BEFORE + - NWNX_ON_ITEM_INVENTORY_OPEN_AFTER + - NWNX_ON_ITEM_INVENTORY_CLOSE_BEFORE + - NWNX_ON_ITEM_INVENTORY_CLOSE_AFTER + + `OBJECT_SELF` = The container + + Event Data Tag | Type | Notes + ----------------------|--------|------- + OWNER | object |Convert to object with StringToObject() + +_______________________________________ + ## Ammunition Reload Events + - NWNX_ON_ITEM_AMMO_RELOAD_BEFORE + - NWNX_ON_ITEM_AMMO_RELOAD_AFTER + + `OBJECT_SELF` = The creature whose inventory we're searching for the item type + + Event Data Tag | Type | Notes + ----------------------|------|------- + BASE_ITEM_ID | int | The base item type being sought (arrow, bolt, bullet) + BASE_ITEM_NTH | int | Find the Nth instance of this item + ACTION_RESULT | int | The object that was determined in BEFORE (only in after) + +_______________________________________ + ## Scroll Learn Events + - NWNX_ON_ITEM_SCROLL_LEARN_BEFORE + - NWNX_ON_ITEM_SCROLL_LEARN_AFTER + + `OBJECT_SELF` = The creature learning the scroll + + Event Data Tag | Type | Notes + ----------------------|--------|------- + SCROLL | object | Convert to object with StringToObject() + RESULT | int | Returns TRUE in the _AFTER if the learning was successful, FALSE otherwise + +_______________________________________ + ## Validate Item Equip Events + - NWNX_ON_VALIDATE_ITEM_EQUIP_BEFORE + - NWNX_ON_VALIDATE_ITEM_EQUIP_AFTER + + `OBJECT_SELF` = The creature trying to equip the item + + Event Data Tag | Type | Notes | + ----------------------|--------|-------| + ITEM_OBJECT_ID | object | Convert to object with StringToObject()| + SLOT | int | INVENTORY_SLOT_* Constant| + BEFORE_RESULT | int | TRUE/FALSE, only in _AFTER events| + + @note Manually setting the result of this event will skip all game checks for item slot validity. The client will block incompatible types (weapons into armor slots) in the GUI, but this will work using ActionEquipItem(). + @note To show this item as unusable to the PC (red in the inventory), use in combination with the "NWNX_ON_VALIDATE_USE_ITEM_*" events. + @note If the BEFORE event is not skipped, BEFORE_RESULT is the value of running the function normally. Otherwise, this is the set result value. + +_______________________________________ + ## Item Equip Events + - NWNX_ON_ITEM_EQUIP_BEFORE + - NWNX_ON_ITEM_EQUIP_AFTER + + `OBJECT_SELF` = The creature equipping the item + + Event Data Tag | Type | Notes | + ----------------------|--------|-------| + ITEM | object | Convert to object with StringToObject()| + SLOT | int | | + +_______________________________________ + ## Item Unequip Events + - NWNX_ON_ITEM_UNEQUIP_BEFORE + - NWNX_ON_ITEM_UNEQUIP_AFTER + + `OBJECT_SELF` = The creature unequipping the item + + Event Data Tag | Type | Notes + ----------------------|--------|------- + ITEM | object | Convert to object with StringToObject() + + @note These events do not trigger when equipment is replaced by equipping another item. +_______________________________________ + ## Item Destroy Events + - NWNX_ON_ITEM_DESTROY_OBJECT_BEFORE + - NWNX_ON_ITEM_DESTROY_OBJECT_AFTER + - NWNX_ON_ITEM_DECREMENT_STACKSIZE_BEFORE + - NWNX_ON_ITEM_DECREMENT_STACKSIZE_AFTER + + `OBJECT_SELF` = The item triggering the event + + @note Use of `NWNX_ON_ITEM_(DESTROY_OBJECT|DECREMENT_STACKSIZE)_*` conflicts with object event handler profiling + +_______________________________________ + ## Item Use Lore To Identify Events + - NWNX_ON_ITEM_USE_LORE_BEFORE + - NWNX_ON_ITEM_USE_LORE_AFTER + + `OBJECT_SELF` = The player attempting to identify an item with their lore skill + + Event Data Tag | Type | Notes + ----------------------|--------|------- + ITEM | object |Convert to object with StringToObject() + +_______________________________________ + ## Item Pay To Identify Events + - NWNX_ON_ITEM_PAY_TO_IDENTIFY_BEFORE + - NWNX_ON_ITEM_PAY_TO_IDENTIFY_AFTER + + `OBJECT_SELF` = The player attempting to pay to identify an item + + Event Data Tag | Type | Notes + ----------------------|--------|------- + ITEM | object | Convert to object with StringToObject() + STORE | object | Convert to object with StringToObject() + +_______________________________________ + ## Item Split Events + - NWNX_ON_ITEM_SPLIT_BEFORE + - NWNX_ON_ITEM_SPLIT_AFTER + + `OBJECT_SELF` = The player attempting to split an item + + Event Data Tag | Type | Notes| + ----------------------|--------|-------| + ITEM | object | Convert to object with StringToObject()| + NUMBER_SPLIT_OFF | int | | + +_______________________________________ + ## Acquire Item Events + - NWNX_ON_ITEM_ACQUIRE_BEFORE + - NWNX_ON_ITEM_ACQUIRE_AFTER + + `OBJECT_SELF` = The creature trying to acquire the item + + Event Data Tag | Type | Notes | + ----------------------|--------|-------| + ITEM | object | Convert to object with StringToObject() (May be OBJECT_INVALID in the AFTER event) | + GIVER | object | Convert to object with StringToObject() (will be INVALID if picked up from ground)| + RESULT | int | Returns TRUE in the _AFTER if the acquisition was successful, FALSE otherwise + + @note This event currently only works with creatures + +_______________________________________ + ## Feat Use Events + - NWNX_ON_USE_FEAT_BEFORE + - NWNX_ON_USE_FEAT_AFTER + + `OBJECT_SELF` = The object using the feat + + Event Data Tag | Type | Notes | + ----------------------|--------|-------| + FEAT_ID | int | | + SUBFEAT_ID | int | | + TARGET_OBJECT_ID | object | Convert to object with StringToObject() | + AREA_OBJECT_ID | object | Convert to object with StringToObject() | + TARGET_POSITION_X | float | | + TARGET_POSITION_Y | float | | + TARGET_POSITION_Z | float | | + ACTION_RESULT | int | TRUE/FALSE, only in _AFTER events + +_______________________________________ + ## Has Feat Events + - NWNX_ON_HASFEAT_BEFORE + - NWNX_ON_HAS_FEAT_AFTER + + `OBJECT_SELF` = The player being checked for the feat + + Event Data Tag | Type | Notes | + ----------------------|--------|-------| + FEAT_ID | int | | + HAS_FEAT | int | Whether they truly have the feat or not | + + @note This event should definitely be used with the Event ID Whitelist, which is turned on by default + for this event. Until you add your Feat ID to the whitelist on module load this event will not function. + For example if you wish an event to fire when nwn is checking if the creature has Epic Dodge you would perform + the following functions on_module_load. + ```c + NWNX_Events_SubscribeEvent("NWNX_ON_HAS_FEAT_BEFORE", "event_has_feat"); + NWNX_Events_AddIDToWhitelist("NWNX_ON_HAS_FEAT", FEAT_EPIC_DODGE); + ``` + @warning Toggling the Whitelist to be off for this event will degrade performance. +_______________________________________ + ## DM Give Events + - NWNX_ON_DM_GIVE_GOLD_BEFORE + - NWNX_ON_DM_GIVE_GOLD_AFTER + - NWNX_ON_DM_GIVE_XP_BEFORE + - NWNX_ON_DM_GIVE_XP_AFTER + - NWNX_ON_DM_GIVE_LEVEL_BEFORE + - NWNX_ON_DM_GIVE_LEVEL_AFTER + - NWNX_ON_DM_GIVE_ALIGNMENT_BEFORE + - NWNX_ON_DM_GIVE_ALIGNMENT_AFTER + + `OBJECT_SELF` = The DM + + Event Data Tag | Type | Notes | + ----------------------|--------|-------| + AMOUNT | int | | + OBJECT | object | Convert to object with StringToObject() | + ALIGNMENT_TYPE | int | Only valid for `NWNX_ON_DM_GIVE_ALIGNMENT_*` | + +_______________________________________ + ## DM Spawn Object Events + - NWNX_ON_DM_SPAWN_OBJECT_BEFORE + - NWNX_ON_DM_SPAWN_OBJECT_AFTER + + `OBJECT_SELF` = The DM + + Event Data Tag | Type | Notes | + ----------------------|--------|-------| + AREA | object | Convert to object with StringToObject() | + OBJECT | object | Only returns a valid object in *_AFTER | + OBJECT_TYPE | int | Returns `NWNX_EVENTS_OBJECT_TYPE_*` | + POS_X | float | | + POS_Y | float | | + POS_Z | float | | + RESREF | string | The resref of the object that's being spawned. | + + @note When spawning a standard trap, the resref will be an index into traps.2da. + +_______________________________________ + ## DM Give Item Events + - NWNX_ON_DM_GIVE_ITEM_BEFORE + - NWNX_ON_DM_GIVE_ITEM_AFTER + + `OBJECT_SELF` = The DM + + Event Data Tag | Type | Notes + ----------------------|--------|------- + TARGET | object | Convert to object with StringToObject() + ITEM | object | Only returns a valid object in *_AFTER + +_______________________________________ + ## DM Multiple Object Action Events + - NWNX_ON_DM_HEAL_BEFORE + - NWNX_ON_DM_HEAL_AFTER + - NWNX_ON_DM_KILL_BEFORE + - NWNX_ON_DM_KILL_AFTER + - NWNX_ON_DM_TOGGLE_INVULNERABLE_BEFORE + - NWNX_ON_DM_TOGGLE_INVULNERABLE_AFTER + - NWNX_ON_DM_FORCE_REST_BEFORE + - NWNX_ON_DM_FORCE_REST_AFTER + - NWNX_ON_DM_LIMBO_BEFORE + - NWNX_ON_DM_LIMBO_AFTER + - NWNX_ON_DM_TOGGLE_AI_BEFORE + - NWNX_ON_DM_TOGGLE_AI_AFTER + - NWNX_ON_DM_TOGGLE_IMMORTAL_BEFORE + - NWNX_ON_DM_TOGGLE_IMMORTAL_AFTER + + `OBJECT_SELF` = The DM + + Event Data Tag | Type | Notes + ----------------------|--------|------- + NUM_TARGETS | int | The number of targets affected + TARGET_* | object | * = 1 <= NUM_TARGETS + +_______________________________________ + ## DM Single Object Action Events + - NWNX_ON_DM_GOTO_BEFORE + - NWNX_ON_DM_GOTO_AFTER + - NWNX_ON_DM_POSSESS_BEFORE + - NWNX_ON_DM_POSSESS_AFTER + - NWNX_ON_DM_POSSESS_FULL_POWER_BEFORE + - NWNX_ON_DM_POSSESS_FULL_POWER_AFTER + - NWNX_ON_DM_TOGGLE_LOCK_BEFORE + - NWNX_ON_DM_TOGGLE_LOCK_AFTER + - NWNX_ON_DM_DISABLE_TRAP_BEFORE + - NWNX_ON_DM_DISABLE_TRAP_AFTER + + `OBJECT_SELF` = The DM + + Event Data Tag | Type | Notes + ----------------------|--------|------- + TARGET | object | Convert to object with StringToObject() + + @note If `TARGET` is `OBJECT_INVALID` for `NWNX_ON_DM_POSSESS_*`, the DM is unpossessing. + +_______________________________________ + ## DM Jump Events + - NWNX_ON_DM_JUMP_TO_POINT_BEFORE + - NWNX_ON_DM_JUMP_TO_POINT_AFTER + - NWNX_ON_DM_JUMP_TARGET_TO_POINT_BEFORE + - NWNX_ON_DM_JUMP_TARGET_TO_POINT_AFTER + - NWNX_ON_DM_JUMP_ALL_PLAYERS_TO_POINT_BEFORE + - NWNX_ON_DM_JUMP_ALL_PLAYERS_TO_POINT_AFTER + + `OBJECT_SELF` = The DM + + Event Data Tag | Type | Notes | + ----------------------|--------|-------| + TARGET_AREA | object | Convert to object with StringToObject() | + POS_X | float | | + POS_Y | float | | + POS_Z | float | | + NUM_TARGETS | int | Only valid for NWNX_ON_DM_JUMP_TARGET_TO_POINT_* | + TARGET_* | object | * = 1 <= NUM_TARGETS, Only valid for NWNX_ON_DM_JUMP_TARGET_TO_POINT_* | + +_______________________________________ + ## DM Change Difficulty Events + - NWNX_ON_DM_CHANGE_DIFFICULTY_BEFORE + - NWNX_ON_DM_CHANGE_DIFFICULTY_AFTER + + `OBJECT_SELF` = The DM + + Event Data Tag | Type | Notes | + ----------------------|--------|-------| + DIFFICULTY_SETTING | int | | + +_______________________________________ + ## DM View Inventory Events + - NWNX_ON_DM_VIEW_INVENTORY_BEFORE + - NWNX_ON_DM_VIEW_INVENTORY_AFTER + + `OBJECT_SELF` = The DM + + Event Data Tag | Type | Notes + ----------------------|--------|------- + OPEN_INVENTORY | int | TRUE if opening an inventory, FALSE if closing + TARGET | object | Convert to object with StringToObject() + +_______________________________________ + ## DM Spawn Trap Events + - NWNX_ON_DM_SPAWN_TRAP_ON_OBJECT_BEFORE + - NWNX_ON_DM_SPAWN_TRAP_ON_OBJECT_AFTER + + `OBJECT_SELF` = The DM + + Event Data Tag | Type | Notes + ----------------------|--------|------- + AREA | object | Convert to object with StringToObject() + TARGET | object | Convert to object with StringToObject() + +_______________________________________ + ## DM Dump Locals Events + - NWNX_ON_DM_DUMP_LOCALS_BEFORE + - NWNX_ON_DM_DUMP_LOCALS_AFTER + + `OBJECT_SELF` = The DM + + Event Data Tag | Type | Notes + ----------------------|--------|------- + TYPE | int | 0 = dm_dumplocals, 1 = dm_dumparealocals, 3 = dm_dumpmodulelocals + TARGET | object | Convert to object with StringToObject() + + Note: For TYPE 1/2, use GetArea(TARGET) or GetModule() + +_______________________________________ + ## DM PlayerDM Login/Logout Events + - NWNX_ON_DM_PLAYERDM_LOGIN_BEFORE + - NWNX_ON_DM_PLAYERDM_LOGIN_AFTER + - NWNX_ON_DM_PLAYERDM_LOGOUT_BEFORE + - NWNX_ON_DM_PLAYERDM_LOGOUT_AFTER + + `OBJECT_SELF` = The DM + + Event Data Tag | Type | Notes + ----------------------|--------|------- + PASSWORD | string | The password the DM provided, only valid for NWNX_ON_DM_PLAYERDM_LOGIN_* + +_______________________________________ + ## DM Other Events + - NWNX_ON_DM_APPEAR_BEFORE + - NWNX_ON_DM_APPEAR_AFTER + - NWNX_ON_DM_DISAPPEAR_BEFORE + - NWNX_ON_DM_DISAPPEAR_AFTER + - NWNX_ON_DM_SET_FACTION_BEFORE + - NWNX_ON_DM_SET_FACTION_AFTER + - NWNX_ON_DM_TAKE_ITEM_BEFORE + - NWNX_ON_DM_TAKE_ITEM_AFTER + - NWNX_ON_DM_SET_STAT_BEFORE + - NWNX_ON_DM_SET_STAT_AFTER + - NWNX_ON_DM_GET_VARIABLE_BEFORE + - NWNX_ON_DM_GET_VARIABLE_AFTER + - NWNX_ON_DM_SET_VARIABLE_BEFORE + - NWNX_ON_DM_SET_VARIABLE_AFTER + - NWNX_ON_DM_SET_TIME_BEFORE + - NWNX_ON_DM_SET_TIME_AFTER + - NWNX_ON_DM_SET_DATE_BEFORE + - NWNX_ON_DM_SET_DATE_AFTER + - NWNX_ON_DM_SET_FACTION_REPUTATION_BEFORE + - NWNX_ON_DM_SET_FACTION_REPUTATION_AFTER + - NWNX_ON_DM_GET_FACTION_REPUTATION_BEFORE + - NWNX_ON_DM_GET_FACTION_REPUTATION_AFTER + + `OBJECT_SELF` = The DM + +_______________________________________ + ## Client Disconnect Events + - NWNX_ON_CLIENT_DISCONNECT_BEFORE + - NWNX_ON_CLIENT_DISCONNECT_AFTER + + `OBJECT_SELF` = The player disconnecting from the server + + @note This event also runs when a player connects to the server but cancels out of character select. + OBJECT_SELF will be OBJECT_INVALID in this case. + +_______________________________________ + ## Client Connect Events + - NWNX_ON_CLIENT_CONNECT_BEFORE + - NWNX_ON_CLIENT_CONNECT_AFTER + + `OBJECT_SELF` = The module + + Event Data Tag | Type | Notes + ----------------------|--------|------- + PLAYER_NAME | string | Player name of the connecting client + CDKEY | string | Public cdkey of the connecting client + IS_DM | int | Whether the client is connect as DM (1/0) + IP_ADDRESS | string | The IP address of the connecting client + + @note Skipping the _BEFORE event will cause the client's connection to be denied. + You can optionally pass a reason for this in the event result. + +_______________________________________ + ## CombatEnter/Exit Events + - NWNX_ON_COMBAT_ENTER_BEFORE + - NWNX_ON_COMBAT_ENTER_AFTER + - NWNX_ON_COMBAT_EXIT_BEFORE + - NWNX_ON_COMBAT_EXIT_AFTER + + `OBJECT_SELF` = The player entering/exiting combat. + + @note Only works for PCs. + +_______________________________________ + ## Combat Round Start Events + - NWNX_ON_START_COMBAT_ROUND_BEFORE + - NWNX_ON_START_COMBAT_ROUND_AFTER + + `OBJECT_SELF` = The creature starting the combat round + + Event Data Tag | Type | Notes + ----------------------|--------|------- + TARGET_OBJECT_ID | object | Convert to object with StringToObject() + +_______________________________________ + ## Disarm Events + - NWNX_ON_DISARM_BEFORE + - NWNX_ON_DISARM_AFTER + + `OBJECT_SELF` = The creature who is being disarmed + + Event Data Tag | Type | Notes + ----------------------|--------|------- + DISARMER_OBJECT_ID | object | The object disarming the creature + FEAT_ID | int | The feat used to perform the disarming (Normal vs Improved Disarm) + ACTION_RESULT | int | TRUE/FALSE, only in _AFTER events + +_______________________________________ + ## Cast Spell Events + - NWNX_ON_CAST_SPELL_BEFORE + - NWNX_ON_CAST_SPELL_AFTER + + `OBJECT_SELF` = The creature casting the spell + + Event Data Tag | Type | Notes | + ----------------------|--------|-------| + SPELL_ID | int | | + TARGET_POSITION_X | float | | + TARGET_POSITION_Y | float | | + TARGET_POSITION_Z | float | | + TARGET_OBJECT_ID | object | Convert to object with StringToObject() | + ITEM_OBJECT_ID | object | Convert to object with StringToObject() | + MULTI_CLASS | int | | + SPELL_COUNTERED | int | Returns TRUE if spell was countered else FALSE | + COUNTERING_SPELL | int | Returns TRUE if cast as counter else FALSE | + PROJECTILE_PATH_TYPE | int | | + IS_INSTANT_SPELL | int | Returns TRUE if spell was instant else FALSE | + +@note the stock nwscript GetMetaMagicFeat() function will return any metamagic used. + +_______________________________________ + ## Set Memorized Spell Slot Events + - NWNX_SET_MEMORIZED_SPELL_SLOT_BEFORE + - NWNX_SET_MEMORIZED_SPELL_SLOT_AFTER + + `OBJECT_SELF` = The creature who's memorizing the spell + + Event Data Tag | Type | Notes | + ----------------------|--------|-------| + SPELL_MULTICLASS | int | Index of the spell casting class (0-2) | + SPELL_SLOT | int | | + SPELL_ID | int | | + SPELL_DOMAIN | int | | + SPELL_METAMAGIC | int | | + SPELL_FROMCLIENT | int | | + ACTION_RESULT | int | | + +_______________________________________ + ## Clear Memorized Spell Slot Events + - NWNX_CLEAR_MEMORIZED_SPELL_SLOT_BEFORE + - NWNX_CLEAR_MEMORIZED_SPELL_SLOT_AFTER + + `OBJECT_SELF` = The creature whose spellbook is being changed + + Event Data Tag | Type | Notes | + ----------------------|--------|-------| + SPELL_MULTICLASS | int | Index of the spell casting class (0-2) | + SPELL_LEVEL | int | | + SPELL_SLOT | int | | + +_______________________________________ + ## Spell Interrupted Events + - NWNX_ON_SPELL_INTERRUPTED_BEFORE + - NWNX_ON_SPELL_INTERRUPTED_AFTER + + `OBJECT_SELF` = The creature whose spell was interrupted + + Event Data Tag | Type | Notes | + ----------------------|--------|-------| + SPELL_ID | int | | + SPELL_CLASS | int | Index of the spell casting class (0-2) | + SPELL_DOMAIN | int | | + SPELL_METAMAGIC | int | | + SPELL_FEAT | int | | + SPELL_SPONTANEOUS | int | | + +_______________________________________ + ## Healer Kit Use Events + - NWNX_ON_HEALER_KIT_BEFORE + - NWNX_ON_HEALER_KIT_AFTER + + `OBJECT_SELF` = The creature using the Healer's Kit + + Event Data Tag | Type | Notes | + ----------------------|--------|-------| + TARGET_OBJECT_ID | object | Convert to object with StringToObject() | + ITEM_OBJECT_ID | object | Convert to object with StringToObject() | + ITEM_PROPERTY_INDEX | int | | + MOVE_TO_TARGET | int | | + ACTION_RESULT | int | | + +_______________________________________ + ## Healing Events + - NWNX_ON_HEAL_BEFORE + - NWNX_ON_HEAL_AFTER + + `OBJECT_SELF` = The creature performing the heal + + Event Data Tag | Type | Notes | + ----------------------|--------|-------| + TARGET_OBJECT_ID | object | Convert to object with StringToObject() | + HEAL_AMOUNT | int | How many HP the heal will provide | + +_______________________________________ + ## Party Action Events + - NWNX_ON_PARTY_*_BEFORE + - NWNX_ON_PARTY_*_AFTER + + `OBJECT_SELF` = The player doing the action + + Replace * with an event listed below + + Event | Event Data Tag | Type | Notes | + ----------------|-----------------------|--------|-------| + LEAVE | LEAVING | object | Convert to object with StringToObject() | + KICK | KICKED | object | Convert to object with StringToObject() | + TRANSFER_LEADERSHIP | NEW_LEADER | object | Convert to object with StringToObject() | + INVITE | INVITED | object | Convert to object with StringToObject() | + IGNORE_INVITATION | INVITED_BY | object | Convert to object with StringToObject() | + ACCEPT_INVITATION | INVITED_BY | object | Convert to object with StringToObject() | + REJECT_INVITATION | INVITED_BY | object | Convert to object with StringToObject() | + KICK_HENCHMAN | INVITED_BY | object | Convert to object with StringToObject() | + +_______________________________________ + ## Combat Mode Toggle Events + - NWNX_ON_COMBAT_MODE_ON + - NWNX_ON_COMBAT_MODE_OFF + + `OBJECT_SELF` = The Player Character toggling the mode + + Event Data Tag | Type | Notes + ----------------------|--------|------- + COMBAT_MODE_ID | int | See below + + The `COMBAT_MODE_ID` returned does not match the `COMBAT_MODE_*` NWScript constants. Use the following: + Combat Mode | ID + ----------------------|---- + NONE | 0 + PARRY | 1 + POWER_ATTACK | 2 + IMPROVED_POWER_ATTACK | 3 + COUNTERSPELL | 4 + FLURRY_OF_BLOWS | 5 + RAPID_SHOT | 6 + EXPERTISE | 7 + IMPROVED_EXPERTISE | 8 + DEFENSIVE_CASTING | 9 + DIRTY_FIGHTING | 10 + DEFENSIVE_STANCE | 11 + + @note Requires @ref combatmodes "NWNX_CombatModes" plugin to work. + +_______________________________________ + ## Use Skill Events + - NWNX_ON_USE_SKILL_BEFORE + - NWNX_ON_USE_SKILL_AFTER + + `OBJECT_SELF` = The creature using the skill + + Event Data Tag | Type | Notes | + ----------------------|--------|-------| + USED_ITEM_OBJECT_ID | object | Convert to object with StringToObject() | + TARGET_OBJECT_ID | object | Convert to object with StringToObject() | + SKILL_ID | int | | + SUB_SKILL_ID | int | | + TARGET_POSITION_X | float | | + TARGET_POSITION_Y | float | | + TARGET_POSITION_Z | float | | + ACTION_RESULT | int | TRUE/FALSE, only in _AFTER events + + @note Probably only really works with the following activated skills: + `SKILL_ANIMAL_EMPATHY`, `SKILL_DISABLE_TRAP`, `SKILL_HEAL`, `SKILL_OPEN_LOCK`, + `SKILL_PICK_POCKET`, `SKILL_TAUNT` + +_______________________________________ + ## Map Pin Events + - NWNX_ON_MAP_PIN_ADD_PIN_BEFORE + - NWNX_ON_MAP_PIN_ADD_PIN_AFTER + - NWNX_ON_MAP_PIN_CHANGE_PIN_BEFORE + - NWNX_ON_MAP_PIN_CHANGE_PIN_AFTER + - NWNX_ON_MAP_PIN_DESTROY_PIN_BEFORE + - NWNX_ON_MAP_PIN_DESTROY_PIN_AFTER + + `OBJECT_SELF` = The player performing the map pin action + + Event Data Tag | Type | Notes + ----------------------|--------|------- + PIN_X | float | Not available in DESTROY event + PIN_Y | float | Not available in DESTROY event + PIN_ID | int | Not available in ADD events. Use `GetLocalInt(oPC, "NW_TOTAL_MAP_PINS")` + PIN_NOTE | string | Not available in DESTROY event + +_______________________________________ + ## Spot/Listen Detection Events + - NWNX_ON_DO_LISTEN_DETECTION_BEFORE + - NWNX_ON_DO_LISTEN_DETECTION_AFTER + - NWNX_ON_DO_SPOT_DETECTION_BEFORE + - NWNX_ON_DO_SPOT_DETECTION_AFTER + + `OBJECT_SELF` = The creature doing the detecting + + Event Data Tag | Type | Notes + ----------------------|--------|------- + TARGET | object | Convert to object with StringToObject() + TARGET_INVISIBLE | int | TRUE/FALSE + BEFORE_RESULT | int | TRUE/FALSE, only in _AFTER events + +_______________________________________ + ## Polymorph Events + - NWNX_ON_POLYMORPH_BEFORE + - NWNX_ON_POLYMORPH_AFTER + - NWNX_ON_UNPOLYMORPH_BEFORE + - NWNX_ON_UNPOLYMORPH_AFTER + + `OBJECT_SELF` = The creature doing the un/polymorphing + + Event Data Tag | Type | Notes + ----------------------|--------|------- + POLYMORPH_TYPE | int | Appearance polymorphing into. Only for ON_POLYMORPH + + @warning If skipping the ON_POLYMORPH event, in some cases bioware scripts will enter an endless loop + trying to merge item properties.\n + This can be seen in `x2_s2_gwildshp` with the minotaur form with the following line: + `IPWildShapeCopyItemProperties(oWeaponOld,oWeaponNew, TRUE);` + If you want to skip this, you need to make sure oWeaponOld != oWeaponNew + +_______________________________________ + ## Effect Applied/Removed Events + - NWNX_ON_EFFECT_APPLIED_BEFORE + - NWNX_ON_EFFECT_APPLIED_AFTER + - NWNX_ON_EFFECT_REMOVED_BEFORE + - NWNX_ON_EFFECT_REMOVED_AFTER + + `OBJECT_SELF` = The target of the effect + + Event Data Tag | Type | Notes | + ----------------------|--------|-------| + UNIQUE_ID | int | | + CREATOR | object | Convert to object with StringToObject() | + TYPE | int | The effect type, does not match NWScript constants See: https://github.com/nwnxee/unified/blob/master/NWNXLib/API/Constants/Effect.hpp#L8 | + SUB_TYPE | int | SUBTYPE_* | + DURATION_TYPE | int | DURATION_TYPE_* | + DURATION | float | | + SPELL_ID | int | | + CASTER_LEVEL | int | | + CUSTOM_TAG | string | | + INT_PARAM_* | int | * = 1-8 | + FLOAT_PARAM_* | float | * = 1-4 | + STRING_PARAM_* | string | * = 1-6 | + OBJECT_PARAM_* | object | * = 1-4, Convert to object with StringToObject() | + + @note Only fires for Temporary or Permanent effects, does not include VisualEffects or ItemProperty effects. + +_______________________________________ + ## Quickchat Events + - NWNX_ON_QUICKCHAT_BEFORE + - NWNX_ON_QUICKCHAT_AFTER + + `OBJECT_SELF` = The player using the quick chat command + + Event Data Tag | Type | Notes + ----------------------|--------|------- + QUICKCHAT_COMMAND | int | `VOICE_CHAT_*` constants + +_______________________________________ + ## Inventory Open Events + - NWNX_ON_INVENTORY_OPEN_BEFORE + - NWNX_ON_INVENTORY_OPEN_AFTER + + `OBJECT_SELF` = The player opening the inventory + + Event Data Tag | Type | Notes + ----------------------|--------|------- + TARGET_INVENTORY | object | Pretty sure this is always the player + +_______________________________________ + ## Inventory Select Panel Events + - NWNX_ON_INVENTORY_SELECT_PANEL_BEFORE + - NWNX_ON_INVENTORY_SELECT_PANEL_AFTER + + `OBJECT_SELF` = The player changing inventory panels + + Event Data Tag | Type | Notes + ----------------------|--------|------- + CURRENT_PANEL | int | The current panel, index starts at 0 + SELECTED_PANEL | int | The selected panel, index starts at 0 + +_______________________________________ + ## Barter Start Events + - NWNX_ON_BARTER_START_BEFORE + - NWNX_ON_BARTER_START_AFTER + + `OBJECT_SELF` = The player who initiated the barter + + Event Data Tag | Type | Notes + ----------------------|--------|------- + BARTER_TARGET | object | The other player involved in the barter + +_______________________________________ + ## Barter End Events + - NWNX_ON_BARTER_END_BEFORE + - NWNX_ON_BARTER_END_AFTER + + `OBJECT_SELF` = The player who initiated the barter + + Event Data Tag | Type | Notes + ------------------------------|--------|------- + BARTER_TARGET | object | The other player involved in the barter + BARTER_COMPLETE | int | TRUE/FALSE - whether the barter completed successfully + BARTER_INITIATOR_ITEM_COUNT | int | How many items the initiator traded away, only in _BEFORE events + BARTER_TARGET_ITEM_COUNT | int | How many items the target traded away, only in _BEFORE events + BARTER_INITIATOR_ITEM_* | object | Convert to object with StringToObject(), only in _BEFORE events + BARTER_TARGET_ITEM_* | object | Convert to object with StringToObject(), only in _BEFORE events + +_______________________________________ + ## Trap Events + - NWNX_ON_TRAP_DISARM_BEFORE + - NWNX_ON_TRAP_DISARM_AFTER + - NWNX_ON_TRAP_ENTER_BEFORE + - NWNX_ON_TRAP_ENTER_AFTER + - NWNX_ON_TRAP_EXAMINE_BEFORE + - NWNX_ON_TRAP_EXAMINE_AFTER + - NWNX_ON_TRAP_FLAG_BEFORE + - NWNX_ON_TRAP_FLAG_AFTER + - NWNX_ON_TRAP_RECOVER_BEFORE + - NWNX_ON_TRAP_RECOVER_AFTER + - NWNX_ON_TRAP_SET_BEFORE + - NWNX_ON_TRAP_SET_AFTER + + `OBJECT_SELF` = The creature performing the trap action + + Event Data Tag | Type | Notes + ----------------------|--------|------- + TRAP_OBJECT_ID | object | Convert to object with StringToObject() + TRAP_FORCE_SET | int | TRUE/FALSE, only in ENTER events + ACTION_RESULT | int | TRUE/FALSE, only in _AFTER events (not ENTER) + +_______________________________________ + ## Timing Bar Events + - NWNX_ON_TIMING_BAR_START_BEFORE + - NWNX_ON_TIMING_BAR_START_AFTER + - NWNX_ON_TIMING_BAR_STOP_BEFORE + - NWNX_ON_TIMING_BAR_STOP_AFTER + - NWNX_ON_TIMING_BAR_CANCEL_BEFORE + - NWNX_ON_TIMING_BAR_CANCEL_AFTER + + `OBJECT_SELF` = The player the timing bar is for + + Event Data Tag | Type | Notes + ----------------------|--------|------- + EVENT_ID | int | The type of timing bar, see constants below, only in _START_ events + DURATION | int | Length of time (in milliseconds) the bar is set to last, only in _START_ events + +_______________________________________ + ## Webhook Events + - NWNX_ON_WEBHOOK_SUCCESS + - NWNX_ON_WEBHOOK_FAILURE + + `OBJECT_SELF` = The module object + + Event Data Tag | Type | Notes | + ----------------------|--------|-------| + STATUS | int | The return code after posting to the server | + MESSAGE | string | The full constructed message sent | + HOST | string | | + PATH | string | | + RATELIMIT_LIMIT | int | Discord: The number of requests that can be made in a limited period | + RATELIMIT_REMAINING | int | Discord: The number of remaining requests that can be made before rate limited | + RATELIMIT_RESET | int | Discord: Timestamp when the rate limit resets | + RETRY_AFTER | float | Milliseconds until another webhook is allowed when rate limited | + FAIL_INFO | string | The reason the hook failed aside from rate limits | + + @note Requires @ref webhook "NWNX_WebHook" plugin to work. + +_______________________________________ + ## Servervault Events + - NWNX_ON_CHECK_STICKY_PLAYER_NAME_RESERVED_BEFORE + - NWNX_ON_CHECK_STICKY_PLAYER_NAME_RESERVED_AFTER + + `OBJECT_SELF` = The module + + Event Data Tag | Type | Notes + ----------------------|--------|------- + PLAYER_NAME | string | Player name of the connecting client + CDKEY | string | Public cdkey of the connecting client + LEGACY_CDKEY | string | Public cdkey from earlier versions of NWN + IS_DM | int | Whether the client is connecting as DM (1/0) + + @note Skipping the _BEFORE event will cause no player names to be accepted unless you SetEventResult("1") + +_______________________________________ + ## Server Character Save Events + - NWNX_ON_SERVER_CHARACTER_SAVE_BEFORE + - NWNX_ON_SERVER_CHARACTER_SAVE_AFTER + + `OBJECT_SELF` = The player character being saved. + + @note This is called once for every character when the server is exiting and when the server is saved, or when ExportSingleCharacter() & ExportAllCharacters() is called. + +_______________________________________ + ## Export Character Events + - NWNX_ON_CLIENT_EXPORT_CHARACTER_BEFORE + - NWNX_ON_CLIENT_EXPORT_CHARACTER_AFTER + + `OBJECT_SELF` = The player + + Note: This event runs when the player clicks the "Save Character" button in the options menu to export their character to their localvault. + +_______________________________________ + ## Levelling Events + - NWNX_ON_LEVEL_UP_BEFORE + - NWNX_ON_LEVEL_UP_AFTER + - NWNX_ON_LEVEL_UP_AUTOMATIC_BEFORE + - NWNX_ON_LEVEL_UP_AUTOMATIC_AFTER + - NWNX_ON_LEVEL_DOWN_BEFORE + - NWNX_ON_LEVEL_DOWN_AFTER + + `OBJECT_SELF` = The creature levelling up or down, automatic is for henchmen levelling + +_______________________________________ + ## Container Change Events + - NWNX_ON_INVENTORY_ADD_ITEM_BEFORE + - NWNX_ON_INVENTORY_ADD_ITEM_AFTER + - NWNX_ON_INVENTORY_REMOVE_ITEM_BEFORE + - NWNX_ON_INVENTORY_REMOVE_ITEM_AFTER + + @note NWNX_ON_INVENTORY_REMOVE_ITEM_* is not skippable + + `OBJECT_SELF` = The container + + Event Data Tag | Type | Notes + ----------------------|--------|------- + ITEM | object | Convert to object with StringToObject() + +_______________________________________ + ## Gold Events + - NWNX_ON_INVENTORY_ADD_GOLD_BEFORE + - NWNX_ON_INVENTORY_ADD_GOLD_AFTER + - NWNX_ON_INVENTORY_REMOVE_GOLD_BEFORE + - NWNX_ON_INVENTORY_REMOVE_GOLD_AFTER + + `OBJECT_SELF` = The creature gaining or losing gold + + Event Data Tag | Type | Notes + ----------------------|--------|------- + GOLD | int | The amount of gold added or removed + + @warning While these events are skippable, you should be very careful about doing so. + It's very easy to create situations where players can dupe their gold or worse. + +_______________________________________ + ## PVP Attitude Change Events + - NWNX_ON_PVP_ATTITUDE_CHANGE_BEFORE + - NWNX_ON_PVP_ATTITUDE_CHANGE_AFTER + + `OBJECT_SELF` = The player performing the attitude change + + Event Data Tag | Type | Notes + ----------------------|--------|------- + TARGET_OBJECT_ID | object | Convert to object with StringToObject() + ATTITUDE | int | 0 = Dislike, 1 = Like + +_______________________________________ + ## Input Walk To Events + - NWNX_ON_INPUT_WALK_TO_WAYPOINT_BEFORE + - NWNX_ON_INPUT_WALK_TO_WAYPOINT_AFTER + + `OBJECT_SELF` = The player clicking somewhere to move + + Event Data Tag | Type | Notes | + ----------------------|--------|-------| + AREA | object | Convert to object with StringToObject() | + POS_X | float | | + POS_Y | float | | + POS_Z | float | | + RUN_TO_POINT | int | TRUE if player is running, FALSE if player is walking (eg when shift clicking) | + +_______________________________________ + ## Material Change Events + - NWNX_ON_MATERIALCHANGE_BEFORE + - NWNX_ON_MATERIALCHANGE_AFTER + + `OBJECT_SELF` = The creature walking on a different surface material + + Event Data Tag | Type | Notes + ----------------------|--------|------- + MATERIAL_TYPE | int | See surfacemat.2da for values + + @note: After a PC transitions to a new area, a surface material change event + won't fire until after the PC moves. + +_______________________________________ + ## Input Attack Events + - NWNX_ON_INPUT_ATTACK_OBJECT_BEFORE + - NWNX_ON_INPUT_ATTACK_OBJECT_AFTER + + `OBJECT_SELF` = The creature attacking + + Event Data Tag | Type | Notes + ----------------------|--------|------- + TARGET | object | Convert to object with StringToObject() + PASSIVE | int | TRUE / FALSE + CLEAR_ALL_ACTIONS | int | TRUE / FALSE + ADD_TO_FRONT | int | TRUE / FALSE + +_______________________________________ + ## Input Force Move To Events + - NWNX_ON_INPUT_FORCE_MOVE_TO_OBJECT_BEFORE + - NWNX_ON_INPUT_FORCE_MOVE_TO_OBJECT_AFTER + + `OBJECT_SELF` = The creature forcibly moving + + Event Data Tag | Type | Notes + ----------------------|--------|------- + TARGET | object | Convert to object with StringToObject() + + _______________________________________ + ## Input Cast Spell Events + - NWNX_ON_INPUT_CAST_SPELL_BEFORE + - NWNX_ON_INPUT_CAST_SPELL_AFTER + + `OBJECT_SELF` = The creature casting a spell + + Event Data Tag | Type | Notes + ----------------------|--------|------- + TARGET | object | Convert to object with StringToObject() + SPELL_ID | int | + MULTICLASS | int | + DOMAIN_LEVEL | int | + META_TYPE | int | + INSTANT | int | TRUE / FALSE + PROJECTILE_PATH | int | + SPONTANEOUS | int | TRUE / FALSE + FAKE | int | TRUE / FALSE + FEAT | int | -1 when not cast from a feat + CASTER_LEVEL | int | + IS_AREA_TARGET | int | TRUE / FALSE + POS_X | float | + POS_Y | float | + POS_Z | float | + + @note This event runs the moment a creature starts casting + +_______________________________________ + ## Input Keyboard Events + - NWNX_ON_INPUT_KEYBOARD_BEFORE + - NWNX_ON_INPUT_KEYBOARD_AFTER + + `OBJECT_SELF` = The player + + Event Data Tag | Type | Notes + ----------------------|--------|------- + KEY | string | The key pressed by the player, one of the following: W A S D Q E + + @note To stop the player from moving you can do something like below, since normal immobilizing effects stop the client + from sending input. + + location locPlayer = GetLocation(oPlayer); + object oBoulder = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_boulder", locPlayer, FALSE, "TESTPLC"); + NWNX_Object_SetPosition(oPlayer, GetPositionFromLocation(locPlayer)); + ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY), oBoulder); + +_______________________________________ + ## Input Keyboard Events + - NWNX_ON_INPUT_TOGGLE_PAUSE_BEFORE + - NWNX_ON_INPUT_TOGGLE_PAUSE_AFTER + + `OBJECT_SELF` = The player or DM + + Event Data Tag | Type | Notes + ----------------------|--------|------- + PAUSE_STATE | int | TRUE = Pausing, FALSE = Unpausing + + @note This event also fires when a non-dm player presses the spacebar. + +_______________________________________ + ## Object Lock Events + - NWNX_ON_OBJECT_LOCK_BEFORE + - NWNX_ON_OBJECT_LOCK_AFTER + + `OBJECT_SELF` = The object doing the locking + + Event Data Tag | Type | Notes + ----------------------|--------|------- + DOOR | object | Convert to object with StringToObject() + ACTION_RESULT | int | TRUE/FALSE, only in _AFTER events + +_______________________________________ + ## Object Unlock Events + - NWNX_ON_OBJECT_UNLOCK_BEFORE + - NWNX_ON_OBJECT_UNLOCK_AFTER + + `OBJECT_SELF` = The object doing the unlocking + + Event Data Tag | Type | Notes + ----------------------|--------|------- + DOOR | object | Convert to object with StringToObject() + THIEVES_TOOL | object | Convert to object with StringToObject() + ACTIVE_PROPERTY_INDEX | int | + ACTION_RESULT | int | TRUE/FALSE, only in _AFTER events + +_______________________________________ + ## UUID Collision Events + - NWNX_ON_UUID_COLLISION_BEFORE + - NWNX_ON_UUID_COLLISION_AFTER + + `OBJECT_SELF` = The object that caused the UUID collision + + Event Data Tag | Type | Notes + ----------------------|--------|------- + UUID | string | The UUID + + Note: To get the existing object with `UUID` you can use GetObjectByUUID(), be aware that this event runs before the + object is added to the world which means many functions (for example `GetArea(OBJECT_SELF)`) will not work. + +_______________________________________ + ## Resource Events + - NWNX_ON_RESOURCE_ADDED + - NWNX_ON_RESOURCE_REMOVED + - NWNX_ON_RESOURCE_MODIFIED + + `OBJECT_SELF` = The module + + Event Data Tag | Type | Notes + ----------------------|--------|------- + ALIAS | string | NWNX for /nwnx, DEVELOPMENT for /development. Also supports valid aliases from the Custom Resman Definition File + RESREF | string | The ResRef of the file + TYPE | int | The type of the file, see NWNX_UTIL_RESREF_TYPE_* + + Note: These events fire when a file gets added/removed/modified in resource folders like /nwnx, /development and those defined in the Custom Resman Definition File + +_______________________________________ + ## ELC Events + - NWNX_ON_ELC_VALIDATE_CHARACTER_BEFORE + - NWNX_ON_ELC_VALIDATE_CHARACTER_AFTER + + `OBJECT_SELF` = The player + + Note: NWNX_ELC must be loaded for these events to work. The `_AFTER` event only fires if the character successfully + completes validation. + +_______________________________________ + ## Quickbar Events + - NWNX_ON_QUICKBAR_SET_BUTTON_BEFORE + - NWNX_ON_QUICKBAR_SET_BUTTON_AFTER + + `OBJECT_SELF` = The player + + Event Data Tag | Type | Notes + ----------------------|--------|------- + BUTTON | int | The quickbar button slot, 0-35 + TYPE | int | The type of quickbar button set, see NWNX_PLAYER_QBS_TYPE_* in nwnx_player_qbs.nss + + Note: Skipping the event does not prevent the client from changing the button clientside, the change won't however + be saved to the bic file. + +_______________________________________ + ## Calendar Events + - NWNX_ON_CALENDAR_HOUR + - NWNX_ON_CALENDAR_DAY + - NWNX_ON_CALENDAR_MONTH + - NWNX_ON_CALENDAR_YEAR + - NWNX_ON_CALENDAR_DAWN + - NWNX_ON_CALENDAR_DUSK + + `OBJECT_SELF` = The module + + Event Data Tag | Type | Notes + ----------------------|--------|------- + OLD | int | The (Hour/Day/Month/Year) before the change. Not available in DAWN/DUSK. + NEW | int | The (Hour/Day/Month/Year) after the change. Not available in DAWN/DUSK. + +_______________________________________ + ## Broadcast Spell Cast Events + - NWNX_ON_BROADCAST_CAST_SPELL_BEFORE + - NWNX_ON_BROADCAST_CAST_SPELL_AFTER + + `OBJECT_SELF` = The creature casting the spell + + Event Data Tag | Type | Notes | + ----------------------|--------|-------| + SPELL_ID | int | | + MULTI_CLASS | int | | + FEAT | int | 65535 if a feat wasn't used, otherwise the feat ID | + +_______________________________________ + ## RunScript Debug Event + - NWNX_ON_DEBUG_RUN_SCRIPT_BEFORE + - NWNX_ON_DEBUG_RUN_SCRIPT_AFTER + + `OBJECT_SELF` = The player executing the RunScript debug command + + Event Data Tag | Type | Notes | + ----------------------|--------|-------| + SCRIPT_NAME | string | The script to execute | + TARGET | object | The target to run the script on. Convert to object with StringToObject() | + + @note This event also runs for players that do not have permission to execute the command. + +_______________________________________ + ## RunScriptChunk Debug Event + - NWNX_ON_DEBUG_RUN_SCRIPT_CHUNK_BEFORE + - NWNX_ON_DEBUG_RUN_SCRIPT_CHUNK_AFTER + + `OBJECT_SELF` = The player executing the RunScriptChunk debug command + + Event Data Tag | Type | Notes | + ----------------------|--------|-------| + SCRIPT_CHUNK | string | The script chunk | + TARGET | object | The target to run the script chunk on. Convert to object with StringToObject() | + WRAP_INTO_MAIN | int | TRUE if the WrapIntoMain checkbox is checked, otherwise FALSE | + + @note This event also runs for players that do not have permission to execute the command. + +_______________________________________ + ## Buy/Sell Store Events + - NWNX_ON_STORE_REQUEST_BUY_BEFORE + - NWNX_ON_STORE_REQUEST_BUY_AFTER + - NWNX_ON_STORE_REQUEST_SELL_BEFORE + - NWNX_ON_STORE_REQUEST_SELL_AFTER + + `OBJECT_SELF` = The creature buying or selling an item + + Event Data Tag | Type | Notes | + ----------------------|--------|-------| + ITEM | object | The item being bought or sold. Convert to object with StringToObject() | + STORE | object | The store the item is being sold to or bought from. Convert to object with StringToObject() | + PRICE | int | The buy or sell price | + RESULT | int | TRUE/FALSE whether the request was successful. Only in *_AFTER events. + +_______________________________________ + ## Server Send Area Events + - NWNX_ON_SERVER_SEND_AREA_BEFORE + - NWNX_ON_SERVER_SEND_AREA_AFTER + + `OBJECT_SELF` = The player + + Event Data Tag | Type | Notes + ----------------------|--------|------- + AREA | object | The area the server is sending. Convert to object with StringToObject() | + PLAYER_NEW_TO_MODULE | int | TRUE if it's the player's first time logging into the server since a restart | + +_______________________________________ + ## Journal Open/Close Events + - NWNX_ON_JOURNAL_OPEN_BEFORE + - NWNX_ON_JOURNAL_OPEN_AFTER + - NWNX_ON_JOURNAL_CLOSE_BEFORE + - NWNX_ON_JOURNAL_CLOSE_AFTER + + `OBJECT_SELF` = The player + + Event Data Tag | Type | Notes + ----------------------|--------|------- + +_______________________________________ + ## Input Emote Event + - NWNX_ON_INPUT_EMOTE_BEFORE + - NWNX_ON_INPUT_EMOTE_AFTER + + `OBJECT_SELF` = The creature using a radial menu emote + + Event Data Tag | Type | Notes + ----------------------|--------|------- + ANIMATION | int | An engine animation constant, convent to NWScript animation constant with NWNX_Consts_TranslateEngineAnimation() | + + @note Some emotes have a voiceline that will still play when the event is skipped. These voicelines can be skipped in the NWNX_ON_QUICKCHAT_* event. + +_______________________________________ +*/ +/* +const int NWNX_EVENTS_OBJECT_TYPE_CREATURE = 5; +const int NWNX_EVENTS_OBJECT_TYPE_ITEM = 6; +const int NWNX_EVENTS_OBJECT_TYPE_TRIGGER = 7; +const int NWNX_EVENTS_OBJECT_TYPE_PLACEABLE = 9; +const int NWNX_EVENTS_OBJECT_TYPE_WAYPOINT = 12; +const int NWNX_EVENTS_OBJECT_TYPE_ENCOUNTER = 13; +const int NWNX_EVENTS_OBJECT_TYPE_PORTAL = 15; +*/ + +/* +const int NWNX_EVENTS_TIMING_BAR_TRAP_FLAG = 1; +const int NWNX_EVENTS_TIMING_BAR_TRAP_RECOVER = 2; +const int NWNX_EVENTS_TIMING_BAR_TRAP_DISARM = 3; +const int NWNX_EVENTS_TIMING_BAR_TRAP_EXAMINE = 4; +const int NWNX_EVENTS_TIMING_BAR_TRAP_SET = 5; +const int NWNX_EVENTS_TIMING_BAR_REST = 6; +const int NWNX_EVENTS_TIMING_BAR_UNLOCK = 7; +const int NWNX_EVENTS_TIMING_BAR_LOCK = 8; +const int NWNX_EVENTS_TIMING_BAR_CUSTOM = 10; +*/ + +/// @brief Scripts can subscribe to events. +/// +/// Some events are dispatched via the NWNX plugin (see NWNX_EVENTS_EVENT_* constants). +/// Others can be signalled via script code via NWNX_Events_SignalEvent(). +/// @param evt The event name. +/// @param script The script to call when the event fires. +void NWNX_Events_SubscribeEvent(string evt, string script); + +/// @brief Unsubscribe a script from an event +/// @param evt The event name. +/// @param script The script. +void NWNX_Events_UnsubscribeEvent(string evt, string script); + +/// Pushes event data at the provided tag, which subscribers can access with GetEventData. +/// This should be called BEFORE SignalEvent. +void NWNX_Events_PushEventData(string tag, string data); + +/// Signals an event. This will dispatch a notification to all subscribed handlers. +/// Returns TRUE if anyone was subscribed to the event, FALSE otherwise. +/// @remark target will be available as OBJECT_SELF in subscribed event scripts. +int NWNX_Events_SignalEvent(string evt, object target); + +/// Retrieves the event data for the currently executing script. +/// THIS SHOULD ONLY BE CALLED FROM WITHIN AN EVENT HANDLER. +string NWNX_Events_GetEventData(string tag); + +/// Skips execution of the currently executing event. +/// If this is a NWNX event, that means that the base function call won't be called. +/// This won't impact any other subscribers, nor dispatch for before / after functions. +/// For example, if you are subscribing to NWNX_ON_EXAMINE_OBJECT_BEFORE, and you skip ... +/// - The other subscribers will still be called. +/// - The original function in the base game will be skipped. +/// - The matching after event (NWNX_ON_EXAMINE_OBJECT_AFTER) will also be executed. +/// +/// THIS SHOULD ONLY BE CALLED FROM WITHIN AN EVENT HANDLER. +/// ONLY WORKS WITH THE FOLLOWING EVENTS: +/// - Feat events +/// - Item events +/// - Healing events +/// - CombatMode events +/// - Party events +/// - Skill events +/// - Map events +/// - Listen/Spot Detection events +/// - Polymorph events +/// - DMAction events +/// - Client connect event +/// - Client Export Character event +/// - Spell events +/// - QuickChat events +/// - Barter event (START only) +/// - Trap events +/// - Sticky Player Name event +/// - Server Character Save Events +/// - Add/RemoveGold events +/// - PVP Attitude Change events +/// - {Enter|Exit}Stealth events +/// - Object {Lock|Unlock} events +/// - Quickbar Events +/// - Input Pause Event +/// - Input Emote Event +/// - Debug events +/// - Store events +/// - Disarm event +/// - {Enter|Exit}Detect events +/// - Faction events +void NWNX_Events_SkipEvent(); + +/// Set the return value of the event. +/// +/// THIS SHOULD ONLY BE CALLED FROM WITHIN AN EVENT HANDLER. +/// ONLY WORKS WITH THE FOLLOWING EVENTS: +/// - Use Item event - "1" or "0" to send feedback whether item use is allowed +/// - Validate Use Item Event - "1" or "0" to show the item is unusable (red) in the player inventory. +/// - Healer's Kit event +/// - Listen/Spot Detection events -> "1" or "0" +/// - OnClientConnectBefore -> Reason for disconnect if skipped +/// - Ammo Reload event -> Forced ammunition returned +/// - Trap events -> "1" or "0" +/// - Sticky Player Name event -> "1" or "0" +/// - Heal event -> Amount of HP to heal +/// - Has Feat event -> "1" or "0" +/// - Stealth event -> "1" to perform HiPS (without the feat), "0" to bypass HiPS +/// - Faction set reputation event -> The new reputation to apply instead. ("0" - "100") +void NWNX_Events_SetEventResult(string data); + +/// Returns the current event name +/// +/// Returns "" on error +string NWNX_Events_GetCurrentEvent(); + +/// Toggles DispatchListMode for sEvent+sScript +/// If enabled, sEvent for sScript will only be signalled if the target object is on its dispatch list. +void NWNX_Events_ToggleDispatchListMode(string sEvent, string sScript, int bEnable); + +/// Add oObject to the dispatch list for sEvent+sScript. +void NWNX_Events_AddObjectToDispatchList(string sEvent, string sScript, object oObject); + +/// Remove oObject from the dispatch list for sEvent+sScript. +void NWNX_Events_RemoveObjectFromDispatchList(string sEvent, string sScript, object oObject); + +/// @brief Toggle the whitelisting of IDs for sEvent. If whitelisting is enabled, the event will only fire for IDs that are +/// on its whitelist. +/// +/// ONLY WORKS WITH THE FOLLOWING EVENTS -> ID TYPES: +/// - NWNX_ON_CAST_SPELL -> SpellID +/// - NWNX_ON_HAS_FEAT -> FeatID (default enabled) +/// +/// @note This enables the whitelist for ALL scripts subscribed to sEvent. +/// @param sEvent The event name without _BEFORE / _AFTER. +/// @param bEnable TRUE to enable the whitelist, FALSE to disable +void NWNX_Events_ToggleIDWhitelist(string sEvent, int bEnable); + +/// @brief Add nID to the whitelist of sEvent. +/// @note See NWNX_Events_ToggleIDWhitelist for valid events and ID types. +/// @param sEvent The event name without _BEFORE / _AFTER. +/// @param nID The ID. +void NWNX_Events_AddIDToWhitelist(string sEvent, int nID); + +/// @brief Remove nID from the whitelist of sEvent. +/// @note See NWNX_Events_ToggleIDWhitelist for valid events and ID types. +/// @param sEvent The event name without _BEFORE / _AFTER. +/// @param nID The ID. +void NWNX_Events_RemoveIDFromWhitelist(string sEvent, int nID); + +/// @} + +void NWNX_Events_SubscribeEvent(string evt, string script) +{ + string sFunc = "SubscribeEvent"; + + NWNX_PushArgumentString(NWNX_Events, sFunc, script); + NWNX_PushArgumentString(NWNX_Events, sFunc, evt); + NWNX_CallFunction(NWNX_Events, sFunc); +} + +void NWNX_Events_UnsubscribeEvent(string evt, string script) +{ + string sFunc = "UnsubscribeEvent"; + + NWNX_PushArgumentString(NWNX_Events, sFunc, script); + NWNX_PushArgumentString(NWNX_Events, sFunc, evt); + NWNX_CallFunction(NWNX_Events, sFunc); +} + +void NWNX_Events_PushEventData(string tag, string data) +{ + string sFunc = "PushEventData"; + + NWNX_PushArgumentString(NWNX_Events, sFunc, data); + NWNX_PushArgumentString(NWNX_Events, sFunc, tag); + NWNX_CallFunction(NWNX_Events, sFunc); +} + +int NWNX_Events_SignalEvent(string evt, object target) +{ + string sFunc = "SignalEvent"; + + NWNX_PushArgumentObject(NWNX_Events, sFunc, target); + NWNX_PushArgumentString(NWNX_Events, sFunc, evt); + NWNX_CallFunction(NWNX_Events, sFunc); + return NWNX_GetReturnValueInt(NWNX_Events, sFunc); +} + +string NWNX_Events_GetEventData(string tag) +{ + string sFunc = "GetEventData"; + + NWNX_PushArgumentString(NWNX_Events, sFunc, tag); + NWNX_CallFunction(NWNX_Events, sFunc); + return NWNX_GetReturnValueString(NWNX_Events, sFunc); +} + +void NWNX_Events_SkipEvent() +{ + string sFunc = "SkipEvent"; + + NWNX_CallFunction(NWNX_Events, sFunc); +} + +void NWNX_Events_SetEventResult(string data) +{ + string sFunc = "SetEventResult"; + + NWNX_PushArgumentString(NWNX_Events, sFunc, data); + NWNX_CallFunction(NWNX_Events, sFunc); +} + +string NWNX_Events_GetCurrentEvent() +{ + string sFunc = "GetCurrentEvent"; + + NWNX_CallFunction(NWNX_Events, sFunc); + return NWNX_GetReturnValueString(NWNX_Events, sFunc); +} + +void NWNX_Events_ToggleDispatchListMode(string sEvent, string sScript, int bEnable) +{ + string sFunc = "ToggleDispatchListMode"; + + NWNX_PushArgumentInt(NWNX_Events, sFunc, bEnable); + NWNX_PushArgumentString(NWNX_Events, sFunc, sScript); + NWNX_PushArgumentString(NWNX_Events, sFunc, sEvent); + NWNX_CallFunction(NWNX_Events, sFunc); +} + +void NWNX_Events_AddObjectToDispatchList(string sEvent, string sScript, object oObject) +{ + string sFunc = "AddObjectToDispatchList"; + + NWNX_PushArgumentObject(NWNX_Events, sFunc, oObject); + NWNX_PushArgumentString(NWNX_Events, sFunc, sScript); + NWNX_PushArgumentString(NWNX_Events, sFunc, sEvent); + NWNX_CallFunction(NWNX_Events, sFunc); +} + +void NWNX_Events_RemoveObjectFromDispatchList(string sEvent, string sScript, object oObject) +{ + string sFunc = "RemoveObjectFromDispatchList"; + + NWNX_PushArgumentObject(NWNX_Events, sFunc, oObject); + NWNX_PushArgumentString(NWNX_Events, sFunc, sScript); + NWNX_PushArgumentString(NWNX_Events, sFunc, sEvent); + NWNX_CallFunction(NWNX_Events, sFunc); +} + +void NWNX_Events_ToggleIDWhitelist(string sEvent, int bEnable) +{ + string sFunc = "ToggleIDWhitelist"; + + NWNX_PushArgumentInt(NWNX_Events, sFunc, bEnable); + NWNX_PushArgumentString(NWNX_Events, sFunc, sEvent); + NWNX_CallFunction(NWNX_Events, sFunc); +} + +void NWNX_Events_AddIDToWhitelist(string sEvent, int nID) +{ + string sFunc = "AddIDToWhitelist"; + + NWNX_PushArgumentInt(NWNX_Events, sFunc, nID); + NWNX_PushArgumentString(NWNX_Events, sFunc, sEvent); + NWNX_CallFunction(NWNX_Events, sFunc); +} + +void NWNX_Events_RemoveIDFromWhitelist(string sEvent, int nID) +{ + string sFunc = "RemoveIDFromWhitelist"; + + NWNX_PushArgumentInt(NWNX_Events, sFunc, nID); + NWNX_PushArgumentString(NWNX_Events, sFunc, sEvent); + NWNX_CallFunction(NWNX_Events, sFunc); +} diff --git a/gamma_age_v2/nwnx_feat.nss b/gamma_age_v2/nwnx_feat.nss new file mode 100644 index 00000000..3ee797ce --- /dev/null +++ b/gamma_age_v2/nwnx_feat.nss @@ -0,0 +1,63 @@ +/// @addtogroup feat Feat +/// @brief Define feat bonuses/penalties +/// @{ +/// @file nwnx_feat.nss +#include "nwnx" + +const string NWNX_Feat = "NWNX_Feat"; ///< @private + +/// @name Feat Modifiers +/// @anchor feat_modifiers +/// +/// @{ +const int NWNX_FEAT_MODIFIER_INVALID = 0; +const int NWNX_FEAT_MODIFIER_AB = 1; +const int NWNX_FEAT_MODIFIER_ABILITY = 2; +const int NWNX_FEAT_MODIFIER_ABVSRACE = 3; +const int NWNX_FEAT_MODIFIER_AC = 4; +const int NWNX_FEAT_MODIFIER_ACVSRACE = 5; +const int NWNX_FEAT_MODIFIER_ARCANESPELLFAILURE = 6; +const int NWNX_FEAT_MODIFIER_CONCEALMENT = 7; +const int NWNX_FEAT_MODIFIER_DMGIMMUNITY = 8; +const int NWNX_FEAT_MODIFIER_DMGREDUCTION = 9; +const int NWNX_FEAT_MODIFIER_DMGRESIST = 10; +const int NWNX_FEAT_MODIFIER_IMMUNITY = 11; +const int NWNX_FEAT_MODIFIER_MOVEMENTSPEED = 12; +const int NWNX_FEAT_MODIFIER_REGENERATION = 13; +const int NWNX_FEAT_MODIFIER_SAVE = 14; +const int NWNX_FEAT_MODIFIER_SAVEVSRACE = 15; +const int NWNX_FEAT_MODIFIER_SAVEVSTYPE = 16; +const int NWNX_FEAT_MODIFIER_SAVEVSTYPERACE = 17; +const int NWNX_FEAT_MODIFIER_SPELLIMMUNITY = 18; +const int NWNX_FEAT_MODIFIER_SRCHARGEN = 19; +const int NWNX_FEAT_MODIFIER_SRINCLEVEL = 20; +const int NWNX_FEAT_MODIFIER_SPELLSAVEDC = 21; +const int NWNX_FEAT_MODIFIER_BONUSSPELL = 22; +const int NWNX_FEAT_MODIFIER_TRUESEEING = 23; +const int NWNX_FEAT_MODIFIER_SEEINVISIBLE = 24; +const int NWNX_FEAT_MODIFIER_ULTRAVISION = 25; +const int NWNX_FEAT_MODIFIER_HASTE = 26; +const int NWNX_FEAT_MODIFIER_VISUALEFFECT = 27; +///@} + +/// @brief Sets a feat modifier. +/// @param iFeat The Feat constant or value in feat.2da. +/// @param iMod The @ref feat_modifiers "feat modifier" to set. +/// @param iParam1, iParam2, iParam3, iParam4 The parameters for this feat modifier. +void NWNX_Feat_SetFeatModifier(int iFeat, int iMod, int iParam1 = 0xDEADBEEF, int iParam2 = 0xDEADBEEF, int iParam3 = 0xDEADBEEF, int iParam4 = 0xDEADBEEF); + +/// @} + +void NWNX_Feat_SetFeatModifier(int iFeat, int iMod, int iParam1 = 0xDEADBEEF, int iParam2 = 0xDEADBEEF, int iParam3 = 0xDEADBEEF, int iParam4 = 0xDEADBEEF) +{ + string sFunc = "SetFeatModifier"; + + NWNX_PushArgumentInt(NWNX_Feat, sFunc, iParam4); + NWNX_PushArgumentInt(NWNX_Feat, sFunc, iParam3); + NWNX_PushArgumentInt(NWNX_Feat, sFunc, iParam2); + NWNX_PushArgumentInt(NWNX_Feat, sFunc, iParam1); + NWNX_PushArgumentInt(NWNX_Feat, sFunc, iMod); + NWNX_PushArgumentInt(NWNX_Feat, sFunc, iFeat); + + NWNX_CallFunction(NWNX_Feat, sFunc); +} diff --git a/gamma_age_v2/nwnx_feedback.nss b/gamma_age_v2/nwnx_feedback.nss new file mode 100644 index 00000000..19aa0df9 --- /dev/null +++ b/gamma_age_v2/nwnx_feedback.nss @@ -0,0 +1,519 @@ +/// @addtogroup feedback Feedback +/// @brief Allows combatlog, feedback and journal updated messages to be hidden globally or per player. +/// @note +/// * If oPC == OBJECT_INVALID it will get/set the global state: +/// * TRUE = Message is globally hidden +/// * FALSE = Message is not globally hidden +/// * If oPC is a valid player it will get/set the personal state: +/// * TRUE = Message is hidden for oPC +/// * FALSE = Message is not hidden for oPC +/// * -1 = Personal state is not set for Message +/// @{ +/// @file nwnx_feedback.nss +#include "nwnx" + +const string NWNX_Feedback = "NWNX_Feedback"; ///< @private + +/// @name Combat Log Message Types +/// @anchor combat_log_msgs +/// @{ +const int NWNX_FEEDBACK_COMBATLOG_SIMPLE_ADJECTIVE = 1; +/* +const int NWNX_FEEDBACK_COMBATLOG_SIMPLE_DAMAGE = 2; +const int NWNX_FEEDBACK_COMBATLOG_COMPLEX_DAMAGE = 3; +const int NWNX_FEEDBACK_COMBATLOG_COMPLEX_DEATH = 4; +const int NWNX_FEEDBACK_COMBATLOG_COMPLEX_ATTACK = 5; +const int NWNX_FEEDBACK_COMBATLOG_SPECIAL_ATTACK = 6; +const int NWNX_FEEDBACK_COMBATLOG_SAVING_THROW = 7; +const int NWNX_FEEDBACK_COMBATLOG_CAST_SPELL = 8; +const int NWNX_FEEDBACK_COMBATLOG_USE_SKILL = 9; +const int NWNX_FEEDBACK_COMBATLOG_SPELL_RESISTANCE = 10; +const int NWNX_FEEDBACK_COMBATLOG_FEEDBACK = 11; // NOTE: This hides ALL feedback messages, to hide individual messages use NWNX_Feedback_SetFeedbackMessageHidden() +const int NWNX_FEEDBACK_COMBATLOG_COUNTERSPELL = 12; +const int NWNX_FEEDBACK_COMBATLOG_TOUCHATTACK = 13; +const int NWNX_FEEDBACK_COMBATLOG_INITIATIVE = 14; +const int NWNX_FEEDBACK_COMBATLOG_DISPEL_MAGIC = 15; +const int NWNX_FEEDBACK_COMBATLOG_POLYMORPH = 17; +const int NWNX_FEEDBACK_COMBATLOG_FEEDBACKSTRING = 18; +const int NWNX_FEEDBACK_COMBATLOG_VIBRATE = 19; +const int NWNX_FEEDBACK_COMBATLOG_UNLOCKACHIEVEMENT = 20; + +// 1 -> Simple_Adjective: : +// 2 -> Simple_Damage: damaged : +// 3 -> Complex_Damage: damages : +// 4 -> Complex_Death: killed +// 5 -> Complex_Attack: attacks : *hit* / *miss* / *parried* : ( + = ) +// 6 -> Special_Attack: attempts on : *success* / *failure* : ( + = ) +// 7 -> Saving_Throw: : : *success* / *failure* : ( + = ) +// 8 -> Cast_Spell: casts : Spellcraft check *failure* / *success* +// 9 -> Use_Skill: : : *success* / *failure* : ( + = vs ) +// 10 -> Spell_Resistance: : Spell Resistance : *success* / *failure* +// 11 -> Feedback: Reason skill/feat/ability failed. +// 12 -> Counterspel: casts : *spell countered by* : casting +// 13 -> TouchAttack: attempts on : *hit/miss/critical* : ( + = ) +// 14 -> Initiative: : Initiative Roll : : ( + = ) +// 15 -> Dispel_Magic: Dispel Magic : : , , ... +// 17 -> Unused, probably +// 18 -> Same as 11, maybe. Might be unused too +// 19 -> Unused +// 20 -> Unused +*/ + +/// @} + +/// @name Feedback Message Types +/// @anchor feedback_msgs +/// @{ + +const int NWNX_FEEDBACK_SKILL_CANT_USE = 0; +/* +/// Skill Feedback Messages +const int NWNX_FEEDBACK_SKILL_CANT_USE_TIMER = 1; +const int NWNX_FEEDBACK_SKILL_ANIMALEMPATHY_VALID_TARGETS = 2; +const int NWNX_FEEDBACK_SKILL_TAUNT_VALID_TARGETS = 3; +const int NWNX_FEEDBACK_SKILL_TAUNT_TARGET_IMMUNE = 223; +const int NWNX_FEEDBACK_SKILL_PICKPOCKET_STOLE_ITEM = 4; +const int NWNX_FEEDBACK_SKILL_PICKPOCKET_STOLE_GOLD = 5; +const int NWNX_FEEDBACK_SKILL_PICKPOCKET_ATTEMPTING_TO_STEAL = 46; +const int NWNX_FEEDBACK_SKILL_PICKPOCKET_ATTEMPT_DETECTED = 150; +const int NWNX_FEEDBACK_SKILL_PICKPOCKET_STOLE_ITEM_TARGET = 47; +const int NWNX_FEEDBACK_SKILL_PICKPOCKET_STOLE_GOLD_TARGET = 48; +const int NWNX_FEEDBACK_SKILL_PICKPOCKET_TARGET_BROKE = 57; +const int NWNX_FEEDBACK_SKILL_HEAL_TARGET_NOT_DISPSND = 55; +const int NWNX_FEEDBACK_SKILL_HEAL_VALID_TARGETS = 56; +const int NWNX_FEEDBACK_SKILL_STEALTH_IN_COMBAT = 60; + +/// Miscellaneous Targetting Messages +const int NWNX_FEEDBACK_TARGET_UNAWARE = 6; +const int NWNX_FEEDBACK_ACTION_NOT_POSSIBLE_STATUS = 7; +const int NWNX_FEEDBACK_ACTION_NOT_POSSIBLE_PVP = 187; +const int NWNX_FEEDBACK_ACTION_CANT_REACH_TARGET = 218; +const int NWNX_FEEDBACK_ACTION_NO_LOOT = 247; + +/// Miscellaneous Feedback Messages +const int NWNX_FEEDBACK_WEIGHT_TOO_ENCUMBERED_TO_RUN = 8; +const int NWNX_FEEDBACK_WEIGHT_TOO_ENCUMBERED_WALK_SLOW = 9; +const int NWNX_FEEDBACK_WEIGHT_TOO_ENCUMBERED_CANT_PICKUP = 10; +const int NWNX_FEEDBACK_STATS_LEVELUP = 11; +const int NWNX_FEEDBACK_INVENTORY_FULL = 12; +const int NWNX_FEEDBACK_CONTAINER_FULL = 212; +const int NWNX_FEEDBACK_TRAP_TRIGGERED = 82; +const int NWNX_FEEDBACK_DAMAGE_HEALED = 151; +const int NWNX_FEEDBACK_EXPERIENCE_GAINNED = 182; +const int NWNX_FEEDBACK_EXPERIENCE_LOST = 183; +const int NWNX_FEEDBACK_JOURNALUPDATED = 184; // Doesn't actually work, use: + // NWNX_Feedback_{Get/Set}JournalUpdatedMessageHidden() +const int NWNX_FEEDBACK_BARTER_CANCELLED = 185; + +/// Mode activation/deactivation Messages +const int NWNX_FEEDBACK_DETECT_MODE_ACTIVATED = 83; +const int NWNX_FEEDBACK_DETECT_MODE_DEACTIVATED = 84; +const int NWNX_FEEDBACK_STEALTH_MODE_ACTIVATED = 85; +const int NWNX_FEEDBACK_STEALTH_MODE_DEACTIVATED = 86; +const int NWNX_FEEDBACK_PARRY_MODE_ACTIVATED = 87; +const int NWNX_FEEDBACK_PARRY_MODE_DEACTIVATED = 88; +const int NWNX_FEEDBACK_POWER_ATTACK_MODE_ACTIVATED = 89; +const int NWNX_FEEDBACK_POWER_ATTACK_MODE_DEACTIVATED = 90; +const int NWNX_FEEDBACK_IMPROVED_POWER_ATTACK_MODE_ACTIVATED = 91; +const int NWNX_FEEDBACK_IMPROVED_POWER_ATTACK_MODE_DEACTIVATED = 92; +const int NWNX_FEEDBACK_RAPID_SHOT_MODE_ACTIVATED = 166; +const int NWNX_FEEDBACK_RAPID_SHOT_MODE_DEACTIVATED = 167; +const int NWNX_FEEDBACK_FLURRY_OF_BLOWS_MODE_ACTIVATED = 168; +const int NWNX_FEEDBACK_FLURRY_OF_BLOWS_MODE_DEACTIVATED = 169; +const int NWNX_FEEDBACK_EXPERTISE_MODE_ACTIVATED = 227; +const int NWNX_FEEDBACK_EXPERTISE_MODE_DEACTIVATED = 228; +const int NWNX_FEEDBACK_IMPROVED_EXPERTISE_MODE_ACTIVATED = 229; +const int NWNX_FEEDBACK_IMPROVED_EXPERTISE_MODE_DEACTIVATED = 230; +const int NWNX_FEEDBACK_DEFENSIVE_CAST_MODE_ACTIVATED = 231; +const int NWNX_FEEDBACK_DEFENSIVE_CAST_MODE_DEACTIVATED = 232; +const int NWNX_FEEDBACK_MODE_CANNOT_USE_WEAPONS = 188; +const int NWNX_FEEDBACK_DIRTY_FIGHTING_MODE_ACTIVATED = 237; +const int NWNX_FEEDBACK_DIRTY_FIGHTING_MODE_DEACTIVATED = 238; + +const int NWNX_FEEDBACK_DEFENSIVE_STANCE_MODE_ACTIVATED = 252; +const int NWNX_FEEDBACK_DEFENSIVE_STANCE_MODE_DEACTIVATED = 253; + +/// Equipping Feedback Messages +const int NWNX_FEEDBACK_EQUIP_SKILL_SPELL_MODIFIERS = 71; +const int NWNX_FEEDBACK_EQUIP_UNIDENTIFIED = 76; +const int NWNX_FEEDBACK_EQUIP_MONK_ABILITIES = 77; +const int NWNX_FEEDBACK_EQUIP_INSUFFICIENT_LEVEL = 98; +const int NWNX_FEEDBACK_EQUIP_PROFICIENCIES = 119; +const int NWNX_FEEDBACK_EQUIP_WEAPON_TOO_LARGE = 120; +const int NWNX_FEEDBACK_EQUIP_WEAPON_TOO_SMALL = 260; +const int NWNX_FEEDBACK_EQUIP_ONE_HANDED_WEAPON = 121; +const int NWNX_FEEDBACK_EQUIP_TWO_HANDED_WEAPON = 122; +const int NWNX_FEEDBACK_EQUIP_WEAPON_SWAPPED_OUT = 123; +const int NWNX_FEEDBACK_EQUIP_ONE_CHAIN_WEAPON = 124; +const int NWNX_FEEDBACK_EQUIP_NATURAL_AC_NO_STACK = 189; +const int NWNX_FEEDBACK_EQUIP_ARMOUR_AC_NO_STACK = 190; +const int NWNX_FEEDBACK_EQUIP_SHIELD_AC_NO_STACK = 191; +const int NWNX_FEEDBACK_EQUIP_DEFLECTION_AC_NO_STACK = 192; +const int NWNX_FEEDBACK_EQUIP_NO_ARMOR_COMBAT = 193; +const int NWNX_FEEDBACK_EQUIP_RANGER_ABILITIES = 200; +const int NWNX_FEEDBACK_EQUIP_ALIGNMENT = 207; +const int NWNX_FEEDBACK_EQUIP_CLASS = 208; +const int NWNX_FEEDBACK_EQUIP_RACE = 209; +const int NWNX_FEEDBACK_UNEQUIP_NO_ARMOR_COMBAT = 194; + +/// Action Feedback Messages +const int NWNX_FEEDBACK_OBJECT_LOCKED = 13; +const int NWNX_FEEDBACK_OBJECT_NOT_LOCKED = 14; +const int NWNX_FEEDBACK_OBJECT_SPECIAL_KEY = 15; +const int NWNX_FEEDBACK_OBJECT_USED_KEY = 16; +const int NWNX_FEEDBACK_REST_EXCITED_CANT_REST = 17; +const int NWNX_FEEDBACK_REST_BEGINNING_REST = 18; +const int NWNX_FEEDBACK_REST_FINISHED_REST = 19; +const int NWNX_FEEDBACK_REST_CANCEL_REST = 20; +const int NWNX_FEEDBACK_REST_NOT_ALLOWED_IN_AREA = 54; +const int NWNX_FEEDBACK_REST_NOT_ALLOWED_BY_POSSESSED_FAMILIAR = 153; +const int NWNX_FEEDBACK_REST_NOT_ALLOWED_ENEMIES = 186; +const int NWNX_FEEDBACK_REST_CANT_UNDER_THIS_EFFECT = 213; +const int NWNX_FEEDBACK_CAST_LOST_TARGET = 21; +const int NWNX_FEEDBACK_CAST_CANT_CAST = 22; +const int NWNX_FEEDBACK_CAST_CNTRSPELL_TARGET_LOST_TARGET = 52; +const int NWNX_FEEDBACK_CAST_ARCANE_SPELL_FAILURE = 61; +const int NWNX_FEEDBACK_CAST_CNTRSPELL_TARGET_ARCANE_SPELL_FAILURE = 118; +const int NWNX_FEEDBACK_CAST_ENTANGLE_CONCENTRATION_FAILURE = 65; +const int NWNX_FEEDBACK_CAST_CNTRSPELL_TARGET_ENTANGLE_CONCENTRATION_FAILURE = 147; +const int NWNX_FEEDBACK_CAST_SPELL_INTERRUPTED = 72; +const int NWNX_FEEDBACK_CAST_EFFECT_SPELL_FAILURE = 236; +const int NWNX_FEEDBACK_CAST_CANT_CAST_WHILE_POLYMORPHED = 107; +const int NWNX_FEEDBACK_CAST_USE_HANDS = 210; +const int NWNX_FEEDBACK_CAST_USE_MOUTH = 211; +const int NWNX_FEEDBACK_CAST_DEFCAST_CONCENTRATION_FAILURE = 233; +const int NWNX_FEEDBACK_CAST_DEFCAST_CONCENTRATION_SUCCESS = 240; +const int NWNX_FEEDBACK_USEITEM_CANT_USE = 23; +const int NWNX_FEEDBACK_CONVERSATION_TOOFAR = 58; +const int NWNX_FEEDBACK_CONVERSATION_BUSY = 59; +const int NWNX_FEEDBACK_CONVERSATION_IN_COMBAT = 152; +const int NWNX_FEEDBACK_CHARACTER_INTRANSIT = 74; +const int NWNX_FEEDBACK_CHARACTER_OUTTRANSIT = 75; +const int NWNX_FEEDBACK_USEITEM_NOT_EQUIPPED = 244; +const int NWNX_FEEDBACK_DROPITEM_CANT_DROP = 245; +const int NWNX_FEEDBACK_DROPITEM_CANT_GIVE = 246; +const int NWNX_FEEDBACK_CLIENT_SERVER_SPELL_MISMATCH = 259; + +/// Combat feedback messages +const int NWNX_FEEDBACK_COMBAT_RUNNING_OUT_OF_AMMO = 24; +const int NWNX_FEEDBACK_COMBAT_OUT_OF_AMMO = 25; +const int NWNX_FEEDBACK_COMBAT_HENCHMAN_OUT_OF_AMMO = 241; +const int NWNX_FEEDBACK_COMBAT_DAMAGE_IMMUNITY = 62; +const int NWNX_FEEDBACK_COMBAT_SPELL_IMMUNITY = 68; +const int NWNX_FEEDBACK_COMBAT_DAMAGE_RESISTANCE = 63; +const int NWNX_FEEDBACK_COMBAT_DAMAGE_RESISTANCE_REMAINING = 66; +const int NWNX_FEEDBACK_COMBAT_DAMAGE_REDUCTION = 64; +const int NWNX_FEEDBACK_COMBAT_DAMAGE_REDUCTION_REMAINING = 67; +const int NWNX_FEEDBACK_COMBAT_SPELL_LEVEL_ABSORPTION = 69; +const int NWNX_FEEDBACK_COMBAT_SPELL_LEVEL_ABSORPTION_REMAINING = 70; +const int NWNX_FEEDBACK_COMBAT_WEAPON_NOT_EFFECTIVE = 117; +const int NWNX_FEEDBACK_COMBAT_EPIC_DODGE_ATTACK_EVADED = 234; +const int NWNX_FEEDBACK_COMBAT_MASSIVE_DAMAGE = 235; +const int NWNX_FEEDBACK_COMBAT_SAVED_VS_MASSIVE_DAMAGE = 254; +const int NWNX_FEEDBACK_COMBAT_SAVED_VS_DEVASTATING_CRITICAL = 257; + +/// Feat Feedback Messages +const int NWNX_FEEDBACK_FEAT_SAP_VALID_TARGETS = 26; +const int NWNX_FEEDBACK_FEAT_KNOCKDOWN_VALID_TARGETS = 27; +const int NWNX_FEEDBACK_FEAT_IMPKNOCKDOWN_VALID_TARGETS = 28; +const int NWNX_FEEDBACK_FEAT_CALLED_SHOT_NO_LEGS = 29; +const int NWNX_FEEDBACK_FEAT_CALLED_SHOT_NO_ARMS = 30; +const int NWNX_FEEDBACK_FEAT_SMITE_GOOD_TARGET_NOT_GOOD = 239; +const int NWNX_FEEDBACK_FEAT_SMITE_EVIL_TARGET_NOT_EVIL = 53; +const int NWNX_FEEDBACK_FEAT_QUIVERING_PALM_HIGHER_LEVEL = 73; +const int NWNX_FEEDBACK_FEAT_KEEN_SENSE_DETECT = 195; +const int NWNX_FEEDBACK_FEAT_USE_UNARMED = 198; +const int NWNX_FEEDBACK_FEAT_USES = 199; +const int NWNX_FEEDBACK_FEAT_USE_WEAPON_OF_CHOICE = 243; + +/// Party Feedback Messages +const int NWNX_FEEDBACK_PARTY_NEW_LEADER = 31; +const int NWNX_FEEDBACK_PARTY_MEMBER_KICKED = 32; +const int NWNX_FEEDBACK_PARTY_KICKED_YOU = 33; +const int NWNX_FEEDBACK_PARTY_ALREADY_CONSIDERING = 34; +const int NWNX_FEEDBACK_PARTY_ALREADY_INVOLVED = 35; +const int NWNX_FEEDBACK_PARTY_SENT_INVITATION = 36; +const int NWNX_FEEDBACK_PARTY_RECEIVED_INVITATION = 37; +const int NWNX_FEEDBACK_PARTY_JOINED = 38; +const int NWNX_FEEDBACK_PARTY_INVITATION_IGNORED = 39; +const int NWNX_FEEDBACK_PARTY_YOU_IGNORED_INVITATION = 40; +const int NWNX_FEEDBACK_PARTY_INVITATION_REJECTED = 41; +const int NWNX_FEEDBACK_PARTY_YOU_REJECTED_INVITATION = 42; +const int NWNX_FEEDBACK_PARTY_INVITATION_EXPIRED = 43; +const int NWNX_FEEDBACK_PARTY_LEFT_PARTY = 44; +const int NWNX_FEEDBACK_PARTY_YOU_LEFT = 45; +const int NWNX_FEEDBACK_PARTY_HENCHMAN_LIMIT = 49; +const int NWNX_FEEDBACK_PARTY_CANNOT_LEAVE_THE_ONE_PARTY = 196; +const int NWNX_FEEDBACK_PARTY_CANNOT_KICK_FROM_THE_ONE_PARTY = 197; +const int NWNX_FEEDBACK_PARTY_YOU_INVITED_NON_SINGLETON = 202; +const int NWNX_FEEDBACK_PVP_REACTION_DISLIKESYOU = 203; + +/// Item Feedback Messages +const int NWNX_FEEDBACK_ITEM_RECEIVED = 50; +const int NWNX_FEEDBACK_ITEM_LOST = 51; +const int NWNX_FEEDBACK_ITEM_EJECTED = 96; +const int NWNX_FEEDBACK_ITEM_USE_UNIDENTIFIED = 97; +const int NWNX_FEEDBACK_ITEM_GOLD_GAINED = 148; +const int NWNX_FEEDBACK_ITEM_GOLD_LOST = 149; + +/// Spell Scroll Learning +const int NWNX_FEEDBACK_LEARN_SCROLL_NOT_SCROLL = 78; +const int NWNX_FEEDBACK_LEARN_SCROLL_CANT_LEARN_CLASS = 79; +const int NWNX_FEEDBACK_LEARN_SCROLL_CANT_LEARN_LEVEL = 80; +const int NWNX_FEEDBACK_LEARN_SCROLL_CANT_LEARN_ABILITY = 81; +const int NWNX_FEEDBACK_LEARN_SCROLL_CANT_LEARN_OPPOSITION = 219; +const int NWNX_FEEDBACK_LEARN_SCROLL_CANT_LEARN_POSSESS = 220; +const int NWNX_FEEDBACK_LEARN_SCROLL_CANT_LEARN_KNOWN = 221; +const int NWNX_FEEDBACK_LEARN_SCROLL_CANT_LEARN_DIVINE = 224; +const int NWNX_FEEDBACK_LEARN_SCROLL_SUCCESS = 222; + +/// Floaty text feedback +const int NWNX_FEEDBACK_FLOATY_TEXT_STRREF = 93; +const int NWNX_FEEDBACK_FLOATY_TEXT_STRING = 94; + +/// Store feedback +const int NWNX_FEEDBACK_CANNOT_SELL_PLOT_ITEM = 99; +const int NWNX_FEEDBACK_CANNOT_SELL_CONTAINER = 100; +const int NWNX_FEEDBACK_CANNOT_SELL_ITEM = 101; +const int NWNX_FEEDBACK_NOT_ENOUGH_GOLD = 102; +const int NWNX_FEEDBACK_TRANSACTION_SUCCEEDED = 103; +const int NWNX_FEEDBACK_PRICE_TOO_HIGH = 248; +const int NWNX_FEEDBACK_STORE_NOT_ENOUGH_GOLD = 249; +const int NWNX_FEEDBACK_CANNOT_SELL_STOLEN_ITEM = 250; +const int NWNX_FEEDBACK_CANNOT_SELL_RESTRICTED_ITEM = 251; + +/// Portal control feedback +const int NWNX_FEEDBACK_PORTAL_TIMEDOUT = 104; +const int NWNX_FEEDBACK_PORTAL_INVALID = 105; + +/// Chat feedback +const int NWNX_FEEDBACK_CHAT_TELL_PLAYER_NOT_FOUND = 106; + +/// Alignment Feedback +const int NWNX_FEEDBACK_ALIGNMENT_SHIFT = 108; +const int NWNX_FEEDBACK_ALIGNMENT_PARTY_SHIFT = 111; +const int NWNX_FEEDBACK_ALIGNMENT_CHANGE = 109; +const int NWNX_FEEDBACK_ALIGNMENT_RESTRICTED_BY_CLASS_LOST = 110; +const int NWNX_FEEDBACK_ALIGNMENT_RESTRICTED_BY_CLASS_GAIN = 115; +const int NWNX_FEEDBACK_ALIGNMENT_RESTRICTED_WARNING_LOSS = 116; +const int NWNX_FEEDBACK_ALIGNMENT_RESTRICTED_WARNING_GAIN = 112; +const int NWNX_FEEDBACK_ALIGNMENT_EPITOME_GAINED = 113; +const int NWNX_FEEDBACK_ALIGNMENT_EPITOME_LOST = 114; + +/// Immunity Feedback +const int NWNX_FEEDBACK_IMMUNITY_DISEASE = 125; +const int NWNX_FEEDBACK_IMMUNITY_CRITICAL_HIT = 126; +const int NWNX_FEEDBACK_IMMUNITY_DEATH_MAGIC = 127; +const int NWNX_FEEDBACK_IMMUNITY_FEAR = 128; +const int NWNX_FEEDBACK_IMMUNITY_KNOCKDOWN = 129; +const int NWNX_FEEDBACK_IMMUNITY_PARALYSIS = 130; +const int NWNX_FEEDBACK_IMMUNITY_NEGATIVE_LEVEL = 131; +const int NWNX_FEEDBACK_IMMUNITY_MIND_SPELLS = 132; +const int NWNX_FEEDBACK_IMMUNITY_POISON = 133; +const int NWNX_FEEDBACK_IMMUNITY_SNEAK_ATTACK = 134; +const int NWNX_FEEDBACK_IMMUNITY_SLEEP = 135; +const int NWNX_FEEDBACK_IMMUNITY_DAZE = 136; +const int NWNX_FEEDBACK_IMMUNITY_CONFUSION = 137; +const int NWNX_FEEDBACK_IMMUNITY_STUN = 138; +const int NWNX_FEEDBACK_IMMUNITY_BLINDNESS = 139; +const int NWNX_FEEDBACK_IMMUNITY_DEAFNESS = 140; +const int NWNX_FEEDBACK_IMMUNITY_CURSE = 141; +const int NWNX_FEEDBACK_IMMUNITY_CHARM = 142; +const int NWNX_FEEDBACK_IMMUNITY_DOMINATE = 143; +const int NWNX_FEEDBACK_IMMUNITY_ENTANGLE = 144; +const int NWNX_FEEDBACK_IMMUNITY_SILENCE = 145; +const int NWNX_FEEDBACK_IMMUNITY_SLOW = 146; + +/// Associates +const int NWNX_FEEDBACK_ASSOCIATE_SUMMONED = 154; +const int NWNX_FEEDBACK_ASSOCIATE_UNSUMMONING = 155; +const int NWNX_FEEDBACK_ASSOCIATE_UNSUMMONING_BECAUSE_REST = 156; +const int NWNX_FEEDBACK_ASSOCIATE_UNSUMMONING_BECAUSE_DIED = 157; +const int NWNX_FEEDBACK_ASSOCIATE_DOMINATED = 158; +const int NWNX_FEEDBACK_ASSOCIATE_DOMINATION_ENDED = 159; +const int NWNX_FEEDBACK_ASSOCIATE_POSSESSED_CANNOT_RECOVER_TRAP = 170; +const int NWNX_FEEDBACK_ASSOCIATE_POSSESSED_CANNOT_BARTER = 171; +const int NWNX_FEEDBACK_ASSOCIATE_POSSESSED_CANNOT_EQUIP = 172; +const int NWNX_FEEDBACK_ASSOCIATE_POSSESSED_CANNOT_REPOSITORY_MOVE = 173; +const int NWNX_FEEDBACK_ASSOCIATE_POSSESSED_CANNOT_PICK_UP = 174; +const int NWNX_FEEDBACK_ASSOCIATE_POSSESSED_CANNOT_DROP = 175; +const int NWNX_FEEDBACK_ASSOCIATE_POSSESSED_CANNOT_UNEQUIP = 176; +const int NWNX_FEEDBACK_ASSOCIATE_POSSESSED_CANNOT_REST = 177; +const int NWNX_FEEDBACK_ASSOCIATE_POSSESSED_CANNOT_DIALOGUE = 178; +const int NWNX_FEEDBACK_ASSOCIATE_POSSESSED_CANNOT_GIVE_ITEM = 179; +const int NWNX_FEEDBACK_ASSOCIATE_POSSESSED_CANNOT_TAKE_ITEM = 180; +const int NWNX_FEEDBACK_ASSOCIATE_POSSESSED_CANNOT_USE_CONTAINER = 181; + +/// Miscellaneous Feedback +const int NWNX_FEEDBACK_SCRIPT_ERROR = 160; +const int NWNX_FEEDBACK_ACTION_LIST_OVERFLOW = 161; +const int NWNX_FEEDBACK_EFFECT_LIST_OVERFLOW = 162; +const int NWNX_FEEDBACK_AI_UPDATE_TIME_OVERFLOW = 163; +const int NWNX_FEEDBACK_ACTION_LIST_WIPE_OVERFLOW = 164; +const int NWNX_FEEDBACK_EFFECT_LIST_WIPE_OVERFLOW = 165; +const int NWNX_FEEDBACK_SEND_MESSAGE_TO_PC = 204; +const int NWNX_FEEDBACK_SEND_MESSAGE_TO_PC_STRREF = 242; + +/// Misc GUI feedback +const int NWNX_FEEDBACK_GUI_ONLY_PARTY_LEADER_MAY_CLICK = 201; +const int NWNX_FEEDBACK_PAUSED = 205; +const int NWNX_FEEDBACK_UNPAUSED = 206; +const int NWNX_FEEDBACK_REST_YOU_MAY_NOT_AT_THIS_TIME = 214; +const int NWNX_FEEDBACK_GUI_CHAR_EXPORT_REQUEST_SENT = 215; +const int NWNX_FEEDBACK_GUI_CHAR_EXPORTED_SUCCESSFULLY = 216; +const int NWNX_FEEDBACK_GUI_ERROR_CHAR_NOT_EXPORTED = 217; +const int NWNX_FEEDBACK_CAMERA_BG = 255; +const int NWNX_FEEDBACK_CAMERA_EQ = 256; +const int NWNX_FEEDBACK_CAMERA_CHASECAM = 258; + +const int NWNX_FEEDBACK_SAVING = 225; +const int NWNX_FEEDBACK_SAVE_COMPLETE = 226; +*/ +/// @} + +/// @brief Gets if feedback message is hidden. +/// @param nMessage The message identifier from @ref feedback_msgs "Feedback Messages". +/// @param oPC The PC or OBJECT_INVALID for a global setting. +/// @return TRUE if the message is hidden. +int NWNX_Feedback_GetFeedbackMessageHidden(int nMessage, object oPC = OBJECT_INVALID); + +/// @brief Sets if feedback message is hidden. +/// @param nMessage The message identifier. +/// @param isHidden TRUE/FALSE +/// @param oPC The PC or OBJECT_INVALID for a global setting. +/// @note Personal state overrides the global state which means if a global state is set +/// to TRUE but the personal state is set to FALSE, the message will be shown to the PC. +void NWNX_Feedback_SetFeedbackMessageHidden(int nMessage, int isHidden, object oPC = OBJECT_INVALID); + +/// @brief Gets if combat log message is hidden. +/// @param nMessage The message identifier from @ref combat_log_msgs "Combat Log Messages". +/// @param oPC The PC or OBJECT_INVALID for a global setting. +/// @return TRUE if the message is hidden. +int NWNX_Feedback_GetCombatLogMessageHidden(int nMessage, object oPC = OBJECT_INVALID); + +/// @brief Sets if combat log message is hidden. +/// @param nMessage The message identifier. +/// @param isHidden TRUE/FALSE +/// @param oPC The PC or OBJECT_INVALID for a global setting. +/// @note Personal state overrides the global state which means if a global state is set +/// to TRUE but the personal state is set to FALSE, the message will be shown to the PC. +void NWNX_Feedback_SetCombatLogMessageHidden(int nMessage, int isHidden, object oPC = OBJECT_INVALID); + +/// @brief Gets if the journal update message is hidden. +/// @param oPC The PC or OBJECT_INVALID for a global setting. +/// @return TRUE if the message is hidden. +int NWNX_Feedback_GetJournalUpdatedMessageHidden(object oPC = OBJECT_INVALID); + +/// @brief Sets if journal update message is hidden. +/// @param isHidden TRUE/FALSE +/// @param oPC The PC or OBJECT_INVALID for a global setting. +/// @note Personal state overrides the global state which means if a global state is set +/// to TRUE but the personal state is set to FALSE, the message will be shown to the PC. +void NWNX_Feedback_SetJournalUpdatedMessageHidden(int isHidden, object oPC = OBJECT_INVALID); + +/// @brief Set whether to use a blacklist or whitelist mode for feedback messages +/// @param bWhitelist TRUE for all messages to be hidden by default, default FALSE. +void NWNX_Feedback_SetFeedbackMessageMode(int bWhitelist); + + +/// @brief Set whether to use a blacklist or whitelist mode for combat log messages +/// @param bWhitelist TRUE for all messages to be hidden by default, default FALSE. +/// @note If using Whitelist, be sure to whitelist NWNX_FEEDBACK_COMBATLOG_FEEDBACK for feedback messages to work. +void NWNX_Feedback_SetCombatLogMessageMode(int bWhitelist); + +/// @} + +int NWNX_Feedback_GetFeedbackMessageHidden(int nMessage, object oPC = OBJECT_INVALID) +{ + string sFunc = "GetMessageHidden"; + int nMessageType = 0; + + NWNX_PushArgumentInt(NWNX_Feedback, sFunc, nMessage); + NWNX_PushArgumentInt(NWNX_Feedback, sFunc, nMessageType); + NWNX_PushArgumentObject(NWNX_Feedback, sFunc, oPC); + NWNX_CallFunction(NWNX_Feedback, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Feedback, sFunc); +} + +void NWNX_Feedback_SetFeedbackMessageHidden(int nMessage, int isHidden, object oPC = OBJECT_INVALID) +{ + string sFunc = "SetMessageHidden"; + int nMessageType = 0; + + NWNX_PushArgumentInt(NWNX_Feedback, sFunc, isHidden); + NWNX_PushArgumentInt(NWNX_Feedback, sFunc, nMessage); + NWNX_PushArgumentInt(NWNX_Feedback, sFunc, nMessageType); + NWNX_PushArgumentObject(NWNX_Feedback, sFunc, oPC); + NWNX_CallFunction(NWNX_Feedback, sFunc); +} + +int NWNX_Feedback_GetCombatLogMessageHidden(int nMessage, object oPC = OBJECT_INVALID) +{ + string sFunc = "GetMessageHidden"; + int nMessageType = 1; + + NWNX_PushArgumentInt(NWNX_Feedback, sFunc, nMessage); + NWNX_PushArgumentInt(NWNX_Feedback, sFunc, nMessageType); + NWNX_PushArgumentObject(NWNX_Feedback, sFunc, oPC); + NWNX_CallFunction(NWNX_Feedback, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Feedback, sFunc); +} + +void NWNX_Feedback_SetCombatLogMessageHidden(int nMessage, int isHidden, object oPC = OBJECT_INVALID) +{ + string sFunc = "SetMessageHidden"; + int nMessageType = 1; + + NWNX_PushArgumentInt(NWNX_Feedback, sFunc, isHidden); + NWNX_PushArgumentInt(NWNX_Feedback, sFunc, nMessage); + NWNX_PushArgumentInt(NWNX_Feedback, sFunc, nMessageType); + NWNX_PushArgumentObject(NWNX_Feedback, sFunc, oPC); + NWNX_CallFunction(NWNX_Feedback, sFunc); +} + +int NWNX_Feedback_GetJournalUpdatedMessageHidden(object oPC = OBJECT_INVALID) +{ + string sFunc = "GetMessageHidden"; + int nMessageType = 2; + + NWNX_PushArgumentInt(NWNX_Feedback, sFunc, 0); + NWNX_PushArgumentInt(NWNX_Feedback, sFunc, nMessageType); + NWNX_PushArgumentObject(NWNX_Feedback, sFunc, oPC); + NWNX_CallFunction(NWNX_Feedback, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Feedback, sFunc); +} + +void NWNX_Feedback_SetJournalUpdatedMessageHidden(int isHidden, object oPC = OBJECT_INVALID) +{ + string sFunc = "SetMessageHidden"; + int nMessageType = 2; + + NWNX_PushArgumentInt(NWNX_Feedback, sFunc, isHidden); + NWNX_PushArgumentInt(NWNX_Feedback, sFunc, 0); + NWNX_PushArgumentInt(NWNX_Feedback, sFunc, nMessageType); + NWNX_PushArgumentObject(NWNX_Feedback, sFunc, oPC); + NWNX_CallFunction(NWNX_Feedback, sFunc); +} + +void NWNX_Feedback_SetFeedbackMessageMode(int bWhitelist) +{ + string sFunc = "SetFeedbackMode"; + int nMessageType = 0; + + NWNX_PushArgumentInt(NWNX_Feedback, sFunc, bWhitelist); + NWNX_PushArgumentInt(NWNX_Feedback, sFunc, nMessageType); + NWNX_CallFunction(NWNX_Feedback, sFunc); +} + +void NWNX_Feedback_SetCombatLogMessageMode(int bWhitelist) +{ + string sFunc = "SetFeedbackMode"; + int nMessageType = 1; + + NWNX_PushArgumentInt(NWNX_Feedback, sFunc, bWhitelist); + NWNX_PushArgumentInt(NWNX_Feedback, sFunc, nMessageType); + NWNX_CallFunction(NWNX_Feedback, sFunc); +} diff --git a/gamma_age_v2/nwnx_item.nss b/gamma_age_v2/nwnx_item.nss new file mode 100644 index 00000000..ce83ef86 --- /dev/null +++ b/gamma_age_v2/nwnx_item.nss @@ -0,0 +1,207 @@ +/// @addtogroup item Item +/// @brief Functions exposing additional item properties. +/// @{ +/// @file nwnx_item.nss +#include "nwnx" + +const string NWNX_Item = "NWNX_Item"; ///< @private + +/// @brief Set an item's weight. +/// @note Will not persist through saving. +/// @param oItem The item object. +/// @param weight The weight, note this is in tenths of pounds. +void NWNX_Item_SetWeight(object oItem, int weight); + +/// @brief Set an item's base value in gold pieces. +/// @remark Total cost = base_value + additional_value. +/// @remark Equivalent to SetGoldPieceValue NWNX2 function. +/// @note Will not persist through saving. +/// @param oItem The item object. +/// @param gold The base gold value. +void NWNX_Item_SetBaseGoldPieceValue(object oItem, int gold); + +/// @brief Set an item's additional value in gold pieces. +/// @remark Total cost = base_value + additional_value. +/// @note Will persist through saving. +/// @param oItem The item object. +/// @param gold The additional gold value. +void NWNX_Item_SetAddGoldPieceValue(object oItem, int gold); + +/// @brief Get an item's base value in gold pieces. +/// @param oItem The item object. +/// @return The base gold piece value for the item. +int NWNX_Item_GetBaseGoldPieceValue(object oItem); + +/// @brief Get an item's additional value in gold pieces. +/// @param oItem The item object. +/// @return The additional gold piece value for the item. +int NWNX_Item_GetAddGoldPieceValue(object oItem); + +/// @brief Set an item's base item type. +/// @warning This will not be visible until the item is refreshed (e.g. drop and take the item, +/// or logging out and back in). +/// @param oItem The item object. +/// @param nBaseItem The new base item. +void NWNX_Item_SetBaseItemType(object oItem, int nBaseItem); + +/// @brief Make a single change to the appearance of an item. +/// @warning This will not be visible to PCs until the item is refreshed for them (e.g. by logging out and back in). +/// +/// Helmet models and simple items ignore nIndex. +/// ``` +/// nType nIndex nValue +/// ITEM_APPR_TYPE_SIMPLE_MODEL [Ignored] Model # +/// ITEM_APPR_TYPE_WEAPON_COLOR ITEM_APPR_WEAPON_COLOR_* 0-255 +/// ITEM_APPR_TYPE_WEAPON_MODEL ITEM_APPR_WEAPON_MODEL_* Model # +/// ITEM_APPR_TYPE_ARMOR_MODEL ITEM_APPR_ARMOR_MODEL_* Model # +/// ITEM_APPR_TYPE_ARMOR_COLOR ITEM_APPR_ARMOR_COLOR_* [0] 0-255 [1] +/// ``` +/// +/// [0] Where ITEM_APPR_TYPE_ARMOR_COLOR is specified, if per-part coloring is +/// desired, the following equation can be used for nIndex to achieve that: +/// +/// ITEM_APPR_ARMOR_NUM_COLORS + (ITEM_APPR_ARMOR_MODEL_ * ITEM_APPR_ARMOR_NUM_COLORS) + ITEM_APPR_ARMOR_COLOR_ +/// +/// For example, to change the CLOTH1 channel of the torso, nIndex would be: +/// +/// 6 + (7 * 6) + 2 = 50 +/// +/// [1] When specifying per-part coloring, the value 255 corresponds with the logical +/// function 'clear colour override', which clears the per-part override for that part. +void NWNX_Item_SetItemAppearance(object oItem, int nType, int nIndex, int nValue); + +/// @brief Return a string containing the entire appearance for an item. +/// @sa NWNX_Item_RestoreItemAppearance +/// @param oItem The item object. +/// @return A string representing the item's appearance. +string NWNX_Item_GetEntireItemAppearance(object oItem); + +/// @brief Restores an item's appearance using the value retrieved through NWNX_Item_GetEntireItemAppearance(). +/// @param oItem The item object. +/// @param sApp A string representing the item's appearance. +void NWNX_Item_RestoreItemAppearance(object oItem, string sApp); + +/// @brief Get an item's base armor class +/// @param oItem The item object. +/// @return The base armor class. +int NWNX_Item_GetBaseArmorClass(object oItem); + +/// @brief Get an item's minimum level required to equip. +/// @param oItem The item object. +/// @return The minimum level required to equip the item. +int NWNX_Item_GetMinEquipLevel(object oItem); + +/// @} + +void NWNX_Item_SetWeight(object oItem, int w) +{ + string sFunc = "SetWeight"; + + NWNX_PushArgumentInt(NWNX_Item, sFunc, w); + NWNX_PushArgumentObject(NWNX_Item, sFunc, oItem); + + NWNX_CallFunction(NWNX_Item, sFunc); +} + +void NWNX_Item_SetBaseGoldPieceValue(object oItem, int g) +{ + string sFunc = "SetBaseGoldPieceValue"; + + NWNX_PushArgumentInt(NWNX_Item, sFunc, g); + NWNX_PushArgumentObject(NWNX_Item, sFunc, oItem); + + NWNX_CallFunction(NWNX_Item, sFunc); +} + +void NWNX_Item_SetAddGoldPieceValue(object oItem, int g) +{ + string sFunc = "SetAddGoldPieceValue"; + + NWNX_PushArgumentInt(NWNX_Item, sFunc, g); + NWNX_PushArgumentObject(NWNX_Item, sFunc, oItem); + + NWNX_CallFunction(NWNX_Item, sFunc); +} + +int NWNX_Item_GetBaseGoldPieceValue(object oItem) +{ + string sFunc = "GetBaseGoldPieceValue"; + + NWNX_PushArgumentObject(NWNX_Item, sFunc, oItem); + + NWNX_CallFunction(NWNX_Item, sFunc); + return NWNX_GetReturnValueInt(NWNX_Item, sFunc); +} + +int NWNX_Item_GetAddGoldPieceValue(object oItem) +{ + string sFunc = "GetAddGoldPieceValue"; + + NWNX_PushArgumentObject(NWNX_Item, sFunc, oItem); + + NWNX_CallFunction(NWNX_Item, sFunc); + return NWNX_GetReturnValueInt(NWNX_Item, sFunc); +} + +void NWNX_Item_SetBaseItemType(object oItem, int nBaseItem) +{ + string sFunc = "SetBaseItemType"; + + NWNX_PushArgumentInt(NWNX_Item, sFunc, nBaseItem); + NWNX_PushArgumentObject(NWNX_Item, sFunc, oItem); + + NWNX_CallFunction(NWNX_Item, sFunc); +} + +void NWNX_Item_SetItemAppearance(object oItem, int nType, int nIndex, int nValue) +{ + string sFunc = "SetItemAppearance"; + + NWNX_PushArgumentInt(NWNX_Item, sFunc, nValue); + NWNX_PushArgumentInt(NWNX_Item, sFunc, nIndex); + NWNX_PushArgumentInt(NWNX_Item, sFunc, nType); + NWNX_PushArgumentObject(NWNX_Item, sFunc, oItem); + + NWNX_CallFunction(NWNX_Item, sFunc); + +} + +string NWNX_Item_GetEntireItemAppearance(object oItem) +{ + string sFunc = "GetEntireItemAppearance"; + + NWNX_PushArgumentObject(NWNX_Item, sFunc, oItem); + + NWNX_CallFunction(NWNX_Item, sFunc); + return NWNX_GetReturnValueString(NWNX_Item, sFunc); +} + +void NWNX_Item_RestoreItemAppearance(object oItem, string sApp) +{ + string sFunc = "RestoreItemAppearance"; + + NWNX_PushArgumentString(NWNX_Item, sFunc, sApp); + NWNX_PushArgumentObject(NWNX_Item, sFunc, oItem); + + NWNX_CallFunction(NWNX_Item, sFunc); +} + +int NWNX_Item_GetBaseArmorClass(object oItem) +{ + string sFunc = "GetBaseArmorClass"; + + NWNX_PushArgumentObject(NWNX_Item, sFunc, oItem); + + NWNX_CallFunction(NWNX_Item, sFunc); + return NWNX_GetReturnValueInt(NWNX_Item, sFunc); +} + +int NWNX_Item_GetMinEquipLevel(object oItem) +{ + string sFunc = "GetMinEquipLevel"; + + NWNX_PushArgumentObject(NWNX_Item, sFunc, oItem); + + NWNX_CallFunction(NWNX_Item, sFunc); + return NWNX_GetReturnValueInt(NWNX_Item, sFunc); +} diff --git a/gamma_age_v2/nwnx_itemprop.nss b/gamma_age_v2/nwnx_itemprop.nss new file mode 100644 index 00000000..5385c350 --- /dev/null +++ b/gamma_age_v2/nwnx_itemprop.nss @@ -0,0 +1,110 @@ +/// @addtogroup itemproperty ItemProperty +/// @brief Utility functions to manipulate the builtin itemproperty type. +/// @{ +/// @file nwnx_itemprop.nss +#include "nwnx" + +const string NWNX_ItemProperty = "NWNX_ItemProperty"; ///< @private + +/// @brief An unpacked itemproperty. +struct NWNX_IPUnpacked +{ + int nProperty; ///< @todo Describe + int nSubType; ///< @todo Describe + int nCostTable; ///< @todo Describe + int nCostTableValue; ///< @todo Describe + int nParam1; ///< @todo Describe + int nParam1Value; ///< @todo Describe + int nUsesPerDay; ///< @todo Describe + int nChanceToAppear; ///< @todo Describe + int bUsable; ///< @todo Describe + int nSpellId; ///< @todo Describe + object oCreator; ///< @todo Describe + string sTag; ///< @todo Describe +}; + +/// @brief Convert native itemproperty type to unpacked structure. +/// @param ip The itemproperty to convert. +/// @return A constructed NWNX_IPUnpacked. +struct NWNX_IPUnpacked NWNX_ItemProperty_UnpackIP(itemproperty ip); + +/// @brief Convert unpacked itemproperty structure to native type. +/// @param ip The NWNX_IPUnpacked structure to convert. +/// @return The itemproperty. +itemproperty NWNX_ItemProperty_PackIP(struct NWNX_IPUnpacked ip); + +/// @brief Gets the active item property at the index +/// @param oItem - the item with the property +/// @param nIndex - the index such as returned by some Item Events +/// @return A constructed NWNX_IPUnpacked, except for creator, and spell id. +struct NWNX_IPUnpacked NWNX_ItemProperty_GetActiveProperty(object oItem, int nIndex); + +/// @} + +struct NWNX_IPUnpacked NWNX_ItemProperty_UnpackIP(itemproperty ip) +{ + string sFunc = "UnpackIP"; + + NWNX_PushArgumentItemProperty(NWNX_ItemProperty, sFunc, ip); + NWNX_CallFunction(NWNX_ItemProperty, sFunc); + + struct NWNX_IPUnpacked n; + + n.nProperty = NWNX_GetReturnValueInt(NWNX_ItemProperty, sFunc); + n.nSubType = NWNX_GetReturnValueInt(NWNX_ItemProperty, sFunc); + n.nCostTable = NWNX_GetReturnValueInt(NWNX_ItemProperty, sFunc); + n.nCostTableValue = NWNX_GetReturnValueInt(NWNX_ItemProperty, sFunc); + n.nParam1 = NWNX_GetReturnValueInt(NWNX_ItemProperty, sFunc); + n.nParam1Value = NWNX_GetReturnValueInt(NWNX_ItemProperty, sFunc); + n.nUsesPerDay = NWNX_GetReturnValueInt(NWNX_ItemProperty, sFunc); + n.nChanceToAppear = NWNX_GetReturnValueInt(NWNX_ItemProperty, sFunc); + n.bUsable = NWNX_GetReturnValueInt(NWNX_ItemProperty, sFunc); + n.nSpellId = NWNX_GetReturnValueInt(NWNX_ItemProperty, sFunc); + n.oCreator = NWNX_GetReturnValueObject(NWNX_ItemProperty, sFunc); + n.sTag = NWNX_GetReturnValueString(NWNX_ItemProperty, sFunc); + + return n; +} +itemproperty NWNX_ItemProperty_PackIP(struct NWNX_IPUnpacked n) +{ + string sFunc = "PackIP"; + + NWNX_PushArgumentString(NWNX_ItemProperty, sFunc, n.sTag); + NWNX_PushArgumentObject(NWNX_ItemProperty, sFunc, n.oCreator); + NWNX_PushArgumentInt(NWNX_ItemProperty, sFunc, n.nSpellId); + NWNX_PushArgumentInt(NWNX_ItemProperty, sFunc, n.bUsable); + NWNX_PushArgumentInt(NWNX_ItemProperty, sFunc, n.nChanceToAppear); + NWNX_PushArgumentInt(NWNX_ItemProperty, sFunc, n.nUsesPerDay); + NWNX_PushArgumentInt(NWNX_ItemProperty, sFunc, n.nParam1Value); + NWNX_PushArgumentInt(NWNX_ItemProperty, sFunc, n.nParam1); + NWNX_PushArgumentInt(NWNX_ItemProperty, sFunc, n.nCostTableValue); + NWNX_PushArgumentInt(NWNX_ItemProperty, sFunc, n.nCostTable); + NWNX_PushArgumentInt(NWNX_ItemProperty, sFunc, n.nSubType); + NWNX_PushArgumentInt(NWNX_ItemProperty, sFunc, n.nProperty); + + NWNX_CallFunction(NWNX_ItemProperty, sFunc); + return NWNX_GetReturnValueItemProperty(NWNX_ItemProperty, sFunc); +} + +struct NWNX_IPUnpacked NWNX_ItemProperty_GetActiveProperty(object oItem, int nIndex) +{ + string sFunc = "GetActiveProperty"; + NWNX_PushArgumentInt(NWNX_ItemProperty, sFunc, nIndex); + NWNX_PushArgumentObject(NWNX_ItemProperty, sFunc, oItem); + NWNX_CallFunction(NWNX_ItemProperty, sFunc); + + struct NWNX_IPUnpacked n; + + n.nProperty = NWNX_GetReturnValueInt(NWNX_ItemProperty, sFunc); + n.nSubType = NWNX_GetReturnValueInt(NWNX_ItemProperty, sFunc); + n.nCostTable = NWNX_GetReturnValueInt(NWNX_ItemProperty, sFunc); + n.nCostTableValue = NWNX_GetReturnValueInt(NWNX_ItemProperty, sFunc); + n.nParam1 = NWNX_GetReturnValueInt(NWNX_ItemProperty, sFunc); + n.nParam1Value = NWNX_GetReturnValueInt(NWNX_ItemProperty, sFunc); + n.nUsesPerDay = NWNX_GetReturnValueInt(NWNX_ItemProperty, sFunc); + n.nChanceToAppear = NWNX_GetReturnValueInt(NWNX_ItemProperty, sFunc); + n.bUsable = NWNX_GetReturnValueInt(NWNX_ItemProperty, sFunc); + n.sTag = NWNX_GetReturnValueString(NWNX_ItemProperty, sFunc); + + return n; +} \ No newline at end of file diff --git a/gamma_age_v2/nwnx_lua.nss b/gamma_age_v2/nwnx_lua.nss new file mode 100644 index 00000000..70eb707e --- /dev/null +++ b/gamma_age_v2/nwnx_lua.nss @@ -0,0 +1,51 @@ +/// @addtogroup lua LUA +/// @brief Execute Lua code and generate events in NWScript +/// @{ +/// @file nwnx_lua.nss +#include "nwnx" + +const string NWNX_Lua = "NWNX_Lua"; ///< @private + +/// @brief Evaluate LUA code. +/// @param sCode The code to evaluate. +void NWNX_Lua_EvalVoid(string sCode); + +/// @brief Evaluate LUA code and return the output. +/// @param sCode The code to evaluate. +/// @return The result of the Lua code execution. +string NWNX_Lua_Eval(string sCode); + +/// @brief Generate events in NWScript to receive on the Lua side. +/// +/// Executes all the Lua functions registered to listen to that event in order of priority. +/// For details on events just look at the three *Event() functions in preload.lua. +void NWNX_Lua_RunEvent(string sEvent, object oObject, string sExtra=""); + +/// @} + +void NWNX_Lua_EvalVoid(string sCode) +{ + string sFunc = "EvalVoid"; + + NWNX_PushArgumentString(NWNX_Lua, sFunc, sCode); + NWNX_CallFunction(NWNX_Lua, sFunc); +} + +string NWNX_Lua_Eval(string sCode) +{ + string sFunc = "Eval"; + + NWNX_PushArgumentString(NWNX_Lua, sFunc, sCode); + NWNX_CallFunction(NWNX_Lua, sFunc); + return NWNX_GetReturnValueString(NWNX_Lua, sFunc); +} + +void NWNX_Lua_RunEvent(string sEvent, object oObject, string sExtra="") +{ + string sFunc = "RunEvent"; + + NWNX_PushArgumentString(NWNX_Lua, sFunc, sExtra); + NWNX_PushArgumentObject(NWNX_Lua, sFunc, oObject); + NWNX_PushArgumentString(NWNX_Lua, sFunc, sEvent); + NWNX_CallFunction(NWNX_Lua, sFunc); +} diff --git a/gamma_age_v2/nwnx_object.nss b/gamma_age_v2/nwnx_object.nss new file mode 100644 index 00000000..e6f4eeac --- /dev/null +++ b/gamma_age_v2/nwnx_object.nss @@ -0,0 +1,834 @@ +/// @addtogroup object Object +/// @brief Functions exposing additional object properties. +/// @{ +/// @file nwnx_object.nss +#include "nwnx" + +const string NWNX_Object = "NWNX_Object"; ///< @private + +/// @anchor object_localvar_types +/// @name Local Variable Types +/// @{ +const int NWNX_OBJECT_LOCALVAR_TYPE_UNKNOWN = 0; +const int NWNX_OBJECT_LOCALVAR_TYPE_INT = 1; +const int NWNX_OBJECT_LOCALVAR_TYPE_FLOAT = 2; +const int NWNX_OBJECT_LOCALVAR_TYPE_STRING = 3; +const int NWNX_OBJECT_LOCALVAR_TYPE_OBJECT = 4; +const int NWNX_OBJECT_LOCALVAR_TYPE_LOCATION = 5; +/// @} + +/// @anchor object_internal_types +/// @name Internal Object Types +/// @{ +const int NWNX_OBJECT_TYPE_INTERNAL_INVALID = -1; +const int NWNX_OBJECT_TYPE_INTERNAL_GUI = 1; +const int NWNX_OBJECT_TYPE_INTERNAL_TILE = 2; +const int NWNX_OBJECT_TYPE_INTERNAL_MODULE = 3; +const int NWNX_OBJECT_TYPE_INTERNAL_AREA = 4; +const int NWNX_OBJECT_TYPE_INTERNAL_CREATURE = 5; +const int NWNX_OBJECT_TYPE_INTERNAL_ITEM = 6; +const int NWNX_OBJECT_TYPE_INTERNAL_TRIGGER = 7; +const int NWNX_OBJECT_TYPE_INTERNAL_PROJECTILE = 8; +const int NWNX_OBJECT_TYPE_INTERNAL_PLACEABLE = 9; +const int NWNX_OBJECT_TYPE_INTERNAL_DOOR = 10; +const int NWNX_OBJECT_TYPE_INTERNAL_AREAOFEFFECT = 11; +const int NWNX_OBJECT_TYPE_INTERNAL_WAYPOINT = 12; +const int NWNX_OBJECT_TYPE_INTERNAL_ENCOUNTER = 13; +const int NWNX_OBJECT_TYPE_INTERNAL_STORE = 14; +const int NWNX_OBJECT_TYPE_INTERNAL_PORTAL = 15; +const int NWNX_OBJECT_TYPE_INTERNAL_SOUND = 16; +/// @} + +/// A local variable structure. +struct NWNX_Object_LocalVariable +{ + int type; ///< Int, String, Float, Object + string key; ///< Name of the variable +}; + +/// @brief Gets the count of all local variables. +/// @param obj The object. +/// @return The count. +int NWNX_Object_GetLocalVariableCount(object obj); + +/// @brief Gets the local variable at the provided index of the provided object. +/// @param obj The object. +/// @param index The index. +/// @note Index bounds: 0 >= index < NWNX_Object_GetLocalVariableCount(). +/// @note As of build 8193.14 local variables no longer have strict ordering. +/// this means that any change to the variables can result in drastically +/// different order when iterating. +/// @note As of build 8193.14, this function takes O(n) time, where n is the number +/// of locals on the object. Individual variable access with GetLocalXxx() +/// is now O(1) though. +/// @note As of build 8193.14, this function may return variable type UNKNOWN +/// if the value is the default (0/0.0/""/OBJECT_INVALID) for the type. +/// @return An NWNX_Object_LocalVariable struct. +struct NWNX_Object_LocalVariable NWNX_Object_GetLocalVariable(object obj, int index); + +/// @brief Convert an object id to the actual object. +/// @param id The object id. +/// @return An object from the provided object ID. +/// @remark This is the counterpart to ObjectToString. +/// @deprecated Use the basegame StringToObject() function. This will be removed in a future NWNX release. +object NWNX_Object_StringToObject(string id); + +/// @brief Set oObject's position. +/// @param oObject The object. +/// @param vPosition A vector position. +/// @param bUpdateSubareas If TRUE and oObject is a creature, any triggers/traps at vPosition will fire their events. +void NWNX_Object_SetPosition(object oObject, vector vPosition, int bUpdateSubareas = TRUE); + +/// @brief Get an object's hit points. +/// @note Unlike the native GetCurrentHitpoints function, this excludes temporary hitpoints. +/// @param obj The object. +/// @return The hit points. +int NWNX_Object_GetCurrentHitPoints(object obj); + +/// @brief Set an object's hit points. +/// @param obj The object. +/// @param hp The hit points. +void NWNX_Object_SetCurrentHitPoints(object obj, int hp); + +/// @brief Adjust an object's maximum hit points +/// @note Will not work on PCs. +/// @param obj The object. +/// @param hp The maximum hit points. +void NWNX_Object_SetMaxHitPoints(object obj, int hp); + +/// @brief Serialize a full object to a base64 string +/// @param obj The object. +/// @return A base64 string representation of the object. +/// @note includes locals, inventory, etc +string NWNX_Object_Serialize(object obj); + +/// @brief Deserialize the object. +/// @note The object will be created outside of the world and needs to be manually positioned at a location/inventory. +/// @param serialized The base64 string. +/// @return The object. +object NWNX_Object_Deserialize(string serialized); + +/// @brief Gets the dialog resref. +/// @param obj The object. +/// @return The name of the dialog resref. +string NWNX_Object_GetDialogResref(object obj); + +/// @brief Sets the dialog resref. +/// @param obj The object. +/// @param dialog The name of the dialog resref. +void NWNX_Object_SetDialogResref(object obj, string dialog); + +/// @brief Set oPlaceable's appearance. +/// @note Will not update for PCs until they re-enter the area. +/// @param oPlaceable The placeable. +/// @param nAppearance The appearance id. +void NWNX_Object_SetAppearance(object oPlaceable, int nAppearance); + +/// @brief Get oPlaceable's appearance. +/// @param oPlaceable The placeable. +/// @return The appearance id. +int NWNX_Object_GetAppearance(object oPlaceable); + +/// @brief Determine if an object has a visual effect. +/// @param obj The object. +/// @param nVFX The visual effect id. +/// @return TRUE if the object has the visual effect applied to it +int NWNX_Object_GetHasVisualEffect(object obj, int nVFX); + +/// @brief Check if an item can fit in an object's inventory. +/// @param obj The object with an inventory. +/// @param baseitem The base item id to check for a fit. +/// @return TRUE if an item of base item type can fit in object's inventory +int NWNX_Object_CheckFit(object obj, int baseitem); + +/// @brief Get an object's damage immunity. +/// @param obj The object. +/// @param damageType The damage type to check for immunity. Use DAMAGE_TYPE_* constants. +/// @return Damage immunity as a percentage. +int NWNX_Object_GetDamageImmunity(object obj, int damageType); + +/// @brief Add or move an object. +/// @param obj The object. +/// @param area The area. +/// @param pos The position. +void NWNX_Object_AddToArea(object obj, object area, vector pos); + +/// @brief Get placeable's static setting +/// @param obj The object. +/// @return TRUE if placeable is static. +int NWNX_Object_GetPlaceableIsStatic(object obj); + +/// @brief Set placeable as static or not. +/// @note Will not update for PCs until they re-enter the area. +/// @param obj The object. +/// @param isStatic TRUE/FALSE +void NWNX_Object_SetPlaceableIsStatic(object obj, int isStatic); + +/// @brief Gets if a door/placeable auto-removes the key after use. +/// @param obj The object. +/// @return TRUE/FALSE or -1 on error. +int NWNX_Object_GetAutoRemoveKey(object obj); + +/// @brief Sets if a door/placeable auto-removes the key after use. +/// @param obj The object. +/// @param bRemoveKey TRUE/FALSE +void NWNX_Object_SetAutoRemoveKey(object obj, int bRemoveKey); + +/// @brief Get the geometry of a trigger +/// @param oTrigger The trigger object. +/// @return A string of vertex positions. +string NWNX_Object_GetTriggerGeometry(object oTrigger); + +/// @brief Set the geometry of a trigger with a list of vertex positions +/// @param oTrigger The trigger object. +/// @param sGeometry Needs to be in the following format -> {x.x, y.y, z.z} or {x.x, y.y} +/// Example Geometry: "{1.0, 1.0, 0.0}{4.0, 1.0, 0.0}{4.0, 4.0, 0.0}{1.0, 4.0, 0.0}" +/// +/// @remark The Z position is optional and will be calculated dynamically based +/// on terrain height if it's not provided. +/// +/// @remark The minimum number of vertices is 3. +void NWNX_Object_SetTriggerGeometry(object oTrigger, string sGeometry); + +/// @brief Add an effect to an object that displays an icon and has no other effect. +/// @remark See effecticons.2da for a list of possible effect icons. +/// @param obj The object to apply the effect. +/// @param nIcon The icon id. +/// @param fDuration If specified the effect will be temporary and last this length in seconds, otherwise the effect +/// will be permanent. +void NWNX_Object_AddIconEffect(object obj, int nIcon, float fDuration=0.0); + +/// @brief Remove an icon effect from an object that was added by the NWNX_Object_AddIconEffect() function. +/// @param obj The object. +/// @param nIcon The icon id. +void NWNX_Object_RemoveIconEffect(object obj, int nIcon); + +/// @brief Export an object to the UserDirectory/nwnx folder. +/// @param sFileName The filename without extension, 16 or less characters. +/// @param oObject The object to export. Valid object types: Creature, Item, Placeable, Waypoint, Door, Store, Trigger +void NWNX_Object_Export(string sFileName, object oObject); + +/// @brief Get oObject's integer variable sVarName. +/// @param oObject The object to get the variable from. +/// @param sVarName The variable name. +/// @return The value or 0 on error. +int NWNX_Object_GetInt(object oObject, string sVarName); + +/// @brief Set oObject's integer variable sVarName to nValue. +/// @param oObject The object to set the variable on. +/// @param sVarName The variable name. +/// @param nValue The integer value to to set +/// @param bPersist When TRUE, the value is persisted to GFF, this means that it'll be saved in the .bic file of a player's character or when an object is serialized. +void NWNX_Object_SetInt(object oObject, string sVarName, int nValue, int bPersist); + +/// @brief Delete oObject's integer variable sVarName. +/// @param oObject The object to delete the variable from. +/// @param sVarName The variable name. +void NWNX_Object_DeleteInt(object oObject, string sVarName); + +/// @brief Get oObject's string variable sVarName. +/// @param oObject The object to get the variable from. +/// @param sVarName The variable name. +/// @return The value or "" on error. +string NWNX_Object_GetString(object oObject, string sVarName); + +/// @brief Set oObject's string variable sVarName to sValue. +/// @param oObject The object to set the variable on. +/// @param sVarName The variable name. +/// @param sValue The string value to to set +/// @param bPersist When TRUE, the value is persisted to GFF, this means that it'll be saved in the .bic file of a player's character or when an object is serialized. +void NWNX_Object_SetString(object oObject, string sVarName, string sValue, int bPersist); + +/// @brief Delete oObject's string variable sVarName. +/// @param oObject The object to delete the variable from. +/// @param sVarName The variable name. +void NWNX_Object_DeleteString(object oObject, string sVarName); + +/// @brief Get oObject's float variable sVarName. +/// @param oObject The object to get the variable from. +/// @param sVarName The variable name. +/// @return The value or 0.0f on error. +float NWNX_Object_GetFloat(object oObject, string sVarName); + +/// @brief Set oObject's float variable sVarName to fValue. +/// @param oObject The object to set the variable on. +/// @param sVarName The variable name. +/// @param fValue The float value to to set +/// @param bPersist When TRUE, the value is persisted to GFF, this means that it'll be saved in the .bic file of a player's character or when an object is serialized. +void NWNX_Object_SetFloat(object oObject, string sVarName, float fValue, int bPersist); + +/// @brief Delete oObject's persistent float variable sVarName. +/// @param oObject The object to delete the variable from. +/// @param sVarName The variable name. +void NWNX_Object_DeleteFloat(object oObject, string sVarName); + +/// @brief Delete any variables that match sRegex +/// @note It will only remove variables set by NWNX_Object_Set{Int|String|Float}() +/// @param oObject The object to delete the variables from. +/// @param sRegex The regular expression, for example .*Test.* removes every variable that has Test in it. +void NWNX_Object_DeleteVarRegex(object oObject, string sRegex); + +/// @brief Get if vPosition is inside oTrigger's geometry. +/// @note The Z value of vPosition is ignored. +/// @param oTrigger The trigger. +/// @param vPosition The position. +/// @return TRUE if vPosition is inside oTrigger's geometry. +int NWNX_Object_GetPositionIsInTrigger(object oTrigger, vector vPosition); + +/// @brief Gets the given object's internal type (NWNX_OBJECT_TYPE_INTERNAL_*) +/// @param oObject The object. +/// @return The object's type (NWNX_OBJECT_TYPE_INTERNAL_*) +int NWNX_Object_GetInternalObjectType(object oObject); + +/// @brief Have oObject acquire oItem. +/// @note Useful to give deserialized items to an object, may not work if oItem is already possessed by an object. +/// @param oObject The object receiving oItem, must be a Creature, Placeable, Store or Item +/// @param oItem The item. +/// @return TRUE on success. +int NWNX_Object_AcquireItem(object oObject, object oItem); + +/// @brief Cause oObject to face fDirection. +/// @note This function is almost identical to SetFacing(), the only difference being that it allows you to specify +/// the target object without the use of AssignCommand(). This is useful when you want to change the facing of an object +/// in an ExecuteScriptChunk() call where AssignCommand() does not work. +/// @param oObject The object to change its facing of +/// @param fDirection The direction the object should face +void NWNX_Object_SetFacing(object oObject, float fDirection); + +/// @brief Clear all spell effects oObject has applied to others. +/// @param oObject The object that applied the spell effects. +void NWNX_Object_ClearSpellEffectsOnOthers(object oObject); + +/// @brief Peek at the UUID of oObject without assigning one if it does not have one +/// @param oObject The object +/// @return The UUID or "" when the object does not have or cannot have an UUID +string NWNX_Object_PeekUUID(object oObject); + +/// @brief Get if oDoor has a visible model. +/// @param oDoor The door +/// @return TRUE if oDoor has a visible model +int NWNX_Object_GetDoorHasVisibleModel(object oDoor); + +/// @brief Get if oObject is destroyable. +/// @param oObject The object +/// @return TRUE if oObject is destroyable. +int NWNX_Object_GetIsDestroyable(object oObject); + +/// @brief Checks for specific spell immunity. Should only be called in spellscripts +/// @param oDefender The object defending against the spell. +/// @param oCaster The object casting the spell. +/// @return -1 if defender has no immunity, 2 if the defender is immune +int NWNX_Object_DoSpellImmunity(object oDefender, object oCaster); + +/// @brief Checks for spell school/level immunities and mantles. Should only be called in spellscripts +/// @param oDefender The object defending against the spell. +/// @param oCaster The object casting the spell. +/// @return -1 defender no immunity. 2 if immune. 3 if immune, but the immunity has a limit (example: mantles) +int NWNX_Object_DoSpellLevelAbsorption(object oDefender, object oCaster); + +/// @brief Sets if a placeable has an inventory. +/// @param obj The placeable. +/// @param bHasInventory TRUE/FALSE +/// @note Only works on placeables. +void NWNX_Object_SetHasInventory(object obj, int bHasInventory); + +/// @brief Get the current animation of oObject +/// @note The returned value will be an engine animation constant, not a NWScript ANIMATION_ constant. +/// See: https://github.com/nwnxee/unified/blob/master/NWNXLib/API/Constants/Animation.hpp +/// @param oObject The object +/// @return -1 on error or the engine animation constant +int NWNX_Object_GetCurrentAnimation(object oObject); + +/// @} + +int NWNX_Object_GetLocalVariableCount(object obj) +{ + string sFunc = "GetLocalVariableCount"; + + NWNX_PushArgumentObject(NWNX_Object, sFunc, obj); + NWNX_CallFunction(NWNX_Object, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Object, sFunc); +} + +struct NWNX_Object_LocalVariable NWNX_Object_GetLocalVariable(object obj, int index) +{ + string sFunc = "GetLocalVariable"; + + NWNX_PushArgumentInt(NWNX_Object, sFunc, index); + NWNX_PushArgumentObject(NWNX_Object, sFunc, obj); + NWNX_CallFunction(NWNX_Object, sFunc); + + struct NWNX_Object_LocalVariable var; + var.key = NWNX_GetReturnValueString(NWNX_Object, sFunc); + var.type = NWNX_GetReturnValueInt(NWNX_Object, sFunc); + return var; +} + +object NWNX_Object_StringToObject(string id) +{ + WriteTimestampedLogEntry("WARNING: NWNX_Object_StringToObject() is deprecated, please use the basegame's StringToObject()"); + + return StringToObject(id); +} + +void NWNX_Object_SetPosition(object oObject, vector vPosition, int bUpdateSubareas = TRUE) +{ + string sFunc = "SetPosition"; + + NWNX_PushArgumentInt(NWNX_Object, sFunc, bUpdateSubareas); + NWNX_PushArgumentFloat(NWNX_Object, sFunc, vPosition.x); + NWNX_PushArgumentFloat(NWNX_Object, sFunc, vPosition.y); + NWNX_PushArgumentFloat(NWNX_Object, sFunc, vPosition.z); + NWNX_PushArgumentObject(NWNX_Object, sFunc, oObject); + + NWNX_CallFunction(NWNX_Object, sFunc); +} + +int NWNX_Object_GetCurrentHitPoints(object creature) +{ + string sFunc = "GetCurrentHitPoints"; + + NWNX_PushArgumentObject(NWNX_Object, sFunc, creature); + NWNX_CallFunction(NWNX_Object, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Object, sFunc); +} + +void NWNX_Object_SetCurrentHitPoints(object creature, int hp) +{ + string sFunc = "SetCurrentHitPoints"; + + NWNX_PushArgumentInt(NWNX_Object, sFunc, hp); + NWNX_PushArgumentObject(NWNX_Object, sFunc, creature); + + NWNX_CallFunction(NWNX_Object, sFunc); +} + +void NWNX_Object_SetMaxHitPoints(object creature, int hp) +{ + string sFunc = "SetMaxHitPoints"; + + NWNX_PushArgumentInt(NWNX_Object, sFunc, hp); + NWNX_PushArgumentObject(NWNX_Object, sFunc, creature); + + NWNX_CallFunction(NWNX_Object, sFunc); +} + +string NWNX_Object_Serialize(object obj) +{ + string sFunc = "Serialize"; + + NWNX_PushArgumentObject(NWNX_Object, sFunc, obj); + + NWNX_CallFunction(NWNX_Object, sFunc); + return NWNX_GetReturnValueString(NWNX_Object, sFunc); +} + +object NWNX_Object_Deserialize(string serialized) +{ + string sFunc = "Deserialize"; + + NWNX_PushArgumentString(NWNX_Object, sFunc, serialized); + + NWNX_CallFunction(NWNX_Object, sFunc); + return NWNX_GetReturnValueObject(NWNX_Object, sFunc); +} + +string NWNX_Object_GetDialogResref(object obj) +{ + string sFunc = "GetDialogResref"; + + NWNX_PushArgumentObject(NWNX_Object, sFunc, obj); + + NWNX_CallFunction(NWNX_Object, sFunc); + return NWNX_GetReturnValueString(NWNX_Object, sFunc); +} + +void NWNX_Object_SetDialogResref(object obj, string dialog) +{ + string sFunc = "SetDialogResref"; + + NWNX_PushArgumentString(NWNX_Object, sFunc, dialog); + NWNX_PushArgumentObject(NWNX_Object, sFunc, obj); + + NWNX_CallFunction(NWNX_Object, sFunc); +} + +void NWNX_Object_SetAppearance(object oPlaceable, int nAppearance) +{ + string sFunc = "SetAppearance"; + + NWNX_PushArgumentInt(NWNX_Object, sFunc, nAppearance); + NWNX_PushArgumentObject(NWNX_Object, sFunc, oPlaceable); + + NWNX_CallFunction(NWNX_Object, sFunc); +} + +int NWNX_Object_GetAppearance(object oPlaceable) +{ + string sFunc = "GetAppearance"; + + NWNX_PushArgumentObject(NWNX_Object, sFunc, oPlaceable); + NWNX_CallFunction(NWNX_Object, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Object, sFunc); +} + +int NWNX_Object_GetHasVisualEffect(object obj, int nVFX) +{ + string sFunc = "GetHasVisualEffect"; + + NWNX_PushArgumentInt(NWNX_Object, sFunc, nVFX); + NWNX_PushArgumentObject(NWNX_Object, sFunc, obj); + + NWNX_CallFunction(NWNX_Object, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Object, sFunc); +} + +int NWNX_Object_CheckFit(object obj, int baseitem) +{ + string sFunc = "CheckFit"; + + NWNX_PushArgumentInt(NWNX_Object, sFunc, baseitem); + NWNX_PushArgumentObject(NWNX_Object, sFunc, obj); + + NWNX_CallFunction(NWNX_Object, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Object, sFunc); +} + +int NWNX_Object_GetDamageImmunity(object obj, int damageType) +{ + string sFunc = "GetDamageImmunity"; + + NWNX_PushArgumentInt(NWNX_Object, sFunc, damageType); + NWNX_PushArgumentObject(NWNX_Object, sFunc, obj); + + NWNX_CallFunction(NWNX_Object, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Object, sFunc); +} + +void NWNX_Object_AddToArea(object obj, object area, vector pos) +{ + string sFunc = "AddToArea"; + + NWNX_PushArgumentFloat(NWNX_Object, sFunc, pos.z); + NWNX_PushArgumentFloat(NWNX_Object, sFunc, pos.y); + NWNX_PushArgumentFloat(NWNX_Object, sFunc, pos.x); + NWNX_PushArgumentObject(NWNX_Object, sFunc, area); + NWNX_PushArgumentObject(NWNX_Object, sFunc, obj); + NWNX_CallFunction(NWNX_Object, sFunc); +} + +int NWNX_Object_GetPlaceableIsStatic(object obj) +{ + string sFunc = "GetPlaceableIsStatic"; + + NWNX_PushArgumentObject(NWNX_Object, sFunc, obj); + + NWNX_CallFunction(NWNX_Object, sFunc); + return NWNX_GetReturnValueInt(NWNX_Object, sFunc); +} + +void NWNX_Object_SetPlaceableIsStatic(object obj, int isStatic) +{ + string sFunc = "SetPlaceableIsStatic"; + + NWNX_PushArgumentInt(NWNX_Object, sFunc, isStatic); + NWNX_PushArgumentObject(NWNX_Object, sFunc, obj); + + NWNX_CallFunction(NWNX_Object, sFunc); +} + +int NWNX_Object_GetAutoRemoveKey(object obj) +{ + string sFunc = "GetAutoRemoveKey"; + + NWNX_PushArgumentObject(NWNX_Object, sFunc, obj); + NWNX_CallFunction(NWNX_Object, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Object, sFunc); +} + +void NWNX_Object_SetAutoRemoveKey(object obj, int bRemoveKey) +{ + string sFunc = "SetAutoRemoveKey"; + + NWNX_PushArgumentInt(NWNX_Object, sFunc, bRemoveKey); + NWNX_PushArgumentObject(NWNX_Object, sFunc, obj); + + NWNX_CallFunction(NWNX_Object, sFunc); +} + +string NWNX_Object_GetTriggerGeometry(object oTrigger) +{ + string sFunc = "GetTriggerGeometry"; + + NWNX_PushArgumentObject(NWNX_Object, sFunc, oTrigger); + NWNX_CallFunction(NWNX_Object, sFunc); + + return NWNX_GetReturnValueString(NWNX_Object, sFunc); +} + +void NWNX_Object_SetTriggerGeometry(object oTrigger, string sGeometry) +{ + string sFunc = "SetTriggerGeometry"; + + NWNX_PushArgumentString(NWNX_Object, sFunc, sGeometry); + NWNX_PushArgumentObject(NWNX_Object, sFunc, oTrigger); + NWNX_CallFunction(NWNX_Object, sFunc); +} + +void NWNX_Object_AddIconEffect(object obj, int nIcon, float fDuration=0.0) +{ + string sFunc = "AddIconEffect"; + + NWNX_PushArgumentFloat(NWNX_Object, sFunc, fDuration); + NWNX_PushArgumentInt(NWNX_Object, sFunc, nIcon); + NWNX_PushArgumentObject(NWNX_Object, sFunc, obj); + NWNX_CallFunction(NWNX_Object, sFunc); +} + +void NWNX_Object_RemoveIconEffect(object obj, int nIcon) +{ + string sFunc = "RemoveIconEffect"; + + NWNX_PushArgumentInt(NWNX_Object, sFunc, nIcon); + NWNX_PushArgumentObject(NWNX_Object, sFunc, obj); + NWNX_CallFunction(NWNX_Object, sFunc); +} + +void NWNX_Object_Export(string sFileName, object oObject) +{ + string sFunc = "Export"; + + NWNX_PushArgumentObject(NWNX_Object, sFunc, oObject); + NWNX_PushArgumentString(NWNX_Object, sFunc, sFileName); + NWNX_CallFunction(NWNX_Object, sFunc); +} + +int NWNX_Object_GetInt(object oObject, string sVarName) +{ + string sFunc = "GetInt"; + + NWNX_PushArgumentString(NWNX_Object, sFunc, sVarName); + NWNX_PushArgumentObject(NWNX_Object, sFunc, oObject); + NWNX_CallFunction(NWNX_Object, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Object, sFunc); +} + +void NWNX_Object_SetInt(object oObject, string sVarName, int nValue, int bPersist) +{ + string sFunc = "SetInt"; + + NWNX_PushArgumentInt(NWNX_Object, sFunc, bPersist); + NWNX_PushArgumentInt(NWNX_Object, sFunc, nValue); + NWNX_PushArgumentString(NWNX_Object, sFunc, sVarName); + NWNX_PushArgumentObject(NWNX_Object, sFunc, oObject); + NWNX_CallFunction(NWNX_Object, sFunc); +} + +void NWNX_Object_DeleteInt(object oObject, string sVarName) +{ + string sFunc = "DeleteInt"; + + NWNX_PushArgumentString(NWNX_Object, sFunc, sVarName); + NWNX_PushArgumentObject(NWNX_Object, sFunc, oObject); + NWNX_CallFunction(NWNX_Object, sFunc); +} + +string NWNX_Object_GetString(object oObject, string sVarName) +{ + string sFunc = "GetString"; + + NWNX_PushArgumentString(NWNX_Object, sFunc, sVarName); + NWNX_PushArgumentObject(NWNX_Object, sFunc, oObject); + NWNX_CallFunction(NWNX_Object, sFunc); + + return NWNX_GetReturnValueString(NWNX_Object, sFunc); +} + +void NWNX_Object_SetString(object oObject, string sVarName, string sValue, int bPersist) +{ + string sFunc = "SetString"; + + NWNX_PushArgumentInt(NWNX_Object, sFunc, bPersist); + NWNX_PushArgumentString(NWNX_Object, sFunc, sValue); + NWNX_PushArgumentString(NWNX_Object, sFunc, sVarName); + NWNX_PushArgumentObject(NWNX_Object, sFunc, oObject); + NWNX_CallFunction(NWNX_Object, sFunc); +} + +void NWNX_Object_DeleteString(object oObject, string sVarName) +{ + string sFunc = "DeleteString"; + + NWNX_PushArgumentString(NWNX_Object, sFunc, sVarName); + NWNX_PushArgumentObject(NWNX_Object, sFunc, oObject); + NWNX_CallFunction(NWNX_Object, sFunc); +} + +float NWNX_Object_GetFloat(object oObject, string sVarName) +{ + string sFunc = "GetFloat"; + + NWNX_PushArgumentString(NWNX_Object, sFunc, sVarName); + NWNX_PushArgumentObject(NWNX_Object, sFunc, oObject); + NWNX_CallFunction(NWNX_Object, sFunc); + + return NWNX_GetReturnValueFloat(NWNX_Object, sFunc); +} + +void NWNX_Object_SetFloat(object oObject, string sVarName, float fValue, int bPersist) +{ + string sFunc = "SetFloat"; + + NWNX_PushArgumentInt(NWNX_Object, sFunc, bPersist); + NWNX_PushArgumentFloat(NWNX_Object, sFunc, fValue); + NWNX_PushArgumentString(NWNX_Object, sFunc, sVarName); + NWNX_PushArgumentObject(NWNX_Object, sFunc, oObject); + NWNX_CallFunction(NWNX_Object, sFunc); +} + +void NWNX_Object_DeleteFloat(object oObject, string sVarName) +{ + string sFunc = "DeleteFloat"; + + NWNX_PushArgumentString(NWNX_Object, sFunc, sVarName); + NWNX_PushArgumentObject(NWNX_Object, sFunc, oObject); + NWNX_CallFunction(NWNX_Object, sFunc); +} + +void NWNX_Object_DeleteVarRegex(object oObject, string sRegex) +{ + string sFunc = "DeleteVarRegex"; + + NWNX_PushArgumentString(NWNX_Object, sFunc, sRegex); + NWNX_PushArgumentObject(NWNX_Object, sFunc, oObject); + NWNX_CallFunction(NWNX_Object, sFunc); +} + +int NWNX_Object_GetPositionIsInTrigger(object oTrigger, vector vPosition) +{ + string sFunc = "GetPositionIsInTrigger"; + + NWNX_PushArgumentFloat(NWNX_Object, sFunc, vPosition.z); + NWNX_PushArgumentFloat(NWNX_Object, sFunc, vPosition.y); + NWNX_PushArgumentFloat(NWNX_Object, sFunc, vPosition.x); + NWNX_PushArgumentObject(NWNX_Object, sFunc, oTrigger); + NWNX_CallFunction(NWNX_Object, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Object, sFunc); +} + +int NWNX_Object_GetInternalObjectType(object oObject) +{ + string sFunc = "GetInternalObjectType"; + + NWNX_PushArgumentObject(NWNX_Object, sFunc, oObject); + NWNX_CallFunction(NWNX_Object, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Object, sFunc); +} + +int NWNX_Object_AcquireItem(object oObject, object oItem) +{ + string sFunc = "AcquireItem"; + + NWNX_PushArgumentObject(NWNX_Object, sFunc, oItem); + NWNX_PushArgumentObject(NWNX_Object, sFunc, oObject); + NWNX_CallFunction(NWNX_Object, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Object, sFunc); +} + +void NWNX_Object_SetFacing(object oObject, float fDirection) +{ + string sFunc = "SetFacing"; + + NWNX_PushArgumentFloat(NWNX_Object, sFunc, fDirection); + NWNX_PushArgumentObject(NWNX_Object, sFunc, oObject); + NWNX_CallFunction(NWNX_Object, sFunc); +} + +void NWNX_Object_ClearSpellEffectsOnOthers(object oObject) +{ + string sFunc = "ClearSpellEffectsOnOthers"; + + NWNX_PushArgumentObject(NWNX_Object, sFunc, oObject); + NWNX_CallFunction(NWNX_Object, sFunc); +} + +string NWNX_Object_PeekUUID(object oObject) +{ + string sFunc = "PeekUUID"; + + NWNX_PushArgumentObject(NWNX_Object, sFunc, oObject); + NWNX_CallFunction(NWNX_Object, sFunc); + + return NWNX_GetReturnValueString(NWNX_Object, sFunc); +} + +int NWNX_Object_GetDoorHasVisibleModel(object oDoor) +{ + string sFunc = "GetDoorHasVisibleModel"; + + NWNX_PushArgumentObject(NWNX_Object, sFunc, oDoor); + NWNX_CallFunction(NWNX_Object, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Object, sFunc); +} + +int NWNX_Object_GetIsDestroyable(object oObject) +{ + string sFunc = "GetIsDestroyable"; + + NWNX_PushArgumentObject(NWNX_Object, sFunc, oObject); + NWNX_CallFunction(NWNX_Object, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Object, sFunc); +} + +int NWNX_Object_DoSpellImmunity(object oDefender, object oCaster) +{ + string sFunc = "DoSpellImmunity"; + NWNX_PushArgumentObject(NWNX_Object, sFunc, oCaster); + NWNX_PushArgumentObject(NWNX_Object, sFunc, oDefender); + NWNX_CallFunction(NWNX_Object, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Object,sFunc); +} + +int NWNX_Object_DoSpellLevelAbsorption(object oDefender, object oCaster) +{ + string sFunc = "DoSpellLevelAbsorption"; + NWNX_PushArgumentObject(NWNX_Object, sFunc, oCaster); + NWNX_PushArgumentObject(NWNX_Object, sFunc, oDefender); + NWNX_CallFunction(NWNX_Object, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Object,sFunc); +} + +void NWNX_Object_SetHasInventory(object obj, int bHasInventory) +{ + string sFunc = "SetHasInventory"; + + NWNX_PushArgumentInt(NWNX_Object, sFunc, bHasInventory); + NWNX_PushArgumentObject(NWNX_Object, sFunc, obj); + + NWNX_CallFunction(NWNX_Object, sFunc); +} + +int NWNX_Object_GetCurrentAnimation(object oObject) +{ + string sFunc = "GetCurrentAnimation"; + + NWNX_PushArgumentObject(NWNX_Object, sFunc, oObject); + NWNX_CallFunction(NWNX_Object, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Object, sFunc); +} diff --git a/gamma_age_v2/nwnx_player.nss b/gamma_age_v2/nwnx_player.nss new file mode 100644 index 00000000..60c4a1c1 --- /dev/null +++ b/gamma_age_v2/nwnx_player.nss @@ -0,0 +1,963 @@ +/// @addtogroup player +/// @brief Functions exposing additional player properties. +/// @{ +/// @file nwnx_player.nss +#include "nwnx" + +const string NWNX_Player = "NWNX_Player"; ///< @private + +/// @brief A quickbar slot. +struct NWNX_Player_QuickBarSlot +{ + object oItem; ///< @todo Describe + object oSecondaryItem; ///< @todo Describe + int nObjectType; ///< @todo Describe + int nMultiClass; ///< @todo Describe + string sResRef; ///< @todo Describe + string sCommandLabel; ///< @todo Describe + string sCommandLine; ///< @todo Describe + string sToolTip; ///< @todo Describe + int nINTParam1; ///< @todo Describe + int nMetaType; ///< @todo Describe + int nDomainLevel; ///< @todo Describe + int nAssociateType; ///< @todo Describe + object oAssociate; ///< @todo Describe +}; + +/// @brief A journal entry. +struct NWNX_Player_JournalEntry +{ + string sName;///< @todo Describe + string sText;///< @todo Describe + string sTag;///< @todo Describe + int nState;///< @todo Describe + int nPriority;///< @todo Describe + int nQuestCompleted;///< @todo Describe + int nQuestDisplayed;///< @todo Describe + int nUpdated;///< @todo Describe + int nCalendarDay;///< @todo Describe + int nTimeOfDay;///< @todo Describe +}; + + +/// @name Timing Bar Types +/// @anchor timing_bar_types +/// +/// The various types of timing bars. +/// @{ +const int NWNX_PLAYER_TIMING_BAR_TRAP_FLAG = 1; +const int NWNX_PLAYER_TIMING_BAR_TRAP_RECOVER = 2; +const int NWNX_PLAYER_TIMING_BAR_TRAP_DISARM = 3; +const int NWNX_PLAYER_TIMING_BAR_TRAP_EXAMINE = 4; +const int NWNX_PLAYER_TIMING_BAR_TRAP_SET = 5; +const int NWNX_PLAYER_TIMING_BAR_REST = 6; +const int NWNX_PLAYER_TIMING_BAR_UNLOCK = 7; +const int NWNX_PLAYER_TIMING_BAR_LOCK = 8; +const int NWNX_PLAYER_TIMING_BAR_CUSTOM = 10; +/// @} + +/// @name Platform IDs +/// @anchor platform_ids +/// @{ +const int NWNX_PLAYER_PLATFORM_INVALID = 0; +const int NWNX_PLAYER_PLATFORM_WINDOWS_X86 = 1; +const int NWNX_PLAYER_PLATFORM_WINDOWS_X64 = 2; +const int NWNX_PLAYER_PLATFORM_LINUX_X86 = 10; +const int NWNX_PLAYER_PLATFORM_LINUX_X64 = 11; +const int NWNX_PLAYER_PLATFORM_LINUX_ARM32 = 12; +const int NWNX_PLAYER_PLATFORM_LINUX_ARM64 = 13; +const int NWNX_PLAYER_PLATFORM_MAC_X86 = 20; +const int NWNX_PLAYER_PLATFORM_MAC_X64 = 21; +const int NWNX_PLAYER_PLATFORM_IOS = 30; +const int NWNX_PLAYER_PLATFORM_ANDROID_ARM32 = 40; +const int NWNX_PLAYER_PLATFORM_ANDROID_ARM64 = 41; +const int NWNX_PLAYER_PLATFORM_ANDROID_X64 = 42; +const int NWNX_PLAYER_PLATFORM_NINTENDO_SWITCH = 50; +const int NWNX_PLAYER_PLATFORM_MICROSOFT_XBOXONE = 60; +const int NWNX_PLAYER_PLATFORM_SONY_PS4 = 70; +/// @} + +/// @brief Force display placeable examine window for player +/// @note If used on a placeable in a different area than the player, the portait will not be shown. +/// @param player The player object. +/// @param placeable The placeable object. +void NWNX_Player_ForcePlaceableExamineWindow(object player, object placeable); + +/// @brief Force opens the target object's inventory for the player. +/// @note +/// * If the placeable is in a different area than the player, the portrait will not be shown +/// * The placeable's open/close animations will be played +/// * Clicking the 'close' button will cause the player to walk to the placeable If the placeable is in a +/// different area, the player will just walk to the edge of the current area and stop. +/// This action can be cancelled manually. +/// * Walking will close the placeable automatically. +/// @param player The player object. +/// @param placeable The placeable object. +void NWNX_Player_ForcePlaceableInventoryWindow(object player, object placeable); + +/// @brief Starts displaying a timing bar. +/// @param player The player object. +/// @param seconds The length of time the timing bar will complete. +/// @param script The script to run at the bar's completion. +/// @param type The @ref timing_bar_types "Timing Bar Type" +/// @remark Only one timing bar can be ran at the same time. +void NWNX_Player_StartGuiTimingBar(object player, float seconds, string script = "", int type = NWNX_PLAYER_TIMING_BAR_CUSTOM); + +/// @brief Stop displaying a timing bar. +/// @param player The player object. +/// @param script The script to run when stopped. +void NWNX_Player_StopGuiTimingBar(object player, string script = ""); + +/// @brief Sets whether the player should always walk when given movement commands. +/// @param player The player object. +/// @param bWalk TRUE to set the player to always walk. +/// @remark Clicking on the ground or using WASD will trigger walking instead of running. +void NWNX_Player_SetAlwaysWalk(object player, int bWalk=TRUE); + +/// @brief Gets the player's quickbar slot info +/// @param player The player object. +/// @param slot Slot ID 0-35 +/// @return An NWNX_Player_QuickBarSlot struct. +struct NWNX_Player_QuickBarSlot NWNX_Player_GetQuickBarSlot(object player, int slot); + +/// @brief Sets the player's quickbar slot info +/// @param player The player object. +/// @param slot Slot ID 0-35 +/// @param qbs An NWNX_Player_QuickBarSlot struct. +void NWNX_Player_SetQuickBarSlot(object player, int slot, struct NWNX_Player_QuickBarSlot qbs); + +/// @brief Get the name of the .bic file associated with the player's character. +/// @param player The player object. +/// @return The filename for this player's bic. (Not including the ".bic") +string NWNX_Player_GetBicFileName(object player); + +/// @brief Plays the VFX at the target position in current area for the given player only +/// @param player The player object. +/// @param effectId The effect id. +/// @param position The position to play the visual effect. +void NWNX_Player_ShowVisualEffect(object player, int effectId, vector position); + +/// @brief Changes the daytime music track for the given player only +/// @param player The player object. +/// @param track The track id to play. +void NWNX_Player_MusicBackgroundChangeDay(object player, int track); + +/// @brief Changes the nighttime music track for the given player only +/// @param player The player object. +/// @param track The track id to play. +void NWNX_Player_MusicBackgroundChangeNight(object player, int track); + +/// @brief Starts the background music for the given player only +/// @param player The player object. +void NWNX_Player_MusicBackgroundStart(object player); + +/// @brief Stops the background music for the given player only +/// @param player The player object. +void NWNX_Player_MusicBackgroundStop(object player); + +/// @brief Changes the battle music track for the given player only +/// @param player The player object. +/// @param track The track id to play. +void NWNX_Player_MusicBattleChange(object player, int track); + +/// @brief Starts the battle music for the given player only +/// @param player The player object. +void NWNX_Player_MusicBattleStart(object player); + +/// @brief Stops the battle music for the given player only +/// @param player The player object. +void NWNX_Player_MusicBattleStop(object player); + +/// @brief Play a sound at the location of target for the given player only +/// @param player The player object. +/// @param sound The sound resref. +/// @param target The target object for the sound to originate. If target OBJECT_INVALID the sound +/// will play at the location of the player. +void NWNX_Player_PlaySound(object player, string sound, object target = OBJECT_INVALID); + +/// @brief Toggle a placeable's usable flag for the given player only +/// @param player The player object. +/// @param placeable The placeable object. +/// @param usable TRUE for usable. +void NWNX_Player_SetPlaceableUsable(object player, object placeable, int usable); + +/// @brief Override player's rest duration +/// @param player The player object. +/// @param duration The duration of rest in milliseconds, 1000 = 1 second. Minimum duration of 10ms. -1 clears the override. +void NWNX_Player_SetRestDuration(object player, int duration); + +/// @brief Apply visualeffect to target that only player can see +/// @param player The player object. +/// @param target The target object to play the effect upon. +/// @param visualeffect The visual effect id. +/// @note Only works with instant effects: VFX_COM_*, VFX_FNF_*, VFX_IMP_* +void NWNX_Player_ApplyInstantVisualEffectToObject(object player, object target, int visualeffect); + +/// @brief Refreshes the players character sheet +/// @param player The player object. +/// @note You may need to use DelayCommand if you're manipulating values +/// through nwnx and forcing a UI refresh, 0.5s seemed to be fine +void NWNX_Player_UpdateCharacterSheet(object player); + +/// @brief Allows player to open target's inventory +/// @param player The player object. +/// @param target The target object, must be a creature or another player. +/// @param open TRUE to open. +/// @remark Only works if player and target are in the same area. +void NWNX_Player_OpenInventory(object player, object target, int open = TRUE); + +/// @brief Get player's area exploration state +/// @param player The player object. +/// @param area The area object. +/// @return A string representation of the tiles explored for that area. +string NWNX_Player_GetAreaExplorationState(object player, object area); + +/// @brief Set player's area exploration state. +/// @param player The player object. +/// @param area The area object. +/// @param str An encoded string obtained with NWNX_Player_GetAreaExplorationState() +void NWNX_Player_SetAreaExplorationState(object player, object area, string str); + +/// @brief Override player's rest animation. +/// @param oPlayer The player object. +/// @param nAnimation The NWNX animation id. This does not take ANIMATION_LOOPING_* or +/// ANIMATION_FIREFORGET_* constants. Instead use NWNX_Consts_TranslateNWScriptAnimation() to get +/// the NWNX equivalent. -1 to clear the override. +void NWNX_Player_SetRestAnimation(object oPlayer, int nAnimation); + +/// @brief Override a visual transform on the given object that only player will see. +/// @param oPlayer The player object. +/// @param oObject The target object. Can be any valid Creature, Placeable, Item or Door. +/// @param nTransform One of OBJECT_VISUAL_TRANSFORM_* or -1 to remove the override. +/// @param fValue Depends on the transformation to apply. +void NWNX_Player_SetObjectVisualTransformOverride(object oPlayer, object oObject, int nTransform, float fValue); + +/// @brief Apply a looping visualeffect to a target that only player can see +/// @param player The player object. +/// @param target The target object. +/// @param visualeffect A VFX_DUR_*. Calling again will remove an applied effect. -1 to remove all effects +/// @note Only really works with looping effects: VFX_DUR_*. Other types *kind* of work, they'll play when +/// reentering the area and the object is in view or when they come back in view range. +void NWNX_Player_ApplyLoopingVisualEffectToObject(object player, object target, int visualeffect); + +/// @brief Override the name of placeable for player only +/// @param player The player object. +/// @param placeable The placeable object. +/// @param name The name for the placeable for this player, "" to clear the override. +void NWNX_Player_SetPlaceableNameOverride(object player, object placeable, string name); + +/// @brief Gets whether a quest has been completed by a player +/// @param player The player object. +/// @param sQuestName The name identifier of the quest from the Journal Editor. +/// @return TRUE if the quest has been completed. -1 if the player does not have the journal entry. +int NWNX_Player_GetQuestCompleted(object player, string sQuestName); + +/// @brief Place waypoints on module load representing where a PC should start +/// +/// This will require storing the PC's cd key or community name (depending on how you store in your vault) +/// and bic_filename along with routinely updating their location in some persistent method like OnRest, +/// OnAreaEnter and OnClentExit. +/// +/// @param sCDKeyOrCommunityName The Public CD Key or Community Name of the player, this will depend on your vault type. +/// @param sBicFileName The filename for the character. Retrieved with NWNX_Player_GetBicFileName(). +/// @param oWP The waypoint object to place where the PC should start. +/// @param bFirstConnectOnly Set to FALSE if you would like the PC to go to this location every time they login instead +/// of just every server restart. +void NWNX_Player_SetPersistentLocation(string sCDKeyOrCommunityName, string sBicFileName, object oWP, int bFirstConnectOnly = TRUE); + +/// @brief Force an item name to be updated. +/// @note This is a workaround for bug that occurs when updating item names in open containers. +/// @param oPlayer The player object. +/// @param oItem The item object. +void NWNX_Player_UpdateItemName(object oPlayer, object oItem); + +/// @brief Possesses a creature by temporarily making them a familiar +/// @details This command allows a PC to possess an NPC by temporarily adding them as a familiar. It will work +/// if the player already has an existing familiar. The creatures must be in the same area. Unpossession can be +/// done with the regular @nwn{UnpossessFamiliar} commands. +/// @note The possessed creature will send automap data back to the possessor. +/// If you wish to prevent this you may wish to use NWNX_Player_GetAreaExplorationState() and +/// NWNX_Player_SetAreaExplorationState() before and after the possession. +/// @note The possessing creature will be left wherever they were when beginning the possession. You may wish +/// to use @nwn{EffectCutsceneImmobilize} and @nwn{EffectCutsceneGhost} to hide them. +/// @param oPossessor The possessor player object. +/// @param oPossessed The possessed creature object. Only works on NPCs. +/// @param bMindImmune If FALSE will remove the mind immunity effect on the possessor. +/// @param bCreateDefaultQB If TRUE will populate the quick bar with default buttons. +/// @return TRUE if possession succeeded. +int NWNX_Player_PossessCreature(object oPossessor, object oPossessed, int bMindImmune = TRUE, int bCreateDefaultQB = FALSE); + +/// @brief Returns the platform ID of the given player (NWNX_PLAYER_PLATFORM_*) +/// @param oPlayer The player object. +int NWNX_Player_GetPlatformId(object oPlayer); + +/// @brief Returns the game language of the given player (uses NWNX_DIALOG_LANGUAGE_*) +/// @details This function returns the ID of the game language displayed to the player. +/// Uses the same constants as nwnx_dialog. +/// @param oPlayer The player object. +int NWNX_Player_GetLanguage(object oPlayer); + +/// @brief Override sOldResName with sNewResName of nResType for oPlayer. +/// @warning If sNewResName does not exist on oPlayer's client it will crash their game. +/// @param oPlayer The player object. +/// @param nResType The res type, see nwnx_util.nss for constants. +/// @param sOldResName The old res name, 16 characters or less. +/// @param sNewResName The new res name or "" to clear a previous override, 16 characters or less. +void NWNX_Player_SetResManOverride(object oPlayer, int nResType, string sOldResName, string sNewResName); + +/// @brief Set nCustomTokenNumber to sTokenValue for oPlayer only. +/// @note The basegame SetCustomToken() will override any personal tokens. +/// @param oPlayer The player object. +/// @param nCustomTokenNumber The token number. +/// @param sTokenValue The token text. +void NWNX_Player_SetCustomToken(object oPlayer, int nCustomTokenNumber, string sTokenValue); + +/// @brief Override the name of creature for player only +/// @param oPlayer The player object. +/// @param oCreature The creature object. +/// @param sName The name for the creature for this player, "" to clear the override. +void NWNX_Player_SetCreatureNameOverride(object oPlayer, object oCreature, string sName); + +/// @brief Display floaty text above oCreature for oPlayer only. +/// @note This will also display the floaty text above creatures that are not part of oPlayer's faction. +/// @param oPlayer The player to display the text to. +/// @param oCreature The creature to display the text above. +/// @param sText The text to display. +void NWNX_Player_FloatingTextStringOnCreature(object oPlayer, object oCreature, string sText); + +/// @brief Toggle oPlayer's PlayerDM status. +/// @note This function does nothing for actual DMClient DMs or players with a client version < 8193.14 +/// @param oPlayer The player. +/// @param bIsDM TRUE to toggle dm mode on, FALSE for off. +void NWNX_Player_ToggleDM(object oPlayer, int bIsDM); + +/// @brief Override the mouse cursor of oObject for oPlayer only +/// @param oPlayer The player object. +/// @param oObject The object. +/// @param nCursor The cursor, one of MOUSECURSOR_*. -1 to clear the override. +void NWNX_Player_SetObjectMouseCursorOverride(object oPlayer, object oObject, int nCursor); + +/// @brief Override the hilite color of oObject for oPlayer only +/// @param oPlayer The player object. +/// @param oObject The object. +/// @param nColor The color in 0xRRGGBB format, -1 to clear the override. +void NWNX_Player_SetObjectHiliteColorOverride(object oPlayer, object oObject, int nColor); + +/// @brief Remove effects with sEffectTag from oPlayer's TURD +/// @note This function should be called in the NWNX_ON_CLIENT_DISCONNECT_AFTER event, OnClientLeave is too early for the TURD to exist. +/// @param oPlayer The player object. +/// @param sEffectTag The effect tag. +void NWNX_Player_RemoveEffectFromTURD(object oPlayer, string sEffectTag); + +/// @brief Set the location oPlayer will spawn when logging in to the server. +/// @note This function is best called in the NWNX_ON_ELC_VALIDATE_CHARACTER_BEFORE event, OnClientEnter will be too late. +/// @param oPlayer The player object. +/// @param locSpawn The location. +void NWNX_Player_SetSpawnLocation(object oPlayer, location locSpawn); + +/// @brief Resends palettes to a DM. +/// @param oPlayer - the DM to send them to. +void NWNX_Player_SendDMAllCreatorLists(object oPlayer); + +/// @brief Give a custom journal entry to oPlayer. +/// @warning Custom entries are wiped on client enter - they must be reapplied. +/// @param oPlayer The player object. +/// @param journalEntry The journal entry in the form of a struct. +/// @param nSilentUpdate 0 = Notify player via sound effects and feedback message, 1 = Suppress sound effects and feedback message +/// @return a positive number to indicate the new amount of journal entries on the player. +/// @note In contrast to conventional nwn journal entries - this method will overwrite entries with the same tag, so the index / count of entries +/// will only increase if you add new entries with unique tags +int NWNX_Player_AddCustomJournalEntry(object oPlayer, struct NWNX_Player_JournalEntry journalEntry, int nSilentUpdate = 0); + +/// @brief Returns a struct containing a journal entry that can then be modified. +/// @param oPlayer The player object. +/// @param questTag The quest tag you wish to get the journal entry for. +/// @return a struct containing the journal entry data. +/// @note This method will return -1 for the Updated field in the event that no matching journal entry was found, +/// only the last matching quest tag will be returned. Eg: If you add 3 journal updates to a player, only the 3rd one will be returned as +/// that is the active one that the player currently sees. +struct NWNX_Player_JournalEntry NWNX_Player_GetJournalEntry(object oPlayer, string questTag); + +/// @brief Closes any store oPlayer may have open. +/// @param oPlayer The player object. +void NWNX_Player_CloseStore(object oPlayer); + +/// @} + +void NWNX_Player_ForcePlaceableExamineWindow(object player, object placeable) +{ + string sFunc = "ForcePlaceableExamineWindow"; + + NWNX_PushArgumentObject(NWNX_Player, sFunc, placeable); + NWNX_PushArgumentObject(NWNX_Player, sFunc, player); + + NWNX_CallFunction(NWNX_Player, sFunc); +} + +void NWNX_Player_ForcePlaceableInventoryWindow(object player, object placeable) +{ + string sFunc = "ForcePlaceableInventoryWindow"; + + NWNX_PushArgumentObject(NWNX_Player, sFunc, placeable); + NWNX_PushArgumentObject(NWNX_Player, sFunc, player); + + NWNX_CallFunction(NWNX_Player, sFunc); +} + +void NWNX_Player_INTERNAL_StopGuiTimingBar(object player, string script = "", int id = -1) ///< @private +{ + int activeId = GetLocalInt(player, "NWNX_PLAYER_GUI_TIMING_ACTIVE"); + // Either the timing event was never started, or it already finished. + if (activeId == 0) + return; + + // If id != -1, we ended up here through DelayCommand. Make sure it's for the right ID + if (id != -1 && id != activeId) + return; + + DeleteLocalInt(player, "NWNX_PLAYER_GUI_TIMING_ACTIVE"); + + string sFunc = "StopGuiTimingBar"; + NWNX_PushArgumentObject(NWNX_Player, sFunc, player); + NWNX_CallFunction(NWNX_Player, sFunc); + + if(script != "") + { + ExecuteScript(script, player); + } +} + +void NWNX_Player_StartGuiTimingBar(object player, float seconds, string script = "", int type = NWNX_PLAYER_TIMING_BAR_CUSTOM) +{ + if (GetLocalInt(player, "NWNX_PLAYER_GUI_TIMING_ACTIVE")) + return; + + string sFunc = "StartGuiTimingBar"; + NWNX_PushArgumentInt(NWNX_Player, sFunc, type); + NWNX_PushArgumentFloat(NWNX_Player, sFunc, seconds); + NWNX_PushArgumentObject(NWNX_Player, sFunc, player); + + NWNX_CallFunction(NWNX_Player, sFunc); + + int id = GetLocalInt(player, "NWNX_PLAYER_GUI_TIMING_ID") + 1; + SetLocalInt(player, "NWNX_PLAYER_GUI_TIMING_ACTIVE", id); + SetLocalInt(player, "NWNX_PLAYER_GUI_TIMING_ID", id); + + DelayCommand(seconds, NWNX_Player_INTERNAL_StopGuiTimingBar(player, script, id)); +} + +void NWNX_Player_StopGuiTimingBar(object player, string script = "") +{ + NWNX_Player_INTERNAL_StopGuiTimingBar(player, script, -1); +} + +void NWNX_Player_SetAlwaysWalk(object player, int bWalk=TRUE) +{ + string sFunc = "SetAlwaysWalk"; + + NWNX_PushArgumentInt(NWNX_Player, sFunc, bWalk); + NWNX_PushArgumentObject(NWNX_Player, sFunc, player); + + NWNX_CallFunction(NWNX_Player, sFunc); +} + +struct NWNX_Player_QuickBarSlot NWNX_Player_GetQuickBarSlot(object player, int slot) +{ + string sFunc = "GetQuickBarSlot"; + struct NWNX_Player_QuickBarSlot qbs; + + NWNX_PushArgumentInt(NWNX_Player, sFunc, slot); + NWNX_PushArgumentObject(NWNX_Player, sFunc, player); + NWNX_CallFunction(NWNX_Player, sFunc); + + qbs.oAssociate = NWNX_GetReturnValueObject(NWNX_Player, sFunc); + qbs.nAssociateType = NWNX_GetReturnValueInt(NWNX_Player, sFunc); + qbs.nDomainLevel = NWNX_GetReturnValueInt(NWNX_Player, sFunc); + qbs.nMetaType = NWNX_GetReturnValueInt(NWNX_Player, sFunc); + qbs.nINTParam1 = NWNX_GetReturnValueInt(NWNX_Player, sFunc); + qbs.sToolTip = NWNX_GetReturnValueString(NWNX_Player, sFunc); + qbs.sCommandLine = NWNX_GetReturnValueString(NWNX_Player, sFunc); + qbs.sCommandLabel = NWNX_GetReturnValueString(NWNX_Player, sFunc); + qbs.sResRef = NWNX_GetReturnValueString(NWNX_Player, sFunc); + qbs.nMultiClass = NWNX_GetReturnValueInt(NWNX_Player, sFunc); + qbs.nObjectType = NWNX_GetReturnValueInt(NWNX_Player, sFunc); + qbs.oSecondaryItem = NWNX_GetReturnValueObject(NWNX_Player, sFunc); + qbs.oItem = NWNX_GetReturnValueObject(NWNX_Player, sFunc); + + return qbs; +} + +void NWNX_Player_SetQuickBarSlot(object player, int slot, struct NWNX_Player_QuickBarSlot qbs) +{ + string sFunc = "SetQuickBarSlot"; + + NWNX_PushArgumentObject(NWNX_Player, sFunc, qbs.oItem); + NWNX_PushArgumentObject(NWNX_Player, sFunc, qbs.oSecondaryItem); + NWNX_PushArgumentInt(NWNX_Player, sFunc, qbs.nObjectType); + NWNX_PushArgumentInt(NWNX_Player, sFunc, qbs.nMultiClass); + NWNX_PushArgumentString(NWNX_Player, sFunc, qbs.sResRef); + NWNX_PushArgumentString(NWNX_Player, sFunc, qbs.sCommandLabel); + NWNX_PushArgumentString(NWNX_Player, sFunc, qbs.sCommandLine); + NWNX_PushArgumentString(NWNX_Player, sFunc, qbs.sToolTip); + NWNX_PushArgumentInt(NWNX_Player, sFunc, qbs.nINTParam1); + NWNX_PushArgumentInt(NWNX_Player, sFunc, qbs.nMetaType); + NWNX_PushArgumentInt(NWNX_Player, sFunc, qbs.nDomainLevel); + NWNX_PushArgumentInt(NWNX_Player, sFunc, qbs.nAssociateType); + NWNX_PushArgumentObject(NWNX_Player, sFunc, qbs.oAssociate); + + NWNX_PushArgumentInt(NWNX_Player, sFunc, slot); + NWNX_PushArgumentObject(NWNX_Player, sFunc, player); + NWNX_CallFunction(NWNX_Player, sFunc); +} + +string NWNX_Player_GetBicFileName(object player) +{ + string sFunc = "GetBicFileName"; + + NWNX_PushArgumentObject(NWNX_Player, sFunc, player); + NWNX_CallFunction(NWNX_Player, sFunc); + return NWNX_GetReturnValueString(NWNX_Player, sFunc); +} + +void NWNX_Player_ShowVisualEffect(object player, int effectId, vector position) +{ + string sFunc = "ShowVisualEffect"; + + NWNX_PushArgumentFloat(NWNX_Player, sFunc, position.x); + NWNX_PushArgumentFloat(NWNX_Player, sFunc, position.y); + NWNX_PushArgumentFloat(NWNX_Player, sFunc, position.z); + NWNX_PushArgumentInt(NWNX_Player, sFunc, effectId); + NWNX_PushArgumentObject(NWNX_Player, sFunc, player); + + NWNX_CallFunction(NWNX_Player, sFunc); +} + +void NWNX_Player_MusicBackgroundChangeDay(object player, int track) +{ + string sFunc = "ChangeBackgroundMusic"; + + NWNX_PushArgumentInt(NWNX_Player, sFunc, track); + NWNX_PushArgumentInt(NWNX_Player, sFunc, TRUE); // bool day = TRUE + NWNX_PushArgumentObject(NWNX_Player, sFunc, player); + + NWNX_CallFunction(NWNX_Player, sFunc); +} + +void NWNX_Player_MusicBackgroundChangeNight(object player, int track) +{ + string sFunc = "ChangeBackgroundMusic"; + + NWNX_PushArgumentInt(NWNX_Player, sFunc, track); + NWNX_PushArgumentInt(NWNX_Player, sFunc, FALSE); // bool day = FALSE + NWNX_PushArgumentObject(NWNX_Player, sFunc, player); + + NWNX_CallFunction(NWNX_Player, sFunc); +} + +void NWNX_Player_MusicBackgroundStart(object player) +{ + string sFunc = "PlayBackgroundMusic"; + + NWNX_PushArgumentInt(NWNX_Player, sFunc, TRUE); // bool play = TRUE + NWNX_PushArgumentObject(NWNX_Player, sFunc, player); + + NWNX_CallFunction(NWNX_Player, sFunc); +} + +void NWNX_Player_MusicBackgroundStop(object player) +{ + string sFunc = "PlayBackgroundMusic"; + + NWNX_PushArgumentInt(NWNX_Player, sFunc, FALSE); // bool play = FALSE + NWNX_PushArgumentObject(NWNX_Player, sFunc, player); + + NWNX_CallFunction(NWNX_Player, sFunc); +} + +void NWNX_Player_MusicBattleChange(object player, int track) +{ + string sFunc = "ChangeBattleMusic"; + + NWNX_PushArgumentInt(NWNX_Player, sFunc, track); + NWNX_PushArgumentObject(NWNX_Player, sFunc, player); + + NWNX_CallFunction(NWNX_Player, sFunc); +} + +void NWNX_Player_MusicBattleStart(object player) +{ + string sFunc = "PlayBattleMusic"; + + NWNX_PushArgumentInt(NWNX_Player, sFunc, TRUE); // bool play = TRUE + NWNX_PushArgumentObject(NWNX_Player, sFunc, player); + + NWNX_CallFunction(NWNX_Player, sFunc); +} + +void NWNX_Player_MusicBattleStop(object player) +{ + string sFunc = "PlayBattleMusic"; + + NWNX_PushArgumentInt(NWNX_Player, sFunc, FALSE); // bool play = FALSE + NWNX_PushArgumentObject(NWNX_Player, sFunc, player); + + NWNX_CallFunction(NWNX_Player, sFunc); +} + +void NWNX_Player_PlaySound(object player, string sound, object target = OBJECT_INVALID) +{ + string sFunc = "PlaySound"; + + NWNX_PushArgumentObject(NWNX_Player, sFunc, target); + NWNX_PushArgumentString(NWNX_Player, sFunc, sound); + NWNX_PushArgumentObject(NWNX_Player, sFunc, player); + + NWNX_CallFunction(NWNX_Player, sFunc); +} + +void NWNX_Player_SetPlaceableUsable(object player, object placeable, int usable) +{ + string sFunc = "SetPlaceableUsable"; + + NWNX_PushArgumentInt(NWNX_Player, sFunc, usable); + NWNX_PushArgumentObject(NWNX_Player, sFunc, placeable); + NWNX_PushArgumentObject(NWNX_Player, sFunc, player); + + NWNX_CallFunction(NWNX_Player, sFunc); +} + +void NWNX_Player_SetRestDuration(object player, int duration) +{ + string sFunc = "SetRestDuration"; + + NWNX_PushArgumentInt(NWNX_Player, sFunc, duration); + NWNX_PushArgumentObject(NWNX_Player, sFunc, player); + + NWNX_CallFunction(NWNX_Player, sFunc); +} + +void NWNX_Player_ApplyInstantVisualEffectToObject(object player, object target, int visualeffect) +{ + string sFunc = "ApplyInstantVisualEffectToObject"; + + NWNX_PushArgumentInt(NWNX_Player, sFunc, visualeffect); + NWNX_PushArgumentObject(NWNX_Player, sFunc, target); + NWNX_PushArgumentObject(NWNX_Player, sFunc, player); + + NWNX_CallFunction(NWNX_Player, sFunc); +} + +void NWNX_Player_UpdateCharacterSheet(object player) +{ + string sFunc = "UpdateCharacterSheet"; + + NWNX_PushArgumentObject(NWNX_Player, sFunc, player); + + NWNX_CallFunction(NWNX_Player, sFunc); +} + +void NWNX_Player_OpenInventory(object player, object target, int open = TRUE) +{ + string sFunc = "OpenInventory"; + + NWNX_PushArgumentInt(NWNX_Player, sFunc, open); + NWNX_PushArgumentObject(NWNX_Player, sFunc, target); + NWNX_PushArgumentObject(NWNX_Player, sFunc, player); + + NWNX_CallFunction(NWNX_Player, sFunc); +} + +string NWNX_Player_GetAreaExplorationState(object player, object area) +{ + string sFunc = "GetAreaExplorationState"; + + NWNX_PushArgumentObject(NWNX_Player, sFunc, area); + NWNX_PushArgumentObject(NWNX_Player, sFunc, player); + + NWNX_CallFunction(NWNX_Player, sFunc); + return NWNX_GetReturnValueString(NWNX_Player, sFunc); +} + +void NWNX_Player_SetAreaExplorationState(object player, object area, string str) +{ + string sFunc = "SetAreaExplorationState"; + + NWNX_PushArgumentString(NWNX_Player, sFunc, str); + NWNX_PushArgumentObject(NWNX_Player, sFunc, area); + NWNX_PushArgumentObject(NWNX_Player, sFunc, player); + + NWNX_CallFunction(NWNX_Player, sFunc); +} + +void NWNX_Player_SetRestAnimation(object oPlayer, int nAnimation) +{ + string sFunc = "SetRestAnimation"; + + NWNX_PushArgumentInt(NWNX_Player, sFunc, nAnimation); + NWNX_PushArgumentObject(NWNX_Player, sFunc, oPlayer); + + NWNX_CallFunction(NWNX_Player, sFunc); +} + +void NWNX_Player_SetObjectVisualTransformOverride(object oPlayer, object oObject, int nTransform, float fValue) +{ + string sFunc = "SetObjectVisualTransformOverride"; + + NWNX_PushArgumentFloat(NWNX_Player, sFunc, fValue); + NWNX_PushArgumentInt(NWNX_Player, sFunc, nTransform); + NWNX_PushArgumentObject(NWNX_Player, sFunc, oObject); + NWNX_PushArgumentObject(NWNX_Player, sFunc, oPlayer); + + NWNX_CallFunction(NWNX_Player, sFunc); +} + +void NWNX_Player_ApplyLoopingVisualEffectToObject(object player, object target, int visualeffect) +{ + string sFunc = "ApplyLoopingVisualEffectToObject"; + + NWNX_PushArgumentInt(NWNX_Player, sFunc, visualeffect); + NWNX_PushArgumentObject(NWNX_Player, sFunc, target); + NWNX_PushArgumentObject(NWNX_Player, sFunc, player); + + NWNX_CallFunction(NWNX_Player, sFunc); +} + +void NWNX_Player_SetPlaceableNameOverride(object player, object placeable, string name) +{ + string sFunc = "SetPlaceableNameOverride"; + + NWNX_PushArgumentString(NWNX_Player, sFunc, name); + NWNX_PushArgumentObject(NWNX_Player, sFunc, placeable); + NWNX_PushArgumentObject(NWNX_Player, sFunc, player); + + NWNX_CallFunction(NWNX_Player, sFunc); +} + +int NWNX_Player_GetQuestCompleted(object player, string sQuestName) +{ + string sFunc = "GetQuestCompleted"; + + NWNX_PushArgumentString(NWNX_Player, sFunc, sQuestName); + NWNX_PushArgumentObject(NWNX_Player, sFunc, player); + + NWNX_CallFunction(NWNX_Player, sFunc); + return NWNX_GetReturnValueInt(NWNX_Player, sFunc); +} + +void NWNX_Player_SetPersistentLocation(string sCDKeyOrCommunityName, string sBicFileName, object oWP, int bFirstConnectOnly = TRUE) +{ + string sFunc = "SetPersistentLocation"; + + NWNX_PushArgumentInt(NWNX_Player, sFunc, bFirstConnectOnly); + NWNX_PushArgumentObject(NWNX_Player, sFunc, oWP); + NWNX_PushArgumentString(NWNX_Player, sFunc, sBicFileName); + NWNX_PushArgumentString(NWNX_Player, sFunc, sCDKeyOrCommunityName); + + NWNX_CallFunction(NWNX_Player, sFunc); +} + +void NWNX_Player_UpdateItemName(object oPlayer, object oItem) +{ + string sFunc = "UpdateItemName"; + + NWNX_PushArgumentObject(NWNX_Player, sFunc, oItem); + NWNX_PushArgumentObject(NWNX_Player, sFunc, oPlayer); + + NWNX_CallFunction(NWNX_Player, sFunc); +} + +int NWNX_Player_PossessCreature(object oPossessor, object oPossessed, int bMindImmune = TRUE, int bCreateDefaultQB = FALSE) +{ + string sFunc = "PossessCreature"; + + NWNX_PushArgumentInt(NWNX_Player, sFunc, bCreateDefaultQB); + NWNX_PushArgumentInt(NWNX_Player, sFunc, bMindImmune); + NWNX_PushArgumentObject(NWNX_Player, sFunc, oPossessed); + NWNX_PushArgumentObject(NWNX_Player, sFunc, oPossessor); + + NWNX_CallFunction(NWNX_Player, sFunc); + return NWNX_GetReturnValueInt(NWNX_Player, sFunc); +} + +int NWNX_Player_GetPlatformId(object oPlayer) +{ + string sFunc = "GetPlatformId"; + + NWNX_PushArgumentObject(NWNX_Player, sFunc, oPlayer); + + NWNX_CallFunction(NWNX_Player, sFunc); + return NWNX_GetReturnValueInt(NWNX_Player, sFunc); +} + +int NWNX_Player_GetLanguage(object oPlayer) +{ + string sFunc = "GetLanguage"; + + NWNX_PushArgumentObject(NWNX_Player, sFunc, oPlayer); + + NWNX_CallFunction(NWNX_Player, sFunc); + return NWNX_GetReturnValueInt(NWNX_Player, sFunc); +} + +void NWNX_Player_SetResManOverride(object oPlayer, int nResType, string sOldResName, string sNewResName) +{ + string sFunc = "SetResManOverride"; + + NWNX_PushArgumentString(NWNX_Player, sFunc, sNewResName); + NWNX_PushArgumentString(NWNX_Player, sFunc, sOldResName); + NWNX_PushArgumentInt(NWNX_Player, sFunc, nResType); + NWNX_PushArgumentObject(NWNX_Player, sFunc, oPlayer); + + NWNX_CallFunction(NWNX_Player, sFunc); +} + +void NWNX_Player_SetCustomToken(object oPlayer, int nCustomTokenNumber, string sTokenValue) +{ + string sFunc = "SetCustomToken"; + + NWNX_PushArgumentString(NWNX_Player, sFunc, sTokenValue); + NWNX_PushArgumentInt(NWNX_Player, sFunc, nCustomTokenNumber); + NWNX_PushArgumentObject(NWNX_Player, sFunc, oPlayer); + + NWNX_CallFunction(NWNX_Player, sFunc); +} + +void NWNX_Player_SetCreatureNameOverride(object oPlayer, object oCreature, string sName) +{ + string sFunc = "SetCreatureNameOverride"; + + NWNX_PushArgumentString(NWNX_Player, sFunc, sName); + NWNX_PushArgumentObject(NWNX_Player, sFunc, oCreature); + NWNX_PushArgumentObject(NWNX_Player, sFunc, oPlayer); + + NWNX_CallFunction(NWNX_Player, sFunc); +} + +void NWNX_Player_FloatingTextStringOnCreature(object oPlayer, object oCreature, string sText) +{ + string sFunc = "FloatingTextStringOnCreature"; + + NWNX_PushArgumentString(NWNX_Player, sFunc, sText); + NWNX_PushArgumentObject(NWNX_Player, sFunc, oCreature); + NWNX_PushArgumentObject(NWNX_Player, sFunc, oPlayer); + + NWNX_CallFunction(NWNX_Player, sFunc); +} + +void NWNX_Player_ToggleDM(object oPlayer, int bIsDM) +{ + string sFunc = "ToggleDM"; + + NWNX_PushArgumentInt(NWNX_Player, sFunc, bIsDM); + NWNX_PushArgumentObject(NWNX_Player, sFunc, oPlayer); + + NWNX_CallFunction(NWNX_Player, sFunc); +} + +void NWNX_Player_SetObjectMouseCursorOverride(object oPlayer, object oObject, int nCursor) +{ + string sFunc = "SetObjectMouseCursorOverride"; + + NWNX_PushArgumentInt(NWNX_Player, sFunc, nCursor); + NWNX_PushArgumentObject(NWNX_Player, sFunc, oObject); + NWNX_PushArgumentObject(NWNX_Player, sFunc, oPlayer); + + NWNX_CallFunction(NWNX_Player, sFunc); +} + +void NWNX_Player_SetObjectHiliteColorOverride(object oPlayer, object oObject, int nColor) +{ + string sFunc = "SetObjectHiliteColorOverride"; + + NWNX_PushArgumentInt(NWNX_Player, sFunc, nColor); + NWNX_PushArgumentObject(NWNX_Player, sFunc, oObject); + NWNX_PushArgumentObject(NWNX_Player, sFunc, oPlayer); + + NWNX_CallFunction(NWNX_Player, sFunc); +} + +void NWNX_Player_RemoveEffectFromTURD(object oPlayer, string sEffectTag) +{ + string sFunc = "RemoveEffectFromTURD"; + + NWNX_PushArgumentString(NWNX_Player, sFunc, sEffectTag); + NWNX_PushArgumentObject(NWNX_Player, sFunc, oPlayer); + + NWNX_CallFunction(NWNX_Player, sFunc); +} + +void NWNX_Player_SetSpawnLocation(object oPlayer, location locSpawn) +{ + string sFunc = "SetSpawnLocation"; + + vector vPosition = GetPositionFromLocation(locSpawn); + + NWNX_PushArgumentFloat(NWNX_Player, sFunc, GetFacingFromLocation(locSpawn)); + NWNX_PushArgumentFloat(NWNX_Player, sFunc, vPosition.z); + NWNX_PushArgumentFloat(NWNX_Player, sFunc, vPosition.y); + NWNX_PushArgumentFloat(NWNX_Player, sFunc, vPosition.x); + NWNX_PushArgumentObject(NWNX_Player, sFunc, GetAreaFromLocation(locSpawn)); + NWNX_PushArgumentObject(NWNX_Player, sFunc, oPlayer); + + NWNX_CallFunction(NWNX_Player, sFunc); +} + +void NWNX_Player_SendDMAllCreatorLists(object oPlayer) +{ + string sFunc = "SendDMAllCreatorLists"; + NWNX_PushArgumentObject(NWNX_Player, sFunc, oPlayer); + NWNX_CallFunction(NWNX_Player, sFunc); +} + +int NWNX_Player_AddCustomJournalEntry(object oPlayer, struct NWNX_Player_JournalEntry journalEntry, int nSilentUpdate = 0) +{ + string sFunc = "AddCustomJournalEntry"; + NWNX_PushArgumentInt(NWNX_Player, sFunc, nSilentUpdate); + NWNX_PushArgumentInt(NWNX_Player, sFunc, journalEntry.nTimeOfDay); + NWNX_PushArgumentInt(NWNX_Player, sFunc, journalEntry.nCalendarDay); + NWNX_PushArgumentInt(NWNX_Player, sFunc, journalEntry.nUpdated); + NWNX_PushArgumentInt(NWNX_Player, sFunc, journalEntry.nQuestDisplayed); + NWNX_PushArgumentInt(NWNX_Player, sFunc, journalEntry.nQuestCompleted); + NWNX_PushArgumentInt(NWNX_Player, sFunc, journalEntry.nPriority); + NWNX_PushArgumentInt(NWNX_Player, sFunc, journalEntry.nState); + NWNX_PushArgumentString(NWNX_Player, sFunc, journalEntry.sTag); + NWNX_PushArgumentString(NWNX_Player, sFunc, journalEntry.sText); + NWNX_PushArgumentString(NWNX_Player, sFunc, journalEntry.sName); + NWNX_PushArgumentObject(NWNX_Player, sFunc, oPlayer); + NWNX_CallFunction(NWNX_Player, sFunc); + return NWNX_GetReturnValueInt(NWNX_Player, sFunc); +} + +struct NWNX_Player_JournalEntry NWNX_Player_GetJournalEntry(object oPlayer, string questTag) +{ + string sFunc = "GetJournalEntry"; + struct NWNX_Player_JournalEntry entry; + + NWNX_PushArgumentString(NWNX_Player, sFunc, questTag); + NWNX_PushArgumentObject(NWNX_Player, sFunc, oPlayer); + NWNX_CallFunction(NWNX_Player, sFunc); + + entry.nUpdated = NWNX_GetReturnValueInt(NWNX_Player, sFunc); + if(entry.nUpdated == -1) // -1 set as an indicator to say that the entry was not found + { + return entry; + } + entry.nQuestDisplayed = NWNX_GetReturnValueInt(NWNX_Player, sFunc); + entry.nQuestCompleted = NWNX_GetReturnValueInt(NWNX_Player, sFunc); + entry.nPriority = NWNX_GetReturnValueInt(NWNX_Player, sFunc); + entry.nState = NWNX_GetReturnValueInt(NWNX_Player, sFunc); + entry.nTimeOfDay = NWNX_GetReturnValueInt(NWNX_Player, sFunc); + entry.nCalendarDay = NWNX_GetReturnValueInt(NWNX_Player, sFunc); + entry.sName = NWNX_GetReturnValueString(NWNX_Player, sFunc); + entry.sText = NWNX_GetReturnValueString(NWNX_Player, sFunc); + entry.sTag = questTag; + return entry; +} + +void NWNX_Player_CloseStore(object oPlayer) +{ + string sFunc = "CloseStore"; + + NWNX_PushArgumentObject(NWNX_Player, sFunc, oPlayer); + NWNX_CallFunction(NWNX_Player, sFunc); +} diff --git a/gamma_age_v2/nwnx_player_qbs.nss b/gamma_age_v2/nwnx_player_qbs.nss new file mode 100644 index 00000000..0649c97a --- /dev/null +++ b/gamma_age_v2/nwnx_player_qbs.nss @@ -0,0 +1,207 @@ +/// @addtogroup player +/// @{ +/// @file nwnx_player_qbs.nss +/// @brief Helper script for quickbar management. +#include "nwnx_player" + +/// @name Quickbar Slot Types +/// @anchor qbs_types +/// @{ +const int NWNX_PLAYER_QBS_TYPE_EMPTY = 0; +const int NWNX_PLAYER_QBS_TYPE_ITEM = 1; +const int NWNX_PLAYER_QBS_TYPE_SPELL = 2; +const int NWNX_PLAYER_QBS_TYPE_SKILL = 3; +const int NWNX_PLAYER_QBS_TYPE_FEAT = 4; +const int NWNX_PLAYER_QBS_TYPE_DIALOG = 6; +const int NWNX_PLAYER_QBS_TYPE_ATTACK = 7; +const int NWNX_PLAYER_QBS_TYPE_EMOTE = 8; +const int NWNX_PLAYER_QBS_TYPE_ITEM_PROPERTY_CASTSPELL = 9; +const int NWNX_PLAYER_QBS_TYPE_MODE_TOGGLE = 10; +const int NWNX_PLAYER_QBS_TYPE_COMMAND = 18; +const int NWNX_PLAYER_QBS_TYPE_POSSESS_FAMILIAR = 38; +const int NWNX_PLAYER_QBS_TYPE_ASSOCIATE_COMMAND = 39; +const int NWNX_PLAYER_QBS_TYPE_EXAMINE = 40; +const int NWNX_PLAYER_QBS_TYPE_BARTER = 41; +const int NWNX_PLAYER_QBS_TYPE_QUICK_CHAT = 42; +const int NWNX_PLAYER_QBS_TYPE_CANCELPOLYMORPH = 43; +const int NWNX_PLAYER_QBS_TYPE_SPELLLIKEABILITY = 44; +/// @} + +/// Create an empty QBS of given type +struct NWNX_Player_QuickBarSlot NWNX_Player_QBS_Empty(int type = NWNX_PLAYER_QBS_TYPE_EMPTY); +/// Create a QBS for using an item +struct NWNX_Player_QuickBarSlot NWNX_Player_QBS_UseItem(object oItem, int nPropertyID = 0); +/// Create a QBS for equipping an item +struct NWNX_Player_QuickBarSlot NWNX_Player_QBS_EquipItem(object oItem, object oSecondaryItem = OBJECT_INVALID); +/// Create a QBS for casting a spell +struct NWNX_Player_QuickBarSlot NWNX_Player_QBS_CastSpell(int nSpell, int nClassIndex = 0, int nMetamagic = METAMAGIC_NONE, int nDomainLevel = -1); +/// Create a QBS for using a skill +struct NWNX_Player_QuickBarSlot NWNX_Player_QBS_UseSkill(int nSkill); +/// Create a QBS for using a feat +struct NWNX_Player_QuickBarSlot NWNX_Player_QBS_UseFeat(int nFeat); +/// Create a QBS for starting a dialog +struct NWNX_Player_QuickBarSlot NWNX_Player_QBS_StartDialog(); +/// Create a QBS for attacking +struct NWNX_Player_QuickBarSlot NWNX_Player_QBS_Attack(); +/// Create a QBS for emoting +struct NWNX_Player_QuickBarSlot NWNX_Player_QBS_Emote(int nEmote); +/// Create a QBS for toggling a mode +struct NWNX_Player_QuickBarSlot NWNX_Player_QBS_ToggleMode(int nMode); +/// Create a QBS for examining +struct NWNX_Player_QuickBarSlot NWNX_Player_QBS_Examine(); +/// Create a QBS for bartering +struct NWNX_Player_QuickBarSlot NWNX_Player_QBS_Barter(); +/// Create a QBS for quickchat command +struct NWNX_Player_QuickBarSlot NWNX_Player_QBS_QuickChat(int nCommand); +/// Create a QBS for examining +struct NWNX_Player_QuickBarSlot NWNX_Player_QBS_PossessFamiliar(); +/// Create a QBS for casting a spell +struct NWNX_Player_QuickBarSlot NWNX_Player_QBS_UseSpecialAbility(int nSpell, int nCasterLevel); +/// Create a QBS for running a command +struct NWNX_Player_QuickBarSlot NWNX_Player_QBS_Command(string sCommandLabel, string sCommandLine); + +/// @} + + +struct NWNX_Player_QuickBarSlot NWNX_Player_QBS_Empty(int type = NWNX_PLAYER_QBS_TYPE_EMPTY) +{ + struct NWNX_Player_QuickBarSlot qbs; + + qbs.nObjectType = type; + + qbs.oItem = OBJECT_INVALID; + qbs.oSecondaryItem = OBJECT_INVALID; + qbs.nMultiClass = 0; + qbs.sResRef = ""; + qbs.sCommandLabel = ""; + qbs.sCommandLine = ""; + qbs.sToolTip = ""; + qbs.nINTParam1 = 0; + qbs.nMetaType = 0; + qbs.nDomainLevel = 0; + qbs.nAssociateType = 0; + qbs.oAssociate = OBJECT_INVALID; + + return qbs; +} + +struct NWNX_Player_QuickBarSlot NWNX_Player_QBS_UseItem(object oItem, int nPropertyID = 0) +{ + struct NWNX_Player_QuickBarSlot qbs = NWNX_Player_QBS_Empty(NWNX_PLAYER_QBS_TYPE_ITEM); + + qbs.oItem = oItem; + qbs.nINTParam1 = nPropertyID; + + return qbs; +} + +struct NWNX_Player_QuickBarSlot NWNX_Player_QBS_EquipItem(object oItem, object oSecondaryItem = OBJECT_INVALID) +{ + struct NWNX_Player_QuickBarSlot qbs = NWNX_Player_QBS_Empty(NWNX_PLAYER_QBS_TYPE_ITEM); + + qbs.oItem = oItem; + qbs.oSecondaryItem = oSecondaryItem; + + return qbs; +} + +struct NWNX_Player_QuickBarSlot NWNX_Player_QBS_CastSpell(int nSpell, int nClassIndex = 0, int nMetamagic = METAMAGIC_NONE, int nDomainLevel = -1) +{ + struct NWNX_Player_QuickBarSlot qbs = NWNX_Player_QBS_Empty(NWNX_PLAYER_QBS_TYPE_SPELL); + + qbs.nINTParam1 = nSpell; + qbs.nMultiClass = nClassIndex; + qbs.nMetaType = nMetamagic; + qbs.nDomainLevel = nDomainLevel; + + return qbs; +} + +struct NWNX_Player_QuickBarSlot NWNX_Player_QBS_UseSkill(int nSkill) +{ + struct NWNX_Player_QuickBarSlot qbs = NWNX_Player_QBS_Empty(NWNX_PLAYER_QBS_TYPE_SKILL); + + qbs.nINTParam1 = nSkill; + + return qbs; +} + +struct NWNX_Player_QuickBarSlot NWNX_Player_QBS_UseFeat(int nFeat) +{ + struct NWNX_Player_QuickBarSlot qbs = NWNX_Player_QBS_Empty(NWNX_PLAYER_QBS_TYPE_FEAT); + + qbs.nINTParam1 = nFeat; + + return qbs; +} + +struct NWNX_Player_QuickBarSlot NWNX_Player_QBS_StartDialog() +{ + return NWNX_Player_QBS_Empty(NWNX_PLAYER_QBS_TYPE_DIALOG); +} + +struct NWNX_Player_QuickBarSlot NWNX_Player_QBS_Attack() +{ + return NWNX_Player_QBS_Empty(NWNX_PLAYER_QBS_TYPE_ATTACK); +} + +struct NWNX_Player_QuickBarSlot NWNX_Player_QBS_Emote(int nEmote) +{ + struct NWNX_Player_QuickBarSlot qbs = NWNX_Player_QBS_Empty(NWNX_PLAYER_QBS_TYPE_EMOTE); + + qbs.nINTParam1 = nEmote; + + return qbs; +} + +struct NWNX_Player_QuickBarSlot NWNX_Player_QBS_ToggleMode(int nMode) +{ + struct NWNX_Player_QuickBarSlot qbs = NWNX_Player_QBS_Empty(NWNX_PLAYER_QBS_TYPE_MODE_TOGGLE); + + qbs.nINTParam1 = nMode; + + return qbs; +} + +struct NWNX_Player_QuickBarSlot NWNX_Player_QBS_Examine() +{ + return NWNX_Player_QBS_Empty(NWNX_PLAYER_QBS_TYPE_EXAMINE); +} + +struct NWNX_Player_QuickBarSlot NWNX_Player_QBS_Barter() +{ + return NWNX_Player_QBS_Empty(NWNX_PLAYER_QBS_TYPE_BARTER); +} + +struct NWNX_Player_QuickBarSlot NWNX_Player_QBS_QuickChat(int nCommand) +{ + struct NWNX_Player_QuickBarSlot qbs = NWNX_Player_QBS_Empty(NWNX_PLAYER_QBS_TYPE_QUICK_CHAT); + + qbs.nINTParam1 = nCommand; + + return qbs; +} + +struct NWNX_Player_QuickBarSlot NWNX_Player_QBS_PossessFamiliar() +{ + return NWNX_Player_QBS_Empty(NWNX_PLAYER_QBS_TYPE_POSSESS_FAMILIAR); +} + +struct NWNX_Player_QuickBarSlot NWNX_Player_QBS_UseSpecialAbility(int nSpell, int nCasterLevel) +{ + struct NWNX_Player_QuickBarSlot qbs = NWNX_Player_QBS_Empty(NWNX_PLAYER_QBS_TYPE_SPELL); + + qbs.nINTParam1 = nSpell; + qbs.nDomainLevel = nCasterLevel; + + return qbs; +} +struct NWNX_Player_QuickBarSlot NWNX_Player_QBS_Command(string sCommandLabel, string sCommandLine) +{ + struct NWNX_Player_QuickBarSlot qbs = NWNX_Player_QBS_Empty(NWNX_PLAYER_QBS_TYPE_COMMAND); + + qbs.sCommandLabel = sCommandLabel; + qbs.sCommandLine = sCommandLine; + + return qbs; +} diff --git a/gamma_age_v2/nwnx_profiler.nss b/gamma_age_v2/nwnx_profiler.nss new file mode 100644 index 00000000..4c7393e8 --- /dev/null +++ b/gamma_age_v2/nwnx_profiler.nss @@ -0,0 +1,60 @@ +/// @addtogroup profiler Profiler +/// @brief Functions to instrument nwscript code. +/// @remark These functions are for advanced users. +/// @{ +/// @file nwnx_profiler.nss +#include "nwnx" + +const string NWNX_Profiler = "NWNX_Profiler"; ///< @private + +/// @brief Push a timing metric scope - note that every push must be matched by a corresponding pop. +/// +/// A timing metric contains the following information. +/// ```c +/// { +/// metricName: [name], // Mandatory, from user code +/// metricFields: { time, nanoseconds }, // Automatically captured by the push/pop pair +/// metricTags: { [tag0_tag], [tag0_value] } // Optional, from user code, can be used to +/// filter metrics based on some category or, +/// constant e.g. objectType or area +/// } +/// ``` +/// +/// If you don't understand how this works and you wish to use it, you should research +/// the Metrics system (see Metrics.hpp) as well as googling about how InfluxDB stores metrics. +/// +/// @note It's possible to have more than one tag pair per metric, It is just limited +/// to one arbitrarily here. You can edit the prototype to include more and the C++ +/// code will cope with it correctly. +/// @param name The name to use for your metric. +/// @param tag0_tag An optional tag to filter your metrics. +/// @param tag0_value The tag's value for which to filter. +void NWNX_Profiler_PushPerfScope(string name, string tag0_tag = "", string tag0_value = ""); + +/// @brief Pops a timing metric. +/// @remark A metric must already be pushed. +void NWNX_Profiler_PopPerfScope(); + +/// @} + +void NWNX_Profiler_PushPerfScope(string name, string tag0_tag = "", string tag0_value = "") +{ + string sFunc = "PushPerfScope"; + + NWNX_PushArgumentString(NWNX_Profiler, sFunc, name); + + if (tag0_value != "" && tag0_tag != "") + { + NWNX_PushArgumentString(NWNX_Profiler, sFunc, tag0_value); + NWNX_PushArgumentString(NWNX_Profiler, sFunc, tag0_tag); + } + + NWNX_CallFunction(NWNX_Profiler, sFunc); +} + +void NWNX_Profiler_PopPerfScope() +{ + string sFunc = "PopPerfScope"; + + NWNX_CallFunction(NWNX_Profiler, sFunc); +} \ No newline at end of file diff --git a/gamma_age_v2/nwnx_race.nss b/gamma_age_v2/nwnx_race.nss new file mode 100644 index 00000000..48360c30 --- /dev/null +++ b/gamma_age_v2/nwnx_race.nss @@ -0,0 +1,90 @@ +/// @addtogroup race Race +/// @brief Define racial and subrace characteristics. +/// @{ +/// @file nwnx_race.nss +#include "nwnx" + +const string NWNX_Race = "NWNX_Race"; ///< @private + +/// @name Racial Modifiers +/// @anchor racial_modifiers +/// +/// @{ +const int NWNX_RACE_MODIFIER_INVALID = 0; +const int NWNX_RACE_MODIFIER_AB = 1; +const int NWNX_RACE_MODIFIER_ABVSRACE = 2; +const int NWNX_RACE_MODIFIER_AC = 3; +const int NWNX_RACE_MODIFIER_ACVSRACE = 4; +const int NWNX_RACE_MODIFIER_CONCEALMENT = 5; +const int NWNX_RACE_MODIFIER_DMGIMMUNITY = 6; +const int NWNX_RACE_MODIFIER_DMGREDUCTION = 7; +const int NWNX_RACE_MODIFIER_DMGRESIST = 8; +const int NWNX_RACE_MODIFIER_FEAT = 9; +const int NWNX_RACE_MODIFIER_FEATUSAGE = 10; +const int NWNX_RACE_MODIFIER_IMMUNITY = 11; +const int NWNX_RACE_MODIFIER_INITIATIVE = 12; +const int NWNX_RACE_MODIFIER_MOVEMENTSPEED = 13; +const int NWNX_RACE_MODIFIER_RACE = 14; +const int NWNX_RACE_MODIFIER_REGENERATION = 15; +const int NWNX_RACE_MODIFIER_SAVE = 16; +const int NWNX_RACE_MODIFIER_SAVEVSRACE = 17; +const int NWNX_RACE_MODIFIER_SAVEVSTYPE = 18; +const int NWNX_RACE_MODIFIER_SKILL = 19; +const int NWNX_RACE_MODIFIER_SPELLIMMUNITY = 20; +const int NWNX_RACE_MODIFIER_SRCHARGEN = 21; +const int NWNX_RACE_MODIFIER_SRINCLEVEL = 22; +///@} + +/// @brief Sets a racial modifier. +/// @param iRace The RACIALTYPE_ constant or value in racialtypes.2da. +/// @param iMod The @ref racial_modifiers "racial modifier" to set. +/// @param iParam1, iParam2, iParam3 The parameters for this racial modifier. +void NWNX_Race_SetRacialModifier(int iRace, int iMod, int iParam1, int iParam2 = 0xDEADBEEF, int iParam3 = 0xDEADBEEF); + +/// @brief Gets the parent race for a race. +/// @param iRace The race to check for a parent. +/// @return The parent race if applicable, if not it just returns the race passed in. +int NWNX_Race_GetParentRace(int iRace); + +/// @brief Associates the race with its favored enemy feat. +/// @param iRace The race +/// @param iFeat The feat +/// @note If a creature has a race that has a parent race then favored enemy bonuses will work for either race against that creature. +/// For example a creature is a Wild Elf which has a parent race of Elf, an attacker would benefit if they had either Favored Enemy: Elf +/// or Favored Enemy: Wild Elf +void NWNX_Race_SetFavoredEnemyFeat(int iRace, int iFeat); + +/// @} + +void NWNX_Race_SetRacialModifier(int iRace, int iMod, int iParam1, int iParam2 = 0xDEADBEEF, int iParam3 = 0xDEADBEEF) +{ + string sFunc = "SetRacialModifier"; + + NWNX_PushArgumentInt(NWNX_Race, sFunc, iParam3); + NWNX_PushArgumentInt(NWNX_Race, sFunc, iParam2); + NWNX_PushArgumentInt(NWNX_Race, sFunc, iParam1); + NWNX_PushArgumentInt(NWNX_Race, sFunc, iMod); + NWNX_PushArgumentInt(NWNX_Race, sFunc, iRace); + + NWNX_CallFunction(NWNX_Race, sFunc); +} + +int NWNX_Race_GetParentRace(int iRace) +{ + string sFunc = "GetParentRace"; + + NWNX_PushArgumentInt(NWNX_Race, sFunc, iRace); + + NWNX_CallFunction(NWNX_Race, sFunc); + return NWNX_GetReturnValueInt(NWNX_Race, sFunc); +} + +void NWNX_Race_SetFavoredEnemyFeat(int iRace, int iFeat) +{ + string sFunc = "SetFavoredEnemyFeat"; + + NWNX_PushArgumentInt(NWNX_Race, sFunc, iFeat); + NWNX_PushArgumentInt(NWNX_Race, sFunc, iRace); + + NWNX_CallFunction(NWNX_Race, sFunc); +} diff --git a/gamma_age_v2/nwnx_race_2da.nss b/gamma_age_v2/nwnx_race_2da.nss new file mode 100644 index 00000000..5b6f8021 --- /dev/null +++ b/gamma_age_v2/nwnx_race_2da.nss @@ -0,0 +1,70 @@ +/// @ingroup race +/// @file nwnx_race_2da.nss +/// @brief Parse a column in the racialtypes.2da to load the modifiers. +#include "nwnx_race" +#include "nwnx_util" + +/// @ingroup race +/// @brief Translate a modifier type from a string to its constant. +/// @param raceMod The string representation of the constant. +/// @return The constant for the race modifier. +int NWNX_Race_GetModifierConstant(string raceMod); + +/// @ingroup race +/// @brief Loops through racialtypes.2da and checks for the column for racial modifications and sets them. +/// @note Requires NWNX_Util_Get2DARowCount() +/// @param sColumnName The column name in the racialtypes.2da that defines the 2da for the racial mods. +void NWNX_Race_LoadRacialModifiers(string sColumnName = "RacialModsTable"); + +int NWNX_Race_GetModifierConstant(string raceMod) +{ + if (raceMod == "AB") return NWNX_RACE_MODIFIER_AB; + else if (raceMod == "ABVSRACE") return NWNX_RACE_MODIFIER_ABVSRACE; + else if (raceMod == "AC") return NWNX_RACE_MODIFIER_AC; + else if (raceMod == "ACVSRACE") return NWNX_RACE_MODIFIER_ACVSRACE; + else if (raceMod == "CONCEALMENT") return NWNX_RACE_MODIFIER_CONCEALMENT; + else if (raceMod == "DMGIMMUNITY") return NWNX_RACE_MODIFIER_DMGIMMUNITY; + else if (raceMod == "DMGREDUCTION") return NWNX_RACE_MODIFIER_DMGREDUCTION; + else if (raceMod == "DMGRESIST") return NWNX_RACE_MODIFIER_DMGRESIST; + else if (raceMod == "FEAT") return NWNX_RACE_MODIFIER_FEAT; + else if (raceMod == "FEATUSAGE") return NWNX_RACE_MODIFIER_FEATUSAGE; + else if (raceMod == "IMMUNITY") return NWNX_RACE_MODIFIER_IMMUNITY; + else if (raceMod == "INITIATIVE") return NWNX_RACE_MODIFIER_INITIATIVE; + else if (raceMod == "MOVEMENTSPEED") return NWNX_RACE_MODIFIER_MOVEMENTSPEED; + else if (raceMod == "RACE") return NWNX_RACE_MODIFIER_RACE; + else if (raceMod == "REGENERATION") return NWNX_RACE_MODIFIER_REGENERATION; + else if (raceMod == "SAVE") return NWNX_RACE_MODIFIER_SAVE; + else if (raceMod == "SAVEVSRACE") return NWNX_RACE_MODIFIER_SAVEVSRACE; + else if (raceMod == "SAVEVSTYPE") return NWNX_RACE_MODIFIER_SAVEVSTYPE; + else if (raceMod == "SKILL") return NWNX_RACE_MODIFIER_SKILL; + else if (raceMod == "SPELLIMMUNITY") return NWNX_RACE_MODIFIER_SPELLIMMUNITY; + else if (raceMod == "SRCHARGEN") return NWNX_RACE_MODIFIER_SRCHARGEN; + else if (raceMod == "SRINCLEVEL") return NWNX_RACE_MODIFIER_SRINCLEVEL; + return NWNX_RACE_MODIFIER_INVALID; +} + +void NWNX_Race_LoadRacialModifiers(string sColumnName = "RacialModsTable") +{ + int iRaceRows = NWNX_Util_Get2DARowCount("racialtypes"); + int iRace; + for (iRace = 0; iRace < iRaceRows; iRace++) + { + string sRaceModTable = Get2DAString("racialtypes", sColumnName, iRace); + if(sRaceModTable != "") + { + int iRaceModRows = NWNX_Util_Get2DARowCount(sRaceModTable); + int iRaceMod; + for (iRaceMod = 0; iRaceMod < iRaceModRows; iRaceMod++) + { + string sType = Get2DAString(sRaceModTable, "Type", iRaceMod); + string sParam1 = Get2DAString(sRaceModTable, "Param1", iRaceMod); + string sParam2 = Get2DAString(sRaceModTable, "Param2", iRaceMod); + string sParam3 = Get2DAString(sRaceModTable, "Param3", iRaceMod); + int iParam1 = sParam1 == "" ? 0xDEADBEEF : StringToInt(sParam1); + int iParam2 = sParam2 == "" ? 0xDEADBEEF : StringToInt(sParam2); + int iParam3 = sParam3 == "" ? 0xDEADBEEF : StringToInt(sParam3); + NWNX_Race_SetRacialModifier(iRace, NWNX_Race_GetModifierConstant(sType), iParam1, iParam2, iParam3); + } + } + } +} diff --git a/gamma_age_v2/nwnx_redis.nss b/gamma_age_v2/nwnx_redis.nss new file mode 100644 index 00000000..56d00967 --- /dev/null +++ b/gamma_age_v2/nwnx_redis.nss @@ -0,0 +1,5906 @@ +/// @ingroup redis +/// @brief Autogenerated redis commands for NWNX usage. Autogenerated on: 2019-10-01 20:51:53 -0400 +/// @{ +/// @file nwnx_redis.nss +/// @name Redis Commands +#include "nwnx" +#include "nwnx_redis_lib" + + +// Skipping sub-command: BITFIELD/{"command"=>"OVERFLOW", "type"=>"enum", "enum"=>["WRAP", "SAT", "FAIL"], "optional"=>true} - not supported yet. +// Skipping sub-command: CLIENT_KILL/{"command"=>"TYPE", "type"=>"enum", "enum"=>["normal", "master", "slave", "pubsub"], "optional"=>true} - not supported yet. +// Skipping sub-command: CLIENT_LIST/{"command"=>"TYPE", "type"=>"enum", "enum"=>["normal", "master", "replica", "pubsub"], "optional"=>true} - not supported yet. +// Skipping sub-command: SET/{"command"=>"expiration", "type"=>"enum", "enum"=>["EX seconds", "PX milliseconds"], "optional"=>true} - not supported yet. +// Skipping XCLAIM, cannot parse argument: {"name"=>"force", "enum"=>["FORCE"], "optional"=>true} - not supported yet. +// Skipping XCLAIM, cannot parse argument: {"name"=>"justid", "enum"=>["JUSTID"], "optional"=>true} - not supported yet. +/** + * APPEND + * + * Append a value to a key + * + * Time complexity: O(1). The amortized time complexity is O(1) assuming the appended value is + * small and the already present value is of any size, since the dynamic string + * library used by Redis will double the free space available on every + * reallocation. + * Annotated return value: integer + */ +int NWNX_Redis_APPEND( + string key, + string value +); + +/** + * AUTH + * + * Authenticate to the server + * Annotated return value: simple-string + */ +int NWNX_Redis_AUTH( + string password +); + +/** + * BGREWRITEAOF + * + * Asynchronously rewrite the append-only file + * Annotated return value: simple-string + */ +int NWNX_Redis_BGREWRITEAOF(); + +/** + * BGSAVE + * + * Asynchronously save the dataset to disk + * Annotated return value: simple-string + */ +int NWNX_Redis_BGSAVE(); + +/** + * BITCOUNT + * + * Count set bits in a string + * + * Time complexity: O(N) + * Annotated return value: integer + */ +int NWNX_Redis_BITCOUNT( + string key, + // Redis type: integer + int start = 0, + // Redis type: integer + int end = 0 +); + +/** + * BITFIELD + * + * Perform arbitrary bitfield integer operations on strings + * + * Time complexity: O(1) for each subcommand specified + * Annotated return value: + */ +int NWNX_Redis_BITFIELD( + string key, + // Redis type: type + string get_type = "", + // Redis type: integer + int get_offset = 0, + // Redis type: type + string set_type = "", + // Redis type: integer + int set_offset = 0, + // Redis type: integer + int set_value = 0, + // Redis type: type + string incrby_type = "", + // Redis type: integer + int incrby_offset = 0, + // Redis type: integer + int incrby_increment = 0 +); + +/** + * BITOP + * + * Perform bitwise operations between strings + * + * Time complexity: O(N) + * Annotated return value: integer + */ +int NWNX_Redis_BITOP( + string operation, + // Redis type: key + string destkey, + string key +); + +/** + * BITPOS + * + * Find first bit set or clear in a string + * + * Time complexity: O(N) + * Annotated return value: integer + */ +int NWNX_Redis_BITPOS( + string key, + // Redis type: integer + int bit, + // Redis type: integer + int start = 0, + // Redis type: integer + int end = 0 +); + +/** + * BLPOP + * + * Remove and get the first element in a list, or block until one is available + * + * Time complexity: O(1) + * Annotated return value: array + */ +int NWNX_Redis_BLPOP( + string key, + // Redis type: integer + int timeout +); + +/** + * BRPOP + * + * Remove and get the last element in a list, or block until one is available + * + * Time complexity: O(1) + * Annotated return value: array + */ +int NWNX_Redis_BRPOP( + string key, + // Redis type: integer + int timeout +); + +/** + * BRPOPLPUSH + * + * Pop a value from a list, push it to another list and return it; or block until one is available + * + * Time complexity: O(1) + * Annotated return value: bulk-string + */ +int NWNX_Redis_BRPOPLPUSH( + // Redis type: key + string source, + // Redis type: key + string destination, + // Redis type: integer + int timeout +); + +/** + * BZPOPMIN + * + * Remove and return the member with the lowest score from one or more sorted sets, or block until one is available + * + * Time complexity: O(log(N)) with N being the number of elements in the sorted set. + * Annotated return value: array + */ +int NWNX_Redis_BZPOPMIN( + string key, + // Redis type: integer + int timeout +); + +/** + * BZPOPMAX + * + * Remove and return the member with the highest score from one or more sorted sets, or block until one is available + * + * Time complexity: O(log(N)) with N being the number of elements in the sorted set. + * Annotated return value: array + */ +int NWNX_Redis_BZPOPMAX( + string key, + // Redis type: integer + int timeout +); + +/** + * CLIENT_ID + * + * Returns the client ID for the current connection + * + * Time complexity: O(1) + * Annotated return value: + */ +int NWNX_Redis_CLIENT_ID(); + +/** + * CLIENT_KILL + * + * Kill the connection of a client + * + * Time complexity: O(N) where N is the number of client connections + * Annotated return value: simple-string + */ +int NWNX_Redis_CLIENT_KILL( + string ip_port = "", + // Redis type: integer + int id_client_id = 0, + string addr_ip_port = "", + string skipme_yes_no = "" +); + +/** + * CLIENT_LIST + * + * Get the list of client connections + * + * Time complexity: O(N) where N is the number of client connections + * Annotated return value: bulk-string + */ +int NWNX_Redis_CLIENT_LIST(); + +/** + * CLIENT_GETNAME + * + * Get the current connection name + * + * Time complexity: O(1) + * Annotated return value: bulk-string + */ +int NWNX_Redis_CLIENT_GETNAME(); + +/** + * CLIENT_PAUSE + * + * Stop processing commands from clients for some time + * + * Time complexity: O(1) + * Annotated return value: simple-string + */ +int NWNX_Redis_CLIENT_PAUSE( + // Redis type: integer + int timeout +); + +/** + * CLIENT_REPLY + * + * Instruct the server whether to reply to commands + * + * Time complexity: O(1) + + * - Valid values for reply_mode: "ON", "OFF", "SKIP" + * Annotated return value: simple-string + */ +int NWNX_Redis_CLIENT_REPLY( + // Redis type: enum + string reply_mode +); + +/** + * CLIENT_SETNAME + * + * Set the current connection name + * + * Time complexity: O(1) + * Annotated return value: simple-string + */ +int NWNX_Redis_CLIENT_SETNAME( + string connection_name +); + +/** + * CLIENT_UNBLOCK + * + * Unblock a client blocked in a blocking command from a different connection + * + * Time complexity: O(log N) where N is the number of client connections + + * - Valid values for unblock_type: "TIMEOUT", "ERROR" + * Annotated return value: + */ +int NWNX_Redis_CLIENT_UNBLOCK( + string client_id, + // Redis type: enum + string unblock_type = "" +); + +/** + * CLUSTER_ADDSLOTS + * + * Assign new hash slots to receiving node + * + * Time complexity: O(N) where N is the total number of hash slot arguments + * Annotated return value: simple-string + */ +int NWNX_Redis_CLUSTER_ADDSLOTS( + // Redis type: integer + int slot +); + +/** + * CLUSTER_COUNT_FAILURE_REPORTS + * + * Return the number of failure reports active for a given node + * + * Time complexity: O(N) where N is the number of failure reports + * Annotated return value: integer + */ +int NWNX_Redis_CLUSTER_COUNT_FAILURE_REPORTS( + string node_id +); + +/** + * CLUSTER_COUNTKEYSINSLOT + * + * Return the number of local keys in the specified hash slot + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int NWNX_Redis_CLUSTER_COUNTKEYSINSLOT( + // Redis type: integer + int slot +); + +/** + * CLUSTER_DELSLOTS + * + * Set hash slots as unbound in receiving node + * + * Time complexity: O(N) where N is the total number of hash slot arguments + * Annotated return value: simple-string + */ +int NWNX_Redis_CLUSTER_DELSLOTS( + // Redis type: integer + int slot +); + +/** + * CLUSTER_FAILOVER + * + * Forces a replica to perform a manual failover of its master. + * + * Time complexity: O(1) + + * - Valid values for options: "FORCE", "TAKEOVER" + * Annotated return value: simple-string + */ +int NWNX_Redis_CLUSTER_FAILOVER( + // Redis type: enum + string options = "" +); + +/** + * CLUSTER_FORGET + * + * Remove a node from the nodes table + * + * Time complexity: O(1) + * Annotated return value: simple-string + */ +int NWNX_Redis_CLUSTER_FORGET( + string node_id +); + +/** + * CLUSTER_GETKEYSINSLOT + * + * Return local key names in the specified hash slot + * + * Time complexity: O(log(N)) where N is the number of requested keys + * Annotated return value: array + */ +int NWNX_Redis_CLUSTER_GETKEYSINSLOT( + // Redis type: integer + int slot, + // Redis type: integer + int count +); + +/** + * CLUSTER_INFO + * + * Provides info about Redis Cluster node state + * + * Time complexity: O(1) + * Annotated return value: bulk-string + */ +int NWNX_Redis_CLUSTER_INFO(); + +/** + * CLUSTER_KEYSLOT + * + * Returns the hash slot of the specified key + * + * Time complexity: O(N) where N is the number of bytes in the key + * Annotated return value: integer + */ +int NWNX_Redis_CLUSTER_KEYSLOT( + string key +); + +/** + * CLUSTER_MEET + * + * Force a node cluster to handshake with another node + * + * Time complexity: O(1) + * Annotated return value: simple-string + */ +int NWNX_Redis_CLUSTER_MEET( + string ip, + // Redis type: integer + int port +); + +/** + * CLUSTER_NODES + * + * Get Cluster config for the node + * + * Time complexity: O(N) where N is the total number of Cluster nodes + * Annotated return value: bulk-string + */ +int NWNX_Redis_CLUSTER_NODES(); + +/** + * CLUSTER_REPLICATE + * + * Reconfigure a node as a replica of the specified master node + * + * Time complexity: O(1) + * Annotated return value: simple-string + */ +int NWNX_Redis_CLUSTER_REPLICATE( + string node_id +); + +/** + * CLUSTER_RESET + * + * Reset a Redis Cluster node + * + * Time complexity: O(N) where N is the number of known nodes. The command may execute a + * FLUSHALL as a side effect. + + * - Valid values for reset_type: "HARD", "SOFT" + * Annotated return value: simple-string + */ +int NWNX_Redis_CLUSTER_RESET( + // Redis type: enum + string reset_type = "" +); + +/** + * CLUSTER_SAVECONFIG + * + * Forces the node to save cluster state on disk + * + * Time complexity: O(1) + * Annotated return value: simple-string + */ +int NWNX_Redis_CLUSTER_SAVECONFIG(); + +/** + * CLUSTER_SET_CONFIG_EPOCH + * + * Set the configuration epoch in a new node + * + * Time complexity: O(1) + * Annotated return value: simple-string + */ +int NWNX_Redis_CLUSTER_SET_CONFIG_EPOCH( + // Redis type: integer + int config_epoch +); + +/** + * CLUSTER_SETSLOT + * + * Bind a hash slot to a specific node + * + * Time complexity: O(1) + + * - Valid values for subcommand: "IMPORTING", "MIGRATING", "STABLE", "NODE" + * Annotated return value: simple-string + */ +int NWNX_Redis_CLUSTER_SETSLOT( + // Redis type: integer + int slot, + // Redis type: enum + string subcommand, + string node_id = "" +); + +/** + * CLUSTER_SLAVES + * + * List replica nodes of the specified master node + * + * Time complexity: O(1) + * Annotated return value: + */ +int NWNX_Redis_CLUSTER_SLAVES( + string node_id +); + +/** + * CLUSTER_REPLICAS + * + * List replica nodes of the specified master node + * + * Time complexity: O(1) + * Annotated return value: + */ +int NWNX_Redis_CLUSTER_REPLICAS( + string node_id +); + +/** + * CLUSTER_SLOTS + * + * Get array of Cluster slot to node mappings + * + * Time complexity: O(N) where N is the total number of Cluster nodes + * Annotated return value: array + */ +int NWNX_Redis_CLUSTER_SLOTS(); + +/** + * COMMAND + * + * Get array of Redis command details + * + * Time complexity: O(N) where N is the total number of Redis commands + * Annotated return value: array + */ +int NWNX_Redis_COMMAND(); + +/** + * COMMAND_COUNT + * + * Get total number of Redis commands + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int NWNX_Redis_COMMAND_COUNT(); + +/** + * COMMAND_GETKEYS + * + * Extract keys given a full Redis command + * + * Time complexity: O(N) where N is the number of arguments to the command + * Annotated return value: array + */ +int NWNX_Redis_COMMAND_GETKEYS(); + +/** + * COMMAND_INFO + * + * Get array of specific Redis command details + * + * Time complexity: O(N) when N is number of commands to look up + * Annotated return value: array + */ +int NWNX_Redis_COMMAND_INFO( + string command_name +); + +/** + * CONFIG_GET + * + * Get the value of a configuration parameter + * Annotated return value: array + */ +int NWNX_Redis_CONFIG_GET( + string parameter +); + +/** + * CONFIG_REWRITE + * + * Rewrite the configuration file with the in memory configuration + * Annotated return value: simple-string + */ +int NWNX_Redis_CONFIG_REWRITE(); + +/** + * CONFIG_SET + * + * Set a configuration parameter to the given value + * Annotated return value: simple-string + */ +int NWNX_Redis_CONFIG_SET( + string parameter, + string value +); + +/** + * CONFIG_RESETSTAT + * + * Reset the stats returned by INFO + * + * Time complexity: O(1) + * Annotated return value: simple-string + */ +int NWNX_Redis_CONFIG_RESETSTAT(); + +/** + * DBSIZE + * + * Return the number of keys in the selected database + * Annotated return value: integer + */ +int NWNX_Redis_DBSIZE(); + +/** + * DEBUG_OBJECT + * + * Get debugging information about a key + * Annotated return value: simple-string + */ +int NWNX_Redis_DEBUG_OBJECT( + string key +); + +/** + * DEBUG_SEGFAULT + * + * Make the server crash + * Annotated return value: simple-string + */ +int NWNX_Redis_DEBUG_SEGFAULT(); + +/** + * DECR + * + * Decrement the integer value of a key by one + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int NWNX_Redis_DECR( + string key +); + +/** + * DECRBY + * + * Decrement the integer value of a key by the given number + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int NWNX_Redis_DECRBY( + string key, + // Redis type: integer + int decrement +); + +/** + * DEL + * + * Delete a key + * + * Time complexity: O(N) where N is the number of keys that will be removed. When a key to + * remove holds a value other than a string, the individual complexity for this + * key is O(M) where M is the number of elements in the list, set, sorted set + * or hash. Removing a single key that holds a string value is O(1). + * Annotated return value: integer + */ +int NWNX_Redis_DEL( + string key +); + +/** + * DISCARD + * + * Discard all commands issued after MULTI + * Annotated return value: simple-string + */ +int NWNX_Redis_DISCARD(); + +/** + * DUMP + * + * Return a serialized version of the value stored at the specified key. + * + * Time complexity: O(1) to access the key and additional O(N*M) to serialized it, where N is + * the number of Redis objects composing the value and M their average size. + * For small string values the time complexity is thus O(1)+O(1*M) where M is + * small, so simply O(1). + * Annotated return value: bulk-string + */ +int NWNX_Redis_DUMP( + string key +); + +/** + * ECHO + * + * Echo the given string + * Annotated return value: bulk-string + */ +int NWNX_Redis_ECHO( + string message +); + +/** + * EVAL + * + * Execute a Lua script server side + * + * Time complexity: Depends on the script that is executed. + * Annotated return value: + */ +int NWNX_Redis_EVAL( + string script, + // Redis type: integer + int numkeys, + string key, + string arg +); + +/** + * EVALSHA + * + * Execute a Lua script server side + * + * Time complexity: Depends on the script that is executed. + * Annotated return value: + */ +int NWNX_Redis_EVALSHA( + string sha1, + // Redis type: integer + int numkeys, + string key, + string arg +); + +/** + * EXEC + * + * Execute all commands issued after MULTI + * Annotated return value: array + */ +int NWNX_Redis_EXEC(); + +/** + * EXISTS + * + * Determine if a key exists + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int NWNX_Redis_EXISTS( + string key +); + +/** + * EXPIRE + * + * Set a key's time to live in seconds + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int NWNX_Redis_EXPIRE( + string key, + // Redis type: integer + int seconds +); + +/** + * EXPIREAT + * + * Set the expiration for a key as a UNIX timestamp + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int NWNX_Redis_EXPIREAT( + string key, + // Redis type: posix time + string timestamp +); + +/** + * FLUSHALL + * + * Remove all keys from all databases + + * - Valid values for async: "ASYNC" + * Annotated return value: simple-string + */ +int NWNX_Redis_FLUSHALL( + // Redis type: enum + string async = "" +); + +/** + * FLUSHDB + * + * Remove all keys from the current database + + * - Valid values for async: "ASYNC" + * Annotated return value: simple-string + */ +int NWNX_Redis_FLUSHDB( + // Redis type: enum + string async = "" +); + +/** + * GEOADD + * + * Add one or more geospatial items in the geospatial index represented using a sorted set + * + * Time complexity: O(log(N)) for each item added, where N is the number of elements in the + * sorted set. + * Annotated return value: integer + */ +int NWNX_Redis_GEOADD( + string key, + // Redis type: double + float longitude, + // Redis type: double + float latitude, + string member +); + +/** + * GEOHASH + * + * Returns members of a geospatial index as standard geohash strings + * + * Time complexity: O(log(N)) for each member requested, where N is the number of elements in + * the sorted set. + * Annotated return value: array + */ +int NWNX_Redis_GEOHASH( + string key, + string member +); + +/** + * GEOPOS + * + * Returns longitude and latitude of members of a geospatial index + * + * Time complexity: O(log(N)) for each member requested, where N is the number of elements in + * the sorted set. + * Annotated return value: array + */ +int NWNX_Redis_GEOPOS( + string key, + string member +); + +/** + * GEODIST + * + * Returns the distance between two members of a geospatial index + * + * Time complexity: O(log(N)) + * Annotated return value: bulk-string + */ +int NWNX_Redis_GEODIST( + string key, + string member1, + string member2, + string unit = "" +); + +/** + * GEORADIUS + * + * Query a sorted set representing a geospatial index to fetch members matching a given maximum distance from a point + * + * Time complexity: O(N+log(M)) where N is the number of elements inside the bounding box of the + * circular area delimited by center and radius and M is the number of items + * inside the index. + + * - Valid values for unit: "m", "km", "ft", "mi" + + * - Valid values for withcoord: "WITHCOORD" + + * - Valid values for withdist: "WITHDIST" + + * - Valid values for withhash: "WITHHASH" + + * - Valid values for order: "ASC", "DESC" + * Annotated return value: array + */ +int NWNX_Redis_GEORADIUS( + string key, + // Redis type: double + float longitude, + // Redis type: double + float latitude, + // Redis type: double + float radius, + // Redis type: enum + string unit, + // Redis type: enum + string withcoord = "", + // Redis type: enum + string withdist = "", + // Redis type: enum + string withhash = "", + // Redis type: integer + int count_count = 0, + // Redis type: enum + string order = "", + // Redis type: key + string store_key = "", + // Redis type: key + string storedist_key = "" +); + +/** + * GEORADIUSBYMEMBER + * + * Query a sorted set representing a geospatial index to fetch members matching a given maximum distance from a member + * + * Time complexity: O(N+log(M)) where N is the number of elements inside the bounding box of the + * circular area delimited by center and radius and M is the number of items + * inside the index. + + * - Valid values for unit: "m", "km", "ft", "mi" + + * - Valid values for withcoord: "WITHCOORD" + + * - Valid values for withdist: "WITHDIST" + + * - Valid values for withhash: "WITHHASH" + + * - Valid values for order: "ASC", "DESC" + * Annotated return value: + */ +int NWNX_Redis_GEORADIUSBYMEMBER( + string key, + string member, + // Redis type: double + float radius, + // Redis type: enum + string unit, + // Redis type: enum + string withcoord = "", + // Redis type: enum + string withdist = "", + // Redis type: enum + string withhash = "", + // Redis type: integer + int count_count = 0, + // Redis type: enum + string order = "", + // Redis type: key + string store_key = "", + // Redis type: key + string storedist_key = "" +); + +/** + * GET + * + * Get the value of a key + * + * Time complexity: O(1) + * Annotated return value: bulk-string + */ +int NWNX_Redis_GET( + string key +); + +/** + * GETBIT + * + * Returns the bit value at offset in the string value stored at key + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int NWNX_Redis_GETBIT( + string key, + // Redis type: integer + int offset +); + +/** + * GETRANGE + * + * Get a substring of the string stored at a key + * + * Time complexity: O(N) where N is the length of the returned string. The complexity is + * ultimately determined by the returned length, but because creating a + * substring from an existing string is very cheap, it can be considered O(1) + * for small strings. + * Annotated return value: bulk-string + */ +int NWNX_Redis_GETRANGE( + string key, + // Redis type: integer + int start, + // Redis type: integer + int end +); + +/** + * GETSET + * + * Set the string value of a key and return its old value + * + * Time complexity: O(1) + * Annotated return value: bulk-string + */ +int NWNX_Redis_GETSET( + string key, + string value +); + +/** + * HDEL + * + * Delete one or more hash fields + * + * Time complexity: O(N) where N is the number of fields to be removed. + * Annotated return value: integer + */ +int NWNX_Redis_HDEL( + string key, + string field +); + +/** + * HEXISTS + * + * Determine if a hash field exists + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int NWNX_Redis_HEXISTS( + string key, + string field +); + +/** + * HGET + * + * Get the value of a hash field + * + * Time complexity: O(1) + * Annotated return value: bulk-string + */ +int NWNX_Redis_HGET( + string key, + string field +); + +/** + * HGETALL + * + * Get all the fields and values in a hash + * + * Time complexity: O(N) where N is the size of the hash. + * Annotated return value: array + */ +int NWNX_Redis_HGETALL( + string key +); + +/** + * HINCRBY + * + * Increment the integer value of a hash field by the given number + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int NWNX_Redis_HINCRBY( + string key, + string field, + // Redis type: integer + int increment +); + +/** + * HINCRBYFLOAT + * + * Increment the float value of a hash field by the given amount + * + * Time complexity: O(1) + * Annotated return value: bulk-string + */ +int NWNX_Redis_HINCRBYFLOAT( + string key, + string field, + // Redis type: double + float increment +); + +/** + * HKEYS + * + * Get all the fields in a hash + * + * Time complexity: O(N) where N is the size of the hash. + * Annotated return value: array + */ +int NWNX_Redis_HKEYS( + string key +); + +/** + * HLEN + * + * Get the number of fields in a hash + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int NWNX_Redis_HLEN( + string key +); + +/** + * HMGET + * + * Get the values of all the given hash fields + * + * Time complexity: O(N) where N is the number of fields being requested. + * Annotated return value: array + */ +int NWNX_Redis_HMGET( + string key, + string field +); + +/** + * HMSET + * + * Set multiple hash fields to multiple values + * + * Time complexity: O(N) where N is the number of fields being set. + * Annotated return value: simple-string + */ +int NWNX_Redis_HMSET( + string key, + string field, + string value +); + +/** + * HSET + * + * Set the string value of a hash field + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int NWNX_Redis_HSET( + string key, + string field, + string value +); + +/** + * HSETNX + * + * Set the value of a hash field, only if the field does not exist + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int NWNX_Redis_HSETNX( + string key, + string field, + string value +); + +/** + * HSTRLEN + * + * Get the length of the value of a hash field + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int NWNX_Redis_HSTRLEN( + string key, + string field +); + +/** + * HVALS + * + * Get all the values in a hash + * + * Time complexity: O(N) where N is the size of the hash. + * Annotated return value: array + */ +int NWNX_Redis_HVALS( + string key +); + +/** + * INCR + * + * Increment the integer value of a key by one + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int NWNX_Redis_INCR( + string key +); + +/** + * INCRBY + * + * Increment the integer value of a key by the given amount + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int NWNX_Redis_INCRBY( + string key, + // Redis type: integer + int increment +); + +/** + * INCRBYFLOAT + * + * Increment the float value of a key by the given amount + * + * Time complexity: O(1) + * Annotated return value: bulk-string + */ +int NWNX_Redis_INCRBYFLOAT( + string key, + // Redis type: double + float increment +); + +/** + * INFO + * + * Get information and statistics about the server + * Annotated return value: bulk-string + */ +int NWNX_Redis_INFO( + string section = "" +); + +/** + * KEYS + * + * Find all keys matching the given pattern + * + * Time complexity: O(N) with N being the number of keys in the database, under the assumption + * that the key names in the database and the given pattern have limited + * length. + * Annotated return value: array + */ +int NWNX_Redis_KEYS( + string pattern +); + +/** + * LASTSAVE + * + * Get the UNIX time stamp of the last successful save to disk + * Annotated return value: integer + */ +int NWNX_Redis_LASTSAVE(); + +/** + * LINDEX + * + * Get an element from a list by its index + * + * Time complexity: O(N) where N is the number of elements to traverse to get to the element at + * index. This makes asking for the first or the last element of the list O(1). + * Annotated return value: bulk-string + */ +int NWNX_Redis_LINDEX( + string key, + // Redis type: integer + int index +); + +/** + * LINSERT + * + * Insert an element before or after another element in a list + * + * Time complexity: O(N) where N is the number of elements to traverse before seeing the value + * pivot. This means that inserting somewhere on the left end on the list + * (head) can be considered O(1) and inserting somewhere on the right end + * (tail) is O(N). + + * - Valid values for where: "BEFORE", "AFTER" + * Annotated return value: integer + */ +int NWNX_Redis_LINSERT( + string key, + // Redis type: enum + string where, + string pivot, + string value +); + +/** + * LLEN + * + * Get the length of a list + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int NWNX_Redis_LLEN( + string key +); + +/** + * LPOP + * + * Remove and get the first element in a list + * + * Time complexity: O(1) + * Annotated return value: bulk-string + */ +int NWNX_Redis_LPOP( + string key +); + +/** + * LPUSH + * + * Prepend one or multiple values to a list + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int NWNX_Redis_LPUSH( + string key, + string value +); + +/** + * LPUSHX + * + * Prepend a value to a list, only if the list exists + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int NWNX_Redis_LPUSHX( + string key, + string value +); + +/** + * LRANGE + * + * Get a range of elements from a list + * + * Time complexity: O(S+N) where S is the distance of start offset from HEAD for small lists, + * from nearest end (HEAD or TAIL) for large lists; and N is the number of + * elements in the specified range. + * Annotated return value: array + */ +int NWNX_Redis_LRANGE( + string key, + // Redis type: integer + int start, + // Redis type: integer + int stop +); + +/** + * LREM + * + * Remove elements from a list + * + * Time complexity: O(N) where N is the length of the list. + * Annotated return value: integer + */ +int NWNX_Redis_LREM( + string key, + // Redis type: integer + int count, + string value +); + +/** + * LSET + * + * Set the value of an element in a list by its index + * + * Time complexity: O(N) where N is the length of the list. Setting either the first or the last + * element of the list is O(1). + * Annotated return value: simple-string + */ +int NWNX_Redis_LSET( + string key, + // Redis type: integer + int index, + string value +); + +/** + * LTRIM + * + * Trim a list to the specified range + * + * Time complexity: O(N) where N is the number of elements to be removed by the operation. + * Annotated return value: simple-string + */ +int NWNX_Redis_LTRIM( + string key, + // Redis type: integer + int start, + // Redis type: integer + int stop +); + +/** + * MEMORY_DOCTOR + * + * Outputs memory problems report + * Annotated return value: bulk-string + */ +int NWNX_Redis_MEMORY_DOCTOR(); + +/** + * MEMORY_HELP + * + * Show helpful text about the different subcommands + * Annotated return value: array + */ +int NWNX_Redis_MEMORY_HELP(); + +/** + * MEMORY_MALLOC_STATS + * + * Show allocator internal stats + * Annotated return value: bulk-string + */ +int NWNX_Redis_MEMORY_MALLOC_STATS(); + +/** + * MEMORY_PURGE + * + * Ask the allocator to release memory + * Annotated return value: simple-string + */ +int NWNX_Redis_MEMORY_PURGE(); + +/** + * MEMORY_STATS + * + * Show memory usage details + * Annotated return value: array + */ +int NWNX_Redis_MEMORY_STATS(); + +/** + * MEMORY_USAGE + * + * Estimate the memory usage of a key + * + * Time complexity: O(N) where N is the number of samples. + * Annotated return value: integer + */ +int NWNX_Redis_MEMORY_USAGE( + string key, + // Redis type: integer + int samples_count = 0 +); + +/** + * MGET + * + * Get the values of all the given keys + * + * Time complexity: O(N) where N is the number of keys to retrieve. + * Annotated return value: array + */ +int NWNX_Redis_MGET( + string key +); + +/** + * MIGRATE + * + * Atomically transfer a key from a Redis instance to another one. + * + * Time complexity: This command actually executes a DUMP+DEL in the source instance, and a + * RESTORE in the target instance. See the pages of these commands for time + * complexity. Also an O(N) data transfer between the two instances is + * performed. + + * - Valid values for key: "key", "\"\"" + + * - Valid values for copy: "COPY" + + * - Valid values for replace: "REPLACE" + * Annotated return value: simple-string + */ +int NWNX_Redis_MIGRATE( + string host, + string port, + // Redis type: enum + string key, + // Redis type: integer + int destination_db, + // Redis type: integer + int timeout, + // Redis type: enum + string copy = "", + // Redis type: enum + string replace = "", + string auth_password = "", + // Redis type: key + string keys_key = "" +); + +/** + * MONITOR + * + * Listen for all requests received by the server in real time + * Annotated return value: + */ +int NWNX_Redis_MONITOR(); + +/** + * MOVE + * + * Move a key to another database + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int NWNX_Redis_MOVE( + string key, + // Redis type: integer + int db +); + +/** + * MSET + * + * Set multiple keys to multiple values + * + * Time complexity: O(N) where N is the number of keys to set. + * Annotated return value: simple-string + */ +int NWNX_Redis_MSET( + string key, + string value +); + +/** + * MSETNX + * + * Set multiple keys to multiple values, only if none of the keys exist + * + * Time complexity: O(N) where N is the number of keys to set. + * Annotated return value: integer + */ +int NWNX_Redis_MSETNX( + string key, + string value +); + +/** + * MULTI + * + * Mark the start of a transaction block + * Annotated return value: simple-string + */ +int NWNX_Redis_MULTI(); + +/** + * OBJECT + * + * Inspect the internals of Redis objects + * + * Time complexity: O(1) for all the currently implemented subcommands. + * Annotated return value: + */ +int NWNX_Redis_OBJECT( + string subcommand, + string arguments = "" +); + +/** + * PERSIST + * + * Remove the expiration from a key + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int NWNX_Redis_PERSIST( + string key +); + +/** + * PEXPIRE + * + * Set a key's time to live in milliseconds + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int NWNX_Redis_PEXPIRE( + string key, + // Redis type: integer + int milliseconds +); + +/** + * PEXPIREAT + * + * Set the expiration for a key as a UNIX timestamp specified in milliseconds + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int NWNX_Redis_PEXPIREAT( + string key, + // Redis type: posix time + string milliseconds_timestamp +); + +/** + * PFADD + * + * Adds the specified elements to the specified HyperLogLog. + * + * Time complexity: O(1) to add every element. + * Annotated return value: integer + */ +int NWNX_Redis_PFADD( + string key, + string element +); + +/** + * PFCOUNT + * + * Return the approximated cardinality of the set(s) observed by the HyperLogLog at key(s). + * + * Time complexity: O(1) with a very small average constant time when called with a single key. + * O(N) with N being the number of keys, and much bigger constant times, when + * called with multiple keys. + * Annotated return value: integer + */ +int NWNX_Redis_PFCOUNT( + string key +); + +/** + * PFMERGE + * + * Merge N different HyperLogLogs into a single one. + * + * Time complexity: O(N) to merge N HyperLogLogs, but with high constant times. + * Annotated return value: simple-string + */ +int NWNX_Redis_PFMERGE( + // Redis type: key + string destkey, + // Redis type: key + string sourcekey +); + +/** + * PING + * + * Ping the server + * Annotated return value: simple-string + */ +int NWNX_Redis_PING( + string message = "" +); + +/** + * PSETEX + * + * Set the value and expiration in milliseconds of a key + * + * Time complexity: O(1) + * Annotated return value: + */ +int NWNX_Redis_PSETEX( + string key, + // Redis type: integer + int milliseconds, + string value +); + +/** + * PUBSUB + * + * Inspect the state of the Pub/Sub subsystem + * + * Time complexity: O(N) for the CHANNELS subcommand, where N is the number of active channels, + * and assuming constant time pattern matching (relatively short channels and + * patterns). O(N) for the NUMSUB subcommand, where N is the number of + * requested channels. O(1) for the NUMPAT subcommand. + * Annotated return value: array + */ +int NWNX_Redis_PUBSUB( + string subcommand, + string argument = "" +); + +/** + * PTTL + * + * Get the time to live for a key in milliseconds + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int NWNX_Redis_PTTL( + string key +); + +/** + * PUBLISH + * + * Post a message to a channel + * + * Time complexity: O(N+M) where N is the number of clients subscribed to the receiving channel + * and M is the total number of subscribed patterns (by any client). + * Annotated return value: integer + */ +int NWNX_Redis_PUBLISH( + string channel, + string message +); + +/** + * QUIT + * + * Close the connection + * Annotated return value: simple-string + */ +int NWNX_Redis_QUIT(); + +/** + * RANDOMKEY + * + * Return a random key from the keyspace + * + * Time complexity: O(1) + * Annotated return value: bulk-string + */ +int NWNX_Redis_RANDOMKEY(); + +/** + * READONLY + * + * Enables read queries for a connection to a cluster replica node + * + * Time complexity: O(1) + * Annotated return value: simple-string + */ +int NWNX_Redis_READONLY(); + +/** + * READWRITE + * + * Disables read queries for a connection to a cluster replica node + * + * Time complexity: O(1) + * Annotated return value: simple-string + */ +int NWNX_Redis_READWRITE(); + +/** + * RENAME + * + * Rename a key + * + * Time complexity: O(1) + * Annotated return value: simple-string + */ +int NWNX_Redis_RENAME( + string key, + // Redis type: key + string newkey +); + +/** + * RENAMENX + * + * Rename a key, only if the new key does not exist + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int NWNX_Redis_RENAMENX( + string key, + // Redis type: key + string newkey +); + +/** + * RESTORE + * + * Create a key using the provided serialized value, previously obtained using DUMP. + * + * Time complexity: O(1) to create the new key and additional O(N*M) to reconstruct the + * serialized value, where N is the number of Redis objects composing the value + * and M their average size. For small string values the time complexity is + * thus O(1)+O(1*M) where M is small, so simply O(1). However for sorted set + * values the complexity is O(N*M*log(N)) because inserting values into sorted + * sets is O(log(N)). + + * - Valid values for replace: "REPLACE" + + * - Valid values for absttl: "ABSTTL" + * Annotated return value: simple-string + */ +int NWNX_Redis_RESTORE( + string key, + // Redis type: integer + int ttl, + string serialized_value, + // Redis type: enum + string replace = "", + // Redis type: enum + string absttl = "", + // Redis type: integer + int idletime_seconds = 0, + // Redis type: integer + int freq_frequency = 0 +); + +/** + * ROLE + * + * Return the role of the instance in the context of replication + * Annotated return value: array + */ +int NWNX_Redis_ROLE(); + +/** + * RPOP + * + * Remove and get the last element in a list + * + * Time complexity: O(1) + * Annotated return value: bulk-string + */ +int NWNX_Redis_RPOP( + string key +); + +/** + * RPOPLPUSH + * + * Remove the last element in a list, prepend it to another list and return it + * + * Time complexity: O(1) + * Annotated return value: bulk-string + */ +int NWNX_Redis_RPOPLPUSH( + // Redis type: key + string source, + // Redis type: key + string destination +); + +/** + * RPUSH + * + * Append one or multiple values to a list + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int NWNX_Redis_RPUSH( + string key, + string value +); + +/** + * RPUSHX + * + * Append a value to a list, only if the list exists + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int NWNX_Redis_RPUSHX( + string key, + string value +); + +/** + * SADD + * + * Add one or more members to a set + * + * Time complexity: O(1) for each element added, so O(N) to add N elements when the command is + * called with multiple arguments. + * Annotated return value: integer + */ +int NWNX_Redis_SADD( + string key, + string member +); + +/** + * SAVE + * + * Synchronously save the dataset to disk + * Annotated return value: simple-string + */ +int NWNX_Redis_SAVE(); + +/** + * SCARD + * + * Get the number of members in a set + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int NWNX_Redis_SCARD( + string key +); + +/** + * SCRIPT_DEBUG + * + * Set the debug mode for executed scripts. + * + * Time complexity: O(1) + + * - Valid values for mode: "YES", "SYNC", "NO" + * Annotated return value: simple-string + */ +int NWNX_Redis_SCRIPT_DEBUG( + // Redis type: enum + string mode +); + +/** + * SCRIPT_EXISTS + * + * Check existence of scripts in the script cache. + * + * Time complexity: O(N) with N being the number of scripts to check (so checking a single + * script is an O(1) operation). + * Annotated return value: array + */ +int NWNX_Redis_SCRIPT_EXISTS( + string sha1 +); + +/** + * SCRIPT_FLUSH + * + * Remove all the scripts from the script cache. + * + * Time complexity: O(N) with N being the number of scripts in cache + * Annotated return value: simple-string + */ +int NWNX_Redis_SCRIPT_FLUSH(); + +/** + * SCRIPT_KILL + * + * Kill the script currently in execution. + * + * Time complexity: O(1) + * Annotated return value: simple-string + */ +int NWNX_Redis_SCRIPT_KILL(); + +/** + * SCRIPT_LOAD + * + * Load the specified Lua script into the script cache. + * + * Time complexity: O(N) with N being the length in bytes of the script body. + * Annotated return value: bulk-string + */ +int NWNX_Redis_SCRIPT_LOAD( + string script +); + +/** + * SDIFF + * + * Subtract multiple sets + * + * Time complexity: O(N) where N is the total number of elements in all given sets. + * Annotated return value: array + */ +int NWNX_Redis_SDIFF( + string key +); + +/** + * SDIFFSTORE + * + * Subtract multiple sets and store the resulting set in a key + * + * Time complexity: O(N) where N is the total number of elements in all given sets. + * Annotated return value: integer + */ +int NWNX_Redis_SDIFFSTORE( + // Redis type: key + string destination, + string key +); + +/** + * SELECT + * + * Change the selected database for the current connection + * Annotated return value: simple-string + */ +int NWNX_Redis_SELECT( + // Redis type: integer + int index +); + +/** + * SET + * + * Set the string value of a key + * + * Time complexity: O(1) + + * - Valid values for condition: "NX", "XX" + * Annotated return value: simple-string + */ +int NWNX_Redis_SET( + string key, + string value, + // Redis type: enum + string condition = "" +); + +/** + * SETBIT + * + * Sets or clears the bit at offset in the string value stored at key + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int NWNX_Redis_SETBIT( + string key, + // Redis type: integer + int offset, + string value +); + +/** + * SETEX + * + * Set the value and expiration of a key + * + * Time complexity: O(1) + * Annotated return value: simple-string + */ +int NWNX_Redis_SETEX( + string key, + // Redis type: integer + int seconds, + string value +); + +/** + * SETNX + * + * Set the value of a key, only if the key does not exist + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int NWNX_Redis_SETNX( + string key, + string value +); + +/** + * SETRANGE + * + * Overwrite part of a string at key starting at the specified offset + * + * Time complexity: O(1), not counting the time taken to copy the new string in place. Usually, + * this string is very small so the amortized complexity is O(1). Otherwise, + * complexity is O(M) with M being the length of the value argument. + * Annotated return value: integer + */ +int NWNX_Redis_SETRANGE( + string key, + // Redis type: integer + int offset, + string value +); + +/** + * SHUTDOWN + * + * Synchronously save the dataset to disk and then shut down the server + + * - Valid values for save_mode: "NOSAVE", "SAVE" + * Annotated return value: simple-string + */ +int NWNX_Redis_SHUTDOWN( + // Redis type: enum + string save_mode = "" +); + +/** + * SINTER + * + * Intersect multiple sets + * + * Time complexity: O(N*M) worst case where N is the cardinality of the smallest set and M is + * the number of sets. + * Annotated return value: array + */ +int NWNX_Redis_SINTER( + string key +); + +/** + * SINTERSTORE + * + * Intersect multiple sets and store the resulting set in a key + * + * Time complexity: O(N*M) worst case where N is the cardinality of the smallest set and M is + * the number of sets. + * Annotated return value: integer + */ +int NWNX_Redis_SINTERSTORE( + // Redis type: key + string destination, + string key +); + +/** + * SISMEMBER + * + * Determine if a given value is a member of a set + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int NWNX_Redis_SISMEMBER( + string key, + string member +); + +/** + * SLAVEOF + * + * Make the server a replica of another instance, or promote it as master. Deprecated starting with Redis 5. Use REPLICAOF instead. + * Annotated return value: simple-string + */ +int NWNX_Redis_SLAVEOF( + string host, + string port +); + +/** + * REPLICAOF + * + * Make the server a replica of another instance, or promote it as master. + * Annotated return value: simple-string + */ +int NWNX_Redis_REPLICAOF( + string host, + string port +); + +/** + * SLOWLOG + * + * Manages the Redis slow queries log + * Annotated return value: + */ +int NWNX_Redis_SLOWLOG( + string subcommand, + string argument = "" +); + +/** + * SMEMBERS + * + * Get all the members in a set + * + * Time complexity: O(N) where N is the set cardinality. + * Annotated return value: array + */ +int NWNX_Redis_SMEMBERS( + string key +); + +/** + * SMOVE + * + * Move a member from one set to another + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int NWNX_Redis_SMOVE( + // Redis type: key + string source, + // Redis type: key + string destination, + string member +); + +/** + * SORT + * + * Sort the elements in a list, set or sorted set + * + * Time complexity: O(N+M*log(M)) where N is the number of elements in the list or set to sort, + * and M the number of returned elements. When the elements are not sorted, + * complexity is currently O(N) as there is a copy step that will be avoided in + * next releases. + + * - Valid values for order: "ASC", "DESC" + + * - Valid values for sorting: "ALPHA" + * Annotated return value: array + */ +int NWNX_Redis_SORT( + string key, + // Redis type: pattern + string by_pattern = "", + // Redis type: integer + int limit_offset = 0, + // Redis type: integer + int limit_count = 0, + string get_pattern = "", + // Redis type: enum + string order = "", + // Redis type: enum + string sorting = "", + // Redis type: key + string store_destination = "" +); + +/** + * SPOP + * + * Remove and return one or multiple random members from a set + * + * Time complexity: O(1) + * Annotated return value: bulk-string + */ +int NWNX_Redis_SPOP( + string key, + // Redis type: integer + int count = 0 +); + +/** + * SRANDMEMBER + * + * Get one or multiple random members from a set + * + * Time complexity: Without the count argument O(1), otherwise O(N) where N is the absolute + * value of the passed count. + * Annotated return value: bulk-string + */ +int NWNX_Redis_SRANDMEMBER( + string key, + // Redis type: integer + int count = 0 +); + +/** + * SREM + * + * Remove one or more members from a set + * + * Time complexity: O(N) where N is the number of members to be removed. + * Annotated return value: integer + */ +int NWNX_Redis_SREM( + string key, + string member +); + +/** + * STRLEN + * + * Get the length of the value stored in a key + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int NWNX_Redis_STRLEN( + string key +); + +/** + * SUNION + * + * Add multiple sets + * + * Time complexity: O(N) where N is the total number of elements in all given sets. + * Annotated return value: array + */ +int NWNX_Redis_SUNION( + string key +); + +/** + * SUNIONSTORE + * + * Add multiple sets and store the resulting set in a key + * + * Time complexity: O(N) where N is the total number of elements in all given sets. + * Annotated return value: integer + */ +int NWNX_Redis_SUNIONSTORE( + // Redis type: key + string destination, + string key +); + +/** + * SWAPDB + * + * Swaps two Redis databases + * Annotated return value: simple-string + */ +int NWNX_Redis_SWAPDB( + // Redis type: integer + int index, + // Redis type: integer + int index_1 +); + +/** + * SYNC + * + * Internal command used for replication + * Annotated return value: + */ +int NWNX_Redis_SYNC(); + +/** + * TIME + * + * Return the current server time + * + * Time complexity: O(1) + * Annotated return value: array + */ +int NWNX_Redis_TIME(); + +/** + * TOUCH + * + * Alters the last access time of a key(s). Returns the number of existing keys specified. + * + * Time complexity: O(N) where N is the number of keys that will be touched. + * Annotated return value: integer + */ +int NWNX_Redis_TOUCH( + string key +); + +/** + * TTL + * + * Get the time to live for a key + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int NWNX_Redis_TTL( + string key +); + +/** + * TYPE + * + * Determine the type stored at key + * + * Time complexity: O(1) + * Annotated return value: simple-string + */ +int NWNX_Redis_TYPE( + string key +); + +/** + * UNLINK + * + * Delete a key asynchronously in another thread. Otherwise it is just as DEL, but non blocking. + * + * Time complexity: O(1) for each key removed regardless of its size. Then the command does O(N) + * work in a different thread in order to reclaim memory, where N is the number + * of allocations the deleted objects where composed of. + * Annotated return value: integer + */ +int NWNX_Redis_UNLINK( + string key +); + +/** + * UNWATCH + * + * Forget about all watched keys + * + * Time complexity: O(1) + * Annotated return value: simple-string + */ +int NWNX_Redis_UNWATCH(); + +/** + * WAIT + * + * Wait for the synchronous replication of all the write commands sent in the context of the current connection + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int NWNX_Redis_WAIT( + // Redis type: integer + int numreplicas, + // Redis type: integer + int timeout +); + +/** + * WATCH + * + * Watch the given keys to determine execution of the MULTI/EXEC block + * + * Time complexity: O(1) for every key. + * Annotated return value: simple-string + */ +int NWNX_Redis_WATCH( + string key +); + +/** + * ZADD + * + * Add one or more members to a sorted set, or update its score if it already exists + * + * Time complexity: O(log(N)) for each item added, where N is the number of elements in the + * sorted set. + + * - Valid values for condition: "NX", "XX" + + * - Valid values for change: "CH" + + * - Valid values for increment: "INCR" + * Annotated return value: integer + */ +int NWNX_Redis_ZADD( + string key, + // Redis type: enum + string condition = "", + // Redis type: enum + string change = "", + // Redis type: enum + string increment = "", + // Redis type: double + float score = 0.0, + string member = "" +); + +/** + * ZCARD + * + * Get the number of members in a sorted set + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int NWNX_Redis_ZCARD( + string key +); + +/** + * ZCOUNT + * + * Count the members in a sorted set with scores within the given values + * + * Time complexity: O(log(N)) with N being the number of elements in the sorted set. + * Annotated return value: integer + */ +int NWNX_Redis_ZCOUNT( + string key, + // Redis type: double + float min, + // Redis type: double + float max +); + +/** + * ZINCRBY + * + * Increment the score of a member in a sorted set + * + * Time complexity: O(log(N)) where N is the number of elements in the sorted set. + * Annotated return value: bulk-string + */ +int NWNX_Redis_ZINCRBY( + string key, + // Redis type: integer + int increment, + string member +); + +/** + * ZINTERSTORE + * + * Intersect multiple sorted sets and store the resulting sorted set in a new key + * + * Time complexity: O(N*K)+O(M*log(M)) worst case with N being the smallest input sorted set, K + * being the number of input sorted sets and M being the number of elements in + * the resulting sorted set. + + * - Valid values for aggregate_aggregate: "SUM", "MIN", "MAX" + * Annotated return value: integer + */ +int NWNX_Redis_ZINTERSTORE( + // Redis type: key + string destination, + // Redis type: integer + int numkeys, + string key, + // Redis type: integer + int weights_weight = 0, + // Redis type: enum + string aggregate_aggregate = "" +); + +/** + * ZLEXCOUNT + * + * Count the number of members in a sorted set between a given lexicographical range + * + * Time complexity: O(log(N)) with N being the number of elements in the sorted set. + * Annotated return value: integer + */ +int NWNX_Redis_ZLEXCOUNT( + string key, + string min, + string max +); + +/** + * ZPOPMAX + * + * Remove and return members with the highest scores in a sorted set + * + * Time complexity: O(log(N)*M) with N being the number of elements in the sorted set, and M + * being the number of elements popped. + * Annotated return value: array + */ +int NWNX_Redis_ZPOPMAX( + string key, + // Redis type: integer + int count = 0 +); + +/** + * ZPOPMIN + * + * Remove and return members with the lowest scores in a sorted set + * + * Time complexity: O(log(N)*M) with N being the number of elements in the sorted set, and M + * being the number of elements popped. + * Annotated return value: array + */ +int NWNX_Redis_ZPOPMIN( + string key, + // Redis type: integer + int count = 0 +); + +/** + * ZRANGE + * + * Return a range of members in a sorted set, by index + * + * Time complexity: O(log(N)+M) with N being the number of elements in the sorted set and M the + * number of elements returned. + + * - Valid values for withscores: "WITHSCORES" + * Annotated return value: array + */ +int NWNX_Redis_ZRANGE( + string key, + // Redis type: integer + int start, + // Redis type: integer + int stop, + // Redis type: enum + string withscores = "" +); + +/** + * ZRANGEBYLEX + * + * Return a range of members in a sorted set, by lexicographical range + * + * Time complexity: O(log(N)+M) with N being the number of elements in the sorted set and M the + * number of elements being returned. If M is constant (e.g. always asking for + * the first 10 elements with LIMIT), you can consider it O(log(N)). + * Annotated return value: array + */ +int NWNX_Redis_ZRANGEBYLEX( + string key, + string min, + string max, + // Redis type: integer + int limit_offset = 0, + // Redis type: integer + int limit_count = 0 +); + +/** + * ZREVRANGEBYLEX + * + * Return a range of members in a sorted set, by lexicographical range, ordered from higher to lower strings. + * + * Time complexity: O(log(N)+M) with N being the number of elements in the sorted set and M the + * number of elements being returned. If M is constant (e.g. always asking for + * the first 10 elements with LIMIT), you can consider it O(log(N)). + * Annotated return value: array + */ +int NWNX_Redis_ZREVRANGEBYLEX( + string key, + string max, + string min, + // Redis type: integer + int limit_offset = 0, + // Redis type: integer + int limit_count = 0 +); + +/** + * ZRANGEBYSCORE + * + * Return a range of members in a sorted set, by score + * + * Time complexity: O(log(N)+M) with N being the number of elements in the sorted set and M the + * number of elements being returned. If M is constant (e.g. always asking for + * the first 10 elements with LIMIT), you can consider it O(log(N)). + + * - Valid values for withscores: "WITHSCORES" + * Annotated return value: array + */ +int NWNX_Redis_ZRANGEBYSCORE( + string key, + // Redis type: double + float min, + // Redis type: double + float max, + // Redis type: enum + string withscores = "", + // Redis type: integer + int limit_offset = 0, + // Redis type: integer + int limit_count = 0 +); + +/** + * ZRANK + * + * Determine the index of a member in a sorted set + * + * Time complexity: O(log(N)) + * Annotated return value: integer + */ +int NWNX_Redis_ZRANK( + string key, + string member +); + +/** + * ZREM + * + * Remove one or more members from a sorted set + * + * Time complexity: O(M*log(N)) with N being the number of elements in the sorted set and M the + * number of elements to be removed. + * Annotated return value: integer + */ +int NWNX_Redis_ZREM( + string key, + string member +); + +/** + * ZREMRANGEBYLEX + * + * Remove all members in a sorted set between the given lexicographical range + * + * Time complexity: O(log(N)+M) with N being the number of elements in the sorted set and M the + * number of elements removed by the operation. + * Annotated return value: integer + */ +int NWNX_Redis_ZREMRANGEBYLEX( + string key, + string min, + string max +); + +/** + * ZREMRANGEBYRANK + * + * Remove all members in a sorted set within the given indexes + * + * Time complexity: O(log(N)+M) with N being the number of elements in the sorted set and M the + * number of elements removed by the operation. + * Annotated return value: integer + */ +int NWNX_Redis_ZREMRANGEBYRANK( + string key, + // Redis type: integer + int start, + // Redis type: integer + int stop +); + +/** + * ZREMRANGEBYSCORE + * + * Remove all members in a sorted set within the given scores + * + * Time complexity: O(log(N)+M) with N being the number of elements in the sorted set and M the + * number of elements removed by the operation. + * Annotated return value: integer + */ +int NWNX_Redis_ZREMRANGEBYSCORE( + string key, + // Redis type: double + float min, + // Redis type: double + float max +); + +/** + * ZREVRANGE + * + * Return a range of members in a sorted set, by index, with scores ordered from high to low + * + * Time complexity: O(log(N)+M) with N being the number of elements in the sorted set and M the + * number of elements returned. + + * - Valid values for withscores: "WITHSCORES" + * Annotated return value: array + */ +int NWNX_Redis_ZREVRANGE( + string key, + // Redis type: integer + int start, + // Redis type: integer + int stop, + // Redis type: enum + string withscores = "" +); + +/** + * ZREVRANGEBYSCORE + * + * Return a range of members in a sorted set, by score, with scores ordered from high to low + * + * Time complexity: O(log(N)+M) with N being the number of elements in the sorted set and M the + * number of elements being returned. If M is constant (e.g. always asking for + * the first 10 elements with LIMIT), you can consider it O(log(N)). + + * - Valid values for withscores: "WITHSCORES" + * Annotated return value: array + */ +int NWNX_Redis_ZREVRANGEBYSCORE( + string key, + // Redis type: double + float max, + // Redis type: double + float min, + // Redis type: enum + string withscores = "", + // Redis type: integer + int limit_offset = 0, + // Redis type: integer + int limit_count = 0 +); + +/** + * ZREVRANK + * + * Determine the index of a member in a sorted set, with scores ordered from high to low + * + * Time complexity: O(log(N)) + * Annotated return value: integer + */ +int NWNX_Redis_ZREVRANK( + string key, + string member +); + +/** + * ZSCORE + * + * Get the score associated with the given member in a sorted set + * + * Time complexity: O(1) + * Annotated return value: bulk-string + */ +int NWNX_Redis_ZSCORE( + string key, + string member +); + +/** + * ZUNIONSTORE + * + * Add multiple sorted sets and store the resulting sorted set in a new key + * + * Time complexity: O(N)+O(M log(M)) with N being the sum of the sizes of the input sorted sets, + * and M being the number of elements in the resulting sorted set. + + * - Valid values for aggregate_aggregate: "SUM", "MIN", "MAX" + * Annotated return value: integer + */ +int NWNX_Redis_ZUNIONSTORE( + // Redis type: key + string destination, + // Redis type: integer + int numkeys, + string key, + // Redis type: integer + int weights_weight = 0, + // Redis type: enum + string aggregate_aggregate = "" +); + +/** + * SCAN + * + * Incrementally iterate the keys space + * + * Time complexity: O(1) for every call. O(N) for a complete iteration, including enough command + * calls for the cursor to return back to 0. N is the number of elements inside + * the collection. + * Annotated return value: + */ +int NWNX_Redis_SCAN( + // Redis type: integer + int cursor, + // Redis type: pattern + string match_pattern = "", + // Redis type: integer + int count_count = 0, + string type_type = "" +); + +/** + * SSCAN + * + * Incrementally iterate Set elements + * + * Time complexity: O(1) for every call. O(N) for a complete iteration, including enough command + * calls for the cursor to return back to 0. N is the number of elements inside + * the collection.. + * Annotated return value: + */ +int NWNX_Redis_SSCAN( + string key, + // Redis type: integer + int cursor, + // Redis type: pattern + string match_pattern = "", + // Redis type: integer + int count_count = 0 +); + +/** + * HSCAN + * + * Incrementally iterate hash fields and associated values + * + * Time complexity: O(1) for every call. O(N) for a complete iteration, including enough command + * calls for the cursor to return back to 0. N is the number of elements inside + * the collection.. + * Annotated return value: + */ +int NWNX_Redis_HSCAN( + string key, + // Redis type: integer + int cursor, + // Redis type: pattern + string match_pattern = "", + // Redis type: integer + int count_count = 0 +); + +/** + * ZSCAN + * + * Incrementally iterate sorted sets elements and associated scores + * + * Time complexity: O(1) for every call. O(N) for a complete iteration, including enough command + * calls for the cursor to return back to 0. N is the number of elements inside + * the collection.. + * Annotated return value: + */ +int NWNX_Redis_ZSCAN( + string key, + // Redis type: integer + int cursor, + // Redis type: pattern + string match_pattern = "", + // Redis type: integer + int count_count = 0 +); + +/** + * XINFO + * + * Get information on streams and consumer groups + * + * Time complexity: O(N) with N being the number of returned items for the subcommands CONSUMERS + * and GROUPS. The STREAM subcommand is O(log N) with N being the number of + * items in the stream. + + * - Valid values for help: "HELP" + * Annotated return value: + */ +int NWNX_Redis_XINFO( + // Redis type: key + string consumers_key = "", + string consumers_groupname = "", + // Redis type: key + string groups_key = "", + // Redis type: key + string stream_key = "", + // Redis type: enum + string help = "" +); + +/** + * XADD + * + * Appends a new entry to a stream + * + * Time complexity: O(1) + * Annotated return value: bulk-string + */ +int NWNX_Redis_XADD( + string key, + string ID, + // Redis type: value + string field, + string str +); + +/** + * XTRIM + * + * Trims the stream to (approximately if '~' is passed) a certain size + * + * Time complexity: O(N), with N being the number of evicted entries. Constant times are very + * small however, since entries are organized in macro nodes containing + * multiple entries that can be released with a single deallocation. + + * - Valid values for strategy: "MAXLEN" + + * - Valid values for approx: "~" + * Annotated return value: integer + */ +int NWNX_Redis_XTRIM( + string key, + // Redis type: enum + string strategy, + // Redis type: enum + string approx = "", + // Redis type: integer + int count = 0 +); + +/** + * XDEL + * + * Removes the specified entries from the stream. Returns the number of items actually deleted, that may be different from the number of IDs passed in case certain IDs do not exist. + * + * Time complexity: O(1) for each single item to delete in the stream, regardless of the stream + * size. + * Annotated return value: integer + */ +int NWNX_Redis_XDEL( + string key, + string ID +); + +/** + * XRANGE + * + * Return a range of elements in a stream, with IDs matching the specified IDs interval + * + * Time complexity: O(N) with N being the number of elements being returned. If N is constant + * (e.g. always asking for the first 10 elements with COUNT), you can consider + * it O(1). + * Annotated return value: array + */ +int NWNX_Redis_XRANGE( + string key, + string start, + string end, + // Redis type: integer + int count_count = 0 +); + +/** + * XREVRANGE + * + * Return a range of elements in a stream, with IDs matching the specified IDs interval, in reverse order (from greater to smaller IDs) compared to XRANGE + * + * Time complexity: O(N) with N being the number of elements returned. If N is constant (e.g. + * always asking for the first 10 elements with COUNT), you can consider it + * O(1). + * Annotated return value: array + */ +int NWNX_Redis_XREVRANGE( + string key, + string end, + string start, + // Redis type: integer + int count_count = 0 +); + +/** + * XLEN + * + * Return the number of entires in a stream + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int NWNX_Redis_XLEN( + string key +); + +/** + * XREAD + * + * Return never seen elements in multiple streams, with IDs greater than the ones reported by the caller for each stream. Can block. + * + * Time complexity: For each stream mentioned: O(N) with N being the number of elements being + * returned, it menas that XREAD-ing with a fixed COUNT is O(1). Note that when + * the BLOCK option is used, XADD will pay O(M) time in order to serve the M + * clients blocked on the stream getting new data. + + * - Valid values for streams: "STREAMS" + * Annotated return value: array + */ +int NWNX_Redis_XREAD( + // Redis type: integer + int count_count = 0, + // Redis type: integer + int block_milliseconds = 0, + // Redis type: enum + string streams = "", + string key = "", + string ID = "" +); + +/** + * XGROUP + * + * Create, destroy, and manage consumer groups. + * + * Time complexity: O(1) for all the subcommands, with the exception of the DESTROY subcommand + * which takes an additional O(M) time in order to delete the M entries inside + * the consumer group pending entries list (PEL). + * Annotated return value: + */ +int NWNX_Redis_XGROUP( + // Redis type: key + string create_key = "", + string create_groupname = "", + string create_id_or__ = "", + // Redis type: key + string setid_key = "", + string setid_groupname = "", + string setid_id_or__ = "", + // Redis type: key + string destroy_key = "", + string destroy_groupname = "", + // Redis type: key + string delconsumer_key = "", + string delconsumer_groupname = "", + string delconsumer_consumername = "" +); + +/** + * XREADGROUP + * + * Return new entries from a stream using a consumer group, or access the history of the pending entries for a given consumer. Can block. + * + * Time complexity: For each stream mentioned: O(M) with M being the number of elements + * returned. If M is constant (e.g. always asking for the first 10 elements + * with COUNT), you can consider it O(1). On the other side when XREADGROUP + * blocks, XADD will pay the O(N) time in order to serve the N clients blocked + * on the stream getting new data. + + * - Valid values for noack: "NOACK" + + * - Valid values for streams: "STREAMS" + * Annotated return value: + */ +int NWNX_Redis_XREADGROUP( + string group_group, + string group_consumer, + // Redis type: integer + int count_count = 0, + // Redis type: integer + int block_milliseconds = 0, + // Redis type: enum + string noack = "", + // Redis type: enum + string streams = "", + string key = "", + string ID = "" +); + +/** + * XACK + * + * Marks a pending message as correctly processed, effectively removing it from the pending entries list of the consumer group. Return value of the command is the number of messages successfully acknowledged, that is, the IDs we were actually able to resolve in the PEL. + * + * Time complexity: O(1) for each message ID processed. + * Annotated return value: integer + */ +int NWNX_Redis_XACK( + string key, + string group, + string ID +); + +/** + * XCLAIM + * + * Changes (or acquires) ownership of a message in a consumer group, as if the message was delivered to the specified consumer. + * + * Time complexity: O(log N) with N being the number of messages in the PEL of the consumer + * group. + * Annotated return value: array + */ +int NWNX_Redis_XCLAIM( + string key, + string group, + string consumer, + string min_idle_time, + string ID, + // Redis type: integer + int idle_ms = 0, + // Redis type: integer + int time_ms_unix_time = 0, + // Redis type: integer + int retrycount_count = 0 +); + +/** + * XPENDING + * + * Return information and entries from a stream consumer group pending entries list, that are messages fetched but never acknowledged. + * + * Time complexity: O(N) with N being the number of elements returned, so asking for a small + * fixed number of entries per call is O(1). When the command returns just the + * summary it runs in O(1) time assuming the list of consumers is small, + * otherwise there is additional O(N) time needed to iterate every consumer. + * Annotated return value: array + */ +int NWNX_Redis_XPENDING( + string key, + string group, + string start = "", + string end = "", + // Redis type: integer + int count = 0, + string consumer = "" +); + + + +// Implementation below +int NWNX_Redis_APPEND( + string key, + string value +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "APPEND"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", value); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_AUTH( + string password +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "AUTH"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", password); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_BGREWRITEAOF() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "BGREWRITEAOF"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_BGSAVE() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "BGSAVE"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_BITCOUNT( + string key, + // Redis type: integer + int start = 0, + // Redis type: integer + int end = 0 +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "BITCOUNT"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + if (start != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(start)); + if (end != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(end)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_BITFIELD( + string key, + // Redis type: type + string get_type = "", + // Redis type: integer + int get_offset = 0, + // Redis type: type + string set_type = "", + // Redis type: integer + int set_offset = 0, + // Redis type: integer + int set_value = 0, + // Redis type: type + string incrby_type = "", + // Redis type: integer + int incrby_offset = 0, + // Redis type: integer + int incrby_increment = 0 +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "BITFIELD"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + if (get_type != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", get_type); + if (get_offset != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(get_offset)); + if (set_type != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", set_type); + if (set_offset != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(set_offset)); + if (set_value != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(set_value)); + if (incrby_type != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", incrby_type); + if (incrby_offset != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(incrby_offset)); + if (incrby_increment != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(incrby_increment)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_BITOP( + string operation, + // Redis type: key + string destkey, + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "BITOP"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", operation); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", destkey); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_BITPOS( + string key, + // Redis type: integer + int bit, + // Redis type: integer + int start = 0, + // Redis type: integer + int end = 0 +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "BITPOS"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(bit)); + if (start != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(start)); + if (end != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(end)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_BLPOP( + string key, + // Redis type: integer + int timeout +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "BLPOP"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(timeout)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_BRPOP( + string key, + // Redis type: integer + int timeout +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "BRPOP"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(timeout)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_BRPOPLPUSH( + // Redis type: key + string source, + // Redis type: key + string destination, + // Redis type: integer + int timeout +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "BRPOPLPUSH"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", source); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", destination); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(timeout)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_BZPOPMIN( + string key, + // Redis type: integer + int timeout +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "BZPOPMIN"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(timeout)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_BZPOPMAX( + string key, + // Redis type: integer + int timeout +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "BZPOPMAX"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(timeout)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_CLIENT_ID() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CLIENT_ID"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_CLIENT_KILL( + string ip_port = "", + // Redis type: integer + int id_client_id = 0, + string addr_ip_port = "", + string skipme_yes_no = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CLIENT_KILL"); + if (ip_port != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", ip_port); + if (id_client_id != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(id_client_id)); + if (addr_ip_port != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", addr_ip_port); + if (skipme_yes_no != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", skipme_yes_no); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_CLIENT_LIST() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CLIENT_LIST"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_CLIENT_GETNAME() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CLIENT_GETNAME"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_CLIENT_PAUSE( + // Redis type: integer + int timeout +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CLIENT_PAUSE"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(timeout)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_CLIENT_REPLY( + // Redis type: enum + string reply_mode +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CLIENT_REPLY"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", reply_mode); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_CLIENT_SETNAME( + string connection_name +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CLIENT_SETNAME"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", connection_name); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_CLIENT_UNBLOCK( + string client_id, + // Redis type: enum + string unblock_type = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CLIENT_UNBLOCK"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", client_id); + if (unblock_type != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", unblock_type); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_CLUSTER_ADDSLOTS( + // Redis type: integer + int slot +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CLUSTER_ADDSLOTS"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(slot)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_CLUSTER_COUNT_FAILURE_REPORTS( + string node_id +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CLUSTER_COUNT_FAILURE_REPORTS"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", node_id); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_CLUSTER_COUNTKEYSINSLOT( + // Redis type: integer + int slot +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CLUSTER_COUNTKEYSINSLOT"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(slot)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_CLUSTER_DELSLOTS( + // Redis type: integer + int slot +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CLUSTER_DELSLOTS"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(slot)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_CLUSTER_FAILOVER( + // Redis type: enum + string options = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CLUSTER_FAILOVER"); + if (options != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", options); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_CLUSTER_FORGET( + string node_id +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CLUSTER_FORGET"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", node_id); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_CLUSTER_GETKEYSINSLOT( + // Redis type: integer + int slot, + // Redis type: integer + int count +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CLUSTER_GETKEYSINSLOT"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(slot)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(count)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_CLUSTER_INFO() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CLUSTER_INFO"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_CLUSTER_KEYSLOT( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CLUSTER_KEYSLOT"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_CLUSTER_MEET( + string ip, + // Redis type: integer + int port +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CLUSTER_MEET"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", ip); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(port)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_CLUSTER_NODES() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CLUSTER_NODES"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_CLUSTER_REPLICATE( + string node_id +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CLUSTER_REPLICATE"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", node_id); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_CLUSTER_RESET( + // Redis type: enum + string reset_type = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CLUSTER_RESET"); + if (reset_type != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", reset_type); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_CLUSTER_SAVECONFIG() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CLUSTER_SAVECONFIG"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_CLUSTER_SET_CONFIG_EPOCH( + // Redis type: integer + int config_epoch +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CLUSTER_SET_CONFIG_EPOCH"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(config_epoch)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_CLUSTER_SETSLOT( + // Redis type: integer + int slot, + // Redis type: enum + string subcommand, + string node_id = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CLUSTER_SETSLOT"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(slot)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", subcommand); + if (node_id != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", node_id); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_CLUSTER_SLAVES( + string node_id +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CLUSTER_SLAVES"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", node_id); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_CLUSTER_REPLICAS( + string node_id +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CLUSTER_REPLICAS"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", node_id); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_CLUSTER_SLOTS() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CLUSTER_SLOTS"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_COMMAND() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "COMMAND"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_COMMAND_COUNT() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "COMMAND_COUNT"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_COMMAND_GETKEYS() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "COMMAND_GETKEYS"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_COMMAND_INFO( + string command_name +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "COMMAND_INFO"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", command_name); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_CONFIG_GET( + string parameter +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CONFIG_GET"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", parameter); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_CONFIG_REWRITE() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CONFIG_REWRITE"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_CONFIG_SET( + string parameter, + string value +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CONFIG_SET"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", parameter); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", value); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_CONFIG_RESETSTAT() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CONFIG_RESETSTAT"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_DBSIZE() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "DBSIZE"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_DEBUG_OBJECT( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "DEBUG_OBJECT"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_DEBUG_SEGFAULT() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "DEBUG_SEGFAULT"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_DECR( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "DECR"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_DECRBY( + string key, + // Redis type: integer + int decrement +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "DECRBY"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(decrement)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_DEL( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "DEL"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_DISCARD() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "DISCARD"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_DUMP( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "DUMP"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_ECHO( + string message +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "ECHO"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", message); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_EVAL( + string script, + // Redis type: integer + int numkeys, + string key, + string arg +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "EVAL"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", script); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(numkeys)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", arg); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_EVALSHA( + string sha1, + // Redis type: integer + int numkeys, + string key, + string arg +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "EVALSHA"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", sha1); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(numkeys)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", arg); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_EXEC() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "EXEC"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_EXISTS( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "EXISTS"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_EXPIRE( + string key, + // Redis type: integer + int seconds +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "EXPIRE"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(seconds)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_EXPIREAT( + string key, + // Redis type: posix time + string timestamp +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "EXPIREAT"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", timestamp); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_FLUSHALL( + // Redis type: enum + string async = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "FLUSHALL"); + if (async != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", async); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_FLUSHDB( + // Redis type: enum + string async = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "FLUSHDB"); + if (async != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", async); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_GEOADD( + string key, + // Redis type: double + float longitude, + // Redis type: double + float latitude, + string member +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "GEOADD"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", FloatToString(longitude, 0)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", FloatToString(latitude, 0)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", member); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_GEOHASH( + string key, + string member +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "GEOHASH"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", member); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_GEOPOS( + string key, + string member +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "GEOPOS"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", member); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_GEODIST( + string key, + string member1, + string member2, + string unit = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "GEODIST"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", member1); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", member2); + if (unit != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", unit); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_GEORADIUS( + string key, + // Redis type: double + float longitude, + // Redis type: double + float latitude, + // Redis type: double + float radius, + // Redis type: enum + string unit, + // Redis type: enum + string withcoord = "", + // Redis type: enum + string withdist = "", + // Redis type: enum + string withhash = "", + // Redis type: integer + int count_count = 0, + // Redis type: enum + string order = "", + // Redis type: key + string store_key = "", + // Redis type: key + string storedist_key = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "GEORADIUS"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", FloatToString(longitude, 0)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", FloatToString(latitude, 0)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", FloatToString(radius, 0)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", unit); + if (withcoord != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", withcoord); + if (withdist != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", withdist); + if (withhash != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", withhash); + if (count_count != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(count_count)); + if (order != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", order); + if (store_key != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", store_key); + if (storedist_key != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", storedist_key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_GEORADIUSBYMEMBER( + string key, + string member, + // Redis type: double + float radius, + // Redis type: enum + string unit, + // Redis type: enum + string withcoord = "", + // Redis type: enum + string withdist = "", + // Redis type: enum + string withhash = "", + // Redis type: integer + int count_count = 0, + // Redis type: enum + string order = "", + // Redis type: key + string store_key = "", + // Redis type: key + string storedist_key = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "GEORADIUSBYMEMBER"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", member); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", FloatToString(radius, 0)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", unit); + if (withcoord != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", withcoord); + if (withdist != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", withdist); + if (withhash != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", withhash); + if (count_count != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(count_count)); + if (order != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", order); + if (store_key != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", store_key); + if (storedist_key != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", storedist_key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_GET( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "GET"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_GETBIT( + string key, + // Redis type: integer + int offset +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "GETBIT"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(offset)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_GETRANGE( + string key, + // Redis type: integer + int start, + // Redis type: integer + int end +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "GETRANGE"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(start)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(end)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_GETSET( + string key, + string value +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "GETSET"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", value); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_HDEL( + string key, + string field +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "HDEL"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", field); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_HEXISTS( + string key, + string field +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "HEXISTS"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", field); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_HGET( + string key, + string field +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "HGET"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", field); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_HGETALL( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "HGETALL"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_HINCRBY( + string key, + string field, + // Redis type: integer + int increment +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "HINCRBY"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", field); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(increment)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_HINCRBYFLOAT( + string key, + string field, + // Redis type: double + float increment +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "HINCRBYFLOAT"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", field); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", FloatToString(increment, 0)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_HKEYS( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "HKEYS"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_HLEN( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "HLEN"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_HMGET( + string key, + string field +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "HMGET"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", field); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_HMSET( + string key, + string field, + string value +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "HMSET"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", field); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", value); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_HSET( + string key, + string field, + string value +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "HSET"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", field); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", value); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_HSETNX( + string key, + string field, + string value +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "HSETNX"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", field); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", value); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_HSTRLEN( + string key, + string field +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "HSTRLEN"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", field); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_HVALS( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "HVALS"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_INCR( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "INCR"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_INCRBY( + string key, + // Redis type: integer + int increment +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "INCRBY"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(increment)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_INCRBYFLOAT( + string key, + // Redis type: double + float increment +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "INCRBYFLOAT"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", FloatToString(increment, 0)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_INFO( + string section = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "INFO"); + if (section != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", section); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_KEYS( + string pattern +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "KEYS"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", pattern); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_LASTSAVE() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "LASTSAVE"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_LINDEX( + string key, + // Redis type: integer + int index +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "LINDEX"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(index)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_LINSERT( + string key, + // Redis type: enum + string where, + string pivot, + string value +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "LINSERT"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", where); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", pivot); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", value); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_LLEN( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "LLEN"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_LPOP( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "LPOP"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_LPUSH( + string key, + string value +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "LPUSH"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", value); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_LPUSHX( + string key, + string value +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "LPUSHX"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", value); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_LRANGE( + string key, + // Redis type: integer + int start, + // Redis type: integer + int stop +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "LRANGE"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(start)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(stop)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_LREM( + string key, + // Redis type: integer + int count, + string value +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "LREM"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(count)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", value); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_LSET( + string key, + // Redis type: integer + int index, + string value +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "LSET"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(index)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", value); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_LTRIM( + string key, + // Redis type: integer + int start, + // Redis type: integer + int stop +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "LTRIM"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(start)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(stop)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_MEMORY_DOCTOR() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "MEMORY_DOCTOR"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_MEMORY_HELP() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "MEMORY_HELP"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_MEMORY_MALLOC_STATS() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "MEMORY_MALLOC_STATS"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_MEMORY_PURGE() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "MEMORY_PURGE"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_MEMORY_STATS() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "MEMORY_STATS"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_MEMORY_USAGE( + string key, + // Redis type: integer + int samples_count = 0 +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "MEMORY_USAGE"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + if (samples_count != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(samples_count)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_MGET( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "MGET"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_MIGRATE( + string host, + string port, + // Redis type: enum + string key, + // Redis type: integer + int destination_db, + // Redis type: integer + int timeout, + // Redis type: enum + string copy = "", + // Redis type: enum + string replace = "", + string auth_password = "", + // Redis type: key + string keys_key = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "MIGRATE"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", host); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", port); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(destination_db)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(timeout)); + if (copy != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", copy); + if (replace != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", replace); + if (auth_password != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", auth_password); + if (keys_key != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", keys_key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_MONITOR() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "MONITOR"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_MOVE( + string key, + // Redis type: integer + int db +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "MOVE"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(db)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_MSET( + string key, + string value +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "MSET"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", value); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_MSETNX( + string key, + string value +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "MSETNX"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", value); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_MULTI() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "MULTI"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_OBJECT( + string subcommand, + string arguments = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "OBJECT"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", subcommand); + if (arguments != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", arguments); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_PERSIST( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "PERSIST"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_PEXPIRE( + string key, + // Redis type: integer + int milliseconds +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "PEXPIRE"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(milliseconds)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_PEXPIREAT( + string key, + // Redis type: posix time + string milliseconds_timestamp +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "PEXPIREAT"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", milliseconds_timestamp); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_PFADD( + string key, + string element +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "PFADD"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", element); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_PFCOUNT( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "PFCOUNT"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_PFMERGE( + // Redis type: key + string destkey, + // Redis type: key + string sourcekey +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "PFMERGE"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", destkey); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", sourcekey); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_PING( + string message = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "PING"); + if (message != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", message); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_PSETEX( + string key, + // Redis type: integer + int milliseconds, + string value +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "PSETEX"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(milliseconds)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", value); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_PUBSUB( + string subcommand, + string argument = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "PUBSUB"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", subcommand); + if (argument != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", argument); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_PTTL( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "PTTL"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_PUBLISH( + string channel, + string message +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "PUBLISH"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", channel); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", message); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_QUIT() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "QUIT"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_RANDOMKEY() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "RANDOMKEY"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_READONLY() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "READONLY"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_READWRITE() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "READWRITE"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_RENAME( + string key, + // Redis type: key + string newkey +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "RENAME"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", newkey); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_RENAMENX( + string key, + // Redis type: key + string newkey +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "RENAMENX"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", newkey); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_RESTORE( + string key, + // Redis type: integer + int ttl, + string serialized_value, + // Redis type: enum + string replace = "", + // Redis type: enum + string absttl = "", + // Redis type: integer + int idletime_seconds = 0, + // Redis type: integer + int freq_frequency = 0 +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "RESTORE"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(ttl)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", serialized_value); + if (replace != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", replace); + if (absttl != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", absttl); + if (idletime_seconds != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(idletime_seconds)); + if (freq_frequency != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(freq_frequency)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_ROLE() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "ROLE"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_RPOP( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "RPOP"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_RPOPLPUSH( + // Redis type: key + string source, + // Redis type: key + string destination +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "RPOPLPUSH"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", source); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", destination); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_RPUSH( + string key, + string value +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "RPUSH"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", value); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_RPUSHX( + string key, + string value +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "RPUSHX"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", value); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_SADD( + string key, + string member +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SADD"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", member); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_SAVE() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SAVE"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_SCARD( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SCARD"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_SCRIPT_DEBUG( + // Redis type: enum + string mode +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SCRIPT_DEBUG"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", mode); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_SCRIPT_EXISTS( + string sha1 +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SCRIPT_EXISTS"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", sha1); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_SCRIPT_FLUSH() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SCRIPT_FLUSH"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_SCRIPT_KILL() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SCRIPT_KILL"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_SCRIPT_LOAD( + string script +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SCRIPT_LOAD"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", script); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_SDIFF( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SDIFF"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_SDIFFSTORE( + // Redis type: key + string destination, + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SDIFFSTORE"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", destination); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_SELECT( + // Redis type: integer + int index +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SELECT"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(index)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_SET( + string key, + string value, + // Redis type: enum + string condition = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SET"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", value); + if (condition != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", condition); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_SETBIT( + string key, + // Redis type: integer + int offset, + string value +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SETBIT"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(offset)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", value); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_SETEX( + string key, + // Redis type: integer + int seconds, + string value +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SETEX"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(seconds)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", value); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_SETNX( + string key, + string value +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SETNX"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", value); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_SETRANGE( + string key, + // Redis type: integer + int offset, + string value +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SETRANGE"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(offset)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", value); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_SHUTDOWN( + // Redis type: enum + string save_mode = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SHUTDOWN"); + if (save_mode != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", save_mode); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_SINTER( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SINTER"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_SINTERSTORE( + // Redis type: key + string destination, + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SINTERSTORE"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", destination); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_SISMEMBER( + string key, + string member +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SISMEMBER"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", member); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_SLAVEOF( + string host, + string port +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SLAVEOF"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", host); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", port); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_REPLICAOF( + string host, + string port +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "REPLICAOF"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", host); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", port); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_SLOWLOG( + string subcommand, + string argument = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SLOWLOG"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", subcommand); + if (argument != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", argument); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_SMEMBERS( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SMEMBERS"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_SMOVE( + // Redis type: key + string source, + // Redis type: key + string destination, + string member +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SMOVE"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", source); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", destination); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", member); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_SORT( + string key, + // Redis type: pattern + string by_pattern = "", + // Redis type: integer + int limit_offset = 0, + // Redis type: integer + int limit_count = 0, + string get_pattern = "", + // Redis type: enum + string order = "", + // Redis type: enum + string sorting = "", + // Redis type: key + string store_destination = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SORT"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + if (by_pattern != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", by_pattern); + if (limit_offset != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(limit_offset)); + if (limit_count != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(limit_count)); + if (get_pattern != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", get_pattern); + if (order != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", order); + if (sorting != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", sorting); + if (store_destination != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", store_destination); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_SPOP( + string key, + // Redis type: integer + int count = 0 +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SPOP"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + if (count != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(count)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_SRANDMEMBER( + string key, + // Redis type: integer + int count = 0 +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SRANDMEMBER"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + if (count != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(count)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_SREM( + string key, + string member +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SREM"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", member); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_STRLEN( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "STRLEN"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_SUNION( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SUNION"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_SUNIONSTORE( + // Redis type: key + string destination, + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SUNIONSTORE"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", destination); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_SWAPDB( + // Redis type: integer + int index, + // Redis type: integer + int index_1 +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SWAPDB"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(index)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(index_1)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_SYNC() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SYNC"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_TIME() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "TIME"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_TOUCH( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "TOUCH"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_TTL( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "TTL"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_TYPE( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "TYPE"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_UNLINK( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "UNLINK"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_UNWATCH() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "UNWATCH"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_WAIT( + // Redis type: integer + int numreplicas, + // Redis type: integer + int timeout +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "WAIT"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(numreplicas)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(timeout)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_WATCH( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "WATCH"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_ZADD( + string key, + // Redis type: enum + string condition = "", + // Redis type: enum + string change = "", + // Redis type: enum + string increment = "", + // Redis type: double + float score = 0.0, + string member = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "ZADD"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + if (condition != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", condition); + if (change != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", change); + if (increment != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", increment); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", FloatToString(score, 0)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", member); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_ZCARD( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "ZCARD"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_ZCOUNT( + string key, + // Redis type: double + float min, + // Redis type: double + float max +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "ZCOUNT"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", FloatToString(min, 0)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", FloatToString(max, 0)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_ZINCRBY( + string key, + // Redis type: integer + int increment, + string member +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "ZINCRBY"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(increment)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", member); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_ZINTERSTORE( + // Redis type: key + string destination, + // Redis type: integer + int numkeys, + string key, + // Redis type: integer + int weights_weight = 0, + // Redis type: enum + string aggregate_aggregate = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "ZINTERSTORE"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", destination); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(numkeys)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + if (weights_weight != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(weights_weight)); + if (aggregate_aggregate != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", aggregate_aggregate); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_ZLEXCOUNT( + string key, + string min, + string max +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "ZLEXCOUNT"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", min); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", max); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_ZPOPMAX( + string key, + // Redis type: integer + int count = 0 +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "ZPOPMAX"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + if (count != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(count)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_ZPOPMIN( + string key, + // Redis type: integer + int count = 0 +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "ZPOPMIN"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + if (count != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(count)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_ZRANGE( + string key, + // Redis type: integer + int start, + // Redis type: integer + int stop, + // Redis type: enum + string withscores = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "ZRANGE"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(start)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(stop)); + if (withscores != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", withscores); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_ZRANGEBYLEX( + string key, + string min, + string max, + // Redis type: integer + int limit_offset = 0, + // Redis type: integer + int limit_count = 0 +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "ZRANGEBYLEX"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", min); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", max); + if (limit_offset != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(limit_offset)); + if (limit_count != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(limit_count)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_ZREVRANGEBYLEX( + string key, + string max, + string min, + // Redis type: integer + int limit_offset = 0, + // Redis type: integer + int limit_count = 0 +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "ZREVRANGEBYLEX"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", max); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", min); + if (limit_offset != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(limit_offset)); + if (limit_count != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(limit_count)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_ZRANGEBYSCORE( + string key, + // Redis type: double + float min, + // Redis type: double + float max, + // Redis type: enum + string withscores = "", + // Redis type: integer + int limit_offset = 0, + // Redis type: integer + int limit_count = 0 +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "ZRANGEBYSCORE"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", FloatToString(min, 0)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", FloatToString(max, 0)); + if (withscores != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", withscores); + if (limit_offset != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(limit_offset)); + if (limit_count != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(limit_count)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_ZRANK( + string key, + string member +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "ZRANK"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", member); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_ZREM( + string key, + string member +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "ZREM"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", member); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_ZREMRANGEBYLEX( + string key, + string min, + string max +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "ZREMRANGEBYLEX"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", min); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", max); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_ZREMRANGEBYRANK( + string key, + // Redis type: integer + int start, + // Redis type: integer + int stop +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "ZREMRANGEBYRANK"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(start)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(stop)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_ZREMRANGEBYSCORE( + string key, + // Redis type: double + float min, + // Redis type: double + float max +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "ZREMRANGEBYSCORE"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", FloatToString(min, 0)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", FloatToString(max, 0)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_ZREVRANGE( + string key, + // Redis type: integer + int start, + // Redis type: integer + int stop, + // Redis type: enum + string withscores = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "ZREVRANGE"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(start)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(stop)); + if (withscores != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", withscores); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_ZREVRANGEBYSCORE( + string key, + // Redis type: double + float max, + // Redis type: double + float min, + // Redis type: enum + string withscores = "", + // Redis type: integer + int limit_offset = 0, + // Redis type: integer + int limit_count = 0 +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "ZREVRANGEBYSCORE"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", FloatToString(max, 0)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", FloatToString(min, 0)); + if (withscores != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", withscores); + if (limit_offset != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(limit_offset)); + if (limit_count != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(limit_count)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_ZREVRANK( + string key, + string member +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "ZREVRANK"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", member); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_ZSCORE( + string key, + string member +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "ZSCORE"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", member); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_ZUNIONSTORE( + // Redis type: key + string destination, + // Redis type: integer + int numkeys, + string key, + // Redis type: integer + int weights_weight = 0, + // Redis type: enum + string aggregate_aggregate = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "ZUNIONSTORE"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", destination); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(numkeys)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + if (weights_weight != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(weights_weight)); + if (aggregate_aggregate != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", aggregate_aggregate); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_SCAN( + // Redis type: integer + int cursor, + // Redis type: pattern + string match_pattern = "", + // Redis type: integer + int count_count = 0, + string type_type = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SCAN"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(cursor)); + if (match_pattern != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", match_pattern); + if (count_count != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(count_count)); + if (type_type != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", type_type); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_SSCAN( + string key, + // Redis type: integer + int cursor, + // Redis type: pattern + string match_pattern = "", + // Redis type: integer + int count_count = 0 +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SSCAN"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(cursor)); + if (match_pattern != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", match_pattern); + if (count_count != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(count_count)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_HSCAN( + string key, + // Redis type: integer + int cursor, + // Redis type: pattern + string match_pattern = "", + // Redis type: integer + int count_count = 0 +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "HSCAN"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(cursor)); + if (match_pattern != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", match_pattern); + if (count_count != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(count_count)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_ZSCAN( + string key, + // Redis type: integer + int cursor, + // Redis type: pattern + string match_pattern = "", + // Redis type: integer + int count_count = 0 +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "ZSCAN"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(cursor)); + if (match_pattern != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", match_pattern); + if (count_count != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(count_count)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_XINFO( + // Redis type: key + string consumers_key = "", + string consumers_groupname = "", + // Redis type: key + string groups_key = "", + // Redis type: key + string stream_key = "", + // Redis type: enum + string help = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "XINFO"); + if (consumers_key != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", consumers_key); + if (consumers_groupname != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", consumers_groupname); + if (groups_key != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", groups_key); + if (stream_key != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", stream_key); + if (help != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", help); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_XADD( + string key, + string ID, + // Redis type: value + string field, + string str +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "XADD"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", ID); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", field); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", str); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_XTRIM( + string key, + // Redis type: enum + string strategy, + // Redis type: enum + string approx = "", + // Redis type: integer + int count = 0 +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "XTRIM"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", strategy); + if (approx != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", approx); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(count)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_XDEL( + string key, + string ID +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "XDEL"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", ID); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_XRANGE( + string key, + string start, + string end, + // Redis type: integer + int count_count = 0 +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "XRANGE"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", start); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", end); + if (count_count != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(count_count)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_XREVRANGE( + string key, + string end, + string start, + // Redis type: integer + int count_count = 0 +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "XREVRANGE"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", end); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", start); + if (count_count != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(count_count)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_XLEN( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "XLEN"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_XREAD( + // Redis type: integer + int count_count = 0, + // Redis type: integer + int block_milliseconds = 0, + // Redis type: enum + string streams = "", + string key = "", + string ID = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "XREAD"); + if (count_count != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(count_count)); + if (block_milliseconds != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(block_milliseconds)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", streams); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", ID); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_XGROUP( + // Redis type: key + string create_key = "", + string create_groupname = "", + string create_id_or__ = "", + // Redis type: key + string setid_key = "", + string setid_groupname = "", + string setid_id_or__ = "", + // Redis type: key + string destroy_key = "", + string destroy_groupname = "", + // Redis type: key + string delconsumer_key = "", + string delconsumer_groupname = "", + string delconsumer_consumername = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "XGROUP"); + if (create_key != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", create_key); + if (create_groupname != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", create_groupname); + if (create_id_or__ != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", create_id_or__); + if (setid_key != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", setid_key); + if (setid_groupname != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", setid_groupname); + if (setid_id_or__ != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", setid_id_or__); + if (destroy_key != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", destroy_key); + if (destroy_groupname != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", destroy_groupname); + if (delconsumer_key != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", delconsumer_key); + if (delconsumer_groupname != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", delconsumer_groupname); + if (delconsumer_consumername != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", delconsumer_consumername); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_XREADGROUP( + string group_group, + string group_consumer, + // Redis type: integer + int count_count = 0, + // Redis type: integer + int block_milliseconds = 0, + // Redis type: enum + string noack = "", + // Redis type: enum + string streams = "", + string key = "", + string ID = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "XREADGROUP"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", group_group); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", group_consumer); + if (count_count != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(count_count)); + if (block_milliseconds != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(block_milliseconds)); + if (noack != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", noack); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", streams); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", ID); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_XACK( + string key, + string group, + string ID +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "XACK"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", group); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", ID); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_XCLAIM( + string key, + string group, + string consumer, + string min_idle_time, + string ID, + // Redis type: integer + int idle_ms = 0, + // Redis type: integer + int time_ms_unix_time = 0, + // Redis type: integer + int retrycount_count = 0 +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "XCLAIM"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", group); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", consumer); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", min_idle_time); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", ID); + if (idle_ms != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(idle_ms)); + if (time_ms_unix_time != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(time_ms_unix_time)); + if (retrycount_count != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(retrycount_count)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int NWNX_Redis_XPENDING( + string key, + string group, + string start = "", + string end = "", + // Redis type: integer + int count = 0, + string consumer = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "XPENDING"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", group); + if (start != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", start); + if (end != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", end); + if (count != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(count)); + if (consumer != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", consumer); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +/// @} diff --git a/gamma_age_v2/nwnx_redis_lib.nss b/gamma_age_v2/nwnx_redis_lib.nss new file mode 100644 index 00000000..759c61e1 --- /dev/null +++ b/gamma_age_v2/nwnx_redis_lib.nss @@ -0,0 +1,108 @@ +/// @addtogroup redis Redis +/// @brief Allows connection and interfacing with a redis server. +/// @{ +/// @file nwnx_redis_lib.nss +/// @brief Allows connection and interfacing with a redis server. +#include "nwnx" + +/// @anchor redis_results +/// @name Redis Results +/// @{ + +/// @brief Array result +const int NWNX_REDIS_RESULT_ARRAY = 1; + +/// This never appears: it is rewritten into STRING for simplicity reasons. +/// const int NWNX_REDIS_RESULT_BULK_STRING = 2; + +/// @brief Error result +/// @note You can retrieve errors as strings. +const int NWNX_REDIS_RESULT_ERROR = 3; + +/// @brief Integer result +/// @warning This cannot represent integers above 32bit. +/// @remark Use NWNX_Redis_GetResultAsString() if you need the string representation. +const int NWNX_REDIS_RESULT_INTEGER = 4; + +/// @brief String result +const int NWNX_REDIS_RESULT_STRING = 5; + +/// @brief Null result +const int NWNX_REDIS_RESULT_NULL = 6; +/// @} + +/// Returns the result type as a int. +int NWNX_Redis_GetResultType(int resultId); + +/// @brief Gets the length of the given result. +/// @param resultId The result id. +/// @return The length or 0 if the given result wasn't a list type. +int NWNX_Redis_GetArrayLength(int resultId); + +/// @brief Gets a list entry as a string. +/// @param resultId The result id. +/// @param idx The index in the list. +/// @return The list entry, will return "" if the given result is not a list, +/// or if the requested index is out of bounds. +int NWNX_Redis_GetArrayElement(int resultId, int idx); + +/// @brief Gets the given result as a float. +/// @param resultId The result id. +/// @return The result as a float. +float NWNX_Redis_GetResultAsFloat(int resultId); + +/// @brief Gets the given result as an integer. +/// @param resultId The result id. +/// @return The result as an integer. +int NWNX_Redis_GetResultAsInt(int resultId); + +/// @brief Gets the given result as a string. +/// @param resultId The result id. +/// @return The result as a string. +string NWNX_Redis_GetResultAsString(int resultId); + +/// @} + +int NWNX_Redis_GetResultType(int resultId) +{ + NWNX_PushArgumentInt("NWNX_Redis", "GetResultType", resultId); + NWNX_CallFunction("NWNX_Redis", "GetResultType"); + return NWNX_GetReturnValueInt("NWNX_Redis", "GetResultType"); +} + +int NWNX_Redis_GetArrayLength(int resultId) +{ + NWNX_PushArgumentInt("NWNX_Redis", "GetResultArrayLength", resultId); + NWNX_CallFunction("NWNX_Redis", "GetResultArrayLength"); + return NWNX_GetReturnValueInt("NWNX_Redis", "GetResultArrayLength"); +} + +// Returns the last +int NWNX_Redis_GetArrayElement(int resultId, int idx) +{ + NWNX_PushArgumentInt("NWNX_Redis", "GetResultArrayElement", resultId); + NWNX_PushArgumentInt("NWNX_Redis", "GetResultArrayElement", idx); + NWNX_CallFunction("NWNX_Redis", "GetResultArrayElement"); + return NWNX_GetReturnValueInt("NWNX_Redis", "GetResultArrayElement"); +} + +float NWNX_Redis_GetResultAsFloat(int resultId) +{ + NWNX_PushArgumentInt("NWNX_Redis", "GetResultAsString", resultId); + NWNX_CallFunction("NWNX_Redis", "GetResultAsString"); + return StringToFloat(NWNX_GetReturnValueString("NWNX_Redis", "GetResultAsString")); +} + +int NWNX_Redis_GetResultAsInt(int resultId) +{ + NWNX_PushArgumentInt("NWNX_Redis", "GetResultAsString", resultId); + NWNX_CallFunction("NWNX_Redis", "GetResultAsString"); + return StringToInt(NWNX_GetReturnValueString("NWNX_Redis", "GetResultAsString")); +} + +string NWNX_Redis_GetResultAsString(int resultId) +{ + NWNX_PushArgumentInt("NWNX_Redis", "GetResultAsString", resultId); + NWNX_CallFunction("NWNX_Redis", "GetResultAsString"); + return NWNX_GetReturnValueString("NWNX_Redis", "GetResultAsString"); +} diff --git a/gamma_age_v2/nwnx_redis_ps.nss b/gamma_age_v2/nwnx_redis_ps.nss new file mode 100644 index 00000000..1d59dd15 --- /dev/null +++ b/gamma_age_v2/nwnx_redis_ps.nss @@ -0,0 +1,23 @@ +/// @ingroup redis +/// @brief Interface to Redis PUBSUB +/// @{ +/// @file nwnx_redis_ps.nss +#include "nwnx" + +/// A redis PUBSUB message +struct NWNX_Redis_PubSubMessageData { + string channel; ///< The channel + string message; ///< The message +}; + +/// @brief Get a PUBSUB message +/// @return A NWNX_Redis_PubSubMessageData struct. +struct NWNX_Redis_PubSubMessageData NWNX_Redis_GetPubSubMessageData() +{ + struct NWNX_Redis_PubSubMessageData ret; + NWNX_CallFunction("NWNX_Redis", "GetPubSubData"); + ret.message = NWNX_GetReturnValueString("NWNX_Redis", "GetPubSubData"); + ret.channel = NWNX_GetReturnValueString("NWNX_Redis", "GetPubSubData"); + return ret; +} +/// @} diff --git a/gamma_age_v2/nwnx_redis_short.nss b/gamma_age_v2/nwnx_redis_short.nss new file mode 100644 index 00000000..c8adc656 --- /dev/null +++ b/gamma_age_v2/nwnx_redis_short.nss @@ -0,0 +1,5900 @@ +#include "nwnx" +#include "nwnx_redis_lib" + + +// Skipping sub-command: BITFIELD/{"command"=>"OVERFLOW", "type"=>"enum", "enum"=>["WRAP", "SAT", "FAIL"], "optional"=>true} - not supported yet. +// Skipping sub-command: CLIENT_KILL/{"command"=>"TYPE", "type"=>"enum", "enum"=>["normal", "master", "slave", "pubsub"], "optional"=>true} - not supported yet. +// Skipping sub-command: CLIENT_LIST/{"command"=>"TYPE", "type"=>"enum", "enum"=>["normal", "master", "replica", "pubsub"], "optional"=>true} - not supported yet. +// Skipping sub-command: SET/{"command"=>"expiration", "type"=>"enum", "enum"=>["EX seconds", "PX milliseconds"], "optional"=>true} - not supported yet. +// Skipping XCLAIM, cannot parse argument: {"name"=>"force", "enum"=>["FORCE"], "optional"=>true} - not supported yet. +// Skipping XCLAIM, cannot parse argument: {"name"=>"justid", "enum"=>["JUSTID"], "optional"=>true} - not supported yet. +/** + * APPEND + * + * Append a value to a key + * + * Time complexity: O(1). The amortized time complexity is O(1) assuming the appended value is + * small and the already present value is of any size, since the dynamic string + * library used by Redis will double the free space available on every + * reallocation. + * Annotated return value: integer + */ +int APPEND( + string key, + string value +); + +/** + * AUTH + * + * Authenticate to the server + * Annotated return value: simple-string + */ +int AUTH( + string password +); + +/** + * BGREWRITEAOF + * + * Asynchronously rewrite the append-only file + * Annotated return value: simple-string + */ +int BGREWRITEAOF(); + +/** + * BGSAVE + * + * Asynchronously save the dataset to disk + * Annotated return value: simple-string + */ +int BGSAVE(); + +/** + * BITCOUNT + * + * Count set bits in a string + * + * Time complexity: O(N) + * Annotated return value: integer + */ +int BITCOUNT( + string key, + // Redis type: integer + int start = 0, + // Redis type: integer + int end = 0 +); + +/** + * BITFIELD + * + * Perform arbitrary bitfield integer operations on strings + * + * Time complexity: O(1) for each subcommand specified + * Annotated return value: + */ +int BITFIELD( + string key, + // Redis type: type + string get_type = "", + // Redis type: integer + int get_offset = 0, + // Redis type: type + string set_type = "", + // Redis type: integer + int set_offset = 0, + // Redis type: integer + int set_value = 0, + // Redis type: type + string incrby_type = "", + // Redis type: integer + int incrby_offset = 0, + // Redis type: integer + int incrby_increment = 0 +); + +/** + * BITOP + * + * Perform bitwise operations between strings + * + * Time complexity: O(N) + * Annotated return value: integer + */ +int BITOP( + string operation, + // Redis type: key + string destkey, + string key +); + +/** + * BITPOS + * + * Find first bit set or clear in a string + * + * Time complexity: O(N) + * Annotated return value: integer + */ +int BITPOS( + string key, + // Redis type: integer + int bit, + // Redis type: integer + int start = 0, + // Redis type: integer + int end = 0 +); + +/** + * BLPOP + * + * Remove and get the first element in a list, or block until one is available + * + * Time complexity: O(1) + * Annotated return value: array + */ +int BLPOP( + string key, + // Redis type: integer + int timeout +); + +/** + * BRPOP + * + * Remove and get the last element in a list, or block until one is available + * + * Time complexity: O(1) + * Annotated return value: array + */ +int BRPOP( + string key, + // Redis type: integer + int timeout +); + +/** + * BRPOPLPUSH + * + * Pop a value from a list, push it to another list and return it; or block until one is available + * + * Time complexity: O(1) + * Annotated return value: bulk-string + */ +int BRPOPLPUSH( + // Redis type: key + string source, + // Redis type: key + string destination, + // Redis type: integer + int timeout +); + +/** + * BZPOPMIN + * + * Remove and return the member with the lowest score from one or more sorted sets, or block until one is available + * + * Time complexity: O(log(N)) with N being the number of elements in the sorted set. + * Annotated return value: array + */ +int BZPOPMIN( + string key, + // Redis type: integer + int timeout +); + +/** + * BZPOPMAX + * + * Remove and return the member with the highest score from one or more sorted sets, or block until one is available + * + * Time complexity: O(log(N)) with N being the number of elements in the sorted set. + * Annotated return value: array + */ +int BZPOPMAX( + string key, + // Redis type: integer + int timeout +); + +/** + * CLIENT_ID + * + * Returns the client ID for the current connection + * + * Time complexity: O(1) + * Annotated return value: + */ +int CLIENT_ID(); + +/** + * CLIENT_KILL + * + * Kill the connection of a client + * + * Time complexity: O(N) where N is the number of client connections + * Annotated return value: simple-string + */ +int CLIENT_KILL( + string ip_port = "", + // Redis type: integer + int id_client_id = 0, + string addr_ip_port = "", + string skipme_yes_no = "" +); + +/** + * CLIENT_LIST + * + * Get the list of client connections + * + * Time complexity: O(N) where N is the number of client connections + * Annotated return value: bulk-string + */ +int CLIENT_LIST(); + +/** + * CLIENT_GETNAME + * + * Get the current connection name + * + * Time complexity: O(1) + * Annotated return value: bulk-string + */ +int CLIENT_GETNAME(); + +/** + * CLIENT_PAUSE + * + * Stop processing commands from clients for some time + * + * Time complexity: O(1) + * Annotated return value: simple-string + */ +int CLIENT_PAUSE( + // Redis type: integer + int timeout +); + +/** + * CLIENT_REPLY + * + * Instruct the server whether to reply to commands + * + * Time complexity: O(1) + + * - Valid values for reply_mode: "ON", "OFF", "SKIP" + * Annotated return value: simple-string + */ +int CLIENT_REPLY( + // Redis type: enum + string reply_mode +); + +/** + * CLIENT_SETNAME + * + * Set the current connection name + * + * Time complexity: O(1) + * Annotated return value: simple-string + */ +int CLIENT_SETNAME( + string connection_name +); + +/** + * CLIENT_UNBLOCK + * + * Unblock a client blocked in a blocking command from a different connection + * + * Time complexity: O(log N) where N is the number of client connections + + * - Valid values for unblock_type: "TIMEOUT", "ERROR" + * Annotated return value: + */ +int CLIENT_UNBLOCK( + string client_id, + // Redis type: enum + string unblock_type = "" +); + +/** + * CLUSTER_ADDSLOTS + * + * Assign new hash slots to receiving node + * + * Time complexity: O(N) where N is the total number of hash slot arguments + * Annotated return value: simple-string + */ +int CLUSTER_ADDSLOTS( + // Redis type: integer + int slot +); + +/** + * CLUSTER_COUNT_FAILURE_REPORTS + * + * Return the number of failure reports active for a given node + * + * Time complexity: O(N) where N is the number of failure reports + * Annotated return value: integer + */ +int CLUSTER_COUNT_FAILURE_REPORTS( + string node_id +); + +/** + * CLUSTER_COUNTKEYSINSLOT + * + * Return the number of local keys in the specified hash slot + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int CLUSTER_COUNTKEYSINSLOT( + // Redis type: integer + int slot +); + +/** + * CLUSTER_DELSLOTS + * + * Set hash slots as unbound in receiving node + * + * Time complexity: O(N) where N is the total number of hash slot arguments + * Annotated return value: simple-string + */ +int CLUSTER_DELSLOTS( + // Redis type: integer + int slot +); + +/** + * CLUSTER_FAILOVER + * + * Forces a replica to perform a manual failover of its master. + * + * Time complexity: O(1) + + * - Valid values for options: "FORCE", "TAKEOVER" + * Annotated return value: simple-string + */ +int CLUSTER_FAILOVER( + // Redis type: enum + string options = "" +); + +/** + * CLUSTER_FORGET + * + * Remove a node from the nodes table + * + * Time complexity: O(1) + * Annotated return value: simple-string + */ +int CLUSTER_FORGET( + string node_id +); + +/** + * CLUSTER_GETKEYSINSLOT + * + * Return local key names in the specified hash slot + * + * Time complexity: O(log(N)) where N is the number of requested keys + * Annotated return value: array + */ +int CLUSTER_GETKEYSINSLOT( + // Redis type: integer + int slot, + // Redis type: integer + int count +); + +/** + * CLUSTER_INFO + * + * Provides info about Redis Cluster node state + * + * Time complexity: O(1) + * Annotated return value: bulk-string + */ +int CLUSTER_INFO(); + +/** + * CLUSTER_KEYSLOT + * + * Returns the hash slot of the specified key + * + * Time complexity: O(N) where N is the number of bytes in the key + * Annotated return value: integer + */ +int CLUSTER_KEYSLOT( + string key +); + +/** + * CLUSTER_MEET + * + * Force a node cluster to handshake with another node + * + * Time complexity: O(1) + * Annotated return value: simple-string + */ +int CLUSTER_MEET( + string ip, + // Redis type: integer + int port +); + +/** + * CLUSTER_NODES + * + * Get Cluster config for the node + * + * Time complexity: O(N) where N is the total number of Cluster nodes + * Annotated return value: bulk-string + */ +int CLUSTER_NODES(); + +/** + * CLUSTER_REPLICATE + * + * Reconfigure a node as a replica of the specified master node + * + * Time complexity: O(1) + * Annotated return value: simple-string + */ +int CLUSTER_REPLICATE( + string node_id +); + +/** + * CLUSTER_RESET + * + * Reset a Redis Cluster node + * + * Time complexity: O(N) where N is the number of known nodes. The command may execute a + * FLUSHALL as a side effect. + + * - Valid values for reset_type: "HARD", "SOFT" + * Annotated return value: simple-string + */ +int CLUSTER_RESET( + // Redis type: enum + string reset_type = "" +); + +/** + * CLUSTER_SAVECONFIG + * + * Forces the node to save cluster state on disk + * + * Time complexity: O(1) + * Annotated return value: simple-string + */ +int CLUSTER_SAVECONFIG(); + +/** + * CLUSTER_SET_CONFIG_EPOCH + * + * Set the configuration epoch in a new node + * + * Time complexity: O(1) + * Annotated return value: simple-string + */ +int CLUSTER_SET_CONFIG_EPOCH( + // Redis type: integer + int config_epoch +); + +/** + * CLUSTER_SETSLOT + * + * Bind a hash slot to a specific node + * + * Time complexity: O(1) + + * - Valid values for subcommand: "IMPORTING", "MIGRATING", "STABLE", "NODE" + * Annotated return value: simple-string + */ +int CLUSTER_SETSLOT( + // Redis type: integer + int slot, + // Redis type: enum + string subcommand, + string node_id = "" +); + +/** + * CLUSTER_SLAVES + * + * List replica nodes of the specified master node + * + * Time complexity: O(1) + * Annotated return value: + */ +int CLUSTER_SLAVES( + string node_id +); + +/** + * CLUSTER_REPLICAS + * + * List replica nodes of the specified master node + * + * Time complexity: O(1) + * Annotated return value: + */ +int CLUSTER_REPLICAS( + string node_id +); + +/** + * CLUSTER_SLOTS + * + * Get array of Cluster slot to node mappings + * + * Time complexity: O(N) where N is the total number of Cluster nodes + * Annotated return value: array + */ +int CLUSTER_SLOTS(); + +/** + * COMMAND + * + * Get array of Redis command details + * + * Time complexity: O(N) where N is the total number of Redis commands + * Annotated return value: array + */ +int COMMAND(); + +/** + * COMMAND_COUNT + * + * Get total number of Redis commands + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int COMMAND_COUNT(); + +/** + * COMMAND_GETKEYS + * + * Extract keys given a full Redis command + * + * Time complexity: O(N) where N is the number of arguments to the command + * Annotated return value: array + */ +int COMMAND_GETKEYS(); + +/** + * COMMAND_INFO + * + * Get array of specific Redis command details + * + * Time complexity: O(N) when N is number of commands to look up + * Annotated return value: array + */ +int COMMAND_INFO( + string command_name +); + +/** + * CONFIG_GET + * + * Get the value of a configuration parameter + * Annotated return value: array + */ +int CONFIG_GET( + string parameter +); + +/** + * CONFIG_REWRITE + * + * Rewrite the configuration file with the in memory configuration + * Annotated return value: simple-string + */ +int CONFIG_REWRITE(); + +/** + * CONFIG_SET + * + * Set a configuration parameter to the given value + * Annotated return value: simple-string + */ +int CONFIG_SET( + string parameter, + string value +); + +/** + * CONFIG_RESETSTAT + * + * Reset the stats returned by INFO + * + * Time complexity: O(1) + * Annotated return value: simple-string + */ +int CONFIG_RESETSTAT(); + +/** + * DBSIZE + * + * Return the number of keys in the selected database + * Annotated return value: integer + */ +int DBSIZE(); + +/** + * DEBUG_OBJECT + * + * Get debugging information about a key + * Annotated return value: simple-string + */ +int DEBUG_OBJECT( + string key +); + +/** + * DEBUG_SEGFAULT + * + * Make the server crash + * Annotated return value: simple-string + */ +int DEBUG_SEGFAULT(); + +/** + * DECR + * + * Decrement the integer value of a key by one + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int DECR( + string key +); + +/** + * DECRBY + * + * Decrement the integer value of a key by the given number + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int DECRBY( + string key, + // Redis type: integer + int decrement +); + +/** + * DEL + * + * Delete a key + * + * Time complexity: O(N) where N is the number of keys that will be removed. When a key to + * remove holds a value other than a string, the individual complexity for this + * key is O(M) where M is the number of elements in the list, set, sorted set + * or hash. Removing a single key that holds a string value is O(1). + * Annotated return value: integer + */ +int DEL( + string key +); + +/** + * DISCARD + * + * Discard all commands issued after MULTI + * Annotated return value: simple-string + */ +int DISCARD(); + +/** + * DUMP + * + * Return a serialized version of the value stored at the specified key. + * + * Time complexity: O(1) to access the key and additional O(N*M) to serialized it, where N is + * the number of Redis objects composing the value and M their average size. + * For small string values the time complexity is thus O(1)+O(1*M) where M is + * small, so simply O(1). + * Annotated return value: bulk-string + */ +int DUMP( + string key +); + +/** + * ECHO + * + * Echo the given string + * Annotated return value: bulk-string + */ +int ECHO( + string message +); + +/** + * EVAL + * + * Execute a Lua script server side + * + * Time complexity: Depends on the script that is executed. + * Annotated return value: + */ +int EVAL( + string script, + // Redis type: integer + int numkeys, + string key, + string arg +); + +/** + * EVALSHA + * + * Execute a Lua script server side + * + * Time complexity: Depends on the script that is executed. + * Annotated return value: + */ +int EVALSHA( + string sha1, + // Redis type: integer + int numkeys, + string key, + string arg +); + +/** + * EXEC + * + * Execute all commands issued after MULTI + * Annotated return value: array + */ +int EXEC(); + +/** + * EXISTS + * + * Determine if a key exists + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int EXISTS( + string key +); + +/** + * EXPIRE + * + * Set a key's time to live in seconds + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int EXPIRE( + string key, + // Redis type: integer + int seconds +); + +/** + * EXPIREAT + * + * Set the expiration for a key as a UNIX timestamp + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int EXPIREAT( + string key, + // Redis type: posix time + string timestamp +); + +/** + * FLUSHALL + * + * Remove all keys from all databases + + * - Valid values for async: "ASYNC" + * Annotated return value: simple-string + */ +int FLUSHALL( + // Redis type: enum + string async = "" +); + +/** + * FLUSHDB + * + * Remove all keys from the current database + + * - Valid values for async: "ASYNC" + * Annotated return value: simple-string + */ +int FLUSHDB( + // Redis type: enum + string async = "" +); + +/** + * GEOADD + * + * Add one or more geospatial items in the geospatial index represented using a sorted set + * + * Time complexity: O(log(N)) for each item added, where N is the number of elements in the + * sorted set. + * Annotated return value: integer + */ +int GEOADD( + string key, + // Redis type: double + float longitude, + // Redis type: double + float latitude, + string member +); + +/** + * GEOHASH + * + * Returns members of a geospatial index as standard geohash strings + * + * Time complexity: O(log(N)) for each member requested, where N is the number of elements in + * the sorted set. + * Annotated return value: array + */ +int GEOHASH( + string key, + string member +); + +/** + * GEOPOS + * + * Returns longitude and latitude of members of a geospatial index + * + * Time complexity: O(log(N)) for each member requested, where N is the number of elements in + * the sorted set. + * Annotated return value: array + */ +int GEOPOS( + string key, + string member +); + +/** + * GEODIST + * + * Returns the distance between two members of a geospatial index + * + * Time complexity: O(log(N)) + * Annotated return value: bulk-string + */ +int GEODIST( + string key, + string member1, + string member2, + string unit = "" +); + +/** + * GEORADIUS + * + * Query a sorted set representing a geospatial index to fetch members matching a given maximum distance from a point + * + * Time complexity: O(N+log(M)) where N is the number of elements inside the bounding box of the + * circular area delimited by center and radius and M is the number of items + * inside the index. + + * - Valid values for unit: "m", "km", "ft", "mi" + + * - Valid values for withcoord: "WITHCOORD" + + * - Valid values for withdist: "WITHDIST" + + * - Valid values for withhash: "WITHHASH" + + * - Valid values for order: "ASC", "DESC" + * Annotated return value: array + */ +int GEORADIUS( + string key, + // Redis type: double + float longitude, + // Redis type: double + float latitude, + // Redis type: double + float radius, + // Redis type: enum + string unit, + // Redis type: enum + string withcoord = "", + // Redis type: enum + string withdist = "", + // Redis type: enum + string withhash = "", + // Redis type: integer + int count_count = 0, + // Redis type: enum + string order = "", + // Redis type: key + string store_key = "", + // Redis type: key + string storedist_key = "" +); + +/** + * GEORADIUSBYMEMBER + * + * Query a sorted set representing a geospatial index to fetch members matching a given maximum distance from a member + * + * Time complexity: O(N+log(M)) where N is the number of elements inside the bounding box of the + * circular area delimited by center and radius and M is the number of items + * inside the index. + + * - Valid values for unit: "m", "km", "ft", "mi" + + * - Valid values for withcoord: "WITHCOORD" + + * - Valid values for withdist: "WITHDIST" + + * - Valid values for withhash: "WITHHASH" + + * - Valid values for order: "ASC", "DESC" + * Annotated return value: + */ +int GEORADIUSBYMEMBER( + string key, + string member, + // Redis type: double + float radius, + // Redis type: enum + string unit, + // Redis type: enum + string withcoord = "", + // Redis type: enum + string withdist = "", + // Redis type: enum + string withhash = "", + // Redis type: integer + int count_count = 0, + // Redis type: enum + string order = "", + // Redis type: key + string store_key = "", + // Redis type: key + string storedist_key = "" +); + +/** + * GET + * + * Get the value of a key + * + * Time complexity: O(1) + * Annotated return value: bulk-string + */ +int GET( + string key +); + +/** + * GETBIT + * + * Returns the bit value at offset in the string value stored at key + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int GETBIT( + string key, + // Redis type: integer + int offset +); + +/** + * GETRANGE + * + * Get a substring of the string stored at a key + * + * Time complexity: O(N) where N is the length of the returned string. The complexity is + * ultimately determined by the returned length, but because creating a + * substring from an existing string is very cheap, it can be considered O(1) + * for small strings. + * Annotated return value: bulk-string + */ +int GETRANGE( + string key, + // Redis type: integer + int start, + // Redis type: integer + int end +); + +/** + * GETSET + * + * Set the string value of a key and return its old value + * + * Time complexity: O(1) + * Annotated return value: bulk-string + */ +int GETSET( + string key, + string value +); + +/** + * HDEL + * + * Delete one or more hash fields + * + * Time complexity: O(N) where N is the number of fields to be removed. + * Annotated return value: integer + */ +int HDEL( + string key, + string field +); + +/** + * HEXISTS + * + * Determine if a hash field exists + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int HEXISTS( + string key, + string field +); + +/** + * HGET + * + * Get the value of a hash field + * + * Time complexity: O(1) + * Annotated return value: bulk-string + */ +int HGET( + string key, + string field +); + +/** + * HGETALL + * + * Get all the fields and values in a hash + * + * Time complexity: O(N) where N is the size of the hash. + * Annotated return value: array + */ +int HGETALL( + string key +); + +/** + * HINCRBY + * + * Increment the integer value of a hash field by the given number + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int HINCRBY( + string key, + string field, + // Redis type: integer + int increment +); + +/** + * HINCRBYFLOAT + * + * Increment the float value of a hash field by the given amount + * + * Time complexity: O(1) + * Annotated return value: bulk-string + */ +int HINCRBYFLOAT( + string key, + string field, + // Redis type: double + float increment +); + +/** + * HKEYS + * + * Get all the fields in a hash + * + * Time complexity: O(N) where N is the size of the hash. + * Annotated return value: array + */ +int HKEYS( + string key +); + +/** + * HLEN + * + * Get the number of fields in a hash + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int HLEN( + string key +); + +/** + * HMGET + * + * Get the values of all the given hash fields + * + * Time complexity: O(N) where N is the number of fields being requested. + * Annotated return value: array + */ +int HMGET( + string key, + string field +); + +/** + * HMSET + * + * Set multiple hash fields to multiple values + * + * Time complexity: O(N) where N is the number of fields being set. + * Annotated return value: simple-string + */ +int HMSET( + string key, + string field, + string value +); + +/** + * HSET + * + * Set the string value of a hash field + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int HSET( + string key, + string field, + string value +); + +/** + * HSETNX + * + * Set the value of a hash field, only if the field does not exist + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int HSETNX( + string key, + string field, + string value +); + +/** + * HSTRLEN + * + * Get the length of the value of a hash field + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int HSTRLEN( + string key, + string field +); + +/** + * HVALS + * + * Get all the values in a hash + * + * Time complexity: O(N) where N is the size of the hash. + * Annotated return value: array + */ +int HVALS( + string key +); + +/** + * INCR + * + * Increment the integer value of a key by one + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int INCR( + string key +); + +/** + * INCRBY + * + * Increment the integer value of a key by the given amount + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int INCRBY( + string key, + // Redis type: integer + int increment +); + +/** + * INCRBYFLOAT + * + * Increment the float value of a key by the given amount + * + * Time complexity: O(1) + * Annotated return value: bulk-string + */ +int INCRBYFLOAT( + string key, + // Redis type: double + float increment +); + +/** + * INFO + * + * Get information and statistics about the server + * Annotated return value: bulk-string + */ +int INFO( + string section = "" +); + +/** + * KEYS + * + * Find all keys matching the given pattern + * + * Time complexity: O(N) with N being the number of keys in the database, under the assumption + * that the key names in the database and the given pattern have limited + * length. + * Annotated return value: array + */ +int KEYS( + string pattern +); + +/** + * LASTSAVE + * + * Get the UNIX time stamp of the last successful save to disk + * Annotated return value: integer + */ +int LASTSAVE(); + +/** + * LINDEX + * + * Get an element from a list by its index + * + * Time complexity: O(N) where N is the number of elements to traverse to get to the element at + * index. This makes asking for the first or the last element of the list O(1). + * Annotated return value: bulk-string + */ +int LINDEX( + string key, + // Redis type: integer + int index +); + +/** + * LINSERT + * + * Insert an element before or after another element in a list + * + * Time complexity: O(N) where N is the number of elements to traverse before seeing the value + * pivot. This means that inserting somewhere on the left end on the list + * (head) can be considered O(1) and inserting somewhere on the right end + * (tail) is O(N). + + * - Valid values for where: "BEFORE", "AFTER" + * Annotated return value: integer + */ +int LINSERT( + string key, + // Redis type: enum + string where, + string pivot, + string value +); + +/** + * LLEN + * + * Get the length of a list + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int LLEN( + string key +); + +/** + * LPOP + * + * Remove and get the first element in a list + * + * Time complexity: O(1) + * Annotated return value: bulk-string + */ +int LPOP( + string key +); + +/** + * LPUSH + * + * Prepend one or multiple values to a list + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int LPUSH( + string key, + string value +); + +/** + * LPUSHX + * + * Prepend a value to a list, only if the list exists + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int LPUSHX( + string key, + string value +); + +/** + * LRANGE + * + * Get a range of elements from a list + * + * Time complexity: O(S+N) where S is the distance of start offset from HEAD for small lists, + * from nearest end (HEAD or TAIL) for large lists; and N is the number of + * elements in the specified range. + * Annotated return value: array + */ +int LRANGE( + string key, + // Redis type: integer + int start, + // Redis type: integer + int stop +); + +/** + * LREM + * + * Remove elements from a list + * + * Time complexity: O(N) where N is the length of the list. + * Annotated return value: integer + */ +int LREM( + string key, + // Redis type: integer + int count, + string value +); + +/** + * LSET + * + * Set the value of an element in a list by its index + * + * Time complexity: O(N) where N is the length of the list. Setting either the first or the last + * element of the list is O(1). + * Annotated return value: simple-string + */ +int LSET( + string key, + // Redis type: integer + int index, + string value +); + +/** + * LTRIM + * + * Trim a list to the specified range + * + * Time complexity: O(N) where N is the number of elements to be removed by the operation. + * Annotated return value: simple-string + */ +int LTRIM( + string key, + // Redis type: integer + int start, + // Redis type: integer + int stop +); + +/** + * MEMORY_DOCTOR + * + * Outputs memory problems report + * Annotated return value: bulk-string + */ +int MEMORY_DOCTOR(); + +/** + * MEMORY_HELP + * + * Show helpful text about the different subcommands + * Annotated return value: array + */ +int MEMORY_HELP(); + +/** + * MEMORY_MALLOC_STATS + * + * Show allocator internal stats + * Annotated return value: bulk-string + */ +int MEMORY_MALLOC_STATS(); + +/** + * MEMORY_PURGE + * + * Ask the allocator to release memory + * Annotated return value: simple-string + */ +int MEMORY_PURGE(); + +/** + * MEMORY_STATS + * + * Show memory usage details + * Annotated return value: array + */ +int MEMORY_STATS(); + +/** + * MEMORY_USAGE + * + * Estimate the memory usage of a key + * + * Time complexity: O(N) where N is the number of samples. + * Annotated return value: integer + */ +int MEMORY_USAGE( + string key, + // Redis type: integer + int samples_count = 0 +); + +/** + * MGET + * + * Get the values of all the given keys + * + * Time complexity: O(N) where N is the number of keys to retrieve. + * Annotated return value: array + */ +int MGET( + string key +); + +/** + * MIGRATE + * + * Atomically transfer a key from a Redis instance to another one. + * + * Time complexity: This command actually executes a DUMP+DEL in the source instance, and a + * RESTORE in the target instance. See the pages of these commands for time + * complexity. Also an O(N) data transfer between the two instances is + * performed. + + * - Valid values for key: "key", "\"\"" + + * - Valid values for copy: "COPY" + + * - Valid values for replace: "REPLACE" + * Annotated return value: simple-string + */ +int MIGRATE( + string host, + string port, + // Redis type: enum + string key, + // Redis type: integer + int destination_db, + // Redis type: integer + int timeout, + // Redis type: enum + string copy = "", + // Redis type: enum + string replace = "", + string auth_password = "", + // Redis type: key + string keys_key = "" +); + +/** + * MONITOR + * + * Listen for all requests received by the server in real time + * Annotated return value: + */ +int MONITOR(); + +/** + * MOVE + * + * Move a key to another database + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int MOVE( + string key, + // Redis type: integer + int db +); + +/** + * MSET + * + * Set multiple keys to multiple values + * + * Time complexity: O(N) where N is the number of keys to set. + * Annotated return value: simple-string + */ +int MSET( + string key, + string value +); + +/** + * MSETNX + * + * Set multiple keys to multiple values, only if none of the keys exist + * + * Time complexity: O(N) where N is the number of keys to set. + * Annotated return value: integer + */ +int MSETNX( + string key, + string value +); + +/** + * MULTI + * + * Mark the start of a transaction block + * Annotated return value: simple-string + */ +int MULTI(); + +/** + * OBJECT + * + * Inspect the internals of Redis objects + * + * Time complexity: O(1) for all the currently implemented subcommands. + * Annotated return value: + */ +int OBJECT( + string subcommand, + string arguments = "" +); + +/** + * PERSIST + * + * Remove the expiration from a key + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int PERSIST( + string key +); + +/** + * PEXPIRE + * + * Set a key's time to live in milliseconds + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int PEXPIRE( + string key, + // Redis type: integer + int milliseconds +); + +/** + * PEXPIREAT + * + * Set the expiration for a key as a UNIX timestamp specified in milliseconds + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int PEXPIREAT( + string key, + // Redis type: posix time + string milliseconds_timestamp +); + +/** + * PFADD + * + * Adds the specified elements to the specified HyperLogLog. + * + * Time complexity: O(1) to add every element. + * Annotated return value: integer + */ +int PFADD( + string key, + string element +); + +/** + * PFCOUNT + * + * Return the approximated cardinality of the set(s) observed by the HyperLogLog at key(s). + * + * Time complexity: O(1) with a very small average constant time when called with a single key. + * O(N) with N being the number of keys, and much bigger constant times, when + * called with multiple keys. + * Annotated return value: integer + */ +int PFCOUNT( + string key +); + +/** + * PFMERGE + * + * Merge N different HyperLogLogs into a single one. + * + * Time complexity: O(N) to merge N HyperLogLogs, but with high constant times. + * Annotated return value: simple-string + */ +int PFMERGE( + // Redis type: key + string destkey, + // Redis type: key + string sourcekey +); + +/** + * PING + * + * Ping the server + * Annotated return value: simple-string + */ +int PING( + string message = "" +); + +/** + * PSETEX + * + * Set the value and expiration in milliseconds of a key + * + * Time complexity: O(1) + * Annotated return value: + */ +int PSETEX( + string key, + // Redis type: integer + int milliseconds, + string value +); + +/** + * PUBSUB + * + * Inspect the state of the Pub/Sub subsystem + * + * Time complexity: O(N) for the CHANNELS subcommand, where N is the number of active channels, + * and assuming constant time pattern matching (relatively short channels and + * patterns). O(N) for the NUMSUB subcommand, where N is the number of + * requested channels. O(1) for the NUMPAT subcommand. + * Annotated return value: array + */ +int PUBSUB( + string subcommand, + string argument = "" +); + +/** + * PTTL + * + * Get the time to live for a key in milliseconds + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int PTTL( + string key +); + +/** + * PUBLISH + * + * Post a message to a channel + * + * Time complexity: O(N+M) where N is the number of clients subscribed to the receiving channel + * and M is the total number of subscribed patterns (by any client). + * Annotated return value: integer + */ +int PUBLISH( + string channel, + string message +); + +/** + * QUIT + * + * Close the connection + * Annotated return value: simple-string + */ +int QUIT(); + +/** + * RANDOMKEY + * + * Return a random key from the keyspace + * + * Time complexity: O(1) + * Annotated return value: bulk-string + */ +int RANDOMKEY(); + +/** + * READONLY + * + * Enables read queries for a connection to a cluster replica node + * + * Time complexity: O(1) + * Annotated return value: simple-string + */ +int READONLY(); + +/** + * READWRITE + * + * Disables read queries for a connection to a cluster replica node + * + * Time complexity: O(1) + * Annotated return value: simple-string + */ +int READWRITE(); + +/** + * RENAME + * + * Rename a key + * + * Time complexity: O(1) + * Annotated return value: simple-string + */ +int RENAME( + string key, + // Redis type: key + string newkey +); + +/** + * RENAMENX + * + * Rename a key, only if the new key does not exist + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int RENAMENX( + string key, + // Redis type: key + string newkey +); + +/** + * RESTORE + * + * Create a key using the provided serialized value, previously obtained using DUMP. + * + * Time complexity: O(1) to create the new key and additional O(N*M) to reconstruct the + * serialized value, where N is the number of Redis objects composing the value + * and M their average size. For small string values the time complexity is + * thus O(1)+O(1*M) where M is small, so simply O(1). However for sorted set + * values the complexity is O(N*M*log(N)) because inserting values into sorted + * sets is O(log(N)). + + * - Valid values for replace: "REPLACE" + + * - Valid values for absttl: "ABSTTL" + * Annotated return value: simple-string + */ +int RESTORE( + string key, + // Redis type: integer + int ttl, + string serialized_value, + // Redis type: enum + string replace = "", + // Redis type: enum + string absttl = "", + // Redis type: integer + int idletime_seconds = 0, + // Redis type: integer + int freq_frequency = 0 +); + +/** + * ROLE + * + * Return the role of the instance in the context of replication + * Annotated return value: array + */ +int ROLE(); + +/** + * RPOP + * + * Remove and get the last element in a list + * + * Time complexity: O(1) + * Annotated return value: bulk-string + */ +int RPOP( + string key +); + +/** + * RPOPLPUSH + * + * Remove the last element in a list, prepend it to another list and return it + * + * Time complexity: O(1) + * Annotated return value: bulk-string + */ +int RPOPLPUSH( + // Redis type: key + string source, + // Redis type: key + string destination +); + +/** + * RPUSH + * + * Append one or multiple values to a list + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int RPUSH( + string key, + string value +); + +/** + * RPUSHX + * + * Append a value to a list, only if the list exists + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int RPUSHX( + string key, + string value +); + +/** + * SADD + * + * Add one or more members to a set + * + * Time complexity: O(1) for each element added, so O(N) to add N elements when the command is + * called with multiple arguments. + * Annotated return value: integer + */ +int SADD( + string key, + string member +); + +/** + * SAVE + * + * Synchronously save the dataset to disk + * Annotated return value: simple-string + */ +int SAVE(); + +/** + * SCARD + * + * Get the number of members in a set + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int SCARD( + string key +); + +/** + * SCRIPT_DEBUG + * + * Set the debug mode for executed scripts. + * + * Time complexity: O(1) + + * - Valid values for mode: "YES", "SYNC", "NO" + * Annotated return value: simple-string + */ +int SCRIPT_DEBUG( + // Redis type: enum + string mode +); + +/** + * SCRIPT_EXISTS + * + * Check existence of scripts in the script cache. + * + * Time complexity: O(N) with N being the number of scripts to check (so checking a single + * script is an O(1) operation). + * Annotated return value: array + */ +int SCRIPT_EXISTS( + string sha1 +); + +/** + * SCRIPT_FLUSH + * + * Remove all the scripts from the script cache. + * + * Time complexity: O(N) with N being the number of scripts in cache + * Annotated return value: simple-string + */ +int SCRIPT_FLUSH(); + +/** + * SCRIPT_KILL + * + * Kill the script currently in execution. + * + * Time complexity: O(1) + * Annotated return value: simple-string + */ +int SCRIPT_KILL(); + +/** + * SCRIPT_LOAD + * + * Load the specified Lua script into the script cache. + * + * Time complexity: O(N) with N being the length in bytes of the script body. + * Annotated return value: bulk-string + */ +int SCRIPT_LOAD( + string script +); + +/** + * SDIFF + * + * Subtract multiple sets + * + * Time complexity: O(N) where N is the total number of elements in all given sets. + * Annotated return value: array + */ +int SDIFF( + string key +); + +/** + * SDIFFSTORE + * + * Subtract multiple sets and store the resulting set in a key + * + * Time complexity: O(N) where N is the total number of elements in all given sets. + * Annotated return value: integer + */ +int SDIFFSTORE( + // Redis type: key + string destination, + string key +); + +/** + * SELECT + * + * Change the selected database for the current connection + * Annotated return value: simple-string + */ +int SELECT( + // Redis type: integer + int index +); + +/** + * SET + * + * Set the string value of a key + * + * Time complexity: O(1) + + * - Valid values for condition: "NX", "XX" + * Annotated return value: simple-string + */ +int SET( + string key, + string value, + // Redis type: enum + string condition = "" +); + +/** + * SETBIT + * + * Sets or clears the bit at offset in the string value stored at key + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int SETBIT( + string key, + // Redis type: integer + int offset, + string value +); + +/** + * SETEX + * + * Set the value and expiration of a key + * + * Time complexity: O(1) + * Annotated return value: simple-string + */ +int SETEX( + string key, + // Redis type: integer + int seconds, + string value +); + +/** + * SETNX + * + * Set the value of a key, only if the key does not exist + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int SETNX( + string key, + string value +); + +/** + * SETRANGE + * + * Overwrite part of a string at key starting at the specified offset + * + * Time complexity: O(1), not counting the time taken to copy the new string in place. Usually, + * this string is very small so the amortized complexity is O(1). Otherwise, + * complexity is O(M) with M being the length of the value argument. + * Annotated return value: integer + */ +int SETRANGE( + string key, + // Redis type: integer + int offset, + string value +); + +/** + * SHUTDOWN + * + * Synchronously save the dataset to disk and then shut down the server + + * - Valid values for save_mode: "NOSAVE", "SAVE" + * Annotated return value: simple-string + */ +int SHUTDOWN( + // Redis type: enum + string save_mode = "" +); + +/** + * SINTER + * + * Intersect multiple sets + * + * Time complexity: O(N*M) worst case where N is the cardinality of the smallest set and M is + * the number of sets. + * Annotated return value: array + */ +int SINTER( + string key +); + +/** + * SINTERSTORE + * + * Intersect multiple sets and store the resulting set in a key + * + * Time complexity: O(N*M) worst case where N is the cardinality of the smallest set and M is + * the number of sets. + * Annotated return value: integer + */ +int SINTERSTORE( + // Redis type: key + string destination, + string key +); + +/** + * SISMEMBER + * + * Determine if a given value is a member of a set + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int SISMEMBER( + string key, + string member +); + +/** + * SLAVEOF + * + * Make the server a replica of another instance, or promote it as master. Deprecated starting with Redis 5. Use REPLICAOF instead. + * Annotated return value: simple-string + */ +int SLAVEOF( + string host, + string port +); + +/** + * REPLICAOF + * + * Make the server a replica of another instance, or promote it as master. + * Annotated return value: simple-string + */ +int REPLICAOF( + string host, + string port +); + +/** + * SLOWLOG + * + * Manages the Redis slow queries log + * Annotated return value: + */ +int SLOWLOG( + string subcommand, + string argument = "" +); + +/** + * SMEMBERS + * + * Get all the members in a set + * + * Time complexity: O(N) where N is the set cardinality. + * Annotated return value: array + */ +int SMEMBERS( + string key +); + +/** + * SMOVE + * + * Move a member from one set to another + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int SMOVE( + // Redis type: key + string source, + // Redis type: key + string destination, + string member +); + +/** + * SORT + * + * Sort the elements in a list, set or sorted set + * + * Time complexity: O(N+M*log(M)) where N is the number of elements in the list or set to sort, + * and M the number of returned elements. When the elements are not sorted, + * complexity is currently O(N) as there is a copy step that will be avoided in + * next releases. + + * - Valid values for order: "ASC", "DESC" + + * - Valid values for sorting: "ALPHA" + * Annotated return value: array + */ +int SORT( + string key, + // Redis type: pattern + string by_pattern = "", + // Redis type: integer + int limit_offset = 0, + // Redis type: integer + int limit_count = 0, + string get_pattern = "", + // Redis type: enum + string order = "", + // Redis type: enum + string sorting = "", + // Redis type: key + string store_destination = "" +); + +/** + * SPOP + * + * Remove and return one or multiple random members from a set + * + * Time complexity: O(1) + * Annotated return value: bulk-string + */ +int SPOP( + string key, + // Redis type: integer + int count = 0 +); + +/** + * SRANDMEMBER + * + * Get one or multiple random members from a set + * + * Time complexity: Without the count argument O(1), otherwise O(N) where N is the absolute + * value of the passed count. + * Annotated return value: bulk-string + */ +int SRANDMEMBER( + string key, + // Redis type: integer + int count = 0 +); + +/** + * SREM + * + * Remove one or more members from a set + * + * Time complexity: O(N) where N is the number of members to be removed. + * Annotated return value: integer + */ +int SREM( + string key, + string member +); + +/** + * STRLEN + * + * Get the length of the value stored in a key + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int STRLEN( + string key +); + +/** + * SUNION + * + * Add multiple sets + * + * Time complexity: O(N) where N is the total number of elements in all given sets. + * Annotated return value: array + */ +int SUNION( + string key +); + +/** + * SUNIONSTORE + * + * Add multiple sets and store the resulting set in a key + * + * Time complexity: O(N) where N is the total number of elements in all given sets. + * Annotated return value: integer + */ +int SUNIONSTORE( + // Redis type: key + string destination, + string key +); + +/** + * SWAPDB + * + * Swaps two Redis databases + * Annotated return value: simple-string + */ +int SWAPDB( + // Redis type: integer + int index, + // Redis type: integer + int index_1 +); + +/** + * SYNC + * + * Internal command used for replication + * Annotated return value: + */ +int SYNC(); + +/** + * TIME + * + * Return the current server time + * + * Time complexity: O(1) + * Annotated return value: array + */ +int TIME(); + +/** + * TOUCH + * + * Alters the last access time of a key(s). Returns the number of existing keys specified. + * + * Time complexity: O(N) where N is the number of keys that will be touched. + * Annotated return value: integer + */ +int TOUCH( + string key +); + +/** + * TTL + * + * Get the time to live for a key + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int TTL( + string key +); + +/** + * TYPE + * + * Determine the type stored at key + * + * Time complexity: O(1) + * Annotated return value: simple-string + */ +int TYPE( + string key +); + +/** + * UNLINK + * + * Delete a key asynchronously in another thread. Otherwise it is just as DEL, but non blocking. + * + * Time complexity: O(1) for each key removed regardless of its size. Then the command does O(N) + * work in a different thread in order to reclaim memory, where N is the number + * of allocations the deleted objects where composed of. + * Annotated return value: integer + */ +int UNLINK( + string key +); + +/** + * UNWATCH + * + * Forget about all watched keys + * + * Time complexity: O(1) + * Annotated return value: simple-string + */ +int UNWATCH(); + +/** + * WAIT + * + * Wait for the synchronous replication of all the write commands sent in the context of the current connection + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int WAIT( + // Redis type: integer + int numreplicas, + // Redis type: integer + int timeout +); + +/** + * WATCH + * + * Watch the given keys to determine execution of the MULTI/EXEC block + * + * Time complexity: O(1) for every key. + * Annotated return value: simple-string + */ +int WATCH( + string key +); + +/** + * ZADD + * + * Add one or more members to a sorted set, or update its score if it already exists + * + * Time complexity: O(log(N)) for each item added, where N is the number of elements in the + * sorted set. + + * - Valid values for condition: "NX", "XX" + + * - Valid values for change: "CH" + + * - Valid values for increment: "INCR" + * Annotated return value: integer + */ +int ZADD( + string key, + // Redis type: enum + string condition = "", + // Redis type: enum + string change = "", + // Redis type: enum + string increment = "", + // Redis type: double + float score = 0.0, + string member = "" +); + +/** + * ZCARD + * + * Get the number of members in a sorted set + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int ZCARD( + string key +); + +/** + * ZCOUNT + * + * Count the members in a sorted set with scores within the given values + * + * Time complexity: O(log(N)) with N being the number of elements in the sorted set. + * Annotated return value: integer + */ +int ZCOUNT( + string key, + // Redis type: double + float min, + // Redis type: double + float max +); + +/** + * ZINCRBY + * + * Increment the score of a member in a sorted set + * + * Time complexity: O(log(N)) where N is the number of elements in the sorted set. + * Annotated return value: bulk-string + */ +int ZINCRBY( + string key, + // Redis type: integer + int increment, + string member +); + +/** + * ZINTERSTORE + * + * Intersect multiple sorted sets and store the resulting sorted set in a new key + * + * Time complexity: O(N*K)+O(M*log(M)) worst case with N being the smallest input sorted set, K + * being the number of input sorted sets and M being the number of elements in + * the resulting sorted set. + + * - Valid values for aggregate_aggregate: "SUM", "MIN", "MAX" + * Annotated return value: integer + */ +int ZINTERSTORE( + // Redis type: key + string destination, + // Redis type: integer + int numkeys, + string key, + // Redis type: integer + int weights_weight = 0, + // Redis type: enum + string aggregate_aggregate = "" +); + +/** + * ZLEXCOUNT + * + * Count the number of members in a sorted set between a given lexicographical range + * + * Time complexity: O(log(N)) with N being the number of elements in the sorted set. + * Annotated return value: integer + */ +int ZLEXCOUNT( + string key, + string min, + string max +); + +/** + * ZPOPMAX + * + * Remove and return members with the highest scores in a sorted set + * + * Time complexity: O(log(N)*M) with N being the number of elements in the sorted set, and M + * being the number of elements popped. + * Annotated return value: array + */ +int ZPOPMAX( + string key, + // Redis type: integer + int count = 0 +); + +/** + * ZPOPMIN + * + * Remove and return members with the lowest scores in a sorted set + * + * Time complexity: O(log(N)*M) with N being the number of elements in the sorted set, and M + * being the number of elements popped. + * Annotated return value: array + */ +int ZPOPMIN( + string key, + // Redis type: integer + int count = 0 +); + +/** + * ZRANGE + * + * Return a range of members in a sorted set, by index + * + * Time complexity: O(log(N)+M) with N being the number of elements in the sorted set and M the + * number of elements returned. + + * - Valid values for withscores: "WITHSCORES" + * Annotated return value: array + */ +int ZRANGE( + string key, + // Redis type: integer + int start, + // Redis type: integer + int stop, + // Redis type: enum + string withscores = "" +); + +/** + * ZRANGEBYLEX + * + * Return a range of members in a sorted set, by lexicographical range + * + * Time complexity: O(log(N)+M) with N being the number of elements in the sorted set and M the + * number of elements being returned. If M is constant (e.g. always asking for + * the first 10 elements with LIMIT), you can consider it O(log(N)). + * Annotated return value: array + */ +int ZRANGEBYLEX( + string key, + string min, + string max, + // Redis type: integer + int limit_offset = 0, + // Redis type: integer + int limit_count = 0 +); + +/** + * ZREVRANGEBYLEX + * + * Return a range of members in a sorted set, by lexicographical range, ordered from higher to lower strings. + * + * Time complexity: O(log(N)+M) with N being the number of elements in the sorted set and M the + * number of elements being returned. If M is constant (e.g. always asking for + * the first 10 elements with LIMIT), you can consider it O(log(N)). + * Annotated return value: array + */ +int ZREVRANGEBYLEX( + string key, + string max, + string min, + // Redis type: integer + int limit_offset = 0, + // Redis type: integer + int limit_count = 0 +); + +/** + * ZRANGEBYSCORE + * + * Return a range of members in a sorted set, by score + * + * Time complexity: O(log(N)+M) with N being the number of elements in the sorted set and M the + * number of elements being returned. If M is constant (e.g. always asking for + * the first 10 elements with LIMIT), you can consider it O(log(N)). + + * - Valid values for withscores: "WITHSCORES" + * Annotated return value: array + */ +int ZRANGEBYSCORE( + string key, + // Redis type: double + float min, + // Redis type: double + float max, + // Redis type: enum + string withscores = "", + // Redis type: integer + int limit_offset = 0, + // Redis type: integer + int limit_count = 0 +); + +/** + * ZRANK + * + * Determine the index of a member in a sorted set + * + * Time complexity: O(log(N)) + * Annotated return value: integer + */ +int ZRANK( + string key, + string member +); + +/** + * ZREM + * + * Remove one or more members from a sorted set + * + * Time complexity: O(M*log(N)) with N being the number of elements in the sorted set and M the + * number of elements to be removed. + * Annotated return value: integer + */ +int ZREM( + string key, + string member +); + +/** + * ZREMRANGEBYLEX + * + * Remove all members in a sorted set between the given lexicographical range + * + * Time complexity: O(log(N)+M) with N being the number of elements in the sorted set and M the + * number of elements removed by the operation. + * Annotated return value: integer + */ +int ZREMRANGEBYLEX( + string key, + string min, + string max +); + +/** + * ZREMRANGEBYRANK + * + * Remove all members in a sorted set within the given indexes + * + * Time complexity: O(log(N)+M) with N being the number of elements in the sorted set and M the + * number of elements removed by the operation. + * Annotated return value: integer + */ +int ZREMRANGEBYRANK( + string key, + // Redis type: integer + int start, + // Redis type: integer + int stop +); + +/** + * ZREMRANGEBYSCORE + * + * Remove all members in a sorted set within the given scores + * + * Time complexity: O(log(N)+M) with N being the number of elements in the sorted set and M the + * number of elements removed by the operation. + * Annotated return value: integer + */ +int ZREMRANGEBYSCORE( + string key, + // Redis type: double + float min, + // Redis type: double + float max +); + +/** + * ZREVRANGE + * + * Return a range of members in a sorted set, by index, with scores ordered from high to low + * + * Time complexity: O(log(N)+M) with N being the number of elements in the sorted set and M the + * number of elements returned. + + * - Valid values for withscores: "WITHSCORES" + * Annotated return value: array + */ +int ZREVRANGE( + string key, + // Redis type: integer + int start, + // Redis type: integer + int stop, + // Redis type: enum + string withscores = "" +); + +/** + * ZREVRANGEBYSCORE + * + * Return a range of members in a sorted set, by score, with scores ordered from high to low + * + * Time complexity: O(log(N)+M) with N being the number of elements in the sorted set and M the + * number of elements being returned. If M is constant (e.g. always asking for + * the first 10 elements with LIMIT), you can consider it O(log(N)). + + * - Valid values for withscores: "WITHSCORES" + * Annotated return value: array + */ +int ZREVRANGEBYSCORE( + string key, + // Redis type: double + float max, + // Redis type: double + float min, + // Redis type: enum + string withscores = "", + // Redis type: integer + int limit_offset = 0, + // Redis type: integer + int limit_count = 0 +); + +/** + * ZREVRANK + * + * Determine the index of a member in a sorted set, with scores ordered from high to low + * + * Time complexity: O(log(N)) + * Annotated return value: integer + */ +int ZREVRANK( + string key, + string member +); + +/** + * ZSCORE + * + * Get the score associated with the given member in a sorted set + * + * Time complexity: O(1) + * Annotated return value: bulk-string + */ +int ZSCORE( + string key, + string member +); + +/** + * ZUNIONSTORE + * + * Add multiple sorted sets and store the resulting sorted set in a new key + * + * Time complexity: O(N)+O(M log(M)) with N being the sum of the sizes of the input sorted sets, + * and M being the number of elements in the resulting sorted set. + + * - Valid values for aggregate_aggregate: "SUM", "MIN", "MAX" + * Annotated return value: integer + */ +int ZUNIONSTORE( + // Redis type: key + string destination, + // Redis type: integer + int numkeys, + string key, + // Redis type: integer + int weights_weight = 0, + // Redis type: enum + string aggregate_aggregate = "" +); + +/** + * SCAN + * + * Incrementally iterate the keys space + * + * Time complexity: O(1) for every call. O(N) for a complete iteration, including enough command + * calls for the cursor to return back to 0. N is the number of elements inside + * the collection. + * Annotated return value: + */ +int SCAN( + // Redis type: integer + int cursor, + // Redis type: pattern + string match_pattern = "", + // Redis type: integer + int count_count = 0, + string type_type = "" +); + +/** + * SSCAN + * + * Incrementally iterate Set elements + * + * Time complexity: O(1) for every call. O(N) for a complete iteration, including enough command + * calls for the cursor to return back to 0. N is the number of elements inside + * the collection.. + * Annotated return value: + */ +int SSCAN( + string key, + // Redis type: integer + int cursor, + // Redis type: pattern + string match_pattern = "", + // Redis type: integer + int count_count = 0 +); + +/** + * HSCAN + * + * Incrementally iterate hash fields and associated values + * + * Time complexity: O(1) for every call. O(N) for a complete iteration, including enough command + * calls for the cursor to return back to 0. N is the number of elements inside + * the collection.. + * Annotated return value: + */ +int HSCAN( + string key, + // Redis type: integer + int cursor, + // Redis type: pattern + string match_pattern = "", + // Redis type: integer + int count_count = 0 +); + +/** + * ZSCAN + * + * Incrementally iterate sorted sets elements and associated scores + * + * Time complexity: O(1) for every call. O(N) for a complete iteration, including enough command + * calls for the cursor to return back to 0. N is the number of elements inside + * the collection.. + * Annotated return value: + */ +int ZSCAN( + string key, + // Redis type: integer + int cursor, + // Redis type: pattern + string match_pattern = "", + // Redis type: integer + int count_count = 0 +); + +/** + * XINFO + * + * Get information on streams and consumer groups + * + * Time complexity: O(N) with N being the number of returned items for the subcommands CONSUMERS + * and GROUPS. The STREAM subcommand is O(log N) with N being the number of + * items in the stream. + + * - Valid values for help: "HELP" + * Annotated return value: + */ +int XINFO( + // Redis type: key + string consumers_key = "", + string consumers_groupname = "", + // Redis type: key + string groups_key = "", + // Redis type: key + string stream_key = "", + // Redis type: enum + string help = "" +); + +/** + * XADD + * + * Appends a new entry to a stream + * + * Time complexity: O(1) + * Annotated return value: bulk-string + */ +int XADD( + string key, + string ID, + // Redis type: value + string field, + string str +); + +/** + * XTRIM + * + * Trims the stream to (approximately if '~' is passed) a certain size + * + * Time complexity: O(N), with N being the number of evicted entries. Constant times are very + * small however, since entries are organized in macro nodes containing + * multiple entries that can be released with a single deallocation. + + * - Valid values for strategy: "MAXLEN" + + * - Valid values for approx: "~" + * Annotated return value: integer + */ +int XTRIM( + string key, + // Redis type: enum + string strategy, + // Redis type: enum + string approx = "", + // Redis type: integer + int count = 0 +); + +/** + * XDEL + * + * Removes the specified entries from the stream. Returns the number of items actually deleted, that may be different from the number of IDs passed in case certain IDs do not exist. + * + * Time complexity: O(1) for each single item to delete in the stream, regardless of the stream + * size. + * Annotated return value: integer + */ +int XDEL( + string key, + string ID +); + +/** + * XRANGE + * + * Return a range of elements in a stream, with IDs matching the specified IDs interval + * + * Time complexity: O(N) with N being the number of elements being returned. If N is constant + * (e.g. always asking for the first 10 elements with COUNT), you can consider + * it O(1). + * Annotated return value: array + */ +int XRANGE( + string key, + string start, + string end, + // Redis type: integer + int count_count = 0 +); + +/** + * XREVRANGE + * + * Return a range of elements in a stream, with IDs matching the specified IDs interval, in reverse order (from greater to smaller IDs) compared to XRANGE + * + * Time complexity: O(N) with N being the number of elements returned. If N is constant (e.g. + * always asking for the first 10 elements with COUNT), you can consider it + * O(1). + * Annotated return value: array + */ +int XREVRANGE( + string key, + string end, + string start, + // Redis type: integer + int count_count = 0 +); + +/** + * XLEN + * + * Return the number of entires in a stream + * + * Time complexity: O(1) + * Annotated return value: integer + */ +int XLEN( + string key +); + +/** + * XREAD + * + * Return never seen elements in multiple streams, with IDs greater than the ones reported by the caller for each stream. Can block. + * + * Time complexity: For each stream mentioned: O(N) with N being the number of elements being + * returned, it menas that XREAD-ing with a fixed COUNT is O(1). Note that when + * the BLOCK option is used, XADD will pay O(M) time in order to serve the M + * clients blocked on the stream getting new data. + + * - Valid values for streams: "STREAMS" + * Annotated return value: array + */ +int XREAD( + // Redis type: integer + int count_count = 0, + // Redis type: integer + int block_milliseconds = 0, + // Redis type: enum + string streams = "", + string key = "", + string ID = "" +); + +/** + * XGROUP + * + * Create, destroy, and manage consumer groups. + * + * Time complexity: O(1) for all the subcommands, with the exception of the DESTROY subcommand + * which takes an additional O(M) time in order to delete the M entries inside + * the consumer group pending entries list (PEL). + * Annotated return value: + */ +int XGROUP( + // Redis type: key + string create_key = "", + string create_groupname = "", + string create_id_or__ = "", + // Redis type: key + string setid_key = "", + string setid_groupname = "", + string setid_id_or__ = "", + // Redis type: key + string destroy_key = "", + string destroy_groupname = "", + // Redis type: key + string delconsumer_key = "", + string delconsumer_groupname = "", + string delconsumer_consumername = "" +); + +/** + * XREADGROUP + * + * Return new entries from a stream using a consumer group, or access the history of the pending entries for a given consumer. Can block. + * + * Time complexity: For each stream mentioned: O(M) with M being the number of elements + * returned. If M is constant (e.g. always asking for the first 10 elements + * with COUNT), you can consider it O(1). On the other side when XREADGROUP + * blocks, XADD will pay the O(N) time in order to serve the N clients blocked + * on the stream getting new data. + + * - Valid values for noack: "NOACK" + + * - Valid values for streams: "STREAMS" + * Annotated return value: + */ +int XREADGROUP( + string group_group, + string group_consumer, + // Redis type: integer + int count_count = 0, + // Redis type: integer + int block_milliseconds = 0, + // Redis type: enum + string noack = "", + // Redis type: enum + string streams = "", + string key = "", + string ID = "" +); + +/** + * XACK + * + * Marks a pending message as correctly processed, effectively removing it from the pending entries list of the consumer group. Return value of the command is the number of messages successfully acknowledged, that is, the IDs we were actually able to resolve in the PEL. + * + * Time complexity: O(1) for each message ID processed. + * Annotated return value: integer + */ +int XACK( + string key, + string group, + string ID +); + +/** + * XCLAIM + * + * Changes (or acquires) ownership of a message in a consumer group, as if the message was delivered to the specified consumer. + * + * Time complexity: O(log N) with N being the number of messages in the PEL of the consumer + * group. + * Annotated return value: array + */ +int XCLAIM( + string key, + string group, + string consumer, + string min_idle_time, + string ID, + // Redis type: integer + int idle_ms = 0, + // Redis type: integer + int time_ms_unix_time = 0, + // Redis type: integer + int retrycount_count = 0 +); + +/** + * XPENDING + * + * Return information and entries from a stream consumer group pending entries list, that are messages fetched but never acknowledged. + * + * Time complexity: O(N) with N being the number of elements returned, so asking for a small + * fixed number of entries per call is O(1). When the command returns just the + * summary it runs in O(1) time assuming the list of consumers is small, + * otherwise there is additional O(N) time needed to iterate every consumer. + * Annotated return value: array + */ +int XPENDING( + string key, + string group, + string start = "", + string end = "", + // Redis type: integer + int count = 0, + string consumer = "" +); + + + +// Implementation below +int APPEND( + string key, + string value +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "APPEND"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", value); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int AUTH( + string password +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "AUTH"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", password); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int BGREWRITEAOF() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "BGREWRITEAOF"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int BGSAVE() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "BGSAVE"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int BITCOUNT( + string key, + // Redis type: integer + int start = 0, + // Redis type: integer + int end = 0 +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "BITCOUNT"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + if (start != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(start)); + if (end != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(end)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int BITFIELD( + string key, + // Redis type: type + string get_type = "", + // Redis type: integer + int get_offset = 0, + // Redis type: type + string set_type = "", + // Redis type: integer + int set_offset = 0, + // Redis type: integer + int set_value = 0, + // Redis type: type + string incrby_type = "", + // Redis type: integer + int incrby_offset = 0, + // Redis type: integer + int incrby_increment = 0 +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "BITFIELD"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + if (get_type != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", get_type); + if (get_offset != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(get_offset)); + if (set_type != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", set_type); + if (set_offset != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(set_offset)); + if (set_value != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(set_value)); + if (incrby_type != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", incrby_type); + if (incrby_offset != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(incrby_offset)); + if (incrby_increment != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(incrby_increment)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int BITOP( + string operation, + // Redis type: key + string destkey, + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "BITOP"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", operation); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", destkey); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int BITPOS( + string key, + // Redis type: integer + int bit, + // Redis type: integer + int start = 0, + // Redis type: integer + int end = 0 +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "BITPOS"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(bit)); + if (start != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(start)); + if (end != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(end)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int BLPOP( + string key, + // Redis type: integer + int timeout +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "BLPOP"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(timeout)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int BRPOP( + string key, + // Redis type: integer + int timeout +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "BRPOP"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(timeout)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int BRPOPLPUSH( + // Redis type: key + string source, + // Redis type: key + string destination, + // Redis type: integer + int timeout +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "BRPOPLPUSH"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", source); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", destination); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(timeout)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int BZPOPMIN( + string key, + // Redis type: integer + int timeout +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "BZPOPMIN"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(timeout)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int BZPOPMAX( + string key, + // Redis type: integer + int timeout +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "BZPOPMAX"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(timeout)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int CLIENT_ID() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CLIENT_ID"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int CLIENT_KILL( + string ip_port = "", + // Redis type: integer + int id_client_id = 0, + string addr_ip_port = "", + string skipme_yes_no = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CLIENT_KILL"); + if (ip_port != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", ip_port); + if (id_client_id != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(id_client_id)); + if (addr_ip_port != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", addr_ip_port); + if (skipme_yes_no != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", skipme_yes_no); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int CLIENT_LIST() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CLIENT_LIST"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int CLIENT_GETNAME() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CLIENT_GETNAME"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int CLIENT_PAUSE( + // Redis type: integer + int timeout +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CLIENT_PAUSE"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(timeout)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int CLIENT_REPLY( + // Redis type: enum + string reply_mode +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CLIENT_REPLY"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", reply_mode); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int CLIENT_SETNAME( + string connection_name +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CLIENT_SETNAME"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", connection_name); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int CLIENT_UNBLOCK( + string client_id, + // Redis type: enum + string unblock_type = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CLIENT_UNBLOCK"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", client_id); + if (unblock_type != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", unblock_type); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int CLUSTER_ADDSLOTS( + // Redis type: integer + int slot +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CLUSTER_ADDSLOTS"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(slot)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int CLUSTER_COUNT_FAILURE_REPORTS( + string node_id +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CLUSTER_COUNT_FAILURE_REPORTS"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", node_id); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int CLUSTER_COUNTKEYSINSLOT( + // Redis type: integer + int slot +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CLUSTER_COUNTKEYSINSLOT"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(slot)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int CLUSTER_DELSLOTS( + // Redis type: integer + int slot +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CLUSTER_DELSLOTS"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(slot)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int CLUSTER_FAILOVER( + // Redis type: enum + string options = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CLUSTER_FAILOVER"); + if (options != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", options); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int CLUSTER_FORGET( + string node_id +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CLUSTER_FORGET"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", node_id); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int CLUSTER_GETKEYSINSLOT( + // Redis type: integer + int slot, + // Redis type: integer + int count +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CLUSTER_GETKEYSINSLOT"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(slot)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(count)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int CLUSTER_INFO() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CLUSTER_INFO"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int CLUSTER_KEYSLOT( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CLUSTER_KEYSLOT"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int CLUSTER_MEET( + string ip, + // Redis type: integer + int port +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CLUSTER_MEET"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", ip); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(port)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int CLUSTER_NODES() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CLUSTER_NODES"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int CLUSTER_REPLICATE( + string node_id +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CLUSTER_REPLICATE"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", node_id); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int CLUSTER_RESET( + // Redis type: enum + string reset_type = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CLUSTER_RESET"); + if (reset_type != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", reset_type); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int CLUSTER_SAVECONFIG() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CLUSTER_SAVECONFIG"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int CLUSTER_SET_CONFIG_EPOCH( + // Redis type: integer + int config_epoch +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CLUSTER_SET_CONFIG_EPOCH"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(config_epoch)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int CLUSTER_SETSLOT( + // Redis type: integer + int slot, + // Redis type: enum + string subcommand, + string node_id = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CLUSTER_SETSLOT"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(slot)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", subcommand); + if (node_id != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", node_id); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int CLUSTER_SLAVES( + string node_id +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CLUSTER_SLAVES"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", node_id); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int CLUSTER_REPLICAS( + string node_id +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CLUSTER_REPLICAS"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", node_id); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int CLUSTER_SLOTS() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CLUSTER_SLOTS"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int COMMAND() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "COMMAND"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int COMMAND_COUNT() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "COMMAND_COUNT"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int COMMAND_GETKEYS() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "COMMAND_GETKEYS"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int COMMAND_INFO( + string command_name +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "COMMAND_INFO"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", command_name); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int CONFIG_GET( + string parameter +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CONFIG_GET"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", parameter); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int CONFIG_REWRITE() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CONFIG_REWRITE"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int CONFIG_SET( + string parameter, + string value +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CONFIG_SET"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", parameter); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", value); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int CONFIG_RESETSTAT() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "CONFIG_RESETSTAT"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int DBSIZE() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "DBSIZE"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int DEBUG_OBJECT( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "DEBUG_OBJECT"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int DEBUG_SEGFAULT() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "DEBUG_SEGFAULT"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int DECR( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "DECR"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int DECRBY( + string key, + // Redis type: integer + int decrement +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "DECRBY"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(decrement)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int DEL( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "DEL"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int DISCARD() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "DISCARD"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int DUMP( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "DUMP"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int ECHO( + string message +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "ECHO"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", message); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int EVAL( + string script, + // Redis type: integer + int numkeys, + string key, + string arg +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "EVAL"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", script); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(numkeys)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", arg); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int EVALSHA( + string sha1, + // Redis type: integer + int numkeys, + string key, + string arg +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "EVALSHA"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", sha1); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(numkeys)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", arg); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int EXEC() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "EXEC"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int EXISTS( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "EXISTS"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int EXPIRE( + string key, + // Redis type: integer + int seconds +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "EXPIRE"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(seconds)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int EXPIREAT( + string key, + // Redis type: posix time + string timestamp +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "EXPIREAT"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", timestamp); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int FLUSHALL( + // Redis type: enum + string async = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "FLUSHALL"); + if (async != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", async); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int FLUSHDB( + // Redis type: enum + string async = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "FLUSHDB"); + if (async != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", async); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int GEOADD( + string key, + // Redis type: double + float longitude, + // Redis type: double + float latitude, + string member +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "GEOADD"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", FloatToString(longitude, 0)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", FloatToString(latitude, 0)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", member); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int GEOHASH( + string key, + string member +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "GEOHASH"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", member); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int GEOPOS( + string key, + string member +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "GEOPOS"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", member); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int GEODIST( + string key, + string member1, + string member2, + string unit = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "GEODIST"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", member1); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", member2); + if (unit != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", unit); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int GEORADIUS( + string key, + // Redis type: double + float longitude, + // Redis type: double + float latitude, + // Redis type: double + float radius, + // Redis type: enum + string unit, + // Redis type: enum + string withcoord = "", + // Redis type: enum + string withdist = "", + // Redis type: enum + string withhash = "", + // Redis type: integer + int count_count = 0, + // Redis type: enum + string order = "", + // Redis type: key + string store_key = "", + // Redis type: key + string storedist_key = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "GEORADIUS"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", FloatToString(longitude, 0)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", FloatToString(latitude, 0)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", FloatToString(radius, 0)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", unit); + if (withcoord != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", withcoord); + if (withdist != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", withdist); + if (withhash != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", withhash); + if (count_count != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(count_count)); + if (order != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", order); + if (store_key != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", store_key); + if (storedist_key != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", storedist_key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int GEORADIUSBYMEMBER( + string key, + string member, + // Redis type: double + float radius, + // Redis type: enum + string unit, + // Redis type: enum + string withcoord = "", + // Redis type: enum + string withdist = "", + // Redis type: enum + string withhash = "", + // Redis type: integer + int count_count = 0, + // Redis type: enum + string order = "", + // Redis type: key + string store_key = "", + // Redis type: key + string storedist_key = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "GEORADIUSBYMEMBER"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", member); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", FloatToString(radius, 0)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", unit); + if (withcoord != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", withcoord); + if (withdist != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", withdist); + if (withhash != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", withhash); + if (count_count != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(count_count)); + if (order != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", order); + if (store_key != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", store_key); + if (storedist_key != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", storedist_key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int GET( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "GET"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int GETBIT( + string key, + // Redis type: integer + int offset +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "GETBIT"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(offset)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int GETRANGE( + string key, + // Redis type: integer + int start, + // Redis type: integer + int end +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "GETRANGE"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(start)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(end)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int GETSET( + string key, + string value +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "GETSET"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", value); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int HDEL( + string key, + string field +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "HDEL"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", field); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int HEXISTS( + string key, + string field +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "HEXISTS"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", field); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int HGET( + string key, + string field +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "HGET"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", field); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int HGETALL( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "HGETALL"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int HINCRBY( + string key, + string field, + // Redis type: integer + int increment +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "HINCRBY"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", field); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(increment)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int HINCRBYFLOAT( + string key, + string field, + // Redis type: double + float increment +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "HINCRBYFLOAT"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", field); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", FloatToString(increment, 0)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int HKEYS( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "HKEYS"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int HLEN( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "HLEN"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int HMGET( + string key, + string field +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "HMGET"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", field); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int HMSET( + string key, + string field, + string value +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "HMSET"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", field); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", value); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int HSET( + string key, + string field, + string value +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "HSET"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", field); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", value); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int HSETNX( + string key, + string field, + string value +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "HSETNX"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", field); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", value); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int HSTRLEN( + string key, + string field +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "HSTRLEN"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", field); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int HVALS( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "HVALS"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int INCR( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "INCR"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int INCRBY( + string key, + // Redis type: integer + int increment +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "INCRBY"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(increment)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int INCRBYFLOAT( + string key, + // Redis type: double + float increment +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "INCRBYFLOAT"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", FloatToString(increment, 0)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int INFO( + string section = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "INFO"); + if (section != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", section); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int KEYS( + string pattern +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "KEYS"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", pattern); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int LASTSAVE() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "LASTSAVE"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int LINDEX( + string key, + // Redis type: integer + int index +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "LINDEX"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(index)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int LINSERT( + string key, + // Redis type: enum + string where, + string pivot, + string value +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "LINSERT"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", where); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", pivot); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", value); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int LLEN( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "LLEN"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int LPOP( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "LPOP"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int LPUSH( + string key, + string value +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "LPUSH"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", value); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int LPUSHX( + string key, + string value +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "LPUSHX"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", value); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int LRANGE( + string key, + // Redis type: integer + int start, + // Redis type: integer + int stop +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "LRANGE"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(start)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(stop)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int LREM( + string key, + // Redis type: integer + int count, + string value +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "LREM"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(count)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", value); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int LSET( + string key, + // Redis type: integer + int index, + string value +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "LSET"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(index)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", value); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int LTRIM( + string key, + // Redis type: integer + int start, + // Redis type: integer + int stop +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "LTRIM"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(start)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(stop)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int MEMORY_DOCTOR() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "MEMORY_DOCTOR"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int MEMORY_HELP() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "MEMORY_HELP"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int MEMORY_MALLOC_STATS() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "MEMORY_MALLOC_STATS"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int MEMORY_PURGE() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "MEMORY_PURGE"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int MEMORY_STATS() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "MEMORY_STATS"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int MEMORY_USAGE( + string key, + // Redis type: integer + int samples_count = 0 +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "MEMORY_USAGE"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + if (samples_count != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(samples_count)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int MGET( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "MGET"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int MIGRATE( + string host, + string port, + // Redis type: enum + string key, + // Redis type: integer + int destination_db, + // Redis type: integer + int timeout, + // Redis type: enum + string copy = "", + // Redis type: enum + string replace = "", + string auth_password = "", + // Redis type: key + string keys_key = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "MIGRATE"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", host); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", port); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(destination_db)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(timeout)); + if (copy != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", copy); + if (replace != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", replace); + if (auth_password != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", auth_password); + if (keys_key != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", keys_key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int MONITOR() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "MONITOR"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int MOVE( + string key, + // Redis type: integer + int db +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "MOVE"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(db)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int MSET( + string key, + string value +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "MSET"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", value); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int MSETNX( + string key, + string value +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "MSETNX"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", value); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int MULTI() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "MULTI"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int OBJECT( + string subcommand, + string arguments = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "OBJECT"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", subcommand); + if (arguments != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", arguments); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int PERSIST( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "PERSIST"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int PEXPIRE( + string key, + // Redis type: integer + int milliseconds +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "PEXPIRE"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(milliseconds)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int PEXPIREAT( + string key, + // Redis type: posix time + string milliseconds_timestamp +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "PEXPIREAT"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", milliseconds_timestamp); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int PFADD( + string key, + string element +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "PFADD"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", element); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int PFCOUNT( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "PFCOUNT"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int PFMERGE( + // Redis type: key + string destkey, + // Redis type: key + string sourcekey +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "PFMERGE"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", destkey); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", sourcekey); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int PING( + string message = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "PING"); + if (message != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", message); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int PSETEX( + string key, + // Redis type: integer + int milliseconds, + string value +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "PSETEX"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(milliseconds)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", value); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int PUBSUB( + string subcommand, + string argument = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "PUBSUB"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", subcommand); + if (argument != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", argument); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int PTTL( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "PTTL"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int PUBLISH( + string channel, + string message +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "PUBLISH"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", channel); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", message); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int QUIT() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "QUIT"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int RANDOMKEY() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "RANDOMKEY"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int READONLY() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "READONLY"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int READWRITE() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "READWRITE"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int RENAME( + string key, + // Redis type: key + string newkey +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "RENAME"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", newkey); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int RENAMENX( + string key, + // Redis type: key + string newkey +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "RENAMENX"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", newkey); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int RESTORE( + string key, + // Redis type: integer + int ttl, + string serialized_value, + // Redis type: enum + string replace = "", + // Redis type: enum + string absttl = "", + // Redis type: integer + int idletime_seconds = 0, + // Redis type: integer + int freq_frequency = 0 +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "RESTORE"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(ttl)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", serialized_value); + if (replace != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", replace); + if (absttl != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", absttl); + if (idletime_seconds != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(idletime_seconds)); + if (freq_frequency != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(freq_frequency)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int ROLE() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "ROLE"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int RPOP( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "RPOP"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int RPOPLPUSH( + // Redis type: key + string source, + // Redis type: key + string destination +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "RPOPLPUSH"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", source); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", destination); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int RPUSH( + string key, + string value +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "RPUSH"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", value); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int RPUSHX( + string key, + string value +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "RPUSHX"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", value); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int SADD( + string key, + string member +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SADD"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", member); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int SAVE() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SAVE"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int SCARD( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SCARD"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int SCRIPT_DEBUG( + // Redis type: enum + string mode +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SCRIPT_DEBUG"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", mode); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int SCRIPT_EXISTS( + string sha1 +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SCRIPT_EXISTS"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", sha1); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int SCRIPT_FLUSH() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SCRIPT_FLUSH"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int SCRIPT_KILL() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SCRIPT_KILL"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int SCRIPT_LOAD( + string script +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SCRIPT_LOAD"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", script); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int SDIFF( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SDIFF"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int SDIFFSTORE( + // Redis type: key + string destination, + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SDIFFSTORE"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", destination); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int SELECT( + // Redis type: integer + int index +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SELECT"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(index)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int SET( + string key, + string value, + // Redis type: enum + string condition = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SET"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", value); + if (condition != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", condition); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int SETBIT( + string key, + // Redis type: integer + int offset, + string value +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SETBIT"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(offset)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", value); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int SETEX( + string key, + // Redis type: integer + int seconds, + string value +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SETEX"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(seconds)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", value); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int SETNX( + string key, + string value +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SETNX"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", value); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int SETRANGE( + string key, + // Redis type: integer + int offset, + string value +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SETRANGE"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(offset)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", value); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int SHUTDOWN( + // Redis type: enum + string save_mode = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SHUTDOWN"); + if (save_mode != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", save_mode); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int SINTER( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SINTER"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int SINTERSTORE( + // Redis type: key + string destination, + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SINTERSTORE"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", destination); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int SISMEMBER( + string key, + string member +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SISMEMBER"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", member); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int SLAVEOF( + string host, + string port +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SLAVEOF"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", host); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", port); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int REPLICAOF( + string host, + string port +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "REPLICAOF"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", host); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", port); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int SLOWLOG( + string subcommand, + string argument = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SLOWLOG"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", subcommand); + if (argument != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", argument); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int SMEMBERS( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SMEMBERS"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int SMOVE( + // Redis type: key + string source, + // Redis type: key + string destination, + string member +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SMOVE"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", source); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", destination); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", member); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int SORT( + string key, + // Redis type: pattern + string by_pattern = "", + // Redis type: integer + int limit_offset = 0, + // Redis type: integer + int limit_count = 0, + string get_pattern = "", + // Redis type: enum + string order = "", + // Redis type: enum + string sorting = "", + // Redis type: key + string store_destination = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SORT"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + if (by_pattern != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", by_pattern); + if (limit_offset != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(limit_offset)); + if (limit_count != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(limit_count)); + if (get_pattern != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", get_pattern); + if (order != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", order); + if (sorting != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", sorting); + if (store_destination != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", store_destination); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int SPOP( + string key, + // Redis type: integer + int count = 0 +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SPOP"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + if (count != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(count)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int SRANDMEMBER( + string key, + // Redis type: integer + int count = 0 +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SRANDMEMBER"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + if (count != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(count)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int SREM( + string key, + string member +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SREM"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", member); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int STRLEN( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "STRLEN"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int SUNION( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SUNION"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int SUNIONSTORE( + // Redis type: key + string destination, + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SUNIONSTORE"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", destination); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int SWAPDB( + // Redis type: integer + int index, + // Redis type: integer + int index_1 +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SWAPDB"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(index)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(index_1)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int SYNC() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SYNC"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int TIME() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "TIME"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int TOUCH( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "TOUCH"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int TTL( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "TTL"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int TYPE( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "TYPE"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int UNLINK( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "UNLINK"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int UNWATCH() { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "UNWATCH"); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int WAIT( + // Redis type: integer + int numreplicas, + // Redis type: integer + int timeout +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "WAIT"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(numreplicas)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(timeout)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int WATCH( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "WATCH"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int ZADD( + string key, + // Redis type: enum + string condition = "", + // Redis type: enum + string change = "", + // Redis type: enum + string increment = "", + // Redis type: double + float score = 0.0, + string member = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "ZADD"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + if (condition != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", condition); + if (change != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", change); + if (increment != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", increment); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", FloatToString(score, 0)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", member); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int ZCARD( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "ZCARD"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int ZCOUNT( + string key, + // Redis type: double + float min, + // Redis type: double + float max +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "ZCOUNT"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", FloatToString(min, 0)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", FloatToString(max, 0)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int ZINCRBY( + string key, + // Redis type: integer + int increment, + string member +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "ZINCRBY"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(increment)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", member); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int ZINTERSTORE( + // Redis type: key + string destination, + // Redis type: integer + int numkeys, + string key, + // Redis type: integer + int weights_weight = 0, + // Redis type: enum + string aggregate_aggregate = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "ZINTERSTORE"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", destination); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(numkeys)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + if (weights_weight != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(weights_weight)); + if (aggregate_aggregate != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", aggregate_aggregate); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int ZLEXCOUNT( + string key, + string min, + string max +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "ZLEXCOUNT"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", min); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", max); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int ZPOPMAX( + string key, + // Redis type: integer + int count = 0 +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "ZPOPMAX"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + if (count != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(count)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int ZPOPMIN( + string key, + // Redis type: integer + int count = 0 +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "ZPOPMIN"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + if (count != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(count)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int ZRANGE( + string key, + // Redis type: integer + int start, + // Redis type: integer + int stop, + // Redis type: enum + string withscores = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "ZRANGE"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(start)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(stop)); + if (withscores != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", withscores); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int ZRANGEBYLEX( + string key, + string min, + string max, + // Redis type: integer + int limit_offset = 0, + // Redis type: integer + int limit_count = 0 +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "ZRANGEBYLEX"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", min); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", max); + if (limit_offset != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(limit_offset)); + if (limit_count != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(limit_count)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int ZREVRANGEBYLEX( + string key, + string max, + string min, + // Redis type: integer + int limit_offset = 0, + // Redis type: integer + int limit_count = 0 +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "ZREVRANGEBYLEX"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", max); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", min); + if (limit_offset != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(limit_offset)); + if (limit_count != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(limit_count)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int ZRANGEBYSCORE( + string key, + // Redis type: double + float min, + // Redis type: double + float max, + // Redis type: enum + string withscores = "", + // Redis type: integer + int limit_offset = 0, + // Redis type: integer + int limit_count = 0 +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "ZRANGEBYSCORE"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", FloatToString(min, 0)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", FloatToString(max, 0)); + if (withscores != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", withscores); + if (limit_offset != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(limit_offset)); + if (limit_count != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(limit_count)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int ZRANK( + string key, + string member +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "ZRANK"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", member); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int ZREM( + string key, + string member +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "ZREM"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", member); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int ZREMRANGEBYLEX( + string key, + string min, + string max +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "ZREMRANGEBYLEX"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", min); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", max); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int ZREMRANGEBYRANK( + string key, + // Redis type: integer + int start, + // Redis type: integer + int stop +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "ZREMRANGEBYRANK"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(start)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(stop)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int ZREMRANGEBYSCORE( + string key, + // Redis type: double + float min, + // Redis type: double + float max +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "ZREMRANGEBYSCORE"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", FloatToString(min, 0)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", FloatToString(max, 0)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int ZREVRANGE( + string key, + // Redis type: integer + int start, + // Redis type: integer + int stop, + // Redis type: enum + string withscores = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "ZREVRANGE"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(start)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(stop)); + if (withscores != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", withscores); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int ZREVRANGEBYSCORE( + string key, + // Redis type: double + float max, + // Redis type: double + float min, + // Redis type: enum + string withscores = "", + // Redis type: integer + int limit_offset = 0, + // Redis type: integer + int limit_count = 0 +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "ZREVRANGEBYSCORE"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", FloatToString(max, 0)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", FloatToString(min, 0)); + if (withscores != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", withscores); + if (limit_offset != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(limit_offset)); + if (limit_count != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(limit_count)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int ZREVRANK( + string key, + string member +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "ZREVRANK"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", member); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int ZSCORE( + string key, + string member +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "ZSCORE"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", member); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int ZUNIONSTORE( + // Redis type: key + string destination, + // Redis type: integer + int numkeys, + string key, + // Redis type: integer + int weights_weight = 0, + // Redis type: enum + string aggregate_aggregate = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "ZUNIONSTORE"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", destination); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(numkeys)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + if (weights_weight != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(weights_weight)); + if (aggregate_aggregate != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", aggregate_aggregate); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int SCAN( + // Redis type: integer + int cursor, + // Redis type: pattern + string match_pattern = "", + // Redis type: integer + int count_count = 0, + string type_type = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SCAN"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(cursor)); + if (match_pattern != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", match_pattern); + if (count_count != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(count_count)); + if (type_type != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", type_type); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int SSCAN( + string key, + // Redis type: integer + int cursor, + // Redis type: pattern + string match_pattern = "", + // Redis type: integer + int count_count = 0 +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "SSCAN"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(cursor)); + if (match_pattern != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", match_pattern); + if (count_count != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(count_count)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int HSCAN( + string key, + // Redis type: integer + int cursor, + // Redis type: pattern + string match_pattern = "", + // Redis type: integer + int count_count = 0 +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "HSCAN"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(cursor)); + if (match_pattern != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", match_pattern); + if (count_count != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(count_count)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int ZSCAN( + string key, + // Redis type: integer + int cursor, + // Redis type: pattern + string match_pattern = "", + // Redis type: integer + int count_count = 0 +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "ZSCAN"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(cursor)); + if (match_pattern != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", match_pattern); + if (count_count != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(count_count)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int XINFO( + // Redis type: key + string consumers_key = "", + string consumers_groupname = "", + // Redis type: key + string groups_key = "", + // Redis type: key + string stream_key = "", + // Redis type: enum + string help = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "XINFO"); + if (consumers_key != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", consumers_key); + if (consumers_groupname != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", consumers_groupname); + if (groups_key != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", groups_key); + if (stream_key != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", stream_key); + if (help != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", help); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int XADD( + string key, + string ID, + // Redis type: value + string field, + string str +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "XADD"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", ID); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", field); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", str); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int XTRIM( + string key, + // Redis type: enum + string strategy, + // Redis type: enum + string approx = "", + // Redis type: integer + int count = 0 +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "XTRIM"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", strategy); + if (approx != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", approx); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(count)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int XDEL( + string key, + string ID +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "XDEL"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", ID); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int XRANGE( + string key, + string start, + string end, + // Redis type: integer + int count_count = 0 +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "XRANGE"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", start); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", end); + if (count_count != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(count_count)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int XREVRANGE( + string key, + string end, + string start, + // Redis type: integer + int count_count = 0 +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "XREVRANGE"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", end); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", start); + if (count_count != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(count_count)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int XLEN( + string key +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "XLEN"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int XREAD( + // Redis type: integer + int count_count = 0, + // Redis type: integer + int block_milliseconds = 0, + // Redis type: enum + string streams = "", + string key = "", + string ID = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "XREAD"); + if (count_count != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(count_count)); + if (block_milliseconds != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(block_milliseconds)); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", streams); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", ID); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int XGROUP( + // Redis type: key + string create_key = "", + string create_groupname = "", + string create_id_or__ = "", + // Redis type: key + string setid_key = "", + string setid_groupname = "", + string setid_id_or__ = "", + // Redis type: key + string destroy_key = "", + string destroy_groupname = "", + // Redis type: key + string delconsumer_key = "", + string delconsumer_groupname = "", + string delconsumer_consumername = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "XGROUP"); + if (create_key != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", create_key); + if (create_groupname != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", create_groupname); + if (create_id_or__ != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", create_id_or__); + if (setid_key != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", setid_key); + if (setid_groupname != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", setid_groupname); + if (setid_id_or__ != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", setid_id_or__); + if (destroy_key != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", destroy_key); + if (destroy_groupname != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", destroy_groupname); + if (delconsumer_key != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", delconsumer_key); + if (delconsumer_groupname != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", delconsumer_groupname); + if (delconsumer_consumername != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", delconsumer_consumername); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int XREADGROUP( + string group_group, + string group_consumer, + // Redis type: integer + int count_count = 0, + // Redis type: integer + int block_milliseconds = 0, + // Redis type: enum + string noack = "", + // Redis type: enum + string streams = "", + string key = "", + string ID = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "XREADGROUP"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", group_group); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", group_consumer); + if (count_count != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(count_count)); + if (block_milliseconds != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(block_milliseconds)); + if (noack != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", noack); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", streams); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", ID); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int XACK( + string key, + string group, + string ID +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "XACK"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", group); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", ID); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int XCLAIM( + string key, + string group, + string consumer, + string min_idle_time, + string ID, + // Redis type: integer + int idle_ms = 0, + // Redis type: integer + int time_ms_unix_time = 0, + // Redis type: integer + int retrycount_count = 0 +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "XCLAIM"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", group); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", consumer); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", min_idle_time); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", ID); + if (idle_ms != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(idle_ms)); + if (time_ms_unix_time != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(time_ms_unix_time)); + if (retrycount_count != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(retrycount_count)); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + +int XPENDING( + string key, + string group, + string start = "", + string end = "", + // Redis type: integer + int count = 0, + string consumer = "" +) { + NWNX_PushArgumentString("NWNX_Redis", "Deferred", "XPENDING"); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", key); + NWNX_PushArgumentString("NWNX_Redis", "Deferred", group); + if (start != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", start); + if (end != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", end); + if (count != 0) NWNX_PushArgumentString("NWNX_Redis", "Deferred", IntToString(count)); + if (consumer != "") NWNX_PushArgumentString("NWNX_Redis", "Deferred", consumer); + NWNX_CallFunction("NWNX_Redis", "Deferred"); + return NWNX_GetReturnValueInt("NWNX_Redis", "Deferred"); +} + diff --git a/gamma_age_v2/nwnx_regex.nss b/gamma_age_v2/nwnx_regex.nss new file mode 100644 index 00000000..7b737f78 --- /dev/null +++ b/gamma_age_v2/nwnx_regex.nss @@ -0,0 +1,42 @@ +/// @addtogroup regex Regex +/// @brief Provide regular expression functions. +/// @{ +/// @file nwnx_regex.nss +#include "nwnx" + +const string NWNX_Regex = "NWNX_Regex"; ///< @private + +/// @param str The string to search. +/// @param regex The regular expression to use when searching. +/// @return TRUE if string matches the regular expression. +int NWNX_Regex_Search(string str, string regex); + +/// @brief Replaces any matches of the regular expression with a string. +/// @param str The string to search. +/// @param regex The regular expression to use when searching. +/// @param replace The string to replace the matches with. +/// @param firstOnly Set to TRUE to only replace the first match. +/// @return A new string with any replacements made. +string NWNX_Regex_Replace(string str, string regex, string replace = "", int firstOnly = FALSE); + +/// @} + +int NWNX_Regex_Search(string str, string regex) +{ + string sFunc = "Search"; + NWNX_PushArgumentString(NWNX_Regex, sFunc, regex); + NWNX_PushArgumentString(NWNX_Regex, sFunc, str); + NWNX_CallFunction(NWNX_Regex, sFunc); + return NWNX_GetReturnValueInt(NWNX_Regex, sFunc); +} + +string NWNX_Regex_Replace(string str, string regex, string replace="", int firstOnly=0) +{ + string sFunc = "Replace"; + NWNX_PushArgumentInt(NWNX_Regex, sFunc, firstOnly); + NWNX_PushArgumentString(NWNX_Regex, sFunc, replace); + NWNX_PushArgumentString(NWNX_Regex, sFunc, regex); + NWNX_PushArgumentString(NWNX_Regex, sFunc, str); + NWNX_CallFunction(NWNX_Regex, sFunc); + return NWNX_GetReturnValueString(NWNX_Regex, sFunc); +} diff --git a/gamma_age_v2/nwnx_rename.nss b/gamma_age_v2/nwnx_rename.nss new file mode 100644 index 00000000..053fb2a5 --- /dev/null +++ b/gamma_age_v2/nwnx_rename.nss @@ -0,0 +1,80 @@ +/// @addtogroup rename Rename +/// @brief Facilitates renaming, overriding and customization of player names. +/// @{ +/// @file nwnx_rename.nss +#include "nwnx" + +const string NWNX_Rename = "NWNX_Rename"; ///< @private + +/// @anchor rename_comm_name_override_type +/// @name Community Name Override Type +/// @{ +const int NWNX_RENAME_PLAYERNAME_DEFAULT = 0; ///< Don't rename +const int NWNX_RENAME_PLAYERNAME_OBFUSCATE = 1; ///< Generate random string for Community Name +const int NWNX_RENAME_PLAYERNAME_OVERRIDE = 2; ///< Use character name specified +const int NWNX_RENAME_PLAYERNAME_ANONYMOUS = 3; ///< Use the value of the NWNX_RENAME_ANONYMOUS_NAME environment variable +///@} + +/// @brief Set a PC's character name and community name on the player list. +/// @param oTarget The PC whose name is being overridden. +/// @param sNewName The new name. +/// @param sPrefix The prefix for their character name, sometimes used for a color code. +/// @param sSuffix The suffix for their character name. +/// @param iPlayerNameState How to change the Community Name, use @ref rename_comm_name_override_type "Community Name Override Type". +/// @param oObserver If specified, the character name will appear to that specific observer as set, this overrides a global setting. +/// @note Will not persist through saving, resets or logout. +void NWNX_Rename_SetPCNameOverride(object oTarget, string sNewName, string sPrefix = "" , string sSuffix = "" , + int iPlayerNameState = NWNX_RENAME_PLAYERNAME_DEFAULT, object oObserver = OBJECT_INVALID); + +/// @brief Gets a PC's name as overridden. +/// @param oTarget The PC whose name to query. +/// @param oObserver The specific observer. +/// @return The PC's name as overridden either per observer or globally. +/// @note If you wish to get a PC's true name use `GetName(oPC, TRUE)`. +string NWNX_Rename_GetPCNameOverride(object oTarget, object oObserver = OBJECT_INVALID); + +/// @brief Clears an overridden PC Name. +/// @param oTarget The PC whose overridden name to clear, use OBJECT_INVALID if you're clearing all overrides for an observer. +/// @param oObserver The observer whose overriden name of oTarget is being cleared. +/// If oTarget is OBJECT_INVALID then all overrides are cleared. +/// @param clearAll If true, both the global and personal overrides will be cleared for that target PC. +/// Requires oObserver be OBJECT_INVALID. +void NWNX_Rename_ClearPCNameOverride(object oTarget, object oObserver = OBJECT_INVALID, int clearAll = FALSE); + +/// @} + +void NWNX_Rename_SetPCNameOverride(object oTarget, string sNewName, string sPrefix = "" , string sSuffix = "" , + int iPlayerNameState = NWNX_RENAME_PLAYERNAME_DEFAULT, object oObserver = OBJECT_INVALID) +{ + string sFunc = "SetPCNameOverride"; + + NWNX_PushArgumentObject(NWNX_Rename, sFunc, oObserver); + NWNX_PushArgumentInt(NWNX_Rename, sFunc, iPlayerNameState); + NWNX_PushArgumentString(NWNX_Rename, sFunc, sSuffix); + NWNX_PushArgumentString(NWNX_Rename, sFunc, sPrefix); + NWNX_PushArgumentString(NWNX_Rename, sFunc, sNewName); + NWNX_PushArgumentObject(NWNX_Rename, sFunc, oTarget); + + NWNX_CallFunction(NWNX_Rename, sFunc); +} +string NWNX_Rename_GetPCNameOverride(object oTarget, object oObserver = OBJECT_INVALID) +{ + string sFunc = "GetPCNameOverride"; + + NWNX_PushArgumentObject(NWNX_Rename, sFunc, oObserver); + NWNX_PushArgumentObject(NWNX_Rename, sFunc, oTarget); + + NWNX_CallFunction(NWNX_Rename, sFunc); + return NWNX_GetReturnValueString(NWNX_Rename, sFunc); +} + +void NWNX_Rename_ClearPCNameOverride(object oTarget, object oObserver = OBJECT_INVALID, int clearAll = FALSE) +{ + string sFunc = "ClearPCNameOverride"; + + NWNX_PushArgumentInt(NWNX_Rename, sFunc, clearAll); + NWNX_PushArgumentObject(NWNX_Rename, sFunc, oObserver); + NWNX_PushArgumentObject(NWNX_Rename, sFunc, oTarget); + + NWNX_CallFunction(NWNX_Rename, sFunc); +} diff --git a/gamma_age_v2/nwnx_reveal.nss b/gamma_age_v2/nwnx_reveal.nss new file mode 100644 index 00000000..8ddf2f1f --- /dev/null +++ b/gamma_age_v2/nwnx_reveal.nss @@ -0,0 +1,49 @@ +/// @addtogroup reveal Reveal +/// @brief Allows the selective revealing of a stealthing character to another character or their party. +/// @{ +/// @file nwnx_reveal.nss +#include "nwnx" + +const string NWNX_Reveal = "NWNX_Reveal"; ///< @private + +/// @name Reveal Detection Methods +/// @{ +const int NWNX_REVEAL_SEEN = 1; ///< Seen +const int NWNX_REVEAL_HEARD = 0; ///< Heard +///@} + +/// @brief Selectively reveals the character to an observer until the next time they stealth out of sight. +/// @param oHiding The creature who is stealthed. +/// @param oObserver The creature to whom the hider is revealed. +/// @param iDetectionMethod Can be specified to determine whether the hidden creature is seen or heard. +void NWNX_Reveal_RevealTo(object oHiding, object oObserver, int iDetectionMethod = NWNX_REVEAL_HEARD); + +/// @brief Sets whether a character remains visible to their party through stealth. +/// @param oHiding The creature who is stealthed. +/// @param bReveal TRUE for visible. +/// @param iDetectionMethod Can be specified to determine whether the hidden creature is seen or heard. +void NWNX_Reveal_SetRevealToParty(object oHiding, int bReveal, int iDetectionMethod = NWNX_REVEAL_HEARD); + +/// @} + +void NWNX_Reveal_RevealTo(object oHiding, object oObserver, int iDetectionMethod = NWNX_REVEAL_HEARD) +{ + string sFunc = "RevealTo"; + + NWNX_PushArgumentInt(NWNX_Reveal, sFunc, iDetectionMethod); + NWNX_PushArgumentObject(NWNX_Reveal, sFunc, oObserver); + NWNX_PushArgumentObject(NWNX_Reveal, sFunc, oHiding); + + NWNX_CallFunction(NWNX_Reveal, sFunc); +} + +void NWNX_Reveal_SetRevealToParty(object oHiding, int bReveal, int iDetectionMethod = NWNX_REVEAL_HEARD) +{ + string sFunc = "SetRevealToParty"; + + NWNX_PushArgumentInt(NWNX_Reveal, sFunc, iDetectionMethod); + NWNX_PushArgumentInt(NWNX_Reveal, sFunc, bReveal); + NWNX_PushArgumentObject(NWNX_Reveal, sFunc, oHiding); + + NWNX_CallFunction(NWNX_Reveal, sFunc); +} diff --git a/gamma_age_v2/nwnx_ruby.nss b/gamma_age_v2/nwnx_ruby.nss new file mode 100644 index 00000000..24c8f85d --- /dev/null +++ b/gamma_age_v2/nwnx_ruby.nss @@ -0,0 +1,23 @@ +/// @addtogroup ruby Ruby +/// @brief Allows users to execute arbitrary Ruby from the game. +/// @{ +/// @file nwnx_ruby.nss +#include "nwnx" + +const string NWNX_Ruby = "NWNX_Ruby"; ///< @private + +string NWNX_Ruby_Evaluate (string sCode); + +/// @brief Evaluates some ruby code. +/// @param sCode The code to evaluate. +/// @return The output of the call. +string NWNX_Ruby_Evaluate(string sCode) +{ + string sFunc = "Evaluate"; + + NWNX_PushArgumentString (NWNX_Ruby, sFunc, sCode); + NWNX_CallFunction (NWNX_Ruby, sFunc); + return NWNX_GetReturnValueString (NWNX_Ruby, sFunc); +} + +/// @} diff --git a/gamma_age_v2/nwnx_skillranks.nss b/gamma_age_v2/nwnx_skillranks.nss new file mode 100644 index 00000000..cc884831 --- /dev/null +++ b/gamma_age_v2/nwnx_skillranks.nss @@ -0,0 +1,283 @@ +/// @addtogroup skillranks SkillRanks +/// @brief Enhances and allows for manipulation of skill rank calculations including the ability to build custom +/// skill related feats as well as modifying stock feats. +/// @{ +/// @file nwnx_skillranks.nss +#include "nwnx" + +const string NWNX_SkillRanks = "NWNX_SkillRanks"; ///< @private + +/// @name SkillRanks Key Abilities +/// @anchor skr_key_abilities +/// +/// The abilities as bits +/// @{ +const int NWNX_SKILLRANKS_KEY_ABILITY_STRENGTH = 1; ///< Strength +const int NWNX_SKILLRANKS_KEY_ABILITY_DEXTERITY = 2; ///< Dexterity +const int NWNX_SKILLRANKS_KEY_ABILITY_CONSTITUTION = 4; ///< Constitution +const int NWNX_SKILLRANKS_KEY_ABILITY_INTELLIGENCE = 8; ///< Intelligence +const int NWNX_SKILLRANKS_KEY_ABILITY_WISDOM = 16; ///< Wisdom +const int NWNX_SKILLRANKS_KEY_ABILITY_CHARISMA = 32; ///< Charisma +///@} + +/// @name SkillRanks Key Ability Calculation Method +/// @anchor skr_key_ability_calc_bits +/// +/// Constants used to calculate the ability modifier for a skill. +/// @{ +/// @warning Use only one of these calculations in your mask! If you use more than one the first will be used. +const int NWNX_SKILLRANKS_KEY_ABILITY_CALC_MIN = 64; ///< Use the minimum value of the provided ability scores. +const int NWNX_SKILLRANKS_KEY_ABILITY_CALC_MAX = 128; ///< Use the maximum value of the provided ability scores. +const int NWNX_SKILLRANKS_KEY_ABILITY_CALC_AVERAGE = 256; ///< Use the average value of the provided ability scores. +const int NWNX_SKILLRANKS_KEY_ABILITY_CALC_SUM = 512; ///< Use the sum of the provided ability scores. +///@} + +/// @brief A feat that manipulates skill ranks. +struct NWNX_SkillRanks_SkillFeat +{ + int iSkill; ///< The skill this feat impacts + int iFeat; ///< The feat + + /// Skill feat bonus/penalty + int iModifier; + + /// 1 for Focus, 2 for Epic Focus. This can be set on a feat so NWNX_SkillRanks_SetFocusMod + /// can mass change the modifier for the Skill Focus and Epic Skill Focus feats. + int iFocusFeat; + + /// @brief 255 char bitset string for skill ranks impacted by class levels (like Bardic Knowledge). + /// + /// The right most bit is barbarian (class 0), second from right is bard (class 1) etc. + /// It's not necessary to pass in the entire string, for example Ranger is class 7 and Fighter is 4 + /// If you wanted those class levels to impact the skill modifier you could set sClasses equal to + /// "10010000". From right to left = Barbarian, Bard, Cleric, Druid, Fighter, Monk, Paladin, Ranger + /// You can alternatively use NWNX_SkillRanks_AddSkillFeatClass() for each class + /// @remark If unset but #fClassLevelMod is set, then all classes will be included. + string sClasses; + + /// Levels in class multiplier gives you skill modifier, for example 0.5f would mean 1 point for + /// every two class levels. If #sClasses is not set and this is set then all class levels will be modified. + float fClassLevelMod; + + /// Used for feats like Stonecunning or Trackless Step which restrict skill modifiers by area types. + int iAreaFlagsRequired; + + /// Used for feats like Stonecunning or Trackless Step which restrict skill modifiers by area types. + int iAreaFlagsForbidden; + + /// 1 for Day, 2 for Night - if skill modifiers only take effect based on the day/night cycle or an area + /// that's set to always night. 0 is all hours. + int iDayOrNight; + + /// This allows for feats that bypass the armor check penalty on skill rank calculations. + int bBypassArmorCheckPenalty; + + /// @brief Bitmask of @ref skr_key_abilities "abilities" and @ref skr_key_ability_calc_bits "method to calculate" + /// the ability modifier for a skill. + /// + /// Example **Doctor** Feat that used INT instead of WIS (if higher) for Heal skill would set to: + /// #NWNX_SKILLRANKS_KEY_ABILITY_INTELLIGENCE | #NWNX_SKILLRANKS_KEY_ABILITY_WISDOM | #NWNX_SKILLRANKS_KEY_ABILITY_CALC_MAX; + int iKeyAbilityMask; +}; + +/// @param iSkill The skill to check the feat count. +/// @return The count of feats for a specific skill. +int NWNX_SkillRanks_GetSkillFeatCountForSkill(int iSkill); + +/// @brief Returns a skill feat. +/// @param iSkill The skill. +/// @param iFeat The feat. +/// @return A constructed NWNX_SkillRanks_SkillFeat. +struct NWNX_SkillRanks_SkillFeat NWNX_SkillRanks_GetSkillFeat(int iSkill, int iFeat); + +/// @brief Returns a skill feat by index. +/// @remark Generally used in a loop with NWNX_SkillRanks_GetSkillFeatCountForSkill(). +/// @param iSkill The skill. +/// @param iIndex The index in the list of feats for the skill. +/// @return A constructed NWNX_SkillRanks_SkillFeat. +struct NWNX_SkillRanks_SkillFeat NWNX_SkillRanks_GetSkillFeatForSkillByIndex(int iSkill, int iIndex); + +/// @brief Modifies or creates a skill feat. +/// @param skillFeat The defined NWNX_SkillRanks_SkillFeat. +/// @param createIfNonExistent TRUE to create if the feat does not exist. +void NWNX_SkillRanks_SetSkillFeat(struct NWNX_SkillRanks_SkillFeat skillFeat, int createIfNonExistent = FALSE); + +/// @brief Add classes to a skill feat instead of working with the NWNX_SkillRanks_SkillFeat::sClasses string. +/// +/// Manipulating the sClasses string in the NWNX_SkillRanks_SkillFeat struct can be difficult. This +/// function allows the builder to enter one class at a time. +/// @param skillFeat The NWNX_SkillRanks_SkillFeat for which the sClasses field will be modifier. +/// @param iClass The class to add to the Skill Feat. +/// @return The updated NWNX_SkillRanks_SkillFeat. +struct NWNX_SkillRanks_SkillFeat NWNX_SkillRanks_AddSkillFeatClass(struct NWNX_SkillRanks_SkillFeat skillFeat, int iClass); + +/// @brief Change the modifier value for Skill Focus and Epic Skill Focus feats. +/// +/// The stock modifier on Skill Focus and Epic Skill Focus are 3 and 10 respectively, these can be +/// changed with this function. +/// @param iModifier The new value for the feat modifier. +/// @param iEpic Set to TRUE to change the value for Epic Skill Focus. +void NWNX_SkillRanks_SetSkillFeatFocusModifier(int iModifier, int iEpic = FALSE); + +/// @brief Gets the current penalty to Dexterity based skills when blind. +/// @return The penalty to Dexterity when blind. +int NWNX_SkillRanks_GetBlindnessPenalty(); + +/// @brief Set the value the Dexterity based skills get decreased due to blindness. +/// @remark Default is 4. +/// @param iModifier The penalty to Dexterity when blind. +void NWNX_SkillRanks_SetBlindnessPenalty(int iModifier); + +/// @brief Get a skill modifier for an area. +/// @param oArea The area. +/// @param iSkill The skill to check. +/// @return The modifier to that skill in the area. +int NWNX_SkillRanks_GetAreaModifier(object oArea, int iSkill); + +/// @brief Sets a skill modifier for the area. +/// @param oArea The area. +/// @param iSkill The skill to change. +/// @param iModifier The modifier to the skill in the area. +void NWNX_SkillRanks_SetAreaModifier(object oArea, int iSkill, int iModifier); + +/// @} + +int NWNX_SkillRanks_GetSkillFeatCountForSkill(int iSkill) +{ + string sFunc = "GetSkillFeatCountForSkill"; + + NWNX_PushArgumentInt(NWNX_SkillRanks, sFunc, iSkill); + NWNX_CallFunction(NWNX_SkillRanks, sFunc); + + return NWNX_GetReturnValueInt(NWNX_SkillRanks, sFunc); +} + +struct NWNX_SkillRanks_SkillFeat NWNX_SkillRanks_GetSkillFeatForSkillByIndex(int iSkill, int iIndex) +{ + string sFunc = "GetSkillFeatForSkillByIndex"; + + NWNX_PushArgumentInt(NWNX_SkillRanks, sFunc, iIndex); + NWNX_PushArgumentInt(NWNX_SkillRanks, sFunc, iSkill); + NWNX_CallFunction(NWNX_SkillRanks, sFunc); + + struct NWNX_SkillRanks_SkillFeat skillFeat; + + skillFeat.iSkill = iSkill; + skillFeat.iFeat = NWNX_GetReturnValueInt(NWNX_SkillRanks, sFunc); + skillFeat.iModifier = NWNX_GetReturnValueInt(NWNX_SkillRanks, sFunc); + skillFeat.iFocusFeat = NWNX_GetReturnValueInt(NWNX_SkillRanks, sFunc); + skillFeat.sClasses = NWNX_GetReturnValueString(NWNX_SkillRanks, sFunc); + skillFeat.fClassLevelMod = NWNX_GetReturnValueFloat(NWNX_SkillRanks, sFunc); + skillFeat.iAreaFlagsRequired = NWNX_GetReturnValueInt(NWNX_SkillRanks, sFunc); + skillFeat.iAreaFlagsForbidden = NWNX_GetReturnValueInt(NWNX_SkillRanks, sFunc); + skillFeat.iDayOrNight = NWNX_GetReturnValueInt(NWNX_SkillRanks, sFunc); + skillFeat.bBypassArmorCheckPenalty = NWNX_GetReturnValueInt(NWNX_SkillRanks, sFunc); + skillFeat.iKeyAbilityMask = NWNX_GetReturnValueInt(NWNX_SkillRanks, sFunc); + + return skillFeat; +} + +struct NWNX_SkillRanks_SkillFeat NWNX_SkillRanks_GetSkillFeat(int iSkill, int iFeat) +{ + string sFunc = "GetSkillFeat"; + + NWNX_PushArgumentInt(NWNX_SkillRanks, sFunc, iFeat); + NWNX_PushArgumentInt(NWNX_SkillRanks, sFunc, iSkill); + NWNX_CallFunction(NWNX_SkillRanks, sFunc); + + struct NWNX_SkillRanks_SkillFeat skillFeat; + + skillFeat.iSkill = iSkill; + skillFeat.iFeat = iFeat; + skillFeat.iModifier = NWNX_GetReturnValueInt(NWNX_SkillRanks, sFunc); + skillFeat.iFocusFeat = NWNX_GetReturnValueInt(NWNX_SkillRanks, sFunc); + skillFeat.sClasses = NWNX_GetReturnValueString(NWNX_SkillRanks, sFunc); + skillFeat.fClassLevelMod = NWNX_GetReturnValueFloat(NWNX_SkillRanks, sFunc); + skillFeat.iAreaFlagsRequired = NWNX_GetReturnValueInt(NWNX_SkillRanks, sFunc); + skillFeat.iAreaFlagsForbidden = NWNX_GetReturnValueInt(NWNX_SkillRanks, sFunc); + skillFeat.iDayOrNight = NWNX_GetReturnValueInt(NWNX_SkillRanks, sFunc); + skillFeat.bBypassArmorCheckPenalty = NWNX_GetReturnValueInt(NWNX_SkillRanks, sFunc); + skillFeat.iKeyAbilityMask = NWNX_GetReturnValueInt(NWNX_SkillRanks, sFunc); + + return skillFeat; +} + +void NWNX_SkillRanks_SetSkillFeat(struct NWNX_SkillRanks_SkillFeat skillFeat, int createIfNonExistent = FALSE) +{ + string sFunc = "SetSkillFeat"; + + NWNX_PushArgumentInt(NWNX_SkillRanks, sFunc, createIfNonExistent); + NWNX_PushArgumentInt(NWNX_SkillRanks, sFunc, skillFeat.iKeyAbilityMask); + NWNX_PushArgumentInt(NWNX_SkillRanks, sFunc, skillFeat.bBypassArmorCheckPenalty); + NWNX_PushArgumentInt(NWNX_SkillRanks, sFunc, skillFeat.iDayOrNight); + NWNX_PushArgumentInt(NWNX_SkillRanks, sFunc, skillFeat.iAreaFlagsForbidden); + NWNX_PushArgumentInt(NWNX_SkillRanks, sFunc, skillFeat.iAreaFlagsRequired); + NWNX_PushArgumentFloat(NWNX_SkillRanks, sFunc, skillFeat.fClassLevelMod); + // We only need to send the string from the point of the first set bit + NWNX_PushArgumentString(NWNX_SkillRanks, sFunc, GetStringRight(skillFeat.sClasses, GetStringLength(skillFeat.sClasses)-FindSubString(skillFeat.sClasses, "1"))); + NWNX_PushArgumentInt(NWNX_SkillRanks, sFunc, skillFeat.iFocusFeat); + NWNX_PushArgumentInt(NWNX_SkillRanks, sFunc, skillFeat.iModifier); + NWNX_PushArgumentInt(NWNX_SkillRanks, sFunc, skillFeat.iFeat); + NWNX_PushArgumentInt(NWNX_SkillRanks, sFunc, skillFeat.iSkill); + NWNX_CallFunction(NWNX_SkillRanks, sFunc); +} + +struct NWNX_SkillRanks_SkillFeat NWNX_SkillRanks_AddSkillFeatClass(struct NWNX_SkillRanks_SkillFeat skillFeat, int iClass) +{ + if (GetStringLength(skillFeat.sClasses) < 255) + { + int i; + string sPad; + for (i = 0; i < 255-GetStringLength(skillFeat.sClasses); i++) { sPad = sPad + "0"; } + skillFeat.sClasses = sPad + skillFeat.sClasses; + } + skillFeat.sClasses = GetStringLeft(skillFeat.sClasses, 254 - iClass) + "1" + GetStringRight(skillFeat.sClasses, iClass); + return skillFeat; +} + +void NWNX_SkillRanks_SetSkillFeatFocusModifier(int iModifier, int epicFocus = FALSE) +{ + string sFunc = "SetSkillFeatFocusModifier"; + + NWNX_PushArgumentInt(NWNX_SkillRanks, sFunc, epicFocus); + NWNX_PushArgumentInt(NWNX_SkillRanks, sFunc, iModifier); + NWNX_CallFunction(NWNX_SkillRanks, sFunc); +} + +int NWNX_SkillRanks_GetBlindnessPenalty() +{ + string sFunc = "GetBlindnessPenalty"; + + NWNX_CallFunction(NWNX_SkillRanks, sFunc); + + return NWNX_GetReturnValueInt(NWNX_SkillRanks, sFunc); +} + +void NWNX_SkillRanks_SetBlindnessPenalty(int iModifier) +{ + string sFunc = "SetBlindnessPenalty"; + + NWNX_PushArgumentInt(NWNX_SkillRanks, sFunc, iModifier); + NWNX_CallFunction(NWNX_SkillRanks, sFunc); +} + +int NWNX_SkillRanks_GetAreaModifier(object oArea, int iSkill) +{ + string sFunc = "GetAreaModifier"; + + NWNX_PushArgumentInt(NWNX_SkillRanks, sFunc, iSkill); + NWNX_PushArgumentObject(NWNX_SkillRanks, sFunc, oArea); + NWNX_CallFunction(NWNX_SkillRanks, sFunc); + + return NWNX_GetReturnValueInt(NWNX_SkillRanks, sFunc); +} + +void NWNX_SkillRanks_SetAreaModifier(object oArea, int iSkill, int iModifier) +{ + string sFunc = "SetAreaModifier"; + + NWNX_PushArgumentInt(NWNX_SkillRanks, sFunc, iModifier); + NWNX_PushArgumentInt(NWNX_SkillRanks, sFunc, iSkill); + NWNX_PushArgumentObject(NWNX_SkillRanks, sFunc, oArea); + NWNX_CallFunction(NWNX_SkillRanks, sFunc); +} diff --git a/gamma_age_v2/nwnx_spellcheck.nss b/gamma_age_v2/nwnx_spellcheck.nss new file mode 100644 index 00000000..5c75bee0 --- /dev/null +++ b/gamma_age_v2/nwnx_spellcheck.nss @@ -0,0 +1,43 @@ +/// @addtogroup spellchecker SpellChecker +/// @brief Functions related to spellchecking +/// @{ +/// @file nwnx_spellcheck.nss +#include "nwnx" + +const string NWNX_SpellChecker = "NWNX_SpellChecker"; ///< @private + +/// @brief Finds misspells in a string. +/// @param sentence The sentence to check. +/// @return The spelling mistakes in the sentence, comma delimited. Returns blank if no errors or if .so file +/// is improperly installed. +/// @note If it returns an error in every word, even when spelled correctly, the dictionary is not set up correctly. +/// @warning These functions can be performance heavy, do limit how many calls and/or how long of a sentence is passed. +/// Make use of **DelayCommands** and **AssignCommands** +string NWNX_SpellChecker_FindMisspell(string sentence); + +/// @brief Get suggestions on a single word, comma delimited. +/// @param word The string to check for suggestions. +/// @return A comma delimited lists of suggestions for a word. Returns blank if no errors or if .so file is improperly +/// installed. +/// @warning These functions can be performance heavy, do limit how many calls and/or how long of a sentence is passed. +/// Make use of **DelayCommands** and **AssignCommands** +string NWNX_SpellChecker_GetSuggestSpell(string word); + +/// @} + +string NWNX_SpellChecker_FindMisspell(string sentence) +{ + string sFunc = "FindMisspell"; + + NWNX_PushArgumentString(NWNX_SpellChecker, sFunc, sentence); + NWNX_CallFunction(NWNX_SpellChecker, sFunc); + return NWNX_GetReturnValueString(NWNX_SpellChecker, sFunc); +} + +string NWNX_SpellChecker_GetSuggestSpell(string word) +{ + string sFunc = "GetSuggestSpell"; + NWNX_PushArgumentString(NWNX_SpellChecker, sFunc, word); + NWNX_CallFunction(NWNX_SpellChecker, sFunc); + return NWNX_GetReturnValueString(NWNX_SpellChecker, sFunc); +} diff --git a/gamma_age_v2/nwnx_sql.nss b/gamma_age_v2/nwnx_sql.nss new file mode 100644 index 00000000..fdd583fb --- /dev/null +++ b/gamma_age_v2/nwnx_sql.nss @@ -0,0 +1,254 @@ +/// @addtogroup sql SQL +/// @brief Functions to interface with a database through SQL +/// @{ +/// @file nwnx_sql.nss +#include "nwnx" + +const string NWNX_SQL = "NWNX_SQL"; ///< @private + +/// @brief Prepares the provided query for execution. +/// @note This does not execute the query. Will also clear any previous state. +/// @param query The query to prepare. +/// @return TRUE if the query was successfully prepared. +int NWNX_SQL_PrepareQuery(string query); + +/// @brief Executes a query which has been prepared. +/// @return The ID of this query if successful, else FALSE. +int NWNX_SQL_ExecutePreparedQuery(); + +/// @brief Directly execute an SQL query. +/// @note Clears previously prepared query states. +/// @return The ID of this query if successful, else FALSE. +int NWNX_SQL_ExecuteQuery(string query); + +/// @anchor sql_rtrnr +/// @return TRUE if one or more rows are ready, FALSE otherwise. +int NWNX_SQL_ReadyToReadNextRow(); + +/// @anchor sql_rnr +/// @brief Reads the next row of returned data. +/// @remark Should only be called after a successful call to @ref sql_rtrnr "NWNX_SQL_ReadyToReadNextRow()". +void NWNX_SQL_ReadNextRow(); + +/// @param column The column to read in the active row. +/// @return Data at the nth (0-based) column of the active row. +/// @remark Should only be called after a successful call to @ref sql_rnr "NWNX_SQL_ReadNextRow()". +string NWNX_SQL_ReadDataInActiveRow(int column = 0); + +/// @brief Set the int value of a prepared statement at given position. +/// @param position The nth ? in a prepared statement. +/// @param value The value to set. +void NWNX_SQL_PreparedInt(int position, int value); + +/// @brief Set the string value of a prepared statement at given position. +/// @param position The nth ? in a prepared statement. +/// @param value The value to set. +void NWNX_SQL_PreparedString(int position, string value); + +/// @brief Set the float value of a prepared statement at given position. +/// @param position The nth ? in a prepared statement. +/// @param value The value to set. +void NWNX_SQL_PreparedFloat(int position, float value); + +/// @brief Set the ObjectId value of a prepared statement at given position. +/// @param position The nth ? in a prepared statement. +/// @param value The value to set. +void NWNX_SQL_PreparedObjectId(int position, object value); + +/// @brief Set the full serialized object value of a prepared statement at given position. +/// @param position The nth ? in a prepared statement. +/// @param value The value to set. +/// @param base64 Use base64-encoded string format if TRUE (default), otherwise use binary format. +void NWNX_SQL_PreparedObjectFull(int position, object value, int base64 = TRUE); + +/// @brief Like NWNX_SQL_ReadDataInActiveRow, but for full serialized objects. +/// +/// The object will be deserialized and created in the game. New object ID is returned. +/// +/// The exact behavior depends on type of deserialized object and owner object: +/// * If object is an item, and owner if placeable, creature or container, the item will be created in its inventory +/// * If owner is an area, the object will be created on the ground at Vector(x,y,z) +/// * Otherwise, the object will be created outside the world and needs to be ported manually. +/// +/// @param column The column to read in the active row. +/// @param owner The owner of the object. +/// @param x, y, z The vector for objects to be placed in areas. +/// @param base64 Use base64-encoded string format if TRUE (default), otherwise use binary format. +/// @return The deserialized object. +object NWNX_SQL_ReadFullObjectInActiveRow(int column = 0, object owner = OBJECT_INVALID, float x = 0.0, float y = 0.0, float z = 0.0, int base64 = TRUE); + +/// @brief Gets the rows affected by a query. +/// @remark This command is for non-row-based statements like INSERT, UPDATE, DELETE, etc. +/// @return Number of rows affected by SQL statement or -1 if the query was not non-row-based. +int NWNX_SQL_GetAffectedRows(); + +/// Gets the database type. +/// @return The database type we're interacting with. +/// @remark This is the same value as the value of NWNX_SQL_TYPE environment variable. +string NWNX_SQL_GetDatabaseType(); + +/// @brief Free any resources attached to an existing prepared query. +/// @remark Resources are automatically freed when a new query is prepared, so calling this isn't necessary. +void NWNX_SQL_DestroyPreparedQuery(); + +/// @return The last error message generated by the database. +string NWNX_SQL_GetLastError(); + +/// @brief Gets the number of parameteres expected by a prepared query. +/// @return Returns the number of parameters expected by the prepared query or -1 if no query is prepared. +int NWNX_SQL_GetPreparedQueryParamCount(); + +/// @} + +int NWNX_SQL_PrepareQuery(string query) +{ + string sFunc = "PrepareQuery"; + + NWNX_PushArgumentString(NWNX_SQL, sFunc, query); + NWNX_CallFunction(NWNX_SQL, sFunc); + return NWNX_GetReturnValueInt(NWNX_SQL, sFunc); +} + +int NWNX_SQL_ExecutePreparedQuery() +{ + string sFunc = "ExecutePreparedQuery"; + + NWNX_CallFunction(NWNX_SQL, sFunc); + return NWNX_GetReturnValueInt(NWNX_SQL, sFunc); +} + +int NWNX_SQL_ExecuteQuery(string query) +{ + // Note: the implementation might change as support for more SQL targets arrives. + if (NWNX_SQL_PrepareQuery(query)) + { + int ret = NWNX_SQL_ExecutePreparedQuery(); + NWNX_SQL_DestroyPreparedQuery(); + return ret; + } + + return FALSE; +} + +int NWNX_SQL_ReadyToReadNextRow() +{ + string sFunc = "ReadyToReadNextRow"; + + NWNX_CallFunction(NWNX_SQL, sFunc); + return NWNX_GetReturnValueInt(NWNX_SQL, sFunc); +} + +void NWNX_SQL_ReadNextRow() +{ + string sFunc = "ReadNextRow"; + + NWNX_CallFunction(NWNX_SQL, sFunc); +} + +string NWNX_SQL_ReadDataInActiveRow(int column = 0) +{ + string sFunc = "ReadDataInActiveRow"; + + NWNX_PushArgumentInt(NWNX_SQL, sFunc, column); + NWNX_CallFunction(NWNX_SQL, sFunc); + return NWNX_GetReturnValueString(NWNX_SQL, sFunc); +} + + +void NWNX_SQL_PreparedInt(int position, int value) +{ + string sFunc = "PreparedInt"; + + NWNX_PushArgumentInt(NWNX_SQL, sFunc, value); + NWNX_PushArgumentInt(NWNX_SQL, sFunc, position); + NWNX_CallFunction(NWNX_SQL, sFunc); +} +void NWNX_SQL_PreparedString(int position, string value) +{ + string sFunc = "PreparedString"; + + NWNX_PushArgumentString(NWNX_SQL, sFunc, value); + NWNX_PushArgumentInt(NWNX_SQL, sFunc, position); + NWNX_CallFunction(NWNX_SQL, sFunc); + +} +void NWNX_SQL_PreparedFloat(int position, float value) +{ + string sFunc = "PreparedFloat"; + + NWNX_PushArgumentFloat(NWNX_SQL, sFunc, value); + NWNX_PushArgumentInt(NWNX_SQL, sFunc, position); + NWNX_CallFunction(NWNX_SQL, sFunc); + +} +void NWNX_SQL_PreparedObjectId(int position, object value) +{ + string sFunc = "PreparedObjectId"; + + NWNX_PushArgumentObject(NWNX_SQL, sFunc, value); + NWNX_PushArgumentInt(NWNX_SQL, sFunc, position); + NWNX_CallFunction(NWNX_SQL, sFunc); + +} +void NWNX_SQL_PreparedObjectFull(int position, object value, int base64 = TRUE) +{ + string sFunc = "PreparedObjectFull"; + + NWNX_PushArgumentInt(NWNX_SQL, sFunc, base64); + NWNX_PushArgumentObject(NWNX_SQL, sFunc, value); + NWNX_PushArgumentInt(NWNX_SQL, sFunc, position); + NWNX_CallFunction(NWNX_SQL, sFunc); +} + +object NWNX_SQL_ReadFullObjectInActiveRow(int column = 0, object owner = OBJECT_INVALID, float x = 0.0, float y = 0.0, float z = 0.0, int base64 = TRUE) +{ + string sFunc = "ReadFullObjectInActiveRow"; + + NWNX_PushArgumentInt(NWNX_SQL, sFunc, base64); + NWNX_PushArgumentFloat(NWNX_SQL, sFunc, z); + NWNX_PushArgumentFloat(NWNX_SQL, sFunc, y); + NWNX_PushArgumentFloat(NWNX_SQL, sFunc, x); + NWNX_PushArgumentObject(NWNX_SQL, sFunc, owner); + NWNX_PushArgumentInt(NWNX_SQL, sFunc, column); + NWNX_CallFunction(NWNX_SQL, sFunc); + return NWNX_GetReturnValueObject(NWNX_SQL, sFunc); +} + +int NWNX_SQL_GetAffectedRows() +{ + string sFunc = "GetAffectedRows"; + + NWNX_CallFunction(NWNX_SQL, sFunc); + return NWNX_GetReturnValueInt(NWNX_SQL, sFunc); +} + +string NWNX_SQL_GetDatabaseType() +{ + string sFunc = "GetDatabaseType"; + + NWNX_CallFunction(NWNX_SQL, sFunc); + return NWNX_GetReturnValueString(NWNX_SQL, sFunc); +} + +void NWNX_SQL_DestroyPreparedQuery() +{ + string sFunc = "DestroyPreparedQuery"; + + NWNX_CallFunction(NWNX_SQL, sFunc); +} + +string NWNX_SQL_GetLastError() +{ + string sFunc = "GetLastError"; + + NWNX_CallFunction(NWNX_SQL, sFunc); + return NWNX_GetReturnValueString(NWNX_SQL, sFunc); +} + +int NWNX_SQL_GetPreparedQueryParamCount() +{ + string sFunc = "GetPreparedQueryParamCount"; + + NWNX_CallFunction(NWNX_SQL, sFunc); + return NWNX_GetReturnValueInt(NWNX_SQL, sFunc); +} diff --git a/gamma_age_v2/nwnx_tests.nss b/gamma_age_v2/nwnx_tests.nss new file mode 100644 index 00000000..81b76433 --- /dev/null +++ b/gamma_age_v2/nwnx_tests.nss @@ -0,0 +1,21 @@ +/// @ingroup nwnx +/// @addtogroup tests NWNX Tests +/// @brief Helper functions when running the test scripts +/// @{ +/// @file nwnx_tests.nss + +/// @brief Reports the test results +/// @param sPlugin The plugin calling the test. +/// @param sTestName The name of the test. +/// @param bSuccess TRUE if the test passed. +void NWNX_Tests_Report(string sPlugin, string sTestName, int bSuccess); + +void NWNX_Tests_Report(string sPlugin, string sTestName, int bSuccess) +{ + if (bSuccess) + WriteTimestampedLogEntry(sPlugin + ": " + sTestName + "() success"); + else + WriteTimestampedLogEntry(sPlugin + ": " + sTestName + "() failed"); +} + +/// @} // End of tests diff --git a/gamma_age_v2/nwnx_tileset.nss b/gamma_age_v2/nwnx_tileset.nss new file mode 100644 index 00000000..3b9f71db --- /dev/null +++ b/gamma_age_v2/nwnx_tileset.nss @@ -0,0 +1,371 @@ +/// @addtogroup tileset Tileset +/// @brief An advanced plugin that exposes additional tileset and tile properties and allows builders to override the tiles of an area created with CreateArea(). +/// @{ +/// @file nwnx_tileset.nss +#include "nwnx" + +const string NWNX_Tileset = "NWNX_Tileset"; ///< @private + +/// @brief A structure containing general tileset data. +struct NWNX_Tileset_TilesetData +{ + int nNumTileData; ///< The number of tiles in the tileset. + float fHeightTransition; ///< The height difference between tiles on different heights. + int nNumTerrain; ///< The number of terrains in the tileset. + int nNumCrossers; ///< The number of crossers in the tileset. + int nNumGroups; ///< The number of groups in the tileset. + string sBorderTerrain; ///< The default border terrain of the tileset. + string sDefaultTerrain; ///< The default terrain of the tileset. + string sFloorTerrain; ///< The default floor terrain of the tileset. + int nDisplayNameStrRef; ///< The name of the tileset as strref, -1 if not set. + string sUnlocalizedName; ///< The unlocalized name of the tileset, "" if not set. + int bInterior; ///< The type of tileset. TRUE for interior, FALSE for exterior. + int bHasHeightTransition; ///< TRUE if the tileset supports multiple height levels. FALSE if not. +}; + +/// @brief A structure containing the group data for a tileset. +struct NWNX_Tileset_TilesetGroupData +{ + string sName; ///< The name of the group. + int nStrRef; ///< The StrRef of the group. + int nRows; ///< The number of rows the group has. + int nColumns; ///< The number of columns the group has. +}; + +/// @brief A structure containing the edge and corner types of a tile. +struct NWNX_Tileset_TileEdgesAndCorners +{ + string sTopLeft; ///< The top left corner. + string sTop; ///< The top edge. + string sTopRight; ///< The top right corner. + string sRight; ///< The right edge. + string sBottomRight; ///< The bottom right corner. + string sBottom; ///< The bottom edge. + string sBottomLeft; ///< The bottom left corner. + string sLeft; ///< The left edge. +}; + +/// @brief A structure containing the door data for a tile. +struct NWNX_Tileset_TileDoorData +{ + int nType; ///< The type of door, returns an index into doortypes.2da. + float fX; ///< The X position of the door. + float fY; ///< The Y position of the door. + float fZ; ///< The Z position of the door. + float fOrientation; ///< The orientation of the door. +}; + +/// @brief A structure containing custom tile data, +struct NWNX_Tileset_CustomTileData +{ + int nTileID; ///< The tile ID. See the tileset's .set file. + int nOrientation; ///< The orientation of the tile. Valid values: 0-3. + int nHeight; ///< The height of the tile. + + int nMainLightColor1; ///< A `TILE_MAIN_LIGHT_COLOR_*` value. + int nMainLightColor2; ///< A `TILE_MAIN_LIGHT_COLOR_*` value. + int nSourceLightColor1; ///< A `TILE_SOURCE_LIGHT_COLOR_*` value. + int nSourceLightColor2; ///< A `TILE_SOURCE_LIGHT_COLOR_*` value. + + int bAnimLoop1; ///< A bool to enable or disable the tile's first anim loop. + int bAnimLoop2; ///< A bool to enable or disable the tile's second anim loop. + int bAnimLoop3; ///< A bool to enable or disable the tile's third anim loop. +}; + +/// @brief Get general data of sTileset. +/// @param sTileset The tileset. +/// @return A NWNX_Tileset_TilesetData struct. +struct NWNX_Tileset_TilesetData NWNX_Tileset_GetTilesetData(string sTileset); + +/// @brief Get the name of sTileset's terrain at nIndex. +/// @param sTileset The tileset. +/// @param nIndex The index of the terrain. Range: NWNX_Tileset_TilesetData.nNumTerrain > nIndex >= 0 +/// @return The terrain name or "" on error. +string NWNX_Tileset_GetTilesetTerrain(string sTileset, int nIndex); + +/// @brief Get the name of sTileset's crosser at nIndex. +/// @param sTileset The tileset. +/// @param nIndex The index of the crosser. Range: NWNX_Tileset_TilesetData.nNumCrossers > nIndex >= 0 +/// @return The crosser name or "" on error. +string NWNX_Tileset_GetTilesetCrosser(string sTileset, int nIndex); + +/// @brief Get general data of the group at nIndex in sTileset. +/// @param sTileset The tileset. +/// @param nIndex The index of the group. Range: NWNX_Tileset_TilesetData.nNumGroups > nIndex >= 0 +/// @return A NWNX_Tileset_TilesetGroupData struct. +struct NWNX_Tileset_TilesetGroupData NWNX_Tileset_GetTilesetGroupData(string sTileset, int nIndex); + +/// @brief Get tile ID of the tile at nIndex. +/// @note NWNX_Tileset_GetTilesetGroupData() needs to be called first. +/// @param nIndex The index of the tile. Range: (NWNX_Tileset_TilesetGroupData.nRows * NWNX_Tileset_TilesetGroupData.nColumns) > nIndex >= 0 +/// @return The tile ID or 0 on error. +int NWNX_Tileset_GetTilesetGroupTile(int nIndex); + +/// @brief Get the model name of a tile in sTileset. +/// @param sTileset The tileset. +/// @param nTileID The tile ID. +/// @return The model name or "" on error. +string NWNX_Tileset_GetTileModel(string sTileset, int nTileID); + +/// @brief Get the minimap texture name of a tile in sTileset. +/// @param sTileset The tileset. +/// @param nTileID The tile ID. +/// @return The minimap texture name or "" on error. +string NWNX_Tileset_GetTileMinimapTexture(string sTileset, int nTileID); + +/// @brief Get the edges and corners of a tile in sTileset. +/// @param sTileset The tileset. +/// @param nTileID The tile ID. +/// @return A NWNX_Tileset_TileEdgesAndCorners struct. +struct NWNX_Tileset_TileEdgesAndCorners NWNX_Tileset_GetTileEdgesAndCorners(string sTileset, int nTileID); + +/// @brief Get the number of doors of a tile in sTileset. +/// @param sTileset The tileset. +/// @param nTileID The tile ID. +/// @return The amount of doors. +int NWNX_Tileset_GetTileNumDoors(string sTileset, int nTileID); + +/// @brief Get the door data of a tile in sTileset. +/// @param sTileset The tileset. +/// @param nTileID The tile ID. +/// @param nIndex The index of the door. Range: NWNX_Tileset_GetTileNumDoors() > nIndex >= 0 +/// @return A NWNX_Tileset_TileDoorData struct. +struct NWNX_Tileset_TileDoorData NWNX_Tileset_GetTileDoorData(string sTileset, int nTileID, int nIndex = 0); + +/// @brief Override the tiles of sAreaResRef with data in sOverrideName. +/// @param sAreaResRef The resref of the area to override. +/// @param sOverrideName The name of the override containing the custom tile data or "" to remove the override. +void NWNX_Tileset_SetAreaTileOverride(string sAreaResRef, string sOverrideName); + +/// @brief Create a tile override named sOverrideName. +/// @param sOverrideName The name of the override. +/// @param sTileSet The tileset the override should use. +/// @param nWidth The width of the area. Valid values: 1-32. +/// @param nHeight The height of the area. Valid values: 1-32. +void NWNX_Tileset_CreateTileOverride(string sOverrideName, string sTileSet, int nWidth, int nHeight); + +/// @brief Delete a tile override named sOverrideName. +/// @note This will also delete all custom tile data associated with sOverrideName. +/// @param sOverrideName The name of the override. +void NWNX_Tileset_DeleteTileOverride(string sOverrideName); + +/// @brief Set custom tile data for the tile at nIndex in sOverrideName. +/// @note An override must first be created with NWNX_Tileset_CreateTileOverride(). +/// @param sOverrideName The name of the override. +/// @param nIndex The index of the tile. +/// @param strCustomTileData A NWNX_Tileset_CustomTileData struct. +void NWNX_Tileset_SetOverrideTileData(string sOverrideName, int nIndex, struct NWNX_Tileset_CustomTileData strCustomTileData); + +/// @brief Delete custom tile data of the tile at nIndex in sOverrideName. +/// @param sOverrideName The name of the override. +/// @param nIndex The tile's index or -1 to remove all custom tile data. +void NWNX_Tileset_DeleteOverrideTileData(string sOverrideName, int nIndex); + +/// @} + +struct NWNX_Tileset_TilesetData NWNX_Tileset_GetTilesetData(string sTileset) +{ + string sFunc = "GetTilesetData"; + + NWNX_PushArgumentString(NWNX_Tileset, sFunc, sTileset); + NWNX_CallFunction(NWNX_Tileset, sFunc); + + struct NWNX_Tileset_TilesetData str; + str.bHasHeightTransition = NWNX_GetReturnValueInt(NWNX_Tileset, sFunc); + str.bInterior = NWNX_GetReturnValueInt(NWNX_Tileset, sFunc); + str.sUnlocalizedName = NWNX_GetReturnValueString(NWNX_Tileset, sFunc); + str.nDisplayNameStrRef = NWNX_GetReturnValueInt(NWNX_Tileset, sFunc); + str.sFloorTerrain = NWNX_GetReturnValueString(NWNX_Tileset, sFunc); + str.sDefaultTerrain = NWNX_GetReturnValueString(NWNX_Tileset, sFunc); + str.sBorderTerrain = NWNX_GetReturnValueString(NWNX_Tileset, sFunc); + str.nNumGroups = NWNX_GetReturnValueInt(NWNX_Tileset, sFunc); + str.nNumCrossers = NWNX_GetReturnValueInt(NWNX_Tileset, sFunc); + str.nNumTerrain = NWNX_GetReturnValueInt(NWNX_Tileset, sFunc); + str.fHeightTransition = NWNX_GetReturnValueFloat(NWNX_Tileset, sFunc); + str.nNumTileData = NWNX_GetReturnValueInt(NWNX_Tileset, sFunc); + + return str; +} + +string NWNX_Tileset_GetTilesetTerrain(string sTileset, int nIndex) +{ + string sFunc = "GetTilesetTerrain"; + + NWNX_PushArgumentInt(NWNX_Tileset, sFunc, nIndex); + NWNX_PushArgumentString(NWNX_Tileset, sFunc, sTileset); + NWNX_CallFunction(NWNX_Tileset, sFunc); + + return NWNX_GetReturnValueString(NWNX_Tileset, sFunc); +} + +string NWNX_Tileset_GetTilesetCrosser(string sTileset, int nIndex) +{ + string sFunc = "GetTilesetCrosser"; + + NWNX_PushArgumentInt(NWNX_Tileset, sFunc, nIndex); + NWNX_PushArgumentString(NWNX_Tileset, sFunc, sTileset); + NWNX_CallFunction(NWNX_Tileset, sFunc); + + return NWNX_GetReturnValueString(NWNX_Tileset, sFunc); +} + +struct NWNX_Tileset_TilesetGroupData NWNX_Tileset_GetTilesetGroupData(string sTileset, int nIndex) +{ + string sFunc = "GetTilesetGroupData"; + + NWNX_PushArgumentInt(NWNX_Tileset, sFunc, nIndex); + NWNX_PushArgumentString(NWNX_Tileset, sFunc, sTileset); + NWNX_CallFunction(NWNX_Tileset, sFunc); + + struct NWNX_Tileset_TilesetGroupData str; + str.nColumns = NWNX_GetReturnValueInt(NWNX_Tileset, sFunc); + str.nRows = NWNX_GetReturnValueInt(NWNX_Tileset, sFunc); + str.nStrRef = NWNX_GetReturnValueInt(NWNX_Tileset, sFunc); + str.sName = NWNX_GetReturnValueString(NWNX_Tileset, sFunc); + + return str; +} + +int NWNX_Tileset_GetTilesetGroupTile(int nIndex) +{ + string sFunc = "GetTilesetGroupTile"; + + NWNX_PushArgumentInt(NWNX_Tileset, sFunc, nIndex); + NWNX_CallFunction(NWNX_Tileset, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Tileset, sFunc); +} + +string NWNX_Tileset_GetTileModel(string sTileset, int nTileID) +{ + string sFunc = "GetTileModel"; + + NWNX_PushArgumentInt(NWNX_Tileset, sFunc, nTileID); + NWNX_PushArgumentString(NWNX_Tileset, sFunc, sTileset); + NWNX_CallFunction(NWNX_Tileset, sFunc); + + return NWNX_GetReturnValueString(NWNX_Tileset, sFunc); +} + +string NWNX_Tileset_GetTileMinimapTexture(string sTileset, int nTileID) +{ + string sFunc = "GetTileMinimapTexture"; + + NWNX_PushArgumentInt(NWNX_Tileset, sFunc, nTileID); + NWNX_PushArgumentString(NWNX_Tileset, sFunc, sTileset); + NWNX_CallFunction(NWNX_Tileset, sFunc); + + return NWNX_GetReturnValueString(NWNX_Tileset, sFunc); +} + +struct NWNX_Tileset_TileEdgesAndCorners NWNX_Tileset_GetTileEdgesAndCorners(string sTileset, int nTileID) +{ + string sFunc = "GetTileEdgesAndCorners"; + + NWNX_PushArgumentInt(NWNX_Tileset, sFunc, nTileID); + NWNX_PushArgumentString(NWNX_Tileset, sFunc, sTileset); + NWNX_CallFunction(NWNX_Tileset, sFunc); + + struct NWNX_Tileset_TileEdgesAndCorners str; + str.sLeft = NWNX_GetReturnValueString(NWNX_Tileset, sFunc); + str.sBottomLeft = NWNX_GetReturnValueString(NWNX_Tileset, sFunc); + str.sBottom = NWNX_GetReturnValueString(NWNX_Tileset, sFunc); + str.sBottomRight = NWNX_GetReturnValueString(NWNX_Tileset, sFunc); + str.sRight = NWNX_GetReturnValueString(NWNX_Tileset, sFunc); + str.sTopRight = NWNX_GetReturnValueString(NWNX_Tileset, sFunc); + str.sTop = NWNX_GetReturnValueString(NWNX_Tileset, sFunc); + str.sTopLeft = NWNX_GetReturnValueString(NWNX_Tileset, sFunc); + + return str; +} + +int NWNX_Tileset_GetTileNumDoors(string sTileset, int nTileID) +{ + string sFunc = "GetTileNumDoors"; + + NWNX_PushArgumentInt(NWNX_Tileset, sFunc, nTileID); + NWNX_PushArgumentString(NWNX_Tileset, sFunc, sTileset); + NWNX_CallFunction(NWNX_Tileset, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Tileset, sFunc); +} + +struct NWNX_Tileset_TileDoorData NWNX_Tileset_GetTileDoorData(string sTileset, int nTileID, int nIndex = 0) +{ + string sFunc = "GetTileDoorData"; + + NWNX_PushArgumentInt(NWNX_Tileset, sFunc, nIndex); + NWNX_PushArgumentInt(NWNX_Tileset, sFunc, nTileID); + NWNX_PushArgumentString(NWNX_Tileset, sFunc, sTileset); + NWNX_CallFunction(NWNX_Tileset, sFunc); + + struct NWNX_Tileset_TileDoorData str; + str.fOrientation = NWNX_GetReturnValueFloat(NWNX_Tileset, sFunc); + str.fZ = NWNX_GetReturnValueFloat(NWNX_Tileset, sFunc); + str.fY = NWNX_GetReturnValueFloat(NWNX_Tileset, sFunc); + str.fX = NWNX_GetReturnValueFloat(NWNX_Tileset, sFunc); + str.nType = NWNX_GetReturnValueInt(NWNX_Tileset, sFunc); + + return str; +} + +void NWNX_Tileset_SetAreaTileOverride(string sAreaResRef, string sOverrideName) +{ + string sFunc = "SetAreaTileOverride"; + + NWNX_PushArgumentString(NWNX_Tileset, sFunc, sOverrideName); + NWNX_PushArgumentString(NWNX_Tileset, sFunc, sAreaResRef); + + NWNX_CallFunction(NWNX_Tileset, sFunc); +} + +void NWNX_Tileset_CreateTileOverride(string sOverrideName, string sTileSet, int nWidth, int nHeight) +{ + string sFunc = "CreateTileOverride"; + + NWNX_PushArgumentInt(NWNX_Tileset, sFunc, nHeight); + NWNX_PushArgumentInt(NWNX_Tileset, sFunc, nWidth); + NWNX_PushArgumentString(NWNX_Tileset, sFunc, sTileSet); + NWNX_PushArgumentString(NWNX_Tileset, sFunc, sOverrideName); + + NWNX_CallFunction(NWNX_Tileset, sFunc); +} + +void NWNX_Tileset_DeleteTileOverride(string sOverrideName) +{ + string sFunc = "DeleteTileOverride"; + + NWNX_PushArgumentString(NWNX_Tileset, sFunc, sOverrideName); + + NWNX_CallFunction(NWNX_Tileset, sFunc); +} + +void NWNX_Tileset_SetOverrideTileData(string sOverrideName, int nIndex, struct NWNX_Tileset_CustomTileData strCustomTileData) +{ + string sFunc = "SetOverrideTileData"; + + NWNX_PushArgumentInt(NWNX_Tileset, sFunc, strCustomTileData.bAnimLoop3); + NWNX_PushArgumentInt(NWNX_Tileset, sFunc, strCustomTileData.bAnimLoop2); + NWNX_PushArgumentInt(NWNX_Tileset, sFunc, strCustomTileData.bAnimLoop1); + NWNX_PushArgumentInt(NWNX_Tileset, sFunc, strCustomTileData.nSourceLightColor2); + NWNX_PushArgumentInt(NWNX_Tileset, sFunc, strCustomTileData.nSourceLightColor1); + NWNX_PushArgumentInt(NWNX_Tileset, sFunc, strCustomTileData.nMainLightColor2); + NWNX_PushArgumentInt(NWNX_Tileset, sFunc, strCustomTileData.nMainLightColor1); + NWNX_PushArgumentInt(NWNX_Tileset, sFunc, strCustomTileData.nHeight); + NWNX_PushArgumentInt(NWNX_Tileset, sFunc, strCustomTileData.nOrientation); + NWNX_PushArgumentInt(NWNX_Tileset, sFunc, strCustomTileData.nTileID); + NWNX_PushArgumentInt(NWNX_Tileset, sFunc, nIndex); + NWNX_PushArgumentString(NWNX_Tileset, sFunc, sOverrideName); + + NWNX_CallFunction(NWNX_Tileset, sFunc); +} + +void NWNX_Tileset_DeleteOverrideTileData(string sOverrideName, int nIndex) +{ + string sFunc = "DeleteOverrideTileData"; + + NWNX_PushArgumentInt(NWNX_Tileset, sFunc, nIndex); + NWNX_PushArgumentString(NWNX_Tileset, sFunc, sOverrideName); + + NWNX_CallFunction(NWNX_Tileset, sFunc); +} diff --git a/gamma_age_v2/nwnx_time.nss b/gamma_age_v2/nwnx_time.nss new file mode 100644 index 00000000..1e4e71bf --- /dev/null +++ b/gamma_age_v2/nwnx_time.nss @@ -0,0 +1,63 @@ +/// @addtogroup time Time +/// @brief Provides various time related functions +/// @{ +/// @file nwnx_time.nss +#include "nwnx" + +const string NWNX_Time = "NWNX_Time"; ///< @private + +/// @brief Returns the current date. +/// @return The date in the format (mm/dd/yyyy). +string NWNX_Time_GetSystemDate(); + +/// @brief Returns current time. +/// @return The current time in the format (24:mm:ss). +string NWNX_Time_GetSystemTime(); + +/// @return Returns the number of seconds since midnight on January 1, 1970. +int NWNX_Time_GetTimeStamp(); + +/// @brief A high resolution timestamp +struct NWNX_Time_HighResTimestamp +{ + int seconds; ///< Seconds since epoch + int microseconds; ///< Microseconds +}; + +/// @return Returns the number of microseconds since midnight on January 1, 1970. +struct NWNX_Time_HighResTimestamp NWNX_Time_GetHighResTimeStamp(); + +/// @} + +string NWNX_Time_GetSystemDate() +{ + string sFunc = "GetSystemDate"; + NWNX_CallFunction(NWNX_Time, sFunc); + return NWNX_GetReturnValueString(NWNX_Time, sFunc); +} + +string NWNX_Time_GetSystemTime() +{ + string sFunc = "GetSystemTime"; + NWNX_CallFunction(NWNX_Time, sFunc); + return NWNX_GetReturnValueString(NWNX_Time, sFunc); +} + +int NWNX_Time_GetTimeStamp() +{ + string sFunc = "GetTimeStamp"; + + NWNX_CallFunction(NWNX_Time, sFunc); + return NWNX_GetReturnValueInt(NWNX_Time, sFunc); +} + +struct NWNX_Time_HighResTimestamp NWNX_Time_GetHighResTimeStamp() +{ + struct NWNX_Time_HighResTimestamp t; + string sFunc = "GetHighResTimeStamp"; + + NWNX_CallFunction(NWNX_Time, sFunc); + t.microseconds = NWNX_GetReturnValueInt(NWNX_Time, sFunc); + t.seconds = NWNX_GetReturnValueInt(NWNX_Time, sFunc); + return t; +} diff --git a/gamma_age_v2/nwnx_util.nss b/gamma_age_v2/nwnx_util.nss new file mode 100644 index 00000000..929a5f62 --- /dev/null +++ b/gamma_age_v2/nwnx_util.nss @@ -0,0 +1,602 @@ +/// @addtogroup util Util +/// @brief Provides various utility functions that don't have a better home +/// @{ +/// @file nwnx_util.nss +#include "nwnx" + +const string NWNX_Util = "NWNX_Util"; ///< @private + +/// @name Resref Types +/// @anchor resref_types +/// Constants for the various types of resrefs. +/// +/// @{ +const int NWNX_UTIL_RESREF_TYPE_NSS = 2009; +const int NWNX_UTIL_RESREF_TYPE_NCS = 2010; +const int NWNX_UTIL_RESREF_TYPE_AREA_ARE = 2012; +const int NWNX_UTIL_RESREF_TYPE_TWODA = 2017; +const int NWNX_UTIL_RESREF_TYPE_AREA_GIT = 2023; +const int NWNX_UTIL_RESREF_TYPE_ITEM = 2025; +const int NWNX_UTIL_RESREF_TYPE_CREATURE = 2027; +const int NWNX_UTIL_RESREF_TYPE_DIALOG = 2029; +const int NWNX_UTIL_RESREF_TYPE_TRIGGER = 2032; +const int NWNX_UTIL_RESREF_TYPE_SOUND = 2035; +const int NWNX_UTIL_RESREF_TYPE_ENCOUNTER = 2040; +const int NWNX_UTIL_RESREF_TYPE_DOOR = 2042; +const int NWNX_UTIL_RESREF_TYPE_PLACEABLE = 2044; +const int NWNX_UTIL_RESREF_TYPE_STORE = 2051; +const int NWNX_UTIL_RESREF_TYPE_WAYPOINT = 2058; +///@} + +/// @brief A world time struct +struct NWNX_Util_WorldTime +{ + int nCalendarDay; ///< The calendar day + int nTimeOfDay; ///< The time of day +}; + +/// @brief Gets the name of the currently executing script. +/// @note If depth is > 0, it will return the name of the script that called this one via ExecuteScript(). +/// @param depth to seek the executing script. +/// @return The name of the currently executing script. +string NWNX_Util_GetCurrentScriptName(int depth = 0); + +/// @brief Gets a string that contains the ascii table. +/// @note The character at index 0 is a space. +/// @return A string that contains all characters at their position (e.g. 'A' at 65). +string NWNX_Util_GetAsciiTableString(); + +/// @brief Gets an integer hash of a string. +/// @param str The string to hash. +/// @return The hashed string as an integer. +int NWNX_Util_Hash(string str); + +/// @brief Gets the value of customTokenNumber. +/// @param customTokenNumber The token number to query. +/// @return The string representation of the token value. +string NWNX_Util_GetCustomToken(int customTokenNumber); + +/// @brief Convert an effect type to an itemproperty type. +/// @param e The effect to convert to an itemproperty. +/// @return The converted itemproperty. +itemproperty NWNX_Util_EffectToItemProperty(effect e); + +/// +/// @brief Convert an itemproperty type to an effect type. +/// @param ip The itemproperty to convert to an effect. +/// @return The converted effect. +effect NWNX_Util_ItemPropertyToEffect(itemproperty ip); + +/// @brief Strip any color codes from a string. +/// @param str The string to strip of color. +/// @return The new string without any color codes. +string NWNX_Util_StripColors(string str); + +/// @brief Determines if the supplied resref exists. +/// @param resref The resref to check. +/// @param type The @ref resref_types "Resref Type". +/// @return TRUE/FALSE +int NWNX_Util_IsValidResRef(string resref, int type = NWNX_UTIL_RESREF_TYPE_CREATURE); + +/// @brief Retrieves an environment variable. +/// @param sVarname The environment variable to query. +/// @return The value of the environment variable. +string NWNX_Util_GetEnvironmentVariable(string sVarname); + +/// @brief Gets the module real life minutes per in game hour. +/// @return The minutes per hour. +int NWNX_Util_GetMinutesPerHour(); + +/// @brief Set module real life minutes per in game hour. +/// @param minutes The minutes per hour. +void NWNX_Util_SetMinutesPerHour(int minutes); + +/// @anchor util_encode_url +/// @brief Encodes a string for usage in a URL. +/// @param str The string to encode for a URL. +/// @return The url encoded string. +string NWNX_Util_EncodeStringForURL(string str); + +/// @anchor twoda_row_count +/// @brief Gets the row count for a 2da. +/// @param str The 2da to check (do not include the .2da). +/// @return The amount of rows in the 2da. +int NWNX_Util_Get2DARowCount(string str); + +/// @brief Get the first resref of nType. +/// @param nType A @ref resref_types "Resref Type". +/// @param sRegexFilter Lets you filter out resrefs using a regexfilter. +/// For example: **nwnx_.\*** gets you all scripts prefixed with nwnx_ +/// when using the NSS resref type. +/// @param bModuleResourcesOnly If TRUE only custom resources will be returned. +/// @return The first resref found or "" if none is found. +string NWNX_Util_GetFirstResRef(int nType, string sRegexFilter = "", int bModuleResourcesOnly = TRUE); + +/// @brief Get the next resref. +/// @return The next resref found or "" if none is found. +string NWNX_Util_GetNextResRef(); + +/// @brief Get the ticks per second of the server. +/// @remark Useful to dynamically detect lag and adjust behavior accordingly. +/// @return The ticks per second. +int NWNX_Util_GetServerTicksPerSecond(); + +/// @brief Get the last created object. +/// @param nObjectType Does not take the NWScript OBJECT_TYPE_* constants. +/// Use NWNX_Consts_TranslateNWScriptObjectType() to get their NWNX equivalent. +/// @param nNthLast The nth last object created. +/// @return The last created object. On error, this returns OBJECT_INVALID. +object NWNX_Util_GetLastCreatedObject(int nObjectType, int nNthLast = 1); + +/// @brief Compiles and adds a script to the UserDirectory/nwnx folder, or to the location of sAlias. +/// @note Will override existing scripts that are in the module. +/// @param sFileName The script filename without extension, 16 or less characters. +/// @param sScriptData The script data to compile +/// @param bWrapIntoMain Set to TRUE to wrap sScriptData into void main(){}. +/// @param sAlias The alias of the resource directory to add the ncs file to. Default: UserDirectory/nwnx +/// @return "" on success, or the compilation error. +string NWNX_Util_AddScript(string sFileName, string sScriptData, int bWrapIntoMain = FALSE, string sAlias = "NWNX"); + +/// @brief Gets the contents of a .nss script file as a string. +/// @param sScriptName The name of the script to get the contents of. +/// @param nMaxLength The max length of the return string, -1 to get everything +/// @return The script file contents or "" on error. +string NWNX_Util_GetNSSContents(string sScriptName, int nMaxLength = -1); + +/// @brief Adds a nss file to the UserDirectory/nwnx folder, or to the location of sAlias. +/// @note Will override existing nss files that are in the module +/// @param sFileName The script filename without extension, 16 or less characters. +/// @param sContents The contents of the nss file +/// @param sAlias The alias of the resource directory to add the nss file to. Default: UserDirectory/nwnx +/// @return TRUE on success. +int NWNX_Util_AddNSSFile(string sFileName, string sContents, string sAlias = "NWNX"); + +/// @brief Remove sFileName of nType from the UserDirectory/nwnx folder, or from the location of sAlias. +/// @param sFileName The filename without extension, 16 or less characters. +/// @param nType The @ref resref_types "Resref Type". +/// @param sAlias The alias of the resource directory to remove the file from. Default: UserDirectory/nwnx +/// @return TRUE on success. +int NWNX_Util_RemoveNWNXResourceFile(string sFileName, int nType, string sAlias = "NWNX"); + +/// @brief Set the NWScript instruction limit. +/// @param nInstructionLimit The new limit or -1 to reset to default. +void NWNX_Util_SetInstructionLimit(int nInstructionLimit); + +/// @brief Get the NWScript instruction limit. +int NWNX_Util_GetInstructionLimit(); + +/// @brief Set the number of NWScript instructions currently executed. +/// @param nInstructions The number of instructions, must be >= 0. +void NWNX_Util_SetInstructionsExecuted(int nInstructions); + +/// @brief Get the number of NWScript instructions currently executed. +int NWNX_Util_GetInstructionsExecuted(); + +/// @brief Register a server console command that will execute a script chunk. +/// @note Example usage: NWNX_Util_RegisterServerConsoleCommand("test", "PrintString(\"Test Command -> Args: $args\");"); +/// @param sCommand The name of the command. +/// @param sScriptChunk The script chunk to run. You can use $args to get the console command arguments. +/// @return TRUE on success. +int NWNX_Util_RegisterServerConsoleCommand(string sCommand, string sScriptChunk); + +/// @brief Unregister a server console command that was registered with NWNX_Util_RegisterServerConsoleCommand(). +/// @param sCommand The name of the command. +void NWNX_Util_UnregisterServerConsoleCommand(string sCommand); + +/// @brief Determines if the given plugin exists and is enabled. +/// @param sPlugin The name of the plugin to check. This is the case sensitive plugin name as used by NWNX_CallFunction, NWNX_PushArgumentX +/// @note Example usage: NWNX_Util_PluginExists("NWNX_Creature"); +/// @return TRUE if the plugin exists and is enabled, otherwise FALSE. +int NWNX_Util_PluginExists(string sPlugin); + +/// @brief Gets the server's current working user folder. +/// @return The absolute path of the server's home directory (-userDirectory) +string NWNX_Util_GetUserDirectory(); + +/// @brief Get the return value of the last run script with a StartingConditional +/// @return Return value of the last run script. +int NWNX_Util_GetScriptReturnValue(); + +/// @brief Create a door. +/// @param sResRef The ResRef of the door. +/// @param locLocation The location to create the door at. +/// @param sNewTag An optional new tag for the door. +/// @param nAppearanceType An optional index into doortypes.2da for appearance. +/// @return The door, or OBJECT_INVALID on failure. +object NWNX_Util_CreateDoor(string sResRef, location locLocation, string sNewTag = "", int nAppearanceType = -1); + +/// @brief Set the object that will be returned by GetItemActivator. +/// @param oObject An object. +void NWNX_Util_SetItemActivator(object oObject); + +/// @brief Get the world time as calendar day and time of day. +/// @note This function is useful for calculating effect expiry times. +/// @param fAdjustment An adjustment in seconds, 0.0f will return the current world time, +/// positive or negative values will return a world time in the future or past. +/// @return A NWNX_Util_WorldTime struct with the calendar day and time of day. +struct NWNX_Util_WorldTime NWNX_Util_GetWorldTime(float fAdjustment = 0.0f); + +/// @brief Set a server-side resource override. +/// @param nResType A @ref resref_types "Resref Type". +/// @param sOldName The old resource name, 16 characters or less. +/// @param sNewName The new resource name or "" to clear a previous override, 16 characters or less. +void NWNX_Util_SetResourceOverride(int nResType, string sOldName, string sNewName); + +/// @brief Get a server-side resource override. +/// @param nResType A @ref resref_types "Resref Type". +/// @param sName The name of the resource, 16 characters or less. +/// @return The resource override, or "" if one is not set. +string NWNX_Util_GetResourceOverride(int nResType, string sName); + +/// @brief Get if a script param is set. +/// @param sParamName The script parameter name to check. +/// @return TRUE if the script param is set, FALSE if not or on error. +int NWNX_Util_GetScriptParamIsSet(string sParamName); + +/// @brief Set the module dawn hour. +/// @param nDawnHour The new dawn hour +void NWNX_Util_SetDawnHour(int nDawnHour); + +/// @brief Set the module dusk hour. +/// @param nDuskHour The new dusk hour +void NWNX_Util_SetDuskHour(int nDuskHour); + +/// @} + +string NWNX_Util_GetCurrentScriptName(int depth = 0) +{ + string sFunc = "GetCurrentScriptName"; + NWNX_PushArgumentInt(NWNX_Util, sFunc, depth); + NWNX_CallFunction(NWNX_Util, sFunc); + return NWNX_GetReturnValueString(NWNX_Util, sFunc); +} + +string NWNX_Util_GetAsciiTableString() +{ + string sFunc = "GetAsciiTableString"; + NWNX_CallFunction(NWNX_Util, sFunc); + return NWNX_GetReturnValueString(NWNX_Util, sFunc); +} + +int NWNX_Util_Hash(string str) +{ + string sFunc = "Hash"; + NWNX_PushArgumentString(NWNX_Util, sFunc, str); + NWNX_CallFunction(NWNX_Util, sFunc); + return NWNX_GetReturnValueInt(NWNX_Util, sFunc); +} + +string NWNX_Util_GetCustomToken(int customTokenNumber) +{ + string sFunc = "GetCustomToken"; + NWNX_PushArgumentInt(NWNX_Util, sFunc, customTokenNumber); + NWNX_CallFunction(NWNX_Util, sFunc); + return NWNX_GetReturnValueString(NWNX_Util, sFunc); +} + +itemproperty NWNX_Util_EffectToItemProperty(effect e) +{ + string sFunc = "EffectTypeCast"; + NWNX_PushArgumentEffect(NWNX_Util, sFunc, e); + NWNX_CallFunction(NWNX_Util, sFunc); + return NWNX_GetReturnValueItemProperty(NWNX_Util, sFunc); +} + +effect NWNX_Util_ItemPropertyToEffect(itemproperty ip) +{ + string sFunc = "EffectTypeCast"; + NWNX_PushArgumentItemProperty(NWNX_Util, sFunc, ip); + NWNX_CallFunction(NWNX_Util, sFunc); + return NWNX_GetReturnValueEffect(NWNX_Util, sFunc); +} + +string NWNX_Util_StripColors(string str) +{ + string sFunc = "StripColors"; + NWNX_PushArgumentString(NWNX_Util, sFunc, str); + NWNX_CallFunction(NWNX_Util, sFunc); + return NWNX_GetReturnValueString(NWNX_Util, sFunc); +} + +int NWNX_Util_IsValidResRef(string resref, int type = NWNX_UTIL_RESREF_TYPE_CREATURE) +{ + string sFunc = "IsValidResRef"; + NWNX_PushArgumentInt(NWNX_Util, sFunc, type); + NWNX_PushArgumentString(NWNX_Util, sFunc, resref); + NWNX_CallFunction(NWNX_Util, sFunc); + return NWNX_GetReturnValueInt(NWNX_Util, sFunc); +} + +string NWNX_Util_GetEnvironmentVariable(string sVarname) +{ + string sFunc = "GetEnvironmentVariable"; + NWNX_PushArgumentString(NWNX_Util, sFunc, sVarname); + NWNX_CallFunction(NWNX_Util, sFunc); + return NWNX_GetReturnValueString(NWNX_Util, sFunc); +} + +int NWNX_Util_GetMinutesPerHour() +{ + string sFunc = "GetMinutesPerHour"; + NWNX_CallFunction(NWNX_Util, sFunc); + return NWNX_GetReturnValueInt(NWNX_Util, sFunc); +} + +void NWNX_Util_SetMinutesPerHour(int minutes) +{ + string sFunc = "SetMinutesPerHour"; + NWNX_PushArgumentInt(NWNX_Util, sFunc, minutes); + NWNX_CallFunction(NWNX_Util, sFunc); +} + +string NWNX_Util_EncodeStringForURL(string sURL) +{ + string sFunc = "EncodeStringForURL"; + + NWNX_PushArgumentString(NWNX_Util, sFunc, sURL); + NWNX_CallFunction(NWNX_Util, sFunc); + + return NWNX_GetReturnValueString(NWNX_Util, sFunc); +} + +int NWNX_Util_Get2DARowCount(string str) +{ + string sFunc = "Get2DARowCount"; + NWNX_PushArgumentString(NWNX_Util, sFunc, str); + NWNX_CallFunction(NWNX_Util, sFunc); + return NWNX_GetReturnValueInt(NWNX_Util, sFunc); +} + +string NWNX_Util_GetFirstResRef(int nType, string sRegexFilter = "", int bModuleResourcesOnly = TRUE) +{ + string sFunc = "GetFirstResRef"; + + NWNX_PushArgumentInt(NWNX_Util, sFunc, bModuleResourcesOnly); + NWNX_PushArgumentString(NWNX_Util, sFunc, sRegexFilter); + NWNX_PushArgumentInt(NWNX_Util, sFunc, nType); + NWNX_CallFunction(NWNX_Util, sFunc); + + return NWNX_GetReturnValueString(NWNX_Util, sFunc); +} + +string NWNX_Util_GetNextResRef() +{ + string sFunc = "GetNextResRef"; + + NWNX_CallFunction(NWNX_Util, sFunc); + + return NWNX_GetReturnValueString(NWNX_Util, sFunc); +} + +int NWNX_Util_GetServerTicksPerSecond() +{ + string sFunc = "GetServerTicksPerSecond"; + + NWNX_CallFunction(NWNX_Util, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Util, sFunc); +} + +object NWNX_Util_GetLastCreatedObject(int nObjectType, int nNthLast = 1) +{ + string sFunc = "GetLastCreatedObject"; + + NWNX_PushArgumentInt(NWNX_Util, sFunc, nNthLast); + NWNX_PushArgumentInt(NWNX_Util, sFunc, nObjectType); + NWNX_CallFunction(NWNX_Util, sFunc); + + return NWNX_GetReturnValueObject(NWNX_Util, sFunc); +} + +string NWNX_Util_AddScript(string sFileName, string sScriptData, int bWrapIntoMain = FALSE, string sAlias = "NWNX") +{ + string sFunc = "AddScript"; + + NWNX_PushArgumentString(NWNX_Util, sFunc, sAlias); + NWNX_PushArgumentInt(NWNX_Util, sFunc, bWrapIntoMain); + NWNX_PushArgumentString(NWNX_Util, sFunc, sScriptData); + NWNX_PushArgumentString(NWNX_Util, sFunc, sFileName); + NWNX_CallFunction(NWNX_Util, sFunc); + + return NWNX_GetReturnValueString(NWNX_Util, sFunc); +} + +string NWNX_Util_GetNSSContents(string sScriptName, int nMaxLength = -1) +{ + string sFunc = "GetNSSContents"; + + NWNX_PushArgumentInt(NWNX_Util, sFunc, nMaxLength); + NWNX_PushArgumentString(NWNX_Util, sFunc, sScriptName); + NWNX_CallFunction(NWNX_Util, sFunc); + + return NWNX_GetReturnValueString(NWNX_Util, sFunc); +} + +int NWNX_Util_AddNSSFile(string sFileName, string sContents, string sAlias = "NWNX") +{ + string sFunc = "AddNSSFile"; + + NWNX_PushArgumentString(NWNX_Util, sFunc, sAlias); + NWNX_PushArgumentString(NWNX_Util, sFunc, sContents); + NWNX_PushArgumentString(NWNX_Util, sFunc, sFileName); + NWNX_CallFunction(NWNX_Util, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Util, sFunc); +} + +int NWNX_Util_RemoveNWNXResourceFile(string sFileName, int nType, string sAlias = "NWNX") +{ + string sFunc = "RemoveNWNXResourceFile"; + + NWNX_PushArgumentString(NWNX_Util, sFunc, sAlias); + NWNX_PushArgumentInt(NWNX_Util, sFunc, nType); + NWNX_PushArgumentString(NWNX_Util, sFunc, sFileName); + NWNX_CallFunction(NWNX_Util, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Util, sFunc); +} + +void NWNX_Util_SetInstructionLimit(int nInstructionLimit) +{ + string sFunc = "SetInstructionLimit"; + + NWNX_PushArgumentInt(NWNX_Util, sFunc, nInstructionLimit); + NWNX_CallFunction(NWNX_Util, sFunc); +} + +int NWNX_Util_GetInstructionLimit() +{ + string sFunc = "GetInstructionLimit"; + + NWNX_CallFunction(NWNX_Util, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Util, sFunc); +} + +void NWNX_Util_SetInstructionsExecuted(int nInstructions) +{ + string sFunc = "SetInstructionsExecuted"; + + NWNX_PushArgumentInt(NWNX_Util, sFunc, nInstructions); + NWNX_CallFunction(NWNX_Util, sFunc); +} + +int NWNX_Util_GetInstructionsExecuted() +{ + string sFunc = "GetInstructionsExecuted"; + + NWNX_CallFunction(NWNX_Util, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Util, sFunc); +} + +int NWNX_Util_RegisterServerConsoleCommand(string sCommand, string sScriptChunk) +{ + string sFunc = "RegisterServerConsoleCommand"; + + NWNX_PushArgumentString(NWNX_Util, sFunc, sScriptChunk); + NWNX_PushArgumentString(NWNX_Util, sFunc, sCommand); + NWNX_CallFunction(NWNX_Util, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Util, sFunc); +} + +void NWNX_Util_UnregisterServerConsoleCommand(string sCommand) +{ + string sFunc = "UnregisterServerConsoleCommand"; + + NWNX_PushArgumentString(NWNX_Util, sFunc, sCommand); + NWNX_CallFunction(NWNX_Util, sFunc); +} + +int NWNX_Util_PluginExists(string sPlugin) +{ + string sFunc = "PluginExists"; + NWNX_PushArgumentString(NWNX_Util, sFunc, sPlugin); + NWNX_CallFunction(NWNX_Util, sFunc); + return NWNX_GetReturnValueInt(NWNX_Util, sFunc); +} + +string NWNX_Util_GetUserDirectory() +{ + string sFunc = "GetUserDirectory"; + NWNX_CallFunction(NWNX_Util, sFunc); + return NWNX_GetReturnValueString(NWNX_Util, sFunc); +} + +int NWNX_Util_GetScriptReturnValue() +{ + string sFunc = "GetScriptReturnValue"; + + NWNX_CallFunction(NWNX_Util, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Util, sFunc); +} + +object NWNX_Util_CreateDoor(string sResRef, location locLocation, string sNewTag = "", int nAppearanceType = -1) +{ + string sFunc = "CreateDoor"; + + vector vPosition = GetPositionFromLocation(locLocation); + + NWNX_PushArgumentInt(NWNX_Util, sFunc, nAppearanceType); + NWNX_PushArgumentString(NWNX_Util, sFunc, sNewTag); + NWNX_PushArgumentFloat(NWNX_Util, sFunc, GetFacingFromLocation(locLocation)); + NWNX_PushArgumentFloat(NWNX_Util, sFunc, vPosition.z); + NWNX_PushArgumentFloat(NWNX_Util, sFunc, vPosition.y); + NWNX_PushArgumentFloat(NWNX_Util, sFunc, vPosition.x); + NWNX_PushArgumentObject(NWNX_Util, sFunc, GetAreaFromLocation(locLocation)); + NWNX_PushArgumentString(NWNX_Util, sFunc, sResRef); + NWNX_CallFunction(NWNX_Util, sFunc); + + return NWNX_GetReturnValueObject(NWNX_Util, sFunc); +} + +void NWNX_Util_SetItemActivator(object oObject) +{ + string sFunc = "SetItemActivator"; + + NWNX_PushArgumentObject(NWNX_Util, sFunc, oObject); + NWNX_CallFunction(NWNX_Util, sFunc); +} + +struct NWNX_Util_WorldTime NWNX_Util_GetWorldTime(float fAdjustment = 0.0f) +{ + string sFunc = "GetWorldTime"; + + NWNX_PushArgumentFloat(NWNX_Util, sFunc, fAdjustment); + NWNX_CallFunction(NWNX_Util, sFunc); + + struct NWNX_Util_WorldTime strWorldTime; + strWorldTime.nTimeOfDay = NWNX_GetReturnValueInt(NWNX_Util, sFunc); + strWorldTime.nCalendarDay = NWNX_GetReturnValueInt(NWNX_Util, sFunc); + + return strWorldTime; +} + +void NWNX_Util_SetResourceOverride(int nResType, string sOldName, string sNewName) +{ + string sFunc = "SetResourceOverride"; + + NWNX_PushArgumentString(NWNX_Util, sFunc, sNewName); + NWNX_PushArgumentString(NWNX_Util, sFunc, sOldName); + NWNX_PushArgumentInt(NWNX_Util, sFunc, nResType); + NWNX_CallFunction(NWNX_Util, sFunc); +} + +string NWNX_Util_GetResourceOverride(int nResType, string sName) +{ + string sFunc = "GetResourceOverride"; + + NWNX_PushArgumentString(NWNX_Util, sFunc, sName); + NWNX_PushArgumentInt(NWNX_Util, sFunc, nResType); + NWNX_CallFunction(NWNX_Util, sFunc); + + return NWNX_GetReturnValueString(NWNX_Util, sFunc); +} + +int NWNX_Util_GetScriptParamIsSet(string sParamName) +{ + string sFunc = "GetScriptParamIsSet"; + + NWNX_PushArgumentString(NWNX_Util, sFunc, sParamName); + NWNX_CallFunction(NWNX_Util, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Util, sFunc); +} + +void NWNX_Util_SetDawnHour(int nDawnHour) +{ + string sFunc = "SetDawnHour"; + + NWNX_PushArgumentInt(NWNX_Util, sFunc, nDawnHour); + NWNX_CallFunction(NWNX_Util, sFunc); +} + +void NWNX_Util_SetDuskHour(int nDuskHour) +{ + string sFunc = "SetDuskHour"; + + NWNX_PushArgumentInt(NWNX_Util, sFunc, nDuskHour); + NWNX_CallFunction(NWNX_Util, sFunc); +} diff --git a/gamma_age_v2/nwnx_visibility.nss b/gamma_age_v2/nwnx_visibility.nss new file mode 100644 index 00000000..31406370 --- /dev/null +++ b/gamma_age_v2/nwnx_visibility.nss @@ -0,0 +1,77 @@ +/// @addtogroup visibility Visibility +/// @brief Functions to manipulate visibility of objects both globally or per observer +/// @{ +/// @file nwnx_visibility.nss +#include "nwnx" + +const string NWNX_Visibility = "NWNX_Visibility"; ///< @private + +/// @name Visibility Types +/// @anchor vis_types +/// @{ +const int NWNX_VISIBILITY_DEFAULT = -1; +const int NWNX_VISIBILITY_VISIBLE = 0; +const int NWNX_VISIBILITY_HIDDEN = 1; +const int NWNX_VISIBILITY_DM_ONLY = 2; +const int NWNX_VISIBILITY_ALWAYS_VISIBLE = 3; +const int NWNX_VISIBILITY_ALWAYS_VISIBLE_DM_ONLY = 4; +///@} + +/// @brief Queries the existing visibility override for given (oPlayer, oTarget) pair. +/// If oPlayer is OBJECT_INVALID, the global visibility override will be returned. +/// +/// * NWNX_VISIBILITY_DEFAULT = Override not set. +/// * NWNX_VISIBILITY_VISIBLE = Target is visible but still adheres to default visibility rules. +/// * NWNX_VISIBILITY_HIDDEN = Target is always hidden. +/// * NWNX_VISIBILITY_DM_ONLY = Target is only visible to DMs but still adheres to default visibility rules. +/// * NWNX_VISIBILITY_ALWAYS_VISIBLE = Target is always visible in all circumstances. +/// * NWNX_VISIBILITY_ALWAYS_VISIBLE_DM_ONLY = Target is always visible only to DMs in all circumstances. +/// +/// @param oPlayer The PC Object or OBJECT_INVALID. +/// @param oTarget The object for which we're querying the visibility override. +/// @return The @ref vis_types "Visibility Type". +int NWNX_Visibility_GetVisibilityOverride(object oPlayer, object oTarget); + +/// @brief Overrides the default visibility rules about how oPlayer perceives oTarget. +/// If oPlayer is OBJECT_INVALID, the global visibility override will be set. +/// +/// * NWNX_VISIBILITY_DEFAULT = Remove a set override. +/// * NWNX_VISIBILITY_VISIBLE = Target is visible but still adheres to default visibility rules. +/// * NWNX_VISIBILITY_HIDDEN = Target is always hidden. +/// * NWNX_VISIBILITY_DM_ONLY = Target is only visible to DMs but still adheres to default visibility rules. +/// * NWNX_VISIBILITY_ALWAYS_VISIBLE = Target is always visible in all circumstances. +/// * NWNX_VISIBILITY_ALWAYS_VISIBLE_DM_ONLY = Target is always visible to DMs in all circumstances. +/// +/// @warning Setting too many objects to ALWAYS_VISIBLE in an area will impact the performance of your players. Use sparingly. +/// +/// @note Player state overrides the global state which means if a global state is set +/// to NWNX_VISIBILITY_HIDDEN or NWNX_VISIBILITY_DM_ONLY but the player's state is +/// set to NWNX_VISIBILITY_VISIBLE for the target, the object will be visible to the player. +/// +/// @param oPlayer The PC Object or OBJECT_INVALID. +/// @param oTarget The object for which we're altering the visibility. +/// @param nOverride The visibility type from @ref vis_types "Visibility Types". +void NWNX_Visibility_SetVisibilityOverride(object oPlayer, object oTarget, int nOverride); + +/// @} + +int NWNX_Visibility_GetVisibilityOverride(object oPlayer, object oTarget) +{ + string sFunc = "GetVisibilityOverride"; + + NWNX_PushArgumentObject(NWNX_Visibility, sFunc, oTarget); + NWNX_PushArgumentObject(NWNX_Visibility, sFunc, oPlayer); + NWNX_CallFunction(NWNX_Visibility, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Visibility, sFunc); +} + +void NWNX_Visibility_SetVisibilityOverride(object oPlayer, object oTarget, int nOverride) +{ + string sFunc = "SetVisibilityOverride"; + + NWNX_PushArgumentInt(NWNX_Visibility, sFunc, nOverride); + NWNX_PushArgumentObject(NWNX_Visibility, sFunc, oTarget); + NWNX_PushArgumentObject(NWNX_Visibility, sFunc, oPlayer); + NWNX_CallFunction(NWNX_Visibility, sFunc); +} diff --git a/gamma_age_v2/nwnx_weapon.nss b/gamma_age_v2/nwnx_weapon.nss new file mode 100644 index 00000000..6f57d15e --- /dev/null +++ b/gamma_age_v2/nwnx_weapon.nss @@ -0,0 +1,330 @@ +/// @addtogroup weapon Weapon +/// @brief Functions exposing additional weapon properties. +/// @{ +/// @file nwnx_weapon.nss +#include "nwnx" + +const string NWNX_Weapon = "NWNX_Weapon"; ///< @private + +/// @name Weapons Options +/// @anchor wpn_opts +/// +/// Options constants to be used with NWNX_Weapon_SetOption function. +/// @{ +const int NWNX_WEAPON_OPT_GRTFOCUS_AB_BONUS = 0; ///< Greater Focus Attack Bonus +const int NWNX_WEAPON_OPT_GRTSPEC_DAM_BONUS = 1; ///< Greater Specialization Damage Bonus +///@} + +// Get Event Data Constants +const int NWNX_WEAPON_GETDATA_DC = 0; ///< Get Devastating Critical Data + +// Set Event Data Constants +const int NWNX_WEAPON_SETDATA_DC_BYPASS = 0; ///< Set Devastating Critical Bypass + +/// Devastating critical event data +struct NWNX_Weapon_DevastatingCriticalEvent_Data +{ + object oWeapon; ///< The weapon used to cause the event. + object oTarget; ///< The target hit with a devastating critical. + int nDamage; ///< The damage points delivered. +}; + +/// @brief Set nFeat as weapon focus feat for a base item. +/// @param nBaseItem The base item id. +/// @param nFeat The feat to set. +void NWNX_Weapon_SetWeaponFocusFeat(int nBaseItem, int nFeat); + +/// @brief Set required creature size for a weapon base item to be finessable. +/// @param nBaseItem The base item id. +/// @param nSize The creature size minimum to consider this weapon finessable. +void NWNX_Weapon_SetWeaponFinesseSize(int nBaseItem, int nSize); + +/// @brief Get required creature size for a weapon base item to be finessable. +/// @param nBaseItem The base item id. +int NWNX_Weapon_GetWeaponFinesseSize(int nBaseItem); + +/// @brief Set weapon base item to be considered as unarmed for weapon finesse feat. +/// @param nBaseItem The base item id. +void NWNX_Weapon_SetWeaponUnarmed(int nBaseItem); + +/// @brief Set a feat as weapon improved critical for a base item. +/// @param nBaseItem The base item id. +/// @param nFeat The feat to set. +void NWNX_Weapon_SetWeaponImprovedCriticalFeat(int nBaseItem, int nFeat); + +/// @brief Set a feat as weapon specialization for a base item. +/// @param nBaseItem The base item id. +/// @param nFeat The feat to set. +void NWNX_Weapon_SetWeaponSpecializationFeat(int nBaseItem, int nFeat); + +/// @brief Set a feat as epic weapon focus for a base item. +/// @param nBaseItem The base item id. +/// @param nFeat The feat to set. +void NWNX_Weapon_SetEpicWeaponFocusFeat(int nBaseItem, int nFeat); + +/// @brief Set a feat as epic weapon specialization for a base item. +/// @param nBaseItem The base item id. +/// @param nFeat The feat to set. +void NWNX_Weapon_SetEpicWeaponSpecializationFeat(int nBaseItem, int nFeat); + +/// @brief Set a feat as epic weapon overwhelming critical for a base item. +/// @param nBaseItem The base item id. +/// @param nFeat The feat to set. +void NWNX_Weapon_SetEpicWeaponOverwhelmingCriticalFeat(int nBaseItem, int nFeat); + +/// @brief Set a feat as epic weapon devastating critical for a base item. +/// @param nBaseItem The base item id. +/// @param nFeat The feat to set. +void NWNX_Weapon_SetEpicWeaponDevastatingCriticalFeat(int nBaseItem, int nFeat); + +/// @brief Set a feat as weapon of choice for a base item. +/// @param nBaseItem The base item id. +/// @param nFeat The feat to set. +void NWNX_Weapon_SetWeaponOfChoiceFeat(int nBaseItem, int nFeat); + +/// @brief Set a feat as greater weapon specialization for a base item. +/// @param nBaseItem The base item id. +/// @param nFeat The feat to set. +void NWNX_Weapon_SetGreaterWeaponSpecializationFeat(int nBaseItem, int nFeat); + +/// @brief Set a feat as greater weapon focus for a base item. +/// @param nBaseItem The base item id. +/// @param nFeat The feat to set. +void NWNX_Weapon_SetGreaterWeaponFocusFeat(int nBaseItem, int nFeat); + +/// @brief Set base item as monk weapon. +/// @note Requires activation of CombatModes plugin for Flurry of Blows. +/// @param nBaseItem The base item id. +void NWNX_Weapon_SetWeaponIsMonkWeapon(int nBaseItem); + +/// @brief Set plugin options. +/// @param nOption The option to change from @ref wpn_opts "Weapon Options". +/// @param nVal The new value of the option. +void NWNX_Weapon_SetOption(int nOption, int nVal); + +/// @brief Set Devastating Critical Event Script. +/// @param sScript The script to call when a Devastating Critical occurs. +void NWNX_Weapon_SetDevastatingCriticalEventScript(string sScript); + +/// @brief Get Devastating Critical Event Data. +/// @note This is only for use with the Devastating Critical Event Script. +/// @return An NWNX_Weapon_DevastatingCriticalEvent_Data struct. +struct NWNX_Weapon_DevastatingCriticalEvent_Data NWNX_Weapon_GetDevastatingCriticalEventData(); + +/// @brief Bypass Devastating Critical. +/// @note This is only for use with the Devastating Critical Event Script. +void NWNX_Weapon_BypassDevastatingCritical(); + +/// @brief Sets weapon to gain .5 strength bonus. +/// @param oWeapon Should be a melee weapon. +/// @param nEnable TRUE for bonus. FALSE to turn off bonus. +/// @param bPersist whether the two hand state should persist to the gff file. +void NWNX_Weapon_SetOneHalfStrength(object oWeapon, int nEnable, int bPersist = FALSE); + +/// @brief Gets if the weapon is set to gain addition .5 strength bonus +/// @param oWeapon the weapon +/// @return FALSE/0 if weapon is not receiving the bonus. TRUE/1 if it does. +int NWNX_Weapon_GetOneHalfStrength(object oWeapon); + +/// @} + +void NWNX_Weapon_SetWeaponFocusFeat(int nBaseItem, int nFeat) +{ + string sFunc = "SetWeaponFocusFeat"; + + NWNX_PushArgumentInt(NWNX_Weapon, sFunc, nFeat); + NWNX_PushArgumentInt(NWNX_Weapon, sFunc, nBaseItem); + + NWNX_CallFunction(NWNX_Weapon, sFunc); +} + +void NWNX_Weapon_SetEpicWeaponFocusFeat(int nBaseItem, int nFeat) +{ + string sFunc = "SetEpicWeaponFocusFeat"; + + NWNX_PushArgumentInt(NWNX_Weapon, sFunc, nFeat); + NWNX_PushArgumentInt(NWNX_Weapon, sFunc, nBaseItem); + + NWNX_CallFunction(NWNX_Weapon, sFunc); +} + +void NWNX_Weapon_SetGreaterWeaponFocusFeat(int nBaseItem, int nFeat) +{ + string sFunc = "SetGreaterWeaponFocusFeat"; + + NWNX_PushArgumentInt(NWNX_Weapon, sFunc, nFeat); + NWNX_PushArgumentInt(NWNX_Weapon, sFunc, nBaseItem); + + NWNX_CallFunction(NWNX_Weapon, sFunc); +} + +void NWNX_Weapon_SetWeaponFinesseSize(int nBaseItem, int nSize) +{ + string sFunc = "SetWeaponFinesseSize"; + + NWNX_PushArgumentInt(NWNX_Weapon, sFunc, nSize); + NWNX_PushArgumentInt(NWNX_Weapon, sFunc, nBaseItem); + + NWNX_CallFunction(NWNX_Weapon, sFunc); +} + +int NWNX_Weapon_GetWeaponFinesseSize(int nBaseItem) +{ + string sFunc = "GetWeaponFinesseSize"; + + NWNX_PushArgumentInt(NWNX_Weapon, sFunc, nBaseItem); + + NWNX_CallFunction(NWNX_Weapon, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Weapon, sFunc); +} + +void NWNX_Weapon_SetWeaponUnarmed(int nBaseItem) +{ + string sFunc = "SetWeaponUnarmed"; + + NWNX_PushArgumentInt(NWNX_Weapon, sFunc, nBaseItem); + + NWNX_CallFunction(NWNX_Weapon, sFunc); +} + +void NWNX_Weapon_SetWeaponIsMonkWeapon(int nBaseItem) +{ + string sFunc = "SetWeaponIsMonkWeapon"; + + NWNX_PushArgumentInt(NWNX_Weapon, sFunc, nBaseItem); + + NWNX_CallFunction(NWNX_Weapon, sFunc); +} + +void NWNX_Weapon_SetWeaponImprovedCriticalFeat(int nBaseItem, int nFeat) +{ + string sFunc = "SetWeaponImprovedCriticalFeat"; + + NWNX_PushArgumentInt(NWNX_Weapon, sFunc, nFeat); + NWNX_PushArgumentInt(NWNX_Weapon, sFunc, nBaseItem); + + NWNX_CallFunction(NWNX_Weapon, sFunc); +} + +void NWNX_Weapon_SetWeaponSpecializationFeat(int nBaseItem, int nFeat) +{ + string sFunc = "SetWeaponSpecializationFeat"; + + NWNX_PushArgumentInt(NWNX_Weapon, sFunc, nFeat); + NWNX_PushArgumentInt(NWNX_Weapon, sFunc, nBaseItem); + + NWNX_CallFunction(NWNX_Weapon, sFunc); +} + +void NWNX_Weapon_SetGreaterWeaponSpecializationFeat(int nBaseItem, int nFeat) +{ + string sFunc = "SetGreaterWeaponSpecializationFeat"; + + NWNX_PushArgumentInt(NWNX_Weapon, sFunc, nFeat); + NWNX_PushArgumentInt(NWNX_Weapon, sFunc, nBaseItem); + + NWNX_CallFunction(NWNX_Weapon, sFunc); +} + +void NWNX_Weapon_SetEpicWeaponSpecializationFeat(int nBaseItem, int nFeat) +{ + string sFunc = "SetEpicWeaponSpecializationFeat"; + + NWNX_PushArgumentInt(NWNX_Weapon, sFunc, nFeat); + NWNX_PushArgumentInt(NWNX_Weapon, sFunc, nBaseItem); + + NWNX_CallFunction(NWNX_Weapon, sFunc); +} + +void NWNX_Weapon_SetEpicWeaponOverwhelmingCriticalFeat(int nBaseItem, int nFeat) +{ + string sFunc = "SetEpicWeaponOverwhelmingCriticalFeat"; + + NWNX_PushArgumentInt(NWNX_Weapon, sFunc, nFeat); + NWNX_PushArgumentInt(NWNX_Weapon, sFunc, nBaseItem); + + NWNX_CallFunction(NWNX_Weapon, sFunc); +} + +void NWNX_Weapon_SetEpicWeaponDevastatingCriticalFeat(int nBaseItem, int nFeat) +{ + string sFunc = "SetEpicWeaponDevastatingCriticalFeat"; + + NWNX_PushArgumentInt(NWNX_Weapon, sFunc, nFeat); + NWNX_PushArgumentInt(NWNX_Weapon, sFunc, nBaseItem); + + NWNX_CallFunction(NWNX_Weapon, sFunc); +} + +void NWNX_Weapon_SetWeaponOfChoiceFeat(int nBaseItem, int nFeat) +{ + string sFunc = "SetWeaponOfChoiceFeat"; + + NWNX_PushArgumentInt(NWNX_Weapon, sFunc, nFeat); + NWNX_PushArgumentInt(NWNX_Weapon, sFunc, nBaseItem); + + NWNX_CallFunction(NWNX_Weapon, sFunc); +} + +void NWNX_Weapon_SetOption(int nOption, int nVal) +{ + string sFunc = "SetOption"; + + NWNX_PushArgumentInt(NWNX_Weapon, sFunc, nVal); + NWNX_PushArgumentInt(NWNX_Weapon, sFunc, nOption); + + NWNX_CallFunction(NWNX_Weapon, sFunc); +} + +void NWNX_Weapon_SetDevastatingCriticalEventScript(string sScript) +{ + string sFunc = "SetDevastatingCriticalEventScript"; + + NWNX_PushArgumentString(NWNX_Weapon, sFunc, sScript); + + NWNX_CallFunction(NWNX_Weapon, sFunc); +} + +void NWNX_Weapon_BypassDevastatingCritical() +{ + string sFunc = "SetEventData"; + + NWNX_PushArgumentInt(NWNX_Weapon, sFunc, 1); + NWNX_PushArgumentInt(NWNX_Weapon, sFunc, NWNX_WEAPON_SETDATA_DC_BYPASS); + + NWNX_CallFunction(NWNX_Weapon, sFunc); +} + +struct NWNX_Weapon_DevastatingCriticalEvent_Data NWNX_Weapon_GetDevastatingCriticalEventData() +{ + string sFunc = "GetEventData"; + struct NWNX_Weapon_DevastatingCriticalEvent_Data data; + + NWNX_PushArgumentInt(NWNX_Weapon, sFunc, NWNX_WEAPON_GETDATA_DC); + NWNX_CallFunction(NWNX_Weapon, sFunc); + + data.oWeapon = NWNX_GetReturnValueObject(NWNX_Weapon, sFunc); + data.oTarget = NWNX_GetReturnValueObject(NWNX_Weapon, sFunc); + data.nDamage = NWNX_GetReturnValueInt(NWNX_Weapon, sFunc); + + return data; +} + +void NWNX_Weapon_SetOneHalfStrength(object oWeapon, int nEnable, int bPersist = FALSE) +{ + string sFunc = "SetOneHalfStrength"; + NWNX_PushArgumentInt(NWNX_Weapon, sFunc, bPersist); + NWNX_PushArgumentInt(NWNX_Weapon, sFunc, nEnable); + NWNX_PushArgumentObject(NWNX_Weapon, sFunc, oWeapon); + NWNX_CallFunction(NWNX_Weapon, sFunc); +} + +int NWNX_Weapon_GetOneHalfStrength(object oWeapon) +{ + string sFunc = "GetOneHalfStrength"; + NWNX_PushArgumentObject(NWNX_Weapon, sFunc, oWeapon); + NWNX_CallFunction(NWNX_Weapon, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Weapon, sFunc); +} diff --git a/gamma_age_v2/nwnx_webhook.nss b/gamma_age_v2/nwnx_webhook.nss new file mode 100644 index 00000000..755b6321 --- /dev/null +++ b/gamma_age_v2/nwnx_webhook.nss @@ -0,0 +1,43 @@ +/// @addtogroup webhook Webhook +/// @brief Send messages to external entities through web hooks. +/// @{ +/// @file nwnx_webhook.nss +#include "nwnx" + +const string NWNX_WebHook = "NWNX_WebHook"; ///< @private + +/// @brief Send a slack compatible webhook. +/// @param host The web server to send the hook. +/// @param path The path to the hook. +/// @param message The message to dispatch. +/// @param username The username to display as the originator of the hook. +/// @param mrkdwn Set to false if you do not wish your message's markdown be parsed. +void NWNX_WebHook_SendWebHookHTTPS(string host, string path, string message, string username = "", int mrkdwn = 1); + +/// @brief Resends a webhook message after a defined delay. +/// +/// Handy when a submission is rate limited, since the message that the event sends in NWNX_Events_GetEventData +/// is already constructed. So it just resends the WebHook with an optional delay. +/// @param host The web server to send the hook. +/// @param path The path to the hook. +/// @param sMessage The message to dispatch. +/// @param delay The delay in seconds to send the message again. +void NWNX_WebHook_ResendWebHookHTTPS(string host, string path, string sMessage, float delay = 0.0f); + +/// @} + +void NWNX_WebHook_SendWebHookHTTPS(string host, string path, string message, string username = "", int mrkdwn = 1) +{ + string sFunc = "SendWebHookHTTPS"; + NWNX_PushArgumentInt(NWNX_WebHook, sFunc, mrkdwn); + NWNX_PushArgumentString(NWNX_WebHook, sFunc, username); + NWNX_PushArgumentString(NWNX_WebHook, sFunc, message); + NWNX_PushArgumentString(NWNX_WebHook, sFunc, path); + NWNX_PushArgumentString(NWNX_WebHook, sFunc, host); + NWNX_CallFunction(NWNX_WebHook, sFunc); +} + +void NWNX_WebHook_ResendWebHookHTTPS(string host, string path, string sMessage, float delay = 0.0f) +{ + DelayCommand(delay, NWNX_WebHook_SendWebHookHTTPS(host, path, sMessage)); +} diff --git a/gamma_age_v2/nwnx_webhook_rch.nss b/gamma_age_v2/nwnx_webhook_rch.nss new file mode 100644 index 00000000..3555ef71 --- /dev/null +++ b/gamma_age_v2/nwnx_webhook_rch.nss @@ -0,0 +1,159 @@ +/// @ingroup webhook +/// @file nwnx_webhook_rch.nss +/// @brief Create richer webhook messages suitable for Discord +#include "nwnx_webhook" + +/// @ingroup webhook +/// @brief For more information on these fields see https://birdie0.github.io/discord-webhooks-guide/ +/// @note URL fields may require NWNX_Util_EncodeStringForURL(). +struct NWNX_WebHook_Message { + string sUsername; ///< https://birdie0.github.io/discord-webhooks-guide/structure/username.html + string sText; ///< https://birdie0.github.io/discord-webhooks-guide/structure/content.html + string sAvatarURL; ///< https://birdie0.github.io/discord-webhooks-guide/structure/avatar_url.html + string sColor; ///< https://birdie0.github.io/discord-webhooks-guide/structure/embed/color.html + string sAuthorName; ///< https://birdie0.github.io/discord-webhooks-guide/structure/embed/author.html + string sAuthorURL; ///< https://birdie0.github.io/discord-webhooks-guide/structure/embed/author.html + string sAuthorIconURL; ///< https://birdie0.github.io/discord-webhooks-guide/structure/embed/author.html + string sTitle; ///< https://birdie0.github.io/discord-webhooks-guide/structure/embed/title.html + string sURL; ///< https://birdie0.github.io/discord-webhooks-guide/structure/embed/url.html + string sDescription; ///< https://birdie0.github.io/discord-webhooks-guide/structure/embed/description.html + string sThumbnailURL; ///< https://birdie0.github.io/discord-webhooks-guide/structure/embed/thumbnail.html + string sImageURL; ///< https://birdie0.github.io/discord-webhooks-guide/structure/embed/image.html + string sFooterText; ///< https://birdie0.github.io/discord-webhooks-guide/structure/embed/footer.html + string sFooterURL; ///< https://birdie0.github.io/discord-webhooks-guide/structure/embed/footer.html + int iTimestamp; ///< https://birdie0.github.io/discord-webhooks-guide/structure/embed/timestamp.html + string sField1Name; ///< https://birdie0.github.io/discord-webhooks-guide/structure/embed/fields.html + string sField1Value; ///< https://birdie0.github.io/discord-webhooks-guide/structure/embed/fields.html + int iField1Inline; ///< https://birdie0.github.io/discord-webhooks-guide/structure/embed/fields.html + string sField2Name; ///< https://birdie0.github.io/discord-webhooks-guide/structure/embed/fields.html + string sField2Value; ///< https://birdie0.github.io/discord-webhooks-guide/structure/embed/fields.html + int iField2Inline; ///< https://birdie0.github.io/discord-webhooks-guide/structure/embed/fields.html + string sField3Name; ///< https://birdie0.github.io/discord-webhooks-guide/structure/embed/fields.html + string sField3Value; ///< https://birdie0.github.io/discord-webhooks-guide/structure/embed/fields.html + int iField3Inline; ///< https://birdie0.github.io/discord-webhooks-guide/structure/embed/fields.html + string sField4Name; ///< https://birdie0.github.io/discord-webhooks-guide/structure/embed/fields.html + string sField4Value; ///< https://birdie0.github.io/discord-webhooks-guide/structure/embed/fields.html + int iField4Inline; ///< https://birdie0.github.io/discord-webhooks-guide/structure/embed/fields.html + string sField5Name; ///< https://birdie0.github.io/discord-webhooks-guide/structure/embed/fields.html + string sField5Value; ///< https://birdie0.github.io/discord-webhooks-guide/structure/embed/fields.html + int iField5Inline; ///< https://birdie0.github.io/discord-webhooks-guide/structure/embed/fields.html + string sField6Name; ///< https://birdie0.github.io/discord-webhooks-guide/structure/embed/fields.html + string sField6Value; ///< https://birdie0.github.io/discord-webhooks-guide/structure/embed/fields.html + int iField6Inline; ///< https://birdie0.github.io/discord-webhooks-guide/structure/embed/fields.html + string sField7Name; ///< https://birdie0.github.io/discord-webhooks-guide/structure/embed/fields.html + string sField7Value; ///< https://birdie0.github.io/discord-webhooks-guide/structure/embed/fields.html + int iField7Inline; ///< https://birdie0.github.io/discord-webhooks-guide/structure/embed/fields.html + string sField8Name; ///< https://birdie0.github.io/discord-webhooks-guide/structure/embed/fields.html + string sField8Value; ///< https://birdie0.github.io/discord-webhooks-guide/structure/embed/fields.html + int iField8Inline; ///< https://birdie0.github.io/discord-webhooks-guide/structure/embed/fields.html + string sField9Name; ///< https://birdie0.github.io/discord-webhooks-guide/structure/embed/fields.html + string sField9Value; ///< https://birdie0.github.io/discord-webhooks-guide/structure/embed/fields.html + int iField9Inline; ///< https://birdie0.github.io/discord-webhooks-guide/structure/embed/fields.html + string sField10Name; ///< https://birdie0.github.io/discord-webhooks-guide/structure/embed/fields.html + string sField10Value; ///< https://birdie0.github.io/discord-webhooks-guide/structure/embed/fields.html + int iField10Inline; ///< https://birdie0.github.io/discord-webhooks-guide/structure/embed/fields.html +}; + +/// @private We don't need this to be a part of the docs. +/// @brief Helper function to convert 0 or 1 to false or true. +/// @param iBool The integer representation of the boolean. +/// @return The string representation (true or false) of the boolean. +string IntToBoolString(int iBool); + +/// @ingroup webhook +/// @brief Builds and sends a rich webhook message based on the constructed NWNX_WebHook_Message. +/// @param host The web server to send the hook. +/// @param path The path to the hook. +/// @param stMessage A constructed NWNX_Webhook_Message. +/// @param mrkdwn Set to false if you do not wish your message's markdown be parsed. +/// @warning Your path must end with /slack if using a Discord webhook. +string NWNX_WebHook_BuildMessageForWebHook(string host, string path, struct NWNX_WebHook_Message stMessage, int mrkdwn = 1); + +string IntToBoolString(int iBool) +{ + return iBool == 0 ? "false" : "true"; +} + +string NWNX_WebHook_BuildMessageForWebHook(string host, string path, struct NWNX_WebHook_Message stMessage, int mrkdwn = 1) +{ + if (host == "discordapp.com" && GetStringRight(path, 6) != "/slack") + { + PrintString("Discord WebHook specified but path does not end with /slack"); + return ""; + } + + // Open JSON + string message = "{"; + + string sMainText = ""; + + // The only way to turn off markdown for discord is to surround the text in backticks + if (stMessage.sText != "") + { + if (host == "discordapp.com" && !mrkdwn) + sMainText = "```text\\n" + stMessage.sText + "```"; + else + sMainText = stMessage.sText; + } + message = message + "\"text\": \"" + sMainText + "\""; + + // Slack will turn off markdown + if (host != "discordapp.com" && !mrkdwn) + message = message + ",\"mrkdwn\": false"; + + // Set the user attributes for the poster + if (stMessage.sUsername != "") + message = message + ",\"username\": \"" + stMessage.sUsername + "\""; + if (stMessage.sAvatarURL != "") + message = message + ",\"icon_url\": \"" + stMessage.sAvatarURL + "\""; + + // We need to construct an attachment (embed) object + if (stMessage.sAuthorName != "" || stMessage.sAuthorURL != "" || stMessage.sAuthorIconURL != "" || + stMessage.sTitle != "" || stMessage.sURL != "" || stMessage.sDescription != "" || + stMessage.sFooterText != "" || stMessage.sFooterURL != "" || stMessage.iTimestamp > 0 || + stMessage.sColor != "" || stMessage.sThumbnailURL != "" || stMessage.sImageURL != "" || stMessage.sField1Name != "") + { + message = message + ",\"attachments\": [{\"author_name\": \"" + stMessage.sAuthorName + "\",\"author_link\": \"" + stMessage.sAuthorURL + + "\",\"author_icon\": \"" + stMessage.sAuthorIconURL + "\",\"title\": \"" + stMessage.sTitle + "\",\"title_link\": \"" + stMessage.sURL + + "\",\"text\": \"" + stMessage.sDescription + "\",\"footer\": \"" + stMessage.sFooterText + "\",\"footer_icon\": \"" + stMessage.sFooterURL + + "\",\"color\": \"" + stMessage.sColor + "\",\"thumb_url\": \"" + stMessage.sThumbnailURL + + "\",\"image_url\": \"" + stMessage.sImageURL + "\""; + + // Dont post an empty timestamp + if (stMessage.iTimestamp > 0) + message = message + ",\"ts\": \"" + IntToString(stMessage.iTimestamp) + "\""; + + // Fields to handle + if (stMessage.sField1Name != "") + { + message = message + ",\"fields\": ["; + message = message + "{\"title\": \"" + stMessage.sField1Name + "\",\"value\": \"" + stMessage.sField1Value + "\",\"short\": " + IntToBoolString(stMessage.iField1Inline) + "}"; + if (stMessage.sField2Name != "") + message = message + ",{\"title\": \"" + stMessage.sField2Name + "\",\"value\": \"" + stMessage.sField2Value + "\",\"short\": " + IntToBoolString(stMessage.iField2Inline) + "}"; + if (stMessage.sField3Name != "") + message = message + ",{\"title\": \"" + stMessage.sField3Name + "\",\"value\": \"" + stMessage.sField3Value + "\",\"short\": " + IntToBoolString(stMessage.iField3Inline) + "}"; + if (stMessage.sField4Name != "") + message = message + ",{\"title\": \"" + stMessage.sField4Name + "\",\"value\": \"" + stMessage.sField4Value + "\",\"short\": " + IntToBoolString(stMessage.iField4Inline) + "}"; + if (stMessage.sField5Name != "") + message = message + ",{\"title\": \"" + stMessage.sField5Name + "\",\"value\": \"" + stMessage.sField5Value + "\",\"short\": " + IntToBoolString(stMessage.iField5Inline) + "}"; + if (stMessage.sField6Name != "") + message = message + ",{\"title\": \"" + stMessage.sField6Name + "\",\"value\": \"" + stMessage.sField6Value + "\",\"short\": " + IntToBoolString(stMessage.iField6Inline) + "}"; + if (stMessage.sField7Name != "") + message = message + ",{\"title\": \"" + stMessage.sField7Name + "\",\"value\": \"" + stMessage.sField7Value + "\",\"short\": " + IntToBoolString(stMessage.iField7Inline) + "}"; + if (stMessage.sField8Name != "") + message = message + ",{\"title\": \"" + stMessage.sField8Name + "\",\"value\": \"" + stMessage.sField8Value + "\",\"short\": " + IntToBoolString(stMessage.iField8Inline) + "}"; + if (stMessage.sField9Name != "") + message = message + ",{\"title\": \"" + stMessage.sField9Name + "\",\"value\": \"" + stMessage.sField9Value + "\",\"short\": " + IntToBoolString(stMessage.iField9Inline) + "}"; + if (stMessage.sField10Name != "") + message = message + ",{\"title\": \"" + stMessage.sField10Name + "\",\"value\": \"" + stMessage.sField10Value + "\",\"short\": " + IntToBoolString(stMessage.iField10Inline) + "}"; + // Close fields array + message = message + "]"; + } + // Close attachments array + message = message + "}]"; + } + // Close JSON + message = message + "}"; + + return message; +} diff --git a/gamma_age_v2/nyan.utc b/gamma_age_v2/nyan.utc new file mode 100644 index 0000000000000000000000000000000000000000..3505ff44653e37afe1e93e1529847121f6bebd59 GIT binary patch literal 4787 zcmeH~>6Q~k6vqo$+}H%%6^9)KVHi+cP$!ej5*R{E2F5*BlA4)jI^ChWG7IjCisJTx zNAMN=?kAss7w`#u1NHy!u1YSR!#N)LDEFLy-(M|VU45&%a&vyBICSCok&zdaQfHwX zYnA#5{`!4NO~LQjqEvB>QnOpZ@QV+i9{w*FnpKe(7(J>pD+wMKJRx{eFrVY^Eek#^ z_>ACb!JM4S7{|-`(KL7=Yv41C2m9CbF?# zh39iwJ`K_QJorrBlh0GBO>Bg*?`G(XV;nV#-!12Y<0dmQj-1Rm&NgT$D=D?zdAc2f z9~AtM;D-f2BKT1-zkfdKG3crr_;E0wM|%SD^L`TS=g0W*-Dpoij45phVvHEeT@YhO z+nu|t-yZNWi1+LjybnC>>i5Ib*ylh-IUjUP_cX+{pgjYT`RqfGQooLJ4u><&FVDhp zZKxv<-<^CEYC9f=PaSiPR~&Qf>yD4Z|Lph#{4b85ga6I(^YAwupM?M2F@JCVaQq_t zpN?OG-?T<4?uC~j8u=8o*VVrQKJ1wLZrJf_;1iBV!Kc8q0>t=pzl}jVU40SkjqKO) zztrE(y>bq>;#-X``~RChx6@zVdxrTxe>*NvSB z@)4_HZ1bM^wVaka9lVncT{*HQNqSxDrZ64H9X>-vy48ur zoT|FDsOJsh)6%OmK|lU=D}sv=N`@KPz!0xN0aT7|ny#7+_)9ae;({I&K(jhrtYJU+ z%8ItVM27_*^r^sB;~=trlwvPQOl14jXZ1>-IYwgUnsL| zo)}**=j)R9$Jb`F;rw|0{gAhxPfb!Xb3tVC^0{a%jI#;V7ZJc|JRWnQP2f&Z?0?U` z4sX^fG=mVkKC3E*I!%2e?jOI@3%ZT6HJ!Y&szYO~>3>hfxYNP(^6Y5z88 zJG2AhiZGpL8qf5dX*<((rs+)2nU*shXBs{P?ShzY?}7G0`=I^M0q7vaw3+GhA?Pr~ zwD<^g6k__z)nmGQ96A9ptz|mPG?wWr(^jUdOjDVjGA(5~$~1HoDnMhXFJAD=SV8{>5v;yyY9O+$YJp{45s literal 0 HcmV?d00001 diff --git a/gamma_age_v2/obb.utc b/gamma_age_v2/obb.utc new file mode 100644 index 0000000000000000000000000000000000000000..08ca3a849ce0e709cd4582aa600d7e2184d5824b GIT binary patch literal 6881 zcmeI0Nst^z6^7Hh0eJx%Y_q0pS>DEDE#ANaH0qwwv^|;`&9o#hl1JHH+1=%-u54Fj zt2KZ@fB^vp%x=JDU(8}wvtuw|)*yW5Km-?#5W$h)0{@>?)$o)^3zcv0|P!ApXd1vdrn6TDyW z0l~KmzC-Yxg6|T1Q1BtacMDz-d|0p%+!EXt90|69JA%7{dxB%Z_Xu7UoCxjifr`Fk`&Ha)m@X(T;rBwp&lmgx!Pv6L>Ebadg)Llh&*HOQ z2pumC(>GN=UJPbmnO*`_V|yvM9Ikp9xN4)p^dq$qs{D81Cs;R-in#`nayV6`6 zShd@xk>y80nHGCCb)GdvT6CGuOzay`k+0jloy7wmyEGIuO}A`WTxu>oVzb;-4I25P zeEp~y(`HqpUfxxYbCdN=D=8niJZxohNOc=~eqU7SK%92-m3hl=5vHbz6OmQRZkR^P z*3ZO+#l^(&(`K9+d86OQm`qX>HBxW0Y&h^`7v`L+Ff^EVi#F@mt?|8(-{qpUU1H43 z-eewqS~Trd)3vH@+h(m9kNv;wg>zw{Zu#Z3p5U+b3<&)>A%7s|SK4~2^~`z(bigF5 zONfW6aNhV~W|FDO>9et4baCn{E45*k+0>7V_n4z&rj5*YS}q+{&DAJQ5?RoJ?__?r zbJ6sXxb!CC)r>mB1if@VZo?iZNo?A+=p@{vYD-hmJ;QuFNO-qxLpUuNv{K6g^MP!-rMnds=0n2^BbPUA9!_joB{Cp zG9NrC3POG+G2Jo(LcWGg#Ab8$h)qI&MEjzDtSJgZ{{}XK$3nqruGP8##IvjFeat;? zq1EDNk1S^Ut57G)E!e zeuCC|tL|I$TqiE=>Xz}7dLEILtmzn=0K9CqOSOmnZpLt!(6JAX$#p)8J08!AbYxA0 zI}Gjh%xD#lvFt{;&&1iJZg@0zZjkH9jZ)poTt8Iit803gBkEx`$CIp1OxCr!l^|HP zU9;Ldm``Htm@tmw+-uj-nTg`Cfd^X6p)8g^cVYh~9X8CrHLdVlJ-{V{()-CpQ z)Q<<%H|eCt+Tc3kx(Vt0quW*@+gX8Airw?vvS3hbvQ>S~-Ls8gJFl!S9B88|?+`!S zK&u;&FE-Gs00D++!-6`ewBXVzj|As+DXV21}fJjmez4*#(6z=j7kJfPvh3=d>9v=O=# zx(wO`T@G!Au7IwDcz|*>bPY5C@qlC!x(?z&2oFGb@Ub1b9^wH94>ow9!GjDQVDR9A z2Npc2-~j~>CU_vR6Pki{K@ULhg5C|i2YL{CFZ4d>{m=)X4?-V;J`6nseFXX_^fBmR z=n?4S&?lfzLZ5;@4SfdsEc7|(^UxQdN1-o5UxL02eFb_9`YQA_=`@GlSgE}+~ z%|N@M%0K+TU}9|ZqvAGb4%!3FLkrL%v=>@}mZ2uJ584kMfNqEGfbN9uf(}CT{UM0H LzZ+VC4nzM0n_q3E literal 0 HcmV?d00001 diff --git a/gamma_age_v2/obbhide.uti b/gamma_age_v2/obbhide.uti new file mode 100644 index 0000000000000000000000000000000000000000..9be372a5c8545ab45aa63f27a023e3366ebaa125 GIT binary patch literal 1091 zcmah}%Tn7w5Zv$zB;-LbkU$cANUCy55jens3)odb6%t&w!zq`QHMUh*St@CLFeg5O zf8l5Nm(VTkI_AVwwdS$2GqX~!es_cV<-yneBc;?l@CT>^cTbdh2W=4i0euU74Sl$v z)GG8p2$Xum2jmQRT3Sj)&VKHEszm@LRRD1R9I)(c_Wk5+lvjJeGk|-J0m@RP6xZ43 z%MB}3HK^&W0PI2GehTwv=U{K2^MVOZUP3ee%7J0ld=1o`y$0>;^4y${IqQHwJ9Eny z1HA!w*@O`RzUF6Vv!oGSPXpZp2y%n$XF7ZfV3rDNhyxX-@rDo1H1=50PO4g-vg#Oe=Pt2 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/on_pubsub.ncs b/gamma_age_v2/on_pubsub.ncs new file mode 100644 index 0000000000000000000000000000000000000000..96cfa95951f8cb2db512c5d9a1efd7dfeff75bff GIT binary patch literal 504 zcmeZs4ps;=)H85mU|{?q#{dKz3Jh8dU>27)g8~B+D-$c27r?^GAQn)XR9u>*;98cN zS7N1*oROH9mzrbC%=rKR|1S(IBFaEDoC>+A#l?x~skS1@V2K|f304Ls14d~Ept>Ir zGl433-BU||1_qZVxg?e(0tLAI!u=xRgHls6i@{b-VPYjl*=I(O{XlEL=Kmp1(>|~! zpraw0pf2SAi@sps0E>Q*1qBEX!r4IAusA#V_<&V^U|@mKVAl$>GBD`D{Rnb6$UCmC zijGd6Wk!mKumDOiDnbJX7HV(-ps6CtU{}0>xee?JHn1zcfC3MwpEFkNN^{F(2ziq4oQIE?(XjH?(XjH?(PonuOx@; zo0~J!$!VDP)_Uiz4|aFDYoDsxRn^I`Zc5cGXRez!XP$y4lj*nLOs2B2O{Q!yO{Sv# zOs0H1*JYr|G>qqC4mOzfVTz4Cq(=~#Aek_@M|iH z*hj<@M7%@94@B%3DWsi(B5o$)0U}-@;tL`+MGk2vi-?^?93bKuB0eDE7a~r^*l2w$ zDPngKj}Y+&5#JE8L)4IVa*4RUhP8Jb6i#R~UGemqq#4kjgEJjG1B}MEm;t?X=AmSS$c3={< zdCVo^`XcTj;sqi;A>t1rHpdESv!aN7L_9&nJ4F0I#Ez^{nhjiQ1x4IU!~;aULc|wD zY>E@oP8Jb6i#R~UGemqq#4kjgEN)1fB}MEm;t?X=AmSS$c8C|!PA(DG7jX{}FA(tw z5q}V|*)gQeiX!$A@dOd?5b*;MJH`)br=WwwlO+skv!saKMLa^p8$^6V#14r<+Q}v2`XcTj;sqi;A>t1rHYW~gv!aN7L_9&n zJ4F0I#EwZq+9@dFW+EOS;uRvkAYxO}kan_&*jdB@BAy}Q10sGQ;$+D}+AJwzcM*>e z@dgp!5V1q@kalv3xW0&chyI9}!Ow@eUC`5V2#*kah}+xS5Ct zhaUM7%-7H$?1^CZwHQBCapu z9wJ^K;u9kNAYyackTxrd*hj<@M7%@94@B%}4r!;Lh?|LcfQVO!_=1Q{=|bAcB4TF| z2Z(rvh!2SPg@}`-4{5Wch}}gzLc|+Hd_%+z8A960CF1%b?jhm@B0eGF4(L5#z_Da;Qr^&+#63shA`B$Hmbac&X<(9)DaMYdsb6qRIhgtf$4s?p0I?dgtWe{j+RTOy!Lgb{ zZH}@NYgY~e^?G&X4EihZ&p$+*OT@W}NfmhI5pmw&Sj*d;$1482yxMq$&Z~`;%B#h; z=2bbhylNg)9J;?e6?mztjUvYs>uVOZWylIuwAYw9wZSFPvp%&*LAuW{C^ zD_PHhoel1Nj5Rq~2 z#hbNtq}oyO-<|vR$}7(WTk`&l^{ZD`>VDLv_A7h!SMJZY)RoNpEBDF3j`N4AXCrxS z**COYYMkZ#8p$iyk>32ub5Q0rvTuZUezm@8)SAx-wGF^7EA~<1F_Ld)1X*f8{u9@voj=*sQXNk#!{Zt6w?4wv2PoX#V%luZ+yE`k9(m&#L{f>gs2YvtC`vyg#F^!rNaX<7~_M zE7y^_H+32PydmpZ-G5l~8<>bc)cLDjDzA1$Wc|wi>gCnzuaR+f;->$po@HKp)s_7D zl^VCO##z?0Hnv8`S@u_Nzmom6*FGudS8x5wymFk4?9aWzIluNAXSqM?jkA_Zts^6G9 zUD;C4vaW*ez`p&}I~Vlw8re7Gex>^IPvb1tk=FN!oP*)5E4fb^nP2&Rs4e}~`e^h# zlKs`&ue4nDtYwn+3*ZTdp_Gekowya+{zp4(^6_I_?mT?Yh{pX#7di|B>k(^)cej?Ie zInJsbRb!!lo+Im7%VqTQhRX9#^{nMm`?Kt?k#!_L*Qxfy>aX578_D~BWgTf_ZghT~ zg2(pn_A4!ynqRqojf}ILU%hkTXUwncuipCATSwYBL}dN;6636wS8HF5vvwK%d?oX$ zHp5y+S}uF$mGf&$URhV#{X}G(<@(hdXTAAVb*L_tSBq`^cNB7*!<#oSX>eXGwl%Np zuUd~`&97WXTKh)#4LQGRtisBxvtEDY{MxI(w$zmzXYC$TJ*)9iS47sYnoq^nb5P|`m(l&%mi`813i=#tuW^=j zrMF+nym5mc7~MDI_o24r)$YM)Ub%k5yN-<1l^kc)m$3E?t&jHHCuLq+##z>tk^ahh z);o`6e`Q^1&l^4WZOJS9Yh<64{r$Je-fkL$9vvl{dWW*U0?ZGR|82q4#Ga`=mMt6!m#SU16OIa(?B074#0{KR46cueA0< z_t(h$_6qK!t^L*R!RWa!>shbAdiAW`!>>4xv|RsYe~rwq+$Z(UBU#V(>aYAczb*4C zKW`Z6uiQ8E`m6O(ts{G_UpdaI{jl~8y}b77uPx)O-Gi!U?TW}clH+VkUOCQ2`s>6^ zYy0!BoL`w&-Tyz$uQs+u_YFDDs?D(S%JnPPk(w8EMdbT#`Td~Y{06oD^S=MJC9if5 zM(bJ5uWB=_an^E$-ZzZYvpfg&>RE4ojpXeW+{eE=_ho;z*l0b=an|dv-nnnD{_5q` z`e@JjmE&y7z9HAIc0Uo>pXE5KcEYM>Sy%SjpH&{^SJ#y-`=lBNb*cH)E>+KJpHWvt z_Q~+(mGf()o^9DTf_fFyUwh@1b){F&KV$vMan?H*WIbzrH@aWhGR{9EuPx*JGxFLp z&f3`8a~;Y4>dmiSUL)&Be$LT57yh@6vo;P9ITvI-|8E;-tzW9H?6qGRsb}qeA~Me5 zt!H`u8p$ia5B-(h& z`c>_OHO^Z5_FPADe#5&@8X0GqS8tqUf3^5mf3CAvUOB(v9cLrwU@tnLYU%Gjx65@T z`)eexoL{~5`!m*&+$Z(MS?goyb)-EXk#oUFUL)&B=Cx%V$$ipZ^Q*>9)mZ3rK^sps z&f2BcuXaUboNYPx_3FwnKkH2Dm^~Tv=^{h9}S|3C2llH1B)qZ&P4I}+kc@%XHhPS^)^2)j*b(sB?^BY&a zh|6eQ+46ZKDARxc97%gVBJ0iQMqEc4oH zzmn&XE#oZfDyZiX`#!~qH~-T(Ywd?V_wBWg^v++syhiFu{v1iQuloLX^(@EPNPp!x zhqu2*^2+^6udZZ0Yh$j~k&$thdH=2b*_OO={Tk`7+@JNvSsPomj$~bF&qri`mgB72 z`Bn8S`>R*avaaMf8>#1B!F~KU&wai5mFK=Tr$)~sc`p3QdY0p?*I%uVq0a>)>qyqK zE&Y}2$VgquaaR2bYaPjYwpU)2M^W`0-gU%V0^@u51}+t&jHHuWaeBz0L(EI-s2ksxK-I{e6o3ykW1r zw#@I($SdbpZ=B^iQe&d7|Ev3z{Jf!8&vKlDdTadW8@AMymdl>|hCGkL+h6T|BC=n} zysDkB){)k}J^L$v&S1+qXs`7v*O6X-m(hBb zdG+R3%cb(#YkuW8tM-Xs{2uwJ;&LWb3xX#T)#%n1-VbEKK)aF zWnO#j8+!FD`>XCvU8!U{MxIojEu9r>PoM_vaaMf8_6rjS=CQi>sN1_wR($4Jh)J^|5xXgb*0_IuNY^USJtz34-pw>Sy!r^uEcZ*va^&TFp7h1f7pQ&oKdYAHQ z?m?Snte#e1^|-7@%a-l@EI%HXx3((fWo_q8^Ss~c&EvqY1+{1OuI299!rCDyYpr(w z(VU6LvN`owHW&Q(M|0}2Y|d24ubM|Ica=Hls-hlwc(LozyQ0O_*S|Sc71&C3?>c@K-?EmL9^RG~ zJX71l)8c0dd4qZ!TpEF|4}7c@WAN);s{5+>clD=?0>3V9D)4bth9__catF5W^5b!y zpvSd*-GaaTpO5)P)q(FX`!Cf?Yx>>e9hLDW=6rcqq&1?M<1&Pi!5iHm@1h+OGaf{#LWa)y+L9O?I=NKXXmlnQ67Xt0ynW%{{6A)pl16vAL)QeSEF$Jz7{= zn45PDyvd;AGgEoicD`;Fa~Z3*pOuE%d6`)#ZE`yP7&)sqw_)*(C!Ywcx2XOt+;XWO zx&{90QT2&JosR0{S377lM2DIV^_%C_Z=6>%7aQt?RJ&+AI3hk0AR!V#{bu+iND4K* z>Nmfu-}tV6)4Tc&@9H3CO72Tjt&K~HAUg(WJ=!<^nj{z8nK^Tl7 z7>Z#Sju9A%Q5cOe7>jWjj|rHFNtlc&n2Kqbjv1JVS(uGEn2ULsj|EtWMOcg_Sc+v> zjulvmRalKRSc`R7j}6#}P1uYr*otk~jvd&EUD%C1*o%GGj{`V}LpY2hIErI9juSYE zQ#g$?IE!;Qj|;enOSp_HxQc7IjvKg%TeyuoxQlzZj|X^&M|g}Uc#3Cuju&`|S9py# zc#C&4_=<1%4z>7yLnK5-6huWdM27=nASPlVHsT;I;=vK|kpKyi2#Jvd zNs$c6kpd}^3aOC>X<q(=s1gcC9$GqNBn)b{^7vLgp_;t%9PZsb8;C&v2`_lV3LmtEFZ|$-c4&_d2tY@4LT7YAS9C*n z^gvJaLT~gzU-UzN48TAP!e9)+Pz=LxjKD~Y!f1@aSd7DXOu$4;!emUrR7}Hk%)m^{ z!fedJT+G9KEWko6!eT7JQY^!AtiVdF!fLF+TCBr*Y`{ir!e(s2R&2v|?7&X!!fx!r zUhKnu9Kb;w!eJc2Q5?f@oWMz(!fBkrS)9XpT);(K!ev~+Rb0b$+`vuT!fo8aUEITc zJitRd!eczaQ#`|SyueGm!fU+2TfD=2e85M1!e@NJSA4^Fs2`2}hDeBvD2R$^hzs zjvUB|KadN#kq3E^4}T&*3ZNhgp)iV|D2kytN}wc4p)|^%EXtugDxe}Np)&qL6;wqv zREINapeAaeHtL`*>Y+XwpdlKeF`A$$T+j@zXbv~DfCVkl3hwYgYqWtUyxx01L4Qi?IYtu?)+x0xPi!tFZ=au@398 z0UNOio3RC3u?^d?13R$`yRip*u@C!k00(ghhj9c)aSX?C0w-|_r*Q^naSrEk0T*!z zmvIGGaShjT12=ICw{Zt|aS!+L01xp9kMRUg@eI%L0x$6juki+N@ec3t0Uz-RpYa7> z@eSXhKJ@>FNQjImh>B>44hO_QOvFNL#6eudgCpW20TLn+5+ezcA{mk+1yUjvQX>u0 z!i;oCj||8NCuBlqWIYy&_p*|X*AsV4EnxH9M&?!849l?sE3pczu?B0g4(qW28?gzSu?1VP4coB;JFyG9u?Ksx5BqTd2XP38aRf(k z499T-Cvgg=aRz5`4(D+J7jX%faRpa#4cBo4H*pKMaR+yC5BKo^5Ag_(@dQut4A1cb zFYyYm@dj`44)5^+AMpvF@daP;4c}pk!um%fL`D=uMKnZ*17aX1Vj(u-ATHv;5%G}# z36ThikpxMR49SrKDUk}Pkp^jDMmnTN24sX2G9fdvAS<%rcVtHn?&yJ@=!M?sgTCm8{uqFP7=*zXf}t3O;TVCD7=_UogRvNg@tA;#n1sogf~lB> z>6n3;n1$JxgSnW8`B;F3ScJt`f~8o7$riNxP{xe zgS)tg`*?tdc!bAzf~RC&v2`_lV z3LmtEFZ|$-c4&_d2tY@4LT7YAS9C*n^gvJaLT~gzU-UzN48TAP!e9)+Pz=LxjKD~Y z!f1@aSd7DXOu$4;!emUrR7}Hk%)m^{!fedJT+G9KEWko6!eT7JQY^!AtiVdF!fLF+ zTCBr*Y`{ir!e(s2R&2v|?7&X!!fx!rUhKnu9Kb;w!eJc2Q5?f@oWMz(!fBkrS)9Xp zT);(K!ev~+Rb0b$+`vuT!fo8aUEITcJitRd!eczaQ#`|SyueGm!fU+2TfD=2e85M1 z!e@NJSA4^Fn4+=%5ebnI1yK2K;jW~#lcyL5~BtSwWLSiIAQY1riq(Dlf zLTaQzT9}az>5%~$;e<@cj4a5CZ1^47kpnsL2XY}d@*pqr;ZNj80Te_b6h;vgMKKgd z36w-BltvkpMLCp51yn>ORK{PZf~u&7>TpI4)I=@RMjg~eJ=8}7G(;mbMiVrJ3!1?d z&EbX?u%IPc!5toGjW+Ov7rbGG58A>Pe(*;-v_}U7pd&h=GrFKFx}iIIpeK5vH~OG2 z`k_AtU?2uzFos|#hG95HU?fIiG{#^o#$h}rU?L`AGNxcEreQi}U?yf^Hs)Y1=3zb- zU?CP^F_vH{mSH(oU?o;zHP&D))?qz1U?VnRGqzwWwqZMVU?+BAH}+sJ_F+E`;2;j+ zFpl6Tj^Q{?;3Q7rG|u2G&fz>R;36*JGOpk%uHiav;3jV2Htygq?%_Tj;2|F2F`nQl zp5ZxO;3Zz+HQwMY-r+qy;3GcaGrr&}zTrDe(OLh9gvf}3sECH>a6k;iL@dNc9K=OD zI3hk0AR!VVF_IuDk|8-#ASF^EHPRq0%t(jy$bgJ+LMCKJ7Gy;>{EqC%ft>gQxsV%q zkQe#zC-S2J3Zf7SqX>$k7>c6=N}?1>qYTQT9Ll2tDxwl9<1bV}Ra8TDIHLw?q84hS z4(g&F>Z1V~q7fRS37WzM&ESgWa6=1N&=RfS4iB_O8+gJC-mt<4ZQ%<)_@f=#qXPoa z5uMN(UCcO{6TQ$Ieb5*E&>sUZ5Q8unLogJ>FdQQ=5~DC0V=xxuFdh>y5tA?( zQ!o|NFdZ{66SFWIb1)b4FdqxB5R0%FORyBnupBF}605KpYp@pUupS$*5u30XTd)<| zupK+F6T7e*d$1S#upb9-5QlIWM{pF!a2zLa5~pw)XK)tha2^+M5tncoS8x^Aa2+>r z6Sr_1cW@W?a32rw5RdQ}Pw*7a@EkAj60h(YZ}1lH@E#xV5uflGU+@**@Ez(u@c)KL zh>R$RifD)q2gE>3#6oPuL0rUxBjO_g5+V^2BMFis8ImIfQX&;nBMs8RjC4qk49Ey4 zWI|?SK~`kL@5qiE$caCY3%QX8d65r)B0mbCAPS){il8Wpp*TvQBub$)%AhRDp*$*} zA}XOW{z4U0MKx51GisnFYN0mjpf2j6J{q7Q8lf?opebC?46bMnH?)8SEzt_@@IY&{ zfhWA+4J&-m7QXO#+eFu?d^81zWKV+pz;Xu?xGg2Yay(`*8pVaR`TT1V?cU$8iEDaSEq# z24`^&=WziSaS4}k1y^wm*Kq?kaSOL`2X}D~_wfJ^@d%Ic1W)k{&+!5;@d~f;25<2W z@9_a2@d=;t1z+(E-=Y3-&u@r?$cTcdh=%BJKn%o0EW}0}#6>(fB0drzArc`mk{~IP zAvsbYB~l?Z(jYC&NQd;ufQ)cLCS*nyWJNaoj_k;RocIH|kQ;fB7y0lf@}mF>q7VwB z2#TT@ilYQdq7+J_49cP$%A*1*q7o|OFH}KQR6}(*qXufC7HXpo>Y^U%qX8PC5gMZj zn!*Lm;ELvOLkn2Y60P74541)bc)|vC9|JHDgD@CFFciZu93wCiqc9p{Fc#x59uqJTlQ0=mFcs4<9WyW!voITT zFc%BdxhYC zvS14SPZy@(A7Pk+KgyVbyY&D6R*?a#f~u&7>TpI4)I=@RMjg~eJ=8}7G(;mbMiVrJ z3!1?d&EbX?u%IPc!5toGjW+Ov7rbGG58A>Pe(*;-v_}U7pd&h=GrFKFx}iIIpeK5v zH~OG2`k_AtU?2uzFos|#hG95HU?fIiG{#^o#$h}rU?L`AGNxcEreQi}U?yf^Hs)Y1 z=3zb-U?CP^F_vH{mSH(oU?o;zHP&D))?qz1U?VnRGqzwWwqZMVU?+BAH}+sJ_F+E` z;2;j+Fpl6Tj^Q{?;3Q7rG|u2G&fz>R;36*JGOpk%uHiav;3jV2Htygq?%_Tj;2|F2 mF`nQlp5ZxO;3Zz+HQwMY-r+qy;3GcaGrr&}zTrF6;{P9|-7`<|$jc&dWnFG5pIBW+WHASBh4XhWh2LUTKFlbL2Rcg);r5`vT< z2!bF8ilVd#`sjPl!gRBI7_NkqvO=*$5mP$J>GGC z*U4UdqB>5UP+VGT6@~Mx!^^Gh`s~tn5?l^1hfju2fh%Bb=HfcFsf#`hUICvDuY}Kl zE8#QYv*5GgD)=1uT=+cLz~{pn=Ed#50Jh^Ej@yOsMer)P7G4cs46lLf;I(i)d$haZ3^;63nz z@I&w<{4o3o{3tvHKL$SzKLJm}Pr^^ZPs20tGw`$UbMP$uJp2OuB0LAb1iuWw0?)&* z!mq)v!+YU3;5Xs7;C=Ah@H_Ck@P7C`_{y<3{Td_sin&LcvV*P5-rP%wwG5FZSUKPqW`RArCO#=Q1%qsUMI9&XK1_5 z&~}}n?K(qqomDvBz%_6!Tn9J6jc^m(47b2-a68-qcf#FpFWd+B!*MtPr{D}6z@zXu zJONL_Q}8rA1JA;9@I1U1-Usi855f!ZA^0%-1^gxa75p{)4g4+q9sE7~1N5lZh_n2cDMuXguCHh zxDW1!<8T5_!5KJ!N8xdJ0-l7Y;AwaUo`vV&d3Z0p58e+SgcsmL@L~81_)GXJ_-ptZ z_*?ip_ue71sk{qu7&I12DlM! zf}7zMxD9THJK#>Z8}5bs;C?s`C*TyEfdhCH9)~C3Nq7pLhG%5^zF(#maQ-a(`_j^5 zx=U~J;p6+S6H9I>FZsa9C9gcS}}gdr{%krAy;Dvn%kk9)9l5CI<(-?BY4C z{_wDuwzqWb)Z>n2{A4-^f1xww#yodtYH@?YUyPQ~2>hRnz@YYa48E=RA`Pawe9~X0<1oZgI2DC$|TcTY1$hxe%jN@*4LZD z{$wv7c85HZvwON-agUoC(yrHOcfDNgYI{#cw0d3NUb@qdj~RcU;B9Hsm2pSXCKt;l zGeKd)xoNtY4dKnWx}({om$TOm2P0?Pl%F0ftSjs11FtYTBgtH%aMt2I)F_Q;qqMrl zdeh~lyqJbecd57;x>KpKW8>k)xpEDRUSbk~iKUXUA&p+b_ccOx6N>}crNQ?zLDEla zO5r&{!?rkBX*RV{i0ExkC}KQp2?(C7^``dcmfTP^xnU_UQK z9}A*SpoP!3(I?QL@VPen1R5Re_`~su=wL^5TrE1TW)Brchj5EWilalg(IMRE+k)uZ zg6NB>a0H^`YS9-{(RZN#!|y=txBi+L<>*^?XNl4*8plqZwNqy86v@A<|8@$eBmbxC z+G)0Sx{jR+W2fSrq%`}+S*|qmrZAnSLQBoOvH#1+(X5-obY0E3aaO7`lxEyGXDZFM zan4p%O0#X8bCqV=I7XeXs?`OmMqQ{bQma(0TCFZtYgC(vI;s5Yug z)n%$lU9PTBSE^=pmAYD8qgvFp>N?e`+SDd>z1pnW)fRPwx>0qgo77gdO?9f9)h((^ zb*o#|cGaVL)oto_b%*LxcdEP84%M$*wNu4ZTzP6h4XT7ns$FVGrPQ!WD_>>Q-72ec z%1#{0tKDiujjAzqkGfZltNYab>H#&O_NWKdLuyhztR7L1swwrDdR#rBrqz?`DfP6P zQO~Gn)pKfAJ+EF+FRD59l6qOaqUP1B>NWMc+N<7BZ>qP{KJ~U*uHI4as{QIc^}afw T4yq5-hw3A>pgvZgD0})h8*1Qesk~ zqLFcm3Y8Q)sHj-DMMcBJq9P@uqCzD@;}|I_<#*q3KlA+aOy6$i{jTrKJJ(uQ6Ten7 zYo2+S_1|j^!|=fmRfRwK?gI}l357x*+aVO1`Bo^j&k>=};6-ag5m`65d2ML7s!-^s zzg!#YUJQj!`*B7n`kqkeby?*94y}_*om>j#vYlLXsg%oFxvY^(ja>GUi!O6=(e-+f zO~tHNbnCO=T(fQ`U;fK&X8_k3hR5JZc*ZPWLi6%pZad9y^7q>ccfj3npINsvD0bV4 z$l&EaE0+qm8m@yI&AOcy@m}&(m&^>mog6p}7s4fG-AJD0fy>}ZxCX9=o8Tzi4tK%5@BlmvkHM4h3_K4n!5NwUF=m@}9`eL)9{O;dL3jin zho|6KcmZC9GbJEv7t1h4bMexD+mjtKeF=0d9s{;SRVP?lbE=42s=6MC9L1H*XbiHCzWb!Yyzc+zI!< z{qPVx3Qxe(@Ep7dhu-4Hp9SZ_`EZe0=b=>W=3xxinS^KHd3XuVc&i^nHk=0+z{PL` zu7IoII=B&Tf!p9txCicshs-(;qhdD?mD&EW)WG#{6C8!x;V!rr9)O48F?bT5f#=~R zIAcdY=4?0*E`W>Sh*{^MLhR;Y3fGy17vN<$b07m$h1=mS zxECIPhv6}^&cmeG%|q?m{NrkXo8eZt1MY_V;6Zo<9*3vkS$F|nhBI^gICJ1ITnLxI zWpJfg=b=XI=3x%kS%gDx_xGCx=fe4L5nKwF!&PuC+yFPjt#Ak24fnx=@CZB(PnmTd zX2otE8sFg`ZwuT8cfvhzKRg7F!V~Z`JO?krp`HDBvfx}eA1;DR;c~bNt~KjCG>F|i zEa5sCxqb}Ua2{L$7sC;_0pU!q-8@8h@sGV7 z?t**a0eBc5gD2q`cphGYGj{c3$cFRa0=O8Cz!h*cTn9Irbsk#8ZXPms^JB`ghjy`hKIE?V-kJZPk^N=HU^U!1K_4&{b55c4G1UwDT!HaMx?B_WP z&V}>gBDfSThpXUPxB+g4Tj36~&O^7@%|pRE{Wy!^2wVYI!*y^Y+yb}3op2A_4-dhk z@B};!&%ujuXixvRvfy0v8kvWDv73hhTxS>_gD2q`cphGYGi2lX{L)J{oCg=c#c%|! zfUDs;xDjrF+u%;P$E@?vFP8tTEG7AV%w=#TTm#p`O>h)$hr8fjcmN)T$KXkL2A+qP z;EcWfW66f|-~zMGL$TP+!w9Z34o|_e@B+LHXTHmiAqNh_g>VU623Nv0a6Q}vN8xt3 z3+{yn%sLOlVmA-v`}px!!L@J$+zhwE9dI|?2M@v{@HjjL&%z7vGMri9$Dad-;X=5? ztn*MNcJnZS>rBIQ@FE=A*WYgzoD1i}MQ|xx4p+goa0A>7x56E8H{1sg!Xsv#hjFo+ zhwAubf}?Od z+y(c-1Mo0B22a8>@I1T(XB_CqmJR2@1#mGOfh*u@v(7`E*v-QNuCokhZt!Esfx~bi zTmqNDm2eGQ4>!S4xE=0-d*K0i7#@Qs;Tf~e!@StdLvxXTysdBt+zt1^gYXDE4o|_e z@B+LHXCCColLLq0LbwDjgDc@0xZbSu&?I*A5IWf3Zx);j=fg#CDO?U$!L@J$+zhwE z9dI|?2M@v{@HjjL&%z64orh(yn}@b{`+4Yud*FU}2p)we;AwacUW7x%{(iIITsR*t zf=l6YxC*X?8{lTM&O@u%%|rGfemr?_0bC46;0m}Ju7exl7Pt-WgnQtAcnBVaC*Wy# z4qk*qhps+eorf&3n};r2zgE`w!UOOyJO)p~Gw?jT1ZN!P=R6zEgA3qdI09F|)o>l$ z2)Dp(W}Sylv73i*i62`bTmqNDm2eGQ4>!S4xE=0-d*K0i7#@Qs;Td=yUV<|Y_m45# ztn-j3cJt7O>kPsp@HjjL&%z7vGMxDyKZYDQ3>U&Ba2Z?)*TD5~6Rhv&(&xBd+Tkv< z&O@)*%|p?9{q;-Xa<~evg&W{zxE1bzyWu`~5FUZY;VF0)UVxY3%u@fja^SF8=b=#S z=3xle8HFd{X?PA^ghNO8`^|!L;e5CVE``hCD!3MIfSch~xC8En`^-8IgJL%ikt6;1 zE8uFl4sL{7;5N7u?t%N^A$Sy?fT!U(co7b5^yANhbK!ir$gJ~FDt7ZQhU-kiGw?jT z1ZPD27_#9!xBxDOBX9*=4cEbqa0}c9cfvhzKRjgCc^DPDd8jPyLp(xb!OoOcp1)opC3aG9EJxCxHJ?Qj>|3lG4<@R(WWVN$%8eAT74%s;LMxEXGRJK%1(4<3X^;Bj~g zo`o0SWjOQwew;aQ7%qfM;4-+ny^d5BU4df^*?~xCkzV%i$`x7H)u> z;a0cE0Q02jj%xB{+*>)=MX1#W{o;U2gj9)d^V z33wWwGwVDoirqX!KkOfSJKP2L!UOOyJO)p~Gw?jT1ZRB2k0Be*gA3qdI09F|)o>l$ zXx4dX5xaTFtng#Vfx~biTmqNDm2eGQ4>!S4xE=0-d*K0i7#@Qs;Td=yUNY-EWPH@m zLx*^+tkX+3+y@WBBk(vp1<%3@@G_kFF@L`~a2PIxOW-oN60U*k;U+k0)_G_byXQmh zF@8Mxa1mSzm%~+XE!+S%!>w=!+zt1^gYXDE4o|_e@B+LHXI8F0UY&;=v73h;Td&WD zes~BTg(u)?cn)5KLm&6^oCW8?`EU_j3YWuGa4p;bH^Z%Phgs*LTkPhc;8;J-VmJa< zz}0Xa+z7Y8ZEz>t1NXy2@F+Y1Ps4NYA{_dJe_UB`u36_HU+m^#0M{9Y$KXkL2A+qP z;EXCihHN+wE`W>S2wVYI!*y^Y+yb}3op6s?=b>Nh=Aq<2{Fuw&O1K8DhnwIi+zxla zz3>1$43EK+@C-Z;FToj~^p7PQ&VvigIuFHSHxDDY&Nw^;&%z7vGMxD-KZYDQ3>U&B za2Z?)*TD5~6C8!x;V!rr9x&@X42#`7lvn%lSHZP#1KbR^!X0oo+y@WBBk(vp1<%3@ z@G_kFX+QoPI1CrUC1#z6GO?S730!9yo`VpYB$-8@u(#y_q)xDjrF+u%;P2kwW5;8A!2o`&b(MOc4Hc&&_GFIjLd zoDUblrEs}f=b=jM=3xfcnTMC)jN|<1C)@+~!$a^WJONL`bMPV@`uytS)p^JgyLsrc^=oB)FFXJb!(;FyJOj_e zOK?WLpYv=u4=#X<;Rsv-SHpF1BisVFnROmI#cm$LU+`lqgiGKuxDu{`>)|Fi3b(^u za4$Rn55r^dBs>Gp!%J|+ss1r$n{^)Y#BLt?aGgPT1RjT{;8}P9UWPMI^JB<1C)@+~!$W4Bhf%Sc zhsv}3W2u4b;U+i=x5Hg7G57u*XEz{BvES?6I=?B=2N9RIi);AXfL z?tr`DK6nrwfydz~cotrOm*LEF{Wx>rFkA?iz-4fyS?8ff?B-z(*I9%^=lT21f^*?~ zxCkzV%i$`x7H)u>;a0cS2wVYI!*y_@S?8fe?B*f!B0q*4I1CrUC2$#B3D>~&a1$Jb+u<&_7ao9z;W2m; zo`L7#C9}>$#>IXfI>c*bonE@(K6nrwfydz~cotrOm*LDy{Qc&@VYm=3fy>}ZxCX9= zo8YKf=b>Hfo)5WEKc0NJ2rh-o;VQTmZh)KNR=5N1hWp?_cmy7Yr{Gz50bYhPH?KZk zorfH;n};4-ug`~mcnBVaC*Wy#4qk*qm->0mf^*?~xCkzV%i$`x7H)u>;a0fAyha{x zx7f`?!DW7&#c%|!fUDs;xDjrF+u%;P2kwW5;8A!2o`&b(ML5*zA6FKfYu0(l7w;us zbs4~QhT$=I5}twQ;UzfZi+&8*a2{L$7sC;_0!S4xE=0-d*K1I&cm?S%|rPWe*9H%E!+S%!>w=! z+zt1^gYXDE4o|_e@B+LHXMWj_KL-xOg>Z>k=b=pO=3xTYnTF@!ML2Y&zuzo47tV)^ z;8M68u7Ydf2Dlk+g*)JGxDOtLN6b18<6<`t)$RUq)xnK$3)}{G!aZ<5JOq!z6Yw-V z2QR{*ulR9h!MSigTm+ZGc@}`=fMSVF&u#_;A*%IZiHLl zHnpV=0-8|G^(y@Dw}?FTl%i=Cyu2IdB**giGKuxDu{`>&-e3 zO=33>p-z9lS#U0#4;R6ua5-EB*TM~OGu#Syz};{kJP41#;9+t&!9@?(+ z^Uw+R!2R$LJPJ?1)9@U;2#2os_nQUh!ufC!Tnd-NRd6lb05_X;9$Lk29pXOd-8_VE@M9~4OW-oN60U*k z;U+i=x5HgpbL%-8}T+I)m^CJPuF6v+x4E3}<%x zG33BuxDYOZ%iv152Cj#j;3(VO&7&4P2`e7FcMh0Eb8 zxE5}Jo8eZt1MY_V%sLN)VmA+w9zXsHxEij58{rnX4eo?{;C^@r9)&01X?PA^ghSu< zh)$hr8fjcmN)T$KXkL2A+qP;EY~B=4?0*E`W>S zh*{^MLcEuJ)ny9TnS~eNWjOOjKZYDQ3>U&Ba2Z?)*TD5~6C8!x;V!rr9)O48F|*FY zq}a_v?M?o1HNeeqE8GEh!+r1|JOYoyQ}8Uj058LtH~Vqsz+t!$E`iJ7O0&*Gjo8h@ z9Imqnhx+{eX2H2|K3oKs!sT!kTnjhA&2TH+0e8cF@E|+_kHb@DorhVmn}^2l`N!J= zx51ro58MwA!K3g5JPpsmi*V=`Kb|Z&7tV)^;8M68u7YdLIu8wEHxEm=PR6Z%4B2oV zTmTot5x4@bhU?%)xCL&5JK-L7G8jt;mkW$AFs|sj@ZpZkFD3|Lq9wOkHQo1G&~0{!l66;JZHhVa6ViFm%`<6 z6ZqPEQTX+1zZi+!HsYW+y-~TJ#arf1dqZK@H9LJFT$a_ z{Nu`kbIm#r`C>N@1GvsGJO)p~Gw?jT1ZUjs$B+%@!3A(J9Dys~YPb$=gj?V?xD)O% z>pb*}-8_`sOa;4oYWmzZ@P%EWFSCUBi;cn)5K zL&N@lv*27fA1;DR;c~bNu7w-mX1EpZfV<&7cn}^j>pYB$-8@v^=O0%c+z7Y8ZEz>t z1NXy2@F+Y1Ps4NYA{^S{$C(A^!ufC!Tnd+)bsnn3ZXRZEoq2c(&bZ%?Asfzv3*cfn z0$0G*a2?zTx4><1C)@+~!$a^WJYm*(m=?Qvs2}l|3lG4<@EAM^&%pEW z5}fgXA6qt@2N%G_a0IS^tIcad^8N?0n}-ElXBp0X(2pSp4#S0T30wwO!ZmO`+yqDA zcDM`fg$LkacnqF|XUsYe^I|s-%@6s<+X{EU-Ebc~2#>(y@Dw}?FTl%i=BOV}4jhIH z;S#tEu7qpgdb7?$lXx%ry0Sd%?>7t1h4bMexD+mjtKeF=0d9s{;SRVP?t=&65qKP) zf@k3cv(Ce^*v&)RBYqw_;U2gj9)d^V33wWwgBRh@kNo{+!MSigTm+ZGc zW}Sytv73kNF+ZL>xBxDOBX9*=4cEbqa0}c9cfvhzKRg7F!V~Z`JO?krp+{FAug*i3 z*v&(itzRqad*K0i7#@Qs;Td=yUV<}z?B_fi&Vvi!VmJaVU623Nv0a6Q}vN8xt33+{yn;9+xCxHJ?QoY_=b=~Z=Aq~(ew?LnIa~$T z!VPdU+zNNV-Ebc~2#>(y@Dw}?FTl%i=1=|O%7MdXorglPn};D>XB3`*r{Otx5e`lG z`^|!L;e5CVE``hCD!3MIfSch~xC8En`^-8IgJL%ik)QeTSHRV99oz`Fz-@3R+ynQ+ zL+~g(0Z+qo@FE=gxgUQPoD1i}MP{9cQn8zdFO2Mz{rTgFE3KxE~%e>pYB#-8@uI`o~fO*TYS46mEyR;9htD9)`!@Nq7dHhnL`t zU-~g;!+CH4TntCdIu8|MHxE;|&MdqDFT}ZxCX9=o8Tzi4tK%5 z@BlmvkC}BICdFtsy(F=WGeZ~i{S`d0awFyaHCo0p+)TGA@g^B3^{NZE`&?q zGPn}1f$QNWI10DJU2rcv01v}s@FY9~&%;Y*orjDWKMx(^wX#kx-Ebc~2#>(y@Dw}? zFTl%i=I{Oe=D=aN5H5ks;7Yg#u7{i8sCi9D-v1!pOTOxo`v*Use7FcMh0Eb8xE5}J zo8eZt1MY_V;6Zo<9*3vkS$F|nhBN=T`gnC7a>Q;PdTjk#S>F#2!K3g5JPpsmi*RVx z&vO=>3+KZ{a4B34SHZP#1KbR^!X0Lvhi>s+@>Q3Dr~NpK;Rsv-SHpF1BisVF!JTjq z+z$`IqwoYg4bQ=gaOfHTxU%3}v(7`l*v-QLt}_ge!ISU|JP$9y8PEDLWW#xI0bC46 z;0m}Ju7exl7Pt-WgnP_75B*{{4<&Pc%w=#TTm#p`O>h)$hr8fjcmN)T$KXkL2A+qP z;EX@{$C3@_!3AcWhhnjthY?(79G-$_;RSdZ&V0^~AqNh_g>VU623Nv0a6Q}vN8xt3 z3+{yn%sLOlVmA-vfA-_Af@|RhxY?}RX%)NeWY7EU*6kFF-F8NBopE>yo`o08x}9aQ+fLhm`!RIF zJ#arfWZp)$Gb(g1x!`qeKXo!33! zuvzC&@7pc!6uA4^)2)=R`h0Zj^Ra$!SicYMI{VmqeT)Tish5j-U%7n2yq|nM)x5ua zJ0E7)%Xcon`zUphTuvJK z=+Wwf;;ysfL;gC4^nTfI=PG}lP~Gms+>XwJKCiwa7o87%Ufn1c_q-Yq z>ypg#>KAf5-M&7ro|KC&sq(y%muq6rD|z{1#rw(E--Bjhr?)HC=hcE) zpI4H{*z;-<&nwAb{O6TC(RKdydG(Htk0{@ie0Z3@Vq)%*2n8rw%o=&uhzYG#maL@pI3K{|7xWV+N*^Gd$sg$ zJg@%g`S5@6yn6rlf9#*1|KfS|;>9~{)bG3Y>P(v}?NyuDJ+H16>ypg#>MpshdtTjZ z+eww@)qOG^_q^I-*5}pzW_@0bnDu$}fLWhcKR4_1>K9`7yvmXTC4IcQ-AP#=?|CJw zW6!J4y=Q*qxunmlZEAiSdtN2_?_iGHuRd4*|M++CpPrxp;(4XlanGwi*j(xJYEkT- zSFh_t$db(S>YcX#>c4|~i*-qr=heP49{0T3&#cd@{muHkDm3f!>HxDouZ}S5^Xf>k zdtMdbd9_j2$9rD!_-fDlBC+SycYd{3(*F(?{eSel`pMwiH@fHNzdF9!?~MIp*9rX_ z&#RBxTWXUVGn)-*}zczDVr8 zMqb{y;x}HW=PW;-foo2Td!5R@Ft!u_I?>9_vGI%?_m8;a35CD(L-)95{>61h&VOK| zyH4%c33100dHVI(b$b5Am?u6Jin#6cToeDXM>}6%IcCuB#mI46;*a^X<=Azir@j*R zd(rcEKc1PFH?NHCjq|*4i676*<_F_mCwk_V*y9SfJ{0#lq4LXD&c9a9`(`r#>0C@7 zul}1j^DY0qkpCId_5Wi$+wK|rp4RrP&iNa!ll?P1e>VN|nBBj3zqNf$yYv^a>(Z-Y zU2<2ytn6$5?&}G=*?y{B+C!{Ms&r{D8IS8yzFE7pw^_UNF0*!NAG3DpFtc{4MC`iM zBi8xU?H(?U*CifDy_|DftV<;?`{SsA1dq@Aw-Zl3jd)oa^HmFJayFWmF$duDxJ-D1|~)vacIUiF*x zc{Oa-=hb~;_q@{e?s>IE9QS#JfA2PI_mSxiC*uQs)9-oiOeYxjV@bBH~zxBbt zcmMO>p#K~Hy&IS3w(HWI*mdczVqKEy(q6J->VB$S+DCU%SyH7-`^$J-mkQ0=r31{` zr31~{r4457(nhm(DI#`V$`!jV9VM3ktjweS8>c@P*g-Bk%Ky-YY>-RYPUErH&%gB8 zTVq}7Nbujgu-sA5C7ICRIDF;&E1izRkCErL>r#W*b?H3axnxPEOMP-%*QI{jPO5Zi zK*r;`bh}x*bcb2Hbf;OnG-%c?jheMf4~t!wn#8V4kBH?z|D#LUI9}Sl<-AyzhA;Q8 z4C)XY9@nLN z%-W?Pvv%oTvv%nRX6@3C&Dy2M#I8$)V%Mc{aojG+8w=cd+|D~*7JGeZ^iBP-E>$LY z9;aOmx+LF>pi61jrKjY%t^28V>A%IUOUq(ilIhak@@7@nrG52{tFoj@mkyBexGo)N z)-G)@YnO`5+NFcc+NGn++NGn#u1jq)SFTI%llAesv<6+uA8(EwFWps~9qUq}=W!i! zzd@Jen-O#=?Yi`F+t;*9^cZ6{T_)GOn0UAob%UAoDvUAoz< zUFtJymxj#RrF+G$OS96lIhahd1pkAbM$?@V-K&M)9L%e6FrYBm-`Klmt^9CE~Q&)7v>&@Dwo6Op!o5ik6 z?)Xr*+b8SebtxO?ao;QTuX`VS`ozjPopveF<0U=z3%Vo|7j!A@x^%bgYucs9#jZZ_>C$#G9@nMq&Dy1PX6;gzS-Z4@S-Z5mS-Z4e?7FmsnSD8-lUpm0{HSJQF*mda` zeZtFUAok)UAoMyU1~LJmpaYbrR&75OI6YbeZ0Ee z>t%i1F5!6TR~7#KOZS%E7m=GJ^|=H!L6?Hpm(uk2n|f_u(=LsOU6&ryokf;py7Zdd z)^+K1+fJ%xXJ|IzcdtdDdbsQS z`9ox^#qCmt?whhTK+fuD`c?mTf0hx^%9L$93sE^L{eUX0vwb ze6x1x0<(7M%VzD;m15VWQFN(Y*2n7-e?RWR{dQP+ty|wG@KTjOUYd9;vEM@(54sd| zDNVa{gY9eDrF+D#OAm^5Nv2DGmD}pgwM#GCc2cEFugQ2^mzK@@$vFRR)-L_StX+ED ztX+Dm+)!_;UCI`?E`{ZoO0Kr@|LrL2<8^5besA~8_5O2CPR{;W?06~B_X!lp{YsjG z^SI!B0%`X?fjw+r(=HtA&64BJksbm=S^j}B>Hxtwj@PuyhQ zUwn>PyL7HuyYwZqcIk4l>yo}U<+{`+>*IAP8|QJ|FBZp+m$upV@mQBS5`2BBHRw`s zyp*QLOV``Jrd_&C?7B20)+L!P{a$YCy7aVdCsn%iCmD|pNxSr%S-bRS^Zw#_vv%ou zvv%q4X6@2H#I8$I=+f)5K3k{ygr9;s;{y6G-&uaWnrHcIo(|u3GsV&O>Dm zgU>--eXTzD98~{VcG?a7Joz0YM6xTb{N8T9*mY@xLY8E@R4uo4U8=F|q)L}+Wjy+L zwM!?NwM(Bh?=L>tTqv$HYnPhL+NE>Eu1m%8VD<6pcF&dd@w&wKdyidpeC&AXzkc$N z?^1%tOQmwB!FiladT<_>cIR=ewy){&(l^BNpOwG&bdy4sWV-ZIxvlP}dLH)++fJ%< z=}8%n>(Z2YKN;t*%-W@=%!T4#o3%@SHfxvW#jZ;o@?iDx>UN)(_3^sIObe? z-sk=CQlhUfb;+FuU6M%;x|DWZdd>DV?b1#=_%7`()+L!PeL!xj`>A&6!?vAN>C(q! zJg!T}nD>)$R+_a-A2%0@k2N14{;XNMbh6lWXzLD!{U%lfT#iN{MvKXFm)b??dq zyHqLn8+1v&89|rQu1kNieNDThe;n9#X`NV?WV%!=w{=}AvF)Tvmr7+ku1iOlwM$2u zwM!e#+NFs30CA=HK=H@Lu1me>(y_8WUYGd#Qg~)d?09MYS00RLTax)afquE)pi44& zL6_35OSQJIX_w9uyDnWS)+L!P-72?rUHUKEPO5b2P8pBv&MU8b51O@0cbWGW-)+_| z-DB1+{m6WvcuefNq?4wPSGW79tlwIf)=WGT>(X|Y`S(>OdLEZ4_ZxIcCOzm<+I8tk z+t;*9FNj^2UJ>h(OqceQ9oBW}UAptik}6%=PsZcAw7*%qRA|;N9bncj9cb1r9ceyL zyiqLwS$UlLGe_5@h^&m)r8Rhcsr&uEh;^ywoR-*mT%xag>(2^0`F9 zX_r1Hc3o=Jolcfyy7YCqt?SZ%+ICW)-K&;)-K&G zmjA3g&LMQ^9$6W$OMGADCAa$HrH))s0qzP>aPbSZdWWtzUP@?qQ8v`f#5U6)?e zolcfyy0o8s){yJcfnr@!rAr6PcwCp>ZPqRoo3%@an6*oXnzc(GFl(1SDAp;`$CQ~)vxvY=ZCH{SRzP|L>XOsWD$~?K>;CM+UJvd%UyW^!#+P zZtJ>qqirWuy7WC6kL%JcX6@3gX6;hHS-W(bS-W(fS-Z4F?7Gy5F5NHd<8_JeU&?)_ zKab<<-if~7yE*7maJ-bJ$4igfzNTH86}v9|MXXCQUCNc;QFUF)6YG*HT?)&1T$kQy z)-LU7)-LU3)-L6nwM)fj?b0D)*QIfE=}=i8w@Y|^Y2yW}pPgGI+qoL&aUBVs$4v%Z z3c8f0T`IGEO}q3NvFp+)VqKEy(p7R>*QIN1JE_v8ugQ2^m%7Z_rLUW{OE;LcOW!bS zmu@v{m-@x7O9gN7=W(~m`gmR9`vj&Ry(RX#H-8>inP8WSM7wPx*7r&+snomsndqglIjlh}1>23@*Y*2n7- zkC$%y>!qk`l7E_m60{?aYkC9y6g`nvaW(50YDY1*Y-ZC}$a9VT{N zI$EqtGF>`bZtJ>qo^2;px^$t8$91X2tX;autX;a;tX;aqtX;awtX=95yDnAAYufsF zb-P!~`nX+^pCh=}y^sG-|9O=~&-nAWMBgV+ZLg&tD)$@wou=ULG^NwuY5JD!Yucq@ zvFp;0#JVKYr6swo>(a7qCsn$nAJXZ%w8pGmdXrhZwAQR$$}nq}a?IMLw~Jku^nIAF zOYe~N@w&vnJMii1+aubjBDw5-+hMWer9`_l7<4H(UP{yBrF`4hv`a^cU6(4vx+K%3 zi{!ShOPg&wsnVq{%6MFtzGT)eU2fJcwVAa`SD3X+UpH%)ZV(V!5eY`I5 z?==1GH~x6((Vv_c>r$exd%JB0$4g)Op?3Z-xy&5*kNednayj*sQ;t;Y{EVFcz{=-} z>vd|!P8f-IoygO#$F9?J&53cZGx4d=%D*YPot|qp#=TCo^YxYc)$5ELwaq zt`mH|xBq_Wek8k4=zF%WX_p=ryDm-W|0zo{UD6K=cU{WR4a<@$UCNa4xGrsH)-G*t z)-J6xYnQUj+NC_Rc4>F9>rx%Mv|iT7>k{9;bY0PFD=pIFrNLd2{~X;0J2yO3wiBGk z1zk#~^SDCW*W^p+L-Jp)OI5l;mSnp0MY*l((iOIyRO!-JWIV1*Uo~r&t}<(vI?URo ztIgV_Z=1DC-x0emji5{4mG$wu#PhgKpY~lk>#hFtmlFN`xUry1!FgPop2yv8`(Z~qx+K%347ri(Ql@Pn zRl1ZV<8fWu!K__+i&?w$RqDypFoM+Z*U$b6Bqm*O4|J%%FVW~X_p=nyDt4itc!g~ zs7wEl8@VpMNn<8Us&whiG9K5ZZOz)HOtW@rJF|9ad$V?FSF?6$H?iwdJGzu7>*IB4 zNBn-=)J6XFrRJ~t_b*K(_&F!~yD&kQ z^KCn+(xr=JJg!R@o3%@qn6*n$vvz5-S-W(#S-W(N*mY?RUAk7*$LkV*KW=mXwz2cL zTUz|@p(J{|v=DSDIFC!y^SE!@zNTFo61y%vB-SOFF3rnrU6&SYJE_v8MH!Fl(%;P5 zrI*awrI*dxr6sd=DN{~f^|soj?ZmE2W%mAd{r|R?_3^sI-;djKlRuBU6*mbD~UD_<`x7MYy27exROi63({oVr!p2zhCT?&qu()4)gD%;nz zOE-yKmu?s9l1!JLlH0m2{noaVDqZ@6jK_89k7n)CtXaGCv{}3Kj9I(%l3Ba-veuWolq*2n7-|9;%zxB2t9{BK+q>r$e}OZvNe!SRwzdT_jycE?L^mLI0+{-j;n zOYFLIp#6|7nJ%3uw{=}Q*|w7^UHZI?$91XRtX=woS-W(qS-W(aS-W(hS-aFCc3rBL zKDaJjB5&DnNRrAzZN9@nMk&Dy0G%-W^Dn6*m_X6=%`2|{nHU0Ne{T^dA}-X!a{ z)}myZ7N&tu0+zkR{KPax6H z6UdeO4bJ0a(u4E3v^$Tx&h|C!(j8*grTfIXB-5oA%^{04d_yqtlwIf{`k8su`V66gMZyS(cjx`3c3^=FQw`6 z(yq3zX_pQXyDpWAbxEd6pOf3VE`7nalPX<0UB=_ObcR{Gw8^YpYBXz?&NOS6Hk@*T?$5xBJ{@{Od~-k5#OECeOjLeO>fe=-n$?b+K9R_Yk>E z1YHWcl%`#}+V(Z=QlHp$=}xgO$#iL2ZtJ=ym!XfIeQ`?yIssUYGd$arZU*^SCFD@t+Hq=W!teYp*QLM$VC@*SRuf4AFoS%pFrfy`(x*E^T#It`chlarQmoeO^=r@v3*UubiLSh>DyvmlIhZq<+iR% zKe6rDm;d!H{agm(y7UXPc4^YAUHYY2yYz%vyY!4%yY#Hsb!i%1nv?Z$yM*7{-R6V7 zOQ-xT`QxS8pi4oQ(zHu2*}kS-+CdIvT$gg~peC6v9VNGQU3$N5NA6~2`QJWX`jCvr zb?L)q?b1ig+NBD!cIl&L?b7jP?a~Qi*QFAfBz?TP-4kW~*1B|G&FXt8^>g9M5AeSq zm+1Q{BXYmNd7MmQa2}U-=W(aozNTGj6}v87CDtXGE)B_TU6+P!JE_v85gCu`(gSAg z(t~F0(nDtL(x_RxG-=i@{Zj0@)QK)VA?xFHiN7B=oqucWJnn+;CEum)pi9B=Qkotw z&Dy@EUD6kOT$k2~bxEd6?+yDdZ4~R0DqVVC*mtSStX+D)S-bQBvv%o&X6@3a%-W@D zvFp+Ty7XyTAFoUNoRf3+{aUO`U%%VGzLe(0e(;v`bZTzrlH&OnPu0mv-lI&&htI`;&HQjr9 zomA=4pp3_L=`OQ&>29-j=^nFoX~?Wy8Z&E`9u>PTWyog;=;PJx{#e#;txK=<9~wK4 zEBR{jpC^zd_Zu89$)pFzOKEq!G-dmmcIhu-*QHm*x+K%3z2pr?u1oufbxD;j?JwhT zT`Dwdmkuy%mku;*mo}KSOB>DFrHI&dsTN&2O4i5g5?}ZJz$4ekx-{D8e{VO@-;b*g zx)dBQrRnj~F}AO1mrfD8E}bdXC7CYWAh&g0`lf9sRl4*Y8ISAIcg@*IBazlU<@Y0t*Gblio$ONst|+-T6Hpi61mrAKUE(=Po+ z?7B23)+L!P?I>@`c3pbAzCl}-RO!+#G9K5ZUCr91-OSphJhOIbce8fs0JC=KK(Xsm zu6!1XK3?7K23fzgE`5AA|NC(#yv6_CZbyQzFNNiPgY!6<^x!-$?at$luzgLtR3&y@ zI#H}kGF@tu+qy2b+jdf=OC2&E*QKk?+NEpE+NEpF+NDmjcB$8_UAj^1y3~X&-6ZR` z)}^b?KOuI!bYx-IiuLa_CHnI?{cO6ROEPgmm(s3FgSM|}mmU+lE0%j=>(V7=?NZdNUD|BcE?sKYE?r~RE?p~jT`H8%Xwt{4+wGL~8S?f2txIPe>0e)J zeeZJ8T`HFQ4UU&&vV-HLv^!q|F-R9B$lMgM>+iI7#7rQRCp-byzeTMx1Z|o9(9{2n6{NEk83|&g} z^`(xWOTqC{njSChV*8qQsYvX)^j@(p$#khsZtJ>KZ`((ZLz{NHJ6`dISkaq~f!f-a?LmpW`;(=OdCc3rwd ztV=Ro`nBBFb?JAuomA=4A7wnQOS5L}($i+`(lci5(z9mm(#vM;(vsM9DI#xd*T<{d zeMQ#C>k{AZz2>|A^`*mZUHu!E`nvZ(f(ahrU6Se2v2t72rBB*+Ql(4B$#`6sK4aD{)tI$Q$D6fFCz!QMXPC81o5Ze5-RM%I ztdG|veqQDC$NRsxd-ij_OO*+BsW<3SaJ-bJ$4eL6zNTHePVBnWBi1FEE**<_anJz`-wysNMww+Yz zQn`%Bb?HN9?b3(M+NF<}wM!Ld?NW_dyL7zRb*V}ooa@pFvOZpycpkUy2mH_D*ri0@ zzoef79CS&(89|rQu1gKJuW6Sq6T2>bRjf-gUAjkZ>$>zq+fJ%<>3$iH>(Yo>yYzrr zyY!%0yY!G*yYvgQc4<=Vx-@_;{ZiJ)>k`l74m`>KJnrt{RqOFmqQ4(E6m%&#k4w|@ zxIfyyrd@hf?7Fl~fvk`vnJyhDw{=}Q*tU}@T{=|8M%0JNB{~t^s4kJqsi&N>^0%M#I?CCtM_d+%mig#ZN+wK|rp4Rp}5cj^a ze}?DJrhgu@?nm-xq(jFQtnN?Rr8C8@OD$qua#z2s>}&FIKOub&vo7*0qbrM!P2P6A zvgkJDN7tbn<+f^h*(LNn+fJ%<={6aU>(ckl`^h-}%dA}*Fl(1?H*1$3Fl(0{6uU0f zqe~CT`gmR9@zNfZJFL8yQoB_7Q~x<9iN3zn7<4H(UP{yBrJvcprd^s7yDt4ztV=Ro z%99UWb6pDS2e8SKDqYH#@whJSZPqTm%dB16$E;l{Fl(1e%-W^H#jZ>G8Q}VOb-VA8 z^>Mp|-$N<>)1|R4UH4gkyp-tAK!?7DQ0SeInFber7Pb?J87 zPO5b2E*X#O(%ok5(miJF(vVrZbgx;v^r%_8^kcE>QaJ3p^q8!V*QFhITs`jHAh+Fg zfd72&7xwhOx0~qkQi0rWrfg5o(Sq|hJD2$v=XxXOubxxrxlHZY2`lFsZ#++lJpFp? ze5dDMoO@1uDiqN<*X{IN6aO4G+WGp*xwBqp-FDwU!l{MW7mnE`byk$>Yl&* z@yxuuIqo^pLYj8zSGKQdmlnjXORtG_Nv2ErvZK2$73fYcOR99KP{!lBbbwihc%WIk zw85-hDl%)AB4+Kyk{Dz9F~WUT&+eFMZ3llPX>Mu8hZZsn@JSywR*(y2-3v zy4kEpyb*cEBzDq^2ersLY{KGp|&IR;!?|U-)W1lCG==%gp<$i-M$s`6{ zO1mx{Y5SUX=|9A-OSNKMlIhYFa$DD>uh@1{rAt@Kc-G0|(k@+N)-GLZmM@`Bvv%n^ zvv%o5vv%nwvFlO?x^%Ow-&&V=ymb5D?oYZ)T|t+E*S*v9^`*OPU(+s)i(QwV6zh^q zmqM~byDnwu&Mix-bSYEDvrfjNUE0p9UE1EP4||F9>(V^Bv|iT7 z?b4dnW19_f+m;jWiXAU~^W4?n;Z5d!m5V`_f-a?LmkMoP(=NSFoF!j(mdnS)x+K%3 z^W?U!OBdR9Ql(3m$aq|rqGs*VX0vwbQnP#sU1ruUU2E1Zb&6e=%H^}r_3`R%kL%JIX6@1@vv#S`tX(?OEMG#K&Dy0)#jZ;s`#f{q?q#w*UYGcO@1m!gVn2_& z=STi?P8Je8UdojF4UU&&(u3orv^!q9+V(Z=QlHp$=}xgO$#iL2ZtJ=W!p)WE`3JE52{Fm#}5V~}xtlwIfKJb(W!UomA=4Z)H5LOTRN~muAe`rQe&iOMftHmtHi> zm(XA3zg(Ac@>d_PZg)}E$LrFLc-{Nz|GXg9rR=?TiXAT{`ntFNt*GEUP9{A#k4wAr zxHoO^$4l$Qu1ouhbxEd6pO)LYE*)>%NtG_0B;#>i`m9;Ibh25yRA<&Mea@_1I>)SC zI#>Kw`Kphz5nVb@*2nD;#g3OM6MTKCIp|Vwyp*QLOJB5oO^=tp zEp}b%7weKtm!{>mu1hnvomA=4tc=HX>1nfe=^3+j=~=UOY0j)&S~6>wUJ<`lzUt!~ zN0(le^;_%GtylQZIXQ0BcPY{HxXGYPL6_3BOPTV^5W1ggm-5A~OB=+xB-5o6<+iR% zC);*XrAwce@whJ4o3%?{Fl(1iHEWknGi#SFG;5by#I8#P@;6ZQ@#=OjlJ#5b(jT7o zU79`LzppaUF6rOZ3eMwX(u4E3v^$Tx()Km&QlHp$=}xgO$#iK}ZtJ=z?yL5oqb*V(GOEO*hg51`1>2%vps&wg08ISAIS!V6h z*=FrhlUciTj#<0(MYDG4OJdih8FcA#S--U|&EWN=Q(pDQONqX(axUmn(4{o((sj14 zX_xxNu1oibbxEd6GjdzkrCHlfs&r{i#^bv5C$o0xIkR@@&t~n?yji=nY}PLQUF^D4 zDt}W(AFporAF@7Pm-zWh>;K{3zjXJNtDnUrHwz_tyi_Ll8=S|<#0BSZX?Gr%b@1x` zq+Qxq?7CDe)+L!PeNJxcy7UFxPO5b2bQzE9(ivv$(k8QZsnM)mI@7FO+HBS?T`G26 z>Oz+;llAes#Pc}5?p=D8|D2PK1b-f(aeqU6Se2 zb8=hPr59{FsnVqvWjwA+e>H2D7R}nFznQg5FPXJVZ+`dcZM93=id~l$(WOjTzqKwM z_~bJy?+uWbu0mI?_n+^*kYJaVgDwT_bzNGr z?W9VVmSsGyOMf?Om;PbaF1>EnE`^F$udiLoHfxu56uU0=l( zOJDwA^1p{N7<4H(UP{yBrLgU5+NHz9u1iOYbxEd6r^#(ymp0jUQl(30%XnOun#|gz zbIjVMbIsbN^UT_%%gx%QHnHncW`RFmx1(#Ht-QV@c3rwxtV=Ro`h(oob?F(~PO5b2IT?@Z(x1)RrFpY<>3Oqu z=>@ZP=^tk8((7W^r8;yebja4bbaT_{XD;dS(l6`$d0b_JuP-$OT?&qu()4)gEwUf! zeyUyCTkN`2B-SOFE`3^V>$-HjZ6{T_bdrq6b?LKa?b69+?NXgtyYxA;cIh0mcIjNP z>(U6ibe^o=+VRrcPuOGJ58g*x&06w>}j2I-&B* zhxNIne~U9Tleyv&;i;#bvhw#g^*J{4tfaK5<8`us z7KvSFWYa&7S-bIexh&hhrd@iQ+_~%0dL4)?$#m(1a$DD>kJxrnrAx=icwCn%&Dy1p zo3%^Fnzc)xFl(1iHfxva#I8%t(g%IKy4}yo`gmR9`zp^I^2bY$UX=XbLx~1m3XYf3 z^myrP+t=P9`_z}ku1nX6bxEd6TjaK`OAp$1Ql(3e$aq|req`1zjhVGekD9ehKQ?QZ zo-%8fel2!gnnahTW&PH=^pQLK>r0nk<=^j}=y}|9(50YDY1*adY+rka>}zY}AkK9u zYvq70xh@?dw{=}Q+_sY{T{=R>*B-&&W#XRdy>iN3xxccuS(yNPzGMDACQndMs;oX5!=$kc~sj{C>TxyBpM9Y)Sy zJ*Uv?)Q+97avt%<>qMS@J$Am+bIplyuQTzfP{f_5^jxzs?scM_udkf@=zWbGwaqt`j}=l`ZkkiF*F-$20Tt=9RI%am)*8+NG0Z@^pXFE?q2kUAjUiRhDFqmwq6( z)%{fe-tHFLPO5b2K^c$h(nDt1y+fmB?b5?$?b0J=?a~uw?b4HC*QIvZfIeQ`?v$*L z*CoDxDdSsPVy`bXUg2N&o=EU@?@qbjpi468!TSW#?tKE!*uJJ+`n%Y5DO1BNOEO(L zNN%h9sdniQ+fJ%<>2Mj3>(YD7vU`W#Yt}B6nzc(un6*nEHEWkXCU#w#lMU$O)$JZ5 z>*IBae|O-F)87*7Qem#|Qlg(HupsvvbV(*X=u+Bs>3G}Mv`bB5*QHCuy5z2YS=rZi z5zEKHt}MISSKTjmGwZ&YCzn3Cty;U(Z`(nDp)2v+@G;5be z&Dy1h#jZ0i7mu}qXyOikhQia@a&?TAlpi61jrAgb@ zv`c>$yDq&X)+KlKOF~`R<8a@ly~MhtN|*ML@n}EfCF4+mS-Z5aS$6f%erD~`{$}mc zd(GOVQnBk&kKD+0=?GaLuS@)S+(VZg8tc+IUrhdW@4lc*!Ry{>`ufsGY+utZeO~Ok zbe33`WV-YnxvlP}dc1U#Z6{T_bc>9~b?H{KcB$X2UAoPzUHZORyR^luUAkZFy0nZg zjmY|VUD^?Uci;oJ9Utq`DU-fS0|~yqlpzBQj+f+{5gae2-SN^-Y+utZJtuZu`kPpn zWV*EXdwiGn73-2JT{=L<xMF zG>9(!K-S0W68{eP#b;h0>(Vis{P9v{g2zk4L6?FqrD>POY+utZ{Z8z<^qg3iWV-aW z_xdjFEY>Aey0n{&$8{;stXrw-{G$`xib&0PpwJrOf$L;c<|GNW; z{(f9j(52vbDNT=;9<+T;yYySJ>(ZaZx+K%3T}pkIb{FfCDqVV~jK_6pPqTJuFSB+j z->hBQ+pJwW#H?L9RP4GmhAtf@>*IC_?-SVJDgV0n#JiIJT)2s#OF@^?v`g=|eNDSm zBX(W-yjYiHy3`@Jb;nDcww+YzQkRU!b?NJ7?a~cq?b0{Q+NEx@cB$X2UAj%|x|A;~ z^zrI;zc1_Kb&2n*?BD3$Cy-T={O2zf%KZlCaWd(_d0g6^#|_)Qrd|4l*mdc*VqKEy z(zZwVF0B*mk}6$#tBl8WDch`F+R?0C+R3b4dYf6hw3k`ClrMH&ilR$<%ldd-;_KeG zpX`4g_jCNc-9%saZVS2;951Em@zT3(U(+sqSnRs=A7WjS>C(k=TX(#4sck1!y7VO( zkL%LqX6;g&S-W(FS-bRQvv%nQvv%nlV%Mc>wCH~XK*%^$n^8o2)bxI}*s zWj5$i(4{o((k-^HX_p=myDt4qtV=RoT63iD(l%mUQl(4V$#`6swl`~+)|s_SS!V6h z4rcAr?q==Mda>(L$p(KOw}-5c*QFit`qI>&Z;AapuJ9;-9+&9vp+w|j+}0g0wb*vnuWl~%Ci%Jt95!zwU-iD-@=k&KUA#Tr zO8L4M*5_lr{7LNCB7asbc3b(AAuEfvs6Z}J8ISAIX0vwbQnPmHGP8E6)vR6WG;5cx z6T2>TqD$Ay`gmR9>r021ufCU3Kj&m%UGiP(4!RT^FQw`6Qm^f6+NB?gU6&pa>yk{D z{vx+^UHYqSXZ`Bt{@1(ovW&-dY00czdc~|=dey95dd;j|TDNiaw%VmEvFp+Ty0n9= zkJ}~u9?F5QoDe%+I_6=29+&9rOG`nQf-a?Lmv*y#O}lik*mda$u`bDU=@hxG>(Z&V zo%O4m`(N+U88RN%rA=n-QlnYBbf#Imbe37Wbg5apbeY(7sX`8X^zrI;TV?&$x^(mv zj~}JyUwXWB_J8^=EhPAU?<(0qa2_X<7@WtY-Fe(Kwy$ZIz9)8F8Wii2OqYHmw{>0m zy=^B|y7aV+$93r$vv%oOvvz6DtX=w(S-bR#S-bSA*mbE7U3yK{$LkV5=j4gocZeM? zJy18dVtw5^(bty-f-VKeOKEz%v|VI%Kh-XU#jZ>Hi*-q+OH~oyrE0M*snVsIi0{(z zX6@1mX6@36X6;g~S-aF|)-IhXc3sMlsJP>$vt)hTF5x_`vdw>92MT~eh>zliuQO`5e!zcg!? zo-k{do-}Kho;7Qi=ESZ`wdm5HWc}8<^!D%hzti+jT}trt1nPq>1;&5PP>Dyvm zlIhaV-mG1ELF~GeD<7Dok5{+* z7g@ixF5Nc!^VsW4>{3U9uX~5(euMKkne^a1F73|a{%-r4c4^n6eV6tY>yk{DJ}I|# zT{_OTlPX<0LB`{{bfQ_iRQvz1cPH>R)c^m$RkrLTyNE*eEo<5LeczJ(+PAD(vS&?X ztq?*;Nh?y;WG`)0C@QUrv{01)bKG;>OZuk!?OXo+%;WKV-1nJ#&dg_KKJ%KHbI+X< zs)Jl=9jb#|Y7?r1T1MzRmmeWB%jwFE)#ig6K`9`I(;nK z`O=@vrNLKn>B{-izw~@*L}*_Na_JFu_@DuLv@f#pM>flmkx*OAeVj!)j=-(s1E1S?r6Dm!uX5jQuNPzZ~ZaqJ||CRKON)0 z$Gv+cm#*Z}zciQPl#kp`gIvm@4(C!Hbuh#vms)sjIG5UlrgOREQhV(Q=Te7I9pqBS zP#xq_r%)Z_Qs+<|Elq3K*Mx%8FxgmdXg zs19=J>rfr!(l?@Cnp*qN=SQVmjX>7Dyy2|*ACZ1szLHB<&X@kB=SxZLN5Os?L8aQLUoW!?L&2tOZ`H1kW2m5;q#?WqUF-v#>e*iU_D+%@PB`aiGH7x zrfr!(l_dGE|u{`CBgCr(>-c@Y(M`~E>#&6 zl}lqcr$3iVfA&5nRm}Iwb)1!brw66uZG(jCcUz(u~hM45iI0fug^i^nI3v%h|N>RC#SRD*8$)zG*8_uN?q3K*Mxl~Gf!nssB zR0p|KCR7KxR5nxxxl}Gx2f0))R0p|KUmeb+2J#_T-e9^7jQ^utdbeEE{g-0D7Wvul z;C=5u`?<>IS90mf`O?4ie5p-nUkh?+fI57>G)f%|G0CMTy*8XnPlu*+x#ZIG+7r&D z7eaNAODjWlkV~sVb&yM|Lv@f#+d_4aOWW1qTv`z=mv$KcN4eCwU)1^1o}E$eFYW%5 zpA%ShC6}(`(!Vs9-V5z(K`tFrhjZzaIv8S-OE*=H%B39YV7OdzDYy27b16@#4st1P zs19-|U#JdpDSxOAa;Z$H4sxliI-E<1ibS0+l{5a2aw*d_ubsR9Qmsu_fBcP zSFYo1j4Ri1|GMkAI-z|n$fXYIa4z*y2SZG9X_nW9&zI(grgORE(gN)X=hDJZ9puuY zP#xsbW1%|8rNyB-$fcE`I>@C}>ToV~jFwBQjlWnfMgN>Yn`Tj;_b#z2=ARSjc_o*w zoG<-L&zH7@_O&3FK2V2q=?ir*#3YweREf%^RO(>3TyiO$_JngOeW(s{DMP3Zaw%h| z4sz*+P#xq_-cTLnQa*J!mtKjMOZknzXf7p-Jh#c`wS%vYdVi@$&X|9$a_5y?x{^!( z(p)MP+Sh_yYN!t9QY&>Z#3Yx-d2RT7X<}$PmrE`^pgrMSni8smT$&oHgIt;xs)Jmb z9;$;}S`?~-TzX6$&ZW#nqpsr?8~;bS^u@8L|3g_;BgMJTFa6o~mvWeId~Fd=v3kxc zyFRFmiZyKau+l+YjLz-bmkK{;*t`wv!q17d`SjY0J?CJLjpv>-Z0gHr>kFsTYDt-M z^ICtR^x68t=gjLB)t(hoT3+-yb(Um~Hl2$IE&z0-A$nAb`_{P!~ z+or?rT6=bU&^I!V+H}$9#HupprE`7bVEnW7h1>Mt+^B6~Qn4;JuVeADoZF_Y=54s> zypp{Ut^f2mzs*5zT+j1WBKOlEmv*YdxwKau3~3^NoZZ*bs)Nrk2Sd8ZA7|T^K2!(O z%n;O7qjD*>Iv6gOT#Bzf;as{lR0p|~AXEprlrU5Wxs)hW2f36XR0p|~Q60{u!O?Q* z2IK!Im+o91^|{K-xuSBZ&Y!&h(x@xBbme^MUwXcjJG8F_xl~0R&ZYY5V2DXBjr7_e zqk{XwjR{TXa>=C$+7r&D`$Bb)OA|wNkW2T6>L8aUh3X)e=7#DZm*%O%x%6(dT$*qE z#d0b7{RFb_XmRfIOK;sCl}ms2eCgnoT)L7=|I%D~DzvW!xwJza&ZRx-V2DXB#jO^V zO9|A$aJl4C6731+QqoYJQ~Q#I>L8brhw31gQiSRtm$HQFAeXYL!?{%032y@9g6ZC5 z{6%xgiDq!#n~$2EqyBIAjTup&U;4ATbes7G)4XyWH+oI59>jF4gTHgFw|+q6HAV28 zR$E(~z1Fb$&b!VnbNI};>z#SObM3jiajY`odCi-0@oU&&)6Sf|b`IvXzS-J!!SgSi zSFA3l&pl^Y=btWmO+D|IsP-H@G5n&}M92Q6xl}N;uLZeOTOH1&X6j%_6Zzv$UB^xE z+5}z~oG(oZP3LmSrK#Ez&ZTLgI;VC{57j{~%?Q;&F3k+pK`t#0)j=*TQHOJBvQC%4 zxL~?VjlWnfMZeEU^Ut=Q`ht%^np4UVvEg3Ux4CF1eISdxHG9h18)sr#elj&ZSNps)Jlg7pj9?${DJI zT*{>m=hBgAxs==Zi{(=E>$uF(-uE6{Am-oG^!=4wx^f-&FFju>5!%;+T&k-M=TdWZ zFvKL6hInlPuMN(ZMuetwx#ZGl?MbLzK`xC6)j=+e4b{2S<3e?iOXEXzkV~^db&yN5 z)!|&KQatK>X^!z1%cbD&1;M#Za2+?|&<|&?1%mtN-uGpObAONfJmZwJ=k{(xd3Fe% z?^Y(~YX63Jb_nL{qu#OVm~Z%eDfmTD2iFe45Y%Gpyz7)$t?HEwKd0a3Ve2pUoF;>Z zmI*&6`KF6MC)T8>=frB4@w~s?1lv9Md&;uVx(fQ$Ms>Jf?NSFrO#0PPuMPLB??ThL zT>8}s?MZ04f_`-}R0sX)r%;_s{d1@e`qimW9rUY2H6mXd^sB_`aKCC7tzRWE{*U_A zPX~WJ_rB$@?_>V?ldhN0uX;uMJMZ7wuQG(zRnV^rsT28`no{auh)KU{<+b5{)h;xh z%cWm+)SiTvE9h69LUquuI*00@Uv&x9xz$}mbTG4b^Mo@zaKvK68cs2&ky{a{c2)pT?PGWkvfr|LBCp|4u+WYtGB#1+^_bArgORU zt9{xN?pOOmbY=O79)F8y!|xpj7sWkx?m3ro9E?>nayC-0FIvI*+<- zs1Ev7J9W5Ut%}yKB8>l|epU1I>T~_7(4OOG>zLf%a{XV_ucBw#@Aa!&7moi^{i=6p zT?PGWygJ;krmKS?CjDxq*M|Gmn$UDEmwvTQd&2!{eW(ul)rL?V^s9}bI_OuMLUkVX z+o3w>SMR99{p#&#{c4Z#7wcEz>g>66K0i0aPJHft&a$yapX*nX|72e6{~P;N#pT=o zuwNY?lA?65-GlS?PeSV|=vSxI;eHjjmJx=S^s5|R8}3)RL({oj`c;1I3HPf4p*rYS z1w(bvuL_0gpkEaZ)p^tvLv>ztC3U!89gEhlDjWYt{px70glDe-gX_WPR*gA#9Q?EW z>f~kIuNsEdRnV`xs>A)Nzd9IV(yt!!+Hk*`6PnKD(y!)gPq<$_8mfbSwIEan{c2&T z4*J!iP#yHE7eaMj^-6WPUnMFLxxB%2R~i3D{c2w4ndkCqecX-b@@n^=%&U~<8@wk_ zgkT82KM<~qDWV_a{+sjmKbu#thSpWkuMVig{pxddFvO%^C8!R`An z^2gcd+^(Jw8ed8s{k=ht&K(P4#ftjh#@iD#K6@OGd~Y!F^Y+1egQ>GT9K03yn|97L z{ct;Hsl)AjTpe!bhEN@}^FwtoT-eU9LgRni&SdAZC04Ac{|*1M?L1-n;dY)!6Zs#59a63Dz!|QW+s1DjW zR~-x&wsTo%{BPU2B-;9n{9JT!&2m9I&weK4KW+DwrXOzS8g;mx+tuNA9tzb#JI|!loW>N>kh3(80 z8vomNMz$@oo%7EAji7+npT9nb{bBzsYWm@JmQ;t^Sxp^oXX{WMv~#FB7%pt*gwXik zwli_G{Ooz|Tzc1e=RAMh&Y7kkZs#m@xSfxy!|mJ{s)KeOR0qR_?K~11|J!yJjAKIEf7{OJ$IYny==}A0{_#DjSp?xU*iK)zS48VNy?XSF z=+&oFL~oC~wdoYmy-)q_?JBe$;5ku`Yjx_-u}`$ee&47^*XY0R<8j6A{mS-j*QrP3 zQuvH%-`<_tmTTRoPuGaEqs~5#oOIOV$Vo>%t`O1n?97d6)Vf!L)@?#B_PAE-Zjlo@ z`)v2=8_@H-$BkNd?HheWdCS+QZ?A~VH9Ga~<24m}^yn3?gGp5E-nK{I?tLP{BSTLM zP2K$g{kC1Sk@frZ=oJy|af4o+I&_HWb#6?9)*a5hHYgfIbnDr*b)SfO5xwh0w2u|5 zMvu0wyLK8F(Jr(gW&8H&Q7@ufkA4x=BZBo^sdd{voqBXXH;wXrd-d+o>)gXwRcwW> z!Ir2Jadvxn)p@I=MyKvwBHA@LxBkPAD|Kz%!R9sp*6r%I?G+Kxy=sMEs&#tw>eH)r zr#@BNMb4u^uhu;)MD&Sh+b43ZM?J3K+kz}l@cT}^TleY~`TNK^@^|6i2lI-YTIBO< zcaNywu}84>BOgcKX0^LVP9gmK+TDXWgw|?AyI8fmm+#uCZI|$`V`+P*o)*4!uRd*T z+0f(K-75y$(6b_c@A2K8&dxCMal_sby(&bs@6MHJ)mdslyHYC z+q0)-ZQZ?Xs8d&n=zVq#g!@R9*1c=C?pdoxpV05mdtkDm#}&H=o69z?)3tTmh@cMb z1i^JjoqFY4)@(g6qNSB+X?wRUAM6q-{ibKHwk^8_zp)B>4QSb2XX%)rdqn>Z5#1wt zb!wZ*Qx+GG`sc+USZW2&>EF6nyUfAV&aDT(iIptc zqwgQi(mopFSzf0B(V7)3W&eoYeWESo4W1EwA(MFA*i&M-j2D?~4ITAtm0XIE*<3l_7mCr4ke zH+dX6>uj0NZqdxyG6(C~k6`Iz)S$%C8+5_^gHIDhpMUV&7|$qe^ch88@(X4fyloPF zra>bvT<91#B6x4=-0J`R6`%WpHe~SluUg^1yB;pssV-$boZa{_>4ulVdN{8Mk^Lc9 z0~hWC7uyu!?(pCC{quq*vI!S-#+xtb2*LYK;kn1S6P`EQ$WC|(vkmvZ|F35owVk6K zKK|26j&Tpa$Vv{n*B{I_ypsQ#+5UY?d*03z*`6FsIJuNV$zK^O|Im(h!BYRHSov#~_V3%j|8MPF=Phkynq9)S4F}o3VB2284pb|+ zhzy_q$K(|7a#+bxN2>qzarv^l?mBPv|LYHz7g^fBqmQ3=S`?MmmvUNk-v0I1o)-Nb zOMc!8|NC~c^Je=G_3EhY{0E_O-X@Mog#PaN*9BYnQqI2`2k+zjrH#1Yka;PMi1DHG zvRD(B!QTG6>*4R*7+2OqaSoif)uWd7QjT@?gTD@h&n5rb zW8DS){y!~wjKk-=?fmzp|K%{-$nAUyD>=N0W4w}oH`y-e+m~{fiE$sl(unZi0WXU+ zagjaX61rmev@6D4@x0kaCEXvK?S=P%7k?M-zbHojZ!PUV)RX`A z+5SUu5jopSSlVz(HIC`qJLkp4KRVk>*nz@JTQR1eM!Fo9_8-dRe`woAF6|}si^sO_&?Oy{%_6p|JJtshnDsq&96(?Z^QZZ*BqPvz8&bi>%z#{25EgM z@9Tya`D|qW7w_wy*Mz9;d?`(+{};Wre5DD&r~faDcl|DlMqK1X@e(p1+#6$@0hh(H zU*3(lU^86G-vj>t-W=z3#i)S(gSVs4%jTH;-T%sL9R>f^l^l8GyP$tx?Ct3PI%dw> zw*UIsUKV+F-YSpWi!WhIhxg(bC)h=1`*&Q6pEujTuY+AViwn-;F0%43VVj3T6Q07X|1g%r?A|8~=ay7ohWYrl{z+l+ZkHk^ldG-|2VHO)uEJ{->9@ z=WU9ACf9yO^E7Vf9HA2?;fZA&V%K7>mjP+UCMem zuhah*=Wpkwc;x-DE=ci<-CQZivl!mU>EA!Yi`@U~?6!>-V}HXf$Ntx|yvTOEVAr`= z#|h3W|GJKIWrpr`^k1w}ua1?Zd;gaGL$~Y8pT9t`S-ON^S%SZA7yg|Y{1^LhkXFGBB!fG9 zCL=j12*NIyTMzeB&gT0Eg0CF7nrnzn9O4p>AmgqjxD9e}%j3iZx0(xXJsNyU%tLRG3!of_1n z7PYBEUFuPv1~jA*jcGztnsEosxsw*Oq!q1cgF6Vva@*8c9qB}8f}7)Zr7i7nlhB79ObD%MJiF5 zDpaK!)u};EYEhdy)TJKvX+T37(U>MQr5Sh7oI7bjOIp#IHngQ35wxcR9qB}8y3mzw zbf*VBxr<)(rVoATM}O{S00SAsVD4cELm9?!Mlh05+{aod>&;13t7ZtEM^Hyd7NcD!ILcKDOT__&+shI@jNfE zl2xqcMb_{VFSC}7Y~mF*^D0}|$~xAwfo*JO2RqrtYrM{G-r!B%;%(kx4|{o+_jsRu z?B@U<@F52|#7BJ0CmiNeKI3z~;7h*Z2w(FJM>)o~9OpZ}=Lde|1Sk24pE<>8e&JWn z5FFUA;%crTHgSkcJmPaL2}npH5|f0aBqKQ~xQ>)uPbyNAhP0$3JsHTz4P+uSH*quB z$W9J!AtyJIg{{lo#;##y3&pA z^q?nq(Tm>np)dXD&)p1QAcGjpJq%$e!x+v8Ml*)7jAJ|#xQ~&H;$9|lKa-fu159Bm z)0oZ-X7V5p@i4QP%^V(KF7uerqby({i+GI1EMX~+vy3NrlI1+b3ZCW}p5-~7=LJ@> ziq*Wx8eZaM*0PTEY+xgsc!kZp$`-b=jqU7UC%br!*V)Y*yvbX<%{%O2FYodm@3W8n z9N+^!!V%&-sEc`HCZa%{Lt8Q$FJ;$M}}xe8>0vz>l2ZBtP*pr#Q_o{K^@E zllrT;nrnzn9O4p>_*_c@5|W6-Bq1ruNKOi_BPG|9iqxbbE$K*41~PI3naIqIWFadz zaWmP-P7ZD%C%MQ?9`cfp{1l)dg(%Fe6rm`^C{77VavQf(iqe#!EafOq1u9aBYE-8N zHK|2y>QI>~RHZKUs80hL(ul@1p()L{gXY{x3tG~O*0iB5?TDZ~9q33WI@5)&bfY^x z=*eC5qBni$OF#N^Hv<^RAO>>}Lm0|1hBJbZjN)EKGlsE@V>}bMkBQvRBqs9!Q<%y$ zrZal%q(Uzhew#pJm&K#3s}e^9%C^}c!DQc&Qq-5X`W#zkF$(td5-6Kft9Rc zH7~M;mw1`AtYbYJ*vKYcVKc9?g{^F3J3H9PE?(nxcJl^r@)mFN4tv|;L% z_<#>N$RR%BV?N<9pYj=>^95h>6-W4*Z#c>^zU4UI@jXBABPTe?PyEa&PV)=Da)wy3 z?f+cOHN++kafwHKt|b9UNJ=u2lY;9=NkS5lnCnSJYSNIFbfhN(8M%Q>WadV)kd>Rb znQUYy2e*)uT;wJXdC5n93Q&+j6y{cnP?Ta6rvxRrjoT?jY06NRa+Ie66{$pJs!)|` zRHp_tsYPw-P?vhtrvVLVL}QxJlxEyPbMB-CEont-+R&DEM9`iNbfgoV=|Wd}au>bm zO&|Kwk8X6Q2mQI50SsgigSm$x3}qO@8No;I& z7g@tgyv$nGv7QZVWD~EjnOE7uR<^O79qeQmukj{t@iy+I$Y-s64tv7ZBc zz=s^<5Fha|pKzE@`Hau`f-m`sBYe#_9OW3_a-8q@o*(#;6P)BHe&!UX`GsFOL##OV zf3D^lViSkB#3Me}l7NIHA~8uwN-~m@g6l}h^`s&-X-G>t(vyLV+(0HWb0b;E%1zu% zHnNk0TgXW+a+8O=-RSnGwz@{chZ8Ew4ya_XiGaHXio<^(uvM=p)1|!P7iu= z7rp3BANtad{@l#~1~Q1j+`|xtGK}GjU?iism(h%2EaMo@1ny%Z_cMvfJiruYFp~#) zh=-ZQY^E}e>CE8~<}#1@JjwzVvWUl6%o3LJILml~Ct1!@tl(*$;aQ&Jd0t>8t60s8 ztl=eIW-aSj&jvQKiC5Unt88H_+t|(ycCw4tc%9w6!JE9r+q}ab_VO<8@jm<5&jCK* zLk@C?kNB8RILxPf#^-#&mwd$$zUCW_a*S^|&UbvzNq*vIPH~!F_>~{{krSLDR$Ti( zS91-qi9=lC5ua;GKtd9cm?R`68Oce(b)@8aQjwZ8q$M5c$v{SKAQPFnkt}58CT=Dh z*~!5zQ3Jl%*WysX#?4QJE@Kr5e?# zK}~8=n>y5`9`$KJLmJVHJ7~_Gw4f!eXiO8D(wa83r5zEprvn}7L}$9tm2PyW2R*rq zUi799ed$Mk?q&c38N^`jVF*JR#&AY3l2P2tXvQ#>ag1jI_c4+CnZ#rsU3LY-a~M*~M$T&Tih|P2S>d-eC`Wd6)NipMC7-03Yxn z2RXz?e9R{t=2Jf7bH3n9zTya9^9@Hi#$* zdeeu#^rJs_Gk}2%VlcxP&Im>_ihCK&Jq%$eV;IXg#xsHYn8^K1Vlodfg{e$qIy0Eb zgFM8;%wjfkc!askV?K|vfQ2mLF&49gr993up5RHA^Asz1nrC>H=XjnMSjj3@^CD|_ ziI-W+I@Ys+jcno-HuEZ5*vdAxvxA-N;x%4pH*fGJZ}B$ou!p_8%X_@fKK65f5BP|W z`GmuK%4dAehaBV(U+^VgafGk=hNB$gTaNP`-}3`Ma)Oim#Lt}KG{5jGX9)g)e-&4A z4Y7$sT;dU*Ye_&t5|NlBBqbTiNx^lb-JjrsNVg*n04A1f$&+`H+ zS;cBzWDPIzGHY4KdN#0;O}xTpUS$hg*~WHuu#;W9#_R0n4c_D}-sT)uPbyNAhP0$3JsHTz4P+uSH{ z+{DdfBRe^`g`DIfH+jfQKJrt5f)t`Kw^D?n6r(sLD9LTyPAN)LhO(5SJQb)&B`Q;e zs#K#oHK<7~YEy^0)T2HPXhnp)dXD&)p1QAcGjpJq%$e!x+v8Mly~;65gDKa-fu159Bm z)0oZ-X7V5p@i4QP%^V(KF7uerqby({i+GI1EMX~+vy3NrlI1+b3ZCW}p5-~7=LJ@> ziq*Wx8eZaM*0PTEY+xgsc!kZp$`-b=lU=;V>+I$Y-eeow*}+@9%{%O2FYodm@3W8n z9N+^!!V%!+gqTe9jkq$yXfVYrf$q$M}}xe8>0vz>l2ZBtP*pr#Q_o{K^@E zFX_IDtGR~Q#33&6h|jeoAR&oJOcIikjO3)?I#O~ysYp#4(vpt!WFR9qkcrIPNEWhk z6E~BM?Bw7Ua*~&Plxi$tdn+G-DXcIL0%9`)o~{KU_k;xxbTD`yBk zxO){>a}BYHLtNq!pKD1#LK2afBqSvn$w|R=q~v;1k(xB5B^~L>Kt^sL6PdY@EM(;- zZYCSq$-yn;Bp12KLtgTcp8^!55QVvwA{3<<#VJ8aZsT@JQJON8r5xp{Kt(E1nJQGJ z8r7*mO=?k_Iy9gmjc800n$nEA)T2Ik(40GIK}%ZEnl`kh9TBvr10Cr^XS&dpZgi&y zJ-Lfs^rjDe=|_L=W&i^j#9;1W2tygha7HkaQQXUD#xRy~jAsJ(F_HV3#AF^|3R9WJ zbY?J<2YHBxnZ<18@Cb96$9x`T0Sj5gV=QI~OL?4SJi(JJ=P6e3G|%t?D_O;AUStg~ z@hs2rJTJ4Bb*yIt8`;DwZ01$Au$66WX9qjk#cRCIZr@%3Uez(C`vJkQ-YG*#_g1%G-W7DIm%Okid3R9Rj5ie zs#AlS)S@n7B4|$sI?{>GbfGKV=uQuM zau>bmO&|KwkAVzgF!wNop$wxxcQb(Dj9?_AxR=q4VJzbq&jjvcBKI?i$vnUmrZSD` z%wQ%D@(>R*i`mTK5#})37P5%PSj-ZZ@;J+Qf+tzdQ>@@=p5a-Z<9S|SC97D? zi>%=#US=)pSkDGFvWZvN%&Tl+E8E!44tBDO*La=Xyuq8i#oN5Y9`^Ds`#Hb|e8@o# z@e%LwKKuBXPdLn{e8%T|!Iyl+5x(Xdj&h7|InH-{&ky{_2~P48KXZ!H{KBuCA^3-# ztGJqLh)o>g5|8*?O9B#-h{PlzDalAq3a%q1*OQ9Wq#-ToNKXbbas!#j%#CCrD>rd7 z*~m@~ZXqYR$W0#dl8^ippdf`P%&iomD8(pF2})6#GL)qp<*7hPZsT?;Qi;k`p(@p= zP7P{Oi`vwoF7>ES0~*qZ#x$WR&A5Z++(`>s(u&r!p)Ku*pgkSvNGCeeg|2j?J3Z*h zUG$=XrsZtYS4U zvWAy`yoKH_6O;V_@_8K3h7U-A`4_?mAx$}zs>IN$L-Kky?bILS}^%qdRu3%_!868k){ zi9=lC5uY=DAN+IRRa{E~5|W6-Bq1ruNKOi_BPG|9iqxbbE$K*41~PI3naIqIWFadz zaWmP-P7ZD%C%MQ?9`cfp{1l)dg(%Fe6rm`^C{77VavQf(iqe#!EafOq1u9aB%2c5$ z)u>JlYEp~Z)S)i*s80hL(ul@1p()L{gXY{x3tG~Oc0|yg4s@gwooP)Q+R}xtbfY^x z=*eC5qBni$OF#N^Hv<^RAO>>}Lm0|1hBJbZjN)EKGlsE@V>}bMkBQvRBqs9!Q<%y$ zrZal%q(Uzhew#pJm&K#3s}e^9%C^}Sjyup;|ZQ*IZv^Ir+J2Fd5-6Kft9Rc zH7~M;mw1`AtYbYJ*vPAFVJq9%&JK36iC5UnE?(nxcJl^r@)mFN4tv|;L% z_<#>N$RR%BV?N<9pYj=>^95h>6-W4*Z#c>^zU4UI@jXBABPTe?PyEa&PV)=Da)#ia zf3MNN>hfil%qTqs7NI$Q-!Kj zqdGOHNiAwqhq~0GJ`HF{BO23$rZnRYnsX;DXh|zt(}uRRBZBsHpd+2=Oc%P+jqdcI zCwI|{-t?g_{pio#3}7IG7|cBkVJO2G&Im>_ihCK&cqVWk6S<#BOlAyY8OH-mVJg#@ z&J1SqAP?~{vzW~s9$_x?n9rjuU?GcmjKwTrDUY*^CwP+OJjDv0<{6&lIiBYQR|iImc#YTD%^SSQTfEIX>|rnO@*eNAkNq6r z13u&+hxmw(`GmuK%4dAe5x(Xdj&h7|InEb+$ya>G_x!+*oZuus@iV75%`g1Q8G?WO zzly85hSv8c>}Y)TAMeXiO8D(u_N3&YiTNC9P;p8`{#22-?$uj&!0kUFb?Ty3>Q6 z+(j>X(}%wFqd#{ufPoBRF!wNop$ua@iyhAf;v+uh6Atq!pYb_g@Fibygs=IAqa5Q~j`JPg^8-I}f|LBj&z#~kzwj$(2yXgu z6<2c&v57-m;t`)~NkBppk(eZ;;5t%rJ*h}d8j_NXB&GwZXgqxxsfbn z8`;UhE#xE@xyeIb@{ykc6r>P^xs@Umr5MF2K}l}oc1ls2GL)qp<*7hLDp8p#RHYi# zsXcR`4{>@GQ^qJTI`4RjlSk z*6F-b^DGLn;m>qyDlYxxfKqfMCBU#AGP25a2 zvXg^b$Vo18lZU+IBR>TwNFfSSjN+7_B)4%prMQ(M6s0s}C`&oYQ-O+9qB2#eN;Rre zgPPQ$Hg%{=J?hhdhBTrvO=wCp?w~n$(t?(>qBU)3OFJTHPX{{EiOzJPE8XZ$4|;MJ zz35FJ`qGd7+|2+6GKj(4!w`ltjNy!6B%`>O(Trg%;~38b?qeeNGl|JOz!au3jp@wb zVP-L#IXuE#<}s58d5HNu$^sU$h{ssW5|;8f%Xoq(S@RZL}HSVlw>3)1=o?1>q$jw(vX&Pq$dLzxq(b%=0>uRm7BPk zY-A?~w~&)u9y}ZkNyw5)N zbAS){kb@lJBR=L64)ZCW@i|}cC0}ubula_f9OGM#^Bv#w13z+tll;WboZ>XU@GEBs zZuEB*S91-qi9=lC5ua;GKtd9cm?R`68Oce(b)@8aQjwZ8q$M5c$v{SKAPZT!iJQqr zc5;x3%-qN=Q3Jl%*WysX#?4QJE@K zr5e?#K}~8=n>y5`9`$KJLmJVTCN!lPchH3LY-a~M*~M$T&Tih|P2S>d-eC`Wd6)NipMC7- z03Yxn2RXz?e9C8h&KG>iR~+GEKH)H5^9@Hi#rvcb*M`{>eGORG@>z0Xi78gpgDKaf|j(RHEn21J0fUL2RhP;&UB$G-RMpa zdU6-N=uIE`(vSY!%>V{6h{4>$5QZ|0;f!D;qqvvRjA1O}7|#UmV`6s9tb z>C9jz5AqNXGmF{G;SuICkNG^x0v57}$9SA&Ji(JJ=P6dOm?bRbX`bO(p5u95U?rsZeQHnNFV*vzYJVJq9%&JK36i`RIa-Mqn@yv5tR!yfkXF7NR^``FI` zKHx(Ra)^)km`^y&r+miee8HD|#Sy;d8;){}Z#m9)e9sU3$O%sJ6F+l`)BM7(oFTYT z?^RsQHN++kafwHK5|NlBBqbTiNx`)wAR*V0lIuxDYSNIFbfhN(8M%Q>WadV)kd>Rb znQUYy2e*)uT;wJXdC5n93Q&+j6y{cnP?Ta6rvxRrjoT?jY06NRa+Ie66{$pJs!)|` zRHp_tsYPw-P?vhtrvVLVL}QxJlxEyPbMB-CEont-+R&DEM9`iNbfgoV=}r%Nau>bm zO&_|@m2UK;I& z7g@tgyv$nGv7QZVWD~EjnOE7uR<^O79qeQ`Z}28>@iy+I!S-s64tv7ZBc zz=s^<5Fha|pKzE@`Hau`f-m`sBYe#_9OW3_a-8q@o*(#;6P)BHe&!UX`GsFOLvWMs ztGJqLh)o>g5|8*?O9B#-h{PlzDalAq3a%q1*OQ9Wq#-ToNKXbbas!#j%#CCrD>rd7 z*~m@~ZXqYR$W0#dQjkIv=2nVOlw#x~KLsdG2}*Jsw^NGJl%Xu;C{G0{Qi;k`p(@p= zP7P{Oi`vwoF7>ES0~*qZ#x$WR&A5Z++(`>s(u&r!p)Ku*pgkSvNGCeeg|2j?J3Z*h zUG$=XrsZtYS4U zvWAy`yoKH_6O;V_@_8K3h7U-A`4_?mAx$}zs>I6rcNll;WboZ>X!@jXBA3%_!P;0FCy zaW&Tvn>fTJ9`U)B1SBL8iAh3Il98MgTt`Z-Cl#qlLt4_2o(yE<1~QSE8_7aeZsKOL zk)0geLQZm#n>^$tANeUjK?+frTPZ?Oicy>rl;k#Urxc|rLs`mEo(fc?5|yb!RjN^) z8q}l~wW&j0>QSEtG@&WYxP#{0Nedd%h{m*}6|HGQTiOvpdpgjOPIRUVUFk-5deD=* z=tXb((3gJn=WYftkUWKVGL&kBN@fLjAjgD8OL}ga32%7pGi#S0j4mOX-sDZ zGkK7Qc$ittW)6=qmwC+RQ5LX}MLfo0mavq^S;iAQ$#R}z1yAz~&+;74^8zojhL?Dm zwX9=3D_O;AHn5RRyuxN)WeZ!`#&&kFlU=;V>+I$Y-sCOb<{kF1mv?!O_u0pO4)6gV za*#uO#K(NXVLs(EKIaR*eTzTDWFj*+l7+OSBRyHUiJQqr zc5-kFImtzC@{pH&`oTF{bKw5APhX-5R@=|D$1(U~rEr5oMpK~L_Y z7rp62U;5FXyBWYhhA@<23}*x*8O0z5a}W12nlX%J9OIe5eN5zjCNY@@n8H-1F`XIA z3#?=nt9g+% zyu{0_WgY9;z(zLl3Y&SAEo@~Q+u6ZRcJcoxx`!x0mIR7|J#E{zZQHhO+qP}nwr$(C zZTG}q#Ho{6>zmtmmUEov0vEZ&Wv+0QYh33BH@U@a?(=|$JmN7=c*-5_a*t;`=LIi$ z#cSU1mUq1810VUsXTI>2Z+zzmKl#OP{_vN7{5Q<=KLQenzyu*E!3a(WLK2G5gdr^9 z2u}ne5{bw}Au7>`P7Goai`c{=F7b#@0uqvl#3Ugp$w*ELQj&_)q#-To_-`TVzY(YZ zc9#B|Li%rV?7vyC|E9bCo7ehp0_(q-s+{B^H+jfQK?+frA{3<<#mPs03Q&TQl%h0c zC`&oYQ-O+9qB2#eN;RregPPQ$Hg%{=J?hhdhBTrvO=wCpn$v=ow4ya_XiGcV(}9k3 zqBC9SN;kUGgP!!FH+|?!Kl(F(fed0WLm0|1hBJbZjAArn7|S@uGl7XrVlq>h$~2}k zgPF`?HglNEJm#~QB`jqb%UQun7O;>-tYS55Sj#%rvw@9lVl!LV$~LyMgPrVRH+$I2 zKK65fgB;>8M>xtcj&p*OoZ>WRILkTCbAgLo;xbpb$~CTYgPYvqHg~woJ?`^>hdkmj zPk72Rp7Vm2yy7))c*{H9^MQ|i;xk|P$~V6AgP;83H-GrcKmHr#`X2!aN-%;Gf{=tF zG=T_A5W*0aaD*oU5s5@(q7ap6L?;F@iA8MU5SMtwCjkjbL}HSVlw>3)1u02IYSNIF zbfhN(8OcOuvXGT*WG4qX$whARke7VqrvL>hL}7|hlwuU81SKg&Y06NRa+Ie66{$pJ zs!)|`RHp_tsYPw-P?vhtrvVLVL}QxMf|j(RHEn216PnVDcC@Dh9qB}8y3mzwbf*VB z=|yk)(3gJnX8;2k#9)Rnlwk~K1S1*6XvQ#>ag1jI6Pd(hrZAOhOlJl&nZ<18Fqe7E zX8{XY#A24Plw~Yu1uI#_YSyrpb*yIt8`;EWwy>3LY-a~M*~M=5u$O)8=Ku#e#9@wb zl#`s|G-o)=InHy85{l4-AuQnt zPXrvz-t?g_{pimC z1~Q1j3}Gn47|sYrGL~_SX95$M#AHS>nlVgaD$|(G3}!Nm+00=s^O(;97P5%NEMY0j zSk4MovWnHLVJ+)e&jvQKiOp+5P=CoP=XPh5QHQYp$S7+!V#VbL?jZCi9%GO z5uF&sBo?uWLtNq!p9CZ%5s67cQj(FJ6r>~-sYydx(vhAFWF!-r$wF4Lk)0gmBp12K zLtgTcp8^!55QQm1QHoKV5|pGAr71&MDpHBcRG})>s7^V`Q-K=Pq!zWQLtW}op9VCf z5shg=Q<~A77PO=lt!YDB+R>g4bfgoV=|We!(VZUjq!+#ELtpyQp8*VH5Q7=QP=+y_ z5sYLMqZz|k#xb4=Ok@(1nZi`2F`XIAWEQiT!(8Sup9L&r5sO*EQkJot6|7_xt69TZ z*0G+=Y+)lxi$tXrMhOvxe zJQJA6BqlS3sZ3)!GnmONW;2Jm%ws+aSjZw4vxKEAV>v5W$tqT}hPA9?Jsa4_CN{H$ zt!!gEJJ`uCcC&}Q>|;L%ILILmbA+QD<2WZc$tg~AhO?aGJQujgB`$M?tK8%kx4FYz z?s1=MT;~Q4c*r9j^Mt27<2f&Q$tzy-hPS-qJsKlsTne)EUF{Nuk7 z?*9>xKm;ZTK?z21LJ*QrgeDAO2}gJ$5RphkCJIrBMs#8jlUT$i4snS`d=ik5L?k8& zNl8X>Qjn5Vq$Uk%Nk@7zkdaJeCJR}~Ms{+OhrHw?KLsdA4sw!Gwg zl%@=2DMxuKP?1VhrV3T5Ms;dXlUmfK4t1$VeHze^Ml_}gO=(7RTF{bKw5APhX-9iH z(2-7brVCx^Mt6G9lV0?u4}IxJe+Dp+K@4UHLm9?!Mlh05jAjgD8OL}gFp)`2W(rf8 z#&l*dlex@eJ_}gLA{H}?+00=HOIgNpR)oEPH>V_oaPK?ImdY}aFI(~<_cH2#&vFRlUv;84tKf7eID?T zM?B^UPkF|3UhtAvyygvWdB=M`@R3h^<_ll>#&>@3lVAKMKzz*;kU#_`2toPd|6l$Q z%sDtA2uUbH6Na#aBRmm^NF*W?g{VX$Ix&bzEMgOfxWpqq2}npH5|f0aBqKQ~NJ%PE zlZLdUBRv_&NG39qg{)*FJ2}WnE^?EHyyPQ41t>@%3R8rl6r(sLC`l}a>$Rs8+g{e$qIy0EbEM_x@ zxy)le3s}e^7PEw-V?7(#$R;+kg{^F3J3H9PE_Snrz3gK@hdIJg zj&Yn5oa6upIm9VWbB42=<2)C*$R#dwg{xfSIybnNlG%3lY*3_A~lIfOcK(NmUN^i0~yIg zX0ni#Y-A?~ImtzC@{pH&YE-8N zHK|2y>QI+@)TaRrX+&e1(3EC0rv)u(MQhs7mUgtK10Cr^XS&dpZgi&yJ?TYn`p}nt z^k)DA8N^_QGlG$fVl-nI%MgY#jB$)-0u!0UWTr5cX-sDZGnvI~<}jCe%x3`$S;S(N zu#{yiX9X)+#cI~DmUXOW0~^`IX11`EZER-;JK4o<_OO?I?B@UnImBU(aFk;l=L9D? z#c9rPmUEov0vEZ&Wv+0QYh33BH@U@a?r@iT+~)xgdBkI$@RXOl;x%u0%RAoljOV=I z10VUsXTI>2Z+zzmKl#OP{_vN71W2fV0uqS81R*HF2u=t>5{l4-AuQntPXrvz-t?g_{pimC1~Q1j3}Gn4 z7|sYrGK$fRVJzbq&jcniiOEc1D$|(G3}!Nm+00=s^O(;97P5%NEMY0jSk4MovX*tM zX9FAA#Aa5pnl)@;E8E!44tBDO-Rxm6``FI`4swXY9N{R(IL--9a*ETO;VkDk&jl`W ziOXE!D%ZHq4Q_Ia+uY$U_qfjk9`cCCJmD$Nc+Lx6@`~5I;VtiY&j&v8iO+oDE8qCe z4}S8C-~8b({|Jys{{$oufeAuTf)Sh$gd`N92~Pwf5{bw}Au3@AOE{ttofyO<7O{y# zT;dU*1SBL8iAh3Il98Mgq$CxoNkdxFk)8}>Bomp*LRPYoogCyO7rDtpUhrl%y1;DMMMxQJxA^q!N{>LRG3!of_1n7PYBEUFuPv1~jA*jcGztn$esV zw4@cSX+v8&(uvM=p)1|!PCMGufgbdv7rp62U;5FX0SsgigBik5hB2HGjARs}8N*n{ zF`fxbWD=8^!c?X)of*tz7PFbdT;?&K1uSF{i&?@_ma&`_tYj6dS;Jb^v7QZVWD}d& z!dAAiogM6C7rWWRUiPt{103WKhdIJgj&Yn5oa7XzIm21bah}Uu;VRd-&JAvIfs0(? z7Pq;>UG8z82R!5vk9opVp7ER)yyO+HdBa=Y@tzNShfil%qTqs7NI$Q-!KjqdGOHNiAwqhq~0GJ`HF{BO23$rZl5DEoezATGNKMw4*&8 z=tw6z(}k{dqdPt5NiTZShraZqKLZ%ZAO>(8$u4%Y zhrR4$KL-nQayTG@v0hs7Wmv(U>MQr5Vj>K}%ZEnl`kh9qs8rM>^4&E_9_E z-RVJ3deNIc^ravD8NfgWF_<9?Wf;R5!AM3inlX%J9OIe5L?$trDNJP=)0x3cW-*&N z%w-<)S-?UTv6v++Wf{v^!Ae%Knl-Ft9qZY^MmDjTEo@~Q+u6ZR_Og%t9N-{_ILt0~ zvxg%bfMJ{ofD_rFo*SWz>ZgHDC+~pqkdB8&+@t7w({N*13lIov;1R^j&2ud)56M~S0A~azL zOE|(4frvyRGEs<1G@=uOn8YGB@ku~J5|NlBBqa`UiAOS$lY*3_A~k79OFGh%fsAA# zGg-(=HnNk0oa7=mdB{sX@>76<6rwOiC`vJkQ-YF|qBLbFOF7C@fr?b3GF7NbHL6pC zn$)5;b*M`{>eGORG@>z0Xi77h(}I??qBU)3OFP=rfsS;dGhOIPH@eeEMhTB zSjsY%vx1eZVl``6%R1JxfsJfpGh5ioHny{ao$O*ad)Ui9_H%%P9O5uXILa}ObApqc z;xuPC%Q?<-fs0(?GFQ0DHLi1mo800yceu+v?(>)@JmneBdBIB_@Q_Em;x%u0%RAol zfscIRGhg`1H@@?OpZwxCfB4Hk0wmKv0SQE4f)JEo1SbR`2}Nka5SDO+Cjt?PL}a26 zm1smK1~G|6Y~m1?c*G|G2}wj^l8}^SBqs$aNkwYXkd}0$Cj%MDL}s#(m26}u2RX?_ zZt{?qeB`G91u04~ic^A;l%h0+C`=K`P?mC(rveqJL}jW_m1+=(3WeG z#AU83dBtnq@RoPH=K~-4#Am+nm2Z6K z2S546Z~pL?e*{Rbe*zMSzyu*EAqhoj!Vs2lgeMrm2|)xR5{bw}Au7>`P7Goai`c{= zF7b#@0uqvl#3Ugp$w*ELQj&_)q#-ToNKXbbl8MY@AuHL)P7ZRCi`?WPFZsw%0SZ!x z!W5w>#VAe*N>Yl_l%Xu;C{G0{Qi;k`p(@p=P7P{Oi`vwoF7>ES0~*qZ#x$WR&1g<* z+R&DEw5J0dX+cX`(TUD~-sYy=;GLnhRWFaeQNJ~1hk)0gmBp12KLtgTcp8^!55QQm1QHoKV5|pGA zr71&M%2A#QRHPD>sX|q%QJospq!zWQLtW}op9VCf5shg=Q<~A77PO=lt!YDB+R>g4 zbfgoV=|We!(VZUjq!+#ELtpyQp8*VH5Q7=QP=+y_5sYLMqZz|kCNhc1Okpb1n9exH zGl3b*WEQiT!(8Sup9L&r5sO*EQkJot6|7_xt69TZ*0G)qY-AIg*}_(~v7H_4WEZ>H z!(R5Wp937^5QjO!QI2t(6P)A}r#Zt}&T*a#T;vj$xx!Vhah)67TwNFfSSgrXFqI3*}aDN0j@vXrAd6{tv6 zs!^R9)T9=*sYGR}P=~tIqdpC2NFy54gr+p3IW1^OD_YZrwzQ)?9q33WI@5)&bfY^x z=t(bn(}%wFqdx-}$RGwYgrN*$I3pOzC`L1ev5aFp6PU;(CNqVpOk+ATn8_?=Gl#j% zV?GO5$RZZAgrzKFIV)JnDps?GwX9=38`#JuHnW`_>|__a*~4D8u$67>V?PHt$RQ4M zgrgkeI43yCDNb{Svz+5R7r4kJE^~#eT;n=7xXCSUbBDX!<30~~$Ri%}gr_{?IWKt0 zD_--4x4h#$ANa^8KJ$gIeB(Pm_{lGR^M}9uBS0$s6OcdzCI~?ZMsPw9l2C*u3}FdJ zcp?yyNJJ(IQHe<`ViSkB#3Me@h)xU=kdQ@0trU*qTMsZ3|l2VkW3}q=tc`8tmN>ru_RjEdGYEY9} z)TRz~sYiVp(2zznrU^}HMsr%wl2){)4Q**hdpgjOPIRUVUFk-5deeu#^rJrm7)TF# z(u+Y1W(Y$W#&AY3l2MFi3}YF`cqTBBNla!6Q<=teW-yak%w`UAna6wAZhTiM2TcCeFO>}C&p*~fkkaF9bB<_JeQ#&J$?l2e@K z3}-pVc`k5~OI+p(SGmS@Zg7*k+~YnEc*r9jbBo*D;R#Q9#&cfql2^Ru4R3kJdp_`y zPkiPJU-`y&e(;lD{N@jT`A2}%`X?ZP2uu)y5{%%4AS9s(O&G!wj_^bvB9Vwp6rvK1 z=)@oeQenwWv)U>QayTG@v1k zXiO8D(v0S`pe3znO&i+Mj`nn*Bc13>7rN4o?)0E1z35FJ`qGd73}7IG7|alcGK}Gj zU?ig$%^1cqj`2)jB9oZR6s9tb>C9jzvzW~s=CY7QEM^HyS;lhaF`osjU?r)hZbx46w6?sAX&Jm4XZc+3-?@{H%a;3cnk%^TkGj`w`vBcJ%p7rye1@BH8= zzxd4`{_>9iX*5p|f)b42gdimUBOrkYMQFkhmT-h80uhNsWTFt2XhbIlF^NTN;t-d3 z#3um>Nkn3jkd$O3Cj}`YE-8NHK|2y>QI+@)TaRrX-YGi(}I??qBV_Z zOcUDBmUgtK10Cr^XS&dpZgi&yJ?TYn`p}nt^k)DA8N^_QFqB~oX9Ob|#c0MbmT`<{ z0u!0UWTr5cX-sDZGnvI~<}jCe%x3`$S;S(Nu#{yiX9X)+#cI~DmUXOW0~^`IX11`E zZER-;JK4o<_OO?I?B@UnImBU(bApqc;xuPC%Mp%pjB}jl0vEZ&Wv+0QYh33BH@U@a z?r@iT+~)xgdBkI$@RVmf=LIi$#cSU1mUq1810VUsXTI>2Z+zzmKl#OP{_vN71W2oK z0uqS81R*HF2u=t>5{l4-AuQntPXrvz-t?g_{pimC1~Q1j3}Gn47|v+MFqUzQX95!$!AM3iiOEc1D$|(G z3}!Nm+00=s^O(;97P5%NEMY0jSk4MovWnHLVJ+)e&jvQKiOpBomp*LRPYoogCyO7rDtpUhrl%y1;DNh9|Qi;k`p(UG8z82R!5vk9opVp7ER)yyO+H zdBa=Y@tzNShfil%qTqs7NI$Q-!KjqdGOHNiAwq zhq~0GJ`HF{BO23$rZl5DEoezATGNKMw4*&8=tx(((VZUjq!+#EL}$9thraZqKLZ%Z zAO&aK$t-3whq=sSJ_}gLA{MiRr7UAP zD_F@YR>(8$u4%YhrR4$KLCL?#MRiAHo{ z5R+KMCJu3lM|={HkVGUV2}wyta#E0zRHP;iX-P+VGLVr>WF`w)$w@A9lZU+IBR|>5 zP7VrCkU|uu2t_GIaY|5Y(34*DrVoATM}Gz|kUW_ zxyE&FaFbiy<_>qc$9*2~kVib`2~T;(b6)V0SG?v8Z+XXiKJbxGeC7*Z`NnsC@RPs% zBS1#Y6Ocdz=9l~5{2_>QP=XPh5QHQYp$S7+!V#VbL?jZCi9%GO5uF&sBo?uWLtNq! zp9CZ%5s67cQj(FJ6r>~-sYydx(vhAFWF!-r$wF4Lk)0gmBp12KLtgTcp8^!55QQm1 zQHoKV5|pGAr71&M%2A#QRHPD>sX|q%QJospq!zWQPXij#h{iObDRrnzJ(|&+7PO=l zt!YDB+R>g4bfgoV=|We!(VZUjq!+#ELtpyQp8*VH5Q7=QP=+y_5sYLMqZz|k#xb4= zOk@(1nZi`2F`XIAWEQiT!(8Sup9L&r5sO*EQkJot6|7_xt69TZ*0G)qY-AIg*}_(~ zv7H_4WEZ>H!(I+@h{GJ=D91R?KK65f6P)A}r#Zt}&T*a#T;vj$xx!Vhah)67BqSvn$w@&< z5|EHYq#`wGNJ~1>lYxw6A~RXYN;a~SgPi0dH+jfQKJrt5f)t`KMJP%!ic^A;l%h0c zC`&oYQ-O+9qB2#eN;RregPPQ$Hg%{=J?hhdhBTrvO=wCpn$v=ow4ya_XiGcV(}9k3 zqBC9SN;kUGgP!!FH+|?!Kl(F(fed9B!x_OyMlqT}3}y&p7|S@uGl7XrVlq>h$~2}k zgPF`?HglNEJm#~2g)Cw*OIXS>ma~GDtYS55Sj#%rvw@9lVl!LV$~LyMgPrVRH+$I2 zKK65fgB;>8M>xtcj&p*OoZ>WRILkTCbAgLo;xbpb$~CTYgPYvqHg~woJ?`^>hdkmj z&w0U1Uh$eYyyXc`dB!{5^MQ|i;xk|P$~V6AgP;83H-GrcKLTXdKLH6uV1f{oU<4-w zAqhoj!Vs2lgeL+Ki9}?g5S3^|Ck8QzMQq{_mw3b{0SQS&Vv>-QWF#jADM>|Y(vX&P zq$dLz$wX$dkd00k*TVTw?cl9Zw}WhhHI%2SNul%N6?sYGR} zP?c&_rv^2tMQ!R(mwMEv0S#$HW17&EW;CY-Eont-+R&DEw5J0d=|pF`(3Ngq#cl3zmwVjj0S|e^W1jGoXFTTxFL}jl z-td-pyypWS`NU_w@Re_T=LbLe#c%%bmwyDvqJIJsh`h{PlzDalAq3R04a)TALT=}1ooGLnhRWFafr z$W9J&l8fBrAusvJPXP*2h{6=1D8(pF2})9m(v+brs7?)PQj6Nu zp)U2PPXij#h{iObDa~k33tG~O*0iSs9qB}8y3mz2w51*0=uQuM(u>~op)dXD&j1E8 zh`|hDD8m@e2u3oB(Trg%;~38bCNhc1Okpb1n9dAlGK<;FVJ`ES&jJ>*h{Y^nDa%;S z3Rbd;)vRGH>sZeQHnNG$Y+)a*NyC;V$>M&jTLvh{rtPDbIM$3tsYy*Sz5^?|9D#KJtmr zeBmqK_|6Z0@{8a6;V=IPkX8Q#BoKiKLQsMcoDhU06rl-2Si%vW2t*_jk%>Z7q7j`K z#3UB6i9=lC5uXGkBoT>8LQ;~EoD`%a6{$%>TGEl8%w!=e*~m@~a*~0JWFi;2$wOZ9 zk)Hw-q!5KELQ#rQoD!6z6s0LcS;|qK3RI*Lm8n8is!^R9)T9=*sY6}rQJ)4hq!Ep2 zLQ|U2oEEgC6|HGQTiVf{4s@gwo#{eXy3w5;^rRQP=|f-o(VqbfWDtWH!cc}WoDqy< z6r&l#SjI7)2~1=v)0oZ-W-^P}Oky%qn8RG=F`or2WD$#5!cvy8oE5BO6{}gpTGp|i z4Qyl+o7uuvwy~WZ>|__a*~4D;v7ZARQSF+RHp_FXhlxi$tXrMhOvxeJQJA6 zBqlS3sZ3)!GnmONW;2Jm%ws+aSjZw4vxKEAV>v5W$tqT}hPA9?Jsa4_CN{H$t!!gE zyV=8D_OYJ>9ApPO*~K9abA+QD<2WZc$tg~AhO?aGJQujgB`$M?t6bwcH@L|yZgYpb z+~YnEc*r9j^Mt27<2f&Q$tzy-hPS-qJsKlsTne)EUF{3Aei{S%Nt z1SSYU2}W>25Ry=YCJbQ-M|dI-kw`=)3Q>thbYc*bxWpqq2}npH5)+Hq#32buNk(!~ zkdjoSCJkvxM|v`lkxXPJ3t7oVc5;xDT;wJXdC5n93Q&+j6s8D8DMoQhP?A!VrVM2% zM|mnxkxEpi3RS5_b!t$PTGXZvb*V>v8qknNG^PnnX-0Ee(2`cPrVVXrM|(QZkxq1` z3tj0(cY4s1Ui79v0~p941~Y`A^r0{P7{+i$Fp^P>W(;E)$9N_%kx5Ku3R9WJbY?J< zS-EM^HyS;lf!u##1*W({ju$9gufkxgu73tQR7c6P9nUF>ELd)dc+ z4seh|9Oei|ImU5LaFSD;<_u>!$9XPrkxN|W3Rk(tb#8EzTioUjcX`Mo9`l5!JmWd{ zxX%M#@RC=&<_&Lo$9q2TkxzW)3t#!hcYg4bU;O3|fB8p%9Qr39fe1_xf)b42gdilL z2u&Em5{~dhAR>{7OcbILjp)Q6Cb5W39O4p>_#_}9iAYQml9G(%q#z}!NKG2jl8*Fb zAS0Q`Oct_|jqKzgC%MQ?9`cfp{1m1LMJYycN>Gvl6r>QPC`}p4QjYRepdyv1Ockn9 zjq22(Cbg(d9qLk#`ZS;+jc800n$nEsw4f!eXiXd1(vJ3Ypd+2=Oc%P+jqdcIC%x!R zANtad{tRFsgBZ*ZhBA!dj9?_A7|j^QGLG>~U?P*4%oL_Fjp@u_CbO8$9Og2Q`7B@| zOIgNpR@2{T$#Rhd9g;j&h9S zoZuv-<4@MJfsJfpGk>v# zzuC$*wzGqs>|rna*v|nD@-P3ei{1RkAr5ndqa5QnCpgI|PIHE{oZ~zfxX2|gbA_v1 z<2pCE$t`Ykhr8V4J`Z@vBOddFr#$01FL=XSB8vH#ClZl~!b{J8#cQH^IvUZ5K}=#1 zn>fTJ9`Q*)LK2afBqSvn$w@&0ANx7LLH^}G4snS|UJKW_S_j$lW9`TIlyx=9Tc+DFg^Mt3oC8D_B3y4Hyq7ap6L?;F@iA8MU5SMtw zCjkjbL}HSVlw>3)1u02IYSNIFbfhN(8OcOuvXGT*hLjjsYiVp(2!4P zN;5vCIW1^OBO23$&uB$!KBo;|(3WpmpX95$M#AJTrXQnWfX-sDZGnvI~<}jCe z%x3|=@GHNukVX8?A1r1GOIgNpR}C&p*~fkkaFBobk3$^h2uC@_aZYfOQ=H}uXF11tE^v`cT;>W_xyE&FaFbiy<_>qc z$9*2~kVib`2~T;(b6)V0SG?v8Z;2@3W1mPwCJIrBMs#8jlUT$i4snS`d=ik5L?k8& zNl8X>Qjn5Vq$Uk%Nk@7zkdaJeCJR}4$D0<3|Gyve97HB2@kvT*!vD@Jd`eRy;$zy< zj|nW~FOG7X$X-cG-lGCd=*%#tv7CQ6%VT1DgECTx8hpk#jA0&sa*(UMCb2g#2c@V- zdj>Fx-}#&4+$CxhZ$J5|L{qx*9Wz+TZqD zp#dEj#7`_{8z;F>^ynTVKA;Mp(wz~^Vl{iY$aCVy@R(7I+O(lBevXGT* zyi0a+kds{GCJ+Dnmf(p0eQQv}|Gq>x;(uQ%6cPTDVQ7a>9fsHYzfU1V{O^wv|94i> z^TX>cMQO@VmU5J*0u`x5WvWn>YE-8NHL1l%)TR#M_0}b{>rtNuG^7!YX~HKor5T^n zoEEg?Gg{G_&uPOKgmybZyFFjhfsTAdCpy!Gu5_b2J?P2Td_ymK(}%u%OKA5evW(;Hbfgc&ictU$3p*@Mo{KU^pVJg#@&J1QUi`mR!F7uer z0)F9Fej~IO5!%1=2a8$4QkJot6|7_xt69TZ*6}Cn*}z6Nv6;}`LTLZZR<^O79qi;E zcCnj1>}4POIlw{w3dBtnq@RksKhe%;P8O1HMquOXhCk8QzMQq{_mw3b{ z0SQS&Vv>-QWF#jAu834_p`F^MAuZ`hPX;oQiOggnE7^FL?BpOPxyVf(^5Tlf=N8)e z?fZN{0Y0Q4g(yrBic*Z?l%OP~C`}p4QjYStA}YFtb|qVxDpaK!)u};EYVi@Zsl&(A zr5^QZKtmeQ7+1t6ZlT@OHse#8(}I?KMk`wLIc@lYwzQ)?U($h&d_^Z*5nbFuyQ}R+ zcY4s1ula^v^rjDe`Idh4X8;2k#9)Rn6j#J>x6uC1e$NO-GK$fRVJtuJBjXs)1ST?x z$^696Okpani0N*jJ;Tmq7PFbdT;?&K1^mLV{Ki5S@jHL8m?bP_8Lo&GZlS%>u3|N7 zSj#&8WIY?$$R;-P7hCw7t!!gEJJ^XUVwYQJ@3wo`%RcsVfP?(Ye;nd4M>xtcj&p*O zoZ>WRa7CPR3+?mv0vEZ&Wv+0QYh33BH@U@a?r@iT+~)xgd4wzCiCbttwa<9Y3tsYy z*Sz5^;Sa{|5Q)e{Au7>`P7Goai}2Iq*wBt^;}M?(BqR}uNkUSRk(?ByBo(PiLt4_2 zo(zO`CL7wBZ5FbUjd#gT4sw!<+~grI?~#xEyw3*|;6n-$+J$Xs7qLYtMsZ3|l2VkW z3}q=tc`8tmN>ru_RjEdGLc697?OOIDYEy@gsY^ZT(}0FFqA^YQgr+p(Q<~F)mV|aI z8``by=d|Gq+R~2pd`Sm7@)e!vOc%P+jqdcICtnlVy=-XrwteW!xAdbw0~p941~Y`A z3}ZOo@jW9L$tXq>+GA~K|6qS)9OIe5L?$trpZJ+6Ol2C=nZZnEF`GHeCA8<;&|YAF z;a7fRA&dB(KUmBXma>fHtY9UpSj`&NvX0PRZ$o>7-N+_3^A}tAo2_hPJ3H9PKkQ;R zd)Ui9_H%&H{?~@~fA$cEIl@tnahwyJIL0%9iG=oK8`?kF zpP9l`rZJrv%w!g`nZsP>F`ote!ms?sLKYF)f7sAoY?rWBomp* zLRPZzF4@UJPI8f(Jmlp)@)6qa+tB{N7T`k)Qi#G7p(w>DP6hLjjsYiVp(2zznrU{=A+Rbcee`=f4f|h(nD_Zk8ZTNz= zw4*&=(t(bAMJGDbh0yM1L%X}}K~KKs8+y^3KJ?{V`q7^O3}g_48NyJ8F`Ur;-iG!F zJCae1W(;Hbfgc&icqTBBNlfM^er5_&nZ|TNd!`NTS#~yan9Drovw&atmETy%B7Wx& z7PEwF-b^D zGLn;ml%ygxX-G>t(vyLVWFoY)*wD^uv+*w3$w5wXk()f^Yl_l%Xu;C{G0{Qi;k`p(@p=P7P`j+8^1_u5Ih^F?Fd&eHze^Ml_}g zpU{+Md`fd#(2~z+MQDF+L%WUrg0{4yJzvs+j(kNYI@5)&bfY^x=*ic7LoY(Rj}7g< z_FMYVp8*VH5Q7=QP=+y_@A#e(jARs}8N*mY`$rqv#l1V;tuMCppDw&Ty7_6-}_H|;HMbBDX!<30~~$Ri%}gr_{?IWKt0D_--4(2j`q|Fz$-k%&wbq7seh z#2_ZIh)o>g5|8*KAR&oJOcFvnS@>(4+@>HUsYp#4(vpt!WFRA%$V?Wpl8txCP7ZPs z+PQ6L=dpQtk9_3keLkQ7A5xG)6s8D8DMoQhP?A!VCbY}i&@N}oQ-O+9qB2#eN;Rre zgPPRhBWhEJkEu&N>J!=xZD=>LjcLLsG^H7z(wr8w?r1~% zE8B_AbfGKV=uQuM@-^Ski{A91FW=IS{tRFsp*`4!_7FRiVGQRxzGnm@8O3PEFqR+q zk#US?0u!0UWJ3FA8`@LsRHiYV8O&rBvzfzO<}sfI{KBvN#zGeHJAV+`OKfN_waZw} z3Rbd;)vRGH>-dxPY+xgs*vwyS;cvDQ+S_et@31@hhh6Mu4}00iehzSufBBC?9Oei| zImU5L5Zb3~XrH!cILkTCbAgLo;xbpb$~CTYgPYvqHg~woJwp3|4ef{a5s!JoQ=ajh z7rf*ZuX)2;BBE;$iO57DD$xk-7&f$H+E~OU4snS`d=ik5L?k8&Nl8X>Qjn5Vq$Ula zoz8}KdYgfaWFj+J$VxWeB|ACDNiK4ehrGN;KJxQEppmpX95$M#AJTrXQnWfX-sDZGYRe4Hniv1xy)le z3;2a!`Hh7v;&=XFF-us=GM2M~m8>GP*VxcrYuE87>)F6YHnEw%*uvjzWgFYs!A|~R z7rWU*Xz#P3z26?-Api0ohd9g;j&h9SoZuvq z#cl3zmwVjj0S|e^W1jGoXN2|(8`>}JD_--4w}daUc!x+tCJIrBMs#8jlUT$i4snS` zXeY3tozNyCad?`fBqKQ~NJ%PElZLdUBRv_&NG39qh0xAsL;GEuogCyO7rDtpUfv@g z`FWoYD8Pplq!5KELQz7yxDD+Rwj`w}O&Q8kj`CEXB9*926{=E=>eQenwfKn8u46;{ zV_TPc)TaRrX+&e1@Ci+6#-}u=1uglERma~GDtYS55Sj#&8 zWIY?$NN8`iq5YTL!ryFV8{65zPX1vRyV=8D_OYJ>9OPgA;}D^J#D?}!dyM0p;3TIw z%^A*ej`LjLBA2+#6|QoP>)ar;Z`shkZSQcGd)(&%4|&96p74}sJm&>3dBtnq@Rsm} zgP|SChIV8dg{VX$Ix&bzEMgOfxWpqq2}npH5|f0aBqOv_gy-3mHWjH!Lt4_2o(yCp z6Pd|ERru_RjEdGYEY9}d_-;P@G*6%M|~R5kkD>yL%WIngr+p(Q<~F)mV8DlTJt$= z_=2{yqdi~JfsTZBCmY(GZ5O)IjqdcICtvdoz35FJ`tmLP=+6KKGKj&1_D~zz!|ZUr z<9kLhl2MFi3}g9$9~sAZCNPmnOy(zkCbXy8(4J|rna z*v|nD@-P2!h{GJ=D91R?2~Ki~&^}{B`>Z|3c`k5~OI+p(SGmS@Zg7)Z+~y8{9{I@6`+PtFLc5?1 z?LxLNMJP%!ic^A;l%h0cC`&oYQ-O+9qB2#eN@!QNpu_bU(t!qbfGKV=uQtp`)eE8-`HOC zrVoAjmVWeS00SAsV1_W1VGQRxzGnm@3GLA~w8z-7{J@WlV>}a>$RsB76F)PBsZ3)! zGnmONW)s?TZD`N4^I5@2&^};8`=I@o|2V{9j&PJ?9OnclImKztaF%nN=K>eG zL}*{Jp?%d}<2pCE$t`Ykhr8V4J`Z@vBOddFr#$01F9_{dHnd;cH@qbxwlg9TnJ7dh z8qtYCOkxq6IK(9$@ku~vC$gcPI4ns?MsiY+l2oK74QWY7dNPoaOk^etS;HNAm8eV=s#1;W z)SxD{_=wunA++n-(5`3e(}0FFqA^YQgr+p(Q<~F)mV8DlTJt$=_=3=GXG6Qa{gMuJ zJ37{>Ag zKQfN-g!V)m+LP>Le&T1QFqLUcX9hEw#cbvk=TWo0mZMU+G?d)JD|FDbQ>|rna*v|nD@-P2!h{GHq zw2#@)K5kENl2e@K3}-pVc`k5~OI+p(SGmS@Zg7)Zg!Ua9+IQ_e?(=|$JmN7=c*--L z^MaSW;x%u0OZY~RcZd|$lTmDFN43$2P7Goai`c{=F7b#@0uqvl#3Ugp$w*ELLOYcW z?bJ36X-P+VGLVr>WF`w)$;P{6CkHvnMQ-wtm(b2r zl%y1;DMMMxQJ&DQXhXY_txOfFQjO}=peD8Wh}zWQW9m|m`ZS;+jc810e_}(sscpum zG^YhE`HWVy=5yNc1#M|Zd%mOt9r=n*gmxDj+Ffloy3>Q6e9brXqBni$%eVBSKLZ%Z zAO`P7Goai_nf^ z!W7$8_p8jBqSvn;Vgv>XDMweQj>;omd=K=^fm(-$wWBIV#8Thn~itL zPB_bH!&xqyn>^$toaM9OEWdr94=6x5D`>-6AzPRt6eXM$x8baWElDX#uwx16gITwGG$7Da=$sDg_J^?UXW0wN+i1tiD`BU zj|YJ_;30Sj-Uq(V>)8yJzBw1$=h(-`KJ#=ul;7Xoy7RRV;yIuXd7MI+_dgiLI&fYQzz0C`LmcY({m1>jqN?c$Pz@1@9d4BUxPlwSm; zEsllzz=H@bfqJ&CZ_aP^^xd{JGF;0Q-~t)6SAll?TF@*%uXXgVcl6v-+pdCX=e`-0 zT+3U)ILdEF%Jshk{0T4y?*eO|E&2B%4bTdBfgb?!68JIl z>!3eHegpL9$bSO*OXRPC7LmUWY9s$CXc>7dQB;xN1br6y8=x-opM%zszX|FAwl9_> ze824QTj1Nc-RkJKBhS6u1{#3;9pD6DV;=GB8H;IULWfEP|t+eX?%I8i}FN&r_a#e%gb8B$Z@|H#`j8lqFt?80|(Y?=bFl^ zNlq_&Dr>vK_+ehQAqX<89_nX}ae5kLnvPRfa_kE7pwhPEUJOg;oihGlIbDpMs`}dN zEH2<&UM@JurdF<4dg%u~ZU!FMzn7l}jqDli2@d$?5 zWUV!vU*~M7h4pSa!9UDl%f4|FIt>0-(Gp^)a_zl7=tq;ivMAtv<$!OZ)4!@oHr4Zm zDQwm7DdKbAURyq`!y}0sRH;*|9iPr_KSXi4I(2P7<h@pOvNG%E}^5(xkUwN=je0 z)6-;At85_`6RBpn!V=5VUV2mL8}fnNH(m})V|^`e$=lo8Y4S*)=o~#vP~)4ambE(3 zX@YHI-Wc=brm?axw(+{A4Ww?ae~ZIL%h<>#O)-JD2a<^_N5RBHo0SdU5jp1Bp%bqd zSG^-=4Mx>o*(vUc40l{+rDa5FStGlr7CPO$;Oh3wUtSq=10SW-^sa+@RVc zScR!GTnJ@#+0G0pHlERmn1n3ftfLo!O91~F_^-f!gtk7gb}&&{`>z1ZYbGjdJ8L>?`Bi|mn>CxY znl+lWnKhZUn2FEY%bLqtD}i-@HI=pW8gLz8&19`)jbv?PO}q)P2D0|C=CRhX#<8}s Krm>dY1O5YSu&Db0 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/rakoxen.utc b/gamma_age_v2/rakoxen.utc new file mode 100644 index 0000000000000000000000000000000000000000..b4b7af0440c58cd5a19764e82f177cd01cb728e9 GIT binary patch literal 5178 zcmeH~TazS38HQ6A#KW+QvYt_MVG)pVm_4AVpxe_uGutrCw%xO=2Xx5p%I+?@x~j;^ zn%?#Rc;KKQdZB;83x9%tzz8qZ2rh{57kK3@7x=zaSv?z+yp9%iC;FkoyEcg|{ zuL}N!;9myj{(dbmj-pya1#@*tsW*_ZUA?H(uLFOGWs%r^8?**--1`HcKz=6F-GV%; z3@LRhn2GuODyqlPMg{}4LmLl6xF*yGpg&NSfL{*$Rq*e?+zVfWn8=SpXR#jgW6*lw zuY)%Oe*=6m@Fno0V5SyCRh?K=Cf9Ja#^_ixPpC;MRu|5uwgGVjekH~!vl z`s#o8758@sI)j79`)3>Cz07-T2jV@+`(zjT13EYSNAQ82=ZW#QZ;QSiE7dn6i*Bp5 z6T8Cin|V{YXWms*tvt8JnRH|i50<%AyEcuiTMbvesZBG_mOAw^=bedtH>%4WTZ~+s z`#9ql4c22Obwl`VXX%l3g=so;i=I5{YR8P&)aCOtb>hOfxfv#5!a+H7@{u|=_WW*X z(zQ696o>nk-#APMCQd|A4YD$g2G;MywZ&eN@snwlx9R3+KW@$MTEpIKf}X z1rXNruJW~*|8~czJvGM#&^43H`q&Rm<-YNyGfAs)`sLX7vN-jPm3HZzP5r9+NppS0 zwBhV{n5AXYT`l4ykriY3PL_AGEZRPbgEy7hGmCMVV3nDVN3aJ<5}Qse76~`0cE1%p zTNbN_gm*`_+D?6gUTRS7uFKe?eh8N-0~j&x7ed~xnt&d z8Qij=92aoQ5H)pqJB|9>D97z4$tI<+Zx;1?sr%!!`N~{lZ?zxl_N#?;9XpOwTbHk- zTS-p2U54<{C6#$%HmMiuCuXzL?;=_)6AvChQ_Q*%{{HB z=E!28=lz$CmfB}}G&OEw^#WHQ$4{ncw9&e@1zrl~PnJ3!YxJ&Wc9=U(HP%mq(S~j% zewvk&sm5N*V~jItq;VN8buo**kBjL#d&drQvD-9`@FbWY2Nw5n-GAcnf?xrMbmFJ_ zeqKw}+KhvtGAEzg+}xZ^9?)|$L)+BOb!3a!Rb5S?ac&A<@Y#o@!^2hUh@2V2m1#UT z3H-p%@9K5g+>*o(6J3gE?hwo&l$m=uOw8I-oGQu3ELc0m4uPJ9~RGq(O0Lu0G zYbx-}qijAj{`O!YgHO|=wNNT@oW7>XRY$K`3QY0nHN_I=4ohzAX6Y~-J3QX0ba5E_ z!;!O#Jl{O`@V}S2F}ZvBZ+rr}1>!DdR7dwPN?`QHFJt}#uR)A#PD1?B=0<1q#eeHN zq0^l=`#09}L_T`;O(G{Go>(F3CfMhlD*7#%PwU^H+EYC&7j>(H;D%g{}q g)IMp$7aeFD;#b)&)cB_hZW8_VIK+MQ1hfbJ3)jkeSO5S3 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/rakrods.utc b/gamma_age_v2/rakrods.utc new file mode 100644 index 0000000000000000000000000000000000000000..6575a4e01562185dcd061766d9441daed61642e9 GIT binary patch literal 4791 zcmeH~*?ts76vj&yK?TC5;2w4q#264!QJBnR83Hm0eBRn@1eD<@Z)<>9L*PmG>XN?n3} zU$4}UD1W+NsVS7Zhm@MUN2zPu!6=g*s7Lt^49%*{9~eti=T;FsE_g!lq+rhDpREeM zAo!x-X~A5xe|ARjWx+MUuL-UTZU}A)z9RUl;90@13w}fJn}V+ieoOG%g5MF`68x@U zEx0W>5Zn=L1kVYc7rY=i6ntIqqTonyS8yyi5!@4eLvSiM6Kn&HwAwp_*22R1b-&@bHQH-{!;L5!Cwjf+A+`fH;&h#+=2?0Jo(?} zzvOl52geW46~^ZuhPFU_ZnNX{C=a;04JdE1BWz<)=yi> z;D-e75xiG0V{-xGT#rDv-N286{aPOb`*l1H=2~e_KwKB?Nr>-B8-^G=#&Vx4QK&~0E7VVc<)-Sw5zdX1|}y`Isjjsw$buJ(+YG;zl;*>F}{FmYnpQdliXZK^|C z?G%2+WI-DCY?#D(MN`kao<&hk;w6)2+IOgCHTfB<2_3Mh%J-*L!c3=K-HzOZjea|o zuT(LiT`juizq4UHpS5NT?_XL|hmmkqBk9MThOrZ2F=8!Bm@*BlnpL}9ypxWKs%mUa zn)Z9vEnzxIJmwu{lA1}o6{9V0f83EtXLU@xbHnP?Vofz2Eb4iqDkjjY&2SL^h84lZ z^A)p_kK=z3FOPYN^{nw{!)%RTUeIg&Ssg9baUOi-jJEw$MN?NjhezAk2`f9l>gdwl+5?V_v+-Q2dXjJ7&vuC?Gdew(Z473agZXWaMz zciNC^*KX&%pTwPf@BIVti@o<1xbK3b+tzlg8zG4U+*wOGxcT4dlEVY@uis3GL>Zt%hZ)AD^pdb zs7y_nk}?%N50#)X=v(MJXbR$Sx*L-s{iq-o;}BDVNyx{i3iif$U4R&~i_kRmFZ{Rb AwEzGB literal 0 HcmV?d00001 diff --git a/gamma_age_v2/randomencounters.utp b/gamma_age_v2/randomencounters.utp new file mode 100644 index 0000000000000000000000000000000000000000..35b589c0ec28126177ae6b7a26641953de4bb692 GIT binary patch literal 2411 zcmZ8j>uwx16gITwGIT*PubO}WNY?oIoe6K{AHV7xqqW(NM zebE--gA69P1opFaV{?An&)98CqrkOnfG$x$dl}T)Z-$=L=ao+XtDS!CscqLGv~ypJ zom|W7pvO^vBXX|)P0*hp=HM;RF(y-fJIY|<9Z;K#cRTWX9E|OKaK`3dKLGs@WeNUc zly89l6y+`OpQHRC_%Bhu3BHK(E$}?bAAuK9{utaw`4jLm%D2I*D1Qq6B+8$GI}qFF zD;BjJZ#It9fAAlOrshZ(?(Y`IS?^L1J9erJA z&Q#u%+zIS;QRT|(k*-I2D#UK%%aJb1bN!88V!W4^wT6>LzZdL#r9IcKR;`00>$P)D z<<&T6lmnHuL&1KSm+f+c4zDBqq%lrUf=<_Q>ROLOK_67wcEXEc>AX|MAFZZ~Q>UuF z_Bx9TxX@P%4!Wt8D^^kZL5`b21dbo%7fGW&u=->kmreb2S*;U@_5UZIyVevT87CfD zMELs#Oj*I8`=T(*UIGKP&ysoo1CS&ZUY-mC}u;5 zf$gh8&DJS|u9cs6>{l6RI|lX;>-A$8g|0!!b~{Rc$2!+~*L#&M;B{bmBHi(mO6Pe` z)qa;A1~z2Onb}P9j0g72<~ZYa2J~9HzMdKz*2wjni(zr7>LXN`^`&F^iM?{N+`Bj) z!8Dt!^@j87oDF;7y<1L*4|mwIZ`_yxL;Q8Ngczz^d#{iB(PghJ3PfKA;G5|5uWFo4 z^lWYlTQz*H_}sVGmRE3Z|Kw<2j`mOZZgvNuicQqRq=eh7YFL4|4PvX3G6`syta)r^(*(p&Y5DJVrrimnI9fv^spg9-G;;Ed6#?7HN_uy*bNK zmeY=#NAl2kIV_F!wY($m?(C#V-%O__YjVGok0k5R_-3MIt_jX0^*c1IYcsQ*4Ldk(oQ^y9rSx+x*CoTcV7(Ek36qyWS3vwd;BNtc2U;i~WDxEN z^BW+RFw2rKPWZkCx(*^t6P^jngk#n<;g_&WxFyUIUJ0ubbOS{ABy8RU-2xFF35$fo b+aSUpVUKV}m?OLq)(B^WF~S#N>jCIrFSeoj literal 0 HcmV?d00001 diff --git a/gamma_age_v2/re_common_blkd.ncs b/gamma_age_v2/re_common_blkd.ncs new file mode 100644 index 0000000000000000000000000000000000000000..3d4f851264ee6a8afcfa5a1d26ee3af54f522282 GIT binary patch literal 337 zcmeZs4ps;=)H85mU|b7n#+U}o_t$b(F`1e;9I1weB_E&w@(lM$)~B)|-JV>d(v zD=);{M2I40#{d8S{{R`!7{~ 1) + { + SetLocalInt(OBJECT_SELF, "X2_NUMTIMES_BLOCKED",0); + ClearAllActions(); + } + if(GetAbilityScore(OBJECT_SELF, ABILITY_INTELLIGENCE) >= 5) + { + if(GetIsDoorActionPossible(oDoor, DOOR_ACTION_OPEN) && GetAbilityScore(OBJECT_SELF, ABILITY_INTELLIGENCE) >= 7 ) + { + DoDoorAction(oDoor, DOOR_ACTION_OPEN); + } + } +} + diff --git a/gamma_age_v2/re_common_spawn.ncs b/gamma_age_v2/re_common_spawn.ncs new file mode 100644 index 0000000000000000000000000000000000000000..585015ff55de3fd01b191699905cc71a38d06f4f GIT binary patch literal 142786 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 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/re_commoner0.nss b/gamma_age_v2/re_commoner0.nss new file mode 100644 index 00000000..fe440b87 --- /dev/null +++ b/gamma_age_v2/re_commoner0.nss @@ -0,0 +1,96 @@ +//////////////////////////////////////////////////// +/* +Custom Random Commoner Table for use with the BESIE +Random Encounter Package by Ray Miller +*/ +//////////////////////////////////////////////////// + +void main() +{ +int iVarNum = GetLocalInt(OBJECT_SELF, "re_iVarNum"); +int END; +int iWeight; +int iCounter1; +int iCounter2; +string sChoice; +object oMod = GetModule(); +while(!END) + { + sChoice = ""; + switch(iCounter1) + { +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//DO NOT EDIT ABOVE THIS LINE///////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//CUSTOM ENCOUNTER TABLE BELOW://///////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + case 0:sChoice = "mhuman";// Creature tag goes between the " marks. + iWeight = 10; // This is the number of times this mob should be considered for the likelyhood of appearing. + break; + + case 1:sChoice = "fhuman"; + iWeight = 10; + break; + + case 2:sChoice = "melf"; + iWeight = 8; + break; + + case 3:sChoice = "felf"; + iWeight = 8; + break; + + case 4:sChoice = "mhalfelf"; + iWeight = 8; + break; + + case 5:sChoice = "fhalfelf"; + iWeight = 8; + break; + + case 6:sChoice = "mdwarf"; + iWeight = 6; + break; + + case 7:sChoice = "fhalforc"; + iWeight = 1; + break; + + case 8:sChoice = "mhalfling"; + iWeight = 4; + break; + + case 9:sChoice = "fhalfling"; + iWeight = 4; + break; + + case 10:sChoice = "mgnome"; + iWeight = 3; + break; + + case 11:sChoice = "fgnome"; + iWeight = 2; + break; + + case 12:sChoice = "mhalforc"; + iWeight = 2; + break; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//END OF CUSTOM ENCOUNTER TABLE! DO NOT EDIT BELOW THIS LINE////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + default:END = TRUE; + break; + } + if(GetStringLowerCase(sChoice) != "") + { + for(iCounter2 = 1; iCounter2 <= iWeight; iCounter2++) + { + SetLocalString(oMod, "re_sCreatureList" + IntToString(iVarNum), sChoice); + iVarNum++; + } + } + iCounter1++; + } +SetLocalInt(OBJECT_SELF, "re_iVarNum", iVarNum); +} diff --git a/gamma_age_v2/re_commoner1.ncs b/gamma_age_v2/re_commoner1.ncs new file mode 100644 index 0000000000000000000000000000000000000000..258a4faf2156cab10f66ecce3d4e335216e6770d GIT binary patch literal 2663 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 F{|zl2bZY 0)) + { + sBuild = sBuild + GetSubString(GetTag(OBJECT_SELF), iCounter1, 1); + } + else if(sCustom != "nil") + { + if(sCustom == "b") SetLocalInt(OBJECT_SELF, "re_iBegin", StringToInt(sBuild)); + if(sCustom == "e") SetLocalInt(OBJECT_SELF, "re_iEnd", StringToInt(sBuild)); + sCustom = "nil"; + sBuild = ""; + } + if(GetSubString(GetTag(OBJECT_SELF), iCounter1, 1) == "b" || GetSubString(GetTag(OBJECT_SELF), iCounter1, 1) == "e") + { + sCustom = GetSubString(GetTag(OBJECT_SELF), iCounter1, 1); + } + } + } + SetLocalInt(OBJECT_SELF, "bFirstRun", TRUE); + } + if(GetLocalInt(OBJECT_SELF, "re_iBegin") > 23) SetLocalInt(OBJECT_SELF, "re_iBegin", 23); + if(GetLocalInt(OBJECT_SELF, "re_iEnd") > 23) SetLocalInt(OBJECT_SELF, "re_iEnd", 23); + int iStartTime = GetLocalInt(OBJECT_SELF, "re_iBegin"); + int iStopTime = GetLocalInt(OBJECT_SELF, "re_iEnd"); + if((iStartTime <= iStopTime && (GetTimeHour() >= iStartTime && GetTimeHour() < iStopTime)) + || (iStartTime >= iStopTime && (GetTimeHour() >= iStartTime || GetTimeHour() < iStopTime))) + bTimeIn = TRUE; + else bTimeIn = FALSE; + if(iMaxSpawns < 0)iMaxSpawns = 1; + oAmIASpawn = GetFirstObjectInArea(oArea); + while(GetIsObjectValid(oAmIASpawn)) + { + if(GetIsPC(oAmIASpawn) && !GetLocalInt(GetModule(), "re_" + GetPCPlayerName(oAmIASpawn))) bSpawn = TRUE; + if(GetLocalObject(oAmIASpawn, "re_oRandomEncounterSpawner") == OBJECT_SELF && bTimeIn) + { + iCounterSpawn++; + + //This is so the CleanHouse function doesn't clean up the commoners. + if(GetLocalInt(oAmIASpawn, "re_bRandomEncounter")) DeleteLocalInt(oAmIASpawn, "re_bRandomEncounter"); + + int iShouldIWalk = Random(100) + 1; + if(Random(100) + 1 < GetMaxHitPoints(OBJECT_SELF) && !GetIsInCombat(oAmIASpawn) && !IsInConversation(oAmIASpawn) && !GetIsPC(oAmIASpawn)) + { + ClearAllActions(); + RandomWalk2(GetLocation(OBJECT_SELF), iSpawnRadius, oAmIASpawn); + } + if(!GetIsInCombat(oAmIASpawn) && !IsInConversation(oAmIASpawn) && !GetIsPC(oAmIASpawn)) AssignCommand(oAmIASpawn, ActionDoCommand(DoFacing(oAmIASpawn))); + } + if(GetLocalObject(oAmIASpawn, "re_oRandomEncounterSpawner") == OBJECT_SELF && (!bTimeIn || GetLocalInt(OBJECT_SELF, "re_bDespawn"))) + { + if(!GetIsInCombat(oAmIASpawn) && !IsInConversation(oAmIASpawn) && !GetIsPC(oAmIASpawn)) DestroyObject(oAmIASpawn); + } + oAmIASpawn = GetNextObjectInArea(oArea); + } + if(!bSpawn) SetLocalInt(OBJECT_SELF, "re_bDespawn", TRUE); + else DeleteLocalInt(OBJECT_SELF, "re_bDespawn"); + if(iCounterSpawn < iMaxSpawns && bSpawn && bTimeIn) + { + //This is to prevent a Too Many Instructions error that occurs if more than 23 spawns are generated + //in a single loop. + if(iMaxSpawns - iCounterSpawn > 20) iSpawnAmount = 20; + else iSpawnAmount = iMaxSpawns - iCounterSpawn; + for(iCounter2 = 1; iCounter2 <= iSpawnAmount; iCounter2++) + { + oCreature = RandomEncounter(100.0, OBJECT_SELF, sTemplate, 0, 1, 1, iSpawnRadius, 360); + DelayCommand(2.0, DoFacing(oCreature)); + } + } + if(!GetIsObjectValid(GetLocalObject(GetArea(OBJECT_SELF), "re_oHouseCleaner"))) SetLocalObject(GetArea(OBJECT_SELF), "re_oHouseCleaner", OBJECT_SELF); + if(GetLocalObject(GetArea(OBJECT_SELF), "re_oHouseCleaner") == OBJECT_SELF) CleanHouse(); +} diff --git a/gamma_age_v2/re_custom.ncs b/gamma_age_v2/re_custom.ncs new file mode 100644 index 0000000000000000000000000000000000000000..f02a82960e626e24d5ab1342904e937271c33c5d GIT binary patch literal 1975 zcmchYze|Ea7{{M`?|ik=GN^{kdc$fAqd*F3NN7rf0;d)Og%`@fAK}!{+~3jI+W!y@ z4bl`M)!@(&(cmE1bI-l+t4B6O^cr~G=bq=jcVF;(+4PZ>TU$-;0t9d80Y4!NL;!+z zE?>^p&V(sh0ASrfY8EqgDSha{4F~4y8Z@}~C$Ni`>{Hy~132sTdL57q!ifdkI5;E! zXOe${hyjjWs%n9tv5VDQ9%0N{mP1>kOi{L_QNy8E8s!dcYE&p{BsCgv=%q$Yhc+}C zRFto1H002_Mn@car_oVG#atXOC@wrl-d#t8kXI*{-aJOG5PKcM&_CrSxyPuk?K0Bo zJO8gb{KlXA@I8NYjHXXI=RWC-`=i6IebU+SM+Y8#(kTtm`NMC2SeD2<0COOHF^ego z8XzKzZdS>>hFO|nVz}$kMbpwMVl=}YFxa=5{0=8fOE$BKfiUs{ipnvS0mO^EH2-;Nje5vKr2uEmCiG*;68YWZ*OplQ)R<~FE7=& ARsaA1 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/re_custom.nss b/gamma_age_v2/re_custom.nss new file mode 100644 index 00000000..20f43caf --- /dev/null +++ b/gamma_age_v2/re_custom.nss @@ -0,0 +1,125 @@ +//////////////////////////////////////////////////// +/* +Custom Random Encounter Table for use with the BESIE +Random Encounter Package by Ray Miller +*/ +//////////////////////////////////////////////////// + +void main() +{ + int iVarNum = GetLocalInt(OBJECT_SELF, "iVarNum"); + float fMinCR = GetLocalFloat(OBJECT_SELF, "fMinCR"); + float fMaxCR = GetLocalFloat(OBJECT_SELF, "fMaxCR"); + int iCounter1; + int iCounter2; + int iMaxNum; + int iMinNum; + int iWeight; + float fCR; + string sChoice = "nil"; + object oMod = GetModule(); + while(sChoice != "") + { + sChoice = ""; + switch(iCounter1) + { +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//DO NOT EDIT ABOVE THIS LINE///////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//CUSTOM ENCOUNTER TABLE BELOW://///////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + case 0:sChoice = "";// Creature tag goes between the " marks. + fCR = 0.0; // Set this to the challenge rating of the creature as shown on the creature pallette. + iMinNum = 0; // + iMaxNum = 0; // If these are left at zero then an appropriate number of creatures will be spawned based on the CR. + iWeight = 1; // This is the number of times this mob should be considered for the likelyhood of appearing. + break; + + case 1:sChoice = ""; + fCR = 0.0; + iMinNum = 0; + iMaxNum = 0; + iWeight = 1; + break; + + case 2:sChoice = ""; + fCR = 0.0; + iMinNum = 0; + iMaxNum = 0; + iWeight = 1; + break; + + case 3:sChoice = ""; + fCR = 0.0; + iMinNum = 0; + iMaxNum = 0; + iWeight = 1; + break; + + case 4:sChoice = ""; + fCR = 0.0; + iMinNum = 0; + iMaxNum = 0; + iWeight = 1; + break; + + case 5:sChoice = ""; + fCR = 0.0; + iMinNum = 0; + iMaxNum = 0; + iWeight = 1; + break; + + case 6:sChoice = ""; + fCR = 0.0; + iMinNum = 0; + iMaxNum = 0; + iWeight = 1; + break; + + case 7:sChoice = ""; + fCR = 0.0; + iMinNum = 0; + iMaxNum = 0; + iWeight = 1; + break; + + case 8:sChoice = ""; + fCR = 0.0; + iMinNum = 0; + iMaxNum = 0; + iWeight = 1; + break; + + case 9:sChoice = ""; + fCR = 0.0; + iMinNum = 0; + iMaxNum = 0; + iWeight = 1; + break; + + case 10:sChoice = ""; + iMinNum = 0; + iMaxNum = 0; + iWeight = 1; + fCR = 0.0; + break; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//END OF CUSTOM ENCOUNTER TABLE! DO NOT EDIT BELOW THIS LINE////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + } + if(fCR >= fMinCR && fCR <= fMaxCR && GetStringLowerCase(sChoice) != "") + { + for(iCounter2 = 1; iCounter2 <= iWeight; iCounter2++) + { + SetLocalString(oMod, "sCreatureList" + IntToString(iVarNum), sChoice); + SetLocalInt(oMod, "iMaxNumberOfCreatures" + IntToString(iVarNum), iMaxNum); + SetLocalInt(oMod, "iMinNumberOfCreatures" + IntToString(iVarNum), iMinNum); + iVarNum++; + } + } + iCounter1++; + } +SetLocalInt(OBJECT_SELF, "iVarNum", iVarNum); +} diff --git a/gamma_age_v2/re_custom1.ncs b/gamma_age_v2/re_custom1.ncs new file mode 100644 index 0000000000000000000000000000000000000000..770303f6e2a62c5ed1637baf37155ecec82f9ade GIT binary patch literal 1988 zcmchYJ4*vW5XWb4H<$Q`4^Rt5J&6`Jq9_E5C>YSj2Pjwxa^eLJ^@K}&d;u#9YrlY{ zpTWY?!oo)*qG%y#A!1=6#M#-qGmDDaTmsqbZ)fJeH^=^WIzMO45A^kq0VIz*06!@U zL;{lTyzNhKtO--H1i+wy)GSQ7UVb)$Ljkn6HE8hYD=>?D?kZMz0nWhMvZ{(Ym^7{QKLdpBd5_sK=(9i z2J}{=Nk#dfMpFUZ(P&jbFEv`NsOW9S2Nb*5k@T|duQ;BwytuW#TA=nkhwTw!^eAZA zQ^aJ842rwgSc(`nQ?-^_$%s9Kj6_?a*HEE@HPx%pbrjQe6#G?&AI79J9*>T39h1&x zOgeS(=&*yBbVlOQfs2@Qyl-^K9=|#Je>jsud_CjR55TOjVl-y5t1}SkuF$xoc|$AB z&@saGhAz|6BHCz%70~5#O#aqpOiL!S`U*3OjDy0_T4+SuX`ooRqq({{(#5>**rg5M znRJUKS~#Kl3#=(aQzbXdX@Wk7vd!+4y^Yt|lH<=5!u;aT$yt?*J5b54_y1(= fMinCR && fCR <= fMaxCR && GetStringLowerCase(sChoice) != "") + { + for(iCounter2 = 1; iCounter2 <= iWeight; iCounter2++) + { + SetLocalString(oMod, "sCreatureList" + IntToString(iVarNum), sChoice); + SetLocalInt(oMod, "iMaxNumberOfCreatures" + IntToString(iVarNum), iMaxNum); + SetLocalInt(oMod, "iMinNumberOfCreatures" + IntToString(iVarNum), iMinNum); + iVarNum++; + } + } + iCounter1++; + } +SetLocalInt(OBJECT_SELF, "iVarNum", iVarNum); +} diff --git a/gamma_age_v2/re_cv_commoner.dlg b/gamma_age_v2/re_cv_commoner.dlg new file mode 100644 index 0000000000000000000000000000000000000000..928279c76088ef9c159e521bf850929f0ac018a3 GIT binary patch literal 3624 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 Z6-Z+M_e_)f08XygO#ePiKOfI}{|Pi664(F$ literal 0 HcmV?d00001 diff --git a/gamma_age_v2/re_levspawnerhb.nss b/gamma_age_v2/re_levspawnerhb.nss new file mode 100644 index 00000000..c06ff7dc --- /dev/null +++ b/gamma_age_v2/re_levspawnerhb.nss @@ -0,0 +1,109 @@ +//::///////////////////////////////////////////////////////////////// +//:: FileName re_spawnerhb +//:: Copyright (c) 2001 Bioware Corp. +//::///////////////////////////////////////////////////////////////// +/* +This script is used in the heartbeat of the +BESIE RES tool, part of the BESIE Random +Encounter package by Ray Miller. +*/ +//::///////////////////////////////////////////////////////////////// +//:: Created By: Ray Miller +//:: Created On: 9-2-02 +//::///////////////////////////////////////////////////////////////// +#include "re_rndenc" +void main() +{ +///////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////// +//Set this parameter to FALSE if you wish +//your encounter distances to be constant +int RandomDistance = TRUE; +///////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////// +/* +If you want a PW RES tool to start and stop spawning +creatures at particular game times, set the following variables +to the appropriate times and save the script under a different +name. You could also set the local integers "re_iBegin" and +"re_iEnd" on the spawner externally if you wanted. +*/ +int StartTime = 0; +int StopTime = 0; +/////////////////////////////////////////////////////////// + + float fChanceOfEncounter; + if(StartTime || StopTime) + { + SetLocalInt(OBJECT_SELF, "re_iBegin", StartTime); + SetLocalInt(OBJECT_SELF, "re_iEnd", StopTime); + } + if(GetLocalInt(OBJECT_SELF, "re_iBegin") > 23) SetLocalInt(OBJECT_SELF, "re_iBegin", 23); + if(GetLocalInt(OBJECT_SELF, "re_iEnd") > 23) SetLocalInt(OBJECT_SELF, "re_iEnd", 23); + if(!GetLocalInt(OBJECT_SELF, "re_BESIE")) + { + SetLocalInt(OBJECT_SELF, "re_BESIE", TRUE); + SetLocalString(OBJECT_SELF, "re_ToolType", "PW RES"); + } + if(GetLocalInt(GetModule(), "re_disablePWRES") || GetLocalInt(GetArea(OBJECT_SELF), "re_disablePWRES") || GetLocalInt(OBJECT_SELF, "re_disable")) + { + if(!GetIsObjectValid(GetLocalObject(GetArea(OBJECT_SELF), "re_oHouseCleaner"))) SetLocalObject(GetArea(OBJECT_SELF), "re_oHouseCleaner", OBJECT_SELF); + if(GetLocalObject(GetArea(OBJECT_SELF), "re_oHouseCleaner") == OBJECT_SELF) CleanHouse(); + return; + } + int iStartTime = GetLocalInt(OBJECT_SELF, "re_iBegin"); + int iStopTime = GetLocalInt(OBJECT_SELF, "re_iEnd"); + if((iStartTime <= iStopTime && (GetTimeHour() >= iStartTime && GetTimeHour() < iStopTime)) + || (iStartTime >= iStopTime && (GetTimeHour() >= iStartTime || GetTimeHour() < iStopTime))) + fChanceOfEncounter = IntToFloat(GetMaxHitPoints(OBJECT_SELF)) / 100; + else fChanceOfEncounter = 0.0; + int iFaction; + int iCounterX; + object oEncounterObject; + object oArea = GetArea(OBJECT_SELF); + object oPC = GetFirstPC(); + while(GetIsObjectValid(oPC)) + { + if(GetArea(oPC) == oArea) + { + string sLeader = GetPCPlayerName(GetFactionLeader(oPC)) + GetName(GetFactionLeader(oPC)); + if(!GetLocalInt(OBJECT_SELF, "i" + sLeader)) + { + iFaction++; + SetLocalString(OBJECT_SELF, "sFaction" + IntToString(iFaction), sLeader); + } + SetLocalInt(OBJECT_SELF, "i" + sLeader, GetLocalInt(OBJECT_SELF, "i" + sLeader) + 1); + SetLocalObject(OBJECT_SELF, "o" + sLeader + IntToString(GetLocalInt(OBJECT_SELF, "i" + sLeader)), oPC); + } + oPC = GetNextPC(); + } + if(!GetIsObjectValid(GetLocalObject(GetArea(OBJECT_SELF), "re_oHouseCleaner"))) SetLocalObject(GetArea(OBJECT_SELF), "re_oHouseCleaner", OBJECT_SELF); + if(GetLocalObject(GetArea(OBJECT_SELF), "re_oHouseCleaner") == OBJECT_SELF) CleanHouse(); + if(!iFaction) return; + string sLeader = GetLocalString(OBJECT_SELF, "sFaction" + IntToString(Random(iFaction) + 1)); + int iMember = Random(GetLocalInt(OBJECT_SELF, "i" + sLeader)) + 1; + oEncounterObject = GetLocalObject(OBJECT_SELF, "o" + sLeader + IntToString(iMember)); + for(iCounterX = 1; iCounterX <= iFaction; iCounterX++) + { + DeleteLocalInt(OBJECT_SELF, "i" + GetLocalString(OBJECT_SELF, "sFaction" + IntToString(iCounterX))); + DeleteLocalString(OBJECT_SELF, "sFaction" + IntToString(iCounterX)); + } + string sTemplate = GetTag(OBJECT_SELF); + int iNumberOfParties; + int iMinDistance = RandomDistance; + int iLevel = GetFortitudeSavingThrow(OBJECT_SELF); + int iCheckDistance = GetReflexSavingThrow(OBJECT_SELF); + int iMaxDistance = GetWillSavingThrow(OBJECT_SELF); + + // Return if the resting variable is set by the re_onrest script. + if(GetLocalInt(oEncounterObject, "re_resting")) return; + + if(!iMaxDistance) + { + iMaxDistance = 1; + } + if(GetStringLeft(sTemplate, 3) != "re_") + sTemplate = "random"; + fChanceOfEncounter = IntToFloat(iFaction) * fChanceOfEncounter; + RandomEncounter(fChanceOfEncounter, oEncounterObject, sTemplate, 0, 0, iMinDistance, iMaxDistance, 360, 0, iCheckDistance, iLevel, 0); +} diff --git a/gamma_age_v2/re_mmorpghb.ncs b/gamma_age_v2/re_mmorpghb.ncs new file mode 100644 index 0000000000000000000000000000000000000000..694db21812486dc2f14a90893b2a0397e9e4a758 GIT binary patch literal 51568 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 23) SetLocalInt(OBJECT_SELF, "re_iBegin", 23); + if(GetLocalInt(OBJECT_SELF, "re_iEnd") > 23) SetLocalInt(OBJECT_SELF, "re_iEnd", 23); + if(!GetLocalInt(OBJECT_SELF, "re_BESIE")) + { + SetLocalInt(OBJECT_SELF, "re_BESIE", TRUE); + SetLocalString(OBJECT_SELF, "re_ToolType", "MMORPG Spawner"); + } + if(GetLocalInt(GetModule(), "re_disableMMORPG") || GetLocalInt(GetArea(OBJECT_SELF), "re_disableMMORPG") || GetLocalInt(OBJECT_SELF, "re_disable")) + { + if(!GetIsObjectValid(GetLocalObject(GetArea(OBJECT_SELF), "re_oHouseCleaner"))) SetLocalObject(GetArea(OBJECT_SELF), "re_oHouseCleaner", OBJECT_SELF); + if(GetLocalObject(GetArea(OBJECT_SELF), "re_oHouseCleaner") == OBJECT_SELF) CleanHouse(); + return; + } + int iStartTime = GetLocalInt(OBJECT_SELF, "re_iBegin"); + int iStopTime = GetLocalInt(OBJECT_SELF, "re_iEnd"); + if((iStartTime <= iStopTime && (GetTimeHour() >= iStartTime && GetTimeHour() < iStopTime)) + || (iStartTime >= iStopTime && (GetTimeHour() >= iStartTime || GetTimeHour() < iStopTime))) + bTimeIn = TRUE; + else bTimeIn = FALSE; + string sTemplate; + object oCreature; + object oAmIASpawn; + object oArea = GetArea(OBJECT_SELF); + int iTreasure; + int iType; + int bSpawnOne; + int iCounterPC; + int iCounterParty; + int iCounterSpawn; + int iSpawnRadius = GetFortitudeSavingThrow(OBJECT_SELF) * 5; + int iEncounterLevel = GetReflexSavingThrow(OBJECT_SELF); + int iMaxSpawns = GetWillSavingThrow(OBJECT_SELF); + float fZeroTest; + float fPCFactor; + float fChanceOfSpawn; + float fChallengeFactor; + float fFactor; + if(!iMaxSpawns) return; + if(!iEncounterLevel) + { + oAmIASpawn = GetFirstObjectInArea(oArea); + while(GetIsObjectValid(oAmIASpawn)) + { + if(GetIsPC(oAmIASpawn)) + { + iCounterPC++; + if(GetFactionLeader(oAmIASpawn) == oAmIASpawn) + { + iCounterParty++; + } + iEncounterLevel = iEncounterLevel + GetLevelByPosition(1, oAmIASpawn) + GetLevelByPosition(2, oAmIASpawn) + GetLevelByPosition(3, oAmIASpawn); + if(GetIsObjectValid(GetHenchman(oAmIASpawn))) + { + iEncounterLevel = iEncounterLevel + GetLevelByPosition(1, GetHenchman(oAmIASpawn)) + GetLevelByPosition(2, GetHenchman(oAmIASpawn)) + GetLevelByPosition(3, GetHenchman(oAmIASpawn)); + } + } + oAmIASpawn = GetNextObjectInArea(oArea); + } + if(iCounterParty < 1) iCounterParty = 1; + iEncounterLevel = FloatToInt(IntToFloat(iEncounterLevel) / IntToFloat(iCounterParty)); + } + if(iMaxSpawns < 0)iMaxSpawns = 1; + + //This code was removed in v1.8. I'm not sure why I was doing things this way. + //if(GetStringLeft(GetTag(OBJECT_SELF), 3) == "re_") + // { + sTemplate = GetTag(OBJECT_SELF); + // } + //else + // { + // sTemplate = "random"; + // } + oAmIASpawn = GetFirstObjectInArea(oArea); + while(GetIsObjectValid(oAmIASpawn)) + { + if(GetLocalInt(oAmIASpawn, "re_bRandomEncounter") && GetLocalObject(oAmIASpawn, "re_oRandomEncounterSpawner") == OBJECT_SELF) + { + iCounterSpawn++; + if(!bTimeIn && !GetIsInCombat(oAmIASpawn) && !IsInConversation(oAmIASpawn)) DestroyObject(oAmIASpawn); + if(!iEncounterLevel) SetLocalInt(oAmIASpawn, "re_iRandomEncounterLifeTime", 450); + else SetLocalInt(oAmIASpawn, "re_iRandomEncounterLifeTime", 900); + int iShouldIWalk = Random(100) + 1; + if(Random(100) + 1 < GetMaxHitPoints(OBJECT_SELF) && !GetIsInCombat(oAmIASpawn) && !GetIsPC(oAmIASpawn)) + { + ClearAllActions(); + RandomWalk2(GetLocation(OBJECT_SELF), iSpawnRadius, oAmIASpawn); + } + } + if(GetIsPC(oAmIASpawn) && !GetLocalInt(GetModule(), "re_" + GetPCPlayerName(oAmIASpawn))) bSpawnOne = TRUE; + oAmIASpawn = GetNextObjectInArea(oArea); + } + if(bSpawnOne && bTimeIn && iCounterSpawn < iMaxSpawns) + { + if(iCounterPC > iMaxSpawns / 4) iCounterPC = iMaxSpawns / 4; + //The following two lines were put in place with v1.8 because of some rare div by zero reports. This is + //the only place where this spawner could generate this error. I suspect it has to do with the presence + //of a dm possessed creature, or something of that nature. At any rate, this should eliminate the error. + fZeroTest = (IntToFloat(iMaxSpawns) - ((IntToFloat(iCounterPC) / (IntToFloat(iMaxSpawns) * 0.25)) * IntToFloat(iCounterSpawn))); + if(fZeroTest == 0.0) return; + + fPCFactor = IntToFloat(iMaxSpawns) / fZeroTest; + fChanceOfSpawn = ((100.0 - ((IntToFloat(iCounterSpawn) / IntToFloat(iMaxSpawns)) * 100.0)) * fPCFactor); + oCreature = RandomEncounter(fChanceOfSpawn, OBJECT_SELF, sTemplate, 0, 1, 1, iSpawnRadius, 360, 0, 0, iEncounterLevel, 5); + } + if(!GetIsObjectValid(GetLocalObject(GetArea(OBJECT_SELF), "re_oHouseCleaner"))) SetLocalObject(GetArea(OBJECT_SELF), "re_oHouseCleaner", OBJECT_SELF); + if(GetLocalObject(GetArea(OBJECT_SELF), "re_oHouseCleaner") == OBJECT_SELF) CleanHouse(); +} diff --git a/gamma_age_v2/re_moditemdrop.ncs b/gamma_age_v2/re_moditemdrop.ncs new file mode 100644 index 0000000000000000000000000000000000000000..157fdf47c79a5d8cea0e9248d6907ad8e050b88a GIT binary patch literal 364 zcmeZs4ps;=)H85mU|`IVV*mmU1qLQ&7FGt9Oy7bGRtAPo3_!w|Nr_n=B&)!}3?!Kt z8UO$P|AT==ngK}vkp;v>3r|n+w*@2y_Kcl1ov3K|yMYXGv-<%pRaZb7mmH3(*R;8OY^>aNmF& xA_6p;fgd990xlo`5qJU@5QGRkfC~sQh$sN9<;($ literal 0 HcmV?d00001 diff --git a/gamma_age_v2/re_moditemdrop.nss b/gamma_age_v2/re_moditemdrop.nss new file mode 100644 index 00000000..9bc12968 --- /dev/null +++ b/gamma_age_v2/re_moditemdrop.nss @@ -0,0 +1,38 @@ +//::////////////////////////////////////////////// +//:: FileName re_moditemdrop.nss +//:: Copyright (c) 2002 Ray Miller +//::////////////////////////////////////////////// +/* +Note: This script goes on the Item Unacquired +handler for the module object and is used to +stamp dropped items with a local time variable +for use with the "CleanHouse()" function of the +BESIE Random Encounter Package by Ray Miller. +*/ +//::////////////////////////////////////////////// +//:: Created By: Ray Miller +//:: Created On: 7/6/2002 +//::////////////////////////////////////////////// +void main() +{ + int iMph; + if(!GetLocalInt(GetModule(), "iMph")) + { + iMph = 2; + } + else + { + iMph = GetLocalInt(GetModule(), "iMph"); + } + int iMin = 60; + int iHr = iMin * iMph; + int iDay = iHr * 24; + int iMth = iDay * 28; + int iYr = iMth * 12; + object oAmIDroppedLoot = GetModuleItemLost(); + if(GetIsObjectValid(oAmIDroppedLoot)) + { + SetLocalInt(oAmIDroppedLoot, "bDroppedItem", TRUE); + SetLocalInt(oAmIDroppedLoot, "iDropTime", (GetCalendarYear() * iYr) + (GetCalendarMonth() * iMth) + (GetCalendarDay()* iDay) + (GetTimeHour()* iHr) + (GetTimeMinute() * iMin) + GetTimeSecond()); + } +} diff --git a/gamma_age_v2/re_modulehb.ncs b/gamma_age_v2/re_modulehb.ncs new file mode 100644 index 0000000000000000000000000000000000000000..d7f7a2b9563366d0d95ac8840da1e0649c812edf GIT binary patch literal 1846 zcmb7F&ubG=5T5t4Ns5ha)LN=-b(>m*w3bSwf_RYBpP)UM;;l;BtTotVLu@Jj6CMO_ z{sDq#!Gi}6fvoi(v*6GQq zJW+D`81bjer7Yp!zHxF%C*q_}P)zOY?EE1oPLx&0P28i9Yd|Tp{)?PJGI1Q1u6uX< ztN!W(Z)VvmR=qmHIf4V>FfqM{Vtn5VtzAbpKUPB!a3bo=|HGq&V1!`g%Ju^>f8FkTxA(wv>SD literal 0 HcmV?d00001 diff --git a/gamma_age_v2/re_modulehb.nss b/gamma_age_v2/re_modulehb.nss new file mode 100644 index 00000000..bb1a8434 --- /dev/null +++ b/gamma_age_v2/re_modulehb.nss @@ -0,0 +1,30 @@ +//:://///////////////////////////////////////////// +//:: Name re_modheartbeat.nss +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* +This script is part of the BESIE Random Encounter +System by Ray Miller. It is meant to be placed in +the Module OnHeartbeat Handler. It is used to run +the CleanHouse() function on all areas in which PCs +currently reside. +*/ +//::////////////////////////////////////////////// +//:: Created By: Ray Miller +//:: Created On: 1-6-03 +//::////////////////////////////////////////////// +#include "re_rndenc" +void main() +{ +object oArea; +object oPC = GetFirstPC(); +while(GetIsObjectValid(oPC)) + { + oArea = GetArea(oPC); + if(!GetIsObjectValid(GetLocalObject(oArea, "re_oHouseCleaner"))) + { + CleanHouse(FALSE, oArea); + } + oPC = GetNextPC(); + } +} diff --git a/gamma_age_v2/re_onactivate.ncs b/gamma_age_v2/re_onactivate.ncs new file mode 100644 index 0000000000000000000000000000000000000000..6cd67dff7ca55deaecdcdbff0a1b06f38808ec8e GIT binary patch literal 119 zcmeZs4ps;=)H85mU|=Yh0}>1z3Jk0ajN5?(!wNE}6tP6B%9@qd)u$02GEOXE{;00aA?po1}G*O3SBltt`3>!YNo=lzm z6JwOEg14Y=R1DFKt}Nz+Q9O^<>29AK9bcSU#tAvX3v?UkEkufb6ljS8Q91*4c;Q?n x?kN!&v#Ajh&ICvhX({VG&CR4^E@2Uip_2w954+xiv7x+R?4gAaszTWSCR literal 0 HcmV?d00001 diff --git a/gamma_age_v2/re_oncliententer.nss b/gamma_age_v2/re_oncliententer.nss new file mode 100644 index 00000000..1deca92d --- /dev/null +++ b/gamma_age_v2/re_oncliententer.nss @@ -0,0 +1,31 @@ +//:://///////////////////////////////////////////// +//:: FileName re_oncliententer.nss +//::////////////////////////////////////////////// +/* +This is part of the BESIE Random Encounter System. +It is intended to be placed in the module +OnClientEnter handler. Its purpose is to set a +local int on the DM so the he does not produce +random encounters when possessing an NPC. +*/ +//::////////////////////////////////////////////// +//:: Created By: Ray Miller +//:: Created On: 10/14/02 +//::////////////////////////////////////////////// +void main() +{ +object oPC = GetEnteringObject(); +int bBESIEWidget; +if(GetIsDM(oPC)) + { + SetLocalInt(GetModule(), "re_" + GetPCPlayerName(oPC), TRUE); + object oItem = GetFirstItemInInventory(oPC); + while(GetIsObjectValid(oItem)) + { + if(GetTag(oItem) == "BESIEWidget") bBESIEWidget = TRUE; + oItem = GetNextItemInInventory(oPC); + } + if(!bBESIEWidget) CreateItemOnObject("besiewidget", oPC); + } +else DeleteLocalInt(GetModule(), "re_" + GetName(oPC)); +} diff --git a/gamma_age_v2/re_onload.ncs b/gamma_age_v2/re_onload.ncs new file mode 100644 index 0000000000000000000000000000000000000000..9323577009ac65c9f273507d8281901efc2490a8 GIT binary patch literal 504 zcmZvYJx{|h5QZ-#6%|5!%t$CRNT^JR6~lm3sMJQRC~+_3MCwM4GnC)OkLkd`z`($O z5JR`rcC8YWdN|p4kDu4_JsX7&=V!eu0B>;&dUZoM0lV8dg%ASYG+Q;Woh@5mgAVLT zeB}6)(WIyn)w6xiRy~BDl~AkQpac8*LUJoeQJm8Yj(xAL>t8VRg>MfF2%MO%DNTu2 zxtg^xeaB%5n~IXgDA}-$eOv5Mr"), 4, TRUE, "re_ceghimpubt0", 180, 2, 4, FALSE, 20); +} diff --git a/gamma_age_v2/re_onrest.ncs b/gamma_age_v2/re_onrest.ncs new file mode 100644 index 0000000000000000000000000000000000000000..8530d151d58638f9ca9e90158f9a050bedfd17e3 GIT binary patch literal 2774 zcmb_e&u<$=6n?W_yJ-@dG#IB+n=)+=l$KUS5vq`os4xg21u8XZ0D+1ecO9>Y*U@^7 z2&W$SFZd5Q_0R(c4jef2fCNYg`H({nRq2641RN?9DgEZX8GFa;!T}sOW-&z7Dy)|V&kfT=(D$na-ntly>cCkf91n;LDt!!(!@RdeqlzXv?t z1F>Ui^hqrP`wC*4e^ za8b9qscvA_j#4oK^Pv8*s-82%bi3P6d%Akg86JJB=}w&Vv#6)LExp<3L^^|Bmo4-g zV@7=zyfkmz#BYWDeU^zKr|78Cl33sJft7$&**7SaKoyP?Y)nH`!!%AdnZx%Czltvu?a$ao8^@0EuR?26d1##K=d!)tp)LCLW+IaL{8 z&qIYznrQJ%^^79`ZBSmeB57CRH8r;RD{nIuE9Q56ICyBGTu@!$2-DbBin98@ltxCf1_+J}d5KL-#6L>ID3D-c5S(?I^9^D1vu$;N!5|tEW*T>!;CLV`EGDr!aX%nC#{7 zvxdn^+=_;+)+7BO2X#HNNZ?TpWeCJ?CCzR>$)a>^XFE^8O7VLRZwMIgT3c~5E1KTV zLAk%w+l{0dT~EyQP=up*4n=0mE7w=+?Wp-_5sE?(D1REzd5+ST_SU@1l|0Lcf#BpC zN9h-{j!j74zAEhp)}In*4~B__jYrsnK?T5`5?evOD(6C4Ad6A;%pqO?dGYkVBkK0J z36b=WNF{rmA43m>`~+xn^gJN4-dXeF=0FmSQB$y&`-|A*oEg=>-&?r)U*kBTp}Ba~ zh8>c>pBS5;8k^77O!I$6E-^%yr^jT95Y;qa4s)`ANZ5sWS%B(x;kYb7X1lOJRqePj xZ&%U}a%uR;rJ+MIXY>E$x^!xjbLK(|c*$CHi>3S`B;aFQbv@19&P{t literal 0 HcmV?d00001 diff --git a/gamma_age_v2/re_onrest.nss b/gamma_age_v2/re_onrest.nss new file mode 100644 index 00000000..b5f5678b --- /dev/null +++ b/gamma_age_v2/re_onrest.nss @@ -0,0 +1,92 @@ +//:://///////////////////////////////////////////// +//:: FileName re_onrest.nss +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* +If placed in the module OnPlayerRest handler, this +script will generate a chance of a random encounter +whenever a player rests. All of the parameters of +this encounter are determined by the Random Encouter +Properties placed on the Area object in which the +player is resting, as set by the SetRndEncProperties() +function. If no properties are set on the Area Object +then the Module Object will be used. If none are set +on the Module Object, the module object will be set +with defaults and they will be used. + +To make an area safe for resting encounters use 0 +for the iChanceOnRest Property of the +SetRndEncProperties() function. +*/ +//::////////////////////////////////////////////// +//:: Created By: Ray Miller +//:: Created On: 1/6/03 +//::////////////////////////////////////////////// +#include "re_rndenc" +int GetTotalLevels(object oPC = OBJECT_SELF) +{ +int iLevel = GetLevelByPosition(1, oPC) + GetLevelByPosition(2, oPC) + GetLevelByPosition(3, oPC); +return iLevel; +} + +void main() +{ +////////////////////////////////////////////////// +//This should be set to the number of seconds that +//players have to wait between rests. +int iRestPeriod = 480 +;///////////////////////////////////////////////// +//Set this to false to disable the darkness effect +//when a PC rests. +int iDark = TRUE +;///////////////////////////////////////////////// + +object oPC = GetLastPCRested(); +object oArea = GetArea(oPC); +struct RndEncProperties strProps = GetRndEncProperties(oArea); +if(!strProps.bInitialized) strProps = GetRndEncProperties(GetModule()); +if(!strProps.bInitialized) + { + SetRndEncProperties(GetModule()); + strProps = GetRndEncProperties(GetModule()); + } +if(GetLastRestEventType() == REST_EVENTTYPE_REST_STARTED) + { + int iTimeSinceRest = GetTimeInSeconds() - GetLocalInt(oPC, "re_iLastRestTime"); + if(iTimeSinceRest < iRestPeriod) + { + int iMph; + if(!GetLocalInt(GetModule(), "re_iMph")) iMph = 2; + else iMph = GetLocalInt(GetModule(), "re_iMph"); + int iTimeLeft = iRestPeriod - iTimeSinceRest; + int iInGameHours = iTimeLeft / 120; + int iInGameMinutes = (iTimeLeft - (iInGameHours * 120)) / iMph; + SendMessageToPC(oPC, "You may not rest for another " + IntToString(iInGameHours) + " hours " + IntToString(iInGameMinutes) + " minutes of game time."); + AssignCommand(oPC, ClearAllActions()); + } + else + { + SetLocalInt(oPC, "re_resting", TRUE); + SetLocalInt(oPC, "re_iLastRestTime", GetTimeInSeconds()); + + //Apply visual effects to resting PC + ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_SLEEP), oPC); + if(iDark) ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBlindness(), oPC, 7.0 + IntToFloat(GetTotalLevels(oPC)) / 2.5); + + float fDelay = IntToFloat(Random(8 + FloatToInt(IntToFloat(GetTotalLevels(oPC)) / 2.5))+1); + DelayCommand(fDelay, ExecuteScript("re_or", oPC)); + } + } +else + { + DeleteLocalInt(oPC, "re_resting"); + effect eEffect = GetFirstEffect(oPC); + while(GetIsEffectValid(eEffect)) + { + if(GetEffectType(eEffect) == EFFECT_TYPE_BLINDNESS && GetEffectCreator(eEffect) == GetModule()) RemoveEffect(oPC, eEffect); + if(GetEffectType(eEffect) == VFX_IMP_SLEEP && GetEffectCreator(eEffect) == GetModule()) RemoveEffect(oPC, eEffect); + eEffect = GetNextEffect(oPC); + } + } +} + diff --git a/gamma_age_v2/re_onunacquire.ncs b/gamma_age_v2/re_onunacquire.ncs new file mode 100644 index 0000000000000000000000000000000000000000..b57def899170c4a922dfdc9c5b248df3faa9fda0 GIT binary patch literal 376 zcmeZs4ps;=)H85mU|_6}V*mmU1qLQ&7FGuKqSW|I-+~NQ28K@zK*E?wiCG?`K!JrB zNHQ@p{{R2~2Lp>V1CahB3zE^+Wx%QtRVi4z4Kqml9|jgM{e^)=OaUeWmX|=|%b@Xj z#1vQ=7*!Zxnt%?}Vgx&HF<3t%&>{RlA0)XH>$Sop3(;4_70x#eK0uX^GZ~;Mxzyr8|5QB&U&}JS`*nw;g$;?efu@)R!PZSsc DDe7b| literal 0 HcmV?d00001 diff --git a/gamma_age_v2/re_onunacquire.nss b/gamma_age_v2/re_onunacquire.nss new file mode 100644 index 00000000..a38ea92b --- /dev/null +++ b/gamma_age_v2/re_onunacquire.nss @@ -0,0 +1,38 @@ +//::////////////////////////////////////////////// +//:: FileName re_moditemdrop.nss +//:: Copyright (c) 2002 Ray Miller +//::////////////////////////////////////////////// +/* +Note: This script goes in the OnUnAcquired +handler for the module object and is used to +stamp dropped items with a local time variable +for use with the "CleanHouse()" function of the +BESIE Random Encounter Package by Ray Miller. +*/ +//::////////////////////////////////////////////// +//:: Created By: Ray Miller +//:: Created On: 7/6/2002 +//::////////////////////////////////////////////// +void main() +{ + int iMph; + if(!GetLocalInt(GetModule(), "re_iMph")) + { + iMph = 2; + } + else + { + iMph = GetLocalInt(GetModule(), "re_iMph"); + } + int iMin = 60; + int iHr = iMin * iMph; + int iDay = iHr * 24; + int iMth = iDay * 28; + int iYr = iMth * 12; + object oAmIDroppedLoot = GetModuleItemLost(); + if(GetIsObjectValid(oAmIDroppedLoot)) + { + SetLocalInt(oAmIDroppedLoot, "re_bDroppedItem", TRUE); + SetLocalInt(oAmIDroppedLoot, "re_iDropTime", (GetCalendarYear() * iYr) + (GetCalendarMonth() * iMth) + (GetCalendarDay()* iDay) + (GetTimeHour()* iHr) + (GetTimeMinute() * iMin) + GetTimeSecond()); + } +} diff --git a/gamma_age_v2/re_or.ncs b/gamma_age_v2/re_or.ncs new file mode 100644 index 0000000000000000000000000000000000000000..6a7b4429fc8a9948fcac51201fbf296078a7dcda GIT binary patch literal 47746 zcmd^o4SZbHaqqo%KlNz=#<&>68e=|848k^_v9VUtT3Re=mDS3!3Bkzr+7_`TSC+w{ zY3d~O!TUYhI%%2*Elrf~G^H*1D35%Q_@yM_wd9qT=OiW}sgqK08ix`B#UaLeGjryw z?%XqLul)Eu-mk##CwXVj|IC~@bLPy&!ekOt#{cnHM zCu;n-7e_9^?eyuO7e7CST|tiu0yw=uLIvGEGJnv!c%BEp4@SUyiM2;RXNUeBr+)|Z z^9vw%GYn=^dF!^39Xoe#oMod-I?hN{q(od_g{#x#lz^M8KuiGyu)pLFw%Hq$Jpqukb7_WMu)K4>fJUt~<63k8Ua#MvLIy+~zNanp4j` zg@KN3Zl9g4YPf9j6Oi`RpwbV zgAd#+I>VwFXaSm4nOoEHTEiDq3oYGQ72UynK_fAr;(M5NW~a=gXbGmo?BpDZMqr=N zNS{5?5Uk$zCg#mHGP99EJx6CCyza?4ymqU8YU+3+>_)g57(t%&kwfq<5aV>T-op0H zJ!6}OCq~9b2g=4MVZzu6kuY~wETePJruAlJy#X&rd=09rz_59Y**k3E5GCOB36b-GiYypqT z+)^4JzOB5yb7a>9I)>0tmYZ<_VD^F&G&ah-#wfE^&7Yt@qeo``1WoHRev{GU$uFu>Kx#?Lz2m z-o;`NW?0pSl6@>Rly^slLJ2@O4CDnbFy;%aY^Dce*P>RldN^47v|WqbI2zN~#xy=K zRbaIeH@W2a@aX2T9SsY~u9gAC4RuH?_`xwO%nqA}7VTJn0X>N*$1Fh14Tw{QX4OQx zV5T8IavAv%6-#DSX$>6QIMcG>fha+gneSyL$qnb=KIa!EuZEu_qA@@56WYb2|HtFk zUm7$93DR%LbH0c6N&KI_zku|QNfqkCPba+K0^{l0tSYEoC$(eS{vZsgvO_>SXNO?T z4q7O*I0JTsu}Vfz*m!H11O3g^^G&eBP;2VWyUtkNc6I{W%%p&Diz332wQf35|J$g4 z4?TW`i5bmRX3jHqpy+-4k1sI`-zer*Gb>($*;~Q0k;$Azq5_cYvGII%}*;cF;e^SK6 zaxXroGOg6b+{ov1BA*-0=i{($seOI3iKUDH^(esc16Ba!QE3SVL{qo`OxQOo*gq}f z0;a$+2ngM@7|8V`>?E*^uiEc#<6m6C(tn-5K<00w?X4U@Y!0#OT3<@Rg z6&FU-BitH(i`LMJS|1i%Ju+!^8bG%p1Gf#42ZlwYiiKb^kqYH;kO~&bvVhl9i_(PF zkzZ$m5YzEsWtjkYo!Kh?(eeV)XUyz(L>4hAf{UVWMfZSSkfW1%7EWq0VhvRSpXokt zeogv3PJ{B+nxzHYLesc-T93y;{b+aoHnt`z)A`##9CB~Z82mlcc=%!uFDIiaOzga$ zkiL#TP0D`8pKUCv0;8etV@o*1jllSzvpEZ9FCdK=GIKps>EJk+46PAs`6~$rhDC-1 zzeD4KPaqbHzt?_+?%3-z;$wHz0jR+KJ~KlMAnzds(64A8*mmkp>i$`yos#VySjyri z&jRN+>j(;Jh{rpYdmbz4?h2ZsD_V-{Dm1-EFjgAMDu^a%_9F8o`wZw?*)fT74J$Ne zCg1p50%>OVtTGP{s(>WhZNq3XX;t6PlzrvPiT51Y{1 zfKyLPgfY0p7!zq|H(A!E6Y3h!&}1VjfcL_8T9%3i&63!G7GP4IF}utC5G@!#cW+p~ z>@;KoLue3U5qhvoj3~qvc4O#q6`D99Fq&&vn4*n7cqr8HsM?VB&8w&<=p8zFv)S2V zXHp!)+voM9Tl_HXVy8fS$P4yXs(BgniAMcS+miHuF6$o<@>?3!Uh3z*`~GwegfdWF zf*07%w_|3K)usziK4sm&N0&&skw|q001`4S^I=nGBN#qA`$yflj}7nxowM zqu5%S3auW{ALrqrI?ZwLC1g@@G?aQgmBl*UuBDyX5}Y;dg0m*-JVO#+8Q?55nryyw zvbH4k$E^vSu(jV{5@s{{Zi^w-Jv=_>37EgxH!-yT$71luci2;MXpuU7KAwgr`Zc>?2~pJv=)?b5XPAbBcWq|#Sb0}wbZjECV|ZfI zw#>w~a%SW9-Q}I*Bcl_Uu`QY5%x!Rty*aaq4{$SMR4rKmaEeSw4A_N1f?rZj!kZB9 zl?&*5Fk1X=_5}Yn6N27`rEDnh*cQ+OhgxexB#sQsW>tv{OiBb}rIs{i=ytj!1C;4W zp88nGL_rj2w#+Ov^P$zBKBqbkL!s6lntt+a(?}HFOi?7wlDh~vMNZo$fYDrVNh7@@ zqkX$~Y%Gr#wsf!-cahx2H~gaTq4@6^kq^up7BZs2BSYSW4uEp^Ewf;+NRDo zC9C_{ykNw8GCdbIvuqYk?2QgucoOg1=9`)j?OpTu{|m&+x8^h#?uv+e~8svw^{J)f!;53ZG!^6sK}%kft#_ zkuhhv0E&%{Y!4E6&|*|WM=oaO4#G^uv-`jp7m$NI+kB$A1|A`804HF-(nK*}8RjeM z(A*C+*0Ks?;q<1l9XrNg$#B%P5@`M%G$W=JXLD(j%}trG<$9QQVk~<%=OdxsV@o#= zn~q~WI6Bas+ckJ@BATvOVhn@*8wCKWfkMZg^61tHbHVFH9AEHFT&IUC`!{uQj3d(} z^a-W`8Yba7RS^U3r2SAHp>zGM`UO)SRkc(hxb$(flrAvf{{i}_02&8(K!qWJ7l1T?8WHm z#NonMkf*&tW=3WJ)dB_qc;109fDF!|_Gh!m(op3+7j8X46QbtB8@P$AZ zl+IBqXbe7tgGU>(F1Islf5URB9*}-xx>W$tCyb7U^DqzRF&fT78qQJk)2s?=1-25J zL@;gY%&b0}WTp-iz^oDgP!qGzOgcGgmS@V?G0X}IVRDAl`>8cd4*kYSCwJYDS%kL! z13`t#AyHoy)WA@KO7u@XK(QFx2076dN{B?=DyRvj{%1i=GW9P7HO16#3u>CFrc`W4 zQD>+zvra6vo~dRQEwzEECK|NVMy8r8vXO*L1alB>K)Hk%DJzFYu=GGPli)3jBt);=1 z)5DcUJ_r+~N1IiYr8LS30;uD()=6HGy7MTg5m7Y*T^3j|Iaa zWePowA%yR+NrTnoN~K(}BikR9vu#p^jR8#Bj4NoHio7y9LdV$jsrQcounr{cE)5-r;B{Iy|hXSTQ|*OzmI&F)pPXNR$C z5tuExSam`?od2lI&Xi>D)%bcJ1#BZ|cCfcSSL`0_SravatU6ZjR>lqGdwL2(`2ojx zvYyIsDd5az8FEh0)X;=;@{*x#61*Y#zXM*psj@4Xc$(<2v(sno|n9QyQ> z-6J`!DiYP~oOqGE@`ytZ-20{PU}nxupz-cqOA=H{z6b~NbpTTwIRX3 z2r7pJ@r0mqND#kBP;E#c<+UNfM$y)W1ivS!HYE74pxTh&tAc7nf*%U%91avrz1eE# zEJIDq7j5SKb}9PzR1ls#)+4Bx z?dr(71JY6Wqz=wDs;`vqQucXOf5B=N@rG>Ipdz9^uG0XNL=kHh&;KVtpuT(Z1$Vuu zO#BA`f_muB_LaKb@c>BKqy5`>Jnh*|MG32PP?n`@FDNR|A6iXa0lvXvqL<6Gy+Gk3 z8WX*2p4l;WR!f;Aao0&=qD`hulE{UEEnsZIFqki_+tQ3cbQp>@MLi{9imz3ICx5Zn zENwkSX7(IB`P)TX4xW4&qHyr!|CMOV!IS?#1(ky*|2aXm^^|5owe^(C1eJrQpdhFm zJOw)im4m0?gM!MzQy^<396SY2VbB2274Y7eE$Jy-wqIL^!QTT8eNxxh_I4jq2Dw{0;||QF+}ADD*I0u(S2#2F!~FLP?6A&;!Y)KH5vUcF$%KNLYIO9T@!!dnEX2#HPDTFPNyTGs(ZhW2L}2WC>8n~*O_fo znPC;90TO6{<$7CNojerYG@;1o9RgU(=@33) zb-AH?u*;S9(<&6JSRrYhdIUbFrEq+MdF)r7rxmYw>{qsh9BVBeJH6*59(%L#*lBts zm6bnJkDdB8$y?21o6*=*$fmoqg;%rb?$v^7)7`fUs!ex)S5R%b`w>C4>FzfK)q3p1 zf@;&8?!LZMyr2XlpCr|0Jk3-K{*tK$B|I-HSzA zo9^}rs!eyzMH(xwO?U4VZEd$#$&Ke2VJ* z;=ckU26KcQ)PlL}Et+eHql;#iUBz6kPh+Vg_X3hqiXs3zHQY{>WA`-2q3(Q1l~wiC zaSW=ZdK`D1)obGi04dbt0{3ac#{O)YC99`aTz*ug)?@^G)GpCi`=Wp8vNTd zlC8%*I#9Qj;BNsb)Z+rxvxDHB(=1s%wIbUA8CH*rQ#a3`o<;4>LM@<})yz&^A^!gY zAXc3L1fj@4cUCpo2Q|(5esmJqtuOZWp};k(U4v;@%}jq?JBy7wQ5G*r=w6<-8FLE5rqzQy9Ek$ZF_I95anf4KUPANmv5h8 zh?4yLNkWve2~m>29qM?dAxhF5RaXm9-Xk_On^b;CP;FBA6+yL0<&Ol_CY8qp)rKgQ z;}RN>4N3LVL@pP@YB9o~$P87w9>OLQQgV_ybOFB$dNbrXM!}24t ziw;cp&B0rl6X*kWKDW?`H|Sh_1Q!4dcUsbi4&12${htHSYGfw3&oe{RNEJzMQ5oI= zK&)lJ0M!Il-(@>lOd6kxYgM^50uJp2XF!FuX)y1*%#KE<;#79tpEJ9B-`asvR@spE ztL(M_3>OZua|}hbt=DB^n@8>fYJ>@XT7_;Q(&6&|lVjvx8=tA{Zogg;+JtIJz*8Ge zvb$~Nn`QGu9nW}oJ46brw!8hc@V<6;dt6ZM?sh~_Z35mTs5Sv#BB*wElZmI@-FAq! zc6Yl+Q0?yaprG2_?SP=#-R&howF&syf@*iSm4a$_w_60&?r!fARJ*&$;)31X{!X;D zyW7)(Y7=m|!`cM=QrrpSZ{g($7liUow5!)cY(6B0AXH^oI1Mmxz!50{hA&Fj6@{T<*6gffNX#Q?AX@v^2V`UyPSz@Q5jwaFg!{| zQG2sp`gH&`N%n1t#X^-qPHH@<3XXez1?Y}Z2fiDG#qFk4EV!1bCw_h}V2~MMXfhnl zc&e1M0f+$x0o7X)szyD$%Zb)WxS{-wwXyT)-U6h>u!3+Ytj_g1z>FrRhxZnm8HlSv zL+X;g9x3MQz7x~)ZBxold~{!E!>nZ|K7I8`cH(VjCqA9;Z_|9vbSFOTTjcet?8I?- zokb5rg#0hzv$UAXjpXh;i;)L9Dc_&VMTeRh! zIPr5q<()X$AgH_(CodIL-ieb^Ufzk5QeNJPlkXQj@J^ikoS^bfocxZU@=lz5QBZl$ zO_^(oR=-^IPRRoZE_$cdi5|GNafmihUPS4vh5_>Nafmif;%H^2BPF)P_T zrdFP3Co?{WshvWy`Ai)V)N`47x1gTK)K3U%hN)i{)CEkHG0pjgT9*`U7c%uiLA`*f z@^0QDrfv~!FJ!8e_adfNUVcw{xR|Ljn!SXn&xw8)8)|)vpkB(SauoGk-Z#zbe|cGF2XMIzbHfDIUY#;2xdw1FBp4X=C%?)@_4EI=uwbuyy9B!2mBW>Khbz^yWTn&@d zO}1eVATbyKh7?1%f=+6ib3b0ISTiF6O!j&Jk446zb6aSt;r~w`odA|EoaN$SeH?mJuEln#tJG zc&3Fqu{f8Xs*^O9zHpHO4l@g9#@lpQlZ4gCE%iNsp(cUb5L{2L%_F2Hry$HfhwFb0pe+?B`uM!^ z0HP|e|6ah>0k${SIXK|1d0o~%0M!F%07|aPje31Xe4Kw2lTlT)b4b$;6`W8z7K@v$ zqu5Cm`VnA@Q(~c@pBj-{Q8(bCc9n;>4R3WodsTL7!AakMUbBY>U+;p`b5~IMqZFKe z@fR~JI3-q|q~J7S3QqCgggTyS!6|Oi%PIvYf3`^G?9tD1LA6IeB|)_p8*Ud=d$B>L zx?FJbzbM*r!71_v1THxFzY%Ti(a(HAwMRdz1l1n>Y!p;`vEjXf$_1z3W0<}Mm}lUY z+g|EvFZ8;bXPdSRfgb3a_aqP!*|}G`tN5fN z(_+Gzu$vkl(gx>01Sm?)OK|Nx-{(Gkr|QK2J%$bR=R4I0eROW!0K>5%tSb*sJ~^I9 zXV((K^>=3nT!*RRyn}$lFdX^iinT|#9vu8-Se)g5mh1_8+h5h(PPvU3!&yvJ%33WVUKWoabRs5_cZ<1R-TPJ*x^|P{s zZ~bhqXlwoKsGwRuYaTDR1!C)GWl7xn+5atiU_a}>AgI>Q%H6{H+2!OrZ^RV=u}6D$ zAm5W8a2>^@X4}C+T!8@VD0HlWS1jZ^+@-4meJq;bqaxk#c<*{8;H}~X@xBm6=Edy# zVy@4*thqE)_{xA}}2aS_z z+t=!i6R&sB_?z$2a#EbxZ+b&Mrxs_{booh~*-jHQHvS^i@l2grqdD!X;>=?G!a1-r zi%D0+&Mfvm(UzTA?DK-k&MaoMWZf1!v)I3jw(QK}X9+4hv-q`w%FZmlUQpSY#pUT7 zJG1z`qAdrFaT&OB&=`MGwB=LE_)$USQ_6&NoqS4}xKgy`Q_94kpzaLkm6IyqzttAlrnjz;KrwvN%^J^ zKBY|ly=cp)lu3Dx%%_y8(?nZ7rA(Q$%*xBBlqso6KBY|kj_83;DN`R3R6eClJu0Yt zN}2kZpz>Aj@l#0tC zZG0(v6MLY$7x?AfmuT!&VOWmB(RKC?48nFaIN+oXD!b${z+p(<*}Jv~F-R1Z&1l?` z-vks@w{!j4z4SH}^gd?Qo9l-PRE@b!(%!@d6x}+GN~i}qNxX@T;{uqLmFlR(bJOF} zLNRq*i7x^OZ|LWH`)d;p-V1C7@)uM zBc9~J4fJHQo$b!GP(3P*Jpm|6&k@y`E4dHlt1c^cFW|7sOx!w4-D;w(L$OR!Vc7*i zd(^_R8Evh_7KK@M71ygQTQz7vnT3^Bd9F-w8)g>x+@2{x;6|XN z7W&QEpbfC~dzNk}!(SJ8N7=n2>Zu&@I0|1F*q?{1iI4(m{M5m24IEH4_tgR}~IX|y*9SvivK0d5II{Jnz6aA{2qAMk{ zdSQPk0jedlikT-YeCiMY^!qUnCWQZF%r28z1wRaRJk!i7Fi~ce%*wk%#EP6*dG`q_ zXI7rfNjS6eo)T?2v+`aQR9hyRk1?ok@6p3`tv=;eN1JA+elw^AH^-qIT#0v|4$~vT zO1TwL`n#O;?W$64MWFg(H5>@M_I^s-HZm0omJ;|yokkUAYJ~zAXdM2dR487(kt{@6 zN5{SsGWS~6(HS=op!z!6ZPw8l=}^ZrT}P+?1Ib%u9YyX&^Eyh%8>hUE5}jgg@H$G! z8>hUE67t3=ucL&#amp2n#ABjgu23ZYRZzJ?5xE=96^i6#qAgb_lJZ`sy+^%6w6*uB z|4>lvJ?g&^RC|y52|=~@sDCM_T%m~EjphnP>MGIJ-lJYCsP-PUJT|oVsQ*N?wfCr{ zr?dB{rKhv^sE>&rxI&RWPf+bW>UKf3_o&V5&}=2a-lLW?Z|_lmQuJW&Q5)N|J=lBH za^|^0QCBZ|;0i^ZycN$CiaL1&z!i$RQPBfeDC%V0jVly&Ul47%LQ(g9LFEcX-AjUc zvAO44f2N>b!qnx0x|pd$f@<$k%etGrM=kd_dyiV)inlkW<*j(WG2M_5-0Y3%MS^N? zOy>pF-k2T}RC{Au-i@|5rXLn!F`R9>8oPcQT|{&fXY7<5xYbpvd?12CAMbwNc5UOlax zgidN3XQRDKM>sV(%cwX^UXWk!U~flH4$h0Bn|fBoHGGH12Dn})ht$KB2E0qhyn1Jl zKsMlG)RfE*_O8x%xvvPRBI4x$!({$OxO#xOikr;qFAcB%cOF~&*yiE4JNjtR^jQCO zma${7H~=rzTpoq#_g3rwi-fuN;U-mXB?)t{nC(|#`0y$!l7)0$2dB?l-7^g9EEIaz z)U5xyzX2FlDJ)F2N;NUAn*b<=!#(+qZY`ZYqz$j`dVz9uslPj-F3qDuUaE-ds9J~S_P6w5t>4|rG6Cmkg#TtB1h58pT`Zb-T7XuJA zxi;I|uf458HI&qg%#Km5t*$cnYV1;9jsl&9puY+;^`0ouvFR$nd=%(dwLTdsyyJos zIHb80-J>U;0t}io>tzGJ7Rp)aZJK71c$bilk^xc}su6?_uj1?tbW>%?L8~= znGb-mDD1$N~0LYQX_si#gR=Fcz;*trkr0 z$2+B3Fc+_(xtb=g7NSQvGDXw}jx#rK;R4=-1G)1?wz7gtp zrbV~2OcA6?(Ji?`q@!GPOKuQUF1jV(BdA<-OUg&hx#*UZg)}a@MJ|VM(Jj?1`sJcq zs%(jbi*EI@q{BtGdZ{xmy4A}!=5x`lenN2L@>;ztHgS2a{t?lZ z%WL&N5mYX(MT$*aUTe5SwB_IqqH+Fx;08WOF$GnyH@^ z)GnqNYD-4+a063wc>LIc*S#=U?i|cvK~E_$=;3(_MhpVzKGZp>g&MPd z9RXg^8cjI$3v{#a>C-UBD;$p5jLH$OJB5KuU5;v9X;$Af5Hr=9l`{*UzGjXF=!mLU z44ScG5C*!+(JMa9ABzGVj{2VmX}&cARFrdzrq$*v07$P(AIudCUFu8Wb<=6Wr|%`w z5mr}E(<4!2t@>$tuY+`W>ekbQ6(b?7q9L`I)--DxNrmW|?WYl6Jjy&7=}4<^?Jm?w z&UE!QtZ<=D$x>gT4ZaI?72KkYwf>tf)Oqw?uXoak0cp5c7@FBKt?##7r=gC(`aRZq z^na3Tt!7w<*PSC!hif*Ysi_VtMiQzRqPkS;HUpFv9E^2FuD%W{<`U_MtJ_lg`6#kh z9i<;~kPc6MsnXkLgtUr=)V(l`Cx%wJGxKKYlnZs_)peA5+=04E(!+(+`&_8QRo7B# ztplx9O{sYRwF;h5K$ZN7gLK5zm6W845yo&}yu`Cs9VM}1B&1bhDsZ9{pozO($z@Tb zqM^MSGJ)|Q^27%ys=0g}`85aWdVEz{`ZKMPr|a-1RcY~Y4~eYN-zQFUkj{K&GaAqM z_Z?)7-ad{ehIl5^p6%<*!+D{D)Ay!$If8R4=K2{>94qEwe$IU8xY$b(+|^DB(5h)B zhVfsRpF0=o{KtMjf^%jEqW@*t3~8ZFHK2MKc~K%Y3e?vA@v_aHo0YrKrB zP1RQX^}sO#b>~mrBh6pbkzAc|0#n7Gn!l(cp^j$tV9WeP9SL>Sv|r_l{y#ES$9nYV zE%fW|`q}w^n77Xy-bs}d<;39G!=b`{Ehh%SRn!$UwZ)n9z%aax)Qveuc$&X^G;|5R zwW0E!*+tmCHPjydOe^)ZpW7!q@33#gYR;rG$qaEYFKdCmL&zwn*$c@ZLx<+Cz|uwa z%a?doWbDW{mpYF^M{x2vUfwXWc6hvR_l|fH_tJr@Z*=g}@<=K1E}_ERYe4-psE7+1_@lR`I{q43z-uw1cbv+M9`B}!fdzDajHU+fn;1(1Ya!b@ zNDI$A?F{YUYY(dkEufBF9pmNUiQVJno{?SVl*Kf-$)9aJ1gtA)e0x9jh=H-g9aUs^KaOaEg3dCc5Fna%nNn?S8XJ yDk4=IGc4Zlm<1>N%4n>bU{%o7mhRL#y8>wp;GSu6pTNoW8tLB$=;w~CcfEFP~61hsiShfXy*%MTV!kb%Zgpc!*LYMRjcLPRn69#TM{0| z$XTf&@tWxJFzuI<+hmh_90_9C*!x;ZsEYIp@T=%2$J#)As5 zSEjdb-ECWMVUtNqmV=lLeIa+Ih2c>wxRqx4F=b)DRBtph7Zn}SuI>;InC$Zd_$> 23) iStartTime = 23; +if(iStopTime > 23) iStopTime = 23; +if((iStartTime <= iStopTime && (GetTimeHour() >= iStartTime && GetTimeHour() < iStopTime)) +|| (iStartTime >= iStopTime && (GetTimeHour() >= iStartTime || GetTimeHour() < iStopTime))) + { + if(!GetIsObjectValid(GetLocalObject(OBJECT_SELF, "re_oObject"))) + { + if(iChanceOfSpawn >= iHappens) + { + oObject = CreateObject(OBJECT_TYPE_PLACEABLE, sTemplate, GetLocation(OBJECT_SELF)); + SetLocalInt(oObject, "re_iID", iID); + SetLocalObject(OBJECT_SELF, "re_oObject", oObject); + } + } + } +else + { + if(GetIsObjectValid(GetLocalObject(OBJECT_SELF, "re_oObject"))) + { + DestroyObject(GetLocalObject(OBJECT_SELF, "re_oObject")); + DeleteLocalObject(OBJECT_SELF, "re_oObject"); + } + } +} diff --git a/gamma_age_v2/re_pwrespawnerhb.ncs b/gamma_age_v2/re_pwrespawnerhb.ncs new file mode 100644 index 0000000000000000000000000000000000000000..d5d5034777b46ed58d7df39551be25b156aa0078 GIT binary patch literal 55361 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 99) iSpawnerNumber = 99; + if(iSpawnerNumber < 10) sMatchString = "PWS0" + IntToString(iSpawnerNumber); + else sMatchString = "PWS" + IntToString(iSpawnerNumber); + +// IF THIS IS THE FIRST RUN THEN INITIALIZE EACH SPAWN POINT BY PARSING THE TAG FOR SWITCHES AND SETTING +// LOCAL VARIABLES. + if(!GetLocalInt(OBJECT_SELF, "re_bFirstRun")) + { + SetLocalInt(OBJECT_SELF, "re_bFirstRun", TRUE); + SetLocalInt(OBJECT_SELF, "re_bSpawnNow", TRUE); + fChanceOfEncounter = 100.00; + object oObject = GetFirstObjectInArea(oArea); + string sCustom = "nil"; + string sBuild; + while(GetIsObjectValid(oObject)) + { + if(GetStringLeft(GetTag(oObject), 5) == sMatchString) + { + iCounter1++; + SetLocalObject(OBJECT_SELF, "re_oPWWaypoint" + IntToString(iCounter1), oObject); + for(iCounter3 = 5; iCounter3 <= GetStringLength(GetTag(oObject)); iCounter3++) + { + if(sCustom != "nil" + && (GetSubString(GetTag(oObject), iCounter3, 1) == "0" || StringToInt(GetSubString(GetTag(oObject), iCounter3, 1)) > 0)) + { + sBuild = sBuild + GetSubString(GetTag(oObject), iCounter3, 1); + } + else if(sCustom != "nil") + { + if(sCustom == "s") SetLocalInt(oObject, "re_bSwitch" + sBuild, TRUE); + if(sCustom == "b") + { + int iBegin = StringToInt(sBuild); + if(iBegin > 23) iBegin = 23; + if(iBegin < 0) iBegin = 0; //Don't think this is necessary, but... safety first! + SetLocalInt(oObject, "re_iBegin", iBegin); + } + if(sCustom == "e") + { + int iEnd = StringToInt(sBuild); + if(iEnd > 23) iEnd = 23; + if(iEnd < 0) iEnd = 0; + SetLocalInt(oObject, "re_iEnd", iEnd); + } + if(sCustom == "t") + { + SetLocalInt(oObject, "re_iTerritory", StringToInt(sBuild)); + if(GetLocalInt(oObject, "re_iTerritory") < 30) SetLocalInt(oObject, "re_iTerritory", 30); + } + sCustom = "nil"; + sBuild = ""; + } + if(GetSubString(GetTag(oObject), iCounter3, 1) == "s" + || GetSubString(GetTag(oObject), iCounter3, 1) == "t" + || GetSubString(GetTag(oObject), iCounter3, 1) == "b" + || GetSubString(GetTag(oObject), iCounter3, 1) == "e") + { + sCustom = GetSubString(GetTag(oObject), iCounter3, 1); + } + } + } + oObject = GetNextObjectInArea(oArea); + } + SetLocalInt(OBJECT_SELF, "re_iTotalSpawnpoints", iCounter1); + } + +// CYCLE THROUGH THE SPAWN POINTS. + for(iCounter2 = 1; iCounter2 <= GetLocalInt(OBJECT_SELF, "re_iTotalSpawnpoints"); iCounter2++) + { + oSpawner = GetLocalObject(OBJECT_SELF, "re_oPWWaypoint" + IntToString(iCounter2)); + oCreature = GetLocalObject(oSpawner, "re_oLastRandomEncounterSpawned"); + int bTimeIn = TRUE; + struct RndEncProperties stEncProperties = GetRndEncProperties(oSpawner); + if(!stEncProperties.bInitialized) stEncProperties = GetRndEncProperties(GetArea(OBJECT_SELF)); + if(!stEncProperties.bInitialized) stEncProperties = GetRndEncProperties(GetModule()); + if(!iLevel) SetRndEncProperties(oSpawner, stEncProperties.iDifficulty, FALSE, stEncProperties.sCreatureTable, stEncProperties.iLifeTime, stEncProperties.iMph, stEncProperties.iEncounterType, stEncProperties.bConflict, stEncProperties.iChanceOnRest, stEncProperties.bLOSCheck); + else SetRndEncProperties(oSpawner, stEncProperties.iDifficulty, TRUE, stEncProperties.sCreatureTable, stEncProperties.iLifeTime, stEncProperties.iMph, stEncProperties.iEncounterType, stEncProperties.bConflict, stEncProperties.iChanceOnRest, stEncProperties.bLOSCheck); + if(GetLocalInt(oSpawner, "re_iBegin") || GetLocalInt(oSpawner, "re_iEnd")) + { + int iStartTime = GetLocalInt(oSpawner, "re_iBegin"); + int iStopTime = GetLocalInt(oSpawner, "re_iEnd"); + if((iStartTime <= iStopTime && (GetTimeHour() >= iStartTime && GetTimeHour() < iStopTime)) + || (iStartTime >= iStopTime && (GetTimeHour() >= iStartTime || GetTimeHour() < iStopTime))) + bTimeIn = TRUE; + else bTimeIn = FALSE; + } + if(GetLocalInt(oSpawner, "re_bDay")) + { + if(GetIsDusk() || GetIsNight()) + { + DeleteLocalInt(oSpawner, "re_bDay"); + if(GetLocalInt(oSpawner, "re_bSwitch6")) fChanceOfEncounter = 100.0; + } + } + else + { + if(GetIsDawn() || GetIsDay()) + { + SetLocalInt(oSpawner, "re_bDay", TRUE); + if(GetLocalInt(oSpawner, "re_bSwitch5")) fChanceOfEncounter = 100.0; + } + } + // If the creature is dead or not valid then attempt to spawn him. + if(!GetIsObjectValid(oCreature) || GetIsDead(oCreature)) + { + if(!GetLocalInt(oSpawner, "re_TimeOfDeath")) SetLocalInt(oSpawner, "re_TimeOfDeath", GetTimeInSeconds()); + if((GetTimeInSeconds() - GetLocalInt(oSpawner, "re_TimeOfDeath")) / 60 >= iRespawnTime || GetLocalInt(OBJECT_SELF, "re_bSpawnNow")) + { + if((!GetLocalInt(oSpawner, "re_bSwitch5") && !GetLocalInt(oSpawner, "re_bSwitch6") && bTimeIn) + || (GetLocalInt(oSpawner, "re_bSwitch5") && (GetIsDawn() || GetIsDay()) && bTimeIn) + || (GetLocalInt(oSpawner, "re_bSwitch6") && (GetIsDusk() || GetIsNight()) && bTimeIn)) + { + oCreature = RandomEncounter(fChanceOfEncounter, oSpawner, sTemplate, 0, 1, 0, 0, 0, 0, 0, iLevel, 5); + if(GetIsObjectValid(oCreature)) + { + if(GetLocalInt(oSpawner, "re_bSwitch2")) AssignCommand(oCreature, ActionRandomWalk()); + if(GetLocalInt(oSpawner, "re_bSwitch3")) AssignCommand(oCreature, ActionPlayAnimation(ANIMATION_LOOPING_SIT_CROSS, 1.0, 4000.0)); + AssignCommand(oCreature, SetFacing(GetFacing(oSpawner))); + DeleteLocalInt(oSpawner, "re_TimeOfDeath"); + DeleteLocalInt(oCreature, "re_bRandomEncounter"); //This is so this creature isn't destroyed by the CleanHouse() function + } + } + } + } + else + { + location lLocation = GetLocation(oSpawner); + location lCreature = GetLocation(oCreature); + vector vLocation = GetPositionFromLocation(lLocation); + vector vCreature = GetPositionFromLocation(lCreature); + object oAttacker = GetLastHostileActor(oCreature); + location lAttacker = GetLocation(oAttacker); + + // Send the creature home if the territory switch is set and the creature is out of his territory + // and not in combat and not DM controlled. + if(GetLocalInt(oSpawner, "re_iTerritory") && GetDistanceBetweenLocations(lLocation, lCreature) > IntToFloat(GetLocalInt(oSpawner, "re_iTerritory"))) + { + if(!GetIsObjectValid(oAttacker) + || (!GetIsInCombat(oAttacker) && !GetIsPC(oCreature) && GetDistanceBetweenLocations(lLocation, lAttacker) > IntToFloat(GetLocalInt(oSpawner, "re_iTerritory")))) + { + AssignCommand(oCreature, ClearAllActions()); + AssignCommand(oCreature, JumpToLocation(lLocation)); + AssignCommand(oCreature, SetFacing(GetFacing(oSpawner))); + } + } + + // Things to do if creature is valid, alive, not in combat, and not DM controlled. + if(!GetIsInCombat(oCreature) && !GetIsPC(oCreature)) + { + float fDamage = IntToFloat(GetMaxHitPoints(oCreature) - GetCurrentHitPoints(oCreature)) / 5.0; + if(fDamage < 1.0 && fDamage > 0.0) fDamage = 1.0; + int iDamage = FloatToInt(fDamage); + if(GetLocalInt(oSpawner, "re_bSwitch5") && (GetIsDusk() || GetIsNight()) + || GetLocalInt(oSpawner, "re_bSwitch6") && (GetIsDawn() || GetIsDay()) + || !bTimeIn) + { + DestroyObject(oCreature); + } + if(vLocation.x != vCreature.x || vLocation.y != vCreature.y || GetFacing(oCreature) != GetFacing(oSpawner)) + { + if(!GetLocalInt(oSpawner, "re_bSwitch1")) + { + if(!GetLocalInt(oSpawner, "re_bSwitch2") || GetDistanceBetweenLocations(lLocation, lCreature) >= 15.0) + { + //AssignCommand(oCreature, ClearAllActions()); + if(GetLocalInt(oSpawner, "re_iTerritory")) AssignCommand(oCreature, ActionMoveToLocation(lLocation)); + else AssignCommand(oCreature, ActionMoveToLocation(lLocation)); + AssignCommand(oCreature, ActionDoCommand(SetFacing(GetFacing(oSpawner)))); + if(GetLocalInt(oSpawner, "re_bSwitch3")) AssignCommand(oCreature, ActionDoCommand(PlayAnimation(ANIMATION_LOOPING_SIT_CROSS, 1.0, 4000.0))); + } + } + } + if(lLocation == lCreature && GetFacing(oCreature) != GetFacing(oSpawner)) AssignCommand(oCreature, ActionDoCommand(SetFacing(GetFacing(oSpawner)))); + if(!GetLocalInt(oSpawner, "re_bSwitch4") && iDamage) ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectHeal(iDamage), oCreature); + if(GetLocalInt(oSpawner, "re_bSwitch2")) AssignCommand(oCreature, ActionDoCommand(ActionRandomWalk())); + if(GetLocalInt(oSpawner, "re_bSwitch3")) + { + if(GetLocalInt(oSpawner, "re_bSwitch1")) + { + AssignCommand(oCreature, ClearAllActions()); + AssignCommand(oCreature, PlayAnimation(ANIMATION_LOOPING_SIT_CROSS, 1.0, 4000.0)); + } + else if(lLocation == lCreature) + { + AssignCommand(oCreature, ClearAllActions()); + AssignCommand(oCreature, PlayAnimation(ANIMATION_LOOPING_SIT_CROSS, 1.0, 4000.0)); + } + } + } + } + } + if(GetLocalInt(OBJECT_SELF, "re_bSpawnNow")) DeleteLocalInt(OBJECT_SELF, "re_bSpawnNow"); +} diff --git a/gamma_age_v2/re_rndenc.nss b/gamma_age_v2/re_rndenc.nss new file mode 100644 index 00000000..a65d656a --- /dev/null +++ b/gamma_age_v2/re_rndenc.nss @@ -0,0 +1,896 @@ +//:://///////////////////////////////////////////// +//:: Name re_rndenc +//:: FileName re_rndenc.nss +//:: Copyright (c) 2002 Raymond Miller +//::////////////////////////////////////////////// +/* +This script creates functions called RandomEncounter(), +CleanHouse(), and SetRndEncProperties() for use in the NWN +scripting language. This script is meant to be used as an #include +and is part of the BESIE Random Encounter package by Ray Miller +*/ +//::////////////////////////////////////////////// +//:: Created By: Ray Miller +//:: Created On: 7/6/2002 +//::////////////////////////////////////////////// + +// Encounter Type Constants +int ENCOUNTER_TYPE_AREA = 3; +int ENCOUNTER_TYPE_PARTY = 1; +int ENCOUNTER_TYPE_IND = 2; +int ENCOUNTER_TYPE_TOTALPARTYLEVELS = 4; + +struct RndEncProperties + { + int bInitialized; + int iDifficulty; + int bConsiderCR; + string sCreatureTable; + int iLifeTime; + int iMph; + int iEncounterType; + int bConflict; + int iChanceOnRest; + int bLOSCheck; + }; + +// FUNCTION DECLARATIONS + +// Sets properties for random encounters that are likely to seldom change +// - oObject: The object that holds these properties. +// - iDifficulty: 1 to 10 +// - bConsiderCR: If TRUE takes CR of creature into consideration when +// choosing an encounter. +// - sCreatureTable: "re_***" - where *** is a string of letter and/or numbers to indicate to the function what type +// of creatures to spawn. They are as follows: +// a - animals +// c - construct +// d - dragon +// e - elemental +// g - giant +// h - humanoid +// i - insect +// m - miscellaneous +// p - planar +// u - undead +// b - bandit +// x1 through x### - These are for custom encounter tables. +// t1 through t### - These are for treasure tables. +// - iLifeTime: Time in seconds before unengaged encounters decay. +// - Mph: Should equal the Minutes Per Hour setting of the Module. +// - iEncounterType: +// ENCOUNTER_TYPE_PARTY - Takes into consideration the average level of the entire party of the PC who is to +// receive the encounter when choosing an encounter of appropriate difficulty level. +// ENCOUNTER_TYPE_TOTALPARTYLEVELS (default) - Takes into consideration the TOTAL of all the levels of the PC's party who +// currently reside in the same area as the PC to receive the encounter. +// ENCOUNTER_TYPE_AREA - Takes into consideration the levels off all PCs and henchmen within a 20m radius of the PC +// who is to receive the encounter. +// ENCOUNTER_TYPE_IND - Takes into consideration only the levels of the individual PC who is to receive the encounter. +// - bConflict: If set to TRUE then random encounters can occur during combat. +// - iChanceOnRest: The chance of a random encounter occuring when a PC rests (only matters on Area Object and the "re_onrest" +// script must be placed in PlayerOnRest handler of the module object). +// - bLOSCheck: Dependant upon a broken scripting function. (future use!) +// Note: This function is best called by the OnModuleLoad or OnAreaLoad handler. +void SetRndEncProperties(object oObject = OBJECT_SELF, int iDifficulty = 4, int bConsiderCR = TRUE, string sCreatureTable = "re_ceghimpubt0", int iLifeTime = 180, int iMph = 2, int iEncounterType = 4, int bConflict = FALSE, int iChanceOnRest = 20, int bLOSCheck = FALSE); + +// Returns the structure "RndEncProperties" containing all the Random Encounter Properties set on oObject. +// The elements of the structure are as follows: +// - bInitialized: TRUE if properties have been set on this object. +// - iDifficulty: 1 to 10 +// - bConsiderCR: If TRUE, takes CR of creature into consideration when +// choosing an encounter. +// - sCreatureTable: "re_***" - where *** is a string of letter and/or numbers to indicate to the function what type +// of creatures to spawn. They are as follows: +// a - animals +// c - construct +// d - dragon +// e - elemental +// g - giant +// h - humanoid +// i - insect +// m - miscellaneous +// p - planar +// u - undead +// b - bandit +// x1 through x### - These are for custom encounter tables. +// t1 through t### - These are for treasure tables. +// - iLifeTime: Time in seconds before unengaged encounters decay. +// - iMph: Should equal the Minutes Per Hour setting of the Module. +// - iEncounterType: +// ENCOUNTER_TYPE_PARTY - Takes into consideration the average level of the entire party of the PC who is to +// receive the encounter when choosing an encounter of appropriate difficulty level. +// ENCOUNTER_TYPE_TOTALPARTYLEVELS (default) - Takes into consideration the TOTAL of all the levels of the PC's party who +// currently reside in the same area as the PC to receive the encounter. +// ENCOUNTER_TYPE_AREA - Takes into consideration the levels off all PCs and henchmen within a 20m radius of the PC +// who is to receive the encounter. +// ENCOUNTER_TYPE_IND - Takes into consideration only the levels of the individual PC who is to receive the encounter. +// - bConflict: If TRUE then random encounters can occur during combat. +// - iChanceOnRest: The chance of a random encounter occuring when a PC rests (only matters on Area Object and the "re_onrest" +// script must be placed in PlayerOnRest handler of the module object). +// - bLOSCheck: Dependant upon a broken scripting function. (future use!) +struct RndEncProperties GetRndEncProperties(object oObject); + +// Generates the likelihood of a random encounter. +// - fChanceOfEncounter: Odds of encounter spawning when funciton is called. Accurate to two +// decimal places. .01 to 100.00 percent chance. +// - oEncounterObject: The object about which the encounter will spawn, whose levels (if a player) +// will be considered when determining an appropriate creature. +// - sTemplate: When used as the sCreatureTable parameter in the SetRndEncProperties() +// function this parameter has higher priority. It can also be set to the tag of a +// specific creature, or to "random" to use the default table set by SetRndEncProperties() +// - iMinNumberOfCreatures: If > 0, a random number of creatures between this and iMaxNumberOfCreatures +// will spawn. If set to 0, then exactly the number of creatures set by iMaxNumberOfCreatures will +// spawn. +// - iMaxNumberOfCreatures: If this and iMinNumberOfCreatures is set to 0 then the number of Creatures +// spawned will be determined by the CR of the creature spawned compared to the levels of the player(s). +// - iMinEncounterDistance: If set to 0, encounter distance will always be at the number set by iMaxEncounterDistance. +// - iMaxEncounterDistance: Farthest distance the encounter can be from oEncounterObject. +// - iOrientation: 0 to 360. Counterclockwise representing the angle from facing where the encounter will spawn. +// a value of 0 will spawn the encounter directly in front of oEncounterObject. 360 will generate a random angle. +// - iTolerance: The number of degrees by which the angle can randomly be off from iOrientation. +// - iCheckDistance: The distance a PC has to move before a Random Encounter check can be made against him. If the PC has +// not covered this much distance, then a call to the RandomEncounter() function for this PC will yield +// OBJECT_INVALID. +// - iLevelOverride: Use this to force the function to base the encounter on a character level other than that +// determined by oEncounterObject. +// - iDifficulty: Overrides the difficulty setting determined by the SetRndEncProperties() function. +object RandomEncounter(float fChanceOfEncounter = 100.0, object oEncounterObject = OBJECT_SELF, string sTemplate = "random", int iMinNumberOfCreatures = 0, int iMaxNumberOfCreatures = 0, int iMinEncounterDistance = 1, int iMaxEncounterDistance = 15, int iOrientation = 360, int iTolerance = 0, int iCheckDistance = 0, int iLevelOverride = 0, int iDifficulty = 0); + +// Used to "clean up" an area that has become littered by random encounters. +// - bDestroyPlotItems - Tells the function whether or not to destroy items with their plot flags set. If set to TRUE, +// plot items will be destroyed just like any other item. +// - oArea - The area to clean up. +// - iSpawnOverride - Overrides the default (set by the SetRndEncProperties() function) time to destroy random encounter +// creatures who are not engaged by PCs. +// - iItemOverride - Overrides the default time of 30 minutes after which to destroy items dropped by PCs +// Note: Only works if the "re_moditemdrop" script included with the BESIE Random Encounter package +// is placed in the module OnItemUnacquire handler. +// - iBodyBagOverride - Overrides the default time of 5 minutes after which to destroy loot that was dropped by creatures +// who were killed. +// NOTE: If there is bDestroyPlotItems is FALSE and there is a plot item or items inside a container or body bag, the container +// and all non-plot items will decay but the plot item(s) will be left. +// NOTE: A value of zero assigned to the override parameters will cause the function to use the default value for that parameter. +void CleanHouse(int bDestroyPlotItems = FALSE, object oArea = OBJECT_SELF, int iSpawnOverride = 0, int iItemOverride = 0, int iBodyBagOverride = 0); + +// Returns the game's calander time in seconds since time zero. +// - iMph: Minutes Per Hour. This should match the module's setting. +int GetTimeInSeconds(int iMph = 2); + +// Causes oCreature to walk to a randomly determined location. +// - lCenter: The center of a circle in which random destinations can be generated. +// - iDistance: The distance from lCenter in which to randomly generate destinations. +// - oCreature: The creature to perform the random walk. +// Note: Unlike the default RandomWalk function, this function does not persist until a ClearAllActions is called. Instead this +// function generates a single random desitination and the move to that destination is added to the creatures action que only once +// per call. +location RandomWalk2(location lCenter, int iDistance = 20, object oCreature = OBJECT_SELF); + +void SetRndEncProperties(object oObject = OBJECT_SELF, int iDifficulty = 4, int bConsiderCR = TRUE, string sCreatureTable = "re_ceghimpubt0", int iLifeTime = 180, int iMph = 2, int iEncounterType = 4, int bConflict = TRUE, int iChanceOnRest = 20, int bLOSCheck = FALSE) +{ + SetLocalInt(oObject, "re_bInitialized", TRUE); + SetLocalInt(oObject, "re_iDifficulty", iDifficulty); + SetLocalInt(oObject, "re_bConsiderCR", bConsiderCR); + SetLocalString(oObject, "re_sCreatureTable", sCreatureTable); + SetLocalInt(oObject, "re_iLifeTime", iLifeTime); + SetLocalInt(oObject, "re_iMph", iMph); + SetLocalInt(oObject, "re_iEncounterType", iEncounterType); + SetLocalInt(oObject, "re_bConflict", bConflict); + SetLocalInt(oObject, "re_iChanceOnRest", iChanceOnRest); + SetLocalInt(oObject, "re_bLOSCheck", bLOSCheck); +} + +struct RndEncProperties GetRndEncProperties(object oObject = OBJECT_SELF) +{ + if(oObject == GetModule() && !GetLocalInt(GetModule(), "re_bInitialized")) SetRndEncProperties(GetModule()); + struct RndEncProperties strProps; + strProps.bInitialized = GetLocalInt(oObject, "re_bInitialized"); + strProps.iDifficulty = GetLocalInt(oObject, "re_iDifficulty"); + strProps.bConsiderCR = GetLocalInt(oObject, "re_bConsiderCR"); + strProps.sCreatureTable = GetLocalString(oObject, "re_sCreatureTable"); + strProps.iLifeTime = GetLocalInt(oObject, "re_iLifeTime"); + strProps.iMph = GetLocalInt(oObject, "re_iMph"); + strProps.iEncounterType = GetLocalInt(oObject, "re_iEncounterType"); + strProps.bConflict = GetLocalInt(oObject, "re_bConflict"); + strProps.iChanceOnRest = GetLocalInt(oObject, "re_iChanceOnRest"); + strProps.bLOSCheck = GetLocalInt(oObject, "re_bLOSCheck"); + return strProps; +} + +#include "re_table" +object RandomEncounter(float fChanceOfEncounter = 100.0, object oEncounterObject = OBJECT_SELF, string sTemplate = "random", int iMinNumberOfCreatures = 0, int iMaxNumberOfCreatures = 0, int iMinEncounterDistance = 1, int iMaxEncounterDistance = 15, int iOrientation = 360, int iTolerance = 0, int iCheckDistance = 0, int iLevelOverride = 0, int iDifficulty = 0) +{ +// IF PROPERTIES ARE NOT SET ON MODULE OBJECT THEN SET THEM WITH DEFAULTS + if(!GetLocalInt(GetModule(), "re_bInitialized")) + { + SetRndEncProperties(GetModule()); + } + +// DETERMINE IF ENCOUNTER HAPPENS + //Has the player moved farther than the CheckDistance? + float fTravelDistance; + if(GetIsPC(oEncounterObject)) + { + if(!GetLocalInt(oEncounterObject, "re_bOldLocationSet")) + { + SetLocalInt(oEncounterObject, "re_bOldLocationSet", TRUE); + SetLocalLocation(oEncounterObject, "re_lOldLocation", GetLocation(oEncounterObject)); + if(iCheckDistance) return OBJECT_INVALID; + } + if(GetDistanceBetweenLocations(GetLocation(oEncounterObject), GetLocalLocation(oEncounterObject, "re_lOldLocation")) < 0.0) + { + SetLocalLocation(oEncounterObject, "re_lOldLocation", GetLocation(oEncounterObject)); + if(iCheckDistance) return OBJECT_INVALID; + } + fTravelDistance = GetDistanceBetweenLocations(GetLocation(oEncounterObject), GetLocalLocation(oEncounterObject, "re_lOldLocation")); + SetLocalFloat(oEncounterObject, "re_fTravelDistance", GetLocalFloat(oEncounterObject, "re_fTravelDistance") + fTravelDistance); + SetLocalLocation(oEncounterObject, "re_lOldLocation", GetLocation(oEncounterObject)); + if(GetLocalFloat(oEncounterObject, "re_fTravelDistance") >= IntToFloat(iCheckDistance)) DeleteLocalFloat(oEncounterObject, "re_fTravelDistance"); + else return OBJECT_INVALID; + } + // The following two lines allow for a chance of encounter with a precision of up to + // two decimal places. ie. 100.00. An encounter can have as little as a 0.01 chance + // of occuring. + int iHappens = Random(10000)+1; + int iChanceOfEncounter = FloatToInt(fChanceOfEncounter * 100); + if(iChanceOfEncounter < iHappens) + { + return OBJECT_INVALID; + } + //Are encounters disabled for this player? + if(GetLocalInt(GetModule(), "re_" + GetPCPlayerName(oEncounterObject))) + { + return OBJECT_INVALID; + } + //Are random encounters disabled altogether? + if(GetLocalInt(GetModule(), "re_disable")) + { + return OBJECT_INVALID; + } + //Is the player in combat with bConflict equal to false? + object oHolder; + int iCounter7 = 1; // Used in checking for nearby enemies. + if(GetLocalInt(oEncounterObject, "re_bInitialized")) oHolder = oEncounterObject; + else if(GetLocalInt(GetArea(oEncounterObject), "re_bInitialized")) oHolder = GetArea(oEncounterObject); + else oHolder = GetModule(); + int bConflict = GetLocalInt(oHolder, "re_bConflict"); + if(!bConflict && GetIsPC(oEncounterObject)) + { + if(GetIsInCombat(oEncounterObject)) return OBJECT_INVALID; + object oNearest = GetNearestCreature(CREATURE_TYPE_IS_ALIVE, TRUE, oEncounterObject, iCounter7); + while(GetIsObjectValid(oNearest) && GetDistanceToObject(oNearest) < 35.0) + { + if(GetIsEnemy(oNearest) && (GetIsInCombat(oNearest) || GetObjectSeen(oNearest))) return OBJECT_INVALID; + iCounter7++; + oNearest = GetNearestCreature(CREATURE_TYPE_IS_ALIVE, TRUE, oEncounterObject, iCounter7); + } + } + //Are any nearby party members in a conversation? + object oAmIAPC; + oAmIAPC = GetFirstObjectInShape(SHAPE_SPHERE, 35.0, GetLocation(oEncounterObject), FALSE, OBJECT_TYPE_CREATURE); + if(GetIsObjectValid(oAmIAPC)) + { + while(GetIsObjectValid(oAmIAPC)) + { + if(GetIsPC(oAmIAPC)) + { + if(GetFactionEqual(oEncounterObject, oAmIAPC)) + { + if(IsInConversation(oAmIAPC)) + { + return OBJECT_INVALID; + } + } + } + oAmIAPC = GetNextObjectInShape(SHAPE_SPHERE, 25.0, GetLocation(oEncounterObject), FALSE, OBJECT_TYPE_CREATURE); + } + } + +// DECLARE AND INITIALIZE VARIABLES + object oMod = GetModule(); + int iMph; + if(!iDifficulty) iDifficulty = GetLocalInt(oHolder, "re_iDifficulty"); + int bConsiderCR = GetLocalInt(oHolder, "re_bConsiderCR"); + if(GetStringLowerCase(sTemplate) == "random") sTemplate = GetLocalString(GetModule(), "re_sCreatureTable"); + int iLifeTime = GetLocalInt(oHolder, "re_iLifeTime"); + if(!GetLocalInt(oHolder, "re_iMph")) iMph = 2; + else iMph = GetLocalInt(oHolder, "re_iMph"); + int bLOSCheck = GetLocalInt(oHolder, "re_bLOSCheck"); + int iEncounterType = GetLocalInt(oHolder, "re_iEncounterType"); + int iCounter1 = 1; // Used to count the creatures when spawning them. + int iCounter2 = 1; // Used in loop to set difficulty level. + int iCounter3 = 1; // Used in loop to check line of sight float fEncounterDistance (future use!). + int iCounter4;// Used in determining the PC to spawn the encounter if the encounter object passed is an area or the module. + int iCounter5; // Used in determining treasure table. + int iCounter6; // Used in giving treasure. + int iNumberOfCreatures; + int iEncounterDistance; + int iFacingSameWay; + int iLevels; + int iTableNumber; + int bNumberByLevel = FALSE; + int bNoEncounter = FALSE; + int bComplete1 = FALSE; + int bComplete2 = FALSE; + int bTreasure; + float fMinCR; + float fMaxCR; + float fEncounterDistance; + float fNewEncounterDistance; + float fCreatureFacing; + float fEncounterAngle; + float fEncounterVector; + float fAngleOffset; + float fLevels; + float fDifficulty = 0.167; + string sBuild; + string sTreasure = sTemplate; + vector vEncounterVector; + vector vVectorOffset; + vector vCreatureVector; + object oObject; + object oCreature; + object oArea; + if(oEncounterObject == GetModule()) + { + oAmIAPC = GetFirstPC(); + while(GetIsObjectValid(oAmIAPC)) + { + if(!GetLocalInt(GetModule(), "re_" + GetPCPlayerName(oAmIAPC))) + { + SetLocalObject(oMod, "re_oEncounterObject" + IntToString(iCounter4), oAmIAPC); + iCounter4++; + } + oAmIAPC = GetNextPC(); + } + oEncounterObject = GetLocalObject(oMod, "re_oEncounterObject" + IntToString(Random(iCounter4))); + } + else if(GetObjectType(oEncounterObject) == 0 && oEncounterObject != GetModule()) + { + oArea = oEncounterObject; + oAmIAPC = GetFirstObjectInArea(oArea); + while(GetIsObjectValid(oAmIAPC)) + { + if(GetIsPC(oAmIAPC) && !GetLocalInt(GetModule(), "re_" + GetPCPlayerName(oAmIAPC))) + { + SetLocalObject(oArea, "re_oEncounterObject" + IntToString(iCounter4), oAmIAPC); + iCounter4++; + } + oAmIAPC = GetNextObjectInArea(oArea); + } + oEncounterObject = GetLocalObject(oArea, "re_oEncounterObject" + IntToString(Random(iCounter4))); + } + else + { + oArea = GetArea(oEncounterObject); + } + if(!GetIsPC(oEncounterObject)) + iEncounterType = ENCOUNTER_TYPE_AREA; + location lCreatureLocation; + vector vEncounterObjectVector = GetPosition(oEncounterObject); + int iMin = 60; + int iHr = iMin * iMph; + int iDay = iHr * 24; + int iMth = iDay * 28; + int iYr = iMth * 12; + if(iDifficulty > 10) + { + iDifficulty = 10; + } + if(iDifficulty == 0) + { + iDifficulty = GetGameDifficulty() * 2; + } + while(iCounter2 <= iDifficulty) + { + fDifficulty = fDifficulty * 1.5; + iCounter2++; + } + +// ERROR CORRECTION + if(iMaxNumberOfCreatures < iMinNumberOfCreatures) + { + iMaxNumberOfCreatures = iMinNumberOfCreatures; + } + if(iMaxEncounterDistance < iMinEncounterDistance) + { + iMaxEncounterDistance = iMinEncounterDistance; + } + if(!GetIsPC(oEncounterObject)) + { + iEncounterType = ENCOUNTER_TYPE_AREA; + } + +// CHECK TO SEE IF PC IS RESTING VIA THE BESIE "re_onrest" SCRIPT AND IF SO +// REMOVE RESTING EFFECTS. + if(GetIsPC(oEncounterObject) && GetLocalInt(oEncounterObject, "re_resting")) + { + DeleteLocalInt(oEncounterObject, "re_resting"); + effect eEffect = GetFirstEffect(oEncounterObject); + while(GetIsEffectValid(eEffect)) + { + if(GetEffectType(eEffect) == EFFECT_TYPE_BLINDNESS && GetEffectCreator(eEffect) == GetModule()) RemoveEffect(oEncounterObject, eEffect); + if(GetEffectType(eEffect) == VFX_IMP_SLEEP && GetEffectCreator(eEffect) == GetModule()) RemoveEffect(oEncounterObject, eEffect); + eEffect = GetNextEffect(oEncounterObject); + } + } + +// DETERMINE THE ANGLE OFFSET OF THE SPAWN + if(iOrientation == 360) + { + fEncounterAngle = IntToFloat(Random(360)); + } + else + { + fEncounterAngle = GetFacingFromLocation(GetLocation(oEncounterObject)) + IntToFloat(iOrientation); + fEncounterAngle = (fEncounterAngle + (IntToFloat(iTolerance) * 0.5)) - (IntToFloat(Random(iTolerance))); + } + +// DETERMINE THE DISTANCE FROM THE SPAWNING OBJECT + if(iMinEncounterDistance == 0) + { + iMinEncounterDistance = iMaxEncounterDistance; + fEncounterDistance = IntToFloat(iMaxEncounterDistance); + } + else + { + fEncounterDistance = IntToFloat(iMinEncounterDistance + Random((iMaxEncounterDistance - iMinEncounterDistance) + 1)); + } + iEncounterDistance = FloatToInt(fEncounterDistance); + +// DETERMINE THE FACING OF THE SPAWN + if(GetLocalInt(oEncounterObject, "re_Facing")) + { + fCreatureFacing = fEncounterAngle + 180.0; + iFacingSameWay = TRUE; + DeleteLocalInt(oEncounterObject, "re_Facing"); + } + else + { + fCreatureFacing = IntToFloat(Random(360)); + iFacingSameWay = Random(2); // Note: If there is more than one creature there is a 50% chance they will all be facing the same direction + } + +// DETERMINE TOTAL CHARACTER LEVELS TO CONSIDER WHEN CHOOSING A CREATURE +// AND/OR DETERMINING THE NUMBER OF CREATURES TO SPAWN. + // If the variable iEncounterType is AREA, this routine + // determines the total character levels + // based upon the character levels of all PCs + // in a 20 meter radius around the object that spawned + // the encounter. + // Later on the total character levels will be compared to + // the challenge rating of the creature spawned, and a number + // of creatures will be determined from that comparison. + if(iEncounterType == ENCOUNTER_TYPE_AREA) + { + oAmIAPC = GetFirstObjectInShape(SHAPE_SPHERE, 20.0, GetLocation(oEncounterObject), FALSE, OBJECT_TYPE_CREATURE); + while(GetIsObjectValid(oAmIAPC)) + { + if(GetIsPC(oAmIAPC)) + { + iLevels = iLevels + GetLevelByPosition(1, oAmIAPC) + GetLevelByPosition(2, oAmIAPC) + GetLevelByPosition(3, oAmIAPC); + if(GetIsObjectValid(GetHenchman(oAmIAPC))) + { + iLevels = iLevels + GetLevelByPosition(1, GetHenchman(oAmIAPC)) + GetLevelByPosition(2, GetHenchman(oAmIAPC)) + GetLevelByPosition(3, GetHenchman(oAmIAPC)); + } + } + oAmIAPC = GetNextObjectInShape(SHAPE_SPHERE, 20.0, GetLocation(oEncounterObject), FALSE, OBJECT_TYPE_CREATURE); + } + } + else if(iEncounterType == ENCOUNTER_TYPE_PARTY) + { + iLevels = GetFactionAverageLevel(oEncounterObject); + } + else if(iEncounterType == ENCOUNTER_TYPE_TOTALPARTYLEVELS) + { + oObject = GetFirstFactionMember(oEncounterObject); + while(GetIsObjectValid(oObject)) + { + if(GetArea(oObject) == GetArea(oEncounterObject)) + { + iLevels = iLevels + GetLevelByPosition(1, oObject) + GetLevelByPosition(2, oObject) + GetLevelByPosition(3, oObject); + } + oObject = GetNextFactionMember(oEncounterObject); + } + } + else + { + // If the variable iEncounterType is set to IND, this + // routine determines the total character levels based upon the + // character level of the object that spawned the encounter. + // if the object that spawned the encounter is NOT a PC then + // the number of creatures spawned will be one. This shouldn't + // happen since the the encounter type sets itself to AREA if + // the encounter object is a placeable. + if(GetIsPC(oEncounterObject)) + { + iLevels = GetLevelByPosition(1, oEncounterObject) + GetLevelByPosition(2, oEncounterObject) + GetLevelByPosition(3, oEncounterObject); + } + } + // Modify the float representing the total levels by the difficulty level. + if(iLevelOverride) + { + iLevels = iLevelOverride; + } + fLevels = IntToFloat(iLevels) * fDifficulty; + +// CHOOSE A CREATURE TO SPAWN + if(GetStringLowerCase(sTemplate) == "random" || GetStringLowerCase(GetStringLeft(sTemplate, 3)) == "re_") + { + if(GetStringLowerCase(GetStringLeft(sTemplate, 3)) == "re_") + { + sTemplate = GetStringRight(sTemplate, GetStringLength(sTemplate) - 3); + } + if(fLevels < 0.25) + { + fMaxCR = 0.25; + } + else + { + fMaxCR = fLevels; + } + fMinCR = IntToFloat(FloatToInt(fMaxCR * 0.3)); + //If there is a definative number of creatures to spawn passed to + //the RandomEncounter function when it is called, then do not + //allow as much play in the low end, and a little more in the + // high end challange ratings. + if(iMinNumberOfCreatures == 0 && iMaxNumberOfCreatures > 1) + { + fMinCR = IntToFloat(FloatToInt(fMaxCR * 0.4)); + fMaxCR = fMaxCR * 1.2; + fMinCR = IntToFloat(FloatToInt(fMinCR)); + } + if(iMinNumberOfCreatures == 0 && iMaxNumberOfCreatures == 1) + { + fMinCR = IntToFloat(FloatToInt(fMaxCR * 0.6)); + fMaxCR = fMaxCR * 1.2; + fMinCR = IntToFloat(FloatToInt(fMinCR));// Round off the CR. + } + if(GetLocalInt(oHolder, "re_bConsiderCR") == FALSE) + { + fMaxCR = 9999.0; + fMinCR = 0.0; + } + sTemplate = GetRndEncCreature(fMinCR, fMaxCR, sTemplate); + if(sTemplate == "") return OBJECT_INVALID; + } + +// DETERMINE IF CREATURE IS TO HAVE TREASURE AND WHAT TABLES TO USE + if(GetLocalString(oMod, "re_s2DATreasure") != "") + { + sTreasure = GetLocalString(oMod, "re_s2DATreasure"); + DeleteLocalString(oMod, "re_s2DATreasure"); + } + for(iCounter5 = 0; iCounter5 <= GetStringLength(sTreasure); iCounter5++) + { + if(bTreasure + && (GetSubString(sTreasure, iCounter5, 1) == "0" || StringToInt(GetSubString(sTreasure, iCounter5, 1)) > 0)) + { + sBuild = sBuild + GetSubString(sTreasure, iCounter5, 1); + } + else if(bTreasure) + { + iTableNumber++; + SetLocalString(OBJECT_SELF, "re_sTreasureTable" + IntToString(iTableNumber), sBuild); + bTreasure = FALSE; + sBuild = ""; + } + if(GetStringLowerCase(GetSubString(sTreasure, iCounter5, 1)) == "t") + { + bTreasure = TRUE; + } + } + +// DETERMINE LOCATION AND SPAWN ONE CREATURE + // NOTE: Line Of Sight checks have a bug. Bioware says they are looking + // into the bug. I have spent an ungodly amount of hours trying to come + // up with an acceptable work-around to the Line Of Sight functionality + // of Get**ObjectInShape(). Unless somebody else can come up with a working + // LOS check, I have no choice but to disregard LOS checks until they are + // fixed. + // + // if(LOSCheck = TRUE) + // { + // + // } + // + // note: one creature is spawned in now so its challange rating can be + // used to determine if more are needed. (if that option is set) + vEncounterVector = AngleToVector(fEncounterAngle); + vVectorOffset = vEncounterVector * fEncounterDistance; + vCreatureVector = vEncounterObjectVector + vVectorOffset; + lCreatureLocation = Location(oArea, vCreatureVector, fCreatureFacing); + oCreature = CreateObject(OBJECT_TYPE_CREATURE, sTemplate, lCreatureLocation, FALSE); + +// VERIFY THE RESREF OF THE SPAWNED CREATURE AGAINST THE TEMPLATE AND RETURN AN ERROR IF THEY DO NOT MATCH + if(GetStringLowerCase(GetResRef(oCreature)) != GetStringLowerCase(sTemplate)) + { + string sError = "BESIE Error: " + sTemplate + " does not match the blueprint of a valid creature object!"; + DestroyObject(oCreature); + if(GetIsPC(oEncounterObject)) SendMessageToPC(oEncounterObject, sError); + else + { + object oPC = GetFirstPC(); + while(GetIsObjectValid(oPC)) + { + if(GetArea(oPC) == GetArea(oEncounterObject)) SendMessageToPC(oPC, sError); + oPC = GetNextPC(); + } + } + SendMessageToAllDMs(sError); + WriteTimestampedLogEntry(sError); + return OBJECT_INVALID; + } + +// DETERMINE THE NUMBER OF ADDITIONAL CREATURES TO SPAWN. + // If the min and max number of creatures in the function call are zero + // then get the min and max number from the local variables in the module + // object. + if(iMinNumberOfCreatures == 0 && iMaxNumberOfCreatures == 0) + { + iMinNumberOfCreatures = GetLocalInt(oMod, "re_iMinNumberOfCreatures"); + iMaxNumberOfCreatures = GetLocalInt(oMod, "re_iMaxNumberOfCreatures"); + } + // Now that we are done with these local integers, we need to clean reset + // them to their defaults so we don't accidentally use old numbers later. + SetLocalInt(oMod, "re_iMinNumberOfCreatures", 0); + SetLocalInt(oMod, "re_iMaxNumberOfCreatures", 0); + if(iMinNumberOfCreatures == 0 && iMaxNumberOfCreatures != 0) + { + iNumberOfCreatures = iMaxNumberOfCreatures; + } + if(iMinNumberOfCreatures != 0 && iMaxNumberOfCreatures != 0) + { + iNumberOfCreatures = iMinNumberOfCreatures + Random((iMaxNumberOfCreatures - iMinNumberOfCreatures) + 1); + } + if(iMinNumberOfCreatures == 0 && iMaxNumberOfCreatures == 0) + { + // This is the routine that sets the number of creatures to spawn + // based on their challenge rating and the total character levels. + // It chooses a random number between one half (truncated) and 120 + // percent (1 for every 4) of the number of creatures ideal for the + // difficulty level set. + iMaxNumberOfCreatures = FloatToInt(fLevels / GetChallengeRating(oCreature)); + iMinNumberOfCreatures = FloatToInt(IntToFloat(iMaxNumberOfCreatures) * 0.5); + iMaxNumberOfCreatures = FloatToInt(IntToFloat(iMaxNumberOfCreatures) * 1.25); + + //These lines were added with the v1.7 release because I noticed a situation where characters of + //up to level 4 would still spawn orcs, goblins and other < CR1 creatures but they would + //spawn a rediculous amount of them because of the low CR/LV ratio. This is just to eliminate + //that. + if(iMinNumberOfCreatures > 8) iMinNumberOfCreatures = 8; + if(iMaxNumberOfCreatures > 9) iMaxNumberOfCreatures = 9; + + iNumberOfCreatures = iMinNumberOfCreatures + Random((iMaxNumberOfCreatures - iMinNumberOfCreatures) + 1); + if((iNumberOfCreatures < 1) && (iLevels > 0)) + { + iNumberOfCreatures = 1; + } + } + +// SPAWN THOSE SUCKERS! + while(iCounter1 <= iNumberOfCreatures) + { + // Stick some labels on the creature for record keeping and reference (future use!) + SetLocalInt(oCreature, "re_bRandomEncounter", TRUE); + SetLocalObject(oCreature, "re_oRandomEncounterSpawner", oEncounterObject); + SetLocalInt(oCreature, "re_iRandomEncounterCounter", 1); + SetLocalInt(oCreature, "re_iRandomEncounterSpawnTime", (GetCalendarYear() * iYr) + (GetCalendarMonth() * iMth) + (GetCalendarDay()* iDay) + (GetTimeHour()* iHr) + (GetTimeMinute() * iMin) + GetTimeSecond()); + SetLocalInt(oCreature, "re_iRandomEncounterLifeTime", iLifeTime); + /*------------------------- + This routine was removed in v1.8 because the standard treasure tables were removed and replaced + with a routine that simply awards an appropriate amount of coin. + if(!GetLocalInt(GetModule(), "re_standardtable") + || (GetLocalInt(GetModule(), "re_standardtable") && iCounter1 < 4)) + // The preceding if statement looks for a local variable set by the + // standard treasure table included with BESIE. If this variable is + // set then it halts execution of the treasure script after the first + // 3 creatures. This prevents a Too Many Instructions error. + { + DeleteLocalInt(GetModule(), "re_standardtable"); //delete standard table int so as not to interfere with custom scripts. + */ + // Give treasure to the creature if any tables are set. + for(iCounter6 = 1; iCounter6 <= iTableNumber; iCounter6++) + { + ExecuteScript("re_treasure" + GetLocalString(OBJECT_SELF, "re_sTreasureTable" + IntToString(iCounter6)), oCreature); + } + //} + if(iCounter1 < iNumberOfCreatures) + { + oCreature = CreateObject(OBJECT_TYPE_CREATURE, sTemplate, lCreatureLocation, FALSE); + } + iCounter1++; + // Determine the facing of the next creature + if(iFacingSameWay == FALSE) + { + fCreatureFacing = IntToFloat(Random(360)); + lCreatureLocation = Location(oArea, vCreatureVector, fCreatureFacing); + } + } + // Stick a lable on the spawning object for record keeping and reference (future use?) + SetLocalObject(oEncounterObject, "re_oLastRandomEncounterSpawned", oCreature); + return oCreature; +} + + + +void CleanHouse(int bDestroyPlotItems = FALSE, object oArea = OBJECT_SELF, int iSpawnOverride = 0, int iItemOverride = 0, int iBodyBagOverride = 0) +{ +// GET THE TIME SCALE FOR THE MODULE + int iMph; + if(!GetLocalInt(GetModule(), "re_iMph")) + { + iMph = 2; + } + else + { + iMph = GetLocalInt(GetModule(), "re_iMph"); + } + +// DECLARE AND INTIALIZE VARIABLES + int iMin = 60; + int iHr = iMin * iMph; + int iDay = iHr * 24; + int iMth = iDay * 28; + int iYr = iMth * 12; + int bShouldIKillHim = TRUE; + int iLifeTime; + int iItemLifeTime; + int iBodyBagLifeTime; + int iPresentTime = (GetCalendarYear() * iYr) + (GetCalendarMonth() * iMth) + (GetCalendarDay() * iDay) + (GetTimeHour() * iHr) + (GetTimeMinute() * iMin) + GetTimeSecond(); + object oObject; + + +// GET EACH OBJECT IN THE AREA AND TEST FOR VALIDITY + //The following assignment uses a peculiar property of the GetArea() function in that if the GetArea() function + //is called on an area then the area is returned. So the oArea parameter of the CleanHouse function can be set + //to an area or an object within that area and the function will work. (unless and/or until this is changed). + object oAmIASpawn = GetFirstObjectInArea(GetArea(oArea)); + while(GetIsObjectValid(oAmIASpawn)) + { + // IS IT A BODY BAG? + if(GetTag(oAmIASpawn) == "BodyBag" && !GetLocalInt(oAmIASpawn, "re_bDroppedItem")) + { + SetLocalInt(oAmIASpawn, "re_bDroppedItem", TRUE); + SetLocalInt(oAmIASpawn, "re_iDropTime", iPresentTime); + object oItem = GetFirstItemInInventory(oAmIASpawn); + while(GetIsObjectValid(oItem)) + { + if(GetLocalInt(oItem, "bItemForGold")) DestroyObject(oItem); + oItem = GetNextItemInInventory(oAmIASpawn); + } + } + // IS IT A DROPPED ITEM? + if(GetLocalInt(oAmIASpawn, "re_bDroppedItem")) + { + // HAS IT BEEN AROUND TOO LONG? + if(iItemOverride) + { + iItemLifeTime = iItemOverride; + } + else + { + iItemLifeTime = 1800; + } + if(iBodyBagOverride) + { + iBodyBagLifeTime = iBodyBagOverride; + } + else + { + iBodyBagLifeTime = 300; + } + if((iPresentTime - GetLocalInt(oAmIASpawn, "re_iDropTime") > iItemLifeTime && GetTag(oAmIASpawn) != "BodyBag") || (iPresentTime - GetLocalInt(oAmIASpawn, "re_iDropTime") > iBodyBagLifeTime && GetTag(oAmIASpawn) == "BodyBag"))// && !GetPlotFlag(oAmIASpawn)) + { + if(GetHasInventory(oAmIASpawn)) + { + oObject = GetFirstItemInInventory(oAmIASpawn); + while(GetIsObjectValid(oObject)) + { + if(!GetPlotFlag(oObject) || bDestroyPlotItems) + { + DestroyObject(oObject, 0.0); + } + oObject = GetNextItemInInventory(oAmIASpawn); + } + } + if(!GetPlotFlag(oAmIASpawn) || bDestroyPlotItems) + { + DestroyObject(oAmIASpawn, 0.0); + } + } + } + // IS HE IS A RANDOM ENCOUNTER? + if(GetLocalInt(oAmIASpawn, "re_bRandomEncounter")) + { + // HAS HE BEEN AROUND TOO LONG? + if(iSpawnOverride) + { + iLifeTime = iSpawnOverride; + } + else + { + iLifeTime = GetLocalInt(oAmIASpawn, "re_iRandomEncounterLifeTime"); + } + if(iPresentTime - GetLocalInt(oAmIASpawn, "re_iRandomEncounterSpawnTime") > iLifeTime) + { + // IS HE IN COMBAT? + if(!GetIsInCombat(oAmIASpawn)) + { + // GET EACH PC AND TEST IF THE CREATURE SEES HIM + // Note: this is because the creature might be charmed + // or influenced not to attack the PCs by other means. + object oPC = GetFirstPC(); + if(GetIsObjectValid(oPC)) + { + while(GetIsObjectValid(oPC)) + { + if(GetObjectSeen(oPC, oAmIASpawn)) + { + bShouldIKillHim = FALSE; + } + oPC = GetNextPC(); + } + } + // IF THE CREATURE HAS PASSED ALL OF THESE CHECKS, DESTROY HIM. + if(bShouldIKillHim) + { + if(!GetIsPC(oAmIASpawn)) //This is prevent despawning of creatures while possessed by a DM. + { + DestroyObject(oAmIASpawn, 0.0); + } + } + } + } + } + oAmIASpawn = GetNextObjectInArea(oArea); + } +} + +//GET TIME IN SECONDS FUNCTION +int GetTimeInSeconds(int iMph = 2) +{ + if(!iMph) iMph = GetLocalInt(GetModule(), "re_iMph"); + int iMin = 60; + int iHr = iMin * iMph; + int iDay = iHr * 24; + int iMth = iDay * 28; + int iYr = iMth * 12; + int iPresentTime = (GetCalendarYear() * iYr) + (GetCalendarMonth() * iMth) + (GetCalendarDay() * iDay) + (GetTimeHour() * iHr) + (GetTimeMinute() * iMin) + GetTimeSecond(); + return iPresentTime; +} + +location RandomWalk2(location lCenter, int iDistance = 20, object oCreature = OBJECT_SELF) +{ + vector vVector; + vector vVectorOffset; + vector vFinalVector; + location lLocation; + object oArea = GetAreaFromLocation(lCenter); + object oWaypoint; + int nLocationValid = 0; + float fDistanceToDoor; + object oDoor; + // determine location of invisible object to be used as target of ActionMoveToLocation command + // if object is too near a door, location will be changed + while (nLocationValid != 1) + { + // determine random location of invisible object to be placed as target of walk command + float fAngle = IntToFloat(Random(360)); + float fDistance = IntToFloat(Random(iDistance) + 1); + vVector = AngleToVector(fAngle); + vVectorOffset = vVector * fDistance; + vFinalVector = GetPositionFromLocation(lCenter) + vVectorOffset; + lLocation = Location(oArea, vFinalVector, fAngle); + // check distance for nearest door, set LocationValid flag if beyond 1 meter + oWaypoint = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", lLocation); + oDoor = GetNearestObject(OBJECT_TYPE_DOOR, oWaypoint); + fDistanceToDoor = GetDistanceBetween (oWaypoint, oDoor); + if (fDistanceToDoor > 1.0) + nLocationValid = 1; // terminates loop with current oWaypoint if door further away than 1 meter + } + lLocation = GetLocation(oWaypoint); + AssignCommand(oCreature, ActionDoCommand(ActionMoveToLocation(lLocation))); + DestroyObject(oWaypoint); + return lLocation; + +} diff --git a/gamma_age_v2/re_sc_dialogue1.ncs b/gamma_age_v2/re_sc_dialogue1.ncs new file mode 100644 index 0000000000000000000000000000000000000000..ee85eb73e7bda4ee455f7466cf0f72ef60a29fc4 GIT binary patch literal 117 zcmeZs4ps;=)H85mU|=X^VwM9^3>*p!EUXNinJ$@$Ir-_OsVr9V*p!EUXNinJ$@$Ir-_OsVr9V*p!EUXNinJ$@$Ir-_OsVr9V*p!EUXNinJ$@$Ir-_OsVr9V kL5W!&B&Go7GcYp#|Ns971B)~Rkp3f!kYU6k!=}Ih0D8U{8vp*p!EUXNinJ$@$Ir-_OsVr9V*p!EUXNinJ$@$Ir-_OsVr9VbrU2$MFf#uC|NjRAi!=j}{v(T!VZ*p!EUXNinJ$@$Ir-_OsVr9V*p!EUXNinJ$@$Ir-_OsVr9VOV literal 0 HcmV?d00001 diff --git a/gamma_age_v2/re_sc_dialogue7.nss b/gamma_age_v2/re_sc_dialogue7.nss new file mode 100644 index 00000000..1dea13cb --- /dev/null +++ b/gamma_age_v2/re_sc_dialogue7.nss @@ -0,0 +1,16 @@ +//:://///////////////////////////////////////////// +//:: FileName sc_dialogue1 +//::////////////////////////////////////////////// +//::////////////////////////////////////////////// +//:: Created By: Script Wizard +//:: Created On: 5/16/2003 9:32:45 PM +//::////////////////////////////////////////////// +int StartingConditional() +{ + + // Inspect local variables + if(!(GetLocalInt(OBJECT_SELF, "iDialogue") == 7)) + return FALSE; + + return TRUE; +} diff --git a/gamma_age_v2/re_sc_dialogue8.ncs b/gamma_age_v2/re_sc_dialogue8.ncs new file mode 100644 index 0000000000000000000000000000000000000000..6d08087da9e477411542f87f62d587d0c143b6eb GIT binary patch literal 148 zcmeZs4ps;=)H85mU|^WS#4HD-7&sIdSXdc2GhH$hbMn(mQ(4$RqO1%I#!M{CAbD;D zC1!b$m;#v3z{vRj|NkEhEYb`>`j0F~#vW(_Yq4KqE<(2{ST~0QD+8kp#2`j28rc*W E00Iyj82|tP literal 0 HcmV?d00001 diff --git a/gamma_age_v2/re_sc_dialogue8.nss b/gamma_age_v2/re_sc_dialogue8.nss new file mode 100644 index 00000000..7667505b --- /dev/null +++ b/gamma_age_v2/re_sc_dialogue8.nss @@ -0,0 +1,17 @@ +//:://///////////////////////////////////////////// +//:: FileName sc_dialogue1 +//::////////////////////////////////////////////// +//::////////////////////////////////////////////// +//:: Created By: Script Wizard +//:: Created On: 5/16/2003 9:32:45 PM +//::////////////////////////////////////////////// +int StartingConditional() +{ + // Inspect local variables + if(!(GetLocalInt(OBJECT_SELF, "iDialogue") == 8)) + { + return FALSE; + } + SetCustomToken(2112, GetLocalString(OBJECT_SELF, "sName")); + return TRUE; +} diff --git a/gamma_age_v2/re_sc_dialogue9.ncs b/gamma_age_v2/re_sc_dialogue9.ncs new file mode 100644 index 0000000000000000000000000000000000000000..fc87aa1448ac38d363fce3aa4206179b7d3e1160 GIT binary patch literal 117 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 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/re_spawnerhb.nss b/gamma_age_v2/re_spawnerhb.nss new file mode 100644 index 00000000..b0803969 --- /dev/null +++ b/gamma_age_v2/re_spawnerhb.nss @@ -0,0 +1,108 @@ +//::///////////////////////////////////////////////////////////////// +//:: FileName re_spawnerhb +//:: Copyright (c) 2001 Bioware Corp. +//::///////////////////////////////////////////////////////////////// +/* +This script is used in the heartbeat of the +BESIE RES tool, part of the BESIE Random +Encounter package by Ray Miller. +*/ +//::///////////////////////////////////////////////////////////////// +//:: Created By: Ray Miller +//:: Created On: 9-2-02 +//::///////////////////////////////////////////////////////////////// +#include "re_rndenc" +void main() +{ +///////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////// +//Set this parameter to FALSE if you wish +//your encounter distances to be constant +int RandomDistance = TRUE; +/////////////////////////////////////////////////////////// +/* +If you want a BESIE RES tool to start and stop spawning +creatures at particular game times, set the following variables +to the appropriate times and save the script under a different +name. You could also set the local integers "re_iBegin" and +"re_iEnd" on the spawner externally if you wanted. +*/ +int StartTime = 0; +int StopTime = 0; +/////////////////////////////////////////////////////////// + + float fChanceOfEncounter; + if(StartTime || StopTime) + { + SetLocalInt(OBJECT_SELF, "re_iBegin", StartTime); + SetLocalInt(OBJECT_SELF, "re_iEnd", StopTime); + } + if(GetLocalInt(OBJECT_SELF, "re_iBegin") > 23) SetLocalInt(OBJECT_SELF, "re_iBegin", 23); + if(GetLocalInt(OBJECT_SELF, "re_iEnd") > 23) SetLocalInt(OBJECT_SELF, "re_iEnd", 23); + if(!GetLocalInt(OBJECT_SELF, "re_BESIE")) + { + SetLocalInt(OBJECT_SELF, "re_BESIE", TRUE); + SetLocalString(OBJECT_SELF, "re_ToolType", "BESIE RES"); + } + if(GetLocalInt(GetModule(), "re_disableBESIERES") || GetLocalInt(GetArea(OBJECT_SELF), "re_disableBESIERES") || GetLocalInt(OBJECT_SELF, "re_disable")) + { + if(!GetIsObjectValid(GetLocalObject(GetArea(OBJECT_SELF), "re_oHouseCleaner"))) SetLocalObject(GetArea(OBJECT_SELF), "re_oHouseCleaner", OBJECT_SELF); + if(GetLocalObject(GetArea(OBJECT_SELF), "re_oHouseCleaner") == OBJECT_SELF) CleanHouse(); + return; + } + int iStartTime = GetLocalInt(OBJECT_SELF, "re_iBegin"); + int iStopTime = GetLocalInt(OBJECT_SELF, "re_iEnd"); + if((iStartTime <= iStopTime && (GetTimeHour() >= iStartTime && GetTimeHour() < iStopTime)) + || (iStartTime >= iStopTime && (GetTimeHour() >= iStartTime || GetTimeHour() < iStopTime))) + fChanceOfEncounter = IntToFloat(GetMaxHitPoints(OBJECT_SELF)) / 100; + else fChanceOfEncounter = 0.0; + int iFaction; + int iCounterX; + object oEncounterObject; + object oArea = GetArea(OBJECT_SELF); + object oPC = GetFirstPC(); + while(GetIsObjectValid(oPC)) + { + if(GetArea(oPC) == oArea) + { + string sLeader = GetPCPlayerName(GetFactionLeader(oPC)) + GetName(GetFactionLeader(oPC)); + if(!GetLocalInt(OBJECT_SELF, "i" + sLeader)) + { + iFaction++; + SetLocalString(OBJECT_SELF, "sFaction" + IntToString(iFaction), sLeader); + } + SetLocalInt(OBJECT_SELF, "i" + sLeader, GetLocalInt(OBJECT_SELF, "i" + sLeader) + 1); + SetLocalObject(OBJECT_SELF, "o" + sLeader + IntToString(GetLocalInt(OBJECT_SELF, "i" + sLeader)), oPC); + } + oPC = GetNextPC(); + } + if(!GetIsObjectValid(GetLocalObject(GetArea(OBJECT_SELF), "re_oHouseCleaner"))) SetLocalObject(GetArea(OBJECT_SELF), "re_oHouseCleaner", OBJECT_SELF); + if(GetLocalObject(GetArea(OBJECT_SELF), "re_oHouseCleaner") == OBJECT_SELF) CleanHouse(); + if(!iFaction) return; + string sLeader = GetLocalString(OBJECT_SELF, "sFaction" + IntToString(Random(iFaction) + 1)); + int iMember = Random(GetLocalInt(OBJECT_SELF, "i" + sLeader)) + 1; + oEncounterObject = GetLocalObject(OBJECT_SELF, "o" + sLeader + IntToString(iMember)); + for(iCounterX = 1; iCounterX <= iFaction; iCounterX++) + { + DeleteLocalInt(OBJECT_SELF, "i" + GetLocalString(OBJECT_SELF, "sFaction" + IntToString(iCounterX))); + DeleteLocalString(OBJECT_SELF, "sFaction" + IntToString(iCounterX)); + } + string sTemplate = GetTag(OBJECT_SELF); + int iNumberOfParties; + int iMinDistance = RandomDistance; + int iDifficulty = GetFortitudeSavingThrow(OBJECT_SELF); + int iCheckDistance = GetReflexSavingThrow(OBJECT_SELF); + int iMaxDistance = GetWillSavingThrow(OBJECT_SELF); + + // Return if the resting variable is set by the re_onrest script. + if(GetLocalInt(oEncounterObject, "re_resting")) return; + + if(!iMaxDistance) + { + iMaxDistance = 1; + } + if(GetStringLeft(sTemplate, 3) != "re_") + sTemplate = "random"; + fChanceOfEncounter = IntToFloat(iFaction) * fChanceOfEncounter; + RandomEncounter(fChanceOfEncounter, oEncounterObject, sTemplate, 0, 0, iMinDistance, iMaxDistance, 360, 0, iCheckDistance, 0, iDifficulty); +} diff --git a/gamma_age_v2/re_spawnerhb_v2.ncs b/gamma_age_v2/re_spawnerhb_v2.ncs new file mode 100644 index 0000000000000000000000000000000000000000..7c85071f46bd228d57dda43928293f404669767b GIT binary patch literal 49269 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 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/re_spawnerhb_v2.nss b/gamma_age_v2/re_spawnerhb_v2.nss new file mode 100644 index 00000000..ea00a317 --- /dev/null +++ b/gamma_age_v2/re_spawnerhb_v2.nss @@ -0,0 +1,93 @@ +//::///////////////////////////////////////////////////////////////// +//:: FileName re_spawnerhb +//:: Copyright (c) 2001 Bioware Corp. +//::///////////////////////////////////////////////////////////////// +/* +This script is used in the heartbeat of the +BESIE MMORPG Spawner tool, part of the BESIE Random +Encounter package by Ray Miller. +*/ +//::///////////////////////////////////////////////////////////////// +//:: Created By: Ray Miller +//:: Created On: 9-2-02 +//::///////////////////////////////////////////////////////////////// +#include "re_rndenc" +void main() +{ +///////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////// +//Set this parameter to FALSE if you wish +//your encounter distances to be constant +// +int RandomDistance = FALSE +// +///////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////// +/* +if you don't want a DM possessed NPC to produce spawns, +insert the following code into your module OnClientEnter +handler. + +if(GetIsDM(GetEnteringObject())) SetLocalInt(GetModule(), "re_" + GetName(GetEnteringObject()), TRUE); +else DeleteLocalInt(GetModule(), "re_" + GetName(GetEnteringObject())); +*/ +///////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////// + ; + float fChanceOfEncounter = IntToFloat(GetMaxHitPoints(OBJECT_SELF)) / 100; + int iFaction; + int iCounterX; + object oEncounterObject; + object oArea = GetArea(OBJECT_SELF); + object oPC = GetFirstPC(); + while(GetIsObjectValid(oPC)) + { + if(GetArea(oPC) == oArea) + { + string sLeader = GetPCPlayerName(GetFactionLeader(oPC)) + GetName(GetFactionLeader(oPC)); + if(!GetLocalInt(OBJECT_SELF, "i" + sLeader)) + { + iFaction++; + SetLocalString(OBJECT_SELF, "sFaction" + IntToString(iFaction), sLeader); + } + SetLocalInt(OBJECT_SELF, "i" + sLeader, GetLocalInt(OBJECT_SELF, "i" + sLeader) + 1); + SetLocalObject(OBJECT_SELF, "o" + sLeader + IntToString(GetLocalInt(OBJECT_SELF, "i" + sLeader)), oPC); + } + oPC = GetNextPC(); + } + CleanHouse(); + if(!iFaction) return; + string sLeader = GetLocalString(OBJECT_SELF, "sFaction" + IntToString(Random(iFaction) + 1)); + int iMember = Random(GetLocalInt(OBJECT_SELF, "i" + sLeader)) + 1; + oEncounterObject = GetLocalObject(OBJECT_SELF, "o" + sLeader + IntToString(iMember)); + for(iCounterX = 1; iCounterX <= iFaction; iCounterX++) + { + DeleteLocalInt(OBJECT_SELF, "i" + GetLocalString(OBJECT_SELF, "sFaction" + IntToString(iCounterX))); + DeleteLocalString(OBJECT_SELF, "sFaction" + IntToString(iCounterX)); + } + string sTemplate = GetTag(OBJECT_SELF); + int iNumberOfParties; + int iOrientation = 0; + int iMinDistance = RandomDistance; + int iDifficulty = GetFortitudeSavingThrow(OBJECT_SELF); + int iChanceFromBehind = GetReflexSavingThrow(OBJECT_SELF); + int iMaxDistance = GetWillSavingThrow(OBJECT_SELF); + if(!GetLocalInt(oEncounterObject, "bInitialized")) + { + SetRndEncProperties(oEncounterObject, iDifficulty, TRUE, sTemplate, 180, 2, ENCOUNTER_TYPE_AREA); + } + if(!iMaxDistance) + { + iMaxDistance = 1; + } + if(GetStringLeft(sTemplate, 3) != "re_") + sTemplate = "random"; + fChanceOfEncounter = IntToFloat(iFaction) * fChanceOfEncounter; + if((Random(99) + 1) < iChanceFromBehind) + { + iOrientation = 180; + iMaxDistance = 2; + } + RandomEncounter(fChanceOfEncounter, oEncounterObject, sTemplate, 0, 0, iMinDistance, iMaxDistance, iOrientation, 30); +} diff --git a/gamma_age_v2/re_table.nss b/gamma_age_v2/re_table.nss new file mode 100644 index 00000000..1f674c57 --- /dev/null +++ b/gamma_age_v2/re_table.nss @@ -0,0 +1,1923 @@ +//:://///////////////////////////////////////////// +//:: Name +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* +This script represents the standard encounter table +for the BESIE Random Encounter System By Ray Miller. +It is meant to be used as an include, and will not +compile on its own. +*/ +//::////////////////////////////////////////////// +//:: Created By: Ray Miller +//:: Created On: God knows. I wrote this months ago! +//::////////////////////////////////////////////// + + +string GetRndEncCreature(float fMinCR = 0.0, float fMaxCR = 9999.0, string sCreatureTable = "") +{ +// IF NOT INITIALIZED THEN DO SO + /*if(!GetLocalInt(GetModule(), "re_bInitialized")) + { + SetRndEncProperties(); + }*/ + +// DECLARE AND INTIALIZE VARIABLES + object oMod = GetModule(); + string sChoice = "nil"; + string sBuild; + int bCustom; + int iCounter1; + int iCounter2 = 0; + int iCounter3; + int iVarNum; + float fCR; + if (fMinCR > 18.0) fMinCR = 18.0; + sCreatureTable = GetStringLowerCase(sCreatureTable); + if(GetStringLeft(sCreatureTable, 8) == "commoner") sCreatureTable = "z" + GetStringRight(sCreatureTable, GetStringLength(sCreatureTable) - 8); + +/* The following code was added with v1.8. It checks to see if the template contains the string '2da' +if so it checks to ensure the tag name matches the file name of a 2DA file by looking for the 'TableLength' +parameter on Row 0. If it is present, a check is made to ensure that the parameter is correct. If so, the +standard or 'old style' table will be ignored and this routine will draw an encounter from the 2da file. */ + if(GetStringLeft(sCreatureTable, 3) == "2da") + { + string s2DAMatch = "re_" + GetStringRight(GetStringLowerCase(sCreatureTable), GetStringLength(sCreatureTable) - 4); + int iTableLength = StringToInt(Get2DAString(s2DAMatch, "TableLength", 0)); + if(iTableLength && Get2DAString(s2DAMatch, "ResRef", iTableLength) != "" && Get2DAString(s2DAMatch, "ResRef", iTableLength + 1) == "") + { + int iRnd = Random(iTableLength) + 1; + string sTreasure = Get2DAString(s2DAMatch, "Treasure", iRnd); + int iMinimum = StringToInt(Get2DAString(s2DAMatch, "Minimum", iRnd)); + int iMaximum = StringToInt(Get2DAString(s2DAMatch, "Maximum", iRnd)); + if(!iMinimum && !iMaximum) iMaximum = 1; + SetLocalInt(oMod, "re_iMinNumberOfCreatures", iMinimum); + SetLocalInt(oMod, "re_iMaxNumberOfCreatures", iMaximum); + string sCreature = Get2DAString(s2DAMatch, "ResRef", iRnd); + if(sTreasure != "") SetLocalString(GetModule(), "re_s2DATreasure", sTreasure); + return sCreature; + } + else + { + string sError = "BESIE error: 2DA Table " + s2DAMatch + " is not present or is invalid!"; + object oPC = GetFirstPC(); + SendMessageToAllDMs(sError); + while(GetIsObjectValid(oPC)) + { + SendMessageToPC(oPC, sError); + oPC = GetNextPC(); + } + WriteTimestampedLogEntry(sError); + return ""; + } + } + +// PICK RANDOM ABERRATION + for(iCounter1 = 0; iCounter1 <= GetStringLength(sCreatureTable); iCounter1++) + { + if(GetSubString(sCreatureTable, iCounter1, 1) == "n") + { + while(sChoice != "") + { + switch(iCounter2) + { + case 0:sChoice = "NW_BATTDEVOUR"; + fCR = 11.0; + break; + + case 1:sChoice = "X2_BEHOLDER001"; + fCR = 11.0; + break; + + case 2:sChoice = "X2_BEHOLDER003"; + fCR = 15.0; + break; + + case 3:sChoice = "X2_DRIDER001"; + fCR = 6.0; + break; + + case 4:sChoice = "X2_DRIDER002"; + fCR = 10.0; + break; + + case 5:sChoice = "X2_DRIDER003"; + fCR = 17.0; + break; + + case 6:sChoice = "X2_DRIDER004"; + fCR = 23.0; + break; + + case 7:sChoice = "X2_DRIDER005"; + fCR = 28.0; + break; + + case 8:sChoice = "X2_FDRIDER002"; + fCR = 7.0; + break; + + case 9:sChoice = "X2_DRIDERW01"; + fCR = 8.0; + break; + + case 10:sChoice = "NW_ETTERCAP"; + fCR = 5.0; + break; + + case 11:sChoice = "X2_BEHOLDER002"; + fCR = 3.0; + break; + + case 12:sChoice = "X2_FDRIDER001"; + fCR = 6.0; + break; + + case 13:sChoice = "NW_HORROR"; + fCR = 5.0; + break; + + case 14:sChoice = "NW_DEVOUR"; + fCR = 7.0; + break; + + case 15:sChoice = "X2_MINDFLAYER001"; + fCR = 9.0; + break; + + case 16:sChoice = "X2_MINDFDARKENER"; + fCR = 16.0; + break; + + case 17:sChoice = "X2_MINDFVENERATR"; + fCR = 20.0; + break; + + case 18:sChoice = "X2_MINDFLAYER002"; + fCR = 19.0; + break; + + case 19:sChoice = "NW_UMBERHULK"; + fCR = 9.0; + break; + + case 20:sChoice = "NW_WILLOWISP"; + fCR = 8.0; + break; + + case 21:sChoice = ""; + fCR = 0.0; + break; + } + if(fCR >= fMinCR && fCR <= fMaxCR && sChoice != "") + { + SetLocalString(oMod, "re_sCreatureList" + IntToString(iVarNum), sChoice); + iVarNum++; + } + iCounter2++; + } + } + } + + +// PICK RANDOM ANIMAL + for(iCounter1 = 0; iCounter1 <= GetStringLength(sCreatureTable); iCounter1++) + { + if(GetSubString(sCreatureTable, iCounter1, 1) == "a") + { + while(sChoice != "") + { + switch(iCounter2) + { + case 0:sChoice = "NW_BEARDIREBOSS"; + fCR = 15.0; + break; + + case 1:sChoice = "NW_BEARBLCK"; + fCR = 2.0; + break; + + case 2:sChoice = "NW_BEARBRWN"; + fCR = 5.0; + break; + + case 3:sChoice = "NW_BEARDIRE"; + fCR = 9.0; + break; + + case 4:sChoice = "NW_BEARKODIAK"; + fCR = 6.0; + break; + + case 5:sChoice = "NW_BEARPOLAR"; + fCR = 6.0; + break; + + case 6:sChoice = "NW_BEASTMALAR001"; + fCR = 7.0; + break; + + case 7:sChoice = "NW_DIREWOLF"; + fCR = 5.0; + break; + + case 8:sChoice = "NW_WOLFDIREBOSS"; + fCR = 11.0; + break; + + case 9:sChoice = "NW_WOLFWINT"; + fCR = 5.0; + break; + + case 10:sChoice = "NW_WOLF"; + fCR = 1.0; + break; + + case 11:sChoice = "NW_WORG"; + fCR = 3.0; + break; + + case 12:sChoice = "NW_COUGAR"; + fCR = 2.0; + break; + + case 13:sChoice = "NW_CRAGCAT"; + fCR = 2.0; + break; + + case 14:sChoice = "NW_DIRETIGER"; + fCR = 11.0; + break; + + case 15:sChoice = "NW_JAGUAR"; + fCR = 3.0; + break; + + case 16:sChoice = "NW_CAT"; + fCR = 2.0; + break; + + case 17:sChoice = "NW_LION"; + fCR = 3.0; + break; + + case 18:sChoice = "NW_PANTHER"; + fCR = 2.0; + break; + + case 19:sChoice = "NW_BADGER"; + fCR = 0.5; + break; + + case 20:sChoice = "NW_BOAR"; + fCR = 2.0; + break; + + case 21:sChoice = "NW_DIREBADG"; + fCR = 3.0; + break; + + case 22:sChoice = "NW_BOARDIRE"; + fCR = 5.0; + break; + + case 23:sChoice = "NW_RAT001"; + fCR = 0.12; + break; + + case 24:sChoice = "NW_RATDIRE001"; + fCR = 0.33; + break; + + case 25:sChoice = ""; + fCR = 0.0; + break; + } + if(fCR >= fMinCR && fCR <= fMaxCR && sChoice != "") + { + SetLocalString(oMod, "re_sCreatureList" + IntToString(iVarNum), sChoice); + iVarNum++; + } + iCounter2++; + } + } + } +// PICK RANDOM CONSTRUCT + for(iCounter1 = 0; iCounter1 <= GetStringLength(sCreatureTable); iCounter1++) + { + if(GetSubString(sCreatureTable, iCounter1, 1) == "c") + { + iCounter2 = 0; //Reset the counter + sChoice = "nil"; //Reset sChoice + while(sChoice != "") + { + switch(iCounter2) + { + case 0:sChoice = "NW_BATHORROR"; + fCR = 13.0; + break; + + case 1:sChoice = "NW_GolBone"; + fCR = 11.0; + break; + + case 2:sChoice = "NW_GolClay"; + fCR = 10.0; + break; + + case 3:sChoice = "NW_GOLFLESH"; + fCR = 8.0; + break; + + case 4:sChoice = "NW_HELMHORR"; + fCR = 11.0; + break; + + case 5:sChoice = "NW_GOLIRON"; + fCR = 16.0; + break; + + case 6:sChoice = "NW_MINOGON"; + fCR = 8.0; + break; + + case 7:sChoice = "NW_SHGUARD"; + fCR = 13.0; + break; + + case 8:sChoice = "NW_GOLSTONE"; + fCR = 12.0; + break; + + case 9:sChoice = "X2_GOLEM002"; + fCR = 32.0; + break; + + case 10:sChoice = "nw_goldmflesh001"; + fCR = 25.0; + break; + + case 11:sChoice = "X2_GOLIRON_HUGE"; + fCR = 21.0; + break; + + case 12:sChoice = "X2_GOLEM001"; + fCR = 35.0; + break; + + case 13:sChoice = ""; + fCR = 0.0; + break; + } + if(fCR >= fMinCR && fCR <= fMaxCR && sChoice != "") + { + SetLocalString(oMod, "re_sCreatureList" + IntToString(iVarNum), sChoice); + iVarNum++; + } + iCounter2++; + } + } + } +// PICK RANDOM DRAGON + for(iCounter1 = 0; iCounter1 <= GetStringLength(sCreatureTable); iCounter1++) + { + if(GetSubString(sCreatureTable, iCounter1, 1) == "d") + { + iCounter2 = 0; //Reset the counter + sChoice = "nil"; //Reset sChoice + while(sChoice != "") + { + switch(iCounter2) + { + case 0:sChoice = "NW_DRGBLACK001"; + fCR = 13.0; + break; + + case 1:sChoice = "NW_DRGBLUE001"; + fCR = 14.0; + break; + + case 2:sChoice = "NW_DRGGREEN001"; + fCR = 14.0; + break; + + case 3:sChoice = "NW_DRGRED001"; + fCR = 15.0; + break; + + case 4:sChoice = "NW_DRGWHITE001"; + fCR = 12.0; + break; + + case 5:sChoice = "NW_DRGBLACK002"; + fCR = 17.0; + break; + + case 6:sChoice = "NW_DRGBLUE002"; + fCR = 18.0; + break; + + case 7:sChoice = "NW_DRGGREEN002"; + fCR = 18.0; + break; + + case 8:sChoice = "NW_DRGRED002"; + fCR = 19.0; + break; + + case 9:sChoice = "NW_DRGWHITE002"; + fCR = 16.0; + break; + + case 10:sChoice = "NW_DRGBLACK003"; + fCR = 21.0; + break; + + case 11:sChoice = "NW_DRGBLUE003"; + fCR = 23.0; + break; + + case 12:sChoice = "NW_DRGGREEN003"; + fCR = 23.0; + break; + + case 13:sChoice = "NW_DRGRED003"; + fCR = 25.0; + break; + + case 14:sChoice = "NW_HALFDRA001"; + fCR = 13.0; + break; + + case 15:sChoice = "X2_DRAGONSHAD001"; + fCR = 22.0; + break; + + case 16:sChoice = "X2_DRAGONPRIS001"; + fCR = 37.0; + break; + + case 17:sChoice = "X0_WYRMLING_BLK"; + fCR = 3.0; + break; + + case 18:sChoice = "X0_WYRMLING_BLU"; + fCR = 5.0; + break; + + case 19:sChoice = "X0_WYRMLING_GRN"; + fCR = 4.0; + break; + + case 20:sChoice = "X0_WYRMLING_RED"; + fCR = 5.0; + break; + + case 21:sChoice = "X0_WYRMLING_WHT"; + fCR = 3.0; + break; + + case 22:sChoice = ""; + fCR = 0.0; + break; + + } + if(fCR >= fMinCR && fCR <= fMaxCR && sChoice != "") + { + SetLocalString(oMod, "re_sCreatureList" + IntToString(iVarNum), sChoice); + iVarNum++; + } + iCounter2++; + } + } + } +// PICK RANDOM ELEMENTAL + for(iCounter1 = 0; iCounter1 <= GetStringLength(sCreatureTable); iCounter1++) + { + if(GetSubString(sCreatureTable, iCounter1, 1) == "e") + { + iCounter2 = 0; //Reset the counter + sChoice = "nil"; //Reset sChoice + while(sChoice != "") + { + switch(iCounter2) + { + case 0:sChoice = "NW_AIR"; + fCR = 4.0; + break; + + case 1:sChoice = "NW_Earth"; + fCR = 4.0; + break; + + case 2:sChoice = "NW_AIRELDER"; + fCR = 20.0; + break; + + case 3:sChoice = "NW_EARTHELD"; + fCR = 17.0; + break; + + case 4:sChoice = "NW_FIREELDER"; + fCR = 17.0; + break; + + case 5:sChoice = "NW_WATELDER"; + fCR = 16.0; + break; + + case 6:sChoice = "NW_FIRE"; + fCR = 3.0; + break; + + case 7:sChoice = "NW_AIRGREAT"; + fCR = 18.0; + break; + + case 8:sChoice = "NW_EARTHGREAT"; + fCR = 15.0; + break; + + case 9:sChoice = "NW_FIREGREAT"; + fCR = 15.0; + break; + + case 10:sChoice = "NW_WATERGREAT"; + fCR = 14.0; + break; + + case 11:sChoice = "NW_AIRHUGE"; + fCR = 13.0; + break; + + case 12:sChoice = "NW_EARTHHUGE"; + fCR = 11.0; + break; + + case 13:sChoice = "NW_FIREHUGE"; + fCR = 12.0; + break; + + case 14:sChoice = "NW_WATERHUGE"; + fCR = 11.0; + break; + + case 15:sChoice = "NW_INVSTALK"; + fCR = 6.0; + break; + + case 16:sChoice = "NW_WATER"; + fCR = 4.0; + break; + + case 17:sChoice = ""; + fCR = 0.0; + break; + } + if(fCR >= fMinCR && fCR <= fMaxCR && GetStringLowerCase(sChoice) != "") + { + SetLocalString(oMod, "re_sCreatureList" + IntToString(iVarNum), sChoice); + iVarNum++; + } + iCounter2++; + } + } + } +// PICK RANDOM GIANT + for(iCounter1 = 0; iCounter1 <= GetStringLength(sCreatureTable); iCounter1++) + { + if(GetSubString(sCreatureTable, iCounter1, 1) == "g") + { + iCounter2 = 0; //Reset the counter + sChoice = "nil"; //Reset sChoice + while(sChoice != "") + { + switch(iCounter2) + { + case 0:sChoice = "NW_ETTIN"; + fCR = 8.0; + break; + + case 1:sChoice = "NW_GNTHILL"; + fCR = 10.0; + break; + + case 2:sChoice ="NW_GNTMOUNT"; + fCR = 10.0; + break; + + case 3:sChoice = "NW_GNTFIRE"; + fCR = 12.0; + break; + + case 4:sChoice = "NW_GNTFROST"; + fCR = 10.0; + break; + + case 5:sChoice = "NW_OGRE01"; + fCR = 3.0; + break; + + case 6:sChoice = "NW_OGRE02"; + fCR = 3.0; + break; + + case 7:sChoice = "NW_OGRECHIEF01"; + fCR = 6.0; + break; + + case 8:sChoice = "NW_OGRECHIEF02"; + fCR = 6.0; + break; + + case 9:sChoice = "nw_ogreboss"; + fCR = 9.0; + break; + + case 10:sChoice = "NW_OGREMAGEBOSS"; + fCR = 21.0; + break; + + case 11:sChoice = "NW_OGREMAGE01"; + fCR = 5.0; + break; + + case 12:sChoice = "NW_OGREMAGE02"; + fCR = 5.0; + break; + + case 13:sChoice = "NW_TROLL"; + fCR = 5.0; + break; + + case 14:sChoice = "NW_TROLLCHIEF"; + fCR = 8.0; + break; + + case 15:sChoice = "NW_TROLLBOSS"; + fCR = 9.0; + break; + + case 16:sChoice = "NW_TROLLWIZ"; + fCR = 8.0; + break; + + case 17:sChoice = "X0_GNTFIREFEM"; + fCR = 10.0; + break; + + case 18:sChoice = "X0_GNTFROSTFEM"; + fCR = 9.0; + break; + + case 19:sChoice = ""; + fCR = 0.0; + break; + + } + if(fCR >= fMinCR && fCR <= fMaxCR && GetStringLowerCase(sChoice) != "") + { + SetLocalString(oMod, "re_sCreatureList" + IntToString(iVarNum), sChoice); + iVarNum++; + } + iCounter2++; + } + } + } +// PICK RANDOM HUMANOID + for(iCounter1 = 0; iCounter1 <= GetStringLength(sCreatureTable); iCounter1++) + { + if(GetSubString(sCreatureTable, iCounter1, 1) == "h") + { + iCounter2 = 0; //Reset the counter + sChoice = "nil"; //Reset sChoice + while(sChoice != "") + { + switch(iCounter2) + { + case 0:sChoice = "NW_BUGBEARA"; + fCR = 2.0; + break; + + case 1:sChoice = "NW_BUGBEARB"; + fCR = 2.0; + break; + + case 2:sChoice = "nw_bugbearboss"; + fCR = 10.0; + break; + + case 3:sChoice = "NW_BUGCHIEFA"; + fCR = 5.0; + break; + + case 4:sChoice = "NW_BUGCHIEFB"; + fCR = 5.0; + break; + + case 5:sChoice = "NW_BUGWIZA"; + fCR = 4.0; + break; + + case 6:sChoice = "NW_BUGWIZB"; + fCR = 4.0; + break; + + case 7:sChoice = "NW_GRIG"; + fCR = 2.0; + break; + + case 8:sChoice = "NW_PIXIE"; + fCR = 2.0; + break; + + case 9:sChoice = "NW_GOBLINA"; + fCR = 0.25; + break; + + case 10:sChoice = "NW_GOBLINB"; + fCR = 0.25; + break; + + case 11:sChoice = "NW_GOBLINBOSS"; + fCR = 11.0; + break; + + case 12:sChoice = "NW_GOBCHIEFA"; + fCR = 4.0; + break; + + case 13:sChoice = "NW_GOBCHIEFB"; + fCR = 3.0; + break; + + case 14:sChoice = "NW_GOBWIZA"; + fCR = 3.0; + break; + + case 15:sChoice = "NW_GOBWIZB"; + fCR = 3.0; + break; + + case 16:sChoice = "NW_OLDCHIEFA"; + fCR = 4.0; + break; + + case 17:sChoice = "NW_OLDCHIEFB"; + fCR = 4.0; + break; + + case 19:sChoice = "NW_OLDMAGEA"; + fCR = 4.0; + break; + + case 20:sChoice = "NW_OLDMAGEB"; + fCR = 4.0; + break; + + case 21:sChoice = "NW_OLDWARB"; + fCR = 2.0; + break; + + case 22:sChoice = "NW_OLDWARRA"; + fCR = 2.0; + break; + + case 23:sChoice = "NW_YUAN_TI001"; + fCR = 5.0; + break; + + case 24:sChoice = "NW_YUAN_TI003"; + fCR = 6.0; + break; + + case 25:sChoice = "NW_YUAN_TI002"; + fCR = 5.0; + break; + + case 26:sChoice = "NW_MINOTAUR"; + fCR = 4.0; + break; + + case 27:sChoice = "NW_MinChief"; + fCR = 8.0; + break; + + case 28:sChoice = "NW_MINOTAURBOSS"; + fCR = 14.0; + break; + + case 29:sChoice = "NW_MINWIZ"; + fCR = 9.0; + break; + + case 30:sChoice = "NW_ORCA"; + fCR = 0.25; + break; + + case 31:sChoice = "NW_ORCB"; + fCR = 0.25; + break; + + case 32:sChoice = "NW_OrcChiefA"; + fCR = 3.0; + break; + + case 33:sChoice = "NW_ORCCHIEFB"; + fCR = 3.0; + break; + + case 34:sChoice = "nw_orcboss"; + fCR = 10.0; + break; + + case 35:sChoice = "NW_ORCWIZA"; + fCR = 4.0; + break; + + case 36:sChoice = "NW_ORCWIZB"; + fCR = 4.0; + break; + + case 37:sChoice = "NW_KOBOLD001"; + fCR = 0.33; + break; + + case 38:sChoice = "NW_KOBOLD002"; + fCR = 0.33; + break; + + case 39:sChoice = "NW_KOBOLD004"; + fCR = 2.0; + break; + + case 40:sChoice = "NW_KOBOLD006"; + fCR = 2.0; + break; + + case 41:sChoice = "NW_KOBOLD005"; + fCR = 2.0; + break; + + case 42:sChoice = "NW_KOBOLD003"; + fCR = 2.0; + break; + + case 43:sChoice = "NW_GNOLL001"; + fCR = 1.0; + break; + + case 44:sChoice = "NW_GNOLL002"; + fCR = 3.0; + break; + + case 45:sChoice = "NW_HOBGOBLIN001"; + fCR = 0.33; + break; + + case 46:sChoice = "NW_HOBGOBLIN002"; + fCR = 2.0; + break; + + case 47:sChoice = "X0_ASABI_CHIEF"; + fCR = 6.0; + break; + + case 48:sChoice = "X0_ASABI_SHAMAN"; + fCR = 5.0; + break; + + case 49:sChoice = "X0_ASABI_WARRIOR"; + fCR = 2.0; + break; + + case 50:sChoice = "X0_MEDUSA"; + fCR = 6.0; + break; + + case 51:sChoice = "X0_STINGER"; + fCR = 3.0; + break; + + case 52:sChoice = "X0_STINGER_CHIEF"; + fCR = 7.0; + break; + + case 53:sChoice = "X0_STINGER_MAGE"; + fCR = 5.0; + break; + + case 54:sChoice = "X0_STINGER_WAR"; + fCR = 5.0; + break; + + case 55:sChoice = "nw_seahag"; + fCR = 4.0; + break; + + case 56:sChoice = ""; + fCR = 4.0; + break; + } + if(fCR >= fMinCR && fCR <= fMaxCR && GetStringLowerCase(sChoice) != "") + { + SetLocalString(oMod, "re_sCreatureList" + IntToString(iVarNum), sChoice); + iVarNum++; + } + iCounter2++; + } + } + } +// PICK RANDOM INSECT + for(iCounter1 = 0; iCounter1 <= GetStringLength(sCreatureTable); iCounter1++) + { + if(GetSubString(sCreatureTable, iCounter1, 1) == "i") + { + iCounter2 = 0; //Reset the counter + sChoice = "nil"; //Reset sChoice + while(sChoice != "") + { + switch(iCounter2) + { + case 0:sChoice = "NW_BTLBOMB"; + fCR = 3.0; + break; + + case 1:sChoice = "NW_BTLFIRE"; + fCR = 0.25; + break; + + case 2:sChoice = "nw_beetleboss"; + fCR = 16.0; + break; + + case 3:sChoice = "NW_BTLFIRE02"; + fCR = 3.0; + break; + + case 4:sChoice = "NW_BTLSTAG"; + fCR = 7.0; + break; + + case 5:sChoice = "NW_BTLSTINK"; + fCR = 3.0; + break; + + case 6:sChoice = "NW_SPIDDIRE"; + fCR = 7.0; + break; + + case 7:sChoice = "NW_SPIDGIANT"; + fCR = 3.0; + break; + + case 8:sChoice = "NW_SPIDPHASE"; + fCR = 3.0; + break; + + case 9:sChoice = "NW_SPIDERBOSS"; + fCR = 14.0; + break; + + case 10:sChoice = "NW_SPIDSWRD"; + fCR = 4.0; + break; + + case 11:sChoice = "NW_SPIDWRA"; + fCR = 4.0; + break; + + case 12:sChoice = ""; + fCR = 0.0; + break; + } + if(fCR >= fMinCR && fCR <= fMaxCR && GetStringLowerCase(sChoice) != "") + { + SetLocalString(oMod, "re_sCreatureList" + IntToString(iVarNum), sChoice); + iVarNum++; + } + iCounter2++; + } + } + } +// PICK RANDOM MISCELLANEOUS + for(iCounter1 = 0; iCounter1 <= GetStringLength(sCreatureTable); iCounter1++) + { + if(GetSubString(sCreatureTable, iCounter1, 1) == "m") + { + iCounter2 = 0; //Reset the counter + sChoice = "nil"; //Reset sChoice + while(sChoice != "") + { + switch(iCounter2) + { + case 0:sChoice = "X0_BASILISK"; + fCR = 5.0; + break; + + case 1:sChoice = "X0_COCKATRICE"; + fCR = 5.0; + break; + + case 2:sChoice = "X2_HARPY001"; + fCR = 3.0; + break; + + case 3:sChoice = "NW_GRAYREND"; + fCR = 8.0; + break; + + case 4:sChoice = "X2_DEEPROTHE001"; + fCR = 1.0; + break; + + case 5:sChoice = "X0_GORGON"; + fCR = 7.0; + break; + + case 6:sChoice = "NW_KRENSHAR"; + fCR = 2.0; + break; + + case 7:sChoice = "NW_STIRGE"; + fCR = 0.33; + break; + + case 8:sChoice = "X0_MANTICORE"; + fCR = 6.0; + break; + + case 9:sChoice = "X2_GELCUBE"; + fCR = 3.0; + break; + + case 10:sChoice = ""; + fCR = 5.0; + break; + } + if(fCR >= fMinCR && fCR <= fMaxCR && GetStringLowerCase(sChoice) != "") + { + SetLocalString(oMod, "re_sCreatureList" + IntToString(iVarNum), sChoice); + iVarNum++; + } + iCounter2++; + } + } + } +// PICK RANDOM PLANAR + for(iCounter1 = 0; iCounter1 <= GetStringLength(sCreatureTable); iCounter1++) + { + if(GetSubString(sCreatureTable, iCounter1, 1) == "p") + { + iCounter2 = 0; //Reset the counter + sChoice = "nil"; //Reset sChoice + while(sChoice != "") + { + switch(iCounter2) + { + case 0:sChoice = "NW_DEMON"; + fCR = 15.0; + break; + + case 1:sChoice = "NW_HALFFND001"; + fCR = 8.0; + break; + + case 2:sChoice = "NW_HELLHOUND"; + fCR = 4.0; + break; + + case 3:sChoice = "NW_BEASTXVIM"; + fCR = 5.0; + break; + + case 4:sChoice = "NW_RAKSHASA"; + fCR = 7.0; + break; + + case 5:sChoice = "NW_SHMASTIF"; + fCR = 4.0; + break; + + case 6:sChoice = "NW_DMSUCUBUS"; + fCR = 7.0; + break; + + case 7:sChoice = "NW_DMVROCK"; + fCR = 10.0; + break; + + case 8:sChoice = "NW_MEPAIR"; + fCR = 3.0; + break; + + case 9:sChoice = "NW_MEPDUST"; + fCR = 3.0; + break; + + case 10:sChoice = "NW_MEPEARTH"; + fCR = 3.0; + break; + + case 11:sChoice = "NW_MEPFIRE"; + fCR = 3.0; + break; + + case 12:sChoice = "NW_MEPICE"; + fCR = 3.0; + break; + + case 13:sChoice = "NW_IMP"; + fCR = 3.0; + break; + + case 14:sChoice = "NW_MEPMAGMA"; + fCR = 3.0; + break; + + case 15:sChoice = "NW_MEPOOZE"; + fCR = 3.0; + break; + + case 16:sChoice = "NW_DMQUASIT"; + fCR = 3.0; + break; + + case 17:sChoice = "NW_MEPSALT"; + fCR = 3.0; + break; + + case 19:sChoice = "NW_MEPSTEAM"; + fCR = 3.0; + break; + + case 20:sChoice = "NW_MEPWATER"; + fCR = 3.0; + break; + + case 21:sChoice = "NW_TIEFLING02"; + fCR = 0.5; + break; + + case 22:sChoice = "NW_SLAADBL"; + fCR = 7.0; + break; + + case 23:sChoice = "NW_SLAADDETH"; + fCR = 15.0; + break; + + case 24:sChoice = "NW_SLAADDTHBOSS"; + fCR = 15.0; + break; + + case 25:sChoice = "NW_SLAADGRAY"; + fCR = 10.0; + break; + + case 26:sChoice = "NW_SLAADGRYBOSS"; + fCR = 11.0; + break; + + case 27:sChoice = "NW_SLAADGRN"; + fCR = 9.0; + break; + + case 28:sChoice = "NW_SLAADRED"; + fCR = 6.0; + break; + + case 29:sChoice = "X2_SPIDERDEMO001"; + fCR = 12.0; + break; + + case 30:sChoice = "x2_erinyes"; + fCR = 8.0; + break; + + case 31:sChoice = "X2_PITFIEND001"; + fCR = 15.0; + break; + + case 32:sChoice = "X0_FORM_MYRMARCH"; + fCR = 11.0; + break; + + case 33:sChoice = "X0_FORM_QUEEN"; + fCR = 20.0; + break; + + case 34:sChoice = "X0_FORM_TASKMAST"; + fCR = 7.0; + break; + + case 35:sChoice = "X0_FORM_WARRIOR"; + fCR = 4.0; + break; + + case 36:sChoice = "X0_FORM_WORKER"; + fCR = 1.0; + break; + + case 37:sChoice = "X2_SLAADBLACK001"; + fCR = 30.0; + break; + + case 38:sChoice = "X2_SLAADWHITE001"; + fCR = 25.0; + break; + + case 39:sChoice = ""; + fCR = 0.0; + break; + } + if(fCR >= fMinCR && fCR <= fMaxCR && GetStringLowerCase(sChoice) != "") + { + SetLocalString(oMod, "re_sCreatureList" + IntToString(iVarNum), sChoice); + iVarNum++; + } + iCounter2++; + } + } + } +// PICK RANDOM SHAPECHANGER + for(iCounter1 = 0; iCounter1 <= GetStringLength(sCreatureTable); iCounter1++) + { + if(GetSubString(sCreatureTable, iCounter1, 1) == "s") + { + iCounter2 = 0; //Reset the counter + sChoice = "nil"; //Reset sChoice + while(sChoice != "") + { + switch(iCounter2) + { + case 0:sChoice = "NW_ARANEA"; + fCR = 3.0; + break; + + case 1:sChoice = "NW_WERECAT"; + fCR = 5.0; + break; + + case 2:sChoice = "NW_WERERAT001"; + fCR = 0.5; + break; + + case 3:sChoice = "NW_WEREWOLF"; + fCR = 2.0; + break; + + case 4:sChoice = "NW_WERERAT"; + fCR = 0.5; + break; + + case 5:sChoice = ""; + fCR = 0.0; + break; + } + if(fCR >= fMinCR && fCR <= fMaxCR && GetStringLowerCase(sChoice) != "") + { + SetLocalString(oMod, "re_sCreatureList" + IntToString(iVarNum), sChoice); + iVarNum++; + } + iCounter2++; + } + } + } +// PICK RANDOM UNDEAD + for(iCounter1 = 0; iCounter1 <= GetStringLength(sCreatureTable); iCounter1++) + { + if(GetSubString(sCreatureTable, iCounter1, 1) == "u") + { + iCounter2 = 0; //Reset the counter + sChoice = "nil"; //Reset sChoice + while(sChoice != "") + { + switch(iCounter2) + { + case 0:sChoice = "NW_GHAST"; + fCR = 4.0; + break; + + case 1:sChoice = "NW_GHOUL"; + fCR = 2.0; + break; + + case 2:sChoice = "NW_GHOULLORD"; + fCR = 5.0; + break; + + case 3:sChoice = "NW_GHOULBOSS"; + fCR = 10.0; + break; + + case 4:sChoice = "NW_MUMCLERIC"; + fCR = 10.0; + break; + + case 5:sChoice = "NW_MUMMY"; + fCR = 5.0; + break; + + case 6:sChoice = "NW_MUMMYBOSS"; + fCR = 11.0; + break; + + case 7:sChoice = "NW_MUMFIGHT"; + fCR = 10.0; + break; + + case 8:sChoice = "NW_ZOMBWARR02"; + fCR = 19.0; + break; + + case 9:sChoice = "NW_Bodak"; + fCR = 9.0; + break; + + case 10:sChoice = "NW_CURST004"; + fCR = 6.0; + break; + + case 11:sChoice = "NW_CURST003"; + fCR = 5.0; + break; + + case 12:sChoice = "NW_CURST002"; + fCR = 6.0; + break; + + case 13:sChoice = "NW_CURST001"; + fCR = 5.0; + break; + + case 14:sChoice = "NW_DOOMKGHT"; + fCR = 10.0; + break; + + case 15:sChoice = "NW_DOOMKGHTBOSS"; + fCR = 15.0; + break; + + case 16:sChoice = "NW_LICH001"; + fCR = 28.0; + break; + + case 17:sChoice = "NW_LICH003"; + fCR = 17.0; + break; + + case 19:sChoice = "NW_LICHBOSS"; + fCR = 21.0; + break; + + case 20:sChoice = "NW_MOHRG"; + fCR = 12.0; + break; + + case 21:sChoice = "NW_REVENANT001"; + fCR = 7.0; + break; + + case 22:sChoice = "NW_SKELDEVOUR"; + fCR = 13.0; + break; + + case 23:sChoice = "NW_VAMPIRE"; + fCR = 6.0; + break; + + case 24:sChoice = "NW_VAMPIRE003"; + fCR = 16.0; + break; + + case 25:sChoice = "NW_VAMPIRE004"; + fCR = 13.0; + break; + + case 26:sChoice = "NW_VAMPIRE002"; + fCR = 13.0; + break; + + case 27:sChoice = "NW_VAMPIRE001"; + fCR = 12.0; + break; + + case 28:sChoice = "NW_WIGHT"; + fCR = 4.0; + break; + + case 29:sChoice = "NW_VAMPIRE_SHAD"; + fCR = 3.0; + break; + + case 30:sChoice = "NW_SHADOW"; + fCR = 3.0; + break; + + case 31:sChoice = "NW_SHFIEND"; + fCR = 7.0; + break; + + case 32:sChoice = "NW_SKELETON"; + fCR = 0.5; + break; + + case 33:sChoice = "NW_SKELCHIEF"; + fCR = 7.0; + break; + + case 34:sChoice = "NW_SKELMAGE"; + fCR = 4.0; + break; + + case 35:sChoice = "NW_SKELPRIEST"; + fCR = 4.0; + break; + + case 36:sChoice = "NW_SKELWARR01"; + fCR = 6.0; + break; + + case 37:sChoice = "NW_SKELWARR02"; + fCR = 6.0; + break; + + case 38:sChoice = "NW_ALLIP"; + fCR = 3.0; + break; + + case 39:sChoice = "NW_SPECTRE"; + fCR = 6.0; + break; + + case 40:sChoice = "NW_WRAITH"; + fCR = 5.0; + break; + + case 41:sChoice = "NW_ZOMBTYRANT"; + fCR = 3.0; + break; + + case 42:sChoice = "NW_ZOMBIE01"; + fCR = 1.0; + break; + + case 43:sChoice = "NW_ZOMBIE02"; + fCR = 1.0; + break; + + case 44:sChoice = "NW_ZOMBIEBOSS"; + fCR = 8.0; + break; + + case 45:sChoice = "NW_ZOMBWARR01"; + fCR = 4.0; + break; + + case 47:sChoice = "X2_SPIDERDEMO001"; + fCR = 12.0; + break; + + case 48:sChoice = "x2_erinyes"; + fCR = 8.0; + break; + + case 49:sChoice = "X2_PITFIEND001"; + fCR = 15.0; + break; + + case 50:sChoice = "X0_FORM_MYRMARCH"; + fCR = 11.0; + break; + + case 51:sChoice = "X0_FORM_QUEEN"; + fCR = 20.0; + break; + + case 52:sChoice = "X0_FORM_TASKMAST"; + fCR = 7.0; + break; + + case 53:sChoice = "X0_FORM_WARRIOR"; + fCR = 4.0; + break; + + case 54:sChoice = "X0_FORM_WORKER"; + fCR = 1.0; + break; + + case 55:sChoice = "X2_SLAADBLACK001"; + fCR = 30.0; + break; + + case 56:sChoice = "X2_SLAADWHITE001"; + fCR = 25.0; + break; + + case 57:sChoice = "X2_MINDFLAYER003"; + fCR = 18.0; + break; + + case 58:sChoice = "X2_DEMILICH001"; + fCR = 24.0; + break; + + case 59:sChoice = "X2_DRACOLICH001"; + fCR = 43.0; + break; + + case 60:sChoice = ""; + fCR = 0.0; + break; + } + if(fCR >= fMinCR && fCR <= fMaxCR && GetStringLowerCase(sChoice) != "") + { + SetLocalString(oMod, "re_sCreatureList" + IntToString(iVarNum), sChoice); + iVarNum++; + } + iCounter2++; + } + } + } +// PICK RANDOM BANDIT + for(iCounter1 = 0; iCounter1 <= GetStringLength(sCreatureTable); iCounter1++) + { + if(GetSubString(sCreatureTable, iCounter1, 1) == "b") + { + iCounter2 = 0; //Reset the counter + sChoice = "nil"; //Reset sChoice + while(sChoice != "") + { + switch(iCounter2) + { + case 0:sChoice = "NW_DUECLER001"; + fCR = 1.0; + break; + + case 1:sChoice = "NW_DUECLER005"; + fCR = 5.0; + break; + + case 2:sChoice = "NW_DUECLER010"; + fCR = 8.0; + break; + + case 3:sChoice = "NW_DUECLER015"; + fCR = 10.0; + break; + + case 4:sChoice = "NW_DUECLER020"; + fCR = 15.0; + break; + + case 5:sChoice = "NW_DUEMAGE001"; + fCR = 1.0; + break; + + case 6:sChoice = "NW_DUEMAGE005"; + fCR = 4.0; + break; + + case 7:sChoice = "NW_DUEMAGE010"; + fCR = 7.0; + break; + + case 8:sChoice = "NW_DUEMAGE015"; + fCR = 11.0; + break; + + case 9:sChoice = "NW_DUEMAGE020"; + fCR = 14.0; + break; + + case 10:sChoice = "NW_DUEROGUE001"; + fCR = 1.0; + break; + + case 11:sChoice = "NW_DUEROGUE005"; + fCR = 4.0; + break; + + case 12:sChoice = "NW_DUEROGUE010"; + fCR = 7.0; + break; + + case 13:sChoice = "NW_DUEROGUE015"; + fCR = 10.0; + break; + + case 14:sChoice = "NW_DUEROGUE020"; + fCR = 13.0; + break; + + case 15:sChoice = "NW_DUEFIGHT001"; + fCR = 1.0; + break; + + case 16:sChoice = "NW_DUEFIGHT005"; + fCR = 4.0; + break; + + case 17:sChoice = "NW_DUEFIGHT010"; + fCR = 7.0; + break; + + case 19:sChoice = "NW_DUEFIGHT015"; + fCR = 11.0; + break; + + case 20:sChoice = "NW_DUEFIGHT020"; + fCR = 14.0; + break; + + case 21:sChoice = "NW_DWARFMERC001"; + fCR = 0.5; + break; + + case 22:sChoice = "NW_DWARFMERC002"; + fCR = 2.0; + break; + + case 23:sChoice = "NW_DWARFMERC003"; + fCR = 4.0; + break; + + case 24:sChoice = "NW_DWARFMERC004"; + fCR = 7.0; + break; + + case 25:sChoice = "NW_DWARFMERC005"; + fCR = 9.0; + break; + + case 26:sChoice = "NW_DWARFMERC006"; + fCR = 13.0; + break; + + case 27:sChoice = "NW_DROWROGUE001"; + fCR = 1.0; + break; + + case 28:sChoice = "NW_DROWROGUE005"; + fCR = 3.0; + break; + + case 29:sChoice = "NW_DROWROGUE010"; + fCR = 7.0; + break; + + case 30:sChoice = "NW_DROWROGUE015"; + fCR = 10.0; + break; + + case 31:sChoice = "NW_DROWROGUE020"; + fCR = 13.0; + break; + + case 33:sChoice = "NW_DROWMAGE001"; + fCR = 1.0; + break; + + case 34:sChoice = "NW_DROWMAGE005"; + fCR = 4.0; + break; + + case 35:sChoice = "NW_DROWMAGE010"; + fCR = 7.0; + break; + + case 36:sChoice = "NW_DROWMAGE015"; + fCR = 11.0; + break; + + case 37:sChoice = "NW_DROWMAGE020"; + fCR = 15.0; + break; + + case 38:sChoice = "NW_DROWFIGHT001"; + fCR = 1.0; + break; + + case 39:sChoice = "NW_DROWFIGHT005"; + fCR = 4.0; + break; + + case 40:sChoice = "NW_DROWFIGHT010"; + fCR = 8.0; + break; + + case 41:sChoice = "NW_DROWFIGHT015"; + fCR = 11.0; + break; + + case 42:sChoice = "NW_DROWFIGHT020"; + fCR = 15.0; + break; + + case 43:sChoice = "NW_DROWCLER001"; + fCR = 1.0; + break; + + case 44:sChoice = "NW_DROWCLER005"; + fCR = 4.0; + break; + + case 45:sChoice = "NW_DROWCLER010"; + fCR = 8.0; + break; + + case 46:sChoice = "NW_DROWCLER015"; + fCR = 12.0; + break; + + case 47:sChoice = "NW_DROWCLER020"; + fCR = 16.0; + break; + + case 48:sChoice = "NW_HALFMERC001"; + fCR = 1.0; + break; + + case 49:sChoice = "NW_HALFMERC002"; + fCR = 3.0; + break; + + case 50:sChoice = "NW_HALFMERC003"; + fCR = 5.0; + break; + + case 51:sChoice = "NW_HALFMERC004"; + fCR = 7.0; + break; + + case 52:sChoice = "NW_HALFMERC005"; + fCR = 10.0; + break; + + case 53:sChoice = "NW_HALFMERC006"; + fCR = 13.0; + break; + + case 54:sChoice = "NW_BANDIT006"; + fCR = 7.0; + break; + + case 55:sChoice = "NW_BANDIT001"; + fCR = 0.5; + break; + + case 56:sChoice = "NW_BANDIT002"; + fCR = 0.5; + break; + + case 57:sChoice = "NW_BANDIT007"; + fCR = 11.0; + break; + + case 58:sChoice = "NW_BANDIT004"; + fCR = 3.0; + break; + + case 59:sChoice = "NW_BANDIT005"; + fCR = 4.0; + break; + + case 60:sChoice = "NW_BANDIT003"; + fCR = 1.0; + break; + + case 61:sChoice = "NW_GYPSY006"; + fCR = 11.0; + break; + + case 62:sChoice = "NW_GYPSY005"; + fCR = 8.0; + break; + + case 63:sChoice = "NW_GYPSY004"; + fCR = 4.0; + break; + + case 64:sChoice = "NW_GYPSY007"; + fCR = 10.0; + break; + + case 65:sChoice = "NW_GYPSY002"; + fCR = 0.5; + break; + + case 66:sChoice = "NW_GYPSY001"; + fCR = 0.5; + break; + + case 67:sChoice = "NW_GYPSY003"; + fCR = 4.0; + break; + + case 68:sChoice = "NW_HUMANMERC005"; + fCR = 12.0; + break; + + case 69:sChoice = "NW_HUMANMERC006"; + fCR = 15.0; + break; + + case 70:sChoice = "NW_HUMANMERC001"; + fCR = 2.0; + break; + + case 71:sChoice = "NW_HUMANMERC002"; + fCR = 3.0; + break; + + case 72:sChoice = "NW_HUMANMERC003"; + fCR = 6.0; + break; + + case 73:sChoice = "NW_HUMANMERC004"; + fCR = 9.0; + break; + + case 74:sChoice = ""; + fCR = 12.0; + break; + } + if(fCR >= fMinCR && fCR <= fMaxCR && GetStringLowerCase(sChoice) != "") + { + SetLocalString(oMod, "re_sCreatureList" + IntToString(iVarNum), sChoice); + iVarNum++; + } + iCounter2++; + } + } + } + +// PICK RANDOM CREATURE FROM CUSTOM TABLE + for(iCounter1 = 0; iCounter1 <= GetStringLength(sCreatureTable); iCounter1++) + { + if(bCustom + && (GetSubString(sCreatureTable, iCounter1, 1) == "0" || StringToInt(GetSubString(sCreatureTable, iCounter1, 1)) > 0)) + { + sBuild = sBuild + GetSubString(sCreatureTable, iCounter1, 1); + } + else if(bCustom) + { + SetLocalInt(OBJECT_SELF, "re_iVarNum", iVarNum); + SetLocalFloat(OBJECT_SELF, "re_fMinCR", fMinCR); + SetLocalFloat(OBJECT_SELF, "re_fMaxCR", fMaxCR); + ExecuteScript("re_custom" + sBuild, OBJECT_SELF); + iVarNum = GetLocalInt(OBJECT_SELF, "re_iVarNum"); + DeleteLocalInt(OBJECT_SELF, "re_iVarNum"); + DeleteLocalFloat(OBJECT_SELF, "re_fMinCR"); + DeleteLocalFloat(OBJECT_SELF, "re_fMaxCR"); + bCustom = FALSE; + sBuild = ""; + } + if(GetSubString(sCreatureTable, iCounter1, 1) == "x") + { + bCustom = TRUE; + } + } + +// PICK RANDOM CREATURE FROM COMMONER TABLE (For the commoner spawner) + for(iCounter1 = 0; iCounter1 <= GetStringLength(sCreatureTable); iCounter1++) + { + if(bCustom + && (GetSubString(sCreatureTable, iCounter1, 1) == "0" || StringToInt(GetSubString(sCreatureTable, iCounter1, 1)) > 0)) + { + sBuild = sBuild + GetSubString(sCreatureTable, iCounter1, 1); + } + else if(bCustom) + { + ExecuteScript("re_commoner" + sBuild, OBJECT_SELF); + iVarNum = GetLocalInt(OBJECT_SELF, "re_iVarNum"); + DeleteLocalInt(OBJECT_SELF, "re_iVarNum"); + bCustom = FALSE; + sBuild = ""; + } + if(GetSubString(sCreatureTable, iCounter1, 1) == "z") + { + bCustom = TRUE; + } + } + + + +// SELECT THE RANDOM CREATURE + if(!iVarNum) return ""; + int iRnd = Random(iVarNum); + string sCreature = GetLocalString(oMod, "re_sCreatureList" + IntToString(iRnd)); + // Copy the Min and Max number of creatures from the corresponding simulated "array" to the + // root variable in the module object. + SetLocalInt(oMod, "re_iMinNumberOfCreatures", GetLocalInt(oMod, "re_iMinNumberOfCreatures" + IntToString(iRnd))); + SetLocalInt(oMod, "re_iMaxNumberOfCreatures", GetLocalInt(oMod, "re_iMaxNumberOfCreatures" + IntToString(iRnd))); + // Reset the local module variables that store min and max number of creatures + // so we don't use old numbers at a later time. + for(iCounter3 = 1; iCounter3 <= iVarNum; iCounter3++) + { + SetLocalInt(oMod, "re_iMinNumberOfCreatures" + IntToString(iCounter3), 0); + SetLocalInt(oMod, "re_iMaxNumberOfCreatures" + IntToString(iCounter3), 0); + } + return sCreature; +} diff --git a/gamma_age_v2/re_treasure.ncs b/gamma_age_v2/re_treasure.ncs new file mode 100644 index 0000000000000000000000000000000000000000..51a300c4b66f10ad9887a926bcbce4c7e8a85bc1 GIT binary patch literal 2341 zcmd6pu}T9$5Qb-O=k5|OLJGABnvF5oN%R3!Vjl#-!bV#`EPW8M@DWm4`UojfSXiV` zuns!=JsMl8cRiXE^wy)PrP%jqt)L^1)-8>VN9PK9y-Wv8jO)lp*%3$H9YJn}^le(f z9xB+qW866-QRuf;k+99ZsUydjbKn-4m)EhkuO3hJ7YNAO{YPLgCqi%vy zvl@~bxC%;5^2;B|Em>REEuBQ%u`M(DZ+V0F+2 z#K9O~sYAgR)g*y(h9UPwq>}-9TWG#$BvTnKa#1gZkONb={pV9= fMinCR)) + && (fMaxCR == 0.0 || (fMaxCR != 0.0 && GetChallengeRating(oCreature) <= fMaxCR)) + && Random(10000) + 1 <= FloatToInt(fChance * 100.0)) + { + CreateItemOnObject(sChoice, oCreature, Random((iMaxNum + 1) - iMinNum) + iMinNum); + } + iCounter1++; + } +} diff --git a/gamma_age_v2/re_treasure0.ncs b/gamma_age_v2/re_treasure0.ncs new file mode 100644 index 0000000000000000000000000000000000000000..8ed8ea0d2e786cf05af8f9aea7fd732462b6c370 GIT binary patch literal 635 zcmeZs4ps;=)H85mU|_12V*mmU1qK#oAkE0iz>v-eW;*dH$b+PKWPt>eHwznx!^FnS z`2YX^9}Fx&h1n2=9NY?E!9NTvsvtG8VBQyGC6e3<>=4t0q!~c^L1r?3N0`Ocm?GG6R-o|=5aXFd6o8y(j4;J8T3it*{2U_u24)#h2xdE&e!##2bSbZ2c)Vvw zyt}`Ti-Cb5P>nnb*cpGoYJlzr+bMzO4+)q}U|Dv!7hFMp2a7>0hu9$ivBNjm*T>g0 z*x3kT4I?PDUNAtd1NoZahAza3Fl)K+S}Opu7UoP66) return; + object oCreature = OBJECT_SELF; + object oMarker; + if(GetRacialType(oCreature) == RACIAL_TYPE_ANIMAL + || GetRacialType(oCreature) == RACIAL_TYPE_VERMIN) return; + float fChallengeFactor = GetChallengeRating(oCreature) * 30.0; + float fFactor = IntToFloat(Random(5) + 2); + int iTreasure = FloatToInt(fChallengeFactor / fFactor); + int iType = GetRacialType(oCreature); + CreateItemOnObject("NW_IT_GOLD001", oCreature, iTreasure); + if(iType == RACIAL_TYPE_UNDEAD || iType == RACIAL_TYPE_ABERRATION) + oMarker = CreateItemOnObject("NW_IT_MSMLMISC21", oCreature, 1); + else if(iType == RACIAL_TYPE_CONSTRUCT || + iType == RACIAL_TYPE_ELEMENTAL || + iType == RACIAL_TYPE_OUTSIDER) + oMarker = CreateItemOnObject("NW_IT_MSMLMISC11", oCreature, 1); + else + oMarker = CreateItemOnObject("NW_IT_MMIDMISC05", oCreature, 1); + SetLocalInt(oMarker, "bItemForGold", TRUE); +} diff --git a/gamma_age_v2/re_treasure1.ncs b/gamma_age_v2/re_treasure1.ncs new file mode 100644 index 0000000000000000000000000000000000000000..d94411bc4e627d1e970986a9b89cf2b372f58c17 GIT binary patch literal 2436 zcmd6pF;Ck-6vyBB&JMw;lmS>!$fcoTtDLY?l1>Z+BqETygtcnb@(~!SegbwFnW}yU zCI$wEN{v(o1|%|6hyfu6B=g=o`^Ys`Q&kxpOR?|w-rf8A-JRcc-frpb#_OmJQ2eq0 z_?yz80($TPJ_scVg}O?lRKdSu*O)!Um-Ni#D<9;i_aCK*>|U(+TZU3WHtDNV&7qTkH1LH#fR#8=WXx<_z7X8L~OMwM4b{l05dG86}K+ zUOcnbX~KS3M)?)&_dA2(Oqh8gb^b|)y5>Kq)1&HIpMOqISl!~Nx@I(9-Re<>y6U9W zsjs8zqQ-c2n07OZLo>U2_-$sgxswCCs{XppveZ~Mw9YL1uXQHhMK@T(iYa!O2pN*$}Qagd_M<=~d00!W zJjfev;m68YOV-MLO^7oZTHFYB#W*i&fiCDEE6im&P-Yk_Vtg3<5S6pSH0d0(RK`~Y zbEFY7MhA9Ks*Uw>u7<{IQAUCM4jsx1OUHuAr=YY8wr4eul$w*V@Ew_8#YS`WkE70_ S#DmXOT4v+;{ue*@H9P^= fMinCR)) + && (fMaxCR == 0.0 || (fMaxCR != 0.0 && GetChallengeRating(oCreature) <= fMaxCR)) + && Random(10000) + 1 <= FloatToInt(fChance * 100.0)) + { + CreateItemOnObject(sChoice, oCreature, Random((iMaxNum + 1) - iMinNum) + iMinNum); + } + iCounter1++; + } +} diff --git a/gamma_age_v2/re_trsr_table.nss b/gamma_age_v2/re_trsr_table.nss new file mode 100644 index 00000000..20591503 --- /dev/null +++ b/gamma_age_v2/re_trsr_table.nss @@ -0,0 +1,2351 @@ +//////////////////////////////////////////////////// +/* +Default Treasure Table for use with the +BESIE Random Encounter System by Ray Miller + +This script is meant to be used as an include +and will not compile on its own. +*/ +//////////////////////////////////////////////////// +//////////////////////////////////////////////////// + +float fCRFactor = GetChallengeRating(OBJECT_SELF) / 20.0; + +object GiveMoney(object oCreature = OBJECT_SELF) +{ + if(d100()>66) return OBJECT_INVALID; + object oObject = OBJECT_INVALID; + object oMarker; + if(GetRacialType(oCreature) == RACIAL_TYPE_ANIMAL + || GetRacialType(oCreature) == RACIAL_TYPE_VERMIN) return OBJECT_INVALID; + float fChallengeFactor = GetChallengeRating(oCreature) * 30.0; + float fFactor = IntToFloat(Random(5) + 2); + int iTreasure = FloatToInt(fChallengeFactor / fFactor); + int iType = GetRacialType(oCreature); + oObject = CreateItemOnObject("NW_IT_GOLD001", oCreature, iTreasure); + if(iType == RACIAL_TYPE_UNDEAD || iType == RACIAL_TYPE_ABERRATION) + oMarker = CreateItemOnObject("NW_IT_MSMLMISC21", oCreature, 1); + else if(iType == RACIAL_TYPE_CONSTRUCT || + iType == RACIAL_TYPE_ELEMENTAL || + iType == RACIAL_TYPE_OUTSIDER) + oMarker = CreateItemOnObject("NW_IT_MSMLMISC11", oCreature, 1); + else + oMarker = CreateItemOnObject("NW_IT_MMIDMISC05", oCreature, 1); + SetLocalInt(oMarker, "bItemForGold", TRUE); + return oObject; +} + + + + + +object GiveHealing(object oCreature = OBJECT_SELF) +{ +object oObject = OBJECT_INVALID; + +//Note: This statement causes the script to exclude animals from this treasure table. +if(GetRacialType(oCreature) != RACIAL_TYPE_ANIMAL){ +////////////////////////////////////////////////////////////// + int END; + float fChance; + float fMinCR; + float fMaxCR; + int iCounter1; + int iMaxNum; + int iMinNum; + string sIfIs; + string sChoice = ""; + while(!END) + { + sChoice = ""; + switch(iCounter1) + { +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//DO NOT EDIT ABOVE THIS LINE///////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//CUSTOM TREASURE TABLE BELOW://////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + case 0:sChoice = "NW_IT_MPOTION003";// Treasure resref goes between the " marks. + sIfIs = ""; // Only give this treasure to a creature with this TAG (TAG not RESREF. This allows us to be more specific since the creature already exists when this script is called). + fMinCR = 12.0; // Only give this treasure to a creature whose challenge rating is between these two values. + fMaxCR = 0.0; // Leave them at 0.0 if you wish them not to be considered. + fChance = 5.0; // Set this to the percentage chance of the creature having this item. This is accurate to one one thousandth (0.001). + iMinNum = 1; // + iMaxNum = 1; // The minimum and maximum numbers of this treasure item to randomly give. + break; + + case 1:sChoice = "NW_IT_MPOTION002"; + sIfIs = ""; + fMinCR = 7.0; + fMaxCR = 11.99; + fChance = 5.0; + iMinNum = 1; + iMaxNum = 1; + break; + + case 2:sChoice = "NW_IT_MPOTION020"; + sIfIs = ""; + fMinCR = 3.0; + fMaxCR = 6.99; + fChance = 5.0; + iMinNum = 1; + iMaxNum = 1; + break; + + case 3:sChoice = "NW_IT_MPOTION001"; + sIfIs = ""; + fMinCR = 0.0; + fMaxCR = 2.99; + fChance = 5.0; + iMinNum = 1; + iMaxNum = 1; + break; + + case 4:sChoice = "NW_IT_MEDKIT001"; + sIfIs = ""; + fMinCR = 0.0; + fMaxCR = 0.0; + fChance = 2.5; + iMinNum = 1; + iMaxNum = 1; + break; + + case 5:sChoice = "NW_IT_MEDKIT002"; + sIfIs = ""; + fMinCR = 0.0; + fMaxCR = 0.0; + fChance = 1.0; + iMinNum = 1; + iMaxNum = 1; + break; + + case 6:sChoice = "NW_IT_MEDKIT003"; + sIfIs = ""; + fMinCR = 0.0; + fMaxCR = 0.0; + fChance = 0.5; + iMinNum = 1; + iMaxNum = 1; + break; + + case 7:sChoice = "NW_IT_MEDKIT004"; + sIfIs = ""; + fMinCR = 0.0; + fMaxCR = 0.0; + fChance = 0.25; + iMinNum = 1; + iMaxNum = 1; + break; + + case 8:sChoice = ""; + sIfIs = ""; + fMinCR = 0.0; + fMaxCR = 0.0; + fChance = 0.0; + iMinNum = 1; + iMaxNum = 1; + break; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//END OF CUSTOM TREASURE TABLE! DO NOT EDIT BELOW THIS LINE/////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + default:END = TRUE; + break; + } + if((sIfIs == "" || sIfIs == GetTag(oCreature)) + && (fMinCR == 0.0 || (fMinCR != 0.0 && GetChallengeRating(oCreature) >= fMinCR)) + && (fMaxCR == 0.0 || (fMaxCR != 0.0 && GetChallengeRating(oCreature) <= fMaxCR)) + && Random(10000) + 1 <= FloatToInt(fChance * 100.0)) + { + oObject = CreateItemOnObject(sChoice, oCreature, Random((iMaxNum + 1) - iMinNum) + iMinNum); + } + iCounter1++; + } +} +return oObject; +} + + + + + +object GiveWeapons(object oCreature = OBJECT_SELF) +{ +object oObject = OBJECT_INVALID; +int iStack = 1; +float fRunningChance; +float Chance = 0.0; +int iCounter1 = 1; +int Class; +int Items; +int END; +while(!END) + { + switch(iCounter1) + { +//////////////////////////////////////////////////////////////////////////// +/*////////////////////////////////////////////////////////////////////////// +The following table represents the chance of a creature having an item from +this treasure table based upon its class. Remark in the class type and edit +the chance accordingly. +*/////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////// +//case 1:Class = CLASS_TYPE_ABERRATION; Chance = 100.0; break; +//case 2:Class = CLASS_TYPE_ANIMAL; Chance = 100.0; break; +case 3:Class = CLASS_TYPE_BARBARIAN; Chance = 5.0; break; +case 4:Class = CLASS_TYPE_BARD; Chance = 2.5; break; +//case 5:Class = CLASS_TYPE_BEAST; Chance = 100.0; break; +case 6:Class = CLASS_TYPE_CLERIC; Chance = 2.5; break; +case 7:Class = CLASS_TYPE_COMMONER; Chance = 5.0; break; +case 8:Class = CLASS_TYPE_CONSTRUCT; Chance = 1.0; break; +//case 9:Class = CLASS_TYPE_DRAGON; Chance = 100.0; break; +case 10:Class = CLASS_TYPE_DRUID; Chance = 2.5; break; +//case 11:Class = CLASS_TYPE_ELEMENTAL; Chance = 100.0; break; +//case 12:Class = CLASS_TYPE_FEY; Chance = 100.0; break; +case 13:Class = CLASS_TYPE_FIGHTER; Chance = 7.5; break; +case 14:Class = CLASS_TYPE_GIANT; Chance = 1.0; break; +case 15:Class = CLASS_TYPE_HUMANOID; Chance = 7.5; break; +//case 16:Class = CLASS_TYPE_MAGICAL_BEAST; Chance = 100.0;break; +case 17:Class = CLASS_TYPE_MONK; Chance = 2.0; break; +//case 18:Class = CLASS_TYPE_MONSTROUS; Chance = 100.0; break; +//case 19:Class = CLASS_TYPE_OUTSIDER; Chance = 100.0; break; +case 20:Class = CLASS_TYPE_PALADIN; Chance = 5.0; break; +case 21:Class = CLASS_TYPE_RANGER; Chance = 5.0; break; +case 22:Class = CLASS_TYPE_ROGUE; Chance = 5.0; break; +case 23:Class = CLASS_TYPE_SHAPECHANGER; Chance = 2.0; break; +case 24:Class = CLASS_TYPE_SORCERER; Chance = 0.5; break; +case 25:Class = CLASS_TYPE_UNDEAD; Chance = 2.0; break; +//case 26:Class = CLASS_TYPE_VERMIN; Chance = 100.0; break; +case 27:Class = CLASS_TYPE_WIZARD; Chance = 0.5; break; +/////////////////////////////////////////////////////////////////////////// +/* END OF TABLE */ +/////////////////////////////////////////////////////////////////////////// + case 28:END = TRUE; + default: break; + } + if(GetLevelByClass(Class) && Chance > fRunningChance) fRunningChance = Chance; + iCounter1++; + } +Chance = fRunningChance; +if(Random(10000) <= FloatToInt(Chance * 100.0)) + { + string sChoice; + int iChoices = 4; // set this to the number of "rarity catagories" in the table. + int iRarityChoice = FloatToInt(1.0 + (IntToFloat(iChoices - 1) * fCRFactor)); + int iRarityLevel = Random(iRarityChoice) + 1; + switch(iRarityLevel) + { +case 1: +//////////////////////////////////////// +/* RARITY: COMMON */ +//////////////////////////////////////// +//////////////////////////////////////// +Items = 36; +switch(Random(Items)+1) +{ +case 1:sChoice = "NW_WAXGR001"; break; +case 2:sChoice = "NW_WAXHN001"; break; +case 3:sChoice = "NW_WAXBT001"; break; +case 4:sChoice = "NW_WSWBS001"; break; +case 5:sChoice = "NW_WSWDG001"; break; +case 6:sChoice = "NW_WSWGS001"; break; +case 7:sChoice = "NW_WSWLS001"; break; +case 8:sChoice = "NW_WSWRP001"; break; +case 9:sChoice = "NW_WSWSC001"; break; +case 10:sChoice = "NW_WSWKA001"; break; +case 11:sChoice = "NW_WSWSS001"; break; +case 12:sChoice = "NW_WBLCL001"; break; +case 13:sChoice = "NW_WBLFH001"; break; +case 14:sChoice = "NW_WBLFL001"; break; +case 15:sChoice = "NW_WBLHL001"; break; +case 16:sChoice = "NW_WBLHW001"; break; +case 17:sChoice = "NW_WBLML001"; break; +case 18:sChoice = "NW_WBLMS001"; break; +case 19:sChoice = "NW_WDBMA001"; break; +case 20:sChoice = "NW_WDBAX001"; break; +case 21:sChoice = "NW_WDBQS001"; break; +case 22:sChoice = "NW_WDBSW001"; break; +case 23:sChoice = "NW_WSPKA001"; break; +case 24:sChoice = "NW_WSPKU001"; break; +case 25:sChoice = "NW_WSPSC001"; break; +case 26:sChoice = "NW_WPLHB001"; break; +case 27:sChoice = "NW_WPLSC001"; break; +case 28:sChoice = "NW_WPLSS001"; break; +case 29:sChoice = "NW_WBWXH001"; break; +case 30:sChoice = "NW_WBWXL001"; break; +case 31:sChoice = "NW_WBWLN001"; break; +case 32:sChoice = "NW_WBWSH001"; break; +case 33:sChoice = "NW_WBWSL001"; break; +case 34:sChoice = "NW_WTHDT001"; break; +case 35:sChoice = "NW_WTHSH001"; break; +case 36:sChoice = "NW_WTHAX001"; break; +} +//////////////////////////////////////// +/* END OF TABLE */ +//////////////////////////////////////// +//////////////////////////////////////// +break; + + +case 2: +//////////////////////////////////////// +/* RARITY: UNCOMMON */ +//////////////////////////////////////// +//////////////////////////////////////// +Items = 34; +switch(Random(Items)+1) +{ +case 1:sChoice = "NW_WAXMGR002"; break; +case 2:sChoice = "NW_WAXMHN002"; break; +case 3:sChoice = "NW_WAXMBT002"; break; +case 4:sChoice = "NW_WSWMDG002"; break; +case 5:sChoice = "NW_WSWMGS002"; break; +case 6:sChoice = "NW_WSWMLS002"; break; +case 7:sChoice = "NW_WSWMKA002"; break; +case 8:sChoice = "NW_WSWMRP002"; break; +case 9:sChoice = "NW_WSWMSC002"; break; +case 10:sChoice = "NW_WSWMSS002"; break; +case 11:sChoice = "NW_WBLMCL002"; break; +case 12:sChoice = "NW_WBLMFH002"; break; +case 13:sChoice = "NW_WBLMFL002"; break; +case 14:sChoice = "NW_WBLMHL002"; break; +case 15:sChoice = "NW_WBLMHW002"; break; +case 16:sChoice = "NW_WBLMML002"; break; +case 17:sChoice = "NW_WBLMMS002"; break; +case 18:sChoice = "NW_WDBMMA002"; break; +case 19:sChoice = "NW_WDBMAX002"; break; +case 20:sChoice = "NW_WDBMQS002"; break; +case 21:sChoice = "NW_WDBMSW002"; break; +case 22:sChoice = "NW_WSPMKA002"; break; +case 23:sChoice = "NW_WSPMSC002"; break; +case 24:sChoice = "NW_WPLMHB002"; break; +case 25:sChoice = "NW_WPLMSC002"; break; +case 26:sChoice = "NW_WPLMSS002"; break; +case 27:sChoice = "NW_WBWMXH002"; break; +case 28:sChoice = "NW_WBWMXL002"; break; +case 29:sChoice = "NW_WBWMLN002"; break; +case 30:sChoice = "NW_WBWMSH002"; break; +case 31:sChoice = "NW_WBWMSL001"; break; +case 32:sChoice = "NW_WTHMDT002"; break; +case 33:sChoice = "NW_WTHMSH002"; break; +case 34:sChoice = "NW_WTHMAX002"; break; +} +//////////////////////////////////////// +/* END OF TABLE */ +//////////////////////////////////////// +break; + + +case 3: +//////////////////////////////////////// +/* RARITY: RARE */ +//////////////////////////////////////// +//////////////////////////////////////// +Items = 38; +switch(Random(Items)+1) +{ +case 1:sChoice = "NW_WAXMGR009"; break; +case 2:sChoice = "NW_WAXMHN010"; break; +case 3:sChoice = "NW_WAXMBT010"; break; +case 4:sChoice = "NW_WSWMBS009"; break; +case 5:sChoice = "NW_WSWMDG008"; break; +case 6:sChoice = "NW_WSWMGS011"; break; +case 7:sChoice = "NW_WSWMLS010"; break; +case 8:sChoice = "NW_WSWMKA010"; break; +case 9:sChoice = "NW_WSWMRP010"; break; +case 10:sChoice = "NW_WSWMSC010"; break; +case 11:sChoice = "NW_WSWMSS009"; break; +case 12:sChoice = "NW_WBLMCL010"; break; +case 13:sChoice = "NW_WBLMFH010"; break; +case 14:sChoice = "NW_WBLMFL010"; break; +case 15:sChoice = "NW_WBLMHL010"; break; +case 16:sChoice = "NW_WBLMHW011"; break; +case 17:sChoice = "NW_WBLMML011"; break; +case 18:sChoice = "NW_WBLMMS010"; break; +case 19:sChoice = "NW_WDBMMA010"; break; +case 20:sChoice = "NW_WDBMAX010"; break; +case 21:sChoice = "NW_WDBMQS008"; break; +case 22:sChoice = "NW_WDBMSW010"; break; +case 23:sChoice = "NW_WSPMKA008"; break; +case 24:sChoice = "NW_WSPMKU008"; break; +case 25:sChoice = "NW_WSPMSC010"; break; +case 26:sChoice = "NW_WPLMHB010"; break; +case 27:sChoice = "NW_WPLMSC010"; break; +case 28:sChoice = "NW_WPLMSS010"; break; +case 29:sChoice = "NW_WBWMXH008"; break; +case 30:sChoice = "NW_WBWMXL008"; break; +case 31:sChoice = "NW_WBWMLN010"; break; +case 32:sChoice = "NW_WBWMLN008"; break; +case 33:sChoice = "NW_WBWMSH010"; break; +case 34:sChoice = "NW_WBWMSH008"; break; +case 35:sChoice = "NW_WBWMSL009"; break; +case 36:sChoice = "NW_WTHMDT008"; break; +case 37:sChoice = "NW_WTHMSH008"; break; +case 38:sChoice = "NW_WTHMAX008"; break; +} +//////////////////////////////////////// +/* END OF TABLE */ +//////////////////////////////////////// +break; + + +case 4: +//////////////////////////////////////// +/* RARITY: VERY RARE */ +//////////////////////////////////////// +//////////////////////////////////////// +Items = 40; +switch(Random(Items)+1) +{ +case 1:sChoice = "NW_WAXMGR011"; break; +case 2:sChoice = "NW_WAXMHN011"; break; +case 3:sChoice = "NW_WAXMBT011"; break; +case 4:sChoice = "NW_WSWMBS010"; break; +case 5:sChoice = "NW_WSWMDG009"; break; +case 6:sChoice = "NW_WSWMGS012"; break; +case 7:sChoice = "NW_WSWMLS012"; break; +case 8:sChoice = "NW_WSWMKA011"; break; +case 9:sChoice = "NW_WSWMRP011"; break; +case 10:sChoice = "NW_WSWMSC011"; break; +case 11:sChoice = "NW_WSWMSS011"; break; +case 12:sChoice = "NW_WBLMCL011"; break; +case 13:sChoice = "NW_WBLMFH011"; break; +case 14:sChoice = "NW_WBLMFL011"; break; +case 15:sChoice = "NW_WBLMHL011"; break; +case 16:sChoice = "NW_WBLMHW012"; break; +case 17:sChoice = "NW_WBLMML012"; break; +case 18:sChoice = "NW_WBLMMS011"; break; +case 19:sChoice = "NW_WDBMMA011"; break; +case 20:sChoice = "NW_WDBMAX011"; break; +case 21:sChoice = "NW_WDBMQS009"; break; +case 22:sChoice = "NW_WDBMSW011"; break; +case 23:sChoice = "NW_WSPMKA009"; break; +case 24:sChoice = "NW_WSPMKU009"; break; +case 25:sChoice = "NW_WSPMSC011"; break; +case 26:sChoice = "NW_WPLMHB011"; break; +case 27:sChoice = "NW_WPLMSC011"; break; +case 28:sChoice = "NW_WPLMSS011"; break; +case 29:sChoice = "NW_WBWMXH009"; break; +case 30:sChoice = "NW_WBWMXL009"; break; +case 31:sChoice = "NW_WBWMLN011"; break; +case 32:sChoice = "NW_WBWMLN012"; break; +case 33:sChoice = "NW_WBWMLN009"; break; +case 34:sChoice = "NW_WBWMSH011"; break; +case 35:sChoice = "NW_WBWMSH012"; break; +case 36:sChoice = "NW_WBWMSH009"; break; +case 37:sChoice = "NW_WBWMSL010"; break; +case 38:sChoice = "NW_WTHMDT009"; break; +case 39:sChoice = "NW_WTHMSH009"; break; +case 40:sChoice = "NW_WTHMAX009"; break; +} +//////////////////////////////////////// +/* END OF TABLE */ +//////////////////////////////////////// +//////////////////////////////////////// +break; + } + if(GetStringLeft(sChoice, 6) == "NW_WTH") iStack = Random(50) + 1; + oObject = CreateItemOnObject(sChoice, oCreature, iStack); + + //This code gives a stack of arrows, bolts or, bullets if + // the weapon is a bow, crossbow, or sling. + if(GetStringLeft(sChoice, 7) == "NW_WBWX" + || GetStringLeft(sChoice, 8) == "NW_WBWMX") + CreateItemOnObject("NW_WAMBO001", oCreature, Random(99) + 1); + if(GetStringLeft(sChoice, 7) == "NW_WBWL" + || GetStringLeft(sChoice, 8) == "NW_WBWML" + || GetStringLeft(sChoice, 8) == "NW_WBWSH" + || GetStringLeft(sChoice, 9) == "NW_WBWMSH") + CreateItemOnObject("NW_WAMAR001", oCreature, Random(99) + 1); + if(GetStringLeft(sChoice, 8) == "NW_WBWSL" + || GetStringLeft(sChoice, 9) == "NW_WBWMSL") + CreateItemOnObject("NW_WAMBU001", oCreature, Random(99) + 1); + } +return oObject; +} + + + + + +object GiveArmor(object oCreature = OBJECT_SELF) +{ +object oObject = OBJECT_INVALID; +float fRunningChance; +float Chance = 0.0; +int iCounter1 = 1; +int Items; +int Class; +int END; +while(!END) + { + switch(iCounter1) + { +//////////////////////////////////////////////////////////////////////////// +/*////////////////////////////////////////////////////////////////////////// +The following table represents the chance of a creature having an item from +this treasure table based upon its class. Remark in the class type and edit +the chance accordingly. +*/////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////// +//case 1:Class = CLASS_TYPE_ABERRATION; Chance = 100.0; break; +//case 2:Class = CLASS_TYPE_ANIMAL; Chance = 100.0; break; +case 3:Class = CLASS_TYPE_BARBARIAN; Chance = 7.5; break; +case 4:Class = CLASS_TYPE_BARD; Chance = 2.5; break; +//case 5:Class = CLASS_TYPE_BEAST; Chance = 100.0; break; +case 6:Class = CLASS_TYPE_CLERIC; Chance = 5.0; break; +case 7:Class = CLASS_TYPE_COMMONER; Chance = 2.5; break; +case 8:Class = CLASS_TYPE_CONSTRUCT; Chance = 1.0; break; +//case 9:Class = CLASS_TYPE_DRAGON; Chance = 100.0; break; +case 10:Class = CLASS_TYPE_DRUID; Chance = 2.5; break; +//case 11:Class = CLASS_TYPE_ELEMENTAL; Chance = 100.0; break; +//case 12:Class = CLASS_TYPE_FEY; Chance = 100.0; break; +case 13:Class = CLASS_TYPE_FIGHTER; Chance = 7.5; break; +case 14:Class = CLASS_TYPE_GIANT; Chance = 1.0; break; +case 15:Class = CLASS_TYPE_HUMANOID; Chance = 5.0; break; +//case 16:Class = CLASS_TYPE_MAGICAL_BEAST; Chance = 100.0;break; +case 17:Class = CLASS_TYPE_MONK; Chance = 2.0; break; +//case 18:Class = CLASS_TYPE_MONSTROUS; Chance = 100.0; break; +//case 19:Class = CLASS_TYPE_OUTSIDER; Chance = 100.0; break; +case 20:Class = CLASS_TYPE_PALADIN; Chance = 7.5; break; +case 21:Class = CLASS_TYPE_RANGER; Chance = 5.0; break; +case 22:Class = CLASS_TYPE_ROGUE; Chance = 5.0; break; +case 23:Class = CLASS_TYPE_SHAPECHANGER; Chance = 1.0; break; +case 24:Class = CLASS_TYPE_SORCERER; Chance = 0.5; break; +case 25:Class = CLASS_TYPE_UNDEAD; Chance = 2.0; break; +//case 26:Class = CLASS_TYPE_VERMIN; Chance = 100.0; break; +case 27:Class = CLASS_TYPE_WIZARD; Chance = 0.5; break; +//////////////////////////////////////////////////////////////////////////// +/* END OF TABLE +*/////////////////////////////////////////////////////////////////////////// + case 28:END = TRUE; + default: break; + } + if(GetLevelByClass(Class) && Chance > fRunningChance) fRunningChance = Chance; + iCounter1++; + } +Chance = fRunningChance; +if(Random(10000) <= FloatToInt(Chance * 100.0)) + { +string sChoice; + int iChoices = 6; // set this to the number of "rarity catagories" in the table. + int iRarityChoice = FloatToInt(1.0 + (IntToFloat(iChoices - 1) * fCRFactor)); + int iRarityLevel = Random(iRarityChoice) + 1; + switch(iRarityLevel) + { + case 1: + Items = 5; + switch(Random(Items)+1) + { + case 1:sChoice = "NW_AARCL012"; break; + case 2:sChoice = "NW_AARCL001"; break; + case 3:sChoice = "NW_AARCL009"; break; + case 4:sChoice = "NW_AARCL002"; break; + case 5:sChoice = "NW_ASHSW001"; break; + default: break; + } + break; + case 2: + Items = 10; + switch(Random(Items)+1) + { + case 1:sChoice = "NW_MAARCL046"; break; + case 2:sChoice = "NW_MAARCL044"; break; + case 3:sChoice = "NW_MAARCL043"; break; + case 4:sChoice = "NW_MAARCL045"; break; + case 5:sChoice = "NW_ASHMSW002"; break; + case 6:sChoice = "NW_AARCL010"; break; + case 7:sChoice = "NW_AARCL004"; break; + case 8:sChoice = "NW_AARCL008"; break; + case 9:sChoice = "NW_AARCL003"; break; + case 10:sChoice = "NW_ASHLW001"; break; + default: break; + } + break; + case 3: + Items = 15; + switch(Random(Items)+1) + { + case 1:sChoice = "NW_MAARCL067"; break; + case 2:sChoice = "NW_MAARCL071"; break; + case 3:sChoice = "NW_MAARCL072"; break; + case 4:sChoice = "NW_MAARCL075"; break; + case 5:sChoice = "NW_ASHMSW008"; break; + case 6:sChoice = "NW_MAARCL049"; break; + case 7:sChoice = "NW_MAARCL035"; break; + case 8:sChoice = "NW_MAARCL047"; break; + case 9:sChoice = "NW_MAARCL048"; break; + case 10:sChoice = "NW_AARCL011"; break; + case 11:sChoice = "NW_AARCL007"; break; + case 12:sChoice = "NW_AARCL006"; break; + case 13:sChoice = "NW_AARCL005"; break; + case 14:sChoice = "NW_ASHMLW002"; break; + case 15:sChoice = "NW_ASHTO001"; break; + default: break; + } + break; + case 4: + Items = 15; + switch(Random(Items)+1) + { + case 1:sChoice = "NW_MAARCL079"; break; + case 2:sChoice = "NW_MAARCL083"; break; + case 3:sChoice = "NW_MAARCL084"; break; + case 4:sChoice = "NW_MAARCL087"; break; + case 5:sChoice = "NW_ASHMSW009"; break; + case 6:sChoice = "NW_MAARCL065"; break; + case 7:sChoice = "NW_MAARCL066"; break; + case 8:sChoice = "NW_MAARCL070"; break; + case 9:sChoice = "NW_MAARCL073"; break; + case 10:sChoice = "NW_ASHMLW008"; break; + case 11:sChoice = "NW_MAARCL051"; break; + case 12:sChoice = "NW_MAARCL053"; break; + case 13:sChoice = "NW_MAARCL052"; break; + case 14:sChoice = "NW_MAARCL050"; break; + case 15:sChoice = "NW_ASHMTO002"; break; + default: break; + } + break; + case 5: + Items = 10; + switch(Random(Items)+1) + { + case 1:sChoice = "NW_MAARCL077"; break; + case 2:sChoice = "NW_MAARCL078"; break; + case 3:sChoice = "NW_MAARCL082"; break; + case 4:sChoice = "NW_MAARCL085"; break; + case 5:sChoice = "NW_ASHMLW009"; break; + case 6:sChoice = "NW_MAARCL064"; break; + case 7:sChoice = "NW_MAARCL068"; break; + case 8:sChoice = "NW_MAARCL069"; break; + case 9:sChoice = "NW_MAARCL074"; break; + case 10:sChoice = "NW_ASHMTO008"; break; + default: break; + } + break; + case 6: + Items = 5; + switch(Random(Items)+1) + { + case 1:sChoice = "NW_MAARCL076"; break; + case 2:sChoice = "NW_MAARCL080"; break; + case 3:sChoice = "NW_MAARCL081"; break; + case 4:sChoice = "NW_MAARCL086"; break; + case 5:sChoice = "NW_ASHMTO009"; break; + default: break; + } + break; + default: break; + } + oObject = CreateItemOnObject(sChoice, oCreature); + } +return oObject; +} + + + + + +object GiveMageWeapons(object oCreature = OBJECT_SELF) +{ +object oObject = OBJECT_INVALID; +float fRunningChance; +float Chance = 0.0; +int iCounter = 1; +int Class; +int END; +while(!END) + { + switch(iCounter) + { +//////////////////////////////////////////////////////////////////////////// +/*////////////////////////////////////////////////////////////////////////// +The following table represents the chance of a creature having an item from +this treasure table based upon its class. Remark in the class type and edit +the chance accordingly. +*/////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////// +//case 1:Class = CLASS_TYPE_ABERRATION; Chance = 100.0; break; +//case 2:Class = CLASS_TYPE_ANIMAL; Chance = 100.0; break; +case 3:Class = CLASS_TYPE_BARBARIAN; Chance = 5.0; break; +case 4:Class = CLASS_TYPE_BARD; Chance = 15.0; break; +//case 5:Class = CLASS_TYPE_BEAST; Chance = 100.0; break; +case 6:Class = CLASS_TYPE_CLERIC; Chance = 30.0; break; +case 7:Class = CLASS_TYPE_COMMONER; Chance = 5.0; break; +//case 8:Class = CLASS_TYPE_CONSTRUCT; Chance = 100.0; break; +case 9:Class = CLASS_TYPE_DRAGON; Chance = 10.0; break; +case 10:Class = CLASS_TYPE_DRUID; Chance = 25.0; break; +//case 11:Class = CLASS_TYPE_ELEMENTAL; Chance = 100.0; break; +//case 12:Class = CLASS_TYPE_FEY; Chance = 100.0; break; +//case 13:Class = CLASS_TYPE_FIGHTER; Chance = 100.0; break; +//case 14:Class = CLASS_TYPE_GIANT; Chance = 100.0; break; +case 15:Class = CLASS_TYPE_HUMANOID; Chance = 2.5; break; +//case 16:Class = CLASS_TYPE_MAGICAL_BEAST; Chance = 100.0; break; +//case 17:Class = CLASS_TYPE_MONK; Chance = 100.0; break; +//case 18:Class = CLASS_TYPE_MONSTROUS; Chance = 100.0; break; +//case 19:Class = CLASS_TYPE_OUTSIDER; Chance = 100.0; break; +//case 20:Class = CLASS_TYPE_PALADIN; Chance = 100.0; break; +//case 21:Class = CLASS_TYPE_RANGER; Chance = 100.0; break; +case 22:Class = CLASS_TYPE_ROGUE; Chance = 20.0; break; +//case 23:Class = CLASS_TYPE_SHAPECHANGER; Chance = 100.0; break; +case 24:Class = CLASS_TYPE_SORCERER; Chance = 50.0; break; +//case 25:Class = CLASS_TYPE_UNDEAD; Chance = 100.0; break; +//case 26:Class = CLASS_TYPE_VERMIN; Chance = 100.0; break; +case 27:Class = CLASS_TYPE_WIZARD; Chance = 50.0; break; +//////////////////////////////////////////////////////////////////////////// +/* END OF TABLE +*/////////////////////////////////////////////////////////////////////////// + case 28:END = TRUE; + default: break; + } + if(GetLevelByClass(Class) && Chance > fRunningChance) fRunningChance = Chance; + iCounter++; + } +Chance = fRunningChance; +if(Random(10000) <= FloatToInt(Chance * 100.0)) + { + float fChance; + float fMinCR; + float fMaxCR; + int iCounter1; + int iCounter2; + int iMaxNum; + int iMinNum; + string sIfIs; + string sChoice = "nil"; + while(sChoice != "") + { + sChoice = ""; + switch(iCounter1) + { +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//DO NOT EDIT ABOVE THIS LINE///////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//CUSTOM TREASURE TABLE BELOW://////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + case 0:sChoice = "NW_WMGMRD004";// Treasure resref goes between the " marks. + sIfIs = ""; // Only give this treasure to a creature with this TAG (TAG not RESREF. This allows us to be more specific since the creature already exists when this script is called). + fMinCR = 10.0; // Only give this treasure to a creature whose challenge rating is between these two values. + fMaxCR = 0.0; // Leave them at 0.0 if you wish them not to be considered. + fChance = 0.5; // Set this to the percentage chance of the creature having this item. This is accurate to one one thousandth (0.001). + iMinNum = 1; // + iMaxNum = 1; // The minimum and maximum numbers of this treasure item to randomly give. + break; + + case 1:sChoice = "nw_wmgmrd006"; + sIfIs = ""; + fMinCR = 0.0; + fMaxCR = 0.0; + fChance = 0.5; + iMinNum = 1; + iMaxNum = 1; + break; + + case 2:sChoice = "NW_WMGMRD002"; + sIfIs = ""; + fMinCR = 13.0; + fMaxCR = 0.0; + fChance = 0.5; + iMinNum = 1; + iMaxNum = 1; + break; + + case 3:sChoice = "NW_WMGMRD005"; + sIfIs = ""; + fMinCR = 10.0; + fMaxCR = 0.0; + fChance = 0.5; + iMinNum = 1; + iMaxNum = 1; + break; + + case 4:sChoice = "NW_WMGMRD003"; + sIfIs = ""; + fMinCR = 7.0; + fMaxCR = 0.0; + fChance = 0.5; + iMinNum = 1; + iMaxNum = 1; + break; + + case 5:sChoice = "NW_WMGRD002"; + sIfIs = ""; + fMinCR = 4.0; + fMaxCR = 0.0; + fChance = 0.5; + iMinNum = 1; + iMaxNum = 1; + break; + + case 6:sChoice = "NW_WMGST002"; + sIfIs = ""; + fMinCR = 11.0; + fMaxCR = 0.0; + fChance = 0.5; + iMinNum = 1; + iMaxNum = 1; + break; + + case 7:sChoice = "NW_WMGST004"; + sIfIs = ""; + fMinCR = 7.0; + fMaxCR = 0.0; + fChance = 0.5; + iMinNum = 1; + iMaxNum = 1; + break; + + case 8:sChoice = "NW_WMGST005"; + sIfIs = ""; + fMinCR = 8.0; + fMaxCR = 0.0; + fChance = 0.5; + iMinNum = 1; + iMaxNum = 1; + break; + + case 9:sChoice = "NW_WMGST006"; + sIfIs = ""; + fMinCR = 6.0; + fMaxCR = 0.0; + fChance = 0.5; + iMinNum = 1; + iMaxNum = 1; + break; + + case 10:sChoice = "NW_WMGST003"; + sIfIs = ""; + fMinCR = 18.0; + fMaxCR = 0.0; + fChance = 0.5; + iMinNum = 1; + iMaxNum = 1; + break; + + case 11:sChoice = "NW_IT_NOVEL008"; + sIfIs = ""; + fMinCR = 16.0; + fMaxCR = 0.0; + fChance = 0.5; + iMinNum = 1; + iMaxNum = 1; + break; + + case 12:sChoice = "NW_WMGWN011"; + sIfIs = ""; + fMinCR = 7.0; + fMaxCR = 0.0; + fChance = 0.5; + iMinNum = 1; + iMaxNum = 1; + break; + + case 13:sChoice = "NW_WMGWN003"; + sIfIs = ""; + fMinCR = 7.0; + fMaxCR = 0.0; + fChance = 0.5; + iMinNum = 1; + iMaxNum = 1; + break; + + case 14:sChoice = "NW_WMGWN002"; + sIfIs = ""; + fMinCR = 6.0; + fMaxCR = 0.0; + fChance = 0.5; + iMinNum = 1; + iMaxNum = 1; + break; + + case 15:sChoice = "NW_WMGWN013"; + sIfIs = ""; + fMinCR = 0.0; + fMaxCR = 0.0; + fChance = 0.5; + iMinNum = 1; + iMaxNum = 1; + break; + + case 16:sChoice = "NW_WMGWN007"; + sIfIs = ""; + fMinCR = 6.0; + fMaxCR = 0.0; + fChance = 0.5; + iMinNum = 1; + iMaxNum = 1; + break; + + case 17:sChoice = "NW_WMGWN004"; + sIfIs = ""; + fMinCR = 0.0; + fMaxCR = 0.0; + fChance = 0.5; + iMinNum = 1; + iMaxNum = 1; + break; + + case 18:sChoice = "NW_WMGWN006"; + sIfIs = ""; + fMinCR = 0.0; + fMaxCR = 0.0; + fChance = 0.5; + iMinNum = 1; + iMaxNum = 1; + break; + + case 19:sChoice = "NW_WMGWN005"; + sIfIs = ""; + fMinCR = 8.0; + fMaxCR = 0.0; + fChance = 0.5; + iMinNum = 1; + iMaxNum = 1; + break; + + case 20:sChoice = "nw_wmgwn012"; + sIfIs = ""; + fMinCR = 3.0; + fMaxCR = 0.0; + fChance = 0.5; + iMinNum = 1; + iMaxNum = 1; + break; + + case 21:sChoice = "NW_WMGWN010"; + sIfIs = ""; + fMinCR = 7.0; + fMaxCR = 0.0; + fChance = 0.5; + iMinNum = 1; + iMaxNum = 1; + break; + + case 22:sChoice = "NW_WMGWN008"; + sIfIs = ""; + fMinCR = 8.0; + fMaxCR = 0.0; + fChance = 0.5; + iMinNum = 1; + iMaxNum = 1; + break; + + case 23:sChoice = "NW_WMGWN009"; + sIfIs = ""; + fMinCR = 8.0; + fMaxCR = 0.0; + fChance = 0.5; + iMinNum = 1; + iMaxNum = 1; + break; + + case 24:sChoice = ""; + sIfIs = ""; + fMinCR = 0.0; + fMaxCR = 0.0; + fChance = 0.0; + iMinNum = 1; + iMaxNum = 1; + break; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//END OF CUSTOM TREASURE TABLE! DO NOT EDIT BELOW THIS LINE/////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + } + if((sIfIs == "" || sIfIs == GetTag(oCreature)) + && (fMinCR == 0.0 || (fMinCR != 0.0 && GetChallengeRating(oCreature) >= fMinCR)) + && (fMaxCR == 0.0 || (fMaxCR != 0.0 && GetChallengeRating(oCreature) <= fMaxCR)) + && Random(10000) + 1 <= FloatToInt(fChance * 100.0)) + { + CreateItemOnObject(sChoice, oCreature, Random((iMaxNum + 1) - iMinNum) + iMinNum); + } + iCounter1++; + } + } +return oObject; +} + + + + + +object GiveScrolls(object oCreature = OBJECT_SELF) +{ +object oObject = OBJECT_INVALID; +float fRunningChance; +float Chance = 0.0; +int iCounter1 = 1; +int Items; +int Class; +int END; +while(!END) + { + switch(iCounter1) + { +//////////////////////////////////////////////////////////////////////////// +/*////////////////////////////////////////////////////////////////////////// +The following table represents the chance of a creature having an item from +this treasure table based upon its class. Remark in the class type and edit +the chance accordingly. +*/////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////// +//case 1:Class = CLASS_TYPE_ABERRATION; Chance = 100.0; break; +//case 2:Class = CLASS_TYPE_ANIMAL; Chance = 100.0; break; +case 3:Class = CLASS_TYPE_BARBARIAN; Chance = 1.0; break; +case 4:Class = CLASS_TYPE_BARD; Chance = 2.5; break; +//case 5:Class = CLASS_TYPE_BEAST; Chance = 100.0; break; +case 6:Class = CLASS_TYPE_CLERIC; Chance = 4.0; break; +case 7:Class = CLASS_TYPE_COMMONER; Chance = 1.0; break; +//case 8:Class = CLASS_TYPE_CONSTRUCT; Chance = 100.0; break; +case 9:Class = CLASS_TYPE_DRAGON; Chance = 12.0; break; +case 10:Class = CLASS_TYPE_DRUID; Chance = 3.0; break; +//case 11:Class = CLASS_TYPE_ELEMENTAL; Chance = 100.0; break; +case 12:Class = CLASS_TYPE_FEY; Chance = 14.0; break; +case 13:Class = CLASS_TYPE_FIGHTER; Chance = 0.5; break; +case 14:Class = CLASS_TYPE_GIANT; Chance = 0.5; break; +case 15:Class = CLASS_TYPE_HUMANOID; Chance = 0.5; break; +//case 16:Class = CLASS_TYPE_MAGICAL_BEAST;Chance = 100.0; break; +case 17:Class = CLASS_TYPE_MONK; Chance = 11.0; break; +//case 18:Class = CLASS_TYPE_MONSTROUS; Chance = 100.0; break; +//case 19:Class = CLASS_TYPE_OUTSIDER; Chance = 100.0; break; +case 20:Class = CLASS_TYPE_PALADIN; Chance = 2.5; break; +case 21:Class = CLASS_TYPE_RANGER; Chance = 12.5; break; +case 22:Class = CLASS_TYPE_ROGUE; Chance = 12.5; break; +//case 23:Class = CLASS_TYPE_SHAPECHANGER; Chance = 100.0; break; +case 24:Class = CLASS_TYPE_SORCERER; Chance = 15.0; break; +//case 25:Class = CLASS_TYPE_UNDEAD; Chance = 100.0 break; +//case 26:Class = CLASS_TYPE_VERMIN; Chance = 100.0 break; +case 27:Class = CLASS_TYPE_WIZARD; Chance = 15.0; break; +/////////////////////////////////////////////////////////////////////////// +/* END OF TABLE */ +/////////////////////////////////////////////////////////////////////////// + case 28:END = TRUE; break; + default: break; + } + if(GetLevelByClass(Class) && Chance > fRunningChance) fRunningChance = Chance; + iCounter1++; + } +Chance = fRunningChance; +if(Random(10000) <= FloatToInt(Chance * 100.0)) + { + string sChoice; + int iChoices = 9; // set this to the number of "rarity catagories" in the table. + int iRarityChoice = FloatToInt(1.0 + (IntToFloat(iChoices - 1) * fCRFactor)); + int iRarityLevel = Random(iRarityChoice) + 1; + switch(iRarityLevel) + { +case 1: +//////////////////////////////////////////// +/* SPELL LEVEL 1 */ +//////////////////////////////////////////// +//////////////////////////////////////////// +Items = 17; +switch(Random(Items) + 1) +{ +case 1:sChoice = "NW_IT_SPARSCR112"; break; +case 2:sChoice = "NW_IT_SPARSCR107"; break; +case 3:sChoice = "NW_IT_SPARSCR110"; break; +case 4:sChoice = "NW_IT_SPARSCR206"; break; +case 5:sChoice = "NW_IT_SPARSCR101"; break; +case 6:sChoice = "NW_IT_SPARSCR103"; break; +case 7:sChoice = "NW_IT_SPARSCR106"; break; +case 8:sChoice = "NW_IT_SPARSCR004"; break; +case 9:sChoice = "NW_IT_SPARSCR104"; break; +case 10:sChoice = "NW_IT_SPARSCR109"; break; +case 11:sChoice = "nw_it_sparscr113"; break; +case 12:sChoice = "NW_IT_SPARSCR102"; break; +case 13:sChoice = "NW_IT_SPARSCR111"; break; +case 14:sChoice = "NW_IT_SPARSCR002"; break; +case 15:sChoice = "NW_IT_SPARSCR001"; break; +case 16:sChoice = "NW_IT_SPARSCR108"; break; +case 17:sChoice = "NW_IT_SPARSCR105"; break; +} +//////////////////////////////////////////// +/* END OF TABLE */ +//////////////////////////////////////////// +break; + + +case 2: +//////////////////////////////////////////// +/* SPELL LEVEL 2 */ +//////////////////////////////////////////// +//////////////////////////////////////////// +Items = 25; +switch (Random(Items) + 1) +{ +case 1:sChoice = "NW_IT_SPARSCR211"; break; +case 2:sChoice = "NW_IT_SPARSCR212"; break; +case 3:sChoice = "NW_IT_SPARSCR213"; break; +case 4:sChoice = "NW_IT_SPDVSCR202"; break; +case 5:sChoice = "NW_IT_SPARSCR217"; break; +case 6:sChoice = "NW_IT_SPARSCR206"; break; +case 7:sChoice = "nw_it_sparscr219"; break; +case 8:sChoice = "NW_IT_SPARSCR215"; break; +case 9:sChoice = "nw_it_sparscr220"; break; +case 10:sChoice = "NW_IT_SPARSCR208"; break; +case 11:sChoice = "NW_IT_SPARSCR209"; break; +case 12:sChoice = "NW_IT_SPARSCR207"; break; +case 13:sChoice = "NW_IT_SPARSCR216"; break; +case 14:sChoice = "NW_IT_SPARSCR218"; break; +case 15:sChoice = "NW_IT_SPDVSCR201"; break; +case 16:sChoice = "NW_IT_SPARSCR202"; break; +case 17:sChoice = "nw_it_sparscr221"; break; +case 18:sChoice = "NW_IT_SPARSCR201"; break; +case 19:sChoice = "NW_IT_SPARSCR210"; break; +case 20:sChoice = "NW_IT_SPARSCR205"; break; +case 21:sChoice = "NW_IT_SPDVSCR203"; break; +case 22:sChoice = "NW_IT_SPDVSCR204"; break; +case 23:sChoice = "NW_IT_SPARSCR203"; break; +case 24:sChoice = "NW_IT_SPARSCR214"; break; +case 25:sChoice = "NW_IT_SPARSCR204"; break; +} +//////////////////////////////////////////// +/* END OF TABLE */ +//////////////////////////////////////////// +break; + + +case 3: +//////////////////////////////////////////// +/* SPELL LEVEL 3 */ +//////////////////////////////////////////// +//////////////////////////////////////////// +Items = 18; +switch (Random(Items) + 1) +{ +case 1:sChoice = "NW_IT_SPARSCR307"; break; +case 2:sChoice = "NW_IT_SPARSCR301"; break; +case 3:sChoice = "NW_IT_SPARSCR309"; break; +case 4:sChoice = "NW_IT_SPARSCR304"; break; +case 5:sChoice = "NW_IT_SPARSCR312"; break; +case 6:sChoice = "NW_IT_SPARSCR308"; break; +case 7:sChoice = "NW_IT_SPARSCR314"; break; +case 8:sChoice = "NW_IT_SPARSCR310"; break; +case 9:sChoice = "NW_IT_SPARSCR302"; break; +case 10:sChoice = "nw_it_sparscr315"; break; +case 11:sChoice = "NW_IT_SPARSCR303"; break; +case 12:sChoice = "NW_IT_SPDVSCR501"; break; +case 13:sChoice = "NW_IT_SPDVSCR301"; break; +case 14:sChoice = "NW_IT_SPDVSCR302"; break; +case 15:sChoice = "NW_IT_SPARSCR313"; break; +case 16:sChoice = "NW_IT_SPARSCR305"; break; +case 17:sChoice = "NW_IT_SPARSCR306"; break; +case 18:sChoice = "NW_IT_SPARSCR311"; break; +} +//////////////////////////////////////////// +/* END OF TABLE */ +//////////////////////////////////////////// +break; + + +case 4: +//////////////////////////////////////////// +/* SPELL LEVEL 4 */ +//////////////////////////////////////////// +//////////////////////////////////////////// +Items = 19; +switch (Random(Items) + 1) +{ +case 1:sChoice = "NW_IT_SPARSCR414"; break; +case 2:sChoice = "NW_IT_SPARSCR405"; break; +case 3:sChoice = "NW_IT_SPARSCR406"; break; +case 4:sChoice = "NW_IT_SPARSCR411"; break; +case 5:sChoice = "NW_IT_SPARSCR416"; break; +case 6:sChoice = "NW_IT_SPARSCR412"; break; +case 7:sChoice = "NW_IT_SPARSCR413"; break; +case 8:sChoice = "NW_IT_SPARSCR408"; break; +case 9:sChoice = "NW_IT_SPARSCR417"; break; +case 10:sChoice = "NW_IT_SPARSCR401"; break; +case 11:sChoice = "NW_IT_SPDVSCR402"; break; +case 12:sChoice = "NW_IT_SPARSCR409"; break; +case 13:sChoice = "NW_IT_SPARSCR415"; break; +case 14:sChoice = "NW_IT_SPARSCR402"; break; +case 15:sChoice = "NW_IT_SPDVSCR401"; break; +case 16:sChoice = "NW_IT_SPARSCR410"; break; +case 17:sChoice = "NW_IT_SPARSCR403"; break; +case 18:sChoice = "NW_IT_SPARSCR404"; break; +case 19:sChoice = "NW_IT_SPARSCR407"; break; +} +//////////////////////////////////////////// +/* END OF TABLE */ +//////////////////////////////////////////// +break; + + +case 5: +//////////////////////////////////////////// +/* SPELL LEVEL 5 */ +//////////////////////////////////////////// +//////////////////////////////////////////// +Items = 13; +switch (Random(Items) + 1) +{ +case 1:sChoice = "NW_IT_SPARSCR509"; break; +case 2:sChoice = "NW_IT_SPARSCR502"; break; +case 3:sChoice = "NW_IT_SPARSCR507"; break; +case 4:sChoice = "NW_IT_SPARSCR501"; break; +case 5:sChoice = "NW_IT_SPARSCR503"; break; +case 6:sChoice = "NW_IT_SPARSCR504"; break; +case 7:sChoice = "NW_IT_SPARSCR508"; break; +case 8:sChoice = "NW_IT_SPARSCR505"; break; +case 9:sChoice = "NW_IT_SPARSCR511"; break; +case 10:sChoice = "NW_IT_SPARSCR512"; break; +case 11:sChoice = "NW_IT_SPARSCR513"; break; +case 12:sChoice = "NW_IT_SPARSCR506"; break; +case 13:sChoice = "NW_IT_SPARSCR510"; break; +} +//////////////////////////////////////////// +/* END OF TABLE */ +//////////////////////////////////////////// +break; + + +case 6: +//////////////////////////////////////////// +/* SPELL LEVEL 6 */ +//////////////////////////////////////////// +//////////////////////////////////////////// +Items = 14; +switch (Random(Items) + 1) +{ +case 1:sChoice = "NW_IT_SPARSCR603"; break; +case 2:sChoice = "NW_IT_SPARSCR607"; break; +case 3:sChoice = "NW_IT_SPARSCR610"; break; +case 4:sChoice = "NW_IT_SPARSCR608"; break; +case 5:sChoice = "NW_IT_SPARSCR601"; break; +case 6:sChoice = "NW_IT_SPARSCR602"; break; +case 7:sChoice = "NW_IT_SPARSCR612"; break; +case 8:sChoice = "NW_IT_SPARSCR613"; break; +case 9:sChoice = "NW_IT_SPARSCR611"; break; +case 10:sChoice = "NW_IT_SPARSCR604"; break; +case 11:sChoice = "NW_IT_SPARSCR609"; break; +case 12:sChoice = "NW_IT_SPARSCR605"; break; +case 13:sChoice = "nw_it_sparscr614"; break; +case 14:sChoice = "NW_IT_SPARSCR606"; break; +} +//////////////////////////////////////////// +/* END OF TABLE */ +//////////////////////////////////////////// +break; + + +case 7: +//////////////////////////////////////////// +/* SPELL LEVEL 7 */ +//////////////////////////////////////////// +//////////////////////////////////////////// +Items = 10; +switch (Random(Items) + 1) +{ +case 1:sChoice = "NW_IT_SPARSCR707"; break; +case 2:sChoice = "NW_IT_SPARSCR704"; break; +case 3:sChoice = "NW_IT_SPARSCR708"; break; +case 4:sChoice = "NW_IT_SPDVSCR701"; break; +case 5:sChoice = "NW_IT_SPARSCR705"; break; +case 6:sChoice = "NW_IT_SPARSCR702"; break; +case 7:sChoice = "NW_IT_SPARSCR706"; break; +case 8:sChoice = "NW_IT_SPDVSCR702"; break; +case 9:sChoice = "NW_IT_SPARSCR701"; break; +case 10:sChoice = "NW_IT_SPARSCR703"; break; +} +//////////////////////////////////////////// +/* END OF TABLE */ +//////////////////////////////////////////// +break; + + +case 8: +//////////////////////////////////////////// +/* SPELL LEVEL 8 */ +//////////////////////////////////////////// +//////////////////////////////////////////// +Items = 9; +switch (Random(Items) + 1) +{ +case 1:sChoice = "NW_IT_SPARSCR803"; break; +case 2:sChoice = "NW_IT_SPARSCR809"; break; +case 3:sChoice = "NW_IT_SPARSCR804"; break; +case 4:sChoice = "NW_IT_SPARSCR807"; break; +case 5:sChoice = "NW_IT_SPARSCR806"; break; +case 6:sChoice = "NW_IT_SPARSCR801"; break; +case 7:sChoice = "NW_IT_SPARSCR808"; break; +case 8:sChoice = "NW_IT_SPARSCR802"; break; +case 9:sChoice = "NW_IT_SPARSCR805"; break; +} +//////////////////////////////////////////// +/* END OF TABLE */ +//////////////////////////////////////////// +break; + + +case 9: +//////////////////////////////////////////// +/* SPELL LEVEL 9 */ +//////////////////////////////////////////// +//////////////////////////////////////////// +Items = 12; +switch (Random(Items) + 1) +{ +case 1:sChoice = "NW_IT_SPARSCR905"; break; +case 2:sChoice = "NW_IT_SPARSCR908"; break; +case 3:sChoice = "NW_IT_SPARSCR902"; break; +case 4:sChoice = "NW_IT_SPARSCR912"; break; +case 5:sChoice = "NW_IT_SPARSCR906"; break; +case 6:sChoice = "NW_IT_SPARSCR901"; break; +case 7:sChoice = "NW_IT_SPARSCR903"; break; +case 8:sChoice = "NW_IT_SPARSCR910"; break; +case 9:sChoice = "NW_IT_SPARSCR904"; break; +case 10:sChoice = "NW_IT_SPARSCR911"; break; +case 11:sChoice = "NW_IT_SPARSCR909"; break; +case 12:sChoice = "NW_IT_SPARSCR907"; break; +} +//////////////////////////////////////////// +/* END OF TABLE */ +//////////////////////////////////////////// +break; + } + oObject = CreateItemOnObject(sChoice); + } +return oObject; +} + + + + + +object GiveGems(object oCreature = OBJECT_SELF) +{ +object oObject = OBJECT_INVALID; +float fRunningChance; +float Chance = 0.0; +int iCounter = 1; +int Class; +int END; +while(!END) + { + switch(iCounter) + { +//////////////////////////////////////////////////////////////////////////// +/*////////////////////////////////////////////////////////////////////////// +The following table represents the chance of a creature having an item from +this treasure table based upon its class. Remark in the class type and edit +the chance accordingly. +*/////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////// +//case 1:Class = CLASS_TYPE_ABERRATION; Chance = 100.0; break; +//case 2:Class = CLASS_TYPE_ANIMAL; Chance = 100.0; break; +case 3:Class = CLASS_TYPE_BARBARIAN; Chance = 1.0; break; +case 4:Class = CLASS_TYPE_BARD; Chance = 10.0; break; +//case 5:Class = CLASS_TYPE_BEAST; Chance = 100.0; break; +case 6:Class = CLASS_TYPE_CLERIC; Chance = 5.0; break; +case 7:Class = CLASS_TYPE_COMMONER; Chance = 5.0; break; +//case 8:Class = CLASS_TYPE_CONSTRUCT; Chance = 100.0; break; +case 9:Class = CLASS_TYPE_DRAGON; Chance = 20.0; break; +case 10:Class = CLASS_TYPE_DRUID; Chance = 1.0; break; +case 11:Class = CLASS_TYPE_ELEMENTAL; Chance = 5.0; break; +case 12:Class = CLASS_TYPE_FEY; Chance = 20.0; break; +case 13:Class = CLASS_TYPE_FIGHTER; Chance = 2.5; break; +case 14:Class = CLASS_TYPE_GIANT; Chance = 2.5; break; +case 15:Class = CLASS_TYPE_HUMANOID; Chance = 2.5; break; +//case 16:Class = CLASS_TYPE_MAGICAL_BEAST; Chance = 100.0; break; +case 17:Class = CLASS_TYPE_MONK; Chance = 2.5; break; +//case 18:Class = CLASS_TYPE_MONSTROUS; Chance = 100.0; break; +//case 19:Class = CLASS_TYPE_OUTSIDER; Chance = 100.0; break; +case 20:Class = CLASS_TYPE_PALADIN; Chance = 1.0; break; +case 21:Class = CLASS_TYPE_RANGER; Chance = 5.0; break; +case 22:Class = CLASS_TYPE_ROGUE; Chance = 20.0; break; +//case 23:Class = CLASS_TYPE_SHAPECHANGER; Chance = 100.0; break; +case 24:Class = CLASS_TYPE_SORCERER; Chance = 15.0; break; +case 25:Class = CLASS_TYPE_UNDEAD; Chance = 2.5; break; +//case 26:Class = CLASS_TYPE_VERMIN; Chance = 100.0; break; +case 27:Class = CLASS_TYPE_WIZARD; Chance = 15.0; break; +//////////////////////////////////////////////////////////////////////////// +/* END OF TABLE +*/////////////////////////////////////////////////////////////////////////// + case 28:END = TRUE; + default: break; + } + if(GetLevelByClass(Class) && Chance > fRunningChance) fRunningChance = Chance; + iCounter++; + } +Chance = fRunningChance; +if(Random(10000) <= FloatToInt(Chance * 100.0)) + { + float fChance; + float fMinCR; + float fMaxCR; + int iCounter1; + int iCounter2; + int iMaxNum; + int iMinNum; + string sIfIs; + string sChoice = "nil"; + while(sChoice != "") + { + sChoice = ""; + switch(iCounter1) + { +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//DO NOT EDIT ABOVE THIS LINE///////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//CUSTOM TREASURE TABLE BELOW://////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + case 0:sChoice = "";// Treasure resref goes between the " marks. + sIfIs = ""; // Only give this treasure to a creature with this TAG (TAG not RESREF. This allows us to be more specific since the creature already exists when this script is called). + fMinCR = 0.0; // Only give this treasure to a creature whose challenge rating is between these two values. + fMaxCR = 0.0; // Leave them at 0.0 if you wish them not to be considered. + fChance = 0.5; // Set this to the percentage chance of the creature having this item. This is accurate to one one thousandth (0.001). + iMinNum = 1; // + iMaxNum = 1; // The minimum and maximum numbers of this treasure item to randomly give. + break; + + case 1:sChoice = "NW_IT_GEM013"; + sIfIs = ""; + fMinCR = 0.0; + fMaxCR = 0.0; + fChance = 2.0; + iMinNum = 1; + iMaxNum = 1; + break; + + case 2:sChoice = "NW_IT_GEM003"; + sIfIs = ""; + fMinCR =0.0; + fMaxCR = 0.0; + fChance = 5.0; + iMinNum = 1; + iMaxNum = 1; + break; + + case 3:sChoice = "NW_IT_GEM014"; + sIfIs = ""; + fMinCR = 0.0; + fMaxCR = 0.0; + fChance = 10.0; + iMinNum = 1; + iMaxNum = 1; + break; + + case 4:sChoice = "NW_IT_GEM005"; + sIfIs = ""; + fMinCR = 0.0; + fMaxCR = 0.0; + fChance = 0.1; + iMinNum = 1; + iMaxNum = 1; + break; + + case 5:sChoice = "NW_IT_GEM012"; + sIfIs = ""; + fMinCR = 0.0; + fMaxCR = 0.0; + fChance = 0.05; + iMinNum = 1; + iMaxNum = 1; + break; + + case 6:sChoice = "NW_IT_GEM002"; + sIfIs = ""; + fMinCR = 0.0; + fMaxCR = 0.0; + fChance = 10.0; + iMinNum = 1; + iMaxNum = 1; + break; + + case 7:sChoice = "NW_IT_GEM009"; + sIfIs = ""; + fMinCR = 0.0; + fMaxCR = 0.0; + fChance = 0.15; + iMinNum = 1; + iMaxNum = 1; + break; + + case 8:sChoice = "NW_IT_GEM015"; + sIfIs = ""; + fMinCR = 0.0; + fMaxCR = 0.0; + fChance = 2.0; + iMinNum = 1; + iMaxNum = 1; + break; + + case 9:sChoice = "NW_IT_GEM011"; + sIfIs = ""; + fMinCR = 0.0; + fMaxCR = 0.0; + fChance = 2.0; + iMinNum = 1; + iMaxNum = 1; + break; + + case 10:sChoice = "NW_IT_GEM001"; + sIfIs = ""; + fMinCR = 0.0; + fMaxCR = 0.0; + fChance = 15.0; + iMinNum = 1; + iMaxNum = 1; + break; + + case 11:sChoice = "NW_IT_GEM007"; + sIfIs = ""; + fMinCR = 0.0; + fMaxCR = 0.0; + fChance = 15.0; + iMinNum = 1; + iMaxNum = 1; + break; + + case 12:sChoice = "NW_IT_GEM004"; + sIfIs = ""; + fMinCR = 0.0; + fMaxCR = 0.0; + fChance = 10.0; + iMinNum = 1; + iMaxNum = 1; + break; + + case 13:sChoice = "NW_IT_GEM006"; + sIfIs = ""; + fMinCR = 0.0; + fMaxCR = 0.0; + fChance = 0.05; + iMinNum = 1; + iMaxNum = 1; + break; + + case 14:sChoice = "NW_IT_GEM008"; + sIfIs = ""; + fMinCR = 0.0; + fMaxCR = 0.0; + fChance = 0.2; + iMinNum = 1; + iMaxNum = 1; + break; + + case 15:sChoice = "NW_IT_GEM010"; + sIfIs = ""; + fMinCR = 0.0; + fMaxCR = 0.0; + fChance = 1.0; + iMinNum = 1; + iMaxNum = 1; + break; + + case 16:sChoice = ""; + sIfIs = ""; + fMinCR = 0.0; + fMaxCR = 0.0; + fChance = 0.0; + iMinNum = 0; + iMaxNum = 0; + break; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//END OF CUSTOM TREASURE TABLE! DO NOT EDIT BELOW THIS LINE/////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + } + if((sIfIs == "" || sIfIs == GetTag(oCreature)) + && (fMinCR == 0.0 || (fMinCR != 0.0 && GetChallengeRating(oCreature) >= fMinCR)) + && (fMaxCR == 0.0 || (fMaxCR != 0.0 && GetChallengeRating(oCreature) <= fMaxCR)) + && Random(10000) + 1 <= FloatToInt(fChance * 100.0)) + { + oObject = CreateItemOnObject(sChoice, oCreature, Random((iMaxNum + 1) - iMinNum) + iMinNum); + } + iCounter1++; + } + } +return oObject; +} + + + + +object GivePotions(object oCreature = OBJECT_SELF) +{ +object oObject = OBJECT_INVALID; +float fRunningChance; +float Chance = 0.0; +int iCounter = 1; +int Class; +int END; +while(!END) + { + switch(iCounter) + { +//////////////////////////////////////////////////////////////////////////// +/*////////////////////////////////////////////////////////////////////////// +The following table represents the chance of a creature having an item from +this treasure table based upon its class. Remark in the class type and edit +the chance accordingly. +*/////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////// +//case 1:Class = CLASS_TYPE_ABERRATION; Chance = 100.0; break; +//case 2:Class = CLASS_TYPE_ANIMAL; Chance = 100.0; break; +case 3:Class = CLASS_TYPE_BARBARIAN; Chance = 2.5; break; +case 4:Class = CLASS_TYPE_BARD; Chance = 5.0; break; +//case 5:Class = CLASS_TYPE_BEAST; Chance = 100.0; break; +case 6:Class = CLASS_TYPE_CLERIC; Chance = 10.0; break; +case 7:Class = CLASS_TYPE_COMMONER; Chance = 5.0; break; +//case 8:Class = CLASS_TYPE_CONSTRUCT; Chance = 100.0; break; +case 9:Class = CLASS_TYPE_DRAGON; Chance = 20.0; break; +case 10:Class = CLASS_TYPE_DRUID; Chance = 10.0; break; +//case 11:Class = CLASS_TYPE_ELEMENTAL; Chance = 100.0; break; +case 12:Class = CLASS_TYPE_FEY; Chance = 5.0; break; +case 13:Class = CLASS_TYPE_FIGHTER; Chance = 2.5; break; +case 14:Class = CLASS_TYPE_GIANT; Chance = 5.0; break; +case 15:Class = CLASS_TYPE_HUMANOID; Chance = 5.0; break; +//case 16:Class = CLASS_TYPE_MAGICAL_BEAST; Chance = 100.0; break; +case 17:Class = CLASS_TYPE_MONK; Chance = 5.0; break; +//case 18:Class = CLASS_TYPE_MONSTROUS; Chance = 100.0; break; +//case 19:Class = CLASS_TYPE_OUTSIDER; Chance = 100.0; break; +case 20:Class = CLASS_TYPE_PALADIN; Chance = 5.0; break; +case 21:Class = CLASS_TYPE_RANGER; Chance = 10.0; break; +case 22:Class = CLASS_TYPE_ROGUE; Chance = 10.0; break; +//case 23:Class = CLASS_TYPE_SHAPECHANGER; Chance = 100.0; break; +case 24:Class = CLASS_TYPE_SORCERER; Chance = 10.0; break; +//case 25:Class = CLASS_TYPE_UNDEAD; Chance = 100.0; break; +//case 26:Class = CLASS_TYPE_VERMIN; Chance = 100.0; break; +case 27:Class = CLASS_TYPE_WIZARD; Chance = 10.0; break; +//////////////////////////////////////////////////////////////////////////// +/* END OF TABLE +*/////////////////////////////////////////////////////////////////////////// + case 28:END = TRUE; + default: break; + } + if(GetLevelByClass(Class) && Chance > fRunningChance) fRunningChance = Chance; + iCounter++; + } +Chance = fRunningChance; +if(Random(10000) <= FloatToInt(Chance * 100.0)) + { + float fChance; + float fMinCR; + float fMaxCR; + int iCounter1; + int iCounter2; + int iMaxNum; + int iMinNum; + string sIfIs; + string sChoice = "nil"; + while(sChoice != "") + { + sChoice = ""; + switch(iCounter1) + { +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//DO NOT EDIT ABOVE THIS LINE///////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//CUSTOM TREASURE TABLE BELOW://////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + case 0:sChoice = "NW_IT_MPOTION016";// Treasure resref goes between the " marks. + sIfIs = ""; // Only give this treasure to a creature with this TAG (TAG not RESREF. This allows us to be more specific since the creature already exists when this script is called). + fMinCR = 0.0; // Only give this treasure to a creature whose challenge rating is between these two values. + fMaxCR = 0.0; // Leave them at 0.0 if you wish them not to be considered. + fChance = 2.0; // Set this to the percentage chance of the creature having this item. This is accurate to one one thousandth (0.001). + iMinNum = 1; // + iMaxNum = 1; // The minimum and maximum numbers of this treasure item to randomly give. + break; + + case 1:sChoice = "NW_IT_MPOTION006"; + sIfIs = ""; + fMinCR = 0.0; + fMaxCR = 0.0; + fChance = 2.0; + iMinNum = 1; + iMaxNum = 1; + break; + + case 2:sChoice = "NW_IT_MPOTION005"; + sIfIs = ""; + fMinCR =0.0; + fMaxCR = 0.0; + fChance = 2.0; + iMinNum = 1; + iMaxNum = 1; + break; + + case 3:sChoice = "NW_IT_MPOTION009"; + sIfIs = ""; + fMinCR = 0.0; + fMaxCR = 0.0; + fChance = 2.0; + iMinNum = 1; + iMaxNum = 1; + break; + + case 4:sChoice = "NW_IT_MPOTION015"; + sIfIs = ""; + fMinCR = 0.0; + fMaxCR = 0.0; + fChance = 2.0; + iMinNum = 1; + iMaxNum = 1; + break; + + case 5:sChoice = "NW_IT_MPOTION014"; + sIfIs = ""; + fMinCR = 0.0; + fMaxCR = 0.0; + fChance = 2.0; + iMinNum = 1; + iMaxNum = 1; + break; + + case 6:sChoice = "NW_IT_MPOTION007"; + sIfIs = ""; + fMinCR = 0.0; + fMaxCR = 0.0; + fChance = 2.0; + iMinNum = 1; + iMaxNum = 1; + break; + + case 7:sChoice = "NW_IT_MPOTION010"; + sIfIs = ""; + fMinCR = 0.0; + fMaxCR = 0.0; + fChance = 2.0; + iMinNum = 1; + iMaxNum = 1; + break; + + case 8:sChoice = "NW_IT_MPOTION013"; + sIfIs = ""; + fMinCR = 0.0; + fMaxCR = 0.0; + fChance = 2.0; + iMinNum = 1; + iMaxNum = 1; + break; + + case 9:sChoice = "NW_IT_MPOTION017"; + sIfIs = ""; + fMinCR = 0.0; + fMaxCR = 0.0; + fChance = 2.0; + iMinNum = 1; + iMaxNum = 1; + break; + + case 10:sChoice = "NW_IT_MPOTION012"; + sIfIs = ""; + fMinCR = 0.0; + fMaxCR = 0.0; + fChance = 2.0; + iMinNum = 1; + iMaxNum = 1; + break; + + case 11:sChoice = "NW_IT_MPOTION008"; + sIfIs = ""; + fMinCR = 0.0; + fMaxCR = 0.0; + fChance = 2.0; + iMinNum = 1; + iMaxNum = 1; + break; + + case 12:sChoice = "NW_IT_MPOTION011"; + sIfIs = ""; + fMinCR = 0.0; + fMaxCR = 0.0; + fChance = 2.0; + iMinNum = 1; + iMaxNum = 1; + break; + + case 13:sChoice = "NW_IT_MPOTION019"; + sIfIs = ""; + fMinCR = 0.0; + fMaxCR = 0.0; + fChance = 2.0; + iMinNum = 1; + iMaxNum = 1; + break; + + case 14:sChoice = "NW_IT_MPOTION018"; + sIfIs = ""; + fMinCR = 0.0; + fMaxCR = 0.0; + fChance = 2.0; + iMinNum = 1; + iMaxNum = 1; + break; + + case 15:sChoice = "NW_IT_MPOTION004"; + sIfIs = ""; + fMinCR = 0.0; + fMaxCR = 0.0; + fChance = 2.0; + iMinNum = 1; + iMaxNum = 1; + break; + + case 16:sChoice = "NW_IT_MPOTION021"; + sIfIs = ""; + fMinCR = 0.0; + fMaxCR = 0.0; + fChance = 2.0; + iMinNum = 1; + iMaxNum = 1; + break; + + case 17:sChoice = "NW_IT_MPOTION022"; + sIfIs = ""; + fMinCR = 0.0; + fMaxCR = 0.0; + fChance = 2.0; + iMinNum = 1; + iMaxNum = 1; + break; + + case 18:sChoice = "NW_IT_MPOTION023"; + sIfIs = ""; + fMinCR = 0.0; + fMaxCR = 0.0; + fChance = 2.0; + iMinNum = 1; + iMaxNum = 1; + break; + + case 19:sChoice = ""; + sIfIs = ""; + fMinCR = 0.0; + fMaxCR = 0.0; + fChance = 0.0; + iMinNum = 1; + iMaxNum = 1; + break; + + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//END OF CUSTOM TREASURE TABLE! DO NOT EDIT BELOW THIS LINE/////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + } + if((sIfIs == "" || sIfIs == GetTag(oCreature)) + && (fMinCR == 0.0 || (fMinCR != 0.0 && GetChallengeRating(oCreature) >= fMinCR)) + && (fMaxCR == 0.0 || (fMaxCR != 0.0 && GetChallengeRating(oCreature) <= fMaxCR)) + && Random(10000) + 1 <= FloatToInt(fChance * 100.0)) + { + oObject = CreateItemOnObject(sChoice, oCreature, Random((iMaxNum + 1) - iMinNum) + iMinNum); + } + iCounter1++; + } +} +return oObject; +} + + + + + +object GiveJewelry(object oCreature = OBJECT_SELF) +{ +object oObject = OBJECT_INVALID; +float fRunningChance; +float Chance = 0.0; +int iCounter1 = 1; +int Items; +int Class; +int END; +while(!END) + { + switch(iCounter1) + { +//////////////////////////////////////////////////////////////////////////// +/*////////////////////////////////////////////////////////////////////////// +The following table represents the chance of a creature having an item from +this treasure table based upon its class. Remark in the class type and edit +the chance accordingly. +*/////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////// +case 1:Class = CLASS_TYPE_ABERRATION; Chance = 1.0; break; +//case 2:Class = CLASS_TYPE_ANIMAL; Chance = 100.0; break; +case 3:Class = CLASS_TYPE_BARBARIAN; Chance = 1.0; break; +case 4:Class = CLASS_TYPE_BARD; Chance = 1.0; break; +//case 5:Class = CLASS_TYPE_BEAST; Chance = 100.0; break; +case 6:Class = CLASS_TYPE_CLERIC; Chance = 1.0; break; +case 7:Class = CLASS_TYPE_COMMONER; Chance = 1.0; break; +//case 8:Class = CLASS_TYPE_CONSTRUCT; Chance = 100.0; break; +case 9:Class = CLASS_TYPE_DRAGON; Chance = 10.0; break; +case 10:Class = CLASS_TYPE_DRUID; Chance = 1.0; break; +//case 11:Class = CLASS_TYPE_ELEMENTAL; Chance = 100.0; break; +case 12:Class = CLASS_TYPE_FEY; Chance = 1.0; break; +case 13:Class = CLASS_TYPE_FIGHTER; Chance = 1.0; break; +case 14:Class = CLASS_TYPE_GIANT; Chance = 1.0; break; +case 15:Class = CLASS_TYPE_HUMANOID; Chance = 1.0; break; +//case 16:Class = CLASS_TYPE_MAGICAL_BEAST; Chance = 100.0; break; +case 17:Class = CLASS_TYPE_MONK; Chance = 1.0; break; +case 18:Class = CLASS_TYPE_MONSTROUS; Chance = 1.0; break; +case 19:Class = CLASS_TYPE_OUTSIDER; Chance = 1.0; break; +case 20:Class = CLASS_TYPE_PALADIN; Chance = 1.0; break; +case 21:Class = CLASS_TYPE_RANGER; Chance = 1.0; break; +case 22:Class = CLASS_TYPE_ROGUE; Chance = 2.0; break; +case 23:Class = CLASS_TYPE_SHAPECHANGER; Chance = 1.0; break; +case 24:Class = CLASS_TYPE_SORCERER; Chance = 2.0; break; +case 25:Class = CLASS_TYPE_UNDEAD; Chance = 1.0; break; +//case 26:Class = CLASS_TYPE_VERMIN; Chance = 100.0; break; +case 27:Class = CLASS_TYPE_WIZARD; Chance = 1.0; break; +//////////////////////////////////////////////////////////////////////////// +/* END OF TABLE +*/////////////////////////////////////////////////////////////////////////// + case 28:END = TRUE; + default: break; + } + if(GetLevelByClass(Class) && Chance > fRunningChance) fRunningChance = Chance; + iCounter1++; + } +Chance = fRunningChance; +if(Random(10000) <= FloatToInt(Chance * 100.0)) + { +string sChoice; + int iChoices = 5; // set this to the number of "rarity catagories" in the table. + int iRarityChoice = FloatToInt(1.0 + (IntToFloat(iChoices - 1) * fCRFactor)); + int iRarityLevel = Random(iRarityChoice) + 1; + switch(iRarityLevel) + { + case 1: + Items = 14; + switch(Random(Items)+1) + { + case 1:sChoice = "NW_IT_MNECK001"; break; + case 2:sChoice = "nw_it_mneck024"; break; + case 3:sChoice = "NW_IT_MNECK007"; break; + case 4:sChoice = "NW_IT_MNECK006"; break; + case 5:sChoice = "NW_IT_MRING006"; break; + case 6:sChoice = "nw_it_mring024"; break; + case 7:sChoice = "NW_IT_MRING001"; break; + case 8:sChoice = "nw_it_mneck032"; break; + case 9:sChoice = "nw_it_mneck030"; break; + case 10:sChoice = "nw_it_mneck031"; break; + case 11:sChoice = "nw_it_mneck029"; break; + case 12:sChoice = "NW_IT_MRING012"; break; + case 13:sChoice = "NW_IT_MRING011"; break; + case 14:sChoice = "NW_IT_MRING013"; break; + default: break; + } + break; + case 2: + Items = 12; + switch(Random(Items)+1) + { + case 1:sChoice = "NW_IT_MNECK012"; break; + case 2:sChoice = "nw_it_mneck025"; break; + case 3:sChoice = "NW_IT_MNECK008"; break; + case 4:sChoice = "NW_IT_MNECK016"; break; + case 5:sChoice = "NW_IT_MRING014"; break; + case 6:sChoice = "nw_it_mring025"; break; + case 7:sChoice = "NW_IT_MRING008"; break; + case 8:sChoice = "NW_IT_MRING031"; break; + case 9:sChoice = "NW_IT_MNECK033"; break; + case 10:sChoice = "NW_IT_MRING002"; break; + case 11:sChoice = "NW_IT_MRING007"; break; + case 12:sChoice = "NW_IT_MRING003"; break; + default: break; + } + break; + case 3: + Items = 12; + switch(Random(Items)+1) + { + case 1:sChoice = "NW_IT_MNECK013"; break; + case 2:sChoice = "nw_it_mneck026"; break; + case 3:sChoice = "NW_IT_MNECK009"; break; + case 4:sChoice = "NW_IT_MNECK017"; break; + case 5:sChoice = "NW_IT_MRING015"; break; + case 6:sChoice = "nw_it_mring026"; break; + case 7:sChoice = "NW_IT_MRING018"; break; + case 8:sChoice = "NW_IT_MRING032"; break; + case 9:sChoice = "NW_IT_MNECK036"; break; + case 10:sChoice = "NW_IT_MNECK005"; break; + case 11:sChoice = "NW_IT_MRING029"; break; + case 12:sChoice = "NW_IT_MRING005"; break; + default: break; + } + break; + case 4: + Items = 9; + switch(Random(Items)+1) + { + case 1:sChoice = "NW_IT_MNECK014"; break; + case 2:sChoice = "nw_it_mneck027"; break; + case 3:sChoice = "NW_IT_MNECK010"; break; + case 4:sChoice = "NW_IT_MNECK018"; break; + case 5:sChoice = "NW_IT_MRING016"; break; + case 6:sChoice = "nw_it_mring027"; break; + case 7:sChoice = "NW_IT_MRING019"; break; + case 8:sChoice = "NW_IT_MRING033"; break; + case 9:sChoice = "NW_IT_MNECK037"; break; + default: break; + } + break; + case 5: + Items = 8; + switch(Random(Items)+1) + { + case 1:sChoice = "NW_IT_MNECK015"; break; + case 2:sChoice = "nw_it_mneck028"; break; + case 3:sChoice = "NW_IT_MNECK011"; break; + case 4:sChoice = "NW_IT_MNECK019"; break; + case 5:sChoice = "NW_IT_MRING017"; break; + case 6:sChoice = "nw_it_mring028"; break; + case 7:sChoice = "NW_IT_MRING020"; break; + case 8:sChoice = "NW_IT_MRING004"; break; + default: break; + } + break; + default: break; + } + oObject = CreateItemOnObject(sChoice, oCreature); + } +return oObject; +} + + + + + +object GiveMiscMagic(object oCreature = OBJECT_SELF) +{ +object oObject = OBJECT_INVALID; +float fRunningChance; +float Chance = 0.0; +int iCounter1 = 1; +int Items; +int Class; +int END; +while(!END) + { + switch(iCounter1) + { +//////////////////////////////////////////////////////////////////////////// +/*////////////////////////////////////////////////////////////////////////// +The following table represents the chance of a creature having an item from +this treasure table based upon its class. Remark in the class type and edit +the chance accordingly. +*/////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////// +case 1:Class = CLASS_TYPE_ABERRATION; Chance = 1.0; break; +//case 2:Class = CLASS_TYPE_ANIMAL; Chance = 100.0; break; +case 3:Class = CLASS_TYPE_BARBARIAN; Chance = 1.0; break; +case 4:Class = CLASS_TYPE_BARD; Chance = 1.0; break; +//case 5:Class = CLASS_TYPE_BEAST; Chance = 100.0; break; +case 6:Class = CLASS_TYPE_CLERIC; Chance = 1.0; break; +case 7:Class = CLASS_TYPE_COMMONER; Chance = 1.0; break; +case 8:Class = CLASS_TYPE_CONSTRUCT; Chance = 1.0; break; +case 9:Class = CLASS_TYPE_DRAGON; Chance = 5.0; break; +case 10:Class = CLASS_TYPE_DRUID; Chance = 1.0; break; +case 11:Class = CLASS_TYPE_ELEMENTAL; Chance = 1.0; break; +case 12:Class = CLASS_TYPE_FEY; Chance = 1.0; break; +case 13:Class = CLASS_TYPE_FIGHTER; Chance = 1.0; break; +case 14:Class = CLASS_TYPE_GIANT; Chance = 1.0; break; +case 15:Class = CLASS_TYPE_HUMANOID; Chance = 1.0; break; +//case 16:Class = CLASS_TYPE_MAGICAL_BEAST; Chance = 100.0; break; +case 17:Class = CLASS_TYPE_MONK; Chance = 1.0; break; +case 18:Class = CLASS_TYPE_MONSTROUS; Chance = 1.0; break; +case 19:Class = CLASS_TYPE_OUTSIDER; Chance = 1.0; break; +case 20:Class = CLASS_TYPE_PALADIN; Chance = 1.0; break; +case 21:Class = CLASS_TYPE_RANGER; Chance = 1.0; break; +case 22:Class = CLASS_TYPE_ROGUE; Chance = 1.0; break; +case 23:Class = CLASS_TYPE_SHAPECHANGER; Chance = 2.0; break; +case 24:Class = CLASS_TYPE_SORCERER; Chance = 1.0; break; +case 25:Class = CLASS_TYPE_UNDEAD; Chance = 1.0; break; +//case 26:Class = CLASS_TYPE_VERMIN; Chance = 100.0; break; +case 27:Class = CLASS_TYPE_WIZARD; Chance = 1.0; break; +//////////////////////////////////////////////////////////////////////////// +/* END OF TABLE +*/////////////////////////////////////////////////////////////////////////// + case 28:END = TRUE; + default: break; + } + if(GetLevelByClass(Class) && Chance > fRunningChance) fRunningChance = Chance; + iCounter1++; + } +Chance = fRunningChance; +if(Random(10000) <= FloatToInt(Chance * 100.0)) + { +string sChoice; + int iChoices = 5; // set this to the number of "rarity catagories" in the table. + int iRarityChoice = FloatToInt(1.0 + (IntToFloat(iChoices - 1) * fCRFactor)); + int iRarityLevel = Random(iRarityChoice) + 1; + switch(iRarityLevel) + { + case 1: + Items = 18; + switch(Random(Items)+1) + { + case 1:sChoice = "nw_it_mboots010"; break; + case 2:sChoice = "NW_IT_MBOOTS001"; break; + case 3:sChoice = "NW_IT_MBOOTS018"; break; + case 4:sChoice = "NW_IT_MBRACER002"; break; + case 5:sChoice = "NW_IT_MBRACER001"; break; + case 6:sChoice = "NW_MAARCL055"; break; + case 7:sChoice = "NW_MAARCL031"; break; + case 8:sChoice = "nw_it_mglove006"; break; + case 9:sChoice = "nw_it_mglove004"; break; + case 10:sChoice = "nw_it_mglove008"; break; + case 11:sChoice = "nw_it_mglove007"; break; + case 12:sChoice = "nw_it_mglove009"; break; + case 13:sChoice = "NW_IT_MGLOVE016"; break; + case 14:sChoice = "NW_IT_MGLOVE021"; break; + case 15:sChoice = "nw_it_mglove005"; break; + case 16:sChoice = "NW_IT_MGLOVE003"; break; + case 17:sChoice = "NW_IT_MGLOVE026"; break; + case 18:sChoice = "NW_IT_CONTAIN002"; break; + default: break; + } + break; + case 2: + Items = 16; + switch(Random(Items)+1) + { + case 1:sChoice = "nw_it_mbelt018"; break; + case 2:sChoice = "nw_it_mbelt016"; break; + case 3:sChoice = "NW_IT_MBOOTS015"; break; + case 4:sChoice = "nw_it_mboots011"; break; + case 5:sChoice = "NW_IT_MBOOTS006"; break; + case 6:sChoice = "NW_IT_MBOOTS019"; break; + case 7:sChoice = "NW_IT_MBRACER007"; break; + case 8:sChoice = "NW_IT_MBRACER003"; break; + case 9:sChoice = "NW_MAARCL104"; break; + case 10:sChoice = "NW_MAARCL088"; break; + case 11:sChoice = "NW_MAARCL092"; break; + case 12:sChoice = "NW_IT_MBRACER013"; break; + case 13:sChoice = "NW_IT_MGLOVE017"; break; + case 14:sChoice = "NW_IT_MGLOVE022"; break; + case 15:sChoice = "NW_IT_MGLOVE027"; break; + case 16:sChoice = "NW_IT_CONTAIN003"; break; + default: break; + } + break; + case 3: + Items = 18; + switch(Random(Items)+1) + { + case 1:sChoice = "nw_it_mbelt019"; break; + case 2:sChoice = "NW_IT_MBELT002"; break; + case 3:sChoice = "nw_it_mbelt017"; break; + case 4:sChoice = "NW_IT_MBOOTS016"; break; + case 5:sChoice = "nw_it_mboots012"; break; + case 6:sChoice = "NW_IT_MBOOTS007"; break; + case 7:sChoice = "NW_IT_MBOOTS020"; break; + case 8:sChoice = "NW_IT_MBOOTS003"; break; + case 9:sChoice = "NW_IT_MBRACER008"; break; + case 10:sChoice = "NW_IT_MBRACER004"; break; + case 11:sChoice = "NW_MAARCL105"; break; + case 12:sChoice = "NW_MAARCL056"; break; + case 13:sChoice = "NW_MAARCL089"; break; + case 14:sChoice = "NW_MAARCL093"; break; + case 15:sChoice = "NW_IT_MGLOVE018"; break; + case 16:sChoice = "NW_IT_MGLOVE023"; break; + case 17:sChoice = "NW_IT_MGLOVE028"; break; + case 18:sChoice = "NW_IT_CONTAIN004"; break; + default: break; + } + break; + case 4: + Items = 16; + switch(Random(Items)+1) + { + case 1:sChoice = "nw_it_mbelt020"; break; + case 2:sChoice = "NW_IT_MBELT007"; break; + case 3:sChoice = "NW_IT_MBOOTS017"; break; + case 4:sChoice = "nw_it_mboots013"; break; + case 5:sChoice = "NW_IT_MBOOTS005"; break; + case 6:sChoice = "NW_IT_MBOOTS008"; break; + case 7:sChoice = "NW_IT_MBOOTS021"; break; + case 8:sChoice = "NW_IT_MBRACER009"; break; + case 9:sChoice = "NW_IT_MBRACER005"; break; + case 10:sChoice = "NW_MAARCL106"; break; + case 11:sChoice = "NW_MAARCL090"; break; + case 12:sChoice = "NW_MAARCL094"; break; + case 13:sChoice = "NW_IT_MGLOVE019"; break; + case 14:sChoice = "NW_IT_MGLOVE024"; break; + case 15:sChoice = "NW_IT_MGLOVE029"; break; + case 16:sChoice = "NW_IT_CONTAIN005"; break; + default: break; + } + break; + case 5: + Items = 14; + switch(Random(Items)+1) + { + case 1:sChoice = "nw_it_mbelt021"; break; + case 2:sChoice = "NW_IT_MBELT002"; break; + case 3:sChoice = "nw_it_mboots014"; break; + case 4:sChoice = "NW_IT_MBOOTS008"; break; + case 5:sChoice = "NW_IT_MBOOTS009"; break; + case 6:sChoice = "NW_IT_MBOOTS022"; break; + case 7:sChoice = "NW_IT_MBRACER010"; break; + case 8:sChoice = "NW_IT_MBRACER006"; break; + case 9:sChoice = "NW_MAARCL091"; break; + case 10:sChoice = "NW_MAARCL095"; break; + case 11:sChoice = "NW_IT_MGLOVE020"; break; + case 12:sChoice = "NW_IT_MGLOVE025"; break; + case 13:sChoice = "NW_IT_MGLOVE030"; break; + case 14:sChoice = "NW_IT_CONTAIN006"; break; + default: break; + } + break; + default: break; + } + oObject = CreateItemOnObject(sChoice, oCreature); + } +return oObject; +} + + + + + +object GiveTraps(object oCreature = OBJECT_SELF) +{ +object oObject = OBJECT_INVALID; +float fRunningChance; +float Chance = 0.0; +int iCounter1 = 1; +int Items; +int Class; +int END; +while(!END) + { + switch(iCounter1) + { +//////////////////////////////////////////////////////////////////////////// +/*////////////////////////////////////////////////////////////////////////// +The following table represents the chance of a creature having an item from +this treasure table based upon its class. Remark in the class type and edit +the chance accordingly. +*/////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////// +//case 1:Class = CLASS_TYPE_ABERRATION; Chance = 100.0; break; +//case 2:Class = CLASS_TYPE_ANIMAL; Chance = 100.0; break; +//case 3:Class = CLASS_TYPE_BARBARIAN; Chance = 100.0; break; +case 4:Class = CLASS_TYPE_BARD; Chance = 2.5; break; +//case 5:Class = CLASS_TYPE_BEAST; Chance = 100.0; break; +//case 6:Class = CLASS_TYPE_CLERIC; Chance = 100.0; break; +//case 7:Class = CLASS_TYPE_COMMONER; Chance = 100.0; break; +//case 8:Class = CLASS_TYPE_CONSTRUCT; Chance = 100.0; break; +//case 9:Class = CLASS_TYPE_DRAGON; Chance = 100.0; break; +//case 10:Class = CLASS_TYPE_DRUID; Chance = 100.0; break; +//case 11:Class = CLASS_TYPE_ELEMENTAL; Chance = 100.0; break; +//case 12:Class = CLASS_TYPE_FEY; Chance = 100.0; break; +//case 13:Class = CLASS_TYPE_FIGHTER; Chance = 100.0; break; +//case 14:Class = CLASS_TYPE_GIANT; Chance = 100.0; break; +//case 15:Class = CLASS_TYPE_HUMANOID; Chance = 100.0; break; +//case 16:Class = CLASS_TYPE_MAGICAL_BEAST; Chance = 100.0; break; +//case 17:Class = CLASS_TYPE_MONK; Chance = 100.0; break; +//case 18:Class = CLASS_TYPE_MONSTROUS; Chance = 100.0; break; +//case 19:Class = CLASS_TYPE_OUTSIDER; Chance = 100.0; break; +//case 20:Class = CLASS_TYPE_PALADIN; Chance = 100.0; break; +//case 21:Class = CLASS_TYPE_RANGER; Chance = 100.0; break; +case 22:Class = CLASS_TYPE_ROGUE; Chance = 5.0; break; +//case 23:Class = CLASS_TYPE_SHAPECHANGER; Chance = 100.0; break; +//case 24:Class = CLASS_TYPE_SORCERER; Chance = 100.0; break; +//case 25:Class = CLASS_TYPE_UNDEAD; Chance = 100.0; break; +//case 26:Class = CLASS_TYPE_VERMIN; Chance = 100.0; break; +//case 27:Class = CLASS_TYPE_WIZARD; Chance = 100.0; break; +//////////////////////////////////////////////////////////////////////////// +/* END OF TABLE +*/////////////////////////////////////////////////////////////////////////// + case 28:END = TRUE; + default: break; + } + if(GetLevelByClass(Class) && Chance > fRunningChance) fRunningChance = Chance; + iCounter1++; + } +Chance = fRunningChance; +if(Random(10000) <= FloatToInt(Chance * 100.0)) + { +string sChoice; + int iChoices = 4; // set this to the number of "rarity catagories" in the table. + int iRarityChoice = FloatToInt(1.0 + (IntToFloat(iChoices - 1) * fCRFactor)); + int iRarityLevel = Random(iRarityChoice) + 1; + switch(iRarityLevel) + { + case 1: + Items = 12; + switch(Random(Items)+1) + { + case 1:sChoice = "NW_IT_TRAP033"; break; + case 2:sChoice = "NW_IT_TRAP013"; break; + case 3:sChoice = "NW_IT_TRAP021"; break; + case 4:sChoice = "NW_IT_TRAP017"; break; + case 5:sChoice = "NW_IT_TRAP029"; break; + case 6:sChoice = "NW_IT_TRAP025"; break; + case 7:sChoice = "NW_IT_TRAP005"; break; + case 8:sChoice = "NW_IT_TRAP041"; break; + case 9:sChoice = "NW_IT_TRAP037"; break; + case 10:sChoice = "NW_IT_TRAP001"; break; + case 11:sChoice = "NW_IT_TRAP009"; break; + case 12:sChoice = "NW_IT_PICKS001"; break; + default: break; + } + break; + case 2: + Items = 12; + switch(Random(Items)+1) + { + case 1:sChoice = "NW_IT_TRAP034"; break; + case 2:sChoice = "NW_IT_TRAP014"; break; + case 3:sChoice = "NW_IT_TRAP022"; break; + case 4:sChoice = "NW_IT_TRAP018"; break; + case 5:sChoice = "NW_IT_TRAP030"; break; + case 6:sChoice = "NW_IT_TRAP026"; break; + case 7:sChoice = "NW_IT_TRAP006"; break; + case 8:sChoice = "NW_IT_TRAP042"; break; + case 9:sChoice = "NW_IT_TRAP038"; break; + case 10:sChoice = "NW_IT_TRAP002"; break; + case 11:sChoice = "NW_IT_TRAP010"; break; + case 12:sChoice = "NW_IT_PICKS002"; break; + default: break; + } + break; + case 3: + Items = 12; + switch(Random(Items)+1) + { + case 1:sChoice = "NW_IT_TRAP035"; break; + case 2:sChoice = "NW_IT_TRAP015"; break; + case 3:sChoice = "NW_IT_TRAP023"; break; + case 4:sChoice = "NW_IT_TRAP019"; break; + case 5:sChoice = "NW_IT_TRAP031"; break; + case 6:sChoice = "NW_IT_TRAP027"; break; + case 7:sChoice = "NW_IT_TRAP007"; break; + case 8:sChoice = "NW_IT_TRAP043"; break; + case 9:sChoice = "NW_IT_TRAP039"; break; + case 10:sChoice = "NW_IT_TRAP003"; break; + case 11:sChoice = "NW_IT_TRAP011"; break; + case 12:sChoice = "NW_IT_PICKS003"; break; + default: break; + } + break; + case 4: + Items = 12; + switch(Random(Items)+1) + { + case 1:sChoice = "NW_IT_TRAP036"; break; + case 2:sChoice = "NW_IT_TRAP016"; break; + case 3:sChoice = "NW_IT_TRAP024"; break; + case 4:sChoice = "NW_IT_TRAP020"; break; + case 5:sChoice = "NW_IT_TRAP032"; break; + case 6:sChoice = "NW_IT_TRAP028"; break; + case 7:sChoice = "NW_IT_TRAP008"; break; + case 8:sChoice = "NW_IT_TRAP044"; break; + case 9:sChoice = "NW_IT_TRAP040"; break; + case 10:sChoice = "NW_IT_TRAP004"; break; + case 11:sChoice = "NW_IT_TRAP012"; break; + case 12:sChoice = "NW_IT_PICKS004"; break; + default: break; + } + break; + default: break; + } + oObject = CreateItemOnObject(sChoice, oCreature); + } +return oObject; +} diff --git a/gamma_age_v2/re_widget.dlg b/gamma_age_v2/re_widget.dlg new file mode 100644 index 0000000000000000000000000000000000000000..1f740768991c8761be5f152ae59eae32638b9a6a GIT binary patch literal 7604 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 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/re_widget1.ncs b/gamma_age_v2/re_widget1.ncs new file mode 100644 index 0000000000000000000000000000000000000000..a386400b307a6bad46c8b83536834cdf85fa9f88 GIT binary patch literal 2480 zcmaKtOHUI~6vyw(6e$HCBuGdUynz^72nbd}WMye*(WFw+77`O5DeVPrEYqf)#^Bn8 zpTN)Hl7%0^1q&7~Tr|;z3l}boF~o%n6wf{P&U7x*0!cfM-#O=h9`|%TU8Gw}3yW)n z3>})*6oJ1eC9_0bPZ-A8+1YOrxk2FjbdFFmK*&#GiN~iT0yh%|d^|PG0n@^N?;G!s zJ64?VKCpm~IwUe}-4fB>;Qc2O0bj{fla*A%YzbsLA5Q&+!&_VgV{hz(fCqgBULCpK3`bP z(o~jr1D2QL_Y&FlOm-`q*-YgwG`Ey_B49okPbN|YJ9VL9L>aCG46n!UCrbHJDo0T_ z&DmRauGrI!Z1H#uszfvGrWh&c&rXe3T)*s4oNoW1IeTTN!f4*11=i|Pa3mDfqrPgA zVlkYhVx#=hVa-;bNrK4*PqT*Tgz*`!qfPdF%`Rqb%uybmq=~QJ`e}>y$+0~``@bg6 zibdzWIh2O)N`?1flpE+vScH3vb|b-xfhAaD#%gohrVN0h8vS93I!#G(e0s zRB_I&XV5LHNo@ps`t4$URL4L~mAAxU(PZN+F9zg9Gm@&F9|k=4bK1Edv>o9vga+K1 zvCy^&#K%4O%)lB$?d8Ipgthr^%J%_Xi#~)h-8AL-L->P&k5JVJ8XnW&iajC2)93?w zf=S+io?L}0Y-b(r@^X#8VpS;HiCE4_bK1HjTT{d+1V6_D*YfmB4e!C#6>wEyyL)`U z(cX3!r8fM8muhvIX0OfKLk9|#L!C4+K{yVw8Y&d;Zp|MJ_2E%S zqUEhp+@t}1St@~*>hmMO^Bmt{Vx0z1B^vgskK&j9-A{FffK4 z>5|G3GWvB}F2fZI{ekyBebz9zQP}woYZz1kus*$&1z3Jff)3<5=|@s35Qi6Qy1z3Jff)3<5=|@s35Qi6Qy4t!RIuVNV8!Ol(hMM- G3Jd_+_#v(U literal 0 HcmV?d00001 diff --git a/gamma_age_v2/re_widget11.nss b/gamma_age_v2/re_widget11.nss new file mode 100644 index 00000000..2ba7c397 --- /dev/null +++ b/gamma_age_v2/re_widget11.nss @@ -0,0 +1,6 @@ +void main() +{ +int iCounter = GetLocalInt(GetModule(), "re_AreaToolIndex"); +object oObject = GetLocalObject(GetModule(), "re_oAreaTool" + IntToString(iCounter)); +SetLocalInt(oObject, "re_disable", TRUE); +} diff --git a/gamma_age_v2/re_widget12.ncs b/gamma_age_v2/re_widget12.ncs new file mode 100644 index 0000000000000000000000000000000000000000..781e8be1d29daee58077f73e643dcb124f9a4d14 GIT binary patch literal 206 zcmeZs4ps;=)H85mU|=}M#4HD-7&sIdSQ!}JF)%a!|Ns9F0}GHN!N|l6=KcV4V;Pa; zv>4?AAago{$+lY$cSQu1?M^OEyR^GZ^SkhB>yfmKSeFay;yGJ=f%!oVWU0I~+G l49Ejo76*|6S_P4k1u2*UGY72g1yt^hEXZmeu(}Tl3;>nfMiT%4 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/re_widget12.nss b/gamma_age_v2/re_widget12.nss new file mode 100644 index 00000000..1a509b8e --- /dev/null +++ b/gamma_age_v2/re_widget12.nss @@ -0,0 +1,13 @@ +int StartingConditional() +{ + object oPC = GetPCSpeaker(); + object oArea = GetArea(oPC); + int iResult; + object oObject = GetFirstObjectInArea(oArea); + while(GetIsObjectValid(oObject)) + { + if(GetLocalInt(oObject, "re_bRandomEncounter")) iResult = TRUE; + oObject = GetNextObjectInArea(oArea); + } + return iResult; +} diff --git a/gamma_age_v2/re_widget13.ncs b/gamma_age_v2/re_widget13.ncs new file mode 100644 index 0000000000000000000000000000000000000000..de8354bb2a2ec5ecd6b299700910d9e7b66f4d0a GIT binary patch literal 235 zcmeZs4ps;=)H85mU|@JH2P7Cc6c|_;7~U~3Gyebo{|^HTkR!o}#EC`bXfeuz^eh6Z z5-v)OPYO!ROUci5%}dTN%_~VQ0&DvLHp7?+W(HV?I6{iifl-N>O#!F$Ua&M+mm~`d i$U1~xhK~?qA$G(uGJ+fp*p!Ow6ndjJp_^8UO$P|A&Evm4V?VBa9;tQlkMB zV=hXK2Mc}ysbDN-6j25${KNnxjG5RJ7(tqWQql|{L%<4uFtC6{KR`vl$b!t`0jv0- GzyJUjHY}6? literal 0 HcmV?d00001 diff --git a/gamma_age_v2/re_widget14.nss b/gamma_age_v2/re_widget14.nss new file mode 100644 index 00000000..0f670e6c --- /dev/null +++ b/gamma_age_v2/re_widget14.nss @@ -0,0 +1,7 @@ +int StartingConditional() +{ + int iResult; + object oTarget = GetItemActivatedTarget(); + iResult = GetIsPC(oTarget) && GetLocalInt(GetModule(), "re_" + GetPCPlayerName(oTarget)); + return iResult; +} diff --git a/gamma_age_v2/re_widget15.ncs b/gamma_age_v2/re_widget15.ncs new file mode 100644 index 0000000000000000000000000000000000000000..b49a0e2faa320df491d4bdfc8193b70a60f72933 GIT binary patch literal 143 zcmeZs4ps;=)H85mU|{HHVwM9^3>*p!Ow6ndjJp_^8UO$P|A&Evm4V?VBa9;tQlkYF zV=hXK2Mc}ysbDN-6j25${KNnxjG2^}*%TN-+JTbN3?O5`N`El0fJHw*MZd^`OydEo I_@Tf607%g+y#N3J literal 0 HcmV?d00001 diff --git a/gamma_age_v2/re_widget15.nss b/gamma_age_v2/re_widget15.nss new file mode 100644 index 00000000..c519f5c2 --- /dev/null +++ b/gamma_age_v2/re_widget15.nss @@ -0,0 +1,7 @@ +int StartingConditional() +{ + int iResult; + object oTarget = GetItemActivatedTarget(); + iResult = GetIsPC(oTarget) && !GetLocalInt(GetModule(), "re_" + GetPCPlayerName(oTarget)); + return iResult; +} diff --git a/gamma_age_v2/re_widget16.ncs b/gamma_age_v2/re_widget16.ncs new file mode 100644 index 0000000000000000000000000000000000000000..c148d9d46d34e172e679575831eea4f6a1db5de0 GIT binary patch literal 52 zcmeZs4ps;=)H85mU|=wj0}>1z3Jff)49rET@vICC?-*Da7>gN2l!5F|AT}qH0s{cU CnFh1~ literal 0 HcmV?d00001 diff --git a/gamma_age_v2/re_widget16.nss b/gamma_age_v2/re_widget16.nss new file mode 100644 index 00000000..a2d144c7 --- /dev/null +++ b/gamma_age_v2/re_widget16.nss @@ -0,0 +1,4 @@ +void main() +{ +DeleteLocalInt(GetModule(), "re_" + GetPCPlayerName(GetPCSpeaker())); +} diff --git a/gamma_age_v2/re_widget17.ncs b/gamma_age_v2/re_widget17.ncs new file mode 100644 index 0000000000000000000000000000000000000000..44a1750f45867cff96606d54db6829a16da44565 GIT binary patch literal 58 zcmeZs4ps;=)H85mU|_J40}>1z3JfgFK$?+-m4Ue^HJ+7$;T;1j17k6xh%%7<3CLzJ IXI5YU0M=&)@Bjb+ literal 0 HcmV?d00001 diff --git a/gamma_age_v2/re_widget17.nss b/gamma_age_v2/re_widget17.nss new file mode 100644 index 00000000..3e0a8fea --- /dev/null +++ b/gamma_age_v2/re_widget17.nss @@ -0,0 +1,4 @@ +void main() +{ +SetLocalInt(GetModule(), "re_" + GetPCPlayerName(GetPCSpeaker()), TRUE); +} diff --git a/gamma_age_v2/re_widget18.ncs b/gamma_age_v2/re_widget18.ncs new file mode 100644 index 0000000000000000000000000000000000000000..898ac4910721b88862985d90465fe2a6afc4e4f9 GIT binary patch literal 204 zcmeZs4ps;=)H85mU|={S2P7Cc6c|_;7~U~3Gyebo{|^HTkR!o}#EC`bXfeuz^fUui z2^XctCj}+urR3+j<|XHs=9Q!tfwlbrn_JUl004JjKq>$L literal 0 HcmV?d00001 diff --git a/gamma_age_v2/re_widget18.nss b/gamma_age_v2/re_widget18.nss new file mode 100644 index 00000000..c3e2dac5 --- /dev/null +++ b/gamma_age_v2/re_widget18.nss @@ -0,0 +1,11 @@ +void main() +{ +object oPC = GetPCSpeaker(); +object oArea = GetArea(oPC); +object oObject = GetFirstObjectInArea(oArea); +while(GetIsObjectValid(oObject)) + { + if(GetLocalInt(oObject, "re_bRandomEncounter") && !IsInConversation(oObject)) DestroyObject(oObject); + oObject = GetNextObjectInArea(oArea); + } +} diff --git a/gamma_age_v2/re_widget19.ncs b/gamma_age_v2/re_widget19.ncs new file mode 100644 index 0000000000000000000000000000000000000000..723a4d544dc89259ccb75b6e487c5cfbe5eb115a GIT binary patch literal 124 zcmeZs4ps;=)H85mU|^_WVwM9^3>*p!Ow6ndjJp_^8UO$P|A&Evm4V?VBa9;tQX>xL q{QyZZE@4z+W>a7Usr|yhBFzBO1Cs`eet?R8kp*ex0jv0-zyJVWpDH2% literal 0 HcmV?d00001 diff --git a/gamma_age_v2/re_widget19.nss b/gamma_age_v2/re_widget19.nss new file mode 100644 index 00000000..fb38b63b --- /dev/null +++ b/gamma_age_v2/re_widget19.nss @@ -0,0 +1,7 @@ +int StartingConditional() +{ + int iResult; + object oTarget = GetItemActivatedTarget(); + iResult = GetIsPC(oTarget) && !GetIsDM(oTarget); + return iResult; +} diff --git a/gamma_age_v2/re_widget2.ncs b/gamma_age_v2/re_widget2.ncs new file mode 100644 index 0000000000000000000000000000000000000000..347a488774c206bc16c4053db5b538bac4063c23 GIT binary patch literal 668 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 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/re_widget20.nss b/gamma_age_v2/re_widget20.nss new file mode 100644 index 00000000..1e13698d --- /dev/null +++ b/gamma_age_v2/re_widget20.nss @@ -0,0 +1,6 @@ +#include "re_rndenc" +void main() +{ +object oPC = GetItemActivatedTarget(); +RandomEncounter(100.0, oPC, "random", 0, 0, 0, 5, 360); +} diff --git a/gamma_age_v2/re_widget21.ncs b/gamma_age_v2/re_widget21.ncs new file mode 100644 index 0000000000000000000000000000000000000000..d93739c59534384496cfdc21c72e271e11830236 GIT binary patch literal 99 zcmeZs4ps;=)H85mU|>jQVwM9^3>*p!Ow25-3|vL2@hO?biAg!BtPBjF7=VN^6C>mQ i|Nnn5ut+li=|9XM-X8`Qu;>@4=nq+tDLfDr3Jd`4H6Wn? literal 0 HcmV?d00001 diff --git a/gamma_age_v2/re_widget21.nss b/gamma_age_v2/re_widget21.nss new file mode 100644 index 00000000..e6ef8626 --- /dev/null +++ b/gamma_age_v2/re_widget21.nss @@ -0,0 +1,6 @@ +int StartingConditional() +{ + int iResult; + iResult = GetLocalInt(GetModule(), "re_disable"); + return iResult; +} diff --git a/gamma_age_v2/re_widget22.ncs b/gamma_age_v2/re_widget22.ncs new file mode 100644 index 0000000000000000000000000000000000000000..633dd05b995eca6030ad67f5c5e2c8613595360a GIT binary patch literal 101 zcmeZs4ps;=)H85mU|>jPVwM9^3>*p!Ow25-3|vL2@hO?biAg!BtPBjF7=VN^lM*u{ k1z3Jff)3|vL2@hO?biAg!BtPBjF7+4t?Ihhm~0KUHm A<^TWy literal 0 HcmV?d00001 diff --git a/gamma_age_v2/re_widget23.nss b/gamma_age_v2/re_widget23.nss new file mode 100644 index 00000000..5d4bc8dc --- /dev/null +++ b/gamma_age_v2/re_widget23.nss @@ -0,0 +1,4 @@ +void main() +{ +DeleteLocalInt(GetModule(), "re_disable"); +} diff --git a/gamma_age_v2/re_widget24.ncs b/gamma_age_v2/re_widget24.ncs new file mode 100644 index 0000000000000000000000000000000000000000..712550b08bb9f94581b0c02a0b845b91a83fa6d6 GIT binary patch literal 53 zcmeZs4ps;=)H85mU|=wn0}>1z3JfgFK$?+-m4T}$H9jS?I58{$XGNs^WkuNfA*- zH9;1nQd^e+NiBP79>_EdrEn$8KsP$DGBC<8u>hG2j9?SLK;85MY$6ZDeF_W!_ohe1 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/re_widget25.nss b/gamma_age_v2/re_widget25.nss new file mode 100644 index 00000000..7eb2c67f --- /dev/null +++ b/gamma_age_v2/re_widget25.nss @@ -0,0 +1,9 @@ +int StartingConditional() +{ + string sToken; + sToken = "\nBESIE is currently "; + if(GetLocalInt(GetModule(), "re_disable")) sToken = sToken + "disabled"; + else sToken = sToken + "enabled"; + SetCustomToken(2112, sToken); + return TRUE; +} diff --git a/gamma_age_v2/re_widget3.ncs b/gamma_age_v2/re_widget3.ncs new file mode 100644 index 0000000000000000000000000000000000000000..67a2a84783508e23678d821bda44a3816e69ce08 GIT binary patch literal 324 zcmeZs4ps;=)H85mU|@7%VwPh70uBWRRtAQ549txG|NsBPzyjn*Fd}hc8JU>D+#g^$ zEk=2euBkwE97U<|POib8u3+geU}<9}uyiQQ02XGTVnz`KMv&=16QmhHw!q8-8o~oK zB;T3WOS%DPS93Ky7#<3-T}z*tQP}3;_J7Wf%Ye literal 0 HcmV?d00001 diff --git a/gamma_age_v2/re_widget3.nss b/gamma_age_v2/re_widget3.nss new file mode 100644 index 00000000..41b38288 --- /dev/null +++ b/gamma_age_v2/re_widget3.nss @@ -0,0 +1,19 @@ +int StartingConditional() +{ +object oPC = GetPCSpeaker(); +object oArea = GetArea(oPC); +object oObject = GetFirstObjectInArea(oArea); +int iCounter; +while(GetIsObjectValid(oObject)) + { + if(GetLocalInt(oObject, "re_BESIE")) + { + iCounter = iCounter + 1; + SetLocalObject(GetModule(), "re_oAreaTool" + IntToString(iCounter), oObject); + } + oObject = GetNextObjectInArea(oArea); + } +SetLocalInt(GetModule(), "re_iAreaTool", iCounter); +SetLocalInt(GetModule(), "re_AreaToolIndex", 1); +return iCounter; +} diff --git a/gamma_age_v2/re_widget4.ncs b/gamma_age_v2/re_widget4.ncs new file mode 100644 index 0000000000000000000000000000000000000000..c1b5ae19b1b203078b1193efc165339300e76f99 GIT binary patch literal 149 zcmeZs4ps;=)H85mU|^Wa#4HD-7&sIdn3!2u83c+_;~k4q6GQUzb3F4>QY%;)7(Ouo z31cP}W}rGo5d~((|NsC0VPFBO<^ihCgega;6i{FUsrkadBFz9&3)b<2fdwr30V?`M N7Gy6ESj7(o1^|DLEolG% literal 0 HcmV?d00001 diff --git a/gamma_age_v2/re_widget4.nss b/gamma_age_v2/re_widget4.nss new file mode 100644 index 00000000..c5e86a19 --- /dev/null +++ b/gamma_age_v2/re_widget4.nss @@ -0,0 +1,7 @@ +int StartingConditional() +{ + int iResult; + int iCounter = GetLocalInt(GetModule(), "re_AreaToolIndex") + 1; + iResult = iCounter <= GetLocalInt(GetModule(), "re_iAreaTool"); + return iResult; +} diff --git a/gamma_age_v2/re_widget5.ncs b/gamma_age_v2/re_widget5.ncs new file mode 100644 index 0000000000000000000000000000000000000000..58fdb1300bce4a4da10fc70da359b04a33f496e4 GIT binary patch literal 129 zcmeZs4ps;=)H85mU|?uuVwM9^3>*p!Ow25-3<5=|@s35Qi6Qy 0; + return iResult; +} + diff --git a/gamma_age_v2/re_widget6.ncs b/gamma_age_v2/re_widget6.ncs new file mode 100644 index 0000000000000000000000000000000000000000..3cf35b01acae19793a58a6887662cd307afa8b22 GIT binary patch literal 105 zcmeZs4ps;=)H85mU|`6U0}>1z3Jff)3<5=|@s35Qi6Qy1z3Jff)3<5=|@s35Qi6QyQY%;)7(Ouo z31cRpEDumNA12Mr`2YX^9}GZYh8RW>Wtc)UkU}n?!j#P7#H5^5BxS}-j37N97+9nk cfb<`*)E5R8u;?48=m%Mldw9Sqz9=vN0M^1a^8f$< literal 0 HcmV?d00001 diff --git a/gamma_age_v2/re_widget8.nss b/gamma_age_v2/re_widget8.nss new file mode 100644 index 00000000..cd08b648 --- /dev/null +++ b/gamma_age_v2/re_widget8.nss @@ -0,0 +1,8 @@ +int StartingConditional() +{ + int iResult; + int iCounter = GetLocalInt(GetModule(), "re_AreaToolIndex"); + object oObject = GetLocalObject(GetModule(), "re_oAreaTool" + IntToString(iCounter)); + iResult = GetLocalInt(oObject, "re_disable"); + return iResult; +} diff --git a/gamma_age_v2/re_widget9.ncs b/gamma_age_v2/re_widget9.ncs new file mode 100644 index 0000000000000000000000000000000000000000..1005b0cf53a145e0bed02a347139cb324f482829 GIT binary patch literal 175 zcmeZs4ps;=)H85mU|?9!#4HD-7&sIdn3!2u83c+_;~k4q6GQUzb3F4>QY%;)7(Ouo z31cRpEDumNA12Mr`2YX^9}GZYh8RW>Wtc)UkU}n?!j#P7#H5^5BxS}-O3aKPT^|@& eq#1zpAF$*X1{SdB8>r|9S&)l(z$(5dFaQ7=<~AAt literal 0 HcmV?d00001 diff --git a/gamma_age_v2/re_widget9.nss b/gamma_age_v2/re_widget9.nss new file mode 100644 index 00000000..16746d67 --- /dev/null +++ b/gamma_age_v2/re_widget9.nss @@ -0,0 +1,8 @@ +int StartingConditional() +{ + int iResult; + int iCounter = GetLocalInt(GetModule(), "re_AreaToolIndex"); + object oObject = GetLocalObject(GetModule(), "re_oAreaTool" + IntToString(iCounter)); + iResult = !GetLocalInt(oObject, "re_disable"); + return iResult; +} diff --git a/gamma_age_v2/redcloak.uti b/gamma_age_v2/redcloak.uti new file mode 100644 index 0000000000000000000000000000000000000000..fd96355c7f737cac8b035aa483d69f55e7f56bf5 GIT binary patch literal 934 zcmY*X%TB{U3|!vt_xr|)BNA{y+#tPFDky4!14xKf*U+e&Znar1d=B5nf51$d4Z)J- zvDafe(LCI@j~_2i&o7lyQ}7o25N?n#eorg)f_O8d)GOi_;w<714592Yc}g5OI%wmL{ximtrjU+O~ILGsAyxW2a8 zryN2$usW1e8&pnkKf!D7`~}{4=`ZlgbM$??tA;Pfb2xC}jq;uIPCd1Bb@kU@Raed7N^aGW-P?BE ztCTtn?U|$0_elR-sMGyU#HYK(r{Up{slv|%JB!r6xFHa1@{Q<72GGd zUvNS2e!(1z>wiG-LBWH9hXfY|9}-*=TozmrOrN;>9uYh&_^9BA1wSJAnBYeRKPLEb z!6Sl?3)X_Gf@^~7f{ox&!DE8Q1$%-|2%Zq^3vLJw1c!o~f=>#L1jm9C!7ag)f~N$Z z5j+5&WXymju5o_^jYp1ixyT@psNLrl;ya z!Bt4fD+I3-yhHFl!To|OmS>}%<6x$$Q>kx|Agk1ArM`8H+V3ncL@JGK=R+M3`?%UN z$GF~>aja+N;RiN1OVZR9rPr~KpCR_M0J;yl24a6b5bw)8=P=EUgZJb$>6no&f@o~J z7~(u9FM&9RITkEysgbX>%zm)UsR7#&mb$hrZt1V}8C&YI{ZG*TDlD9(>mUkfK{ABq~=$z$UNY7i| zjr0f0dyxKQ`7WftSiT$Sua@sY`nzR*&;GE?IGT%h%6sjFmV+4!^Z|{$590hGKLBmD z{2-WfiRBMLMa!MwqhMMWME^6!x}o*9JO_4mG3Ir&i?zvGTzZ>-qtDA7!hgTWwK@;2##|%w`!J6H>xJwTRDEF1&Hri}uD$&bze!xf3lN`|Yu$cm6CB}quiyjV zifJ@`otTn|OJ)?`NnJCzq;0)k6eoka;R*-zjI8QvHjR#SP%|Ty>84SACa4>3>Z}#V zO%Num$*dSgNu<4`P|xyt6W1cInRp?0ju?*~%PQ<|E(|736l>R@5EtbVsd{ydRRzWY zE$_uTYUrwOZ&+?sBl$>q<0af5Ive(av3O+Aa4$)#XwMf}RSsK0y=;O)4LpAr>?F%~B?uN!z73|X7^Vz{M>k}Tg7)JqJM3-#I$$6BI)J(aze ztUYF1l6L3%YsW)Ye>gT#-i&&I$?`)%w;!ehDo?#BM_ zqCPFk`8tkWC9dx|+47nrg~T+n!lL#~l9={<%7u*v-fwy@{=lmf?F@kTm-*C_q9D!p z`g+VpK$_2C5i!w#nKXVn9??DmBqH8nT3?Aj~Od9Ji!uMuWhind>GWzaB&wP zpM{Gnz!F&t8&#bwvOR=B4a;1I&BaXwi>r##NO40!SBw;wZ6QoBWY=#PRBe>tftChS zBVIC6i_BCrZtmE*;~xb}oGY7Ah-XY+BfZJbBtIi_pt;aIh@TUBkjF4?EBQI;fOuS4 z3~_5ruk$FwZ?LD{k zolqCl4ZQ}v4!r@r3B3iq4ZQ=s3%v)u4}AcA2z>;741EHfhdzZqgFc78fWCyjg1(0O zp;^#u=>P8L9DI<6dLVAu`XJ{YZewVSJ#J$TKm*W0Xb>8LiV%Hy2%;}bP#LN~e*@6W B8zuk% literal 0 HcmV?d00001 diff --git a/gamma_age_v2/relanopspropert.uti b/gamma_age_v2/relanopspropert.uti new file mode 100644 index 0000000000000000000000000000000000000000..bd8fc16d5517a0aed3b0f9c3965698a89ca4551c GIT binary patch literal 1121 zcmZ8hO>YxH3^gAG3Y4$5l#fy(aYuq4;9Al{S1Kh+(w?|Xvu?X$HoMxL9LkA*#INDT ze<|@9{giCbOCPuo@Xa@XawjU`J@c&o=B>!R z?l4+~b3{L9py zjAp0dvbOBtL%m~n>g|O7iSsk_LG8-K%?#0BM48$iLaMD z%vPh`O{==CW1;VGvx7mfndKY}Q%G;o3`gA7ZQ16ySok6uhnYx15Oqt^LMd&bU-VG4zaUau4qV&hK%^9;^WAF3FQ8yW1wJzT&r8a>+a0YzesQvB}rG6s*1)swIg?|eF z4+f`R@dJAgYy;031Z%>BMx6t@0Qq;q7&NLC#trxzfOFjA0oqpW6z9o(6k^t=k?$G6 z8Z_>waXtHp>sdRld4X}XJq*~#egO02JOJ*(_$7R_cvh}Cj7fObiRV6klt00kcSbt} z*cW?z4g3H`lI2!=8Av&hDegd*()E&IYH2+;(bjyE^n=a>nU0i`!sOn#`Es6dHaRBT@t{-VzG3ztjbjg&pZPC~p0$5X@V-Y@c49en6_r0;FaFdl1L#Te8&3*4+w z$Ey`M|9m3Xc`mxB=dE}z-A>&O__GYR7b0k>kkWrL_yY-YH*Z&}p(5~?yqV9EVU_0= zXJC%6ASw&tQqjNvtoFS@F0N0sweBk!7OqOXOIWQ%{XUc>1&x#x8O7NEngAaI9|6VB iO%xJEM{!fs6f=cPp;2ILkK(0hDb^!^;-o0aPy7e;?}mQ> literal 0 HcmV?d00001 diff --git a/gamma_age_v2/riotshield.uti b/gamma_age_v2/riotshield.uti new file mode 100644 index 0000000000000000000000000000000000000000..633b8dc65aae0f7c10e9beac84778680be84a23c GIT binary patch literal 733 zcmY*X%TB{E5HxQnj{;XX^vnSXDj`5zAUzPNpr~oNTg|q$Na`v!7yg3J<7;3hajJHu z$*lKjXLmG=J0IQa+k2(d2G9e}flD07Pn$}Oz(3$u@Gp29{09M5F^5!w?0{M40XPB> zuIQ(}1zZK4HST~Gz?>I=vRhNtV-I>3&ijE`?*L#A3iBzfw|WouYhsQW5aa~h1=<0@ ztWKdk0<3oiB*0LLMXtRJ#0_MEJ8CDfmjbRz`gW{y^DWuCE(DgIxN&I~-q?BN=Q++~ z?#;vq9x~L^Ix&2snJ%Z|mbS<`zdS%mz0IXARhd(-$Db)0hM*+3Yw^!nwpL=bH&ddo z((xXRyxC0hM3?@iwj`xpNa>BZzTr(0os0Jp_d-Hsivq7{(p9T8*1MUJJiCCgjoCH7 zoTC`P+es@or`K%Es?NX7usVv#)m5l)&|DY}mJ7ng;6gB+3&7N7u{dB3mP6$rIY7!k DCbC}Q literal 0 HcmV?d00001 diff --git a/gamma_age_v2/robohunter.utc b/gamma_age_v2/robohunter.utc new file mode 100644 index 0000000000000000000000000000000000000000..54b295a5531fefef37baddeeb3b9204e5e0737af GIT binary patch literal 7654 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 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/rodcut.utc b/gamma_age_v2/rodcut.utc new file mode 100644 index 0000000000000000000000000000000000000000..26aadbe83749113fc85fcb77f2d924d21b5cd0fb GIT binary patch literal 5199 zcmeI0S(g(<6vrE6ae)B=6<3BG1pxtf)X5~1nLwBcNnjAsp^{W)n(1_h?#c|~h8v3e ziu-~KU%{{7gS`6eIer4q@y!?g|GTS`%bPFagWPleQ@>l)T~&R%x^im{RkQtvcW>YI zfa5r2X!!!ixq$NGb&gX&d2G4kte@vNr>}P$gYu6Rs6+V|49!lKe_$+89a~QDkl?)F zVZkGUIcD0=KEeA17X=>>JSuoha7pk%!F=9ytcu{O;6s8B3mzAIMDXK+j|zT5@G-$p z3VurPgy7?XmEfA-y5NRjEx0LoQt*^uSMUkJ(}F$0Ey2FvKyX{|Nx`AuNU#yy5j-P! zR`4mobAq21{EXmd1wSYFdBLXzzaaQU!7mAZS@0`@&j@~1@N0t43VvPi8eBAPU^yz_F;vH}~TxX>%S*#L#gWwwl-z0do;G4nwAdYnlbk=r!E12`6-3F!exE;*7((Zsb zFWMT2&q?ct7(2$0F=otZ>yjc~2kXI{AK$|U!5hK-5bHNVH1g({65e8&#huVD>)&OW z?`LaVcYc6#*cNm0=WY~yH`I2BdnI`Xq%H46$#0nT_dsVXbDVRQccZ*uc@N4TEpuJ` zWcfanzgWH>hRuEjoEHzvKVn znxFr{d@jc|3-SEJ5PvVYw~s)qtLj$UQ%09{RMt)8^Qx{<-Lw2O(*VfLk_8Xc>nzhoD_5;I~#7aSELgku5Bk^-Os)ugdxB)Xk%tuWo4fby~ z@Mm-wsq}(ERFYemlUH>%75MIHIX6;aOVvC(V5L(F^Ynbn)Htzb9(Zr}`Zb+*t z*AuQ&2|9kGqD|gSdMtSXf2O)thzhM1o=JI0Rlzqp3_EROr%()n6ypm<T1{#vr|W92>UQH_F(SC=A*Y$i_6+grIUvmE5`Wxf*4(q~ zl)^{U>rG}cs zAMzVzE|gxo@`A~Z=wHny?@$OZ)4thot>bq{EzUy1q{QF@Mkt;t5rz5x^pb z$6RQ6+$r4d_ng+@$?BP!>tWT$Ras9(QQC<6hfa3f_C&$xR#I6~o;F5zzo%@_YT^CH zWAP87I^A^uapXir?B_i-Y2SG4XR&GMu&8IW7mqKlPv*mxq;gRhH0mA0G?o7@NVjmN zw&l2miMnjzZA@-hNA6uoFSg~Uc1<*Nb7Cr81%0-noh+8LJ>n{;W3J0=yRyq5^#i{V zFNE|4_{l;@E3o<1gH}zMrM8E_uVVvSV!f!1Wso+7@ft{{g08p*Qn!NzfGMZ_27b-H zfBQ&`3xCeIl`nu6LVWVY5Tn5(64OtnxZLu21nPtMGspw_3ZG<*Ko1rZbj|e;(Y=yQ#JOXToc0f$^nc_3G z-wo}7n8Gu4XUfi0ohdp~bEf1>#hHRL^=8UF0A-*-=uPM?=xyj7=w0YN=zZt|=tJlu z=p6Jh^a=DS^cnOy^ab=K^cD0q^bK?#`WE^Q`X2fL8iD3P^P&HH%(I9=4jO{;5Yr0A bCpE6W0<;g>4;7&U&?qzpl_19QAVm8c^7aIm literal 0 HcmV?d00001 diff --git a/gamma_age_v2/rodqas.utc b/gamma_age_v2/rodqas.utc new file mode 100644 index 0000000000000000000000000000000000000000..e558601f0ba6cd2bfa4c9c0a3dd5cd562cee6d89 GIT binary patch literal 11023 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 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/ruinedminds001.gic b/gamma_age_v2/ruinedminds001.gic new file mode 100644 index 0000000000000000000000000000000000000000..47674a94cdb2a399f1d0b2e71fb97a5af70528fc GIT binary patch literal 1403 zcma)6%We}f6g5yN1OkPY_scDh6{--hK!^op5<#R2B6ZZVU^AJR#L~o$JT52_OBU?- z0{)AiL2%Aw99a`paHS(3A79_OzV@9ry+rOm-G1_12yqEmJ0`?KjK7WxaTeqE6GE&) z`>`U#H_X>h3Ngm`2ZlkM0Zs#O7jUaMwk$ZdRs0mj`vCpOA4U9G#9v0d6Y<@MrxE`c z@nOV^i2I0ttvT~%KFpc?LCr5<3`WlN6`%z$cUs_U5x)aYf1Z7#=G=F!<|v!E1<-hY z#tm^;3tCfuJeQYr){EBk=N;0TI%`U6>aQwwS??U7zdb_d-O!rx`*V3o=l#)|{vV*R zhN}SglJjlRpPcs;d{{f)eW+o~e?w24%KV{Ia#xog^NzJHa7;yFClh73GPkbD?V<51 zIMv(2ve?7wFcSMkHtU(x+M-m9vgfT+(R%9iXr$aiIml*HtBnr=_U9@a6d}QLh>=+5 z^w2uy%5%NOY^0WFi=_UO{Dj}T_i6WqOvg&*+U5A{7hM$6ST6@ke%7UCDky+1r1nym zG9PDVq=wR4ImKC_mU1Uad;2?SS7t^}GOw+XO8YU2HkipWcY5lz8A((cMX4xaeR6gp z;Ur6+IfORV#Lp|YE!(Yjiw~i1ozK{{Rco+asPZXDU=!E^?g4xfd1fO)cClkw{F16Nxi3QA&bj;PV+66ny}+r2@{7CV^IwYPpBu~nG?w4DYrgz2 z8c{n6!()1c(Q1E9to*LA{8wZ7wXwQ&F}-h0FOKOYMyvg5Y!zNtHdZDV(`_-mI;PuW zdQD7s#PlIXtFPN)ef=bsKZ%p!7=9JYKQ)&BNGw0mBVT@fEI%E~@6LR2$`3tax~I{a z`==?7d-#5EHI5+N->(tWWw?GD7O^x{6AeZ)y@{mJOhu$sPC>D*S$-x>SBYYy<#VCd zI8LhHA~AqizNsMH2h^_e`htSuegWl}4fkEUSw=!B~27&rj7!0zH`WRv~ zQDSQyOxPwA#M{R7(3n>LYFD-y9?RE!s(po#LF6B|;~3_TLTlU#ql3slCOL*>#+ZEB zVJv8EDr_G_{`kkC7lP(QHmEjwg3&~YiJ*B<(42%en(XHUhaHTTt#*XnL3#@8Vf0SK zdm63%XP(hJ6Ypd6G~)S27Z6t(T}ZsZ=ptf`S?z01s*Kk4Y5dBUKQ01Y`>s#}3flV= zWOI!%3>u??>S~OOjh;cg1mt&n0X>#V@9pc>66u-n@I#e*OV5HQ2RtxS{mRdlnpnQK z(rEdf2kJ|6cmybfc9rhzdnYK9@J;o-6NBOZi|=W^zHZ+;nKorx`Q9l;%lA$-TE2I_ z(ek|ujF#_RXtaFqBBSMd7aJ|#yToYu-lay%_bxM9zIQosJ?p5heD5=(<$IqSE#K4T zt}^nyEsU1$ZE3W8uM0Z#Jw3lEd|BV?Y1)zR^+IpT_iAn$v{~PiPnEzBkS>LxMwbzf zgwQ{G(|+imBTc`mGYPFw4n`&_{G8x0JC;8ursu}W=-#5B@$ciSb^aQe@9U($Z&&(y zt)IWZ*FpJ(M(h4w71Qz;1+}@zSHYo%NPC#d*9KYsv5uqi750TAeHGkWBz3L2x2Rps zsqPhePE|Y0KtX-&2PGqq_HDku(*5r9$G;q%nLl?{XwSLS4ehDtRJEx-QpSki7JJH$ zp*=I3vFGFsb0T}bd~%DgWzQ*zb$5pLTpP3JX)$}A_bs#MikLn1joT&u3%ye0?+aG}#HQ_b`0XdRO_cW4&K$1=px`dFewwOK!y{S2R?CJa*4ZHiCXwNAwx;C1l)2SQI(FLYW&Cyk8h0b#n zwy+4Jo8$3^xmF3PX>dMbwYT#XLxd9)fN zltbK}q3--_>=)+H*`6xD>HYKHd&bz@vvJt3o{j&LXN>2mAKLR2V+TEBoFCKIp!xe3 zJNK&3`|XBBqar&$SG#_u*7^bP7Dyim?;2fC{JzmEh(Cbv9dI2Th4b>5(fSST1#~z^ z>opj{z##IETN$k~gWy9`Mz+yhD5-ada2~fthhdvg5N{jPLt}avTJ7py^*`~ygOAMk zx2HczF%F*Q0(46n53;ND1fz+*(*F)VqjA}73Vd#~enZngA(XG*(6%soXY`gvPeXSx zTEC%nHM$Vp&FCU@ccY8ZJ&e|GXg!VAZ)m;H3RV#L$A*|rp~JarjOE)#Yn&^gw`sEp z-3P5TsNZrgzd!$5?wI1>y<;Z%m!3InlfUJTpl;}gQ;e1$)|&QZ`wP$tU*v~ZnKGUI zP=2H!KMb$ytN7v3rt*kbJ0sPw3EL5e?Te67c^aJ3n~{7?b+ z@cmGIeBFL{ow2R_@Oq==hc_54KfKXs`Qc4Q%MWihT7Gzo(elGvjg}wkf4cG$`QhzG z%Mb4`T7GyZTEPk;|Jd0N!&9C8P&N$xaGhyWes~u;^uy`5F880G^@3Q}|1^Kklpnqr z`+pY6wI!ZyRePCM+siq2mfs^=8XVir)w+%4RtE+0>4i>Hb1s(V{NhYHem+OK!d+d` z*63uY>W2kwStnI$<#K5|pAMSNr-P>R>2f>mcTP?j>4{;W3!M;+H#p1yCt*Qo^R`V%hH*w zO(Uzy%lz_X8F#hqWv#G*d2Y`3ytdYy)!<*zY%3L>^2=AJGa64Q1 zsp^+e+MM#!Rjsxg>poGP@p7K!^VtD{TzMOmBY z;ZITaT+3^8?JS-agxOqQs1^H@63bZPq|>ovqRRDWC|VL#Zn@QBHAN;Qjl(oYRY?05 z2s5hOxr{g0Kp{V?%C~lSmj4U53+%LQm*jGmKQUFVW+Z;Tw$)Cj%dBj!L@iXgzQsJJ zsmazHSGoJTY34MnK{{)D<@QR)^~YH0xXgE5v_8VL=0rxR%vg=JDbKdudF5(jj_ul> zlZvK9*YD(;r@z^jldj8zqtr81JcQ4zVV?fy5D%qT!*TO#sKQNU+T`PAk(p%|RjK7{ zV=S`-_g@`(3+pH2<{Y;z(`IJ4GLvbIw_lyfI$AK6nbjK0ZOpWUxy-+xj=D=!r0vzw z;v;*3wT21JMGm*X(FEtyL4A%*wr`49+Bb#2epiRR^E;icmGojS=g)GrlS?%(#wMoI zYR}1dPEK2cALeG-yvTXUsdHMiZAO7Dur0RzB!YCDpYzvt#p97kFlrv&8CX%{Xo@%&1OVDO+2GneVw)b{;#POEdm8mu4C} zO7q)ALd)LKLy`%RW12MH9^c;ZPny#VwRsI%0RDQ2R&Vf~QCY_G9Bu5ndA&9yXh}N! zK&`*qUf;<1`drSdpSGLns^6NzAh&U&6(5|{b497=G&b2^zG2;$75;Y`?oZE4n0c={ zlS$XMSn0G(aGm~HOX%OOQ>~oJ>eN6hUGG};QD%Xj2NqaOPO7Zga&uW#oo=f3VSjW| zDL-HJTAJ!p&2G-mEztW+g`4xVpcdO+M{UaTI#j!-sXY*1@XvA^?8tJ~G@;e z28Uf+X?Alvn_HN1vbH~jg0K<4Gb_E)KksIofmT-ISm|YhaTIpWDC(S1tfyc93g@IV z?QAKf#zHeT>Z2(**Ny+pIBt#qJmQb=lE%QkeX)<@dcg_x-R#w`Da1}> zr3*S|_`{8t@P`}EDDGTkx;#?8n77WArtjYJZH$7^qFRkXM!sj0k?+}Lmhw*(I44 z+pTKLWt~P_gKZD}CL5e@*ZB3kSq3bbYI#(Ewr`*BLQ|E!a(SmWfTP1n28 z1YX{Pwu9eeOo60IB=xXpr7J0RFPmgoYzFC)WUGHJsr8XfW-}{u>5gQBtp%Cv$h1vO zF3Yqf+cRz>cmDQf9%YiWm$t3O?9@I@!60n9ps7xwZ)?`6r$l{tT7ItG=nA+JegXY> z4ebvDU?6B{ME;vySK@Ba9eRLl)(f;+Wdd1PZLRPd+zhwCt#BLM4tKzvunz8mU&GyS5Bvu1gZtqD z_$@pL55dFm2>cFy50AoQ@HjjHPr@JIDR>&5foI`4cpm-;FTkJRMR*xrfmh)*cpct= zKf_;OJ-i8T!Q1c-{1x7Xzro+(J$N7f0sn*z@Bw@XAHm1)348{hgBG{GVAGdtU7#y; zgYM7+^d*|MUVSCj2l_%k=nn&6AZ!JLU@#1UtzjG37KVbpD%%c5!DvXr7#IuN!#EfZ z6JR3f%d^R_1MCP>U?-RgJHs?6fI=vOVweuQz;3WR>;Zei4A=|yhM6!6N}v?Vpd2b- zHp~Hiy)_SX8<-E3umBc96;#6_sDY)h4EBTlVL2QC2Ld0&Csu$34UmFHuwf-MK{GgT z5UheUw15lxVyYDm1`iH}!{Bf@0*-{Wa1i^Z0=L3#a68-qcfvZj3w{lE!#!{>{08oW`{4ojEj$Ph z!Nc%7_&q!dkHO>c1Uw0UfT!STcm|$@=iqtxBfJ2Af*0W>co|-SSK&2y9o~RH!(ZS{ zcnjW!ci^w^F8mGt4)4MH@DKPWY=95oL-+_jhEL#A_zXS=-GsM*Eujl^g>KLbdP5)R z3tPb;7z{&TYuE<1g`uFYnufy&7zx|KC>RY%7z1Nrdl(1fVFFBqNiZ4ob<>V81$Kg| zuro}90w{zcD2C~<3+xKJ!S1jJ>&{s(< z;6esk;b8C}3pr?m)zA)WpaTwpLqT6MDRcoz#a$r`eG%QD2lRqIFaWlKZ6OI`VH`|= zNg!A0ZsMLM?oF(=)m}g74=Ohh)cznC3`1aR*alR0C=7$)Fak!xb}$M?gW4El;_Xd5 X-oz7$)#qf`0d|CV(DhD%o#4L!ruEtS literal 0 HcmV?d00001 diff --git a/gamma_age_v2/sarbis.utc b/gamma_age_v2/sarbis.utc new file mode 100644 index 0000000000000000000000000000000000000000..6c3a60788534b7266cb803c962275cc6d1330c23 GIT binary patch literal 4789 zcmeH~*>W326ownJusKf1!VcLNNC?3RVGCeci><_Qgyh780HP(e?1@J+%1q0S*%FpO z*tvj5;1zfQE_eaBr+5P10RDfbTRASOQe05QO-|K6{hjWfo}SY^t)sKE#U1C49v*v6 zDRmn9b&XQrq5S@CrKV7B-KbRgHl@yQ0;BBRi+YrQ!O*OVyuetZIhLBV!)RjF?s-$P#*+wXuzAl~PB4S1)kTZ{5%Ho(^9MOLnN?C-k(;5c_e&pk;&bVrf@ppoyw^XQ^&5DBvF|7}?HEUm;a#hWZNFWdj;_A+fgIV40doB19vffcCihm%xV{zYIR&_!aOm$K&7=U|Ip<*5-bjfVR8(BG}u_nDe6D ztWVzK-}m8Oru~;=<|E!3^Hv=G|2@F{U4nMvTjTjthPFX#pbErqk>AxMv>Saq^ZT7O zy?&^zshhNJx=Ph`+o0RfDnXLk8Qt@h(|VPw3jMy(iH_Q)IlIy~YSKgnB&l9br1?yHR3_kX&74x@)2uc%%gf})wJ5{ z;hl7tS5+fxl4Q`gZVJ@n*w6W2`AD;aGUGJhiOtW1b^ZdjdI%&Df^i+bK5K5e}+ z8w}&$up+n^p=6km-7v)Kh6BQUR{3*5y2>vu=vDrl4j1d#5596n+d-nkf)DysU~6#@ zSwBi~kR&Fu!|K!e@{l=3V!Ew38u;#NIS4~p(M9Z}KN-iJ@>1ZUiF`#bcLyP68QY+Z z@jzi{qIrW!B221SFLW*r(&0-Yx^0tfr@BTj)yQ_&6!xfXA?VIO6U}fuyk*|r=$kMs zaFENNF@ zxW9a95cHc>YkGNQO^3!>GyI;4aj%E<&7Q>zqPjSA0DQjmv++em{yei}+=^z;>zfWD zko8)R&$Sh#Oda_*7bj9)jcX%oVNxht*vy2Bbz~;Zc~5$oZMrn=#!<_yH(qE{wA>7Avz?gbe%e1WcKja|d}~IIKLkAV*Fx(c#)iol z0^3=7Z27h>7uGh>0*0U?#pyc#lHIASSj8O1x-VL13#PW A-v9sr literal 0 HcmV?d00001 diff --git a/gamma_age_v2/sarbis001.utc b/gamma_age_v2/sarbis001.utc new file mode 100644 index 0000000000000000000000000000000000000000..f9a09b471b450067db7afcc420d1ec9efa518773 GIT binary patch literal 4836 zcmeH~*>)5~7{^N%1r3Bv!974&got4gTu_pzb z>m85ag)iWZ58xAc>5Wg|1L*%>T{V6=p2P9NbG+d@=il|KrK_sHTIQRJ)5U>H$B!I) zPAN47{kB%A?~(p^zfu!Ohx(Pee2-E$wFupbO(OjhhH6#h1I84^)=Gj$1&;|H z7tC?|yJf*=1)mcv@QmQgf?pH-y5K8<-w^z! z;I{Y3>iQrEKeme(R3bY<(1{>(Nz1@j9FWQ~jEItD`Ct~s%Pc2+-~EWbeI>Fqs$~px0AUkOvbTC+h8iLn511YI^!<^?#sBfG9tdY zmgywJoGQAxpyv$y)6^@|LC^oSOgI?VncvR?6dz1(B=k(k*=9CdwjwG@P*ESQDwWPUu3 zTceAC^Ctcm>806jh*`#2&_sWrFf`Ge!6e}(Rjd|TSG#HNBjMeqvD>Mt(Mr|q?wY_J z%^GmJ%U_75*dM+!udj7X7#7$`o-bq>{BN*F^L$CSu^8O4E+3?DO9Lf&el%)Txl#VE z*I_)@75(d_d|mSPIBl8j&iB{b4|)B?)FdS{8$>40Ux-G+*iNXn00&NDc+7=1hBrmF zcbgOO?@TaAHCKMI`wj9+Ie9`hbGHR?>rUbb{p$!$KnHCUFc;1 z9AD;b|Dqrt&nz0ZqISHFX~6@w)kYlGMvx8J6@p zY+KrHn6tKJ`B=SWX6y5Q;WxX2PQE{UeaeMz;!f*#_1dkx&&N^AuDyQ&`F!nt0q(nI z+-~S>lj|Xlnz*z2TrTZk<$YCRm)%bVU2)lcwu?2#lzqQ()No6V584tf)q||wOw3Xz z?F5V%@E^3`kem@ zwn5vW9T0zCxJo;rT@d4X#`BEh8NV}bXS~iheE`}G?Sb|}gU~)`KXd>(2r;fc1RaKk zAjZu{AjZjzj~N#;9zG78fEf2O-esK2_?B@k<5|YBj9(eIGG1kzdIl;$BhXjS*U$uX i*C)A8c%PS`QD_WeoZ$Ua279Bw&O+Qn=b%aGJoFbq>GZS! literal 0 HcmV?d00001 diff --git a/gamma_age_v2/sasquatch.utc b/gamma_age_v2/sasquatch.utc new file mode 100644 index 0000000000000000000000000000000000000000..3c674b580cd3f76e2444c39496463fd9297fc86b GIT binary patch literal 5144 zcmeH~>v9xD6vtZu0SOlY1r?R6fFQ(xii*l+H2o}QjFJ!ejj7q^}{bfE8u zQmP8ATdLF*)Zr?nPN3ehPN}muD0Sf$rAnxOUZ2~4qM%t7c|c)}=B$(i4+tI!Lx!x!7ag&;8<{5@Oi>`Fv*4YAdmZ11K1ac<)iI^MLj_Z*i%Na(8J-^;uR<*g`!0uiAdYdfV_tu^^Kl;Y z?1Zu`ud@0k$2^bCS61iatN=d-ajccl5X9@!=DWw@=fQJ%?QG7dF+|4fy9VO>NnQ)_ z-Q!%aWo3noZ7VAr2V0lgmz!#Xt66Ond@I;r>o(!vB>bC&|8_9<4qodH=#m@wPO$H{ z1Hx(3i+m8``%mtL_+F78fG#`c*grZxg!(7P zhf)9H_(9aaI(`WCZ;l^E{k!8MsQ+;M2hjdz`-r_T^g4_-46QpS;IE@55MT`8UVRN4!4f^>z6F zV}S8pg0|sZBM(5!m*9Xh2)S1<`)<(pU-sdCI1F(Q=akA2_e<_S$06=5p84JN%>88C zwA!JzrfSlvnZiD;8wRIz%V3bCc2u{#b3`vPRiWKBI?++XOpY(KjT$mh((mo@OC=N7g}iHaoCu=nbaK=%cVijXK`2aBi#t)XX6#^)k5~y~rh?s4 zPRp$p?n#Has~lOAB%QW(Qy7V3k6DM&xMGr4$!I&1+5K^Ip2i^6rS+Tenp=6k8UM*O!s|E=3S!7QH=_0#0qZio|I-IQ{9=vl@+fJgxf?xFE zz*gcQvVN3eCrM0XyY7?vLYFy4Vy5bG)bZWbd=Q4xF@?30_D~!*2j&8|n)v4F`KeBb zS;jVKU_4M5nrPZ!l2|5HtQMN*I%)SNvAPYDg;Q0dm#SsaHH;Xwbu7BG$D&b=hr7(% zYi$#T1rCzi1#7YX1~Ho3CEdcqV8}Wu3liOoae;8*Is?A~nM{s$}g=G+D3bXq@dmrwsQK$zYqCRsK zL!G9+5$6w_?*#41vNf&TS<#`f)^y*eV%%!s`DWMR0joOOH2}Q6w6m2Ij?5km^|XtC z%r0URG0BLTGhsF#(LbLbTXJVMzqV;&#WKgrRHx@V+BRmG z=G*n&-oC%t(R{Z(?d@ecn|;Ul?c#T2DYOh?-p_oK3&@3I-pOxB55#|;H4t-DE;|2h z)~9Q@bV3T=b7Lpz|I&@PDo47;H{&|ZlD z1pA=<5Oe*9F#s_~8iM@#Fh^lwj4?+! U0gXT>A+Fyj#26fdD$ptDFMMzgi~s-t literal 0 HcmV?d00001 diff --git a/gamma_age_v2/scale_lg.uti b/gamma_age_v2/scale_lg.uti new file mode 100644 index 0000000000000000000000000000000000000000..1482bb7172a1372281767aa9cd32ce3028b533be GIT binary patch literal 1743 zcmZ8h*=`dt6g9MEUrX7ShSIW@Ldy%{i8fV5q_m1Ap*&V@#!W``#G@GpseB6`zyqIw z#Am@d6FcM1mCoFAeZ5>SbH4Ukjr|X68y|%bXMql|4*Wzw|9eh|Z}2ncg!lvh7ybhL zKNy^N%@6Dsa2~kKz!`>$Gr$et3c&dC?(MNB@J|5lm9_|Y-e7~Xr||wM)OkDZp zKG@FvzbIQKXZ{lWGr;qI1^Al%TVVSez}qTF`B>oJ`bK!(f9&FS@VsNz`W}dYo=P(< zt%_6;sUsn_WT9GCrAU?5Hhrm+A1dCHsY1)PD*Abn*~E;>JmXfZMm9N06c*~q!DOKO zHit4FsAAgIG=-f8AYE&;noLzTcdhIncd?-B)Y0Zt|IIi)HAT2Khcw4|!8*Kc=Bdd$ zGPeiOj=@w_+^)q@cbJUAd_C?BlfkeWAJyWH(%+M!%J)oOm|(swrLmJLzo+`gVI1us z7v$TuIND13Dyzn~Ycc9KV;$scar8xw;&A?29GOELdRs|5RQY<-Xp`d*UA*DrChlW6 z&EmWnPqRYoDl2u6FXJHJ$xWtmo2a6l@FlqT#62(39Ut10%-=rd$9w6?L+x7_?@K-Q zF|Jmo6j5iBxaxuTH|nd+EK`!(5gnD1($g${yv8GDmr%tWnM=W0Wt-Rs-OUmH^7qGOz+rekePX21){DhjK%ip}bI5 LC?}K=)=&HgKHCf{ literal 0 HcmV?d00001 diff --git a/gamma_age_v2/scale_med.uti b/gamma_age_v2/scale_med.uti new file mode 100644 index 0000000000000000000000000000000000000000..4d0ddc0787faa4b4a626793918cf5573c0942df1 GIT binary patch literal 2002 zcmb_d*-qO)6rC<~-%Ix`Q0PJ_Ezo_3AVj2qA}8=rRYF62Ar^KfvYkrwi~1c^)$izs zRBF$$J;~IMRj+h>&z(EVo$>g1y;ZAh%+JidP)Z#HI>3A2(*dPs;lo2peT4r3{|o-x zVWrN%|AxV-DL!Cd0i-hf?(m-lKb~ds#|Yd$fb*OH_5;TXj%C&3g0r4C0COC(0?<%O zX3TR#JdOR`I=Hs&bCMkjI|a}6Xr}?oSubPSS-|ph;I^jo4j*;+ z1@Jon?IK|7xCCx%xD3wy)2;xPUj?@{Tyyw!aBDX#fxiiGue4i$? z`@_<<*UgvXRwvl$ z499z=xFO-^AQ|RcCQghq-=c)r$uPer?OiwamXUMv^-}CD25spL$Ja|S>Now+$(Lep zMR$F7{!;9jEgX7XblQ=4wrWBX;}DB@&c;=|kIo>A^JYBADzz%94xM}!JNZUzdJ?CB zB=vwdp@{d2>!q6gt#q$v-#+HYeQD{f(6%t%&|%-kc(pp>PoS_o9`?Zf>$YW~*Ava{ zsD=(DO{KO}^skyI!tE_0XhwqjE}N0~<7k_l8!7}9w8>;;RR`g8WmWv3A5qWkf5zq1 zp21WUnXE<+usk~HNDlHYZ0*nFN7Zr2@m;|VlRLHl$JAi6NWu($j38{coJ}Mp+gv!Cq;Aqr5 b@C0}YJOiEs{7b(CUIDKG{vEkrckh1yr!N?l literal 0 HcmV?d00001 diff --git a/gamma_age_v2/scale_med_1.uti b/gamma_age_v2/scale_med_1.uti new file mode 100644 index 0000000000000000000000000000000000000000..d278d74f14803a30cf6b49502353aeb294840d67 GIT binary patch literal 2148 zcmb_d$!-%t5N(#Q1PEJzusb1P4S^&qVaIleuw+Np*hJi-j;CXfGUKsk#z^6d_y~?1 zIq(UHZ{Uao?@gxc&Kx)(p7h*RUES5yJ?+=;nw7%Z;@rZLQfdTDz!mWGKBeZ-em$U+ zk9O&xQWJZWsvlBn9R6m z-Vav6QIK=qg9OS;!8q6d$piq(OhNZB$TbMgCpg}&gKNl`V;qoS3@z6qj)P*eUi!pI zQ0!B%rKZ!C%`=n!GqA6N#92`4I0sv5n1Idw6X!v(FTj=>E?V{_*n-PqpuGZeuf$bQ z>;gM7Orm8?#1ts@HQ20)mB*yaUR9XJMxo z3hiCXo`dazlJj+DGpEdzJ1993N|Dbg{eR0T=kq^v%6I?QoUHpE$TJ@W?}KfyX@Z`w z6XTfJF`G)2bZjb#2@pzA4O`mxJ{osb2L?UMCT>MuFY&@|8mC`zO*ip2J%dATYGxgx z+|g0n#Dk7<7*iewXe6O;c2cE%jYPM$8dxwJQTM}Li%l4fW z#H@HV=Q|~@WqQN;)try|!@h6DbH4LdcU?Pw&UeBM9D3F0q+_D_a_EN<4l(l=#4qD} zbOuqJH~m3WshUZ&Z^cvJir1sCXQIS2an<8Z$o%c>dZ|W#BiZiB*GGQbm!{tErHB5S z_WR=F)9QeaOoknQI0E;t+cL#o&uDH()wOSu#8j5E@#QcGaC+{r~ z9}kBbK|QVMw$~~&IH*w5o2P@6g9MEUrX7yp|q@}(DH(Kq8(H*(zF^SLwT&+iQ9?ljHASZRKA4|;DOIT z;1TFv^vjxzwRAtO_?qm{H>y!HV zxCV{mY3v`?!L@y#%k1Fn3Ov`NT?IU6y^Lws0ng{beN8t4z7X)6;LiZsEx^}t8{F4$ z2b}w--32_q2kvXQAMgj@-X3}a{|Mk-X^#QVTWoOl1m2&^BDk;TX~37jc`vl(iL1Wc z2iv*-=T*z(%wK?i0(kx}0bjp=3v7Q4cv}If9t->%-w4n9Ph9*Ko_EYz-vJTOS6Qy5 zRgo$qbs)s1ELF#<45`YxW*~L?LnS*hQ)v0D%0ZFlHZ`Lv&$yGQkxdU$g@yX^a5B(+ z+e29#s&d-aHl>{gAh9)CO{S`vV=D(oF&1>4dfJ@mzmX&-rU=*OkoLGJS%=Jsj5Kqek3Q`g>Z|`MxPi6U?`%G}EuGC{6 z<7#C_5p_0+>mGQ2qk-DUb0xVQ(UV$Pt2&=u|F+38yj~YUcT2o?wO3~Rsh8JlL7_;+ z%(b>R}TyqRj literal 0 HcmV?d00001 diff --git a/gamma_age_v2/scale_st.uti b/gamma_age_v2/scale_st.uti new file mode 100644 index 0000000000000000000000000000000000000000..714d01b1857de4e56c84a52a99f0de6aca5780d0 GIT binary patch literal 1871 zcmbVN*-jKe6fG4LcSYQ{5y2Hvz%4!rLkN=$WYRO@iwP;Z3#LQ&RHwVf1i#1+@k9I& z6FsM=YP#r0Z*u0ITep^5OP~4DYc+OO7MDK?Ax;6`0P;U4g;;{Wa9W73@FDzf_~se3 z!T*K9i5L8V{REII?U&`}ZA>=_oB*x>9FOV6S?EwA+B=cfef@cRhX&+}V9c;2!|oEA1iRc!Ler9>KeFnFV+CJofk;IPZlv zKXT zTT=;kQsuW*c<9H$26A4$U5kUYI8<3RzFmt^zaA!Dz7_|YauE6R*Wy6$;n3Skn!d`H znmW-r4$;QTE^gvJ`r|CloAEd+#FjEL@$zNt)o!q;W4u_fbVp@D}xG*n*qFHq-hBC1?jAPGNX%G(4m2~a-yNpdiy zg`XxRi4sj|rX*8tD8Z~?8lcq90F+irDy5VXO6jCzQYtBtltxM-rLX~TN3#H>ZVs3S rC~1_k_rM2$vO@`@%uuo@Rg@@76Xk=l!Oh@c#0u~hcn5G_Zh!v(LlO~Y literal 0 HcmV?d00001 diff --git a/gamma_age_v2/screamer.utc b/gamma_age_v2/screamer.utc new file mode 100644 index 0000000000000000000000000000000000000000..abc74a26a6274d00134c874b5ce8136c71a721a0 GIT binary patch literal 5327 zcmeI0S$h;k6o!jUQNp62B5te#f`EXCippdr%RoqmnLrSiP%~4RH0kLcx_c6W8}2CX zyW+mx=uhx3c;%&kz+d2%&x7CBT{StmK`-=1InVQ@-cwamU480wcU6uI=T{%ywQc8K zrPL8<_k5+kNBPGhr4FL}ahXz;IZ9o;MyYX>jpbQ+5r$@!=N}kLG^bV&+#|SGaG&6Q z!9~Fb1amHK`~ks-1P=-x5?m5|Sa4ZzMewj-#>8FssNfO7#{@qt__*Ll1V1YHF~N@u z9u<5-uoheuToYUuYy^)9ZU`P1>wvh~q4T?uD*~I9?CL>(b{lOmp+#Z~2>a&L|gKX5S?c zpL6n3h|e(Rg4bGVWW3r^<2cts_hhcZtFB`!I;7NfV0W$SMg0w;p7C&YBY<<}wN^pr z?7%mHId9s{kmFmxoGf^u zOey0{mRW2Te1~PO&z6*zkscQy5=~%B9#mS&8n%jif4H8VOq-7>1r1a-qrowd@q z3BrUenU%sQiL{p#>zQ9LaV_#%i5GI`i23M7)?okU!(h@xv34DbaY;UAs#n+8RAe5| z3SO+Ermp(-f|YhPlDAYaUc&vMvk@<7#G`|Tdr8``_I%;0O4ttS6_fOO*@z`SGp8DNkeY#uRb0yJHf;p9RZ9+GU zDwvv{9`-u%uOuS47@=Ue^PMroYsLX#KC}E0FP`P+$Mr0KMEetEC+wN7?ByPhC$nPS5uzv%Zf3?PWpXeSnrwiY&4Y`&{Jb= zAF~V-uZHnJzHfqt!6XqTl`rS&C);u7CK275Nza zmZZbE@jCgCwI7L1R4`*+U^0Iw==Q^OLX`;wZ~&LbTxh-crEojXv#Z0M)pAwON7koR zd0)q|YsBw+PPM((XfZL(tg@tilO(3|Jmte?6YHB^i+>Q+iH-x{^`)OiQdFdVudf?6 z15!Vamxzf5%%t(t`H246{MeFJrt@o=IwF=S2z&k8!z+VI_ZR5sX zwy^^@tE_YE`qEEr+3B65bu%_P?s8>`t!QN_<=SKBN)30g)V6DzEY1&udYUfo2k^6W zaTRz)*1~30CyVU}VNk_`T3X+Er56|p1)3B)Ziqs`+Jk4?*= z6%da{JQndd#FgUlXBEWb4v#rJ-tbt%Aue(>0_1=Z9cd6+}3kDzaPp$-Oy{$>(Cp} zo6uX(+t54EyU=^k`_Ko_htNmR$IvIx1?W@gGw5^Z3+PMeE9h&eADRQrh5qkx&Lai| qs0ZR!jaxJqA8uc0%sp;j4nhOaA!ra9f=Uo$c^G0W%TNUxhW-Rqco`-D literal 0 HcmV?d00001 diff --git a/gamma_age_v2/screamerclaw.uti b/gamma_age_v2/screamerclaw.uti new file mode 100644 index 0000000000000000000000000000000000000000..7bd8456769cb51f42e7384c27f9c9983effdffb8 GIT binary patch literal 1106 zcmZ8h+iu!G5Z$Jv>Ah)6(o5QgFF;Cpsq#ias7O$unDS6niWYm4T3KVuUR05%d{n=o z?|IL^BKr+(tTz2Nn?lQ~IalbKXHNSjSN<9RA0}bH%fl}|G4T8U*|3hCw_i9Q# zhrWS8sU3bG-+`^tQYv!xGv`xn0-!AOSib?h0BEys)7hX`N5E5nH9dgxs8WjS?DOxW z3Osgk@;w3AgTi_W^Vj#meqPw$%S#xnedWM7Ik$nKvtL7d;kn-c%%S%CsKYKV26}hR z-h<71@tnLb+V?pTT5{5+kdwI-a(dfyGX56ed3f%3zyugek{NB~Sc+pgRqC5Aq;Dm` zQYnKp)F!@==!Z@Ok**YB9%nXAXXQHmek3y+pT>gCkM&tq=)RplIzN+Q8SA8lT{D(Sxkx`yzlG|8{LCl>v zf8ma&g89@gGT$A1*zZ_RjgQcuXfyXdsCDAF*`e}R894tely;Vh&Z~7J)=IxyZ3p~G zg4=T*W*yfnxavGK`tK)%uUe~t<&PJ*^+pE?oGAaw)@@F(Ph=k4QaHVw48EosunF+h z@U^g>uY=RU*FX+7bf}x5=f0 A;s5{u literal 0 HcmV?d00001 diff --git a/gamma_age_v2/screamerpropert.uti b/gamma_age_v2/screamerpropert.uti new file mode 100644 index 0000000000000000000000000000000000000000..b07c526bacf0d45cb526ba1524c80e8b00ee7959 GIT binary patch literal 1505 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 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/securityarmor.uti b/gamma_age_v2/securityarmor.uti new file mode 100644 index 0000000000000000000000000000000000000000..2e4964593326723a73e77efafed11ccb710efaa5 GIT binary patch literal 1510 zcmZ8h+invv5H-+pFV}LvG=-Mi1ES>xRefo;sv0R&(Iz1A0y5cYcGXQB?K+joWX^cT<5@d1pL(sv=l5?nKPaWn0K32&VEgP;pDZZ#753JmQoo`9 zLSsq&gFscWS4f<|UFEp}eHB0&bMS?*6%>ybNsH;R9y2l z+z0=~MaTod^M~O4PRb*|^T*Z7^yf*ypMv}PR|4J$VphRf6XhA;YkCgu*Vh8R4({az z2y5ouy!4CEuYfIp_x&390`z1!&b5_T%2*DSYU)y2R{S-pw(09U`zgtR9tz@jrR*2k z*k)#WbF^EDjBIw8NrHTOfT+1dsV)Xm&K4q5+L-~;wI&z;2$ik-M_nA~f;zc56~B`t zr&5Gxb4xTSO4i|Jrx==|qYL{j-ZMxwx7#&4?xxu&^w;fPnhnzV{CuGy&HO!B~Av*Ud|O2Yg#J2u~O>21+A zm0}|@xhZgo&ffHPg!f2iUfehBnOCWgVs#$)D?9La3Nx0%W>U5@{u4Sn7i*=p>mDpJ z!y*1n{`u5WDg8;2*&mt@$SZx=(>PL_34~3ey)X_^TS70flRRhRJl0eIN26} zMSv5GUCa!eRO}c|CQc+~;<@ZDP8?1eP8d#>Wq{quZsp|Q#Nedhgy3Z0MBpUgcd+vt Xz$(BFXJ@Yg>i|2Loy(48r&9g{^mq0U literal 0 HcmV?d00001 diff --git a/gamma_age_v2/seeker.utc b/gamma_age_v2/seeker.utc new file mode 100644 index 0000000000000000000000000000000000000000..6b74f0e72c529ad340069fa9e8b53f37c46f9e35 GIT binary patch literal 4818 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 Il1+gD04Zh+7ytkO literal 0 HcmV?d00001 diff --git a/gamma_age_v2/sei_ta_isoccu.nss b/gamma_age_v2/sei_ta_isoccu.nss new file mode 100644 index 00000000..a130572f --- /dev/null +++ b/gamma_age_v2/sei_ta_isoccu.nss @@ -0,0 +1,14 @@ +// +// NWIsOccupied +// +// Check if the object is currently being sat on. +// +// (c) Shir'le E. Illios, 2002 (shirle@drowwanderer.com) +// +//////////////////////////////////////////////////////// + +int StartingConditional() +{ + return GetIsObjectValid( GetSittingCreature( OBJECT_SELF ) ); +} + diff --git a/gamma_age_v2/sei_talk.ncs b/gamma_age_v2/sei_talk.ncs new file mode 100644 index 0000000000000000000000000000000000000000..388d6a9c4b590446ee34c290ad41890396cf5c71 GIT binary patch literal 49 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 R{4)f1h5mXL!umPLe*g`e)o%a* literal 0 HcmV?d00001 diff --git a/gamma_age_v2/sepbite.uti b/gamma_age_v2/sepbite.uti new file mode 100644 index 0000000000000000000000000000000000000000..caeacdca073816ac5aace2117c16b9526a406b4a GIT binary patch literal 963 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 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/serf.utc b/gamma_age_v2/serf.utc new file mode 100644 index 0000000000000000000000000000000000000000..0fb310dad97a888f5ae4a4f507395b1dfc153263 GIT binary patch literal 6792 zcmeI0Ta+9{8OI9}Flq?lqJpAUmOw(-ENc=qV${se>@93I!_FkjeN)q2Gt+E$S8sRC zP8M%~5#kl_0$%X07;m70;$6I>;N`({^ub3TeDJ|XA3R6@Uw8HFM{*A0IXrNVsdIkQ zzpAdTuKK#VW~L4{tMbs!ksZ5*5H0YBwL<(J$DuLi`&Er$v=Mkm!iwJk^+wGoN5S$$X0WH1mDTsV`;wGtBohpJjf4d7b&y%;%Ul zm^YapWPXVGJo9UqU(5VD=GQa7f%%QhZ(_c{{4jIHoSs)16OXyiTr+Po?=bH&518M~ ze35y`JYpU*H_Q{}OUzT|8FS0L$9$Q2pZO8yE6i_U{$}QHVg6R;Z)5&;=C?Axjrr}& z-@*JS^LH}8gZZ7zk1>B2^LIO^XZ#-Lcs<2>6s*CK`~v2inU6Bx!+eT)llfuhA@d{5 zk21fTIjsj}e~vSMg!yC4pJe`L=6_}W59a@Jj^#(J!v`J3ULk&q15OEXs}R3){zA&L zMCYFe)&sik4CmC}m%B2G;~(9Hbe<9&&&;j3j@r2MtfHND@K=Esfaik;&@f$2`3LjP z6?tUydzSa6JetT8)x{Dk9zuQcv%$k~>dQtziTs@0igwP0-{$gImIvwlfeG;IY_vjsp!<|*JB0dA zjDSZGbMh;|&dJa8e~r%%=mMk@oquL-%1ZiexRa6$vsHbE_B}ueO zRqW}7=1QW)q>g<}e=c0AcXezmohee?q&8K7ou(fPNHv{#X^_~!#Cg7{I{C5usG4|L zrmBN2jLgou^a_GL=TE6}lTXdaaZXsip%<|5M5|AHrWgASZ6|`F#d>JyFVY}QXVX!HF{!X9nvShb(_Ug-7iNqpHLoyh>N<^TTG?)% zA2a^S7#nlLs??%Sb>%Ipjz)YuwbBd*@o!ibT(nTr^bc$`AzrH)82a;+{Cq(F_EuB1 zt5!3xc@-|sVLp_Fv&!~T6;{fiPX)Gag4mX=RC{TvV>>9`uZ|3y+DLV~W#V30UG#%6 zjf@vhpOZA7APP$-=bNQBhb|p|(~J-lwXGB0S&x zUi5*eE)FsfxYXY{fT^Zu~s|W--4zwmU49Oz7QIq4cogC0JEZ7W*V?oJA zWV5SR@;hQRTR|<02^Vw_S=U6C=`54Bt7Y4Sq3PpVNrA`R@;+jX%dV8Tq-$kgEu-fu z4w4?0Zk!pGzK%0IV(FRKrY4kI4Vp@`%Z71DTgy;u4S#%bFr!ja=%fEZ82=yi*wO zP%8~O%GcQtI+0?eG`t{|1|1nxGATkC;;oduIKa9PWir*CLBQ}B+Np{1@H9=-$|$@P zt4izz2vQMWIaG`(9HP@&d0pvlE4#Q+Cc8m~JM?ubTPp~zit~0Sz*oW7z=Pl+@OAJF@J;YA zcm#Y4d>cFpz5~7sz6ZV!=(p_;!H>X?!DHYj;HThc;OF2M;FsW6;BoM4@Eh<1coIy3 z)4=KA|9w7G5rY~S2NPftl<}E{Q=+-P4_pOiz_5SRzofNQ~Z W;CgTaxDnh0=ou^kdJczy0{;Ph&N06L literal 0 HcmV?d00001 diff --git a/gamma_age_v2/sergonpropertie.uti b/gamma_age_v2/sergonpropertie.uti new file mode 100644 index 0000000000000000000000000000000000000000..adcb22a340251a5bf1e132ec46ac9db4d191d77a GIT binary patch literal 1501 zcmb`H$!^p@5QdwOgnbYDHY{N$Ktd$0!{mUaBpSs-?wxUEVquRhyXO#2c>o@P2jK;H z173tX68yj2HRDJeA|)k#uIjD2s$JcmdqHb+X<_k$F=iI*fo1S#%9xwb-=>Wb=-<%4 zpnuL7a|8M>1j=0I2l5G=s4QcmhP~IYzc=h3-aZ4Z0@vmk2*6o@5X?nyABSdK>_;f3 z4Ne2DSpyWtPvJOY*;&5Mra4)CYk#L;a}NsFQ#ijF2lr4prv~(Sz_k}VP~#ZqynP8; z{qk%WAM>~Z^n5tCIy~sBK;;??o}K31^r`V3rBBW6us-K~%*Kdxs7^+Nyc?AT%;<+!htm2TXC5xOjq+EvvZI@|veVnaWv zn`Haux1(sEi{{>3(is&c<4{@4B1yWoaPR7#Zjt3uxLC^7n34GQu20W|qb;|a>+bM} zczbp$(H^!pZ8Fj}T-((9<_>jxG6VS!`_j&Hu|++eh;tIG)ZxH?n&R|)3-_v&Vvr4U z4f6p;(xpjFvA)7;N^6n|FSkBMO`8u#J$W)0U6rs%S(toOrojy0D2c(u4Kp@eis)%H&$O(uSgxq)%TeY*%dRqy;0sey@ z;BWfEm%uq|Z?g4BXXnh$?s&cSoKJ&p>+{PO8?S;OI0kG1&w;ncD}T5U1YZ%qUJQcY z@PFYk75sz2*|kd~wIOZmT!KFbpp5n8CxG=jW{r2iS%7=G0PSSu>@!Y*A2JC$T{&Ct z3^>n9<9-_J`RCyC+?w-TP}>D~H-FLNJg=L-?C~oezv}U2@Sgzf8t|S3cD-_Tyn)fx zyb1oR&fW6(ZE#oTj>qqUj{w>|!14Rw^_2uG9&dp=djP^S(H;WsOpm~MCfX|C)~wl? zYIqFCZ@{~GQcc1sF&%&0`~xl#$?o?YNY#kpd}ep&G_{_Cu1LxDd>2 zNjcQn)MRR6^NhQROiVV)BtgA+Ty3n!P8#d6l(V^xD$Oha=^K?xRmx8HO+4J|} zUapR;-%OGtCH!Y|OJ`q~JcqMQT`1j)wfPopE0mhYVIz+EX*Tim&3KSz<8;11YQ#Os z53+KeA1GZauU=bnyvaPjBf~vEj<%8W@?j&6+SyR1^Zj8X#`)EL?&TYC^dX)ke*H!q zsa;%pD6vUJuXj|gG%m4@H(cDo_ef`1+&AM{HV8h7iE}S+V=v#+YAV`fQid7-gkGGB zG1A?tKUhZ<1^y=Y`GTcV^uY*kzN-v-;t$~Zkv-n8)2+5LK=Pd;!Qmk&Fcg+$fDOrJWs_1cC=?V33Ihd! dLO=mv&cqO8C`8g&P_0Wd!`fwbyvu#r-I1g-Yro`dz`nwwk@) zwz)Rt4=FzBO5oX(CU<4+OFM7l}ROWri_^YDBsTO9lII^GWX@g7rsY@&z!NSj6E zIJ&OF*?EJG|6hUko#(Ps*P?kH#Ep0_=^hCru~mh?(-C~v8gbvtTxOz+5%}wLsqZ27 zZq|iIyVj5Pv1T~0Lz^=a)^ZtGD{M!$EJt)1SOGYS96@g9$g%ynoukE(;wZ8GS)L=q dQQ?Se030i}E!&kN!BL1Kz?NsLv&C7L_y_v*n#ceE literal 0 HcmV?d00001 diff --git a/gamma_age_v2/servicerobot.utc b/gamma_age_v2/servicerobot.utc new file mode 100644 index 0000000000000000000000000000000000000000..ea6a0c8e8d99278162e0c48f828a6690c63d75b8 GIT binary patch literal 6997 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 K1*v0GU;qFmsR>a4 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/set_death_def_nw.nss b/gamma_age_v2/set_death_def_nw.nss new file mode 100644 index 00000000..f1d1a02e --- /dev/null +++ b/gamma_age_v2/set_death_def_nw.nss @@ -0,0 +1,33 @@ +// DMFI MP Starter Mod +// Module Control Settings scripts by Carlo +// Used in the mod_ruleset conversation +// Full text copied and then uncommented, to preserve my sanity +// in having to create all the different little convo setting scripts +// also helpful to see the different options all presented together + +void main() + +{ + +// ** Rest Systems ** + +// SetLocalInt(GetModule(), "rest_system", 1); // default - time-based rest +// SetLocalInt(GetModule(), "rest_system", 2); // supply-based resting +// SetLocalInt(GetModule(), "rest_system", 3); // DMFI rest system (alpha) +// SetLocalInt(GetModule(), "rest_system", 4); // standard NWN:EE resting +// SetLocalInt(GetModule(), "rest_system", 5); // disable resting + +// ** Dying/Death/Respawn Systems ** + +// SetLocalInt(GetModule(), "death_system", 1); // default - Parthenon Easy Death System (PC can be revived unless entire party killed, no respawn) +// SetLocalInt(GetModule(), "death_system", 2); // HABD system for bleeding / death (no respawn by default) + SetLocalInt(GetModule(), "death_system", 3); // standard NWN:EE death with unlimited respawn +// SetLocalInt(GetModule(), "death_system", 4); // standard NWN:EE death with respawn penalty + +// SetLocalInt(GetModule(), "respawn_system", 1); // default - respawn location set to current PC location +// SetLocalInt(GetModule(), "respawn_system", 2); // respawn location set to module starting point +// SetLocalInt(GetModule(), "respawn_system", 3); // respawn at module waypoint "wp_respawn_loc" + +return; + +} diff --git a/gamma_age_v2/set_death_habd.ncs b/gamma_age_v2/set_death_habd.ncs new file mode 100644 index 0000000000000000000000000000000000000000..c0c5c73a0bf11cb1230c4b4b8bb06acf577db503 GIT binary patch literal 61 zcmeZs4ps;=)H85mU|_J70}>1z3JfgFK$?k#m4PQEHL)ZkzPPfuBsG_nf#DMakT7SK K1*v0GU;qFmh6zvr literal 0 HcmV?d00001 diff --git a/gamma_age_v2/set_death_habd.nss b/gamma_age_v2/set_death_habd.nss new file mode 100644 index 00000000..43975d77 --- /dev/null +++ b/gamma_age_v2/set_death_habd.nss @@ -0,0 +1,33 @@ +// DMFI MP Starter Mod +// Module Control Settings scripts by Carlo +// Used in the mod_ruleset conversation +// Full text copied and then uncommented, to preserve my sanity +// in having to create all the different little convo setting scripts +// also helpful to see the different options all presented together + +void main() + +{ + +// ** Rest Systems ** + +// SetLocalInt(GetModule(), "rest_system", 1); // default - time-based rest +// SetLocalInt(GetModule(), "rest_system", 2); // supply-based resting +// SetLocalInt(GetModule(), "rest_system", 3); // DMFI rest system (alpha) +// SetLocalInt(GetModule(), "rest_system", 4); // standard NWN:EE resting +// SetLocalInt(GetModule(), "rest_system", 5); // disable resting + +// ** Dying/Death/Respawn Systems ** + +// SetLocalInt(GetModule(), "death_system", 1); // default - Parthenon Easy Death System (PC can be revived unless entire party killed, no respawn) + SetLocalInt(GetModule(), "death_system", 2); // HABD system for bleeding / death (no respawn by default) +// SetLocalInt(GetModule(), "death_system", 3); // standard NWN:EE death with unlimited respawn +// SetLocalInt(GetModule(), "death_system", 4); // standard NWN:EE death with respawn penalty + +// SetLocalInt(GetModule(), "respawn_system", 1); // default - respawn location set to current PC location +// SetLocalInt(GetModule(), "respawn_system", 2); // respawn location set to module starting point +// SetLocalInt(GetModule(), "respawn_system", 3); // respawn at module waypoint "wp_respawn_loc" + +return; + +} diff --git a/gamma_age_v2/set_death_parth.ncs b/gamma_age_v2/set_death_parth.ncs new file mode 100644 index 0000000000000000000000000000000000000000..1943e52ac55b0399c399ab584dd3fdd9ed6eced3 GIT binary patch literal 61 zcmeZs4ps;=)H85mU|_J70}>1z3JfgFK$?+-m4PQEHL)ZkzPPfuBsG_nf#DMakT7SK K1*v0GU;qFmV+l_H literal 0 HcmV?d00001 diff --git a/gamma_age_v2/set_death_parth.nss b/gamma_age_v2/set_death_parth.nss new file mode 100644 index 00000000..7fd6143b --- /dev/null +++ b/gamma_age_v2/set_death_parth.nss @@ -0,0 +1,33 @@ +// DMFI MP Starter Mod +// Module Control Settings scripts by Carlo +// Used in the mod_ruleset conversation +// Full text copied and then uncommented, to preserve my sanity +// in having to create all the different little convo setting scripts +// also helpful to see the different options all presented together + +void main() + +{ + +// ** Rest Systems ** + +// SetLocalInt(GetModule(), "rest_system", 1); // default - time-based rest +// SetLocalInt(GetModule(), "rest_system", 2); // supply-based resting +// SetLocalInt(GetModule(), "rest_system", 3); // DMFI rest system (alpha) +// SetLocalInt(GetModule(), "rest_system", 4); // standard NWN:EE resting +// SetLocalInt(GetModule(), "rest_system", 5); // disable resting + +// ** Dying/Death/Respawn Systems ** + + SetLocalInt(GetModule(), "death_system", 1); // default - Parthenon Easy Death System (PC can be revived unless entire party killed, no respawn) +// SetLocalInt(GetModule(), "death_system", 2); // HABD system for bleeding / death (no respawn by default) +// SetLocalInt(GetModule(), "death_system", 3); // standard NWN:EE death with unlimited respawn +// SetLocalInt(GetModule(), "death_system", 4); // standard NWN:EE death with respawn penalty + +// SetLocalInt(GetModule(), "respawn_system", 1); // default - respawn location set to current PC location +// SetLocalInt(GetModule(), "respawn_system", 2); // respawn location set to module starting point +// SetLocalInt(GetModule(), "respawn_system", 3); // respawn at module waypoint "wp_respawn_loc" + +return; + +} diff --git a/gamma_age_v2/set_death_res_pn.ncs b/gamma_age_v2/set_death_res_pn.ncs new file mode 100644 index 0000000000000000000000000000000000000000..addcd7fb5deb621b6de68c6137eea75104cf4164 GIT binary patch literal 61 zcmeZs4ps;=)H85mU|_J70}>1z3JfgFK$?Yxm4PQEHL)ZkzPPfuBsG_nf#DMakT7SK K1*v0GU;qFm%n4Ee literal 0 HcmV?d00001 diff --git a/gamma_age_v2/set_death_res_pn.nss b/gamma_age_v2/set_death_res_pn.nss new file mode 100644 index 00000000..dcc35423 --- /dev/null +++ b/gamma_age_v2/set_death_res_pn.nss @@ -0,0 +1,33 @@ +// DMFI MP Starter Mod +// Module Control Settings scripts by Carlo +// Used in the mod_ruleset conversation +// Full text copied and then uncommented, to preserve my sanity +// in having to create all the different little convo setting scripts +// also helpful to see the different options all presented together + +void main() + +{ + +// ** Rest Systems ** + +// SetLocalInt(GetModule(), "rest_system", 1); // default - time-based rest +// SetLocalInt(GetModule(), "rest_system", 2); // supply-based resting +// SetLocalInt(GetModule(), "rest_system", 3); // DMFI rest system (alpha) +// SetLocalInt(GetModule(), "rest_system", 4); // standard NWN:EE resting +// SetLocalInt(GetModule(), "rest_system", 5); // disable resting + +// ** Dying/Death/Respawn Systems ** + +// SetLocalInt(GetModule(), "death_system", 1); // default - Parthenon Easy Death System (PC can be revived unless entire party killed, no respawn) +// SetLocalInt(GetModule(), "death_system", 2); // HABD system for bleeding / death (no respawn by default) +// SetLocalInt(GetModule(), "death_system", 3); // standard NWN:EE death with unlimited respawn + SetLocalInt(GetModule(), "death_system", 4); // standard NWN:EE death with respawn penalty + +// SetLocalInt(GetModule(), "respawn_system", 1); // default - respawn location set to current PC location +// SetLocalInt(GetModule(), "respawn_system", 2); // respawn location set to module starting point +// SetLocalInt(GetModule(), "respawn_system", 3); // respawn at module waypoint "wp_respawn_loc" + +return; + +} diff --git a/gamma_age_v2/set_resp_custom.ncs b/gamma_age_v2/set_resp_custom.ncs new file mode 100644 index 0000000000000000000000000000000000000000..53a32f9cb72eb4494621effab60192663c5aa798 GIT binary patch literal 63 zcmeZs4ps;=)H85mU|_J90}>1z3JfgFK$@9_m4UA)wYVU$JTJbuvbZEQmz9Cx69bSi MXO;!2WK&=O07_O0PXGV_ literal 0 HcmV?d00001 diff --git a/gamma_age_v2/set_resp_custom.nss b/gamma_age_v2/set_resp_custom.nss new file mode 100644 index 00000000..1275d3fb --- /dev/null +++ b/gamma_age_v2/set_resp_custom.nss @@ -0,0 +1,33 @@ +// DMFI MP Starter Mod +// Module Control Settings scripts by Carlo +// Used in the mod_ruleset conversation +// Full text copied and then uncommented, to preserve my sanity +// in having to create all the different little convo setting scripts +// also helpful to see the different options all presented together + +void main() + +{ + +// ** Rest Systems ** + +// SetLocalInt(GetModule(), "rest_system", 1); // default - time-based rest +// SetLocalInt(GetModule(), "rest_system", 2); // supply-based resting +// SetLocalInt(GetModule(), "rest_system", 3); // DMFI rest system (alpha) +// SetLocalInt(GetModule(), "rest_system", 4); // standard NWN:EE resting +// SetLocalInt(GetModule(), "rest_system", 5); // disable resting + +// ** Dying/Death/Respawn Systems ** + +// SetLocalInt(GetModule(), "death_system", 1); // default - Parthenon Easy Death System (PC can be revived unless entire party killed, no respawn) +// SetLocalInt(GetModule(), "death_system", 2); // HABD system for bleeding / death (no respawn by default) +// SetLocalInt(GetModule(), "death_system", 3); // standard NWN:EE death with unlimited respawn +// SetLocalInt(GetModule(), "death_system", 4); // standard NWN:EE death with respawn penalty + +// SetLocalInt(GetModule(), "respawn_system", 1); // default - respawn location set to current PC location +// SetLocalInt(GetModule(), "respawn_system", 2); // respawn location set to module starting point + SetLocalInt(GetModule(), "respawn_system", 3); // respawn at module waypoint "wp_respawn_loc" + +return; + +} diff --git a/gamma_age_v2/set_resp_default.ncs b/gamma_age_v2/set_resp_default.ncs new file mode 100644 index 0000000000000000000000000000000000000000..38b704ccf48e6109a47ed15f13aeecce227b3166 GIT binary patch literal 63 zcmeZs4ps;=)H85mU|_J90}>1z3JfgFK$?+-m4UA)wYVU$JTJbuvbZEQmz9Cx69bSi MXO;!2WK&=O07?uBO#lD@ literal 0 HcmV?d00001 diff --git a/gamma_age_v2/set_resp_default.nss b/gamma_age_v2/set_resp_default.nss new file mode 100644 index 00000000..2870f1e0 --- /dev/null +++ b/gamma_age_v2/set_resp_default.nss @@ -0,0 +1,33 @@ +// DMFI MP Starter Mod +// Module Control Settings scripts by Carlo +// Used in the mod_ruleset conversation +// Full text copied and then uncommented, to preserve my sanity +// in having to create all the different little convo setting scripts +// also helpful to see the different options all presented together + +void main() + +{ + +// ** Rest Systems ** + +// SetLocalInt(GetModule(), "rest_system", 1); // default - time-based rest +// SetLocalInt(GetModule(), "rest_system", 2); // supply-based resting +// SetLocalInt(GetModule(), "rest_system", 3); // DMFI rest system (alpha) +// SetLocalInt(GetModule(), "rest_system", 4); // standard NWN:EE resting +// SetLocalInt(GetModule(), "rest_system", 5); // disable resting + +// ** Dying/Death/Respawn Systems ** + +// SetLocalInt(GetModule(), "death_system", 1); // default - Parthenon Easy Death System (PC can be revived unless entire party killed, no respawn) +// SetLocalInt(GetModule(), "death_system", 2); // HABD system for bleeding / death (no respawn by default) +// SetLocalInt(GetModule(), "death_system", 3); // standard NWN:EE death with unlimited respawn +// SetLocalInt(GetModule(), "death_system", 4); // standard NWN:EE death with respawn penalty + + SetLocalInt(GetModule(), "respawn_system", 1); // default - respawn location set to current PC location +// SetLocalInt(GetModule(), "respawn_system", 2); // respawn location set to module starting point +// SetLocalInt(GetModule(), "respawn_system", 3); // respawn at module waypoint "wp_respawn_loc" + +return; + +} diff --git a/gamma_age_v2/set_resp_mod_st.ncs b/gamma_age_v2/set_resp_mod_st.ncs new file mode 100644 index 0000000000000000000000000000000000000000..5c10a792af016fe2256a172872b2827057bde49f GIT binary patch literal 63 zcmeZs4ps;=)H85mU|_J90}>1z3JfgFK$?k#m4UA)wYVU$JTJbuvbZEQmz9Cx69bSi MXO;!2WK&=O07@|mP5=M^ literal 0 HcmV?d00001 diff --git a/gamma_age_v2/set_resp_mod_st.nss b/gamma_age_v2/set_resp_mod_st.nss new file mode 100644 index 00000000..89f209ff --- /dev/null +++ b/gamma_age_v2/set_resp_mod_st.nss @@ -0,0 +1,33 @@ +// DMFI MP Starter Mod +// Module Control Settings scripts by Carlo +// Used in the mod_ruleset conversation +// Full text copied and then uncommented, to preserve my sanity +// in having to create all the different little convo setting scripts +// also helpful to see the different options all presented together + +void main() + +{ + +// ** Rest Systems ** + +// SetLocalInt(GetModule(), "rest_system", 1); // default - time-based rest +// SetLocalInt(GetModule(), "rest_system", 2); // supply-based resting +// SetLocalInt(GetModule(), "rest_system", 3); // DMFI rest system (alpha) +// SetLocalInt(GetModule(), "rest_system", 4); // standard NWN:EE resting +// SetLocalInt(GetModule(), "rest_system", 5); // disable resting + +// ** Dying/Death/Respawn Systems ** + +// SetLocalInt(GetModule(), "death_system", 1); // default - Parthenon Easy Death System (PC can be revived unless entire party killed, no respawn) +// SetLocalInt(GetModule(), "death_system", 2); // HABD system for bleeding / death (no respawn by default) +// SetLocalInt(GetModule(), "death_system", 3); // standard NWN:EE death with unlimited respawn +// SetLocalInt(GetModule(), "death_system", 4); // standard NWN:EE death with respawn penalty + +// SetLocalInt(GetModule(), "respawn_system", 1); // default - respawn location set to current PC location + SetLocalInt(GetModule(), "respawn_system", 2); // respawn location set to module starting point +// SetLocalInt(GetModule(), "respawn_system", 3); // respawn at module waypoint "wp_respawn_loc" + +return; + +} diff --git a/gamma_age_v2/set_rest_def_nwn.ncs b/gamma_age_v2/set_rest_def_nwn.ncs new file mode 100644 index 0000000000000000000000000000000000000000..a6ecccec4edd32c18338ef60d0713ca5d21a15e5 GIT binary patch literal 60 zcmeZs4ps;=)H85mU|_J30}>1z3JfgFK$?Yxm4Uk`wYVg{xU#q;HJ6ov;S&RpFlUwp JDPvP$000^N2?ziH literal 0 HcmV?d00001 diff --git a/gamma_age_v2/set_rest_def_nwn.nss b/gamma_age_v2/set_rest_def_nwn.nss new file mode 100644 index 00000000..288dafc9 --- /dev/null +++ b/gamma_age_v2/set_rest_def_nwn.nss @@ -0,0 +1,33 @@ +// DMFI MP Starter Mod +// Module Control Settings scripts by Carlo +// Used in the mod_ruleset conversation +// Full text copied and then uncommented, to preserve my sanity +// in having to create all the different little convo setting scripts +// also helpful to see the different options all presented together + +void main() + +{ + +// ** Rest Systems ** + +// SetLocalInt(GetModule(), "rest_system", 1); // default - time-based rest +// SetLocalInt(GetModule(), "rest_system", 2); // supply-based resting +// SetLocalInt(GetModule(), "rest_system", 3); // DMFI rest system (alpha) + SetLocalInt(GetModule(), "rest_system", 4); // standard NWN:EE resting +// SetLocalInt(GetModule(), "rest_system", 5); // disable resting + +// ** Dying/Death/Respawn Systems ** + +// SetLocalInt(GetModule(), "death_system", 1); // default - Parthenon Easy Death System (PC can be revived unless entire party killed, no respawn) +// SetLocalInt(GetModule(), "death_system", 2); // HABD system for bleeding / death (no respawn by default) +// SetLocalInt(GetModule(), "death_system", 3); // standard NWN:EE death with unlimited respawn +// SetLocalInt(GetModule(), "death_system", 4); // standard NWN:EE death with respawn penalty + +// SetLocalInt(GetModule(), "respawn_system", 1); // default - respawn location set to current PC location +// SetLocalInt(GetModule(), "respawn_system", 2); // respawn location set to module starting point +// SetLocalInt(GetModule(), "respawn_system", 3); // respawn at module waypoint "wp_respawn_loc" + +return; + +} diff --git a/gamma_age_v2/set_rest_dmfi.ncs b/gamma_age_v2/set_rest_dmfi.ncs new file mode 100644 index 0000000000000000000000000000000000000000..9aef309bf6821477ddf685692d5508d1716a3bdd GIT binary patch literal 60 zcmeZs4ps;=)H85mU|_J30}>1z3JfgFK$@9_m4Uk`wYVg{xU#q;HJ6ov;S&RpFlUwp JDPvP$000@=2?qcG literal 0 HcmV?d00001 diff --git a/gamma_age_v2/set_rest_dmfi.nss b/gamma_age_v2/set_rest_dmfi.nss new file mode 100644 index 00000000..74b31974 --- /dev/null +++ b/gamma_age_v2/set_rest_dmfi.nss @@ -0,0 +1,33 @@ +// DMFI MP Starter Mod +// Module Control Settings scripts by Carlo +// Used in the mod_ruleset conversation +// Full text copied and then uncommented, to preserve my sanity +// in having to create all the different little convo setting scripts +// also helpful to see the different options all presented together + +void main() + +{ + +// ** Rest Systems ** + +// SetLocalInt(GetModule(), "rest_system", 1); // default - time-based rest +// SetLocalInt(GetModule(), "rest_system", 2); // supply-based resting + SetLocalInt(GetModule(), "rest_system", 3); // DMFI rest system (alpha) +// SetLocalInt(GetModule(), "rest_system", 4); // standard NWN:EE resting +// SetLocalInt(GetModule(), "rest_system", 5); // disable resting + +// ** Dying/Death/Respawn Systems ** + +// SetLocalInt(GetModule(), "death_system", 1); // default - Parthenon Easy Death System (PC can be revived unless entire party killed, no respawn) +// SetLocalInt(GetModule(), "death_system", 2); // HABD system for bleeding / death (no respawn by default) +// SetLocalInt(GetModule(), "death_system", 3); // standard NWN:EE death with unlimited respawn +// SetLocalInt(GetModule(), "death_system", 4); // standard NWN:EE death with respawn penalty + +// SetLocalInt(GetModule(), "respawn_system", 1); // default - respawn location set to current PC location +// SetLocalInt(GetModule(), "respawn_system", 2); // respawn location set to module starting point +// SetLocalInt(GetModule(), "respawn_system", 3); // respawn at module waypoint "wp_respawn_loc" + +return; + +} diff --git a/gamma_age_v2/set_rest_none.ncs b/gamma_age_v2/set_rest_none.ncs new file mode 100644 index 0000000000000000000000000000000000000000..917217f66e786099d74113853ccbd0438102052f GIT binary patch literal 60 zcmeZs4ps;=)H85mU|_J30}>1z3JfgFK$?|>m4Uk`wYVg{xU#q;HJ6ov;S&RpFlUwp JDPvP$000^v2?+oI literal 0 HcmV?d00001 diff --git a/gamma_age_v2/set_rest_none.nss b/gamma_age_v2/set_rest_none.nss new file mode 100644 index 00000000..b415fdbd --- /dev/null +++ b/gamma_age_v2/set_rest_none.nss @@ -0,0 +1,33 @@ +// DMFI MP Starter Mod +// Module Control Settings scripts by Carlo +// Used in the mod_ruleset conversation +// Full text copied and then uncommented, to preserve my sanity +// in having to create all the different little convo setting scripts +// also helpful to see the different options all presented together + +void main() + +{ + +// ** Rest Systems ** + +// SetLocalInt(GetModule(), "rest_system", 1); // default - time-based rest +// SetLocalInt(GetModule(), "rest_system", 2); // supply-based resting +// SetLocalInt(GetModule(), "rest_system", 3); // DMFI rest system (alpha) +// SetLocalInt(GetModule(), "rest_system", 4); // standard NWN:EE resting + SetLocalInt(GetModule(), "rest_system", 5); // disable resting + +// ** Dying/Death/Respawn Systems ** + +// SetLocalInt(GetModule(), "death_system", 1); // default - Parthenon Easy Death System (PC can be revived unless entire party killed, no respawn) +// SetLocalInt(GetModule(), "death_system", 2); // HABD system for bleeding / death (no respawn by default) +// SetLocalInt(GetModule(), "death_system", 3); // standard NWN:EE death with unlimited respawn +// SetLocalInt(GetModule(), "death_system", 4); // standard NWN:EE death with respawn penalty + +// SetLocalInt(GetModule(), "respawn_system", 1); // default - respawn location set to current PC location +// SetLocalInt(GetModule(), "respawn_system", 2); // respawn location set to module starting point +// SetLocalInt(GetModule(), "respawn_system", 3); // respawn at module waypoint "wp_respawn_loc" + +return; + +} diff --git a/gamma_age_v2/set_rest_sbr.ncs b/gamma_age_v2/set_rest_sbr.ncs new file mode 100644 index 0000000000000000000000000000000000000000..91c85daf25a1d9f08a35add5df74932aebbd45e1 GIT binary patch literal 60 zcmeZs4ps;=)H85mU|_J30}>1z3JfgFK$?k#m4Uk`wYVg{xU#q;HJ6ov;S&RpFlUwp JDPvP$000@e2?hWF literal 0 HcmV?d00001 diff --git a/gamma_age_v2/set_rest_sbr.nss b/gamma_age_v2/set_rest_sbr.nss new file mode 100644 index 00000000..192bc541 --- /dev/null +++ b/gamma_age_v2/set_rest_sbr.nss @@ -0,0 +1,33 @@ +// DMFI MP Starter Mod +// Module Control Settings scripts by Carlo +// Used in the mod_ruleset conversation +// Full text copied and then uncommented, to preserve my sanity +// in having to create all the different little convo setting scripts +// also helpful to see the different options all presented together + +void main() + +{ + +// ** Rest Systems ** + +// SetLocalInt(GetModule(), "rest_system", 1); // default - time-based rest + SetLocalInt(GetModule(), "rest_system", 2); // supply-based resting +// SetLocalInt(GetModule(), "rest_system", 3); // DMFI rest system (alpha) +// SetLocalInt(GetModule(), "rest_system", 4); // standard NWN:EE resting +// SetLocalInt(GetModule(), "rest_system", 5); // disable resting + +// ** Dying/Death/Respawn Systems ** + +// SetLocalInt(GetModule(), "death_system", 1); // default - Parthenon Easy Death System (PC can be revived unless entire party killed, no respawn) +// SetLocalInt(GetModule(), "death_system", 2); // HABD system for bleeding / death (no respawn by default) +// SetLocalInt(GetModule(), "death_system", 3); // standard NWN:EE death with unlimited respawn +// SetLocalInt(GetModule(), "death_system", 4); // standard NWN:EE death with respawn penalty + +// SetLocalInt(GetModule(), "respawn_system", 1); // default - respawn location set to current PC location +// SetLocalInt(GetModule(), "respawn_system", 2); // respawn location set to module starting point +// SetLocalInt(GetModule(), "respawn_system", 3); // respawn at module waypoint "wp_respawn_loc" + +return; + +} diff --git a/gamma_age_v2/set_rest_time.ncs b/gamma_age_v2/set_rest_time.ncs new file mode 100644 index 0000000000000000000000000000000000000000..25e69ea806c01fa4bb22b978bd1ead97492ad9aa GIT binary patch literal 60 zcmeZs4ps;=)H85mU|_J30}>1z3JfgFK$?+-m4Uk`wYVg{xU#q;HJ6ov;S&RpFlUwp JDPvP$000@62?YQE literal 0 HcmV?d00001 diff --git a/gamma_age_v2/set_rest_time.nss b/gamma_age_v2/set_rest_time.nss new file mode 100644 index 00000000..6195e3c2 --- /dev/null +++ b/gamma_age_v2/set_rest_time.nss @@ -0,0 +1,33 @@ +// DMFI MP Starter Mod +// Module Control Settings scripts by Carlo +// Used in the mod_ruleset conversation +// Full text copied and then uncommented, to preserve my sanity +// in having to create all the different little convo setting scripts +// also helpful to see the different options all presented together + +void main() + +{ + +// ** Rest Systems ** + + SetLocalInt(GetModule(), "rest_system", 1); // default - time-based rest +// SetLocalInt(GetModule(), "rest_system", 2); // supply-based resting +// SetLocalInt(GetModule(), "rest_system", 3); // DMFI rest system (alpha) +// SetLocalInt(GetModule(), "rest_system", 4); // standard NWN:EE resting +// SetLocalInt(GetModule(), "rest_system", 5); // disable resting + +// ** Dying/Death/Respawn Systems ** + +// SetLocalInt(GetModule(), "death_system", 1); // default - Parthenon Easy Death System (PC can be revived unless entire party killed, no respawn) +// SetLocalInt(GetModule(), "death_system", 2); // HABD system for bleeding / death (no respawn by default) +// SetLocalInt(GetModule(), "death_system", 3); // standard NWN:EE death with unlimited respawn +// SetLocalInt(GetModule(), "death_system", 4); // standard NWN:EE death with respawn penalty + +// SetLocalInt(GetModule(), "respawn_system", 1); // default - respawn location set to current PC location +// SetLocalInt(GetModule(), "respawn_system", 2); // respawn location set to module starting point +// SetLocalInt(GetModule(), "respawn_system", 3); // respawn at module waypoint "wp_respawn_loc" + +return; + +} diff --git a/gamma_age_v2/sibraspropertie.uti b/gamma_age_v2/sibraspropertie.uti new file mode 100644 index 0000000000000000000000000000000000000000..5e4b3ed47c8261c3094eefb260ff90ace788ab2d GIT binary patch literal 1501 zcmb`H$!^p@5Qd8->^os!GAtpi0TPh74wD0x5;V#Tx%Z4K!NML}cF!T4@&G&nPrwuK z0=xk)!W{|z-`zdqM4V7c`drmpb#=R{KlG#4#`5CQ8xc7IcED@!`=H1*=r4yw6#5tR zPv{>rB3GgRK%nFTKah9eXl;qa4ST0ye{I;`y?qio2wckn5P?$wA;>vzAA)9F>_;fl z1}6a5tN{w+r*NFHd|RM5kz@7O`8y8V^}6*O;{0YD+#|^8U_hS%Tzl37HHq=Ex6eZd z|GXQ<#B*Hq8cJqCeRLYL;qf%p?|N>c?@tZee&Ft{q)&9 zJALm*oc#Bc|BaJtuK@l(<_z=KfWBr$YOJnnwXT~YZ%w6<)eJ+mtmZ?LCZ9EaZ!$&C zidMriDQuFD>T$NCSVuP5OcXz^Z?@b*|LuG<<(5{HzD{1*NdrdD=BYYYb$8F2;in!p z^pm=2zH5Fvj(53e?#(5gaal2rAZvN7Y1fqYrR(XId7-6Ev|3FViEnTF<4JEku-ir0 z9sUq+-we{w!}f+r$Ds|^CiA|zgKJM`;QXVZwu?ed>BdvFR-+Xc4*X{sZqK(+S5-17 zO;v<2?_gwZd0J1**2kwJ; g@Bl1;hu{%-44#0e;2Bs1&%q18yI%r~|6gbN3(z{1`~Uy| literal 0 HcmV?d00001 diff --git a/gamma_age_v2/sleeth.utc b/gamma_age_v2/sleeth.utc new file mode 100644 index 0000000000000000000000000000000000000000..e502525def59d8fbb29a4875781b47add7ec83a6 GIT binary patch literal 6457 zcmeI0Nt+}^8GsW8#;qApKoPfK7+{dL8M<*pRJyBrDd_1gx_YMBw27*Us!BR5v&hWq zo*EH1)NutBcf?(BMHEro!1d(wc=h1HgFirT-thf$srkmkFefigJkQ(tMr34U#Fvp# z9eHTIVh+ztO~1kOytl!FXL;VAIR5P%&#Q3^UgUWPcX{5E7kb{m&+xp*UgCMjI6gz- zv{#WoBso%?rK<9IUpJ<+m%pL%GDf9PiteZz{i2xmDg&-csIH?v!_wca`^)`^xW9zNI`+-d7$f zkCYFT->p1Wo+wY150!5#-%)-<`AGRuH<_m*;&#_XMyx_e-o3gYL&QC#|R9!L^@VP<*XSx&t- z75VdvqZ}?!&Qd#G6JD&!S$fCi7pd}>;<9eay)K4hMZ+({<$jW04$@aiuYhuFuf!#e zl3oR69fM081&Oh=EopCl$ga5*m$g-{->3XC<(K19CC!M(&>{A#$r@B{e6g+oj^ ze?30IK;&NXdwFr;Z^W-G{5m;@%Umd*v-tHO@2dElVSnLo!6yrUD}GPmH{kN_Nty+j z^D@Wgpho+WD*54Ay_{#KTEA@eWc3Njv)=bq+Bse4)Su(&SpDx}CG)!q<=Q=u7q6qY zfXjP)y3VP^XO&n*R6x?>Tm|_{i_$BFOKO{4^|q{O+&2{vfcaTXV^p z>v-OpZ8?g^X~B<^bj9||!ex6x)|(v+oQ-YRa+~X;f%6t!*mm*wa7J;te))cSqK zWP`k@7N#zahl8}}!g3UqnpIed>MrhAolSdLelBW{=G2%Qsf|)ydB0cp_fMGZ_6jA-~}#C*&(VdqRH023u>)hq7?Rro-3)m6y&XRYbU}yM>HK08wdc3}BATAJYqa7)bbkH>{?=urcHug2C6k?2K%h^clHqnqOI6wwL^R&zZa} z<0r`W_Son`>R$iyz;`CIx&OU#C0A|1(Y*R$Ks3?e^? z!f~~hV|-zDudcuCLeq_-;lM;4bIpNC6NQf35)#&EzeQ|DCTqlUMZ2AiL=AV!;EO6Z`yXnC!vW zFytZ8IeA1ZGug1(jtA1?8HJ|pC#_+UkCH0Ti}nuw($(I^7fVid!Kj?#%O zKWuaRj@fZ`K)j~R@i`@PC`;!Znci%>&StM%FZL7#gM3*j&+|xwpv9~{w>WQ$1*6PI zVLMwg$_vQnOGa71fC)>}rsotbL}81cx``r}3|KJAQ#^1cYuOc=lGUQjGQOBDm+eMj zvsfvLA;}vg|Ag*>v*2uyk;`ULHqi26LpF`_kHG}Uhl@QR|Gdh(CjZ>ZKMLo=1t1?D z%kUNWDtryT4&Q)p!nfet@CbYdz6;-j z@52w^hwv!;2p)qU!%yIG_$fRAKZBpclkf}pCHxA04Zne>;A!|R{0@E(e}F&25}W~N z!vFhouMmSO%)6`t8$$MGw1)5OiAX>XIbNmH+#5cy0cg(?IUsvwkrBIFXjd(NH5 zUGJokbvabHZ4^eT$FrAv$4y# zeEISPVKf=$kL1U5^5Yr#@vMJSTO%(1K8qc1b$cA#`nc=%g1{AeJs$!HtM6^3&6l#0`~*S432mWh2)?$CVP z+>@-GZ(Q!_#H#ZDRw>WuWnk*F$!MwA6H6qKB)v(x`ejP6>PWD$ArS%5HF#>kb!XkF zyWE9}W0iA`S1H+5g{Qg}9=8V1Ej4&Li*pnAv*ZaIqL&-NqPeiN(PENTNo7Vm|E;zF zTVTN3a@3JvAExpP8hMEn!?RY{I^kSQ-U^o)o*2#)#wUixbEhV9cjrdN*#{u>wxmBr zde^DZ!PD@myE9|8el?LF%N-v&<72rcz!GZAc+%Xu*H<+`e9K6Y^otRQmm=$RhS0`x z<5)EmX14GOmy8q<@r|`NCh*x{7IYLlfa1s(3$C7`W5zmLoH%Pa zMQb{6om+kE{x=2U7uY{&EjTCboz^m^BLdq=U~#T!Ti%Rv#XE@)(6!%EZu85rayLih zZf3bss^`wyjuPEVL!eP9YU3MmqKp?JqI`%^ISnDU+p%&v>SdN`GFk~@WuY7>QbX7I zvsfuN631ArS`|SY3m26c*?$fq$M~D-migou{o*|FN?>DR-2ikOPi6)NNAlSL8U}ZU z4<1Q0i#^F^POTqh5X8n3;D7LVW@z~ISgv3A4k9KkN4QRTS)8@SLe(zfhnO#0%XXzI z;6!4^b|z=$Y^S%$NNh^VSV{Edrj(ROW|}jn=2Fo{S*ZcAdsBEB_0eld$;Z-^Fp(nHAoltrKKHq1$v%z z7s^H9xSp@^Sb^=mV!W~}tZA#{tddRZN8$~Dznh=~X+Lj98$d3jtYwU*Bj-(cklh{_ zv6F!BifokqaeqR~G8+%hC@F>6V7rNx%4LJ!;bV z+AOpYyXjZ$j+JA7J+fyAfx=q?!$r372MP&guMV+PDwoBSTQ0jxLi4j#b|qIQ030@( zq`PJoJeOw^hvTiEBEon$Z3OCUCw0y;4hb#rg$Oil$wOjpp$Z4FMadD~j4i6xoGs?9 zink2B6|w9t2+tLB?xHQ(bMOw>KQIqlOPObdR{ur~nuP$(_5pP=h+>KSa;D@=OX+do zwgA_ph0GwAhI>|QC{NXA(1Fa-#^E3$;&HL_2x*d4(a%0o6aAd`>PNrtDh#?!kW&>k zD(Xw3&T3TnCQ(17QIm@Lh(=8*>Z7F6X92v)Dwh^*ih69FcEr`g@4&q3Y}vMpN}F_8 z)*1K%4BT3=tMk^9gIsGN$BOA0x9Zgy`w+&aAgEY}R|c=6&uH-}a(Ipcr`(~*sN*-c^VpmW1 zK>s&RUK||{k~n!|S>=h0q{b7&U?n}^zmxW;~c+!1(jE=;096D$ahA zMmzQcAhJ(L1)q|aJW*Nuaw%9-Zhpo>HYk?hM4)uY1eG0>wN%#eNF;Wm)XDIVBp^;& z8^f;^UTMy*ifYN3M7FUji*`l8D?OwfN-j7%bSRj#Ggy_zVd22x0|Wyy1l}_Q;l9g= z7`bms%-Lc5I+I_|viroDyqK!EbE3E`BlU_D&}jJ+>s%6XbsN1?8C{++ zu4k41OGDG5>$dZ{7hSDf^6B-PcC&8U*xfZ)XnjW9EHoqf3vu$~jJrCt|F08f^0$$+ z{7NMCcgw`YwH&1@vwkhNji&R6$4ynkRU!$7bNcRV{8gkkTAyfj-BkjaUmgRNy0&Nr zp@g5@mS|Ep1Wu!r5zS8oZ31M*gQh%b60Z<8p%5!UpJjzkhr!Wk{tg)& zF|yV1UVN6_CFB4ynLqWH}RcJ?pw1&s@l$IJwmG#oA{C1jbu={ty%KbZ)P zzLWNxJ3mt@m#oRE$ds3?<*Fd(mNyCVRIzxd_s|iM8P1=~wE96s-yD349DH1F)x90^ zxFDm*@HGF9#kUmlx$ID8SPY&LV`vB#`djr~`>SE>!F15eP{kt7PO;#4rE++kDcg&7 zIk*vqRg&4Nf<4e@MDqL7a{b8}l%SZ5{8O4LOgV)X5=sA1K4dot>m%D`RLL>I%tSqhO(LgFyJ@lCc>P4?gH(BIpd8>_I zLGut8up^%vD-0FJb0gVY13P~t9pu|S(oLVbWA$0Mwaa3+LMU*dC-b;-gQ ziEwNlJ3Wh}cAn#S4lt|Ke5nAbbQeHf6XTs}nOR^vc$y^+AL^zgfom2Fqsymwkz3&H zTWjt9E;za0yg@b#8n!^?3$}wQNM<2R3}){*46EB#SyX3b`-{S}p%2`eM%#B8ZC~^{ zoar7>u}W3DN1zQ=vCjt%L23$DYbdcVjj7YNV^>(O@|s>1v$j1?%BAZVQgDUuWDP~N zrD+P?eNo@Y+KX!k+{ZJ=40)qYCaLi03tRwtpQ_k4wa?JUhA&QeoDM=;$1hqN;~j&! z%=pPQ1N=b53mn)7;h;_;nFlA4e@L(K>mnL&(q(WzkX!TX7t*Z@@w@r!7jT^}z(>z5 ztcLja>oZp^y_Set)wkvGRC#!OsNspelYv_>32vlxT4A1qJZh2Ld&o&fKx{b;l zo4RHBr4B-Iz@O|x>Edfh@fs0M+1NlDT@|^5ds9PQA+wP~$c&F?E>YyI;Zj$QoJ%j1 zQtuh^ZKUvp3UVY>KN|L?{{=h01MpsA-^S>7!~Hj5Y`iqz!Eo(dlo!bD@@cpj92?E&Wj!%EA}H@PD1mk$ZzI9m z=N3u?g0rmOuIE%KtN6Bm02?}=@_<;oyiiilT9dQ$_)jfXM3s675Rv-rbxW(*a^2q48+^V}|7uTuK{pytj?AvG$-U8@`HjFOfaRUOpnx|0AMg7k+ z>vH8|FOtiR4f7m+wPywghsK9Sk*{jErDLJ?_Hj}P%ei{g8IYZWf+|JqVn3Y8pF~Pt zeJ|1XKr)X-WOj@?WBwzDKpM8(NLsLGl6FT#S}UZc|jIyMVGowRD!7MjGQ7b6|y!7UJ&3&P96OWN|fjuG1QT2e%ap+Jm(4Z z;DAT~=(BvF(od698dW{UO5U$g)nlxrqfymktYk%_Hu1x)gTkvEsFYijoPZH4{OvmMg6iyZCBKE9y%c^*Tj;Rij?7sIO~Op{Q?Y)EgA_j~aE4qW)QxR@8rL)EgD`UmA74qW)W>9$;!JAv*EN38= zb0C(pDUM@ajODx<%XvPQ^F%D?OR*e&WKu^vCci{mk8@|Nw0*Ih);NxFA(rz}Ea%6u zoX28055;o$wShW2HO6D-^v81eI#*BH1}-Xsj6rX>b#;?xqWa(tdZee$Z;s-3|VUv*|={WKCCGjftMP8Ay5(iHiFtc7$|MD~bR04!9dJLcy!7Y5$Rl!zd z{e$|S%HP{Hs{hW+m`3&AnYov?y9i9%<@2^;#ife|uD35RmVJPDX<3A0QPI3SM literal 0 HcmV?d00001 diff --git a/gamma_age_v2/sm_on_act.nss b/gamma_age_v2/sm_on_act.nss new file mode 100644 index 00000000..11fc4d3b --- /dev/null +++ b/gamma_age_v2/sm_on_act.nss @@ -0,0 +1,55 @@ +// DMFI MP Starter Mod +// sm_on_act + +#include "habd_include" +#include "x2_inc_switches" + +void main() +{ + + object oItem=GetItemActivated(); + object oTarget=GetItemActivatedTarget(); + object oUser=GetItemActivator(); + location lTarLoc=GetItemActivatedTargetLocation(); + string sTag = GetTag(oItem); + + // * Generic Item Script Execution Code + // * If MODULE_SWITCH_EXECUTE_TAGBASED_SCRIPTS is set to TRUE on the module, + // * it will execute a script that has the same name as the item's tag + // * inside this script you can manage scripts for all events by checking against + // * GetUserDefinedItemEventNumber(). See x2_it_example.nss + if (GetModuleSwitchValue(MODULE_SWITCH_ENABLE_TAGBASED_SCRIPTS) == TRUE) + { + SetUserDefinedItemEventNumber(X2_ITEM_EVENT_ACTIVATE); + int nRet = ExecuteScriptAndReturnInt(GetUserDefinedItemEventScriptName(oItem),OBJECT_SELF); + if (nRet == X2_EXECUTE_SCRIPT_END) + { + return; + } + + } + +// HABD support +if (HABDOnActivateItem(GetItemActivator(), GetItemActivatedTarget(), GetItemActivated())) return; + + +// BESIE Widget support +if (sTag == "BESIEWidget") + { + if(!GetIsDM(oUser)) return; // exits if not a DM + AssignCommand(oUser, ActionStartConversation(oUser, "re_widget", TRUE)); + } + +// DM Book of Journal Entries support +if (sTag == "DMBookofJournalEntries") + { + if(!GetIsDM(oUser)) return; // exits if not a DM + AssignCommand(oUser, ActionStartConversation(oUser, "dm_journal_entry", TRUE)); + } + +// if nothing found... + +ClearAllActions(); +return; + +} diff --git a/gamma_age_v2/sm_on_client_ent.ncs b/gamma_age_v2/sm_on_client_ent.ncs new file mode 100644 index 0000000000000000000000000000000000000000..2f8b901083a1234e2f6f27ff9d508ccc93017151 GIT binary patch literal 39453 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 bBDP9p%a{8bU}|a+_Zv&58xv%r*LM70{I~LA literal 0 HcmV?d00001 diff --git a/gamma_age_v2/sm_on_client_ent.nss b/gamma_age_v2/sm_on_client_ent.nss new file mode 100644 index 00000000..7c887ead --- /dev/null +++ b/gamma_age_v2/sm_on_client_ent.nss @@ -0,0 +1,170 @@ +// DMFI MP Starter Mod +// sm_on_client_ent +// +// Goes in the module's OnClientEnter event, or copy it into your own OnClientEnter script + + +// DMFI tool support +#include "dmfi_init_inc" + +// HABD support +#include "habd_include" + +// Horses support +#include "x3_inc_horse" + +void main() +{ + +// Following is HABD support +HABDGetDBOnClientEnter(GetEnteringObject()); + +// Uncomment the below if you want to give players the HABD bandages item on entry +// DelayCommand(6.0, HABDItemsOnClientEnter(GetEnteringObject())); + +object oPC=GetEnteringObject(); + +// ** Player Strip Settings ** +// To implement equipment stripping of entering PCs, set nStrip to TRUE +// and edit the levels of starting gold and XP as desired + +int nStrip = FALSE; +int nStartingGold = 400; +int nStartingXP = 1; + +// ** DM on module entry section ** + +// Checks if entering person is a DM and what DM items are in inventory +// Provides BESIE widget and the DMFI wands exploder if not there + +// Note that the DM Book of Journal Entries is not automatically given out +// Uncomment the line below for it, if you want that to occur + +int bBESIEWidget; +int bDMFIExploder; +int bDMbook; + +if(GetIsDM(oPC)) + { + SetLocalInt(GetModule(), "re_" + GetPCPlayerName(oPC), TRUE); + object oItem = GetFirstItemInInventory(oPC); + while(GetIsObjectValid(oItem)) + { + if(GetTag(oItem) == "BESIEWidget") bBESIEWidget = TRUE; + if(GetTag(oItem) == "dmfi_exploder") bDMFIExploder = TRUE; + if(GetTag(oItem) == "DMBookofJournalEntries") bDMbook = TRUE; + oItem = GetNextItemInInventory(oPC); + } + + if(!bBESIEWidget) CreateItemOnObject("besiewidget", oPC); // Creates Besie widget + if(!bDMFIExploder) CreateItemOnObject("dmfi_exploder", oPC); // Creates DMFI Exploder +// if(!bDMbook) CreateItemOnObject("dmbookofjournale", oPC); // Creates DM Book of Journal Entries + } + +// Initializes DMFI +if (GetIsDM(oPC)) +{ +dmfiInitialize(oPC); +return; +} + +// ** Player on module entry section ** + +// Checks to see if item stripping is enabled from above +// If so, strips equipped items and inventory of entering players +// strip script borrowed from Hard Core Modular + +if (nStrip) + { + +// Exits if the PC was previously stripped + int nStripped=GetLocalInt(GetModule(), "nStripped"+GetPCPlayerName(oPC)); + if (nStripped) return; + +// Now let's take all their stuff and destroy it + object oGear; + int nCt; + for(nCt=0;nCts zI5-q>a8T;IcXz!e2wG^!z3=C}d%tpAYq5*1&8km`yShf;=P}~u;WYJMC#WoLkQFi> zk4He{Bnrr~e0)2`6Atgv)oUF1L0CHsauggsh+8V-+b71|ajY5OSqV3zL^MJJX&f9O z;V1eNhnHy5=DKOj|qp2O8q~8wZ!Wc0%TaVRKq8;%+v!YD5 R3?_p8rxZW$AwItt`2jL37m@$~ literal 0 HcmV?d00001 diff --git a/gamma_age_v2/sm_on_client_lv.nss b/gamma_age_v2/sm_on_client_lv.nss new file mode 100644 index 00000000..08347796 --- /dev/null +++ b/gamma_age_v2/sm_on_client_lv.nss @@ -0,0 +1,9 @@ +#include "habd_include" + +void main() +{ + +// Following is HABD support +HABDSetDBOnClientLeave(GetName(GetExitingObject())); + +} diff --git a/gamma_age_v2/sm_on_death.ncs b/gamma_age_v2/sm_on_death.ncs new file mode 100644 index 0000000000000000000000000000000000000000..d4a4a112eafde3083f25f0826a5155d2fd4ac856 GIT binary patch literal 10843 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 sDB=GetLocalString(GetModule(),"X3_SADDLEBAG_DATABASE"); + if (HorseGetIsMounted(oPlayer)) + { // Dismount and then die + //SetCommandable(FALSE,oPlayer); + //ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectResurrection(),oPlayer); + DelayCommand(0.3,HORSE_SupportResetUnmountedAppearance(oPlayer)); + DelayCommand(3.0,HORSE_SupportCleanVariables(oPlayer)); + DelayCommand(1.0,HORSE_SupportRemoveACBonus(oPlayer)); + DelayCommand(1.0,HORSE_SupportRemoveHPBonus(oPlayer)); + DelayCommand(1.1,HORSE_SupportRemoveMountedSkillDecreases(oPlayer)); + DelayCommand(1.1,HORSE_SupportAdjustMountedArcheryPenalty(oPlayer)); + DelayCommand(1.2,HORSE_SupportOriginalSpeed(oPlayer)); + if (!GetLocalInt(GetModule(),"X3_HORSE_NO_CORPSES")) + { // okay to create lootable horse corpses + sR=GetSkinString(oPlayer,"sX3_HorseResRef"); + sT=GetSkinString(oPlayer,"sX3_HorseMountTag"); + nCH=GetSkinInt(oPlayer,"nX3_HorseAppearance"); + nST=GetSkinInt(oPlayer,"nX3_HorseTail"); + nC=GetLocalInt(oPlayer,"nX3_HorsePortrait"); + if (GetStringLength(sR)>0&&GetStringLeft(sR,GetStringLength(HORSE_PALADIN_PREFIX))!=HORSE_PALADIN_PREFIX) + { // create horse + oHorse=HorseCreateHorse(sR,GetLocation(oPlayer),oPlayer,sT,nCH,nST); + SetLootable(oHorse,TRUE); + SetPortraitId(oHorse,nC); + SetLocalInt(oHorse,"bDie",TRUE); + AssignCommand(oHorse,SetIsDestroyable(FALSE,TRUE,TRUE)); + } // create horse + } // okay to create lootable horse corpses + oInventory=GetLocalObject(oPlayer,"oX3_Saddlebags"); + sID=GetLocalString(oPlayer,"sDB_Inv"); + if (GetIsObjectValid(oInventory)) + { // drop horse saddlebags + if (!GetIsObjectValid(oHorse)) + { // no horse created + HORSE_SupportTransferInventory(oInventory,OBJECT_INVALID,GetLocation(oPlayer),TRUE); + } // no horse created + else + { // transfer to horse + HORSE_SupportTransferInventory(oInventory,oHorse,GetLocation(oHorse),TRUE); + //DelayCommand(2.0,PurgeSkinObject(oHorse)); + //DelayCommand(3.0,KillTheHorse(oHorse)); + //DelayCommand(1.8,PurgeSkinObject(oHorse)); + } // transfer to horse + } // drop horse saddlebags + else if (GetStringLength(sID)>0) + { // database based inventory + nC=GetCampaignInt(sDB,"nCO_"+sID); + while(nC>0) + { // restore inventory + sR=GetCampaignString(sDB,"sR"+sID+IntToString(nC)); + sT=GetCampaignString(sDB,"sT"+sID+IntToString(nC)); + nST=GetCampaignInt(sDB,"nS"+sID+IntToString(nC)); + nCH=GetCampaignInt(sDB,"nC"+sID+IntToString(nC)); + DeleteCampaignVariable(sDB,"sR"+sID+IntToString(nC)); + DeleteCampaignVariable(sDB,"sT"+sID+IntToString(nC)); + DeleteCampaignVariable(sDB,"nS"+sID+IntToString(nC)); + DeleteCampaignVariable(sDB,"nC"+sID+IntToString(nC)); + if (!GetIsObjectValid(oHorse)) + { // no lootable corpse + oItem=CreateObject(OBJECT_TYPE_ITEM,sR,GetLocation(oPlayer),FALSE,sT); + } // no lootable corpse + else + { // lootable corpse + oItem=CreateItemOnObject(sR,oHorse,nST,sT); + } // lootable corpse + if (GetItemStackSize(oItem)!=nST) SetItemStackSize(oItem,nST); + if (nCH>0) SetItemCharges(oItem,nCH); + nC--; + } // restore inventory + DeleteCampaignVariable(sDB,"nCO_"+sID); + //DelayCommand(2.0,PurgeSkinObject(oHorse)); + if (GetIsObjectValid(oHorse)&&GetLocalInt(oHorse,"bDie")) DelayCommand(3.0,KillTheHorse(oHorse)); + //DelayCommand(2.5,PurgeSkinObject(oHorse)); + } // database based inventory + else if (GetIsObjectValid(oHorse)) + { // no inventory + //DelayCommand(1.0,PurgeSkinObject(oHorse)); + DelayCommand(2.0,KillTheHorse(oHorse)); + //DelayCommand(1.8,PurgeSkinObject(oHorse)); + } // no inventory + //eEffect=EffectDeath(); + //DelayCommand(1.6,ApplyEffectToObject(DURATION_TYPE_INSTANT,eEffect,oPlayer)); + //DelayCommand(1.7,SetCommandable(TRUE,oPlayer)); + //return; + } // Dismount and then die + +// Now go to the main death system choices + +int deathchoice = GetLocalInt(GetModule(), "death_system"); + +if (deathchoice == 1) // Parthenon Easy Death System + ExecuteScript ("tz_ed_ondeath", oPlayer); + +if (deathchoice == 2) // HABD system, by default set to no respawn option + ExecuteScript ("habd_onpcdeath", oPlayer); + +if (deathchoice == 3 || deathchoice == 4) // standard death system with unlimited or penalty respawn + ExecuteScript("nw_o0_death", oPlayer); + +} + diff --git a/gamma_age_v2/sm_on_dying.ncs b/gamma_age_v2/sm_on_dying.ncs new file mode 100644 index 0000000000000000000000000000000000000000..979087ee48bfaac8899f206866f75090e38a923f GIT binary patch literal 329 zcmeZs4ps;=)H85mU|{r=V*mmU1qK#Y2A-7E#FC8o;>zNZ)Ld2uhEEJY!kCGbfpHcC zGvojN|9>#BurLFaGjc1)gS4rDMgIUrSs8dss^U{q;`8%TDl_xaff_lOQ1mcC^{680 z;mb%&0%<8o#-WLsTLGqA6=b0VnD+(h3>Iz$c8Ehtz|LZTkU+aznOImr>S4-ZG+e@4Tm#-5< zp1VQbCBxxx01OH+Nnow*hrK@S9rXI)ZibM52z=a8M%%e|81%QM@1F&DH+Z@?VUZ!S z#Jwn*u1MhZHBqlJ{paH?Rnt%Dm)T-tXNzaf_}}!?K*ZS2JPXch=TjAFXbWtloVxPVin#6akSM;&q z7CQx5tRT}-#56#?InK&Ibs}dHZ$+MXqb58%(uXqC47pJ|s2t`{ximjo&5#^av|gn? z_ARb|OVq_YWG72qr*6B8d7<qkL~@j%F;SSJ2*@UyE3j`ivsDgmQ=GMRB*gd4i1VzFRbl<-VBz7p5z===WkJiojRm1W zt5P@Yx#8w=f&_#AC4uLT#}F%%h+k(T3X_Q6QxIqH7);j%MI0+tl#p>uin1Txgh|o% zqrk`+D4AT~CXh$?r*VI*`aE;r@B<(}gw~4+|L4i@T&=)git&HVz|XPDO?a1{$LPOL zf=>9BzK+q)$IuFq%x&0uAYuJ@0?ywJ!*(%fZF~KFXdmxMs}=ToXb^=WvCAz=#mi%K zkB`$WB374Q#}m`GDEC!yaXiZ~W;kMKg?fTova%aSgHy5cM6wa~ivL$G&mm sr4xc<^*X%bd;KcR0J4M>12GJv$GQu+3h7Pf!qpd1@)P1P$wxZ*AIPd#*8l(j literal 0 HcmV?d00001 diff --git a/gamma_age_v2/sm_on_mod_ld.nss b/gamma_age_v2/sm_on_mod_ld.nss new file mode 100644 index 00000000..6c4b0653 --- /dev/null +++ b/gamma_age_v2/sm_on_mod_ld.nss @@ -0,0 +1,177 @@ +// sm_on_mod_ld +// initializes mod variables per standardBioware scripts +// and allows for selecting DMFI base mod script systems + +#include "x2_inc_switches" +#include "x2_inc_restsys" +#include "x3_inc_horse" + +void main() +{ + +// Campaign initialization for persistence + +/* +Following are the DMFI Multiplayer Starter Mod settings +make sure the selection in each category that you want is uncommented, and that the others are commented +see the accompanying documentation for full details on each system +*/ + +// ** Rest Systems ** + + SetLocalInt(GetModule(), "rest_system", 1); // default - time-based rest +// SetLocalInt(GetModule(), "rest_system", 2); // supply-based resting +// SetLocalInt(GetModule(), "rest_system", 3); // DMFI rest system (alpha) +// SetLocalInt(GetModule(), "rest_system", 4); // standard NWN:EE resting +// SetLocalInt(GetModule(), "rest_system", 5); // disable resting + +// ** Dying/Death/Respawn Systems ** + + SetLocalInt(GetModule(), "death_system", 1); // default - Parthenon Easy Death System (PC can be revived unless entire party killed, no respawn) +// SetLocalInt(GetModule(), "death_system", 2); // HABD system for bleeding / death (no respawn by default) +// SetLocalInt(GetModule(), "death_system", 3); // standard NWN:EE death with unlimited respawn +// SetLocalInt(GetModule(), "death_system", 4); // standard NWN:EE death with respawn penalty + + SetLocalInt(GetModule(), "respawn_system", 1); // default - respawn location set to current PC location +// SetLocalInt(GetModule(), "respawn_system", 2); // respawn location set to module starting point +// SetLocalInt(GetModule(), "respawn_system", 3); // respawn at module waypoint "wp_respawn_loc" + +// Below are the standard module settings from the core x2_mod_def_load script, adjust as desired + + if (GetGameDifficulty() == GAME_DIFFICULTY_CORE_RULES || GetGameDifficulty() == GAME_DIFFICULTY_DIFFICULT) + { + // * Setting the switch below will enable a seperate Use Magic Device Skillcheck for + // * rogues when playing on Hardcore+ difficulty. This only applies to scrolls + + SetModuleSwitch (MODULE_SWITCH_ENABLE_UMD_SCROLLS, TRUE); + + // * Activating the switches below will make AOE spells hurt neutral NPCS and allies by default + // * comment them out if not desired + + SetModuleSwitch (MODULE_SWITCH_AOE_HURT_NEUTRAL_NPCS, TRUE); + } + + // * AI: Activating the switch below will make the creaures using the WalkWaypoint function + // * able to walk across areas + SetModuleSwitch (MODULE_SWITCH_ENABLE_CROSSAREA_WALKWAYPOINTS, TRUE); + + // * Spells: Activating the switch below will make the Glyph of Warding spell behave differently: + // * The visual glyph will disappear after 6 seconds, making them impossible to spot + // SetModuleSwitch (MODULE_SWITCH_ENABLE_INVISIBLE_GLYPH_OF_WARDING, TRUE); + + // * Craft Feats: Want 50 charges on a newly created wand? We found this unbalancing, + // * but since it is described this way in the book, here is the switch to get it back... + // SetModuleSwitch (MODULE_SWITCH_ENABLE_CRAFT_WAND_50_CHARGES, TRUE); + + // * Craft Feats: Use this to disable Item Creation Feats if you do not want + // * them in your module + // SetModuleSwitch (MODULE_SWITCH_DISABLE_ITEM_CREATION_FEATS, TRUE); + + // * Palemaster: Deathless master touch in PnP only affects creatures up to a certain size. + // * We do not support this check for balancing reasons, but you can still activate it... + // SetModuleSwitch (MODULE_SWITCH_SPELL_CORERULES_DMASTERTOUCH, TRUE); + + // * Epic Spellcasting: Some Epic spells feed on the liveforce of the caster. However this + // * did not fit into NWNs spell system and was confusing, so we took it out... + // SetModuleSwitch (MODULE_SWITCH_EPIC_SPELLS_HURT_CASTER, TRUE); + + // * Epic Spellcasting: Some Epic spells feed on the liveforce of the caster. However this + // * did not fit into NWNs spell system and was confusing, so we took it out... + // SetModuleSwitch (MODULE_SWITCH_RESTRICT_USE_POISON_TO_FEAT, TRUE); + + // * Spellcasting: Some people don't like caster's abusing combat expertise to raise their AC + // * Uncommenting this line will drop expertise mode whenever a spell is cast by a player + // SetModuleSwitch (MODULE_VAR_AI_STOP_EXPERTISE_ABUSE, TRUE); + + + // * Item Event Scripts: The game's default event scripts allow routing of all item related events + // * into a single file, based on the tag of that item. If an item's tag is "test", it will fire a + // * script called "test" when an item based event (equip, unequip, acquire, unacquire, activate,...) + // * is triggered. Check "x2_it_example.nss" for an example. + + + SetModuleSwitch (MODULE_SWITCH_ENABLE_TAGBASED_SCRIPTS, TRUE); + + // Enabling this causes tagbased scripting to use 7 different scripts for item events instead of + // having them packaged all in one. + // The scripts are postfixed with "_aq", "_ua", "_eq", "_ue", "_ac", "_ci", and "hc" + + if (GetModuleSwitchValue (MODULE_SWITCH_ENABLE_TAGBASED_SCRIPTS) == TRUE) + { + // * If Tagbased scripts are enabled, and you are running a Local Vault Server + // * you should use the line below to add a layer of security to your server, preventing + // * people to execute script you don't want them to. If you use the feature below, + // * all called item scrips will be the prefix + the Tag of the item you want to execute, up to a + // * maximum of 16 chars, instead of the pure tag of the object. + // * i.e. without the line below a user activating an item with the tag "test", + // * will result in the execution of a script called "test". If you uncomment the line below + // * the script called will be "1_test.nss" + + // SetUserDefinedItemEventPrefix("i_"); + + } + + + // * This initializes Bioware's wandering monster system as used in Hordes of the Underdark + // * You can deactivate it, making your module load faster if you do not use it. + // * If you want to use it, make sure you set "x2_mod_def_rest" as your module's OnRest Script + + // SetModuleSwitch (MODULE_SWITCH_USE_XP2_RESTSYSTEM, TRUE); + + if (GetModuleSwitchValue(MODULE_SWITCH_USE_XP2_RESTSYSTEM) == TRUE) + { + + // * This allows you to specify a different 2da for the wandering monster system. + // SetWanderingMonster2DAFile("des_restsystem"); + + //* Do not change this line. + WMBuild2DACache(); + } + + // * In the following section there are examples for setting various options + // * in horse package. For more information look in the "x3_inc_horse". + + // * Ignores terrain height differencies while deciding whether to play mounting + // * animation or not (if the elevation difference between rider and horse in + // * hilly terrain is large, clipping occurs and the rider animates either above + // * the horse or sinks in the horse during animation, which may look funny). + SetLocalInt(GetModule(),"bX3_MOUNT_NO_ZAXIS",TRUE); + + // * This tells how long you have left in seconds before you will be force-mounted + // * if you got stuck while moving to horse in mounting procedure, unless you + // * are using X3_HORSE_ACT_VS_DELAY method, where you can interrupt your movement + // * before reaching the mounting spot. + //SetLocalFloat(GetModule(),"fX3_TIMEOUT_TO_MOUNT",12.0f); + + // * Once per fX3_FREQUENCY (default = 1.0s) seconds character will retry to + // * get on the right path when moving to horse in case he gets stuck or + // * something makes him temporarily stuck, if he doesnt get to horse in + // * fX3_TIMEOUT_TO_MOUNT seconds, he is forced to mount. + //SetLocalFloat(GetModule(),"fX3_FREQUENCY",2.0); + + // * Use this if you want characters to be able to interrupt the mounting + // * procedure before they get to the horse (ie. by clicking on the ground). + //SetLocalInt(GetModule(),"X3_HORSE_ACT_VS_DELAY",TRUE); + + // * Use horse's inventory as a storage for saddlebag content. + //SetLocalInt(GetModule(),"X3_HORSE_ENABLE_SADDLEBAGS",TRUE); + + // * Dont forget to place the storage waypoint for this to work! + //SetLocalString(GetModule(),"X3_SADDLEBAG_DATABASE","NAME"); + + // * Doesnt apply speed bonus when mounted. + //SetLocalInt(GetModule(),"X3_HORSE_DISABLE_SPEED",TRUE); + + // * Mounts are allowed in exterior areas only. + SetLocalInt(GetModule(),"X3_MOUNTS_EXTERNAL_ONLY",TRUE); + + // * No horses are allowed underground. + //SetLocalInt(GetModule(),"X3_MOUNTS_NO_UNDERGROUND",TRUE); + + // * Possible trouble-shoot for situation when players would be left in an + // * uncommandable state (it should never happen however) + //SetLocalInt(GetModule(),"X3_NO_MOUNT_COMMANDABLE",TRUE); + +} + + diff --git a/gamma_age_v2/sm_on_respawn.ncs b/gamma_age_v2/sm_on_respawn.ncs new file mode 100644 index 0000000000000000000000000000000000000000..28174117f01f5ed1d3821fb13e1fba3011b504ac GIT binary patch literal 1792 zcma)6zfTlV5T5sT_kbKCLGJ|5gC|B&x$_q>R%jxf1qDQ;yPR+dg~G)nA$BHq@DGsC zX`+d>C9NHn8jFju^9l=MuCTzI-<#RDET@sT#d|xm-+c39XJ&S0-Ynd_cH=%#4~-I@ zUPEC-{mZrL`bwqoys=(;8WH^@98(%!2A;#Kc5piN;ISTSoDG2zT$H@H%Lyj)pZtuMunK-H^p%)!XgIR69;u`YF+7f(xNdC&9L;PPUpPWf%!(5XbM~L#n;IqpO z<%F2gl3ScGFw#)Ro%dc4ii>*7`4v>}qqrRq48(`&Fc*~_1N}A?$UDXM6WOFWE?T-G zL!`xH$n~u0ITm!q2Q=veD*J$@d_cE-KzDpVGd`dbKA?gRXxaxf;sZM80~+=Ljro9# z1@Xo$xK`sEBZ!uKlq?bm3tgjH#18*Gm+I;5Fk>4M(6($pA$h4&D;FxqpKOn&jN-nG yVrsB>Tm~e(2S>s~yR*5 0) + return ((level * (level - 1)) / 2) * 1000; + else + return 0; +} + +// main script + +void main() +{ + +// Checks which death and respawn options have been selected +// death systems without respawn will not show the Death GUI and therefore not call this script + +int deathchoice = GetLocalInt(GetModule(), "death_system"); // Which death system? +int rspchoice = GetLocalInt(GetModule(), "respawn_system"); // Which respawn location system? + +object oPlayer = GetLastRespawnButtonPresser(); + if (!GetIsObjectValid(oPlayer)) + return; + + if (deathchoice == 2) // HABD system respawn script called + ExecuteScript("habd_onpcrespawn", oPlayer); + + effect eRes = EffectResurrection(); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eRes, oPlayer); + + effect eHeal = EffectHeal(GetMaxHitPoints(oPlayer)); + ApplyEffectToObject(DURATION_TYPE_INSTANT, eHeal, oPlayer); + + RemoveEffects(oPlayer); + + if (deathchoice == 4) // if standard death system with respawn penalty, apply the penalty + { + // Set the level and gold loss penalties for respawn + int nLevelPenalty = 1; // default is lose one level; edit this number to change (2 = 2 levels, etc.) + float fGoldLoss = 0.10; // default is 10%; edit this number to change (0.20 = 20%, etc.) + + // Lose level(s) + + int iCurrentXP = GetXP(oPlayer); + int iExtraXP = iCurrentXP - XPForLevel(GetHitDice(oPlayer)); + int iNewXP = XPForLevel(GetHitDice(oPlayer) - nLevelPenalty) + iExtraXP; // lose + if (iNewXP < 0) + iNewXP = 0; + SetXP(oPlayer, iNewXP); + + // Lose gold + + int nGoldToTake = FloatToInt(fGoldLoss * GetGold(oPlayer)); // default is 10%, edit to 0.2 for 20%, etc. + AssignCommand(oPlayer, TakeGoldFromCreature(nGoldToTake, oPlayer, TRUE)); + AssignCommand(oPlayer, ClearAllActions()); + } + +location lRespawn; // initializes respawn location variable + + if (rspchoice == 1) // set to player's current location + lRespawn = GetLocation(oPlayer); + + if (rspchoice == 2) // set to module's starting location + lRespawn = GetStartingLocation(); + + if (rspchoice == 3) // set to custom waypoint location + { + // Place a waypoint in your module with the tag "wp_respawn_loc" + // or edit the below waypoint tag to use a different one + object oRespawn = GetWaypointByTag("wp_respawn_loc"); + lRespawn = GetLocation(oRespawn); + } + + AssignCommand(oPlayer, ActionJumpToLocation(lRespawn)); // Respawn at location + +} diff --git a/gamma_age_v2/sm_on_rest.ncs b/gamma_age_v2/sm_on_rest.ncs new file mode 100644 index 0000000000000000000000000000000000000000..5afa7d2729b4f141f105c67ab866caaa06feb269 GIT binary patch literal 1841 zcmah}O=}ZT6n$?p)23w71Wl`8Yad1t!4!)NyYqA5LS0x93feH*m=3m?*qI2~^%n^K z20{D*LjQmZ7cN|M;i8K!T)1$d(nZxmJomnN^I=n3%A3sGuXFD?@7}w)pdQZ6Ub-Q~ z=-g?6zoHVhBTDP7FlvVVFlwziLi`dqE?bU}e?&nJ27^6e+XZ;blA6Jzu*q*lIP8n8 z!TM|4l=Z0d>IQr$p+1*T?!5yX?j0|TZU?>f`@qAMe-J!iA&_Le<@FQW_teILi!Cn= z{FWNa6nHo2L@Ps=P6<5s*@}36;%hDnS$H&4aTFTKM8V2YUy`VKeuo!Foy_I_EbIw2sp3qi zn8}0)_T3^M#s|C^J2+?iCt+7~@8Fu)7rKVggmBe}?)vq`Dw**&KTYRxO)-W#CY2Tv zlHqlP=$u>(dTPzv)>$*>*#nU%^+4w3#zUL}W4vP6hE#@4@b@AI zDqccjBa`yCZy zIo}ZVbNi%zUVR1vMlwxzVby#3TtzD_752K_RlgOgDB#QC2y48+8(OHoSx*s%%NiDR=GTd?5!FeaPU^? z{b=@!6Qf>F=36{$zMu{mc)OgSRquD&$`4g1h*UQSL;uOD7OGhs%!gSVyPWlymYtrq G68`|Ypx|!+ literal 0 HcmV?d00001 diff --git a/gamma_age_v2/sm_on_rest.nss b/gamma_age_v2/sm_on_rest.nss new file mode 100644 index 00000000..cc997adf --- /dev/null +++ b/gamma_age_v2/sm_on_rest.nss @@ -0,0 +1,130 @@ +// DMFI MP Starter Mod +// sm_on_rest +// selectable resting systems + +void main() +{ + +int restchoice = GetLocalInt(GetModule(), "rest_system"); +object oPlayer = GetLastPCRested(); + +if (restchoice == 1) // Time-based rest limitation +{ +// Below is a modified resting script taken from Johan's Simple Balance System +// change nDuration below to modify the number of hours in-game between allowed rests + + int nDuration = 8; // number of in-game (*not* real-life) hours allowed between rests + + if (GetLastRestEventType() == REST_EVENTTYPE_REST_STARTED) + { + effect eSleep = EffectVisualEffect(VFX_IMP_SLEEP); + + int iLastHourRest = GetLocalInt(oPlayer, "LastHourRest"); + int iLastDayRest = GetLocalInt(oPlayer, "LastDayRest"); + int iLastYearRest = GetLocalInt(oPlayer, "LastYearRest"); + int iLastMonthRest = GetLocalInt(oPlayer, "LastMonthRest"); + int iHour = GetTimeHour(); + int iDay = GetCalendarDay(); + int iYear = GetCalendarYear(); + int iMonth = GetCalendarMonth(); + int iHowLong = 0; + int iSum = iLastHourRest + iLastDayRest + iLastYearRest + iLastMonthRest; + + if (iLastYearRest != iYear) + iMonth = iMonth + 12; + if (iLastMonthRest != iMonth) + iDay = iDay + 28; + if (iDay != iLastDayRest) + iHour = iHour + 24 * (iDay - iLastDayRest); + + iHowLong = iHour - iLastHourRest; + + if ((iHowLong < nDuration) && (iSum != 0)) + { + AssignCommand(oPlayer, ClearAllActions()); + string msg = "You may rest again in " + IntToString(nDuration-iHowLong) + " hours."; + SendMessageToPC(oPlayer, msg); + } + else + { + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eSleep, oPlayer, 7.0); + DelayCommand(9.0, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eSleep, oPlayer, 7.0)); + } + } + else if (GetLastRestEventType() == REST_EVENTTYPE_REST_FINISHED) + { + SetLocalInt(oPlayer, "LastHourRest", GetTimeHour()); + SetLocalInt(oPlayer, "LastDayRest", GetCalendarDay()); + SetLocalInt(oPlayer, "LastMonthRest", GetCalendarMonth()); + SetLocalInt(oPlayer, "LastYearRest", GetCalendarYear()); + } +} + +if (restchoice == 2) // Supply-Based Resting +{ +// this is a slightly modified version of the original script by Lichking +// called onrest_tst_food + +// requires the player to have an item in inventory with the rest_item tag in order to be able to rest +// any number of different items can be given this tag to function with the system, including stackable ones +// a sample "Rest Item" is included in module palette under Special/Custom 5 which can be renamed/copied/modified as desired + + object oItem = GetFirstItemInInventory(oPlayer); + int iFound = FALSE; + + //Loop through inventory to look for any tagged rest_item + while(iFound==FALSE && oItem!=OBJECT_INVALID) + { + if(GetTag(oItem)!="rest_item") + oItem = GetNextItemInInventory(oPlayer); + else + iFound = TRUE; + } + + if(iFound==TRUE) // found one! + { + //The rest item is removed and the PC is allowed to rest. + if(GetIsResting(oPlayer)) + { + int iStackSize = GetItemStackSize(oItem); + if(iStackSize==1) + DestroyObject(oItem); + else + SetItemStackSize(oItem, iStackSize-1); + + } + } + else // didn't find one +{ + //The PC isn't allowed to rest + if(GetLastRestEventType()==1) + { + AssignCommand(oPlayer, ClearAllActions()); + FloatingTextStringOnCreature("You lack the supplies to rest", oPlayer, FALSE); + } + } +} + +if (restchoice == 3) // DMFI resting system + ExecuteScript("dmfi_onrest", OBJECT_SELF); + + +if (restchoice == 4) // standard rest system (unlimited) +{ + effect eSleep = EffectVisualEffect(VFX_IMP_SLEEP); + ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eSleep, oPlayer, 7.0); + DelayCommand(9.0, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eSleep, oPlayer, 7.0)); +} + + +if (restchoice == 5) // disables all resting +{ + AssignCommand(oPlayer, ClearAllActions()); + string msg = "Resting is not possible"; // edit to send your own custom message + SendMessageToPC(oPlayer, msg); + return; +} + +} + + diff --git a/gamma_age_v2/sm_on_unacquire.ncs b/gamma_age_v2/sm_on_unacquire.ncs new file mode 100644 index 0000000000000000000000000000000000000000..cb3bc8aa74e41b28719088cd0ca0fe3430366a6c GIT binary patch literal 1315 zcmaJ=%Wl(95FNju#RVeBrb2*&DH0&cTWoP$LoKDDicN^b!g3mmAc|e3fq!7lPxMP* z!xq5;36NN@=%UapvIq)uXM7U}3XyVe?mW(%IWwudfz`aee60##*k=Gga~9|Z%zQ5a zc}kbz6pY8?Jqrv_&V#C9V5M~<3Lg2PyBc|Qr&{x((79iA0&gV>+=jm%1|nCf>6*Aq z>#V5JqL)FQ6k!etqiSf1KnI=dujt$-+X(cT{1e1ucv__G(eII}5hpyBh^_jVDskk9 zBHxfx0@6JI-8@Hui`erbD1yNdbjG9*e4%Sc!P9WN@zb7ZQ^Hj=%sV-Rz!%7h) zLtd|3_VJr?KthkPm*oZK5R)G z3gs7v9-+|Qi%pKBy?agn1l|N(U&=+w2B@p~+;m-(BnLGJKUDtrkO^}N2;XU!ehGR@0Y*w8M40V9#Al-Oz-z&0T+>bB(U`0RkgSvsQ zlQ3O(Zvm7mR0Sh>TOK$nNR|(R%l#G_b!*?F1q&(hNklyodXMg E10KzuCjbBd literal 0 HcmV?d00001 diff --git a/gamma_age_v2/sm_on_unacquire.nss b/gamma_age_v2/sm_on_unacquire.nss new file mode 100644 index 00000000..9fb5cada --- /dev/null +++ b/gamma_age_v2/sm_on_unacquire.nss @@ -0,0 +1,107 @@ +// DMFI MP Starter Mod +// sm_on_unacquire + +//:://///////////////////////////////////////////// +//:: includes x2_mod_def_unaqu +//:: Created By: Georg Zoeller +//:: Created On: 2003-07-16 +//::////////////////////////////////////////////// + +#include "x2_inc_switches" +#include "habd_include" + +// +// NWDrop +// +// Script for when a character drops an item. +// Place in the OnUnAcquireItem module event. +// +// (c) Shir'le E. Illios, 2002 (shirle@drowwanderer.com) +// +//////////////////////////////////////////////////////// + + +// Script to place an item on the ground in front of a character. +// ARGUMENTS: +// a_oCharacter - The character dropping the item. +// a_oItem - The inventory item being dropped. +// a_sNewItem - ResRef of the new item to place. +// +void SEI_PlaceItem( object a_oCharacter, object a_oItem, string a_sNewItem ) +{ + + // Get information on where we want the object. + location lCharLocation = GetLocation( a_oCharacter ); + object oArea = GetAreaFromLocation( lCharLocation ); + vector vPosition = GetPositionFromLocation( lCharLocation ); + float fFacing = GetFacingFromLocation( lCharLocation ); + + // Face away from the character. + fFacing += 180.0f; + + // SEI_TODO: Change position to slightly in front of character. + + // Create the new location to place the object. + location lPlace = Location( oArea, vPosition, fFacing ); + + // First destroy the inventory item. + DestroyObject( a_oItem ); + + // And create the new object. + CreateObject( OBJECT_TYPE_PLACEABLE, a_sNewItem, lPlace ); + +} // End SEI_PlaceItem + + + +void main() +{ + +// Original tag-based scripting support + + object oItem = GetModuleItemLost(); + // * Generic Item Script Execution Code + // * If MODULE_SWITCH_EXECUTE_TAGBASED_SCRIPTS is set to TRUE on the module, + // * it will execute a script that has the same name as the item's tag + // * inside this script you can manage scripts for all events by checking against + // * GetUserDefinedItemEventNumber(). See x2_it_example.nss + if (GetModuleSwitchValue(MODULE_SWITCH_ENABLE_TAGBASED_SCRIPTS) == TRUE) + { + SetUserDefinedItemEventNumber(X2_ITEM_EVENT_UNACQUIRE); + int nRet = ExecuteScriptAndReturnInt(GetUserDefinedItemEventScriptName(oItem),OBJECT_SELF); + if (nRet == X2_EXECUTE_SCRIPT_END) + { + return; + } + + } + +// HABD support +if (HABDOnUnAcquiredItem(GetModuleItemLostBy(), GetModuleItemLost())) return; + +// SEI placeables support + // Get the character who lost the item. + object oChar = GetModuleItemLostBy(); + + // SEI_Note: There seems to be a bug in GetModuleItemLostBy(), which + // returns the lost object, not the lost character holding the + // object. But strangely enough GetEnteringObject does return the + // character. Done like this for backwards compatibility if + // BioWare ever fixes the bug. + if( oChar == oItem ) + { + oChar = GetEnteringObject(); + } + + // Check if the dropped item is a chair. + if( GetTag( oItem ) == "Chair" ) + { + SEI_PlaceItem( oChar, oItem, "movechair" ); + } + // Check if the dropped item is a stool. + else if( GetTag( oItem ) == "Stool" ) + { + SEI_PlaceItem( oChar, oItem, "movestool" ); + } + +} diff --git a/gamma_age_v2/smovbai.utc b/gamma_age_v2/smovbai.utc new file mode 100644 index 0000000000000000000000000000000000000000..f71a6ab0ad9b8c47952c8af860425f6c9524bd46 GIT binary patch literal 4828 zcmeH~*>W326ownJ5pd#=gne`NKuj=B!WzJ`WZ6m_M@UZ0E?QFCo_I8)%(Uzn0)#Du zJ>2jJTyf7U@B~~_#S`!Z@c%R2@^Mj>N~*X_SN%R;pKkT^oL=Vm+-z~^{IR2>FDRvE zpg%V#^%Lx`cPljoJ3OdV^$w*j?@($t?Dcz!S4uuSMYm+ z8-m{#tOYj(w*!*kv7J+QK{?-pnP;uv>1-T=GL`8L9;&HSU(rrc!Kxw7AJj3x%* zI2_}72v>&M3Kbzfm-T6g#m^&~KkC{1VYjgng?+a}JkMlYJBnwObHUY<6*8`$tnl|c zp~v&8+T|?GZo&5nzF+VIf*%z85SVuXpYEV&sgqp45Ri!9LL9g!ts7s&j-M~3)tr%#6mulQO<`Q(>w`{y82Vja(#|uJXYWw zhMk}0X^3k>9ff$`k)MI)9go2B9MbvcO;w-zhz?-H~JXN~s{?>64c8=x}8 zZvfBxB*b&=`Gnvyc-C~fp|+-G(wf2LRMRbkpY%&PNK!kaJKj01*Hu-a+ci4TQOh)D zSGz_{ny776jfD^dr`Y? zY&pnBtcEdDseY-Xl}-omq{G}*iL6PIUe~%QOvkautiw!PHA$yrv|Y^V<8ga+T)cDL z>cnDBRozHjS1&H=b@e$NF4eFf zymLm|UZTT-5BgMKt8oxnKT5HeBqp+b_ZfYu&m1E$^UXNw`R-~Z2t(jGap1Iub+*^!#JBzeF*`a#^W&;mNI@Rs{Qlq zeR#80p&5kO^_i;}>NNF@`2EDiUeIk+tm)*=st%2{rhlG_ai@dz&7Q?Si0V?m0^svy zJsV#*^5>al<5o0#Ue~k{fvne-v=c8kb->(_|Nr7j%Ki9T&zqR4$|klm{i2V&37XV4 zUON~&E{!(YX1=lLmwmf)bo1Te+fy!k3pd)JYu9eweLara*~+YM9Y|;HxFccTvS9@4-OxcecM@_fjc)1jhNRnpJyJ={GE9_^L6Iw%+H6QJr?S`6}~N=BHy&0UC$CgT9BRpxZIYW5Rp9 c1WiE96PO?P_*B5YFkYu1?xEArG;{{~7Zs)O^Z)<= literal 0 HcmV?d00001 diff --git a/gamma_age_v2/solblue.utp b/gamma_age_v2/solblue.utp new file mode 100644 index 0000000000000000000000000000000000000000..b4d88084a5c64502dd0a4b55d0fad25a71d63dae GIT binary patch literal 2000 zcmZ8i*^(PI6cr?4fWVMISi-81g?$J~py1K5Yig!g?3!_s$0^yqw!6};ZX`J{FYpIE z@&P=s@9+Us@dG^Y8GHg&Mh_na0K`aU^`ly_&k<4=U^N4 zdGfgxV{z`iiNmP-I=s6#*Eg-ngZ_iS!vJ&Hq)&qO5Wx6sCu$R)C-H3hxsLPL_)bkb z1=7rUG<7nU$AB-A|9G;@{|VqLfHgP`FedqviNmO;fTk8tgEu)n!@<;^O_uNa9PlMT zt^vj;KLdQ7`17#eBz_k5+r-boewX-p*zXg+0Q*DYFTnno_=~VVCH@lZ&xyYb`%B`l z!2Sxby;__2e67Q`I{ftxzX;BHGXFP#-x9wB`#ZpP8DM=_=PSUUz}PJCT(|ei=?A8e zwqqcE>ar?irHy@KDXQEA*%QAfbESH#Q0_@l-ja9a5HtFD=>uouz0e<$pZaCqggauaSC_iwAE)X3x#g6s}b$bMNA*uC9=y5s{Y zl-b2Wg~Ks9W#-d&)^f)wNGnd!{C}E!jIK{QQy9Ick(xso?U!aAbUD|Pd?h;17R#V# z_%6lHyq>$V(7r50udElb8lUG>w3*J4>?cM9*4O@Kw9 zKJ%{N9l^Wd6u`THcL24YntvLg##7s=>C|#+IE$(QYBe?bEN~8B^3-5zFEy81OO2(r WQd6m=)KF?CHIrINjifeS0d4~$P9S^$ literal 0 HcmV?d00001 diff --git a/gamma_age_v2/soulbesh.utc b/gamma_age_v2/soulbesh.utc new file mode 100644 index 0000000000000000000000000000000000000000..22b6ed8e89a233e8c16f6d0a7a2c95de257ae501 GIT binary patch literal 5222 zcmeH~+jbmB6^0v}gaD2ch?8)pk~qOhgnUZCKmd=b-_0T4+YboZu~a|?+SiR@SfnCf=7bCC3s)(Snz@1TY_H~d|U9h1%F5I zcLje>@b?A(K=2O*9}51FU@dqeI2D`;HiD;uXM*Q~t>8O?j|As}3&EveCwL+F4Z)RQ zFE|LU1s@Au3cf3NCHTjJeE7Yep~SG z1^*%P`%#|8L16h|s1%-$4?s^t+5f@Fr%*m0+a5sq=Lhi*5{ssMsBLPVqm2tNMmrBf zzYN6{(Ae8S$@j9(Gehb8XnaGReo!8Pk~tPvN5XSOeiX_xLth?)Qpg`^sP!FJOf!Z} zxMtRJc1=n01h{+GlcN18(f%>f{&6tRC*So6=-bioC&BcU@+oNN$EU%J0p&AL`cC;Q zv||Nkd>PB9p^P2nnYL*9o&|p%%5moeKL`F|Z0Gt=IOcN=wR}D@ix&jH7@6zyQp-L1 zuo2r?@SR*6>L!%;4*3E!k9-j&&jZ^pLEnjd8RcIhUqSh9EHMX-)vBJfAg+K%|Y@5*CSdEE^d`jI@M$&OChHRRkV1M78F z=t&-5IIbs^oYKJ9!0(MtZrgI^5BJP6HXLZ1i)u1Ci3{0w52X-C* zaS*|Ug@NIh)ICAG?o~kW=S2Os^(X56xjs?9t@ERO?1!##PlvkFd9Mrl4I4(zmZ7uK zudB+GVcq(`yjwvTO$CUP3RoYpzKbit;u2g-9( z&J3JHn3Dc}FS}Fw^&}D9)HK^^Ut?4)U0v&y8}gU*~RC3;TN6u1h-}r!6$*I(zH=(DvW* zrW%;3Elpd$S#IU7acF#m0Pf=T@P)F2Cq;FAp1U^8EbUEfj$Pk0^>gig*NNx1->B{4 za2QO{HjZ>|LNM#|)OSUJ^=;n8e~9YQx&mnIiH6p`IW}-SvT6!+Gnv0um4 z?dq<~n)U4-K)qext^s#i>WYaDk3ULdKv$UNnFvX?qsx{UXE_Zfa zIcb;m8a_V`=GH6xX*JF5Y#wss{e~*)fYX?%!g;JzaB6A8T%~i|$hmQ)TDT>y$4xa1 z%1whQ6(?s)n&C0QST|J;SE#zQc|{clw-frxOxbd-CpLKHm%3Q+O}g@P1DI9VB00u@ zITA+{b3$b~He%AyFJ4fou087(J2kV2 zmTH%?_1>0uOiGvWE0wQs=;6HeuG~}yoQ_7&stpz9My+?FnwS|w=c z*ZCtvJ|Og%{fWn#0F`Re&MI@u5-xKcbTu>dGS4bkViZoWT3M54>e4G0RhrV0U*Sh% zg?I;>IZOdl?fksdjKR*}+bV-?P$6oW^M*^K=5?V<>;Rq#9xi^#o`OCAeGtlwkzd<9 zPs}v=tIsd!(@4L7AcP5c3OynHV!LW?sy=m}x2K z)6i$2&qB{ZpMx@EVy1K+%FKuv(M!+`C^Mf;=mjV<9A-AmXs$qChB9+u#==a6845EK zW+co+n1L|!V8+2r;~KOF-GcrR`VRC4^nOg*nDh~g0dyO>1HBGqe55c|!`Sd2BoCzn literal 0 HcmV?d00001 diff --git a/gamma_age_v2/soundpalcus.itp b/gamma_age_v2/soundpalcus.itp new file mode 100644 index 0000000000000000000000000000000000000000..b0df2fcb5dcee3ddc989523b0a38d1ba970a1dd7 GIT binary patch literal 728 zcmZ{i&rZT%5X6^1BA|#A1oc7{LO2-%7rbGDgeG7JG{&Qk=0ou)CLD1lblW+=Cexk% z@@03wZKHS{evMy76EmwpJLmzjyjc-xip*gCLH{yXt?WDnkfGY%e)g!M|0^S6D*d4K1fzl>iCZwkK@9tgh>-bG)| zQ-DI@q09rE_I(o0xqY5z;k<+Mo^bYX-WN{hyd`t;JFVWMPoy-q@n-WePhTyXWu9&s zZDS>zk@I+O-ktm9ZdktpRiP`0d*qI9Ant_!Mgt0)P_rIn7TP45oqC$4QIDvma40{QIhPO?^a?Un6K2*2?D z2EPQJv3JuKRl@3YV|zT$%roQhAM*wMc{&>Zlx5jRkW0u{kPqGWFD!oeEX#iRBFkQ3 zt-@EvzZmir-F|$G9|MTkks*7s_6bDRUqHTrd<~Jc@4DZg;`<{+2B6{)ozEe^rD-Ox zz1=VITh540kp<*k)39>N*qRpD?NRmy zw~}Y{3@B7PSc3sYzLqj=RB*N;sbAV?6_cGziKW9MTD2w?o8X)RXQo56&-B>5*P$=* zwd< zmq~A1hla9pAbWod{)^LZ;Pj2bNnFW7?chV4rNW7h>`{x>NzjEfJi&oB47`0{!02@; zRR6Du*2j8C`oqEUT-UfLUDLx{T7~ctWPLc`s5-&b5=ER!-O;un=&|M@ zc;++k81F>unZO4w7HxGX34vqc-yRJIA)1`Ca~g#u6kMeavX6W%xd4Pm8SMKLZW9hz zx05nO|3Wdv^aifDu`bY3<#&BAcz6-fg-!Gc(V;&sl~9IEPtNE9*HUuc-LfU4FVN{R vrGA_|lSkpn#vZ$WQjq`Cc-@)*fG{{kZKx;$p`j?4Qk@3y?x@=pH;WLtX+ literal 0 HcmV?d00001 diff --git a/gamma_age_v2/spiderbot.utc b/gamma_age_v2/spiderbot.utc new file mode 100644 index 0000000000000000000000000000000000000000..ab6bbc14ceaa9dfa2dc5aac40fe5edd303dfb5e5 GIT binary patch literal 4716 zcmeH~*>W326owm;00Czq3xq8=WFZif1Uo?3ElXaMIF68%m|ba&TK2@F8D*wr$Lvdh zu-@?qJOW&C%@a_?H5a@9F982P(=DI8K&YZ}s($s?%be*x-P1n4&@7K$oH#yyS}AoF z`gN01KcMW~t<)^a-?uAOxlO5kJC)jla_nBECQ<$aL$@mP2gVZ3xm5&D3!V{7-+ug@ z;Huy=f;l%oeqQi7!3%=V3$6)%O>kXsLvT~@1;G~uFA9EL@Ed~P6#SOpw*|i=_+7y* z!IuPU!EM2T;ErG;xGQ)`@Uq}g@MXa(f+N8_!Li^(a9{8h!KvU(uoXNIyefE2@KwR< zg5MMTzTgi8e<=7P!5<6$MDVAAKNI}9;A?`v5d5X!uLNHg{I%e39N&&|1c#p`f4|2s zzlD2P6~;DvwrT|8SkIfl$6ecIlz-ldAJ~?n$jdt%^Er0^g72Pw?t-Qu`q~Qd8{>Of z=b5JYdGJ|2!}rm)L4Hnfr+Du9+z#jx#JS*F$&HMwB{%xn1>MevVY`bW|J@^aFW3!H z_lfrVMf*O{{s8za#CJUiU3ZQj0@D}mVTkLbJpysQwEd9hN5Ov0qhPL=u{;2|(5lD4 zH1-{YxK8pR!G{GO0n<3<@tg`i>X^k7(73BViLwK6e~#sClarjoSkA@IQz$r3iu=#; z-1I^^141|N0&3V6)%tKgH4C&8z|v=YSlbDwx-Pq_9n*xSu!|6See z_x@Mwz4hLWoQSdbzwbNmoC?IdeiJn9N`CJ%&;-80rs?$~ZB5-|b<6v=cT75bT-BCMoLKf0R!dTw>d;ns;lU~<3(~M} z!z9k@O}&(t{->P8t0v8~A5hI|a@*954%k)YI%$tRhgDw?XXHEBBNTQ`OIB=MLJ zSV(Fn?NyAn%Xxh&>8wwQH8-qIE#_3y!HQloh)y4FmWCMUjb@3?_*%sdBy4xje{* zi$rt-lOLzL#wgXuPuCpIsBI(Yu6{mVpg*j#=x_8*6qV?tsF$oo{0+`%QLpG8HiJjj z)x!*7X``j6Psg1)56VWrj*_K;@UPd3eJRG{YqPmK?{9b>ivA0kNh_us#-^yBkEfy} zpHO230i4I{F&Eklo)p#L_w3uSvY^xsBb@rYsT}Dn^PPBp`pO{ex2o3kipH9bjJ0O? zJ(ZJQ5Brd|lv%!XU$cEf@UL9|BOt-b{cYV8S=og2>_h;Po02kU0 z*RS2S`+5?0@{RWopk8deZ@^_2B)zt_+nk3a4scHr&# zDSN+3+;;no1?`O2TA^(PDXuQlgMTiPQDZL7dwnys1!6wK9E%ZRWSDF5t{;K;H()!& zJdROiKEDgv4ef#ULd?^dpEECKKF&Ox`8V@!=G)A(nO~1W2O#Fr2cbjIVdx0N{P-xu ze3*IgF=z~8zIz;Ee#^X;`Rq6}0iA-FuQE?%e#*R*`6%;H=AXWvFh;ev#EfZa%EtzfTq?DxUu*@qD4td9U=v_Ao{C+~nWdHxxQd#}T8FA4e! z5M={~3C%ve zCoQ_OS<;`@4flxhyEI~lx^^T0WajTY^LM>JtjkJjmrHY$bJO5ohtF5(bnLFHxEkaJ#|7f7ev`m6*&< z$3Jj*x9~^}Qsz(_BXuurlX`t*bstdICJB5Rvq-OYOB&=B-^@IK{w>G&CRollz|#1( f$Z>L;{3Tz>Ve*Xp;zH!^8bGd+qvR$z$vMP-{y~SI literal 0 HcmV?d00001 diff --git a/gamma_age_v2/splint_lg.uti b/gamma_age_v2/splint_lg.uti new file mode 100644 index 0000000000000000000000000000000000000000..7c9dbbacb4e1c0f127064da65b6e6b2e84f9ed1a GIT binary patch literal 1746 zcmZ8h%We}f6gAM6@_v=~D?nRHDTS5|3l_Agsz#bt(IoAHP30zTGO8yY%{WNqTlfGL zdz{-W=Yb}$2K+!k|7%)^ukbT7Li~pR z3qK404+bZe`GEZdE&^8=IKxtL4!8+i1-SoZ$1lKtaC{2>Gr%0z>;N>BDvf#W{bv-G z^+~zkC4e<(Tuv6!JfU_R$Dd0Kl_@18!yaw*=1qk1t_7d>5UV;1Zd2oL& z3*hXPwm5R-n%9o=%$I;K0Qnn$-;B0Aa^?72$LUsp^0L6cZY*c0HkG&R->)T;g*%1lNJiPNlk6e%-`sC&ukIa=92m_FW85- zjXX7ZQ|9(C-Zt235=WIdZuOHvn6Jj|e$wkt*2k5&sr0v`nB?0gFHErCrqXzmNq$dt zPQp0eMlQ%ll{nr^Ix3s2k18?xH$xrdD{;Id2i?$jDkT2sP-^@*>a+|0kN_Z1oeCn>3Xbq3-Y39E^_Q!o`%OmYa z7#~PI^f5lIOevzyM)70@?%$xJHnL1fzK&>0t*ljzEjPbz(iFGXMbNq;)5*Xd>K^~( z#r27zP?=g~vbHM|y;6&Kv-v-HoenuQbG#KrsqB%2e>9bO3YZ3{c2p#;<|_W3R8}en z6@v;&MWJF+DcJ|rX%3(gQUR$ZR6Hsj6^_bAMWd2Y!Khp{fJ(*pqB6|`3jh^}%0qRa VDl7q194ZYJhRQ-kp^~tF;y(fC4xRu2 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/splint_med.uti b/gamma_age_v2/splint_med.uti new file mode 100644 index 0000000000000000000000000000000000000000..8be3eb1f02cb6e4a99ebac951f60ba882ae28568 GIT binary patch literal 2005 zcmb_d*=`dt6g5lPcgnt{r7fkDLRJb)@U<2Ivu;?azQRKAE00SW$s z4?%)+Cga3JJRz=h#^=tpudh9xERH?vW5;FVF&B0`K<-F^g936XFBf?`VIb z{kmU>6KH?I(1NIw^Y`9S2mgLIUsdwwCbkHU)QZ{ zZr3qk(W$1*AN?1?@Q)P!+#FKwq#5gQwvfgqt;y7`2g?Sj`hIo559+O`?Z*fGMl0HC z^~VPTeog6*QPz()Oqv-l-=fl3Nk6`-n%lk~EF~2 zDyv3335CB?94}GtY}lQ|eSPG|d1=TE?cUH|le*)4d|Dav5-6z{-W=YbZm2K+!k|7%)^ukbT7Li~pR z3qK404+bZe`GEZdE&^8=IKxtL4!8+i1-SoZ$1lKtaC{2>Gr%0z>;N>BDvf#W{bv-G z^+~zkC4e<(Tuv6!JfU_R$Dd0Kl_@18!yaw*=1qk1t_7d>5UV;1Zd2oL& z3*hXPwm5R-n%9o=%$I;K0Qnn$-;%aGa^?72$LUsp^0L6c)T;n>Q~NsNMSQcIgN^EbNPGh2kUxuibK3-;k{ zBTr43lr?OsWjeXlHXIE zlQ539kqh$8N*rw_9hFViH!CsvH$xrdD{-_V2imPgu; zFg}oa=wp0ZnNmcZjpE4++`mCbZDg5}d>zq}T3M?aTW)^cq$zH%i=cHyrjvm^EK>f- zi|Z3bp)$o~vbHM|y;6%)sWty6uhSu?W{$U_D3v{u@Q>!-JOxYxR68mXS92BrPAV&v zgNi`~rJ_(Vsg&%4>NE#X38{co6Dl5+jtWO*qoPsCs9;pC8bGDudr_I@fdzmHMCGA6 WP!*N{Dh`!~3PWX~qEJcLKk*+Qq7K9W literal 0 HcmV?d00001 diff --git a/gamma_age_v2/splint_st.uti b/gamma_age_v2/splint_st.uti new file mode 100644 index 0000000000000000000000000000000000000000..8cab73a45cb60eab5a0552b4a50d4a5ab7a3adfb GIT binary patch literal 1874 zcmbVN+invv5H-+pzfx7)KzM%IB;ad31^44q z;QqNxgR@uK%)k|Eo;l8EJ_~#T$e#n=<{aVp3qJ@y4-^*%{$((}0Nw%qwI|1D|GOvG zz5;kx_zrm2wt<#PQZ22DR352)Ay#FsYE~sk6;?NGspD^|vn3OSku{aKvpBV}=@og# zwT|l9ct2KXz9kO^3*B$EE3*TY567w|x5EIWX^mEct%~8MmF>eO3c5)RZH~=f>2!{5 z5!U9CYCp@_hqsk1FP5zs7l)Z<#DN z!G5bs<0NH%OSKQfI9f+8$k#{WXfmWZ8M;o%&3HKj~BeRExURTm~ zRkm0)+GKc$E?)9+74M@v%;I@79%hBuR95OBU&KMak(pFwHdc8(=1p+%k-J`^+26BA zsek*}ANQpt_p~2jyd!nr$9T0ep-4L$#N`a!zg}Cdq^XiTj%Y}&tW~u&H@|9<1h>~k z(9b;8anJ7Nb`oPVOQlLt?V3fhvMFOdU%}PwTYgXee<0-4;o(*kx}rxCe#un(F<=~^ zf>PzUnydJAQmv^*R3WM|Rf;N1^<^Jaya|BnN>!yoQAMeqR86WSRg&sRRiqkL0IDC) wMYWp(rU9xN)$ASc9+(BFVpJNc7S)O>MRlTrP&s%QJQ}eKyaC<A*#H0l literal 0 HcmV?d00001 diff --git a/gamma_age_v2/squeeker.utc b/gamma_age_v2/squeeker.utc new file mode 100644 index 0000000000000000000000000000000000000000..47a1e36e64344996744210a33f294ab6140b3c59 GIT binary patch literal 4839 zcmeH~+jbO16oyLyMGOZ8&nHe1kccrsL_p1CCWnC##+iYrsAJ7cC27*rJ#^P3#3LR- z@p#P}sE^<)_ypc~=@WS2jsAak)nv0=i{*uDdBa}opZ(RLtE+cab?-S_FYY`ydT8XR zQfe0ZZJkoz!~e8NscHD3txBE0O{pu}l-dD*{T`)e;QxZ5Srz#MqepdSCBYMdCk0Ol z=6(FNWx*!}pAtMH__Sco-;Z-fa7FMdf~$gSg6o3M3O*-zPVlROUlaVg;PZmt5d5a# zw*)r?zb#k`ZVGM*ZVNVo=LIhaUKAV%z94u>a45JVI1(HS?h3vrI1!u*wt{Lv75tvy_XU3-_(Q>$1%D*?W5J&Y{#5X1fIzV(cn?;PI^FO7Zgga#mvahKzD@Pn>yJ^T+4ZA0!de}`jU$1#p$ zFpjekdI8!5al8qL_hp&qjppaUYk5sJXZXz!jeWO3JdK_pNpx}qVJkPw>!_ZYX@FQT(iS{VOxzZkk{Ifj{W*lix zK)%mTFylz=f*3p6?%ZY9>;d!Hc>P|%gMyy~)7WQUMmg_yOm{%=Q;xYl2QwZU;~a)u zJ>Am~=T9Ai_|76f11&iohUZyg{j<?PrLHy=0?#Ce-`2@7r)xQWHa{Ll_*zwEY!;Z(mC&07<#Q1ZMjYEU3 zz6kbqGiLl~H|vx4`1gIdmudgynE8me#=I4W|9=l~f0v+LIBPsV6A<66>!3-9?^>Ss zDd+(Dcs?fh6u53W-B4RoHEGq%<6EIy2AA}0GDuQ8t2@4OM&D3Wg>KjAL`N;tsIPX7 znle$_FbQ#1Su{~>*^*l&PHdtBTW;s&l1W=h(6vDvWfgV3;Ckk+7)Q${Nwx1#PAl?A zt4ZBrQ<<@#m4Z|!9o-Dw4Qst-A|I(_0?T~H+guPWq>Wj_+=o`zK`4r<7Wbld&DhBx zAF&d~Or`o(PRpGRo=Jy!RXMUINqSxDrZ5x79~B93wIF%{c1$?rJ3nLs>D8*vax#9JeQy z0~byFFVZXXy%4jEZP3DapfEJig25yaCRMB!+826h{~;0GmdUnLRil@xWxHz{d(<`& zbXPtT&2l_EW!_%vnlLPIki1;57V$UOqj|ZcJ6H^ESyv8Hgr$j^ygU)LtK2AS?K+GX zdSZONlCMkNAE(V`!};<0`yp>Xo0_C#=7Y%O7S=!-05I_vwQIeQC;d60KC5} zXXA^C{C;NHxE0Or*EMZKAnUa;z1TBm$s|k|`3D&9q`U#YHP^;uRkpDM6EN0!_I+8- zY}=)gM%&Cc7X8|9aTVQsi}?1GYv00aZL4e7Zt;CNj@sGs`wLLcm)}?5mDh?pO>H;3 z5#p$Y*Vce5rClt(Z%VS2_fx@8TzOyYVc9WdKW-c~-Kyh(wnZzAz&2WmS?Q+T;gKW% zsMsod439Dc%+hpzD)?Dg4{d<>mxJjVBgnrNOxyT*7=ZZKVGG2RkWpv)%)bQNp&bxY zf2RCQ^|@k9?fKbZD$f+2sXJ44rs_MPUC?f5540B=gqU*ggZ4vAt(j6EgoYrd&W9kT z%1n`&8Z#vxg$_eZeVOty)#U>+wPi}nRF)|$Q&*;}OjXCA0yGYN1$_-oL)>AvVv?sY dCB$L^V#>f&!N;cz_QrUfgt&)JK{L>4=x=iY_5c6? literal 0 HcmV?d00001 diff --git a/gamma_age_v2/sreelon.utc b/gamma_age_v2/sreelon.utc new file mode 100644 index 0000000000000000000000000000000000000000..1bd940837325e0a65551361005a3ba2347bcdad1 GIT binary patch literal 5898 zcmeI0S$Eq+6vw9!b|{6iuia=%fl|@}WshTLaqBq7c9XK2i9Ja~WXZ^K)36pOd)fDW z-}fCp0q_ZU;|cf%Jn;bkzcf;=%b^DjyuqCF&;0Jy=xTH|8u?~RHM?YN{o3A*N~x=% zmwJ@?3Vq)pN{ymlceqj?EKur)#Y#Pg{`w=8dIYighu~WU-zNBW!8--tA^1+gcL}~*@I8X>6?~s%u8&=U?-%@l z;0FaiB=}*=J?Ix9*xu;LCkS3Gc!S_R!3Duv1vf13g_tccd$#S?Pu?k*`v>Qs`jq+{ z9ZaQmDD_3ci14N5gV4*yvHL*>L%h!ZmKkrk_3_?bjDjk)515Vpz7fUeF~&Ctz&MO? zE_5Jt0K|QV*QL$(pDmdOugP<4c!g~;Y8<-|;vPXh6yp0IUHRjNoG}^IFG2ciX_ngE?=u6Clo&?L;W?p9D_kaWXiW>k`Y% z;ZlgXV_OC>?@8`gSZ1H_Dd5wsemO#GeKJ? z1M=+>KNV>k)O8-p=d35^v~|$b6Ry2rr85!8Tgn+H{f#H)SwMq)BDVnZ~u9c6yV@Zrw!7sjM+dRif23 zj5QigAnDc~^@@y#yNr)lTE=xV3=-R!Fhu?h)@W?!bQ2GQOV-*>8)=z3WEdZ)uw#XC@ub#P+Dy@A}b%DlZj?=2;L(_~0m9%TZ(4_BI)^9fP zyrXOL53)Ry8UW5m+EHeOBeDlwJ!Mx!WM{Fdn4n;`88@1r7$474@=T z+GX0)7Tr(FG?4Mgw_iIj#`QhcAItTE^qa+RU?o1Z2*`gAVRuX$eV^v%hx33qB^|fW zo2}J*YYj80J8pPZx7pimPIQ}Rcbn&Qn;W~$_1)%%Zu7iuQ+J!^cAJfEGfEz-t*yPa zN@*aQ&lGCe(UJa4wU)`(D%oFT65CXb0%0Ak1y2v2Zn1SnW21^zxCq? zg+i^IDdt8;7U2{ptknZE+roKs;T{|g7T~&dELfr^#E&t*l0DEq(7q7U&o3$~UVaVv zg*zDH0y&=C+TQdXi|0jxY(akA3nJ+rc8MaeHLE663#QfL{p99jXL z0DQLmMDgWV|s}V641Yak0{3g~iH>6%{Kf zR#1IV2I_~n13v;i3Oxor4m|-q2|Wcp4Lt)r3q1!t54`}r2)zWo47~!q3cUus4!r@r z3B3iq4ZQ=s3%v)u4}AcA2z>;741EH93Vj9*Lkpn2p#PsuT#XDM7lY6c#Qbob@>k#{ vXfsrRMxY|Zwm&oqm7q(ZGE{-8&=zP6Vvffl=6EY~8Faa|uRwn#bQSbFD_BiE literal 0 HcmV?d00001 diff --git a/gamma_age_v2/sreelonandroi001.utc b/gamma_age_v2/sreelonandroi001.utc new file mode 100644 index 0000000000000000000000000000000000000000..a6a557428672c398ea15502c8e874acb13f7eabb GIT binary patch literal 5498 zcmd^@S$7mg6vvCrja5KJRAk?U5O708CNl{c2+1&$5EeDm%v6#lJ>5fh4*^$1RNVJ{ z!(ERregxn3Mg0bT0-t#E=>OkcHC!Hjki*e?&VTB6tE#K3Z{M!&nxVn`(gRyJb>5?t zdJsA{U8(O-CbN{JW88^2HRKEeHh2LzV{?-yJaToF7dcu4R8!NYDpyoQ9ITNbpL*9fEgQo{IjxV3ul^QeUBftJG<%AC6J; zO`E5xZ!OP6DUHWn2VogX$HOv|GUv6;)^UDI_ye1f6=`{uWzOSj=mLH?&NWak#Br~M z_?+{+^!aSi+&p+Jk4fi`ayCR`-#O5j<+&&)AWmZ*L?d&)G>(I%Q!S6#m z2EjK9zDe*R!8e0>9*Se1vjg7(cE{Wb=5^9;gE)8E63FrGV0X<+!Hh3sxeQ|LXv?!A zZCe5EgxGJT;8lWGgK6xuCZ&wmT4u2h;yASR5SjO91B6KCIERfXXFqqK;5?~K5Z4#- zX6Ur#4wTG$)^CB%Tjtn5Sl){AN6XBkUo78=@^{O3q5Q-0-6;RG%y;BWBm~F57g}t2 zJ9r(Kxo{suBkzFt%#iPg`Yi7R^IgjN2cU7wyTDB_EeA3FyiZ-wc3YnZJG

T%%p? z^JZtg^3Us@wf}N_u7qp+x8}gLx&Zx#g~&1AC60d*_1_ErS@5rdxu&~gxfVNKhG&`F z4fR8`9>_l8YB!kA{gu{-YjQ8dbzmA)gg8&GhkKx%xB$lkf{zM54jwd(rmquIHgVaE zDpl4sgTvd_<3(}OuN$tiPhaAyT(fC(q=T9n89dcAYPSjMCTbt9O5-L76Sibl3Zo>_ zUQ(=Qe!;}G$ZIBE7^D@0dd&9BihLNHFj1^shhkikkF@I1H8vHQE3|?a>!_itzCB^3 zRgL5&6^xhgyVTjR7mURt{f6JLv_b9p!c~>971S#x>G84=OMaMSJ+t3pTx>LOP1?79 zkeDcHH4{69zA$u{cIXdFCTbLnPR3KeE3BXD64zWwbd+FDC0(1)V@4HBO`jU{+VQU> zBDff#VEDy-(GahT4yYJhGF>(7#h0|_$Mq%tu=Xd)$Ol*1uaj1!{hSMWua}fUFG$=d z`BoH}AZb_c(Te>>6== z_wkn394RKIkyVzoZ<55cpQn7-XyE>)=i(2dI?;9jJiqkQNQ#Qo@A37R&4AR;V-Yb? zpE+UtbUvbgHb1sxmFfJNrjCfE74zcA7(WbjP>({dqhkv{n)wF^*0R+2Ay>)zEX}2z z>f8&+F6@U_L;HV|IbeH;J%T+_n|HEvq;5t>#$5ufnOr1(PFQGE$4oWHWAdbZ+@46&{iVQ({~gY`zis=9v!7fcSRiS282ZuLAcrng!;L zjZx;!;oablY(BIAS_tv&%$*i@OWav;N5!2KcTjv=bH~J;5^wfWXc@E|S^=$uRza(w zHPBjU9kd?W0BwZ0W7!04hB_ebNVpT(3T=b9W2oP60{$pF&E2F1sa5gpaT$NJPa{k4?>5a!_X1v EZ=feMfB*mh literal 0 HcmV?d00001 diff --git a/gamma_age_v2/sreelonandroid.utc b/gamma_age_v2/sreelonandroid.utc new file mode 100644 index 0000000000000000000000000000000000000000..f9f3037e2bc808cd6cfc562cd845c4886178dc5b GIT binary patch literal 6875 zcmeI0d6XPQ9e^8>Kth%UA>JAn2qZ!bn4m^Q&F;(|6E>S+XOra!Y-(m|cRSnDJ@oV> zyNaT6hzEj-H{z`*iWlC3@jy{g@IdiK1w~Pw|Kof5{kp4XfAAjrHc$WX@$!4`oBFD{ zx~96irh2M(j1_uzZrZSMv*&pc1j{_{LDFlE_PjGmi;pKg#PhCtg6CaysOPPGvgh4N z{@(>|3<##K;SNT7c|4aFD*0229S1IpNzFzrecexW;n$wWpyB*fQdyg%{4}`Ix%A~a=hF6#&Nq?X;{0^dJDfj< z^d9HWC4JEO^GF|ZF8>2oFd^i-o)5A{h`#{V;xZRr2omCFfUF(jFM=)3UyK)>zXad! zd<%XXF3}4z{&H{nV6!VP;CU?M`EOvMI*VyX*O9p_@xN>{Yw`c5&HT6U$ZLGG@&oPv zqqQURUE-17o0UGc%MbM0548Sb$57^X5pG~1%3apt+-3dE{Q*_ye&shi@2BoMsZ7W- z$NhZ0!L%f6=U|;|F#g-|xo;8Ue6Y^K^Kdca^Uxy3`Cy%e$9bXgk#%hdyIo&Hy+b~MxNEYQNPGaLHrFxbx+Ey+0n~5KVX~CG8ay7H05QTef+%kEEQmd>V zY2JXT$)S?0vl2zWW#WdZ2JQuWGiJ(qMO!m-V}57+D~TFhS}0oCkp<}Y{#XI*iKfXu$@=;_W41e3nm#m zoga*%djDSEji%=fn|+h*fL=z4U!y%N2y8fI=_JGC6-ImOd)lqeMKZcIn@*=uLoKh8 z&aNTmXi{a+U4DBwBJFXN+3`x#20^bhlI44ogz>k`(JWsy4Q_@^S(o=)3`>=gEZ-m2 zM`fbSA2&fX)mH7Bec64<>ho($(&qB^I`bhrzN2O1qMh_Zo8`BMeL<9Vs4~L<4)gW& zMPh(6Rkrhc&da#6T5r`4nDuEsVtt*b~g{Hf}^Rqe*zDeerZk;c)p8z<^^ za$-84KHaXMna#5NcuS^Fjf*-6xLYz zx?HZ+Wd7ub;&k%lU7;zNJbAXw%%RJ9yHQwm6Nd}xp4~LzClhhIIyddt)1SDEn>>Z( z@vsz@fjll`t0;pcuQl>VMi(xxEo8uCoMm9;b-*!jEUW@~?I3?~VnkXQ}dp$uoiC{$n!cEC;; shqK`vI2X=?U2r~J028nq3{;^8b+9lAQ!oua?132wK<-_`r6K8m05Cj|mjD0& literal 0 HcmV?d00001 diff --git a/gamma_age_v2/sreeloncyborg.utc b/gamma_age_v2/sreeloncyborg.utc new file mode 100644 index 0000000000000000000000000000000000000000..086c2f65fe3e19b01f5a35eb3c097eec5b4ff464 GIT binary patch literal 6375 zcmeI0*_Rtf6~-%@1HoHXLPCh0I3#3ohOrG<2(d<*&5_4Kl4FuMQA$#c)SgzC(%qWz zKp=($2u>jE1j0^O!xHu-VP7A3;DI;b@CWe1BX971-BqpYIh-NqVBUPs`BcAKReig< z>UK$`gU#}`J9q7zyh$l_5A@)fO8pMyA2%u0M){BPm3rzlr5?LbslTA?y;P}VDE|dR zv$~rfFqWv!jBz|47JRSZ`vkWH-!E7T=2(2pj^M6fBY078PjFvwAoz&jCBdQKf#686 z6+9IDfZ$kgA~+R161*&UMetFnoffz{Bglg z3I2rOPYV8&;7<$wjNs2YX5N2J@aG-lRaJd7o`I5_3g$cN>mL{Vq~NCoKP&io!M}HW zI^zEc%o2tAg)8a*((zW5zjCbhD)np6$CUbwXGHj|fQUn%%%!Pf|W71-Og9#CEf`Iy%WzCrL#!8ZzK zUifQYEqD^_=X96g-C(~4d%%AEUL)#X3uewSzxch#`KH~R7g^ga;Jpz0-75HXVD9y- zzYU_1U!PIVw>xIBS8&NOb9O4@i4w<9cJ(YO5c8FqhK@L%LCJle^|R1%$8#vTAF+NO zddBfSl+QW71LYqaS5f}e@qUzlcf5e|pNE%P^YGDlDff{EzMK0MlXT)> zmRdF_0Znm8T}Q#XXF zwH~t$3$|wBLB;5_pZQa^yE-MFxsmEP#h7Zkv!r`QRZK^(HiKgROEKvK9n4i)#W=Dx_sIitI(Y(pEj8cUoDTJF#3z~yM} zH+7m?%in|2pM>8?MKZ&$n4|a{8}f7PfUy22_=hlu(#m};U3Ex@OLe?|zH&jQqgaO} zpX75vTC+iv`Y7d59GfUDs`u-o1v5r$7TY!&`R-~Z2t!%1h+LKathL?g<-ldHQdPaO zI0`XJn+6@k1BIc9dIp0;TB>rr)IBmviibotV;T7h)-`&mM)o#i>Tw$+x$_T13yg=S z%-b776NV)Q$^BBABHsE;rt-Mw6sx^`_oak&KGmsu0z`!iTHXYUzfZ; zcDFPO=i?RcU*3K&F>%E#29e4A1JP7yvjHJ|bR&7+`&~d+`Ia%Gate-oJ1F*-VOx%%2H$ z&t*X7m$7M^xN4S7n2ksD&&S7>yfPc#&~!0lS;eL#HYT)DXSHqP9#4h*Cl6m7nQg{r zBk!=Sob}-ONcLbio=;du=5JwlMScM*GuwJ}veh+*PF8Hp(FbX(6PuM`dtzb_gL*$1PE1U0 zjaFPmfb1DX+4lz*fUaAARghbg|36Hhi-s& zLN`Ja5Vu@zv%8?(5RceATJuPK6T~C*EzqqHkIJ_}JR08)?S)Fv6vXYa0!>3a+Rj3A z5Rb6?pgW){v>#f44nRDL@(5ao8c-AB5tBzt9w~X0K|h9`gPw#r^I Z-mfn(%k>ws&YV}S^#i_@% literal 0 HcmV?d00001 diff --git a/gamma_age_v2/sreeloncyborgh.uti b/gamma_age_v2/sreeloncyborgh.uti new file mode 100644 index 0000000000000000000000000000000000000000..ff383ad123a6f57b3c5ecd253731485b85328c64 GIT binary patch literal 1770 zcmZ8h%Wl*#6m_BHO?j0!l%cdxUWFDRv0&4tsyfoNiZY>F zg!l#j2mTEFKNy^N#t-Z}a2hyIVhlsY6mS{10I>cg6Q6{CZ{lhAZQvZhF(E+1RJAeB z+DB)Hob%IIk4>C|#_=@vch|wWZJ&$mU~CrtuZg)X8*{ziO#2llzKYn^x#q-ki0xXh zBmN4|ZUAEkr0pIZTq6r&OFyddknBX_vQ&eTRAp2od6j66 z9`a^a^{Zq*QJ5%{y}I3gyjT`JRaz=MT~;H4pk3)y4NKL{?Mg-mZA@r7`KdnEf4$p1 zR>GZ|L%cyzavj#zi%b{3EUJ&emPV;DZ%y!^9VdM^Kgq*5>BZym!36hJ`Y9>L`A`?7 zcIs`Y6n`?#@2cp)<-rzmPQEq4gN-Co`FMP5f@A%9kUIGZ9&F2g*R4On1Kq)E#!ML9axT|l^I3U*pQEV;QsX^wVvln@^^$UQ&m-}xoP@)I?Hf-4HIIv zER;%hKRWE_q8Ib&{fwqY&z{e=J?zo&>Mo6KneI1yz9GIXtJ#cyzr_bejWUCVV>qN9 zQK#{-FP-W&4a@*kJ1PS!QGxktskl^HD(oyk)u576L8+Wn%sGGx$yupBR6;JB%16bc t(ox~4Y*e%cKm}U>s91}@5>K%_0Knx)UU$+R2c#F68DDB?f(5k7(c zf^!l(O^v-?3Qbpf1%FTlTRz5H`gsT0`S>q`BC{0(^p@*e=9 z9`OTw2QP!y!H5kgNTcq6H$di(I?}55!H<+G0k47F^A#j6^+Iu-xw)5MeS-O}f~-Ms zKf(C%IaoW!++;w&Ey#yKzYX~+=$j**HKYITNWTaDF-UBId zvE0iT%IJRry?a#1Z7|{~lp+|vJ#%7g9AwdpVHyK#rCAq+3b7R9NaTv$;0q zPbt3WO5mAFo4c~{rLDVl+G!!RFON$>p@rrjKSQ$A?nK(bk=WJ`29(TOBYmpQoq3)A z$WSl@&5b=5zgHCJQjBYJOR{n;&k?b23o&!;{7&zgiS|ozJBc;c!4>S?XeX$*99EH! z_OPndzIbg$>zzGXpF7)#^QE-2k~aadcgU zv-1YMeHMZDt#jFH8qvHC){S^C>68YL*s8+c=?#20TPI>{T{v6IQgrbW&e!SM&`505 ztdE&Y88rEfsPWj2b+&tm?t&Q$R|mEx+mz$F4sL)POO7LRaQxVc95;>`$BSddQD9z< e4^P8!*#bEpY+<%8$Ae=L$ARt7wr9JuF8Lpzg`jZ& literal 0 HcmV?d00001 diff --git a/gamma_age_v2/sreelonnegaswor.uti b/gamma_age_v2/sreelonnegaswor.uti new file mode 100644 index 0000000000000000000000000000000000000000..5be0c10d7f0c77f366473424c974724643d4d645 GIT binary patch literal 1310 zcmbW1+fEcg5QbY3#S<#x`M@HI8WR&CCf=?~Vm1M?VMgwoonjg6IXKfBgHPat7=29r z|30jPSH?=d>8k4Ps@hJ~eoTkG{ms`K@03#Kz!7)}(z8lEpbySNtjActV_lqA>N?h6 z5G-n$AIJz?aGFx4qkjwf<*>&EA=DXg6RT`C`miH)AqRjLEm5{AMTB0m3HC-2__Yk+m! z2O6YO)J9v`lXg$gJnwZYLn{TgoNQNPZSt>@?dn3{*^+kLVVxFc&;X zswe(p_zsSAGm&=Y8&s{G8Bh{i8S$Z6I1ztB;=;yW(F;!X0M7Lk6W)(X>L7WZt zdg71tcEg#B!xsMpx;mRS9G;zJAXhIHb|0slT|5ss&75Ke;ncE|*zKH7P9>+26UV@; yw_2@MYkgiYkZoT$Yx>Lslv2Z>Z7rpK zK)z_AQgd0JtW>a?QYUY!)a=!jdTDc|9zppxBs8lm4@k^W9jBb|PT^g`yM^}%&kLU; zoMTD*?-f2zc%Sfo;RWIIg%^dFgbxT`Abg?lLE%RTKT`Nn!jBfdNcb_rj}=}PzF4>x zUJ+guUK4JF4+-b9PUmw(xFdXt@KNEe@VanMxG%gR{5au(@KAUpyeWLC@G;@bgpUh9 zUib;ZPZWNV@RNm~B7C{`N; z7@T_q>kkLlSf35Q1gy;4zS8V#cZ?Nv>AV7y^e zxAAI*A00LoMvUi2Y)MkV528RjQNEUxb0(|?P9t)Bel1}LLJm~#kChKH7kL-UjS%i|m_q zahkMjX1QjD$|LC-nqVs$$x=((L$0AJ?rfrM*LD%5W#6mC%P9Q;%E>ZHE3kD|{dz@5 z8`>UxuZr!j&6dIj7E#(1#49Kr3cBJ7N{dY_9}GF|*Y_%R_27mkdShiLDpvzD)~L+b zd;dR{C$-ugEQ+c>i<7_!=2sm5x~vJ-0{rg*BQH)Oqi057{42wWz$l*4J0m4NG)C!+&KZ?68fO&F=$lb@JD37?06T)IU?;%nc^AM%z$lr~@g86r zU=%zZ>;)L@GRkFi%bVE;Fp6dL%BYpmDx*|Jr;JJ&jWP;l^vS4mHpqYuZ~?dwTm&u# zmw-#bW#Dpf1-KGi1+E6yfNQ~Z;CgTaxDnh0ZU(o2TfuGMc5nx{6Wj&v2KRt_!F}L< z@BnxaJOmyFkAO$PW8iV{1b7lW1)c`afM>yT;Cb)@coDn=UIwp#SHWxGb?^pw6TAi9 z2Je7(!F%9+@B#P`d;~rQpMX!nXW(=21^5zt1-=H~fF7_KSRMS|*H0F6kOQ5d3v`2Y ze)4c8z6*1}T+j>Vfj-a=3Sd4cf)W@23&27!2#x?pf}_CEU=cV591F@|G0>m__)MyR L&!h$n7y`coC5C%U literal 0 HcmV?d00001 diff --git a/gamma_age_v2/start_merchant.dlg b/gamma_age_v2/start_merchant.dlg new file mode 100644 index 0000000000000000000000000000000000000000..1870eb40f68792d3bccdd6db8a033f3e3207cdad GIT binary patch literal 1462 zcmai!OK;Oa5XXl%6ezC(wCdVK%aTw z0?sqvn$i2AnS*-|0G@&V2f-^qIaH|9hePYrH*401u@?**)ju$C80$6oU;S^459@ym zZ2j+GGuL6@fQ@o}gb(wO&&L1XZ}rWrGZ%Zu=K2BK=BgQ+|IcN>y!>ty`%QkrUQ&TO zU5>J3nlBaOM=B1?cx4o>>cmTnRgvY$YwBpMlGM$79nHp#HJxN44-z$2QTANxuoYob z9=h$PSjwdnD|e_8GZJY;epo~*rZ{eE9b1RTYTa%v_V*G$uFT~1TW9E|4nyQGXF7Tm zdF4pt;YgLWaGFQ;Ra#cqiafPm@o)4pf2?K`t+YAtgIUD|2T literal 0 HcmV?d00001 diff --git a/gamma_age_v2/start_merchant.nss b/gamma_age_v2/start_merchant.nss new file mode 100644 index 00000000..8c8eb6bd --- /dev/null +++ b/gamma_age_v2/start_merchant.nss @@ -0,0 +1,17 @@ +//:://///////////////////////////////////////////// +//:: FileName start_merchant +//::////////////////////////////////////////////// +//::////////////////////////////////////////////// +//:: Created By: Script Wizard +//:: Created On: 3/23/2003 11:41:24 AM +//::////////////////////////////////////////////// +void main() +{ + + // Either open the store with that tag or let the user know that no store exists. + object oStore = GetNearestObjectByTag("start_merchant"); + if(GetObjectType(oStore) == OBJECT_TYPE_STORE) + OpenStore(oStore, GetPCSpeaker()); + else + ActionSpeakStringByStrRef(53090, TALKVOLUME_TALK); +} diff --git a/gamma_age_v2/starting_area.are b/gamma_age_v2/starting_area.are new file mode 100644 index 0000000000000000000000000000000000000000..ebc5e79611bf670b7ef4c4cbd266f712e1e67788 GIT binary patch literal 8130 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

6zn2~WPvzMGIS6+SgBPyUEj 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 s6cc9J%ubk|zE<)ZIw;AXB0T5x}r~m)} literal 0 HcmV?d00001 diff --git a/gamma_age_v2/startingmerchant.utm b/gamma_age_v2/startingmerchant.utm new file mode 100644 index 0000000000000000000000000000000000000000..1d1b60cb1c58d7cbccc6da5435fa1c90e4dc7106 GIT binary patch literal 9774 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 Bdc^<$ literal 0 HcmV?d00001 diff --git a/gamma_age_v2/stool.uti b/gamma_age_v2/stool.uti new file mode 100644 index 0000000000000000000000000000000000000000..d5abf3407d84c122932bfc64e27c06b751c5615b GIT binary patch literal 1227 zcmZWoOK%e~5H`^A2o2BjIv{-Gf>J>*h!Z76B2q!636(e@XLp+2*1KNWPNSgSxbm-h z}}Olaj6H2vEx7-r2oz~|P!3*AX~R_5IAg3#+g*Y5#r_NP1q(%Mq$ zQL8!QW8fDsk)pCD%ASNhIZ*1I2{MXOw5e*xCC298CH-UyL2z3_;`1uzuB=n&k5VaP zevk_qP0Xy@TI*qE{7k}GZ0JHfb6||4v(l8R!{ca@qcIw`NxRlv$lprS3nk9?=9b~y z2hP#SN0*A-H9o#yI;$tphC+8%szif}E#`9@hR$X`0!@LtSwOxe%zOnPpM`=^E zwb`NZ|7PI)Wg=TuCB`@FR$`RVb~6s@7X@yw_3-vWbk6b*@^yDFW)(he%2_^(^9$Vf z^PkuW{7ELduB7vzy@{E4ZSz?cU+C#P>O4LV+R7~GBauqaFj8L5bY5y?>V;Vj^jA06 zN2OcnC5*(BfcHynbmHcfm8MS23@aVZL)2#K>dJ$&VSiwdQF)BxIqY=PLrJ1OaK3I* zxMShHHe(L@y?$@#1urqx)1@9~xqptu_X9n$Hg}=l3kX?xn|ilcm@*YFevr7L-^*gG z-fV0nnF~@5{$IxwHT6gtQho*CjHEUxO)8VZqy;HNs*;kVCTU69kS@G?QjruS_0|FY KC{m0+iuePS)6@b0 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/stool001.utp b/gamma_age_v2/stool001.utp new file mode 100644 index 0000000000000000000000000000000000000000..cfce1942e9113bb45802b81429549b1aae12790f GIT binary patch literal 2045 zcmZWq+m0JW5N#kg3=RRpB@kc&2_am(OA;jDiH*%_EiSg!P7qJ1*RI&3w7Z9%c2<^n zg$M58{>WGG4FACIAULPpGajI%({=h*Ra0$OT^|p#8&^7)Usp=q1@wT|fZy+4>r=;+ zI)jZ%$CdgM>wiI0{)SNVY>Onx{m`^?FF+16>RI4E;2z);fO2H5;&?Q1o`E~{X`0g& zZSm}h#G#^XYD&{L?^ir67)|1 z<>j@C<0}o`Y4EKE-v(zs`7N&kKPP?}`WJw51z?VetH7_oSkEwS}~O-t_<{T5bu{o z&tNZftGWRl#D>R+1*7LL#=Yv9Q!@U|hAH2>(e|=qzy)JqZ zWRe2d%+~?Od0uM2SbOP3o<0U1xW8*QN#lHAWi(G=b3R@bbpjFpzw)_b^F>U?C?Jc- zUr~tm+D_7qy(=0ns~eb?;(Ky4w=qV>pKrF+o-X_Nh1uXde}3wko35^Ho<}jw z`J}Rj_iMZjS7E*RbAo@E!zYKOKcK_tzs{CYLv17k>GzV!u3IeNy>@UEY!sX`ENXwC znpH)v-nfB{J8x_@b}`28!?ehJkd784tS^CYPY%`Z!6R6 zV3m#LxxZ*6d%KhMjmcfvZk1Rv^48S5!$ZxG#CIlc(QeH{DBj%Kn#>Wh?fieA0WlZs z9W2~O0OsTvz(&Oe#iqyN#3IH9#KvFaJLd^or!pwrqLd*ip!pnloLdycn#Im5WkX{A;0aPm~ AJ^%m! literal 0 HcmV?d00001 diff --git a/gamma_age_v2/store_gen_start.dlg b/gamma_age_v2/store_gen_start.dlg new file mode 100644 index 0000000000000000000000000000000000000000..115e11af5c5c8e407482b3f48c37cd820a29df94 GIT binary patch literal 1577 zcmai!$!-)e5QfbTVF^osu$vH=07Hb}!UdryiO@)+2ol6D4V@X2X{Fn4wcRtB7XT!3 z;4wIG zTNCz6Dv3tR+T|n8`2MQO65n4b(ibN0*=iQ|RreN+9;n<#E;f3nzp!p{C&ZIn4U~4T zjY(S?i%Qq+*kY=bwM<2uD)&7h7Id6eo~j}C+s0(U;F;PAORM$WJkG{O%KU>d^rA^q z#IHxzOrd*qPl%_5s&nBmw;C&3XV}s`wKZnH&~@=3TriBc>|#Goc086xRj;o0JMM4I zMY)UhMlhMs!_F{DHao*?tjT~60bc}uN-3-sEoqA^GgirwDH=&4*OeSbnhvEia=jQy zYf|O<7m7exx_;{EjK3j2m7;|CO>$nJCw=(kcY(M~?AjKN_g{ zN$X6mIvYxNEcdpG1?46!oGXcOmB(FKT1i{}t)?t&nK9gc*{EIND$+$kRniwYkI9|4O8FF!9m3&0fM zgXH6w2Il~a6i@9U;2~TFSAYap!3?+tX2ErE12h01*G+I6Gy(GsIfuNdL+)snLL2Vm E58h_a_W%F@ literal 0 HcmV?d00001 diff --git a/gamma_age_v2/store_gen_start.ncs b/gamma_age_v2/store_gen_start.ncs new file mode 100644 index 0000000000000000000000000000000000000000..27d07d5cf587d4aea1a581597cffcfb9888c52a0 GIT binary patch literal 141 zcmeZs4ps;=)H85mU|{H#0}>1z3JfgFK$?+-4a8+(W#CLt&5JKC$uCM}Wng&9%*^=z z|NlQA35G02u+j!@1$mHKEiezFodGEQjsdLp14u1n6^krLjifGA9;Ehs5>V9#CTRwc Hi3$t=SuYuh literal 0 HcmV?d00001 diff --git a/gamma_age_v2/store_gen_start.nss b/gamma_age_v2/store_gen_start.nss new file mode 100644 index 00000000..6bcfe052 --- /dev/null +++ b/gamma_age_v2/store_gen_start.nss @@ -0,0 +1,17 @@ +//:://///////////////////////////////////////////// +//:: FileName store_gen_start +//::////////////////////////////////////////////// +//::////////////////////////////////////////////// +//:: Created By: Script Wizard +//:: Created On: 2/7/2004 1:38:39 AM +//::////////////////////////////////////////////// +void main() +{ + + // Either open the store with that tag or let the user know that no store exists. + object oStore = GetNearestObjectByTag("gen_store"); + if(GetObjectType(oStore) == OBJECT_TYPE_STORE) + OpenStore(oStore, GetPCSpeaker()); + else + ActionSpeakStringByStrRef(53090, TALKVOLUME_TALK); +} diff --git a/gamma_age_v2/storepalcus.itp b/gamma_age_v2/storepalcus.itp new file mode 100644 index 0000000000000000000000000000000000000000..e8b9755fa12f8e95ffb3f07c8c2062db6c68bda3 GIT binary patch literal 961 zcmZuw%TB^j5WT)1pyC_UXjPW#LS5(%5>cB7A(R+**fbSLc-eO0QWyS!f8am)KY9*y zU^Gs0I%iJj&dj~HwX0?8{_N!R!Wgpvd;!})dfb?4_!sz3_{@Yc4fr?s9Q-#7&W!O9 z8(#G-i6@rzZB6kV#j}bZfy-LXA!~Dr-zr{K{6X=@m@mPLO@eU7_pO1#+EV~?*psu) z1I(i(0KQ)aMBi2VvC=PEsIkZzDvT4_ZoTPwf%_Eo6GkBqlLse<#E*hM#0)SC%mKVKj>?aS8)8>pd05*X%kO6q+?7?2F&tCua{M(B;GRF__&r|#W literal 0 HcmV?d00001 diff --git a/gamma_age_v2/stud_leath_lg.uti b/gamma_age_v2/stud_leath_lg.uti new file mode 100644 index 0000000000000000000000000000000000000000..a9403490f45b211417c2866b80351c15dbba41d5 GIT binary patch literal 1764 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 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/stud_leath_st.uti b/gamma_age_v2/stud_leath_st.uti new file mode 100644 index 0000000000000000000000000000000000000000..be06908876213e07f60d01d93dc3f58d8214bd65 GIT binary patch literal 1892 zcmbVN*=`dt6gAMYm$mF$C@o7Vg|=)@h&EM4P^h9wsCYoC+>G0d>WQNn2T{I=58*@j z5F|KfVrSfW9T6+#>Xz5?Wbjta4a@$7LSG{)~3e`EY| z0&^Ju!Z3(={=j|$2o?6r@iWfnFbNz1E&zNU<;6M2x$Zm1Cop~lP6K>q3!q{7!Wic| z=SQwM=|>)Z=?4cyy(5cZlj1Na_20OuKKvjERb zn;Q+q??e2u5A4mOVrKLXAA`RK*#9Shw|Pf6?|Z4)*E-{~cLz4G~};h6brw1HRv zmg+{E3{7x#gESyId+2m8Xq_Sj9EhnOf2Dg&HpM&{7@zze32VvWE&&`ifnX@Y|*) zO#qVszftNWD^Sn*y;8ra+pI*LrUp@?sK?Y{YS%PCy`|1lU#Y9qM(QZ_le?#0QYWd8 zHGq0J15p2FfjNLWM}2z@yaA|1)HP}kb&Or1Zc(qODbx}k28|Lcz)Rp2z;pTY{R2(Y B8gT#s literal 0 HcmV?d00001 diff --git a/gamma_age_v2/tarnzeb.utc b/gamma_age_v2/tarnzeb.utc new file mode 100644 index 0000000000000000000000000000000000000000..4e6c55e4cb84a4d231be399e0fd125e0eec072f7 GIT binary patch literal 6245 zcmeI0Nt7f-8OLMB84&4Vkwx4f2bx70hG7PAL!9cWUJ818imIAv7+`v$s-n7*&dMwz zqk2J<5s^(rT-i~<1zd1L#0_x)Jiv{E2QR+o!Gq6}7f<^CXGYe1!}BQz-}B(ad%wpzFT-r_?5!z!W+Vy z!uJT@D|}w~Rl=_pzEAiy!mky6o$&p_7la=Wu7$URw}p3v8{u8yi^6-tL*ds8UlJY( z?+cHGC&CB9ZxC*Ur^21^q3~tlE5cWWuL-|V_=kkwB>cm|KO+2Q;Rl6(RQN5zKPLQE z;U5=%oABF(-y!@?;dgmw+<(G59#1ufhS%XpKTY_!@NL2`6+R=pDg1!&NcgJoTZP{v z{2}3w3x7)ZbHZN|{(JA(V$`4DJgS}8hj2huse?*AUpQJ`82NhjqW5EQl!c!=8jJys z_j>PKvvJ?XwR>eF{-F3nc04L?%09<2{)#^whhuP$d;>TJ{2lPRtZ&FBn%7ayKFiPe zX0^#X`(j&F8*zeuJU9ln-38Kk!@O#kJoC=UiFd4vIBC9nN)RIRg}Z0yx)^Yz9T2GvO?(p9MbX zeO&n2!q0)Tu>ZN4<$j)b9^N7Ro!)pMv{GP));Gj`VqL>%;w#<<)D*_d~IUNBaEh z_2GMP2Jjuv^{N8Culeq~9Q*-6S@@rY|4sNhEOOKI2a$HBZqmBxDpl8QgO88ORA^H- zr~5_YtUj!&N`ryXR>y6#&|DiBHErUK;g5e`YCRJtj%V^xORTdxbk$B?ub8xL!+{Hv zIBRI?Mc*?&l#_Vb*i;uCs%cHWX4I5!^Hi13Crc$vwe9Oxs%j*|xYIChD$GZ$MF~@wQK_cYejoRwqr9maJ7eu|;QSP3lcdnB z!(37`wqG&Y^|Jaz(pj4j_uO#WI?So2+e>=UsETRpwPrY4|ArHbixDbjHNUX`i}gCJ zj`u9Ntcqkg@v>RF-m5N2530*A-V^@q)9$IT+H)`IcS4Yk< ztm(Frcvy5-D`6DLhA!4l)~A!CGr1i4)l_O$uXKkIW|_FKjqzYnWa34GNn)8)xnAmA zKTJnAiPdeJES%~Zy;LKMt{KFrYhlrSeRn*^@o<;<`NqIRQHg`(^^$W~e}fp!>lNL{ zm%)(r^)SV)A?*hO9mn=|vv_S-p%+#MoK0Y@%#FqJKU= zp2-`t`3+15E0#4Jjprl2(X^QJ@c&fU&a%QBp@~z$KGR~pCC{Fb&%H zP`I4fWS9oM#M;CL+9s(9x;E(tt_K;W*kOXC8zAmYj8i?_bfDu-U{;+qeG{z(y>PJ? zSltP;ohpcU2ONBunoiJK%LX#5gDB}BYJ${^i#(Iv%+mbO_SG648vfiJ-gU?VsRaJ?85Oz4>`@ntv$n6UFj z$wY{O!lamq_(|Yoz=WHLHWO?H853&0WSKxSac08IM41V405*d&!C7D&oDI$a=YsP9 z6Iv#+=YuVP3F}sHAz)(4gp`Ts4sbDG!pTIF2__RuCY1aU!~~LwBNIj@icAo9f)bbj zp9G%*cY{xZd%$PFXTj&d=fM}i7s0*YK5##H06YjD0uO^nz?Z<6!B@be;4$!3@HOyt z@D1=dcmjMAd<%RV@S%DVd>4EVd>{M({17|^egvKdKL*c$pMal&pMjqPKBUirUxMer zufVUtZ@>iAlC_wTxlHK>3|Fa@STu|E7E$ikTB55X(IEZ7C+z-~|jSAsfdfF{@j d_JVnE6}TGg1J?kq`?Y}2*L7e&SO5pWKLJC2l=uJu literal 0 HcmV?d00001 diff --git a/gamma_age_v2/tarnzeb001.utc b/gamma_age_v2/tarnzeb001.utc new file mode 100644 index 0000000000000000000000000000000000000000..ca320b75e02fb02aca8e47a405ede78eac8eb062 GIT binary patch literal 7463 zcmeI0d6XPQ9e|sV1V}aqxdUKkZ`MDWB55mE8NsCWY^UMPybr{AxqdidqJ@SgZzUh2JX>Z__> z*Hl;6bobPjuEyG}E0!!@?Kn;dM@Bf#zsPr=={TFo(^DL0?J&o=eyZc#Mcy*aaUMR! zasExB*-6O7H?^m8zUQq5U z50n>`?^P~qEV)J{<&pBT@_ot&ln*N3ul#`WYm{HB{CUcsulxnd4=R75@)s$8vGSKF zf2s19DSx^0L&{&F{5s{=TbKDdY<)QScq&dM7oVf%EBwJ6YQ)^w?7F(BNR$G_3N?GR? z=cKKV#CKUg4ezslIv!a+13zee6n@zHX#7U&HTbR8$KbbHch))1-zm!&or8|^kHo2Y zs_Mg>e_EG5b&}&`T+%;XI?^sK=Qan}qvwjizqt;iG zKWY79@{ueK8P6J+jLTY(^(9IC5}0l4FU1#IzYMRlE^{gO7l~g7N37T5_u-NnK(2*c zr$(4->r;4=#H9~O&!ztVIkxhx|NXtX{+as!Ut@IqNq_b^KRG|oeSYM=-2^lEt%)~- z+#@8(bHn}wo%OifZ%@XYxbqWmeI-5HbwAN!pX*eNyhjcdbCZgZ z=kic7x2YI;uNf-lP8B2XqeI2qt6~VL#!y|I=Z92`)F=Jun8#F%v=0^Yl#0>wob=Pq zaicg;uCMqM?~(OeM%|gMe=_*ZC^=?uz#uG2)#UZux$K9H?|YHBUD77Cn`D=)XCRzEUfST06(2yH=-Xx!c&q)k{z z88_;S%MC$pe}g*b&d3cT#*}um{cf*uQYP!}@A9hi-x;aNrH7OmjQdGGn6E_Robeo2 z-sY8#D>wGJ$CbCa`Th>pLsHr9M&;1W*C&&{-iy+K=SN8|jpZ;jepIdAQ_eHWAo8;GhvoCe?==jPX>uAn>T`R_ zrRqsCyIB)2rw*4Wr!!t%>sg~whDo>O&3?P|$5~d|JBuctua{0L<@zXM{tauiQck%A zE`}^wTlPv!ONN?CxyjFU$U=F#-OUHRW!1ksP`NIZcz$hB++EUNbv;ztx0FnnGCiJe zD&@_7Lq3QH)Y;Djw(<3hMN%_Is$%u`oYZk<+4_u^XVu45jd{0JN*X!7H8KTNbei^- zy<+#%wP`nRqR3Q#UyVVb!1a#5TRxcO{%Qe{@#u0qv#KI4H|O16yCULpBR3TjwwZk< zACFJPSH>$XmC9Cb2YwWU`D2YxPIZ^;3aE9)((;2xU|3K=&VV|xhvEceM8TPhVz(kk? zvYjN`NV0t->ru9g&vch-`<*Hi&G0tb=-J0C^m|5?%$b zh9mGAcrCmRZh+Ur8{my_BfJT2f;Yp>@D_M0ybW%Fx5GQ&op39>3*HUyf%n4u;5K+a z9EA_S2jN3-JA4>E0w0Bs!N=hf@JYA>J_UEer{ONR8$JV{h0np~;S2CZxCg!jUxu&1 zSK(`LFMJ*DgKxn7@J)CCz6IZg@4$obUHBe+AASHogoofqa14G7KY^dZ!|*fsIs5{C z3BQ70!*AdbcoZIk-@@7LdgHvHRjDV4F8k`Pi zz$h3EH82Lo!Z;WYXTk)S2$NtkOo6jtDx3}Hz%-Z+=fZh#KGebtm>CSPd7$8dwXLz@=~*Tn_7?9vYw#QqTm=&;rT) zwBnNF+%~{QXoF4A4x1qjS3n1JLKkd-t*{NY!W3a$pZ2Hha@x*J@`Ko)Xf Zpa*)P4?Nfd{g8(O$hGq!fFkUL{{VDO0sH^} literal 0 HcmV?d00001 diff --git a/gamma_age_v2/tarnzebbark.uti b/gamma_age_v2/tarnzebbark.uti new file mode 100644 index 0000000000000000000000000000000000000000..48bfacca7b9a5ea06ae44f2890535f622e64bd66 GIT binary patch literal 1744 zcmb`H$!^p@5QZB_SVP#tzL`MS6Chy;YnYiJG17oWnIS^l+T%*FVvjAm=a8Iu3=SN5 z0FE4Z3?76xfd99nUcQgs_yEl>YjGJ>o&dRxtZB{rPN;V88pC;T}qwC*cw&p zJ;tvX$95?7ZMRY$?B5U!>L`C8ufd)|Q!1$FpDOy7ivGQ#|E%c0tbPEa6Qov1t(ssA z?6f0wl&PkzJ%aHu*blhp6`-KxLb%QvC&$MNo9Cr4-afz_6z-?czgh?LIiG`cu)=7Z zKV;!FV;%-mRzHH#<#TsNpJTwu1eD@ZF&=l57*7D+>Azy~oRne4boVvPnC{+&8I$)x z8D`8f;`U=cL?G73|9!jv5oZrD-I_QX#FRr=xH~ zg10&r%q&XY%fi%zNxxX9-3+8}!j(|)z`A<1+-QFrA9c1W`Q}_B$<3w#rDKvv%2360 z$LQW#2MMiHJ4&|r*MeY6h-z+bX$-QQbvSvG1QNA%X6}_U?JP+pGoj?Ikd;__-5yVM z2EJKOU3SDnyi->buc&A>I$s?LT(NBGeVRw0bT_r!iT0!9J9 zQ}#1%XaC~c;CA*Y=Hq)|PpW}BU_at}r46cAFa1~qw*TD^N6Wju~!8Diwcfei1>z)O3;68W&_^mtw^ML*P33v*gf#=`_ NSO6~p&-=f-_yd3BnRfsH literal 0 HcmV?d00001 diff --git a/gamma_age_v2/tarnzebvine.uti b/gamma_age_v2/tarnzebvine.uti new file mode 100644 index 0000000000000000000000000000000000000000..8975f38ed88f556903db1ca13e1fb67582b4dddf GIT binary patch literal 1104 zcmY*Z*-jfV6g4|^gHkATq2vcZYI!M-GyxF_P(-E?LcBPc8yMkPG~*z_6Cc;FsQ4E+ z$74gd(#c(X7u$23zfrr<+u8p0TPZaKTmTK=VM3`d&<4RX=zq}n(5-2u-a$V?pwu#d zAcw%5vy_Ux{nqsNSE_y(@JuX2Xd;24UUU=?L0OwM3Hf05H7X!UIW`Bmwdtp9% z^1f)ZXQ&N#8G2&L344aSWzTTN(344P0MEm7uLBVwX<@XLQ>jj6sMH@_N!v<_B_~Ju zK%3-F;uD<;A}y%~Wm4EA&)howb}X4qhKXSFk-n@8{crP1mzPpK$C`O%pB)%on;WTH zxp3F&!F3k{eNxBduk!ce_*IMX*(_;}%8L64a-7FvI=Zw!>qw`}3n^_P)ltHoc>mTP zPjyFqds~F*=!gAAx^F^+eovcG@X=bQzBeb-{!0eVpABTMC`6a_x)E!o-Kw{P{%MNa z^B#C;b(!5s|0c;~1JVCGFW-{iF2Zu-T>6b35=iXu$i{7wnTg0_8ayZD1bM@^G!4uE zd^6+?%gHfvgXMe!oJY=+?>~S|fV?Ch1GiUTlW*i1`9)swKjACz4fqc59Gn~GKLJ;P Bf?EIp literal 0 HcmV?d00001 diff --git a/gamma_age_v2/tbrath.utc b/gamma_age_v2/tbrath.utc new file mode 100644 index 0000000000000000000000000000000000000000..2df2a63287061f25485ab6e4540b1b53471f5ce6 GIT binary patch literal 5068 zcmeI0S#uOs6vrD`6hV|lMMVue3bG`uu1sdK41{EunGjSo+?lyan)GxJ-FFh=E^fH* zyH@!PeD=j>U;G9`~zc&>evc``vmt3 z9uUlN(tC@7j|o05cu4RG!NY<_1eXM#6kHZu5nL5KD)^M(F~N*mI{zmHKPC8S!Dj?N zBluatw+7CwcrWClY*xNyMoUNo)+v0ZVL7V2ZCFI&kGI(M}m#uw%{4T zvw|-Oo)i3>;O7OuAoxYWFA08G@GF8}6?{?fYl2@F{D$B+1-~WulHj)mzhjwu>s`U` z34UMj2ZBEo{E^^~1%D#=Q^B7J{#@`Eg1@wU1Im?{AWIw-&NsFm$4ADvhNaL-h;47Q zycp#sTZf~^`3s`4ZF3WzgT~*Em^D+e7oQ~1m7umz2LhnbF90eOSa>C!09|T zfH`m4y%6V0yAR^}Y4<~1C#?%&e~jfuTcU{L&62U-40T!FB6utKL0i8KC5`R3$CU66 z%Pby%x~p-YfWb!94G{NBbb!VyGWt9nZ7@Xag2m)ykTA8WX?+qGry<*K3qe6o@l~jFNO=`rauI8$4C;k;9f{PvsnwjamAzt$i z2=mGKV=jN~<}E*^<{i+O@}|q!4{7DFGVM@#xisj5t|+OVS>1n~A$i`|Iq7Q+>5c>7_|lL27Zu5PdPdtP8jsh~4MZSrwanoCG*dk4__?1R zyG&!M+k1J5nW?tOmDpDKv*Y#d@rIsIZO`n>y4_i~mURzg-Gf>8 zaMta~y8E;4k*uq-?xC#P$hz_Sw*t$UZFy0&cP~@Z_*;U%0X)l>KuaO6p21>7n4dHE z9v=&+i@wbNG4GccN6Zn0=?*e`g@b`xKKl6U(`(4mRXcM#< z+5&Bbwn5vW9T4+#=H)w~T@dr{-OwJ0c{Ufpyt)V44>5mc-h2pRp3MB1c`@^0=E2N= znfEf^JqqQZUg#_6YiJPShPfV-BtI=67JX1ZGypL^+yh1E7<3#Of=)og&d%Kx;etN-I2kHI^U>-LiYnkCdXRwhpq!l*yCk|$v9PnzS zypeV2BzHH1Vaa(lNu=#x=T*UFRTO!Z4aV81A!58!KicxX zYd!eQ4f&*Jtq*(H?fN5GD}D!u3;n7ZO}!Bv5yRSJQHkr4Vf?uyHrjlNK>w%1{z}?j zu-lp2sVXoZusV>s;r=h^)MgI8v9PIVPkj{wCDb#6m(r?-Noy5V6r4W?H9=A4vIt@&Et; literal 0 HcmV?d00001 diff --git a/gamma_age_v2/teleport_auto.nss b/gamma_age_v2/teleport_auto.nss new file mode 100644 index 00000000..e5528911 --- /dev/null +++ b/gamma_age_v2/teleport_auto.nss @@ -0,0 +1,76 @@ +// DMFI MP Starter Mod +// teleport_auto + +/*This is a simple script that can handle all of your +transitions from placeable objects. For example, ladders, +pull chains, etc.. Simply make the object usable, activate +"locked" and put the tag of the waypoint you want to jump +to in the key tag field.*/ + + + +///////////////////////////////////////////////// +// Ultimate Teleport Script 1.0 +///////////////////////////////////////////////// +// by Amurayi (mschdesign@hotmail.com) +// +// based on SirLestat's Secret Trapdoorscripts +///////////////////////////////////////////////// +/* The problem with most of the teleport scripts out there is that your companions +won't be teleported with you if you ar ebeing teleported within the same area. +This easy to configure script here is the solution for this old problem. Simply +alter the way how the teleport shall work by turning the options on and off be +setting the variables to 0 or 1 in the first ppart of this script. + +What this script can do: +- teleports player out of conversation, trigger or item +- teleports player with or without companions +- teleports player alone or the whole party (players) +*/ +void JumpAssociate(object i_oPC, int i_type, location l_iTrans) +{ + object oAssociate = GetAssociate(i_type, i_oPC); + if(GetIsObjectValid(oAssociate)) + AssignCommand(oAssociate, JumpToLocation(l_iTrans)); +} + +void main() +{ + // uncomment one of the next 3 lines depending where you use the script: + // object oPC = GetPCSpeaker(); // for conversations + // object oPC = GetEnteringObject; // for triggers + object oPC = GetLastUsedBy(); // for items/objects + + // set to 1 if you want the Associates of the player to be teleported as well, otherwise to 0: + int iTeleportAssociateToo = 1; + // Location determined by waypoint tag in lock field of object + location lTrans = GetLocation(GetObjectByTag(GetLockKeyTag(OBJECT_SELF))); + // Make the player say something on his departure (so others will now that he teleported but crashed): + string sGoodbye = "*fades out*"; + // Enter the message being send to the player when teleport starts: + string sTeleportmessage = "Your surroundings begin to fade..."; + + + // Don't start Teleport at all if activator isn't a player or DM + if(!GetIsPC(oPC)) + return; + + else + { + // Uncomment the next 2 lines if you like fancy animations (plays the summon monster 3 animation) + // effect eVis = EffectVisualEffect(VFX_FNF_SUMMON_MONSTER_3); + // ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oFM); + //AssignCommand(oPC, ActionSpeakString(sGoodbye)); + //SendMessageToPC(oPC, sTeleportmessage); + AssignCommand(oPC, DelayCommand(2.0, JumpToLocation(lTrans))); + if (iTeleportAssociateToo == 1) + { + // now send the players companions over as well: + DelayCommand(2.0, JumpAssociate(oPC, ASSOCIATE_TYPE_ANIMALCOMPANION, lTrans)); + DelayCommand(2.0, JumpAssociate(oPC, ASSOCIATE_TYPE_DOMINATED, lTrans)); + DelayCommand(2.0, JumpAssociate(oPC, ASSOCIATE_TYPE_FAMILIAR, lTrans)); + DelayCommand(2.0, JumpAssociate(oPC, ASSOCIATE_TYPE_HENCHMAN, lTrans)); + DelayCommand(2.0, JumpAssociate(oPC, ASSOCIATE_TYPE_SUMMONED, lTrans)); + } + } +} diff --git a/gamma_age_v2/teleport_party.ncs b/gamma_age_v2/teleport_party.ncs new file mode 100644 index 0000000000000000000000000000000000000000..e48da7a8008d598d005b333750554c3ba0ff842d GIT binary patch literal 1293 zcma)6J4*vW5T3o;Qz1x#l@g;%6qKNcc9uQ}YLg-ff~Are0+NFyXQhR;_^;I7($2!d zLc}77Mf9AV$tHK_gS+DPW^cZ49^dSib}H&%-Cf%Ta3<#fp9uvHz$-`_4Ka8-klrs< zish=RZtbeQV!4Puw?aCQDx4hE>K*0z-2$5VL(gxkj^A#3eyi4OH9G3J-e|T|*HhZj zbzNHoLGTRd3=bl2&+DL5SFj0hDBCV907!u1G|20Oe zBC!x7T{Kxz&YV{dq!z{cjIjR;bcn_PZ;}J;2=FR7ko#aFmXiay=LR?v0fyveQ7$Yo zP>5!wpTmjyvduSYf4>UD#!UZEAETf$L-l$72I}J|Q0+WdA@!MNq<)x|tEQp)L;Xk$ zbmWqFoIXG1K%ZM-*^sN8*6Iykx?xa3vwZA^p7cY{bHh%()oJ?jq|t13WZ+8W=s1ok zq9}R>bcP2}HWyXUnIfpo5`J2Fa(DrYW9OvuFjm>3e@_Z5E(|gT#8eT=OT4cYa8b{^ z;({WffE?e*amA2qGH!xNKCoPs7Ou#AW~6AgQZ~~Hf?%Qu=^?FUZDU9*Yx36^sfxr> ziga0LNjY;~eXx`$#%F^4U!YAi8hDc(XeNMH*@4^#9dSQ9kbACya|vKfZWiUz5JQD% zRt6=Um@iX*qxSdfFlx-~5A`t$Dl<}_=WnP!jsn%ra}`scX~ycuX}M||sz20E#6U+b ziRU?{K9jQgm}N};M^+!AL}yY(CV{NJ2Hs@{vicf$ogK)1(7?m&K<>E)785|e4seSu iAreO)QSNw~^Nk;V80%Ds$)7%@M5Yfvj}N{3621XzG79Ga literal 0 HcmV?d00001 diff --git a/gamma_age_v2/teleport_start.nss b/gamma_age_v2/teleport_start.nss new file mode 100644 index 00000000..10442d26 --- /dev/null +++ b/gamma_age_v2/teleport_start.nss @@ -0,0 +1,89 @@ +///////////////////////////////////////////////// +// Ultimate Teleport Script 1.0 +///////////////////////////////////////////////// +// by Amurayi (mschdesign@hotmail.com) +// +// based on SirLestat's Secret Trapdoorscripts +///////////////////////////////////////////////// +/* The problem with most of the teleport scripts out there is that your companions +won't be teleported with you if you ar ebeing teleported within the same area. +This easy to configure script here is the solution for this old problem. Simply +alter the way how the teleport shall work by turning the options on and off be +setting the variables to 0 or 1 in the first ppart of this script. + +What this script can do: +- teleports player out of conversation, trigger or item +- teleports player with or without companions +- teleports player alone or the whole party (players) +*/ +void JumpAssociate(object i_oPC, int i_type, object i_oWP) +{ + object oAssociate = GetAssociate(i_type, i_oPC); + if(GetIsObjectValid(oAssociate)) + AssignCommand(oAssociate, JumpToObject(i_oWP)); +} + +void main() +{ + // uncomment one of the next 3 lines depending where you use the script: + object oPC = GetPCSpeaker(); // for conversations + // object oPC = GetEnteringObject; // for triggers + // object oPC = GetLastUsedBy(); // for items/objects + + // set to 1 if you want to teleport the whole party of the player, whereever every member is: + int iTeleportWholeParty = 1; + // set to 1 if you want the Associates of the player to be teleported as well, otherwise to 0: + int iTeleportAssociateToo = 1; + // Enter the destination Waypoint in here: + object oDWP = GetWaypointByTag("wp_portal_start"); // edit this to change the waypoint destination + // Make the player say something on his departure (so others will now that he teleported but crashed): + string sGoodbye = "*fades out*"; + // Enter the message being send to the player when teleport starts: + string sTeleportmessage = "Your surroundings begin to fade..."; + + + // Don't start Teleport at all if activator isn't a player or DM + if(!GetIsPC(oPC)) + return; + + if (iTeleportWholeParty == 1) + { + object oFM = GetFirstFactionMember(oPC); + // Step through the party members. + while(GetIsObjectValid(oFM)) + { + AssignCommand(oFM, ActionSpeakString(sGoodbye)); + SendMessageToPC(oFM, sTeleportmessage); + AssignCommand(oFM, DelayCommand(2.0, JumpToObject(oDWP))); + if (iTeleportAssociateToo == 1) + { + // now send the players companions over as well: + DelayCommand(2.0, JumpAssociate(oFM, ASSOCIATE_TYPE_ANIMALCOMPANION, oDWP)); + DelayCommand(2.0, JumpAssociate(oFM, ASSOCIATE_TYPE_DOMINATED, oDWP)); + DelayCommand(2.0, JumpAssociate(oFM, ASSOCIATE_TYPE_FAMILIAR, oDWP)); + DelayCommand(2.0, JumpAssociate(oFM, ASSOCIATE_TYPE_HENCHMAN, oDWP)); + DelayCommand(2.0, JumpAssociate(oFM, ASSOCIATE_TYPE_SUMMONED, oDWP)); + } + // Select the next member of the faction and loop. + oFM = GetNextFactionMember(oFM); + } + } + else + { + // Uncomment the next 2 lines if you like fancy animations (plays the summon monster 3 animation) + // effect eVis = EffectVisualEffect(VFX_FNF_SUMMON_MONSTER_3); + // ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oFM); + AssignCommand(oPC, ActionSpeakString(sGoodbye)); + SendMessageToPC(oPC, sTeleportmessage); + AssignCommand(oPC, DelayCommand(2.0, JumpToObject(oDWP))); + if (iTeleportAssociateToo == 1) + { + // now send the players companions over as well: + DelayCommand(2.0, JumpAssociate(oPC, ASSOCIATE_TYPE_ANIMALCOMPANION, oDWP)); + DelayCommand(2.0, JumpAssociate(oPC, ASSOCIATE_TYPE_DOMINATED, oDWP)); + DelayCommand(2.0, JumpAssociate(oPC, ASSOCIATE_TYPE_FAMILIAR, oDWP)); + DelayCommand(2.0, JumpAssociate(oPC, ASSOCIATE_TYPE_HENCHMAN, oDWP)); + DelayCommand(2.0, JumpAssociate(oPC, ASSOCIATE_TYPE_SUMMONED, oDWP)); + } + } +} diff --git a/gamma_age_v2/thequietofthemin.are b/gamma_age_v2/thequietofthemin.are new file mode 100644 index 0000000000000000000000000000000000000000..da32756388a2bb02dc3642608a9bc3effb302174 GIT binary patch literal 7999 zcmdtnd3+S*9mnyJ`zG8sESDfELh!%?C2Rr#a*+)I&#>%HvLo4`SyYc1odcAjk&+N?e>~qYsn;+-Af(jre{ee$|LedUcnx*oZe6@pdD=-H4wtVyky|IdhG;&WJmV z_+}&CW5jP6@%TR7WiB=1lo9VR;=7IbB_kftx4WDLM!epLw;Ay+Bi?Jo`;0ik_^JOn z=a|4(Fi$Rho}5KEgkfe_3F}3yrwch!+KMSg-mztXFL>R=pa_uwKoLV%4iT*Aw+> zE`;?G7OlN6_E5bK8ub=)d>ebHUh_FBW_!(bL+e?wo}&kPsGoNm^%irzdf2Gf9ACvs zg<7B2QFgd)6tiA^hlTa3ec`++bbB8&>MiDcHrMB3*4tCxNBVsbj<4C?LXWS0KlMbt z=6o*Zb9B##w3pLP2odqL-w z3N@emQFb_=i&?KZpNsMPd1blZja@I%j2+K;nWpf3qn*h*p4;_)L%gLcR!|d9+vbUS zJ6mrzcb|!R>9pN>q6TN z&QyDzTbADFP-fI?^)kwrJI&4QS-UI0+-oUId+jd8bHC@3_utEx=ee;|Jn3!8*BWcz zuQ-dmS)B4_aY4STIOWaatd-dsrzNGD^QlTX$8CuvQnq?3e{pSFJmKUzxkR6>)oCmD zJA-^|Q|B_TBe}% z#m)ppR(bJcERnHoH$TF4t?^Df)0oX48BdQ9?Ed)NpUkC#dv&O^_iLV2>sGkAuF@^# zI~?QwTDQ`UXL1{vRemY8?%J%KDYu&)*G_V#!D+R#cJ~d+2UEkp-p_}VF}S{|Hly*6 z=a@$R`^Jaz^VM{Z-vtZ(@|(KyrTKg;lL+44KhKx8e}9?lq^mryjYWRH{0HA>vrd2C zudrP^>ttsWYI`_b618R8kg_9d+8sL=@tPw!GS!Sn3BhKa^qPs%;ZU;R{?4Gv z&@!tfAl!!3lBDXi)vE2`LC~K?+6Ep9ZTo8LQd^HBFcPCM8u~2S0?~G@w)V6=t8H0r z$7&l^+ppSo)plzH(=h}3b6^(KHvL4O18tLPdsN$^T9&m9s%2Q)p4#rzHm4dvZ&~z^ zzwLb#$D^U2CyQ|`^poLuX#02xPK364m!b^I5QSE#3M|J8R6^UjtFRi{zO6Gc>H1tGzXv1b? zkcB39JI;chQa#;z^v}jQI2Y&Pd~C%wT!0I45iZ6hxD=ORJ1)l+xDr?4YFvYBu>;rP zdfb2;aT7j)PhuxNg-_!%_$)q$&*KZY8DGRLxD{W*m+=+chF$n7zJ{;k8~7%^g>U0_ zd&B;d}T#?#2&r4}ORr;m5ca_u+o*#sl~Xeu|&rLHrzh@DLuxBX|^#;c+~H zy?7G8z%TJD{2EW;X*`2x@f@DV3-}FQ#BcEuUdAi<9e$5L;E(tdUd5mB8eYd6coToY zU-1_HhQH%&yn}b~5BwAR@Gtxu|G|IpKl~r>LBDejLND}2AM`~(^v3`U#2^gD5DdjI z3`Yq@U?fIiG{#^o#$h}rU?L`AGNxcErXhmqn1Pv?h1ob5b1)Z&U>**|VK^M~aRe4% zAxg0bN8%_PjbpGF$Kp5~j}x#2C*mY5MH!YMigHw7IaWab23?6&SdA)FqXxC8!y42h zh6b!fBi3O(PR1!X6{q2JoPj26KpY#9KoT~Z(Sj5loQX|nMH((V=wGv&kwF$YwBsyn zK?gc1(+BQO%9FdAbp7UM7;6EG2zFd0)Y71I#Gbj-j^=<~b}pGqUP literal 0 HcmV?d00001 diff --git a/gamma_age_v2/thequietofthemin.gic b/gamma_age_v2/thequietofthemin.gic new file mode 100644 index 0000000000000000000000000000000000000000..659a11dc28505a4ddafd7beca3ac1a49fb9ffb8a GIT binary patch literal 1929 zcmcK5yKWOf6b9ho9wr@ z@)-F5`5<|me29FQe1v?Ie2jdYJV8D|K1tT(N%AT36dCc4aXU>uLq1DBM?O!!K%N;G zag8I!SW>HCNv|3iSkkVLC#+*1Ie@pwM0{a+1QcQiZs z@>}v6`4jmYc~p`d&palsd6S098+|h?gZ#Ja&iQD$RX6OSt86fFaquy0^+qDQ_h~T+ z&KtUK`fPdG_@68H(r(9PHpGQSo-UfSmB$0rTu~T{lk^AbL(*wy_K{A4oYdgqs-;C| zDf0%K^J$(NtD9NTG9C*}Z;ZaAZ#!S4IW1hPLRHxHE&TSQ|GXdv?d75F)3VgfYAN6? zn>XIZE3))!_iuN2R~H_3@v7ab%C>i|C{gz$wl?UxcPpVS5lPy?{B zYc#_6pO+{X!{gXbpPaE*b{fuyG{>Dh+r7etARu%oP$*0&NO)F;jVbxSu-`yrkpMI? z6h#~y%?j~BVMI|wGeQ$WaYXRZY|vy-AkkFNOwdG7BvJU#EYKvh%t@JO1~|(PK7Zl1 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/thequietofthemin.git b/gamma_age_v2/thequietofthemin.git new file mode 100644 index 0000000000000000000000000000000000000000..d9c10db762b9298d40eb8406504ae6dad06f0993 GIT binary patch literal 35249 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 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/thisisthesmal001.utt b/gamma_age_v2/thisisthesmal001.utt new file mode 100644 index 0000000000000000000000000000000000000000..0931a04d89829a4347deaa32a67970e9f9f2781c GIT binary patch literal 1084 zcmZuw+iuh_5HPpww09%e}q1$(~n$Er2#-6M%9psJ?fc%{iP+VL#4} zatlVBbsKi9xpU^6_l@UwVMncK}+{#rurd(El-w}Qls)kM>XKL(`6j>81qQ70~vcuuD(ZwQnB6dRR zs9EE@)5cGVP?4Rqyw*xGr`trlHZPkKAVVw|&ML*}Pe7R!e0 z4E1McrZ#kl`Ke_^=1f_NlR~9-T$%hRh86zBw0I2d{DEjc_^I8pUifSw4*#d=2L^w? z6PL)Lu`<(@crW2GkUwtfT5Px*hme;(O#k*nJG}S@W8?J*30$s7IudiZ z?&u2&M#(PU{eQv|?g96V`^7yVpSVZdAMOpgMb7db+zajl_kd%_d-9z;UkAu*@|ip) Nf5}_&l{_Us{{h3YoXY?J literal 0 HcmV?d00001 diff --git a/gamma_age_v2/thisisthesmallte.utt b/gamma_age_v2/thisisthesmallte.utt new file mode 100644 index 0000000000000000000000000000000000000000..d432e739c65af4c7181a4873b0108682151fc4e3 GIT binary patch literal 1429 zcmZ8h$!-)e5H8IZhK^VLWcj~&M)wV z@Ln$@P*QbO+2vPdxBYgrOn-R3`s{^L>IAe8eFXi9fOd9DsbBCPpHV6y{sBw*4WVVu zMLMlqf+fxk=w;|h=o2UfP_>-Km&!a!3#rb-KU4v`YW>@=pIiS9?3dQR z3;VV8@4;5Be;?LCDG#9BKl^(K_0Y^r@I8`Ds#$50>`2^^u~M5pH>Le9#g?fAX>0T3 zcck(M@ML> zO(j;QER#G%4&PUI?|5GZHi#ZNy>9ZU-tNII7x?7=9PSd33m_*Vj~%YZOJHPx*Bru* z^*39VdQ32*$E7!Ep_3dYT}g~)BHBA`+=3O-)Fl1Ql=~5j(4x~eMIC1*mla)O)>xj6 z)PNq{=&=u4njTm5+?9X@l4u;z0m=u7lH#fcfan1(&;Rw&YJuw!Dx77ZN9YcTTWfFE zwIA1hyAeQqkg(9v;ynPq{%wHA0WMasg+ed zJPNi4(B4!eu)(#FDGKjaarQL$bl)Cst9Pz;ue_FJ*T5IOfQQ%LjxIPE+LP==Xo6}TTb27CdKj@K-XCz8xP za2Neh1((ql_tGuxlJ2Wn9NWHmz9IT+eoPx5*2ACi0l{Kq7}0RB^wFM|J^p*0B1C-3qK@JEubfd2`Qt^&+4aSiwj80rbe1-Vs)K;Dug?C2G)5*WGD@5TK+XAi_z zx-qb2gLpri2EA9%%Z45`OL6~p;X)MB0INIl{>*q8M-5G%0`BHUzd6^Pa)=_Lq0!(dCWkg7}!n38}_g%ss=IJ%_{BPltN@Z1U;-AR~pe-{!(4F>q-eZSB#A(#!{Jy<#`j-KE8~qK9loF z)u9PFY>6IsJGDVqA;%NELTt!^5)pP!$WPy_z-+|VmE)zwjsqGG%MUuRgX zdTdC?faAakfL(A2VAo@}_Y55>^i3bb{TdT zb``!Uy9m370?q>L66b*Pzy*L^fYqN>pVj^n!0OJb&T7so&g#vo&GfQLvpQb`{sEr< BPKf{j literal 0 HcmV?d00001 diff --git a/gamma_age_v2/thronegood001.utp b/gamma_age_v2/thronegood001.utp new file mode 100644 index 0000000000000000000000000000000000000000..8bb298e9a09edb38407aefce7e7fec643bf8135c GIT binary patch literal 2154 zcmZWq+j1N=5FH@FU|0wcE&&1xBm|OpZIVz0JmKtO?BcR6dxIY-dA7YHGAk__ZH$X| z{(!vj348#rd<4&Y0X%TOU(V5Jb_Y<^QC}o=w^}pZ*N5Bc-7DS8FK1bH8_)+{0=~Gt zrYG*qvX8NFYbndVg#P`zFk$?SLCU?$WYV}7ly>d|$iqyw3fu$S0el5;9IHv3k0+jc z;4b?*$#5BMaWCD{F2~(9iF4aG&o_g7Df^T9v&BZjHN|bkf z8u%6XrNaB=9st&EaAXVkHIa* zTP}Y`Ph_s>OO<;w4aV818_Hx_>L5E(?Z`ovtBH8Xu*l*fV9> z60?DgFO;&8LGJ5`9?w$U=UM7&`io1$tEv)!!H-rG`&tcRfU8?ZXC ze3AD0?o`UMr>n3|3j-T7=FNC4eB*(=ZcDsza{_WDzAp#H#uypDSuAIpy4u1QW`pzm z{IY9qbaZX;JQ>q$^2Qq8uk|+6!g~92f`6F9mBY;M(_!>K&sLUg>rz6Ht$s4ubCU_Y z&mHjJ8W!GJdBeF8E6*pdEGiuhou3x)G09Cg*6si5-` z4ft7!KU5tSP8Is5s9cw2v}GzqyWC{Fa)-9tsU3_F`Pv%G%zwvHCFZ@#gpaVm`!x}T z0(KZ$uC2m4_-<#pv)uD_;JE8m>tl;2)jGSa|>d literal 0 HcmV?d00001 diff --git a/gamma_age_v2/tridentsoldior.utc b/gamma_age_v2/tridentsoldior.utc new file mode 100644 index 0000000000000000000000000000000000000000..ad8126d8cc76f8fc07c72b11ce8d846fffcbc971 GIT binary patch literal 4926 zcmeH~*>W326ow}xVRcMM!oE2hNk|BZ?Q9T8WXX#XM^+>yW(k;<)UqcY%_uW1J7(Vr zB zj|v_WJT92yr1usDpAdXf@TA~Vf=hy@1eXP$7R>dg<5mUN1fLOnR`9gorvyJO_!+^^ z3O*mf?pT>hTt~^za{u>!S4uuSMYm+FA08M@CTN; zM=uM$BKSkW9|`_g@F#*lwR|1QK6K0yueS4rt;cJhF^+vb)CaLGj)Rz2qa3t#I5M20 ztbnaein!!`G~RauG=Pij=SFA@x*56&;(N$(>2vSW(s{)5gwJ`<)+I&Uwja#>&HFen z?p@A>>!FcxT*bzIHbB27uCvjWEH(+gUGN=(?-YEO;Jd*bhq?#4WIMhWoX+Dua60e% zMg0R{&Ykukl=1+WabYYsL+qQjB`F++dMm^@lD7%o4rc6F{}4nY?}#bkot9bbg7_S1 z4?|@3yBmTX;~e(HnEX6~g8fr_p|<5mQS!ZF{XXcj<^3qXvdq4}u{?zGTg$^Jzqfn< zgkr`v!U)9StD{<0G(vNH->;EbLoql8+$t#VuQk#|PSL)|l z)c+Uea4ps)`@EVpUd_G#)*NI%e`cQ51!xrx!IZzop_DQY$CQ5*^*m?O`tL+N&ncc` zqY%$huAko@zREm9#-U+2HQnxb%IJ!YD!PU5l4@vN>e-kZMy90NY2~EKxK6Iq(JEAa zL(kNfI@%f6ep83N+nw^9_5;H!iIs!UgvvF=X5trg)Ck>1~;X2iz z>o=>~jJZjVWiK#E%jCBh729pBNqN@yjSjEX!zneC97G2Mi6)nV0 z`r|>+99?j2H1T~>i>!pg)l3X@6E@k_eNNujHENyHRhEh;Bp2+o__^%BjY? zYXW=J)Dd*+Px&SGhgBxms~zomId+oxIb#rijXj$91=YsG;Fh(%8zC%p)Fl3>->h(> zEMHe%FxwUVtHtEGB<=CGnYg>OzutaGuAhl?SkNuk*NH#nk9a{mq3S#WIEmpg7up!^ z6mIW*PV2C;My~F9*!6K$-cwPOUc~*Q7rJg|rf76KsVpl`8>4&gQ$A?7@qFX4_=Bj< z_Z$Gnmww#8s7S`s3)()>c)X5oA_8%%eiOP)3=jog(+xtVg#4RrGmbcwsUzrQ%s7@TS9mg;(Df7Tt$y7jDkAnP8?x`(swP}UvJ zx<|6E%DRWLZZqq~@8vq2a7#hU%;~1q9j>3@;#YvD{2FL2bUnl@jHV~LYpA|Bj7&){sUm<&y1g$J~MoNahTCFljq|afHp&0psmn0XgkDA zd+66Jw-VN=6m{ISAm_ajhX2v`S4MD>YGh$}K%z&BsGUH{Y%M6#9Ei+nXvdmzQ zLpf*!`V9IUnt=X~NfHyD+y!V9Vg|r3KjXu_QG`xFC!tB`6jXwypwt-0GQ{#U^an@h B@go2L literal 0 HcmV?d00001 diff --git a/gamma_age_v2/trigger_warn_dms.ncs b/gamma_age_v2/trigger_warn_dms.ncs new file mode 100644 index 0000000000000000000000000000000000000000..155092c3054472d50da4165796de8ca0953f4ce9 GIT binary patch literal 136 zcmeZs4ps;=)H85mU|{Hw0}>1z3Jk0a43Z2i%pe{!XV$$w#B p0jlOx$SN%^QAo`zNi9lEQ4mpv>4mcXfQ)1^W|U?Cn*TZXyM$@8u+4_epv{|4;-il~ z`l$av5d8&0^%vNKeUO2gD&&-`Yb7wa7IJ7Sx-h1%G7;_$|95CiC`5|MDB75Yo z$n%Gd`Gouvc^&x=0?A zE_$T&w$k5#%e%hJ;Q>JpB|!9Pc#!v2lx~$b$m2QB!NnVUAs#-1%bGK)mgg?|tkUU2 z^f{$-|Du{+8) zZz7GO6-QA}8$X)*(jF&!QE$asX;vG7evX3HzIuznT3R?;%ksnzZ0xqZUFq7eZG+dY z82EI{l{PS8V>s?HoOiEC5heynyJN#e)MNwvv|Y(}(tg_a9oOGVvdlYPg}6vJH(g<0 zB}LaRHTwG}EiByU_ZUWtwwcE+bG^LqwpzHvO5s$mXs>niH9s2Vnez8{fI~L#rM;%_RM+o`>$8lat|E;pXa|c|7V&2 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/tsorsut.utc b/gamma_age_v2/tsorsut.utc new file mode 100644 index 0000000000000000000000000000000000000000..35e46b20b2b3794138c5231b1284bc4b008bd706 GIT binary patch literal 5710 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 AW&i*H literal 0 HcmV?d00001 diff --git a/gamma_age_v2/tz_ed_ondeath.nss b/gamma_age_v2/tz_ed_ondeath.nss new file mode 100644 index 00000000..25b6e6bf --- /dev/null +++ b/gamma_age_v2/tz_ed_ondeath.nss @@ -0,0 +1,132 @@ +//:://///////////////////////////////////////////// +//:: Teiwaz's Easy Death On Death Script +//:: tz_ed_ondeath.nss +//::////////////////////////////////////////////// +/* +This is a version of the script meant for use in other mods. +Based on the death system used in the "Parthenon" multiplayer +campaign. Works as follows: + +- When a player is reduced to 0 HP or below, they fall + unconscious, and are unable to act. +- They will stay in this state until they are revived + by being healed to 1 HP or above. +- If the entire party dies, only then will the death GUI + popup, or, if there's a DM in the game, they will be + notified of the party's death, instead. + +The script are meant to keep the game running quickly and +smoothly, making it possible for the party to continue +adventuring rather than waiting for someone to respawn and +walk back to the party. + +To use the script, simply place it in the OnPlayerDeath event +in module properties, or call it from another module death event +using the ExecuteScript() function. + + +*/ +//::////////////////////////////////////////////// +//:: Created By: Teiwaz +//:: Created On: March 13, 2003 +//::////////////////////////////////////////////// + + +// Returns TRUE if all the PCs in the game are dead. +int AllPCsDead() +{ +int bAllDead = TRUE; +object oCurrentPC = GetFirstPC(); +while(GetIsObjectValid(oCurrentPC) && bAllDead) + { + if(GetCurrentHitPoints(oCurrentPC) > 0 && !GetIsDM(oCurrentPC)) + { + bAllDead = FALSE; + } + oCurrentPC = GetNextPC(); + } +return bAllDead; +} + +// Returns TRUE if there is a DM in the game. +int DMInGame() +{ +int bDMInGame = FALSE; +object oCurrentPC = GetFirstPC(); +while(GetIsObjectValid(oCurrentPC) && !bDMInGame) + { + if(GetIsDM(oCurrentPC)) + { + bDMInGame = TRUE; + } + oCurrentPC = GetNextPC(); + } +return bDMInGame; +} + +// Displays death messages to all the PCs when the entire party +// dies, or notifies the DM if one is present. +void DisplayDeathMessages() +{ +string ENTIRE_PARTY_DEAD_MESSAGE = "The entire party has been killed."; +object oCurrentPlayer = GetFirstPC(); +if(DMInGame()) + { + SendMessageToAllDMs(ENTIRE_PARTY_DEAD_MESSAGE); + } + else + { + while(GetIsObjectValid(oCurrentPlayer)) + { + if(!GetIsDM(oCurrentPlayer)) + { + PopUpDeathGUIPanel(oCurrentPlayer, FALSE, TRUE, 0, ENTIRE_PARTY_DEAD_MESSAGE); + } + oCurrentPlayer = GetNextPC(); + } + } +} + +// Recursive death function. Keeps raising PCs as they die, +// but keeps them unconscious. +void DeathLoop(object oPC) +{ +if(GetCurrentHitPoints(oPC) < -9) + { + SetLocalInt(oPC, "bJustRevived", TRUE); + ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectResurrection(),oPC); + ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(GetCurrentHitPoints(oPC) + 9,DAMAGE_TYPE_MAGICAL,DAMAGE_POWER_PLUS_FIVE), oPC); + DelayCommand(0.3,SetLocalInt(oPC, "bJustRevived", FALSE)); + DelayCommand(6.0,DeathLoop(oPC)); + } + else if(GetCurrentHitPoints(oPC) < 1) + { + DelayCommand(6.0,DeathLoop(oPC)); + } +} + +void main() +{ +// Message displayed to PCs when they go below +// 0 HP for the first time. +string DISABLED_MESSAGE = "You have been disabled! Someone will have to revive you."; +// Get the last dying player +object oDyingPlayer = GetLastPlayerDied(); +AssignCommand(oDyingPlayer, ClearAllActions()); +// If they weren't just upgraded to unconscious from dead, +// notify them that they are disabled. +if(!GetLocalInt(oDyingPlayer, "bJustRevived")) + { + SendMessageToPC(oDyingPlayer, DISABLED_MESSAGE); + FloatingTextStringOnCreature("Disabled!", oDyingPlayer, FALSE); + // If the entire party is dead, display the death messages + if(AllPCsDead()) + { + DisplayDeathMessages(); + } + } +// Enter the recursive death loop +DeathLoop(oDyingPlayer); + + +} diff --git a/gamma_age_v2/tz_ed_ondying.ncs b/gamma_age_v2/tz_ed_ondying.ncs new file mode 100644 index 0000000000000000000000000000000000000000..0e56d6252e79ef514d0a4fec3b3cea87365b5ebd GIT binary patch literal 134 zcmeZs4ps;=)H85mU|?vI0}>1z3Jk0ajI$V6SQ&Vdyh@8pf>O&e%TiOA8UO$P{{tk< zV9cb%EDuua%EAJoU{Wm1Kn^RIW326o#85W{Z=UBrJgd&IW-jI8K1DN0z)OIF69)m|e7_mOb%kMw#icW41up z!g|3Y@Cw{=$rDiA^8~yBRq+2kJ@WBQiVKRXoT`8NJKa4!J*RtGM+@`i(MzXKj-ORZ zy$b!ZRjD6PcJ5Yc8s+ahl{$5sQbQw3?M1oo9;MEq{2PX5Rptf864lNsf+qz}3Fg>E z{~5tm!RG~YZbkoD!50M23BD+}CipeMb-@k6^MV%yUlP11_;tZ=2!2!WTY}#f{Epyv z1vdr1Cs+$^32qDS2sVPdf|mp@3l0Qd7Q7-j6x$ain-+>EkC@);ezBJy)<`Wo<H&6KaJeAr3=A76U$B5#$P2L6ZyX9PPtT-d%XmQ5-cSF}WaoC=`aM!(p z?*(&w+I@N9uJ;RmKrmy&ZY&Yi|s7CZ{(G#SeS z5XYt+%nR3c2>d+6euo7g0Z;q-$57JP=W$0lAN9=Q325B=PkQG19LwuUoWt>)-Sq^n zTpQ{n#Iuk56x8xOhLYbT>rX+~J@Yv~dgl87kE#p#07Avnc=Yd=}-O zo}WYcmuJRfI~I?7;RT3Bei1tC>t6yN_53pUxM%LcG0*3~XTh`*#J$V4nSl2D`ZBn% zn{lxRZr11Dj3fJO@y>rarX2qkZ{#41#jQB!JL3O}1J9fa#Pf73GzszC=Xo*(jp7@e zH@$wSt*M)|Zn{d=&|Z`8DjIwl$1u4>CB ziY;4mtHp^;bYQEU+^?9lodkUw#F49**Gs-ZGSzp?_c_YbElPDkiYZLke3AqNTJsXPC3l=5-JXS2f}+>NJd<3i1(aVayb0VAZtR z>*1Yrm{(OJYmy}ETR(-_I4;n2n2T#B=~axj%g&#OJL?nTof}ps7IUiU_KIFIs$$xD zeLfh(zhOmiF+#;K!`d*!Yr_FyKAZf-Al>Abm-QxpQHLva?1!RqPTMTeVW|lEOkitq z5ZPjsa+V|}vV-ai`s#o=Mq;|HILeCdYApyuSh(&_qiHlSG(QxnAmA&eFk4BD!tkwo_fBmuk4(HG@5BTL`-MFGh154{w>bH~JxL`F z8|;U?eIYeT#dL$n9kEFO=!(57&wa0lOWQHM8cms&xHUGJ*Op-$7H z5%*7C$%1~fYE3V%tm)8LYX;v_IqvnazV2DPAgU_^2jIpN75VsP)%X>3XQJMp)Ih1DW`1UJxrrmM;?M)M>@_%u8uc5rrTUDmUySH=;u43XivGs zZJb`ae7p8*T=;R+ajRV106$;lq5>ydJMOi#-Qh=wqc%>bVeh4VtZ~tlxCJhzf}yy; zg_~h@G38?1IBNOD#S4u@Yt6tm+X>Do(;FLO9_JEiCM!I|w?T{o{}eExVsx1NGqK{q zJ`C}YXTrp!jS*$iyc^mB?S&YACgn`VnS?X>=8puEZ6?`Fu9;LbnI44>KnI~i&|&BZ z#H5(X@KK1#FO%M5&~b>#?MaBqER$F!uj9~Z=nTY{Vp7Uvlu0O)PbQsAHko8Hxnxqw rWbzzTf+nDEq3@s>h+F4YO!B0vf>=yK{868V7$0ej760I|JP-W?d|}^O literal 0 HcmV?d00001 diff --git a/gamma_age_v2/utilityrobot.utc b/gamma_age_v2/utilityrobot.utc new file mode 100644 index 0000000000000000000000000000000000000000..b79c4cef71989b8c115674e28d5f2e2f85ddee5e GIT binary patch literal 4719 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 literal 0 HcmV?d00001 diff --git a/gamma_age_v2/vathbite.uti b/gamma_age_v2/vathbite.uti new file mode 100644 index 0000000000000000000000000000000000000000..367b77cbf5c8819d8f03b110b5f9d1d70360463a GIT binary patch literal 1094 zcmZ8gO-~y!5Osk-zi6SP-?Yt%BNA|+>H&#_N==nSQIh7=i<2Fa72fP>*FmDE{w^;3 z5&jE(Z*7Ork>1XXJ$^G@J^vasYr~`c!>>xIRp2*J18yHF^&Z|}u>*e%{}=w-no`f< z?_hB16+f^az(yG<75Vs?&*>@vDAjj>=U0FyK4#xNAA?>U0#5;+IRR+v&MEG*&n^ds zJ$7!v#~w7Er?Gx{4)zYV83Onh0MEYkfGat-;M+dl=At*=dk5e>=y?}f6)1lU{OhIo z4PyQm)|0d4V{(RB!@mri*eZ>jp@y8n0w?pgz%jtOcfe0zAW3Glm7WwmIajK#3u#(O zuvJYt9rWMEROb^Z7Hf^Pu!{si z-=;4W;yD0)D#+?z)l^St03!P;pgrmJ&%;8wbMnn`YBDOxcn z@%fd%p6bs>_9_eA!H0PVdSt>1^Px8Lkb_z$o|_$9eqVw6&&G0^WukMpZ^T+@p1E-wVjS)D|}ctM^13urFe$etJSedMTgh*f6OA*@DPoPrCRuc)_@AYm%_yVYWDxONG%0B~N0IHEH42rHIrpl-;s)}mjz#o8*z%K9!VBgUHAB*yS3jhEB literal 0 HcmV?d00001 diff --git a/gamma_age_v2/veneamub.utc b/gamma_age_v2/veneamub.utc new file mode 100644 index 0000000000000000000000000000000000000000..92347578b0e73f9611122497e6225476d81642f3 GIT binary patch literal 4885 zcmeH~*_IPU7{^N%K^BOakMA#!6B%(@Za+yEBU`?zrG~ z?<08O3wWj1K7lXb@d3Qk|G&E`e&Yql3(xU}@0@??S4&q_f3@W6OO4{t<>N<=ol;6& zgnnPE)VD}~x?8D9q@^uN1$QX*!=O^zk^X$IQdOjX!ceV>{DCn=ab_jKV}i#8PYC8X z?%A^7^MWr3o)SDQxFVSE;`*!#enD_ea9wai@Fl^Q1IZ2Yl36JiQrUlPw=APCBe&r zR|LNy_)WoY34UAfJA&U8d|mK+g5MYXf#44Xeq>p)7$sl#d5!wU@;ykU@wo?}0f_zGWqB>qVOzEiX(t;%sr6tQ(>pWD zpW6WLpab@^5jq3m`pEj5K+18M=NY59d2mcVW4l+ISP5g>%@EHa8CQ_v8RJ}V4P{2g zRg@X~*$SPu9c{~tv)}E4?-RU3@cn{!3Z`$|xDSGF*p43pyM7-AbAGf(AifXnQHXP= zJqEe*Au!A7!(BE-qIO%R@Ap8@K;*rG_krn8mOl>B$XqKLd4ERv&l5^T%Utk z*-(LVIFxbza~KKNhB^ZAo+2NGc+SZq5YG?!N$93!j`N-6<4C`^d;;l@mQN!6#qv`~ zf3^HH(%&qfLi&g0(?~a9O*t0*u>(wBbAQpuXQ92e{8{iJ%g=#FEI$uEVfh^RESOe+ zxOcf8qtLJ|FM^%jin&K=w`!BO`1ftNmudfHpLvhB`@HRk|9=l~f0v+LIBUFr#vtCU zYoT#y6U6h*d+s3GI6fozg5WFQh6%d9PEE}uH8ZPJO}7mm@7uT+Cuv0ou5e1P%Bn)Q zYjmu`wrMt2x<*ZyuwxjUSgX#PFiKgITQ!Q)SbJ%?ljln&X~$kS^`bBORJF=rmmM_FOE%^_KT3fU`H3j%j4gWBn@UaTrP-d3Sw^YXMt>mRH{qPYB;h7itQ9&}drAK#;oY{$wo^@` zm8xgEYZ7}jZNcd_e=)4EKfGmLU+)^7~HZp?{QU0#iel*t;{p+QCUGnxgZE4n>>#x5b^7>1OiA!eI3r(KC7>@c;Hlg|g95{vH zF&El6o)p>sd3I%Zvv#57`PlVYQPI~);wtg{*tMS5ZI)9L023^Hhw20PCBL z#UFTep`QV8e3{Ss7X|rvX3^Lc&Bp7R4m^;x+PG*!qk~?H7a2c{aVKTQz~VCMhV}4t zuf@<+*0Kr1F_t-IYmK(dXEwNetl2TM&3U)_n{7ci-z2U+;p(?>v2C&S+AhD#M`0)1 z0PX?g^9|q%aOt(9przAIwudNe(6dU literal 0 HcmV?d00001 diff --git a/gamma_age_v2/vibrosword.uti b/gamma_age_v2/vibrosword.uti new file mode 100644 index 0000000000000000000000000000000000000000..e5d0f4ae5c512bb9b612df4d0579d9dcfa447399 GIT binary patch literal 1172 zcmah}%T5$Q6fGZ!Z$VIeBC=ycB80@mxWHl437QErjtkw?Okbd5^;D<2MuT6#hZw)m zy`EE#VaAO&Iei~>UtN7~f9w|_KyDG{5JR> z5Y4N6fV#k9kd!h>zLj*c1pp}n7=IbyIc3(}N;1-`x4=z+F$F-n78%^PiLFG?Bv>bMd#-`6KGFg-h`+MP%{wRLRk zrwW9gw?<;BVD5Q6`r1Rmue*=SJEC<>@?|T>Gf4_GW2In?hf_vK7Bnj*+PAw%_Qq6t?N{q6{3FOf%_ScWWQ-d zyLfKIdnpcLJIG(xxZR}T+kLBs&bHsJEBOh30eOV^SqIZo4i6VIpF#}_l9zSfn_i(y z3Y;zOA?IuX;J$I6xnJBXhUR_cTykGHhb+mx*Z^Jv+zal*D!}>YjB?&N=bS~p0RJn` OfakzE@B(1{+{a&l28rJQ literal 0 HcmV?d00001 diff --git a/gamma_age_v2/warbot.utc b/gamma_age_v2/warbot.utc new file mode 100644 index 0000000000000000000000000000000000000000..3bedf4bde8b6eaa8a15fd96e32506525c81acc1a GIT binary patch literal 6539 zcmeI0X_OpA9l)C-TrL}qh^QzD2@oL$Oi%$)n4Q^UV6z!!CRvWare>ygx7nWVp{FOC zc!6>S@W6vZMU4uAH!9-E;Q@G{f{LPe@_f&)`RwyO`Te`AXa9VO`)PSkt@nOgzpAdO zuCA)7p8syC7guiGxPHT#p6AWLz%tK!j{L6Wo_9WZX@%!)+|TpoU+Q_S{XOs5mwDcO zl>bfQvR9NpB+02xQ%U)-@)6~u%Ey$KmCOC}J}*!{u6&d73FVuWSCn6VedSjupHm(v zZz~U#N6I_OuT&l@?&=}%HOH{D&8*j`A_(b>-WY2g-LUzgGDz%I{Qu zuk!nqKcf5z<?dm1tc<(2U`2M|)>DPK5 zM}EKlSXKXWT*fT-dIjuu9lsJk4kSq~W0dqN$j9_*Jiqtx%2(pjUgmHW$ec?$0c1=v z)vIBT^EJv(#Q*8)Pa>Bj?N3fE^R><;dkt)GEH%YANjzLETH=Vy>V;9T~_jih~zXDQp9C6n+U z#{tD9CTS17Hl~ zw~@Tl%dnb#Rk!UosEiNG0nh6369f(hq04QxjHxi%6;)KTt)l7WKkb z%_bv$)?+1z&kwYX=zZCm50Mt zRW{1PbrVE0J=MRN&(HSsvY&>!$t4zn!u`OmOtvG1j#EmGC z@J#+KnEzan5O^}ZB0;IXBA=2#OX|cIT1qKRN9^1%)w0u5v-z$VbQPU!^W@jNvMZX5 zeYv}C+_uQeQP@g1M*acH*~Z8#I1HOnyJ3>UT@O*%JN*@JB!wQh_UDiOtbqUiYJeROM5630^mRE~}+bdxeoB*p~4V(xk!O5@| zBs`X|_*7U268^4-(?G&p32!B=-3VuZgs&2|O1LUvs)VN!mP$A(VW@Mbf?vaL;A!|R{0^Rh-@_l^S@<9b9|N0&)G6y9Xh7lMAnV&ozhm_%bxB$js6HLHnsKA9#g&Ndh3v7i+xCkzW cOW;!22A9F*Fa_JeKm(f40$CgD@@ewt0hoPfegFUf literal 0 HcmV?d00001 diff --git a/gamma_age_v2/waypoint001.utw b/gamma_age_v2/waypoint001.utw new file mode 100644 index 0000000000000000000000000000000000000000..a2b2da7ca77ee21f03d87a7f55916bb3d6ac75e6 GIT binary patch literal 602 zcmY*W+e*Vg6kP9@iuehO&r+(s=%ciXLM^341s^PHa@q!y?2_G5^~3xIf5R`)nKVH? zFqw1PvnM-u(SyD}ZJ(SerB;9*&;mYdens*FetT7^Bk&`b_6;Mmw=tgI1;{kk*uD-h zzXlutdjNBXwZ8$r0%)5{s(QBIkLq|E+|1p9&oi7!JOLNZi78DH3j$a_EnXyv>@rd+ zlH6q`$VmK1CWy_nDOKFJvB}bRNd_k8h@SYkOkGHAQPr=Fzcp@PLp}drfQ~x8EX;Ez ziBdz8NeFVo_oQ`go=XvyLH%tl%$u`m5jvgYedHEyT#9#QQH(PiYh=F8fB%{mfls_;$^^`v}JoS_>8J?W-?}n$g_Qn}$Z$-q~8|S6`rQtaj zX0=f>OL1%MvGX}>MuV;&Cj9lrl`6C@W$5wzTORB6W9W_0oJAlYq7T8 Mw$vq&s6vvMOqEMg$DtMz@i-4sTP*jvoXFBabFXK$1cpcBooVKBvBqSN8^@kHDEKA8FAIJ} za82;5g0a_$|S23%(%u9l`GkeoyfGf-egGK=6lxFA4rg@W+-}ub)`P(jMer`mwKW?uPhlLsL_Gvvph%a(bbE0zzT{n_$iw7*zB zg7#O-kE8v~@)KzPuzVElpO&9Qy9P<&xt@Zyf>{esLp1U+h|dH08R&rJXTf|n7-u~W zTOJ0FgK0U4*TQ=<0`0T$JUBBl??3JOcy@oUkIVj&(^1lKZWd=P)2<&gjoui)**G`r ze=B}t4sYe;|H}#My8vy+vqm0;`fbq{!S)eUV_@2U)rar8aft8n6;KJ{H;nI=6VL!o zobhqNW$=t?1+I=w#Y7b|r&L8Z3=Zj9(Fvn?O1HA$gucdAxgan))Lz5XW|jk^#*EiA zVfS!VUND{?b5CkzKa4}|#HD8H7fjR$ogj96uDmcGJ)iEd+r00cH({i+4yC9pUmvQd z8{Ac5-f0CV(qT*2U38-ug{!K5+iO-$Ty)YA z%dXF*UDrxcsnxS2#*4e*Nxjr%juD!uQu#`*dA1#OFA~{pn53L48og9CsjhLW5sUwp5qh7PZLb3Yv(BHFjnF1&GsK@0{*>@%gg+tt`QXQjKO6iR;LinrDtJ@- zpzY8OXeYD_+70c2`k}oL7yn%J?}rXRT-*;p2cbcTi}xYu5Of&gMR8Hi#W)w?TzqrU z&BZns*<4(6QGFa5hH}sd^eOZi^f~kebQ$^*`U?6Q`Ud(I`VJb0Zsje_8$T8WXcQ_! dV^EeKE>38yEiO(@LK6^kHwiI51x-U`=pWB94!ZyV literal 0 HcmV?d00001 diff --git a/gamma_age_v2/wedlxonbloom.utc b/gamma_age_v2/wedlxonbloom.utc new file mode 100644 index 0000000000000000000000000000000000000000..42578ed695f02d19594822152d6c5108532bcd0e GIT binary patch literal 5665 zcmeI0*^(4R6o!+{l}$j!1=$4!hhbAxRC>B+X&8p4dtktA$nMUWDW^BRCKo3XTLf1n(6* zB6w8rKEV$Oepv8+!H)=jRPX`82L(SS_;JC91Roasgy1IyKPC8x;HL#YW0^VhtYzGu zYBC%X(2{2hUL?3x@Or^rf_nw;66^{d6?|CmQOo18hT~wiYJ*bWqd`}xgG&97GPeF` z`Es<Oy-X%O#8E@L`GBjfQH8|Rq;am_S5E}Mo&X49^0l2TU* zzFP2X!Hf-`FFe+@&=EWFb>Q?It_Sm+X>%a1mv#fhxX|W8sec}re#UaXWi)C5#5gea z3!&RAFA}_1@Qq*^$1jN~;iZ<@+yt$%{hKXwt;=HH^bFUqJm%!*7BoCBss*Z8W?cDP zpuZJ5WO*gpW0rZG6P8z_WzKQ@8t7-sYtjB{`Bt>QS?0O^VR;?eQI~76UJa<5I zz|4g^AsTr-#Cwl?7qr~+-C*8_^xp$jEpGtx9;0QT0}!uG8`NU`S#WA(UVqw|{xo0D z^vm&*lUb5^&gEw=)6SeT@t*BJ*F5JMf5Crt3@^mwzl#a;I|t3jy+&?_{IBoy=P|$hi}O04#_)a71@T=t0m?&sfAjgg5n6?dmvUAxzjb;|t?uf`6irw(14U2OpEXYT&>d+N#$}@LqIVaRXO_yDJz*3_e z$WzK0C*t>TYJHA3820xVemm28wd0DeD)|ksS~5|GlgwCfeZF#=mJjo_8qP_(i7W3# zCI}k!$S$GV_fw1q^!No6)N)2gLvg>&ukLFT=Uj?(5MfOPT^ZJcM&(RJ@9TA%@h?Rp zxR@bl_@#f^5U(%;`MMooMp1TR5z}h;Uq~v z6Ge!>L5?Q!}bSyzW)x)J-g z?`b&o{(NL=iL;=N#Th59j+d<84&lgc!-#w z+w3)NydE(=Ss%9~&Uk%wQ$@sL$K(-Hbw_=#?D~F;kS|zrI&U1F zB!5wvc_aN!)L#kANIk5#u3Y;M4hMPA+RAz$e&O>y$rs8*XcENYk`ZGBSw!*!oi7%? zZ1~a5`18Y_QD+f21DXlVf>`9SxMNYrVva=|Usx>KSgf%~67(|k3Umy56?zSN9eM+L6M74J8#)fX1HB8q2fYt{0DTC3 z1f76RLLWn)K%YXNL7zikKwm;%L0?1PK;J^&L0!-|Xgu_PzeZWaAP2QW9Z)Bf#)lt6 oH0CHjhBiUn&}OIy+5#1ztxypvLA}s6i1FPHF}{7!4rnLzH^oyth5!Hn literal 0 HcmV?d00001 diff --git a/gamma_age_v2/wedlxonspore.utc b/gamma_age_v2/wedlxonspore.utc new file mode 100644 index 0000000000000000000000000000000000000000..32f23c597b6f1f1a634c2ee6c43b1461aff40bb9 GIT binary patch literal 4849 zcmeH~+jbO16oyLyk0Bu7StOhUCB_&KQBgCQ$zdRbaV8i%jx{}%q)AVA)7_JUCr~`# zS=aIr^v+9P!B_Cw3tzwoaN+-VS4}pua4o&?ioMp~_0_KGs_NZUJ$uf~mIq!wJT!7l zDK!KAwn3@yQ2um>Qd1}gw!kt@1@VMX!!IOeH zkGr=j_=Mn-f~N(a63q3xaZU@a34Td%U2sG2tl%?(Ulu$k_^jYp1ivcyHNme7enaq^ zf}4Wh608Nc1bc$pf{oyL!3%;H1^a@}30@K$2<`|D1xJEo!RG}hf>Xhn;I80h!7GAS z1+NKyTkt!A-xd6x;P(Yz5PVVa2ZBEod`a*}fY`HLI7aKYmhVI~UV!c?M{19lV$Kw6(SGkKrj{em9>)7a-gP6Z#d%;HgK#MU3P%(WgWe4|{$V8QwI zaa{Rss3FL+%((I#(mxDcviu~z45Qt|AznC7~Y7<{}&VP?+UaVXN}*Vafsj64bX%w zdEO_X5%h6f7CZ}{HJv!nnW>w!ZswJ$YtP`8o=x~kn$75rb5854s;U&nMkhM-OmlWE zHfqv@ZNntQT5ZvUQO1_SYEhCU+Rv)(qFynnm-un!N6d7v9=%XB*lRfomrast*P)u$ zQz1m}rk(l{b6n0&Awc-bXbj%}mvOXC_ z?eS&bMic*w^vZlUz$&B6_b?tP2u!$Out9}nAgZj|+Q z9YhOVF}_|Y-b>LRr!C8ebK~{)L(zUFHA%(H`=Kf7r^B%z$`{mFLI9^RJ=Q{-z@4Jn zJI~ICC-X`zKftcfUFAThscXdju$}J% zcLVChK5!0v`@E>r(%EJ^LKJ%Ve)ZW}8eh?k8#fAD_Vwd| zwuUQBKWlo4S&7qlc;x6mIDEX<;bG>Bc~ZC^^TCKQg8Y-g1dcxxeGvad zF#b#q8Fl_i*amHfc0l|Sz~rAvKa+hX`TPN5QqN?bNj%@@E@%MS4ef#ULi?co5R>l% z&_RevHk0c^&>+MldI)0D%w(BKGLz%O&=H6a#pIVsFOyv+xlC@E)H0c663gV3N$V(7 tg2tdPp|7ARi2LkDOp2tXf>?}0Odcj77oRHF8RK;V;vPB)O+%-kzW@)@`hoxe literal 0 HcmV?d00001 diff --git a/gamma_age_v2/winislean.utc b/gamma_age_v2/winislean.utc new file mode 100644 index 0000000000000000000000000000000000000000..fd4a83a5356954df743acc749dd04b2fb251efc5 GIT binary patch literal 6793 zcmeI0%Xb_{6~>!54g{Ro#D)OjQBLf{CW<1<4#XsYC5>b&k>x>>V;%uf(_J%DR!`Ts zyIP|O1j0MK!eh;XEjw1QWx>gs4GVU#Va5Ld-&b8dzS$&fbB^kqtNPWu>ej8Ro_lj= zMZI)!e(~8PNp3*?b0kTAi~O(ePm*iMJI9mcU++tjvmZ&4Q}0QV%O6dWF7p2(p*dOM zA0+0e4yhw}Rq&eNtAe>sJ9b_03xZ!1ydn6y;7!3iOFL&*@RtN{3EmdGBlxD^mjvGu z{AIyk5&TubUlaVY;I9k*hTvVn-xRC`_XMYcGr>l1U+_TiP_PwzTkxLXT<}P6A=n8X z3%(<`6kG}Rf@{J1f+vCx1WyIOBKTW^zb*Jx!QT=5UBRyj{+{6P3;u!N9}51F;2#VA ziQv}-|5WhLBGZn49{C>R$56pMxsoJrAY*&-T9W*#Wz_t7#`h$@iTnZNGI88{A;%z` z4^KYu5#&$Ax_goT<0$?h#Vq9aHC168=h($y&I4DGJO|-i_d||i0N2`{(KWm zZ`Y^kaoFcj5AQx3pnZ2Br||~qe^w#%F-IV45dIHf`6}f1a8@n2jod zd0cS2?v?UL9b-MebJ}#v7K3Vc)9{;!X-C^!6q9XN7umM)YqpuOn>&7D&C+_cJ{sXn znjdyZ>xDOES&x0(!iIA#hW1U@HRY&dv>%4@vdgB+;>_D#mmYiS>U2*JOwuu_p6=M0 z{W?U`IhC^;@z||)OQP@TRPv{f<3gAo7&f<&X-!HU$egJ zY~kBkR_d}eg`ZVl*9SA^9Hr^^Tv4~(lZnl9S<#2?WcjLd+3LQH+Qk1zJ?YmucImuL zF&`+;O))UoB-E6wY%OKC>uPpLXg4*%oVGN2CELNeuE9oq4@!^a8^tE)!zr8g?Xk)8 zB~H?mm%NAm4Q#Y2ck~FCL6ePTTR|;7)HLPQBHN;&+-=vn8`NTcJ!$Tx>5tdu!*uO@ zGka*-Z&s%4n7%DcQ@&9w=Pqn$dk+fS!1CA&(;7yK;_N-QbvRkN)U!FPK2)vbx~ken zj90Mqt8?SMnZ2hKHyYu7!&>|Ut?tbV0In~~VSZ83tY`L3ywR}U*ksT^ z=ym_Z7PiWbF8IaBU&iqRBYXklbvBLsbd`-9`zHLJtoswnJ42%|qpFN4l&zFjX=%(D zmZCiDAvenP)jsrEsmah)MwN9@z`v+eW6-!XI#Uh~2LthUs&ZWpjMAuA=jyTYPAx8| zk-;0U6qd;>JR=I{=heFBdYSF_ZCdA^T|JBn%a{_Y7DmC(7GA+WVp~O~Jhobx10ULY zW?+kIPHD7ZQ0N*~zyVzDiYfO1#AZ`i4rk|-8om|t&nupLisjtosR0gLD1E2K14-4s zF0JuX)z6*wmFlB0=VY|ju!X8F`*4udORo2z7w&EBu**4RMiyhVs$7Aoba)gzP=Wg_ zl?^BMu1<$0!`3kl8c3-=>~LcJkQ>HB@|e$Jj;h&bFRxA9B{agG@xF#QJ+-2Hm_ucz zZ;A>V8s{~4#r5IJ>Ft%vT#2rl>P#IR)BycbT^4rVl|ZN`x0s{AyYEfs)l%+ONcF`!xVz4-eFbH?ksH$lg!M~{ zAQm>%KfS4{J)ZX~27{sgv768ymQ;m}!Q5Nr&Z%_h@V`1Y)LaSAgCt4yuQGhR*Y)rEzHG{sT-xE60S=Yx{sEwewa{=$M{pPmVC59cZk zTn#NF{Vl$!78V${2|+skcsl~Q z7jhJGAA|uc{00l3It--n2iq|Sf5AleknSYp6okPz2H_ZdW6+JCP7Ja! zxW=FwgJ}$+F?gmRry-9*9)p~LoP|6Nc>;0{!eAGJTu(ygAPi>BL!O2(XvJU^gH#tG zmmoY8gHQ}UG3dl#6N5|)E-|RYU=o8!3?5y9EJ2nbzkvJ_at*@IyhEKdL5L1?u?ks( b@W*?r9|lm{M18#gq5ZrF*??S!Y(oAA7PqPz literal 0 HcmV?d00001 diff --git a/gamma_age_v2/woon.utc b/gamma_age_v2/woon.utc new file mode 100644 index 0000000000000000000000000000000000000000..f8dc3c37674b98dc7900f5a1abfd73229de5870f GIT binary patch literal 7484 zcmeI0d3+pI9l#%LS_*_xq)NTpQc8tVVhd6gvFUEElBP>`+i(<;$?i)s&Fsu}b~Z`9 zs0vsW74NEeqt+W04-^G&M7&Y!U9~7GDhl2xe1CH+zY5K#`tdJ6d7pgueczimZ{Gao z&5^gclv})I&8pRFjWJWOcaAYf9cIkdhZu7X<<{ek>84y-WX#>O@JEtUzL&&ilan8k z*<(DbHT>0~q z?^6DJ^?fIQ#jxKfs9v7~Gqa!lDrjv?u2kTFTy z`5@10@nb-q#nNs8ND@Cbwqy*vn#?6KaME!}7XQlmW$B@a^e^dQNf!U|I%_6gY0dO- zOvWt7dIaoBJLYv4kB`he3S@ke9u1jG{Nx-YJr=V1#kkZ<43~h!PSVmOi|6PG_)3t| zS*H9%d>u&ra*!l`Qf!H@NL{kWK_xApOfJ_&uFolP-B7!XL5`E9QxUl~!YYvWnfPfi zmU3etTYsmMcemePesh>f9bLvkZ-<$fGppe8_W!g`z3;*NP>y@BeP`;Yzo!4s@sVeK9`-}# z@*K}xo~M~F;eHhFfE&_#Q{E@3nl4=C;Y^$VU3`X!r=;oPJQTN>X>+i7cqsAl4@=TU*whgeHn4x>FjWz0Lte(_X7tCv^O>9W3prS<_|xiVd5)o5Gm&gGja{sSt!w z=(tf&`XQXR^>XOeA~#58Pstg*e`hQg_!Bm)J6VICdO?4pnNFuHn|kCOCMoaMov`W* zd+7m-jp0zAQr^0etUqLF!1YJ#gMC)Mp(T|Z*HcAP3>to=XroRy>9ODi*}q?L`<{AF zwaPg;UR*Rieq_V2QH#HW&nRGo*SBwxlUG55kO2>qoM$?#H zXL6+BG0Grv%k+nNp7lp9gCtBQ*WX^*)~Gj6lIWIgJe~R-TA5-zySka9(J(5sEawij#G^V+48q}(1w#NRSUlXBjvaxrAere(KISca)d${l{CUna`^+Z`_$ZK(d8 z$>h2u?YY~cxVx;s=6p!DZ?4-gZ%16;Cgn~3dM}6vR2(OOy&RsgNa|!yRczkRSsiCq zZXb3%W_?_h^PGA;+sOVM+Z%3euqU$Bq_W_6Hi~TXe#!;aD%UqYmi!Ra@n!*$`NS@px4GWPGwEsf@>0vlSv1SF}t9fiDXOvbdeS@aIq- z2!fOP6Q#`Xk4d*X=}gJW zfnSN|O11;#WUgctJRi$Jb=ZlHPJ0OaGS9fyv{bJ#Q?gBAJWaBp(3MP+tk__VFyyS? zz#mSh2q(0_pB!|f!E$IPYxP=N+Zhk2kh7NX$+x<^CnO>g#TJ$H797%OdMI$HO9!^%_~Hk@Xq*KSI`HWF1DSPCb=GB^>I zgRGyd09h|N8BT$fa4M{V)1VDxy<;`3fzv_OGh`h@)-Pn;Le?u}okG?pWL-kmBV-*y z)*seEJFJJ7z?JY)cp1DLUIDL!SHY`cH@pU33$KH#;PvnZcq6;a%`--hqNcVRDl555mSfFHt-;K%S2 z*ats_pTW;zKimetfM3Gx@GJN={08oT-@@Zt z2b-V(=R!Xep#+;@3k<+{a6ViB7s6J!2rh;}7y<`|p$rwUFao161}1z3Jff)3}SiZ@yUs~1&NvIdGRSp@hPckiKRIuKp7!4 anTi5KEe5bo0c{3phX4Qn|4?91U;qHgpBLr; literal 0 HcmV?d00001 diff --git a/gamma_age_v2/x2_sig_state.nss b/gamma_age_v2/x2_sig_state.nss new file mode 100644 index 00000000..a0287687 --- /dev/null +++ b/gamma_age_v2/x2_sig_state.nss @@ -0,0 +1,18 @@ +//:://///////////////////////////////////////////// +//:: x2_sig_state +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + Sends an event to every party member + saying I've been put into a disabling state +*/ +//::////////////////////////////////////////////// +//:: Created By: Brent +//:: Created On: +//::////////////////////////////////////////////// +#include "x0_inc_henai" + +void main() +{ + //SendForHelp(); +} diff --git a/gamma_age_v2/yexil.utc b/gamma_age_v2/yexil.utc new file mode 100644 index 0000000000000000000000000000000000000000..9ed6b778a326099ca6158b3cf35aa99fefd0c425 GIT binary patch literal 12998 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 BehUBq literal 0 HcmV?d00001 diff --git a/gamma_age_v2/zarn.utc b/gamma_age_v2/zarn.utc new file mode 100644 index 0000000000000000000000000000000000000000..11dccf7c288694a4173b670bf9de4a1e0dab3634 GIT binary patch literal 5077 zcmeH~+jbO16oyL(h!O$<~UA=pE&F-^f#ZBi9?mcis zDfJB0)1%Z6XvdZ-b(;NEN*%sUsiSu(RYH4pwNmHN{t3fjRpbwhE!@^hf(HZ-3O*@# zNN`#3DZyNepMO~J8NnlhM+H{|^B(;?RlzmEV}j2LJ|}ow@Oi<{3ceutIl<2henIey zf+qyOBv=cs3vLK*3O0f#1y2c{790q^D0oJ2D7Ym!5*!O|3%(>c5u6In1a}0_3Z4^u zS@68zD}rAZ{EFbKf?pN!DtV=Phx}Yi@8pUVAYQz+7Y7 zrMb(VcRQGS3Flb`Jqq0k-2puX@w)5}Ks3J&UX$l=9kdk?nPdAP?jz)t&?$&(!8T=$ zjIGKV=fQTR_zu(7w({A9USKd_S1$rab`pbueb$ z{~(xar)`8hZvr#EjOAvCv7>Ft8+&XknD@hR+XQb1bKUgsfN120Eakk@F`I{>1FpZz zF`v(F>$`S>YuIBs|9J!rpAEGa;yz2>2XUVw?}zyQllh$a{*ZZ{8;%d6{n7Cuv_CmM zjP_^8kD>j=@#AQJb$kTv?~ae6{loDSXqVyPF&CbMXyjuM-v=^tZI9!p!F)I9KMwIf zjeG(c2Ga@<*Ux9u53P6pBG}vCG2=)3yD|BQe?Eq}O#3(I%xAnc=dC#W|2e??Eelh*U!j^X<}1aYrl43#17{oLP9K^w3*&pW_lrqvF0W~wHwnn|Uq zx?wP^YlA_OW+S@gox}R3t}3+KMkhLIn2E9ZwoxZd)HF%=bXA!)QJnEeZk0I65*=ja zX5KHEw2=huEQq-yV?BB*Kj40gaWrd^RQmztv?8|^HK-drROa)bm4Z|!EnN@Y1#6vp zB5$c=f^0q?YJbOrXeyl;F|5&OV>$>$SJmQ9)U26oFvw@DgfUCLu9eertA%^gVeTqN znMsmPJ9A4Ij$@B@z(`y%NvmXZHf{U;adW<3+;c6{Nrp95bYn(O8C5b3JwFz7<6p}} za4|#4u%cWr#A~4g!g_A%j|Z$?7pyp~7doJE9nMsd58gSVvreMJf)DyokX7O!%KR+F zPLh}?>$=bA%U$LiiJ7d&QO6Hgb3qtN$0TAW`zPbLIWQZzXySiP&rNnhtTN7m2Id2W zp^2sp7Kt#aVztn`*h#xLiRdIk~)k47V$4|ka#ueD7W7C1@X zFJu|wZ;+#Tzoc7u7))8$4^o7s4o}`6h?-R<%EECS##0?Jzn;sVOFkZNTV|*8^L6tf zKYlhfNy$tGk;(g`QGXcQ1=VH{z+qe-YoQI|OwsMW&)$bSYZU51h^)7+VyM&9AH?|s zmpVavqMVsl?yTt0WSQx{PsO;^!t=G);t!%a)9nCwec88>6b{=T4E2=D0NXEO6EVrK znKhwZj~Jh?k4JK+U0>TY5i#rNxuTP3Es!7eexvO{{{s9htfil4uvnyz?8lLOTkpk4&Ut{HLzqqZyeQKX5faFF*x-gGkt`165}?qAdehl#Xl?l zDKHL8prsItcgBbxIxHgj=g zEWlZKv*2c-%>tW+H4ADM(k!5lLnojD)DL|KeFS|B-GDxUK7~GmK8L=5zJ$JlzJ|Vm uzJ-RMTQSUI$UlP;Gyt*SVWH#W!-9jx9Am+88XAVqK#boA#5^2@D$rlTy#XZv literal 0 HcmV?d00001 diff --git a/gamma_age_v2/zarnbite.uti b/gamma_age_v2/zarnbite.uti new file mode 100644 index 0000000000000000000000000000000000000000..cdf35db74fbd4a5301e828aeb8f606e3df6e39a5 GIT binary patch literal 1094 zcmZ8g%TC)s6rJ*hQeFjGpg>kEk$?rL3nU0gO$8_-DT|8DB)$QQactR>1+4f8zJ&$f z!oR>do*4*S>G;0pKE^upuUV^H>}+oDDWwL1OP~Tge^F`)+8}ra{RDjv{d-8MN$3{{ zl$zrQ@&_0#Eu|uFfAv1qFo2fo7-0PXFz#*6-S9Trt8HKcV9h>28F5N6&p8jXE->cf zp&w^ZSWn^k{yjK5$hTlXPXVl*_JAsPoPj>|wjaq{=!HIe5jOt| z_he80FWT%$O$q;!K6?gX&v1YC40j7XdF}_W>vKP${{l@(GNY}WOK~n8r4Dr=H7f~H zrJST~ZQ?tL&U7M(97)m6xA>xbQNt0{jA20nQEcUjd;Veq;au literal 0 HcmV?d00001 diff --git a/gamma_age_v2/zarnproperties.uti b/gamma_age_v2/zarnproperties.uti new file mode 100644 index 0000000000000000000000000000000000000000..4743cc73a2902976943e569223953ab709905632 GIT binary patch literal 1369 zcmbW1+fEcg5QZBC58x3I&$6h1Ad(0-UXkEp;utg=cIAS2)9e&DVPPX&cQ8hYm3&jx-PKh!(_Qna6E$|$R#smtrN)2(E8yguQum;jN0rjh-=M!k zzlGBj^iK$sn&boW4qUXBQgO}xTC-2QJpmnrIY&SQt^lM}*S&ondez%Vuhzjh;GXw@ za=|IZb({Z(o4DlX8SgS+4hr{E=wGjcxr1B{2J|(+y{w5)81n|0^Y%?>#-oJqL7!W8 z#y#ve^W)pK`DxfO_)|>IQO+9E9tiyZ7BigDS!3D){t=VsMET#C+=C6SQ~OIEh>u1=FB>RcrBX{(H z+vuOoFSB1LUzPMy&b)mh8d1`blMMNgw~ml%?xfl z^uYV~y0TFeqD!})iZK#xx^fUd%kcI52vF;47!Uye}# literal 0 HcmV?d00001