as released 2000-03-27

This commit is contained in:
archive 2000-03-27 00:00:00 +00:00
commit 90e43103b3
106 changed files with 228697 additions and 0 deletions

28
examples/makemdx.qdt Normal file
View file

@ -0,0 +1,28 @@
// This is an example kpdata script, used to convert a bunch of .md2 files into a single .mdx file.
//
// A line that starts with // is considered a comment, and ignored by kpdata.
//
// To create a .mdx file, you first need to create a bunch of .md2 files (standard Quake2 models),
// you would then use kpdata, to create the .mdx file, using the $mdx command.
//
// The format of the $mdx command is:
//
// $mdx (mdx_name) -objects {md2 md2 ..}
//
// So, for example..
$mdx bitch_body -objects bitch_rarm bitch_larm bitch_torso bitch_rhand bitch_lhand
// Would create a file called bitch_body.mdx in the current directory, composed of the given .md2 files.
//
// Each .md2 files becomes an object with it's own bounding box, within the .mdx file. Assuming
// the game code is written to use those bounding boxes, you will be able to shoot individual limbs
// on the new character.
//
// You can create an .mdx made of just a single .md2 file, although it will behave exactly the same as
// the .md2 file. Kingpin supports the .md2 file format also, so doing this would be pointless.
//
// NOTE: if you intend on using this process to create a PPM (plugin player model) for Kingpin, your
// model MUST consist of the same models that exist in the existing player folders
// (head.mdx, body.mdx, legs.mdx). Also, player models must not contain any skins explicitly listed
// inside the .mdx. Doing so will cause problems within the game.

8624
examples/maps/bar_sy.map Normal file

File diff suppressed because it is too large Load diff

15025
examples/maps/rival_teams.map Normal file

File diff suppressed because it is too large Load diff

49824
examples/maps/rtpv20.map Normal file

File diff suppressed because it is too large Load diff

37007
examples/maps/sr1.map Normal file

File diff suppressed because it is too large Load diff

1375
gamesrc/AI_BITCH.C Normal file

File diff suppressed because it is too large Load diff

932
gamesrc/AI_BITCH.H Normal file
View file

@ -0,0 +1,932 @@
#define FRAME_boredA_01 0
#define FRAME_boredA_02 1
#define FRAME_boredA_03 2
#define FRAME_boredA_04 3
#define FRAME_boredA_05 4
#define FRAME_boredA_06 5
#define FRAME_boredA_07 6
#define FRAME_boredA_08 7
#define FRAME_boredA_09 8
#define FRAME_boredA_10 9
#define FRAME_boredA_11 10
#define FRAME_boredA_12 11
#define FRAME_boredA_13 12
#define FRAME_boredA_14 13
#define FRAME_boredA_15 14
#define FRAME_boredA_16 15
#define FRAME_boredA_17 16
#define FRAME_boredA_18 17
#define FRAME_boredA_19 18
#define FRAME_boredA_20 19
#define FRAME_boredA_21 20
#define FRAME_boredA_22 21
#define FRAME_boredA_23 22
#define FRAME_boredA_24 23
#define FRAME_boredA_25 24
#define FRAME_boredA_26 25
#define FRAME_boredA_27 26
#define FRAME_boredA_28 27
#define FRAME_boredA_29 28
#define FRAME_boredA_30 29
#define FRAME_boredA_31 30
#define FRAME_boredA_32 31
#define FRAME_boredA_33 32
#define FRAME_boredA_34 33
#define FRAME_boredA_35 34
#define FRAME_boredA_36 35
#define FRAME_boredA_37 36
#define FRAME_boredA_38 37
#define FRAME_boredA_39 38
#define FRAME_boredA_40 39
#define FRAME_boredA_41 40
#define FRAME_boredA_42 41
#define FRAME_boredA_43 42
#define FRAME_boredA_44 43
#define FRAME_boredA_45 44
#define FRAME_boredA_46 45
#define FRAME_boredA_47 46
#define FRAME_boredA_48 47
#define FRAME_leanlook_01 48
#define FRAME_leanlook_02 49
#define FRAME_leanlook_03 50
#define FRAME_leanlook_04 51
#define FRAME_leanlook_05 52
#define FRAME_leanlook_06 53
#define FRAME_leanlook_07 54
#define FRAME_leanlook_08 55
#define FRAME_leanlook_09 56
#define FRAME_leanlook_10 57
#define FRAME_leanlook_11 58
#define FRAME_leanlook_12 59
#define FRAME_leanlook_13 60
#define FRAME_leanlook_14 61
#define FRAME_leanlook_15 62
#define FRAME_leanlook_16 63
#define FRAME_leanlook_17 64
#define FRAME_leanlook_18 65
#define FRAME_leanlook_19 66
#define FRAME_leanlook_20 67
#define FRAME_leanlook_21 68
#define FRAME_leanlook_22 69
#define FRAME_leanlook_23 70
#define FRAME_leanlook_24 71
#define FRAME_leanlook_25 72
#define FRAME_leanlook_26 73
#define FRAME_leanlook_27 74
#define FRAME_leanlook_28 75
#define FRAME_leanlook_29 76
#define FRAME_leanlook_30 77
#define FRAME_leanlook_31 78
#define FRAME_leanlook_32 79
#define FRAME_leanlook_33 80
#define FRAME_leanlook_34 81
#define FRAME_leanlook_35 82
#define FRAME_leanlook_36 83
#define FRAME_leanlook_37 84
#define FRAME_leanlook_38 85
#define FRAME_leanlook_39 86
#define FRAME_leanwave_01 87
#define FRAME_leanwave_02 88
#define FRAME_leanwave_03 89
#define FRAME_leanwave_04 90
#define FRAME_leanwave_05 91
#define FRAME_leanwave_06 92
#define FRAME_leanwave_07 93
#define FRAME_leanwave_08 94
#define FRAME_leanwave_09 95
#define FRAME_leanwave_10 96
#define FRAME_leanwave_11 97
#define FRAME_leanwave_12 98
#define FRAME_leanwave_13 99
#define FRAME_leanwave_14 100
#define FRAME_leanwave_15 101
#define FRAME_leanwave_16 102
#define FRAME_leanwave_17 103
#define FRAME_leanwave_18 104
#define FRAME_leanwave_19 105
#define FRAME_leanwave_20 106
#define FRAME_leanwave_21 107
#define FRAME_leanwave_22 108
#define FRAME_leanwave_23 109
#define FRAME_leanwave_24 110
#define FRAME_leanwave_25 111
#define FRAME_leanwave_26 112
#define FRAME_leanwave_27 113
#define FRAME_leanwave_28 114
#define FRAME_leanwave_29 115
#define FRAME_leanwave_30 116
#define FRAME_leanwave_31 117
#define FRAME_leanwave_32 118
#define FRAME_leanwave_33 119
#define FRAME_whatsup_01 120
#define FRAME_whatsup_02 121
#define FRAME_whatsup_03 122
#define FRAME_whatsup_04 123
#define FRAME_whatsup_05 124
#define FRAME_whatsup_06 125
#define FRAME_whatsup_07 126
#define FRAME_whatsup_08 127
#define FRAME_whatsup_09 128
#define FRAME_whatsup_10 129
#define FRAME_whatsup_11 130
#define FRAME_whatsup_12 131
#define FRAME_whatsup_13 132
#define FRAME_whatsup_14 133
#define FRAME_whatsup_15 134
#define FRAME_whatsup_16 135
#define FRAME_whatsup_17 136
#define FRAME_whatsup_18 137
#define FRAME_whatsup_19 138
#define FRAME_whatsup_20 139
#define FRAME_whatsup_21 140
#define FRAME_whatsup_22 141
#define FRAME_whatsup_23 142
#define FRAME_whatsup_24 143
#define FRAME_whatsup_25 144
#define FRAME_whatsup_26 145
#define FRAME_whatsup_27 146
#define FRAME_talkme_01 147
#define FRAME_talkme_02 148
#define FRAME_talkme_03 149
#define FRAME_talkme_04 150
#define FRAME_talkme_05 151
#define FRAME_talkme_06 152
#define FRAME_talkme_07 153
#define FRAME_talkme_08 154
#define FRAME_talkme_09 155
#define FRAME_talkme_10 156
#define FRAME_talkme_11 157
#define FRAME_talkme_12 158
#define FRAME_talkme_13 159
#define FRAME_talkme_14 160
#define FRAME_talkme_15 161
#define FRAME_talkme_16 162
#define FRAME_talkme_17 163
#define FRAME_talkme_18 164
#define FRAME_talkme_19 165
#define FRAME_talkme_20 166
#define FRAME_nonono_01 167
#define FRAME_nonono_02 168
#define FRAME_nonono_03 169
#define FRAME_nonono_04 170
#define FRAME_nonono_05 171
#define FRAME_nonono_06 172
#define FRAME_nonono_07 173
#define FRAME_nonono_08 174
#define FRAME_nonono_09 175
#define FRAME_nonono_10 176
#define FRAME_nonono_11 177
#define FRAME_nonono_12 178
#define FRAME_nonono_13 179
#define FRAME_nonono_14 180
#define FRAME_nonono_15 181
#define FRAME_nonono_16 182
#define FRAME_nonono_17 183
#define FRAME_nonono_18 184
#define FRAME_nonono_19 185
#define FRAME_nonono_20 186
#define FRAME_nonono_21 187
#define FRAME_nonono_22 188
#define FRAME_nonono_23 189
#define FRAME_nonono_24 190
#define FRAME_nonono_25 191
#define FRAME_nonono_26 192
#define FRAME_comeon_01 193
#define FRAME_comeon_02 194
#define FRAME_comeon_03 195
#define FRAME_comeon_04 196
#define FRAME_comeon_05 197
#define FRAME_comeon_06 198
#define FRAME_comeon_07 199
#define FRAME_comeon_08 200
#define FRAME_comeon_09 201
#define FRAME_comeon_10 202
#define FRAME_comeon_11 203
#define FRAME_comeon_12 204
#define FRAME_comeon_13 205
#define FRAME_comeon_14 206
#define FRAME_comeon_15 207
#define FRAME_comeon_16 208
#define FRAME_comeon_17 209
#define FRAME_comeon_18 210
#define FRAME_comeon_19 211
#define FRAME_comeon_20 212
#define FRAME_getdown_01 213
#define FRAME_getdown_02 214
#define FRAME_getdown_03 215
#define FRAME_getdown_04 216
#define FRAME_getdown_05 217
#define FRAME_getdown_06 218
#define FRAME_getdown_07 219
#define FRAME_getdown_08 220
#define FRAME_getdown_09 221
#define FRAME_getdown_10 222
#define FRAME_getdown_11 223
#define FRAME_getdown_12 224
#define FRAME_getdown_13 225
#define FRAME_getdown_14 226
#define FRAME_getdown_15 227
#define FRAME_getdown_16 228
#define FRAME_getdown_17 229
#define FRAME_getdown_18 230
#define FRAME_getdown_19 231
#define FRAME_getdown_20 232
#define FRAME_getdown_21 233
#define FRAME_getdown_22 234
#define FRAME_whomw_01 235
#define FRAME_whomw_02 236
#define FRAME_whomw_03 237
#define FRAME_whomw_04 238
#define FRAME_whomw_05 239
#define FRAME_whomw_06 240
#define FRAME_whomw_07 241
#define FRAME_whomw_08 242
#define FRAME_whomw_09 243
#define FRAME_whomw_10 244
#define FRAME_whomw_11 245
#define FRAME_whomw_12 246
#define FRAME_whomw_13 247
#define FRAME_whomw_14 248
#define FRAME_whomw_15 249
#define FRAME_whomw_16 250
#define FRAME_whomw_17 251
#define FRAME_whomw_18 252
#define FRAME_whomw_19 253
#define FRAME_whomw_20 254
#define FRAME_whomw_21 255
#define FRAME_whomw_22 256
#define FRAME_whomw_23 257
#define FRAME_whomw_24 258
#define FRAME_lookself_01 259
#define FRAME_lookself_02 260
#define FRAME_lookself_03 261
#define FRAME_lookself_04 262
#define FRAME_lookself_05 263
#define FRAME_lookself_06 264
#define FRAME_lookself_07 265
#define FRAME_lookself_08 266
#define FRAME_lookself_09 267
#define FRAME_lookself_10 268
#define FRAME_lookself_11 269
#define FRAME_lookself_12 270
#define FRAME_lookself_13 271
#define FRAME_lookself_14 272
#define FRAME_lookself_15 273
#define FRAME_lookself_16 274
#define FRAME_lookself_17 275
#define FRAME_lookself_18 276
#define FRAME_lookself_19 277
#define FRAME_lookself_20 278
#define FRAME_lookself_21 279
#define FRAME_lookself_22 280
#define FRAME_lookself_23 281
#define FRAME_lookself_24 282
#define FRAME_lookself_25 283
#define FRAME_lookself_26 284
#define FRAME_lookself_27 285
#define FRAME_lookself_28 286
#define FRAME_lookself_29 287
#define FRAME_lookself_30 288
#define FRAME_lookself_31 289
#define FRAME_lookself_32 290
#define FRAME_lookself_33 291
#define FRAME_lookself_34 292
#define FRAME_flirt_01 293
#define FRAME_flirt_02 294
#define FRAME_flirt_03 295
#define FRAME_flirt_04 296
#define FRAME_flirt_05 297
#define FRAME_flirt_06 298
#define FRAME_flirt_07 299
#define FRAME_flirt_08 300
#define FRAME_flirt_09 301
#define FRAME_flirt_10 302
#define FRAME_flirt_11 303
#define FRAME_flirt_12 304
#define FRAME_flirt_13 305
#define FRAME_flirt_14 306
#define FRAME_flirt_15 307
#define FRAME_flirt_16 308
#define FRAME_flirt_17 309
#define FRAME_flirt_18 310
#define FRAME_flirt_19 311
#define FRAME_flirt_20 312
#define FRAME_flirt_21 313
#define FRAME_flirt_22 314
#define FRAME_flirt_23 315
#define FRAME_flirt_24 316
#define FRAME_flirt_25 317
#define FRAME_flirt_26 318
#define FRAME_flirt_27 319
#define FRAME_flirt_28 320
#define FRAME_flirt_29 321
#define FRAME_flirt_30 322
#define FRAME_flirt_31 323
#define FRAME_flirt_32 324
#define FRAME_flirt_33 325
#define FRAME_walk_shoot_01 326
#define FRAME_walk_shoot_02 327
#define FRAME_walk_shoot_03 328
#define FRAME_walk_shoot_04 329
#define FRAME_walk_shoot_05 330
#define FRAME_walk_shoot_06 331
#define FRAME_walk_shoot_07 332
#define FRAME_walk_shoot_08 333
#define FRAME_walk_shoot_09 334
#define FRAME_walk_shoot_10 335
#define FRAME_walk_shoot_11 336
#define FRAME_walk_guns_dn_01 337
#define FRAME_walk_guns_dn_02 338
#define FRAME_walk_guns_dn_03 339
#define FRAME_walk_guns_dn_04 340
#define FRAME_walk_guns_dn_05 341
#define FRAME_walk_guns_dn_06 342
#define FRAME_walk_guns_dn_07 343
#define FRAME_walk_guns_dn_08 344
#define FRAME_walk_guns_dn_09 345
#define FRAME_walk_guns_dn_10 346
#define FRAME_walk_guns_dn_11 347
#define FRAME_run_shoot_01 348
#define FRAME_run_shoot_02 349
#define FRAME_run_shoot_03 350
#define FRAME_run_shoot_04 351
#define FRAME_run_shoot_05 352
#define FRAME_run_shoot_06 353
#define FRAME_run_shoot_07 354
#define FRAME_run_guns_dn_01 355
#define FRAME_run_guns_dn_02 356
#define FRAME_run_guns_dn_03 357
#define FRAME_run_guns_dn_04 358
#define FRAME_run_guns_dn_05 359
#define FRAME_run_guns_dn_06 360
#define FRAME_run_guns_dn_07 361
#define FRAME_lside_run_01 362
#define FRAME_lside_run_02 363
#define FRAME_lside_run_03 364
#define FRAME_lside_run_04 365
#define FRAME_lside_run_05 366
#define FRAME_lside_run_06 367
#define FRAME_lside_run_07 368
#define FRAME_rside_run_01 369
#define FRAME_rside_run_02 370
#define FRAME_rside_run_03 371
#define FRAME_rside_run_04 372
#define FRAME_rside_run_05 373
#define FRAME_rside_run_06 374
#define FRAME_rside_run_07 375
#define FRAME_run_on_fire_01 376
#define FRAME_run_on_fire_02 377
#define FRAME_run_on_fire_03 378
#define FRAME_run_on_fire_04 379
#define FRAME_run_on_fire_05 380
#define FRAME_run_on_fire_06 381
#define FRAME_run_on_fire_07 382
#define FRAME_run_on_fire_08 383
#define FRAME_run_on_fire_09 384
#define FRAME_run_on_fire_10 385
#define FRAME_run_on_fire_11 386
#define FRAME_run_on_fire_12 387
#define FRAME_run_on_fire_13 388
#define FRAME_evd_walk_01 389
#define FRAME_evd_walk_02 390
#define FRAME_evd_walk_03 391
#define FRAME_evd_walk_04 392
#define FRAME_evd_walk_05 393
#define FRAME_evd_walk_06 394
#define FRAME_evd_walk_07 395
#define FRAME_evd_amb_01 396
#define FRAME_evd_amb_02 397
#define FRAME_evd_amb_03 398
#define FRAME_evd_amb_04 399
#define FRAME_evd_amb_05 400
#define FRAME_evd_amb_06 401
#define FRAME_evd_amb_07 402
#define FRAME_evd_amb_08 403
#define FRAME_evd_amb_09 404
#define FRAME_evd_amb_10 405
#define FRAME_evd_amb_11 406
#define FRAME_pull_gun_01 407
#define FRAME_pull_gun_02 408
#define FRAME_pull_gun_03 409
#define FRAME_pull_gun_04 410
#define FRAME_pull_gun_05 411
#define FRAME_pull_gun_06 412
#define FRAME_pull_gun_07 413
#define FRAME_pull_gun_08 414
#define FRAME_stand_shoot_01 415
#define FRAME_stand_shoot_02 416
#define FRAME_stand_shoot_03 417
#define FRAME_stand_shoot_04 418
#define FRAME_stand_shoot_05 419
#define FRAME_reload_01 420
#define FRAME_reload_02 421
#define FRAME_reload_03 422
#define FRAME_reload_04 423
#define FRAME_reload_05 424
#define FRAME_reload_06 425
#define FRAME_reload_07 426
#define FRAME_reload_08 427
#define FRAME_reload_09 428
#define FRAME_reload_10 429
#define FRAME_reload_11 430
#define FRAME_reload_12 431
#define FRAME_reload_13 432
#define FRAME_reload_14 433
#define FRAME_reload_15 434
#define FRAME_reload_16 435
#define FRAME_reload_17 436
#define FRAME_reload_18 437
#define FRAME_reload_19 438
#define FRAME_reload_20 439
#define FRAME_p_pain_chst_01 440
#define FRAME_p_pain_chst_02 441
#define FRAME_p_pain_chst_03 442
#define FRAME_p_pain_chst_04 443
#define FRAME_p_pain_chst_05 444
#define FRAME_p_pain_chst_06 445
#define FRAME_p_pain_rshd_01 446
#define FRAME_p_pain_rshd_02 447
#define FRAME_p_pain_rshd_03 448
#define FRAME_p_pain_rshd_04 449
#define FRAME_p_pain_rshd_05 450
#define FRAME_p_pain_rshd_06 451
#define FRAME_p_pain_rshd_07 452
#define FRAME_p_pain_lshd_01 453
#define FRAME_p_pain_lshd_02 454
#define FRAME_p_pain_lshd_03 455
#define FRAME_p_pain_lshd_04 456
#define FRAME_p_pain_lshd_05 457
#define FRAME_p_pain_lshd_06 458
#define FRAME_p_pain_rshd2_01 459
#define FRAME_p_pain_rshd2_02 460
#define FRAME_p_pain_rshd2_03 461
#define FRAME_p_pain_rshd2_04 462
#define FRAME_p_pain_rshd2_05 463
#define FRAME_p_pain_rleg_01 464
#define FRAME_p_pain_rleg_02 465
#define FRAME_p_pain_rleg_03 466
#define FRAME_p_pain_rleg_04 467
#define FRAME_p_pain_rleg_05 468
#define FRAME_p_pain_rleg_06 469
#define FRAME_p_pain_rleg_07 470
#define FRAME_p_pain_rleg_08 471
#define FRAME_p_pain_lleg_01 472
#define FRAME_p_pain_lleg_02 473
#define FRAME_p_pain_lleg_03 474
#define FRAME_p_pain_lleg_04 475
#define FRAME_p_pain_lleg_05 476
#define FRAME_p_pain_lleg_06 477
#define FRAME_p_pain_lleg_07 478
#define FRAME_p_pain_crch_01 479
#define FRAME_p_pain_crch_02 480
#define FRAME_p_pain_crch_03 481
#define FRAME_p_pain_crch_04 482
#define FRAME_p_pain_crch_05 483
#define FRAME_p_pain_crch_06 484
#define FRAME_p_pain_crch_07 485
#define FRAME_p_pain_butt_01 486
#define FRAME_p_pain_butt_02 487
#define FRAME_p_pain_butt_03 488
#define FRAME_p_pain_butt_04 489
#define FRAME_p_pain_butt_05 490
#define FRAME_p_pain_butt_06 491
#define FRAME_p_pain_butt_07 492
#define FRAME_p_pain_butt_08 493
#define FRAME_p_pain_butt_09 494
#define FRAME_p_pain_butt_10 495
#define FRAME_p_pain_butt_11 496
#define FRAME_p_pain_butt_12 497
#define FRAME_p_pain_butt_13 498
#define FRAME_p_pain_lshd2_01 499
#define FRAME_p_pain_lshd2_02 500
#define FRAME_p_pain_lshd2_03 501
#define FRAME_p_pain_lshd2_04 502
#define FRAME_p_pain_lshd2_05 503
#define FRAME_p_pain_lshd2_06 504
#define FRAME_p_pain_lshd2_07 505
#define FRAME_p_pain_lshd2_08 506
#define FRAME_p_pain_lshd2_09 507
#define FRAME_p_pain_rleg2_01 508
#define FRAME_p_pain_rleg2_02 509
#define FRAME_p_pain_rleg2_03 510
#define FRAME_p_pain_rleg2_04 511
#define FRAME_p_pain_rleg2_05 512
#define FRAME_p_pain_rleg2_06 513
#define FRAME_p_pain_rleg2_07 514
#define FRAME_p_pain_rleg2_08 515
#define FRAME_p_pain_rleg2_09 516
#define FRAME_p_pain_rleg2_10 517
#define FRAME_p_pain_lleg2_01 518
#define FRAME_p_pain_lleg2_02 519
#define FRAME_p_pain_lleg2_03 520
#define FRAME_p_pain_lleg2_04 521
#define FRAME_p_pain_lleg2_05 522
#define FRAME_p_pain_lleg2_06 523
#define FRAME_p_pain_lleg2_07 524
#define FRAME_p_pain_crch2_01 525
#define FRAME_p_pain_crch2_02 526
#define FRAME_p_pain_crch2_03 527
#define FRAME_p_pain_crch2_04 528
#define FRAME_p_pain_crch2_05 529
#define FRAME_p_pain_crch2_06 530
#define FRAME_p_pain_butt2_01 531
#define FRAME_p_pain_butt2_02 532
#define FRAME_p_pain_butt2_03 533
#define FRAME_p_pain_butt2_04 534
#define FRAME_p_pain_butt2_05 535
#define FRAME_p_pain_butt2_06 536
#define FRAME_p_pain_butt2_07 537
#define FRAME_p_pain_butt2_08 538
#define FRAME_p_pain_head2_01 539
#define FRAME_p_pain_head2_02 540
#define FRAME_p_pain_head2_03 541
#define FRAME_p_pain_head2_04 542
#define FRAME_death1_01 543
#define FRAME_death1_02 544
#define FRAME_death1_03 545
#define FRAME_death1_04 546
#define FRAME_death1_05 547
#define FRAME_death1_06 548
#define FRAME_death1_07 549
#define FRAME_death1_08 550
#define FRAME_death1_09 551
#define FRAME_death1_10 552
#define FRAME_death1_11 553
#define FRAME_death1_12 554
#define FRAME_death1_13 555
#define FRAME_death1_14 556
#define FRAME_death1_15 557
#define FRAME_death2_01 558
#define FRAME_death2_02 559
#define FRAME_death2_03 560
#define FRAME_death2_04 561
#define FRAME_death2_05 562
#define FRAME_death2_06 563
#define FRAME_death2_07 564
#define FRAME_death2_08 565
#define FRAME_death2_09 566
#define FRAME_death2_10 567
#define FRAME_death2_11 568
#define FRAME_death2_12 569
#define FRAME_death2_13 570
#define FRAME_death2_14 571
#define FRAME_death2_15 572
#define FRAME_death2_16 573
#define FRAME_death3_01 574
#define FRAME_death3_02 575
#define FRAME_death3_03 576
#define FRAME_death3_04 577
#define FRAME_death3_05 578
#define FRAME_death3_06 579
#define FRAME_death3_07 580
#define FRAME_death3_08 581
#define FRAME_death3_09 582
#define FRAME_death3_10 583
#define FRAME_death3_11 584
#define FRAME_death3_12 585
#define FRAME_death3_13 586
#define FRAME_death3_14 587
#define FRAME_death3_15 588
#define FRAME_death3_16 589
#define FRAME_death4_01 590
#define FRAME_death4_02 591
#define FRAME_death4_03 592
#define FRAME_death4_04 593
#define FRAME_death4_05 594
#define FRAME_death4_06 595
#define FRAME_death4_07 596
#define FRAME_death4_08 597
#define FRAME_death4_09 598
#define FRAME_death4_10 599
#define FRAME_death4_11 600
#define FRAME_death4_12 601
#define FRAME_death4_13 602
#define FRAME_death4_14 603
#define FRAME_death4_15 604
#define FRAME_death4_16 605
#define FRAME_death4_17 606
#define FRAME_death4_18 607
#define FRAME_death4_19 608
#define FRAME_death4_20 609
#define FRAME_death4_21 610
#define FRAME_death4_22 611
#define FRAME_death5_01 612
#define FRAME_death5_02 613
#define FRAME_death5_03 614
#define FRAME_death5_04 615
#define FRAME_death5_05 616
#define FRAME_death5_06 617
#define FRAME_death5_07 618
#define FRAME_death5_08 619
#define FRAME_death5_09 620
#define FRAME_death5_10 621
#define FRAME_death5_11 622
#define FRAME_death5_12 623
#define FRAME_death5_13 624
#define FRAME_death5_14 625
#define FRAME_death5_15 626
#define FRAME_death5_16 627
#define FRAME_death5_17 628
#define FRAME_death5_18 629
#define FRAME_death5_19 630
#define FRAME_death5_20 631
#define FRAME_death5_21 632
#define FRAME_death5_22 633
#define FRAME_death5_23 634
#define FRAME_death5_24 635
#define FRAME_death5_25 636
#define FRAME_death5_26 637
#define FRAME_death5_27 638
#define FRAME_death5_28 639
#define FRAME_death5_29 640
#define FRAME_death5_30 641
#define FRAME_death5_31 642
#define FRAME_death5_32 643
#define FRAME_death5_33 644
#define FRAME_stnd2melee_01 645
#define FRAME_stnd2melee_02 646
#define FRAME_stnd2melee_03 647
#define FRAME_stnd2melee_04 648
#define FRAME_melee2stnd_01 649
#define FRAME_melee2stnd_02 650
#define FRAME_melee2stnd_03 651
#define FRAME_melee2stnd_04 652
#define FRAME_melee2stnd_05 653
#define FRAME_melee_amb_01 654
#define FRAME_melee_amb_02 655
#define FRAME_melee_amb_03 656
#define FRAME_melee_amb_04 657
#define FRAME_melee_amb_05 658
#define FRAME_melee_amb_06 659
#define FRAME_melee_amb_07 660
#define FRAME_melee_amb_08 661
#define FRAME_low_melee1_01 662
#define FRAME_low_melee1_02 663
#define FRAME_low_melee1_03 664
#define FRAME_low_melee1_04 665
#define FRAME_low_melee1_05 666
#define FRAME_low_melee1_06 667
#define FRAME_melee1_01 668
#define FRAME_melee1_02 669
#define FRAME_melee1_03 670
#define FRAME_melee1_04 671
#define FRAME_melee1_05 672
#define FRAME_melee1_06 673
#define FRAME_melee1_07 674
#define FRAME_melee1_08 675
#define FRAME_melee1_09 676
#define FRAME_melee1_10 677
#define FRAME_melee1_11 678
#define FRAME_melee1_12 679
#define FRAME_melee1_13 680
#define FRAME_melee1_14 681
#define FRAME_melee1_15 682
#define FRAME_melee1_16 683
#define FRAME_melee1_17 684
#define FRAME_melee1_18 685
#define FRAME_melee2_01 686
#define FRAME_melee2_02 687
#define FRAME_melee2_03 688
#define FRAME_melee2_04 689
#define FRAME_melee2_05 690
#define FRAME_melee2_06 691
#define FRAME_melee2_07 692
#define FRAME_melee2_08 693
#define FRAME_melee2_09 694
#define FRAME_melee2_10 695
#define FRAME_melee3_01 696
#define FRAME_melee3_02 697
#define FRAME_melee3_03 698
#define FRAME_melee3_04 699
#define FRAME_melee3_05 700
#define FRAME_melee3_06 701
#define FRAME_melee3_07 702
#define FRAME_melee3_08 703
#define FRAME_melee3_09 704
#define FRAME_melee3_10 705
#define FRAME_melee3_11 706
#define FRAME_melee3_12 707
#define FRAME_melee3_13 708
#define FRAME_melee3_14 709
#define FRAME_melee3_15 710
#define FRAME_melee3_16 711
#define FRAME_melee3_17 712
#define FRAME_melee3_18 713
#define FRAME_run_melee_01 714
#define FRAME_run_melee_02 715
#define FRAME_run_melee_03 716
#define FRAME_run_melee_04 717
#define FRAME_run_melee_05 718
#define FRAME_run_melee_06 719
#define FRAME_run_melee_07 720
#define FRAME_jump_01 721
#define FRAME_jump_02 722
#define FRAME_jump_03 723
#define FRAME_jump_04 724
#define FRAME_jump_05 725
#define FRAME_jump_06 726
#define FRAME_jump_07 727
#define FRAME_jump_08 728
#define FRAME_jump_09 729
#define FRAME_jump_10 730
#define FRAME_lside_step_01 731
#define FRAME_lside_step_02 732
#define FRAME_lside_step_03 733
#define FRAME_lside_step_04 734
#define FRAME_lside_step_05 735
#define FRAME_lside_step_06 736
#define FRAME_rside_step_01 737
#define FRAME_rside_step_02 738
#define FRAME_rside_step_03 739
#define FRAME_rside_step_04 740
#define FRAME_clmb_loop_01 741
#define FRAME_clmb_loop_02 742
#define FRAME_clmb_loop_03 743
#define FRAME_clmb_loop_04 744
#define FRAME_clmb_loop_05 745
#define FRAME_clmb_loop_06 746
#define FRAME_clmb_loop_07 747
#define FRAME_clmb_loop_08 748
#define FRAME_clmb_loop_09 749
#define FRAME_clmb_loop_10 750
#define FRAME_clmb_loop_11 751
#define FRAME_st_climb_01 752
#define FRAME_st_climb_02 753
#define FRAME_st_climb_03 754
#define FRAME_st_climb_04 755
#define FRAME_st_climb_05 756
#define FRAME_st_climb_06 757
#define FRAME_st_climb_07 758
#define FRAME_st_climb_08 759
#define FRAME_crch_dth1_01 760
#define FRAME_crch_dth1_02 761
#define FRAME_crch_dth1_03 762
#define FRAME_crch_dth1_04 763
#define FRAME_crch_dth1_05 764
#define FRAME_crch_dth1_06 765
#define FRAME_crch_dth1_07 766
#define FRAME_crch_dth1_08 767
#define FRAME_crch_dth1_09 768
#define FRAME_crch_dth1_10 769
#define FRAME_crch_dth1_11 770
#define FRAME_crch_dth1_12 771
#define FRAME_crch_dth1_13 772
#define FRAME_crch_dth1_14 773
#define FRAME_crch_dth1_15 774
#define FRAME_crch_dth1_16 775
#define FRAME_crch_dth1_17 776
#define FRAME_crch_dth1_18 777
#define FRAME_crch_dth2_01 778
#define FRAME_crch_dth2_02 779
#define FRAME_crch_dth2_03 780
#define FRAME_crch_dth2_04 781
#define FRAME_crch_dth2_05 782
#define FRAME_crch_dth2_06 783
#define FRAME_crch_dth2_07 784
#define FRAME_crch_dth2_08 785
#define FRAME_crch_dth2_09 786
#define FRAME_crch_dth2_10 787
#define FRAME_crch_dth2_11 788
#define FRAME_crch_dth2_12 789
#define FRAME_crch_dth2_13 790
#define FRAME_crch_dth2_14 791
#define FRAME_crch_dth2_15 792
#define FRAME_crch_dth2_16 793
#define FRAME_crch_dth2_17 794
#define FRAME_crch_dth2_18 795
#define FRAME_crch_dth2_19 796
#define FRAME_crch_dth2_20 797
#define FRAME_crch_dth3_01 798
#define FRAME_crch_dth3_02 799
#define FRAME_crch_dth3_03 800
#define FRAME_crch_dth3_04 801
#define FRAME_crch_dth3_05 802
#define FRAME_crch_dth3_06 803
#define FRAME_crch_dth3_07 804
#define FRAME_crch_dth3_08 805
#define FRAME_crch_dth3_09 806
#define FRAME_crch_dth3_10 807
#define FRAME_crch_dth3_11 808
#define FRAME_crch_dth3_12 809
#define FRAME_crch_dth3_13 810
#define FRAME_crch_dth3_14 811
#define FRAME_crch_dth3_15 812
#define FRAME_crch_dth3_16 813
#define FRAME_crch_dth3_17 814
#define FRAME_crch_dth4_01 815
#define FRAME_crch_dth4_02 816
#define FRAME_crch_dth4_03 817
#define FRAME_crch_dth4_04 818
#define FRAME_crch_dth4_05 819
#define FRAME_crch_dth4_06 820
#define FRAME_crch_dth4_07 821
#define FRAME_crch_dth4_08 822
#define FRAME_crch_dth4_09 823
#define FRAME_crch_dth4_10 824
#define FRAME_crch_dth4_11 825
#define FRAME_crch_dth4_12 826
#define FRAME_crch_dth4_13 827
#define FRAME_crch_dth4_14 828
#define FRAME_crch_dth4_15 829
#define FRAME_crch_dth4_16 830
#define FRAME_crch_dth4_17 831
#define FRAME_crch_dth4_18 832
#define FRAME_crch_dth4_19 833
#define FRAME_crch_dth4_20 834
#define FRAME_crch_dth4_21 835
#define FRAME_crch_dth4_22 836
#define FRAME_crch_dth4_23 837
#define FRAME_crch_dth4_24 838
#define FRAME_crch_dth4_25 839
#define FRAME_crch_dth4_26 840
#define FRAME_crch_dth4_27 841
#define FRAME_crch_dth4_28 842
#define FRAME_crch_knl_dn_01 843
#define FRAME_crch_knl_dn_02 844
#define FRAME_crch_knl_dn_03 845
#define FRAME_crch_knl_dn_04 846
#define FRAME_crch_knl_dn_05 847
#define FRAME_crch_knl_dn_06 848
#define FRAME_crch_knl_dn_07 849
#define FRAME_crch_knl_dn_08 850
#define FRAME_crch_amb_std_01 851
#define FRAME_crch_amb_std_02 852
#define FRAME_crch_amb_std_03 853
#define FRAME_crch_amb_std_04 854
#define FRAME_crch_amb_std_05 855
#define FRAME_crch_amb_std_06 856
#define FRAME_crch_amb_std_07 857
#define FRAME_crch_amb_std_08 858
#define FRAME_crch_amb_std_09 859
#define FRAME_crch_amb_std_10 860
#define FRAME_crch_amb_std_11 861
#define FRAME_crch_amb_std_12 862
#define FRAME_crch_amb_std_13 863
#define FRAME_crch_amb_std_14 864
#define FRAME_crch_amb_std_15 865
#define FRAME_crch_amb_std_16 866
#define FRAME_crch_amb_std_17 867
#define FRAME_crch_amb_std_18 868
#define FRAME_crch_amb_std_19 869
#define FRAME_crch_amb_std_20 870
#define FRAME_crch_amb_std_21 871
#define FRAME_crch_amb_std_22 872
#define FRAME_crch_amb_std_23 873
#define FRAME_crch_amb_std_24 874
#define FRAME_crch_amb_std_25 875
#define FRAME_crch_amb_std_26 876
#define FRAME_crch_amb_std_27 877
#define FRAME_crch_amb_std_28 878
#define FRAME_crch_amb_std_29 879
#define FRAME_crch_amb_std_30 880
#define FRAME_crch_amb_std_31 881
#define FRAME_crch_amb_std_32 882
#define FRAME_crch_amb_std_33 883
#define FRAME_crch_amb_std_34 884
#define FRAME_crch_shoot_01 885
#define FRAME_crch_shoot_02 886
#define FRAME_crch_shoot_03 887
#define FRAME_crch_reload_01 888
#define FRAME_crch_reload_02 889
#define FRAME_crch_reload_03 890
#define FRAME_crch_reload_04 891
#define FRAME_crch_reload_05 892
#define FRAME_crch_reload_06 893
#define FRAME_crch_reload_07 894
#define FRAME_crch_reload_08 895
#define FRAME_crch_reload_09 896
#define FRAME_crch_reload_10 897
#define FRAME_crch_reload_11 898
#define FRAME_crch_reload_12 899
#define FRAME_crch_reload_13 900
#define FRAME_crch_reload_14 901
#define FRAME_crch_reload_15 902
#define FRAME_crch_reload_16 903
#define FRAME_crch_reload_17 904
#define FRAME_crch_reload_18 905
#define FRAME_crch_reload_19 906
#define FRAME_crch_reload_20 907
#define FRAME_crch_reload_21 908
#define FRAME_crch_reload_22 909
#define FRAME_crch_reload_23 910
#define FRAME_crch_reload_24 911
#define FRAME_crch_reload_25 912
#define FRAME_crch_reload_26 913
#define FRAME_crch_reload_27 914
#define FRAME_crch_reload_28 915
#define FRAME_crch_reload_29 916
#define FRAME_crch_reload_30 917
#define FRAME_crch_reload_31 918
#define FRAME_crch_reload_32 919
#define FRAME_crch_reload_33 920
#define FRAME_crch_reload_34 921
#define FRAME_crch_reload_35 922
#define FRAME_crch_walk_01 923
#define FRAME_crch_walk_02 924
#define FRAME_crch_walk_03 925
#define FRAME_crch_walk_04 926
#define FRAME_crch_walk_05 927
#define FRAME_crch_walk_06 928
#define FRAME_crch_walk_07 929
#define MODEL_SCALE 1.000000

589
gamesrc/AI_DOG.C Normal file
View file

@ -0,0 +1,589 @@
// dog
#include "g_local.h"
#include "ai_dog.h"
void dog_sound (edict_t *self);
void dog_end_stand (edict_t *self);
void dog_sound_think (edict_t *self);
void dog_melee (edict_t *self);
void dog_evade_amb (edict_t *self);
void dog_melee_bail (edict_t *self);
void dog_evade_checkadjust (edict_t *self);
void dog_evade_adjust (edict_t *self);
void dog_lick2( edict_t *self );
void dog_pounce (edict_t *self);
void dog_talk_think ( edict_t *self );
void dog_bite (edict_t *self);
void dog_bark (edict_t *self);
void dog_growl (edict_t *self);
#include "ai_dog_tables.h"
char *wuf[7] =
{
"actors/dog/dg_bark1.wav",
"actors/dog/dg_bark2.wav",
"actors/dog/dg_die.wav",
"actors/dog/dg_grwl1.wav",
"actors/dog/dg_grwl2.wav",
"actors/dog/dg_lunge.wav",
"actors/dog/dg_yelp.wav"
};
void dog_yelp (edict_t *self)
{
self->last_talk_time = level.time;
gi.sound( self, CHAN_VOICE, gi.soundindex( wuf[6] ), 1, ATTN_NORM, 0 );
}
void dog_bark (edict_t *self)
{
self->last_talk_time = level.time;
gi.sound( self, CHAN_VOICE, gi.soundindex( wuf[rand()%2] ), 1, ATTN_NORM, 0 );
}
void dog_growl (edict_t *self)
{
self->last_talk_time = level.time + 0.5; // growl lasts a bit longer
gi.sound( self, CHAN_BODY, gi.soundindex( wuf[3+rand()%3] ), 1, ATTN_NORM, 0 );
}
void dog_talk_think ( edict_t *self )
{
edict_t *talk_ent;
cast_memory_t *mem;
if (!(talk_ent = self->cast_info.talk_ent))
return;
if (VectorDistance( talk_ent->s.origin, self->s.origin ) > 600)
{
self->cast_info.talk_ent = NULL;
return;
}
if ( (self->cast_info.talk_ent == &g_edicts[1])
&& (self->cast_info.talk_ent->last_talk_time < (level.time - TALK_OTHER_DELAY*2))
&& (self->last_talk_time > (level.time - TALK_SELF_DELAY)))
{
return;
}
// if (last_client_talk && last_client_talk > (level.time - TALK_OTHER_DELAY))
// return; // don't talk too much around the client
if ((talk_ent->health <= 0) || !visible(self, talk_ent) || !infront(talk_ent, self))
{
self->cast_info.talk_ent = NULL;
return;
}
mem = level.global_cast_memory[self->character_index][talk_ent->character_index];
if (!mem || (mem->flags & MEMORY_NO_TALK))
return;
// say something!
if ( ( (self->last_talk_time < (level.time - TALK_SELF_DELAY)) // we haven't spoken for a while
|| ( (talk_ent->client || talk_ent->last_talk_time) // if they haven't spoken yet, don't bother
&& (talk_ent->last_talk_time > (level.time - TALK_OTHER_DELAY*1.5)) // or they've just said something, and we've allowed some time for them to finish saying it
&& (talk_ent->cast_info.talk_ent == self)
&& (self->last_talk_time < talk_ent->last_talk_time)
&& (self->last_talk_time < (level.time - TALK_OTHER_DELAY))))
&& (talk_ent->last_talk_time < (level.time - TALK_OTHER_DELAY)))
{
if (talk_ent->client)
{
// should we be aggressive? or friendly?
if ((self->moral < MORAL_AGGRESSIVE) || (!self->profanity_level && talk_ent->profanity_level && (self->moral < rand()%MORAL_MAX)))
{ // friendly
self->cast_info.currentmove = &dog_move_sniff;
dog_bark( self );
}
else if (self->profanity_level)
{ // attack!
AI_MakeEnemy( self, talk_ent, 0 );
dog_bark( self );
}
else // ready to attack at any second
{
self->cast_info.currentmove = &dog_move_sniff;
dog_growl (self);
self->profanity_level = 3;
}
self->last_talk_time = level.time;
if (!infront( self, talk_ent ))
{
self->cast_info.avoid( self, talk_ent, true );
}
}
}
}
void dog_end_stand( edict_t *self )
{
if (self->cast_info.move_stand_evade && (self->last_stand_evade > (level.time - 3)))
return;
if (random() <= 0.2)
{
self->cast_info.currentmove = &dog_move_sniff;
}
else if (random() <= 0.1)
{
self->cast_info.currentmove = &dog_move_bark;
dog_bark (self);
}
/*
else if ( (random() <= 0.1)
&& (AI_SideTrace( self, 32, 90, -1 )))
{
self->cast_info.currentmove = &dog_move_pee;
}
*/
else
{
self->cast_info.currentmove = self->cast_info.move_stand;
}
}
void dog_backoff( edict_t *self, edict_t *other )
{
}
void dog_pain (edict_t *self, edict_t *other, float kick, int damage, int mdx_part, int mdx_subobject)
{
int rnd;
int baseskin;//, currentskin;
baseskin = self->s.model_parts[mdx_part].baseskin;
if (self->health < (self->max_health * 0.5))
{
self->s.model_parts[PART_HEAD].skinnum[0] = baseskin + 2;
}
else if (self->health < (self->max_health * 0.75))
{
self->s.model_parts[PART_HEAD].skinnum[0] = baseskin + 1;
}
AI_CheckMakeEnemy( self, other );
if (level.time < self->pain_debounce_time)
return;
self->pain_debounce_time = level.time + 3 + random();
if (skill->value >= 3)
return; // no pain anims in nightmare
if (rand()%2)
dog_yelp (self);
// Ridah, randomly don't play an animation, since it' leaves them WAY open to be killed
if (skill->value > 0 && rand()%2)
return;
rnd = rand()%3;
switch (rnd)
{
case 0:
self->cast_info.currentmove = &dog_move_pain1;
break;
case 1:
self->cast_info.currentmove = &dog_move_pain2;
break;
case 2:
self->cast_info.currentmove = &dog_move_pain3;
break;
}
}
void dog_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int mdx_part, int mdx_subobject)
{
int rnd;
// self->s.modelindex2 = 0;
// regular death
self->takedamage = DAMAGE_YES;
if (DeathByGib(self, inflictor, attacker, damage))
{ // gib
self->deadflag = DEAD_DEAD;
GibEntity( self, inflictor, damage );
self->s.model_parts[PART_GUN].invisible_objects = (1<<0 | 1<<1);
return;
}
if (self->deadflag == DEAD_DEAD)
return;
self->deadflag = DEAD_DEAD;
// if (!self->onfiretime)
dog_yelp (self);
rnd = rand()%1;
switch (rnd)
{
case 0:
self->cast_info.currentmove = &dog_move_death1;
break;
case 1:
self->cast_info.currentmove = &dog_move_death2;
break;
}
}
qboolean dog_attack (edict_t *self)
{
vec3_t vec;
float dist;
self->cast_info.aiflags |= AI_RUN_LIKE_HELL; // dog runs really fast
VectorSubtract( self->enemy->s.origin, self->s.origin, vec );
dist = VectorNormalize( vec );
// start panting now when we stop
self->cast_info.move_stand = &dog_move_pant;
// yell at them?
if (self->last_talk_time < (level.time - 0.5*TALK_FIGHTING_DELAY))
{
if (rand()%2)
dog_bark(self);
else
dog_growl(self);
}
{
qboolean attack=false;
if (dist < 48 && VectorLength( self->enemy->velocity ) < 250)
{
attack = true;
}
else if (dist < 64)
{
attack = false; // so we do a high attack
}
else // are they running towards us?
{
VectorSubtract( self->enemy->s.origin, self->s.origin, vec );
VectorMA( vec, 0.5, self->enemy->velocity, vec );
dist = VectorNormalize( vec );
if (dist < 96)
{
attack = true;
}
}
if (attack)
{
int rnd;
self->ideal_yaw = vectoyaw(vec);
M_ChangeYaw( self );
if (vec[2] < -0.5)
{
self->cast_info.currentmove = &dog_move_low_atk;
}
else if (vec[2] < -0.1)
{
self->cast_info.currentmove = &dog_move_med_atk;
}
else if (vec[2] > 0.5)
{
self->cast_info.currentmove = &dog_move_upr_atk;
}
else if (self->enemy->maxs[2] < self->enemy->cast_info.standing_max_z)
{
self->cast_info.currentmove = &dog_move_med_atk;
}
/*
if (self->enemy->maxs[2] < 30)
{
if (rand()%10 < 8)
self->cast_info.currentmove = &dog_move_med_atk;
else
self->cast_info.currentmove = &dog_move_low_atk;
}
else if (self->maxs[2] > self->enemy->maxs[2] || self->s.origin[2] > self->enemy->s.origin[2])
{
self->cast_info.currentmove = &dog_move_low_atk;
}
else if (self->s.origin[2] < self->enemy->s.origin[2])
{
self->cast_info.currentmove = &dog_move_upr_atk;
}
*/
else
{
rnd = rand()%10;
if (dist < 48 && rnd < 4)
self->cast_info.currentmove = &dog_move_low_atk;
else if (rnd < 6)
self->cast_info.currentmove = &dog_move_med_atk;
else
self->cast_info.currentmove = &dog_move_upr_atk;
}
self->cast_info.aiflags &=~ AI_RUSH_THE_PLAYER;
return true;
}
else if (dist < 180) // Ridah, increased this to help SR4 dogs jump onto cars
{
self->ideal_yaw = vectoyaw(vec);
M_ChangeYaw( self );
self->cast_info.currentmove = &dog_move_upr_atk;
return true;
}
else if (dist < 400)
self->cast_info.aiflags |= AI_RUSH_THE_PLAYER;
}
return false;
}
void dog_bite (edict_t *self)
{
vec3_t start;//, offset;
vec3_t forward, right;
float damage = 8;
if (self->cast_info.currentmove == &dog_move_upr_atk)
damage *= 2; // double handed attack
// yell at them?
if (self->last_talk_time < (level.time - 1.0))
{
if (rand()%2)
dog_bark(self);
else
dog_growl(self);
}
// VectorSet(offset, 0, 8, self->viewheight - 4);
//VectorSet (offset, 0, 8, 16);
AngleVectors (self->s.angles, forward, right, NULL);
//G_ProjectSource (self->s.origin, offset, forward, right, start);
/*
if (self->cast_info.currentmove == &dog_move_low_atk)
start[2] -= 20;
else if (self->cast_info.currentmove == &dog_move_med_atk)
start[2] -= 8;
else if (self->cast_info.currentmove == &dog_move_upr_atk)
start[2] += 8;
*/
damage *= 0.5;
// fire_dogbite (self, start, forward, damage, 10, MOD_DOGBITE);
if (self->enemy)
{
// trace_t tr;
vec3_t aimdir, dang, end;
VectorSubtract (self->enemy->s.origin, self->s.origin, aimdir);
vectoangles (aimdir, dang);
AngleVectors (dang, forward, NULL, NULL);
VectorMA (self->s.origin, 16, forward, start);
VectorMA (start, 32, forward, end);
// ok it seems to line up with the head ok now
// NAV_DrawLine (start, end);
fire_blackjack( self, start, forward, damage, 0, MOD_DOGBITE );
/*
if (VectorLength (aimdir) < 96)
{
tr = gi.trace (start, NULL, NULL, end, self, MASK_SHOT );
if (tr.ent->takedamage)
T_Damage (tr.ent, self, self, aimdir, tr.endpos, tr.plane.normal, damage, 0, DAMAGE_BULLET, MOD_DOGBITE);
}
// ok lets see why this isnt working
else if (self->enemy->groundentity == self)
T_Damage (self->enemy, self, self, aimdir, self->enemy->s.origin, vec3_origin, damage, 0, DAMAGE_BULLET, MOD_DOGBITE);
*/
}
}
void dog_long_attack (edict_t *self)
{
}
void dog_pounce (edict_t *self)
{
if (!self->enemy)
return;
self->ideal_yaw = entyaw( self, self->enemy );
M_ChangeYaw( self );
// leap if on ground
if (self->groundentity)
{
AngleVectors( self->s.angles, self->velocity, NULL, NULL );
VectorScale( self->velocity, 500, self->velocity );
self->velocity[2] = 200;
self->groundentity = NULL;
}
}
void dog_avoid ( edict_t *self, edict_t *other, qboolean face )
{
vec3_t vec;
if (self->health <= 0)
return;
if (!self->groundentity)
return;
self->cast_info.last_avoid = level.time;
if (face)
{ // turn to face them
VectorSubtract( other->s.origin, self->s.origin, vec );
self->cast_info.avoid_ent = other;
}
else
{ // turn to face away from them
VectorSubtract( self->s.origin, other->s.origin, vec );
self->cast_info.avoid_ent = NULL;
}
VectorNormalize( vec );
self->ideal_yaw = vectoyaw( vec );
if (!AI_SideTrace( self, -64, 0, 1))
self->cast_info.currentmove = &dog_move_avoid_reverse_walk;
else
self->cast_info.currentmove = &dog_move_avoid_walk;
}
void dog_catch_fire( edict_t *self, edict_t *other )
{
self->enemy = NULL; // stop attacking
self->cast_info.currentmove = &dog_move_run_on_fire;
}
/*QUAKED cast_dog (1 .5 0) (-16 -16 -16) (16 16 22) x TRIGGERED_START x x x
Dog
cast_group defines which group the character is a member of
default cast_group is 0, which is neutral (won't help others out)
player's cast_group is 1 (friendly characters)
skin = 1 or 2
model="models\actors\dog\"
*/
void SP_cast_dog (edict_t *self)
{
int i;
int skin;
// return;
if (deathmatch->value)
{
G_FreeEdict (self);
return;
}
self->movetype = MOVETYPE_STEP;
self->solid = SOLID_BBOX;
skin = self->s.skinnum = (self->skin-1) * 3;
VectorSet (self->mins, -16, -16, -24);
VectorSet (self->maxs, 16, 16, DUCKING_MAX_Z+2);
memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS);
self->art_skins = NULL;
self->s.num_parts++;
self->s.model_parts[PART_HEAD].modelindex = gi.modelindex("models/actors/enemy_dog/enemy_dog.mdx");
skin = self->s.skinnum;
for (i=0; i<MAX_MODELPART_OBJECTS; i++)
self->s.model_parts[PART_HEAD].baseskin = self->s.model_parts[PART_HEAD].skinnum[i] = skin;
gi.GetObjectBounds( "models/actors/enemy_dog/enemy_dog.mdx", &self->s.model_parts[PART_HEAD] );
if (!self->health)
self->health = 200;
self->gib_health = -200;
self->mass = 100;
self->gender = GENDER_NONE;
self->yaw_speed = 20;
self->pain = dog_pain;
self->die = dog_die;
self->cast_info.checkattack = AI_CheckAttack;
self->cast_info.attack = dog_attack;
self->cast_info.long_attack = dog_long_attack;
self->cast_info.talk = dog_end_stand;
self->cast_info.avoid = dog_avoid;
self->cast_info.backoff = dog_backoff;
self->cast_info.catch_fire = dog_catch_fire;
self->cast_info.max_attack_distance = 128;
self->cast_info.move_stand = &dog_move_amb;
self->cast_info.move_run = &dog_move_run;
self->cast_info.move_runwalk = &dog_move_trot;
// self->cast_info.move_jump = &dog_move_jump; // Jumping animation screws up jump attacking, so don't do one
self->cast_info.move_avoid_walk = &dog_move_avoid_walk;
self->cast_info.move_avoid_run = &dog_move_avoid_run;
self->cast_info.move_avoid_reverse_walk = &dog_move_avoid_reverse_walk;
self->cast_info.move_avoid_reverse_run = &dog_move_avoid_reverse_run;
self->cast_info.move_evade = &dog_move_growl;
self->cast_info.currentmove = self->cast_info.move_stand;
self->cast_info.aiflags |= AI_MELEE;
self->cast_info.aiflags |= AI_NO_TALK;
self->cast_info.aiflags |= AI_ADJUSTPITCH;
// self->gravity = 0.7;
// Temp fix for Dog in SR2 that follows lamont
//if (self->leader_target)
// self->target = NULL;
// we're a dog, therefore we don't hide
self->cast_info.aiflags |= AI_NO_TAKE_COVER;
gi.linkentity (self);
walking_cast_start (self);
}

167
gamesrc/AI_DOG.H Normal file
View file

@ -0,0 +1,167 @@
#define FRAME_amb_01 0
#define FRAME_amb_02 1
#define FRAME_amb_03 2
#define FRAME_amb_04 3
#define FRAME_amb_05 4
#define FRAME_amb_06 5
#define FRAME_amb_07 6
#define FRAME_amb_08 7
#define FRAME_amb_09 8
#define FRAME_amb_10 9
#define FRAME_amb_11 10
#define FRAME_amb_12 11
#define FRAME_pant_01 12
#define FRAME_pant_02 13
#define FRAME_pant_03 14
#define FRAME_pant_04 15
#define FRAME_pant_05 16
#define FRAME_pant_06 17
#define FRAME_pant_07 18
#define FRAME_pant_08 19
#define FRAME_pant_09 20
#define FRAME_pant_10 21
#define FRAME_pant_11 22
#define FRAME_pant_12 23
#define FRAME_pant_13 24
#define FRAME_pant_14 25
#define FRAME_sniff_01 26
#define FRAME_sniff_02 27
#define FRAME_sniff_03 28
#define FRAME_sniff_04 29
#define FRAME_sniff_05 30
#define FRAME_sniff_06 31
#define FRAME_sniff_07 32
#define FRAME_sniff_08 33
#define FRAME_sniff_09 34
#define FRAME_sniff_10 35
#define FRAME_sniff_11 36
#define FRAME_sniff_12 37
#define FRAME_sniff_13 38
#define FRAME_sniff_14 39
#define FRAME_sniff_15 40
#define FRAME_sniff_16 41
#define FRAME_sniff_17 42
#define FRAME_sniff_18 43
#define FRAME_sniff_19 44
#define FRAME_sniff_20 45
#define FRAME_bark_01 46
#define FRAME_bark_02 47
#define FRAME_bark_03 48
#define FRAME_bark_04 49
#define FRAME_bark_05 50
#define FRAME_bark_06 51
#define FRAME_bark_07 52
#define FRAME_bark_08 53
#define FRAME_bark_09 54
#define FRAME_growl_01 55
#define FRAME_growl_02 56
#define FRAME_growl_03 57
#define FRAME_growl_04 58
#define FRAME_growl_05 59
#define FRAME_pee_01 60
#define FRAME_pee_02 61
#define FRAME_pee_03 62
#define FRAME_pee_04 63
#define FRAME_pee_05 64
#define FRAME_pee_06 65
#define FRAME_pee_07 66
#define FRAME_pee_08 67
#define FRAME_pee_09 68
#define FRAME_pee_10 69
#define FRAME_pee_11 70
#define FRAME_pee_12 71
#define FRAME_low_atk_01 72
#define FRAME_low_atk_02 73
#define FRAME_low_atk_03 74
#define FRAME_low_atk_04 75
#define FRAME_low_atk_05 76
#define FRAME_low_atk_06 77
#define FRAME_low_atk_07 78
#define FRAME_low_atk_08 79
#define FRAME_med_atk_01 80
#define FRAME_med_atk_02 81
#define FRAME_med_atk_03 82
#define FRAME_med_atk_04 83
#define FRAME_med_atk_05 84
#define FRAME_med_atk_06 85
#define FRAME_med_atk_07 86
#define FRAME_upr_atk_01 87
#define FRAME_upr_atk_02 88
#define FRAME_upr_atk_03 89
#define FRAME_upr_atk_04 90
#define FRAME_upr_atk_05 91
#define FRAME_upr_atk_06 92
#define FRAME_upr_atk_07 93
#define FRAME_upr_atk_08 94
#define FRAME_upr_atk_09 95
#define FRAME_upr_atk_10 96
#define FRAME_pain1_01 97
#define FRAME_pain1_02 98
#define FRAME_pain1_03 99
#define FRAME_pain1_04 100
#define FRAME_pain1_05 101
#define FRAME_pain2_01 102
#define FRAME_pain2_02 103
#define FRAME_pain2_03 104
#define FRAME_pain2_04 105
#define FRAME_pain2_05 106
#define FRAME_pain2_06 107
#define FRAME_pain2_07 108
#define FRAME_pain3_01 109
#define FRAME_pain3_02 110
#define FRAME_pain3_03 111
#define FRAME_pain3_04 112
#define FRAME_pain3_05 113
#define FRAME_death1_01 114
#define FRAME_death1_02 115
#define FRAME_death1_03 116
#define FRAME_death1_04 117
#define FRAME_death1_05 118
#define FRAME_death1_06 119
#define FRAME_death1_07 120
#define FRAME_death1_08 121
#define FRAME_death1_09 122
#define FRAME_death1_10 123
#define FRAME_death1_11 124
#define FRAME_death1_12 125
#define FRAME_death1_13 126
#define FRAME_death1_14 127
#define FRAME_death1_15 128
#define FRAME_death1_16 129
#define FRAME_death1_17 130
#define FRAME_death2_01 131
#define FRAME_death2_02 132
#define FRAME_death2_03 133
#define FRAME_death2_04 134
#define FRAME_death2_05 135
#define FRAME_death2_06 136
#define FRAME_death2_07 137
#define FRAME_death2_08 138
#define FRAME_death2_09 139
#define FRAME_walk_01 140
#define FRAME_walk_02 141
#define FRAME_walk_03 142
#define FRAME_walk_04 143
#define FRAME_walk_05 144
#define FRAME_walk_06 145
#define FRAME_walk_07 146
#define FRAME_walk_08 147
#define FRAME_walk_09 148
#define FRAME_walk_10 149
#define FRAME_walk_11 150
#define FRAME_walk_12 151
#define FRAME_walk_13 152
#define FRAME_trot_01 153
#define FRAME_trot_02 154
#define FRAME_trot_03 155
#define FRAME_trot_04 156
#define FRAME_trot_05 157
#define FRAME_trot_06 158
#define FRAME_trot_07 159
#define FRAME_trot_08 160
#define FRAME_run_01 161
#define FRAME_run_02 162
#define FRAME_run_03 163
#define FRAME_run_04 164
#define MODEL_SCALE 1.000000

1617
gamesrc/AI_PUNK.C Normal file

File diff suppressed because it is too large Load diff

912
gamesrc/AI_PUNK.H Normal file
View file

@ -0,0 +1,912 @@
#define FRAME_stand_01 0
#define FRAME_stand_02 1
#define FRAME_stand_03 2
#define FRAME_stand_04 3
#define FRAME_stand_05 4
#define FRAME_stand_06 5
#define FRAME_stand_07 6
#define FRAME_stand_08 7
#define FRAME_stand_09 8
#define FRAME_stand_10 9
#define FRAME_stand_11 10
#define FRAME_stand_12 11
#define FRAME_stand_13 12
#define FRAME_stand_14 13
#define FRAME_stand_15 14
#define FRAME_stand_16 15
#define FRAME_stand_17 16
#define FRAME_stand_18 17
#define FRAME_stand_19 18
#define FRAME_stand_20 19
#define FRAME_stand_21 20
#define FRAME_stand_22 21
#define FRAME_stand_23 22
#define FRAME_stand_24 23
#define FRAME_stand_25 24
#define FRAME_stand_26 25
#define FRAME_stand_27 26
#define FRAME_stand_28 27
#define FRAME_stand_29 28
#define FRAME_stand_30 29
#define FRAME_stand_31 30
#define FRAME_tg_shoot_01 31
#define FRAME_tg_shoot_02 32
#define FRAME_tg_shoot_03 33
#define FRAME_tg_shoot_04 34
#define FRAME_tg_shoot_05 35
#define FRAME_shg_shoot_01 36
#define FRAME_shg_shoot_02 37
#define FRAME_shg_shoot_03 38
#define FRAME_shg_shoot_04 39
#define FRAME_shg_shoot_05 40
#define FRAME_shg_shoot_06 41
#define FRAME_shg_shoot_07 42
#define FRAME_shg_shoot_08 43
#define FRAME_shg_shoot_09 44
#define FRAME_shg_shoot_10 45
#define FRAME_shg_shoot_11 46
#define FRAME_shg_shoot_12 47
#define FRAME_shg_shoot_13 48
#define FRAME_tg_reload_01 49
#define FRAME_tg_reload_02 50
#define FRAME_tg_reload_03 51
#define FRAME_tg_reload_04 52
#define FRAME_tg_reload_05 53
#define FRAME_tg_reload_06 54
#define FRAME_tg_reload_07 55
#define FRAME_tg_reload_08 56
#define FRAME_tg_reload_09 57
#define FRAME_tg_reload_10 58
#define FRAME_tg_reload_11 59
#define FRAME_tg_reload_12 60
#define FRAME_tg_reload_13 61
#define FRAME_tg_reload_14 62
#define FRAME_tg_reload_15 63
#define FRAME_tg_reload_16 64
#define FRAME_talk1_01 65
#define FRAME_talk1_02 66
#define FRAME_talk1_03 67
#define FRAME_talk1_04 68
#define FRAME_talk1_05 69
#define FRAME_talk1_06 70
#define FRAME_talk1_07 71
#define FRAME_talk1_08 72
#define FRAME_talk1_09 73
#define FRAME_talk1_10 74
#define FRAME_talk1_11 75
#define FRAME_talk1_12 76
#define FRAME_talk1_13 77
#define FRAME_talk1_14 78
#define FRAME_talk1_15 79
#define FRAME_talk1_16 80
#define FRAME_talk1_17 81
#define FRAME_talk1_18 82
#define FRAME_talk1_19 83
#define FRAME_talk1_20 84
#define FRAME_talk1_21 85
#define FRAME_talk1_22 86
#define FRAME_talk1_23 87
#define FRAME_talk1_24 88
#define FRAME_talk1_25 89
#define FRAME_talk1_26 90
#define FRAME_talk2_01 91
#define FRAME_talk2_02 92
#define FRAME_talk2_03 93
#define FRAME_talk2_04 94
#define FRAME_talk2_05 95
#define FRAME_talk2_06 96
#define FRAME_talk2_07 97
#define FRAME_talk2_08 98
#define FRAME_talk2_09 99
#define FRAME_talk2_10 100
#define FRAME_talk2_11 101
#define FRAME_talk2_12 102
#define FRAME_talk2_13 103
#define FRAME_talk2_14 104
#define FRAME_talk2_15 105
#define FRAME_talk2_16 106
#define FRAME_talk2_17 107
#define FRAME_talk2_18 108
#define FRAME_talk2_19 109
#define FRAME_talk2_20 110
#define FRAME_talk3_01 111
#define FRAME_talk3_02 112
#define FRAME_talk3_03 113
#define FRAME_talk3_04 114
#define FRAME_talk3_05 115
#define FRAME_talk3_06 116
#define FRAME_talk3_07 117
#define FRAME_talk3_08 118
#define FRAME_talk3_09 119
#define FRAME_talk3_10 120
#define FRAME_talk3_11 121
#define FRAME_talk3_12 122
#define FRAME_talk3_13 123
#define FRAME_talk3_14 124
#define FRAME_talk3_15 125
#define FRAME_talk3_16 126
#define FRAME_talk3_17 127
#define FRAME_talk3_18 128
#define FRAME_talk3_19 129
#define FRAME_talk3_20 130
#define FRAME_talk3_21 131
#define FRAME_talk4_01 132
#define FRAME_talk4_02 133
#define FRAME_talk4_03 134
#define FRAME_talk4_04 135
#define FRAME_talk4_05 136
#define FRAME_talk4_06 137
#define FRAME_talk4_07 138
#define FRAME_talk4_08 139
#define FRAME_talk4_09 140
#define FRAME_talk4_10 141
#define FRAME_talk4_11 142
#define FRAME_talk4_12 143
#define FRAME_talk4_13 144
#define FRAME_talk4_14 145
#define FRAME_talk4_15 146
#define FRAME_talk4_16 147
#define FRAME_talk4_17 148
#define FRAME_talk4_18 149
#define FRAME_talk4_19 150
#define FRAME_talk4_20 151
#define FRAME_talk4_21 152
#define FRAME_talk4_22 153
#define FRAME_talk4_23 154
#define FRAME_talk4_24 155
#define FRAME_talk4_25 156
#define FRAME_talk4_26 157
#define FRAME_talk4_27 158
#define FRAME_talk4_28 159
#define FRAME_talk4_29 160
#define FRAME_talk4_30 161
#define FRAME_talk4_31 162
#define FRAME_talk4_32 163
#define FRAME_talk4_33 164
#define FRAME_talk5_01 165
#define FRAME_talk5_02 166
#define FRAME_talk5_03 167
#define FRAME_talk5_04 168
#define FRAME_talk5_05 169
#define FRAME_talk5_06 170
#define FRAME_talk5_07 171
#define FRAME_talk5_08 172
#define FRAME_talk5_09 173
#define FRAME_talk5_10 174
#define FRAME_talk5_11 175
#define FRAME_talk5_12 176
#define FRAME_talk5_13 177
#define FRAME_talk5_14 178
#define FRAME_talk5_15 179
#define FRAME_talk5_16 180
#define FRAME_talk5_17 181
#define FRAME_talk5_18 182
#define FRAME_talk5_19 183
#define FRAME_talk5_20 184
#define FRAME_talk5_21 185
#define FRAME_talk5_22 186
#define FRAME_talk5_23 187
#define FRAME_talk5_24 188
#define FRAME_talk5_25 189
#define FRAME_talk5_26 190
#define FRAME_talk5_27 191
#define FRAME_talk5_28 192
#define FRAME_talk5_29 193
#define FRAME_talk6_01 194
#define FRAME_talk6_02 195
#define FRAME_talk6_03 196
#define FRAME_talk6_04 197
#define FRAME_talk6_05 198
#define FRAME_talk6_06 199
#define FRAME_talk6_07 200
#define FRAME_talk6_08 201
#define FRAME_talk6_09 202
#define FRAME_talk6_10 203
#define FRAME_talk6_11 204
#define FRAME_talk6_12 205
#define FRAME_talk6_13 206
#define FRAME_talk6_14 207
#define FRAME_talk6_15 208
#define FRAME_talk6_16 209
#define FRAME_talk6_17 210
#define FRAME_talk6_18 211
#define FRAME_talk6_19 212
#define FRAME_talk6_20 213
#define FRAME_talk6_21 214
#define FRAME_talk6_22 215
#define FRAME_talk6_23 216
#define FRAME_talk6_24 217
#define FRAME_talk6_25 218
#define FRAME_talk6_26 219
#define FRAME_talk6_27 220
#define FRAME_talk6_28 221
#define FRAME_talk6_29 222
#define FRAME_talk6_30 223
#define FRAME_talk6_31 224
#define FRAME_talk6_32 225
#define FRAME_talk6_33 226
#define FRAME_talk6_34 227
#define FRAME_talk6_35 228
#define FRAME_talk6_36 229
#define FRAME_talk6_37 230
#define FRAME_talk6_38 231
#define FRAME_talk6_39 232
#define FRAME_talk6_40 233
#define FRAME_talk6_41 234
#define FRAME_talk6_42 235
#define FRAME_talk6_43 236
#define FRAME_talk6_44 237
#define FRAME_talk6_45 238
#define FRAME_talk6_46 239
#define FRAME_talk6_47 240
#define FRAME_head_wipe_01 241
#define FRAME_head_wipe_02 242
#define FRAME_head_wipe_03 243
#define FRAME_head_wipe_04 244
#define FRAME_head_wipe_05 245
#define FRAME_head_wipe_06 246
#define FRAME_head_wipe_07 247
#define FRAME_head_wipe_08 248
#define FRAME_head_wipe_09 249
#define FRAME_head_wipe_10 250
#define FRAME_head_wipe_11 251
#define FRAME_head_wipe_12 252
#define FRAME_head_wipe_13 253
#define FRAME_head_wipe_14 254
#define FRAME_head_wipe_15 255
#define FRAME_head_wipe_16 256
#define FRAME_head_wipe_17 257
#define FRAME_head_wipe_18 258
#define FRAME_head_wipe_19 259
#define FRAME_head_wipe_20 260
#define FRAME_head_wipe_21 261
#define FRAME_head_wipe_22 262
#define FRAME_head_wipe_23 263
#define FRAME_head_wipe_24 264
#define FRAME_head_wipe_25 265
#define FRAME_head_wipe_26 266
#define FRAME_head_wipe_27 267
#define FRAME_head_wipe_28 268
#define FRAME_pain_Rarm_01 269
#define FRAME_pain_Rarm_02 270
#define FRAME_pain_Rarm_03 271
#define FRAME_pain_Rarm_04 272
#define FRAME_pain_Rarm_05 273
#define FRAME_pain_Rarm_06 274
#define FRAME_pain_Rarm_07 275
#define FRAME_pain_Rarm_08 276
#define FRAME_pain_Rarm_09 277
#define FRAME_pain_Larm_01 278
#define FRAME_pain_Larm_02 279
#define FRAME_pain_Larm_03 280
#define FRAME_pain_Larm_04 281
#define FRAME_pain_Larm_05 282
#define FRAME_pain_Larm_06 283
#define FRAME_pain_Larm_07 284
#define FRAME_pain_Larm_08 285
#define FRAME_pain_chest_01 286
#define FRAME_pain_chest_02 287
#define FRAME_pain_chest_03 288
#define FRAME_pain_chest_04 289
#define FRAME_pain_chest_05 290
#define FRAME_pain_chest_06 291
#define FRAME_pain_chest_07 292
#define FRAME_pain_chest_08 293
#define FRAME_pain_chest_09 294
#define FRAME_pain_chest_10 295
#define FRAME_pain_head_01 296
#define FRAME_pain_head_02 297
#define FRAME_pain_head_03 298
#define FRAME_pain_head_04 299
#define FRAME_pain_head_05 300
#define FRAME_pain_head_06 301
#define FRAME_pain_head_07 302
#define FRAME_pain_head_08 303
#define FRAME_pain_Rleg_01 304
#define FRAME_pain_Rleg_02 305
#define FRAME_pain_Rleg_03 306
#define FRAME_pain_Rleg_04 307
#define FRAME_pain_Rleg_05 308
#define FRAME_pain_Rleg_06 309
#define FRAME_pain_Rleg_07 310
#define FRAME_pain_Rleg_08 311
#define FRAME_pain_Rleg_09 312
#define FRAME_pain_Rleg_10 313
#define FRAME_pain_Rleg_11 314
#define FRAME_pain_Lleg_01 315
#define FRAME_pain_Lleg_02 316
#define FRAME_pain_Lleg_03 317
#define FRAME_pain_Lleg_04 318
#define FRAME_pain_Lleg_05 319
#define FRAME_pain_Lleg_06 320
#define FRAME_pain_Lleg_07 321
#define FRAME_pain_Lleg_08 322
#define FRAME_pain_Lleg_09 323
#define FRAME_pain_crch_01 324
#define FRAME_pain_crch_02 325
#define FRAME_pain_crch_03 326
#define FRAME_pain_crch_04 327
#define FRAME_pain_crch_05 328
#define FRAME_pain_crch_06 329
#define FRAME_pain_crch_07 330
#define FRAME_pain_crch_08 331
#define FRAME_pain_crch_09 332
#define FRAME_pain_crch_10 333
#define FRAME_pain_crch_11 334
#define FRAME_pain_crch_12 335
#define FRAME_pain_crch_13 336
#define FRAME_pain_butt_01 337
#define FRAME_pain_butt_02 338
#define FRAME_pain_butt_03 339
#define FRAME_pain_butt_04 340
#define FRAME_pain_butt_05 341
#define FRAME_pain_butt_06 342
#define FRAME_pain_butt_07 343
#define FRAME_pain_butt_08 344
#define FRAME_pain_butt_09 345
#define FRAME_pain_butt_10 346
#define FRAME_pain_butt_11 347
#define FRAME_pain_butt_12 348
#define FRAME_pain_butt_13 349
#define FRAME_pain_butt_14 350
#define FRAME_jump_01 351
#define FRAME_jump_02 352
#define FRAME_jump_03 353
#define FRAME_jump_04 354
#define FRAME_jump_05 355
#define FRAME_jump_06 356
#define FRAME_jump_07 357
#define FRAME_jump_08 358
#define FRAME_jump_09 359
#define FRAME_jump_10 360
#define FRAME_jump_11 361
#define FRAME_jump_12 362
#define FRAME_death1_01 363
#define FRAME_death1_02 364
#define FRAME_death1_03 365
#define FRAME_death1_04 366
#define FRAME_death1_05 367
#define FRAME_death1_06 368
#define FRAME_death1_07 369
#define FRAME_death1_08 370
#define FRAME_death1_09 371
#define FRAME_death1_10 372
#define FRAME_death1_11 373
#define FRAME_death1_12 374
#define FRAME_death1_13 375
#define FRAME_death1_14 376
#define FRAME_death1_15 377
#define FRAME_death1_16 378
#define FRAME_death1_17 379
#define FRAME_death1_18 380
#define FRAME_death1_19 381
#define FRAME_death2_01 382
#define FRAME_death2_02 383
#define FRAME_death2_03 384
#define FRAME_death2_04 385
#define FRAME_death2_05 386
#define FRAME_death2_06 387
#define FRAME_death2_07 388
#define FRAME_death2_08 389
#define FRAME_death2_09 390
#define FRAME_death2_10 391
#define FRAME_death2_11 392
#define FRAME_death2_12 393
#define FRAME_death2_13 394
#define FRAME_death2_14 395
#define FRAME_death2_15 396
#define FRAME_death2_16 397
#define FRAME_death3_01 398
#define FRAME_death3_02 399
#define FRAME_death3_03 400
#define FRAME_death3_04 401
#define FRAME_death3_05 402
#define FRAME_death3_06 403
#define FRAME_death3_07 404
#define FRAME_death3_08 405
#define FRAME_death3_09 406
#define FRAME_death3_10 407
#define FRAME_death3_11 408
#define FRAME_death3_12 409
#define FRAME_death3_13 410
#define FRAME_death3_14 411
#define FRAME_death3_15 412
#define FRAME_death3_16 413
#define FRAME_death3_17 414
#define FRAME_death3_18 415
#define FRAME_death3_19 416
#define FRAME_death3_20 417
#define FRAME_death3_21 418
#define FRAME_death3_22 419
#define FRAME_death3_23 420
#define FRAME_death3_24 421
#define FRAME_death3_25 422
#define FRAME_death3_26 423
#define FRAME_death3_27 424
#define FRAME_death3_28 425
#define FRAME_death4_01 426
#define FRAME_death4_02 427
#define FRAME_death4_03 428
#define FRAME_death4_04 429
#define FRAME_death4_05 430
#define FRAME_death4_06 431
#define FRAME_death4_07 432
#define FRAME_death4_08 433
#define FRAME_death4_09 434
#define FRAME_death4_10 435
#define FRAME_death4_11 436
#define FRAME_death4_12 437
#define FRAME_death4_13 438
#define FRAME_crh_shuf_01 439
#define FRAME_crh_shuf_02 440
#define FRAME_crh_shuf_03 441
#define FRAME_crh_shuf_04 442
#define FRAME_crh_shuf_05 443
#define FRAME_crouch_walk_01 444
#define FRAME_crouch_walk_02 445
#define FRAME_crouch_walk_03 446
#define FRAME_crouch_walk_04 447
#define FRAME_crouch_walk_05 448
#define FRAME_crouch_walk_06 449
#define FRAME_crouch_walk_07 450
#define FRAME_crouch_painC_01 451
#define FRAME_crouch_painC_02 452
#define FRAME_crouch_painC_03 453
#define FRAME_crouch_painC_04 454
#define FRAME_crouch_painC_05 455
#define FRAME_crouch_painC_06 456
#define FRAME_crouch_painC_07 457
#define FRAME_crouch_painL_01 458
#define FRAME_crouch_painL_02 459
#define FRAME_crouch_painL_03 460
#define FRAME_crouch_painL_04 461
#define FRAME_crouch_painL_05 462
#define FRAME_crouch_painL_06 463
#define FRAME_crouch_painL_07 464
#define FRAME_crouch_painL_08 465
#define FRAME_crouch_painR_01 466
#define FRAME_crouch_painR_02 467
#define FRAME_crouch_painR_03 468
#define FRAME_crouch_painR_04 469
#define FRAME_crouch_painR_05 470
#define FRAME_crouch_painR_06 471
#define FRAME_crouch_painR_07 472
#define FRAME_crouch_shoot_01 473
#define FRAME_crouch_shoot_02 474
#define FRAME_crouch_shoot_03 475
#define FRAME_crouch_shoot_04 476
#define FRAME_crouch_shoot_05 477
#define FRAME_crouch_shoot_06 478
#define FRAME_crch_shg_sht_01 479
#define FRAME_crch_shg_sht_02 480
#define FRAME_crch_shg_sht_03 481
#define FRAME_crch_shg_sht_04 482
#define FRAME_crch_shg_sht_05 483
#define FRAME_crch_shg_sht_06 484
#define FRAME_crch_shg_sht_07 485
#define FRAME_crch_shg_sht_08 486
#define FRAME_crch_shg_sht_09 487
#define FRAME_crch_shg_sht_10 488
#define FRAME_crch_shg_sht_11 489
#define FRAME_crch_shg_sht_12 490
#define FRAME_crch_shg_sht_13 491
#define FRAME_stand_crouch_01 492
#define FRAME_stand_crouch_02 493
#define FRAME_stand_crouch_03 494
#define FRAME_stand_crouch_04 495
#define FRAME_stand_crouch_05 496
#define FRAME_crch_astand_01 497
#define FRAME_crch_astand_02 498
#define FRAME_crch_astand_03 499
#define FRAME_crch_astand_04 500
#define FRAME_crch_astand_05 501
#define FRAME_crch_astand_06 502
#define FRAME_crch_astand_07 503
#define FRAME_crch_astand_08 504
#define FRAME_crch_astand_09 505
#define FRAME_crch_astand_10 506
#define FRAME_crch_astand_11 507
#define FRAME_crch_astand_12 508
#define FRAME_crch_astand_13 509
#define FRAME_crch_astand_14 510
#define FRAME_crch_astand_15 511
#define FRAME_crch_astand_16 512
#define FRAME_crch_astand_17 513
#define FRAME_crch_astand_18 514
#define FRAME_crch_astand_19 515
#define FRAME_crch_astand_20 516
#define FRAME_crouch_death_01 517
#define FRAME_crouch_death_02 518
#define FRAME_crouch_death_03 519
#define FRAME_crouch_death_04 520
#define FRAME_crouch_death_05 521
#define FRAME_crouch_death_06 522
#define FRAME_crouch_death_07 523
#define FRAME_crouch_death_08 524
#define FRAME_crouch_death_09 525
#define FRAME_crouch_death_10 526
#define FRAME_crouch_death_11 527
#define FRAME_crouch_death_12 528
#define FRAME_st_clmb_01 529
#define FRAME_st_clmb_02 530
#define FRAME_clmb_loop_01 531
#define FRAME_clmb_loop_02 532
#define FRAME_clmb_loop_03 533
#define FRAME_clmb_loop_04 534
#define FRAME_clmb_loop_05 535
#define FRAME_clmb_loop_06 536
#define FRAME_clmb_loop_07 537
#define FRAME_clmb_loop_08 538
#define FRAME_clmb_loop_09 539
#define FRAME_clmb_over_01 540
#define FRAME_clmb_over_02 541
#define FRAME_clmb_over_03 542
#define FRAME_clmb_over_04 543
#define FRAME_clmb_over_05 544
#define FRAME_clmb_over_06 545
#define FRAME_clmb_over_07 546
#define FRAME_clmb_over_08 547
#define FRAME_clmb_over_09 548
#define FRAME_clmb_over_10 549
#define FRAME_clmb_over_11 550
#define FRAME_clmb_over_12 551
#define FRAME_clmb_over_13 552
#define FRAME_clmb_over_14 553
#define FRAME_clmb_over_15 554
#define FRAME_lside_step_01 555
#define FRAME_lside_step_02 556
#define FRAME_lside_step_03 557
#define FRAME_lside_step_04 558
#define FRAME_lside_step_05 559
#define FRAME_lside_step_06 560
#define FRAME_lside_step_07 561
#define FRAME_rside_step_01 562
#define FRAME_rside_step_02 563
#define FRAME_rside_step_03 564
#define FRAME_rside_step_04 565
#define FRAME_rside_step_05 566
#define FRAME_rside_step_06 567
#define FRAME_rside_step_07 568
#define FRAME_walk_nw_01 569
#define FRAME_walk_nw_02 570
#define FRAME_walk_nw_03 571
#define FRAME_walk_nw_04 572
#define FRAME_walk_nw_05 573
#define FRAME_walk_nw_06 574
#define FRAME_walk_nw_07 575
#define FRAME_walk_nw_08 576
#define FRAME_walk_nw_09 577
#define FRAME_walk_nw_10 578
#define FRAME_walk_tg_sht_01 579
#define FRAME_walk_tg_sht_02 580
#define FRAME_walk_tg_sht_03 581
#define FRAME_walk_tg_sht_04 582
#define FRAME_walk_tg_sht_05 583
#define FRAME_walk_tg_sht_06 584
#define FRAME_walk_tg_sht_07 585
#define FRAME_walk_tg_sht_08 586
#define FRAME_walk_tg_sht_09 587
#define FRAME_walk_tg_sht_10 588
#define FRAME_walk_shg_sht_01 589
#define FRAME_walk_shg_sht_02 590
#define FRAME_walk_shg_sht_03 591
#define FRAME_walk_shg_sht_04 592
#define FRAME_walk_shg_sht_05 593
#define FRAME_walk_shg_sht_06 594
#define FRAME_walk_shg_sht_07 595
#define FRAME_walk_shg_sht_08 596
#define FRAME_walk_shg_sht_09 597
#define FRAME_walk_shg_sht_10 598
#define FRAME_walk_gdown_01 599
#define FRAME_walk_gdown_02 600
#define FRAME_walk_gdown_03 601
#define FRAME_walk_gdown_04 602
#define FRAME_walk_gdown_05 603
#define FRAME_walk_gdown_06 604
#define FRAME_walk_gdown_07 605
#define FRAME_walk_gdown_08 606
#define FRAME_walk_gdown_09 607
#define FRAME_walk_gdown_10 608
#define FRAME_run_nw_01 609
#define FRAME_run_nw_02 610
#define FRAME_run_nw_03 611
#define FRAME_run_nw_04 612
#define FRAME_run_nw_05 613
#define FRAME_run_nw_06 614
#define FRAME_run_tg_sht_01 615
#define FRAME_run_tg_sht_02 616
#define FRAME_run_tg_sht_03 617
#define FRAME_run_tg_sht_04 618
#define FRAME_run_tg_sht_05 619
#define FRAME_run_tg_sht_06 620
#define FRAME_run_shg_sht_01 621
#define FRAME_run_shg_sht_02 622
#define FRAME_run_shg_sht_03 623
#define FRAME_run_shg_sht_04 624
#define FRAME_run_shg_sht_05 625
#define FRAME_run_shg_sht_06 626
#define FRAME_run_gun_down_01 627
#define FRAME_run_gun_down_02 628
#define FRAME_run_gun_down_03 629
#define FRAME_run_gun_down_04 630
#define FRAME_run_gun_down_05 631
#define FRAME_run_gun_down_06 632
#define FRAME_run_on_fire_01 633
#define FRAME_run_on_fire_02 634
#define FRAME_run_on_fire_03 635
#define FRAME_run_on_fire_04 636
#define FRAME_run_on_fire_05 637
#define FRAME_run_on_fire_06 638
#define FRAME_rsd_tg_run_01 639
#define FRAME_rsd_tg_run_02 640
#define FRAME_rsd_tg_run_03 641
#define FRAME_rsd_tg_run_04 642
#define FRAME_rsd_tg_run_05 643
#define FRAME_rsd_tg_run_06 644
#define FRAME_lsd_tg_run_01 645
#define FRAME_lsd_tg_run_02 646
#define FRAME_lsd_tg_run_03 647
#define FRAME_lsd_tg_run_04 648
#define FRAME_lsd_tg_run_05 649
#define FRAME_lsd_tg_run_06 650
#define FRAME_rsd_shg_run_01 651
#define FRAME_rsd_shg_run_02 652
#define FRAME_rsd_shg_run_03 653
#define FRAME_rsd_shg_run_04 654
#define FRAME_rsd_shg_run_05 655
#define FRAME_rsd_shg_run_06 656
#define FRAME_lsd_shg_run_01 657
#define FRAME_lsd_shg_run_02 658
#define FRAME_lsd_shg_run_03 659
#define FRAME_lsd_shg_run_04 660
#define FRAME_lsd_shg_run_05 661
#define FRAME_lsd_shg_run_06 662
#define FRAME_sg_stand_01 663
#define FRAME_sg_stand_02 664
#define FRAME_sg_stand_03 665
#define FRAME_sg_stand_04 666
#define FRAME_sg_stand_05 667
#define FRAME_sg_stand_06 668
#define FRAME_sg_stand_07 669
#define FRAME_sg_stand_08 670
#define FRAME_sg_stand_09 671
#define FRAME_sg_stand_10 672
#define FRAME_sg_stand_11 673
#define FRAME_sg_stand_12 674
#define FRAME_sg_stand_13 675
#define FRAME_sg_stand_14 676
#define FRAME_sg_stand_15 677
#define FRAME_sg_stand_16 678
#define FRAME_sg_stand_17 679
#define FRAME_sg_stand_18 680
#define FRAME_sg_stand_19 681
#define FRAME_sg_stand_20 682
#define FRAME_sg_stand_21 683
#define FRAME_sg_stand_22 684
#define FRAME_sg_stand_23 685
#define FRAME_sg_stand_24 686
#define FRAME_sg_stand_25 687
#define FRAME_sg_stand_26 688
#define FRAME_sg_stand_27 689
#define FRAME_sg_stand_28 690
#define FRAME_sg_stand_29 691
#define FRAME_sg_stand_30 692
#define FRAME_sg_stand_31 693
#define FRAME_sg_talk1_01 694
#define FRAME_sg_talk1_02 695
#define FRAME_sg_talk1_03 696
#define FRAME_sg_talk1_04 697
#define FRAME_sg_talk1_05 698
#define FRAME_sg_talk1_06 699
#define FRAME_sg_talk1_07 700
#define FRAME_sg_talk1_08 701
#define FRAME_sg_talk1_09 702
#define FRAME_sg_talk1_10 703
#define FRAME_sg_talk1_11 704
#define FRAME_sg_talk1_12 705
#define FRAME_sg_talk1_13 706
#define FRAME_sg_talk1_14 707
#define FRAME_sg_talk1_15 708
#define FRAME_sg_talk1_16 709
#define FRAME_sg_talk1_17 710
#define FRAME_sg_talk1_18 711
#define FRAME_sg_talk1_19 712
#define FRAME_sg_talk1_20 713
#define FRAME_sg_talk1_21 714
#define FRAME_sg_talk1_22 715
#define FRAME_sg_talk1_23 716
#define FRAME_sg_talk1_24 717
#define FRAME_sg_talk1_25 718
#define FRAME_sg_talk1_26 719
#define FRAME_sg_talk2_01 720
#define FRAME_sg_talk2_02 721
#define FRAME_sg_talk2_03 722
#define FRAME_sg_talk2_04 723
#define FRAME_sg_talk2_05 724
#define FRAME_sg_talk2_06 725
#define FRAME_sg_talk2_07 726
#define FRAME_sg_talk2_08 727
#define FRAME_sg_talk2_09 728
#define FRAME_sg_talk2_10 729
#define FRAME_sg_talk2_11 730
#define FRAME_sg_talk2_12 731
#define FRAME_sg_talk2_13 732
#define FRAME_sg_talk2_14 733
#define FRAME_sg_talk2_15 734
#define FRAME_sg_talk2_16 735
#define FRAME_sg_talk2_17 736
#define FRAME_sg_talk2_18 737
#define FRAME_sg_talk2_19 738
#define FRAME_sg_talk2_20 739
#define FRAME_sg_talk3_01 740
#define FRAME_sg_talk3_02 741
#define FRAME_sg_talk3_03 742
#define FRAME_sg_talk3_04 743
#define FRAME_sg_talk3_05 744
#define FRAME_sg_talk3_06 745
#define FRAME_sg_talk3_07 746
#define FRAME_sg_talk3_08 747
#define FRAME_sg_talk3_09 748
#define FRAME_sg_talk3_10 749
#define FRAME_sg_talk3_11 750
#define FRAME_sg_talk3_12 751
#define FRAME_sg_talk3_13 752
#define FRAME_sg_talk3_14 753
#define FRAME_sg_talk3_15 754
#define FRAME_sg_talk3_16 755
#define FRAME_sg_talk3_17 756
#define FRAME_sg_talk3_18 757
#define FRAME_sg_talk3_19 758
#define FRAME_sg_talk3_20 759
#define FRAME_sg_talk3_21 760
#define FRAME_sg_talk4_01 761
#define FRAME_sg_talk4_02 762
#define FRAME_sg_talk4_03 763
#define FRAME_sg_talk4_04 764
#define FRAME_sg_talk4_05 765
#define FRAME_sg_talk4_06 766
#define FRAME_sg_talk4_07 767
#define FRAME_sg_talk4_08 768
#define FRAME_sg_talk4_09 769
#define FRAME_sg_talk4_10 770
#define FRAME_sg_talk4_11 771
#define FRAME_sg_talk4_12 772
#define FRAME_sg_talk4_13 773
#define FRAME_sg_talk4_14 774
#define FRAME_sg_talk4_15 775
#define FRAME_sg_talk4_16 776
#define FRAME_sg_talk4_17 777
#define FRAME_sg_talk4_18 778
#define FRAME_sg_talk4_19 779
#define FRAME_sg_talk4_20 780
#define FRAME_sg_talk4_21 781
#define FRAME_sg_talk4_22 782
#define FRAME_sg_talk4_23 783
#define FRAME_sg_talk4_24 784
#define FRAME_sg_talk4_25 785
#define FRAME_sg_talk4_26 786
#define FRAME_sg_talk4_27 787
#define FRAME_sg_talk4_28 788
#define FRAME_sg_talk4_29 789
#define FRAME_sg_talk4_30 790
#define FRAME_sg_talk4_31 791
#define FRAME_sg_talk4_32 792
#define FRAME_sg_talk4_33 793
#define FRAME_sg_talk5_01 794
#define FRAME_sg_talk5_02 795
#define FRAME_sg_talk5_03 796
#define FRAME_sg_talk5_04 797
#define FRAME_sg_talk5_05 798
#define FRAME_sg_talk5_06 799
#define FRAME_sg_talk5_07 800
#define FRAME_sg_talk5_08 801
#define FRAME_sg_talk5_09 802
#define FRAME_sg_talk5_10 803
#define FRAME_sg_talk5_11 804
#define FRAME_sg_talk5_12 805
#define FRAME_sg_talk5_13 806
#define FRAME_sg_talk5_14 807
#define FRAME_sg_talk5_15 808
#define FRAME_sg_talk5_16 809
#define FRAME_sg_talk5_17 810
#define FRAME_sg_talk5_18 811
#define FRAME_sg_talk5_19 812
#define FRAME_sg_talk5_20 813
#define FRAME_sg_talk5_21 814
#define FRAME_sg_talk5_22 815
#define FRAME_sg_talk5_23 816
#define FRAME_sg_talk5_24 817
#define FRAME_sg_talk5_25 818
#define FRAME_sg_talk5_26 819
#define FRAME_sg_talk5_27 820
#define FRAME_sg_talk5_28 821
#define FRAME_sg_talk5_29 822
#define FRAME_sg_talk6_01 823
#define FRAME_sg_talk6_02 824
#define FRAME_sg_talk6_03 825
#define FRAME_sg_talk6_04 826
#define FRAME_sg_talk6_05 827
#define FRAME_sg_talk6_06 828
#define FRAME_sg_talk6_07 829
#define FRAME_sg_talk6_08 830
#define FRAME_sg_talk6_09 831
#define FRAME_sg_talk6_10 832
#define FRAME_sg_talk6_11 833
#define FRAME_sg_talk6_12 834
#define FRAME_sg_talk6_13 835
#define FRAME_sg_talk6_14 836
#define FRAME_sg_talk6_15 837
#define FRAME_sg_talk6_16 838
#define FRAME_sg_talk6_17 839
#define FRAME_sg_talk6_18 840
#define FRAME_sg_talk6_19 841
#define FRAME_sg_talk6_20 842
#define FRAME_sg_talk6_21 843
#define FRAME_sg_talk6_22 844
#define FRAME_sg_talk6_23 845
#define FRAME_sg_talk6_24 846
#define FRAME_sg_talk6_25 847
#define FRAME_sg_talk6_26 848
#define FRAME_sg_talk6_27 849
#define FRAME_sg_talk6_28 850
#define FRAME_sg_talk6_29 851
#define FRAME_sg_talk6_30 852
#define FRAME_sg_talk6_31 853
#define FRAME_sg_talk6_32 854
#define FRAME_sg_talk6_33 855
#define FRAME_sg_talk6_34 856
#define FRAME_sg_talk6_35 857
#define FRAME_sg_talk6_36 858
#define FRAME_sg_talk6_37 859
#define FRAME_sg_talk6_38 860
#define FRAME_sg_talk6_39 861
#define FRAME_sg_talk6_40 862
#define FRAME_sg_talk6_41 863
#define FRAME_sg_talk6_42 864
#define FRAME_sg_talk6_43 865
#define FRAME_sg_talk6_44 866
#define FRAME_sg_talk6_45 867
#define FRAME_sg_talk6_46 868
#define FRAME_sg_talk6_47 869
#define FRAME_hmg_std_01 870
#define FRAME_hmg_std_02 871
#define FRAME_hmg_std_03 872
#define FRAME_hmg_std_04 873
#define FRAME_hmg_std_05 874
#define FRAME_hmg_std_06 875
#define FRAME_hmg_std_07 876
#define FRAME_hmg_std_08 877
#define FRAME_hmg_std_09 878
#define FRAME_hmg_std_10 879
#define FRAME_hmg_std_11 880
#define FRAME_hmg_std_12 881
#define FRAME_hmg_sht_01 882
#define FRAME_hmg_sht_02 883
#define FRAME_hmg_sht_03 884
#define FRAME_hmg_sht_04 885
#define FRAME_hmg_sht_05 886
#define FRAME_hmg_sht_06 887
#define FRAME_hmg_sht_07 888
#define FRAME_hmg_sht_08 889
#define FRAME_hmg_sht_09 890
#define FRAME_hmg_sht_10 891
#define FRAME_hmg_sht_11 892
#define FRAME_hmg_sht_12 893
#define FRAME_hmg_wlk_01 894
#define FRAME_hmg_wlk_02 895
#define FRAME_hmg_wlk_03 896
#define FRAME_hmg_wlk_04 897
#define FRAME_hmg_wlk_05 898
#define FRAME_hmg_wlk_06 899
#define FRAME_hmg_wlk_07 900
#define FRAME_hmg_wlk_08 901
#define FRAME_hmg_wlk_09 902
#define FRAME_hmg_wlk_10 903
#define FRAME_hmg_run_01 904
#define FRAME_hmg_run_02 905
#define FRAME_hmg_run_03 906
#define FRAME_hmg_run_04 907
#define FRAME_hmg_run_05 908
#define FRAME_hmg_run_06 909
#define MODEL_SCALE 1.000000

1501
gamesrc/AI_RUNT.C Normal file

File diff suppressed because it is too large Load diff

973
gamesrc/AI_RUNT.H Normal file
View file

@ -0,0 +1,973 @@
#define FRAME_amb_stand_01 0
#define FRAME_amb_stand_02 1
#define FRAME_amb_stand_03 2
#define FRAME_amb_stand_04 3
#define FRAME_amb_stand_05 4
#define FRAME_amb_stand_06 5
#define FRAME_amb_stand_07 6
#define FRAME_amb_stand_08 7
#define FRAME_amb_stand_09 8
#define FRAME_amb_stand_10 9
#define FRAME_amb_stand_11 10
#define FRAME_amb_stand_12 11
#define FRAME_amb_stand_13 12
#define FRAME_amb_stand_14 13
#define FRAME_amb_stand_15 14
#define FRAME_amb_stand_16 15
#define FRAME_amb_stand_17 16
#define FRAME_amb_stand_18 17
#define FRAME_amb_stand_19 18
#define FRAME_amb_stand_20 19
#define FRAME_talk1_01 20
#define FRAME_talk1_02 21
#define FRAME_talk1_03 22
#define FRAME_talk1_04 23
#define FRAME_talk1_05 24
#define FRAME_talk1_06 25
#define FRAME_talk1_07 26
#define FRAME_talk1_08 27
#define FRAME_talk1_09 28
#define FRAME_talk1_10 29
#define FRAME_talk1_11 30
#define FRAME_talk1_12 31
#define FRAME_talk1_13 32
#define FRAME_talk1_14 33
#define FRAME_talk2_01 34
#define FRAME_talk2_02 35
#define FRAME_talk2_03 36
#define FRAME_talk2_04 37
#define FRAME_talk2_05 38
#define FRAME_talk2_06 39
#define FRAME_talk2_07 40
#define FRAME_talk2_08 41
#define FRAME_talk2_09 42
#define FRAME_talk2_10 43
#define FRAME_talk2_11 44
#define FRAME_talk2_12 45
#define FRAME_talk2_13 46
#define FRAME_talk2_14 47
#define FRAME_talk2_15 48
#define FRAME_talk2_16 49
#define FRAME_talk2_17 50
#define FRAME_talk2_18 51
#define FRAME_talk2_19 52
#define FRAME_talk2_20 53
#define FRAME_talk2_21 54
#define FRAME_talk2_22 55
#define FRAME_talk3_01 56
#define FRAME_talk3_02 57
#define FRAME_talk3_03 58
#define FRAME_talk3_04 59
#define FRAME_talk3_05 60
#define FRAME_talk3_06 61
#define FRAME_talk3_07 62
#define FRAME_talk3_08 63
#define FRAME_talk3_09 64
#define FRAME_talk3_10 65
#define FRAME_talk3_11 66
#define FRAME_talk3_12 67
#define FRAME_talk3_13 68
#define FRAME_talk3_14 69
#define FRAME_talk4_01 70
#define FRAME_talk4_02 71
#define FRAME_talk4_03 72
#define FRAME_talk4_04 73
#define FRAME_talk4_05 74
#define FRAME_talk4_06 75
#define FRAME_talk4_07 76
#define FRAME_talk4_08 77
#define FRAME_talk4_09 78
#define FRAME_talk4_10 79
#define FRAME_talk4_11 80
#define FRAME_talk4_12 81
#define FRAME_talk4_13 82
#define FRAME_talk4_14 83
#define FRAME_talk4_15 84
#define FRAME_talk4_16 85
#define FRAME_talk4_17 86
#define FRAME_talk4_18 87
#define FRAME_talk4_19 88
#define FRAME_talk4_20 89
#define FRAME_talk4_21 90
#define FRAME_talk4_22 91
#define FRAME_talk4_23 92
#define FRAME_talk5_01 93
#define FRAME_talk5_02 94
#define FRAME_talk5_03 95
#define FRAME_talk5_04 96
#define FRAME_talk5_05 97
#define FRAME_talk5_06 98
#define FRAME_talk5_07 99
#define FRAME_talk5_08 100
#define FRAME_talk5_09 101
#define FRAME_talk5_10 102
#define FRAME_talk5_11 103
#define FRAME_talk5_12 104
#define FRAME_talk5_13 105
#define FRAME_talk5_14 106
#define FRAME_talk5_15 107
#define FRAME_talk5_16 108
#define FRAME_talk5_17 109
#define FRAME_talk5_18 110
#define FRAME_talk5_19 111
#define FRAME_talk5_20 112
#define FRAME_talk5_21 113
#define FRAME_talk5_22 114
#define FRAME_talk5_23 115
#define FRAME_talk6_01 116
#define FRAME_talk6_02 117
#define FRAME_talk6_03 118
#define FRAME_talk6_04 119
#define FRAME_talk6_05 120
#define FRAME_talk6_06 121
#define FRAME_talk6_07 122
#define FRAME_talk6_08 123
#define FRAME_talk6_09 124
#define FRAME_talk6_10 125
#define FRAME_talk6_11 126
#define FRAME_talk6_12 127
#define FRAME_talk6_13 128
#define FRAME_talk6_14 129
#define FRAME_talk6_15 130
#define FRAME_talk6_16 131
#define FRAME_talk6_17 132
#define FRAME_talk6_18 133
#define FRAME_talk6_19 134
#define FRAME_talk6_20 135
#define FRAME_talk6_21 136
#define FRAME_talk6_22 137
#define FRAME_talk7_01 138
#define FRAME_talk7_02 139
#define FRAME_talk7_03 140
#define FRAME_talk7_04 141
#define FRAME_talk7_05 142
#define FRAME_talk7_06 143
#define FRAME_talk7_07 144
#define FRAME_talk7_08 145
#define FRAME_talk7_09 146
#define FRAME_talk7_10 147
#define FRAME_talk7_11 148
#define FRAME_talk7_12 149
#define FRAME_talk7_13 150
#define FRAME_talk7_14 151
#define FRAME_talk7_15 152
#define FRAME_talk7_16 153
#define FRAME_talk7_17 154
#define FRAME_talk7_18 155
#define FRAME_talk7_19 156
#define FRAME_talk7_20 157
#define FRAME_talk7_21 158
#define FRAME_talk7_22 159
#define FRAME_talk7_23 160
#define FRAME_talk7_24 161
#define FRAME_talk7_25 162
#define FRAME_talk7_26 163
#define FRAME_talk7_27 164
#define FRAME_talk7_28 165
#define FRAME_talk7_29 166
#define FRAME_talk7_30 167
#define FRAME_talk7_31 168
#define FRAME_talk7_32 169
#define FRAME_talk7_33 170
#define FRAME_talk7_34 171
#define FRAME_talk7_35 172
#define FRAME_talk7_36 173
#define FRAME_talk8_01 174
#define FRAME_talk8_02 175
#define FRAME_talk8_03 176
#define FRAME_talk8_04 177
#define FRAME_talk8_05 178
#define FRAME_talk8_06 179
#define FRAME_talk8_07 180
#define FRAME_talk8_08 181
#define FRAME_talk8_09 182
#define FRAME_talk8_10 183
#define FRAME_talk8_11 184
#define FRAME_talk8_12 185
#define FRAME_talk8_13 186
#define FRAME_talk8_14 187
#define FRAME_talk8_15 188
#define FRAME_talk8_16 189
#define FRAME_talk8_17 190
#define FRAME_talk8_18 191
#define FRAME_talk8_19 192
#define FRAME_talk8_20 193
#define FRAME_talk8_21 194
#define FRAME_talk8_22 195
#define FRAME_talk8_23 196
#define FRAME_talk8_24 197
#define FRAME_talk8_25 198
#define FRAME_talk8_26 199
#define FRAME_talk8_27 200
#define FRAME_talk8_28 201
#define FRAME_talk8_29 202
#define FRAME_talk8_30 203
#define FRAME_talk8_31 204
#define FRAME_talk8_32 205
#define FRAME_talk8_33 206
#define FRAME_talk8_34 207
#define FRAME_pull_guns_01 208
#define FRAME_pull_guns_02 209
#define FRAME_pull_guns_03 210
#define FRAME_pull_guns_04 211
#define FRAME_pull_guns_05 212
#define FRAME_pull_guns_06 213
#define FRAME_pull_guns_07 214
#define FRAME_pull_guns_08 215
#define FRAME_shoot_01 216
#define FRAME_shoot_02 217
#define FRAME_shoot_03 218
#define FRAME_shoot_04 219
#define FRAME_shoot_05 220
#define FRAME_shoot_06 221
#define FRAME_shoot_07 222
#define FRAME_shoot_08 223
#define FRAME_reload_01 224
#define FRAME_reload_02 225
#define FRAME_reload_03 226
#define FRAME_reload_04 227
#define FRAME_reload_05 228
#define FRAME_reload_06 229
#define FRAME_reload_07 230
#define FRAME_reload_08 231
#define FRAME_reload_09 232
#define FRAME_reload_10 233
#define FRAME_reload_11 234
#define FRAME_reload_12 235
#define FRAME_reload_13 236
#define FRAME_reload_14 237
#define FRAME_reload_15 238
#define FRAME_reload_16 239
#define FRAME_reload_17 240
#define FRAME_kneel_01 241
#define FRAME_kneel_02 242
#define FRAME_kneel_03 243
#define FRAME_kneel_04 244
#define FRAME_kneel_05 245
#define FRAME_kneel_06 246
#define FRAME_kneel_07 247
#define FRAME_kneel_08 248
#define FRAME_knl_shoot_01 249
#define FRAME_knl_shoot_02 250
#define FRAME_knl_shoot_03 251
#define FRAME_knl_shoot_04 252
#define FRAME_knl_shoot_05 253
#define FRAME_knl_shoot_06 254
#define FRAME_knl_shoot_07 255
#define FRAME_knl_shoot_08 256
#define FRAME_knl_shoot_09 257
#define FRAME_knl_shoot_10 258
#define FRAME_melee1_01 259
#define FRAME_melee1_02 260
#define FRAME_melee1_03 261
#define FRAME_melee1_04 262
#define FRAME_melee1_05 263
#define FRAME_melee1_06 264
#define FRAME_melee1_07 265
#define FRAME_melee1_08 266
#define FRAME_melee1_09 267
#define FRAME_melee1_10 268
#define FRAME_melee1_11 269
#define FRAME_melee1_12 270
#define FRAME_melee1_13 271
#define FRAME_melee2_01 272
#define FRAME_melee2_02 273
#define FRAME_melee2_03 274
#define FRAME_melee2_04 275
#define FRAME_melee2_05 276
#define FRAME_melee2_06 277
#define FRAME_melee2_07 278
#define FRAME_melee2_08 279
#define FRAME_melee2_09 280
#define FRAME_melee2_10 281
#define FRAME_melee2_11 282
#define FRAME_melee2_12 283
#define FRAME_melee2_13 284
#define FRAME_melee2_14 285
#define FRAME_melee2_15 286
#define FRAME_melee2_16 287
#define FRAME_melee2_17 288
#define FRAME_melee2_18 289
#define FRAME_melee3_01 290
#define FRAME_melee3_02 291
#define FRAME_melee3_03 292
#define FRAME_melee3_04 293
#define FRAME_melee3_05 294
#define FRAME_melee3_06 295
#define FRAME_melee3_07 296
#define FRAME_melee3_08 297
#define FRAME_melee3_09 298
#define FRAME_melee3_10 299
#define FRAME_melee3_11 300
#define FRAME_melee3_12 301
#define FRAME_melee3_13 302
#define FRAME_melee3_14 303
#define FRAME_melee3_15 304
#define FRAME_melee3_16 305
#define FRAME_melee3_17 306
#define FRAME_melee3_18 307
#define FRAME_melee3_19 308
#define FRAME_melee4_01 309
#define FRAME_melee4_02 310
#define FRAME_melee4_03 311
#define FRAME_melee4_04 312
#define FRAME_melee4_05 313
#define FRAME_melee4_06 314
#define FRAME_melee4_07 315
#define FRAME_melee4_08 316
#define FRAME_melee5_01 317
#define FRAME_melee5_02 318
#define FRAME_melee5_03 319
#define FRAME_melee5_04 320
#define FRAME_melee5_05 321
#define FRAME_melee5_06 322
#define FRAME_melee5_07 323
#define FRAME_melee5_08 324
#define FRAME_melee5_09 325
#define FRAME_melee5_10 326
#define FRAME_melee5_11 327
#define FRAME_melee5_12 328
#define FRAME_melee5_13 329
#define FRAME_melee6_01 330
#define FRAME_melee6_02 331
#define FRAME_melee6_03 332
#define FRAME_melee6_04 333
#define FRAME_melee6_05 334
#define FRAME_melee6_06 335
#define FRAME_melee6_07 336
#define FRAME_melee6_08 337
#define FRAME_melee6_09 338
#define FRAME_melee_amb1_01 339
#define FRAME_melee_amb1_02 340
#define FRAME_melee_amb1_03 341
#define FRAME_melee_amb1_04 342
#define FRAME_melee_amb1_05 343
#define FRAME_melee_amb1_06 344
#define FRAME_melee_amb1_07 345
#define FRAME_melee_amb1_08 346
#define FRAME_melee_amb1_09 347
#define FRAME_melee_amb1_10 348
#define FRAME_melee_amb1_11 349
#define FRAME_melee_amb1_12 350
#define FRAME_melee_amb1_13 351
#define FRAME_melee_amb1_14 352
#define FRAME_melee_amb1_15 353
#define FRAME_melee_amb1_16 354
#define FRAME_melee_amb1_17 355
#define FRAME_low_melee1_01 356
#define FRAME_low_melee1_02 357
#define FRAME_low_melee1_03 358
#define FRAME_low_melee1_04 359
#define FRAME_low_melee1_05 360
#define FRAME_low_melee1_06 361
#define FRAME_low_melee1_07 362
#define FRAME_low_melee1_08 363
#define FRAME_low_melee1_09 364
#define FRAME_low_melee2_01 365
#define FRAME_low_melee2_02 366
#define FRAME_low_melee2_03 367
#define FRAME_low_melee2_04 368
#define FRAME_low_melee2_05 369
#define FRAME_low_melee2_06 370
#define FRAME_low_melee3_01 371
#define FRAME_low_melee3_02 372
#define FRAME_low_melee3_03 373
#define FRAME_low_melee3_04 374
#define FRAME_low_melee3_05 375
#define FRAME_low_melee3_06 376
#define FRAME_low_melee4_01 377
#define FRAME_low_melee4_02 378
#define FRAME_low_melee4_03 379
#define FRAME_low_melee4_04 380
#define FRAME_low_melee4_05 381
#define FRAME_low_melee4_06 382
#define FRAME_low_melee4_07 383
#define FRAME_low_melee4_08 384
#define FRAME_low_melee5_01 385
#define FRAME_low_melee5_02 386
#define FRAME_low_melee5_03 387
#define FRAME_low_melee5_04 388
#define FRAME_low_melee5_05 389
#define FRAME_low_melee5_06 390
#define FRAME_low_melee5_07 391
#define FRAME_low_melee5_08 392
#define FRAME_low_melee5_09 393
#define FRAME_low_melee5_10 394
#define FRAME_low_melee5_11 395
#define FRAME_low_melee5_12 396
#define FRAME_low_melee5_13 397
#define FRAME_low_melee5_14 398
#define FRAME_low_melee5_15 399
#define FRAME_lw_melee_a_01 400
#define FRAME_lw_melee_a_02 401
#define FRAME_lw_melee_a_03 402
#define FRAME_lw_melee_a_04 403
#define FRAME_lw_melee_a_05 404
#define FRAME_lw_melee_a_06 405
#define FRAME_lw_melee_a_07 406
#define FRAME_lw_melee_a_08 407
#define FRAME_lw_melee_a_09 408
#define FRAME_lw_melee_a_10 409
#define FRAME_lw_melee_a_11 410
#define FRAME_lw_melee_a_12 411
#define FRAME_lw_melee_a_13 412
#define FRAME_lw_melee_a_14 413
#define FRAME_jump_01 414
#define FRAME_jump_02 415
#define FRAME_jump_03 416
#define FRAME_jump_04 417
#define FRAME_jump_05 418
#define FRAME_jump_06 419
#define FRAME_jump_07 420
#define FRAME_jump_08 421
#define FRAME_jump_09 422
#define FRAME_jump_10 423
#define FRAME_jump_11 424
#define FRAME_jump_12 425
#define FRAME_jump_13 426
#define FRAME_jump_14 427
#define FRAME_jump_15 428
#define FRAME_jump_16 429
#define FRAME_jump_17 430
#define FRAME_pstl_jump_01 431
#define FRAME_pstl_jump_02 432
#define FRAME_pstl_jump_03 433
#define FRAME_pstl_jump_04 434
#define FRAME_pstl_jump_05 435
#define FRAME_pstl_jump_06 436
#define FRAME_pstl_jump_07 437
#define FRAME_pstl_jump_08 438
#define FRAME_pstl_jump_09 439
#define FRAME_pstl_jump_10 440
#define FRAME_pstl_jump_11 441
#define FRAME_pstl_jump_12 442
#define FRAME_pstl_jump_13 443
#define FRAME_pstl_jump_14 444
#define FRAME_pstl_jump_15 445
#define FRAME_pain_Rarm_01 446
#define FRAME_pain_Rarm_02 447
#define FRAME_pain_Rarm_03 448
#define FRAME_pain_Rarm_04 449
#define FRAME_pain_Rarm_05 450
#define FRAME_pain_Rarm_06 451
#define FRAME_pain_Larm_01 452
#define FRAME_pain_Larm_02 453
#define FRAME_pain_Larm_03 454
#define FRAME_pain_Larm_04 455
#define FRAME_pain_Larm_05 456
#define FRAME_pain_Larm_06 457
#define FRAME_pain_Larm_07 458
#define FRAME_pain_Larm_08 459
#define FRAME_pain_Larm_09 460
#define FRAME_pain_chst_01 461
#define FRAME_pain_chst_02 462
#define FRAME_pain_chst_03 463
#define FRAME_pain_chst_04 464
#define FRAME_pain_chst_05 465
#define FRAME_pain_chst_06 466
#define FRAME_pain_chst_07 467
#define FRAME_pain_chst_08 468
#define FRAME_pain_chst_09 469
#define FRAME_pain_head_01 470
#define FRAME_pain_head_02 471
#define FRAME_pain_head_03 472
#define FRAME_pain_head_04 473
#define FRAME_pain_head_05 474
#define FRAME_pain_head_06 475
#define FRAME_pain_head_07 476
#define FRAME_pain_head_08 477
#define FRAME_pain_head_09 478
#define FRAME_pain_Rleg_01 479
#define FRAME_pain_Rleg_02 480
#define FRAME_pain_Rleg_03 481
#define FRAME_pain_Rleg_04 482
#define FRAME_pain_Rleg_05 483
#define FRAME_pain_Rleg_06 484
#define FRAME_pain_Rleg_07 485
#define FRAME_pain_Rleg_08 486
#define FRAME_pain_Rleg_09 487
#define FRAME_pain_Rleg_10 488
#define FRAME_pain_Rleg_11 489
#define FRAME_pain_Lleg_01 490
#define FRAME_pain_Lleg_02 491
#define FRAME_pain_Lleg_03 492
#define FRAME_pain_Lleg_04 493
#define FRAME_pain_Lleg_05 494
#define FRAME_pain_Lleg_06 495
#define FRAME_pain_Lleg_07 496
#define FRAME_pain_Lleg_08 497
#define FRAME_pain_Lleg_09 498
#define FRAME_pain_crch_01 499
#define FRAME_pain_crch_02 500
#define FRAME_pain_crch_03 501
#define FRAME_pain_crch_04 502
#define FRAME_pain_crch_05 503
#define FRAME_pain_crch_06 504
#define FRAME_pain_crch_07 505
#define FRAME_pain_crch_08 506
#define FRAME_pain_crch_09 507
#define FRAME_pain_butt_01 508
#define FRAME_pain_butt_02 509
#define FRAME_pain_butt_03 510
#define FRAME_pain_butt_04 511
#define FRAME_pain_butt_05 512
#define FRAME_pain_butt_06 513
#define FRAME_pain_butt_07 514
#define FRAME_pain_butt_08 515
#define FRAME_nw_pain_Rarm_01 516
#define FRAME_nw_pain_Rarm_02 517
#define FRAME_nw_pain_Rarm_03 518
#define FRAME_nw_pain_Rarm_04 519
#define FRAME_nw_pain_Rarm_05 520
#define FRAME_nw_pain_Rarm_06 521
#define FRAME_nw_pain_Rarm_07 522
#define FRAME_nw_pain_Rarm_08 523
#define FRAME_nw_pain_Rarm_09 524
#define FRAME_nw_pain_Larm_01 525
#define FRAME_nw_pain_Larm_02 526
#define FRAME_nw_pain_Larm_03 527
#define FRAME_nw_pain_Larm_04 528
#define FRAME_nw_pain_Larm_05 529
#define FRAME_nw_pain_Larm_06 530
#define FRAME_nw_pain_Larm_07 531
#define FRAME_nw_pain_Larm_08 532
#define FRAME_nw_pain_Larm_09 533
#define FRAME_nw_pain_Larm_10 534
#define FRAME_nw_pain_chst_01 535
#define FRAME_nw_pain_chst_02 536
#define FRAME_nw_pain_chst_03 537
#define FRAME_nw_pain_chst_04 538
#define FRAME_nw_pain_chst_05 539
#define FRAME_nw_pain_chst_06 540
#define FRAME_nw_pain_chst_07 541
#define FRAME_nw_pain_chst_08 542
#define FRAME_nw_pain_chst_09 543
#define FRAME_nw_pain_crch_01 544
#define FRAME_nw_pain_crch_02 545
#define FRAME_nw_pain_crch_03 546
#define FRAME_nw_pain_crch_04 547
#define FRAME_nw_pain_crch_05 548
#define FRAME_nw_pain_crch_06 549
#define FRAME_nw_pain_crch_07 550
#define FRAME_nw_pain_crch_08 551
#define FRAME_nw_pain_crch_09 552
#define FRAME_nw_pain_butt_01 553
#define FRAME_nw_pain_butt_02 554
#define FRAME_nw_pain_butt_03 555
#define FRAME_nw_pain_butt_04 556
#define FRAME_nw_pain_butt_05 557
#define FRAME_nw_pain_butt_06 558
#define FRAME_nw_pain_butt_07 559
#define FRAME_nw_pain_butt_08 560
#define FRAME_nw_pain_butt_09 561
#define FRAME_nw_pain_head_01 562
#define FRAME_nw_pain_head_02 563
#define FRAME_nw_pain_head_03 564
#define FRAME_nw_pain_head_04 565
#define FRAME_nw_pain_head_05 566
#define FRAME_nw_pain_head_06 567
#define FRAME_nw_pain_head_07 568
#define FRAME_nw_pain_head_08 569
#define FRAME_nw_pain_Rleg_01 570
#define FRAME_nw_pain_Rleg_02 571
#define FRAME_nw_pain_Rleg_03 572
#define FRAME_nw_pain_Rleg_04 573
#define FRAME_nw_pain_Rleg_05 574
#define FRAME_nw_pain_Rleg_06 575
#define FRAME_nw_pain_Rleg_07 576
#define FRAME_nw_pain_Rleg_08 577
#define FRAME_nw_pain_Rleg_09 578
#define FRAME_nw_pain_Lleg_01 579
#define FRAME_nw_pain_Lleg_02 580
#define FRAME_nw_pain_Lleg_03 581
#define FRAME_nw_pain_Lleg_04 582
#define FRAME_nw_pain_Lleg_05 583
#define FRAME_nw_pain_Lleg_06 584
#define FRAME_nw_pain_Lleg_07 585
#define FRAME_nw_pain_Lleg_08 586
#define FRAME_nw_pain_Lleg_09 587
#define FRAME_nw_pain_Lleg_10 588
#define FRAME_nw_pain_Lleg_11 589
#define FRAME_death1_01 590
#define FRAME_death1_02 591
#define FRAME_death1_03 592
#define FRAME_death1_04 593
#define FRAME_death1_05 594
#define FRAME_death1_06 595
#define FRAME_death1_07 596
#define FRAME_death1_08 597
#define FRAME_death1_09 598
#define FRAME_death1_10 599
#define FRAME_death1_11 600
#define FRAME_death1_12 601
#define FRAME_death1_13 602
#define FRAME_death1_14 603
#define FRAME_death1_15 604
#define FRAME_death1_16 605
#define FRAME_death1_17 606
#define FRAME_death1_18 607
#define FRAME_death1_19 608
#define FRAME_death1_20 609
#define FRAME_death1_21 610
#define FRAME_death1_22 611
#define FRAME_death2_01 612
#define FRAME_death2_02 613
#define FRAME_death2_03 614
#define FRAME_death2_04 615
#define FRAME_death2_05 616
#define FRAME_death2_06 617
#define FRAME_death2_07 618
#define FRAME_death2_08 619
#define FRAME_death2_09 620
#define FRAME_death2_10 621
#define FRAME_death2_11 622
#define FRAME_death2_12 623
#define FRAME_death2_13 624
#define FRAME_death2_14 625
#define FRAME_death3_01 626
#define FRAME_death3_02 627
#define FRAME_death3_03 628
#define FRAME_death3_04 629
#define FRAME_death3_05 630
#define FRAME_death3_06 631
#define FRAME_death3_07 632
#define FRAME_death3_08 633
#define FRAME_death3_09 634
#define FRAME_death3_10 635
#define FRAME_death3_11 636
#define FRAME_death3_12 637
#define FRAME_death3_13 638
#define FRAME_death3_14 639
#define FRAME_death3_15 640
#define FRAME_death3_16 641
#define FRAME_death3_17 642
#define FRAME_death3_18 643
#define FRAME_death3_19 644
#define FRAME_death4_01 645
#define FRAME_death4_02 646
#define FRAME_death4_03 647
#define FRAME_death4_04 648
#define FRAME_death4_05 649
#define FRAME_death4_06 650
#define FRAME_death4_07 651
#define FRAME_death4_08 652
#define FRAME_death4_09 653
#define FRAME_death4_10 654
#define FRAME_death4_11 655
#define FRAME_death4_12 656
#define FRAME_death4_13 657
#define FRAME_death4_14 658
#define FRAME_death4_15 659
#define FRAME_death4_16 660
#define FRAME_death4_17 661
#define FRAME_death5_01 662
#define FRAME_death5_02 663
#define FRAME_death5_03 664
#define FRAME_death5_04 665
#define FRAME_death5_05 666
#define FRAME_death5_06 667
#define FRAME_death5_07 668
#define FRAME_death5_08 669
#define FRAME_death5_09 670
#define FRAME_death5_10 671
#define FRAME_death5_11 672
#define FRAME_death5_12 673
#define FRAME_death5_13 674
#define FRAME_death5_14 675
#define FRAME_death5_15 676
#define FRAME_death5_16 677
#define FRAME_death5_17 678
#define FRAME_death5_18 679
#define FRAME_death5_19 680
#define FRAME_death6_01 681
#define FRAME_death6_02 682
#define FRAME_death6_03 683
#define FRAME_death6_04 684
#define FRAME_death6_05 685
#define FRAME_death6_06 686
#define FRAME_death6_07 687
#define FRAME_death6_08 688
#define FRAME_death6_09 689
#define FRAME_death6_10 690
#define FRAME_death6_11 691
#define FRAME_death6_12 692
#define FRAME_death6_13 693
#define FRAME_death6_14 694
#define FRAME_death6_15 695
#define FRAME_death6_16 696
#define FRAME_death6_17 697
#define FRAME_death6_18 698
#define FRAME_crch_knl_dn_01 699
#define FRAME_crch_knl_dn_02 700
#define FRAME_crch_knl_dn_03 701
#define FRAME_crch_knl_dn_04 702
#define FRAME_crch_knl_dn_05 703
#define FRAME_crch_knl_dn_06 704
#define FRAME_crch_knl_dn_07 705
#define FRAME_crch_knl_dn_08 706
#define FRAME_crch_knl_dn_09 707
#define FRAME_crch_amb_sdt_01 708
#define FRAME_crch_amb_sdt_02 709
#define FRAME_crch_amb_sdt_03 710
#define FRAME_crch_amb_sdt_04 711
#define FRAME_crch_amb_sdt_05 712
#define FRAME_crch_amb_sdt_06 713
#define FRAME_crch_amb_sdt_07 714
#define FRAME_crch_amb_sdt_08 715
#define FRAME_crch_amb_sdt_09 716
#define FRAME_crch_amb_sdt_10 717
#define FRAME_crch_amb_sdt_11 718
#define FRAME_crch_amb_sdt_12 719
#define FRAME_crch_amb_sdt_13 720
#define FRAME_crch_amb_sdt_14 721
#define FRAME_crch_amb_sdt_15 722
#define FRAME_crch_amb_sdt_16 723
#define FRAME_crch_amb_sdt_17 724
#define FRAME_crch_amb_sdt_18 725
#define FRAME_crch_amb_sdt_19 726
#define FRAME_crch_amb_sdt_20 727
#define FRAME_crch_amb_sdt_21 728
#define FRAME_crch_amb_sdt_22 729
#define FRAME_crch_amb_sdt_23 730
#define FRAME_crch_amb_sdt_24 731
#define FRAME_crch_amb_sdt_25 732
#define FRAME_crch_amb_sdt_26 733
#define FRAME_crch_amb_sdt_27 734
#define FRAME_crch_shoot_01 735
#define FRAME_crch_shoot_02 736
#define FRAME_crch_shoot_03 737
#define FRAME_crch_shoot_04 738
#define FRAME_crch_shoot_05 739
#define FRAME_crch_shoot_06 740
#define FRAME_crch_shoot_07 741
#define FRAME_crch_shoot_08 742
#define FRAME_crch_shoot_09 743
#define FRAME_crouch_walk_01 744
#define FRAME_crouch_walk_02 745
#define FRAME_crouch_walk_03 746
#define FRAME_crouch_walk_04 747
#define FRAME_crouch_walk_05 748
#define FRAME_crouch_walk_06 749
#define FRAME_crouch_walk_07 750
#define FRAME_crouch_walk_08 751
#define FRAME_c_pain_Rarm_01 752
#define FRAME_c_pain_Rarm_02 753
#define FRAME_c_pain_Rarm_03 754
#define FRAME_c_pain_Rarm_04 755
#define FRAME_c_pain_Rarm_05 756
#define FRAME_c_pain_Rarm_06 757
#define FRAME_c_pain_Rarm_07 758
#define FRAME_c_pain_Rarm_08 759
#define FRAME_c_pain_Rarm_09 760
#define FRAME_c_pain_Rarm_10 761
#define FRAME_c_pain_Rarm_11 762
#define FRAME_c_pain_Rarm_12 763
#define FRAME_c_pain_Larm_01 764
#define FRAME_c_pain_Larm_02 765
#define FRAME_c_pain_Larm_03 766
#define FRAME_c_pain_Larm_04 767
#define FRAME_c_pain_Larm_05 768
#define FRAME_c_pain_Larm_06 769
#define FRAME_c_pain_Larm_07 770
#define FRAME_c_pain_Larm_08 771
#define FRAME_c_pain_Larm_09 772
#define FRAME_c_pain_Larm_10 773
#define FRAME_c_pain_Larm_11 774
#define FRAME_c_pain_Larm_12 775
#define FRAME_c_pain_Larm_13 776
#define FRAME_c_pain_chst_01 777
#define FRAME_c_pain_chst_02 778
#define FRAME_c_pain_chst_03 779
#define FRAME_c_pain_chst_04 780
#define FRAME_c_pain_chst_05 781
#define FRAME_c_pain_chst_06 782
#define FRAME_c_pain_chst_07 783
#define FRAME_c_pain_chst_08 784
#define FRAME_c_pain_chst_09 785
#define FRAME_c_pain_chst_10 786
#define FRAME_c_pain_chst_11 787
#define FRAME_c_pain_head_01 788
#define FRAME_c_pain_head_02 789
#define FRAME_c_pain_head_03 790
#define FRAME_c_pain_head_04 791
#define FRAME_c_pain_head_05 792
#define FRAME_c_pain_head_06 793
#define FRAME_c_pain_head_07 794
#define FRAME_c_pain_head_08 795
#define FRAME_c_pain_head_09 796
#define FRAME_c_pain_head_10 797
#define FRAME_c_pain_head_11 798
#define FRAME_c_pain_head_12 799
#define FRAME_c_pain_head_13 800
#define FRAME_c_pain_head_14 801
#define FRAME_c_pain_head_15 802
#define FRAME_c_pain_head_16 803
#define FRAME_evade_01 804
#define FRAME_evade_02 805
#define FRAME_evade_03 806
#define FRAME_evade_04 807
#define FRAME_evade_05 808
#define FRAME_evade_06 809
#define FRAME_evade_07 810
#define FRAME_evade_08 811
#define FRAME_evade_09 812
#define FRAME_evade_10 813
#define FRAME_evade_amb_01 814
#define FRAME_evade_amb_02 815
#define FRAME_evade_amb_03 816
#define FRAME_evade_amb_04 817
#define FRAME_evade_amb_05 818
#define FRAME_evade_amb_06 819
#define FRAME_evade_amb_07 820
#define FRAME_evade_amb_08 821
#define FRAME_evade_amb_09 822
#define FRAME_evade_amb_10 823
#define FRAME_evade_amb_11 824
#define FRAME_evade_amb_12 825
#define FRAME_lside_step_01 826
#define FRAME_lside_step_02 827
#define FRAME_lside_step_03 828
#define FRAME_lside_step_04 829
#define FRAME_lside_step_05 830
#define FRAME_lside_step_06 831
#define FRAME_lside_step_07 832
#define FRAME_lside_step_08 833
#define FRAME_lside_step_09 834
#define FRAME_lside_step_10 835
#define FRAME_rside_step_01 836
#define FRAME_rside_step_02 837
#define FRAME_rside_step_03 838
#define FRAME_rside_step_04 839
#define FRAME_rside_step_05 840
#define FRAME_rside_step_06 841
#define FRAME_rside_step_07 842
#define FRAME_rside_step_08 843
#define FRAME_rside_step_09 844
#define FRAME_walk_guns_dn_01 845
#define FRAME_walk_guns_dn_02 846
#define FRAME_walk_guns_dn_03 847
#define FRAME_walk_guns_dn_04 848
#define FRAME_walk_guns_dn_05 849
#define FRAME_walk_guns_dn_06 850
#define FRAME_walk_guns_dn_07 851
#define FRAME_walk_guns_dn_08 852
#define FRAME_walk_guns_dn_09 853
#define FRAME_walk_guns_dn_10 854
#define FRAME_walk_shoot_01 855
#define FRAME_walk_shoot_02 856
#define FRAME_walk_shoot_03 857
#define FRAME_walk_shoot_04 858
#define FRAME_walk_shoot_05 859
#define FRAME_walk_shoot_06 860
#define FRAME_walk_shoot_07 861
#define FRAME_walk_shoot_08 862
#define FRAME_walk_shoot_09 863
#define FRAME_walk_shoot_10 864
#define FRAME_run_guns_dn_01 865
#define FRAME_run_guns_dn_02 866
#define FRAME_run_guns_dn_03 867
#define FRAME_run_guns_dn_04 868
#define FRAME_run_guns_dn_05 869
#define FRAME_run_guns_dn_06 870
#define FRAME_run_shoot_01 871
#define FRAME_run_shoot_02 872
#define FRAME_run_shoot_03 873
#define FRAME_run_shoot_04 874
#define FRAME_run_shoot_05 875
#define FRAME_run_shoot_06 876
#define FRAME_run_on_fire_01 877
#define FRAME_run_on_fire_02 878
#define FRAME_run_on_fire_03 879
#define FRAME_run_on_fire_04 880
#define FRAME_run_on_fire_05 881
#define FRAME_run_on_fire_06 882
#define FRAME_run_melee_01 883
#define FRAME_run_melee_02 884
#define FRAME_run_melee_03 885
#define FRAME_run_melee_04 886
#define FRAME_run_melee_05 887
#define FRAME_run_melee_06 888
#define FRAME_lside_run_01 889
#define FRAME_lside_run_02 890
#define FRAME_lside_run_03 891
#define FRAME_lside_run_04 892
#define FRAME_lside_run_05 893
#define FRAME_lside_run_06 894
#define FRAME_rside_run_01 895
#define FRAME_rside_run_02 896
#define FRAME_rside_run_03 897
#define FRAME_rside_run_04 898
#define FRAME_rside_run_05 899
#define FRAME_rside_run_06 900
#define FRAME_crch_death1_01 901
#define FRAME_crch_death1_02 902
#define FRAME_crch_death1_03 903
#define FRAME_crch_death1_04 904
#define FRAME_crch_death1_05 905
#define FRAME_crch_death1_06 906
#define FRAME_crch_death1_07 907
#define FRAME_crch_death1_08 908
#define FRAME_crch_death1_09 909
#define FRAME_crch_death1_10 910
#define FRAME_crch_death1_11 911
#define FRAME_crch_death1_12 912
#define FRAME_crch_death1_13 913
#define FRAME_crch_death1_14 914
#define FRAME_crch_death1_15 915
#define FRAME_crch_death1_16 916
#define FRAME_crch_death1_17 917
#define FRAME_crch_death1_18 918
#define FRAME_crch_death1_19 919
#define FRAME_crch_death2_01 920
#define FRAME_crch_death2_02 921
#define FRAME_crch_death2_03 922
#define FRAME_crch_death2_04 923
#define FRAME_crch_death2_05 924
#define FRAME_crch_death2_06 925
#define FRAME_crch_death2_07 926
#define FRAME_crch_death2_08 927
#define FRAME_crch_death2_09 928
#define FRAME_crch_death2_10 929
#define FRAME_crch_death2_11 930
#define FRAME_crch_death3_01 931
#define FRAME_crch_death3_02 932
#define FRAME_crch_death3_03 933
#define FRAME_crch_death3_04 934
#define FRAME_crch_death3_05 935
#define FRAME_crch_death3_06 936
#define FRAME_crch_death3_07 937
#define FRAME_crch_death3_08 938
#define FRAME_crch_death3_09 939
#define FRAME_crch_death3_10 940
#define FRAME_crch_death3_11 941
#define FRAME_crch_death3_12 942
#define FRAME_crch_death3_13 943
#define FRAME_crch_death3_14 944
#define FRAME_crch_death3_15 945
#define FRAME_crch_death3_16 946
#define FRAME_crch_death3_17 947
#define FRAME_crch_death3_18 948
#define FRAME_clmb_loop_01 949
#define FRAME_clmb_loop_02 950
#define FRAME_clmb_loop_03 951
#define FRAME_clmb_loop_04 952
#define FRAME_clmb_loop_05 953
#define FRAME_clmb_loop_06 954
#define FRAME_clmb_loop_07 955
#define FRAME_clmb_loop_08 956
#define FRAME_clmb_loop_09 957
#define FRAME_clmb_loop_10 958
#define FRAME_clmb_over_01 959
#define FRAME_clmb_over_02 960
#define FRAME_clmb_over_03 961
#define FRAME_clmb_over_04 962
#define FRAME_clmb_over_05 963
#define FRAME_clmb_over_06 964
#define FRAME_clmb_over_07 965
#define FRAME_clmb_over_08 966
#define FRAME_clmb_over_09 967
#define FRAME_clmb_over_10 968
#define FRAME_clmb_over_11 969
#define FRAME_clmb_over_12 970
#define MODEL_SCALE 1.000000

1414
gamesrc/AI_THUG.C Normal file

File diff suppressed because it is too large Load diff

758
gamesrc/AI_THUG.H Normal file
View file

@ -0,0 +1,758 @@
#define FRAME_amb_stand_01 0
#define FRAME_amb_stand_02 1
#define FRAME_amb_stand_03 2
#define FRAME_amb_stand_04 3
#define FRAME_amb_stand_05 4
#define FRAME_amb_stand_06 5
#define FRAME_amb_stand_07 6
#define FRAME_amb_stand_08 7
#define FRAME_amb_stand_09 8
#define FRAME_amb_stand_10 9
#define FRAME_amb_stand_11 10
#define FRAME_amb_stand_12 11
#define FRAME_amb_stand_13 12
#define FRAME_amb_stand_14 13
#define FRAME_amb_stand_15 14
#define FRAME_amb_stand_16 15
#define FRAME_amb_stand_17 16
#define FRAME_amb_stand_18 17
#define FRAME_amb_stand_19 18
#define FRAME_amb_stand_20 19
#define FRAME_amb_stand_21 20
#define FRAME_amb_stand_22 21
#define FRAME_amb_stand_23 22
#define FRAME_amb_stand_24 23
#define FRAME_amb_stand_25 24
#define FRAME_amb_stand_26 25
#define FRAME_amb_stand_27 26
#define FRAME_amb_stand_28 27
#define FRAME_amb_stand_29 28
#define FRAME_amb_stand_30 29
#define FRAME_amb_stand_31 30
#define FRAME_amb_stand_32 31
#define FRAME_amb_stand_33 32
#define FRAME_amb_stand_34 33
#define FRAME_amb_stand_35 34
#define FRAME_amb_stand_36 35
#define FRAME_amb_stand_37 36
#define FRAME_amb_stand_38 37
#define FRAME_amb_stand_39 38
#define FRAME_amb_stand_40 39
#define FRAME_amb_stand_41 40
#define FRAME_amb_stand_42 41
#define FRAME_talk1_01 42
#define FRAME_talk1_02 43
#define FRAME_talk1_03 44
#define FRAME_talk1_04 45
#define FRAME_talk1_05 46
#define FRAME_talk1_06 47
#define FRAME_talk1_07 48
#define FRAME_talk1_08 49
#define FRAME_talk1_09 50
#define FRAME_talk1_10 51
#define FRAME_talk1_11 52
#define FRAME_talk1_12 53
#define FRAME_talk1_13 54
#define FRAME_talk1_14 55
#define FRAME_talk1_15 56
#define FRAME_talk1_16 57
#define FRAME_talk1_17 58
#define FRAME_handwave_01 59
#define FRAME_handwave_02 60
#define FRAME_handwave_03 61
#define FRAME_handwave_04 62
#define FRAME_handwave_05 63
#define FRAME_handwave_06 64
#define FRAME_handwave_07 65
#define FRAME_handwave_08 66
#define FRAME_handwave_09 67
#define FRAME_handwave_10 68
#define FRAME_handwave_11 69
#define FRAME_handwave_12 70
#define FRAME_handwave_13 71
#define FRAME_handwave_14 72
#define FRAME_nod_yes_01 73
#define FRAME_nod_yes_02 74
#define FRAME_nod_yes_03 75
#define FRAME_nod_yes_04 76
#define FRAME_nod_yes_05 77
#define FRAME_nod_yes_06 78
#define FRAME_nod_yes_07 79
#define FRAME_nod_yes_08 80
#define FRAME_nod_yes_09 81
#define FRAME_nod_yes_10 82
#define FRAME_nod_yes_11 83
#define FRAME_nod_yes_12 84
#define FRAME_nod_yes_13 85
#define FRAME_nod_yes_14 86
#define FRAME_nod_yes_15 87
#define FRAME_nod_yes_16 88
#define FRAME_nod_yes_17 89
#define FRAME_nod_yes_18 90
#define FRAME_nod_yes_19 91
#define FRAME_whoa_01 92
#define FRAME_whoa_02 93
#define FRAME_whoa_03 94
#define FRAME_whoa_04 95
#define FRAME_whoa_05 96
#define FRAME_whoa_06 97
#define FRAME_whoa_07 98
#define FRAME_whoa_08 99
#define FRAME_whoa_09 100
#define FRAME_whoa_10 101
#define FRAME_crch_grab_01 102
#define FRAME_crch_grab_02 103
#define FRAME_crch_grab_03 104
#define FRAME_crch_grab_04 105
#define FRAME_crch_grab_05 106
#define FRAME_crch_grab_06 107
#define FRAME_crch_grab_07 108
#define FRAME_crch_grab_08 109
#define FRAME_crch_grab_09 110
#define FRAME_crch_grab_10 111
#define FRAME_crch_grab_11 112
#define FRAME_crch_grab_12 113
#define FRAME_crch_grab_13 114
#define FRAME_crch_grab_14 115
#define FRAME_crch_grab_15 116
#define FRAME_crch_grab_16 117
#define FRAME_crch_grab_17 118
#define FRAME_crch_grab_18 119
#define FRAME_crch_grab_19 120
#define FRAME_crch_grab_20 121
#define FRAME_crch_grab_21 122
#define FRAME_crch_grab_22 123
#define FRAME_crch_grab_23 124
#define FRAME_crch_grab_24 125
#define FRAME_up_yours_01 126
#define FRAME_up_yours_02 127
#define FRAME_up_yours_03 128
#define FRAME_up_yours_04 129
#define FRAME_up_yours_05 130
#define FRAME_up_yours_06 131
#define FRAME_up_yours_07 132
#define FRAME_up_yours_08 133
#define FRAME_up_yours_09 134
#define FRAME_up_yours_10 135
#define FRAME_up_yours_11 136
#define FRAME_up_yours_12 137
#define FRAME_up_yours_13 138
#define FRAME_up_yours_14 139
#define FRAME_up_yours_15 140
#define FRAME_up_yours_16 141
#define FRAME_up_yours_17 142
#define FRAME_up_yours_18 143
#define FRAME_up_yours_19 144
#define FRAME_up_yours_20 145
#define FRAME_up_yours_21 146
#define FRAME_up_yours_22 147
#define FRAME_up_yours_23 148
#define FRAME_up_yours_24 149
#define FRAME_nod_no_01 150
#define FRAME_nod_no_02 151
#define FRAME_nod_no_03 152
#define FRAME_nod_no_04 153
#define FRAME_nod_no_05 154
#define FRAME_nod_no_06 155
#define FRAME_nod_no_07 156
#define FRAME_nod_no_08 157
#define FRAME_nod_no_09 158
#define FRAME_nod_no_10 159
#define FRAME_nod_no_11 160
#define FRAME_nod_no_12 161
#define FRAME_nod_no_13 162
#define FRAME_nod_no_14 163
#define FRAME_nod_no_15 164
#define FRAME_nod_no_16 165
#define FRAME_nod_no_17 166
#define FRAME_nod_no_18 167
#define FRAME_nod_no_19 168
#define FRAME_nod_no_20 169
#define FRAME_nod_no_21 170
#define FRAME_pull_guns_01 171
#define FRAME_pull_guns_02 172
#define FRAME_pull_guns_03 173
#define FRAME_pull_guns_04 174
#define FRAME_pull_guns_05 175
#define FRAME_pull_guns_06 176
#define FRAME_pull_guns_07 177
#define FRAME_pull_guns_08 178
#define FRAME_shoot_01 179
#define FRAME_shoot_02 180
#define FRAME_shoot_03 181
#define FRAME_shoot_04 182
#define FRAME_reload_01 183
#define FRAME_reload_02 184
#define FRAME_reload_03 185
#define FRAME_reload_04 186
#define FRAME_reload_05 187
#define FRAME_reload_06 188
#define FRAME_reload_07 189
#define FRAME_reload_08 190
#define FRAME_reload_09 191
#define FRAME_reload_10 192
#define FRAME_reload_11 193
#define FRAME_reload_12 194
#define FRAME_reload_13 195
#define FRAME_kneel_01 196
#define FRAME_kneel_02 197
#define FRAME_kneel_03 198
#define FRAME_kneel_04 199
#define FRAME_kneel_05 200
#define FRAME_kneel_06 201
#define FRAME_kneel_07 202
#define FRAME_knl_shoot_01 203
#define FRAME_knl_shoot_02 204
#define FRAME_knl_shoot_03 205
#define FRAME_knl_shoot_04 206
#define FRAME_knl_shoot_05 207
#define FRAME_knl_shoot_06 208
#define FRAME_melee1_01 209
#define FRAME_melee1_02 210
#define FRAME_melee1_03 211
#define FRAME_melee1_04 212
#define FRAME_melee1_05 213
#define FRAME_melee1_06 214
#define FRAME_melee1_07 215
#define FRAME_melee1_08 216
#define FRAME_melee2_01 217
#define FRAME_melee2_02 218
#define FRAME_melee2_03 219
#define FRAME_melee2_04 220
#define FRAME_melee2_05 221
#define FRAME_melee2_06 222
#define FRAME_melee2_07 223
#define FRAME_melee2_08 224
#define FRAME_melee2_09 225
#define FRAME_melee3_01 226
#define FRAME_melee3_02 227
#define FRAME_melee3_03 228
#define FRAME_melee3_04 229
#define FRAME_melee3_05 230
#define FRAME_melee3_06 231
#define FRAME_melee3_07 232
#define FRAME_melee4_01 233
#define FRAME_melee4_02 234
#define FRAME_melee4_03 235
#define FRAME_melee4_04 236
#define FRAME_melee4_05 237
#define FRAME_melee4_06 238
#define FRAME_melee5_01 239
#define FRAME_melee5_02 240
#define FRAME_melee5_03 241
#define FRAME_melee5_04 242
#define FRAME_melee5_05 243
#define FRAME_melee5_06 244
#define FRAME_melee5_07 245
#define FRAME_low_melee1_01 246
#define FRAME_low_melee1_02 247
#define FRAME_low_melee1_03 248
#define FRAME_low_melee1_04 249
#define FRAME_low_melee1_05 250
#define FRAME_low_melee1_06 251
#define FRAME_low_melee1_07 252
#define FRAME_low_melee1_08 253
#define FRAME_low_melee1_09 254
#define FRAME_low_melee1_10 255
#define FRAME_jump_01 256
#define FRAME_jump_02 257
#define FRAME_jump_03 258
#define FRAME_jump_04 259
#define FRAME_jump_05 260
#define FRAME_jump_06 261
#define FRAME_jump_07 262
#define FRAME_jump_08 263
#define FRAME_jump_09 264
#define FRAME_jump_10 265
#define FRAME_jump_11 266
#define FRAME_jump_12 267
#define FRAME_jump_13 268
#define FRAME_jump_14 269
#define FRAME_jump_15 270
#define FRAME_jump_16 271
#define FRAME_jump_17 272
#define FRAME_st_clmb_01 273
#define FRAME_st_clmb_02 274
#define FRAME_clmb_loop_01 275
#define FRAME_clmb_loop_02 276
#define FRAME_clmb_loop_03 277
#define FRAME_clmb_loop_04 278
#define FRAME_clmb_loop_05 279
#define FRAME_clmb_loop_06 280
#define FRAME_clmb_loop_07 281
#define FRAME_clmb_loop_08 282
#define FRAME_clmb_loop_09 283
#define FRAME_clmb_over_01 284
#define FRAME_clmb_over_02 285
#define FRAME_clmb_over_03 286
#define FRAME_clmb_over_04 287
#define FRAME_clmb_over_05 288
#define FRAME_clmb_over_06 289
#define FRAME_clmb_over_07 290
#define FRAME_clmb_over_08 291
#define FRAME_clmb_over_09 292
#define FRAME_clmb_over_10 293
#define FRAME_clmb_over_11 294
#define FRAME_clmb_over_12 295
#define FRAME_clmb_over_13 296
#define FRAME_clmb_over_14 297
#define FRAME_clmb_over_15 298
#define FRAME_pain_Rarm_01 299
#define FRAME_pain_Rarm_02 300
#define FRAME_pain_Rarm_03 301
#define FRAME_pain_Rarm_04 302
#define FRAME_pain_Rarm_05 303
#define FRAME_pain_Rarm_06 304
#define FRAME_pain_Rarm_07 305
#define FRAME_pain_Rarm_08 306
#define FRAME_pain_Rarm_09 307
#define FRAME_pain_Rarm_10 308
#define FRAME_pain_Larm_01 309
#define FRAME_pain_Larm_02 310
#define FRAME_pain_Larm_03 311
#define FRAME_pain_Larm_04 312
#define FRAME_pain_Larm_05 313
#define FRAME_pain_Larm_06 314
#define FRAME_pain_Larm_07 315
#define FRAME_pain_Larm_08 316
#define FRAME_pain_Larm_09 317
#define FRAME_pain_chest_01 318
#define FRAME_pain_chest_02 319
#define FRAME_pain_chest_03 320
#define FRAME_pain_chest_04 321
#define FRAME_pain_chest_05 322
#define FRAME_pain_chest_06 323
#define FRAME_pain_chest_07 324
#define FRAME_pain_chest_08 325
#define FRAME_pain_chest_09 326
#define FRAME_pain_head_01 327
#define FRAME_pain_head_02 328
#define FRAME_pain_head_03 329
#define FRAME_pain_head_04 330
#define FRAME_pain_head_05 331
#define FRAME_pain_head_06 332
#define FRAME_pain_head_07 333
#define FRAME_pain_head_08 334
#define FRAME_pain_head_09 335
#define FRAME_pain_head_10 336
#define FRAME_pain_Rleg_01 337
#define FRAME_pain_Rleg_02 338
#define FRAME_pain_Rleg_03 339
#define FRAME_pain_Rleg_04 340
#define FRAME_pain_Rleg_05 341
#define FRAME_pain_Rleg_06 342
#define FRAME_pain_Rleg_07 343
#define FRAME_pain_Rleg_08 344
#define FRAME_pain_Rleg_09 345
#define FRAME_pain_Rleg_10 346
#define FRAME_pain_Lleg_01 347
#define FRAME_pain_Lleg_02 348
#define FRAME_pain_Lleg_03 349
#define FRAME_pain_Lleg_04 350
#define FRAME_pain_Lleg_05 351
#define FRAME_pain_Lleg_06 352
#define FRAME_pain_Lleg_07 353
#define FRAME_pain_Lleg_08 354
#define FRAME_pain_crch_01 355
#define FRAME_pain_crch_02 356
#define FRAME_pain_crch_03 357
#define FRAME_pain_crch_04 358
#define FRAME_pain_crch_05 359
#define FRAME_pain_crch_06 360
#define FRAME_pain_crch_07 361
#define FRAME_pain_crch_08 362
#define FRAME_pain_crch_09 363
#define FRAME_pain_crch_10 364
#define FRAME_pain_crch_11 365
#define FRAME_pain_butt_01 366
#define FRAME_pain_butt_02 367
#define FRAME_pain_butt_03 368
#define FRAME_pain_butt_04 369
#define FRAME_pain_butt_05 370
#define FRAME_pain_butt_06 371
#define FRAME_pain_butt_07 372
#define FRAME_pain_butt_08 373
#define FRAME_pain_butt_09 374
#define FRAME_nw_pain_Rarm_01 375
#define FRAME_nw_pain_Rarm_02 376
#define FRAME_nw_pain_Rarm_03 377
#define FRAME_nw_pain_Rarm_04 378
#define FRAME_nw_pain_Rarm_05 379
#define FRAME_nw_pain_Rarm_06 380
#define FRAME_nw_pain_Rarm_07 381
#define FRAME_nw_pain_Rarm_08 382
#define FRAME_nw_pain_Rarm_09 383
#define FRAME_nw_pain_Rarm_10 384
#define FRAME_nw_pain_Rarm_11 385
#define FRAME_nw_pain_Larm_01 386
#define FRAME_nw_pain_Larm_02 387
#define FRAME_nw_pain_Larm_03 388
#define FRAME_nw_pain_Larm_04 389
#define FRAME_nw_pain_Larm_05 390
#define FRAME_nw_pain_Larm_06 391
#define FRAME_nw_pain_Larm_07 392
#define FRAME_nw_pain_Larm_08 393
#define FRAME_nw_pain_Larm_09 394
#define FRAME_nw_pain_Larm_10 395
#define FRAME_nw_pain_Larm_11 396
#define FRAME_nw_pain_chst_01 397
#define FRAME_nw_pain_chst_02 398
#define FRAME_nw_pain_chst_03 399
#define FRAME_nw_pain_chst_04 400
#define FRAME_nw_pain_chst_05 401
#define FRAME_nw_pain_chst_06 402
#define FRAME_nw_pain_chst_07 403
#define FRAME_nw_pain_chst_08 404
#define FRAME_nw_pain_chst_09 405
#define FRAME_nw_pain_chst_10 406
#define FRAME_nw_pain_chst_11 407
#define FRAME_nw_pain_head_01 408
#define FRAME_nw_pain_head_02 409
#define FRAME_nw_pain_head_03 410
#define FRAME_nw_pain_head_04 411
#define FRAME_nw_pain_head_05 412
#define FRAME_nw_pain_head_06 413
#define FRAME_nw_pain_head_07 414
#define FRAME_nw_pain_head_08 415
#define FRAME_nw_pain_Rleg_01 416
#define FRAME_nw_pain_Rleg_02 417
#define FRAME_nw_pain_Rleg_03 418
#define FRAME_nw_pain_Rleg_04 419
#define FRAME_nw_pain_Rleg_05 420
#define FRAME_nw_pain_Rleg_06 421
#define FRAME_nw_pain_Rleg_07 422
#define FRAME_nw_pain_Rleg_08 423
#define FRAME_nw_pain_Rleg_09 424
#define FRAME_nw_pain_Rleg_10 425
#define FRAME_nw_pain_Lleg_01 426
#define FRAME_nw_pain_Lleg_02 427
#define FRAME_nw_pain_Lleg_03 428
#define FRAME_nw_pain_Lleg_04 429
#define FRAME_nw_pain_Lleg_05 430
#define FRAME_nw_pain_Lleg_06 431
#define FRAME_nw_pain_Lleg_07 432
#define FRAME_nw_pain_Lleg_08 433
#define FRAME_nw_pain_Lleg_09 434
#define FRAME_nw_pain_Lleg_10 435
#define FRAME_nw_pain_Lleg_11 436
#define FRAME_nw_pain_Lleg_12 437
#define FRAME_nw_pain_Lleg_13 438
#define FRAME_nw_pain_crch_01 439
#define FRAME_nw_pain_crch_02 440
#define FRAME_nw_pain_crch_03 441
#define FRAME_nw_pain_crch_04 442
#define FRAME_nw_pain_crch_05 443
#define FRAME_nw_pain_crch_06 444
#define FRAME_nw_pain_crch_07 445
#define FRAME_nw_pain_crch_08 446
#define FRAME_nw_pain_crch_09 447
#define FRAME_nw_pain_crch_10 448
#define FRAME_nw_pain_crch_11 449
#define FRAME_nw_pain_crch_12 450
#define FRAME_nw_pain_crch_13 451
#define FRAME_nw_pain_crch_14 452
#define FRAME_nw_pain_crch_15 453
#define FRAME_nw_pain_crch_16 454
#define FRAME_nw_pain_butt_01 455
#define FRAME_nw_pain_butt_02 456
#define FRAME_nw_pain_butt_03 457
#define FRAME_nw_pain_butt_04 458
#define FRAME_nw_pain_butt_05 459
#define FRAME_nw_pain_butt_06 460
#define FRAME_nw_pain_butt_07 461
#define FRAME_nw_pain_butt_08 462
#define FRAME_nw_pain_butt_09 463
#define FRAME_nw_pain_butt_10 464
#define FRAME_nw_pain_butt_11 465
#define FRAME_nw_pain_butt_12 466
#define FRAME_nw_pain_butt_13 467
#define FRAME_nw_pain_butt_14 468
#define FRAME_death1_01 469
#define FRAME_death1_02 470
#define FRAME_death1_03 471
#define FRAME_death1_04 472
#define FRAME_death1_05 473
#define FRAME_death1_06 474
#define FRAME_death1_07 475
#define FRAME_death1_08 476
#define FRAME_death1_09 477
#define FRAME_death1_10 478
#define FRAME_death1_11 479
#define FRAME_death1_12 480
#define FRAME_death1_13 481
#define FRAME_death1_14 482
#define FRAME_death1_15 483
#define FRAME_death1_16 484
#define FRAME_death2_01 485
#define FRAME_death2_02 486
#define FRAME_death2_03 487
#define FRAME_death2_04 488
#define FRAME_death2_05 489
#define FRAME_death2_06 490
#define FRAME_death2_07 491
#define FRAME_death2_08 492
#define FRAME_death2_09 493
#define FRAME_death2_10 494
#define FRAME_death2_11 495
#define FRAME_death2_12 496
#define FRAME_death2_13 497
#define FRAME_death2_14 498
#define FRAME_death2_15 499
#define FRAME_death2_16 500
#define FRAME_death2_17 501
#define FRAME_death2_18 502
#define FRAME_death2_19 503
#define FRAME_death3_01 504
#define FRAME_death3_02 505
#define FRAME_death3_03 506
#define FRAME_death3_04 507
#define FRAME_death3_05 508
#define FRAME_death3_06 509
#define FRAME_death3_07 510
#define FRAME_death3_08 511
#define FRAME_death3_09 512
#define FRAME_death3_10 513
#define FRAME_death3_11 514
#define FRAME_death3_12 515
#define FRAME_death3_13 516
#define FRAME_death3_14 517
#define FRAME_death4_01 518
#define FRAME_death4_02 519
#define FRAME_death4_03 520
#define FRAME_death4_04 521
#define FRAME_death4_05 522
#define FRAME_death4_06 523
#define FRAME_death4_07 524
#define FRAME_death4_08 525
#define FRAME_death4_09 526
#define FRAME_death4_10 527
#define FRAME_death4_11 528
#define FRAME_death4_12 529
#define FRAME_death4_13 530
#define FRAME_death4_14 531
#define FRAME_death4_15 532
#define FRAME_death5_01 533
#define FRAME_death5_02 534
#define FRAME_death5_03 535
#define FRAME_death5_04 536
#define FRAME_death5_05 537
#define FRAME_death5_06 538
#define FRAME_death5_07 539
#define FRAME_death5_08 540
#define FRAME_death5_09 541
#define FRAME_death5_10 542
#define FRAME_death5_11 543
#define FRAME_death5_12 544
#define FRAME_death5_13 545
#define FRAME_death5_14 546
#define FRAME_death5_15 547
#define FRAME_death5_16 548
#define FRAME_death5_17 549
#define FRAME_death5_18 550
#define FRAME_crch_dth_01 551
#define FRAME_crch_dth_02 552
#define FRAME_crch_dth_03 553
#define FRAME_crch_dth_04 554
#define FRAME_crch_dth_05 555
#define FRAME_crch_dth_06 556
#define FRAME_crch_dth_07 557
#define FRAME_crch_dth_08 558
#define FRAME_crch_dth_09 559
#define FRAME_crch_dth_10 560
#define FRAME_crch_dth_11 561
#define FRAME_crch_dth_12 562
#define FRAME_crch_dth_13 563
#define FRAME_crch_dth_14 564
#define FRAME_crch_dth_15 565
#define FRAME_crch_dth_16 566
#define FRAME_crch_dth_17 567
#define FRAME_crch_dth_18 568
#define FRAME_crch_dth_19 569
#define FRAME_crch_knl_dn_01 570
#define FRAME_crch_knl_dn_02 571
#define FRAME_crch_knl_dn_03 572
#define FRAME_crch_knl_dn_04 573
#define FRAME_crch_amb_sdt_01 574
#define FRAME_crch_amb_sdt_02 575
#define FRAME_crch_amb_sdt_03 576
#define FRAME_crch_amb_sdt_04 577
#define FRAME_crch_amb_sdt_05 578
#define FRAME_crch_amb_sdt_06 579
#define FRAME_crch_amb_sdt_07 580
#define FRAME_crch_amb_sdt_08 581
#define FRAME_crch_amb_sdt_09 582
#define FRAME_crch_amb_sdt_10 583
#define FRAME_crch_amb_sdt_11 584
#define FRAME_crch_amb_sdt_12 585
#define FRAME_crch_amb_sdt_13 586
#define FRAME_crch_amb_sdt_14 587
#define FRAME_crch_amb_sdt_15 588
#define FRAME_crch_amb_sdt_16 589
#define FRAME_crch_amb_sdt_17 590
#define FRAME_crch_amb_sdt_18 591
#define FRAME_crch_amb_sdt_19 592
#define FRAME_crch_amb_sdt_20 593
#define FRAME_crch_amb_sdt_21 594
#define FRAME_crch_amb_sdt_22 595
#define FRAME_crch_amb_sdt_23 596
#define FRAME_crch_amb_sdt_24 597
#define FRAME_crch_shoot_01 598
#define FRAME_crch_shoot_02 599
#define FRAME_crch_shoot_03 600
#define FRAME_crch_shoot_04 601
#define FRAME_crch_shoot_05 602
#define FRAME_crouch_shfl_01 603
#define FRAME_crouch_shfl_02 604
#define FRAME_crouch_shfl_03 605
#define FRAME_crouch_shfl_04 606
#define FRAME_crouch_shfl_05 607
#define FRAME_crouch_shfl_06 608
#define FRAME_crouch_walk_01 609
#define FRAME_crouch_walk_02 610
#define FRAME_crouch_walk_03 611
#define FRAME_crouch_walk_04 612
#define FRAME_crouch_walk_05 613
#define FRAME_crouch_walk_06 614
#define FRAME_crouch_pain1_01 615
#define FRAME_crouch_pain1_02 616
#define FRAME_crouch_pain1_03 617
#define FRAME_crouch_pain1_04 618
#define FRAME_crouch_pain1_05 619
#define FRAME_crouch_pain1_06 620
#define FRAME_crouch_pain1_07 621
#define FRAME_crouch_pain1_08 622
#define FRAME_crouch_pain2_01 623
#define FRAME_crouch_pain2_02 624
#define FRAME_crouch_pain2_03 625
#define FRAME_crouch_pain2_04 626
#define FRAME_crouch_pain2_05 627
#define FRAME_crouch_pain2_06 628
#define FRAME_crouch_pain3_01 629
#define FRAME_crouch_pain3_02 630
#define FRAME_crouch_pain3_03 631
#define FRAME_crouch_pain3_04 632
#define FRAME_crouch_pain3_05 633
#define FRAME_crouch_pain3_06 634
#define FRAME_evade_01 635
#define FRAME_evade_02 636
#define FRAME_evade_03 637
#define FRAME_evade_04 638
#define FRAME_evade_05 639
#define FRAME_evade_06 640
#define FRAME_evade_07 641
#define FRAME_evade_08 642
#define FRAME_evade_09 643
#define FRAME_evade_10 644
#define FRAME_evade_11 645
#define FRAME_evade_12 646
#define FRAME_evade_13 647
#define FRAME_evade_amb_01 648
#define FRAME_evade_amb_02 649
#define FRAME_evade_amb_03 650
#define FRAME_evade_amb_04 651
#define FRAME_evade_amb_05 652
#define FRAME_evade_amb_06 653
#define FRAME_evade_amb_07 654
#define FRAME_lside_step_01 655
#define FRAME_lside_step_02 656
#define FRAME_lside_step_03 657
#define FRAME_lside_step_04 658
#define FRAME_lside_step_05 659
#define FRAME_lside_step_06 660
#define FRAME_lside_step_07 661
#define FRAME_rside_step_01 662
#define FRAME_rside_step_02 663
#define FRAME_rside_step_03 664
#define FRAME_rside_step_04 665
#define FRAME_rside_step_05 666
#define FRAME_rside_step_06 667
#define FRAME_rside_step_07 668
#define FRAME_walk_shoot_01 669
#define FRAME_walk_shoot_02 670
#define FRAME_walk_shoot_03 671
#define FRAME_walk_shoot_04 672
#define FRAME_walk_shoot_05 673
#define FRAME_walk_shoot_06 674
#define FRAME_walk_shoot_07 675
#define FRAME_walk_shoot_08 676
#define FRAME_walk_shoot_09 677
#define FRAME_walk_shoot_10 678
#define FRAME_walk_guns_dn_01 679
#define FRAME_walk_guns_dn_02 680
#define FRAME_walk_guns_dn_03 681
#define FRAME_walk_guns_dn_04 682
#define FRAME_walk_guns_dn_05 683
#define FRAME_walk_guns_dn_06 684
#define FRAME_walk_guns_dn_07 685
#define FRAME_walk_guns_dn_08 686
#define FRAME_walk_guns_dn_09 687
#define FRAME_walk_guns_dn_10 688
#define FRAME_run_shoot_01 689
#define FRAME_run_shoot_02 690
#define FRAME_run_shoot_03 691
#define FRAME_run_shoot_04 692
#define FRAME_run_shoot_05 693
#define FRAME_run_shoot_06 694
#define FRAME_run_guns_dn_01 695
#define FRAME_run_guns_dn_02 696
#define FRAME_run_guns_dn_03 697
#define FRAME_run_guns_dn_04 698
#define FRAME_run_guns_dn_05 699
#define FRAME_run_guns_dn_06 700
#define FRAME_run_on_fire_01 701
#define FRAME_run_on_fire_02 702
#define FRAME_run_on_fire_03 703
#define FRAME_run_on_fire_04 704
#define FRAME_run_on_fire_05 705
#define FRAME_run_on_fire_06 706
#define FRAME_run_melee_01 707
#define FRAME_run_melee_02 708
#define FRAME_run_melee_03 709
#define FRAME_run_melee_04 710
#define FRAME_run_melee_05 711
#define FRAME_run_melee_06 712
#define FRAME_rside_run_01 713
#define FRAME_rside_run_02 714
#define FRAME_rside_run_03 715
#define FRAME_rside_run_04 716
#define FRAME_rside_run_05 717
#define FRAME_rside_run_06 718
#define FRAME_lside_run_01 719
#define FRAME_lside_run_02 720
#define FRAME_lside_run_03 721
#define FRAME_lside_run_04 722
#define FRAME_lside_run_05 723
#define FRAME_lside_run_06 724
#define FRAME_cold_cock_01 725
#define FRAME_cold_cock_02 726
#define FRAME_cold_cock_03 727
#define FRAME_cold_cock_04 728
#define FRAME_cold_cock_05 729
#define FRAME_cold_cock_06 730
#define FRAME_cold_cock_07 731
#define FRAME_cold_cock_08 732
#define FRAME_cold_cock_09 733
#define FRAME_cold_cock_10 734
#define FRAME_cold_cock_11 735
#define FRAME_cold_cock_12 736
#define FRAME_cold_cock_13 737
#define FRAME_cold_cock_14 738
#define FRAME_cold_cock_15 739
#define FRAME_cold_cock_16 740
#define FRAME_cold_cock_17 741
#define FRAME_cold_cock_18 742
#define FRAME_cold_cock_19 743
#define FRAME_cold_cock_20 744
#define FRAME_cold_cock_21 745
#define FRAME_cold_cock_22 746
#define FRAME_cold_cock_23 747
#define FRAME_cold_cock_24 748
#define FRAME_cold_cock_25 749
#define FRAME_cold_cock_26 750
#define FRAME_cold_cock_27 751
#define FRAME_cold_cock_28 752
#define FRAME_cold_cock_29 753
#define FRAME_cold_cock_30 754
#define FRAME_cold_cock_31 755
#define MODEL_SCALE 1.000000

1003
gamesrc/AI_THUG2.H Normal file

File diff suppressed because it is too large Load diff

1558
gamesrc/AI_WHORE.C Normal file

File diff suppressed because it is too large Load diff

1026
gamesrc/AI_WHORE.H Normal file

File diff suppressed because it is too large Load diff

711
gamesrc/EP_ALL.C Normal file
View file

@ -0,0 +1,711 @@
/******************************************************************************
GENERIC EPISODE CODE
******************************************************************************/
#include "g_local.h"
/*
case EP_SKIDROW :
case EP_POISONVILLE :
case EP_STEELTOWN:
case EP_TRAINYARD:
case EP_RADIOCITY:
case EP_SHIPYARDS:
case EP_CRYSTALPALACE:
*/
//............................................................................
// Character Names
//
// ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !
//
// Note, these must be in the same order as the defines in ep_all.h!
//
// ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !
char *ep_names[] =
{
"--THIS SLOT MUST BE VACANT--",
"Al",
"Beth",
"Magicj",
"Lisa",
"Louie",
"Frank",
"Buttmunch",
"Arnold",
"Brewster",
"Punky",
"Igmo",
"Johnny",
"Betty",
"Leroy",
"Jed",
"Buster",
"Bubba",
"Momo",
"Muttski",
"Spike",
"ToughGuy1",
"ToughGuy2",
"IntroGuy",
"Bernie",
"Lamont",
"Mona",
"Lenny",
"Chick",
"Sluggo",
"Rocko",
"Rover",
"Joseph",
"Rummy", // sr1 bum
"Nick", // sr2 bum
"Jesus", // sr boss
"Yolanda",
"Carlton",
"Tina",
"Hardey",
"Laurel",
"Harold",
"Dick",
"Burt",
"Fingers",
"Dan",
"Clarence",
"Adolf",
"Candy",
"Sharky",
"Kingpin",
"Blunt",
"NikkiBlanco",
"Moe",
"Larry",
"Curly",
"Ed",
"Popeye",
"Dogg",
"Selma",
"Jane",
"Barney",
"BigWillie",
"Sal",
"Lefty",
"Bwillie",
"Mung",
"Tyrone",
"Luke",
"Hann",
"Kroker",
"kid_1",
"kid_2",
"kid_3",
"kid_4",
"kid_5",
"kid_6",
"kid_7",
"kid_8",
"Oscar",
"David",
"Bambi",
"Brittany",
"Mathew",
"Pete",
"Moker",
"Heilman",
"Butch",
"Patrick",
"Groucho",
"Harpo",
"Chico",
"Blefty",
"Scalper",
"Dubs",
"Rochelle",
"Lola",
"Dude",
"Walter",
"Donny",
NULL
};
//............................................................................
// This sets the self->name_index according to the list above
void EP_SetNameIndex ( edict_t *self )
{
int i;
if (!self->name)
{
self->name_index = -1;
return;
}
for (i=0; ep_names[i]; i++)
{
if (self->name)
if (!Q_stricmp(self->name, ep_names[i]))
{ // found a match
self->name_index = i;
return;
}
}
// no match found!
gi.dprintf( "EP_SetNameIndex: Un-matched \"name\" (%s)\n", self->name );
self->name_index = -1;
}
// Given a NAME_*, returns the entity with the matching name
edict_t *EP_GetCharacter ( int nameIndex )
{
int i;
for (i=0; i<level.num_characters; i++)
{
if (!level.characters[i])
continue;
if (level.characters[i]->name_index == nameIndex)
{
if ((level.characters[i]->inuse) && (level.characters[i]->svflags & SVF_MONSTER) && (level.characters[i]->health > 0))
return level.characters[i];
else
return NULL; // character has died
}
}
// This is causing problems be cause the guy could get refrenced yet be on another map
// gi.dprintf( "EP_GetCharacter: couldn't find %s\n", ep_names[nameIndex] );
return NULL; // couldn't find them
}
// Given a "name", returns the entity with the matching name
edict_t *EP_GetCharacterByName ( char *name )
{
int i;
for (i=0; i<level.num_characters; i++)
{
if (!level.characters[i])
continue;
if (!Q_stricmp( level.characters[i]->name, name ))
{
if ((level.characters[i]->inuse) && (level.characters[i]->svflags & SVF_MONSTER) && (level.characters[i]->health > 0))
return level.characters[i];
else
return NULL; // character has died
}
}
gi.dprintf( "EP_GetCharacter: couldn't find %s\n", name );
return NULL; // couldn't find them
}
//............................................................................
// Gang Names
//
// These will match the "cast_group" value for characters in the game
// Also must match the defines in ep_all.h !!
char *ep_gang_names[] =
{
"(neutral)",
"Our Gang(?)",
"Main Gang(?)",
"Rat-Gang",
NULL
};
char *EP_GetGangName ( int cast_group )
{
static char unknown_str[] = "**UNKNOWN**";
if (cast_group >= NUM_GANGS)
return unknown_str;
return ep_gang_names[cast_group];
}
//=======================================================================================================
void EP_PlayerLog (edict_t *self, int page)
{
switch (level.episode)
{
case EP_SKIDROW:
EP_Skidrow_Player_Log (self, page);
break;
case EP_POISONVILLE:
EP_PV_Player_Log (self, page);
break;
case EP_SHIPYARDS:
EP_SY_Player_Log (self, page);
break;
case EP_STEELTOWN:
EP_Steeltown_Player_Log (self, page);
break;
case EP_TRAINYARD:
EP_Trainyard_Player_Log (self, page);
break;
case EP_RADIOCITY:
EP_RC_Player_Log (self, page);
break;
}
}
//............................................................................
// This gets called whenever an AI character has sighted another character
// (which will happen every frame while they are in view).
qboolean EP_CastSight ( edict_t *self, edict_t *other, cast_memory_t *cast_memory )
{
switch (level.episode)
{
case EP_SKIDROW :
return EP_Skidrow_CastSight ( self, other, cast_memory );
case EP_POISONVILLE :
return EP_Poisonville_CastSight ( self, other, cast_memory );
case EP_STEELTOWN:
return EP_Steeltown_CastSight ( self, other, cast_memory );
break;
case EP_TRAINYARD:
break;
case EP_RADIOCITY:
return EP_RC_CastSight ( self, other, cast_memory );
break;
case EP_SHIPYARDS:
return EP_SY_CastSight ( self, other, cast_memory );
}
return false;
}
//............................................................................
// This gets called whenever an AI character dies is "used" (like when they die and have a ->deathtarget)
qboolean EP_CastUse ( edict_t *self, edict_t *other, edict_t *activator )
{
switch (level.episode)
{
case EP_SKIDROW :
return EP_Skidrow_CastUse ( self, other, activator );
break;
case EP_POISONVILLE :
return EP_Poisonville_CastUse ( self, other, activator );
break;
case EP_STEELTOWN:
return EP_Steeltown_CastUse ( self, other, activator );
break;
case EP_TRAINYARD:
break;
case EP_RADIOCITY:
return EP_RC_CastUse ( self, other, activator );
break;
case EP_SHIPYARDS:
return EP_SY_CastUse ( self, other, activator );
}
return false;
}
//............................................................................
// Generic event based speech for episodes
qboolean EP_EventSpeech (edict_t *self, edict_t *other, int saywhat)
{
switch (level.episode)
{
case EP_SKIDROW:
return EP_Skidrow_EventSpeech (self, other, saywhat);
break;
case EP_POISONVILLE:
return EP_Poisonville_EventSpeech (self, other, saywhat);
break;
case EP_TRAINYARD:
return EP_Trainyard_EventSpeech (self, other, saywhat);
break;
case EP_SHIPYARDS:
return EP_SY_EventSpeech (self, other, saywhat);
break;
case EP_STEELTOWN:
return EP_Steeltown_EventSpeech (self, other, saywhat);
break;
case EP_RADIOCITY:
return EP_RC_EventSpeech (self, other, saywhat);
break;
}
return false;
}
//............................................................................
// Called whenever an item is picked up
void EP_ItemPickup ( edict_t *self, edict_t *other )
{
switch (level.episode)
{
case EP_SKIDROW:
EP_Skidrow_ItemPickup( self, other );
break;
case EP_POISONVILLE:
EP_Poisonville_ItemPickup( self, other );
break;
case EP_TRAINYARD:
EP_Trainyard_ItemPickup( self, other );
break;
case EP_SHIPYARDS:
EP_SY_ItemPickup( self, other );
break;
case EP_STEELTOWN:
EP_Steeltown_ItemPickup (self, other);
break;
}
}
//............................................................................
// Called whenever a character reaches a path_corner_cast that has a "scriptname" set
void EP_EventScript ( edict_t *self, char *scriptname )
{
switch (level.episode)
{
case EP_SKIDROW:
EP_Skidrow_Script( self, scriptname );
break;
case EP_POISONVILLE:
EP_Poisonville_Script( self, scriptname );
break;
case EP_TRAINYARD:
EP_Trainyard_Script( self, scriptname );
break;
case EP_SHIPYARDS:
EP_SY_Script( self, scriptname );
break;
case EP_STEELTOWN:
EP_Steeltown_Script (self, scriptname);
break;
}
}
void EP_Reset (edict_t *self, edict_t *other)
{
switch (level.episode)
{
case EP_SKIDROW:
EP_Skidrow_Reset( self, other );
break;
case EP_POISONVILLE:
// EP_Poisonville_Reset( self, other );
break;
}
}
void EP_SpawnFlags (edict_t *self)
{
switch (level.episode)
{
case EP_SKIDROW:
EP_SkidrowFlags (self);
break;
case EP_POISONVILLE:
EP_PVFlags (self);
break;
case EP_SHIPYARDS:
EP_SYFlags (self);
break;
case EP_STEELTOWN:
EP_SteeltownFlags (self);
break;
case EP_RADIOCITY:
EP_RCFlags (self);
break;
}
}
int EP_HiredGuys (edict_t *self, edict_t *other)
{
switch (level.episode)
{
case EP_SKIDROW:
return (1);
case EP_POISONVILLE:
return (EP_PV_HiredGuysFlags (self, other));
case EP_STEELTOWN:
return (EP_Steeltown_HiredGuysFlags (self, other));
case EP_TRAINYARD:
return (EP_Trainyard_HiredGuysFlags (self, other));
case EP_RADIOCITY:
return (EP_RC_HiredGuysFlags (self, other));
case EP_SHIPYARDS:
return (EP_SY_HiredGuysFlags (self, other));
default:
return (1);
}
// just to shut up the compiler
return (0);
}
void EP_CheckMomo (edict_t *ent, cast_memory_t *mem)
{
switch (level.episode)
{
case EP_SKIDROW:
EP_Skidrow_CheckMomo (ent, mem);
break;
case EP_POISONVILLE:
EP_PV_CheckMomo (ent, mem);
break;
case EP_SHIPYARDS:
EP_SY_CheckMomo (ent, mem);
break;
case EP_STEELTOWN:
EP_Steeltown_CheckMomo (ent, mem);
break;
case EP_RADIOCITY:
EP_RC_CheckMomo (ent, mem);
break;
}
}
qboolean EP_DoKey (edict_t *ent, edict_t *other)
{
switch (level.episode)
{
case EP_SKIDROW:
return false;
break;
case EP_POISONVILLE:
return (EP_PV_DoKey (ent, other));
break;
case EP_STEELTOWN:
return (EP_Steeltown_DoKey (ent, other));
break;
}
return false;
}
void EP_Check_DoKey (edict_t *self, edict_t *ent)
{
switch (level.episode)
{
case EP_SKIDROW:
break;
case EP_POISONVILLE:
EP_PV_Check_DoKey (self, ent);
break;
case EP_STEELTOWN:
EP_Steeltown_Check_DoKey (self, ent);
break;
}
}
void EP_ReachedDoKey (edict_t *self)
{
switch (level.episode)
{
case EP_SKIDROW:
break;
case EP_POISONVILLE:
EP_PV_ReachedDoKey (self);
break;
case EP_STEELTOWN:
EP_Steeltown_ReachedDoKey (self);
break;
}
}
void EP_EndDoKey (edict_t *self)
{
switch (level.episode)
{
case EP_SKIDROW:
break;
case EP_POISONVILLE:
EP_PV_EndDoKey (self);
break;
case EP_STEELTOWN:
EP_Steeltown_EndDoKey (self);
break;
}
}
qboolean EP_UnlockDoorFlag (edict_t *ent)
{
switch (level.episode)
{
case EP_SKIDROW:
break;
case EP_POISONVILLE:
return (EP_PV_UnlockDoorFlag (ent));
break;
case EP_STEELTOWN:
return (EP_Steeltown_UnlockDoorFlag (ent));
break;
}
return false;
}
void EP_HiredGuysRegisterFlags (edict_t *ent, edict_t *other)
{
switch (level.episode)
{
case EP_SKIDROW:
break;
case EP_POISONVILLE:
EP_PV_HiredGuysRegisterFlags (ent, other);
break;
case EP_STEELTOWN:
EP_Steeltown_HiredGuysRegisterFlags (ent, other);
break;
case EP_RADIOCITY:
EP_RC_HiredGuysRegisterFlags (ent, other);
break;
}
}
void EP_SpecialEventDeath (edict_t *self)
{
switch (level.episode)
{
case EP_SKIDROW:
break;
case EP_POISONVILLE:
EP_PV_SpecialEventDeath (self);
break;
case EP_STEELTOWN:
EP_Steeltown_SpecialEventDeath (self);
break;
case EP_TRAINYARD:
// EP_Trainyard_SpecialEventDeath (self);
break;
case EP_RADIOCITY:
EP_RC_SpecialEventDeath (self);
break;
case EP_SHIPYARDS:
EP_SY_SpecialEventDeath (self);
break;
}
}
qboolean EP_Steeltown_UnlockDoorFlag (edict_t *ent)
{
return false;
}
// JOSEPH 14-JUN-99
void Think_Help (edict_t *ent)
{
if (!(level.helpchange))
{
level.helpchange = 0;
G_FreeEdict(ent);
return;
}
if (!ent->misstime )
{
level.helpchange = 0;
G_FreeEdict(ent);
return;
}
if (ent->misstime <= 15 && level.helpchange)
{
level.helpchange = ent->misstime*(255/15);
}
ent->misstime--;
ent->nextthink = level.time + 0.1;
}
void Show_Help (void)
{
edict_t *help = NULL;
edict_t *ent = NULL;
ent = G_Find (NULL, FOFS(classname), "showhelp");
if (ent)
{
G_FreeEdict(ent);
}
help = G_Spawn();
if (!help)
return;
help->classname = "showhelp";
help->think = Think_Help;
help->misstime = 315;
help->nextthink = level.time + 0.1;
gi.linkentity (help);
level.helpchange = 255;
return;
}
// END JOSEPH
void EP_Flash_Newflag (edict_t *self, int ep_flag)
{
qboolean rval = false;
switch (level.episode)
{
case EP_SKIDROW:
rval = EP_Skidrow_Flash_Newflag (self, ep_flag);
break;
case EP_POISONVILLE:
rval = EP_PV_Flash_Newflag (self, ep_flag);
break;
case EP_STEELTOWN:
rval = EP_Steeltown_Flash_Newflag (self, ep_flag);
break;
case EP_TRAINYARD:
rval = EP_TY_Flash_Newflag (self, ep_flag);
break;
case EP_RADIOCITY:
rval = EP_RC_Flash_Newflag (self, ep_flag);
break;
case EP_SHIPYARDS:
rval = EP_SY_Flash_Newflag (self, ep_flag);
break;
}
// joe flash the notepad help icon here
if (rval)
Show_Help ();
}

533
gamesrc/EP_ALL.H Normal file
View file

@ -0,0 +1,533 @@
/******************************************************************************
GENERIC EPISODE DEFINES
******************************************************************************/
//.............................................................................
// Episode indexes
#define EP_SKIDROW 1
#define EP_POISONVILLE 2
#define EP_SHIPYARDS 3
#define EP_STEELTOWN 4
#define EP_TRAINYARD 5
#define EP_RADIOCITY 6
//.............................................................................
// Special flags that AI will look at
// Skidrow flags
#define EP_SKIDROW_MAGICJ_ASKED_DOLLAR 0x00000001 // 1
#define EP_SKIDROW_BETH_GIVES_HINT 0x00000002 // 2
#define EP_SKIDROW_AL_SAW_DEAD_LOUIE 0x00000004 // 3
#define EP_PAWNOMATIC_FIRST_TIME 0x00000008 // 4
#define EP_SKIDROW_GOT_COIL 0x00000010 // 5
#define EP_SKIDROW_MAGICJ_GAVE_DOLLAR 0x00000020 // 6
#define EP_SKIDROW_MOMO_ASKED_MONEY 0x00000040 // 7
#define EP_SKIDROW_MOMO_TOOK_MONEY 0x00000080 // 8
#define EP_SKIDROW_MOMO_FIRST_TIME 0x00000100 // 9
#define EP_TALKED_TO_LENNY 0x00000200 // 10
#define EP_SKIDROW_MOMO_GAVE_MONEY 0x00000800 // 11
#define EP_BAR_FIRST_TIME 0x00001000 // 12
#define EP_SKIDROW_LENNY_TOOK_WATCH 0x00002000 // 13
#define EP_SKIDROW_NICK_WARNING_1 0x00004000 // 14
#define EP_SKIDROW_NICK_WARNING_2 0x00080000 // 15
#define EP_SKIDROW_NICK_WARNING_3 0x00100000 // 16
#define EP_SKIDROW_RUMMY_GAVE_WINE 0x00200000 // 17
#define EP_SKIDROW_RUMMY_ASKED_WINE 0x00400000 // 18
#define EP_SKIDROW_RATS_PISSED 0x00800000 // 19
#define EP_SKIDROW_CUT_SCENE_TWO 0x01000000 // 20
#define EP_SKIDROW_MONA_FIRST_TIME 0x02000000 // 21
#define EP_SKIDROW_NICK_TOLD_BIKE 0x04000000 // 22
#define EP_SKIDROW_FOUND_BIKE 0x08000000 // 23
#define EP_SKIDROW_RATS_FIND 0x10000000 // 24
#define EP_SKIDROW_TALKED_TO_RUMMY 0x20000000 // 25
// Poisonville flags
#define EP_PV_TALKED_LOUIE 0x00000001 // 1
#define EP_PV_OPEN_DOOR_LOUIE 0x00000002 // 2
#define EP_PV_SAFE_DOCS 0x00000004 // 3
#define EP_PV_SAFE_DOCS_DELIVERED 0x00000008 // 4
#define EP_PV_HIRED_SAFE_BOY 0x00000010 // 5
#define EP_PV_YOLANDA_DISTRACT 0x00000020 // 6
#define EP_PV_MOMO_ASKED_MONEY 0x00000040 // 7
#define EP_PV_MOMO_TOOK_MONEY 0x00000080 // 8
#define EP_PV_MOMO_FIRST_TIME 0x00000100 // 9
#define EP_PV_MOMO_GAVE_MONEY 0x00000200 // 10
#define EP_PV_YOLANDA_TOOK_MONEY 0x00000400 // 11
#define EP_PV_YOLANDA_ASKED_MONEY 0x00000800 // 12
#define EP_PV_PAWNOMATIC_FIRST_TIME 0x00001000 // 13
#define EP_PV_BAR_FIRST_TIME 0x00002000 // 14
#define EP_PV_OFFICE_FIRST_TIME 0x00004000 // 15
#define EP_PV_SENT_TO_GET_SAFEDOCS 0x00008000 // 16
#define EP_PV_LOUIE_SPEACH_1 0x00010000 // 17
#define EP_PV_LOUIE_SPEACH_2 0x00020000 // 18
#define EP_PV_TALKED_LOUIE_2 0x00040000 // 19
#define EP_PV_TALKED_LOUIE2 0x00080000 // 20
#define EP_PV_TALKED_LOUIE3 0x00100000 // 21
#define EP_PV_TALKED_LOUIE4 0x00200000 // 22
#define EP_PV_TALKED_LOUIE5 0x00400000 // 23
#define EP_PV_LOUIE_KEY 0x00800000 // 24
#define EP_PV_FIND_LOUIE 0x01000000 // 25
#define EP_PV_BUSTERISDEAD 0x02000000
#define EP_PV_FINGERSISDEAD 0x04000000
#define EP_PV_SAFEDOORISOPEN 0x08000000
#define EP_PV_LOUIEPVB 0x10000000
#define EP_PV_FUSEISBLOWN1 0x20000000
#define EP_PV_ONEFUSE 0x40000000
#define EP_PV_FUSEISBLOWN2 0x80000000
// Crystal Palace flags
#define EP_CP_KINGPIN_FIRSTSIGHT 0x00000001 // 01
// Train Yard flags
#define EP_TY_LUKE_CLUE1 0x00000001
#define EP_TY_LUKE_CLUE2 0x00000002
#define EP_TY_HANN_CLUE1 0x00000004
#define EP_TY_HANN_CLUE2 0x00000008
#define EP_TY_PAWNOMATIC_FIRST_TIME 0x00000010
#define EP_TY_TAKETHESEWER 0x00000020
#define EP_TY_FUSEBLOWN 0x00000040
// Shipyard flags
#define EP_SY_GOTO_SALTYDOG 0x00000001
#define EP_SY_SCREAMING_BITCH 0x00000002
#define EP_SY_FOUND_BITCH 0x00000004
#define EP_SY_BEEN_BAITSHOP 0x00000008
#define EP_SY_GETME_LURE 0x00000010
#define EP_SY_GOT_LURE 0x00000020
#define EP_SY_GOT_TOBEDETERMINED 0x00000040
#define EP_SY_GOFIND_BITCH 0x00000080
#define EP_SY_MOMO_ASKED_MONEY 0x00000100
#define EP_SY_MOMO_TOOK_MONEY 0x00000200
#define EP_SY_MOMO_FIRST_TIME 0x00000400
#define EP_SY_GOFIND_BITCH_SAL 0x00000800
#define EP_SY_TACKLE 0x00001000
#define EP_SY_HIRED_SAL 0x00002000
#define EP_SY_SAL_SECONDLINE 0x00004000
#define EP_SY_MOE_FIRST_SIGHT 0x00008000
#define EP_SY_MOE_ESCALATE1 0x00010000
#define EP_SY_MOE_ESCALATE2 0x00020000
#define EP_SY_MOE_ESCALATE3 0x00040000
#define EP_SY_MOE_FEAR1 0x00080000
#define EP_SY_MOE_FEAR2 0x00100000
#define EP_SY_MOE_FEAR3 0x00200000
#define EP_SY_BW_HIRED 0x00400000
#define EP_SY_BIGWILLIE_DEAD 0x00800000
#define EP_SY_SAL_DEAD 0x01000000
#define EP_SY_BIGWILLIE_REVENGE 0x02000000
#define EP_SY_LEFTY_HIRED 0x04000000
#define EP_SY_MOE_RUNAWAY 0x08000000
#define EP_SY_PAWNOMATIC_FIRST_TIME 0x10000000
#define EP_SY_POPEYE_LASTLINE 0x20000000
#define EP_SY_MOE_LASTLINE 0x40000000
#define EP_SY_GOTO_DOORSHUT 0x80000000
// Steeltown flags
#define EP_Steeltown_MOMO_TOOK_MONEY 0x00000001
#define EP_Steeltown_MOMO_FIRST_TIME 0x00000002
#define EP_Steeltown_MOMO_ASKED_MONEY 0x00000004
#define EP_Steeltown_KIDS_CLUE 0x00000008
#define EP_Steeltown_MATHEW_CLUE1 0x00000010
#define EP_Steeltown_MATHEW_CLUE2 0x00000020
#define EP_Steeltown_KROKER_SAY 0x00000040
#define EP_Steeltown_PAWNOMATIC_FIRST_TIME 0x00000080
#define EP_Steeltown_DAVID_DEAD 0x00000100
#define EP_Steeltown_DAVID_SAY1 0x00000200
#define EP_Steeltown_DAVID_SAY2 0x00000400
#define EP_Steeltown_DAVID_SAY3 0x00000800
#define EP_Steeltown_BAMBI_DONE 0x00001000
#define EP_Steeltown_BAMBI_LINE1 0x00002000
#define EP_Steeltown_MOKER_NOTINOFFICE 0x00004000
#define EP_Steeltown_MATHEW_LINE1 0x00008000
#define EP_Steeltown_BRITTANY_LINE1 0x00010000
#define EP_Steeltown_BRITTANY_CLUE1 0x00020000
#define EP_Steeltown_KIDS_CLUE1 0x00040000
#define EP_Steeltown_KIDS_CLUE2 0x00080000
#define EP_Steeltown_KROKER_BOLT 0x00100000
#define EP_Steeltown_DAVID_DEAD_A 0x00200000
#define EP_Steeltown_DAVID_DEAD_B 0x00400000
#define EP_Steeltown_DAVID_HIRED 0x00800000
// Radio City flags
#define EP_RC_MOMO_TOOK_MONEY 0x00000001
#define EP_RC_MOMO_FIRST_TIME 0x00000002
#define EP_RC_MOMO_ASKED_MONEY 0x00000004
#define EP_RC_OUTOFBRUSH 0x00000008
#define EP_RC_INTOBRUSH 0x00000010
#define EP_RC_FAILED_TEST 0x00000020
#define EP_RC_PAWNOMATIC_FIRST_TIME 0x00000040
#define EP_RC_BUTCH_FIRST 0x00000080
#define EP_RC_BUTCH_TALK1 0x00000100
#define EP_RC_BUTCH_TALK2 0x00000200
#define EP_RC_GROUCHO_DEAD 0x00000400
#define EP_RC_HARPO_DEAD 0x00000800
#define EP_RC_CHICO_DEAD 0x00001000
#define EP_RC_JOKERS_HIRED 0x00002000
#define EP_RC_PAY_500 0x00004000
#define EP_RC_BUTCH_500 0x00008000
#define EP_RC_SCALPER_ASKED_MONEY 0x00010000
#define EP_RC_TALKED_TO_SCALPER 0x00020000
#define EP_RC_SCALPER_GAVE_MONEY 0x00040000
#define EP_RC_SCALPER_LINE1 0x00080000
#define EP_RC_LOLA_CLUE1 0x00100000
#define EP_RC_SCALPER_NOTEPAD 0x00200000
#define EP_RC_LOLA_NOTEBOOK 0x00400000
#define EP_RC_JOKERS_NOTEPAD 0x00800000
#define EP_RC_SCALPER_RANDOM 0x01000000
#define EP_RC_THE_WARNING 0x02000000
//.............................................................................
// Names (might not be episode-specific)
//#define NAME_BERNIE 0 // not allowed to have a 0 NAME_* (move Bernie down list)
#define NAME_AL 1
#define NAME_BETH 2
#define NAME_MAGICJ 3
#define NAME_LISA 4
#define NAME_LOUIE 5
#define NAME_FRANK 6
#define NAME_BUTTMUNCH 7
#define NAME_ARNOLD 8
#define NAME_BREWSTER 9
#define NAME_PUNKY 10
#define NAME_IGMO 11
#define NAME_JOHNNY 12
#define NAME_BETTY 13
#define NAME_LEROY 14
#define NAME_JED 15 // Ridah, testing only (doors.bsp)
#define NAME_BUSTER 16 // Ridah, testing only (doors.bsp)
#define NAME_BUBBA 17
#define NAME_MOMO 18
#define NAME_MUTTSKI 19
#define NAME_SPIKE 20
#define NAME_TOUGHGUY1 21
#define NAME_TOUGHGUY2 22
#define NAME_INTROGUY1 23
#define NAME_BERNIE 24
#define NAME_LAMONT 25
#define NAME_MONA 26
#define NAME_LENNY 27
#define NAME_CHICK 28
#define NAME_SLUGGO 29
#define NAME_ROCKO 30
#define NAME_ROVER 31 // Lamont's mutt
#define NAME_JOSEPH 32
#define NAME_RUMMY 33
#define NAME_NICK 34
#define NAME_JESUS 35
#define NAME_YOLANDA 36
#define NAME_CARLTON 37
#define NAME_TINA 38
#define NAME_HARDEY 39
#define NAME_LAUREL 40
#define NAME_HAROLD 41
#define NAME_DICK 42
#define NAME_BURT 43
#define NAME_FINGERS 44
#define NAME_DAN 45
#define NAME_CLARENCE 46
#define NAME_ADOLF 47
#define NAME_CANDY 48
#define NAME_SHARKY 49 // the pawn dude
#define NAME_KINGPIN 50
#define NAME_BLUNT 51
#define NAME_NICKIBLANCO 52
#define NAME_MOE 53
#define NAME_LARRY 54
#define NAME_CURLY 55
#define NAME_ED 56
#define NAME_POPEYE 57
#define NAME_DOGG 58 // this is the bartenders name... ?? (its what Rich wants)
#define NAME_SELMA 59
#define NAME_JANE 60
#define NAME_BARNEY 61
#define NAME_BIGWILLIE 62
#define NAME_SAL 63
#define NAME_LEFTY 64
#define NAME_BWILLIE 65 // DO NOT CONFUSE THIS WITH BIGWILLIE
#define NAME_MUNG 66
#define NAME_TYRONE 67
#define NAME_LUKE 68
#define NAME_HANN 69
// STEELTOWN
#define NAME_KROKER 70
#define NAME_KID_1 71
#define NAME_KID_2 72
#define NAME_KID_3 73
#define NAME_KID_4 74
#define NAME_KID_5 75
#define NAME_KID_6 76
#define NAME_KID_7 77
#define NAME_KID_8 78
#define NAME_OSCAR 79
#define NAME_DAVID 80
#define NAME_BAMBI 81
#define NAME_BRITTANY 82
#define NAME_MATHEW 83
#define NAME_PETE 84
#define NAME_MOKER 85 // BOSS (STEELTOWN)
#define NAME_HEILMAN 86
// RC
#define NAME_BUTCH 87
#define NAME_PATRICK 88
#define NAME_GROUCHO 89
#define NAME_HARPO 90
#define NAME_CHICO 91
#define NAME_BLEFTY 92
#define NAME_SCALPER 93
#define NAME_DUBS 94
#define NAME_ROCHELLE 95
#define NAME_LOLA 96
#define NAME_DUDE 97
#define NAME_WALTER 98
#define NAME_DONNY 99
//.............................................................................
// These must match the gang strings in ep_all.c !!
#define GANG_NUETRAL 0
#define GANG_PLAYER 1
#define GANG_MAIN 2
#define GANG_RATGANG 3
#define NUM_GANGS 3
//.............................................................................
// General procedural defines
void EP_SpawnFlags ( edict_t *self );
void EP_SetNameIndex ( edict_t *self );
edict_t *EP_GetCharacter ( int nameIndex );
edict_t *EP_GetCharacterByName ( char *name );
char *EP_GetGangName ( int cast_group );
qboolean EP_CastSight ( edict_t *self, edict_t *other, cast_memory_t *cast_memory );
qboolean EP_CastUse ( edict_t *self, edict_t *other, edict_t *activator );
qboolean EP_EventSpeech ( edict_t *self, edict_t *other, int saywhat );
void EP_ItemPickup ( edict_t *self, edict_t *other );
void EP_EventScript ( edict_t *self, char *scriptname );
void EP_Reset ( edict_t *self, edict_t *other );
void EP_PlayerLog ( edict_t *self, int page );
int EP_HiredGuys ( edict_t *player, edict_t *self );
void EP_CheckMomo ( edict_t *ent, cast_memory_t *mem );
qboolean EP_DoKey ( edict_t *ent, edict_t *other );
void EP_Check_DoKey ( edict_t *self, edict_t *ent );
void EP_ReachedDoKey ( edict_t *self );
void EP_EndDoKey ( edict_t *self );
qboolean EP_UnlockDoorFlag ( edict_t *ent );
void EP_HiredGuysRegisterFlags ( edict_t *ent, edict_t *other );
void EP_SpecialEventDeath ( edict_t *self );
void EP_Flash_Newflag (edict_t *self, int ep_flag);
//.............................................................................
// Skidrow procedural defines
qboolean EP_Skidrow_CastSight ( edict_t *self, edict_t *other, cast_memory_t *mem );
qboolean EP_Skidrow_CastUse ( edict_t *self, edict_t *other, edict_t *activator );
qboolean EP_Skidrow_EventSpeech ( edict_t *self, edict_t *other, int saywhat );
void EP_Skidrow_ItemPickup ( edict_t *self, edict_t *other );
void EP_Skidrow_Script ( edict_t *ent, char *scriptname );
void EP_Skidrow_Reset ( edict_t *self, edict_t *other );
void Resp_MagicJ_GotDollar ( edict_t *self, edict_t *other, response_t response );
void Resp_Momo_GotMoney ( edict_t *self, edict_t *other, response_t response );
void Resp_Betty_GetsPissed ( edict_t *self, edict_t *other, response_t response );
void Resp_Lenny_Help ( edict_t *self, edict_t *other, response_t response );
void Resp_Lenny_Killed_Target ( edict_t *self, edict_t *other, response_t response );
void Resp_Rummy_GotWine ( edict_t *self, edict_t *other, response_t response );
void EP_SkidrowFlags ( edict_t *self );
void EP_Skidrow_Player_Log ( edict_t *self, int page );
void EP_Skidrow_Register_EPFLAG ( edict_t *self, int ep_flag );
void EP_Skidrow_CheckMomo ( edict_t *ent, cast_memory_t *mem );
qboolean EP_Skidrow_Flash_Newflag (edict_t *self, int ep_flag);
//.............................................................................
// PoisonVille procedural defines
qboolean EP_Poisonville_CastSight ( edict_t *self, edict_t *other, cast_memory_t *mem );
qboolean EP_Poisonville_CastUse ( edict_t *self, edict_t *other, edict_t *activator );
qboolean EP_Poisonville_EventSpeech ( edict_t *self, edict_t *other, int saywhat );
void EP_Poisonville_ItemPickup ( edict_t *self, edict_t *other );
void EP_Poisonville_Script ( edict_t *ent, char *scriptname );
//.............................................................................
//
// PoisonVille procedural defines
int EP_PV_HiredGuysFlags ( edict_t *player, edict_t *self );
void EP_PVFlags ( edict_t *self );
void Resp_PVMomo_GotMoney ( edict_t *self, edict_t *other, response_t response );
void EP_PV_CheckMomo ( edict_t *ent, cast_memory_t *mem );
qboolean EP_PV_DoKey ( edict_t *ent, edict_t *other );
void EP_PV_Check_DoKey ( edict_t *self, edict_t *ent );
void EP_PV_ReachedDoKey ( edict_t *self );
void EP_PV_EndDoKey ( edict_t *self );
qboolean EP_PV_UnlockDoorFlag ( edict_t *ent );
void EP_PV_HiredGuysRegisterFlags( edict_t *ent, edict_t *other );
void EP_PV_Player_Log ( edict_t *self, int page );
void EP_PV_SpecialEventDeath ( edict_t *self);
qboolean EP_PV_Flash_Newflag (edict_t *self, int ep_flag);
// Trainyard procedural defines
qboolean EP_Trainyard_EventSpeech ( edict_t *self, edict_t *other, int saywhat );
void EP_Trainyard_ItemPickup ( edict_t *self, edict_t *other );
void EP_Trainyard_Script ( edict_t *self, char *scriptname );
int EP_Trainyard_HiredGuysFlags ( edict_t *player, edict_t *self );
// void EP_Trainyard_SpecialEventDeath (edict_t *self );
qboolean EP_Trainyard_CastSight ( edict_t *self, edict_t *other, cast_memory_t *mem );
qboolean EP_Trainyard_CastUse ( edict_t *self, edict_t *other, edict_t *activator );
void EP_Trainyard_Script ( edict_t *ent, char *scriptname );
void EP_TrainyardFlags ( edict_t *self );
void EP_Trainyard_Player_Log ( edict_t *self, int page );
qboolean EP_TY_Flash_Newflag (edict_t *self, int ep_flag);
// Shipyard procedural defines
qboolean EP_SY_EventSpeech ( edict_t *self, edict_t *other, int saywhat );
void EP_SY_ItemPickup ( edict_t *self, edict_t *other );
void EP_SY_Script ( edict_t *self, char *scriptname );
int EP_SY_HiredGuysFlags ( edict_t *player, edict_t *self );
void EP_SY_SpecialEventDeath ( edict_t *self );
qboolean EP_SY_CastSight ( edict_t *self, edict_t *other, cast_memory_t *mem );
qboolean EP_SY_CastUse ( edict_t *self, edict_t *other, edict_t *activator );
void EP_SY_Script ( edict_t *ent, char *scriptname );
void EP_SYFlags ( edict_t *self );
void EP_SY_CheckMomo ( edict_t *ent, cast_memory_t *mem );
void EP_SY_SpecialEventDeath ( edict_t *self );
void EP_SY_Player_Log ( edict_t *self, int page );
qboolean EP_SY_Flash_Newflag (edict_t *self, int ep_flag);
// Steeltown procedural defines
qboolean EP_Steeltown_EventSpeech (edict_t *self, edict_t *other, int saywhat );
void EP_Steeltown_ItemPickup (edict_t *self, edict_t *other );
void EP_Steeltown_Script (edict_t *self, char *scriptname );
int EP_Steeltown_HiredGuysFlags (edict_t *player, edict_t *self );
void EP_Steeltown_SpecialEventDeath (edict_t *self );
qboolean EP_Steeltown_CastSight (edict_t *self, edict_t *other, cast_memory_t *mem );
qboolean EP_Steeltown_CastUse (edict_t *self, edict_t *other, edict_t *activator );
void EP_Steeltown_Script (edict_t *ent, char *scriptname );
void EP_SteeltownFlags (edict_t *self );
void EP_Steeltown_CheckMomo (edict_t *ent, cast_memory_t *mem );
void EP_Steeltown_SpecialEventDeath (edict_t *self );
qboolean EP_Steeltown_DoKey (edict_t *ent, edict_t *other );
void EP_Steeltown_Check_DoKey (edict_t *self, edict_t *ent );
void EP_Steeltown_ReachedDoKey (edict_t *self );
void EP_Steeltown_EndDoKey (edict_t *self );
qboolean EP_Steeltown_UnlockDoorFlag (edict_t *ent );
void EP_Steeltown_HiredGuysRegisterFlags (edict_t *ent, edict_t *other );
void EP_Steeltown_Player_Log ( edict_t *self, int page );
qboolean EP_Steeltown_Flash_Newflag (edict_t *self, int ep_flag);
// RadioCity procedural defines
qboolean EP_RC_EventSpeech (edict_t *self, edict_t *other, int saywhat );
void EP_RC_ItemPickup (edict_t *self, edict_t *other );
void EP_RC_Script (edict_t *self, char *scriptname );
int EP_RC_HiredGuysFlags (edict_t *player, edict_t *self );
void EP_RC_SpecialEventDeath (edict_t *self );
qboolean EP_RC_CastSight (edict_t *self, edict_t *other, cast_memory_t *mem );
qboolean EP_RC_CastUse (edict_t *self, edict_t *other, edict_t *activator );
void EP_RC_Script (edict_t *ent, char *scriptname );
void EP_RCFlags (edict_t *self );
void EP_RC_CheckMomo (edict_t *ent, cast_memory_t *mem );
void EP_RC_SpecialEventDeath (edict_t *self );
qboolean EP_RC_DoKey (edict_t *ent, edict_t *other );
void EP_RC_Check_DoKey (edict_t *self, edict_t *ent );
void EP_RC_ReachedDoKey (edict_t *self );
void EP_RC_EndDoKey (edict_t *self );
qboolean EP_RC_UnlockDoorFlag (edict_t *ent );
void EP_RC_HiredGuysRegisterFlags (edict_t *ent, edict_t *other );
void EP_RC_Player_Log ( edict_t *self, int page );
void Resp_Scalper_GotTicket ( edict_t *self, edict_t *other, response_t response );
qboolean EP_RC_Flash_Newflag (edict_t *self, int ep_flag);
typedef enum
{
say_neutral,
say_asshole,
say_hostile,
say_flashlight,
say_alisthatyou,
say_behindthebarrel,
say_forabuck,
say_talktobetty
} saywhat_say;
typedef struct player_log_s player_log_t;
struct player_log_s
{
char *ep_text;
int ep_flag;
int clue_number;
qboolean new_clue;
};

180
gamesrc/EP_LOG.C Normal file
View file

@ -0,0 +1,180 @@
// ep_log.c
#include "g_local.h"
player_log_t ep_skidrow_player_log[] =
{
// 0
// {"Nicki's boys roughed me\nup good left me in this\nshitty little alley in\nSkidrow. Gotta find a way\nback to Poisonville to pay\nthat little bastard back\nneed some wheels...\n",0},
{"Nicki's boys roughed me\nup good left me in this\ndirty little alley in\nSkidrow. Gotta find a way\nback to Poisonville\n",0,0,true},
// 1
{"Fat guy will sell me a\ncrowbar for a buck...\n", EP_SKIDROW_MAGICJ_ASKED_DOLLAR,1,false},
// 2
{"Pawn dude will trade me a\npistol for a Heilman Coil\nCondenser says its in\nstoreroom B at warehouse\naround the corner...\n", EP_PAWNOMATIC_FIRST_TIME,2,false},
// 3
{"Looks like I stumbled into\nthe Sewer Rat gang's turf.\nGotta find a way into\ntheir HQ...\n",EP_SKIDROW_RATS_PISSED,3,false},
// 4
{"Overheard conversation\nbetween some Sewer Rats\nlooks like the Scorp gang\nswiped their moto battery.\nGuess I'll have to venture\ninto their turf to find it\nif I'm ever getting the\nhell out of here...\n", EP_SKIDROW_RATS_FIND,4,false},
// 5
// {"Chick by bar says I need\nto steer clear of\ncrazy mofo named Lamont\nguy named Lenny evicted\nhim. Says I should go into\nbar and talk to Lenny...\n", EP_SKIDROW_MONA_FIRST_TIME},
{"Chick by bar says I need\nto steer clear of\ncrazy dude named Lamont\nSays I should go into\nbar and talk to Lenny...\n", EP_SKIDROW_MONA_FIRST_TIME,5,false},
// 6
{"Bum told me about a bike.\nmight be a way out...\n", EP_SKIDROW_NICK_TOLD_BIKE,6,false},
// 7
{"Lenny says he evicted\nLamont for not paying his\nrent. Looks like this guy\nmight be able to help me\nout if I can get his Zolex\nwatch back from Lamont...\n", EP_TALKED_TO_LENNY,7,false},
// 8
{"Found the bike... Broken\ndown piece of junk doesn't\nhave a battery...\n", EP_SKIDROW_FOUND_BIKE,8,false},
// 9
{"Gotta find a way into\nSewer Rat HQ...\n", EP_SKIDROW_CUT_SCENE_TWO,9,false},
// 10
//{"Found Lenny in bar bathroom\nsays he'll help me get into\nSewer Rat hq if I'll take\ndust Lamont for him...\n", 0},
{"Bum said he would tell\nme something good if I\nget him some booze", EP_SKIDROW_TALKED_TO_RUMMY,10,false},
// Key to Storeroom
{"Lenny gave me the key to\nthe storeroom. From there\nI can reach the Sewer Rat\nHeadquarters...\n",EP_SKIDROW_LENNY_TOOK_WATCH,11,false},
//Combo to Safe
{"Bum gave me the combo to\nthe safe...\n", EP_SKIDROW_RUMMY_GAVE_WINE,12,false}
};
player_log_t ep_pv_player_log[] =
{
//Poisonville Intro
{"Back in Poisonville. As\nusual the stench of toxic\nwaste fills the air. Nicki\nwarned me never to show my\nface here again. For the\nrest of his short life\nhe's gonna regret the day\nhe left me still breathing\n",0,0,true},
//Talked to Hireling
{"The local muscle here all\nseem to be working for a\nguy named Louie. I guess\nI better look him up.\n", EP_PV_FIND_LOUIE,1,false},
//Talked to Louie
{"Nicki's boys stole some of\nLouie's important things\nand stashed them in a safe\nin Nicki's warehouse. If\nI can get them back, Louie\nwill let me hire some of\nhis local muscle.\n",EP_PV_TALKED_LOUIE2,2,false},
//Hire Safe Dude
{"I can hire either the\nsafecracker or the demo\nguy to open Nicki's safe.\n",EP_PV_LOUIE_SPEACH_1,3,false},
//Give Key
{"Louie gave me the key to\nNicki's chemical plant\n",EP_PV_LOUIE_KEY,4,false},
//Yolanda Distraction
{"For ten bucks Yolanda will\ndistract the two guards.\nShe works cheap...\n",EP_PV_YOLANDA_ASKED_MONEY,5,false},
//Louie has key - Start of PV_B
{"The two goons were yelling\nabout forgetting to swipe\na key. I wonder if Louie\nstill has it on him?\n",EP_PV_LOUIEPVB,6,false},
// Blown Fuse Pump
{"I need some fuses to get\nthis pump started...\n",EP_PV_ONEFUSE,7,false},
// Nicky escapes - Voiceover
//{"Nicky got away... Time\nenough for him later.\n",},
};
player_log_t ep_sy_player_log[] =
{
// Intro to Shipyard
{"The Shipyards. The final\nresting place for rusty\nold hulks and a home to\nthe diseased rats and scum\neating wharf shrimp...\n",0,0,true},
// Moe after first negative response
{"This Moe guy really backed\ndown when I threw a scare\ninto him. I should keep it\nup...\n",EP_SY_MOE_LASTLINE,1,false},
// Talked to Popeye
{"The old man said to get\nhelp at a bar called the\nSalty Dog\n",EP_SY_GOTO_SALTYDOG,2,false},
// Key to shipyard
{"Heilman and his crew are\nat the shipyard. Before I\ncan take them on I need\nthe key to the gate.\n",EP_SY_POPEYE_LASTLINE,3,false},
{"The ship's door was rusted\nshut...\n", EP_SY_GOTO_DOORSHUT,4,false},
//Heilman kidnapped Lizzy
{"Heilman's crew just beat\nup Big Willy, kidnapped\nhis girl, and totally\ntrashed the place...\n", EP_SY_GOFIND_BITCH_SAL,5,false},
//Key to warehouse
{"Sal just gave me the key\nto the warehouse...\n",EP_SY_HIRED_SAL,6,false},
// Found Lizzy - Voiceover if no Sal
{"I gotta tell Big Willy we\nwere too late to save\nLizzy. I should probably\nbring him back some proof.\nHmm, I wonder...\n",EP_SY_FOUND_BITCH,7,false},
//Big Willy gives key
{"Big Willy gave me the key\nto the shipyard gate. He's\nlooking to get payback for\nLizzy...\n",EP_SY_BW_HIRED,8,false},
// Found Barney - Voiceover
// {"I just found Barney. I\nwonder if anyone picked\nhis pockets...\n",}
};
// Trainyard help
player_log_t ep_ty_player_log[] =
{
//Intro
{"The Trainyards. An artery\nthrough which homeless\ndrifters, fugitive outlaws\nand illegal goods flow in\nand out of Radio City. It\n is now blocked...\n",0,0,true},
// Get to Radio City via sewers
{"I'm gonna have to take the\nstinking sewers to get to\nRadio City... Yuchh!\n",EP_TY_TAKETHESEWER,1,false},
//Missing valve handle
{"Gotta find a valve handle\nfor the access panel...\n",EP_TY_HANN_CLUE2,2,false},
//Blown fuse
{"The fuse for the ladder is\nblown. They gotta keep a\nspare one somewhere around\nhere...\n",EP_TY_FUSEBLOWN ,3,false},
};
player_log_t ep_st_player_log[] =
{
// Intro
{"Steeltown. The furnaces\nof Moker's steel mill burn\naround the clock. Fueled\nwith the sweat of forced\nchild labor...\n",0,0,true},
//Moker not in office *** First person voice over clue***
{"Moker's not in his office.\n",EP_Steeltown_MOKER_NOTINOFFICE,1,false},
// HMG clue
{"I gotta get my hands on\none of those new guns...\n",EP_Steeltown_KIDS_CLUE1,2,false},
// David a prisoner
{"Bambi's kid brother David\nis a prisoner in the steel\nmill...\n",EP_Steeltown_BAMBI_LINE1,3,false},
// Bambi the barmaid at the Boiler Room
{"A babe named Bambi waits\ntables down at the Boiler\nRoom. I hear she's in some\nkind of trouble...\n",EP_Steeltown_MATHEW_LINE1,4,false},
//Armor in the basement
{"Moker's got armor in the\nthe Pawnomatic basement.\n",EP_Steeltown_BRITTANY_LINE1,5,false},
//David good with lockpick
{"David's supposed to be\ngood with a lockpick...\n",EP_Steeltown_KIDS_CLUE2,6,false},
//HMG locked up
{"The new guns are locked\nup. But that doesn't seem\nto bother David much...\n",EP_Steeltown_DAVID_SAY3,7,false},
//David Dead - Bambi talk
{"David's Dead. I better\ntell Bambi...\n", EP_Steeltown_DAVID_DEAD_A,8,false},
//David Dead - No Bambi talk
{"Some guy named David just\ngot clipped. I guess I\nbetter tell someone...\n", EP_Steeltown_DAVID_DEAD_B,9,false},
//Bambi gives key
{"Bambi gave me the key to\nMoker's office building.\n", EP_Steeltown_DAVID_DEAD,10,false},
//Bambi gives key
{"Bambi gave me the key to\nMoker's office building.\n", EP_Steeltown_BAMBI_DONE,11,false}
};
player_log_t ep_rc_player_log[] =
{
//Intro
{"Radio City at last. The\nKingpin's stronghold. The\ncapital city of a criminal\nempire. Mine for taking\nif I've got the guts. Once\nI go forward, there's no\nturning back...\n",0,0,true},
//Butch and Patrick - clear out Tunnel freaks
{"To join their gang I gotta\nwaste three Tunnel Freaks\nwith nothing but a crowbar\nThese Jokers are hardcore.\n",EP_RC_BUTCH_FIRST,1,false},
//Scalper - Take Skytram to Central Tower
{"Just found out that I can\nonly get to Central Tower\nby Skytram...\n",EP_RC_SCALPER_NOTEPAD,2,false},
//Lola - Weapons stashed
{"There are supposed to be\nsome weapons hidden around\nhere somewhere. I'll keep\nmy eyes open...\n",EP_RC_LOLA_NOTEBOOK,3,false},
// Talk to Butch and Patrick
{"I gotta go see Butch and\nPatrick if I want to join\nthe Jokers...\n", EP_RC_JOKERS_NOTEPAD,4,false},
//Hey I heard that
{"Ooops, had to use a gun. I\nwonder if they'll still\nlet me join?\n", EP_RC_FAILED_TEST,5,false}
};

19
gamesrc/EP_LOG.H Normal file
View file

@ -0,0 +1,19 @@
// ep_log.h
#define NUM_SKIDROW_PLAYER_LOG 13
extern player_log_t ep_skidrow_player_log[];
#define NUM_PV_PLAYER_LOG 8
extern player_log_t ep_pv_player_log[];
#define NUM_SY_PLAYER_LOG 9
extern player_log_t ep_sy_player_log[];
#define NUM_TY_PLAYER_LOG 4
extern player_log_t ep_ty_player_log[];
#define NUM_ST_PLAYER_LOG 12
extern player_log_t ep_st_player_log[];
#define NUM_RC_PLAYER_LOG 6
extern player_log_t ep_rc_player_log[];

2
gamesrc/GAME.DEF Normal file
View file

@ -0,0 +1,2 @@
EXPORTS
GetGameAPI

29
gamesrc/GAME.DSW Normal file
View file

@ -0,0 +1,29 @@
Microsoft Developer Studio Workspace File, Format Version 6.00
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
###############################################################################
Project: "game"=.\game.dsp - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
}}}
###############################################################################
Global:
Package=<5>
{{{
}}}
Package=<3>
{{{
}}}
###############################################################################

238
gamesrc/GAME.H Normal file
View file

@ -0,0 +1,238 @@
// game.h -- game dll information visible to server
#define GAME_API_VERSION 3
// edict->svflags
#define SVF_NOCLIENT 0x00000001 // don't send entity to clients, even if it has effects
#define SVF_DEADMONSTER 0x00000002 // treat as CONTENTS_DEADMONSTER for collision
#define SVF_MONSTER 0x00000004 // treat as CONTENTS_MONSTER for collision
// JOSEPH 27-OCT-98
#define SVF_PROP 0x00000008 // treat as CONTENTS_PROP for collision
// edict->solid values
typedef enum
{
SOLID_NOT, // no interaction with other objects
SOLID_TRIGGER, // only touch when inside, after moving
SOLID_BBOX, // touch on edge
SOLID_BSP // bsp clip, touch on edge
} solid_t;
//===============================================================
// link_t is only used for entity area links now
typedef struct link_s
{
struct link_s *prev, *next;
} link_t;
#define MAX_ENT_CLUSTERS 16
typedef struct edict_s edict_t;
typedef struct gclient_s gclient_t;
#ifndef GAME_INCLUDE
struct gclient_s
{
player_state_t ps; // communicated by server to clients
int ping;
// the game dll can add anything it wants after
// this point in the structure
};
struct edict_s
{
entity_state_t s;
struct gclient_s *client;
qboolean inuse;
int linkcount;
// FIXME: move these fields to a server private sv_entity_t
link_t area; // linked to a division node or leaf
int num_clusters; // if -1, use headnode instead
int clusternums[MAX_ENT_CLUSTERS];
int headnode; // unused if num_clusters != -1
int areanum, areanum2;
//================================
int svflags; // SVF_NOCLIENT, SVF_DEADMONSTER, SVF_MONSTER, etc
vec3_t mins, maxs;
vec3_t absmin, absmax, size;
solid_t solid;
int clipmask;
edict_t *owner;
float voice_pitch; // used to pitch voices up/down, 1.0 = same, 2.0 = chipmunk (double speed)
// the game dll can add anything it wants after
// this point in the structure
};
#endif // GAME_INCLUDE
//===============================================================
//
// functions provided by the main engine
//
typedef struct
{
// special messages
void (*bprintf) (int printlevel, char *fmt, ...);
void (*dprintf) (char *fmt, ...);
void (*cprintf) (edict_t *ent, int printlevel, char *fmt, ...);
void (*centerprintf) (edict_t *ent, char *fmt, ...);
void (*sound) (edict_t *ent, int channel, int soundindex, float volume, float attenuation, float timeofs);
void (*positioned_sound) (vec3_t origin, edict_t *ent, int channel, int soundinedex, float volume, float attenuation, float timeofs);
// config strings hold all the index strings, the lightstyles,
// and misc data like the sky definition and cdtrack.
// All of the current configstrings are sent to clients when
// they connect, and changes are sent to all connected clients.
void (*configstring) (int num, char *string);
void (*error) (char *fmt, ...);
// the *index functions create configstrings and some internal server state
int (*modelindex) (char *name);
int (*soundindex) (char *name);
int (*imageindex) (char *name);
int (*skinindex) (int modelindex, char *name);
void (*setmodel) (edict_t *ent, char *name);
// collision detection
trace_t (*trace) (vec3_t start, vec3_t mins, vec3_t maxs, vec3_t end, edict_t *passent, int contentmask);
int (*pointcontents) (vec3_t point);
qboolean (*inPVS) (vec3_t p1, vec3_t p2);
qboolean (*inPHS) (vec3_t p1, vec3_t p2);
void (*SetAreaPortalState) (int portalnum, qboolean open);
qboolean (*AreasConnected) (int area1, int area2);
// an entity will never be sent to a client or used for collision
// if it is not passed to linkentity. If the size, position, or
// solidity changes, it must be relinked.
void (*linkentity) (edict_t *ent);
void (*unlinkentity) (edict_t *ent); // call before removing an interactive edict
int (*BoxEdicts) (vec3_t mins, vec3_t maxs, edict_t **list, int maxcount, int areatype);
void (*Pmove) (pmove_t *pmove); // player movement code common with client prediction
// network messaging
void (*multicast) (vec3_t origin, multicast_t to);
void (*unicast) (edict_t *ent, qboolean reliable);
void (*WriteChar) (int c);
void (*WriteByte) (int c);
void (*WriteShort) (int c);
void (*WriteLong) (int c);
void (*WriteFloat) (float f);
void (*WriteString) (char *s);
void (*WritePosition) (vec3_t pos); // some fractional bits
void (*WriteDir) (vec3_t pos); // single byte encoded, very coarse
void (*WriteAngle) (float f);
// managed memory allocation
void *(*TagMalloc) (int size, int tag);
void (*TagFree) (void *block);
void (*FreeTags) (int tag);
// Ridah
void (*ClearObjectBoundsCached) (void);
void (*StopRender) (void);
// console variable interaction
cvar_t *(*cvar) (char *var_name, char *value, int flags);
cvar_t *(*cvar_set) (char *var_name, char *value);
cvar_t *(*cvar_forceset) (char *var_name, char *value);
// ClientCommand and ServerCommand parameter access
int (*argc) (void);
char *(*argv) (int n);
char *(*args) (void); // concatenation of all argv >= 1
// add commands to the server console as if they were typed in
// for map changing, etc
void (*AddCommandString) (char *text);
void (*DebugGraph) (float value, int color);
// Ridah, MDX
void (*GetObjectBounds) ( char *mdx_filename, model_part_t *model_part );
// done.
// Ridah, so we can save the game when traversing to a new level (so hiredguy's get restored when restarting a map)
void (*SaveCurrentGame) (void);
} game_import_t;
//
// functions exported by the game subsystem
//
typedef struct
{
int apiversion;
// the init function will only be called when a game starts,
// not each time a level is loaded. Persistant data for clients
// and the server can be allocated in init
void (*Init) (void);
void (*Shutdown) (void);
// each new level entered will cause a call to SpawnEntities
void (*SpawnEntities) (char *mapname, char *entstring, char *spawnpoint);
// Read/Write Game is for storing persistant cross level information
// about the world state and the clients.
// WriteGame is called every time a level is exited.
// ReadGame is called on a loadgame.
void (*WriteGame) (char *filename, qboolean autosave);
void (*ReadGame) (char *filename);
// ReadLevel is called after the default map information has been
// loaded with SpawnEntities
void (*WriteLevel) (char *filename);
void (*ReadLevel) (char *filename);
qboolean (*ClientConnect) (edict_t *ent, char *userinfo);
void (*ClientBegin) (edict_t *ent);
void (*ClientUserinfoChanged) (edict_t *ent, char *userinfo);
void (*ClientDisconnect) (edict_t *ent);
void (*ClientCommand) (edict_t *ent);
void (*ClientThink) (edict_t *ent, usercmd_t *cmd);
void (*RunFrame) (void);
// ServerCommand will be called when an "sv <command>" command is issued on the
// server console.
// The game can issue gi.argc() / gi.argv() commands to get the rest
// of the parameters
void (*ServerCommand) (void);
int *(*GetNumObjectBounds) (void);
void *(*GetObjectBoundsPointer) (void);
int (*GetNumJuniors) (void);
//
// global variables shared between game and server
//
// The edict array is allocated in the game dll so it
// can vary in size from one game to another.
//
// The size will be fixed when ge->Init() is called
struct edict_s *edicts;
int edict_size;
int num_edicts; // current number, <= max_edicts
int max_edicts;
} game_export_t;
game_export_t *GetGameApi (game_import_t *import);

4788
gamesrc/G_AI.C Normal file

File diff suppressed because it is too large Load diff

221
gamesrc/G_AI.H Normal file
View file

@ -0,0 +1,221 @@
// *************************************
// New AI system defines
#define MAX_CAST_GROUPS 16
#define MAX_CHARACTERS 64 // this includes players
#define DEFAULT_MAX_ATTACK_DISTANCE 1024 // stand and attack enemies within this range
#define DEFAULT_MAX_SIGHTING_DISTANCE 2048 // can't see things outside this range
#define FACE_ANIM_DIST 2048 // AI will play an animation to straighten while attacking if beyind this distance
#define AI_NOT_HOLSTERED_RANGE_1 200
#define AI_NOT_HOLSTERED_RANGE_2 384
#define AI_NOT_HOLSTERED_RANGE_3 800
#define ENEMY_SIGHT_DURATION 3 // enemies sighted "less than this time" ago will be attacked
#define SPAWNFLAG_IMMEDIATE_FOLLOW_PATH 32
// Cast Memory defines
#define NUM_MEMORY_TYPES 3
#define MEMORY_TYPE_FRIEND 0
#define MEMORY_TYPE_NEUTRAL 1
#define MEMORY_TYPE_ENEMY 2
// Pain orientation checks
#define ORIENTATION_CENTER 0
#define ORIENTATION_LEFT 1
#define ORIENTATION_RIGHT 2
// Player order commands
#define ORDER_MOVE 1
#define ORDER_HOLD 2
#define ORDER_FOLLOWME 3
// Side Trace
#define SIDE_RANDOM 0
#define SIDE_RIGHT 1
#define SIDE_LEFT -1
// General movement stuff
#define AI_TOO_CLOSE_DIST 48.0
#define AI_GUARDING_DIST 140.0
// ai flags
#define AI_NOWALK_FACE 0x00000001 // don't walk when turning to face
#define AI_TEMP_STAND_GROUND 0x00000002
#define AI_NO_TALK 0x00000004 // prevent this character from talking (good for waiting in ambush)
#define AI_GOAL_RUN 0x00000008 // set this for entities that the AI should run towards
#define AI_FACE_ATTACK 0x00000010 // always face the enemy when attacking
#define AI_MOVEOUT 0x00000020
#define AI_MELEE 0x00000040 // this character can only do melee attacks
#define AI_GRENADE_GUY 0x00000080
#define AI_DUCKATTACK 0x00000100 // only ducking for attack
#define AI_GOAL_IGNOREENEMY 0x00000200
#define AI_NOSTEP 0x00000400
#define AI_RELOAD 0x00000800 // need to reload before we can fire again
#define AI_TAKECOVER_IGNOREHEALTH 0x00001000 // don't do health checks to see if we should resume attacking
#define AI_GOALENT_MANUAL_CLEAR 0x00002000 // set this on the goal_ent if we should NOT set our ->goal_ent = NULL when we get there
#define AI_DOKEY 0x00004000
#define AI_IMMORTAL 0x00008000
#define AI_REPEAT_TALK_JESTURE 0x00010000 // keep making talking jesture
#define AI_SKILL_LADDER 0x00020000
#define AI_HOLD_POSITION 0x00040000
#define AI_TAKE_COVER 0x00080000
#define AI_IGNORE_ENEMY 0x00100000
#define AI_FASTWALK 0x00200000 // characters will WALK at twice the speed (including faster animation)
#define AI_PLAYERCLIP 0x00400000 // uses PLAYERCLIP bounding instead of MONSTERCLIP
#define AI_NO_TAKE_COVER 0x00800000 // don't take cover from anything
#define AI_ADJUSTPITCH 0x01000000 // used for dogs so they angle up for stairs, ramps, etc
#define AI_TALK 0x02000000 // stop "avoid walking" when we're facing the character
#define AI_SIDE_ATTACK 0x04000000
#define AI_TURN_BLOCKED 0x08000000
#define AI_RUN_LIKE_HELL 0x10000000
#define AI_RUSH_THE_PLAYER 0x20000000
#define AI_HEARD_GUN_SHOT 0x40000000
#define AI_SIT_TALK 0x80000000
typedef enum
{
resp_yes,
resp_no
} response_t;
#define STATE_NORMAL 0 // each character does their own thing
#define STATE_FLEE 1 // abort attack, everyone flee
#define STATE_CHARGE 2 // berzerk at charge_ent
// cast_group_t holds information relating to each team in the game, including fighting formations, etc
typedef struct
{
int state;
int charge_ent; // index into g_edicts[]
} cast_group_t;
// Memory flags
#define MEMORY_PERSONAL_OPINION 0x00000001 // set this if we have a personal vendetta on the character, which is not necessarily that of the group
#define MEMORY_CONFIDENTIAL 0x00000002 // only share this information to a fellow group member, or under extreme conditions (like we are neutral and are bribed, or we are tortured)
#define MEMORY_HOSTILE_ENEMY 0x00000004 // attack upon sighting this character
#define MEMORY_ASSHOLE 0x00000008 // we don't like this person, but they're not an enemy (just effects speech)
#define MEMORY_LASTWARNING 0x00000010 // we want to give a final warning to the player before we become hostile
#define MEMORY_UPSET 0x00000020 // will use specific upset speech
#define MEMORY_AFRAID 0x00000040
#define MEMORY_TAUNT 0x00000080
#define MEMORY_WARNED_BACKOFF 0x00000100 // we've warned this person to backoff already
#define MEMORY_HIRE_FIRST_TIME 0x00000200
#define MEMORY_HIRE_ASK 0x00000400
#define MEMORY_HIRED 0x00000800
#define MEMORY_NO_TALK 0x00001000 // don't talk to this person
#define MEMORY_STARTED_ATTACK 0x00002000 // so AI friends only attack enemies that are attacking (and not evading)
// cast_memory_t stores a particular character's memory and opinion of another cast member,
// for which it is aware of (has either seen, or is associated with)
typedef struct cast_memory_s
{
int cast_ent; // "other" character index in the g_edicts[]
vec3_t last_known_origin;
int flags; // deafult to 0, set various flags under certain conditions
int memory_type; // one of MEMORY_TYPE_* constants, defines which cast_memory type this is in, for fast references
float timestamp; // time that this information was updated
// (when gaining information from another character,
// this information is simply copied across, so we
// don't share information infinitely)
float timestamp_dist; // distance at last sighting
float not_holstered_attack_time;
float ignore_time; // pretend we can't see them until this time
byte inc; // this can be used for anything, like counting the times we've warned this person, etc
void (*response)(edict_t *self, edict_t *other, response_t response); // when a player talks to us, call this response routine
short last_known_closest_node; // so we can speed things up
struct cast_memory_s
*next, *prev;
} cast_memory_t;
// *************************************
// New Procedure defines
// g_ai.c
void ai_onfire_run( edict_t *self, float dist );
void ai_sidestep( edict_t *self, float dist);
void AI_CheckEvade( edict_t *self );
qboolean AI_ClearSight ( edict_t *self, edict_t *other, qboolean boxtrace );
int AI_SideTrace( edict_t *self, float dist, float inyaw, int side );
int AI_YawTrace( edict_t *self, float dist, float inyaw );
void AI_MoveToPlatCenter( edict_t *self, edict_t *plat);
qboolean AI_TooClose(edict_t *self, edict_t *goal);
void AI_CheckStillInair(edict_t *self);
qboolean AI_CheckAttack(edict_t *self);
void AI_StartAttack(edict_t *self, edict_t *enemy);
void AI_StartRun( edict_t *self );
void AI_CheckStillClimbingLadder( edict_t *self );
void AI_EndAttack(edict_t *self);
void AI_EndJump(edict_t *self);
void AI_EndDeath(edict_t *self);
void AI_EndRun(edict_t *self);
void AI_End_CrouchStand_Down(edict_t *self);
void AI_End_CrouchStand_Up(edict_t *self);
int AI_GetOrientation( edict_t *self, edict_t *other );
qboolean AI_CheckTalk( edict_t *self );
void AI_TalkThink( edict_t *self, qboolean ismale );
qboolean ValidBoxAtLoc(vec3_t org, vec3_t mins, vec3_t maxs, edict_t *ignore, int mask);
qboolean AI_CheckTakeCover( edict_t *self );
qboolean AI_ForceTakeCover( edict_t *self, edict_t *enemy, qboolean ignorehealth );
// g_ai_fight.c
qboolean AI_Goto_CombatTarget( edict_t *self );
qboolean AI_BeginAttack( edict_t *self );
qboolean AI_HasLeaderButGoForEnemy( edict_t *self, edict_t *enemy );
void AI_CheckMakeEnemy( edict_t *self, edict_t *other );
void AI_AvoidDangerousEntity( edict_t *ent );
// g_ai_memory.c
qboolean AddCharacterToGame(edict_t *self);
void AI_RemoveFromMemory ( edict_t *self, cast_memory_t *memory );
void AI_AddToMemory ( edict_t *self, cast_memory_t *memory, int memory_type );
void AI_InitMemory( edict_t *self );
void AI_UnloadCastMemory (edict_t *self);
void AI_ShareEnemies ( edict_t *self, edict_t *other );
void AI_RecordSighting(edict_t *src, edict_t *dest, float dist);
void AI_UpdateCharacterMemories( int max_iterations );
void AI_MakeEnemy ( edict_t *self, edict_t *other, int memory_flags );
// g_ai_ents.c
void AI_Ent_droptofloor ( edict_t *self );
void ai_button_think (edict_t *self);
void ai_button_touch (edict_t *self, edict_t *other, cplane_t *plane, csurface_t *surf);
qboolean directly_infront_angle (vec3_t ang1, edict_t *self, edict_t *other);

1288
gamesrc/G_CAST.C Normal file

File diff suppressed because it is too large Load diff

152
gamesrc/G_CHASE.C Normal file
View file

@ -0,0 +1,152 @@
#include "g_local.h"
extern void DeathmatchScoreboard (edict_t *ent);
void UpdateChaseCam(edict_t *ent)
{
static vec3_t mins = {-10, -10, -10}, maxs = {10, 10, 10};
vec3_t o, ownerv, goal;
edict_t *targ;
vec3_t forward, right, up;
trace_t trace;
int i;
vec3_t oldgoal;
vec3_t angles;
// is our chase target gone?
if (!ent->client->chase_target->inuse) {
ent->client->chase_target = NULL;
return;
}
targ = ent->client->chase_target;
VectorCopy(targ->s.origin, ownerv);
VectorCopy(ent->s.origin, oldgoal);
ownerv[2] += targ->viewheight;
VectorCopy(targ->client->v_angle, angles);
if (angles[PITCH] > 56)
angles[PITCH] = 56;
AngleVectors (angles, forward, right, up);
VectorNormalize(forward);
VectorMA(ownerv, -64, forward, o);
VectorMA(o, 24, up, o);
if (o[2] < targ->s.origin[2] + 20)
o[2] = targ->s.origin[2] + 20;
// jump animation lifts
if (!targ->groundentity)
o[2] += 16;
trace = gi.trace(ownerv, mins, maxs, o, targ, MASK_SOLID);
VectorCopy(trace.endpos, goal);
/*
VectorMA(goal, 2, forward, goal);
// pad for floors and ceilings
VectorCopy(goal, o);
o[2] += 6;
trace = gi.trace(goal, vec3_origin, vec3_origin, o, targ, MASK_SOLID);
if (trace.fraction < 1) {
VectorCopy(trace.endpos, goal);
goal[2] -= 6;
}
VectorCopy(goal, o);
o[2] -= 6;
trace = gi.trace(goal, vec3_origin, vec3_origin, o, targ, MASK_SOLID);
if (trace.fraction < 1) {
VectorCopy(trace.endpos, goal);
goal[2] += 6;
}
*/
ent->client->ps.pmove.pm_type = PM_FREEZE;
VectorCopy(goal, ent->s.origin);
for (i=0 ; i<3 ; i++)
ent->client->ps.pmove.delta_angles[i] = ANGLE2SHORT(targ->client->v_angle[i] - ent->client->resp.cmd_angles[i]);
VectorCopy(targ->client->v_angle, ent->client->ps.viewangles);
VectorCopy(targ->client->v_angle, ent->client->v_angle);
// Ridah, angle down a bit since we moved it up
ent->client->v_angle[2] += 35;
ent->viewheight = 0;
ent->client->ps.pmove.pm_flags |= PMF_NO_PREDICTION;
gi.linkentity(ent);
}
void ChaseNext(edict_t *ent)
{
int i;
edict_t *e;
if (!ent->client->chase_target)
{
// select the first entity, then go from there
ent->client->chase_target = &g_edicts[1];
}
i = ent->client->chase_target - g_edicts;
do {
i++;
if (i > maxclients->value)
i = 1;
e = g_edicts + i;
if (!e->inuse)
continue;
if (e->solid != SOLID_NOT)
break;
} while (e != ent->client->chase_target);
if (e == ent)
{
ent->client->chase_target = NULL;
return;
}
ent->client->chase_target = e;
ent->client->update_chase = true;
DeathmatchScoreboard(ent);
}
void ChasePrev(edict_t *ent)
{
int i;
edict_t *e;
if (!ent->client->chase_target)
{
// select the first entity, then go from there
ent->client->chase_target = &g_edicts[1];
}
i = ent->client->chase_target - g_edicts;
do {
i--;
if (i < 1)
i = maxclients->value;
e = g_edicts + i;
if (!e->inuse)
continue;
if (e->solid != SOLID_NOT)
break;
} while (e != ent->client->chase_target);
if (e == ent)
{
ent->client->chase_target = NULL;
return;
}
ent->client->chase_target = e;
ent->client->update_chase = true;
DeathmatchScoreboard(ent);
}

76
gamesrc/G_FOG.C Normal file
View file

@ -0,0 +1,76 @@
#if 0
/*
fog.c
*/
/*QUAKED fog_brush (.5 .5 0) ?
"angles" points into the fog brush
*/
#include "g_local.h"
void fog_brush_touch (edict_t *self, edict_t *other, cplane_t *plane, csurface_t *surf)
{
vec3_t vec;
vec3_t vars1, vars2;
if (!(other->client))
return;
VectorSubtract( other->s.origin, self->pos1, vec );
vec[2] = 0;
VectorNormalize( vec );
if (DotProduct( vec, self->movedir ) > 0)
{
gi.dprintf ("going into fog brush\n");
gi.WriteByte (svc_temp_entity);
gi.WriteByte (TE_FOG_BRUSH);
gi.WritePosition (vars1);
gi.WritePosition (vars2);
gi.multicast (other->s.origin, MULTICAST_PVS);
}
else
{
gi.dprintf ("going out of fog brush\n");
gi.WriteByte (svc_temp_entity);
gi.WriteByte (TE_FOG_BRUSH);
gi.WritePosition (vars1);
gi.WritePosition (vars2);
gi.multicast (other->s.origin, MULTICAST_PVS);
}
}
void SP_fog_brush (edict_t *ent)
{
if (deathmatch->value)
{
G_FreeEdict(ent);
return;
}
ent->solid = SOLID_TRIGGER;
ent->touch = fog_brush_touch;
ent->svflags |= SVF_NOCLIENT;
gi.setmodel (ent, ent->model);
gi.linkentity (ent);
// set the center pos
VectorAdd( ent->absmin, ent->absmax, ent->pos1 );
VectorScale( ent->pos1, 0.5, ent->pos1 );
AngleVectors( ent->s.angles, ent->movedir, NULL, NULL );
}
#endif

4483
gamesrc/G_FUNC.C Normal file

File diff suppressed because it is too large Load diff

23
gamesrc/G_FUNC.H Normal file
View file

@ -0,0 +1,23 @@
// g_func.h
// defines
#define PLAT_LOW_TRIGGER 1
#define STATE_TOP 0
#define STATE_BOTTOM 1
#define STATE_UP 2
#define STATE_DOWN 3
#define DOOR_START_OPEN 1
#define DOOR_REVERSE 2
#define DOOR_CRUSHER 4
#define DOOR_NOMONSTER 8
#define DOOR_TOGGLE 32
#define DOOR_X_AXIS 64
#define DOOR_Y_AXIS 128
#define DOOR_ROTATE_AWAY 256
// procedures
void Use_Plat (edict_t *ent, edict_t *other, edict_t *activator);

1746
gamesrc/G_LOCAL.H Normal file

File diff suppressed because it is too large Load diff

3679
gamesrc/G_MISC.C Normal file

File diff suppressed because it is too large Load diff

329
gamesrc/G_NAV.H Normal file
View file

@ -0,0 +1,329 @@
// ==================================================================
//
// Character Navigation System (CNS)
//
// ==================================================================
// ==================================================================
// Defines
#define MAX_NODES 700
#define MAX_PARENT_NODES 128
#define MAX_VIS_NODES 15 // bound by file IO methods
#define MAX_CELLS_PER_NODE 4
#define MAX_MAP_AXIS 5000
#define CELL_AXIS_SUBDIVISION 32 // each axis is divided into segments, to form the cell grid
#define OPTIMIZE_NODES 2000 // check this many nodes per frame
// each node can ONLY be ONE of the following types
#define NODE_NORMAL 0
#define NODE_JUMP 1 // jump from this node
#define NODE_LANDING 2 // landing from a jump node
#define NODE_PLAT 4 // start riding a platform
#define NODE_TELEPORT 8 // move into a teleporter
#define NODE_BUTTON 16
// the following can exist in conjunction with others
#define NODE_DUCKING 32
// Visibility Tests
#define VIS_LINE 0
#define VIS_PARTIAL 1
#define VIS_FULL 2
// Route types (returned by NAV_Route_*())
#define ROUTE_NONE 0
#define ROUTE_INDIRECT 1
#define ROUTE_DIRECT 2
// Reachable tests
#define REACHABLE_THOROUGH 4
#define REACHABLE_AVERAGE 16
#define REACHABLE_POOR 32
// File I/O
#ifdef _WIN32
#define DIR_SLASH "\\"
#else
#define DIR_SLASH "/"
#endif
#define ROUTE_VERSION 4 // incremented each time file structure is changed, to allow automatic updating, if possible
#define ROUTE_SUBDIR "navdata"
#define ROUTE_EXT "nav"
// #define DUCKING_MAX_Z 4
#define DUCKING_MAX_Z 24 // as requested
// Not used anymore, characters have individual max_z values
//#define STANDING_MAX_Z 32
//ent->nav_data->flags
#define ND_STATIC 1 // this entity NEVER moves (items)
//ent->nav_build_data->flags
#define NBD_DUCK_NEWPATH 1 // set this whenever starting to duck while dropping nodes
#define NBD_JUMPING 2
#define NBD_SHOWPATH 4
//NAV_GetHidePos parameters
#define HIDEPOS_FURTHER -1
#define HIDEPOS_ANY 0
#define HIDEPOS_CLOSER 1
// ==================================================================
//#include "q_shared.h"
typedef struct node_s node_t;
typedef struct parent_node_s parent_node_t;
typedef struct cell_node_s cell_node_t;
// ==================================================================
// Node structures
//
// ..................................................................
// Routes
//
// This is where the actual route between 2 nodes is stored.
// This is the base of an array, where each item represents
// a path between the source node, and the destination
// (referenced by each array item).
typedef struct
{
short path; // Node to head for, to get to another node, -1 if no route
unsigned short dist; // route distance from this node, to the other node
} route_t;
// ..................................................................
// Parent (low-detail) nodes
//
// These are created, by merging a series of close-by (child) nodes
// into one parent node. These are only used for navigation
// of units that are not currently loaded into memory.
struct parent_node_s
{
vec3_t origin;
route_t routes[MAX_PARENT_NODES]; // Route data between this and all other parent nodes
};
// ..................................................................
// Child (high-detail) nodes
//
// The "normal" state of a node, used when traversing the active
// geometry.
struct node_s
{
short index; // index of this node in the "nodes" array
// SAVED DATA
float timestamp; // time node was created (used for node-creation code)
vec3_t origin; // position of node in active geometry
vec3_t jump_vel; // used for jump velocity
short node_type; // one of NODE_* constants (not flags)
short goal_index; // used for jump nodes, so we know which node to land on
byte waterlevel;
short yaw; // direction facing when node was dropped
byte cast_group; // set this when the node is dropped inside the territory of a specific gang
short visible_nodes[MAX_VIS_NODES]; // nodes that are visible and reachable from this node
short num_visible; // number of nodes visible from this node
route_t routes[MAX_NODES]; // Route data between this node and all other nodes
// Calculated/used at run-time
csurface_t *surface; // surface immediately below the node (used for visibility checking)
float ignore_time; // don't go for this node if level.time < ignore_time
edict_t *goal_ent; // used for trigger/platform/etc relationships
// used by NAV_GetHidePos() to speed things up
float last_sight_check;
qboolean last_sight_result;
};
// ..................................................................
// Cell nodes
//
// These are used, to keep track of which cells a node belongs to.
struct cell_node_s
{
node_t *node; // node that this cell_node is representing
cell_node_t *next; // next cell_node in the cell's list, NULL if end
};
// ..................................................................
// Active Unit-specific structure
//
// Stores all information relative to an ACTIVE unit (the unit currently
// being played.
//
// It is assumed that the eventual structures for inactive and active
// units will simply contain pointers to an active_node_data_t or an
// inactive_node_data_t, with one of them being NULL.
typedef struct
{
short node_count; // number of nodes currently in the unit
qboolean modified; // set if the node data has been modified, so saving will be required
// Main Node Array
//
// Used for references between nodes. Allows use
// of 16bit array indexes, instead of 32-pointers, which saves LOTS
// of memory.
//
// Nodes are allocated as they are added, since the actual nodes are
// the main source of memory useage.
node_t *nodes[MAX_NODES];
// Node Cells
//
// Contains a list of "cell_nodes", which represent a node being in a cell.
// Each node can have up to 4 "cell_nodes", which represent each cell that
// the node is within.
//
// "cell_nodes" are created dynamically, as each node is created, and assigned
// to a cell. These "cell_nodes" are then linked to their cell via a linked
// list, which starts with the array below.
cell_node_t *cells[CELL_AXIS_SUBDIVISION][CELL_AXIS_SUBDIVISION];
} active_node_data_t;
// ..................................................................
// Inactive Unit-specific structure
//
// Stores only the navigation data required for an inactive unit, which
// is MUCH less than an active unit.
//
// Note that area cell's aren't required here, since searches will be
// fast enough not to require them, considering the low number of
// parent nodes in an inactive unit (hence, low-detail nodes).
typedef struct
{
short node_count;
// Parent Node array
//
// Stores a pointer to all parent nodes in the inactive unit.
parent_node_t *parent_nodes[MAX_PARENT_NODES];
} inactive_unit_t;
// ..................................................................
// Navigational System data, used for entities
typedef struct
{
int flags; // changes the way the CNS handles the entity
short cache_node; // last successful closest node
float cache_node_time; // time of last cached node
float cache_valid_time; // time a cached node is deemed valid
short goal_index; // 1 + (index of the node to head for)
csurface_t *surface; // current surface standing on
} nav_data_t;
// ..................................................................
// Node Creation
typedef struct
{
int flags;
node_t *current_node; // last node dropped, or closest node
vec3_t old_org;
edict_t *old_groundentity;
float last_max_z; // used for ducking/standing
vec3_t ducking_org;
edict_t *jump_ent;
// debugging only
edict_t *debug_dest;
} nav_build_data_t;
// ==================================================================
// Navigation Specific variables
cvar_t *nav_dynamic;
cvar_t *nav_debug;
cvar_t *nav_optimize;
cvar_t *nav_aipath;
// ==================================================================
// Procedure Defines
// g_nav.c
void NAV_InitActiveNodes( active_node_data_t *active_node_data);
void NAV_PurgeActiveNodes( active_node_data_t *active_node_data);
node_t *NAV_CreateNode( edict_t *ent,
vec3_t origin,
vec3_t jump_vel,
short node_type,
short goal_index,
int waterlevel );
int NAV_OptimizeRoutes( active_node_data_t *active_node_data );
void NAV_CalculateVisible( active_node_data_t *active_node_data, node_t *node );
int NAV_CalculateRoutes ( active_node_data_t *active_node_data, node_t *node );
qboolean NAV_Visible( vec3_t src, vec3_t dest, int vis_type, int ducking );
qboolean NAV_Reachable( vec3_t src, vec3_t dest,
byte src_waterlevel, byte dest_waterlevel,
int ducking, int reachable_type );
qboolean NAV_ClearSight ( edict_t *self, vec3_t dest, edict_t *dest_ent );
void NAV_CalcNodeSurface( node_t *node );
node_t *NAV_GetClosestNode( edict_t *ent, int vis_type, int ignore_cached, qboolean away_from_enemy );
int NAV_Route_EntityToEntity( edict_t *src, node_t *current_node,
edict_t *dest, int vis_type, int check_all_nodes, route_t *route_out );
int NAV_Route_NodeToEntity( node_t *node,
edict_t *dest, int vis_type, route_t *route_out );
int NAV_Route_EntityToNode( edict_t *src, node_t *current_node,
node_t *dest_node, int vis_type, int check_all_nodes, int check_direct, route_t *route_out );
void NAV_EvaluateMove( edict_t *ent );
// g_nav_io.c
void NAV_WriteActiveNodes( active_node_data_t *active_node_data, char *unitname);
void NAV_WriteNode(FILE *f, active_node_data_t *active_node_data, node_t *node);
void NAV_ReadActiveNodes( active_node_data_t *active_node_data, char *unitname);
void NAV_ReadNode( FILE *f, active_node_data_t *active_node_data, node_t *node);
void NAV_FindGoalEnt( node_t *node );
void NAV_CalculateDistances(active_node_data_t *active_node_data);
int NAV_CalculateRouteDistance( active_node_data_t *active_node_data, node_t *src, node_t *dest );
// g_nav_cells.c
int NAV_GetCellIndexForAxis(float pos);
void NAV_AddNodeToCells(active_node_data_t *active_node_data, node_t *node);
// g_nav_misc.c
void NAV_DrawLine(vec3_t sorg, vec3_t dorg);
float NAV_Debug_DrawPath(edict_t *src, edict_t *dest);
void NAV_dprintf(char *fmt, ...);
void NAV_RebuildRoutes(active_node_data_t *node_data); // UNDER DEVELOPMENT!!
float *NAV_GetCombatPos( edict_t *ent, edict_t *enemy, qboolean melee );
float *NAV_GetHidePos( edict_t *ent, edict_t *enemy, int hidepos_type );
qboolean NAV_GetAvoidDirection( edict_t *ent, edict_t *avoid, vec3_t dir );
float *NAV_GetReachableNodeOutsideBounds( edict_t *ent, vec3_t bmins, vec3_t bmaxs );

2222
gamesrc/G_PAWN.C Normal file

File diff suppressed because it is too large Load diff

1376
gamesrc/G_PHYS.C Normal file

File diff suppressed because it is too large Load diff

281
gamesrc/G_SVCMDS.C Normal file
View file

@ -0,0 +1,281 @@
#include "g_local.h"
void Svcmd_Test_f (void)
{
gi.cprintf (NULL, PRINT_HIGH, "Svcmd_Test_f()\n");
}
/*
==============================================================================
PACKET FILTERING
You can add or remove addresses from the filter list with:
addip <ip>
removeip <ip>
The ip address is specified in dot format, and any unspecified digits will match any value, so you can specify an entire class C network with "addip 192.246.40".
Removeip will only remove an address specified exactly the same way. You cannot addip a subnet, then removeip a single host.
listip
Prints the current list of filters.
writeip
Dumps "addip <ip>" commands to listip.cfg so it can be execed at a later date. The filter lists are not saved and restored by default, because I beleive it would cause too much confusion.
filterban <0 or 1>
If 1 (the default), then ip addresses matching the current list will be prohibited from entering the game. This is the default setting.
If 0, then only addresses matching the list will be allowed. This lets you easily set up a private game, or a game that only allows players from your local network.
==============================================================================
*/
typedef struct
{
unsigned mask;
unsigned compare;
} ipfilter_t;
#define MAX_IPFILTERS 1024
ipfilter_t ipfilters[MAX_IPFILTERS];
int numipfilters;
/*
=================
StringToFilter
=================
*/
static qboolean StringToFilter (char *s, ipfilter_t *f)
{
char num[128];
int i, j;
byte b[4];
byte m[4];
for (i=0 ; i<4 ; i++)
{
b[i] = 0;
m[i] = 0;
}
for (i=0 ; i<4 ; i++)
{
if (*s < '0' || *s > '9')
{
gi.cprintf(NULL, PRINT_HIGH, "Bad filter address: %s\n", s);
return false;
}
j = 0;
while (*s >= '0' && *s <= '9')
{
num[j++] = *s++;
}
num[j] = 0;
b[i] = atoi(num);
if (b[i] != 0)
m[i] = 255;
if (!*s)
break;
s++;
}
f->mask = *(unsigned *)m;
f->compare = *(unsigned *)b;
return true;
}
/*
=================
SV_FilterPacket
=================
*/
qboolean SV_FilterPacket (char *from)
{
int i;
unsigned in;
byte m[4];
char *p;
i = 0;
p = from;
while (*p && i < 4) {
m[i] = 0;
while (*p >= '0' && *p <= '9') {
m[i] = m[i]*10 + (*p - '0');
p++;
}
if (!*p || *p == ':')
break;
i++, p++;
}
in = *(unsigned *)m;
for (i=0 ; i<numipfilters ; i++)
if ( (in & ipfilters[i].mask) == ipfilters[i].compare)
return (int)filterban->value;
return (int)!filterban->value;
}
/*
=================
SV_AddIP_f
=================
*/
void SVCmd_AddIP_f (void)
{
int i;
if (gi.argc() < 3) {
gi.cprintf(NULL, PRINT_HIGH, "Usage: addip <ip-mask>\n");
return;
}
for (i=0 ; i<numipfilters ; i++)
if (ipfilters[i].compare == 0xffffffff)
break; // free spot
if (i == numipfilters)
{
if (numipfilters == MAX_IPFILTERS)
{
gi.cprintf (NULL, PRINT_HIGH, "IP filter list is full\n");
return;
}
numipfilters++;
}
if (!StringToFilter (gi.argv(2), &ipfilters[i]))
ipfilters[i].compare = 0xffffffff;
}
/*
=================
SV_RemoveIP_f
=================
*/
void SVCmd_RemoveIP_f (void)
{
ipfilter_t f;
int i, j;
if (gi.argc() < 3) {
gi.cprintf(NULL, PRINT_HIGH, "Usage: sv removeip <ip-mask>\n");
return;
}
if (!StringToFilter (gi.argv(2), &f))
return;
for (i=0 ; i<numipfilters ; i++)
if (ipfilters[i].mask == f.mask
&& ipfilters[i].compare == f.compare)
{
for (j=i+1 ; j<numipfilters ; j++)
ipfilters[j-1] = ipfilters[j];
numipfilters--;
gi.cprintf (NULL, PRINT_HIGH, "Removed.\n");
return;
}
gi.cprintf (NULL, PRINT_HIGH, "Didn't find %s.\n", gi.argv(2));
}
/*
=================
SV_ListIP_f
=================
*/
void SVCmd_ListIP_f (void)
{
int i;
byte b[4];
gi.cprintf (NULL, PRINT_HIGH, "Filter list:\n");
for (i=0 ; i<numipfilters ; i++)
{
*(unsigned *)b = ipfilters[i].compare;
gi.cprintf (NULL, PRINT_HIGH, "%3i.%3i.%3i.%3i\n", b[0], b[1], b[2], b[3]);
}
}
/*
=================
SV_WriteIP_f
=================
*/
void SVCmd_WriteIP_f (void)
{
FILE *f;
char name[MAX_OSPATH];
byte b[4];
int i;
cvar_t *game;
game = gi.cvar("game", "", 0);
if (!*game->string)
sprintf (name, "%s/listip.cfg", GAMEVERSION);
else
sprintf (name, "%s/listip.cfg", game->string);
gi.cprintf (NULL, PRINT_HIGH, "Writing %s.\n", name);
f = fopen (name, "wb");
if (!f)
{
gi.cprintf (NULL, PRINT_HIGH, "Couldn't open %s\n", name);
return;
}
fprintf(f, "set filterban %d\n", (int)filterban->value);
for (i=0 ; i<numipfilters ; i++)
{
*(unsigned *)b = ipfilters[i].compare;
fprintf (f, "sv addip %i.%i.%i.%i\n", b[0], b[1], b[2], b[3]);
}
fclose (f);
}
/*
=================
ServerCommand
ServerCommand will be called when an "sv" command is issued.
The game can issue gi.argc() / gi.argv() commands to get the rest
of the parameters
=================
*/
void ServerCommand (void)
{
char *cmd;
cmd = gi.argv(1);
if (Q_stricmp (cmd, "test") == 0)
Svcmd_Test_f ();
else if (Q_stricmp (cmd, "addip") == 0)
SVCmd_AddIP_f ();
else if (Q_stricmp (cmd, "removeip") == 0)
SVCmd_RemoveIP_f ();
else if (Q_stricmp (cmd, "listip") == 0)
SVCmd_ListIP_f ();
else if (Q_stricmp (cmd, "writeip") == 0)
SVCmd_WriteIP_f ();
else
gi.cprintf (NULL, PRINT_HIGH, "Unknown server command \"%s\"\n", cmd);
}

1493
gamesrc/G_TARGET.C Normal file

File diff suppressed because it is too large Load diff

717
gamesrc/G_UTILS.C Normal file
View file

@ -0,0 +1,717 @@
// g_utils.c -- misc utility functions for game module
#include "g_local.h"
void G_ProjectSource (vec3_t point, vec3_t distance, vec3_t forward, vec3_t right, vec3_t result)
{
result[0] = point[0] + forward[0] * distance[0] + right[0] * distance[1];
result[1] = point[1] + forward[1] * distance[0] + right[1] * distance[1];
result[2] = point[2] + forward[2] * distance[0] + right[2] * distance[1] + distance[2];
}
/*
=============
G_Find
Searches all active entities for the next one that holds
the matching string at fieldofs (use the FOFS() macro) in the structure.
Searches beginning at the edict after from, or the beginning if NULL
NULL will be returned if the end of the list is reached.
=============
*/
edict_t *G_Find (edict_t *from, int fieldofs, char *match)
{
char *s;
if (!from)
from = g_edicts;
else
from++;
for ( ; from < &g_edicts[globals.num_edicts] ; from++)
{
if (!from->inuse)
continue;
s = *(char **) ((byte *)from + fieldofs);
if (!s)
continue;
if (!Q_stricmp (s, match))
return from;
}
return NULL;
}
/*
=================
findradius
Returns entities that have origins within a spherical area
findradius (origin, radius)
=================
*/
edict_t *findradius (edict_t *from, vec3_t org, float rad)
{
vec3_t eorg;
int j;
if (!from)
from = g_edicts;
else
from++;
for ( ; from < &g_edicts[globals.num_edicts]; from++)
{
if (!from->inuse)
continue;
if (from->solid == SOLID_NOT)
continue;
for (j=0 ; j<3 ; j++)
eorg[j] = org[j] - (from->s.origin[j] + (from->mins[j] + from->maxs[j])*0.5);
if (VectorLength(eorg) > rad)
continue;
return from;
}
return NULL;
}
/*
=============
G_PickTarget
Searches all active entities for the next one that holds
the matching string at fieldofs (use the FOFS() macro) in the structure.
Searches beginning at the edict after from, or the beginning if NULL
NULL will be returned if the end of the list is reached.
=============
*/
#define MAXCHOICES 8
edict_t *G_PickTarget (char *targetname)
{
edict_t *ent = NULL;
int num_choices = 0;
edict_t *choice[MAXCHOICES];
if (!targetname)
{
gi.dprintf("G_PickTarget called with NULL targetname\n");
return NULL;
}
while(1)
{
ent = G_Find (ent, FOFS(targetname), targetname);
if (!ent)
break;
choice[num_choices++] = ent;
if (num_choices == MAXCHOICES)
break;
}
if (!num_choices)
{
gi.dprintf("G_PickTarget: target %s not found\n", targetname);
return NULL;
}
return choice[rand() % num_choices];
}
void Think_Delay (edict_t *ent)
{
G_UseTargets (ent, ent->activator);
G_FreeEdict (ent);
}
/*
==============================
G_UseTargets
the global "activator" should be set to the entity that initiated the firing.
If self.delay is set, a DelayedUse entity will be created that will actually
do the SUB_UseTargets after that many seconds have passed.
Centerprints any self.message to the activator.
Search for (string)targetname in all entities that
match (string)self.target and call their .use function
==============================
*/
void G_UseTargets (edict_t *ent, edict_t *activator)
{
edict_t *t;
//
// check for a delay
//
if (ent->delay && ent->think != Think_Delay)
{
// create a temp object to fire at a later time
t = G_Spawn();
t->classname = "DelayedUse";
t->nextthink = level.time + ent->delay;
t->think = Think_Delay;
t->activator = activator;
if (!activator)
gi.dprintf ("Think_Delay with no activator\n");
t->message = ent->message;
t->target = ent->target;
t->killtarget = ent->killtarget;
// RAFAEL
t->activate_flags = ent->activate_flags;
return;
}
//
// print the message
//
if ((ent->message) && !(activator->svflags & SVF_MONSTER))
{
gi.centerprintf (activator, "%s", ent->message);
if (ent->noise_index)
gi.sound (activator, CHAN_AUTO, ent->noise_index, 1, ATTN_NORM, 0);
// JOSEPH 29-MAR-99
//else
// gi.sound (activator, CHAN_AUTO, gi.soundindex ("misc/talk1.wav"), 1, ATTN_NORM, 0);
// END JOSEPH
}
//
// kill killtargets
//
// JOSEPH 4-MAY-99
if (ent->killtarget)
{
t = NULL;
while ((t = G_Find (t, FOFS(targetname), ent->killtarget)))
{
G_FreeEdict (t);
if (!ent->inuse)
{
gi.dprintf("entity was removed while using killtargets\n");
return;
}
}
t = NULL;
while ((t = G_Find (t, FOFS(target2), ent->killtarget)))
{
G_FreeEdict (t);
if (!ent->inuse)
{
gi.dprintf("entity was removed (target2 type) while using killtargets\n");
return;
}
}
}
// END JOSEPH
//
// fire targets
//
if (ent->target)
{
t = NULL;
while ((t = G_Find (t, FOFS(targetname), ent->target)))
{
// Rafael: hack to fix Entity used itself message
// this was showing up when you leave a pawnomatic
// exit button is probably tagged wrong
if (t == ent)
continue;
// RAFAEL
if (ent->activate_flags & ACTIVATE_AND_OPEN)
t->activate_flags |= ACTIVATE_AND_OPEN;
// JOSEPH 16-MAR-99
//else if (!Q_stricmp (ent->classname, "trigger_once") && !Q_stricmp (t->classname, "func_door_rotating"))
// t->activate_flags |= ACTIVATE_AND_OPEN;
//else if (!Q_stricmp (ent->classname, "func_door_rotating") && !Q_stricmp (t->classname, "func_door_rotating"))
// t->activate_flags |= ACTIVATE_AND_OPEN;
else if (!Q_stricmp (t->classname, "func_door_rotating"))
t->activate_flags |= ACTIVATE_AND_OPEN;
// JOSEPH 23-APR-99
else if (!Q_stricmp (t->classname, "func_door"))
t->activate_flags |= ACTIVATE_AND_OPEN;
// END JOSEPH
// END JOSEPH
// doors fire area portals in a specific way
if (!Q_stricmp(t->classname, "func_areaportal") &&
(!Q_stricmp(ent->classname, "func_door") || !Q_stricmp(ent->classname, "func_door_rotating")))
continue;
if (t == ent)
{
gi.dprintf ("WARNING: Entity used itself.\n");
}
else
{
if (t->use)
t->use (t, ent, activator);
}
if (!ent->inuse)
{
// note to self: why is is happening
// it may be possible that actors are getting removed
// before they use thier targets
// gi.dprintf("entity was removed while using targets\n");
return;
}
}
}
}
/*
=============
TempVector
This is just a convenience function
for making temporary vectors for function calls
=============
*/
float *tv (float x, float y, float z)
{
static int index;
static vec3_t vecs[8];
float *v;
// use an array so that multiple tempvectors won't collide
// for a while
v = vecs[index];
index = (index + 1)&7;
v[0] = x;
v[1] = y;
v[2] = z;
return v;
}
/*
=============
VectorToString
This is just a convenience function
for printing vectors
=============
*/
char *vtos (vec3_t v)
{
static int index;
static char str[8][32];
char *s;
// use an array so that multiple vtos won't collide
s = str[index];
index = (index + 1)&7;
Com_sprintf (s, 32, "(%i %i %i)", (int)v[0], (int)v[1], (int)v[2]);
return s;
}
vec3_t VEC_UP = {0, -1, 0};
vec3_t MOVEDIR_UP = {0, 0, 1};
vec3_t VEC_DOWN = {0, -2, 0};
vec3_t MOVEDIR_DOWN = {0, 0, -1};
void G_SetMovedir (vec3_t angles, vec3_t movedir)
{
if (VectorCompare (angles, VEC_UP))
{
VectorCopy (MOVEDIR_UP, movedir);
}
else if (VectorCompare (angles, VEC_DOWN))
{
VectorCopy (MOVEDIR_DOWN, movedir);
}
else
{
AngleVectors (angles, movedir, NULL, NULL);
}
VectorClear (angles);
}
float vectoyaw (vec3_t vec)
{
float yaw;
if (vec[YAW] == 0 && vec[PITCH] == 0)
yaw = 0;
else
{
yaw = (int) (atan2(vec[YAW], vec[PITCH]) * 180 / M_PI);
if (yaw < 0)
yaw += 360;
}
return yaw;
}
float entyaw( edict_t *self, edict_t *other )
{
vec3_t vec;
VectorSubtract( other->s.origin, self->s.origin, vec );
VectorNormalize( vec );
return vectoyaw( vec );
}
// Ridah, deleted vectoangles, moved to q_shared.c
char *G_CopyString (char *in)
{
char *out;
out = gi.TagMalloc (strlen(in)+1, TAG_LEVEL);
strcpy (out, in);
return out;
}
void G_InitEdict (edict_t *e)
{
e->inuse = true;
e->classname = "noclass";
e->gravity = 1.0;
e->s.number = e - g_edicts;
// BEGIN: Xatrix/Ridah/Navigator/19-mar-1998
e->nav_data.cache_node = -1;
e->active_node_data = level.node_data;
// END: Xatrix/Ridah/Navigator/19-mar-1998
}
/*
=================
G_Spawn
Either finds a free edict, or allocates a new one.
Try to avoid reusing an entity that was recently freed, because it
can cause the client to think the entity morphed into something else
instead of being removed and recreated, which can cause interpolated
angles and bad trails.
=================
*/
edict_t *G_Spawn (void)
{
int i;
edict_t *e;
e = &g_edicts[(int)maxclients->value+1];
for ( i=maxclients->value+1 ; i<globals.num_edicts ; i++, e++)
{
// the first couple seconds of server time can involve a lot of
// freeing and allocating, so relax the replacement policy
if (!e->inuse && ( e->freetime < 2 || level.time - e->freetime > 0.5 ) )
{
G_InitEdict (e);
return e;
}
}
if (i == game.maxentities)
gi.error ("ED_Alloc: no free edicts");
globals.num_edicts++;
G_InitEdict (e);
return e;
}
/*
=================
G_FreeEdict
Marks the edict as free
=================
*/
void G_FreeEdict (edict_t *ed)
{
// Ridah, fixes Rockets crashing SR1
if (ed->character_index)
level.characters[ed->character_index] = NULL;
gi.unlinkentity (ed); // unlink from world
if ((ed - g_edicts) <= (maxclients->value + BODY_QUEUE_SIZE))
{
// gi.dprintf("tried to free special edict\n");
return;
}
memset (ed, 0, sizeof(*ed));
ed->classname = "freed";
ed->freetime = level.time;
ed->inuse = false;
}
/*
============
G_TouchTriggers
============
*/
void G_TouchTriggers (edict_t *ent)
{
int i, num;
edict_t *touch[MAX_EDICTS], *hit;
// dead things don't activate triggers!
if ((ent->client || (ent->svflags & SVF_MONSTER)) && (ent->health <= 0))
return;
// JOSEPH 25-APR-99
// props don't activate triggers!
if (ent->svflags & SVF_PROP)
return;
// END JOSEPH
num = gi.BoxEdicts (ent->absmin, ent->absmax, touch , MAX_EDICTS, AREA_TRIGGERS);
// be careful, it is possible to have an entity in this
// list removed before we get to it (killtriggered)
for (i=0 ; i<num ; i++)
{
hit = touch[i];
if (!hit->inuse)
continue;
if (!hit->touch)
continue;
hit->touch (hit, ent, NULL, NULL);
}
}
/*
============
G_TouchSolids
Call after linking a new trigger in during gameplay
to force all entities it covers to immediately touch it
============
*/
void G_TouchSolids (edict_t *ent)
{
int i, num;
edict_t *touch[MAX_EDICTS], *hit;
num = gi.BoxEdicts (ent->absmin, ent->absmax, touch
, MAX_EDICTS, AREA_SOLID);
// be careful, it is possible to have an entity in this
// list removed before we get to it (killtriggered)
for (i=0 ; i<num ; i++)
{
hit = touch[i];
if (!hit->inuse)
continue;
if (ent->touch)
ent->touch (hit, ent, NULL, NULL);
if (!ent->inuse)
break;
}
}
/*
==============================================================================
Kill box
==============================================================================
*/
/*
=================
KillBox
Kills all entities that would touch the proposed new positioning
of ent. Ent should be unlinked before calling this!
=================
*/
qboolean KillBox (edict_t *ent)
{
trace_t tr;
while (1)
{
tr = gi.trace (ent->s.origin, ent->mins, ent->maxs, ent->s.origin, NULL, MASK_PLAYERSOLID);
if (!tr.ent)
break;
// nail it
T_Damage (tr.ent, ent, ent, vec3_origin, ent->s.origin, vec3_origin, 100000, 0, DAMAGE_NO_PROTECTION, MOD_TELEFRAG);
// if we didn't kill it, fail
if (tr.ent->solid)
return false;
}
return true; // all clear
}
/*
SurfaceSpriteEffect
Determines whether or not a surface sprite effect can be placed in this location, and
if so, spawns the requested sprite.
RETURNS true if a sprite was spawned
*/
qboolean SurfaceSpriteEffect( byte surf_sfx, byte width, byte height,
edict_t *impact_ent, vec3_t pos, vec3_t normal )
{
#define EXTRUDE_DIST 0.5 // come this far out from wall for trace test
vec3_t angles;
vec3_t right, up;
vec3_t this_pos, x_pos, center_pos, end_pos;
float x, y;
float fwidth, fheight;
trace_t tr;
if (impact_ent != world)
return false;
fwidth = (float) width;
fheight = (float) height;
vectoangles( normal, angles );
AngleVectors( angles, NULL, right, up );
VectorMA( pos, EXTRUDE_DIST, normal, center_pos );
if (!(surf_sfx == SFX_SPRITE_SURF_RIPPLE) && (width > 2 && height > 2))
{
// check all corners of sprite on wall
for (x= -fwidth/2; x<=fwidth/2; x+= fwidth)
{
VectorMA( center_pos, x, right, x_pos );
for (y= -fheight/2; y<= fheight/2; y+= fheight)
{
VectorMA( x_pos, y, up, this_pos );
VectorMA( this_pos, -EXTRUDE_DIST*2, normal, end_pos );
// do a trace
tr = gi.trace( this_pos, NULL, NULL, end_pos, NULL, CONTENTS_SOLID );
if ( ! (!tr.startsolid && tr.fraction < 1 && tr.ent == impact_ent))
{ // no good
return false;
}
}
}
}
// succesful, so spawn the sprite
gi.WriteByte (svc_temp_entity);
gi.WriteByte (TE_SURFACE_SPRITE_ENTITY);
gi.WriteByte (surf_sfx);
gi.WriteByte (width);
gi.WriteByte (height);
gi.WritePosition (center_pos);
gi.WriteAngle (angles[0]);
gi.WriteAngle (angles[1]); // don't need ROLL
if (deathmatch->value)
gi.multicast (center_pos, MULTICAST_PVS);
else
gi.multicast (center_pos, MULTICAST_ALL);
return true;
}
qboolean SurfaceSpriteEffectRipple( byte surf_sfx, byte width, byte height,
edict_t *impact_ent, vec3_t pos, vec3_t normal )
{
#define EXTRUDE_DIST 0.5 // come this far out from wall for trace test
vec3_t angles;
vec3_t right, up;
vec3_t this_pos, x_pos, center_pos, end_pos;
float x, y;
float fwidth, fheight;
trace_t tr;
//if (impact_ent != world)
// return false;
fwidth = (float) width;
fheight = (float) height;
vectoangles( normal, angles );
AngleVectors( angles, NULL, right, up );
VectorMA( pos, EXTRUDE_DIST, normal, center_pos );
if (!(surf_sfx == SFX_SPRITE_SURF_RIPPLE) && (width > 2 && height > 2))
{
// check all corners of sprite on wall
for (x= -fwidth/2; x<fwidth; x+= fwidth)
{
VectorMA( center_pos, x, right, x_pos );
for (y= -fheight/2; y< fheight; y+= fheight)
{
VectorMA( x_pos, y, up, this_pos );
VectorMA( this_pos, -EXTRUDE_DIST*2, normal, end_pos );
// do a trace
tr = gi.trace( this_pos, NULL, NULL, end_pos, NULL, CONTENTS_SOLID );
if ( ! (!tr.startsolid && tr.fraction < 1 && tr.ent == impact_ent))
{ // no good
return false;
}
}
}
}
// succesful, so spawn the sprite
gi.WriteByte (svc_temp_entity);
gi.WriteByte (TE_SURFACE_SPRITE_ENTITY);
gi.WriteByte (surf_sfx);
gi.WriteByte (width);
gi.WriteByte (height);
gi.WritePosition (center_pos);
gi.WriteAngle (angles[0]);
gi.WriteAngle (angles[1]); // don't need ROLL
if (deathmatch->value)
gi.multicast (center_pos, MULTICAST_PVS);
else
gi.multicast (center_pos, MULTICAST_ALL);
return true;
}

3035
gamesrc/G_WEAPON.C Normal file

File diff suppressed because it is too large Load diff

3794
gamesrc/G_cmds.c Normal file

File diff suppressed because it is too large Load diff

2330
gamesrc/G_combat.c Normal file

File diff suppressed because it is too large Load diff

3874
gamesrc/G_items.c Normal file

File diff suppressed because it is too large Load diff

905
gamesrc/G_main.c Normal file
View file

@ -0,0 +1,905 @@
#include "g_local.h"
#include "voice_bitch.h"
#include "voice_punk.h"
game_locals_t game;
level_locals_t level;
game_import_t gi;
game_export_t globals;
spawn_temp_t st;
int sm_meat_index;
int snd_fry;
int meansOfDeath;
edict_t *g_edicts;
cast_memory_t *g_cast_memory;
cast_group_t *g_cast_groups;
int num_object_bounds=0;
object_bounds_t *g_objbnds[MAX_OBJECT_BOUNDS];
cvar_t *deathmatch;
// RAFAEL
// cvar_t *marines;
cvar_t *coop;
cvar_t *dmflags;
cvar_t *skill;
cvar_t *fraglimit;
cvar_t *timelimit;
cvar_t *cashlimit;
cvar_t *password;
cvar_t *maxclients;
cvar_t *maxentities;
cvar_t *g_select_empty;
cvar_t *dedicated;
cvar_t *maxrate;
cvar_t *filterban;
cvar_t *sv_maxvelocity;
cvar_t *sv_gravity;
cvar_t *sv_rollspeed;
cvar_t *sv_rollangle;
cvar_t *gun_x;
cvar_t *gun_y;
cvar_t *gun_z;
cvar_t *run_pitch;
cvar_t *run_roll;
cvar_t *bob_up;
cvar_t *bob_pitch;
cvar_t *bob_roll;
cvar_t *sv_cheats;
cvar_t *flood_msgs;
cvar_t *flood_persecond;
cvar_t *flood_waitdelay;
// Ridah, new cvar's
cvar_t *developer;
cvar_t *ai_debug_memory;
cvar_t *g_vehicle_test;
cvar_t *dm_locational_damage;
cvar_t *showlights;
cvar_t *r_directional_lighting;
cvar_t *cl_captions;
cvar_t *sv_runscale; // 2.0 = double speed, 0.0 = zero movement
cvar_t *burn_enabled;
cvar_t *burn_size;
cvar_t *burn_intensity;
cvar_t *burn_r;
cvar_t *burn_g;
cvar_t *burn_b;
cvar_t *timescale;
cvar_t *teamplay;
cvar_t *g_cashspawndelay;
cvar_t *cl_parental_lock;
cvar_t *cl_parental_override;
cvar_t *dm_realmode;
cvar_t *g_mapcycle_file;
// Ridah, done.
void SpawnEntities (char *mapname, char *entities, char *spawnpoint);
void ClientThink (edict_t *ent, usercmd_t *cmd);
qboolean ClientConnect (edict_t *ent, char *userinfo);
void ClientUserinfoChanged (edict_t *ent, char *userinfo);
void ClientDisconnect (edict_t *ent);
void ClientBegin (edict_t *ent);
void ClientCommand (edict_t *ent);
void RunEntity (edict_t *ent);
void WriteGame (char *filename, qboolean autosave);
void ReadGame (char *filename);
void WriteLevel (char *filename);
void ReadLevel (char *filename);
void InitGame (void);
void G_RunFrame (void);
// JOSEPH 23-OCT-98
void Killed (edict_t *targ, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int mdx_part, int mdx_subobject);
//===================================================================
int gameinc=0;
void ShutdownGame (void)
{
gi.dprintf ("==== ShutdownGame ====\n");
// BEGIN: Xatrix/Ridah/Navigator/21-mar-1998
NAV_PurgeActiveNodes (level.node_data);
// END: Xatrix/Ridah/Navigator/21-mar-1998
// Ridah, clear the lightpaint buffers
if (num_lpbuf > 0)
{
int i;
for (i=0; i<num_lpbuf; i++)
free( lpbuf[i] );
}
gi.FreeTags (TAG_LEVEL);
gi.FreeTags (TAG_GAME);
gi.ClearObjectBoundsCached(); // make sure we wipe the cached list
}
int *GetNumObjectBounds (void)
{
return &num_object_bounds;
}
void *GetObjectBoundsPointer (void)
{
return (void *)(&g_objbnds);
}
int GetNumJuniors (void)
{
return level.num_light_sources;
}
/*
=================
GetGameAPI
Returns a pointer to the structure with all entry points
and global variables
=================
*/
game_export_t *GetGameAPI (game_import_t *import)
{
gi = *import;
globals.apiversion = GAME_API_VERSION;
globals.Init = InitGame;
globals.Shutdown = ShutdownGame;
globals.SpawnEntities = SpawnEntities;
globals.WriteGame = WriteGame;
globals.ReadGame = ReadGame;
globals.WriteLevel = WriteLevel;
globals.ReadLevel = ReadLevel;
globals.ClientThink = ClientThink;
globals.ClientConnect = ClientConnect;
globals.ClientUserinfoChanged = ClientUserinfoChanged;
globals.ClientDisconnect = ClientDisconnect;
globals.ClientBegin = ClientBegin;
globals.ClientCommand = ClientCommand;
globals.RunFrame = G_RunFrame;
globals.ServerCommand = ServerCommand;
globals.edict_size = sizeof(edict_t);
globals.GetNumObjectBounds = GetNumObjectBounds;
globals.GetObjectBoundsPointer = GetObjectBoundsPointer;
globals.GetNumJuniors = GetNumJuniors;
return &globals;
}
#ifndef GAME_HARD_LINKED
// this is only here so the functions in q_shared.c and q_shwin.c can link
void Sys_Error (char *error, ...)
{
va_list argptr;
char text[1024];
va_start (argptr, error);
vsprintf (text, error, argptr);
va_end (argptr);
gi.error (ERR_FATAL, "%s", text);
}
void Com_Printf (char *msg, ...)
{
va_list argptr;
char text[1024];
va_start (argptr, msg);
vsprintf (text, msg, argptr);
va_end (argptr);
gi.dprintf ("%s", text);
}
#endif
//======================================================================
/*
=================
ClientEndServerFrames
=================
*/
void ClientEndServerFrames (void)
{
int i;
edict_t *ent;
// calc the player views now that all pushing
// and damage has been added
for (i=0 ; i<maxclients->value ; i++)
{
ent = g_edicts + 1 + i;
if (!ent->inuse || !ent->client)
continue;
ClientEndServerFrame (ent);
}
}
/*
=================
MapCycleNext
Uses maps.lst and teammaps.lst to cycle the maps during deathmatch
=================
*/
char *MapCycleNext( char *map )
{
char *basevars[] = {"basedir", "cddir", NULL}; // consol variables that point to possible file locations
cvar_t *game_dir, *base_dir;
char filename[MAX_QPATH], dir[MAX_QPATH];
FILE *f;
static char nextmap[MAX_QPATH];
char firstmap[MAX_QPATH];
char travmap[MAX_QPATH];
qboolean matched = false;
int i;
char ch;
qboolean eof = false;
game_dir = gi.cvar("game", "", 0);
// dir, eg: .\gamedir\routes
for (i=0; basevars[i]; i++)
{
base_dir = gi.cvar(basevars[i], ".", 0);
strcpy( dir, base_dir->string);
if (dir[strlen(dir)-1] != DIR_SLASH[0])
strcat( dir, DIR_SLASH);
if (strlen(game_dir->string) == 0)
strcat( dir, "main");
else
strcat( dir, game_dir->string);
// filename, eg: .\gamedir\maps.lst
strcpy( filename, dir);
strcat( filename, DIR_SLASH);
if (g_mapcycle_file->string && strlen(g_mapcycle_file->string) > 0)
strcat( filename, g_mapcycle_file->string);
else if (!teamplay->value)
strcat( filename, "maps.lst");
else
strcat( filename, "teammaps.lst");
// try and open the file for reading
f = fopen ( filename, "rb");
if (f)
break; // we have a valid file
}
if (!f) // no valid file found
return NULL;
// read in the first map
fscanf( f, "%s", firstmap );
strcpy( travmap, firstmap );
ch = 0;
while (ch!='\n' && !feof(f))
fscanf(f, "%c", &ch);
do
{
eof = feof(f);
if (!Q_stricmp( travmap, level.mapname ))
{
matched = true;
}
if (!eof)
{
fscanf( f, "%s", travmap );
ch = 0;
while (ch!='\n' && !feof(f))
fscanf(f, "%c", &ch);
}
if (matched)
{
if (strcmp(travmap, level.mapname) != 0 && strlen(travmap) > 1)
{ // take this map
strcpy( nextmap, travmap );
}
else
{ // use the firstmap
strcpy( nextmap, firstmap );
}
fclose(f);
return nextmap;
}
}
while (!eof);
fclose(f);
// no match, so return nothing
return NULL;
}
/*
=================
EndDMLevel
The timelimit or fraglimit has been exceeded
=================
*/
void EndDMLevel (void)
{
edict_t *ent;
char *nextmap;
// stay on same level flag
if ((int)dmflags->value & DF_SAME_LEVEL)
{
ent = G_Spawn ();
ent->classname = "target_changelevel";
ent->map = level.mapname;
goto done;
}
if (nextmap = MapCycleNext( level.mapname ))
{
ent = G_Spawn ();
ent->classname = "target_changelevel";
ent->map = nextmap;
goto done;
}
if (level.nextmap[0])
{ // go to a specific map
ent = G_Spawn ();
ent->classname = "target_changelevel";
ent->map = level.nextmap;
}
else
{ // search for a changeleve
ent = G_Find (NULL, FOFS(classname), "target_changelevel");
if (!ent)
{ // the map designer didn't include a changelevel,
// so create a fake ent that goes back to the same level
ent = G_Spawn ();
ent->classname = "target_changelevel";
ent->map = level.mapname;
}
}
done:
if (ent && ent->map)
gi.dprintf("DM changelevel: %s (time: %i secs)\n", ent->map, (int)level.time );
// Ridah, play a random music clip
gi.WriteByte( svc_stufftext );
gi.WriteString( va("play world/cypress%i.wav", 2+(rand()%4)) );
gi.multicast (vec3_origin, MULTICAST_ALL);
BeginIntermission (ent);
}
/*
=================
CheckDMRules
=================
*/
void CheckDMRules (void)
{
int i;
gclient_t *cl;
if (level.intermissiontime)
return;
if (!deathmatch->value)
return;
if (timelimit->value)
{
if (level.time >= timelimit->value*60)
{
gi.bprintf (PRINT_HIGH, "Timelimit hit.\n");
EndDMLevel ();
return;
}
}
if (fraglimit->value)
{
for (i=0 ; i<maxclients->value ; i++)
{
cl = game.clients + i;
if (!g_edicts[i+1].inuse)
continue;
if (cl->resp.score >= fraglimit->value)
{
gi.bprintf (PRINT_HIGH, "Fraglimit hit.\n");
EndDMLevel ();
return;
}
}
}
if (cashlimit->value)
{
if ((team_cash[1] >= cashlimit->value) || (team_cash[2] >= cashlimit->value))
{
gi.bprintf (PRINT_HIGH, "Cashlimit hit.\n");
EndDMLevel ();
return;
}
}
}
/*
=============
ExitLevel
=============
*/
void ExitLevel (void)
{
int i;
edict_t *ent;
char command [256];
Com_sprintf (command, sizeof(command), "gamemap \"%s\"\n", level.changemap);
gi.AddCommandString (command);
level.changemap = NULL;
level.exitintermission = 0;
level.intermissiontime = 0;
ClientEndServerFrames ();
// RAFAEL
level.cut_scene_time = 0;
level.speaktime = 0;
// JOSEPH 25-FEB-99
level.cut_scene_end_count = 0;
level.fadeendtime = 0;
level.totalfade = 0;
// END JOSEPH
// JOSEPH 13-JUN-99
level.helpchange = 0;
// END JOSEPH
if (level.bar_lvl)
{
extern void Cmd_HolsterBar_f (edict_t *ent);
edict_t *player;
player = &g_edicts[1];
level.bar_lvl = false;
Cmd_HolsterBar_f (player);
}
// level.pawn_time = 0;
// level.pawn_exit = false;
// clear some things before going to next level
for (i=0 ; i<maxclients->value ; i++)
{
ent = g_edicts + 1 + i;
if (!ent->inuse)
continue;
if (ent->health > ent->client->pers.max_health)
ent->health = ent->client->pers.max_health;
}
// BEGIN: Xatrix/Ridah/19-apr-1998
// make sure Nav data isn't carried over to next level
NAV_PurgeActiveNodes(level.node_data);
level.node_data = NULL;
// BEGIN: Xatrix/Ridah/19-apr-1998
}
/*
================
G_RunFrame
Advances the world by 0.1 seconds
================
*/
extern int bbox_cnt;
extern edict_t *mdx_bbox[];
void AI_ProcessCombat (void);
void G_RunFrame (void)
{
int i;
edict_t *ent;
level.framenum++;
level.time = level.framenum*FRAMETIME;
// exit intermissions
if (level.exitintermission)
{
ExitLevel ();
return;
}
// do character sighting/memory stuff
if ((maxclients->value > 1) && !(deathmatch->value))
{ // coop server, do more checking here
if (dedicated->value)
AI_UpdateCharacterMemories( 256 );
}
// Process Generic Combat AI layer
AI_ProcessCombat ();
//
// treat each object in turn
// even the world gets a chance to think
//
ent = &g_edicts[0];
for (i=0 ; i<globals.num_edicts ; i++, ent++)
{
if (!ent->inuse)
continue;
level.current_entity = ent;
VectorCopy (ent->s.origin, ent->s.old_origin);
if (ent->svflags & SVF_MONSTER || ent->client)
{
if (ent->waterlevel > 1)
{
ent->onfiretime = 0;
}
// On fire
if (ent->onfiretime < 0)
{
ent->onfiretime++;
}
else if (ent->onfiretime > 0)
{
vec3_t point, org, dir;
int i,j;
float dist;
// Deathmatch flames done on client-side
if ((!deathmatch->value /*|| ent->onfiretime == 1*/) && (deathmatch->value || !ent->client))
{
VectorSubtract( g_edicts[1].s.origin, ent->s.origin, dir );
dist = VectorNormalize( dir );
// Ridah, spawn flames at each body part
MDX_HitCheck( ent, world, world, vec3_origin, vec3_origin, vec3_origin, 0, 0, 0, 0, vec3_origin );
for (i = 0; i < bbox_cnt; i++)
{
// don't draw so many if the client is up close
if (dist < 256)
{
if (random() > dist/256)
continue;
}
VectorAdd( mdx_bbox[i]->s.origin, dir, org );
if (!deathmatch->value)
{
for (j=0; j<2; j++)
{
point[2] = (org[2] + ((rand()%18) - 6) + 6);
point[1] = (org[1] + ((rand()%10) - 5));
point[0] = (org[0] + ((rand()%10) - 5));
gi.WriteByte (svc_temp_entity);
gi.WriteByte (TE_SFXFIREGO);
gi.WritePosition (point);
if (ent->onfiretime == 1)
gi.WriteByte (1.2 * 10.0);
else
gi.WriteByte (0.6 * 10.0);
gi.multicast (point, MULTICAST_PVS);
}
}
// just do one smoke cloud
if ((ent->onfiretime == 1) && (rand()%2))
{
point[2] = (org[2] + 20);// + ((rand()&31) - 16) + 20);
point[1] = (org[1]);// + ((rand()%14) - 7));
point[0] = (org[0]);// + ((rand()%14) - 7));
gi.WriteByte (svc_temp_entity);
gi.WriteByte (TE_SFXSMOKE);
gi.WritePosition (point);
// gi.WriteDir (ent->s.angles);
gi.WriteByte (16 + (rand()%24));
gi.WriteByte (0);
gi.multicast (point, MULTICAST_PVS);
}
}
}
if (!ent->deadflag)
{
edict_t *trav=NULL;
float damage=1;
if (!deathmatch->value)
damage;// *= 3;
else
damage;// *= 2;
T_Damage( ent, ent->onfireent, ent->onfireent, vec3_origin, ent->s.origin, vec3_origin, damage, 0, DAMAGE_NO_KNOCKBACK, MOD_FLAMETHROWER );
// make sure they are in the "catch_fire" motion
if (!deathmatch->value && (ent->health > 0) && ent->cast_info.catch_fire)
{
ent->cast_info.catch_fire( ent, ent->onfireent );
}
}
ent->onfiretime--;
if (ent->onfiretime <= 0)
{
ent->onfireent = NULL;
ent->onfiretime = 0;
}
// JOSEPH 3-JUN-99
if (ent->health > 0 && ent->onfiretime == 0)
{
ent->s.model_parts[PART_GUN].invisible_objects = 0;
ent->s.model_parts[PART_GUN2].invisible_objects = 0;
}
else
{
ent->s.model_parts[PART_GUN].invisible_objects = (1<<0 | 1<<1);
ent->s.model_parts[PART_GUN2].invisible_objects = (1<<0 | 1<<1);
}
// END JOSEPH
if (ent->health > 0)
{
// use voice tables for this?
// gi.dprintf( "SOUND TODO: ARRRGGGHH!!! (on fire)\n" );
}
else // dead
{
if (ent->onfiretime > 20)
ent->onfiretime = 20;
if (ent->onfiretime == 1)
{
gi.WriteByte (svc_temp_entity);
gi.WriteByte (TE_BURN_TO_A_CRISP);
gi.WritePosition (ent->s.origin);
gi.multicast (ent->s.origin, MULTICAST_PVS);
}
}
}
}
if (ent->svflags & SVF_MONSTER)
{
// float alpha;
// Blood trail
// JOSEPH 24-JAN-99
if ((!ent->deadflag) && (ent->health < ent->max_health) && (!(ent->svflags & SVF_PROP))/*&& ((ent->healtimer&3) == 2)*/)
// END JOSEPH
{
vec3_t stop;
vec3_t start;
trace_t trace;
VectorCopy(ent->s.origin, start);
start[0] += ((rand()&15)-8);
start[1] += ((rand()&15)-8);
VectorCopy(start, stop);
stop[2] -= 16*16;
trace = gi.trace (start, NULL, NULL, stop, ent, MASK_DEADSOLID);
if (trace.fraction < 1)
{
float rnd;
rnd = (0.2 + 1.5*random());
SurfaceSpriteEffect(SFX_SPRITE_SURF_BLOOD1, (byte)(rnd * SFX_BLOOD_WIDTH), (byte)(rnd * SFX_BLOOD_HEIGHT),
trace.ent, trace.endpos, trace.plane.normal);
}
}
// Heal thy self (healspeed -1 = no heal, healspeed 0 = 1, healspeed >1 = value)
if ((!ent->deadflag) && (ent->health < ent->max_health) && (ent->healspeed >= 0)
&& (!ent->leader || ent->cast_group != 1 || (((int)timescale->value) == 1)) // Ridah, added this or they can set timescale = 100 and followers will restore full health in second
&& (ent->healtimer++ > 30))
// END JOSEPH
{
int i, i2, baseskin;
ent->healtimer = 0;
if (!ent->healspeed)
ent->health += 1;
else
ent->health += ent->healspeed;
if (ent->health > ent->max_health)
ent->health = ent->max_health;
for (i = 0; i < MAX_MODEL_PARTS; i++)
{
for (i2 = 0; i2 < MAX_MODELPART_OBJECTS; i2++)
{
baseskin = ent->s.model_parts[i].baseskin;
if (ent->s.model_parts[i].skinnum[i2] > baseskin)
{
if (ent->health > (ent->max_health * 0.75))
{
ent->s.model_parts[i].skinnum[i2] = baseskin;
}
else if (ent->health > (ent->max_health * 0.5))
{
if (cl_parental_lock->value && !cl_parental_override->value)
ent->s.model_parts[i].skinnum[i2] = baseskin;
else
ent->s.model_parts[i].skinnum[i2] = baseskin + 1;
}
}
}
}
}
}
// END JOSEPH
// if the ground entity moved, make sure we are still on it
if ((ent->groundentity) && (ent->groundentity->linkcount != ent->groundentity_linkcount))
{
ent->groundentity = NULL;
if ( !(ent->flags & (FL_SWIM|FL_FLY)) && (ent->svflags & SVF_MONSTER) )
{
M_CheckGround (ent);
}
}
if (i > 0 && i <= maxclients->value)
{
ClientBeginServerFrame (ent);
}
else
{
G_RunEntity (ent);
// Ridah, fast walking speed
if ( (ent->cast_info.aiflags & AI_FASTWALK)
&& (ent->svflags & SVF_MONSTER)
&& (ent->cast_info.currentmove)
// && (ent->cast_info.currentmove->frame->aifunc == ai_run)
&& (ent->cast_info.currentmove->frame->dist < 20)
&& (!ent->enemy))
{
G_RunEntity (ent);
// JOSEPH 12-MAR-99
if (ent->think) ent->think(ent);
// END JOSEPH
}
}
// Ridah, update lights if using directional lighting
if (!(r_directional_lighting->value) && !deathmatch->value)
{
if (ent->s.renderfx2 & RF2_DIR_LIGHTS)
{
VectorSet( ent->s.last_lighting_update_pos, -9999, -9999, -9999 );
}
}
else if (((ent->s.renderfx2 & RF2_DIR_LIGHTS) || (ent->client) || deathmatch->value))
{
if (!level.num_light_sources) // no lights to source from, so default back to no dir lighting
{
ent->s.renderfx2 &= ~RF2_DIR_LIGHTS;
}
else
{
if (ent->client)
ent->s.renderfx2 |= RF2_DIR_LIGHTS;
// if single player, only calculate if it's visible to our player
if ( (!VectorCompare(ent->s.last_lighting_update_pos, ent->s.origin))
&& ( (ent->client && !deathmatch->value)
|| ( (VectorDistance( ent->s.origin, ent->s.last_lighting_update_pos ) > (deathmatch->value ? 128 : 64))
&& ( (deathmatch->value)
|| (level.cut_scene_time)
|| ( (gi.inPVS( g_edicts[1].s.origin, ent->s.origin))
&& (infront( &g_edicts[1], ent ) ))))))
{
UpdateDirLights( ent );
VectorCopy( ent->s.origin, ent->s.last_lighting_update_pos );
}
else if (showlights->value && gi.inPVS( g_edicts[1].s.origin, ent->s.origin))
{
UpdateDirLights( ent );
}
}
}
}
// see if it is time to end a deathmatch
CheckDMRules ();
// build the playerstate_t structures for all players
ClientEndServerFrames ();
}

1280
gamesrc/G_save.c Normal file

File diff suppressed because it is too large Load diff

1861
gamesrc/G_spawn.c Normal file

File diff suppressed because it is too large Load diff

BIN
gamesrc/Game.ncb Normal file

Binary file not shown.

BIN
gamesrc/Game.opt Normal file

Binary file not shown.

939
gamesrc/MAKEFILE Normal file
View file

@ -0,0 +1,939 @@
#
# Quake2 Makefile for Linux 2.0
#
# Nov '97 by Zoid <zoid@idsoftware.com>
#
# Kingpin-ized, July '99 by Ridah <ridah@frag.com>
#
# ELF only
#
VERSION=1.21_
VERSION_FN=$(VERSION)beta_glibc#$(GLIBC)
RPM_RELEASE=1
ifneq (,$(findstring libc6,$(shell if [ -e /lib/libc.so.6* ];then echo libc6;fi)))
GLIBC=-glibc
else
GLIBC=
endif
ifneq (,$(findstring alpha,$(shell uname -m)))
ARCH=axp
RPMARCH=alpha
else
ARCH=i386
RPMARCH=i386
endif
MOUNT_DIR=/disks/f/kingpin/source
BUILD_DEBUG_DIR=debug$(ARCH)$(GLIBC)
BUILD_RELEASE_DIR=release$(ARCH)$(GLIBC)
CLIENT_DIR=$(MOUNT_DIR)/client
SERVER_DIR=$(MOUNT_DIR)/server
REF_GL_DIR=$(MOUNT_DIR)/ref_gl
COMMON_DIR=$(MOUNT_DIR)/qcommon
LINUX_DIR=$(MOUNT_DIR)/linux
GAME_DIR=$(MOUNT_DIR)/game
NULL_DIR=$(MOUNT_DIR)/null
MESA_DIR=/usr/local/src/Mesa-3.1
#CC=i386-glibc20-linux-gcc
CC=gcc
CPP=g++
BASE_CFLAGS=-Dstricmp=strcasecmp
ifeq ($(ARCH),axp)
RELEASE_CFLAGS=$(BASE_CFLAGS) -ffast-math -funroll-loops \
-fomit-frame-pointer -fexpensive-optimizations
else
RELEASE_CFLAGS=$(BASE_CFLAGS) -m486 -O6 -ffast-math -funroll-loops \
-fomit-frame-pointer -fexpensive-optimizations -malign-loops=2 \
-malign-jumps=2 -malign-functions=2
endif
DEBUG_CFLAGS=$(BASE_CFLAGS) -g
LDFLAGS=-ldl -lm
SVGALDFLAGS=-lvga -lm
XLDFLAGS=-L/usr/X11R6/lib -lX11 -lXext
XCFLAGS=
GLLDFLAGS=-L/usr/X11R6/lib -L/usr/local/lib \
-L$(MESA_DIR)/lib -lX11 -lXext -lvga -lm
GLXLDFLAGS=-L/usr/X11R6/lib -L/usr/local/lib \
-L$(MESA_DIR)/lib -lX11 -lXext -lm
GLCFLAGS=-I$(MESA_DIR)/include -I/usr/include/glide
SHLIBEXT=so
SHLIBCFLAGS=-fPIC
SHLIBLDFLAGS=-shared
# Enable the following line to enable the CD copy protection
DO_CC=$(CC) $(CFLAGS) -DCOPYPROTECT -o $@ -c $<
#DO_NORMAL_CC=$(CC) $(CFLAGS) -o $@ -c $<
DO_DED_CC=$(CC) $(CFLAGS) -DDEDICATED_ONLY -o $@ -c $<
DO_O_CC=$(CC) $(CFLAGS) -O -o $@ -c $<
DO_SHLIB_CC=$(CC) $(CFLAGS) $(SHLIBCFLAGS) -o $@ -c $<
DO_SHLIB_O_CC=$(CC) $(CFLAGS) -O $(SHLIBCFLAGS) -o $@ -c $<
DO_GL_SHLIB_CC=$(CC) $(CFLAGS) $(SHLIBCFLAGS) $(GLCFLAGS) -o $@ -c $<
DO_GL_SHLIB_CPP=$(CPP) $(CFLAGS) $(SHLIBCFLAGS) $(GLCFLAGS) -o $@ -c $<
DO_GL_SHLIB_O_CC=$(CC) $(CFLAGS) -O $(SHLIBCFLAGS) $(GLCFLAGS) -o $@ -c $<
DO_AS=$(CC) $(CFLAGS) -DELF -x assembler-with-cpp -o $@ -c $<
DO_SHLIB_AS=$(CC) $(CFLAGS) $(SHLIBCFLAGS) -DELF -x assembler-with-cpp -o $@ -c $<
#############################################################################
# SETUP AND BUILD
#############################################################################
TARGETS=$(BUILDDIR)/kingpin \
$(BUILDDIR)/game$(ARCH).$(SHLIBEXT) \
$(BUILDDIR)/ref_gl.$(SHLIBEXT) \
$(BUILDDIR)/ref_glx.$(SHLIBEXT)
TARGETS_DED=$(BUILDDIR)/kpded \
$(BUILDDIR)/game$(ARCH).$(SHLIBEXT)
build_debug:
@-mkdir $(BUILD_DEBUG_DIR) \
$(BUILD_DEBUG_DIR)/client \
$(BUILD_DEBUG_DIR)/ded \
$(BUILD_DEBUG_DIR)/ref_gl \
$(BUILD_DEBUG_DIR)/game
$(MAKE) targets BUILDDIR=$(BUILD_DEBUG_DIR) CFLAGS="$(DEBUG_CFLAGS)"
build_release:
@-mkdir $(BUILD_RELEASE_DIR) \
$(BUILD_RELEASE_DIR)/client \
$(BUILD_RELEASE_DIR)/ded \
$(BUILD_RELEASE_DIR)/ref_gl \
$(BUILD_RELEASE_DIR)/game
$(MAKE) targets BUILDDIR=$(BUILD_RELEASE_DIR) CFLAGS="$(RELEASE_CFLAGS)"
build_release_ded:
@-mkdir $(BUILD_RELEASE_DIR) \
$(BUILD_RELEASE_DIR)/ded \
$(BUILD_RELEASE_DIR)/game
$(MAKE) targets_ded BUILDDIR=$(BUILD_RELEASE_DIR) CFLAGS="$(RELEASE_CFLAGS)"
all: build_debug build_release build_releas_ded
egcs egcs_release:
$(MAKE) build_release CC=egcs GLIBC=-glibc-egcs \
RELEASE_CFLAGS="$(BASE_CFLAGS) -mpentium -O6 -ffast-math \
-fomit-frame-pointer -fexpensive-optimizations"
egcs_debug:
$(MAKE) build_debug CC=egcs GLIBC=-glibc-egcs \
DEBUG_CFLAGS="$(BASE_CFLAGS) -g"
targets: $(TARGETS)
targets_ded: $(TARGETS_DED)
#############################################################################
# CLIENT/SERVER
#############################################################################
QUAKE2_OBJS = \
$(BUILDDIR)/client/cl_cin.o \
$(BUILDDIR)/client/cl_ents.o \
$(BUILDDIR)/client/cl_fx.o \
$(BUILDDIR)/client/cl_input.o \
$(BUILDDIR)/client/cl_inv.o \
$(BUILDDIR)/client/cl_main.o \
$(BUILDDIR)/client/cl_parse.o \
$(BUILDDIR)/client/cl_pred.o \
$(BUILDDIR)/client/cl_tent.o \
$(BUILDDIR)/client/cl_scrn.o \
$(BUILDDIR)/client/cl_view.o \
$(BUILDDIR)/client/console.o \
$(BUILDDIR)/client/keys.o \
$(BUILDDIR)/client/menu.o \
$(BUILDDIR)/client/snd_dma.o \
$(BUILDDIR)/client/snd_mem.o \
$(BUILDDIR)/client/snd_mix.o \
$(BUILDDIR)/client/qmenu.o \
\
$(BUILDDIR)/client/cmd.o \
$(BUILDDIR)/client/cmodel.o \
$(BUILDDIR)/client/common.o \
$(BUILDDIR)/client/cvar.o \
$(BUILDDIR)/client/files.o \
$(BUILDDIR)/client/md4.o \
$(BUILDDIR)/client/net_chan.o \
\
$(BUILDDIR)/client/sv_ccmds.o \
$(BUILDDIR)/client/sv_ents.o \
$(BUILDDIR)/client/sv_game.o \
$(BUILDDIR)/client/sv_init.o \
$(BUILDDIR)/client/sv_main.o \
$(BUILDDIR)/client/sv_send.o \
$(BUILDDIR)/client/sv_user.o \
$(BUILDDIR)/client/sv_world.o \
\
$(BUILDDIR)/client/cd_linux.o \
$(BUILDDIR)/client/q_shlinux.o \
$(BUILDDIR)/client/vid_menu.o \
$(BUILDDIR)/client/vid_so.o \
$(BUILDDIR)/client/snd_linux.o \
$(BUILDDIR)/client/sys_linux.o \
$(BUILDDIR)/client/glob.o \
$(BUILDDIR)/client/net_udp.o \
\
$(BUILDDIR)/client/q_shared.o \
$(BUILDDIR)/client/pmove.o \
\
$(BUILDDIR)/client/goautil.o \
$(BUILDDIR)/client/nonport.o \
\
$(BUILDDIR)/client/crc.o
ifeq ($(ARCH),axp)
QUAKE2_AS_OBJS = #blank
else
QUAKE2_AS_OBJS = \
$(BUILDDIR)/client/snd_mixa.o
endif
$(BUILDDIR)/kingpin : $(QUAKE2_OBJS) $(QUAKE2_AS_OBJS)
$(CC) $(CFLAGS) -o $@ $(QUAKE2_OBJS) $(QUAKE2_AS_OBJS) $(LDFLAGS)
$(BUILDDIR)/client/cl_cin.o : $(CLIENT_DIR)/cl_cin.c
$(DO_CC)
$(BUILDDIR)/client/cl_ents.o : $(CLIENT_DIR)/cl_ents.c
$(DO_CC)
$(BUILDDIR)/client/cl_fx.o : $(CLIENT_DIR)/cl_fx.c
$(DO_CC)
$(BUILDDIR)/client/cl_input.o : $(CLIENT_DIR)/cl_input.c
$(DO_CC)
$(BUILDDIR)/client/cl_inv.o : $(CLIENT_DIR)/cl_inv.c
$(DO_CC)
$(BUILDDIR)/client/cl_main.o : $(CLIENT_DIR)/cl_main.c
$(DO_CC)
$(BUILDDIR)/client/cl_parse.o : $(CLIENT_DIR)/cl_parse.c
$(DO_CC)
$(BUILDDIR)/client/cl_pred.o : $(CLIENT_DIR)/cl_pred.c
$(DO_CC)
$(BUILDDIR)/client/cl_tent.o : $(CLIENT_DIR)/cl_tent.c
$(DO_CC)
$(BUILDDIR)/client/cl_scrn.o : $(CLIENT_DIR)/cl_scrn.c
$(DO_CC)
$(BUILDDIR)/client/cl_view.o : $(CLIENT_DIR)/cl_view.c
$(DO_CC)
$(BUILDDIR)/client/console.o : $(CLIENT_DIR)/console.c
$(DO_CC)
$(BUILDDIR)/client/keys.o : $(CLIENT_DIR)/keys.c
$(DO_CC)
$(BUILDDIR)/client/menu.o : $(CLIENT_DIR)/menu.c
$(DO_CC)
$(BUILDDIR)/client/snd_dma.o : $(CLIENT_DIR)/snd_dma.c
$(DO_CC)
$(BUILDDIR)/client/snd_mem.o : $(CLIENT_DIR)/snd_mem.c
$(DO_CC)
$(BUILDDIR)/client/snd_mix.o : $(CLIENT_DIR)/snd_mix.c
$(DO_CC)
$(BUILDDIR)/client/qmenu.o : $(CLIENT_DIR)/qmenu.c
$(DO_CC)
$(BUILDDIR)/client/cmd.o : $(COMMON_DIR)/cmd.c
$(DO_CC)
$(BUILDDIR)/client/cmodel.o : $(COMMON_DIR)/cmodel.c
$(DO_CC)
$(BUILDDIR)/client/common.o : $(COMMON_DIR)/common.c
$(DO_CC)
$(BUILDDIR)/client/crc.o : $(COMMON_DIR)/crc.c
$(DO_CC)
$(BUILDDIR)/client/cvar.o : $(COMMON_DIR)/cvar.c
$(DO_CC)
$(BUILDDIR)/client/files.o : $(COMMON_DIR)/files.c
$(DO_CC)
$(BUILDDIR)/client/md4.o : $(COMMON_DIR)/md4.c
$(DO_CC)
$(BUILDDIR)/client/net_chan.o : $(COMMON_DIR)/net_chan.c
$(DO_CC)
$(BUILDDIR)/client/q_shared.o : $(GAME_DIR)/q_shared.c
$(CC) $(DEBUG_CFLAGS) -o $@ -c $<
$(BUILDDIR)/client/pmove.o : $(COMMON_DIR)/pmove.c
$(DO_CC)
$(BUILDDIR)/client/sv_ccmds.o : $(SERVER_DIR)/sv_ccmds.c
$(DO_CC)
$(BUILDDIR)/client/sv_ents.o : $(SERVER_DIR)/sv_ents.c
$(DO_CC)
$(BUILDDIR)/client/sv_game.o : $(SERVER_DIR)/sv_game.c
$(DO_CC)
$(BUILDDIR)/client/sv_init.o : $(SERVER_DIR)/sv_init.c
$(DO_CC)
$(BUILDDIR)/client/sv_main.o : $(SERVER_DIR)/sv_main.c
$(DO_CC)
$(BUILDDIR)/client/sv_send.o : $(SERVER_DIR)/sv_send.c
$(DO_CC)
$(BUILDDIR)/client/sv_user.o : $(SERVER_DIR)/sv_user.c
$(DO_CC)
$(BUILDDIR)/client/sv_world.o : $(SERVER_DIR)/sv_world.c
$(DO_CC)
$(BUILDDIR)/client/cd_linux.o : $(LINUX_DIR)/cd_linux.c
$(DO_CC)
$(BUILDDIR)/client/q_shlinux.o : $(LINUX_DIR)/q_shlinux.c
$(DO_O_CC)
$(BUILDDIR)/client/vid_menu.o : $(LINUX_DIR)/vid_menu.c
$(DO_CC)
$(BUILDDIR)/client/vid_so.o : $(LINUX_DIR)/vid_so.c
$(DO_CC)
$(BUILDDIR)/client/snd_linux.o : $(LINUX_DIR)/snd_linux.c
$(DO_CC)
$(BUILDDIR)/client/snd_mixa.o : $(LINUX_DIR)/snd_mixa.s
$(DO_AS)
$(BUILDDIR)/client/sys_linux.o : $(LINUX_DIR)/sys_linux.c
$(DO_CC)
$(BUILDDIR)/client/glob.o : $(LINUX_DIR)/glob.c
$(DO_CC)
$(BUILDDIR)/client/net_udp.o : $(LINUX_DIR)/net_udp.c
$(DO_CC)
$(BUILDDIR)/client/goautil.o : $(SERVER_DIR)/goautil.c
$(DO_CC)
$(BUILDDIR)/client/nonport.o : $(SERVER_DIR)/nonport.c
$(DO_CC)
#############################################################################
# DEDICATED SERVER
#############################################################################
Q2DED_OBJS = \
\
$(BUILDDIR)/ded/cmd.o \
$(BUILDDIR)/ded/cmodel.o \
$(BUILDDIR)/ded/common.o \
$(BUILDDIR)/ded/cvar.o \
$(BUILDDIR)/ded/files.o \
$(BUILDDIR)/ded/md4.o \
$(BUILDDIR)/ded/net_chan.o \
\
$(BUILDDIR)/ded/sv_ccmds.o \
$(BUILDDIR)/ded/sv_ents.o \
$(BUILDDIR)/ded/sv_game.o \
$(BUILDDIR)/ded/sv_init.o \
$(BUILDDIR)/ded/sv_main.o \
$(BUILDDIR)/ded/sv_send.o \
$(BUILDDIR)/ded/sv_user.o \
$(BUILDDIR)/ded/sv_world.o \
\
$(BUILDDIR)/ded/q_shlinux.o \
$(BUILDDIR)/ded/sys_linux.o \
$(BUILDDIR)/ded/glob.o \
$(BUILDDIR)/ded/net_udp.o \
\
$(BUILDDIR)/ded/q_shared.o \
$(BUILDDIR)/ded/pmove.o \
\
$(BUILDDIR)/ded/cl_null.o \
$(BUILDDIR)/ded/cd_null.o \
\
$(BUILDDIR)/ded/goautil.o \
$(BUILDDIR)/ded/nonport.o \
\
$(BUILDDIR)/ded/crc.o
$(BUILDDIR)/kpded : $(Q2DED_OBJS)
$(CC) $(CFLAGS) -o $@ $(Q2DED_OBJS) $(LDFLAGS)
$(BUILDDIR)/ded/cmd.o : $(COMMON_DIR)/cmd.c
$(DO_DED_CC)
$(BUILDDIR)/ded/cmodel.o : $(COMMON_DIR)/cmodel.c
$(DO_DED_CC)
$(BUILDDIR)/ded/common.o : $(COMMON_DIR)/common.c
$(DO_DED_CC)
$(BUILDDIR)/ded/cvar.o : $(COMMON_DIR)/cvar.c
$(DO_DED_CC)
$(BUILDDIR)/ded/files.o : $(COMMON_DIR)/files.c
$(DO_DED_CC)
$(BUILDDIR)/ded/md4.o : $(COMMON_DIR)/md4.c
$(DO_DED_CC)
$(BUILDDIR)/ded/net_chan.o : $(COMMON_DIR)/net_chan.c
$(DO_DED_CC)
$(BUILDDIR)/ded/q_shared.o : $(GAME_DIR)/q_shared.c
$(DO_DED_CC)
$(BUILDDIR)/ded/pmove.o : $(COMMON_DIR)/pmove.c
$(DO_DED_CC)
$(BUILDDIR)/ded/sv_ccmds.o : $(SERVER_DIR)/sv_ccmds.c
$(DO_DED_CC)
$(BUILDDIR)/ded/sv_ents.o : $(SERVER_DIR)/sv_ents.c
$(DO_DED_CC)
$(BUILDDIR)/ded/sv_game.o : $(SERVER_DIR)/sv_game.c
$(DO_DED_CC)
$(BUILDDIR)/ded/sv_init.o : $(SERVER_DIR)/sv_init.c
$(DO_DED_CC)
$(BUILDDIR)/ded/sv_main.o : $(SERVER_DIR)/sv_main.c
$(DO_DED_CC)
$(BUILDDIR)/ded/sv_send.o : $(SERVER_DIR)/sv_send.c
$(DO_DED_CC)
$(BUILDDIR)/ded/sv_user.o : $(SERVER_DIR)/sv_user.c
$(DO_DED_CC)
$(BUILDDIR)/ded/sv_world.o : $(SERVER_DIR)/sv_world.c
$(DO_DED_CC)
$(BUILDDIR)/ded/q_shlinux.o : $(LINUX_DIR)/q_shlinux.c
$(DO_DED_CC)
$(BUILDDIR)/ded/sys_linux.o : $(LINUX_DIR)/sys_linux.c
$(DO_DED_CC)
$(BUILDDIR)/ded/glob.o : $(LINUX_DIR)/glob.c
$(DO_DED_CC)
$(BUILDDIR)/ded/net_udp.o : $(LINUX_DIR)/net_udp.c
$(DO_DED_CC)
$(BUILDDIR)/ded/cd_null.o : $(NULL_DIR)/cd_null.c
$(DO_DED_CC)
$(BUILDDIR)/ded/cl_null.o : $(NULL_DIR)/cl_null.c
$(DO_DED_CC)
$(BUILDDIR)/ded/goautil.o : $(SERVER_DIR)/goautil.c
$(DO_DED_CC)
$(BUILDDIR)/ded/nonport.o : $(SERVER_DIR)/nonport.c
$(DO_DED_CC)
$(BUILDDIR)/ded/crc.o : $(COMMON_DIR)/crc.c
$(DO_DED_CC)
#############################################################################
# GAME
#############################################################################
GAME_OBJS = \
$(BUILDDIR)/game/ai_bitch.o \
$(BUILDDIR)/game/ai_bum_sit.o \
$(BUILDDIR)/game/ai_dog.o \
$(BUILDDIR)/game/ai_punk.o \
$(BUILDDIR)/game/ai_runt.o \
$(BUILDDIR)/game/ai_shorty.o \
$(BUILDDIR)/game/ai_skinny.o \
$(BUILDDIR)/game/ai_thug.o \
$(BUILDDIR)/game/ai_thug_sit.o \
$(BUILDDIR)/game/ai_whore.o \
$(BUILDDIR)/game/ep_all.o \
$(BUILDDIR)/game/ep_crystalpalace.o \
$(BUILDDIR)/game/ep_log.o \
$(BUILDDIR)/game/ep_posionville.o \
$(BUILDDIR)/game/ep_radiocity.o \
$(BUILDDIR)/game/ep_shipyards.o \
$(BUILDDIR)/game/ep_skidrow.o \
$(BUILDDIR)/game/ep_steeltown.o \
$(BUILDDIR)/game/ep_trainyard.o \
$(BUILDDIR)/game/g_ai.o \
$(BUILDDIR)/game/g_ai_ents.o \
$(BUILDDIR)/game/g_ai_fight.o \
$(BUILDDIR)/game/g_ai_memory.o \
$(BUILDDIR)/game/g_cast.o \
$(BUILDDIR)/game/g_chase.o \
$(BUILDDIR)/game/g_cmds.o \
$(BUILDDIR)/game/g_combat.o \
$(BUILDDIR)/game/g_fog.o \
$(BUILDDIR)/game/g_func.o \
$(BUILDDIR)/game/g_items.o \
$(BUILDDIR)/game/g_joe_misc.o \
$(BUILDDIR)/game/g_main.o \
$(BUILDDIR)/game/g_misc.o \
$(BUILDDIR)/game/g_nav.o \
$(BUILDDIR)/game/g_nav_cells.o \
$(BUILDDIR)/game/g_nav_io.o \
$(BUILDDIR)/game/g_nav_misc.o \
$(BUILDDIR)/game/g_pawn.o \
$(BUILDDIR)/game/g_phys.o \
$(BUILDDIR)/game/g_save.o \
$(BUILDDIR)/game/g_spawn.o \
$(BUILDDIR)/game/g_svcmds.o \
$(BUILDDIR)/game/g_target.o \
$(BUILDDIR)/game/g_teamplay.o \
$(BUILDDIR)/game/g_trigger.o \
$(BUILDDIR)/game/g_utils.o \
$(BUILDDIR)/game/g_weapon.o \
$(BUILDDIR)/game/lateral.o \
$(BUILDDIR)/game/m_bbox.o \
$(BUILDDIR)/game/m_flash.o \
$(BUILDDIR)/game/m_move.o \
$(BUILDDIR)/game/p_client.o \
$(BUILDDIR)/game/p_hud.o \
$(BUILDDIR)/game/p_trail.o \
$(BUILDDIR)/game/p_view.o \
$(BUILDDIR)/game/p_weapon.o \
$(BUILDDIR)/game/q_shared.o \
$(BUILDDIR)/game/vehicles.o \
$(BUILDDIR)/game/voice.o \
$(BUILDDIR)/game/voice_bitch.o \
$(BUILDDIR)/game/voice_punk.o
# $(BUILDDIR)/game/g_so.o
$(BUILDDIR)/game$(ARCH).$(SHLIBEXT) : $(GAME_OBJS)
$(CC) $(CFLAGS) $(SHLIBLDFLAGS) -o $@ $(GAME_OBJS)
$(BUILDDIR)/game/ai_bitch.o : $(GAME_DIR)/ai_bitch.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/ai_bum_sit.o : $(GAME_DIR)/ai_bum_sit.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/ai_dog.o : $(GAME_DIR)/ai_dog.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/ai_punk.o : $(GAME_DIR)/ai_punk.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/ai_runt.o : $(GAME_DIR)/ai_runt.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/ai_shorty.o : $(GAME_DIR)/ai_shorty.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/ai_skinny.o : $(GAME_DIR)/ai_skinny.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/ai_thug.o : $(GAME_DIR)/ai_thug.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/ai_thug_sit.o : $(GAME_DIR)/ai_thug_sit.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/ai_whore.o : $(GAME_DIR)/ai_whore.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/ep_all.o : $(GAME_DIR)/ep_all.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/ep_crystalpalace.o : $(GAME_DIR)/ep_crystalpalace.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/ep_log.o : $(GAME_DIR)/ep_log.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/ep_posionville.o : $(GAME_DIR)/ep_posionville.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/ep_radiocity.o : $(GAME_DIR)/ep_radiocity.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/ep_shipyards.o : $(GAME_DIR)/ep_shipyards.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/ep_skidrow.o : $(GAME_DIR)/ep_skidrow.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/ep_steeltown.o : $(GAME_DIR)/ep_steeltown.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/ep_trainyard.o : $(GAME_DIR)/ep_trainyard.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/g_ai.o : $(GAME_DIR)/g_ai.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/g_ai_ents.o : $(GAME_DIR)/g_ai_ents.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/g_ai_fight.o : $(GAME_DIR)/g_ai_fight.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/g_ai_memory.o : $(GAME_DIR)/g_ai_memory.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/g_cast.o : $(GAME_DIR)/g_cast.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/g_cmds.o : $(GAME_DIR)/g_cmds.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/g_chase.o : $(GAME_DIR)/g_chase.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/g_combat.o : $(GAME_DIR)/g_combat.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/g_fog.o : $(GAME_DIR)/g_fog.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/g_func.o : $(GAME_DIR)/g_func.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/g_items.o : $(GAME_DIR)/g_items.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/g_joe_misc.o : $(GAME_DIR)/g_joe_misc.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/g_main.o : $(GAME_DIR)/g_main.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/g_misc.o : $(GAME_DIR)/g_misc.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/g_nav.o : $(GAME_DIR)/g_nav.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/g_nav_cells.o : $(GAME_DIR)/g_nav_cells.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/g_nav_io.o : $(GAME_DIR)/g_nav_io.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/g_nav_misc.o : $(GAME_DIR)/g_nav_misc.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/g_pawn.o : $(GAME_DIR)/g_pawn.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/g_phys.o : $(GAME_DIR)/g_phys.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/g_save.o : $(GAME_DIR)/g_save.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/g_spawn.o : $(GAME_DIR)/g_spawn.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/g_svcmds.o : $(GAME_DIR)/g_svcmds.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/g_target.o : $(GAME_DIR)/g_target.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/g_teamplay.o : $(GAME_DIR)/g_teamplay.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/g_trigger.o : $(GAME_DIR)/g_trigger.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/g_utils.o : $(GAME_DIR)/g_utils.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/g_weapon.o : $(GAME_DIR)/g_weapon.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/lateral.o : $(GAME_DIR)/lateral.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/m_bbox.o : $(GAME_DIR)/m_bbox.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/m_flash.o : $(GAME_DIR)/m_flash.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/m_move.o : $(GAME_DIR)/m_move.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/p_client.o : $(GAME_DIR)/p_client.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/p_hud.o : $(GAME_DIR)/p_hud.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/p_trail.o : $(GAME_DIR)/p_trail.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/p_view.o : $(GAME_DIR)/p_view.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/p_weapon.o : $(GAME_DIR)/p_weapon.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/q_shared.o : $(GAME_DIR)/q_shared.c
$(CC) $(DEBUG_CFLAGS) $(SHLIBCFLAGS) -o $@ -c $<
$(BUILDDIR)/game/vehicles.o : $(GAME_DIR)/vehicles.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/voice.o : $(GAME_DIR)/voice.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/voice_bitch.o : $(GAME_DIR)/voice_bitch.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/voice_punk.o : $(GAME_DIR)/voice_punk.c
$(DO_SHLIB_CC)
#############################################################################
# REF_GL
#############################################################################
REF_GL_OBJS = \
$(BUILDDIR)/ref_gl/gl_draw.o \
$(BUILDDIR)/ref_gl/gl_image.o \
$(BUILDDIR)/ref_gl/gl_light.o \
$(BUILDDIR)/ref_gl/gl_mesh.o \
$(BUILDDIR)/ref_gl/gl_model.o \
$(BUILDDIR)/ref_gl/gl_rmain.o \
$(BUILDDIR)/ref_gl/gl_rmisc.o \
$(BUILDDIR)/ref_gl/gl_rsurf.o \
$(BUILDDIR)/ref_gl/gl_warp.o \
\
$(BUILDDIR)/ref_gl/qgl_linux.o \
$(BUILDDIR)/ref_gl/q_shared.o \
$(BUILDDIR)/ref_gl/q_shlinux.o \
$(BUILDDIR)/ref_gl/glob.o \
$(BUILDDIR)/ref_gl/xatrixtxrmap.o
REF_GL_FXMESA_OBJS = \
$(BUILDDIR)/ref_gl/gl_fxmesa.o \
$(BUILDDIR)/ref_gl/rw_in_svgalib.o
REF_GL_GLX_OBJS = \
$(BUILDDIR)/ref_gl/gl_glx.o
$(BUILDDIR)/ref_gl.$(SHLIBEXT) : $(REF_GL_OBJS) $(REF_GL_FXMESA_OBJS)
$(CC) $(CFLAGS) $(SHLIBLDFLAGS) -o $@ $(REF_GL_OBJS) $(REF_GL_FXMESA_OBJS) $(GLLDFLAGS)
$(BUILDDIR)/ref_glx.$(SHLIBEXT) : $(REF_GL_OBJS) $(REF_GL_GLX_OBJS)
$(CC) $(CFLAGS) $(SHLIBLDFLAGS) -o $@ $(REF_GL_OBJS) $(REF_GL_GLX_OBJS) $(GLXLDFLAGS)
$(BUILDDIR)/ref_gl/gl_draw.o : $(REF_GL_DIR)/gl_draw.c
$(DO_GL_SHLIB_CC)
$(BUILDDIR)/ref_gl/gl_image.o : $(REF_GL_DIR)/gl_image.c
$(DO_GL_SHLIB_CC)
$(BUILDDIR)/ref_gl/gl_light.o : $(REF_GL_DIR)/gl_light.c
$(DO_GL_SHLIB_CC)
$(BUILDDIR)/ref_gl/gl_mesh.o : $(REF_GL_DIR)/gl_mesh.c
$(DO_GL_SHLIB_CC)
$(BUILDDIR)/ref_gl/gl_model.o : $(REF_GL_DIR)/gl_model.c
$(DO_GL_SHLIB_CC)
$(BUILDDIR)/ref_gl/gl_rmain.o : $(REF_GL_DIR)/gl_rmain.c
$(DO_GL_SHLIB_CC)
$(BUILDDIR)/ref_gl/gl_rmisc.o : $(REF_GL_DIR)/gl_rmisc.c
$(DO_GL_SHLIB_CC)
$(BUILDDIR)/ref_gl/gl_rsurf.o : $(REF_GL_DIR)/gl_rsurf.c
$(DO_GL_SHLIB_CC)
$(BUILDDIR)/ref_gl/gl_warp.o : $(REF_GL_DIR)/gl_warp.c
$(DO_GL_SHLIB_CC)
$(BUILDDIR)/ref_gl/qgl_linux.o : $(LINUX_DIR)/qgl_linux.c
$(DO_GL_SHLIB_CC)
$(BUILDDIR)/ref_gl/gl_fxmesa.o : $(LINUX_DIR)/gl_fxmesa.c
$(DO_GL_SHLIB_CC)
$(BUILDDIR)/ref_gl/gl_glx.o : $(LINUX_DIR)/gl_glx.c
$(DO_GL_SHLIB_CC)
$(BUILDDIR)/ref_gl/rw_in_svgalib.o : $(LINUX_DIR)/rw_in_svgalib.c
$(DO_GL_SHLIB_CC)
$(BUILDDIR)/ref_gl/q_shared.o : $(GAME_DIR)/q_shared.c
$(CC) $(DEBUG_CFLAGS) $(SHLIBCFLAGS) $(GLCFLAGS) -o $@ -c $<
$(BUILDDIR)/ref_gl/q_shlinux.o : $(LINUX_DIR)/q_shlinux.c
$(DO_GL_SHLIB_O_CC)
$(BUILDDIR)/ref_gl/glob.o : $(LINUX_DIR)/glob.c
$(DO_GL_SHLIB_CC)
$(BUILDDIR)/ref_gl/xatrixtxrmap.o : $(REF_GL_DIR)/xatrixtxrmap.cpp
$(DO_GL_SHLIB_CPP)
#############################################################################
# RPM
#############################################################################
# Make RPMs. You need to be root to make this work
RPMROOT=/usr/src/RPM
RPM = rpm
RPMFLAGS = -bb
INSTALLDIR = /usr/local/games/kingpin
QUAKE2_DIR = /usr/local/games/quake2
DESTDIR= $(RPMDIR)/$(INSTALLDIR)
RPMDIR = /var/tmp/kingpin-$(VERSION_FN)
rpm: kingpin.spec
# touch $(RPMROOT)/SOURCES/kingpin-$(VERSION_FN).tar.gz
if [ ! -d archives ];then mkdir archives;fi
$(MAKE) copyfiles COPYDIR=$(DESTDIR)
cd $(MOUNT_DIR)
-mkdir $(RPMDIR)/etc
cp $(MOUNT_DIR)/linux/kingpin.conf $(RPMDIR)/etc/kingpin.conf
cp kingpin.spec $(RPMROOT)/SPECS/.
cd $(RPMROOT)/SPECS/.; $(RPM) $(RPMFLAGS) kingpin.spec
rm -rf $(RPMDIR)
mv $(RPMROOT)/RPMS/$(ARCH)/kingpin-$(VERSION_FN)-$(RPM_RELEASE).$(RPMARCH).rpm /pub
tar:
if [ ! -d archives ];then mkdir archives;fi
$(MAKE) copyfiles COPYDIR=$(RPMDIR)
cp $(MOUNT_DIR)/linux/kingpin.conf $(RPMDIR)/kingpin.conf
cd $(RPMDIR); sh $(MOUNT_DIR)/linux/fixperms.sh
cd $(RPMDIR); tar czvf kingpin-$(VERSION_FN)-$(ARCH)-linux2.0.tar.gz *
mv $(RPMDIR)/*.tar.gz /pub
rm -rf $(RPMDIR)
copyfiles:
-mkdirhier $(COPYDIR)
cp $(BUILD_RELEASE_DIR)/kingpin $(COPYDIR)/kingpin
strip $(COPYDIR)/kingpin
-mkdir $(COPYDIR)/main
-mkdir $(COPYDIR)/main/maps
for x in `find $(COPYDIR)/main -type d`; do chmod 755 $$x;done
for x in `find $(COPYDIR)/main -type f`; do chmod 644 $$x;done
chmod 1777 $(COPYDIR)/main
chmod 1777 $(COPYDIR)/main/maps
# Swap these over when debugging process is complete
# cp $(BUILD_DEBUG_DIR)/game$(ARCH).$(SHLIBEXT) $(COPYDIR)/main
cp $(BUILD_RELEASE_DIR)/game$(ARCH).$(SHLIBEXT) $(COPYDIR)/main
cp $(BUILD_RELEASE_DIR)/ref_gl.$(SHLIBEXT) $(COPYDIR)
cp $(BUILD_RELEASE_DIR)/ref_glx.$(SHLIBEXT) $(COPYDIR)
cp $(QUAKE2_DIR)/lib3dfxgl.so $(COPYDIR)
cp $(QUAKE2_DIR)/libTNTgl.so $(COPYDIR)
cp $(QUAKE2_DIR)/libMesaGL.so.2.6 $(COPYDIR)
cd $(COPYDIR); ln -sf libMesaGL.so.2.6 libMesaGL.so.2
cd $(COPYDIR); ln -sf libMesaGL.so.2 libMesaGL.so
cd $(COPYDIR); ln -sf libMesaGL.so libGL.so
cp $(MOUNT_DIR)/linux/README $(COPYDIR)
cp ccase $(COPYDIR)/main
cp $(MOUNT_DIR)/../patch12.txt $(COPYDIR)
cp $(MOUNT_DIR)/../main/server.cfg $(COPYDIR)/main
cp $(MOUNT_DIR)/../main/teammaps.lst $(COPYDIR)/main
cp $(MOUNT_DIR)/../main/maps/team_rival.bsp $(COPYDIR)/main/maps
cp $(MOUNT_DIR)/../main/maps/team_towers.bsp $(COPYDIR)/main/maps
kingpin.spec : $(MOUNT_DIR)/linux/kingpin.spec.sh makefile
sh $< $(VERSION_FN) $(RPM_RELEASE) $(ARCH) $(INSTALLDIR) > $@
tar_ded:
if [ ! -d archives ];then mkdir archives;fi
$(MAKE) copyfiles_ded COPYDIR=$(RPMDIR)
cp $(MOUNT_DIR)/linux/kingpin.conf $(RPMDIR)/kingpin.conf
cd $(RPMDIR); sh $(MOUNT_DIR)/linux/fixperms.sh
cd $(RPMDIR); tar czvf kpded-$(VERSION_FN)-$(ARCH)-linux2.0.tar.gz *
mv $(RPMDIR)/*.tar.gz /pub
rm -rf $(RPMDIR)
copyfiles_ded:
-mkdirhier $(COPYDIR)
cp $(BUILD_RELEASE_DIR)/kingpin $(COPYDIR)/kingpin
strip $(COPYDIR)/kingpin
-mkdir $(COPYDIR)/main
-mkdir $(COPYDIR)/main/maps
for x in `find $(COPYDIR)/main -type d`; do chmod 755 $$x;done
for x in `find $(COPYDIR)/main -type f`; do chmod 644 $$x;done
chmod 1777 $(COPYDIR)/main
chmod 1777 $(COPYDIR)/main/maps
# Swap these over when debugging process is complete
cp $(BUILD_DEBUG_DIR)/game$(ARCH).$(SHLIBEXT) $(COPYDIR)/main
# cp $(BUILD_RELEASE_DIR)/game$(ARCH).$(SHLIBEXT) $(COPYDIR)/main
cp $(MOUNT_DIR)/linux/README $(COPYDIR)
cp ccase $(COPYDIR)/main
cp $(MOUNT_DIR)/../patch12.txt $(COPYDIR)
cp $(MOUNT_DIR)/../main/server.cfg $(COPYDIR)/main
cp $(MOUNT_DIR)/../main/teammaps.lst $(COPYDIR)/main
cp $(MOUNT_DIR)/../main/maps/team_rival.bsp $(COPYDIR)/main/maps
cp $(MOUNT_DIR)/../main/maps/team_towers.bsp $(COPYDIR)/main/maps
#############################################################################
# MISC
#############################################################################
clean: clean-debug clean-release
clean-debug:
$(MAKE) clean2 BUILDDIR=$(BUILD_DEBUG_DIR) CFLAGS="$(DEBUG_CFLAGS)"
clean-release:
$(MAKE) clean2 BUILDDIR=$(BUILD_RELEASE_DIR) CFLAGS="$(DEBUG_CFLAGS)"
clean2:
-rm -f \
$(QUAKE2_OBJS) \
$(Q2DED_OBJS) \
$(QUAKE2_AS_OBJS) \
$(GAME_OBJS) \
$(CTF_OBJS) \
$(XATRIX_OBJS) \
$(ROGUE_OBJS) \
$(REF_SOFT_OBJS) \
$(REF_SOFT_SVGA_OBJS) \
$(REF_SOFT_X11_OBJS) \
$(REF_GL_OBJS) \
$(REF_GL_FXMESA_OBJS) \
$(REF_GL_GLX_OBJS)

186
gamesrc/M_BBOX.C Normal file
View file

@ -0,0 +1,186 @@
#include "g_local.h"
//
// M_BBOX.C
//
#define MAX_MDX_BBOX_ENTITIES 32 // theoretically, this should be MAX_MODEL_PARTS * MAX_MODELPART_OBJECTS
// but that would be too many, so we have to compromise
edict_t *mdx_bbox[MAX_MDX_BBOX_ENTITIES];
void MDX_Bbox_Init (void)
{
int i;
for (i = 0; i < (MAX_MDX_BBOX_ENTITIES); i++)
{
mdx_bbox[i] = G_Spawn();
mdx_bbox[i]->classname = "mdx_bbox";
mdx_bbox[i]->s.modelindex = 0;
mdx_bbox[i]->takedamage = DAMAGE_NO; // don't take damage from explosions, we'll do all damage testing manually
// mdx_bbox[i]->svflags |= SVF_MONSTER;
mdx_bbox[i]->solid |= SOLID_BBOX;
mdx_bbox[i]->flags |= FL_MDXBBOX;
}
}
int bbox_cnt;
trace_t MDX_HitCheck (edict_t *targ, edict_t *inflictor, edict_t *attacker, vec3_t dir, vec3_t point, vec3_t normal, int damage, int knockback, int dflags, int mod, vec3_t end)
{
trace_t tr;
vec3_t forward, right, up;
int sub_object;
int i;
vec3_t rmins, rmaxs; // rotated mins/maxs positions
vec3_t pmins, pmaxs; // perpendicular with world axis
vec3_t org;
bbox_cnt = 0;
AngleVectors (mdx_bbox[bbox_cnt]->s.angles, forward, right, up);
VectorCopy (targ->s.origin, org);
if (targ->cast_info.scale != 1.0)
{
VectorScale( forward, targ->cast_info.scale, forward );
VectorScale( right, targ->cast_info.scale, right );
VectorScale( up, targ->cast_info.scale, up );
org[2] -= 24 * (1.0 - targ->cast_info.scale);
}
for (i=0; i<MAX_MODEL_PARTS; i++)
{
sub_object = 0;
// Ridah, can't shoot the gun, so ignore it, or it'll prevent us from shooting the arm holding it
if (i == PART_GUN)
continue;
while (targ->s.model_parts[i].modelindex)
{
if (!targ->s.model_parts[i].object_bounds[sub_object])
break;
// Ridah, only check visible sub-objects
if (!(targ->s.model_parts[i].invisible_objects & (1<<sub_object)))
{
VectorCopy (org, mdx_bbox[bbox_cnt]->s.origin);
VectorCopy (targ->s.angles, mdx_bbox[bbox_cnt]->s.angles);
VectorCopy (g_objbnds[-1+targ->s.model_parts[i].object_bounds[sub_object]][targ->s.frame].mins, mdx_bbox[bbox_cnt]->mins);
VectorCopy (g_objbnds[-1+targ->s.model_parts[i].object_bounds[sub_object]][targ->s.frame].maxs, mdx_bbox[bbox_cnt]->maxs);
if (targ->cast_info.scale != 1.0)
{
VectorScale( mdx_bbox[bbox_cnt]->mins, targ->cast_info.scale, mdx_bbox[bbox_cnt]->mins );
VectorScale( mdx_bbox[bbox_cnt]->maxs, targ->cast_info.scale, mdx_bbox[bbox_cnt]->maxs );
}
VectorMA (mdx_bbox[bbox_cnt]->s.origin, ((mdx_bbox[bbox_cnt]->mins[0] + mdx_bbox[bbox_cnt]->maxs[0]) * 0.5), forward, mdx_bbox[bbox_cnt]->s.origin);
VectorMA (mdx_bbox[bbox_cnt]->s.origin, -((mdx_bbox[bbox_cnt]->mins[1] + mdx_bbox[bbox_cnt]->maxs[1]) * 0.5), right, mdx_bbox[bbox_cnt]->s.origin);
VectorMA (mdx_bbox[bbox_cnt]->s.origin, (mdx_bbox[bbox_cnt]->mins[2] + mdx_bbox[bbox_cnt]->maxs[2]) * 0.5, up, mdx_bbox[bbox_cnt]->s.origin);
// find rotated positions of mins/maxs, and then build the new min/max
VectorScale ( forward, mdx_bbox[bbox_cnt]->mins[0], rmins);
VectorMA (rmins, -mdx_bbox[bbox_cnt]->mins[1], right, rmins);
VectorMA (rmins, mdx_bbox[bbox_cnt]->mins[2], up, rmins);
VectorScale ( forward, mdx_bbox[bbox_cnt]->maxs[0], rmaxs);
VectorMA (rmaxs, -mdx_bbox[bbox_cnt]->maxs[1], right, rmaxs);
VectorMA (rmaxs, mdx_bbox[bbox_cnt]->maxs[2], up, rmaxs);
pmins[0] = (rmins[0] < rmaxs[0] ? rmins[0] : rmaxs[0]);
pmins[1] = (rmins[1] < rmaxs[1] ? rmins[1] : rmaxs[1]);
pmins[2] = (rmins[2] < rmaxs[2] ? rmins[2] : rmaxs[2]);
pmaxs[0] = (rmins[0] > rmaxs[0] ? rmins[0] : rmaxs[0]);
pmaxs[1] = (rmins[1] > rmaxs[1] ? rmins[1] : rmaxs[1]);
pmaxs[2] = (rmins[2] > rmaxs[2] ? rmins[2] : rmaxs[2]);
// now align the mins/maxs with the origin
mdx_bbox[bbox_cnt]->mins[0] = pmins[0] - (0.5*(pmaxs[0] + pmins[0]));
mdx_bbox[bbox_cnt]->mins[1] = pmins[1] - (0.5*(pmaxs[1] + pmins[1]));
mdx_bbox[bbox_cnt]->mins[2] = pmins[2] - (0.5*(pmaxs[2] + pmins[2]));
mdx_bbox[bbox_cnt]->maxs[0] = pmaxs[0] - (0.5*(pmaxs[0] + pmins[0]));
mdx_bbox[bbox_cnt]->maxs[1] = pmaxs[1] - (0.5*(pmaxs[1] + pmins[1]));
mdx_bbox[bbox_cnt]->maxs[2] = pmaxs[2] - (0.5*(pmaxs[2] + pmins[2]));
mdx_bbox[bbox_cnt]->count = i; // record model part
mdx_bbox[bbox_cnt]->dmg = sub_object; // record sub_object
if (damage > 0)
{
mdx_bbox[bbox_cnt]->solid = SOLID_BBOX;
gi.linkentity (mdx_bbox[bbox_cnt]);
}
bbox_cnt++;
}
sub_object++;
if (bbox_cnt > (MAX_MDX_BBOX_ENTITIES))
{
gi.error ("MDX_HitCheck: too many bbox parts: %d\n", bbox_cnt);
}
if (sub_object == MAX_MODELPART_OBJECTS)
break;
}
}
if (damage > 0)
{
tr = gi.trace (point, NULL, NULL, end, targ, MASK_SHOT );
MDX_Cleanup();
}
else
{
memset( &tr, 0, sizeof(trace_t));
}
/*
// just to see where the hit occured
{
edict_t *e;
e = G_Spawn();
e->s.modelindex = 98;
gi.linkentity(e);
VectorCopy (tr.endpos, e->s.origin);
e->think = G_FreeEdict;
e->nextthink = level.time + 1.0;
// Ridah, debugging, change the skin on this sub-object
if (tr.fraction < 1 && tr.ent->flags & FL_MDXBBOX)
if (++targ->s.model_parts[tr.ent->count].skinnum[tr.ent->dmg] > 4)
targ->s.model_parts[tr.ent->count].skinnum[tr.ent->dmg] = 0;
}
*/
return tr;
}
void MDX_Cleanup (void)
{
int i;
for (i = 0; i < (MAX_MDX_BBOX_ENTITIES); i++)
{
if (mdx_bbox[i]->solid)
{
gi.unlinkentity (mdx_bbox[i]);
mdx_bbox[i]->solid = 0;
}
}
}

1120
gamesrc/M_MOVE.C Normal file

File diff suppressed because it is too large Load diff

388
gamesrc/M_PLAYER.H Normal file
View file

@ -0,0 +1,388 @@
#define FRAME_tgun_rdy_01 0
#define FRAME_tgun_rdy_02 1
#define FRAME_tgun_rdy_03 2
#define FRAME_tgun_rdy_04 3
#define FRAME_tgun_rdy_05 4
#define FRAME_tgun_rdy_06 5
#define FRAME_tgun_rdy_07 6
#define FRAME_tgun_rdy_08 7
#define FRAME_tgun_rdy_09 8
#define FRAME_tgun_rdy_10 9
#define FRAME_tgun_rdy_11 10
#define FRAME_tgun_rdy_12 11
#define FRAME_tgun_rdy_13 12
#define FRAME_tgun_rdy_14 13
#define FRAME_tgun_rdy_15 14
#define FRAME_tgun_rdy_16 15
#define FRAME_tgun_rdy_17 16
#define FRAME_tgun_rdy_18 17
#define FRAME_tgun_rdy_19 18
#define FRAME_tgun_rdy_20 19
#define FRAME_tgun_rdy_21 20
#define FRAME_tgun_rdy_22 21
#define FRAME_tgun_rdy_23 22
#define FRAME_tgun_rdy_24 23
#define FRAME_tgun_rdy_25 24
#define FRAME_tgun_rdy_26 25
#define FRAME_tgun_rdy_27 26
#define FRAME_tgun_rdy_28 27
#define FRAME_tgun_rdy_29 28
#define FRAME_tgun_rdy_30 29
#define FRAME_tgun_rdy_31 30
#define FRAME_tgun_rdy_32 31
#define FRAME_tg_shoot_01 32
#define FRAME_tg_shoot_02 33
#define FRAME_tg_shoot_03 34
#define FRAME_tg_shoot_04 35
#define FRAME_tg_shoot_05 36
#define FRAME_tg_bird_01 37
#define FRAME_tg_bird_02 38
#define FRAME_tg_bird_03 39
#define FRAME_tg_bird_04 40
#define FRAME_tg_bird_05 41
#define FRAME_tg_bird_06 42
#define FRAME_tg_bird_07 43
#define FRAME_tg_bird_08 44
#define FRAME_tg_bird_09 45
#define FRAME_tg_bird_10 46
#define FRAME_tg_crch_grab_01 47
#define FRAME_tg_crch_grab_02 48
#define FRAME_tg_crch_grab_03 49
#define FRAME_tg_crch_grab_04 50
#define FRAME_tg_crch_grab_05 51
#define FRAME_tg_crch_grab_06 52
#define FRAME_tg_crch_grab_07 53
#define FRAME_tg_crch_grab_08 54
#define FRAME_tg_crch_grab_09 55
#define FRAME_tg_crch_grab_10 56
#define FRAME_tg_crch_grab_11 57
#define FRAME_tg_crch_grab_12 58
#define FRAME_tg_crch_grab_13 59
#define FRAME_tg_crch_grab_14 60
#define FRAME_tg_crch_grab_15 61
#define FRAME_tg_crch_grab_16 62
#define FRAME_tg_chin_flip_01 63
#define FRAME_tg_chin_flip_02 64
#define FRAME_tg_chin_flip_03 65
#define FRAME_tg_chin_flip_04 66
#define FRAME_tg_chin_flip_05 67
#define FRAME_tg_chin_flip_06 68
#define FRAME_tg_chin_flip_07 69
#define FRAME_tg_chin_flip_08 70
#define FRAME_tg_chin_flip_09 71
#define FRAME_tg_chin_flip_10 72
#define FRAME_tg_chin_flip_11 73
#define FRAME_tg_chin_flip_12 74
#define FRAME_tg_chin_flip_13 75
#define FRAME_tg_chin_flip_14 76
#define FRAME_tg_chin_flip_15 77
#define FRAME_1pstl_rdy_01 78
#define FRAME_1pstl_rdy_02 79
#define FRAME_1pstl_rdy_03 80
#define FRAME_1pstl_rdy_04 81
#define FRAME_1pstl_rdy_05 82
#define FRAME_1pstl_rdy_06 83
#define FRAME_1pstl_rdy_07 84
#define FRAME_1pstl_rdy_08 85
#define FRAME_1pstl_rdy_09 86
#define FRAME_1pstl_rdy_10 87
#define FRAME_1pstl_rdy_11 88
#define FRAME_1pstl_rdy_12 89
#define FRAME_1pstl_rdy_13 90
#define FRAME_1pstl_rdy_14 91
#define FRAME_1pstl_rdy_15 92
#define FRAME_1pstl_rdy_16 93
#define FRAME_1pstl_rdy_17 94
#define FRAME_1pstl_rdy_18 95
#define FRAME_1pstl_rdy_19 96
#define FRAME_1pstl_rdy_20 97
#define FRAME_1pstl_rdy_21 98
#define FRAME_1pstl_rdy_22 99
#define FRAME_1pstl_rdy_23 100
#define FRAME_p_std_shoot_01 101
#define FRAME_p_std_shoot_02 102
#define FRAME_p_std_shoot_03 103
#define FRAME_p_std_shoot_04 104
#define FRAME_walk_gdown_01 105
#define FRAME_walk_gdown_02 106
#define FRAME_walk_gdown_03 107
#define FRAME_walk_gdown_04 108
#define FRAME_walk_gdown_05 109
#define FRAME_walk_gdown_06 110
#define FRAME_walk_gdown_07 111
#define FRAME_walk_gdown_08 112
#define FRAME_walk_gdown_09 113
#define FRAME_walk_gdown_10 114
#define FRAME_walk_tg_sht_01 115
#define FRAME_walk_tg_sht_02 116
#define FRAME_walk_tg_sht_03 117
#define FRAME_walk_tg_sht_04 118
#define FRAME_walk_tg_sht_05 119
#define FRAME_walk_tg_sht_06 120
#define FRAME_walk_tg_sht_07 121
#define FRAME_walk_tg_sht_08 122
#define FRAME_walk_tg_sht_09 123
#define FRAME_walk_tg_sht_10 124
#define FRAME_run_tg_sht_01 125
#define FRAME_run_tg_sht_02 126
#define FRAME_run_tg_sht_03 127
#define FRAME_run_tg_sht_04 128
#define FRAME_run_tg_sht_05 129
#define FRAME_run_tg_sht_06 130
#define FRAME_rsd_tg_run_01 131
#define FRAME_rsd_tg_run_02 132
#define FRAME_rsd_tg_run_03 133
#define FRAME_rsd_tg_run_04 134
#define FRAME_rsd_tg_run_05 135
#define FRAME_rsd_tg_run_06 136
#define FRAME_lsd_tg_run_01 137
#define FRAME_lsd_tg_run_02 138
#define FRAME_lsd_tg_run_03 139
#define FRAME_lsd_tg_run_04 140
#define FRAME_lsd_tg_run_05 141
#define FRAME_lsd_tg_run_06 142
#define FRAME_p_walk_sht_01 143
#define FRAME_p_walk_sht_02 144
#define FRAME_p_walk_sht_03 145
#define FRAME_p_walk_sht_04 146
#define FRAME_p_walk_sht_05 147
#define FRAME_p_walk_sht_06 148
#define FRAME_p_walk_sht_07 149
#define FRAME_p_walk_sht_08 150
#define FRAME_p_walk_sht_09 151
#define FRAME_p_walk_sht_10 152
#define FRAME_p_run_shoot_01 153
#define FRAME_p_run_shoot_02 154
#define FRAME_p_run_shoot_03 155
#define FRAME_p_run_shoot_04 156
#define FRAME_p_run_shoot_05 157
#define FRAME_p_run_shoot_06 158
#define FRAME_p_rside_run_01 159
#define FRAME_p_rside_run_02 160
#define FRAME_p_rside_run_03 161
#define FRAME_p_rside_run_04 162
#define FRAME_p_rside_run_05 163
#define FRAME_p_rside_run_06 164
#define FRAME_p_lside_run_01 165
#define FRAME_p_lside_run_02 166
#define FRAME_p_lside_run_03 167
#define FRAME_p_lside_run_04 168
#define FRAME_p_lside_run_05 169
#define FRAME_p_lside_run_06 170
#define FRAME_melee_rdy_01 171
#define FRAME_melee_rdy_02 172
#define FRAME_melee_rdy_03 173
#define FRAME_melee_rdy_04 174
#define FRAME_melee_rdy_05 175
#define FRAME_melee_rdy_06 176
#define FRAME_melee_rdy_07 177
#define FRAME_melee_rdy_08 178
#define FRAME_melee_rdy_09 179
#define FRAME_melee_rdy_10 180
#define FRAME_melee_rdy_11 181
#define FRAME_melee_rdy_12 182
#define FRAME_melee_rdy_13 183
#define FRAME_melee_rdy_14 184
#define FRAME_melee_rdy_15 185
#define FRAME_melee_rdy_16 186
#define FRAME_melee_rdy_17 187
#define FRAME_melee_rdy_18 188
#define FRAME_melee_rdy_19 189
#define FRAME_melee3_01 190
#define FRAME_melee3_02 191
#define FRAME_melee3_03 192
#define FRAME_melee3_04 193
#define FRAME_melee3_05 194
#define FRAME_melee3_06 195
#define FRAME_melee3_07 196
#define FRAME_melee4_01 197
#define FRAME_melee4_02 198
#define FRAME_melee4_03 199
#define FRAME_melee4_04 200
#define FRAME_melee4_05 201
#define FRAME_melee4_06 202
#define FRAME_run_melee_01 203
#define FRAME_run_melee_02 204
#define FRAME_run_melee_03 205
#define FRAME_run_melee_04 206
#define FRAME_run_melee_05 207
#define FRAME_run_melee_06 208
#define FRAME_run_gun_dn_01 209
#define FRAME_run_gun_dn_02 210
#define FRAME_run_gun_dn_03 211
#define FRAME_run_gun_dn_04 212
#define FRAME_run_gun_dn_05 213
#define FRAME_run_gun_dn_06 214
#define FRAME_jump_01 215
#define FRAME_jump_02 216
#define FRAME_jump_03 217
#define FRAME_jump_04 218
#define FRAME_jump_05 219
#define FRAME_jump_06 220
#define FRAME_jump_07 221
#define FRAME_clmb_loop_01 222
#define FRAME_clmb_loop_02 223
#define FRAME_clmb_loop_03 224
#define FRAME_clmb_loop_04 225
#define FRAME_clmb_loop_05 226
#define FRAME_clmb_loop_06 227
#define FRAME_clmb_loop_07 228
#define FRAME_clmb_loop_08 229
#define FRAME_clmb_loop_09 230
#define FRAME_death1_01 231
#define FRAME_death1_02 232
#define FRAME_death1_03 233
#define FRAME_death1_04 234
#define FRAME_death1_05 235
#define FRAME_death1_06 236
#define FRAME_death1_07 237
#define FRAME_death1_08 238
#define FRAME_death1_09 239
#define FRAME_death1_10 240
#define FRAME_death1_11 241
#define FRAME_death1_12 242
#define FRAME_death1_13 243
#define FRAME_death1_14 244
#define FRAME_death1_15 245
#define FRAME_death1_16 246
#define FRAME_death1_17 247
#define FRAME_death1_18 248
#define FRAME_death1_19 249
#define FRAME_death2_01 250
#define FRAME_death2_02 251
#define FRAME_death2_03 252
#define FRAME_death2_04 253
#define FRAME_death2_05 254
#define FRAME_death2_06 255
#define FRAME_death2_07 256
#define FRAME_death2_08 257
#define FRAME_death2_09 258
#define FRAME_death2_10 259
#define FRAME_death2_11 260
#define FRAME_death2_12 261
#define FRAME_death2_13 262
#define FRAME_death2_14 263
#define FRAME_death2_15 264
#define FRAME_death2_16 265
#define FRAME_death3_01 266
#define FRAME_death3_02 267
#define FRAME_death3_03 268
#define FRAME_death3_04 269
#define FRAME_death3_05 270
#define FRAME_death3_06 271
#define FRAME_death3_07 272
#define FRAME_death3_08 273
#define FRAME_death3_09 274
#define FRAME_death3_10 275
#define FRAME_death3_11 276
#define FRAME_death3_12 277
#define FRAME_death3_13 278
#define FRAME_death3_14 279
#define FRAME_death3_15 280
#define FRAME_death3_16 281
#define FRAME_death3_17 282
#define FRAME_death3_18 283
#define FRAME_death3_19 284
#define FRAME_death3_20 285
#define FRAME_death3_21 286
#define FRAME_death3_22 287
#define FRAME_death3_23 288
#define FRAME_death3_24 289
#define FRAME_death3_25 290
#define FRAME_death3_26 291
#define FRAME_death3_27 292
#define FRAME_death3_28 293
#define FRAME_death4_01 294
#define FRAME_death4_02 295
#define FRAME_death4_03 296
#define FRAME_death4_04 297
#define FRAME_death4_05 298
#define FRAME_death4_06 299
#define FRAME_death4_07 300
#define FRAME_death4_08 301
#define FRAME_death4_09 302
#define FRAME_death4_10 303
#define FRAME_death4_11 304
#define FRAME_death4_12 305
#define FRAME_death4_13 306
#define FRAME_tg_crch_rdy_01 307
#define FRAME_tg_crch_rdy_02 308
#define FRAME_tg_crch_rdy_03 309
#define FRAME_tg_crch_rdy_04 310
#define FRAME_tg_crch_rdy_05 311
#define FRAME_tg_crch_rdy_06 312
#define FRAME_tg_crch_rdy_07 313
#define FRAME_tg_crch_rdy_08 314
#define FRAME_tg_crch_rdy_09 315
#define FRAME_tg_crch_rdy_10 316
#define FRAME_tg_crch_rdy_11 317
#define FRAME_tg_crch_rdy_12 318
#define FRAME_tg_crch_rdy_13 319
#define FRAME_tg_crch_rdy_14 320
#define FRAME_tg_crch_rdy_15 321
#define FRAME_tg_crch_rdy_16 322
#define FRAME_tg_crch_rdy_17 323
#define FRAME_tg_crch_rdy_18 324
#define FRAME_tg_crch_rdy_19 325
#define FRAME_tg_crch_rdy_20 326
#define FRAME_tg_crch_rdy_21 327
#define FRAME_tg_crch_rdy_22 328
#define FRAME_tg_crch_rdy_23 329
#define FRAME_tg_crch_rdy_24 330
#define FRAME_tg_crch_rdy_25 331
#define FRAME_tg_crch_rdy_26 332
#define FRAME_tg_crch_rdy_27 333
#define FRAME_crouch_shoot_01 334
#define FRAME_crouch_shoot_02 335
#define FRAME_crouch_shoot_03 336
#define FRAME_crouch_shoot_04 337
#define FRAME_crouch_shoot_05 338
#define FRAME_crouch_shoot_06 339
#define FRAME_crch_shuf_01 340
#define FRAME_crch_shuf_02 341
#define FRAME_crch_shuf_03 342
#define FRAME_crch_shuf_04 343
#define FRAME_crch_shuf_05 344
#define FRAME_1p_crch_rdy_01 345
#define FRAME_1p_crch_rdy_02 346
#define FRAME_1p_crch_rdy_03 347
#define FRAME_1p_crch_rdy_04 348
#define FRAME_1p_crch_rdy_05 349
#define FRAME_1p_crch_rdy_06 350
#define FRAME_1p_crch_rdy_07 351
#define FRAME_1p_crch_rdy_08 352
#define FRAME_1p_crch_rdy_09 353
#define FRAME_1p_crch_rdy_10 354
#define FRAME_1p_crch_rdy_11 355
#define FRAME_1p_crch_rdy_12 356
#define FRAME_1p_crch_rdy_13 357
#define FRAME_1p_crch_rdy_14 358
#define FRAME_1p_crch_rdy_15 359
#define FRAME_1p_crch_rdy_16 360
#define FRAME_1p_crch_rdy_17 361
#define FRAME_1p_crch_rdy_18 362
#define FRAME_p_crch_sht_01 363
#define FRAME_p_crch_sht_02 364
#define FRAME_p_crch_sht_03 365
#define FRAME_p_crch_sht_04 366
#define FRAME_p_crch_sht_05 367
#define FRAME_p_crch_walk_01 368
#define FRAME_p_crch_walk_02 369
#define FRAME_p_crch_walk_03 370
#define FRAME_p_crch_walk_04 371
#define FRAME_p_crch_walk_05 372
#define FRAME_p_crch_walk_06 373
#define FRAME_crouch_death_01 374
#define FRAME_crouch_death_02 375
#define FRAME_crouch_death_03 376
#define FRAME_crouch_death_04 377
#define FRAME_crouch_death_05 378
#define FRAME_crouch_death_06 379
#define FRAME_crouch_death_07 380
#define FRAME_crouch_death_08 381
#define FRAME_crouch_death_09 382
#define FRAME_crouch_death_10 383
#define FRAME_crouch_death_11 384
#define FRAME_crouch_death_12 385
#define MODEL_SCALE 1.000000

BIN
gamesrc/NavLib/NavLib.lib Normal file

Binary file not shown.

1925
gamesrc/P_HUD.C Normal file

File diff suppressed because it is too large Load diff

127
gamesrc/P_TRAIL.C Normal file
View file

@ -0,0 +1,127 @@
#include "g_local.h"
/*
==============================================================================
PLAYER TRAIL
==============================================================================
This is a circular list containing the a list of points of where
the player has been recently. It is used by monsters for pursuit.
.origin the spot
.owner forward link
.aiment backward link
*/
#define TRAIL_LENGTH 8
edict_t *trail[TRAIL_LENGTH];
int trail_head;
qboolean trail_active = false;
#define NEXT(n) (((n) + 1) & (TRAIL_LENGTH - 1))
#define PREV(n) (((n) - 1) & (TRAIL_LENGTH - 1))
void PlayerTrail_Init (void)
{
int n;
if (deathmatch->value /* FIXME || coop */)
return;
for (n = 0; n < TRAIL_LENGTH; n++)
{
trail[n] = G_Spawn();
trail[n]->classname = "player_trail";
}
trail_head = 0;
trail_active = true;
}
void PlayerTrail_Add (vec3_t spot)
{
vec3_t temp;
if (!trail_active)
return;
VectorCopy (spot, trail[trail_head]->s.origin);
trail[trail_head]->timestamp = level.time;
VectorSubtract (spot, trail[PREV(trail_head)]->s.origin, temp);
trail[trail_head]->s.angles[1] = vectoyaw (temp);
trail_head = NEXT(trail_head);
}
void PlayerTrail_New (vec3_t spot)
{
if (!trail_active)
return;
PlayerTrail_Init ();
PlayerTrail_Add (spot);
}
edict_t *PlayerTrail_PickFirst (edict_t *self)
{
int marker;
int n;
if (!trail_active)
return NULL;
for (marker = trail_head, n = TRAIL_LENGTH; n; n--)
{
if(trail[marker]->timestamp <= self->cast_info.trail_time)
marker = NEXT(marker);
else
break;
}
if (visible(self, trail[marker]))
{
return trail[marker];
}
if (visible(self, trail[PREV(marker)]))
{
return trail[PREV(marker)];
}
return trail[marker];
}
edict_t *PlayerTrail_PickNext (edict_t *self)
{
int marker;
int n;
if (!trail_active)
return NULL;
for (marker = trail_head, n = TRAIL_LENGTH; n; n--)
{
if(trail[marker]->timestamp <= self->cast_info.trail_time)
marker = NEXT(marker);
else
break;
}
return trail[marker];
}
edict_t *PlayerTrail_LastSpot (void)
{
return trail[PREV(trail_head)];
}

1904
gamesrc/P_VIEW.C Normal file

File diff suppressed because it is too large Load diff

3235
gamesrc/P_WEAPON.C Normal file

File diff suppressed because it is too large Load diff

3186
gamesrc/P_client.c Normal file

File diff suppressed because it is too large Load diff

1564
gamesrc/Q_SHARED.C Normal file

File diff suppressed because it is too large Load diff

1460
gamesrc/Q_SHARED.H Normal file

File diff suppressed because it is too large Load diff

687
gamesrc/VEHICLES.C Normal file
View file

@ -0,0 +1,687 @@
//======================================================================
// Vehicle Physics/Simulation
#include "g_local.h"
#include "veh_defs.h"
/*
Veh_ProcessFrame
Handles everything from input acceleration/braking, through world physics and dynamics.
*/
void Veh_ProcessFrame( edict_t *ent, usercmd_t *ucmd, pmove_t *pm )
{
vehicle_t *vehicle;
// find the vehicle structure
if (ent->vehicle_index)
{
vehicle = &global_vehicles[ent->vehicle_index - 1];
}
else // need to assign them one
{
int i;
for (i=0; i< MAX_VEHICLES; i++)
{
if (!global_vehicles[i].driver)
{
vehicle = &global_vehicles[i];
ent->vehicle_index = i + 1;
vehicle->driver = ent;
// this will eventually be setup inside the map, but for now just do it here
vehicle->def = &vehicle_defines[0];
Veh_InitVehicle( vehicle );
}
}
}
VectorCopy( vehicle->origin, vehicle->oldorigin );
VectorCopy( vehicle->angles, vehicle->oldangles );
// Process the controls
Veh_ProcessControls( vehicle, ucmd );
// Set steering avelocity
Veh_SetSteeringAngleVelocity( vehicle );
// Do Angular Velocities
Veh_PerformAngleVelocity( vehicle, 0.001 * ((float)ucmd->msec), pm );
// Move the vehicle according to it's velocity
Veh_PerformMove( vehicle, pm );
// Examine movement, adjusting velocity accordingly
// Set the position of the owner to the middle of the front and rear positions, with angles:
// PITCH: according to front/rear positions
// ROLL: use interpolated roll angles from downward traces at each wheel(??)
// Show the vehicle
Veh_PositionModels( vehicle );
}
/*
==================
Veh_InitVehicle
Initializes a vehicle ready for placing into the game
==================
*/
void Veh_InitVehicle ( vehicle_t *vehicle )
{
vehicle->front_traction = 1.0;
vehicle->rear_traction = 1.0;
vehicle->front_weight_ratio = 0.5;
vehicle->front_onground = true;
vehicle->rear_onground = true;
VectorClear( vehicle->velocity );
VectorClear( vehicle->avelocity );
VectorCopy( vehicle->driver->s.origin, vehicle->origin );
VectorCopy( vehicle->driver->s.angles, vehicle->angles );
vehicle->gear = 1; // neutral
vehicle->rpm = 0;
vehicle->throttle = 0;
vehicle->steer_yaw = 0;
vehicle->fl = G_Spawn();
vehicle->fl->s.modelindex = gi.modelindex( vehicle->def->wheel_model );
vehicle->fr = G_Spawn();
vehicle->fr->s.modelindex = gi.modelindex( vehicle->def->wheel_model );
vehicle->rl = G_Spawn();
vehicle->rl->s.modelindex = gi.modelindex( vehicle->def->wheel_model );
vehicle->rr = G_Spawn();
vehicle->rr->s.modelindex = gi.modelindex( vehicle->def->wheel_model );
}
/*
=====================
Veh_ProcessControls
Process all inputs and adjust velocities and traction levels
=====================
*/
void Veh_ProcessControls ( vehicle_t *vehicle, usercmd_t *ucmd )
{
#define THROTTLE_ACCELERATION 20000.0 // increase this amount per second
#define THROTTLE_DECCELERATION 20000.0
#define STEERING_ACCELERATION 75.0
float throttle_add, throttle_ideal, throttle_max, throttle_rate;
float steering_ideal, steering_add, steering_max, steer_rate;
vec3_t forward, unit_vel;
float frametime;
float current_speed;
float new_rpm;
float wheel_torque, max_wheel_torque;
float ideal_speed, rear_speed;
float accel_force = 0; // force applied by ground
float accel_speed = 0; // transferred velocity increase to vehicle
AngleVectors( vehicle->angles, forward, NULL, NULL );
if (vehicle->velocity[0] || vehicle->velocity[1] || vehicle->velocity[2])
{
current_speed = VectorNormalize2( vehicle->velocity, unit_vel );
}
else
{
VectorCopy( forward, unit_vel );
current_speed = 0;
}
frametime = (0.001 * ucmd->msec);
// adjust throttle
throttle_ideal = ((float)(ucmd->forwardmove) / 400.0) * (THROTTLE_MAX - IDLE_THROTTLE) + IDLE_THROTTLE;
if (throttle_ideal < 0)
throttle_ideal = 0; // TODO: this would be brakes
throttle_add = throttle_ideal - vehicle->throttle;
if ((throttle_add < 0) && (ucmd->forwardmove >= 0) && (vehicle->gear == 1))
throttle_rate = THROTTLE_DECCELERATION;
else
throttle_rate = THROTTLE_ACCELERATION;
if (fabs( throttle_add ) > (throttle_max = (throttle_rate * frametime) ) )
{
if (throttle_add < 0)
throttle_add = -throttle_max;
else
throttle_add = throttle_max;
}
vehicle->throttle = vehicle->throttle + throttle_add;
Veh_Debug( "Thr=%4i ", (int)vehicle->throttle );
// adjust steering
steering_ideal = -((float)(ucmd->sidemove) / 400.0) * vehicle->def->max_steer * (0.5 + 0.5 * ((VEH_MAX_SPEED - current_speed) / VEH_MAX_SPEED));
// turn faster if changing directions
steer_rate = STEERING_ACCELERATION;
if (steering_ideal == 0)
steer_rate *= 2;
if (steering_ideal < 0)
{
if (vehicle->steer_yaw > 0)
steer_rate *= 2;
}
else
{
if (vehicle->steer_yaw < 0)
steer_rate *= 2;
}
steering_add = steering_ideal - vehicle->steer_yaw;
if (fabs( steering_add ) > (steering_max = (steer_rate * frametime) ) )
{
if (steering_add < 0)
steering_add = -steering_max;
else
steering_add = steering_max;
}
vehicle->steer_yaw += steering_add;
Veh_Debug( "Str=%2i ", (int)vehicle->steer_yaw );
Veh_Debug( "G=%s ", vehicle->def->gearbox->gears[vehicle->gear].name );
// Do engine acceleration
// if (vehicle->throttle > vehicle->rpm)
{
// Get the new engine RPM, which is effected by the current throttle, and drivetrain resistance
if (vehicle->def->gearbox->gears[vehicle->gear].ratio) // current gear isn't neutral
{
// Get the "force" applied by the acceleration on the drivetrain
// We use this to determine whether or not the rear wheels will hold traction
// get the amount of torque applied at the rear wheels
wheel_torque = Veh_WheelTorqueAtRPM( vehicle, vehicle->throttle - vehicle->rpm );
Veh_Debug( "Tw=%i ", (int)wheel_torque );
// get the maximum amount of torque the rear wheels will take
max_wheel_torque =
(1.0 - vehicle->front_weight_ratio)
* (vehicle->def->weight * KG_TO_LBS)
* ((vehicle->rear_traction + 1.0) / 2.0);
Veh_Debug( "TwM=%i ", (int)max_wheel_torque );
// get the speed we should be doing at the new rpm
ideal_speed = Veh_SpeedAtRPM( vehicle, vehicle->throttle );
Veh_Debug( "iSpd=%i ", (int)ideal_speed );
rear_speed = current_speed;
if (rear_speed > 0)
// rear_speed *= ((fabs(DotProduct( forward, unit_vel )) + 1.0) / 2.0);
rear_speed *= DotProduct( forward, unit_vel );
Veh_Debug( "cSpd=%i ", (int)rear_speed );
if ( ((ideal_speed > 0) && (ideal_speed > rear_speed))
|| ((ideal_speed < 0) && (ideal_speed < rear_speed)))
{
if (wheel_torque > max_wheel_torque)
{
vehicle->rear_traction -= (wheel_torque / max_wheel_torque) * frametime;
}
else if (vehicle->rear_traction < 1.0)
{
vehicle->rear_traction += ((max_wheel_torque - wheel_torque) / max_wheel_torque) * frametime * 7.0;
if (vehicle->rear_traction > 1.0)
vehicle->rear_traction = 1.0;
}
// cap min traction (TODO: use current surface as factor of minimum)
if (vehicle->rear_traction < 0.1) // HACK
vehicle->rear_traction = 0.1;
// get the amount of force applied to the vehicle at the new throttle
accel_force =
(wheel_torque) * LBS_TO_KG
* FT_TO_CM * CM_TO_UNITS
* vehicle->rear_traction
* 2.0 // HACK, fudge factor
/ frametime; // convert to force per second
if (ideal_speed < 0)
accel_force *= -1;
}
else // slowing down
{
// if we're going faster than the maximum revs of the engine will take us
if ( Veh_SpeedAtRPM( vehicle, THROTTLE_MAX ) < rear_speed )
{
// lose traction, but still grip
vehicle->rear_traction -= 2 * frametime; // ???
// cap min traction (TODO: use current surface as factor of minimum)
if (vehicle->rear_traction < 0.5) // HACK
vehicle->rear_traction = 0.5;
}
else if (vehicle->rear_traction < 1.0)
{
// regain traction
vehicle->rear_traction += 5 * frametime; // ???
if (vehicle->rear_traction > 1.0)
vehicle->rear_traction = 1.0;
}
// Decompression braking!
wheel_torque = Veh_WheelTorqueAtRPM( vehicle, vehicle->rpm );
accel_force =
(wheel_torque) * LBS_TO_KG
* -0.5
* FT_TO_CM * CM_TO_UNITS
* vehicle->rear_traction
/ frametime; // convert to force per second
}
Veh_Debug( "Tr=%1.2f ", vehicle->rear_traction );
Veh_Debug( "Af=%i ", (int)accel_force );
accel_speed = accel_force / vehicle->def->weight;
// factor in rolling resistance
accel_speed -= current_speed * 0.0007656;
// factor in drag resistance
accel_speed -= (0.5 * 0.3 * 20 * 0.00025 * ((current_speed*UNITS_TO_CM*CM_TO_FT) * (current_speed*UNITS_TO_CM*CM_TO_FT))) * FT_TO_CM * CM_TO_UNITS
* 0.05; // Fudge factor
Veh_Debug( "As=%i ", (int)accel_speed );
}
}
// Calculate the transferred velocity to the vehicle
VectorMA( vehicle->velocity, accel_speed * frametime, forward, vehicle->velocity );
current_speed = VectorLength( vehicle->velocity );
Veh_Debug( "Spd=%i ", (int)current_speed );
// get the new engine RPM
if (vehicle->gear != 1)
{
rear_speed = current_speed;
if (rear_speed > 0)
rear_speed *= ((fabs(DotProduct( forward, unit_vel )) + 1.0) / 2.0);
new_rpm = Veh_RPMatSpeed( vehicle, rear_speed );
if (new_rpm > THROTTLE_MAX)
new_rpm = THROTTLE_MAX;
if (vehicle->rear_traction >= 1)
{
vehicle->rpm = new_rpm;
if (vehicle->rear_traction > 1.0)
vehicle->rear_traction = 1.0;
}
else // use new_rpm, but adjust for throttle
{
vehicle->rpm = new_rpm + (vehicle->throttle - new_rpm) * (1.0 - vehicle->rear_traction);
}
}
else
{
vehicle->rpm = vehicle->throttle;
}
Veh_Debug( "Erpm=%4.0f ", vehicle->rpm );
Veh_Debug( "\n" );
}
/*
=================
Veh_Debug
=================
*/
void Veh_Debug( char *fmt, ...)
{
int len;
va_list argptr;
char bigbuffer[0x10000];
va_start (argptr,fmt);
len = vsprintf (bigbuffer,fmt,argptr);
va_end (argptr);
gi.dprintf( bigbuffer );
}
/*
=================
Veh_SpeedAtRPM
=================
*/
float Veh_SpeedAtRPM( vehicle_t *veh, float rpm )
{
float speed;
speed =
(rpm)
* (1.0 / veh->def->gearbox->gears[veh->gear].ratio)
* (1.0 / veh->def->diff_ratio)
* (M_PI * veh->def->wheels->radius * 2 * CM_TO_UNITS)
* MIN_PER_SEC;
return speed;
}
/*
=================
Veh_RPMatSpeed
=================
*/
float Veh_RPMatSpeed( vehicle_t *veh, float speed )
{
float rpm;
rpm =
(speed)
* (veh->def->gearbox->gears[veh->gear].ratio)
* (veh->def->diff_ratio)
* (1.0 / (M_PI * veh->def->wheels->radius * 2 * CM_TO_UNITS))
* SEC_PER_MIN;
if (rpm < 0) // reversing
rpm = -rpm;
return rpm;
}
/*
=================
Veh_SpeedAtRPM
=================
*/
float Veh_WheelTorqueAtRPM( vehicle_t *veh, float rpm )
{
float torque;
torque =
(veh->def->engine_power * 1.5) // translate roughly to foot-pounds of engine torque
* (rpm / THROTTLE_MAX)
* (veh->def->gearbox->gears[veh->gear].ratio)
* (veh->def->gearbox->gears[veh->gear].ratio) // Fudge factor
* (veh->def->diff_ratio)
* (1.0 / (veh->def->wheels->radius * CM_TO_FT));
return torque;
}
/*
=================
Veh_PerformMove
=================
*/
void Veh_PerformMove( vehicle_t *vehicle, pmove_t *pm )
{
int i;
gclient_t *client;
edict_t *ent;
ent = vehicle->driver;
client = vehicle->driver->client;
for (i=0 ; i<3 ; i++)
{
pm->s.origin[i] = vehicle->origin[i]*8;
pm->s.velocity[i] = vehicle->velocity[i]*8;
}
// perform a pmove
gi.Pmove (pm);
// save results of pmove
client->ps.pmove = pm->s;
client->old_pmove = pm->s;
for (i=0 ; i<3 ; i++)
{
vehicle->origin[i] = pm->s.origin[i]*0.125;
vehicle->velocity[i] = pm->s.velocity[i]*0.125;
}
// VectorCopy (pm->mins, ent->mins);
// VectorCopy (pm->maxs, ent->maxs);
// client->resp.cmd_angles[0] = SHORT2ANGLE(ucmd->angles[0]);
// client->resp.cmd_angles[1] = SHORT2ANGLE(ucmd->angles[1]);
// client->resp.cmd_angles[2] = SHORT2ANGLE(ucmd->angles[2]);
VectorCopy( vehicle->angles, client->ps.viewangles );
VectorCopy( vehicle->angles, client->v_angle );
client->ps.pmove.pm_type = PM_FREEZE;
ent->viewheight = pm->viewheight;
ent->waterlevel = pm->waterlevel;
ent->watertype = pm->watertype;
ent->groundentity = pm->groundentity;
if (pm->groundentity)
ent->groundentity_linkcount = pm->groundentity->linkcount;
VectorCopy( vehicle->origin, ent->s.origin );
}
void Veh_PerformAngleVelocity( vehicle_t *vehicle, float frametime, pmove_t *pm )
{
float speed;
vec3_t unitvel, forward, up;
VectorMA( vehicle->angles, frametime, vehicle->avelocity, vehicle->angles );
// adjust velocity
if (vehicle->velocity[0] || vehicle->velocity[1] || vehicle->velocity[2])
{
AngleVectors( vehicle->angles, forward, NULL, up );
speed = VectorNormalize2( vehicle->velocity, unitvel );
VectorScale( forward, speed * (vehicle->rear_traction + vehicle->front_traction) / 2.0, vehicle->velocity );
VectorMA( vehicle->velocity, speed * (1.0 - ((vehicle->rear_traction + vehicle->front_traction) / 2.0)), unitvel, vehicle->velocity );
}
// According to traction levels, we should move the CG (center of gravity), such that:
//
// * Under FULL traction of the REAR wheels, rotate about the rear axle center
// * Under ZERO traction of the REAR wheels, rotate about the front axle center
// Just calculate this as a movement of the center of the vehicle / second, and add to velocity
if (vehicle->avelocity[YAW])
{
vec3_t dst, pnt, rear_pnt, move;
vec3_t velback;
VectorMA( vehicle->origin, (-vehicle->def->wheelspan_length*0.5 + (vehicle->def->wheelspan_length * (1.0 - vehicle->rear_traction) * (vehicle->front_traction*0.5 + 0.5))), forward, rear_pnt );
VectorSubtract( vehicle->origin, rear_pnt, pnt );
RotatePointAroundVector( dst, up, pnt, vehicle->avelocity[YAW] * frametime );
VectorSubtract( dst, pnt, move );
// convert to per second, since it'll get converted back in Pmove();
VectorScale( move, 0.3 / frametime, move ); // 0.3 is a HACK, should be 1.0
// save the velocity
VectorCopy( vehicle->velocity, velback );
VectorCopy( move, vehicle->velocity );
// move the vehicle to account for the change in CG
Veh_PerformMove( vehicle, pm );
// set the velocity back
VectorCopy( velback, vehicle->velocity );
Veh_Debug( "YawAdjust=%3.0f ", VectorLength(move) );
}
}
void Veh_SetSteeringAngleVelocity( vehicle_t *vehicle )
{
float speed, dot, yaw_change;
vec3_t forward, unitvel;
AngleVectors( vehicle->angles, forward, NULL, NULL );
if (vehicle->velocity[0] || vehicle->velocity[1] || vehicle->velocity[2])
{
speed = VectorNormalize2( vehicle->velocity, unitvel );
yaw_change =
( (vehicle->steer_yaw)
* (speed / (vehicle->def->wheelspan_length * CM_TO_UNITS))
* (vehicle->front_traction))
- vehicle->avelocity[YAW];
dot = DotProduct( forward, unitvel );
yaw_change *= dot; // this works for reverse, since yaw is just the opposite
}
else
{
speed = 0;
VectorClear( unitvel );
yaw_change = -vehicle->avelocity[YAW] * vehicle->front_traction;
}
vehicle->avelocity[YAW] += yaw_change;
Veh_Debug( "YawVel=%3.0f\n", vehicle->avelocity[YAW] );
}
void Veh_HoldRearWheels( vehicle_t *vehicle )
{
vec3_t old_rear, new_rear;
vec3_t old_fwd, new_fwd;
vec3_t ideal_rear, ideal_vec, end_rear;
vec3_t new_vec, old_vec;
AngleVectors( vehicle->oldangles, old_fwd, NULL, NULL );
VectorMA( vehicle->oldorigin, -vehicle->def->wheelspan_length * 0.5, old_fwd, old_rear );
AngleVectors( vehicle->angles, new_fwd, NULL, NULL );
VectorMA( vehicle->origin, -vehicle->def->wheelspan_length * 0.5, new_fwd, new_rear );
VectorSubtract( old_rear, vehicle->origin, old_vec );
VectorNormalize( old_vec );
VectorMA( vehicle->origin, vehicle->def->wheelspan_length * 0.5, old_vec, ideal_rear );
// now move to it depending on traction
VectorSubtract( ideal_rear, new_rear, ideal_vec );
VectorMA( new_rear, vehicle->rear_traction, ideal_vec, end_rear );
VectorSubtract( vehicle->origin, end_rear, new_vec );
VectorNormalize( new_vec );
vehicle->angles[YAW] = vectoyaw( new_vec );
}
// this is hacked together just for debugging
void Veh_PositionModels( vehicle_t *vehicle )
{
vec3_t fwd, right, up;
AngleVectors( vehicle->angles, fwd, right, up );
VectorMA( vehicle->origin, 0.5 * CM_TO_UNITS * vehicle->def->wheelspan_length, fwd, vehicle->fl->s.origin );
VectorMA( vehicle->fl->s.origin, -0.5 * CM_TO_UNITS * vehicle->def->wheelspan_width, right, vehicle->fl->s.origin );
VectorMA( vehicle->fl->s.origin, -24 + CM_TO_UNITS * vehicle->def->wheels->radius, up, vehicle->fl->s.origin );
VectorCopy( vehicle->angles, vehicle->fl->s.angles );
vehicle->fl->s.angles[YAW] += vehicle->steer_yaw;
gi.linkentity( vehicle->fl );
VectorMA( vehicle->origin, 0.5 * CM_TO_UNITS * vehicle->def->wheelspan_length, fwd, vehicle->fr->s.origin );
VectorMA( vehicle->fr->s.origin, 0.5 * CM_TO_UNITS * vehicle->def->wheelspan_width, right, vehicle->fr->s.origin );
VectorMA( vehicle->fr->s.origin, -24 + CM_TO_UNITS * vehicle->def->wheels->radius, up, vehicle->fr->s.origin );
VectorCopy( vehicle->angles, vehicle->fr->s.angles );
vehicle->fr->s.angles[YAW] += vehicle->steer_yaw;
gi.linkentity( vehicle->fr );
VectorMA( vehicle->origin, -0.5 * CM_TO_UNITS * vehicle->def->wheelspan_length, fwd, vehicle->rl->s.origin );
VectorMA( vehicle->rl->s.origin, -0.5 * CM_TO_UNITS * vehicle->def->wheelspan_width, right, vehicle->rl->s.origin );
VectorMA( vehicle->rl->s.origin, -24 + CM_TO_UNITS * vehicle->def->wheels->radius, up, vehicle->rl->s.origin );
VectorCopy( vehicle->angles, vehicle->rl->s.angles );
gi.linkentity( vehicle->rl );
VectorMA( vehicle->origin, -0.5 * CM_TO_UNITS * vehicle->def->wheelspan_length, fwd, vehicle->rr->s.origin );
VectorMA( vehicle->rr->s.origin, 0.5 * CM_TO_UNITS * vehicle->def->wheelspan_width, right, vehicle->rr->s.origin );
VectorMA( vehicle->rr->s.origin, -24 + CM_TO_UNITS * vehicle->def->wheels->radius, up, vehicle->rr->s.origin );
VectorCopy( vehicle->angles, vehicle->rr->s.angles );
gi.linkentity( vehicle->rr );
}

139
gamesrc/VEHICLES.H Normal file
View file

@ -0,0 +1,139 @@
// Vehicle defines
#define THROTTLE_MAX 8000.0
#define IDLE_THROTTLE 1000.0
#define DEFAULT_VEHICLE_WEIGHT 1650.0
#define VEH_MAX_SPEED 1500.0
// these could be replaced with constants to speed things up
#define UNITS_TO_CM 4.0
#define CM_TO_UNITS (1.0/UNITS_TO_CM)
#define MIN_PER_SEC (1.0 / 60.0)
#define SEC_PER_MIN (60.0)
#define LBS_TO_KG (12.5/28.0)
#define KG_TO_LBS (28.0/12.5)
#define FT_TO_CM (2.5*12.0)
#define CM_TO_FT (1.0/(2.5*12.0))
#define MAX_VEHICLES 64
// Static
typedef struct
{
float concrete, fabric, gravel, metal, snow, tile, wood;
} wheel_traction_table_t;
typedef struct
{
float radius;
wheel_traction_table_t *whl_trac; // how the wheel grips to each surface type
} wheel_t;
typedef struct
{
char *name;
int index;
float ratio; // effects acceleration, top speed, etc. we could make these configurable
// e.g. a ratio of 0.5 means the drive wheels will spin 0.5 of a revolution
// for each engine revolution
} gear_t;
typedef struct
{
int num_gears;
gear_t gears[8]; // 0 = reverse, 1 = neutral
} gearbox_t;
typedef struct
{
char *name;
// mechanics
gearbox_t *gearbox; // stores all gears for this vehicle
wheel_t *wheels;
float wheelspan_width;
float wheelspan_length;
float weight; // effects acceleration, traction, braking, etc
float max_steer; // maximum angle of steering
float engine_power; // engine power output (kW)
float diff_ratio; // usually 3 : 1
// visuals
char *body_model;
int body_skin;
char *wheel_model;
int wheel_skin;
// sounds
char *shift_sound;
} vehicle_define_t;
// Run-time
// This stores the information pertaining to an active vehicle in the game.
typedef struct
{
edict_t *driver;
vehicle_define_t *def;
float front_traction, rear_traction; // 0.0 (no traction) -> 1.0 (full traction)
float front_weight_ratio; // at rest, this should be 0.5.
// when accelerating, this will decrease as weight is transferred
// to the rear wheels.
// vice versa for braking/decelleration
qboolean front_onground;
qboolean rear_onground;
int gear; // current gear, 0 = reverse, 1 = neutral
float rpm;
float throttle; // 0 (none) -> THROTTLE_MAX (full)
// This will effect RPM by increasing
// fuel intake. If drive wheels have full traction, RPM
// will be limited to the RPM of the drive wheels (which is
// determined by applying a formula to the current rear velocity).
// If this is lower then the current RPM, decceleration will
// occur, depending on rear wheel traction and the current RPM
// (higher RPM will induce more decompression braking on rear wheels).
// if Negative, brakes will be applied in same scale (0 - THROTTLE_MAX).
float steer_yaw;
vec3_t angles, origin;
vec3_t oldorigin, oldangles;
vec3_t velocity; // overall velocity
vec3_t avelocity; // angular velocity (only used when in air?)
edict_t *fl, *fr, *rl, *rr;
} vehicle_t;
//=============================================================================
// Vars
extern vehicle_t global_vehicles[MAX_VEHICLES];
void Veh_ProcessFrame( edict_t *ent, usercmd_t *ucmd, pmove_t *pm );
void Veh_InitVehicle ( vehicle_t *vehicle );
void Veh_ProcessControls ( vehicle_t *vehicle, usercmd_t *ucmd );
void Veh_Debug( char *fmt, ...);
float Veh_SpeedAtRPM( vehicle_t *veh, float rpm );
float Veh_WheelTorqueAtRPM( vehicle_t *veh, float rpm );
float Veh_RPMatSpeed( vehicle_t *veh, float speed );
void Veh_PerformMove( vehicle_t *vehicle, pmove_t *pm );
void Veh_PerformAngleVelocity( vehicle_t *vehicle, float frametime, pmove_t *pm );
void Veh_SetSteeringAngleVelocity( vehicle_t *vehicle );
void Veh_HoldRearWheels( vehicle_t *vehicle );
void Veh_PositionModels( vehicle_t *vehicle );

96
gamesrc/VEH_DEFS.H Normal file
View file

@ -0,0 +1,96 @@
//=======================================================================
vehicle_t global_vehicles[MAX_VEHICLES];
//=======================================================================
gearbox_t commodore_gearbox =
{
7, // num_gears (Neutral, Reverse + 5 gears)
{
{
"Reverse", // display name
0, // index
-2 // gear ratio
},
{
"Neutral",
1,
0
},
{
"1st",
2,
2.8
},
{
"2nd",
3,
2.0
},
{
"3rd",
4,
1.5
},
{
"4th",
5,
1.0
},
{
"5th",
6,
0.8
}
}
};
wheel_traction_table_t generic_wheel_traction =
{
0.8, // concrete
0.6, // fabric
0.4, // gravel
0.7, // metal
0.1, // snow
0.6, // tile
0.7 // wood
};
wheel_t generic_wheel =
{
29, // radius (cm)
&generic_wheel_traction // traction table
};
vehicle_define_t vehicle_defines[] =
{
{
"Commodore VT",
&commodore_gearbox,
&generic_wheel,
150, // wheelspan width (cm)
250, // wheelspan length (cm)
1650, // weight (kg)
40, // maximum steering angle
180, // engine power output (kW)
3, // diff ratio
"models/vehicles/cars/viper/tris_test.md2", // body model
0, // body skin
"models/vehicles/cars/misc/wheel.md2", // wheel model
0, // wheel skin
NULL, // gear change sound
},
{
NULL
}
};

829
gamesrc/VOICE.C Normal file
View file

@ -0,0 +1,829 @@
#include "g_local.h"
#include "voice_punk.h"
#include "voice_bitch.h"
char stranger_str[] = "(Stranger)";
int num_precached_voices = 0;
void Voice_Random_rc( edict_t *self, edict_t *other, voice_table_t *voice_table, int num_entries );
void Voice_Specific_rc( edict_t *self, edict_t *other, voice_table_t *voice_table, int entry );
void Voice_Random( edict_t *self, edict_t *other, voice_table_t *voice_table, int num_entries )
{
int entry=-1, best_entry=-1, count=0;
int i;
if (self->cast_info.aiflags & AI_NO_TALK)
return;
if (self->health <= 0)
return;
if ( !(self->client) )
{
if ( level.episode == EP_RADIOCITY && (self->gender == GENDER_MALE || self->gender == GENDER_FEMALE) )
{
Voice_Random_rc (self, other, voice_table, num_entries);
return;
}
}
again:
if ( !deathmatch->value
&& (other)
&& (other->last_talk_time > (level.time - 5))
&& (other->last_voice)
&& (other->last_voice->response_table == voice_table)
&& (other->last_voice->num_responses))
{
// we should pick a specific response
i = (int)floor( random()*other->last_voice->num_responses );
while ((entry < 0) || (voice_table[entry].last_played > 0.1))
{
entry = other->last_voice->responses[ i++ ];
if ((best_entry < 0) || (voice_table[entry].last_played < voice_table[best_entry].last_played))
{
best_entry = entry;
}
else if (voice_table[ entry ].last_played > level.time)
{ // still set from a previous level
voice_table[ entry ].last_played = 0;
}
if (i >= other->last_voice->num_responses)
i = 0;
if (count++ > other->last_voice->num_responses)
break;
}
entry = best_entry;
}
else // not responding, just pick any non-response
{
entry = (int)floor( random()*num_entries );
while (count++ < num_entries)
{
if ( (!voice_table[ entry ].response)
&& (self->last_voice != &voice_table[ entry ])
&& ( (best_entry < 0)
|| (voice_table[ entry ].last_played < voice_table[ best_entry ].last_played)))
{
best_entry = entry;
}
else if (voice_table[ entry ].last_played > level.time)
{ // still set from a previous level
voice_table[ entry ].last_played = 0;
}
entry++;
if (entry >= num_entries)
entry = 0;
}
if (best_entry < 0)
best_entry = (int)floor( random()*num_entries );
entry = best_entry;
}
// HACK, don't say "Fuck me, Freddy is it you?" to the bitch (we need a better way to handle things like this)
if ( self->client
&& other
&& other->gender == GENDER_FEMALE
&& voice_table == neutral_talk_player
&& entry == 4)
{
voice_table[ entry ].last_played = level.time;
entry=-1;
best_entry=-1;
count=0;
goto again;
}
// the popeye hack
if ( self->name_index == NAME_POPEYE
&& ( voice_table == fightsounds
|| voice_table == grunting
|| voice_table == m_backoff )
)
{
voice_table = sy_popeye;
entry = 19 + (rand()%3);
}
if (voice_table[ entry ].filename)
{
if (!voice_table[ entry ].last_played || (voice_table[ entry ].last_played > level.time)
|| (voice_table[ entry ].gameinc_soundindex != gameinc))
{
voice_table[ entry ].soundindex = 0;
}
if (deathmatch->value || VectorDistance( g_edicts[1].s.origin, self->s.origin ) < 1024)
{
if ((other && other->client) || self->client)
gi.sound( self, CHAN_VOICE | CHAN_RELIABLE, (voice_table[ entry ].soundindex ? voice_table[ entry ].soundindex - 1 : (voice_table[ entry ].soundindex = 1 + gi.soundindex ( voice_table[ entry ].filename )) - 1 ), 1.0, 1, 0 );
else
gi.sound( self, CHAN_VOICE | CHAN_RELIABLE, (voice_table[ entry ].soundindex ? voice_table[ entry ].soundindex - 1 : (voice_table[ entry ].soundindex = 1 + gi.soundindex ( voice_table[ entry ].filename )) - 1 ), 0.2, 1, 0 );
voice_table[ entry ].gameinc_soundindex = gameinc;
if (cl_captions->value && strlen(voice_table[entry].text) > 0)
{
if (cl_parental_lock->value && !cl_parental_override->value)
{
if (self->client)
gi.dprintf ("player : %s\n", voice_table[entry].text2);
else if (other && other->client) // Ridah, 5-8-99, had to do this otherwise too much text comes up, and you can't see which of it's yours
gi.dprintf ("%s : %s\n", self->name ? self->name : stranger_str, voice_table[entry].text2);
}
else
{
if (self->client)
gi.dprintf ("player : %s\n", voice_table[entry].text);
else if (other && other->client) // Ridah, 5-8-99, had to do this otherwise too much text comes up, and you can't see which of it's yours
gi.dprintf ("%s : %s\n", self->name ? self->name : stranger_str, voice_table[entry].text);
}
}
}
}
else
{
if (cl_parental_lock->value && !cl_parental_override->value)
gi.dprintf("VOICE TODO: %s\n", voice_table[ entry ].text2);
else
gi.dprintf("VOICE TODO: %s\n", voice_table[ entry ].text);
}
if (self->client || (other && other->client))
{
if (other && other->client) // tell this client to talk back to us next time they chat
other->cast_info.talk_ent = self;
self->cast_info.talk_ent = other;
last_client_talk = level.time;
}
self->last_voice = &( voice_table[ entry ] );
voice_table[ entry ].last_played = level.time;
self->last_talk_time = level.time;
// JOSEPH 2-FEB-99
if (other && other->client)
{
other->client->ps.stats[STAT_HUD_ENEMY_TALK] = voice_table[ entry ].type;
other->client->hud_enemy_talk_time = level.time + 2.0;
}
// END JOSEPH
}
void Voice_Specific( edict_t *self, edict_t *other, voice_table_t *voice_table, int entry )
{
if (self->cast_info.aiflags & AI_NO_TALK)
return;
if (self->health <= 0)
return;
if (!(self->client))
{
if (level.episode == EP_RADIOCITY && (self->gender == GENDER_MALE || self->gender == GENDER_FEMALE))
{
Voice_Specific_rc (self, other, voice_table, entry);
return;
}
}
// JOSEPH 2-FEB-99
if (other && other->client)
{
other->client->ps.stats[STAT_HUD_ENEMY_TALK] = voice_table[ entry ].type;
other->client->hud_enemy_talk_time = level.time + 2.0;
}
// END JOSEPH
if (voice_table[ entry ].filename)
{
if (!voice_table[ entry ].last_played || (voice_table[ entry ].last_played > level.time)
|| (voice_table[ entry ].gameinc_soundindex != gameinc))
{
voice_table[ entry ].soundindex = 0;
}
if (VectorDistance( g_edicts[1].s.origin, self->s.origin ) < 1024)
{
if ((other && other->client) || self->client)
gi.sound( self, CHAN_VOICE + CHAN_RELIABLE, (voice_table[ entry ].soundindex ? voice_table[ entry ].soundindex - 1 : (voice_table[ entry ].soundindex = 1 + gi.soundindex ( voice_table[ entry ].filename )) - 1 ), 1.0, 1, 0 );
else
gi.sound( self, CHAN_VOICE + CHAN_RELIABLE, (voice_table[ entry ].soundindex ? voice_table[ entry ].soundindex - 1 : (voice_table[ entry ].soundindex = 1 + gi.soundindex ( voice_table[ entry ].filename )) - 1 ), 0.2, 1, 0 );
voice_table[ entry ].gameinc_soundindex = gameinc;
if (cl_captions->value && strlen(voice_table[entry].text) > 0)
{
if (cl_parental_lock->value && !cl_parental_override->value)
{
if (self->client)
gi.dprintf ("player : %s\n", voice_table[entry].text2);
else if (other->client) // Ridah, 5-8-99, had to do this otherwise too much text comes up, and you can't see which of it's yours
gi.dprintf ("%s : %s\n", self->name ? self->name : stranger_str, voice_table[entry].text2);
}
else
{
if (self->client)
gi.dprintf ("player : %s\n", voice_table[entry].text);
else if (other->client) // Ridah, 5-8-99, had to do this otherwise too much text comes up, and you can't see which of it's yours
gi.dprintf ("%s : %s\n", self->name ? self->name : stranger_str, voice_table[entry].text);
}
}
}
}
else
{
if (cl_parental_lock->value && !cl_parental_override->value)
gi.dprintf("VOICE: %s\n", voice_table[ entry ].text2);
else
gi.dprintf("VOICE: %s\n", voice_table[ entry ].text);
}
if (self->client || (other && other->client))
{
if (other && other->client) // tell this client to talk back to us next time they chat
other->cast_info.talk_ent = self;
last_client_talk = level.time;
}
self->last_voice = &( voice_table[ entry ] );
voice_table[ entry ].last_played = level.time;
self->last_talk_time = level.time;
}
// JOSEPH 13-FEB-99
void Voice_Player_Specific( edict_t *player, int entry )
{
if (player->health <= 0)
return;
// JOSEPH 2-FEB-99
if (player && player->client)
{
player->client->ps.stats[STAT_HUD_SELF_TALK] = entry;
player->client->hud_self_talk_time = level.time + 2.0;
}
// END JOSEPH
last_client_talk = level.time;
player->last_talk_time = level.time;
}
// END JOSEPH
//////////////////////////////////////
// radio city voice_routines
//////////////////////////////////////
void Voice_Random_rc( edict_t *self, edict_t *other, voice_table_t *voice_table, int num_entries )
{
int entry=-1, best_entry=-1, count=0;
int i;
int offset;
if (self->cast_info.aiflags & AI_NO_TALK)
return;
if (self->health <= 0)
return;
{
// voice_table conversion
if (self->name_index == NAME_KINGPIN)
voice_table = voice_table;
else if (self->name_index == NAME_BLUNT)
voice_table = voice_table;
else if (self->name_index == NAME_NICKIBLANCO)
voice_table = voice_table;
else if (self->name_index == NAME_BUTCH)
voice_table = voice_table;
else if (self->name_index == NAME_PATRICK)
voice_table = voice_table;
else if (self->name_index == NAME_MOMO)
voice_table = voice_table;
else if (self->name_index == NAME_SCALPER)
voice_table = voice_table;
else if (self->gender == GENDER_MALE)
{
qboolean is_rc = true;
if (voice_table >= rc_joker && voice_table <= &rc_joker[9])
voice_table = voice_table;
else if (self->cast_group == 1)
voice_table = voice_table;
else if (voice_table >= neutral_talk && voice_table <= &neutral_talk[15])
{
offset = voice_table - neutral_talk;
voice_table = rc_neutral_talk + offset;
}
else if (voice_table >= neutral_asshole_talk && voice_table <= &neutral_asshole_talk[1])
{
offset = voice_table - neutral_talk;
voice_table = rc_neutral_asshole_talk + offset;
}
else if (voice_table >= neutral_talk_player && voice_table <= &neutral_talk_player[9])
{
offset = voice_table - neutral_talk_player;
voice_table = rc_neutral_talk_player + offset;
}
else if (voice_table >= neutral_converse && voice_table <= &neutral_converse[19])
{
offset = voice_table - neutral_converse;
voice_table = rc_neutral_converse + offset;
}
else if (voice_table >= neutral_converse_to_female && voice_table <= &neutral_converse_to_female[10])
{
offset = voice_table - neutral_converse_to_female;
voice_table = rc_neutral_converse_to_female + offset;
}
else if (voice_table >= profanity_level1 && voice_table <= &profanity_level1[10])
{
offset = voice_table - profanity_level1;
voice_table = rc_profanity_level1 + offset;
}
else if (voice_table >= profanity_level2 && voice_table <= &profanity_level2[16])
{
offset = voice_table - profanity_level2;
voice_table = rc_profanity_level2 + offset;
}
else if (voice_table >= profanity_level3 && voice_table <= &profanity_level3[1])
{
offset = voice_table - profanity_level3;
voice_table = rc_profanity_level3 + offset;
}
else if (voice_table >= friendlycombat && voice_table <= &friendlycombat[4])
{
offset = voice_table - friendlycombat;
voice_table = rc_friendlycombat + offset;
}
else if (voice_table >= friendlypain && voice_table <= &friendlypain[1])
{
offset = voice_table - friendlypain;
voice_table = rc_friendlypain + offset;
}
else if (voice_table >= friendlyhurt && voice_table <= &friendlyhurt[1])
{
offset = voice_table - friendlyhurt;
voice_table = rc_friendlyhurt + offset;
}
else if (voice_table >= fightsounds && voice_table <= &fightsounds[9])
{
offset = voice_table - fightsounds;
voice_table = rc_fightsounds + offset;
}
else if (voice_table >= specific && voice_table <= &specific[29])
{
offset = voice_table - specific;
voice_table = rc_specific + offset;
}
else if (voice_table >= m_backoff && voice_table <= &m_backoff[2])
{
offset = voice_table - m_backoff;
voice_table = rc_m_backoff + offset;
}
else if (voice_table >= male_specific && voice_table <= &male_specific[12])
{
offset = voice_table - male_specific;
voice_table = rc_male_specific + offset;
}
else if (voice_table >= grunting && voice_table <= &grunting[4])
{
offset = voice_table - grunting;
voice_table = rc_grunting + offset;
}
else
{
gi.dprintf ("ERROR: Random missing conversion for male %s\n", voice_table[0].text);
return;
}
}
else if (self->gender == GENDER_FEMALE)
{
if (self->name_index == NAME_LOLA)
voice_table = voice_table;
else if (voice_table >= f_neutral_talk && voice_table <= &f_neutral_talk[15])
{
offset = voice_table - f_neutral_talk;
voice_table = rc_f_neutral_talk + offset;
}
else if (voice_table >= f_neutral_asshole_talk && voice_table <= &f_neutral_asshole_talk[4])
{
offset = voice_table - f_neutral_asshole_talk;
voice_table = rc_f_neutral_asshole_talk + offset;
}
else if (voice_table >= f_neutral_talk_player && voice_table <= &f_neutral_talk_player[3])
{
offset = voice_table - f_neutral_talk_player;
voice_table = rc_f_neutral_talk_player + offset;
}
else if (voice_table >= f_neutral_converse && voice_table <= &f_neutral_converse[15])
{
offset = voice_table - f_neutral_converse;
voice_table = rc_f_neutral_converse + offset;
}
else if (voice_table >= f_profanity_level1 && voice_table <= &f_profanity_level1[4])
{
offset = voice_table - f_profanity_level1;
voice_table = rc_f_profanity_level1 + offset;
}
else if (voice_table >= f_profanity_level2 && voice_table <= &f_profanity_level2[3])
{
offset = voice_table - f_profanity_level2;
voice_table = rc_f_profanity_level2 + offset;
}
else if (voice_table >= f_profanity_level3 && voice_table <= &f_profanity_level3[2])
{
offset = voice_table - f_profanity_level3;
voice_table = rc_f_profanity_level3 + offset;
}
else if (voice_table >= f_fightsounds && voice_table <= &f_fightsounds[7])
{
offset = voice_table - f_fightsounds;
voice_table = rc_f_fightsounds + offset;
}
else if (voice_table >= f_specific && voice_table <= &f_specific[3])
{
offset = voice_table - f_specific;
voice_table = rc_f_specific + offset;
}
else if (voice_table >= f_backoff && voice_table <= &f_backoff[3])
{
offset = voice_table - f_backoff;
voice_table = rc_f_backoff + offset;
}
else if (voice_table >= female_specific && voice_table <= &female_specific[8])
{
offset = voice_table - female_specific;
voice_table = rc_female_specific + offset;
}
else if (voice_table >= f_grunting && voice_table <= &f_grunting[4])
{
offset = voice_table - f_grunting;
voice_table = rc_f_grunting + offset;
}
else
{
gi.dprintf ("ERROR: Random missing conversion for female %s\n", voice_table[0].text);
return;
}
}
}
again:
if ( (other)
&& (other->last_talk_time > (level.time - 5))
&& (other->last_voice)
&& (other->last_voice->response_table == voice_table)
&& (other->last_voice->num_responses))
{
// we should pick a specific response
i = (int)floor( random()*other->last_voice->num_responses );
while ((entry < 0) || (voice_table[entry].last_played > 0.1))
{
entry = other->last_voice->responses[ i++ ];
if ((best_entry < 0) || (voice_table[entry].last_played < voice_table[best_entry].last_played))
{
best_entry = entry;
}
else if (voice_table[ entry ].last_played > level.time)
{ // still set from a previous level
voice_table[ entry ].last_played = 0;
}
if (i >= other->last_voice->num_responses)
i = 0;
if (count++ > other->last_voice->num_responses)
break;
}
entry = best_entry;
}
else // not responding, just pick any non-response
{
entry = (int)floor( random()*num_entries );
while (count++ < num_entries)
{
if ( (!voice_table[ entry ].response)
&& (self->last_voice != &voice_table[ entry ])
&& ( (best_entry < 0)
|| (voice_table[ entry ].last_played < voice_table[ best_entry ].last_played)))
{
best_entry = entry;
}
else if (voice_table[ entry ].last_played > level.time)
{ // still set from a previous level
voice_table[ entry ].last_played = 0;
}
entry++;
if (entry >= num_entries)
entry = 0;
}
if (best_entry < 0)
best_entry = (int)floor( random()*num_entries );
entry = best_entry;
}
// HACK, don't say "Fuck me, Freddy is it you?" to the bitch (we need a better way to handle things like this)
if ( self->client
&& other
&& other->gender == GENDER_FEMALE
&& voice_table == neutral_talk_player
&& entry == 4)
{
voice_table[ entry ].last_played = level.time;
entry=-1;
best_entry=-1;
count=0;
goto again;
}
// the popeye hack
if ( self->name_index == NAME_POPEYE
&& ( voice_table == fightsounds
|| voice_table == grunting
|| voice_table == m_backoff )
)
{
voice_table = sy_popeye;
entry = 19 + (rand()%3);
}
if (voice_table[ entry ].filename)
{
if (!voice_table[ entry ].last_played || (voice_table[ entry ].last_played > level.time)
|| (voice_table[ entry ].gameinc_soundindex != gameinc))
{
voice_table[ entry ].soundindex = 0;
}
if (VectorDistance( g_edicts[1].s.origin, self->s.origin ) < 1024)
{
if ((other && other->client) || self->client)
gi.sound( self, CHAN_VOICE | CHAN_RELIABLE, (voice_table[ entry ].soundindex ? voice_table[ entry ].soundindex - 1 : (voice_table[ entry ].soundindex = 1 + gi.soundindex ( voice_table[ entry ].filename )) - 1 ), 1.0, 1, 0 );
else
gi.sound( self, CHAN_VOICE | CHAN_RELIABLE, (voice_table[ entry ].soundindex ? voice_table[ entry ].soundindex - 1 : (voice_table[ entry ].soundindex = 1 + gi.soundindex ( voice_table[ entry ].filename )) - 1 ), 0.2, 1, 0 );
voice_table[ entry ].gameinc_soundindex = gameinc;
if (cl_captions->value && strlen(voice_table[entry].text) > 0)
{
if (cl_parental_lock->value && !cl_parental_override->value)
{
if (self->client)
gi.dprintf ("player : %s\n", voice_table[entry].text2);
else if (other && other->client) // Ridah, 5-8-99, had to do this otherwise too much text comes up, and you can't see which of it's yours
gi.dprintf ("%s : %s\n", self->name ? self->name : stranger_str, voice_table[entry].text2);
}
else
{
if (self->client)
gi.dprintf ("player : %s\n", voice_table[entry].text);
else if (other && other->client) // Ridah, 5-8-99, had to do this otherwise too much text comes up, and you can't see which of it's yours
gi.dprintf ("%s : %s\n", self->name ? self->name : stranger_str, voice_table[entry].text);
}
}
}
}
else
{
if (cl_parental_lock->value && !cl_parental_override->value)
gi.dprintf("VOICE TODO: %s\n", voice_table[ entry ].text2);
else
gi.dprintf("VOICE TODO: %s\n", voice_table[ entry ].text);
}
if (self->client || (other && other->client))
{
if (other && other->client) // tell this client to talk back to us next time they chat
other->cast_info.talk_ent = self;
self->cast_info.talk_ent = other;
last_client_talk = level.time;
}
self->last_voice = &( voice_table[ entry ] );
voice_table[ entry ].last_played = level.time;
self->last_talk_time = level.time;
// JOSEPH 2-FEB-99
if (other && other->client)
{
other->client->ps.stats[STAT_HUD_ENEMY_TALK] = voice_table[ entry ].type;
other->client->hud_enemy_talk_time = level.time + 2.0;
}
// END JOSEPH
}
void Voice_Specific_rc( edict_t *self, edict_t *other, voice_table_t *voice_table, int entry )
{
if (self->cast_info.aiflags & AI_NO_TALK)
return;
if (self->health <= 0)
return;
{
// voice_table conversion
if (self->name_index == NAME_KINGPIN)
voice_table = voice_table;
else if (self->name_index == NAME_BLUNT)
voice_table = voice_table;
else if (self->name_index == NAME_NICKIBLANCO)
voice_table = voice_table;
else if (self->name_index == NAME_BUTCH)
voice_table = voice_table;
else if (self->name_index == NAME_PATRICK)
voice_table = voice_table;
else if (self->name_index == NAME_MOMO)
voice_table = voice_table;
else if (self->name_index == NAME_SCALPER)
voice_table = voice_table;
else if (self->gender == GENDER_MALE)
{
if (voice_table == rc_joker)
voice_table = voice_table;
else if (self->cast_group == 1)
voice_table = voice_table;
else if (voice_table == neutral_talk)
voice_table = rc_neutral_talk;
else if (voice_table == neutral_asshole_talk)
voice_table = rc_neutral_asshole_talk;
else if (voice_table == neutral_talk_player)
voice_table = rc_neutral_talk_player;
else if (voice_table == neutral_converse)
voice_table = rc_neutral_converse;
else if (voice_table == neutral_converse_to_female)
voice_table = rc_neutral_converse_to_female;
else if (voice_table == profanity_level1)
voice_table = rc_profanity_level1;
else if (voice_table == profanity_level2)
voice_table = rc_profanity_level2;
else if (voice_table == profanity_level3)
voice_table = rc_profanity_level3;
else if (voice_table == friendlycombat)
voice_table = rc_friendlycombat;
else if (voice_table == friendlypain)
voice_table = rc_friendlypain;
else if (voice_table == friendlyhurt)
voice_table = rc_friendlyhurt;
else if (voice_table == fightsounds)
voice_table = rc_fightsounds;
else if (voice_table == specific)
voice_table = rc_specific;
else if (voice_table == m_backoff)
voice_table = rc_m_backoff;
else if (voice_table == male_specific)
voice_table = rc_male_specific;
else if (voice_table == grunting)
voice_table = rc_grunting;
else
{
gi.dprintf ("ERROR: Specific missing voice table conversion for %s", voice_table[0].text);
return;
}
}
else if (self->gender == GENDER_FEMALE)
{
if (self->name_index == NAME_LOLA)
voice_table = voice_table;
else if (voice_table == f_neutral_talk)
voice_table = rc_f_neutral_talk;
else if (voice_table == f_neutral_asshole_talk)
voice_table = rc_f_neutral_asshole_talk;
else if (voice_table == f_neutral_talk_player)
voice_table = rc_f_neutral_talk_player;
else if (voice_table == f_neutral_converse)
voice_table = rc_f_neutral_converse;
else if (voice_table == f_profanity_level1)
voice_table = rc_f_profanity_level1;
else if (voice_table == f_profanity_level2)
voice_table = rc_f_profanity_level2;
else if (voice_table == f_profanity_level3)
voice_table = rc_f_profanity_level3;
else if (voice_table == f_fightsounds)
voice_table = rc_f_fightsounds;
else if (voice_table == f_specific)
voice_table = rc_f_specific;
else if (voice_table == f_backoff)
voice_table = rc_f_backoff;
else if (voice_table == female_specific)
voice_table = rc_female_specific;
else if (voice_table == f_grunting)
voice_table = rc_f_grunting;
else
{
gi.dprintf ("ERROR: Specific missing voice table conversion for %s", voice_table[0].text);
return;
}
}
}
// JOSEPH 2-FEB-99
if (other && other->client)
{
other->client->ps.stats[STAT_HUD_ENEMY_TALK] = voice_table[ entry ].type;
other->client->hud_enemy_talk_time = level.time + 2.0;
}
// END JOSEPH
if (voice_table[ entry ].filename)
{
if (!voice_table[ entry ].last_played || (voice_table[ entry ].last_played > level.time)
|| (voice_table[ entry ].gameinc_soundindex != gameinc))
{
voice_table[ entry ].soundindex = 0;
}
if (VectorDistance( g_edicts[1].s.origin, self->s.origin ) < 1024)
{
if ((other && other->client) || self->client)
gi.sound( self, CHAN_VOICE + CHAN_RELIABLE, (voice_table[ entry ].soundindex ? voice_table[ entry ].soundindex - 1 : (voice_table[ entry ].soundindex = 1 + gi.soundindex ( voice_table[ entry ].filename )) - 1 ), 1.0, 1, 0 );
else
gi.sound( self, CHAN_VOICE + CHAN_RELIABLE, (voice_table[ entry ].soundindex ? voice_table[ entry ].soundindex - 1 : (voice_table[ entry ].soundindex = 1 + gi.soundindex ( voice_table[ entry ].filename )) - 1 ), 0.2, 1, 0 );
voice_table[ entry ].gameinc_soundindex = gameinc;
if (cl_captions->value && strlen(voice_table[entry].text) > 0)
{
if (cl_parental_lock->value && !cl_parental_override->value)
{
if (self->client)
gi.dprintf ("player : %s\n", voice_table[entry].text2);
else if (other->client) // Ridah, 5-8-99, had to do this otherwise too much text comes up, and you can't see which of it's yours
gi.dprintf ("%s : %s\n", self->name ? self->name : stranger_str, voice_table[entry].text2);
}
else
{
if (self->client)
gi.dprintf ("player : %s\n", voice_table[entry].text);
else if (other->client) // Ridah, 5-8-99, had to do this otherwise too much text comes up, and you can't see which of it's yours
gi.dprintf ("%s : %s\n", self->name ? self->name : stranger_str, voice_table[entry].text);
}
}
}
}
else
{
if (cl_parental_lock->value && !cl_parental_override->value)
gi.dprintf("VOICE: %s\n", voice_table[ entry ].text2);
else
gi.dprintf("VOICE: %s\n", voice_table[ entry ].text);
}
if (self->client || (other && other->client))
{
if (other && other->client) // tell this client to talk back to us next time they chat
other->cast_info.talk_ent = self;
last_client_talk = level.time;
}
self->last_voice = &( voice_table[ entry ] );
voice_table[ entry ].last_played = level.time;
self->last_talk_time = level.time;
}

42
gamesrc/VOICE.H Normal file
View file

@ -0,0 +1,42 @@
// Voice System defines
typedef struct voice_table_s voice_table_t;
// JOSEPH 11-MAR-99
struct voice_table_s
{
voice_table_t *response_table; // match responses to this table
char *text;
char *text2;
char *filename;
int num_responses; // 0 for anything
int responses[5]; // list of indexes of sounds that would possibly match this comment
// NOTE: these could reference sounds in other tables!
float last_played;
qboolean response; // set if this "response" can only be played after another comment
int type;
int soundindex; // for faster playing of sounds that have already been played this level
int gameinc_soundindex; // so we can reset soundindexes on a new level
};
// END JOSEPH
extern int gameinc;
#define TALK_SELF_DELAY 9
#define TALK_OTHER_DELAY 1.6
#define TALK_FIGHTING_DELAY 4
float last_client_talk; // records the last time the client was spoken to, so AI characters don't all respond at once
// this list is kept so we can make sure the soundindex of each voice item is cleared when starting a new level
voice_table_t *precached_voices[MAX_SOUNDS];
extern int num_precached_voices;
void Voice_Random( edict_t *self, edict_t *other, voice_table_t *voice_table, int num_entries );
void Voice_Specific( edict_t *self, edict_t *other, voice_table_t *voice_table, int entry );
// JOSEPH 13-FEB-99
void Voice_Player_Specific( edict_t *player, int entry );
// END JOSEPH

1443
gamesrc/ai_bitch_tables.h Normal file

File diff suppressed because it is too large Load diff

639
gamesrc/ai_bum_sit.c Normal file
View file

@ -0,0 +1,639 @@
#include "g_local.h"
#include "ai_bum_sit.h"
#include "voice_punk.h"
void bum_sit_talk (edict_t *self);
void bum_sit_end_sit (edict_t *self);
void bum_talk_think( edict_t *self );
void ai_stand_onfire (edict_t *self, float dist);
mframe_t bum_sit_frames_amb_sit[] =
{
ai_stand, 0.000, bum_talk_think, // frame 0
ai_stand, 0.000, bum_talk_think, // frame 1
ai_stand, 0.000, bum_talk_think, // frame 2
ai_stand, 0.000, bum_talk_think, // frame 3
ai_stand, 0.000, bum_talk_think, // frame 4
ai_stand, 0.000, bum_talk_think, // frame 5
ai_stand, 0.000, bum_talk_think, // frame 6
ai_stand, 0.000, bum_talk_think, // frame 7
ai_stand, 0.000, bum_talk_think, // frame 8
ai_stand, 0.000, bum_talk_think, // frame 9
ai_stand, 0.000, bum_talk_think, // frame 10
ai_stand, 0.000, bum_talk_think, // frame 11
ai_stand, 0.000, bum_talk_think, // frame 12
ai_stand, 0.000, bum_talk_think, // frame 13
ai_stand, 0.000, bum_talk_think, // frame 14
ai_stand, 0.000, bum_talk_think, // frame 15
ai_stand, 0.000, bum_talk_think, // frame 16
ai_stand, 0.000, bum_talk_think, // frame 17
ai_stand, 0.000, bum_talk_think, // frame 18
ai_stand, 0.000, bum_talk_think, // frame 19
ai_stand, 0.000, bum_talk_think, // frame 20
ai_stand, 0.000, bum_talk_think, // frame 21
ai_stand, 0.000, bum_talk_think, // frame 22
ai_stand, 0.000, bum_talk_think, // frame 23
ai_stand, 0.000, bum_talk_think, // frame 24
ai_stand, 0.000, bum_talk_think, // frame 25
ai_stand, 0.000, bum_talk_think, // frame 26
ai_stand, 0.000, bum_talk_think, // frame 27
ai_stand, 0.000, bum_talk_think, // frame 28
ai_stand, 0.000, bum_talk_think, // frame 29
ai_stand, 0.000, bum_talk_think, // frame 30
ai_stand, 0.000, bum_talk_think, // frame 31
ai_stand, 0.000, bum_talk_think, // frame 32
ai_stand, 0.000, bum_talk_think, // frame 33
ai_stand, 0.000, bum_talk_think, // frame 34
ai_stand, 0.000, bum_talk_think, // frame 35
ai_stand, 0.000, bum_talk_think, // frame 36
ai_stand, 0.000, bum_talk_think, // frame 37
ai_stand, 0.000, bum_talk_think, // frame 38
ai_stand, 0.000, bum_talk_think, // frame 39
ai_stand, 0.000, bum_talk_think, // frame 40
ai_stand, 0.000, bum_talk_think, // frame 41
ai_stand, 0.000, bum_talk_think, // frame 42
ai_stand, 0.000, bum_talk_think, // frame 43
ai_stand, 0.000, bum_talk_think, // frame 44
ai_stand, 0.000, bum_talk_think, // frame 45
ai_stand, 0.000, bum_talk_think, // frame 46
ai_stand, 0.000, bum_talk_think, // frame 47
ai_stand, 0.000, bum_talk_think, // frame 48
ai_stand, 0.000, bum_talk_think, // frame 49
ai_stand, 0.000, bum_talk_think, // frame 50
ai_stand, 0.000, bum_talk_think, // frame 51
};
mmove_t bum_sit_move_amb_sit = {FRAME_amb_sit_01, FRAME_amb_sit_52, bum_sit_frames_amb_sit, bum_sit_end_sit};
mframe_t bum_sit_frames_leg_shuf[] =
{
ai_stand, 0.000, bum_talk_think, // frame 0
ai_stand, 0.000, bum_talk_think, // frame 1
ai_stand, 0.000, bum_talk_think, // frame 2
ai_stand, 0.000, bum_talk_think, // frame 3
ai_stand, 0.000, bum_talk_think, // frame 4
ai_stand, 0.000, bum_talk_think, // frame 5
ai_stand, 0.000, bum_talk_think, // frame 6
ai_stand, 0.000, bum_talk_think, // frame 7
ai_stand, 0.000, bum_talk_think, // frame 8
ai_stand, 0.000, bum_talk_think, // frame 9
ai_stand, 0.000, bum_talk_think, // frame 10
ai_stand, 0.000, bum_talk_think, // frame 11
ai_stand, 0.000, bum_talk_think, // frame 12
ai_stand, 0.000, bum_talk_think, // frame 13
ai_stand, 0.000, bum_talk_think, // frame 14
ai_stand, 0.000, bum_talk_think, // frame 15
ai_stand, 0.000, bum_talk_think, // frame 16
ai_stand, 0.000, bum_talk_think, // frame 17
ai_stand, 0.000, bum_talk_think, // frame 18
ai_stand, 0.000, bum_talk_think, // frame 19
ai_stand, 0.000, bum_talk_think, // frame 20
ai_stand, 0.000, bum_talk_think, // frame 21
ai_stand, 0.000, bum_talk_think, // frame 22
ai_stand, 0.000, bum_talk_think, // frame 23
ai_stand, 0.000, bum_talk_think, // frame 24
ai_stand, 0.000, bum_talk_think, // frame 25
ai_stand, 0.000, bum_talk_think, // frame 26
ai_stand, 0.000, bum_talk_think, // frame 27
ai_stand, 0.000, bum_talk_think, // frame 28
ai_stand, 0.000, bum_talk_think, // frame 29
ai_stand, 0.000, bum_talk_think, // frame 30
ai_stand, 0.000, bum_talk_think, // frame 31
ai_stand, 0.000, bum_talk_think, // frame 32
};
mmove_t bum_sit_move_leg_shuf = {FRAME_leg_shuf_01, FRAME_leg_shuf_33, bum_sit_frames_leg_shuf, bum_sit_end_sit};
mframe_t bum_sit_frames_swat_fly[] =
{
ai_stand, 0.000, bum_talk_think, // frame 0
ai_stand, 0.000, bum_talk_think, // frame 1
ai_stand, 0.000, bum_talk_think, // frame 2
ai_stand, 0.000, bum_talk_think, // frame 3
ai_stand, 0.000, bum_talk_think, // frame 4
ai_stand, 0.000, bum_talk_think, // frame 5
ai_stand, 0.000, bum_talk_think, // frame 6
ai_stand, 0.000, bum_talk_think, // frame 7
ai_stand, 0.000, bum_talk_think, // frame 8
ai_stand, 0.000, bum_talk_think, // frame 9
ai_stand, 0.000, bum_talk_think, // frame 10
ai_stand, 0.000, bum_talk_think, // frame 11
ai_stand, 0.000, bum_talk_think, // frame 12
ai_stand, 0.000, bum_talk_think, // frame 13
ai_stand, 0.000, bum_talk_think, // frame 14
ai_stand, 0.000, bum_talk_think, // frame 15
ai_stand, 0.000, bum_talk_think, // frame 16
ai_stand, 0.000, bum_talk_think, // frame 17
ai_stand, 0.000, bum_talk_think, // frame 18
ai_stand, 0.000, bum_talk_think, // frame 19
ai_stand, 0.000, bum_talk_think, // frame 20
ai_stand, 0.000, bum_talk_think, // frame 21
ai_stand, 0.000, bum_talk_think, // frame 22
ai_stand, 0.000, bum_talk_think, // frame 23
ai_stand, 0.000, bum_talk_think, // frame 24
ai_stand, 0.000, bum_talk_think, // frame 25
ai_stand, 0.000, bum_talk_think, // frame 26
ai_stand, 0.000, bum_talk_think, // frame 27
ai_stand, 0.000, bum_talk_think, // frame 28
ai_stand, 0.000, bum_talk_think, // frame 29
ai_stand, 0.000, bum_talk_think, // frame 30
ai_stand, 0.000, bum_talk_think, // frame 31
ai_stand, 0.000, bum_talk_think, // frame 32
ai_stand, 0.000, bum_talk_think, // frame 33
ai_stand, 0.000, bum_talk_think, // frame 34
ai_stand, 0.000, bum_talk_think, // frame 35
ai_stand, 0.000, bum_talk_think, // frame 36
ai_stand, 0.000, bum_talk_think, // frame 37
ai_stand, 0.000, bum_talk_think, // frame 38
ai_stand, 0.000, bum_talk_think, // frame 39
ai_stand, 0.000, bum_talk_think, // frame 40
ai_stand, 0.000, bum_talk_think, // frame 41
ai_stand, 0.000, bum_talk_think, // frame 42
ai_stand, 0.000, bum_talk_think, // frame 43
ai_stand, 0.000, bum_talk_think, // frame 44
ai_stand, 0.000, bum_talk_think, // frame 45
ai_stand, 0.000, bum_talk_think, // frame 46
ai_stand, 0.000, bum_talk_think, // frame 47
ai_stand, 0.000, bum_talk_think, // frame 48
ai_stand, 0.000, bum_talk_think, // frame 49
ai_stand, 0.000, bum_talk_think, // frame 50
ai_stand, 0.000, bum_talk_think, // frame 51
ai_stand, 0.000, bum_talk_think, // frame 52
ai_stand, 0.000, bum_talk_think, // frame 53
ai_stand, 0.000, bum_talk_think, // frame 54
};
mmove_t bum_sit_move_swat_fly = {FRAME_swat_fly_01, FRAME_swat_fly_55, bum_sit_frames_swat_fly, bum_sit_end_sit};
mframe_t bum_sit_frames_swat_fly_onfire[] =
{
ai_stand_onfire, 0.000, NULL, // frame 0
ai_stand_onfire, 0.000, NULL, // frame 1
ai_stand_onfire, 0.000, NULL, // frame 2
ai_stand_onfire, 0.000, NULL, // frame 3
ai_stand_onfire, 0.000, NULL, // frame 4
ai_stand_onfire, 0.000, NULL, // frame 5
ai_stand_onfire, 0.000, NULL, // frame 6
ai_stand_onfire, 0.000, NULL, // frame 7
ai_stand_onfire, 0.000, NULL, // frame 8
ai_stand_onfire, 0.000, NULL, // frame 9
ai_stand_onfire, 0.000, NULL, // frame 10
ai_stand_onfire, 0.000, NULL, // frame 11
ai_stand_onfire, 0.000, NULL, // frame 12
ai_stand_onfire, 0.000, NULL, // frame 13
ai_stand_onfire, 0.000, NULL, // frame 14
ai_stand_onfire, 0.000, NULL, // frame 15
ai_stand_onfire, 0.000, NULL, // frame 16
ai_stand_onfire, 0.000, NULL, // frame 17
ai_stand_onfire, 0.000, NULL, // frame 18
ai_stand_onfire, 0.000, NULL, // frame 19
ai_stand_onfire, 0.000, NULL, // frame 20
ai_stand_onfire, 0.000, NULL, // frame 21
ai_stand_onfire, 0.000, NULL, // frame 22
ai_stand_onfire, 0.000, NULL, // frame 23
ai_stand_onfire, 0.000, NULL, // frame 24
ai_stand_onfire, 0.000, NULL, // frame 25
ai_stand_onfire, 0.000, NULL, // frame 26
ai_stand_onfire, 0.000, NULL, // frame 27
ai_stand_onfire, 0.000, NULL, // frame 28
ai_stand_onfire, 0.000, NULL, // frame 29
ai_stand_onfire, 0.000, NULL, // frame 30
ai_stand_onfire, 0.000, NULL, // frame 31
ai_stand_onfire, 0.000, NULL, // frame 32
ai_stand_onfire, 0.000, NULL, // frame 33
ai_stand_onfire, 0.000, NULL, // frame 34
ai_stand_onfire, 0.000, NULL, // frame 35
ai_stand_onfire, 0.000, NULL, // frame 36
ai_stand_onfire, 0.000, NULL, // frame 37
ai_stand_onfire, 0.000, NULL, // frame 38
ai_stand_onfire, 0.000, NULL, // frame 39
ai_stand_onfire, 0.000, NULL, // frame 40
ai_stand_onfire, 0.000, NULL, // frame 41
ai_stand_onfire, 0.000, NULL, // frame 42
ai_stand_onfire, 0.000, NULL, // frame 43
ai_stand_onfire, 0.000, NULL, // frame 44
ai_stand_onfire, 0.000, NULL, // frame 45
ai_stand_onfire, 0.000, NULL, // frame 46
ai_stand_onfire, 0.000, NULL, // frame 47
ai_stand_onfire, 0.000, NULL, // frame 48
ai_stand_onfire, 0.000, NULL, // frame 49
ai_stand_onfire, 0.000, NULL, // frame 50
ai_stand_onfire, 0.000, NULL, // frame 51
ai_stand_onfire, 0.000, NULL, // frame 52
ai_stand_onfire, 0.000, NULL, // frame 53
ai_stand_onfire, 0.000, NULL, // frame 54
};
mmove_t bum_sit_move_swat_fly_onfire = {FRAME_swat_fly_01, FRAME_swat_fly_55, bum_sit_frames_swat_fly_onfire, NULL};
mframe_t bum_sit_frames_cough_l[] =
{
/*ai_stand*/ NULL, 0.000, NULL, // frame 0
/*ai_stand*/ NULL, 0.000, NULL, // frame 1
/*ai_stand*/ NULL, 0.000, NULL, // frame 2
/*ai_stand*/ NULL, 0.000, NULL, // frame 3
/*ai_stand*/ NULL, 0.000, NULL, // frame 4
/*ai_stand*/ NULL, 0.000, NULL, // frame 5
/*ai_stand*/ NULL, 0.000, NULL, // frame 6
/*ai_stand*/ NULL, 0.000, NULL, // frame 7
/*ai_stand*/ NULL, 0.000, NULL, // frame 8
/*ai_stand*/ NULL, 0.000, NULL, // frame 9
/*ai_stand*/ NULL, 0.000, NULL, // frame 10
/*ai_stand*/ NULL, 0.000, NULL, // frame 11
/*ai_stand*/ NULL, 0.000, NULL, // frame 12
/*ai_stand*/ NULL, 0.000, NULL, // frame 13
/*ai_stand*/ NULL, 0.000, NULL, // frame 14
/*ai_stand*/ NULL, 0.000, NULL, // frame 15
/*ai_stand*/ NULL, 0.000, NULL, // frame 16
/*ai_stand*/ NULL, 0.000, NULL, // frame 17
/*ai_stand*/ NULL, 0.000, NULL, // frame 18
/*ai_stand*/ NULL, 0.000, NULL, // frame 19
/*ai_stand*/ NULL, 0.000, NULL, // frame 20
/*ai_stand*/ NULL, 0.000, NULL, // frame 21
/*ai_stand*/ NULL, 0.000, NULL, // frame 22
/*ai_stand*/ NULL, 0.000, NULL, // frame 23
/*ai_stand*/ NULL, 0.000, NULL, // frame 24
/*ai_stand*/ NULL, 0.000, NULL, // frame 25
/*ai_stand*/ NULL, 0.000, NULL, // frame 26
/*ai_stand*/ NULL, 0.000, NULL, // frame 27
/*ai_stand*/ NULL, 0.000, NULL, // frame 28
/*ai_stand*/ NULL, 0.000, NULL, // frame 29
/*ai_stand*/ NULL, 0.000, NULL, // frame 30
/*ai_stand*/ NULL, 0.000, NULL, // frame 31
/*ai_stand*/ NULL, 0.000, NULL, // frame 32
/*ai_stand*/ NULL, 0.000, NULL, // frame 33
/*ai_stand*/ NULL, 0.000, NULL, // frame 34
};
mmove_t bum_sit_move_cough_l = {FRAME_cough_l_01, FRAME_cough_l_35, bum_sit_frames_cough_l, bum_sit_end_sit};
mframe_t bum_sit_frames_pain_r[] =
{
/*ai_stand*/ NULL, 0.000, NULL, // frame 0
/*ai_stand*/ NULL, 0.000, NULL, // frame 1
/*ai_stand*/ NULL, 0.000, NULL, // frame 2
/*ai_stand*/ NULL, 0.000, NULL, // frame 3
/*ai_stand*/ NULL, 0.000, NULL, // frame 4
/*ai_stand*/ NULL, 0.000, NULL, // frame 5
/*ai_stand*/ NULL, 0.000, NULL, // frame 6
/*ai_stand*/ NULL, 0.000, NULL, // frame 7
/*ai_stand*/ NULL, 0.000, NULL, // frame 8
/*ai_stand*/ NULL, 0.000, NULL, // frame 9
/*ai_stand*/ NULL, 0.000, NULL, // frame 10
/*ai_stand*/ NULL, 0.000, NULL, // frame 11
/*ai_stand*/ NULL, 0.000, NULL, // frame 12
/*ai_stand*/ NULL, 0.000, NULL, // frame 13
};
mmove_t bum_sit_move_pain_r = {FRAME_pain_r_01, FRAME_pain_r_14, bum_sit_frames_pain_r, bum_sit_end_sit};
mframe_t bum_sit_frames_pain_l[] =
{
/*ai_stand*/ NULL, 0.000, NULL, // frame 0
/*ai_stand*/ NULL, 0.000, NULL, // frame 1
/*ai_stand*/ NULL, 0.000, NULL, // frame 2
/*ai_stand*/ NULL, 0.000, NULL, // frame 3
/*ai_stand*/ NULL, 0.000, NULL, // frame 4
/*ai_stand*/ NULL, 0.000, NULL, // frame 5
/*ai_stand*/ NULL, 0.000, NULL, // frame 6
/*ai_stand*/ NULL, 0.000, NULL, // frame 7
/*ai_stand*/ NULL, 0.000, NULL, // frame 8
/*ai_stand*/ NULL, 0.000, NULL, // frame 9
/*ai_stand*/ NULL, 0.000, NULL, // frame 10
/*ai_stand*/ NULL, 0.000, NULL, // frame 11
/*ai_stand*/ NULL, 0.000, NULL, // frame 12
/*ai_stand*/ NULL, 0.000, NULL, // frame 13
/*ai_stand*/ NULL, 0.000, NULL, // frame 14
/*ai_stand*/ NULL, 0.000, NULL, // frame 15
};
mmove_t bum_sit_move_pain_l = {FRAME_pain_l_01, FRAME_pain_l_16, bum_sit_frames_pain_l, bum_sit_end_sit};
mframe_t bum_sit_frames_death_r[] =
{
/*ai_stand*/ NULL, 0.000, NULL, // frame 0
/*ai_stand*/ NULL, 0.000, NULL, // frame 1
/*ai_stand*/ NULL, 0.000, NULL, // frame 2
/*ai_stand*/ NULL, 0.000, NULL, // frame 3
/*ai_stand*/ NULL, 0.000, NULL, // frame 4
/*ai_stand*/ NULL, 0.000, NULL, // frame 5
/*ai_stand*/ NULL, 0.000, NULL, // frame 6
/*ai_stand*/ NULL, 0.000, NULL, // frame 7
/*ai_stand*/ NULL, 0.000, NULL, // frame 8
/*ai_stand*/ NULL, 0.000, NULL, // frame 9
/*ai_stand*/ NULL, 0.000, NULL, // frame 10
/*ai_stand*/ NULL, 0.000, NULL, // frame 11
/*ai_stand*/ NULL, 0.000, NULL, // frame 12
/*ai_stand*/ NULL, 0.000, NULL, // frame 13
/*ai_stand*/ NULL, 0.000, NULL, // frame 14
/*ai_stand*/ NULL, 0.000, NULL, // frame 15
};
mmove_t bum_sit_move_death_r = {FRAME_death_r_01, FRAME_death_r_16, bum_sit_frames_death_r, AI_EndDeath};
mframe_t bum_sit_frames_death_l[] =
{
/*ai_stand*/ NULL, 0.000, NULL, // frame 0
/*ai_stand*/ NULL, 0.000, NULL, // frame 1
/*ai_stand*/ NULL, 0.000, NULL, // frame 2
/*ai_stand*/ NULL, 0.000, NULL, // frame 3
/*ai_stand*/ NULL, 0.000, NULL, // frame 4
/*ai_stand*/ NULL, 0.000, NULL, // frame 5
/*ai_stand*/ NULL, 0.000, NULL, // frame 6
/*ai_stand*/ NULL, 0.000, NULL, // frame 7
/*ai_stand*/ NULL, 0.000, NULL, // frame 8
/*ai_stand*/ NULL, 0.000, NULL, // frame 9
/*ai_stand*/ NULL, 0.000, NULL, // frame 10
/*ai_stand*/ NULL, 0.000, NULL, // frame 11
/*ai_stand*/ NULL, 0.000, NULL, // frame 12
/*ai_stand*/ NULL, 0.000, NULL, // frame 13
/*ai_stand*/ NULL, 0.000, NULL, // frame 14
/*ai_stand*/ NULL, 0.000, NULL, // frame 15
/*ai_stand*/ NULL, 0.000, NULL, // frame 16
};
mmove_t bum_sit_move_death_l = {FRAME_death_l_01, FRAME_death_l_17, bum_sit_frames_death_l, AI_EndDeath};
void ai_stand_onfire (edict_t *self, float dist)
{
if (self->onfiretime <= 0)
{ // stopping running around
self->cast_info.currentmove = self->cast_info.move_stand;
return;
}
if (!self->groundentity)
return;
}
void bum_talk_think (edict_t *self)
{
AI_TalkThink (self, true);
}
void bum_sit_end_sit (edict_t *self)
{
int rnd;
if (self->cast_info.currentmove == &bum_sit_move_cough_l)
rnd = rand() % 3;
else
rnd = rand() % 5;
if (rnd < 1)
self->cast_info.currentmove = &bum_sit_move_amb_sit;
else if (rnd < 2)
self->cast_info.currentmove = &bum_sit_move_leg_shuf;
else if (rnd < 3)
self->cast_info.currentmove = &bum_sit_move_swat_fly;
else
{
if (self->name_index == NAME_RUMMY || self->name_index == NAME_NICK)
self->cast_info.currentmove = &bum_sit_move_amb_sit;
else
self->cast_info.currentmove = &bum_sit_move_cough_l;
}
}
void bum_sit_pain (edict_t *self, edict_t *other, float kick, int damage, int mdx_part, int mdx_subobject)
{
if (level.time < self->pain_debounce_time)
return;
self->pain_debounce_time = level.time + 3 + random();
gi.sound ( self, CHAN_VOICE, gi.soundindex ("actors/bum/pain.wav"), 1, 3, 0);
if (rand()%100 > 50)
self->cast_info.currentmove = &bum_sit_move_pain_r;
else
self->cast_info.currentmove = &bum_sit_move_pain_l;
}
void bum_sit_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int mdx_part, int mdx_subobject)
{
// self->s.modelindex2 = 0;
self->takedamage = DAMAGE_YES;
if (DeathByGib(self, inflictor, attacker, damage))
{ // gib
self->deadflag = DEAD_DEAD;
GibEntity( self, inflictor, damage );
return;
}
if (self->deadflag == DEAD_DEAD)
return;
self->deadflag = DEAD_DEAD;
gi.sound ( self, CHAN_VOICE, gi.soundindex ("actors/bum/death.wav"), 1, 3, 0);
if (rand()%100 > 50)
self->cast_info.currentmove = &bum_sit_move_death_r;
else
self->cast_info.currentmove = &bum_sit_move_death_l;
}
void bum_avoid (edict_t *self, edict_t *other, qboolean face)
{
self->cast_info.currentmove = &bum_sit_move_swat_fly;
}
void bum_backoff (edict_t *self, edict_t *other )
{
Voice_Random (self, other, rummy, 0);
}
void bum_catch_on_fire (edict_t *self, edict_t *other)
{
self->enemy = NULL; // stop attacking
self->cast_info.currentmove = &bum_sit_move_swat_fly_onfire;
}
/*QUAKED cast_bum_sit (1 .5 0) (-24 -24 -24) (24 24 48) x TRIGGERED_START x x x
cast_group 0 neutral
They should only be neutrals
model="models\actors\bum_sit\"
*/
void SP_cast_bum_sit (edict_t *self)
{
int i;
char *head_skin, *body_skin, *legs_skin;
int skin;
if (deathmatch->value)
{
G_FreeEdict (self);
return;
}
self->movetype = MOVETYPE_STEP;
self->solid = SOLID_BBOX;
VectorSet (self->mins, -24, -24, -24);
VectorSet (self->maxs, 24, 24, 48);
self->s.skinnum = (self->skin-1) * 3;
if (!self->art_skins)
{ // use default skins
self->art_skins = "001 001 001";
}
if (self->art_skins)
{
// convert spaces to NULL's
for (i=0; i<11; i++)
if (self->art_skins[i] == ' ')
self->art_skins[i] = '\0';
head_skin = &self->art_skins[0];
body_skin = &self->art_skins[4];
legs_skin = &self->art_skins[8];
}
else
{
head_skin = body_skin = legs_skin = NULL;
}
// ------------------------------------------------------------------------
// initialize all model_part data
memset(&(self->s.model_parts[0]), 0, sizeof(model_part_t) * MAX_MODEL_PARTS);
self->s.num_parts++;
self->s.model_parts[PART_HEAD].modelindex = gi.modelindex("models/actors/bum_sit/head.mdx");
if (head_skin)
{
skin = gi.skinindex( self->s.model_parts[PART_HEAD].modelindex, head_skin );
}
else
skin = self->s.skinnum;
for (i=0; i<MAX_MODELPART_OBJECTS; i++)
self->s.model_parts[PART_HEAD].baseskin = self->s.model_parts[PART_HEAD].skinnum[i] = skin;
gi.GetObjectBounds( "models/actors/bum_sit/head.mdx", &self->s.model_parts[PART_HEAD] );
self->s.num_parts++;
self->s.model_parts[PART_LEGS].modelindex = gi.modelindex("models/actors/bum_sit/legs.mdx");
if (head_skin)
skin = gi.skinindex( self->s.model_parts[PART_LEGS].modelindex, legs_skin );
else
skin = self->s.skinnum;
for (i=0; i<MAX_MODELPART_OBJECTS; i++)
self->s.model_parts[PART_LEGS].baseskin = self->s.model_parts[PART_LEGS].skinnum[i] = skin;
gi.GetObjectBounds( "models/actors/bum_sit/legs.mdx", &self->s.model_parts[PART_LEGS] );
self->s.num_parts++;
self->s.model_parts[PART_BODY].modelindex = gi.modelindex("models/actors/bum_sit/body.mdx");
if (head_skin)
skin = gi.skinindex( self->s.model_parts[PART_BODY].modelindex, body_skin );
else
skin = self->s.skinnum;
for (i=0; i<MAX_MODELPART_OBJECTS; i++)
self->s.model_parts[PART_BODY].baseskin = self->s.model_parts[PART_BODY].skinnum[i] = skin;
gi.GetObjectBounds( "models/actors/bum_sit/body.mdx", &self->s.model_parts[PART_BODY] );
if (self->count & 1) // cigar
{
self->s.num_parts++;
self->s.model_parts[PART_CIGAR].modelindex = gi.modelindex("models/actors/bum_sit/cigar.mdx");
for (i=0; i<MAX_MODELPART_OBJECTS; i++)
self->s.model_parts[PART_CIGAR].baseskin = self->s.model_parts[PART_CIGAR].skinnum[i] = 0;
gi.GetObjectBounds( "models/actors/runt/cigar.mdx", &self->s.model_parts[PART_CIGAR] );
}
if (self->count & 2) // fedora hat
{
self->s.num_parts++;
self->s.model_parts[PART_HAT].modelindex = gi.modelindex("models/actors/bum_sit/fedora.mdx");
for (i=0; i<MAX_MODELPART_OBJECTS; i++)
self->s.model_parts[PART_HAT].baseskin = self->s.model_parts[PART_HAT].skinnum[i] = 0;
gi.GetObjectBounds( "models/actors/bum_sit/fedora.mdx", &self->s.model_parts[PART_HAT] );
}
else if (self->count & 4) // stetson hat
{
self->s.num_parts++;
self->s.model_parts[PART_HAT].modelindex = gi.modelindex("models/actors/bum_sit/stetson.mdx");
for (i=0; i<MAX_MODELPART_OBJECTS; i++)
self->s.model_parts[PART_HAT].baseskin = self->s.model_parts[PART_HAT].skinnum[i] = 0;
gi.GetObjectBounds( "models/actors/bum_sit/stetson.mdx", &self->s.model_parts[PART_HAT] );
}
else if (self->count & 8) // cap (hat)
{
self->s.num_parts++;
self->s.model_parts[PART_HAT].modelindex = gi.modelindex("models/actors/bum_sit/cap.mdx");
for (i=0; i<MAX_MODELPART_OBJECTS; i++)
self->s.model_parts[PART_HAT].baseskin = self->s.model_parts[PART_HAT].skinnum[i] = 0;
gi.GetObjectBounds( "models/actors/bum_sit/cap.mdx", &self->s.model_parts[PART_HAT] );
}
// remove NULL's
if (self->art_skins)
self->art_skins[3] = self->art_skins[7] = ' ';
// ------------------------------------------------------------------------
if (!(self->health))
self->health = 100;
self->gib_health = -200;
self->mass = 200;
self->gender = GENDER_MALE;
self->pain = bum_sit_pain;
self->die = bum_sit_die;
self->cast_info.checkattack = NULL;
self->cast_info.attack = NULL;
self->cast_info.long_attack = NULL;
self->cast_info.talk = bum_sit_end_sit;
self->cast_info.avoid = bum_avoid;
self->cast_info.backoff = bum_backoff;
self->cast_info.catch_fire = bum_catch_on_fire;
self->cast_info.max_attack_distance = 64;
self->cast_info.move_stand = &bum_sit_move_amb_sit;
self->cast_info.move_crstand = NULL;
self->cast_info.move_run = NULL;
self->cast_info.move_runwalk = NULL;
self->cast_info.move_crwalk = NULL;
self->cast_info.move_jump = NULL;
self->cast_info.move_avoid_walk = NULL;
self->cast_info.move_avoid_run = NULL;
self->cast_info.move_avoid_reverse_walk = NULL;
self->cast_info.move_avoid_reverse_run = NULL;
self->cast_info.move_avoid_crwalk = NULL;
self->cast_info.move_crouch_down = NULL;
self->cast_info.move_stand_up = NULL;
self->cast_info.move_lside_step = NULL;
self->cast_info.move_rside_step = NULL;
self->cast_info.move_start_climb = NULL;
self->cast_info.move_end_climb = NULL;
self->cast_info.move_evade = NULL;
self->cast_info.move_stand_evade = NULL;
gi.linkentity (self);
self->cast_info.currentmove = self->cast_info.move_stand;
if (!self->cast_info.scale)
self->cast_info.scale = MODEL_SCALE;
self->s.scale = self->cast_info.scale - 1.0;
// talk by default
// self->cast_info.aiflags |= AI_NO_TALK;
self->cast_info.aiflags |= (AI_TALK | AI_NOWALK_FACE);
walking_cast_start (self);
}

240
gamesrc/ai_bum_sit.h Normal file
View file

@ -0,0 +1,240 @@
#define FRAME_amb_sit_01 0
#define FRAME_amb_sit_02 1
#define FRAME_amb_sit_03 2
#define FRAME_amb_sit_04 3
#define FRAME_amb_sit_05 4
#define FRAME_amb_sit_06 5
#define FRAME_amb_sit_07 6
#define FRAME_amb_sit_08 7
#define FRAME_amb_sit_09 8
#define FRAME_amb_sit_10 9
#define FRAME_amb_sit_11 10
#define FRAME_amb_sit_12 11
#define FRAME_amb_sit_13 12
#define FRAME_amb_sit_14 13
#define FRAME_amb_sit_15 14
#define FRAME_amb_sit_16 15
#define FRAME_amb_sit_17 16
#define FRAME_amb_sit_18 17
#define FRAME_amb_sit_19 18
#define FRAME_amb_sit_20 19
#define FRAME_amb_sit_21 20
#define FRAME_amb_sit_22 21
#define FRAME_amb_sit_23 22
#define FRAME_amb_sit_24 23
#define FRAME_amb_sit_25 24
#define FRAME_amb_sit_26 25
#define FRAME_amb_sit_27 26
#define FRAME_amb_sit_28 27
#define FRAME_amb_sit_29 28
#define FRAME_amb_sit_30 29
#define FRAME_amb_sit_31 30
#define FRAME_amb_sit_32 31
#define FRAME_amb_sit_33 32
#define FRAME_amb_sit_34 33
#define FRAME_amb_sit_35 34
#define FRAME_amb_sit_36 35
#define FRAME_amb_sit_37 36
#define FRAME_amb_sit_38 37
#define FRAME_amb_sit_39 38
#define FRAME_amb_sit_40 39
#define FRAME_amb_sit_41 40
#define FRAME_amb_sit_42 41
#define FRAME_amb_sit_43 42
#define FRAME_amb_sit_44 43
#define FRAME_amb_sit_45 44
#define FRAME_amb_sit_46 45
#define FRAME_amb_sit_47 46
#define FRAME_amb_sit_48 47
#define FRAME_amb_sit_49 48
#define FRAME_amb_sit_50 49
#define FRAME_amb_sit_51 50
#define FRAME_amb_sit_52 51
#define FRAME_leg_shuf_01 52
#define FRAME_leg_shuf_02 53
#define FRAME_leg_shuf_03 54
#define FRAME_leg_shuf_04 55
#define FRAME_leg_shuf_05 56
#define FRAME_leg_shuf_06 57
#define FRAME_leg_shuf_07 58
#define FRAME_leg_shuf_08 59
#define FRAME_leg_shuf_09 60
#define FRAME_leg_shuf_10 61
#define FRAME_leg_shuf_11 62
#define FRAME_leg_shuf_12 63
#define FRAME_leg_shuf_13 64
#define FRAME_leg_shuf_14 65
#define FRAME_leg_shuf_15 66
#define FRAME_leg_shuf_16 67
#define FRAME_leg_shuf_17 68
#define FRAME_leg_shuf_18 69
#define FRAME_leg_shuf_19 70
#define FRAME_leg_shuf_20 71
#define FRAME_leg_shuf_21 72
#define FRAME_leg_shuf_22 73
#define FRAME_leg_shuf_23 74
#define FRAME_leg_shuf_24 75
#define FRAME_leg_shuf_25 76
#define FRAME_leg_shuf_26 77
#define FRAME_leg_shuf_27 78
#define FRAME_leg_shuf_28 79
#define FRAME_leg_shuf_29 80
#define FRAME_leg_shuf_30 81
#define FRAME_leg_shuf_31 82
#define FRAME_leg_shuf_32 83
#define FRAME_leg_shuf_33 84
#define FRAME_swat_fly_01 85
#define FRAME_swat_fly_02 86
#define FRAME_swat_fly_03 87
#define FRAME_swat_fly_04 88
#define FRAME_swat_fly_05 89
#define FRAME_swat_fly_06 90
#define FRAME_swat_fly_07 91
#define FRAME_swat_fly_08 92
#define FRAME_swat_fly_09 93
#define FRAME_swat_fly_10 94
#define FRAME_swat_fly_11 95
#define FRAME_swat_fly_12 96
#define FRAME_swat_fly_13 97
#define FRAME_swat_fly_14 98
#define FRAME_swat_fly_15 99
#define FRAME_swat_fly_16 100
#define FRAME_swat_fly_17 101
#define FRAME_swat_fly_18 102
#define FRAME_swat_fly_19 103
#define FRAME_swat_fly_20 104
#define FRAME_swat_fly_21 105
#define FRAME_swat_fly_22 106
#define FRAME_swat_fly_23 107
#define FRAME_swat_fly_24 108
#define FRAME_swat_fly_25 109
#define FRAME_swat_fly_26 110
#define FRAME_swat_fly_27 111
#define FRAME_swat_fly_28 112
#define FRAME_swat_fly_29 113
#define FRAME_swat_fly_30 114
#define FRAME_swat_fly_31 115
#define FRAME_swat_fly_32 116
#define FRAME_swat_fly_33 117
#define FRAME_swat_fly_34 118
#define FRAME_swat_fly_35 119
#define FRAME_swat_fly_36 120
#define FRAME_swat_fly_37 121
#define FRAME_swat_fly_38 122
#define FRAME_swat_fly_39 123
#define FRAME_swat_fly_40 124
#define FRAME_swat_fly_41 125
#define FRAME_swat_fly_42 126
#define FRAME_swat_fly_43 127
#define FRAME_swat_fly_44 128
#define FRAME_swat_fly_45 129
#define FRAME_swat_fly_46 130
#define FRAME_swat_fly_47 131
#define FRAME_swat_fly_48 132
#define FRAME_swat_fly_49 133
#define FRAME_swat_fly_50 134
#define FRAME_swat_fly_51 135
#define FRAME_swat_fly_52 136
#define FRAME_swat_fly_53 137
#define FRAME_swat_fly_54 138
#define FRAME_swat_fly_55 139
#define FRAME_cough_l_01 140
#define FRAME_cough_l_02 141
#define FRAME_cough_l_03 142
#define FRAME_cough_l_04 143
#define FRAME_cough_l_05 144
#define FRAME_cough_l_06 145
#define FRAME_cough_l_07 146
#define FRAME_cough_l_08 147
#define FRAME_cough_l_09 148
#define FRAME_cough_l_10 149
#define FRAME_cough_l_11 150
#define FRAME_cough_l_12 151
#define FRAME_cough_l_13 152
#define FRAME_cough_l_14 153
#define FRAME_cough_l_15 154
#define FRAME_cough_l_16 155
#define FRAME_cough_l_17 156
#define FRAME_cough_l_18 157
#define FRAME_cough_l_19 158
#define FRAME_cough_l_20 159
#define FRAME_cough_l_21 160
#define FRAME_cough_l_22 161
#define FRAME_cough_l_23 162
#define FRAME_cough_l_24 163
#define FRAME_cough_l_25 164
#define FRAME_cough_l_26 165
#define FRAME_cough_l_27 166
#define FRAME_cough_l_28 167
#define FRAME_cough_l_29 168
#define FRAME_cough_l_30 169
#define FRAME_cough_l_31 170
#define FRAME_cough_l_32 171
#define FRAME_cough_l_33 172
#define FRAME_cough_l_34 173
#define FRAME_cough_l_35 174
#define FRAME_pain_r_01 175
#define FRAME_pain_r_02 176
#define FRAME_pain_r_03 177
#define FRAME_pain_r_04 178
#define FRAME_pain_r_05 179
#define FRAME_pain_r_06 180
#define FRAME_pain_r_07 181
#define FRAME_pain_r_08 182
#define FRAME_pain_r_09 183
#define FRAME_pain_r_10 184
#define FRAME_pain_r_11 185
#define FRAME_pain_r_12 186
#define FRAME_pain_r_13 187
#define FRAME_pain_r_14 188
#define FRAME_pain_l_01 189
#define FRAME_pain_l_02 190
#define FRAME_pain_l_03 191
#define FRAME_pain_l_04 192
#define FRAME_pain_l_05 193
#define FRAME_pain_l_06 194
#define FRAME_pain_l_07 195
#define FRAME_pain_l_08 196
#define FRAME_pain_l_09 197
#define FRAME_pain_l_10 198
#define FRAME_pain_l_11 199
#define FRAME_pain_l_12 200
#define FRAME_pain_l_13 201
#define FRAME_pain_l_14 202
#define FRAME_pain_l_15 203
#define FRAME_pain_l_16 204
#define FRAME_death_r_01 205
#define FRAME_death_r_02 206
#define FRAME_death_r_03 207
#define FRAME_death_r_04 208
#define FRAME_death_r_05 209
#define FRAME_death_r_06 210
#define FRAME_death_r_07 211
#define FRAME_death_r_08 212
#define FRAME_death_r_09 213
#define FRAME_death_r_10 214
#define FRAME_death_r_11 215
#define FRAME_death_r_12 216
#define FRAME_death_r_13 217
#define FRAME_death_r_14 218
#define FRAME_death_r_15 219
#define FRAME_death_r_16 220
#define FRAME_death_l_01 221
#define FRAME_death_l_02 222
#define FRAME_death_l_03 223
#define FRAME_death_l_04 224
#define FRAME_death_l_05 225
#define FRAME_death_l_06 226
#define FRAME_death_l_07 227
#define FRAME_death_l_08 228
#define FRAME_death_l_09 229
#define FRAME_death_l_10 230
#define FRAME_death_l_11 231
#define FRAME_death_l_12 232
#define FRAME_death_l_13 233
#define FRAME_death_l_14 234
#define FRAME_death_l_15 235
#define FRAME_death_l_16 236
#define FRAME_death_l_17 237
#define MODEL_SCALE 1.000000

304
gamesrc/ai_dog_tables.h Normal file
View file

@ -0,0 +1,304 @@
mframe_t dog_frames_amb[] =
{
ai_stand, 0.000, dog_talk_think, // frame 0
ai_stand, 0.000, dog_talk_think, // frame 1
ai_stand, 0.000, dog_talk_think, // frame 2
ai_stand, 0.000, dog_talk_think, // frame 3
ai_stand, 0.000, dog_talk_think, // frame 4
ai_stand, 0.000, dog_talk_think, // frame 5
ai_stand, 0.000, dog_talk_think, // frame 6
ai_stand, 0.000, dog_talk_think, // frame 7
ai_stand, 0.000, dog_talk_think, // frame 8
ai_stand, 0.000, dog_talk_think, // frame 9
ai_stand, 0.000, dog_talk_think, // frame 10
ai_stand, 0.000, dog_talk_think, // frame 11
};
mmove_t dog_move_amb = {FRAME_amb_01, FRAME_amb_12, dog_frames_amb, dog_end_stand};
mframe_t dog_frames_pant[] =
{
ai_stand, 0.000, dog_talk_think, // frame 0
ai_stand, 0.000, dog_talk_think, // frame 1
ai_stand, 0.000, dog_talk_think, // frame 2
ai_stand, 0.000, dog_talk_think, // frame 3
ai_stand, 0.000, dog_talk_think, // frame 4
ai_stand, 0.000, dog_talk_think, // frame 5
ai_stand, 0.000, dog_talk_think, // frame 6
ai_stand, 0.000, dog_talk_think, // frame 7
ai_stand, 0.000, dog_talk_think, // frame 8
ai_stand, 0.000, dog_talk_think, // frame 9
ai_stand, 0.000, dog_talk_think, // frame 10
ai_stand, 0.000, dog_talk_think, // frame 11
ai_stand, 0.000, dog_talk_think, // frame 12
ai_stand, 0.000, dog_talk_think, // frame 13
};
mmove_t dog_move_pant = {FRAME_pant_01, FRAME_pant_14, dog_frames_pant, dog_end_stand};
mframe_t dog_frames_sniff[] =
{
ai_stand, 0.000, dog_talk_think, // frame 0
ai_stand, 0.000, dog_talk_think, // frame 1
ai_stand, 0.000, dog_talk_think, // frame 2
ai_stand, 0.000, dog_talk_think, // frame 3
ai_stand, 0.000, dog_talk_think, // frame 4
ai_stand, 0.000, dog_talk_think, // frame 5
ai_stand, 0.000, dog_talk_think, // frame 6
ai_stand, 0.000, dog_talk_think, // frame 7
ai_stand, 0.000, dog_talk_think, // frame 8
ai_stand, 0.000, dog_talk_think, // frame 9
ai_stand, 0.000, dog_talk_think, // frame 10
ai_stand, 0.000, dog_talk_think, // frame 11
ai_stand, 0.000, dog_talk_think, // frame 12
ai_stand, 0.000, dog_talk_think, // frame 13
ai_stand, 0.000, dog_talk_think, // frame 14
ai_stand, 0.000, dog_talk_think, // frame 15
ai_stand, 0.000, dog_talk_think, // frame 16
ai_stand, 0.000, dog_talk_think, // frame 17
ai_stand, 0.000, dog_talk_think, // frame 18
ai_stand, 0.000, dog_talk_think, // frame 19
};
mmove_t dog_move_sniff = {FRAME_sniff_01, FRAME_sniff_20, dog_frames_sniff, dog_end_stand};
mframe_t dog_frames_bark[] =
{
ai_stand, 0.000, dog_talk_think, // frame 0
ai_stand, 0.000, dog_bark, // frame 1
ai_stand, 0.000, dog_talk_think, // frame 2
ai_stand, 0.000, dog_talk_think, // frame 3
ai_stand, 0.000, dog_bark, // frame 4
ai_stand, 0.000, dog_talk_think, // frame 5
ai_stand, 0.000, dog_talk_think, // frame 6
ai_stand, 0.000, dog_talk_think, // frame 7
ai_stand, 0.000, dog_talk_think, // frame 8
};
mmove_t dog_move_bark = {FRAME_bark_01, FRAME_bark_09, dog_frames_bark, dog_end_stand};
mframe_t dog_frames_growl[] =
{
ai_stand, 0.000, dog_growl, // frame 0
ai_stand, 0.000, NULL, // frame 1
ai_stand, 0.000, NULL, // frame 2
ai_stand, 0.000, NULL, // frame 3
ai_stand, 0.000, NULL, // frame 4
};
mmove_t dog_move_growl = {FRAME_growl_01, FRAME_growl_05, dog_frames_growl, dog_end_stand};
mframe_t enemy_dog_frames_pee[] =
{
NULL, 0.000, NULL, // frame 0
NULL, 0.000, NULL, // frame 1
NULL, 0.000, NULL, // frame 2
NULL, 0.000, NULL, // frame 3
NULL, 0.000, NULL, // frame 4
NULL, 0.000, NULL, // frame 5
NULL, 0.000, NULL, // frame 6
NULL, 0.000, NULL, // frame 7
NULL, 0.000, NULL, // frame 8
NULL, 0.000, NULL, // frame 9
NULL, 0.000, NULL, // frame 10
NULL, 0.000, NULL, // frame 11
};
mmove_t enemy_dog_move_pee = {FRAME_pee_01, FRAME_pee_12, enemy_dog_frames_pee, dog_end_stand};
mframe_t dog_frames_low_atk[] =
{
ai_turn2, 0.000, NULL, // frame 0
ai_turn2, 8.570, dog_bite, // frame 1
ai_turn2, 11.397, dog_bite, // frame 2
ai_turn2, 5.512, NULL, // frame 3
ai_turn2, 1.776, dog_bite, // frame 4
ai_turn2, -0.788, dog_bite, // frame 5
ai_turn2, 0.808, NULL, // frame 6
ai_turn2, -1.987, NULL, // frame 7
};
mmove_t dog_move_low_atk = {FRAME_low_atk_01, FRAME_low_atk_08, dog_frames_low_atk, AI_EndAttack};
mframe_t dog_frames_med_atk[] =
{
ai_turn2, 0.000, NULL, // frame 0
ai_turn2, 16.169, NULL, // frame 1
ai_turn2, 6.894, dog_bite, // frame 2
ai_turn2, 3.803, dog_bite, // frame 3
ai_turn2, -4.625, dog_bite, // frame 4
ai_turn2, 1.215, dog_bite, // frame 5
ai_turn2, 0.501, NULL, // frame 6
};
mmove_t dog_move_med_atk = {FRAME_med_atk_01, FRAME_med_atk_07, dog_frames_med_atk, AI_EndAttack};
mframe_t dog_frames_upr_atk[] =
{
NULL, 0.004, NULL, // frame 0
NULL, 5.304, dog_pounce, // frame 1
NULL, 0.102, dog_pounce, // frame 2
NULL, 8.523, dog_pounce, // frame 3
NULL, 19.589, dog_bite, // frame 4
NULL, 3.179, dog_pounce, // frame 5
NULL, 18.590, dog_bite, // frame 6
NULL, 4.629, dog_pounce, // frame 7
NULL, -4.434, dog_bite, // frame 8
NULL, 3.514, dog_bite, // frame 9
};
mmove_t dog_move_upr_atk = {FRAME_upr_atk_01, FRAME_upr_atk_10, dog_frames_upr_atk, AI_EndAttack};
mframe_t dog_frames_pain1[] =
{
ai_move, 0.712, NULL, // frame 0
ai_move, -0.637, NULL, // frame 1
ai_move, -35.731, NULL, // frame 2
ai_move, -17.782, NULL, // frame 3
ai_move, -1.044, NULL, // frame 4
};
mmove_t dog_move_pain1 = {FRAME_pain1_01, FRAME_pain1_05, dog_frames_pain1, AI_EndAttack};
mframe_t dog_frames_pain2[] =
{
ai_move, -0.405, NULL, // frame 0
ai_move, -2.011, NULL, // frame 1
ai_move, -25.452, NULL, // frame 2
ai_move, -24.575, NULL, // frame 3
ai_move, -3.124, NULL, // frame 4
ai_move, -2.106, NULL, // frame 5
ai_move, 2.975, NULL, // frame 6
};
mmove_t dog_move_pain2 = {FRAME_pain2_01, FRAME_pain2_07, dog_frames_pain2, AI_EndAttack};
mframe_t dog_frames_pain3[] =
{
ai_move, 0.000, NULL, // frame 0
ai_move, 0.000, NULL, // frame 1
ai_move, 0.000, NULL, // frame 2
ai_move, 0.000, NULL, // frame 3
ai_move, 0.000, NULL, // frame 4
};
mmove_t dog_move_pain3 = {FRAME_pain3_01, FRAME_pain3_05, dog_frames_pain3, AI_EndAttack};
mframe_t dog_frames_death1[] =
{
ai_move, -1.383, NULL, // frame 0
ai_move, -23.848, NULL, // frame 1
ai_move, -39.326, NULL, // frame 2
ai_move, -4.539, NULL, // frame 3
ai_move, 5.228, NULL, // frame 4
ai_move, -1.049, NULL, // frame 5
ai_move, -1.829, NULL, // frame 6
ai_move, 0.942, NULL, // frame 7
ai_move, 1.584, NULL, // frame 8
ai_move, 0.862, NULL, // frame 9
ai_move, 0.140, NULL, // frame 10
ai_move, 0.160, NULL, // frame 11
ai_move, -0.249, NULL, // frame 12
ai_move, -0.246, NULL, // frame 12
ai_move, 0.217, NULL, // frame 12
ai_move, 0.650, NULL, // frame 12
ai_move, 0.000, NULL, // frame 12
};
mmove_t dog_move_death1 = {FRAME_death1_01, FRAME_death1_17, dog_frames_death1, AI_EndDeath};
mframe_t dog_frames_death2[] =
{
ai_move, 0.000, NULL, // frame 0
ai_move, -9.109, NULL, // frame 1
ai_move, -8.657, NULL, // frame 2
ai_move, -10.863, NULL, // frame 3
ai_move, -2.848, NULL, // frame 4
ai_move, -0.382, NULL, // frame 5
ai_move, 0.707, NULL, // frame 6
ai_move, -0.066, NULL, // frame 7
ai_move, 0.067, NULL, // frame 8
};
mmove_t dog_move_death2 = {FRAME_death2_01, FRAME_death2_09, dog_frames_death2, AI_EndDeath};
mframe_t dog_frames_walk[] =
{
ai_run, 0.022, NULL, // frame 0
ai_run, 0.120, NULL, // frame 1
ai_run, 0.127, NULL, // frame 2
ai_run, 0.026, NULL, // frame 3
ai_run, -0.324, NULL, // frame 4
ai_run, -0.720, NULL, // frame 5
ai_run, -0.664, NULL, // frame 6
ai_run, -0.627, NULL, // frame 7
ai_run, -0.346, NULL, // frame 8
ai_run, 0.031, NULL, // frame 9
ai_run, 0.408, NULL, // frame 10
ai_run, 0.707, NULL, // frame 11
ai_run, 0.761, NULL, // frame 12
};
mmove_t dog_move_walk = {FRAME_walk_01, FRAME_walk_13, dog_frames_walk, NULL};
mframe_t dog_frames_trot[] =
{
ai_run, 3.512, NULL, // frame 0
ai_run, 6.911, NULL, // frame 1
ai_run, 2.456, NULL, // frame 2
ai_run, 4.272, NULL, // frame 3
ai_run, 5.160, NULL, // frame 4
ai_run, 4.942, NULL, // frame 5
ai_run, 4.272, NULL, // frame 6
ai_run, 6.615, NULL, // frame 7
};
mmove_t dog_move_trot = {FRAME_trot_01, FRAME_trot_08, dog_frames_trot, AI_EndRun};
mframe_t dog_frames_run[] =
{
ai_run, 11.155, NULL, // frame 0
ai_run, 25.162, NULL, // frame 1
ai_run, 27.589, NULL, // frame 2
ai_run, 21.692, NULL, // frame 3
};
mmove_t dog_move_run = {FRAME_run_01, FRAME_run_04, dog_frames_run, AI_EndRun};
mframe_t dog_frames_run_on_fire[] =
{
ai_onfire_run, 11.155, NULL, // frame 0
ai_onfire_run, 25.162, NULL, // frame 1
ai_onfire_run, 27.589, NULL, // frame 2
ai_onfire_run, 21.692, NULL, // frame 3
};
mmove_t dog_move_run_on_fire = {FRAME_run_01, FRAME_run_04, dog_frames_run_on_fire, NULL};
mframe_t dog_frames_avoid_walk[] =
{
ai_turn, 3.512, NULL, // frame 0
ai_turn, 6.911, NULL, // frame 1
ai_turn, 2.456, NULL, // frame 2
ai_turn, 4.272, NULL, // frame 3
ai_turn, 5.160, NULL, // frame 4
ai_turn, 4.942, NULL, // frame 5
ai_turn, 4.272, NULL, // frame 6
ai_turn, 6.615, NULL, // frame 7
};
mmove_t dog_move_avoid_walk = {FRAME_trot_01, FRAME_trot_08, dog_frames_avoid_walk, AI_EndAttack};
mframe_t dog_frames_avoid_reverse_walk[] =
{
ai_turn, 6.615, NULL, // frame 0
ai_turn, 4.272, NULL, // frame 1
ai_turn, 4.942, NULL, // frame 2
ai_turn, 5.160, NULL, // frame 3
ai_turn, 4.272, NULL, // frame 4
ai_turn, 2.456, NULL, // frame 5
ai_turn, 6.911, NULL, // frame 6
ai_turn, 3.512, NULL, // frame 7
};
mmove_t dog_move_avoid_reverse_walk = {FRAME_trot_08, FRAME_trot_01, dog_frames_avoid_reverse_walk, AI_EndAttack};
mframe_t dog_frames_avoid_run[] =
{
ai_turn, 11.155, NULL, // frame 0
ai_turn, 25.162, NULL, // frame 1
ai_turn, 27.589, NULL, // frame 2
ai_turn, 21.692, NULL, // frame 3
};
mmove_t dog_move_avoid_run = {FRAME_run_01, FRAME_run_04, dog_frames_avoid_run, AI_EndAttack};
mframe_t dog_frames_avoid_reverse_run[] =
{
ai_turn, 21.692, NULL, // frame 0
ai_turn, 27.589, NULL, // frame 1
ai_turn, 25.162, NULL, // frame 2
ai_turn, 11.155, NULL, // frame 3
};
mmove_t dog_move_avoid_reverse_run = {FRAME_run_04, FRAME_run_01, dog_frames_avoid_reverse_run, AI_EndAttack};

1695
gamesrc/ai_punk_tables.h Normal file

File diff suppressed because it is too large Load diff

1590
gamesrc/ai_runt_tables.h Normal file

File diff suppressed because it is too large Load diff

1576
gamesrc/ai_shorty.c Normal file

File diff suppressed because it is too large Load diff

719
gamesrc/ai_shorty.h Normal file
View file

@ -0,0 +1,719 @@
#define FRAME_stand_01 0
#define FRAME_stand_02 1
#define FRAME_stand_03 2
#define FRAME_stand_04 3
#define FRAME_stand_05 4
#define FRAME_stand_06 5
#define FRAME_stand_07 6
#define FRAME_stand_08 7
#define FRAME_stand_09 8
#define FRAME_stand_10 9
#define FRAME_stand_11 10
#define FRAME_stand_12 11
#define FRAME_stand_13 12
#define FRAME_stand_14 13
#define FRAME_stand_15 14
#define FRAME_stand_16 15
#define FRAME_stand_17 16
#define FRAME_stand_18 17
#define FRAME_stand_19 18
#define FRAME_stand_20 19
#define FRAME_stand_21 20
#define FRAME_stand_22 21
#define FRAME_tg_shoot_01 22
#define FRAME_tg_shoot_02 23
#define FRAME_tg_shoot_03 24
#define FRAME_tg_shoot_04 25
#define FRAME_tg_shoot_05 26
#define FRAME_tg_shoot_06 27
#define FRAME_tg_shoot_07 28
#define FRAME_shg_shoot_01 29
#define FRAME_shg_shoot_02 30
#define FRAME_shg_shoot_03 31
#define FRAME_shg_shoot_04 32
#define FRAME_shg_shoot_05 33
#define FRAME_shg_shoot_06 34
#define FRAME_shg_shoot_07 35
#define FRAME_shg_shoot_08 36
#define FRAME_shg_shoot_09 37
#define FRAME_shg_shoot_10 38
#define FRAME_shg_shoot_11 39
#define FRAME_shg_shoot_12 40
#define FRAME_shg_shoot_13 41
#define FRAME_shg_shoot_14 42
#define FRAME_shg_shoot_15 43
#define FRAME_tg_reload_01 44
#define FRAME_tg_reload_02 45
#define FRAME_tg_reload_03 46
#define FRAME_tg_reload_04 47
#define FRAME_tg_reload_05 48
#define FRAME_tg_reload_06 49
#define FRAME_tg_reload_07 50
#define FRAME_tg_reload_08 51
#define FRAME_tg_reload_09 52
#define FRAME_talk1_01 53
#define FRAME_talk1_02 54
#define FRAME_talk1_03 55
#define FRAME_talk1_04 56
#define FRAME_talk1_05 57
#define FRAME_talk1_06 58
#define FRAME_talk1_07 59
#define FRAME_talk1_08 60
#define FRAME_talk1_09 61
#define FRAME_talk1_10 62
#define FRAME_talk1_11 63
#define FRAME_talk1_12 64
#define FRAME_talk1_13 65
#define FRAME_talk1_14 66
#define FRAME_talk1_15 67
#define FRAME_talk1_16 68
#define FRAME_talk1_17 69
#define FRAME_talk2_01 70
#define FRAME_talk2_02 71
#define FRAME_talk2_03 72
#define FRAME_talk2_04 73
#define FRAME_talk2_05 74
#define FRAME_talk2_06 75
#define FRAME_talk2_07 76
#define FRAME_talk2_08 77
#define FRAME_talk2_09 78
#define FRAME_talk2_10 79
#define FRAME_talk2_11 80
#define FRAME_talk2_12 81
#define FRAME_talk2_13 82
#define FRAME_talk2_14 83
#define FRAME_talk2_15 84
#define FRAME_talk2_16 85
#define FRAME_talk2_17 86
#define FRAME_talk3_01 87
#define FRAME_talk3_02 88
#define FRAME_talk3_03 89
#define FRAME_talk3_04 90
#define FRAME_talk3_05 91
#define FRAME_talk3_06 92
#define FRAME_talk3_07 93
#define FRAME_talk3_08 94
#define FRAME_talk3_09 95
#define FRAME_talk3_10 96
#define FRAME_talk3_11 97
#define FRAME_talk3_12 98
#define FRAME_talk3_13 99
#define FRAME_talk3_14 100
#define FRAME_talk3_15 101
#define FRAME_talk3_16 102
#define FRAME_talk3_17 103
#define FRAME_talk3_18 104
#define FRAME_talk3_19 105
#define FRAME_talk4_01 106
#define FRAME_talk4_02 107
#define FRAME_talk4_03 108
#define FRAME_talk4_04 109
#define FRAME_talk4_05 110
#define FRAME_talk4_06 111
#define FRAME_talk4_07 112
#define FRAME_talk4_08 113
#define FRAME_talk4_09 114
#define FRAME_talk4_10 115
#define FRAME_talk4_11 116
#define FRAME_talk4_12 117
#define FRAME_talk4_13 118
#define FRAME_talk4_14 119
#define FRAME_talk4_15 120
#define FRAME_talk4_16 121
#define FRAME_talk4_17 122
#define FRAME_talk4_18 123
#define FRAME_talk4_19 124
#define FRAME_talk4_20 125
#define FRAME_talk5_01 126
#define FRAME_talk5_02 127
#define FRAME_talk5_03 128
#define FRAME_talk5_04 129
#define FRAME_talk5_05 130
#define FRAME_talk5_06 131
#define FRAME_talk5_07 132
#define FRAME_talk5_08 133
#define FRAME_talk5_09 134
#define FRAME_talk5_10 135
#define FRAME_talk5_11 136
#define FRAME_talk5_12 137
#define FRAME_talk5_13 138
#define FRAME_talk5_14 139
#define FRAME_talk5_15 140
#define FRAME_talk5_16 141
#define FRAME_talk5_17 142
#define FRAME_talk5_18 143
#define FRAME_talk5_19 144
#define FRAME_talk6_01 145
#define FRAME_talk6_02 146
#define FRAME_talk6_03 147
#define FRAME_talk6_04 148
#define FRAME_talk6_05 149
#define FRAME_talk6_06 150
#define FRAME_talk6_07 151
#define FRAME_talk6_08 152
#define FRAME_talk6_09 153
#define FRAME_talk6_10 154
#define FRAME_talk6_11 155
#define FRAME_talk6_12 156
#define FRAME_talk6_13 157
#define FRAME_talk6_14 158
#define FRAME_talk6_15 159
#define FRAME_talk6_16 160
#define FRAME_talk6_17 161
#define FRAME_talk6_18 162
#define FRAME_talk6_19 163
#define FRAME_talk6_20 164
#define FRAME_talk6_21 165
#define FRAME_talk6_22 166
#define FRAME_talk6_23 167
#define FRAME_talk6_24 168
#define FRAME_talk6_25 169
#define FRAME_talk6_26 170
#define FRAME_talk6_27 171
#define FRAME_talk6_28 172
#define FRAME_talk6_29 173
#define FRAME_talk6_30 174
#define FRAME_talk6_31 175
#define FRAME_talk7_01 176
#define FRAME_talk7_02 177
#define FRAME_talk7_03 178
#define FRAME_talk7_04 179
#define FRAME_talk7_05 180
#define FRAME_talk7_06 181
#define FRAME_talk7_07 182
#define FRAME_talk7_08 183
#define FRAME_talk7_09 184
#define FRAME_talk7_10 185
#define FRAME_talk7_11 186
#define FRAME_talk7_12 187
#define FRAME_talk7_13 188
#define FRAME_talk7_14 189
#define FRAME_talk7_15 190
#define FRAME_talk7_16 191
#define FRAME_talk7_17 192
#define FRAME_pain_Rarm_01 193
#define FRAME_pain_Rarm_02 194
#define FRAME_pain_Rarm_03 195
#define FRAME_pain_Rarm_04 196
#define FRAME_pain_Rarm_05 197
#define FRAME_pain_Rarm_06 198
#define FRAME_pain_Rarm_07 199
#define FRAME_pain_Rarm_08 200
#define FRAME_pain_Rarm_09 201
#define FRAME_pain_Larm_01 202
#define FRAME_pain_Larm_02 203
#define FRAME_pain_Larm_03 204
#define FRAME_pain_Larm_04 205
#define FRAME_pain_Larm_05 206
#define FRAME_pain_Larm_06 207
#define FRAME_pain_Larm_07 208
#define FRAME_pain_Larm_08 209
#define FRAME_pain_Larm_09 210
#define FRAME_pain_chest_01 211
#define FRAME_pain_chest_02 212
#define FRAME_pain_chest_03 213
#define FRAME_pain_chest_04 214
#define FRAME_pain_chest_05 215
#define FRAME_pain_chest_06 216
#define FRAME_pain_chest_07 217
#define FRAME_pain_chest_08 218
#define FRAME_pain_chest_09 219
#define FRAME_pain_chest_10 220
#define FRAME_pain_chest_11 221
#define FRAME_pain_head_01 222
#define FRAME_pain_head_02 223
#define FRAME_pain_head_03 224
#define FRAME_pain_head_04 225
#define FRAME_pain_head_05 226
#define FRAME_pain_head_06 227
#define FRAME_pain_head_07 228
#define FRAME_pain_head_08 229
#define FRAME_pain_Rleg_01 230
#define FRAME_pain_Rleg_02 231
#define FRAME_pain_Rleg_03 232
#define FRAME_pain_Rleg_04 233
#define FRAME_pain_Rleg_05 234
#define FRAME_pain_Rleg_06 235
#define FRAME_pain_Rleg_07 236
#define FRAME_pain_Rleg_08 237
#define FRAME_pain_Lleg_01 238
#define FRAME_pain_Lleg_02 239
#define FRAME_pain_Lleg_03 240
#define FRAME_pain_Lleg_04 241
#define FRAME_pain_Lleg_05 242
#define FRAME_pain_Lleg_06 243
#define FRAME_pain_Lleg_07 244
#define FRAME_pain_Lleg_08 245
#define FRAME_pain_Lleg_09 246
#define FRAME_pain_Lleg_10 247
#define FRAME_pain_crch_01 248
#define FRAME_pain_crch_02 249
#define FRAME_pain_crch_03 250
#define FRAME_pain_crch_04 251
#define FRAME_pain_crch_05 252
#define FRAME_pain_crch_06 253
#define FRAME_pain_crch_07 254
#define FRAME_pain_crch_08 255
#define FRAME_pain_crch_09 256
#define FRAME_pain_butt_01 257
#define FRAME_pain_butt_02 258
#define FRAME_pain_butt_03 259
#define FRAME_pain_butt_04 260
#define FRAME_pain_butt_05 261
#define FRAME_pain_butt_06 262
#define FRAME_pain_butt_07 263
#define FRAME_pain_butt_08 264
#define FRAME_jump_01 265
#define FRAME_jump_02 266
#define FRAME_jump_03 267
#define FRAME_jump_04 268
#define FRAME_jump_05 269
#define FRAME_jump_06 270
#define FRAME_jump_07 271
#define FRAME_jump_08 272
#define FRAME_jump_09 273
#define FRAME_jump_10 274
#define FRAME_jump_11 275
#define FRAME_jump_12 276
#define FRAME_jump_13 277
#define FRAME_jump_14 278
#define FRAME_jump_15 279
#define FRAME_jump_16 280
#define FRAME_death1_01 281
#define FRAME_death1_02 282
#define FRAME_death1_03 283
#define FRAME_death1_04 284
#define FRAME_death1_05 285
#define FRAME_death1_06 286
#define FRAME_death1_07 287
#define FRAME_death1_08 288
#define FRAME_death1_09 289
#define FRAME_death1_10 290
#define FRAME_death1_11 291
#define FRAME_death1_12 292
#define FRAME_death1_13 293
#define FRAME_death1_14 294
#define FRAME_death1_15 295
#define FRAME_death1_16 296
#define FRAME_death1_17 297
#define FRAME_death1_18 298
#define FRAME_death1_19 299
#define FRAME_death1_20 300
#define FRAME_death1_21 301
#define FRAME_death1_22 302
#define FRAME_death2_01 303
#define FRAME_death2_02 304
#define FRAME_death2_03 305
#define FRAME_death2_04 306
#define FRAME_death2_05 307
#define FRAME_death2_06 308
#define FRAME_death2_07 309
#define FRAME_death2_08 310
#define FRAME_death2_09 311
#define FRAME_death2_10 312
#define FRAME_death2_11 313
#define FRAME_death2_12 314
#define FRAME_death2_13 315
#define FRAME_death2_14 316
#define FRAME_death2_15 317
#define FRAME_death2_16 318
#define FRAME_death2_17 319
#define FRAME_death2_18 320
#define FRAME_death2_19 321
#define FRAME_death3_01 322
#define FRAME_death3_02 323
#define FRAME_death3_03 324
#define FRAME_death3_04 325
#define FRAME_death3_05 326
#define FRAME_death3_06 327
#define FRAME_death3_07 328
#define FRAME_death3_08 329
#define FRAME_death3_09 330
#define FRAME_death3_10 331
#define FRAME_death3_11 332
#define FRAME_death3_12 333
#define FRAME_death3_13 334
#define FRAME_death3_14 335
#define FRAME_death3_15 336
#define FRAME_death3_16 337
#define FRAME_death3_17 338
#define FRAME_death4_01 339
#define FRAME_death4_02 340
#define FRAME_death4_03 341
#define FRAME_death4_04 342
#define FRAME_death4_05 343
#define FRAME_death4_06 344
#define FRAME_death4_07 345
#define FRAME_death4_08 346
#define FRAME_death4_09 347
#define FRAME_death4_10 348
#define FRAME_death4_11 349
#define FRAME_death4_12 350
#define FRAME_death4_13 351
#define FRAME_death4_14 352
#define FRAME_death4_15 353
#define FRAME_death4_16 354
#define FRAME_death5_01 355
#define FRAME_death5_02 356
#define FRAME_death5_03 357
#define FRAME_death5_04 358
#define FRAME_death5_05 359
#define FRAME_death5_06 360
#define FRAME_death5_07 361
#define FRAME_death5_08 362
#define FRAME_death5_09 363
#define FRAME_death5_10 364
#define FRAME_death5_11 365
#define FRAME_death5_12 366
#define FRAME_death5_13 367
#define FRAME_death6_01 368
#define FRAME_death6_02 369
#define FRAME_death6_03 370
#define FRAME_death6_04 371
#define FRAME_death6_05 372
#define FRAME_death6_06 373
#define FRAME_death6_07 374
#define FRAME_death6_08 375
#define FRAME_death6_09 376
#define FRAME_death6_10 377
#define FRAME_death6_11 378
#define FRAME_death6_12 379
#define FRAME_death7_01 380
#define FRAME_death7_02 381
#define FRAME_death7_03 382
#define FRAME_death7_04 383
#define FRAME_death7_05 384
#define FRAME_death7_06 385
#define FRAME_death7_07 386
#define FRAME_death7_08 387
#define FRAME_death7_09 388
#define FRAME_death7_10 389
#define FRAME_death7_11 390
#define FRAME_death7_12 391
#define FRAME_death7_13 392
#define FRAME_death8_01 393
#define FRAME_death8_02 394
#define FRAME_death8_03 395
#define FRAME_death8_04 396
#define FRAME_death8_05 397
#define FRAME_death8_06 398
#define FRAME_death8_07 399
#define FRAME_death8_08 400
#define FRAME_death8_09 401
#define FRAME_death8_10 402
#define FRAME_death8_11 403
#define FRAME_crouch_walk_01 404
#define FRAME_crouch_walk_02 405
#define FRAME_crouch_walk_03 406
#define FRAME_crouch_walk_04 407
#define FRAME_crouch_walk_05 408
#define FRAME_crouch_walk_06 409
#define FRAME_crouch_walk_07 410
#define FRAME_crouch_walk_08 411
#define FRAME_crouch_walk_09 412
#define FRAME_crouch_painC_01 413
#define FRAME_crouch_painC_02 414
#define FRAME_crouch_painC_03 415
#define FRAME_crouch_painC_04 416
#define FRAME_crouch_painC_05 417
#define FRAME_crouch_painC_06 418
#define FRAME_crouch_painC_07 419
#define FRAME_crouch_painC_08 420
#define FRAME_crouch_painC_09 421
#define FRAME_crouch_painC_10 422
#define FRAME_crouch_painC_11 423
#define FRAME_crouch_painL_01 424
#define FRAME_crouch_painL_02 425
#define FRAME_crouch_painL_03 426
#define FRAME_crouch_painL_04 427
#define FRAME_crouch_painL_05 428
#define FRAME_crouch_painL_06 429
#define FRAME_crouch_painL_07 430
#define FRAME_crouch_painL_08 431
#define FRAME_crouch_painL_09 432
#define FRAME_crouch_painL_10 433
#define FRAME_crouch_painL_11 434
#define FRAME_crouch_painR_01 435
#define FRAME_crouch_painR_02 436
#define FRAME_crouch_painR_03 437
#define FRAME_crouch_painR_04 438
#define FRAME_crouch_painR_05 439
#define FRAME_crouch_painR_06 440
#define FRAME_crouch_painR_07 441
#define FRAME_crouch_painR_08 442
#define FRAME_crouch_painR_09 443
#define FRAME_crouch_painR_10 444
#define FRAME_crouch_painR_11 445
#define FRAME_crouch_painH_01 446
#define FRAME_crouch_painH_02 447
#define FRAME_crouch_painH_03 448
#define FRAME_crouch_painH_04 449
#define FRAME_crouch_painH_05 450
#define FRAME_crouch_painH_06 451
#define FRAME_crouch_painH_07 452
#define FRAME_crouch_painH_08 453
#define FRAME_crouch_painH_09 454
#define FRAME_crouch_painH_10 455
#define FRAME_crouch_painH_11 456
#define FRAME_crouch_shoot_01 457
#define FRAME_crouch_shoot_02 458
#define FRAME_crouch_shoot_03 459
#define FRAME_crouch_shoot_04 460
#define FRAME_crouch_shoot_05 461
#define FRAME_crouch_shoot_06 462
#define FRAME_crouch_shoot_07 463
#define FRAME_crouch_shoot_08 464
#define FRAME_crch_shg_sht_01 465
#define FRAME_crch_shg_sht_02 466
#define FRAME_crch_shg_sht_03 467
#define FRAME_crch_shg_sht_04 468
#define FRAME_crch_shg_sht_05 469
#define FRAME_crch_shg_sht_06 470
#define FRAME_crch_shg_sht_07 471
#define FRAME_crch_shg_sht_08 472
#define FRAME_crch_shg_sht_09 473
#define FRAME_crch_shg_sht_10 474
#define FRAME_crch_shg_sht_11 475
#define FRAME_crch_shg_sht_12 476
#define FRAME_crch_shg_sht_13 477
#define FRAME_crch_shg_sht_14 478
#define FRAME_crch_shg_sht_15 479
#define FRAME_crch_shg_sht_16 480
#define FRAME_crch_shg_sht_17 481
#define FRAME_stand_crouch_01 482
#define FRAME_stand_crouch_02 483
#define FRAME_stand_crouch_03 484
#define FRAME_stand_crouch_04 485
#define FRAME_stand_crouch_05 486
#define FRAME_stand_crouch_06 487
#define FRAME_stand_crouch_07 488
#define FRAME_stand_crouch_08 489
#define FRAME_stand_crouch_09 490
#define FRAME_stand_crouch_10 491
#define FRAME_stand_crouch_11 492
#define FRAME_stand_crouch_12 493
#define FRAME_stand_crouch_13 494
#define FRAME_crch_astand_01 495
#define FRAME_crch_astand_02 496
#define FRAME_crch_astand_03 497
#define FRAME_crch_astand_04 498
#define FRAME_crch_astand_05 499
#define FRAME_crch_astand_06 500
#define FRAME_crch_astand_07 501
#define FRAME_crch_astand_08 502
#define FRAME_crch_astand_09 503
#define FRAME_crch_astand_10 504
#define FRAME_crch_astand_11 505
#define FRAME_crch_astand_12 506
#define FRAME_crch_astand_13 507
#define FRAME_crch_astand_14 508
#define FRAME_crch_astand_15 509
#define FRAME_crch_astand_16 510
#define FRAME_crch_death1_01 511
#define FRAME_crch_death1_02 512
#define FRAME_crch_death1_03 513
#define FRAME_crch_death1_04 514
#define FRAME_crch_death1_05 515
#define FRAME_crch_death1_06 516
#define FRAME_crch_death1_07 517
#define FRAME_crch_death1_08 518
#define FRAME_crch_death1_09 519
#define FRAME_crch_death1_10 520
#define FRAME_crch_death1_11 521
#define FRAME_crch_death1_12 522
#define FRAME_crch_death1_13 523
#define FRAME_crch_death1_14 524
#define FRAME_crch_death1_15 525
#define FRAME_crch_death1_16 526
#define FRAME_crch_death1_17 527
#define FRAME_crch_death1_18 528
#define FRAME_crch_death1_19 529
#define FRAME_crch_death2_01 530
#define FRAME_crch_death2_02 531
#define FRAME_crch_death2_03 532
#define FRAME_crch_death2_04 533
#define FRAME_crch_death2_05 534
#define FRAME_crch_death2_06 535
#define FRAME_crch_death2_07 536
#define FRAME_crch_death2_08 537
#define FRAME_crch_death2_09 538
#define FRAME_crch_death2_10 539
#define FRAME_crch_death2_11 540
#define FRAME_crch_death2_12 541
#define FRAME_crch_death2_13 542
#define FRAME_crch_death2_14 543
#define FRAME_crch_death2_15 544
#define FRAME_st_clmb_01 545
#define FRAME_st_clmb_02 546
#define FRAME_clmb_loop_01 547
#define FRAME_clmb_loop_02 548
#define FRAME_clmb_loop_03 549
#define FRAME_clmb_loop_04 550
#define FRAME_clmb_loop_05 551
#define FRAME_clmb_loop_06 552
#define FRAME_clmb_loop_07 553
#define FRAME_clmb_loop_08 554
#define FRAME_clmb_loop_09 555
#define FRAME_clmb_loop_10 556
#define FRAME_clmb_over_01 557
#define FRAME_clmb_over_02 558
#define FRAME_clmb_over_03 559
#define FRAME_clmb_over_04 560
#define FRAME_clmb_over_05 561
#define FRAME_clmb_over_06 562
#define FRAME_clmb_over_07 563
#define FRAME_clmb_over_08 564
#define FRAME_clmb_over_09 565
#define FRAME_clmb_over_10 566
#define FRAME_clmb_over_11 567
#define FRAME_clmb_over_12 568
#define FRAME_lside_step_01 569
#define FRAME_lside_step_02 570
#define FRAME_lside_step_03 571
#define FRAME_lside_step_04 572
#define FRAME_lside_step_05 573
#define FRAME_lside_step_06 574
#define FRAME_lside_step_07 575
#define FRAME_lside_step_08 576
#define FRAME_lside_step_09 577
#define FRAME_rside_step_01 578
#define FRAME_rside_step_02 579
#define FRAME_rside_step_03 580
#define FRAME_rside_step_04 581
#define FRAME_rside_step_05 582
#define FRAME_rside_step_06 583
#define FRAME_rside_step_07 584
#define FRAME_rside_step_08 585
#define FRAME_rside_step_09 586
#define FRAME_walk_nw_01 587
#define FRAME_walk_nw_02 588
#define FRAME_walk_nw_03 589
#define FRAME_walk_nw_04 590
#define FRAME_walk_nw_05 591
#define FRAME_walk_nw_06 592
#define FRAME_walk_nw_07 593
#define FRAME_walk_nw_08 594
#define FRAME_walk_nw_09 595
#define FRAME_walk_nw_10 596
#define FRAME_walk_tg_sht_01 597
#define FRAME_walk_tg_sht_02 598
#define FRAME_walk_tg_sht_03 599
#define FRAME_walk_tg_sht_04 600
#define FRAME_walk_tg_sht_05 601
#define FRAME_walk_tg_sht_06 602
#define FRAME_walk_tg_sht_07 603
#define FRAME_walk_tg_sht_08 604
#define FRAME_walk_tg_sht_09 605
#define FRAME_walk_tg_sht_10 606
#define FRAME_walk_shg_sht_01 607
#define FRAME_walk_shg_sht_02 608
#define FRAME_walk_shg_sht_03 609
#define FRAME_walk_shg_sht_04 610
#define FRAME_walk_shg_sht_05 611
#define FRAME_walk_shg_sht_06 612
#define FRAME_walk_shg_sht_07 613
#define FRAME_walk_shg_sht_08 614
#define FRAME_walk_shg_sht_09 615
#define FRAME_walk_shg_sht_10 616
#define FRAME_walk_gdown_01 617
#define FRAME_walk_gdown_02 618
#define FRAME_walk_gdown_03 619
#define FRAME_walk_gdown_04 620
#define FRAME_walk_gdown_05 621
#define FRAME_walk_gdown_06 622
#define FRAME_walk_gdown_07 623
#define FRAME_walk_gdown_08 624
#define FRAME_walk_gdown_09 625
#define FRAME_walk_gdown_10 626
#define FRAME_run_nw_01 627
#define FRAME_run_nw_02 628
#define FRAME_run_nw_03 629
#define FRAME_run_nw_04 630
#define FRAME_run_nw_05 631
#define FRAME_run_nw_06 632
#define FRAME_run_tg_sht_01 633
#define FRAME_run_tg_sht_02 634
#define FRAME_run_tg_sht_03 635
#define FRAME_run_tg_sht_04 636
#define FRAME_run_tg_sht_05 637
#define FRAME_run_tg_sht_06 638
#define FRAME_run_shg_sht_01 639
#define FRAME_run_shg_sht_02 640
#define FRAME_run_shg_sht_03 641
#define FRAME_run_shg_sht_04 642
#define FRAME_run_shg_sht_05 643
#define FRAME_run_shg_sht_06 644
#define FRAME_run_gun_down_01 645
#define FRAME_run_gun_down_02 646
#define FRAME_run_gun_down_03 647
#define FRAME_run_gun_down_04 648
#define FRAME_run_gun_down_05 649
#define FRAME_run_gun_down_06 650
#define FRAME_run_on_fire_01 651
#define FRAME_run_on_fire_02 652
#define FRAME_run_on_fire_03 653
#define FRAME_run_on_fire_04 654
#define FRAME_run_on_fire_05 655
#define FRAME_run_on_fire_06 656
#define FRAME_rsd_tg_run_01 657
#define FRAME_rsd_tg_run_02 658
#define FRAME_rsd_tg_run_03 659
#define FRAME_rsd_tg_run_04 660
#define FRAME_rsd_tg_run_05 661
#define FRAME_rsd_tg_run_06 662
#define FRAME_lsd_tg_run_01 663
#define FRAME_lsd_tg_run_02 664
#define FRAME_lsd_tg_run_03 665
#define FRAME_lsd_tg_run_04 666
#define FRAME_lsd_tg_run_05 667
#define FRAME_lsd_tg_run_06 668
#define FRAME_rsd_shg_run_01 669
#define FRAME_rsd_shg_run_02 670
#define FRAME_rsd_shg_run_03 671
#define FRAME_rsd_shg_run_04 672
#define FRAME_rsd_shg_run_05 673
#define FRAME_rsd_shg_run_06 674
#define FRAME_lsd_shg_run_01 675
#define FRAME_lsd_shg_run_02 676
#define FRAME_lsd_shg_run_03 677
#define FRAME_lsd_shg_run_04 678
#define FRAME_lsd_shg_run_05 679
#define FRAME_lsd_shg_run_06 680
#define FRAME_hmg_sht_01 681
#define FRAME_hmg_sht_02 682
#define FRAME_hmg_sht_03 683
#define FRAME_hmg_sht_04 684
#define FRAME_hmg_sht_05 685
#define FRAME_hmg_sht_06 686
#define FRAME_hmg_sht_07 687
#define FRAME_hmg_wlk_01 688
#define FRAME_hmg_wlk_02 689
#define FRAME_hmg_wlk_03 690
#define FRAME_hmg_wlk_04 691
#define FRAME_hmg_wlk_05 692
#define FRAME_hmg_wlk_06 693
#define FRAME_hmg_wlk_07 694
#define FRAME_hmg_wlk_08 695
#define FRAME_hmg_wlk_09 696
#define FRAME_hmg_wlk_10 697
#define FRAME_hmg_run_01 698
#define FRAME_hmg_run_02 699
#define FRAME_hmg_run_03 700
#define FRAME_hmg_run_04 701
#define FRAME_hmg_run_05 702
#define FRAME_hmg_run_06 703
#define FRAME_hmg_std_01 704
#define FRAME_hmg_std_02 705
#define FRAME_hmg_std_03 706
#define FRAME_hmg_std_04 707
#define FRAME_hmg_std_05 708
#define FRAME_hmg_std_06 709
#define FRAME_hmg_std_07 710
#define FRAME_hmg_std_08 711
#define FRAME_hmg_std_09 712
#define FRAME_hmg_std_10 713
#define FRAME_hmg_std_11 714
#define FRAME_hmg_std_12 715
#define MODEL_SCALE 1.000000

1547
gamesrc/ai_shorty_tables.h Normal file

File diff suppressed because it is too large Load diff

9
gamesrc/ai_skinny.c Normal file
View file

@ -0,0 +1,9 @@
// ai_skinny.c
#include "g_local.h"
// #include "ai_skinny.h" // rename tris.h to this
#include "voice_punk.h"
// #include "ai_skinny_tables.h" // this is a clone of ai_punk_tables.h you need to fix this

1620
gamesrc/ai_skinny_tables.h Normal file

File diff suppressed because it is too large Load diff

1605
gamesrc/ai_thug2_tables.h Normal file

File diff suppressed because it is too large Load diff

1347
gamesrc/ai_thug_sit.c Normal file

File diff suppressed because it is too large Load diff

1271
gamesrc/ai_thug_tables.h Normal file

File diff suppressed because it is too large Load diff

1795
gamesrc/ai_whore_tables.h Normal file

File diff suppressed because it is too large Load diff

209
gamesrc/ep_crystalpalace.c Normal file
View file

@ -0,0 +1,209 @@
/******************************************************************************
CRYSTALPALACE - Episode specific code
*******************************************************************************/
#include "g_local.h"
#include "voice_punk.h"
#include "voice_bitch.h"
void ProcessKingpin (edict_t *self, edict_t *other);
void misc_cp_afraid_think (edict_t *self);
qboolean EP_CrystalPalace_CastSight ( edict_t *self, edict_t *other, cast_memory_t *mem )
{
return false;
}
qboolean EP_CrystalPalace_CastUse (edict_t *self, edict_t *other, edict_t *activator)
{
return false;
}
qboolean EP_CrystalPalace_EventSpeech (edict_t *self, edict_t *other, int saywhat)
{
cast_memory_t *mem;
mem = level.global_cast_memory[ self->character_index ][ other->character_index ];
switch (saywhat)
{
case say_neutral:
if (self->name_index == NAME_KINGPIN && other->client)
{
if (!(other->episode_flags & EP_CP_KINGPIN_FIRSTSIGHT))
{
gi.dprintf ("there he is lets go!\n");
EP_Skidrow_Register_EPFLAG (other, EP_CP_KINGPIN_FIRSTSIGHT);
{
// need to make blunt and kingpin leave through the elevator
ProcessKingpin (self, other);
}
}
return true;
}
return false;
break;
case say_hostile:
if (self->name_index == NAME_KINGPIN)
{
if (!(other->episode_flags & EP_CP_KINGPIN_FIRSTSIGHT))
{
gi.dprintf ("there he is lets go!\n");
EP_Skidrow_Register_EPFLAG (other, EP_CP_KINGPIN_FIRSTSIGHT);
{
// need to make blunt and kingpin leave through the elevator
ProcessKingpin (self, other);
}
}
return true;
}
return false;
break;
}
return false;
}
void EP_CrystalPalace_ItemPickup ( edict_t *self, edict_t *other )
{
}
void EP_CrystalPalace_Script( edict_t *ent, char *scriptname )
{
}
int EP_CrystalPalace_HiredGuysFlags (edict_t *player, edict_t *self)
{
if (self->gender == GENDER_MALE)
Voice_Random (self, player, &hiredguy_ask[10], 4);
else
Voice_Random (self, player, &hiredgal_specific[12], 4);
return (0);
}
void EP_CrystalPalaceFlags (edict_t *self)
{
}
qboolean EP_CrystalPalace_DoKey (edict_t *self, edict_t *other)
{
return false;
}
void EP_CrystalPalace_Check_DoKey (edict_t *self, edict_t *ent)
{
}
void EP_CrystalPalace_ReachedDoKey (edict_t *self)
{
}
void EP_CrystalPalace_EndDoKey (edict_t *self)
{
}
qboolean EP_CrystalPalace_UnlockDoorFlag (edict_t *ent)
{
return false;
}
void EP_CrystalPalace_HiredGuysRegisterFlags (edict_t *ent, edict_t *other)
{
}
void ProcessKingpin (edict_t *self, edict_t *other)
{
edict_t *Blunt;
edict_t *ent = NULL;
Blunt = EP_GetCharacter (NAME_BLUNT);
if (Blunt)
{
ent = G_Find (ent, FOFS(classname), "misc_cp_afraid");
if (ent)
{
self->goal_ent = ent;
ent->cast_info.aiflags |= AI_GOAL_RUN;
ent->think = misc_cp_afraid_think;
ent->nextthink = level.time + 0.1;
self->cast_info.aiflags &= ~AI_TALK;
}
else
gi.dprintf ("Kingpin missing misc_cp_afraid marker\n");
}
// todo
// the doors to the escape elevator need to open
}
/*QUAKED misc_cp_afraid (.5 .5 1) (-16 -16 -24) (16 16 48)
used as the location mo will run to before larry and curly attack him
*/
void misc_cp_afraid_think (edict_t *self)
{
edict_t *Kingpin;
edict_t *Blunt;
vec3_t vec;
float dist;
Kingpin = EP_GetCharacter (NAME_KINGPIN);
Blunt = EP_GetCharacter (NAME_BLUNT);
if (Kingpin)
{
VectorSubtract (Kingpin->s.origin, self->s.origin, vec);
dist = VectorLength (vec);
// gi.dprintf ("dist: %5.3f\n", dist);
if (dist < 128)
{
}
else
self->nextthink = level.time + 0.1;
}
}
void SP_misc_cp_afraid (edict_t *self)
{
if (deathmatch->value)
{
G_FreeEdict(self);
return;
}
self->movetype = MOVETYPE_NONE;
self->solid = SOLID_NOT;
VectorSet (self->mins, -16, -16, -24);
VectorSet (self->maxs, 16, 16, 48);
self->cast_info.aiflags |= AI_RUN_LIKE_HELL;
AI_Ent_droptofloor( self );
gi.linkentity (self);
}

1608
gamesrc/ep_posionville.c Normal file

File diff suppressed because it is too large Load diff

1231
gamesrc/ep_radiocity.c Normal file

File diff suppressed because it is too large Load diff

1312
gamesrc/ep_shipyards.c Normal file

File diff suppressed because it is too large Load diff

2943
gamesrc/ep_skidrow.c Normal file

File diff suppressed because it is too large Load diff

1198
gamesrc/ep_steeltown.c Normal file

File diff suppressed because it is too large Load diff

419
gamesrc/ep_trainyard.c Normal file
View file

@ -0,0 +1,419 @@
/******************************************************************************
TRAINYARD - Episode specific code
*******************************************************************************/
#include "g_local.h"
#include "voice_punk.h"
#include "voice_bitch.h"
void misc_ty_afraid_think (edict_t *self);
qboolean EP_Trainyard_CastSight ( edict_t *self, edict_t *other, cast_memory_t *mem )
{
return false;
}
qboolean EP_Trainyard_CastUse (edict_t *self, edict_t *other, edict_t *activator)
{
return false;
}
qboolean EP_Trainyard_EventSpeech (edict_t *self, edict_t *other, int saywhat)
{
cast_memory_t *mem;
mem = level.global_cast_memory[ self->character_index ][ other->character_index ];
switch (saywhat)
{
case say_neutral:
if (self->name_index == NAME_LUKE && other->client)
{
if (!(other->episode_flags & EP_TY_LUKE_CLUE1))
{
EP_Skidrow_Register_EPFLAG (other, EP_TY_LUKE_CLUE1);
EP_Skidrow_Register_EPFLAG (other, EP_TY_TAKETHESEWER);
Voice_Specific (self, other, ty_luke, 0);
}
else if (!(other->episode_flags & EP_TY_LUKE_CLUE2))
{
EP_Skidrow_Register_EPFLAG (other, EP_TY_LUKE_CLUE2);
Voice_Specific (self, other, ty_luke, 1);
}
else
Voice_Random (self, other, &ty_luke[2], 4);
return true;
}
if (self->name_index == NAME_HANN && other->client)
{
if (!(other->episode_flags & EP_TY_HANN_CLUE1))
{
EP_Skidrow_Register_EPFLAG (other, EP_TY_HANN_CLUE1);
EP_Skidrow_Register_EPFLAG (other, EP_TY_TAKETHESEWER);
Voice_Specific (self, other, ty_hann, 0);
}
else if (!(other->episode_flags & EP_TY_HANN_CLUE2))
{
EP_Skidrow_Register_EPFLAG (other, EP_TY_HANN_CLUE2);
Voice_Specific (self, other, ty_hann, 1);
}
else
Voice_Random (self, other, &ty_hann[2], 4);
return true;
}
return false;
break;
case say_hostile:
if (self->name_index == NAME_LUKE && other->client)
{
if (other->client->ps.stats[STAT_HUD_SELF_TALK] == TT_POSITIVE)
{
mem = level.global_cast_memory [self->character_index][other->character_index];
mem->flags &= ~MEMORY_ASSHOLE;
Voice_Random (self, other, &ty_luke[2], 4);
return true;
}
else
{
// just do a random curse at the player
Voice_Random (self, other, &ty_luke[6], 3);
return true;
}
}
if (self->name_index == NAME_HANN && other->client)
{
if (other->client->ps.stats[STAT_HUD_SELF_TALK] == TT_POSITIVE)
{
mem = level.global_cast_memory [self->character_index][other->character_index];
mem->flags &= ~MEMORY_ASSHOLE;
Voice_Random (self, other, &ty_hann[2], 4);
return true;
}
else
{
// just do a random curse at the player
Voice_Random (self, other, &ty_hann[6], 3);
return true;
}
}
return false;
break;
}
return false;
}
void EP_Trainyard_ItemPickup ( edict_t *self, edict_t *other )
{
}
void EP_Trainyard_Script( edict_t *ent, char *scriptname )
{
}
int EP_Trainyard_HiredGuysFlags (edict_t *player, edict_t *self)
{
return (1);
}
void EP_TrainyardFlags (edict_t *self)
{
}
qboolean EP_Trainyard_DoKey (edict_t *self, edict_t *other)
{
return false;
}
void EP_Trainyard_Check_DoKey (edict_t *self, edict_t *ent)
{
}
void EP_Trainyard_ReachedDoKey (edict_t *self)
{
}
void EP_Trainyard_EndDoKey (edict_t *self)
{
}
qboolean EP_Trainyard_UnlockDoorFlag (edict_t *ent)
{
return false;
}
void EP_Trainyard_HiredGuysRegisterFlags (edict_t *ent, edict_t *other)
{
}
extern mmove_t punk_move_walk_dokey;
extern mmove_t punk_move_crch_dokey;
extern mmove_t runt_move_walk_dokey;
extern mmove_t runt_move_crch_dokey;
extern mmove_t bitch_move_walk_dokey;
/*QUAKED misc_ty_afraid (.5 .5 1) (-16 -16 -24) (16 16 48)
used as the location mo will run to before larry and curly attack him
*/
void misc_ty_afraid_think (edict_t *self)
{
}
void SP_misc_ty_afraid (edict_t *self)
{
if (deathmatch->value)
{
G_FreeEdict(self);
return;
}
self->movetype = MOVETYPE_NONE;
self->solid = SOLID_NOT;
VectorSet (self->mins, -16, -16, -24);
VectorSet (self->maxs, 16, 16, 48);
self->cast_info.aiflags |= AI_RUN_LIKE_HELL;
AI_Ent_droptofloor( self );
gi.linkentity (self);
}
/*QUAKED ai_ty_mo_boundry (.5 .5 1) ?
touching this brush will cause mo larry and curly to attack
*/
void ai_mo_boundry_touch (edict_t *self, edict_t *other, cplane_t *plane, csurface_t *surf)
{
// vec3_t vec;
// if (!(other->svflags & SVF_MONSTER) && !(other->client))
if (!(other->client))
return;
}
void SP_ty_mo_boundry ( edict_t *ent )
{
if (deathmatch->value)
{
G_FreeEdict(ent);
return;
}
ent->solid = SOLID_TRIGGER;
ent->touch = ai_mo_boundry_touch;
ent->svflags |= SVF_NOCLIENT;
gi.setmodel (ent, ent->model);
gi.linkentity (ent);
}
/*QUAKED ai_ty_fuseblown (.5 .5 1) ?
This will set the EP_TY_FUSEBLOWN flag
*/
void ai_ty_fuseblown_touch (edict_t *self, edict_t *other, cplane_t *plane, csurface_t *surf)
{
if (!(other->client))
return;
if (!(other->episode_flags & EP_TY_FUSEBLOWN))
{
EP_Skidrow_Register_EPFLAG (other, EP_TY_FUSEBLOWN);
gi.sound(other, CHAN_VOICE, gi.soundindex("scenaric/need_fuse.wav"), 1, ATTN_NORM, 0);
}
// FIXME
// we need to play a wav file
}
void SP_ty_fuseblown ( edict_t *ent )
{
if (deathmatch->value)
{
G_FreeEdict(ent);
return;
}
ent->solid = SOLID_TRIGGER;
ent->touch = ai_ty_fuseblown_touch;
ent->svflags |= SVF_NOCLIENT;
gi.setmodel (ent, ent->model);
gi.linkentity (ent);
}
/*QUAKED ai_ty_valvehandle (.5 .5 1) ?
*/
void ai_ty_valvehandle_touch (edict_t *self, edict_t *other, cplane_t *plane, csurface_t *surf)
{
int index;
gitem_t *item;
if (!(other->client))
return;
item = FindItem ("Valve");
index = ITEM_INDEX (item);
if (!(other->client->pers.inventory[ index ]))
{
gi.sound(other, CHAN_VOICE, gi.soundindex("scenaric/need_valvehandle.wav"), 1, ATTN_NORM, 0);
self->touch = NULL;
}
}
void SP_ty_valvehandle ( edict_t *ent )
{
if (deathmatch->value)
{
G_FreeEdict(ent);
return;
}
ent->solid = SOLID_TRIGGER;
ent->touch = ai_ty_valvehandle_touch;
ent->svflags |= SVF_NOCLIENT;
gi.setmodel (ent, ent->model);
gi.linkentity (ent);
}
#include "ep_log.h"
extern int the_log_page;
void EP_Trainyard_Player_Log (edict_t *self, int page)
{
int len;
int i;
int cnt = 0;
int select = 0;
len = 0;
Com_sprintf (game.helpmessage1, sizeof(game.helpmessage1), "");
Com_sprintf (game.helpmessage2, sizeof(game.helpmessage2), "");
the_log_page += page;
if (the_log_page < 0)
the_log_page = 0;
else if (the_log_page >= NUM_TY_PLAYER_LOG)
the_log_page = 0;
for (i=1; i<NUM_TY_PLAYER_LOG; i++)
{
if (self->client->pers.episode_flags & ep_ty_player_log[i].ep_flag)
cnt++;
if (cnt == the_log_page)
{
select = i;
break;
}
}
if (!page || !the_log_page)
for (i=0; i<NUM_TY_PLAYER_LOG; i++)
{
if (ep_ty_player_log[i].new_clue == true)
{
select = i;
break;
}
}
if (cnt == 0)
{
the_log_page = 0;
strcpy (game.helpmessage1, " ");
if (ep_ty_player_log[select].new_clue)
strcat (game.helpmessage1, "new entry");
strcpy (game.helpmessage2, ep_ty_player_log[0].ep_text);
}
else
{
if (select == 0)
the_log_page = 0;
strcpy (game.helpmessage1, " ");
if (ep_ty_player_log[select].new_clue)
strcat (game.helpmessage1, "new entry");
strcat (game.helpmessage2, ep_ty_player_log[select].ep_text);
if (page)
gi.sound(self, CHAN_VOICE, gi.soundindex("world/pageturn.wav"), 1, ATTN_NONE, 0);
}
}
qboolean EP_TY_Flash_Newflag (edict_t *self, int ep_flag)
{
int i;
qboolean gotone = false;
for (i=0; i<NUM_TY_PLAYER_LOG; i++)
{
if (ep_ty_player_log[i].ep_flag == ep_flag)
{
ep_ty_player_log[i].new_clue = true;
gotone = true;
}
else
ep_ty_player_log[i].new_clue = false;
}
return (gotone);
}

753
gamesrc/g_ai_ents.c Normal file
View file

@ -0,0 +1,753 @@
// g_ai_ents.c
//
// Contains AI related entities
#include "g_local.h"
#include "g_func.h"
void AI_Ent_droptofloor ( edict_t *self )
{
trace_t tr;
vec3_t start, dest;
VectorCopy( self->s.origin, start );
start[2] += 0.1;
VectorCopy( start, dest );
dest[2] -= 4000;
tr = gi.trace( start, self->mins, self->maxs, dest, self, MASK_PLAYERSOLID );
if (tr.startsolid || tr.allsolid)
{
gi.dprintf( "Warning: %s in solid at (%s)\n", self->classname, vtos(self->s.origin) );
return;
}
if (tr.fraction == 1)
{
gi.dprintf( "Warning: %s above ground at (%s)\n", self->classname, vtos(self->s.origin) );
return;
}
VectorCopy( tr.endpos, self->s.origin );
}
//======================================================================================
/*QUAKED ai_boundary (.5 .5 0) ?
Character will abort pursuing player when touching this brush. Will
take cover until the player is out of view, then return to guarding position (if
character has been assigned one).
"moral" range from 1 (Coward) to 7 (Psycotic). Only characters with an equal or lower moral level will be effected by this brush.
*/
void boundary_takecover_think ( edict_t *self )
{
if (!self->owner->combat_goalent)
{
if ((self->owner->cast_info.aiflags & (AI_TAKE_COVER|AI_TAKECOVER_IGNOREHEALTH)) != (AI_TAKE_COVER|AI_TAKECOVER_IGNOREHEALTH))
{
AI_ForceTakeCover( self->owner, self->owner->enemy, true );
}
G_FreeEdict( self );
return;
}
if (self->owner->health <= 0)
{
G_FreeEdict( self );
return;
}
self->nextthink = level.time + 1.0;
}
void ai_boundary_touch (edict_t *self, edict_t *other, cplane_t *plane, csurface_t *surf)
{
#define DEBUG_AI_BOUNDARY 0
edict_t *thinker;
if (!(other->svflags & SVF_MONSTER))
return;
if (other->cast_group != self->cast_group)
return;
else if (other->moral > self->moral)
return;
// abort taking cover
other->cast_info.aiflags &= ~AI_TAKE_COVER;
other->combat_goalent = NULL;
// we should go into a Take Cover mode for a bit, and then return to our guarding
// position, if possible.
if (other->enemy)
{
cast_memory_t *mem;
if ((other->cast_info.aiflags & (AI_TAKE_COVER|AI_TAKECOVER_IGNOREHEALTH)) != (AI_TAKE_COVER|AI_TAKECOVER_IGNOREHEALTH))
{
// Just go back to our start position
if (!AI_ForceTakeCover( other, other->enemy, true ))
{
if (mem = level.global_cast_memory[other->character_index][other->enemy->character_index])
{
// pretend that we haven't seen them in a while
mem->timestamp = level.time - 5;
mem->flags |= MEMORY_TAUNT;
other->enemy = NULL;
if (DEBUG_AI_BOUNDARY)
gi.dprintf( "Sending %s to start position\n", other->name );
// go back to our start position
other->combat_goalent = other->goal_ent = other->start_ent;
other->combat_goalent->cast_info.aiflags |= AI_GOAL_RUN;
thinker = G_Spawn();
thinker->owner = other;
thinker->nextthink = level.time + 3;
thinker->think = boundary_takecover_think;
mem->ignore_time = level.time + 2;
}
}
// else
// {
// if (DEBUG_AI_BOUNDARY)
// gi.dprintf( "%s taking cover\n", other->name );
// }
}
/*
// tell all our friends in our vacinity to do the same
mem = other->cast_info.friend_memory;
while (mem)
{
if (g_edicts[mem->cast_ent].health > 0 && VectorDistance( other->s.origin, g_edicts[mem->cast_ent].s.origin ) < 256)
{
edict_t *dude;
cast_memory_t *dude_mem;
dude = &g_edicts[mem->cast_ent];
if (dude->enemy)
{
if ((dude->cast_info.aiflags & (AI_TAKE_COVER|AI_TAKECOVER_IGNOREHEALTH)) != (AI_TAKE_COVER|AI_TAKECOVER_IGNOREHEALTH))
{
if (!AI_ForceTakeCover( dude ))
{
dude_mem = level.global_cast_memory[dude->character_index][dude->enemy->character_index];
// pretend that we haven't seen them in a while
dude_mem->timestamp = level.time - 5;
dude_mem->flags |= MEMORY_TAUNT;
dude_mem->ignore_time = level.time + 2;
// dude->enemy = NULL;
}
else
{
if (DEBUG_AI_BOUNDARY)
gi.dprintf( "%s taking cover\n", dude->name );
}
}
}
if ((dude->cast_info.aiflags & (AI_TAKE_COVER|AI_TAKECOVER_IGNOREHEALTH)) != (AI_TAKE_COVER|AI_TAKECOVER_IGNOREHEALTH))
{
if (DEBUG_AI_BOUNDARY)
gi.dprintf( "Sending %s to start position\n", dude->name );
// go back to our start position
dude->goal_ent = dude->start_ent;
dude->goal_ent->cast_info.aiflags |= AI_GOAL_RUN;
thinker = G_Spawn();
thinker->owner = dude;
thinker->nextthink = level.time + 1;
thinker->think = boundary_takecover_think;
}
}
mem = mem->next;
}
*/
}
else if ((other->cast_info.aiflags & (AI_TAKE_COVER|AI_TAKECOVER_IGNOREHEALTH)) != (AI_TAKE_COVER|AI_TAKECOVER_IGNOREHEALTH))
{
if (DEBUG_AI_BOUNDARY)
gi.dprintf( "Sending %s to start position\n", other->name );
// start walking back to our start position
other->goal_ent = other->start_ent;
other->goal_ent->cast_info.aiflags |= AI_GOAL_RUN;
thinker = G_Spawn();
thinker->owner = other;
thinker->nextthink = level.time + 1;
thinker->think = boundary_takecover_think;
}
}
void SP_ai_boundary (edict_t *ent)
{
if (deathmatch->value)
{
G_FreeEdict(ent);
return;
}
ent->solid = SOLID_TRIGGER;
ent->touch = ai_boundary_touch;
// set the center pos
VectorAdd( ent->absmin, ent->absmax, ent->pos1 );
VectorScale( ent->pos1, 0.5, ent->pos1 );
ent->svflags |= SVF_NOCLIENT;
gi.setmodel (ent, ent->model);
gi.linkentity (ent);
}
//======================================================================================
/*QUAKED ai_event_hostile (.5 .5 0) ?
Character touching this brush will become a hostile enemy to all other characters
in LOS, that have the same "cast_group" as the brush.
"cast_group" must be > 0 for this brush to have any effect.
*/
void ai_event_hostile_touch (edict_t *self, edict_t *other, cplane_t *plane, csurface_t *surf)
{
int i;
cast_memory_t *mem;
edict_t *icast;
if (self->last_talk_time > (level.time - 0.5))
return;
self->last_talk_time = level.time;
if (!(other->svflags & SVF_MONSTER) && !(other->client))
return;
if (other->cast_group == self->cast_group)
return;
// for all characters that belong to this entity, make them hostile towards us
for (i=0; i<level.num_characters; i++)
{
if (!level.characters[i])
continue;
icast = level.characters[i];
if (icast->cast_group != self->cast_group)
continue;
if (icast->health <= 0 || !icast->inuse)
continue;
mem = level.global_cast_memory[i][other->character_index];
if (!mem)
continue;
if (mem->timestamp < (level.time - ENEMY_SIGHT_DURATION*2))
continue;
if (mem->flags & MEMORY_HOSTILE_ENEMY)
continue;
AI_MakeEnemy( icast, other, 0 );
// now send them to us, if they can see/hear us
if ( (mem->timestamp > (level.time - ENEMY_SIGHT_DURATION))
// || (gi.inPHS( other->s.origin, icast->s.origin ))
|| (gi.inPVS( other->s.origin, icast->s.origin )))
{
AI_RecordSighting( icast, other, VectorDistance(icast->s.origin, other->s.origin) );
}
}
}
void SP_ai_event_hostile (edict_t *ent)
{
if (deathmatch->value)
{
G_FreeEdict(ent);
return;
}
if (ent->cast_group < 1)
{
gi.dprintf("Warning: ai_event_hostile without a valid cast_group\n");
return;
}
ent->solid = SOLID_TRIGGER;
ent->touch = ai_event_hostile_touch;
ent->svflags |= SVF_NOCLIENT;
gi.setmodel (ent, ent->model);
gi.linkentity (ent);
}
//======================================================================================
/*QUAKED ai_event_follow (.5 .5 0) ?
Client touching this brush will become a leader to all other characters
in LOS, that have the same "cast_group" as the brush.
"cast_group" must be > 0 for this brush to have any effect.
*/
void ai_event_follow_touch (edict_t *self, edict_t *other, cplane_t *plane, csurface_t *surf)
{
int i;
edict_t *icast;
if (self->last_talk_time > (level.time - 0.5))
return;
self->last_talk_time = level.time;
if (!(other->client))
return;
if (other->cast_group != self->cast_group)
return;
// for all characters that belong to this entity, make them follow us
for (i=0; i<level.num_characters; i++)
{
if (!level.characters[i])
continue;
icast = level.characters[i];
if (icast->cast_group != self->cast_group)
continue;
if (icast->health <= 0 || !icast->inuse)
continue;
if (icast->leader)
continue;
icast->leader = other;
}
}
void SP_ai_event_follow (edict_t *ent)
{
if (deathmatch->value)
{
G_FreeEdict(ent);
return;
}
if (ent->cast_group < 1)
{
gi.dprintf("Warning: ai_event_follow without a valid cast_group\n");
return;
}
ent->solid = SOLID_TRIGGER;
ent->touch = ai_event_follow_touch;
ent->svflags |= SVF_NOCLIENT;
gi.setmodel (ent, ent->model);
gi.linkentity (ent);
}
//======================================================================================
/*QUAKED ai_guard (.5 .5 1) (-16 -16 -24) (16 16 48)
Set a cast's "guard_target" to the "targetname" of this entity.
That character will then guard this location.
"targetname" links to "guard_target" for the cast entity(s)
"guard_radius" is the max guarding radius (default = 512)
*/
void SP_ai_guard (edict_t *self)
{
if (deathmatch->value)
{
G_FreeEdict(self);
return;
}
self->movetype = MOVETYPE_NONE;
self->solid = SOLID_NOT;
VectorSet (self->mins, -16, -16, -24);
VectorSet (self->maxs, 16, 16, 48);
if (!self->guard_radius)
self->guard_radius = 512;
AI_Ent_droptofloor( self );
}
//======================================================================================
/*QUAKED ai_territory (.5 .5 0) ?
Marks the boundary of a gang's territory.
A character touching this will be deemed inside the gang's
territory. This means war if sighted.
!!NOTE!!: Point the "angles" in the direction of the territory. This lets
the AI know if the character is walking into or out of the territory.
"cast_group" is the group that owns this territory
"angles" points to the direction of the territory
"radius" distance from brush before the player will be attacked (default 512)
*/
void ai_territory_touch (edict_t *self, edict_t *other, cplane_t *plane, csurface_t *surf)
{
vec3_t vec;
if (!(other->svflags & SVF_MONSTER) && !(other->client))
return;
// are we going into, or out of the territory?
VectorSubtract( other->s.origin, self->pos1, vec );
vec[2] = 0;
VectorNormalize( vec );
if (DotProduct( vec, self->movedir ) > 0)
{ // going into
// if (nav_dynamic->value && other->client && (!other->last_territory_touched || (other->last_territory_touched->cast_group != self->cast_group)))
// gi.dprintf("%s going into %s territory\n", other->classname, EP_GetGangName(self->cast_group) );
if ((!other->last_territory_touched || (other->last_territory_touched->cast_group != self->cast_group)))
{
other->last_territory_touched = self;
other->current_territory = self->cast_group;
}
}
else // going out of
{
// if (nav_dynamic->value && other->client && other->last_territory_touched)
// gi.dprintf("%s leaving %s territory\n", other->classname, EP_GetGangName(self->cast_group) );
if (other->last_territory_touched)
{
other->last_territory_touched = NULL;
other->current_territory = self->cast_group;
}
}
other->time_territory_touched = level.time;
}
void SP_ai_territory ( edict_t *ent )
{
if (deathmatch->value)
{
G_FreeEdict(ent);
return;
}
ent->solid = SOLID_TRIGGER;
ent->touch = ai_territory_touch;
if (!ent->cast_group)
ent->cast_group = 2;
if (!ent->dmg_radius)
ent->dmg_radius = 512;
if (!ent->moral)
{
gi.dprintf( "\n\nWARNING: ai_territory without a 'moral' (defaulting to 7)\nUse a 'moral' = 1 to PREVENT the gang members getting hostile when you enter their turf\n\n" );
ent->moral = MORAL_AGGRESSIVE;
}
ent->svflags |= SVF_NOCLIENT;
gi.setmodel (ent, ent->model);
gi.linkentity (ent);
// set the center pos
VectorAdd( ent->absmin, ent->absmax, ent->pos1 );
VectorScale( ent->pos1, 0.5, ent->pos1 );
AngleVectors( ent->s.angles, ent->movedir, NULL, NULL );
}
/*QUAKED ai_safespot (.5 .5 1) (-16 -16 -24) (16 16 48)
Set a cast's "flee_target" to the "targetname" of this entity.
That character will then flee to this location.
"targetname" links to "flee_target" for the cast entity(s)
*/
void SP_ai_safespot (edict_t *self)
{
if (deathmatch->value)
{
G_FreeEdict(self);
return;
}
self->movetype = MOVETYPE_NONE;
self->solid = SOLID_NOT;
VectorSet (self->mins, -16, -16, -24);
VectorSet (self->maxs, 16, 16, 48);
AI_Ent_droptofloor( self );
}
/*QUAKED ai_reset (.5 .5 0) ?
This is a brush that will reset a cast location to his
startup location
FIXME: Is this implemented yet?
*/
void ai_reset_touch (edict_t *self, edict_t *other, cplane_t *plane, csurface_t *surf)
{
EP_Reset (self, other);
}
void SP_ai_reset (edict_t *ent)
{
if (deathmatch->value)
{
G_FreeEdict(ent);
return;
}
ent->solid = SOLID_TRIGGER;
ent->touch = ai_reset_touch;
ent->svflags |= SVF_NOCLIENT;
gi.setmodel (ent, ent->model);
gi.linkentity (ent);
}
/*QUAKED ai_combat_spot (.5 .5 1) (-16 -16 -24) (16 16 48)
A good place to go to get a vantage point during fighting.
*/
void SP_ai_combat_spot (edict_t *self)
{
if (deathmatch->value)
{
G_FreeEdict(self);
return;
}
self->movetype = MOVETYPE_NONE;
self->solid = SOLID_NOT;
VectorSet (self->mins, -16, -16, -24);
VectorSet (self->maxs, 16, 16, 48);
AI_Ent_droptofloor( self );
}
/*QUAKED ai_trigger_character (.5 .5 0) ?
When the player touches this brush, the targetted character will start
following it's path_corner.
"target" link this with the "targetname" of the character to be triggered
*/
void ai_trigger_character_touch (edict_t *self, edict_t *other, cplane_t *plane, csurface_t *surf);
void SP_ai_trigger_character (edict_t *ent)
{
if (deathmatch->value)
{
G_FreeEdict(ent);
return;
}
ent->solid = SOLID_TRIGGER;
ent->touch = ai_trigger_character_touch;
if (!ent->cast_group)
ent->cast_group = 2;
ent->svflags |= SVF_NOCLIENT;
gi.setmodel (ent, ent->model);
gi.linkentity (ent);
}
void ai_trigger_character_touch (edict_t *self, edict_t *other, cplane_t *plane, csurface_t *surf)
{
edict_t *trav=NULL;
if (!(other->client))
return;
while (trav = G_Find(trav, FOFS(targetname), self->target))
{
trav->spawnflags |= SPAWNFLAG_IMMEDIATE_FOLLOW_PATH;
}
}
/*QUAKED ai_locked_door (.5 .5 0) ?
A character touching this brush will check the targetted door to see if it is closed.
If so, the character will head towards the specified path_corner_cast.
Example use: guiding AI characters away from a locked door
"target" link this with the "targetname" of the door to check
"pathtarget" linked with "targetname" of path_corner_cast to head for
*/
void ai_locked_door_touch (edict_t *self, edict_t *other, cplane_t *plane, csurface_t *surf);
void locked_door_think( edict_t *ent )
{
if (ent->pathtarget)
ent->target_ent = G_Find( NULL, FOFS(targetname), ent->pathtarget );
if (!ent->target_ent)
{
gi.dprintf( "ai_locked_door has invalid pathtarget (should point to a path_corner_cast)\n" );
return;
}
if (ent->target)
ent->goal_ent = G_Find( NULL, FOFS(targetname), ent->target );
if (!ent->goal_ent)
{
gi.dprintf( "ai_locked_door has invalid target (should point to a door)\n" );
return;
}
}
void SP_ai_locked_door (edict_t *ent)
{
if (deathmatch->value)
{
G_FreeEdict(ent);
return;
}
ent->solid = SOLID_TRIGGER;
ent->touch = ai_locked_door_touch;
ent->svflags |= SVF_NOCLIENT;
ent->think = locked_door_think;
ent->nextthink = level.time + 0.1;
gi.setmodel (ent, ent->model);
gi.linkentity (ent);
}
void ai_locked_door_touch (edict_t *self, edict_t *other, cplane_t *plane, csurface_t *surf)
{
if (!self->goal_ent)
return;
// JOSEPH 14-MAY-99
if (!(other->svflags & SVF_MONSTER))
return;
// END JOSEPH
if (other->goal_ent == self->goal_ent)
return;
// if it's not closed, ignore
if (!(self->goal_ent->moveinfo.state == STATE_BOTTOM || self->goal_ent->moveinfo.state == STATE_DOWN))
return;
other->goal_ent = self->goal_ent;
other->cast_info.aiflags |= AI_GOAL_IGNOREENEMY;
}
//======================================================================================
void ai_button_touch (edict_t *self, edict_t *other, cplane_t *plane, csurface_t *surf)
{
// JOSEPH 14-MAY-99
if (!(other->svflags & SVF_MONSTER))
return;
// END JOSEPH
self->owner->use( self->owner, other, other );
}
void ai_button_think (edict_t *self)
{
edict_t *trav;
route_t r;
// disabled this, doesn't work too well, need a better approach
// eg. they'll activate lifts when they shouldn't
return;
// check characters to see if any are within range
while ( (self->count < level.num_characters)
&& (level.characters[self->count])
&& ( (level.characters[self->count]->client)
|| (level.characters[self->count]->health < 0)))
{
self->count++;
}
if (self->count < level.num_characters)
{ // check this character
if (!level.characters[self->count])
goto fail;
trav = level.characters[self->count];
if (!trav->inuse || trav->health <= 0)
goto fail;
if (trav->activator)
goto fail;
if (trav->cast_info.currentmove->frame->aifunc != ai_run)
goto fail;
if (VectorDistance( trav->s.origin, self->s.origin ) > 200)
goto fail;
if (!AI_ClearSight( self, trav, false ))
goto fail;
if (!NAV_Route_EntityToEntity( trav, NULL, self, VIS_PARTIAL, false, &r ))
goto fail;
// good enough..
trav->activator = self->owner;
}
fail:
self->count++;
if (self->count > level.num_characters)
self->count = 0;
self->nextthink = level.time + 0.1;
}

586
gamesrc/g_ai_fight.c Normal file
View file

@ -0,0 +1,586 @@
//==============================================================
// g_ai_fight.c
//
// Combat oriented AI routines
//==============================================================
#include "g_local.h"
//============================================================================
void AI_CheckMakeEnemy( edict_t *self, edict_t *other )
{
if (other != self->enemy && other->cast_group != self->cast_group && other->enemy == self)
{ // make them our enemy now
if ( !self->enemy
|| !(self->cast_info.aiflags & AI_MELEE)
|| VectorDistance(self->s.origin, other->s.origin) < 128)
{
if (level.global_cast_memory[self->character_index][other->character_index])
self->enemy = other;
}
}
}
/*
==================
AI_BeginAttack
Returns true if OK to attack, false otherwise
May start a new movement for the character, to straighten up, or avoid something/someone
==================
*/
qboolean AI_BeginAttack( edict_t *self )
{
vec3_t vec;
float dist;
// Ridah, 7-5-99, If they've been ordered to attack us by a client, get mad at them also
if (self->enemy && self->enemy->leader)
AI_MakeEnemy( self, self->enemy->leader, 0 );
if (!self->enemy || (self->enemy->health <= 0))
{
self->cast_info.currentmove = self->cast_info.move_stand;
return false;
}
dist = VectorDistance( self->s.origin, self->enemy->s.origin );
// Ridah, 19-may-99, Grenade AI
if (self->cast_info.aiflags & AI_GRENADE_GUY)
{
if (( self->s.origin[2] - self->enemy->s.origin[2] ) < -256)
{
if (self->cast_info.currentmove != self->cast_info.move_avoid_run)
AI_EndAttack(self); // try find something else to do
return false;
}
}
if ( !(self->cast_info.aiflags & AI_SIDE_ATTACK))
// Ridah 7/5/99, fixes shooting with back to player (happens in SR1 courtyard sometimes)
// && ( (dist > FACE_ANIM_DIST)
// || (self->cast_info.aiflags & AI_FACE_ATTACK)))
{
if (!directly_infront(self, self->enemy))
{ // we need to straighten up
float dist;
VectorSubtract( self->enemy->s.origin, self->s.origin, vec );
dist = VectorNormalize( vec );
self->ideal_yaw = vectoyaw( vec );
if ((dist > 384) && (self->maxs[2] == self->cast_info.standing_max_z))
{
int side_result;
side_result = AI_SideTrace( self, 48, 90, SIDE_RANDOM );
if (side_result && self->cast_info.move_lside_step)
{
if (side_result < 0)
self->cast_info.currentmove = self->cast_info.move_lside_step;
else
self->cast_info.currentmove = self->cast_info.move_rside_step;
}
else
{
self->cast_info.currentmove = self->cast_info.move_avoid_walk;
}
return false;
}
else
{
M_ChangeYaw(self);
}
}
}
/*
if ( (self->cast_info.move_avoid_reverse_run)
&& (self->cast_info.last_reverse < (level.time - 5))
&& (dist < 64))
{
// trace a line backwards, make sure we can move there
if ( AI_YawTrace( self, 64, 180 ) )
{
self->cast_info.currentmove = self->cast_info.move_avoid_reverse_run;
self->cast_info.last_reverse = level.time;
return false;
}
}
*/
if (!AI_ClearSight(self, self->enemy, true))
{ // can't see them directly, will we hit another enemy? if so keep firing
static vec3_t mins = { -8, -8, -4 };
static vec3_t maxs = { 8, 8, 4 };
vec3_t start, end;
trace_t tr;
cast_memory_t *tr_memory;
VectorCopy( self->s.origin, start );
start[2] += self->viewheight - 8;
VectorCopy( self->enemy->s.origin, end );
end[2] += self->enemy->viewheight - 8;
tr = gi.trace( start, mins, maxs, end, self, MASK_PLAYERSOLID );
if (tr.fraction < 1)
{
if (tr.ent == world)
{
if (self->cast_info.currentmove != self->cast_info.move_avoid_run)
AI_EndAttack(self); // try find something else to do
return false;
}
else if (tr.ent->svflags & SVF_MONSTER || tr.ent->client)
{
tr_memory = level.global_cast_memory[self->character_index][tr.ent->character_index];
if (!tr_memory || !(tr_memory->flags & MEMORY_HOSTILE_ENEMY))
{
if (self->cast_info.currentmove != self->cast_info.move_avoid_run)
AI_EndAttack(self); // try find something else to do
return false;
}
}
}
}
if (self->dont_takecover_time == 99999)
{ // attack for at least 2 seconds
if (!(self->cast_info.aiflags & AI_MELEE))
self->dont_takecover_time = level.time + 2 + random()*4;
else
self->dont_takecover_time = 0;
}
return true;
}
/*
=============
AI_AvoidDangerousEntity
Alerts all AI in vaccinity of the given ent, so they can flee if possible
=============
*/
void AI_AvoidDangerousEntity( edict_t *ent )
{
int i;
float old_time;
if (deathmatch->value)
return;
ent->s.origin[2] += 4;
old_time = level.time;
for (i=1; i<level.num_characters; i++)
{
if (!level.characters[i] || level.characters[i]->health <= 0)
continue;
if (level.characters[i] == ent)
continue;
if (!ent->client && VectorDistance( level.characters[i]->s.origin, ent->s.origin ) > ent->dmg_radius*2)
continue;
// if they are already fleeing this ent, check our fleeing position
if (level.characters[i]->cast_info.aiflags & AI_TAKE_COVER)
{
if (level.characters[i]->combat_goalent && !CanDamage( level.characters[i]->combat_goalent, ent ))
continue;
}
if (!gi.inPVS( level.characters[i]->s.origin, ent->s.origin ))
continue;
if ((VectorDistance( level.characters[i]->s.origin, ent->s.origin ) > 64) && !CanDamage( level.characters[i], ent))
continue;
// gi.dprintf( "RUN FOR YOUR LIVES!!!!\n" );
level.characters[i]->last_gethidepos = 0;
level.time -= 0.1; // so we bypass speed optimization
AI_ForceTakeCover( level.characters[i], ent, (ent->client == NULL) );
ent->noise_time = level.time;
}
level.time = old_time;
ent->s.origin[2] -= 4;
}
/*
=============
AI_CheckAttack
Generic check for ability and willingness to attack our enemy
=============
*/
qboolean AI_CheckAttack(edict_t *self)
{
float dist;
// Ridah, 17-may-99, fixes health_threshold not working
if (self->goal_ent && (self->cast_info.aiflags & AI_GOAL_IGNOREENEMY) && (VectorDistance(self->s.origin, self->goal_ent->s.origin) > 256))
{
self->cast_info.currentmove = self->cast_info.move_run;
return false;
}
if ( !self->cast_info.attack || !self->cast_info.long_attack )
return false; // never attack if we are unable to
if (!self->cast_info.move_run)
return false;
if (self->cast_info.pausetime > (level.time - 1))
return false;
if (self->combat_goalent && (VectorDistance(self->s.origin, self->combat_goalent->s.origin) > 128))
return false;
if (!AI_HasLeaderButGoForEnemy(self, self->enemy))
{
return false;
}
if ( !self->enemy || (self->enemy->health <= 0) || !self->enemy->inuse )
{
self->enemy = NULL;
return false;
}
if ( !AI_ClearSight( self, self->enemy, true ) )
{
route_t route;
// we can't hit them from here, should we pursue them?
if ( NAV_Route_EntityToEntity( self, NULL, self->enemy, VIS_PARTIAL, false, &route ) )
{
AI_StartRun( self );
}
return false;
}
if ( self->cast_info.aiflags & AI_MELEE )
{
if ( (fabs( self->s.origin[2] - self->enemy->s.origin[2] ) > 32)
|| (VectorDistance( self->s.origin, self->enemy->s.origin ) > 96 ))
{
return false;
}
}
dist = VectorDistance(self->enemy->s.origin, self->s.origin);
/*
if ( ((dist < FACE_ANIM_DIST) && !infront(self, self->enemy))
|| ((dist >= FACE_ANIM_DIST) && !directly_infront(self, self->enemy)))
{
vec3_t vec;
float dist;
// just straighten up
VectorSubtract( self->enemy->s.origin, self->s.origin, vec );
dist = VectorNormalize( vec );
if ( self->maxs[2] == self->cast_info.standing_max_z )
{
self->ideal_yaw = vectoyaw( vec );
if (dist < AI_GUARDING_DIST)
{
if (self->cast_info.move_avoid_reverse_walk)
self->cast_info.currentmove = self->cast_info.move_avoid_reverse_walk;
}
else
self->cast_info.avoid(self, self->enemy, true);
return true;
}
else
{
if (self->cast_info.move_avoid_crwalk)
{
self->ideal_yaw = vectoyaw( vec );
self->cast_info.currentmove = self->cast_info.move_avoid_crwalk;
return true;
}
else // just keep using ai_run()
{
self->cast_info.currentmove = self->cast_info.move_crwalk;
return false;
}
}
}
*/
if (dist < self->cast_info.max_attack_distance)
{
// we can attack from here
return self->cast_info.attack(self);
}
else if (!(self->cast_info.aiflags & AI_MELEE))
{ // attack from far away
self->cast_info.long_attack(self);
return false;
}
return false;
}
/*
===========
AI_Goto_CombatTarget
===========
*/
qboolean AI_Goto_CombatTarget( edict_t *self )
{
if (self->combattarget)
{
edict_t *target, *oldtarget;
target = NULL;
while ((target = G_Find (target, FOFS(targetname), self->combattarget)) != NULL)
{
if (strcmp(target->classname, "path_corner") == 0)
{
if (self->health > 0)
{
self->combat_goalent = target;
target->cast_info.aiflags |= AI_GOAL_RUN;
self->cast_info.aiflags |= AI_RUN_LIKE_HELL;
self->cast_info.currentmove = self->cast_info.move_run;
self->combattarget = NULL;
return true;
}
else // we're dead, but check for pathtarget's
{
oldtarget = target;
// check all items in chain
while (target)
{
if (target->pathtarget)
{ // fire it in 2 seconds (otherwise we might cause a loop)
char *savetarget;
if (target->delay < 2)
target->delay = 2;
savetarget = target->target;
target->target = target->pathtarget;
G_UseTargets (target, self);
target->target = savetarget;
}
if (!target->target)
return false;
target = G_Find (NULL, FOFS(targetname), target->target);
if (target == oldtarget) // looped around
return false;
}
}
}
}
}
return false;
}
void GotoCombatTargetThink( edict_t *self )
{
if (self->owner->health > 0)
AI_Goto_CombatTarget( self->owner );
G_FreeEdict( self );
}
/*
===========
AI_StartAttack
Begins an attack on enemy
===========
*/
void AI_StartAttack(edict_t *self, edict_t *enemy)
{
mmove_t *oldmove;
cast_memory_t *mem;
if (!self->pain_debounce_time)
self->pain_debounce_time = 0.1; // so we attack them from now on
// FIXME: remember the current enemy, if it exists?
self->enemy = enemy;
if (mem = level.global_cast_memory[self->character_index][enemy->character_index])
{
mem->flags |= MEMORY_STARTED_ATTACK;
}
if (self->combattarget)
{
if (self->delay)
{ // set a thinker to get us moving
edict_t *thinker;
thinker = G_Spawn();
thinker->owner = self;
thinker->think = GotoCombatTargetThink;
thinker->nextthink = level.time + self->delay;
}
else // go now
{
if (AI_Goto_CombatTarget( self ))
return;
}
}
oldmove = self->cast_info.currentmove;
self->cast_info.checkattack(self);
if (oldmove == self->cast_info.currentmove)
{ // start running
self->cast_info.currentmove = self->cast_info.move_run;
}
}
//============================================================================
// General Combat AI routines
#define COMBAT_FORCED_HIDE 1
/*
=============
CombatHideThink
=============
*/
/*
void CombatHideThink ( edict_t *thinker )
{
edict_t *ent;
ent = thinker->owner;
if (!(ent->cast_info.aiflags & AI_TAKE_COVER))
{ // not hiding anymore so free ourself
G_FreeEdict( thinker );
}
}
*/
/*
=============
AI_ProcessCombat
For each AI character, take a look at what they're currently doing, and look
for something they could be doing that would be better for them.
=============
*/
void CheckStillHiding( edict_t *self );
void AI_ProcessCombat (void)
{
int i;
edict_t *ent;
for (i=0; i<level.num_characters; i++)
{
ent = level.characters[i];
if (!ent || ent->client)
continue;
if (!ent->enemy)
continue;
if (ent->health <= 0)
continue;
if (ent->enemy->health <= 0)
continue;
if (AI_ClearSight( ent, ent->enemy, false ))
{ // visible
ent->combat_last_visible = level.time;
VectorCopy( ent->enemy->s.origin, ent->combat_last_visible_pos );
}
else // not visible
{
if (!(ent->cast_info.aiflags & AI_TAKE_COVER))
{ // not currently hiding
// should we start hiding, rather than walk straight into their trap?
if ( (ent->combat_last_visible > (level.time - 0.5))
&& ( (!ent->enemy->client && !(ent->enemy->cast_info.aiflags & AI_MELEE))
|| (ent->enemy->client && ent->enemy->client->pers.weapon && ent->enemy->client->pers.weapon->ammo))) // they have a weapon capable of doing some damage
{
// ok so start hiding, but should we hide from the position they were last visible from? or just them?
if ((ent->moral < MORAL_PSYCOTIC) /*&& (VectorDistance( ent->enemy->s.origin, ent->combat_last_visible_pos ) < (256 * ent->moral))*/)
{ // hide from last visible position
{
vec3_t org;
VectorCopy( ent->enemy->s.origin, org );
VectorCopy( ent->combat_last_visible_pos, ent->enemy->s.origin );
AI_ForceTakeCover( ent, ent->enemy, true );
VectorCopy( org, ent->enemy->s.origin );
if (ent->moral > 2) // don't wait there forever
{
ent->cast_info.aiflags &= ~AI_TAKECOVER_IGNOREHEALTH;
ent->take_cover_time = level.time + (float)(ent->moral * 2);
}
}
}
}
}
else // we are currently hiding, yell something out perhaps?
{
}
}
}
}

1476
gamesrc/g_ai_memory.c Normal file

File diff suppressed because it is too large Load diff

9902
gamesrc/g_joe_misc.c Normal file

File diff suppressed because it is too large Load diff

680
gamesrc/g_teamplay.c Normal file
View file

@ -0,0 +1,680 @@
// g_teamplay.c - teamplay oriented code
#include "g_local.h"
// current teamplay mode (set by "level.style")
teamplay_mode_t teamplay_mode;
#define CASH_ROLL 10
#define CASH_BAG 25
#define MAX_CASH_ITEMS 10 // never spawn more than this many cash items at once
int num_cash_items;
char *team_names[] = {
"(spectator)",
"Dragons",
"Nikki's Boyz",
NULL
};
int team_cash[3]; // cash per team, 0 is neutral so just ignore
float last_safe_withdrawal[3];
float last_safe_deposit[3];
//=====================================================================
// Entity spawn functions
// ....................................................................
// Cash Spawning during GRAB DA LOOT
void cash_touch( edict_t *self, edict_t *other, cplane_t *plane, csurface_t *surf)
{
float speed;
if (surf && plane && plane->normal[2] > 0.5)
{ // let it rest here
if ((speed = VectorLength( self->velocity )) > 10)
{
self->s.angles[ROLL] = 0;
self->s.angles[PITCH] = 0;
self->avelocity[PITCH] = 0;
self->avelocity[ROLL] = 0;
self->avelocity[YAW] *= 0.5;
// randomize bounce
VectorAdd( self->velocity, tv( crandom()*speed*0.3, crandom()*speed*0.3, random()*speed*0.15 ), self->velocity );
}
else
{
VectorClear( self->velocity );
VectorClear( self->avelocity );
self->s.angles[PITCH] = 0;
self->s.angles[ROLL] = 0;
self->movetype = MOVETYPE_NONE;
}
return;
}
if (other->client)
{
if (other->client->pers.currentcash < MAX_CASH_PLAYER)
{ // they can hold the cash
if ((self->currentcash == CASH_BAG) || (self->movetype != MOVETYPE_NONE) || (other->client->ps.pmove.pm_flags & PMF_DUCKED))
{ // they can pick it up
Touch_Item( self, other, plane, surf );
num_cash_items--;
G_FreeEdict( self );
return;
}
}
}
}
void cash_kill( edict_t *self )
{
num_cash_items--;
G_FreeEdict( self );
}
void cashroll_animate( edict_t *self )
{
// reduce XY velocity (air friction)
self->velocity[0] *= 0.9;
self->velocity[1] *= 0.9;
if (level.time > (self->timestamp))
{
cash_kill( self );
return;
}
if (self->movetype != MOVETYPE_NONE)
{
if (VectorDistance( self->s.origin, self->pos1 ) < 1)
self->count++;
else
self->count = 0;
VectorCopy( self->s.origin, self->pos1 );
if (self->count > 2) // rested for 2 frames
{
VectorClear( self->velocity );
VectorClear( self->avelocity );
self->s.angles[PITCH] = 0;
self->s.angles[ROLL] = 0;
self->movetype = MOVETYPE_NONE;
}
}
self->nextthink = level.time + 0.1;
}
void cashspawn_think( edict_t *self )
{
edict_t *cash;
if (num_cash_items > MAX_CASH_ITEMS)
{
self->nextthink = level.time + self->delay;
return;
}
// spawn some money
cash = G_Spawn();
VectorCopy( self->s.origin, cash->s.origin );
cash->movetype = MOVETYPE_BOUNCE;
cash->solid = SOLID_TRIGGER;
AngleVectors( self->s.angles, cash->velocity, NULL, NULL );
VectorScale( cash->velocity, self->speed, cash->velocity );
// randomize the velocity a bit
VectorAdd( cash->velocity, tv( crandom()*self->speed*0.3, crandom()*self->speed*0.3, crandom()*self->speed*0.15 ), cash->velocity );
cash->s.renderfx2 |= RF2_NOSHADOW;
// FIXME: doh this doesn't work, need to spawn actual item's, so the HUD is updated automatically when picking up
if (!strcmp(self->type, "cashroll"))
{ // small dollar notes
cash->s.modelindex = gi.modelindex( "models/pu_icon/cash/tris.md2" );
cash->gravity = 0.1 + random()*0.5;
cash->think = cashroll_animate;
cash->nextthink = level.time + 0.1;
cash->s.angles[PITCH] = 10;
VectorSet( cash->avelocity, 0, 10000 * cash->gravity, 0 );
VectorSet( cash->mins, -4, -4, -15 );
VectorSet( cash->maxs, 4, 4, -13 );
cash->item = FindItem("Cash");
cash->currentcash = CASH_ROLL;
cash->touch = cash_touch;
cash->timestamp = level.time + 60;
cash->think = cashroll_animate;
cash->nextthink = level.time + 0.1;
}
else
{
cash->s.modelindex = gi.modelindex( "models/pu_icon/money/money_sm.md2" );
cash->gravity = 1.0;
VectorSet( cash->mins, -12, -12, -15 );
VectorSet( cash->maxs, 12, 12, 10 );
cash->item = FindItem("Small Cash Bag");
cash->currentcash = CASH_BAG;
cash->touch = cash_touch;
cash->think = cash_kill;
cash->nextthink = level.time + 60;
}
num_cash_items++;
self->nextthink = level.time + self->delay;
}
/*QUAKED dm_cashspawn (0.5 0 1) (-16 -16 -16) (16 16 16)
Spawn location for cash during "Grab da Loot" games
angle - direction to project cash upon spawning
speed - speed of projection
type - "cashroll" or "cashbag" (more money, longer delay)
*/
void SP_dm_cashspawn( edict_t *self )
{
if (!teamplay->value || ((int)teamplay->value != TM_AUTO && (int)teamplay->value != TM_GRABDALOOT))
return;
// set the game to "Grab da Loot"
teamplay_mode = TM_GRABDALOOT;
num_cash_items = 0;
if (!strcmp(self->type, "cashroll"))
{
self->delay = (float)g_cashspawndelay->value;
}
else // bag, so longer delay
{
self->delay = (float)g_cashspawndelay->value * (CASH_BAG / CASH_ROLL);
}
if (!self->speed)
self->speed = 10;
self->think = cashspawn_think;
self->nextthink = level.time + self->delay;
}
// ....................................................................
// Safe Bag, used for Grab Da Loot and teamplay Cash-Match
void safebag_touch( edict_t *self, edict_t *other, cplane_t *plane, csurface_t *surf)
{
static float last_touch_time;
static edict_t *last_touch_ent;
static int last_touch_count = 0;
if (!other->client)
return;
if ((level.time < last_touch_time) || (last_touch_time && (last_touch_time < (level.time - 2.0))) || (last_touch_ent && (last_touch_ent != other)))
{ // reset
last_touch_time = 0;
last_touch_ent = NULL;
last_touch_count = 0;
}
else if (last_touch_time > (level.time - 0.1))
{
return;
}
else
{
last_touch_count++;
last_touch_time = level.time;
if (last_touch_count > (int)(50.0 * (1.0 + (0.5*(other->client->pers.team == self->style)))))
{
// let them go away on their own terms
T_Damage( other, other, other, vec3_origin, other->s.origin, vec3_origin, 9999, 0, 0, MOD_SAFECAMPER );
last_touch_count = 0;
}
}
last_touch_ent = other;
if (self->timestamp > (level.time - 1.0))
return;
self->timestamp = level.time;
// depositing, or withdrawing?
if (other->client->pers.team == self->style)
{ // deposit
if (other->client->pers.currentcash > 0 || other->client->pers.bagcash > 0)
{
int precash, amount;
precash = team_cash[self->style];
team_cash[self->style] += other->client->pers.currentcash;
team_cash[self->style] += other->client->pers.bagcash;
other->client->resp.deposited += other->client->pers.currentcash;
other->client->resp.deposited += other->client->pers.bagcash;
other->client->pers.currentcash = 0;
other->client->pers.bagcash = 0;
gi.sound(other, CHAN_ITEM, gi.soundindex("world/pickups/cash.wav"), 1, 3, 0);
// make a droping sound
gi.positioned_sound(self->s.origin, self, CHAN_ITEM, gi.soundindex("world/doors/dr1_end.wav"), 1, 1, 0);
// let everyone know how much was deposited
amount = team_cash[self->style] - precash;
gi.bprintf( PRINT_MEDIUM, "%s deposited $%i\n", other->client->pers.netname, amount );
last_safe_deposit[self->style] = level.time;
}
}
else if (team_cash[self->style] > 0)
{ // withdrawal
if (other->client->pers.bagcash < MAX_BAGCASH_PLAYER)
{
int precash, amount;
precash = team_cash[self->style];
team_cash[self->style] -= (MAX_BAGCASH_PLAYER - other->client->pers.bagcash);
other->client->pers.bagcash += (MAX_BAGCASH_PLAYER - other->client->pers.bagcash);
if (team_cash[self->style] < 0)
{ // don't take more than they have
other->client->pers.bagcash += team_cash[self->style];
team_cash[self->style] = 0;
}
gi.sound(other, CHAN_ITEM, gi.soundindex("world/pickups/cash.wav"), 1, 3, 0);
// alarm!
gi.positioned_sound(self->s.origin, self, CHAN_ITEM, gi.soundindex("misc/cashmatch_alarm.wav"), 1, 1, 0);
// let everyone know how much was stolen
amount = precash - team_cash[self->style];
gi.bprintf( PRINT_MEDIUM, "%s stole $%i from %s's safe!\n", other->client->pers.netname, amount, team_names[self->style] );
last_safe_withdrawal[self->style] = level.time;
}
}
}
// Safebag think, if a friendly guy has been standing near us for more than a few seconds, make them vulnerable to friendly fire
void safebag_think(edict_t *self)
{
int i;
edict_t *trav;
qboolean noenemies = true;
#define SAFE_CLOSE_DIST 128
#define MAX_TIMEATSAFE 8.0
// first, check if we have any unwanted enemies around, if so, don't count
for (i=0; i<maxclients->value; i++)
{
trav = &g_edicts[i+1];
if (!trav->inuse || !trav->client)
continue;
if (trav->health <= 0)
continue;
if (!trav->client->pers.team || (trav->client->pers.team == self->style))
continue;
if (VectorDistance( self->s.origin, trav->s.origin ) > 512)
continue;
if (!gi.inPVS( self->s.origin, trav->s.origin ))
continue;
noenemies = false;
}
for (i=0; i<maxclients->value; i++)
{
trav = &g_edicts[i+1];
if (!trav->inuse || !trav->client)
continue;
if (trav->health <= 0)
continue;
if (!trav->client->pers.team || (trav->client->pers.team != self->style))
continue;
if (noenemies)
{
if (VectorDistance( self->s.origin, trav->s.origin ) > SAFE_CLOSE_DIST)
{
trav->client->pers.timeatsafe -= 0.2;
if (trav->client->pers.timeatsafe < 0)
trav->client->pers.timeatsafe = 0;
}
else
{
trav->client->pers.timeatsafe += 0.2;
if (trav->client->pers.timeatsafe > MAX_TIMEATSAFE)
trav->client->pers.timeatsafe = MAX_TIMEATSAFE;
}
if (trav->client->pers.timeatsafe >= MAX_TIMEATSAFE)
trav->client->pers.friendly_vulnerable = true;
else
trav->client->pers.friendly_vulnerable = false;
}
else // turn off vulnerability, there is an enemy in range
{
trav->client->pers.friendly_vulnerable = false;
}
}
self->nextthink = level.time + 0.2;
}
/*QUAKED dm_safebag (0.5 0 1) (-12 -12 -16) (12 12 12)
Bag that holds the money in the safe.
style - team that this bag belongs to (1 or 2)
*/
void SP_dm_safebag( edict_t *self )
{
if (!teamplay->value)
{
G_FreeEdict( self );
return;
}
if (self->style < 1 || self->style > 2)
{
gi.dprintf( "dm_safebag has invalid \"style\" at %s, should be 1 or 2.\n", vtos(self->s.origin));
G_FreeEdict( self );
return;
}
self->s.modelindex = gi.modelindex("models/pu_icon/money/money_lg.md2");
VectorSet( self->mins, -12, -12, -16 );
VectorSet( self->maxs, 12, 12, 12 );
self->movetype = MOVETYPE_NONE;
self->solid = SOLID_TRIGGER;
gi.linkentity( self );
self->touch = safebag_touch;
self->currentcash = 0; // start with no cash
self->think = safebag_think;
self->nextthink = level.time + 2;
}
/*QUAKED dm_props_banner (.5 0 1) (-4 -4 -4) (4 4 4)
Temp banner for teamplay
style = team (1 / 2)
scale = scale the size up/down (2 = double size)
model="models\props\temp\triangle\small.md2"
*/
void SP_dm_props_banner (edict_t *self)
{
// vec3_t end, bestnorm, bestend;
// float bestdist;
// int x,y;
// trace_t tr;
if (!deathmatch->value || !teamplay->value)
{ // remove
G_FreeEdict (self);
return;
}
if (!self->style)
{
gi.dprintf( "%s has invalid style (should be 1 or 2) at %s\n", self->classname, vtos(self->s.origin) );
G_FreeEdict (self);
return;
}
/*
// trace a line back, to get the wall, then go out
{
bestdist = 9999;
for (x=-256; x<300; x+= 256)
{
VectorCopy( self->s.origin, end );
end[0] = self->s.origin[0] + x;
tr = gi.trace( self->s.origin, NULL, NULL, end, NULL, MASK_SOLID );
if (tr.fraction < bestdist)
{
VectorCopy( tr.plane.normal, bestnorm );
VectorCopy( tr.endpos, bestend );
bestdist = tr.fraction;
}
}
for (y=-256; y<300; y+= 256)
{
VectorCopy( self->s.origin, end );
end[1] = self->s.origin[1] + y;
tr = gi.trace( self->s.origin, NULL, NULL, end, NULL, MASK_SOLID );
if (tr.fraction < bestdist)
{
VectorCopy( tr.plane.normal, bestnorm );
VectorCopy( tr.endpos, bestend );
bestdist = tr.fraction;
}
}
vectoangles( bestnorm, self->s.angles );
VectorMA( bestend, 40 * self->cast_info.scale, bestnorm, self->s.origin );
}
*/
// Ridah, 1-jun-99, use flag models for now
#if 1
{
void think_flag (edict_t *self);
// self->solid = SOLID_BBOX;
self->movetype = MOVETYPE_NONE;
if (self->style == 2)
{
self->model = "models/props/flag/flag1.md2";
}
else
{
self->model = "models/props/flag/flag3.md2";
}
self->s.modelindex = gi.modelindex (self->model);
self->s.renderfx2 |= RF2_NOSHADOW;
self->s.renderfx |= RF_MINLIGHT;
if (!self->cast_info.scale)
self->cast_info.scale = 1;
self->s.scale = (self->cast_info.scale - 1);
// VectorMA( bestend, 40 * self->cast_info.scale, bestnorm, self->s.origin );
self->cast_info.scale *= 0.3;
gi.linkentity (self);
self->s.effects |= EF_ANIM_ALLFAST_NEW;
self->s.renderfx2 |= RF2_MODULUS_FRAME;
self->s.renderfx2 |= RDF_NOLERP;
// Disabled, doesn't animate much, and uses bandwidth
// self->nextthink = level.time + FRAMETIME *2;
// self->think = think_flag;
}
#else // TRIANGULAR ROTATING ICONS
self->solid = SOLID_NOT;
self->movetype = MOVETYPE_NONE;
self->s.skinnum = self->style - 1;
self->s.renderfx2 |= RF2_NOSHADOW;
self->s.renderfx |= RF_MINLIGHT;
if (!self->cast_info.scale)
self->cast_info.scale = 1;
self->s.scale = self->cast_info.scale - 1;
self->s.modelindex = gi.modelindex ("models/props/temp/triangle/small.md2");
gi.linkentity (self);
{
edict_t *arm;
arm = G_Spawn();
arm->solid = self->solid;
arm->movetype = self->movetype;
arm->s.renderfx2 |= RF2_NOSHADOW;
arm->s.scale = self->s.scale;
VectorCopy( self->s.origin, arm->s.origin );
VectorCopy( self->s.angles, arm->s.angles );
arm->s.modelindex = gi.modelindex ("models/props/temp/triangle/arm.md2");
gi.linkentity (arm);
}
VectorCopy( self->s.angles, self->last_step_pos );
VectorClear( self->move_angles );
#endif
}
// ....................................................................
void Teamplay_ValidateSkin( edict_t *self )
{
// TODO: we need color coded skins, for now, just use any skin
}
extern void ClientUserinfoChanged (edict_t *ent, char *userinfo);
qboolean Teamplay_ValidateJoinTeam( edict_t *self, int teamindex )
{
// NOTE: this is called by each player on level change, as well as when a player issues a "join XXX" command
// TODO: player limit per team? cvar?
// setup client stuff
self->movetype = MOVETYPE_WALK;
self->solid = SOLID_BBOX;
self->svflags &= ~SVF_NOCLIENT;
Teamplay_ValidateSkin( self );
// InitClientPersistant (self->client);
self->client->pers.team = teamindex;
/*
// Validate skins
{
char *str[256];
strcpy( str, self->client->pers.userinfo );
ClientUserinfoChanged ( self, str );
}
*/
self->health = 0; // so we're not counted in spawn point checking
self->client->resp.enterframe = level.framenum;
InitClientResp( self->client );
PutClientInServer( self ); // find a new spawn point
gi.bprintf( PRINT_HIGH, "%s joined %s\n", self->client->pers.netname, team_names[teamindex] );
return true;
}
void Teamplay_AutoJoinTeam( edict_t *self )
{
int team_count[2];
int i;
// count number of players on each team, assign the team with least players
team_count[0] = 0;
team_count[1] = 0;
for (i=1; i<maxclients->value; i++)
{
if (g_edicts[i].client && g_edicts[i].client->pers.team)
team_count[g_edicts[i].client->pers.team - 1]++;
}
if (team_count[0] > team_count[1])
self->client->pers.team = 2;
else
self->client->pers.team = 1;
Teamplay_ValidateJoinTeam( self, self->client->pers.team );
}
void Teamplay_InitTeamplay (void)
{
num_cash_items = 0;
memset( team_cash, 0, sizeof(int) * 3 );
memset( last_safe_withdrawal, 0, sizeof(float) * 3 );
memset( last_safe_deposit, 0, sizeof(float) * 3 );
last_safe_deposit[0] = last_safe_deposit[1] = 0;
last_safe_withdrawal[0] = last_safe_withdrawal[1] = 0;
}

48
gamesrc/g_teamplay.h Normal file
View file

@ -0,0 +1,48 @@
// ....................................................................
// teamplay.h - teamplay defines
typedef enum
{
TM_NONE,
TM_AUTO,
TM_CASHMATCH,
TM_GRABDALOOT,
TM_GANGBANG // Ridah, 27-may-99, just normal deathmatch, but with Kings/Pins teams
} teamplay_mode_t;
typedef enum
{
TEAM_NONE,
TEAM_1,
TEAM_2,
} teams_t;
#define MAX_CASH_PLAYER 150 // make this a cvar?
#define MAX_BAGCASH_PLAYER 200 // make this a cvar?
// ....................................................................
extern char *team_names[];
extern teamplay_mode_t teamplay_mode;
extern int num_cash_items;
extern int team_cash[3]; // cash per team, 0 is neutral so just ignore
extern float last_safe_withdrawal[3];
extern float last_safe_deposit[3];
// ....................................................................
// Spawn functions
void SP_dm_cashspawn( edict_t *self );
void SP_dm_safebag( edict_t *self );
void SP_dm_props_banner (edict_t *self);
// ....................................................................
// Other declarations
void Teamplay_ValidateSkin( edict_t *self );
qboolean Teamplay_ValidateJoinTeam( edict_t *self, int teamindex );
void Teamplay_InitTeamplay (void);

1128
gamesrc/g_trigger.c Normal file

File diff suppressed because it is too large Load diff

1192
gamesrc/game.dsp Normal file

File diff suppressed because it is too large Load diff

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show more