mirror of
https://github.com/yquake2/yquake2remaster.git
synced 2025-03-22 10:52:09 +00:00
game: Add support some of quake 1 monsters
Shambler is left without chenges and fixes for now.
This commit is contained in:
parent
5b62a2f416
commit
47bacf9a52
19 changed files with 1695 additions and 1876 deletions
14
Makefile
14
Makefile
|
@ -893,6 +893,7 @@ GAME_OBJS_ = \
|
|||
src/game/menu/menu.o \
|
||||
src/game/monster/actor/actor.o \
|
||||
src/game/monster/arachnid/arachnid.o \
|
||||
src/game/monster/army/army.o \
|
||||
src/game/monster/berserker/berserker.o \
|
||||
src/game/monster/boss2/boss2.o \
|
||||
src/game/monster/boss3/boss3.o \
|
||||
|
@ -902,6 +903,10 @@ GAME_OBJS_ = \
|
|||
src/game/monster/brain/brain.o \
|
||||
src/game/monster/carrier/carrier.o \
|
||||
src/game/monster/chick/chick.o \
|
||||
src/game/monster/demon/demon.o \
|
||||
src/game/monster/dog/dog.o \
|
||||
src/game/monster/enforcer/enforcer.o \
|
||||
src/game/monster/fish/fish.o \
|
||||
src/game/monster/fixbot/fixbot.o \
|
||||
src/game/monster/flipper/flipper.o \
|
||||
src/game/monster/float/float.o \
|
||||
|
@ -911,21 +916,28 @@ GAME_OBJS_ = \
|
|||
src/game/monster/gladiator/gladiator.o \
|
||||
src/game/monster/guardian/guardian.o \
|
||||
src/game/monster/gunner/gunner.o \
|
||||
src/game/monster/hknight/hknight.o \
|
||||
src/game/monster/hover/hover.o \
|
||||
src/game/monster/infantry/infantry.o \
|
||||
src/game/monster/insane/insane.o \
|
||||
src/game/monster/knight/knight.o \
|
||||
src/game/monster/medic/medic.o \
|
||||
src/game/monster/misc/move.o \
|
||||
src/game/monster/mutant/mutant.o \
|
||||
src/game/monster/ogre/ogre.o \
|
||||
src/game/monster/parasite/parasite.o \
|
||||
src/game/monster/shalrath/shalrath.o \
|
||||
src/game/monster/shambler/shambler.o \
|
||||
src/game/monster/soldier/soldier.o \
|
||||
src/game/monster/stalker/stalker.o \
|
||||
src/game/monster/supertank/supertank.o \
|
||||
src/game/monster/shambler/shambler.o \
|
||||
src/game/monster/tank/tank.o \
|
||||
src/game/monster/tarbaby/tarbaby.o \
|
||||
src/game/monster/turret/turret.o \
|
||||
src/game/monster/widow/widow2.o \
|
||||
src/game/monster/widow/widow.o \
|
||||
src/game/monster/wizard/wizard.o \
|
||||
src/game/monster/zombie/zombie.o \
|
||||
src/game/player/chase.o \
|
||||
src/game/player/client.o \
|
||||
src/game/player/hud.o \
|
||||
|
|
|
@ -3,7 +3,6 @@
|
|||
* OK - no known issues,
|
||||
* ML - model light issues,
|
||||
* WL - wall light issues,
|
||||
* MD5 - md5 model load,
|
||||
* G - texture glitches,
|
||||
* B - can't load.
|
||||
|
||||
|
@ -14,8 +13,8 @@ Notes:
|
|||
|
||||
| map | gl1.4 | gl3/gles3 | gl4.6 | vk | soft |
|
||||
| ------------------------------ | ------ | --------- | ------ | ------ | ----------- |
|
||||
| badlands.bsp | MD5 | N/A | N/A | MD5 | N/A |
|
||||
| base1.bsp | MD5 | WL/ML/MD5 | N/A | MD5 | WL/ML/MD5/G |
|
||||
| badlands.bsp | OK | N/A | N/A | OK | N/A |
|
||||
| base1.bsp | OK | OK | N/A | OK | WL/ML/G |
|
||||
| base2.bsp | N/A | N/A | N/A | N/A | N/A |
|
||||
| base3.bsp | N/A | N/A | N/A | N/A | N/A |
|
||||
| base64.bsp | N/A | N/A | N/A | N/A | N/A |
|
||||
|
@ -61,35 +60,35 @@ Notes:
|
|||
| jail4.bsp | N/A | N/A | N/A | N/A | N/A |
|
||||
| jail5.bsp | N/A | N/A | N/A | N/A | N/A |
|
||||
| lab.bsp | N/A | N/A | N/A | N/A | N/A |
|
||||
| mgdm1.bsp | MD5 | N/A | N/A | MD5 | N/A |
|
||||
| mgu1m1.bsp | MD5 | N/A | N/A | MD5 | N/A |
|
||||
| mgu1m2.bsp | MD5 | N/A | N/A | MD5 | N/A |
|
||||
| mgu1m3.bsp | MD5 | N/A | N/A | MD5 | N/A |
|
||||
| mgu1m4.bsp | MD5 | N/A | N/A | MD5 | N/A |
|
||||
| mgu1m5.bsp | MD5 | N/A | N/A | MD5 | N/A |
|
||||
| mgu1trial.bsp | MD5 | N/A | N/A | MD5 | N/A |
|
||||
| mgu2m1.bsp | MD5 | N/A | N/A | MD5 | N/A |
|
||||
| mgu2m2.bsp | MD5 | N/A | N/A | MD5 | N/A |
|
||||
| mgu2m3.bsp | MD5 | N/A | N/A | MD5 | N/A |
|
||||
| mgu3m1.bsp | MD5 | N/A | N/A | MD5 | N/A |
|
||||
| mgu3m2.bsp | MD5 | N/A | N/A | MD5 | N/A |
|
||||
| mgu3m3.bsp | MD5 | N/A | N/A | MD5 | N/A |
|
||||
| mgu3m4.bsp | MD5 | N/A | N/A | MD5 | N/A |
|
||||
| mgu3secret.bsp | MD5 | N/A | N/A | MD5 | N/A |
|
||||
| mgu4m1.bsp | MD5 | N/A | N/A | MD5 | N/A |
|
||||
| mgu4m2.bsp | MD5 | N/A | N/A | MD5 | N/A |
|
||||
| mgu4m3.bsp | MD5 | N/A | N/A | MD5 | N/A |
|
||||
| mgu4trial.bsp | MD5 | N/A | N/A | MD5 | N/A |
|
||||
| mgu5m1.bsp | MD5 | N/A | N/A | MD5 | N/A |
|
||||
| mgdm1.bsp | OK | N/A | N/A | OK | N/A |
|
||||
| mgu1m1.bsp | OK | N/A | N/A | OK | N/A |
|
||||
| mgu1m2.bsp | OK | N/A | N/A | OK | N/A |
|
||||
| mgu1m3.bsp | OK | N/A | N/A | OK | N/A |
|
||||
| mgu1m4.bsp | OK | N/A | N/A | OK | N/A |
|
||||
| mgu1m5.bsp | OK | N/A | N/A | OK | N/A |
|
||||
| mgu1trial.bsp | OK | N/A | N/A | OK | N/A |
|
||||
| mgu2m1.bsp | OK | N/A | N/A | OK | N/A |
|
||||
| mgu2m2.bsp | OK | N/A | N/A | OK | N/A |
|
||||
| mgu2m3.bsp | OK | N/A | N/A | OK | N/A |
|
||||
| mgu3m1.bsp | OK | N/A | N/A | OK | N/A |
|
||||
| mgu3m2.bsp | OK | N/A | N/A | OK | N/A |
|
||||
| mgu3m3.bsp | OK | N/A | N/A | OK | N/A |
|
||||
| mgu3m4.bsp | OK | N/A | N/A | OK | N/A |
|
||||
| mgu3secret.bsp | OK | N/A | N/A | OK | N/A |
|
||||
| mgu4m1.bsp | OK | N/A | N/A | OK | N/A |
|
||||
| mgu4m2.bsp | OK | N/A | N/A | OK | N/A |
|
||||
| mgu4m3.bsp | OK | N/A | N/A | OK | N/A |
|
||||
| mgu4trial.bsp | OK | N/A | N/A | OK | N/A |
|
||||
| mgu5m1.bsp | OK | N/A | N/A | OK | N/A |
|
||||
| mgu5m2.bsp | B | N/A | N/A | B | N/A |
|
||||
| mgu5m3.bsp | MD5 | N/A | N/A | MD5 | N/A |
|
||||
| mgu5trial.bsp | MD5 | N/A | N/A | MD5 | N/A |
|
||||
| mgu6m1.bsp | MD5 | N/A | N/A | MD5 | N/A |
|
||||
| mgu6m2.bsp | MD5 | N/A | N/A | MD5 | N/A |
|
||||
| mgu6m3.bsp | MD5 | N/A | N/A | MD5 | N/A |
|
||||
| mgu6trial.bsp | MD5 | N/A | N/A | MD5 | N/A |
|
||||
| mguboss.bsp | MD5 | N/A | N/A | MD5 | N/A |
|
||||
| mguhub.bsp | MD5 | ML/MD5 | ML/MD5 | MD5 | ML/MD5 |
|
||||
| mgu5m3.bsp | OK | N/A | N/A | OK | N/A |
|
||||
| mgu5trial.bsp | OK | N/A | N/A | OK | N/A |
|
||||
| mgu6m1.bsp | OK | N/A | N/A | OK | N/A |
|
||||
| mgu6m2.bsp | OK | N/A | N/A | OK | N/A |
|
||||
| mgu6m3.bsp | OK | N/A | N/A | OK | N/A |
|
||||
| mgu6trial.bsp | OK | N/A | N/A | OK | N/A |
|
||||
| mguboss.bsp | OK | N/A | N/A | OK | N/A |
|
||||
| mguhub.bsp | OK | OK | ML | OK | ML |
|
||||
| mine1.bsp | N/A | N/A | N/A | N/A | N/A |
|
||||
| mine2.bsp | N/A | N/A | N/A | N/A | N/A |
|
||||
| mine3.bsp | N/A | N/A | N/A | N/A | N/A |
|
||||
|
@ -236,3 +235,114 @@ Notes:
|
|||
| xship.bsp | N/A | N/A | N/A | N/A | N/A |
|
||||
| xswamp.bsp | N/A | N/A | N/A | N/A | N/A |
|
||||
| xware.bsp | N/A | N/A | N/A | N/A | N/A |
|
||||
|
||||
Additionally supported models:
|
||||
|
||||
| source Quake 1 Path | destination Quake 2 Path | md5 hash |
|
||||
| -------------------------- | --------------------------------- | -------------------------------- |
|
||||
| progs/progs/soldier.mdl | models/monsters/army/tris.mdl | 5b6c30a984872b4273dd5861412d35c5 |
|
||||
| progs/demon.mdl | models/monsters/demon/tris.mdl | 4c73786e7cfb2083ca38cbc983cd6c4b |
|
||||
| progs/dog.mdl | models/monsters/dog/tris.mdl | e727fbc39acc652f812972612ce37565 |
|
||||
| progs/enforcer.mdl | models/monsters/enforcer/tris.mdl | 136c265f96d6077ee3312c52e134529f |
|
||||
| progs/fish.mdl | models/monsters/fish/tris.mdl | d770d6ef92ae8b372926e6c3d49e8716 |
|
||||
| progs/hknight.mdl | models/monsters/hknight/tris.mdl | ed20e30be6fdb83efbaa6d0b23671a49 |
|
||||
| progs/knight.mdl | models/monsters/knight/tris.mdl | 5328915db5c53e85cf75d46e7b747fb9 |
|
||||
| progs/ogre.mdl | models/monsters/ogre/tris.mdl | fbb592ca3788a576dd2f31fcf8c80fab |
|
||||
| progs/shalrath.mdl | models/monsters/shalrath/tris.mdl | dac8f6077b0d2bf970573d2d2c22529f |
|
||||
| progs/shambler.mdl | models/monsters/shambler/tris.mdl | 9b09375a0f614dc4081e363cc34f1185 |
|
||||
| progs/tarbaby.mdl | models/monsters/tarbaby/tris.mdl | 2bfc45593a43a0191982e3cfdc112dc5 |
|
||||
| progs/wizard.mdl | models/monsters/wizard/tris.mdl | bf60986594f045e60e8aa6339d553ee7 |
|
||||
| progs/zombie.mdl | models/monsters/zombie/tris.mdl | a923b1d03b9d237dd5ead9bd56acc900 |
|
||||
| progs/k_spike.mdl | models/proj/fireball/tris.mdl | da95b49a695b34c2c3516a8d789c6b20 |
|
||||
| progs/v_spike.mdl | models/proj/pod/tris.mdl | 2bdc0b264b9fd3443c8eee816305728f |
|
||||
| progs/w_spike.mdl | models/proj/spit/tris.mdl | 8cf9245df2164e8062b01a220b508d6b |
|
||||
| sound/army/death1.wav | sound/army/death1.wav | fe25952af40b536c3bb67bfca58062eb |
|
||||
| sound/army/idle.wav | sound/army/idle.wav | 4cdfbdda8fb5f40b125c7bcddb6e8914 |
|
||||
| sound/army/pain1.wav | sound/army/pain1.wav | 54d3b05fdcecf7480034858f2b22b06c |
|
||||
| sound/army/pain2.wav | sound/army/pain2.wav | e2bbc9d3405b9b9fdae76d2fc298fc2f |
|
||||
| sound/army/sattck1.wav | sound/army/sattck1.wav | b76ac35f900f280a7a7996da7e404362 |
|
||||
| sound/army/sight1.wav | sound/army/sight1.wav | e2a39533250ddd1b08053d5c4ebf7fd0 |
|
||||
| sound/demon/ddeath.wav | sound/demon/ddeath.wav | 62a48dcd405ca55c9ce18497e36faa0e |
|
||||
| sound/demon/dhit2.wav | sound/demon/dhit2.wav | 9e741696e4d0d66e30e718fc70ec186e |
|
||||
| sound/demon/djump.wav | sound/demon/djump.wav | 791ac9d6b6593808316145443cb7e7a0 |
|
||||
| sound/demon/dland2.wav | sound/demon/dland2.wav | db14c7b01838f826b7a712075f9026fd |
|
||||
| sound/demon/dpain1.wav | sound/demon/dpain1.wav | 5e6c485878393c9bebb0d0e6659bc479 |
|
||||
| sound/demon/idle1.wav | sound/demon/idle1.wav | 7a83f8caf3d5b1172a7dc5afdc942988 |
|
||||
| sound/demon/sight2.wav | sound/demon/sight2.wav | 65171c355c22a5069520b0881677ae3c |
|
||||
| sound/dog/dattack1.wav | sound/dog/dattack1.wav | 0c47c9d4aaae0bf3159a288b674f4a35 |
|
||||
| sound/dog/ddeath.wav | sound/dog/ddeath.wav | b0e7760b1d7286a028ff9773f6802958 |
|
||||
| sound/dog/dpain1.wav | sound/dog/dpain1.wav | 28e5ab93b41e13e2916433283a5d1a46 |
|
||||
| sound/dog/dsight.wav | sound/dog/dsight.wav | 0edc290765bac1fb4fe03ca55bc7c225 |
|
||||
| sound/dog/idle.wav | sound/dog/idle.wav | 42bd6026ff32bd94523ad9f8fe8362cc |
|
||||
| sound/enforcer/death1.wav | sound/enforcer/death1.wav | f38d7a235e13ef8918aac0c70437320d |
|
||||
| sound/enforcer/enfire.wav | sound/enforcer/enfire.wav | b080a6a53f138bef9fc4403fb9373a24 |
|
||||
| sound/enforcer/enfstop.wav | sound/enforcer/enfstop.wav | 0bc39c3c88187fb37d20ef21300e7b22 |
|
||||
| sound/enforcer/idle1.wav | sound/enforcer/idle1.wav | d0435763860fe54e938ad25bb1780f9e |
|
||||
| sound/enforcer/pain1.wav | sound/enforcer/pain1.wav | d52bc02afe624924684b25295edaa040 |
|
||||
| sound/enforcer/pain2.wav | sound/enforcer/pain2.wav | f6b0ad6485d93f5c6d7d61b847d06877 |
|
||||
| sound/enforcer/sight1.wav | sound/enforcer/sight1.wav | 9e9876444ba92ed18bfce4cec3a2ff12 |
|
||||
| sound/enforcer/sight2.wav | sound/enforcer/sight2.wav | 815dd4f6a890b0a35dc466005df74850 |
|
||||
| sound/enforcer/sight3.wav | sound/enforcer/sight3.wav | f8c8d19905b24d4adb6760a1b3762f3b |
|
||||
| sound/enforcer/sight4.wav | sound/enforcer/sight4.wav | 04e40eb925290bc56520de326df6b220 |
|
||||
| sound/fish/bite.wav | sound/fish/bite.wav | 7c56712615e2a2c3de4fe0e7e35cba05 |
|
||||
| sound/fish/death.wav | sound/fish/death.wav | 8d6152ee55507430a8c2eb276c4aa8ac |
|
||||
| sound/fish/idle.wav | sound/fish/idle.wav | 54a02731b85eb6f8b1a8ecce09771d20 |
|
||||
| sound/hknight/attack1.wav | sound/hknight/attack1.wav | 695e9d890a085addf1a607aa79137e8e |
|
||||
| sound/hknight/death1.wav | sound/hknight/death1.wav | 2d68c3c86632027676b823fcff3af08c |
|
||||
| sound/hknight/grunt.wav | sound/hknight/grunt.wav | 122f3d4623e0146732aa0e4deb0fe326 |
|
||||
| sound/hknight/hit.wav | sound/hknight/hit.wav | fece24e2548f1d769e8fce39a5c87d01 |
|
||||
| sound/hknight/idle.wav | sound/hknight/idle.wav | e9ca23c4853472750d1f56e52a3d227b |
|
||||
| sound/hknight/pain1.wav | sound/hknight/pain1.wav | 52c20eb6f5b5146ece6b0ac02f423341 |
|
||||
| sound/hknight/sight1.wav | sound/hknight/sight1.wav | 786d28ec653a0d512d078b32eb8cb58b |
|
||||
| sound/hknight/slash1.wav | sound/hknight/slash1.wav | 83e64bb90cff2a4f9764dd53489b9d7d |
|
||||
| sound/knight/idle.wav | sound/knight/idle.wav | 1b5c3981bee078318af346d8fe8090b9 |
|
||||
| sound/knight/kdeath.wav | sound/knight/kdeath.wav | 11a96f48a8f2433c23beae299c8fb96e |
|
||||
| sound/knight/khurt.wav | sound/knight/khurt.wav | 32c9f48dd4a6a87752aedf56fe8de668 |
|
||||
| sound/knight/ksight.wav | sound/knight/ksight.wav | eb75b4af348c88e84d8c87c19d5976fa |
|
||||
| sound/knight/sword1.wav | sound/knight/sword1.wav | 93045b5f3178413dc6b01ec2869d1f73 |
|
||||
| sound/knight/sword2.wav | sound/knight/sword2.wav | 82d1a7c263cd3df7b060dee2f7f8b1fd |
|
||||
| sound/ogre/ogdrag.wav | sound/ogre/ogdrag.wav | 658587dc89aaefae5ca3f058f7ff4227 |
|
||||
| sound/ogre/ogdth.wav | sound/ogre/ogdth.wav | de98e7bb9e70586edddd3308cfded3db |
|
||||
| sound/ogre/ogidle2.wav | sound/ogre/ogidle2.wav | 196ae9c33a4311160e1d5f3da878ab09 |
|
||||
| sound/ogre/ogidle.wav | sound/ogre/ogidle.wav | 177c829840a87c885bbc8951e7ce962e |
|
||||
| sound/ogre/ogpain1.wav | sound/ogre/ogpain1.wav | ac6d133d7720c12df49813fe10e683b5 |
|
||||
| sound/ogre/ogsawatk.wav | sound/ogre/ogsawatk.wav | 7257bdfd014bb61d778b8f88cb65d560 |
|
||||
| sound/ogre/ogwake.wav | sound/ogre/ogwake.wav | 3296459e495c4c12b31179d4eeffac19 |
|
||||
| sound/shalrath/attack2.wav | sound/shalrath/attack2.wav | 777fbda2f81350e45920ea1c36d318e1 |
|
||||
| sound/shalrath/attack.wav | sound/shalrath/attack.wav | 8814a72b399be619d14223235f78f294 |
|
||||
| sound/shalrath/death.wav | sound/shalrath/death.wav | 771844c5cfb5a42e82e221a63f101ac7 |
|
||||
| sound/shalrath/idle.wav | sound/shalrath/idle.wav | 1a45f12579f9cdd27152332d5f816048 |
|
||||
| sound/shalrath/pain.wav | sound/shalrath/pain.wav | 6ba007b79c50d7d5347f1a29fb315422 |
|
||||
| sound/shalrath/sight.wav | sound/shalrath/sight.wav | 3d3c2001cc976efc67af1552427eedd3 |
|
||||
| sound/shambler/melee1.wav | sound/shambler/melee1.wav | 77fe6240973a204b757a427ebf66bcfd |
|
||||
| sound/shambler/melee2.wav | sound/shambler/melee2.wav | 3be31638d769e3d690c92311dfafdeac |
|
||||
| sound/shambler/sattck1.wav | sound/shambler/sattck1.wav | ec8c3f79ea42d09154cb8975ada1b21c |
|
||||
| sound/shambler/sboom.wav | sound/shambler/sboom.wav | 9834601a645d7d1f62001b2a314ec18f |
|
||||
| sound/shambler/sdeath.wav | sound/shambler/sdeath.wav | e0e62d229a985a6e39218c6488599059 |
|
||||
| sound/shambler/shurt2.wav | sound/shambler/shurt2.wav | 1e87631ede95e061a75f9c31629ac0b8 |
|
||||
| sound/shambler/sidle.wav | sound/shambler/sidle.wav | 368a240e6c3e877793352a79c1828386 |
|
||||
| sound/shambler/smack.wav | sound/shambler/smack.wav | bd8c634c9894348360fec7b7419d1649 |
|
||||
| sound/shambler/ssight.wav | sound/shambler/ssight.wav | 657107577460d5acf3157dec97e07a89 |
|
||||
| sound/tarbaby/death1.wav | sound/tarbaby/death1.wav | 53f8c73de11c018086ba19ed036833d3 |
|
||||
| sound/tarbaby/hit1.wav | sound/tarbaby/hit1.wav | 42c5a1edd02421bf6df7ddc3e395c4f8 |
|
||||
| sound/tarbaby/land1.wav | sound/tarbaby/land1.wav | 5a1585ab22368a48827db9b7d3763b58 |
|
||||
| sound/tarbaby/sight1.wav | sound/tarbaby/sight1.wav | df4dd7ec91e094b5c2235be3f5353e4a |
|
||||
| sound/wizard/hit.wav | sound/wizard/hit.wav | 6598d669334df977f1f97b95288edf11 |
|
||||
| sound/wizard/wattack.wav | sound/wizard/wattack.wav | b3568a47439f81779d40335e76f5bc2d |
|
||||
| sound/wizard/wdeath.wav | sound/wizard/wdeath.wav | 99d9c71343bc23222abb92119d404400 |
|
||||
| sound/wizard/widle1.wav | sound/wizard/widle1.wav | b22b1dd9f66879b3447d36ab584316c7 |
|
||||
| sound/wizard/widle2.wav | sound/wizard/widle2.wav | 7178fd83df227360564adef01bed92c6 |
|
||||
| sound/wizard/wpain.wav | sound/wizard/wpain.wav | bd7e59ab7d7b835f9ed8ab51950914de |
|
||||
| sound/wizard/wsight.wav | sound/wizard/wsight.wav | df5949057c750528917c6cb32b7fd9fd |
|
||||
| sound/zombie/idle_w2.wav | sound/zombie/idle_w2.wav | d2bb59b9d7ac71097c07123a23525641 |
|
||||
| sound/zombie/z_fall.wav | sound/zombie/z_fall.wav | 6968318b2d196c6d54bc707d8a390547 |
|
||||
| sound/zombie/z_gib.wav | sound/zombie/z_gib.wav | 199dda66ade8d6f0ef4897e4d7608c0d |
|
||||
| sound/zombie/z_hit.wav | sound/zombie/z_hit.wav | 6c66ab3e6b149bf35956a4bbc0057acb |
|
||||
| sound/zombie/z_idle1.wav | sound/zombie/z_idle1.wav | 21088a7b38b1124d7ec72e58d5ab93a6 |
|
||||
| sound/zombie/z_idle.wav | sound/zombie/z_idle.wav | e5e570e38c4405111004190a79f0e925 |
|
||||
| sound/zombie/z_miss.wav | sound/zombie/z_miss.wav | 96fad96a8c3bc6f7bcc5da6c82678da2 |
|
||||
| sound/zombie/z_pain1.wav | sound/zombie/z_pain1.wav | fcd83b89a94b0cadbe1361a4df080ec0 |
|
||||
| sound/zombie/z_pain.wav | sound/zombie/z_pain.wav | 56637968b8309bd2f825153330bbdfc0 |
|
||||
| sound/zombie/z_shot1.wav | sound/zombie/z_shot1.wav | 561afb69b7851923a8fb3b54e3e13c96 |
|
||||
|
||||
Look to [infighter](https://github.com/decino/q2-infighter) for more info.
|
||||
|
|
|
@ -1848,13 +1848,13 @@ Mod_LoadLimits(const char *mod_name, void *extradata, modtype_t type)
|
|||
|
||||
if (pheader->skinheight > MAX_LBM_HEIGHT)
|
||||
{
|
||||
R_Printf(PRINT_ALL, "%s: model %s has a skin taller %d than %d",
|
||||
R_Printf(PRINT_ALL, "%s: model %s has a skin taller %d than %d\n",
|
||||
__func__, mod_name, pheader->skinheight, MAX_LBM_HEIGHT);
|
||||
}
|
||||
|
||||
if (pheader->skinwidth > MAX_LBM_HEIGHT)
|
||||
{
|
||||
R_Printf(PRINT_ALL, "%s: model %s has a skin wider %d than %d",
|
||||
R_Printf(PRINT_ALL, "%s: model %s has a skin wider %d than %d\n",
|
||||
__func__, mod_name, pheader->skinwidth, MAX_LBM_HEIGHT);
|
||||
}
|
||||
|
||||
|
|
|
@ -155,13 +155,7 @@ void SP_monster_boss2(edict_t *self);
|
|||
void SP_monster_jorg(edict_t *self);
|
||||
void SP_monster_makron(edict_t *self);
|
||||
void SP_monster_boss3_stand(edict_t *self);
|
||||
|
||||
void SP_monster_commander_body(edict_t *self);
|
||||
|
||||
void SP_turret_breach(edict_t *self);
|
||||
void SP_turret_base(edict_t *self);
|
||||
void SP_turret_driver(edict_t *self);
|
||||
|
||||
void SP_monster_shambler(edict_t *self);
|
||||
void SP_monster_soldier_hypergun(edict_t *self);
|
||||
void SP_monster_soldier_lasergun(edict_t *self);
|
||||
|
@ -171,6 +165,24 @@ void SP_monster_gekk(edict_t *self);
|
|||
void SP_monster_chick_heat(edict_t *self);
|
||||
void SP_monster_gladb(edict_t *self);
|
||||
void SP_monster_boss5(edict_t *self);
|
||||
void SP_monster_army(edict_t *self);
|
||||
void SP_monster_demon(edict_t *self);
|
||||
void SP_monster_dog(edict_t *self);
|
||||
void SP_monster_enforcer(edict_t *self);
|
||||
void SP_monster_fish(edict_t *self);
|
||||
void SP_monster_hknight(edict_t *self);
|
||||
void SP_monster_knight(edict_t *self);
|
||||
void SP_monster_ogre(edict_t *self);
|
||||
void SP_monster_shalrath(edict_t *self);
|
||||
void SP_monster_tarbaby(edict_t *self);
|
||||
void SP_monster_wizard(edict_t *self);
|
||||
void SP_monster_zombie(edict_t *self);
|
||||
|
||||
void SP_turret_breach(edict_t *self);
|
||||
void SP_turret_base(edict_t *self);
|
||||
void SP_turret_driver(edict_t *self);
|
||||
|
||||
|
||||
void SP_rotating_light(edict_t *self);
|
||||
void SP_object_repair(edict_t *self);
|
||||
void SP_misc_crashviper(edict_t *ent);
|
||||
|
@ -362,6 +374,18 @@ static spawn_t spawns[] = {
|
|||
{"monster_chick_heat", SP_monster_chick_heat},
|
||||
{"monster_gladb", SP_monster_gladb},
|
||||
{"monster_boss5", SP_monster_boss5},
|
||||
{"monster_army", SP_monster_army},
|
||||
{"monster_demon", SP_monster_demon},
|
||||
{"monster_dog", SP_monster_dog},
|
||||
{"monster_enforcer", SP_monster_enforcer},
|
||||
{"monster_fish", SP_monster_fish},
|
||||
{"monster_hknight", SP_monster_hknight},
|
||||
{"monster_knight", SP_monster_knight},
|
||||
{"monster_ogre", SP_monster_ogre},
|
||||
{"monster_shalrath", SP_monster_shalrath},
|
||||
{"monster_tarbaby", SP_monster_tarbaby},
|
||||
{"monster_wizard", SP_monster_wizard},
|
||||
{"monster_zombie", SP_monster_zombie},
|
||||
|
||||
{"turret_breach", SP_turret_breach},
|
||||
{"turret_base", SP_turret_base},
|
||||
|
|
|
@ -8,7 +8,7 @@ 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.
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
|
@ -19,7 +19,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|||
*/
|
||||
// m_army.c
|
||||
|
||||
#include "../../game/g_local.h"
|
||||
#include "../../header/local.h"
|
||||
|
||||
static int sound_death;
|
||||
static int sound_search;
|
||||
|
@ -29,17 +29,17 @@ static int sound_attack;
|
|||
static int sound_sight;
|
||||
|
||||
// Stand
|
||||
mframe_t army_frames_stand [] =
|
||||
static mframe_t army_frames_stand [] =
|
||||
{
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
};
|
||||
mmove_t army_move_stand = {0, 7, army_frames_stand, NULL};
|
||||
|
||||
|
@ -49,17 +49,17 @@ void army_stand(edict_t *self)
|
|||
}
|
||||
|
||||
// Run
|
||||
mframe_t army_frames_run [] =
|
||||
static mframe_t army_frames_run [] =
|
||||
{
|
||||
ai_run, 11, NULL,
|
||||
ai_run, 15, NULL,
|
||||
ai_run, 10, NULL,
|
||||
ai_run, 10, NULL,
|
||||
{ai_run, 11, NULL},
|
||||
{ai_run, 15, NULL},
|
||||
{ai_run, 10, NULL},
|
||||
{ai_run, 10, NULL},
|
||||
|
||||
ai_run, 8, NULL,
|
||||
ai_run, 15, NULL,
|
||||
ai_run, 10, NULL,
|
||||
ai_run, 8, NULL
|
||||
{ai_run, 8, NULL},
|
||||
{ai_run, 15, NULL},
|
||||
{ai_run, 10, NULL},
|
||||
{ai_run, 8, NULL}
|
||||
};
|
||||
mmove_t army_move_run = {73, 80, army_frames_run, NULL};
|
||||
|
||||
|
@ -85,19 +85,19 @@ void FireArmy(edict_t *self)
|
|||
}
|
||||
|
||||
// Attack
|
||||
mframe_t army_frames_attack [] =
|
||||
static mframe_t army_frames_attack [] =
|
||||
{
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
|
||||
ai_charge, 0, FireArmy,
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
{ai_charge, 0, FireArmy},
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
|
||||
ai_charge, 0, NULL
|
||||
{ai_charge, 0, NULL}
|
||||
};
|
||||
mmove_t army_move_attack = {81, 89, army_frames_attack, army_run};
|
||||
|
||||
|
@ -107,7 +107,7 @@ void army_attack(edict_t *self)
|
|||
}
|
||||
|
||||
// Sight
|
||||
void army_sight(edict_t *self)
|
||||
void army_sight(edict_t *self, edict_t *other /* unused */)
|
||||
{
|
||||
gi.sound(self, CHAN_VOICE, sound_sight, 1, ATTN_NORM, 0);
|
||||
}
|
||||
|
@ -119,69 +119,70 @@ void army_search(edict_t *self)
|
|||
}
|
||||
|
||||
// Pain (1)
|
||||
mframe_t army_frames_pain1 [] =
|
||||
static mframe_t army_frames_pain1 [] =
|
||||
{
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL}
|
||||
};
|
||||
mmove_t army_move_pain1 = {40, 45, army_frames_pain1, army_run};
|
||||
|
||||
// Pain (2)
|
||||
mframe_t army_frames_pain2 [] =
|
||||
static mframe_t army_frames_pain2 [] =
|
||||
{
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 13, NULL,
|
||||
ai_move, 9, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 13, NULL},
|
||||
{ai_move, 9, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 2, NULL,
|
||||
ai_move, 0, NULL
|
||||
{ai_move, 2, NULL},
|
||||
{ai_move, 0, NULL}
|
||||
};
|
||||
mmove_t army_move_pain2 = {46, 59, army_frames_pain2, army_run};
|
||||
|
||||
// Pain (3)
|
||||
mframe_t army_frames_pain3 [] =
|
||||
static mframe_t army_frames_pain3 [] =
|
||||
{
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 1, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 1, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 1, NULL,
|
||||
ai_move, 1, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 1, NULL,
|
||||
{ai_move, 1, NULL},
|
||||
{ai_move, 1, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 1, NULL},
|
||||
|
||||
ai_move, 4, NULL,
|
||||
ai_move, 3, NULL,
|
||||
ai_move, 6, NULL,
|
||||
ai_move, 8, NULL,
|
||||
{ai_move, 4, NULL},
|
||||
{ai_move, 3, NULL},
|
||||
{ai_move, 6, NULL},
|
||||
{ai_move, 8, NULL},
|
||||
|
||||
ai_move, 2, NULL
|
||||
{ai_move, 2, NULL}
|
||||
};
|
||||
mmove_t army_move_pain3 = {60, 72, army_frames_pain3, army_run};
|
||||
|
||||
void army_pain(edict_t *self)
|
||||
void army_pain(edict_t *self, edict_t *other /* unused */,
|
||||
float kick /* unused */, int damage)
|
||||
{
|
||||
float r;
|
||||
|
||||
|
||||
// decino: No pain animations in Nightmare mode
|
||||
if (skill->value == 3)
|
||||
if (skill->value == SKILL_HARDPLUS)
|
||||
return;
|
||||
if (level.time < self->pain_debounce_time)
|
||||
return;
|
||||
|
@ -218,39 +219,39 @@ void army_dead(edict_t *self)
|
|||
}
|
||||
|
||||
// Death (1)
|
||||
mframe_t army_frames_death1 [] =
|
||||
static mframe_t army_frames_death1 [] =
|
||||
{
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL}
|
||||
};
|
||||
mmove_t army_move_death1 = {8, 17, army_frames_death1, army_dead};
|
||||
|
||||
// Death (2)
|
||||
mframe_t army_frames_death2 [] =
|
||||
static mframe_t army_frames_death2 [] =
|
||||
{
|
||||
ai_move, 0, NULL,
|
||||
ai_move, -5, NULL,
|
||||
ai_move, -4, NULL,
|
||||
ai_move, -13, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, -5, NULL},
|
||||
{ai_move, -4, NULL},
|
||||
{ai_move, -13, NULL},
|
||||
|
||||
ai_move, -3, NULL,
|
||||
ai_move, -4, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, -3, NULL},
|
||||
{ai_move, -4, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL}
|
||||
};
|
||||
mmove_t army_move_death2 = {18, 28, army_frames_death2, army_dead};
|
||||
|
||||
|
@ -283,22 +284,19 @@ void army_die(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage,
|
|||
self->monsterinfo.currentmove = &army_move_death2;
|
||||
}
|
||||
|
||||
void SP_monster_q1_army(edict_t *self)
|
||||
void SP_monster_army(edict_t *self)
|
||||
{
|
||||
self->s.modelindex = gi.modelindex("models/quake1/army/tris.md2");
|
||||
VectorSet (self->mins, -16, -16, -24);
|
||||
VectorSet (self->maxs, 16, 16, 40);
|
||||
self->s.modelindex = gi.modelindex("models/monsters/army/tris.md2");
|
||||
VectorSet(self->mins, -16, -16, -24);
|
||||
VectorSet(self->maxs, 16, 16, 40);
|
||||
self->health = 30;
|
||||
self->monster_name = "Grunt";
|
||||
|
||||
if (self->solid == SOLID_NOT)
|
||||
return;
|
||||
sound_death = gi.soundindex("quake1/army/death1.wav");
|
||||
sound_search = gi.soundindex("quake1/army/idle.wav");
|
||||
sound_pain1 = gi.soundindex("quake1/army/pain1.wav");
|
||||
sound_pain2 = gi.soundindex("quake1/army/pain2.wav");
|
||||
sound_attack = gi.soundindex("quake1/army/sattck1.wav");
|
||||
sound_sight = gi.soundindex("quake1/army/sight1.wav");
|
||||
sound_death = gi.soundindex("army/death1.wav");
|
||||
sound_search = gi.soundindex("army/idle.wav");
|
||||
sound_pain1 = gi.soundindex("army/pain1.wav");
|
||||
sound_pain2 = gi.soundindex("army/pain2.wav");
|
||||
sound_attack = gi.soundindex("army/sattck1.wav");
|
||||
sound_sight = gi.soundindex("army/sight1.wav");
|
||||
|
||||
self->movetype = MOVETYPE_STEP;
|
||||
self->solid = SOLID_BBOX;
|
|
@ -8,7 +8,7 @@ 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.
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
|
@ -19,7 +19,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|||
*/
|
||||
// m_demon.c
|
||||
|
||||
#include "../../game/g_local.h"
|
||||
#include "../../header/local.h"
|
||||
|
||||
static int sound_death;
|
||||
static int sound_hit;
|
||||
|
@ -30,24 +30,24 @@ static int sound_sight;
|
|||
static int sound_search;
|
||||
|
||||
// Stand
|
||||
mframe_t demon_frames_stand [] =
|
||||
static mframe_t demon_frames_stand [] =
|
||||
{
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
|
||||
ai_stand, 0, NULL
|
||||
{ai_stand, 0, NULL},
|
||||
};
|
||||
mmove_t demon_move_stand = {0, 12, demon_frames_stand, NULL};
|
||||
|
||||
|
@ -57,15 +57,15 @@ void demon_stand(edict_t *self)
|
|||
}
|
||||
|
||||
// Run
|
||||
mframe_t demon_frames_run [] =
|
||||
static mframe_t demon_frames_run [] =
|
||||
{
|
||||
ai_run, 20, NULL,
|
||||
ai_run, 15, NULL,
|
||||
ai_run, 36, NULL,
|
||||
ai_run, 20, NULL,
|
||||
{ai_run, 20, NULL},
|
||||
{ai_run, 15, NULL},
|
||||
{ai_run, 36, NULL},
|
||||
{ai_run, 20, NULL},
|
||||
|
||||
ai_run, 15, NULL,
|
||||
ai_run, 36, NULL
|
||||
{ai_run, 15, NULL},
|
||||
{ai_run, 36, NULL}
|
||||
};
|
||||
mmove_t demon_move_run = {21, 26, demon_frames_run, NULL};
|
||||
|
||||
|
@ -85,14 +85,14 @@ qboolean CheckDemonJump(edict_t *self)
|
|||
return false;
|
||||
if (self->s.origin[2] + self->mins[2] < self->enemy->s.origin[2] + self->enemy->mins[2] + 0.25 * self->enemy->size[2])
|
||||
return false;
|
||||
|
||||
|
||||
VectorSubtract(self->enemy->s.origin, self->s.origin, dir);
|
||||
dir[2] = 0;
|
||||
distance = VectorLength(dir);
|
||||
|
||||
|
||||
if (distance < 100)
|
||||
return false;
|
||||
|
||||
|
||||
if (distance > 200)
|
||||
{
|
||||
if (random() < 0.9)
|
||||
|
@ -105,7 +105,7 @@ void DemonJumpTouch(edict_t *self, edict_t *other, cplane_t *plane, csurface_t *
|
|||
{
|
||||
if (self->health < 1)
|
||||
return;
|
||||
if (other->takedamage && other->monster_team != self->monster_team)
|
||||
if (other->takedamage)
|
||||
{
|
||||
if (VectorLength(self->velocity) > 400)
|
||||
{
|
||||
|
@ -148,22 +148,22 @@ void demon_roar(edict_t *self)
|
|||
}
|
||||
|
||||
// Attack
|
||||
mframe_t demon_frames_jump [] =
|
||||
static mframe_t demon_frames_jump [] =
|
||||
{
|
||||
ai_charge, 0, demon_roar,
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, DemonJump,
|
||||
{ai_charge, 0, demon_roar},
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, DemonJump},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL}
|
||||
};
|
||||
mmove_t demon_move_jump = {27, 38, demon_frames_jump, demon_run};
|
||||
|
||||
|
@ -192,26 +192,26 @@ void DemonMelee(edict_t *self)
|
|||
}
|
||||
|
||||
// Melee
|
||||
mframe_t demon_frames_melee [] =
|
||||
static mframe_t demon_frames_melee [] =
|
||||
{
|
||||
ai_charge, 4, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 1, NULL,
|
||||
{ai_charge, 4, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 1, NULL},
|
||||
|
||||
ai_charge, 14, DemonMelee,
|
||||
ai_charge, 1, NULL,
|
||||
ai_charge, 6, NULL,
|
||||
ai_charge, 8, NULL,
|
||||
{ai_charge, 14, DemonMelee},
|
||||
{ai_charge, 1, NULL},
|
||||
{ai_charge, 6, NULL},
|
||||
{ai_charge, 8, NULL},
|
||||
|
||||
ai_charge, 4, NULL,
|
||||
ai_charge, 2, NULL,
|
||||
ai_charge, 12, DemonMelee,
|
||||
ai_charge, 5, NULL,
|
||||
{ai_charge, 4, NULL},
|
||||
{ai_charge, 2, NULL},
|
||||
{ai_charge, 12, DemonMelee},
|
||||
{ai_charge, 5, NULL},
|
||||
|
||||
ai_charge, 8, NULL,
|
||||
ai_charge, 4, NULL,
|
||||
ai_charge, 4, NULL
|
||||
{ai_charge, 8, NULL},
|
||||
{ai_charge, 4, NULL},
|
||||
{ai_charge, 4, NULL}
|
||||
};
|
||||
mmove_t demon_move_melee = {54, 68, demon_frames_melee, demon_run};
|
||||
|
||||
|
@ -221,22 +221,22 @@ void demon_melee(edict_t *self)
|
|||
}
|
||||
|
||||
// Pain
|
||||
mframe_t demon_frames_pain [] =
|
||||
static mframe_t demon_frames_pain [] =
|
||||
{
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL}
|
||||
};
|
||||
mmove_t demon_move_pain = {39, 44, demon_frames_pain, demon_run};
|
||||
|
||||
void demon_pain(edict_t *self, edict_t *other, float kick, int damage)
|
||||
{
|
||||
// decino: No pain animations in Nightmare mode
|
||||
if (skill->value == 3)
|
||||
if (skill->value == SKILL_HARDPLUS)
|
||||
return;
|
||||
if (self->touch == DemonJumpTouch)
|
||||
return;
|
||||
|
@ -261,19 +261,19 @@ void demon_dead(edict_t *self)
|
|||
}
|
||||
|
||||
// Death
|
||||
mframe_t demon_frames_die [] =
|
||||
static mframe_t demon_frames_die [] =
|
||||
{
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL
|
||||
{ai_move, 0, NULL}
|
||||
};
|
||||
mmove_t demon_move_die = {45, 53, demon_frames_die, demon_dead};
|
||||
|
||||
|
@ -304,7 +304,7 @@ void demon_die(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage,
|
|||
}
|
||||
|
||||
// Sight
|
||||
void demon_sight(edict_t *self)
|
||||
void demon_sight(edict_t *self, edict_t *other /* unused */)
|
||||
{
|
||||
gi.sound (self, CHAN_VOICE, sound_sight, 1, ATTN_NORM, 0);
|
||||
}
|
||||
|
@ -315,23 +315,20 @@ void demon_search(edict_t *self)
|
|||
gi.sound (self, CHAN_VOICE, sound_search, 1, ATTN_NORM, 0);
|
||||
}
|
||||
|
||||
void SP_monster_q1_demon(edict_t *self)
|
||||
void SP_monster_demon(edict_t *self)
|
||||
{
|
||||
self->s.modelindex = gi.modelindex("models/quake1/demon/tris.md2");
|
||||
self->s.modelindex = gi.modelindex("models/monsters/demon/tris.md2");
|
||||
VectorSet(self->mins, -32, -32, -24);
|
||||
VectorSet(self->maxs, 32, 32, 64);
|
||||
self->health = 300;
|
||||
self->monster_name = "Fiend";
|
||||
|
||||
if (self->solid == SOLID_NOT)
|
||||
return;
|
||||
sound_death = gi.soundindex("quake1/demon/ddeath.wav");
|
||||
sound_hit = gi.soundindex("quake1/demon/dhit2.wav");
|
||||
sound_jump = gi.soundindex("quake1/demon/djump.wav");
|
||||
sound_land = gi.soundindex("quake1/demon/dland2.wav");
|
||||
sound_pain = gi.soundindex("quake1/demon/dpain1.wav");
|
||||
sound_search = gi.soundindex("quake1/demon/idle1.wav");
|
||||
sound_sight = gi.soundindex("quake1/demon/sight2.wav");
|
||||
sound_death = gi.soundindex("demon/ddeath.wav");
|
||||
sound_hit = gi.soundindex("demon/dhit2.wav");
|
||||
sound_jump = gi.soundindex("demon/djump.wav");
|
||||
sound_land = gi.soundindex("demon/dland2.wav");
|
||||
sound_pain = gi.soundindex("demon/dpain1.wav");
|
||||
sound_search = gi.soundindex("demon/idle1.wav");
|
||||
sound_sight = gi.soundindex("demon/sight2.wav");
|
||||
|
||||
self->movetype = MOVETYPE_STEP;
|
||||
self->solid = SOLID_BBOX;
|
|
@ -8,7 +8,7 @@ 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.
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
|
@ -19,7 +19,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|||
*/
|
||||
// m_dog.c
|
||||
|
||||
#include "../../game/g_local.h"
|
||||
#include "../../header/local.h"
|
||||
|
||||
static int sound_melee;
|
||||
static int sound_death;
|
||||
|
@ -30,19 +30,19 @@ static int sound_search;
|
|||
void dog_leap(edict_t *self);
|
||||
|
||||
// Stand
|
||||
mframe_t dog_frames_stand [] =
|
||||
static mframe_t dog_frames_stand [] =
|
||||
{
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
|
||||
ai_stand, 0, NULL
|
||||
{ai_stand, 0, NULL},
|
||||
};
|
||||
mmove_t dog_move_stand = {69, 77, dog_frames_stand, NULL};
|
||||
|
||||
|
@ -52,35 +52,35 @@ void dog_stand(edict_t *self)
|
|||
}
|
||||
|
||||
// Run
|
||||
mframe_t dog_frames_run [] =
|
||||
static mframe_t dog_frames_run [] =
|
||||
{
|
||||
ai_run, 16, NULL,
|
||||
ai_run, 32, NULL,
|
||||
ai_run, 32, NULL,
|
||||
ai_run, 20, NULL,
|
||||
ai_run, 64, NULL,
|
||||
{ai_run, 16, NULL},
|
||||
{ai_run, 32, NULL},
|
||||
{ai_run, 32, NULL},
|
||||
{ai_run, 20, NULL},
|
||||
{ai_run, 64, NULL},
|
||||
|
||||
ai_run, 32, NULL,
|
||||
ai_run, 16, NULL,
|
||||
ai_run, 32, NULL,
|
||||
ai_run, 32, NULL,
|
||||
{ai_run, 32, NULL},
|
||||
{ai_run, 16, NULL},
|
||||
{ai_run, 32, NULL},
|
||||
{ai_run, 32, NULL},
|
||||
|
||||
ai_run, 20, NULL,
|
||||
ai_run, 64, NULL,
|
||||
ai_run, 32, dog_leap
|
||||
{ai_run, 20, NULL},
|
||||
{ai_run, 64, NULL},
|
||||
{ai_run, 32, dog_leap}
|
||||
};
|
||||
mmove_t dog_move_run = {48, 59, dog_frames_run, NULL};
|
||||
|
||||
void dog_run(edict_t *self)
|
||||
{
|
||||
self->monsterinfo.currentmove = &dog_move_run;
|
||||
}
|
||||
}
|
||||
|
||||
void DogLeapTouch(edict_t *self, edict_t *other, cplane_t *plane, csurface_t *surf)
|
||||
{
|
||||
if (self->health < 1)
|
||||
return;
|
||||
if (other->takedamage && other->monster_team != self->monster_team)
|
||||
if (other->takedamage)
|
||||
{
|
||||
if (VectorLength(self->velocity) > 300)
|
||||
{
|
||||
|
@ -116,25 +116,24 @@ void DogLeap(edict_t *self)
|
|||
}
|
||||
|
||||
// Leap
|
||||
mframe_t dog_frames_leap [] =
|
||||
static mframe_t dog_frames_leap [] =
|
||||
{
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, DogLeap,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, DogLeap},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL
|
||||
{ai_move, 0, NULL}
|
||||
};
|
||||
mmove_t dog_move_leap = {60, 68, dog_frames_leap, dog_run};
|
||||
|
||||
void dog_leap(edict_t *self)
|
||||
{
|
||||
//if (self->enemy && CheckDistance(self, self->enemy) < (MELEE_DISTANCE * 4))
|
||||
self->monsterinfo.currentmove = &dog_move_leap;
|
||||
}
|
||||
|
||||
|
@ -158,17 +157,17 @@ void DogBite(edict_t *self)
|
|||
}
|
||||
|
||||
// Melee
|
||||
mframe_t dog_frames_melee [] =
|
||||
static mframe_t dog_frames_melee [] =
|
||||
{
|
||||
ai_charge, 10, NULL,
|
||||
ai_charge, 10, NULL,
|
||||
ai_charge, 10, NULL,
|
||||
ai_charge, 10, DogBite,
|
||||
{ai_charge, 10, NULL},
|
||||
{ai_charge, 10, NULL},
|
||||
{ai_charge, 10, NULL},
|
||||
{ai_charge, 10, DogBite},
|
||||
|
||||
ai_charge, 10, NULL,
|
||||
ai_charge, 10, NULL,
|
||||
ai_charge, 10, NULL,
|
||||
ai_charge, 10, NULL
|
||||
{ai_charge, 10, NULL},
|
||||
{ai_charge, 10, NULL},
|
||||
{ai_charge, 10, NULL},
|
||||
{ai_charge, 10, NULL}
|
||||
};
|
||||
mmove_t dog_move_melee = {0, 7, dog_frames_melee, dog_run};
|
||||
|
||||
|
@ -178,7 +177,7 @@ void dog_melee(edict_t *self)
|
|||
}
|
||||
|
||||
// Sight
|
||||
void dog_sight(edict_t *self)
|
||||
void dog_sight(edict_t *self, edict_t *other /* unused */)
|
||||
{
|
||||
gi.sound(self, CHAN_VOICE, sound_sight, 1, ATTN_NORM, 0);
|
||||
}
|
||||
|
@ -190,47 +189,48 @@ void dog_search(edict_t *self)
|
|||
}
|
||||
|
||||
// Pain (1)
|
||||
mframe_t dog_frames_pain1 [] =
|
||||
static mframe_t dog_frames_pain1 [] =
|
||||
{
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL}
|
||||
};
|
||||
mmove_t dog_move_pain1 = {26, 31, dog_frames_pain1, dog_run};
|
||||
|
||||
// Pain (2)
|
||||
mframe_t dog_frames_pain2 [] =
|
||||
static mframe_t dog_frames_pain2 [] =
|
||||
{
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, -4, NULL,
|
||||
ai_move, -12, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, -4, NULL},
|
||||
{ai_move, -12, NULL},
|
||||
|
||||
ai_move, -12, NULL,
|
||||
ai_move, -2, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, -4, NULL,
|
||||
{ai_move, -12, NULL},
|
||||
{ai_move, -2, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, -4, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, -10, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, -10, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL}
|
||||
};
|
||||
mmove_t dog_move_pain2 = {32, 47, dog_frames_pain2, dog_run};
|
||||
|
||||
void dog_pain(edict_t *self)
|
||||
void dog_pain(edict_t *self, edict_t *other /* unused */,
|
||||
float kick /* unused */, int damage)
|
||||
{
|
||||
// decino: No pain animations in Nightmare mode
|
||||
if (skill->value == 3)
|
||||
if (skill->value == SKILL_HARDPLUS)
|
||||
return;
|
||||
if (random() > 0.5)
|
||||
self->monsterinfo.currentmove = &dog_move_pain1;
|
||||
|
@ -250,36 +250,36 @@ void dog_dead(edict_t *self)
|
|||
}
|
||||
|
||||
// Death (1)
|
||||
mframe_t dog_frames_die1 [] =
|
||||
static mframe_t dog_frames_die1 [] =
|
||||
{
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL
|
||||
{ai_move, 0, NULL}
|
||||
};
|
||||
mmove_t dog_move_die1 = {8, 16, dog_frames_die1, dog_dead};
|
||||
|
||||
// Death (2)
|
||||
mframe_t dog_frames_die2 [] =
|
||||
static mframe_t dog_frames_die2 [] =
|
||||
{
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL
|
||||
{ai_move, 0, NULL}
|
||||
};
|
||||
mmove_t dog_move_die2 = {17, 25, dog_frames_die2, dog_dead};
|
||||
|
||||
|
@ -312,21 +312,18 @@ void dog_die(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, v
|
|||
self->monsterinfo.currentmove = &dog_move_die2;
|
||||
}
|
||||
|
||||
void SP_monster_q1_dog(edict_t *self)
|
||||
void SP_monster_dog(edict_t *self)
|
||||
{
|
||||
self->s.modelindex = gi.modelindex("models/quake1/dog/tris.md2");
|
||||
VectorSet (self->mins, -32, -32, -24);
|
||||
VectorSet (self->maxs, 32, 32, 40);
|
||||
self->s.modelindex = gi.modelindex("models/monsters/dog/tris.md2");
|
||||
VectorSet(self->mins, -32, -32, -24);
|
||||
VectorSet(self->maxs, 32, 32, 40);
|
||||
self->health = 25;
|
||||
self->monster_name = "Rottweiler";
|
||||
|
||||
if (self->solid == SOLID_NOT)
|
||||
return;
|
||||
sound_melee = gi.soundindex("quake1/dog/dattack1.wav");
|
||||
sound_death = gi.soundindex("quake1/dog/ddeath.wav");
|
||||
sound_pain = gi.soundindex("quake1/dog/dpain1.wav");
|
||||
sound_sight = gi.soundindex("quake1/dog/dsight.wav");
|
||||
sound_search = gi.soundindex("quake1/dog/idle.wav");
|
||||
sound_melee = gi.soundindex("dog/dattack1.wav");
|
||||
sound_death = gi.soundindex("dog/ddeath.wav");
|
||||
sound_pain = gi.soundindex("dog/dpain1.wav");
|
||||
sound_sight = gi.soundindex("dog/dsight.wav");
|
||||
sound_search = gi.soundindex("dog/idle.wav");
|
||||
|
||||
self->movetype = MOVETYPE_STEP;
|
||||
self->solid = SOLID_BBOX;
|
|
@ -8,7 +8,7 @@ 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.
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
|
@ -19,7 +19,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|||
*/
|
||||
// m_enforcer.c
|
||||
|
||||
#include "../../game/g_local.h"
|
||||
#include "../../header/local.h"
|
||||
|
||||
static int sound_death;
|
||||
static int sound_hit;
|
||||
|
@ -33,16 +33,16 @@ static int sound_sight3;
|
|||
static int sound_sight4;
|
||||
|
||||
// Stand
|
||||
mframe_t enforcer_frames_stand [] =
|
||||
static mframe_t enforcer_frames_stand [] =
|
||||
{
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
};
|
||||
mmove_t enforcer_move_stand = {0, 6, enforcer_frames_stand, NULL};
|
||||
|
||||
|
@ -52,17 +52,17 @@ void enforcer_stand(edict_t *self)
|
|||
}
|
||||
|
||||
// Run
|
||||
mframe_t enforcer_frames_run [] =
|
||||
static mframe_t enforcer_frames_run [] =
|
||||
{
|
||||
ai_run, 18, NULL,
|
||||
ai_run, 14, NULL,
|
||||
ai_run, 7, NULL,
|
||||
ai_run, 12, NULL,
|
||||
{ai_run, 18, NULL},
|
||||
{ai_run, 14, NULL},
|
||||
{ai_run, 7, NULL},
|
||||
{ai_run, 12, NULL},
|
||||
|
||||
ai_run, 14, NULL,
|
||||
ai_run, 14, NULL,
|
||||
ai_run, 7, NULL,
|
||||
ai_run, 11, NULL
|
||||
{ai_run, 14, NULL},
|
||||
{ai_run, 14, NULL},
|
||||
{ai_run, 7, NULL},
|
||||
{ai_run, 11, NULL}
|
||||
};
|
||||
mmove_t enforcer_move_run = {23, 30, enforcer_frames_run, NULL};
|
||||
|
||||
|
@ -73,17 +73,21 @@ void enforcer_run(edict_t *self)
|
|||
|
||||
void enfbolt_touch(edict_t *self, edict_t *other, cplane_t *plane, csurface_t *surf)
|
||||
{
|
||||
int mod;
|
||||
|
||||
if (other == self->owner)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (surf && (surf->flags & SURF_SKY))
|
||||
{
|
||||
G_FreeEdict (self);
|
||||
return;
|
||||
}
|
||||
|
||||
if (other->takedamage)
|
||||
{
|
||||
T_Damage (other, self, self->owner, self->velocity, self->s.origin, plane->normal, self->dmg, 1, DAMAGE_ENERGY, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
gi.WriteByte(svc_temp_entity);
|
||||
|
@ -96,6 +100,7 @@ void enfbolt_touch(edict_t *self, edict_t *other, cplane_t *plane, csurface_t *s
|
|||
|
||||
gi.sound (self, CHAN_WEAPON, sound_hit, 1, ATTN_NORM, 0);
|
||||
}
|
||||
|
||||
G_FreeEdict(self);
|
||||
}
|
||||
|
||||
|
@ -104,12 +109,10 @@ void fire_enfbolt(edict_t *self, vec3_t start, vec3_t dir, int damage, int speed
|
|||
edict_t *bolt;
|
||||
trace_t tr;
|
||||
|
||||
// decino: No enemies left, so stop shooting
|
||||
if (!self->enemy || self->enemy == self)
|
||||
if (!self)
|
||||
{
|
||||
return;
|
||||
// decino: Don't make impossible shots
|
||||
VectorCopy(SightEndtToDir(self, dir)[0], dir);
|
||||
VectorNormalize (dir);
|
||||
}
|
||||
|
||||
bolt = G_Spawn();
|
||||
bolt->svflags = SVF_DEADMONSTER;
|
||||
|
@ -125,7 +128,7 @@ void fire_enfbolt(edict_t *self, vec3_t start, vec3_t dir, int damage, int speed
|
|||
VectorClear(bolt->mins);
|
||||
VectorClear(bolt->maxs);
|
||||
|
||||
bolt->s.modelindex = gi.modelindex ("models/objects/laser/tris.md2");
|
||||
bolt->s.modelindex = gi.modelindex("models/monsters/objects/laser/tris.md2");
|
||||
bolt->owner = self;
|
||||
bolt->touch = enfbolt_touch;
|
||||
bolt->nextthink = level.time + 5;
|
||||
|
@ -142,7 +145,7 @@ void fire_enfbolt(edict_t *self, vec3_t start, vec3_t dir, int damage, int speed
|
|||
bolt->touch(bolt, tr.ent, NULL, NULL);
|
||||
}
|
||||
gi.sound(self, CHAN_WEAPON, sound_attack, 1, ATTN_NORM, 0);
|
||||
}
|
||||
}
|
||||
|
||||
void FireEnforcerBolt(edict_t *self)
|
||||
{
|
||||
|
@ -164,14 +167,14 @@ void FireEnforcerBolt(edict_t *self)
|
|||
}
|
||||
|
||||
// Attack (second half)
|
||||
mframe_t enforcer_frames_attack2 [] =
|
||||
static mframe_t enforcer_frames_attack2 [] =
|
||||
{
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, FireEnforcerBolt,
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, FireEnforcerBolt},
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
|
||||
ai_charge, 0, NULL
|
||||
{ai_charge, 0, NULL}
|
||||
};
|
||||
mmove_t enforcer_move_attack2 = {35, 40, enforcer_frames_attack2, enforcer_run};
|
||||
|
||||
|
@ -182,17 +185,17 @@ void enforcer_attack_again(edict_t *self)
|
|||
}
|
||||
|
||||
// Attack (first half)
|
||||
mframe_t enforcer_frames_attack1 [] =
|
||||
static mframe_t enforcer_frames_attack1 [] =
|
||||
{
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, FireEnforcerBolt,
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, FireEnforcerBolt},
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL}
|
||||
};
|
||||
mmove_t enforcer_move_attack1 = {31, 38, enforcer_frames_attack1, enforcer_attack_again};
|
||||
|
||||
|
@ -202,7 +205,7 @@ void enforcer_attack(edict_t *self)
|
|||
}
|
||||
|
||||
// Sight
|
||||
void enforcer_sight(edict_t *self)
|
||||
void enforcer_sight(edict_t *self, edict_t *other /* unused */)
|
||||
{
|
||||
int r = (int)(random() * 4);
|
||||
|
||||
|
@ -223,83 +226,84 @@ void enforcer_search(edict_t *self)
|
|||
}
|
||||
|
||||
// Pain (1)
|
||||
mframe_t enforcer_frames_pain1 [] =
|
||||
static mframe_t enforcer_frames_pain1 [] =
|
||||
{
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL}
|
||||
};
|
||||
mmove_t enforcer_move_pain1 = {66, 69, enforcer_frames_pain1, enforcer_run};
|
||||
|
||||
// Pain (2)
|
||||
mframe_t enforcer_frames_pain2 [] =
|
||||
static mframe_t enforcer_frames_pain2 [] =
|
||||
{
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL
|
||||
{ai_move, 0, NULL}
|
||||
};
|
||||
mmove_t enforcer_move_pain2 = {70, 74, enforcer_frames_pain2, enforcer_run};
|
||||
|
||||
// Pain (3)
|
||||
mframe_t enforcer_frames_pain3 [] =
|
||||
static mframe_t enforcer_frames_pain3 [] =
|
||||
{
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL}
|
||||
};
|
||||
mmove_t enforcer_move_pain3 = {75, 82, enforcer_frames_pain3, enforcer_run};
|
||||
|
||||
// Pain (4)
|
||||
mframe_t enforcer_frames_pain4 [] =
|
||||
static mframe_t enforcer_frames_pain4 [] =
|
||||
{
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 2, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 2, NULL},
|
||||
|
||||
ai_move, 1, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 1, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 1, NULL,
|
||||
ai_move, 1, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 1, NULL},
|
||||
{ai_move, 1, NULL},
|
||||
|
||||
ai_move, 1, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 1, NULL,
|
||||
{ai_move, 1, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 1, NULL},
|
||||
|
||||
ai_move, 1, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL
|
||||
{ai_move, 1, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL}
|
||||
};
|
||||
mmove_t enforcer_move_pain4 = {83, 101, enforcer_frames_pain4, enforcer_run};
|
||||
|
||||
// Pain
|
||||
void enforcer_pain(edict_t *self)
|
||||
void enforcer_pain(edict_t *self, edict_t *other /* unused */,
|
||||
float kick /* unused */, int damage)
|
||||
{
|
||||
float r;
|
||||
|
||||
// decino: No pain animations in Nightmare mode
|
||||
if (skill->value == 3)
|
||||
if (skill->value == SKILL_HARDPLUS)
|
||||
return;
|
||||
if (level.time < self->pain_debounce_time)
|
||||
return;
|
||||
r = random();
|
||||
|
||||
|
||||
if (r < 0.5)
|
||||
gi.sound(self, CHAN_VOICE, sound_pain1, 1, ATTN_NORM, 0);
|
||||
else
|
||||
|
@ -337,44 +341,44 @@ void enforcer_dead(edict_t *self)
|
|||
}
|
||||
|
||||
// Death (1)
|
||||
mframe_t enforcer_frames_death1 [] =
|
||||
static mframe_t enforcer_frames_death1 [] =
|
||||
{
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 14, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 14, NULL},
|
||||
|
||||
ai_move, 2, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 2, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 3, NULL,
|
||||
ai_move, 5, NULL,
|
||||
ai_move, 5, NULL,
|
||||
ai_move, 5, NULL,
|
||||
{ai_move, 3, NULL},
|
||||
{ai_move, 5, NULL},
|
||||
{ai_move, 5, NULL},
|
||||
{ai_move, 5, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL}
|
||||
};
|
||||
mmove_t enforcer_move_death1 = {41, 54, enforcer_frames_death1, enforcer_dead};
|
||||
|
||||
// Death (2)
|
||||
mframe_t enforcer_frames_death2 [] =
|
||||
static mframe_t enforcer_frames_death2 [] =
|
||||
{
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL}
|
||||
};
|
||||
mmove_t enforcer_move_death2 = {55, 65, enforcer_frames_death2, enforcer_dead};
|
||||
|
||||
|
@ -408,26 +412,23 @@ void enforcer_die(edict_t *self, edict_t *inflictor, edict_t *attacker, int dama
|
|||
self->monsterinfo.currentmove = &enforcer_move_death2;
|
||||
}
|
||||
|
||||
void SP_monster_q1_enforcer(edict_t *self)
|
||||
void SP_monster_enforcer(edict_t *self)
|
||||
{
|
||||
self->s.modelindex = gi.modelindex("models/quake1/enforcer/tris.md2");
|
||||
VectorSet (self->mins, -16, -16, -24);
|
||||
VectorSet (self->maxs, 16, 16, 40);
|
||||
self->s.modelindex = gi.modelindex("models/monsters/enforcer/tris.md2");
|
||||
VectorSet(self->mins, -16, -16, -24);
|
||||
VectorSet(self->maxs, 16, 16, 40);
|
||||
self->health = 80;
|
||||
self->monster_name = "Enforcer";
|
||||
|
||||
if (self->solid == SOLID_NOT)
|
||||
return;
|
||||
sound_death = gi.soundindex("quake1/enforcer/death1.wav");
|
||||
sound_hit = gi.soundindex("quake1/enforcer/enfstop.wav");
|
||||
sound_attack = gi.soundindex("quake1/enforcer/enfire.wav");
|
||||
sound_search = gi.soundindex("quake1/enforcer/idle1.wav");
|
||||
sound_pain1 = gi.soundindex("quake1/enforcer/pain1.wav");
|
||||
sound_pain2 = gi.soundindex("quake1/enforcer/pain2.wav");
|
||||
sound_sight1 = gi.soundindex("quake1/enforcer/sight1.wav");
|
||||
sound_sight2 = gi.soundindex("quake1/enforcer/sight2.wav");
|
||||
sound_sight3 = gi.soundindex("quake1/enforcer/sight3.wav");
|
||||
sound_sight4 = gi.soundindex("quake1/enforcer/sight4.wav");
|
||||
sound_death = gi.soundindex("enforcer/death1.wav");
|
||||
sound_hit = gi.soundindex("enforcer/enfstop.wav");
|
||||
sound_attack = gi.soundindex("enforcer/enfire.wav");
|
||||
sound_search = gi.soundindex("enforcer/idle1.wav");
|
||||
sound_pain1 = gi.soundindex("enforcer/pain1.wav");
|
||||
sound_pain2 = gi.soundindex("enforcer/pain2.wav");
|
||||
sound_sight1 = gi.soundindex("enforcer/sight1.wav");
|
||||
sound_sight2 = gi.soundindex("enforcer/sight2.wav");
|
||||
sound_sight3 = gi.soundindex("enforcer/sight3.wav");
|
||||
sound_sight4 = gi.soundindex("enforcer/sight4.wav");
|
||||
|
||||
self->movetype = MOVETYPE_STEP;
|
||||
self->solid = SOLID_BBOX;
|
|
@ -8,7 +8,7 @@ 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.
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
|
@ -19,37 +19,37 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|||
*/
|
||||
// m_fish.c
|
||||
|
||||
#include "../../game/g_local.h"
|
||||
#include "../../header/local.h"
|
||||
|
||||
static int sound_search;
|
||||
static int sound_death;
|
||||
static int sound_melee;
|
||||
|
||||
// Stand
|
||||
mframe_t fish_frames_stand [] =
|
||||
static mframe_t fish_frames_stand [] =
|
||||
{
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
};
|
||||
mmove_t fish_move_stand = {39, 56, fish_frames_stand, NULL};
|
||||
|
||||
|
@ -59,30 +59,30 @@ void fish_stand(edict_t *self)
|
|||
}
|
||||
|
||||
// Run
|
||||
mframe_t fish_frames_run [] =
|
||||
static mframe_t fish_frames_run [] =
|
||||
{
|
||||
ai_run, 12, NULL,
|
||||
ai_run, 12, NULL,
|
||||
ai_run, 12, NULL,
|
||||
ai_run, 12, NULL,
|
||||
{ai_run, 12, NULL},
|
||||
{ai_run, 12, NULL},
|
||||
{ai_run, 12, NULL},
|
||||
{ai_run, 12, NULL},
|
||||
|
||||
ai_run, 12, NULL,
|
||||
ai_run, 12, NULL,
|
||||
ai_run, 12, NULL,
|
||||
ai_run, 12, NULL,
|
||||
{ai_run, 12, NULL},
|
||||
{ai_run, 12, NULL},
|
||||
{ai_run, 12, NULL},
|
||||
{ai_run, 12, NULL},
|
||||
|
||||
ai_run, 12, NULL,
|
||||
ai_run, 12, NULL,
|
||||
ai_run, 12, NULL,
|
||||
ai_run, 12, NULL,
|
||||
{ai_run, 12, NULL},
|
||||
{ai_run, 12, NULL},
|
||||
{ai_run, 12, NULL},
|
||||
{ai_run, 12, NULL},
|
||||
|
||||
ai_run, 12, NULL,
|
||||
ai_run, 12, NULL,
|
||||
ai_run, 12, NULL,
|
||||
ai_run, 12, NULL,
|
||||
{ai_run, 12, NULL},
|
||||
{ai_run, 12, NULL},
|
||||
{ai_run, 12, NULL},
|
||||
{ai_run, 12, NULL},
|
||||
|
||||
ai_run, 12, NULL,
|
||||
ai_run, 12, NULL
|
||||
{ai_run, 12, NULL},
|
||||
{ai_run, 12, NULL}
|
||||
};
|
||||
mmove_t fish_move_run = {39, 56, fish_frames_run, NULL};
|
||||
|
||||
|
@ -111,30 +111,30 @@ void FishBite(edict_t *self)
|
|||
}
|
||||
|
||||
// Melee
|
||||
mframe_t fish_frames_melee [] =
|
||||
static mframe_t fish_frames_melee [] =
|
||||
{
|
||||
ai_run, 10, NULL,
|
||||
ai_run, 10, NULL,
|
||||
ai_run, 0, FishBite,
|
||||
ai_run, 10, NULL,
|
||||
{ai_run, 10, NULL},
|
||||
{ai_run, 10, NULL},
|
||||
{ai_run, 0, FishBite},
|
||||
{ai_run, 10, NULL},
|
||||
|
||||
ai_run, 10, NULL,
|
||||
ai_run, 10, NULL,
|
||||
ai_run, 10, NULL,
|
||||
ai_run, 10, NULL,
|
||||
{ai_run, 10, NULL},
|
||||
{ai_run, 10, NULL},
|
||||
{ai_run, 10, NULL},
|
||||
{ai_run, 10, NULL},
|
||||
|
||||
ai_run, 0, FishBite,
|
||||
ai_run, 10, NULL,
|
||||
ai_run, 10, NULL,
|
||||
ai_run, 10, NULL,
|
||||
{ai_run, 0, FishBite},
|
||||
{ai_run, 10, NULL},
|
||||
{ai_run, 10, NULL},
|
||||
{ai_run, 10, NULL},
|
||||
|
||||
ai_run, 10, NULL,
|
||||
ai_run, 10, NULL,
|
||||
ai_run, 0, FishBite,
|
||||
ai_run, 10, NULL,
|
||||
{ai_run, 10, NULL},
|
||||
{ai_run, 10, NULL},
|
||||
{ai_run, 0, FishBite},
|
||||
{ai_run, 10, NULL},
|
||||
|
||||
ai_run, 10, NULL,
|
||||
ai_run, 10, NULL
|
||||
{ai_run, 10, NULL},
|
||||
{ai_run, 10, NULL}
|
||||
};
|
||||
mmove_t fish_move_melee = {0, 17, fish_frames_melee, fish_run};
|
||||
|
||||
|
@ -160,34 +160,34 @@ void fish_dead(edict_t *self)
|
|||
}
|
||||
|
||||
// Death
|
||||
mframe_t fish_frames_death [] =
|
||||
static mframe_t fish_frames_death [] =
|
||||
{
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL
|
||||
{ai_move, 0, NULL}
|
||||
};
|
||||
mmove_t fish_move_death = {18, 38, fish_frames_death, fish_dead};
|
||||
|
||||
|
@ -217,58 +217,56 @@ void fish_die(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage,
|
|||
}
|
||||
|
||||
// Pain
|
||||
mframe_t fish_frames_pain [] =
|
||||
static mframe_t fish_frames_pain [] =
|
||||
{
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL}
|
||||
};
|
||||
mmove_t fish_move_pain = {57, 65, fish_frames_pain, fish_run};
|
||||
|
||||
void fish_pain(edict_t *self)
|
||||
void fish_pain(edict_t *self, edict_t *other /* unused */,
|
||||
float kick /* unused */, int damage)
|
||||
{
|
||||
if (level.time < self->pain_debounce_time)
|
||||
return;
|
||||
self->pain_debounce_time = level.time + 3;
|
||||
|
||||
// decino: No pain animations in Nightmare mode
|
||||
if (skill->value == 3)
|
||||
if (skill->value == SKILL_HARDPLUS)
|
||||
return;
|
||||
self->monsterinfo.currentmove = &fish_move_pain;
|
||||
}
|
||||
|
||||
void SP_monster_q1_fish(edict_t *self)
|
||||
void SP_monster_fish(edict_t *self)
|
||||
{
|
||||
self->s.modelindex = gi.modelindex("models/quake1/fish/tris.md2");
|
||||
self->s.modelindex = gi.modelindex("models/monsters/fish/tris.md2");
|
||||
VectorSet(self->mins, -16, -16, -24);
|
||||
VectorSet(self->maxs, 16, 16, 24);
|
||||
self->health = 25;
|
||||
self->monster_name = "Rotfish";
|
||||
|
||||
if (self->solid == SOLID_NOT)
|
||||
return;
|
||||
sound_search = gi.soundindex("quake1/fish/idle.wav");
|
||||
sound_death = gi.soundindex("quake1/fish/death.wav");
|
||||
sound_melee = gi.soundindex("quake1/fish/bite.wav");
|
||||
sound_search = gi.soundindex("fish/idle.wav");
|
||||
sound_death = gi.soundindex("fish/death.wav");
|
||||
sound_melee = gi.soundindex("fish/bite.wav");
|
||||
|
||||
self->movetype = MOVETYPE_STEP;
|
||||
self->solid = SOLID_BBOX;
|
|
@ -8,7 +8,7 @@ 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.
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
|
@ -19,7 +19,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|||
*/
|
||||
// m_hknight.c
|
||||
|
||||
#include "../../game/g_local.h"
|
||||
#include "../../header/local.h"
|
||||
|
||||
static int sound_attack;
|
||||
static int sound_melee;
|
||||
|
@ -33,19 +33,19 @@ void hknight_run(edict_t *self);
|
|||
void SwingSword(edict_t *self);
|
||||
|
||||
// Stand
|
||||
mframe_t hknight_frames_stand [] =
|
||||
static mframe_t hknight_frames_stand [] =
|
||||
{
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
|
||||
ai_stand, 0, NULL
|
||||
{ai_stand, 0, NULL},
|
||||
};
|
||||
mmove_t hknight_move_stand = {0, 8, hknight_frames_stand, NULL};
|
||||
|
||||
|
@ -55,27 +55,27 @@ void hknight_stand(edict_t *self)
|
|||
}
|
||||
|
||||
// Charge
|
||||
mframe_t hknight_frames_charge [] =
|
||||
static mframe_t hknight_frames_charge [] =
|
||||
{
|
||||
ai_charge, 20, NULL,
|
||||
ai_charge, 25, NULL,
|
||||
ai_charge, 18, NULL,
|
||||
ai_charge, 16, NULL,
|
||||
{ai_charge, 20, NULL},
|
||||
{ai_charge, 25, NULL},
|
||||
{ai_charge, 18, NULL},
|
||||
{ai_charge, 16, NULL},
|
||||
|
||||
ai_charge, 14, NULL,
|
||||
ai_charge, 20, SwingSword,
|
||||
ai_charge, 21, SwingSword,
|
||||
ai_charge, 13, SwingSword,
|
||||
{ai_charge, 14, NULL},
|
||||
{ai_charge, 20, SwingSword},
|
||||
{ai_charge, 21, SwingSword},
|
||||
{ai_charge, 13, SwingSword},
|
||||
|
||||
ai_charge, 20, SwingSword,
|
||||
ai_charge, 20, SwingSword,
|
||||
ai_charge, 18, SwingSword,
|
||||
ai_charge, 16, NULL,
|
||||
{ai_charge, 20, SwingSword},
|
||||
{ai_charge, 20, SwingSword},
|
||||
{ai_charge, 18, SwingSword},
|
||||
{ai_charge, 16, NULL},
|
||||
|
||||
ai_charge, 20, NULL,
|
||||
ai_charge, 14, NULL,
|
||||
ai_charge, 25, NULL,
|
||||
ai_charge, 21, NULL,
|
||||
{ai_charge, 20, NULL},
|
||||
{ai_charge, 14, NULL},
|
||||
{ai_charge, 25, NULL},
|
||||
{ai_charge, 21, NULL},
|
||||
};
|
||||
mmove_t hknight_move_charge = {63, 78, hknight_frames_charge, hknight_run};
|
||||
|
||||
|
@ -87,23 +87,23 @@ qboolean CheckForCharge(edict_t *self)
|
|||
return false;
|
||||
if (fabs(self->s.origin[2] - self->enemy->s.origin[2]) > 20)
|
||||
return false;
|
||||
if (CheckDistance(self, self->enemy) > 320)
|
||||
if (realrange(self, self->enemy) > 320)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
// Run
|
||||
mframe_t hknight_frames_run [] =
|
||||
static mframe_t hknight_frames_run [] =
|
||||
{
|
||||
ai_run, 20, NULL,
|
||||
ai_run, 18, NULL,
|
||||
ai_run, 25, NULL,
|
||||
ai_run, 16, NULL,
|
||||
{ai_run, 20, NULL},
|
||||
{ai_run, 18, NULL},
|
||||
{ai_run, 25, NULL},
|
||||
{ai_run, 16, NULL},
|
||||
|
||||
ai_run, 14, NULL,
|
||||
ai_run, 25, NULL,
|
||||
ai_run, 21, NULL,
|
||||
ai_run, 13, NULL
|
||||
{ai_run, 14, NULL},
|
||||
{ai_run, 25, NULL},
|
||||
{ai_run, 21, NULL},
|
||||
{ai_run, 13, NULL}
|
||||
};
|
||||
mmove_t hknight_move_run = {29, 36, hknight_frames_run, NULL};
|
||||
|
||||
|
@ -116,16 +116,19 @@ void hknight_reset_magic(edict_t *self)
|
|||
{
|
||||
self->radius_dmg = -2;
|
||||
|
||||
if (self->enemy && CheckDistance(self, self->enemy) < 320 && (random() < 0.75))
|
||||
if (self->enemy && realrange(self, self->enemy) < 320 && (random() < 0.75))
|
||||
{
|
||||
self->monsterinfo.attack_finished = level.time + 1.0;
|
||||
}
|
||||
}
|
||||
|
||||
void magic_touch(edict_t *self, edict_t *other, cplane_t *plane, csurface_t *surf)
|
||||
{
|
||||
int mod;
|
||||
|
||||
if (other == self->owner)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (surf && (surf->flags & SURF_SKY))
|
||||
{
|
||||
G_FreeEdict (self);
|
||||
|
@ -153,12 +156,10 @@ void fire_magic(edict_t *self, vec3_t start, vec3_t dir, int damage, int speed)
|
|||
edict_t *magic;
|
||||
trace_t tr;
|
||||
|
||||
// decino: No enemies left, so stop shooting
|
||||
if (!self->enemy || self->enemy == self)
|
||||
if (!self)
|
||||
{
|
||||
return;
|
||||
// decino: Don't make impossible shots
|
||||
VectorCopy(SightEndtToDir(self, dir)[0], dir);
|
||||
VectorNormalize(dir);
|
||||
}
|
||||
|
||||
magic = G_Spawn();
|
||||
magic->svflags = SVF_DEADMONSTER;
|
||||
|
@ -174,7 +175,7 @@ void fire_magic(edict_t *self, vec3_t start, vec3_t dir, int damage, int speed)
|
|||
VectorClear(magic->mins);
|
||||
VectorClear(magic->maxs);
|
||||
|
||||
magic->s.modelindex = gi.modelindex ("models/proj/fireball/tris.md2");
|
||||
magic->s.modelindex = gi.modelindex("models/proj/fireball/tris.md2");
|
||||
magic->owner = self;
|
||||
magic->touch = magic_touch;
|
||||
magic->nextthink = level.time + 10;
|
||||
|
@ -191,12 +192,11 @@ void fire_magic(edict_t *self, vec3_t start, vec3_t dir, int damage, int speed)
|
|||
magic->touch(magic, tr.ent, NULL, NULL);
|
||||
}
|
||||
gi.sound(self, CHAN_WEAPON, sound_attack, 1, ATTN_NORM, 0);
|
||||
}
|
||||
}
|
||||
|
||||
void FireMagic(edict_t *self)
|
||||
{
|
||||
vec3_t dir;
|
||||
vec3_t test;
|
||||
vec3_t dir;
|
||||
|
||||
VectorSubtract(self->enemy->s.origin, self->s.origin, dir);
|
||||
dir[1] += self->radius_dmg * 60;
|
||||
|
@ -207,21 +207,21 @@ void FireMagic(edict_t *self)
|
|||
}
|
||||
|
||||
// Attack
|
||||
mframe_t hknight_frames_attack [] =
|
||||
static mframe_t hknight_frames_attack [] =
|
||||
{
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
|
||||
ai_charge, 0, hknight_reset_magic,
|
||||
ai_charge, 0, FireMagic,
|
||||
ai_charge, 0, FireMagic,
|
||||
ai_charge, 0, FireMagic,
|
||||
{ai_charge, 0, hknight_reset_magic},
|
||||
{ai_charge, 0, FireMagic},
|
||||
{ai_charge, 0, FireMagic},
|
||||
{ai_charge, 0, FireMagic},
|
||||
|
||||
ai_charge, 0, FireMagic,
|
||||
ai_charge, 0, FireMagic,
|
||||
ai_charge, 0, FireMagic
|
||||
{ai_charge, 0, FireMagic},
|
||||
{ai_charge, 0, FireMagic},
|
||||
{ai_charge, 0, FireMagic}
|
||||
};
|
||||
mmove_t hknight_move_attack = {155, 165, hknight_frames_attack, hknight_run};
|
||||
|
||||
|
@ -236,72 +236,72 @@ void hknight_attack(edict_t *self)
|
|||
}
|
||||
|
||||
// Slice
|
||||
mframe_t hknight_frames_slice [] =
|
||||
static mframe_t hknight_frames_slice [] =
|
||||
{
|
||||
ai_charge, 9, NULL,
|
||||
ai_charge, 6, NULL,
|
||||
ai_charge, 13, NULL,
|
||||
ai_charge, 4, NULL,
|
||||
{ai_charge, 9, NULL},
|
||||
{ai_charge, 6, NULL},
|
||||
{ai_charge, 13, NULL},
|
||||
{ai_charge, 4, NULL},
|
||||
|
||||
ai_charge, 7, SwingSword,
|
||||
ai_charge, 15, SwingSword,
|
||||
ai_charge, 8, SwingSword,
|
||||
ai_charge, 2, SwingSword,
|
||||
{ai_charge, 7, SwingSword},
|
||||
{ai_charge, 15, SwingSword},
|
||||
{ai_charge, 8, SwingSword},
|
||||
{ai_charge, 2, SwingSword},
|
||||
|
||||
ai_charge, 0, SwingSword,
|
||||
ai_charge, 3, NULL
|
||||
{ai_charge, 0, SwingSword},
|
||||
{ai_charge, 3, NULL}
|
||||
};
|
||||
mmove_t hknight_move_slice = {112, 121, hknight_frames_slice, hknight_run};
|
||||
|
||||
// Smash
|
||||
mframe_t hknight_frames_smash [] =
|
||||
static mframe_t hknight_frames_smash [] =
|
||||
{
|
||||
ai_charge, 1, NULL,
|
||||
ai_charge, 13, NULL,
|
||||
ai_charge, 9, NULL,
|
||||
ai_charge, 11, NULL,
|
||||
{ai_charge, 1, NULL},
|
||||
{ai_charge, 13, NULL},
|
||||
{ai_charge, 9, NULL},
|
||||
{ai_charge, 11, NULL},
|
||||
|
||||
ai_charge, 10, SwingSword,
|
||||
ai_charge, 7, SwingSword,
|
||||
ai_charge, 12, SwingSword,
|
||||
ai_charge, 2, SwingSword,
|
||||
{ai_charge, 10, SwingSword},
|
||||
{ai_charge, 7, SwingSword},
|
||||
{ai_charge, 12, SwingSword},
|
||||
{ai_charge, 2, SwingSword},
|
||||
|
||||
ai_charge, 3, SwingSword,
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL
|
||||
{ai_charge, 3, SwingSword},
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL}
|
||||
};
|
||||
mmove_t hknight_move_smash = {122, 132, hknight_frames_smash, hknight_run};
|
||||
|
||||
// Watk
|
||||
mframe_t hknight_frames_watk [] =
|
||||
static mframe_t hknight_frames_watk [] =
|
||||
{
|
||||
ai_charge, 2, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, SwingSword,
|
||||
{ai_charge, 2, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, SwingSword},
|
||||
|
||||
ai_charge, 0, SwingSword,
|
||||
ai_charge, 0, SwingSword,
|
||||
ai_charge, 1, NULL,
|
||||
ai_charge, 4, NULL,
|
||||
{ai_charge, 0, SwingSword},
|
||||
{ai_charge, 0, SwingSword},
|
||||
{ai_charge, 1, NULL},
|
||||
{ai_charge, 4, NULL},
|
||||
|
||||
ai_charge, 5, NULL,
|
||||
ai_charge, 3, SwingSword,
|
||||
ai_charge, 2, SwingSword,
|
||||
ai_charge, 2, SwingSword,
|
||||
{ai_charge, 5, NULL},
|
||||
{ai_charge, 3, SwingSword},
|
||||
{ai_charge, 2, SwingSword},
|
||||
{ai_charge, 2, SwingSword},
|
||||
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 1, NULL,
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 1, NULL},
|
||||
|
||||
ai_charge, 1, SwingSword,
|
||||
ai_charge, 3, SwingSword,
|
||||
ai_charge, 4, SwingSword,
|
||||
ai_charge, 6, NULL,
|
||||
{ai_charge, 1, SwingSword},
|
||||
{ai_charge, 3, SwingSword},
|
||||
{ai_charge, 4, SwingSword},
|
||||
{ai_charge, 6, NULL},
|
||||
|
||||
ai_charge, 7, NULL,
|
||||
ai_charge, 3, NULL,
|
||||
{ai_charge, 7, NULL},
|
||||
{ai_charge, 3, NULL},
|
||||
|
||||
};
|
||||
mmove_t hknight_move_watk = {133, 154, hknight_frames_watk, hknight_run};
|
||||
|
@ -310,7 +310,7 @@ mmove_t hknight_move_watk = {133, 154, hknight_frames_watk, hknight_run};
|
|||
void hknight_melee(edict_t *self)
|
||||
{
|
||||
self->dmg_radius++;
|
||||
|
||||
|
||||
if (self->dmg_radius == 1)
|
||||
self->monsterinfo.currentmove = &hknight_move_slice;
|
||||
else if (self->dmg_radius == 2)
|
||||
|
@ -324,21 +324,21 @@ void hknight_melee(edict_t *self)
|
|||
}
|
||||
|
||||
// Pain
|
||||
mframe_t hknight_frames_pain [] =
|
||||
static mframe_t hknight_frames_pain [] =
|
||||
{
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL
|
||||
{ai_move, 0, NULL}
|
||||
};
|
||||
mmove_t hknight_move_pain = {37, 41, hknight_frames_pain, hknight_run};
|
||||
|
||||
void hknight_pain(edict_t *self, edict_t *other, float kick, int damage)
|
||||
{
|
||||
// decino: No pain animations in Nightmare mode
|
||||
if (skill->value == 3)
|
||||
if (skill->value == SKILL_HARDPLUS)
|
||||
return;
|
||||
if (level.time < self->pain_debounce_time)
|
||||
return;
|
||||
|
@ -368,39 +368,39 @@ void hknight_dead(edict_t *self)
|
|||
}
|
||||
|
||||
// Death (1)
|
||||
mframe_t hknight_frames_die1 [] =
|
||||
static mframe_t hknight_frames_die1 [] =
|
||||
{
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 10, NULL,
|
||||
ai_move, 8, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 10, NULL},
|
||||
{ai_move, 8, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 10, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 10, NULL},
|
||||
|
||||
ai_move, 11, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL
|
||||
{ai_move, 11, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL}
|
||||
};
|
||||
mmove_t hknight_move_die1 = {42, 53, hknight_frames_die1, hknight_dead};
|
||||
|
||||
// Death (2)
|
||||
mframe_t hknight_frames_die2 [] =
|
||||
static mframe_t hknight_frames_die2 [] =
|
||||
{
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL
|
||||
{ai_move, 0, NULL}
|
||||
};
|
||||
mmove_t hknight_move_die2 = {54, 62, hknight_frames_die2, hknight_dead};
|
||||
|
||||
|
@ -434,7 +434,7 @@ void hknight_die(edict_t *self, edict_t *inflictor, edict_t *attacker, int damag
|
|||
}
|
||||
|
||||
// Sight
|
||||
void hknight_sight(edict_t *self)
|
||||
void hknight_sight(edict_t *self, edict_t *other /* unused */)
|
||||
{
|
||||
gi.sound(self, CHAN_VOICE, sound_sight, 1, ATTN_NORM, 0);
|
||||
}
|
||||
|
@ -445,23 +445,20 @@ void hknight_search(edict_t *self)
|
|||
gi.sound(self, CHAN_VOICE, sound_search, 1, ATTN_NORM, 0);
|
||||
}
|
||||
|
||||
void SP_monster_q1_hknight(edict_t *self)
|
||||
void SP_monster_hknight(edict_t *self)
|
||||
{
|
||||
self->s.modelindex = gi.modelindex("models/quake1/hknight/tris.md2");
|
||||
VectorSet (self->mins, -16, -16, -24);
|
||||
VectorSet (self->maxs, 16, 16, 40);
|
||||
self->s.modelindex = gi.modelindex("models/monsters/hknight/tris.md2");
|
||||
VectorSet(self->mins, -16, -16, -24);
|
||||
VectorSet(self->maxs, 16, 16, 40);
|
||||
self->health = 250;
|
||||
self->monster_name = "Death Knight";
|
||||
|
||||
if (self->solid == SOLID_NOT)
|
||||
return;
|
||||
sound_attack = gi.soundindex("quake1/hknight/attack1.wav");
|
||||
sound_melee = gi.soundindex("quake1/hknight/slash1.wav");
|
||||
sound_death = gi.soundindex("quake1/hknight/death1.wav");
|
||||
sound_proj_hit = gi.soundindex("quake1/hknight/hit.wav");
|
||||
sound_sight = gi.soundindex("quake1/hknight/sight1.wav");
|
||||
sound_search = gi.soundindex("quake1/hknight/idle.wav");
|
||||
sound_pain = gi.soundindex("quake1/hknight/pain1.wav");
|
||||
sound_attack = gi.soundindex("hknight/attack1.wav");
|
||||
sound_melee = gi.soundindex("hknight/slash1.wav");
|
||||
sound_death = gi.soundindex("hknight/death1.wav");
|
||||
sound_proj_hit = gi.soundindex("hknight/hit.wav");
|
||||
sound_sight = gi.soundindex("hknight/sight1.wav");
|
||||
sound_search = gi.soundindex("hknight/idle.wav");
|
||||
sound_pain = gi.soundindex("hknight/pain1.wav");
|
||||
|
||||
self->movetype = MOVETYPE_STEP;
|
||||
self->solid = SOLID_BBOX;
|
|
@ -8,7 +8,7 @@ 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.
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
|
@ -19,7 +19,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|||
*/
|
||||
// m_knight.c
|
||||
|
||||
#include "../../game/g_local.h"
|
||||
#include "../../header/local.h"
|
||||
|
||||
static int sound_death;
|
||||
static int sound_pain;
|
||||
|
@ -31,19 +31,19 @@ static int sound_melee2;
|
|||
void knight_attack(edict_t *self);
|
||||
|
||||
// Stand
|
||||
mframe_t knight_frames_stand [] =
|
||||
static mframe_t knight_frames_stand [] =
|
||||
{
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
|
||||
ai_stand, 0, NULL
|
||||
{ai_stand, 0, NULL},
|
||||
};
|
||||
mmove_t knight_move_stand = {0, 8, knight_frames_stand, NULL};
|
||||
|
||||
|
@ -53,17 +53,17 @@ void knight_stand(edict_t *self)
|
|||
}
|
||||
|
||||
// Run
|
||||
mframe_t knight_frames_run [] =
|
||||
static mframe_t knight_frames_run [] =
|
||||
{
|
||||
ai_run, 16, NULL,
|
||||
ai_run, 20, NULL,
|
||||
ai_run, 13, NULL,
|
||||
ai_run, 7, NULL,
|
||||
{ai_run, 16, NULL},
|
||||
{ai_run, 20, NULL},
|
||||
{ai_run, 13, NULL},
|
||||
{ai_run, 7, NULL},
|
||||
|
||||
ai_run, 16, NULL,
|
||||
ai_run, 20, NULL,
|
||||
ai_run, 14, NULL,
|
||||
ai_run, 6, knight_attack
|
||||
{ai_run, 16, NULL},
|
||||
{ai_run, 20, NULL},
|
||||
{ai_run, 14, NULL},
|
||||
{ai_run, 6, knight_attack}
|
||||
};
|
||||
mmove_t knight_move_run = {9, 16, knight_frames_run, NULL};
|
||||
|
||||
|
@ -75,9 +75,13 @@ void knight_run(edict_t *self)
|
|||
void knight_attack_swing(edict_t *self)
|
||||
{
|
||||
if (random() > 0.5)
|
||||
{
|
||||
gi.sound(self, CHAN_WEAPON, sound_melee1, 1, ATTN_NORM, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
gi.sound(self, CHAN_WEAPON, sound_melee2, 1, ATTN_NORM, 0);
|
||||
}
|
||||
}
|
||||
|
||||
void SwingSword(edict_t *self)
|
||||
|
@ -87,41 +91,56 @@ void SwingSword(edict_t *self)
|
|||
int damage;
|
||||
|
||||
if (!self->enemy)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
VectorSubtract(self->s.origin, self->enemy->s.origin, dir);
|
||||
|
||||
if (VectorLength(dir) > 100.0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
damage = (random() + random() + random()) * 3;
|
||||
|
||||
fire_hit(self, aim, damage, damage);
|
||||
}
|
||||
|
||||
// Attack
|
||||
mframe_t knight_frames_attack [] =
|
||||
static mframe_t knight_frames_attack [] =
|
||||
{
|
||||
ai_charge, 16, knight_attack_swing,
|
||||
ai_charge, 20, NULL,
|
||||
ai_charge, 13, NULL,
|
||||
ai_charge, 7, NULL,
|
||||
{ai_charge, 16, knight_attack_swing},
|
||||
{ai_charge, 20, NULL},
|
||||
{ai_charge, 13, NULL},
|
||||
{ai_charge, 7, NULL},
|
||||
|
||||
ai_charge, 16, SwingSword,
|
||||
ai_charge, 20, SwingSword,
|
||||
ai_charge, 14, SwingSword,
|
||||
ai_charge, 6, SwingSword,
|
||||
{ai_charge, 16, SwingSword},
|
||||
{ai_charge, 20, SwingSword},
|
||||
{ai_charge, 14, SwingSword},
|
||||
{ai_charge, 6, SwingSword},
|
||||
|
||||
ai_charge, 14, SwingSword,
|
||||
ai_charge, 10, NULL,
|
||||
ai_charge, 7, NULL
|
||||
{ai_charge, 14, SwingSword},
|
||||
{ai_charge, 10, NULL},
|
||||
{ai_charge, 7, NULL}
|
||||
};
|
||||
mmove_t knight_move_attack = {
|
||||
17,
|
||||
27,
|
||||
knight_frames_attack,
|
||||
knight_run
|
||||
};
|
||||
mmove_t knight_move_attack = {17, 27, knight_frames_attack, knight_run};
|
||||
|
||||
void knight_attack(edict_t *self)
|
||||
{
|
||||
if (self->enemy && CheckDistance(self, self->enemy) < (MELEE_DISTANCE * 4))
|
||||
if (self->enemy && realrange(self, self->enemy) < (MELEE_DISTANCE * 4))
|
||||
{
|
||||
self->monsterinfo.currentmove = &knight_move_attack;
|
||||
}
|
||||
else
|
||||
{
|
||||
self->monsterinfo.currentmove = &knight_move_run;
|
||||
}
|
||||
}
|
||||
|
||||
void knight_melee_swing(edict_t *self)
|
||||
|
@ -130,20 +149,20 @@ void knight_melee_swing(edict_t *self)
|
|||
}
|
||||
|
||||
// Melee
|
||||
mframe_t knight_frames_melee [] =
|
||||
static mframe_t knight_frames_melee [] =
|
||||
{
|
||||
ai_charge, 0, knight_melee_swing,
|
||||
ai_charge, 7, NULL,
|
||||
ai_charge, 4, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
{ai_charge, 0, knight_melee_swing},
|
||||
{ai_charge, 7, NULL},
|
||||
{ai_charge, 4, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
|
||||
ai_charge, 4, SwingSword,
|
||||
ai_charge, 4, SwingSword,
|
||||
ai_charge, 1, SwingSword,
|
||||
ai_charge, 3, NULL,
|
||||
{ai_charge, 4, SwingSword},
|
||||
{ai_charge, 4, SwingSword},
|
||||
{ai_charge, 1, SwingSword},
|
||||
{ai_charge, 3, NULL},
|
||||
|
||||
ai_charge, 1, NULL,
|
||||
ai_charge, 5, NULL
|
||||
{ai_charge, 1, NULL},
|
||||
{ai_charge, 5, NULL}
|
||||
};
|
||||
mmove_t knight_move_melee = {43, 52, knight_frames_melee, knight_run};
|
||||
|
||||
|
@ -153,37 +172,38 @@ void knight_melee(edict_t *self)
|
|||
}
|
||||
|
||||
// Pain (1)
|
||||
mframe_t knight_frames_pain1 [] =
|
||||
static mframe_t knight_frames_pain1 [] =
|
||||
{
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL}
|
||||
};
|
||||
mmove_t knight_move_pain1 = {28, 30, knight_frames_pain1, knight_run};
|
||||
|
||||
// Pain (2)
|
||||
mframe_t knight_frames_pain2 [] =
|
||||
static mframe_t knight_frames_pain2 [] =
|
||||
{
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 3, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 3, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 2, NULL,
|
||||
ai_move, 4, NULL,
|
||||
ai_move, 2, NULL,
|
||||
ai_move, 5, NULL,
|
||||
{ai_move, 2, NULL},
|
||||
{ai_move, 4, NULL},
|
||||
{ai_move, 2, NULL},
|
||||
{ai_move, 5, NULL},
|
||||
|
||||
ai_move, 5, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL
|
||||
{ai_move, 5, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL}
|
||||
};
|
||||
mmove_t knight_move_pain2 = {31, 41, knight_frames_pain2, knight_run};
|
||||
|
||||
void knight_pain(edict_t *self)
|
||||
void knight_pain(edict_t *self, edict_t *other /* unused */,
|
||||
float kick /* unused */, int damage)
|
||||
{
|
||||
// decino: No pain animations in Nightmare mode
|
||||
if (skill->value == 3)
|
||||
if (skill->value == SKILL_HARDPLUS)
|
||||
return;
|
||||
if (level.time < self->pain_debounce_time)
|
||||
return;
|
||||
|
@ -206,39 +226,39 @@ void knight_dead(edict_t *self)
|
|||
}
|
||||
|
||||
// Death (1)
|
||||
mframe_t knight_frames_die1 [] =
|
||||
static mframe_t knight_frames_die1 [] =
|
||||
{
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL}
|
||||
};
|
||||
mmove_t knight_move_die1 = {76, 85, knight_frames_die1, knight_dead};
|
||||
|
||||
// Death (2)
|
||||
mframe_t knight_frames_die2 [] =
|
||||
static mframe_t knight_frames_die2 [] =
|
||||
{
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL}
|
||||
};
|
||||
mmove_t knight_move_die2 = {86, 96, knight_frames_die2, knight_dead};
|
||||
|
||||
|
@ -278,27 +298,24 @@ void knight_search(edict_t *self)
|
|||
}
|
||||
|
||||
// Sight
|
||||
void knight_sight(edict_t *self)
|
||||
void knight_sight(edict_t *self, edict_t *other /* unused */)
|
||||
{
|
||||
gi.sound(self, CHAN_VOICE, sound_sight, 1, ATTN_NORM, 0);
|
||||
}
|
||||
|
||||
void SP_monster_q1_knight(edict_t *self)
|
||||
void SP_monster_knight(edict_t *self)
|
||||
{
|
||||
self->s.modelindex = gi.modelindex("models/quake1/knight/tris.md2");
|
||||
VectorSet (self->mins, -16, -16, -24);
|
||||
VectorSet (self->maxs, 16, 16, 40);
|
||||
self->s.modelindex = gi.modelindex("models/monsters/knight/tris.md2");
|
||||
VectorSet(self->mins, -16, -16, -24);
|
||||
VectorSet(self->maxs, 16, 16, 40);
|
||||
self->health = 75;
|
||||
self->monster_name = "Knight";
|
||||
|
||||
if (self->solid == SOLID_NOT)
|
||||
return;
|
||||
sound_melee1 = gi.soundindex("quake1/knight/sword1.wav");
|
||||
sound_melee2 = gi.soundindex("quake1/knight/sword2.wav");
|
||||
sound_death = gi.soundindex("quake1/knight/kdeath.wav");
|
||||
sound_pain = gi.soundindex("quake1/knight/khurt.wav");
|
||||
sound_sight = gi.soundindex("quake1/knight/ksight.wav");
|
||||
sound_search = gi.soundindex("quake1/knight/idle.wav");
|
||||
sound_melee1 = gi.soundindex("knight/sword1.wav");
|
||||
sound_melee2 = gi.soundindex("knight/sword2.wav");
|
||||
sound_death = gi.soundindex("knight/kdeath.wav");
|
||||
sound_pain = gi.soundindex("knight/khurt.wav");
|
||||
sound_sight = gi.soundindex("knight/ksight.wav");
|
||||
sound_search = gi.soundindex("knight/idle.wav");
|
||||
|
||||
self->movetype = MOVETYPE_STEP;
|
||||
self->solid = SOLID_BBOX;
|
|
@ -1,415 +0,0 @@
|
|||
/*
|
||||
Copyright (C) 1997-2001 Id Software, Inc.
|
||||
|
||||
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.
|
||||
|
||||
*/
|
||||
// m_shambler.c
|
||||
|
||||
#include "../../game/g_local.h"
|
||||
|
||||
static int sound_attack;
|
||||
static int sound_lightning;
|
||||
static int sound_death;
|
||||
static int sound_pain;
|
||||
static int sound_idle;
|
||||
static int sound_sight;
|
||||
static int sound_melee1;
|
||||
static int sound_melee2;
|
||||
static int sound_smack;
|
||||
|
||||
// Stand
|
||||
mframe_t shambler_frames_stand [] =
|
||||
{
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
|
||||
ai_stand, 0, NULL
|
||||
};
|
||||
mmove_t shambler_move_stand = {0, 16, shambler_frames_stand, NULL};
|
||||
|
||||
void shambler_stand(edict_t *self)
|
||||
{
|
||||
self->monsterinfo.currentmove = &shambler_move_stand;
|
||||
}
|
||||
|
||||
// Run
|
||||
mframe_t shambler_frames_run [] =
|
||||
{
|
||||
ai_run, 20, NULL,
|
||||
ai_run, 24, NULL,
|
||||
ai_run, 20, NULL,
|
||||
ai_run, 20, NULL,
|
||||
|
||||
ai_run, 24, NULL,
|
||||
ai_run, 20, NULL
|
||||
};
|
||||
mmove_t shambler_move_run = {29, 34, shambler_frames_run, NULL};
|
||||
|
||||
void shambler_run(edict_t *self)
|
||||
{
|
||||
self->monsterinfo.currentmove = &shambler_move_run;
|
||||
}
|
||||
|
||||
void CastLightning(edict_t *self)
|
||||
{
|
||||
vec3_t start, dir, end;
|
||||
trace_t tr;
|
||||
|
||||
// decino: No enemies left, so stop shooting
|
||||
if (!self->enemy || self->enemy == self)
|
||||
return;
|
||||
if (!infront(self, self->enemy))
|
||||
return;
|
||||
if (self->s.frame == 72)
|
||||
gi.sound (self, CHAN_WEAPON, sound_attack, 1, ATTN_NORM, 0);
|
||||
|
||||
// decino: Shambler has an extra lightning frame on Nightmare mode
|
||||
if (self->s.frame == 75 && skill->value < 3)
|
||||
return;
|
||||
VectorCopy(self->s.origin, start);
|
||||
VectorCopy(self->enemy->s.origin, end);
|
||||
|
||||
start[2] += 40;
|
||||
end[2] += 16;
|
||||
|
||||
VectorSubtract(end, start, dir);
|
||||
VectorNormalize(dir);
|
||||
VectorMA(start, 600, dir, end);
|
||||
|
||||
tr = gi.trace(start, NULL, NULL, end, self, (MASK_SHOT|CONTENTS_SLIME|CONTENTS_LAVA|CONTENTS_WATER));
|
||||
|
||||
if (!tr.ent)
|
||||
return;
|
||||
T_Damage(tr.ent, self, self, dir, tr.endpos, tr.plane.normal, 10, 1, 0, 0);
|
||||
|
||||
gi.WriteByte(svc_temp_entity);
|
||||
gi.WriteByte(TE_LIGHTNING);
|
||||
gi.WriteShort(tr.ent - g_edicts);
|
||||
gi.WriteShort(self - g_edicts);
|
||||
gi.WritePosition(end);
|
||||
gi.WritePosition(start);
|
||||
gi.multicast(start, MULTICAST_PVS);
|
||||
}
|
||||
|
||||
void shambler_prepare(edict_t *self)
|
||||
{
|
||||
gi.sound (self, CHAN_WEAPON, sound_lightning, 1, ATTN_NORM, 0);
|
||||
}
|
||||
|
||||
void shambler_sparks(edict_t *self)
|
||||
{
|
||||
vec3_t end;
|
||||
VectorCopy(self->s.origin, end);
|
||||
|
||||
end[2] += 80;
|
||||
|
||||
gi.WriteByte(svc_temp_entity);
|
||||
gi.WriteByte(TE_WELDING_SPARKS);
|
||||
gi.WriteByte(15);
|
||||
gi.WritePosition(end);
|
||||
gi.WriteDir(vec3_origin);
|
||||
gi.WriteByte(15);
|
||||
gi.multicast(end, MULTICAST_PVS);
|
||||
}
|
||||
|
||||
// Lightning
|
||||
mframe_t shambler_frames_lightning [] =
|
||||
{
|
||||
ai_charge, 0, shambler_prepare,
|
||||
ai_charge, 0, shambler_sparks,
|
||||
ai_charge, 0, shambler_sparks,
|
||||
ai_charge, 0, NULL,
|
||||
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, CastLightning,
|
||||
|
||||
ai_charge, 0, CastLightning,
|
||||
ai_charge, 0, CastLightning,
|
||||
ai_charge, 0, CastLightning,
|
||||
ai_charge, 0, NULL
|
||||
};
|
||||
mmove_t shambler_move_lightning = {65, 76, shambler_frames_lightning, shambler_run};
|
||||
|
||||
void shambler_lightning(edict_t *self)
|
||||
{
|
||||
self->monsterinfo.currentmove = &shambler_move_lightning;
|
||||
}
|
||||
|
||||
void shambler_prepare_smash(edict_t *self)
|
||||
{
|
||||
gi.sound(self, CHAN_VOICE, sound_melee1, 1, ATTN_NORM, 0);
|
||||
}
|
||||
|
||||
void shambler_prepare_claw(edict_t *self)
|
||||
{
|
||||
gi.sound(self, CHAN_VOICE, sound_melee2, 1, ATTN_NORM, 0);
|
||||
}
|
||||
|
||||
void ShamblerSmash(edict_t *self)
|
||||
{
|
||||
vec3_t dir;
|
||||
static vec3_t aim = {100, 0, -24};
|
||||
int damage;
|
||||
|
||||
if (!self->enemy)
|
||||
return;
|
||||
VectorSubtract(self->s.origin, self->enemy->s.origin, dir);
|
||||
|
||||
if (VectorLength(dir) > 100.0)
|
||||
return;
|
||||
damage = (random() + random() + random()) * 40;
|
||||
|
||||
if (fire_hit(self, aim, damage, damage))
|
||||
gi.sound(self, CHAN_WEAPON, sound_smack, 1, ATTN_NORM, 0);
|
||||
}
|
||||
|
||||
void ShamblerClaw(edict_t *self)
|
||||
{
|
||||
vec3_t dir;
|
||||
static vec3_t aim = {100, 0, -24};
|
||||
int damage;
|
||||
|
||||
if (!self->enemy)
|
||||
return;
|
||||
VectorSubtract(self->s.origin, self->enemy->s.origin, dir);
|
||||
|
||||
if (VectorLength(dir) > 100.0)
|
||||
return;
|
||||
damage = (random() + random() + random()) * 20;
|
||||
|
||||
if (fire_hit(self, aim, damage, damage))
|
||||
gi.sound(self, CHAN_WEAPON, sound_smack, 1, ATTN_NORM, 0);
|
||||
}
|
||||
|
||||
// Claw (right)
|
||||
mframe_t shambler_frames_clawr [] =
|
||||
{
|
||||
ai_charge, 1, shambler_prepare_smash,
|
||||
ai_charge, 8, NULL,
|
||||
ai_charge, 14, NULL,
|
||||
ai_charge, 7, NULL,
|
||||
|
||||
ai_charge, 3, NULL,
|
||||
ai_charge, 6, NULL,
|
||||
ai_charge, 6, NULL,
|
||||
ai_charge, 10, ShamblerClaw,
|
||||
|
||||
ai_charge, 3, NULL
|
||||
};
|
||||
mmove_t shambler_move_clawr = {47, 55, shambler_frames_clawr, shambler_run};
|
||||
|
||||
// Claw (left)
|
||||
mframe_t shambler_frames_clawl [] =
|
||||
{
|
||||
ai_charge, 5, shambler_prepare_claw,
|
||||
ai_charge, 3, NULL,
|
||||
ai_charge, 7, NULL,
|
||||
ai_charge, 3, NULL,
|
||||
|
||||
ai_charge, 7, NULL,
|
||||
ai_charge, 9, NULL,
|
||||
ai_charge, 5, NULL,
|
||||
ai_charge, 10, ShamblerClaw,
|
||||
|
||||
ai_charge, 4, NULL
|
||||
};
|
||||
mmove_t shambler_move_clawl = {56, 64, shambler_frames_clawl, shambler_run};
|
||||
|
||||
// Smash
|
||||
mframe_t shambler_frames_smash [] =
|
||||
{
|
||||
ai_charge, 6, shambler_prepare_smash,
|
||||
ai_charge, 6, NULL,
|
||||
ai_charge, 5, NULL,
|
||||
ai_charge, 4, NULL,
|
||||
|
||||
ai_charge, 1, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, ShamblerSmash,
|
||||
ai_charge, 0, NULL
|
||||
};
|
||||
mmove_t shambler_move_smash = {35, 46, shambler_frames_smash, shambler_run};
|
||||
|
||||
void shambler_melee(edict_t *self)
|
||||
{
|
||||
float r;
|
||||
r = random();
|
||||
|
||||
if (r > 0.6 || self->health == 600)
|
||||
self->monsterinfo.currentmove = &shambler_move_smash;
|
||||
else if (r > 0.3)
|
||||
self->monsterinfo.currentmove = &shambler_move_clawr;
|
||||
else
|
||||
self->monsterinfo.currentmove = &shambler_move_clawl;
|
||||
}
|
||||
|
||||
void shambler_search(edict_t *self)
|
||||
{
|
||||
gi.sound (self, CHAN_VOICE, sound_idle, 1, ATTN_NORM, 0);
|
||||
}
|
||||
|
||||
void shambler_sight(edict_t *self)
|
||||
{
|
||||
gi.sound (self, CHAN_VOICE, sound_sight, 1, ATTN_NORM, 0);
|
||||
}
|
||||
|
||||
// Pain
|
||||
mframe_t shambler_frames_pain [] =
|
||||
{
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL
|
||||
};
|
||||
mmove_t shambler_move_pain = {77, 82, shambler_frames_pain, shambler_run};
|
||||
|
||||
void shambler_pain(edict_t *self)
|
||||
{
|
||||
if (level.time < self->pain_debounce_time)
|
||||
return;
|
||||
self->pain_debounce_time = level.time + 3;
|
||||
gi.sound (self, CHAN_VOICE, sound_pain, 1, ATTN_NORM, 0);
|
||||
|
||||
// decino: No pain animations in Nightmare mode
|
||||
if (skill->value == 3)
|
||||
return;
|
||||
self->monsterinfo.currentmove = &shambler_move_pain;
|
||||
}
|
||||
|
||||
void shambler_dead(edict_t *self)
|
||||
{
|
||||
VectorSet(self->mins, -32, -32, -24);
|
||||
VectorSet(self->maxs, 32, 32, -8);
|
||||
self->movetype = MOVETYPE_TOSS;
|
||||
self->svflags |= SVF_DEADMONSTER;
|
||||
self->nextthink = 0;
|
||||
gi.linkentity(self);
|
||||
}
|
||||
|
||||
// Die
|
||||
mframe_t shambler_frames_death [] =
|
||||
{
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL
|
||||
};
|
||||
mmove_t shambler_move_death = {83, 93, shambler_frames_death, shambler_dead};
|
||||
|
||||
void shambler_die(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point)
|
||||
{
|
||||
int n;
|
||||
|
||||
if (self->health <= self->gib_health)
|
||||
{
|
||||
gi.sound (self, CHAN_VOICE, gi.soundindex ("misc/udeath.wav"), 1, ATTN_NORM, 0);
|
||||
|
||||
for (n= 0; n < 2; n++)
|
||||
ThrowGib (self, "models/objects/gibs/bone/tris.md2", damage, GIB_ORGANIC);
|
||||
for (n= 0; n < 4; n++)
|
||||
ThrowGib (self, "models/objects/gibs/sm_meat/tris.md2", damage, GIB_ORGANIC);
|
||||
ThrowHead (self, "models/objects/gibs/head2/tris.md2", damage, GIB_ORGANIC);
|
||||
self->deadflag = DEAD_DEAD;
|
||||
return;
|
||||
}
|
||||
if (self->deadflag == DEAD_DEAD)
|
||||
return;
|
||||
gi.sound(self, CHAN_VOICE, sound_death, 1, ATTN_NORM, 0);
|
||||
|
||||
self->deadflag = DEAD_DEAD;
|
||||
self->takedamage = DAMAGE_YES;
|
||||
self->monsterinfo.currentmove = &shambler_move_death;
|
||||
}
|
||||
|
||||
void SP_monster_q1_shambler(edict_t *self)
|
||||
{
|
||||
self->s.modelindex = gi.modelindex("models/quake1/shambler/tris.md2");
|
||||
VectorSet (self->mins, -32, -32, -24);
|
||||
VectorSet (self->maxs, 32, 32, 64);
|
||||
self->health = 600;
|
||||
self->monster_name = "Shambler";
|
||||
|
||||
if (self->solid == SOLID_NOT)
|
||||
return;
|
||||
sound_attack = gi.soundindex("quake1/shambler/sboom.wav");
|
||||
sound_lightning = gi.soundindex("quake1/shambler/sattck1.wav");
|
||||
sound_death = gi.soundindex("quake1/shambler/sdeath.wav");
|
||||
sound_pain = gi.soundindex("quake1/shambler/shurt2.wav");
|
||||
sound_idle = gi.soundindex("quake1/shambler/sidle.wav");
|
||||
sound_sight = gi.soundindex("quake1/shambler/ssight.wav");
|
||||
sound_melee1 = gi.soundindex("quake1/shambler/melee1.wav");
|
||||
sound_melee2 = gi.soundindex("quake1/shambler/melee2.wav");
|
||||
sound_smack = gi.soundindex("quake1/shambler/smack.wav");
|
||||
|
||||
self->movetype = MOVETYPE_STEP;
|
||||
self->solid = SOLID_BBOX;
|
||||
|
||||
self->gib_health = -60;
|
||||
self->mass = 600;
|
||||
|
||||
self->monsterinfo.stand = shambler_stand;
|
||||
self->monsterinfo.walk = shambler_run;
|
||||
self->monsterinfo.run = shambler_run;
|
||||
self->monsterinfo.attack = shambler_lightning;
|
||||
self->monsterinfo.sight = shambler_sight;
|
||||
self->monsterinfo.search = shambler_search;
|
||||
self->monsterinfo.melee = shambler_melee;
|
||||
|
||||
self->pain = shambler_pain;
|
||||
self->die = shambler_die;
|
||||
|
||||
self->monsterinfo.scale = 1.000000;
|
||||
gi.linkentity (self);
|
||||
|
||||
walkmonster_start(self);
|
||||
}
|
|
@ -8,7 +8,7 @@ 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.
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
|
@ -19,7 +19,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|||
*/
|
||||
// m_ogre.c
|
||||
|
||||
#include "../../game/g_local.h"
|
||||
#include "../../header/local.h"
|
||||
|
||||
static int sound_death;
|
||||
static int sound_attack;
|
||||
|
@ -36,19 +36,19 @@ void ogre_idle(edict_t *self)
|
|||
}
|
||||
|
||||
// Stand
|
||||
mframe_t ogre_frames_stand [] =
|
||||
static mframe_t ogre_frames_stand [] =
|
||||
{
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
|
||||
ai_stand, 0, ogre_idle,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
{ai_stand, 0, ogre_idle},
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
|
||||
ai_stand, 0, NULL
|
||||
{ai_stand, 0, NULL},
|
||||
};
|
||||
mmove_t ogre_move_stand = {0, 8, ogre_frames_stand, NULL};
|
||||
|
||||
|
@ -58,19 +58,24 @@ void ogre_stand(edict_t *self)
|
|||
}
|
||||
|
||||
// Run
|
||||
mframe_t ogre_frames_run [] =
|
||||
static mframe_t ogre_frames_run [] =
|
||||
{
|
||||
ai_run, 9, NULL,
|
||||
ai_run, 12, NULL,
|
||||
ai_run, 8, NULL,
|
||||
ai_run, 22, NULL,
|
||||
ai_run, 16, NULL,
|
||||
{ai_run, 9, NULL},
|
||||
{ai_run, 12, NULL},
|
||||
{ai_run, 8, NULL},
|
||||
{ai_run, 22, NULL},
|
||||
{ai_run, 16, NULL},
|
||||
|
||||
ai_run, 4, NULL,
|
||||
ai_run, 13, NULL,
|
||||
ai_run, 24, NULL
|
||||
{ai_run, 4, NULL},
|
||||
{ai_run, 13, NULL},
|
||||
{ai_run, 24, NULL}
|
||||
};
|
||||
mmove_t ogre_move_run = {
|
||||
25,
|
||||
32,
|
||||
ogre_frames_run,
|
||||
NULL
|
||||
};
|
||||
mmove_t ogre_move_run = {25, 32, ogre_frames_run, NULL};
|
||||
|
||||
void ogre_run(edict_t *self)
|
||||
{
|
||||
|
@ -95,48 +100,53 @@ void OgreChainsaw(edict_t *self)
|
|||
}
|
||||
|
||||
// Smash
|
||||
mframe_t ogre_frames_smash [] =
|
||||
static mframe_t ogre_frames_smash [] =
|
||||
{
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 1, NULL,
|
||||
ai_charge, 4, NULL,
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 1, NULL},
|
||||
{ai_charge, 4, NULL},
|
||||
|
||||
ai_charge, 14, OgreChainsaw,
|
||||
ai_charge, 14, OgreChainsaw,
|
||||
ai_charge, 20, OgreChainsaw,
|
||||
ai_charge, 23, OgreChainsaw,
|
||||
{ai_charge, 14, OgreChainsaw},
|
||||
{ai_charge, 14, OgreChainsaw},
|
||||
{ai_charge, 20, OgreChainsaw},
|
||||
{ai_charge, 23, OgreChainsaw},
|
||||
|
||||
ai_charge, 10, OgreChainsaw,
|
||||
ai_charge, 12, OgreChainsaw,
|
||||
ai_charge, 1, NULL,
|
||||
ai_charge, 4, NULL,
|
||||
{ai_charge, 10, OgreChainsaw},
|
||||
{ai_charge, 12, OgreChainsaw},
|
||||
{ai_charge, 1, NULL},
|
||||
{ai_charge, 4, NULL},
|
||||
|
||||
ai_charge, 12, NULL,
|
||||
ai_charge, 0, NULL
|
||||
{ai_charge, 12, NULL},
|
||||
{ai_charge, 0, NULL}
|
||||
};
|
||||
mmove_t ogre_move_smash = {
|
||||
47,
|
||||
60,
|
||||
ogre_frames_smash,
|
||||
ogre_run
|
||||
};
|
||||
mmove_t ogre_move_smash = {47, 60, ogre_frames_smash, ogre_run};
|
||||
|
||||
// Swing
|
||||
mframe_t ogre_frames_swing [] =
|
||||
static mframe_t ogre_frames_swing [] =
|
||||
{
|
||||
ai_charge, 11, NULL,
|
||||
ai_charge, 1, NULL,
|
||||
ai_charge, 4, NULL,
|
||||
ai_charge, 19, OgreChainsaw,
|
||||
{ai_charge, 11, NULL},
|
||||
{ai_charge, 1, NULL},
|
||||
{ai_charge, 4, NULL},
|
||||
{ai_charge, 19, OgreChainsaw},
|
||||
|
||||
ai_charge, 13, OgreChainsaw,
|
||||
ai_charge, 10, OgreChainsaw,
|
||||
ai_charge, 10, OgreChainsaw,
|
||||
ai_charge, 10, OgreChainsaw,
|
||||
{ai_charge, 13, OgreChainsaw},
|
||||
{ai_charge, 10, OgreChainsaw},
|
||||
{ai_charge, 10, OgreChainsaw},
|
||||
{ai_charge, 10, OgreChainsaw},
|
||||
|
||||
ai_charge, 10, OgreChainsaw,
|
||||
ai_charge, 10, OgreChainsaw,
|
||||
ai_charge, 3, NULL,
|
||||
ai_charge, 8, NULL,
|
||||
{ai_charge, 10, OgreChainsaw},
|
||||
{ai_charge, 10, OgreChainsaw},
|
||||
{ai_charge, 3, NULL},
|
||||
{ai_charge, 8, NULL},
|
||||
|
||||
ai_charge, 9, NULL,
|
||||
ai_charge, 0, NULL
|
||||
{ai_charge, 9, NULL},
|
||||
{ai_charge, 0, NULL}
|
||||
};
|
||||
mmove_t ogre_move_swing = {33, 46, ogre_frames_swing, ogre_run};
|
||||
|
||||
|
@ -165,15 +175,15 @@ void FireOgreGrenade(edict_t *self)
|
|||
}
|
||||
|
||||
// Grenade
|
||||
mframe_t ogre_frames_attack [] =
|
||||
static mframe_t ogre_frames_attack [] =
|
||||
{
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, FireOgreGrenade,
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, FireOgreGrenade},
|
||||
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL}
|
||||
};
|
||||
mmove_t ogre_move_attack = {61, 66, ogre_frames_attack, ogre_run};
|
||||
|
||||
|
@ -183,101 +193,107 @@ void ogre_attack(edict_t *self)
|
|||
}
|
||||
|
||||
// Pain (1)
|
||||
mframe_t ogre_frames_pain1 [] =
|
||||
static mframe_t ogre_frames_pain1 [] =
|
||||
{
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL
|
||||
{ai_move, 0, NULL}
|
||||
};
|
||||
mmove_t ogre_move_pain1 = {67, 71, ogre_frames_pain1, ogre_run};
|
||||
|
||||
// Pain (2)
|
||||
mframe_t ogre_frames_pain2 [] =
|
||||
static mframe_t ogre_frames_pain2 [] =
|
||||
{
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL}
|
||||
};
|
||||
mmove_t ogre_move_pain2 = {72, 74, ogre_frames_pain2, ogre_run};
|
||||
|
||||
// Pain (3)
|
||||
mframe_t ogre_frames_pain3 [] =
|
||||
static mframe_t ogre_frames_pain3 [] =
|
||||
{
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL}
|
||||
};
|
||||
mmove_t ogre_move_pain3 = {75, 80, ogre_frames_pain3, ogre_run};
|
||||
|
||||
// Pain (4)
|
||||
mframe_t ogre_frames_pain4 [] =
|
||||
static mframe_t ogre_frames_pain4 [] =
|
||||
{
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 10, NULL,
|
||||
ai_move, 9, NULL,
|
||||
ai_move, 4, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 10, NULL},
|
||||
{ai_move, 9, NULL},
|
||||
{ai_move, 4, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL}
|
||||
};
|
||||
mmove_t ogre_move_pain4 = {81, 96, ogre_frames_pain4, ogre_run};
|
||||
|
||||
// Pain (5)
|
||||
mframe_t ogre_frames_pain5 [] =
|
||||
static mframe_t ogre_frames_pain5 [] =
|
||||
{
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 10, NULL,
|
||||
ai_move, 9, NULL,
|
||||
ai_move, 4, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 10, NULL},
|
||||
{ai_move, 9, NULL},
|
||||
{ai_move, 4, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL}
|
||||
};
|
||||
mmove_t ogre_move_pain5 = {
|
||||
97,
|
||||
111,
|
||||
ogre_frames_pain5,
|
||||
ogre_run
|
||||
};
|
||||
mmove_t ogre_move_pain5 = {97, 111, ogre_frames_pain5, ogre_run};
|
||||
|
||||
// Pain
|
||||
void ogre_pain(edict_t *self)
|
||||
void ogre_pain(edict_t *self, edict_t *other /* unused */,
|
||||
float kick /* unused */, int damage)
|
||||
{
|
||||
float r;
|
||||
|
||||
// decino: No pain animations in Nightmare mode
|
||||
if (skill->value == 3)
|
||||
if (skill->value == SKILL_HARDPLUS)
|
||||
return;
|
||||
if (self->pain_debounce_time > level.time)
|
||||
return;
|
||||
r = random();
|
||||
gi.sound (self, CHAN_VOICE, sound_pain, 1, ATTN_NORM, 0);
|
||||
|
||||
|
||||
if (r < 0.25)
|
||||
{
|
||||
self->monsterinfo.currentmove = &ogre_move_pain1;
|
||||
|
@ -316,43 +332,43 @@ void ogre_dead(edict_t *self)
|
|||
}
|
||||
|
||||
// Death (1)
|
||||
mframe_t ogre_frames_death1 [] =
|
||||
static mframe_t ogre_frames_death1 [] =
|
||||
{
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL}
|
||||
};
|
||||
mmove_t ogre_move_death1 = {112, 125, ogre_frames_death1, ogre_dead};
|
||||
|
||||
// Death (2)
|
||||
mframe_t ogre_frames_death2 [] =
|
||||
static mframe_t ogre_frames_death2 [] =
|
||||
{
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 5, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 1, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 5, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 1, NULL},
|
||||
|
||||
ai_move, 3, NULL,
|
||||
ai_move, 7, NULL,
|
||||
ai_move, 25, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 3, NULL},
|
||||
{ai_move, 7, NULL},
|
||||
{ai_move, 25, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL}
|
||||
};
|
||||
mmove_t ogre_move_death2 = {126, 135, ogre_frames_death2, ogre_dead};
|
||||
|
||||
|
@ -387,7 +403,7 @@ void ogre_die(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage,
|
|||
}
|
||||
|
||||
// Sight
|
||||
void ogre_sight(edict_t *self)
|
||||
void ogre_sight(edict_t *self, edict_t *other /* unused */)
|
||||
{
|
||||
gi.sound(self, CHAN_VOICE, sound_sight, 1, ATTN_NORM, 0);
|
||||
}
|
||||
|
@ -398,23 +414,20 @@ void ogre_search(edict_t *self)
|
|||
gi.sound(self, CHAN_VOICE, sound_search, 1, ATTN_NORM, 0);
|
||||
}
|
||||
|
||||
void SP_monster_q1_ogre(edict_t *self)
|
||||
void SP_monster_ogre(edict_t *self)
|
||||
{
|
||||
self->s.modelindex = gi.modelindex("models/quake1/ogre/tris.md2");
|
||||
VectorSet (self->mins, -32, -32, -24);
|
||||
VectorSet (self->maxs, 32, 32, 64);
|
||||
self->s.modelindex = gi.modelindex("models/monsters/ogre/tris.md2");
|
||||
VectorSet(self->mins, -32, -32, -24);
|
||||
VectorSet(self->maxs, 32, 32, 64);
|
||||
self->health = 200;
|
||||
self->monster_name = "Ogre";
|
||||
|
||||
if (self->solid == SOLID_NOT)
|
||||
return;
|
||||
sound_death = gi.soundindex("quake1/ogre/ogdth.wav");
|
||||
sound_attack = gi.soundindex("quake1/ogre/grenade.wav");
|
||||
sound_melee = gi.soundindex("quake1/ogre/ogsawatk.wav");
|
||||
sound_sight = gi.soundindex("quake1/ogre/ogwake.wav");
|
||||
sound_search = gi.soundindex("quake1/ogre/ogidle2.wav");
|
||||
sound_idle = gi.soundindex("quake1/ogre/ogidle.wav");
|
||||
sound_pain = gi.soundindex("quake1/ogre/ogpain1.wav");
|
||||
sound_death = gi.soundindex("ogre/ogdth.wav");
|
||||
sound_attack = gi.soundindex("ogre/grenade.wav");
|
||||
sound_melee = gi.soundindex("ogre/ogsawatk.wav");
|
||||
sound_sight = gi.soundindex("ogre/ogwake.wav");
|
||||
sound_search = gi.soundindex("ogre/ogidle2.wav");
|
||||
sound_idle = gi.soundindex("ogre/ogidle.wav");
|
||||
sound_pain = gi.soundindex("ogre/ogpain1.wav");
|
||||
|
||||
self->movetype = MOVETYPE_STEP;
|
||||
self->solid = SOLID_BBOX;
|
|
@ -8,7 +8,7 @@ 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.
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
|
@ -19,7 +19,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|||
*/
|
||||
// m_shalrath.c
|
||||
|
||||
#include "../../game/g_local.h"
|
||||
#include "../../header/local.h"
|
||||
|
||||
static int sound_death;
|
||||
static int sound_search;
|
||||
|
@ -29,9 +29,9 @@ static int sound_fire;
|
|||
static int sound_sight;
|
||||
|
||||
// Stand
|
||||
mframe_t shalrath_frames_stand [] =
|
||||
static mframe_t shalrath_frames_stand [] =
|
||||
{
|
||||
ai_stand, 0, NULL
|
||||
{ai_stand, 0, NULL},
|
||||
};
|
||||
mmove_t shalrath_move_stand = {0, 0, shalrath_frames_stand, NULL};
|
||||
|
||||
|
@ -41,22 +41,22 @@ void shalrath_stand(edict_t *self)
|
|||
}
|
||||
|
||||
// Run
|
||||
mframe_t shalrath_frames_run [] =
|
||||
static mframe_t shalrath_frames_run [] =
|
||||
{
|
||||
ai_run, 6, NULL,
|
||||
ai_run, 4, NULL,
|
||||
ai_run, 0, NULL,
|
||||
ai_run, 0, NULL,
|
||||
{ai_run, 6, NULL},
|
||||
{ai_run, 4, NULL},
|
||||
{ai_run, 0, NULL},
|
||||
{ai_run, 0, NULL},
|
||||
|
||||
ai_run, 0, NULL,
|
||||
ai_run, 0, NULL,
|
||||
ai_run, 5, NULL,
|
||||
ai_run, 6, NULL,
|
||||
{ai_run, 0, NULL},
|
||||
{ai_run, 0, NULL},
|
||||
{ai_run, 5, NULL},
|
||||
{ai_run, 6, NULL},
|
||||
|
||||
ai_run, 5, NULL,
|
||||
ai_run, 0, NULL,
|
||||
ai_run, 4, NULL,
|
||||
ai_run, 5, NULL
|
||||
{ai_run, 5, NULL},
|
||||
{ai_run, 0, NULL},
|
||||
{ai_run, 4, NULL},
|
||||
{ai_run, 5, NULL}
|
||||
};
|
||||
mmove_t shalrath_move_run = {23, 34, shalrath_frames_run, NULL};
|
||||
|
||||
|
@ -74,7 +74,7 @@ void shalrath_pod_touch(edict_t *self, edict_t *other, cplane_t *plane, csurface
|
|||
{
|
||||
if (other == self->owner)
|
||||
return;
|
||||
if (strcmp(other->classname, "monster_q1_zombie") == 0) // decino: According to shalrath.qc
|
||||
if (strcmp(other->classname, "monster_zombie") == 0) // decino: According to shalrath.qc
|
||||
T_Damage(other, self, self, vec3_origin, other->s.origin, vec3_origin, 110, 0, 0, 0);
|
||||
T_RadiusDamage(self, self->owner, self->dmg, NULL, self->dmg + 40, 0);
|
||||
|
||||
|
@ -102,7 +102,7 @@ void shalrath_pod_home(edict_t *self)
|
|||
{
|
||||
G_FreeEdict(self);
|
||||
return;
|
||||
}*/
|
||||
}*/
|
||||
}
|
||||
if (self->owner->enemy)
|
||||
{
|
||||
|
@ -111,7 +111,7 @@ void shalrath_pod_home(edict_t *self)
|
|||
end[2] += self->enemy->viewheight;
|
||||
VectorSubtract(end, self->s.origin, dir);
|
||||
VectorNormalize(dir);
|
||||
VectorScale(dir, (skill->value >= 3) ? 350 : 250, self->velocity);
|
||||
VectorScale(dir, (skill->value >= SKILL_HARDPLUS) ? 350 : 250, self->velocity);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -133,12 +133,10 @@ void fire_shalrath_pod(edict_t *self, vec3_t start, vec3_t dir, int damage, int
|
|||
{
|
||||
edict_t *pod;
|
||||
|
||||
// decino: No enemies left, so stop shooting
|
||||
if (!self->enemy || self->enemy == self)
|
||||
if (!self)
|
||||
{
|
||||
return;
|
||||
// decino: Don't make impossible shots
|
||||
VectorCopy(SightEndtToDir(self, dir)[0], dir);
|
||||
VectorNormalize(dir);
|
||||
}
|
||||
|
||||
pod = G_Spawn();
|
||||
VectorCopy(start, pod->s.origin);
|
||||
|
@ -185,21 +183,21 @@ void FireShalrathPod(edict_t *self)
|
|||
}
|
||||
|
||||
// Attack
|
||||
mframe_t shalrath_frames_attack [] =
|
||||
static mframe_t shalrath_frames_attack [] =
|
||||
{
|
||||
ai_charge, 0, shalrath_roar,
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
{ai_charge, 0, shalrath_roar},
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
|
||||
ai_charge, 0, FireShalrathPod,
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL
|
||||
{ai_charge, 0, FireShalrathPod},
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL}
|
||||
};
|
||||
mmove_t shalrath_move_attack = {0, 10, shalrath_frames_attack, shalrath_run};
|
||||
|
||||
|
@ -209,21 +207,22 @@ void shalrath_attack(edict_t *self)
|
|||
}
|
||||
|
||||
// Pain
|
||||
mframe_t shalrath_frames_pain [] =
|
||||
static mframe_t shalrath_frames_pain [] =
|
||||
{
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL
|
||||
{ai_move, 0, NULL}
|
||||
};
|
||||
mmove_t shalrath_move_pain = {11, 15, shalrath_frames_pain, shalrath_run};
|
||||
|
||||
void shalrath_pain(edict_t *self)
|
||||
void shalrath_pain(edict_t *self, edict_t *other /* unused */,
|
||||
float kick /* unused */, int damage)
|
||||
{
|
||||
// decino: No pain animations in Nightmare mode
|
||||
if (skill->value == 3)
|
||||
if (skill->value == SKILL_HARDPLUS)
|
||||
return;
|
||||
if (level.time < self->pain_debounce_time)
|
||||
return;
|
||||
|
@ -244,16 +243,16 @@ void shalrath_dead(edict_t *self)
|
|||
}
|
||||
|
||||
// Death
|
||||
mframe_t shalrath_frames_death [] =
|
||||
static mframe_t shalrath_frames_death [] =
|
||||
{
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL}
|
||||
};
|
||||
mmove_t shalrath_move_death = {16, 22, shalrath_frames_death, shalrath_dead};
|
||||
|
||||
|
@ -283,7 +282,7 @@ void shalrath_die(edict_t *self, edict_t *inflictor, edict_t *attacker, int dama
|
|||
}
|
||||
|
||||
// Sight
|
||||
void shalrath_sight(edict_t *self)
|
||||
void shalrath_sight(edict_t *self, edict_t *other /* unused */)
|
||||
{
|
||||
gi.sound(self, CHAN_VOICE, sound_sight, 1, ATTN_NORM, 0);
|
||||
}
|
||||
|
@ -294,22 +293,19 @@ void shalrath_search(edict_t *self)
|
|||
gi.sound(self, CHAN_VOICE, sound_search, 1, ATTN_NORM, 0);
|
||||
}
|
||||
|
||||
void SP_monster_q1_shalrath(edict_t *self)
|
||||
void SP_monster_shalrath(edict_t *self)
|
||||
{
|
||||
self->s.modelindex = gi.modelindex("models/quake1/shalrath/tris.md2");
|
||||
VectorSet (self->mins, -32, -32, -24);
|
||||
VectorSet (self->maxs, 32, 32, 48);
|
||||
self->s.modelindex = gi.modelindex("models/monsters/shalrath/tris.md2");
|
||||
VectorSet(self->mins, -32, -32, -24);
|
||||
VectorSet(self->maxs, 32, 32, 48);
|
||||
self->health = 400;
|
||||
self->monster_name = "Vore";
|
||||
|
||||
if (self->solid == SOLID_NOT)
|
||||
return;
|
||||
sound_death = gi.soundindex("quake1/shalrath/death.wav");
|
||||
sound_search = gi.soundindex("quake1/shalrath/idle.wav");
|
||||
sound_pain = gi.soundindex("quake1/shalrath/pain.wav");
|
||||
sound_attack = gi.soundindex("quake1/shalrath/attack.wav");
|
||||
sound_fire = gi.soundindex("quake1/shalrath/attack2.wav");
|
||||
sound_sight = gi.soundindex("quake1/shalrath/sight.wav");
|
||||
sound_death = gi.soundindex("shalrath/death.wav");
|
||||
sound_search = gi.soundindex("shalrath/idle.wav");
|
||||
sound_pain = gi.soundindex("shalrath/pain.wav");
|
||||
sound_attack = gi.soundindex("shalrath/attack.wav");
|
||||
sound_fire = gi.soundindex("shalrath/attack2.wav");
|
||||
sound_sight = gi.soundindex("shalrath/sight.wav");
|
||||
|
||||
self->movetype = MOVETYPE_STEP;
|
||||
self->solid = SOLID_BBOX;
|
|
@ -8,7 +8,7 @@ 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.
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
|
@ -19,7 +19,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|||
*/
|
||||
// m_tarbaby.c
|
||||
|
||||
#include "../../game/g_local.h"
|
||||
#include "../../header/local.h"
|
||||
|
||||
static int sound_death;
|
||||
static int sound_hit;
|
||||
|
@ -34,9 +34,9 @@ void tarbaby_unbounce(edict_t *self)
|
|||
}
|
||||
|
||||
// Stand
|
||||
mframe_t tarbaby_frames_stand [] =
|
||||
static mframe_t tarbaby_frames_stand [] =
|
||||
{
|
||||
ai_stand, 0, tarbaby_unbounce
|
||||
{ai_stand, 0, tarbaby_unbounce}
|
||||
};
|
||||
mmove_t tarbaby_move_stand = {0, 0, tarbaby_frames_stand, NULL};
|
||||
|
||||
|
@ -46,39 +46,39 @@ void tarbaby_stand(edict_t *self)
|
|||
}
|
||||
|
||||
// Run
|
||||
mframe_t tarbaby_frames_run [] =
|
||||
static mframe_t tarbaby_frames_run [] =
|
||||
{
|
||||
ai_run, 0, NULL,
|
||||
ai_run, 0, NULL,
|
||||
ai_run, 0, NULL,
|
||||
ai_run, 0, NULL,
|
||||
{ai_run, 0, NULL},
|
||||
{ai_run, 0, NULL},
|
||||
{ai_run, 0, NULL},
|
||||
{ai_run, 0, NULL},
|
||||
|
||||
ai_run, 0, NULL,
|
||||
ai_run, 0, NULL,
|
||||
ai_run, 0, NULL,
|
||||
ai_run, 0, NULL,
|
||||
{ai_run, 0, NULL},
|
||||
{ai_run, 0, NULL},
|
||||
{ai_run, 0, NULL},
|
||||
{ai_run, 0, NULL},
|
||||
|
||||
ai_run, 0, NULL,
|
||||
ai_run, 0, NULL,
|
||||
ai_run, 2, NULL,
|
||||
ai_run, 2, NULL,
|
||||
{ai_run, 0, NULL},
|
||||
{ai_run, 0, NULL},
|
||||
{ai_run, 2, NULL},
|
||||
{ai_run, 2, NULL},
|
||||
|
||||
ai_run, 2, NULL,
|
||||
ai_run, 2, NULL,
|
||||
ai_run, 2, NULL,
|
||||
ai_run, 2, NULL,
|
||||
{ai_run, 2, NULL},
|
||||
{ai_run, 2, NULL},
|
||||
{ai_run, 2, NULL},
|
||||
{ai_run, 2, NULL},
|
||||
|
||||
ai_run, 2, NULL,
|
||||
ai_run, 2, NULL,
|
||||
ai_run, 2, NULL,
|
||||
ai_run, 2, NULL,
|
||||
{ai_run, 2, NULL},
|
||||
{ai_run, 2, NULL},
|
||||
{ai_run, 2, NULL},
|
||||
{ai_run, 2, NULL},
|
||||
|
||||
ai_run, 2, NULL,
|
||||
ai_run, 2, NULL,
|
||||
ai_run, 2, NULL,
|
||||
ai_run, 2, NULL,
|
||||
{ai_run, 2, NULL},
|
||||
{ai_run, 2, NULL},
|
||||
{ai_run, 2, NULL},
|
||||
{ai_run, 2, NULL},
|
||||
|
||||
ai_run, 2, NULL
|
||||
{ai_run, 2, NULL}
|
||||
};
|
||||
mmove_t tarbaby_move_run = {25, 49, tarbaby_frames_run, NULL};
|
||||
|
||||
|
@ -88,14 +88,14 @@ void tarbaby_run(edict_t *self)
|
|||
}
|
||||
|
||||
// Sight
|
||||
void tarbaby_sight(edict_t *self)
|
||||
void tarbaby_sight(edict_t *self, edict_t *other /* unused */)
|
||||
{
|
||||
gi.sound(self, CHAN_VOICE, sound_sight, 1, ATTN_NORM, 0);
|
||||
}
|
||||
|
||||
void tarbaby_touch(edict_t *self, edict_t *other, cplane_t *plane, csurface_t *surf)
|
||||
{
|
||||
if (other->takedamage && other->monster_team != self->monster_team)
|
||||
if (other->takedamage)
|
||||
{
|
||||
if (VectorLength(self->velocity) > 400)
|
||||
{
|
||||
|
@ -135,12 +135,12 @@ void TarBabyJump(edict_t *self)
|
|||
}
|
||||
|
||||
// Fly
|
||||
mframe_t tarbaby_frames_fly [] =
|
||||
static mframe_t tarbaby_frames_fly [] =
|
||||
{
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL}
|
||||
};
|
||||
mmove_t tarbaby_move_fly = {56, 59, tarbaby_frames_fly, tarbaby_rejump};
|
||||
|
||||
|
@ -150,15 +150,15 @@ void tarbaby_fly(edict_t *self)
|
|||
}
|
||||
|
||||
// Jump
|
||||
mframe_t tarbaby_frames_jump [] =
|
||||
static mframe_t tarbaby_frames_jump [] =
|
||||
{
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
|
||||
ai_charge, 0, TarBabyJump,
|
||||
ai_charge, 0, NULL
|
||||
{ai_charge, 0, TarBabyJump},
|
||||
{ai_charge, 0, NULL}
|
||||
};
|
||||
mmove_t tarbaby_move_jump = {50, 55, tarbaby_frames_jump, tarbaby_fly};
|
||||
|
||||
|
@ -193,7 +193,9 @@ void tarbaby_explode(edict_t *self)
|
|||
}
|
||||
|
||||
// Death
|
||||
void tarbaby_die(edict_t *self)
|
||||
void tarbaby_die(edict_t *self, edict_t *inflictor /* unused */,
|
||||
edict_t *attacker /* unused */, int damage,
|
||||
vec3_t point /* unused */)
|
||||
{
|
||||
if (self->deadflag == DEAD_DEAD)
|
||||
return;
|
||||
|
@ -204,26 +206,24 @@ void tarbaby_die(edict_t *self)
|
|||
}
|
||||
|
||||
// Pain
|
||||
void tarbaby_pain(edict_t *self)
|
||||
void tarbaby_pain(edict_t *self, edict_t *other /* unused */,
|
||||
float kick /* unused */, int damage)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
void SP_monster_q1_tarbaby(edict_t *self)
|
||||
void SP_monster_tarbaby(edict_t *self)
|
||||
{
|
||||
self->s.modelindex = gi.modelindex("models/quake1/tarbaby/tris.md2");
|
||||
VectorSet (self->mins, -16, -16, -24);
|
||||
VectorSet (self->maxs, 16, 16, 40);
|
||||
self->s.modelindex = gi.modelindex("models/monsters/tarbaby/tris.md2");
|
||||
VectorSet(self->mins, -16, -16, -24);
|
||||
VectorSet(self->maxs, 16, 16, 40);
|
||||
self->health = 80;
|
||||
self->monster_name = "Spawn";
|
||||
|
||||
if (self->solid == SOLID_NOT)
|
||||
return;
|
||||
sound_death = gi.soundindex("quake1/tarbaby/death1.wav");
|
||||
sound_hit = gi.soundindex("quake1/tarbaby/hit1.wav");
|
||||
sound_land = gi.soundindex("quake1/tarbaby/land1.wav");
|
||||
sound_sight = gi.soundindex("quake1/tarbaby/sight1.wav");
|
||||
sound_death = gi.soundindex("tarbaby/death1.wav");
|
||||
sound_hit = gi.soundindex("tarbaby/hit1.wav");
|
||||
sound_land = gi.soundindex("tarbaby/land1.wav");
|
||||
sound_sight = gi.soundindex("tarbaby/sight1.wav");
|
||||
|
||||
self->movetype = MOVETYPE_STEP;
|
||||
self->solid = SOLID_BBOX;
|
|
@ -8,7 +8,7 @@ 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.
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
|
@ -19,7 +19,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|||
*/
|
||||
// m_wizard.c
|
||||
|
||||
#include "../../game/g_local.h"
|
||||
#include "../../header/local.h"
|
||||
|
||||
static int sound_proj_hit;
|
||||
static int sound_attack;
|
||||
|
@ -30,26 +30,26 @@ static int sound_pain;
|
|||
static int sound_sight;
|
||||
|
||||
// Stand
|
||||
mframe_t wizard_frames_stand [] =
|
||||
static mframe_t wizard_frames_stand [] =
|
||||
{
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
};
|
||||
mmove_t wizard_move_stand = {0, 14, wizard_frames_stand, NULL};
|
||||
|
||||
|
@ -59,28 +59,33 @@ void wizard_stand(edict_t *self)
|
|||
}
|
||||
|
||||
// Run
|
||||
mframe_t wizard_frames_run [] =
|
||||
static mframe_t wizard_frames_run [] =
|
||||
{
|
||||
ai_run, 16, NULL,
|
||||
ai_run, 16, NULL,
|
||||
ai_run, 16, NULL,
|
||||
ai_run, 16, NULL,
|
||||
{ai_run, 16, NULL},
|
||||
{ai_run, 16, NULL},
|
||||
{ai_run, 16, NULL},
|
||||
{ai_run, 16, NULL},
|
||||
|
||||
ai_run, 16, NULL,
|
||||
ai_run, 16, NULL,
|
||||
ai_run, 16, NULL,
|
||||
ai_run, 16, NULL,
|
||||
{ai_run, 16, NULL},
|
||||
{ai_run, 16, NULL},
|
||||
{ai_run, 16, NULL},
|
||||
{ai_run, 16, NULL},
|
||||
|
||||
ai_run, 16, NULL,
|
||||
ai_run, 16, NULL,
|
||||
ai_run, 16, NULL,
|
||||
ai_run, 16, NULL,
|
||||
{ai_run, 16, NULL},
|
||||
{ai_run, 16, NULL},
|
||||
{ai_run, 16, NULL},
|
||||
{ai_run, 16, NULL},
|
||||
|
||||
ai_run, 16, NULL,
|
||||
ai_run, 16, NULL,
|
||||
ai_run, 16, NULL
|
||||
{ai_run, 16, NULL},
|
||||
{ai_run, 16, NULL},
|
||||
{ai_run, 16, NULL}
|
||||
};
|
||||
mmove_t wizard_move_run = {
|
||||
15,
|
||||
28,
|
||||
wizard_frames_run,
|
||||
NULL
|
||||
};
|
||||
mmove_t wizard_move_run = {15, 28, wizard_frames_run, NULL};
|
||||
|
||||
void wizard_run(edict_t *self)
|
||||
{
|
||||
|
@ -95,18 +100,20 @@ void wizard_frame(edict_t *self)
|
|||
frame++;
|
||||
|
||||
if (frame > 5)
|
||||
{
|
||||
frame = 0;
|
||||
}
|
||||
}
|
||||
|
||||
// decino: Quake plays this animation backwards, so we'll have to do some hacking
|
||||
mframe_t wizard_frames_finish [] =
|
||||
static mframe_t wizard_frames_finish [] =
|
||||
{
|
||||
ai_charge, 0, wizard_frame,
|
||||
ai_charge, 0, wizard_frame,
|
||||
ai_charge, 0, wizard_frame,
|
||||
ai_charge, 0, wizard_frame,
|
||||
{ai_charge, 0, wizard_frame},
|
||||
{ai_charge, 0, wizard_frame},
|
||||
{ai_charge, 0, wizard_frame},
|
||||
{ai_charge, 0, wizard_frame},
|
||||
|
||||
ai_charge, 0, wizard_frame
|
||||
{ai_charge, 0, wizard_frame}
|
||||
};
|
||||
mmove_t wizard_move_finish = {29, 33, wizard_frames_finish, wizard_run};
|
||||
|
||||
|
@ -117,10 +124,11 @@ void wizard_finish_attack(edict_t *self)
|
|||
|
||||
void spit_touch(edict_t *self, edict_t *other, cplane_t *plane, csurface_t *surf)
|
||||
{
|
||||
int mod;
|
||||
|
||||
if (other == self->owner)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (surf && (surf->flags & SURF_SKY))
|
||||
{
|
||||
G_FreeEdict (self);
|
||||
|
@ -148,12 +156,10 @@ void fire_spit(edict_t *self, vec3_t start, vec3_t dir, int damage, int speed)
|
|||
edict_t *spit;
|
||||
trace_t tr;
|
||||
|
||||
// decino: No enemies left, so stop shooting
|
||||
if (!self->enemy || self->enemy == self)
|
||||
if (!self)
|
||||
{
|
||||
return;
|
||||
// decino: Don't make impossible shots
|
||||
VectorCopy(SightEndtToDir(self, dir)[0], dir);
|
||||
VectorNormalize (dir);
|
||||
}
|
||||
|
||||
spit = G_Spawn();
|
||||
spit->svflags = SVF_DEADMONSTER;
|
||||
|
@ -169,7 +175,7 @@ void fire_spit(edict_t *self, vec3_t start, vec3_t dir, int damage, int speed)
|
|||
VectorClear(spit->mins);
|
||||
VectorClear(spit->maxs);
|
||||
|
||||
spit->s.modelindex = gi.modelindex ("models/proj/spit/tris.md2");
|
||||
spit->s.modelindex = gi.modelindex("models/proj/spit/tris.md2");
|
||||
spit->owner = self;
|
||||
spit->touch = spit_touch;
|
||||
spit->nextthink = level.time + 2;
|
||||
|
@ -185,7 +191,7 @@ void fire_spit(edict_t *self, vec3_t start, vec3_t dir, int damage, int speed)
|
|||
VectorMA(spit->s.origin, -10, dir, spit->s.origin);
|
||||
spit->touch(spit, tr.ent, NULL, NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void WizardSpit(edict_t *self)
|
||||
{
|
||||
|
@ -212,15 +218,15 @@ void wizard_prespit(edict_t *self)
|
|||
}
|
||||
|
||||
// Attack
|
||||
mframe_t wizard_frames_attack [] =
|
||||
static mframe_t wizard_frames_attack [] =
|
||||
{
|
||||
ai_charge, 0, wizard_prespit,
|
||||
ai_charge, 0, WizardSpit,
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
{ai_charge, 0, wizard_prespit},
|
||||
{ai_charge, 0, WizardSpit},
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
|
||||
ai_charge, 0, WizardSpit,
|
||||
ai_charge, 0, NULL
|
||||
{ai_charge, 0, WizardSpit},
|
||||
{ai_charge, 0, NULL}
|
||||
};
|
||||
mmove_t wizard_move_attack = {29, 34, wizard_frames_attack, wizard_finish_attack};
|
||||
|
||||
|
@ -230,16 +236,17 @@ void wizard_attack(edict_t *self)
|
|||
}
|
||||
|
||||
// Pain
|
||||
mframe_t wizard_frames_pain [] =
|
||||
static mframe_t wizard_frames_pain [] =
|
||||
{
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL}
|
||||
};
|
||||
mmove_t wizard_move_pain = {42, 45, wizard_frames_pain, wizard_run};
|
||||
|
||||
void wizard_pain(edict_t *self)
|
||||
void wizard_pain(edict_t *self, edict_t *other /* unused */,
|
||||
float kick /* unused */, int damage)
|
||||
{
|
||||
if (level.time < self->pain_debounce_time)
|
||||
return;
|
||||
|
@ -247,7 +254,7 @@ void wizard_pain(edict_t *self)
|
|||
gi.sound (self, CHAN_VOICE, sound_pain, 1, ATTN_NORM, 0);
|
||||
|
||||
// decino: No pain animations in Nightmare mode
|
||||
if (skill->value == 3)
|
||||
if (skill->value == SKILL_HARDPLUS)
|
||||
return;
|
||||
self->monsterinfo.currentmove = &wizard_move_pain;
|
||||
}
|
||||
|
@ -272,17 +279,17 @@ void wizard_dead(edict_t *self)
|
|||
}
|
||||
|
||||
// Death
|
||||
mframe_t wizard_frames_death [] =
|
||||
static mframe_t wizard_frames_death [] =
|
||||
{
|
||||
ai_move, 0, wizard_fling,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, wizard_fling},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL}
|
||||
};
|
||||
mmove_t wizard_move_death = {46, 53, wizard_frames_death, wizard_dead};
|
||||
|
||||
|
@ -311,7 +318,7 @@ void wizard_die(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage
|
|||
self->monsterinfo.currentmove = &wizard_move_death;
|
||||
}
|
||||
|
||||
void wizard_sight(edict_t *self)
|
||||
void wizard_sight(edict_t *self, edict_t *other /* unused */)
|
||||
{
|
||||
gi.sound(self, CHAN_VOICE, sound_sight, 1, ATTN_NORM, 0);
|
||||
}
|
||||
|
@ -327,23 +334,20 @@ void wizard_search(edict_t *self)
|
|||
gi.sound(self, CHAN_VOICE, sound_idle2, 1, ATTN_NORM, 0);
|
||||
}
|
||||
|
||||
void SP_monster_q1_wizard(edict_t *self)
|
||||
void SP_monster_wizard(edict_t *self)
|
||||
{
|
||||
self->s.modelindex = gi.modelindex("models/quake1/wizard/tris.md2");
|
||||
VectorSet (self->mins, -16, -16, -24);
|
||||
VectorSet (self->maxs, 16, 16, 40);
|
||||
self->s.modelindex = gi.modelindex("models/monsters/wizard/tris.md2");
|
||||
VectorSet(self->mins, -16, -16, -24);
|
||||
VectorSet(self->maxs, 16, 16, 40);
|
||||
self->health = 80;
|
||||
self->monster_name = "Scrag";
|
||||
|
||||
if (self->solid == SOLID_NOT)
|
||||
return;
|
||||
sound_proj_hit = gi.soundindex("quake1/wizard/hit.wav");
|
||||
sound_attack = gi.soundindex("quake1/wizard/wattack.wav");
|
||||
sound_death = gi.soundindex("quake1/wizard/wdeath.wav");
|
||||
sound_idle1 = gi.soundindex("quake1/wizard/widle1.wav");
|
||||
sound_idle2 = gi.soundindex("quake1/wizard/widle2.wav");
|
||||
sound_pain = gi.soundindex("quake1/wizard/wpain.wav");
|
||||
sound_sight = gi.soundindex("quake1/wizard/wsight.wav");
|
||||
sound_proj_hit = gi.soundindex("wizard/hit.wav");
|
||||
sound_attack = gi.soundindex("wizard/wattack.wav");
|
||||
sound_death = gi.soundindex("wizard/wdeath.wav");
|
||||
sound_idle1 = gi.soundindex("wizard/widle1.wav");
|
||||
sound_idle2 = gi.soundindex("wizard/widle2.wav");
|
||||
sound_pain = gi.soundindex("wizard/wpain.wav");
|
||||
sound_sight = gi.soundindex("wizard/wsight.wav");
|
||||
|
||||
self->movetype = MOVETYPE_STEP;
|
||||
self->solid = SOLID_BBOX;
|
|
@ -8,7 +8,7 @@ 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.
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
|
@ -19,7 +19,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|||
*/
|
||||
// m_zombie.c
|
||||
|
||||
#include "../../game/g_local.h"
|
||||
#include "../../header/local.h"
|
||||
|
||||
static int sound_sight;
|
||||
static int sound_search;
|
||||
|
@ -34,66 +34,72 @@ void zombie_down(edict_t *self);
|
|||
void zombie_get_up_attempt(edict_t *self);
|
||||
|
||||
// Stand
|
||||
mframe_t zombie_frames_stand [] =
|
||||
static mframe_t zombie_frames_stand [] =
|
||||
{
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL,
|
||||
ai_stand, 0, NULL
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
{ai_stand, 0, NULL},
|
||||
};
|
||||
mmove_t zombie_move_stand = {
|
||||
0,
|
||||
14,
|
||||
zombie_frames_stand,
|
||||
NULL
|
||||
};
|
||||
mmove_t zombie_move_stand = {0, 14, zombie_frames_stand, NULL};
|
||||
|
||||
void zombie_stand(edict_t *self)
|
||||
{
|
||||
self->monsterinfo.currentmove = &zombie_move_stand;
|
||||
}
|
||||
|
||||
void zombie_reset_state(edict_t *self)
|
||||
{
|
||||
self->zombie_state = 0;
|
||||
}
|
||||
|
||||
// Run
|
||||
mframe_t zombie_frames_run [] =
|
||||
static mframe_t zombie_frames_run[] =
|
||||
{
|
||||
ai_run, 1, zombie_reset_state,
|
||||
ai_run, 1, NULL,
|
||||
ai_run, 0, NULL,
|
||||
ai_run, 1, NULL,
|
||||
{ai_run, 1, NULL},
|
||||
{ai_run, 1, NULL},
|
||||
{ai_run, 0, NULL},
|
||||
{ai_run, 1, NULL},
|
||||
|
||||
ai_run, 2, NULL,
|
||||
ai_run, 3, NULL,
|
||||
ai_run, 4, NULL,
|
||||
ai_run, 4, NULL,
|
||||
{ai_run, 2, NULL},
|
||||
{ai_run, 3, NULL},
|
||||
{ai_run, 4, NULL},
|
||||
{ai_run, 4, NULL},
|
||||
|
||||
ai_run, 2, NULL,
|
||||
ai_run, 0, NULL,
|
||||
ai_run, 0, NULL,
|
||||
ai_run, 0, NULL,
|
||||
{ai_run, 2, NULL},
|
||||
{ai_run, 0, NULL},
|
||||
{ai_run, 0, NULL},
|
||||
{ai_run, 0, NULL},
|
||||
|
||||
ai_run, 2, NULL,
|
||||
ai_run, 4, NULL,
|
||||
ai_run, 6, NULL,
|
||||
ai_run, 7, NULL,
|
||||
{ai_run, 2, NULL},
|
||||
{ai_run, 4, NULL},
|
||||
{ai_run, 6, NULL},
|
||||
{ai_run, 7, NULL},
|
||||
|
||||
ai_run, 3, NULL,
|
||||
ai_run, 8, NULL
|
||||
{ai_run, 3, NULL},
|
||||
{ai_run, 8, NULL}
|
||||
};
|
||||
|
||||
mmove_t zombie_move_run = {
|
||||
34,
|
||||
51,
|
||||
zombie_frames_run,
|
||||
NULL
|
||||
};
|
||||
mmove_t zombie_move_run = {34, 51, zombie_frames_run, NULL};
|
||||
|
||||
void zombie_run(edict_t *self)
|
||||
{
|
||||
|
@ -101,11 +107,16 @@ void zombie_run(edict_t *self)
|
|||
}
|
||||
|
||||
// Sight
|
||||
void zombie_sight(edict_t *self)
|
||||
void zombie_sight(edict_t *self, edict_t *other /* unused */)
|
||||
{
|
||||
gi.sound(self, CHAN_VOICE, sound_sight, 1, ATTN_NORM, 0);
|
||||
}
|
||||
|
||||
void zombie_touch(edict_t *ent, edict_t *other, cplane_t *plane, csurface_t *surf)
|
||||
{
|
||||
G_FreeEdict(ent);
|
||||
}
|
||||
|
||||
void zombie_gib_touch(edict_t *ent, edict_t *other, cplane_t *plane, csurface_t *surf)
|
||||
{
|
||||
if (other == ent->owner)
|
||||
|
@ -125,7 +136,7 @@ void zombie_gib_touch(edict_t *ent, edict_t *other, cplane_t *plane, csurface_t
|
|||
gi.sound(ent, CHAN_WEAPON, sound_miss, 1, ATTN_NORM, 0);
|
||||
VectorSet(ent->avelocity, 0, 0, 0);
|
||||
VectorSet(ent->velocity, 0, 0, 0);
|
||||
ent->touch = G_FreeEdict;
|
||||
ent->touch = zombie_touch;
|
||||
}
|
||||
|
||||
void fire_zombie_gib(edict_t *self, vec3_t start, vec3_t aimdir, int damage, int speed)
|
||||
|
@ -134,11 +145,11 @@ void fire_zombie_gib(edict_t *self, vec3_t start, vec3_t aimdir, int damage, int
|
|||
vec3_t dir;
|
||||
vec3_t forward, right, up;
|
||||
|
||||
// decino: No enemies left, so stop shooting
|
||||
if (!self->enemy || self->enemy == self)
|
||||
if (!self)
|
||||
{
|
||||
return;
|
||||
// decino: Don't make impossible shots
|
||||
VectorCopy(SightEndtToDir(self, aimdir)[0], dir);
|
||||
}
|
||||
|
||||
vectoangles(aimdir, dir);
|
||||
AngleVectors(dir, forward, right, up);
|
||||
|
||||
|
@ -154,7 +165,7 @@ void fire_zombie_gib(edict_t *self, vec3_t start, vec3_t aimdir, int damage, int
|
|||
gib->s.effects |= EF_GIB;
|
||||
VectorClear(gib->mins);
|
||||
VectorClear(gib->maxs);
|
||||
gib->s.modelindex = gi.modelindex ("models/objects/gibs/sm_meat/tris.md2");
|
||||
gib->s.modelindex = gi.modelindex("models/monsters/objects/gibs/sm_meat/tris.md2");
|
||||
gib->owner = self;
|
||||
gib->touch = zombie_gib_touch;
|
||||
gib->nextthink = level.time + 2.5;
|
||||
|
@ -181,110 +192,131 @@ void FireZombieGib(edict_t *self)
|
|||
}
|
||||
|
||||
// Attack (1)
|
||||
mframe_t zombie_frames_attack1 [] =
|
||||
static mframe_t zombie_frames_attack1 [] =
|
||||
{
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
|
||||
ai_charge, 0, FireZombieGib
|
||||
{ai_charge, 0, FireZombieGib}
|
||||
};
|
||||
mmove_t zombie_move_attack1 = {52, 64, zombie_frames_attack1, zombie_run};
|
||||
|
||||
// Attack (2)
|
||||
mframe_t zombie_frames_attack2 [] =
|
||||
static mframe_t zombie_frames_attack2 [] =
|
||||
{
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, FireZombieGib
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, FireZombieGib}
|
||||
};
|
||||
mmove_t zombie_move_attack2 = {
|
||||
65,
|
||||
78,
|
||||
zombie_frames_attack2,
|
||||
zombie_run
|
||||
};
|
||||
mmove_t zombie_move_attack2 = {65, 78, zombie_frames_attack2, zombie_run};
|
||||
|
||||
// Attack (3)
|
||||
mframe_t zombie_frames_attack3 [] =
|
||||
static mframe_t zombie_frames_attack3 [] =
|
||||
{
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, NULL,
|
||||
ai_charge, 0, FireZombieGib,
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, NULL},
|
||||
{ai_charge, 0, FireZombieGib},
|
||||
};
|
||||
mmove_t zombie_move_attack3 = {
|
||||
79,
|
||||
90,
|
||||
zombie_frames_attack3,
|
||||
zombie_run
|
||||
};
|
||||
mmove_t zombie_move_attack3 = {79, 90, zombie_frames_attack3, zombie_run};
|
||||
|
||||
// Attack
|
||||
void zombie_attack(edict_t *self)
|
||||
{
|
||||
float r = random();
|
||||
|
||||
|
||||
if (r < 0.3)
|
||||
{
|
||||
self->monsterinfo.currentmove = &zombie_move_attack1;
|
||||
}
|
||||
else if (r < 0.6)
|
||||
{
|
||||
self->monsterinfo.currentmove = &zombie_move_attack2;
|
||||
}
|
||||
else
|
||||
{
|
||||
self->monsterinfo.currentmove = &zombie_move_attack3;
|
||||
}
|
||||
}
|
||||
|
||||
mframe_t zombie_frames_get_up [] =
|
||||
static mframe_t zombie_frames_get_up [] =
|
||||
{
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL}
|
||||
};
|
||||
mmove_t zombie_move_get_up = {
|
||||
173,
|
||||
191,
|
||||
zombie_frames_get_up,
|
||||
zombie_run
|
||||
};
|
||||
mmove_t zombie_move_get_up = {173, 191, zombie_frames_get_up, zombie_run};
|
||||
|
||||
void zombie_pain1(edict_t *self)
|
||||
{
|
||||
|
@ -306,7 +338,7 @@ void zombie_get_up(edict_t *self)
|
|||
VectorSet(self->maxs, 16, 16, 40);
|
||||
self->takedamage = DAMAGE_YES;
|
||||
self->health = 60;
|
||||
zombie_sight(self);
|
||||
zombie_sight(self, NULL);
|
||||
|
||||
if (!M_walkmove(self, 0, 0))
|
||||
{
|
||||
|
@ -322,15 +354,17 @@ void zombie_start_fall(edict_t *self)
|
|||
}
|
||||
|
||||
// Down
|
||||
mframe_t zombie_frames_get_up_attempt [] =
|
||||
static mframe_t zombie_frames_get_up_attempt [] =
|
||||
{
|
||||
ai_move, 0, zombie_get_up_attempt
|
||||
{ai_move, 0, zombie_get_up_attempt}
|
||||
};
|
||||
|
||||
mmove_t zombie_move_get_up_attempt = {173, 173, zombie_frames_get_up_attempt, NULL};
|
||||
|
||||
void zombie_get_up_attempt(edict_t *self)
|
||||
{
|
||||
static int down = 0;
|
||||
|
||||
zombie_down(self);
|
||||
|
||||
// Try getting up in 5 seconds
|
||||
|
@ -354,133 +388,138 @@ void zombie_down(edict_t *self)
|
|||
}
|
||||
|
||||
// Pain (1)
|
||||
mframe_t zombie_frames_pain1 [] =
|
||||
static mframe_t zombie_frames_pain1 [] =
|
||||
{
|
||||
ai_move, 0, zombie_pain1,
|
||||
ai_move, 3, NULL,
|
||||
ai_move, 1, NULL,
|
||||
ai_move, 1, NULL,
|
||||
{ai_move, 0, zombie_pain1},
|
||||
{ai_move, 3, NULL},
|
||||
{ai_move, 1, NULL},
|
||||
{ai_move, 1, NULL},
|
||||
|
||||
ai_move, 3, NULL,
|
||||
ai_move, 1, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 3, NULL},
|
||||
{ai_move, 1, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL}
|
||||
};
|
||||
mmove_t zombie_move_pain1 = {91, 102, zombie_frames_pain1, zombie_run};
|
||||
|
||||
// Pain (2)
|
||||
mframe_t zombie_frames_pain2 [] =
|
||||
static mframe_t zombie_frames_pain2 [] =
|
||||
{
|
||||
ai_move, 0, zombie_pain2,
|
||||
ai_move, 2, NULL,
|
||||
ai_move, 8, NULL,
|
||||
ai_move, 6, NULL,
|
||||
{ai_move, 0, zombie_pain2},
|
||||
{ai_move, 2, NULL},
|
||||
{ai_move, 8, NULL},
|
||||
{ai_move, 6, NULL},
|
||||
|
||||
ai_move, 2, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 2, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, zombie_hit_floor,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, zombie_hit_floor},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 1, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 1, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL}
|
||||
};
|
||||
mmove_t zombie_move_pain2 = {103, 130, zombie_frames_pain2, zombie_run};
|
||||
|
||||
// Pain (3)
|
||||
mframe_t zombie_frames_pain3 [] =
|
||||
static mframe_t zombie_frames_pain3 [] =
|
||||
{
|
||||
ai_move, 0, zombie_pain2,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 3, NULL,
|
||||
ai_move, 1, NULL,
|
||||
{ai_move, 0, zombie_pain2},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 3, NULL},
|
||||
{ai_move, 1, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 1, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 1, NULL},
|
||||
|
||||
ai_move, 1, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 1, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL}
|
||||
};
|
||||
mmove_t zombie_move_pain3 = {131, 148, zombie_frames_pain3, zombie_run};
|
||||
|
||||
// Pain (4)
|
||||
mframe_t zombie_frames_pain4 [] =
|
||||
static mframe_t zombie_frames_pain4 [] =
|
||||
{
|
||||
ai_move, 0, zombie_pain1,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, zombie_pain1},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 1, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
ai_move, 0, NULL,
|
||||
{ai_move, 1, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
{ai_move, 0, NULL},
|
||||
|
||||
ai_move, 0, NULL
|
||||
{ai_move, 0, NULL}
|
||||
};
|
||||
mmove_t zombie_move_pain4 = {149, 161, zombie_frames_pain4, zombie_run};
|
||||
|
||||
// Pain (5)
|
||||
mframe_t zombie_frames_fall_start [] =
|
||||
static mframe_t zombie_frames_fall_start [] =
|
||||
{
|
||||
ai_move, 0, zombie_start_fall,
|
||||
ai_move, -8, NULL,
|
||||
ai_move, -5, NULL,
|
||||
ai_move, -3, NULL,
|
||||
{ai_move, 0, zombie_start_fall},
|
||||
{ai_move, -8, NULL},
|
||||
{ai_move, -5, NULL},
|
||||
{ai_move, -3, NULL},
|
||||
|
||||
ai_move, -1, NULL,
|
||||
ai_move, -2, NULL,
|
||||
ai_move, -1, NULL,
|
||||
ai_move, -1, NULL,
|
||||
{ai_move, -1, NULL},
|
||||
{ai_move, -2, NULL},
|
||||
{ai_move, -1, NULL},
|
||||
{ai_move, -1, NULL},
|
||||
|
||||
ai_move, -2, NULL,
|
||||
ai_move, 0, zombie_hit_floor,
|
||||
ai_move, 0, zombie_down
|
||||
{ai_move, -2, NULL},
|
||||
{ai_move, 0, zombie_hit_floor},
|
||||
{ai_move, 0, zombie_down}
|
||||
};
|
||||
mmove_t zombie_move_fall_start = {
|
||||
162,
|
||||
172,
|
||||
zombie_frames_fall_start,
|
||||
zombie_get_up_attempt
|
||||
};
|
||||
mmove_t zombie_move_fall_start = {162, 172, zombie_frames_fall_start, zombie_get_up_attempt};
|
||||
|
||||
// Pain
|
||||
void zombie_pain(edict_t *self, edict_t *other, float kick, int damage)
|
||||
|
@ -489,30 +528,40 @@ void zombie_pain(edict_t *self, edict_t *other, float kick, int damage)
|
|||
self->health = 60;
|
||||
|
||||
if (damage < 9)
|
||||
{
|
||||
return;
|
||||
if (self->zombie_state == 2)
|
||||
}
|
||||
|
||||
if (self->monsterinfo.currentmove == &zombie_move_fall_start)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (damage >= 25)
|
||||
{
|
||||
self->zombie_state = 2;
|
||||
self->monsterinfo.currentmove = &zombie_move_fall_start;
|
||||
return;
|
||||
}
|
||||
|
||||
if (self->pain_debounce_time > level.time)
|
||||
{
|
||||
self->zombie_state = 2;
|
||||
self->monsterinfo.currentmove = &zombie_move_fall_start;
|
||||
return;
|
||||
}
|
||||
if (self->zombie_state)
|
||||
|
||||
if (
|
||||
(self->monsterinfo.currentmove == &zombie_move_pain1) ||
|
||||
(self->monsterinfo.currentmove == &zombie_move_pain2) ||
|
||||
(self->monsterinfo.currentmove == &zombie_move_pain3) ||
|
||||
(self->monsterinfo.currentmove == &zombie_move_pain4)
|
||||
)
|
||||
{
|
||||
self->pain_debounce_time = level.time + 3;
|
||||
return;
|
||||
}
|
||||
self->zombie_state = 1;
|
||||
|
||||
// decino: No pain animations in Nightmare mode
|
||||
if (skill->value >= 3)
|
||||
if (skill->value >= SKILL_HARDPLUS)
|
||||
return;
|
||||
r = random();
|
||||
|
||||
|
@ -550,24 +599,21 @@ void zombie_search(edict_t *self)
|
|||
gi.sound(self, CHAN_VOICE, sound_search, 1, ATTN_NORM, 0);
|
||||
}
|
||||
|
||||
void SP_monster_q1_zombie(edict_t *self)
|
||||
void SP_monster_zombie(edict_t *self)
|
||||
{
|
||||
self->s.modelindex = gi.modelindex("models/quake1/zombie/tris.md2");
|
||||
VectorSet (self->mins, -16, -16, -24);
|
||||
VectorSet (self->maxs, 16, 16, 40);
|
||||
self->s.modelindex = gi.modelindex("models/monsters/zombie/tris.md2");
|
||||
VectorSet(self->mins, -16, -16, -24);
|
||||
VectorSet(self->maxs, 16, 16, 40);
|
||||
self->health = 60;
|
||||
self->monster_name = "Zombie";
|
||||
|
||||
if (self->solid == SOLID_NOT)
|
||||
return;
|
||||
sound_sight = gi.soundindex("quake1/zombie/z_idle.wav");
|
||||
sound_search = gi.soundindex("quake1/zombie/z_idle.wav");
|
||||
sound_fling = gi.soundindex("quake1/zombie/z_shot1.wav");
|
||||
sound_pain1 = gi.soundindex("quake1/zombie/z_pain.wav");
|
||||
sound_pain2 = gi.soundindex("quake1/zombie/z_pain1.wav");
|
||||
sound_fall = gi.soundindex("quake1/zombie/z_fall.wav");
|
||||
sound_miss = gi.soundindex("quake1/zombie/z_miss.wav");
|
||||
sound_hit = gi.soundindex("quake1/zombie/z_hit.wav");
|
||||
sound_sight = gi.soundindex("zombie/z_idle.wav");
|
||||
sound_search = gi.soundindex("zombie/z_idle.wav");
|
||||
sound_fling = gi.soundindex("zombie/z_shot1.wav");
|
||||
sound_pain1 = gi.soundindex("zombie/z_pain.wav");
|
||||
sound_pain2 = gi.soundindex("zombie/z_pain1.wav");
|
||||
sound_fall = gi.soundindex("zombie/z_fall.wav");
|
||||
sound_miss = gi.soundindex("zombie/z_miss.wav");
|
||||
sound_hit = gi.soundindex("zombie/z_hit.wav");
|
||||
|
||||
self->movetype = MOVETYPE_STEP;
|
||||
self->solid = SOLID_BBOX;
|
|
@ -235,7 +235,7 @@ extern void ThrowWidowGibLoc ( edict_t * self , char * gibname , int damage , in
|
|||
extern void ThrowWidowGib ( edict_t * self , char * gibname , int damage , int type ) ;
|
||||
extern void widow_gib_touch ( edict_t * self , edict_t * other , cplane_t * plane , csurface_t * surf ) ;
|
||||
extern void WidowVelocityForDamage ( int damage , vec3_t v ) ;
|
||||
extern void SP_monster_guardian(edict_t *self);
|
||||
extern void SP_monster_guardian ( edict_t * self ) ;
|
||||
extern void SP_monster_widow2 ( edict_t * self ) ;
|
||||
extern void Widow2Precache ( void ) ;
|
||||
extern qboolean Widow2_CheckAttack ( edict_t * self ) ;
|
||||
|
@ -337,17 +337,17 @@ extern void SP_CreateCoopSpots ( edict_t * self ) ;
|
|||
extern void SP_FixCoopSpots ( edict_t * self ) ;
|
||||
extern void SP_monster_arachnid ( edict_t * self ) ;
|
||||
extern void arachnid_sight(edict_t *self, edict_t *other /* unused */);
|
||||
extern void arachnid_footstep(edict_t *self);
|
||||
extern void arachnid_stand(edict_t *self);
|
||||
extern void arachnid_walk(edict_t *self);
|
||||
extern void arachnid_run(edict_t *self);
|
||||
extern void arachnid_footstep ( edict_t * self ) ;
|
||||
extern void arachnid_stand ( edict_t * self ) ;
|
||||
extern void arachnid_walk ( edict_t * self ) ;
|
||||
extern void arachnid_run ( edict_t * self ) ;
|
||||
extern void arachnid_pain(edict_t *self, edict_t *other /* other */, float kick /* other */, int damage);
|
||||
extern void arachnid_charge_rail(edict_t *self);
|
||||
extern void arachnid_rail(edict_t *self);
|
||||
extern void arachnid_melee_charge(edict_t *self);
|
||||
extern void arachnid_melee_hit(edict_t *self);
|
||||
extern void arachnid_attack(edict_t *self);
|
||||
extern void arachnid_dead(edict_t *self);
|
||||
extern void arachnid_charge_rail ( edict_t * self ) ;
|
||||
extern void arachnid_rail ( edict_t * self ) ;
|
||||
extern void arachnid_melee_charge ( edict_t * self ) ;
|
||||
extern void arachnid_melee_hit ( edict_t * self ) ;
|
||||
extern void arachnid_attack ( edict_t * self ) ;
|
||||
extern void arachnid_dead ( edict_t * self ) ;
|
||||
extern void arachnid_die(edict_t *self, edict_t *inflictor /* unused */, edict_t *attacker /* unused */, int damage, vec3_t point /* unused */);
|
||||
extern void SP_monster_tank ( edict_t * self ) ;
|
||||
extern void tank_stand_think ( edict_t * self ) ;
|
||||
|
@ -810,27 +810,27 @@ extern void floater_fire_blaster ( edict_t * self ) ;
|
|||
extern void floater_idle ( edict_t * self ) ;
|
||||
extern void floater_sight ( edict_t * self , edict_t * other ) ;
|
||||
extern void SP_monster_flipper ( edict_t * self ) ;
|
||||
extern void guardian_stand(edict_t *self);
|
||||
extern void guardian_footstep(edict_t *self);
|
||||
extern void guardian_walk(edict_t *self);
|
||||
extern void guardian_run(edict_t *self);
|
||||
extern void guardian_stand ( edict_t * self ) ;
|
||||
extern void guardian_footstep ( edict_t * self ) ;
|
||||
extern void guardian_walk ( edict_t * self ) ;
|
||||
extern void guardian_run ( edict_t * self ) ;
|
||||
extern void guardian_pain(edict_t *self, edict_t *other /* other */, float kick /* other */, int damage);
|
||||
extern void guardian_atk1_finish(edict_t *self);
|
||||
extern void guardian_atk1_charge(edict_t *self);
|
||||
extern void guardian_fire_blaster(edict_t *self);
|
||||
extern void guardian_hyper_sound(edict_t *self);
|
||||
extern void guardian_atk1(edict_t *self);
|
||||
extern void guardian_atk2_out(edict_t *self);
|
||||
extern void guardian_laser_fire(edict_t *self);
|
||||
extern void guardian_atk2(edict_t *self);
|
||||
extern void guardian_kick(edict_t *self);
|
||||
extern void guardian_attack(edict_t *self);
|
||||
extern void guardian_explode(edict_t *self);
|
||||
extern void guardian_dead(edict_t *self);
|
||||
extern void guardian_atk1_finish ( edict_t * self ) ;
|
||||
extern void guardian_atk1_charge ( edict_t * self ) ;
|
||||
extern void guardian_fire_blaster ( edict_t * self ) ;
|
||||
extern void guardian_hyper_sound ( edict_t * self ) ;
|
||||
extern void guardian_atk1 ( edict_t * self ) ;
|
||||
extern void guardian_atk2_out ( edict_t * self ) ;
|
||||
extern void guardian_laser_fire ( edict_t * self ) ;
|
||||
extern void guardian_atk2 ( edict_t * self ) ;
|
||||
extern void guardian_kick ( edict_t * self ) ;
|
||||
extern void guardian_attack ( edict_t * self ) ;
|
||||
extern void guardian_explode ( edict_t * self ) ;
|
||||
extern void guardian_dead ( edict_t * self ) ;
|
||||
extern void guardian_die(edict_t *self, edict_t *inflictor /* unused */, edict_t *attacker /* unused */, int damage, vec3_t point /* unused */);
|
||||
extern void SP_monster_guardian(edict_t *self);
|
||||
extern void SP_monster_guardian ( edict_t * self ) ;
|
||||
extern void shambler_sight(edict_t* self, edict_t* other);
|
||||
extern void shambler_lightning_update(edict_t *self);
|
||||
extern void shambler_lightning_update ( edict_t * self ) ;
|
||||
extern void shambler_windup(edict_t* self);
|
||||
extern void shambler_idle(edict_t* self);
|
||||
extern void shambler_maybe_idle(edict_t* self);
|
||||
|
@ -982,6 +982,18 @@ extern void brain_stand ( edict_t * self ) ;
|
|||
extern void brain_search ( edict_t * self ) ;
|
||||
extern void brain_sight ( edict_t * self , edict_t * other ) ;
|
||||
extern void SP_monster_boss5 ( edict_t * self ) ;
|
||||
extern void SP_monster_army ( edict_t * self ) ;
|
||||
extern void SP_monster_demon ( edict_t * self ) ;
|
||||
extern void SP_monster_dog ( edict_t * self ) ;
|
||||
extern void SP_monster_enforcer ( edict_t * self ) ;
|
||||
extern void SP_monster_fish ( edict_t * self ) ;
|
||||
extern void SP_monster_hknight ( edict_t * self ) ;
|
||||
extern void SP_monster_knight ( edict_t * self ) ;
|
||||
extern void SP_monster_ogre ( edict_t * self ) ;
|
||||
extern void SP_monster_shalrath ( edict_t * self ) ;
|
||||
extern void SP_monster_tarbaby ( edict_t * self ) ;
|
||||
extern void SP_monster_wizard ( edict_t * self ) ;
|
||||
extern void SP_monster_zombie ( edict_t * self ) ;
|
||||
extern void boss5_die ( edict_t * self , edict_t * inflictor , edict_t * attacker , int damage , vec3_t point ) ;
|
||||
extern void BossExplode2 ( edict_t * self ) ;
|
||||
extern void boss5_dead ( edict_t * self ) ;
|
||||
|
|
|
@ -984,6 +984,18 @@
|
|||
{"brain_search", (byte *)brain_search},
|
||||
{"brain_sight", (byte *)brain_sight},
|
||||
{"SP_monster_boss5", (byte *)SP_monster_boss5},
|
||||
{"SP_monster_army", (byte *)SP_monster_army},
|
||||
{"SP_monster_demon", (byte *)SP_monster_demon},
|
||||
{"SP_monster_dog", (byte *)SP_monster_dog},
|
||||
{"SP_monster_enforcer", (byte *)SP_monster_enforcer},
|
||||
{"SP_monster_fish", (byte *)SP_monster_fish},
|
||||
{"SP_monster_hknight", (byte *)SP_monster_hknight},
|
||||
{"SP_monster_knight", (byte *)SP_monster_knight},
|
||||
{"SP_monster_ogre", (byte *)SP_monster_ogre},
|
||||
{"SP_monster_shalrath", (byte *)SP_monster_shalrath},
|
||||
{"SP_monster_tarbaby", (byte *)SP_monster_tarbaby},
|
||||
{"SP_monster_wizard", (byte *)SP_monster_wizard},
|
||||
{"SP_monster_zombie", (byte *)SP_monster_zombie},
|
||||
{"boss5_die", (byte *)boss5_die},
|
||||
{"BossExplode2", (byte *)BossExplode2},
|
||||
{"boss5_dead", (byte *)boss5_dead},
|
||||
|
|
Loading…
Reference in a new issue