From c08dc70b99edc677356f1672531031f6a6928ae2 Mon Sep 17 00:00:00 2001 From: Robert Siska Date: Mon, 11 Feb 2013 22:03:24 +0100 Subject: [PATCH] Initial commit --- autoexec.cfg | 29 + maps/pellet.bsp | Bin 0 -> 271828 bytes maps/phystest.bsp | Bin 0 -> 128508 bytes peldemo.dem | Bin 0 -> 75579 bytes portal.dem | Bin 0 -> 95578 bytes progs/camera.mdl | Bin 0 -> 18691 bytes progs/cube.bsp | Bin 0 -> 7896 bytes progs/old.mld | Bin 0 -> 220968 bytes progs/oldport.mdl | Bin 0 -> 220968 bytes progs/pellet.mdl | Bin 0 -> 10144 bytes progs/portal1.bsp | Bin 0 -> 22396 bytes progs/portal2.bsp | Bin 0 -> 22396 bytes progs/v_portal.mdl | Bin 0 -> 157595 bytes sound/portal/close.wav | Bin 0 -> 20188 bytes sound/portal/fire.wav | Bin 0 -> 47018 bytes sound/portal/use.wav | Bin 0 -> 22626 bytes src/ai.qc | 747 ++++++++++++++ src/asstech.qc | 702 +++++++++++++ src/boss.qc | 385 +++++++ src/buttons.qc | 141 +++ src/client.qc | 1454 +++++++++++++++++++++++++++ src/combat.qc | 289 ++++++ src/cube.qc | 62 ++ src/custdefs.qc | 4 + src/defs.qc | 697 +++++++++++++ src/demon.qc | 363 +++++++ src/dog.qc | 363 +++++++ src/doors.qc | 779 +++++++++++++++ src/enforcer.qc | 351 +++++++ src/error.log | 19 + src/fight.qc | 409 ++++++++ src/fish.qc | 186 ++++ src/frikqcc25.exe | Bin 0 -> 122880 bytes src/fteqcc.log | 141 +++ src/grid.qc | 263 +++++ src/hknight.qc | 440 ++++++++ src/items.qc | 1380 +++++++++++++++++++++++++ src/knight.qc | 270 +++++ src/maps/.light.log | 7 + src/maps/.qbsp.log | 75 ++ src/maps/.vis.log | 6 + src/maps/cube.map | 51 + src/maps/pellet.map | 770 ++++++++++++++ src/maps/phystest.map | 134 +++ src/maps/portal.wad | Bin 0 -> 140812 bytes src/maps/portal1.map | 182 ++++ src/maps/portal2.map | 182 ++++ src/misc.qc | 672 +++++++++++++ src/monsters.qc | 236 +++++ src/ogre.qc | 461 +++++++++ src/oldone.qc | 286 ++++++ src/plats.qc | 364 +++++++ src/player.qc | 670 +++++++++++++ src/portal.qc | 742 ++++++++++++++ src/progdefs.h | 143 +++ src/progs.src | 40 + src/shalrath.qc | 239 +++++ src/shambler.qc | 367 +++++++ src/soldier.qc | 284 ++++++ src/subs.qc | 317 ++++++ src/tags | 2159 ++++++++++++++++++++++++++++++++++++++++ src/tarbaby.qc | 222 +++++ src/triggers.qc | 642 ++++++++++++ src/weapons.qc | 1320 ++++++++++++++++++++++++ src/wizard.qc | 410 ++++++++ src/world.qc | 395 ++++++++ src/zombie.qc | 515 ++++++++++ 67 files changed, 21365 insertions(+) create mode 100644 autoexec.cfg create mode 100644 maps/pellet.bsp create mode 100644 maps/phystest.bsp create mode 100644 peldemo.dem create mode 100644 portal.dem create mode 100644 progs/camera.mdl create mode 100644 progs/cube.bsp create mode 100644 progs/old.mld create mode 100644 progs/oldport.mdl create mode 100644 progs/pellet.mdl create mode 100644 progs/portal1.bsp create mode 100644 progs/portal2.bsp create mode 100644 progs/v_portal.mdl create mode 100644 sound/portal/close.wav create mode 100644 sound/portal/fire.wav create mode 100644 sound/portal/use.wav create mode 100644 src/ai.qc create mode 100644 src/asstech.qc create mode 100644 src/boss.qc create mode 100644 src/buttons.qc create mode 100644 src/client.qc create mode 100644 src/combat.qc create mode 100644 src/cube.qc create mode 100644 src/custdefs.qc create mode 100644 src/defs.qc create mode 100644 src/demon.qc create mode 100644 src/dog.qc create mode 100644 src/doors.qc create mode 100644 src/enforcer.qc create mode 100644 src/error.log create mode 100644 src/fight.qc create mode 100644 src/fish.qc create mode 100644 src/frikqcc25.exe create mode 100644 src/fteqcc.log create mode 100644 src/grid.qc create mode 100644 src/hknight.qc create mode 100644 src/items.qc create mode 100644 src/knight.qc create mode 100644 src/maps/.light.log create mode 100644 src/maps/.qbsp.log create mode 100644 src/maps/.vis.log create mode 100644 src/maps/cube.map create mode 100644 src/maps/pellet.map create mode 100644 src/maps/phystest.map create mode 100644 src/maps/portal.wad create mode 100644 src/maps/portal1.map create mode 100644 src/maps/portal2.map create mode 100644 src/misc.qc create mode 100644 src/monsters.qc create mode 100644 src/ogre.qc create mode 100644 src/oldone.qc create mode 100644 src/plats.qc create mode 100644 src/player.qc create mode 100644 src/portal.qc create mode 100644 src/progdefs.h create mode 100644 src/progs.src create mode 100644 src/shalrath.qc create mode 100644 src/shambler.qc create mode 100644 src/soldier.qc create mode 100644 src/subs.qc create mode 100644 src/tags create mode 100644 src/tarbaby.qc create mode 100644 src/triggers.qc create mode 100644 src/weapons.qc create mode 100644 src/wizard.qc create mode 100644 src/world.qc create mode 100644 src/zombie.qc diff --git a/autoexec.cfg b/autoexec.cfg new file mode 100644 index 0000000..545b084 --- /dev/null +++ b/autoexec.cfg @@ -0,0 +1,29 @@ +echo +echo " €‚ ذدزشءج اصخ ض”…’ €‚" +// " (============) Portal Gun v2.0 (===========)" +echo " Controls:" +echo " €‚ p Pull the Portal gun out" +echo " €‚ q Fire blue portal" +echo " €‚ e Fire red portal" +echo " €‚ r Close portals" +echo " €‚ f Fire carrying beam" +echo " €‚ w Movement" +echo " asd" + +bind "p" "impulse 99" +bind "r" "impulse 98" +bind "q" "impulse 96" +bind "e" "impulse 95" +bind "f" "impulse 94" + +bind "w" "+forward" +bind "s" "+back" +bind "a" "+moveleft" +bind "d" "+moveright" + +alias "portal_mode" "impulse 97" + ++mlook +crosshair "1" + +playdemo portal diff --git a/maps/pellet.bsp b/maps/pellet.bsp new file mode 100644 index 0000000000000000000000000000000000000000..8914d877ce4dd568723f4a6e5fb115c7ffba061f GIT binary patch literal 271828 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 KkXiEn;r{^lit|ta literal 0 HcmV?d00001 diff --git a/maps/phystest.bsp b/maps/phystest.bsp new file mode 100644 index 0000000000000000000000000000000000000000..0111cf03cc5cfe255c6702087ac8737d948c5946 GIT binary patch literal 128508 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ʶ`-} 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 dPdmoJXMT)>ANKTtAMu7ha z)j9=q=%rZ8?x8KvCjWpqoH-Y@)^v>>Y44)_16|Yp^rEIcdPUQIiLug{j!Juk{x4Af%+R#I zqF&Ev+9v96fxm?M0DY?e2pNAs{k^QFeFgRJP@hNr7U~k}1Jv`VHLd-os=~*`SUaM% zp)zW#7Insrajj%r4CfI=^@(;7W{k^3PkTB>BpNTpc%w1x!K~i-n0=AF_6MQ7sIT}x zpl4XrcpIyY*+LW=Zy%zgeTWY2!K@DLK`1|xMLuaO9gjz&(Ug{KfuxG9?T_|H7c{yw zEtDS7G|+6#Ry2KvW@A3lY>my(_MtbV8z~xT1EZ3eIfOzTePc+CQB5WC zRk{wT$!C0yYCj(7$_sHn=-^@6N3fQzsSg;&4eet!N^2y)(faWkXrGM`^pF&d)7oj| z(-DGvGHzo`$NDsFH2MT{!}&I3g=?$D?rm5vA`%jDJ;)zodN)^-=V{j{0TPqot^i+Q;br@VlB8-J!JjlWe6Duivg+y?puR&#zuuyIK3;rOR(W>;BE7 zg)1xNwY6*ItCfOXXs$L^7T2zqo7W0YAgrx!Tw7ej^de?8%Zq3&)EcdYcQ(q)m4)@y z)s?jcCFx3|ytIDqwQ~#WmCf~yMrCcmUA%O;yjFRwwgSHI{Ht7Rt1Ir}TF6v5`qQH+ zt5@7=Z5^hBwOu%O=8Q7TT_4-H+HkAxHFUmRe8X11r;>91!ZQ#OT5|rvQ&|Eb%9y7W z68hz7rN9~pA}M$eG=&AX@DgV5lD&%;_Vl?+E9D#IGb+gOu*df))Th933Uh0?t^f0) z3qu&*a6s3Ax;=w2mW$lN943V~=nwXBtIHD(1|zyJb0+gb&QOBKoE)3b4M*C(pY^(3 z&-1!jFO&5}&XPRhHw0sj5O^{+e&z%dMnngfKj)ZiPnxD>Fb;k6ZImbM#Bcj7*PnfzD6pI1wBD08pIOX35zi#P8TMum8 zE}DCAM}mLoF)8(8kVnx29Y&_~X9bK4bRFbe;8=#p!kdwPcn_m{lWeU2e;Z@!A>$Zhy7)f{WThn zP7GOGUbc$}fjDy-KZ2kcFYqAzWS`n3VcAGkf!4k(Vs{noDDF|jXfbI>S5 zpO2SC3fAlR9O|sQ(ywj)xa!t^e_PqJ$3lAt8PNlIrgWP1dKKPlT06q2Hq5%TbG>@0 zTz78UoqES=mLR@qS>i^$-z5bod}-afaketYE8nnApLveEp;w;#B;3VT^oJ_4>B$KK zCvmB8m-qMk57qs!|B%n(F8JvRW$;6AH^V)TbM9rhk-}YiBcFu3;F`r<3`VPh-b@;I zIV_3ju$rfFmtz$X9ai%+?sBXpqAUIs?(+Tq1UIo}p2ppj{>%*S#`u-~6z(SUKg5Ql za2NU~_LKfJ?k4!v`jfaDw;%rV(zu&R`!9vN8N@>5AKIT8+>Pze=iu%H7en0TJcEm8 zJVc1XU3|X6qHuQ_fAAdKk;YvPFTiGcB7SFam-r_af5y1$_fhKo_gP0EGZ50R){fU| z$G7te=lqiz_G{@W>v)~@tbgnWYvDd6qfIkbbPo>UyuR9@vBSKA65TsIG|df z8GSgZ-}e~}Jxq%e!GdjL1eN*5&DZmxG_U zLkXa#^Ib}0RLOR;Suc_A;%x)&;zgYlkwZ5VnF=;9o$n%f?nZRjoaM=Umv>=FM2E#) zXo%;#yc^3WVRM%!^Ih;CO!@oZPvS1`!Vi&r=2&fq zXV_KxIyh0Y3MPBSC-A=*VK#-tc|zH&cY=Ez loG;Yr1kc?qH<9jknkD4B_4?8nx%tvD>&Bf*W4*%5{{&q~b3yT-_fQUU;AGCus5i zf8RM~$IQ(m+&v>L&0_0hhWl}IbF=fE-}%1tovYp6_&0XTD=RDi&p-OLf9(71hQRDY-;Ol?g{^b$*e{(A<|2y9QJ-q)R{z{13 z@TdRh-})Bg?YTm|-jMUWz46h(Xf#^y^{&1CQLDv+je7l@YuJ0H@BN&FhrjlkO%a$! zTPl0_g!oVCliH>zKE2VS4a2@Q0ecCDCzGdomi;dJo8Ys(SNh(AG|mz8>J1CO<$0c8 z4$k>$`lPlgIw#@gYhSkm_NSJ;wF$GYWbc)}_t|NV`=(Z{8{l5E(eUC6`VMX3b=LtTzAXbYj@o5@O#U4li8(^Le{xw8oR;gVDjk=;);L#=L6Zo-T3A9C>xp zdvWYP)qJVd&&!5oWS#mAgh#kw`Yze?>+%k@ryMlqgA@%v!5i(UZihG*-u=0uU6ISZQ`*1*s?#b=3Azq zM}E^M`Ct6<7oVD!s^lk(SS<@a*?iwW@~wO2B^a ziTtKjv(E3#ODrR9=r?@`5AwhK)i0I)g{l6`B*%PFFIApRjt^1a9~_@do;*p6y_MdS z{EMR>BV^1Wu-DEVvPa*}=m0if*?YDL5c4y0D8zAz543nB&v3EyXQz4Un^vjZ_Sv6a zK_hSKl=uTn2psxJAia_O!n~gN^iCbERJ8MMb#iL!`#p92{pR1)Z~OxxQ5OFo7Ej5C z=wE>8_mg;jq*`i**f*b?=i-`cE-rBB7a{2#`pHROsVM2y$%%IC9gX+2H2B>CKDg0NuVtFBUz2cABH#v}(wJK<~%RW^+!(kKS{k&r{O-^plgmYS_O% zIh|sEZXPToZRBKI(~G(Hm7h7FPJiU|1wTd!&;DGm;yahUhwlB^r#s&)n559@anjq8 z|Kg_KN#t44T9vX>`hdMMKeJ1>C3Z0+&O#rg*lSHMxJ{+61p)MzmET&7vqTPkS1r@E z3$ypCbHQIo;Lypg^bi)_t{OgD@-I&MR&NjzH}s)it;pwJci5}sXR<#yJiu8iHmgID z&GEr8_u}NLvu`Xv-9BmYEoS-AKLE$sv=c)zp7EhlkP6PSKRF#!?dNm%E=qdS)Dh`_ zDayY@XIHHBO}1TTmt)KRDF<;Gj>miI>zvi4J32Z#IvfpGSU?fxpdC7;AFx);+Q|1U z|F2A|XU;228t64kkUIsqoBd&PW~;54FUy$`_87~H{|VG+=zD?}CA~O(wz(q>9+v#M zb$^!h{k4Nbgo9DMD3H5ZQ@sa!bZMiFHxK(B(W6=P zdV9_;S5|Ij6+K4=VLuuQ(_xP#A073ho_vnJR0?_|#2%WDf6-Ir^SZg(I?KRIlis%X z2j`UinbKn#Lhs-Zh=^&_j}-+6(Xl6AebyOkr|$81q6KAkcm5F96eF=hKnTqGxeEa8 zy=u7HHxZE5THJnL_vOpk^?q1xCW3uL48s24U^E=AD|q2`Fo?;4X4$y2hW+8mcojPD zHCu7)Tiy_wq*vqX%ah*9KA1)S9O;`VqvU=-9i6TCt-5yXeG2wCk2YV~qgyY&?6*Cl zmpoWuA`zJN8YEF6`yTl~rMKuswXI?Y^eukPf$0{X+(U|+vGS4z-)I>20V5NemZoI~ zvaGLX*kb~RGn2=bnO38A4Z0Lu_hm|N=~JV^IXJKMqMrbDbhsW=Q&tvz2YYb_KB3;D zjQH%)tv92hV39%|AQx6xJ0WQ1`=x-%3n$qB#I}v^-os$HCtCVGMd|BveSVP}76L(w znx)P}SWj^V`_Xz>aD1wjZF%@y`*baPeCOG({9k#^zOeV{zg+2U$q(o+CcQvXQtQ*A zt5o%x*u9S(y_YZ0tryRJzzf3UD|_pmGWQV#2DwN=edIPG==l?oEJU8CD1F~B$a&W1 z=LH>QkE1SW`IX!&&`uj0jiOe+Q8jZH+HK4JSZuz?-HiIjtwDeN@W`?HU@t)>zj)~- zH(8%5^aZ6?>_o+Bn0^TkMd~$apq(+m%8%$OdV!5;qJFeG@Zq@E5B7LDE?k6#xb zAM~5i`8!?@)hEoItM}piU%2!TNLstgNUs{Is19cMdo}iHw%cHTDwWysWX#XAX6Y(= zlLx5rBGSu8GElwbt8W3|BI7kVqM*~VPA`~ zug4DKc_UGKw3>KPWBSm-6|$Q7e4XOrR0E9SdqSF_^MWmwzTRQ#>UvnxV2q zlK44_pX_lag#R2)KJ~rDoCy@a*^r)+1Gm|@nDi!hl9OKG`(`R?^|21Yv+V28d&&>- zPbEKUX6C+Tj(HtM*c*RaGoP;lV+xU>F2`xX&p{ueA6J}Mf+Se#G>YmInc@>d?td8d zeVR>I?WMj~_D>Ca7zX17vmoH=gAp`nfIb7i(*XT?VvOgJ-fBg1($m~SNv+x+^js^} zhLmW?)~b~zYB%aV*pD3cp_2tZ`wT?y)#M+nxV~qQ52lF66ai}enfBgleqj0SI7e`` z8Pr47h>trI8LbaZA#T^4+P>X>iurmX+T=5zearLP0bad7TthaFyjI^~pK9rqJ=!HE z2LjPqn9+fOP^*?3o>#A$`X0-2o=N`1bmx20LyGcby+PKI-}g*<&ED4)$X6sn92rH^{zKk9O&{jL^6y zX7$N6ec}Cx$pvEogp!m3ksPu4wO%iY>xs{=MM?)NiXmZb@)kgz;|_N@*7~^s8(y}$5Hms zYQuiIThEsF!=ttSO!g)lOeRQ$=obJ+<~I0#e$uB<=8m$Tdl{E@I6mT-X0sf2W&-wD zgB&cytygMI4DCqv9UiU?0-fhIgCs^`DUqJ+QD6h{M?;kwYA@*N?D_2J=bud8q&7^k z_pgCV;xxHpMCR#_elCz6e1dbCO<%&;J~|X~wYW2;j|Box#c2A%wSC*s`zP)y>{g}R zYqnSnYlG$CIkdzFn)-8fGZ?@Srzb3tcUI z$1^^?BI!l%Ln%IBxu;!Y3y<9x%D%p*leVxFQ$tYC7K_qf~U7yS0%i^m64hZvTqEQo*Hi4(EXkXefKk&%mO)7F=1+ z6ZYr~IvMMdELH}N>YK(rE;U;3BR58z!t#nmJmdCZk%Lbo^zL}Q1=u5J0`{n z>8baDO1+8JYizzlzB0e?;%r z(EGUID7HjD_v`zp-g`szi$^RuN|I_ zpEXV9Gy>Hh+7gc%6MehT`%JQj(Q16+cylV~s%77evTybM9(*2aPrl~eRpLN$&% z!CW5mEeg8v^`Jwj@PqJ*P1_l_XBySw2lS;Vpr?uhl<@KB=0pEKBl#26dMPMJfIqf| zA3mSid8!E&Fp^{bQo8j%DDVL*jg9&rThRjcdxrf<$IjaJziR~S>FGO{J0tU7@mHeb zsO&jK-zFHmj-LRfCk;D#cunu4D?(n;%ZWG(Ym+9v;YZaV6{HtTc$WdaqoY?W;u*IO z%Da`_zK{Cr(H36Y+dDawxf#cMzSI`J*9(+=gdrVU{8Qb^p<;4C-Y1V@aD4n`4GtXU zX*IQH?+G;g^n|1QPHxdWoPxgDcciFOHId&(+M{DTb2?p}cD0;8>D^4v8u#4b0a`oeCwSxT?Kpy=$_19_c zm3-)27>i@q@bm0e+jH2<1z)j9Q7Mfcdp&8LhmvE`e^Oiq+5?Vf=%=Y zXk`a4w?Dvuj?w)yZvTqEYH_kbI13Jsu2rkma=DC}9v)u(sk(UL-Um6PF=zql`zBD< zrnUxa>pffL;o7fQ#4~Omkz8aNtqm|7G>q9=p}cnjUk~t~oaWH#4F_+CCca1w=!CzX z`d-a8CL4qTCM;nmMY69*jSuo@(;u^D2p19aE3D=^8BZ{YNwUJT>yo{up^smkk@>Iq zEA5X7$q!FW7AM89$5c&afAmHtI&A@NF&aa|K09;)e;xGM#Komwv505fzRe0ugclpd zaeFlB!M;+i)EkX@snaET@$tfW6nui}Pdd+qeJjW^_JIU$oyCQRlAL4B*2I+*#2-R%1idOTBTBk zy9f4@(^F~M1+1rIN8`>2Hm6T>X6dINK`%0OQ&b|zzO)`#;c z^yzSTvZqrw;U1t#=wGVcqTlz5MLgs7Dg`VaS*?eBceBAzK)&7Dn;fl41NQLEQ`@-l zzpt14C@kk-ASMM_dqMl@o*~52Um?NBfKjM1i-tX{J=}au&V}BO&(-_G{^_3XrjOoT zGz=X0=pR~Y7S7TFE%ZYmhw#`Kd)ONW=p;7HzOgqx?7^2Gp`&{IG_Y>^Lzg{|(CG*I zR=U~u)`psV`^wH7OwKH0PQJ1~VRxSDNbKujf4rx=YI9Hz)B8g3(=0valZVT_&4YG% zs#~wdZarzcVY23rqpPo@?AZ-I?7;#qR2UOI*_YLcaNNdgRLW@Lm&??9@%3V<>%qg` zcu$OA3y&9Q)N20oCG?_+3bfG8n7+8ZGjO;(RijtPevK8x;h|ZDtn$h0G<);qLJ3Or zWGD4D3SV8=m(a?uR+N2ogg0Ce4zG=McU|ngO7@u6X)nh2L-(JCbrUK zV9yRJd+~~5z|%#>0KlXp&EY2YT!y7&tUy~pnPvWqr-xbehU zeJek0WSKq2YoV;-=VA2~*hA|P#uE(UV0~c>cOH`J@91RGp_S*4$R5r_ zlV`EVEL`*qptVc($ch%+{3?2d;OpU+GOyQTe@UV^7rI##xbu0ceP8d41NPi~!8sYx zEZclx4>yhMMel`Rt%lu`rEwo;^m$CGd$5Q2*n^^q#XHb@pl6`v$MJ=5BzkffU+B}6 z-dC}mtgrV+;~z&lcbc|OH*}RuNDucO*ufq<&OOzQi1n-BKt>YYyZsP@qN zny^QQAV&kxT3}8jigTfxML9X2r~Lf#9#)@gX-7BxcpUD(YI|8`-@=?L4BcY)AONg; zSZ74`wNL5iA06~`SSDQGTlQF~F+sMGeI1MT8t4+lLdGh(_NAS_5RODoc34NF&em%B z)iX5jef9^Zlb{W&-)EOS3^uChYKgTNwvIwu52l~=KSleVetuj7pIU%$gsu+mxW;{l z>YVLSkv_3%4W2&pB~hFU-HfT55vFYZbM7o?^&adwht&zK4710EDj2pC_DxjUP3#K` z_SITN*~c~TZFyif*DBFt>zM|61snQsoeK0m!|bE|`CW(oA=pR0Z-sVeaSFvkg)z~S zZ6X1V>u)T3C_YB<&^uctd+xFlUR)~rK9YJsyE zr#7EVUJorkZ?`hsr%U$OPK%X1Jaw@5Dy0f1YFqX*6<@mZpJK{}vWKUSc0E4W>OPx# zADNKX`b61-y98{dUAN;EQe3=jv*%QNPSj(c9N3qY{e+!6(vXig`cMOO?L5VgFxLlq zFYMv$Q}4yq%O?BCSWUCYO{C=!6AFKP1=AE9`Wa^rR`puBjuE^DtaYGgm_n7xe$k)TB6JU>eUX>p2 z<4Jgme%AG#H8z_ztM1Ts{1Mi@;HEhhTflGdOjxeqvT*uX|iY6PP1Z7em3yI^3JgNT%ttw zsQjeLz^@x{8Mwo+HThYP-p>X<5@wGkp3k1TA8a^ee~@kV&|CEGz|v!~R*mEE)cb1n zb9U&v^*yI+IF&!#e6W`hTQn1}+d8yghH|paKGL6$&E<^VOB;`RAD*J0g=?9=8W`ZUa5xjXcQ{T}v{w&c|2~8j3Q0uS$`qAzSEXR%v72Bka+|g`sSC zw(#|((mypDiQAuMnZ2yG#K&cQe?7G{7wi@|3u`+#{6V+Us!w!M0p@OB)CCRzxyFPI@MN)GbJXxC0ct2HxS-_vNr z?4y=17r88h>}dnal$z|_N?zdekYRsC*<(X#js|l2M+1h$WMiVLywJ_2k^4s?HvbA| zZcynFI7#gU3(u`xliy^yKcCZXxYa_ngswe8SN3JB%HjaNV)l`1L<@m zfh|41XD6e2A7P&p_S(=j?DuTh7WP@zdzo{ER$dM4tElL~zEp(I&sABng|4M9F1~LA zaFpyXO}B_;Op6JNfhToH?t{>c`t`*b3Pvo z9bDK@iT(|TFiy-eH2c#`+k6Ot33qVs*|3A&!}6m;AKkjxHl33Pt-hD0}c4Clc!Hx#Hn-bU`qf^7*S(5xSuJ?e?&K*|uWM3_n z*r{9LKpx$kK<6!g9HAauJDogL_LTr9@)d@V;$O6vhPJVr$H`|KF2jaWql9m${yo?WN&jc zQJf3i%%(8rJv^54OlIxa;!mTGHHi8|;7h~agW7@|Dr|J_ltu3`i2Ejl#V)ba?AgW> z_MiCdu?8C+9~yfZXCK~g=ZaxZtv7Rbj%8lDUuv?i_ieD3TAnuFuwUh*E!zBR*C@Ih zbSDB#*?Pjx0eA_h^czrr;KyuFn=cEgVxlM86vn(4L-TICUC!3iCLXIfTK(~!tC(m24bJX`@%K%BHplS_E_;mN!siLt zvr8ZQO}GvG%fKGJI}GTQr_HC!{yIALX!J*eUX=Yhcac3na|i2qIBd)5nKI`O4~)w= z`;yDPp-ntr?}hzIs8jb6u*cF0+Uy!uR4RK6;<8g0<5#0;XAi4zl|9z+U{wwto`RlX z^zH<6^=J+gHRB82jH#OuLhS8hfW^z_3rzmC6Z6O*y}%`4-^L(5&|?su?2EMDPo+~A z>|=aA%bw4LY~gWAmOXm)0)w~^jzmwM!JUUg?9sOw%wb@Cj~;!DqHo{`C5m&Qn<=)~S9!p( z{RTTsl6|lU4dZxk+DC!wNf};~Wu-*l9!GM~H_PR;n1fcYebO0A=g#4^DEn)J0jt0h z4BvAI7nMGKPOlF|A*k-NY4fo;Y!H4zmj~H`jbnkDH8kCV5s zdcIaJx3DO;3ccr2+{1&b5w(}D9kSQqd#tw?_QK!Ex`k9R(UToS(P-UeIWf(9edH_I zA0J=Uh3Ee7BJ213(&dGj6JqcL1$%SEK^hgn?pJbkX+!SZLjQ~(aML| zyIGki&V_E~rZN(*IxNi;hQkAS8UlpY95|iW=fdK*SzePB5nVoFt~I4Pwd`fuf*3ry zembfPEx-^iD|xgG;x3X=z1MwXR3JV;LL`>qd&?gEna&9QWn&Lbrtr_eUTb)*=~&wd zdMdrJ|BURhDC-ijuRAt>)%0#*)*|wOe^3Cd$sM~R_>P?jWy3;-DAAKc$;1aRL=TOr zw=vh6-@hSaSfme;Wf3YRXRz!)A$z#`(W~j_L7`G~)~Tzc<};c63)Mcvwb z!snViw{yq!ZZpYVyLCWcR3H61l;Y#@u@rT)0$CrLMa3t2VgKavv3JIBo0y<2mEOpC zrWzCf!g>EEW_V?sXWc{VPS&3D+N ziKmutgl9WzWhX`-f;$pBQD&MS7OI32J=sqpBFdhdX=0)^$6~P67Qe4!AVb+>^h$!D zAFWG1kUjR z7=XcCO%C77QcCQ!iB4T?k=J0)1`Pi3$tjgxxw|A9|u=(ia~G?u|x%0=w@y*#n0n}E82W+rBEvsu_d-A zow`_phKD4cV(?P%)7Qbq`E>hE#$E2Wf~8p5WA9;#TB#UURXcmCJ{R_E+F)Z@HTpo0 z(VU}+J{gXgnDzEOpNgm^A1pB@TV7qo794eUY2sn$cupQ3nRUWPC9_ur~${Arv17-C;RN_ z>rsVS0I(#p*zFc!1u$c2jK>}0MFaI;f>;8e?_l#~jP{qYqbli}?t!Ms*<7MH7rL2E zVQzXu)WC7|I{TQdD(vx$5V*Wtg)0I2a2eRsQI}~KvaK#EeN5UZ6?3@)7ix4mlS!8^ z49Z_3kR64hvk$$;>RT-2!=?+^fPz&eJ{im7!PM@@IgI=!QA4)S&BWAW-UU^i$f>z}6_bwzdDw2L-YDc(^WmJq&@QKT zeS`vWceY2J#i-IqtA-~m8&uK@Na>#W~` zz{0@2F0>k&{~q#U6D zkbO7R?3uhEObO{>u5v}$8*fLW?7rL2vc-&pf1l51F0MuZp zFZy_3&I5TKKYsj!$B*SRoO{48!p+AfJ6xEJjYq@JY!!`_cD^}$ z`~!p!Kl~8*AEN=!%{j0p1MsrrH>tCs%oxreAf)YL1M_#aP690&a?EC0f zR<7^o_~bVY$fP>tETY)^n@m{Tq4z`uTIgnyOs>a(mIF2QmnMJ#P%&8#ejtv~2I$xx zWkshS(6_lDgKM$WCP>GC6dqA}dVH14u+Mejn#A#k+9ODoGID)CUn~_-1+oRqm8#s8 ztP<-B*#fW-jzmw^6iT-a)mkF#$``ER6)2+X zs+-&2&*fPL7_R=@316A;HNw!(%TQ#Y1SNWMD4BD70D3xm^!6ms<)i(VV2l9wV&~K! zEN0Ch`&>R!7}&Gb>Eu~|6*~L5!B<}aKL798L4m;ibx{rm3=cc7PG`9t?(;CFL*^p~zKl%PaU z276I)mH|N@z<&+HlTsLLaZu$i1njBwB#$8aKeRa*eos`Og>Dv3XS-c1mLWdVX|wX1SNVhx@=2bspK&djg}l0U&_I2<`ekiYnB2z3!c7V zPe)%ZzBTz@Wt@E_4=cUOZfwxc!(RK-7~$p-y+i)KQvw9O^z*u9DFfs81pC^4p+L1S zvI*be2fTNSEC~Dg!hR=@Xg-fB0NG;MtFnJR9BP#>uUTgAmAh0_Kwp)%89(LoW@HO) zUV#4Y_U7j1_SUTce=L04N1CWAFLX1E)G$aTubR#(UXH01kb{VJQ7J$lEPFBYAdeu} zrRvWvdqbYM^AysAd;xpzwA)1g&}jYrt&JNuH@7x#-rTsgy}ff+^q=tI@VWk8%U)w4 z9EqNsGlX9QeG-4oRQf_c{DLzmPf=|?4gGM4obd$y*L=+``;zE7q$7J9hY`S#1!gO& z#TUwVZ{NIea|4P`-QV8Y-oAa0#|a<)o^*}sN=hP%=CPz|76 zeigFUI)2DjP)qdwD^~bJe2fVTB`DF8O=3;&YXm$$0)D>x$3OV~`|rcB-`%=-}L4P%rZhY}TNp_`fXc9qifYxjAf2$}zY?C;#(zIk)&&hEPp-g);Q z{_Lk;e)-d%fP4p#&v*va%;_cyfGUU@MPrks!Wa7rPIVI!ruW zeR1pHck9NcpohwT`8@=M56$1)*kD8NJ+$#TiIaizwF=!_9<|9rI1)V>Rk-?d;^&h- zwI8$@H9=i|9AVz98urlnP+vYjXOq3(5}!h!>k@u9m-{R4?cTk;c>`+y;K3u1fAr{k z-}{pAfA-+rcXv@21V&%k+YVj0P>JGP=w`rc)Y^bX2FMW$o@IeHfI%|H6Pr)e3SVRL znoah`Hcyk6BVE4!?t8npZ*9V-d&i>xg1Qf@&no}c#?4!Pg|F=WYo?pMsJ)EUDqCOg zMRdI2uqg;~r0TGDxHFnb_H2!HyIqlO*2{Ny@9*5&+}PQD@Q~L25o`M|p!#1@@ppH& zMeldfw`ZI^ze5)}w~#6(da{n(s=>FCD{1>F^p2_#eY(=R7w(v#8Su~MoGo~IwCo`< zqaRS+-`d=Qlm7t5UaURg!}@>u=)vyYot-V|)(_Y_)kvz@bJ*V1Ysj5PS@6YY%>Hre zZWrtw;12q1vZqLZf0pJK-bdqpYkT9Cvi|}#J;IldVED=Y_FeY#N$-wn;5!`#DQ6!c zpUZ3Gl%NrcUAU~P__M0f0Q(sF8J(j|^Gv-zOZETed%O3xcXn=U(bfCjmtYU0|Gh_e zd-UM#ojd5*H*GxIx#PF)p*Ab24aUA3JzrJaM9%(9dE=pcSO4Td*)CZyD;I({G;ZQT zYK31xYH9Mp9@BN6&s6;nVDq;&Z*6PeJJo@ z@fH0$_qI20=^(xg@a)g&l^$tsvA6^N>TLFv z57D=?vw7pjTQ}+Lv2D-r=n*^g?_vnws=amd+ifTJ(knd^nWtIrGKP@nW)kr#u!PD> zfk?0POrFyc#-8O&TX^+2I!)o3%YFd(P7hRK!%2xK?_l z$F`x)@)MgE7yF)G>8+eCs5s_n6jnJ;2PS~)a>`_1lnq5>6{cwZz1x_ecjxZCJGU`k z=hmHj_x*{QVf1G0eXd)qrC0i(q}qJA`1kZm@5}0Or#uPL%0X)%8_TRx=NYgp2TO1T zK280t?c29^PynPiFIMZ@Z7#xvJ;jeRAU$P#Ng+$pOACj4CZUxRY$9agi`}Q~cLMD_ z)?vE_ANlCPbJpz4lJpl}0KSnvojGvvq^GZ#PRW@ndblq;q*wZgt$sxrryXX0Q&>b8}tIrbzz?qUo%C(mI$1l z5%y;YCbizB)O(k`%>WX#@fUs1CVS!SzWigu{zZAazfU!L(zS_oNl(WwDf>Wtn+-4Y z9?7@#vX3P6?2j?*gEnG&W=OB}AwU0Y*_Zw{z0xlvQkcEz{^W-9c-De>+KfDQfX@?f zN1>SUjEO3qY$qxW<357;-$T*$J&kH@G?kwppUa1s;> zz-oyP2%b74H3ybquYTb9{-Mp))CfD35Szle-UIfv)lLlb(AC8V^rB`}oKW82+ zd0Kje_yhx&G4^Wn>31-Gf*37vY+QlM@hjen_H&V-+TZVm(|*u0qgJ-sD=ZV`B*qxT*j zv!Gja<=DUjbiC-BF$j1J$MvGep563HA8F$)lo|7$oL=eYl|ar5*w@NkHS(h5P<~o@ zRsf>@bO8Bvu3qKxhV)AR4g0zI2kh&3$PO|4O}ZQ!c<9PS9Z$8_a?#nx6Tvf3-_I@o zQYWUjCB7q zXKk;(pV$B?7oGijshkb=3$Qe&vd@p5ej3jBeb(5sGov>$k{P+kzRGR6P>o};PR{AS z6-}oRAa`NUGJ#NSv@%fNTX5)%TkrLULrl=d;tC1&tEu;OOyeGU!`=|H`E^FS{$Tnw zz3gpT(YJ^HI=y^-4J!-Qy#dx8FrZ{p^n-(=YdO^MVBf)-eLhN02pitg!1KHF=?lOh z)Y+w*0h{ll<z3iPto*f1HQ-C+2(&~aad82=ar9fWj`=QH6 z`gf!PsFk?0Lwcq6eZ5%Ojh7Su7W<31gXxt%F12yTkO3!SYQ2O`p-!7m=%V{na`pXC z2DDob-|crA&F1BpyAjWSuA}K?KUebgBuDQ%1@`NS%@_T)#@`eNj^(m{CtoX9zvknp-8rBw%*E!jBuLLL4vF#a;EAI3Z`h|6 z{vrkW@R@P-a^-rB>@}FNT(>{Z`1*OU|E9iAIr})z-X3#GM^7LB)P?U}L4D3Tp1RMf zU1|WlvN+h6>v_-1+E@;xroiUSk$s*hv&^2yxP;WAU$H4X>)ncTFl<)JSa=6Bj(NHu zERgXE3&5xy$0vS%n=6#CH*+ubKMx;y zjIY}C!=|EDT8i{aZ~AooOn4cQ^h!UMw6?-`*rSbyAo>lLPpAhCJeC300)MMp+0lExqi6G|mxo^uCqHn4Oq+ zzc)|RUwk|>cYA-eT;~e>^h)oKUnFF&N0{nE16@Z3+J z?(jvH=ZMC`2I$;v@dFCw8vB9LD?L*-Uk=pSQGwv?jgROUqG^Ba^^f#9GmSbrI?oL0 z&4DwM9sSa4vI^IL4c2V*y!Wh2-!SZ36R?+XcrtmaQrqul=Rww`HH1jp<(l@PLciDfY;?_A> zd1kmE>HGZ)x=?VLGm|~_Wn*>x5oRY3o5TJ`Pxx@Pxk7Na7mB?y>6>*dC}x<9kJaWM zolXq)z7k^LeqpH1P}@2x6#i$k~)u-|(k zM_M)O{L06;mw15|IEsgvko+(Izh5f-3se2L)XqAFRaVa?$A_HGaeOj)@+2|#R(ezN zFOL2!NyEp%UORWlo?|!%u=&c~vrT~TFWgTHP>wy77LVi^E|$KV%5&l^EUfj}pI$*D z@0=gluVY18;9wxVk^REF9-G2*-YXUDyjz`|+WLM^U4Os%H~R_;2pV^)SUiyb)vtaP zqJIIVe|DOuzTqA!F8k(_^ITkWi8zrKIA*1HOFro*Cw--&q*o^=+Oc;u-qX_Hcl%7` zmVaOYNvBWk_ob!>c}VZlr`tDu`eH}?B%T{-)sO)J`*E|`oKx`^OHt(Pkn~Q;zmO)+ zxkBp+Rm1-E$>|jPbMqh~&q5zMGl#u0KeJ0$Hl2Ba(JU$Uf?O(ksq`&kDLo$SU8Za2>OFe&x!Usl5R>V19&)9Ju<&-Z?34bBIQ`Sow|axwg4CHS{+*8@b$yI0H=srt>wD=aY{HQ76IGc9jY=OhyR0>kT zS@tKVW2*gp?%qX7Z<;zHJxrjK{DsSYtn^K`U1pbK%l;_`aT$)sd+O_))ulT+IyyQW z4OhfBS-b%Bl{FPzF>52=lzut72z`;8Ub6%#U;*J~f7qPaYHQ}Xc}}4BhCRme;(r1) z8v35#MM*DCUtsx6$)B74Eb04e2Zsm;qj*sub+e{=5BBKNMjLM)_C2CUvtWhlDc%VZ z;4Afc5m-ExR2p_--UXaA^ilfh_Dk_U-|}0znFxB0408L?kVxCZo-V?`;uQHDeW?`m zNJ#IY`S=$-RX(qadT^Qp%D_vKp8BAMAJ1|2ZumJOrw6RC^(3YJ^AXh z&R9EjkH-@&D6_lshq$H~i4`UifmzSi$vJ6NL1^z)!_~gYk7%vM?Z-F7FU8_4-4Dyn zM6l>E$XyN&MnmkIEvWQm5R(H<>@ItI&C`*@|P|@`li);F2#*dcWikX3;-K z`Xz_?#FVhHWY`CcOl(@3mL157u*U=rXC{x94yaP2b`81| zT=ykP@6(@d@6Ri}=qErO9j*t}l$Ax_!Cst!PpJ1OBR+d{>&>VrSfr2#$b}UGLeR|j zO97KNgFo9gaPO5Y$vY=n`f`F#-}U)LZdeEeEozoJ6Cw5jCSwNs(Rx^Le3Dt0a`bcU z(=~cexxJ~P;x+ri-lzXkrT0sIKz}jm1(K3lpB7#7qAqg}+aEi6FJGWrFP{B?7lg?t zd#W!2vtEP1AQwsKQ~?n5RBOlFJ0~f9F$}Z}QbMfH&kH)r9;VJjn6%8&`_U+B^&3?) zccI<3?2pCfi`>nqf84?@ZHGsW)qly-OCGW0lRm>@(kphN;xtTU9eu6Wq?PleV>1Z5^Kd9C$7bj~9NA$=_7=nJq1JrmTwr0KpAT6fZ4^n0c z1WulySDbO=tnv(;+D83@@u zugBa(kq_9veCe50zBjd)^uk^|eRwFNgQ(FH!43OblzlyR7|$Dt+9MBGP~hoG2~-e# z^%X&m%ZntL1%MG&^(@S@$XojAw(IpQRO`sg-L$yrjrCqOlV-9%I2ak!eDh>qTywzJ z`^o2KqOR9&)Lg6I>Wk+L@qK465$XLRy{Poc9+*smL*-t?Zh19rX$EbZDV7!Vlaiu2Na69 zR=-*@?K|cJ+2c$I|2dp|>U)bh6DWSOAw4ArZnJSQ=_x>>(hGdwOhv6e)**P7eI0sF z`62$Pl!}^}xi25=%P_*;_}fwdf>J<4s+W8fU?MjUOZ9yYdX$8KzW4`n4SP{@L1w1j zSStkeiA*U9A@@Iw`aaF3tM(52r-nTYgYkk{5E_l)U<3`qI{sk$8T9KpH4&4-BuOne zCA~SEp!78NP*SV*2R+w{wIL-MvbAcZiQ0{N5B4L6eduJN&prdudo}q7E3WSu*M1<)OueAw@HF*MHR9tAMMmpGTZ(I3N$rQHn6D?IO+NG4w>-Zc z;MM!XHDu$+YhkNld&xzlSNVxPl*~ZfNbJR>SN3R^nB)ecLuzziG1RKqJjkn8O?{7L zInN|ZV!HD^=^;gVvfeKBQ-gY|6C{mu|}ljca07 zpIkGL-o{KW7y}Tl21suHa<5m!^~CFQs7qV_4D9kl%V+w1B(~m+TpP7-mvj&ldjGM* zzFn=hT1~J==LlRqJbJX>D|=|QVL#oi zXXQRTTI_6OKld`z%TpOInK3&q2JqoN9`~bsSDmBzz(9_xT+0)NInY>ADm}2i=1DC{Ua>W49 zjF?{r$emVt#(8HR7R&ErKl4=o%Ru0%7)@Wews+Y-LF>-17h9Ebvx&XAc#XpYun%3# zzuBzFE0$jLo=eUAur3ZC(2J`FzouTRHXEw<%3hXaMZ5Ke{snMJR1NZRme5njZ7xiG zG2a36^Z8Dev;5RfN6@$1;#OI1ur~jAf*sTX_U&4w)-XfChX=jkTIgzXC+8JOFM1zJ z@d3*{?HXHn?8Z>`^*x=mg{7FXBrDpj7nnP3G79{;rBD3Cu*jiL7}W8{ZY}?(roKO( zpo802d+~a(Hdm34dIR6~$psS^YVI4Vym9OY%AWkuu!qXmXaXi_1t-$5w_2*7Z;wP%~F|Tm+2i_psgbA^?1%mHv@UcUSfm@7fOkWchYVI3q`eN9x z4Iz_&2YR;d(7Z8_SA> z&P%{v1~r{;kWnf+&E49_6neR2;zG@RLzP%6=aBF^prPzBKLd;IT5x4OPuQa~=wz%* zvRD~7s&5+ixD>W1MQ)5Zg=Ox9sE z*Y{Dq_lD@nm!FH`XNx^-vpVGzfN=XFEjleg9+@Bxe{B`j{jsoLJ3JjfYnsey1gbx@ zB_1^<`gWoBnPd;6)%e8m=2XyC%bw3r2!&SP@4;82?-!%A>peU49rD7yDUz#?2Qksk zuRog@^c3tG;7`of8!-I7>cjS_0;uJ~g|n#l@bcHMh3N9bl~eRpLN$&%!CW455(>KY z@T9`e3VXHq0evY7=&9lWC44-(`OyE*Nd82%UJA+);E%20htFqro@zn`jO3WVly1Eb z3VgsyW264ZR>2ha9Xo5=|E>|Rr>E~+Zte;w@e@VIQQ32fzD+QA9X|m|Pa1ag z@S5I7SA@KxmlJUo)~8H-!;h*#Do8Jw@Gb*-M@NYZHTMmJ@@{3f@1y>Dw1tPAB~K1z zZpQJRFSUj5_2Au`Fv5_I{~^sbpNh!=d7nIr!SV5%H8^mXr`6P+y(iG{(-V&JJGn*k za0>cn-<@^~>r_}#G@VXOUN*%x-;u_Gv;2nY@L0BdukW264CxA8ojkX$j{kjMo;1Q= zkMQ^fSOH6a?t+;3iJV#(U>Cu0aWw>EBVm5Fc!zI;pf?{w&$>y z3nnhq+&6SeyrfiKfDLWDM%10dVqEAw=3gJJU7K{LW~MjMBcPQXyj(mcoEJ&C^es*{ z2xr0J(Y0!|S}vDS)5F87KUEh`-1{JhGzKjoecuGi+SJxy4bPx4r{dakqe%S3h~$#w z(b@n*{==B970P=j@bv)y$!U&HJPieJh$g;B4d{fwp88(RHYOW{0wyeBCq=TaNR1Ej zXwx6FW(XG%%ND!MjVGAIBst;Pb;(}S(8sS5M>_WnwLc~#KRh*AoD{U4=-e7tZT z1)re$lg@Kt-wLt}KA&`Krk8BJ~WwY-5o zVhmf2YrlTtNawy`yNzWez=$r`{&1*mda$q6DwQ(aJ+Pmgo=Vd$U_Bi>8h3so+0eqY zU9<^JX!hmQxf7H4iD5~gu9^c(zCQ!g3e#?PCr5|k&0}B9sRn*Sm*}Hi%rcLvo(~*@ zqq~;4P;=j~-5!YEj|M(5%+jhiFh{El^wnZ#GS+5&IG;kF4u>auI&~B70h)yVrP?j} zeRC%!@e@@FSUj>?5Bct9gQ0+YyR|ntT9XFs;hU$napQkqFZoee&cQ%T3bOVEcARVqXvY<2~I~n}d3o-WP(OX6Z4XJY4Q=9<<9--Fh{4>q*-UlQn-FU40#8&u;Kx z4;C<)QoPJvd|90c$8EeurHm$ixlFwmUoV!r9z5)g_rwUc@OXhnt>!;pLNB^Zx{~<~ z(-*gQ1`gxFmXS~)dwB%t;h|ZD?3^*p-h7#iB+J~zNxhB2R~PmrwDPMJWgi{k4HtyN zYh&GA7kjUgJ*IWqi}8J#bS3i}H1Qf+`eCUU{<`ynLWm9p{(NPVf7W*L+cU7 z6Aa>DePIlD9%B0lGq@%lT6zA6?BVS5LYUew_?MxQ%x|K=ozK(k_Z;@8lSv)0?Bc=*UAKqWPrif3F(&boeHE_;K3a>&m}EFEa~FqoG&;q; ziRQi0doE4+G{Qd1HXn<}**fD3=HOri5A1=yhTW5AvBxZ2^bA1l$sSqJf}3AOuMm7a z{8Hxidh9P*hDtKOi2`>%PqpvsopHdPyDvB=BbsHKFYMu_k-g}>5Uka(d$Kg{txes#v@Oy$5;*T7Dc)hT}4K3F8ZWn$r6!wv+Ys{%HK;Nas$|_UVSMk_qYI z-UB<>W2by&4|b^T>z_$|A8+%)UR}M@$sW}ndS4Uv=n&*+09p&oiDjrH^P4Cq=kt`G zU*5y&b1m)YrXP>P{a0--%j{d2bA_Q>>>dPwbq}kn$-ed}{rsbYo({`|t9;8ID>Wv_ zHnOi{(Ov^xf>_8{Mc2Nx^ONDY%v~JT(WtYvntt^R&3m8y!RaJu!|M0hWeiN;1D;>Slx~ zoBy0U3tGJgd(L5XLMy}Uv7riv?Sy?3m39;R!h(IZR#EnG4SZW3*v+*{^w@f)fnLFe zK3t~)z0WZFXn%g!VSfnrk?&if-C3MMkxVIG<}Nmo0LS$=mOT_7qj>0@t&%-=SqU#L z6@4E`J)m73uS=g0Y76>|>LYW59x;r|q$`=9K#Wi6VeOTny#yO`!L)*`rL5{pUpAs8pf% z@b)kOT;VJZ&A()Hc$vGz=({~siTH9gHu0bV(0NX6KAF58T72GaWw=k5?6I8|D|vY8 zVDD8*6;9N)>}M*zbmu?ClnrGMPao}ie6ZDhHuXL-A+Pm`vIlnw*h;%@$19|`c-dyp zsra0z$38i*FDv^AJ9nfZA8+)b2I$&(iXUOF5AsGS_K~rgW|5mn%OfTf z{`d-}DLC{q&K|7lwQ?OJcnw(VX1P?Zpu)ex&K+Qn*Lxa3cIkcwgMsecDw+$l`7IAs zzj5_01ADK5Y_RMxYnjd3aHWuOo8O|h#<5uN$3Pw??Nk6?2lCEhe**UC#)GSfeOajY z)ESSio>rdA)WpgB##Zhz@0F0RhfOEI9`(E`J>JKY@D%;5>pg31Hf_qa1~%8hWIa^( zRSe{D0RIfVKf&~TOy)<)!Jg7&&#s+j#hUzV>V3FRx8=d@aoA&u{v=d5u-SS{0pg)# zO7Svx@e_uXF+;D8~jL^ zJ(_qvd+L6$;gJ17w%J2((YpgnkI7m!j>A*$tJTlhq3_oBoUY+i{&4fbUPf%uOu%mI z(0&=p$u|2)e?B&sGkPy=JnDUTihh>I@1eD@*<6jqP=m8in~&(zFni_h&=>Z5*iV+* zY_mHbV?k&r%J{u1#WMCNncrBYjd_o-M;8}{vfba9E~e(A45+Us19@We1KiTmmyhh$1N#ZAMiae)(!hiDz<99j z)yssp<3KdgLYRHQ3~5nvkUvJdb`n~xnd$nTMjK`ywS2kAWf^2o8&IayWban;0-uKr z`zy*G8%lFDkkdaJFeD}$m(j>%elv~SKN7L|S2%NnN{_%vYA0BDZta@W#oOZ*l z7OEw5?Gd`NFJn~}2k;fMk6a^KAgK3aVPD~_4>$^J>G?f78P)p;`<$@XhOS}1XUn#* z&$8ajoGY~QYG7YQMGy9+B7A z2lt*0JLo+uKRWc$t&45bIeEj>?$+A#GvfRkp7L3N7zo0OEZBUG{9*!6#@V~i#lubv z@+{cVKzCCD`(t!!_&ZCIf5!D5@Y%V;s-Entr4l=JD;&t9n-l1~<&PuOgKMXgr^>$4 zz#fazMNoqou=ClH(cxw8VwE=LJ>0KXrqgq9z&&&j413*f!u&S#?Aw^2DeZf_)M{i8 zn~!y9SINE?-JAxwK>8fl_>}cMpeuWf|B=1T(PgM4^BbGOnD_8l&NG>{V~anHKGq=W z6M-)cdk<<0a;UJ;xl3*rnzTUUNUTS&Te8YZ~leTE{uU(_)ZqS_wFlFlrI|tw;pwe$Z{ed5|J#D@u zqr=PG#ilUky%?Hz+wF3;o;LAV&C%+Q_iUxcpI-v@=+md22fcv3>DE~5tw-Va;QZkE zsN+2j+DVr#rfzU{FO0u$^0PUPS8&;51Q$L}z@A~`FbzxPePr#mw-K%R?ueG zu%c4gV-S~}x){G2O*?y7g{$nbjt8r9@bDD$45N1^n5#!~xQsPU<~K~;j1XdP9|J62 zK3`z+ubr4j2I&PZ0sA%v@qr$L@MK@4{eCK)x?msU>sj`EE@TUjQ?l&Qs}~r=WH>H! zml@o7IK&=(o536g*7xYq$4H*;Ev6UAdfyJEkhU5$80;~a!zp;5fxS3;c-m_uh@XFO zGTD=THZWNa`?hd>4=4Htj?gkxlKG8di+z;`9NTZO!z9@Ui_kER_ojUmxSo{ZHCa|l z^zCsZ7k#r_PK!Bc_1Y($v2^YnUW>B7HW;u9Ji+iihj3BpDnQC z9lpnUdtop9ovcenhnKmFgD4uUyDTTBd9ROrCHv#!tGe*q|6OGLo_~CqbS3i}KZ#C+ znh&eb?G>ANEFxAT8TL{1Z1h0yPbXKX_6=F6!l7W93J_c{8A+D8OOVE?m}~P}U9v|H zhv+>zvjG3->S?%vAD-(GTyL3lCG(pgjW(uRt+i2IW2P>&w^7HWEt#vP=xG4_VAzjg zD`+fC9gl{de);{T^IPOoTMuo&-7$5G6tDdlO7Svxab%4~YmN=CaTuGeTyc2VrwjILn5yg6 z3zv*NwopN5Wn(N;Q~{eqIt-9p;G=D??4QxfhuFJWxeS$Le&ePx60bTe%@l^i19=(( zgw`B5o!IBX;3jW!i!mJi2~5stYZ^5H2fuv<%`dl2N_aePdK0 zK0rbwmf?HL9{ril2>xYb4^5`<&%j=5c&+JJ+X;Fqy|Dj`?6D~860xs4HhlR7%cZ*?&Uz zaP^~C)6dJKE1BQKr&o@;de0GDspaJ9Z)8skh>g}xoeQ{izjHV%-VOWR0Xp?4 z#iuTNHf@dGgFO^s1fS<4{_=9^y)%ZZO*|HLYx4=8Yx3OA9oM_fBzx`F0ew+@^y^TH zkH^PS)XfTHeP|XHpXi1Clgr268N+R2g0@t8Bj=fFP<)K$1Pz;Zw%JqX*`bGOUR58n zu*m)icA8;eJ#PX(9`vPun|hB4`IzU~xJ)+RVUH%BTD}pU?W~oZ7<~xtNbE$JX?{qi z_FCpHei9K;_S{Sp6RkNGgRQpseH{ZC${wRv5(NEdUGjnKvCl@+!-6dLYC(LNbS3kf zAdOQo$L3c$9L1*T!-FJQ&#M*W`eVl-oYBb1NPUk17|hk=@VzXh#7>*&)WsHg4fbrn z;2)oy@~KH`1SmhFcpXn<|830Co612skPOFV?h>C~IqIy<;B(@1K!Y0!s^TLzxE}N4 z;0jJL2o55)OuCZ!jhjsI^Ely(HlJH5)JjEciS0?JE|#F-A&I9LycGQOb+BmLX4D9Ks%d`vGRu`2%Che4pxmxMOTV7_Iq>lCoKOV5WS_kTarw5&sRkD`{M8e7w zJwMR&t#vj%(O6uURF}V+pAz9CfMh|9yoJAKe=+{%4BbEvNwT^=V#^4=zfRg z1$F|9^+oqtbHMK_XNi3-7lx-xOW4C%278oqQ_m4S<9Inf8O!6r)b7VQjQnO9dz8#? z#MEQn1y!BMskwX=laB>?*lwxbDCAf3;he$HE~j>VgaUEpN-oc-y;4hHO%JcY&6cn+ zGuTu2laXYZyO_dh-iof>mq()D0YG)H0QM;Btlxsb!oa=dK2q>_%_e(J(UOJNz-CJT zw_0Ps)~HRdTqxvY+iz$D7VuqBmT*$*5l~#D9H9V^eK*zYnY>Nbk&K)0=<6Dy2MtQ`j|`l29F>A5P|4h?Z=NV66*`u0+0;HW$vOWlx`iWwM5vJ zFMt8n9`ieFTFoE*=!cKNTTB2Ver=%7%aE#{B?o#@SLInIUCI0=s^!k-E=mK!D(iaT zFXRzlee=yXuU@;#m-Sx1H|SlxHk4elup{ruNV3db{Del6&$<9#%He=74xpab@I!fX zzM~0Xw+?Lw8+o4hT=H+3bS3i}NnYe7uj+5CKoMP6-Q50uF3&Q+aP{X-_{xN@5r%$V zh9b#GvdmpV$(-W@(9_wYw40d=kk%lz@Dv6C(rt;(Am!o zzWNIA`G?maTz>XK{=*MH_`Ze@KKPIYA)s%{0F+h3$RlcAsI=Qxr?Tcufmyq zw}?Ui<)i-+oR-Tq1NL8kE!eH)A5Lcgk1Ug}WPTH$-q@p5dewMv-`(By@xKr4hway{ zKKG}^T$ffq8A+D8i(xKoJFn4`^LaD!njOCkYJ+^+XRqjkYJcd89>kYPS2Di|(r9B% z_Tk42OaMKU{{8obJJ3t8{Gt0X@VmJ@`b$@nkz|>>fW4?V%YdK{;J=39Nhu7rIH>X$ z0`^pTl1C8zAKDxYzb})nWPTG)XS-c1mLWdVX`Y3 zNtU?_x@=2bspK&djg}l0U&_I2<`ekiYnB2z3!c7VPe)%ZzBTz@Wt@E_4=cUOZfwxc z!(RK-7~$p-y+i)KQvw9O^z*u9DFfs81pC^4p+L1SvI*be2fTNSEC~Dg!hR=@Xg-fB z0NG;MtFnJR9BP#>uUTgAmAh0_Kwp)%89(LoW@HO)UV#4Y_U7j1_SUTce=L04N4ktg zCi5GN)G$aTubR#(UXH01kb{VJQ7J$lEPFBYAdeu}rRvWvdqbYM^AysAd;xpzwA)1g z&}jYrt&JNuH@7x#-rTsgy}ff+^q=tI@VWk8%U&ZHj?3I7X9&Lr`Xv6Esq}?@_yuQB zo}$`(8v5Z7IpYcZulbr?_9fAENJsWI4kLge3(Qtli!YS#-oAO`<^~j>y1%`(y?y&0 zj}t!pJ?YXxVL{;34GGIoN#-}uW+6<)52Kb(@b`icVh{9R6Mefq9Den4#Iwx48Q=zR zOAStXf%EWMfyKYO`PN%d`_1j!cW!Opxwms`YkNm*zruGEUpsVhsbn}Va~GrbQ22m8 zN&%1y^)P$Ml#=h~JM4cB8<1hW_dx~NC6><@N`>x^=;(=`w|$f7Z*K2E+3()JbAR{F z*4C}t2L8i`uGRNT&@xn#`HipDWd9oe8SX~kLp6YQ`BlhX>-ZsCK`qhyuUO#^@i8VO zBgry%F^M(3uMzP42>AK#AOGO{@4pYjes}BUjT;+Vw{QR6cYo(Q-}&};zWw{V_qVsV z?`#l$MDhKl8J%U)mCSE^_VDn~){}rX9uIfrJ30jXj87QOL3Y%9_AvCAyg-FV<)3Bt zv(z5;zfdeZ&%?=w+TYpUxOsE)_I+Z1`<-{+eemGjcXoGf-P*pnrByx^-`4mQmK+Jm za9rjtKKo9mTSDcJuwPiE_M0}|Dkf?cR`>TyXybQ^fRE`cN?K}s@$>C)-Y`b#acG%z zCG#7T-mX%be(gRl6e05;ko}$8+c$4+-PwKj!8`B%!=L^1%P)WWQ_u(et&N*IM)3oq z@6UqkBqPZ(cTx7F4Ns0Q3~c4`EfU1n>tgpoQiqABt1s^vXCLV36n(Mzxj%UblYi&- z#?5V_fAF&}5x)51i!Xorvj-2}zISWm#->sH5Bz2xij!&JFGD4n-|QD)(@~L=btu5s z1AOrUY!Q(9KCkSh#uw)7E5yEzo72J>a)tfwQ=*7U*Riz|C;G$FKRDiwaV7ldl4NkIBW`n9H~0&9qx=~l092v z-ELQ8oAvVD-TOPYHaB*5A3UVBf5h7U3#k5=RQ%nYZPEK(^z9jE&+pJh&LyM6%iKjr zZq?vh$(6MI6naP1h(29u-3xb2&^W@j>NVufqb&I1GiLudb+-%l4sZv3HrZ1oz&}g#3-6$7plp{cn3W5`8yYupA+^Gf3QVR1-_JGd<9vccjc>k~7-`?1`@z#y|?>-dxu=tApoqOAxw{#F+hH-Ty&&=17 ztEE?ZUsz+|{m=1{La-b;N_h6?^h%F3w^-Z(e|0wd%7^IN+1b2tT=Doks5-y!y=~?Q722P=jC4^j3#P!IshYV&e zntGs6Gja*fMPAY?y-2|gGP*GQ2m$nN{&~TC%(pR)heqDk#wO-zp^dNMo$tJjVcqTR z&FyKm_cvNX=B8JAs=S77p@Pi;V*}TgI!}6Bggehouk+Ze^!+_r6d ztjzT1Y)QwSmYwuUPigaI?wj#qe4PR_6-}@7HmN1LIBeq6_A^I{*fgcY9*ukn+e*k> zO~T)Wn(O4ud-w064%ph-zRlX6l|AR_1}b7IN?a?w(qr3DXZeZEi;I0vuk=>V7E~Pb zGzzPnrvnqfbvb3SFUp1@vIN`_rT1m^xKo}4Y2~1`kBwzksq+k2mV+g@0-vV-*7oh&J179sn-{C~?KT(T z!k*&C8IYbbzNC;P>7|9kJ(JMN2{sY3@Wt-a_B(<09_z4OgO7al;5ln{W=Z;sF96?2 zpUxb(c+%5XOsC{b6+PUS9nvd(MDl5HZuZ1|JIAr~O5fH;y7TEb4D!@7eV0c7%E7Z< z@Pl(hdZj-%>HZ1GgW(*YV@^r0^da`Xq%Ra%!>`xZ*ZHO)z0%th>ihcou;1$qkamRd zS5$;c$vzNseZAkueu4ddf6(tm#Scz%W9z-1Ia9K%hacl_;0*?Sdx4CwhwQCEzduCs zA(BnJk@d2&7gKL!6oCB!=nZ;-=DM)YiLaR=U`qr}&j|Z71e03tQtG|S-ev#^+W3pU zXOq3~c3=LnVgI7M-QTC0J?YxSx}>M$my~@VzRiXgdXMB=df7)3diKW{_CXu5Ju{?N z`jDT0w(LuPn_lS`5-H5ybboTgc|2>uJZ(lEJHY1&I3*#y(tpE#ZvHNNdE{rQ_zcU_ zG4#m+P#FZp`}5W31w1vT;g1h~!#!wfHF`h zRdupYIwfbSzR~-+`3LNqWiDjd-^XKArpTfMbT|nL1z@$r2Lw-@k(vX`uvb6ueE-nq zYHEa?N{CJ2T<-z<+G-~Tdg$t61oA~}Q5HI!stKU%>(SdcXS|J5x$Dl`j$Y(~@7nkyHvUiJDV5r5~_w zH!=5^n1wZ0@H3(T#Q^K|Q5>#c@8+xU_|hxAvY#^#mOL%J($6W-6#F)|V8RAm`0M0= zJqPxT(Cx#E9L7tjUc!@P(<{BOpPdC5sllKQUKi`(wcWvM7|`nt(kuO-2hnX}gIrh} z262fAd`Iuw1woCCn6C?JoJlc{h=_$9^0+~t_>1ZOV2~PV^40sh=)sNmVGb`?~KNWGG(q0>197x z^6ey+klqVpa%NQzZ5RB;+)FcW|9Yof=Tz17O8-rLe=dKm?L&P#u=()iu!7rE?}Sdh zXDLv(kH)`LEoZ{dKQ{-06Kr10{hr>EKeq@x(b0Pkk6F+yx^isb0Xkmv%@_nchU0qC zW6y4SrH{1n7RroyPfoA&^GYD+1?+3(t{Qn!awtEoJSzZEe>#BtI#;i9c|&@o|AzhC z`~&uNJYE9Yq{v`)rtC z4j53fDf+>|(X|}vc(Cta%|0KcCxi`eY2f+Y`Sb-~5bEsG&4A5!(Q;{u`*~J;ZLQbr z&-&6io?iA&BF~Nj{VBkkP-%6+oV?M$!%`qG^!?D~BmFy40n|#|*&)5s`@UYR?8eK9 ze~bM^+`;rpAD7y=W5|G$F|}Sor%9Z%h7)h;yvURfOM%k{kHWo;}6Qd3~_ z=Ey!zlv!raV_ZUN(XZGPp7n0UIT$u8Wh}gd8OJLj^h(Qzs(g&*qb>! zz8>?yOkZ1@t9$3HO!L3XHhaG;58If1rvaN!12Ko|_(GR2Xz#PymvT@jm$Ojc`41*-et591*X9m`>6Kpl^#U0YgUD-+)S>TYd|>Cle&yzuJvqJ7 z+Z2wZD<7XQNHK&gy+O+h_iMxQJM5e6+hJE;(4U8oJjPdT`e9SiDlJ8Nr8j-LekQz( zNP4B8OIlmuJM7WMLlFIj%O})>1|G`*Yk@+kmIb}1cyr~$QYU4ay(J&kd-mGW=G*>T z76srAwfC_K_fpT-JEJTFnU-GmK^o_XIeOp9W6Vy>yWg89>MuT?nY+EeTCQ^ietM<% z$MNP6e%VvfEB!(eIqW^ye5yIsU0zHbPjfF0AZvhPxlvAc8_yfQ^pIZm3yJQx@UTZX zo+~Gqt<9IJpX8sa*h2! z>6M--`&aPyEk+RjCH!qlY-Qy)oH!TLe#;#HSMmNYJMq6{;{5GzIq|>fobxT`xQ+iN zj@k1Wx92l%&*6RT^%=MKb<^|j;`sl7KZf7MpBsP7g9tq5F(U{i{QarKR#yH(B>q2} z<2=X4-E(+f`&-7{b8Or_=Pl=a#@%yl+&$;tcFt$qJ;%oXMI5&>?nL5`@tJ|=JZ1#J zJ?C9~w!dZkG5#2M&SORpm{;yOZu~J%K;Su#8A13x{QZ%{R#y0god3kc|1#eHnu))S zcY6-c|J&yH@8JEvGI5^scTGHx>-={nUPSyo=bZOVyouv~?8NQ$+c^H$&2h&60~3D@ z@&DSyuOR-PI&qukRUH3soa6twiSzisZ{oj>xIO;5bDcL3xA%S1IiGQR&1;DNp}EeQ zbN)KwHf=oTzcA zy7Nbdi>pU%9Jl(yxXlw+cU&EJb>G$NJbpV%f9-vL2luz-^DiUr+6t@Vu1#S5VnYv+ zhWYS1-U}xFCf@%k6aVvgubVi}`R7cW$Nrp&uj0L9;(5IP(3#Ai2nt1d>ii_6Tgjjn+E3XKWmON-|TVPa4XBd ziFnPN!)q2z{5Ntz{;-_e^sqdX%{eT4%rAyNkGM@|7jc_!ED!&Lp0dK@T@!C0Zsq+o z#BH8Z3h}$8Gu<|0ng773#iC=eH2IY1=^D=Kn3k?R9sHvRVyZzmiU?K6+tb68&fjyZ>Mdp^sUjZ+T$ z+Y;jTx4gfN^ZY-=9|O<-8xqs<_&)-4(zr-KI7XJQwiLI=>g?F2V z8;IL;=*#_yIp??VZqqzO-2Rr_tj)QG_}|7K!*AfvUT1*#AL5UJ=i7RU*SG0s{6E7V z1IzgzNlbk`Yp-~Yy(YQ*Pv#uj{QuF!$!_1oSq6S;;(rP8|HZ^_BL2UbIJy6+iT_)O z{{s`Bbxrra^IZQ9uKD+zd)aidOnzjJv#$BriQBaCoFALxO#c%TXZe3-;w=C6nzZx( zp*ha@|KF~ehu3(nYg`aRC)JRW8X^)QWykO>LJcuhm5|AhG=dn4+LfTukQk$)hLy;$ zLIznR=2Q%=q65_`iV!i28ah#JZQc8HZqNN&)^}a&^g8>TeXeuYr9;<$N&Yp1^i<~jO8M`Ys ze@~uLY<}LxH)DR!&A7KqJj^BL_upKL_hXR=@QVlp?(HH1!F6x=X6>JIibxjNznSyT z&cgoxm9v;RuIHlG^^9hY>v>)CIlGzT`Z~Dg^E#M&{;ysWGspGpuKEAd*UB~jUwPg5 zS(|71-@JyL-R$G~I{dTO>d(J3=Ih{k_CNprm^rSmmFs!`yWb^m?ePb(o=99S@^={V zNwK*zCWpU&y~Q8J2F{qzcV-TMZw01!&}6ETr^Q#ftx8b))4VPO|h0pEkM^6@c=%1s)G>F%;5oY9}>-c^utb1gTsGB zqnS@0`FMcbM@2k<=G=GypV!>XM>B^9IOh{$eT0Da5b*%7KR>622m#H{2M_Ss$4fLn zFQR#^@c=)kW}^AI2+hwC4|t0{Vha&?i!DVw;48Kg{SX4$U&I5g#Q?DlLO?$);(@jz z_eVQ~fDRP#Kzp&H*a0D+JBfIJ_d#dTf)LPML_9!US1|}7psB?J-01@`jT&+hjmyF4-oegU3Gt_r@_(dS&hL6f!+f|JV4!ZqPZV5{qR7r zNI%vA!6LPIfOw$js-Jgy8XUa_X*B!Md$5QH*bDjQe$XLKPlKZ``P2c{VLd!RJVbQW zL!F)mN3T$gtO4j9CgK6=!bNjGX!_v+>gdNh08K3(h!FXEA`&5>hl_Y%gcv1`L#)tqtUc>_vL~^MC=!v3PPdw&NnjUz7UeucX z(DX3-z39~V06j@02TT^}$2tH#MZ^Q-GH2$a$uaZErMH=nW({+_mlXe1oGJqJ%OW0_ zCMJmS2mw7^!~-)#YG)z@G(F6I^rF`6ho*Mf%Yfpi@LVFju6OeE~E*%zpHu*6fF-huLqQ zQ{w~le32ZmK%^gi0eYc`2j+|H$IM4Ba(WsZx%4*ksbvjwy;P^h2k6BjIp8&se)C0u zULxXwG?7~N1<>>``_XH@X!b+X0}m_}(f9!Ux`+qpwOm|=5YViF2gq9?vL}G19uH7Q zZ|VS=HO%!^Doz)zA|TEXUG*xbr@`@^N9Lb&mNXt9&K6yDj?>fNcxHjlMF=*Ld^|wB zMqG^$(B$9&`ZAY?5YXh9`Rtv!d=a3@G4nYWa|I$mlVj%ddf=J!XyQT<5U&+oHMMwv zxJY!>tc?eV?P8G#(Ci%#5U&$mHD|{I_{HLSgn(ua4-|>am5887B*)BWU(9U~0lG*u z^EnrD8%2O7$IR#Tz%%DJDc&M(76I{A(N%AAdKw)6k5l?5{f0CiAl@#z>N2ON!SS8X zjz8(0(s+Q{-Qq5UfMyO4u&=koHxUAw{o(=6gJ;g8iT8+r_-)ZuQ;P>!cb~WyA)r|s z59}A2bJg!SJq^{~718e@1T^`0fOVLAA0eR0G4t6Ma|c9#CdbU@Ja`90a8NuXet;0r zABuPY|FHNGLO?Tz2k?)GA0q@bb9ey%n0OQ+pqax1_{YUh5CWPxJb-^vJb@6<%;5q2 zQ(`$nKr@F2@Hr3X0%+#&z-jS}Sb-4Gl_DO%KPR3=2x#W;0R9E>JVHP-hX?R4i5C$9 znmIgxe?`2E5YWuw0sO0C6+%EWhX?SliJyu9&D=E+;By|%1<=<-JiuDyo9m&kJ3S4K zJm&ELb=O35eKhAaUoSMd=Ig^qPxJLaGmi&uh@Xi!5d!*i5f6MJqVWOxOA!xHcT4;V zA)u+n1NdKyw-ExGIXr;>jd%wkpqax1_}_`&A_O#Zc;K#hPy8D~Kz}ddfxnBycmVwm z(VYJ`r)SQie{gyl9N!@^M_=%xNRFBRlj2{*pGAQFRm20oiD-O){$0cae~4&&fac30 zJmBan?eLx2(OVvH(^x~S?xJftJ?2>#O&&nIE5-x#N1OXY*OJBq^hKNJL$e+psI9TC zSjR;_r72P9&kLzQ(WIgGxvm3duZf4{`&XRtDze@ zJuFYfJR@xAoJTiudRX|4r5iiv(d6R+d@sdK9qPVj4iDfzrMQJd-Pg?FfhHPx&ggev zIyBE7@Bn^u#cdqwzGe;&cx&_#Te#?!PLKJ=ML%g@=RCTVVm#15Y^~VeMf2|g@IWJx zXa78F1?aYl@jw%ie>2d|MF%Rz1KuM4Mxecm=GiD7@D&ZkJVym+i()*`TI9J&XBW+L z7d+5aBhQz*xoDm};ej3+dx<=6F?F!hL-$tPSM1}QNB47j%;P^R_7_b}J|4j5x!M31 z%^V)U=Xu#c7tI_V;CUO*c?P@aAx@8Z{7{i+P^Kmy4}@vtc~iKHj&yp=4^zxD!x7H; zks6~!d=Rbi1u;g%8l^vCMLhIq{Xs1rnp%3`p~vVCdW?1IIF0nc(|?Y&>4Ar4U3%aF z>c@$!52(jueZb!FSRb%1>zn(hjYyJuIsZVHGr5ksR6|7nHs=atZAONNe$iIfBaN!;^gTQI^0ij{298iTjaP|T_eX& z4T=np4vLia4PEf8@90;a4UpeHbY7(I=ot|KW2W>EQqHt7lft`%NA-(WZhXXuu=wlu zO8qW;xy|GJ!Rwyaj(+L+#l`s6Rpm3Y&~+9K{wMzX2}cFT-e>934OkJW{OST z2+fW7?yA(=Iep%-XFp$BkeRo2+m3pr%QhyzW8J)TZ`n?Fv5R73@8ym4_f@SfJbZHX z#E*_|j2CNO{cUZ?wafXVKE1d#wd$AB8X70v_-%XLn|~Az`214dsLwByP7@y}L!veSdB3xO-Q(O%~l18}f{M->eV%{`$K1%6V44 zaqrre!T0WL?f2cCt#Nn1S-0%&b$iRZ*R~A$^{K3mzqHDJ`4_)}KEHb9`~Ti5yW1a6 zWd;83RnYTyzk>dMG+t%={^VNYx7J0*?*W;{4^O8L(AY};=pQ|;u|IeeEz|r|%|G&Q zZPvMq-ip2N)m#z#w;F|M-?g^;+zqgXXsmwQKRx7*`^r&Y*T`RZ%daq1^!dnh*~kwY ztXWjvCf~O_VC6uKOFsx+IcQhUv!C|#ItvHS?%6Cmp*x-cw6lgZ`o?~jd|C- ze9lgHBWlmQR#BVhHjB<)<=ub9oHm`-q;zRhyl6n{O$#d`H>3^nocmJcfb^-)G)|e_ z);~G1MbDI(TF2%ya9WPyoVL%5wacIWOsA*>@?bAzp&eZ<1sUDH4k5E6n-g<5NzB)A`?!~`a;^fCg4maYoMqFg?&^YD$tDk>p&M^P* z*Ms~grgZU7Oo?E0mv&dKyXuGy+$lA5e>lc3 z&de}$cNmO!ULRrT-f)a}yH7TBXBdp%HC$`xzHp4U+g&hpR~U?+z48x(p1L<2F}<~x zhxX}l;nS@i=l5SB&eUGBuN<9~EiY61U2}a&Y@YUP|19|BBJDfpX0t-O#zgHs<~QxPA%knB29BEHE?{rxm?P1^i=TnufI6%>W(gVb&t80 z$gmmWBqK6-c&A8d-ySKweFrD>4v^oz$DEihq?~CX@^zbduigVLjA3gp`mOL-bd0k8!HmH1Ybe6m@&4pbtCiSTZ znrf35rMaj}58Ef4dZNfKFF|t&XMC@|e5}od40*FPH~V>Tb6i zkGmljhZ#=$!ndYZz-u-&3 z66mei`>I=d?3HTvv`c>LeJ=a23ei~otZ!z>`ReJT&Q)8xu+qn#D*BXpEFZbO{+dO5 z{R({d`&$QUTw2Rpz22GX~*Kb-f-}C8JTWYs^W6_g)ib`w0y(_m?yODd`_s-ho z-fURey!ylJa~~SMV%5XFUz^h)Ff+x+uV7I}-}MXM3EQ-^^Akxgz27fmYO98`W;bg2 zO5&s4UYV(NY>)MSF;{U;<1W#5`O{kmh9@W|At*3BMm1v(j7W}A-PnZb(Zk=HpE&H% zn7FKZqoQpO$4|*>uy}NShk~dk`!_5YpuIHHzMA=DM|o+VUfOfM_Mau+&|ZzbStZ6^ zyUoyEjeSX*4eiNzXY@Kly^Z&VuQIfb@!q(_hSo6Noj1==Ph)>>8Z|Gfc2tqoKF*$> z8Km0b>t>epRc({v=)&hz+hRl5$^g~Y-4MH=j%rg&X3y!M+9~TZQgIns!NR(^PZe^26js1Walb zK5}}SNcoZK5vlqJ^~39{*QW1;$)RzPlRL!8kLwd27^gMjdiNX@r+k0)^Y6YY)Ia#O zPW}-|o&4jHLK)qq-IeREI$}dP!K&#c&rnW=dWI@5S@X$yPg)OMEwvup_o-Fyf9ugB zuR3)3;#lkH?$fO0jf$*#Ut5p<<(wlvl<=KZ?_n!-jv8sbw~b>5KQoShwcXJD;TS7U zB^tUr491H~q72;|j`2#@sfO+hgYn`Mc0>1tV>}aZ+0b2KFrJwHgF#Q-8;+RXTFXQG z^!VVi?ya}0h%>d<>?4PhvgKuJziUpWj>*%W?WcRh7ir)2lU_x3jfvWO%F)2eMCqB@ zfAXP(Z^iG@)iYha(xuZs_p$Z6I=tlBbHg^m>yPA+$K=eeCD2hQjm z`TQhHWLMqQ(!QOO`}p>c?-L-uy=8W&Z@+1w0sSZT4pPpv{^N&s3DRAy-1wk~koZI2 z?rOR3<_?cN?|$xi;P4&KW9JfEA3UCvCC^K9UKMFkgN`hY&65|Vxv;aw)IP_8;&bIi zX)dbb;gSg-KT&L#m!P?XW4IDn|&zZkH!1qe@K?MKy&k@-L#II)^n5Z zX5E$(R#3LO@7jXg;PlnmdCNELtY=NzoLsnkTWa36H*1Pr6kGDnZ>gVuF@MOWWBC&| z9^D!*);#cYamWW3*2Nq=S62P~A9ps=IO)Tm->m!5uf+q7oVSlUe0J9)vHFQ`iwBlp zTpxSl+-~>dciwzR38+XV*l$c3%cECoF91o z$&#Med`kM?@LXfL-e9BUn%^eNb^koer8c<(G`5mI`m#sP#7mEFT&DS{ns>j@YBTg! z?0wEHE4H#)Nm_;9CZ99@IUyRWpYXMXlvmFhb+X#}g~xqLs*66GJgg%()-PDJ!>`D9 zr~j&f8kd%I&*+)c%{n5p^Va$6y1tPr24sh%=dFs`kX}4AGuR%z$s*RQHZsxb_EOr) z>WN7!YU{49o1Waj9M2d9`DrZ8fG%&U!?5 zbwGYplU*AY571tkXYWm%gnJM3#L+N)(pQmI9Ivg{sR zVo`6)Tf?(0TF3I%xHOB_u)H~MkwrZ%yK_})gw~%k?I#N zudiO4zOj?S;zA~OjFTVtOnCb^tr6F?$KW{S`>UV7MR#@3V#9xMlHvbCQW&GVw7YWM zRYz!)H!OT_1?A|IQW(2&{w-Gx<4G_u~SJF-5nOj(@REKbZGbkC`6;Id=gzq}B-=P&cTIdn-JDTp4!pL!;y_04Q+MBNe>7!x`013rmdcRK zu*w6=t*7plK6N;GpY_rnZr tIv3{c>2d7zF@LUR*YB$>E_d~V@2ektU;W_w>IdIfKlr}-|Ht>${|*QC45t79 literal 0 HcmV?d00001 diff --git a/progs/oldport.mdl b/progs/oldport.mdl new file mode 100644 index 0000000000000000000000000000000000000000..c6cdbcb797780974e6ff6b9e7710cea1ea8daad1 GIT binary patch literal 220968 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 literal 0 HcmV?d00001 diff --git a/progs/pellet.mdl b/progs/pellet.mdl new file mode 100644 index 0000000000000000000000000000000000000000..117f491af77cd389b3f230595d7380cfbd9e37fc GIT binary patch literal 10144 zcmeI2U5H)P6~|A^hxsrjC&nb2=sl@lwI-UR@hi>bT$>4;2%RJlFa*rC4uP1eqfHGD zg}7nO`v2EHYp;F&YoBxH4zs`a;DIGU5Pba26Fpz9*xU2sOWS)c@A@RW@OG9>eEM-V z@Q>&zO;3&mLMLQ9WqV}5kP*X{%1*y}xGZ-gjPddDt5>h)xqgg~cYni{)Lq7vD_5q~ z8CPJeW9rPLP6=aUP3w%ct2EXksZFg`DPv=!Ewe^jCbdc#ZJjbUI@+RAyQHRtMzmDR ztx;#BS(>uiBsIwx>0GBtA+p-kxmJUbZt7f9sGilX&diMA?&=Ir7ow5Xw$AiI!`;@I zR>)_yuTv~E+-SuYp6)KrbvdxH#2P@HR5O>q?-W*T0$cnYsmYboLbLsQRS-1!d)2fR+YtMsU7Jhh zXX=Q`ES5#G`wRF^;hSWP!!oX6^vMh-1>Ea#B!6omzPf)x=6OeW4YjH0rwT~j|=!o zk0W_>WgP~4GfYjxc*FF?Fgh51PMEn!MjXsQAH(d&F!~rqA8;gN4;Dus!{}p}nugKG zF!~s#F8hdl49wvC7-m0)IX{Nk8#t1ogT>i{Va|_X_G36IVD?6w7}wAz8w&*NOfU37 zjC}Xeuy*B5p4I3=l+N@LK&DC1JC^uXRMKdi81ipKXJxwGB7a)9zBS&S9%8~ z2FIfraro^X6NBT?i#U9p$Hd@x^dk;m?=dkr9zBV}H+W18jz?eOaI^&zgPSMLxI@Ny zGLA=Y;*5eE+16x1v=uMpa zi9EJ`;L)Bq^P4@ke&ErbIP>50*!qD-d*aOB~y2OhnNGmo}l>jxf< zi8Jn#-7hnaM{nYc2V`LD2OhnNGrlhaTR-sVO`P$d3~c?tqc?HJ4`g8L2OhnNGaizG ztsi)_C(iwC@!0x-k9?f@tsWDD<2TEQ!yopT7#xrG#Nm&4Z2iEaJ#pr@d2Ic_qc?Hp z(H3m|z@ss7#&+2bnQ=UN6KDKT2DX0S(VIA9rwnZUz@s;D#-lQ@^#hOI#2Jstz}62u zdJ|_nE(2RX@Muq*`+LG;>j$2m5NG~LkBPzYXiprz%VX;Y9_@)U|09pBA9%DU&irnV ztsi*wCeA$Cf~_BTG$zi#qi+vH1B{-=!RTikj9$jU=wlp=HgM{L(ZV>Gdp8c|UX6pf zH{)RTZyd~?;Wj2FCW7aGdg{1we5IBzbZNfKxrxO|HD3_BJV+|Jt0eh37w6}zN&aT7 zlE0Co~)J9w+54RSMJi?gSB*9 zZ7|&$=We5$a8a1LHGy*%!q}aTLwCjn?nD~8SMu0BHsRdPJarGIx!aNq#ur^4Zz|Q| z_d*wcP)g$WlTuuDVSKb!iu(tXxHot4-oaYDr#2Yxuhhammxc$DYIrDi;lZR5K2u4; zBQ6e~ttR2IS|zNcE-cro;nUSxm^c?4KJ=4)M;7V+(SGU6$InEke)hu4H=&4zgqm3N z^MQfW4SKzPQacFF#@DX@-^6S+)-dz2MnQe}4?KVJc>n3`dkS&xeW46d7R#2%Zk8>T zEt4&mt&rU!TPeF$wo0~I7RuJhZj-H*-7Z@vTQA!nyF+%TY@=+G>@JzTpd;bUGJ9e2 z;^XDT!)Grkd)e4a!ybNnheg>}>wkI5w6?cD z%6|3Fzs6k8X5T%&D`OrmTAyEcPnyD=IO~7@(R~^GoH*;9TK`m?pBMl8sz1jz|7Ih< zZ2519e}3-qvaQb%QvI^k=O~eH`{$UkzqNaRQ+{{(wlc?udN1C6sm?i;9}T>naXs@K zzk`>m_5H)&@$>8l{+c-J{l4$lb^f|I>wW#(jZ;5~Q@AGBL=RK?S>-%Rt z-mA=8eLg3+AKNcS6Fu4Q3orfYGDn_z-!A^5&LeU5OMjT>vEhHM&-#^#$xy1cgeI70HZNGf(n*Q;ZJF<)7razp= z*Yt{o#B4Jo>|Vg_-{F{o;k^ zA?p*To_`*)1C8tL{AY*63+F#O=;!_U&7Ki2od4{IIP3ZIpFJyHIRDwPM!uc@tRh}G a|5@43`}3bYEnYbPSt8E*{&~#~i~k3kFCbU| literal 0 HcmV?d00001 diff --git a/progs/portal1.bsp b/progs/portal1.bsp new file mode 100644 index 0000000000000000000000000000000000000000..6b02c52d4ab0d94440653d4aa17b644a5c4a3346 GIT binary patch literal 22396 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¬1Vf-QOAP)Gws8EWc$q6UIqJS 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 B$nyXI literal 0 HcmV?d00001 diff --git a/sound/portal/fire.wav b/sound/portal/fire.wav new file mode 100644 index 0000000000000000000000000000000000000000..a4aae00d4a195215d05b1423e17aefc6706160f0 GIT binary patch literal 47018 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 P7|AB-m=iN_Ps#rPNDL&J literal 0 HcmV?d00001 diff --git a/src/ai.qc b/src/ai.qc new file mode 100644 index 0000000..b480d35 --- /dev/null +++ b/src/ai.qc @@ -0,0 +1,747 @@ +void() movetarget_f; +void() t_movetarget; +void() knight_walk1; +void() knight_bow6; +void() knight_bow1; +void(entity etemp, entity stemp, entity stemp, float dmg) T_Damage; +/* + +.enemy +Will be world if not currently angry at anyone. + +.movetarget +The next path spot to walk toward. If .enemy, ignore .movetarget. +When an enemy is killed, the monster will try to return to it's path. + +.huntt_ime +Set to time + something when the player is in sight, but movement straight for +him is blocked. This causes the monster to use wall following code for +movement direction instead of sighting on the player. + +.ideal_yaw +A yaw angle of the intended direction, which will be turned towards at up +to 45 deg / state. If the enemy is in view and hunt_time is not active, +this will be the exact line towards the enemy. + +.pausetime +A monster will leave it's stand state and head towards it's .movetarget when +time > .pausetime. + +walkmove(angle, speed) primitive is all or nothing +*/ + + +// +// globals +// +float current_yaw; + +// +// when a monster becomes angry at a player, that monster will be used +// as the sight target the next frame so that monsters near that one +// will wake up even if they wouldn't have noticed the player +// +entity sight_entity; +float sight_entity_time; + +float(float v) anglemod = +{ + while (v >= 360) + v = v - 360; + while (v < 0) + v = v + 360; + return v; +}; + +/* +============================================================================== + +MOVETARGET CODE + +The angle of the movetarget effects standing and bowing direction, but has no effect on movement, which allways heads to the next target. + +targetname +must be present. The name of this movetarget. + +target +the next spot to move to. If not present, stop here for good. + +pausetime +The number of seconds to spend standing or bowing for path_stand or path_bow + +============================================================================== +*/ + + +void() movetarget_f = +{ + if (!self.targetname) + objerror ("monster_movetarget: no targetname"); + + self.solid = SOLID_TRIGGER; + self.touch = t_movetarget; + setsize (self, '-8 -8 -8', '8 8 8'); + +}; + +/*QUAKED path_corner (0.5 0.3 0) (-8 -8 -8) (8 8 8) +Monsters will continue walking towards the next target corner. +*/ +void() path_corner = +{ + movetarget_f (); +}; + + +/* +============= +t_movetarget + +Something has bumped into a movetarget. If it is a monster +moving towards it, change the next destination and continue. +============== +*/ +void() t_movetarget = +{ +local entity temp; + + if (other.movetarget != self) + return; + + if (other.enemy) + return; // fighting, not following a path + + temp = self; + self = other; + other = temp; + + if (self.classname == "monster_ogre") + sound (self, CHAN_VOICE, "ogre/ogdrag.wav", 1, ATTN_IDLE);// play chainsaw drag sound + +//dprint ("t_movetarget\n"); + self.goalentity = self.movetarget = find (world, targetname, other.target); + self.ideal_yaw = vectoyaw(self.goalentity.origin - self.origin); + if (!self.movetarget) + { + self.pausetime = time + 999999; + self.th_stand (); + return; + } +}; + + + +//============================================================================ + +/* +============= +range + +returns the range catagorization of an entity reletive to self +0 melee range, will become hostile even if back is turned +1 visibility and infront, or visibility and show hostile +2 infront and show hostile +3 only triggered by damage +============= +*/ +float(entity targ) range = +{ +local vector spot1, spot2; +local float r; + spot1 = self.origin + self.view_ofs; + spot2 = targ.origin + targ.view_ofs; + + r = vlen (spot1 - spot2); + if (r < 120) + return RANGE_MELEE; + if (r < 500) + return RANGE_NEAR; + if (r < 1000) + return RANGE_MID; + return RANGE_FAR; +}; + +/* +============= +visible + +returns 1 if the entity is visible to self, even if not infront () +============= +*/ +float (entity targ) visible = +{ + local vector spot1, spot2; + + spot1 = self.origin + self.view_ofs; + spot2 = targ.origin + targ.view_ofs; + traceline (spot1, spot2, TRUE, self); // see through other monsters + + if (trace_inopen && trace_inwater) + return FALSE; // sight line crossed contents + + if (trace_fraction == 1) + return TRUE; + return FALSE; +}; + + +/* +============= +infront + +returns 1 if the entity is in front (in sight) of self +============= +*/ +float(entity targ) infront = +{ + local vector vec; + local float dot; + + makevectors (self.angles); + vec = normalize (targ.origin - self.origin); + dot = vec * v_forward; + + if ( dot > 0.3) + { + return TRUE; + } + return FALSE; +}; + + +//============================================================================ + +/* +=========== +ChangeYaw + +Turns towards self.ideal_yaw at self.yaw_speed +Sets the global variable current_yaw +Called every 0.1 sec by monsters +============ +*/ +/* + +void() ChangeYaw = +{ + local float ideal, move; + +//current_yaw = self.ideal_yaw; +// mod down the current angle + current_yaw = anglemod( self.angles_y ); + ideal = self.ideal_yaw; + + if (current_yaw == ideal) + return; + + move = ideal - current_yaw; + if (ideal > current_yaw) + { + if (move > 180) + move = move - 360; + } + else + { + if (move < -180) + move = move + 360; + } + + if (move > 0) + { + if (move > self.yaw_speed) + move = self.yaw_speed; + } + else + { + if (move < 0-self.yaw_speed ) + move = 0-self.yaw_speed; + } + + current_yaw = anglemod (current_yaw + move); + + self.angles_y = current_yaw; +}; + +*/ + + +//============================================================================ + +void() HuntTarget = +{ + self.goalentity = self.enemy; + self.think = self.th_run; + self.ideal_yaw = vectoyaw(self.enemy.origin - self.origin); + self.nextthink = time + 0.1; + SUB_AttackFinished (1); // wait a while before first attack +}; + +void() SightSound = +{ +local float rsnd; + + if (self.classname == "monster_ogre") + sound (self, CHAN_VOICE, "ogre/ogwake.wav", 1, ATTN_NORM); + else if (self.classname == "monster_knight") + sound (self, CHAN_VOICE, "knight/ksight.wav", 1, ATTN_NORM); + else if (self.classname == "monster_shambler") + sound (self, CHAN_VOICE, "shambler/ssight.wav", 1, ATTN_NORM); + else if (self.classname == "monster_demon1") + sound (self, CHAN_VOICE, "demon/sight2.wav", 1, ATTN_NORM); + else if (self.classname == "monster_wizard") + sound (self, CHAN_VOICE, "wizard/wsight.wav", 1, ATTN_NORM); + else if (self.classname == "monster_zombie") + sound (self, CHAN_VOICE, "zombie/z_idle.wav", 1, ATTN_NORM); + else if (self.classname == "monster_dog") + sound (self, CHAN_VOICE, "dog/dsight.wav", 1, ATTN_NORM); + else if (self.classname == "monster_hell_knight") + sound (self, CHAN_VOICE, "hknight/sight1.wav", 1, ATTN_NORM); + else if (self.classname == "monster_tarbaby") + sound (self, CHAN_VOICE, "blob/sight1.wav", 1, ATTN_NORM); + else if (self.classname == "monster_vomit") + sound (self, CHAN_VOICE, "vomitus/v_sight1.wav", 1, ATTN_NORM); + else if (self.classname == "monster_enforcer") + { + rsnd = rint(random() * 3); + if (rsnd == 1) + sound (self, CHAN_VOICE, "enforcer/sight1.wav", 1, ATTN_NORM); + else if (rsnd == 2) + sound (self, CHAN_VOICE, "enforcer/sight2.wav", 1, ATTN_NORM); + else if (rsnd == 0) + sound (self, CHAN_VOICE, "enforcer/sight3.wav", 1, ATTN_NORM); + else + sound (self, CHAN_VOICE, "enforcer/sight4.wav", 1, ATTN_NORM); + } + else if (self.classname == "monster_army") + sound (self, CHAN_VOICE, "soldier/sight1.wav", 1, ATTN_NORM); + else if (self.classname == "monster_shalrath") + sound (self, CHAN_VOICE, "shalrath/sight.wav", 1, ATTN_NORM); +}; + +void() FoundTarget = +{ + if (self.enemy.classname == "player") + { // let other monsters see this monster for a while + sight_entity = self; + sight_entity_time = time; + } + + self.show_hostile = time + 1; // wake up other monsters + + SightSound (); + HuntTarget (); +}; + +/* +=========== +FindTarget + +Self is currently not attacking anything, so try to find a target + +Returns TRUE if an enemy was sighted + +When a player fires a missile, the point of impact becomes a fakeplayer so +that monsters that see the impact will respond as if they had seen the +player. + +To avoid spending too much time, only a single client (or fakeclient) is +checked each frame. This means multi player games will have slightly +slower noticing monsters. +============ +*/ +float() FindTarget = +{ + local entity client; + local float r; + +// if the first spawnflag bit is set, the monster will only wake up on +// really seeing the player, not another monster getting angry + +// spawnflags & 3 is a big hack, because zombie crucified used the first +// spawn flag prior to the ambush flag, and I forgot about it, so the second +// spawn flag works as well + if (sight_entity_time >= time - 0.1 && !(self.spawnflags & 3) ) + { + client = sight_entity; + if (client.enemy == self.enemy) + return TRUE; + } + else + { + client = checkclient (); + if (!client) + return FALSE; // current check entity isn't in PVS + } + + if (client == self.enemy) + return FALSE; + + if (client.flags & FL_NOTARGET) + return FALSE; + if (client.items & IT_INVISIBILITY) + return FALSE; + + r = range (client); + if (r == RANGE_FAR) + return FALSE; + + if (!visible (client)) + return FALSE; + + if (r == RANGE_NEAR) + { + if (client.show_hostile < time && !infront (client)) + return FALSE; + } + else if (r == RANGE_MID) + { + if ( /* client.show_hostile < time || */ !infront (client)) + return FALSE; + } + +// +// got one +// + self.enemy = client; + if (self.enemy.classname != "player") + { + self.enemy = self.enemy.enemy; + if (self.enemy.classname != "player") + { + self.enemy = world; + return FALSE; + } + } + + FoundTarget (); + + return TRUE; +}; + + +//============================================================================= + +void(float dist) ai_forward = +{ + walkmove (self.angles_y, dist); +}; + +void(float dist) ai_back = +{ + walkmove ( (self.angles_y+180), dist); +}; + + +/* +============= +ai_pain + +stagger back a bit +============= +*/ +void(float dist) ai_pain = +{ + ai_back (dist); +/* + local float away; + + away = anglemod (vectoyaw (self.origin - self.enemy.origin) + + 180*(random()- 0.5) ); + + walkmove (away, dist); +*/ +}; + +/* +============= +ai_painforward + +stagger back a bit +============= +*/ +void(float dist) ai_painforward = +{ + walkmove (self.ideal_yaw, dist); +}; + +/* +============= +ai_walk + +The monster is walking it's beat +============= +*/ +void(float dist) ai_walk = +{ + local vector mtemp; + + movedist = dist; + + if (self.classname == "monster_dragon") + { + movetogoal (dist); + return; + } + // check for noticing a player + if (FindTarget ()) + return; + + movetogoal (dist); +}; + + +/* +============= +ai_stand + +The monster is staying in one place for a while, with slight angle turns +============= +*/ +void() ai_stand = +{ + if (FindTarget ()) + return; + + if (time > self.pausetime) + { + self.th_walk (); + return; + } + +// change angle slightly + +}; + +/* +============= +ai_turn + +don't move, but turn towards ideal_yaw +============= +*/ +void() ai_turn = +{ + if (FindTarget ()) + return; + + ChangeYaw (); +}; + +//============================================================================= + +/* +============= +ChooseTurn +============= +*/ +void(vector dest3) ChooseTurn = +{ + local vector dir, newdir; + + dir = self.origin - dest3; + + newdir_x = trace_plane_normal_y; + newdir_y = 0 - trace_plane_normal_x; + newdir_z = 0; + + if (dir * newdir > 0) + { + dir_x = 0 - trace_plane_normal_y; + dir_y = trace_plane_normal_x; + } + else + { + dir_x = trace_plane_normal_y; + dir_y = 0 - trace_plane_normal_x; + } + + dir_z = 0; + self.ideal_yaw = vectoyaw(dir); +}; + +/* +============ +FacingIdeal + +============ +*/ +float() FacingIdeal = +{ + local float delta; + + delta = anglemod(self.angles_y - self.ideal_yaw); + if (delta > 45 && delta < 315) + return FALSE; + return TRUE; +}; + + +//============================================================================= + +float() WizardCheckAttack; +float() DogCheckAttack; + +float() CheckAnyAttack = +{ + if (!enemy_vis) + return FALSE; + if (self.classname == "monster_army") + return SoldierCheckAttack (); + if (self.classname == "monster_ogre") + return OgreCheckAttack (); + if (self.classname == "monster_shambler") + return ShamCheckAttack (); + if (self.classname == "monster_demon1") + return DemonCheckAttack (); + if (self.classname == "monster_dog") + return DogCheckAttack (); + if (self.classname == "monster_wizard") + return WizardCheckAttack (); + return CheckAttack (); +}; + + +/* +============= +ai_run_melee + +Turn and close until within an angle to launch a melee attack +============= +*/ +void() ai_run_melee = +{ + self.ideal_yaw = enemy_yaw; + ChangeYaw (); + + if (FacingIdeal()) + { + self.th_melee (); + self.attack_state = AS_STRAIGHT; + } +}; + + +/* +============= +ai_run_missile + +Turn in place until within an angle to launch a missile attack +============= +*/ +void() ai_run_missile = +{ + self.ideal_yaw = enemy_yaw; + ChangeYaw (); + if (FacingIdeal()) + { + self.th_missile (); + self.attack_state = AS_STRAIGHT; + } +}; + + +/* +============= +ai_run_slide + +Strafe sideways, but stay at aproximately the same range +============= +*/ +void() ai_run_slide = +{ + local float ofs; + + self.ideal_yaw = enemy_yaw; + ChangeYaw (); + if (self.lefty) + ofs = 90; + else + ofs = -90; + + if (walkmove (self.ideal_yaw + ofs, movedist)) + return; + + self.lefty = 1 - self.lefty; + + walkmove (self.ideal_yaw - ofs, movedist); +}; + + +/* +============= +ai_run + +The monster has an enemy it is trying to kill +============= +*/ +void(float dist) ai_run = +{ + local vector delta; + local float axis; + local float direct, ang_rint, ang_floor, ang_ceil; + + movedist = dist; +// see if the enemy is dead + if (self.enemy.health <= 0) + { + self.enemy = world; + // FIXME: look all around for other targets + if (self.oldenemy.health > 0) + { + self.enemy = self.oldenemy; + HuntTarget (); + } + else + { + if (self.movetarget) + self.th_walk (); + else + self.th_stand (); + return; + } + } + + self.show_hostile = time + 1; // wake up other monsters + +// check knowledge of enemy + enemy_vis = visible(self.enemy); + if (enemy_vis) + self.search_time = time + 5; + +// look for other coop players + if (coop && self.search_time < time) + { + if (FindTarget ()) + return; + } + + enemy_infront = infront(self.enemy); + enemy_range = range(self.enemy); + enemy_yaw = vectoyaw(self.enemy.origin - self.origin); + + if (self.attack_state == AS_MISSILE) + { +//dprint ("ai_run_missile\n"); + ai_run_missile (); + return; + } + if (self.attack_state == AS_MELEE) + { +//dprint ("ai_run_melee\n"); + ai_run_melee (); + return; + } + + if (CheckAnyAttack ()) + return; // beginning an attack + + if (self.attack_state == AS_SLIDING) + { + ai_run_slide (); + return; + } + +// head straight in + movetogoal (dist); // done in C code... +}; + diff --git a/src/asstech.qc b/src/asstech.qc new file mode 100644 index 0000000..dd68592 --- /dev/null +++ b/src/asstech.qc @@ -0,0 +1,702 @@ +/******************************************** + Aperture Science Technologies (asstech.qc) + ========================================== +********************************************/ + +// for for hardlight bridge +float HL_STARTOFF = 1; +float HL_PPROOF = 2; + +// for particle fields +float USE_COUNT = 1; + +// for counters +float COUNTER_TOGGLE = 1; +float COUNTER_LOOP = 2; +float COUNTER_STEP = 4; +float COUNTER_RESET = 8; +float COUNTER_RANDOM = 16; +float COUNTER_FINISHCOUNT = 32; +float COUNTER_START_ON = 64; + +// for pellet +float PELLET_SPEED = 150; +float PELLET_TTL = 20; +.float ttl; +.float sleep; + + +/* COUNTERS (hipnotic) +*********************/ +void() counter_on_use; +void() counter_off_use; + +void() counter_think = +{ + self.cnt = self.cnt + 1; + if ( self.spawnflags & COUNTER_RANDOM ) + { + self.state = random() * self.count; + self.state = floor (self.state) + 1; + } + else + { + self.state = self.cnt; + } + + activator = other; + SUB_UseTargets(); + self.nextthink = time + self.wait; + + if ( self.spawnflags & COUNTER_STEP ) + { + counter_on_use(); + } + + if ( self.cnt >= self.count ) + { + self.cnt = 0; + if ( ( self.aflag ) || !( self.spawnflags & COUNTER_LOOP ) ) + { + if (self.spawnflags & COUNTER_TOGGLE) + { + counter_on_use(); + } + else + { + remove (self); + } + } + } +}; + +void() counter_on_use = +{ + if ( ( self.cnt != 0 ) && ( self.spawnflags & COUNTER_FINISHCOUNT ) ) + { + self.aflag = TRUE; + return; + } + + self.use = counter_off_use; + self.think = SUB_Null; + self.aflag = FALSE; +}; + +void() counter_off_use = +{ + self.aflag = FALSE; + if (self.spawnflags & COUNTER_TOGGLE) + { + self.use = counter_on_use; + } + else + { + self.use = SUB_Null; + } + + if ( self.spawnflags & COUNTER_RESET ) + { + self.cnt = 0; + self.state = 0; + } + self.think = counter_think; + if (self.delay) + { + self.nextthink = time + self.delay; + } + else + { + counter_think(); + } +}; + +float(entity counter) counter_GetCount = +{ + local float value; + + if ( counter.classname == "counter" ) + { + return counter.state; + } + return 0; +}; + +/*QUAKED func_counter (0 0 1) (0 0 0) (32 32 32) TOGGLE LOOP STEP RESET RANDOM FINISHCOUNT START_ON +TOGGLE causes the counter to switch between an on and off state +each time the counter is triggered. + +LOOP causes the counter to repeat infinitly. The count resets to zero +after reaching the value in "count". + +STEP causes the counter to only increment when triggered. Effectively, +this turns the counter into a relay with counting abilities. + +RESET causes the counter to reset to 0 when restarted. + +RANDOM causes the counter to generate random values in the range 1 to "count" +at the specified interval. + +FINISHCOUNT causes the counter to continue counting until it reaches "count" +before shutting down even after being set to an off state. + +START_ON causes the counter to be on when the level starts. + +"count" specifies how many times to repeat the event. If LOOP is set, +it specifies how high to count before reseting to zero. Default is 10. + +"wait" the length of time between each trigger event. Default is 1 second. + +"delay" how much time to wait before firing after being switched on. +*/ +void() func_counter = +{ + if ( !self.wait ) + { + self.wait = 1; + } + + self.count = floor (self.count); + if ( self.count <= 0 ) + { + self.count = 10; + } + self.cnt = 0; + self.state = 0; + + self.classname = "counter"; + self.use = counter_off_use; + self.think = SUB_Null; + + if ( self.spawnflags & COUNTER_START_ON ) + { + self.think = counter_off_use; + self.nextthink = time + 0.1; + } +}; + +void() oncount_use = +{ + if ( counter_GetCount( other ) == self.count ) + { + activator = other; + SUB_UseTargets(); + } +}; + + + +/* TOGGLE WALL (hipnotic) +************************/ +void() hardlight_touch = +{ + //hmmm. should it hurt? +}; + +void() hardlight_use = +{ + if (!self.state) + { + self.state = 1; + setorigin (self, self.origin - '8000 8000 8000'); + sound (self, CHAN_VOICE, self.noise1, 1, ATTN_NORM); + } else + { + self.state = 0; + setorigin (self, self.origin + '8000 8000 8000'); + sound (self, CHAN_VOICE, self.noise, 1, ATTN_NORM); + } +}; + +/*QUAKED ass_hardlight (0 0 1) ? START_OFF PORTAL_PROOF +Creates a invisible wall that can be toggled on and off. + +START_OFF wall doesn't block until triggered. +PORTAL_PROOF when the wall is toggled, you can't shoot portal through it. +*/ +void() ass_hardlight = +{ + self.classname = "hardlight"; + self.movetype = MOVETYPE_PUSH; + self.mdl = self.model; + setmodel (self, self.model); + setsize (self, self.mins, self.maxs); + setorigin (self, self.origin); + + self.touch = hardlight_touch; + self.use = hardlight_use; + + self.noise = "misc/null.wav"; + self.noise1 = "misc/null.wav"; + + precache_sound (self.noise); + precache_sound (self.noise1); + + self.solid = SOLID_BSP; + self.model = string_null; + + if (self.spawnflags & HL_STARTOFF ) + { + self.state = 0; + setorigin (self, self.origin + '8000 8000 8000'); + } else + { + self.state = 1; + sound (self, CHAN_VOICE, self.noise1, 1, ATTN_NORM); + } + + if (self.spawnflags & HL_PPROOF) + { + self.classname = "hardlight2"; + } +}; + + + +/* PARTICLE FIELD (hipnotic) +***************************/ +void() particlefield_XZ = +{ + local vector pos; + local vector start; + local vector end; + + if ( (self.spawnflags & USE_COUNT) && + (counter_GetCount (other) != self.cnt) ) + { + return; + } + + self.ltime = time + 0.25; + if ( self.noise ) + { + sound(self, CHAN_VOICE, self.noise, 1, ATTN_NORM); + } + + // Only show particles if client is visible. + // This helps to keep network traffic down to a minimum. + if (!checkclient() ) + return; + + start = self.dest1 + self.origin; + end = self.dest2 + self.origin; + pos_y = start_y; + pos_z = start_z; + while( pos_z <= end_z ) + { + pos_x = start_x; + while( pos_x <= end_x ) + { + particle (pos, '0 0 0', self.color, self.count); + pos_x = pos_x + 16; + } + pos_z = pos_z + 16; + } +}; + +void () particlefield_YZ = +{ + local vector pos; + local vector start; + local vector end; + + if ( (self.spawnflags & USE_COUNT) && + (counter_GetCount (other) != self.cnt) ) + { + return; + } + + self.ltime = time + 0.25; + if ( self.noise ) + { + sound(self, CHAN_VOICE, self.noise, 1, ATTN_NORM); + } + + // Only show particles if client is visible. + // This helps to keep network traffic down to a minimum. + if (!checkclient() ) + return; + + start = self.dest1 + self.origin; + end = self.dest2 + self.origin; + pos_x = start_x; + pos_z = start_z; + while( pos_z < end_z ) + { + pos_y = start_y; + while( pos_y < end_y ) + { + particle ( pos, '0 0 0', self.color, self.count ); + pos_y = pos_y + 16; + } + pos_z = pos_z + 16; + } +}; + +void () particlefield_XY = +{ + local vector pos; + local vector start; + local vector end; + + if ( (self.spawnflags & USE_COUNT) && + (counter_GetCount (other) != self.cnt) ) + { + return; + } + + self.ltime = time + 0.25; + if ( self.noise ) + { + sound(self, CHAN_VOICE, self.noise, 1, ATTN_NORM); + } + + // Only show particles if client is visible. + // This helps to keep network traffic down to a minimum. + if (!checkclient() ) + return; + + + start = self.dest1 + self.origin; + end = self.dest2 + self.origin; + pos_x = start_x; + pos_z = start_z; + while( pos_x < end_x ) + { + pos_y = start_y; + while( pos_y < end_y ) + { + particle ( pos, '0 0 0', self.color, self.count ); + pos_y = pos_y + 16; + } + pos_x = pos_x + 16; + } +}; + +void () particlefield_touch = +{ + if ( !self.dmg ) + return; + + if ( time > self.ltime) + return; + + if (time < self.attack_finished) + return; + self.attack_finished = time + 0.5; + T_Damage (other, self, self, self.dmg); +}; + +/*QUAKED func_particlefield (0 0 1) ? USE_COUNT +Creates a brief particle flash roughly the size of the defining +brush each time it is triggered. + +USE_COUNT when the activator is a func_counter, the field will only + activate when count is equal to "cnt". Same as using a func_oncount + to trigger. + +"cnt" is the count to activate on when USE_COUNT is set. +"color" is the color of the particles. Default is 192 (yellow). +"count" is the density of the particles. Default is 2. +"noise" is the sound to play when triggered. Do not use a looping sound here. +"dmg" is the amount of damage to cause when touched. +*/ +void() func_particlefield = +{ + if ( !self.color ) + { + self.color = 192; + } + if ( self.count == 0 ) + { + self.count = 2; + } + self.classname = "particlefield"; + self.solid = SOLID_NOT; + self.movetype = MOVETYPE_NONE; + setmodel (self, self.model); + self.model = string_null; + + self.origin = (self.mins + self.maxs) * 0.5; + setorigin (self, self.origin); + self.dest = self.maxs - self.mins - '16 16 16'; + self.dest1 = self.mins + + '8 8 8' - self.origin; + self.dest2 = self.maxs + '7.9 7.9 7.9' - self.origin; + setsize (self, self.mins, self.maxs); + self.touch = particlefield_touch; + + if ( self.dest_x > self.dest_z ) + { + if ( self.dest_y > self.dest_z ) + { + self.use = particlefield_XY; + self.dest1_z = ( self.dest1_z + self.dest2_z ) / 2; + } + else + { + self.use = particlefield_XZ; + self.dest1_y = ( self.dest1_y + self.dest2_y ) / 2; + } + } + else + { + if ( self.dest_y > self.dest_x ) + { + self.use = particlefield_YZ; + self.dest1_x = ( self.dest1_x + self.dest2_x ) / 2; + } + else + { + self.use = particlefield_XZ; + self.dest1_y = ( self.dest1_y + self.dest2_y ) / 2; + } + } + + if ( self.noise ) + { + precache_sound (self.noise); + } + self.ltime = time; +}; + +//TODO +/*** + 1500 Megawatt Heavy Duty Super-Colliding Super Button + ----------------------------------------------------- + - weighted by player, cube, sentry gun + +void() func_assbuton = {}; +***/ + +/*** + Vital Apparatus Vent + ------------------------------------- + - delivers new cube when the old one is destroyed + +void() func_assvent = {}; +***/ + + +/*QUAKED ass_portalproof + Creates the wall, that can't bear portals. +*/ +void() ass_portalproof = +{ + self.solid = SOLID_BSP; + self.movetype = MOVETYPE_PUSH; + setorigin (self, self.origin); + setmodel (self, self.model); + self.classname = "portalproof"; +}; + + +/*QUAKED ass_grill + Material Emancipation Grill + - disintegrates every object but player and his gun. TODO + - reboots gun (closes portals) +*/ +void() grill_touch = +{ + if (other.classname == "player") + { + if (portal_mode == 1) + { + if (other.lastport) + { + PortalErase (other.lastport); + PortalErase (other.lastport.enemy); + other.lastport = world; + } + } else + { + PortalErase (portal1_entity); + PortalErase (portal2_entity); + } + } +}; + +void() ass_grill = +{ + InitTrigger (); + self.classname = "grill"; + self.touch = grill_touch; +}; + + +/* QUAKED ass_gravitygrill + Grill that changes gravity when touched by player. + + "gravity" - what to set the player's gravity to + - 0 (default) normal gravity + - 1 no gravity + - 2 almost no gravity + ... + - 101 normal gravity + - 102 slightly higher gravity + ... + - 1000 very high gravity + + the same goes subzero ;) +*/ +void() gravitygrill_touch = +{ +// if (other.classname != "player") +// return; + if (self.gravity == -1) + other.gravity = 1.0; + else + other.gravity = self.gravity; +}; + +void() ass_gravitygrill = +{ + InitTrigger (); + self.classname = "gravitygrill"; + self.touch = gravitygrill_touch; + if (!self.gravity) + self.gravity = -1; + else + self.gravity = ((self.gravity - 1) / 100); +}; + + + +/* QUAKED ass_killgrill + Grill that hurts player when touched. + + "dmg" - amount of damage to cause to player. + default - 100 +*/ +void() killgrill_touch = +{ + if (other.classname != "player") + return; + if (other.health) + T_Damage (other, self, self, self.dmg); +}; + +void() ass_killgrill = +{ + InitTrigger (); + self.classname ="killgrill"; + self.touch = killgrill_touch; + if (!self.dmg) + self.dmg = 100; +}; + + + +/* HIGH-ENERGY PELLETS +*********************/ +void () pellet_remove = +{ + self.launcher.nextone = TRUE; + T_RadiusDamage (self, self.owner, 120, world); + + WriteByte (MSG_BROADCAST, SVC_TEMPENTITY); + WriteByte (MSG_BROADCAST, TE_EXPLOSION); + WriteCoord (MSG_BROADCAST, self.origin_x); + WriteCoord (MSG_BROADCAST, self.origin_y); + WriteCoord (MSG_BROADCAST, self.origin_z); + + BecomeExplosion (); +}; + +void () pellet_think = +{ + if (self.sleep < time) + { + pellet_remove (); + return; + } + if (self.movetype == MOVETYPE_BOUNCE) //my little bounce trick... + { + self.movetype = MOVETYPE_FLY; + self.angles = vectoangles (self.velocity); + self.velocity = normalize (self.velocity) * self.speed; + self.oldvel = self.velocity; + + } else { + self.velocity = normalize (self.velocity) * self.speed; + } + self.nextthink = time + 0.1; +}; +void () pellet_touch = +{ + if (other.takedamage) + { + pellet_remove (); + return; + } +// sound (self, CHAN_WEAPON, "pellet/hit.wav", 1, ATTN_NONE); + traceline (self.origin, self.origin + v_forward * 8, TRUE, self); // is there a wall in front of me? + setorigin (self, (trace_endpos - v_forward * 8 )); +// self.velocity = normalize(self.velocity) * self.speed; + self.movetype = MOVETYPE_BOUNCE; + self.nextthink = time; +}; + +void (vector org, vector dir) pellet_fire = +{ + local entity pellet; + +// sound (self, CHAN_WEAPON, "pellet/fire.wav", 1, ATTN_NORM); + pellet = spawn (); + pellet.launcher = self; + pellet.movetype = MOVETYPE_FLY; + pellet.solid = SOLID_BBOX; + pellet.sleep = time + self.ttl; + pellet.speed = PELLET_SPEED; + pellet.target = "pellet"; + pellet.angles = vectoangles(dir); + + pellet.classname = "pellet"; + pellet.touch = pellet_touch; + pellet.think = pellet_think; + pellet.nextthink = time + 0.1; + pellet.effects = EF_DIMLIGHT; + + setmodel (pellet, "progs/pellet.mdl"); + setsize (pellet, '-16 -16 -16', '16 16 16'); + setorigin (pellet, org); + + pellet.velocity = normalize(dir) * PELLET_SPEED; +}; + +void() pelletlauncher_think = +{ + if (self.nextone == TRUE) { + pellet_fire(self.origin, self.movedir); + self.nextone = FALSE; + } + self.nextthink = time + 1; +}; + + +/*QUAKED ass_pelletlauncher (0 0 1) (-16 -16 -16) (16 16 16) + High-Energy Pellet Launcher + + "wait" - delay before first shot [0] + + "ttl" - time to live [180] +*/ +void () ass_pelletlauncher = +{ + SetMovedir (); + if (self.wait < 0) self.wait = 0; + if (self.ttl < 1) self.ttl = PELLET_TTL; + self.nextone = TRUE; + self.think = pelletlauncher_think; + self.nextthink = time + self.wait; +// precache_sound ("pellet/fire.wav"); +// precache_sound ("pellet/hit.wav"); + precache_model ("progs/pellet.mdl"); +}; + +/*QUAKED ass_pelletcatcher (0 0 1) + High-Energy Pellet Catcher +*/ +//void () ass_pelletcatcher = { +// self.classname = "ass_pelletcatcher"; +//}; diff --git a/src/boss.qc b/src/boss.qc new file mode 100644 index 0000000..949de52 --- /dev/null +++ b/src/boss.qc @@ -0,0 +1,385 @@ +/* +============================================================================== + +BOSS-ONE + +============================================================================== +*/ +$cd id1/models/boss1 +$origin 0 0 -15 +$base base +$skin skin +$scale 5 + +$frame rise1 rise2 rise3 rise4 rise5 rise6 rise7 rise8 rise9 rise10 +$frame rise11 rise12 rise13 rise14 rise15 rise16 rise17 + +$frame walk1 walk2 walk3 walk4 walk5 walk6 walk7 walk8 +$frame walk9 walk10 walk11 walk12 walk13 walk14 walk15 +$frame walk16 walk17 walk18 walk19 walk20 walk21 walk22 +$frame walk23 walk24 walk25 walk26 walk27 walk28 walk29 walk30 walk31 + +$frame death1 death2 death3 death4 death5 death6 death7 death8 death9 + +$frame attack1 attack2 attack3 attack4 attack5 attack6 attack7 attack8 +$frame attack9 attack10 attack11 attack12 attack13 attack14 attack15 +$frame attack16 attack17 attack18 attack19 attack20 attack21 attack22 +$frame attack23 + +$frame shocka1 shocka2 shocka3 shocka4 shocka5 shocka6 shocka7 shocka8 +$frame shocka9 shocka10 + +$frame shockb1 shockb2 shockb3 shockb4 shockb5 shockb6 + +$frame shockc1 shockc2 shockc3 shockc4 shockc5 shockc6 shockc7 shockc8 +$frame shockc9 shockc10 + + +void(vector p) boss_missile; + +void() boss_face = +{ + +// go for another player if multi player + if (self.enemy.health <= 0 || random() < 0.02) + { + self.enemy = find(self.enemy, classname, "player"); + if (!self.enemy) + self.enemy = find(self.enemy, classname, "player"); + } + ai_face(); +}; + +void() boss_rise1 =[ $rise1, boss_rise2 ] { +sound (self, CHAN_WEAPON, "boss1/out1.wav", 1, ATTN_NORM); +}; +void() boss_rise2 =[ $rise2, boss_rise3 ] { +sound (self, CHAN_VOICE, "boss1/sight1.wav", 1, ATTN_NORM); +}; +void() boss_rise3 =[ $rise3, boss_rise4 ] {}; +void() boss_rise4 =[ $rise4, boss_rise5 ] {}; +void() boss_rise5 =[ $rise5, boss_rise6 ] {}; +void() boss_rise6 =[ $rise6, boss_rise7 ] {}; +void() boss_rise7 =[ $rise7, boss_rise8 ] {}; +void() boss_rise8 =[ $rise8, boss_rise9 ] {}; +void() boss_rise9 =[ $rise9, boss_rise10 ] {}; +void() boss_rise10 =[ $rise10, boss_rise11 ] {}; +void() boss_rise11 =[ $rise11, boss_rise12 ] {}; +void() boss_rise12 =[ $rise12, boss_rise13 ] {}; +void() boss_rise13 =[ $rise13, boss_rise14 ] {}; +void() boss_rise14 =[ $rise14, boss_rise15 ] {}; +void() boss_rise15 =[ $rise15, boss_rise16 ] {}; +void() boss_rise16 =[ $rise16, boss_rise17 ] {}; +void() boss_rise17 =[ $rise17, boss_missile1 ] {}; + +void() boss_idle1 =[ $walk1, boss_idle2 ] +{ +// look for other players +}; +void() boss_idle2 =[ $walk2, boss_idle3 ] {boss_face();}; +void() boss_idle3 =[ $walk3, boss_idle4 ] {boss_face();}; +void() boss_idle4 =[ $walk4, boss_idle5 ] {boss_face();}; +void() boss_idle5 =[ $walk5, boss_idle6 ] {boss_face();}; +void() boss_idle6 =[ $walk6, boss_idle7 ] {boss_face();}; +void() boss_idle7 =[ $walk7, boss_idle8 ] {boss_face();}; +void() boss_idle8 =[ $walk8, boss_idle9 ] {boss_face();}; +void() boss_idle9 =[ $walk9, boss_idle10 ] {boss_face();}; +void() boss_idle10 =[ $walk10, boss_idle11 ] {boss_face();}; +void() boss_idle11 =[ $walk11, boss_idle12 ] {boss_face();}; +void() boss_idle12 =[ $walk12, boss_idle13 ] {boss_face();}; +void() boss_idle13 =[ $walk13, boss_idle14 ] {boss_face();}; +void() boss_idle14 =[ $walk14, boss_idle15 ] {boss_face();}; +void() boss_idle15 =[ $walk15, boss_idle16 ] {boss_face();}; +void() boss_idle16 =[ $walk16, boss_idle17 ] {boss_face();}; +void() boss_idle17 =[ $walk17, boss_idle18 ] {boss_face();}; +void() boss_idle18 =[ $walk18, boss_idle19 ] {boss_face();}; +void() boss_idle19 =[ $walk19, boss_idle20 ] {boss_face();}; +void() boss_idle20 =[ $walk20, boss_idle21 ] {boss_face();}; +void() boss_idle21 =[ $walk21, boss_idle22 ] {boss_face();}; +void() boss_idle22 =[ $walk22, boss_idle23 ] {boss_face();}; +void() boss_idle23 =[ $walk23, boss_idle24 ] {boss_face();}; +void() boss_idle24 =[ $walk24, boss_idle25 ] {boss_face();}; +void() boss_idle25 =[ $walk25, boss_idle26 ] {boss_face();}; +void() boss_idle26 =[ $walk26, boss_idle27 ] {boss_face();}; +void() boss_idle27 =[ $walk27, boss_idle28 ] {boss_face();}; +void() boss_idle28 =[ $walk28, boss_idle29 ] {boss_face();}; +void() boss_idle29 =[ $walk29, boss_idle30 ] {boss_face();}; +void() boss_idle30 =[ $walk30, boss_idle31 ] {boss_face();}; +void() boss_idle31 =[ $walk31, boss_idle1 ] {boss_face();}; + +void() boss_missile1 =[ $attack1, boss_missile2 ] {boss_face();}; +void() boss_missile2 =[ $attack2, boss_missile3 ] {boss_face();}; +void() boss_missile3 =[ $attack3, boss_missile4 ] {boss_face();}; +void() boss_missile4 =[ $attack4, boss_missile5 ] {boss_face();}; +void() boss_missile5 =[ $attack5, boss_missile6 ] {boss_face();}; +void() boss_missile6 =[ $attack6, boss_missile7 ] {boss_face();}; +void() boss_missile7 =[ $attack7, boss_missile8 ] {boss_face();}; +void() boss_missile8 =[ $attack8, boss_missile9 ] {boss_face();}; +void() boss_missile9 =[ $attack9, boss_missile10 ] {boss_missile('100 100 200');}; +void() boss_missile10 =[ $attack10, boss_missile11 ] {boss_face();}; +void() boss_missile11 =[ $attack11, boss_missile12 ] {boss_face();}; +void() boss_missile12 =[ $attack12, boss_missile13 ] {boss_face();}; +void() boss_missile13 =[ $attack13, boss_missile14 ] {boss_face();}; +void() boss_missile14 =[ $attack14, boss_missile15 ] {boss_face();}; +void() boss_missile15 =[ $attack15, boss_missile16 ] {boss_face();}; +void() boss_missile16 =[ $attack16, boss_missile17 ] {boss_face();}; +void() boss_missile17 =[ $attack17, boss_missile18 ] {boss_face();}; +void() boss_missile18 =[ $attack18, boss_missile19 ] {boss_face();}; +void() boss_missile19 =[ $attack19, boss_missile20 ] {boss_face();}; +void() boss_missile20 =[ $attack20, boss_missile21 ] {boss_missile('100 -100 200');}; +void() boss_missile21 =[ $attack21, boss_missile22 ] {boss_face();}; +void() boss_missile22 =[ $attack22, boss_missile23 ] {boss_face();}; +void() boss_missile23 =[ $attack23, boss_missile1 ] {boss_face();}; + +void() boss_shocka1 =[ $shocka1, boss_shocka2 ] {}; +void() boss_shocka2 =[ $shocka2, boss_shocka3 ] {}; +void() boss_shocka3 =[ $shocka3, boss_shocka4 ] {}; +void() boss_shocka4 =[ $shocka4, boss_shocka5 ] {}; +void() boss_shocka5 =[ $shocka5, boss_shocka6 ] {}; +void() boss_shocka6 =[ $shocka6, boss_shocka7 ] {}; +void() boss_shocka7 =[ $shocka7, boss_shocka8 ] {}; +void() boss_shocka8 =[ $shocka8, boss_shocka9 ] {}; +void() boss_shocka9 =[ $shocka9, boss_shocka10 ] {}; +void() boss_shocka10 =[ $shocka10, boss_missile1 ] {}; + +void() boss_shockb1 =[ $shockb1, boss_shockb2 ] {}; +void() boss_shockb2 =[ $shockb2, boss_shockb3 ] {}; +void() boss_shockb3 =[ $shockb3, boss_shockb4 ] {}; +void() boss_shockb4 =[ $shockb4, boss_shockb5 ] {}; +void() boss_shockb5 =[ $shockb5, boss_shockb6 ] {}; +void() boss_shockb6 =[ $shockb6, boss_shockb7 ] {}; +void() boss_shockb7 =[ $shockb1, boss_shockb8 ] {}; +void() boss_shockb8 =[ $shockb2, boss_shockb9 ] {}; +void() boss_shockb9 =[ $shockb3, boss_shockb10 ] {}; +void() boss_shockb10 =[ $shockb4, boss_missile1 ] {}; + +void() boss_shockc1 =[ $shockc1, boss_shockc2 ] {}; +void() boss_shockc2 =[ $shockc2, boss_shockc3 ] {}; +void() boss_shockc3 =[ $shockc3, boss_shockc4 ] {}; +void() boss_shockc4 =[ $shockc4, boss_shockc5 ] {}; +void() boss_shockc5 =[ $shockc5, boss_shockc6 ] {}; +void() boss_shockc6 =[ $shockc6, boss_shockc7 ] {}; +void() boss_shockc7 =[ $shockc7, boss_shockc8 ] {}; +void() boss_shockc8 =[ $shockc8, boss_shockc9 ] {}; +void() boss_shockc9 =[ $shockc9, boss_shockc10 ] {}; +void() boss_shockc10 =[ $shockc10, boss_death1 ] {}; + +void() boss_death1 = [$death1, boss_death2] { +sound (self, CHAN_VOICE, "boss1/death.wav", 1, ATTN_NORM); +}; +void() boss_death2 = [$death2, boss_death3] {}; +void() boss_death3 = [$death3, boss_death4] {}; +void() boss_death4 = [$death4, boss_death5] {}; +void() boss_death5 = [$death5, boss_death6] {}; +void() boss_death6 = [$death6, boss_death7] {}; +void() boss_death7 = [$death7, boss_death8] {}; +void() boss_death8 = [$death8, boss_death9] {}; +void() boss_death9 = [$death9, boss_death10] +{ + sound (self, CHAN_BODY, "boss1/out1.wav", 1, ATTN_NORM); + WriteByte (MSG_BROADCAST, SVC_TEMPENTITY); + WriteByte (MSG_BROADCAST, TE_LAVASPLASH); + WriteCoord (MSG_BROADCAST, self.origin_x); + WriteCoord (MSG_BROADCAST, self.origin_y); + WriteCoord (MSG_BROADCAST, self.origin_z); +}; + +void() boss_death10 = [$death9, boss_death10] +{ + killed_monsters = killed_monsters + 1; + WriteByte (MSG_ALL, SVC_KILLEDMONSTER); // FIXME: reliable broadcast + SUB_UseTargets (); + remove (self); +}; + +void(vector p) boss_missile = +{ + local vector offang; + local vector org, vec, d; + local float t; + + offang = vectoangles (self.enemy.origin - self.origin); + makevectors (offang); + + org = self.origin + p_x*v_forward + p_y*v_right + p_z*'0 0 1'; + +// lead the player on hard mode + if (skill > 1) + { + t = vlen(self.enemy.origin - org) / 300; + vec = self.enemy.velocity; + vec_z = 0; + d = self.enemy.origin + t * vec; + } + else + { + d = self.enemy.origin; + } + + vec = normalize (d - org); + + launch_spike (org, vec); + setmodel (newmis, "progs/lavaball.mdl"); + newmis.avelocity = '200 100 300'; + setsize (newmis, VEC_ORIGIN, VEC_ORIGIN); + newmis.velocity = vec*300; + newmis.touch = T_MissileTouch; // rocket explosion + sound (self, CHAN_WEAPON, "boss1/throw.wav", 1, ATTN_NORM); + +// check for dead enemy + if (self.enemy.health <= 0) + boss_idle1 (); +}; + + +void() boss_awake = +{ + self.solid = SOLID_SLIDEBOX; + self.movetype = MOVETYPE_STEP; + self.takedamage = DAMAGE_NO; + + setmodel (self, "progs/boss.mdl"); + setsize (self, '-128 -128 -24', '128 128 256'); + + if (skill == 0) + self.health = 1; + else + self.health = 3; + + self.enemy = activator; + + WriteByte (MSG_BROADCAST, SVC_TEMPENTITY); + WriteByte (MSG_BROADCAST, TE_LAVASPLASH); + WriteCoord (MSG_BROADCAST, self.origin_x); + WriteCoord (MSG_BROADCAST, self.origin_y); + WriteCoord (MSG_BROADCAST, self.origin_z); + + self.yaw_speed = 20; + boss_rise1 (); +}; + + +/*QUAKED monster_boss (1 0 0) (-128 -128 -24) (128 128 256) +*/ +void() monster_boss = +{ + if (deathmatch) + { + remove(self); + return; + } + precache_model ("progs/boss.mdl"); + precache_model ("progs/lavaball.mdl"); + + precache_sound ("weapons/rocket1i.wav"); + precache_sound ("boss1/out1.wav"); + precache_sound ("boss1/sight1.wav"); + precache_sound ("misc/power.wav"); + precache_sound ("boss1/throw.wav"); + precache_sound ("boss1/pain.wav"); + precache_sound ("boss1/death.wav"); + + total_monsters = total_monsters + 1; + + self.use = boss_awake; +}; + +//=========================================================================== + +entity le1, le2; +float lightning_end; + +void() lightning_fire = +{ + local vector p1, p2; + + if (time >= lightning_end) + { // done here, put the terminals back up + self = le1; + door_go_down (); + self = le2; + door_go_down (); + return; + } + + p1 = (le1.mins + le1.maxs) * 0.5; + p1_z = le1.absmin_z - 16; + + p2 = (le2.mins + le2.maxs) * 0.5; + p2_z = le2.absmin_z - 16; + + // compensate for length of bolt + p2 = p2 - normalize(p2-p1)*100; + + self.nextthink = time + 0.1; + self.think = lightning_fire; + + WriteByte (MSG_ALL, SVC_TEMPENTITY); + WriteByte (MSG_ALL, TE_LIGHTNING3); + WriteEntity (MSG_ALL, world); + WriteCoord (MSG_ALL, p1_x); + WriteCoord (MSG_ALL, p1_y); + WriteCoord (MSG_ALL, p1_z); + WriteCoord (MSG_ALL, p2_x); + WriteCoord (MSG_ALL, p2_y); + WriteCoord (MSG_ALL, p2_z); +}; + +void() lightning_use = +{ + if (lightning_end >= time + 1) + return; + + le1 = find( world, target, "lightning"); + le2 = find( le1, target, "lightning"); + if (!le1 || !le2) + { + dprint ("missing lightning targets\n"); + return; + } + + if ( + (le1.state != STATE_TOP && le1.state != STATE_BOTTOM) + || (le2.state != STATE_TOP && le2.state != STATE_BOTTOM) + || (le1.state != le2.state) ) + { +// dprint ("not aligned\n"); + return; + } + +// don't let the electrodes go back up until the bolt is done + le1.nextthink = -1; + le2.nextthink = -1; + lightning_end = time + 1; + + sound (self, CHAN_VOICE, "misc/power.wav", 1, ATTN_NORM); + lightning_fire (); + +// advance the boss pain if down + self = find (world, classname, "monster_boss"); + if (!self) + return; + self.enemy = activator; + if (le1.state == STATE_TOP && self.health > 0) + { + sound (self, CHAN_VOICE, "boss1/pain.wav", 1, ATTN_NORM); + self.health = self.health - 1; + if (self.health >= 2) + boss_shocka1(); + else if (self.health == 1) + boss_shockb1(); + else if (self.health == 0) + boss_shockc1(); + } +}; + + +/*QUAKED event_lightning (0 1 1) (-16 -16 -16) (16 16 16) +Just for boss level. +*/ +void() event_lightning = +{ + self.use = lightning_use; +}; + + diff --git a/src/buttons.qc b/src/buttons.qc new file mode 100644 index 0000000..016ce6e --- /dev/null +++ b/src/buttons.qc @@ -0,0 +1,141 @@ +// button and multiple button + +void() button_wait; +void() button_return; + +void() button_wait = +{ + self.state = STATE_TOP; + self.nextthink = self.ltime + self.wait; + self.think = button_return; + activator = self.enemy; + SUB_UseTargets(); + self.frame = 1; // use alternate textures +}; + +void() button_done = +{ + self.state = STATE_BOTTOM; +}; + +void() button_return = +{ + self.state = STATE_DOWN; + SUB_CalcMove (self.pos1, self.speed, button_done); + self.frame = 0; // use normal textures + if (self.health) + self.takedamage = DAMAGE_YES; // can be shot again +}; + + +void() button_blocked = +{ // do nothing, just don't ome all the way back out +}; + + +void() button_fire = +{ + if (self.state == STATE_UP || self.state == STATE_TOP) + return; + + sound (self, CHAN_VOICE, self.noise, 1, ATTN_NORM); + + self.state = STATE_UP; + SUB_CalcMove (self.pos2, self.speed, button_wait); +}; + + +void() button_use = +{ + self.enemy = activator; + button_fire (); +}; + +void() button_touch = +{ + if (other.classname != "player") + return; + self.enemy = other; + button_fire (); +}; + +void() button_killed = +{ + self.enemy = damage_attacker; + self.health = self.max_health; + self.takedamage = DAMAGE_NO; // wil be reset upon return + button_fire (); +}; + + +/*QUAKED func_button (0 .5 .8) ? +When a button is touched, it moves some distance in the direction of it's angle, triggers all of it's targets, waits some time, then returns to it's original position where it can be triggered again. + +"angle" determines the opening direction +"target" all entities with a matching targetname will be used +"speed" override the default 40 speed +"wait" override the default 1 second wait (-1 = never return) +"lip" override the default 4 pixel lip remaining at end of move +"health" if set, the button must be killed instead of touched +"sounds" +0) steam metal +1) wooden clunk +2) metallic click +3) in-out +*/ +void() func_button = +{ +local float gtemp, ftemp; + + if (self.sounds == 0) + { + precache_sound ("buttons/airbut1.wav"); + self.noise = "buttons/airbut1.wav"; + } + if (self.sounds == 1) + { + precache_sound ("buttons/switch21.wav"); + self.noise = "buttons/switch21.wav"; + } + if (self.sounds == 2) + { + precache_sound ("buttons/switch02.wav"); + self.noise = "buttons/switch02.wav"; + } + if (self.sounds == 3) + { + precache_sound ("buttons/switch04.wav"); + self.noise = "buttons/switch04.wav"; + } + + SetMovedir (); + + self.movetype = MOVETYPE_PUSH; + self.solid = SOLID_BSP; + setmodel (self, self.model); + + self.blocked = button_blocked; + self.use = button_use; + + if (self.health) + { + self.max_health = self.health; + self.th_die = button_killed; + self.takedamage = DAMAGE_YES; + } + else + self.touch = button_touch; + + if (!self.speed) + self.speed = 40; + if (!self.wait) + self.wait = 1; + if (!self.lip) + self.lip = 4; + + self.state = STATE_BOTTOM; + + self.pos1 = self.origin; + self.pos2 = self.pos1 + self.movedir*(fabs(self.movedir*self.size) - self.lip); +}; + diff --git a/src/client.qc b/src/client.qc new file mode 100644 index 0000000..ccb0f01 --- /dev/null +++ b/src/client.qc @@ -0,0 +1,1454 @@ + +// prototypes +void () W_WeaponFrame; +void() W_SetCurrentAmmo; +void() player_pain; +void() player_stand1; +void (vector org) spawn_tfog; +void (vector org, entity death_owner) spawn_tdeath; + +float modelindex_eyes, modelindex_player; + +/* +============================================================================= + + LEVEL CHANGING / INTERMISSION + +============================================================================= +*/ + +float intermission_running; +float intermission_exittime; + +/*QUAKED info_intermission (1 0.5 0.5) (-16 -16 -16) (16 16 16) +This is the camera point for the intermission. +Use mangle instead of angle, so you can set pitch or roll as well as yaw. 'pitch roll yaw' +*/ +void() info_intermission = +{ +}; + + + +void() SetChangeParms = +{ + if (self.health <= 0) + { + SetNewParms (); + return; + } + +// remove items + self.items = self.items - (self.items & + (IT_KEY1 | IT_KEY2 | IT_INVISIBILITY | IT_INVULNERABILITY | IT_SUIT | IT_QUAD) ); + +// cap super health + if (self.health > 100) + self.health = 100; + if (self.health < 50) + self.health = 50; + parm1 = self.items; + parm2 = self.health; + parm3 = self.armorvalue; + if (self.ammo_shells < 25) + parm4 = 25; + else + parm4 = self.ammo_shells; + parm5 = self.ammo_nails; + parm6 = self.ammo_rockets; + parm7 = self.ammo_cells; + parm8 = self.weapon; + parm9 = self.armortype * 100; +}; + +void() SetNewParms = +{ + parm1 = IT_SHOTGUN | IT_AXE; + parm2 = 100; + parm3 = 0; + parm4 = 25; + parm5 = 0; + parm6 = 0; + parm7 = 0; + parm8 = 1; + parm9 = 0; +}; + +void() DecodeLevelParms = +{ +// if (serverflags) + if (!deathmatch) + { + if (world.model == "maps/start.bsp") + SetNewParms (); // take away all stuff on starting new episode + } + + self.items = parm1; + self.health = parm2; + self.armorvalue = parm3; + self.ammo_shells = parm4; + self.ammo_nails = parm5; + self.ammo_rockets = parm6; + self.ammo_cells = parm7; + self.weapon = parm8; + self.armortype = parm9 * 0.01; +}; + +/* +============ +FindIntermission + +Returns the entity to view from +============ +*/ +entity() FindIntermission = +{ + local entity spot; + local float cyc; + +// look for info_intermission first + spot = find (world, classname, "info_intermission"); + if (spot) + { // pick a random one + cyc = random() * 4; + while (cyc > 1) + { + spot = find (spot, classname, "info_intermission"); + if (!spot) + spot = find (spot, classname, "info_intermission"); + cyc = cyc - 1; + } + return spot; + } + +// then look for the start position + spot = find (world, classname, "info_player_start"); + if (spot) + return spot; + +// testinfo_player_start is only found in regioned levels + spot = find (world, classname, "testplayerstart"); + if (spot) + return spot; + + objerror ("FindIntermission: no spot"); + + return world; +}; + + +string nextmap; +void() GotoNextMap = +{ + if (cvar("samelevel")) // if samelevel is set, stay on same level + changelevel (mapname); + else + changelevel (nextmap); +}; + + +void() ExitIntermission = +{ +// skip any text in deathmatch + if (deathmatch) + { + GotoNextMap (); + return; + } + + intermission_exittime = time + 1; + intermission_running = intermission_running + 1; + +// +// run some text if at the end of an episode +// + if (intermission_running == 2) + { + if (world.model == "maps/e1m7.bsp") + { + WriteByte (MSG_ALL, SVC_CDTRACK); + WriteByte (MSG_ALL, 2); + WriteByte (MSG_ALL, 3); + if (!cvar("registered")) + { + WriteByte (MSG_ALL, SVC_FINALE); + WriteString (MSG_ALL, "As the corpse of the monstrous entity\nChthon sinks back into the lava whence\nit rose, you grip the Rune of Earth\nMagic tightly. Now that you have\nconquered the Dimension of the Doomed,\nrealm of Earth Magic, you are ready to\ncomplete your task in the other three\nhaunted lands of Quake. Or are you? If\nyou don't register Quake, you'll never\nknow what awaits you in the Realm of\nBlack Magic, the Netherworld, and the\nElder World!"); + } + else + { + WriteByte (MSG_ALL, SVC_FINALE); + WriteString (MSG_ALL, "As the corpse of the monstrous entity\nChthon sinks back into the lava whence\nit rose, you grip the Rune of Earth\nMagic tightly. Now that you have\nconquered the Dimension of the Doomed,\nrealm of Earth Magic, you are ready to\ncomplete your task. A Rune of magic\npower lies at the end of each haunted\nland of Quake. Go forth, seek the\ntotality of the four Runes!"); + } + return; + } + else if (world.model == "maps/e2m6.bsp") + { + WriteByte (MSG_ALL, SVC_CDTRACK); + WriteByte (MSG_ALL, 2); + WriteByte (MSG_ALL, 3); + + WriteByte (MSG_ALL, SVC_FINALE); + WriteString (MSG_ALL, "The Rune of Black Magic throbs evilly in\nyour hand and whispers dark thoughts\ninto your brain. You learn the inmost\nlore of the Hell-Mother; Shub-Niggurath!\nYou now know that she is behind all the\nterrible plotting which has led to so\nmuch death and horror. But she is not\ninviolate! Armed with this Rune, you\nrealize that once all four Runes are\ncombined, the gate to Shub-Niggurath's\nPit will open, and you can face the\nWitch-Goddess herself in her frightful\notherworld cathedral."); + return; + } + else if (world.model == "maps/e3m6.bsp") + { + WriteByte (MSG_ALL, SVC_CDTRACK); + WriteByte (MSG_ALL, 2); + WriteByte (MSG_ALL, 3); + + WriteByte (MSG_ALL, SVC_FINALE); + WriteString (MSG_ALL, "The charred viscera of diabolic horrors\nbubble viscously as you seize the Rune\nof Hell Magic. Its heat scorches your\nhand, and its terrible secrets blight\nyour mind. Gathering the shreds of your\ncourage, you shake the devil's shackles\nfrom your soul, and become ever more\nhard and determined to destroy the\nhideous creatures whose mere existence\nthreatens the souls and psyches of all\nthe population of Earth."); + return; + } + else if (world.model == "maps/e4m7.bsp") + { + WriteByte (MSG_ALL, SVC_CDTRACK); + WriteByte (MSG_ALL, 2); + WriteByte (MSG_ALL, 3); + + WriteByte (MSG_ALL, SVC_FINALE); + WriteString (MSG_ALL, "Despite the awful might of the Elder\nWorld, you have achieved the Rune of\nElder Magic, capstone of all types of\narcane wisdom. Beyond good and evil,\nbeyond life and death, the Rune\npulsates, heavy with import. Patient and\npotent, the Elder Being Shub-Niggurath\nweaves her dire plans to clear off all\nlife from the Earth, and bring her own\nfoul offspring to our world! For all the\ndwellers in these nightmare dimensions\nare her descendants! Once all Runes of\nmagic power are united, the energy\nbehind them will blast open the Gateway\nto Shub-Niggurath, and you can travel\nthere to foil the Hell-Mother's plots\nin person."); + return; + } + + GotoNextMap(); + } + + if (intermission_running == 3) + { + if (!cvar("registered")) + { // shareware episode has been completed, go to sell screen + WriteByte (MSG_ALL, SVC_SELLSCREEN); + return; + } + + if ( (serverflags&15) == 15) + { + WriteByte (MSG_ALL, SVC_FINALE); + WriteString (MSG_ALL, "Now, you have all four Runes. You sense\ntremendous invisible forces moving to\nunseal ancient barriers. Shub-Niggurath\nhad hoped to use the Runes Herself to\nclear off the Earth, but now instead,\nyou will use them to enter her home and\nconfront her as an avatar of avenging\nEarth-life. If you defeat her, you will\nbe remembered forever as the savior of\nthe planet. If she conquers, it will be\nas if you had never been born."); + return; + } + + } + + GotoNextMap(); +}; + +/* +============ +IntermissionThink + +When the player presses attack or jump, change to the next level +============ +*/ +void() IntermissionThink = +{ + if (time < intermission_exittime) + return; + + if (!self.button0 && !self.button1 && !self.button2) + return; + + ExitIntermission (); +}; + +void() execute_changelevel = +{ + local entity pos; + + intermission_running = 1; + +// enforce a wait time before allowing changelevel + if (deathmatch) + intermission_exittime = time + 5; + else + intermission_exittime = time + 2; + + WriteByte (MSG_ALL, SVC_CDTRACK); + WriteByte (MSG_ALL, 3); + WriteByte (MSG_ALL, 3); + + pos = FindIntermission (); + + other = find (world, classname, "player"); + while (other != world) + { + other.view_ofs = '0 0 0'; + other.angles = other.v_angle = pos.mangle; + other.fixangle = TRUE; // turn this way immediately + other.nextthink = time + 0.5; + other.takedamage = DAMAGE_NO; + other.solid = SOLID_NOT; + other.movetype = MOVETYPE_NONE; + other.modelindex = 0; + setorigin (other, pos.origin); + other = find (other, classname, "player"); + } + + WriteByte (MSG_ALL, SVC_INTERMISSION); +}; + + +void() changelevel_touch = +{ + local entity pos; + + if (other.classname != "player") + return; + + if ((cvar("noexit") == 1) || ((cvar("noexit") == 2) && (mapname != "start"))) + { + T_Damage (other, self, self, 50000); + return; + } + + if (coop || deathmatch) + { + bprint (other.netname); + bprint (" exited the level\n"); + } + + nextmap = self.map; + + SUB_UseTargets (); + + if ( (self.spawnflags & 1) && (deathmatch == 0) ) + { // NO_INTERMISSION + GotoNextMap(); + return; + } + + self.touch = SUB_Null; + +// we can't move people right now, because touch functions are called +// in the middle of C movement code, so set a think time to do it + self.think = execute_changelevel; + self.nextthink = time + 0.1; +}; + +/*QUAKED trigger_changelevel (0.5 0.5 0.5) ? NO_INTERMISSION +When the player touches this, he gets sent to the map listed in the "map" variable. Unless the NO_INTERMISSION flag is set, the view will go to the info_intermission spot and display stats. +*/ +void() trigger_changelevel = +{ + if (!self.map) + objerror ("changelevel trigger doesn't have map"); + + InitTrigger (); + self.touch = changelevel_touch; +}; + + +/* +============================================================================= + + PLAYER GAME EDGE FUNCTIONS + +============================================================================= +*/ + +void() set_suicide_frame; + +// called by ClientKill and DeadThink +void() respawn = +{ + if (coop) + { + // make a copy of the dead body for appearances sake + CopyToBodyQue (self); + // get the spawn parms as they were at level start + setspawnparms (self); + // respawn + PutClientInServer (); + } + else if (deathmatch) + { + // make a copy of the dead body for appearances sake + CopyToBodyQue (self); + // set default spawn parms + SetNewParms (); + // respawn + PutClientInServer (); + } + else + { // restart the entire server + localcmd ("restart\n"); + } +}; + + +/* +============ +ClientKill + +Player entered the suicide command +============ +*/ +void() ClientKill = +{ + if ((intermission_running)&&((coop)||(deathmatch))) // not allowed during intermission + return; + bprint (self.netname); + bprint (" suicides\n"); + set_suicide_frame (); + self.modelindex = modelindex_player; + self.frags = self.frags - 2; // extra penalty + respawn (); +}; + +float(vector v) CheckSpawnPoint = +{ + return FALSE; +}; + +/* +============ +SelectSpawnPoint + +Returns the entity to spawn at +============ +*/ +entity() SelectSpawnPoint = +{ + local entity spot; + local entity thing; + local float pcount; + +// testinfo_player_start is only found in regioned levels + spot = find (world, classname, "testplayerstart"); + if (spot) + return spot; + +// choose a info_player_deathmatch point + if (coop) + { + lastspawn = find(lastspawn, classname, "info_player_coop"); + if (lastspawn == world) + lastspawn = find (lastspawn, classname, "info_player_start"); + if (lastspawn != world) + return lastspawn; + } + else if (deathmatch) + { + spot = lastspawn; + while (1) + { + spot = find(spot, classname, "info_player_deathmatch"); + if (spot != world) + { + if (spot == lastspawn) + return lastspawn; + pcount = 0; + thing = findradius(spot.origin, 32); + while(thing) + { + if (thing.classname == "player") + pcount = pcount + 1; + thing = thing.chain; + } + if (pcount == 0) + { + lastspawn = spot; + return spot; + } + } + } + } + + if (serverflags) + { // return with a rune to start + spot = find (world, classname, "info_player_start2"); + if (spot) + return spot; + } + + spot = find (world, classname, "info_player_start"); + if (!spot) + error ("PutClientInServer: no info_player_start on level"); + + return spot; +}; + +/* +=========== +PutClientInServer + +called each time a player is spawned +============ +*/ +void() DecodeLevelParms; +void() PlayerDie; + + +void() PutClientInServer = +{ + local entity spot; + + spot = SelectSpawnPoint (); + + self.classname = "player"; + self.health = 100; + self.takedamage = DAMAGE_AIM; + self.solid = SOLID_SLIDEBOX; + self.movetype = MOVETYPE_WALK; + self.show_hostile = 0; + self.max_health = 100; + self.flags = FL_CLIENT; + self.air_finished = time + 12; + self.dmg = 2; // initial water damage + self.super_damage_finished = 0; + self.radsuit_finished = 0; + self.invisible_finished = 0; + self.invincible_finished = 0; + self.effects = 0; + self.invincible_time = 0; + + self.gravity = 1; + + DecodeLevelParms (); + + W_SetCurrentAmmo (); + + self.attack_finished = time; + self.th_pain = player_pain; + self.th_die = PlayerDie; + + self.deadflag = DEAD_NO; +// paustime is set by teleporters to keep the player from moving a while + self.pausetime = 0; + +// spot = SelectSpawnPoint (); + +// self.origin = spot.origin + '0 0 1'; + self.origin = self.oldorigin = spot.origin + '0 0 1'; // 1998-07-21 Respawning where player died fix by Robert Field + self.angles = spot.angles; + self.fixangle = TRUE; // turn this way immediately + +// oh, this is a hack! + setmodel (self, "progs/eyes.mdl"); + modelindex_eyes = self.modelindex; + + setmodel (self, "progs/player.mdl"); + modelindex_player = self.modelindex; + + setsize (self, VEC_HULL_MIN, VEC_HULL_MAX); + + self.view_ofs = '0 0 22'; + + self.velocity = '0 0 0'; // 1998-07-21 Player moves after respawn fix by Xian + + player_stand1 (); + + if (deathmatch || coop) + { + makevectors(self.angles); + spawn_tfog (self.origin + v_forward*20); + } + + spawn_tdeath (self.origin, self); +}; + + +/* +============================================================================= + + QUAKED FUNCTIONS + +============================================================================= +*/ + + +/*QUAKED info_player_start (1 0 0) (-16 -16 -24) (16 16 24) +The normal starting point for a level. +*/ +void() info_player_start = +{ +}; + + +/*QUAKED info_player_start2 (1 0 0) (-16 -16 -24) (16 16 24) +Only used on start map for the return point from an episode. +*/ +void() info_player_start2 = +{ +}; + + +/* +saved out by quaked in region mode +*/ +void() testplayerstart = +{ +}; + +/*QUAKED info_player_deathmatch (1 0 1) (-16 -16 -24) (16 16 24) +potential spawning position for deathmatch games +*/ +void() info_player_deathmatch = +{ +}; + +/*QUAKED info_player_coop (1 0 1) (-16 -16 -24) (16 16 24) +potential spawning position for coop games +*/ +void() info_player_coop = +{ +}; + +/* +=============================================================================== + +RULES + +=============================================================================== +*/ + +/* +go to the next level for deathmatch +only called if a time or frag limit has expired +*/ +void() NextLevel = +{ + local entity o; + + if (mapname == "start") + { + if (!cvar("registered")) + { + mapname = "e1m1"; + } + else if (!(serverflags & 1)) + { + mapname = "e1m1"; + serverflags = serverflags | 1; + } + else if (!(serverflags & 2)) + { + mapname = "e2m1"; + serverflags = serverflags | 2; + } + else if (!(serverflags & 4)) + { + mapname = "e3m1"; + serverflags = serverflags | 4; + } + else if (!(serverflags & 8)) + { + mapname = "e4m1"; + serverflags = serverflags - 7; + } + + o = spawn(); + o.map = mapname; + } + else + { + // find a trigger changelevel + o = find(world, classname, "trigger_changelevel"); + + // go back to start if no trigger_changelevel + if (!o) + { + mapname = "start"; + o = spawn(); + o.map = mapname; + } + } + + nextmap = o.map; + gameover = TRUE; + + if (o.nextthink < time) + { + o.think = execute_changelevel; + o.nextthink = time + 0.1; + } +}; + +/* +============ +CheckRules + +Exit deathmatch games upon conditions +============ +*/ +void() CheckRules = +{ + local float timelimit; + local float fraglimit; + + if (gameover) // someone else quit the game already + return; + + timelimit = cvar("timelimit") * 60; + fraglimit = cvar("fraglimit"); + +// if (timelimit && time >= timelimit) + if (deathmatch && timelimit && time >= timelimit) // 1998-07-27 Timelimit/Fraglimit fix by Maddes + { + NextLevel (); + return; + } + +// if (fraglimit && self.frags >= fraglimit) + if (deathmatch && fraglimit && self.frags >= fraglimit) // 1998-07-27 Timelimit/Fraglimit fix by Maddes + { + NextLevel (); + return; + } +}; + +//============================================================================ + +void() PlayerDeathThink = +{ + local entity old_self; + local float forward; + + if ((self.flags & FL_ONGROUND)) + { + forward = vlen (self.velocity); + forward = forward - 20; + if (forward <= 0) + self.velocity = '0 0 0'; + else + self.velocity = forward * normalize(self.velocity); + } + +// wait for all buttons released + if (self.deadflag == DEAD_DEAD) + { + if (self.button2 || self.button1 || self.button0) + return; + self.deadflag = DEAD_RESPAWNABLE; + return; + } + +// wait for any button down + if (!self.button2 && !self.button1 && !self.button0) + return; + + self.button0 = 0; + self.button1 = 0; + self.button2 = 0; + respawn(); +}; + + +void() PlayerJump = +{ + local vector start, end; + + if (self.flags & FL_WATERJUMP) + return; + + if (self.waterlevel >= 2) + { + if (self.watertype == CONTENT_WATER) + self.velocity_z = 100; + else if (self.watertype == CONTENT_SLIME) + self.velocity_z = 80; + else + self.velocity_z = 50; + +// play swiming sound + if (self.swim_flag < time) + { + self.swim_flag = time + 1; + if (random() < 0.5) + sound (self, CHAN_BODY, "misc/water1.wav", 1, ATTN_NORM); + else + sound (self, CHAN_BODY, "misc/water2.wav", 1, ATTN_NORM); + } + + return; + } + + if (!(self.flags & FL_ONGROUND)) + return; + + if ( !(self.flags & FL_JUMPRELEASED) ) + return; // don't pogo stick + + self.flags = self.flags - (self.flags & FL_JUMPRELEASED); + + self.flags = self.flags - FL_ONGROUND; // don't stairwalk + + self.button2 = 0; +// player jumping sound + sound (self, CHAN_BODY, "player/plyrjmp8.wav", 1, ATTN_NORM); + self.velocity_z = self.velocity_z + 270; +}; + + +/* +=========== +WaterMove + +============ +*/ +.float dmgtime; + +void() WaterMove = +{ +//dprint (ftos(self.waterlevel)); + if (self.movetype == MOVETYPE_NOCLIP) + return; + if (self.health < 0) + return; + + if (self.waterlevel != 3) + { + if (self.air_finished < time) + sound (self, CHAN_VOICE, "player/gasp2.wav", 1, ATTN_NORM); + else if (self.air_finished < time + 9) + sound (self, CHAN_VOICE, "player/gasp1.wav", 1, ATTN_NORM); + self.air_finished = time + 12; + self.dmg = 2; + } + else if (self.air_finished < time) + { // drown! + if (self.pain_finished < time) + { + self.dmg = self.dmg + 2; + if (self.dmg > 15) + self.dmg = 10; + T_Damage (self, world, world, self.dmg); + self.pain_finished = time + 1; + } + } + + if (!self.waterlevel) + { + if (self.flags & FL_INWATER) + { + // play leave water sound + sound (self, CHAN_BODY, "misc/outwater.wav", 1, ATTN_NORM); + self.flags = self.flags - FL_INWATER; + } + return; + } + + if (self.watertype == CONTENT_LAVA) + { // do damage + if (self.dmgtime < time) + { + if (self.radsuit_finished > time) + self.dmgtime = time + 1; + else + self.dmgtime = time + 0.2; + + T_Damage (self, world, world, 10*self.waterlevel); + } + } + else if (self.watertype == CONTENT_SLIME) + { // do damage + if (self.dmgtime < time && self.radsuit_finished < time) + { + self.dmgtime = time + 1; + T_Damage (self, world, world, 4*self.waterlevel); + } + } + + if ( !(self.flags & FL_INWATER) ) + { + +// player enter water sound + + if (self.watertype == CONTENT_LAVA) + sound (self, CHAN_BODY, "player/inlava.wav", 1, ATTN_NORM); + if (self.watertype == CONTENT_WATER) + sound (self, CHAN_BODY, "player/inh2o.wav", 1, ATTN_NORM); + if (self.watertype == CONTENT_SLIME) + sound (self, CHAN_BODY, "player/slimbrn2.wav", 1, ATTN_NORM); + + self.flags = self.flags + FL_INWATER; + self.dmgtime = 0; + } + + if (! (self.flags & FL_WATERJUMP) ) + self.velocity = self.velocity - 0.8*self.waterlevel*frametime*self.velocity; +}; + +void() CheckWaterJump = +{ + local vector start, end; + +// check for a jump-out-of-water + makevectors (self.angles); + start = self.origin; + start_z = start_z + 8; + v_forward_z = 0; + normalize(v_forward); + end = start + v_forward*24; + traceline (start, end, TRUE, self); + if (trace_fraction < 1) + { // solid at waist + start_z = start_z + self.maxs_z - 8; + end = start + v_forward*24; + self.movedir = trace_plane_normal * -50; + traceline (start, end, TRUE, self); + if (trace_fraction == 1) + { // open at eye level + self.flags = self.flags | FL_WATERJUMP; + self.velocity_z = 225; + self.flags = self.flags - (self.flags & FL_JUMPRELEASED); + self.teleport_time = time + 2; // safety net + return; + } + } +}; + + +/* +================ +PlayerPreThink + +Called every frame before physics are run +================ +*/ +void() PlayerPreThink = +{ + local float mspeed, aspeed; + local float r; + + if (intermission_running) + { + IntermissionThink (); // otherwise a button could be missed between + return; // the think tics + } + + if (self.view_ofs == '0 0 0') + return; // intermission or finale + + self.oldvel = self.velocity; + + makevectors (self.v_angle); // is this still used + + CheckRules (); + WaterMove (); + + if (self.waterlevel == 2) + CheckWaterJump (); + + if (self.deadflag >= DEAD_DEAD) + { + PlayerDeathThink (); + return; + } + + if (self.deadflag == DEAD_DYING) + return; // dying, so do nothing + + if (self.button2) + { + PlayerJump (); + } + else + self.flags = self.flags | FL_JUMPRELEASED; + +// teleporters can force a non-moving pause time + if (time < self.pausetime) + self.velocity = '0 0 0'; + + if(time > self.attack_finished && self.currentammo == 0 && self.weapon != IT_AXE) + { + self.weapon = W_BestWeapon (); + W_SetCurrentAmmo (); + } +}; + +/* +================ +CheckPowerups + +Check for turning off powerups +================ +*/ +void() CheckPowerups = +{ + if (self.health <= 0) + return; + +// invisibility + if (self.invisible_finished) + { +// sound and screen flash when items starts to run out + if (self.invisible_sound < time) + { + sound (self, CHAN_AUTO, "items/inv3.wav", 0.5, ATTN_IDLE); + self.invisible_sound = time + ((random() * 3) + 1); + } + + + if (self.invisible_finished < time + 3) + { + if (self.invisible_time == 1) + { + sprint (self, "Ring of Shadows magic is fading\n"); + stuffcmd (self, "bf\n"); + sound (self, CHAN_AUTO, "items/inv2.wav", 1, ATTN_NORM); + self.invisible_time = time + 1; + } + + if (self.invisible_time < time) + { + self.invisible_time = time + 1; + stuffcmd (self, "bf\n"); + } + } + + if (self.invisible_finished < time) + { // just stopped + self.items = self.items - IT_INVISIBILITY; + self.invisible_finished = 0; + self.invisible_time = 0; + } + + // use the eyes + self.frame = 0; + self.modelindex = modelindex_eyes; + } + else + self.modelindex = modelindex_player; // don't use eyes + +// invincibility + if (self.invincible_finished) + { +// sound and screen flash when items starts to run out + if (self.invincible_finished < time + 3) + { + if (self.invincible_time == 1) + { + sprint (self, "Protection is almost burned out\n"); + stuffcmd (self, "bf\n"); + sound (self, CHAN_AUTO, "items/protect2.wav", 1, ATTN_NORM); + self.invincible_time = time + 1; + } + + if (self.invincible_time < time) + { + self.invincible_time = time + 1; + stuffcmd (self, "bf\n"); + } + } + + if (self.invincible_finished < time) + { // just stopped + self.items = self.items - IT_INVULNERABILITY; + self.invincible_time = 0; + self.invincible_finished = 0; + } + if (self.invincible_finished > time) + self.effects = self.effects | EF_DIMLIGHT; + else + self.effects = self.effects - (self.effects & EF_DIMLIGHT); + } + +// super damage + if (self.super_damage_finished) + { + +// sound and screen flash when items starts to run out + + if (self.super_damage_finished < time + 3) + { + if (self.super_time == 1) + { + sprint (self, "Quad Damage is wearing off\n"); + stuffcmd (self, "bf\n"); + sound (self, CHAN_AUTO, "items/damage2.wav", 1, ATTN_NORM); + self.super_time = time + 1; + } + + if (self.super_time < time) + { + self.super_time = time + 1; + stuffcmd (self, "bf\n"); + } + } + + if (self.super_damage_finished < time) + { // just stopped + self.items = self.items - IT_QUAD; + self.super_damage_finished = 0; + self.super_time = 0; + } + if (self.super_damage_finished > time) + self.effects = self.effects | EF_DIMLIGHT; + else + self.effects = self.effects - (self.effects & EF_DIMLIGHT); + } + +// suit + if (self.radsuit_finished) + { + self.air_finished = time + 12; // don't drown + +// sound and screen flash when items starts to run out + if (self.radsuit_finished < time + 3) + { + if (self.rad_time == 1) + { + sprint (self, "Air supply in Biosuit expiring\n"); + stuffcmd (self, "bf\n"); + sound (self, CHAN_AUTO, "items/suit2.wav", 1, ATTN_NORM); + self.rad_time = time + 1; + } + + if (self.rad_time < time) + { + self.rad_time = time + 1; + stuffcmd (self, "bf\n"); + } + } + + if (self.radsuit_finished < time) + { // just stopped + self.items = self.items - IT_SUIT; + self.rad_time = 0; + self.radsuit_finished = 0; + } + } + +}; + + +/* +================ +PlayerPostThink + +Called every frame after physics are run +================ +*/ +void() PlayerPostThink = +{ + local float mspeed, aspeed; + local float r; + + if (self.view_ofs == '0 0 0') + return; // intermission or finale + if (self.deadflag) + return; + +// do weapon stuff + + W_WeaponFrame (); + +// check to see if player landed and play landing sound + if ((self.jump_flag < -300) && (self.flags & FL_ONGROUND) && (self.health > 0)) + { + if (self.watertype == CONTENT_WATER) + sound (self, CHAN_BODY, "player/h2ojump.wav", 1, ATTN_NORM); +// else if (self.jump_flag < -650) +// { +// sound (self, CHAN_VOICE, "player/land2.wav", 1, ATTN_NORM); +/*ADVANCED KNEE T_Damage (self, world, world, 5); + REPLACEMENT :) self.deathtype = "falling";*/ +// } +// else +// sound (self, CHAN_VOICE, "player/land.wav", 1, ATTN_NORM); + + self.jump_flag = 0; + } + + if (!(self.flags & FL_ONGROUND)) + self.jump_flag = self.velocity_z; + + CheckPowerups (); +}; + + +/* +=========== +ClientConnect + +called when a player connects to a server +============ +*/ +void() ClientConnect = +{ + bprint (self.netname); + bprint (" entered the game\n"); + +// a client connecting during an intermission can cause problems + if (intermission_running) + ExitIntermission (); +}; + + +/* +=========== +ClientDisconnect + +called when a player disconnects from a server +============ +*/ +void() ClientDisconnect = +{ + if (gameover) + return; + // if the level end trigger has been activated, just return + // since they aren't *really* leaving + + // let everyone else know + bprint (self.netname); + bprint (" left the game with "); + bprint (ftos(self.frags)); + bprint (" frags\n"); + sound (self, CHAN_BODY, "player/tornoff2.wav", 1, ATTN_NONE); + set_suicide_frame (); +}; + +/* +=========== +ClientObituary + +called when a player dies +============ +*/ +void(entity targ, entity attacker) ClientObituary = +{ + local float rnum; + local string deathstring, deathstring2; + rnum = random(); + + if (targ.classname == "player") + { + if (attacker.classname == "teledeath") + { + bprint (targ.netname); + bprint (" was telefragged by "); + bprint (attacker.owner.netname); + bprint ("\n"); + + attacker.owner.frags = attacker.owner.frags + 1; + return; + } + + if (attacker.classname == "teledeath2") + { + bprint ("Satan's power deflects "); + bprint (targ.netname); + bprint ("'s telefrag\n"); + + targ.frags = targ.frags - 1; + return; + } + + if (attacker.classname == "player") + { + if (targ == attacker) + { + // killed self + attacker.frags = attacker.frags - 1; + bprint (targ.netname); + + if (targ.weapon == 64 && targ.waterlevel > 1) + { + bprint (" discharges into the water.\n"); + return; + } + if (targ.weapon == IT_GRENADE_LAUNCHER) + bprint (" tries to put the pin back in\n"); + else + bprint (" becomes bored with life\n"); + return; + } + else if ( (teamplay == 2) && (targ.team > 0)&&(targ.team == attacker.team) ) + { + if (rnum < 0.25) + deathstring = " mows down a teammate\n"; + else if (rnum < 0.50) + deathstring = " checks his glasses\n"; + else if (rnum < 0.75) + deathstring = " gets a frag for the other team\n"; + else + deathstring = " loses another friend\n"; + bprint (attacker.netname); + bprint (deathstring); + attacker.frags = attacker.frags - 1; + return; + } + else + { + attacker.frags = attacker.frags + 1; + + rnum = attacker.weapon; + if (rnum == IT_AXE) + { + deathstring = " was ax-murdered by "; + deathstring2 = "\n"; + } + if (rnum == IT_SHOTGUN) + { + deathstring = " chewed on "; + deathstring2 = "'s boomstick\n"; + } + if (rnum == IT_SUPER_SHOTGUN) + { + deathstring = " ate 2 loads of "; + deathstring2 = "'s buckshot\n"; + } + if (rnum == IT_NAILGUN) + { + deathstring = " was nailed by "; + deathstring2 = "\n"; + } + if (rnum == IT_SUPER_NAILGUN) + { + deathstring = " was punctured by "; + deathstring2 = "\n"; + } + if (rnum == IT_GRENADE_LAUNCHER) + { + deathstring = " eats "; + deathstring2 = "'s pineapple\n"; + if (targ.health < -40) + { + deathstring = " was gibbed by "; + deathstring2 = "'s grenade\n"; + } + } + if (rnum == IT_ROCKET_LAUNCHER) + { + deathstring = " rides "; + deathstring2 = "'s rocket\n"; + if (targ.health < -40) + { + deathstring = " was gibbed by "; + deathstring2 = "'s rocket\n" ; + } + } + if (rnum == IT_LIGHTNING) + { + deathstring = " accepts "; + if (attacker.waterlevel > 1) + deathstring2 = "'s discharge\n"; + else + deathstring2 = "'s shaft\n"; + } + bprint (targ.netname); + bprint (deathstring); + bprint (attacker.netname); + bprint (deathstring2); + } + return; + } + else + { + targ.frags = targ.frags - 1; + bprint (targ.netname); + + // killed by a montser? + if (attacker.flags & FL_MONSTER) + { + if (attacker.classname == "monster_army") + bprint (" was shot by a Grunt\n"); + if (attacker.classname == "monster_demon1") + bprint (" was eviscerated by a Fiend\n"); + if (attacker.classname == "monster_dog") + bprint (" was mauled by a Rottweiler\n"); + if (attacker.classname == "monster_dragon") + bprint (" was fried by a Dragon\n"); + if (attacker.classname == "monster_enforcer") + bprint (" was blasted by an Enforcer\n"); + if (attacker.classname == "monster_fish") + bprint (" was fed to the Rotfish\n"); + if (attacker.classname == "monster_hell_knight") + bprint (" was slain by a Death Knight\n"); + if (attacker.classname == "monster_knight") + bprint (" was slashed by a Knight\n"); + if (attacker.classname == "monster_ogre") + bprint (" was destroyed by an Ogre\n"); + if (attacker.classname == "monster_oldone") + bprint (" became one with Shub-Niggurath\n"); + if (attacker.classname == "monster_shalrath") + bprint (" was exploded by a Vore\n"); + if (attacker.classname == "monster_shambler") + bprint (" was smashed by a Shambler\n"); + if (attacker.classname == "monster_tarbaby") + bprint (" was slimed by a Spawn\n"); + if (attacker.classname == "monster_vomit") + bprint (" was vomited on by a Vomitus\n"); + if (attacker.classname == "monster_wizard") + bprint (" was scragged by a Scrag\n"); + if (attacker.classname == "monster_zombie") + bprint (" joins the Zombies\n"); + + return; + } + + // tricks and traps + if (attacker.classname == "explo_box") + { + bprint (" blew up\n"); + return; + } + if (attacker.solid == SOLID_BSP && attacker != world) + { + bprint (" was squished\n"); + return; + } + if (attacker.classname == "trap_shooter" || attacker.classname == "trap_spikeshooter") + { + bprint (" was spiked\n"); + return; + } + if (attacker.classname == "fireball") + { + bprint (" ate a lavaball\n"); + return; + } + if (attacker.classname == "trigger_changelevel") + { + bprint (" tried to leave\n"); + return; + } + + // in-water deaths + rnum = targ.watertype; + if (rnum == -3) + { + if (random() < 0.5) + bprint (" sleeps with the fishes\n"); + else + bprint (" sucks it down\n"); + return; + } + else if (rnum == -4) + { + if (random() < 0.5) + bprint (" gulped a load of slime\n"); + else + bprint (" can't exist on slime alone\n"); + return; + } + else if (rnum == -5) + { + if (targ.health < -15) + { + bprint (" burst into flames\n"); + return; + } + if (random() < 0.5) + bprint (" turned into hot slag\n"); + else + bprint (" visits the Volcano God\n"); + return; + } + + // fell to their death? + if (targ.deathtype == "falling") + { + targ.deathtype = ""; + bprint (" fell to his death\n"); + return; + } + + // hell if I know; he's just dead!!! + bprint (" died\n"); + } + } +}; diff --git a/src/combat.qc b/src/combat.qc new file mode 100644 index 0000000..337a91f --- /dev/null +++ b/src/combat.qc @@ -0,0 +1,289 @@ + +void() T_MissileTouch; +void() info_player_start; +void(entity targ, entity attacker) ClientObituary; + +void() monster_death_use; + +//============================================================================ + +/* +============ +CanDamage + +Returns true if the inflictor can directly damage the target. Used for +explosions and melee attacks. +============ +*/ +float(entity targ, entity inflictor) CanDamage = +{ +// bmodels need special checking because their origin is 0,0,0 + if (targ.movetype == MOVETYPE_PUSH) + { + traceline(inflictor.origin, 0.5 * (targ.absmin + targ.absmax), TRUE, self); + if (trace_fraction == 1) + return TRUE; + if (trace_ent == targ) + return TRUE; + return FALSE; + } + + traceline(inflictor.origin, targ.origin, TRUE, self); + if (trace_fraction == 1) + return TRUE; + traceline(inflictor.origin, targ.origin + '15 15 0', TRUE, self); + if (trace_fraction == 1) + return TRUE; + traceline(inflictor.origin, targ.origin + '-15 -15 0', TRUE, self); + if (trace_fraction == 1) + return TRUE; + traceline(inflictor.origin, targ.origin + '-15 15 0', TRUE, self); + if (trace_fraction == 1) + return TRUE; + traceline(inflictor.origin, targ.origin + '15 -15 0', TRUE, self); + if (trace_fraction == 1) + return TRUE; + + return FALSE; +}; + + +/* +============ +Killed +============ +*/ +void(entity targ, entity attacker) Killed = +{ + local entity oself; + + oself = self; + self = targ; + + if (self.health < -99) + self.health = -99; // don't let sbar look bad if a player + + if (self.movetype == MOVETYPE_PUSH || self.movetype == MOVETYPE_NONE) + { // doors, triggers, etc + self.th_die (); + self = oself; + return; + } + + self.enemy = attacker; + +// bump the monster counter + if (self.flags & FL_MONSTER) + { + killed_monsters = killed_monsters + 1; + WriteByte (MSG_ALL, SVC_KILLEDMONSTER); + } + + ClientObituary(self, attacker); + + self.takedamage = DAMAGE_NO; + self.touch = SUB_Null; + + monster_death_use(); + self.th_die (); + + self = oself; +}; + + +/* +============ +T_Damage + +The damage is coming from inflictor, but get mad at attacker +This should be the only function that ever reduces health. +============ +*/ +void(entity targ, entity inflictor, entity attacker, float damage) T_Damage= +{ + local vector dir; + local entity oldself; + local float save; + local float take; + + if (!targ.takedamage) + return; + +// used by buttons and triggers to set activator for target firing + damage_attacker = attacker; + +// check for quad damage powerup on the attacker + if (attacker.super_damage_finished > time) + damage = damage * 4; + +// save damage based on the target's armor level + + save = ceil(targ.armortype*damage); + if (save >= targ.armorvalue) + { + save = targ.armorvalue; + targ.armortype = 0; // lost all armor + targ.items = targ.items - (targ.items & (IT_ARMOR1 | IT_ARMOR2 | IT_ARMOR3)); + } + + targ.armorvalue = targ.armorvalue - save; + take = ceil(damage-save); + +// add to the damage total for clients, which will be sent as a single +// message at the end of the frame +// FIXME: remove after combining shotgun blasts? + if (targ.flags & FL_CLIENT) + { + targ.dmg_take = targ.dmg_take + take; + targ.dmg_save = targ.dmg_save + save; + targ.dmg_inflictor = inflictor; + } + +// figure momentum add + if ( (inflictor != world) && (targ.movetype == MOVETYPE_WALK) ) + { + dir = targ.origin - (inflictor.absmin + inflictor.absmax) * 0.5; + dir = normalize(dir); + targ.velocity = targ.velocity + dir*damage*8; + } + +// check for godmode or invincibility + if (targ.flags & FL_GODMODE) + return; + if (targ.invincible_finished >= time) + { + if (self.invincible_sound < time) + { + sound (targ, CHAN_ITEM, "items/protect3.wav", 1, ATTN_NORM); + self.invincible_sound = time + 2; + } + return; + } + +// team play damage avoidance +// if ( (teamplay == 1) && (targ.team > 0)&&(targ.team == attacker.team) ) + if ( (teamplay == 1) && (targ.team > 0) && (targ.team == attacker.team) + && (targ != attacker) + && (attacker.classname == "player") + && (inflictor.classname != "door") ) // because squishing a teammate is still possible + return; + +// do the damage + targ.health = targ.health - take; + + if (targ.health <= 0) + { + Killed (targ, attacker); + return; + } + +// react to the damage + oldself = self; + self = targ; + + if ( (self.flags & FL_MONSTER) && attacker != world) + { + // get mad unless of the same class (except for soldiers) + if (self != attacker && attacker != self.enemy) + { + if ( (self.classname != attacker.classname) + || (self.classname == "monster_army" ) ) + { + if (self.enemy.classname == "player") + self.oldenemy = self.enemy; + self.enemy = attacker; + FoundTarget (); + } + } + } + + if (self.th_pain) + { + self.th_pain (attacker, take); + // nightmare mode monsters don't go into pain frames often + if (skill == 3) + self.pain_finished = time + 5; + } + + self = oldself; +}; + +/* +============ +T_RadiusDamage +============ +*/ +void(entity inflictor, entity attacker, float damage, entity ignore) T_RadiusDamage = +{ + local float points; + local entity head; + local vector org; + + head = findradius(inflictor.origin, damage+40); + + while (head) + { + if (head != ignore) + { + if (head.takedamage) + { + org = head.origin + (head.mins + head.maxs)*0.5; + points = 0.5*vlen (inflictor.origin - org); + if (points < 0) + points = 0; + points = damage - points; + if (head == attacker) + points = points * 0.5; + if (points > 0) + { + if (CanDamage (head, inflictor)) + { // shambler takes half damage from all explosions + if (head.classname == "monster_shambler") + T_Damage (head, inflictor, attacker, points*0.5); + else + T_Damage (head, inflictor, attacker, points); + } + } + } + } + head = head.chain; + } +}; + +/* +============ +T_BeamDamage +============ +*/ +void(entity attacker, float damage) T_BeamDamage = +{ + local float points; + local entity head; + + head = findradius(attacker.origin, damage+40); + + while (head) + { + if (head.takedamage) + { + points = 0.5*vlen (attacker.origin - head.origin); + if (points < 0) + points = 0; + points = damage - points; + if (head == attacker) + points = points * 0.5; + if (points > 0) + { + if (CanDamage (head, attacker)) + { + if (head.classname == "monster_shambler") + T_Damage (head, attacker, attacker, points*0.5); + else + T_Damage (head, attacker, attacker, points); + } + } + } + head = head.chain; + } +}; + diff --git a/src/cube.qc b/src/cube.qc new file mode 100644 index 0000000..d778c6f --- /dev/null +++ b/src/cube.qc @@ -0,0 +1,62 @@ +/* Aperture Science Cube + + Copyleft (<)2010. + None rights reserved. + DO distribute. + + Inspired by Wazat's code from inside3d.com +*/ + +void() asscube_think = +{ + self.nextthink = time; +}; + +void() asscube_push = +{ + local vector vec, selforg, otherorg; + local float dist; dist = 2; + + if (other.classname != "player") return; + if (other.absmin_z + 4 < self.absmax_z) + { + // getting origins this way allows for BSP entities to work too. + otherorg = 0.5*(other.absmin + other.absmax); + selforg = 0.5*(self.absmin + self.absmax); + + // Don't move in the direction the player is facing. Instead, always move away from the player. + vec = normalize(selforg - otherorg); // dir from them toward me + vec = vectoangles(vec); +// self.flags = self.flags - FL_ONGROUND; + walkmove(vec_y, dist); + } + else // (touch on top) + { + other.flags = other.flags | FL_ONGROUND; + } +}; + +/*QUAKED ass_cube (0 0 1) (0 0 0) (32 32 32) + Companion Cube +*/ +void() ass_cube = +{ + local entity new; + local vector newsize; + + self.mangle = self.angles; + self.angles = '0 0 0'; + + precache_model ("progs/cube.bsp"); + setmodel (self, "progs/cube.bsp"); + setsize (self, '0 0 0', '32 32 32'); + + self.classname = "cube"; + self.solid = SOLID_SLIDEBOX; + self.movetype = MOVETYPE_STEP; + setorigin (self, self.origin); + self.oldorigin = self.origin; + self.touch = asscube_push; + self.nextthink = time + 0.1; + self.think = asscube_think; +}; diff --git a/src/custdefs.qc b/src/custdefs.qc new file mode 100644 index 0000000..b44cb70 --- /dev/null +++ b/src/custdefs.qc @@ -0,0 +1,4 @@ +.float color; +.float gravity; +.float duration; +.float endtime; diff --git a/src/defs.qc b/src/defs.qc new file mode 100644 index 0000000..30b3dbe --- /dev/null +++ b/src/defs.qc @@ -0,0 +1,697 @@ + +/* +============================================================================== + + SOURCE FOR GLOBALVARS_T C STRUCTURE + +============================================================================== +*/ + +// +// system globals +// +entity self; +entity other; +entity world; +float time; +float frametime; + +float force_retouch; // force all entities to touch triggers + // next frame. this is needed because + // non-moving things don't normally scan + // for triggers, and when a trigger is + // created (like a teleport trigger), it + // needs to catch everything. + // decremented each frame, so set to 2 + // to guarantee everything is touched +string mapname; + +float deathmatch; +float coop; +float teamplay; + +float serverflags; // propagated from level to level, used to + // keep track of completed episodes + +float total_secrets; +float total_monsters; + +float found_secrets; // number of secrets found +float killed_monsters; // number of monsters killed + + +// spawnparms are used to encode information about clients across server +// level changes +float parm1, parm2, parm3, parm4, parm5, parm6, parm7, parm8, parm9, parm10, parm11, parm12, parm13, parm14, parm15, parm16; + +// +// global variables set by built in functions +// +vector v_forward, v_up, v_right; // set by makevectors() + +// set by traceline / tracebox +float trace_allsolid; +float trace_startsolid; +float trace_fraction; +vector trace_endpos; +vector trace_plane_normal; +float trace_plane_dist; +entity trace_ent; +float trace_inopen; +float trace_inwater; + +entity msg_entity; // destination of single entity writes + +// +// required prog functions +// +void() main; // only for testing + +void() StartFrame; + +void() PlayerPreThink; +void() PlayerPostThink; + +void() ClientKill; +void() ClientConnect; +void() PutClientInServer; // call after setting the parm1... parms +void() ClientDisconnect; + +void() SetNewParms; // called when a client first connects to + // a server. sets parms so they can be + // saved off for restarts + +void() SetChangeParms; // call to set parms for self so they can + // be saved for a level transition + + +//================================================ +void end_sys_globals; // flag for structure dumping +//================================================ + +/* +============================================================================== + + SOURCE FOR ENTVARS_T C STRUCTURE + +============================================================================== +*/ + +// +// system fields (*** = do not set in prog code, maintained by C code) +// +.float modelindex; // *** model index in the precached list +.vector absmin, absmax; // *** origin + mins / maxs + +.float ltime; // local time for entity +.float movetype; +.float solid; + +.vector origin; // *** +.vector oldorigin; // *** +.vector velocity; +.vector angles; +.vector avelocity; + +.vector punchangle; // temp angle adjust from damage or recoil + +.string classname; // spawn function +.string model; +.float frame; +.float skin; +.float effects; + +.vector mins, maxs; // bounding box extents reletive to origin +.vector size; // maxs - mins + +.void() touch; +.void() use; +.void() think; +.void() blocked; // for doors or plats, called when can't push other + +.float nextthink; +.entity groundentity; + +// stats +.float health; +.float frags; +.float weapon; // one of the IT_SHOTGUN, etc flags +.string weaponmodel; +.float weaponframe; +.float currentammo; +.float ammo_shells, ammo_nails, ammo_rockets, ammo_cells; + +.float items; // bit flags + +.float takedamage; +.entity chain; +.float deadflag; + +.vector view_ofs; // add to origin to get eye point + + +.float button0; // fire +.float button1; // use +.float button2; // jump + +.float impulse; // weapon changes + +.float fixangle; +.vector v_angle; // view / targeting angle for players +.float idealpitch; // calculated pitch angle for lookup up slopes + + +.string netname; + +.entity enemy; + +.float flags; + +.float colormap; +.float team; + +.float max_health; // players maximum health is stored here + +.float teleport_time; // don't back up + +.float armortype; // save this fraction of incoming damage +.float armorvalue; + +.float waterlevel; // 0 = not in, 1 = feet, 2 = wast, 3 = eyes +.float watertype; // a contents value + +.float ideal_yaw; +.float yaw_speed; + +.entity aiment; + +.entity goalentity; // a movetarget or an enemy + +.float spawnflags; + +.string target; +.string targetname; + +// damage is accumulated through a frame. and sent as one single +// message, so the super shotgun doesn't generate huge messages +.float dmg_take; +.float dmg_save; +.entity dmg_inflictor; + +.entity owner; // who launched a missile +.vector movedir; // mostly for doors, but also used for waterjump + +.string message; // trigger messages + +.float sounds; // either a cd track number or sound number + +.string noise, noise1, noise2, noise3; // contains names of wavs to play + +//================================================ +void end_sys_fields; // flag for structure dumping +//================================================ + +/* +============================================================================== + + VARS NOT REFERENCED BY C CODE + +============================================================================== +*/ + + +// +// constants +// + +float FALSE = 0; +float TRUE = 1; + +// edict.flags +float FL_FLY = 1; +float FL_SWIM = 2; +float FL_CLIENT = 8; // set for all client edicts +float FL_INWATER = 16; // for enter / leave water splash +float FL_MONSTER = 32; +float FL_GODMODE = 64; // player cheat +float FL_NOTARGET = 128; // player cheat +float FL_ITEM = 256; // extra wide size for bonus items +float FL_ONGROUND = 512; // standing on something +float FL_PARTIALGROUND = 1024; // not all corners are valid +float FL_WATERJUMP = 2048; // player jumping out of water +float FL_JUMPRELEASED = 4096; // for jump debouncing + +// edict.movetype values +float MOVETYPE_NONE = 0; // never moves +//float MOVETYPE_ANGLENOCLIP = 1; +//float MOVETYPE_ANGLECLIP = 2; +float MOVETYPE_WALK = 3; // players only +float MOVETYPE_STEP = 4; // discrete, not real time unless fall +float MOVETYPE_FLY = 5; +float MOVETYPE_TOSS = 6; // gravity +float MOVETYPE_PUSH = 7; // no clip to world, push and crush +float MOVETYPE_NOCLIP = 8; +float MOVETYPE_FLYMISSILE = 9; // fly with extra size against monsters +float MOVETYPE_BOUNCE = 10; +float MOVETYPE_BOUNCEMISSILE = 11; // bounce with extra size + +// edict.solid values +float SOLID_NOT = 0; // no interaction with other objects +float SOLID_TRIGGER = 1; // touch on edge, but not blocking +float SOLID_BBOX = 2; // touch on edge, block +float SOLID_SLIDEBOX = 3; // touch on edge, but not an onground +float SOLID_BSP = 4; // bsp clip, touch on edge, block + +// range values +float RANGE_MELEE = 0; +float RANGE_NEAR = 1; +float RANGE_MID = 2; +float RANGE_FAR = 3; + +// deadflag values + +float DEAD_NO = 0; +float DEAD_DYING = 1; +float DEAD_DEAD = 2; +float DEAD_RESPAWNABLE = 3; + +// takedamage values + +float DAMAGE_NO = 0; +float DAMAGE_YES = 1; +float DAMAGE_AIM = 2; + +// items +float IT_AXE = 4096; +float IT_SHOTGUN = 1; +float IT_SUPER_SHOTGUN = 2; +float IT_NAILGUN = 4; +float IT_SUPER_NAILGUN = 8; +float IT_GRENADE_LAUNCHER = 16; +float IT_ROCKET_LAUNCHER = 32; +float IT_LIGHTNING = 64; +float IT_PORTAL_GUN = 128; + +float IT_SHELLS = 256; +float IT_NAILS = 512; +float IT_ROCKETS = 1024; +float IT_CELLS = 2048; + +float IT_ARMOR1 = 8192; +float IT_ARMOR2 = 16384; +float IT_ARMOR3 = 32768; +float IT_SUPERHEALTH = 65536; + +float IT_KEY1 = 131072; +float IT_KEY2 = 262144; + +float IT_INVISIBILITY = 524288; +float IT_INVULNERABILITY = 1048576; +float IT_SUIT = 2097152; +float IT_QUAD = 4194304; + +// point content values + +float CONTENT_EMPTY = -1; +float CONTENT_SOLID = -2; +float CONTENT_WATER = -3; +float CONTENT_SLIME = -4; +float CONTENT_LAVA = -5; +float CONTENT_SKY = -6; + +float STATE_TOP = 0; +float STATE_BOTTOM = 1; +float STATE_UP = 2; +float STATE_DOWN = 3; + +vector VEC_ORIGIN = '0 0 0'; +vector VEC_HULL_MIN = '-16 -16 -24'; +vector VEC_HULL_MAX = '16 16 32'; + +vector VEC_HULL2_MIN = '-32 -32 -24'; +vector VEC_HULL2_MAX = '32 32 64'; + +// protocol bytes +float SVC_TEMPENTITY = 23; +float SVC_KILLEDMONSTER = 27; +float SVC_FOUNDSECRET = 28; +float SVC_INTERMISSION = 30; +float SVC_FINALE = 31; +float SVC_CDTRACK = 32; +float SVC_SELLSCREEN = 33; + + +float TE_SPIKE = 0; +float TE_SUPERSPIKE = 1; +float TE_GUNSHOT = 2; +float TE_EXPLOSION = 3; +float TE_TAREXPLOSION = 4; +float TE_LIGHTNING1 = 5; +float TE_LIGHTNING2 = 6; +float TE_WIZSPIKE = 7; +float TE_KNIGHTSPIKE = 8; +float TE_LIGHTNING3 = 9; +float TE_LAVASPLASH = 10; +float TE_TELEPORT = 11; + +// sound channels +// channel 0 never willingly overrides +// other channels (1-7) allways override a playing sound on that channel +float CHAN_AUTO = 0; +float CHAN_WEAPON = 1; +float CHAN_VOICE = 2; +float CHAN_ITEM = 3; +float CHAN_BODY = 4; + +float ATTN_NONE = 0; +float ATTN_NORM = 1; +float ATTN_IDLE = 2; +float ATTN_STATIC = 3; + +// update types + +float UPDATE_GENERAL = 0; +float UPDATE_STATIC = 1; +float UPDATE_BINARY = 2; +float UPDATE_TEMP = 3; + +// entity effects + +float EF_BRIGHTFIELD = 1; +float EF_MUZZLEFLASH = 2; +float EF_BRIGHTLIGHT = 4; +float EF_DIMLIGHT = 8; + + +// messages +float MSG_BROADCAST = 0; // unreliable to all +float MSG_ONE = 1; // reliable to one (msg_entity) +float MSG_ALL = 2; // reliable to all +float MSG_INIT = 3; // write to the init string + +//================================================ + +// +// globals +// +float movedist; +float gameover; // set when a rule exits + +string string_null; // null string, nothing should be held here +float empty_float; + +entity newmis; // launch_spike sets this after spawning it + +entity activator; // the entity that activated a trigger or brush + +entity damage_attacker; // set by T_Damage +float framecount; + +float skill; + +//================================================ + +// +// world fields (FIXME: make globals) +// +.string wad; +.string map; +.float worldtype; // 0=medieval 1=metal 2=base + +//================================================ + +.string killtarget; + +// +// quakeed fields +// +.float light_lev; // not used by game, but parsed by light util +.float style; + + +// +// monster ai +// +.void() th_stand; +.void() th_walk; +.void() th_run; +.void() th_missile; +.void() th_melee; +.void(entity attacker, float damage) th_pain; +.void() th_die; + +.entity oldenemy; // mad at this player before taking damage + +.float speed; + +.float lefty; + +.float search_time; +.float attack_state; + +float AS_STRAIGHT = 1; +float AS_SLIDING = 2; +float AS_MELEE = 3; +float AS_MISSILE = 4; + +// +// player only fields +// +.float walkframe; + +.float attack_finished; +.float pain_finished; + +.float invincible_finished; +.float invisible_finished; +.float super_damage_finished; +.float radsuit_finished; + +.float invincible_time, invincible_sound; +.float invisible_time, invisible_sound; +.float super_time, super_sound; +.float rad_time; +.float fly_sound; + +.float axhitme; + +.float show_hostile; // set to time+0.2 whenever a client fires a + // weapon or takes damage. Used to alert + // monsters that otherwise would let the player go +.float jump_flag; // player jump flag +.float swim_flag; // player swimming sound flag +.float air_finished; // when time > air_finished, start drowning +.float bubble_count; // keeps track of the number of bubbles +.string deathtype; // keeps track of how the player died + +// +// object stuff +// +.string mdl; +.vector mangle; // angle at start + +.vector oldorigin; // only used by secret door + +.float t_length, t_width; + + +// +// doors, etc +// +.vector dest, dest1, dest2; +.float wait; // time from firing to restarting +.float delay; // time from activation to firing +.entity trigger_field; // door's trigger entity +.string noise4; + +// +// monsters +// +.float pausetime; +.entity movetarget; + + +// +// doors +// +.float aflag; +.float dmg; // damage done by door when hit + +// +// misc +// +.float cnt; // misc flag + +// +// subs +// +.void() think1; +.vector finaldest, finalangle; + +// +// triggers +// +.float count; // for counting triggers + + +// +// plats / doors / buttons +// +.float lip; +.float state; +.vector pos1, pos2; // top and bottom positions +.float height; + +// +// sounds +// +.float waitmin, waitmax; +.float distance; +.float volume; + + + + +//=========================================================================== + + +// +// builtin functions +// + +void(vector ang) makevectors = #1; // sets v_forward, etc globals +void(entity e, vector o) setorigin = #2; +void(entity e, string m) setmodel = #3; // set movetype and solid first +void(entity e, vector min, vector max) setsize = #4; +// #5 was removed +void() break = #6; +float() random = #7; // returns 0 - 1 +void(entity e, float chan, string samp, float vol, float atten) sound = #8; +vector(vector v) normalize = #9; +void(string e) error = #10; +void(string e) objerror = #11; +float(vector v) vlen = #12; +float(vector v) vectoyaw = #13; +entity() spawn = #14; + +void(entity e) remove = #15; + +// sets trace_* globals +// nomonsters can be: +// An entity will also be ignored for testing if forent == test, +// forent->owner == test, or test->owner == forent +// a forent of world is ignored +void(vector v1, vector v2, float nomonsters, entity forent) traceline = #16; + +entity() checkclient = #17; // returns a client to look for +entity(entity start, .string fld, string match) find = #18; +string(string s) precache_sound = #19; +string(string s) precache_model = #20; +void(entity client, string s)stuffcmd = #21; +entity(vector org, float rad) findradius = #22; +void(string s) bprint = #23; +void(entity client, string s) sprint = #24; +void(string s) dprint = #25; +string(float f) ftos = #26; +string(vector v) vtos = #27; +void() coredump = #28; // prints all edicts +void() traceon = #29; // turns statment trace on +void() traceoff = #30; +void(entity e) eprint = #31; // prints an entire edict +float(float yaw, float dist) walkmove = #32; // returns TRUE or FALSE +// #33 was removed +float() droptofloor= #34; // TRUE if landed on floor +void(float style, string value) lightstyle = #35; +float(float v) rint = #36; // round to nearest int +float(float v) floor = #37; // largest integer <= v +float(float v) ceil = #38; // smallest integer >= v +// #39 was removed +float(entity e) checkbottom = #40; // true if self is on ground +float(vector v) pointcontents = #41; // returns a CONTENT_* +// #42 was removed +float(float f) fabs = #43; +vector(entity e, float speed) aim = #44; // returns the shooting vector +float(string s) cvar = #45; // return cvar.value +void(string s) localcmd = #46; // put string into local que +entity(entity e) nextent = #47; // for looping through all ents +void(vector o, vector d, float color, float count) particle = #48;// start a particle effect +void() ChangeYaw = #49; // turn towards self.ideal_yaw + // at self.yaw_speed +// #50 was removed +vector(vector v) vectoangles = #51; + +// +// direct client message generation +// +void(float to, float f) WriteByte = #52; +void(float to, float f) WriteChar = #53; +void(float to, float f) WriteShort = #54; +void(float to, float f) WriteLong = #55; +void(float to, float f) WriteCoord = #56; +void(float to, float f) WriteAngle = #57; +void(float to, string s) WriteString = #58; +void(float to, entity s) WriteEntity = #59; + +// +// broadcast client message generation +// + +// void(float f) bWriteByte = #59; +// void(float f) bWriteChar = #60; +// void(float f) bWriteShort = #61; +// void(float f) bWriteLong = #62; +// void(float f) bWriteCoord = #63; +// void(float f) bWriteAngle = #64; +// void(string s) bWriteString = #65; +// void(entity e) bWriteEntity = #66; + +void(float step) movetogoal = #67; + +string(string s) precache_file = #68; // no effect except for -copy +void(entity e) makestatic = #69; +void(string s) changelevel = #70; + +//#71 was removed + +void(string var, string val) cvar_set = #72; // sets cvar.value + +void(entity client, string s) centerprint = #73; // sprint, but in middle + +void(vector pos, string samp, float vol, float atten) ambientsound = #74; + +string(string s) precache_model2 = #75; // registered version only +string(string s) precache_sound2 = #76; // registered version only +string(string s) precache_file2 = #77; // registered version only + +void(entity e) setspawnparms = #78; // set parm1... to the + // values at level start + // for coop respawn + +//============================================================================ + +// +// subs.qc +// +void(vector tdest, float tspeed, void() func) SUB_CalcMove; +void(entity ent, vector tdest, float tspeed, void() func) SUB_CalcMoveEnt; +void(vector destangle, float tspeed, void() func) SUB_CalcAngleMove; +void() SUB_CalcMoveDone; +void() SUB_CalcAngleMoveDone; +void() SUB_Null; +void() SUB_UseTargets; +void() SUB_Remove; + +// +// combat.qc +// +void(entity targ, entity inflictor, entity attacker, float damage) T_Damage; + + +float (entity e, float healamount, float ignore) T_Heal; // health function + +float(entity targ, entity inflictor) CanDamage; + +.vector oldvel; + +.float nextone; +.entity launcher; diff --git a/src/demon.qc b/src/demon.qc new file mode 100644 index 0000000..e4deea0 --- /dev/null +++ b/src/demon.qc @@ -0,0 +1,363 @@ +/* +============================================================================== + +DEMON + +============================================================================== +*/ + +$cd id1/models/demon3 +$scale 0.8 +$origin 0 0 24 +$base base +$skin base + +$frame stand1 stand2 stand3 stand4 stand5 stand6 stand7 stand8 stand9 +$frame stand10 stand11 stand12 stand13 + +$frame walk1 walk2 walk3 walk4 walk5 walk6 walk7 walk8 + +$frame run1 run2 run3 run4 run5 run6 + +$frame leap1 leap2 leap3 leap4 leap5 leap6 leap7 leap8 leap9 leap10 +$frame leap11 leap12 + +$frame pain1 pain2 pain3 pain4 pain5 pain6 + +$frame death1 death2 death3 death4 death5 death6 death7 death8 death9 + +$frame attacka1 attacka2 attacka3 attacka4 attacka5 attacka6 attacka7 attacka8 +$frame attacka9 attacka10 attacka11 attacka12 attacka13 attacka14 attacka15 + +//============================================================================ + +void() Demon_JumpTouch; + +void() demon1_stand1 =[ $stand1, demon1_stand2 ] {ai_stand();}; +void() demon1_stand2 =[ $stand2, demon1_stand3 ] {ai_stand();}; +void() demon1_stand3 =[ $stand3, demon1_stand4 ] {ai_stand();}; +void() demon1_stand4 =[ $stand4, demon1_stand5 ] {ai_stand();}; +void() demon1_stand5 =[ $stand5, demon1_stand6 ] {ai_stand();}; +void() demon1_stand6 =[ $stand6, demon1_stand7 ] {ai_stand();}; +void() demon1_stand7 =[ $stand7, demon1_stand8 ] {ai_stand();}; +void() demon1_stand8 =[ $stand8, demon1_stand9 ] {ai_stand();}; +void() demon1_stand9 =[ $stand9, demon1_stand10 ] {ai_stand();}; +void() demon1_stand10 =[ $stand10, demon1_stand11 ] {ai_stand();}; +void() demon1_stand11 =[ $stand11, demon1_stand12 ] {ai_stand();}; +void() demon1_stand12 =[ $stand12, demon1_stand13 ] {ai_stand();}; +void() demon1_stand13 =[ $stand13, demon1_stand1 ] {ai_stand();}; + +void() demon1_walk1 =[ $walk1, demon1_walk2 ] { +if (random() < 0.2) + sound (self, CHAN_VOICE, "demon/idle1.wav", 1, ATTN_IDLE); +ai_walk(8); +}; +void() demon1_walk2 =[ $walk2, demon1_walk3 ] {ai_walk(6);}; +void() demon1_walk3 =[ $walk3, demon1_walk4 ] {ai_walk(6);}; +void() demon1_walk4 =[ $walk4, demon1_walk5 ] {ai_walk(7);}; +void() demon1_walk5 =[ $walk5, demon1_walk6 ] {ai_walk(4);}; +void() demon1_walk6 =[ $walk6, demon1_walk7 ] {ai_walk(6);}; +void() demon1_walk7 =[ $walk7, demon1_walk8 ] {ai_walk(10);}; +void() demon1_walk8 =[ $walk8, demon1_walk1 ] {ai_walk(10);}; + +void() demon1_run1 =[ $run1, demon1_run2 ] { +if (random() < 0.2) + sound (self, CHAN_VOICE, "demon/idle1.wav", 1, ATTN_IDLE); +ai_run(20);}; +void() demon1_run2 =[ $run2, demon1_run3 ] {ai_run(15);}; +void() demon1_run3 =[ $run3, demon1_run4 ] {ai_run(36);}; +void() demon1_run4 =[ $run4, demon1_run5 ] {ai_run(20);}; +void() demon1_run5 =[ $run5, demon1_run6 ] {ai_run(15);}; +void() demon1_run6 =[ $run6, demon1_run1 ] {ai_run(36);}; + +void() demon1_jump1 =[ $leap1, demon1_jump2 ] {ai_face();}; +void() demon1_jump2 =[ $leap2, demon1_jump3 ] {ai_face();}; +void() demon1_jump3 =[ $leap3, demon1_jump4 ] {ai_face();}; +void() demon1_jump4 =[ $leap4, demon1_jump5 ] +{ + ai_face(); + + self.touch = Demon_JumpTouch; + makevectors (self.angles); + self.origin_z = self.origin_z + 1; + self.velocity = v_forward * 600 + '0 0 250'; + if (self.flags & FL_ONGROUND) + self.flags = self.flags - FL_ONGROUND; +}; +void() demon1_jump5 =[ $leap5, demon1_jump6 ] {}; +void() demon1_jump6 =[ $leap6, demon1_jump7 ] {}; +void() demon1_jump7 =[ $leap7, demon1_jump8 ] {}; +void() demon1_jump8 =[ $leap8, demon1_jump9 ] {}; +void() demon1_jump9 =[ $leap9, demon1_jump10 ] {}; +void() demon1_jump10 =[ $leap10, demon1_jump1 ] { +self.nextthink = time + 3; +// if three seconds pass, assume demon is stuck and jump again +}; + +void() demon1_jump11 =[ $leap11, demon1_jump12 ] {}; +void() demon1_jump12 =[ $leap12, demon1_run1 ] {}; + + +void() demon1_atta1 =[ $attacka1, demon1_atta2 ] {ai_charge(4);}; +void() demon1_atta2 =[ $attacka2, demon1_atta3 ] {ai_charge(0);}; +void() demon1_atta3 =[ $attacka3, demon1_atta4 ] {ai_charge(0);}; +void() demon1_atta4 =[ $attacka4, demon1_atta5 ] {ai_charge(1);}; +void() demon1_atta5 =[ $attacka5, demon1_atta6 ] {ai_charge(2); Demon_Melee(200);}; +void() demon1_atta6 =[ $attacka6, demon1_atta7 ] {ai_charge(1);}; +void() demon1_atta7 =[ $attacka7, demon1_atta8 ] {ai_charge(6);}; +void() demon1_atta8 =[ $attacka8, demon1_atta9 ] {ai_charge(8);}; +void() demon1_atta9 =[ $attacka9, demon1_atta10] {ai_charge(4);}; +void() demon1_atta10 =[ $attacka10, demon1_atta11] {ai_charge(2);}; +void() demon1_atta11 =[ $attacka11, demon1_atta12] {Demon_Melee(-200);}; +void() demon1_atta12 =[ $attacka12, demon1_atta13] {ai_charge(5);}; +void() demon1_atta13 =[ $attacka13, demon1_atta14] {ai_charge(8);}; +void() demon1_atta14 =[ $attacka14, demon1_atta15] {ai_charge(4);}; +void() demon1_atta15 =[ $attacka15, demon1_run1] {ai_charge(4);}; + +void() demon1_pain1 =[ $pain1, demon1_pain2 ] {}; +void() demon1_pain2 =[ $pain2, demon1_pain3 ] {}; +void() demon1_pain3 =[ $pain3, demon1_pain4 ] {}; +void() demon1_pain4 =[ $pain4, demon1_pain5 ] {}; +void() demon1_pain5 =[ $pain5, demon1_pain6 ] {}; +void() demon1_pain6 =[ $pain6, demon1_run1 ] {}; + +void(entity attacker, float damage) demon1_pain = +{ + if (self.touch == Demon_JumpTouch) + return; + + if (self.pain_finished > time) + return; + + self.pain_finished = time + 1; + sound (self, CHAN_VOICE, "demon/dpain1.wav", 1, ATTN_NORM); + + if (random()*200 > damage) + return; // didn't flinch + + demon1_pain1 (); +}; + +void() demon1_die1 =[ $death1, demon1_die2 ] { +sound (self, CHAN_VOICE, "demon/ddeath.wav", 1, ATTN_NORM);}; +void() demon1_die2 =[ $death2, demon1_die3 ] {}; +void() demon1_die3 =[ $death3, demon1_die4 ] {}; +void() demon1_die4 =[ $death4, demon1_die5 ] {}; +void() demon1_die5 =[ $death5, demon1_die6 ] {}; +void() demon1_die6 =[ $death6, demon1_die7 ] +{self.solid = SOLID_NOT;}; +void() demon1_die7 =[ $death7, demon1_die8 ] {}; +void() demon1_die8 =[ $death8, demon1_die9 ] {}; +void() demon1_die9 =[ $death9, demon1_die9 ] {}; + +void() demon_die = +{ +// check for gib + if (self.health < -80) + { + sound (self, CHAN_VOICE, "player/udeath.wav", 1, ATTN_NORM); + ThrowHead ("progs/h_demon.mdl", self.health); + ThrowGib ("progs/gib1.mdl", self.health); + ThrowGib ("progs/gib1.mdl", self.health); + ThrowGib ("progs/gib1.mdl", self.health); + return; + } + +// regular death + demon1_die1 (); +}; + + +void() Demon_MeleeAttack = +{ + demon1_atta1 (); +}; + + +/*QUAKED monster_demon1 (1 0 0) (-32 -32 -24) (32 32 64) Ambush + +*/ +void() monster_demon1 = +{ + if (deathmatch) + { + remove(self); + return; + } + precache_model ("progs/demon.mdl"); + precache_model ("progs/h_demon.mdl"); + + precache_sound ("demon/ddeath.wav"); + precache_sound ("demon/dhit2.wav"); + precache_sound ("demon/djump.wav"); + precache_sound ("demon/dpain1.wav"); + precache_sound ("demon/idle1.wav"); + precache_sound ("demon/sight2.wav"); + + self.solid = SOLID_SLIDEBOX; + self.movetype = MOVETYPE_STEP; + + setmodel (self, "progs/demon.mdl"); + + setsize (self, VEC_HULL2_MIN, VEC_HULL2_MAX); + self.health = 300; + + self.th_stand = demon1_stand1; + self.th_walk = demon1_walk1; + self.th_run = demon1_run1; + self.th_die = demon_die; + self.th_melee = Demon_MeleeAttack; // one of two attacks + self.th_missile = demon1_jump1; // jump attack + self.th_pain = demon1_pain; + + walkmonster_start(); +}; + + +/* +============================================================================== + +DEMON + +============================================================================== +*/ + +/* +============== +CheckDemonMelee + +Returns TRUE if a melee attack would hit right now +============== +*/ +float() CheckDemonMelee = +{ + if (enemy_range == RANGE_MELEE) + { // FIXME: check canreach + self.attack_state = AS_MELEE; + return TRUE; + } + return FALSE; +}; + +/* +============== +CheckDemonJump + +============== +*/ +float() CheckDemonJump = +{ + local vector dist; + local float d; + + if (self.origin_z + self.mins_z > self.enemy.origin_z + self.enemy.mins_z + + 0.75 * self.enemy.size_z) + return FALSE; + + if (self.origin_z + self.maxs_z < self.enemy.origin_z + self.enemy.mins_z + + 0.25 * self.enemy.size_z) + return FALSE; + + dist = self.enemy.origin - self.origin; + dist_z = 0; + + d = vlen(dist); + + if (d < 100) + return FALSE; + + if (d > 200) + { + if (random() < 0.9) + return FALSE; + } + + return TRUE; +}; + +float() DemonCheckAttack = +{ + local vector vec; + +// if close enough for slashing, go for it + if (CheckDemonMelee ()) + { + self.attack_state = AS_MELEE; + return TRUE; + } + + if (CheckDemonJump ()) + { + self.attack_state = AS_MISSILE; + sound (self, CHAN_VOICE, "demon/djump.wav", 1, ATTN_NORM); + return TRUE; + } + + return FALSE; +}; + + +//=========================================================================== + +void(float side) Demon_Melee = +{ + local float ldmg; + local vector delta; + + ai_face (); + walkmove (self.ideal_yaw, 12); // allow a little closing + + delta = self.enemy.origin - self.origin; + + if (vlen(delta) > 100) + return; + if (!CanDamage (self.enemy, self)) + return; + + sound (self, CHAN_WEAPON, "demon/dhit2.wav", 1, ATTN_NORM); + ldmg = 10 + 5*random(); + T_Damage (self.enemy, self, self, ldmg); + + makevectors (self.angles); + SpawnMeatSpray (self.origin + v_forward*16, side * v_right); +}; + + +void() Demon_JumpTouch = +{ + local float ldmg; + + if (self.health <= 0) + return; + + if (other.takedamage) + { + if ( vlen(self.velocity) > 400 ) + { + ldmg = 40 + 10*random(); + T_Damage (other, self, self, ldmg); + } + } + + if (!checkbottom(self)) + { + if (self.flags & FL_ONGROUND) + { // jump randomly to not get hung up +//dprint ("popjump\n"); + self.touch = SUB_Null; + self.think = demon1_jump1; + self.nextthink = time + 0.1; + +// self.velocity_x = (random() - 0.5) * 600; +// self.velocity_y = (random() - 0.5) * 600; +// self.velocity_z = 200; +// self.flags = self.flags - FL_ONGROUND; + } + return; // not on ground yet + } + + self.touch = SUB_Null; + self.think = demon1_jump11; + self.nextthink = time + 0.1; +}; + diff --git a/src/dog.qc b/src/dog.qc new file mode 100644 index 0000000..bc46fe0 --- /dev/null +++ b/src/dog.qc @@ -0,0 +1,363 @@ +/* +============================================================================== + +DOG + +============================================================================== +*/ +$cd id1/models/dog +$origin 0 0 24 +$base base +$skin skin + +$frame attack1 attack2 attack3 attack4 attack5 attack6 attack7 attack8 + +$frame death1 death2 death3 death4 death5 death6 death7 death8 death9 + +$frame deathb1 deathb2 deathb3 deathb4 deathb5 deathb6 deathb7 deathb8 +$frame deathb9 + +$frame pain1 pain2 pain3 pain4 pain5 pain6 + +$frame painb1 painb2 painb3 painb4 painb5 painb6 painb7 painb8 painb9 painb10 +$frame painb11 painb12 painb13 painb14 painb15 painb16 + +$frame run1 run2 run3 run4 run5 run6 run7 run8 run9 run10 run11 run12 + +$frame leap1 leap2 leap3 leap4 leap5 leap6 leap7 leap8 leap9 + +$frame stand1 stand2 stand3 stand4 stand5 stand6 stand7 stand8 stand9 + +$frame walk1 walk2 walk3 walk4 walk5 walk6 walk7 walk8 + + +void() dog_leap1; +void() dog_run1; + +/* +================ +dog_bite + +================ +*/ +void() dog_bite = +{ +local vector delta; +local float ldmg; + + if (!self.enemy) + return; + + ai_charge(10); + + if (!CanDamage (self.enemy, self)) + return; + + delta = self.enemy.origin - self.origin; + + if (vlen(delta) > 100) + return; + + ldmg = (random() + random() + random()) * 8; + T_Damage (self.enemy, self, self, ldmg); +}; + +void() Dog_JumpTouch = +{ + local float ldmg; + + if (self.health <= 0) + return; + + if (other.takedamage) + { + if ( vlen(self.velocity) > 300 ) + { + ldmg = 10 + 10*random(); + T_Damage (other, self, self, ldmg); + } + } + + if (!checkbottom(self)) + { + if (self.flags & FL_ONGROUND) + { // jump randomly to not get hung up +//dprint ("popjump\n"); + self.touch = SUB_Null; + self.think = dog_leap1; + self.nextthink = time + 0.1; + +// self.velocity_x = (random() - 0.5) * 600; +// self.velocity_y = (random() - 0.5) * 600; +// self.velocity_z = 200; +// self.flags = self.flags - FL_ONGROUND; + } + return; // not on ground yet + } + + self.touch = SUB_Null; + self.think = dog_run1; + self.nextthink = time + 0.1; +}; + + +void() dog_stand1 =[ $stand1, dog_stand2 ] {ai_stand();}; +void() dog_stand2 =[ $stand2, dog_stand3 ] {ai_stand();}; +void() dog_stand3 =[ $stand3, dog_stand4 ] {ai_stand();}; +void() dog_stand4 =[ $stand4, dog_stand5 ] {ai_stand();}; +void() dog_stand5 =[ $stand5, dog_stand6 ] {ai_stand();}; +void() dog_stand6 =[ $stand6, dog_stand7 ] {ai_stand();}; +void() dog_stand7 =[ $stand7, dog_stand8 ] {ai_stand();}; +void() dog_stand8 =[ $stand8, dog_stand9 ] {ai_stand();}; +void() dog_stand9 =[ $stand9, dog_stand1 ] {ai_stand();}; + +void() dog_walk1 =[ $walk1 , dog_walk2 ] { +if (random() < 0.2) + sound (self, CHAN_VOICE, "dog/idle.wav", 1, ATTN_IDLE); +ai_walk(8);}; +void() dog_walk2 =[ $walk2 , dog_walk3 ] {ai_walk(8);}; +void() dog_walk3 =[ $walk3 , dog_walk4 ] {ai_walk(8);}; +void() dog_walk4 =[ $walk4 , dog_walk5 ] {ai_walk(8);}; +void() dog_walk5 =[ $walk5 , dog_walk6 ] {ai_walk(8);}; +void() dog_walk6 =[ $walk6 , dog_walk7 ] {ai_walk(8);}; +void() dog_walk7 =[ $walk7 , dog_walk8 ] {ai_walk(8);}; +void() dog_walk8 =[ $walk8 , dog_walk1 ] {ai_walk(8);}; + +void() dog_run1 =[ $run1 , dog_run2 ] { +if (random() < 0.2) + sound (self, CHAN_VOICE, "dog/idle.wav", 1, ATTN_IDLE); +ai_run(16);}; +void() dog_run2 =[ $run2 , dog_run3 ] {ai_run(32);}; +void() dog_run3 =[ $run3 , dog_run4 ] {ai_run(32);}; +void() dog_run4 =[ $run4 , dog_run5 ] {ai_run(20);}; +void() dog_run5 =[ $run5 , dog_run6 ] {ai_run(64);}; +void() dog_run6 =[ $run6 , dog_run7 ] {ai_run(32);}; +void() dog_run7 =[ $run7 , dog_run8 ] {ai_run(16);}; +void() dog_run8 =[ $run8 , dog_run9 ] {ai_run(32);}; +void() dog_run9 =[ $run9 , dog_run10 ] {ai_run(32);}; +void() dog_run10 =[ $run10 , dog_run11 ] {ai_run(20);}; +void() dog_run11 =[ $run11 , dog_run12 ] {ai_run(64);}; +void() dog_run12 =[ $run12 , dog_run1 ] {ai_run(32);}; + +void() dog_atta1 =[ $attack1, dog_atta2 ] {ai_charge(10);}; +void() dog_atta2 =[ $attack2, dog_atta3 ] {ai_charge(10);}; +void() dog_atta3 =[ $attack3, dog_atta4 ] {ai_charge(10);}; +void() dog_atta4 =[ $attack4, dog_atta5 ] { +sound (self, CHAN_VOICE, "dog/dattack1.wav", 1, ATTN_NORM); +dog_bite();}; +void() dog_atta5 =[ $attack5, dog_atta6 ] {ai_charge(10);}; +void() dog_atta6 =[ $attack6, dog_atta7 ] {ai_charge(10);}; +void() dog_atta7 =[ $attack7, dog_atta8 ] {ai_charge(10);}; +void() dog_atta8 =[ $attack8, dog_run1 ] {ai_charge(10);}; + +void() dog_leap1 =[ $leap1, dog_leap2 ] {ai_face();}; +void() dog_leap2 =[ $leap2, dog_leap3 ] +{ + ai_face(); + + self.touch = Dog_JumpTouch; + makevectors (self.angles); + self.origin_z = self.origin_z + 1; + self.velocity = v_forward * 300 + '0 0 200'; + if (self.flags & FL_ONGROUND) + self.flags = self.flags - FL_ONGROUND; +}; + +void() dog_leap3 =[ $leap3, dog_leap4 ] {}; +void() dog_leap4 =[ $leap4, dog_leap5 ] {}; +void() dog_leap5 =[ $leap5, dog_leap6 ] {}; +void() dog_leap6 =[ $leap6, dog_leap7 ] {}; +void() dog_leap7 =[ $leap7, dog_leap8 ] {}; +void() dog_leap8 =[ $leap8, dog_leap9 ] {}; +void() dog_leap9 =[ $leap9, dog_leap9 ] {}; + +void() dog_pain1 =[ $pain1 , dog_pain2 ] {}; +void() dog_pain2 =[ $pain2 , dog_pain3 ] {}; +void() dog_pain3 =[ $pain3 , dog_pain4 ] {}; +void() dog_pain4 =[ $pain4 , dog_pain5 ] {}; +void() dog_pain5 =[ $pain5 , dog_pain6 ] {}; +void() dog_pain6 =[ $pain6 , dog_run1 ] {}; + +void() dog_painb1 =[ $painb1 , dog_painb2 ] {}; +void() dog_painb2 =[ $painb2 , dog_painb3 ] {}; +void() dog_painb3 =[ $painb3 , dog_painb4 ] {ai_pain(4);}; +void() dog_painb4 =[ $painb4 , dog_painb5 ] {ai_pain(12);}; +void() dog_painb5 =[ $painb5 , dog_painb6 ] {ai_pain(12);}; +void() dog_painb6 =[ $painb6 , dog_painb7 ] {ai_pain(2);}; +void() dog_painb7 =[ $painb7 , dog_painb8 ] {}; +void() dog_painb8 =[ $painb8 , dog_painb9 ] {ai_pain(4);}; +void() dog_painb9 =[ $painb9 , dog_painb10 ] {}; +void() dog_painb10 =[ $painb10 , dog_painb11 ] {ai_pain(10);}; +void() dog_painb11 =[ $painb11 , dog_painb12 ] {}; +void() dog_painb12 =[ $painb12 , dog_painb13 ] {}; +void() dog_painb13 =[ $painb13 , dog_painb14 ] {}; +void() dog_painb14 =[ $painb14 , dog_painb15 ] {}; +void() dog_painb15 =[ $painb15 , dog_painb16 ] {}; +void() dog_painb16 =[ $painb16 , dog_run1 ] {}; + +void() dog_pain = +{ + sound (self, CHAN_VOICE, "dog/dpain1.wav", 1, ATTN_NORM); + + if (random() > 0.5) + dog_pain1 (); + else + dog_painb1 (); +}; + +void() dog_die1 =[ $death1, dog_die2 ] {}; +void() dog_die2 =[ $death2, dog_die3 ] {}; +void() dog_die3 =[ $death3, dog_die4 ] {}; +void() dog_die4 =[ $death4, dog_die5 ] {}; +void() dog_die5 =[ $death5, dog_die6 ] {}; +void() dog_die6 =[ $death6, dog_die7 ] {}; +void() dog_die7 =[ $death7, dog_die8 ] {}; +void() dog_die8 =[ $death8, dog_die9 ] {}; +void() dog_die9 =[ $death9, dog_die9 ] {}; + +void() dog_dieb1 =[ $deathb1, dog_dieb2 ] {}; +void() dog_dieb2 =[ $deathb2, dog_dieb3 ] {}; +void() dog_dieb3 =[ $deathb3, dog_dieb4 ] {}; +void() dog_dieb4 =[ $deathb4, dog_dieb5 ] {}; +void() dog_dieb5 =[ $deathb5, dog_dieb6 ] {}; +void() dog_dieb6 =[ $deathb6, dog_dieb7 ] {}; +void() dog_dieb7 =[ $deathb7, dog_dieb8 ] {}; +void() dog_dieb8 =[ $deathb8, dog_dieb9 ] {}; +void() dog_dieb9 =[ $deathb9, dog_dieb9 ] {}; + + +void() dog_die = +{ +// check for gib + if (self.health < -35) + { + sound (self, CHAN_VOICE, "player/udeath.wav", 1, ATTN_NORM); + ThrowGib ("progs/gib3.mdl", self.health); + ThrowGib ("progs/gib3.mdl", self.health); + ThrowGib ("progs/gib3.mdl", self.health); + ThrowHead ("progs/h_dog.mdl", self.health); + return; + } + +// regular death + sound (self, CHAN_VOICE, "dog/ddeath.wav", 1, ATTN_NORM); + self.solid = SOLID_NOT; + + if (random() > 0.5) + dog_die1 (); + else + dog_dieb1 (); +}; + +//============================================================================ + +/* +============== +CheckDogMelee + +Returns TRUE if a melee attack would hit right now +============== +*/ +float() CheckDogMelee = +{ + if (enemy_range == RANGE_MELEE) + { // FIXME: check canreach + self.attack_state = AS_MELEE; + return TRUE; + } + return FALSE; +}; + +/* +============== +CheckDogJump + +============== +*/ +float() CheckDogJump = +{ + local vector dist; + local float d; + + if (self.origin_z + self.mins_z > self.enemy.origin_z + self.enemy.mins_z + + 0.75 * self.enemy.size_z) + return FALSE; + + if (self.origin_z + self.maxs_z < self.enemy.origin_z + self.enemy.mins_z + + 0.25 * self.enemy.size_z) + return FALSE; + + dist = self.enemy.origin - self.origin; + dist_z = 0; + + d = vlen(dist); + + if (d < 80) + return FALSE; + + if (d > 150) + return FALSE; + + return TRUE; +}; + +float() DogCheckAttack = +{ + local vector vec; + +// if close enough for slashing, go for it + if (CheckDogMelee ()) + { + self.attack_state = AS_MELEE; + return TRUE; + } + + if (CheckDogJump ()) + { + self.attack_state = AS_MISSILE; + return TRUE; + } + + return FALSE; +}; + + +//=========================================================================== + +/*QUAKED monster_dog (1 0 0) (-32 -32 -24) (32 32 40) Ambush + +*/ +void() monster_dog = +{ + if (deathmatch) + { + remove(self); + return; + } + precache_model ("progs/h_dog.mdl"); + precache_model ("progs/dog.mdl"); + + precache_sound ("dog/dattack1.wav"); + precache_sound ("dog/ddeath.wav"); + precache_sound ("dog/dpain1.wav"); + precache_sound ("dog/dsight.wav"); + precache_sound ("dog/idle.wav"); + + self.solid = SOLID_SLIDEBOX; + self.movetype = MOVETYPE_STEP; + + setmodel (self, "progs/dog.mdl"); + + setsize (self, '-32 -32 -24', '32 32 40'); + self.health = 25; + + self.th_stand = dog_stand1; + self.th_walk = dog_walk1; + self.th_run = dog_run1; + self.th_pain = dog_pain; + self.th_die = dog_die; + self.th_melee = dog_atta1; + self.th_missile = dog_leap1; + + walkmonster_start(); +}; diff --git a/src/doors.qc b/src/doors.qc new file mode 100644 index 0000000..8757ddf --- /dev/null +++ b/src/doors.qc @@ -0,0 +1,779 @@ + +float DOOR_START_OPEN = 1; +float DOOR_DONT_LINK = 4; +float DOOR_GOLD_KEY = 8; +float DOOR_SILVER_KEY = 16; +float DOOR_TOGGLE = 32; + +/* + +Doors are similar to buttons, but can spawn a fat trigger field around them +to open without a touch, and they link together to form simultanious +double/quad doors. + +Door.owner is the master door. If there is only one door, it points to itself. +If multiple doors, all will point to a single one. + +Door.enemy chains from the master door through all doors linked in the chain. + +*/ + +/* +============================================================================= + +THINK FUNCTIONS + +============================================================================= +*/ + +void() door_go_down; +void() door_go_up; + +void() door_blocked = +{ + T_Damage (other, self, self, self.dmg); + +// if a door has a negative wait, it would never come back if blocked, +// so let it just squash the object to death real fast + if (self.wait >= 0) + { + if (self.state == STATE_DOWN) + door_go_up (); + else + door_go_down (); + } +}; + + +void() door_hit_top = +{ + sound (self, CHAN_VOICE, self.noise1, 1, ATTN_NORM); + self.state = STATE_TOP; + if (self.spawnflags & DOOR_TOGGLE) + return; // don't come down automatically + self.think = door_go_down; + self.nextthink = self.ltime + self.wait; +}; + +void() door_hit_bottom = +{ + sound (self, CHAN_VOICE, self.noise1, 1, ATTN_NORM); + self.state = STATE_BOTTOM; +}; + +void() door_go_down = +{ + sound (self, CHAN_VOICE, self.noise2, 1, ATTN_NORM); + if (self.max_health) + { + self.takedamage = DAMAGE_YES; + self.health = self.max_health; + } + + self.state = STATE_DOWN; + SUB_CalcMove (self.pos1, self.speed, door_hit_bottom); +}; + +void() door_go_up = +{ + if (self.state == STATE_UP) + return; // allready going up + + if (self.state == STATE_TOP) + { // reset top wait time + self.nextthink = self.ltime + self.wait; + return; + } + + sound (self, CHAN_VOICE, self.noise2, 1, ATTN_NORM); + self.state = STATE_UP; + SUB_CalcMove (self.pos2, self.speed, door_hit_top); + + SUB_UseTargets(); +}; + + +/* +============================================================================= + +ACTIVATION FUNCTIONS + +============================================================================= +*/ + +void() door_fire = +{ + local entity oself; + local entity starte; + + if (self.owner != self) + objerror ("door_fire: self.owner != self"); + +// play use key sound + + if (self.items) +// sound (self, CHAN_VOICE, self.noise4, 1, ATTN_NORM); + sound (self, CHAN_ITEM, self.noise4, 1, ATTN_NORM); + + self.message = string_null; // no more message + oself = self; + + if (self.spawnflags & DOOR_TOGGLE) + { + if (self.state == STATE_UP || self.state == STATE_TOP) + { + starte = self; + do + { + door_go_down (); + self = self.enemy; + } while ( (self != starte) && (self != world) ); + self = oself; + return; + } + } + +// trigger all paired doors + starte = self; + do + { + door_go_up (); + self = self.enemy; + } while ( (self != starte) && (self != world) ); + self = oself; +}; + + +void() door_use = +{ + local entity oself; + + self.message = ""; // door message are for touch only + self.owner.message = ""; + self.enemy.message = ""; + oself = self; + self = self.owner; + door_fire (); + self = oself; +}; + + +void() door_trigger_touch = +{ + if (other.health <= 0) + return; + + if (time < self.attack_finished) + return; + self.attack_finished = time + 1; + + activator = other; + + self = self.owner; + door_use (); +}; + + +void() door_killed = +{ + local entity oself; + + oself = self; + self = self.owner; + self.health = self.max_health; + self.takedamage = DAMAGE_NO; // wil be reset upon return + door_use (); + self = oself; +}; + + +/* +================ +door_touch + +Prints messages and opens key doors +================ +*/ +void() door_touch = +{ + if (other.classname != "player") + return; + if (self.owner.attack_finished > time) + return; + + self.owner.attack_finished = time + 2; + + if (self.owner.message != "") + { + centerprint (other, self.owner.message); + sound (other, CHAN_VOICE, "misc/talk.wav", 1, ATTN_NORM); + } + +// key door stuff + if (!self.items) + return; + +// FIXME: blink key on player's status bar + if ( (self.items & other.items) != self.items ) + { + if (self.owner.items == IT_KEY1) + { + if (world.worldtype == 2) + { + centerprint (other, "You need the silver keycard"); + sound (self, CHAN_VOICE, self.noise3, 1, ATTN_NORM); + } + else if (world.worldtype == 1) + { + centerprint (other, "You need the silver runekey"); + sound (self, CHAN_VOICE, self.noise3, 1, ATTN_NORM); + } + else if (world.worldtype == 0) + { + centerprint (other, "You need the silver key"); + sound (self, CHAN_VOICE, self.noise3, 1, ATTN_NORM); + } + } + else + { + if (world.worldtype == 2) + { + centerprint (other, "You need the gold keycard"); + sound (self, CHAN_VOICE, self.noise3, 1, ATTN_NORM); + } + else if (world.worldtype == 1) + { + centerprint (other, "You need the gold runekey"); + sound (self, CHAN_VOICE, self.noise3, 1, ATTN_NORM); + } + else if (world.worldtype == 0) + { + centerprint (other, "You need the gold key"); + sound (self, CHAN_VOICE, self.noise3, 1, ATTN_NORM); + } + } + return; + } + + other.items = other.items - self.items; + self.touch = SUB_Null; + if (self.enemy) + self.enemy.touch = SUB_Null; // get paired door + door_use (); +}; + +/* +============================================================================= + +SPAWNING FUNCTIONS + +============================================================================= +*/ + + +entity(vector fmins, vector fmaxs) spawn_field = +{ + local entity trigger; + local vector t1, t2; + + trigger = spawn(); + trigger.movetype = MOVETYPE_NONE; + trigger.solid = SOLID_TRIGGER; + trigger.owner = self; + trigger.touch = door_trigger_touch; + + t1 = fmins; + t2 = fmaxs; + setsize (trigger, t1 - '60 60 8', t2 + '60 60 8'); + return (trigger); +}; + + +float (entity e1, entity e2) EntitiesTouching = +{ + if (e1.mins_x > e2.maxs_x) + return FALSE; + if (e1.mins_y > e2.maxs_y) + return FALSE; + if (e1.mins_z > e2.maxs_z) + return FALSE; + if (e1.maxs_x < e2.mins_x) + return FALSE; + if (e1.maxs_y < e2.mins_y) + return FALSE; + if (e1.maxs_z < e2.mins_z) + return FALSE; + return TRUE; +}; + + +/* +============= +LinkDoors + + +============= +*/ +void() LinkDoors = +{ + local entity t, starte; + local vector cmins, cmaxs; + + if (self.enemy) + return; // already linked by another door + if (self.spawnflags & 4) + { + self.owner = self.enemy = self; + return; // don't want to link this door + } + + cmins = self.mins; + cmaxs = self.maxs; + + starte = self; + t = self; + + do + { + self.owner = starte; // master door + + if (self.health) + starte.health = self.health; + if (self.targetname) + starte.targetname = self.targetname; + if (self.message != "") + starte.message = self.message; + + t = find (t, classname, self.classname); + if (!t) + { + self.enemy = starte; // make the chain a loop + + // shootable, fired, or key doors just needed the owner/enemy links, + // they don't spawn a field + + self = self.owner; + + if (self.health) + return; + if (self.targetname) + return; + if (self.items) + return; + + self.owner.trigger_field = spawn_field(cmins, cmaxs); + + return; + } + + if (EntitiesTouching(self,t)) + { + if (t.enemy) + objerror ("cross connected doors"); + + self.enemy = t; + self = t; + + if (t.mins_x < cmins_x) + cmins_x = t.mins_x; + if (t.mins_y < cmins_y) + cmins_y = t.mins_y; + if (t.mins_z < cmins_z) + cmins_z = t.mins_z; + if (t.maxs_x > cmaxs_x) + cmaxs_x = t.maxs_x; + if (t.maxs_y > cmaxs_y) + cmaxs_y = t.maxs_y; + if (t.maxs_z > cmaxs_z) + cmaxs_z = t.maxs_z; + } + } while (1 ); + +}; + + +/*QUAKED func_door (0 .5 .8) ? START_OPEN x DOOR_DONT_LINK GOLD_KEY SILVER_KEY TOGGLE +if two doors touch, they are assumed to be connected and operate as a unit. + +TOGGLE causes the door to wait in both the start and end states for a trigger event. + +START_OPEN causes the door to move to its destination when spawned, and operate in reverse. It is used to temporarily or permanently close off an area when triggered (not usefull for touch or takedamage doors). + +Key doors are allways wait -1. + +"message" is printed when the door is touched if it is a trigger door and it hasn't been fired yet +"angle" determines the opening direction +"targetname" if set, no touch field will be spawned and a remote button or trigger field activates the door. +"health" if set, door must be shot open +"speed" movement speed (100 default) +"wait" wait before returning (3 default, -1 = never return) +"lip" lip remaining at end of move (8 default) +"dmg" damage to inflict when blocked (2 default) +"sounds" +0) no sound +1) stone +2) base +3) stone chain +4) screechy metal +*/ + +void() func_door = + +{ + + if (world.worldtype == 0) + { + precache_sound ("doors/medtry.wav"); + precache_sound ("doors/meduse.wav"); + self.noise3 = "doors/medtry.wav"; + self.noise4 = "doors/meduse.wav"; + } + else if (world.worldtype == 1) + { + precache_sound ("doors/runetry.wav"); + precache_sound ("doors/runeuse.wav"); + self.noise3 = "doors/runetry.wav"; + self.noise4 = "doors/runeuse.wav"; + } + else if (world.worldtype == 2) + { + precache_sound ("doors/basetry.wav"); + precache_sound ("doors/baseuse.wav"); + self.noise3 = "doors/basetry.wav"; + self.noise4 = "doors/baseuse.wav"; + } + else + { + dprint ("no worldtype set!\n"); + } + if (self.sounds == 0) + { + precache_sound ("misc/null.wav"); + precache_sound ("misc/null.wav"); + self.noise1 = "misc/null.wav"; + self.noise2 = "misc/null.wav"; + } + if (self.sounds == 1) + { + precache_sound ("doors/drclos4.wav"); + precache_sound ("doors/doormv1.wav"); + self.noise1 = "doors/drclos4.wav"; + self.noise2 = "doors/doormv1.wav"; + } + if (self.sounds == 2) + { + precache_sound ("doors/hydro1.wav"); + precache_sound ("doors/hydro2.wav"); + self.noise2 = "doors/hydro1.wav"; + self.noise1 = "doors/hydro2.wav"; + } + if (self.sounds == 3) + { + precache_sound ("doors/stndr1.wav"); + precache_sound ("doors/stndr2.wav"); + self.noise2 = "doors/stndr1.wav"; + self.noise1 = "doors/stndr2.wav"; + } + if (self.sounds == 4) + { + precache_sound ("doors/ddoor1.wav"); + precache_sound ("doors/ddoor2.wav"); + self.noise1 = "doors/ddoor2.wav"; + self.noise2 = "doors/ddoor1.wav"; + } + + + SetMovedir (); + + self.max_health = self.health; + self.solid = SOLID_BSP; + self.movetype = MOVETYPE_PUSH; + setorigin (self, self.origin); + setmodel (self, self.model); + self.classname = "door"; + + self.blocked = door_blocked; + self.use = door_use; + + if (self.spawnflags & DOOR_SILVER_KEY) + self.items = IT_KEY1; + if (self.spawnflags & DOOR_GOLD_KEY) + self.items = IT_KEY2; + + if (!self.speed) + self.speed = 100; + if (!self.wait) + self.wait = 3; + if (!self.lip) + self.lip = 8; + if (!self.dmg) + self.dmg = 2; + + self.pos1 = self.origin; + self.pos2 = self.pos1 + self.movedir*(fabs(self.movedir*self.size) - self.lip); + +// DOOR_START_OPEN is to allow an entity to be lighted in the closed position +// but spawn in the open position + if (self.spawnflags & DOOR_START_OPEN) + { + setorigin (self, self.pos2); + self.pos2 = self.pos1; + self.pos1 = self.origin; + } + + self.state = STATE_BOTTOM; + + if (self.health) + { + self.takedamage = DAMAGE_YES; + self.th_die = door_killed; + } + + if (self.items) + self.wait = -1; + + self.touch = door_touch; + +// LinkDoors can't be done until all of the doors have been spawned, so +// the sizes can be detected properly. + self.think = LinkDoors; + self.nextthink = self.ltime + 0.1; +}; + +/* +============================================================================= + +SECRET DOORS + +============================================================================= +*/ + +void() fd_secret_move1; +void() fd_secret_move2; +void() fd_secret_move3; +void() fd_secret_move4; +void() fd_secret_move5; +void() fd_secret_move6; +void() fd_secret_done; + +float SECRET_OPEN_ONCE = 1; // stays open +float SECRET_1ST_LEFT = 2; // 1st move is left of arrow +float SECRET_1ST_DOWN = 4; // 1st move is down from arrow +float SECRET_NO_SHOOT = 8; // only opened by trigger +float SECRET_YES_SHOOT = 16; // shootable even if targeted + + +void () fd_secret_use = +{ + local float temp; + + self.health = 10000; + + // exit if still moving around... + if (self.origin != self.oldorigin) + return; + + self.message = string_null; // no more message + + SUB_UseTargets(); // fire all targets / killtargets + + if (!(self.spawnflags & SECRET_NO_SHOOT)) + { + self.th_pain = SUB_Null; + self.takedamage = DAMAGE_NO; + } + self.velocity = '0 0 0'; + + // Make a sound, wait a little... + + sound(self, CHAN_VOICE, self.noise1, 1, ATTN_NORM); + self.nextthink = self.ltime + 0.1; + + temp = 1 - (self.spawnflags & SECRET_1ST_LEFT); // 1 or -1 + makevectors(self.mangle); + + if (!self.t_width) + { + if (self.spawnflags & SECRET_1ST_DOWN) + self. t_width = fabs(v_up * self.size); + else + self. t_width = fabs(v_right * self.size); + } + + if (!self.t_length) + self. t_length = fabs(v_forward * self.size); + + if (self.spawnflags & SECRET_1ST_DOWN) + self.dest1 = self.origin - v_up * self.t_width; + else + self.dest1 = self.origin + v_right * (self.t_width * temp); + + self.dest2 = self.dest1 + v_forward * self.t_length; + SUB_CalcMove(self.dest1, self.speed, fd_secret_move1); + sound(self, CHAN_VOICE, self.noise2, 1, ATTN_NORM); +}; + +// Wait after first movement... +void () fd_secret_move1 = +{ + self.nextthink = self.ltime + 1.0; + self.think = fd_secret_move2; + sound(self, CHAN_VOICE, self.noise3, 1, ATTN_NORM); +}; + +// Start moving sideways w/sound... +void () fd_secret_move2 = +{ + sound(self, CHAN_VOICE, self.noise2, 1, ATTN_NORM); + SUB_CalcMove(self.dest2, self.speed, fd_secret_move3); +}; + +// Wait here until time to go back... +void () fd_secret_move3 = +{ + sound(self, CHAN_VOICE, self.noise3, 1, ATTN_NORM); + if (!(self.spawnflags & SECRET_OPEN_ONCE)) + { + self.nextthink = self.ltime + self.wait; + self.think = fd_secret_move4; + } +}; + +// Move backward... +void () fd_secret_move4 = +{ + sound(self, CHAN_VOICE, self.noise2, 1, ATTN_NORM); + SUB_CalcMove(self.dest1, self.speed, fd_secret_move5); +}; + +// Wait 1 second... +void () fd_secret_move5 = +{ + self.nextthink = self.ltime + 1.0; + self.think = fd_secret_move6; + sound(self, CHAN_VOICE, self.noise3, 1, ATTN_NORM); +}; + +void () fd_secret_move6 = +{ + sound(self, CHAN_VOICE, self.noise2, 1, ATTN_NORM); + SUB_CalcMove(self.oldorigin, self.speed, fd_secret_done); +}; + +void () fd_secret_done = +{ + if (!self.targetname || self.spawnflags&SECRET_YES_SHOOT) + { + self.health = 10000; + self.takedamage = DAMAGE_YES; + self.th_pain = fd_secret_use; + } + sound(self, CHAN_VOICE, self.noise3, 1, ATTN_NORM); +}; + +void () secret_blocked = +{ + if (time < self.attack_finished) + return; + self.attack_finished = time + 0.5; + T_Damage (other, self, self, self.dmg); +}; + +/* +================ +secret_touch + +Prints messages +================ +*/ +void() secret_touch = +{ + if (other.classname != "player") + return; + if (self.attack_finished > time) + return; + + self.attack_finished = time + 2; + + if (self.message) + { + centerprint (other, self.message); + sound (other, CHAN_BODY, "misc/talk.wav", 1, ATTN_NORM); + } +}; + + +/*QUAKED func_door_secret (0 .5 .8) ? open_once 1st_left 1st_down no_shoot always_shoot +Basic secret door. Slides back, then to the side. Angle determines direction. +wait = # of seconds before coming back +1st_left = 1st move is left of arrow +1st_down = 1st move is down from arrow +always_shoot = even if targeted, keep shootable +t_width = override WIDTH to move back (or height if going down) +t_length = override LENGTH to move sideways +"dmg" damage to inflict when blocked (2 default) + +If a secret door has a targetname, it will only be opened by it's botton or trigger, not by damage. +"sounds" +1) medieval +2) metal +3) base +*/ + +void () func_door_secret = +{ + if (self.sounds == 0) + self.sounds = 3; + if (self.sounds == 1) + { + precache_sound ("doors/latch2.wav"); + precache_sound ("doors/winch2.wav"); + precache_sound ("doors/drclos4.wav"); + self.noise1 = "doors/latch2.wav"; + self.noise2 = "doors/winch2.wav"; + self.noise3 = "doors/drclos4.wav"; + } + if (self.sounds == 2) + { + precache_sound ("doors/airdoor1.wav"); + precache_sound ("doors/airdoor2.wav"); + self.noise2 = "doors/airdoor1.wav"; + self.noise1 = "doors/airdoor2.wav"; + self.noise3 = "doors/airdoor2.wav"; + } + if (self.sounds == 3) + { + precache_sound ("doors/basesec1.wav"); + precache_sound ("doors/basesec2.wav"); + self.noise2 = "doors/basesec1.wav"; + self.noise1 = "doors/basesec2.wav"; + self.noise3 = "doors/basesec2.wav"; + } + + if (!self.dmg) + self.dmg = 2; + + // Magic formula... + self.mangle = self.angles; + self.angles = '0 0 0'; + self.solid = SOLID_BSP; + self.movetype = MOVETYPE_PUSH; + self.classname = "door"; + setmodel (self, self.model); + setorigin (self, self.origin); + + self.touch = secret_touch; + self.blocked = secret_blocked; + self.speed = 50; + self.use = fd_secret_use; + if ( !self.targetname || self.spawnflags&SECRET_YES_SHOOT) + { + self.health = 10000; + self.takedamage = DAMAGE_YES; + self.th_pain = fd_secret_use; + self.th_die = fd_secret_use; + } + self.oldorigin = self.origin; + if (!self.wait) + self.wait = 5; // 5 seconds before closing +}; diff --git a/src/enforcer.qc b/src/enforcer.qc new file mode 100644 index 0000000..1b44f10 --- /dev/null +++ b/src/enforcer.qc @@ -0,0 +1,351 @@ +/* +============================================================================== + +SOLDIER / PLAYER + +============================================================================== +*/ + +$cd id1/models/enforcer +$origin 0 -6 24 +$base base +$skin skin + +$frame stand1 stand2 stand3 stand4 stand5 stand6 stand7 + +$frame walk1 walk2 walk3 walk4 walk5 walk6 walk7 walk8 walk9 walk10 +$frame walk11 walk12 walk13 walk14 walk15 walk16 + +$frame run1 run2 run3 run4 run5 run6 run7 run8 + +$frame attack1 attack2 attack3 attack4 attack5 attack6 +$frame attack7 attack8 attack9 attack10 + +$frame death1 death2 death3 death4 death5 death6 death7 death8 +$frame death9 death10 death11 death12 death13 death14 + +$frame fdeath1 fdeath2 fdeath3 fdeath4 fdeath5 fdeath6 fdeath7 fdeath8 +$frame fdeath9 fdeath10 fdeath11 + +$frame paina1 paina2 paina3 paina4 + +$frame painb1 painb2 painb3 painb4 painb5 + +$frame painc1 painc2 painc3 painc4 painc5 painc6 painc7 painc8 + +$frame paind1 paind2 paind3 paind4 paind5 paind6 paind7 paind8 +$frame paind9 paind10 paind11 paind12 paind13 paind14 paind15 paind16 +$frame paind17 paind18 paind19 + + +void() Laser_Touch = +{ + local vector org; + + if (other == self.owner) + return; // don't explode on owner + + if (pointcontents(self.origin) == CONTENT_SKY) + { + remove(self); + return; + } + + sound (self, CHAN_WEAPON, "enforcer/enfstop.wav", 1, ATTN_STATIC); + org = self.origin - 8*normalize(self.velocity); + + if (other.health) + { + SpawnBlood (org, self.velocity*0.2, 15); + T_Damage (other, self, self.owner, 15); + } + else + { + WriteByte (MSG_BROADCAST, SVC_TEMPENTITY); + WriteByte (MSG_BROADCAST, TE_GUNSHOT); + WriteCoord (MSG_BROADCAST, org_x); + WriteCoord (MSG_BROADCAST, org_y); + WriteCoord (MSG_BROADCAST, org_z); + } + + remove(self); +}; + +void(vector org, vector vec) LaunchLaser = +{ +// local vector vec; + + if (self.classname == "monster_enforcer") + sound (self, CHAN_WEAPON, "enforcer/enfire.wav", 1, ATTN_NORM); + + vec = normalize(vec); + + newmis = spawn(); + newmis.owner = self; + newmis.movetype = MOVETYPE_FLY; + newmis.solid = SOLID_BBOX; + newmis.effects = EF_DIMLIGHT; + + setmodel (newmis, "progs/laser.mdl"); + setsize (newmis, '0 0 0', '0 0 0'); + + setorigin (newmis, org); + + newmis.velocity = vec * 600; + newmis.angles = vectoangles(newmis.velocity); + + newmis.nextthink = time + 5; + newmis.think = SUB_Remove; + newmis.touch = Laser_Touch; +}; + + + +void() enforcer_fire = +{ + local vector org; + + self.effects = self.effects | EF_MUZZLEFLASH; + makevectors (self.angles); + + org = self.origin + v_forward * 30 + v_right * 8.5 + '0 0 16'; + + LaunchLaser(org, self.enemy.origin - self.origin); +}; + +//============================================================================ + +void() enf_stand1 =[ $stand1, enf_stand2 ] {ai_stand();}; +void() enf_stand2 =[ $stand2, enf_stand3 ] {ai_stand();}; +void() enf_stand3 =[ $stand3, enf_stand4 ] {ai_stand();}; +void() enf_stand4 =[ $stand4, enf_stand5 ] {ai_stand();}; +void() enf_stand5 =[ $stand5, enf_stand6 ] {ai_stand();}; +void() enf_stand6 =[ $stand6, enf_stand7 ] {ai_stand();}; +void() enf_stand7 =[ $stand7, enf_stand1 ] {ai_stand();}; + +void() enf_walk1 =[ $walk1 , enf_walk2 ] { +if (random() < 0.2) + sound (self, CHAN_VOICE, "enforcer/idle1.wav", 1, ATTN_IDLE); +ai_walk(2);}; +void() enf_walk2 =[ $walk2 , enf_walk3 ] {ai_walk(4);}; +void() enf_walk3 =[ $walk3 , enf_walk4 ] {ai_walk(4);}; +void() enf_walk4 =[ $walk4 , enf_walk5 ] {ai_walk(3);}; +void() enf_walk5 =[ $walk5 , enf_walk6 ] {ai_walk(1);}; +void() enf_walk6 =[ $walk6 , enf_walk7 ] {ai_walk(2);}; +void() enf_walk7 =[ $walk7 , enf_walk8 ] {ai_walk(2);}; +void() enf_walk8 =[ $walk8 , enf_walk9 ] {ai_walk(1);}; +void() enf_walk9 =[ $walk9 , enf_walk10 ] {ai_walk(2);}; +void() enf_walk10 =[ $walk10, enf_walk11 ] {ai_walk(4);}; +void() enf_walk11 =[ $walk11, enf_walk12 ] {ai_walk(4);}; +void() enf_walk12 =[ $walk12, enf_walk13 ] {ai_walk(1);}; +void() enf_walk13 =[ $walk13, enf_walk14 ] {ai_walk(2);}; +void() enf_walk14 =[ $walk14, enf_walk15 ] {ai_walk(3);}; +void() enf_walk15 =[ $walk15, enf_walk16 ] {ai_walk(4);}; +void() enf_walk16 =[ $walk16, enf_walk1 ] {ai_walk(2);}; + +void() enf_run1 =[ $run1 , enf_run2 ] { +if (random() < 0.2) + sound (self, CHAN_VOICE, "enforcer/idle1.wav", 1, ATTN_IDLE); +ai_run(18);}; +void() enf_run2 =[ $run2 , enf_run3 ] {ai_run(14);}; +void() enf_run3 =[ $run3 , enf_run4 ] {ai_run(7);}; +void() enf_run4 =[ $run4 , enf_run5 ] {ai_run(12);}; +void() enf_run5 =[ $run5 , enf_run6 ] {ai_run(14);}; +void() enf_run6 =[ $run6 , enf_run7 ] {ai_run(14);}; +void() enf_run7 =[ $run7 , enf_run8 ] {ai_run(7);}; +void() enf_run8 =[ $run8 , enf_run1 ] {ai_run(11);}; + +void() enf_atk1 =[ $attack1, enf_atk2 ] {ai_face();}; +void() enf_atk2 =[ $attack2, enf_atk3 ] {ai_face();}; +void() enf_atk3 =[ $attack3, enf_atk4 ] {ai_face();}; +void() enf_atk4 =[ $attack4, enf_atk5 ] {ai_face();}; +void() enf_atk5 =[ $attack5, enf_atk6 ] {ai_face();}; +void() enf_atk6 =[ $attack6, enf_atk7 ] {enforcer_fire();}; +void() enf_atk7 =[ $attack7, enf_atk8 ] {ai_face();}; +void() enf_atk8 =[ $attack8, enf_atk9 ] {ai_face();}; +void() enf_atk9 =[ $attack5, enf_atk10 ] {ai_face();}; +void() enf_atk10 =[ $attack6, enf_atk11 ] {enforcer_fire();}; +void() enf_atk11 =[ $attack7, enf_atk12 ] {ai_face();}; +void() enf_atk12 =[ $attack8, enf_atk13 ] {ai_face();}; +void() enf_atk13 =[ $attack9, enf_atk14 ] {ai_face();}; +void() enf_atk14 =[ $attack10, enf_run1 ] {ai_face(); +SUB_CheckRefire (enf_atk1); +}; + +void() enf_paina1 =[ $paina1, enf_paina2 ] {}; +void() enf_paina2 =[ $paina2, enf_paina3 ] {}; +void() enf_paina3 =[ $paina3, enf_paina4 ] {}; +void() enf_paina4 =[ $paina4, enf_run1 ] {}; + +void() enf_painb1 =[ $painb1, enf_painb2 ] {}; +void() enf_painb2 =[ $painb2, enf_painb3 ] {}; +void() enf_painb3 =[ $painb3, enf_painb4 ] {}; +void() enf_painb4 =[ $painb4, enf_painb5 ] {}; +void() enf_painb5 =[ $painb5, enf_run1 ] {}; + +void() enf_painc1 =[ $painc1, enf_painc2 ] {}; +void() enf_painc2 =[ $painc2, enf_painc3 ] {}; +void() enf_painc3 =[ $painc3, enf_painc4 ] {}; +void() enf_painc4 =[ $painc4, enf_painc5 ] {}; +void() enf_painc5 =[ $painc5, enf_painc6 ] {}; +void() enf_painc6 =[ $painc6, enf_painc7 ] {}; +void() enf_painc7 =[ $painc7, enf_painc8 ] {}; +void() enf_painc8 =[ $painc8, enf_run1 ] {}; + +void() enf_paind1 =[ $paind1, enf_paind2 ] {}; +void() enf_paind2 =[ $paind2, enf_paind3 ] {}; +void() enf_paind3 =[ $paind3, enf_paind4 ] {}; +void() enf_paind4 =[ $paind4, enf_paind5 ] {ai_painforward(2);}; +void() enf_paind5 =[ $paind5, enf_paind6 ] {ai_painforward(1);}; +void() enf_paind6 =[ $paind6, enf_paind7 ] {}; +void() enf_paind7 =[ $paind7, enf_paind8 ] {}; +void() enf_paind8 =[ $paind8, enf_paind9 ] {}; +void() enf_paind9 =[ $paind9, enf_paind10 ] {}; +void() enf_paind10 =[ $paind10, enf_paind11 ] {}; +void() enf_paind11 =[ $paind11, enf_paind12 ] {ai_painforward(1);}; +void() enf_paind12 =[ $paind12, enf_paind13 ] {ai_painforward(1);}; +void() enf_paind13 =[ $paind13, enf_paind14 ] {ai_painforward(1);}; +void() enf_paind14 =[ $paind14, enf_paind15 ] {}; +void() enf_paind15 =[ $paind15, enf_paind16 ] {}; +void() enf_paind16 =[ $paind16, enf_paind17 ] {ai_pain(1);}; +void() enf_paind17 =[ $paind17, enf_paind18 ] {ai_pain(1);}; +void() enf_paind18 =[ $paind18, enf_paind19 ] {}; +void() enf_paind19 =[ $paind19, enf_run1 ] {}; + +void(entity attacker, float damage) enf_pain = +{ + local float r; + + r = random (); + if (self.pain_finished > time) + return; + + + if (r < 0.5) + sound (self, CHAN_VOICE, "enforcer/pain1.wav", 1, ATTN_NORM); + else + sound (self, CHAN_VOICE, "enforcer/pain2.wav", 1, ATTN_NORM); + + if (r < 0.2) + { + self.pain_finished = time + 1; + enf_paina1 (); + } + else if (r < 0.4) + { + self.pain_finished = time + 1; + enf_painb1 (); + } + else if (r < 0.7) + { + self.pain_finished = time + 1; + enf_painc1 (); + } + else + { + self.pain_finished = time + 2; + enf_paind1 (); + } +}; + +//============================================================================ + + + + +void() enf_die1 =[ $death1, enf_die2 ] {}; +void() enf_die2 =[ $death2, enf_die3 ] {}; +void() enf_die3 =[ $death3, enf_die4 ] +{self.solid = SOLID_NOT;self.ammo_cells = 5;DropBackpack();}; +void() enf_die4 =[ $death4, enf_die5 ] {ai_forward(14);}; +void() enf_die5 =[ $death5, enf_die6 ] {ai_forward(2);}; +void() enf_die6 =[ $death6, enf_die7 ] {}; +void() enf_die7 =[ $death7, enf_die8 ] {}; +void() enf_die8 =[ $death8, enf_die9 ] {}; +void() enf_die9 =[ $death9, enf_die10 ] {ai_forward(3);}; +void() enf_die10 =[ $death10, enf_die11 ] {ai_forward(5);}; +void() enf_die11 =[ $death11, enf_die12 ] {ai_forward(5);}; +void() enf_die12 =[ $death12, enf_die13 ] {ai_forward(5);}; +void() enf_die13 =[ $death13, enf_die14 ] {}; +void() enf_die14 =[ $death14, enf_die14 ] {}; + +void() enf_fdie1 =[ $fdeath1, enf_fdie2 ] { + +}; +void() enf_fdie2 =[ $fdeath2, enf_fdie3 ] {}; +void() enf_fdie3 =[ $fdeath3, enf_fdie4 ] +{self.solid = SOLID_NOT;self.ammo_cells = 5;DropBackpack();}; +void() enf_fdie4 =[ $fdeath4, enf_fdie5 ] {}; +void() enf_fdie5 =[ $fdeath5, enf_fdie6 ] {}; +void() enf_fdie6 =[ $fdeath6, enf_fdie7 ] {}; +void() enf_fdie7 =[ $fdeath7, enf_fdie8 ] {}; +void() enf_fdie8 =[ $fdeath8, enf_fdie9 ] {}; +void() enf_fdie9 =[ $fdeath9, enf_fdie10 ] {}; +void() enf_fdie10 =[ $fdeath10, enf_fdie11 ] {}; +void() enf_fdie11 =[ $fdeath11, enf_fdie11 ] {}; + + +void() enf_die = +{ +// check for gib + if (self.health < -35) + { + sound (self, CHAN_VOICE, "player/udeath.wav", 1, ATTN_NORM); + ThrowHead ("progs/h_mega.mdl", self.health); + ThrowGib ("progs/gib1.mdl", self.health); + ThrowGib ("progs/gib2.mdl", self.health); + ThrowGib ("progs/gib3.mdl", self.health); + return; + } + +// regular death + sound (self, CHAN_VOICE, "enforcer/death1.wav", 1, ATTN_NORM); + if (random() > 0.5) + enf_die1 (); + else + enf_fdie1 (); +}; + + +/*QUAKED monster_enforcer (1 0 0) (-16 -16 -24) (16 16 40) Ambush + +*/ +void() monster_enforcer = +{ + if (deathmatch) + { + remove(self); + return; + } + precache_model2 ("progs/enforcer.mdl"); + precache_model2 ("progs/h_mega.mdl"); + precache_model2 ("progs/laser.mdl"); + + precache_sound2 ("enforcer/death1.wav"); + precache_sound2 ("enforcer/enfire.wav"); + precache_sound2 ("enforcer/enfstop.wav"); + precache_sound2 ("enforcer/idle1.wav"); + precache_sound2 ("enforcer/pain1.wav"); + precache_sound2 ("enforcer/pain2.wav"); + precache_sound2 ("enforcer/sight1.wav"); + precache_sound2 ("enforcer/sight2.wav"); + precache_sound2 ("enforcer/sight3.wav"); + precache_sound2 ("enforcer/sight4.wav"); + + self.solid = SOLID_SLIDEBOX; + self.movetype = MOVETYPE_STEP; + + setmodel (self, "progs/enforcer.mdl"); + + setsize (self, '-16 -16 -24', '16 16 40'); + self.health = 80; + + self.th_stand = enf_stand1; + self.th_walk = enf_walk1; + self.th_run = enf_run1; + self.th_pain = enf_pain; + self.th_die = enf_die; + self.th_missile = enf_atk1; + + walkmonster_start(); +}; diff --git a/src/error.log b/src/error.log new file mode 100644 index 0000000..f756f5e --- /dev/null +++ b/src/error.log @@ -0,0 +1,19 @@ +warning: fight.qc:199:Equation requires intermediate variable +warning: fight.qc:220:Equation requires intermediate variable +warning: portal.qc:591:oldvel redefined on different scope (see original definition defs.qc(694)) +warning: portal.qc:591:oldvel_x redefined on different scope (see original definition defs.qc(694)) +warning: portal.qc:591:oldvel_y redefined on different scope (see original definition defs.qc(694)) +warning: portal.qc:591:oldvel_z redefined on different scope (see original definition defs.qc(694)) +warning: portal.qc:634:oldvel redefined on different scope (see original definition defs.qc(694)) +warning: portal.qc:634:oldvel_x redefined on different scope (see original definition defs.qc(694)) +warning: portal.qc:634:oldvel_y redefined on different scope (see original definition defs.qc(694)) +warning: portal.qc:634:oldvel_z redefined on different scope (see original definition defs.qc(694)) +warning: portal.qc:673:oldvel redefined on different scope (see original definition defs.qc(694)) +warning: portal.qc:673:oldvel_x redefined on different scope (see original definition defs.qc(694)) +warning: portal.qc:673:oldvel_y redefined on different scope (see original definition defs.qc(694)) +warning: portal.qc:673:oldvel_z redefined on different scope (see original definition defs.qc(694)) +warning: ogre.qc:153:Equation requires intermediate variable +warning: shambler.qc:108:Equation requires intermediate variable +warning: shambler.qc:134:Equation requires intermediate variable +warning: dog.qc:61:Equation requires intermediate variable +warning: fish.qc:88:Equation requires intermediate variable diff --git a/src/fight.qc b/src/fight.qc new file mode 100644 index 0000000..e559169 --- /dev/null +++ b/src/fight.qc @@ -0,0 +1,409 @@ + +/* + +A monster is in fight mode if it thinks it can effectively attack its +enemy. + +When it decides it can't attack, it goes into hunt mode. + +*/ + +float(float v) anglemod; + +void() knight_atk1; +void() knight_runatk1; +void() ogre_smash1; +void() ogre_swing1; + +void() sham_smash1; +void() sham_swingr1; +void() sham_swingl1; + +float() DemonCheckAttack; +void(float side) Demon_Melee; + +void(vector dest) ChooseTurn; + +void() ai_face; + + +float enemy_vis, enemy_infront, enemy_range; +float enemy_yaw; + + +void() knight_attack = +{ + local float len; + +// decide if now is a good swing time + len = vlen(self.enemy.origin+self.enemy.view_ofs - (self.origin+self.view_ofs)); + + if (len<80) + knight_atk1 (); + else + knight_runatk1 (); +}; + +//============================================================================= + +/* +=========== +CheckAttack + +The player is in view, so decide to move or launch an attack +Returns FALSE if movement should continue +============ +*/ +float() CheckAttack = +{ + local vector spot1, spot2; + local entity targ; + local float chance; + + targ = self.enemy; + +// see if any entities are in the way of the shot + spot1 = self.origin + self.view_ofs; + spot2 = targ.origin + targ.view_ofs; + + traceline (spot1, spot2, FALSE, self); + + if (trace_ent != targ) + return FALSE; // don't have a clear shot + + if (trace_inopen && trace_inwater) + return FALSE; // sight line crossed contents + + if (enemy_range == RANGE_MELEE) + { // melee attack + if (self.th_melee) + { + if (self.classname == "monster_knight") + knight_attack (); + else + self.th_melee (); + return TRUE; + } + } + +// missile attack + if (!self.th_missile) + return FALSE; + + if (time < self.attack_finished) + return FALSE; + + if (enemy_range == RANGE_FAR) + return FALSE; + + if (enemy_range == RANGE_MELEE) + { + chance = 0.9; + self.attack_finished = 0; + } + else if (enemy_range == RANGE_NEAR) + { + if (self.th_melee) + chance = 0.2; + else + chance = 0.4; + } + else if (enemy_range == RANGE_MID) + { + if (self.th_melee) + chance = 0.05; + else + chance = 0.1; + } + else + chance = 0; + + if (random () < chance) + { + self.th_missile (); + SUB_AttackFinished (2*random()); + return TRUE; + } + + return FALSE; +}; + + +/* +============= +ai_face + +Stay facing the enemy +============= +*/ +void() ai_face = +{ + self.ideal_yaw = vectoyaw(self.enemy.origin - self.origin); + ChangeYaw (); +}; + +/* +============= +ai_charge + +The monster is in a melee attack, so get as close as possible to .enemy +============= +*/ +float (entity targ) visible; +float(entity targ) infront; +float(entity targ) range; + +void(float d) ai_charge = +{ + ai_face (); + movetogoal (d); // done in C code... +}; + +void() ai_charge_side = +{ + local vector dtemp; + local float heading; + +// aim to the left of the enemy for a flyby + + self.ideal_yaw = vectoyaw(self.enemy.origin - self.origin); + ChangeYaw (); + + makevectors (self.angles); + dtemp = self.enemy.origin - 30*v_right; + heading = vectoyaw(dtemp - self.origin); + + walkmove(heading, 20); +}; + + +/* +============= +ai_melee + +============= +*/ +void() ai_melee = +{ + local vector delta; + local float ldmg; + + if (!self.enemy) + return; // removed before stroke + + delta = self.enemy.origin - self.origin; + + if (vlen(delta) > 60) + return; + + ldmg = (random() + random() + random()) * 3; + T_Damage (self.enemy, self, self, ldmg); +}; + + +void() ai_melee_side = +{ + local vector delta; + local float ldmg; + + if (!self.enemy) + return; // removed before stroke + + ai_charge_side(); + + delta = self.enemy.origin - self.origin; + + if (vlen(delta) > 60) + return; + if (!CanDamage (self.enemy, self)) + return; + ldmg = (random() + random() + random()) * 3; + T_Damage (self.enemy, self, self, ldmg); +}; + + +//============================================================================= + +/* +=========== +SoldierCheckAttack + +The player is in view, so decide to move or launch an attack +Returns FALSE if movement should continue +============ +*/ +float() SoldierCheckAttack = +{ + local vector spot1, spot2; + local entity targ; + local float chance; + + targ = self.enemy; + +// see if any entities are in the way of the shot + spot1 = self.origin + self.view_ofs; + spot2 = targ.origin + targ.view_ofs; + + traceline (spot1, spot2, FALSE, self); + + if (trace_inopen && trace_inwater) + return FALSE; // sight line crossed contents + + if (trace_ent != targ) + return FALSE; // don't have a clear shot + + +// missile attack + if (time < self.attack_finished) + return FALSE; + + if (enemy_range == RANGE_FAR) + return FALSE; + + if (enemy_range == RANGE_MELEE) + chance = 0.9; + else if (enemy_range == RANGE_NEAR) + chance = 0.4; + else if (enemy_range == RANGE_MID) + chance = 0.05; + else + chance = 0; + + if (random () < chance) + { + self.th_missile (); + SUB_AttackFinished (1 + random()); + if (random() < 0.3) + self.lefty = !self.lefty; + + return TRUE; + } + + return FALSE; +}; +//============================================================================= + +/* +=========== +ShamCheckAttack + +The player is in view, so decide to move or launch an attack +Returns FALSE if movement should continue +============ +*/ +float() ShamCheckAttack = +{ + local vector spot1, spot2; + local entity targ; + local float chance; +// local float enemy_yaw; + + if (enemy_range == RANGE_MELEE) + { + if (CanDamage (self.enemy, self)) + { + self.attack_state = AS_MELEE; + return TRUE; + } + } + + if (time < self.attack_finished) + return FALSE; + + if (!enemy_vis) + return FALSE; + + targ = self.enemy; + +// see if any entities are in the way of the shot + spot1 = self.origin + self.view_ofs; + spot2 = targ.origin + targ.view_ofs; + + if (vlen(spot1 - spot2) > 600) + return FALSE; + + traceline (spot1, spot2, FALSE, self); + + if (trace_inopen && trace_inwater) + return FALSE; // sight line crossed contents + + if (trace_ent != targ) + { + return FALSE; // don't have a clear shot + } + +// missile attack + if (enemy_range == RANGE_FAR) + return FALSE; + + self.attack_state = AS_MISSILE; + SUB_AttackFinished (2 + 2*random()); + return TRUE; +}; + +//============================================================================ + +/* +=========== +OgreCheckAttack + +The player is in view, so decide to move or launch an attack +Returns FALSE if movement should continue +============ +*/ +float() OgreCheckAttack = +{ + local vector spot1, spot2; + local entity targ; + local float chance; + + if (enemy_range == RANGE_MELEE) + { + if (CanDamage (self.enemy, self)) + { + self.attack_state = AS_MELEE; + return TRUE; + } + } + + if (time < self.attack_finished) + return FALSE; + + if (!enemy_vis) + return FALSE; + + targ = self.enemy; + +// see if any entities are in the way of the shot + spot1 = self.origin + self.view_ofs; + spot2 = targ.origin + targ.view_ofs; + + traceline (spot1, spot2, FALSE, self); + + if (trace_inopen && trace_inwater) + return FALSE; // sight line crossed contents + + if (trace_ent != targ) + { + return FALSE; // don't have a clear shot + } + +// missile attack + if (time < self.attack_finished) + return FALSE; + + if (enemy_range == RANGE_FAR) + return FALSE; + + else if (enemy_range == RANGE_NEAR) + chance = 0.10; + else if (enemy_range == RANGE_MID) + chance = 0.05; + else + chance = 0; + + self.attack_state = AS_MISSILE; + SUB_AttackFinished (1 + 2*random()); + return TRUE; +}; + diff --git a/src/fish.qc b/src/fish.qc new file mode 100644 index 0000000..ce6e26e --- /dev/null +++ b/src/fish.qc @@ -0,0 +1,186 @@ +$cd id1/models/fish +$origin 0 0 24 +$base base +$skin skin + +$frame attack1 attack2 attack3 attack4 attack5 attack6 +$frame attack7 attack8 attack9 attack10 attack11 attack12 attack13 +$frame attack14 attack15 attack16 attack17 attack18 + +$frame death1 death2 death3 death4 death5 death6 death7 +$frame death8 death9 death10 death11 death12 death13 death14 death15 +$frame death16 death17 death18 death19 death20 death21 + +$frame swim1 swim2 swim3 swim4 swim5 swim6 swim7 swim8 +$frame swim9 swim10 swim11 swim12 swim13 swim14 swim15 swim16 swim17 +$frame swim18 + +$frame pain1 pain2 pain3 pain4 pain5 pain6 pain7 pain8 +$frame pain9 + +void() swimmonster_start; + +void() f_stand1 =[ $swim1, f_stand2 ] {ai_stand();}; +void() f_stand2 =[ $swim2, f_stand3 ] {ai_stand();}; +void() f_stand3 =[ $swim3, f_stand4 ] {ai_stand();}; +void() f_stand4 =[ $swim4, f_stand5 ] {ai_stand();}; +void() f_stand5 =[ $swim5, f_stand6 ] {ai_stand();}; +void() f_stand6 =[ $swim6, f_stand7 ] {ai_stand();}; +void() f_stand7 =[ $swim7, f_stand8 ] {ai_stand();}; +void() f_stand8 =[ $swim8, f_stand9 ] {ai_stand();}; +void() f_stand9 =[ $swim9, f_stand10 ] {ai_stand();}; +void() f_stand10 =[ $swim10, f_stand11 ] {ai_stand();}; +void() f_stand11 =[ $swim11, f_stand12 ] {ai_stand();}; +void() f_stand12 =[ $swim12, f_stand13 ] {ai_stand();}; +void() f_stand13 =[ $swim13, f_stand14 ] {ai_stand();}; +void() f_stand14 =[ $swim14, f_stand15 ] {ai_stand();}; +void() f_stand15 =[ $swim15, f_stand16 ] {ai_stand();}; +void() f_stand16 =[ $swim16, f_stand17 ] {ai_stand();}; +void() f_stand17 =[ $swim17, f_stand18 ] {ai_stand();}; +void() f_stand18 =[ $swim18, f_stand1 ] {ai_stand();}; + +void() f_walk1 =[ $swim1, f_walk2 ] {ai_walk(8);}; +void() f_walk2 =[ $swim2, f_walk3 ] {ai_walk(8);}; +void() f_walk3 =[ $swim3, f_walk4 ] {ai_walk(8);}; +void() f_walk4 =[ $swim4, f_walk5 ] {ai_walk(8);}; +void() f_walk5 =[ $swim5, f_walk6 ] {ai_walk(8);}; +void() f_walk6 =[ $swim6, f_walk7 ] {ai_walk(8);}; +void() f_walk7 =[ $swim7, f_walk8 ] {ai_walk(8);}; +void() f_walk8 =[ $swim8, f_walk9 ] {ai_walk(8);}; +void() f_walk9 =[ $swim9, f_walk10 ] {ai_walk(8);}; +void() f_walk10 =[ $swim10, f_walk11 ] {ai_walk(8);}; +void() f_walk11 =[ $swim11, f_walk12 ] {ai_walk(8);}; +void() f_walk12 =[ $swim12, f_walk13 ] {ai_walk(8);}; +void() f_walk13 =[ $swim13, f_walk14 ] {ai_walk(8);}; +void() f_walk14 =[ $swim14, f_walk15 ] {ai_walk(8);}; +void() f_walk15 =[ $swim15, f_walk16 ] {ai_walk(8);}; +void() f_walk16 =[ $swim16, f_walk17 ] {ai_walk(8);}; +void() f_walk17 =[ $swim17, f_walk18 ] {ai_walk(8);}; +void() f_walk18 =[ $swim18, f_walk1 ] {ai_walk(8);}; + +void() f_run1 =[ $swim1, f_run2 ] {ai_run(12); + if (random() < 0.5) + sound (self, CHAN_VOICE, "fish/idle.wav", 1, ATTN_NORM); +}; +void() f_run2 =[ $swim3, f_run3 ] {ai_run(12);}; +void() f_run3 =[ $swim5, f_run4 ] {ai_run(12);}; +void() f_run4 =[ $swim7, f_run5 ] {ai_run(12);}; +void() f_run5 =[ $swim9, f_run6 ] {ai_run(12);}; +void() f_run6 =[ $swim11, f_run7 ] {ai_run(12);}; +void() f_run7 =[ $swim13, f_run8 ] {ai_run(12);}; +void() f_run8 =[ $swim15, f_run9 ] {ai_run(12);}; +void() f_run9 =[ $swim17, f_run1 ] {ai_run(12);}; + +void() fish_melee = +{ + local vector delta; + local float ldmg; + + if (!self.enemy) + return; // removed before stroke + + delta = self.enemy.origin - self.origin; + + if (vlen(delta) > 60) + return; + + sound (self, CHAN_VOICE, "fish/bite.wav", 1, ATTN_NORM); + ldmg = (random() + random()) * 3; + T_Damage (self.enemy, self, self, ldmg); +}; + +void() f_attack1 =[ $attack1, f_attack2 ] {ai_charge(10);}; +void() f_attack2 =[ $attack2, f_attack3 ] {ai_charge(10);}; +void() f_attack3 =[ $attack3, f_attack4 ] {fish_melee();}; +void() f_attack4 =[ $attack4, f_attack5 ] {ai_charge(10);}; +void() f_attack5 =[ $attack5, f_attack6 ] {ai_charge(10);}; +void() f_attack6 =[ $attack6, f_attack7 ] {ai_charge(10);}; +void() f_attack7 =[ $attack7, f_attack8 ] {ai_charge(10);}; +void() f_attack8 =[ $attack8, f_attack9 ] {ai_charge(10);}; +void() f_attack9 =[ $attack9, f_attack10] {fish_melee();}; +void() f_attack10 =[ $attack10, f_attack11] {ai_charge(10);}; +void() f_attack11 =[ $attack11, f_attack12] {ai_charge(10);}; +void() f_attack12 =[ $attack12, f_attack13] {ai_charge(10);}; +void() f_attack13 =[ $attack13, f_attack14] {ai_charge(10);}; +void() f_attack14 =[ $attack14, f_attack15] {ai_charge(10);}; +void() f_attack15 =[ $attack15, f_attack16] {fish_melee();}; +void() f_attack16 =[ $attack16, f_attack17] {ai_charge(10);}; +void() f_attack17 =[ $attack17, f_attack18] {ai_charge(10);}; +void() f_attack18 =[ $attack18, f_run1 ] {ai_charge(10);}; + +void() f_death1 =[ $death1, f_death2 ] { +sound (self, CHAN_VOICE, "fish/death.wav", 1, ATTN_NORM); +}; +void() f_death2 =[ $death2, f_death3 ] {}; +void() f_death3 =[ $death3, f_death4 ] {}; +void() f_death4 =[ $death4, f_death5 ] {}; +void() f_death5 =[ $death5, f_death6 ] {}; +void() f_death6 =[ $death6, f_death7 ] {}; +void() f_death7 =[ $death7, f_death8 ] {}; +void() f_death8 =[ $death8, f_death9 ] {}; +void() f_death9 =[ $death9, f_death10 ] {}; +void() f_death10 =[ $death10, f_death11 ] {}; +void() f_death11 =[ $death11, f_death12 ] {}; +void() f_death12 =[ $death12, f_death13 ] {}; +void() f_death13 =[ $death13, f_death14 ] {}; +void() f_death14 =[ $death14, f_death15 ] {}; +void() f_death15 =[ $death15, f_death16 ] {}; +void() f_death16 =[ $death16, f_death17 ] {}; +void() f_death17 =[ $death17, f_death18 ] {}; +void() f_death18 =[ $death18, f_death19 ] {}; +void() f_death19 =[ $death19, f_death20 ] {}; +void() f_death20 =[ $death20, f_death21 ] {}; +void() f_death21 =[ $death21, f_death21 ] {self.solid = SOLID_NOT;}; + +void() f_pain1 =[ $pain1, f_pain2 ] {}; +void() f_pain2 =[ $pain2, f_pain3 ] {ai_pain(6);}; +void() f_pain3 =[ $pain3, f_pain4 ] {ai_pain(6);}; +void() f_pain4 =[ $pain4, f_pain5 ] {ai_pain(6);}; +void() f_pain5 =[ $pain5, f_pain6 ] {ai_pain(6);}; +void() f_pain6 =[ $pain6, f_pain7 ] {ai_pain(6);}; +void() f_pain7 =[ $pain7, f_pain8 ] {ai_pain(6);}; +void() f_pain8 =[ $pain8, f_pain9 ] {ai_pain(6);}; +void() f_pain9 =[ $pain9, f_run1 ] {ai_pain(6);}; + +void(entity attacker, float damage) fish_pain = +{ + +// fish allways do pain frames + f_pain1 (); +}; + + + +/*QUAKED monster_fish (1 0 0) (-16 -16 -24) (16 16 24) Ambush +*/ +void() monster_fish = +{ + if (deathmatch) + { + remove(self); + return; + } + precache_model2 ("progs/fish.mdl"); + + precache_sound2 ("fish/death.wav"); + precache_sound2 ("fish/bite.wav"); + precache_sound2 ("fish/idle.wav"); + + self.solid = SOLID_SLIDEBOX; + self.movetype = MOVETYPE_STEP; + + setmodel (self, "progs/fish.mdl"); + + setsize (self, '-16 -16 -24', '16 16 24'); + self.health = 25; + + self.th_stand = f_stand1; + self.th_walk = f_walk1; + self.th_run = f_run1; + self.th_die = f_death1; + self.th_pain = fish_pain; + self.th_melee = f_attack1; + + swimmonster_start (); +}; + diff --git a/src/frikqcc25.exe b/src/frikqcc25.exe new file mode 100644 index 0000000000000000000000000000000000000000..d55042f490abedbd209de8ef1ce0085860d842a7 GIT binary patch literal 122880 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 OxHE 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 literal 0 HcmV?d00001 diff --git a/src/fteqcc.log b/src/fteqcc.log new file mode 100644 index 0000000..6de1f97 --- /dev/null +++ b/src/fteqcc.log @@ -0,0 +1,141 @@ +Source file: progs.src +outputfile: ../progs.dat +compiling defs.qc +compiling custdefs.qc +compiling subs.qc +compiling fight.qc +compiling ai.qc +compiling combat.qc +compiling portal.qc +in function Portal1Touch (line 34), +portal.qc:591: warning: Local "oldvel" defined with name of a global +in function Portal2Touch (line 35), +portal.qc:634: warning: Local "oldvel" defined with name of a global +in function PortalDeathTouch (line 36), +portal.qc:673: warning: Local "oldvel" defined with name of a global +compiling items.qc +compiling weapons.qc +compiling world.qc +compiling client.qc +compiling player.qc +compiling monsters.qc +compiling doors.qc +compiling buttons.qc +compiling triggers.qc +compiling plats.qc +compiling misc.qc +compiling asstech.qc +compiling cube.qc +compiling ogre.qc +compiling demon.qc +compiling shambler.qc +compiling knight.qc +at global scope, +knight.qc:32: warning: Duplicate macro defined (attackb1) +compiling soldier.qc +compiling wizard.qc +compiling dog.qc +compiling zombie.qc +compiling boss.qc +compiling tarbaby.qc +compiling hknight.qc +compiling fish.qc +compiling shalrath.qc +compiling enforcer.qc +compiling oldone.qc +oldone.qc:29: warning: Duplicate macro defined (shake12) +Recognised progs as NetQuake server gamecode +Progs should run on any Quake executor +defs.qc:401: warning: empty_float no references +defs.qc:417: warning: wad no references +defs.qc:428: warning: light_lev no references +defs.qc:548: warning: waitmax no references +defs.qc:549: warning: distance no references +defs.qc:550: warning: volume no references +custdefs.qc:3: warning: duration no references +custdefs.qc:4: warning: endtime no references +fight.qc:298: warning: chance no references +ai.qc:37: warning: current_yaw no references +ai.qc:476: warning: mtemp no references +ai.qc:679: warning: delta no references +ai.qc:680: warning: axis no references +ai.qc:681: warning: direct no references +ai.qc:681: warning: ang_rint no references +ai.qc:681: warning: ang_floor no references +ai.qc:681: warning: ang_ceil no references +portal.qc:145: warning: str_tmp no references +portal.qc:265: warning: tmp no references +portal.qc:332: warning: dir no references +portal.qc:592: warning: temp2 no references +portal.qc:710: warning: v no references +portal.qc:712: warning: oldz no references +items.qc:152: warning: amount no references +items.qc:871: warning: stemp no references +items.qc:872: warning: best no references +items.qc:1007: warning: stemp no references +items.qc:1008: warning: best no references +items.qc:1080: warning: stemp no references +items.qc:1081: warning: best no references +weapons.qc:92: warning: mpuff no references +weapons.qc:375: warning: mpuff no references +weapons.qc:550: warning: mpuff no references +weapons.qc:638: warning: old no references +weapons.qc:654: warning: old no references +weapons.qc:682: warning: hit_z no references +weapons.qc:685: warning: rand no references +weapons.qc:725: warning: rand no references +world.qc:364: warning: e no references +client.qc:295: warning: pos no references +client.qc:706: warning: old_self no references +client.qc:741: warning: start no references +client.qc:741: warning: end no references +client.qc:913: warning: mspeed no references +client.qc:913: warning: aspeed no references +client.qc:914: warning: r no references +client.qc:1127: warning: mspeed no references +client.qc:1127: warning: aspeed no references +client.qc:1128: warning: r no references +monsters.qc:51: warning: ent no references +monsters.qc:51: warning: otemp no references +monsters.qc:51: warning: stemp no references +monsters.qc:71: warning: stemp no references +monsters.qc:72: warning: etemp no references +buttons.qc:88: warning: gtemp no references +buttons.qc:88: warning: ftemp no references +triggers.qc:2: warning: stemp no references +triggers.qc:2: warning: otemp no references +triggers.qc:2: warning: old no references +triggers.qc:224: warning: junk no references +plats.qc:150: warning: t no references +misc.qc:447: warning: vtmp1 no references +misc.qc:447: warning: modi no references +asstech.qc:116: warning: value no references +cube.qc:44: warning: new no references +cube.qc:45: warning: newsize no references +ogre.qc:92: warning: mpuff no references +demon.qc:280: warning: vec no references +dog.qc:306: warning: vec no references +zombie.qc:164: warning: mpuff no references + 92592 strofs (of 1000000) + 22619 numstatements (of 524288) + 2151 numfunctions (of 16384) + 4589 numglobaldefs (of 32768) + 235 numfielddefs (211 unique) (of 2048) + 4611 numpr_globals (of 65536) +Writing ../progs.dat +408204 TOTAL SIZE +Writing ../progs.lno +224 unique precache_sounds + 97 unique precache_models +104 unique precache_files +Compile Complete + +optres_shortenifnots 127 +optres_overlaptemps 8656 +optres_constantarithmatic 20 +optres_nonvec_parms 4110 +optres_assignments 496 +optres_unreferenced 74 +optres_dupconstdefs 120 +numtemps 140 +75 warnings diff --git a/src/grid.qc b/src/grid.qc new file mode 100644 index 0000000..9052820 --- /dev/null +++ b/src/grid.qc @@ -0,0 +1,263 @@ +/* Based on: + Particle effects QuickC program + By Jim Dose' 9/19/96 + Copyright (c)1996 Hipnotic Interactive, Inc. + All rights reserved. + Do not distribute. +*/ + +float USE_COUNT = 1; + +void () particlefield_XZ = +{ + local vector pos; + local vector start; + local vector end; + + if ( ( self.spawnflags & USE_COUNT ) && + ( counter_GetCount( other ) != self.cnt ) ) + return; + + self.ltime = time + 0.25; + if ( self.noise ) + sound(self, CHAN_VOICE, self.noise, 1, ATTN_NORM); + + // Only show particles if client is visible. + // This helps to keep network traffic down to a minimum. + if (!checkclient() ) + return; + + start = self.dest1 + self.origin; + end = self.dest2 + self.origin; + pos_y = start_y; + pos_z = start_z; + while( pos_z <= end_z ) + { + pos_x = start_x; + while( pos_x <= end_x ) + { + particle ( pos, '0 0 0', self.color, self.count ); + pos_x = pos_x + 16; + } + pos_z = pos_z + 16; + } +}; + +void () particlefield_YZ = +{ + local vector pos; + local vector start; + local vector end; + + if ( ( self.spawnflags & USE_COUNT ) && + ( counter_GetCount( other ) != self.cnt ) ) + return; + + self.ltime = time + 0.25; + if ( self.noise ) + sound(self, CHAN_VOICE, self.noise, 1, ATTN_NORM); + + // Only show particles if client is visible. + // This helps to keep network traffic down to a minimum. + if (!checkclient() ) + return; + + start = self.dest1 + self.origin; + end = self.dest2 + self.origin; + pos_x = start_x; + pos_z = start_z; + while( pos_z < end_z ) + { + pos_y = start_y; + while( pos_y < end_y ) + { + particle ( pos, '0 0 0', self.color, self.count ); + pos_y = pos_y + 16; + } + pos_z = pos_z + 16; + } +}; + +void () particlefield_XY = +{ + local vector pos; + local vector start; + local vector end; + + if ( ( self.spawnflags & USE_COUNT ) && + ( counter_GetCount( other ) != self.cnt ) ) + return; + + self.ltime = time + 0.25; + if ( self.noise ) + sound(self, CHAN_VOICE, self.noise, 1, ATTN_NORM); + + // Only show particles if client is visible. + // This helps to keep network traffic down to a minimum. + if (!checkclient() ) + return; + + start = self.dest1 + self.origin; + end = self.dest2 + self.origin; + pos_x = start_x; + pos_z = start_z; + while( pos_x < end_x ) + { + pos_y = start_y; + while( pos_y < end_y ) + { + particle ( pos, '0 0 0', self.color, self.count ); + pos_y = pos_y + 16; + } + pos_x = pos_x + 16; + } +}; + +void () particlefield_touch = +{ + if ( !self.dmg ) + return; + + if ( time > self.ltime) + return; + + if (time < self.attack_finished) + return; + self.attack_finished = time + 0.5; + T_Damage (other, self, self, self.dmg); +}; + +/*QUAKED func_particlefield (0 .5 .8) ? USE_COUNT +Creates a brief particle flash roughly the size of the defining +brush each time it is triggered. + +USE_COUNT when the activator is a func_counter, the field will only + activate when count is equal to "cnt". Same as using a func_oncount + to trigger. + +"cnt" is the count to activate on when USE_COUNT is set. +"color" is the color of the particles. Default is 192 (yellow). +"count" is the density of the particles. Default is 2. +"noise" is the sound to play when triggered. Do not use a looping sound here. +"dmg" is the amount of damage to cause when touched. +*/ + +void() func_particlefield = +{ + if ( !self.color ) + self.color = 192; + if ( self.count == 0 ) + self.count = 2; + self.classname = "particlefield"; + self.solid = SOLID_NOT; + self.movetype = MOVETYPE_NONE; + setmodel (self, self.model); + self.model = string_null; + + self.origin = ( self.mins + self.maxs ) * 0.5; + setorigin (self, self.origin); + self.dest = self.maxs - self.mins - '16 16 16'; + self.dest1 = self.mins + '8 8 8' - self.origin; + self.dest2 = self.maxs + '7.9 7.9 7.9' - self.origin; + setsize (self, self.mins, self.maxs); + self.touch = particlefield_touch; + if ( self.dest_x > self.dest_z ) + { + if ( self.dest_y > self.dest_z ) + { + self.use = particlefield_XY; + self.dest1_z = ( self.dest1_z + self.dest2_z ) / 2; + } + else + { + self.use = particlefield_XZ; + self.dest1_y = ( self.dest1_y + self.dest2_y ) / 2; + } + } + else + { + if ( self.dest_y > self.dest_x ) + { + self.use = particlefield_YZ; + self.dest1_x = ( self.dest1_x + self.dest2_x ) / 2; + } + else + { + self.use = particlefield_XZ; + self.dest1_y = ( self.dest1_y + self.dest2_y ) / 2; + } + } + + if ( self.noise ) + precache_sound( self.noise ); + self.ltime = time; +}; + +void () blocker_touch = +{ + if ( !self.dmg ) + return; + + if (time < self.attack_finished) + return; + self.attack_finished = time + 0.5; + T_Damage (other, self, self, self.dmg); +}; + +void () blocker_use = +{ + if ( !self.state ) + { + self.state = 1; + setorigin( self, self.origin - '8000 8000 8000' ); + sound(self, CHAN_VOICE, self.noise1, 1, ATTN_NORM); + } + else + { + self.state = 0; + setorigin( self, self.origin + '8000 8000 8000' ); + sound(self, CHAN_VOICE, self.noise, 1, ATTN_NORM); + } +}; + +/*QUAKED func_togglewall (0 .5 .8) ? START_OFF +Creates a invisible wall that can be toggled on and off. + +START_OFF wall doesn't block until triggered. + +"noise" is the sound to play when wall is turned off. +"noise1" is the sound to play when wall is blocking. +"dmg" is the amount of damage to cause when touched. +*/ + +void() func_togglewall = +{ + self.classname = "togglewall"; + self.movetype = MOVETYPE_PUSH; + self.mdl = self.model; + setmodel (self, self.model); + setsize (self, self.mins, self.maxs); + setorigin (self, self.origin); + self.touch = blocker_touch; + self.use = blocker_use; + if ( !self.noise ) + self.noise = ("misc/null.wav"); + if ( !self.noise1 ) + self.noise1 = ("misc/null.wav"); + + precache_sound( self.noise ); + precache_sound( self.noise1 ); + + self.solid = SOLID_BSP; + self.model = string_null; + if ( self.spawnflags & START_OFF ) + { + self.state = 0; + setorigin( self, self.origin + '8000 8000 8000' ); + } + else + { + self.state = 1; + sound(self, CHAN_VOICE, self.noise1, 1, ATTN_NORM); + } +}; diff --git a/src/hknight.qc b/src/hknight.qc new file mode 100644 index 0000000..0e239e0 --- /dev/null +++ b/src/hknight.qc @@ -0,0 +1,440 @@ +/* +============================================================================== + +KNIGHT + +============================================================================== +*/ + +$cd id1/models/knight2 +$origin 0 0 24 +$base base +$skin skin + +$frame stand1 stand2 stand3 stand4 stand5 stand6 stand7 stand8 stand9 + +$frame walk1 walk2 walk3 walk4 walk5 walk6 walk7 walk8 walk9 +$frame walk10 walk11 walk12 walk13 walk14 walk15 walk16 walk17 +$frame walk18 walk19 walk20 + +$frame run1 run2 run3 run4 run5 run6 run7 run8 + +$frame pain1 pain2 pain3 pain4 pain5 + +$frame death1 death2 death3 death4 death5 death6 death7 death8 +$frame death9 death10 death11 death12 + +$frame deathb1 deathb2 deathb3 deathb4 deathb5 deathb6 deathb7 deathb8 +$frame deathb9 + +$frame char_a1 char_a2 char_a3 char_a4 char_a5 char_a6 char_a7 char_a8 +$frame char_a9 char_a10 char_a11 char_a12 char_a13 char_a14 char_a15 char_a16 + +$frame magica1 magica2 magica3 magica4 magica5 magica6 magica7 magica8 +$frame magica9 magica10 magica11 magica12 magica13 magica14 + +$frame magicb1 magicb2 magicb3 magicb4 magicb5 magicb6 magicb7 magicb8 +$frame magicb9 magicb10 magicb11 magicb12 magicb13 + +$frame char_b1 char_b2 char_b3 char_b4 char_b5 char_b6 + +$frame slice1 slice2 slice3 slice4 slice5 slice6 slice7 slice8 slice9 slice10 + +$frame smash1 smash2 smash3 smash4 smash5 smash6 smash7 smash8 smash9 smash10 +$frame smash11 + +$frame w_attack1 w_attack2 w_attack3 w_attack4 w_attack5 w_attack6 w_attack7 +$frame w_attack8 w_attack9 w_attack10 w_attack11 w_attack12 w_attack13 w_attack14 +$frame w_attack15 w_attack16 w_attack17 w_attack18 w_attack19 w_attack20 +$frame w_attack21 w_attack22 + +$frame magicc1 magicc2 magicc3 magicc4 magicc5 magicc6 magicc7 magicc8 +$frame magicc9 magicc10 magicc11 + + +void() hknight_char_a1; +void() hknight_run1; +void() hk_idle_sound; + +void(float offset) hknight_shot = +{ + local vector offang; + local vector org, vec; + + offang = vectoangles (self.enemy.origin - self.origin); + offang_y = offang_y + offset * 6; + + makevectors (offang); + + org = self.origin + self.mins + self.size*0.5 + v_forward * 20; + +// set missile speed + vec = normalize (v_forward); + vec_z = 0 - vec_z + (random() - 0.5)*0.1; + + launch_spike (org, vec); + newmis.classname = "knightspike"; + setmodel (newmis, "progs/k_spike.mdl"); + setsize (newmis, VEC_ORIGIN, VEC_ORIGIN); + newmis.velocity = vec*300; + sound (self, CHAN_WEAPON, "hknight/attack1.wav", 1, ATTN_NORM); +}; + +void() CheckForCharge = +{ +// check for mad charge +if (!enemy_vis) + return; +if (time < self.attack_finished) + return; +if ( fabs(self.origin_z - self.enemy.origin_z) > 20) + return; // too much height change +if ( vlen (self.origin - self.enemy.origin) < 80) + return; // use regular attack + +// charge + SUB_AttackFinished (2); + hknight_char_a1 (); + +}; + +void() CheckContinueCharge = +{ + if (time > self.attack_finished) + { + SUB_AttackFinished (3); + hknight_run1 (); + return; // done charging + } + if (random() > 0.5) + sound (self, CHAN_WEAPON, "knight/sword2.wav", 1, ATTN_NORM); + else + sound (self, CHAN_WEAPON, "knight/sword1.wav", 1, ATTN_NORM); +}; + +//=========================================================================== + +void() hknight_stand1 =[ $stand1, hknight_stand2 ] {ai_stand();}; +void() hknight_stand2 =[ $stand2, hknight_stand3 ] {ai_stand();}; +void() hknight_stand3 =[ $stand3, hknight_stand4 ] {ai_stand();}; +void() hknight_stand4 =[ $stand4, hknight_stand5 ] {ai_stand();}; +void() hknight_stand5 =[ $stand5, hknight_stand6 ] {ai_stand();}; +void() hknight_stand6 =[ $stand6, hknight_stand7 ] {ai_stand();}; +void() hknight_stand7 =[ $stand7, hknight_stand8 ] {ai_stand();}; +void() hknight_stand8 =[ $stand8, hknight_stand9 ] {ai_stand();}; +void() hknight_stand9 =[ $stand9, hknight_stand1 ] {ai_stand();}; + +//=========================================================================== + +void() hknight_walk1 =[ $walk1, hknight_walk2 ] { +hk_idle_sound(); +ai_walk(2);}; +void() hknight_walk2 =[ $walk2, hknight_walk3 ] {ai_walk(5);}; +void() hknight_walk3 =[ $walk3, hknight_walk4 ] {ai_walk(5);}; +void() hknight_walk4 =[ $walk4, hknight_walk5 ] {ai_walk(4);}; +void() hknight_walk5 =[ $walk5, hknight_walk6 ] {ai_walk(4);}; +void() hknight_walk6 =[ $walk6, hknight_walk7 ] {ai_walk(2);}; +void() hknight_walk7 =[ $walk7, hknight_walk8 ] {ai_walk(2);}; +void() hknight_walk8 =[ $walk8, hknight_walk9 ] {ai_walk(3);}; +void() hknight_walk9 =[ $walk9, hknight_walk10 ] {ai_walk(3);}; +void() hknight_walk10 =[ $walk10, hknight_walk11 ] {ai_walk(4);}; +void() hknight_walk11 =[ $walk11, hknight_walk12 ] {ai_walk(3);}; +void() hknight_walk12 =[ $walk12, hknight_walk13 ] {ai_walk(4);}; +void() hknight_walk13 =[ $walk13, hknight_walk14 ] {ai_walk(6);}; +void() hknight_walk14 =[ $walk14, hknight_walk15 ] {ai_walk(2);}; +void() hknight_walk15 =[ $walk15, hknight_walk16 ] {ai_walk(2);}; +void() hknight_walk16 =[ $walk16, hknight_walk17 ] {ai_walk(4);}; +void() hknight_walk17 =[ $walk17, hknight_walk18 ] {ai_walk(3);}; +void() hknight_walk18 =[ $walk18, hknight_walk19 ] {ai_walk(3);}; +void() hknight_walk19 =[ $walk19, hknight_walk20 ] {ai_walk(3);}; +void() hknight_walk20 =[ $walk20, hknight_walk1 ] {ai_walk(2);}; + +//=========================================================================== + +void() hknight_run1 =[ $run1, hknight_run2 ] { +hk_idle_sound(); +ai_run (20); CheckForCharge (); }; +void() hknight_run2 =[ $run2, hknight_run3 ] {ai_run(25);}; +void() hknight_run3 =[ $run3, hknight_run4 ] {ai_run(18);}; +void() hknight_run4 =[ $run4, hknight_run5 ] {ai_run(16);}; +void() hknight_run5 =[ $run5, hknight_run6 ] {ai_run(14);}; +void() hknight_run6 =[ $run6, hknight_run7 ] {ai_run(25);}; +void() hknight_run7 =[ $run7, hknight_run8 ] {ai_run(21);}; +void() hknight_run8 =[ $run8, hknight_run1 ] {ai_run(13);}; + +//============================================================================ + +void() hknight_pain1 =[ $pain1, hknight_pain2 ] {sound (self, CHAN_VOICE, "hknight/pain1.wav", 1, ATTN_NORM);}; +void() hknight_pain2 =[ $pain2, hknight_pain3 ] {}; +void() hknight_pain3 =[ $pain3, hknight_pain4 ] {}; +void() hknight_pain4 =[ $pain4, hknight_pain5 ] {}; +void() hknight_pain5 =[ $pain5, hknight_run1 ] {}; + +//============================================================================ + +void() hknight_die1 =[ $death1, hknight_die2 ] {ai_forward(10);}; +void() hknight_die2 =[ $death2, hknight_die3 ] {ai_forward(8);}; +void() hknight_die3 =[ $death3, hknight_die4 ] +{self.solid = SOLID_NOT; ai_forward(7);}; +void() hknight_die4 =[ $death4, hknight_die5 ] {}; +void() hknight_die5 =[ $death5, hknight_die6 ] {}; +void() hknight_die6 =[ $death6, hknight_die7 ] {}; +void() hknight_die7 =[ $death7, hknight_die8 ] {}; +void() hknight_die8 =[ $death8, hknight_die9 ] {ai_forward(10);}; +void() hknight_die9 =[ $death9, hknight_die10 ] {ai_forward(11);}; +void() hknight_die10 =[ $death10, hknight_die11 ] {}; +void() hknight_die11 =[ $death11, hknight_die12 ] {}; +void() hknight_die12 =[ $death12, hknight_die12 ] {}; + +void() hknight_dieb1 =[ $deathb1, hknight_dieb2 ] {}; +void() hknight_dieb2 =[ $deathb2, hknight_dieb3 ] {}; +void() hknight_dieb3 =[ $deathb3, hknight_dieb4 ] +{self.solid = SOLID_NOT;}; +void() hknight_dieb4 =[ $deathb4, hknight_dieb5 ] {}; +void() hknight_dieb5 =[ $deathb5, hknight_dieb6 ] {}; +void() hknight_dieb6 =[ $deathb6, hknight_dieb7 ] {}; +void() hknight_dieb7 =[ $deathb7, hknight_dieb8 ] {}; +void() hknight_dieb8 =[ $deathb8, hknight_dieb9 ] {}; +void() hknight_dieb9 =[ $deathb9, hknight_dieb9 ] {}; + +void() hknight_die = +{ +// check for gib + if (self.health < -40) + { + sound (self, CHAN_VOICE, "player/udeath.wav", 1, ATTN_NORM); + ThrowHead ("progs/h_hellkn.mdl", self.health); + ThrowGib ("progs/gib1.mdl", self.health); + ThrowGib ("progs/gib2.mdl", self.health); + ThrowGib ("progs/gib3.mdl", self.health); + return; + } + +// regular death + sound (self, CHAN_VOICE, "hknight/death1.wav", 1, ATTN_NORM); + if (random() > 0.5) + hknight_die1 (); + else + hknight_dieb1 (); +}; + + +//============================================================================ + +void() hknight_magica1 =[ $magica1, hknight_magica2 ] {ai_face();}; +void() hknight_magica2 =[ $magica2, hknight_magica3 ] {ai_face();}; +void() hknight_magica3 =[ $magica3, hknight_magica4 ] {ai_face();}; +void() hknight_magica4 =[ $magica4, hknight_magica5 ] {ai_face();}; +void() hknight_magica5 =[ $magica5, hknight_magica6 ] {ai_face();}; +void() hknight_magica6 =[ $magica6, hknight_magica7 ] {ai_face();}; +void() hknight_magica7 =[ $magica7, hknight_magica8 ] {hknight_shot(-2);}; +void() hknight_magica8 =[ $magica8, hknight_magica9 ] {hknight_shot(-1);}; +void() hknight_magica9 =[ $magica9, hknight_magica10] {hknight_shot(0);}; +void() hknight_magica10 =[ $magica10, hknight_magica11] {hknight_shot(1);}; +void() hknight_magica11 =[ $magica11, hknight_magica12] {hknight_shot(2);}; +void() hknight_magica12 =[ $magica12, hknight_magica13] {hknight_shot(3);}; +void() hknight_magica13 =[ $magica13, hknight_magica14] {ai_face();}; +void() hknight_magica14 =[ $magica14, hknight_run1 ] {ai_face();}; + +//============================================================================ + +void() hknight_magicb1 =[ $magicb1, hknight_magicb2 ] {ai_face();}; +void() hknight_magicb2 =[ $magicb2, hknight_magicb3 ] {ai_face();}; +void() hknight_magicb3 =[ $magicb3, hknight_magicb4 ] {ai_face();}; +void() hknight_magicb4 =[ $magicb4, hknight_magicb5 ] {ai_face();}; +void() hknight_magicb5 =[ $magicb5, hknight_magicb6 ] {ai_face();}; +void() hknight_magicb6 =[ $magicb6, hknight_magicb7 ] {ai_face();}; +void() hknight_magicb7 =[ $magicb7, hknight_magicb8 ] {hknight_shot(-2);}; +void() hknight_magicb8 =[ $magicb8, hknight_magicb9 ] {hknight_shot(-1);}; +void() hknight_magicb9 =[ $magicb9, hknight_magicb10] {hknight_shot(0);}; +void() hknight_magicb10 =[ $magicb10, hknight_magicb11] {hknight_shot(1);}; +void() hknight_magicb11 =[ $magicb11, hknight_magicb12] {hknight_shot(2);}; +void() hknight_magicb12 =[ $magicb12, hknight_magicb13] {hknight_shot(3);}; +void() hknight_magicb13 =[ $magicb13, hknight_run1] {ai_face();}; + +//============================================================================ + +void() hknight_magicc1 =[ $magicc1, hknight_magicc2 ] {ai_face();}; +void() hknight_magicc2 =[ $magicc2, hknight_magicc3 ] {ai_face();}; +void() hknight_magicc3 =[ $magicc3, hknight_magicc4 ] {ai_face();}; +void() hknight_magicc4 =[ $magicc4, hknight_magicc5 ] {ai_face();}; +void() hknight_magicc5 =[ $magicc5, hknight_magicc6 ] {ai_face();}; +void() hknight_magicc6 =[ $magicc6, hknight_magicc7 ] {hknight_shot(-2);}; +void() hknight_magicc7 =[ $magicc7, hknight_magicc8 ] {hknight_shot(-1);}; +void() hknight_magicc8 =[ $magicc8, hknight_magicc9 ] {hknight_shot(0);}; +void() hknight_magicc9 =[ $magicc9, hknight_magicc10] {hknight_shot(1);}; +void() hknight_magicc10 =[ $magicc10, hknight_magicc11] {hknight_shot(2);}; +void() hknight_magicc11 =[ $magicc11, hknight_run1] {hknight_shot(3);}; + +//=========================================================================== + +void() hknight_char_a1 =[ $char_a1, hknight_char_a2 ] {ai_charge(20);}; +void() hknight_char_a2 =[ $char_a2, hknight_char_a3 ] {ai_charge(25);}; +void() hknight_char_a3 =[ $char_a3, hknight_char_a4 ] {ai_charge(18);}; +void() hknight_char_a4 =[ $char_a4, hknight_char_a5 ] {ai_charge(16);}; +void() hknight_char_a5 =[ $char_a5, hknight_char_a6 ] {ai_charge(14);}; +void() hknight_char_a6 =[ $char_a6, hknight_char_a7 ] {ai_charge(20); ai_melee();}; +void() hknight_char_a7 =[ $char_a7, hknight_char_a8 ] {ai_charge(21); ai_melee();}; +void() hknight_char_a8 =[ $char_a8, hknight_char_a9 ] {ai_charge(13); ai_melee();}; +void() hknight_char_a9 =[ $char_a9, hknight_char_a10 ] {ai_charge(20); ai_melee();}; +void() hknight_char_a10=[ $char_a10, hknight_char_a11 ] {ai_charge(20); ai_melee();}; +void() hknight_char_a11=[ $char_a11, hknight_char_a12 ] {ai_charge(18); ai_melee();}; +void() hknight_char_a12=[ $char_a12, hknight_char_a13 ] {ai_charge(16);}; +void() hknight_char_a13=[ $char_a13, hknight_char_a14 ] {ai_charge(14);}; +void() hknight_char_a14=[ $char_a14, hknight_char_a15 ] {ai_charge(25);}; +void() hknight_char_a15=[ $char_a15, hknight_char_a16 ] {ai_charge(21);}; +void() hknight_char_a16=[ $char_a16, hknight_run1 ] {ai_charge(13);}; + +//=========================================================================== + +void() hknight_char_b1 =[ $char_b1, hknight_char_b2 ] +{CheckContinueCharge (); ai_charge(23); ai_melee();}; +void() hknight_char_b2 =[ $char_b2, hknight_char_b3 ] {ai_charge(17); ai_melee();}; +void() hknight_char_b3 =[ $char_b3, hknight_char_b4 ] {ai_charge(12); ai_melee();}; +void() hknight_char_b4 =[ $char_b4, hknight_char_b5 ] {ai_charge(22); ai_melee();}; +void() hknight_char_b5 =[ $char_b5, hknight_char_b6 ] {ai_charge(18); ai_melee();}; +void() hknight_char_b6 =[ $char_b6, hknight_char_b1 ] {ai_charge(8); ai_melee();}; + +//=========================================================================== + +void() hknight_slice1 =[ $slice1, hknight_slice2 ] {ai_charge(9);}; +void() hknight_slice2 =[ $slice2, hknight_slice3 ] {ai_charge(6);}; +void() hknight_slice3 =[ $slice3, hknight_slice4 ] {ai_charge(13);}; +void() hknight_slice4 =[ $slice4, hknight_slice5 ] {ai_charge(4);}; +void() hknight_slice5 =[ $slice5, hknight_slice6 ] {ai_charge(7); ai_melee();}; +void() hknight_slice6 =[ $slice6, hknight_slice7 ] {ai_charge(15); ai_melee();}; +void() hknight_slice7 =[ $slice7, hknight_slice8 ] {ai_charge(8); ai_melee();}; +void() hknight_slice8 =[ $slice8, hknight_slice9 ] {ai_charge(2); ai_melee();}; +void() hknight_slice9 =[ $slice9, hknight_slice10 ] {ai_melee();}; +void() hknight_slice10 =[ $slice10, hknight_run1 ] {ai_charge(3);}; + +//=========================================================================== + +void() hknight_smash1 =[ $smash1, hknight_smash2 ] {ai_charge(1);}; +void() hknight_smash2 =[ $smash2, hknight_smash3 ] {ai_charge(13);}; +void() hknight_smash3 =[ $smash3, hknight_smash4 ] {ai_charge(9);}; +void() hknight_smash4 =[ $smash4, hknight_smash5 ] {ai_charge(11);}; +void() hknight_smash5 =[ $smash5, hknight_smash6 ] {ai_charge(10); ai_melee();}; +void() hknight_smash6 =[ $smash6, hknight_smash7 ] {ai_charge(7); ai_melee();}; +void() hknight_smash7 =[ $smash7, hknight_smash8 ] {ai_charge(12); ai_melee();}; +void() hknight_smash8 =[ $smash8, hknight_smash9 ] {ai_charge(2); ai_melee();}; +void() hknight_smash9 =[ $smash9, hknight_smash10 ] {ai_charge(3); ai_melee();}; +void() hknight_smash10 =[ $smash10, hknight_smash11 ] {ai_charge(0);}; +void() hknight_smash11 =[ $smash11, hknight_run1 ] {ai_charge(0);}; + +//============================================================================ + +void() hknight_watk1 =[ $w_attack1, hknight_watk2 ] {ai_charge(2);}; +void() hknight_watk2 =[ $w_attack2, hknight_watk3 ] {ai_charge(0);}; +void() hknight_watk3 =[ $w_attack3, hknight_watk4 ] {ai_charge(0);}; +void() hknight_watk4 =[ $w_attack4, hknight_watk5 ] {ai_melee();}; +void() hknight_watk5 =[ $w_attack5, hknight_watk6 ] {ai_melee();}; +void() hknight_watk6 =[ $w_attack6, hknight_watk7 ] {ai_melee();}; +void() hknight_watk7 =[ $w_attack7, hknight_watk8 ] {ai_charge(1);}; +void() hknight_watk8 =[ $w_attack8, hknight_watk9 ] {ai_charge(4);}; +void() hknight_watk9 =[ $w_attack9, hknight_watk10 ] {ai_charge(5);}; +void() hknight_watk10 =[ $w_attack10, hknight_watk11 ] {ai_charge(3); ai_melee();}; +void() hknight_watk11 =[ $w_attack11, hknight_watk12 ] {ai_charge(2); ai_melee();}; +void() hknight_watk12 =[ $w_attack12, hknight_watk13 ] {ai_charge(2); ai_melee();}; +void() hknight_watk13 =[ $w_attack13, hknight_watk14 ] {ai_charge(0);}; +void() hknight_watk14 =[ $w_attack14, hknight_watk15 ] {ai_charge(0);}; +void() hknight_watk15 =[ $w_attack15, hknight_watk16 ] {ai_charge(0);}; +void() hknight_watk16 =[ $w_attack16, hknight_watk17 ] {ai_charge(1);}; +void() hknight_watk17 =[ $w_attack17, hknight_watk18 ] {ai_charge(1); ai_melee();}; +void() hknight_watk18 =[ $w_attack18, hknight_watk19 ] {ai_charge(3); ai_melee();}; +void() hknight_watk19 =[ $w_attack19, hknight_watk20 ] {ai_charge(4); ai_melee();}; +void() hknight_watk20 =[ $w_attack20, hknight_watk21 ] {ai_charge(6);}; +void() hknight_watk21 =[ $w_attack21, hknight_watk22 ] {ai_charge(7);}; +void() hknight_watk22 =[ $w_attack22, hknight_run1 ] {ai_charge(3);}; + +//============================================================================ + +void() hk_idle_sound = +{ + if (random() < 0.2) + sound (self, CHAN_VOICE, "hknight/idle.wav", 1, ATTN_NORM); +}; + +void(entity attacker, float damage) hknight_pain = +{ + if (self.pain_finished > time) + return; + + sound (self, CHAN_VOICE, "hknight/pain1.wav", 1, ATTN_NORM); + + if (time - self.pain_finished > 5) + { // allways go into pain frame if it has been a while + hknight_pain1 (); + self.pain_finished = time + 1; + return; + } + + if ((random()*30 > damage) ) + return; // didn't flinch + + self.pain_finished = time + 1; + hknight_pain1 (); +}; + +float hknight_type; + +void() hknight_melee = +{ + hknight_type = hknight_type + 1; + + sound (self, CHAN_WEAPON, "hknight/slash1.wav", 1, ATTN_NORM); + if (hknight_type == 1) + hknight_slice1 (); + else if (hknight_type == 2) + hknight_smash1 (); + else if (hknight_type == 3) + { + hknight_watk1 (); + hknight_type = 0; + } +}; + +/*QUAKED monster_hell_knight (1 0 0) (-16 -16 -24) (16 16 40) Ambush +*/ +void() monster_hell_knight = +{ + if (deathmatch) + { + remove(self); + return; + } + precache_model2 ("progs/hknight.mdl"); + precache_model2 ("progs/k_spike.mdl"); + precache_model2 ("progs/h_hellkn.mdl"); + + + precache_sound2 ("hknight/attack1.wav"); + precache_sound2 ("hknight/death1.wav"); + precache_sound2 ("hknight/pain1.wav"); + precache_sound2 ("hknight/sight1.wav"); + precache_sound ("hknight/hit.wav"); // used by C code, so don't sound2 + precache_sound2 ("hknight/slash1.wav"); + precache_sound2 ("hknight/idle.wav"); + precache_sound2 ("hknight/grunt.wav"); + + precache_sound ("knight/sword1.wav"); + precache_sound ("knight/sword2.wav"); + + self.solid = SOLID_SLIDEBOX; + self.movetype = MOVETYPE_STEP; + + setmodel (self, "progs/hknight.mdl"); + + setsize (self, '-16 -16 -24', '16 16 40'); + self.health = 250; + + self.th_stand = hknight_stand1; + self.th_walk = hknight_walk1; + self.th_run = hknight_run1; + self.th_melee = hknight_melee; + self.th_missile = hknight_magicc1; + self.th_pain = hknight_pain; + self.th_die = hknight_die; + + walkmonster_start (); +}; diff --git a/src/items.qc b/src/items.qc new file mode 100644 index 0000000..fcf9d85 --- /dev/null +++ b/src/items.qc @@ -0,0 +1,1380 @@ +void() W_SetCurrentAmmo; +/* ALL LIGHTS SHOULD BE 0 1 0 IN COLOR ALL OTHER ITEMS SHOULD +BE .8 .3 .4 IN COLOR */ + + +void() SUB_regen = +{ + self.model = self.mdl; // restore original model + self.solid = SOLID_TRIGGER; // allow it to be touched again + sound (self, CHAN_VOICE, "items/itembk2.wav", 1, ATTN_NORM); // play respawn sound + setorigin (self, self.origin); +}; + + + +/*QUAKED noclass (0 0 0) (-8 -8 -8) (8 8 8) +prints a warning message when spawned +*/ +void() noclass = +{ + dprint ("noclass spawned at"); + dprint (vtos(self.origin)); + dprint ("\n"); + remove (self); +}; + + + +/* +============ +PlaceItem + +plants the object on the floor +============ +*/ +void() PlaceItem = +{ + local float oldz; + + self.mdl = self.model; // so it can be restored on respawn + self.flags = FL_ITEM; // make extra wide + self.solid = SOLID_TRIGGER; + self.movetype = MOVETYPE_TOSS; + self.velocity = '0 0 0'; + self.origin_z = self.origin_z + 6; + oldz = self.origin_z; + if (!droptofloor()) + { + dprint ("Bonus item fell out of level at "); + dprint (vtos(self.origin)); + dprint ("\n"); + remove(self); + return; + } +}; + +/* +============ +StartItem + +Sets the clipping size and plants the object on the floor +============ +*/ +void() StartItem = +{ + self.nextthink = time + 0.2; // items start after other solids + self.think = PlaceItem; +}; + +/* +========================================================================= + +HEALTH BOX + +========================================================================= +*/ +// +// T_Heal: add health to an entity, limiting health to max_health +// "ignore" will ignore max_health limit +// +float (entity e, float healamount, float ignore) T_Heal = +{ + if (e.health <= 0) + return 0; + if ((!ignore) && (e.health >= other.max_health)) + return 0; + healamount = ceil(healamount); + + e.health = e.health + healamount; + if ((!ignore) && (e.health >= other.max_health)) + e.health = other.max_health; + + if (e.health > 250) + e.health = 250; + return 1; +}; + +/*QUAKED item_health (.3 .3 1) (0 0 0) (32 32 32) rotten megahealth +Health box. Normally gives 25 points. +Rotten box heals 5-10 points, +megahealth will add 100 health, then +rot you down to your maximum health limit, +one point per second. +*/ + +float H_ROTTEN = 1; +float H_MEGA = 2; +.float healamount, healtype; +void() health_touch; +void() item_megahealth_rot; + +void() item_health = +{ + self.touch = health_touch; + + if (self.spawnflags & H_ROTTEN) + { + precache_model("maps/b_bh10.bsp"); + + precache_sound("items/r_item1.wav"); + setmodel(self, "maps/b_bh10.bsp"); + self.noise = "items/r_item1.wav"; + self.healamount = 15; + self.healtype = 0; + } + else + if (self.spawnflags & H_MEGA) + { + precache_model("maps/b_bh100.bsp"); + precache_sound("items/r_item2.wav"); + setmodel(self, "maps/b_bh100.bsp"); + self.noise = "items/r_item2.wav"; + self.healamount = 100; + self.healtype = 2; + } + else + { + precache_model("maps/b_bh25.bsp"); + precache_sound("items/health1.wav"); + setmodel(self, "maps/b_bh25.bsp"); + self.noise = "items/health1.wav"; + self.healamount = 25; + self.healtype = 1; + } + setsize (self, '0 0 0', '32 32 56'); + StartItem (); +}; + + +void() health_touch = +{ + local float amount; + local string s; + + if (other.classname != "player") + return; + + if (self.healtype == 2) // Megahealth? Ignore max_health... + { + if (other.health >= 250) + return; + if (!T_Heal(other, self.healamount, 1)) + return; + } + else + { + if (!T_Heal(other, self.healamount, 0)) + return; + } + + sprint(other, "You receive "); + s = ftos(self.healamount); + sprint(other, s); + sprint(other, " health\n"); + +// health touch sound + sound(other, CHAN_ITEM, self.noise, 1, ATTN_NORM); + + stuffcmd (other, "bf\n"); + + self.model = string_null; + self.solid = SOLID_NOT; + + // Megahealth = rot down the player's super health + if (self.healtype == 2) + { + other.items = other.items | IT_SUPERHEALTH; + self.nextthink = time + 5; + self.think = item_megahealth_rot; + self.owner = other; + } + else + { + if (deathmatch != 2) // deathmatch 2 is the silly old rules + { + if (deathmatch) + self.nextthink = time + 20; + self.think = SUB_regen; + } + } + + activator = other; + SUB_UseTargets(); // fire all targets / killtargets +}; + +void() item_megahealth_rot = +{ + other = self.owner; + + if (other.health > other.max_health) + { + other.health = other.health - 1; + self.nextthink = time + 1; + return; + } + +// it is possible for a player to die and respawn between rots, so don't +// just blindly subtract the flag off + other.items = other.items - (other.items & IT_SUPERHEALTH); + + if (deathmatch == 1) // deathmatch 2 is silly old rules + { + self.nextthink = time + 20; + self.think = SUB_regen; + } +}; + +/* +=============================================================================== + +ARMOR + +=============================================================================== +*/ + +void() armor_touch; + +void() armor_touch = +{ + local float type, value, bit; + + if (other.health <= 0) + return; + if (other.classname != "player") + return; + + if (self.classname == "item_armor1") + { + type = 0.3; + value = 100; + bit = IT_ARMOR1; + } + if (self.classname == "item_armor2") + { + type = 0.6; + value = 150; + bit = IT_ARMOR2; + } + if (self.classname == "item_armorInv") + { + type = 0.8; + value = 200; + bit = IT_ARMOR3; + } + if (other.armortype*other.armorvalue >= type*value) + return; + + other.armortype = type; + other.armorvalue = value; + other.items = other.items - (other.items & (IT_ARMOR1 | IT_ARMOR2 | IT_ARMOR3)) + bit; + + self.solid = SOLID_NOT; + self.model = string_null; + if (deathmatch == 1) + self.nextthink = time + 20; + self.think = SUB_regen; + + sprint(other, "You got armor\n"); +// armor touch sound + sound(other, CHAN_ITEM, "items/armor1.wav", 1, ATTN_NORM); + stuffcmd (other, "bf\n"); + + activator = other; + SUB_UseTargets(); // fire all targets / killtargets +}; + + +/*QUAKED item_armor1 (0 .5 .8) (-16 -16 0) (16 16 32) +*/ + +void() item_armor1 = +{ + self.touch = armor_touch; + precache_model ("progs/armor.mdl"); + setmodel (self, "progs/armor.mdl"); + self.skin = 0; + setsize (self, '-16 -16 0', '16 16 56'); + StartItem (); +}; + +/*QUAKED item_armor2 (0 .5 .8) (-16 -16 0) (16 16 32) +*/ + +void() item_armor2 = +{ + self.touch = armor_touch; + precache_model ("progs/armor.mdl"); + setmodel (self, "progs/armor.mdl"); + self.skin = 1; + setsize (self, '-16 -16 0', '16 16 56'); + StartItem (); +}; + +/*QUAKED item_armorInv (0 .5 .8) (-16 -16 0) (16 16 32) +*/ + +void() item_armorInv = +{ + self.touch = armor_touch; + precache_model ("progs/armor.mdl"); + setmodel (self, "progs/armor.mdl"); + self.skin = 2; + setsize (self, '-16 -16 0', '16 16 56'); + StartItem (); +}; + +/* +=============================================================================== + +WEAPONS + +=============================================================================== +*/ + +void() bound_other_ammo = +{ + if (other.ammo_shells > 100) + other.ammo_shells = 100; + if (other.ammo_nails > 200) + other.ammo_nails = 200; + if (other.ammo_rockets > 100) + other.ammo_rockets = 100; + if (other.ammo_cells > 100) + other.ammo_cells = 100; +}; + + +float(float w) RankForWeapon = +{ + if (w == IT_LIGHTNING) + return 1; + if (w == IT_ROCKET_LAUNCHER) + return 2; + if (w == IT_SUPER_NAILGUN) + return 3; + if (w == IT_GRENADE_LAUNCHER) + return 4; + if (w == IT_SUPER_SHOTGUN) + return 5; + if (w == IT_NAILGUN) + return 6; + return 7; +}; + +/* +============= +Deathmatch_Weapon + +Deathmatch weapon change rules for picking up a weapon + +.float ammo_shells, ammo_nails, ammo_rockets, ammo_cells; +============= +*/ +void(float old, float new) Deathmatch_Weapon = +{ + local float or, nr; + +// change self.weapon if desired + or = RankForWeapon (self.weapon); + nr = RankForWeapon (new); + if ( nr < or ) + self.weapon = new; +}; + +/* +============= +weapon_touch +============= +*/ +float() W_BestWeapon; + +void() weapon_touch = +{ + local float hadammo, best, new, old; + local entity stemp; + local float leave; + + if (!(other.flags & FL_CLIENT)) + return; + +// if the player was using his best weapon, change up to the new one if better + stemp = self; + self = other; + best = W_BestWeapon(); + self = stemp; + + if (deathmatch == 2 || coop) + leave = 1; + else + leave = 0; + + if (self.classname == "weapon_nailgun") + { + if (leave && (other.items & IT_NAILGUN) ) + return; + hadammo = other.ammo_nails; + new = IT_NAILGUN; + other.ammo_nails = other.ammo_nails + 30; + } + else if (self.classname == "weapon_supernailgun") + { + if (leave && (other.items & IT_SUPER_NAILGUN) ) + return; + hadammo = other.ammo_rockets; + new = IT_SUPER_NAILGUN; + other.ammo_nails = other.ammo_nails + 30; + } + else if (self.classname == "weapon_supershotgun") + { + if (leave && (other.items & IT_SUPER_SHOTGUN) ) + return; + hadammo = other.ammo_rockets; + new = IT_SUPER_SHOTGUN; + other.ammo_shells = other.ammo_shells + 5; + } + else if (self.classname == "weapon_rocketlauncher") + { + if (leave && (other.items & IT_ROCKET_LAUNCHER) ) + return; + hadammo = other.ammo_rockets; + new = IT_ROCKET_LAUNCHER; + other.ammo_rockets = other.ammo_rockets + 5; + } + else if (self.classname == "weapon_grenadelauncher") + { + if (leave && (other.items & IT_GRENADE_LAUNCHER) ) + return; + hadammo = other.ammo_rockets; + new = IT_GRENADE_LAUNCHER; + other.ammo_rockets = other.ammo_rockets + 5; + } + else if (self.classname == "weapon_lightning") + { + if (leave && (other.items & IT_LIGHTNING) ) + return; + hadammo = other.ammo_rockets; + new = IT_LIGHTNING; + other.ammo_cells = other.ammo_cells + 15; + } + else + objerror ("weapon_touch: unknown classname"); + + sprint (other, "You got the "); + sprint (other, self.netname); + sprint (other, "\n"); +// weapon touch sound + sound (other, CHAN_ITEM, "weapons/pkup.wav", 1, ATTN_NORM); + stuffcmd (other, "bf\n"); + + bound_other_ammo (); + +// change to the weapon + old = other.items; + other.items = other.items | new; + + stemp = self; + self = other; + + if (!deathmatch) + self.weapon = new; + else + Deathmatch_Weapon (old, new); + + W_SetCurrentAmmo(); + + self = stemp; + + if (leave) + return; + +// remove it in single player, or setup for respawning in deathmatch + self.model = string_null; + self.solid = SOLID_NOT; + if (deathmatch == 1) + self.nextthink = time + 30; + self.think = SUB_regen; + + activator = other; + SUB_UseTargets(); // fire all targets / killtargets +}; + + +/*QUAKED weapon_supershotgun (0 .5 .8) (-16 -16 0) (16 16 32) +*/ + +void() weapon_supershotgun = +{ + precache_model ("progs/g_shot.mdl"); + setmodel (self, "progs/g_shot.mdl"); + self.weapon = IT_SUPER_SHOTGUN; + self.netname = "Double-barrelled Shotgun"; + self.touch = weapon_touch; + setsize (self, '-16 -16 0', '16 16 56'); + StartItem (); +}; + +/*QUAKED weapon_nailgun (0 .5 .8) (-16 -16 0) (16 16 32) +*/ + +void() weapon_nailgun = +{ + precache_model ("progs/g_nail.mdl"); + setmodel (self, "progs/g_nail.mdl"); + self.weapon = IT_NAILGUN; + self.netname = "nailgun"; + self.touch = weapon_touch; + setsize (self, '-16 -16 0', '16 16 56'); + StartItem (); +}; + +/*QUAKED weapon_supernailgun (0 .5 .8) (-16 -16 0) (16 16 32) +*/ + +void() weapon_supernailgun = +{ + precache_model ("progs/g_nail2.mdl"); + setmodel (self, "progs/g_nail2.mdl"); + self.weapon = IT_SUPER_NAILGUN; + self.netname = "Super Nailgun"; + self.touch = weapon_touch; + setsize (self, '-16 -16 0', '16 16 56'); + StartItem (); +}; + +/*QUAKED weapon_grenadelauncher (0 .5 .8) (-16 -16 0) (16 16 32) +*/ + +void() weapon_grenadelauncher = +{ + precache_model ("progs/g_rock.mdl"); + setmodel (self, "progs/g_rock.mdl"); + self.weapon = 3; + self.netname = "Grenade Launcher"; + self.touch = weapon_touch; + setsize (self, '-16 -16 0', '16 16 56'); + StartItem (); +}; + +/*QUAKED weapon_rocketlauncher (0 .5 .8) (-16 -16 0) (16 16 32) +*/ + +void() weapon_rocketlauncher = +{ + precache_model ("progs/g_rock2.mdl"); + setmodel (self, "progs/g_rock2.mdl"); + self.weapon = 3; + self.netname = "Rocket Launcher"; + self.touch = weapon_touch; + setsize (self, '-16 -16 0', '16 16 56'); + StartItem (); +}; + + +/*QUAKED weapon_lightning (0 .5 .8) (-16 -16 0) (16 16 32) +*/ + +void() weapon_lightning = +{ + precache_model ("progs/g_light.mdl"); + setmodel (self, "progs/g_light.mdl"); + self.weapon = 3; + self.netname = "Thunderbolt"; + self.touch = weapon_touch; + setsize (self, '-16 -16 0', '16 16 56'); + StartItem (); +}; + + +/* +=============================================================================== + +AMMO + +=============================================================================== +*/ + +void() ammo_touch = +{ +local entity stemp; +local float best; + + if (other.classname != "player") + return; + if (other.health <= 0) + return; + +// if the player was using his best weapon, change up to the new one if better + stemp = self; + self = other; + best = W_BestWeapon(); + self = stemp; + + +// shotgun + if (self.weapon == 1) + { + if (other.ammo_shells >= 100) + return; + other.ammo_shells = other.ammo_shells + self.aflag; + } + +// spikes + if (self.weapon == 2) + { + if (other.ammo_nails >= 200) + return; + other.ammo_nails = other.ammo_nails + self.aflag; + } + +// rockets + if (self.weapon == 3) + { + if (other.ammo_rockets >= 100) + return; + other.ammo_rockets = other.ammo_rockets + self.aflag; + } + +// cells + if (self.weapon == 4) + { + if (other.ammo_cells >= 100) + return; + other.ammo_cells = other.ammo_cells + self.aflag; + } + + bound_other_ammo (); + + sprint (other, "You got the "); + sprint (other, self.netname); + sprint (other, "\n"); +// ammo touch sound + sound (other, CHAN_ITEM, "weapons/lock4.wav", 1, ATTN_NORM); + stuffcmd (other, "bf\n"); + +// change to a better weapon if appropriate + + if ( other.weapon == best ) + { + stemp = self; + self = other; + self.weapon = W_BestWeapon(); + W_SetCurrentAmmo (); + self = stemp; + } + +// if changed current ammo, update it + stemp = self; + self = other; + W_SetCurrentAmmo(); + self = stemp; + +// remove it in single player, or setup for respawning in deathmatch + self.model = string_null; + self.solid = SOLID_NOT; + if (deathmatch == 1) + self.nextthink = time + 30; + self.think = SUB_regen; + + activator = other; + SUB_UseTargets(); // fire all targets / killtargets +}; + + + + +float WEAPON_BIG2 = 1; + +/*QUAKED item_shells (0 .5 .8) (0 0 0) (32 32 32) big +*/ + +void() item_shells = +{ + self.touch = ammo_touch; + + if (self.spawnflags & WEAPON_BIG2) + { + precache_model ("maps/b_shell1.bsp"); + setmodel (self, "maps/b_shell1.bsp"); + self.aflag = 40; + } + else + { + precache_model ("maps/b_shell0.bsp"); + setmodel (self, "maps/b_shell0.bsp"); + self.aflag = 20; + } + self.weapon = 1; + self.netname = "shells"; + setsize (self, '0 0 0', '32 32 56'); + StartItem (); +}; + +/*QUAKED item_spikes (0 .5 .8) (0 0 0) (32 32 32) big +*/ + +void() item_spikes = +{ + self.touch = ammo_touch; + + if (self.spawnflags & WEAPON_BIG2) + { + precache_model ("maps/b_nail1.bsp"); + setmodel (self, "maps/b_nail1.bsp"); + self.aflag = 50; + } + else + { + precache_model ("maps/b_nail0.bsp"); + setmodel (self, "maps/b_nail0.bsp"); + self.aflag = 25; + } + self.weapon = 2; + self.netname = "nails"; + setsize (self, '0 0 0', '32 32 56'); + StartItem (); +}; + +/*QUAKED item_rockets (0 .5 .8) (0 0 0) (32 32 32) big +*/ + +void() item_rockets = +{ + self.touch = ammo_touch; + + if (self.spawnflags & WEAPON_BIG2) + { + precache_model ("maps/b_rock1.bsp"); + setmodel (self, "maps/b_rock1.bsp"); + self.aflag = 10; + } + else + { + precache_model ("maps/b_rock0.bsp"); + setmodel (self, "maps/b_rock0.bsp"); + self.aflag = 5; + } + self.weapon = 3; + self.netname = "rockets"; + setsize (self, '0 0 0', '32 32 56'); + StartItem (); +}; + + +/*QUAKED item_cells (0 .5 .8) (0 0 0) (32 32 32) big +*/ + +void() item_cells = +{ + self.touch = ammo_touch; + + if (self.spawnflags & WEAPON_BIG2) + { + precache_model ("maps/b_batt1.bsp"); + setmodel (self, "maps/b_batt1.bsp"); + self.aflag = 12; + } + else + { + precache_model ("maps/b_batt0.bsp"); + setmodel (self, "maps/b_batt0.bsp"); + self.aflag = 6; + } + self.weapon = 4; + self.netname = "cells"; + setsize (self, '0 0 0', '32 32 56'); + StartItem (); +}; + + +/*QUAKED item_weapon (0 .5 .8) (0 0 0) (32 32 32) shotgun rocket spikes big +DO NOT USE THIS!!!! IT WILL BE REMOVED! +*/ + +float WEAPON_SHOTGUN = 1; +float WEAPON_ROCKET = 2; +float WEAPON_SPIKES = 4; +float WEAPON_BIG = 8; +void() item_weapon = +{ + self.touch = ammo_touch; + + if (self.spawnflags & WEAPON_SHOTGUN) + { + if (self.spawnflags & WEAPON_BIG) + { + precache_model ("maps/b_shell1.bsp"); + setmodel (self, "maps/b_shell1.bsp"); + self.aflag = 40; + } + else + { + precache_model ("maps/b_shell0.bsp"); + setmodel (self, "maps/b_shell0.bsp"); + self.aflag = 20; + } + self.weapon = 1; + self.netname = "shells"; + } + + if (self.spawnflags & WEAPON_SPIKES) + { + if (self.spawnflags & WEAPON_BIG) + { + precache_model ("maps/b_nail1.bsp"); + setmodel (self, "maps/b_nail1.bsp"); + self.aflag = 40; + } + else + { + precache_model ("maps/b_nail0.bsp"); + setmodel (self, "maps/b_nail0.bsp"); + self.aflag = 20; + } + self.weapon = 2; + self.netname = "spikes"; + } + + if (self.spawnflags & WEAPON_ROCKET) + { + if (self.spawnflags & WEAPON_BIG) + { + precache_model ("maps/b_rock1.bsp"); + setmodel (self, "maps/b_rock1.bsp"); + self.aflag = 10; + } + else + { + precache_model ("maps/b_rock0.bsp"); + setmodel (self, "maps/b_rock0.bsp"); + self.aflag = 5; + } + self.weapon = 3; + self.netname = "rockets"; + } + + setsize (self, '0 0 0', '32 32 56'); + StartItem (); +}; + + +/* +=============================================================================== + +KEYS + +=============================================================================== +*/ + +void() key_touch = +{ +local entity stemp; +local float best; + + if (other.classname != "player") + return; + if (other.health <= 0) + return; + if (other.items & self.items) + return; + + sprint (other, "You got the "); + sprint (other, self.netname); + sprint (other,"\n"); + + sound (other, CHAN_ITEM, self.noise, 1, ATTN_NORM); + stuffcmd (other, "bf\n"); + other.items = other.items | self.items; + + if (!coop) + { + self.solid = SOLID_NOT; + self.model = string_null; + } + + activator = other; + SUB_UseTargets(); // fire all targets / killtargets +}; + + +void() key_setsounds = +{ + if (world.worldtype == 0) + { + precache_sound ("misc/medkey.wav"); + self.noise = "misc/medkey.wav"; + } + if (world.worldtype == 1) + { + precache_sound ("misc/runekey.wav"); + self.noise = "misc/runekey.wav"; + } + if (world.worldtype == 2) + { + precache_sound2 ("misc/basekey.wav"); + self.noise = "misc/basekey.wav"; + } +}; + +/*QUAKED item_key1 (0 .5 .8) (-16 -16 -24) (16 16 32) +SILVER key +In order for keys to work +you MUST set your maps +worldtype to one of the +following: +0: medieval +1: metal +2: base +*/ + +void() item_key1 = +{ + if (world.worldtype == 0) + { + precache_model ("progs/w_s_key.mdl"); + setmodel (self, "progs/w_s_key.mdl"); + self.netname = "silver key"; + } + else if (world.worldtype == 1) + { + precache_model ("progs/m_s_key.mdl"); + setmodel (self, "progs/m_s_key.mdl"); + self.netname = "silver runekey"; + } + else if (world.worldtype == 2) + { + precache_model2 ("progs/b_s_key.mdl"); + setmodel (self, "progs/b_s_key.mdl"); + self.netname = "silver keycard"; + } + key_setsounds(); + self.touch = key_touch; + self.items = IT_KEY1; + setsize (self, '-16 -16 -24', '16 16 32'); + StartItem (); +}; + +/*QUAKED item_key2 (0 .5 .8) (-16 -16 -24) (16 16 32) +GOLD key +In order for keys to work +you MUST set your maps +worldtype to one of the +following: +0: medieval +1: metal +2: base +*/ + +void() item_key2 = +{ + if (world.worldtype == 0) + { + precache_model ("progs/w_g_key.mdl"); + setmodel (self, "progs/w_g_key.mdl"); + self.netname = "gold key"; + } + if (world.worldtype == 1) + { + precache_model ("progs/m_g_key.mdl"); + setmodel (self, "progs/m_g_key.mdl"); + self.netname = "gold runekey"; + } + if (world.worldtype == 2) + { + precache_model2 ("progs/b_g_key.mdl"); + setmodel (self, "progs/b_g_key.mdl"); + self.netname = "gold keycard"; + } + key_setsounds(); + self.touch = key_touch; + self.items = IT_KEY2; + setsize (self, '-16 -16 -24', '16 16 32'); + StartItem (); +}; + + + +/* +=============================================================================== + +END OF LEVEL RUNES + +=============================================================================== +*/ + +void() sigil_touch = +{ +local entity stemp; +local float best; + + if (other.classname != "player") + return; + if (other.health <= 0) + return; + + centerprint (other, "You got the rune!"); + + sound (other, CHAN_ITEM, self.noise, 1, ATTN_NORM); + stuffcmd (other, "bf\n"); + self.solid = SOLID_NOT; + self.model = string_null; + serverflags = serverflags | (self.spawnflags & 15); + self.classname = ""; // so rune doors won't find it + + activator = other; + SUB_UseTargets(); // fire all targets / killtargets +}; + + +/*QUAKED item_sigil (0 .5 .8) (-16 -16 -24) (16 16 32) E1 E2 E3 E4 +End of level sigil, pick up to end episode and return to jrstart. +*/ + +void() item_sigil = +{ + if (!self.spawnflags) + objerror ("no spawnflags"); + + precache_sound ("misc/runekey.wav"); + self.noise = "misc/runekey.wav"; + + if (self.spawnflags & 1) + { + precache_model ("progs/end1.mdl"); + setmodel (self, "progs/end1.mdl"); + } + if (self.spawnflags & 2) + { + precache_model2 ("progs/end2.mdl"); + setmodel (self, "progs/end2.mdl"); + } + if (self.spawnflags & 4) + { + precache_model2 ("progs/end3.mdl"); + setmodel (self, "progs/end3.mdl"); + } + if (self.spawnflags & 8) + { + precache_model2 ("progs/end4.mdl"); + setmodel (self, "progs/end4.mdl"); + } + + self.touch = sigil_touch; + setsize (self, '-16 -16 -24', '16 16 32'); + StartItem (); +}; + +/* +=============================================================================== + +POWERUPS + +=============================================================================== +*/ + +void() powerup_touch; + + +void() powerup_touch = +{ +local entity stemp; +local float best; + + if (other.classname != "player") + return; + if (other.health <= 0) + return; + + sprint (other, "You got the "); + sprint (other, self.netname); + sprint (other,"\n"); + + if (deathmatch) + { + self.mdl = self.model; + + if ((self.classname == "item_artifact_invulnerability") || + (self.classname == "item_artifact_invisibility")) + self.nextthink = time + 60*5; + else + self.nextthink = time + 60; + + self.think = SUB_regen; + } + + sound (other, CHAN_VOICE, self.noise, 1, ATTN_NORM); + stuffcmd (other, "bf\n"); + self.solid = SOLID_NOT; + other.items = other.items | self.items; + self.model = string_null; + +// do the apropriate action + if (self.classname == "item_artifact_envirosuit") + { + other.rad_time = 1; + other.radsuit_finished = time + 30; + } + + if (self.classname == "item_artifact_invulnerability") + { + other.invincible_time = 1; + other.invincible_finished = time + 30; + } + + if (self.classname == "item_artifact_invisibility") + { + other.invisible_time = 1; + other.invisible_finished = time + 30; + } + + if (self.classname == "item_artifact_super_damage") + { + other.super_time = 1; + other.super_damage_finished = time + 30; + } + + activator = other; + SUB_UseTargets(); // fire all targets / killtargets +}; + + + +/*QUAKED item_artifact_invulnerability (0 .5 .8) (-16 -16 -24) (16 16 32) +Player is invulnerable for 30 seconds +*/ +void() item_artifact_invulnerability = +{ + self.touch = powerup_touch; + + precache_model ("progs/invulner.mdl"); + precache_sound ("items/protect.wav"); + precache_sound ("items/protect2.wav"); + precache_sound ("items/protect3.wav"); + self.noise = "items/protect.wav"; + setmodel (self, "progs/invulner.mdl"); + self.netname = "Pentagram of Protection"; + self.items = IT_INVULNERABILITY; + setsize (self, '-16 -16 -24', '16 16 32'); + StartItem (); +}; + +/*QUAKED item_artifact_envirosuit (0 .5 .8) (-16 -16 -24) (16 16 32) +Player takes no damage from water or slime for 30 seconds +*/ +void() item_artifact_envirosuit = +{ + self.touch = powerup_touch; + + precache_model ("progs/suit.mdl"); + precache_sound ("items/suit.wav"); + precache_sound ("items/suit2.wav"); + self.noise = "items/suit.wav"; + setmodel (self, "progs/suit.mdl"); + self.netname = "Biosuit"; + self.items = IT_SUIT; + setsize (self, '-16 -16 -24', '16 16 32'); + StartItem (); +}; + + +/*QUAKED item_artifact_invisibility (0 .5 .8) (-16 -16 -24) (16 16 32) +Player is invisible for 30 seconds +*/ +void() item_artifact_invisibility = +{ + self.touch = powerup_touch; + + precache_model ("progs/invisibl.mdl"); + precache_sound ("items/inv1.wav"); + precache_sound ("items/inv2.wav"); + precache_sound ("items/inv3.wav"); + self.noise = "items/inv1.wav"; + setmodel (self, "progs/invisibl.mdl"); + self.netname = "Ring of Shadows"; + self.items = IT_INVISIBILITY; + setsize (self, '-16 -16 -24', '16 16 32'); + StartItem (); +}; + + +/*QUAKED item_artifact_super_damage (0 .5 .8) (-16 -16 -24) (16 16 32) +The next attack from the player will do 4x damage +*/ +void() item_artifact_super_damage = +{ + self.touch = powerup_touch; + + precache_model ("progs/quaddama.mdl"); + precache_sound ("items/damage.wav"); + precache_sound ("items/damage2.wav"); + precache_sound ("items/damage3.wav"); + self.noise = "items/damage.wav"; + setmodel (self, "progs/quaddama.mdl"); + self.netname = "Quad Damage"; + self.items = IT_QUAD; + setsize (self, '-16 -16 -24', '16 16 32'); + StartItem (); +}; + + + +/* +=============================================================================== + +PLAYER BACKPACKS + +=============================================================================== +*/ + +void() BackpackTouch = +{ + local string s; + local float best, old, new; + local entity stemp; + local float acount; + + if (other.classname != "player") + return; + if (other.health <= 0) + return; + + acount = 0; + sprint (other, "You get "); + + if (self.items) + if ((other.items & self.items) == 0) + { + acount = 1; + sprint (other, "the "); + sprint (other, self.netname); + } + +// if the player was using his best weapon, change up to the new one if better + stemp = self; + self = other; + best = W_BestWeapon(); + self = stemp; + +// change weapons + other.ammo_shells = other.ammo_shells + self.ammo_shells; + other.ammo_nails = other.ammo_nails + self.ammo_nails; + other.ammo_rockets = other.ammo_rockets + self.ammo_rockets; + other.ammo_cells = other.ammo_cells + self.ammo_cells; + + new = self.items; + if (!new) + new = other.weapon; + old = other.items; + other.items = other.items | new; + + bound_other_ammo (); + + if (self.ammo_shells) + { + if (acount) + sprint(other, ", "); + acount = 1; + s = ftos(self.ammo_shells); + sprint (other, s); + sprint (other, " shells"); + } + if (self.ammo_nails) + { + if (acount) + sprint(other, ", "); + acount = 1; + s = ftos(self.ammo_nails); + sprint (other, s); + sprint (other, " nails"); + } + if (self.ammo_rockets) + { + if (acount) + sprint(other, ", "); + acount = 1; + s = ftos(self.ammo_rockets); + sprint (other, s); + sprint (other, " rockets"); + } + if (self.ammo_cells) + { + if (acount) + sprint(other, ", "); + acount = 1; + s = ftos(self.ammo_cells); + sprint (other, s); + sprint (other, " cells"); + } + + sprint (other, "\n"); +// backpack touch sound + sound (other, CHAN_ITEM, "weapons/lock4.wav", 1, ATTN_NORM); + stuffcmd (other, "bf\n"); + +// remove the backpack, change self to the player + remove(self); + self = other; + +// change to the weapon + if (!deathmatch) + self.weapon = new; + else + Deathmatch_Weapon (old, new); + + W_SetCurrentAmmo (); +}; + +/* +=============== +DropBackpack +=============== +*/ +void() DropBackpack = +{ + local entity item; + + if (!(self.ammo_shells + self.ammo_nails + self.ammo_rockets + self.ammo_cells)) + return; // nothing in it + + item = spawn(); + item.origin = self.origin - '0 0 24'; + + item.items = self.weapon; + if (item.items == IT_AXE) + item.netname = "Axe"; + else if (item.items == IT_SHOTGUN) + item.netname = "Shotgun"; + else if (item.items == IT_SUPER_SHOTGUN) + item.netname = "Double-barrelled Shotgun"; + else if (item.items == IT_NAILGUN) + item.netname = "Nailgun"; + else if (item.items == IT_SUPER_NAILGUN) + item.netname = "Super Nailgun"; + else if (item.items == IT_GRENADE_LAUNCHER) + item.netname = "Grenade Launcher"; + else if (item.items == IT_ROCKET_LAUNCHER) + item.netname = "Rocket Launcher"; + else if (item.items == IT_LIGHTNING) + item.netname = "Thunderbolt"; + else + item.netname = ""; + + item.ammo_shells = self.ammo_shells; + item.ammo_nails = self.ammo_nails; + item.ammo_rockets = self.ammo_rockets; + item.ammo_cells = self.ammo_cells; + + item.velocity_z = 300; + item.velocity_x = -100 + (random() * 200); + item.velocity_y = -100 + (random() * 200); + + item.flags = FL_ITEM; + item.solid = SOLID_TRIGGER; + item.movetype = MOVETYPE_TOSS; + setmodel (item, "progs/backpack.mdl"); + setsize (item, '-16 -16 0', '16 16 56'); + item.touch = BackpackTouch; + + item.nextthink = time + 120; // remove after 2 minutes + item.think = SUB_Remove; +}; diff --git a/src/knight.qc b/src/knight.qc new file mode 100644 index 0000000..5b160c7 --- /dev/null +++ b/src/knight.qc @@ -0,0 +1,270 @@ +/* +============================================================================== + +KNIGHT + +============================================================================== +*/ + +$cd id1/models/knight +$origin 0 0 24 +$base base +$skin badass3 + +$frame stand1 stand2 stand3 stand4 stand5 stand6 stand7 stand8 stand9 + +$frame runb1 runb2 runb3 runb4 runb5 runb6 runb7 runb8 + +//frame runc1 runc2 runc3 runc4 runc5 runc6 + +$frame runattack1 runattack2 runattack3 runattack4 runattack5 +$frame runattack6 runattack7 runattack8 runattack9 runattack10 +$frame runattack11 + +$frame pain1 pain2 pain3 + +$frame painb1 painb2 painb3 painb4 painb5 painb6 painb7 painb8 painb9 +$frame painb10 painb11 + +//frame attack1 attack2 attack3 attack4 attack5 attack6 attack7 +//frame attack8 attack9 attack10 attack11 + +$frame attackb1 attackb1 attackb2 attackb3 attackb4 attackb5 +$frame attackb6 attackb7 attackb8 attackb9 attackb10 + +$frame walk1 walk2 walk3 walk4 walk5 walk6 walk7 walk8 walk9 +$frame walk10 walk11 walk12 walk13 walk14 + +$frame kneel1 kneel2 kneel3 kneel4 kneel5 + +$frame standing2 standing3 standing4 standing5 + +$frame death1 death2 death3 death4 death5 death6 death7 death8 +$frame death9 death10 + +$frame deathb1 deathb2 deathb3 deathb4 deathb5 deathb6 deathb7 deathb8 +$frame deathb9 deathb10 deathb11 + +void() knight_stand1 =[ $stand1, knight_stand2 ] {ai_stand();}; +void() knight_stand2 =[ $stand2, knight_stand3 ] {ai_stand();}; +void() knight_stand3 =[ $stand3, knight_stand4 ] {ai_stand();}; +void() knight_stand4 =[ $stand4, knight_stand5 ] {ai_stand();}; +void() knight_stand5 =[ $stand5, knight_stand6 ] {ai_stand();}; +void() knight_stand6 =[ $stand6, knight_stand7 ] {ai_stand();}; +void() knight_stand7 =[ $stand7, knight_stand8 ] {ai_stand();}; +void() knight_stand8 =[ $stand8, knight_stand9 ] {ai_stand();}; +void() knight_stand9 =[ $stand9, knight_stand1 ] {ai_stand();}; + +void() knight_walk1 =[ $walk1, knight_walk2 ] { +if (random() < 0.2) + sound (self, CHAN_VOICE, "knight/idle.wav", 1, ATTN_IDLE); +ai_walk(3);}; +void() knight_walk2 =[ $walk2, knight_walk3 ] {ai_walk(2);}; +void() knight_walk3 =[ $walk3, knight_walk4 ] {ai_walk(3);}; +void() knight_walk4 =[ $walk4, knight_walk5 ] {ai_walk(4);}; +void() knight_walk5 =[ $walk5, knight_walk6 ] {ai_walk(3);}; +void() knight_walk6 =[ $walk6, knight_walk7 ] {ai_walk(3);}; +void() knight_walk7 =[ $walk7, knight_walk8 ] {ai_walk(3);}; +void() knight_walk8 =[ $walk8, knight_walk9 ] {ai_walk(4);}; +void() knight_walk9 =[ $walk9, knight_walk10 ] {ai_walk(3);}; +void() knight_walk10 =[ $walk10, knight_walk11 ] {ai_walk(3);}; +void() knight_walk11 =[ $walk11, knight_walk12 ] {ai_walk(2);}; +void() knight_walk12 =[ $walk12, knight_walk13 ] {ai_walk(3);}; +void() knight_walk13 =[ $walk13, knight_walk14 ] {ai_walk(4);}; +void() knight_walk14 =[ $walk14, knight_walk1 ] {ai_walk(3);}; + + +void() knight_run1 =[ $runb1, knight_run2 ] { +if (random() < 0.2) + sound (self, CHAN_VOICE, "knight/idle.wav", 1, ATTN_IDLE); +ai_run(16);}; +void() knight_run2 =[ $runb2, knight_run3 ] {ai_run(20);}; +void() knight_run3 =[ $runb3, knight_run4 ] {ai_run(13);}; +void() knight_run4 =[ $runb4, knight_run5 ] {ai_run(7);}; +void() knight_run5 =[ $runb5, knight_run6 ] {ai_run(16);}; +void() knight_run6 =[ $runb6, knight_run7 ] {ai_run(20);}; +void() knight_run7 =[ $runb7, knight_run8 ] {ai_run(14);}; +void() knight_run8 =[ $runb8, knight_run1 ] {ai_run(6);}; + + +void() knight_runatk1 =[ $runattack1, knight_runatk2 ] +{ +if (random() > 0.5) + sound (self, CHAN_WEAPON, "knight/sword2.wav", 1, ATTN_NORM); +else + sound (self, CHAN_WEAPON, "knight/sword1.wav", 1, ATTN_NORM); +ai_charge(20); +}; +void() knight_runatk2 =[ $runattack2, knight_runatk3 ] {ai_charge_side();}; +void() knight_runatk3 =[ $runattack3, knight_runatk4 ] {ai_charge_side();}; +void() knight_runatk4 =[ $runattack4, knight_runatk5 ] {ai_charge_side();}; +void() knight_runatk5 =[ $runattack5, knight_runatk6 ] {ai_melee_side();}; +void() knight_runatk6 =[ $runattack6, knight_runatk7 ] {ai_melee_side();}; +void() knight_runatk7 =[ $runattack7, knight_runatk8 ] {ai_melee_side();}; +void() knight_runatk8 =[ $runattack8, knight_runatk9 ] {ai_melee_side();}; +void() knight_runatk9 =[ $runattack9, knight_runatk10 ] {ai_melee_side();}; +void() knight_runatk10 =[ $runattack10, knight_runatk11 ] {ai_charge_side();}; +void() knight_runatk11 =[ $runattack11, knight_run1 ] {ai_charge(10);}; + +void() knight_atk1 =[ $attackb1, knight_atk2 ] +{ +sound (self, CHAN_WEAPON, "knight/sword1.wav", 1, ATTN_NORM); +ai_charge(0);}; +void() knight_atk2 =[ $attackb2, knight_atk3 ] {ai_charge(7);}; +void() knight_atk3 =[ $attackb3, knight_atk4 ] {ai_charge(4);}; +void() knight_atk4 =[ $attackb4, knight_atk5 ] {ai_charge(0);}; +void() knight_atk5 =[ $attackb5, knight_atk6 ] {ai_charge(3);}; +void() knight_atk6 =[ $attackb6, knight_atk7 ] {ai_charge(4); ai_melee();}; +void() knight_atk7 =[ $attackb7, knight_atk8 ] {ai_charge(1); ai_melee();}; +void() knight_atk8 =[ $attackb8, knight_atk9 ] {ai_charge(3); +ai_melee();}; +void() knight_atk9 =[ $attackb9, knight_atk10] {ai_charge(1);}; +void() knight_atk10=[ $attackb10, knight_run1 ] {ai_charge(5);}; + +//void() knight_atk9 =[ $attack9, knight_atk10 ] {}; +//void() knight_atk10 =[ $attack10, knight_atk11 ] {}; +//void() knight_atk11 =[ $attack11, knight_run1 ] {}; + +//=========================================================================== + +void() knight_pain1 =[ $pain1, knight_pain2 ] {}; +void() knight_pain2 =[ $pain2, knight_pain3 ] {}; +void() knight_pain3 =[ $pain3, knight_run1 ] {}; + +void() knight_painb1 =[ $painb1, knight_painb2 ] {ai_painforward(0);}; +void() knight_painb2 =[ $painb2, knight_painb3 ] {ai_painforward(3);}; +void() knight_painb3 =[ $painb3, knight_painb4 ] {}; +void() knight_painb4 =[ $painb4, knight_painb5 ] {}; +void() knight_painb5 =[ $painb5, knight_painb6 ] {ai_painforward(2);}; +void() knight_painb6 =[ $painb6, knight_painb7 ] {ai_painforward(4);}; +void() knight_painb7 =[ $painb7, knight_painb8 ] {ai_painforward(2);}; +void() knight_painb8 =[ $painb8, knight_painb9 ] {ai_painforward(5);}; +void() knight_painb9 =[ $painb9, knight_painb10 ] {ai_painforward(5);}; +void() knight_painb10 =[ $painb10, knight_painb11 ] {ai_painforward(0);}; +void() knight_painb11 =[ $painb11, knight_run1 ] {}; + +void(entity attacker, float damage) knight_pain = +{ + local float r; + + if (self.pain_finished > time) + return; + + r = random(); + + sound (self, CHAN_VOICE, "knight/khurt.wav", 1, ATTN_NORM); + if (r < 0.85) + { + knight_pain1 (); + self.pain_finished = time + 1; + } + else + { + knight_painb1 (); + self.pain_finished = time + 1; + } + +}; + +//=========================================================================== + +void() knight_bow1 =[ $kneel1, knight_bow2 ] {ai_turn();}; +void() knight_bow2 =[ $kneel2, knight_bow3 ] {ai_turn();}; +void() knight_bow3 =[ $kneel3, knight_bow4 ] {ai_turn();}; +void() knight_bow4 =[ $kneel4, knight_bow5 ] {ai_turn();}; + +void() knight_bow5 =[ $kneel5, knight_bow5 ] {ai_turn();}; + +void() knight_bow6 =[ $kneel4, knight_bow7 ] {ai_turn();}; +void() knight_bow7 =[ $kneel3, knight_bow8 ] {ai_turn();}; +void() knight_bow8 =[ $kneel2, knight_bow9 ] {ai_turn();}; +void() knight_bow9 =[ $kneel1, knight_bow10 ] {ai_turn();}; +void() knight_bow10 =[ $walk1, knight_walk1 ] {ai_turn();}; + + + +void() knight_die1 =[ $death1, knight_die2 ] {}; +void() knight_die2 =[ $death2, knight_die3 ] {}; +void() knight_die3 =[ $death3, knight_die4 ] +{self.solid = SOLID_NOT;}; +void() knight_die4 =[ $death4, knight_die5 ] {}; +void() knight_die5 =[ $death5, knight_die6 ] {}; +void() knight_die6 =[ $death6, knight_die7 ] {}; +void() knight_die7 =[ $death7, knight_die8 ] {}; +void() knight_die8 =[ $death8, knight_die9 ] {}; +void() knight_die9 =[ $death9, knight_die10] {}; +void() knight_die10=[ $death10, knight_die10] {}; + + +void() knight_dieb1 =[ $deathb1, knight_dieb2 ] {}; +void() knight_dieb2 =[ $deathb2, knight_dieb3 ] {}; +void() knight_dieb3 =[ $deathb3, knight_dieb4 ] +{self.solid = SOLID_NOT;}; +void() knight_dieb4 =[ $deathb4, knight_dieb5 ] {}; +void() knight_dieb5 =[ $deathb5, knight_dieb6 ] {}; +void() knight_dieb6 =[ $deathb6, knight_dieb7 ] {}; +void() knight_dieb7 =[ $deathb7, knight_dieb8 ] {}; +void() knight_dieb8 =[ $deathb8, knight_dieb9 ] {}; +void() knight_dieb9 =[ $deathb9, knight_dieb10] {}; +void() knight_dieb10 = [ $deathb10, knight_dieb11] {}; +void() knight_dieb11 = [ $deathb11, knight_dieb11] {}; + + +void() knight_die = +{ +// check for gib + if (self.health < -40) + { + sound (self, CHAN_VOICE, "player/udeath.wav", 1, ATTN_NORM); + ThrowHead ("progs/h_knight.mdl", self.health); + ThrowGib ("progs/gib1.mdl", self.health); + ThrowGib ("progs/gib2.mdl", self.health); + ThrowGib ("progs/gib3.mdl", self.health); + return; + } + +// regular death + sound (self, CHAN_VOICE, "knight/kdeath.wav", 1, ATTN_NORM); + if (random() < 0.5) + knight_die1 (); + else + knight_dieb1 (); +}; + + +/*QUAKED monster_knight (1 0 0) (-16 -16 -24) (16 16 40) Ambush +*/ +void() monster_knight = +{ + if (deathmatch) + { + remove(self); + return; + } + precache_model ("progs/knight.mdl"); + precache_model ("progs/h_knight.mdl"); + + precache_sound ("knight/kdeath.wav"); + precache_sound ("knight/khurt.wav"); + precache_sound ("knight/ksight.wav"); + precache_sound ("knight/sword1.wav"); + precache_sound ("knight/sword2.wav"); + precache_sound ("knight/idle.wav"); + + self.solid = SOLID_SLIDEBOX; + self.movetype = MOVETYPE_STEP; + + setmodel (self, "progs/knight.mdl"); + + setsize (self, '-16 -16 -24', '16 16 40'); + self.health = 75; + + self.th_stand = knight_stand1; + self.th_walk = knight_walk1; + self.th_run = knight_run1; + self.th_melee = knight_atk1; + self.th_pain = knight_pain; + self.th_die = knight_die; + + walkmonster_start (); +}; diff --git a/src/maps/.light.log b/src/maps/.light.log new file mode 100644 index 0000000..6492f75 --- /dev/null +++ b/src/maps/.light.log @@ -0,0 +1,7 @@ +----- Light 1.43 ---- + +modified by Bengt Jardrup +Linux port by gb + +File: +4261692 entities read, 63610624 are lights, 63610736 faces, diff --git a/src/maps/.qbsp.log b/src/maps/.qbsp.log new file mode 100644 index 0000000..d43b67a --- /dev/null +++ b/src/maps/.qbsp.log @@ -0,0 +1,75 @@ +TreeQBSP v2.05 -- + +modified by Greg Lewis +modified by Bengt Jardrup +Linux port by gb + +Input file: phystest.map +Output file: ../../../id1-common/maps/phystest.bsp +---- LoadMapFile ---- +*** WARNING 06: No info_player_deathmatch entities in level + 84 faces + 14 brushes + 4 entities + 5 unique texnames + 15 texinfo + +Building hulls sequentially... +Processing hull 0... +---- Brush_LoadEntity ---- + 14 brushes +---- CSGFaces ---- + 84 brushfaces + 125 csgfaces + 134 mergedfaces +---- SolidBSP ---- + 267 split nodes + 84 solid leafs + 175 empty leafs + 9 water leafs + 931 leaffaces + 924 nodefaces +---- FillOutside ---- + 121 outleafs +---- MergeAll ---- + 89 mergefaces +---- SolidBSP ---- + 42 split nodes + 13 solid leafs + 29 empty leafs + 1 water leafs + 480 leaffaces + 350 nodefaces +---- Portalize ---- + 30 vis leafs + 102 vis portals +---- Tjunc ---- + 176 world edges + 954 edge points + 202 edges added by tjunctions + 0 faces added by tjunctions +---- MakeFaceEdges ---- +---- GrowRegions ---- +Processing hull 1... +Processing hull 2... +---- WriteBSPFile ---- + 93 planes 1860 + 425 vertexes 5100 + 42 nodes 1008 + 15 texinfo 600 + 350 faces 7000 + 185 clipnodes 1480 + 31 leafs 868 + 480 marksurfaces 960 + 1602 surfedges 6408 + 802 edges 3208 + 5 textures 99504 + lightdata 0 + visdata 0 + entdata 322 + +1 warning + +Elapsed time : 0:00 + +Peak memory used : 0.3 MB diff --git a/src/maps/.vis.log b/src/maps/.vis.log new file mode 100644 index 0000000..9fb2516 --- /dev/null +++ b/src/maps/.vis.log @@ -0,0 +1,6 @@ +---- Vis 2.31 ---- + +modified by Bengt Jardrup +Linux port by gb + +File: diff --git a/src/maps/cube.map b/src/maps/cube.map new file mode 100644 index 0000000..1516b15 --- /dev/null +++ b/src/maps/cube.map @@ -0,0 +1,51 @@ +{ +"classname" "worldspawn" +"classname" "worldspawn" +"sounds" "1" +"mapversion" "220" +"wad" "id_base.wad" +{ +( 0 0 32 ) ( 0 32 32 ) ( 32 32 32 ) +3_LAVA0 [ 1 0 0 -4 ] [ 0 -1 0 4 ] 0 1 1 +( 0 32 0 ) ( 0 0 0 ) ( 32 0 0 ) +0_LAVA0 [ 1 0 0 -4 ] [ 0 -1 0 4 ] 0 1 1 +( 0 0 0 ) ( 0 32 0 ) ( 0 32 32 ) +3_LAVA0 [ 0 1 0 -4 ] [ 0 0 -1 4 ] 0 1 1 +( 32 32 0 ) ( 32 0 0 ) ( 32 0 32 ) +0_LAVA0 [ 0 1 0 -4 ] [ 0 0 -1 4 ] 0 1 1 +( 0 32 0 ) ( 32 32 0 ) ( 32 32 32 ) +2_LAVA0 [ 1 0 0 -4 ] [ 0 0 -1 4 ] 0 1 1 +( 32 0 0 ) ( 0 0 0 ) ( 0 0 32 ) +0_LAVA0 [ 1 0 0 -4 ] [ 0 0 -1 4 ] 0 1 1 +} +} +{ +"classname" "light" +"light" "300" +"wait" "1" +"origin" "-16 16 16" +} +{ +"classname" "light" +"light" "300" +"wait" "1" +"origin" "48 16 16" +} +{ +"classname" "light" +"light" "300" +"wait" "1" +"origin" "16 16 48" +} +{ +"classname" "light" +"light" "300" +"wait" "1" +"origin" "16 48 16" +} +{ +"classname" "light" +"light" "300" +"wait" "1" +"origin" "16 -16 16" +} +{ +"classname" "light" +"light" "300" +"wait" "1" +"origin" "16 16 -16" +} diff --git a/src/maps/pellet.map b/src/maps/pellet.map new file mode 100644 index 0000000..e5ee280 --- /dev/null +++ b/src/maps/pellet.map @@ -0,0 +1,770 @@ +{ +"classname" "worldspawn" +"classname" "worldspawn" +"sounds" "1" +"mapversion" "220" +"mapversion" "220" +"wad" "id_base.wad;portal.wad" +{ +( -160 -896 -32 ) ( -848 -896 -32 ) ( -848 -896 328 ) FLOOR3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -160 -896 328 ) ( -848 -896 328 ) ( -848 -864 328 ) FLOOR3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -848 -864 -32 ) ( -848 -896 -32 ) ( -160 -896 -32 ) FLOOR3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -848 -896 328 ) ( -848 -896 -32 ) ( -848 -864 -32 ) FLOOR3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -160 -864 -32 ) ( -160 -896 -32 ) ( -160 -896 328 ) FLOOR3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -848 -864 -32 ) ( -160 -864 -32 ) ( -160 -864 328 ) FLOOR3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +{ +( -128 -320 328 ) ( -128 -320 -32 ) ( -128 -896 -32 ) FLOOR3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -160 -320 -32 ) ( -128 -320 -32 ) ( -128 -320 328 ) FLOOR3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -128 -896 328 ) ( -128 -896 -32 ) ( -160 -896 -32 ) FLOOR3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -160 -320 328 ) ( -128 -320 328 ) ( -128 -896 328 ) FLOOR3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -160 -896 -32 ) ( -128 -896 -32 ) ( -128 -320 -32 ) FLOOR3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -160 -896 328 ) ( -160 -896 -32 ) ( -160 -320 -32 ) FLOOR3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +{ +( -880 -896 328 ) ( -880 -896 -32 ) ( -880 -320 -32 ) FLOOR3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -880 -320 328 ) ( -880 -320 -32 ) ( -848 -320 -32 ) FLOOR3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -848 -896 -32 ) ( -880 -896 -32 ) ( -880 -896 328 ) FLOOR3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -848 -896 328 ) ( -880 -896 328 ) ( -880 -320 328 ) FLOOR3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -848 -320 -32 ) ( -880 -320 -32 ) ( -880 -896 -32 ) FLOOR3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -848 -320 328 ) ( -848 -320 -32 ) ( -848 -896 -32 ) FLOOR3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +{ +( -880 -320 -64 ) ( -880 -896 -64 ) ( -128 -896 -64 ) FLOOR3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -880 -896 -32 ) ( -880 -896 -64 ) ( -880 -320 -64 ) FLOOR3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -128 -320 -32 ) ( -128 -320 -64 ) ( -128 -896 -64 ) FLOOR3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -880 -320 -32 ) ( -880 -320 -64 ) ( -128 -320 -64 ) FLOOR3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -128 -896 -32 ) ( -128 -896 -64 ) ( -880 -896 -64 ) FLOOR3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -880 -896 -32 ) ( -880 -320 -32 ) ( -128 -320 -32 ) FLOOR1 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +} +{ +( -880 -896 360 ) ( -880 -320 360 ) ( -128 -320 360 ) FLOOR3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -880 -320 328 ) ( -880 -320 360 ) ( -880 -896 360 ) FLOOR3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -128 -896 328 ) ( -128 -896 360 ) ( -128 -320 360 ) FLOOR3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -128 -320 328 ) ( -128 -320 360 ) ( -880 -320 360 ) FLOOR3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -880 -896 328 ) ( -880 -896 360 ) ( -128 -896 360 ) FLOOR3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -880 -320 328 ) ( -880 -896 328 ) ( -128 -896 328 ) WALL1 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +} +{ +( -640 432 288 ) ( -640 464 288 ) ( -384 464 288 ) FLOOR3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -640 464 192 ) ( -640 432 192 ) ( -384 432 192 ) FLOOR3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -640 432 192 ) ( -640 464 192 ) ( -640 464 288 ) FLOOR3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -384 464 192 ) ( -384 432 192 ) ( -384 432 288 ) FLOOR3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -640 464 192 ) ( -384 464 192 ) ( -384 464 288 ) FLOOR3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -384 432 192 ) ( -640 432 192 ) ( -640 432 288 ) FLOOR3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +{ +( -544 256 272 ) ( -544 256 320 ) ( -160 256 320 ) FLOOR3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -160 256 320 ) ( -544 256 320 ) ( -544 432 320 ) FLOOR3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -544 256 320 ) ( -544 256 272 ) ( -544 432 272 ) FLOOR3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -160 256 272 ) ( -160 256 320 ) ( -160 432 320 ) FLOOR3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -160 432 272 ) ( -160 432 320 ) ( -544 432 320 ) FLOOR3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -544 432 272 ) ( -544 256 272 ) ( -160 256 272 ) FLOOR3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +} +{ +( -160 256 208 ) ( -160 256 -256 ) ( -512 256 -256 ) FLOOR3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -512 256 208 ) ( -512 256 -256 ) ( -512 432 -256 ) FLOOR3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -160 432 208 ) ( -160 432 -256 ) ( -160 256 -256 ) FLOOR3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -512 432 208 ) ( -512 432 -256 ) ( -160 432 -256 ) FLOOR3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -512 432 -256 ) ( -512 256 -256 ) ( -160 256 -256 ) FLOOR3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -160 256 208 ) ( -512 256 208 ) ( -512 432 208 ) FLOOR3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +} +{ +( -160 256 272 ) ( -160 256 208 ) ( -417 256 208 ) FLOOR3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -160 432 272 ) ( -160 432 208 ) ( -160 256 208 ) FLOOR3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -417 432 208 ) ( -160 432 208 ) ( -160 432 272 ) FLOOR3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -160 256 272 ) ( -417 256 272 ) ( -417 432 272 ) FLOOR3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -417 256 208 ) ( -160 256 208 ) ( -160 432 208 ) FLOOR3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -417 256 272 ) ( -417 256 208 ) ( -417 432 208 ) FLOOR3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +{ +( -640 -256 -224 ) ( -640 256 -224 ) ( -304 256 -224 ) FLOOR1 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -640 256 -256 ) ( -640 -256 -256 ) ( -304 -256 -256 ) FLOOR1 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -640 -256 -256 ) ( -640 256 -256 ) ( -640 256 -224 ) FLOOR1 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -304 256 -256 ) ( -304 -256 -256 ) ( -304 -256 -224 ) FLOOR1 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -640 256 -256 ) ( -304 256 -256 ) ( -304 256 -224 ) FLOOR1 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -304 -256 -256 ) ( -640 -256 -256 ) ( -640 -256 -224 ) FLOOR1 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +{ +( -304 -256 -64 ) ( -304 256 -64 ) ( -160 256 -64 ) FLOOR3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -304 256 -256 ) ( -304 -256 -256 ) ( -160 -256 -256 ) FLOOR3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -304 -256 -256 ) ( -304 256 -256 ) ( -304 256 -64 ) FLOOR3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -160 256 -256 ) ( -160 -256 -256 ) ( -160 -256 -64 ) FLOOR3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -304 256 -256 ) ( -160 256 -256 ) ( -160 256 -64 ) FLOOR3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -160 -256 -256 ) ( -304 -256 -256 ) ( -304 -256 -64 ) FLOOR3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +{ +( -160 24 80 ) ( -160 24 0 ) ( -176 24 0 ) COP2_4 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -176 40 80 ) ( -176 40 0 ) ( -160 40 0 ) COP2_4 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -160 40 80 ) ( -160 40 0 ) ( -160 24 0 ) COP2_4 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -176 24 80 ) ( -176 24 0 ) ( -176 40 0 ) COP2_4 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -160 24 80 ) ( -176 24 80 ) ( -176 40 80 ) COP2_4 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -160 40 0 ) ( -176 40 0 ) ( -176 24 0 ) COP2_4 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +} +{ +( -160 -48 96 ) ( -160 -48 80 ) ( -176 -48 80 ) COP2_4 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -176 40 96 ) ( -176 40 80 ) ( -160 40 80 ) COP2_4 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -160 40 96 ) ( -160 40 80 ) ( -160 -48 80 ) COP2_4 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -176 -48 96 ) ( -176 -48 80 ) ( -176 40 80 ) COP2_4 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -160 -48 96 ) ( -176 -48 96 ) ( -176 40 96 ) COP2_4 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -160 40 80 ) ( -176 40 80 ) ( -176 -48 80 ) COP2_4 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +} +{ +( -160 -48 80 ) ( -160 -48 0 ) ( -176 -48 0 ) COP2_4 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -176 -32 80 ) ( -176 -32 0 ) ( -160 -32 0 ) COP2_4 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -160 -32 80 ) ( -160 -32 0 ) ( -160 -48 0 ) COP2_4 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -176 -48 80 ) ( -176 -48 0 ) ( -176 -32 0 ) COP2_4 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -160 -48 80 ) ( -176 -48 80 ) ( -176 -32 80 ) COP2_4 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -160 -32 0 ) ( -176 -32 0 ) ( -176 -48 0 ) COP2_4 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +} +{ +( -512 -320 -256 ) ( -512 -320 320 ) ( -160 -320 320 ) FLOOR3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -160 -320 320 ) ( -512 -320 320 ) ( -512 -256 320 ) FLOOR3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -512 -320 320 ) ( -512 -320 -256 ) ( -512 -256 -256 ) FLOOR3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -160 -320 -256 ) ( -160 -320 320 ) ( -160 -256 320 ) FLOOR3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -160 -256 -256 ) ( -160 -256 320 ) ( -512 -256 320 ) FLOOR3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -512 -256 -256 ) ( -512 -320 -256 ) ( -160 -320 -256 ) FLOOR3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +} +{ +( -160 -32 0 ) ( -128 -32 0 ) ( -128 -32 80 ) FLOOR3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -160 -320 80 ) ( -160 -32 80 ) ( -128 -32 80 ) FLOOR3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -128 -32 0 ) ( -160 -32 0 ) ( -160 -320 0 ) FLOOR3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -160 -320 0 ) ( -160 -32 0 ) ( -160 -32 80 ) FLOOR3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -128 -32 80 ) ( -128 -32 0 ) ( -128 -320 0 ) FLOOR3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -128 -320 0 ) ( -160 -320 0 ) ( -160 -320 80 ) FLOOR3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +{ +( -160 320 0 ) ( -128 320 0 ) ( -128 320 80 ) FLOOR3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -160 24 80 ) ( -160 320 80 ) ( -128 320 80 ) FLOOR3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -128 320 0 ) ( -160 320 0 ) ( -160 24 0 ) FLOOR3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -160 24 0 ) ( -160 320 0 ) ( -160 320 80 ) FLOOR3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -128 320 80 ) ( -128 320 0 ) ( -128 24 0 ) FLOOR3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -128 24 0 ) ( -160 24 0 ) ( -160 24 80 ) FLOOR3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +{ +( 0 -320 128 ) ( 0 -320 320 ) ( 640 -320 320 ) FLOOR3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 640 -320 320 ) ( 0 -320 320 ) ( 0 -256 320 ) FLOOR3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 0 -320 320 ) ( 0 -320 128 ) ( 0 -256 128 ) FLOOR3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 640 -320 128 ) ( 640 -320 320 ) ( 640 -256 320 ) FLOOR3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 640 -256 128 ) ( 640 -256 320 ) ( 0 -256 320 ) FLOOR3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 0 -256 128 ) ( 0 -320 128 ) ( 640 -320 128 ) FLOOR3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +} +{ +( -128 40 80 ) ( -128 40 0 ) ( -128 320 0 ) FLOOR3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -128 320 80 ) ( -128 320 0 ) ( -32 320 0 ) FLOOR3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -32 40 0 ) ( -128 40 0 ) ( -128 40 80 ) FLOOR3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -32 40 80 ) ( -128 40 80 ) ( -128 320 80 ) FLOOR3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -32 320 0 ) ( -128 320 0 ) ( -128 40 0 ) FLOOR3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -32 320 80 ) ( -32 320 0 ) ( -32 40 0 ) FLOOR3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +{ +( 72 256 24 ) ( 80 256 24 ) ( 80 256 72 ) FB_BLUE [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 80 248 24 ) ( 72 248 24 ) ( 72 248 72 ) FB_BLUE [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 80 256 24 ) ( 72 256 24 ) ( 72 248 24 ) FB_BLUE [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 80 248 72 ) ( 72 248 72 ) ( 72 256 72 ) FB_BLUE [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 80 256 72 ) ( 80 256 24 ) ( 80 248 24 ) FB_BLUE [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 72 248 72 ) ( 72 248 24 ) ( 72 256 24 ) FB_BLUE [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +{ +( 16 248 32 ) ( 16 256 32 ) ( 80 256 32 ) FB_BLUE [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 16 256 24 ) ( 16 248 24 ) ( 80 248 24 ) FB_BLUE [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 16 248 24 ) ( 16 256 24 ) ( 16 256 32 ) FB_BLUE [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 80 256 24 ) ( 80 248 24 ) ( 80 248 32 ) FB_BLUE [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 16 256 24 ) ( 80 256 24 ) ( 80 256 32 ) FB_BLUE [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 80 248 24 ) ( 16 248 24 ) ( 16 248 32 ) FB_BLUE [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +{ +( 80 248 72 ) ( 80 256 72 ) ( 160 256 72 ) FB_BLUE [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 80 256 64 ) ( 80 248 64 ) ( 160 248 64 ) FB_BLUE [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 80 248 64 ) ( 80 256 64 ) ( 80 256 72 ) FB_BLUE [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 160 256 64 ) ( 160 248 64 ) ( 160 248 72 ) FB_BLUE [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 80 256 64 ) ( 160 256 64 ) ( 160 256 72 ) FB_BLUE [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 160 248 64 ) ( 80 248 64 ) ( 80 248 72 ) FB_BLUE [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +{ +( 8 40 32 ) ( 8 256 32 ) ( 16 256 32 ) FB_BLUE [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 8 256 24 ) ( 8 40 24 ) ( 16 40 24 ) FB_BLUE [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 8 40 24 ) ( 8 256 24 ) ( 8 256 32 ) FB_BLUE [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 16 256 24 ) ( 16 40 24 ) ( 16 40 32 ) FB_BLUE [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 8 256 24 ) ( 16 256 24 ) ( 16 256 32 ) FB_BLUE [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 16 40 24 ) ( 8 40 24 ) ( 8 40 32 ) FB_BLUE [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +{ +( 0 -320 0 ) ( -32 -320 0 ) ( -32 -320 80 ) FLOOR3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 0 -320 80 ) ( -32 -320 80 ) ( -32 -32 80 ) FLOOR3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -32 -32 0 ) ( -32 -320 0 ) ( 0 -320 0 ) FLOOR3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -32 -320 80 ) ( -32 -320 0 ) ( -32 -32 0 ) FLOOR3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 0 -32 0 ) ( 0 -320 0 ) ( 0 -320 80 ) FLOOR3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -32 -32 0 ) ( 0 -32 0 ) ( 0 -32 80 ) FLOOR3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +{ +( -32 320 0 ) ( 0 320 0 ) ( 0 320 80 ) FLOOR3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -32 24 80 ) ( -32 320 80 ) ( 0 320 80 ) FLOOR3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 0 320 0 ) ( -32 320 0 ) ( -32 24 0 ) FLOOR3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -32 24 0 ) ( -32 320 0 ) ( -32 320 80 ) FLOOR3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 0 320 80 ) ( 0 320 0 ) ( 0 24 0 ) FLOOR3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 0 24 0 ) ( -32 24 0 ) ( -32 24 80 ) FLOOR3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +{ +( -128 -320 80 ) ( -128 -320 0 ) ( -128 -48 0 ) FLOOR3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -128 -48 80 ) ( -128 -48 0 ) ( -32 -48 0 ) FLOOR3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -32 -320 0 ) ( -128 -320 0 ) ( -128 -320 80 ) FLOOR3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -32 -320 80 ) ( -128 -320 80 ) ( -128 -48 80 ) FLOOR3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -32 -48 0 ) ( -128 -48 0 ) ( -128 -320 0 ) FLOOR3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -32 -48 80 ) ( -32 -48 0 ) ( -32 -320 0 ) FLOOR3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +{ +( -160 -320 320 ) ( -160 -320 80 ) ( -160 320 80 ) FLOOR3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -160 320 320 ) ( -160 320 80 ) ( 0 320 80 ) FLOOR3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -160 -320 80 ) ( -160 -320 320 ) ( 0 -320 320 ) FLOOR3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 0 -320 320 ) ( -160 -320 320 ) ( -160 320 320 ) FLOOR3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 0 320 320 ) ( 0 320 80 ) ( 0 -320 80 ) FLOOR3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 0 320 80 ) ( -160 320 80 ) ( -160 -320 80 ) FLOOR3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +} +{ +( 16 -48 80 ) ( 16 -48 0 ) ( 0 -48 0 ) COP2_4 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 0 -32 80 ) ( 0 -32 0 ) ( 16 -32 0 ) COP2_4 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 16 -32 80 ) ( 16 -32 0 ) ( 16 -48 0 ) COP2_4 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 0 -48 80 ) ( 0 -48 0 ) ( 0 -32 0 ) COP2_4 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 16 -48 80 ) ( 0 -48 80 ) ( 0 -32 80 ) COP2_4 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 16 -32 0 ) ( 0 -32 0 ) ( 0 -48 0 ) COP2_4 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +} +{ +( 16 24 80 ) ( 16 24 0 ) ( 0 24 0 ) COP2_4 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 0 40 80 ) ( 0 40 0 ) ( 16 40 0 ) COP2_4 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 16 40 80 ) ( 16 40 0 ) ( 16 24 0 ) COP2_4 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 0 24 80 ) ( 0 24 0 ) ( 0 40 0 ) COP2_4 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 16 24 80 ) ( 0 24 80 ) ( 0 40 80 ) COP2_4 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 16 40 0 ) ( 0 40 0 ) ( 0 24 0 ) COP2_4 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +} +{ +( 16 -49 96 ) ( 16 -49 80 ) ( 0 -49 80 ) COP2_4 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 0 39 96 ) ( 0 39 80 ) ( 16 39 80 ) COP2_4 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 16 39 96 ) ( 16 39 80 ) ( 16 -49 80 ) COP2_4 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 0 -49 96 ) ( 0 -49 80 ) ( 0 39 80 ) COP2_4 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 16 -49 96 ) ( 0 -49 96 ) ( 0 39 96 ) COP2_4 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 16 39 80 ) ( 0 39 80 ) ( 0 -49 80 ) COP2_4 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +} +{ +( 640 -320 0 ) ( 576 -320 0 ) ( 576 -320 128 ) METAL4_5 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 640 -320 128 ) ( 576 -320 128 ) ( 576 -272 128 ) METAL4_5 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 576 -272 0 ) ( 576 -320 0 ) ( 640 -320 0 ) METAL4_5 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 576 -320 128 ) ( 576 -320 0 ) ( 576 -272 0 ) METAL4_5 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 640 -272 0 ) ( 640 -320 0 ) ( 640 -320 128 ) METAL4_5 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 576 -272 0 ) ( 640 -272 0 ) ( 640 -272 128 ) METAL4_5 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +{ +( 576 -320 0 ) ( 0 -320 0 ) ( 0 -320 128 ) FLOOR3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 0 -320 128 ) ( 0 -320 0 ) ( 0 -256 0 ) FLOOR3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 0 -256 128 ) ( 0 -256 0 ) ( 576 -256 0 ) FLOOR3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 576 -320 128 ) ( 0 -320 128 ) ( 0 -256 128 ) FLOOR3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 576 -256 0 ) ( 0 -256 0 ) ( 0 -320 0 ) FLOOR3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 576 -256 128 ) ( 576 -256 0 ) ( 576 -320 0 ) FLOOR3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +{ +( 416 240 104 ) ( 416 256 104 ) ( 480 256 104 ) CLIFF4 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 416 256 24 ) ( 416 240 24 ) ( 480 240 24 ) CLIFF4 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 416 240 24 ) ( 416 256 24 ) ( 416 256 104 ) CLIFF4 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 480 256 24 ) ( 480 240 24 ) ( 480 240 104 ) CLIFF4 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 416 256 24 ) ( 480 256 24 ) ( 480 256 104 ) CLIFF4 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 480 240 24 ) ( 416 240 24 ) ( 416 240 104 ) LIGHT1_6 [ 1 0 0 -32 ] [ 0 0 -1 32 ] 0 1 1 +} +{ +( 160 240 104 ) ( 160 256 104 ) ( 224 256 104 ) CLIFF4 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 160 256 24 ) ( 160 240 24 ) ( 224 240 24 ) CLIFF4 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 160 240 24 ) ( 160 256 24 ) ( 160 256 104 ) CLIFF4 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 224 256 24 ) ( 224 240 24 ) ( 224 240 104 ) CLIFF4 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 160 256 24 ) ( 224 256 24 ) ( 224 256 104 ) CLIFF4 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 224 240 24 ) ( 160 240 24 ) ( 160 240 104 ) LIGHT1_1 [ 1 0 0 -32 ] [ 0 0 -1 32 ] 0 1 1 +} +{ +( 0 320 0 ) ( 640 320 0 ) ( 640 320 320 ) FLOOR3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 0 256 320 ) ( 0 320 320 ) ( 640 320 320 ) FLOOR3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 640 320 0 ) ( 0 320 0 ) ( 0 256 0 ) FLOOR3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 0 256 0 ) ( 0 320 0 ) ( 0 320 320 ) FLOOR3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 640 320 320 ) ( 640 320 0 ) ( 640 256 0 ) FLOOR3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 640 256 0 ) ( 0 256 0 ) ( 0 256 320 ) FLOOR3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +{ +( 704 320 320 ) ( 704 320 0 ) ( 704 -320 0 ) FLOOR3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 640 320 0 ) ( 704 320 0 ) ( 704 320 320 ) FLOOR3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 704 -320 320 ) ( 704 -320 0 ) ( 640 -320 0 ) FLOOR3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 640 320 320 ) ( 704 320 320 ) ( 704 -320 320 ) FLOOR3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 640 -320 0 ) ( 704 -320 0 ) ( 704 320 0 ) FLOOR3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 640 -320 320 ) ( 640 -320 0 ) ( 640 320 0 ) FLOOR3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +{ +( -304 -320 -64 ) ( 704 -320 -64 ) ( 704 320 -64 ) FLOOR3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 704 320 0 ) ( 704 320 -64 ) ( 704 -320 -64 ) FLOOR3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -304 320 -64 ) ( 704 320 -64 ) ( 704 320 0 ) FLOOR3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 704 -320 0 ) ( 704 -320 -64 ) ( -304 -320 -64 ) FLOOR3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -304 320 0 ) ( 704 320 0 ) ( 704 -320 0 ) FLOOR1 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -304 -320 0 ) ( -304 -320 -64 ) ( -304 320 -64 ) FLOOR3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +{ +( -448 -320 360 ) ( -448 320 360 ) ( 704 320 360 ) WALL1 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -448 320 320 ) ( -448 320 360 ) ( -448 -320 360 ) WALL1 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 704 -320 320 ) ( 704 -320 360 ) ( 704 320 360 ) WALL1 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 704 320 320 ) ( 704 320 360 ) ( -448 320 360 ) WALL1 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -448 -320 320 ) ( -448 -320 360 ) ( 704 -320 360 ) WALL1 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -448 320 320 ) ( -448 -320 320 ) ( 704 -320 320 ) WALL1 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +} +{ +( -160 -320 112 ) ( -160 -320 328 ) ( -848 -320 328 ) FLOOR3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -848 -352 328 ) ( -848 -320 328 ) ( -160 -320 328 ) FLOOR3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -848 -320 112 ) ( -848 -320 328 ) ( -848 -352 328 ) FLOOR3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -160 -320 328 ) ( -160 -320 112 ) ( -160 -352 112 ) FLOOR3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -848 -352 112 ) ( -848 -352 328 ) ( -160 -352 328 ) FLOOR3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -160 -320 112 ) ( -848 -320 112 ) ( -848 -352 112 ) FLOOR3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +} +{ +( -848 -320 0 ) ( -848 -320 -32 ) ( -160 -320 -32 ) FLOOR3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -160 -320 -32 ) ( -848 -320 -32 ) ( -848 -352 -32 ) FLOOR3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -848 -352 0 ) ( -848 -352 -32 ) ( -848 -320 -32 ) FLOOR3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -160 -320 0 ) ( -160 -320 -32 ) ( -160 -352 -32 ) FLOOR3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -160 -352 0 ) ( -160 -352 -32 ) ( -848 -352 -32 ) FLOOR3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -848 -352 0 ) ( -848 -320 0 ) ( -160 -320 0 ) FLOOR3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +} +{ +( -848 -320 112 ) ( -848 -320 0 ) ( -768 -320 0 ) FLOOR3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -848 -352 112 ) ( -848 -352 0 ) ( -848 -320 0 ) FLOOR3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -768 -352 0 ) ( -848 -352 0 ) ( -848 -352 112 ) FLOOR3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -768 -352 112 ) ( -848 -352 112 ) ( -848 -320 112 ) FLOOR3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -768 -320 0 ) ( -848 -320 0 ) ( -848 -352 0 ) FLOOR3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -768 -320 112 ) ( -768 -320 0 ) ( -768 -352 0 ) FLOOR3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +{ +( -696 -320 0 ) ( -160 -320 0 ) ( -160 -320 112 ) FLOOR3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -160 -320 112 ) ( -160 -320 0 ) ( -160 -352 0 ) FLOOR3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -160 -352 112 ) ( -160 -352 0 ) ( -696 -352 0 ) FLOOR3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -696 -320 112 ) ( -160 -320 112 ) ( -160 -352 112 ) FLOOR3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -160 -320 0 ) ( -696 -320 0 ) ( -696 -352 0 ) FLOOR3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -696 -352 112 ) ( -696 -352 0 ) ( -696 -320 0 ) FLOOR3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +{ +( -880 -320 112 ) ( -880 -320 320 ) ( -512 -320 320 ) NOPORTAL [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -512 -320 320 ) ( -880 -320 320 ) ( -880 -256 320 ) NOPORTAL [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -880 -320 320 ) ( -880 -320 112 ) ( -880 -256 112 ) NOPORTAL [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -512 -320 112 ) ( -512 -320 320 ) ( -512 -256 320 ) NOPORTAL [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -512 -256 112 ) ( -512 -256 320 ) ( -880 -256 320 ) NOPORTAL [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -880 -256 112 ) ( -880 -320 112 ) ( -512 -320 112 ) NOPORTAL [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +} +{ +( -512 -320 0 ) ( -512 -320 -256 ) ( -880 -320 -256 ) NOPORTAL [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -880 -320 0 ) ( -880 -320 -256 ) ( -880 -256 -256 ) NOPORTAL [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -512 -256 0 ) ( -512 -256 -256 ) ( -512 -320 -256 ) NOPORTAL [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -880 -256 0 ) ( -880 -256 -256 ) ( -512 -256 -256 ) NOPORTAL [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -880 -256 -256 ) ( -880 -320 -256 ) ( -512 -320 -256 ) NOPORTAL [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -512 -320 0 ) ( -880 -320 0 ) ( -880 -256 0 ) NOPORTAL [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +} +{ +( -768 -320 0 ) ( -880 -320 0 ) ( -880 -320 112 ) NOPORTAL [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -880 -320 112 ) ( -880 -320 0 ) ( -880 -256 0 ) NOPORTAL [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -880 -256 112 ) ( -880 -256 0 ) ( -768 -256 0 ) NOPORTAL [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -768 -320 112 ) ( -880 -320 112 ) ( -880 -256 112 ) NOPORTAL [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -768 -256 0 ) ( -880 -256 0 ) ( -880 -320 0 ) NOPORTAL [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -768 -256 112 ) ( -768 -256 0 ) ( -768 -320 0 ) NOPORTAL [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +{ +( -512 -320 112 ) ( -512 -320 0 ) ( -696 -320 0 ) NOPORTAL [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -512 -256 112 ) ( -512 -256 0 ) ( -512 -320 0 ) NOPORTAL [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -696 -256 0 ) ( -512 -256 0 ) ( -512 -256 112 ) NOPORTAL [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -512 -320 112 ) ( -696 -320 112 ) ( -696 -256 112 ) NOPORTAL [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -696 -320 0 ) ( -512 -320 0 ) ( -512 -256 0 ) NOPORTAL [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -696 -320 112 ) ( -696 -320 0 ) ( -696 -256 0 ) NOPORTAL [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +{ +( -864 -368 320 ) ( -832 -368 320 ) ( -832 -432 320 ) WALL1 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -864 -432 256 ) ( -832 -432 256 ) ( -832 -368 256 ) WALL1 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -864 -368 320 ) ( -864 -432 320 ) ( -864 -432 256 ) WALL1 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -832 -368 256 ) ( -832 -432 256 ) ( -832 -432 320 ) VENT [ 0 1 0 48 ] [ 0 0 -1 64 ] 0 1 1 +( -832 -368 320 ) ( -864 -368 320 ) ( -864 -368 256 ) WALL1 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -832 -432 256 ) ( -864 -432 256 ) ( -864 -432 320 ) WALL1 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +} +{ +"classname" "info_player_start" +"angles" "0 176 0" +"weapon" "0" +"origin" "320 0 24" +} +{ +"classname" "ass_pelletlauncher" +"angles" "0 270 0" +"origin" "448 232 64" +} +{ +"classname" "light" +"light" "200" +"wait" "1" +"origin" "56 64 48" +} +{ +"classname" "light" +"light" "175" +"wait" "1" +"origin" "256 56 152" +} +{ +"classname" "light" +"light" "200" +"wait" "1" +"origin" "512 64 64" +} +{ +"classname" "light" +"light" "200" +"wait" "1" +"origin" "449 -104 152" +} +{ +"classname" "light" +"light" "200" +"wait" "1" +"origin" "189 -93 44" +} +{ +"classname" "light" +"light" "175" +"wait" "1" +"origin" "59 -219 44" +} +{ +"classname" "light" +"light" "175" +"wait" "1" +"origin" "319 -216 44" +} +{ +"classname" "light" +"light" "175" +"wait" "1" +"origin" "573 -216 44" +} +{ +"classname" "light" +"light" "200" +"wait" "1" +"origin" "379 169 44" +} +{ +"classname" "light" +"light" "200" +"wait" "1" +"origin" "119 159 44" +} +{ +"classname" "trigger_changelevel" +"spawnflags" "1" +"map" "start" +"weapon" "15" +{ +( 640 -272 128 ) ( 640 -272 0 ) ( 576 -272 0 ) TRIGGER [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 576 -256 128 ) ( 576 -256 0 ) ( 640 -256 0 ) TRIGGER [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 576 -272 128 ) ( 576 -272 0 ) ( 576 -256 0 ) TRIGGER [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 640 -256 128 ) ( 640 -256 0 ) ( 640 -272 0 ) TRIGGER [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 640 -272 128 ) ( 576 -272 128 ) ( 576 -256 128 ) TRIGGER [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 640 -256 0 ) ( 576 -256 0 ) ( 576 -272 0 ) TRIGGER [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +} +} +{ +"classname" "light" +"light" "150" +"style" "11" +"wait" "1" +"origin" "608 -256 32" +} +{ +"classname" "trigger_once" +"health" "20" +"target" "door" +"targetname" "catcher" +"sounds" "2" +{ +( 168 224 96 ) ( 168 240 96 ) ( 216 240 96 ) SOLID_YELLOW_L [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 168 240 32 ) ( 168 224 32 ) ( 216 224 32 ) SOLID_YELLOW_L [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 168 224 32 ) ( 168 240 32 ) ( 168 240 96 ) SOLID_YELLOW_L [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 216 240 32 ) ( 216 224 32 ) ( 216 224 96 ) SOLID_YELLOW_L [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 168 240 32 ) ( 216 240 32 ) ( 216 240 96 ) SOLID_YELLOW_L [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 216 224 32 ) ( 168 224 32 ) ( 168 224 96 ) SOLID_YELLOW_L [ 1 0 0 -32 ] [ 0 0 -1 32 ] 0 1 1 +} +} +{ +"classname" "light" +"light" "300" +"wait" "1" +"origin" "16 -8 88" +} +{ +"classname" "func_door" +"speed" "100" +"wait" "-1" +"lip" "8" +"angles" "-90 0 0" +"targetname" "door" +{ +( -8 -32 80 ) ( -8 24 80 ) ( -2 24 80 ) COMP1_1 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -8 24 0 ) ( -8 -32 0 ) ( -2 -32 0 ) COMP1_1 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -8 -32 0 ) ( -8 24 0 ) ( -8 24 80 ) COMP1_1 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -2 24 0 ) ( -2 -32 0 ) ( -2 -32 80 ) COMP1_1 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -8 24 0 ) ( -2 24 0 ) ( -2 24 80 ) COMP1_1 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -2 -32 0 ) ( -8 -32 0 ) ( -8 -32 80 ) COMP1_1 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +} +{ +"classname" "light" +"light" "200" +"wait" "1" +"origin" "-727 181 105" +} +{ +"classname" "light" +"light" "200" +"wait" "1" +"origin" "-790 86 109" +} +{ +"classname" "light" +"light" "175" +"wait" "1" +"origin" "-590 78 213" +} +{ +"classname" "light" +"light" "200" +"wait" "1" +"origin" "-467 191 105" +} +{ +"classname" "light" +"light" "200" +"wait" "1" +"origin" "-334 86 125" +} +{ +"classname" "light" +"light" "200" +"wait" "1" +"origin" "-397 -82 213" +} +{ +"classname" "light" +"light" "175" +"wait" "1" +"origin" "-273 -194 105" +} +{ +"classname" "light" +"light" "200" +"wait" "1" +"origin" "-657 -71 105" +} +{ +"classname" "light" +"light" "175" +"wait" "1" +"origin" "-787 -197 105" +} +{ +"classname" "light" +"light" "175" +"wait" "1" +"origin" "-527 -194 105" +} +{ +"classname" "light" +"light" "200" +"wait" "1" +"origin" "-83 -1 73" +} +{ +"classname" "ass_hardlight" +"spawnflags" "2" +{ +( -592 256 272 ) ( -592 296 272 ) ( -416 296 272 ) TRIGGER [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -592 296 208 ) ( -592 256 208 ) ( -416 256 208 ) TRIGGER [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -592 256 208 ) ( -592 296 208 ) ( -592 296 272 ) TRIGGER [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -416 296 208 ) ( -416 256 208 ) ( -416 256 272 ) TRIGGER [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -592 296 208 ) ( -416 296 208 ) ( -416 296 272 ) TRIGGER [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -416 256 208 ) ( -592 256 208 ) ( -592 256 272 ) TRIGGER [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +} +{ +"classname" "func_particlefield" +"spawnflags" "3" +"cnt" "3" +"targetname" "window" +{ +( -592 256 272 ) ( -592 288 272 ) ( -528 288 272 ) TRIGGER [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -592 288 208 ) ( -592 256 208 ) ( -528 256 208 ) TRIGGER [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -592 256 208 ) ( -592 288 208 ) ( -592 288 272 ) TRIGGER [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -528 288 208 ) ( -528 256 208 ) ( -528 256 272 ) TRIGGER [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -592 288 208 ) ( -528 288 208 ) ( -528 288 272 ) TRIGGER [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -528 256 208 ) ( -592 256 208 ) ( -592 256 272 ) TRIGGER [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +} +{ +"classname" "func_particlefield" +"spawnflags" "3" +"cnt" "2" +"targetname" "window" +{ +( -528 256 272 ) ( -528 288 272 ) ( -464 288 272 ) TRIGGER [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -528 288 208 ) ( -528 256 208 ) ( -464 256 208 ) TRIGGER [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -528 256 208 ) ( -528 288 208 ) ( -528 288 272 ) TRIGGER [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -464 288 208 ) ( -464 256 208 ) ( -464 256 272 ) TRIGGER [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -528 288 208 ) ( -464 288 208 ) ( -464 288 272 ) TRIGGER [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -464 256 208 ) ( -528 256 208 ) ( -528 256 272 ) TRIGGER [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +} +{ +"classname" "func_particlefield" +"spawnflags" "3" +"cnt" "1" +"targetname" "window" +{ +( -464 256 272 ) ( -464 288 272 ) ( -416 288 272 ) TRIGGER [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -464 288 208 ) ( -464 256 208 ) ( -416 256 208 ) TRIGGER [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -464 256 208 ) ( -464 288 208 ) ( -464 288 272 ) TRIGGER [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -416 288 208 ) ( -416 256 208 ) ( -416 256 272 ) TRIGGER [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -464 288 208 ) ( -416 288 208 ) ( -416 288 272 ) TRIGGER [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -416 256 208 ) ( -464 256 208 ) ( -464 256 272 ) TRIGGER [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +} +{ +"classname" "func_counter" +"spawnflags" "66" +"target" "window" +"count" "3" +"wait" "0.3" +"origin" "-512 368 240" +} +{ +"classname" "light" +"light" "300" +"wait" "1" +"origin" "-508 256 284" +} +{ +"classname" "ass_portalproof" +{ +( -832 -256 0 ) ( -832 256 0 ) ( -640 256 0 ) NOPORTAL [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -832 256 -256 ) ( -832 -256 -256 ) ( -640 -256 -256 ) NOPORTAL [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -832 -256 -256 ) ( -832 256 -256 ) ( -832 256 0 ) NOPORTAL [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -640 256 -256 ) ( -640 -256 -256 ) ( -640 -256 0 ) NOPORTAL [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -832 256 -256 ) ( -640 256 -256 ) ( -640 256 0 ) NOPORTAL [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -640 -256 -256 ) ( -832 -256 -256 ) ( -832 -256 0 ) NOPORTAL [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +} +{ +"classname" "ass_gravitygrill" +{ +( -288 -256 320 ) ( -288 256 320 ) ( -192 256 320 ) TRIGGER [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -288 256 0 ) ( -288 -256 0 ) ( -192 -256 0 ) TRIGGER [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -288 -256 0 ) ( -288 256 0 ) ( -288 256 320 ) TRIGGER [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -192 256 0 ) ( -192 -256 0 ) ( -192 -256 320 ) TRIGGER [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -288 256 0 ) ( -192 256 0 ) ( -192 256 320 ) TRIGGER [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -192 -256 0 ) ( -288 -256 0 ) ( -288 -256 320 ) TRIGGER [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +} +{ +"classname" "ass_gravitygrill" +{ +( -768 -256 320 ) ( -768 256 320 ) ( -656 256 320 ) TRIGGER [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -768 256 0 ) ( -768 -256 0 ) ( -656 -256 0 ) TRIGGER [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -768 -256 0 ) ( -768 256 0 ) ( -768 256 320 ) TRIGGER [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -656 256 0 ) ( -656 -256 0 ) ( -656 -256 320 ) TRIGGER [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -768 256 0 ) ( -656 256 0 ) ( -656 256 320 ) TRIGGER [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -656 -256 0 ) ( -768 -256 0 ) ( -768 -256 320 ) TRIGGER [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +} +{ +"classname" "light" +"light" "200" +"wait" "1" +"origin" "-448 128 -128" +} +{ +"classname" "light" +"light" "200" +"wait" "1" +"origin" "-448 -128 -128" +} +{ +"classname" "ass_portalproof" +{ +( -512 256 208 ) ( -512 256 -256 ) ( -832 256 -256 ) NOPORTAL [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -832 256 208 ) ( -832 256 -256 ) ( -832 432 -256 ) NOPORTAL [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -512 432 208 ) ( -512 432 -256 ) ( -512 256 -256 ) NOPORTAL [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -832 432 208 ) ( -832 432 -256 ) ( -512 432 -256 ) NOPORTAL [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -832 432 -256 ) ( -832 256 -256 ) ( -512 256 -256 ) NOPORTAL [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -512 256 208 ) ( -832 256 208 ) ( -832 432 208 ) FLOOR3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +} +{ +( -593 256 208 ) ( -832 256 208 ) ( -832 256 272 ) NOPORTAL [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -832 256 272 ) ( -832 256 208 ) ( -832 432 208 ) NOPORTAL [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -832 432 272 ) ( -832 432 208 ) ( -593 432 208 ) NOPORTAL [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -593 256 272 ) ( -832 256 272 ) ( -832 432 272 ) NOPORTAL [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -593 432 208 ) ( -832 432 208 ) ( -832 256 208 ) NOPORTAL [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -593 432 272 ) ( -593 432 208 ) ( -593 256 208 ) FLOOR3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +{ +( -832 256 272 ) ( -832 256 320 ) ( -544 256 320 ) NOPORTAL [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -544 256 320 ) ( -832 256 320 ) ( -832 432 320 ) NOPORTAL [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -832 256 320 ) ( -832 256 272 ) ( -832 432 272 ) NOPORTAL [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -544 256 272 ) ( -544 256 320 ) ( -544 432 320 ) NOPORTAL [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -544 432 272 ) ( -544 432 320 ) ( -832 432 320 ) NOPORTAL [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -832 432 272 ) ( -832 256 272 ) ( -544 256 272 ) FLOOR3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +} +{ +( -832 -320 360 ) ( -832 320 360 ) ( -448 320 360 ) NOPORTAL [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -832 320 320 ) ( -832 320 360 ) ( -832 -320 360 ) NOPORTAL [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -448 -320 320 ) ( -448 -320 360 ) ( -448 320 360 ) NOPORTAL [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -448 320 320 ) ( -448 320 360 ) ( -832 320 360 ) NOPORTAL [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -832 -320 320 ) ( -832 -320 360 ) ( -448 -320 360 ) NOPORTAL [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -832 320 320 ) ( -832 -320 320 ) ( -448 -320 320 ) NOPORTAL [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +} +{ +( -880 -320 320 ) ( -880 320 320 ) ( -832 320 320 ) NOPORTAL [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -880 320 -64 ) ( -880 -320 -64 ) ( -832 -320 -64 ) NOPORTAL [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -880 -320 -64 ) ( -880 320 -64 ) ( -880 320 320 ) NOPORTAL [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -832 320 -64 ) ( -832 -320 -64 ) ( -832 -320 320 ) NOPORTAL [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -880 320 -64 ) ( -832 320 -64 ) ( -832 320 320 ) NOPORTAL [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -832 -320 -64 ) ( -880 -320 -64 ) ( -880 -320 320 ) NOPORTAL [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +} +{ +"classname" "ass_gravitygrill" +"gravity" "20" +{ +( -352 -256 320 ) ( -352 256 320 ) ( -304 256 320 ) TRIGGER [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -352 256 0 ) ( -352 -256 0 ) ( -304 -256 0 ) TRIGGER [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -352 -256 0 ) ( -352 256 0 ) ( -352 256 320 ) TRIGGER [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -304 256 0 ) ( -304 -256 0 ) ( -304 -256 320 ) TRIGGER [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -352 256 0 ) ( -304 256 0 ) ( -304 256 320 ) TRIGGER [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -304 -256 0 ) ( -352 -256 0 ) ( -352 -256 320 ) TRIGGER [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +} +{ +"classname" "ass_gravitygrill" +"gravity" "20" +{ +( -640 -256 320 ) ( -640 256 320 ) ( -592 256 320 ) TRIGGER [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -640 256 0 ) ( -640 -256 0 ) ( -592 -256 0 ) TRIGGER [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -640 -256 0 ) ( -640 256 0 ) ( -640 256 320 ) TRIGGER [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -592 256 0 ) ( -592 -256 0 ) ( -592 -256 320 ) TRIGGER [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -640 256 0 ) ( -592 256 0 ) ( -592 256 320 ) TRIGGER [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -592 -256 0 ) ( -640 -256 0 ) ( -640 -256 320 ) TRIGGER [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +} +{ +"classname" "ass_grill" +{ +( -160 -32 80 ) ( -160 24 80 ) ( -156 24 80 ) TRIGGER [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -160 24 0 ) ( -160 -32 0 ) ( -156 -32 0 ) TRIGGER [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -160 -32 0 ) ( -160 24 0 ) ( -160 24 80 ) TRIGGER [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -156 24 0 ) ( -156 -32 0 ) ( -156 -32 80 ) TRIGGER [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -160 24 0 ) ( -156 24 0 ) ( -156 24 80 ) TRIGGER [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -156 -32 0 ) ( -160 -32 0 ) ( -160 -32 80 ) TRIGGER [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +} diff --git a/src/maps/phystest.map b/src/maps/phystest.map new file mode 100644 index 0000000..3f200e2 --- /dev/null +++ b/src/maps/phystest.map @@ -0,0 +1,134 @@ +{ +"classname" "worldspawn" +"classname" "worldspawn" +"sounds" "1" +"mapversion" "220" +"mapversion" "220" +"wad" "id_base.wad;portal.wad" +{ +( 0 -1280 1280 ) ( 0 640 1280 ) ( 640 640 1280 ) ADOOR03_3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 0 640 1248 ) ( 0 640 1280 ) ( 0 -1280 1280 ) ADOOR03_3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 640 -1280 1248 ) ( 640 -1280 1280 ) ( 640 640 1280 ) ADOOR03_3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 640 640 1248 ) ( 640 640 1280 ) ( 0 640 1280 ) ADOOR03_3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 0 -1280 1248 ) ( 0 -1280 1280 ) ( 640 -1280 1280 ) ADOOR03_3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 0 640 1248 ) ( 0 -1280 1248 ) ( 640 -1280 1248 ) ADOOR03_3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +} +{ +( 0 640 -640 ) ( 0 -1280 -640 ) ( 640 -1280 -640 ) AFLOOR1_3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 0 -1280 -608 ) ( 0 -1280 -640 ) ( 0 640 -640 ) AFLOOR1_3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 640 640 -608 ) ( 640 640 -640 ) ( 640 -1280 -640 ) AFLOOR1_3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 0 640 -608 ) ( 0 640 -640 ) ( 640 640 -640 ) AFLOOR1_3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 640 -1280 -608 ) ( 640 -1280 -640 ) ( 0 -1280 -640 ) AFLOOR1_3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 0 -1280 -608 ) ( 0 640 -608 ) ( 640 640 -608 ) AFLOOR1_3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +} +{ +( 0 -1280 1248 ) ( 0 -1280 -608 ) ( 0 640 -608 ) LGMETAL2 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 0 640 1248 ) ( 0 640 -608 ) ( 32 640 -608 ) LGMETAL2 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 32 -1280 -608 ) ( 0 -1280 -608 ) ( 0 -1280 1248 ) LGMETAL2 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 32 -1280 1248 ) ( 0 -1280 1248 ) ( 0 640 1248 ) LGMETAL2 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 32 640 -608 ) ( 0 640 -608 ) ( 0 -1280 -608 ) LGMETAL2 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 32 640 1248 ) ( 32 640 -608 ) ( 32 -1280 -608 ) LGMETAL2 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +{ +( 640 640 1248 ) ( 640 640 -608 ) ( 640 -1280 -608 ) LGMETAL2 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 608 640 -608 ) ( 640 640 -608 ) ( 640 640 1248 ) LGMETAL2 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 640 -1280 1248 ) ( 640 -1280 -608 ) ( 608 -1280 -608 ) LGMETAL2 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 608 640 1248 ) ( 640 640 1248 ) ( 640 -1280 1248 ) LGMETAL2 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 608 -1280 -608 ) ( 640 -1280 -608 ) ( 640 640 -608 ) LGMETAL2 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 608 -1280 1248 ) ( 608 -1280 -608 ) ( 608 640 -608 ) LGMETAL2 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +{ +( 32 640 -608 ) ( 608 640 -608 ) ( 608 640 1248 ) LGMETAL2 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 32 608 1248 ) ( 32 640 1248 ) ( 608 640 1248 ) LGMETAL2 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 608 640 -608 ) ( 32 640 -608 ) ( 32 608 -608 ) LGMETAL2 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 32 608 -608 ) ( 32 640 -608 ) ( 32 640 1248 ) LGMETAL2 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 608 640 1248 ) ( 608 640 -608 ) ( 608 608 -608 ) LGMETAL2 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 608 608 -608 ) ( 32 608 -608 ) ( 32 608 1248 ) LGMETAL2 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +{ +( 608 -1312 -640 ) ( 32 -1312 -640 ) ( 32 -1312 1280 ) LGMETAL2 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 608 -1312 1280 ) ( 32 -1312 1280 ) ( 32 -1280 1280 ) LGMETAL2 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 32 -1280 -640 ) ( 32 -1312 -640 ) ( 608 -1312 -640 ) LGMETAL2 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 32 -1312 1280 ) ( 32 -1312 -640 ) ( 32 -1280 -640 ) LGMETAL2 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 608 -1280 -640 ) ( 608 -1312 -640 ) ( 608 -1312 1280 ) LGMETAL2 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 32 -1280 -640 ) ( 608 -1280 -640 ) ( 608 -1280 1280 ) LGMETAL2 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +{ +( 256 512 -128 ) ( 256 640 -128 ) ( 384 640 -128 ) ADOOR03_3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 256 640 -192 ) ( 256 512 -192 ) ( 384 512 -192 ) ADOOR03_3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 256 512 -192 ) ( 256 640 -192 ) ( 256 640 -128 ) ADOOR03_3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 384 640 -192 ) ( 384 512 -192 ) ( 384 512 -128 ) ADOOR03_3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 256 640 -192 ) ( 384 640 -192 ) ( 384 640 -128 ) ADOOR03_3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 384 512 -192 ) ( 256 512 -192 ) ( 256 512 -128 ) ADOOR03_3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +{ +( 256 512 256 ) ( 256 640 256 ) ( 384 640 256 ) ADOOR03_3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 256 640 192 ) ( 256 512 192 ) ( 384 512 192 ) ADOOR03_3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 256 512 192 ) ( 256 640 192 ) ( 256 640 256 ) ADOOR03_3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 384 640 192 ) ( 384 512 192 ) ( 384 512 256 ) ADOOR03_3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 256 640 192 ) ( 384 640 192 ) ( 384 640 256 ) ADOOR03_3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 384 512 192 ) ( 256 512 192 ) ( 256 512 256 ) ADOOR03_3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +{ +( 256 512 704 ) ( 256 640 704 ) ( 384 640 704 ) ADOOR03_3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 256 640 640 ) ( 256 512 640 ) ( 384 512 640 ) ADOOR03_3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 256 512 640 ) ( 256 640 640 ) ( 256 640 704 ) ADOOR03_3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 384 640 640 ) ( 384 512 640 ) ( 384 512 704 ) ADOOR03_3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 256 640 640 ) ( 384 640 640 ) ( 384 640 704 ) ADOOR03_3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 384 512 640 ) ( 256 512 640 ) ( 256 512 704 ) ADOOR03_3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +{ +( 256 512 1088 ) ( 256 640 1088 ) ( 384 640 1088 ) ADOOR03_3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 256 640 1024 ) ( 256 512 1024 ) ( 384 512 1024 ) ADOOR03_3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 256 512 1024 ) ( 256 640 1024 ) ( 256 640 1088 ) ADOOR03_3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 384 640 1024 ) ( 384 512 1024 ) ( 384 512 1088 ) ADOOR03_3 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 256 640 1024 ) ( 384 640 1024 ) ( 384 640 1088 ) ADOOR03_3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 384 512 1024 ) ( 256 512 1024 ) ( 256 512 1088 ) ADOOR03_3 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +{ +( 447 596 -132 ) ( 447 623 -132 ) ( 543 623 -132 ) COLUMN1_2 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 447 623 -236 ) ( 447 596 -236 ) ( 543 596 -236 ) COLUMN1_2 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 447 596 -236 ) ( 447 623 -236 ) ( 447 623 -132 ) COLUMN1_2 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 543 623 -236 ) ( 543 596 -236 ) ( 543 596 -132 ) COLUMN1_2 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 447 623 -236 ) ( 543 623 -236 ) ( 543 623 -132 ) COLUMN1_2 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 543 596 -236 ) ( 447 596 -236 ) ( 447 596 -132 ) COLUMN1_2 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +{ +( 271 386 -604 ) ( 271 493 -604 ) ( 377 493 -604 ) COLUMN1_2 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 271 493 -640 ) ( 271 386 -640 ) ( 377 386 -640 ) COLUMN1_2 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 271 386 -640 ) ( 271 493 -640 ) ( 271 493 -604 ) COLUMN1_2 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 377 493 -640 ) ( 377 386 -640 ) ( 377 386 -604 ) COLUMN1_2 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 271 493 -640 ) ( 377 493 -640 ) ( 377 493 -604 ) COLUMN1_2 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 377 386 -640 ) ( 271 386 -640 ) ( 271 386 -604 ) COLUMN1_2 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +{ +( 192 515 1089 ) ( 192 575 1089 ) ( 256 575 1089 ) *TELEPORT [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 192 575 -605 ) ( 192 515 -605 ) ( 256 515 -605 ) *TELEPORT [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 192 515 -605 ) ( 192 575 -605 ) ( 192 575 1089 ) *TELEPORT [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 256 575 -605 ) ( 256 515 -605 ) ( 256 515 1089 ) *TELEPORT [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 192 575 -605 ) ( 256 575 -605 ) ( 256 575 1089 ) *TELEPORT [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 256 515 -605 ) ( 192 515 -605 ) ( 192 515 1089 ) *TELEPORT [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +{ +( 273 125 -603 ) ( 273 232 -603 ) ( 379 232 -603 ) COLUMN1_2 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 273 232 -639 ) ( 273 125 -639 ) ( 379 125 -639 ) COLUMN1_2 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 273 125 -639 ) ( 273 232 -639 ) ( 273 232 -603 ) COLUMN1_2 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 379 232 -639 ) ( 379 125 -639 ) ( 379 125 -603 ) COLUMN1_2 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 273 232 -639 ) ( 379 232 -639 ) ( 379 232 -603 ) COLUMN1_2 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 379 125 -639 ) ( 273 125 -639 ) ( 273 125 -603 ) COLUMN1_2 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +} +{ +"classname" "info_player_start" +"origin" "144 104 -536" +} +{ +"classname" "light" +"light" "2000" +"wait" "1" +"origin" "324 316 284" +} +{ +"classname" "ass_cube" +"origin" "329 -127 -448" +} diff --git a/src/maps/portal.wad b/src/maps/portal.wad new file mode 100644 index 0000000000000000000000000000000000000000..9dcee0999d1614708287801192d50fa13de90584 GIT binary patch literal 140812 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%0A8<9p5VQNN+bh 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ⓈMFh`vF&v&rC936& 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 32) + { + self.use = light_use; + if (self.spawnflags & START_OFF) + lightstyle(self.style, "a"); + else + lightstyle(self.style, "m"); + } +}; + +/*QUAKED light_fluoro (0 1 0) (-8 -8 -8) (8 8 8) START_OFF +Non-displayed light. +Default light value is 300 +Default style is 0 +If targeted, it will toggle between on or off. +Makes steady fluorescent humming sound +*/ +void() light_fluoro = +{ + if (self.style >= 32) + { + self.use = light_use; + if (self.spawnflags & START_OFF) + lightstyle(self.style, "a"); + else + lightstyle(self.style, "m"); + } + + precache_sound ("ambience/fl_hum1.wav"); + ambientsound (self.origin, "ambience/fl_hum1.wav", 0.5, ATTN_STATIC); +}; + +/*QUAKED light_fluorospark (0 1 0) (-8 -8 -8) (8 8 8) +Non-displayed light. +Default light value is 300 +Default style is 10 +Makes sparking, broken fluorescent sound +*/ +void() light_fluorospark = +{ + if (!self.style) + self.style = 10; + + precache_sound ("ambience/buzz1.wav"); + ambientsound (self.origin, "ambience/buzz1.wav", 0.5, ATTN_STATIC); +}; + +/*QUAKED light_globe (0 1 0) (-8 -8 -8) (8 8 8) +Sphere globe light. +Default light value is 300 +Default style is 0 +*/ +void() light_globe = +{ + precache_model ("progs/s_light.spr"); + setmodel (self, "progs/s_light.spr"); + makestatic (self); +}; + +void() FireAmbient = +{ +// precache_sound ("ambience/fire1.wav"); +// attenuate fast +// ambientsound (self.origin, "ambience/fire1.wav", 0.5, ATTN_STATIC); +}; + +/*QUAKED light_torch_small_walltorch (0 .5 0) (-10 -10 -20) (10 10 20) +Short wall torch +Default light value is 200 +Default style is 0 +*/ +void() light_torch_small_walltorch = +{ + precache_model ("progs/flame.mdl"); + setmodel (self, "progs/flame.mdl"); + FireAmbient (); + makestatic (self); +}; + +/*QUAKED light_flame_large_yellow (0 1 0) (-10 -10 -12) (12 12 18) +Large yellow flame ball +*/ +void() light_flame_large_yellow = +{ + precache_model ("progs/flame2.mdl"); + setmodel (self, "progs/flame2.mdl"); + self.frame = 1; + FireAmbient (); + makestatic (self); +}; + +/*QUAKED light_flame_small_yellow (0 1 0) (-8 -8 -8) (8 8 8) START_OFF +Small yellow flame ball +*/ +void() light_flame_small_yellow = +{ + precache_model ("progs/flame2.mdl"); + setmodel (self, "progs/flame2.mdl"); + FireAmbient (); + makestatic (self); +}; + +/*QUAKED light_flame_small_white (0 1 0) (-10 -10 -40) (10 10 40) START_OFF +Small white flame ball +*/ +void() light_flame_small_white = +{ + precache_model ("progs/flame2.mdl"); + setmodel (self, "progs/flame2.mdl"); + FireAmbient (); + makestatic (self); +}; + +//============================================================================ + + +/*QUAKED misc_fireball (0 .5 .8) (-8 -8 -8) (8 8 8) +Lava Balls +*/ + +void() fire_fly; +void() fire_touch; +void() misc_fireball = +{ + + precache_model ("progs/lavaball.mdl"); + self.classname = "fireball"; + self.nextthink = time + (random() * 5); + self.think = fire_fly; + if (!self.speed) + self.speed = 1000; +}; + +void() fire_fly = +{ +local entity fireball; + + fireball = spawn(); + fireball.solid = SOLID_TRIGGER; + fireball.movetype = MOVETYPE_TOSS; + fireball.velocity = '0 0 1000'; + fireball.velocity_x = (random() * 100) - 50; + fireball.velocity_y = (random() * 100) - 50; + fireball.velocity_z = self.speed + (random() * 200); + fireball.classname = "fireball"; + setmodel (fireball, "progs/lavaball.mdl"); + setsize (fireball, '0 0 0', '0 0 0'); + setorigin (fireball, self.origin); + fireball.nextthink = time + 5; + fireball.think = SUB_Remove; + fireball.touch = fire_touch; + + self.nextthink = time + (random() * 5) + 3; + self.think = fire_fly; +}; + + +void() fire_touch = +{ + T_Damage (other, self, self, 20); + remove(self); +}; + +//============================================================================ + + +void() barrel_explode = +{ + self.takedamage = DAMAGE_NO; + self.classname = "explo_box"; + // did say self.owner + T_RadiusDamage (self, self, 160, world); + sound (self, CHAN_VOICE, "weapons/r_exp3.wav", 1, ATTN_NORM); + particle (self.origin, '0 0 0', 75, 255); + + self.origin_z = self.origin_z + 32; + BecomeExplosion (); +}; + + + +/*QUAKED misc_explobox (0 .5 .8) (0 0 0) (32 32 64) +TESTING THING +*/ + +void() misc_explobox = +{ + local float oldz; + + self.solid = SOLID_BBOX; + self.movetype = MOVETYPE_NONE; + precache_model ("maps/b_explob.bsp"); + setmodel (self, "maps/b_explob.bsp"); + precache_sound ("weapons/r_exp3.wav"); + self.health = 20; + self.th_die = barrel_explode; + self.takedamage = DAMAGE_AIM; + + self.origin_z = self.origin_z + 2; + oldz = self.origin_z; + droptofloor(); + if (oldz - self.origin_z > 250) + { + dprint ("item fell out of level at "); + dprint (vtos(self.origin)); + dprint ("\n"); + remove(self); + } +}; + + + + +/*QUAKED misc_explobox2 (0 .5 .8) (0 0 0) (32 32 64) +Smaller exploding box, REGISTERED ONLY +*/ + +void() misc_explobox2 = +{ + local float oldz; + + self.solid = SOLID_BBOX; + self.movetype = MOVETYPE_NONE; + precache_model2 ("maps/b_exbox2.bsp"); + setmodel (self, "maps/b_exbox2.bsp"); + precache_sound ("weapons/r_exp3.wav"); + self.health = 20; + self.th_die = barrel_explode; + self.takedamage = DAMAGE_AIM; + + self.origin_z = self.origin_z + 2; + oldz = self.origin_z; + droptofloor(); + if (oldz - self.origin_z > 250) + { + dprint ("item fell out of level at "); + dprint (vtos(self.origin)); + dprint ("\n"); + remove(self); + } +}; + +//============================================================================ + +float SPAWNFLAG_SUPERSPIKE = 1; +float SPAWNFLAG_LASER = 2; + +void(vector org, vector vec) LaunchLaser; + +void() spikeshooter_use = +{ + if (self.spawnflags & SPAWNFLAG_LASER) + { + sound (self, CHAN_VOICE, "enforcer/enfire.wav", 1, ATTN_NORM); + LaunchLaser (self.origin, self.movedir); + } + else + { + sound (self, CHAN_VOICE, "weapons/spike2.wav", 1, ATTN_NORM); + launch_spike (self.origin, self.movedir); + newmis.velocity = self.movedir * 500; + if (self.spawnflags & SPAWNFLAG_SUPERSPIKE) + newmis.touch = superspike_touch; + } +}; + +void() shooter_think = +{ + spikeshooter_use (); + self.nextthink = time + self.wait; + newmis.velocity = self.movedir * 500; +}; + + +/*QUAKED trap_spikeshooter (0 .5 .8) (-8 -8 -8) (8 8 8) superspike laser +When triggered, fires a spike in the direction set in QuakeEd. +Laser is only for REGISTERED. +*/ + +void() trap_spikeshooter = +{ + SetMovedir (); + self.use = spikeshooter_use; + if (self.spawnflags & SPAWNFLAG_LASER) + { + precache_model2 ("progs/laser.mdl"); + + precache_sound2 ("enforcer/enfire.wav"); + precache_sound2 ("enforcer/enfstop.wav"); + } + else + precache_sound ("weapons/spike2.wav"); +}; + + +/*QUAKED trap_shooter (0 .5 .8) (-8 -8 -8) (8 8 8) superspike laser +Continuously fires spikes. +"wait" time between spike (1.0 default) +"nextthink" delay before firing first spike, so multiple shooters can be stagered. +*/ +void() trap_shooter = +{ + trap_spikeshooter (); + + if (self.wait == 0) + self.wait = 1; + self.nextthink = self.nextthink + self.wait + self.ltime; + self.think = shooter_think; +}; + + + +/* +=============================================================================== + + +=============================================================================== +*/ + + +void() make_bubbles; +void() bubble_remove; +void() bubble_bob; + +/*QUAKED air_bubbles (0 .5 .8) (-8 -8 -8) (8 8 8) + +testing air bubbles +*/ + +void() air_bubbles = + +{ + if (deathmatch) + { + remove (self); + return; + } + precache_model ("progs/s_bubble.spr"); + self.nextthink = time + 1; + self.think = make_bubbles; +}; + +void() make_bubbles = +{ +local entity bubble; + + bubble = spawn(); + setmodel (bubble, "progs/s_bubble.spr"); + setorigin (bubble, self.origin); + bubble.movetype = MOVETYPE_NOCLIP; + bubble.solid = SOLID_NOT; + bubble.velocity = '0 0 15'; + bubble.nextthink = time + 0.5; + bubble.think = bubble_bob; + bubble.touch = bubble_remove; + bubble.classname = "bubble"; + bubble.frame = 0; + bubble.cnt = 0; + setsize (bubble, '-8 -8 -8', '8 8 8'); + self.nextthink = time + random() + 0.5; + self.think = make_bubbles; +}; + +void() bubble_split = +{ +local entity bubble; + bubble = spawn(); + setmodel (bubble, "progs/s_bubble.spr"); + setorigin (bubble, self.origin); + bubble.movetype = MOVETYPE_NOCLIP; + bubble.solid = SOLID_NOT; + bubble.velocity = self.velocity; + bubble.nextthink = time + 0.5; + bubble.think = bubble_bob; + bubble.touch = bubble_remove; + bubble.classname = "bubble"; + bubble.frame = 1; + bubble.cnt = 10; + setsize (bubble, '-8 -8 -8', '8 8 8'); + self.frame = 1; + self.cnt = 10; + if (self.waterlevel != 3) + remove (self); +}; + +void() bubble_remove = +{ + if (other.classname == self.classname) + { +// dprint ("bump"); + return; + } + remove(self); +}; + +void() bubble_bob = +{ +local float rnd1, rnd2, rnd3; +local vector vtmp1, modi; + + self.cnt = self.cnt + 1; + if (self.cnt == 4) + bubble_split(); + if (self.cnt == 20) + remove(self); + + rnd1 = self.velocity_x + (-10 + (random() * 20)); + rnd2 = self.velocity_y + (-10 + (random() * 20)); + rnd3 = self.velocity_z + 10 + random() * 10; + + if (rnd1 > 10) + rnd1 = 5; + if (rnd1 < -10) + rnd1 = -5; + + if (rnd2 > 10) + rnd2 = 5; + if (rnd2 < -10) + rnd2 = -5; + + if (rnd3 < 10) + rnd3 = 15; + if (rnd3 > 30) + rnd3 = 25; + + self.velocity_x = rnd1; + self.velocity_y = rnd2; + self.velocity_z = rnd3; + + self.nextthink = time + 0.5; + self.think = bubble_bob; +}; + +/*~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~> +~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~*/ + +/*QUAKED viewthing (0 .5 .8) (-8 -8 -8) (8 8 8) + +Just for the debugging level. Don't use +*/ + +void() viewthing = + +{ + self.movetype = MOVETYPE_NONE; + self.solid = SOLID_NOT; + precache_model ("progs/player.mdl"); + setmodel (self, "progs/player.mdl"); +}; + + +/* +============================================================================== + +SIMPLE BMODELS + +============================================================================== +*/ + +void() func_wall_use = +{ // change to alternate textures + self.frame = 1 - self.frame; +}; + +/*QUAKED func_wall (0 .5 .8) ? +This is just a solid wall if not inhibitted +*/ +void() func_wall = +{ + self.angles = '0 0 0'; + self.movetype = MOVETYPE_PUSH; // so it doesn't get pushed by anything + self.solid = SOLID_BSP; + self.use = func_wall_use; + setmodel (self, self.model); +}; + + +/*QUAKED func_illusionary (0 .5 .8) ? +A simple entity that looks solid but lets you walk through it. +*/ +void() func_illusionary = + +{ + self.angles = '0 0 0'; + self.movetype = MOVETYPE_NONE; + self.solid = SOLID_NOT; + setmodel (self, self.model); + makestatic (self); +}; + +/*QUAKED func_episodegate (0 .5 .8) ? E1 E2 E3 E4 +This bmodel will appear if the episode has allready been completed, so players can't reenter it. +*/ +void() func_episodegate = + +{ + if (!(serverflags & self.spawnflags)) + return; // can still enter episode + + self.angles = '0 0 0'; + self.movetype = MOVETYPE_PUSH; // so it doesn't get pushed by anything + self.solid = SOLID_BSP; + self.use = func_wall_use; + setmodel (self, self.model); +}; + +/*QUAKED func_bossgate (0 .5 .8) ? +This bmodel appears unless players have all of the episode sigils. +*/ +void() func_bossgate = + +{ + if ( (serverflags & 15) == 15) + return; // all episodes completed + self.angles = '0 0 0'; + self.movetype = MOVETYPE_PUSH; // so it doesn't get pushed by anything + self.solid = SOLID_BSP; + self.use = func_wall_use; + setmodel (self, self.model); +}; + +//============================================================================ +/*QUAKED ambient_suck_wind (0.3 0.1 0.6) (-10 -10 -8) (10 10 8) +*/ +void() ambient_suck_wind = +{ + precache_sound ("ambience/suck1.wav"); + ambientsound (self.origin, "ambience/suck1.wav", 1, ATTN_STATIC); +}; + +/*QUAKED ambient_drone (0.3 0.1 0.6) (-10 -10 -8) (10 10 8) +*/ +void() ambient_drone = +{ + precache_sound ("ambience/drone6.wav"); + ambientsound (self.origin, "ambience/drone6.wav", 0.5, ATTN_STATIC); +}; + +/*QUAKED ambient_flouro_buzz (0.3 0.1 0.6) (-10 -10 -8) (10 10 8) +*/ +void() ambient_flouro_buzz = +{ + precache_sound ("ambience/buzz1.wav"); + ambientsound (self.origin, "ambience/buzz1.wav", 1, ATTN_STATIC); +}; +/*QUAKED ambient_drip (0.3 0.1 0.6) (-10 -10 -8) (10 10 8) +*/ +void() ambient_drip = +{ + precache_sound ("ambience/drip1.wav"); + ambientsound (self.origin, "ambience/drip1.wav", 0.5, ATTN_STATIC); +}; +/*QUAKED ambient_comp_hum (0.3 0.1 0.6) (-10 -10 -8) (10 10 8) +*/ +void() ambient_comp_hum = +{ + precache_sound ("ambience/comp1.wav"); + ambientsound (self.origin, "ambience/comp1.wav", 1, ATTN_STATIC); +}; +/*QUAKED ambient_thunder (0.3 0.1 0.6) (-10 -10 -8) (10 10 8) +*/ +void() ambient_thunder = +{ + precache_sound ("ambience/thunder1.wav"); + ambientsound (self.origin, "ambience/thunder1.wav", 0.5, ATTN_STATIC); +}; +/*QUAKED ambient_light_buzz (0.3 0.1 0.6) (-10 -10 -8) (10 10 8) +*/ +void() ambient_light_buzz = +{ + precache_sound ("ambience/fl_hum1.wav"); + ambientsound (self.origin, "ambience/fl_hum1.wav", 0.5, ATTN_STATIC); +}; +/*QUAKED ambient_swamp1 (0.3 0.1 0.6) (-10 -10 -8) (10 10 8) +*/ +void() ambient_swamp1 = +{ + precache_sound ("ambience/swamp1.wav"); + ambientsound (self.origin, "ambience/swamp1.wav", 0.5, ATTN_STATIC); +}; +/*QUAKED ambient_swamp2 (0.3 0.1 0.6) (-10 -10 -8) (10 10 8) +*/ +void() ambient_swamp2 = +{ + precache_sound ("ambience/swamp2.wav"); + ambientsound (self.origin, "ambience/swamp2.wav", 0.5, ATTN_STATIC); +}; + +//============================================================================ + +void() noise_think = +{ + self.nextthink = time + 0.5; + sound (self, 1, "enforcer/enfire.wav", 1, ATTN_NORM); + sound (self, 2, "enforcer/enfstop.wav", 1, ATTN_NORM); + sound (self, 3, "enforcer/sight1.wav", 1, ATTN_NORM); + sound (self, 4, "enforcer/sight2.wav", 1, ATTN_NORM); + sound (self, 5, "enforcer/sight3.wav", 1, ATTN_NORM); + sound (self, 6, "enforcer/sight4.wav", 1, ATTN_NORM); + sound (self, 7, "enforcer/pain1.wav", 1, ATTN_NORM); +}; + +/*QUAKED misc_noisemaker (1 0.5 0) (-10 -10 -10) (10 10 10) + +For optimzation testing, starts a lot of sounds. +*/ + +void() misc_noisemaker = + +{ + precache_sound2 ("enforcer/enfire.wav"); + precache_sound2 ("enforcer/enfstop.wav"); + precache_sound2 ("enforcer/sight1.wav"); + precache_sound2 ("enforcer/sight2.wav"); + precache_sound2 ("enforcer/sight3.wav"); + precache_sound2 ("enforcer/sight4.wav"); + precache_sound2 ("enforcer/pain1.wav"); + precache_sound2 ("enforcer/pain2.wav"); + precache_sound2 ("enforcer/death1.wav"); + precache_sound2 ("enforcer/idle1.wav"); + + self.nextthink = time + 0.1 + random(); + self.think = noise_think; +}; diff --git a/src/monsters.qc b/src/monsters.qc new file mode 100644 index 0000000..8b01c4c --- /dev/null +++ b/src/monsters.qc @@ -0,0 +1,236 @@ +/* ALL MONSTERS SHOULD BE 1 0 0 IN COLOR */ + +// name =[framenum, nexttime, nextthink] {code} +// expands to: +// name () +// { +// self.frame=framenum; +// self.nextthink = time + nexttime; +// self.think = nextthink +// +// }; + + +/* +================ +monster_use + +Using a monster makes it angry at the current activator +================ +*/ +void() monster_use = +{ + if (self.enemy) + return; + if (self.health <= 0) + return; + if (activator.items & IT_INVISIBILITY) + return; + if (activator.flags & FL_NOTARGET) + return; + if (activator.classname != "player") + return; + +// delay reaction so if the monster is teleported, its sound is still +// heard + self.enemy = activator; + self.nextthink = time + 0.1; + self.think = FoundTarget; +}; + +/* +================ +monster_death_use + +When a mosnter dies, it fires all of its targets with the current +enemy as activator. +================ +*/ +void() monster_death_use = +{ + local entity ent, otemp, stemp; + +// fall to ground + if (self.flags & FL_FLY) + self.flags = self.flags - FL_FLY; + if (self.flags & FL_SWIM) + self.flags = self.flags - FL_SWIM; + + if (!self.target) + return; + + activator = self.enemy; + SUB_UseTargets (); +}; + + +//============================================================================ + +void() walkmonster_start_go = +{ +local string stemp; +local entity etemp; + + self.origin_z = self.origin_z + 1; // raise off floor a bit + droptofloor(); + + if (!walkmove(0,0)) + { + dprint ("walkmonster in wall at: "); + dprint (vtos(self.origin)); + dprint ("\n"); + } + + self.takedamage = DAMAGE_AIM; + + self.ideal_yaw = self.angles * '0 1 0'; + if (!self.yaw_speed) + self.yaw_speed = 20; + self.view_ofs = '0 0 25'; + self.use = monster_use; + + self.flags = self.flags | FL_MONSTER; + + if (self.target) + { + self.goalentity = self.movetarget = find(world, targetname, self.target); + self.ideal_yaw = vectoyaw(self.goalentity.origin - self.origin); + if (!self.movetarget) + { + dprint ("Monster can't find target at "); + dprint (vtos(self.origin)); + dprint ("\n"); + } +// this used to be an objerror + if (self.movetarget.classname == "path_corner") + self.th_walk (); + else + self.pausetime = 99999999; + self.th_stand (); + } + else + { + self.pausetime = 99999999; + self.th_stand (); + } + +// spread think times so they don't all happen at same time + self.nextthink = self.nextthink + random()*0.5; +}; + + +void() walkmonster_start = +{ +// delay drop to floor to make sure all doors have been spawned +// spread think times so they don't all happen at same time + self.nextthink = self.nextthink + random()*0.5; + self.think = walkmonster_start_go; + total_monsters = total_monsters + 1; +}; + + + +void() flymonster_start_go = +{ + self.takedamage = DAMAGE_AIM; + + self.ideal_yaw = self.angles * '0 1 0'; + if (!self.yaw_speed) + self.yaw_speed = 10; + self.view_ofs = '0 0 25'; + self.use = monster_use; + + self.flags = self.flags | FL_FLY; + self.flags = self.flags | FL_MONSTER; + + if (!walkmove(0,0)) + { + dprint ("flymonster in wall at: "); + dprint (vtos(self.origin)); + dprint ("\n"); + } + + if (self.target) + { + self.goalentity = self.movetarget = find(world, targetname, self.target); + if (!self.movetarget) + { + dprint ("Monster can't find target at "); + dprint (vtos(self.origin)); + dprint ("\n"); + } +// this used to be an objerror + if (self.movetarget.classname == "path_corner") + self.th_walk (); + else + self.pausetime = 99999999; + self.th_stand (); + } + else + { + self.pausetime = 99999999; + self.th_stand (); + } +}; + +void() flymonster_start = +{ +// spread think times so they don't all happen at same time + self.nextthink = self.nextthink + random()*0.5; + self.think = flymonster_start_go; + total_monsters = total_monsters + 1; +}; + + +void() swimmonster_start_go = +{ + if (deathmatch) + { + remove(self); + return; + } + + self.takedamage = DAMAGE_AIM; +// total_monsters = total_monsters + 1; + + self.ideal_yaw = self.angles * '0 1 0'; + if (!self.yaw_speed) + self.yaw_speed = 10; + self.view_ofs = '0 0 10'; + self.use = monster_use; + + self.flags = self.flags | FL_SWIM; + self.flags = self.flags | FL_MONSTER; + + if (self.target) + { + self.goalentity = self.movetarget = find(world, targetname, self.target); + if (!self.movetarget) + { + dprint ("Monster can't find target at "); + dprint (vtos(self.origin)); + dprint ("\n"); + } +// this used to be an objerror + self.ideal_yaw = vectoyaw(self.goalentity.origin - self.origin); + self.th_walk (); + } + else + { + self.pausetime = 99999999; + self.th_stand (); + } + +// spread think times so they don't all happen at same time + self.nextthink = self.nextthink + random()*0.5; +}; + +void() swimmonster_start = +{ +// spread think times so they don't all happen at same time + self.nextthink = self.nextthink + random()*0.5; + self.think = swimmonster_start_go; + total_monsters = total_monsters + 1; +}; + + diff --git a/src/ogre.qc b/src/ogre.qc new file mode 100644 index 0000000..395d458 --- /dev/null +++ b/src/ogre.qc @@ -0,0 +1,461 @@ +/* +============================================================================== + +OGRE + +============================================================================== +*/ + +$cd id1/models/ogre_c +$origin 0 0 24 +$base base +$skin base + +$frame stand1 stand2 stand3 stand4 stand5 stand6 stand7 stand8 stand9 + +$frame walk1 walk2 walk3 walk4 walk5 walk6 walk7 +$frame walk8 walk9 walk10 walk11 walk12 walk13 walk14 walk15 walk16 + +$frame run1 run2 run3 run4 run5 run6 run7 run8 + +$frame swing1 swing2 swing3 swing4 swing5 swing6 swing7 +$frame swing8 swing9 swing10 swing11 swing12 swing13 swing14 + +$frame smash1 smash2 smash3 smash4 smash5 smash6 smash7 +$frame smash8 smash9 smash10 smash11 smash12 smash13 smash14 + +$frame shoot1 shoot2 shoot3 shoot4 shoot5 shoot6 + +$frame pain1 pain2 pain3 pain4 pain5 + +$frame painb1 painb2 painb3 + +$frame painc1 painc2 painc3 painc4 painc5 painc6 + +$frame paind1 paind2 paind3 paind4 paind5 paind6 paind7 paind8 paind9 paind10 +$frame paind11 paind12 paind13 paind14 paind15 paind16 + +$frame paine1 paine2 paine3 paine4 paine5 paine6 paine7 paine8 paine9 paine10 +$frame paine11 paine12 paine13 paine14 paine15 + +$frame death1 death2 death3 death4 death5 death6 +$frame death7 death8 death9 death10 death11 death12 +$frame death13 death14 + +$frame bdeath1 bdeath2 bdeath3 bdeath4 bdeath5 bdeath6 +$frame bdeath7 bdeath8 bdeath9 bdeath10 + +$frame pull1 pull2 pull3 pull4 pull5 pull6 pull7 pull8 pull9 pull10 pull11 + +//============================================================================= + + +void() OgreGrenadeExplode = +{ + T_RadiusDamage (self, self.owner, 40, world); + sound (self, CHAN_VOICE, "weapons/r_exp3.wav", 1, ATTN_NORM); + + WriteByte (MSG_BROADCAST, SVC_TEMPENTITY); + WriteByte (MSG_BROADCAST, TE_EXPLOSION); + WriteCoord (MSG_BROADCAST, self.origin_x); + WriteCoord (MSG_BROADCAST, self.origin_y); + WriteCoord (MSG_BROADCAST, self.origin_z); + + self.velocity = '0 0 0'; + self.touch = SUB_Null; + setmodel (self, "progs/s_explod.spr"); + self.solid = SOLID_NOT; + s_explode1 (); +}; + +void() OgreGrenadeTouch = +{ + if (other == self.owner) + return; // don't explode on owner + if (other.takedamage == DAMAGE_AIM) + { + OgreGrenadeExplode(); + return; + } + sound (self, CHAN_VOICE, "weapons/bounce.wav", 1, ATTN_NORM); // bounce sound + if (self.velocity == '0 0 0') + self.avelocity = '0 0 0'; +}; + +/* +================ +OgreFireGrenade +================ +*/ +void() OgreFireGrenade = +{ + local entity missile, mpuff; + + self.effects = self.effects | EF_MUZZLEFLASH; + + sound (self, CHAN_WEAPON, "weapons/grenade.wav", 1, ATTN_NORM); + + missile = spawn (); + missile.owner = self; + missile.movetype = MOVETYPE_BOUNCE; + missile.solid = SOLID_BBOX; + +// set missile speed + + makevectors (self.angles); + + missile.velocity = normalize(self.enemy.origin - self.origin); + missile.velocity = missile.velocity * 600; + missile.velocity_z = 200; + + missile.avelocity = '300 300 300'; + + missile.angles = vectoangles(missile.velocity); + + missile.touch = OgreGrenadeTouch; + +// set missile duration + missile.nextthink = time + 2.5; + missile.think = OgreGrenadeExplode; + + setmodel (missile, "progs/grenade.mdl"); + setsize (missile, '0 0 0', '0 0 0'); + setorigin (missile, self.origin); +}; + + +//============================================================================= + +/* +================ +chainsaw + +FIXME +================ +*/ +void(float side) chainsaw = +{ +local vector delta; +local float ldmg; + + if (!self.enemy) + return; + if (!CanDamage (self.enemy, self)) + return; + + ai_charge(10); + + delta = self.enemy.origin - self.origin; + + if (vlen(delta) > 100) + return; + + ldmg = (random() + random() + random()) * 4; + T_Damage (self.enemy, self, self, ldmg); + + if (side) + { + makevectors (self.angles); + if (side == 1) + SpawnMeatSpray (self.origin + v_forward*16, crandom() * 100 * v_right); + else + SpawnMeatSpray (self.origin + v_forward*16, side * v_right); + } +}; + + +void() ogre_stand1 =[ $stand1, ogre_stand2 ] {ai_stand();}; +void() ogre_stand2 =[ $stand2, ogre_stand3 ] {ai_stand();}; +void() ogre_stand3 =[ $stand3, ogre_stand4 ] {ai_stand();}; +void() ogre_stand4 =[ $stand4, ogre_stand5 ] {ai_stand();}; +void() ogre_stand5 =[ $stand5, ogre_stand6 ] { +if (random() < 0.2) + sound (self, CHAN_VOICE, "ogre/ogidle.wav", 1, ATTN_IDLE); +ai_stand(); +}; +void() ogre_stand6 =[ $stand6, ogre_stand7 ] {ai_stand();}; +void() ogre_stand7 =[ $stand7, ogre_stand8 ] {ai_stand();}; +void() ogre_stand8 =[ $stand8, ogre_stand9 ] {ai_stand();}; +void() ogre_stand9 =[ $stand9, ogre_stand1 ] {ai_stand();}; + +void() ogre_walk1 =[ $walk1, ogre_walk2 ] {ai_walk(3);}; +void() ogre_walk2 =[ $walk2, ogre_walk3 ] {ai_walk(2);}; +void() ogre_walk3 =[ $walk3, ogre_walk4 ] { +ai_walk(2); +if (random() < 0.2) + sound (self, CHAN_VOICE, "ogre/ogidle.wav", 1, ATTN_IDLE); +}; +void() ogre_walk4 =[ $walk4, ogre_walk5 ] {ai_walk(2);}; +void() ogre_walk5 =[ $walk5, ogre_walk6 ] {ai_walk(2);}; +void() ogre_walk6 =[ $walk6, ogre_walk7 ] { +ai_walk(5); +if (random() < 0.1) + sound (self, CHAN_VOICE, "ogre/ogdrag.wav", 1, ATTN_IDLE); +}; +void() ogre_walk7 =[ $walk7, ogre_walk8 ] {ai_walk(3);}; +void() ogre_walk8 =[ $walk8, ogre_walk9 ] {ai_walk(2);}; +void() ogre_walk9 =[ $walk9, ogre_walk10 ] {ai_walk(3);}; +void() ogre_walk10 =[ $walk10, ogre_walk11 ] {ai_walk(1);}; +void() ogre_walk11 =[ $walk11, ogre_walk12 ] {ai_walk(2);}; +void() ogre_walk12 =[ $walk12, ogre_walk13 ] {ai_walk(3);}; +void() ogre_walk13 =[ $walk13, ogre_walk14 ] {ai_walk(3);}; +void() ogre_walk14 =[ $walk14, ogre_walk15 ] {ai_walk(3);}; +void() ogre_walk15 =[ $walk15, ogre_walk16 ] {ai_walk(3);}; +void() ogre_walk16 =[ $walk16, ogre_walk1 ] {ai_walk(4);}; + +void() ogre_run1 =[ $run1, ogre_run2 ] {ai_run(9); +if (random() < 0.2) + sound (self, CHAN_VOICE, "ogre/ogidle2.wav", 1, ATTN_IDLE); +}; +void() ogre_run2 =[ $run2, ogre_run3 ] {ai_run(12);}; +void() ogre_run3 =[ $run3, ogre_run4 ] {ai_run(8);}; +void() ogre_run4 =[ $run4, ogre_run5 ] {ai_run(22);}; +void() ogre_run5 =[ $run5, ogre_run6 ] {ai_run(16);}; +void() ogre_run6 =[ $run6, ogre_run7 ] {ai_run(4);}; +void() ogre_run7 =[ $run7, ogre_run8 ] {ai_run(13);}; +void() ogre_run8 =[ $run8, ogre_run1 ] {ai_run(24);}; + +void() ogre_swing1 =[ $swing1, ogre_swing2 ] {ai_charge(11); +sound (self, CHAN_WEAPON, "ogre/ogsawatk.wav", 1, ATTN_NORM); +}; +void() ogre_swing2 =[ $swing2, ogre_swing3 ] {ai_charge(1);}; +void() ogre_swing3 =[ $swing3, ogre_swing4 ] {ai_charge(4);}; +void() ogre_swing4 =[ $swing4, ogre_swing5 ] {ai_charge(13);}; +void() ogre_swing5 =[ $swing5, ogre_swing6 ] {ai_charge(9); chainsaw(0);self.angles_y = self.angles_y + random()*25;}; +void() ogre_swing6 =[ $swing6, ogre_swing7 ] {chainsaw(200);self.angles_y = self.angles_y + random()* 25;}; +void() ogre_swing7 =[ $swing7, ogre_swing8 ] {chainsaw(0);self.angles_y = self.angles_y + random()* 25;}; +void() ogre_swing8 =[ $swing8, ogre_swing9 ] {chainsaw(0);self.angles_y = self.angles_y + random()* 25;}; +void() ogre_swing9 =[ $swing9, ogre_swing10 ] {chainsaw(0);self.angles_y = self.angles_y + random()* 25;}; +void() ogre_swing10 =[ $swing10, ogre_swing11 ] {chainsaw(-200);self.angles_y = self.angles_y + random()* 25;}; +void() ogre_swing11 =[ $swing11, ogre_swing12 ] {chainsaw(0);self.angles_y = self.angles_y + random()* 25;}; +void() ogre_swing12 =[ $swing12, ogre_swing13 ] {ai_charge(3);}; +void() ogre_swing13 =[ $swing13, ogre_swing14 ] {ai_charge(8);}; +void() ogre_swing14 =[ $swing14, ogre_run1 ] {ai_charge(9);}; + +void() ogre_smash1 =[ $smash1, ogre_smash2 ] {ai_charge(6); +sound (self, CHAN_WEAPON, "ogre/ogsawatk.wav", 1, ATTN_NORM); +}; +void() ogre_smash2 =[ $smash2, ogre_smash3 ] {ai_charge(0);}; +void() ogre_smash3 =[ $smash3, ogre_smash4 ] {ai_charge(0);}; +void() ogre_smash4 =[ $smash4, ogre_smash5 ] {ai_charge(1);}; +void() ogre_smash5 =[ $smash5, ogre_smash6 ] {ai_charge(4);}; +void() ogre_smash6 =[ $smash6, ogre_smash7 ] {ai_charge(4); chainsaw(0);}; +void() ogre_smash7 =[ $smash7, ogre_smash8 ] {ai_charge(4); chainsaw(0);}; +void() ogre_smash8 =[ $smash8, ogre_smash9 ] {ai_charge(10); chainsaw(0);}; +void() ogre_smash9 =[ $smash9, ogre_smash10 ] {ai_charge(13); chainsaw(0);}; +void() ogre_smash10 =[ $smash10, ogre_smash11 ] {chainsaw(1);}; +void() ogre_smash11 =[ $smash11, ogre_smash12 ] {ai_charge(2); chainsaw(0); +self.nextthink = self.nextthink + random()*0.2;}; // slight variation +//void() ogre_smash12 =[ $smash12, ogre_smash13 ] {ai_charge();}; +void() ogre_smash12 =[$smash12, ogre_smash13] {ai_charge(0);}; +void() ogre_smash13 =[ $smash13, ogre_smash14 ] {ai_charge(4);}; +void() ogre_smash14 =[ $smash14, ogre_run1 ] {ai_charge(12);}; + +void() ogre_nail1 =[ $shoot1, ogre_nail2 ] {ai_face();}; +void() ogre_nail2 =[ $shoot2, ogre_nail3 ] {ai_face();}; +void() ogre_nail3 =[ $shoot2, ogre_nail4 ] {ai_face();}; +void() ogre_nail4 =[ $shoot3, ogre_nail5 ] {ai_face();OgreFireGrenade();}; +void() ogre_nail5 =[ $shoot4, ogre_nail6 ] {ai_face();}; +void() ogre_nail6 =[ $shoot5, ogre_nail7 ] {ai_face();}; +void() ogre_nail7 =[ $shoot6, ogre_run1 ] {ai_face();}; + +void() ogre_pain1 =[ $pain1, ogre_pain2 ] {}; +void() ogre_pain2 =[ $pain2, ogre_pain3 ] {}; +void() ogre_pain3 =[ $pain3, ogre_pain4 ] {}; +void() ogre_pain4 =[ $pain4, ogre_pain5 ] {}; +void() ogre_pain5 =[ $pain5, ogre_run1 ] {}; + + +void() ogre_painb1 =[ $painb1, ogre_painb2 ] {}; +void() ogre_painb2 =[ $painb2, ogre_painb3 ] {}; +void() ogre_painb3 =[ $painb3, ogre_run1 ] {}; + + +void() ogre_painc1 =[ $painc1, ogre_painc2 ] {}; +void() ogre_painc2 =[ $painc2, ogre_painc3 ] {}; +void() ogre_painc3 =[ $painc3, ogre_painc4 ] {}; +void() ogre_painc4 =[ $painc4, ogre_painc5 ] {}; +void() ogre_painc5 =[ $painc5, ogre_painc6 ] {}; +void() ogre_painc6 =[ $painc6, ogre_run1 ] {}; + + +void() ogre_paind1 =[ $paind1, ogre_paind2 ] {}; +void() ogre_paind2 =[ $paind2, ogre_paind3 ] {ai_pain(10);}; +void() ogre_paind3 =[ $paind3, ogre_paind4 ] {ai_pain(9);}; +void() ogre_paind4 =[ $paind4, ogre_paind5 ] {ai_pain(4);}; +void() ogre_paind5 =[ $paind5, ogre_paind6 ] {}; +void() ogre_paind6 =[ $paind6, ogre_paind7 ] {}; +void() ogre_paind7 =[ $paind7, ogre_paind8 ] {}; +void() ogre_paind8 =[ $paind8, ogre_paind9 ] {}; +void() ogre_paind9 =[ $paind9, ogre_paind10 ] {}; +void() ogre_paind10=[ $paind10, ogre_paind11 ] {}; +void() ogre_paind11=[ $paind11, ogre_paind12 ] {}; +void() ogre_paind12=[ $paind12, ogre_paind13 ] {}; +void() ogre_paind13=[ $paind13, ogre_paind14 ] {}; +void() ogre_paind14=[ $paind14, ogre_paind15 ] {}; +void() ogre_paind15=[ $paind15, ogre_paind16 ] {}; +void() ogre_paind16=[ $paind16, ogre_run1 ] {}; + +void() ogre_paine1 =[ $paine1, ogre_paine2 ] {}; +void() ogre_paine2 =[ $paine2, ogre_paine3 ] {ai_pain(10);}; +void() ogre_paine3 =[ $paine3, ogre_paine4 ] {ai_pain(9);}; +void() ogre_paine4 =[ $paine4, ogre_paine5 ] {ai_pain(4);}; +void() ogre_paine5 =[ $paine5, ogre_paine6 ] {}; +void() ogre_paine6 =[ $paine6, ogre_paine7 ] {}; +void() ogre_paine7 =[ $paine7, ogre_paine8 ] {}; +void() ogre_paine8 =[ $paine8, ogre_paine9 ] {}; +void() ogre_paine9 =[ $paine9, ogre_paine10 ] {}; +void() ogre_paine10=[ $paine10, ogre_paine11 ] {}; +void() ogre_paine11=[ $paine11, ogre_paine12 ] {}; +void() ogre_paine12=[ $paine12, ogre_paine13 ] {}; +void() ogre_paine13=[ $paine13, ogre_paine14 ] {}; +void() ogre_paine14=[ $paine14, ogre_paine15 ] {}; +void() ogre_paine15=[ $paine15, ogre_run1 ] {}; + + +void(entity attacker, float damage) ogre_pain = +{ + local float r; + +// don't make multiple pain sounds right after each other + if (self.pain_finished > time) + return; + + sound (self, CHAN_VOICE, "ogre/ogpain1.wav", 1, ATTN_NORM); + + r = random(); + + if (r < 0.25) + { + ogre_pain1 (); + self.pain_finished = time + 1; + } + else if (r < 0.5) + { + ogre_painb1 (); + self.pain_finished = time + 1; + } + else if (r < 0.75) + { + ogre_painc1 (); + self.pain_finished = time + 1; + } + else if (r < 0.88) + { + ogre_paind1 (); + self.pain_finished = time + 2; + } + else + { + ogre_paine1 (); + self.pain_finished = time + 2; + } +}; + +void() ogre_die1 =[ $death1, ogre_die2 ] {}; +void() ogre_die2 =[ $death2, ogre_die3 ] {}; +void() ogre_die3 =[ $death3, ogre_die4 ] +{self.solid = SOLID_NOT; +self.ammo_rockets = 2;DropBackpack();}; +void() ogre_die4 =[ $death4, ogre_die5 ] {}; +void() ogre_die5 =[ $death5, ogre_die6 ] {}; +void() ogre_die6 =[ $death6, ogre_die7 ] {}; +void() ogre_die7 =[ $death7, ogre_die8 ] {}; +void() ogre_die8 =[ $death8, ogre_die9 ] {}; +void() ogre_die9 =[ $death9, ogre_die10 ] {}; +void() ogre_die10 =[ $death10, ogre_die11 ] {}; +void() ogre_die11 =[ $death11, ogre_die12 ] {}; +void() ogre_die12 =[ $death12, ogre_die13 ] {}; +void() ogre_die13 =[ $death13, ogre_die14 ] {}; +void() ogre_die14 =[ $death14, ogre_die14 ] {}; + +void() ogre_bdie1 =[ $bdeath1, ogre_bdie2 ] {}; +void() ogre_bdie2 =[ $bdeath2, ogre_bdie3 ] {ai_forward(5);}; +void() ogre_bdie3 =[ $bdeath3, ogre_bdie4 ] +{self.solid = SOLID_NOT; +self.ammo_rockets = 2;DropBackpack();}; +void() ogre_bdie4 =[ $bdeath4, ogre_bdie5 ] {ai_forward(1);}; +void() ogre_bdie5 =[ $bdeath5, ogre_bdie6 ] {ai_forward(3);}; +void() ogre_bdie6 =[ $bdeath6, ogre_bdie7 ] {ai_forward(7);}; +void() ogre_bdie7 =[ $bdeath7, ogre_bdie8 ] {ai_forward(25);}; +void() ogre_bdie8 =[ $bdeath8, ogre_bdie9 ] {}; +void() ogre_bdie9 =[ $bdeath9, ogre_bdie10 ] {}; +void() ogre_bdie10 =[ $bdeath10, ogre_bdie10 ] {}; + +void() ogre_die = +{ +// check for gib + if (self.health < -80) + { + sound (self, CHAN_VOICE, "player/udeath.wav", 1, ATTN_NORM); + ThrowHead ("progs/h_ogre.mdl", self.health); + ThrowGib ("progs/gib3.mdl", self.health); + ThrowGib ("progs/gib3.mdl", self.health); + ThrowGib ("progs/gib3.mdl", self.health); + return; + } + + sound (self, CHAN_VOICE, "ogre/ogdth.wav", 1, ATTN_NORM); + + if (random() < 0.5) + ogre_die1 (); + else + ogre_bdie1 (); +}; + +void() ogre_melee = +{ + if (random() > 0.5) + ogre_smash1 (); + else + ogre_swing1 (); +}; + + +/*QUAKED monster_ogre (1 0 0) (-32 -32 -24) (32 32 64) Ambush + +*/ +void() monster_ogre = +{ + if (deathmatch) + { + remove(self); + return; + } + precache_model ("progs/ogre.mdl"); + precache_model ("progs/h_ogre.mdl"); + precache_model ("progs/grenade.mdl"); + + precache_sound ("ogre/ogdrag.wav"); + precache_sound ("ogre/ogdth.wav"); + precache_sound ("ogre/ogidle.wav"); + precache_sound ("ogre/ogidle2.wav"); + precache_sound ("ogre/ogpain1.wav"); + precache_sound ("ogre/ogsawatk.wav"); + precache_sound ("ogre/ogwake.wav"); + + self.solid = SOLID_SLIDEBOX; + self.movetype = MOVETYPE_STEP; + + setmodel (self, "progs/ogre.mdl"); + + setsize (self, VEC_HULL2_MIN, VEC_HULL2_MAX); + self.health = 200; + + self.th_stand = ogre_stand1; + self.th_walk = ogre_walk1; + self.th_run = ogre_run1; + self.th_die = ogre_die; + self.th_melee = ogre_melee; + self.th_missile = ogre_nail1; + self.th_pain = ogre_pain; + + walkmonster_start(); +}; + +void() monster_ogre_marksman = +{ + monster_ogre (); +}; + + diff --git a/src/oldone.qc b/src/oldone.qc new file mode 100644 index 0000000..1664688 --- /dev/null +++ b/src/oldone.qc @@ -0,0 +1,286 @@ +/* +============================================================================== + +OLD ONE + +============================================================================== +*/ +$cd id1/models/old_one +$origin 0 0 24 +$base base +$skin skin +$scale 1 + +void() finale_1; +void() finale_2; +void() finale_3; +void() finale_4; + + +entity shub; + +$frame old1 old2 old3 old4 old5 old6 old7 old8 old9 +$frame old10 old11 old12 old13 old14 old15 old16 old17 old18 old19 +$frame old20 old21 old22 old23 old24 old25 old26 old27 old28 old29 +$frame old30 old31 old32 old33 old34 old35 old36 old37 old38 old39 +$frame old40 old41 old42 old43 old44 old45 old46 + +$frame shake1 shake2 shake3 shake4 shake5 shake6 shake7 shake8 +$frame shake9 shake10 shake11 shake12 shake12 shake13 shake14 +$frame shake15 shake16 shake17 shake18 shake19 shake20 + +//void() old_stand =[ $old1, old_stand ] {}; + +void() old_idle1 =[ $old1, old_idle2 ] {}; +void() old_idle2 =[ $old2, old_idle3 ] {}; +void() old_idle3 =[ $old3, old_idle4 ] {}; +void() old_idle4 =[ $old4, old_idle5 ] {}; +void() old_idle5 =[ $old5, old_idle6 ] {}; +void() old_idle6 =[ $old6, old_idle7 ] {}; +void() old_idle7 =[ $old7, old_idle8 ] {}; +void() old_idle8 =[ $old8, old_idle9 ] {}; +void() old_idle9 =[ $old9, old_idle10 ] {}; +void() old_idle10 =[ $old10, old_idle11 ] {}; +void() old_idle11 =[ $old11, old_idle12 ] {}; +void() old_idle12 =[ $old12, old_idle13 ] {}; +void() old_idle13 =[ $old13, old_idle14 ] {}; +void() old_idle14 =[ $old14, old_idle15 ] {}; +void() old_idle15 =[ $old15, old_idle16 ] {}; +void() old_idle16 =[ $old16, old_idle17 ] {}; +void() old_idle17 =[ $old17, old_idle18 ] {}; +void() old_idle18 =[ $old18, old_idle19 ] {}; +void() old_idle19 =[ $old19, old_idle20 ] {}; +void() old_idle20 =[ $old20, old_idle21 ] {}; +void() old_idle21 =[ $old21, old_idle22 ] {}; +void() old_idle22 =[ $old22, old_idle23 ] {}; +void() old_idle23 =[ $old23, old_idle24 ] {}; +void() old_idle24 =[ $old24, old_idle25 ] {}; +void() old_idle25 =[ $old25, old_idle26 ] {}; +void() old_idle26 =[ $old26, old_idle27 ] {}; +void() old_idle27 =[ $old27, old_idle28 ] {}; +void() old_idle28 =[ $old28, old_idle29 ] {}; +void() old_idle29 =[ $old29, old_idle30 ] {}; +void() old_idle30 =[ $old30, old_idle31 ] {}; +void() old_idle31 =[ $old31, old_idle32 ] {}; +void() old_idle32 =[ $old32, old_idle33 ] {}; +void() old_idle33 =[ $old33, old_idle34 ] {}; +void() old_idle34 =[ $old34, old_idle35 ] {}; +void() old_idle35 =[ $old35, old_idle36 ] {}; +void() old_idle36 =[ $old36, old_idle37 ] {}; +void() old_idle37 =[ $old37, old_idle38 ] {}; +void() old_idle38 =[ $old38, old_idle39 ] {}; +void() old_idle39 =[ $old39, old_idle40 ] {}; +void() old_idle40 =[ $old40, old_idle41 ] {}; +void() old_idle41 =[ $old41, old_idle42 ] {}; +void() old_idle42 =[ $old42, old_idle43 ] {}; +void() old_idle43 =[ $old43, old_idle44 ] {}; +void() old_idle44 =[ $old44, old_idle45 ] {}; +void() old_idle45 =[ $old45, old_idle46 ] {}; +void() old_idle46 =[ $old46, old_idle1 ] {}; + + +void() old_thrash1 =[ $shake1, old_thrash2 ] {lightstyle(0, "m");}; +void() old_thrash2 =[ $shake2, old_thrash3 ] {lightstyle(0, "k");}; +void() old_thrash3 =[ $shake3, old_thrash4 ] {lightstyle(0, "k");}; +void() old_thrash4 =[ $shake4, old_thrash5 ] {lightstyle(0, "i");}; +void() old_thrash5 =[ $shake5, old_thrash6 ] {lightstyle(0, "g");}; +void() old_thrash6 =[ $shake6, old_thrash7 ] {lightstyle(0, "e");}; +void() old_thrash7 =[ $shake7, old_thrash8 ] {lightstyle(0, "c");}; +void() old_thrash8 =[ $shake8, old_thrash9 ] {lightstyle(0, "a");}; +void() old_thrash9 =[ $shake9, old_thrash10 ] {lightstyle(0, "c");}; +void() old_thrash10 =[ $shake10, old_thrash11 ] {lightstyle(0, "e");}; +void() old_thrash11 =[ $shake11, old_thrash12 ] {lightstyle(0, "g");}; +void() old_thrash12 =[ $shake12, old_thrash13 ] {lightstyle(0, "i");}; +void() old_thrash13 =[ $shake13, old_thrash14 ] {lightstyle(0, "k");}; +void() old_thrash14 =[ $shake14, old_thrash15 ] {lightstyle(0, "m");}; +void() old_thrash15 =[ $shake15, old_thrash16 ] {lightstyle(0, "m"); +self.cnt = self.cnt + 1; +if (self.cnt != 3) + self.think = old_thrash1; +}; +void() old_thrash16 =[ $shake16, old_thrash17 ] {lightstyle(0, "g");}; +void() old_thrash17 =[ $shake17, old_thrash18 ] {lightstyle(0, "c");}; +void() old_thrash18 =[ $shake18, old_thrash19 ] {lightstyle(0, "b");}; +void() old_thrash19 =[ $shake19, old_thrash20 ] {lightstyle(0, "a");}; +void() old_thrash20 =[ $shake20, old_thrash20 ] {finale_4();}; + +//============================================================================ + +void() finale_1 = +{ + local entity pos, pl; + local entity timer; + + killed_monsters = killed_monsters + 1; + WriteByte (MSG_ALL, SVC_KILLEDMONSTER); // FIXME: reliable broadcast + + intermission_exittime = time + 10000000; // never allow exit + intermission_running = 1; + + // find the intermission spot + pos = find (world, classname, "info_intermission"); + if (!pos) + error ("no info_intermission"); + pl = find (world, classname, "misc_teleporttrain"); + if (!pl) + error ("no teleporttrain"); + remove (pl); + + WriteByte (MSG_ALL, SVC_FINALE); + WriteString (MSG_ALL, ""); + + pl = find (world, classname, "player"); + while (pl != world) + { + pl.view_ofs = '0 0 0'; + pl.angles = other.v_angle = pos.mangle; + pl.fixangle = TRUE; // turn this way immediately + pl.map = self.map; + pl.nextthink = time + 0.5; + pl.takedamage = DAMAGE_NO; + pl.solid = SOLID_NOT; + pl.movetype = MOVETYPE_NONE; + pl.modelindex = 0; + setorigin (pl, pos.origin); + pl = find (pl, classname, "player"); + } + + // make fake versions of all players as standins, and move the real + // players to the intermission spot + + // wait for 1 second + timer = spawn(); + timer.nextthink = time + 1; + timer.think = finale_2; +}; + +void() finale_2 = +{ + local vector o; + + // start a teleport splash inside shub + + o = shub.origin - '0 100 0'; + WriteByte (MSG_BROADCAST, SVC_TEMPENTITY); + WriteByte (MSG_BROADCAST, TE_TELEPORT); + WriteCoord (MSG_BROADCAST, o_x); + WriteCoord (MSG_BROADCAST, o_y); + WriteCoord (MSG_BROADCAST, o_z); + + sound (shub, CHAN_VOICE, "misc/r_tele1.wav", 1, ATTN_NORM); + + self.nextthink = time + 2; + self.think = finale_3; +}; + +void() finale_3 = +{ + // start shub thrashing wildly + shub.think = old_thrash1; + sound (shub, CHAN_VOICE, "boss2/death.wav", 1, ATTN_NORM); + lightstyle(0, "abcdefghijklmlkjihgfedcb"); +}; + +void() finale_4 = +{ + // throw tons of meat chunks + local vector oldo; + local float x, y, z; + local float r; + local entity n; + + sound (self, CHAN_VOICE, "boss2/pop2.wav", 1, ATTN_NORM); + + oldo = self.origin; + + z = 16; + while (z <= 144) + { + x = -64; + while (x <= 64) + { + y = -64; + while (y <= 64) + { + self.origin_x = oldo_x + x; + self.origin_y = oldo_y + y; + self.origin_z = oldo_z + z; + + r = random(); + if (r < 0.3) + ThrowGib ("progs/gib1.mdl", -999); + else if (r < 0.6) + ThrowGib ("progs/gib2.mdl", -999); + else + ThrowGib ("progs/gib3.mdl", -999); + y = y + 32; + } + x = x + 32; + } + z = z + 96; + } + // start the end text + WriteByte (MSG_ALL, SVC_FINALE); + WriteString (MSG_ALL, "Congratulations and well done! You have\nbeaten the hideous Shub-Niggurath, and\nher hundreds of ugly changelings and\nmonsters. You have proven that your\nskill and your cunning are greater than\nall the powers of Quake. You are the\nmaster now. Id Software salutes you."); + +// put a player model down + n = spawn(); + setmodel (n, "progs/player.mdl"); + oldo = oldo - '32 264 0'; + setorigin (n, oldo); + n.angles = '0 290 0'; + n.frame = 1; + + remove (self); + +// switch cd track + WriteByte (MSG_ALL, SVC_CDTRACK); + WriteByte (MSG_ALL, 3); + WriteByte (MSG_ALL, 3); + lightstyle(0, "m"); +}; + +//============================================================================ + +void () nopain = +{ + self.health = 40000; +}; + +//============================================================================ + + +/*QUAKED monster_oldone (1 0 0) (-16 -16 -24) (16 16 32) +*/ +void() monster_oldone = +{ + if (deathmatch) + { + remove(self); + return; + } + + precache_model2 ("progs/oldone.mdl"); + + precache_sound2 ("boss2/death.wav"); + precache_sound2 ("boss2/idle.wav"); + precache_sound2 ("boss2/sight.wav"); + precache_sound2 ("boss2/pop2.wav"); + + self.solid = SOLID_SLIDEBOX; + self.movetype = MOVETYPE_STEP; + + setmodel (self, "progs/oldone.mdl"); + setsize (self, '-160 -128 -24', '160 128 256'); + + self.health = 40000; // kill by telefrag + self.think = old_idle1; + self.nextthink = time + 0.1; + self.takedamage = DAMAGE_YES; + self.th_pain = nopain; + self.th_die = finale_1; + shub = self; + + total_monsters = total_monsters + 1; +}; + diff --git a/src/plats.qc b/src/plats.qc new file mode 100644 index 0000000..8a8397a --- /dev/null +++ b/src/plats.qc @@ -0,0 +1,364 @@ + + +void() plat_center_touch; +void() plat_outside_touch; +void() plat_trigger_use; +void() plat_go_up; +void() plat_go_down; +void() plat_crush; +float PLAT_LOW_TRIGGER = 1; + +void() plat_spawn_inside_trigger = +{ + local entity trigger; + local vector tmin, tmax; + +// +// middle trigger +// + trigger = spawn(); + trigger.touch = plat_center_touch; + trigger.movetype = MOVETYPE_NONE; + trigger.solid = SOLID_TRIGGER; + trigger.enemy = self; + + tmin = self.mins + '25 25 0'; + tmax = self.maxs - '25 25 -8'; + tmin_z = tmax_z - (self.pos1_z - self.pos2_z + 8); + if (self.spawnflags & PLAT_LOW_TRIGGER) + tmax_z = tmin_z + 8; + + if (self.size_x <= 50) + { + tmin_x = (self.mins_x + self.maxs_x) / 2; + tmax_x = tmin_x + 1; + } + if (self.size_y <= 50) + { + tmin_y = (self.mins_y + self.maxs_y) / 2; + tmax_y = tmin_y + 1; + } + + setsize (trigger, tmin, tmax); +}; + +void() plat_hit_top = +{ + sound (self, CHAN_VOICE, self.noise1, 1, ATTN_NORM); + self.state = STATE_TOP; + self.think = plat_go_down; + self.nextthink = self.ltime + 3; +}; + +void() plat_hit_bottom = +{ + sound (self, CHAN_VOICE, self.noise1, 1, ATTN_NORM); + self.state = STATE_BOTTOM; +}; + +void() plat_go_down = +{ + sound (self, CHAN_VOICE, self.noise, 1, ATTN_NORM); + self.state = STATE_DOWN; + SUB_CalcMove (self.pos2, self.speed, plat_hit_bottom); +}; + +void() plat_go_up = +{ + sound (self, CHAN_VOICE, self.noise, 1, ATTN_NORM); + self.state = STATE_UP; + SUB_CalcMove (self.pos1, self.speed, plat_hit_top); +}; + +void() plat_center_touch = +{ + if (other.classname != "player") + return; + + if (other.health <= 0) + return; + + self = self.enemy; + if (self.state == STATE_BOTTOM) + plat_go_up (); + else if (self.state == STATE_TOP) + self.nextthink = self.ltime + 1; // delay going down +}; + +void() plat_outside_touch = +{ + if (other.classname != "player") + return; + + if (other.health <= 0) + return; + +//dprint ("plat_outside_touch\n"); + self = self.enemy; + if (self.state == STATE_TOP) + plat_go_down (); +}; + +void() plat_trigger_use = +{ + if (self.think) + return; // allready activated + plat_go_down(); +}; + + +void() plat_crush = +{ +//dprint ("plat_crush\n"); + + T_Damage (other, self, self, 1); + + if (self.state == STATE_UP) + plat_go_down (); + else if (self.state == STATE_DOWN) + plat_go_up (); + else + objerror ("plat_crush: bad self.state\n"); +}; + +void() plat_use = +{ + self.use = SUB_Null; + if (self.state != STATE_UP) + objerror ("plat_use: not in up state"); + plat_go_down(); +}; + + +/*QUAKED func_plat (0 .5 .8) ? PLAT_LOW_TRIGGER +speed default 150 + +Plats are always drawn in the extended position, so they will light correctly. + +If the plat is the target of another trigger or button, it will start out disabled in the extended position until it is trigger, when it will lower and become a normal plat. + +If the "height" key is set, that will determine the amount the plat moves, instead of being implicitly determined by the model's height. +Set "sounds" to one of the following: +1) base fast +2) chain slow +*/ + + +void() func_plat = + +{ +local entity t; + + if (!self.t_length) + self.t_length = 80; + if (!self.t_width) + self.t_width = 10; + + if (self.sounds == 0) + self.sounds = 2; +// FIX THIS TO LOAD A GENERIC PLAT SOUND + + if (self.sounds == 1) + { + precache_sound ("plats/plat1.wav"); + precache_sound ("plats/plat2.wav"); + self.noise = "plats/plat1.wav"; + self.noise1 = "plats/plat2.wav"; + } + + if (self.sounds == 2) + { + precache_sound ("plats/medplat1.wav"); + precache_sound ("plats/medplat2.wav"); + self.noise = "plats/medplat1.wav"; + self.noise1 = "plats/medplat2.wav"; + } + + + self.mangle = self.angles; + self.angles = '0 0 0'; + + self.classname = "plat"; + self.solid = SOLID_BSP; + self.movetype = MOVETYPE_PUSH; + setorigin (self, self.origin); + setmodel (self, self.model); + setsize (self, self.mins , self.maxs); + + self.blocked = plat_crush; + if (!self.speed) + self.speed = 150; + +// pos1 is the top position, pos2 is the bottom + self.pos1 = self.origin; + self.pos2 = self.origin; + if (self.height) + self.pos2_z = self.origin_z - self.height; + else + self.pos2_z = self.origin_z - self.size_z + 8; + + self.use = plat_trigger_use; + + plat_spawn_inside_trigger (); // the "start moving" trigger + + if (self.targetname) + { + self.state = STATE_UP; + self.use = plat_use; + } + else + { + setorigin (self, self.pos2); + self.state = STATE_BOTTOM; + } +}; + +//============================================================================ + +void() train_next; +void() func_train_find; + +void() train_blocked = +{ + if (time < self.attack_finished) + return; + self.attack_finished = time + 0.5; + T_Damage (other, self, self, self.dmg); +}; +void() train_use = +{ + if (self.think != func_train_find) + return; // already activated + train_next(); +}; + +void() train_wait = +{ + if (self.wait) + { + self.nextthink = self.ltime + self.wait; + sound (self, CHAN_VOICE, self.noise, 1, ATTN_NORM); + } + else + self.nextthink = self.ltime + 0.1; + + self.think = train_next; +}; + +void() train_next = +{ + local entity targ; + + targ = find (world, targetname, self.target); + self.target = targ.target; + if (!self.target) + objerror ("train_next: no next target"); + if (targ.wait) + self.wait = targ.wait; + else + self.wait = 0; + sound (self, CHAN_VOICE, self.noise1, 1, ATTN_NORM); + SUB_CalcMove (targ.origin - self.mins, self.speed, train_wait); +}; + +void() func_train_find = + +{ + local entity targ; + + targ = find (world, targetname, self.target); + self.target = targ.target; + setorigin (self, targ.origin - self.mins); + if (!self.targetname) + { // not triggered, so start immediately + self.nextthink = self.ltime + 0.1; + self.think = train_next; + } +}; + +/*QUAKED func_train (0 .5 .8) ? +Trains are moving platforms that players can ride. +The targets origin specifies the min point of the train at each corner. +The train spawns at the first target it is pointing at. +If the train is the target of a button or trigger, it will not begin moving until activated. +speed default 100 +dmg default 2 +sounds +1) ratchet metal + +*/ +void() func_train = +{ + if (!self.speed) + self.speed = 100; + if (!self.target) + objerror ("func_train without a target"); + if (!self.dmg) + self.dmg = 2; + + if (self.sounds == 0) + { + self.noise = ("misc/null.wav"); + precache_sound ("misc/null.wav"); + self.noise1 = ("misc/null.wav"); + precache_sound ("misc/null.wav"); + } + + if (self.sounds == 1) + { + self.noise = ("plats/train2.wav"); + precache_sound ("plats/train2.wav"); + self.noise1 = ("plats/train1.wav"); + precache_sound ("plats/train1.wav"); + } + + self.cnt = 1; + self.solid = SOLID_BSP; + self.movetype = MOVETYPE_PUSH; + self.blocked = train_blocked; + self.use = train_use; + self.classname = "train"; + + setmodel (self, self.model); + setsize (self, self.mins , self.maxs); + setorigin (self, self.origin); + +// start trains on the second frame, to make sure their targets have had +// a chance to spawn + self.nextthink = self.ltime + 0.1; + self.think = func_train_find; +}; + +/*QUAKED misc_teleporttrain (0 .5 .8) (-8 -8 -8) (8 8 8) +This is used for the final bos +*/ +void() misc_teleporttrain = +{ + if (!self.speed) + self.speed = 100; + if (!self.target) + objerror ("func_train without a target"); + + self.cnt = 1; + self.solid = SOLID_NOT; + self.movetype = MOVETYPE_PUSH; + self.blocked = train_blocked; + self.use = train_use; + self.avelocity = '100 200 300'; + + self.noise = ("misc/null.wav"); + precache_sound ("misc/null.wav"); + self.noise1 = ("misc/null.wav"); + precache_sound ("misc/null.wav"); + + precache_model2 ("progs/teleport.mdl"); + setmodel (self, "progs/teleport.mdl"); + setsize (self, self.mins , self.maxs); + setorigin (self, self.origin); + +// start trains on the second frame, to make sure their targets have had +// a chance to spawn + self.nextthink = self.ltime + 0.1; + self.think = func_train_find; +}; + diff --git a/src/player.qc b/src/player.qc new file mode 100644 index 0000000..8a2d608 --- /dev/null +++ b/src/player.qc @@ -0,0 +1,670 @@ + +void() bubble_bob; + +/* +============================================================================== + +PLAYER + +============================================================================== +*/ + +$cd id1/models/player_4 +$origin 0 -6 24 +$base base +$skin skin + +// +// running +// +$frame axrun1 axrun2 axrun3 axrun4 axrun5 axrun6 + +$frame rockrun1 rockrun2 rockrun3 rockrun4 rockrun5 rockrun6 + +// +// standing +// +$frame stand1 stand2 stand3 stand4 stand5 + +$frame axstnd1 axstnd2 axstnd3 axstnd4 axstnd5 axstnd6 +$frame axstnd7 axstnd8 axstnd9 axstnd10 axstnd11 axstnd12 + + +// +// pain +// +$frame axpain1 axpain2 axpain3 axpain4 axpain5 axpain6 + +$frame pain1 pain2 pain3 pain4 pain5 pain6 + + +// +// death +// + +$frame axdeth1 axdeth2 axdeth3 axdeth4 axdeth5 axdeth6 +$frame axdeth7 axdeth8 axdeth9 + +$frame deatha1 deatha2 deatha3 deatha4 deatha5 deatha6 deatha7 deatha8 +$frame deatha9 deatha10 deatha11 + +$frame deathb1 deathb2 deathb3 deathb4 deathb5 deathb6 deathb7 deathb8 +$frame deathb9 + +$frame deathc1 deathc2 deathc3 deathc4 deathc5 deathc6 deathc7 deathc8 +$frame deathc9 deathc10 deathc11 deathc12 deathc13 deathc14 deathc15 + +$frame deathd1 deathd2 deathd3 deathd4 deathd5 deathd6 deathd7 +$frame deathd8 deathd9 + +$frame deathe1 deathe2 deathe3 deathe4 deathe5 deathe6 deathe7 +$frame deathe8 deathe9 + +// +// attacks +// +$frame nailatt1 nailatt2 + +$frame light1 light2 + +$frame rockatt1 rockatt2 rockatt3 rockatt4 rockatt5 rockatt6 + +$frame shotatt1 shotatt2 shotatt3 shotatt4 shotatt5 shotatt6 + +$frame axatt1 axatt2 axatt3 axatt4 axatt5 axatt6 + +$frame axattb1 axattb2 axattb3 axattb4 axattb5 axattb6 + +$frame axattc1 axattc2 axattc3 axattc4 axattc5 axattc6 + +$frame axattd1 axattd2 axattd3 axattd4 axattd5 axattd6 + + +/* +============================================================================== +PLAYER +============================================================================== +*/ + +void() player_run; + +void() player_stand1 =[ $axstnd1, player_stand1 ] +{ + self.weaponframe=0; + if (self.velocity_x || self.velocity_y) + { + self.walkframe=0; + player_run(); + return; + } + + if (self.weapon == IT_AXE) + { + if (self.walkframe >= 12) + self.walkframe = 0; + self.frame = $axstnd1 + self.walkframe; + } + else + { + if (self.walkframe >= 5) + self.walkframe = 0; + self.frame = $stand1 + self.walkframe; + } + self.walkframe = self.walkframe + 1; +}; + +void() player_run =[ $rockrun1, player_run ] +{ + self.weaponframe=0; + if (!self.velocity_x && !self.velocity_y) + { + self.walkframe=0; + player_stand1(); + return; + } + + if (self.weapon == IT_AXE) + { + if (self.walkframe == 6) + self.walkframe = 0; + self.frame = $axrun1 + self.walkframe; + } + else + { + if (self.walkframe == 6) + self.walkframe = 0; + self.frame = self.frame + self.walkframe; + } + self.walkframe = self.walkframe + 1; +}; + + +void() player_shot1 = [$shotatt1, player_shot2 ] {self.weaponframe=1; +self.effects = self.effects | EF_MUZZLEFLASH;}; +void() player_shot2 = [$shotatt2, player_shot3 ] {self.weaponframe=2;}; +void() player_shot3 = [$shotatt3, player_shot4 ] {self.weaponframe=3;}; +void() player_shot4 = [$shotatt4, player_shot5 ] {self.weaponframe=4;}; +void() player_shot5 = [$shotatt5, player_shot6 ] {self.weaponframe=5;}; +void() player_shot6 = [$shotatt6, player_run ] {self.weaponframe=6;}; + +void() player_axe1 = [$axatt1, player_axe2 ] {self.weaponframe=1;}; +void() player_axe2 = [$axatt2, player_axe3 ] {self.weaponframe=2;}; +void() player_axe3 = [$axatt3, player_axe4 ] {self.weaponframe=3;W_FireAxe();}; +void() player_axe4 = [$axatt4, player_run ] {self.weaponframe=4;}; + +void() player_axeb1 = [$axattb1, player_axeb2 ] {self.weaponframe=5;}; +void() player_axeb2 = [$axattb2, player_axeb3 ] {self.weaponframe=6;}; +void() player_axeb3 = [$axattb3, player_axeb4 ] {self.weaponframe=7;W_FireAxe();}; +void() player_axeb4 = [$axattb4, player_run ] {self.weaponframe=8;}; + +void() player_axec1 = [$axattc1, player_axec2 ] {self.weaponframe=1;}; +void() player_axec2 = [$axattc2, player_axec3 ] {self.weaponframe=2;}; +void() player_axec3 = [$axattc3, player_axec4 ] {self.weaponframe=3;W_FireAxe();}; +void() player_axec4 = [$axattc4, player_run ] {self.weaponframe=4;}; + +void() player_axed1 = [$axattd1, player_axed2 ] {self.weaponframe=5;}; +void() player_axed2 = [$axattd2, player_axed3 ] {self.weaponframe=6;}; +void() player_axed3 = [$axattd3, player_axed4 ] {self.weaponframe=7;W_FireAxe();}; +void() player_axed4 = [$axattd4, player_run ] {self.weaponframe=8;}; + + +//============================================================================ + +void() player_nail1 =[$nailatt1, player_nail2 ] +{ + self.effects = self.effects | EF_MUZZLEFLASH; + + if (!self.button0) + {player_run ();return;} + self.weaponframe = self.weaponframe + 1; + if (self.weaponframe == 9) + self.weaponframe = 1; + SuperDamageSound(); + W_FireSpikes (4); + self.attack_finished = time + 0.2; +}; +void() player_nail2 =[$nailatt2, player_nail1 ] +{ + self.effects = self.effects | EF_MUZZLEFLASH; + + if (!self.button0) + {player_run ();return;} + self.weaponframe = self.weaponframe + 1; + if (self.weaponframe == 9) + self.weaponframe = 1; + SuperDamageSound(); + W_FireSpikes (-4); + self.attack_finished = time + 0.2; +}; + +//============================================================================ + +void() player_light1 =[$light1, player_light2 ] +{ + self.effects = self.effects | EF_MUZZLEFLASH; + + if (!self.button0) + {player_run ();return;} + self.weaponframe = self.weaponframe + 1; + if (self.weaponframe == 5) + self.weaponframe = 1; + SuperDamageSound(); + W_FireLightning(); + self.attack_finished = time + 0.2; +}; +void() player_light2 =[$light2, player_light1 ] +{ + self.effects = self.effects | EF_MUZZLEFLASH; + + if (!self.button0) + {player_run ();return;} + self.weaponframe = self.weaponframe + 1; + if (self.weaponframe == 5) + self.weaponframe = 1; + SuperDamageSound(); + W_FireLightning(); + self.attack_finished = time + 0.2; +}; + +//============================================================================ + + +void() player_rocket1 =[$rockatt1, player_rocket2 ] {self.weaponframe=1; +self.effects = self.effects | EF_MUZZLEFLASH;}; +void() player_rocket2 =[$rockatt2, player_rocket3 ] {self.weaponframe=2;}; +void() player_rocket3 =[$rockatt3, player_rocket4 ] {self.weaponframe=3;}; +void() player_rocket4 =[$rockatt4, player_rocket5 ] {self.weaponframe=4;}; +void() player_rocket5 =[$rockatt5, player_rocket6 ] {self.weaponframe=5;}; +void() player_rocket6 =[$rockatt6, player_run ] {self.weaponframe=6;}; +void(float num_bubbles) DeathBubbles; + +void() PainSound = +{ +local float rs; + + if (self.health < 0) + return; + + if (damage_attacker.classname == "teledeath") + { + sound (self, CHAN_VOICE, "player/teledth1.wav", 1, ATTN_NONE); + return; + } + +// water pain sounds + if (self.watertype == CONTENT_WATER && self.waterlevel == 3) + { + DeathBubbles(1); + if (random() > 0.5) + sound (self, CHAN_VOICE, "player/drown1.wav", 1, ATTN_NORM); + else + sound (self, CHAN_VOICE, "player/drown2.wav", 1, ATTN_NORM); + return; + } + +// slime pain sounds + if (self.watertype == CONTENT_SLIME) + { +// FIX ME put in some steam here + if (self.waterlevel == 3) + DeathBubbles(1); + if (random() > 0.5) + sound (self, CHAN_VOICE, "player/lburn1.wav", 1, ATTN_NORM); + else + sound (self, CHAN_VOICE, "player/lburn2.wav", 1, ATTN_NORM); + return; + } + + if (self.watertype == CONTENT_LAVA) + { + if (random() > 0.5) + sound (self, CHAN_VOICE, "player/lburn1.wav", 1, ATTN_NORM); + else + sound (self, CHAN_VOICE, "player/lburn2.wav", 1, ATTN_NORM); + return; + } + + if (self.pain_finished > time) + { + self.axhitme = 0; + return; + } + self.pain_finished = time + 0.5; + +// don't make multiple pain sounds right after each other + +// ax pain sound + if (self.axhitme == 1) + { + self.axhitme = 0; + sound (self, CHAN_VOICE, "player/axhit1.wav", 1, ATTN_NORM); + return; + } + + + rs = rint((random() * 5) + 1); + + self.noise = ""; + if (rs == 1) + self.noise = "player/pain1.wav"; + else if (rs == 2) + self.noise = "player/pain2.wav"; + else if (rs == 3) + self.noise = "player/pain3.wav"; + else if (rs == 4) + self.noise = "player/pain4.wav"; + else if (rs == 5) + self.noise = "player/pain5.wav"; + else + self.noise = "player/pain6.wav"; + + sound (self, CHAN_VOICE, self.noise, 1, ATTN_NORM); + return; +}; + +void() player_pain1 = [ $pain1, player_pain2 ] {PainSound();self.weaponframe=0;}; +void() player_pain2 = [ $pain2, player_pain3 ] {}; +void() player_pain3 = [ $pain3, player_pain4 ] {}; +void() player_pain4 = [ $pain4, player_pain5 ] {}; +void() player_pain5 = [ $pain5, player_pain6 ] {}; +void() player_pain6 = [ $pain6, player_run ] {}; + +void() player_axpain1 = [ $axpain1, player_axpain2 ] {PainSound();self.weaponframe=0;}; +void() player_axpain2 = [ $axpain2, player_axpain3 ] {}; +void() player_axpain3 = [ $axpain3, player_axpain4 ] {}; +void() player_axpain4 = [ $axpain4, player_axpain5 ] {}; +void() player_axpain5 = [ $axpain5, player_axpain6 ] {}; +void() player_axpain6 = [ $axpain6, player_run ] {}; + +void() player_pain = +{ + if (self.weaponframe) + return; + + if (self.invisible_finished > time) + return; // eyes don't have pain frames + + if (self.weapon == IT_AXE) + player_axpain1 (); + else + player_pain1 (); +}; + +void() player_diea1; +void() player_dieb1; +void() player_diec1; +void() player_died1; +void() player_diee1; +void() player_die_ax1; + +void() DeathBubblesSpawn = +{ +local entity bubble; +// if (self.owner.waterlevel != 3) + if ((self.owner.waterlevel != 3) && (self.owner.health > 0)) + { + remove(self); // remove bubble spawner + return; + } + bubble = spawn(); + setmodel (bubble, "progs/s_bubble.spr"); + setorigin (bubble, self.owner.origin + '0 0 24'); + bubble.movetype = MOVETYPE_NOCLIP; + bubble.solid = SOLID_NOT; + bubble.velocity = '0 0 15'; + bubble.nextthink = time + 0.5; + bubble.think = bubble_bob; + bubble.classname = "bubble"; + bubble.frame = 0; + bubble.cnt = 0; + setsize (bubble, '-8 -8 -8', '8 8 8'); +// self.nextthink = time + 0.1; + self.nextthink = time + 0.01; + self.think = DeathBubblesSpawn; + self.air_finished = self.air_finished + 1; + if (self.air_finished >= self.bubble_count) + remove(self); +}; + +void(float num_bubbles) DeathBubbles = +{ +local entity bubble_spawner; + + bubble_spawner = spawn(); + setorigin (bubble_spawner, self.origin); + bubble_spawner.movetype = MOVETYPE_NONE; + bubble_spawner.solid = SOLID_NOT; +// bubble_spawner.nextthink = time + 0.1; + bubble_spawner.nextthink = time + 0.01; + bubble_spawner.think = DeathBubblesSpawn; + bubble_spawner.air_finished = 0; + bubble_spawner.owner = self; + bubble_spawner.bubble_count = num_bubbles; +// return; +}; + + +void() DeathSound = +{ +local float rs; + + // water death sounds + if (self.waterlevel == 3) + { + DeathBubbles(20); + sound (self, CHAN_VOICE, "player/h2odeath.wav", 1, ATTN_NONE); + return; + } + + rs = rint ((random() * 4) + 1); + if (rs == 1) + self.noise = "player/death1.wav"; + if (rs == 2) + self.noise = "player/death2.wav"; + if (rs == 3) + self.noise = "player/death3.wav"; + if (rs == 4) + self.noise = "player/death4.wav"; + if (rs == 5) + self.noise = "player/death5.wav"; + + sound (self, CHAN_VOICE, self.noise, 1, ATTN_NONE); + return; +}; + + +void() PlayerDead = +{ + self.nextthink = -1; +// allow respawn after a certain time + self.deadflag = DEAD_DEAD; +}; + +vector(float dm) VelocityForDamage = +{ + local vector v; + + v_x = 100 * crandom(); + v_y = 100 * crandom(); + v_z = 200 + 100 * random(); + + if (dm > -50) + { +// dprint ("level 1\n"); + v = v * 0.7; + } + else if (dm > -200) + { +// dprint ("level 3\n"); + v = v * 2; + } + else + v = v * 10; + + return v; +}; + +void(string gibname, float dm) ThrowGib = +{ + local entity new; + + new = spawn(); + new.origin = self.origin; + setmodel (new, gibname); + setsize (new, '0 0 0', '0 0 0'); + new.velocity = VelocityForDamage (dm); + new.movetype = MOVETYPE_BOUNCE; + new.solid = SOLID_NOT; + new.avelocity_x = random()*600; + new.avelocity_y = random()*600; + new.avelocity_z = random()*600; + new.think = SUB_Remove; + new.ltime = time; + new.nextthink = time + 10 + random()*10; + new.frame = 0; + new.flags = 0; +}; + +void(string gibname, float dm) ThrowHead = +{ + setmodel (self, gibname); + self.frame = 0; + self.nextthink = -1; + self.movetype = MOVETYPE_BOUNCE; + self.takedamage = DAMAGE_NO; + self.solid = SOLID_NOT; + self.view_ofs = '0 0 8'; + setsize (self, '-16 -16 0', '16 16 56'); + self.velocity = VelocityForDamage (dm); + self.origin_z = self.origin_z - 24; + self.flags = self.flags - (self.flags & FL_ONGROUND); + self.avelocity = crandom() * '0 600 0'; +}; + + +void() GibPlayer = +{ + ThrowHead ("progs/h_player.mdl", self.health); + ThrowGib ("progs/gib1.mdl", self.health); + ThrowGib ("progs/gib2.mdl", self.health); + ThrowGib ("progs/gib3.mdl", self.health); + + self.deadflag = DEAD_DEAD; + + if (damage_attacker.classname == "teledeath") + { + sound (self, CHAN_VOICE, "player/teledth1.wav", 1, ATTN_NONE); + return; + } + + if (damage_attacker.classname == "teledeath2") + { + sound (self, CHAN_VOICE, "player/teledth1.wav", 1, ATTN_NONE); + return; + } + + if (random() < 0.5) + sound (self, CHAN_VOICE, "player/gib.wav", 1, ATTN_NONE); + else + sound (self, CHAN_VOICE, "player/udeath.wav", 1, ATTN_NONE); +}; + +void() PlayerDie = +{ + local float i; + +// self.items = self.items - (self.items & IT_INVISIBILITY); + self.items = self.items - (self.items & + (IT_INVISIBILITY | IT_INVULNERABILITY | IT_SUIT | IT_QUAD) ); + self.invisible_finished = 0; // don't die as eyes + self.invincible_finished = 0; + self.super_damage_finished = 0; + self.radsuit_finished = 0; + self.effects = 0; // 1998-07-23 Glowing corpse of players which had quad/pentagram until respawn fix by Maddes + self.modelindex = modelindex_player; // don't use eyes + + if (deathmatch || coop) + DropBackpack(); + + self.weaponmodel=""; + self.view_ofs = '0 0 -8'; + self.deadflag = DEAD_DYING; + self.solid = SOLID_NOT; + self.flags = self.flags - (self.flags & FL_ONGROUND); + self.movetype = MOVETYPE_TOSS; + if (self.velocity_z < 10) + self.velocity_z = self.velocity_z + random()*300; + + if (self.health < -40) + { + GibPlayer (); + return; + } + + DeathSound(); + + self.angles_x = 0; + self.angles_z = 0; + + if (self.weapon == IT_AXE) + { + player_die_ax1 (); + return; + } + + i = cvar("temp1"); + if (!i) + i = 1 + floor(random()*6); + + if (i == 1) + player_diea1(); + else if (i == 2) + player_dieb1(); + else if (i == 3) + player_diec1(); + else if (i == 4) + player_died1(); + else + player_diee1(); + +}; + +void() set_suicide_frame = +{ // used by klill command and diconnect command + if (self.model != "progs/player.mdl") + return; // allready gibbed + self.frame = $deatha11; + self.solid = SOLID_NOT; + self.movetype = MOVETYPE_TOSS; + self.deadflag = DEAD_DEAD; + self.nextthink = -1; +}; + + +void() player_diea1 = [ $deatha1, player_diea2 ] {}; +void() player_diea2 = [ $deatha2, player_diea3 ] {}; +void() player_diea3 = [ $deatha3, player_diea4 ] {}; +void() player_diea4 = [ $deatha4, player_diea5 ] {}; +void() player_diea5 = [ $deatha5, player_diea6 ] {}; +void() player_diea6 = [ $deatha6, player_diea7 ] {}; +void() player_diea7 = [ $deatha7, player_diea8 ] {}; +void() player_diea8 = [ $deatha8, player_diea9 ] {}; +void() player_diea9 = [ $deatha9, player_diea10 ] {}; +void() player_diea10 = [ $deatha10, player_diea11 ] {}; +void() player_diea11 = [ $deatha11, player_diea11 ] {PlayerDead();}; + +void() player_dieb1 = [ $deathb1, player_dieb2 ] {}; +void() player_dieb2 = [ $deathb2, player_dieb3 ] {}; +void() player_dieb3 = [ $deathb3, player_dieb4 ] {}; +void() player_dieb4 = [ $deathb4, player_dieb5 ] {}; +void() player_dieb5 = [ $deathb5, player_dieb6 ] {}; +void() player_dieb6 = [ $deathb6, player_dieb7 ] {}; +void() player_dieb7 = [ $deathb7, player_dieb8 ] {}; +void() player_dieb8 = [ $deathb8, player_dieb9 ] {}; +void() player_dieb9 = [ $deathb9, player_dieb9 ] {PlayerDead();}; + +void() player_diec1 = [ $deathc1, player_diec2 ] {}; +void() player_diec2 = [ $deathc2, player_diec3 ] {}; +void() player_diec3 = [ $deathc3, player_diec4 ] {}; +void() player_diec4 = [ $deathc4, player_diec5 ] {}; +void() player_diec5 = [ $deathc5, player_diec6 ] {}; +void() player_diec6 = [ $deathc6, player_diec7 ] {}; +void() player_diec7 = [ $deathc7, player_diec8 ] {}; +void() player_diec8 = [ $deathc8, player_diec9 ] {}; +void() player_diec9 = [ $deathc9, player_diec10 ] {}; +void() player_diec10 = [ $deathc10, player_diec11 ] {}; +void() player_diec11 = [ $deathc11, player_diec12 ] {}; +void() player_diec12 = [ $deathc12, player_diec13 ] {}; +void() player_diec13 = [ $deathc13, player_diec14 ] {}; +void() player_diec14 = [ $deathc14, player_diec15 ] {}; +void() player_diec15 = [ $deathc15, player_diec15 ] {PlayerDead();}; + +void() player_died1 = [ $deathd1, player_died2 ] {}; +void() player_died2 = [ $deathd2, player_died3 ] {}; +void() player_died3 = [ $deathd3, player_died4 ] {}; +void() player_died4 = [ $deathd4, player_died5 ] {}; +void() player_died5 = [ $deathd5, player_died6 ] {}; +void() player_died6 = [ $deathd6, player_died7 ] {}; +void() player_died7 = [ $deathd7, player_died8 ] {}; +void() player_died8 = [ $deathd8, player_died9 ] {}; +void() player_died9 = [ $deathd9, player_died9 ] {PlayerDead();}; + +void() player_diee1 = [ $deathe1, player_diee2 ] {}; +void() player_diee2 = [ $deathe2, player_diee3 ] {}; +void() player_diee3 = [ $deathe3, player_diee4 ] {}; +void() player_diee4 = [ $deathe4, player_diee5 ] {}; +void() player_diee5 = [ $deathe5, player_diee6 ] {}; +void() player_diee6 = [ $deathe6, player_diee7 ] {}; +void() player_diee7 = [ $deathe7, player_diee8 ] {}; +void() player_diee8 = [ $deathe8, player_diee9 ] {}; +void() player_diee9 = [ $deathe9, player_diee9 ] {PlayerDead();}; + +void() player_die_ax1 = [ $axdeth1, player_die_ax2 ] {}; +void() player_die_ax2 = [ $axdeth2, player_die_ax3 ] {}; +void() player_die_ax3 = [ $axdeth3, player_die_ax4 ] {}; +void() player_die_ax4 = [ $axdeth4, player_die_ax5 ] {}; +void() player_die_ax5 = [ $axdeth5, player_die_ax6 ] {}; +void() player_die_ax6 = [ $axdeth6, player_die_ax7 ] {}; +void() player_die_ax7 = [ $axdeth7, player_die_ax8 ] {}; +void() player_die_ax8 = [ $axdeth8, player_die_ax9 ] {}; +void() player_die_ax9 = [ $axdeth9, player_die_ax9 ] {PlayerDead();}; diff --git a/src/portal.qc b/src/portal.qc new file mode 100644 index 0000000..65a3154 --- /dev/null +++ b/src/portal.qc @@ -0,0 +1,742 @@ +/* Copyright (C) 1996-1997 Robert "BOby" Siska + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + See file, 'COPYING', for details. +*/ + +//// Constants +float PORTAL_ATTACK = 0.5; +float PORTAL_REFIRE = 0.2; +float PORTAL_BUFFER = 0.9; +float PORTAL_KICK = 120; +float PORTAL_RANGE = 60; + +float CUBE_LIFTED = 2; +float CUBE_DROPPED = 3; + +//// Functions +void() PortalImpulses; +void() PortalPrecache; +void(entity p) PortalErase; +void() Portal1Touch; +void() Portal2Touch; +void() PortalDeathTouch; +void(entity org) PortalTeleportEffect; +void() PortalFire; +void() GripFire; +void() PortalUpdate; +void() player_run; +void() PortalCubeThink; +void(entity own, entity hit, vector org) T_PortalSpawn; +vector(vector org) portal_face; +vector(entity p) portal_clip_player; +void() W_SetCurrentAmmo; + + +//// Global variables +// Entities +entity portal1_entity; +entity portal2_entity; +// Counters +float portal_global; +float portal1_exist; +float portal2_exist; +float portal_mode; //1 = deathmatch, 0 = cooperative +.entity lastport; +.float nextportcolour; +.entity cube; +.float nextthink1; +.float grip_dist; +// Models +string model_portal1; +string model_portal2; +string model_portalgun; +// Sounds +string sound_fire; +string sound_close; +string sound_use; + +//void() player_light1; + +//// Gun animation frames +$frame portal1 portal2 portal3 portal4 portal5 +void() player_portal1 = [$portal1, player_portal2] {self.weaponframe=1;}; +void() player_portal2 = [$portal2, player_portal3] {self.weaponframe=2;}; +void() player_portal3 = [$portal3, player_portal4] {self.weaponframe=3;PortalFire();}; +void() player_portal4 = [$portal4, player_portal5] {self.weaponframe=4;}; +void() player_portal5 = [$portal5, player_run] {self.weaponframe=5;}; + +$frame grip1 grip2 grip3 grip4 grip5 grip6 +void() player_grip1 = [$grip1, player_grip2] {self.weaponframe=1;}; +void() player_grip2 = [$grip2, player_grip3] {self.weaponframe=2;}; +void() player_grip3 = [$grip3, player_grip4] {self.weaponframe=3;GripFire();}; +void() player_grip4 = [$grip4, player_grip5] {self.weaponframe=4;}; +void() player_grip5 = [$grip5, player_grip6] {self.weaponframe=5;}; +void() player_grip6 = [$grip6, player_run] {self.weaponframe=6;}; + + ////////////// + //// Main Code +////////////// +void() null_die = {}; +void() PortalInit = { + // Initialize global variables + model_portal1 = "progs/portal1.bsp"; + model_portal2 = "progs/portal2.bsp"; + model_portalgun = "progs/v_portal.mdl"; + + sound_fire = "portal/fire.wav"; + sound_close = "portal/close.wav"; + sound_use = "portal/use.wav"; + + self.cube = spawn(); + self.cube.cnt = 0; + + portal_global = 0; + portal1_exist = 0; + portal2_exist = 0; + portal_mode = 1; //1 = deathmatch, 0 = cooperative +}; + +void() PortalPrecache = { + // Precache models + precache_model(model_portal1); + precache_model(model_portal2); + precache_model(model_portalgun); + + precache_sound(sound_fire); + precache_sound(sound_close); + precache_sound(sound_use); +}; + +vector(vector org) portal_face = { + // Returns facing for the portal + local vector v; + v = trace_plane_normal; + v_z = v_z * -1; + return vectoangles(v); +}; + +vector(entity p) portal_clip_player = { + // Returns coordinates where the teleported object appears + local vector org; + org = p.origin; + + makevectors(p.angles); + org = org + v_forward*48; + return org; +}; + +void() PortalImpulses = { + // Handles the impulses + local entity tmp; + local string str_tmp; + if (self.impulse == 98) {// Close portals + if (self.weapon == IT_PORTAL_GUN) { + if (portal_mode == 1) { + if (self.lastport) { + PortalErase(self.lastport); + PortalErase(self.lastport.enemy); + self.lastport = world; + } + } else { + PortalErase(portal1_entity); + PortalErase(portal2_entity); + } + } + } + if (self.impulse == 99) { // sheath portal gun + self.items = self.items | IT_PORTAL_GUN; + self.weapon = IT_PORTAL_GUN; + W_SetCurrentAmmo(); + } + if (self.impulse == 97) { // Toggle deathmatch/cooperative mode + if (portal_mode == 0) { + PortalErase(portal1_entity); + PortalErase(portal2_entity); + portal_mode = 1; // set to deathmatch mode + bprint("portal_gun: Deathmatch mode set.\n"); + } else { + if (self.lastport) { + PortalErase(self.lastport); + if (self.lastport.enemy) + PortalErase(self.lastport.enemy); + self.lastport = world; + } + portal_mode = 0; // set to cooperative mode + bprint("portal_gun: Cooperative mode set.\n"); + } + } + if (self.impulse == 96) { // Force blue portal + if (self.weapon == IT_PORTAL_GUN) { + if (portal_mode == 1) { + if (self.nextportcolour != 0) { + self.nextportcolour = 0; + tmp = self.lastport.enemy; + PortalErase(self.lastport); + self.lastport = tmp; + } + player_portal1(); + } else { + portal_global = 0; + player_portal1(); + } + } + } + if (self.impulse == 95) { // Force red portal + if (self.weapon == IT_PORTAL_GUN) { + if (portal_mode == 1) { + if (self.nextportcolour != 1) { + self.nextportcolour = 1; + tmp = self.lastport.enemy; + PortalErase(self.lastport); + self.lastport = tmp; + } + player_portal1(); + } else { + portal_global = 1; + player_portal1(); + } + } + } + if (self.impulse == 94) { + if (self.weapon == IT_PORTAL_GUN) + if (self.cube.cnt == 0) { + player_grip1(); + } else { + self.cube.cnt = 0; // self.cube is vacant + self.cube.enemy.nextthink = self.cube.nextthink; + self.cube.enemy.think = self.cube.think; + self.cube.enemy.touch = self.cube.touch; + self.cube.enemy.flags = (self.cube.enemy.flags | FL_ONGROUND) - FL_ONGROUND; + self.cube.enemy.effects = 0; + self.cube.enemy.owner = world; + makevectors(self.v_angle); + self.cube.enemy.velocity = v_forward*200 + v_up*50; + } + } +}; + +void() PortalFire = +{ + // Finds the destination for the portal + local vector src; + local vector dir; + + makevectors(self.v_angle); + src = self.origin + v_forward*10; + dir = self.origin + v_forward*100000;//far away in my nose direction + + sound(self,CHAN_WEAPON,sound_fire,1,ATTN_NORM); + + traceline(src,src+dir,FALSE,self); + if (trace_fraction != 1) + { + if (trace_ent.classname == "hardlight") + { + traceline(trace_endpos,dir,TRUE,trace_ent); + if (trace_fraction != 1) + T_PortalSpawn(self,trace_ent,trace_endpos); + } else + { + T_PortalSpawn(self,trace_ent,trace_endpos); + } + } + self.attack_finished = time + PORTAL_ATTACK; +}; + +void() GripFire = { + // Finds the entity + local entity e; + local vector where; + local float dist,found,i; + local string tmp; + + found = FALSE; + i = 25; + + sound(self,CHAN_WEAPON,sound_fire,1,ATTN_NORM); + makevectors(self.v_angle); + + while ((found == FALSE) && (i != 125)) { + where = self.origin + v_forward*i; + e = findradius(where,30+(i/2)); + while ((e != world) && (found == FALSE)) { + if (visible(e)) + if (infront(e)) + if ((e.movetype == MOVETYPE_TOSS) || (e.classname == "cube")) { + dist = vlen(e.origin - self.origin + self.view_ofs); + found = TRUE; + break; + } + if (found == FALSE) + e = e.chain; + } + i = i + 25; + } + // e is first found entity + if (found == FALSE) return; + if (e == world) return; + if (self.cube.cnt == 1) return; // already carrying item + if (e.owner.classname == "player") { // item is carried by someone + e.owner.cube.cnt = 0; + e.owner.cube.enemy.nextthink = e.owner.cube.nextthink; + e.owner.cube.enemy.think = e.owner.cube.think; + e.owner.cube.enemy.flags = (e.owner.cube.enemy.flags | FL_ONGROUND) - FL_ONGROUND; + e.owner.cube.enemy.effects = 0; +// bprint(e.owner.classname); + } + + WriteByte(MSG_BROADCAST, SVC_TEMPENTITY); + WriteByte(MSG_BROADCAST, TE_LIGHTNING2); + WriteEntity(MSG_BROADCAST, self); + WriteCoord(MSG_BROADCAST,self.origin_x); + WriteCoord(MSG_BROADCAST,self.origin_y); + WriteCoord(MSG_BROADCAST,self.origin_z+30); + WriteCoord(MSG_BROADCAST,e.origin_x); + WriteCoord(MSG_BROADCAST,e.origin_y); + WriteCoord(MSG_BROADCAST,e.origin_z+16); + + self.cube = spawn(); + self.cube.owner = e.owner; + self.cube.think = e.think; + self.cube.nextthink = e.nextthink; + self.cube.touch = e.touch; + self.cube.cnt = 1; + self.cube.enemy = e; + + e.owner = self; + e.cnt = CUBE_LIFTED; + e.think = PortalCubeThink; + e.nextthink = 0.02; + e.touch = SUB_Null; + e.grip_dist = dist; + e.effects = EF_BRIGHTFIELD; +}; + +void(entity own, entity hit, vector org) T_PortalSpawn = { + // Spawns portals + local entity p,e; + local vector dir; + + if ( (hit.classname == "portalproof") || (hit.classname == "door") || (hit.classname == "hardlight2") || (hit.classname == "pellet") ) + { + p = spawn(); + p.fixangle = 1; + p.angles = portal_face(org); + setorigin (p, org); + PortalErase(p); + return; + } + + if (portal_mode == 1) { // deathmatch mode + p = spawn(); + p.owner = own; + p.movetype = MOVETYPE_NONE; + p.solid = SOLID_TRIGGER; + p.classname = "portal"; + p.fixangle = 1; + p.angles = portal_face(org); + p.punchangle = trace_plane_normal; + p.touch = PortalDeathTouch; + p.frags = time - 1; + p.nextthink = time + 0.1; + p.think = PortalUpdate; + p.movetarget = hit; + p.oldorigin = hit.origin; +// p.effects = EF_DIMLIGHT; + + if (own.lastport) { + p.enemy = own.lastport; + PortalErase(p.enemy.enemy); + p.enemy.enemy = p; + } + own.lastport = p; + + if (own.nextportcolour) { + setmodel(p,model_portal2); + own.nextportcolour = 0; + } else { + setmodel(p,model_portal1); + own.nextportcolour = 1; + } +// setsize(p,p.mins,p.maxs); + setorigin(p,org); + + // Wake entities near the portal gates + e = findradius(p.origin, PORTAL_RANGE); + while (e != world) { + if (e.movetype == MOVETYPE_TOSS) + if (e != own) { + setorigin(e,e.origin + '0 0 10'); + e.flags = (e.flags | FL_ONGROUND) - FL_ONGROUND; + } + e = e.chain; + } + e = findradius(p.enemy.origin, PORTAL_RANGE); + while (e != world) { + if (e.movetype == MOVETYPE_TOSS) + if (e != own) { + setorigin(e,e.origin + '0 0 10'); + e.flags = (e.flags | FL_ONGROUND) - FL_ONGROUND; + } + e = e.chain; + } + return; + } + // cooperative mode + if (portal_global == 0) { // Blue portal + if (portal1_exist == 1) { // Delete if existing + PortalErase(portal1_entity); + portal1_exist = 0; + } + portal1_entity = spawn(); + portal1_entity.owner = own; + portal1_entity.movetype = MOVETYPE_NONE; + portal1_entity.solid = SOLID_TRIGGER; + portal1_entity.classname = "portal1"; + portal1_entity.fixangle = 1; + portal1_entity.angles = portal_face(org); + portal1_entity.punchangle = trace_plane_normal; + portal1_entity.touch = Portal1Touch; + portal1_entity.frags = time - 0.1; + portal1_entity.nextthink = time + 0.1; + portal1_entity.think = PortalUpdate; + portal1_entity.movetarget = hit; + portal1_entity.oldorigin = hit.origin; +// portal1_entity.effects = EF_DIMLIGHT; // glowing + + setmodel(portal1_entity, model_portal1); +// setsize(portal1_entity,VEC_HULL_MIN,VEC_HULL_MAX); + setorigin(portal1_entity,org); + + + portal1_entity.frame = 4; + + portal1_exist = 1; + portal_global = 1; + + // Wake the entities near the portal gates + e = findradius(portal1_entity.origin, PORTAL_RANGE); + while (e != world) { + if (e.movetype == MOVETYPE_TOSS) + if (e != own) { + setorigin(e,e.origin + '0 0 10'); + e.flags = (e.flags | FL_ONGROUND) - FL_ONGROUND; + } + e = e.chain; + + } + e = findradius(portal2_entity.origin, PORTAL_RANGE); + while (e != world) { + if (e.movetype == MOVETYPE_TOSS) + if (e != own) { + setorigin(e,e.origin + '0 0 10'); + e.flags = (e.flags | FL_ONGROUND) - FL_ONGROUND; + } + e = e.chain; + + } + } else if (portal_global == 1) { // Yellow portal + if (portal2_exist == 1) { + PortalErase(portal2_entity); + portal2_exist = 0; + } + portal2_entity = spawn(); + portal2_entity.owner = own; + portal2_entity.movetype = MOVETYPE_NONE; + portal2_entity.solid = SOLID_TRIGGER; + portal2_entity.classname = "portal2"; + portal2_entity.fixangle = 1; + portal2_entity.angles = portal_face(org); + portal2_entity.punchangle = trace_plane_normal; + portal2_entity.touch = Portal2Touch; + portal2_entity.frags = time - 0.1; + portal2_entity.nextthink = time + 0.1; + portal2_entity.think = PortalUpdate; + portal2_entity.movetarget = hit; + portal2_entity.oldorigin = hit.origin; +// portal2_entity.effects = EF_DIMLIGHT; + + setmodel(portal2_entity, model_portal2); +// setsize(portal2_entity,); + setorigin(portal2_entity,org); + + + portal2_entity.frame = 4; + + portal2_exist = 1; + portal_global = 0; + + e = findradius(portal1_entity.origin, PORTAL_RANGE); + while (e != world) { + if (e.movetype == MOVETYPE_TOSS) + if (e != own) { + setorigin(e,e.origin + '0 0 10'); + e.flags = (e.flags | FL_ONGROUND) - FL_ONGROUND; + } + e = e.chain; + } + e = findradius(portal2_entity.origin, PORTAL_RANGE); + while (e != world) { + if (e.movetype == MOVETYPE_TOSS) + if (e != own) { + setorigin(e,e.origin + '0 0 10'); + e.flags = (e.flags | FL_ONGROUND) - FL_ONGROUND; + } + e = e.chain; + } + + } +}; + +void(entity org) PortalTeleportEffect = { + // Spawns teleport fog + local entity s; + + makevectors(org.angles); + s = spawn(); + s.origin = org.origin + v_forward*50; + s.nextthink = time + 0.2; + s.think = SUB_Remove; + + sound(s, CHAN_WEAPON, sound_use, 1, ATTN_NORM); + + WriteByte(MSG_BROADCAST, SVC_TEMPENTITY); + WriteByte(MSG_BROADCAST, TE_TELEPORT); + WriteCoord(MSG_BROADCAST, s.origin_x); + WriteCoord(MSG_BROADCAST, s.origin_y); + WriteCoord(MSG_BROADCAST, s.origin_z); +}; + +void(entity org) PortalEraseEffect = { + // Spawns teleport fog + local entity s; + + makevectors(org.angles); + s = spawn(); + s.origin = org.origin + v_forward*50; + s.nextthink = time + 0.2; + s.think = SUB_Remove; + + sound(s, CHAN_WEAPON, sound_close, 1, ATTN_NORM); + +/* WriteByte(MSG_BROADCAST, SVC_TEMPENTITY); + WriteByte(MSG_BROADCAST, TE_TELEPORT); + WriteCoord(MSG_BROADCAST, s.origin_x); + WriteCoord(MSG_BROADCAST, s.origin_y); + WriteCoord(MSG_BROADCAST, s.origin_z);*/ +}; + + +void(entity p) PortalErase = { + // Erases given portal + local entity t; + local float play; + if (!p) return; + play=0; + if (portal_mode == 1) { //dm mode + t = self; + self = p; + PortalEraseEffect(p); + + remove(self); + self = t; + return; + } + //coop mode + if (p) { + if (p.classname=="portal1") { + if (portal1_exist == 1) play=1; + portal1_exist = 0; + } else if (p.classname=="portal2") { + if (portal2_exist == 1) play=1; + portal2_exist = 0; + } + if (play == 1) { + PortalEraseEffect(p); + } + remove(p); + } +}; + +void() PortalUpdate = { + // What do portal gates think (nothing) + self.nextthink = time + 0.1; +}; + +void() SUB_teleport = { + // Safe setorigin (for use in handler functions) + setorigin(self,self.origin); + self.nextthink = self.nextthink1; + self.think = self.think1; +}; + +void() Portal1Touch = { + // Handles touch with Blue portal + local float vel; + local vector org; + local vector oldvel; + local string temp2; + + if (portal2_exist==0) return; + if (self.frags>time) return; + + vel=vlen(other.velocity) + PORTAL_KICK; + oldvel = other.velocity; +//FIXME: see todo section 4 + + org=portal_clip_player(portal2_entity); + + // just setorigin can't be used in touch function + other.origin = org; + other.nextthink1 = other.nextthink; + other.nextthink = time + 0.1; + other.think1 = other.think; + other.think = SUB_teleport; + + PortalTeleportEffect(self); + PortalTeleportEffect(portal2_entity); + + self.frags = time + PORTAL_REFIRE; + portal2_entity.frags = time + PORTAL_REFIRE; + + other.fixangle = 1; + other.velocity = vel * normalize(portal2_entity.punchangle) * PORTAL_BUFFER; + if ((other.velocity_x == 0) && (other.velocity_y == 0)) { +// other.velocity_x = oldvel_x / 2; +// other.velocity_y = oldvel_y / 2; + other.fixangle = 0; + } + other.angles_x = 0; + other.angles_y = vectoyaw(other.velocity); + other.angles_z = 0; + other.v_angle_z = 0; + other.flags = other.flags - other.flags & FL_ONGROUND; +}; + +void() Portal2Touch = { + // Handles touch with Yellow portal + local float vel; + local vector org; + local vector oldvel; + + if (portal1_exist==0) return; + if (self.frags > time) return; + + vel=vlen(other.velocity) + PORTAL_KICK; + oldvel = other.velocity; +//FIXME:see todo section 4 + + org=portal_clip_player(portal1_entity); + + other.origin = org; + other.nextthink1 = other.nextthink; + other.nextthink = time + 0.1; + other.think1 = other.think; + other.think = SUB_teleport; + + PortalTeleportEffect(portal1_entity); + PortalTeleportEffect(self); + + portal1_entity.frags = time + PORTAL_REFIRE; + self.frags = time + PORTAL_REFIRE; + + other.fixangle = 1; + other.velocity = vel * normalize(portal1_entity.punchangle) * PORTAL_BUFFER; + if ((other.velocity_x == 0) && (other.velocity_y == 0)) { + other.fixangle = 0; + } + other.angles_x = 0; + other.angles_y = vectoyaw(other.velocity); + other.angles_z = 0; + other.v_angle_z = 0; + other.flags = other.flags - other.flags & FL_ONGROUND; +}; + +void() PortalDeathTouch = { + // Handles touches in deathmatch mode + local float vel; + local vector org; + local vector oldvel; + + if (!self.enemy) return; + if (self.frags > time) return; + + vel = vlen(other.velocity) + PORTAL_KICK; + oldvel = other.velocity; + + self.frags = time + PORTAL_REFIRE; + self.enemy.frags = time + PORTAL_REFIRE; + + org = portal_clip_player(self.enemy); + + other.origin = org; + other.nextthink1 = other.nextthink; + other.nextthink = time + 0.1; + other.think1 = other.think; + other.think = SUB_teleport; + + PortalTeleportEffect(self); + PortalTeleportEffect(self.enemy); + + other.fixangle = 1; + other.velocity = vel * self.enemy.punchangle * PORTAL_BUFFER; + if ((other.velocity_x == 0) && (other.velocity_y == 0)) + { + other.fixangle = 0; + } + other.angles_x = 0; + other.angles_y = vectoyaw(other.velocity); + other.angles_z = 0; + other.v_angle_z = 0; + other.flags = other.flags - other.flags & FL_ONGROUND; +}; + +void() PortalCubeThink = { + // What does carried item think + local vector v,src,org,tmporg; + local entity e; + local float dist,out_dist,oldz; + self.nextthink = time + 0.02; + + if (self.cnt == CUBE_DROPPED) return; + + e = self.owner; + + makevectors(e.v_angle); + src = e.origin + '0 0 16'; + traceline(src,src+v_forward*125, FALSE,e); + org = trace_endpos - v_forward*4; + dist = vlen(org-src+e.view_ofs); + + if (dist < self.grip_dist) + out_dist = dist - 10; + else + out_dist = self.grip_dist; + + e = self.owner; + makevectors(e.angles); + self.angles = e.angles; + self.angles_x = 0; + if (dist > 10) + tmporg = e.origin + v_forward*out_dist + v_right*20; + else { + tmporg = e.origin; + } + tmporg_z = e.origin_z; + setorigin(self,tmporg); + +}; diff --git a/src/progdefs.h b/src/progdefs.h new file mode 100644 index 0000000..c976cf8 --- /dev/null +++ b/src/progdefs.h @@ -0,0 +1,143 @@ + +/* file generated by qcc, do not modify */ + +typedef struct +{ int pad[28]; + int self; + int other; + int world; + float time; + float frametime; + float force_retouch; + string_t mapname; + float deathmatch; + float coop; + float teamplay; + float serverflags; + float total_secrets; + float total_monsters; + float found_secrets; + float killed_monsters; + float parm1; + float parm2; + float parm3; + float parm4; + float parm5; + float parm6; + float parm7; + float parm8; + float parm9; + float parm10; + float parm11; + float parm12; + float parm13; + float parm14; + float parm15; + float parm16; + vec3_t v_forward; + vec3_t v_up; + vec3_t v_right; + float trace_allsolid; + float trace_startsolid; + float trace_fraction; + vec3_t trace_endpos; + vec3_t trace_plane_normal; + float trace_plane_dist; + int trace_ent; + float trace_inopen; + float trace_inwater; + int msg_entity; + func_t main; + func_t StartFrame; + func_t PlayerPreThink; + func_t PlayerPostThink; + func_t ClientKill; + func_t ClientConnect; + func_t PutClientInServer; + func_t ClientDisconnect; + func_t SetNewParms; + func_t SetChangeParms; +} globalvars_t; + +typedef struct +{ + float modelindex; + vec3_t absmin; + vec3_t absmax; + float ltime; + float movetype; + float solid; + vec3_t origin; + vec3_t oldorigin; + vec3_t velocity; + vec3_t angles; + vec3_t avelocity; + vec3_t punchangle; + string_t classname; + string_t model; + float frame; + float skin; + float effects; + vec3_t mins; + vec3_t maxs; + vec3_t size; + func_t touch; + func_t use; + func_t think; + func_t blocked; + float nextthink; + int groundentity; + float health; + float frags; + float weapon; + string_t weaponmodel; + float weaponframe; + float currentammo; + float ammo_shells; + float ammo_nails; + float ammo_rockets; + float ammo_cells; + float items; + float takedamage; + int chain; + float deadflag; + vec3_t view_ofs; + float button0; + float button1; + float button2; + float impulse; + float fixangle; + vec3_t v_angle; + float idealpitch; + string_t netname; + int enemy; + float flags; + float colormap; + float team; + float max_health; + float teleport_time; + float armortype; + float armorvalue; + float waterlevel; + float watertype; + float ideal_yaw; + float yaw_speed; + int aiment; + int goalentity; + float spawnflags; + string_t target; + string_t targetname; + float dmg_take; + float dmg_save; + int dmg_inflictor; + int owner; + vec3_t movedir; + string_t message; + float sounds; + string_t noise; + string_t noise1; + string_t noise2; + string_t noise3; +} entvars_t; + +#define PROGHEADER_CRC 5927 diff --git a/src/progs.src b/src/progs.src new file mode 100644 index 0000000..d5d5910 --- /dev/null +++ b/src/progs.src @@ -0,0 +1,40 @@ +../progs.dat + +defs.qc +custdefs.qc +subs.qc +fight.qc +ai.qc +combat.qc +portal.qc +items.qc +weapons.qc +world.qc +client.qc +player.qc +monsters.qc +doors.qc +buttons.qc +triggers.qc +plats.qc +misc.qc + +asstech.qc +cube.qc + +ogre.qc +demon.qc +shambler.qc +knight.qc +soldier.qc +wizard.qc +dog.qc +zombie.qc +boss.qc + +tarbaby.qc // registered +hknight.qc // registered +fish.qc // registered +shalrath.qc // registered +enforcer.qc // registered +oldone.qc // registered diff --git a/src/shalrath.qc b/src/shalrath.qc new file mode 100644 index 0000000..adf821a --- /dev/null +++ b/src/shalrath.qc @@ -0,0 +1,239 @@ +/* +============================================================================== + +SHAL-RATH + +============================================================================== +*/ +$cd id1/models/shalrath +$origin 0 0 24 +$base base +$skin skin +$scale 0.7 + +$frame attack1 attack2 attack3 attack4 attack5 attack6 attack7 attack8 +$frame attack9 attack10 attack11 + +$frame pain1 pain2 pain3 pain4 pain5 + +$frame death1 death2 death3 death4 death5 death6 death7 + +$frame walk1 walk2 walk3 walk4 walk5 walk6 walk7 walk8 walk9 walk10 +$frame walk11 walk12 + +void() shalrath_pain; +void() ShalMissile; +void() shal_stand =[ $walk1, shal_stand ] {ai_stand();}; + +void() shal_walk1 =[ $walk2, shal_walk2 ] { +if (random() < 0.2) + sound (self, CHAN_VOICE, "shalrath/idle.wav", 1, ATTN_IDLE); +ai_walk(6);}; +void() shal_walk2 =[ $walk3, shal_walk3 ] {ai_walk(4);}; +void() shal_walk3 =[ $walk4, shal_walk4 ] {ai_walk(0);}; +void() shal_walk4 =[ $walk5, shal_walk5 ] {ai_walk(0);}; +void() shal_walk5 =[ $walk6, shal_walk6 ] {ai_walk(0);}; +void() shal_walk6 =[ $walk7, shal_walk7 ] {ai_walk(0);}; +void() shal_walk7 =[ $walk8, shal_walk8 ] {ai_walk(5);}; +void() shal_walk8 =[ $walk9, shal_walk9 ] {ai_walk(6);}; +void() shal_walk9 =[ $walk10, shal_walk10 ] {ai_walk(5);}; +void() shal_walk10 =[ $walk11, shal_walk11 ] {ai_walk(0);}; +void() shal_walk11 =[ $walk12, shal_walk12 ] {ai_walk(4);}; +void() shal_walk12 =[ $walk1, shal_walk1 ] {ai_walk(5);}; + +void() shal_run1 =[ $walk2, shal_run2 ] { +if (random() < 0.2) + sound (self, CHAN_VOICE, "shalrath/idle.wav", 1, ATTN_IDLE); +ai_run(6);}; +void() shal_run2 =[ $walk3, shal_run3 ] {ai_run(4);}; +void() shal_run3 =[ $walk4, shal_run4 ] {ai_run(0);}; +void() shal_run4 =[ $walk5, shal_run5 ] {ai_run(0);}; +void() shal_run5 =[ $walk6, shal_run6 ] {ai_run(0);}; +void() shal_run6 =[ $walk7, shal_run7 ] {ai_run(0);}; +void() shal_run7 =[ $walk8, shal_run8 ] {ai_run(5);}; +void() shal_run8 =[ $walk9, shal_run9 ] {ai_run(6);}; +void() shal_run9 =[ $walk10, shal_run10 ] {ai_run(5);}; +void() shal_run10 =[ $walk11, shal_run11 ] {ai_run(0);}; +void() shal_run11 =[ $walk12, shal_run12 ] {ai_run(4);}; +void() shal_run12 =[ $walk1, shal_run1 ] {ai_run(5);}; + +void() shal_attack1 =[ $attack1, shal_attack2 ] { +sound (self, CHAN_VOICE, "shalrath/attack.wav", 1, ATTN_NORM); +ai_face(); +}; +void() shal_attack2 =[ $attack2, shal_attack3 ] {ai_face();}; +void() shal_attack3 =[ $attack3, shal_attack4 ] {ai_face();}; +void() shal_attack4 =[ $attack4, shal_attack5 ] {ai_face();}; +void() shal_attack5 =[ $attack5, shal_attack6 ] {ai_face();}; +void() shal_attack6 =[ $attack6, shal_attack7 ] {ai_face();}; +void() shal_attack7 =[ $attack7, shal_attack8 ] {ai_face();}; +void() shal_attack8 =[ $attack8, shal_attack9 ] {ai_face();}; +void() shal_attack9 =[ $attack9, shal_attack10 ] {ShalMissile();}; +void() shal_attack10 =[ $attack10, shal_attack11 ] {ai_face();}; +void() shal_attack11 =[ $attack11, shal_run1 ] {}; + +void() shal_pain1 =[ $pain1, shal_pain2 ] {}; +void() shal_pain2 =[ $pain2, shal_pain3 ] {}; +void() shal_pain3 =[ $pain3, shal_pain4 ] {}; +void() shal_pain4 =[ $pain4, shal_pain5 ] {}; +void() shal_pain5 =[ $pain5, shal_run1 ] {}; + +void() shal_death1 =[ $death1, shal_death2 ] {}; +void() shal_death2 =[ $death2, shal_death3 ] {}; +void() shal_death3 =[ $death3, shal_death4 ] {}; +void() shal_death4 =[ $death4, shal_death5 ] {}; +void() shal_death5 =[ $death5, shal_death6 ] {}; +void() shal_death6 =[ $death6, shal_death7 ] {}; +void() shal_death7 =[ $death7, shal_death7 ] {}; + + +void() shalrath_pain = +{ + if (self.pain_finished > time) + return; + + sound (self, CHAN_VOICE, "shalrath/pain.wav", 1, ATTN_NORM); + shal_pain1(); + self.pain_finished = time + 3; +}; + +void() shalrath_die = +{ +// check for gib + if (self.health < -90) + { + sound (self, CHAN_VOICE, "player/udeath.wav", 1, ATTN_NORM); + ThrowHead ("progs/h_shal.mdl", self.health); + ThrowGib ("progs/gib1.mdl", self.health); + ThrowGib ("progs/gib2.mdl", self.health); + ThrowGib ("progs/gib3.mdl", self.health); + return; + } + + sound (self, CHAN_VOICE, "shalrath/death.wav", 1, ATTN_NORM); + shal_death1(); + self.solid = SOLID_NOT; + // insert death sounds here +}; + +/* +================ +ShalMissile +================ +*/ +void() ShalMissileTouch; +void() ShalHome; +void() ShalMissile = +{ + local entity missile; + local vector dir; + local float dist, flytime; + + dir = normalize((self.enemy.origin + '0 0 10') - self.origin); + dist = vlen (self.enemy.origin - self.origin); + flytime = dist * 0.002; + if (flytime < 0.1) + flytime = 0.1; + + self.effects = self.effects | EF_MUZZLEFLASH; + sound (self, CHAN_WEAPON, "shalrath/attack2.wav", 1, ATTN_NORM); + + missile = spawn (); + missile.owner = self; + + missile.solid = SOLID_BBOX; + missile.movetype = MOVETYPE_FLYMISSILE; + setmodel (missile, "progs/v_spike.mdl"); + + setsize (missile, '0 0 0', '0 0 0'); + + missile.origin = self.origin + '0 0 10'; + missile.velocity = dir * 400; + missile.avelocity = '300 300 300'; + missile.nextthink = flytime + time; + missile.think = ShalHome; + missile.enemy = self.enemy; + missile.touch = ShalMissileTouch; +}; + +void() ShalHome = +{ + local vector dir, vtemp; + vtemp = self.enemy.origin + '0 0 10'; + if (self.enemy.health < 1) + { + remove(self); + return; + } + dir = normalize(vtemp - self.origin); + if (skill == 3) + self.velocity = dir * 350; + else + self.velocity = dir * 250; + self.nextthink = time + 0.2; + self.think = ShalHome; +}; + +void() ShalMissileTouch = +{ + if (other == self.owner) + return; // don't explode on owner + + if (other.classname == "monster_zombie") + T_Damage (other, self, self, 110); + T_RadiusDamage (self, self.owner, 40, world); + sound (self, CHAN_WEAPON, "weapons/r_exp3.wav", 1, ATTN_NORM); + + WriteByte (MSG_BROADCAST, SVC_TEMPENTITY); + WriteByte (MSG_BROADCAST, TE_EXPLOSION); + WriteCoord (MSG_BROADCAST, self.origin_x); + WriteCoord (MSG_BROADCAST, self.origin_y); + WriteCoord (MSG_BROADCAST, self.origin_z); + + self.velocity = '0 0 0'; + self.touch = SUB_Null; + setmodel (self, "progs/s_explod.spr"); + self.solid = SOLID_NOT; + s_explode1 (); +}; + +//================================================================= + +/*QUAKED monster_shalrath (1 0 0) (-32 -32 -24) (32 32 48) Ambush +*/ +void() monster_shalrath = +{ + if (deathmatch) + { + remove(self); + return; + } + precache_model2 ("progs/shalrath.mdl"); + precache_model2 ("progs/h_shal.mdl"); + precache_model2 ("progs/v_spike.mdl"); + + precache_sound2 ("shalrath/attack.wav"); + precache_sound2 ("shalrath/attack2.wav"); + precache_sound2 ("shalrath/death.wav"); + precache_sound2 ("shalrath/idle.wav"); + precache_sound2 ("shalrath/pain.wav"); + precache_sound2 ("shalrath/sight.wav"); + + self.solid = SOLID_SLIDEBOX; + self.movetype = MOVETYPE_STEP; + + setmodel (self, "progs/shalrath.mdl"); + setsize (self, VEC_HULL2_MIN, VEC_HULL2_MAX); + self.health = 400; + + self.th_stand = shal_stand; + self.th_walk = shal_walk1; + self.th_run = shal_run1; + self.th_die = shalrath_die; + self.th_pain = shalrath_pain; + self.th_missile = shal_attack1; + + self.think = walkmonster_start; + self.nextthink = time + 0.1 + random ()*0.1; + +}; diff --git a/src/shambler.qc b/src/shambler.qc new file mode 100644 index 0000000..7789ddd --- /dev/null +++ b/src/shambler.qc @@ -0,0 +1,367 @@ +/* +============================================================================== + +SHAMBLER + +============================================================================== +*/ + +$cd id1/models/shams +$origin 0 0 24 +$base base +$skin base + +$frame stand1 stand2 stand3 stand4 stand5 stand6 stand7 stand8 stand9 +$frame stand10 stand11 stand12 stand13 stand14 stand15 stand16 stand17 + +$frame walk1 walk2 walk3 walk4 walk5 walk6 walk7 +$frame walk8 walk9 walk10 walk11 walk12 + +$frame run1 run2 run3 run4 run5 run6 + +$frame smash1 smash2 smash3 smash4 smash5 smash6 smash7 +$frame smash8 smash9 smash10 smash11 smash12 + +$frame swingr1 swingr2 swingr3 swingr4 swingr5 +$frame swingr6 swingr7 swingr8 swingr9 + +$frame swingl1 swingl2 swingl3 swingl4 swingl5 +$frame swingl6 swingl7 swingl8 swingl9 + +$frame magic1 magic2 magic3 magic4 magic5 +$frame magic6 magic7 magic8 magic9 magic10 magic11 magic12 + +$frame pain1 pain2 pain3 pain4 pain5 pain6 + +$frame death1 death2 death3 death4 death5 death6 +$frame death7 death8 death9 death10 death11 + +void() sham_stand1 =[ $stand1, sham_stand2 ] {ai_stand();}; +void() sham_stand2 =[ $stand2, sham_stand3 ] {ai_stand();}; +void() sham_stand3 =[ $stand3, sham_stand4 ] {ai_stand();}; +void() sham_stand4 =[ $stand4, sham_stand5 ] {ai_stand();}; +void() sham_stand5 =[ $stand5, sham_stand6 ] {ai_stand();}; +void() sham_stand6 =[ $stand6, sham_stand7 ] {ai_stand();}; +void() sham_stand7 =[ $stand7, sham_stand8 ] {ai_stand();}; +void() sham_stand8 =[ $stand8, sham_stand9 ] {ai_stand();}; +void() sham_stand9 =[ $stand9, sham_stand10] {ai_stand();}; +void() sham_stand10 =[ $stand10, sham_stand11] {ai_stand();}; +void() sham_stand11 =[ $stand11, sham_stand12] {ai_stand();}; +void() sham_stand12 =[ $stand12, sham_stand13] {ai_stand();}; +void() sham_stand13 =[ $stand13, sham_stand14] {ai_stand();}; +void() sham_stand14 =[ $stand14, sham_stand15] {ai_stand();}; +void() sham_stand15 =[ $stand15, sham_stand16] {ai_stand();}; +void() sham_stand16 =[ $stand16, sham_stand17] {ai_stand();}; +void() sham_stand17 =[ $stand17, sham_stand1 ] {ai_stand();}; + +void() sham_walk1 =[ $walk1, sham_walk2 ] {ai_walk(10);}; +void() sham_walk2 =[ $walk2, sham_walk3 ] {ai_walk(9);}; +void() sham_walk3 =[ $walk3, sham_walk4 ] {ai_walk(9);}; +void() sham_walk4 =[ $walk4, sham_walk5 ] {ai_walk(5);}; +void() sham_walk5 =[ $walk5, sham_walk6 ] {ai_walk(6);}; +void() sham_walk6 =[ $walk6, sham_walk7 ] {ai_walk(12);}; +void() sham_walk7 =[ $walk7, sham_walk8 ] {ai_walk(8);}; +void() sham_walk8 =[ $walk8, sham_walk9 ] {ai_walk(3);}; +void() sham_walk9 =[ $walk9, sham_walk10] {ai_walk(13);}; +void() sham_walk10 =[ $walk10, sham_walk11] {ai_walk(9);}; +void() sham_walk11 =[ $walk11, sham_walk12] {ai_walk(7);}; +void() sham_walk12 =[ $walk12, sham_walk1 ] {ai_walk(7); +if (random() > 0.8) + sound (self, CHAN_VOICE, "shambler/sidle.wav", 1, ATTN_IDLE);}; + +void() sham_run1 =[ $run1, sham_run2 ] {ai_run(20);}; +void() sham_run2 =[ $run2, sham_run3 ] {ai_run(24);}; +void() sham_run3 =[ $run3, sham_run4 ] {ai_run(20);}; +void() sham_run4 =[ $run4, sham_run5 ] {ai_run(20);}; +void() sham_run5 =[ $run5, sham_run6 ] {ai_run(24);}; +void() sham_run6 =[ $run6, sham_run1 ] {ai_run(20); +if (random() > 0.8) + sound (self, CHAN_VOICE, "shambler/sidle.wav", 1, ATTN_IDLE); +}; + +void() sham_smash1 =[ $smash1, sham_smash2 ] { +sound (self, CHAN_VOICE, "shambler/melee1.wav", 1, ATTN_NORM); +ai_charge(2);}; +void() sham_smash2 =[ $smash2, sham_smash3 ] {ai_charge(6);}; +void() sham_smash3 =[ $smash3, sham_smash4 ] {ai_charge(6);}; +void() sham_smash4 =[ $smash4, sham_smash5 ] {ai_charge(5);}; +void() sham_smash5 =[ $smash5, sham_smash6 ] {ai_charge(4);}; +void() sham_smash6 =[ $smash6, sham_smash7 ] {ai_charge(1);}; +void() sham_smash7 =[ $smash7, sham_smash8 ] {ai_charge(0);}; +void() sham_smash8 =[ $smash8, sham_smash9 ] {ai_charge(0);}; +void() sham_smash9 =[ $smash9, sham_smash10 ] {ai_charge(0);}; +void() sham_smash10 =[ $smash10, sham_smash11 ] { +local vector delta; +local float ldmg; + + if (!self.enemy) + return; + ai_charge(0); + + delta = self.enemy.origin - self.origin; + + if (vlen(delta) > 100) + return; + if (!CanDamage (self.enemy, self)) + return; + + ldmg = (random() + random() + random()) * 40; + T_Damage (self.enemy, self, self, ldmg); + sound (self, CHAN_VOICE, "shambler/smack.wav", 1, ATTN_NORM); + + SpawnMeatSpray (self.origin + v_forward*16, crandom() * 100 * v_right); + SpawnMeatSpray (self.origin + v_forward*16, crandom() * 100 * v_right); +}; +void() sham_smash11 =[ $smash11, sham_smash12 ] {ai_charge(5);}; +void() sham_smash12 =[ $smash12, sham_run1 ] {ai_charge(4);}; + +void() sham_swingr1; + +void(float side) ShamClaw = +{ +local vector delta; +local float ldmg; + + if (!self.enemy) + return; + ai_charge(10); + + delta = self.enemy.origin - self.origin; + + if (vlen(delta) > 100) + return; + + ldmg = (random() + random() + random()) * 20; + T_Damage (self.enemy, self, self, ldmg); + sound (self, CHAN_VOICE, "shambler/smack.wav", 1, ATTN_NORM); + + if (side) + { + makevectors (self.angles); + SpawnMeatSpray (self.origin + v_forward*16, side * v_right); + } +}; + +void() sham_swingl1 =[ $swingl1, sham_swingl2 ] { +sound (self, CHAN_VOICE, "shambler/melee2.wav", 1, ATTN_NORM); +ai_charge(5);}; +void() sham_swingl2 =[ $swingl2, sham_swingl3 ] {ai_charge(3);}; +void() sham_swingl3 =[ $swingl3, sham_swingl4 ] {ai_charge(7);}; +void() sham_swingl4 =[ $swingl4, sham_swingl5 ] {ai_charge(3);}; +void() sham_swingl5 =[ $swingl5, sham_swingl6 ] {ai_charge(7);}; +void() sham_swingl6 =[ $swingl6, sham_swingl7 ] {ai_charge(9);}; +void() sham_swingl7 =[ $swingl7, sham_swingl8 ] {ai_charge(5); ShamClaw(250);}; +void() sham_swingl8 =[ $swingl8, sham_swingl9 ] {ai_charge(4);}; +void() sham_swingl9 =[ $swingl9, sham_run1 ] { +ai_charge(8); +if (random()<0.5) + self.think = sham_swingr1; +}; + +void() sham_swingr1 =[ $swingr1, sham_swingr2 ] { +sound (self, CHAN_VOICE, "shambler/melee1.wav", 1, ATTN_NORM); +ai_charge(1);}; +void() sham_swingr2 =[ $swingr2, sham_swingr3 ] {ai_charge(8);}; +void() sham_swingr3 =[ $swingr3, sham_swingr4 ] {ai_charge(14);}; +void() sham_swingr4 =[ $swingr4, sham_swingr5 ] {ai_charge(7);}; +void() sham_swingr5 =[ $swingr5, sham_swingr6 ] {ai_charge(3);}; +void() sham_swingr6 =[ $swingr6, sham_swingr7 ] {ai_charge(6);}; +void() sham_swingr7 =[ $swingr7, sham_swingr8 ] {ai_charge(6); ShamClaw(-250);}; +void() sham_swingr8 =[ $swingr8, sham_swingr9 ] {ai_charge(3);}; +void() sham_swingr9 =[ $swingr9, sham_run1 ] {ai_charge(1); +ai_charge(10); +if (random()<0.5) + self.think = sham_swingl1; +}; + +void() sham_melee = +{ + local float chance; + + chance = random(); + if (chance > 0.6 || self.health == 600) + sham_smash1 (); + else if (chance > 0.3) + sham_swingr1 (); + else + sham_swingl1 (); +}; + + +//============================================================================ + +void() CastLightning = +{ + local vector org, dir; + + self.effects = self.effects | EF_MUZZLEFLASH; + + ai_face (); + + org = self.origin + '0 0 40'; + + dir = self.enemy.origin + '0 0 16' - org; + dir = normalize (dir); + + traceline (org, self.origin + dir*600, TRUE, self); + + WriteByte (MSG_BROADCAST, SVC_TEMPENTITY); + WriteByte (MSG_BROADCAST, TE_LIGHTNING1); + WriteEntity (MSG_BROADCAST, self); + WriteCoord (MSG_BROADCAST, org_x); + WriteCoord (MSG_BROADCAST, org_y); + WriteCoord (MSG_BROADCAST, org_z); + WriteCoord (MSG_BROADCAST, trace_endpos_x); + WriteCoord (MSG_BROADCAST, trace_endpos_y); + WriteCoord (MSG_BROADCAST, trace_endpos_z); + + LightningDamage (org, trace_endpos, self, 10); +}; + +void() sham_magic1 =[ $magic1, sham_magic2 ] {ai_face(); + sound (self, CHAN_WEAPON, "shambler/sattck1.wav", 1, ATTN_NORM); +}; +void() sham_magic2 =[ $magic2, sham_magic3 ] {ai_face();}; +void() sham_magic3 =[ $magic3, sham_magic4 ] {ai_face();self.nextthink = self.nextthink + 0.2; +local entity o; + +self.effects = self.effects | EF_MUZZLEFLASH; +ai_face(); +self.owner = spawn(); +o = self.owner; +setmodel (o, "progs/s_light.mdl"); +setorigin (o, self.origin); +o.angles = self.angles; +o.nextthink = time + 0.7; +o.think = SUB_Remove; +}; +void() sham_magic4 =[ $magic4, sham_magic5 ] +{ +self.effects = self.effects | EF_MUZZLEFLASH; +self.owner.frame = 1; +}; +void() sham_magic5 =[ $magic5, sham_magic6 ] +{ +self.effects = self.effects | EF_MUZZLEFLASH; +self.owner.frame = 2; +}; +void() sham_magic6 =[ $magic6, sham_magic9 ] +{ +remove (self.owner); +CastLightning(); +sound (self, CHAN_WEAPON, "shambler/sboom.wav", 1, ATTN_NORM); +}; +void() sham_magic9 =[ $magic9, sham_magic10 ] +{CastLightning();}; +void() sham_magic10 =[ $magic10, sham_magic11 ] +{CastLightning();}; +void() sham_magic11 =[ $magic11, sham_magic12 ] +{ +if (skill == 3) + CastLightning(); +}; +void() sham_magic12 =[ $magic12, sham_run1 ] {}; + + + +void() sham_pain1 =[ $pain1, sham_pain2 ] {}; +void() sham_pain2 =[ $pain2, sham_pain3 ] {}; +void() sham_pain3 =[ $pain3, sham_pain4 ] {}; +void() sham_pain4 =[ $pain4, sham_pain5 ] {}; +void() sham_pain5 =[ $pain5, sham_pain6 ] {}; +void() sham_pain6 =[ $pain6, sham_run1 ] {}; + +void(entity attacker, float damage) sham_pain = +{ + sound (self, CHAN_VOICE, "shambler/shurt2.wav", 1, ATTN_NORM); + + if (self.health <= 0) + return; // allready dying, don't go into pain frame + + if (random()*400 > damage) + return; // didn't flinch + + if (self.pain_finished > time) + return; + self.pain_finished = time + 2; + + sham_pain1 (); +}; + + +//============================================================================ + +void() sham_death1 =[ $death1, sham_death2 ] {}; +void() sham_death2 =[ $death2, sham_death3 ] {}; +void() sham_death3 =[ $death3, sham_death4 ] {self.solid = SOLID_NOT;}; +void() sham_death4 =[ $death4, sham_death5 ] {}; +void() sham_death5 =[ $death5, sham_death6 ] {}; +void() sham_death6 =[ $death6, sham_death7 ] {}; +void() sham_death7 =[ $death7, sham_death8 ] {}; +void() sham_death8 =[ $death8, sham_death9 ] {}; +void() sham_death9 =[ $death9, sham_death10 ] {}; +void() sham_death10 =[ $death10, sham_death11 ] {}; +void() sham_death11 =[ $death11, sham_death11 ] {}; + +void() sham_die = +{ +// check for gib + if (self.health < -60) + { + sound (self, CHAN_VOICE, "player/udeath.wav", 1, ATTN_NORM); + ThrowHead ("progs/h_shams.mdl", self.health); + ThrowGib ("progs/gib1.mdl", self.health); + ThrowGib ("progs/gib2.mdl", self.health); + ThrowGib ("progs/gib3.mdl", self.health); + return; + } + +// regular death + sound (self, CHAN_VOICE, "shambler/sdeath.wav", 1, ATTN_NORM); + sham_death1 (); +}; + +//============================================================================ + + +/*QUAKED monster_shambler (1 0 0) (-32 -32 -24) (32 32 64) Ambush +*/ +void() monster_shambler = +{ + if (deathmatch) + { + remove(self); + return; + } + precache_model ("progs/shambler.mdl"); + precache_model ("progs/s_light.mdl"); + precache_model ("progs/h_shams.mdl"); + precache_model ("progs/bolt.mdl"); + + precache_sound ("shambler/sattck1.wav"); + precache_sound ("shambler/sboom.wav"); + precache_sound ("shambler/sdeath.wav"); + precache_sound ("shambler/shurt2.wav"); + precache_sound ("shambler/sidle.wav"); + precache_sound ("shambler/ssight.wav"); + precache_sound ("shambler/melee1.wav"); + precache_sound ("shambler/melee2.wav"); + precache_sound ("shambler/smack.wav"); + + self.solid = SOLID_SLIDEBOX; + self.movetype = MOVETYPE_STEP; + setmodel (self, "progs/shambler.mdl"); + + setsize (self, VEC_HULL2_MIN, VEC_HULL2_MAX); + self.health = 600; + + self.th_stand = sham_stand1; + self.th_walk = sham_walk1; + self.th_run = sham_run1; + self.th_die = sham_die; + self.th_melee = sham_melee; + self.th_missile = sham_magic1; + self.th_pain = sham_pain; + + walkmonster_start(); +}; diff --git a/src/soldier.qc b/src/soldier.qc new file mode 100644 index 0000000..e78b8d3 --- /dev/null +++ b/src/soldier.qc @@ -0,0 +1,284 @@ +/* +============================================================================== + +SOLDIER / PLAYER + +============================================================================== +*/ + +$cd id1/models/soldier3 +$origin 0 -6 24 +$base base +$skin skin + +$frame stand1 stand2 stand3 stand4 stand5 stand6 stand7 stand8 + +$frame death1 death2 death3 death4 death5 death6 death7 death8 +$frame death9 death10 + +$frame deathc1 deathc2 deathc3 deathc4 deathc5 deathc6 deathc7 deathc8 +$frame deathc9 deathc10 deathc11 + +$frame load1 load2 load3 load4 load5 load6 load7 load8 load9 load10 load11 + +$frame pain1 pain2 pain3 pain4 pain5 pain6 + +$frame painb1 painb2 painb3 painb4 painb5 painb6 painb7 painb8 painb9 painb10 +$frame painb11 painb12 painb13 painb14 + +$frame painc1 painc2 painc3 painc4 painc5 painc6 painc7 painc8 painc9 painc10 +$frame painc11 painc12 painc13 + +$frame run1 run2 run3 run4 run5 run6 run7 run8 + +$frame shoot1 shoot2 shoot3 shoot4 shoot5 shoot6 shoot7 shoot8 shoot9 + +$frame prowl_1 prowl_2 prowl_3 prowl_4 prowl_5 prowl_6 prowl_7 prowl_8 +$frame prowl_9 prowl_10 prowl_11 prowl_12 prowl_13 prowl_14 prowl_15 prowl_16 +$frame prowl_17 prowl_18 prowl_19 prowl_20 prowl_21 prowl_22 prowl_23 prowl_24 + +/* +============================================================================== +SOLDIER CODE +============================================================================== +*/ + +void() army_fire; + +void() army_stand1 =[ $stand1, army_stand2 ] {ai_stand();}; +void() army_stand2 =[ $stand2, army_stand3 ] {ai_stand();}; +void() army_stand3 =[ $stand3, army_stand4 ] {ai_stand();}; +void() army_stand4 =[ $stand4, army_stand5 ] {ai_stand();}; +void() army_stand5 =[ $stand5, army_stand6 ] {ai_stand();}; +void() army_stand6 =[ $stand6, army_stand7 ] {ai_stand();}; +void() army_stand7 =[ $stand7, army_stand8 ] {ai_stand();}; +void() army_stand8 =[ $stand8, army_stand1 ] {ai_stand();}; + +void() army_walk1 =[ $prowl_1, army_walk2 ] { +if (random() < 0.2) + sound (self, CHAN_VOICE, "soldier/idle.wav", 1, ATTN_IDLE); +ai_walk(1);}; +void() army_walk2 =[ $prowl_2, army_walk3 ] {ai_walk(1);}; +void() army_walk3 =[ $prowl_3, army_walk4 ] {ai_walk(1);}; +void() army_walk4 =[ $prowl_4, army_walk5 ] {ai_walk(1);}; +void() army_walk5 =[ $prowl_5, army_walk6 ] {ai_walk(2);}; +void() army_walk6 =[ $prowl_6, army_walk7 ] {ai_walk(3);}; +void() army_walk7 =[ $prowl_7, army_walk8 ] {ai_walk(4);}; +void() army_walk8 =[ $prowl_8, army_walk9 ] {ai_walk(4);}; +void() army_walk9 =[ $prowl_9, army_walk10 ] {ai_walk(2);}; +void() army_walk10 =[ $prowl_10, army_walk11 ] {ai_walk(2);}; +void() army_walk11 =[ $prowl_11, army_walk12 ] {ai_walk(2);}; +void() army_walk12 =[ $prowl_12, army_walk13 ] {ai_walk(1);}; +void() army_walk13 =[ $prowl_13, army_walk14 ] {ai_walk(0);}; +void() army_walk14 =[ $prowl_14, army_walk15 ] {ai_walk(1);}; +void() army_walk15 =[ $prowl_15, army_walk16 ] {ai_walk(1);}; +void() army_walk16 =[ $prowl_16, army_walk17 ] {ai_walk(1);}; +void() army_walk17 =[ $prowl_17, army_walk18 ] {ai_walk(3);}; +void() army_walk18 =[ $prowl_18, army_walk19 ] {ai_walk(3);}; +void() army_walk19 =[ $prowl_19, army_walk20 ] {ai_walk(3);}; +void() army_walk20 =[ $prowl_20, army_walk21 ] {ai_walk(3);}; +void() army_walk21 =[ $prowl_21, army_walk22 ] {ai_walk(2);}; +void() army_walk22 =[ $prowl_22, army_walk23 ] {ai_walk(1);}; +void() army_walk23 =[ $prowl_23, army_walk24 ] {ai_walk(1);}; +void() army_walk24 =[ $prowl_24, army_walk1 ] {ai_walk(1);}; + +void() army_run1 =[ $run1, army_run2 ] { +if (random() < 0.2) + sound (self, CHAN_VOICE, "soldier/idle.wav", 1, ATTN_IDLE); +ai_run(11);}; +void() army_run2 =[ $run2, army_run3 ] {ai_run(15);}; +void() army_run3 =[ $run3, army_run4 ] {ai_run(10);}; +void() army_run4 =[ $run4, army_run5 ] {ai_run(10);}; +void() army_run5 =[ $run5, army_run6 ] {ai_run(8);}; +void() army_run6 =[ $run6, army_run7 ] {ai_run(15);}; +void() army_run7 =[ $run7, army_run8 ] {ai_run(10);}; +void() army_run8 =[ $run8, army_run1 ] {ai_run(8);}; + +void() army_atk1 =[ $shoot1, army_atk2 ] {ai_face();}; +void() army_atk2 =[ $shoot2, army_atk3 ] {ai_face();}; +void() army_atk3 =[ $shoot3, army_atk4 ] {ai_face();}; +void() army_atk4 =[ $shoot4, army_atk5 ] {ai_face();}; +void() army_atk5 =[ $shoot5, army_atk6 ] {ai_face();army_fire(); +self.effects = self.effects | EF_MUZZLEFLASH;}; +void() army_atk6 =[ $shoot6, army_atk7 ] {ai_face();}; +void() army_atk7 =[ $shoot7, army_atk8 ] {ai_face();SUB_CheckRefire (army_atk1);}; +void() army_atk8 =[ $shoot8, army_atk9 ] {ai_face();}; +void() army_atk9 =[ $shoot9, army_run1 ] {ai_face();}; + + +void() army_pain1 =[ $pain1, army_pain2 ] {}; +void() army_pain2 =[ $pain2, army_pain3 ] {}; +void() army_pain3 =[ $pain3, army_pain4 ] {}; +void() army_pain4 =[ $pain4, army_pain5 ] {}; +void() army_pain5 =[ $pain5, army_pain6 ] {}; +void() army_pain6 =[ $pain6, army_run1 ] {ai_pain(1);}; + +void() army_painb1 =[ $painb1, army_painb2 ] {}; +void() army_painb2 =[ $painb2, army_painb3 ] {ai_painforward(13);}; +void() army_painb3 =[ $painb3, army_painb4 ] {ai_painforward(9);}; +void() army_painb4 =[ $painb4, army_painb5 ] {}; +void() army_painb5 =[ $painb5, army_painb6 ] {}; +void() army_painb6 =[ $painb6, army_painb7 ] {}; +void() army_painb7 =[ $painb7, army_painb8 ] {}; +void() army_painb8 =[ $painb8, army_painb9 ] {}; +void() army_painb9 =[ $painb9, army_painb10] {}; +void() army_painb10=[ $painb10, army_painb11] {}; +void() army_painb11=[ $painb11, army_painb12] {}; +void() army_painb12=[ $painb12, army_painb13] {ai_pain(2);}; +void() army_painb13=[ $painb13, army_painb14] {}; +void() army_painb14=[ $painb14, army_run1 ] {}; + +void() army_painc1 =[ $painc1, army_painc2 ] {}; +void() army_painc2 =[ $painc2, army_painc3 ] {ai_pain(1);}; +void() army_painc3 =[ $painc3, army_painc4 ] {}; +void() army_painc4 =[ $painc4, army_painc5 ] {}; +void() army_painc5 =[ $painc5, army_painc6 ] {ai_painforward(1);}; +void() army_painc6 =[ $painc6, army_painc7 ] {ai_painforward(1);}; +void() army_painc7 =[ $painc7, army_painc8 ] {}; +void() army_painc8 =[ $painc8, army_painc9 ] {ai_pain(1);}; +void() army_painc9 =[ $painc9, army_painc10] {ai_painforward(4);}; +void() army_painc10=[ $painc10, army_painc11] {ai_painforward(3);}; +void() army_painc11=[ $painc11, army_painc12] {ai_painforward(6);}; +void() army_painc12=[ $painc12, army_painc13] {ai_painforward(8);}; +void() army_painc13=[ $painc13, army_run1] {}; + +void(entity attacker, float damage) army_pain = +{ + local float r; + + if (self.pain_finished > time) + return; + + r = random(); + + if (r < 0.2) + { + self.pain_finished = time + 0.6; + army_pain1 (); + sound (self, CHAN_VOICE, "soldier/pain1.wav", 1, ATTN_NORM); + } + else if (r < 0.6) + { + self.pain_finished = time + 1.1; + army_painb1 (); + sound (self, CHAN_VOICE, "soldier/pain2.wav", 1, ATTN_NORM); + } + else + { + self.pain_finished = time + 1.1; + army_painc1 (); + sound (self, CHAN_VOICE, "soldier/pain2.wav", 1, ATTN_NORM); + } +}; + + +void() army_fire = +{ + local vector dir; + local entity en; + + ai_face(); + + sound (self, CHAN_WEAPON, "soldier/sattck1.wav", 1, ATTN_NORM); + +// fire somewhat behind the player, so a dodging player is harder to hit + en = self.enemy; + + dir = en.origin - en.velocity*0.2; + dir = normalize (dir - self.origin); + + FireBullets (4, dir, '0.1 0.1 0'); +}; + + + +void() army_die1 =[ $death1, army_die2 ] {}; +void() army_die2 =[ $death2, army_die3 ] {}; +void() army_die3 =[ $death3, army_die4 ] +{self.solid = SOLID_NOT;self.ammo_shells = 5;DropBackpack();}; +void() army_die4 =[ $death4, army_die5 ] {}; +void() army_die5 =[ $death5, army_die6 ] {}; +void() army_die6 =[ $death6, army_die7 ] {}; +void() army_die7 =[ $death7, army_die8 ] {}; +void() army_die8 =[ $death8, army_die9 ] {}; +void() army_die9 =[ $death9, army_die10 ] {}; +void() army_die10 =[ $death10, army_die10 ] {}; + +void() army_cdie1 =[ $deathc1, army_cdie2 ] {}; +void() army_cdie2 =[ $deathc2, army_cdie3 ] {ai_back(5);}; +void() army_cdie3 =[ $deathc3, army_cdie4 ] +{self.solid = SOLID_NOT;self.ammo_shells = 5;DropBackpack();ai_back(4);}; +void() army_cdie4 =[ $deathc4, army_cdie5 ] {ai_back(13);}; +void() army_cdie5 =[ $deathc5, army_cdie6 ] {ai_back(3);}; +void() army_cdie6 =[ $deathc6, army_cdie7 ] {ai_back(4);}; +void() army_cdie7 =[ $deathc7, army_cdie8 ] {}; +void() army_cdie8 =[ $deathc8, army_cdie9 ] {}; +void() army_cdie9 =[ $deathc9, army_cdie10 ] {}; +void() army_cdie10 =[ $deathc10, army_cdie11 ] {}; +void() army_cdie11 =[ $deathc11, army_cdie11 ] {}; + + +void() army_die = +{ +// check for gib + if (self.health < -35) + { + sound (self, CHAN_VOICE, "player/udeath.wav", 1, ATTN_NORM); + ThrowHead ("progs/h_guard.mdl", self.health); + ThrowGib ("progs/gib1.mdl", self.health); + ThrowGib ("progs/gib2.mdl", self.health); + ThrowGib ("progs/gib3.mdl", self.health); + return; + } + +// regular death + sound (self, CHAN_VOICE, "soldier/death1.wav", 1, ATTN_NORM); + if (random() < 0.5) + army_die1 (); + else + army_cdie1 (); +}; + + +/*QUAKED monster_army (1 0 0) (-16 -16 -24) (16 16 40) Ambush +*/ +void() monster_army = +{ + if (deathmatch) + { + remove(self); + return; + } + precache_model ("progs/soldier.mdl"); + precache_model ("progs/h_guard.mdl"); + precache_model ("progs/gib1.mdl"); + precache_model ("progs/gib2.mdl"); + precache_model ("progs/gib3.mdl"); + + precache_sound ("soldier/death1.wav"); + precache_sound ("soldier/idle.wav"); + precache_sound ("soldier/pain1.wav"); + precache_sound ("soldier/pain2.wav"); + precache_sound ("soldier/sattck1.wav"); + precache_sound ("soldier/sight1.wav"); + + precache_sound ("player/udeath.wav"); // gib death + + + self.solid = SOLID_SLIDEBOX; + self.movetype = MOVETYPE_STEP; + + setmodel (self, "progs/soldier.mdl"); + + setsize (self, '-16 -16 -24', '16 16 40'); + self.health = 30; + + self.th_stand = army_stand1; + self.th_walk = army_walk1; + self.th_run = army_run1; + self.th_missile = army_atk1; + self.th_pain = army_pain; + self.th_die = army_die; + + walkmonster_start (); +}; diff --git a/src/subs.qc b/src/subs.qc new file mode 100644 index 0000000..0615498 --- /dev/null +++ b/src/subs.qc @@ -0,0 +1,317 @@ + + +void() SUB_Null = {}; + +void() SUB_Remove = {remove(self);}; +void(entity p, vector o) SUB_Setorigin = {setorigin(p,o);}; + + +/* +QuakeEd only writes a single float for angles (bad idea), so up and down are +just constant angles. +*/ +void() SetMovedir = +{ + if (self.angles == '0 -1 0') + self.movedir = '0 0 1'; + else if (self.angles == '0 -2 0') + self.movedir = '0 0 -1'; + else + { + makevectors (self.angles); + self.movedir = v_forward; + } + + self.angles = '0 0 0'; +}; + +/* +================ +InitTrigger +================ +*/ +void() InitTrigger = +{ +// trigger angles are used for one-way touches. An angle of 0 is assumed +// to mean no restrictions, so use a yaw of 360 instead. + if (self.angles != '0 0 0') + SetMovedir (); + self.solid = SOLID_TRIGGER; + setmodel (self, self.model); // set size and link into world + self.movetype = MOVETYPE_NONE; + self.modelindex = 0; + self.model = ""; +}; + +/* +============= +SUB_CalcMove + +calculate self.velocity and self.nextthink to reach dest from +self.origin traveling at speed +=============== +*/ +void(entity ent, vector tdest, float tspeed, void() func) SUB_CalcMoveEnt = +{ +local entity stemp; + stemp = self; + self = ent; + + SUB_CalcMove (tdest, tspeed, func); + self = stemp; +}; + +void(vector tdest, float tspeed, void() func) SUB_CalcMove = +{ +local vector vdestdelta; +local float len, traveltime; + + if (!tspeed) + objerror("No speed is defined!"); + + self.think1 = func; + self.finaldest = tdest; + self.think = SUB_CalcMoveDone; + + if (tdest == self.origin) + { + self.velocity = '0 0 0'; + self.nextthink = self.ltime + 0.1; + return; + } + +// set destdelta to the vector needed to move + vdestdelta = tdest - self.origin; + +// calculate length of vector + len = vlen (vdestdelta); + +// divide by speed to get time to reach dest + traveltime = len / tspeed; + + if (traveltime < 0.1) + { + self.velocity = '0 0 0'; + self.nextthink = self.ltime + 0.1; + return; + } + +// set nextthink to trigger a think when dest is reached + self.nextthink = self.ltime + traveltime; + +// scale the destdelta vector by the time spent traveling to get velocity + self.velocity = vdestdelta * (1/traveltime); // qcc won't take vec/float +}; + +/* +============ +After moving, set origin to exact final destination +============ +*/ +void() SUB_CalcMoveDone = +{ + setorigin(self, self.finaldest); + self.velocity = '0 0 0'; + self.nextthink = -1; + if (self.think1) + self.think1(); +}; + + +/* +============= +SUB_CalcAngleMove + +calculate self.avelocity and self.nextthink to reach destangle from +self.angles rotating + +The calling function should make sure self.think is valid +=============== +*/ +void(entity ent, vector destangle, float tspeed, void() func) SUB_CalcAngleMoveEnt = +{ +local entity stemp; + stemp = self; + self = ent; + SUB_CalcAngleMove (destangle, tspeed, func); + self = stemp; +}; + +void(vector destangle, float tspeed, void() func) SUB_CalcAngleMove = +{ +local vector destdelta; +local float len, traveltime; + + if (!tspeed) + objerror("No speed is defined!"); + +// set destdelta to the vector needed to move + destdelta = destangle - self.angles; + +// calculate length of vector + len = vlen (destdelta); + +// divide by speed to get time to reach dest + traveltime = len / tspeed; + +// set nextthink to trigger a think when dest is reached + self.nextthink = self.ltime + traveltime; + +// scale the destdelta vector by the time spent traveling to get velocity + self.avelocity = destdelta * (1 / traveltime); + + self.think1 = func; + self.finalangle = destangle; + self.think = SUB_CalcAngleMoveDone; +}; + +/* +============ +After rotating, set angle to exact final angle +============ +*/ +void() SUB_CalcAngleMoveDone = +{ + self.angles = self.finalangle; + self.avelocity = '0 0 0'; + self.nextthink = -1; + if (self.think1) + self.think1(); +}; + + +//============================================================================= + +void() DelayThink = +{ + activator = self.enemy; + SUB_UseTargets (); + remove(self); +}; + +/* +============================== +SUB_UseTargets + +the global "activator" should be set to the entity that initiated the firing. + +If self.delay is set, a DelayedUse entity will be created that will actually +do the SUB_UseTargets after that many seconds have passed. + +Centerprints any self.message to the activator. + +Removes all entities with a targetname that match self.killtarget, +and removes them, so some events can remove other triggers. + +Search for (string)targetname in all entities that +match (string)self.target and call their .use function + +============================== +*/ +void() SUB_UseTargets = +{ + local entity t, stemp, otemp, act; + +// +// check for a delay +// + if (self.delay) + { + // create a temp object to fire at a later time + t = spawn(); + t.classname = "DelayedUse"; + t.nextthink = time + self.delay; + t.think = DelayThink; + t.enemy = activator; + t.message = self.message; + t.killtarget = self.killtarget; + t.target = self.target; + return; + } + + +// +// print the message +// + if (activator.classname == "player" && self.message != "") + { + centerprint (activator, self.message); + if (!self.noise) + sound (activator, CHAN_VOICE, "misc/talk.wav", 1, ATTN_NORM); + } + +// +// kill the killtagets +// + if (self.killtarget) + { + t = world; + do + { + t = find (t, targetname, self.killtarget); + if (!t) + return; + remove (t); + } while ( 1 ); + } + +// +// fire targets +// + if (self.target) + { + act = activator; + t = world; + do + { + t = find (t, targetname, self.target); + if (!t) + { + return; + } + stemp = self; + otemp = other; + self = t; + other = stemp; + if (self.use != SUB_Null) + { + if (self.use) + self.use (); + } + self = stemp; + other = otemp; + activator = act; + } while ( 1 ); + } + + +}; + + +/* + +in nightmare mode, all attack_finished times become 0 +some monsters refire twice automatically + +*/ + +void(float normal) SUB_AttackFinished = +{ + self.cnt = 0; // refire count for nightmare + if (skill != 3) + self.attack_finished = time + normal; +}; + +float (entity targ) visible; + +void (void() thinkst) SUB_CheckRefire = +{ + if (skill != 3) + return; + if (self.cnt == 1) + return; + if (!visible (self.enemy)) + return; + self.cnt = 1; + self.think = thinkst; +}; diff --git a/src/tags b/src/tags new file mode 100644 index 0000000..db40475 --- /dev/null +++ b/src/tags @@ -0,0 +1,2159 @@ +!_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to lines/ +!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/ +!_TAG_PROGRAM_AUTHOR Darren Hiebert /dhiebert@users.sourceforge.net/ +!_TAG_PROGRAM_NAME Exuberant Ctags // +!_TAG_PROGRAM_URL http://ctags.sourceforge.net /official site/ +!_TAG_PROGRAM_VERSION 5.8 // +AddMultiDamage weapons.qc /^void(entity hit, float damage) AddMultiDamage =$/;" f +ApplyMultiDamage weapons.qc /^void() ApplyMultiDamage =$/;" f +BackpackTouch items.qc /^void() BackpackTouch =$/;" f +BecomeExplosion weapons.qc /^void() BecomeExplosion =$/;" f +CanDamage combat.qc /^float(entity targ, entity inflictor) CanDamage =$/;" f +CastLightning shambler.qc /^void() CastLightning =$/;" f +ChangeYaw ai.qc /^void() ChangeYaw =$/;" f +ChangeYaw defs.qc /^void() ChangeYaw = #49; \/\/ turn towards self.ideal_yaw$/;" f +CheatCommand weapons.qc /^void() CheatCommand =$/;" f +CheckAnyAttack ai.qc /^float() CheckAnyAttack =$/;" f +CheckAttack fight.qc /^float() CheckAttack =$/;" f +CheckContinueCharge hknight.qc /^void() CheckContinueCharge =$/;" f +CheckDemonJump demon.qc /^float() CheckDemonJump =$/;" f +CheckDemonMelee demon.qc /^float() CheckDemonMelee =$/;" f +CheckDogJump dog.qc /^float() CheckDogJump =$/;" f +CheckDogMelee dog.qc /^float() CheckDogMelee =$/;" f +CheckForCharge hknight.qc /^void() CheckForCharge =$/;" f +CheckPowerups client.qc /^void() CheckPowerups =$/;" f +CheckRules client.qc /^void() CheckRules =$/;" f +CheckSpawnPoint client.qc /^float(vector v) CheckSpawnPoint =$/;" f +CheckWaterJump client.qc /^void() CheckWaterJump =$/;" f +ChooseTurn ai.qc /^void(vector dest3) ChooseTurn =$/;" f +ClearMultiDamage weapons.qc /^void() ClearMultiDamage =$/;" f +ClientConnect client.qc /^void() ClientConnect =$/;" f +ClientDisconnect client.qc /^void() ClientDisconnect =$/;" f +ClientKill client.qc /^void() ClientKill =$/;" f +ClientObituary client.qc /^void(entity targ, entity attacker) ClientObituary =$/;" f +CopyToBodyQue world.qc /^void(entity ent) CopyToBodyQue =$/;" f +CycleWeaponCommand weapons.qc /^void() CycleWeaponCommand =$/;" f +CycleWeaponReverseCommand weapons.qc /^void() CycleWeaponReverseCommand =$/;" f +DeathBubbles player.qc /^void(float num_bubbles) DeathBubbles =$/;" f +DeathBubblesSpawn player.qc /^void() DeathBubblesSpawn =$/;" f +DeathSound player.qc /^void() DeathSound =$/;" f +Deathmatch_Weapon items.qc /^void(float old, float new) Deathmatch_Weapon =$/;" f +DecodeLevelParms client.qc /^void() DecodeLevelParms =$/;" f +DelayThink subs.qc /^void() DelayThink =$/;" f +DemonCheckAttack demon.qc /^float() DemonCheckAttack =$/;" f +Demon_JumpTouch demon.qc /^void() Demon_JumpTouch =$/;" f +Demon_Melee demon.qc /^void(float side) Demon_Melee =$/;" f +Demon_MeleeAttack demon.qc /^void() Demon_MeleeAttack =$/;" f +DogCheckAttack dog.qc /^float() DogCheckAttack =$/;" f +Dog_JumpTouch dog.qc /^void() Dog_JumpTouch =$/;" f +DropBackpack items.qc /^void() DropBackpack =$/;" f +EntitiesTouching doors.qc /^float (entity e1, entity e2) EntitiesTouching =$/;" f +ExitIntermission client.qc /^void() ExitIntermission =$/;" f +FacingIdeal ai.qc /^float() FacingIdeal =$/;" f +FindIntermission client.qc /^entity() FindIntermission =$/;" f +FindTarget ai.qc /^float() FindTarget =$/;" f +FireAmbient misc.qc /^void() FireAmbient =$/;" f +FireBullets weapons.qc /^void(float shotcount, vector dir, vector spread) FireBullets =$/;" f +FoundTarget ai.qc /^void() FoundTarget =$/;" f +GibPlayer player.qc /^void() GibPlayer =$/;" f +GotoNextMap client.qc /^void() GotoNextMap =$/;" f +GrenadeExplode weapons.qc /^void() GrenadeExplode =$/;" f +GrenadeTouch weapons.qc /^void() GrenadeTouch =$/;" f +GripFire portal.qc /^void() GripFire = {$/;" f +HuntTarget ai.qc /^void() HuntTarget =$/;" f +ImpulseCommands weapons.qc /^void() ImpulseCommands =$/;" f +InitBodyQue world.qc /^void() InitBodyQue =$/;" f +InitTrigger subs.qc /^void() InitTrigger =$/;" f +IntermissionThink client.qc /^void() IntermissionThink =$/;" f +Killed combat.qc /^void(entity targ, entity attacker) Killed =$/;" f +Laser_Touch enforcer.qc /^void() Laser_Touch =$/;" f +LaunchLaser enforcer.qc /^void(vector org, vector vec) LaunchLaser =$/;" f +LaunchMissile wizard.qc /^void(entity missile, float mspeed, float accuracy) LaunchMissile =$/;" f +LightningDamage weapons.qc /^void(vector p1, vector p2, entity from, float damage) LightningDamage =$/;" f +LinkDoors doors.qc /^void() LinkDoors =$/;" f +NextLevel client.qc /^void() NextLevel =$/;" f +OgreCheckAttack fight.qc /^float() OgreCheckAttack =$/;" f +OgreFireGrenade ogre.qc /^void() OgreFireGrenade =$/;" f +OgreGrenadeExplode ogre.qc /^void() OgreGrenadeExplode =$/;" f +OgreGrenadeTouch ogre.qc /^void() OgreGrenadeTouch =$/;" f +PainSound player.qc /^void() PainSound =$/;" f +PlaceItem items.qc /^void() PlaceItem =$/;" f +PlayerDead player.qc /^void() PlayerDead =$/;" f +PlayerDeathThink client.qc /^void() PlayerDeathThink =$/;" f +PlayerDie player.qc /^void() PlayerDie =$/;" f +PlayerJump client.qc /^void() PlayerJump =$/;" f +PlayerPostThink client.qc /^void() PlayerPostThink =$/;" f +PlayerPreThink client.qc /^void() PlayerPreThink =$/;" f +Portal1Touch portal.qc /^void() Portal1Touch = {$/;" f +Portal2Touch portal.qc /^void() Portal2Touch = {$/;" f +PortalCubeThink portal.qc /^void() PortalCubeThink = {$/;" f +PortalDeathTouch portal.qc /^void() PortalDeathTouch = {$/;" f +PortalErase portal.qc /^void(entity p) PortalErase = {$/;" f +PortalFire portal.qc /^void() PortalFire = $/;" f +PortalImpulses portal.qc /^void() PortalImpulses = {$/;" f +PortalInit portal.qc /^void() PortalInit = {$/;" f +PortalPrecache portal.qc /^void() PortalPrecache = {$/;" f +PortalTeleportEffect portal.qc /^void(entity org) PortalTeleportEffect = {$/;" f +PortalUpdate portal.qc /^void() PortalUpdate = {$/;" f +PutClientInServer client.qc /^void() PutClientInServer =$/;" f +QuadCheat weapons.qc /^void() QuadCheat =$/;" f +RankForWeapon items.qc /^float(float w) RankForWeapon =$/;" f +SUB_AttackFinished subs.qc /^void(float normal) SUB_AttackFinished =$/;" f +SUB_CalcAngleMoveDone subs.qc /^void() SUB_CalcAngleMoveDone =$/;" f +SUB_CalcMoveDone subs.qc /^void() SUB_CalcMoveDone =$/;" f +SUB_Null subs.qc /^void() SUB_Null = {};$/;" f +SUB_Remove subs.qc /^void() SUB_Remove = {remove(self);};$/;" f +SUB_Setorigin subs.qc /^void(entity p, vector o) SUB_Setorigin = {setorigin(p,o);};$/;" f +SUB_UseTargets subs.qc /^void() SUB_UseTargets =$/;" f +SUB_regen items.qc /^void() SUB_regen =$/;" f +SUB_teleport portal.qc /^void() SUB_teleport = {$/;" f +SelectSpawnPoint client.qc /^entity() SelectSpawnPoint =$/;" f +ServerflagsCommand weapons.qc /^void() ServerflagsCommand =$/;" f +SetChangeParms client.qc /^void() SetChangeParms =$/;" f +SetMovedir subs.qc /^void() SetMovedir =$/;" f +SetNewParms client.qc /^void() SetNewParms =$/;" f +ShalHome shalrath.qc /^void() ShalHome =$/;" f +ShalMissile shalrath.qc /^void() ShalMissile =$/;" f +ShalMissileTouch shalrath.qc /^void() ShalMissileTouch =$/;" f +ShamCheckAttack fight.qc /^float() ShamCheckAttack =$/;" f +ShamClaw shambler.qc /^void(float side) ShamClaw =$/;" f +SightSound ai.qc /^void() SightSound =$/;" f +SoldierCheckAttack fight.qc /^float() SoldierCheckAttack =$/;" f +SpawnBlood weapons.qc /^void(vector org, vector vel, float damage) SpawnBlood =$/;" f +SpawnChunk weapons.qc /^void(vector org, vector vel) SpawnChunk =$/;" f +SpawnMeatSpray weapons.qc /^void(vector org, vector vel) SpawnMeatSpray =$/;" f +StartFrame world.qc /^void() StartFrame =$/;" f +StartItem items.qc /^void() StartItem =$/;" f +SuperDamageSound weapons.qc /^void() SuperDamageSound =$/;" f +T_BeamDamage combat.qc /^void(entity attacker, float damage) T_BeamDamage =$/;" f +T_Damage combat.qc /^void(entity targ, entity inflictor, entity attacker, float damage) T_Damage=$/;" f +T_Heal items.qc /^float (entity e, float healamount, float ignore) T_Heal =$/;" f +T_MissileTouch weapons.qc /^void() T_MissileTouch =$/;" f +T_PortalSpawn portal.qc /^void(entity own, entity hit, vector org) T_PortalSpawn = {$/;" f +T_RadiusDamage combat.qc /^void(entity inflictor, entity attacker, float damage, entity ignore) T_RadiusDamage =$/;" f +Tar_JumpTouch tarbaby.qc /^void() Tar_JumpTouch =$/;" f +ThrowGib player.qc /^void(string gibname, float dm) ThrowGib =$/;" f +ThrowHead player.qc /^void(string gibname, float dm) ThrowHead =$/;" f +TraceAttack weapons.qc /^void(float damage, vector dir) TraceAttack =$/;" f +VelocityForDamage player.qc /^vector(float dm) VelocityForDamage =$/;" f +W_Attack weapons.qc /^void() W_Attack =$/;" f +W_BestWeapon weapons.qc /^float() W_BestWeapon =$/;" f +W_ChangeWeapon weapons.qc /^void() W_ChangeWeapon =$/;" f +W_CheckNoAmmo weapons.qc /^float() W_CheckNoAmmo =$/;" f +W_FireAxe weapons.qc /^void() W_FireAxe =$/;" f +W_FireGrenade weapons.qc /^void() W_FireGrenade =$/;" f +W_FireLightning weapons.qc /^void() W_FireLightning =$/;" f +W_FireRocket weapons.qc /^void() W_FireRocket =$/;" f +W_FireShotgun weapons.qc /^void() W_FireShotgun =$/;" f +W_FireSpikes weapons.qc /^void(float ox) W_FireSpikes =$/;" f +W_FireSuperShotgun weapons.qc /^void() W_FireSuperShotgun =$/;" f +W_FireSuperSpikes weapons.qc /^void() W_FireSuperSpikes =$/;" f +W_Precache weapons.qc /^void() W_Precache =$/;" f +W_SetCurrentAmmo weapons.qc /^void() W_SetCurrentAmmo =$/;" f +W_WeaponFrame weapons.qc /^void() W_WeaponFrame =$/;" f +WaterMove client.qc /^void() WaterMove =$/;" f +Wiz_FastFire wizard.qc /^void() Wiz_FastFire =$/;" f +Wiz_Missile wizard.qc /^void() Wiz_Missile =$/;" f +Wiz_Pain wizard.qc /^void(entity attacker, float damage) Wiz_Pain =$/;" f +Wiz_StartFast wizard.qc /^void() Wiz_StartFast =$/;" f +Wiz_idlesound wizard.qc /^void() Wiz_idlesound =$/;" f +WizardAttackFinished wizard.qc /^void() WizardAttackFinished =$/;" f +WizardCheckAttack wizard.qc /^float() WizardCheckAttack =$/;" f +WriteAngle defs.qc /^void(float to, float f) WriteAngle = #57;$/;" f +WriteByte defs.qc /^void(float to, float f) WriteByte = #52;$/;" f +WriteChar defs.qc /^void(float to, float f) WriteChar = #53;$/;" f +WriteCoord defs.qc /^void(float to, float f) WriteCoord = #56;$/;" f +WriteEntity defs.qc /^void(float to, entity s) WriteEntity = #59;$/;" f +WriteLong defs.qc /^void(float to, float f) WriteLong = #55;$/;" f +WriteShort defs.qc /^void(float to, float f) WriteShort = #54;$/;" f +WriteString defs.qc /^void(float to, string s) WriteString = #58;$/;" f +ZombieFireGrenade zombie.qc /^void(vector st) ZombieFireGrenade =$/;" f +ZombieGrenadeTouch zombie.qc /^void() ZombieGrenadeTouch =$/;" f +ai_back ai.qc /^void(float dist) ai_back =$/;" f +ai_charge fight.qc /^void(float d) ai_charge =$/;" f +ai_charge_side fight.qc /^void() ai_charge_side =$/;" f +ai_face fight.qc /^void() ai_face =$/;" f +ai_forward ai.qc /^void(float dist) ai_forward =$/;" f +ai_melee fight.qc /^void() ai_melee =$/;" f +ai_melee_side fight.qc /^void() ai_melee_side =$/;" f +ai_pain ai.qc /^void(float dist) ai_pain =$/;" f +ai_painforward ai.qc /^void(float dist) ai_painforward =$/;" f +ai_run ai.qc /^void(float dist) ai_run =$/;" f +ai_run_melee ai.qc /^void() ai_run_melee =$/;" f +ai_run_missile ai.qc /^void() ai_run_missile =$/;" f +ai_run_slide ai.qc /^void() ai_run_slide =$/;" f +ai_stand ai.qc /^void() ai_stand =$/;" f +ai_turn ai.qc /^void() ai_turn =$/;" f +ai_walk ai.qc /^void(float dist) ai_walk =$/;" f +aim defs.qc /^vector(entity e, float speed) aim = #44; \/\/ returns the shooting vector$/;" f +air_bubbles misc.qc /^void() air_bubbles =$/;" f +ambient_comp_hum misc.qc /^void() ambient_comp_hum =$/;" f +ambient_drip misc.qc /^void() ambient_drip =$/;" f +ambient_drone misc.qc /^void() ambient_drone =$/;" f +ambient_flouro_buzz misc.qc /^void() ambient_flouro_buzz =$/;" f +ambient_light_buzz misc.qc /^void() ambient_light_buzz =$/;" f +ambient_suck_wind misc.qc /^void() ambient_suck_wind =$/;" f +ambient_swamp1 misc.qc /^void() ambient_swamp1 =$/;" f +ambient_swamp2 misc.qc /^void() ambient_swamp2 =$/;" f +ambient_thunder misc.qc /^void() ambient_thunder =$/;" f +ambientsound defs.qc /^void(vector pos, string samp, float vol, float atten) ambientsound = #74;$/;" f +ammo_touch items.qc /^void() ammo_touch =$/;" f +anglemod ai.qc /^float(float v) anglemod =$/;" f +armor_touch items.qc /^void() armor_touch =$/;" f +army_atk1 soldier.qc /^void() army_atk1 =[ $shoot1, army_atk2 ] {ai_face();};$/;" f +army_atk2 soldier.qc /^void() army_atk2 =[ $shoot2, army_atk3 ] {ai_face();};$/;" f +army_atk3 soldier.qc /^void() army_atk3 =[ $shoot3, army_atk4 ] {ai_face();};$/;" f +army_atk4 soldier.qc /^void() army_atk4 =[ $shoot4, army_atk5 ] {ai_face();};$/;" f +army_atk5 soldier.qc /^void() army_atk5 =[ $shoot5, army_atk6 ] {ai_face();army_fire();$/;" f +army_atk6 soldier.qc /^void() army_atk6 =[ $shoot6, army_atk7 ] {ai_face();};$/;" f +army_atk7 soldier.qc /^void() army_atk7 =[ $shoot7, army_atk8 ] {ai_face();SUB_CheckRefire (army_atk1);};$/;" f +army_atk8 soldier.qc /^void() army_atk8 =[ $shoot8, army_atk9 ] {ai_face();};$/;" f +army_atk9 soldier.qc /^void() army_atk9 =[ $shoot9, army_run1 ] {ai_face();};$/;" f +army_cdie1 soldier.qc /^void() army_cdie1 =[ $deathc1, army_cdie2 ] {};$/;" f +army_cdie10 soldier.qc /^void() army_cdie10 =[ $deathc10, army_cdie11 ] {};$/;" f +army_cdie11 soldier.qc /^void() army_cdie11 =[ $deathc11, army_cdie11 ] {};$/;" f +army_cdie2 soldier.qc /^void() army_cdie2 =[ $deathc2, army_cdie3 ] {ai_back(5);};$/;" f +army_cdie3 soldier.qc /^void() army_cdie3 =[ $deathc3, army_cdie4 ]$/;" f +army_cdie4 soldier.qc /^void() army_cdie4 =[ $deathc4, army_cdie5 ] {ai_back(13);};$/;" f +army_cdie5 soldier.qc /^void() army_cdie5 =[ $deathc5, army_cdie6 ] {ai_back(3);};$/;" f +army_cdie6 soldier.qc /^void() army_cdie6 =[ $deathc6, army_cdie7 ] {ai_back(4);};$/;" f +army_cdie7 soldier.qc /^void() army_cdie7 =[ $deathc7, army_cdie8 ] {};$/;" f +army_cdie8 soldier.qc /^void() army_cdie8 =[ $deathc8, army_cdie9 ] {};$/;" f +army_cdie9 soldier.qc /^void() army_cdie9 =[ $deathc9, army_cdie10 ] {};$/;" f +army_die soldier.qc /^void() army_die =$/;" f +army_die1 soldier.qc /^void() army_die1 =[ $death1, army_die2 ] {};$/;" f +army_die10 soldier.qc /^void() army_die10 =[ $death10, army_die10 ] {};$/;" f +army_die2 soldier.qc /^void() army_die2 =[ $death2, army_die3 ] {};$/;" f +army_die3 soldier.qc /^void() army_die3 =[ $death3, army_die4 ]$/;" f +army_die4 soldier.qc /^void() army_die4 =[ $death4, army_die5 ] {};$/;" f +army_die5 soldier.qc /^void() army_die5 =[ $death5, army_die6 ] {};$/;" f +army_die6 soldier.qc /^void() army_die6 =[ $death6, army_die7 ] {};$/;" f +army_die7 soldier.qc /^void() army_die7 =[ $death7, army_die8 ] {};$/;" f +army_die8 soldier.qc /^void() army_die8 =[ $death8, army_die9 ] {};$/;" f +army_die9 soldier.qc /^void() army_die9 =[ $death9, army_die10 ] {};$/;" f +army_fire soldier.qc /^void() army_fire =$/;" f +army_pain soldier.qc /^void(entity attacker, float damage) army_pain =$/;" f +army_pain1 soldier.qc /^void() army_pain1 =[ $pain1, army_pain2 ] {};$/;" f +army_pain2 soldier.qc /^void() army_pain2 =[ $pain2, army_pain3 ] {};$/;" f +army_pain3 soldier.qc /^void() army_pain3 =[ $pain3, army_pain4 ] {};$/;" f +army_pain4 soldier.qc /^void() army_pain4 =[ $pain4, army_pain5 ] {};$/;" f +army_pain5 soldier.qc /^void() army_pain5 =[ $pain5, army_pain6 ] {};$/;" f +army_pain6 soldier.qc /^void() army_pain6 =[ $pain6, army_run1 ] {ai_pain(1);};$/;" f +army_painb1 soldier.qc /^void() army_painb1 =[ $painb1, army_painb2 ] {};$/;" f +army_painb10 soldier.qc /^void() army_painb10=[ $painb10, army_painb11] {};$/;" f +army_painb11 soldier.qc /^void() army_painb11=[ $painb11, army_painb12] {};$/;" f +army_painb12 soldier.qc /^void() army_painb12=[ $painb12, army_painb13] {ai_pain(2);};$/;" f +army_painb13 soldier.qc /^void() army_painb13=[ $painb13, army_painb14] {};$/;" f +army_painb14 soldier.qc /^void() army_painb14=[ $painb14, army_run1 ] {};$/;" f +army_painb2 soldier.qc /^void() army_painb2 =[ $painb2, army_painb3 ] {ai_painforward(13);};$/;" f +army_painb3 soldier.qc /^void() army_painb3 =[ $painb3, army_painb4 ] {ai_painforward(9);};$/;" f +army_painb4 soldier.qc /^void() army_painb4 =[ $painb4, army_painb5 ] {};$/;" f +army_painb5 soldier.qc /^void() army_painb5 =[ $painb5, army_painb6 ] {};$/;" f +army_painb6 soldier.qc /^void() army_painb6 =[ $painb6, army_painb7 ] {};$/;" f +army_painb7 soldier.qc /^void() army_painb7 =[ $painb7, army_painb8 ] {};$/;" f +army_painb8 soldier.qc /^void() army_painb8 =[ $painb8, army_painb9 ] {};$/;" f +army_painb9 soldier.qc /^void() army_painb9 =[ $painb9, army_painb10] {};$/;" f +army_painc1 soldier.qc /^void() army_painc1 =[ $painc1, army_painc2 ] {};$/;" f +army_painc10 soldier.qc /^void() army_painc10=[ $painc10, army_painc11] {ai_painforward(3);};$/;" f +army_painc11 soldier.qc /^void() army_painc11=[ $painc11, army_painc12] {ai_painforward(6);};$/;" f +army_painc12 soldier.qc /^void() army_painc12=[ $painc12, army_painc13] {ai_painforward(8);};$/;" f +army_painc13 soldier.qc /^void() army_painc13=[ $painc13, army_run1] {};$/;" f +army_painc2 soldier.qc /^void() army_painc2 =[ $painc2, army_painc3 ] {ai_pain(1);};$/;" f +army_painc3 soldier.qc /^void() army_painc3 =[ $painc3, army_painc4 ] {};$/;" f +army_painc4 soldier.qc /^void() army_painc4 =[ $painc4, army_painc5 ] {};$/;" f +army_painc5 soldier.qc /^void() army_painc5 =[ $painc5, army_painc6 ] {ai_painforward(1);};$/;" f +army_painc6 soldier.qc /^void() army_painc6 =[ $painc6, army_painc7 ] {ai_painforward(1);};$/;" f +army_painc7 soldier.qc /^void() army_painc7 =[ $painc7, army_painc8 ] {};$/;" f +army_painc8 soldier.qc /^void() army_painc8 =[ $painc8, army_painc9 ] {ai_pain(1);};$/;" f +army_painc9 soldier.qc /^void() army_painc9 =[ $painc9, army_painc10] {ai_painforward(4);};$/;" f +army_run1 soldier.qc /^void() army_run1 =[ $run1, army_run2 ] {$/;" f +army_run2 soldier.qc /^void() army_run2 =[ $run2, army_run3 ] {ai_run(15);};$/;" f +army_run3 soldier.qc /^void() army_run3 =[ $run3, army_run4 ] {ai_run(10);};$/;" f +army_run4 soldier.qc /^void() army_run4 =[ $run4, army_run5 ] {ai_run(10);};$/;" f +army_run5 soldier.qc /^void() army_run5 =[ $run5, army_run6 ] {ai_run(8);};$/;" f +army_run6 soldier.qc /^void() army_run6 =[ $run6, army_run7 ] {ai_run(15);};$/;" f +army_run7 soldier.qc /^void() army_run7 =[ $run7, army_run8 ] {ai_run(10);};$/;" f +army_run8 soldier.qc /^void() army_run8 =[ $run8, army_run1 ] {ai_run(8);};$/;" f +army_stand1 soldier.qc /^void() army_stand1 =[ $stand1, army_stand2 ] {ai_stand();};$/;" f +army_stand2 soldier.qc /^void() army_stand2 =[ $stand2, army_stand3 ] {ai_stand();};$/;" f +army_stand3 soldier.qc /^void() army_stand3 =[ $stand3, army_stand4 ] {ai_stand();};$/;" f +army_stand4 soldier.qc /^void() army_stand4 =[ $stand4, army_stand5 ] {ai_stand();};$/;" f +army_stand5 soldier.qc /^void() army_stand5 =[ $stand5, army_stand6 ] {ai_stand();};$/;" f +army_stand6 soldier.qc /^void() army_stand6 =[ $stand6, army_stand7 ] {ai_stand();};$/;" f +army_stand7 soldier.qc /^void() army_stand7 =[ $stand7, army_stand8 ] {ai_stand();};$/;" f +army_stand8 soldier.qc /^void() army_stand8 =[ $stand8, army_stand1 ] {ai_stand();};$/;" f +army_walk1 soldier.qc /^void() army_walk1 =[ $prowl_1, army_walk2 ] {$/;" f +army_walk10 soldier.qc /^void() army_walk10 =[ $prowl_10, army_walk11 ] {ai_walk(2);};$/;" f +army_walk11 soldier.qc /^void() army_walk11 =[ $prowl_11, army_walk12 ] {ai_walk(2);};$/;" f +army_walk12 soldier.qc /^void() army_walk12 =[ $prowl_12, army_walk13 ] {ai_walk(1);};$/;" f +army_walk13 soldier.qc /^void() army_walk13 =[ $prowl_13, army_walk14 ] {ai_walk(0);};$/;" f +army_walk14 soldier.qc /^void() army_walk14 =[ $prowl_14, army_walk15 ] {ai_walk(1);};$/;" f +army_walk15 soldier.qc /^void() army_walk15 =[ $prowl_15, army_walk16 ] {ai_walk(1);};$/;" f +army_walk16 soldier.qc /^void() army_walk16 =[ $prowl_16, army_walk17 ] {ai_walk(1);};$/;" f +army_walk17 soldier.qc /^void() army_walk17 =[ $prowl_17, army_walk18 ] {ai_walk(3);};$/;" f +army_walk18 soldier.qc /^void() army_walk18 =[ $prowl_18, army_walk19 ] {ai_walk(3);};$/;" f +army_walk19 soldier.qc /^void() army_walk19 =[ $prowl_19, army_walk20 ] {ai_walk(3);};$/;" f +army_walk2 soldier.qc /^void() army_walk2 =[ $prowl_2, army_walk3 ] {ai_walk(1);};$/;" f +army_walk20 soldier.qc /^void() army_walk20 =[ $prowl_20, army_walk21 ] {ai_walk(3);};$/;" f +army_walk21 soldier.qc /^void() army_walk21 =[ $prowl_21, army_walk22 ] {ai_walk(2);};$/;" f +army_walk22 soldier.qc /^void() army_walk22 =[ $prowl_22, army_walk23 ] {ai_walk(1);};$/;" f +army_walk23 soldier.qc /^void() army_walk23 =[ $prowl_23, army_walk24 ] {ai_walk(1);};$/;" f +army_walk24 soldier.qc /^void() army_walk24 =[ $prowl_24, army_walk1 ] {ai_walk(1);};$/;" f +army_walk3 soldier.qc /^void() army_walk3 =[ $prowl_3, army_walk4 ] {ai_walk(1);};$/;" f +army_walk4 soldier.qc /^void() army_walk4 =[ $prowl_4, army_walk5 ] {ai_walk(1);};$/;" f +army_walk5 soldier.qc /^void() army_walk5 =[ $prowl_5, army_walk6 ] {ai_walk(2);};$/;" f +army_walk6 soldier.qc /^void() army_walk6 =[ $prowl_6, army_walk7 ] {ai_walk(3);};$/;" f +army_walk7 soldier.qc /^void() army_walk7 =[ $prowl_7, army_walk8 ] {ai_walk(4);};$/;" f +army_walk8 soldier.qc /^void() army_walk8 =[ $prowl_8, army_walk9 ] {ai_walk(4);};$/;" f +army_walk9 soldier.qc /^void() army_walk9 =[ $prowl_9, army_walk10 ] {ai_walk(2);};$/;" f +ass_cube cube.qc /^void() ass_cube =$/;" f +ass_grill asstech.qc /^void() ass_grill =$/;" f +ass_hardlight asstech.qc /^void() ass_hardlight =$/;" f +ass_pelletcatcher asstech.qc /^void () ass_pelletcatcher = {$/;" f +ass_pelletlauncher asstech.qc /^void () ass_pelletlauncher =$/;" f +ass_portalproof asstech.qc /^void() ass_portalproof =$/;" f +asscube_push cube.qc /^void() asscube_push =$/;" f +asscube_think cube.qc /^void() asscube_think =$/;" f +barrel_explode misc.qc /^void() barrel_explode =$/;" f +blocker_touch grid.qc /^void () blocker_touch =$/;" f +blocker_use grid.qc /^void () blocker_use =$/;" f +bodyque world.qc /^void() bodyque =$/;" f +boss_awake boss.qc /^void() boss_awake =$/;" f +boss_death1 boss.qc /^void() boss_death1 = [$death1, boss_death2] {$/;" f +boss_death10 boss.qc /^void() boss_death10 = [$death9, boss_death10]$/;" f +boss_death2 boss.qc /^void() boss_death2 = [$death2, boss_death3] {};$/;" f +boss_death3 boss.qc /^void() boss_death3 = [$death3, boss_death4] {};$/;" f +boss_death4 boss.qc /^void() boss_death4 = [$death4, boss_death5] {};$/;" f +boss_death5 boss.qc /^void() boss_death5 = [$death5, boss_death6] {};$/;" f +boss_death6 boss.qc /^void() boss_death6 = [$death6, boss_death7] {};$/;" f +boss_death7 boss.qc /^void() boss_death7 = [$death7, boss_death8] {};$/;" f +boss_death8 boss.qc /^void() boss_death8 = [$death8, boss_death9] {};$/;" f +boss_death9 boss.qc /^void() boss_death9 = [$death9, boss_death10]$/;" f +boss_face boss.qc /^void() boss_face =$/;" f +boss_idle1 boss.qc /^void() boss_idle1 =[ $walk1, boss_idle2 ]$/;" f +boss_idle10 boss.qc /^void() boss_idle10 =[ $walk10, boss_idle11 ] {boss_face();};$/;" f +boss_idle11 boss.qc /^void() boss_idle11 =[ $walk11, boss_idle12 ] {boss_face();};$/;" f +boss_idle12 boss.qc /^void() boss_idle12 =[ $walk12, boss_idle13 ] {boss_face();};$/;" f +boss_idle13 boss.qc /^void() boss_idle13 =[ $walk13, boss_idle14 ] {boss_face();};$/;" f +boss_idle14 boss.qc /^void() boss_idle14 =[ $walk14, boss_idle15 ] {boss_face();};$/;" f +boss_idle15 boss.qc /^void() boss_idle15 =[ $walk15, boss_idle16 ] {boss_face();};$/;" f +boss_idle16 boss.qc /^void() boss_idle16 =[ $walk16, boss_idle17 ] {boss_face();};$/;" f +boss_idle17 boss.qc /^void() boss_idle17 =[ $walk17, boss_idle18 ] {boss_face();};$/;" f +boss_idle18 boss.qc /^void() boss_idle18 =[ $walk18, boss_idle19 ] {boss_face();};$/;" f +boss_idle19 boss.qc /^void() boss_idle19 =[ $walk19, boss_idle20 ] {boss_face();};$/;" f +boss_idle2 boss.qc /^void() boss_idle2 =[ $walk2, boss_idle3 ] {boss_face();};$/;" f +boss_idle20 boss.qc /^void() boss_idle20 =[ $walk20, boss_idle21 ] {boss_face();};$/;" f +boss_idle21 boss.qc /^void() boss_idle21 =[ $walk21, boss_idle22 ] {boss_face();};$/;" f +boss_idle22 boss.qc /^void() boss_idle22 =[ $walk22, boss_idle23 ] {boss_face();};$/;" f +boss_idle23 boss.qc /^void() boss_idle23 =[ $walk23, boss_idle24 ] {boss_face();};$/;" f +boss_idle24 boss.qc /^void() boss_idle24 =[ $walk24, boss_idle25 ] {boss_face();};$/;" f +boss_idle25 boss.qc /^void() boss_idle25 =[ $walk25, boss_idle26 ] {boss_face();};$/;" f +boss_idle26 boss.qc /^void() boss_idle26 =[ $walk26, boss_idle27 ] {boss_face();};$/;" f +boss_idle27 boss.qc /^void() boss_idle27 =[ $walk27, boss_idle28 ] {boss_face();};$/;" f +boss_idle28 boss.qc /^void() boss_idle28 =[ $walk28, boss_idle29 ] {boss_face();};$/;" f +boss_idle29 boss.qc /^void() boss_idle29 =[ $walk29, boss_idle30 ] {boss_face();};$/;" f +boss_idle3 boss.qc /^void() boss_idle3 =[ $walk3, boss_idle4 ] {boss_face();};$/;" f +boss_idle30 boss.qc /^void() boss_idle30 =[ $walk30, boss_idle31 ] {boss_face();};$/;" f +boss_idle31 boss.qc /^void() boss_idle31 =[ $walk31, boss_idle1 ] {boss_face();};$/;" f +boss_idle4 boss.qc /^void() boss_idle4 =[ $walk4, boss_idle5 ] {boss_face();};$/;" f +boss_idle5 boss.qc /^void() boss_idle5 =[ $walk5, boss_idle6 ] {boss_face();};$/;" f +boss_idle6 boss.qc /^void() boss_idle6 =[ $walk6, boss_idle7 ] {boss_face();};$/;" f +boss_idle7 boss.qc /^void() boss_idle7 =[ $walk7, boss_idle8 ] {boss_face();};$/;" f +boss_idle8 boss.qc /^void() boss_idle8 =[ $walk8, boss_idle9 ] {boss_face();};$/;" f +boss_idle9 boss.qc /^void() boss_idle9 =[ $walk9, boss_idle10 ] {boss_face();};$/;" f +boss_missile boss.qc /^void(vector p) boss_missile =$/;" f +boss_missile1 boss.qc /^void() boss_missile1 =[ $attack1, boss_missile2 ] {boss_face();};$/;" f +boss_missile10 boss.qc /^void() boss_missile10 =[ $attack10, boss_missile11 ] {boss_face();};$/;" f +boss_missile11 boss.qc /^void() boss_missile11 =[ $attack11, boss_missile12 ] {boss_face();};$/;" f +boss_missile12 boss.qc /^void() boss_missile12 =[ $attack12, boss_missile13 ] {boss_face();};$/;" f +boss_missile13 boss.qc /^void() boss_missile13 =[ $attack13, boss_missile14 ] {boss_face();};$/;" f +boss_missile14 boss.qc /^void() boss_missile14 =[ $attack14, boss_missile15 ] {boss_face();};$/;" f +boss_missile15 boss.qc /^void() boss_missile15 =[ $attack15, boss_missile16 ] {boss_face();};$/;" f +boss_missile16 boss.qc /^void() boss_missile16 =[ $attack16, boss_missile17 ] {boss_face();};$/;" f +boss_missile17 boss.qc /^void() boss_missile17 =[ $attack17, boss_missile18 ] {boss_face();};$/;" f +boss_missile18 boss.qc /^void() boss_missile18 =[ $attack18, boss_missile19 ] {boss_face();};$/;" f +boss_missile19 boss.qc /^void() boss_missile19 =[ $attack19, boss_missile20 ] {boss_face();};$/;" f +boss_missile2 boss.qc /^void() boss_missile2 =[ $attack2, boss_missile3 ] {boss_face();};$/;" f +boss_missile20 boss.qc /^void() boss_missile20 =[ $attack20, boss_missile21 ] {boss_missile('100 -100 200');};$/;" f +boss_missile21 boss.qc /^void() boss_missile21 =[ $attack21, boss_missile22 ] {boss_face();};$/;" f +boss_missile22 boss.qc /^void() boss_missile22 =[ $attack22, boss_missile23 ] {boss_face();};$/;" f +boss_missile23 boss.qc /^void() boss_missile23 =[ $attack23, boss_missile1 ] {boss_face();};$/;" f +boss_missile3 boss.qc /^void() boss_missile3 =[ $attack3, boss_missile4 ] {boss_face();};$/;" f +boss_missile4 boss.qc /^void() boss_missile4 =[ $attack4, boss_missile5 ] {boss_face();};$/;" f +boss_missile5 boss.qc /^void() boss_missile5 =[ $attack5, boss_missile6 ] {boss_face();};$/;" f +boss_missile6 boss.qc /^void() boss_missile6 =[ $attack6, boss_missile7 ] {boss_face();};$/;" f +boss_missile7 boss.qc /^void() boss_missile7 =[ $attack7, boss_missile8 ] {boss_face();};$/;" f +boss_missile8 boss.qc /^void() boss_missile8 =[ $attack8, boss_missile9 ] {boss_face();};$/;" f +boss_missile9 boss.qc /^void() boss_missile9 =[ $attack9, boss_missile10 ] {boss_missile('100 100 200');};$/;" f +boss_rise1 boss.qc /^void() boss_rise1 =[ $rise1, boss_rise2 ] {$/;" f +boss_rise10 boss.qc /^void() boss_rise10 =[ $rise10, boss_rise11 ] {};$/;" f +boss_rise11 boss.qc /^void() boss_rise11 =[ $rise11, boss_rise12 ] {};$/;" f +boss_rise12 boss.qc /^void() boss_rise12 =[ $rise12, boss_rise13 ] {};$/;" f +boss_rise13 boss.qc /^void() boss_rise13 =[ $rise13, boss_rise14 ] {};$/;" f +boss_rise14 boss.qc /^void() boss_rise14 =[ $rise14, boss_rise15 ] {};$/;" f +boss_rise15 boss.qc /^void() boss_rise15 =[ $rise15, boss_rise16 ] {};$/;" f +boss_rise16 boss.qc /^void() boss_rise16 =[ $rise16, boss_rise17 ] {};$/;" f +boss_rise17 boss.qc /^void() boss_rise17 =[ $rise17, boss_missile1 ] {};$/;" f +boss_rise2 boss.qc /^void() boss_rise2 =[ $rise2, boss_rise3 ] {$/;" f +boss_rise3 boss.qc /^void() boss_rise3 =[ $rise3, boss_rise4 ] {};$/;" f +boss_rise4 boss.qc /^void() boss_rise4 =[ $rise4, boss_rise5 ] {};$/;" f +boss_rise5 boss.qc /^void() boss_rise5 =[ $rise5, boss_rise6 ] {};$/;" f +boss_rise6 boss.qc /^void() boss_rise6 =[ $rise6, boss_rise7 ] {};$/;" f +boss_rise7 boss.qc /^void() boss_rise7 =[ $rise7, boss_rise8 ] {};$/;" f +boss_rise8 boss.qc /^void() boss_rise8 =[ $rise8, boss_rise9 ] {};$/;" f +boss_rise9 boss.qc /^void() boss_rise9 =[ $rise9, boss_rise10 ] {};$/;" f +boss_shocka1 boss.qc /^void() boss_shocka1 =[ $shocka1, boss_shocka2 ] {};$/;" f +boss_shocka10 boss.qc /^void() boss_shocka10 =[ $shocka10, boss_missile1 ] {};$/;" f +boss_shocka2 boss.qc /^void() boss_shocka2 =[ $shocka2, boss_shocka3 ] {};$/;" f +boss_shocka3 boss.qc /^void() boss_shocka3 =[ $shocka3, boss_shocka4 ] {};$/;" f +boss_shocka4 boss.qc /^void() boss_shocka4 =[ $shocka4, boss_shocka5 ] {};$/;" f +boss_shocka5 boss.qc /^void() boss_shocka5 =[ $shocka5, boss_shocka6 ] {};$/;" f +boss_shocka6 boss.qc /^void() boss_shocka6 =[ $shocka6, boss_shocka7 ] {};$/;" f +boss_shocka7 boss.qc /^void() boss_shocka7 =[ $shocka7, boss_shocka8 ] {};$/;" f +boss_shocka8 boss.qc /^void() boss_shocka8 =[ $shocka8, boss_shocka9 ] {};$/;" f +boss_shocka9 boss.qc /^void() boss_shocka9 =[ $shocka9, boss_shocka10 ] {};$/;" f +boss_shockb1 boss.qc /^void() boss_shockb1 =[ $shockb1, boss_shockb2 ] {};$/;" f +boss_shockb10 boss.qc /^void() boss_shockb10 =[ $shockb4, boss_missile1 ] {};$/;" f +boss_shockb2 boss.qc /^void() boss_shockb2 =[ $shockb2, boss_shockb3 ] {};$/;" f +boss_shockb3 boss.qc /^void() boss_shockb3 =[ $shockb3, boss_shockb4 ] {};$/;" f +boss_shockb4 boss.qc /^void() boss_shockb4 =[ $shockb4, boss_shockb5 ] {};$/;" f +boss_shockb5 boss.qc /^void() boss_shockb5 =[ $shockb5, boss_shockb6 ] {};$/;" f +boss_shockb6 boss.qc /^void() boss_shockb6 =[ $shockb6, boss_shockb7 ] {};$/;" f +boss_shockb7 boss.qc /^void() boss_shockb7 =[ $shockb1, boss_shockb8 ] {};$/;" f +boss_shockb8 boss.qc /^void() boss_shockb8 =[ $shockb2, boss_shockb9 ] {};$/;" f +boss_shockb9 boss.qc /^void() boss_shockb9 =[ $shockb3, boss_shockb10 ] {};$/;" f +boss_shockc1 boss.qc /^void() boss_shockc1 =[ $shockc1, boss_shockc2 ] {};$/;" f +boss_shockc10 boss.qc /^void() boss_shockc10 =[ $shockc10, boss_death1 ] {};$/;" f +boss_shockc2 boss.qc /^void() boss_shockc2 =[ $shockc2, boss_shockc3 ] {};$/;" f +boss_shockc3 boss.qc /^void() boss_shockc3 =[ $shockc3, boss_shockc4 ] {};$/;" f +boss_shockc4 boss.qc /^void() boss_shockc4 =[ $shockc4, boss_shockc5 ] {};$/;" f +boss_shockc5 boss.qc /^void() boss_shockc5 =[ $shockc5, boss_shockc6 ] {};$/;" f +boss_shockc6 boss.qc /^void() boss_shockc6 =[ $shockc6, boss_shockc7 ] {};$/;" f +boss_shockc7 boss.qc /^void() boss_shockc7 =[ $shockc7, boss_shockc8 ] {};$/;" f +boss_shockc8 boss.qc /^void() boss_shockc8 =[ $shockc8, boss_shockc9 ] {};$/;" f +boss_shockc9 boss.qc /^void() boss_shockc9 =[ $shockc9, boss_shockc10 ] {};$/;" f +bound_other_ammo items.qc /^void() bound_other_ammo =$/;" f +bprint defs.qc /^void(string s) bprint = #23;$/;" f +break defs.qc /^void() break = #6;$/;" f +bubble_bob misc.qc /^void() bubble_bob =$/;" f +bubble_remove misc.qc /^void() bubble_remove =$/;" f +bubble_split misc.qc /^void() bubble_split =$/;" f +button_blocked buttons.qc /^void() button_blocked =$/;" f +button_done buttons.qc /^void() button_done =$/;" f +button_fire buttons.qc /^void() button_fire =$/;" f +button_killed buttons.qc /^void() button_killed =$/;" f +button_return buttons.qc /^void() button_return =$/;" f +button_touch buttons.qc /^void() button_touch =$/;" f +button_use buttons.qc /^void() button_use =$/;" f +button_wait buttons.qc /^void() button_wait =$/;" f +ceil defs.qc /^float(float v) ceil = #38; \/\/ smallest integer >= v$/;" f +centerprint defs.qc /^void(entity client, string s) centerprint = #73; \/\/ sprint, but in middle$/;" f +chainsaw ogre.qc /^void(float side) chainsaw =$/;" f +changelevel defs.qc /^void(string s) changelevel = #70;$/;" f +changelevel_touch client.qc /^void() changelevel_touch =$/;" f +checkbottom defs.qc /^float(entity e) checkbottom = #40; \/\/ true if self is on ground$/;" f +checkclient defs.qc /^entity() checkclient = #17; \/\/ returns a client to look for$/;" f +coredump defs.qc /^void() coredump = #28; \/\/ prints all edicts$/;" f +counter_GetCount asstech.qc /^float(entity counter) counter_GetCount =$/;" f +counter_off_use asstech.qc /^void() counter_off_use =$/;" f +counter_on_use asstech.qc /^void() counter_on_use =$/;" f +counter_think asstech.qc /^void() counter_think =$/;" f +counter_use triggers.qc /^void() counter_use =$/;" f +crandom weapons.qc /^float() crandom =$/;" f +cvar defs.qc /^float(string s) cvar = #45; \/\/ return cvar.value$/;" f +cvar_set defs.qc /^void(string var, string val) cvar_set = #72; \/\/ sets cvar.value$/;" f +demon1_atta1 demon.qc /^void() demon1_atta1 =[ $attacka1, demon1_atta2 ] {ai_charge(4);};$/;" f +demon1_atta10 demon.qc /^void() demon1_atta10 =[ $attacka10, demon1_atta11] {ai_charge(2);};$/;" f +demon1_atta11 demon.qc /^void() demon1_atta11 =[ $attacka11, demon1_atta12] {Demon_Melee(-200);};$/;" f +demon1_atta12 demon.qc /^void() demon1_atta12 =[ $attacka12, demon1_atta13] {ai_charge(5);};$/;" f +demon1_atta13 demon.qc /^void() demon1_atta13 =[ $attacka13, demon1_atta14] {ai_charge(8);};$/;" f +demon1_atta14 demon.qc /^void() demon1_atta14 =[ $attacka14, demon1_atta15] {ai_charge(4);};$/;" f +demon1_atta15 demon.qc /^void() demon1_atta15 =[ $attacka15, demon1_run1] {ai_charge(4);};$/;" f +demon1_atta2 demon.qc /^void() demon1_atta2 =[ $attacka2, demon1_atta3 ] {ai_charge(0);};$/;" f +demon1_atta3 demon.qc /^void() demon1_atta3 =[ $attacka3, demon1_atta4 ] {ai_charge(0);};$/;" f +demon1_atta4 demon.qc /^void() demon1_atta4 =[ $attacka4, demon1_atta5 ] {ai_charge(1);};$/;" f +demon1_atta5 demon.qc /^void() demon1_atta5 =[ $attacka5, demon1_atta6 ] {ai_charge(2); Demon_Melee(200);};$/;" f +demon1_atta6 demon.qc /^void() demon1_atta6 =[ $attacka6, demon1_atta7 ] {ai_charge(1);};$/;" f +demon1_atta7 demon.qc /^void() demon1_atta7 =[ $attacka7, demon1_atta8 ] {ai_charge(6);};$/;" f +demon1_atta8 demon.qc /^void() demon1_atta8 =[ $attacka8, demon1_atta9 ] {ai_charge(8);};$/;" f +demon1_atta9 demon.qc /^void() demon1_atta9 =[ $attacka9, demon1_atta10] {ai_charge(4);};$/;" f +demon1_die1 demon.qc /^void() demon1_die1 =[ $death1, demon1_die2 ] {$/;" f +demon1_die2 demon.qc /^void() demon1_die2 =[ $death2, demon1_die3 ] {};$/;" f +demon1_die3 demon.qc /^void() demon1_die3 =[ $death3, demon1_die4 ] {};$/;" f +demon1_die4 demon.qc /^void() demon1_die4 =[ $death4, demon1_die5 ] {};$/;" f +demon1_die5 demon.qc /^void() demon1_die5 =[ $death5, demon1_die6 ] {};$/;" f +demon1_die6 demon.qc /^void() demon1_die6 =[ $death6, demon1_die7 ]$/;" f +demon1_die7 demon.qc /^void() demon1_die7 =[ $death7, demon1_die8 ] {};$/;" f +demon1_die8 demon.qc /^void() demon1_die8 =[ $death8, demon1_die9 ] {};$/;" f +demon1_die9 demon.qc /^void() demon1_die9 =[ $death9, demon1_die9 ] {};$/;" f +demon1_jump1 demon.qc /^void() demon1_jump1 =[ $leap1, demon1_jump2 ] {ai_face();};$/;" f +demon1_jump10 demon.qc /^void() demon1_jump10 =[ $leap10, demon1_jump1 ] {$/;" f +demon1_jump11 demon.qc /^void() demon1_jump11 =[ $leap11, demon1_jump12 ] {};$/;" f +demon1_jump12 demon.qc /^void() demon1_jump12 =[ $leap12, demon1_run1 ] {};$/;" f +demon1_jump2 demon.qc /^void() demon1_jump2 =[ $leap2, demon1_jump3 ] {ai_face();};$/;" f +demon1_jump3 demon.qc /^void() demon1_jump3 =[ $leap3, demon1_jump4 ] {ai_face();};$/;" f +demon1_jump4 demon.qc /^void() demon1_jump4 =[ $leap4, demon1_jump5 ]$/;" f +demon1_jump5 demon.qc /^void() demon1_jump5 =[ $leap5, demon1_jump6 ] {};$/;" f +demon1_jump6 demon.qc /^void() demon1_jump6 =[ $leap6, demon1_jump7 ] {};$/;" f +demon1_jump7 demon.qc /^void() demon1_jump7 =[ $leap7, demon1_jump8 ] {};$/;" f +demon1_jump8 demon.qc /^void() demon1_jump8 =[ $leap8, demon1_jump9 ] {};$/;" f +demon1_jump9 demon.qc /^void() demon1_jump9 =[ $leap9, demon1_jump10 ] {};$/;" f +demon1_pain demon.qc /^void(entity attacker, float damage) demon1_pain =$/;" f +demon1_pain1 demon.qc /^void() demon1_pain1 =[ $pain1, demon1_pain2 ] {};$/;" f +demon1_pain2 demon.qc /^void() demon1_pain2 =[ $pain2, demon1_pain3 ] {};$/;" f +demon1_pain3 demon.qc /^void() demon1_pain3 =[ $pain3, demon1_pain4 ] {};$/;" f +demon1_pain4 demon.qc /^void() demon1_pain4 =[ $pain4, demon1_pain5 ] {};$/;" f +demon1_pain5 demon.qc /^void() demon1_pain5 =[ $pain5, demon1_pain6 ] {};$/;" f +demon1_pain6 demon.qc /^void() demon1_pain6 =[ $pain6, demon1_run1 ] {};$/;" f +demon1_run1 demon.qc /^void() demon1_run1 =[ $run1, demon1_run2 ] {$/;" f +demon1_run2 demon.qc /^void() demon1_run2 =[ $run2, demon1_run3 ] {ai_run(15);};$/;" f +demon1_run3 demon.qc /^void() demon1_run3 =[ $run3, demon1_run4 ] {ai_run(36);};$/;" f +demon1_run4 demon.qc /^void() demon1_run4 =[ $run4, demon1_run5 ] {ai_run(20);};$/;" f +demon1_run5 demon.qc /^void() demon1_run5 =[ $run5, demon1_run6 ] {ai_run(15);};$/;" f +demon1_run6 demon.qc /^void() demon1_run6 =[ $run6, demon1_run1 ] {ai_run(36);};$/;" f +demon1_stand1 demon.qc /^void() demon1_stand1 =[ $stand1, demon1_stand2 ] {ai_stand();};$/;" f +demon1_stand10 demon.qc /^void() demon1_stand10 =[ $stand10, demon1_stand11 ] {ai_stand();};$/;" f +demon1_stand11 demon.qc /^void() demon1_stand11 =[ $stand11, demon1_stand12 ] {ai_stand();};$/;" f +demon1_stand12 demon.qc /^void() demon1_stand12 =[ $stand12, demon1_stand13 ] {ai_stand();};$/;" f +demon1_stand13 demon.qc /^void() demon1_stand13 =[ $stand13, demon1_stand1 ] {ai_stand();};$/;" f +demon1_stand2 demon.qc /^void() demon1_stand2 =[ $stand2, demon1_stand3 ] {ai_stand();};$/;" f +demon1_stand3 demon.qc /^void() demon1_stand3 =[ $stand3, demon1_stand4 ] {ai_stand();};$/;" f +demon1_stand4 demon.qc /^void() demon1_stand4 =[ $stand4, demon1_stand5 ] {ai_stand();};$/;" f +demon1_stand5 demon.qc /^void() demon1_stand5 =[ $stand5, demon1_stand6 ] {ai_stand();};$/;" f +demon1_stand6 demon.qc /^void() demon1_stand6 =[ $stand6, demon1_stand7 ] {ai_stand();};$/;" f +demon1_stand7 demon.qc /^void() demon1_stand7 =[ $stand7, demon1_stand8 ] {ai_stand();};$/;" f +demon1_stand8 demon.qc /^void() demon1_stand8 =[ $stand8, demon1_stand9 ] {ai_stand();};$/;" f +demon1_stand9 demon.qc /^void() demon1_stand9 =[ $stand9, demon1_stand10 ] {ai_stand();};$/;" f +demon1_walk1 demon.qc /^void() demon1_walk1 =[ $walk1, demon1_walk2 ] {$/;" f +demon1_walk2 demon.qc /^void() demon1_walk2 =[ $walk2, demon1_walk3 ] {ai_walk(6);};$/;" f +demon1_walk3 demon.qc /^void() demon1_walk3 =[ $walk3, demon1_walk4 ] {ai_walk(6);};$/;" f +demon1_walk4 demon.qc /^void() demon1_walk4 =[ $walk4, demon1_walk5 ] {ai_walk(7);};$/;" f +demon1_walk5 demon.qc /^void() demon1_walk5 =[ $walk5, demon1_walk6 ] {ai_walk(4);};$/;" f +demon1_walk6 demon.qc /^void() demon1_walk6 =[ $walk6, demon1_walk7 ] {ai_walk(6);};$/;" f +demon1_walk7 demon.qc /^void() demon1_walk7 =[ $walk7, demon1_walk8 ] {ai_walk(10);};$/;" f +demon1_walk8 demon.qc /^void() demon1_walk8 =[ $walk8, demon1_walk1 ] {ai_walk(10);};$/;" f +demon_die demon.qc /^void() demon_die =$/;" f +dog_atta1 dog.qc /^void() dog_atta1 =[ $attack1, dog_atta2 ] {ai_charge(10);};$/;" f +dog_atta2 dog.qc /^void() dog_atta2 =[ $attack2, dog_atta3 ] {ai_charge(10);};$/;" f +dog_atta3 dog.qc /^void() dog_atta3 =[ $attack3, dog_atta4 ] {ai_charge(10);};$/;" f +dog_atta4 dog.qc /^void() dog_atta4 =[ $attack4, dog_atta5 ] {$/;" f +dog_atta5 dog.qc /^void() dog_atta5 =[ $attack5, dog_atta6 ] {ai_charge(10);};$/;" f +dog_atta6 dog.qc /^void() dog_atta6 =[ $attack6, dog_atta7 ] {ai_charge(10);};$/;" f +dog_atta7 dog.qc /^void() dog_atta7 =[ $attack7, dog_atta8 ] {ai_charge(10);};$/;" f +dog_atta8 dog.qc /^void() dog_atta8 =[ $attack8, dog_run1 ] {ai_charge(10);};$/;" f +dog_bite dog.qc /^void() dog_bite =$/;" f +dog_die dog.qc /^void() dog_die =$/;" f +dog_die1 dog.qc /^void() dog_die1 =[ $death1, dog_die2 ] {};$/;" f +dog_die2 dog.qc /^void() dog_die2 =[ $death2, dog_die3 ] {};$/;" f +dog_die3 dog.qc /^void() dog_die3 =[ $death3, dog_die4 ] {};$/;" f +dog_die4 dog.qc /^void() dog_die4 =[ $death4, dog_die5 ] {};$/;" f +dog_die5 dog.qc /^void() dog_die5 =[ $death5, dog_die6 ] {};$/;" f +dog_die6 dog.qc /^void() dog_die6 =[ $death6, dog_die7 ] {};$/;" f +dog_die7 dog.qc /^void() dog_die7 =[ $death7, dog_die8 ] {};$/;" f +dog_die8 dog.qc /^void() dog_die8 =[ $death8, dog_die9 ] {};$/;" f +dog_die9 dog.qc /^void() dog_die9 =[ $death9, dog_die9 ] {};$/;" f +dog_dieb1 dog.qc /^void() dog_dieb1 =[ $deathb1, dog_dieb2 ] {};$/;" f +dog_dieb2 dog.qc /^void() dog_dieb2 =[ $deathb2, dog_dieb3 ] {};$/;" f +dog_dieb3 dog.qc /^void() dog_dieb3 =[ $deathb3, dog_dieb4 ] {};$/;" f +dog_dieb4 dog.qc /^void() dog_dieb4 =[ $deathb4, dog_dieb5 ] {};$/;" f +dog_dieb5 dog.qc /^void() dog_dieb5 =[ $deathb5, dog_dieb6 ] {};$/;" f +dog_dieb6 dog.qc /^void() dog_dieb6 =[ $deathb6, dog_dieb7 ] {};$/;" f +dog_dieb7 dog.qc /^void() dog_dieb7 =[ $deathb7, dog_dieb8 ] {};$/;" f +dog_dieb8 dog.qc /^void() dog_dieb8 =[ $deathb8, dog_dieb9 ] {};$/;" f +dog_dieb9 dog.qc /^void() dog_dieb9 =[ $deathb9, dog_dieb9 ] {};$/;" f +dog_leap1 dog.qc /^void() dog_leap1 =[ $leap1, dog_leap2 ] {ai_face();};$/;" f +dog_leap2 dog.qc /^void() dog_leap2 =[ $leap2, dog_leap3 ]$/;" f +dog_leap3 dog.qc /^void() dog_leap3 =[ $leap3, dog_leap4 ] {};$/;" f +dog_leap4 dog.qc /^void() dog_leap4 =[ $leap4, dog_leap5 ] {};$/;" f +dog_leap5 dog.qc /^void() dog_leap5 =[ $leap5, dog_leap6 ] {};$/;" f +dog_leap6 dog.qc /^void() dog_leap6 =[ $leap6, dog_leap7 ] {};$/;" f +dog_leap7 dog.qc /^void() dog_leap7 =[ $leap7, dog_leap8 ] {};$/;" f +dog_leap8 dog.qc /^void() dog_leap8 =[ $leap8, dog_leap9 ] {};$/;" f +dog_leap9 dog.qc /^void() dog_leap9 =[ $leap9, dog_leap9 ] {};$/;" f +dog_pain dog.qc /^void() dog_pain =$/;" f +dog_pain1 dog.qc /^void() dog_pain1 =[ $pain1 , dog_pain2 ] {};$/;" f +dog_pain2 dog.qc /^void() dog_pain2 =[ $pain2 , dog_pain3 ] {};$/;" f +dog_pain3 dog.qc /^void() dog_pain3 =[ $pain3 , dog_pain4 ] {};$/;" f +dog_pain4 dog.qc /^void() dog_pain4 =[ $pain4 , dog_pain5 ] {};$/;" f +dog_pain5 dog.qc /^void() dog_pain5 =[ $pain5 , dog_pain6 ] {};$/;" f +dog_pain6 dog.qc /^void() dog_pain6 =[ $pain6 , dog_run1 ] {};$/;" f +dog_painb1 dog.qc /^void() dog_painb1 =[ $painb1 , dog_painb2 ] {};$/;" f +dog_painb10 dog.qc /^void() dog_painb10 =[ $painb10 , dog_painb11 ] {ai_pain(10);};$/;" f +dog_painb11 dog.qc /^void() dog_painb11 =[ $painb11 , dog_painb12 ] {};$/;" f +dog_painb12 dog.qc /^void() dog_painb12 =[ $painb12 , dog_painb13 ] {};$/;" f +dog_painb13 dog.qc /^void() dog_painb13 =[ $painb13 , dog_painb14 ] {};$/;" f +dog_painb14 dog.qc /^void() dog_painb14 =[ $painb14 , dog_painb15 ] {};$/;" f +dog_painb15 dog.qc /^void() dog_painb15 =[ $painb15 , dog_painb16 ] {};$/;" f +dog_painb16 dog.qc /^void() dog_painb16 =[ $painb16 , dog_run1 ] {};$/;" f +dog_painb2 dog.qc /^void() dog_painb2 =[ $painb2 , dog_painb3 ] {};$/;" f +dog_painb3 dog.qc /^void() dog_painb3 =[ $painb3 , dog_painb4 ] {ai_pain(4);};$/;" f +dog_painb4 dog.qc /^void() dog_painb4 =[ $painb4 , dog_painb5 ] {ai_pain(12);};$/;" f +dog_painb5 dog.qc /^void() dog_painb5 =[ $painb5 , dog_painb6 ] {ai_pain(12);};$/;" f +dog_painb6 dog.qc /^void() dog_painb6 =[ $painb6 , dog_painb7 ] {ai_pain(2);};$/;" f +dog_painb7 dog.qc /^void() dog_painb7 =[ $painb7 , dog_painb8 ] {};$/;" f +dog_painb8 dog.qc /^void() dog_painb8 =[ $painb8 , dog_painb9 ] {ai_pain(4);};$/;" f +dog_painb9 dog.qc /^void() dog_painb9 =[ $painb9 , dog_painb10 ] {};$/;" f +dog_run1 dog.qc /^void() dog_run1 =[ $run1 , dog_run2 ] {$/;" f +dog_run10 dog.qc /^void() dog_run10 =[ $run10 , dog_run11 ] {ai_run(20);};$/;" f +dog_run11 dog.qc /^void() dog_run11 =[ $run11 , dog_run12 ] {ai_run(64);};$/;" f +dog_run12 dog.qc /^void() dog_run12 =[ $run12 , dog_run1 ] {ai_run(32);};$/;" f +dog_run2 dog.qc /^void() dog_run2 =[ $run2 , dog_run3 ] {ai_run(32);};$/;" f +dog_run3 dog.qc /^void() dog_run3 =[ $run3 , dog_run4 ] {ai_run(32);};$/;" f +dog_run4 dog.qc /^void() dog_run4 =[ $run4 , dog_run5 ] {ai_run(20);};$/;" f +dog_run5 dog.qc /^void() dog_run5 =[ $run5 , dog_run6 ] {ai_run(64);};$/;" f +dog_run6 dog.qc /^void() dog_run6 =[ $run6 , dog_run7 ] {ai_run(32);};$/;" f +dog_run7 dog.qc /^void() dog_run7 =[ $run7 , dog_run8 ] {ai_run(16);};$/;" f +dog_run8 dog.qc /^void() dog_run8 =[ $run8 , dog_run9 ] {ai_run(32);};$/;" f +dog_run9 dog.qc /^void() dog_run9 =[ $run9 , dog_run10 ] {ai_run(32);};$/;" f +dog_stand1 dog.qc /^void() dog_stand1 =[ $stand1, dog_stand2 ] {ai_stand();};$/;" f +dog_stand2 dog.qc /^void() dog_stand2 =[ $stand2, dog_stand3 ] {ai_stand();};$/;" f +dog_stand3 dog.qc /^void() dog_stand3 =[ $stand3, dog_stand4 ] {ai_stand();};$/;" f +dog_stand4 dog.qc /^void() dog_stand4 =[ $stand4, dog_stand5 ] {ai_stand();};$/;" f +dog_stand5 dog.qc /^void() dog_stand5 =[ $stand5, dog_stand6 ] {ai_stand();};$/;" f +dog_stand6 dog.qc /^void() dog_stand6 =[ $stand6, dog_stand7 ] {ai_stand();};$/;" f +dog_stand7 dog.qc /^void() dog_stand7 =[ $stand7, dog_stand8 ] {ai_stand();};$/;" f +dog_stand8 dog.qc /^void() dog_stand8 =[ $stand8, dog_stand9 ] {ai_stand();};$/;" f +dog_stand9 dog.qc /^void() dog_stand9 =[ $stand9, dog_stand1 ] {ai_stand();};$/;" f +dog_walk1 dog.qc /^void() dog_walk1 =[ $walk1 , dog_walk2 ] {$/;" f +dog_walk2 dog.qc /^void() dog_walk2 =[ $walk2 , dog_walk3 ] {ai_walk(8);};$/;" f +dog_walk3 dog.qc /^void() dog_walk3 =[ $walk3 , dog_walk4 ] {ai_walk(8);};$/;" f +dog_walk4 dog.qc /^void() dog_walk4 =[ $walk4 , dog_walk5 ] {ai_walk(8);};$/;" f +dog_walk5 dog.qc /^void() dog_walk5 =[ $walk5 , dog_walk6 ] {ai_walk(8);};$/;" f +dog_walk6 dog.qc /^void() dog_walk6 =[ $walk6 , dog_walk7 ] {ai_walk(8);};$/;" f +dog_walk7 dog.qc /^void() dog_walk7 =[ $walk7 , dog_walk8 ] {ai_walk(8);};$/;" f +dog_walk8 dog.qc /^void() dog_walk8 =[ $walk8 , dog_walk1 ] {ai_walk(8);};$/;" f +door_blocked doors.qc /^void() door_blocked =$/;" f +door_fire doors.qc /^void() door_fire =$/;" f +door_go_down doors.qc /^void() door_go_down =$/;" f +door_go_up doors.qc /^void() door_go_up =$/;" f +door_hit_bottom doors.qc /^void() door_hit_bottom =$/;" f +door_hit_top doors.qc /^void() door_hit_top =$/;" f +door_killed doors.qc /^void() door_killed =$/;" f +door_touch doors.qc /^void() door_touch =$/;" f +door_trigger_touch doors.qc /^void() door_trigger_touch =$/;" f +door_use doors.qc /^void() door_use =$/;" f +dprint defs.qc /^void(string s) dprint = #25;$/;" f +droptofloor defs.qc /^float() droptofloor= #34; \/\/ TRUE if landed on floor$/;" f +enf_atk1 enforcer.qc /^void() enf_atk1 =[ $attack1, enf_atk2 ] {ai_face();};$/;" f +enf_atk10 enforcer.qc /^void() enf_atk10 =[ $attack6, enf_atk11 ] {enforcer_fire();};$/;" f +enf_atk11 enforcer.qc /^void() enf_atk11 =[ $attack7, enf_atk12 ] {ai_face();};$/;" f +enf_atk12 enforcer.qc /^void() enf_atk12 =[ $attack8, enf_atk13 ] {ai_face();};$/;" f +enf_atk13 enforcer.qc /^void() enf_atk13 =[ $attack9, enf_atk14 ] {ai_face();};$/;" f +enf_atk14 enforcer.qc /^void() enf_atk14 =[ $attack10, enf_run1 ] {ai_face();$/;" f +enf_atk2 enforcer.qc /^void() enf_atk2 =[ $attack2, enf_atk3 ] {ai_face();};$/;" f +enf_atk3 enforcer.qc /^void() enf_atk3 =[ $attack3, enf_atk4 ] {ai_face();};$/;" f +enf_atk4 enforcer.qc /^void() enf_atk4 =[ $attack4, enf_atk5 ] {ai_face();};$/;" f +enf_atk5 enforcer.qc /^void() enf_atk5 =[ $attack5, enf_atk6 ] {ai_face();};$/;" f +enf_atk6 enforcer.qc /^void() enf_atk6 =[ $attack6, enf_atk7 ] {enforcer_fire();};$/;" f +enf_atk7 enforcer.qc /^void() enf_atk7 =[ $attack7, enf_atk8 ] {ai_face();};$/;" f +enf_atk8 enforcer.qc /^void() enf_atk8 =[ $attack8, enf_atk9 ] {ai_face();};$/;" f +enf_atk9 enforcer.qc /^void() enf_atk9 =[ $attack5, enf_atk10 ] {ai_face();};$/;" f +enf_die enforcer.qc /^void() enf_die =$/;" f +enf_die1 enforcer.qc /^void() enf_die1 =[ $death1, enf_die2 ] {};$/;" f +enf_die10 enforcer.qc /^void() enf_die10 =[ $death10, enf_die11 ] {ai_forward(5);};$/;" f +enf_die11 enforcer.qc /^void() enf_die11 =[ $death11, enf_die12 ] {ai_forward(5);};$/;" f +enf_die12 enforcer.qc /^void() enf_die12 =[ $death12, enf_die13 ] {ai_forward(5);};$/;" f +enf_die13 enforcer.qc /^void() enf_die13 =[ $death13, enf_die14 ] {};$/;" f +enf_die14 enforcer.qc /^void() enf_die14 =[ $death14, enf_die14 ] {};$/;" f +enf_die2 enforcer.qc /^void() enf_die2 =[ $death2, enf_die3 ] {};$/;" f +enf_die3 enforcer.qc /^void() enf_die3 =[ $death3, enf_die4 ]$/;" f +enf_die4 enforcer.qc /^void() enf_die4 =[ $death4, enf_die5 ] {ai_forward(14);};$/;" f +enf_die5 enforcer.qc /^void() enf_die5 =[ $death5, enf_die6 ] {ai_forward(2);};$/;" f +enf_die6 enforcer.qc /^void() enf_die6 =[ $death6, enf_die7 ] {};$/;" f +enf_die7 enforcer.qc /^void() enf_die7 =[ $death7, enf_die8 ] {};$/;" f +enf_die8 enforcer.qc /^void() enf_die8 =[ $death8, enf_die9 ] {};$/;" f +enf_die9 enforcer.qc /^void() enf_die9 =[ $death9, enf_die10 ] {ai_forward(3);};$/;" f +enf_fdie1 enforcer.qc /^void() enf_fdie1 =[ $fdeath1, enf_fdie2 ] {$/;" f +enf_fdie10 enforcer.qc /^void() enf_fdie10 =[ $fdeath10, enf_fdie11 ] {};$/;" f +enf_fdie11 enforcer.qc /^void() enf_fdie11 =[ $fdeath11, enf_fdie11 ] {};$/;" f +enf_fdie2 enforcer.qc /^void() enf_fdie2 =[ $fdeath2, enf_fdie3 ] {};$/;" f +enf_fdie3 enforcer.qc /^void() enf_fdie3 =[ $fdeath3, enf_fdie4 ] $/;" f +enf_fdie4 enforcer.qc /^void() enf_fdie4 =[ $fdeath4, enf_fdie5 ] {};$/;" f +enf_fdie5 enforcer.qc /^void() enf_fdie5 =[ $fdeath5, enf_fdie6 ] {};$/;" f +enf_fdie6 enforcer.qc /^void() enf_fdie6 =[ $fdeath6, enf_fdie7 ] {};$/;" f +enf_fdie7 enforcer.qc /^void() enf_fdie7 =[ $fdeath7, enf_fdie8 ] {};$/;" f +enf_fdie8 enforcer.qc /^void() enf_fdie8 =[ $fdeath8, enf_fdie9 ] {};$/;" f +enf_fdie9 enforcer.qc /^void() enf_fdie9 =[ $fdeath9, enf_fdie10 ] {};$/;" f +enf_pain enforcer.qc /^void(entity attacker, float damage) enf_pain =$/;" f +enf_paina1 enforcer.qc /^void() enf_paina1 =[ $paina1, enf_paina2 ] {};$/;" f +enf_paina2 enforcer.qc /^void() enf_paina2 =[ $paina2, enf_paina3 ] {};$/;" f +enf_paina3 enforcer.qc /^void() enf_paina3 =[ $paina3, enf_paina4 ] {};$/;" f +enf_paina4 enforcer.qc /^void() enf_paina4 =[ $paina4, enf_run1 ] {};$/;" f +enf_painb1 enforcer.qc /^void() enf_painb1 =[ $painb1, enf_painb2 ] {};$/;" f +enf_painb2 enforcer.qc /^void() enf_painb2 =[ $painb2, enf_painb3 ] {};$/;" f +enf_painb3 enforcer.qc /^void() enf_painb3 =[ $painb3, enf_painb4 ] {};$/;" f +enf_painb4 enforcer.qc /^void() enf_painb4 =[ $painb4, enf_painb5 ] {};$/;" f +enf_painb5 enforcer.qc /^void() enf_painb5 =[ $painb5, enf_run1 ] {};$/;" f +enf_painc1 enforcer.qc /^void() enf_painc1 =[ $painc1, enf_painc2 ] {};$/;" f +enf_painc2 enforcer.qc /^void() enf_painc2 =[ $painc2, enf_painc3 ] {};$/;" f +enf_painc3 enforcer.qc /^void() enf_painc3 =[ $painc3, enf_painc4 ] {};$/;" f +enf_painc4 enforcer.qc /^void() enf_painc4 =[ $painc4, enf_painc5 ] {};$/;" f +enf_painc5 enforcer.qc /^void() enf_painc5 =[ $painc5, enf_painc6 ] {};$/;" f +enf_painc6 enforcer.qc /^void() enf_painc6 =[ $painc6, enf_painc7 ] {};$/;" f +enf_painc7 enforcer.qc /^void() enf_painc7 =[ $painc7, enf_painc8 ] {};$/;" f +enf_painc8 enforcer.qc /^void() enf_painc8 =[ $painc8, enf_run1 ] {};$/;" f +enf_paind1 enforcer.qc /^void() enf_paind1 =[ $paind1, enf_paind2 ] {};$/;" f +enf_paind10 enforcer.qc /^void() enf_paind10 =[ $paind10, enf_paind11 ] {};$/;" f +enf_paind11 enforcer.qc /^void() enf_paind11 =[ $paind11, enf_paind12 ] {ai_painforward(1);};$/;" f +enf_paind12 enforcer.qc /^void() enf_paind12 =[ $paind12, enf_paind13 ] {ai_painforward(1);};$/;" f +enf_paind13 enforcer.qc /^void() enf_paind13 =[ $paind13, enf_paind14 ] {ai_painforward(1);};$/;" f +enf_paind14 enforcer.qc /^void() enf_paind14 =[ $paind14, enf_paind15 ] {};$/;" f +enf_paind15 enforcer.qc /^void() enf_paind15 =[ $paind15, enf_paind16 ] {};$/;" f +enf_paind16 enforcer.qc /^void() enf_paind16 =[ $paind16, enf_paind17 ] {ai_pain(1);};$/;" f +enf_paind17 enforcer.qc /^void() enf_paind17 =[ $paind17, enf_paind18 ] {ai_pain(1);};$/;" f +enf_paind18 enforcer.qc /^void() enf_paind18 =[ $paind18, enf_paind19 ] {};$/;" f +enf_paind19 enforcer.qc /^void() enf_paind19 =[ $paind19, enf_run1 ] {};$/;" f +enf_paind2 enforcer.qc /^void() enf_paind2 =[ $paind2, enf_paind3 ] {};$/;" f +enf_paind3 enforcer.qc /^void() enf_paind3 =[ $paind3, enf_paind4 ] {};$/;" f +enf_paind4 enforcer.qc /^void() enf_paind4 =[ $paind4, enf_paind5 ] {ai_painforward(2);};$/;" f +enf_paind5 enforcer.qc /^void() enf_paind5 =[ $paind5, enf_paind6 ] {ai_painforward(1);};$/;" f +enf_paind6 enforcer.qc /^void() enf_paind6 =[ $paind6, enf_paind7 ] {};$/;" f +enf_paind7 enforcer.qc /^void() enf_paind7 =[ $paind7, enf_paind8 ] {};$/;" f +enf_paind8 enforcer.qc /^void() enf_paind8 =[ $paind8, enf_paind9 ] {};$/;" f +enf_paind9 enforcer.qc /^void() enf_paind9 =[ $paind9, enf_paind10 ] {};$/;" f +enf_run1 enforcer.qc /^void() enf_run1 =[ $run1 , enf_run2 ] {$/;" f +enf_run2 enforcer.qc /^void() enf_run2 =[ $run2 , enf_run3 ] {ai_run(14);};$/;" f +enf_run3 enforcer.qc /^void() enf_run3 =[ $run3 , enf_run4 ] {ai_run(7);};$/;" f +enf_run4 enforcer.qc /^void() enf_run4 =[ $run4 , enf_run5 ] {ai_run(12);};$/;" f +enf_run5 enforcer.qc /^void() enf_run5 =[ $run5 , enf_run6 ] {ai_run(14);};$/;" f +enf_run6 enforcer.qc /^void() enf_run6 =[ $run6 , enf_run7 ] {ai_run(14);};$/;" f +enf_run7 enforcer.qc /^void() enf_run7 =[ $run7 , enf_run8 ] {ai_run(7);};$/;" f +enf_run8 enforcer.qc /^void() enf_run8 =[ $run8 , enf_run1 ] {ai_run(11);};$/;" f +enf_stand1 enforcer.qc /^void() enf_stand1 =[ $stand1, enf_stand2 ] {ai_stand();};$/;" f +enf_stand2 enforcer.qc /^void() enf_stand2 =[ $stand2, enf_stand3 ] {ai_stand();};$/;" f +enf_stand3 enforcer.qc /^void() enf_stand3 =[ $stand3, enf_stand4 ] {ai_stand();};$/;" f +enf_stand4 enforcer.qc /^void() enf_stand4 =[ $stand4, enf_stand5 ] {ai_stand();};$/;" f +enf_stand5 enforcer.qc /^void() enf_stand5 =[ $stand5, enf_stand6 ] {ai_stand();};$/;" f +enf_stand6 enforcer.qc /^void() enf_stand6 =[ $stand6, enf_stand7 ] {ai_stand();};$/;" f +enf_stand7 enforcer.qc /^void() enf_stand7 =[ $stand7, enf_stand1 ] {ai_stand();};$/;" f +enf_walk1 enforcer.qc /^void() enf_walk1 =[ $walk1 , enf_walk2 ] {$/;" f +enf_walk10 enforcer.qc /^void() enf_walk10 =[ $walk10, enf_walk11 ] {ai_walk(4);};$/;" f +enf_walk11 enforcer.qc /^void() enf_walk11 =[ $walk11, enf_walk12 ] {ai_walk(4);};$/;" f +enf_walk12 enforcer.qc /^void() enf_walk12 =[ $walk12, enf_walk13 ] {ai_walk(1);};$/;" f +enf_walk13 enforcer.qc /^void() enf_walk13 =[ $walk13, enf_walk14 ] {ai_walk(2);};$/;" f +enf_walk14 enforcer.qc /^void() enf_walk14 =[ $walk14, enf_walk15 ] {ai_walk(3);};$/;" f +enf_walk15 enforcer.qc /^void() enf_walk15 =[ $walk15, enf_walk16 ] {ai_walk(4);};$/;" f +enf_walk16 enforcer.qc /^void() enf_walk16 =[ $walk16, enf_walk1 ] {ai_walk(2);};$/;" f +enf_walk2 enforcer.qc /^void() enf_walk2 =[ $walk2 , enf_walk3 ] {ai_walk(4);};$/;" f +enf_walk3 enforcer.qc /^void() enf_walk3 =[ $walk3 , enf_walk4 ] {ai_walk(4);};$/;" f +enf_walk4 enforcer.qc /^void() enf_walk4 =[ $walk4 , enf_walk5 ] {ai_walk(3);};$/;" f +enf_walk5 enforcer.qc /^void() enf_walk5 =[ $walk5 , enf_walk6 ] {ai_walk(1);};$/;" f +enf_walk6 enforcer.qc /^void() enf_walk6 =[ $walk6 , enf_walk7 ] {ai_walk(2);};$/;" f +enf_walk7 enforcer.qc /^void() enf_walk7 =[ $walk7 , enf_walk8 ] {ai_walk(2);};$/;" f +enf_walk8 enforcer.qc /^void() enf_walk8 =[ $walk8 , enf_walk9 ] {ai_walk(1);};$/;" f +enf_walk9 enforcer.qc /^void() enf_walk9 =[ $walk9 , enf_walk10 ] {ai_walk(2);};$/;" f +enforcer_fire enforcer.qc /^void() enforcer_fire =$/;" f +eprint defs.qc /^void(entity e) eprint = #31; \/\/ prints an entire edict$/;" f +error defs.qc /^void(string e) error = #10;$/;" f +event_lightning boss.qc /^void() event_lightning =$/;" f +execute_changelevel client.qc /^void() execute_changelevel =$/;" f +f_attack1 fish.qc /^void() f_attack1 =[ $attack1, f_attack2 ] {ai_charge(10);};$/;" f +f_attack10 fish.qc /^void() f_attack10 =[ $attack10, f_attack11] {ai_charge(10);};$/;" f +f_attack11 fish.qc /^void() f_attack11 =[ $attack11, f_attack12] {ai_charge(10);};$/;" f +f_attack12 fish.qc /^void() f_attack12 =[ $attack12, f_attack13] {ai_charge(10);};$/;" f +f_attack13 fish.qc /^void() f_attack13 =[ $attack13, f_attack14] {ai_charge(10);};$/;" f +f_attack14 fish.qc /^void() f_attack14 =[ $attack14, f_attack15] {ai_charge(10);};$/;" f +f_attack15 fish.qc /^void() f_attack15 =[ $attack15, f_attack16] {fish_melee();};$/;" f +f_attack16 fish.qc /^void() f_attack16 =[ $attack16, f_attack17] {ai_charge(10);};$/;" f +f_attack17 fish.qc /^void() f_attack17 =[ $attack17, f_attack18] {ai_charge(10);};$/;" f +f_attack18 fish.qc /^void() f_attack18 =[ $attack18, f_run1 ] {ai_charge(10);};$/;" f +f_attack2 fish.qc /^void() f_attack2 =[ $attack2, f_attack3 ] {ai_charge(10);};$/;" f +f_attack3 fish.qc /^void() f_attack3 =[ $attack3, f_attack4 ] {fish_melee();};$/;" f +f_attack4 fish.qc /^void() f_attack4 =[ $attack4, f_attack5 ] {ai_charge(10);};$/;" f +f_attack5 fish.qc /^void() f_attack5 =[ $attack5, f_attack6 ] {ai_charge(10);};$/;" f +f_attack6 fish.qc /^void() f_attack6 =[ $attack6, f_attack7 ] {ai_charge(10);};$/;" f +f_attack7 fish.qc /^void() f_attack7 =[ $attack7, f_attack8 ] {ai_charge(10);};$/;" f +f_attack8 fish.qc /^void() f_attack8 =[ $attack8, f_attack9 ] {ai_charge(10);};$/;" f +f_attack9 fish.qc /^void() f_attack9 =[ $attack9, f_attack10] {fish_melee();};$/;" f +f_death1 fish.qc /^void() f_death1 =[ $death1, f_death2 ] {$/;" f +f_death10 fish.qc /^void() f_death10 =[ $death10, f_death11 ] {};$/;" f +f_death11 fish.qc /^void() f_death11 =[ $death11, f_death12 ] {};$/;" f +f_death12 fish.qc /^void() f_death12 =[ $death12, f_death13 ] {};$/;" f +f_death13 fish.qc /^void() f_death13 =[ $death13, f_death14 ] {};$/;" f +f_death14 fish.qc /^void() f_death14 =[ $death14, f_death15 ] {};$/;" f +f_death15 fish.qc /^void() f_death15 =[ $death15, f_death16 ] {};$/;" f +f_death16 fish.qc /^void() f_death16 =[ $death16, f_death17 ] {};$/;" f +f_death17 fish.qc /^void() f_death17 =[ $death17, f_death18 ] {};$/;" f +f_death18 fish.qc /^void() f_death18 =[ $death18, f_death19 ] {};$/;" f +f_death19 fish.qc /^void() f_death19 =[ $death19, f_death20 ] {};$/;" f +f_death2 fish.qc /^void() f_death2 =[ $death2, f_death3 ] {};$/;" f +f_death20 fish.qc /^void() f_death20 =[ $death20, f_death21 ] {};$/;" f +f_death21 fish.qc /^void() f_death21 =[ $death21, f_death21 ] {self.solid = SOLID_NOT;};$/;" f +f_death3 fish.qc /^void() f_death3 =[ $death3, f_death4 ] {};$/;" f +f_death4 fish.qc /^void() f_death4 =[ $death4, f_death5 ] {};$/;" f +f_death5 fish.qc /^void() f_death5 =[ $death5, f_death6 ] {};$/;" f +f_death6 fish.qc /^void() f_death6 =[ $death6, f_death7 ] {};$/;" f +f_death7 fish.qc /^void() f_death7 =[ $death7, f_death8 ] {};$/;" f +f_death8 fish.qc /^void() f_death8 =[ $death8, f_death9 ] {};$/;" f +f_death9 fish.qc /^void() f_death9 =[ $death9, f_death10 ] {};$/;" f +f_pain1 fish.qc /^void() f_pain1 =[ $pain1, f_pain2 ] {};$/;" f +f_pain2 fish.qc /^void() f_pain2 =[ $pain2, f_pain3 ] {ai_pain(6);};$/;" f +f_pain3 fish.qc /^void() f_pain3 =[ $pain3, f_pain4 ] {ai_pain(6);};$/;" f +f_pain4 fish.qc /^void() f_pain4 =[ $pain4, f_pain5 ] {ai_pain(6);};$/;" f +f_pain5 fish.qc /^void() f_pain5 =[ $pain5, f_pain6 ] {ai_pain(6);};$/;" f +f_pain6 fish.qc /^void() f_pain6 =[ $pain6, f_pain7 ] {ai_pain(6);};$/;" f +f_pain7 fish.qc /^void() f_pain7 =[ $pain7, f_pain8 ] {ai_pain(6);};$/;" f +f_pain8 fish.qc /^void() f_pain8 =[ $pain8, f_pain9 ] {ai_pain(6);};$/;" f +f_pain9 fish.qc /^void() f_pain9 =[ $pain9, f_run1 ] {ai_pain(6);};$/;" f +f_run1 fish.qc /^void() f_run1 =[ $swim1, f_run2 ] {ai_run(12);$/;" f +f_run2 fish.qc /^void() f_run2 =[ $swim3, f_run3 ] {ai_run(12);};$/;" f +f_run3 fish.qc /^void() f_run3 =[ $swim5, f_run4 ] {ai_run(12);};$/;" f +f_run4 fish.qc /^void() f_run4 =[ $swim7, f_run5 ] {ai_run(12);};$/;" f +f_run5 fish.qc /^void() f_run5 =[ $swim9, f_run6 ] {ai_run(12);};$/;" f +f_run6 fish.qc /^void() f_run6 =[ $swim11, f_run7 ] {ai_run(12);};$/;" f +f_run7 fish.qc /^void() f_run7 =[ $swim13, f_run8 ] {ai_run(12);};$/;" f +f_run8 fish.qc /^void() f_run8 =[ $swim15, f_run9 ] {ai_run(12);};$/;" f +f_run9 fish.qc /^void() f_run9 =[ $swim17, f_run1 ] {ai_run(12);};$/;" f +f_stand1 fish.qc /^void() f_stand1 =[ $swim1, f_stand2 ] {ai_stand();};$/;" f +f_stand10 fish.qc /^void() f_stand10 =[ $swim10, f_stand11 ] {ai_stand();};$/;" f +f_stand11 fish.qc /^void() f_stand11 =[ $swim11, f_stand12 ] {ai_stand();};$/;" f +f_stand12 fish.qc /^void() f_stand12 =[ $swim12, f_stand13 ] {ai_stand();};$/;" f +f_stand13 fish.qc /^void() f_stand13 =[ $swim13, f_stand14 ] {ai_stand();};$/;" f +f_stand14 fish.qc /^void() f_stand14 =[ $swim14, f_stand15 ] {ai_stand();};$/;" f +f_stand15 fish.qc /^void() f_stand15 =[ $swim15, f_stand16 ] {ai_stand();};$/;" f +f_stand16 fish.qc /^void() f_stand16 =[ $swim16, f_stand17 ] {ai_stand();};$/;" f +f_stand17 fish.qc /^void() f_stand17 =[ $swim17, f_stand18 ] {ai_stand();};$/;" f +f_stand18 fish.qc /^void() f_stand18 =[ $swim18, f_stand1 ] {ai_stand();};$/;" f +f_stand2 fish.qc /^void() f_stand2 =[ $swim2, f_stand3 ] {ai_stand();};$/;" f +f_stand3 fish.qc /^void() f_stand3 =[ $swim3, f_stand4 ] {ai_stand();};$/;" f +f_stand4 fish.qc /^void() f_stand4 =[ $swim4, f_stand5 ] {ai_stand();};$/;" f +f_stand5 fish.qc /^void() f_stand5 =[ $swim5, f_stand6 ] {ai_stand();};$/;" f +f_stand6 fish.qc /^void() f_stand6 =[ $swim6, f_stand7 ] {ai_stand();};$/;" f +f_stand7 fish.qc /^void() f_stand7 =[ $swim7, f_stand8 ] {ai_stand();};$/;" f +f_stand8 fish.qc /^void() f_stand8 =[ $swim8, f_stand9 ] {ai_stand();};$/;" f +f_stand9 fish.qc /^void() f_stand9 =[ $swim9, f_stand10 ] {ai_stand();};$/;" f +f_walk1 fish.qc /^void() f_walk1 =[ $swim1, f_walk2 ] {ai_walk(8);};$/;" f +f_walk10 fish.qc /^void() f_walk10 =[ $swim10, f_walk11 ] {ai_walk(8);};$/;" f +f_walk11 fish.qc /^void() f_walk11 =[ $swim11, f_walk12 ] {ai_walk(8);};$/;" f +f_walk12 fish.qc /^void() f_walk12 =[ $swim12, f_walk13 ] {ai_walk(8);};$/;" f +f_walk13 fish.qc /^void() f_walk13 =[ $swim13, f_walk14 ] {ai_walk(8);};$/;" f +f_walk14 fish.qc /^void() f_walk14 =[ $swim14, f_walk15 ] {ai_walk(8);};$/;" f +f_walk15 fish.qc /^void() f_walk15 =[ $swim15, f_walk16 ] {ai_walk(8);};$/;" f +f_walk16 fish.qc /^void() f_walk16 =[ $swim16, f_walk17 ] {ai_walk(8);};$/;" f +f_walk17 fish.qc /^void() f_walk17 =[ $swim17, f_walk18 ] {ai_walk(8);};$/;" f +f_walk18 fish.qc /^void() f_walk18 =[ $swim18, f_walk1 ] {ai_walk(8);};$/;" f +f_walk2 fish.qc /^void() f_walk2 =[ $swim2, f_walk3 ] {ai_walk(8);};$/;" f +f_walk3 fish.qc /^void() f_walk3 =[ $swim3, f_walk4 ] {ai_walk(8);};$/;" f +f_walk4 fish.qc /^void() f_walk4 =[ $swim4, f_walk5 ] {ai_walk(8);};$/;" f +f_walk5 fish.qc /^void() f_walk5 =[ $swim5, f_walk6 ] {ai_walk(8);};$/;" f +f_walk6 fish.qc /^void() f_walk6 =[ $swim6, f_walk7 ] {ai_walk(8);};$/;" f +f_walk7 fish.qc /^void() f_walk7 =[ $swim7, f_walk8 ] {ai_walk(8);};$/;" f +f_walk8 fish.qc /^void() f_walk8 =[ $swim8, f_walk9 ] {ai_walk(8);};$/;" f +f_walk9 fish.qc /^void() f_walk9 =[ $swim9, f_walk10 ] {ai_walk(8);};$/;" f +fabs defs.qc /^float(float f) fabs = #43;$/;" f +fd_secret_done doors.qc /^void () fd_secret_done =$/;" f +fd_secret_move1 doors.qc /^void () fd_secret_move1 = $/;" f +fd_secret_move2 doors.qc /^void () fd_secret_move2 =$/;" f +fd_secret_move3 doors.qc /^void () fd_secret_move3 =$/;" f +fd_secret_move4 doors.qc /^void () fd_secret_move4 =$/;" f +fd_secret_move5 doors.qc /^void () fd_secret_move5 = $/;" f +fd_secret_move6 doors.qc /^void () fd_secret_move6 =$/;" f +fd_secret_use doors.qc /^void () fd_secret_use =$/;" f +finale_1 oldone.qc /^void() finale_1 =$/;" f +finale_2 oldone.qc /^void() finale_2 =$/;" f +finale_3 oldone.qc /^void() finale_3 =$/;" f +finale_4 oldone.qc /^void() finale_4 =$/;" f +find defs.qc /^entity(entity start, .string fld, string match) find = #18;$/;" f +findradius defs.qc /^entity(vector org, float rad) findradius = #22;$/;" f +fire_fly misc.qc /^void() fire_fly =$/;" f +fire_touch misc.qc /^void() fire_touch =$/;" f +fish_melee fish.qc /^void() fish_melee =$/;" f +fish_pain fish.qc /^void(entity attacker, float damage) fish_pain =$/;" f +floor defs.qc /^float(float v) floor = #37; \/\/ largest integer <= v$/;" f +flymonster_start monsters.qc /^void() flymonster_start =$/;" f +flymonster_start_go monsters.qc /^void() flymonster_start_go =$/;" f +ftos defs.qc /^string(float f) ftos = #26;$/;" f +func_assbuton asstech.qc /^void() func_assbuton = {};$/;" f +func_assvent asstech.qc /^void() func_assvent = {};$/;" f +func_bossgate misc.qc /^void() func_bossgate =$/;" f +func_button buttons.qc /^void() func_button =$/;" f +func_counter asstech.qc /^void() func_counter =$/;" f +func_door doors.qc /^void() func_door =$/;" f +func_door_secret doors.qc /^void () func_door_secret =$/;" f +func_episodegate misc.qc /^void() func_episodegate =$/;" f +func_illusionary misc.qc /^void() func_illusionary =$/;" f +func_particlefield asstech.qc /^void() func_particlefield =$/;" f +func_particlefield grid.qc /^void() func_particlefield =$/;" f +func_plat plats.qc /^void() func_plat =$/;" f +func_togglewall grid.qc /^void() func_togglewall =$/;" f +func_train plats.qc /^void() func_train =$/;" f +func_train_find plats.qc /^void() func_train_find =$/;" f +func_wall misc.qc /^void() func_wall =$/;" f +func_wall_use misc.qc /^void() func_wall_use =$/;" f +gravitygrill_touch asstech.qc /^void() gravitygrill_touch =$/;" f +grill_touch asstech.qc /^void() grill_touch =$/;" f +hardlight_touch asstech.qc /^void() hardlight_touch =$/;" f +hardlight_use asstech.qc /^void() hardlight_use =$/;" f +health_touch items.qc /^void() health_touch =$/;" f +hk_idle_sound hknight.qc /^void() hk_idle_sound =$/;" f +hknight_char_a1 hknight.qc /^void() hknight_char_a1 =[ $char_a1, hknight_char_a2 ] {ai_charge(20);};$/;" f +hknight_char_a10 hknight.qc /^void() hknight_char_a10=[ $char_a10, hknight_char_a11 ] {ai_charge(20); ai_melee();};$/;" f +hknight_char_a11 hknight.qc /^void() hknight_char_a11=[ $char_a11, hknight_char_a12 ] {ai_charge(18); ai_melee();};$/;" f +hknight_char_a12 hknight.qc /^void() hknight_char_a12=[ $char_a12, hknight_char_a13 ] {ai_charge(16);};$/;" f +hknight_char_a13 hknight.qc /^void() hknight_char_a13=[ $char_a13, hknight_char_a14 ] {ai_charge(14);};$/;" f +hknight_char_a14 hknight.qc /^void() hknight_char_a14=[ $char_a14, hknight_char_a15 ] {ai_charge(25);};$/;" f +hknight_char_a15 hknight.qc /^void() hknight_char_a15=[ $char_a15, hknight_char_a16 ] {ai_charge(21);};$/;" f +hknight_char_a16 hknight.qc /^void() hknight_char_a16=[ $char_a16, hknight_run1 ] {ai_charge(13);};$/;" f +hknight_char_a2 hknight.qc /^void() hknight_char_a2 =[ $char_a2, hknight_char_a3 ] {ai_charge(25);};$/;" f +hknight_char_a3 hknight.qc /^void() hknight_char_a3 =[ $char_a3, hknight_char_a4 ] {ai_charge(18);};$/;" f +hknight_char_a4 hknight.qc /^void() hknight_char_a4 =[ $char_a4, hknight_char_a5 ] {ai_charge(16);};$/;" f +hknight_char_a5 hknight.qc /^void() hknight_char_a5 =[ $char_a5, hknight_char_a6 ] {ai_charge(14);};$/;" f +hknight_char_a6 hknight.qc /^void() hknight_char_a6 =[ $char_a6, hknight_char_a7 ] {ai_charge(20); ai_melee();};$/;" f +hknight_char_a7 hknight.qc /^void() hknight_char_a7 =[ $char_a7, hknight_char_a8 ] {ai_charge(21); ai_melee();};$/;" f +hknight_char_a8 hknight.qc /^void() hknight_char_a8 =[ $char_a8, hknight_char_a9 ] {ai_charge(13); ai_melee();};$/;" f +hknight_char_a9 hknight.qc /^void() hknight_char_a9 =[ $char_a9, hknight_char_a10 ] {ai_charge(20); ai_melee();};$/;" f +hknight_char_b1 hknight.qc /^void() hknight_char_b1 =[ $char_b1, hknight_char_b2 ]$/;" f +hknight_char_b2 hknight.qc /^void() hknight_char_b2 =[ $char_b2, hknight_char_b3 ] {ai_charge(17); ai_melee();};$/;" f +hknight_char_b3 hknight.qc /^void() hknight_char_b3 =[ $char_b3, hknight_char_b4 ] {ai_charge(12); ai_melee();};$/;" f +hknight_char_b4 hknight.qc /^void() hknight_char_b4 =[ $char_b4, hknight_char_b5 ] {ai_charge(22); ai_melee();};$/;" f +hknight_char_b5 hknight.qc /^void() hknight_char_b5 =[ $char_b5, hknight_char_b6 ] {ai_charge(18); ai_melee();};$/;" f +hknight_char_b6 hknight.qc /^void() hknight_char_b6 =[ $char_b6, hknight_char_b1 ] {ai_charge(8); ai_melee();};$/;" f +hknight_die hknight.qc /^void() hknight_die =$/;" f +hknight_die1 hknight.qc /^void() hknight_die1 =[ $death1, hknight_die2 ] {ai_forward(10);};$/;" f +hknight_die10 hknight.qc /^void() hknight_die10 =[ $death10, hknight_die11 ] {};$/;" f +hknight_die11 hknight.qc /^void() hknight_die11 =[ $death11, hknight_die12 ] {};$/;" f +hknight_die12 hknight.qc /^void() hknight_die12 =[ $death12, hknight_die12 ] {};$/;" f +hknight_die2 hknight.qc /^void() hknight_die2 =[ $death2, hknight_die3 ] {ai_forward(8);};$/;" f +hknight_die3 hknight.qc /^void() hknight_die3 =[ $death3, hknight_die4 ]$/;" f +hknight_die4 hknight.qc /^void() hknight_die4 =[ $death4, hknight_die5 ] {};$/;" f +hknight_die5 hknight.qc /^void() hknight_die5 =[ $death5, hknight_die6 ] {};$/;" f +hknight_die6 hknight.qc /^void() hknight_die6 =[ $death6, hknight_die7 ] {};$/;" f +hknight_die7 hknight.qc /^void() hknight_die7 =[ $death7, hknight_die8 ] {};$/;" f +hknight_die8 hknight.qc /^void() hknight_die8 =[ $death8, hknight_die9 ] {ai_forward(10);};$/;" f +hknight_die9 hknight.qc /^void() hknight_die9 =[ $death9, hknight_die10 ] {ai_forward(11);};$/;" f +hknight_dieb1 hknight.qc /^void() hknight_dieb1 =[ $deathb1, hknight_dieb2 ] {};$/;" f +hknight_dieb2 hknight.qc /^void() hknight_dieb2 =[ $deathb2, hknight_dieb3 ] {};$/;" f +hknight_dieb3 hknight.qc /^void() hknight_dieb3 =[ $deathb3, hknight_dieb4 ]$/;" f +hknight_dieb4 hknight.qc /^void() hknight_dieb4 =[ $deathb4, hknight_dieb5 ] {};$/;" f +hknight_dieb5 hknight.qc /^void() hknight_dieb5 =[ $deathb5, hknight_dieb6 ] {};$/;" f +hknight_dieb6 hknight.qc /^void() hknight_dieb6 =[ $deathb6, hknight_dieb7 ] {};$/;" f +hknight_dieb7 hknight.qc /^void() hknight_dieb7 =[ $deathb7, hknight_dieb8 ] {};$/;" f +hknight_dieb8 hknight.qc /^void() hknight_dieb8 =[ $deathb8, hknight_dieb9 ] {};$/;" f +hknight_dieb9 hknight.qc /^void() hknight_dieb9 =[ $deathb9, hknight_dieb9 ] {};$/;" f +hknight_magica1 hknight.qc /^void() hknight_magica1 =[ $magica1, hknight_magica2 ] {ai_face();};$/;" f +hknight_magica10 hknight.qc /^void() hknight_magica10 =[ $magica10, hknight_magica11] {hknight_shot(1);};$/;" f +hknight_magica11 hknight.qc /^void() hknight_magica11 =[ $magica11, hknight_magica12] {hknight_shot(2);};$/;" f +hknight_magica12 hknight.qc /^void() hknight_magica12 =[ $magica12, hknight_magica13] {hknight_shot(3);};$/;" f +hknight_magica13 hknight.qc /^void() hknight_magica13 =[ $magica13, hknight_magica14] {ai_face();};$/;" f +hknight_magica14 hknight.qc /^void() hknight_magica14 =[ $magica14, hknight_run1 ] {ai_face();};$/;" f +hknight_magica2 hknight.qc /^void() hknight_magica2 =[ $magica2, hknight_magica3 ] {ai_face();};$/;" f +hknight_magica3 hknight.qc /^void() hknight_magica3 =[ $magica3, hknight_magica4 ] {ai_face();};$/;" f +hknight_magica4 hknight.qc /^void() hknight_magica4 =[ $magica4, hknight_magica5 ] {ai_face();};$/;" f +hknight_magica5 hknight.qc /^void() hknight_magica5 =[ $magica5, hknight_magica6 ] {ai_face();};$/;" f +hknight_magica6 hknight.qc /^void() hknight_magica6 =[ $magica6, hknight_magica7 ] {ai_face();};$/;" f +hknight_magica7 hknight.qc /^void() hknight_magica7 =[ $magica7, hknight_magica8 ] {hknight_shot(-2);};$/;" f +hknight_magica8 hknight.qc /^void() hknight_magica8 =[ $magica8, hknight_magica9 ] {hknight_shot(-1);};$/;" f +hknight_magica9 hknight.qc /^void() hknight_magica9 =[ $magica9, hknight_magica10] {hknight_shot(0);};$/;" f +hknight_magicb1 hknight.qc /^void() hknight_magicb1 =[ $magicb1, hknight_magicb2 ] {ai_face();};$/;" f +hknight_magicb10 hknight.qc /^void() hknight_magicb10 =[ $magicb10, hknight_magicb11] {hknight_shot(1);};$/;" f +hknight_magicb11 hknight.qc /^void() hknight_magicb11 =[ $magicb11, hknight_magicb12] {hknight_shot(2);};$/;" f +hknight_magicb12 hknight.qc /^void() hknight_magicb12 =[ $magicb12, hknight_magicb13] {hknight_shot(3);};$/;" f +hknight_magicb13 hknight.qc /^void() hknight_magicb13 =[ $magicb13, hknight_run1] {ai_face();};$/;" f +hknight_magicb2 hknight.qc /^void() hknight_magicb2 =[ $magicb2, hknight_magicb3 ] {ai_face();};$/;" f +hknight_magicb3 hknight.qc /^void() hknight_magicb3 =[ $magicb3, hknight_magicb4 ] {ai_face();};$/;" f +hknight_magicb4 hknight.qc /^void() hknight_magicb4 =[ $magicb4, hknight_magicb5 ] {ai_face();};$/;" f +hknight_magicb5 hknight.qc /^void() hknight_magicb5 =[ $magicb5, hknight_magicb6 ] {ai_face();};$/;" f +hknight_magicb6 hknight.qc /^void() hknight_magicb6 =[ $magicb6, hknight_magicb7 ] {ai_face();};$/;" f +hknight_magicb7 hknight.qc /^void() hknight_magicb7 =[ $magicb7, hknight_magicb8 ] {hknight_shot(-2);};$/;" f +hknight_magicb8 hknight.qc /^void() hknight_magicb8 =[ $magicb8, hknight_magicb9 ] {hknight_shot(-1);};$/;" f +hknight_magicb9 hknight.qc /^void() hknight_magicb9 =[ $magicb9, hknight_magicb10] {hknight_shot(0);};$/;" f +hknight_magicc1 hknight.qc /^void() hknight_magicc1 =[ $magicc1, hknight_magicc2 ] {ai_face();};$/;" f +hknight_magicc10 hknight.qc /^void() hknight_magicc10 =[ $magicc10, hknight_magicc11] {hknight_shot(2);};$/;" f +hknight_magicc11 hknight.qc /^void() hknight_magicc11 =[ $magicc11, hknight_run1] {hknight_shot(3);};$/;" f +hknight_magicc2 hknight.qc /^void() hknight_magicc2 =[ $magicc2, hknight_magicc3 ] {ai_face();};$/;" f +hknight_magicc3 hknight.qc /^void() hknight_magicc3 =[ $magicc3, hknight_magicc4 ] {ai_face();};$/;" f +hknight_magicc4 hknight.qc /^void() hknight_magicc4 =[ $magicc4, hknight_magicc5 ] {ai_face();};$/;" f +hknight_magicc5 hknight.qc /^void() hknight_magicc5 =[ $magicc5, hknight_magicc6 ] {ai_face();};$/;" f +hknight_magicc6 hknight.qc /^void() hknight_magicc6 =[ $magicc6, hknight_magicc7 ] {hknight_shot(-2);};$/;" f +hknight_magicc7 hknight.qc /^void() hknight_magicc7 =[ $magicc7, hknight_magicc8 ] {hknight_shot(-1);};$/;" f +hknight_magicc8 hknight.qc /^void() hknight_magicc8 =[ $magicc8, hknight_magicc9 ] {hknight_shot(0);};$/;" f +hknight_magicc9 hknight.qc /^void() hknight_magicc9 =[ $magicc9, hknight_magicc10] {hknight_shot(1);};$/;" f +hknight_melee hknight.qc /^void() hknight_melee =$/;" f +hknight_pain hknight.qc /^void(entity attacker, float damage) hknight_pain =$/;" f +hknight_pain1 hknight.qc /^void() hknight_pain1 =[ $pain1, hknight_pain2 ] {sound (self, CHAN_VOICE, "hknight\/pain1.wav", 1, ATTN_NORM);};$/;" f +hknight_pain2 hknight.qc /^void() hknight_pain2 =[ $pain2, hknight_pain3 ] {};$/;" f +hknight_pain3 hknight.qc /^void() hknight_pain3 =[ $pain3, hknight_pain4 ] {};$/;" f +hknight_pain4 hknight.qc /^void() hknight_pain4 =[ $pain4, hknight_pain5 ] {};$/;" f +hknight_pain5 hknight.qc /^void() hknight_pain5 =[ $pain5, hknight_run1 ] {};$/;" f +hknight_run1 hknight.qc /^void() hknight_run1 =[ $run1, hknight_run2 ] {$/;" f +hknight_run2 hknight.qc /^void() hknight_run2 =[ $run2, hknight_run3 ] {ai_run(25);};$/;" f +hknight_run3 hknight.qc /^void() hknight_run3 =[ $run3, hknight_run4 ] {ai_run(18);};$/;" f +hknight_run4 hknight.qc /^void() hknight_run4 =[ $run4, hknight_run5 ] {ai_run(16);};$/;" f +hknight_run5 hknight.qc /^void() hknight_run5 =[ $run5, hknight_run6 ] {ai_run(14);};$/;" f +hknight_run6 hknight.qc /^void() hknight_run6 =[ $run6, hknight_run7 ] {ai_run(25);};$/;" f +hknight_run7 hknight.qc /^void() hknight_run7 =[ $run7, hknight_run8 ] {ai_run(21);};$/;" f +hknight_run8 hknight.qc /^void() hknight_run8 =[ $run8, hknight_run1 ] {ai_run(13);};$/;" f +hknight_shot hknight.qc /^void(float offset) hknight_shot =$/;" f +hknight_slice1 hknight.qc /^void() hknight_slice1 =[ $slice1, hknight_slice2 ] {ai_charge(9);};$/;" f +hknight_slice10 hknight.qc /^void() hknight_slice10 =[ $slice10, hknight_run1 ] {ai_charge(3);};$/;" f +hknight_slice2 hknight.qc /^void() hknight_slice2 =[ $slice2, hknight_slice3 ] {ai_charge(6);};$/;" f +hknight_slice3 hknight.qc /^void() hknight_slice3 =[ $slice3, hknight_slice4 ] {ai_charge(13);};$/;" f +hknight_slice4 hknight.qc /^void() hknight_slice4 =[ $slice4, hknight_slice5 ] {ai_charge(4);};$/;" f +hknight_slice5 hknight.qc /^void() hknight_slice5 =[ $slice5, hknight_slice6 ] {ai_charge(7); ai_melee();};$/;" f +hknight_slice6 hknight.qc /^void() hknight_slice6 =[ $slice6, hknight_slice7 ] {ai_charge(15); ai_melee();};$/;" f +hknight_slice7 hknight.qc /^void() hknight_slice7 =[ $slice7, hknight_slice8 ] {ai_charge(8); ai_melee();};$/;" f +hknight_slice8 hknight.qc /^void() hknight_slice8 =[ $slice8, hknight_slice9 ] {ai_charge(2); ai_melee();};$/;" f +hknight_slice9 hknight.qc /^void() hknight_slice9 =[ $slice9, hknight_slice10 ] {ai_melee();};$/;" f +hknight_smash1 hknight.qc /^void() hknight_smash1 =[ $smash1, hknight_smash2 ] {ai_charge(1);};$/;" f +hknight_smash10 hknight.qc /^void() hknight_smash10 =[ $smash10, hknight_smash11 ] {ai_charge(0);};$/;" f +hknight_smash11 hknight.qc /^void() hknight_smash11 =[ $smash11, hknight_run1 ] {ai_charge(0);};$/;" f +hknight_smash2 hknight.qc /^void() hknight_smash2 =[ $smash2, hknight_smash3 ] {ai_charge(13);};$/;" f +hknight_smash3 hknight.qc /^void() hknight_smash3 =[ $smash3, hknight_smash4 ] {ai_charge(9);};$/;" f +hknight_smash4 hknight.qc /^void() hknight_smash4 =[ $smash4, hknight_smash5 ] {ai_charge(11);};$/;" f +hknight_smash5 hknight.qc /^void() hknight_smash5 =[ $smash5, hknight_smash6 ] {ai_charge(10); ai_melee();};$/;" f +hknight_smash6 hknight.qc /^void() hknight_smash6 =[ $smash6, hknight_smash7 ] {ai_charge(7); ai_melee();};$/;" f +hknight_smash7 hknight.qc /^void() hknight_smash7 =[ $smash7, hknight_smash8 ] {ai_charge(12); ai_melee();};$/;" f +hknight_smash8 hknight.qc /^void() hknight_smash8 =[ $smash8, hknight_smash9 ] {ai_charge(2); ai_melee();};$/;" f +hknight_smash9 hknight.qc /^void() hknight_smash9 =[ $smash9, hknight_smash10 ] {ai_charge(3); ai_melee();};$/;" f +hknight_stand1 hknight.qc /^void() hknight_stand1 =[ $stand1, hknight_stand2 ] {ai_stand();};$/;" f +hknight_stand2 hknight.qc /^void() hknight_stand2 =[ $stand2, hknight_stand3 ] {ai_stand();};$/;" f +hknight_stand3 hknight.qc /^void() hknight_stand3 =[ $stand3, hknight_stand4 ] {ai_stand();};$/;" f +hknight_stand4 hknight.qc /^void() hknight_stand4 =[ $stand4, hknight_stand5 ] {ai_stand();};$/;" f +hknight_stand5 hknight.qc /^void() hknight_stand5 =[ $stand5, hknight_stand6 ] {ai_stand();};$/;" f +hknight_stand6 hknight.qc /^void() hknight_stand6 =[ $stand6, hknight_stand7 ] {ai_stand();};$/;" f +hknight_stand7 hknight.qc /^void() hknight_stand7 =[ $stand7, hknight_stand8 ] {ai_stand();};$/;" f +hknight_stand8 hknight.qc /^void() hknight_stand8 =[ $stand8, hknight_stand9 ] {ai_stand();};$/;" f +hknight_stand9 hknight.qc /^void() hknight_stand9 =[ $stand9, hknight_stand1 ] {ai_stand();};$/;" f +hknight_walk1 hknight.qc /^void() hknight_walk1 =[ $walk1, hknight_walk2 ] {$/;" f +hknight_walk10 hknight.qc /^void() hknight_walk10 =[ $walk10, hknight_walk11 ] {ai_walk(4);};$/;" f +hknight_walk11 hknight.qc /^void() hknight_walk11 =[ $walk11, hknight_walk12 ] {ai_walk(3);};$/;" f +hknight_walk12 hknight.qc /^void() hknight_walk12 =[ $walk12, hknight_walk13 ] {ai_walk(4);};$/;" f +hknight_walk13 hknight.qc /^void() hknight_walk13 =[ $walk13, hknight_walk14 ] {ai_walk(6);};$/;" f +hknight_walk14 hknight.qc /^void() hknight_walk14 =[ $walk14, hknight_walk15 ] {ai_walk(2);};$/;" f +hknight_walk15 hknight.qc /^void() hknight_walk15 =[ $walk15, hknight_walk16 ] {ai_walk(2);};$/;" f +hknight_walk16 hknight.qc /^void() hknight_walk16 =[ $walk16, hknight_walk17 ] {ai_walk(4);};$/;" f +hknight_walk17 hknight.qc /^void() hknight_walk17 =[ $walk17, hknight_walk18 ] {ai_walk(3);};$/;" f +hknight_walk18 hknight.qc /^void() hknight_walk18 =[ $walk18, hknight_walk19 ] {ai_walk(3);};$/;" f +hknight_walk19 hknight.qc /^void() hknight_walk19 =[ $walk19, hknight_walk20 ] {ai_walk(3);};$/;" f +hknight_walk2 hknight.qc /^void() hknight_walk2 =[ $walk2, hknight_walk3 ] {ai_walk(5);};$/;" f +hknight_walk20 hknight.qc /^void() hknight_walk20 =[ $walk20, hknight_walk1 ] {ai_walk(2);};$/;" f +hknight_walk3 hknight.qc /^void() hknight_walk3 =[ $walk3, hknight_walk4 ] {ai_walk(5);};$/;" f +hknight_walk4 hknight.qc /^void() hknight_walk4 =[ $walk4, hknight_walk5 ] {ai_walk(4);};$/;" f +hknight_walk5 hknight.qc /^void() hknight_walk5 =[ $walk5, hknight_walk6 ] {ai_walk(4);};$/;" f +hknight_walk6 hknight.qc /^void() hknight_walk6 =[ $walk6, hknight_walk7 ] {ai_walk(2);};$/;" f +hknight_walk7 hknight.qc /^void() hknight_walk7 =[ $walk7, hknight_walk8 ] {ai_walk(2);};$/;" f +hknight_walk8 hknight.qc /^void() hknight_walk8 =[ $walk8, hknight_walk9 ] {ai_walk(3);};$/;" f +hknight_walk9 hknight.qc /^void() hknight_walk9 =[ $walk9, hknight_walk10 ] {ai_walk(3);};$/;" f +hknight_watk1 hknight.qc /^void() hknight_watk1 =[ $w_attack1, hknight_watk2 ] {ai_charge(2);};$/;" f +hknight_watk10 hknight.qc /^void() hknight_watk10 =[ $w_attack10, hknight_watk11 ] {ai_charge(3); ai_melee();};$/;" f +hknight_watk11 hknight.qc /^void() hknight_watk11 =[ $w_attack11, hknight_watk12 ] {ai_charge(2); ai_melee();};$/;" f +hknight_watk12 hknight.qc /^void() hknight_watk12 =[ $w_attack12, hknight_watk13 ] {ai_charge(2); ai_melee();};$/;" f +hknight_watk13 hknight.qc /^void() hknight_watk13 =[ $w_attack13, hknight_watk14 ] {ai_charge(0);};$/;" f +hknight_watk14 hknight.qc /^void() hknight_watk14 =[ $w_attack14, hknight_watk15 ] {ai_charge(0);};$/;" f +hknight_watk15 hknight.qc /^void() hknight_watk15 =[ $w_attack15, hknight_watk16 ] {ai_charge(0);};$/;" f +hknight_watk16 hknight.qc /^void() hknight_watk16 =[ $w_attack16, hknight_watk17 ] {ai_charge(1);};$/;" f +hknight_watk17 hknight.qc /^void() hknight_watk17 =[ $w_attack17, hknight_watk18 ] {ai_charge(1); ai_melee();};$/;" f +hknight_watk18 hknight.qc /^void() hknight_watk18 =[ $w_attack18, hknight_watk19 ] {ai_charge(3); ai_melee();};$/;" f +hknight_watk19 hknight.qc /^void() hknight_watk19 =[ $w_attack19, hknight_watk20 ] {ai_charge(4); ai_melee();};$/;" f +hknight_watk2 hknight.qc /^void() hknight_watk2 =[ $w_attack2, hknight_watk3 ] {ai_charge(0);};$/;" f +hknight_watk20 hknight.qc /^void() hknight_watk20 =[ $w_attack20, hknight_watk21 ] {ai_charge(6);};$/;" f +hknight_watk21 hknight.qc /^void() hknight_watk21 =[ $w_attack21, hknight_watk22 ] {ai_charge(7);};$/;" f +hknight_watk22 hknight.qc /^void() hknight_watk22 =[ $w_attack22, hknight_run1 ] {ai_charge(3);};$/;" f +hknight_watk3 hknight.qc /^void() hknight_watk3 =[ $w_attack3, hknight_watk4 ] {ai_charge(0);};$/;" f +hknight_watk4 hknight.qc /^void() hknight_watk4 =[ $w_attack4, hknight_watk5 ] {ai_melee();};$/;" f +hknight_watk5 hknight.qc /^void() hknight_watk5 =[ $w_attack5, hknight_watk6 ] {ai_melee();};$/;" f +hknight_watk6 hknight.qc /^void() hknight_watk6 =[ $w_attack6, hknight_watk7 ] {ai_melee();};$/;" f +hknight_watk7 hknight.qc /^void() hknight_watk7 =[ $w_attack7, hknight_watk8 ] {ai_charge(1);};$/;" f +hknight_watk8 hknight.qc /^void() hknight_watk8 =[ $w_attack8, hknight_watk9 ] {ai_charge(4);};$/;" f +hknight_watk9 hknight.qc /^void() hknight_watk9 =[ $w_attack9, hknight_watk10 ] {ai_charge(5);};$/;" f +hurt_on triggers.qc /^void() hurt_on =$/;" f +hurt_touch triggers.qc /^void() hurt_touch =$/;" f +info_intermission client.qc /^void() info_intermission =$/;" f +info_notnull misc.qc /^void() info_notnull =$/;" f +info_null misc.qc /^void() info_null =$/;" f +info_player_coop client.qc /^void() info_player_coop =$/;" f +info_player_deathmatch client.qc /^void() info_player_deathmatch =$/;" f +info_player_start client.qc /^void() info_player_start =$/;" f +info_player_start2 client.qc /^void() info_player_start2 =$/;" f +info_teleport_destination triggers.qc /^void() info_teleport_destination =$/;" f +infront ai.qc /^float(entity targ) infront =$/;" f +item_armor1 items.qc /^void() item_armor1 =$/;" f +item_armor2 items.qc /^void() item_armor2 =$/;" f +item_armorInv items.qc /^void() item_armorInv =$/;" f +item_artifact_envirosuit items.qc /^void() item_artifact_envirosuit =$/;" f +item_artifact_invisibility items.qc /^void() item_artifact_invisibility =$/;" f +item_artifact_invulnerability items.qc /^void() item_artifact_invulnerability =$/;" f +item_artifact_super_damage items.qc /^void() item_artifact_super_damage =$/;" f +item_cells items.qc /^void() item_cells =$/;" f +item_health items.qc /^void() item_health =$/;" f +item_key1 items.qc /^void() item_key1 =$/;" f +item_key2 items.qc /^void() item_key2 =$/;" f +item_megahealth_rot items.qc /^void() item_megahealth_rot =$/;" f +item_rockets items.qc /^void() item_rockets =$/;" f +item_shells items.qc /^void() item_shells =$/;" f +item_sigil items.qc /^void() item_sigil =$/;" f +item_spikes items.qc /^void() item_spikes =$/;" f +item_weapon items.qc /^void() item_weapon =$/;" f +key_setsounds items.qc /^void() key_setsounds =$/;" f +key_touch items.qc /^void() key_touch =$/;" f +knight_atk1 knight.qc /^void() knight_atk1 =[ $attackb1, knight_atk2 ]$/;" f +knight_atk10 knight.qc /^void() knight_atk10=[ $attackb10, knight_run1 ] {ai_charge(5);};$/;" f +knight_atk2 knight.qc /^void() knight_atk2 =[ $attackb2, knight_atk3 ] {ai_charge(7);};$/;" f +knight_atk3 knight.qc /^void() knight_atk3 =[ $attackb3, knight_atk4 ] {ai_charge(4);};$/;" f +knight_atk4 knight.qc /^void() knight_atk4 =[ $attackb4, knight_atk5 ] {ai_charge(0);};$/;" f +knight_atk5 knight.qc /^void() knight_atk5 =[ $attackb5, knight_atk6 ] {ai_charge(3);};$/;" f +knight_atk6 knight.qc /^void() knight_atk6 =[ $attackb6, knight_atk7 ] {ai_charge(4); ai_melee();};$/;" f +knight_atk7 knight.qc /^void() knight_atk7 =[ $attackb7, knight_atk8 ] {ai_charge(1); ai_melee();};$/;" f +knight_atk8 knight.qc /^void() knight_atk8 =[ $attackb8, knight_atk9 ] {ai_charge(3);$/;" f +knight_atk9 knight.qc /^void() knight_atk9 =[ $attackb9, knight_atk10] {ai_charge(1);};$/;" f +knight_attack fight.qc /^void() knight_attack =$/;" f +knight_bow1 knight.qc /^void() knight_bow1 =[ $kneel1, knight_bow2 ] {ai_turn();};$/;" f +knight_bow10 knight.qc /^void() knight_bow10 =[ $walk1, knight_walk1 ] {ai_turn();};$/;" f +knight_bow2 knight.qc /^void() knight_bow2 =[ $kneel2, knight_bow3 ] {ai_turn();};$/;" f +knight_bow3 knight.qc /^void() knight_bow3 =[ $kneel3, knight_bow4 ] {ai_turn();};$/;" f +knight_bow4 knight.qc /^void() knight_bow4 =[ $kneel4, knight_bow5 ] {ai_turn();};$/;" f +knight_bow5 knight.qc /^void() knight_bow5 =[ $kneel5, knight_bow5 ] {ai_turn();};$/;" f +knight_bow6 knight.qc /^void() knight_bow6 =[ $kneel4, knight_bow7 ] {ai_turn();};$/;" f +knight_bow7 knight.qc /^void() knight_bow7 =[ $kneel3, knight_bow8 ] {ai_turn();};$/;" f +knight_bow8 knight.qc /^void() knight_bow8 =[ $kneel2, knight_bow9 ] {ai_turn();};$/;" f +knight_bow9 knight.qc /^void() knight_bow9 =[ $kneel1, knight_bow10 ] {ai_turn();};$/;" f +knight_die knight.qc /^void() knight_die =$/;" f +knight_die1 knight.qc /^void() knight_die1 =[ $death1, knight_die2 ] {};$/;" f +knight_die10 knight.qc /^void() knight_die10=[ $death10, knight_die10] {};$/;" f +knight_die2 knight.qc /^void() knight_die2 =[ $death2, knight_die3 ] {};$/;" f +knight_die3 knight.qc /^void() knight_die3 =[ $death3, knight_die4 ] $/;" f +knight_die4 knight.qc /^void() knight_die4 =[ $death4, knight_die5 ] {};$/;" f +knight_die5 knight.qc /^void() knight_die5 =[ $death5, knight_die6 ] {};$/;" f +knight_die6 knight.qc /^void() knight_die6 =[ $death6, knight_die7 ] {};$/;" f +knight_die7 knight.qc /^void() knight_die7 =[ $death7, knight_die8 ] {};$/;" f +knight_die8 knight.qc /^void() knight_die8 =[ $death8, knight_die9 ] {};$/;" f +knight_die9 knight.qc /^void() knight_die9 =[ $death9, knight_die10] {};$/;" f +knight_dieb1 knight.qc /^void() knight_dieb1 =[ $deathb1, knight_dieb2 ] {};$/;" f +knight_dieb10 knight.qc /^void() knight_dieb10 = [ $deathb10, knight_dieb11] {};$/;" f +knight_dieb11 knight.qc /^void() knight_dieb11 = [ $deathb11, knight_dieb11] {};$/;" f +knight_dieb2 knight.qc /^void() knight_dieb2 =[ $deathb2, knight_dieb3 ] {};$/;" f +knight_dieb3 knight.qc /^void() knight_dieb3 =[ $deathb3, knight_dieb4 ] $/;" f +knight_dieb4 knight.qc /^void() knight_dieb4 =[ $deathb4, knight_dieb5 ] {};$/;" f +knight_dieb5 knight.qc /^void() knight_dieb5 =[ $deathb5, knight_dieb6 ] {};$/;" f +knight_dieb6 knight.qc /^void() knight_dieb6 =[ $deathb6, knight_dieb7 ] {};$/;" f +knight_dieb7 knight.qc /^void() knight_dieb7 =[ $deathb7, knight_dieb8 ] {};$/;" f +knight_dieb8 knight.qc /^void() knight_dieb8 =[ $deathb8, knight_dieb9 ] {};$/;" f +knight_dieb9 knight.qc /^void() knight_dieb9 =[ $deathb9, knight_dieb10] {};$/;" f +knight_pain knight.qc /^void(entity attacker, float damage) knight_pain =$/;" f +knight_pain1 knight.qc /^void() knight_pain1 =[ $pain1, knight_pain2 ] {};$/;" f +knight_pain2 knight.qc /^void() knight_pain2 =[ $pain2, knight_pain3 ] {};$/;" f +knight_pain3 knight.qc /^void() knight_pain3 =[ $pain3, knight_run1 ] {};$/;" f +knight_painb1 knight.qc /^void() knight_painb1 =[ $painb1, knight_painb2 ] {ai_painforward(0);};$/;" f +knight_painb10 knight.qc /^void() knight_painb10 =[ $painb10, knight_painb11 ] {ai_painforward(0);};$/;" f +knight_painb11 knight.qc /^void() knight_painb11 =[ $painb11, knight_run1 ] {};$/;" f +knight_painb2 knight.qc /^void() knight_painb2 =[ $painb2, knight_painb3 ] {ai_painforward(3);};$/;" f +knight_painb3 knight.qc /^void() knight_painb3 =[ $painb3, knight_painb4 ] {};$/;" f +knight_painb4 knight.qc /^void() knight_painb4 =[ $painb4, knight_painb5 ] {};$/;" f +knight_painb5 knight.qc /^void() knight_painb5 =[ $painb5, knight_painb6 ] {ai_painforward(2);};$/;" f +knight_painb6 knight.qc /^void() knight_painb6 =[ $painb6, knight_painb7 ] {ai_painforward(4);};$/;" f +knight_painb7 knight.qc /^void() knight_painb7 =[ $painb7, knight_painb8 ] {ai_painforward(2);};$/;" f +knight_painb8 knight.qc /^void() knight_painb8 =[ $painb8, knight_painb9 ] {ai_painforward(5);};$/;" f +knight_painb9 knight.qc /^void() knight_painb9 =[ $painb9, knight_painb10 ] {ai_painforward(5);};$/;" f +knight_run1 knight.qc /^void() knight_run1 =[ $runb1, knight_run2 ] {$/;" f +knight_run2 knight.qc /^void() knight_run2 =[ $runb2, knight_run3 ] {ai_run(20);};$/;" f +knight_run3 knight.qc /^void() knight_run3 =[ $runb3, knight_run4 ] {ai_run(13);};$/;" f +knight_run4 knight.qc /^void() knight_run4 =[ $runb4, knight_run5 ] {ai_run(7);};$/;" f +knight_run5 knight.qc /^void() knight_run5 =[ $runb5, knight_run6 ] {ai_run(16);};$/;" f +knight_run6 knight.qc /^void() knight_run6 =[ $runb6, knight_run7 ] {ai_run(20);};$/;" f +knight_run7 knight.qc /^void() knight_run7 =[ $runb7, knight_run8 ] {ai_run(14);};$/;" f +knight_run8 knight.qc /^void() knight_run8 =[ $runb8, knight_run1 ] {ai_run(6);};$/;" f +knight_runatk1 knight.qc /^void() knight_runatk1 =[ $runattack1, knight_runatk2 ]$/;" f +knight_runatk10 knight.qc /^void() knight_runatk10 =[ $runattack10, knight_runatk11 ] {ai_charge_side();};$/;" f +knight_runatk11 knight.qc /^void() knight_runatk11 =[ $runattack11, knight_run1 ] {ai_charge(10);};$/;" f +knight_runatk2 knight.qc /^void() knight_runatk2 =[ $runattack2, knight_runatk3 ] {ai_charge_side();};$/;" f +knight_runatk3 knight.qc /^void() knight_runatk3 =[ $runattack3, knight_runatk4 ] {ai_charge_side();};$/;" f +knight_runatk4 knight.qc /^void() knight_runatk4 =[ $runattack4, knight_runatk5 ] {ai_charge_side();};$/;" f +knight_runatk5 knight.qc /^void() knight_runatk5 =[ $runattack5, knight_runatk6 ] {ai_melee_side();};$/;" f +knight_runatk6 knight.qc /^void() knight_runatk6 =[ $runattack6, knight_runatk7 ] {ai_melee_side();};$/;" f +knight_runatk7 knight.qc /^void() knight_runatk7 =[ $runattack7, knight_runatk8 ] {ai_melee_side();};$/;" f +knight_runatk8 knight.qc /^void() knight_runatk8 =[ $runattack8, knight_runatk9 ] {ai_melee_side();};$/;" f +knight_runatk9 knight.qc /^void() knight_runatk9 =[ $runattack9, knight_runatk10 ] {ai_melee_side();};$/;" f +knight_stand1 knight.qc /^void() knight_stand1 =[ $stand1, knight_stand2 ] {ai_stand();};$/;" f +knight_stand2 knight.qc /^void() knight_stand2 =[ $stand2, knight_stand3 ] {ai_stand();};$/;" f +knight_stand3 knight.qc /^void() knight_stand3 =[ $stand3, knight_stand4 ] {ai_stand();};$/;" f +knight_stand4 knight.qc /^void() knight_stand4 =[ $stand4, knight_stand5 ] {ai_stand();};$/;" f +knight_stand5 knight.qc /^void() knight_stand5 =[ $stand5, knight_stand6 ] {ai_stand();};$/;" f +knight_stand6 knight.qc /^void() knight_stand6 =[ $stand6, knight_stand7 ] {ai_stand();};$/;" f +knight_stand7 knight.qc /^void() knight_stand7 =[ $stand7, knight_stand8 ] {ai_stand();};$/;" f +knight_stand8 knight.qc /^void() knight_stand8 =[ $stand8, knight_stand9 ] {ai_stand();};$/;" f +knight_stand9 knight.qc /^void() knight_stand9 =[ $stand9, knight_stand1 ] {ai_stand();};$/;" f +knight_walk1 knight.qc /^void() knight_walk1 =[ $walk1, knight_walk2 ] {$/;" f +knight_walk10 knight.qc /^void() knight_walk10 =[ $walk10, knight_walk11 ] {ai_walk(3);};$/;" f +knight_walk11 knight.qc /^void() knight_walk11 =[ $walk11, knight_walk12 ] {ai_walk(2);};$/;" f +knight_walk12 knight.qc /^void() knight_walk12 =[ $walk12, knight_walk13 ] {ai_walk(3);};$/;" f +knight_walk13 knight.qc /^void() knight_walk13 =[ $walk13, knight_walk14 ] {ai_walk(4);};$/;" f +knight_walk14 knight.qc /^void() knight_walk14 =[ $walk14, knight_walk1 ] {ai_walk(3);};$/;" f +knight_walk2 knight.qc /^void() knight_walk2 =[ $walk2, knight_walk3 ] {ai_walk(2);};$/;" f +knight_walk3 knight.qc /^void() knight_walk3 =[ $walk3, knight_walk4 ] {ai_walk(3);};$/;" f +knight_walk4 knight.qc /^void() knight_walk4 =[ $walk4, knight_walk5 ] {ai_walk(4);};$/;" f +knight_walk5 knight.qc /^void() knight_walk5 =[ $walk5, knight_walk6 ] {ai_walk(3);};$/;" f +knight_walk6 knight.qc /^void() knight_walk6 =[ $walk6, knight_walk7 ] {ai_walk(3);};$/;" f +knight_walk7 knight.qc /^void() knight_walk7 =[ $walk7, knight_walk8 ] {ai_walk(3);};$/;" f +knight_walk8 knight.qc /^void() knight_walk8 =[ $walk8, knight_walk9 ] {ai_walk(4);};$/;" f +knight_walk9 knight.qc /^void() knight_walk9 =[ $walk9, knight_walk10 ] {ai_walk(3);};$/;" f +launch_spike weapons.qc /^void(vector org, vector dir) launch_spike =$/;" f +light misc.qc /^void() light =$/;" f +light_flame_large_yellow misc.qc /^void() light_flame_large_yellow =$/;" f +light_flame_small_white misc.qc /^void() light_flame_small_white =$/;" f +light_flame_small_yellow misc.qc /^void() light_flame_small_yellow =$/;" f +light_fluoro misc.qc /^void() light_fluoro =$/;" f +light_fluorospark misc.qc /^void() light_fluorospark =$/;" f +light_globe misc.qc /^void() light_globe =$/;" f +light_torch_small_walltorch misc.qc /^void() light_torch_small_walltorch =$/;" f +light_use misc.qc /^void() light_use =$/;" f +lightning_fire boss.qc /^void() lightning_fire =$/;" f +lightning_use boss.qc /^void() lightning_use =$/;" f +lightstyle defs.qc /^void(float style, string value) lightstyle = #35;$/;" f +localcmd defs.qc /^void(string s) localcmd = #46; \/\/ put string into local que$/;" f +main world.qc /^void() main =$/;" f +make_bubbles misc.qc /^void() make_bubbles =$/;" f +makestatic defs.qc /^void(entity e) makestatic = #69;$/;" f +makevectors defs.qc /^void(vector ang) makevectors = #1; \/\/ sets v_forward, etc globals$/;" f +misc_explobox misc.qc /^void() misc_explobox =$/;" f +misc_explobox2 misc.qc /^void() misc_explobox2 =$/;" f +misc_fireball misc.qc /^void() misc_fireball =$/;" f +misc_noisemaker misc.qc /^void() misc_noisemaker =$/;" f +misc_teleporttrain plats.qc /^void() misc_teleporttrain =$/;" f +monster_army soldier.qc /^void() monster_army =$/;" f +monster_boss boss.qc /^void() monster_boss =$/;" f +monster_death_use monsters.qc /^void() monster_death_use =$/;" f +monster_demon1 demon.qc /^void() monster_demon1 =$/;" f +monster_dog dog.qc /^void() monster_dog =$/;" f +monster_enforcer enforcer.qc /^void() monster_enforcer =$/;" f +monster_fish fish.qc /^void() monster_fish =$/;" f +monster_hell_knight hknight.qc /^void() monster_hell_knight =$/;" f +monster_knight knight.qc /^void() monster_knight =$/;" f +monster_ogre ogre.qc /^void() monster_ogre =$/;" f +monster_ogre_marksman ogre.qc /^void() monster_ogre_marksman =$/;" f +monster_oldone oldone.qc /^void() monster_oldone =$/;" f +monster_shalrath shalrath.qc /^void() monster_shalrath =$/;" f +monster_shambler shambler.qc /^void() monster_shambler =$/;" f +monster_tarbaby tarbaby.qc /^void() monster_tarbaby =$/;" f +monster_use monsters.qc /^void() monster_use =$/;" f +monster_wizard wizard.qc /^void() monster_wizard =$/;" f +monster_zombie zombie.qc /^void() monster_zombie =$/;" f +movetarget_f ai.qc /^void() movetarget_f =$/;" f +movetogoal defs.qc /^void(float step) movetogoal = #67;$/;" f +multi_killed triggers.qc /^void() multi_killed =$/;" f +multi_touch triggers.qc /^void() multi_touch =$/;" f +multi_trigger triggers.qc /^void() multi_trigger =$/;" f +multi_use triggers.qc /^void() multi_use =$/;" f +multi_wait triggers.qc /^void() multi_wait =$/;" f +nextent defs.qc /^entity(entity e) nextent = #47; \/\/ for looping through all ents$/;" f +noclass items.qc /^void() noclass =$/;" f +noise_think misc.qc /^void() noise_think =$/;" f +nopain oldone.qc /^void () nopain =$/;" f +normalize defs.qc /^vector(vector v) normalize = #9;$/;" f +null_die portal.qc /^void() null_die = {};$/;" f +objerror defs.qc /^void(string e) objerror = #11;$/;" f +ogre_bdie1 ogre.qc /^void() ogre_bdie1 =[ $bdeath1, ogre_bdie2 ] {};$/;" f +ogre_bdie10 ogre.qc /^void() ogre_bdie10 =[ $bdeath10, ogre_bdie10 ] {};$/;" f +ogre_bdie2 ogre.qc /^void() ogre_bdie2 =[ $bdeath2, ogre_bdie3 ] {ai_forward(5);};$/;" f +ogre_bdie3 ogre.qc /^void() ogre_bdie3 =[ $bdeath3, ogre_bdie4 ]$/;" f +ogre_bdie4 ogre.qc /^void() ogre_bdie4 =[ $bdeath4, ogre_bdie5 ] {ai_forward(1);};$/;" f +ogre_bdie5 ogre.qc /^void() ogre_bdie5 =[ $bdeath5, ogre_bdie6 ] {ai_forward(3);};$/;" f +ogre_bdie6 ogre.qc /^void() ogre_bdie6 =[ $bdeath6, ogre_bdie7 ] {ai_forward(7);};$/;" f +ogre_bdie7 ogre.qc /^void() ogre_bdie7 =[ $bdeath7, ogre_bdie8 ] {ai_forward(25);};$/;" f +ogre_bdie8 ogre.qc /^void() ogre_bdie8 =[ $bdeath8, ogre_bdie9 ] {};$/;" f +ogre_bdie9 ogre.qc /^void() ogre_bdie9 =[ $bdeath9, ogre_bdie10 ] {};$/;" f +ogre_die ogre.qc /^void() ogre_die =$/;" f +ogre_die1 ogre.qc /^void() ogre_die1 =[ $death1, ogre_die2 ] {};$/;" f +ogre_die10 ogre.qc /^void() ogre_die10 =[ $death10, ogre_die11 ] {};$/;" f +ogre_die11 ogre.qc /^void() ogre_die11 =[ $death11, ogre_die12 ] {};$/;" f +ogre_die12 ogre.qc /^void() ogre_die12 =[ $death12, ogre_die13 ] {};$/;" f +ogre_die13 ogre.qc /^void() ogre_die13 =[ $death13, ogre_die14 ] {};$/;" f +ogre_die14 ogre.qc /^void() ogre_die14 =[ $death14, ogre_die14 ] {};$/;" f +ogre_die2 ogre.qc /^void() ogre_die2 =[ $death2, ogre_die3 ] {};$/;" f +ogre_die3 ogre.qc /^void() ogre_die3 =[ $death3, ogre_die4 ]$/;" f +ogre_die4 ogre.qc /^void() ogre_die4 =[ $death4, ogre_die5 ] {};$/;" f +ogre_die5 ogre.qc /^void() ogre_die5 =[ $death5, ogre_die6 ] {};$/;" f +ogre_die6 ogre.qc /^void() ogre_die6 =[ $death6, ogre_die7 ] {};$/;" f +ogre_die7 ogre.qc /^void() ogre_die7 =[ $death7, ogre_die8 ] {};$/;" f +ogre_die8 ogre.qc /^void() ogre_die8 =[ $death8, ogre_die9 ] {};$/;" f +ogre_die9 ogre.qc /^void() ogre_die9 =[ $death9, ogre_die10 ] {};$/;" f +ogre_melee ogre.qc /^void() ogre_melee =$/;" f +ogre_nail1 ogre.qc /^void() ogre_nail1 =[ $shoot1, ogre_nail2 ] {ai_face();};$/;" f +ogre_nail2 ogre.qc /^void() ogre_nail2 =[ $shoot2, ogre_nail3 ] {ai_face();};$/;" f +ogre_nail3 ogre.qc /^void() ogre_nail3 =[ $shoot2, ogre_nail4 ] {ai_face();};$/;" f +ogre_nail4 ogre.qc /^void() ogre_nail4 =[ $shoot3, ogre_nail5 ] {ai_face();OgreFireGrenade();};$/;" f +ogre_nail5 ogre.qc /^void() ogre_nail5 =[ $shoot4, ogre_nail6 ] {ai_face();};$/;" f +ogre_nail6 ogre.qc /^void() ogre_nail6 =[ $shoot5, ogre_nail7 ] {ai_face();};$/;" f +ogre_nail7 ogre.qc /^void() ogre_nail7 =[ $shoot6, ogre_run1 ] {ai_face();};$/;" f +ogre_pain ogre.qc /^void(entity attacker, float damage) ogre_pain =$/;" f +ogre_pain1 ogre.qc /^void() ogre_pain1 =[ $pain1, ogre_pain2 ] {};$/;" f +ogre_pain2 ogre.qc /^void() ogre_pain2 =[ $pain2, ogre_pain3 ] {};$/;" f +ogre_pain3 ogre.qc /^void() ogre_pain3 =[ $pain3, ogre_pain4 ] {};$/;" f +ogre_pain4 ogre.qc /^void() ogre_pain4 =[ $pain4, ogre_pain5 ] {};$/;" f +ogre_pain5 ogre.qc /^void() ogre_pain5 =[ $pain5, ogre_run1 ] {};$/;" f +ogre_painb1 ogre.qc /^void() ogre_painb1 =[ $painb1, ogre_painb2 ] {};$/;" f +ogre_painb2 ogre.qc /^void() ogre_painb2 =[ $painb2, ogre_painb3 ] {};$/;" f +ogre_painb3 ogre.qc /^void() ogre_painb3 =[ $painb3, ogre_run1 ] {};$/;" f +ogre_painc1 ogre.qc /^void() ogre_painc1 =[ $painc1, ogre_painc2 ] {};$/;" f +ogre_painc2 ogre.qc /^void() ogre_painc2 =[ $painc2, ogre_painc3 ] {};$/;" f +ogre_painc3 ogre.qc /^void() ogre_painc3 =[ $painc3, ogre_painc4 ] {};$/;" f +ogre_painc4 ogre.qc /^void() ogre_painc4 =[ $painc4, ogre_painc5 ] {};$/;" f +ogre_painc5 ogre.qc /^void() ogre_painc5 =[ $painc5, ogre_painc6 ] {};$/;" f +ogre_painc6 ogre.qc /^void() ogre_painc6 =[ $painc6, ogre_run1 ] {};$/;" f +ogre_paind1 ogre.qc /^void() ogre_paind1 =[ $paind1, ogre_paind2 ] {};$/;" f +ogre_paind10 ogre.qc /^void() ogre_paind10=[ $paind10, ogre_paind11 ] {};$/;" f +ogre_paind11 ogre.qc /^void() ogre_paind11=[ $paind11, ogre_paind12 ] {};$/;" f +ogre_paind12 ogre.qc /^void() ogre_paind12=[ $paind12, ogre_paind13 ] {};$/;" f +ogre_paind13 ogre.qc /^void() ogre_paind13=[ $paind13, ogre_paind14 ] {};$/;" f +ogre_paind14 ogre.qc /^void() ogre_paind14=[ $paind14, ogre_paind15 ] {};$/;" f +ogre_paind15 ogre.qc /^void() ogre_paind15=[ $paind15, ogre_paind16 ] {};$/;" f +ogre_paind16 ogre.qc /^void() ogre_paind16=[ $paind16, ogre_run1 ] {};$/;" f +ogre_paind2 ogre.qc /^void() ogre_paind2 =[ $paind2, ogre_paind3 ] {ai_pain(10);};$/;" f +ogre_paind3 ogre.qc /^void() ogre_paind3 =[ $paind3, ogre_paind4 ] {ai_pain(9);};$/;" f +ogre_paind4 ogre.qc /^void() ogre_paind4 =[ $paind4, ogre_paind5 ] {ai_pain(4);};$/;" f +ogre_paind5 ogre.qc /^void() ogre_paind5 =[ $paind5, ogre_paind6 ] {};$/;" f +ogre_paind6 ogre.qc /^void() ogre_paind6 =[ $paind6, ogre_paind7 ] {};$/;" f +ogre_paind7 ogre.qc /^void() ogre_paind7 =[ $paind7, ogre_paind8 ] {};$/;" f +ogre_paind8 ogre.qc /^void() ogre_paind8 =[ $paind8, ogre_paind9 ] {};$/;" f +ogre_paind9 ogre.qc /^void() ogre_paind9 =[ $paind9, ogre_paind10 ] {};$/;" f +ogre_paine1 ogre.qc /^void() ogre_paine1 =[ $paine1, ogre_paine2 ] {};$/;" f +ogre_paine10 ogre.qc /^void() ogre_paine10=[ $paine10, ogre_paine11 ] {};$/;" f +ogre_paine11 ogre.qc /^void() ogre_paine11=[ $paine11, ogre_paine12 ] {};$/;" f +ogre_paine12 ogre.qc /^void() ogre_paine12=[ $paine12, ogre_paine13 ] {};$/;" f +ogre_paine13 ogre.qc /^void() ogre_paine13=[ $paine13, ogre_paine14 ] {};$/;" f +ogre_paine14 ogre.qc /^void() ogre_paine14=[ $paine14, ogre_paine15 ] {};$/;" f +ogre_paine15 ogre.qc /^void() ogre_paine15=[ $paine15, ogre_run1 ] {};$/;" f +ogre_paine2 ogre.qc /^void() ogre_paine2 =[ $paine2, ogre_paine3 ] {ai_pain(10);};$/;" f +ogre_paine3 ogre.qc /^void() ogre_paine3 =[ $paine3, ogre_paine4 ] {ai_pain(9);};$/;" f +ogre_paine4 ogre.qc /^void() ogre_paine4 =[ $paine4, ogre_paine5 ] {ai_pain(4);};$/;" f +ogre_paine5 ogre.qc /^void() ogre_paine5 =[ $paine5, ogre_paine6 ] {};$/;" f +ogre_paine6 ogre.qc /^void() ogre_paine6 =[ $paine6, ogre_paine7 ] {};$/;" f +ogre_paine7 ogre.qc /^void() ogre_paine7 =[ $paine7, ogre_paine8 ] {};$/;" f +ogre_paine8 ogre.qc /^void() ogre_paine8 =[ $paine8, ogre_paine9 ] {};$/;" f +ogre_paine9 ogre.qc /^void() ogre_paine9 =[ $paine9, ogre_paine10 ] {};$/;" f +ogre_run1 ogre.qc /^void() ogre_run1 =[ $run1, ogre_run2 ] {ai_run(9);$/;" f +ogre_run2 ogre.qc /^void() ogre_run2 =[ $run2, ogre_run3 ] {ai_run(12);};$/;" f +ogre_run3 ogre.qc /^void() ogre_run3 =[ $run3, ogre_run4 ] {ai_run(8);};$/;" f +ogre_run4 ogre.qc /^void() ogre_run4 =[ $run4, ogre_run5 ] {ai_run(22);};$/;" f +ogre_run5 ogre.qc /^void() ogre_run5 =[ $run5, ogre_run6 ] {ai_run(16);};$/;" f +ogre_run6 ogre.qc /^void() ogre_run6 =[ $run6, ogre_run7 ] {ai_run(4);};$/;" f +ogre_run7 ogre.qc /^void() ogre_run7 =[ $run7, ogre_run8 ] {ai_run(13);};$/;" f +ogre_run8 ogre.qc /^void() ogre_run8 =[ $run8, ogre_run1 ] {ai_run(24);};$/;" f +ogre_smash1 ogre.qc /^void() ogre_smash1 =[ $smash1, ogre_smash2 ] {ai_charge(6);$/;" f +ogre_smash10 ogre.qc /^void() ogre_smash10 =[ $smash10, ogre_smash11 ] {chainsaw(1);};$/;" f +ogre_smash11 ogre.qc /^void() ogre_smash11 =[ $smash11, ogre_smash12 ] {ai_charge(2); chainsaw(0);$/;" f +ogre_smash12 ogre.qc /^void() ogre_smash12 =[$smash12, ogre_smash13] {ai_charge(0);};$/;" f +ogre_smash13 ogre.qc /^void() ogre_smash13 =[ $smash13, ogre_smash14 ] {ai_charge(4);};$/;" f +ogre_smash14 ogre.qc /^void() ogre_smash14 =[ $smash14, ogre_run1 ] {ai_charge(12);};$/;" f +ogre_smash2 ogre.qc /^void() ogre_smash2 =[ $smash2, ogre_smash3 ] {ai_charge(0);};$/;" f +ogre_smash3 ogre.qc /^void() ogre_smash3 =[ $smash3, ogre_smash4 ] {ai_charge(0);};$/;" f +ogre_smash4 ogre.qc /^void() ogre_smash4 =[ $smash4, ogre_smash5 ] {ai_charge(1);};$/;" f +ogre_smash5 ogre.qc /^void() ogre_smash5 =[ $smash5, ogre_smash6 ] {ai_charge(4);};$/;" f +ogre_smash6 ogre.qc /^void() ogre_smash6 =[ $smash6, ogre_smash7 ] {ai_charge(4); chainsaw(0);};$/;" f +ogre_smash7 ogre.qc /^void() ogre_smash7 =[ $smash7, ogre_smash8 ] {ai_charge(4); chainsaw(0);};$/;" f +ogre_smash8 ogre.qc /^void() ogre_smash8 =[ $smash8, ogre_smash9 ] {ai_charge(10); chainsaw(0);};$/;" f +ogre_smash9 ogre.qc /^void() ogre_smash9 =[ $smash9, ogre_smash10 ] {ai_charge(13); chainsaw(0);};$/;" f +ogre_stand1 ogre.qc /^void() ogre_stand1 =[ $stand1, ogre_stand2 ] {ai_stand();};$/;" f +ogre_stand2 ogre.qc /^void() ogre_stand2 =[ $stand2, ogre_stand3 ] {ai_stand();};$/;" f +ogre_stand3 ogre.qc /^void() ogre_stand3 =[ $stand3, ogre_stand4 ] {ai_stand();};$/;" f +ogre_stand4 ogre.qc /^void() ogre_stand4 =[ $stand4, ogre_stand5 ] {ai_stand();};$/;" f +ogre_stand5 ogre.qc /^void() ogre_stand5 =[ $stand5, ogre_stand6 ] {$/;" f +ogre_stand6 ogre.qc /^void() ogre_stand6 =[ $stand6, ogre_stand7 ] {ai_stand();};$/;" f +ogre_stand7 ogre.qc /^void() ogre_stand7 =[ $stand7, ogre_stand8 ] {ai_stand();};$/;" f +ogre_stand8 ogre.qc /^void() ogre_stand8 =[ $stand8, ogre_stand9 ] {ai_stand();};$/;" f +ogre_stand9 ogre.qc /^void() ogre_stand9 =[ $stand9, ogre_stand1 ] {ai_stand();};$/;" f +ogre_swing1 ogre.qc /^void() ogre_swing1 =[ $swing1, ogre_swing2 ] {ai_charge(11);$/;" f +ogre_swing10 ogre.qc /^void() ogre_swing10 =[ $swing10, ogre_swing11 ] {chainsaw(-200);self.angles_y = self.angles_y + random()* 25;};$/;" f +ogre_swing11 ogre.qc /^void() ogre_swing11 =[ $swing11, ogre_swing12 ] {chainsaw(0);self.angles_y = self.angles_y + random()* 25;};$/;" f +ogre_swing12 ogre.qc /^void() ogre_swing12 =[ $swing12, ogre_swing13 ] {ai_charge(3);};$/;" f +ogre_swing13 ogre.qc /^void() ogre_swing13 =[ $swing13, ogre_swing14 ] {ai_charge(8);};$/;" f +ogre_swing14 ogre.qc /^void() ogre_swing14 =[ $swing14, ogre_run1 ] {ai_charge(9);};$/;" f +ogre_swing2 ogre.qc /^void() ogre_swing2 =[ $swing2, ogre_swing3 ] {ai_charge(1);};$/;" f +ogre_swing3 ogre.qc /^void() ogre_swing3 =[ $swing3, ogre_swing4 ] {ai_charge(4);};$/;" f +ogre_swing4 ogre.qc /^void() ogre_swing4 =[ $swing4, ogre_swing5 ] {ai_charge(13);};$/;" f +ogre_swing5 ogre.qc /^void() ogre_swing5 =[ $swing5, ogre_swing6 ] {ai_charge(9); chainsaw(0);self.angles_y = self.angles_y + random()*25;};$/;" f +ogre_swing6 ogre.qc /^void() ogre_swing6 =[ $swing6, ogre_swing7 ] {chainsaw(200);self.angles_y = self.angles_y + random()* 25;};$/;" f +ogre_swing7 ogre.qc /^void() ogre_swing7 =[ $swing7, ogre_swing8 ] {chainsaw(0);self.angles_y = self.angles_y + random()* 25;};$/;" f +ogre_swing8 ogre.qc /^void() ogre_swing8 =[ $swing8, ogre_swing9 ] {chainsaw(0);self.angles_y = self.angles_y + random()* 25;};$/;" f +ogre_swing9 ogre.qc /^void() ogre_swing9 =[ $swing9, ogre_swing10 ] {chainsaw(0);self.angles_y = self.angles_y + random()* 25;};$/;" f +ogre_walk1 ogre.qc /^void() ogre_walk1 =[ $walk1, ogre_walk2 ] {ai_walk(3);};$/;" f +ogre_walk10 ogre.qc /^void() ogre_walk10 =[ $walk10, ogre_walk11 ] {ai_walk(1);};$/;" f +ogre_walk11 ogre.qc /^void() ogre_walk11 =[ $walk11, ogre_walk12 ] {ai_walk(2);};$/;" f +ogre_walk12 ogre.qc /^void() ogre_walk12 =[ $walk12, ogre_walk13 ] {ai_walk(3);};$/;" f +ogre_walk13 ogre.qc /^void() ogre_walk13 =[ $walk13, ogre_walk14 ] {ai_walk(3);};$/;" f +ogre_walk14 ogre.qc /^void() ogre_walk14 =[ $walk14, ogre_walk15 ] {ai_walk(3);};$/;" f +ogre_walk15 ogre.qc /^void() ogre_walk15 =[ $walk15, ogre_walk16 ] {ai_walk(3);};$/;" f +ogre_walk16 ogre.qc /^void() ogre_walk16 =[ $walk16, ogre_walk1 ] {ai_walk(4);};$/;" f +ogre_walk2 ogre.qc /^void() ogre_walk2 =[ $walk2, ogre_walk3 ] {ai_walk(2);};$/;" f +ogre_walk3 ogre.qc /^void() ogre_walk3 =[ $walk3, ogre_walk4 ] {$/;" f +ogre_walk4 ogre.qc /^void() ogre_walk4 =[ $walk4, ogre_walk5 ] {ai_walk(2);};$/;" f +ogre_walk5 ogre.qc /^void() ogre_walk5 =[ $walk5, ogre_walk6 ] {ai_walk(2);};$/;" f +ogre_walk6 ogre.qc /^void() ogre_walk6 =[ $walk6, ogre_walk7 ] {$/;" f +ogre_walk7 ogre.qc /^void() ogre_walk7 =[ $walk7, ogre_walk8 ] {ai_walk(3);};$/;" f +ogre_walk8 ogre.qc /^void() ogre_walk8 =[ $walk8, ogre_walk9 ] {ai_walk(2);};$/;" f +ogre_walk9 ogre.qc /^void() ogre_walk9 =[ $walk9, ogre_walk10 ] {ai_walk(3);};$/;" f +old_idle1 oldone.qc /^void() old_idle1 =[ $old1, old_idle2 ] {};$/;" f +old_idle10 oldone.qc /^void() old_idle10 =[ $old10, old_idle11 ] {};$/;" f +old_idle11 oldone.qc /^void() old_idle11 =[ $old11, old_idle12 ] {};$/;" f +old_idle12 oldone.qc /^void() old_idle12 =[ $old12, old_idle13 ] {};$/;" f +old_idle13 oldone.qc /^void() old_idle13 =[ $old13, old_idle14 ] {};$/;" f +old_idle14 oldone.qc /^void() old_idle14 =[ $old14, old_idle15 ] {};$/;" f +old_idle15 oldone.qc /^void() old_idle15 =[ $old15, old_idle16 ] {};$/;" f +old_idle16 oldone.qc /^void() old_idle16 =[ $old16, old_idle17 ] {};$/;" f +old_idle17 oldone.qc /^void() old_idle17 =[ $old17, old_idle18 ] {};$/;" f +old_idle18 oldone.qc /^void() old_idle18 =[ $old18, old_idle19 ] {};$/;" f +old_idle19 oldone.qc /^void() old_idle19 =[ $old19, old_idle20 ] {};$/;" f +old_idle2 oldone.qc /^void() old_idle2 =[ $old2, old_idle3 ] {};$/;" f +old_idle20 oldone.qc /^void() old_idle20 =[ $old20, old_idle21 ] {};$/;" f +old_idle21 oldone.qc /^void() old_idle21 =[ $old21, old_idle22 ] {};$/;" f +old_idle22 oldone.qc /^void() old_idle22 =[ $old22, old_idle23 ] {};$/;" f +old_idle23 oldone.qc /^void() old_idle23 =[ $old23, old_idle24 ] {};$/;" f +old_idle24 oldone.qc /^void() old_idle24 =[ $old24, old_idle25 ] {};$/;" f +old_idle25 oldone.qc /^void() old_idle25 =[ $old25, old_idle26 ] {};$/;" f +old_idle26 oldone.qc /^void() old_idle26 =[ $old26, old_idle27 ] {};$/;" f +old_idle27 oldone.qc /^void() old_idle27 =[ $old27, old_idle28 ] {};$/;" f +old_idle28 oldone.qc /^void() old_idle28 =[ $old28, old_idle29 ] {};$/;" f +old_idle29 oldone.qc /^void() old_idle29 =[ $old29, old_idle30 ] {};$/;" f +old_idle3 oldone.qc /^void() old_idle3 =[ $old3, old_idle4 ] {};$/;" f +old_idle30 oldone.qc /^void() old_idle30 =[ $old30, old_idle31 ] {};$/;" f +old_idle31 oldone.qc /^void() old_idle31 =[ $old31, old_idle32 ] {};$/;" f +old_idle32 oldone.qc /^void() old_idle32 =[ $old32, old_idle33 ] {};$/;" f +old_idle33 oldone.qc /^void() old_idle33 =[ $old33, old_idle34 ] {};$/;" f +old_idle34 oldone.qc /^void() old_idle34 =[ $old34, old_idle35 ] {};$/;" f +old_idle35 oldone.qc /^void() old_idle35 =[ $old35, old_idle36 ] {};$/;" f +old_idle36 oldone.qc /^void() old_idle36 =[ $old36, old_idle37 ] {};$/;" f +old_idle37 oldone.qc /^void() old_idle37 =[ $old37, old_idle38 ] {};$/;" f +old_idle38 oldone.qc /^void() old_idle38 =[ $old38, old_idle39 ] {};$/;" f +old_idle39 oldone.qc /^void() old_idle39 =[ $old39, old_idle40 ] {};$/;" f +old_idle4 oldone.qc /^void() old_idle4 =[ $old4, old_idle5 ] {};$/;" f +old_idle40 oldone.qc /^void() old_idle40 =[ $old40, old_idle41 ] {};$/;" f +old_idle41 oldone.qc /^void() old_idle41 =[ $old41, old_idle42 ] {};$/;" f +old_idle42 oldone.qc /^void() old_idle42 =[ $old42, old_idle43 ] {};$/;" f +old_idle43 oldone.qc /^void() old_idle43 =[ $old43, old_idle44 ] {};$/;" f +old_idle44 oldone.qc /^void() old_idle44 =[ $old44, old_idle45 ] {};$/;" f +old_idle45 oldone.qc /^void() old_idle45 =[ $old45, old_idle46 ] {};$/;" f +old_idle46 oldone.qc /^void() old_idle46 =[ $old46, old_idle1 ] {};$/;" f +old_idle5 oldone.qc /^void() old_idle5 =[ $old5, old_idle6 ] {};$/;" f +old_idle6 oldone.qc /^void() old_idle6 =[ $old6, old_idle7 ] {};$/;" f +old_idle7 oldone.qc /^void() old_idle7 =[ $old7, old_idle8 ] {};$/;" f +old_idle8 oldone.qc /^void() old_idle8 =[ $old8, old_idle9 ] {};$/;" f +old_idle9 oldone.qc /^void() old_idle9 =[ $old9, old_idle10 ] {};$/;" f +old_thrash1 oldone.qc /^void() old_thrash1 =[ $shake1, old_thrash2 ] {lightstyle(0, "m");};$/;" f +old_thrash10 oldone.qc /^void() old_thrash10 =[ $shake10, old_thrash11 ] {lightstyle(0, "e");};$/;" f +old_thrash11 oldone.qc /^void() old_thrash11 =[ $shake11, old_thrash12 ] {lightstyle(0, "g");};$/;" f +old_thrash12 oldone.qc /^void() old_thrash12 =[ $shake12, old_thrash13 ] {lightstyle(0, "i");};$/;" f +old_thrash13 oldone.qc /^void() old_thrash13 =[ $shake13, old_thrash14 ] {lightstyle(0, "k");};$/;" f +old_thrash14 oldone.qc /^void() old_thrash14 =[ $shake14, old_thrash15 ] {lightstyle(0, "m");};$/;" f +old_thrash15 oldone.qc /^void() old_thrash15 =[ $shake15, old_thrash16 ] {lightstyle(0, "m");$/;" f +old_thrash16 oldone.qc /^void() old_thrash16 =[ $shake16, old_thrash17 ] {lightstyle(0, "g");};$/;" f +old_thrash17 oldone.qc /^void() old_thrash17 =[ $shake17, old_thrash18 ] {lightstyle(0, "c");};$/;" f +old_thrash18 oldone.qc /^void() old_thrash18 =[ $shake18, old_thrash19 ] {lightstyle(0, "b");};$/;" f +old_thrash19 oldone.qc /^void() old_thrash19 =[ $shake19, old_thrash20 ] {lightstyle(0, "a");};$/;" f +old_thrash2 oldone.qc /^void() old_thrash2 =[ $shake2, old_thrash3 ] {lightstyle(0, "k");};$/;" f +old_thrash20 oldone.qc /^void() old_thrash20 =[ $shake20, old_thrash20 ] {finale_4();};$/;" f +old_thrash3 oldone.qc /^void() old_thrash3 =[ $shake3, old_thrash4 ] {lightstyle(0, "k");};$/;" f +old_thrash4 oldone.qc /^void() old_thrash4 =[ $shake4, old_thrash5 ] {lightstyle(0, "i");};$/;" f +old_thrash5 oldone.qc /^void() old_thrash5 =[ $shake5, old_thrash6 ] {lightstyle(0, "g");};$/;" f +old_thrash6 oldone.qc /^void() old_thrash6 =[ $shake6, old_thrash7 ] {lightstyle(0, "e");};$/;" f +old_thrash7 oldone.qc /^void() old_thrash7 =[ $shake7, old_thrash8 ] {lightstyle(0, "c");};$/;" f +old_thrash8 oldone.qc /^void() old_thrash8 =[ $shake8, old_thrash9 ] {lightstyle(0, "a");};$/;" f +old_thrash9 oldone.qc /^void() old_thrash9 =[ $shake9, old_thrash10 ] {lightstyle(0, "c");};$/;" f +oncount_use asstech.qc /^void() oncount_use =$/;" f +particle defs.qc /^void(vector o, vector d, float color, float count) particle = #48;\/\/ start a particle effect$/;" f +particlefield_XY asstech.qc /^void () particlefield_XY =$/;" f +particlefield_XY grid.qc /^void () particlefield_XY =$/;" f +particlefield_XZ asstech.qc /^void() particlefield_XZ =$/;" f +particlefield_XZ grid.qc /^void () particlefield_XZ =$/;" f +particlefield_YZ asstech.qc /^void () particlefield_YZ =$/;" f +particlefield_YZ grid.qc /^void () particlefield_YZ =$/;" f +particlefield_touch asstech.qc /^void () particlefield_touch =$/;" f +particlefield_touch grid.qc /^void () particlefield_touch =$/;" f +path_corner ai.qc /^void() path_corner =$/;" f +pellet_fire asstech.qc /^void (vector org, vector dir) pellet_fire =$/;" f +pellet_remove asstech.qc /^void () pellet_remove =$/;" f +pellet_think asstech.qc /^void () pellet_think =$/;" f +pellet_touch asstech.qc /^void () pellet_touch =$/;" f +pelletlauncher_think asstech.qc /^void() pelletlauncher_think = $/;" f +plat_center_touch plats.qc /^void() plat_center_touch =$/;" f +plat_crush plats.qc /^void() plat_crush =$/;" f +plat_go_down plats.qc /^void() plat_go_down =$/;" f +plat_go_up plats.qc /^void() plat_go_up =$/;" f +plat_hit_bottom plats.qc /^void() plat_hit_bottom =$/;" f +plat_hit_top plats.qc /^void() plat_hit_top =$/;" f +plat_outside_touch plats.qc /^void() plat_outside_touch =$/;" f +plat_spawn_inside_trigger plats.qc /^void() plat_spawn_inside_trigger =$/;" f +plat_trigger_use plats.qc /^void() plat_trigger_use =$/;" f +plat_use plats.qc /^void() plat_use =$/;" f +play_teleport triggers.qc /^void() play_teleport =$/;" f +player_axe1 player.qc /^void() player_axe1 = [$axatt1, player_axe2 ] {self.weaponframe=1;};$/;" f +player_axe2 player.qc /^void() player_axe2 = [$axatt2, player_axe3 ] {self.weaponframe=2;};$/;" f +player_axe3 player.qc /^void() player_axe3 = [$axatt3, player_axe4 ] {self.weaponframe=3;W_FireAxe();};$/;" f +player_axe4 player.qc /^void() player_axe4 = [$axatt4, player_run ] {self.weaponframe=4;};$/;" f +player_axeb1 player.qc /^void() player_axeb1 = [$axattb1, player_axeb2 ] {self.weaponframe=5;};$/;" f +player_axeb2 player.qc /^void() player_axeb2 = [$axattb2, player_axeb3 ] {self.weaponframe=6;};$/;" f +player_axeb3 player.qc /^void() player_axeb3 = [$axattb3, player_axeb4 ] {self.weaponframe=7;W_FireAxe();};$/;" f +player_axeb4 player.qc /^void() player_axeb4 = [$axattb4, player_run ] {self.weaponframe=8;};$/;" f +player_axec1 player.qc /^void() player_axec1 = [$axattc1, player_axec2 ] {self.weaponframe=1;};$/;" f +player_axec2 player.qc /^void() player_axec2 = [$axattc2, player_axec3 ] {self.weaponframe=2;};$/;" f +player_axec3 player.qc /^void() player_axec3 = [$axattc3, player_axec4 ] {self.weaponframe=3;W_FireAxe();};$/;" f +player_axec4 player.qc /^void() player_axec4 = [$axattc4, player_run ] {self.weaponframe=4;};$/;" f +player_axed1 player.qc /^void() player_axed1 = [$axattd1, player_axed2 ] {self.weaponframe=5;};$/;" f +player_axed2 player.qc /^void() player_axed2 = [$axattd2, player_axed3 ] {self.weaponframe=6;};$/;" f +player_axed3 player.qc /^void() player_axed3 = [$axattd3, player_axed4 ] {self.weaponframe=7;W_FireAxe();};$/;" f +player_axed4 player.qc /^void() player_axed4 = [$axattd4, player_run ] {self.weaponframe=8;};$/;" f +player_axpain1 player.qc /^void() player_axpain1 = [ $axpain1, player_axpain2 ] {PainSound();self.weaponframe=0;};$/;" f +player_axpain2 player.qc /^void() player_axpain2 = [ $axpain2, player_axpain3 ] {};$/;" f +player_axpain3 player.qc /^void() player_axpain3 = [ $axpain3, player_axpain4 ] {};$/;" f +player_axpain4 player.qc /^void() player_axpain4 = [ $axpain4, player_axpain5 ] {};$/;" f +player_axpain5 player.qc /^void() player_axpain5 = [ $axpain5, player_axpain6 ] {};$/;" f +player_axpain6 player.qc /^void() player_axpain6 = [ $axpain6, player_run ] {};$/;" f +player_die_ax1 player.qc /^void() player_die_ax1 = [ $axdeth1, player_die_ax2 ] {};$/;" f +player_die_ax2 player.qc /^void() player_die_ax2 = [ $axdeth2, player_die_ax3 ] {};$/;" f +player_die_ax3 player.qc /^void() player_die_ax3 = [ $axdeth3, player_die_ax4 ] {};$/;" f +player_die_ax4 player.qc /^void() player_die_ax4 = [ $axdeth4, player_die_ax5 ] {};$/;" f +player_die_ax5 player.qc /^void() player_die_ax5 = [ $axdeth5, player_die_ax6 ] {};$/;" f +player_die_ax6 player.qc /^void() player_die_ax6 = [ $axdeth6, player_die_ax7 ] {};$/;" f +player_die_ax7 player.qc /^void() player_die_ax7 = [ $axdeth7, player_die_ax8 ] {};$/;" f +player_die_ax8 player.qc /^void() player_die_ax8 = [ $axdeth8, player_die_ax9 ] {};$/;" f +player_die_ax9 player.qc /^void() player_die_ax9 = [ $axdeth9, player_die_ax9 ] {PlayerDead();};$/;" f +player_diea1 player.qc /^void() player_diea1 = [ $deatha1, player_diea2 ] {};$/;" f +player_diea10 player.qc /^void() player_diea10 = [ $deatha10, player_diea11 ] {};$/;" f +player_diea11 player.qc /^void() player_diea11 = [ $deatha11, player_diea11 ] {PlayerDead();};$/;" f +player_diea2 player.qc /^void() player_diea2 = [ $deatha2, player_diea3 ] {};$/;" f +player_diea3 player.qc /^void() player_diea3 = [ $deatha3, player_diea4 ] {};$/;" f +player_diea4 player.qc /^void() player_diea4 = [ $deatha4, player_diea5 ] {};$/;" f +player_diea5 player.qc /^void() player_diea5 = [ $deatha5, player_diea6 ] {};$/;" f +player_diea6 player.qc /^void() player_diea6 = [ $deatha6, player_diea7 ] {};$/;" f +player_diea7 player.qc /^void() player_diea7 = [ $deatha7, player_diea8 ] {};$/;" f +player_diea8 player.qc /^void() player_diea8 = [ $deatha8, player_diea9 ] {};$/;" f +player_diea9 player.qc /^void() player_diea9 = [ $deatha9, player_diea10 ] {};$/;" f +player_dieb1 player.qc /^void() player_dieb1 = [ $deathb1, player_dieb2 ] {};$/;" f +player_dieb2 player.qc /^void() player_dieb2 = [ $deathb2, player_dieb3 ] {};$/;" f +player_dieb3 player.qc /^void() player_dieb3 = [ $deathb3, player_dieb4 ] {};$/;" f +player_dieb4 player.qc /^void() player_dieb4 = [ $deathb4, player_dieb5 ] {};$/;" f +player_dieb5 player.qc /^void() player_dieb5 = [ $deathb5, player_dieb6 ] {};$/;" f +player_dieb6 player.qc /^void() player_dieb6 = [ $deathb6, player_dieb7 ] {};$/;" f +player_dieb7 player.qc /^void() player_dieb7 = [ $deathb7, player_dieb8 ] {};$/;" f +player_dieb8 player.qc /^void() player_dieb8 = [ $deathb8, player_dieb9 ] {};$/;" f +player_dieb9 player.qc /^void() player_dieb9 = [ $deathb9, player_dieb9 ] {PlayerDead();};$/;" f +player_diec1 player.qc /^void() player_diec1 = [ $deathc1, player_diec2 ] {};$/;" f +player_diec10 player.qc /^void() player_diec10 = [ $deathc10, player_diec11 ] {};$/;" f +player_diec11 player.qc /^void() player_diec11 = [ $deathc11, player_diec12 ] {};$/;" f +player_diec12 player.qc /^void() player_diec12 = [ $deathc12, player_diec13 ] {};$/;" f +player_diec13 player.qc /^void() player_diec13 = [ $deathc13, player_diec14 ] {};$/;" f +player_diec14 player.qc /^void() player_diec14 = [ $deathc14, player_diec15 ] {};$/;" f +player_diec15 player.qc /^void() player_diec15 = [ $deathc15, player_diec15 ] {PlayerDead();};$/;" f +player_diec2 player.qc /^void() player_diec2 = [ $deathc2, player_diec3 ] {};$/;" f +player_diec3 player.qc /^void() player_diec3 = [ $deathc3, player_diec4 ] {};$/;" f +player_diec4 player.qc /^void() player_diec4 = [ $deathc4, player_diec5 ] {};$/;" f +player_diec5 player.qc /^void() player_diec5 = [ $deathc5, player_diec6 ] {};$/;" f +player_diec6 player.qc /^void() player_diec6 = [ $deathc6, player_diec7 ] {};$/;" f +player_diec7 player.qc /^void() player_diec7 = [ $deathc7, player_diec8 ] {};$/;" f +player_diec8 player.qc /^void() player_diec8 = [ $deathc8, player_diec9 ] {};$/;" f +player_diec9 player.qc /^void() player_diec9 = [ $deathc9, player_diec10 ] {};$/;" f +player_died1 player.qc /^void() player_died1 = [ $deathd1, player_died2 ] {};$/;" f +player_died2 player.qc /^void() player_died2 = [ $deathd2, player_died3 ] {};$/;" f +player_died3 player.qc /^void() player_died3 = [ $deathd3, player_died4 ] {};$/;" f +player_died4 player.qc /^void() player_died4 = [ $deathd4, player_died5 ] {};$/;" f +player_died5 player.qc /^void() player_died5 = [ $deathd5, player_died6 ] {};$/;" f +player_died6 player.qc /^void() player_died6 = [ $deathd6, player_died7 ] {};$/;" f +player_died7 player.qc /^void() player_died7 = [ $deathd7, player_died8 ] {};$/;" f +player_died8 player.qc /^void() player_died8 = [ $deathd8, player_died9 ] {};$/;" f +player_died9 player.qc /^void() player_died9 = [ $deathd9, player_died9 ] {PlayerDead();};$/;" f +player_diee1 player.qc /^void() player_diee1 = [ $deathe1, player_diee2 ] {};$/;" f +player_diee2 player.qc /^void() player_diee2 = [ $deathe2, player_diee3 ] {};$/;" f +player_diee3 player.qc /^void() player_diee3 = [ $deathe3, player_diee4 ] {};$/;" f +player_diee4 player.qc /^void() player_diee4 = [ $deathe4, player_diee5 ] {};$/;" f +player_diee5 player.qc /^void() player_diee5 = [ $deathe5, player_diee6 ] {};$/;" f +player_diee6 player.qc /^void() player_diee6 = [ $deathe6, player_diee7 ] {};$/;" f +player_diee7 player.qc /^void() player_diee7 = [ $deathe7, player_diee8 ] {};$/;" f +player_diee8 player.qc /^void() player_diee8 = [ $deathe8, player_diee9 ] {};$/;" f +player_diee9 player.qc /^void() player_diee9 = [ $deathe9, player_diee9 ] {PlayerDead();};$/;" f +player_grip1 portal.qc /^void() player_grip1 = [$grip1, player_grip2] {self.weaponframe=1;};$/;" f +player_grip2 portal.qc /^void() player_grip2 = [$grip2, player_grip3] {self.weaponframe=2;};$/;" f +player_grip3 portal.qc /^void() player_grip3 = [$grip3, player_grip4] {self.weaponframe=3;GripFire();};$/;" f +player_grip4 portal.qc /^void() player_grip4 = [$grip4, player_grip5] {self.weaponframe=4;};$/;" f +player_grip5 portal.qc /^void() player_grip5 = [$grip5, player_grip6] {self.weaponframe=5;}; $/;" f +player_grip6 portal.qc /^void() player_grip6 = [$grip6, player_run] {self.weaponframe=6;};$/;" f +player_light1 player.qc /^void() player_light1 =[$light1, player_light2 ] $/;" f +player_light2 player.qc /^void() player_light2 =[$light2, player_light1 ]$/;" f +player_nail1 player.qc /^void() player_nail1 =[$nailatt1, player_nail2 ] $/;" f +player_nail2 player.qc /^void() player_nail2 =[$nailatt2, player_nail1 ]$/;" f +player_pain player.qc /^void() player_pain =$/;" f +player_pain1 player.qc /^void() player_pain1 = [ $pain1, player_pain2 ] {PainSound();self.weaponframe=0;};$/;" f +player_pain2 player.qc /^void() player_pain2 = [ $pain2, player_pain3 ] {};$/;" f +player_pain3 player.qc /^void() player_pain3 = [ $pain3, player_pain4 ] {};$/;" f +player_pain4 player.qc /^void() player_pain4 = [ $pain4, player_pain5 ] {};$/;" f +player_pain5 player.qc /^void() player_pain5 = [ $pain5, player_pain6 ] {};$/;" f +player_pain6 player.qc /^void() player_pain6 = [ $pain6, player_run ] {};$/;" f +player_portal1 portal.qc /^void() player_portal1 = [$portal1, player_portal2] {self.weaponframe=1;};$/;" f +player_portal2 portal.qc /^void() player_portal2 = [$portal2, player_portal3] {self.weaponframe=2;};$/;" f +player_portal3 portal.qc /^void() player_portal3 = [$portal3, player_portal4] {self.weaponframe=3;PortalFire();};$/;" f +player_portal4 portal.qc /^void() player_portal4 = [$portal4, player_portal5] {self.weaponframe=4;};$/;" f +player_portal5 portal.qc /^void() player_portal5 = [$portal5, player_run] {self.weaponframe=5;};$/;" f +player_rocket1 player.qc /^void() player_rocket1 =[$rockatt1, player_rocket2 ] {self.weaponframe=1;$/;" f +player_rocket2 player.qc /^void() player_rocket2 =[$rockatt2, player_rocket3 ] {self.weaponframe=2;};$/;" f +player_rocket3 player.qc /^void() player_rocket3 =[$rockatt3, player_rocket4 ] {self.weaponframe=3;};$/;" f +player_rocket4 player.qc /^void() player_rocket4 =[$rockatt4, player_rocket5 ] {self.weaponframe=4;};$/;" f +player_rocket5 player.qc /^void() player_rocket5 =[$rockatt5, player_rocket6 ] {self.weaponframe=5;};$/;" f +player_rocket6 player.qc /^void() player_rocket6 =[$rockatt6, player_run ] {self.weaponframe=6;};$/;" f +player_run player.qc /^void() player_run =[ $rockrun1, player_run ]$/;" f +player_shot1 player.qc /^void() player_shot1 = [$shotatt1, player_shot2 ] {self.weaponframe=1;$/;" f +player_shot2 player.qc /^void() player_shot2 = [$shotatt2, player_shot3 ] {self.weaponframe=2;};$/;" f +player_shot3 player.qc /^void() player_shot3 = [$shotatt3, player_shot4 ] {self.weaponframe=3;};$/;" f +player_shot4 player.qc /^void() player_shot4 = [$shotatt4, player_shot5 ] {self.weaponframe=4;};$/;" f +player_shot5 player.qc /^void() player_shot5 = [$shotatt5, player_shot6 ] {self.weaponframe=5;};$/;" f +player_shot6 player.qc /^void() player_shot6 = [$shotatt6, player_run ] {self.weaponframe=6;};$/;" f +player_stand1 player.qc /^void() player_stand1 =[ $axstnd1, player_stand1 ]$/;" f +pointcontents defs.qc /^float(vector v) pointcontents = #41; \/\/ returns a CONTENT_*$/;" f +portal_clip_player portal.qc /^vector(entity p) portal_clip_player = {$/;" f +portal_face portal.qc /^vector(vector org) portal_face = {$/;" f +powerup_touch items.qc /^void() powerup_touch =$/;" f +precache_file defs.qc /^string(string s) precache_file = #68; \/\/ no effect except for -copy$/;" f +precache_file2 defs.qc /^string(string s) precache_file2 = #77; \/\/ registered version only$/;" f +precache_model defs.qc /^string(string s) precache_model = #20;$/;" f +precache_model2 defs.qc /^string(string s) precache_model2 = #75; \/\/ registered version only$/;" f +precache_sound defs.qc /^string(string s) precache_sound = #19;$/;" f +precache_sound2 defs.qc /^string(string s) precache_sound2 = #76; \/\/ registered version only$/;" f +random defs.qc /^float() random = #7; \/\/ returns 0 - 1$/;" f +range ai.qc /^float(entity targ) range =$/;" f +remove defs.qc /^void(entity e) remove = #15;$/;" f +respawn client.qc /^void() respawn =$/;" f +rint defs.qc /^float(float v) rint = #36; \/\/ round to nearest int$/;" f +s_explode1 weapons.qc /^void() s_explode1 = [0, s_explode2] {};$/;" f +s_explode2 weapons.qc /^void() s_explode2 = [1, s_explode3] {};$/;" f +s_explode3 weapons.qc /^void() s_explode3 = [2, s_explode4] {};$/;" f +s_explode4 weapons.qc /^void() s_explode4 = [3, s_explode5] {};$/;" f +s_explode5 weapons.qc /^void() s_explode5 = [4, s_explode6] {};$/;" f +s_explode6 weapons.qc /^void() s_explode6 = [5, SUB_Remove] {};$/;" f +secret_blocked doors.qc /^void () secret_blocked =$/;" f +secret_touch doors.qc /^void() secret_touch =$/;" f +set_suicide_frame player.qc /^void() set_suicide_frame =$/;" f +setmodel defs.qc /^void(entity e, string m) setmodel = #3; \/\/ set movetype and solid first$/;" f +setorigin defs.qc /^void(entity e, vector o) setorigin = #2;$/;" f +setsize defs.qc /^void(entity e, vector min, vector max) setsize = #4;$/;" f +setspawnparms defs.qc /^void(entity e) setspawnparms = #78; \/\/ set parm1... to the$/;" f +shal_attack1 shalrath.qc /^void() shal_attack1 =[ $attack1, shal_attack2 ] {$/;" f +shal_attack10 shalrath.qc /^void() shal_attack10 =[ $attack10, shal_attack11 ] {ai_face();};$/;" f +shal_attack11 shalrath.qc /^void() shal_attack11 =[ $attack11, shal_run1 ] {};$/;" f +shal_attack2 shalrath.qc /^void() shal_attack2 =[ $attack2, shal_attack3 ] {ai_face();};$/;" f +shal_attack3 shalrath.qc /^void() shal_attack3 =[ $attack3, shal_attack4 ] {ai_face();};$/;" f +shal_attack4 shalrath.qc /^void() shal_attack4 =[ $attack4, shal_attack5 ] {ai_face();};$/;" f +shal_attack5 shalrath.qc /^void() shal_attack5 =[ $attack5, shal_attack6 ] {ai_face();};$/;" f +shal_attack6 shalrath.qc /^void() shal_attack6 =[ $attack6, shal_attack7 ] {ai_face();};$/;" f +shal_attack7 shalrath.qc /^void() shal_attack7 =[ $attack7, shal_attack8 ] {ai_face();};$/;" f +shal_attack8 shalrath.qc /^void() shal_attack8 =[ $attack8, shal_attack9 ] {ai_face();};$/;" f +shal_attack9 shalrath.qc /^void() shal_attack9 =[ $attack9, shal_attack10 ] {ShalMissile();};$/;" f +shal_death1 shalrath.qc /^void() shal_death1 =[ $death1, shal_death2 ] {};$/;" f +shal_death2 shalrath.qc /^void() shal_death2 =[ $death2, shal_death3 ] {};$/;" f +shal_death3 shalrath.qc /^void() shal_death3 =[ $death3, shal_death4 ] {};$/;" f +shal_death4 shalrath.qc /^void() shal_death4 =[ $death4, shal_death5 ] {};$/;" f +shal_death5 shalrath.qc /^void() shal_death5 =[ $death5, shal_death6 ] {};$/;" f +shal_death6 shalrath.qc /^void() shal_death6 =[ $death6, shal_death7 ] {};$/;" f +shal_death7 shalrath.qc /^void() shal_death7 =[ $death7, shal_death7 ] {};$/;" f +shal_pain1 shalrath.qc /^void() shal_pain1 =[ $pain1, shal_pain2 ] {};$/;" f +shal_pain2 shalrath.qc /^void() shal_pain2 =[ $pain2, shal_pain3 ] {};$/;" f +shal_pain3 shalrath.qc /^void() shal_pain3 =[ $pain3, shal_pain4 ] {};$/;" f +shal_pain4 shalrath.qc /^void() shal_pain4 =[ $pain4, shal_pain5 ] {};$/;" f +shal_pain5 shalrath.qc /^void() shal_pain5 =[ $pain5, shal_run1 ] {};$/;" f +shal_run1 shalrath.qc /^void() shal_run1 =[ $walk2, shal_run2 ] {$/;" f +shal_run10 shalrath.qc /^void() shal_run10 =[ $walk11, shal_run11 ] {ai_run(0);};$/;" f +shal_run11 shalrath.qc /^void() shal_run11 =[ $walk12, shal_run12 ] {ai_run(4);};$/;" f +shal_run12 shalrath.qc /^void() shal_run12 =[ $walk1, shal_run1 ] {ai_run(5);};$/;" f +shal_run2 shalrath.qc /^void() shal_run2 =[ $walk3, shal_run3 ] {ai_run(4);};$/;" f +shal_run3 shalrath.qc /^void() shal_run3 =[ $walk4, shal_run4 ] {ai_run(0);};$/;" f +shal_run4 shalrath.qc /^void() shal_run4 =[ $walk5, shal_run5 ] {ai_run(0);};$/;" f +shal_run5 shalrath.qc /^void() shal_run5 =[ $walk6, shal_run6 ] {ai_run(0);};$/;" f +shal_run6 shalrath.qc /^void() shal_run6 =[ $walk7, shal_run7 ] {ai_run(0);};$/;" f +shal_run7 shalrath.qc /^void() shal_run7 =[ $walk8, shal_run8 ] {ai_run(5);};$/;" f +shal_run8 shalrath.qc /^void() shal_run8 =[ $walk9, shal_run9 ] {ai_run(6);};$/;" f +shal_run9 shalrath.qc /^void() shal_run9 =[ $walk10, shal_run10 ] {ai_run(5);};$/;" f +shal_stand shalrath.qc /^void() shal_stand =[ $walk1, shal_stand ] {ai_stand();};$/;" f +shal_walk1 shalrath.qc /^void() shal_walk1 =[ $walk2, shal_walk2 ] {$/;" f +shal_walk10 shalrath.qc /^void() shal_walk10 =[ $walk11, shal_walk11 ] {ai_walk(0);};$/;" f +shal_walk11 shalrath.qc /^void() shal_walk11 =[ $walk12, shal_walk12 ] {ai_walk(4);};$/;" f +shal_walk12 shalrath.qc /^void() shal_walk12 =[ $walk1, shal_walk1 ] {ai_walk(5);};$/;" f +shal_walk2 shalrath.qc /^void() shal_walk2 =[ $walk3, shal_walk3 ] {ai_walk(4);};$/;" f +shal_walk3 shalrath.qc /^void() shal_walk3 =[ $walk4, shal_walk4 ] {ai_walk(0);};$/;" f +shal_walk4 shalrath.qc /^void() shal_walk4 =[ $walk5, shal_walk5 ] {ai_walk(0);};$/;" f +shal_walk5 shalrath.qc /^void() shal_walk5 =[ $walk6, shal_walk6 ] {ai_walk(0);};$/;" f +shal_walk6 shalrath.qc /^void() shal_walk6 =[ $walk7, shal_walk7 ] {ai_walk(0);};$/;" f +shal_walk7 shalrath.qc /^void() shal_walk7 =[ $walk8, shal_walk8 ] {ai_walk(5);};$/;" f +shal_walk8 shalrath.qc /^void() shal_walk8 =[ $walk9, shal_walk9 ] {ai_walk(6);};$/;" f +shal_walk9 shalrath.qc /^void() shal_walk9 =[ $walk10, shal_walk10 ] {ai_walk(5);};$/;" f +shalrath_die shalrath.qc /^void() shalrath_die =$/;" f +shalrath_pain shalrath.qc /^void() shalrath_pain =$/;" f +sham_death1 shambler.qc /^void() sham_death1 =[ $death1, sham_death2 ] {};$/;" f +sham_death10 shambler.qc /^void() sham_death10 =[ $death10, sham_death11 ] {};$/;" f +sham_death11 shambler.qc /^void() sham_death11 =[ $death11, sham_death11 ] {};$/;" f +sham_death2 shambler.qc /^void() sham_death2 =[ $death2, sham_death3 ] {};$/;" f +sham_death3 shambler.qc /^void() sham_death3 =[ $death3, sham_death4 ] {self.solid = SOLID_NOT;};$/;" f +sham_death4 shambler.qc /^void() sham_death4 =[ $death4, sham_death5 ] {};$/;" f +sham_death5 shambler.qc /^void() sham_death5 =[ $death5, sham_death6 ] {};$/;" f +sham_death6 shambler.qc /^void() sham_death6 =[ $death6, sham_death7 ] {};$/;" f +sham_death7 shambler.qc /^void() sham_death7 =[ $death7, sham_death8 ] {};$/;" f +sham_death8 shambler.qc /^void() sham_death8 =[ $death8, sham_death9 ] {};$/;" f +sham_death9 shambler.qc /^void() sham_death9 =[ $death9, sham_death10 ] {};$/;" f +sham_die shambler.qc /^void() sham_die =$/;" f +sham_magic1 shambler.qc /^void() sham_magic1 =[ $magic1, sham_magic2 ] {ai_face();$/;" f +sham_magic10 shambler.qc /^void() sham_magic10 =[ $magic10, sham_magic11 ]$/;" f +sham_magic11 shambler.qc /^void() sham_magic11 =[ $magic11, sham_magic12 ]$/;" f +sham_magic12 shambler.qc /^void() sham_magic12 =[ $magic12, sham_run1 ] {};$/;" f +sham_magic2 shambler.qc /^void() sham_magic2 =[ $magic2, sham_magic3 ] {ai_face();};$/;" f +sham_magic3 shambler.qc /^void() sham_magic3 =[ $magic3, sham_magic4 ] {ai_face();self.nextthink = self.nextthink + 0.2;$/;" f +sham_magic4 shambler.qc /^void() sham_magic4 =[ $magic4, sham_magic5 ]$/;" f +sham_magic5 shambler.qc /^void() sham_magic5 =[ $magic5, sham_magic6 ]$/;" f +sham_magic6 shambler.qc /^void() sham_magic6 =[ $magic6, sham_magic9 ]$/;" f +sham_magic9 shambler.qc /^void() sham_magic9 =[ $magic9, sham_magic10 ]$/;" f +sham_melee shambler.qc /^void() sham_melee =$/;" f +sham_pain shambler.qc /^void(entity attacker, float damage) sham_pain =$/;" f +sham_pain1 shambler.qc /^void() sham_pain1 =[ $pain1, sham_pain2 ] {};$/;" f +sham_pain2 shambler.qc /^void() sham_pain2 =[ $pain2, sham_pain3 ] {};$/;" f +sham_pain3 shambler.qc /^void() sham_pain3 =[ $pain3, sham_pain4 ] {};$/;" f +sham_pain4 shambler.qc /^void() sham_pain4 =[ $pain4, sham_pain5 ] {};$/;" f +sham_pain5 shambler.qc /^void() sham_pain5 =[ $pain5, sham_pain6 ] {};$/;" f +sham_pain6 shambler.qc /^void() sham_pain6 =[ $pain6, sham_run1 ] {};$/;" f +sham_run1 shambler.qc /^void() sham_run1 =[ $run1, sham_run2 ] {ai_run(20);};$/;" f +sham_run2 shambler.qc /^void() sham_run2 =[ $run2, sham_run3 ] {ai_run(24);};$/;" f +sham_run3 shambler.qc /^void() sham_run3 =[ $run3, sham_run4 ] {ai_run(20);};$/;" f +sham_run4 shambler.qc /^void() sham_run4 =[ $run4, sham_run5 ] {ai_run(20);};$/;" f +sham_run5 shambler.qc /^void() sham_run5 =[ $run5, sham_run6 ] {ai_run(24);};$/;" f +sham_run6 shambler.qc /^void() sham_run6 =[ $run6, sham_run1 ] {ai_run(20);$/;" f +sham_smash1 shambler.qc /^void() sham_smash1 =[ $smash1, sham_smash2 ] {$/;" f +sham_smash10 shambler.qc /^void() sham_smash10 =[ $smash10, sham_smash11 ] {$/;" f +sham_smash11 shambler.qc /^void() sham_smash11 =[ $smash11, sham_smash12 ] {ai_charge(5);};$/;" f +sham_smash12 shambler.qc /^void() sham_smash12 =[ $smash12, sham_run1 ] {ai_charge(4);};$/;" f +sham_smash2 shambler.qc /^void() sham_smash2 =[ $smash2, sham_smash3 ] {ai_charge(6);};$/;" f +sham_smash3 shambler.qc /^void() sham_smash3 =[ $smash3, sham_smash4 ] {ai_charge(6);};$/;" f +sham_smash4 shambler.qc /^void() sham_smash4 =[ $smash4, sham_smash5 ] {ai_charge(5);};$/;" f +sham_smash5 shambler.qc /^void() sham_smash5 =[ $smash5, sham_smash6 ] {ai_charge(4);};$/;" f +sham_smash6 shambler.qc /^void() sham_smash6 =[ $smash6, sham_smash7 ] {ai_charge(1);};$/;" f +sham_smash7 shambler.qc /^void() sham_smash7 =[ $smash7, sham_smash8 ] {ai_charge(0);};$/;" f +sham_smash8 shambler.qc /^void() sham_smash8 =[ $smash8, sham_smash9 ] {ai_charge(0);};$/;" f +sham_smash9 shambler.qc /^void() sham_smash9 =[ $smash9, sham_smash10 ] {ai_charge(0);};$/;" f +sham_stand1 shambler.qc /^void() sham_stand1 =[ $stand1, sham_stand2 ] {ai_stand();};$/;" f +sham_stand10 shambler.qc /^void() sham_stand10 =[ $stand10, sham_stand11] {ai_stand();};$/;" f +sham_stand11 shambler.qc /^void() sham_stand11 =[ $stand11, sham_stand12] {ai_stand();};$/;" f +sham_stand12 shambler.qc /^void() sham_stand12 =[ $stand12, sham_stand13] {ai_stand();};$/;" f +sham_stand13 shambler.qc /^void() sham_stand13 =[ $stand13, sham_stand14] {ai_stand();};$/;" f +sham_stand14 shambler.qc /^void() sham_stand14 =[ $stand14, sham_stand15] {ai_stand();};$/;" f +sham_stand15 shambler.qc /^void() sham_stand15 =[ $stand15, sham_stand16] {ai_stand();};$/;" f +sham_stand16 shambler.qc /^void() sham_stand16 =[ $stand16, sham_stand17] {ai_stand();};$/;" f +sham_stand17 shambler.qc /^void() sham_stand17 =[ $stand17, sham_stand1 ] {ai_stand();};$/;" f +sham_stand2 shambler.qc /^void() sham_stand2 =[ $stand2, sham_stand3 ] {ai_stand();};$/;" f +sham_stand3 shambler.qc /^void() sham_stand3 =[ $stand3, sham_stand4 ] {ai_stand();};$/;" f +sham_stand4 shambler.qc /^void() sham_stand4 =[ $stand4, sham_stand5 ] {ai_stand();};$/;" f +sham_stand5 shambler.qc /^void() sham_stand5 =[ $stand5, sham_stand6 ] {ai_stand();};$/;" f +sham_stand6 shambler.qc /^void() sham_stand6 =[ $stand6, sham_stand7 ] {ai_stand();};$/;" f +sham_stand7 shambler.qc /^void() sham_stand7 =[ $stand7, sham_stand8 ] {ai_stand();};$/;" f +sham_stand8 shambler.qc /^void() sham_stand8 =[ $stand8, sham_stand9 ] {ai_stand();};$/;" f +sham_stand9 shambler.qc /^void() sham_stand9 =[ $stand9, sham_stand10] {ai_stand();};$/;" f +sham_swingl1 shambler.qc /^void() sham_swingl1 =[ $swingl1, sham_swingl2 ] {$/;" f +sham_swingl2 shambler.qc /^void() sham_swingl2 =[ $swingl2, sham_swingl3 ] {ai_charge(3);};$/;" f +sham_swingl3 shambler.qc /^void() sham_swingl3 =[ $swingl3, sham_swingl4 ] {ai_charge(7);};$/;" f +sham_swingl4 shambler.qc /^void() sham_swingl4 =[ $swingl4, sham_swingl5 ] {ai_charge(3);};$/;" f +sham_swingl5 shambler.qc /^void() sham_swingl5 =[ $swingl5, sham_swingl6 ] {ai_charge(7);};$/;" f +sham_swingl6 shambler.qc /^void() sham_swingl6 =[ $swingl6, sham_swingl7 ] {ai_charge(9);};$/;" f +sham_swingl7 shambler.qc /^void() sham_swingl7 =[ $swingl7, sham_swingl8 ] {ai_charge(5); ShamClaw(250);};$/;" f +sham_swingl8 shambler.qc /^void() sham_swingl8 =[ $swingl8, sham_swingl9 ] {ai_charge(4);};$/;" f +sham_swingl9 shambler.qc /^void() sham_swingl9 =[ $swingl9, sham_run1 ] {$/;" f +sham_swingr1 shambler.qc /^void() sham_swingr1 =[ $swingr1, sham_swingr2 ] {$/;" f +sham_swingr2 shambler.qc /^void() sham_swingr2 =[ $swingr2, sham_swingr3 ] {ai_charge(8);};$/;" f +sham_swingr3 shambler.qc /^void() sham_swingr3 =[ $swingr3, sham_swingr4 ] {ai_charge(14);};$/;" f +sham_swingr4 shambler.qc /^void() sham_swingr4 =[ $swingr4, sham_swingr5 ] {ai_charge(7);};$/;" f +sham_swingr5 shambler.qc /^void() sham_swingr5 =[ $swingr5, sham_swingr6 ] {ai_charge(3);};$/;" f +sham_swingr6 shambler.qc /^void() sham_swingr6 =[ $swingr6, sham_swingr7 ] {ai_charge(6);};$/;" f +sham_swingr7 shambler.qc /^void() sham_swingr7 =[ $swingr7, sham_swingr8 ] {ai_charge(6); ShamClaw(-250);};$/;" f +sham_swingr8 shambler.qc /^void() sham_swingr8 =[ $swingr8, sham_swingr9 ] {ai_charge(3);};$/;" f +sham_swingr9 shambler.qc /^void() sham_swingr9 =[ $swingr9, sham_run1 ] {ai_charge(1);$/;" f +sham_walk1 shambler.qc /^void() sham_walk1 =[ $walk1, sham_walk2 ] {ai_walk(10);};$/;" f +sham_walk10 shambler.qc /^void() sham_walk10 =[ $walk10, sham_walk11] {ai_walk(9);};$/;" f +sham_walk11 shambler.qc /^void() sham_walk11 =[ $walk11, sham_walk12] {ai_walk(7);};$/;" f +sham_walk12 shambler.qc /^void() sham_walk12 =[ $walk12, sham_walk1 ] {ai_walk(7);$/;" f +sham_walk2 shambler.qc /^void() sham_walk2 =[ $walk2, sham_walk3 ] {ai_walk(9);};$/;" f +sham_walk3 shambler.qc /^void() sham_walk3 =[ $walk3, sham_walk4 ] {ai_walk(9);};$/;" f +sham_walk4 shambler.qc /^void() sham_walk4 =[ $walk4, sham_walk5 ] {ai_walk(5);};$/;" f +sham_walk5 shambler.qc /^void() sham_walk5 =[ $walk5, sham_walk6 ] {ai_walk(6);};$/;" f +sham_walk6 shambler.qc /^void() sham_walk6 =[ $walk6, sham_walk7 ] {ai_walk(12);};$/;" f +sham_walk7 shambler.qc /^void() sham_walk7 =[ $walk7, sham_walk8 ] {ai_walk(8);};$/;" f +sham_walk8 shambler.qc /^void() sham_walk8 =[ $walk8, sham_walk9 ] {ai_walk(3);};$/;" f +sham_walk9 shambler.qc /^void() sham_walk9 =[ $walk9, sham_walk10] {ai_walk(13);};$/;" f +shooter_think misc.qc /^void() shooter_think =$/;" f +sigil_touch items.qc /^void() sigil_touch =$/;" f +sound defs.qc /^void(entity e, float chan, string samp, float vol, float atten) sound = #8;$/;" f +spawn defs.qc /^entity() spawn = #14;$/;" f +spawn_field doors.qc /^entity(vector fmins, vector fmaxs) spawn_field =$/;" f +spawn_tdeath triggers.qc /^void(vector org, entity death_owner) spawn_tdeath =$/;" f +spawn_tfog triggers.qc /^void(vector org) spawn_tfog =$/;" f +spawn_touchblood weapons.qc /^void(float damage) spawn_touchblood =$/;" f +spike_touch weapons.qc /^void() spike_touch =$/;" f +spikeshooter_use misc.qc /^void() spikeshooter_use =$/;" f +sprint defs.qc /^void(entity client, string s) sprint = #24;$/;" f +stuffcmd defs.qc /^void(entity client, string s)stuffcmd = #21;$/;" f +superspike_touch weapons.qc /^void() superspike_touch =$/;" f +swimmonster_start monsters.qc /^void() swimmonster_start =$/;" f +swimmonster_start_go monsters.qc /^void() swimmonster_start_go =$/;" f +t_movetarget ai.qc /^void() t_movetarget =$/;" f +tbaby_die1 tarbaby.qc /^void() tbaby_die1 =[ $exp, tbaby_die2 ] {$/;" f +tbaby_die2 tarbaby.qc /^void() tbaby_die2 =[ $exp, tbaby_run1 ] $/;" f +tbaby_fly1 tarbaby.qc /^void() tbaby_fly1 =[ $fly1, tbaby_fly2 ] {};$/;" f +tbaby_fly2 tarbaby.qc /^void() tbaby_fly2 =[ $fly2, tbaby_fly3 ] {};$/;" f +tbaby_fly3 tarbaby.qc /^void() tbaby_fly3 =[ $fly3, tbaby_fly4 ] {};$/;" f +tbaby_fly4 tarbaby.qc /^void() tbaby_fly4 =[ $fly4, tbaby_fly1 ] {$/;" f +tbaby_hang1 tarbaby.qc /^void() tbaby_hang1 =[ $walk1, tbaby_hang1 ] {ai_stand();};$/;" f +tbaby_jump1 tarbaby.qc /^void() tbaby_jump1 =[ $jump1, tbaby_jump2 ] {ai_face();};$/;" f +tbaby_jump2 tarbaby.qc /^void() tbaby_jump2 =[ $jump2, tbaby_jump3 ] {ai_face();};$/;" f +tbaby_jump3 tarbaby.qc /^void() tbaby_jump3 =[ $jump3, tbaby_jump4 ] {ai_face();};$/;" f +tbaby_jump4 tarbaby.qc /^void() tbaby_jump4 =[ $jump4, tbaby_jump5 ] {ai_face();};$/;" f +tbaby_jump5 tarbaby.qc /^void() tbaby_jump5 =[ $jump5, tbaby_jump6 ]$/;" f +tbaby_jump6 tarbaby.qc /^void() tbaby_jump6 =[ $jump6,tbaby_fly1 ] {};$/;" f +tbaby_run1 tarbaby.qc /^void() tbaby_run1 =[ $run1, tbaby_run2 ] {ai_face();};$/;" f +tbaby_run10 tarbaby.qc /^void() tbaby_run10 =[ $run10, tbaby_run11 ] {ai_face();};$/;" f +tbaby_run11 tarbaby.qc /^void() tbaby_run11 =[ $run11, tbaby_run12 ] {ai_run(2);};$/;" f +tbaby_run12 tarbaby.qc /^void() tbaby_run12 =[ $run12, tbaby_run13 ] {ai_run(2);};$/;" f +tbaby_run13 tarbaby.qc /^void() tbaby_run13 =[ $run13, tbaby_run14 ] {ai_run(2);};$/;" f +tbaby_run14 tarbaby.qc /^void() tbaby_run14 =[ $run14, tbaby_run15 ] {ai_run(2);};$/;" f +tbaby_run15 tarbaby.qc /^void() tbaby_run15 =[ $run15, tbaby_run16 ] {ai_run(2);};$/;" f +tbaby_run16 tarbaby.qc /^void() tbaby_run16 =[ $run16, tbaby_run17 ] {ai_run(2);};$/;" f +tbaby_run17 tarbaby.qc /^void() tbaby_run17 =[ $run17, tbaby_run18 ] {ai_run(2);};$/;" f +tbaby_run18 tarbaby.qc /^void() tbaby_run18 =[ $run18, tbaby_run19 ] {ai_run(2);};$/;" f +tbaby_run19 tarbaby.qc /^void() tbaby_run19 =[ $run19, tbaby_run20 ] {ai_run(2);};$/;" f +tbaby_run2 tarbaby.qc /^void() tbaby_run2 =[ $run2, tbaby_run3 ] {ai_face();};$/;" f +tbaby_run20 tarbaby.qc /^void() tbaby_run20 =[ $run20, tbaby_run21 ] {ai_run(2);};$/;" f +tbaby_run21 tarbaby.qc /^void() tbaby_run21 =[ $run21, tbaby_run22 ] {ai_run(2);};$/;" f +tbaby_run22 tarbaby.qc /^void() tbaby_run22 =[ $run22, tbaby_run23 ] {ai_run(2);};$/;" f +tbaby_run23 tarbaby.qc /^void() tbaby_run23 =[ $run23, tbaby_run24 ] {ai_run(2);};$/;" f +tbaby_run24 tarbaby.qc /^void() tbaby_run24 =[ $run24, tbaby_run25 ] {ai_run(2);};$/;" f +tbaby_run25 tarbaby.qc /^void() tbaby_run25 =[ $run25, tbaby_run1 ] {ai_run(2);};$/;" f +tbaby_run3 tarbaby.qc /^void() tbaby_run3 =[ $run3, tbaby_run4 ] {ai_face();};$/;" f +tbaby_run4 tarbaby.qc /^void() tbaby_run4 =[ $run4, tbaby_run5 ] {ai_face();};$/;" f +tbaby_run5 tarbaby.qc /^void() tbaby_run5 =[ $run5, tbaby_run6 ] {ai_face();};$/;" f +tbaby_run6 tarbaby.qc /^void() tbaby_run6 =[ $run6, tbaby_run7 ] {ai_face();};$/;" f +tbaby_run7 tarbaby.qc /^void() tbaby_run7 =[ $run7, tbaby_run8 ] {ai_face();};$/;" f +tbaby_run8 tarbaby.qc /^void() tbaby_run8 =[ $run8, tbaby_run9 ] {ai_face();};$/;" f +tbaby_run9 tarbaby.qc /^void() tbaby_run9 =[ $run9, tbaby_run10 ] {ai_face();};$/;" f +tbaby_stand1 tarbaby.qc /^void() tbaby_stand1 =[ $walk1, tbaby_stand1 ] {ai_stand();};$/;" f +tbaby_walk1 tarbaby.qc /^void() tbaby_walk1 =[ $walk1, tbaby_walk2 ] {ai_turn();};$/;" f +tbaby_walk10 tarbaby.qc /^void() tbaby_walk10 =[ $walk10, tbaby_walk11 ] {ai_turn();};$/;" f +tbaby_walk11 tarbaby.qc /^void() tbaby_walk11 =[ $walk11, tbaby_walk12 ] {ai_walk(2);};$/;" f +tbaby_walk12 tarbaby.qc /^void() tbaby_walk12 =[ $walk12, tbaby_walk13 ] {ai_walk(2);};$/;" f +tbaby_walk13 tarbaby.qc /^void() tbaby_walk13 =[ $walk13, tbaby_walk14 ] {ai_walk(2);};$/;" f +tbaby_walk14 tarbaby.qc /^void() tbaby_walk14 =[ $walk14, tbaby_walk15 ] {ai_walk(2);};$/;" f +tbaby_walk15 tarbaby.qc /^void() tbaby_walk15 =[ $walk15, tbaby_walk16 ] {ai_walk(2);};$/;" f +tbaby_walk16 tarbaby.qc /^void() tbaby_walk16 =[ $walk16, tbaby_walk17 ] {ai_walk(2);};$/;" f +tbaby_walk17 tarbaby.qc /^void() tbaby_walk17 =[ $walk17, tbaby_walk18 ] {ai_walk(2);};$/;" f +tbaby_walk18 tarbaby.qc /^void() tbaby_walk18 =[ $walk18, tbaby_walk19 ] {ai_walk(2);};$/;" f +tbaby_walk19 tarbaby.qc /^void() tbaby_walk19 =[ $walk19, tbaby_walk20 ] {ai_walk(2);};$/;" f +tbaby_walk2 tarbaby.qc /^void() tbaby_walk2 =[ $walk2, tbaby_walk3 ] {ai_turn();};$/;" f +tbaby_walk20 tarbaby.qc /^void() tbaby_walk20 =[ $walk20, tbaby_walk21 ] {ai_walk(2);};$/;" f +tbaby_walk21 tarbaby.qc /^void() tbaby_walk21 =[ $walk21, tbaby_walk22 ] {ai_walk(2);};$/;" f +tbaby_walk22 tarbaby.qc /^void() tbaby_walk22 =[ $walk22, tbaby_walk23 ] {ai_walk(2);};$/;" f +tbaby_walk23 tarbaby.qc /^void() tbaby_walk23 =[ $walk23, tbaby_walk24 ] {ai_walk(2);};$/;" f +tbaby_walk24 tarbaby.qc /^void() tbaby_walk24 =[ $walk24, tbaby_walk25 ] {ai_walk(2);};$/;" f +tbaby_walk25 tarbaby.qc /^void() tbaby_walk25 =[ $walk25, tbaby_walk1 ] {ai_walk(2);};$/;" f +tbaby_walk3 tarbaby.qc /^void() tbaby_walk3 =[ $walk3, tbaby_walk4 ] {ai_turn();};$/;" f +tbaby_walk4 tarbaby.qc /^void() tbaby_walk4 =[ $walk4, tbaby_walk5 ] {ai_turn();};$/;" f +tbaby_walk5 tarbaby.qc /^void() tbaby_walk5 =[ $walk5, tbaby_walk6 ] {ai_turn();};$/;" f +tbaby_walk6 tarbaby.qc /^void() tbaby_walk6 =[ $walk6, tbaby_walk7 ] {ai_turn();};$/;" f +tbaby_walk7 tarbaby.qc /^void() tbaby_walk7 =[ $walk7, tbaby_walk8 ] {ai_turn();};$/;" f +tbaby_walk8 tarbaby.qc /^void() tbaby_walk8 =[ $walk8, tbaby_walk9 ] {ai_turn();};$/;" f +tbaby_walk9 tarbaby.qc /^void() tbaby_walk9 =[ $walk9, tbaby_walk10 ] {ai_turn();};$/;" f +tdeath_touch triggers.qc /^void() tdeath_touch =$/;" f +teleport_touch triggers.qc /^void() teleport_touch =$/;" f +teleport_use triggers.qc /^void() teleport_use =$/;" f +testplayerstart client.qc /^void() testplayerstart =$/;" f +traceline defs.qc /^void(vector v1, vector v2, float nomonsters, entity forent) traceline = #16; $/;" f +traceoff defs.qc /^void() traceoff = #30;$/;" f +traceon defs.qc /^void() traceon = #29; \/\/ turns statment trace on$/;" f +train_blocked plats.qc /^void() train_blocked =$/;" f +train_next plats.qc /^void() train_next =$/;" f +train_use plats.qc /^void() train_use =$/;" f +train_wait plats.qc /^void() train_wait =$/;" f +trap_shooter misc.qc /^void() trap_shooter =$/;" f +trap_spikeshooter misc.qc /^void() trap_spikeshooter =$/;" f +trigger_changelevel client.qc /^void() trigger_changelevel =$/;" f +trigger_counter triggers.qc /^void() trigger_counter =$/;" f +trigger_hurt triggers.qc /^void() trigger_hurt =$/;" f +trigger_monsterjump triggers.qc /^void() trigger_monsterjump =$/;" f +trigger_monsterjump_touch triggers.qc /^void() trigger_monsterjump_touch =$/;" f +trigger_multiple triggers.qc /^void() trigger_multiple =$/;" f +trigger_once triggers.qc /^void() trigger_once =$/;" f +trigger_onlyregistered triggers.qc /^void() trigger_onlyregistered =$/;" f +trigger_onlyregistered_touch triggers.qc /^void() trigger_onlyregistered_touch =$/;" f +trigger_push triggers.qc /^void() trigger_push =$/;" f +trigger_push_touch triggers.qc /^void() trigger_push_touch =$/;" f +trigger_reactivate triggers.qc /^void() trigger_reactivate =$/;" f +trigger_relay triggers.qc /^void() trigger_relay =$/;" f +trigger_secret triggers.qc /^void() trigger_secret =$/;" f +trigger_setskill triggers.qc /^void() trigger_setskill =$/;" f +trigger_skill_touch triggers.qc /^void() trigger_skill_touch =$/;" f +trigger_teleport triggers.qc /^void() trigger_teleport =$/;" f +vectoangles defs.qc /^vector(vector v) vectoangles = #51;$/;" f +vectoyaw defs.qc /^float(vector v) vectoyaw = #13;$/;" f +viewthing misc.qc /^void() viewthing =$/;" f +visible ai.qc /^float (entity targ) visible =$/;" f +vlen defs.qc /^float(vector v) vlen = #12;$/;" f +vtos defs.qc /^string(vector v) vtos = #27;$/;" f +walkmonster_start monsters.qc /^void() walkmonster_start =$/;" f +walkmonster_start_go monsters.qc /^void() walkmonster_start_go =$/;" f +walkmove defs.qc /^float(float yaw, float dist) walkmove = #32; \/\/ returns TRUE or FALSE$/;" f +wall_velocity weapons.qc /^vector() wall_velocity =$/;" f +weapon_grenadelauncher items.qc /^void() weapon_grenadelauncher =$/;" f +weapon_lightning items.qc /^void() weapon_lightning =$/;" f +weapon_nailgun items.qc /^void() weapon_nailgun =$/;" f +weapon_rocketlauncher items.qc /^void() weapon_rocketlauncher =$/;" f +weapon_supernailgun items.qc /^void() weapon_supernailgun =$/;" f +weapon_supershotgun items.qc /^void() weapon_supershotgun =$/;" f +weapon_touch items.qc /^void() weapon_touch =$/;" f +wiz_death1 wizard.qc /^void() wiz_death1 =[ $death1, wiz_death2 ] {$/;" f +wiz_death2 wizard.qc /^void() wiz_death2 =[ $death2, wiz_death3 ] {};$/;" f +wiz_death3 wizard.qc /^void() wiz_death3 =[ $death3, wiz_death4 ]{self.solid = SOLID_NOT;};$/;" f +wiz_death4 wizard.qc /^void() wiz_death4 =[ $death4, wiz_death5 ] {};$/;" f +wiz_death5 wizard.qc /^void() wiz_death5 =[ $death5, wiz_death6 ] {};$/;" f +wiz_death6 wizard.qc /^void() wiz_death6 =[ $death6, wiz_death7 ] {};$/;" f +wiz_death7 wizard.qc /^void() wiz_death7 =[ $death7, wiz_death8 ] {};$/;" f +wiz_death8 wizard.qc /^void() wiz_death8 =[ $death8, wiz_death8 ] {};$/;" f +wiz_die wizard.qc /^void() wiz_die =$/;" f +wiz_fast1 wizard.qc /^void() wiz_fast1 =[ $magatt1, wiz_fast2 ] {ai_face();Wiz_StartFast();};$/;" f +wiz_fast10 wizard.qc /^void() wiz_fast10 =[ $magatt2, wiz_run1 ] {ai_face();SUB_AttackFinished(2);WizardAttackFinished ();};$/;" f +wiz_fast2 wizard.qc /^void() wiz_fast2 =[ $magatt2, wiz_fast3 ] {ai_face();};$/;" f +wiz_fast3 wizard.qc /^void() wiz_fast3 =[ $magatt3, wiz_fast4 ] {ai_face();};$/;" f +wiz_fast4 wizard.qc /^void() wiz_fast4 =[ $magatt4, wiz_fast5 ] {ai_face();};$/;" f +wiz_fast5 wizard.qc /^void() wiz_fast5 =[ $magatt5, wiz_fast6 ] {ai_face();};$/;" f +wiz_fast6 wizard.qc /^void() wiz_fast6 =[ $magatt6, wiz_fast7 ] {ai_face();};$/;" f +wiz_fast7 wizard.qc /^void() wiz_fast7 =[ $magatt5, wiz_fast8 ] {ai_face();};$/;" f +wiz_fast8 wizard.qc /^void() wiz_fast8 =[ $magatt4, wiz_fast9 ] {ai_face();};$/;" f +wiz_fast9 wizard.qc /^void() wiz_fast9 =[ $magatt3, wiz_fast10 ] {ai_face();};$/;" f +wiz_pain1 wizard.qc /^void() wiz_pain1 =[ $pain1, wiz_pain2 ] {};$/;" f +wiz_pain2 wizard.qc /^void() wiz_pain2 =[ $pain2, wiz_pain3 ] {};$/;" f +wiz_pain3 wizard.qc /^void() wiz_pain3 =[ $pain3, wiz_pain4 ] {};$/;" f +wiz_pain4 wizard.qc /^void() wiz_pain4 =[ $pain4, wiz_run1 ] {};$/;" f +wiz_run1 wizard.qc /^void() wiz_run1 =[ $fly1, wiz_run2 ] {ai_run(16);$/;" f +wiz_run10 wizard.qc /^void() wiz_run10 =[ $fly10, wiz_run11 ] {ai_run(16);};$/;" f +wiz_run11 wizard.qc /^void() wiz_run11 =[ $fly11, wiz_run12 ] {ai_run(16);};$/;" f +wiz_run12 wizard.qc /^void() wiz_run12 =[ $fly12, wiz_run13 ] {ai_run(16);};$/;" f +wiz_run13 wizard.qc /^void() wiz_run13 =[ $fly13, wiz_run14 ] {ai_run(16);};$/;" f +wiz_run14 wizard.qc /^void() wiz_run14 =[ $fly14, wiz_run1 ] {ai_run(16);};$/;" f +wiz_run2 wizard.qc /^void() wiz_run2 =[ $fly2, wiz_run3 ] {ai_run(16);};$/;" f +wiz_run3 wizard.qc /^void() wiz_run3 =[ $fly3, wiz_run4 ] {ai_run(16);};$/;" f +wiz_run4 wizard.qc /^void() wiz_run4 =[ $fly4, wiz_run5 ] {ai_run(16);};$/;" f +wiz_run5 wizard.qc /^void() wiz_run5 =[ $fly5, wiz_run6 ] {ai_run(16);};$/;" f +wiz_run6 wizard.qc /^void() wiz_run6 =[ $fly6, wiz_run7 ] {ai_run(16);};$/;" f +wiz_run7 wizard.qc /^void() wiz_run7 =[ $fly7, wiz_run8 ] {ai_run(16);};$/;" f +wiz_run8 wizard.qc /^void() wiz_run8 =[ $fly8, wiz_run9 ] {ai_run(16);};$/;" f +wiz_run9 wizard.qc /^void() wiz_run9 =[ $fly9, wiz_run10 ] {ai_run(16);};$/;" f +wiz_side1 wizard.qc /^void() wiz_side1 =[ $hover1, wiz_side2 ] {ai_run(8);$/;" f +wiz_side2 wizard.qc /^void() wiz_side2 =[ $hover2, wiz_side3 ] {ai_run(8);};$/;" f +wiz_side3 wizard.qc /^void() wiz_side3 =[ $hover3, wiz_side4 ] {ai_run(8);};$/;" f +wiz_side4 wizard.qc /^void() wiz_side4 =[ $hover4, wiz_side5 ] {ai_run(8);};$/;" f +wiz_side5 wizard.qc /^void() wiz_side5 =[ $hover5, wiz_side6 ] {ai_run(8);};$/;" f +wiz_side6 wizard.qc /^void() wiz_side6 =[ $hover6, wiz_side7 ] {ai_run(8);};$/;" f +wiz_side7 wizard.qc /^void() wiz_side7 =[ $hover7, wiz_side8 ] {ai_run(8);};$/;" f +wiz_side8 wizard.qc /^void() wiz_side8 =[ $hover8, wiz_side1 ] {ai_run(8);};$/;" f +wiz_stand1 wizard.qc /^void() wiz_stand1 =[ $hover1, wiz_stand2 ] {ai_stand();};$/;" f +wiz_stand2 wizard.qc /^void() wiz_stand2 =[ $hover2, wiz_stand3 ] {ai_stand();};$/;" f +wiz_stand3 wizard.qc /^void() wiz_stand3 =[ $hover3, wiz_stand4 ] {ai_stand();};$/;" f +wiz_stand4 wizard.qc /^void() wiz_stand4 =[ $hover4, wiz_stand5 ] {ai_stand();};$/;" f +wiz_stand5 wizard.qc /^void() wiz_stand5 =[ $hover5, wiz_stand6 ] {ai_stand();};$/;" f +wiz_stand6 wizard.qc /^void() wiz_stand6 =[ $hover6, wiz_stand7 ] {ai_stand();};$/;" f +wiz_stand7 wizard.qc /^void() wiz_stand7 =[ $hover7, wiz_stand8 ] {ai_stand();};$/;" f +wiz_stand8 wizard.qc /^void() wiz_stand8 =[ $hover8, wiz_stand1 ] {ai_stand();};$/;" f +wiz_walk1 wizard.qc /^void() wiz_walk1 =[ $hover1, wiz_walk2 ] {ai_walk(8);$/;" f +wiz_walk2 wizard.qc /^void() wiz_walk2 =[ $hover2, wiz_walk3 ] {ai_walk(8);};$/;" f +wiz_walk3 wizard.qc /^void() wiz_walk3 =[ $hover3, wiz_walk4 ] {ai_walk(8);};$/;" f +wiz_walk4 wizard.qc /^void() wiz_walk4 =[ $hover4, wiz_walk5 ] {ai_walk(8);};$/;" f +wiz_walk5 wizard.qc /^void() wiz_walk5 =[ $hover5, wiz_walk6 ] {ai_walk(8);};$/;" f +wiz_walk6 wizard.qc /^void() wiz_walk6 =[ $hover6, wiz_walk7 ] {ai_walk(8);};$/;" f +wiz_walk7 wizard.qc /^void() wiz_walk7 =[ $hover7, wiz_walk8 ] {ai_walk(8);};$/;" f +wiz_walk8 wizard.qc /^void() wiz_walk8 =[ $hover8, wiz_walk1 ] {ai_walk(8);};$/;" f +worldspawn world.qc /^void() worldspawn =$/;" f +zombie_atta1 zombie.qc /^void() zombie_atta1 =[ $atta1, zombie_atta2 ] {ai_face();};$/;" f +zombie_atta10 zombie.qc /^void() zombie_atta10 =[ $atta10, zombie_atta11 ] {ai_face();};$/;" f +zombie_atta11 zombie.qc /^void() zombie_atta11 =[ $atta11, zombie_atta12 ] {ai_face();};$/;" f +zombie_atta12 zombie.qc /^void() zombie_atta12 =[ $atta12, zombie_atta13 ] {ai_face();};$/;" f +zombie_atta13 zombie.qc /^void() zombie_atta13 =[ $atta13, zombie_run1 ] {ai_face();ZombieFireGrenade('-10 -22 30');};$/;" f +zombie_atta2 zombie.qc /^void() zombie_atta2 =[ $atta2, zombie_atta3 ] {ai_face();};$/;" f +zombie_atta3 zombie.qc /^void() zombie_atta3 =[ $atta3, zombie_atta4 ] {ai_face();};$/;" f +zombie_atta4 zombie.qc /^void() zombie_atta4 =[ $atta4, zombie_atta5 ] {ai_face();};$/;" f +zombie_atta5 zombie.qc /^void() zombie_atta5 =[ $atta5, zombie_atta6 ] {ai_face();};$/;" f +zombie_atta6 zombie.qc /^void() zombie_atta6 =[ $atta6, zombie_atta7 ] {ai_face();};$/;" f +zombie_atta7 zombie.qc /^void() zombie_atta7 =[ $atta7, zombie_atta8 ] {ai_face();};$/;" f +zombie_atta8 zombie.qc /^void() zombie_atta8 =[ $atta8, zombie_atta9 ] {ai_face();};$/;" f +zombie_atta9 zombie.qc /^void() zombie_atta9 =[ $atta9, zombie_atta10 ] {ai_face();};$/;" f +zombie_attb1 zombie.qc /^void() zombie_attb1 =[ $attb1, zombie_attb2 ] {ai_face();};$/;" f +zombie_attb10 zombie.qc /^void() zombie_attb10 =[ $attb10, zombie_attb11 ] {ai_face();};$/;" f +zombie_attb11 zombie.qc /^void() zombie_attb11 =[ $attb11, zombie_attb12 ] {ai_face();};$/;" f +zombie_attb12 zombie.qc /^void() zombie_attb12 =[ $attb12, zombie_attb13 ] {ai_face();};$/;" f +zombie_attb13 zombie.qc /^void() zombie_attb13 =[ $attb13, zombie_attb14 ] {ai_face();};$/;" f +zombie_attb14 zombie.qc /^void() zombie_attb14 =[ $attb13, zombie_run1 ] {ai_face();ZombieFireGrenade('-10 -24 29');};$/;" f +zombie_attb2 zombie.qc /^void() zombie_attb2 =[ $attb2, zombie_attb3 ] {ai_face();};$/;" f +zombie_attb3 zombie.qc /^void() zombie_attb3 =[ $attb3, zombie_attb4 ] {ai_face();};$/;" f +zombie_attb4 zombie.qc /^void() zombie_attb4 =[ $attb4, zombie_attb5 ] {ai_face();};$/;" f +zombie_attb5 zombie.qc /^void() zombie_attb5 =[ $attb5, zombie_attb6 ] {ai_face();};$/;" f +zombie_attb6 zombie.qc /^void() zombie_attb6 =[ $attb6, zombie_attb7 ] {ai_face();};$/;" f +zombie_attb7 zombie.qc /^void() zombie_attb7 =[ $attb7, zombie_attb8 ] {ai_face();};$/;" f +zombie_attb8 zombie.qc /^void() zombie_attb8 =[ $attb8, zombie_attb9 ] {ai_face();};$/;" f +zombie_attb9 zombie.qc /^void() zombie_attb9 =[ $attb9, zombie_attb10 ] {ai_face();};$/;" f +zombie_attc1 zombie.qc /^void() zombie_attc1 =[ $attc1, zombie_attc2 ] {ai_face();};$/;" f +zombie_attc10 zombie.qc /^void() zombie_attc10 =[ $attc10, zombie_attc11 ] {ai_face();};$/;" f +zombie_attc11 zombie.qc /^void() zombie_attc11 =[ $attc11, zombie_attc12 ] {ai_face();};$/;" f +zombie_attc12 zombie.qc /^void() zombie_attc12 =[ $attc12, zombie_run1 ] {ai_face();ZombieFireGrenade('-12 -19 29');};$/;" f +zombie_attc2 zombie.qc /^void() zombie_attc2 =[ $attc2, zombie_attc3 ] {ai_face();};$/;" f +zombie_attc3 zombie.qc /^void() zombie_attc3 =[ $attc3, zombie_attc4 ] {ai_face();};$/;" f +zombie_attc4 zombie.qc /^void() zombie_attc4 =[ $attc4, zombie_attc5 ] {ai_face();};$/;" f +zombie_attc5 zombie.qc /^void() zombie_attc5 =[ $attc5, zombie_attc6 ] {ai_face();};$/;" f +zombie_attc6 zombie.qc /^void() zombie_attc6 =[ $attc6, zombie_attc7 ] {ai_face();};$/;" f +zombie_attc7 zombie.qc /^void() zombie_attc7 =[ $attc7, zombie_attc8 ] {ai_face();};$/;" f +zombie_attc8 zombie.qc /^void() zombie_attc8 =[ $attc8, zombie_attc9 ] {ai_face();};$/;" f +zombie_attc9 zombie.qc /^void() zombie_attc9 =[ $attc9, zombie_attc10 ] {ai_face();};$/;" f +zombie_cruc1 zombie.qc /^void() zombie_cruc1 = [ $cruc_1, zombie_cruc2 ] {$/;" f +zombie_cruc2 zombie.qc /^void() zombie_cruc2 = [ $cruc_2, zombie_cruc3 ] {self.nextthink = time + 0.1 + random()*0.1;};$/;" f +zombie_cruc3 zombie.qc /^void() zombie_cruc3 = [ $cruc_3, zombie_cruc4 ] {self.nextthink = time + 0.1 + random()*0.1;};$/;" f +zombie_cruc4 zombie.qc /^void() zombie_cruc4 = [ $cruc_4, zombie_cruc5 ] {self.nextthink = time + 0.1 + random()*0.1;};$/;" f +zombie_cruc5 zombie.qc /^void() zombie_cruc5 = [ $cruc_5, zombie_cruc6 ] {self.nextthink = time + 0.1 + random()*0.1;};$/;" f +zombie_cruc6 zombie.qc /^void() zombie_cruc6 = [ $cruc_6, zombie_cruc1 ] {self.nextthink = time + 0.1 + random()*0.1;};$/;" f +zombie_die zombie.qc /^void() zombie_die =$/;" f +zombie_missile zombie.qc /^void() zombie_missile =$/;" f +zombie_pain zombie.qc /^void(entity attacker, float take) zombie_pain =$/;" f +zombie_paina1 zombie.qc /^void() zombie_paina1 =[ $paina1, zombie_paina2 ] {sound (self, CHAN_VOICE, "zombie\/z_pain.wav", 1, ATTN_NORM);};$/;" f +zombie_paina10 zombie.qc /^void() zombie_paina10 =[ $paina10, zombie_paina11 ] {};$/;" f +zombie_paina11 zombie.qc /^void() zombie_paina11 =[ $paina11, zombie_paina12 ] {};$/;" f +zombie_paina12 zombie.qc /^void() zombie_paina12 =[ $paina12, zombie_run1 ] {};$/;" f +zombie_paina2 zombie.qc /^void() zombie_paina2 =[ $paina2, zombie_paina3 ] {ai_painforward(3);};$/;" f +zombie_paina3 zombie.qc /^void() zombie_paina3 =[ $paina3, zombie_paina4 ] {ai_painforward(1);};$/;" f +zombie_paina4 zombie.qc /^void() zombie_paina4 =[ $paina4, zombie_paina5 ] {ai_pain(1);};$/;" f +zombie_paina5 zombie.qc /^void() zombie_paina5 =[ $paina5, zombie_paina6 ] {ai_pain(3);};$/;" f +zombie_paina6 zombie.qc /^void() zombie_paina6 =[ $paina6, zombie_paina7 ] {ai_pain(1);};$/;" f +zombie_paina7 zombie.qc /^void() zombie_paina7 =[ $paina7, zombie_paina8 ] {};$/;" f +zombie_paina8 zombie.qc /^void() zombie_paina8 =[ $paina8, zombie_paina9 ] {};$/;" f +zombie_paina9 zombie.qc /^void() zombie_paina9 =[ $paina9, zombie_paina10 ] {};$/;" f +zombie_painb1 zombie.qc /^void() zombie_painb1 =[ $painb1, zombie_painb2 ] {sound (self, CHAN_VOICE, "zombie\/z_pain1.wav", 1, ATTN_NORM);};$/;" f +zombie_painb10 zombie.qc /^void() zombie_painb10 =[ $painb10, zombie_painb11 ] {};$/;" f +zombie_painb11 zombie.qc /^void() zombie_painb11 =[ $painb11, zombie_painb12 ] {};$/;" f +zombie_painb12 zombie.qc /^void() zombie_painb12 =[ $painb12, zombie_painb13 ] {};$/;" f +zombie_painb13 zombie.qc /^void() zombie_painb13 =[ $painb13, zombie_painb14 ] {};$/;" f +zombie_painb14 zombie.qc /^void() zombie_painb14 =[ $painb14, zombie_painb15 ] {};$/;" f +zombie_painb15 zombie.qc /^void() zombie_painb15 =[ $painb15, zombie_painb16 ] {};$/;" f +zombie_painb16 zombie.qc /^void() zombie_painb16 =[ $painb16, zombie_painb17 ] {};$/;" f +zombie_painb17 zombie.qc /^void() zombie_painb17 =[ $painb17, zombie_painb18 ] {};$/;" f +zombie_painb18 zombie.qc /^void() zombie_painb18 =[ $painb18, zombie_painb19 ] {};$/;" f +zombie_painb19 zombie.qc /^void() zombie_painb19 =[ $painb19, zombie_painb20 ] {};$/;" f +zombie_painb2 zombie.qc /^void() zombie_painb2 =[ $painb2, zombie_painb3 ] {ai_pain(2);};$/;" f +zombie_painb20 zombie.qc /^void() zombie_painb20 =[ $painb20, zombie_painb21 ] {};$/;" f +zombie_painb21 zombie.qc /^void() zombie_painb21 =[ $painb21, zombie_painb22 ] {};$/;" f +zombie_painb22 zombie.qc /^void() zombie_painb22 =[ $painb22, zombie_painb23 ] {};$/;" f +zombie_painb23 zombie.qc /^void() zombie_painb23 =[ $painb23, zombie_painb24 ] {};$/;" f +zombie_painb24 zombie.qc /^void() zombie_painb24 =[ $painb24, zombie_painb25 ] {};$/;" f +zombie_painb25 zombie.qc /^void() zombie_painb25 =[ $painb25, zombie_painb26 ] {ai_painforward(1);};$/;" f +zombie_painb26 zombie.qc /^void() zombie_painb26 =[ $painb26, zombie_painb27 ] {};$/;" f +zombie_painb27 zombie.qc /^void() zombie_painb27 =[ $painb27, zombie_painb28 ] {};$/;" f +zombie_painb28 zombie.qc /^void() zombie_painb28 =[ $painb28, zombie_run1 ] {};$/;" f +zombie_painb3 zombie.qc /^void() zombie_painb3 =[ $painb3, zombie_painb4 ] {ai_pain(8);};$/;" f +zombie_painb4 zombie.qc /^void() zombie_painb4 =[ $painb4, zombie_painb5 ] {ai_pain(6);};$/;" f +zombie_painb5 zombie.qc /^void() zombie_painb5 =[ $painb5, zombie_painb6 ] {ai_pain(2);};$/;" f +zombie_painb6 zombie.qc /^void() zombie_painb6 =[ $painb6, zombie_painb7 ] {};$/;" f +zombie_painb7 zombie.qc /^void() zombie_painb7 =[ $painb7, zombie_painb8 ] {};$/;" f +zombie_painb8 zombie.qc /^void() zombie_painb8 =[ $painb8, zombie_painb9 ] {};$/;" f +zombie_painb9 zombie.qc /^void() zombie_painb9 =[ $painb9, zombie_painb10 ] {sound (self, CHAN_BODY, "zombie\/z_fall.wav", 1, ATTN_NORM);};$/;" f +zombie_painc1 zombie.qc /^void() zombie_painc1 =[ $painc1, zombie_painc2 ] {sound (self, CHAN_VOICE, "zombie\/z_pain1.wav", 1, ATTN_NORM);};$/;" f +zombie_painc10 zombie.qc /^void() zombie_painc10 =[ $painc10, zombie_painc11 ] {};$/;" f +zombie_painc11 zombie.qc /^void() zombie_painc11 =[ $painc11, zombie_painc12 ] {ai_painforward(1);};$/;" f +zombie_painc12 zombie.qc /^void() zombie_painc12 =[ $painc12, zombie_painc13 ] {ai_painforward(1);};$/;" f +zombie_painc13 zombie.qc /^void() zombie_painc13 =[ $painc13, zombie_painc14 ] {};$/;" f +zombie_painc14 zombie.qc /^void() zombie_painc14 =[ $painc14, zombie_painc15 ] {};$/;" f +zombie_painc15 zombie.qc /^void() zombie_painc15 =[ $painc15, zombie_painc16 ] {};$/;" f +zombie_painc16 zombie.qc /^void() zombie_painc16 =[ $painc16, zombie_painc17 ] {};$/;" f +zombie_painc17 zombie.qc /^void() zombie_painc17 =[ $painc17, zombie_painc18 ] {};$/;" f +zombie_painc18 zombie.qc /^void() zombie_painc18 =[ $painc18, zombie_run1 ] {};$/;" f +zombie_painc2 zombie.qc /^void() zombie_painc2 =[ $painc2, zombie_painc3 ] {};$/;" f +zombie_painc3 zombie.qc /^void() zombie_painc3 =[ $painc3, zombie_painc4 ] {ai_pain(3);};$/;" f +zombie_painc4 zombie.qc /^void() zombie_painc4 =[ $painc4, zombie_painc5 ] {ai_pain(1);};$/;" f +zombie_painc5 zombie.qc /^void() zombie_painc5 =[ $painc5, zombie_painc6 ] {};$/;" f +zombie_painc6 zombie.qc /^void() zombie_painc6 =[ $painc6, zombie_painc7 ] {};$/;" f +zombie_painc7 zombie.qc /^void() zombie_painc7 =[ $painc7, zombie_painc8 ] {};$/;" f +zombie_painc8 zombie.qc /^void() zombie_painc8 =[ $painc8, zombie_painc9 ] {};$/;" f +zombie_painc9 zombie.qc /^void() zombie_painc9 =[ $painc9, zombie_painc10 ] {};$/;" f +zombie_paind1 zombie.qc /^void() zombie_paind1 =[ $paind1, zombie_paind2 ] {sound (self, CHAN_VOICE, "zombie\/z_pain.wav", 1, ATTN_NORM);};$/;" f +zombie_paind10 zombie.qc /^void() zombie_paind10 =[ $paind10, zombie_paind11 ] {};$/;" f +zombie_paind11 zombie.qc /^void() zombie_paind11 =[ $paind11, zombie_paind12 ] {};$/;" f +zombie_paind12 zombie.qc /^void() zombie_paind12 =[ $paind12, zombie_paind13 ] {};$/;" f +zombie_paind13 zombie.qc /^void() zombie_paind13 =[ $paind13, zombie_run1 ] {};$/;" f +zombie_paind2 zombie.qc /^void() zombie_paind2 =[ $paind2, zombie_paind3 ] {};$/;" f +zombie_paind3 zombie.qc /^void() zombie_paind3 =[ $paind3, zombie_paind4 ] {};$/;" f +zombie_paind4 zombie.qc /^void() zombie_paind4 =[ $paind4, zombie_paind5 ] {};$/;" f +zombie_paind5 zombie.qc /^void() zombie_paind5 =[ $paind5, zombie_paind6 ] {};$/;" f +zombie_paind6 zombie.qc /^void() zombie_paind6 =[ $paind6, zombie_paind7 ] {};$/;" f +zombie_paind7 zombie.qc /^void() zombie_paind7 =[ $paind7, zombie_paind8 ] {};$/;" f +zombie_paind8 zombie.qc /^void() zombie_paind8 =[ $paind8, zombie_paind9 ] {};$/;" f +zombie_paind9 zombie.qc /^void() zombie_paind9 =[ $paind9, zombie_paind10 ] {ai_pain(1);};$/;" f +zombie_paine1 zombie.qc /^void() zombie_paine1 =[ $paine1, zombie_paine2 ] {$/;" f +zombie_paine10 zombie.qc /^void() zombie_paine10 =[ $paine10, zombie_paine11 ] {$/;" f +zombie_paine11 zombie.qc /^void() zombie_paine11 =[ $paine11, zombie_paine12 ] {self.nextthink = self.nextthink + 5;self.health = 60;};$/;" f +zombie_paine12 zombie.qc /^void() zombie_paine12 =[ $paine12, zombie_paine13 ]{$/;" f +zombie_paine13 zombie.qc /^void() zombie_paine13 =[ $paine13, zombie_paine14 ] {};$/;" f +zombie_paine14 zombie.qc /^void() zombie_paine14 =[ $paine14, zombie_paine15 ] {};$/;" f +zombie_paine15 zombie.qc /^void() zombie_paine15 =[ $paine15, zombie_paine16 ] {};$/;" f +zombie_paine16 zombie.qc /^void() zombie_paine16 =[ $paine16, zombie_paine17 ] {};$/;" f +zombie_paine17 zombie.qc /^void() zombie_paine17 =[ $paine17, zombie_paine18 ] {};$/;" f +zombie_paine18 zombie.qc /^void() zombie_paine18 =[ $paine18, zombie_paine19 ] {};$/;" f +zombie_paine19 zombie.qc /^void() zombie_paine19 =[ $paine19, zombie_paine20 ] {};$/;" f +zombie_paine2 zombie.qc /^void() zombie_paine2 =[ $paine2, zombie_paine3 ] {ai_pain(8);};$/;" f +zombie_paine20 zombie.qc /^void() zombie_paine20 =[ $paine20, zombie_paine21 ] {};$/;" f +zombie_paine21 zombie.qc /^void() zombie_paine21 =[ $paine21, zombie_paine22 ] {};$/;" f +zombie_paine22 zombie.qc /^void() zombie_paine22 =[ $paine22, zombie_paine23 ] {};$/;" f +zombie_paine23 zombie.qc /^void() zombie_paine23 =[ $paine23, zombie_paine24 ] {};$/;" f +zombie_paine24 zombie.qc /^void() zombie_paine24 =[ $paine24, zombie_paine25 ] {};$/;" f +zombie_paine25 zombie.qc /^void() zombie_paine25 =[ $paine25, zombie_paine26 ] {ai_painforward(5);};$/;" f +zombie_paine26 zombie.qc /^void() zombie_paine26 =[ $paine26, zombie_paine27 ] {ai_painforward(3);};$/;" f +zombie_paine27 zombie.qc /^void() zombie_paine27 =[ $paine27, zombie_paine28 ] {ai_painforward(1);};$/;" f +zombie_paine28 zombie.qc /^void() zombie_paine28 =[ $paine28, zombie_paine29 ] {ai_pain(1);};$/;" f +zombie_paine29 zombie.qc /^void() zombie_paine29 =[ $paine29, zombie_paine30 ] {};$/;" f +zombie_paine3 zombie.qc /^void() zombie_paine3 =[ $paine3, zombie_paine4 ] {ai_pain(5);};$/;" f +zombie_paine30 zombie.qc /^void() zombie_paine30 =[ $paine30, zombie_run1 ] {};$/;" f +zombie_paine4 zombie.qc /^void() zombie_paine4 =[ $paine4, zombie_paine5 ] {ai_pain(3);};$/;" f +zombie_paine5 zombie.qc /^void() zombie_paine5 =[ $paine5, zombie_paine6 ] {ai_pain(1);};$/;" f +zombie_paine6 zombie.qc /^void() zombie_paine6 =[ $paine6, zombie_paine7 ] {ai_pain(2);};$/;" f +zombie_paine7 zombie.qc /^void() zombie_paine7 =[ $paine7, zombie_paine8 ] {ai_pain(1);};$/;" f +zombie_paine8 zombie.qc /^void() zombie_paine8 =[ $paine8, zombie_paine9 ] {ai_pain(1);};$/;" f +zombie_paine9 zombie.qc /^void() zombie_paine9 =[ $paine9, zombie_paine10 ] {ai_pain(2);};$/;" f +zombie_run1 zombie.qc /^void() zombie_run1 =[ $run1, zombie_run2 ] {ai_run(1);self.inpain = 0;};$/;" f +zombie_run10 zombie.qc /^void() zombie_run10 =[ $run10, zombie_run11 ] {ai_run(0);};$/;" f +zombie_run11 zombie.qc /^void() zombie_run11 =[ $run11, zombie_run12 ] {ai_run(0);};$/;" f +zombie_run12 zombie.qc /^void() zombie_run12 =[ $run12, zombie_run13 ] {ai_run(0);};$/;" f +zombie_run13 zombie.qc /^void() zombie_run13 =[ $run13, zombie_run14 ] {ai_run(2);};$/;" f +zombie_run14 zombie.qc /^void() zombie_run14 =[ $run14, zombie_run15 ] {ai_run(4);};$/;" f +zombie_run15 zombie.qc /^void() zombie_run15 =[ $run15, zombie_run16 ] {ai_run(6);};$/;" f +zombie_run16 zombie.qc /^void() zombie_run16 =[ $run16, zombie_run17 ] {ai_run(7);};$/;" f +zombie_run17 zombie.qc /^void() zombie_run17 =[ $run17, zombie_run18 ] {ai_run(3);};$/;" f +zombie_run18 zombie.qc /^void() zombie_run18 =[ $run18, zombie_run1 ] {$/;" f +zombie_run2 zombie.qc /^void() zombie_run2 =[ $run2, zombie_run3 ] {ai_run(1);};$/;" f +zombie_run3 zombie.qc /^void() zombie_run3 =[ $run3, zombie_run4 ] {ai_run(0);};$/;" f +zombie_run4 zombie.qc /^void() zombie_run4 =[ $run4, zombie_run5 ] {ai_run(1);};$/;" f +zombie_run5 zombie.qc /^void() zombie_run5 =[ $run5, zombie_run6 ] {ai_run(2);};$/;" f +zombie_run6 zombie.qc /^void() zombie_run6 =[ $run6, zombie_run7 ] {ai_run(3);};$/;" f +zombie_run7 zombie.qc /^void() zombie_run7 =[ $run7, zombie_run8 ] {ai_run(4);};$/;" f +zombie_run8 zombie.qc /^void() zombie_run8 =[ $run8, zombie_run9 ] {ai_run(4);};$/;" f +zombie_run9 zombie.qc /^void() zombie_run9 =[ $run9, zombie_run10 ] {ai_run(2);};$/;" f +zombie_stand1 zombie.qc /^void() zombie_stand1 =[ $stand1, zombie_stand2 ] {ai_stand();};$/;" f +zombie_stand10 zombie.qc /^void() zombie_stand10 =[ $stand10, zombie_stand11 ] {ai_stand();};$/;" f +zombie_stand11 zombie.qc /^void() zombie_stand11 =[ $stand11, zombie_stand12 ] {ai_stand();};$/;" f +zombie_stand12 zombie.qc /^void() zombie_stand12 =[ $stand12, zombie_stand13 ] {ai_stand();};$/;" f +zombie_stand13 zombie.qc /^void() zombie_stand13 =[ $stand13, zombie_stand14 ] {ai_stand();};$/;" f +zombie_stand14 zombie.qc /^void() zombie_stand14 =[ $stand14, zombie_stand15 ] {ai_stand();};$/;" f +zombie_stand15 zombie.qc /^void() zombie_stand15 =[ $stand15, zombie_stand1 ] {ai_stand();};$/;" f +zombie_stand2 zombie.qc /^void() zombie_stand2 =[ $stand2, zombie_stand3 ] {ai_stand();};$/;" f +zombie_stand3 zombie.qc /^void() zombie_stand3 =[ $stand3, zombie_stand4 ] {ai_stand();};$/;" f +zombie_stand4 zombie.qc /^void() zombie_stand4 =[ $stand4, zombie_stand5 ] {ai_stand();};$/;" f +zombie_stand5 zombie.qc /^void() zombie_stand5 =[ $stand5, zombie_stand6 ] {ai_stand();};$/;" f +zombie_stand6 zombie.qc /^void() zombie_stand6 =[ $stand6, zombie_stand7 ] {ai_stand();};$/;" f +zombie_stand7 zombie.qc /^void() zombie_stand7 =[ $stand7, zombie_stand8 ] {ai_stand();};$/;" f +zombie_stand8 zombie.qc /^void() zombie_stand8 =[ $stand8, zombie_stand9 ] {ai_stand();};$/;" f +zombie_stand9 zombie.qc /^void() zombie_stand9 =[ $stand9, zombie_stand10 ] {ai_stand();};$/;" f +zombie_walk1 zombie.qc /^void() zombie_walk1 =[ $walk1, zombie_walk2 ] {ai_walk(0);};$/;" f +zombie_walk10 zombie.qc /^void() zombie_walk10 =[ $walk10, zombie_walk11 ] {ai_walk(0);};$/;" f +zombie_walk11 zombie.qc /^void() zombie_walk11 =[ $walk11, zombie_walk12 ] {ai_walk(2);};$/;" f +zombie_walk12 zombie.qc /^void() zombie_walk12 =[ $walk12, zombie_walk13 ] {ai_walk(2);};$/;" f +zombie_walk13 zombie.qc /^void() zombie_walk13 =[ $walk13, zombie_walk14 ] {ai_walk(1);};$/;" f +zombie_walk14 zombie.qc /^void() zombie_walk14 =[ $walk14, zombie_walk15 ] {ai_walk(0);};$/;" f +zombie_walk15 zombie.qc /^void() zombie_walk15 =[ $walk15, zombie_walk16 ] {ai_walk(0);};$/;" f +zombie_walk16 zombie.qc /^void() zombie_walk16 =[ $walk16, zombie_walk17 ] {ai_walk(0);};$/;" f +zombie_walk17 zombie.qc /^void() zombie_walk17 =[ $walk17, zombie_walk18 ] {ai_walk(0);};$/;" f +zombie_walk18 zombie.qc /^void() zombie_walk18 =[ $walk18, zombie_walk19 ] {ai_walk(0);};$/;" f +zombie_walk19 zombie.qc /^void() zombie_walk19 =[ $walk19, zombie_walk1 ] {$/;" f +zombie_walk2 zombie.qc /^void() zombie_walk2 =[ $walk2, zombie_walk3 ] {ai_walk(2);};$/;" f +zombie_walk3 zombie.qc /^void() zombie_walk3 =[ $walk3, zombie_walk4 ] {ai_walk(3);};$/;" f +zombie_walk4 zombie.qc /^void() zombie_walk4 =[ $walk4, zombie_walk5 ] {ai_walk(2);};$/;" f +zombie_walk5 zombie.qc /^void() zombie_walk5 =[ $walk5, zombie_walk6 ] {ai_walk(1);};$/;" f +zombie_walk6 zombie.qc /^void() zombie_walk6 =[ $walk6, zombie_walk7 ] {ai_walk(0);};$/;" f +zombie_walk7 zombie.qc /^void() zombie_walk7 =[ $walk7, zombie_walk8 ] {ai_walk(0);};$/;" f +zombie_walk8 zombie.qc /^void() zombie_walk8 =[ $walk8, zombie_walk9 ] {ai_walk(0);};$/;" f +zombie_walk9 zombie.qc /^void() zombie_walk9 =[ $walk9, zombie_walk10 ] {ai_walk(0);};$/;" f diff --git a/src/tarbaby.qc b/src/tarbaby.qc new file mode 100644 index 0000000..8742afc --- /dev/null +++ b/src/tarbaby.qc @@ -0,0 +1,222 @@ +/* +============================================================================== + +BLOB + +============================================================================== +*/ + +$cd id1/models/tarbaby +$origin 0 0 24 +$base base + +$skin skin + +$frame walk1 walk2 walk3 walk4 walk5 walk6 walk7 walk8 walk9 walk10 +$frame walk11 walk12 walk13 walk14 walk15 walk16 walk17 walk18 walk19 +$frame walk20 walk21 walk22 walk23 walk24 walk25 + +$frame run1 run2 run3 run4 run5 run6 run7 run8 run9 run10 run11 run12 run13 +$frame run14 run15 run16 run17 run18 run19 run20 run21 run22 run23 +$frame run24 run25 + +$frame jump1 jump2 jump3 jump4 jump5 jump6 + +$frame fly1 fly2 fly3 fly4 + +$frame exp + +void() tbaby_stand1 =[ $walk1, tbaby_stand1 ] {ai_stand();}; + +void() tbaby_hang1 =[ $walk1, tbaby_hang1 ] {ai_stand();}; + +void() tbaby_walk1 =[ $walk1, tbaby_walk2 ] {ai_turn();}; +void() tbaby_walk2 =[ $walk2, tbaby_walk3 ] {ai_turn();}; +void() tbaby_walk3 =[ $walk3, tbaby_walk4 ] {ai_turn();}; +void() tbaby_walk4 =[ $walk4, tbaby_walk5 ] {ai_turn();}; +void() tbaby_walk5 =[ $walk5, tbaby_walk6 ] {ai_turn();}; +void() tbaby_walk6 =[ $walk6, tbaby_walk7 ] {ai_turn();}; +void() tbaby_walk7 =[ $walk7, tbaby_walk8 ] {ai_turn();}; +void() tbaby_walk8 =[ $walk8, tbaby_walk9 ] {ai_turn();}; +void() tbaby_walk9 =[ $walk9, tbaby_walk10 ] {ai_turn();}; +void() tbaby_walk10 =[ $walk10, tbaby_walk11 ] {ai_turn();}; +void() tbaby_walk11 =[ $walk11, tbaby_walk12 ] {ai_walk(2);}; +void() tbaby_walk12 =[ $walk12, tbaby_walk13 ] {ai_walk(2);}; +void() tbaby_walk13 =[ $walk13, tbaby_walk14 ] {ai_walk(2);}; +void() tbaby_walk14 =[ $walk14, tbaby_walk15 ] {ai_walk(2);}; +void() tbaby_walk15 =[ $walk15, tbaby_walk16 ] {ai_walk(2);}; +void() tbaby_walk16 =[ $walk16, tbaby_walk17 ] {ai_walk(2);}; +void() tbaby_walk17 =[ $walk17, tbaby_walk18 ] {ai_walk(2);}; +void() tbaby_walk18 =[ $walk18, tbaby_walk19 ] {ai_walk(2);}; +void() tbaby_walk19 =[ $walk19, tbaby_walk20 ] {ai_walk(2);}; +void() tbaby_walk20 =[ $walk20, tbaby_walk21 ] {ai_walk(2);}; +void() tbaby_walk21 =[ $walk21, tbaby_walk22 ] {ai_walk(2);}; +void() tbaby_walk22 =[ $walk22, tbaby_walk23 ] {ai_walk(2);}; +void() tbaby_walk23 =[ $walk23, tbaby_walk24 ] {ai_walk(2);}; +void() tbaby_walk24 =[ $walk24, tbaby_walk25 ] {ai_walk(2);}; +void() tbaby_walk25 =[ $walk25, tbaby_walk1 ] {ai_walk(2);}; + +void() tbaby_run1 =[ $run1, tbaby_run2 ] {ai_face();}; +void() tbaby_run2 =[ $run2, tbaby_run3 ] {ai_face();}; +void() tbaby_run3 =[ $run3, tbaby_run4 ] {ai_face();}; +void() tbaby_run4 =[ $run4, tbaby_run5 ] {ai_face();}; +void() tbaby_run5 =[ $run5, tbaby_run6 ] {ai_face();}; +void() tbaby_run6 =[ $run6, tbaby_run7 ] {ai_face();}; +void() tbaby_run7 =[ $run7, tbaby_run8 ] {ai_face();}; +void() tbaby_run8 =[ $run8, tbaby_run9 ] {ai_face();}; +void() tbaby_run9 =[ $run9, tbaby_run10 ] {ai_face();}; +void() tbaby_run10 =[ $run10, tbaby_run11 ] {ai_face();}; +void() tbaby_run11 =[ $run11, tbaby_run12 ] {ai_run(2);}; +void() tbaby_run12 =[ $run12, tbaby_run13 ] {ai_run(2);}; +void() tbaby_run13 =[ $run13, tbaby_run14 ] {ai_run(2);}; +void() tbaby_run14 =[ $run14, tbaby_run15 ] {ai_run(2);}; +void() tbaby_run15 =[ $run15, tbaby_run16 ] {ai_run(2);}; +void() tbaby_run16 =[ $run16, tbaby_run17 ] {ai_run(2);}; +void() tbaby_run17 =[ $run17, tbaby_run18 ] {ai_run(2);}; +void() tbaby_run18 =[ $run18, tbaby_run19 ] {ai_run(2);}; +void() tbaby_run19 =[ $run19, tbaby_run20 ] {ai_run(2);}; +void() tbaby_run20 =[ $run20, tbaby_run21 ] {ai_run(2);}; +void() tbaby_run21 =[ $run21, tbaby_run22 ] {ai_run(2);}; +void() tbaby_run22 =[ $run22, tbaby_run23 ] {ai_run(2);}; +void() tbaby_run23 =[ $run23, tbaby_run24 ] {ai_run(2);}; +void() tbaby_run24 =[ $run24, tbaby_run25 ] {ai_run(2);}; +void() tbaby_run25 =[ $run25, tbaby_run1 ] {ai_run(2);}; + + +//============================================================================ + + +void() tbaby_jump1; + +void() Tar_JumpTouch = +{ + local float ldmg; + + if (other.takedamage && other.classname != self.classname) + { + if ( vlen(self.velocity) > 400 ) + { + ldmg = 10 + 10*random(); + T_Damage (other, self, self, ldmg); + sound (self, CHAN_WEAPON, "blob/hit1.wav", 1, ATTN_NORM); + } + } + else + sound (self, CHAN_WEAPON, "blob/land1.wav", 1, ATTN_NORM); + + + if (!checkbottom(self)) + { + if (self.flags & FL_ONGROUND) + { // jump randomly to not get hung up +//dprint ("popjump\n"); + self.touch = SUB_Null; + self.think = tbaby_run1; + self.movetype = MOVETYPE_STEP; + self.nextthink = time + 0.1; + +// self.velocity_x = (random() - 0.5) * 600; +// self.velocity_y = (random() - 0.5) * 600; +// self.velocity_z = 200; +// self.flags = self.flags - FL_ONGROUND; + } + return; // not on ground yet + } + + self.touch = SUB_Null; + self.think = tbaby_jump1; + self.nextthink = time + 0.1; +}; + +void() tbaby_jump5; + +void() tbaby_fly1 =[ $fly1, tbaby_fly2 ] {}; +void() tbaby_fly2 =[ $fly2, tbaby_fly3 ] {}; +void() tbaby_fly3 =[ $fly3, tbaby_fly4 ] {}; +void() tbaby_fly4 =[ $fly4, tbaby_fly1 ] { +self.cnt = self.cnt + 1; +if (self.cnt == 4) +{ +//dprint ("spawn hop\n"); +tbaby_jump5 (); +} +}; + +void() tbaby_jump1 =[ $jump1, tbaby_jump2 ] {ai_face();}; +void() tbaby_jump2 =[ $jump2, tbaby_jump3 ] {ai_face();}; +void() tbaby_jump3 =[ $jump3, tbaby_jump4 ] {ai_face();}; +void() tbaby_jump4 =[ $jump4, tbaby_jump5 ] {ai_face();}; +void() tbaby_jump5 =[ $jump5, tbaby_jump6 ] +{ + self.movetype = MOVETYPE_BOUNCE; + self.touch = Tar_JumpTouch; + makevectors (self.angles); + self.origin_z = self.origin_z + 1; + self.velocity = v_forward * 600 + '0 0 200'; + self.velocity_z = self.velocity_z + random()*150; + if (self.flags & FL_ONGROUND) + self.flags = self.flags - FL_ONGROUND; + self.cnt = 0; +}; +void() tbaby_jump6 =[ $jump6,tbaby_fly1 ] {}; + + + +//============================================================================= + +void() tbaby_die1 =[ $exp, tbaby_die2 ] { +self.takedamage = DAMAGE_NO; +}; +void() tbaby_die2 =[ $exp, tbaby_run1 ] +{ + T_RadiusDamage (self, self, 120, world); + + sound (self, CHAN_VOICE, "blob/death1.wav", 1, ATTN_NORM); + self.origin = self.origin - 8*normalize(self.velocity); + + WriteByte (MSG_BROADCAST, SVC_TEMPENTITY); + WriteByte (MSG_BROADCAST, TE_TAREXPLOSION); + WriteCoord (MSG_BROADCAST, self.origin_x); + WriteCoord (MSG_BROADCAST, self.origin_y); + WriteCoord (MSG_BROADCAST, self.origin_z); + + BecomeExplosion (); +}; + +//============================================================================= + + +/*QUAKED monster_tarbaby (1 0 0) (-16 -16 -24) (16 16 24) Ambush +*/ +void() monster_tarbaby = +{ + if (deathmatch) + { + remove(self); + return; + } + precache_model2 ("progs/tarbaby.mdl"); + + precache_sound2 ("blob/death1.wav"); + precache_sound2 ("blob/hit1.wav"); + precache_sound2 ("blob/land1.wav"); + precache_sound2 ("blob/sight1.wav"); + + self.solid = SOLID_SLIDEBOX; + self.movetype = MOVETYPE_STEP; + + setmodel (self, "progs/tarbaby.mdl"); + + setsize (self, '-16 -16 -24', '16 16 40'); + self.health = 80; + + self.th_stand = tbaby_stand1; + self.th_walk = tbaby_walk1; + self.th_run = tbaby_run1; + self.th_missile = tbaby_jump1; + self.th_melee = tbaby_jump1; + self.th_die = tbaby_die1; + + walkmonster_start (); +}; + diff --git a/src/triggers.qc b/src/triggers.qc new file mode 100644 index 0000000..46824f2 --- /dev/null +++ b/src/triggers.qc @@ -0,0 +1,642 @@ + +entity stemp, otemp, s, old; + + +void() trigger_reactivate = +{ + self.solid = SOLID_TRIGGER; +}; + +//============================================================================= + +float SPAWNFLAG_NOMESSAGE = 1; +float SPAWNFLAG_NOTOUCH = 1; + +// the wait time has passed, so set back up for another activation +void() multi_wait = +{ + if (self.max_health) + { + self.health = self.max_health; + self.takedamage = DAMAGE_YES; + self.solid = SOLID_BBOX; + } +}; + + +// the trigger was just touched/killed/used +// self.enemy should be set to the activator so it can be held through a delay +// so wait for the delay time before firing +void() multi_trigger = +{ + if (self.nextthink > time) + { + return; // allready been triggered + } + + if (self.classname == "trigger_secret") + { + if (self.enemy.classname != "player") + return; + found_secrets = found_secrets + 1; + WriteByte (MSG_ALL, SVC_FOUNDSECRET); + } + + if (self.noise) + sound (self, CHAN_VOICE, self.noise, 1, ATTN_NORM); + +// don't trigger again until reset + self.takedamage = DAMAGE_NO; + + activator = self.enemy; + + SUB_UseTargets(); + + if (self.wait > 0) + { + self.think = multi_wait; + self.nextthink = time + self.wait; + } + else + { // we can't just remove (self) here, because this is a touch function + // called wheil C code is looping through area links... + self.touch = SUB_Null; + self.nextthink = time + 0.1; + self.think = SUB_Remove; + } +}; + +void() multi_killed = +{ + self.enemy = damage_attacker; + multi_trigger(); +}; + +void() multi_use = +{ + self.enemy = activator; + multi_trigger(); +}; + +void() multi_touch = +{ + if (other.classname != "player") + return; + +// if the trigger has an angles field, check player's facing direction + if (self.movedir != '0 0 0') + { + makevectors (other.angles); + if (v_forward * self.movedir < 0) + return; // not facing the right way + } + + self.enemy = other; + multi_trigger (); +}; + +/*QUAKED trigger_multiple (.5 .5 .5) ? notouch +Variable sized repeatable trigger. Must be targeted at one or more entities. If "health" is set, the trigger must be killed to activate each time. +If "delay" is set, the trigger waits some time after activating before firing. +"wait" : Seconds between triggerings. (.2 default) +If notouch is set, the trigger is only fired by other entities, not by touching. +NOTOUCH has been obsoleted by trigger_relay! +sounds +1) secret +2) beep beep +3) large switch +4) +set "message" to text string +*/ +void() trigger_multiple = +{ + if (self.sounds == 1) + { + precache_sound ("misc/secret.wav"); + self.noise = "misc/secret.wav"; + } + else if (self.sounds == 2) + { + precache_sound ("misc/talk.wav"); + self.noise = "misc/talk.wav"; + } + else if (self.sounds == 3) + { + precache_sound ("misc/trigger1.wav"); + self.noise = "misc/trigger1.wav"; + } + + if (!self.wait) + self.wait = 0.2; + self.use = multi_use; + + InitTrigger (); + + if (self.health) + { + if (self.spawnflags & SPAWNFLAG_NOTOUCH) + objerror ("health and notouch don't make sense\n"); + self.max_health = self.health; + self.th_die = multi_killed; + self.takedamage = DAMAGE_YES; + self.solid = SOLID_BBOX; + setorigin (self, self.origin); // make sure it links into the world + } + else + { + if ( !(self.spawnflags & SPAWNFLAG_NOTOUCH) ) + { + self.touch = multi_touch; + } + } +}; + + +/*QUAKED trigger_once (.5 .5 .5) ? notouch +Variable sized trigger. Triggers once, then removes itself. You must set the key "target" to the name of another object in the level that has a matching +"targetname". If "health" is set, the trigger must be killed to activate. +If notouch is set, the trigger is only fired by other entities, not by touching. +if "killtarget" is set, any objects that have a matching "target" will be removed when the trigger is fired. +if "angle" is set, the trigger will only fire when someone is facing the direction of the angle. Use "360" for an angle of 0. +sounds +1) secret +2) beep beep +3) large switch +4) +set "message" to text string +*/ +void() trigger_once = +{ + self.wait = -1; + trigger_multiple(); +}; + +//============================================================================= + +/*QUAKED trigger_relay (.5 .5 .5) (-8 -8 -8) (8 8 8) +This fixed size trigger cannot be touched, it can only be fired by other events. It can contain killtargets, targets, delays, and messages. +*/ +void() trigger_relay = +{ + self.use = SUB_UseTargets; +}; + + +//============================================================================= + +/*QUAKED trigger_secret (.5 .5 .5) ? +secret counter trigger +sounds +1) secret +2) beep beep +3) +4) +set "message" to text string +*/ +void() trigger_secret = +{ + total_secrets = total_secrets + 1; + self.wait = -1; + if (!self.message) + self.message = "You found a secret area!"; + if (!self.sounds) + self.sounds = 1; + + if (self.sounds == 1) + { + precache_sound ("misc/secret.wav"); + self.noise = "misc/secret.wav"; + } + else if (self.sounds == 2) + { + precache_sound ("misc/talk.wav"); + self.noise = "misc/talk.wav"; + } + + trigger_multiple (); +}; + +//============================================================================= + + +void() counter_use = +{ + local string junk; + + self.count = self.count - 1; + if (self.count < 0) + return; + + if (self.count != 0) + { + if (activator.classname == "player" + && (self.spawnflags & SPAWNFLAG_NOMESSAGE) == 0) + { + if (self.count >= 4) + centerprint (activator, "There are more to go..."); + else if (self.count == 3) + centerprint (activator, "Only 3 more to go..."); + else if (self.count == 2) + centerprint (activator, "Only 2 more to go..."); + else + centerprint (activator, "Only 1 more to go..."); + } + return; + } + + if (activator.classname == "player" + && (self.spawnflags & SPAWNFLAG_NOMESSAGE) == 0) + centerprint(activator, "Sequence completed!"); + self.enemy = activator; + multi_trigger (); +}; + +/*QUAKED trigger_counter (.5 .5 .5) ? nomessage +Acts as an intermediary for an action that takes multiple inputs. + +If nomessage is not set, t will print "1 more.. " etc when triggered and "sequence complete" when finished. + +After the counter has been triggered "count" times (default 2), it will fire all of it's targets and remove itself. +*/ +void() trigger_counter = +{ + self.wait = -1; + if (!self.count) + self.count = 2; + + self.use = counter_use; +}; + + +/* +============================================================================== + +TELEPORT TRIGGERS + +============================================================================== +*/ + +float PLAYER_ONLY = 1; +float SILENT = 2; + +void() play_teleport = +{ + local float v; + local string tmpstr; + + v = random() * 5; + if (v < 1) + tmpstr = "misc/r_tele1.wav"; + else if (v < 2) + tmpstr = "misc/r_tele2.wav"; + else if (v < 3) + tmpstr = "misc/r_tele3.wav"; + else if (v < 4) + tmpstr = "misc/r_tele4.wav"; + else + tmpstr = "misc/r_tele5.wav"; + + sound (self, CHAN_VOICE, tmpstr, 1, ATTN_NORM); + remove (self); +}; + +void(vector org) spawn_tfog = +{ + s = spawn (); + s.origin = org; + s.nextthink = time + 0.2; + s.think = play_teleport; + + WriteByte (MSG_BROADCAST, SVC_TEMPENTITY); + WriteByte (MSG_BROADCAST, TE_TELEPORT); + WriteCoord (MSG_BROADCAST, org_x); + WriteCoord (MSG_BROADCAST, org_y); + WriteCoord (MSG_BROADCAST, org_z); +}; + + +void() tdeath_touch = +{ + if (other == self.owner) + return; + +// frag anyone who teleports in on top of an invincible player + if (other.classname == "player") + { + if (other.invincible_finished > time) + self.classname = "teledeath2"; + if (self.owner.classname != "player") + { // other monsters explode themselves + T_Damage (self.owner, self, self, 50000); + return; + } + + } + + if (other.health) + { + T_Damage (other, self, self, 50000); + } +}; + + +void(vector org, entity death_owner) spawn_tdeath = +{ +local entity death; + + death = spawn(); + death.classname = "teledeath"; + death.movetype = MOVETYPE_NONE; + death.solid = SOLID_TRIGGER; + death.angles = '0 0 0'; + setsize (death, death_owner.mins - '1 1 1', death_owner.maxs + '1 1 1'); + setorigin (death, org); + death.touch = tdeath_touch; + death.nextthink = time + 0.2; + death.think = SUB_Remove; + death.owner = death_owner; + + force_retouch = 2; // make sure even still objects get hit +}; + +void() teleport_touch = +{ +local entity t; +local vector org; + + if (self.targetname) + { + if (self.nextthink < time) + { + return; // not fired yet + } + } + + if (self.spawnflags & PLAYER_ONLY) + { + if (other.classname != "player") + return; + } + +// only teleport living creatures + if (other.health <= 0 || other.solid != SOLID_SLIDEBOX) + return; + + SUB_UseTargets (); + +// put a tfog where the player was + spawn_tfog (other.origin); + + t = find (world, targetname, self.target); + if (!t) + objerror ("couldn't find target"); + +// spawn a tfog flash in front of the destination + makevectors (t.mangle); + org = t.origin + 32 * v_forward; + + spawn_tfog (org); + spawn_tdeath(t.origin, other); + +// move the player and lock him down for a little while + if (!other.health) + { + other.origin = t.origin; + other.velocity = (v_forward * other.velocity_x) + (v_forward * other.velocity_y); + return; + } + + setorigin (other, t.origin); + other.angles = t.mangle; + if (other.classname == "player") + { + other.fixangle = 1; // turn this way immediately + other.teleport_time = time + 0.7; + if (other.flags & FL_ONGROUND) + other.flags = other.flags - FL_ONGROUND; + other.velocity = v_forward * 300; + } + other.flags = other.flags - other.flags & FL_ONGROUND; +}; + +/*QUAKED info_teleport_destination (.5 .5 .5) (-8 -8 -8) (8 8 32) +This is the destination marker for a teleporter. It should have a "targetname" field with the same value as a teleporter's "target" field. +*/ +void() info_teleport_destination = +{ +// this does nothing, just serves as a target spot + self.mangle = self.angles; + self.angles = '0 0 0'; + self.model = ""; + self.origin = self.origin + '0 0 27'; + if (!self.targetname) + objerror ("no targetname"); +}; + +void() teleport_use = +{ + self.nextthink = time + 0.2; + force_retouch = 2; // make sure even still objects get hit + self.think = SUB_Null; +}; + +/*QUAKED trigger_teleport (.5 .5 .5) ? PLAYER_ONLY SILENT +Any object touching this will be transported to the corresponding info_teleport_destination entity. You must set the "target" field, and create an object with a "targetname" field that matches. + +If the trigger_teleport has a targetname, it will only teleport entities when it has been fired. +*/ +void() trigger_teleport = +{ + local vector o; + + InitTrigger (); + self.touch = teleport_touch; + // find the destination + if (!self.target) + objerror ("no target"); + self.use = teleport_use; + + if (!(self.spawnflags & SILENT)) + { + precache_sound ("ambience/hum1.wav"); + o = (self.mins + self.maxs)*0.5; + ambientsound (o, "ambience/hum1.wav",0.5 , ATTN_STATIC); + } +}; + +/* +============================================================================== + +trigger_setskill + +============================================================================== +*/ + +void() trigger_skill_touch = +{ + if (other.classname != "player") + return; + + cvar_set ("skill", self.message); +}; + +/*QUAKED trigger_setskill (.5 .5 .5) ? +sets skill level to the value of "message". +Only used on start map. +*/ +void() trigger_setskill = +{ + InitTrigger (); + self.touch = trigger_skill_touch; +}; + + +/* +============================================================================== + +ONLY REGISTERED TRIGGERS + +============================================================================== +*/ + +void() trigger_onlyregistered_touch = +{ + if (other.classname != "player") + return; + if (self.attack_finished > time) + return; + + self.attack_finished = time + 2; + if (cvar("registered")) + { + self.message = ""; + SUB_UseTargets (); + remove (self); + } + else + { + if (self.message != "") + { + centerprint (other, self.message); + sound (other, CHAN_BODY, "misc/talk.wav", 1, ATTN_NORM); + } + } +}; + +/*QUAKED trigger_onlyregistered (.5 .5 .5) ? +Only fires if playing the registered version, otherwise prints the message +*/ +void() trigger_onlyregistered = +{ + precache_sound ("misc/talk.wav"); + InitTrigger (); + self.touch = trigger_onlyregistered_touch; +}; + +//============================================================================ + +void() hurt_on = +{ + self.solid = SOLID_TRIGGER; + self.nextthink = -1; +}; + +void() hurt_touch = +{ + if (other.takedamage) + { + self.solid = SOLID_NOT; + T_Damage (other, self, self, self.dmg); + self.think = hurt_on; + self.nextthink = time + 1; + } + + return; +}; + +/*QUAKED trigger_hurt (.5 .5 .5) ? +Any object touching this will be hurt +set dmg to damage amount +defalt dmg = 5 +*/ +void() trigger_hurt = +{ + InitTrigger (); + self.touch = hurt_touch; + if (!self.dmg) + self.dmg = 5; +}; + +//============================================================================ + +float PUSH_ONCE = 1; + +void() trigger_push_touch = +{ + if (other.classname == "grenade") + other.velocity = self.speed * self.movedir * 10; + else if (other.health > 0) + { + other.velocity = self.speed * self.movedir * 10; + if (other.classname == "player") + { + if (other.fly_sound < time) + { + other.fly_sound = time + 1.5; + sound (other, CHAN_AUTO, "ambience/windfly.wav", 1, ATTN_NORM); + } + } + } + if (self.spawnflags & PUSH_ONCE) + remove(self); +}; + + +/*QUAKED trigger_push (.5 .5 .5) ? PUSH_ONCE +Pushes the player +*/ +void() trigger_push = +{ + InitTrigger (); + precache_sound ("ambience/windfly.wav"); + self.touch = trigger_push_touch; + if (!self.speed) + self.speed = 1000; +}; + +//============================================================================ + +void() trigger_monsterjump_touch = +{ + if ( other.flags & (FL_MONSTER | FL_FLY | FL_SWIM) != FL_MONSTER ) + return; + +// set XY even if not on ground, so the jump will clear lips + other.velocity_x = self.movedir_x * self.speed; + other.velocity_y = self.movedir_y * self.speed; + + if ( !(other.flags & FL_ONGROUND) ) + return; + + other.flags = other.flags - FL_ONGROUND; + + other.velocity_z = self.height; +}; + +/*QUAKED trigger_monsterjump (.5 .5 .5) ? +Walking monsters that touch this will jump in the direction of the trigger's angle +"speed" default to 200, the speed thrown forward +"height" default to 200, the speed thrown upwards +*/ +void() trigger_monsterjump = +{ + if (!self.speed) + self.speed = 200; + if (!self.height) + self.height = 200; + if (self.angles == '0 0 0') + self.angles = '0 360 0'; + InitTrigger (); + self.touch = trigger_monsterjump_touch; +}; + diff --git a/src/weapons.qc b/src/weapons.qc new file mode 100644 index 0000000..4b8fe78 --- /dev/null +++ b/src/weapons.qc @@ -0,0 +1,1320 @@ +/* +*/ +void (entity targ, entity inflictor, entity attacker, float damage) T_Damage; +void () player_run; +void(entity bomb, entity attacker, float rad, entity ignore) T_RadiusDamage; +void(vector org, vector vel, float damage) SpawnBlood; +void() SuperDamageSound; + + +// called by worldspawn +void() W_Precache = +{ + precache_sound ("weapons/r_exp3.wav"); // new rocket explosion + precache_sound ("weapons/rocket1i.wav"); // spike gun + precache_sound ("weapons/sgun1.wav"); + precache_sound ("weapons/guncock.wav"); // player shotgun + precache_sound ("weapons/ric1.wav"); // ricochet (used in c code) + precache_sound ("weapons/ric2.wav"); // ricochet (used in c code) + precache_sound ("weapons/ric3.wav"); // ricochet (used in c code) + precache_sound ("weapons/spike2.wav"); // super spikes + precache_sound ("weapons/tink1.wav"); // spikes tink (used in c code) + precache_sound ("weapons/grenade.wav"); // grenade launcher + precache_sound ("weapons/bounce.wav"); // grenade bounce + precache_sound ("weapons/shotgn2.wav"); // super shotgun + PortalPrecache(); +}; + +float() crandom = +{ + return 2*(random() - 0.5); +}; + +/* +================ +W_FireAxe +================ +*/ +void() W_FireAxe = +{ + local vector source; + local vector org; + + makevectors (self.v_angle); + source = self.origin + '0 0 16'; + traceline (source, source + v_forward*64, FALSE, self); + if (trace_fraction == 1.0) + return; + + org = trace_endpos - v_forward*4; + + if (trace_ent.takedamage) + { + trace_ent.axhitme = 1; + SpawnBlood (org, '0 0 0', 20); + T_Damage (trace_ent, self, self, 20); + } + else + { // hit wall + sound (self, CHAN_WEAPON, "player/axhit2.wav", 1, ATTN_NORM); + WriteByte (MSG_BROADCAST, SVC_TEMPENTITY); + WriteByte (MSG_BROADCAST, TE_GUNSHOT); + WriteCoord (MSG_BROADCAST, org_x); + WriteCoord (MSG_BROADCAST, org_y); + WriteCoord (MSG_BROADCAST, org_z); + } +}; + + +//============================================================================ + + +vector() wall_velocity = +{ + local vector vel; + + vel = normalize (self.velocity); + vel = normalize(vel + v_up*(random()- 0.5) + v_right*(random()- 0.5)); + vel = vel + 2*trace_plane_normal; + vel = vel * 200; + + return vel; +}; + + +/* +================ +SpawnMeatSpray +================ +*/ +void(vector org, vector vel) SpawnMeatSpray = +{ + local entity missile, mpuff; +// local vector org; + + missile = spawn (); + missile.owner = self; + missile.movetype = MOVETYPE_BOUNCE; + missile.solid = SOLID_NOT; + + makevectors (self.angles); + + missile.velocity = vel; + missile.velocity_z = missile.velocity_z + 250 + 50*random(); + + missile.avelocity = '3000 1000 2000'; + +// set missile duration + missile.nextthink = time + 1; + missile.think = SUB_Remove; + + setmodel (missile, "progs/zom_gib.mdl"); + setsize (missile, '0 0 0', '0 0 0'); + setorigin (missile, org); +}; + +/* +================ +SpawnBlood +================ +*/ +void(vector org, vector vel, float damage) SpawnBlood = +{ + particle (org, vel*0.1, 73, damage*2); +}; + +/* +================ +spawn_touchblood +================ +*/ +void(float damage) spawn_touchblood = +{ + local vector vel; + + vel = wall_velocity () * 0.2; + SpawnBlood (self.origin + vel*0.01, vel, damage); +}; + + +/* +================ +SpawnChunk +================ +*/ +void(vector org, vector vel) SpawnChunk = +{ + particle (org, vel*0.02, 0, 10); +}; + +/* +============================================================================== + +MULTI-DAMAGE + +Collects multiple small damages into a single damage + +============================================================================== +*/ + +entity multi_ent; +float multi_damage; + +void() ClearMultiDamage = +{ + multi_ent = world; + multi_damage = 0; +}; + +void() ApplyMultiDamage = +{ + if (!multi_ent) + return; + T_Damage (multi_ent, self, self, multi_damage); +}; + +void(entity hit, float damage) AddMultiDamage = +{ + if (!hit) + return; + + if (hit != multi_ent) + { + ApplyMultiDamage (); + multi_damage = damage; + multi_ent = hit; + } + else + multi_damage = multi_damage + damage; +}; + +/* +============================================================================== + +BULLETS + +============================================================================== +*/ + +/* +================ +TraceAttack +================ +*/ +void(float damage, vector dir) TraceAttack = +{ + local vector vel, org; + + vel = normalize(dir + v_up*crandom() + v_right*crandom()); + vel = vel + 2*trace_plane_normal; + vel = vel * 200; + + org = trace_endpos - dir*4; + + if (trace_ent.takedamage) + { + SpawnBlood (org, vel*0.2, damage); + AddMultiDamage (trace_ent, damage); + } + else + { + WriteByte (MSG_BROADCAST, SVC_TEMPENTITY); + WriteByte (MSG_BROADCAST, TE_GUNSHOT); + WriteCoord (MSG_BROADCAST, org_x); + WriteCoord (MSG_BROADCAST, org_y); + WriteCoord (MSG_BROADCAST, org_z); + } +}; + +/* +================ +FireBullets + +Used by shotgun, super shotgun, and enemy soldier firing +Go to the trouble of combining multiple pellets into a single damage call. +================ +*/ +void(float shotcount, vector dir, vector spread) FireBullets = +{ + local vector direction; + local vector src; + + makevectors(self.v_angle); + + src = self.origin + v_forward*10; + src_z = self.absmin_z + self.size_z * 0.7; + + ClearMultiDamage (); + while (shotcount > 0) + { + direction = dir + crandom()*spread_x*v_right + crandom()*spread_y*v_up; + + traceline (src, src + direction*2048, FALSE, self); + if (trace_fraction != 1.0) + TraceAttack (4, direction); + + shotcount = shotcount - 1; + } + ApplyMultiDamage (); +}; + +/* +================ +W_FireShotgun +================ +*/ +void() W_FireShotgun = +{ + local vector dir; + + sound (self, CHAN_WEAPON, "weapons/guncock.wav", 1, ATTN_NORM); + + self.punchangle_x = -2; + + self.currentammo = self.ammo_shells = self.ammo_shells - 1; + dir = aim (self, 100000); + FireBullets (6, dir, '0.04 0.04 0'); +}; + + +/* +================ +W_FireSuperShotgun +================ +*/ +void() W_FireSuperShotgun = +{ + local vector dir; + + if (self.currentammo == 1) + { + W_FireShotgun (); + return; + } + + sound (self ,CHAN_WEAPON, "weapons/shotgn2.wav", 1, ATTN_NORM); + + self.punchangle_x = -4; + + self.currentammo = self.ammo_shells = self.ammo_shells - 2; + dir = aim (self, 100000); + FireBullets (14, dir, '0.14 0.08 0'); +}; + + +/* +============================================================================== + +ROCKETS + +============================================================================== +*/ + +void() s_explode1 = [0, s_explode2] {}; +void() s_explode2 = [1, s_explode3] {}; +void() s_explode3 = [2, s_explode4] {}; +void() s_explode4 = [3, s_explode5] {}; +void() s_explode5 = [4, s_explode6] {}; +void() s_explode6 = [5, SUB_Remove] {}; + +void() BecomeExplosion = +{ + self.movetype = MOVETYPE_NONE; + self.velocity = '0 0 0'; + self.touch = SUB_Null; + setmodel (self, "progs/s_explod.spr"); + self.solid = SOLID_NOT; + s_explode1 (); +}; + +void() T_MissileTouch = +{ + local float damg; + + if (other == self.owner) + return; // don't explode on owner + + if (pointcontents(self.origin) == CONTENT_SKY) + { + remove(self); + return; + } + + damg = 100 + random()*20; + + if (other.health) + { + if (other.classname == "monster_shambler") + damg = damg * 0.5; // mostly immune + T_Damage (other, self, self.owner, damg ); + } + + // don't do radius damage to the other, because all the damage + // was done in the impact + T_RadiusDamage (self, self.owner, 120, other); + +// sound (self, CHAN_WEAPON, "weapons/r_exp3.wav", 1, ATTN_NORM); + self.origin = self.origin - 8*normalize(self.velocity); + + WriteByte (MSG_BROADCAST, SVC_TEMPENTITY); + WriteByte (MSG_BROADCAST, TE_EXPLOSION); + WriteCoord (MSG_BROADCAST, self.origin_x); + WriteCoord (MSG_BROADCAST, self.origin_y); + WriteCoord (MSG_BROADCAST, self.origin_z); + + BecomeExplosion (); +}; + +/* +================ +W_FireRocket +================ +*/ +void() W_FireRocket = +{ + local entity missile, mpuff; + + self.currentammo = self.ammo_rockets = self.ammo_rockets - 1; + + sound (self, CHAN_WEAPON, "weapons/sgun1.wav", 1, ATTN_NORM); + + self.punchangle_x = -2; + + missile = spawn (); + missile.owner = self; + missile.movetype = MOVETYPE_FLY; + missile.solid = SOLID_BBOX; + missile.classname = "missile"; + +// set missile speed + + makevectors (self.v_angle); + missile.velocity = aim(self, 1000); + missile.velocity = missile.velocity * 1000; + missile.angles = vectoangles(missile.velocity); + + missile.touch = T_MissileTouch; + +// set missile duration + missile.nextthink = time + 60; + missile.think = SUB_Remove; + + setmodel (missile, "progs/missile.mdl"); + setsize (missile, '0 0 0', '0 0 0'); + setorigin (missile, self.origin + v_forward*8 + '0 0 16'); +}; + +/* +=============================================================================== + +LIGHTNING + +=============================================================================== +*/ + +/* +================= +LightningDamage +================= +*/ +void(vector p1, vector p2, entity from, float damage) LightningDamage = +{ + local entity e1, e2; + local vector f; + + f = p2 - p1; + normalize (f); + f_x = 0 - f_y; + f_y = f_x; + f_z = 0; + f = f*16; + + e1 = e2 = world; + + traceline (p1, p2, FALSE, self); + if (trace_ent.takedamage) + { + particle (trace_endpos, '0 0 100', 225, damage*4); + T_Damage (trace_ent, from, from, damage); + if (self.classname == "player") + { + if (other.classname == "player") + trace_ent.velocity_z = trace_ent.velocity_z + 400; + } + } + e1 = trace_ent; + + traceline (p1 + f, p2 + f, FALSE, self); + if (trace_ent != e1 && trace_ent.takedamage) + { + particle (trace_endpos, '0 0 100', 225, damage*4); + T_Damage (trace_ent, from, from, damage); + } + e2 = trace_ent; + + traceline (p1 - f, p2 - f, FALSE, self); + if (trace_ent != e1 && trace_ent != e2 && trace_ent.takedamage) + { + particle (trace_endpos, '0 0 100', 225, damage*4); + T_Damage (trace_ent, from, from, damage); + } +}; + + +void() W_FireLightning = +{ + local vector org; + local float cells; + + if (self.ammo_cells < 1) + { + self.weapon = W_BestWeapon (); + W_SetCurrentAmmo (); + return; + } + +// explode if under water + if (self.waterlevel > 1) + { + cells = self.ammo_cells; + self.ammo_cells = 0; + W_SetCurrentAmmo (); + T_RadiusDamage (self, self, 35*cells, world); + return; + } + + if (self.t_width < time) + { + sound (self, CHAN_WEAPON, "weapons/lhit.wav", 1, ATTN_NORM); + self.t_width = time + 0.6; + } + self.punchangle_x = -2; + + self.currentammo = self.ammo_cells = self.ammo_cells - 1; + + org = self.origin + '0 0 16'; + + traceline (org, org + v_forward*600, TRUE, self); + + WriteByte (MSG_BROADCAST, SVC_TEMPENTITY); + WriteByte (MSG_BROADCAST, TE_LIGHTNING2); + WriteEntity (MSG_BROADCAST, self); + WriteCoord (MSG_BROADCAST, org_x); + WriteCoord (MSG_BROADCAST, org_y); + WriteCoord (MSG_BROADCAST, org_z); + WriteCoord (MSG_BROADCAST, trace_endpos_x); + WriteCoord (MSG_BROADCAST, trace_endpos_y); + WriteCoord (MSG_BROADCAST, trace_endpos_z); + + LightningDamage (self.origin, trace_endpos + v_forward*4, self, 30); +}; + + +//============================================================================= + + +void() GrenadeExplode = +{ + T_RadiusDamage (self, self.owner, 120, world); + + WriteByte (MSG_BROADCAST, SVC_TEMPENTITY); + WriteByte (MSG_BROADCAST, TE_EXPLOSION); + WriteCoord (MSG_BROADCAST, self.origin_x); + WriteCoord (MSG_BROADCAST, self.origin_y); + WriteCoord (MSG_BROADCAST, self.origin_z); + + BecomeExplosion (); +}; + +void() GrenadeTouch = +{ + if (other == self.owner) + return; // don't explode on owner + if (other.takedamage == DAMAGE_AIM) + { + GrenadeExplode(); + return; + } + sound (self, CHAN_WEAPON, "weapons/bounce.wav", 1, ATTN_NORM); // bounce sound + if (self.velocity == '0 0 0') + self.avelocity = '0 0 0'; +}; + +/* +================ +W_FireGrenade +================ +*/ +void() W_FireGrenade = +{ + local entity missile, mpuff; + + self.currentammo = self.ammo_rockets = self.ammo_rockets - 1; + + sound (self, CHAN_WEAPON, "weapons/grenade.wav", 1, ATTN_NORM); + + self.punchangle_x = -2; + + missile = spawn (); + missile.owner = self; + missile.movetype = MOVETYPE_BOUNCE; + missile.solid = SOLID_BBOX; + missile.classname = "grenade"; + +// set missile speed + + makevectors (self.v_angle); + + if (self.v_angle_x) + missile.velocity = v_forward*600 + v_up * 200 + crandom()*v_right*10 + crandom()*v_up*10; + else + { + missile.velocity = aim(self, 10000); + missile.velocity = missile.velocity * 600; + missile.velocity_z = 200; + } + + missile.avelocity = '300 300 300'; + + missile.angles = vectoangles(missile.velocity); + + missile.touch = GrenadeTouch; + +// set missile duration +// ### Added for Custents all affecting gravity +// missile.nextthink ; + missile.gravity = self.gravity; + missile.nextthink = time + 2 + (1/missile.gravity); + if(missile.nextthink < (time+1)) + missile.nextthink = time + 1; + if(missile.nextthink > (time+15)) + missile.nextthink = time + 15; +// ### + missile.think = GrenadeExplode; + + setmodel (missile, "progs/grenade.mdl"); + setsize (missile, '0 0 0', '0 0 0'); + setorigin (missile, self.origin); + +}; + + +//============================================================================= + +void() spike_touch; +void() superspike_touch; + + +/* +=============== +launch_spike + +Used for both the player and the ogre +=============== +*/ +void(vector org, vector dir) launch_spike = +{ + newmis = spawn (); + newmis.owner = self; + newmis.movetype = MOVETYPE_FLYMISSILE; + newmis.solid = SOLID_BBOX; + + newmis.angles = vectoangles(dir); + + newmis.touch = spike_touch; + newmis.classname = "spike"; + newmis.think = SUB_Remove; + newmis.nextthink = time + 6; + setmodel (newmis, "progs/spike.mdl"); + setsize (newmis, VEC_ORIGIN, VEC_ORIGIN); + setorigin (newmis, org); + + newmis.velocity = dir * 1000; +}; + +void() W_FireSuperSpikes = +{ + local vector dir; + local entity old; + + sound (self, CHAN_WEAPON, "weapons/spike2.wav", 1, ATTN_NORM); + self.attack_finished = time + 0.2; + self.currentammo = self.ammo_nails = self.ammo_nails - 2; + dir = aim (self, 1000); + launch_spike (self.origin + '0 0 16', dir); + newmis.touch = superspike_touch; + setmodel (newmis, "progs/s_spike.mdl"); + setsize (newmis, VEC_ORIGIN, VEC_ORIGIN); + self.punchangle_x = -2; +}; + +void(float ox) W_FireSpikes = +{ + local vector dir; + local entity old; + + makevectors (self.v_angle); + + if (self.ammo_nails >= 2 && self.weapon == IT_SUPER_NAILGUN) + { + W_FireSuperSpikes (); + return; + } + + if (self.ammo_nails < 1) + { + self.weapon = W_BestWeapon (); + W_SetCurrentAmmo (); + return; + } + + sound (self, CHAN_WEAPON, "weapons/rocket1i.wav", 1, ATTN_NORM); + self.attack_finished = time + 0.2; + self.currentammo = self.ammo_nails = self.ammo_nails - 1; + dir = aim (self, 1000); + launch_spike (self.origin + '0 0 16' + v_right*ox, dir); + + self.punchangle_x = -2; +}; + + + +.float hit_z; +void() spike_touch = +{ +local float rand; + if (other == self.owner) + return; + + if (other.solid == SOLID_TRIGGER) + return; // trigger field, do nothing + + if (pointcontents(self.origin) == CONTENT_SKY) + { + remove(self); + return; + } + +// hit something that bleeds + if (other.takedamage) + { + spawn_touchblood (9); + T_Damage (other, self, self.owner, 9); + } + else + { + WriteByte (MSG_BROADCAST, SVC_TEMPENTITY); + + if (self.classname == "wizspike") + WriteByte (MSG_BROADCAST, TE_WIZSPIKE); + else if (self.classname == "knightspike") + WriteByte (MSG_BROADCAST, TE_KNIGHTSPIKE); + else + WriteByte (MSG_BROADCAST, TE_SPIKE); + WriteCoord (MSG_BROADCAST, self.origin_x); + WriteCoord (MSG_BROADCAST, self.origin_y); + WriteCoord (MSG_BROADCAST, self.origin_z); + } + + remove(self); + +}; + +void() superspike_touch = +{ +local float rand; + if (other == self.owner) + return; + + if (other.solid == SOLID_TRIGGER) + return; // trigger field, do nothing + + if (pointcontents(self.origin) == CONTENT_SKY) + { + remove(self); + return; + } + +// hit something that bleeds + if (other.takedamage) + { + spawn_touchblood (18); + T_Damage (other, self, self.owner, 18); + } + else + { + WriteByte (MSG_BROADCAST, SVC_TEMPENTITY); + WriteByte (MSG_BROADCAST, TE_SUPERSPIKE); + WriteCoord (MSG_BROADCAST, self.origin_x); + WriteCoord (MSG_BROADCAST, self.origin_y); + WriteCoord (MSG_BROADCAST, self.origin_z); + } + + remove(self); + +}; + + +/* +=============================================================================== + +PLAYER WEAPON USE + +=============================================================================== +*/ + +void() W_SetCurrentAmmo = +{ + player_run (); // get out of any weapon firing states + + self.items = self.items - ( self.items & (IT_SHELLS | IT_NAILS | IT_ROCKETS | IT_CELLS) ); + + if (self.weapon == IT_AXE) + { + self.currentammo = 0; + self.weaponmodel = "progs/v_axe.mdl"; + self.weaponframe = 0; + } + else if (self.weapon == IT_SHOTGUN) + { + self.currentammo = self.ammo_shells; + self.weaponmodel = "progs/v_shot.mdl"; + self.weaponframe = 0; + self.items = self.items | IT_SHELLS; + } + else if (self.weapon == IT_SUPER_SHOTGUN) + { + self.currentammo = self.ammo_shells; + self.weaponmodel = "progs/v_shot2.mdl"; + self.weaponframe = 0; + self.items = self.items | IT_SHELLS; + } + else if (self.weapon == IT_NAILGUN) + { + self.currentammo = self.ammo_nails; + self.weaponmodel = "progs/v_nail.mdl"; + self.weaponframe = 0; + self.items = self.items | IT_NAILS; + } + else if (self.weapon == IT_SUPER_NAILGUN) + { + self.currentammo = self.ammo_nails; + self.weaponmodel = "progs/v_nail2.mdl"; + self.weaponframe = 0; + self.items = self.items | IT_NAILS; + } + else if (self.weapon == IT_GRENADE_LAUNCHER) + { + self.currentammo = self.ammo_rockets; + self.weaponmodel = "progs/v_rock.mdl"; + self.weaponframe = 0; + self.items = self.items | IT_ROCKETS; + } + else if (self.weapon == IT_ROCKET_LAUNCHER) + { + self.currentammo = self.ammo_rockets; + self.weaponmodel = "progs/v_rock2.mdl"; + self.weaponframe = 0; + self.items = self.items | IT_ROCKETS; + } + else if (self.weapon == IT_LIGHTNING) + { + self.currentammo = self.ammo_cells; + self.weaponmodel = "progs/v_light.mdl"; + self.weaponframe = 0; + self.items = self.items | IT_CELLS; + } + else if (self.weapon == IT_PORTAL_GUN) + { + self.currentammo = 1; + self.weaponmodel = model_portalgun; + self.weaponframe = 0; + } + else + { + self.currentammo = 0; + self.weaponmodel = ""; + self.weaponframe = 0; + } +}; + +float() W_BestWeapon = +{ + local float it; + + it = self.items; + + if (self.waterlevel <= 1 && self.ammo_cells >= 1 && (it & IT_LIGHTNING) ) + return IT_LIGHTNING; + if(self.ammo_nails >= 2 && (it & IT_SUPER_NAILGUN) ) + return IT_SUPER_NAILGUN; + if(self.ammo_shells >= 2 && (it & IT_SUPER_SHOTGUN) ) + return IT_SUPER_SHOTGUN; + if(self.ammo_nails >= 1 && (it & IT_NAILGUN) ) + return IT_NAILGUN; + if(self.ammo_shells >= 1 && (it & IT_SHOTGUN) ) + return IT_SHOTGUN; + return IT_AXE; +}; + +float() W_CheckNoAmmo = +{ + if (self.currentammo > 0) + return TRUE; + + if (self.weapon == IT_AXE) + return TRUE; + + self.weapon = W_BestWeapon (); + + W_SetCurrentAmmo (); + +// drop the weapon down + return FALSE; +}; + +/* +============ +W_Attack + +An attack impulse can be triggered now +============ +*/ +void() player_axe1; +void() player_axeb1; +void() player_axec1; +void() player_axed1; +void() player_shot1; +void() player_nail1; +void() player_light1; +void() player_rocket1; +void() player_portal1; + +void() W_Attack = +{ + local float r; + + if (!W_CheckNoAmmo ()) + return; + + makevectors (self.v_angle); // calculate forward angle for velocity + self.show_hostile = time + 1; // wake monsters up + + if (self.weapon == IT_AXE) + { + sound (self, CHAN_WEAPON, "weapons/ax1.wav", 1, ATTN_NORM); + r = random(); + if (r < 0.25) + player_axe1 (); + else if (r<0.5) + player_axeb1 (); + else if (r<0.75) + player_axec1 (); + else + player_axed1 (); + self.attack_finished = time + 0.5; + } + else if (self.weapon == IT_SHOTGUN) + { + player_shot1 (); + W_FireShotgun (); + self.attack_finished = time + 0.5; + } + else if (self.weapon == IT_SUPER_SHOTGUN) + { + player_shot1 (); + W_FireSuperShotgun (); + self.attack_finished = time + 0.7; + } + else if (self.weapon == IT_NAILGUN) + { + player_nail1 (); + } + else if (self.weapon == IT_SUPER_NAILGUN) + { + player_nail1 (); + } + else if (self.weapon == IT_GRENADE_LAUNCHER) + { + player_rocket1(); + W_FireGrenade(); + self.attack_finished = time + 0.6; + } + else if (self.weapon == IT_ROCKET_LAUNCHER) + { + player_rocket1(); + W_FireRocket(); + self.attack_finished = time + 0.8; + } + else if (self.weapon == IT_LIGHTNING) + { + player_light1(); + self.attack_finished = time + 0.1; + sound (self, CHAN_AUTO, "weapons/lstart.wav", 1, ATTN_NORM); + } + else if (self.weapon == IT_PORTAL_GUN) { + player_portal1(); + self.attack_finished = time + 0.8; + } +}; + +/* +============ +W_ChangeWeapon + +============ +*/ +void() W_ChangeWeapon = +{ + local float it, am, fl; + + it = self.items; + am = 0; + + if (self.impulse == 1) + { + fl = IT_AXE; + } + else if (self.impulse == 2) + { + fl = IT_SHOTGUN; + if (self.ammo_shells < 1) + am = 1; + } + else if (self.impulse == 3) + { + fl = IT_SUPER_SHOTGUN; + if (self.ammo_shells < 2) + am = 1; + } + else if (self.impulse == 4) + { + fl = IT_NAILGUN; + if (self.ammo_nails < 1) + am = 1; + } + else if (self.impulse == 5) + { + fl = IT_SUPER_NAILGUN; + if (self.ammo_nails < 2) + am = 1; + } + else if (self.impulse == 6) + { + fl = IT_GRENADE_LAUNCHER; + if (self.ammo_rockets < 1) + am = 1; + } + else if (self.impulse == 7) + { + fl = IT_ROCKET_LAUNCHER; + if (self.ammo_rockets < 1) + am = 1; + } + else if (self.impulse == 8) + { + fl = IT_LIGHTNING; + if (self.ammo_cells < 1) + am = 1; + } + + self.impulse = 0; + + if (!(self.items & fl)) + { // don't have the weapon or the ammo + sprint (self, "no weapon.\n"); + return; + } + + if (am) + { // don't have the ammo + sprint (self, "not enough ammo.\n"); + return; + } + +// +// set weapon, set ammo +// + self.weapon = fl; + W_SetCurrentAmmo (); +}; + +/* +============ +CheatCommand +============ +*/ +void() CheatCommand = +{ + if (deathmatch) + return; + + self.ammo_rockets = 100; + self.ammo_nails = 200; + self.ammo_shells = 100; + self.items = self.items | + IT_AXE | + IT_SHOTGUN | + IT_SUPER_SHOTGUN | + IT_NAILGUN | + IT_SUPER_NAILGUN | + IT_GRENADE_LAUNCHER | + IT_ROCKET_LAUNCHER | + IT_KEY1 | IT_KEY2; + + self.ammo_cells = 200; + self.items = self.items | IT_LIGHTNING; + + self.weapon = IT_ROCKET_LAUNCHER; + self.impulse = 0; + W_SetCurrentAmmo (); +}; + +/* +============ +CycleWeaponCommand + +Go to the next weapon with ammo +============ +*/ +void() CycleWeaponCommand = +{ + local float it, am; + + it = self.items; + self.impulse = 0; + + while (1) + { + am = 0; + + if (self.weapon == IT_LIGHTNING) + { + self.weapon = IT_AXE; + } + else if (self.weapon == IT_AXE) + { + self.weapon = IT_SHOTGUN; + if (self.ammo_shells < 1) + am = 1; + } + else if (self.weapon == IT_SHOTGUN) + { + self.weapon = IT_SUPER_SHOTGUN; + if (self.ammo_shells < 2) + am = 1; + } + else if (self.weapon == IT_SUPER_SHOTGUN) + { + self.weapon = IT_NAILGUN; + if (self.ammo_nails < 1) + am = 1; + } + else if (self.weapon == IT_NAILGUN) + { + self.weapon = IT_SUPER_NAILGUN; + if (self.ammo_nails < 2) + am = 1; + } + else if (self.weapon == IT_SUPER_NAILGUN) + { + self.weapon = IT_GRENADE_LAUNCHER; + if (self.ammo_rockets < 1) + am = 1; + } + else if (self.weapon == IT_GRENADE_LAUNCHER) + { + self.weapon = IT_ROCKET_LAUNCHER; + if (self.ammo_rockets < 1) + am = 1; + } + else if (self.weapon == IT_ROCKET_LAUNCHER) + { + self.weapon = IT_LIGHTNING; + if (self.ammo_cells < 1) + am = 1; + } + else if (self.weapon == IT_PORTAL_GUN) + { + self.weapon = IT_SHOTGUN; + if (self.ammo_cells < 1) + am = 1; + } + + if ( (it & self.weapon) && am == 0) + { + W_SetCurrentAmmo (); + return; + } + } + +}; + +/* +============ +CycleWeaponReverseCommand + +Go to the prev weapon with ammo +============ +*/ +void() CycleWeaponReverseCommand = +{ + local float it, am; + + it = self.items; + self.impulse = 0; + + while (1) + { + am = 0; + + if (self.weapon == IT_LIGHTNING) + { + self.weapon = IT_ROCKET_LAUNCHER; + if (self.ammo_rockets < 1) + am = 1; + } + else if (self.weapon == IT_ROCKET_LAUNCHER) + { + self.weapon = IT_GRENADE_LAUNCHER; + if (self.ammo_rockets < 1) + am = 1; + } + else if (self.weapon == IT_GRENADE_LAUNCHER) + { + self.weapon = IT_SUPER_NAILGUN; + if (self.ammo_nails < 2) + am = 1; + } + else if (self.weapon == IT_SUPER_NAILGUN) + { + self.weapon = IT_NAILGUN; + if (self.ammo_nails < 1) + am = 1; + } + else if (self.weapon == IT_NAILGUN) + { + self.weapon = IT_SUPER_SHOTGUN; + if (self.ammo_shells < 2) + am = 1; + } + else if (self.weapon == IT_SUPER_SHOTGUN) + { + self.weapon = IT_SHOTGUN; + if (self.ammo_shells < 1) + am = 1; + } + else if (self.weapon == IT_SHOTGUN) + { + self.weapon = IT_AXE; + } + else if (self.weapon == IT_AXE) + { + self.weapon = IT_LIGHTNING; + if (self.ammo_cells < 1) + am = 1; + } + + if ( (it & self.weapon) && am == 0) + { + W_SetCurrentAmmo (); + return; + } + } + +}; + +/* +============ +ServerflagsCommand + +Just for development +============ +*/ +void() ServerflagsCommand = +{ + if (deathmatch) + return; + serverflags = serverflags * 2 + 1; +}; + +void() QuadCheat = +{ + if (deathmatch) + return; + self.super_time = 1; + self.super_damage_finished = time + 30; + self.items = self.items | IT_QUAD; + dprint ("quad cheat\n"); +}; + +/* +============ +ImpulseCommands + +============ +*/ +void() ImpulseCommands = +{ + if (self.impulse >= 1 && self.impulse <= 8) + W_ChangeWeapon (); + + if (self.impulse == 9) + CheatCommand (); + if (self.impulse == 10) + CycleWeaponCommand (); + if (self.impulse == 11) + ServerflagsCommand (); + if (self.impulse == 12) + CycleWeaponReverseCommand (); + + if (self.impulse == 255) + QuadCheat (); + + self.impulse = 0; +}; + +/* +============ +W_WeaponFrame + +Called every frame so impulse events can be handled as well as possible +============ +*/ +void() W_WeaponFrame = +{ + if (time < self.attack_finished) + return; + + if (self.impulse) PortalImpulses (); + if (self.impulse) ImpulseCommands (); + +// check for attack + if (self.button0) + { + SuperDamageSound (); + W_Attack (); + } +}; + +/* +======== +SuperDamageSound + +Plays sound if needed +======== +*/ +void() SuperDamageSound = +{ + if (self.super_damage_finished > time) + { + if (self.super_sound < time) + { + self.super_sound = time + 1; + sound (self, CHAN_BODY, "items/damage3.wav", 1, ATTN_NORM); + } + } + return; +}; + + diff --git a/src/wizard.qc b/src/wizard.qc new file mode 100644 index 0000000..aec327b --- /dev/null +++ b/src/wizard.qc @@ -0,0 +1,410 @@ +/* +============================================================================== + +WIZARD + +============================================================================== +*/ + +$cd id1/models/a_wizard +$origin 0 0 24 +$base wizbase +$skin wizbase + +$frame hover1 hover2 hover3 hover4 hover5 hover6 hover7 hover8 +$frame hover9 hover10 hover11 hover12 hover13 hover14 hover15 + +$frame fly1 fly2 fly3 fly4 fly5 fly6 fly7 fly8 fly9 fly10 +$frame fly11 fly12 fly13 fly14 + +$frame magatt1 magatt2 magatt3 magatt4 magatt5 magatt6 magatt7 +$frame magatt8 magatt9 magatt10 magatt11 magatt12 magatt13 + +$frame pain1 pain2 pain3 pain4 + +$frame death1 death2 death3 death4 death5 death6 death7 death8 + +/* +============================================================================== + +WIZARD + +If the player moves behind cover before the missile is launched, launch it +at the last visible spot with no velocity leading, in hopes that the player +will duck back out and catch it. +============================================================================== +*/ + +/* +============= +LaunchMissile + +Sets the given entities velocity and angles so that it will hit self.enemy +if self.enemy maintains it's current velocity +0.1 is moderately accurate, 0.0 is totally accurate +============= +*/ +void(entity missile, float mspeed, float accuracy) LaunchMissile = +{ + local vector vec, move; + local float fly; + + makevectors (self.angles); + +// set missile speed + vec = self.enemy.origin + self.enemy.mins + self.enemy.size * 0.7 - missile.origin; + +// calc aproximate time for missile to reach vec + fly = vlen (vec) / mspeed; + +// get the entities xy velocity + move = self.enemy.velocity; + move_z = 0; + +// project the target forward in time + vec = vec + move * fly; + + vec = normalize(vec); + vec = vec + accuracy*v_up*(random()- 0.5) + accuracy*v_right*(random()- 0.5); + + missile.velocity = vec * mspeed; + + missile.angles = '0 0 0'; + missile.angles_y = vectoyaw(missile.velocity); + +// set missile duration + missile.nextthink = time + 5; + missile.think = SUB_Remove; +}; + + +void() wiz_run1; +void() wiz_side1; + +/* +================= +WizardCheckAttack +================= +*/ +float() WizardCheckAttack = +{ + local vector spot1, spot2; + local entity targ; + local float chance; + + if (time < self.attack_finished) + return FALSE; + if (!enemy_vis) + return FALSE; + + if (enemy_range == RANGE_FAR) + { + if (self.attack_state != AS_STRAIGHT) + { + self.attack_state = AS_STRAIGHT; + wiz_run1 (); + } + return FALSE; + } + + targ = self.enemy; + +// see if any entities are in the way of the shot + spot1 = self.origin + self.view_ofs; + spot2 = targ.origin + targ.view_ofs; + + traceline (spot1, spot2, FALSE, self); + + if (trace_ent != targ) + { // don't have a clear shot, so move to a side + if (self.attack_state != AS_STRAIGHT) + { + self.attack_state = AS_STRAIGHT; + wiz_run1 (); + } + return FALSE; + } + + if (enemy_range == RANGE_MELEE) + chance = 0.9; + else if (enemy_range == RANGE_NEAR) + chance = 0.6; + else if (enemy_range == RANGE_MID) + chance = 0.2; + else + chance = 0; + + if (random () < chance) + { + self.attack_state = AS_MISSILE; + return TRUE; + } + + if (enemy_range == RANGE_MID) + { + if (self.attack_state != AS_STRAIGHT) + { + self.attack_state = AS_STRAIGHT; + wiz_run1 (); + } + } + else + { + if (self.attack_state != AS_SLIDING) + { + self.attack_state = AS_SLIDING; + wiz_side1 (); + } + } + + return FALSE; +}; + +/* +================= +WizardAttackFinished +================= +*/ +void() WizardAttackFinished = +{ + if (enemy_range >= RANGE_MID || !enemy_vis) + { + self.attack_state = AS_STRAIGHT; + self.think = wiz_run1; + } + else + { + self.attack_state = AS_SLIDING; + self.think = wiz_side1; + } +}; + +/* +============================================================================== + +FAST ATTACKS + +============================================================================== +*/ + +void() Wiz_FastFire = +{ + local vector vec; + local vector dst; + + if (self.owner.health > 0) + { + self.owner.effects = self.owner.effects | EF_MUZZLEFLASH; + + makevectors (self.enemy.angles); + dst = self.enemy.origin - 13*self.movedir; + + vec = normalize(dst - self.origin); + sound (self, CHAN_WEAPON, "wizard/wattack.wav", 1, ATTN_NORM); + launch_spike (self.origin, vec); + newmis.velocity = vec*600; + newmis.owner = self.owner; + newmis.classname = "wizspike"; + setmodel (newmis, "progs/w_spike.mdl"); + setsize (newmis, VEC_ORIGIN, VEC_ORIGIN); + } + + remove (self); +}; + + +void() Wiz_StartFast = +{ + local entity missile; + + sound (self, CHAN_WEAPON, "wizard/wattack.wav", 1, ATTN_NORM); + self.v_angle = self.angles; + makevectors (self.angles); + + missile = spawn (); + missile.owner = self; + missile.nextthink = time + 0.6; + setsize (missile, '0 0 0', '0 0 0'); + setorigin (missile, self.origin + '0 0 30' + v_forward*14 + v_right*14); + missile.enemy = self.enemy; + missile.nextthink = time + 0.8; + missile.think = Wiz_FastFire; + missile.movedir = v_right; + + missile = spawn (); + missile.owner = self; + missile.nextthink = time + 1; + setsize (missile, '0 0 0', '0 0 0'); + setorigin (missile, self.origin + '0 0 30' + v_forward*14 + v_right* -14); + missile.enemy = self.enemy; + missile.nextthink = time + 0.3; + missile.think = Wiz_FastFire; + missile.movedir = VEC_ORIGIN - v_right; +}; + + + +void() Wiz_idlesound = +{ +local float wr; + wr = random() * 5; + + if (self.waitmin < time) + { + self.waitmin = time + 2; + if (wr > 4.5) + sound (self, CHAN_VOICE, "wizard/widle1.wav", 1, ATTN_IDLE); + if (wr < 1.5) + sound (self, CHAN_VOICE, "wizard/widle2.wav", 1, ATTN_IDLE); + } + return; +}; + +void() wiz_stand1 =[ $hover1, wiz_stand2 ] {ai_stand();}; +void() wiz_stand2 =[ $hover2, wiz_stand3 ] {ai_stand();}; +void() wiz_stand3 =[ $hover3, wiz_stand4 ] {ai_stand();}; +void() wiz_stand4 =[ $hover4, wiz_stand5 ] {ai_stand();}; +void() wiz_stand5 =[ $hover5, wiz_stand6 ] {ai_stand();}; +void() wiz_stand6 =[ $hover6, wiz_stand7 ] {ai_stand();}; +void() wiz_stand7 =[ $hover7, wiz_stand8 ] {ai_stand();}; +void() wiz_stand8 =[ $hover8, wiz_stand1 ] {ai_stand();}; + +void() wiz_walk1 =[ $hover1, wiz_walk2 ] {ai_walk(8); +Wiz_idlesound();}; +void() wiz_walk2 =[ $hover2, wiz_walk3 ] {ai_walk(8);}; +void() wiz_walk3 =[ $hover3, wiz_walk4 ] {ai_walk(8);}; +void() wiz_walk4 =[ $hover4, wiz_walk5 ] {ai_walk(8);}; +void() wiz_walk5 =[ $hover5, wiz_walk6 ] {ai_walk(8);}; +void() wiz_walk6 =[ $hover6, wiz_walk7 ] {ai_walk(8);}; +void() wiz_walk7 =[ $hover7, wiz_walk8 ] {ai_walk(8);}; +void() wiz_walk8 =[ $hover8, wiz_walk1 ] {ai_walk(8);}; + +void() wiz_side1 =[ $hover1, wiz_side2 ] {ai_run(8); +Wiz_idlesound();}; +void() wiz_side2 =[ $hover2, wiz_side3 ] {ai_run(8);}; +void() wiz_side3 =[ $hover3, wiz_side4 ] {ai_run(8);}; +void() wiz_side4 =[ $hover4, wiz_side5 ] {ai_run(8);}; +void() wiz_side5 =[ $hover5, wiz_side6 ] {ai_run(8);}; +void() wiz_side6 =[ $hover6, wiz_side7 ] {ai_run(8);}; +void() wiz_side7 =[ $hover7, wiz_side8 ] {ai_run(8);}; +void() wiz_side8 =[ $hover8, wiz_side1 ] {ai_run(8);}; + +void() wiz_run1 =[ $fly1, wiz_run2 ] {ai_run(16); +Wiz_idlesound(); +}; +void() wiz_run2 =[ $fly2, wiz_run3 ] {ai_run(16);}; +void() wiz_run3 =[ $fly3, wiz_run4 ] {ai_run(16);}; +void() wiz_run4 =[ $fly4, wiz_run5 ] {ai_run(16);}; +void() wiz_run5 =[ $fly5, wiz_run6 ] {ai_run(16);}; +void() wiz_run6 =[ $fly6, wiz_run7 ] {ai_run(16);}; +void() wiz_run7 =[ $fly7, wiz_run8 ] {ai_run(16);}; +void() wiz_run8 =[ $fly8, wiz_run9 ] {ai_run(16);}; +void() wiz_run9 =[ $fly9, wiz_run10 ] {ai_run(16);}; +void() wiz_run10 =[ $fly10, wiz_run11 ] {ai_run(16);}; +void() wiz_run11 =[ $fly11, wiz_run12 ] {ai_run(16);}; +void() wiz_run12 =[ $fly12, wiz_run13 ] {ai_run(16);}; +void() wiz_run13 =[ $fly13, wiz_run14 ] {ai_run(16);}; +void() wiz_run14 =[ $fly14, wiz_run1 ] {ai_run(16);}; + +void() wiz_fast1 =[ $magatt1, wiz_fast2 ] {ai_face();Wiz_StartFast();}; +void() wiz_fast2 =[ $magatt2, wiz_fast3 ] {ai_face();}; +void() wiz_fast3 =[ $magatt3, wiz_fast4 ] {ai_face();}; +void() wiz_fast4 =[ $magatt4, wiz_fast5 ] {ai_face();}; +void() wiz_fast5 =[ $magatt5, wiz_fast6 ] {ai_face();}; +void() wiz_fast6 =[ $magatt6, wiz_fast7 ] {ai_face();}; +void() wiz_fast7 =[ $magatt5, wiz_fast8 ] {ai_face();}; +void() wiz_fast8 =[ $magatt4, wiz_fast9 ] {ai_face();}; +void() wiz_fast9 =[ $magatt3, wiz_fast10 ] {ai_face();}; +void() wiz_fast10 =[ $magatt2, wiz_run1 ] {ai_face();SUB_AttackFinished(2);WizardAttackFinished ();}; + +void() wiz_pain1 =[ $pain1, wiz_pain2 ] {}; +void() wiz_pain2 =[ $pain2, wiz_pain3 ] {}; +void() wiz_pain3 =[ $pain3, wiz_pain4 ] {}; +void() wiz_pain4 =[ $pain4, wiz_run1 ] {}; + +void() wiz_death1 =[ $death1, wiz_death2 ] { + +self.velocity_x = -200 + 400*random(); +self.velocity_y = -200 + 400*random(); +self.velocity_z = 100 + 100*random(); +self.flags = self.flags - (self.flags & FL_ONGROUND); +sound (self, CHAN_VOICE, "wizard/wdeath.wav", 1, ATTN_NORM); +}; +void() wiz_death2 =[ $death2, wiz_death3 ] {}; +void() wiz_death3 =[ $death3, wiz_death4 ]{self.solid = SOLID_NOT;}; +void() wiz_death4 =[ $death4, wiz_death5 ] {}; +void() wiz_death5 =[ $death5, wiz_death6 ] {}; +void() wiz_death6 =[ $death6, wiz_death7 ] {}; +void() wiz_death7 =[ $death7, wiz_death8 ] {}; +void() wiz_death8 =[ $death8, wiz_death8 ] {}; + +void() wiz_die = +{ +// check for gib + if (self.health < -40) + { + sound (self, CHAN_VOICE, "player/udeath.wav", 1, ATTN_NORM); + ThrowHead ("progs/h_wizard.mdl", self.health); + ThrowGib ("progs/gib2.mdl", self.health); + ThrowGib ("progs/gib2.mdl", self.health); + ThrowGib ("progs/gib2.mdl", self.health); + return; + } + + wiz_death1 (); +}; + + +void(entity attacker, float damage) Wiz_Pain = +{ + sound (self, CHAN_VOICE, "wizard/wpain.wav", 1, ATTN_NORM); + if (random()*70 > damage) + return; // didn't flinch + + wiz_pain1 (); +}; + + +void() Wiz_Missile = +{ + wiz_fast1(); +}; + +/*QUAKED monster_wizard (1 0 0) (-16 -16 -24) (16 16 40) Ambush +*/ +void() monster_wizard = +{ + if (deathmatch) + { + remove(self); + return; + } + precache_model ("progs/wizard.mdl"); + precache_model ("progs/h_wizard.mdl"); + precache_model ("progs/w_spike.mdl"); + + precache_sound ("wizard/hit.wav"); // used by c code + precache_sound ("wizard/wattack.wav"); + precache_sound ("wizard/wdeath.wav"); + precache_sound ("wizard/widle1.wav"); + precache_sound ("wizard/widle2.wav"); + precache_sound ("wizard/wpain.wav"); + precache_sound ("wizard/wsight.wav"); + + self.solid = SOLID_SLIDEBOX; + self.movetype = MOVETYPE_STEP; + + setmodel (self, "progs/wizard.mdl"); + + setsize (self, '-16 -16 -24', '16 16 40'); + self.health = 80; + + self.th_stand = wiz_stand1; + self.th_walk = wiz_walk1; + self.th_run = wiz_run1; + self.th_missile = Wiz_Missile; + self.th_pain = Wiz_Pain; + self.th_die = wiz_die; + + flymonster_start (); +}; diff --git a/src/world.qc b/src/world.qc new file mode 100644 index 0000000..4bf31cd --- /dev/null +++ b/src/world.qc @@ -0,0 +1,395 @@ + +void() InitBodyQue; + + +void() main = +{ + dprint ("main function\n"); + +// these are just commands the the prog compiler to copy these files + + precache_file ("progs.dat"); + precache_file ("gfx.wad"); + precache_file ("quake.rc"); + precache_file ("default.cfg"); + + precache_file ("end1.bin"); + precache_file2 ("end2.bin"); + + precache_file ("demo1.dem"); + precache_file ("demo2.dem"); + precache_file ("demo3.dem"); + +// +// these are all of the lumps from the cached.ls files +// + precache_file ("gfx/palette.lmp"); + precache_file ("gfx/colormap.lmp"); + + precache_file2 ("gfx/pop.lmp"); + + precache_file ("gfx/complete.lmp"); + precache_file ("gfx/inter.lmp"); + + precache_file ("gfx/ranking.lmp"); + precache_file ("gfx/vidmodes.lmp"); + precache_file ("gfx/finale.lmp"); + precache_file ("gfx/conback.lmp"); + precache_file ("gfx/qplaque.lmp"); + + precache_file ("gfx/menudot1.lmp"); + precache_file ("gfx/menudot2.lmp"); + precache_file ("gfx/menudot3.lmp"); + precache_file ("gfx/menudot4.lmp"); + precache_file ("gfx/menudot5.lmp"); + precache_file ("gfx/menudot6.lmp"); + + precache_file ("gfx/menuplyr.lmp"); + precache_file ("gfx/bigbox.lmp"); + precache_file ("gfx/dim_modm.lmp"); + precache_file ("gfx/dim_drct.lmp"); + precache_file ("gfx/dim_ipx.lmp"); + precache_file ("gfx/dim_tcp.lmp"); + precache_file ("gfx/dim_mult.lmp"); + precache_file ("gfx/mainmenu.lmp"); + + precache_file ("gfx/box_tl.lmp"); + precache_file ("gfx/box_tm.lmp"); + precache_file ("gfx/box_tr.lmp"); + + precache_file ("gfx/box_ml.lmp"); + precache_file ("gfx/box_mm.lmp"); + precache_file ("gfx/box_mm2.lmp"); + precache_file ("gfx/box_mr.lmp"); + + precache_file ("gfx/box_bl.lmp"); + precache_file ("gfx/box_bm.lmp"); + precache_file ("gfx/box_br.lmp"); + + precache_file ("gfx/sp_menu.lmp"); + precache_file ("gfx/ttl_sgl.lmp"); + precache_file ("gfx/ttl_main.lmp"); + precache_file ("gfx/ttl_cstm.lmp"); + + precache_file ("gfx/mp_menu.lmp"); + + precache_file ("gfx/netmen1.lmp"); + precache_file ("gfx/netmen2.lmp"); + precache_file ("gfx/netmen3.lmp"); + precache_file ("gfx/netmen4.lmp"); + precache_file ("gfx/netmen5.lmp"); + + precache_file ("gfx/sell.lmp"); + + precache_file ("gfx/help0.lmp"); + precache_file ("gfx/help1.lmp"); + precache_file ("gfx/help2.lmp"); + precache_file ("gfx/help3.lmp"); + precache_file ("gfx/help4.lmp"); + precache_file ("gfx/help5.lmp"); + + precache_file ("gfx/pause.lmp"); + precache_file ("gfx/loading.lmp"); + + precache_file ("gfx/p_option.lmp"); + precache_file ("gfx/p_load.lmp"); + precache_file ("gfx/p_save.lmp"); + precache_file ("gfx/p_multi.lmp"); + +// sounds loaded by C code + precache_sound ("misc/menu1.wav"); + precache_sound ("misc/menu2.wav"); + precache_sound ("misc/menu3.wav"); + + precache_sound ("ambience/water1.wav"); + precache_sound ("ambience/wind2.wav"); + +// shareware + precache_file ("maps/start.bsp"); + + precache_file ("maps/e1m1.bsp"); + precache_file ("maps/e1m2.bsp"); + precache_file ("maps/e1m3.bsp"); + precache_file ("maps/e1m4.bsp"); + precache_file ("maps/e1m5.bsp"); + precache_file ("maps/e1m6.bsp"); + precache_file ("maps/e1m7.bsp"); + precache_file ("maps/e1m8.bsp"); + +// registered + precache_file2 ("gfx/pop.lmp"); + + precache_file2 ("maps/e2m1.bsp"); + precache_file2 ("maps/e2m2.bsp"); + precache_file2 ("maps/e2m3.bsp"); + precache_file2 ("maps/e2m4.bsp"); + precache_file2 ("maps/e2m5.bsp"); + precache_file2 ("maps/e2m6.bsp"); + precache_file2 ("maps/e2m7.bsp"); + + precache_file2 ("maps/e3m1.bsp"); + precache_file2 ("maps/e3m2.bsp"); + precache_file2 ("maps/e3m3.bsp"); + precache_file2 ("maps/e3m4.bsp"); + precache_file2 ("maps/e3m5.bsp"); + precache_file2 ("maps/e3m6.bsp"); + precache_file2 ("maps/e3m7.bsp"); + + precache_file2 ("maps/e4m1.bsp"); + precache_file2 ("maps/e4m2.bsp"); + precache_file2 ("maps/e4m3.bsp"); + precache_file2 ("maps/e4m4.bsp"); + precache_file2 ("maps/e4m5.bsp"); + precache_file2 ("maps/e4m6.bsp"); + precache_file2 ("maps/e4m7.bsp"); + precache_file2 ("maps/e4m8.bsp"); + + precache_file2 ("maps/end.bsp"); + + precache_file2 ("maps/dm1.bsp"); + precache_file2 ("maps/dm2.bsp"); + precache_file2 ("maps/dm3.bsp"); + precache_file2 ("maps/dm4.bsp"); + precache_file2 ("maps/dm5.bsp"); + precache_file2 ("maps/dm6.bsp"); +}; + + +entity lastspawn; + +//======================= +/*QUAKED worldspawn (0 0 0) ? +Only used for the world entity. +Set message to the level name. +Set sounds to the cd track to play. + +World Types: +0: medieval +1: metal +2: base +*/ +//======================= +void() worldspawn = +{ + lastspawn = world; + InitBodyQue (); + +// custom map attributes + if (self.model == "maps/e1m8.bsp") + cvar_set ("sv_gravity", "100"); + else + cvar_set ("sv_gravity", "800"); + +// the area based ambient sounds MUST be the first precache_sounds + +// player precaches + W_Precache (); // get weapon precaches + +// sounds used from C physics code + precache_sound ("demon/dland2.wav"); // landing thud + precache_sound ("misc/h2ohit1.wav"); // landing splash + +// setup precaches allways needed + precache_sound ("items/itembk2.wav"); // item respawn sound + precache_sound ("player/plyrjmp8.wav"); // player jump + precache_sound ("player/land.wav"); // player landing + precache_sound ("player/land2.wav"); // player hurt landing + precache_sound ("player/drown1.wav"); // drowning pain + precache_sound ("player/drown2.wav"); // drowning pain + precache_sound ("player/gasp1.wav"); // gasping for air + precache_sound ("player/gasp2.wav"); // taking breath + precache_sound ("player/h2odeath.wav"); // drowning death + + precache_sound ("misc/talk.wav"); // talk + precache_sound ("player/teledth1.wav"); // telefrag + precache_sound ("misc/r_tele1.wav"); // teleport sounds + precache_sound ("misc/r_tele2.wav"); + precache_sound ("misc/r_tele3.wav"); + precache_sound ("misc/r_tele4.wav"); + precache_sound ("misc/r_tele5.wav"); + precache_sound ("weapons/lock4.wav"); // ammo pick up + precache_sound ("weapons/pkup.wav"); // weapon up + precache_sound ("items/armor1.wav"); // armor up + precache_sound ("weapons/lhit.wav"); //lightning + precache_sound ("weapons/lstart.wav"); //lightning start + precache_sound ("items/damage3.wav"); + + precache_sound ("misc/power.wav"); //lightning for boss + +// player gib sounds + precache_sound ("player/gib.wav"); // player gib sound + precache_sound ("player/udeath.wav"); // player gib sound + precache_sound ("player/tornoff2.wav"); // gib sound + +// player pain sounds + + precache_sound ("player/pain1.wav"); + precache_sound ("player/pain2.wav"); + precache_sound ("player/pain3.wav"); + precache_sound ("player/pain4.wav"); + precache_sound ("player/pain5.wav"); + precache_sound ("player/pain6.wav"); + +// player death sounds + precache_sound ("player/death1.wav"); + precache_sound ("player/death2.wav"); + precache_sound ("player/death3.wav"); + precache_sound ("player/death4.wav"); + precache_sound ("player/death5.wav"); + +// ax sounds + precache_sound ("weapons/ax1.wav"); // ax swoosh + precache_sound ("player/axhit1.wav"); // ax hit meat + precache_sound ("player/axhit2.wav"); // ax hit world + + precache_sound ("player/h2ojump.wav"); // player jumping into water + precache_sound ("player/slimbrn2.wav"); // player enter slime + precache_sound ("player/inh2o.wav"); // player enter water + precache_sound ("player/inlava.wav"); // player enter lava + precache_sound ("misc/outwater.wav"); // leaving water sound + + precache_sound ("player/lburn1.wav"); // lava burn + precache_sound ("player/lburn2.wav"); // lava burn + + precache_sound ("misc/water1.wav"); // swimming + precache_sound ("misc/water2.wav"); // swimming + + precache_model ("progs/player.mdl"); + precache_model ("progs/eyes.mdl"); + precache_model ("progs/h_player.mdl"); + precache_model ("progs/gib1.mdl"); + precache_model ("progs/gib2.mdl"); + precache_model ("progs/gib3.mdl"); + + precache_model ("progs/s_bubble.spr"); // drowning bubbles + precache_model ("progs/s_explod.spr"); // sprite explosion + + precache_model ("progs/v_axe.mdl"); + precache_model ("progs/v_shot.mdl"); + precache_model ("progs/v_nail.mdl"); + precache_model ("progs/v_rock.mdl"); + precache_model ("progs/v_shot2.mdl"); + precache_model ("progs/v_nail2.mdl"); + precache_model ("progs/v_rock2.mdl"); + + precache_model ("progs/bolt.mdl"); // for lightning gun + precache_model ("progs/bolt2.mdl"); // for lightning gun + precache_model ("progs/bolt3.mdl"); // for boss shock + precache_model ("progs/lavaball.mdl"); // for testing + + precache_model ("progs/missile.mdl"); + precache_model ("progs/grenade.mdl"); + precache_model ("progs/spike.mdl"); + precache_model ("progs/s_spike.mdl"); + + precache_model ("progs/backpack.mdl"); + + precache_model ("progs/zom_gib.mdl"); + + precache_model ("progs/v_light.mdl"); + + +// +// Setup light animation tables. 'a' is total darkness, 'z' is maxbright. +// + + // 0 normal + lightstyle(0, "m"); + + // 1 FLICKER (first variety) + lightstyle(1, "mmnmmommommnonmmonqnmmo"); + + // 2 SLOW STRONG PULSE + lightstyle(2, "abcdefghijklmnopqrstuvwxyzyxwvutsrqponmlkjihgfedcba"); + + // 3 CANDLE (first variety) + lightstyle(3, "mmmmmaaaaammmmmaaaaaabcdefgabcdefg"); + + // 4 FAST STROBE + lightstyle(4, "mamamamamama"); + + // 5 GENTLE PULSE 1 + lightstyle(5,"jklmnopqrstuvwxyzyxwvutsrqponmlkj"); + + // 6 FLICKER (second variety) + lightstyle(6, "nmonqnmomnmomomno"); + + // 7 CANDLE (second variety) + lightstyle(7, "mmmaaaabcdefgmmmmaaaammmaamm"); + + // 8 CANDLE (third variety) + lightstyle(8, "mmmaaammmaaammmabcdefaaaammmmabcdefmmmaaaa"); + + // 9 SLOW STROBE (fourth variety) + lightstyle(9, "aaaaaaaazzzzzzzz"); + + // 10 FLUORESCENT FLICKER + lightstyle(10, "mmamammmmammamamaaamammma"); + + // 11 SLOW PULSE NOT FADE TO BLACK + lightstyle(11, "abcdefghijklmnopqrrqponmlkjihgfedcba"); + + // styles 32-62 are assigned by the light program for switchable lights + + // 63 testing + lightstyle(63, "a"); +}; + +void() StartFrame = +{ + teamplay = cvar("teamplay"); + skill = cvar("skill"); + framecount = framecount + 1; +}; + +/* +============================================================================== + +BODY QUE + +============================================================================== +*/ + +entity bodyque_head; + +void() bodyque = +{ // just here so spawn functions don't complain after the world + // creates bodyques +}; + +void() InitBodyQue = +{ + PortalInit(); + + local entity e; + + bodyque_head = spawn(); + bodyque_head.classname = "bodyque"; + bodyque_head.owner = spawn(); + bodyque_head.owner.classname = "bodyque"; + bodyque_head.owner.owner = spawn(); + bodyque_head.owner.owner.classname = "bodyque"; + bodyque_head.owner.owner.owner = spawn(); + bodyque_head.owner.owner.owner.classname = "bodyque"; + bodyque_head.owner.owner.owner.owner = bodyque_head; +}; + + +// make a body que entry for the given ent so the ent can be +// respawned elsewhere +void(entity ent) CopyToBodyQue = +{ + bodyque_head.angles = ent.angles; + bodyque_head.model = ent.model; + bodyque_head.modelindex = ent.modelindex; + bodyque_head.frame = ent.frame; + bodyque_head.colormap = ent.colormap; + bodyque_head.movetype = ent.movetype; + bodyque_head.velocity = ent.velocity; + bodyque_head.flags = 0; + setorigin (bodyque_head, ent.origin); + setsize (bodyque_head, ent.mins, ent.maxs); + bodyque_head = bodyque_head.owner; +}; + + diff --git a/src/zombie.qc b/src/zombie.qc new file mode 100644 index 0000000..8065989 --- /dev/null +++ b/src/zombie.qc @@ -0,0 +1,515 @@ +/* +============================================================================== + +ZOMBIE + +============================================================================== +*/ +$cd id1/models/zombie + +$origin 0 0 24 + +$base base +$skin skin + +$frame stand1 stand2 stand3 stand4 stand5 stand6 stand7 stand8 +$frame stand9 stand10 stand11 stand12 stand13 stand14 stand15 + +$frame walk1 walk2 walk3 walk4 walk5 walk6 walk7 walk8 walk9 walk10 walk11 +$frame walk12 walk13 walk14 walk15 walk16 walk17 walk18 walk19 + +$frame run1 run2 run3 run4 run5 run6 run7 run8 run9 run10 run11 run12 +$frame run13 run14 run15 run16 run17 run18 + +$frame atta1 atta2 atta3 atta4 atta5 atta6 atta7 atta8 atta9 atta10 atta11 +$frame atta12 atta13 + +$frame attb1 attb2 attb3 attb4 attb5 attb6 attb7 attb8 attb9 attb10 attb11 +$frame attb12 attb13 attb14 + +$frame attc1 attc2 attc3 attc4 attc5 attc6 attc7 attc8 attc9 attc10 attc11 +$frame attc12 + +$frame paina1 paina2 paina3 paina4 paina5 paina6 paina7 paina8 paina9 paina10 +$frame paina11 paina12 + +$frame painb1 painb2 painb3 painb4 painb5 painb6 painb7 painb8 painb9 painb10 +$frame painb11 painb12 painb13 painb14 painb15 painb16 painb17 painb18 painb19 +$frame painb20 painb21 painb22 painb23 painb24 painb25 painb26 painb27 painb28 + +$frame painc1 painc2 painc3 painc4 painc5 painc6 painc7 painc8 painc9 painc10 +$frame painc11 painc12 painc13 painc14 painc15 painc16 painc17 painc18 + +$frame paind1 paind2 paind3 paind4 paind5 paind6 paind7 paind8 paind9 paind10 +$frame paind11 paind12 paind13 + +$frame paine1 paine2 paine3 paine4 paine5 paine6 paine7 paine8 paine9 paine10 +$frame paine11 paine12 paine13 paine14 paine15 paine16 paine17 paine18 paine19 +$frame paine20 paine21 paine22 paine23 paine24 paine25 paine26 paine27 paine28 +$frame paine29 paine30 + +$frame cruc_1 cruc_2 cruc_3 cruc_4 cruc_5 cruc_6 + +float SPAWN_CRUCIFIED = 1; + +//============================================================================= + +.float inpain; + +void() zombie_stand1 =[ $stand1, zombie_stand2 ] {ai_stand();}; +void() zombie_stand2 =[ $stand2, zombie_stand3 ] {ai_stand();}; +void() zombie_stand3 =[ $stand3, zombie_stand4 ] {ai_stand();}; +void() zombie_stand4 =[ $stand4, zombie_stand5 ] {ai_stand();}; +void() zombie_stand5 =[ $stand5, zombie_stand6 ] {ai_stand();}; +void() zombie_stand6 =[ $stand6, zombie_stand7 ] {ai_stand();}; +void() zombie_stand7 =[ $stand7, zombie_stand8 ] {ai_stand();}; +void() zombie_stand8 =[ $stand8, zombie_stand9 ] {ai_stand();}; +void() zombie_stand9 =[ $stand9, zombie_stand10 ] {ai_stand();}; +void() zombie_stand10 =[ $stand10, zombie_stand11 ] {ai_stand();}; +void() zombie_stand11 =[ $stand11, zombie_stand12 ] {ai_stand();}; +void() zombie_stand12 =[ $stand12, zombie_stand13 ] {ai_stand();}; +void() zombie_stand13 =[ $stand13, zombie_stand14 ] {ai_stand();}; +void() zombie_stand14 =[ $stand14, zombie_stand15 ] {ai_stand();}; +void() zombie_stand15 =[ $stand15, zombie_stand1 ] {ai_stand();}; + +void() zombie_cruc1 = [ $cruc_1, zombie_cruc2 ] { +if (random() < 0.1) + sound (self, CHAN_VOICE, "zombie/idle_w2.wav", 1, ATTN_STATIC);}; +void() zombie_cruc2 = [ $cruc_2, zombie_cruc3 ] {self.nextthink = time + 0.1 + random()*0.1;}; +void() zombie_cruc3 = [ $cruc_3, zombie_cruc4 ] {self.nextthink = time + 0.1 + random()*0.1;}; +void() zombie_cruc4 = [ $cruc_4, zombie_cruc5 ] {self.nextthink = time + 0.1 + random()*0.1;}; +void() zombie_cruc5 = [ $cruc_5, zombie_cruc6 ] {self.nextthink = time + 0.1 + random()*0.1;}; +void() zombie_cruc6 = [ $cruc_6, zombie_cruc1 ] {self.nextthink = time + 0.1 + random()*0.1;}; + +void() zombie_walk1 =[ $walk1, zombie_walk2 ] {ai_walk(0);}; +void() zombie_walk2 =[ $walk2, zombie_walk3 ] {ai_walk(2);}; +void() zombie_walk3 =[ $walk3, zombie_walk4 ] {ai_walk(3);}; +void() zombie_walk4 =[ $walk4, zombie_walk5 ] {ai_walk(2);}; +void() zombie_walk5 =[ $walk5, zombie_walk6 ] {ai_walk(1);}; +void() zombie_walk6 =[ $walk6, zombie_walk7 ] {ai_walk(0);}; +void() zombie_walk7 =[ $walk7, zombie_walk8 ] {ai_walk(0);}; +void() zombie_walk8 =[ $walk8, zombie_walk9 ] {ai_walk(0);}; +void() zombie_walk9 =[ $walk9, zombie_walk10 ] {ai_walk(0);}; +void() zombie_walk10 =[ $walk10, zombie_walk11 ] {ai_walk(0);}; +void() zombie_walk11 =[ $walk11, zombie_walk12 ] {ai_walk(2);}; +void() zombie_walk12 =[ $walk12, zombie_walk13 ] {ai_walk(2);}; +void() zombie_walk13 =[ $walk13, zombie_walk14 ] {ai_walk(1);}; +void() zombie_walk14 =[ $walk14, zombie_walk15 ] {ai_walk(0);}; +void() zombie_walk15 =[ $walk15, zombie_walk16 ] {ai_walk(0);}; +void() zombie_walk16 =[ $walk16, zombie_walk17 ] {ai_walk(0);}; +void() zombie_walk17 =[ $walk17, zombie_walk18 ] {ai_walk(0);}; +void() zombie_walk18 =[ $walk18, zombie_walk19 ] {ai_walk(0);}; +void() zombie_walk19 =[ $walk19, zombie_walk1 ] { +ai_walk(0); +if (random() < 0.2) + sound (self, CHAN_VOICE, "zombie/z_idle.wav", 1, ATTN_IDLE);}; + +void() zombie_run1 =[ $run1, zombie_run2 ] {ai_run(1);self.inpain = 0;}; +void() zombie_run2 =[ $run2, zombie_run3 ] {ai_run(1);}; +void() zombie_run3 =[ $run3, zombie_run4 ] {ai_run(0);}; +void() zombie_run4 =[ $run4, zombie_run5 ] {ai_run(1);}; +void() zombie_run5 =[ $run5, zombie_run6 ] {ai_run(2);}; +void() zombie_run6 =[ $run6, zombie_run7 ] {ai_run(3);}; +void() zombie_run7 =[ $run7, zombie_run8 ] {ai_run(4);}; +void() zombie_run8 =[ $run8, zombie_run9 ] {ai_run(4);}; +void() zombie_run9 =[ $run9, zombie_run10 ] {ai_run(2);}; +void() zombie_run10 =[ $run10, zombie_run11 ] {ai_run(0);}; +void() zombie_run11 =[ $run11, zombie_run12 ] {ai_run(0);}; +void() zombie_run12 =[ $run12, zombie_run13 ] {ai_run(0);}; +void() zombie_run13 =[ $run13, zombie_run14 ] {ai_run(2);}; +void() zombie_run14 =[ $run14, zombie_run15 ] {ai_run(4);}; +void() zombie_run15 =[ $run15, zombie_run16 ] {ai_run(6);}; +void() zombie_run16 =[ $run16, zombie_run17 ] {ai_run(7);}; +void() zombie_run17 =[ $run17, zombie_run18 ] {ai_run(3);}; +void() zombie_run18 =[ $run18, zombie_run1 ] { +ai_run(8); +if (random() < 0.2) + sound (self, CHAN_VOICE, "zombie/z_idle.wav", 1, ATTN_IDLE); +if (random() > 0.8) + sound (self, CHAN_VOICE, "zombie/z_idle1.wav", 1, ATTN_IDLE); +}; + +/* +============================================================================= + +ATTACKS + +============================================================================= +*/ + +void() ZombieGrenadeTouch = +{ + if (other == self.owner) + return; // don't explode on owner + if (other.takedamage) + { + T_Damage (other, self, self.owner, 10 ); + sound (self, CHAN_WEAPON, "zombie/z_hit.wav", 1, ATTN_NORM); + remove (self); + return; + } + sound (self, CHAN_WEAPON, "zombie/z_miss.wav", 1, ATTN_NORM); // bounce sound + self.velocity = '0 0 0'; + self.avelocity = '0 0 0'; + self.touch = SUB_Remove; +}; + +/* +================ +ZombieFireGrenade +================ +*/ +void(vector st) ZombieFireGrenade = +{ + local entity missile, mpuff; + local vector org; + + sound (self, CHAN_WEAPON, "zombie/z_shot1.wav", 1, ATTN_NORM); + + missile = spawn (); + missile.owner = self; + missile.movetype = MOVETYPE_BOUNCE; + missile.solid = SOLID_BBOX; + +// calc org + org = self.origin + st_x * v_forward + st_y * v_right + (st_z - 24) * v_up; + +// set missile speed + + makevectors (self.angles); + + missile.velocity = normalize(self.enemy.origin - org); + missile.velocity = missile.velocity * 600; + missile.velocity_z = 200; + + missile.avelocity = '3000 1000 2000'; + + missile.touch = ZombieGrenadeTouch; + +// set missile duration + missile.nextthink = time + 2.5; + missile.think = SUB_Remove; + + setmodel (missile, "progs/zom_gib.mdl"); + setsize (missile, '0 0 0', '0 0 0'); + setorigin (missile, org); +}; + + +void() zombie_atta1 =[ $atta1, zombie_atta2 ] {ai_face();}; +void() zombie_atta2 =[ $atta2, zombie_atta3 ] {ai_face();}; +void() zombie_atta3 =[ $atta3, zombie_atta4 ] {ai_face();}; +void() zombie_atta4 =[ $atta4, zombie_atta5 ] {ai_face();}; +void() zombie_atta5 =[ $atta5, zombie_atta6 ] {ai_face();}; +void() zombie_atta6 =[ $atta6, zombie_atta7 ] {ai_face();}; +void() zombie_atta7 =[ $atta7, zombie_atta8 ] {ai_face();}; +void() zombie_atta8 =[ $atta8, zombie_atta9 ] {ai_face();}; +void() zombie_atta9 =[ $atta9, zombie_atta10 ] {ai_face();}; +void() zombie_atta10 =[ $atta10, zombie_atta11 ] {ai_face();}; +void() zombie_atta11 =[ $atta11, zombie_atta12 ] {ai_face();}; +void() zombie_atta12 =[ $atta12, zombie_atta13 ] {ai_face();}; +void() zombie_atta13 =[ $atta13, zombie_run1 ] {ai_face();ZombieFireGrenade('-10 -22 30');}; + +void() zombie_attb1 =[ $attb1, zombie_attb2 ] {ai_face();}; +void() zombie_attb2 =[ $attb2, zombie_attb3 ] {ai_face();}; +void() zombie_attb3 =[ $attb3, zombie_attb4 ] {ai_face();}; +void() zombie_attb4 =[ $attb4, zombie_attb5 ] {ai_face();}; +void() zombie_attb5 =[ $attb5, zombie_attb6 ] {ai_face();}; +void() zombie_attb6 =[ $attb6, zombie_attb7 ] {ai_face();}; +void() zombie_attb7 =[ $attb7, zombie_attb8 ] {ai_face();}; +void() zombie_attb8 =[ $attb8, zombie_attb9 ] {ai_face();}; +void() zombie_attb9 =[ $attb9, zombie_attb10 ] {ai_face();}; +void() zombie_attb10 =[ $attb10, zombie_attb11 ] {ai_face();}; +void() zombie_attb11 =[ $attb11, zombie_attb12 ] {ai_face();}; +void() zombie_attb12 =[ $attb12, zombie_attb13 ] {ai_face();}; +void() zombie_attb13 =[ $attb13, zombie_attb14 ] {ai_face();}; +void() zombie_attb14 =[ $attb13, zombie_run1 ] {ai_face();ZombieFireGrenade('-10 -24 29');}; + +void() zombie_attc1 =[ $attc1, zombie_attc2 ] {ai_face();}; +void() zombie_attc2 =[ $attc2, zombie_attc3 ] {ai_face();}; +void() zombie_attc3 =[ $attc3, zombie_attc4 ] {ai_face();}; +void() zombie_attc4 =[ $attc4, zombie_attc5 ] {ai_face();}; +void() zombie_attc5 =[ $attc5, zombie_attc6 ] {ai_face();}; +void() zombie_attc6 =[ $attc6, zombie_attc7 ] {ai_face();}; +void() zombie_attc7 =[ $attc7, zombie_attc8 ] {ai_face();}; +void() zombie_attc8 =[ $attc8, zombie_attc9 ] {ai_face();}; +void() zombie_attc9 =[ $attc9, zombie_attc10 ] {ai_face();}; +void() zombie_attc10 =[ $attc10, zombie_attc11 ] {ai_face();}; +void() zombie_attc11 =[ $attc11, zombie_attc12 ] {ai_face();}; +void() zombie_attc12 =[ $attc12, zombie_run1 ] {ai_face();ZombieFireGrenade('-12 -19 29');}; + +void() zombie_missile = +{ + local float r; + + r = random(); + + if (r < 0.3) + zombie_atta1 (); + else if (r < 0.6) + zombie_attb1 (); + else + zombie_attc1 (); +}; + + +/* +============================================================================= + +PAIN + +============================================================================= +*/ + +void() zombie_paina1 =[ $paina1, zombie_paina2 ] {sound (self, CHAN_VOICE, "zombie/z_pain.wav", 1, ATTN_NORM);}; +void() zombie_paina2 =[ $paina2, zombie_paina3 ] {ai_painforward(3);}; +void() zombie_paina3 =[ $paina3, zombie_paina4 ] {ai_painforward(1);}; +void() zombie_paina4 =[ $paina4, zombie_paina5 ] {ai_pain(1);}; +void() zombie_paina5 =[ $paina5, zombie_paina6 ] {ai_pain(3);}; +void() zombie_paina6 =[ $paina6, zombie_paina7 ] {ai_pain(1);}; +void() zombie_paina7 =[ $paina7, zombie_paina8 ] {}; +void() zombie_paina8 =[ $paina8, zombie_paina9 ] {}; +void() zombie_paina9 =[ $paina9, zombie_paina10 ] {}; +void() zombie_paina10 =[ $paina10, zombie_paina11 ] {}; +void() zombie_paina11 =[ $paina11, zombie_paina12 ] {}; +void() zombie_paina12 =[ $paina12, zombie_run1 ] {}; + +void() zombie_painb1 =[ $painb1, zombie_painb2 ] {sound (self, CHAN_VOICE, "zombie/z_pain1.wav", 1, ATTN_NORM);}; +void() zombie_painb2 =[ $painb2, zombie_painb3 ] {ai_pain(2);}; +void() zombie_painb3 =[ $painb3, zombie_painb4 ] {ai_pain(8);}; +void() zombie_painb4 =[ $painb4, zombie_painb5 ] {ai_pain(6);}; +void() zombie_painb5 =[ $painb5, zombie_painb6 ] {ai_pain(2);}; +void() zombie_painb6 =[ $painb6, zombie_painb7 ] {}; +void() zombie_painb7 =[ $painb7, zombie_painb8 ] {}; +void() zombie_painb8 =[ $painb8, zombie_painb9 ] {}; +void() zombie_painb9 =[ $painb9, zombie_painb10 ] {sound (self, CHAN_BODY, "zombie/z_fall.wav", 1, ATTN_NORM);}; +void() zombie_painb10 =[ $painb10, zombie_painb11 ] {}; +void() zombie_painb11 =[ $painb11, zombie_painb12 ] {}; +void() zombie_painb12 =[ $painb12, zombie_painb13 ] {}; +void() zombie_painb13 =[ $painb13, zombie_painb14 ] {}; +void() zombie_painb14 =[ $painb14, zombie_painb15 ] {}; +void() zombie_painb15 =[ $painb15, zombie_painb16 ] {}; +void() zombie_painb16 =[ $painb16, zombie_painb17 ] {}; +void() zombie_painb17 =[ $painb17, zombie_painb18 ] {}; +void() zombie_painb18 =[ $painb18, zombie_painb19 ] {}; +void() zombie_painb19 =[ $painb19, zombie_painb20 ] {}; +void() zombie_painb20 =[ $painb20, zombie_painb21 ] {}; +void() zombie_painb21 =[ $painb21, zombie_painb22 ] {}; +void() zombie_painb22 =[ $painb22, zombie_painb23 ] {}; +void() zombie_painb23 =[ $painb23, zombie_painb24 ] {}; +void() zombie_painb24 =[ $painb24, zombie_painb25 ] {}; +void() zombie_painb25 =[ $painb25, zombie_painb26 ] {ai_painforward(1);}; +void() zombie_painb26 =[ $painb26, zombie_painb27 ] {}; +void() zombie_painb27 =[ $painb27, zombie_painb28 ] {}; +void() zombie_painb28 =[ $painb28, zombie_run1 ] {}; + +void() zombie_painc1 =[ $painc1, zombie_painc2 ] {sound (self, CHAN_VOICE, "zombie/z_pain1.wav", 1, ATTN_NORM);}; +void() zombie_painc2 =[ $painc2, zombie_painc3 ] {}; +void() zombie_painc3 =[ $painc3, zombie_painc4 ] {ai_pain(3);}; +void() zombie_painc4 =[ $painc4, zombie_painc5 ] {ai_pain(1);}; +void() zombie_painc5 =[ $painc5, zombie_painc6 ] {}; +void() zombie_painc6 =[ $painc6, zombie_painc7 ] {}; +void() zombie_painc7 =[ $painc7, zombie_painc8 ] {}; +void() zombie_painc8 =[ $painc8, zombie_painc9 ] {}; +void() zombie_painc9 =[ $painc9, zombie_painc10 ] {}; +void() zombie_painc10 =[ $painc10, zombie_painc11 ] {}; +void() zombie_painc11 =[ $painc11, zombie_painc12 ] {ai_painforward(1);}; +void() zombie_painc12 =[ $painc12, zombie_painc13 ] {ai_painforward(1);}; +void() zombie_painc13 =[ $painc13, zombie_painc14 ] {}; +void() zombie_painc14 =[ $painc14, zombie_painc15 ] {}; +void() zombie_painc15 =[ $painc15, zombie_painc16 ] {}; +void() zombie_painc16 =[ $painc16, zombie_painc17 ] {}; +void() zombie_painc17 =[ $painc17, zombie_painc18 ] {}; +void() zombie_painc18 =[ $painc18, zombie_run1 ] {}; + +void() zombie_paind1 =[ $paind1, zombie_paind2 ] {sound (self, CHAN_VOICE, "zombie/z_pain.wav", 1, ATTN_NORM);}; +void() zombie_paind2 =[ $paind2, zombie_paind3 ] {}; +void() zombie_paind3 =[ $paind3, zombie_paind4 ] {}; +void() zombie_paind4 =[ $paind4, zombie_paind5 ] {}; +void() zombie_paind5 =[ $paind5, zombie_paind6 ] {}; +void() zombie_paind6 =[ $paind6, zombie_paind7 ] {}; +void() zombie_paind7 =[ $paind7, zombie_paind8 ] {}; +void() zombie_paind8 =[ $paind8, zombie_paind9 ] {}; +void() zombie_paind9 =[ $paind9, zombie_paind10 ] {ai_pain(1);}; +void() zombie_paind10 =[ $paind10, zombie_paind11 ] {}; +void() zombie_paind11 =[ $paind11, zombie_paind12 ] {}; +void() zombie_paind12 =[ $paind12, zombie_paind13 ] {}; +void() zombie_paind13 =[ $paind13, zombie_run1 ] {}; + +void() zombie_paine1 =[ $paine1, zombie_paine2 ] { +sound (self, CHAN_VOICE, "zombie/z_pain.wav", 1, ATTN_NORM); +self.health = 60; +}; +void() zombie_paine2 =[ $paine2, zombie_paine3 ] {ai_pain(8);}; +void() zombie_paine3 =[ $paine3, zombie_paine4 ] {ai_pain(5);}; +void() zombie_paine4 =[ $paine4, zombie_paine5 ] {ai_pain(3);}; +void() zombie_paine5 =[ $paine5, zombie_paine6 ] {ai_pain(1);}; +void() zombie_paine6 =[ $paine6, zombie_paine7 ] {ai_pain(2);}; +void() zombie_paine7 =[ $paine7, zombie_paine8 ] {ai_pain(1);}; +void() zombie_paine8 =[ $paine8, zombie_paine9 ] {ai_pain(1);}; +void() zombie_paine9 =[ $paine9, zombie_paine10 ] {ai_pain(2);}; +void() zombie_paine10 =[ $paine10, zombie_paine11 ] { +sound (self, CHAN_BODY, "zombie/z_fall.wav", 1, ATTN_NORM); +self.solid = SOLID_NOT; +}; +void() zombie_paine11 =[ $paine11, zombie_paine12 ] {self.nextthink = self.nextthink + 5;self.health = 60;}; +void() zombie_paine12 =[ $paine12, zombie_paine13 ]{ +// see if ok to stand up +self.health = 60; +sound (self, CHAN_VOICE, "zombie/z_idle.wav", 1, ATTN_IDLE); +self.solid = SOLID_SLIDEBOX; +if (!walkmove (0, 0)) +{ + self.think = zombie_paine11; + self.solid = SOLID_NOT; + return; +} +}; +void() zombie_paine13 =[ $paine13, zombie_paine14 ] {}; +void() zombie_paine14 =[ $paine14, zombie_paine15 ] {}; +void() zombie_paine15 =[ $paine15, zombie_paine16 ] {}; +void() zombie_paine16 =[ $paine16, zombie_paine17 ] {}; +void() zombie_paine17 =[ $paine17, zombie_paine18 ] {}; +void() zombie_paine18 =[ $paine18, zombie_paine19 ] {}; +void() zombie_paine19 =[ $paine19, zombie_paine20 ] {}; +void() zombie_paine20 =[ $paine20, zombie_paine21 ] {}; +void() zombie_paine21 =[ $paine21, zombie_paine22 ] {}; +void() zombie_paine22 =[ $paine22, zombie_paine23 ] {}; +void() zombie_paine23 =[ $paine23, zombie_paine24 ] {}; +void() zombie_paine24 =[ $paine24, zombie_paine25 ] {}; +void() zombie_paine25 =[ $paine25, zombie_paine26 ] {ai_painforward(5);}; +void() zombie_paine26 =[ $paine26, zombie_paine27 ] {ai_painforward(3);}; +void() zombie_paine27 =[ $paine27, zombie_paine28 ] {ai_painforward(1);}; +void() zombie_paine28 =[ $paine28, zombie_paine29 ] {ai_pain(1);}; +void() zombie_paine29 =[ $paine29, zombie_paine30 ] {}; +void() zombie_paine30 =[ $paine30, zombie_run1 ] {}; + +void() zombie_die = +{ + sound (self, CHAN_VOICE, "zombie/z_gib.wav", 1, ATTN_NORM); + ThrowHead ("progs/h_zombie.mdl", self.health); + ThrowGib ("progs/gib1.mdl", self.health); + ThrowGib ("progs/gib2.mdl", self.health); + ThrowGib ("progs/gib3.mdl", self.health); +}; + +/* +================= +zombie_pain + +Zombies can only be killed (gibbed) by doing 60 hit points of damage +in a single frame (rockets, grenades, quad shotgun, quad nailgun). + +A hit of 25 points or more (super shotgun, quad nailgun) will allways put it +down to the ground. + +A hit of from 10 to 40 points in one frame will cause it to go down if it +has been twice in two seconds, otherwise it goes into one of the four +fast pain frames. + +A hit of less than 10 points of damage (winged by a shotgun) will be ignored. + +FIXME: don't use pain_finished because of nightmare hack +================= +*/ +void(entity attacker, float take) zombie_pain = +{ + local float r; + + self.health = 60; // allways reset health + + if (take < 9) + return; // totally ignore + + if (self.inpain == 2) + return; // down on ground, so don't reset any counters + +// go down immediately if a big enough hit + if (take >= 25) + { + self.inpain = 2; + zombie_paine1 (); + return; + } + + if (self.inpain) + { +// if hit again in next gre seconds while not in pain frames, definately drop + self.pain_finished = time + 3; + return; // currently going through an animation, don't change + } + + if (self.pain_finished > time) + { +// hit again, so drop down + self.inpain = 2; + zombie_paine1 (); + return; + } + +// gp into one of the fast pain animations + self.inpain = 1; + + r = random(); + if (r < 0.25) + zombie_paina1 (); + else if (r < 0.5) + zombie_painb1 (); + else if (r < 0.75) + zombie_painc1 (); + else + zombie_paind1 (); +}; + +//============================================================================ + +/*QUAKED monster_zombie (1 0 0) (-16 -16 -24) (16 16 32) Crucified ambush + +If crucified, stick the bounding box 12 pixels back into a wall to look right. +*/ +void() monster_zombie = +{ + if (deathmatch) + { + remove(self); + return; + } + + precache_model ("progs/zombie.mdl"); + precache_model ("progs/h_zombie.mdl"); + precache_model ("progs/zom_gib.mdl"); + + precache_sound ("zombie/z_idle.wav"); + precache_sound ("zombie/z_idle1.wav"); + precache_sound ("zombie/z_shot1.wav"); + precache_sound ("zombie/z_gib.wav"); + precache_sound ("zombie/z_pain.wav"); + precache_sound ("zombie/z_pain1.wav"); + precache_sound ("zombie/z_fall.wav"); + precache_sound ("zombie/z_miss.wav"); + precache_sound ("zombie/z_hit.wav"); + precache_sound ("zombie/idle_w2.wav"); + + self.solid = SOLID_SLIDEBOX; + self.movetype = MOVETYPE_STEP; + + setmodel (self, "progs/zombie.mdl"); + + setsize (self, '-16 -16 -24', '16 16 40'); + self.health = 60; + + self.th_stand = zombie_stand1; + self.th_walk = zombie_walk1; + self.th_run = zombie_run1; + self.th_pain = zombie_pain; + self.th_die = zombie_die; + self.th_missile = zombie_missile; + + if (self.spawnflags & SPAWN_CRUCIFIED) + { + self.movetype = MOVETYPE_NONE; + zombie_cruc1 (); + } + else + walkmonster_start(); +};