From 5e7efff4e59be82e7afa80884f1a2af52440bf47 Mon Sep 17 00:00:00 2001 From: Jaysyn904 <68194417+Jaysyn904@users.noreply.github.com> Date: Sat, 12 Apr 2025 09:08:16 -0400 Subject: [PATCH] Fixed XP display for characters over 39th level Fixed XP display for characters over 39th level. Full compile. --- _module/ncs/alice_shop.ncs | Bin 158 -> 142 bytes _module/ncs/assplode.ncs | Bin 194 -> 162 bytes _module/ncs/client_enter_cs.ncs | Bin 4967 -> 5284 bytes _module/ncs/gelhn_hanselfast.ncs | Bin 158 -> 142 bytes _module/ncs/kgard_2_kwater.ncs | Bin 181 -> 149 bytes _module/ncs/kulkingspawn.ncs | Bin 198 -> 182 bytes _module/ncs/leo_shadowjump.ncs | Bin 214 -> 134 bytes _module/ncs/locktimer.ncs | Bin 194 -> 162 bytes _module/ncs/ls_atropos.ncs | Bin 199530 -> 199535 bytes _module/ncs/ls_clotho.ncs | Bin 199560 -> 199565 bytes _module/ncs/ls_lachesis.ncs | Bin 199589 -> 199594 bytes _module/ncs/madspark.ncs | Bin 199281 -> 199286 bytes _module/ncs/mod_gui.ncs | Bin 16443 -> 16580 bytes _module/ncs/mod_nui.ncs | Bin 32993 -> 33016 bytes _module/ncs/obj_us_chest.ncs | Bin 8360 -> 8303 bytes _module/ncs/rall_open_chest.ncs | Bin 198 -> 182 bytes _module/ncs/sail_inchyre_h1.ncs | Bin 161 -> 129 bytes _module/ncs/shop_a_guild.ncs | Bin 164 -> 148 bytes _module/ncs/shop_aman_armour.ncs | Bin 159 -> 143 bytes _module/ncs/shop_hatvendor.ncs | Bin 161 -> 145 bytes _module/ncs/shop_magic_hur.ncs | Bin 162 -> 146 bytes _module/ncs/shop_smithng.ncs | Bin 163 -> 147 bytes _module/ncs/trashcollect.ncs | Bin 170 -> 154 bytes _module/ncs/vaxtrigger.ncs | Bin 247 -> 215 bytes _module/nss/client_enter_cs.nss | 21 + _module/nss/nw_inc_gff.nss | 623 ++++++++++++++++ _module/nss/nw_inc_nui.nss | 1193 ++++++++++++++++++++++++++++++ 27 files changed, 1837 insertions(+) create mode 100644 _module/nss/nw_inc_gff.nss create mode 100644 _module/nss/nw_inc_nui.nss diff --git a/_module/ncs/alice_shop.ncs b/_module/ncs/alice_shop.ncs index bc99caea98d78ed0c6caf0895a5d3af2aefd26a5..e4b25c549b7c01f2607e5b61abeb636e8f1603c3 100644 GIT binary patch delta 32 mcmbQo*vBa9=NzmMW~gW2#K6GNCkG@LI20Hripx)Qi2?v?vj#Z; delta 49 zcmeBUoX05c=NzmMW~gW2#K6EXPYy^ha40Y^u}u_}=VN62|Ns9F1{P@sApK{eNfZDO C4h~)b diff --git a/_module/ncs/assplode.ncs b/_module/ncs/assplode.ncs index 12f13fec8903364d6e80973f52d5541b99337ce9..ecc788c406f9e39cdc9428bc6ac0d70a41b9aff8 100644 GIT binary patch delta 51 zcmX@axQJ2P&pB8j%uvt3iGhJ(ksOd<;80*-VFNK(85pA&S(q6Z7(vVk#);nL0MnWV A$^ZZW delta 83 zcmZ3)c!<&4&pB8j%uvt3iGhLPkQ|U;;80*-Vq;+gF>*W{5!e9~fA~6u@SE z5mNvf8^b7~4AjWT1*AYWXrfvnBFzAF{2vIZzyLN9Xap+*OXK7OJj9{TZV4-G^ s6ZnEtOG0w8{mW8|iZWADfg;>~;eHYE0Xd14sYO7I4NRMF3-&Mq0H%~s;Q#;t delta 57 zcmZ3Y`CLud&pB8j%uvt3iGe{lU5)_=I5x`rFfv+B&SBJMte?D$F`kM4&tw}W<;_}5 Mm-#m<2)8f-0Fe6*fdBvi diff --git a/_module/ncs/gelhn_hanselfast.ncs b/_module/ncs/gelhn_hanselfast.ncs index 3707a2d45c91cb6da5d129f94808090b6992d7b6..29ca1323e8df3be8fbdfee476762f1dd4ecd07ec 100644 GIT binary patch delta 32 mcmbQo*vBa9=NzmMW~gW2#K6GNCkG@LI20Hripx)Qi2?v?vj#Z; delta 49 zcmeBUoX05c=NzmMW~gW2#K6EXPYy^ha40Y^u}u_}=VN62|Ns9F1{P@sApK{eNfZDO C4h~)b diff --git a/_module/ncs/kgard_2_kwater.ncs b/_module/ncs/kgard_2_kwater.ncs index ac506230dd2cbb2d33153537337b38164f95eb89..391bf60ac8afbb2ffccfc97ac5bf449aed0ba62d 100644 GIT binary patch delta 56 zcmdnWIF*st&pB8j%uvt3iGhJ(>O@|B`50CPMmGi)Rt5pbqN2>Q)cEqmlGLJ-qQnAL L28N@I6RWKNbiEFG delta 88 zcmbQrxRsID&pB8j%uvt3iGhJ(>qK6C`x+)TRt82l21dsJ|NsABV3B43(tnuPSXdbZ f9E*xF%TnXZ6H8KyN{SK-SQ!|OGNLM+7;OarlSv-v diff --git a/_module/ncs/kulkingspawn.ncs b/_module/ncs/kulkingspawn.ncs index 06ce81eddce4db454c91769f2fbbdef60d6a9b52..656bf0f244e8919e1f9ba3e033ad2d00d4460736 100644 GIT binary patch delta 52 zcmX@cxQ&t5&pB8j%uvt3iGhJ(+eBVfX%=Q6i-Cm=OtLbtg=7@v=cTeTFg#_R7@G+I D2z3e{ delta 68 zcmdnSc#M(P&pB8j%uvt3iGhLP*hF4cZ6-DrW+0n^g$+!yGO&eY6y@iovNA9{WoBgj S|Ns9F1{P@sApK{eZzcfY)e=Sk diff --git a/_module/ncs/leo_shadowjump.ncs b/_module/ncs/leo_shadowjump.ncs index 2d718305c8f7ebb20f8d4474e7a2df6eab38f495..7b3c6a8ff86208cf0dba485afb3a8286e55bf3de 100644 GIT binary patch delta 70 zcmcb{*v4q*=NzmMW~gW2#K6GNCI=)KI20II85nnfh+QCJI|DQ0|NsBLFtD&PFkEE> ObAEt1D;OvCc>n+!v=Oxc literal 214 zcmeZs4ps;=)H85mU|_f=2P7Cc6d0J;SQ!|1FfcOy|Ns971B)~Rkp2S}+=WeWJG!6{ zGf3wL1{PKZhO3Nd#;}4VzknrIph@ZofLs6sBC;S-lZ6>Xfk{S~HZc7Fto;m&0t1-) O2Fzt+0=x8$0s{cHs!0+6 diff --git a/_module/ncs/locktimer.ncs b/_module/ncs/locktimer.ncs index 3eb9fa4ed8bf40979bfc3302232eb5502b0f4732..2d6b8aa85510d9280f234175bb657754d1004f2d 100644 GIT binary patch delta 49 zcmX@axQJ2I&pB8j%uvt3iGhJ(ksOd<;80+g*eE5y%=rKR|33^YEX+VLMiGUH@yP%e C^$S}7 delta 80 zcmZ3)c!*KV&pB8j%uvt3iGhLPkQ|U;;80*-nwTK1$H@5q|NkEhEYb`>`VSK`GnCK5 P3{=D@qJSzt(LNafsBs&6 diff --git a/_module/ncs/ls_atropos.ncs b/_module/ncs/ls_atropos.ncs index 2cf43942ec8f08e1c2593ece9e3fe699067916c3..ff708020228488320779bb95ca0d3faaaeb0c72b 100644 GIT binary patch delta 929 zcmZuvT}TvR6rFo!c4s$DOJ@|*bj?yR5UZysQ(K6%T#SA!u<#*$vxRynsE|;r2gPV= zueuUZ1cJZYg7aXOQ5qG2JyaCsKV%{l=2Nk5GqV;+z05b?z2}^J&%NKAFZ!!5dbP)W z&~;=>Zr*M|jPeFn`$5ILb_Vgm2e?p3=eekX)H;v*ipNd5$BhLK*9IXw=LJa;1wqKs z9_J-P7#$&IxTi_1!q>awCz zV&t?XFfCF750xT{r!-QvC69y81rfukC6GBzgX)~I1WX`{V%sqy`Sn&P{K$`3ioTwza*Z1f zp7$e$j_^-E%5f*e-Yz7ww;c}gz3eihF1@WCEwPa7JbBNcd+%W_AM1ijQzkeg?V%i* z$I-}Qi>rV4X%r1}4hOohnfCIhE@LMi7Q4|QSDF3PcJlphoRvSDmyw5jsmGX9Q=x;` zw7|yYJ;;!KR;tEKP2kPn4P5QT8Tdkas27<8QaR8EMc*F4VbE2*IfyDJ&1&ffRLz^O z>S==*1AWobv*WqxHXM4=5Ozsa$48%Hfj)52TO@FqW<2BSVN{aB&xTPzsVn0<^y4GA zW2e&oR|tue#7m=wqwo60*EnUT5?yztN2M@zRTIr%naaMbMFB4l0{a_SU2 z&jnD%C2dGyn}SU1g081VB6^ro-5gWku;gqhrba(;lL8O_2_R4JmR~9GCMQ}^qg9*H ze16*sE0?vydpItfBuR(xU*GCtDAjFDOm;*s@mn$^de^-L?rleg(im~U-m45$7V@^^ zFte!x*31oNiruYqm)0|@*ea8gV>igd^M33Qw>wZ_pgJ+xg)yQg4s;`%9`Mvb*tb{g zPSi8~ zjo{+eFw8W@!7z5wetsQB0add4%bY!XYeg@C&r8eGicl!!ZNh=QHoILNgk~*%R>b^Kp16lPAYfOu0HU4u3P! zNs;ssYcgfAJQZiGiak@fY@`|y{DM3am2+$wpQ)Z7&p_3#S$v>};`AKO?xcM@x`r+~ RFY5jxXrzl`*&yFC{sSU)2@wDQ diff --git a/_module/ncs/ls_clotho.ncs b/_module/ncs/ls_clotho.ncs index 321d9cae2ce505be6accf829cd633f2c57dc2c96..04c08b4181cccfb877fbc90734bfe212c39d4f0b 100644 GIT binary patch delta 906 zcmZXRTWm`K9LCT8JEuLZb{3o}W_7G{8_|guf=t?^5t3yKwusyIz>5$g;$cE+b9-pA z#s zs-;Ta{M$C2BN}`(p>^!>a`yo^IF`m_n&2u8WzP3jaIUw9Yc=?t`8v7O2xm3S``6Uh z3bz&r%KTJA#a}M`A9v&urW)a!&tgf~2)7Bsauf}b`xJMn_WYPDt=7L5TF(z+n5+TP zHh~(Us0w!sW0rp+FDn-fxm>gsP+8=b6kfIligq#MsNP_CEvUG}Bt^AMg)|`#T28OF zWOapp<{Y+4RHuLF#30c&t)l0W-?@Yo^_c)b6IaTrF1Qyde{+Td#T+4HlxF+v1FMF(qN0T@# ze>8tG_qg{eX7OI5Jnz4Wg>uZ2_vYpPo5;{}Gk+0ZzlHsXW%aUN%qJqga~m~!B!$JG z(|R(ET~6a9_XiQsgLg3ot>uWK2L=$9gb(O$+#07M;|j@B5AOb~$XF Q^#|A3#0ouN6Svs^0G9G4O#lD@ delta 807 zcmYjOTS!z<6uo=hdHTrA8D%CL$0i@8m{K44Wu#yxX(4G5nG*I<6g@yGDIL->N=UD^ zwI<2@DVR}5p$maoj7|^~2}M{qDt;tlA<;)aHr=_SgJ0*Ywf9}0IhBcv8Z833wFKoQ6 z13S376H%Ne!D3t#G>Tntc$h0BIE-^)=>5n|64Kb(fedviTHz@PnUQ*Fq@Ky;U5Jua zn)O`Mh4doDP%8*~08yl1Ft}#8)E{lvg=6Ha{2xIRUR*_rNJXP+YLiquyrYU7F$jX5ml*R+~*djmeMu~=w$xFTP5!FhUk0u!vap=|N z?(&20Fl{c`zCJb-{&_styn>kv+%RyQ3!CU9+gzx^0Jy;ghZxY?Lxf!(bD<}Wj6B<~ zw4Zk)oqlkq8;%s8J{<0N_&-X{ZuIBf{Mn5xI{eUsG^&uC4GEm@LAU-~Xs4!O{^CJ{ zemMmEKECOJl`jk;SN~XLu7sGaJU)m?`WBgN;=v(Y0z4?S5D?VuD;xSBve#xnCa6&_E+&F>XG|OZZZG3+cr^v!flPDlZgxV)J z`|(Uidu7K5tcqmg)F~yxU%7Y+7j;xFzx;{}Jr!{vfKOD(D+@?s|11`j`_LTT(>?k6 aJgSo^o2OUNOLg+qf9TOssT`vfox1$1qBgW3K5l~ zUjGmjE6~+6p?S&#ZJ|O#!XnYsh}1AD@*#q4nwd3GdYNzT{mwb}o;!E$lf9elj-1R> zQeo<@l*1fv>mG2t0m~koN8LeoMIKH_tZL7!Y0qRzdnRUbC_{#yDDWJ|CDQd8Ncn<8 ziq;~o5xgMkFW`Bms_HZ+L~*LO`iA~&d1YWKHH=OTFc2%8U_^pT@|~f+(-cB6^@w7N zlzSJURFMG-rOEJ*Tht}B0wuZ_3-yT|k1@nP8RgXe9y%u@*6ORS4!of7dc>`ll7E%k z*)lE3NLWK<{fDCF4g_hm%6cRp)wE3TJD(} zqRp7Fs&>9NOZu&(OtzsZ0D?#zT{_Q=K)PH2hwec8u4>)KHL^b&qH#AOSt2dFk;INs zSg$tu9QnfS5Gv_{AC>l^)?BWy!?hmz+KWr(1wHT#(bz+TQ^^51sICvO=0+oZ-j{yc z2M;FKH!$)D7t!cd()zKTfw|~jlC~z_9wT09A3zdVt@3gZ2H^a;)CPvz_cDnxcd8Gna(vo*sdG5t?ikyDPiD0miwERPP&X}x}!#iBJY zQr}|RPEOB-(ZU?M*-fQx9;Fd1o_=`I%*vEof6yeFcNlx|n~F{RRwdiSpBDcDL%S+j delta 847 zcmY*XZAg<*6n^jXZhN=f6l-&2rpu+0ni~BoQOpTpORX$T!bHf3g3yBclay5Sh2VCL z)ksQ`*rVm&NSGIo>ERO%?V zRqV>jDHO!0Zog>^Y=2-1?gDm+7!xggVTa|q*Ky11V6xYNkEJ|RXELX21y%`-CN@NAW;Y{bxf<+O^9ku4DB0-l^-h9#INhruXM(%HD+F$nMiwG*iO#^ zkk~9833H@&=sTCj zDNI^H*bRsx3xz@}Oy3?x*>n*HdsO_lpowT!Bc(}=0;*v%cipwa?B!n$WKl^Q^yy9& zSIz$4zQJr$31(LaoV=;YLR})$(qbb^q4{iVln3skSi_FVQU`_@tL29itOjL%_yvP^ z=zAyZES6$C$Y3WZ*Mmwt0{L@bp&k#S#YxE)Ms4zh2W>Gh=xEzxn0Y~cEVcK-!oI4t zJ2k61!tdxFk|Ji0M^;mOdevq)OWE|RSD98qTly0k z_JeBNim|y|Smc@kOoIL7vBpg_(gnR-HHdtTbX(noo|iRSDDVQ~yuoND?@OG~Z;oV? zWgj(D^04xSu6`-m03h=e ASO5S3 diff --git a/_module/ncs/madspark.ncs b/_module/ncs/madspark.ncs index a858b8f71ab41d6af2ff90dab2aa52116f776db6..aa7587cc79bfca3799f357680657cedc0bab950e 100644 GIT binary patch delta 942 zcmaJ>Y)b}x64aH zJK|q!gxO2DTAIXIls%|HBw-H)Md=bkYx!U$5#h4U%!(jHFLUO6=ezv>f6n(V+pjL0 zy=q^byM9N(_A)`Vo*%Y*K_^Ch7~D%2J3M7qJY}SM%3!MISRbsiBnpC%$G1n3q}15V zha|gulZFW05G7gvfhbZW68R`dX+k9Iy`+EruMEyvjibxs491cm89T}8j;^lg8k5M) zHY6&Zd^3eO{W@Gq=T39ca*CkYF0a^!bbBqVQ8y-6)VMO;FrG7_BSQf$@gZ|vw35j1 zOCtsG|8nQw@noX~e&oZJRYCdx1TDQt(8?=Su(enVj1hz)tZ6;+^;WD~jt*z1QP<*1 z!_oHVxK}|UpBsQ9L+eJ*a@>v)C{;9Om9<79arHHFaw(Cy@PI~YfI(X8YjwB{(TbZ8 zB^pYLmQDJ#1eIWRG8dP?sd~FmDN&93`Ub{{jwo$4E*?4sSqulg+?D|czwjfDY)W&L zlfU_qNcG&_12<>%pagwkKHP&$dat(j;7J@wyeoj+^jSw!EDO;q@QtxQfK;z|KvB$TW2u@M#@R;k$#F zq_=uluHvwz^T>TvqdTlh50FjJW;ESNE-oF0RXsR_3eZ)x`ypB^6jGY^H*i1jw{Arw#X}{`!ha8h-uhVTzd`Wqe;N;m)7@=C84#LI#GYDB~Q}u@%yG`J> k1tjsvEc)rP+7v|7M#|x5%eYC$)P^u_$keDViekI`7eWsz`v3p{ delta 886 zcmY*XTS!z<6uo=h>%Di>VQ?I?hcn$~vY_Wk9~LB;MPQ-^k`g^gt&b#%is~nNkWm&9 zc?PyQnApP}T8;T}`sg89eN==J83d(JkUcSwh)5>yoh_w@9kH zWLcS2o-;38ps2|^I^4COD$W^1dgnznE}=b#^9zpV7m&;^fKkfvG)fXZo6P)KNeWd! zQx!$g+}705O}PS9)9nLPmE!UEfT9JI_(*M&y*9peFh@o)c8!M*y+CHbK8|BD|1eE< zFh0?{W(r%UkrNEqtm|zC%1kg6PIEK{9gTP_#*6C_awR0=9nbhvJ+kfEnPV**+*Oa@ zUqsPAgvh<%rNISI%9|Mkf}iz$M1&WpehP5WKK6E^wrJ__=pTzF+&1ce%{md_i|O;jlk zuFB-tR_N-;Kph_p!pBb<;h{89S(3p+jhH}d*@&V7=fNAJ2&r!j%f7H=YZMJ0xODDl zflrifPh(jDw`(Xdz54eye2VMypRk*o+u*19e5VbwshB^sA)CtB(~iqVjs2JhVtlt9 zdyUU_@Ti;5wqi0DM__U|4@q2o4Iv}yQg?B%|dUMhk zz$)|c*9VwRq49u)a?3-U)2T?NKE;Si0Z#52_4Y%Cd$3KXQrX;xnTBh5hDG)d9u~dc z41V_-om9@1?~%zj-eAyG?zcZ;%3Q_1o5;8Nag|QU>H%!XqB(s37tYXTxo!jvx>4mk P`%j*$sX^)2)HV8VR6G`& diff --git a/_module/ncs/mod_gui.ncs b/_module/ncs/mod_gui.ncs index 410d992cf6d333ee984b8d71aa85e6f3d79d1f33..da11223876396bf54f8ad0c16952f627f5e67527 100644 GIT binary patch delta 2062 zcmaJ>T}&KR6rOu$W_Na%{r{P=KkUy?ByAypwp9yl(KbdyiU?_JYJs+_bPaSV-AH&4 z=z|*57>eh~^u;tjsL`OM=}W6sOALZiY8#-DR1$gcFA=3JSc!P%?(EFAslMDfbI&>V zeD|L3I~NAX=m}!q^JHUeZ)JJK6CAg5^b`9Sp~4c(khjS}I7X|SXL+)=w)PVz6mcAv z=zYi>02j=3TK5A*zv1WpaS#HW&Mv`{ty3b z)*o%w{a}@>uv@I6kC#HPxXHRL!CZ(FhOB@Yt?j*p-a8Tt!xo- z0p<%E1dbE0fYTa>K931bSssJ zeK5AryJPI+{|}R4(pyJN52O*&JyL{XT6vC1=R04BN=M*#-xk>De`p;NpNU4JU6mTS zoS`z*27J=;3#|L&*xnFh)r8;vpsa`0tUJH5EWi00ORB}B8gds-2NZG$F5&tL{1|8= zN02%t&@B7Nc{na_B#hBWZo7bmn;FxmWf$p1s?|V`C8BOG>in7tn(1;W@+(1?uW2-{ zQ$s$(_(pnXm&#)}Q|L9nregYQ0*M<#|LwQX--HmH=uQQLq>;tnx`7)CDo=(1q|UmK zPsaJt)t&B2c4u&=tgZdA#_l!%?lON+Je=-GceCx;d;ywwVM~4RK`2Pg`=G+2z|SE$ zdjCoFEJYh+=25(=!eGSVvuMP{VGt!#gGDDzh+kwCO%o5yc*DyyARg=83;e;I@mI529Jpk7%;pHht5ysG4sEW$@h4wVR3^?hk%Re96s)6h1< z{y5LRqT6b}w!%LfOi*5ZZ{fYw*@g@{BuO2Y-RX1&n#)40;U}vLb(A0GB~Iqqi+M5b i8UyX-8Us{QO_BbDBT)sS#V?KYY)=w8cM5LqIPfn_qJLEY delta 2447 zcmb7FeQXnD7{B*=y>_Kt+qG-Aw!2>MHbhp&x`huJ8+Gu9D47sM76{gEJCPKf9|<^ zpReEZywCHyGrQ1_%Q?jA=fMx?06GX;*amCA4oyx@USl|c zVHl|e?7S1svg^@xtPR=3%Z2K|fTp&=tGXJ)D^xcOQGPajuWPLw@iI8nZPv}YRgD^y zy$bbQxr3D?&dqSit?_tXLMs=x>u_F%D|o^#&au$wV%>#@+Pj`HZtIF_9pfKz;dtlMB zT6oW}TDO~ZL%+{UxyZL~^ndj?VJJ$&#m0cab0WC-$2QdrYR_Oekh` zDLtK;SUMX^B?$)fHF+9+Fldrk?$P2<&H@PB4h@3tmmcFtm~c%zBEv8W z0lNc4^J*CLiE!G&_jSaQU9{6T7*3DxP&fUdyM*wOIk`2_p=2VPEM8w`R}^2!+cbWBUkwreW|=uZ{MA=3NIT?0$B_rd`P#dOT95ss%@lX7&{O&tf$~ znHphQ6@-4rD&6sio=d!bUIB06?Qw`W>(~+w_Bt2BDd)WPR~YU-8>LNk1M$1H;XX#@ z&Qu~DSGGrDStUU&>&euWz#2({(;frP!IM1g56sg@yvIL$*gWGe)9GG=N4EyPDX%c> z*JgCgRbGN8g;x6<%yP-77v{U3L0x#_XTv8hCtmJTu3EGfZ>Y$T(!lDL(bj_fsD`v# zL?bwK1FFU=A+fhEXgj%zcnlTTF2)Dr;s3Filaqf71l*kzUQ7bu=FYpq-R!1N>ncj& z{YnpNzDs@ME3B5`kkbMCD)rFjsd!-~Ixwa)skD;G_L5{{uhH(d(;nSsILgQqgpp?? zQ+;PDp2|?iRrwVl?dIRbSX}U>r-J1V!Uf^Vm|V*xnX$2_l{Jsu9!o-t5sN<_7zB_@6?^Y)Zm-m1Mn&cb=4?Csi`nrnn<4*yu7w1rL>P3Mz-35~Pwm zfMHl^QS-dmQVThsA5wnj<9V&hCI%%L?T9NgkR_%-!Zx(w#ptj5)tr@LHO<{7id6QA zf!cg@j2jn!nG|n|W-`&rRwd)cyGfY-(TgqrTB^3i(=1RVE1OkBy_)=3JHOJbA~Ut9Ko+&gefhTG z%f}tF_QZB5k^y8vxr*z@J`+wP;r*_=t)J#Dp7>=&p83y*(R-lW} RR-HJuOhN2V<CsnR8$lVGws~7%jiDb-}imz_xqji`_6|VDHVz5 zL}!oQ*PKXpAatel$a4wf4w%LR_zP^{e!KujNRM|&L-ea|L}3aS;)}P)fR8wTz#o4% z-Va@TXRRGMQscSv69tpu9OCTAeU#;iM8b}2E11=bu*@4c2)A1ka6@u~DtNE}SO`Iv z5Cl>7!#P34b&%qD!;Y%bg^A&*(ZbnGJ~d_P9j9z~cX#(E;>^t5MBRAU6nt1_kw^4l zgL+4yU2MW3$cYWO(e#34k@xofuXVLrS}$>`me@;Nai)F{kRUCEu*fqUib->ig=UzM3=J+veGu9P0|;me=a>bk)g>;1cxK_ za6nb@8(4MoFrq3D&q{DjjWB$uh8ezA2Pi6VP~%ztZJdLC&ClYzc9ra`!D=iz%p z6nev-@EkQhhEGE=lB@`pB4zXU5slSsdN&@XGb(UKH)utH8NJMStm~HbK4{NZL3LEd zgValb_NY|xOGN_~s~+x06J%?eUTVNjw27Iu#RPWT8X2;aRMOael|j^Y{&s zam=||toWo6WVJlSv9Jr0*=m?EtOgC$JoBt0j;_;@&gC=NJcP44lnk~pH{CXSsTF8G NuHf~>g}p6<{{ZYr85sZo delta 1396 zcmaJ=T}TvB6u$TF%)0)i>;CVo`!lQincp7{$BsEBJ_a;j_>}Ix99-Bl;{^iM$ks%oFFy?n+|n zfFD(xFhHB7b+thyaQZiojIl$hfuy3w6kX+bRJ@k$!{IQG4AWRWH)UYPW--4-$bhri z>{rC8r^R>S!X7L1H}SBKZTgZ(YVmO ztXoM&2W90zJRKWUMUA5c7WY+ScxeUHol5m1Zu$oWohKzYJ~7qtc9$N=xx*Zz>U2n?k;@TR6{TpDmCz>tww! z>?|XEDVXg7Tyok8Uj+}G%L!kjhO$0#n_1%gPF6Vl6eD8TG zW0>CFdbE>WZ*CF=f% z>`%nOY?BCMeO71@%n)m^LPRuzELaTG8cqozhEIeb!*4=YAfFQb4`@z&BGxS>3Q~YE zkHFZIo>7uDLiV5?_En3pV@QB=)pK|XPI}kl5t#8t7_G`DGHmmSrFrpuV&lFLp7?WD z?|oVtR)2s+Z16A58LfcJ{vdu0v0*oS@Y~pFNkC&wdK#cF5GFsCQsW>z3^cIMzXBeH zb)ts5M9(7o8{(>k^(wNGkP7P!1l>$&YtYMZIOt<|Er)M%=OrO6p*11RQ4R%1@&&(S z-K@yShoxvwDw$EzF*&Ie_^{2i#*^Z`|L4&$q_@NEPyJ1Vc9)I#6oRTI3%v92WZDn7 L%{B2ZQb0g diff --git a/_module/ncs/obj_us_chest.ncs b/_module/ncs/obj_us_chest.ncs index fe3f334b262839bd03a4eacb535c49676f4826d3..f95d9ba2074865d8ba2e130cd764ec932d39c29a 100644 GIT binary patch delta 1918 zcmah}Z)h839KL(+F1gG7NpidVX)kS>)G=&l);eUZpVkhYQ<;^@zKl}RoMRL)_^BD9a@l%wEYl3Nl`n>y2dtPgG(Z90N(O+!u!bBCorC} zl`dsQh~F73A@!5@R4OGf+%oIp+EKWIx_Rvu_S&a}x{2^=jga9@#;thEpfuzZ1~Yj~ zK?sFwhmmzBv?Q+hkPZiHm1?$6IJ zhr6!shK~~2 zL;U22a)m5@xx~O^BmuYmR*+la9;_2i222V%PDSTJZLk=~p#QGHbR-7H_lWR(@DFr< zmGJlLt?Y*|rZ-dg&ghR(&;`Afg0AZ?pnG3#DGabr!}&c)O4v_S^j|7!8k6{lpEXhx zo)sfOLGK%TDX80kmqJY(_bZ1d*Z^;Y^qv1RAw7ukUG1F<9Yc2uuol<{Q-%Uhge7#h z1G>VriUz`QisnRkFRTVd|K|41LB@O?eluu;TME;Buj@}iOjlG-xtPva_^PQ^@2o*j z3_cr#kBwc delta 1967 zcma)7Z)h837{7b(F1gF!OVa#rn5ViAxvRB~ z*@@p=)nyNYOxOoO7?X*m!aj8(Dk3UY(GNrXuuq+!#^J#IZG7*2FHJ(5u`l<_d++c4 zJc|aU89xdyp+wy)c;P z@S5RUp8_M6E2Vrz(KLhXddhgZITS>}HXc1AFmi*P)=Q;=u9nFuL;~KT0o?%0mIE-( z1`fDSb`)~tONCskh*NJ95nze!NA8y(#wCzjr|>Rp7%xA9A1qN=7Xoma=iwNV_qUeR zNY$b#nM!tsc#z`-Mmj>)sZ>f}xHXm(dI~)qGE0clz}*x{@=p zk}h;$3B}B;LV`&r4Wj%6c!W568m?QT*a8b26@saU*Dc;7S>7;5={j7p?j-Kn-!$DD zIN_MU@dd_VG-6)WXL6Oyd~0pC%p>~KreGv2T3dA-J77>uAlne>rfnR1br{(v&slpO zm$Hu%0*0(U*=lRmwD%KDX)n=~Cd~;+vL~=fgE8AKQkpqqB~58PD~^z};tS-gX!I@) z?~A*Um@#?>>!LG!7M~9?D3QQVzBpGXG!Xt1ho9cgd;5GYomWb;ie6bTJm7!duDftp z3QFJ8t~mF?taKK+&aBj>ITrbu932U6X2Q)?kCo0T5)c6TB)Ru z7czORx!GX;!(a|&$|kd1QL?J0mWo^1e>T}RU3pbcd$-EMP457VxfBkEfG=E8f`6G9 zcE644UBCvrL3Ro7t@{tOA;SGY9DbFP?3Zvy?j`(w&tn9Sd6ERHo-y=5+&owJOtJ64 zls7>(&zN}C#GBqF_8h$KOOf4GUz}jgw}W8VJphwkJse-=;FO6Un|Q5j6x|($XMB6? zd_mRpUi`V=MKJBBf!_1Sh{V@^Ds|6KrJoGYb=9*E#{3SaMJs2r3cjxJopA@21Ec8n zC%DMx;tkjF#f@zjbX6~G4jkzoECwSa#HAoL;#!b~ltL8uhv@s65Dk4k)J^!`gp!L5 z^iH`;80*-Vq;}sc*nrV`2YX^9}Fzg3_$wNM5#Fd DEujxF diff --git a/_module/ncs/sail_inchyre_h1.ncs b/_module/ncs/sail_inchyre_h1.ncs index 9acf9687cdbbb8d0a7ef715b5c696c59e78ff0f1..f788738a366d151bc10bfa3bd549e871185d83f4 100644 GIT binary patch delta 53 zcmZ3;*vQE1=NzmMW~gW2#K6GNIFVOQhLwTg9|H?31D|JJaz!2T delta 66 zcmZoE)_t0({y Cj1GJN diff --git a/_module/ncs/shop_aman_armour.ncs b/_module/ncs/shop_aman_armour.ncs index 965433b3501bba3d5e4c6652f2978f3f19f9feae..563d66c535657ef8f6ef1bf93d4b38878f88519b 100644 GIT binary patch delta 32 mcmbQw*v}~H=NzmMW~gW2#K6GNF9#$TI20HriYrWXjRF8{1_nL= delta 49 zcmeBYoX;rk=NzmMW~gW2#K6EXUk*qxa40Y^u}u_J;A3R`|Ns9F1{P@sApK{eX%qku CqYh&L diff --git a/_module/ncs/shop_hatvendor.ncs b/_module/ncs/shop_hatvendor.ncs index 55304fe3c77b319e60fb44c0fbf26075c81f59f9..a9fb22d9128e297b0c19eaac461edd743323e806 100644 GIT binary patch delta 32 mcmZ3;IFV7*&pB8j%uvt3iGhJ(q8yN5;80+gD6TZoJqiG9tOiH` delta 49 zcmbQpxR6oY&pB8j%uvt3iGhJ(p&XE4;80*-Vw)(c#K*|^|Ns9V3@p+NK>E)_^C$oj C%?@n< diff --git a/_module/ncs/shop_magic_hur.ncs b/_module/ncs/shop_magic_hur.ncs index d7b4ef1630f46e1455793aa1846725bbdec49288..ff1b8ba555e72e9dc88166af1323d11b159470d6 100644 GIT binary patch delta 32 mcmZ3)IEhiz&pB8j%uvt3iGhJ(k{pm=;80+gD6TxwBMJa){{~F} delta 49 zcmbQlxQJ2Q&pB8j%uvt3iGhJ(ksOd<;80*-Vw)(c%*V+1|Ns9V3@p+NK>E)_izomR CVh(Zu diff --git a/_module/ncs/shop_smithng.ncs b/_module/ncs/shop_smithng.ncs index e5b76d88ad83e67558dc2c310d38763d82fc7303..05ea92030a8af16c5c7262c0c1b2ef9c0e3bc3c8 100644 GIT binary patch delta 32 mcmZ3?IGIt@&pB8j%uvt3iGhJ(vK)|L;80+gD6TTmGYSB0QU+20 delta 49 zcmbQtxR_Dg&pB8j%uvt3iGhJ(u^fE)_%P0U6 C_YQXe diff --git a/_module/ncs/trashcollect.ncs b/_module/ncs/trashcollect.ncs index d115e38aa53423cc6cf446e42ff35d6bfe3995ef..ba8ce37eaab22a672fd96c229411547888bf50bd 100644 GIT binary patch delta 52 zcmZ3*IEzuo&pB8j%uvt3iGhJ(mK=~^;80*-VFuESENmbyn9an>!0?!PqD>wE&G-ht delta 68 zcmbQmxQfxn&pB8j%uvt3iGhJ(l^l>@;80*-Vq;+jvKU#|KmuSk6DtG5V`fIi|NsC0 PU|^AE0MdUZ>f`|cc?AyU diff --git a/_module/ncs/vaxtrigger.ncs b/_module/ncs/vaxtrigger.ncs index 6765b17e0e327bafad1b4c411fdec75ba92c227b..3f84a408c3b65fe28cfa4b3effdc77f6054e4b8e 100644 GIT binary patch delta 64 zcmey)c%9M0&pB8j%uvt3iGhLPx*U*T;80*-VFNK(85piIvM>W#j1U19RtDy<#0sGJ JQ|5^g^8s493HSg2 delta 76 zcmcc4_?^+n&pB8j%uvt3iGhLPyBv^U;80*-5@KNkFV1Caj1 P#5Peuf)7<}qQ!gw<`5Xk diff --git a/_module/nss/client_enter_cs.nss b/_module/nss/client_enter_cs.nss index 7856f5aa..528e92e2 100644 --- a/_module/nss/client_enter_cs.nss +++ b/_module/nss/client_enter_cs.nss @@ -13,12 +13,30 @@ #include "enterinc" #include "pqj_inc" #include "nwnx_webhook" +#include "nwnx_player" #include "inc_examine" #include "inc_gennui" //:: AmonBot Webhook const string NWNX_DISCORD_URL = "/api/webhooks/1187525263693725706/oRFVnrx9qq7mxmpwOaslNgaQoaVAchTlK-NGFOHv4_2fJMdl-AIAVfpid8L_Lm3gs3Qq/slack"; +void SetTlkOverrideForMaximumLevel(object oPC); + +void SetTlkOverrideForMaximumLevel(object oPC) +{ + int nLevel = GetHitDice(oPC); + + if (nLevel < 40) + { + NWNX_Player_SetTlkOverride(oPC, 315, ""); + } + else + { + NWNX_Player_SetTlkOverride(oPC, 315, "Next Level: " + IntToString((nLevel + 1) * nLevel * 500) + "\n"); + } +} + + void main() { //:: Declare Major Variables @@ -43,6 +61,9 @@ void main() SetLocalInt(oPC,"stables",1); GPA_HorseOCL(oPC); + +//:: Fix XP display for 40+ lvl PCs + SetTlkOverrideForMaximumLevel(oPC); // Make sure PC isn't set to Plot, for reasons SetPlotFlag(oPC, FALSE); diff --git a/_module/nss/nw_inc_gff.nss b/_module/nss/nw_inc_gff.nss new file mode 100644 index 00000000..533cf218 --- /dev/null +++ b/_module/nss/nw_inc_gff.nss @@ -0,0 +1,623 @@ +// This is a helper library for advanced use: It allows constructing arbitrary gff data. +// You can then spawn your object via JsonToObject(). +// +// The data format is the same as https://github.com/niv/neverwinter.nim@1.4.3+. +// +// Example: +// +// json j = GffCreateObject(OBJECT_TYPE_ITEM); +// j = GffAddInt(j, "BaseItem", BASE_ITEM_BELT); +// j = GffAddInt(j, "ModelPart1", 12); +// j = GffAddLocString(j, "LocalizedName", "hi!"); +// object belt = JsonToObject(j, GetLocation(OBJECT_SELF)); + + +const string GFF_FIELD_TYPE_STRUCT = "struct"; +const string GFF_FIELD_TYPE_LIST = "list"; +const string GFF_FIELD_TYPE_BYTE = "byte"; +const string GFF_FIELD_TYPE_CHAR = "char"; +const string GFF_FIELD_TYPE_WORD = "word"; +const string GFF_FIELD_TYPE_SHORT = "short"; +const string GFF_FIELD_TYPE_DWORD = "dword"; +const string GFF_FIELD_TYPE_INT = "int"; +const string GFF_FIELD_TYPE_DWORD64 = "dword64"; +const string GFF_FIELD_TYPE_INT64 = "int64"; +const string GFF_FIELD_TYPE_FLOAT = "float"; +const string GFF_FIELD_TYPE_DOUBLE = "double"; +const string GFF_FIELD_TYPE_RESREF = "resref"; +const string GFF_FIELD_TYPE_STRING = "cexostring"; +const string GFF_FIELD_TYPE_LOC_STRING = "cexolocstring"; + + +// Create a empty object of the given type. You need to manually fill in all +// GFF data with GffAddXXX. This will require understanding of the GFF file format +// and what data fields each object type requires. +json GffCreateObject(int nObjectType); +// Create a combined area format(CAF) object. You need to manually create the ARE and GIT objects with their required data fields. +json GffCreateArea(json jARE, json jGIT); + +// Returns the OBJECT_TYPE_* of jGff. +// Note: Will return 0 for invalid object types, including areas. +int GffGetObjectType(json jGff); +// Returns TRUE if jGff is a combined area format(CAF) object. +int GffGetIsArea(json jGff); + +// Returns TRUE if a field named sLabel of sType exists in jGff. +// * sLabel: Can be a json pointer(path) without the starting /, see the documentation of JsonPointer() for details. +// * sType: An optional GFF_FIELD_TYPE_*, leave empty to check if sLabel exists regardless of type. +int GffGetFieldExists(json jGff, string sLabel, string sType = ""); + + +// Add a new field, will overwrite any existing fields with the same label even if the type is different. +// Returns a json null value on error with GetJsonError() filled in. +// +// sLabel can be a json pointer(path) without the starting /, see the documentation of JsonPointer() for details. +// For example, to add the tag of an area to an empty combined area format(CAF) object you can do the following: +// json jArea = GffCreateArea(JsonObject(), JsonObject()); +// jArea = GffAddString(jArea, "ARE/value/Tag", "AREA_TAG"); + +json GffAddStruct(json jGff, string sLabel, json jStruct, int nType = -1); +json GffAddList(json jGff, string sLabel, json jList); +json GffAddByte(json jGff, string sLabel, int v); +json GffAddChar(json jGff, string sLabel, int v); +json GffAddWord(json jGff, string sLabel, int v); +json GffAddShort(json jGff, string sLabel, int v); +// Note: Only data of type int32 will fit, because that's all that NWScript supports. +json GffAddDword(json jGff, string sLabel, int v); +json GffAddInt(json jGff, string sLabel, int v); +// Note: Only data of type int32 will fit, because that's all that NWScript supports. +json GffAddDword64(json jGff, string sLabel, int v); +// Note: Only data of type int32 will fit, because that's all that NWScript supports. +json GffAddInt64(json jGff, string sLabel, int v); +json GffAddFloat(json jGff, string sLabel, float v); +// Note: Only data of type float will fit, because that's all that NWScript supports. +json GffAddDouble(json jGff, string sLabel, float v); +json GffAddResRef(json jGff, string sLabel, string v); +json GffAddString(json jGff, string sLabel, string v); +json GffAddLocString(json jGff, string sLabel, string v, int nStrRef = -1); + + +// Replace a field, the type must match and the field must exist. +// Returns a json null value on error with GetJsonError() filled in. +// +// sLabel can be a json pointer(path) without the starting /, see the documentation of JsonPointer() for details. +// For example, to replace the name of an area in a combined area format(CAF) object you can do the following: +// json jArea = ObjectToStruct(GetFirstArea()); +// jArea = GffReplaceLocString(jArea, "ARE/value/Name", "New Area Name"); + +json GffReplaceStruct(json jGff, string sLabel, json jStruct); +json GffReplaceList(json jGff, string sLabel, json jList); +json GffReplaceByte(json jGff, string sLabel, int v); +json GffReplaceChar(json jGff, string sLabel, int v); +json GffReplaceWord(json jGff, string sLabel, int v); +json GffReplaceShort(json jGff, string sLabel, int v); +// Note: Only data of type int32 will fit, because that's all that NWScript supports. +json GffReplaceDword(json jGff, string sLabel, int v); +json GffReplaceInt(json jGff, string sLabel, int v); +// Note: Only data of type int32 will fit, because that's all that NWScript supports. +json GffReplaceDword64(json jGff, string sLabel, int v); +// Note: Only data of type int32 will fit, because that's all that NWScript supports. +json GffReplaceInt64(json jGff, string sLabel, int v); +json GffReplaceFloat(json jGff, string sLabel, float v); +// Note: Only data of type float will fit, because that's all that NWScript supports. +json GffReplaceDouble(json jGff, string sLabel, float v); +json GffReplaceResRef(json jGff, string sLabel, string v); +json GffReplaceString(json jGff, string sLabel, string v); +json GffReplaceLocString(json jGff, string sLabel, string v, int nStrRef = -1); + + +// Remove a field, the type must match and the field must exist. +// Returns a json null value on error with GetJsonError() filled in. +// +// sLabel can be a json pointer(path) without the starting /, see the documentation of JsonPointer() for details. +// For example, to remove all placeables from an area in a combined area format(CAF) object you can do the following: +// json jArea = ObjectToStruct(GetFirstArea()); +// jArea = GffRemoveList(jArea, "GIT/value/Placeable List"); + +json GffRemoveStruct(json jGff, string sLabel); +json GffRemoveList(json jGff, string sLabel); +json GffRemoveByte(json jGff, string sLabel); +json GffRemoveChar(json jGff, string sLabel); +json GffRemoveWord(json jGff, string sLabel); +json GffRemoveShort(json jGff, string sLabel); +json GffRemoveDword(json jGff, string sLabel); +json GffRemoveInt(json jGff, string sLabel); +json GffRemoveDword64(json jGff, string sLabel); +json GffRemoveInt64(json jGff, string sLabel); +json GffRemoveFloat(json jGff, string sLabel); +json GffRemoveDouble(json jGff, string sLabel); +json GffRemoveResRef(json jGff, string sLabel); +json GffRemoveString(json jGff, string sLabel); +json GffRemoveLocString(json jGff, string sLabel); + + +// Get a field's value as json object. +// Returns a json null value on error with GetJsonError() filled in. +// +// Note: Json types do not implicitly convert between types, this means you cannot convert a JsonInt to a string with JsonGetString(), etc. +// You may need to check the type with JsonGetType() and then do the appropriate cast yourself. +// For GffGet*() functions the json type returned is noted in the function description. +// +// Example: +// INCORRECT: string s = JsonGetString(GffGetInt()); +// CORRECT: string s = IntToString(JsonGetInt(GffGetInt())); +// +// sLabel can be a json pointer(path) without the starting /, see the documentation of JsonPointer() for details. +// For example, to get the resref of an area in a combined area format(CAF) object you can do the following: +// json jResRef = GffGetResRef(ObjectToStruct(GetFirstArea()), "ARE/value/ResRef"); +// if (jResRef != JsonNull()) +// { +// string sResRef = JsonGetString(jResRef); +// } +// else +// WriteTimestampedLogEntry("Failed to get area ResRef: " + JsonGetError(jResRef)); + +// Returns the struct as JsonObject() on success. +json GffGetStruct(json jGff, string sLabel); +// Returns a JsonArray() with all the list elements on success. +json GffGetList(json jGff, string sLabel); +// Returns a JsonInt() on success. +json GffGetByte(json jGff, string sLabel); +// Returns a JsonInt() on success. +json GffGetChar(json jGff, string sLabel); +// Returns a JsonInt() on success. +json GffGetWord(json jGff, string sLabel); +// Returns a JsonInt() on success. +json GffGetShort(json jGff, string sLabel); +// Returns a JsonInt() on success. +json GffGetDword(json jGff, string sLabel); +// Returns a JsonInt() on success. +json GffGetInt(json jGff, string sLabel); +// Returns a JsonInt() on success. +json GffGetDword64(json jGff, string sLabel); +// Returns a JsonInt() on success. +json GffGetInt64(json jGff, string sLabel); +// Returns a JsonFloat() on success. +json GffGetFloat(json jGff, string sLabel); +// Returns a JsonFloat() on success. +json GffGetDouble(json jGff, string sLabel); +// Returns a JsonString() on success. +json GffGetResRef(json jGff, string sLabel); +// Returns a JsonString() on success. +json GffGetString(json jGff, string sLabel); +// Returns a JsonObject() on success. +// Key "0" will have a JsonString() with the string, if set. +// Key "id" will have a JsonInt() with the strref, if set. +json GffGetLocString(json jGff, string sLabel); + + +// *** Internal Helper Functions +json AddPatchOperation(json jPatchArray, string sOp, string sPath, json jValue) +{ + json jOperation = JsonObject(); + jOperation = JsonObjectSet(jOperation, "op", JsonString(sOp)); + jOperation = JsonObjectSet(jOperation, "path", JsonString(sPath)); + jOperation = JsonObjectSet(jOperation, "value", jValue); + return JsonArrayInsert(jPatchArray, jOperation); +} + +json GffAddField(json jGff, string sLabel, string sType, json jValue, int nType = -1) +{ + json jField = JsonObject(); + jField = JsonObjectSet(jField, "type", JsonString(sType)); + jField = JsonObjectSet(jField, "value", jValue); + if (sType == GFF_FIELD_TYPE_STRUCT && nType != -1) + jField = JsonObjectSet(jField, "__struct_id", JsonInt(nType)); + + return JsonPatch(jGff, AddPatchOperation(JsonArray(), "add", "/" + sLabel, jField)); +} + +json GffReplaceField(json jGff, string sLabel, string sType, json jValue) +{ + json jPatch = JsonArray(); + jPatch = AddPatchOperation(jPatch, "test", "/" + sLabel + "/type", JsonString(sType)); + jPatch = AddPatchOperation(jPatch, "replace", "/" + sLabel + "/value", jValue); + return JsonPatch(jGff, jPatch); +} + +json GffRemoveField(json jGff, string sLabel, string sType) +{ + json jPatch = JsonArray(); + jPatch = AddPatchOperation(jPatch, "test", "/" + sLabel + "/type", JsonString(sType)); + jPatch = AddPatchOperation(jPatch, "remove", "/" + sLabel, JsonNull()); + return JsonPatch(jGff, jPatch); +} + +json GffGetFieldType(json jGff, string sLabel) +{ + return JsonPointer(jGff, "/" + sLabel + "/type"); +} + +json GffGetFieldValue(json jGff, string sLabel) +{ + return JsonPointer(jGff, "/" + sLabel + "/value"); +} + +json GffGetField(json jGff, string sLabel, string sType) +{ + json jType = GffGetFieldType(jGff, sLabel); + if (jType == JsonNull()) + return jType; + else if (jType != JsonString(sType)) + return JsonNull("field type does not match"); + else + return GffGetFieldValue(jGff, sLabel); +} + +json GffLocString(string v, int nStrRef = -1) +{ + json jLocString = JsonObject(); + if (v != "") + jLocString = JsonObjectSet(jLocString, "0", JsonString(v)); // english/any + if (nStrRef != -1) + jLocString = JsonObjectSet(jLocString, "id", JsonInt(nStrRef)); + + return jLocString; +} +//*** + +json GffCreateObject(int nObjectType) +{ + string ot; + if (nObjectType == OBJECT_TYPE_CREATURE) ot = "UTC "; + else if (nObjectType == OBJECT_TYPE_ITEM) ot = "UTI "; + else if (nObjectType == OBJECT_TYPE_TRIGGER) ot = "UTT "; + else if (nObjectType == OBJECT_TYPE_DOOR) ot = "UTD "; + else if (nObjectType == OBJECT_TYPE_WAYPOINT) ot = "UTW "; + else if (nObjectType == OBJECT_TYPE_PLACEABLE) ot = "UTP "; + else if (nObjectType == OBJECT_TYPE_STORE) ot = "UTM "; + else if (nObjectType == OBJECT_TYPE_ENCOUNTER) ot = "UTE "; + + if (ot == "") return JsonNull("invalid object type"); + + json ret = JsonObject(); + ret = JsonObjectSet(ret, "__data_type", JsonString(ot)); + return ret; +} + +json GffCreateArea(json jARE, json jGIT) +{ + json jCAF = JsonObject(); + jCAF = JsonObjectSet(jCAF, "__data_type", JsonString("CAF ")); + jCAF = GffAddStruct(jCAF, "ARE", jARE, 0); + jCAF = GffAddStruct(jCAF, "GIT", jGIT, 1); + return jCAF; +} + + +int GffGetObjectType(json jGff) +{ + json jDataType = JsonObjectGet(jGff, "__data_type"); + if (jDataType == JsonNull()) + return 0; + else + { + string sObjectType = JsonGetString(jDataType); + + if (sObjectType == "UTC ") return OBJECT_TYPE_CREATURE; + else if (sObjectType == "UTI ") return OBJECT_TYPE_ITEM; + else if (sObjectType == "UTT ") return OBJECT_TYPE_TRIGGER; + else if (sObjectType == "UTD ") return OBJECT_TYPE_DOOR; + else if (sObjectType == "UTW ") return OBJECT_TYPE_WAYPOINT; + else if (sObjectType == "UTP ") return OBJECT_TYPE_PLACEABLE; + else if (sObjectType == "UTM ") return OBJECT_TYPE_STORE; + else if (sObjectType == "UTE ") return OBJECT_TYPE_ENCOUNTER; + } + + return 0; +} + +int GffGetIsArea(json jGff) +{ + return JsonObjectGet(jGff, "__data_type") == JsonString("CAF "); +} + +int GffGetFieldExists(json jGff, string sLabel, string sType = "") +{ + json jFieldType = GffGetFieldType(jGff, sLabel); + return sType == "" ? jFieldType != JsonNull() : jFieldType == JsonString(sType); +} + + +json GffAddStruct(json jGff, string sLabel, json jStruct, int nType = -1) +{ + return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_STRUCT, jStruct, nType); +} + +json GffAddList(json jGff, string sLabel, json jList) +{ + return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_LIST, jList); +} + +json GffAddByte(json jGff, string sLabel, int v) +{ + return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_BYTE, JsonInt(v)); +} + +json GffAddChar(json jGff, string sLabel, int v) +{ + return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_CHAR, JsonInt(v)); +} + +json GffAddWord(json jGff, string sLabel, int v) +{ + return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_WORD, JsonInt(v)); +} + +json GffAddShort(json jGff, string sLabel, int v) +{ + return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_SHORT, JsonInt(v)); +} + +json GffAddDword(json jGff, string sLabel, int v) +{ + return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_DWORD, JsonInt(v)); +} + +json GffAddInt(json jGff, string sLabel, int v) +{ + return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_INT, JsonInt(v)); +} + +json GffAddDword64(json jGff, string sLabel, int v) +{ + return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_DWORD64, JsonInt(v)); +} + +json GffAddInt64(json jGff, string sLabel, int v) +{ + return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_INT64, JsonInt(v)); +} + +json GffAddFloat(json jGff, string sLabel, float v) +{ + return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_FLOAT, JsonFloat(v)); +} + +json GffAddDouble(json jGff, string sLabel, float v) +{ + return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_DOUBLE, JsonFloat(v)); +} + +json GffAddResRef(json jGff, string sLabel, string v) +{ + return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_RESREF, JsonString(v)); +} + +json GffAddString(json jGff, string sLabel, string v) +{ + return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_STRING, JsonString(v)); +} + +json GffAddLocString(json jGff, string sLabel, string v, int nStrRef = -1) +{ + return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_LOC_STRING, GffLocString(v, nStrRef)); +} + + +json GffReplaceStruct(json jGff, string sLabel, json jStruct) +{ + return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_STRUCT, jStruct); +} + +json GffReplaceList(json jGff, string sLabel, json jList) +{ + return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_LIST, jList); +} + +json GffReplaceByte(json jGff, string sLabel, int v) +{ + return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_BYTE, JsonInt(v)); +} + +json GffReplaceChar(json jGff, string sLabel, int v) +{ + return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_CHAR, JsonInt(v)); +} + +json GffReplaceWord(json jGff, string sLabel, int v) +{ + return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_WORD, JsonInt(v)); +} + +json GffReplaceShort(json jGff, string sLabel, int v) +{ + return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_SHORT, JsonInt(v)); +} + +json GffReplaceDword(json jGff, string sLabel, int v) +{ + return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_DWORD, JsonInt(v)); +} + +json GffReplaceInt(json jGff, string sLabel, int v) +{ + return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_INT, JsonInt(v)); +} + +json GffReplaceDword64(json jGff, string sLabel, int v) +{ + return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_DWORD64, JsonInt(v)); +} + +json GffReplaceInt64(json jGff, string sLabel, int v) +{ + return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_INT64, JsonInt(v)); +} + +json GffReplaceFloat(json jGff, string sLabel, float v) +{ + return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_FLOAT, JsonFloat(v)); +} + +json GffReplaceDouble(json jGff, string sLabel, float v) +{ + return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_DOUBLE, JsonFloat(v)); +} + +json GffReplaceResRef(json jGff, string sLabel, string v) +{ + return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_RESREF, JsonString(v)); +} + +json GffReplaceString(json jGff, string sLabel, string v) +{ + return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_STRING, JsonString(v)); +} + +json GffReplaceLocString(json jGff, string sLabel, string v, int nStrRef = -1) +{ + return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_LOC_STRING, GffLocString(v, nStrRef)); +} + + +json GffRemoveStruct(json jGff, string sLabel) +{ + return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_STRUCT); +} + +json GffRemoveList(json jGff, string sLabel) +{ + return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_LIST); +} + +json GffRemoveByte(json jGff, string sLabel) +{ + return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_BYTE); +} + +json GffRemoveChar(json jGff, string sLabel) +{ + return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_CHAR); +} + +json GffRemoveWord(json jGff, string sLabel) +{ + return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_WORD); +} + +json GffRemoveShort(json jGff, string sLabel) +{ + return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_SHORT); +} + +json GffRemoveDword(json jGff, string sLabel) +{ + return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_DWORD); +} + +json GffRemoveInt(json jGff, string sLabel) +{ + return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_INT); +} + +json GffRemoveDword64(json jGff, string sLabel) +{ + return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_DWORD64); +} + +json GffRemoveInt64(json jGff, string sLabel) +{ + return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_INT64); +} + +json GffRemoveFloat(json jGff, string sLabel) +{ + return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_FLOAT); +} + +json GffRemoveDouble(json jGff, string sLabel) +{ + return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_DOUBLE); +} + +json GffRemoveResRef(json jGff, string sLabel) +{ + return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_RESREF); +} + +json GffRemoveString(json jGff, string sLabel) +{ + return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_STRING); +} + +json GffRemoveLocString(json jGff, string sLabel) +{ + return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_LOC_STRING); +} + + +json GffGetStruct(json jGff, string sLabel) +{ + return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_STRUCT); +} + +json GffGetList(json jGff, string sLabel) +{ + return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_LIST); +} + +json GffGetByte(json jGff, string sLabel) +{ + return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_BYTE); +} + +json GffGetChar(json jGff, string sLabel) +{ + return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_CHAR); +} + +json GffGetWord(json jGff, string sLabel) +{ + return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_WORD); +} + +json GffGetShort(json jGff, string sLabel) +{ + return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_SHORT); +} + +json GffGetDword(json jGff, string sLabel) +{ + return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_DWORD); +} + +json GffGetInt(json jGff, string sLabel) +{ + return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_INT); +} + +json GffGetDword64(json jGff, string sLabel) +{ + return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_DWORD64); +} + +json GffGetInt64(json jGff, string sLabel) +{ + return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_INT64); +} + +json GffGetFloat(json jGff, string sLabel) +{ + return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_FLOAT); +} + +json GffGetDouble(json jGff, string sLabel) +{ + return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_DOUBLE); +} + +json GffGetResRef(json jGff, string sLabel) +{ + return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_RESREF); +} + +json GffGetString(json jGff, string sLabel) +{ + return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_STRING); +} + +json GffGetLocString(json jGff, string sLabel) +{ + return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_LOC_STRING); +} diff --git a/_module/nss/nw_inc_nui.nss b/_module/nss/nw_inc_nui.nss new file mode 100644 index 00000000..96fc3da4 --- /dev/null +++ b/_module/nss/nw_inc_nui.nss @@ -0,0 +1,1193 @@ +const int NUI_DIRECTION_HORIZONTAL = 0; +const int NUI_DIRECTION_VERTICAL = 1; + +const int NUI_MOUSE_BUTTON_LEFT = 0; +const int NUI_MOUSE_BUTTON_MIDDLE = 1; +const int NUI_MOUSE_BUTTON_RIGHT = 2; + +const int NUI_SCROLLBARS_NONE = 0; +const int NUI_SCROLLBARS_X = 1; +const int NUI_SCROLLBARS_Y = 2; +const int NUI_SCROLLBARS_BOTH = 3; +const int NUI_SCROLLBARS_AUTO = 4; + +const int NUI_ASPECT_FIT = 0; +const int NUI_ASPECT_FILL = 1; +const int NUI_ASPECT_FIT100 = 2; +const int NUI_ASPECT_EXACT = 3; +const int NUI_ASPECT_EXACTSCALED = 4; +const int NUI_ASPECT_STRETCH = 5; + +const int NUI_HALIGN_CENTER = 0; +const int NUI_HALIGN_LEFT = 1; +const int NUI_HALIGN_RIGHT = 2; + +const int NUI_VALIGN_MIDDLE = 0; +const int NUI_VALIGN_TOP = 1; +const int NUI_VALIGN_BOTTOM = 2; + +// ----------------------- +// Style + +const float NUI_STYLE_PRIMARY_WIDTH = 150.0; +const float NUI_STYLE_PRIMARY_HEIGHT = 50.0; + +const float NUI_STYLE_SECONDARY_WIDTH = 150.0; +const float NUI_STYLE_SECONDARY_HEIGHT = 35.0; + +const float NUI_STYLE_TERTIARY_WIDTH = 100.0; +const float NUI_STYLE_TERTIARY_HEIGHT = 30.0; + +const float NUI_STYLE_ROW_HEIGHT = 25.0; + +// ----------------------- +// Window + +// Special cases: +// * Set the window title to JsonBool(FALSE), Collapse to JsonBool(FALSE) and bClosable to FALSE +// to hide the title bar. +// Note: You MUST provide a way to close the window some other way, or the user will be stuck with it. +json // Window +NuiWindow( + json jRoot, // Layout-ish (NuiRow, NuiCol, NuiGroup) + json jTitle, // Bind:String + json jGeometry, // Bind:Rect Set x and/or y to -1.0 to center the window on that axis + // Set x and/or y to -2.0 to position the window's top left at the mouse cursor's position of that axis + // Set x and/or y to -3.0 to center the window on the mouse cursor's position of that axis + json jResizable, // Bind:Bool Set to JsonBool(TRUE) or JsonNull() to let user resize without binding. + json jCollapsed, // Bind:Bool Set to a static value JsonBool(FALSE) to disable collapsing. + // Set to JsonNull() to let user collapse without binding. + // For better UX, leave collapsing on. + json jClosable, // Bind:Bool You must provide a way to close the window if you set this to FALSE. + // For better UX, handle the window "closed" event. + json jTransparent, // Bind:Bool Do not render background + json jBorder, // Bind:Bool Do not render border + json jAcceptsInput = // Bind:Bool Set JsonBool(FALSE) to disable all input. + JSON_TRUE // All hover, clicks and keypresses will fall through. +); + +// ----------------------- +// Values + +// Create a dynamic bind. Unlike static values, these can change at runtime: +// NuiBind("mybindlabel"); +// NuiSetBind(.., "mybindlabel", JsonString("hi")); +// To create static values, just use the json types directly: +// JsonString("hi"); +json // Bind +NuiBind( + string sId +); + +// Tag the given element with a id. +// Only tagged elements will send events to the server. +json // Element +NuiId( + json jElem, // Element + string sId // String +); + +// A shim/helper that can be used to render or bind a strref where otherwise +// a string value would go. +json +NuiStrRef( + int nStrRef // STRREF +); + +// ----------------------- +// Layout + +// A column will auto-space all elements inside of it and advise the parent +// about it's desired size. +json // Layout +NuiCol( + json jList // Layout[] or Element[] +); + +// A row will auto-space all elements inside of it and advise the parent +// about it's desired size. +json // Layout +NuiRow( + json jList // Layout[] or Element[] +); + +// A group, usually with a border and some padding, holding a single element. Can scroll. +// Will not advise parent of size, so you need to let it fill a span (col/row) as if it was +// a element. +json // Layout +NuiGroup( + json jChild, // Layout or Element + int bBorder = TRUE, + int nScroll = NUI_SCROLLBARS_AUTO +); + +// Modifiers/Attributes: These are all static and cannot be bound, since the UI system +// cannot easily reflow once the layout is set up. You need to swap the layout if you +// want to change element geometry. + +json // Element +NuiWidth( + json jElem, // Element + float fWidth // Float: Element width in pixels (strength=required). +); + +json // Element +NuiHeight( + json jElem, // Element + float fHeight // Float: Height in pixels (strength=required). +); + +json // Element +NuiAspect( + json jElem, // Element + float fAspect // Float: Ratio of x/y. +); + +// Set a margin on the widget. The margin is the spacing outside of the widget. +json // Element +NuiMargin( + json jElem, // Element + float fMargin // Float +); + +// Set padding on the widget. The margin is the spacing inside of the widget. +json // Element +NuiPadding( + json jElem, // Element + float fPadding // Float +); + +// Disabled elements are non-interactive and greyed out. +json // Element +NuiEnabled( + json jElem, // Element + json jEnabler // Bind:Bool +); + +// Invisible elements do not render at all, but still take up layout space. +json // Element +NuiVisible( + json jElem, // Element + json jVisible // Bind:Bool +); + +// Tooltips show on mouse hover. +json // Element +NuiTooltip( + json jElem, // Element + json jTooltip // Bind:String +); + +// Tooltips for disabled elements show on mouse hover. +json // Element +NuiDisabledTooltip( + json jElem, // Element + json jTooltip // Bind:String +); + +// Encouraged elements have a breathing animated glow inside of it. +json // Element +NuiEncouraged( + json jElem, // Element + json jEncouraged // Bind:Bool +); + +// ----------------------- +// Props & Style + +json // Vec2 +NuiVec(float x, float y); + +json // Rect +NuiRect(float x, float y, float w, float h); + +json // Color +NuiColor(int r, int g, int b, int a = 255); + +// Style the foreground color of the widget. This is dependent on the widget +// in question and only supports solid/full colors right now (no texture skinning). +// For example, labels would style their text color; progress bars would style the bar. +json // Element +NuiStyleForegroundColor( + json jElem, // Element + json jColor // Bind:Color +); + +// ----------------------- +// Widgets + +// A special widget that just takes up layout space. +// If you add multiple spacers to a span, they will try to size equally. +// e.g.: [ ] will try to center the button. +json // Element +NuiSpacer(); + +// Create a label field. Labels are single-line stylable non-editable text fields. +json // Element +NuiLabel( + json jValue, // Bind:String + json jHAlign, // Bind:Int:NUI_HALIGN_* + json jVAlign // Bind:Int:NUI_VALIGN_* +); + +// Create a non-editable text field. Note: This text field internally implies a NuiGroup wrapped +// around it, which is providing the optional border and scrollbars. +json // Element +NuiText( + json jValue, // Bind:String + int bBorder = TRUE, // Bool + int nScroll = NUI_SCROLLBARS_AUTO // Int:NUI_SCROLLBARS_* +); + +// A clickable button with text as the label. +// Sends "click" events on click. +json // Element +NuiButton( + json jLabel // Bind:String +); + +// A clickable button with an image as the label. +// Sends "click" events on click. +json // Element +NuiButtonImage( + json jResRef // Bind:ResRef +); + +// A clickable button with text as the label. +// Same as the normal button, but this one is a toggle. +// Sends "click" events on click. +json // Element +NuiButtonSelect( + json jLabel, // Bind:String + json jValue // Bind:Bool +); + +// A checkbox with a label to the right of it. +json // Element +NuiCheck( + json jLabel, // Bind:String + json jBool // Bind:Bool +); + +// A image, with no border or padding. +json // Element +NuiImage( + json jResRef, // Bind:ResRef + json jAspect, // Bind:Int:NUI_ASPECT_* + json jHAlign, // Bind:Int:NUI_HALIGN_* + json jVAlign // Bind:Int:NUI_VALIGN_* +); + +// Optionally render only subregion of jImage. +// jRegion is a NuiRect (x, y, w, h) to indicate the render region inside the image. +json // NuiImage +NuiImageRegion( + json jImage, // NuiImage + json jRegion // Bind:NuiRect +); + +// A combobox/dropdown. +json // Element +NuiCombo( + json jElements, // Bind:ComboEntry[] + json jSelected // Bind:Int (index into jElements) +); + +json // ComboEntry +NuiComboEntry( + string sLabel, + int nValue +); + +// A floating-point slider. A good step size for normal-sized sliders is 0.01. +json // Element +NuiSliderFloat( + json jValue, // Bind:Float + json jMin, // Bind:Float + json jMax, // Bind:Float + json jStepSize // Bind:Float +); + +// A integer/discrete slider. +json // Element +NuiSlider( + json jValue, // Bind:Int + json jMin, // Bind:Int + json jMax, // Bind:Int + json jStepSize // Bind:Int +); + +// A progress bar. Progress is always from 0.0 to 1.0. +json // Element +NuiProgress( + json jValue // Bind:Float (0.0->1.0) +); + +// A editable text field. +json // Element +NuiTextEdit( + json jPlaceholder, // Bind:String + json jValue, // Bind:String + int nMaxLength, // UInt >= 1, <= 65535 + int bMultiline, // Bool + int bWordWrap = TRUE // Bool +); + +// Creates a list view of elements. +// jTemplate needs to be an array of NuiListTemplateCell instances. +// All binds referenced in jTemplate should be arrays of rRowCount size; +// e.g. when rendering a NuiLabel(), the bound label String should be an array of strings. +// You can pass in one of the template jRowCount into jSize as a convenience. The array +// size will be uses as the Int bind. +// jRowHeight defines the height of the rendered rows. +json // Element +NuiList( + json jTemplate, // NuiListTemplateCell[] (max: 16) + json jRowCount, // Bind:Int + float fRowHeight = NUI_STYLE_ROW_HEIGHT, + int bBorder = TRUE, + int nScroll = NUI_SCROLLBARS_Y // Note: Cannot be AUTO. +); + +json // NuiListTemplateCell +NuiListTemplateCell( + json jElem, // Element + float fWidth, // Float:0 = auto, >1 = pixel width + int bVariable // Bool:Cell can grow if space is available; otherwise static +); + +// A simple color picker, with no border or spacing. +json // Element +NuiColorPicker( + json jColor // Bind:Color +); + +// A list of options (radio buttons). Only one can be selected +// at a time. jValue is updated every time a different element is +// selected. The special value -1 means "nothing". +json // Element +NuiOptions( + int nDirection, // NUI_DIRECTION_* + json jElements, // JsonArray of string labels + json jValue // Bind:Int +); + +// A group of buttons. Only one can be selected at a time. jValue +// is updated every time a different button is selected. The special +// value -1 means "nothing". +json // Element +NuiToggles( + int nDirection, // NUI_DIRECTION_* + json jElements, // JsonArray of string labels + json jValue // Bind:Int +); + +const int NUI_CHART_TYPE_LINES = 0; +const int NUI_CHART_TYPE_COLUMN = 1; + +json // NuiChartSlot +NuiChartSlot( + int nType, // Int:NUI_CHART_TYPE_* + json jLegend, // Bind:String + json jColor, // Bind:NuiColor + json jData // Bind:Float[] +); + +// Renders a chart. +// Currently, min and max values are determined automatically and +// cannot be influenced. +json // Element +NuiChart( + json jSlots // NuiChartSlot[] +); + +// ----------------------- +// Draw Lists + +// Draw lists are raw painting primitives on top of widgets. +// They are anchored to the widget x/y coordinates, and are always +// painted in order of definition, without culling. You cannot bind +// the draw_list itself, but most parameters on individual draw_list +// entries can be bound. + +const int NUI_DRAW_LIST_ITEM_TYPE_POLYLINE = 0; +const int NUI_DRAW_LIST_ITEM_TYPE_CURVE = 1; +const int NUI_DRAW_LIST_ITEM_TYPE_CIRCLE = 2; +const int NUI_DRAW_LIST_ITEM_TYPE_ARC = 3; +const int NUI_DRAW_LIST_ITEM_TYPE_TEXT = 4; +const int NUI_DRAW_LIST_ITEM_TYPE_IMAGE = 5; +const int NUI_DRAW_LIST_ITEM_TYPE_LINE = 6; + +// You can order draw list items to be painted either before, or after the +// builtin render of the widget in question. This enables you to paint "behind" +// a widget. + +const int NUI_DRAW_LIST_ITEM_ORDER_BEFORE = -1; +const int NUI_DRAW_LIST_ITEM_ORDER_AFTER = 1; + +// Always render draw list item (default). +const int NUI_DRAW_LIST_ITEM_RENDER_ALWAYS = 0; +// Only render when NOT hovering. +const int NUI_DRAW_LIST_ITEM_RENDER_MOUSE_OFF = 1; +// Only render when mouse is hovering. +const int NUI_DRAW_LIST_ITEM_RENDER_MOUSE_HOVER = 2; +// Only render while LMB is held down. +const int NUI_DRAW_LIST_ITEM_RENDER_MOUSE_LEFT = 3; +// Only render while RMB is held down. +const int NUI_DRAW_LIST_ITEM_RENDER_MOUSE_RIGHT = 4; +// Only render while MMB is held down. +const int NUI_DRAW_LIST_ITEM_RENDER_MOUSE_MIDDLE = 5; + +json // DrawListItem +NuiDrawListPolyLine( + json jEnabled, // Bind:Bool + json jColor, // Bind:Color + json jFill, // Bind:Bool + json jLineThickness, // Bind:Float + json jPoints, // Bind:Float[] Always provide points in pairs + int nOrder = NUI_DRAW_LIST_ITEM_ORDER_AFTER, // Int:NUI_DRAW_LIST_ITEM_ORDER_* + int nRender = NUI_DRAW_LIST_ITEM_RENDER_ALWAYS // Int:NUI_DRAW_LIST_ITEM_RENDER_* +); + +json // DrawListItem +NuiDrawListCurve( + json jEnabled, // Bind:Bool + json jColor, // Bind:Color + json jLineThickness, // Bind:Float + json jA, // Bind:Vec2 + json jB, // Bind:Vec2 + json jCtrl0, // Bind:Vec2 + json jCtrl1, // Bind:Vec2 + int nOrder = NUI_DRAW_LIST_ITEM_ORDER_AFTER, // Int:NUI_DRAW_LIST_ITEM_ORDER_* + int nRender = NUI_DRAW_LIST_ITEM_RENDER_ALWAYS // Int:NUI_DRAW_LIST_ITEM_RENDER_* +); + +json // DrawListItem +NuiDrawListCircle( + json jEnabled, // Bind:Bool + json jColor, // Bind:Color + json jFill, // Bind:Bool + json jLineThickness, // Bind:Float + json jRect, // Bind:Rect + int nOrder = NUI_DRAW_LIST_ITEM_ORDER_AFTER, // Int:NUI_DRAW_LIST_ITEM_ORDER_* + int nRender = NUI_DRAW_LIST_ITEM_RENDER_ALWAYS // Int:NUI_DRAW_LIST_ITEM_RENDER_* +); + +json // DrawListItem +NuiDrawListArc( + json jEnabled, // Bind:Bool + json jColor, // Bind:Color + json jFill, // Bind:Bool + json jLineThickness, // Bind:Float + json jCenter, // Bind:Vec2 + json jRadius, // Bind:Float + json jAMin, // Bind:Float + json jAMax, // Bind:Float + int nOrder = NUI_DRAW_LIST_ITEM_ORDER_AFTER, // Int:NUI_DRAW_LIST_ITEM_ORDER_* + int nRender = NUI_DRAW_LIST_ITEM_RENDER_ALWAYS // Int:NUI_DRAW_LIST_ITEM_RENDER_* +); + +json // DrawListItem +NuiDrawListText( + json jEnabled, // Bind:Bool + json jColor, // Bind:Color + json jRect, // Bind:Rect + json jText, // Bind:String + int nOrder = NUI_DRAW_LIST_ITEM_ORDER_AFTER, // Int:NUI_DRAW_LIST_ITEM_ORDER_* + int nRender = NUI_DRAW_LIST_ITEM_RENDER_ALWAYS // Int:NUI_DRAW_LIST_ITEM_RENDER_* +); + +json // DrawListItem +NuiDrawListImage( + json jEnabled, // Bind:Bool + json jResRef, // Bind:ResRef + json jPos, // Bind:Rect + json jAspect, // Bind:Int:NUI_ASPECT_* + json jHAlign, // Bind:Int:NUI_HALIGN_* + json jVAlign, // Bind:Int:NUI_VALIGN_* + int nOrder = NUI_DRAW_LIST_ITEM_ORDER_AFTER, // Int:NUI_DRAW_LIST_ITEM_ORDER_* + int nRender = NUI_DRAW_LIST_ITEM_RENDER_ALWAYS // Int:NUI_DRAW_LIST_ITEM_RENDER_* +); + +json // DrawListItemImage +NuiDrawListImageRegion( + json jDrawListImage, // DrawListItemImage + json jRegion // Bind:NuiRect +); + +json // DrawListItem +NuiDrawListLine( + json jEnabled, // Bind:Bool + json jColor, // Bind:Color + json jLineThickness, // Bind:Float + json jA, // Bind:Vec2 + json jB, // Bind:Vec2 + int nOrder = NUI_DRAW_LIST_ITEM_ORDER_AFTER, // Int:NUI_DRAW_LIST_ITEM_ORDER_* + int nRender = NUI_DRAW_LIST_ITEM_RENDER_ALWAYS // Int:NUI_DRAW_LIST_ITEM_RENDER_* +); + +json // Element +NuiDrawList( + json jElem, // Element + json jScissor, // Bind:Bool Constrain painted elements to widget bounds. + json jList // DrawListItem[] +); + +// ----------------------- +// Implementation + +json +NuiWindow( + json jRoot, + json jTitle, + json jGeometry, + json jResizable, + json jCollapsed, + json jClosable, + json jTransparent, + json jBorder, + json jAcceptsInput +) +{ + json ret = JsonObject(); + // Currently hardcoded and here to catch backwards-incompatible data in the future. + ret = JsonObjectSet(ret, "version", JsonInt(1)); + ret = JsonObjectSet(ret, "title", jTitle); + ret = JsonObjectSet(ret, "root", jRoot); + ret = JsonObjectSet(ret, "geometry", jGeometry); + ret = JsonObjectSet(ret, "resizable", jResizable); + ret = JsonObjectSet(ret, "collapsed", jCollapsed); + ret = JsonObjectSet(ret, "closable", jClosable); + ret = JsonObjectSet(ret, "transparent", jTransparent); + ret = JsonObjectSet(ret, "border", jBorder); + ret = JsonObjectSet(ret, "accepts_input", jAcceptsInput); + return ret; +} + +json +NuiElement( + string sType, + json jLabel, + json jValue +) +{ + json ret = JsonObject(); + ret = JsonObjectSet(ret, "type", JsonString(sType)); + ret = JsonObjectSet(ret, "label", jLabel); + ret = JsonObjectSet(ret, "value", jValue); + return ret; +} + +json +NuiBind( + string sId +) +{ + return JsonObjectSet(JsonObject(), "bind", JsonString(sId)); +} + +json +NuiId( + json jElem, + string sId +) +{ + return JsonObjectSet(jElem, "id", JsonString(sId)); +} + +json +NuiStrRef( + int nStrRef +) +{ + json ret = JsonObject(); + ret = JsonObjectSet(ret, "strref", JsonInt(nStrRef)); + return ret; +} + +json +NuiCol( + json jList +) +{ + return JsonObjectSet(NuiElement("col", JsonNull(), JsonNull()), "children", jList); +} + +json +NuiRow( + json jList +) +{ + return JsonObjectSet(NuiElement("row", JsonNull(), JsonNull()), "children", jList); +} + +json +NuiGroup( + json jChild, + int bBorder = TRUE, + int nScroll = NUI_SCROLLBARS_AUTO +) +{ + json ret = NuiElement("group", JsonNull(), JsonNull()); + ret = JsonObjectSet(ret, "children", JsonArrayInsert(JsonArray(), jChild)); + ret = JsonObjectSet(ret, "border", JsonBool(bBorder)); + ret = JsonObjectSet(ret, "scrollbars", JsonInt(nScroll)); + return ret; +} + +json +NuiWidth(json jElem, float fWidth) +{ + return JsonObjectSet(jElem, "width", JsonFloat(fWidth)); +} + +json +NuiHeight(json jElem, float fHeight) +{ + return JsonObjectSet(jElem, "height", JsonFloat(fHeight)); +} + +json +NuiAspect(json jElem, float fAspect) +{ + return JsonObjectSet(jElem, "aspect", JsonFloat(fAspect)); +} + +json +NuiMargin( + json jElem, + float fMargin +) +{ + return JsonObjectSet(jElem, "margin", JsonFloat(fMargin)); +} + +json +NuiPadding( + json jElem, + float fPadding +) +{ + return JsonObjectSet(jElem, "padding", JsonFloat(fPadding)); +} + +json +NuiEnabled( + json jElem, + json jEnabler +) +{ + return JsonObjectSet(jElem, "enabled", jEnabler); +} + +json +NuiVisible( + json jElem, + json jVisible +) +{ + return JsonObjectSet(jElem, "visible", jVisible); +} + +json +NuiTooltip( + json jElem, + json jTooltip +) +{ + return JsonObjectSet(jElem, "tooltip", jTooltip); +} + +json +NuiDisabledTooltip( + json jElem, + json jTooltip +) +{ + return JsonObjectSet(jElem, "disabled_tooltip", jTooltip); +} + +json +NuiEncouraged( + json jElem, + json jEncouraged +) +{ + return JsonObjectSet(jElem, "encouraged", jEncouraged); +} + +json +NuiVec(float x, float y) +{ + json ret = JsonObject(); + ret = JsonObjectSet(ret, "x", JsonFloat(x)); + ret = JsonObjectSet(ret, "y", JsonFloat(y)); + return ret; +} + +json +NuiRect(float x, float y, float w, float h) +{ + json ret = JsonObject(); + ret = JsonObjectSet(ret, "x", JsonFloat(x)); + ret = JsonObjectSet(ret, "y", JsonFloat(y)); + ret = JsonObjectSet(ret, "w", JsonFloat(w)); + ret = JsonObjectSet(ret, "h", JsonFloat(h)); + return ret; +} + +json +NuiColor(int r, int g, int b, int a = 255) +{ + json ret = JsonObject(); + ret = JsonObjectSet(ret, "r", JsonInt(r)); + ret = JsonObjectSet(ret, "g", JsonInt(g)); + ret = JsonObjectSet(ret, "b", JsonInt(b)); + ret = JsonObjectSet(ret, "a", JsonInt(a)); + return ret; +} + +json +NuiStyleForegroundColor( + json jElem, + json jColor +) +{ + return JsonObjectSet(jElem, "foreground_color", jColor); +} + +json +NuiSpacer() +{ + return NuiElement("spacer", JsonNull(), JsonNull()); +} + +json +NuiLabel( + json jValue, + json jHAlign, + json jVAlign +) +{ + json ret = NuiElement("label", JsonNull(), jValue); + ret = JsonObjectSet(ret, "text_halign", jHAlign); + ret = JsonObjectSet(ret, "text_valign", jVAlign); + return ret; +} + +json +NuiText( + json jValue, + int bBorder = TRUE, + int nScroll = NUI_SCROLLBARS_AUTO +) +{ + json ret = NuiElement("text", JsonNull(), jValue); + ret = JsonObjectSet(ret, "border", JsonBool(bBorder)); + ret = JsonObjectSet(ret, "scrollbars", JsonInt(nScroll)); + return ret; +} + +json +NuiButton( + json jLabel +) +{ + return NuiElement("button", jLabel, JsonNull()); +} + +json +NuiButtonImage( + json jResRef +) +{ + return NuiElement("button_image", jResRef, JsonNull()); +} + +json +NuiButtonSelect( + json jLabel, + json jValue +) +{ + return NuiElement("button_select", jLabel, jValue); +} + +json +NuiCheck( + json jLabel, + json jBool +) +{ + return NuiElement("check", jLabel, jBool); +} + +json +NuiImage( + json jResRef, + json jAspect, + json jHAlign, + json jVAlign +) +{ + json img = NuiElement("image", JsonNull(), jResRef); + img = JsonObjectSet(img, "image_aspect", jAspect); + img = JsonObjectSet(img, "image_halign", jHAlign); + img = JsonObjectSet(img, "image_valign", jVAlign); + return img; +} + +json +NuiImageRegion( + json jImage, + json jRegion +) +{ + return JsonObjectSet(jImage, "image_region", jRegion); +} + +json +NuiCombo( + json jElements, + json jSelected +) +{ + return JsonObjectSet(NuiElement("combo", JsonNull(), jSelected), "elements", jElements); +} + +json +NuiComboEntry( + string sLabel, + int nValue +) +{ + return JsonArrayInsert(JsonArrayInsert(JsonArray(), JsonString(sLabel)), JsonInt(nValue)); +} + +json +NuiSliderFloat( + json jValue, + json jMin, + json jMax, + json jStepSize +) +{ + json ret = NuiElement("sliderf", JsonNull(), jValue); + ret = JsonObjectSet(ret, "min", jMin); + ret = JsonObjectSet(ret, "max", jMax); + ret = JsonObjectSet(ret, "step", jStepSize); + return ret; +} + +json +NuiSlider( + json jValue, + json jMin, + json jMax, + json jStepSize +) +{ + json ret = NuiElement("slider", JsonNull(), jValue); + ret = JsonObjectSet(ret, "min", jMin); + ret = JsonObjectSet(ret, "max", jMax); + ret = JsonObjectSet(ret, "step", jStepSize); + return ret; +} + +json +NuiProgress( + json jValue +) +{ + return NuiElement("progress", JsonNull(), jValue); +} + +json +NuiTextEdit( + json jPlaceholder, + json jValue, + int nMaxLength, + int bMultiline, + int bWordWrap = TRUE +) +{ + json ret = NuiElement("textedit", jPlaceholder, jValue); + ret = JsonObjectSet(ret, "max", JsonInt(nMaxLength)); + ret = JsonObjectSet(ret, "multiline", JsonBool(bMultiline)); + ret = JsonObjectSet(ret, "wordwrap", JsonBool(bWordWrap)); + return ret; +} + +json +NuiList( + json jTemplate, + json jRowCount, + float fRowHeight = NUI_STYLE_ROW_HEIGHT, + int bBorder = TRUE, + int nScroll = NUI_SCROLLBARS_Y +) +{ + json ret = NuiElement("list", JsonNull(), JsonNull()); + ret = JsonObjectSet(ret, "row_template", jTemplate); + ret = JsonObjectSet(ret, "row_count", jRowCount); + ret = JsonObjectSet(ret, "row_height", JsonFloat(fRowHeight)); + ret = JsonObjectSet(ret, "border", JsonBool(bBorder)); + ret = JsonObjectSet(ret, "scrollbars", JsonInt(nScroll)); + return ret; +} + +json +NuiListTemplateCell( + json jElem, + float fWidth, + int bVariable +) +{ + json ret = JsonArray(); + ret = JsonArrayInsert(ret, jElem); + ret = JsonArrayInsert(ret, JsonFloat(fWidth)); + ret = JsonArrayInsert(ret, JsonBool(bVariable)); + return ret; +} + +json +NuiColorPicker( + json jColor +) +{ + json ret = NuiElement("color_picker", JsonNull(), jColor); + return ret; +} + +json +NuiOptions( + int nDirection, + json jElements, + json jValue +) +{ + json ret = NuiElement("options", JsonNull(), jValue); + ret = JsonObjectSet(ret, "direction", JsonInt(nDirection)); + ret = JsonObjectSet(ret, "elements", jElements); + return ret; +} + +json +NuiToggles( + int nDirection, + json jElements, + json jValue +) +{ + json ret = NuiElement("tabbar", JsonNull(), jValue); + ret = JsonObjectSet(ret, "direction", JsonInt(nDirection)); + ret = JsonObjectSet(ret, "elements", jElements); + return ret; +} + +json +NuiChartSlot( + int nType, + json jLegend, + json jColor, + json jData +) +{ + json ret = JsonObject(); + ret = JsonObjectSet(ret, "type", JsonInt(nType)); + ret = JsonObjectSet(ret, "legend", jLegend); + ret = JsonObjectSet(ret, "color", jColor); + ret = JsonObjectSet(ret, "data", jData); + return ret; +} + +json +NuiChart( + json jSlots +) +{ + json ret = NuiElement("chart", JsonNull(), jSlots); + return ret; +} + +json +NuiDrawListItem( + int nType, + json jEnabled, + json jColor, + json jFill, + json jLineThickness, + int nOrder = NUI_DRAW_LIST_ITEM_ORDER_AFTER, + int nRender = NUI_DRAW_LIST_ITEM_RENDER_ALWAYS +) +{ + json ret = JsonObject(); + ret = JsonObjectSet(ret, "type", JsonInt(nType)); + ret = JsonObjectSet(ret, "enabled", jEnabled); + ret = JsonObjectSet(ret, "color", jColor); + ret = JsonObjectSet(ret, "fill", jFill); + ret = JsonObjectSet(ret, "line_thickness", jLineThickness); + ret = JsonObjectSet(ret, "order", JsonInt(nOrder)); + ret = JsonObjectSet(ret, "render", JsonInt(nRender)); + return ret; +} + +json +NuiDrawListPolyLine( + json jEnabled, + json jColor, + json jFill, + json jLineThickness, + json jPoints, + int nOrder = NUI_DRAW_LIST_ITEM_ORDER_AFTER, + int nRender = NUI_DRAW_LIST_ITEM_RENDER_ALWAYS +) +{ + json ret = NuiDrawListItem(NUI_DRAW_LIST_ITEM_TYPE_POLYLINE, jEnabled, jColor, jFill, jLineThickness, nOrder, nRender); + ret = JsonObjectSet(ret, "points", jPoints); + return ret; +} + +json +NuiDrawListCurve( + json jEnabled, + json jColor, + json jLineThickness, + json jA, + json jB, + json jCtrl0, + json jCtrl1, + int nOrder = NUI_DRAW_LIST_ITEM_ORDER_AFTER, + int nRender = NUI_DRAW_LIST_ITEM_RENDER_ALWAYS +) +{ + json ret = NuiDrawListItem(NUI_DRAW_LIST_ITEM_TYPE_CURVE, jEnabled, jColor, JsonBool(0), jLineThickness, nOrder, nRender); + ret = JsonObjectSet(ret, "a", jA); + ret = JsonObjectSet(ret, "b", jB); + ret = JsonObjectSet(ret, "ctrl0", jCtrl0); + ret = JsonObjectSet(ret, "ctrl1", jCtrl1); + return ret; +} + +json +NuiDrawListCircle( + json jEnabled, + json jColor, + json jFill, + json jLineThickness, + json jRect, + int nOrder = NUI_DRAW_LIST_ITEM_ORDER_AFTER, + int nRender = NUI_DRAW_LIST_ITEM_RENDER_ALWAYS +) +{ + json ret = NuiDrawListItem(NUI_DRAW_LIST_ITEM_TYPE_CIRCLE, jEnabled, jColor, jFill, jLineThickness, nOrder, nRender); + ret = JsonObjectSet(ret, "rect", jRect); + return ret; +} + +json +NuiDrawListArc( + json jEnabled, + json jColor, + json jFill, + json jLineThickness, + json jCenter, + json jRadius, + json jAMin, + json jAMax, + int nOrder = NUI_DRAW_LIST_ITEM_ORDER_AFTER, + int nRender = NUI_DRAW_LIST_ITEM_RENDER_ALWAYS +) +{ + json ret = NuiDrawListItem(NUI_DRAW_LIST_ITEM_TYPE_ARC, jEnabled, jColor, jFill, jLineThickness, nOrder, nRender); + ret = JsonObjectSet(ret, "c", jCenter); + ret = JsonObjectSet(ret, "radius", jRadius); + ret = JsonObjectSet(ret, "amin", jAMin); + ret = JsonObjectSet(ret, "amax", jAMax); + return ret; +} + +json +NuiDrawListText( + json jEnabled, + json jColor, + json jRect, + json jText, + int nOrder = NUI_DRAW_LIST_ITEM_ORDER_AFTER, + int nRender = NUI_DRAW_LIST_ITEM_RENDER_ALWAYS +) +{ + json ret = NuiDrawListItem(NUI_DRAW_LIST_ITEM_TYPE_TEXT, jEnabled, jColor, JsonNull(), JsonNull(), nOrder, nRender); + ret = JsonObjectSet(ret, "rect", jRect); + ret = JsonObjectSet(ret, "text", jText); + return ret; +} + +json +NuiDrawListImage( + json jEnabled, + json jResRef, + json jRect, + json jAspect, + json jHAlign, + json jVAlign, + int nOrder = NUI_DRAW_LIST_ITEM_ORDER_AFTER, + int nRender = NUI_DRAW_LIST_ITEM_RENDER_ALWAYS +) +{ + json ret = NuiDrawListItem(NUI_DRAW_LIST_ITEM_TYPE_IMAGE, jEnabled, JsonNull(), JsonNull(), JsonNull(), nOrder, nRender); + ret = JsonObjectSet(ret, "image", jResRef); + ret = JsonObjectSet(ret, "rect", jRect); + ret = JsonObjectSet(ret, "image_aspect", jAspect); + ret = JsonObjectSet(ret, "image_halign", jHAlign); + ret = JsonObjectSet(ret, "image_valign", jVAlign); + return ret; +} + +json +NuiDrawListImageRegion( + json jDrawListImage, + json jRegion +) +{ + return JsonObjectSet(jDrawListImage, "image_region", jRegion); +} + +json +NuiDrawListLine( + json jEnabled, + json jColor, + json jLineThickness, + json jA, + json jB, + int nOrder = NUI_DRAW_LIST_ITEM_ORDER_AFTER, + int nRender = NUI_DRAW_LIST_ITEM_RENDER_ALWAYS +) +{ + json ret = NuiDrawListItem(NUI_DRAW_LIST_ITEM_TYPE_LINE, jEnabled, jColor, JsonNull(), jLineThickness, nOrder, nRender); + ret = JsonObjectSet(ret, "a", jA); + ret = JsonObjectSet(ret, "b", jB); + return ret; +} + +json +NuiDrawList( + json jElem, + json jScissor, + json jList +) +{ + json ret = JsonObjectSet(jElem, "draw_list", jList); + ret = JsonObjectSet(ret, "draw_list_scissor", jScissor); + return ret; +} + +// json +// NuiCanvas( +// json jList +// ) +// { +// json ret = NuiElement("canvas", JsonNull(), jList); +// return ret; +// } +