forked from jimdose/SiN_110_Source
-
Notifications
You must be signed in to change notification settings - Fork 0
/
actor.cpp
6257 lines (5348 loc) · 131 KB
/
actor.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
//-----------------------------------------------------------------------------
//
// $Logfile:: /Quake 2 Engine/Sin/code/game/actor.cpp $
// $Revision:: 233 $
// $Author:: Markd $
// $Date:: 2/08/99 5:12p $
//
// Copyright (C) 1998 by Ritual Entertainment, Inc.
// All rights reserved.
//
// This source may not be distributed and/or modified without
// expressly written permission by Ritual Entertainment, Inc.
//
// $Log:: /Quake 2 Engine/Sin/code/game/actor.cpp $
//
// 233 2/08/99 5:12p Markd
// fixed 2015 actor problem
//
// 232 1/29/99 6:14p Jimdose
// added 2015 changes
//
// 231 1/27/99 10:02p Markd
// Merged 2015 source into main code base
//
// 230 11/16/98 8:50p Markd
// increased chat times
//
// 229 11/16/98 7:28p Markd
// bullet proofed TargetEnemies so that dead bodies only spoke their secret
// once and then cleared who they were upset at, much like a soul being
// released from a dead body ;)
//
// 228 11/15/98 7:58p Jimdose
// Actors now exclusively use flags for movement types
// Made eyeposition max out at maxs.z
// Swim monsters will no longer leave water
// Air monsters will no longer enter water
//
// 227 11/15/98 2:58a Markd
// scale pain threshold by skill a bit less than what it is right now
//
// 226 11/15/98 1:24a Jimdose
// monsters don't play snd_sightenemy now unless DoAction( "sightenemy" )
// succeeds.
//
// 225 11/14/98 6:41p Jimdose
// guys no longer drown in moving water after the water has moved
//
// 224 11/13/98 11:55p Markd
// bodyimpact sound to goryimpact sound
//
// 223 11/13/98 11:00p Jimdose
// Took EV_CONSOLE off of fov
//
// 222 11/13/98 10:02p Jimdose
// bodies no longer float when they die in water
// guys will allow themselves to fall when they are standing on other setients
//
// 221 11/13/98 4:04p Markd
// increased min melee range
//
// 220 11/12/98 11:30p Jimdose
// Increased melee kick
//
// 219 11/10/98 5:47p Jimdose
// Made CanSee non-inline because it caused link problems
//
// 218 11/09/98 6:23p Markd
// Added turnspeed event
//
// 217 11/08/98 7:06p Markd
// Put in nochatter, made mutants not Like each other, added seenEnemy to
// actorinfo
//
// 216 11/07/98 10:16p Jimdose
// actors no longer get mad at scriptobjects that hurt them
//
// 215 11/07/98 3:34p Markd
// Added nodeathfade command
//
// 214 11/06/98 8:25p Jimdose
// made visiondistance adjustable from script
//
// 213 11/03/98 10:02p Aldie
// Drop inventory when being tesselated
//
// 212 10/27/98 9:06p Markd
// tweaked enemy aiming
//
// 211 10/27/98 7:52p Jimdose
// added IfEnemyWithinEvent
// made guys not lean if they're not moving very far
//
// 210 10/27/98 3:46p Markd
// Changed skill level on actors
//
// 209 10/27/98 3:51a Jimdose
// added kick to MeleeEvent
//
// 208 10/27/98 1:50a Markd
// Made JumpTo take in account water level
//
// 207 10/26/98 9:53p Markd
// Moved GotKill around, added gibfest sound
//
// 206 10/26/98 9:04p Markd
// Changed jumpto behavior
//
// 205 10/26/98 8:22p Markd
// Put CheckWater in Killed function
//
// 204 10/26/98 5:51p Jimdose
// actor saves off spawn args before processing init commands
//
// 203 10/26/98 2:19p Markd
// Added last_jump_time
//
// 202 10/26/98 1:20p Markd
// made guys be BestTargetable after having an enemy already
//
// 201 10/26/98 12:13p Markd
// fixed bug with blood preventing parent mode melee attacks
//
// 200 10/26/98 3:59a Jimdose
// made Trymove not return STEPMOVE_STUCK when opening doors
//
// 199 10/26/98 1:53a Jimdose
// TryMove was still using origin insteard of worldorigin, so the M_CheckBottom
// call was always checking where the monster currently was, and not where he
// was going to.
//
// 198 10/25/98 11:53p Aldie
// Another dead check to avoid bodies that are in the air not going dead
//
// 197 10/25/98 4:43a Markd
// Added animal event
//
// 196 10/25/98 4:28a Jimdose
// Made opendoor a forced action
// made CanShootFrom do extra tests to see if it should shoot damagable objects
//
// 195 10/25/98 1:52a Aldie
// Changed gibanim functionality to be location based
//
// 194 10/24/98 3:10p Markd
// Put in eyeoffset command
//
// 193 10/24/98 3:26a Markd
// Put in more debug info for actors
//
// 192 10/24/98 12:42a Markd
// changed origins to worldorigins where appropriate
//
// 191 10/23/98 6:46p Aldie
// Turn off shadows for death and do deathgib anim on location
//
// 190 10/22/98 9:28p Aldie
// Added ability for deathgib animation
//
// 189 10/22/98 3:05p Markd
// fixed movespeed on actors
//
// 188 10/22/98 1:40a Markd
// Added FL_STEALTH ability
//
// 187 10/21/98 11:15p Markd
// Put in FL_CLOAK ability for targetting from enemies
//
// 186 10/21/98 6:43p Markd
// made eyeposition the top of their bounding box
//
// 185 10/21/98 3:37p Markd
// put in different enemy alignment and put in support for skins
//
// 184 10/21/98 2:13a Markd
// Fixed jumping stuff
//
// 183 10/20/98 11:29p Markd
// Made CanShootFrom aim at the chest rather than the centroid
//
// 182 10/20/98 8:05p Aldie
// Added a DoGib function to ease readability
//
// 181 10/20/98 2:37a Markd
// Added additional JumpTo methods
//
// 180 10/20/98 12:43a Markd
// Put in scale for health, setsize, melee_range and melee_damage
//
// 179 10/19/98 11:53p Aldie
// Moved the solid_trigger setting to the setup function of touchfields
//
// 178 10/19/98 11:49p Aldie
// Fixed a bug where touch field was SOLID_BBOX. Now it is forced to
// SOLID_TRIGGER.
//
// 177 10/19/98 9:55p Markd
// Made it so "state" event does a ProcessScript
//
// 176 10/19/98 8:58p Aldie
// Fix dead check for bodies in water
//
// 175 10/19/98 2:58a Markd
// Fixed CanShootFrom and Jumping
//
// 174 10/19/98 2:41a Markd
// made MakeEnemy not target the world
//
// 173 10/19/98 2:41a Aldie
// Removed MOVETYPE_TOSS when actors die
//
// 172 10/19/98 12:04a Jimdose
// made all code use fast checks for inheritance (no text lookups when
// possible)
// isSubclassOf no longer requires ::_classinfo()
//
// 171 10/18/98 6:43p Markd
// If no melee attack, make weapon not droppable
//
// 170 10/18/98 12:34a Markd
// Scaled shots_per_attack based on skill level
//
// 169 10/18/98 12:01a Markd
// Fixed AttackEntity and IfCanShoot
//
// 168 10/17/98 11:00p Markd
// Added IfCanShoot and not gettine mad at non-damageable things
//
// 167 10/17/98 9:41p Markd
// Made InvestigateSound not set nextsoundtime unless the Action responds
//
// 166 10/17/98 7:34p Jimdose
// deleted trig when actor deleted
//
// 165 10/17/98 4:59p Markd
// Added attackmode event
//
// 164 10/17/98 3:31p Markd
// Made firing more accurate over great distances
//
// 163 10/17/98 12:34a Markd
// Initialized chattime to random( 20 )
//
// 162 10/16/98 7:18p Markd
// Added a bunch of new commands, and added interfaces to the editor
//
// 161 10/16/98 3:11a Aldie
// Double the armor when actors die
//
// 160 10/16/98 1:41a Jimdose
// Added goto command for actors. This helps the all too common mistake of
// typing "local.self goto label"
//
// 159 10/15/98 9:32p Markd
// Made inanimate objects not move, not bleed, and not gib
//
// 158 10/14/98 10:54p Jimdose
// Made Hates check for a null entity
// Added null check to investigate functions
//
// 157 10/14/98 9:00p Markd
// Fixed JumpTo command, speed wise
//
// 156 10/14/98 5:20p Markd
// Added jumpto event and jumpto function
//
// 155 10/14/98 2:17a Markd
// Added in ifcanmeleeattack event
//
// 154 10/14/98 1:27a Markd
// Added Has_weapon support
//
// 153 10/14/98 12:11a Markd
// Put extra reach into melee event
//
// 152 10/13/98 11:03p Markd
// Put scale in on all Anim_delta calls
//
// 151 10/13/98 7:34p Markd
// made gib code scalable
//
// 150 10/13/98 12:26a Markd
// Added support for flying creatures, also made it so that CanShootFrom fired
// from the centroid, and not from the gun position
//
// 149 10/11/98 8:17p Markd
// Working on nautic fixes
//
// 148 10/11/98 5:20p Markd
// Put in default pain_thresholds
//
// 147 10/11/98 5:00p Markd
// Fixed water drowning, changed ProcessCommands so that it doesn't overwrite
// the the "thread" variable
//
// 146 10/11/98 12:32a Markd
// Added Flight ability
//
// 145 10/10/98 9:12p Markd
// Fixed Chatter using an alias for SoundTimeLength
//
// 144 10/10/98 7:59p Markd
// Put in painthreshold and snd_pain_taunt
//
// 143 10/10/98 5:01p Markd
// Changed trace masks to edict->clipmasks
//
// 142 10/10/98 3:27p Markd
// Made EndBehavior always notify the actor script
//
// 141 10/10/98 1:24a Jimdose
// Did some bulletproofing against possible NULL actorthread
// Prethink kills actors with NULL threads
// added SetVariable for setting thread variables safely
//
// 140 10/09/98 5:24p Markd
// Fixed inanimate actor animations
//
// 139 10/09/98 4:59p Jimdose
// Working on savegames
//
// 138 10/07/98 11:32a Markd
// Made DamageThresholds targetable by actors
//
// 137 10/06/98 5:25p Markd
// Made MakeEnemy and DoAction take the force parameter
//
// 136 10/06/98 12:14p Markd
// Added ForceAction
//
// 135 10/05/98 10:33p Markd
// Added canStrafe and noStrafe, also added MinimumAttackRange
//
// 134 10/05/98 2:57p Markd
// Changed Chatter settings
//
// 133 10/04/98 10:36p Markd
// Put in attack_finished
//
// 132 10/04/98 8:45p Aldie
// Gib functions
//
// 131 10/04/98 2:49p Markd
// Fixed swimming and forward speed stuff
//
// 130 10/03/98 7:15p Markd
// got swimming characters working, in the process re-wrote a lot of the combat
// stuff
//
// 129 10/01/98 8:00p Markd
// Added melee capabilities
//
// 128 10/01/98 4:13p Jimdose
// Fixed some problems with CanShootFrom that prevented guys from being able to
// shoot the player when he's on ledges with railings
//
// 127 9/24/98 7:26p Markd
// made inanimate objects not set off triggers
//
// 126 9/24/98 7:10p Jimdose
// Added MyGunAngles
//
// 125 9/24/98 12:42a Jimdose
// attempting to fix dead guys hanging in air
//
// 124 9/22/98 10:19p Jimdose
// Initialized lastmove
// Fixed InFov
// Set fovdot in Fov event
//
// 123 9/22/98 5:19p Markd
// Put in new consolidated gib function
//
// 122 9/22/98 5:10p Jimdose
// Fixed inanimate objects
//
// 121 9/22/98 3:21p Markd
// put in parentmode lockout for blood and gibs
//
// 120 9/22/98 6:27a Jimdose
// Fixed bug when setting "attackmode"
//
// 119 9/22/98 5:37a Jimdose
// Made attackmode only set once when thread is created
//
// 118 9/22/98 5:31a Jimdose
// Added attackmode
//
// 117 9/22/98 1:58a Jimdose
// Added lastmove and forwardspeed
// Regrouped functions by functionality
// Removed reaction table stuff
//
// 116 9/19/98 7:49p Jimdose
// Fixed uninitialized pointer in ShowInfo and added more data
//
// 115 9/19/98 6:16p Jimdose
// Added AttackPlayer
// AttackEntity and AttackPlayer makes the actor attack the entity immediately
// by forcing a call to SightEnemy
//
// 114 9/19/98 4:34p Jimdose
// changed gi.dprintf's to gi.printf's in ShowInfo
//
// 113 9/18/98 10:55p Jimdose
// Added inanimate actor type
// started work on swimming monsters
//
// 112 9/16/98 8:38p Jimdose
// Made InFOV only test the fov in 2 dimensions
//
// 111 9/14/98 5:26p Jimdose
// Made EndBehavior set script variables
// Added some checks for NULL when getting nearest nodes
// SeenEnemy is now cleared when currentEnemy is killed
// CanShootFrom no longer assumes ScriptSlaves are shootable, but does shoot
// ScriptModel. Gotta find some solution that allows the level designers to
// specify whats shootable by the AI.
//
// 110 9/08/98 9:48p Jimdose
// Enabled multi-size bounding box path code
//
// 109 9/03/98 9:05p Jimdose
// Guys will now shoot through scriptslaves and objects with the assumption
// that he can destroy it
//
// 108 8/31/98 7:46p Jimdose
// Spread out targeting a bit
//
// 107 8/31/98 5:42p Jimdose
// Added checks for NULL pointer in MakeEnemy and AttackEnemy
//
// 106 8/29/98 9:39p Jimdose
// Added call info to G_Trace
//
// 105 8/29/98 5:26p Markd
// added specialfx, replaced misc with specialfx where appropriate
//
// 104 8/29/98 1:11p Markd
// Made it so M_CheckBottom only checks if groundentity is not world
//
// 103 8/27/98 9:00p Jimdose
// Made centroid into a variable
// Made guys target enemies less often
// MakeEnemy checks if ent is the world (when a target is non-valid, the ent
// may be the world)
//
// 102 8/27/98 6:00p Aldie
// Drop inventory items if the actors are gibbed.
//
// 101 8/27/98 4:49p Jimdose
// Fixed bug with hidden actors being shown again on startup
// Made actors not target hidden enemies, or target while hidden (for
// cinematics)
//
// 100 8/27/98 4:27p Markd
// detach children
//
// 99 8/26/98 11:13p Jimdose
// Began strafe support
//
// 98 8/26/98 6:45p Jimdose
// Made DefineStateEvent prepend the value in ai_actorscript
//
// 97 8/24/98 6:55p Jimdose
// Added crouching pain and death animations
// Added path
//
// 96 8/20/98 8:38p Jimdose
// Actors now share enemy info between each other on sight
// CanShoot checks the head as well as the centroid
// InFOV now uses an eliptical cone for testing vision (better vertical
// peripheral vision).
//
// 95 8/19/98 4:57p Jimdose
// CanShootFrom now takes min and max weapon firing distances into account
//
// 94 8/19/98 3:59p Jimdose
// Added IfNearEvent and CopyStateEvent
//
// 93 8/19/98 2:30p Jimdose
// Can no longer alias "alert" to "idle" so I've added a hasalert variable
//
// 92 8/18/98 11:57p Aldie
// Fixed init variable warning
//
// 91 8/18/98 11:08p Markd
// Added new Alias System
//
// 90 8/18/98 9:59p Jimdose
// Made actors only react to some sounds when they're caused by an enemy.
// Hmmm, would be nice if they checked their "memory" to see if they expect
// that kind of sound from there.
//
// 89 8/15/98 5:29p Jimdose
// Fixed up the thread startup code. No longer need to wait .1 in the script
// before sending commands. Actor script is no longer run twice (because of
// the delayed model init commands.
// Got rid of !init label in scripts. Now starts at beginning unless a label
// is given.
// CanShoot checks vision distance as an early exit.
//
// 88 8/14/98 11:34p Jimdose
// Got rid of "runtoarea" state. Attack now just lets MakeEnemy call
// sightenemy. Hmmm...probably should change to make sure that actor
// immediatly attacks the specified entity.
// don't set currentEnemy until sightenemy is responded to. Gets rid of a lot
// of brain dead situations.
//
// 87 8/14/98 6:24p Jimdose
// Got rid of decelleration for steering
//
// 86 8/13/98 7:30p Jimdose
// actorThread is now persistant. Threads don't get killed unless actor dies
// or is removed.
//
// 85 8/08/98 2:05p Markd
// Added entity who got the event to ForwardBehaviorEvent
//
// 84 8/07/98 7:57p Markd
// Added ForwardToBehavior event
//
// 83 8/07/98 6:01p Jimdose
// Rewrite AimAndShoot
//
// 82 8/06/98 6:59p Jimdose
// Added IfEnemyVisible
//
// 81 8/05/98 7:18p Jimdose
// Added definestate, ignoresounds, respondtosounds, respondtoall
//
// 80 8/03/98 6:49p Jimdose
// fixed thread bug
//
// 79 7/29/98 6:32p Jimdose
// Added MonsterStart
//
// 78 7/29/98 6:27p Jimdose
// Removed monster.h
//
// 77 7/29/98 2:30p Aldie
// Changed health to a float
//
// 76 7/26/98 3:40p Jimdose
// Fixed guys in water
// guys no longer open locked doors
//
// 75 7/26/98 11:43a Jimdose
// Added EnemyCanSeeMeFrom
//
// 74 7/26/98 6:44a Jimdose
// Overrode the setsize event so that def files don't change the hardcoded size
// (need to fix these damn paths one day).
//
// 73 7/26/98 3:48a Jimdose
// Modified aim based on skill
//
// 72 7/25/98 4:39p Jimdose
// Guys shoot at vehicles and shoot out windows
//
// 71 7/25/98 2:07a Jimdose
// Fixed bug with trig being delete without being NULLed out when gibbing
// Guys now attack any enemy
//
// 70 7/24/98 9:59p Aldie
// Gib stuff
//
// 69 7/24/98 6:16p Aldie
// Check for inventory items before removing dead guys
//
// 68 7/24/98 4:14p Aldie
// Cancel useless checks
//
// 67 7/24/98 3:46p Aldie
// Increased gibs
//
// 66 7/23/98 10:16p Jimdose
// Removed ignoreenemies stuff
// Fixed a bunch of anim screwups when actor is killed
// fixed "big gib" bug
//
// 65 7/23/98 6:55p Aldie
// Fun with gibs.
//
// 64 7/23/98 6:19p Jimdose
// ignoreEnemies was being set when character was targeted
//
// 63 7/22/98 7:02p Aldie
// Added ability to remove useless bodies.
//
// 62 7/22/98 2:32p Jimdose
// fixed bug where guys wouldn't sight the enemy if the went into pain
//
// 61 7/21/98 9:34p Jimdose
// Chatter now checks if the alias exists before playing the sound, thereby not
// generating warnings of missing sounds.
//
// 60 7/19/98 9:20p Jimdose
// Improved support for overriding the default script
//
// 59 7/16/98 6:21p Jimdose
// Fixed crash when actorthread was null
//
// 58 7/14/98 11:50p Jimdose
// Made PopState return whether a new state was popped off the stack
// StateDoneEvent now kills the calling thread if no previous state exists on
// the stack
// DoAction creates a new thread if no actor thread exists
//
// 57 7/14/98 6:57p Aldie
// Moved setsize before setmodel
//
// 56 7/13/98 4:59p Aldie
// Added dead player bodies with gibbing
//
// 55 7/09/98 10:40p Aldie
// Moved bodyparts to game
//
// 54 7/08/98 8:59p Jimdose
// Moved opening door to script
//
// 53 7/08/98 1:00p Jimdose
// added crouchsize and standsize
//
// 52 7/07/98 11:37p Jimdose
// Replaced priority-based system with full script-based state system
//
// 51 7/06/98 1:06p Jimdose
// working on ai
//
// 50 6/30/98 6:47p Aldie
// Added Gib Event
//
// 49 6/30/98 6:00p Jimdose
// Added more states and state detection code.
// Added range detection
// added health level detection
//
// 48 6/25/98 8:46p Markd
// Removed rotating doors
//
// 47 6/25/98 8:29p Aldie
// Updated killed and death
//
// 46 6/25/98 8:10p Jimdose
// Disabled some prints
//
// 45 6/25/98 8:10p Jimdose
// Using global actor script
//
// 44 6/24/98 4:26p Jimdose
// Fixed bugs in TurnTo
//
// 43 6/23/98 5:59p Aldie
// Fixed dropWeapon stuff.
//
// 42 6/20/98 7:47p Markd
// Added location based pain and death support
//
// 41 6/19/98 9:27p Jimdose
// Added GetGunOrientation
//
// 40 6/19/98 4:44p Jimdose
// Added util functions InFOV, etc.
//
// 39 6/18/98 8:45p Jimdose
// Removed string based SetBehavior and PushState functions
// Added source info to events
//
// 38 6/18/98 2:00p Markd
// rewrote tesselation code
//
// 37 6/17/98 10:00p Jimdose
// Improved door opening code
// Moved phyics move into class
//
// 36 6/17/98 3:15p Markd
// fixed arg issue
//
// 35 6/17/98 3:03p Markd
// Changed NumArgs back to previous behavior
//
// 34 6/17/98 1:19a Jimdose
// Moved setOwner to Item.
// Added EV_Item_Pickup
//
// 33 6/15/98 10:46p Jimdose
// Made neutral allias become enemies with pain
// shurnk bounding box temporarily
//
// 32 6/13/98 8:25p Jimdose
// Added leaning into turns (alright already Tom!)
// Added enemy visibility tests for FindCover
//
// 31 6/11/98 12:44a Jimdose
// behaviors now get info from the script at startup
//
// 30 6/10/98 10:24p Jimdose
// added priority based state system
//
// 29 6/09/98 4:18p Jimdose
// worked on ai
//
// 28 6/04/98 10:48p Jimdose
// Fixed a bunch of things that got broken just in time for E3. Paths and
// scripting actually work now.
//
// 27 6/03/98 5:43p Jimdose
// Fixed spelling of behavior. :)
//
// 26 6/03/98 4:36p Markd
// Removed gun stuff from entity, it is now sent over as a separate object
//
// 25 6/02/98 7:46p Markd
// Took out currentweapon assignments for client-side stuff
//
// 24 5/28/98 6:01p Markd
// When actors die, they kill their dynamic light
//
// 23 5/28/98 2:11p Markd
// Made enemies drop weapons and only fire if their weapons are ready
//
// 22 5/28/98 1:50p Markd
// made actors drop weapons
//
// 21 5/27/98 4:56p Markd
// Only gib when inflictor is rocket
//
// 20 5/27/98 12:04p Jimdose
// fixed null pointer prob
//
// 19 5/27/98 11:59a Jimdose
// Gibbing is harder
//
// 18 5/27/98 11:50a Jimdose
// Added killtarget and target to killed
//
// 17 5/27/98 7:15a Jimdose
// took out dprintf
//
// 16 5/27/98 7:12a Jimdose
// ai ai ai
//
// 15 5/27/98 6:39a Jimdose
// working on ai
//
// 14 5/27/98 5:27a Aldie
// Added gibs
//
// 13 5/27/98 5:11a Jimdose
// working on ai
//
// 12 5/25/98 6:46p Jimdose
// Made animateframe, prethink and posthink into functions built into the base
// entity class
//
// 11 5/25/98 5:32p Jimdose
// Pathnodes are no longer a subclass of Entity. This was done to save on
// edicts
//
// 10 5/25/98 1:06a Jimdose
// Added chatter
//
// 9 5/24/98 8:46p Jimdose
// Made a lot of functions more str-friendly.
// Got rid of a lot of char * based strings
// Cleaned up get spawn arg functions and sound functions
// sound functions now use consistant syntax
//
// 8 5/24/98 1:02a Jimdose
// Added monster hearing
//
// 7 5/23/98 6:27p Jimdose
// Improved steering and opening doors
//
// 6 5/22/98 9:44p Jimdose
// Disabled debug lines when checking to shoot
//
// 5 5/22/98 9:38p Jimdose
// Commented out prints
//
// 4 5/22/98 9:36p Jimdose
// AI Scripting works again (somewhat)
//
// 3 5/20/98 6:36p Jimdose
// Rewrite
//
// 2 5/18/98 8:15p Jimdose
// Created file
//
// DESCRIPTION:
// Base class for character AI.
//
#include "g_local.h"
#include "actor.h"
#include "behavior.h"
#include "scriptmaster.h"
#include "doors.h"
#include "gibs.h"
#include "vehicle.h"
#include "misc.h"
#include "specialfx.h"
#include "object.h"
#include "scriptslave.h"
#include "explosion.h"
#include "misc.h"
//#define DEBUG_PRINT
CLASS_DECLARATION( Class, ActorState, NULL );
ResponseDef ActorState::Responses[] =
{
{ NULL, NULL }
};
cvar_t *ai_actorscript;
// used below for a slight movement tweak
// added as a global here to prevent constant re-allocation
const Vector movetweak = "0 0 2";
#define TURN_SPEED 30
CLASS_DECLARATION( Sentient, Actor, "monster_generic" );
Event EV_Actor_CrouchSize( "crouchsize" );
Event EV_Actor_Fov( "fov" );
Event EV_Actor_VisionDistance( "visiondistance" );
Event EV_Actor_Start( "start" );
Event EV_Actor_Dead( "dead" );
Event EV_Actor_ClearState( "clearstate" );
Event EV_Actor_SetState( "state" );
Event EV_Actor_SetBehavior( "behavior" );
Event EV_Actor_Friend( "friend" ); // Allied to player
Event EV_Actor_Civilian( "civilian" ); // Nuetral to all, runs from danger
Event EV_Actor_Enemy( "enemy" ); // Enemy to player
Event EV_Actor_Monster( "monster" ); // Enemy to player, civilians, and inanimate objects
Event EV_Actor_Animal( "animal" ); // neutral to all
Event EV_Actor_Inanimate( "inanimate" ); // Inanimate objects
Event EV_Actor_Swim( "swim" ); // specifies actor as being able to swim
Event EV_Actor_Fly( "fly" ); // specifies actor as being able to swim
Event EV_Actor_NotLand( "noland" ); // specifies actor as not being able to walk on land
Event EV_Actor_TargetEnemies( "targetenemies" );
// Scripting
Event EV_Actor_Script( "script" );
Event EV_Actor_Thread( "thread" );
Event EV_Actor_IfEnemyVisible( "ifenemyvisible" );
Event EV_Actor_IfNear( "ifnear" );
Event EV_Actor_ForwardSpeed( "forwardspeed" );
Event EV_Actor_Idle( "idle" );
Event EV_Actor_LookAt( "lookat" );
Event EV_Actor_TurnTo( "turnto" );
Event EV_Actor_FinishedBehavior( "finishedbehavior" );
Event EV_Actor_NotifyBehavior( "notifybehavior" );
Event EV_Actor_WalkTo( "walkto" );
Event EV_Actor_JumpTo( "jumpto" );
Event EV_Actor_RunTo( "runto" );
Event EV_Actor_Anim( "anim" );
Event EV_Actor_Attack( "attack" );
Event EV_Actor_AttackPlayer( "attackplayer" );
Event EV_Actor_ReserveNode( "reservenode" );
Event EV_Actor_ReleaseNode( "releasenode" );
Event EV_Actor_IfCanHideAt( "ifcanhideat" );
Event EV_Actor_IfCanStrafeAttack( "ifcanstrafeattack" );
Event EV_Actor_IfCanMeleeAttack( "ifcanmeleeattack" );
Event EV_Actor_IfCanShoot( "ifcanshoot" );
Event EV_Actor_IfEnemyWithin( "ifenemywithin" );
Event EV_Actor_IgnoreSounds( "ignoresounds" );
Event EV_Actor_RespondToSounds( "respondtosounds" );
Event EV_Actor_IgnoreAll( "ignoreall" );
Event EV_Actor_RespondToAll( "respondtoall" );
Event EV_Actor_RespondTo( "respondto" );
Event EV_Actor_Ignore( "ignore" );
Event EV_Actor_DefineState( "definestate" );
Event EV_Actor_CopyState( "copystate" );
Event EV_Actor_Remove( "remove_useless" );
Event EV_Actor_ForwardToBehavior( "forwardcommand" );
Event EV_Actor_Aim( "aim" );
Event EV_Actor_MeleeRange( "meleerange" );
Event EV_Actor_MeleeDamage( "meleedamage" );
Event EV_Actor_Melee( "melee" );
Event EV_Actor_AttackFinished( "attack_finished" );
Event EV_Actor_CanStrafe( "canstrafe" );
Event EV_Actor_NoStrafe( "nostrafe" );
Event EV_Actor_PainThreshold( "painthreshold" );
Event EV_Actor_SetKillThread( "killthread" );
Event EV_Actor_AttackRange( "attackrange" );
Event EV_Actor_ShotsPerAttack( "shotsperattack" );
Event EV_Actor_ClearEnemy( "clearenemy" );
Event EV_Actor_AttackMode( "attackmode" );
Event EV_Actor_EyePositionOffset( "eyeoffset" );
Event EV_Actor_NoDeathFade( "nodeathfade" );
Event EV_Actor_NoChatter( "nochatter" );
Event EV_Actor_TurnSpeed( "turnspeed" );
ResponseDef StateInfo::Responses[] =
{
{ NULL, NULL }
};
CLASS_DECLARATION( Class, StateInfo, NULL );
StateInfo::StateInfo()
{
ignore = true;
}
ResponseDef Actor::Responses[] =
{
{ &EV_Activate, ( Response )Actor::ActivateEvent },
{ &EV_Use, ( Response )Actor::UseEvent },
{ &EV_Actor_Start, ( Response )Actor::Start },
{ &EV_Pain, ( Response )Actor::Pain },
{ &EV_Killed, ( Response )Actor::Killed },
{ &EV_Actor_Dead, ( Response )Actor::Dead },
{ &EV_Actor_TargetEnemies, ( Response )Actor::TargetEnemies },
{ &EV_Actor_SetBehavior, ( Response )Actor::SetBehaviorEvent },
{ &EV_Actor_ForwardSpeed, ( Response )Actor::ForwardSpeedEvent },
{ &EV_Actor_CrouchSize, ( Response )Actor::CrouchSize },
{ &EV_Actor_Fov, ( Response )Actor::SetFov },
{ &EV_Actor_VisionDistance, ( Response )Actor::SetVisionDistance },
{ &EV_Actor_Friend, ( Response )Actor::FriendEvent },
{ &EV_Actor_Civilian, ( Response )Actor::CivilianEvent },
{ &EV_Actor_Enemy, ( Response )Actor::EnemyEvent },
{ &EV_Actor_Monster, ( Response )Actor::MonsterEvent },
{ &EV_Actor_Animal, ( Response )Actor::AnimalEvent },
{ &EV_Actor_Inanimate, ( Response )Actor::InanimateEvent },
{ &EV_Actor_Swim, ( Response )Actor::SwimEvent },
{ &EV_Actor_Fly, ( Response )Actor::FlyEvent },
{ &EV_Actor_NotLand, ( Response )Actor::NotLandEvent },
{ &EV_Gib, ( Response )Actor::GibEvent },
// Scripting
{ &EV_Actor_DefineState, ( Response )Actor::DefineStateEvent },
{ &EV_Actor_CopyState, ( Response )Actor::CopyStateEvent },
{ &EV_Actor_IgnoreAll, ( Response )Actor::IgnoreAllEvent },
{ &EV_Actor_RespondToAll, ( Response )Actor::RespondToAllEvent },
{ &EV_Actor_RespondTo, ( Response )Actor::RespondToEvent },
{ &EV_Actor_Ignore, ( Response )Actor::IgnoreEvent },
{ &EV_Actor_IgnoreSounds, ( Response )Actor::IgnoreSoundsEvent },
{ &EV_Actor_RespondToSounds, ( Response )Actor::RespondToSoundsEvent },
{ &EV_Actor_ClearState, ( Response )Actor::ClearStateEvent },
{ &EV_ScriptThread_End, ( Response )Actor::StateDoneEvent },
{ &EV_Actor_SetState, ( Response )Actor::SetStateEvent },
{ &EV_Actor_Script, ( Response )Actor::SetScript },
{ &EV_Actor_Thread, ( Response )Actor::SetThread },
{ &EV_Actor_IfEnemyVisible, ( Response )Actor::IfEnemyVisibleEvent },
{ &EV_Actor_IfNear, ( Response )Actor::IfNearEvent },
{ &EV_Actor_Idle, ( Response )Actor::IdleEvent },
{ &EV_ProcessCommands, ( Response )Actor::StartMove },
{ &EV_Actor_LookAt, ( Response )Actor::LookAt },
{ &EV_Actor_TurnTo, ( Response )Actor::TurnToEvent },
{ &EV_Actor_FinishedBehavior, ( Response )Actor::FinishedBehavior },
{ &EV_Actor_NotifyBehavior, ( Response )Actor::NotifyBehavior },
{ &EV_Actor_WalkTo, ( Response )Actor::WalkTo },
{ &EV_Actor_JumpTo, ( Response )Actor::JumpToEvent },
{ &EV_Actor_RunTo, ( Response )Actor::RunTo },
{ &EV_Actor_Anim, ( Response )Actor::Anim },
{ &EV_Actor_Attack, ( Response )Actor::AttackEntity },
{ &EV_Actor_AttackPlayer, ( Response )Actor::AttackPlayer },
{ &EV_Actor_Remove, ( Response )Actor::RemoveUselessBody },
{ &EV_Actor_ForwardToBehavior,( Response )Actor::ForwardBehaviorEvent },
{ &EV_Actor_ReserveNode, ( Response )Actor::ReserveNodeEvent },
{ &EV_Actor_ReleaseNode, ( Response )Actor::ReleaseNodeEvent },
{ &EV_Actor_IfCanHideAt, ( Response )Actor::IfCanHideAtEvent },
{ &EV_Actor_IfCanStrafeAttack,( Response )Actor::IfCanStrafeAttackEvent },
{ &EV_Actor_IfCanMeleeAttack, ( Response )Actor::IfCanMeleeAttackEvent },
{ &EV_Actor_IfCanShoot, ( Response )Actor::IfCanShootEvent },
{ &EV_Actor_IfEnemyWithin, ( Response )Actor::IfEnemyWithinEvent },
{ &EV_HeardWeapon, ( Response )Actor::InvestigateWeaponSound },
{ &EV_HeardMovement, ( Response )Actor::InvestigateMovementSound },
{ &EV_HeardPain, ( Response )Actor::InvestigatePainSound },
{ &EV_HeardDeath, ( Response )Actor::InvestigateDeathSound },
{ &EV_HeardBreaking, ( Response )Actor::InvestigateBreakingSound },
{ &EV_HeardDoor, ( Response )Actor::InvestigateDoorSound },
{ &EV_HeardMutant, ( Response )Actor::InvestigateMutantSound },
{ &EV_HeardVoice, ( Response )Actor::InvestigateVoiceSound },