--- /dev/null
+src/engine/*.o
+src/fpsgame/*.o
+src/shared/*.o
+src/engine/engine.gch
+src/fpsgame/game.gch
+src/shared/cube.h.gch
+src/sauer_client
+src/sauer_server
+bin_unix/*
+++ /dev/null
-mapmodelreset // start counting from 0 again
-
-mmodel "tree1" // 0
-
-mmodel "dcp/tree2" // 1
-mmodel "dcp/tree3" // 2
-mmodel "dcp/palmtree" // 3
-mmodel "dcp/thorns" // 4
-mmodel "dcp/plant1" // 5
-mmodel "dcp/grass" // 6
-mmodel "dcp/ivy" // 7
-
-mmodel "dcp/barrel" // 8
-mmodel "dcp/streetlamp" // 9
-mmodel "dcp/bench" // 10
-mmodel "dcp/pillar" // 11
-mmodel "dcp/waterbowl" // 12
-mmodel "dcp/jumppad2" // 13
-
-mmodel "dcp/leafs" // 14
-mmodel "dcp/valve" // 15
-mmodel "dcp/palette" // 16
-
-mmodel "dcp/vent" // 17
-mmodel "dcp/mushroom" // 18
-mmodel "dcp/biotank" // 19
-
-mmodel "dcp/groundlamp" // 20
-mmodel "dcp/console" // 21
-mmodel "dcp/turret" // 22
-
-// for use as triggers:
-
-mmodel "carrot" // 23
-mmodel "switch1" // 24
-mmodel "switch2" // 25
-
-mmodel "doors/door_01" // 26
-mmodel "doors/door_02" // 27
-mmodel "doors/door_03" // 28
-
-// useful default triggers to use with these:
-
-level_trigger_1 = [
- if (= $triggerstate -1) [echo "This door is opened elsewhere."]
-]
-
-mmodel "dcp/cask" // 29
-mmodel "dcp/cart" // 30
-mmodel "dcp/candle" // 31
-mmodel "dcp/vase" // 32
-mmodel "dcp/sack" // 33
-mmodel "dcp/chandelier" // 34
-mmodel "dcp/chest" // 35
-mmodel "dcp/firebowl" // 36
-mmodel "dcp/smplant" // 37
-mmodel "dcp/insect" // 38
-mmodel "dcp/reed" // 39
-
-mmodel "makke/nocamp" // 40
-mmodel "makke/strahler" // 41
-
-mmodel "tentus/food-drink/goblet" // 42
-mmodel "tentus/food-drink/apple" // 43
-mmodel "tentus/food-drink/pear" // 44
-mmodel "tentus/food-drink/appleslice" // 45
-mmodel "tentus/food-drink/meat" // 46
-mmodel "tentus/food-drink/bowl" // 47
-mmodel "tentus/food-drink/pieslice" // 48
-mmodel "tentus/food-drink/mug" // 49
-mmodel "tentus/food-drink/winebottle" // 50
-mmodel "tentus/food-drink/pie" // 51
-
-mmodel "tentus/books/flat" // 52
-mmodel "tentus/books/multi" // 53
-mmodel "tentus/chains/chain" // 54
-mmodel "tentus/chains/curvechain" // 55
-
-mmodel "tentus/barrel" // 56
-mmodel "tentus/sidebarrel" // 57
-mmodel "tentus/pot1" // 58
-mmodel "tentus/rope" // 59
-mmodel "tentus/ropelamp" // 60
-mmodel "tentus/ladder" // 61
-
-mmodel "tentus/fattree" // 62
-mmodel "tentus/moneybag" // 63
-mmodel "tentus/woodbench" // 64
-mmodel "tentus/hammer" // 65
-mmodel "tentus/anvil" // 66
-mmodel "tentus/spear" // 67
-mmodel "tentus/key" // 68
-mmodel "tentus/redshield" // 69
-mmodel "tentus/greenshield" // 70
-mmodel "tentus/bombs" // 71
-
-mmodel "objects/window01" // 72
-mmodel "objects/sign01" // 73
-mmodel "objects/lamp01" // 74
-mmodel "objects/chair01" // 75
-mmodel "objects/bed01" // 76
-mmodel "vegetation/tree00" // 77
-mmodel "vegetation/tree01" // 78
-mmodel "vegetation/bush01" // 79
-mmodel "vegetation/tree02" // 80
-mmodel "vegetation/tree04" // 81
-mmodel "vegetation/tree05" // 82
-mmodel "vegetation/tree06" // 83
-mmodel "vegetation/tree07" // 84
-mmodel "vegetation/tree03" // 85
-mmodel "objects/window02/window02_1" // 86
-mmodel "objects/window02/window02_2" // 87
-mmodel "objects/bench01" // 88
-mmodel "objects/lantern01" // 89
-mmodel "objects/lantern02" // 90
-mmodel "objects/woodchop" // 91
-mmodel "objects/table01" // 92
-mmodel "objects/torch" // 93
-mmodel "objects/torch_cold" // 94
-mmodel "objects/fire" // 95
-mmodel "objects/sail01" // 96
-mmodel "objects/well_base" // 97
-mmodel "objects/well_roof" // 98
-mmodel "objects/lamp02" // 99
-mmodel "objects/med_chand" // 100
-
-mmodel "objects/axe" // 101
-mmodel "xeno/box1" // 102
-mmodel "xeno/box2" // 103
-mmodel "vegetation/tree08" // 104
-mmodel "vegetation/tree09" // 105
-mmodel "vegetation/tree10" // 106
-mmodel "vegetation/tree11" // 107
-mmodel "vegetation/tree12" // 108
-mmodel "vegetation/weeds" // 109
-mmodel "psionic/barrel2" // 110
-mmodel "psionic/crate4" // 111
-mmodel "aftas/machina/machina1" // 112
-mmodel "aftas/machina/machina2" // 113
-mmodel "mitaman/chainlinkfence" // 114
-mmodel "mitaman/floorgrate1" // 115
-mmodel "mitaman/floorgrate3" // 116
-mmodel "mitaman/locker1" // 117
-mmodel "mitaman/locker3" // 118
-mmodel "objects/minekart" // 119
-mmodel "objects/oillamp" // 120
-mmodel "objects/millblade" // 121
-mmodel "makke/mugs/mug01" // 122
-mmodel "makke/mugs/mug02" // 123
-mmodel "makke/mugs/mug03" // 124
-mmodel "aftas/caixa" // 125
-mmodel "aftas/lampada" // 126
-mmodel "aftas/arvores/arg" // 127
-mmodel "aftas/arvores/arp" // 128
-mmodel "makke/arch" // 129
-mmodel "makke/fork" // 130
-mmodel "makke/moon" // 131
-mmodel "makke/planet" // 132
-mmodel "makke/spoon" // 133
-mmodel "makke/tricky/sign1" // 134
-mmodel "makke/tricky/sign2" // 135
-mmodel "makke/tricky/sign3" // 136
-mmodel "makke/tricky/sign4" // 137
-mmodel "dcp/hanginlamp" // 138
-mmodel "tentus/magic" // 139
-
-mmodel "dcp/bin" // 140
-mmodel "dcp/bulb" // 141
-mmodel "dcp/cbbox" // 142
-mmodel "dcp/grate" // 143
-mmodel "dcp/switch2a" // 144
-mmodel "dcp/ventflap" // 145
-mmodel "mitaman/door_06" // 146
-mmodel "mitaman/door_07" // 147
-mmodel "mitaman/door_08" // 148
-mmodel "mitaman/door_09" // 149
-mmodel "mitaman/door_10" // 150
-mmodel "mitaman/plat01" // 151
-mmodel "mitaman/wirefence" // 152
-mmodel "mitaman/woodboard" // 153
-mmodel "steve_e/doors/trapdoor" // 154
-mmodel "steve_e/doors/trapdoor/trapdoor_150" // 155
-mmodel "steve_e/doors/trapdoor/trapdoor_200" // 156
-mmodel "doors/door_04" // 157
-mmodel "dcp/blade_x" // 158
-mmodel "dcp/blade_y" // 159
-
-//Justice
-mmodel "mapmodels/justice/pad/jump" // 160
-mmodel "mapmodels/justice/pad/teleport" // 161
-mmodel "mapmodels/justice/pad/teledest" // 162
-mmodel "mapmodels/justice/block" // 163
-mmodel "mapmodels/justice/exit-sign" // 164
-mmodel "mapmodels/justice/vending" // 165
-mmodel "mapmodels/justice/railings/01" // 166
-mmodel "mapmodels/justice/railings/02" // 167
-
-mmodel "angel" // 168
-mmodel "crow" // 169
-
-mmodel "mapmodels/nieb/tree_dead" // 170
-mmodel "mapmodels/nieb/shark_sign" // 171
-mmodel "mapmodels/nieb/torso" // 172
-mmodel "mapmodels/nieb/sandcastle" // 173
-mmodel "mapmodels/nieb/plant01" // 174
-mmodel "mapmodels/nieb/plant02" // 175
-mmodel "mapmodels/nieb/sign_no-exit" // 176
-
-mmodel "skull" // 177
-
-mmodel "mapmodels/sitters/gothic/skelet1" // 178
-mmodel "mapmodels/sitters/gothic/skelet2" // 179
-mmodel "mapmodels/sitters/gothic/skelet3" // 180
-
-mmodel "mapmodels/quakish/grim_reaper/adam" // 181
-mmodel "mapmodels/quakish/grim_reaper/grim" // 182
-mmodel "mapmodels/quakish/grim_reaper/vehementi" // 183
-
-mmodel "mapmodels/yves_allaire/e6/e6fanblade/horizontal" // 184
-mmodel "mapmodels/yves_allaire/e6/e6fanblade/vertical" // 185
-
-mmodel "mapmodels/nieb/bush_dead1" // 186
-mmodel "mapmodels/nieb/bush_dead2" // 187
-
-mmodel "mapmodels/justice/cannon_copter" // 188
-
-mmodel "mapmodels/ard/vegetation/bigtree" // 189
-mmodel "mapmodels/ard/vegetation/mediumtree1" // 190
-mmodel "mapmodels/ard/vegetation/mediumtree2" // 191
-mmodel "mapmodels/ard/vegetation/smalltree" // 192
-
-mmodel "mapmodels/simonoc/effect/blue" // 193
-mmodel "mapmodels/simonoc/effect/cyan" // 194
-mmodel "mapmodels/simonoc/effect/green" // 195
-mmodel "mapmodels/simonoc/effect/red" // 196
-mmodel "mapmodels/simonoc/effect/violet" // 197
-mmodel "mapmodels/simonoc/effect/yellow" // 198
-mmodel "mapmodels/simonoc/effect/blue_v" // 199
-mmodel "mapmodels/simonoc/effect/cyan_v" // 200
-mmodel "mapmodels/simonoc/effect/green_v" // 201
-mmodel "mapmodels/simonoc/effect/red_v" // 202
-mmodel "mapmodels/simonoc/effect/violet_v" // 203
-mmodel "mapmodels/simonoc/effect/yellow_v" // 204
-
-mmodel "ao1/e_station" // 205
-mmodel "ao1/e_station/horiz" // 206
-mmodel "ao1/e_station/small" // 207
-mmodel "ao1/metro/graffiti/aracari" // 208
-mmodel "ao1/metro/graffiti/ironmetro" // 209
-mmodel "ao1/metro/graffiti/necedemalis" // 210
-mmodel "ao1/metro/graffiti/see" // 211
-mmodel "ao1/metro/graffiti/warning" // 212
-mmodel "ao1/metro/sign/citymap" // 213
-mmodel "ao1/metro/sign/flyingcar" // 214
-mmodel "ao1/metro/sign/player" // 215
-mmodel "checkpoint" // 216
-mmodel "cleaner/gutter_45_big" // 217
-mmodel "dcp/blade_x/big" // 218
-mmodel "dcp/blade_x/fast" // 219
-mmodel "dcp/blade_x/mid" // 220
-mmodel "dcp/blade_y/big" // 221
-mmodel "dcp/blade_y/collide" // 222
-mmodel "dcp/blade_y/fast" // 223
-mmodel "dcp/blade_y/giant" // 224
-mmodel "dcp/firebowl_no_fire" // 225
-mmodel "mapmodels/a_slow_old_man/rat_sitting" // 226
-mmodel "mapmodels/gibc" // 227
-mmodel "mapmodels/gibh" // 228
-mmodel "mapmodels/justice/cabinet" // 229
-mmodel "mapmodels/justice/cc_screen" // 230
-mmodel "mapmodels/justice/cc_table" // 231
-mmodel "mapmodels/justice/console1/01" // 232
-mmodel "mapmodels/justice/console1/02" // 233
-mmodel "mapmodels/justice/decals/01" // 234
-mmodel "mapmodels/justice/decals/02" // 235
-mmodel "mapmodels/justice/poster/1" // 236
-mmodel "mapmodels/justice/poster/2" // 237
-mmodel "mapmodels/justice/poster/3" // 238
-mmodel "mapmodels/justice/switch" // 239
-mmodel "mapmodels/justice/vent" // 240
-mmodel "mapmodels/makke/gutter_h_big" // 241
-mmodel "mapmodels/makke/gutter_h_big/trak5" // 242
-mmodel "mapmodels/makke/gutter_v_big" // 243
-mmodel "mapmodels/memoria/decals" // 244
-mmodel "mapmodels/nieb/clockhand/long" // 245
-mmodel "mapmodels/nieb/clockhand/short" // 246
-mmodel "mapmodels/nieb/ladder45" // 247
-mmodel "mapmodels/nieb/tree_dead_nocollide" // 248
-mmodel "mapmodels/nieb/waterfall/1" // 249
-mmodel "mapmodels/nieb/waterfall/2" // 250
-mmodel "mapmodels/nieb/waterfall/3" // 251
-mmodel "mapmodels/nieb/waterfall/4" // 252
-mmodel "mapmodels/ow/flowerfield" // 253
-mmodel "mapmodels/ow/head/head_1" // 254
-mmodel "mapmodels/ow/head/head_2" // 255
-mmodel "mapmodels/ow/jump" // 256
-mmodel "mapmodels/ow/moss" // 257
-mmodel "mapmodels/ow/pad" // 258
-mmodel "mapmodels/ow/tarp" // 259
-mmodel "mapmodels/ow/tree" // 260
-mmodel "mapmodels/ow/tree2" // 261
-mmodel "mapmodels/ow/tree3" // 262
-mmodel "mapmodels/ow/tree4" // 263
-mmodel "mapmodels/quakish/tombstones/tombstone01" // 264
-mmodel "mapmodels/quakish/tombstones/tombstone02" // 265
-mmodel "mapmodels/quakish/tombstones/tombstone03" // 266
-mmodel "mapmodels/quakish/tombstones/tombstone04" // 267
-mmodel "mapmodels/quakish/tombstones/tombstone05" // 268
-mmodel "mapmodels/toca/industrialpipes/horz" // 269
-mmodel "mapmodels/toca/industrialpipes/ldwn" // 270
-mmodel "mapmodels/toca/industrialpipes/lleft" // 271
-mmodel "mapmodels/toca/industrialpipes/lright" // 272
-mmodel "mapmodels/toca/industrialpipes/lup" // 273
-mmodel "mapmodels/toca/industrialpipes/vert" // 274
-mmodel "mapmodels/toca/radioactivedrum" // 275
-mmodel "mapmodels/toca/radioactivedrum2" // 276
-mmodel "mapmodels/toca/signs/radioactive" // 277
-mmodel "mapmodels/toca/signs/restricted" // 278
-mmodel "mapmodels/tubes/ladder" // 279
-mmodel "mapmodels/yves_allaire/e7/e7wgrate/32x64_h" // 280
-mmodel "mapmodels/yves_allaire/e7/e7wgrate/32x64_v" // 281
-mmodel "mapmodels/yves_allaire/e7/e7wgrate/64x32_v" // 282
-mmodel "meister/coclea" // 283
-mmodel "meister/gear" // 284
-mmodel "meister/grinder" // 285
-mmodel "meister/puleggia" // 286
-mmodel "meister/silos" // 287
-mmodel "mitaman/floorgrate1/crnsp1" // 288
-mmodel "monster/bauul" // 289
-mmodel "monster/goblin" // 290
-mmodel "monster/hellpig" // 291
-mmodel "monster/knight" // 292
-mmodel "monster/rat" // 293
-mmodel "monster/rhino" // 294
-mmodel "monster/slith" // 295
-mmodel "monster/spider" // 296
-mmodel "pyccna/toxicity/tendril" // 297
-mmodel "pyccna/toxicity/testtube" // 298
-mmodel "pyccna/toxicity/testtube_mutated" // 299
-mmodel "pyccna/toxicity/testtube_severe" // 300
-mmodel "razgriz/effects/magic/blue_h" // 301
-mmodel "razgriz/effects/magic/blue_h_large" // 302
-mmodel "razgriz/effects/magic/blue_h_small" // 303
-mmodel "razgriz/effects/magic/blue_v" // 304
-mmodel "razgriz/effects/magic/blue_v_large" // 305
-mmodel "razgriz/effects/magic/blue_v_small" // 306
-mmodel "razgriz/effects/magic/red_h" // 307
-mmodel "razgriz/effects/magic/red_h_large" // 308
-mmodel "razgriz/effects/magic/red_h_small" // 309
-mmodel "razgriz/effects/magic/red_v" // 310
-mmodel "razgriz/effects/magic/red_v_large" // 311
-mmodel "razgriz/effects/magic/red_v_small" // 312
-mmodel "razgriz/flora/bushes/medium_bush1" // 313
-mmodel "razgriz/flora/bushes/medium_bush2" // 314
-mmodel "razgriz/flora/bushes/medium_bush3" // 315
-mmodel "razgriz/flora/bushes/medium_bush4" // 316
-mmodel "razgriz/flora/bushes/medium_bush5" // 317
-mmodel "razgriz/flora/bushes/tall_bush1" // 318
-mmodel "razgriz/flora/bushes/tall_bush2" // 319
-mmodel "razgriz/flora/bushes/tall_bush3" // 320
-mmodel "razgriz/flora/bushes/tall_bush4" // 321
-mmodel "razgriz/flora/log1" // 322
-mmodel "razgriz/flora/plant1" // 323
-mmodel "razgriz/flora/plant2" // 324
-mmodel "razgriz/flora/shroom1" // 325
-mmodel "razgriz/flora/shroom2" // 326
-mmodel "razgriz/flora/shroom3" // 327
-mmodel "razgriz/insects/butterfly/blue" // 328
-mmodel "razgriz/insects/butterfly/brown" // 329
-mmodel "razgriz/insects/butterfly/green" // 330
-mmodel "razgriz/insects/butterfly/orange" // 331
-mmodel "razgriz/insects/butterfly/pink" // 332
-mmodel "razgriz/insects/butterfly/red" // 333
-mmodel "razgriz/insects/butterfly/yellow" // 334
-mmodel "razgriz/insects/firefly" // 335
-mmodel "razgriz/objects/gem_cap/blue_h" // 336
-mmodel "razgriz/objects/gem_cap/blue_v" // 337
-mmodel "razgriz/objects/gem_cap/red_h" // 338
-mmodel "razgriz/objects/gem_cap/red_v" // 339
-mmodel "razgriz/objects/torch" // 340
-mmodel "razgriz/rocks/set1/1" // 341
-mmodel "razgriz/rocks/set1/2" // 342
-mmodel "razgriz/rocks/set1/3" // 343
-mmodel "razgriz/rocks/set1/4" // 344
-mmodel "razgriz/rocks/set1/5" // 345
-mmodel "razgriz/rocks/set1/6" // 346
-mmodel "razgriz/rocks/set1/7" // 347
-mmodel "razgriz/rocks/set1/8" // 348
-mmodel "razgriz/rocks/set1/9" // 349
-mmodel "razgriz/rocks/set2/1" // 350
-mmodel "razgriz/rocks/set2/2" // 351
-mmodel "razgriz/rocks/set2/3" // 352
-mmodel "razgriz/rocks/set2/4" // 353
-mmodel "razgriz/rocks/set2/5" // 354
-mmodel "rpg/characters/dragon" // 355
-mmodel "rpg/characters/grizzly" // 356
-mmodel "rpg/characters/horse" // 357
-mmodel "rpg/characters/mman" // 358
-mmodel "rpg/characters/npcman" // 359
-mmodel "rpg/characters/rat" // 360
-mmodel "rpg/characters/wolf" // 361
-mmodel "rpg/objects/coin" // 362
-mmodel "skull/blue" // 363
-mmodel "skull/red" // 364
-mmodel "vegetation/tree03_sprite" // 365
-mmodel "vurt/flora/aspen1" // 366
-mmodel "vurt/flora/aspen2" // 367
-mmodel "vurt/flora/pine1" // 368
-mmodel "vurt/flora/pine2" // 369
-mmodel "vurt/flora/pine3" // 370
-mmodel "vurt/flora/pine4" // 371
-mmodel "wohsiesta/tree" // 372
// "package.cfg" in the package dir of the map, and "<mapname>.cfg",
// which you can use to override the settings in this file.
-exec "data/default_map_models.cfg"
-
// the skybox for this map:
if (strcmp $skybox "") [
- skybox "skyboxes/remus/sky01"
+ skybox "skyboxes/black"
]
materialreset
-texture water "golgotha/water2.jpg" // water surface
+texture water "textures/water2.jpg" // water surface
texture 1 "textures/waterfall.jpg" // waterfall
texture 1 "textures/watern.jpg" // water normals
texture 1 "textures/waterdudv.jpg" // water distortion
texture 1 "textures/waterfalln.jpg" // waterfall normals
texture 1 "textures/waterfalldudv.jpg" // waterfall distortion
-texture lava "dg/floor_lava2.jpg" 0 0 0 2 // lava surface
-texture 1 "dg/floor_lava2.jpg" 0 0 0 2 // falling lava
+texture lava "textures/floor_lava2.jpg" 0 0 0 2 // lava surface
+texture 1 "textures/floor_lava2.jpg" 0 0 0 2 // falling lava
// texture definitions for the map:
texturereset // starts the texture slot/index at 0
texture 0 "textures/sky.png" // dummy sky texture
texture 0 "textures/default.png" // default geometry texture
- texture 0 "aard/aardograss_1.jpg"
- autograss "<agrad:0,0.2>textures/grass_aard.png"
- texture 0 "ik2k/ik_floor_brick128a.jpg"
- texture 0 "ik2k/ik_floor_wood128b.jpg"
- texture 0 "ik2k/ik_ground_cobbles128.jpg"
- texture 0 "ik2k/ik_brick_3216d.jpg"
- texture 0 "ik2k/ik_brick_6464c.jpg"
-
- exec "packages/dg/package.cfg"
- exec "packages/tech1soc/package.cfg"
- exec "packages/ik2k/package.cfg"
- exec "packages/ikbase/package.cfg"
- exec "packages/payne/package.cfg"
- exec "packages/than_ind/package.cfg"
- exec "packages/jf1/package.cfg"
-
- // misc textures (mine/schwenz/some tech1soc)
- setshader stdworld
- texture 0 "aard/aardfdry256_1.jpg"
- texture 0 "tech1soc/spring3.jpg"
- texture 0 "tech1soc/sqrlig02wb.jpg"
- texture 0 "tech1soc/sqrlig03bc.jpg"
- texture 0 "tech1soc/zdetlig01bb.jpg"
- texture 0 "tech1soc/zdetlig02bb.jpg"
- texture 0 "aard/aardmbr16_2.jpg"
- texture 0 "tech1soc/zdetlig04bb.jpg"
- texture 0 "tech1soc/zdet_trim2a.jpg"
- texture 0 "aard/aardmmet32_1.jpg"
- texture 0 "tech1soc/zdet_trim5b.jpg"
- texture 0 "schwenz/dt_tile_check.01.jpg"
-
- exec "packages/egyptsoc/package.cfg"
- exec "packages/rorschach/package2.cfg"
- exec "packages/subverse/package.cfg"
- exec "packages/g_pack/package.cfg"
-
- // missing jf & tech1soc textures
- setshader stdworld
- texture 0 "jf1/jfsquare.jpg"
- texture 0 "jf1/jfyellow.jpg"
- texture 0 "tech1soc/jp11a.jpg"
- texture 0 "tech1soc/flr_tmtl_drk.jpg"
-
- exec "packages/lunaran/package.cfg"
- exec "packages/gibbie/package.cfg"
- exec "packages/philipk/package.cfg"
- exec "packages/gor/package.cfg"
- exec "packages/aftas/package.cfg"
- exec "packages/mitaman/package.cfg"
- exec "packages/noctua/package.cfg"
- exec "packages/loopix/package.cfg"
- exec "packages/g_pack/package2.cfg"
-
- // Misc textures
- setshader stdworld
- texture 0 "textures/nieb/rock01.jpg"
- setshader bumpspecmapworld
- setshaderparam "specscale" 0.25 0.25 0.25
- texture 0 "ikbase/specialbrick.jpg"
- texture n "ikbase/specialbrick_normal.jpg"
-
- exec "packages/painkillah/package.cfg"
- exec "packages/tomek/package.cfg"
- exec "packages/textures/nieb/package.cfg"
- exec "packages/trak5/package.cfg"
- exec "packages/textures/nieb/garden/package.cfg"
- exec "packages/textures/medieval_soc/package.cfg"
- exec "packages/textures/terrain_soc/package.cfg"
- exec "packages/textures/nieb/autumn/package.cfg"
- exec "packages/textures/nieb/clone/package.cfg"
- exec "packages/textures/nieb/suite/package.cfg"
-
- // Blikje bier
- exec "packages/blikjebier/akaritori/package2.cfg"
- exec "packages/blikjebier/concrete/package.cfg"
- exec "packages/blikjebier/metal/package.cfg"
-
- setshader stdworld
- texture 0 "blikjebier/ground/ground1.jpg"
- texture 0 "blikjebier/ground/ground2.jpg"
- texture 0 "blikjebier/ground/ground3.jpg"
- texture 0 "blikjebier/ground/ground4.jpg"
- texture 0 "blikjebier/ground/ground5.jpg"
- texture 0 "blikjebier/ground/g1mm.jpg"
-
- texture 0 "blikjebier/snow/clear_snow.jpg"
- texture 0 "blikjebier/snow/dirty_snow.jpg"
-
- exec "packages/egyptsoc/package2.cfg"
- exec "packages/textures/fatum/package.cfg"
- exec "packages/textures/philipk/pk02/package.cfg"
- exec "packages/textures/yves_allaire/ex/package.cfg"
- exec "packages/dg/package2.cfg"
-
- setshader stdworld
- texture 0 "makke/dirt01.jpg"
- texture 0 "makke/dirt02.jpg"
- texture 0 "makke/platten.jpg"
- texture 0 "makke/platten_var1.jpg"
- texture 0 "textures/nieb/bonepile.jpg"
-
- exec "packages/textures/swatllama/package.cfg"
+ exec "packages/textures/ex/package.cfg"
// for cfgs that don't set shaders...
setshader stdworld
bind RIGHT "right"
bind LEFT "left"
-// old style weapon binds
-//bind 0 "weapon 0 1 2"
-//bind 1 "weapon 1 2 4"
-//bind 2 "weapon 2 1 4"
-//bind 3 "weapon 3 4 2"
-//bind 4 "weapon 4 3 2"
-//bind 5 "weapon 5 3 1"
-//bind 6 "weapon 6 2 4"
-
// new style weapon binds
bind 0 "setweapon FI"
bind 1 "setweapon SG"
specbind MOUSE3 "follow"
specbind SPACE "follow"
-bind R dropflag
-
bind TAB "showscores"
bind T "saycommand"
bind I taunt
bind E edittoggle
-bind LCTRL "allowspedit"
-bind RCTRL "allowspedit"
bind KP_MINUS "conskip 5"
bind KP_PLUS "conskip -1000"
+++ /dev/null
-exec "packages/fonts/default.cfg"
-exec "packages/hud/digit_font.cfg"
-
mapcomplete = [ complete $arg1 packages/base ogz ]
mapcomplete map
-modenames = "ffa coop teamplay insta instateam effic efficteam tac tacteam capture regencapture ctf instactf protect instaprotect hold instahold efficctf efficprotect effichold collect instacollect efficcollect"
+modenames = "ffa coop teamplay insta instateam effic efficteam"
loop i (listlen $modenames) [
mname = (at $modenames $i)
alias $mname [ if (mode @i) [if (> $numargs 0) [map $arg1] [map]] ]
mapcomplete $mname
]
-spmodenames = "sp dmsp"
-loop i (listlen $spmodenames) [
- mname = (at $spmodenames $i)
- alias $mname [ if (mode (- @i 3)) [if (> $numargs 0) [map $arg1] [map]] ]
- mapcomplete $mname
-]
-
-complete importcube packages/cube cgz
-
demo = [ stopdemo; if (mode -1) [if (> $numargs 0) [map $arg1] [map]] ]
varcomplete demo demodir dmo
-speditlock = 1
-allowspedit = [ speditlock = 0; onrelease [speditlock = 1] ]
-
-allowedittoggle = [
- if (&& (m_sp (getmode)) $speditlock) [
- error "you must hold" (prettylist (searchbinds "allowspedit") "or") "to toggle editing in single player modes"
- result 0
- ] [
- result 1
- ]
-]
-
-playermodelnum = 5
+playermodelnum = 1
playermodeldir0 = "mrfixit"
playermodelicon0 = "mrfixit"
playermodelname0 = "Mr. Fixit"
playermodelstory0 = [Which orc do you choose when the mission calls for an all-purpose wrecking machine? Who do you call when the odds are stacked against you? Mr. Fixit, that's who. Gifted with the ability to perform deconstructive surgery with any weapon, this orc gets the job done fast and with extreme prejudice.]
-playermodeldir1 = "snoutx10k"
-playermodelicon1 = "snoutx10k"
-playermodelname1 = "IronSnout X10K"
-playermodelstory1 = [IronSnout X10K is a hybrid model of the IronSnout series. Bred in the bowels of a top secret underground facility, this walking fragging machine is for one purpose: to annihilate the opposition. Part pig, part machine, IronSnout X10K knows no fear and fears no fragger.]
-
-playermodeldir2 = "ogro2"
-playermodelicon2 = "ogro"
-playermodelname2 = "Ogro"
-playermodelstory2 = [Ogro is smaller than a normal ogre, but just as fat and only slightly less stupid. As opposed to common belief, he is not an evil creature, only killing as is absolutely necessary.]
-
-playermodeldir3 = "inky"
-playermodelicon3 = "inky"
-playermodelname3 = "Inky"
-playermodelstory3 = [Inky is the aspiring younger sibling of an infamous transdimensional celebrity. Often teased as being only the "Lesser Evil", Inky searches the battlefields for infamy of his own, claiming it one fragger at a time.]
-
-playermodeldir4 = "captaincannon"
-playermodelicon4 = "captaincannon"
-playermodelname4 = "Captain Cannon"
-playermodelstory4 = [Cannon Jones dared to imbibe the old imported beer can that had languished at the bottom of his refrigerator. Unbeknownst to Cannon, it had been bombarded with stray gamma radiation. After some serious indigestion, the mild-mannered Cannon Jones became the mighty Captain Cannon! Captain Cannon now has only one known weakness: his overbearingly righteous sense of justice.]
-
playermodeldir = [getalias (concatword "playermodeldir" (if (> $numargs 0) [result $arg1] [result $playermodel]))]
playermodelicon = [getalias (concatword "playermodelicon" (if (> $numargs 0) [result $arg1] [result $playermodel]))]
playermodelname = [getalias (concatword "playermodelname" (if (> $numargs 0) [result $arg1] [result $playermodel]))]
playermodelstory = [getalias (concatword "playermodelstory" (if (> $numargs 0) [result $arg1] [result $playermodel]))]
-playsong = [ music (concatword "fanatic/" (+ 1 (rnd 8)) ".ogg") playsong ]
-
+playsong = [ music (concatword "music/1.ogg") playsong ]
]
]
-chooseplayermodel = [guirolloveraction = (playermodelbutton $playermodel); showgui playermodel]
-
newgui main [
guilist [
- guiimage (concatword "packages/icons/" (playermodelicon) ".jpg") [chooseplayermodel] 1.15
guistrut 0.25
guilist [
newname = (getname)
guibutton "editing.." "showgui editing"
]
guibutton "vote game mode / map.." "showgui gamemode"
- // guibutton "lanconnect"
- // guibutton "connect localhost"
guibutton "switch team" [if (strcmp (getteam) "good") [team evil] [team good]]
guibutton "toggle spectator" [spectator (! (isspectator (getclientnum)))] "spectator"
guibutton "master.." [showgui master]
guibutton "disconnect" "disconnect" "exit"
] [
guibutton "bot match.." "showgui botmatch"
- guibutton "campaign.." "showgui campaign"
guibar
guibutton "options.." "showgui options"
guibutton "about.." "showgui about"
custommaps = (sortlist $custommaps x y [naturalsort $x $y])
showgui custommaps
]
-macro playermodelbutton [cleargui 1; playermodel %1]
-
-newgui playermodel [
- guilist [
- guilist [
- loop i $playermodelnum [
- guibutton (playermodelname $i) (playermodelbutton $i) (playermodelicon $i)
- ]
- ]
- guibar
- pmidx = (substr $guirolloveraction (strlen (playermodelbutton "")))
- pmidx = (max 0 (min (- $playermodelnum 1) $pmidx))
- guilist [
- guilist [
- guispring
- guiplayerpreview $pmidx 0 6 (checkrolloveraction "playermodel ") 4 1 (playermodelname $pmidx)
- guispring
- ]
- guitextbox (playermodelstory $pmidx) 40 9
- ]
- ]
-]
crosshairs = [
"data/crosshair.png data/crosshair_hit.png"
guibutton "start match.." [guionclear [startbotmatch]; showgui gamemode]
] "bot match"
-newgui campaign [
- guibutton "start Private Stan Sauer" "showgui privatestansauer"
- guibutton "start An Army Of One" "showgui armyofone"
- guibutton "start Lost" "sp lost" "cube"
- guibutton "start Meltdown" "sp skrsp1" "cube"
- guibutton "start Missile Pass" "sp crnsp1" "cube"
- guibutton "start Level 9" "sp level9" "cube"
- guibar
- guibutton "start DMSP map.." "mode -2; showgui maps"
- guicheckbox "slow motion" "slowmosp"
- guitext "skill (default: 3)"
- guislider skill
-]
-
-newgui armyofone [
- guilist [
- guilist [
- guibutton "Part I" "sp mpsp6a" "cube"
- guibutton "Part II" "sp mpsp6b" "cube"
- guibutton "Part III" "sp mpsp6c" "cube"
- ]
- showmapshot (substr $guirolloveraction 3)
- ]
-] "An Army Of One"
-
-newgui privatestansauer [
- guilist [
- guilist [
- guibutton "Run N' Gun Part I" "sp mpsp9a" "cube"
- guibutton "Run N' Gun Part II" "sp mpsp9b" "cube"
- guibutton "Run N' Gun Part III" "sp mpsp9c" "cube"
- guibutton "THE SERIOUSLY BIG VALLEY" "sp mpsp10" "cube"
- ]
- showmapshot (substr $guirolloveraction 3)
- ]
-] "Private Stan Sauer"
-
newgui servers [
guistayopen [
guiservers [
guibutton "instagib team" "mode 4; showgui maps"
guibutton "efficiency" "mode 5; showgui maps"
guibutton "efficiency team" "mode 6; showgui maps"
- guibutton "tactics" "mode 7; showgui maps"
- guibutton "tactics team" "mode 8; showgui maps"
- guibutton "capture" "mode 9; showgui capturemaps"
- guibutton "regen capture" "mode 10; showgui capturemaps"
]
guibar
- guilist [
- guibutton "ctf" "mode 11; showgui ctfmaps"
- guibutton "insta ctf" "mode 12; showgui ctfmaps"
- guibutton "efficiency ctf" "mode 17; showgui ctfmaps"
- guibutton "protect" "mode 13; showgui ctfmaps"
- guibutton "insta protect" "mode 14; showgui ctfmaps"
- guibutton "efficiency protect" "mode 18; showgui ctfmaps"
- guibutton "hold" "mode 15; showgui capturemaps"
- guibutton "insta hold" "mode 16; showgui capturemaps"
- guibutton "efficiency hold" "mode 19; showgui capturemaps"
- guibutton "collect" "mode 20; showgui ctfmaps"
- guibutton "insta collect" "mode 21; showgui ctfmaps"
- guibutton "efficiency collect" "mode 22; showgui ctfmaps"
- ]
]
]
]
skies1 = [
- aftas/sky/orbe
- blindabuser/blindasky
- blindabuser/blindasky2
- darc/forge
- dash/moon
- hazel/green
- humus/meadow
- ik2k/env/iklake
- jon/prarie
- mayhem/duomo
- mayhem/eclipse
- meister/uzze
- penguins/arid
- penguins/arid2
- penguins/cocoa
- penguins/divine
- penguins/harmony
- penguins/mellow
- penguins/mystic
-]
-skies2 = [
- penguins/violence
- penguins/wrath
- penguins/yonder
- penguins/zeus
- ratboy/skyboxes/coward
- shmutzwurst/london
skyboxes/black
- skyboxes/bbk/d
- skyboxes/bbk/dark2
- skyboxes/bbk/n1
- skyboxes/bbk/t
- skyboxes/clearsky052
- skyboxes/darkness
- skyboxes/evilsky
- skyboxes/morning
- skyboxes/remus/sky01
- skyboxes/turbulent
- skyboxes/ulukai/corona
- skyboxes/white
-]
-skies3 = [
- socksky/barren
- socksky/desert
- socksky/devpun
- socksky/emerald
- socksky/frozen
- socksky/frozendusk
- socksky/grave
- socksky/mars
- socksky/nightball
- socksky/stratosphere
- socksky/valley
- staffy/staffy
]
genskyitems = [
//guibutton "water waves off" "waterwaves 0"
]
-newgui triggers [
- guibutton [invisible] [BTmm = -1; showgui trigger2]
- guibutton [a carrot] [BTmm = 23; showgui trigger2]
- guibutton [switch #1] [BTmm = 24; showgui trigger2]
- guibutton [switch #2] [BTmm = 25; showgui trigger2]
- guibutton [door #1] [BTmm = 26; showgui trigger2]
- guibutton [door #2] [BTmm = 27; showgui trigger2]
- guibutton [door #3] [BTmm = 28; showgui trigger2]
-]
-
-newgui trigger2 [
- guibutton [animation loop] [BTtt = 0; showgui trigger3]
- guibutton [trigger once (popback)] [BTtt = 1; showgui trigger3]
- guibutton [trigger once (popback & rumble)] [BTtt = 2; showgui trigger3]
- guibutton [trigger once] [BTtt = 3; showgui trigger3]
- guibutton [trigger once (rumble)] [BTtt = 4; showgui trigger3]
- guibutton [trigger multiple (popback)] [BTtt = 5; showgui trigger3]
- guibutton [trigger multiple (popback & rumble)] [BTtt = 6; showgui trigger3]
- guibutton [trigger multiple] [BTtt = 7; showgui trigger3]
- guibutton [trigger multiple (rumble)] [BTtt = 8; showgui trigger3]
- guibutton [door (open once)] [BTtt = 9; showgui trigger3]
- guibutton [door (auto close)] [BTtt = 10; showgui trigger3]
- guibutton [door (locked)] [BTtt = 11; showgui trigger3]
- guibutton [vanishing trigger] [BTtt = 12; showgui trigger3]
- guibutton [vanishing trigger (rumble)] [BTtt = 13; showgui trigger3]
- guibutton [End Of Level Trigger] [BTtt = 29; showgui trigger3]
-]
-
-build_trigger = [newent mapmodel $BTmm $BTtt $BTti]
-
-newgui trigger3 [
- loop i 9 [
- tjt = (concat tag (concatword # $i))
- tjc = (concat BTti "=" $i ";" "build_trigger")
- guibutton $tjt $tjc
- ]
-]
-
resetlight = [
lightcolour = 0
lightbright = 1
]
]
-newgui monsters [
- guibutton "ogro / fireball" "newent monster 0"
- guibutton "rhino / chaingun" "newent monster 1"
- guibutton "ratamahatta / shotgun" "newent monster 2"
- guibutton "slith / rifle" "newent monster 3"
- guibutton "bauul / RL" "newent monster 4"
- guibutton "hellpig / bite" "newent monster 5"
- guibutton "knight / iceball" "newent monster 6"
- guibutton "goblin / slimeball" "newent monster 7"
- guibutton "spider / grenade" "newent monster 8"
-]
-
newgui postfx [
guibutton "(effect OFF)" "clearpostfx"
guibutton "bloom (subtle: 30%)" "bloom 0.3"
]
]
guilist [
- guicheckbox "force matching player models" forceplayermodels
- guibar
guicheckbox "always use team skins" teamskins
]
guicheckbox "hit sound" hitsound
registersound "q009/grenade" 200
altsound "q009/grenade2" 200
altsound "q009/grenade3" 200
+registersound "free/splash1" 200
+registersound "free/splash2" 200
registersound "nieb/jumppad" 255
registersound "q009/pistol" 80 // "free/pistol"
altsound "q009/pistol2" 80
md5anim "gun shoot" "chainsaw_attack.md5anim" 120
md5link 0 1 tag_weapon
-mdlenvmap 0 0 skyboxes/morning
mdlscale 300
mdltrans 0.3 -0.3 -1.7
md5anim "gun shoot" "shotgun_attack.md5anim" 50
md5link 0 1 tag_weapon
-//mdlenvmap 0 0 skyboxes/morning
mdlscale 300
//mdltrans 3.5 .2 -1
//mdltrans 3 0 -.5
md5tag Weapon tag_weapon
md5skin Head "<dds>Headblue.png" "<dds>headmasks.png" .9 .8
md5bumpmap Head "<dds>headnorm.png"
-md5envmap Head socksky/mars
md5skin Body "<dds>Bodyblue.png" "<dds>bodymasks.png" .4 .2
md5bumpmap Body "<dds>bodynorm.png"
-md5envmap Body socksky/desert
exec "packages/models/mrfixit/anims.cfg"
mdlscale 800
mdlspec 175
exec "packages/models/mrfixit/hudguns/md5.cfg"
exec "packages/models/hudguns/chaing/md5.cfg"
-mdlenvmap 0 0 skyboxes/morning
exec "packages/models/mrfixit/hudguns/md5.cfg"
exec "packages/models/hudguns/chaing/md5.cfg"
-mdlenvmap 0 0 skyboxes/morning
exec "packages/models/mrfixit/hudguns/md5.cfg"
exec "packages/models/hudguns/chaing/md5.cfg"
-mdlenvmap 0 0 skyboxes/morning
exec "packages/models/mrfixit/hudguns/md5.cfg"
exec "packages/models/hudguns/fist/md5.cfg"
-mdlenvmap 0 0 skyboxes/morning
exec "packages/models/mrfixit/hudguns/md5.cfg"
exec "packages/models/hudguns/fist/md5.cfg"
-mdlenvmap 0 0 skyboxes/morning
exec "packages/models/mrfixit/hudguns/md5.cfg"
exec "packages/models/hudguns/fist/md5.cfg"
-mdlenvmap 0 0 skyboxes/morning
exec "packages/models/mrfixit/hudguns/md5.cfg"
exec "packages/models/hudguns/gl/md5.cfg"
-mdlenvmap 0 0 skyboxes/morning
exec "packages/models/mrfixit/hudguns/md5.cfg"
exec "packages/models/hudguns/gl/md5.cfg"
-mdlenvmap 0 0 skyboxes/morning
exec "packages/models/mrfixit/hudguns/md5.cfg"
exec "packages/models/hudguns/gl/md5.cfg"
-mdlenvmap 0 0 skyboxes/morning
exec "packages/models/mrfixit/hudguns/md5.cfg"
exec "packages/models/hudguns/pistol/md5.cfg"
-mdlenvmap 0 0 skyboxes/morning
exec "packages/models/mrfixit/hudguns/md5.cfg"
exec "packages/models/hudguns/pistol/md5.cfg"
-mdlenvmap 0 0 skyboxes/morning
exec "packages/models/mrfixit/hudguns/md5.cfg"
exec "packages/models/hudguns/pistol/md5.cfg"
-mdlenvmap 0 0 skyboxes/morning
exec "packages/models/mrfixit/hudguns/md5.cfg"
exec "packages/models/hudguns/rifle/md5.cfg"
-mdlenvmap 0 0 skyboxes/morning
exec "packages/models/mrfixit/hudguns/md5.cfg"
exec "packages/models/hudguns/rifle/md5.cfg"
-mdlenvmap 0 0 skyboxes/morning
exec "packages/models/mrfixit/hudguns/md5.cfg"
exec "packages/models/hudguns/rifle/md5.cfg"
-mdlenvmap 0 0 skyboxes/morning
exec "packages/models/mrfixit/hudguns/md5.cfg"
exec "packages/models/hudguns/rocket/md5.cfg"
-mdlenvmap 0 0 skyboxes/morning
exec "packages/models/mrfixit/hudguns/md5.cfg"
exec "packages/models/hudguns/rocket/md5.cfg"
-mdlenvmap 0 0 skyboxes/morning
exec "packages/models/mrfixit/hudguns/md5.cfg"
exec "packages/models/hudguns/rocket/md5.cfg"
-mdlenvmap 0 0 skyboxes/morning
exec "packages/models/mrfixit/hudguns/md5.cfg"
exec "packages/models/hudguns/shotg/md5.cfg"
-mdlenvmap 0 0 skyboxes/morning
exec "packages/models/mrfixit/hudguns/md5.cfg"
exec "packages/models/hudguns/shotg/md5.cfg"
-mdlenvmap 0 0 skyboxes/morning
exec "packages/models/mrfixit/hudguns/md5.cfg"
exec "packages/models/hudguns/shotg/md5.cfg"
-mdlenvmap 0 0 skyboxes/morning
md5tag Weapon tag_weapon\r
md5skin Head "<dds>Head.png" "<dds>headmasks.png" .9 .8\r
md5bumpmap Head "<dds>headnorm.png"\r
-md5envmap Head socksky/mars\r
md5skin Body "<dds>Body.png" "<dds>bodymasks.png" .4 .2\r
md5bumpmap Body "<dds>bodynorm.png"\r
-md5envmap Body socksky/desert\r
exec "packages/models/mrfixit/anims.cfg"\r
mdlscale 800\r
mdlspec 175\r
md5tag Weapon tag_weapon
md5skin Head "<dds>Headred.png" "<dds>headmasks.png" .9 .8
md5bumpmap Head "<dds>headnorm.png"
-md5envmap Head socksky/mars
md5skin Body "<dds>Bodyred.png" "<dds>bodymasks.png" .4 .2
md5bumpmap Body "<dds>bodynorm.png"
-md5envmap Body socksky/desert
exec "packages/models/mrfixit/anims.cfg"
mdlscale 800
mdlspec 175
md5skin chainsaw "<dds>chainsaw.png" "<dds>chainsaw_mask.png" .2 .05
md5bumpmap chainsaw "<dds>chainsaw_normals.png"
mdlscale 700
-mdlenvmap 0 0 skyboxes/morning
-
--- /dev/null
+eX Textures by Yves Allaire\r
+http://www.evillair.net/v4/gametextures/\r
+Licensed under Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)
\ No newline at end of file
--- /dev/null
+setshader bumpspecmapparallaxglowworld\r
+setshaderparam specscale 2 2 2\r
+setshaderparam parallaxscale 0.04 -0.02\r
+setshaderparam glowcolor 1 0.59 0.01\r
+\r
+texture 0 "textures/yves_allaire/ex/light_u201_d.jpg"\r
+texture n "textures/yves_allaire/ex/light_u201_local.png"\r
+texture s "textures/yves_allaire/ex/light_u201_s.jpg"\r
+texture z "textures/yves_allaire/ex/light_u201_h.jpg"\r
+texture g "textures/yves_allaire/ex/light_u201_add.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/lightpanel_01_d.jpg"\r
+texture n "textures/yves_allaire/ex/lightpanel_01_local.png"\r
+texture s "textures/yves_allaire/ex/lightpanel_01_s.jpg"\r
+texture z "textures/yves_allaire/ex/lightpanel_01_h.jpg"\r
+texture g "textures/yves_allaire/ex/lightpanel_01_add.jpg"\r
+texscale 0.5\r
+\r
+setshader bumpspecmapparallaxworld\r
+setshaderparam specscale 2 2 2\r
+setshaderparam parallaxscale 0.04 -0.02\r
+\r
+texture 0 "textures/yves_allaire/ex/clangfloor_01_d.jpg"\r
+texture n "textures/yves_allaire/ex/clangfloor_01_local.png"\r
+texture s "textures/yves_allaire/ex/clangfloor_01_s.jpg"\r
+texture z "textures/yves_allaire/ex/clangfloor_01_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/clangfloor_01b_d.jpg"\r
+texture n "textures/yves_allaire/ex/clangfloor_01_local.png"\r
+texture s "textures/yves_allaire/ex/clangfloor_01_s.jpg"\r
+texture z "textures/yves_allaire/ex/clangfloor_01_h.jpg"\r
+texscale 0.5\r
+\r
+setshaderparam specscale 1 1 1\r
+\r
+texture 0 "textures/yves_allaire/ex/cretebase_01_d.jpg"\r
+texture n "textures/yves_allaire/ex/cretebase_01_local.png"\r
+texture s "textures/yves_allaire/ex/cretebase_01_s.jpg"\r
+texture z "textures/yves_allaire/ex/cretebase_01_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/cretebase_02_d.jpg"\r
+texture n "textures/yves_allaire/ex/cretebase_01_local.png"\r
+texture s "textures/yves_allaire/ex/cretebase_01_s.jpg"\r
+texture z "textures/yves_allaire/ex/cretebase_01_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/cretebase_03_dark_d.jpg"\r
+texture n "textures/yves_allaire/ex/cretebase_01_local.png"\r
+texture s "textures/yves_allaire/ex/cretebase_01_s.jpg"\r
+texture z "textures/yves_allaire/ex/cretebase_01_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/cretefloor_01_d.jpg"\r
+texture n "textures/yves_allaire/ex/cretefloor_01_local.png"\r
+texture s "textures/yves_allaire/ex/cretefloor_01_s.jpg"\r
+texture z "textures/yves_allaire/ex/cretefloor_01_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/cretefloor_01b_d.jpg"\r
+texture n "textures/yves_allaire/ex/cretefloor_01b_local.png"\r
+texture s "textures/yves_allaire/ex/cretefloor_01b_s.jpg"\r
+texture z "textures/yves_allaire/ex/cretefloor_01b_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/cretewall_01_d.jpg"\r
+texture n "textures/yves_allaire/ex/cretewall_01_local.png"\r
+texture s "textures/yves_allaire/ex/cretewall_01_s.jpg"\r
+texture z "textures/yves_allaire/ex/cretewall_01_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/cretewall_02_d.jpg"\r
+texture n "textures/yves_allaire/ex/cretewall_02_local.png"\r
+texture s "textures/yves_allaire/ex/cretewall_02_s.jpg"\r
+texture z "textures/yves_allaire/ex/cretewall_02_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/cretewall_03_d.jpg"\r
+texture n "textures/yves_allaire/ex/cretewall_03_local.png"\r
+texture s "textures/yves_allaire/ex/cretewall_03_s.jpg"\r
+texture z "textures/yves_allaire/ex/cretewall_03_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/cretewall_03b_d.jpg"\r
+texture n "textures/yves_allaire/ex/cretewall_03b_local.png"\r
+texture s "textures/yves_allaire/ex/cretewall_03b_s.jpg"\r
+texture z "textures/yves_allaire/ex/cretewall_03b_h.jpg"\r
+texscale 0.5\r
+\r
+setshaderparam specscale 2 2 2\r
+\r
+texture 0 "textures/yves_allaire/ex/deswall_01_d.jpg"\r
+texture n "textures/yves_allaire/ex/deswall_01_local.png"\r
+texture s "textures/yves_allaire/ex/deswall_01_s.jpg"\r
+texture z "textures/yves_allaire/ex/deswall_01_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/floor_grate_03_128_d.jpg"\r
+texture n "textures/yves_allaire/ex/floor_grate_03_128_local.png"\r
+texture s "textures/yves_allaire/ex/floor_grate_03_128_s.jpg"\r
+texture z "textures/yves_allaire/ex/floor_grate_03_128_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/floor_grate_03_d.jpg"\r
+texture n "textures/yves_allaire/ex/floor_grate_03_local.png"\r
+texture s "textures/yves_allaire/ex/floor_grate_03_s.jpg"\r
+texture z "textures/yves_allaire/ex/floor_grate_03_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/floor_grate03_d.jpg"\r
+texture n "textures/yves_allaire/ex/floor_grate03_local.png"\r
+texture s "textures/yves_allaire/ex/floor_grate03_s.jpg"\r
+texture z "textures/yves_allaire/ex/floor_grate03_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/floor_mtl_grate_01_d.jpg"\r
+texture n "textures/yves_allaire/ex/floor_mtl_grate_01_local.png"\r
+texture s "textures/yves_allaire/ex/floor_mtl_grate_01_s.jpg"\r
+texture z "textures/yves_allaire/ex/floor_mtl_grate_01_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/floor_mtl_wrn_01_d.jpg"\r
+texture n "textures/yves_allaire/ex/floor_mtl_wrn_01_local.png"\r
+texture s "textures/yves_allaire/ex/floor_mtl_wrn_01_s.jpg"\r
+texture z "textures/yves_allaire/ex/floor_mtl_wrn_01_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/floor_simple_05_d.jpg"\r
+texture n "textures/yves_allaire/ex/floor_simple_05_local.png"\r
+texture s "textures/yves_allaire/ex/floor_simple_05_s.jpg"\r
+texture z "textures/yves_allaire/ex/floor_simple_05_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/floor_simplines_d.jpg"\r
+texture n "textures/yves_allaire/ex/floor_simplines_local.png"\r
+texture s "textures/yves_allaire/ex/floor_simplines_s.jpg"\r
+texture z "textures/yves_allaire/ex/floor_simplines_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/floor_tile_03_d.jpg"\r
+texture n "textures/yves_allaire/ex/floor_tile_03_local.png"\r
+texture s "textures/yves_allaire/ex/floor_tile_03_s.jpg"\r
+texture z "textures/yves_allaire/ex/floor_tile_03_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/floor_tread_01_d.jpg"\r
+texture n "textures/yves_allaire/ex/floor_tread_01_local.png"\r
+texture s "textures/yves_allaire/ex/floor_tread_01_s.jpg"\r
+texture z "textures/yves_allaire/ex/floor_tread_01_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/floorpanel_01_d.jpg"\r
+texture n "textures/yves_allaire/ex/floorpanel_01_local.png"\r
+texture s "textures/yves_allaire/ex/floorpanel_01_s.jpg"\r
+texture z "textures/yves_allaire/ex/floorpanel_01_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/metalplate_01_d.jpg"\r
+texture n "textures/yves_allaire/ex/metalplate_01_local.png"\r
+texture s "textures/yves_allaire/ex/metalplate_01_s.jpg"\r
+texture z "textures/yves_allaire/ex/metalplate_01_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/metal_supp_01_d.jpg"\r
+texture n "textures/yves_allaire/ex/metal_supp_01_local.png"\r
+texture s "textures/yves_allaire/ex/metal_supp_01_s.jpg"\r
+texture z "textures/yves_allaire/ex/metal_supp_01_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/metal_wall_02_d.jpg"\r
+texture n "textures/yves_allaire/ex/metal_wall_02_local.png"\r
+texture s "textures/yves_allaire/ex/metal_wall_02_s.jpg"\r
+texture z "textures/yves_allaire/ex/metal_wall_02_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/mtl_bigplate_04_d.jpg"\r
+texture n "textures/yves_allaire/ex/mtl_bigplate_04_local.png"\r
+texture s "textures/yves_allaire/ex/mtl_bigplate_04_s.jpg"\r
+texture z "textures/yves_allaire/ex/mtl_bigplate_04_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/mtl_bigplate_04b_d.jpg"\r
+texture n "textures/yves_allaire/ex/mtl_bigplate_04b_local.png"\r
+texture s "textures/yves_allaire/ex/mtl_bigplate_04b_s.jpg"\r
+texture z "textures/yves_allaire/ex/mtl_bigplate_04b_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/mtl_panel_02_d.jpg"\r
+texture n "textures/yves_allaire/ex/mtl_panel_02_local.png"\r
+texture s "textures/yves_allaire/ex/mtl_panel_02_s.jpg"\r
+texture z "textures/yves_allaire/ex/mtl_panel_02_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/mtl_panel_03_d.jpg"\r
+texture n "textures/yves_allaire/ex/mtl_panel_03_local.png"\r
+texture s "textures/yves_allaire/ex/mtl_panel_03_s.jpg"\r
+texture z "textures/yves_allaire/ex/mtl_panel_03_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/mtl_panel_04_d.jpg"\r
+texture n "textures/yves_allaire/ex/mtl_panel_04_local.png"\r
+texture s "textures/yves_allaire/ex/mtl_panel_04_s.jpg"\r
+texture z "textures/yves_allaire/ex/mtl_panel_04_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/q2_01_d.jpg"\r
+texture n "textures/yves_allaire/ex/q2_01_local.png"\r
+texture s "textures/yves_allaire/ex/q2_01_s.jpg"\r
+texture z "textures/yves_allaire/ex/q2_01_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/q2_01b_d.jpg"\r
+texture n "textures/yves_allaire/ex/q2_01b_local.png"\r
+texture s "textures/yves_allaire/ex/q2_01b_s.jpg"\r
+texture z "textures/yves_allaire/ex/q2_01b_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/q2_01c_d.jpg"\r
+texture n "textures/yves_allaire/ex/q2_01c_local.png"\r
+texture s "textures/yves_allaire/ex/q2_01c_s.jpg"\r
+texture z "textures/yves_allaire/ex/q2_01c_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/q2_01d_d.jpg"\r
+texture n "textures/yves_allaire/ex/q2_01d_local.png"\r
+texture s "textures/yves_allaire/ex/q2_01d_s.jpg"\r
+texture z "textures/yves_allaire/ex/q2_01d_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/q2_01e_d.jpg"\r
+texture n "textures/yves_allaire/ex/q2_01e_local.png"\r
+texture s "textures/yves_allaire/ex/q2_01e_s.jpg"\r
+texture z "textures/yves_allaire/ex/q2_01e_h.jpg"\r
+texscale 0.5\r
+\r
+setshaderparam parallaxscale 0.02 -0.01\r
+\r
+texture 0 "textures/yves_allaire/ex/rndfloor_01_d.jpg"\r
+texture n "textures/yves_allaire/ex/rndfloor_01_local.png"\r
+texture s "textures/yves_allaire/ex/rndfloor_01_s.jpg"\r
+texture z "textures/yves_allaire/ex/rndfloor_01_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/rndfloor_02_d.jpg"\r
+texture n "textures/yves_allaire/ex/rndfloor_02_local.png"\r
+texture s "textures/yves_allaire/ex/rndfloor_02_s.jpg"\r
+texture z "textures/yves_allaire/ex/rndfloor_02_h.jpg"\r
+texscale 0.5\r
+\r
+setshaderparam parallaxscale 0.04 -0.02\r
+\r
+texture 0 "textures/yves_allaire/ex/rplates_01_d.jpg"\r
+texture n "textures/yves_allaire/ex/rplates_01_local.png"\r
+texture s "textures/yves_allaire/ex/rplates_01_s.jpg"\r
+texture z "textures/yves_allaire/ex/rplates_01_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/steptop_01_d.jpg"\r
+texture n "textures/yves_allaire/ex/steptop_01_local.png"\r
+texture s "textures/yves_allaire/ex/steptop_01_s.jpg"\r
+texture z "textures/yves_allaire/ex/steptop_01_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/trim_01_d.jpg"\r
+texture n "textures/yves_allaire/ex/trim_01_local.png"\r
+texture s "textures/yves_allaire/ex/trim_01_s.jpg"\r
+texture z "textures/yves_allaire/ex/trim_01_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/trim_baseboard_02_d.jpg"\r
+texture n "textures/yves_allaire/ex/trim_baseboard_02_local.png"\r
+texture s "textures/yves_allaire/ex/trim_baseboard_02_s.jpg"\r
+texture z "textures/yves_allaire/ex/trim_baseboard_02_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/trim_baseboard_03_d.jpg"\r
+texture n "textures/yves_allaire/ex/trim_baseboard_03_local.png"\r
+texture s "textures/yves_allaire/ex/trim_baseboard_03_s.jpg"\r
+texture z "textures/yves_allaire/ex/trim_baseboard_03_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/trim_baseboard_d.jpg"\r
+texture n "textures/yves_allaire/ex/trim_baseboard_local.png"\r
+texture s "textures/yves_allaire/ex/trim_baseboard_s.jpg"\r
+texture z "textures/yves_allaire/ex/trim_baseboard_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/trim_psimple_04_d.jpg"\r
+texture n "textures/yves_allaire/ex/trim_psimple_04_local.png"\r
+texture s "textures/yves_allaire/ex/trim_psimple_04_s.jpg"\r
+texture z "textures/yves_allaire/ex/trim_psimple_04_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/trim_psimple_05_d.jpg"\r
+texture n "textures/yves_allaire/ex/trim_psimple_05_local.png"\r
+texture s "textures/yves_allaire/ex/trim_psimple_05_s.jpg"\r
+texture z "textures/yves_allaire/ex/trim_psimple_05_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/trim_simple_01_d.jpg"\r
+texture n "textures/yves_allaire/ex/trim_simple_01_local.png"\r
+texture s "textures/yves_allaire/ex/trim_simple_01_s.jpg"\r
+texture z "textures/yves_allaire/ex/trim_simple_01_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/trim_simple03_d.jpg"\r
+texture n "textures/yves_allaire/ex/trim_simple03_local.png"\r
+texture s "textures/yves_allaire/ex/trim_simple03_s.jpg"\r
+texture z "textures/yves_allaire/ex/trim_simple03_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/trim_support_03_d.jpg"\r
+texture n "textures/yves_allaire/ex/trim_support_03_local.png"\r
+texture s "textures/yves_allaire/ex/trim_support_03_s.jpg"\r
+texture z "textures/yves_allaire/ex/trim_support_03_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/trim_vert_01_d.jpg"\r
+texture n "textures/yves_allaire/ex/trim_vert_01_local.png"\r
+texture s "textures/yves_allaire/ex/trim_vert_01_s.jpg"\r
+texture z "textures/yves_allaire/ex/trim_vert_01_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/wall_01_d.jpg"\r
+texture n "textures/yves_allaire/ex/wall_01_local.png"\r
+texture s "textures/yves_allaire/ex/wall_01_s.jpg"\r
+texture z "textures/yves_allaire/ex/wall_01_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/wall_01b_d.jpg"\r
+texture n "textures/yves_allaire/ex/wall_01_local.png"\r
+texture s "textures/yves_allaire/ex/wall_01_s.jpg"\r
+texture z "textures/yves_allaire/ex/wall_01_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/wall_b01_d.jpg"\r
+texture n "textures/yves_allaire/ex/wall_b01_local.png"\r
+texture s "textures/yves_allaire/ex/wall_b01_s.jpg"\r
+texture z "textures/yves_allaire/ex/wall_b01_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/wall_bigrib_02_d.jpg"\r
+texture n "textures/yves_allaire/ex/wall_bigrib_02_local.png"\r
+texture s "textures/yves_allaire/ex/wall_bigrib_02_s.jpg"\r
+texture z "textures/yves_allaire/ex/wall_bigrib_02_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/wall_bplate_06_d.jpg"\r
+texture n "textures/yves_allaire/ex/wall_bplate_06_local.png"\r
+texture s "textures/yves_allaire/ex/wall_bplate_06_s.jpg"\r
+texture z "textures/yves_allaire/ex/wall_bplate_06_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/wall_panel_05_d.jpg"\r
+texture n "textures/yves_allaire/ex/wall_panel_05_local.png"\r
+texture s "textures/yves_allaire/ex/wall_panel_05_s.jpg"\r
+texture z "textures/yves_allaire/ex/wall_panel_05_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/wall_panels_08_d.jpg"\r
+texture n "textures/yves_allaire/ex/wall_panels_08_local.png"\r
+texture s "textures/yves_allaire/ex/wall_panels_08_s.jpg"\r
+texture z "textures/yves_allaire/ex/wall_panels_08_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/wall_panels_08b_d.jpg"\r
+texture n "textures/yves_allaire/ex/wall_panels_08b_local.png"\r
+texture s "textures/yves_allaire/ex/wall_panels_08b_s.jpg"\r
+texture z "textures/yves_allaire/ex/wall_panels_08b_h.jpg"\r
+texscale 0.5\r
+\r
+setshader bumpspecmapworld\r
+setshaderparam specscale 2 2 2\r
+\r
+texture 0 "textures/yves_allaire/ex/wall_pipe_d.jpg"\r
+texture n "textures/yves_allaire/ex/wall_pipe_local.png"\r
+texture s "textures/yves_allaire/ex/wall_pipe_s.jpg"\r
+texscale 0.5\r
+\r
+setshader bumpspecmapparallaxworld\r
+setshaderparam specscale 2 2 2\r
+setshaderparam parallaxscale 0.04 -0.02\r
+\r
+texture 0 "textures/yves_allaire/ex/wall_u207_d.jpg"\r
+texture n "textures/yves_allaire/ex/wall_u207_local.png"\r
+texture s "textures/yves_allaire/ex/wall_u207_s.jpg"\r
+texture z "textures/yves_allaire/ex/wall_u207_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/metal_plate_01_d.jpg"\r
+texture n "textures/yves_allaire/ex/metal_plate_01_local.png"\r
+texture s "textures/yves_allaire/ex/metal_plate_01_s.jpg"\r
+texture z "textures/yves_allaire/ex/metal_plate_01_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/metal_plate_01b_d.jpg"\r
+texture n "textures/yves_allaire/ex/metal_plate_01b_local.png"\r
+texture s "textures/yves_allaire/ex/metal_plate_01b_s.jpg"\r
+texture z "textures/yves_allaire/ex/metal_plate_01b_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/metal_plate_01c_d.jpg"\r
+texture n "textures/yves_allaire/ex/metal_plate_01c_local.png"\r
+texture s "textures/yves_allaire/ex/metal_plate_01c_s.jpg"\r
+texture z "textures/yves_allaire/ex/metal_plate_01c_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/metal_base_01_d.jpg"\r
+texture n "textures/yves_allaire/ex/metal_base_01_local.png"\r
+texture s "textures/yves_allaire/ex/metal_base_01_s.jpg"\r
+texture z "textures/yves_allaire/ex/metal_base_01_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/metal_base_02_d.jpg"\r
+texture n "textures/yves_allaire/ex/metal_base_02_local.png"\r
+texture s "textures/yves_allaire/ex/metal_base_02_s.jpg"\r
+texture z "textures/yves_allaire/ex/metal_base_02_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/metal_base_03_d.jpg"\r
+texture n "textures/yves_allaire/ex/metal_base_03_local.png"\r
+texture s "textures/yves_allaire/ex/metal_base_03_s.jpg"\r
+texture z "textures/yves_allaire/ex/metal_base_03_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/metal_base_04_d.jpg"\r
+texture n "textures/yves_allaire/ex/metal_base_03_local.png"\r
+texture s "textures/yves_allaire/ex/metal_base_03_s.jpg"\r
+texture z "textures/yves_allaire/ex/metal_base_03_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/metal_base_05_rust_d.jpg"\r
+texture n "textures/yves_allaire/ex/metal_base_05_rust_local.png"\r
+texture s "textures/yves_allaire/ex/metal_base_05_rust_s.jpg"\r
+texture z "textures/yves_allaire/ex/metal_base_05_rust_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/metal_base_06_rust_d.jpg"\r
+texture n "textures/yves_allaire/ex/metal_base_05_rust_local.png"\r
+texture s "textures/yves_allaire/ex/metal_base_05_rust_s.jpg"\r
+texture z "textures/yves_allaire/ex/metal_base_05_rust_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/metal_base_07_rust_d.jpg"\r
+texture n "textures/yves_allaire/ex/metal_base_05_rust_local.png"\r
+texture s "textures/yves_allaire/ex/metal_base_05_rust_s.jpg"\r
+texture z "textures/yves_allaire/ex/metal_base_05_rust_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/metal_floor_02_d.jpg"\r
+texture n "textures/yves_allaire/ex/metal_floor_02_local.png"\r
+texture s "textures/yves_allaire/ex/metal_floor_02_s.jpg"\r
+texture z "textures/yves_allaire/ex/metal_floor_02_h.jpg"\r
+texscale 0.5\r
+\r
+texture 0 "textures/yves_allaire/ex/metal_rib_01_d.jpg"\r
+texture n "textures/yves_allaire/ex/metal_rib_01_local.png"\r
+texture s "textures/yves_allaire/ex/metal_rib_01_s.jpg"\r
+texture z "textures/yves_allaire/ex/metal_rib_01_h.jpg"\r
+texscale 0.5\r
+++ /dev/null
-eX Textures by Yves Allaire\r
-http://www.evillair.net/v4/gametextures/\r
-Licensed under Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)
\ No newline at end of file
+++ /dev/null
-setshader bumpspecmapparallaxglowworld\r
-setshaderparam specscale 2 2 2\r
-setshaderparam parallaxscale 0.04 -0.02\r
-setshaderparam glowcolor 1 0.59 0.01\r
-\r
-texture 0 "textures/yves_allaire/ex/light_u201_d.jpg"\r
-texture n "textures/yves_allaire/ex/light_u201_local.png"\r
-texture s "textures/yves_allaire/ex/light_u201_s.jpg"\r
-texture z "textures/yves_allaire/ex/light_u201_h.jpg"\r
-texture g "textures/yves_allaire/ex/light_u201_add.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/lightpanel_01_d.jpg"\r
-texture n "textures/yves_allaire/ex/lightpanel_01_local.png"\r
-texture s "textures/yves_allaire/ex/lightpanel_01_s.jpg"\r
-texture z "textures/yves_allaire/ex/lightpanel_01_h.jpg"\r
-texture g "textures/yves_allaire/ex/lightpanel_01_add.jpg"\r
-texscale 0.5\r
-\r
-setshader bumpspecmapparallaxworld\r
-setshaderparam specscale 2 2 2\r
-setshaderparam parallaxscale 0.04 -0.02\r
-\r
-texture 0 "textures/yves_allaire/ex/clangfloor_01_d.jpg"\r
-texture n "textures/yves_allaire/ex/clangfloor_01_local.png"\r
-texture s "textures/yves_allaire/ex/clangfloor_01_s.jpg"\r
-texture z "textures/yves_allaire/ex/clangfloor_01_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/clangfloor_01b_d.jpg"\r
-texture n "textures/yves_allaire/ex/clangfloor_01_local.png"\r
-texture s "textures/yves_allaire/ex/clangfloor_01_s.jpg"\r
-texture z "textures/yves_allaire/ex/clangfloor_01_h.jpg"\r
-texscale 0.5\r
-\r
-setshaderparam specscale 1 1 1\r
-\r
-texture 0 "textures/yves_allaire/ex/cretebase_01_d.jpg"\r
-texture n "textures/yves_allaire/ex/cretebase_01_local.png"\r
-texture s "textures/yves_allaire/ex/cretebase_01_s.jpg"\r
-texture z "textures/yves_allaire/ex/cretebase_01_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/cretebase_02_d.jpg"\r
-texture n "textures/yves_allaire/ex/cretebase_01_local.png"\r
-texture s "textures/yves_allaire/ex/cretebase_01_s.jpg"\r
-texture z "textures/yves_allaire/ex/cretebase_01_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/cretebase_03_dark_d.jpg"\r
-texture n "textures/yves_allaire/ex/cretebase_01_local.png"\r
-texture s "textures/yves_allaire/ex/cretebase_01_s.jpg"\r
-texture z "textures/yves_allaire/ex/cretebase_01_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/cretefloor_01_d.jpg"\r
-texture n "textures/yves_allaire/ex/cretefloor_01_local.png"\r
-texture s "textures/yves_allaire/ex/cretefloor_01_s.jpg"\r
-texture z "textures/yves_allaire/ex/cretefloor_01_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/cretefloor_01b_d.jpg"\r
-texture n "textures/yves_allaire/ex/cretefloor_01b_local.png"\r
-texture s "textures/yves_allaire/ex/cretefloor_01b_s.jpg"\r
-texture z "textures/yves_allaire/ex/cretefloor_01b_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/cretewall_01_d.jpg"\r
-texture n "textures/yves_allaire/ex/cretewall_01_local.png"\r
-texture s "textures/yves_allaire/ex/cretewall_01_s.jpg"\r
-texture z "textures/yves_allaire/ex/cretewall_01_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/cretewall_02_d.jpg"\r
-texture n "textures/yves_allaire/ex/cretewall_02_local.png"\r
-texture s "textures/yves_allaire/ex/cretewall_02_s.jpg"\r
-texture z "textures/yves_allaire/ex/cretewall_02_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/cretewall_03_d.jpg"\r
-texture n "textures/yves_allaire/ex/cretewall_03_local.png"\r
-texture s "textures/yves_allaire/ex/cretewall_03_s.jpg"\r
-texture z "textures/yves_allaire/ex/cretewall_03_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/cretewall_03b_d.jpg"\r
-texture n "textures/yves_allaire/ex/cretewall_03b_local.png"\r
-texture s "textures/yves_allaire/ex/cretewall_03b_s.jpg"\r
-texture z "textures/yves_allaire/ex/cretewall_03b_h.jpg"\r
-texscale 0.5\r
-\r
-setshaderparam specscale 2 2 2\r
-\r
-texture 0 "textures/yves_allaire/ex/deswall_01_d.jpg"\r
-texture n "textures/yves_allaire/ex/deswall_01_local.png"\r
-texture s "textures/yves_allaire/ex/deswall_01_s.jpg"\r
-texture z "textures/yves_allaire/ex/deswall_01_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/floor_grate_03_128_d.jpg"\r
-texture n "textures/yves_allaire/ex/floor_grate_03_128_local.png"\r
-texture s "textures/yves_allaire/ex/floor_grate_03_128_s.jpg"\r
-texture z "textures/yves_allaire/ex/floor_grate_03_128_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/floor_grate_03_d.jpg"\r
-texture n "textures/yves_allaire/ex/floor_grate_03_local.png"\r
-texture s "textures/yves_allaire/ex/floor_grate_03_s.jpg"\r
-texture z "textures/yves_allaire/ex/floor_grate_03_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/floor_grate03_d.jpg"\r
-texture n "textures/yves_allaire/ex/floor_grate03_local.png"\r
-texture s "textures/yves_allaire/ex/floor_grate03_s.jpg"\r
-texture z "textures/yves_allaire/ex/floor_grate03_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/floor_mtl_grate_01_d.jpg"\r
-texture n "textures/yves_allaire/ex/floor_mtl_grate_01_local.png"\r
-texture s "textures/yves_allaire/ex/floor_mtl_grate_01_s.jpg"\r
-texture z "textures/yves_allaire/ex/floor_mtl_grate_01_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/floor_mtl_wrn_01_d.jpg"\r
-texture n "textures/yves_allaire/ex/floor_mtl_wrn_01_local.png"\r
-texture s "textures/yves_allaire/ex/floor_mtl_wrn_01_s.jpg"\r
-texture z "textures/yves_allaire/ex/floor_mtl_wrn_01_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/floor_simple_05_d.jpg"\r
-texture n "textures/yves_allaire/ex/floor_simple_05_local.png"\r
-texture s "textures/yves_allaire/ex/floor_simple_05_s.jpg"\r
-texture z "textures/yves_allaire/ex/floor_simple_05_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/floor_simplines_d.jpg"\r
-texture n "textures/yves_allaire/ex/floor_simplines_local.png"\r
-texture s "textures/yves_allaire/ex/floor_simplines_s.jpg"\r
-texture z "textures/yves_allaire/ex/floor_simplines_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/floor_tile_03_d.jpg"\r
-texture n "textures/yves_allaire/ex/floor_tile_03_local.png"\r
-texture s "textures/yves_allaire/ex/floor_tile_03_s.jpg"\r
-texture z "textures/yves_allaire/ex/floor_tile_03_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/floor_tread_01_d.jpg"\r
-texture n "textures/yves_allaire/ex/floor_tread_01_local.png"\r
-texture s "textures/yves_allaire/ex/floor_tread_01_s.jpg"\r
-texture z "textures/yves_allaire/ex/floor_tread_01_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/floorpanel_01_d.jpg"\r
-texture n "textures/yves_allaire/ex/floorpanel_01_local.png"\r
-texture s "textures/yves_allaire/ex/floorpanel_01_s.jpg"\r
-texture z "textures/yves_allaire/ex/floorpanel_01_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/metalplate_01_d.jpg"\r
-texture n "textures/yves_allaire/ex/metalplate_01_local.png"\r
-texture s "textures/yves_allaire/ex/metalplate_01_s.jpg"\r
-texture z "textures/yves_allaire/ex/metalplate_01_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/metal_supp_01_d.jpg"\r
-texture n "textures/yves_allaire/ex/metal_supp_01_local.png"\r
-texture s "textures/yves_allaire/ex/metal_supp_01_s.jpg"\r
-texture z "textures/yves_allaire/ex/metal_supp_01_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/metal_wall_02_d.jpg"\r
-texture n "textures/yves_allaire/ex/metal_wall_02_local.png"\r
-texture s "textures/yves_allaire/ex/metal_wall_02_s.jpg"\r
-texture z "textures/yves_allaire/ex/metal_wall_02_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/mtl_bigplate_04_d.jpg"\r
-texture n "textures/yves_allaire/ex/mtl_bigplate_04_local.png"\r
-texture s "textures/yves_allaire/ex/mtl_bigplate_04_s.jpg"\r
-texture z "textures/yves_allaire/ex/mtl_bigplate_04_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/mtl_bigplate_04b_d.jpg"\r
-texture n "textures/yves_allaire/ex/mtl_bigplate_04b_local.png"\r
-texture s "textures/yves_allaire/ex/mtl_bigplate_04b_s.jpg"\r
-texture z "textures/yves_allaire/ex/mtl_bigplate_04b_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/mtl_panel_02_d.jpg"\r
-texture n "textures/yves_allaire/ex/mtl_panel_02_local.png"\r
-texture s "textures/yves_allaire/ex/mtl_panel_02_s.jpg"\r
-texture z "textures/yves_allaire/ex/mtl_panel_02_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/mtl_panel_03_d.jpg"\r
-texture n "textures/yves_allaire/ex/mtl_panel_03_local.png"\r
-texture s "textures/yves_allaire/ex/mtl_panel_03_s.jpg"\r
-texture z "textures/yves_allaire/ex/mtl_panel_03_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/mtl_panel_04_d.jpg"\r
-texture n "textures/yves_allaire/ex/mtl_panel_04_local.png"\r
-texture s "textures/yves_allaire/ex/mtl_panel_04_s.jpg"\r
-texture z "textures/yves_allaire/ex/mtl_panel_04_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/q2_01_d.jpg"\r
-texture n "textures/yves_allaire/ex/q2_01_local.png"\r
-texture s "textures/yves_allaire/ex/q2_01_s.jpg"\r
-texture z "textures/yves_allaire/ex/q2_01_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/q2_01b_d.jpg"\r
-texture n "textures/yves_allaire/ex/q2_01b_local.png"\r
-texture s "textures/yves_allaire/ex/q2_01b_s.jpg"\r
-texture z "textures/yves_allaire/ex/q2_01b_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/q2_01c_d.jpg"\r
-texture n "textures/yves_allaire/ex/q2_01c_local.png"\r
-texture s "textures/yves_allaire/ex/q2_01c_s.jpg"\r
-texture z "textures/yves_allaire/ex/q2_01c_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/q2_01d_d.jpg"\r
-texture n "textures/yves_allaire/ex/q2_01d_local.png"\r
-texture s "textures/yves_allaire/ex/q2_01d_s.jpg"\r
-texture z "textures/yves_allaire/ex/q2_01d_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/q2_01e_d.jpg"\r
-texture n "textures/yves_allaire/ex/q2_01e_local.png"\r
-texture s "textures/yves_allaire/ex/q2_01e_s.jpg"\r
-texture z "textures/yves_allaire/ex/q2_01e_h.jpg"\r
-texscale 0.5\r
-\r
-setshaderparam parallaxscale 0.02 -0.01\r
-\r
-texture 0 "textures/yves_allaire/ex/rndfloor_01_d.jpg"\r
-texture n "textures/yves_allaire/ex/rndfloor_01_local.png"\r
-texture s "textures/yves_allaire/ex/rndfloor_01_s.jpg"\r
-texture z "textures/yves_allaire/ex/rndfloor_01_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/rndfloor_02_d.jpg"\r
-texture n "textures/yves_allaire/ex/rndfloor_02_local.png"\r
-texture s "textures/yves_allaire/ex/rndfloor_02_s.jpg"\r
-texture z "textures/yves_allaire/ex/rndfloor_02_h.jpg"\r
-texscale 0.5\r
-\r
-setshaderparam parallaxscale 0.04 -0.02\r
-\r
-texture 0 "textures/yves_allaire/ex/rplates_01_d.jpg"\r
-texture n "textures/yves_allaire/ex/rplates_01_local.png"\r
-texture s "textures/yves_allaire/ex/rplates_01_s.jpg"\r
-texture z "textures/yves_allaire/ex/rplates_01_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/steptop_01_d.jpg"\r
-texture n "textures/yves_allaire/ex/steptop_01_local.png"\r
-texture s "textures/yves_allaire/ex/steptop_01_s.jpg"\r
-texture z "textures/yves_allaire/ex/steptop_01_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/trim_01_d.jpg"\r
-texture n "textures/yves_allaire/ex/trim_01_local.png"\r
-texture s "textures/yves_allaire/ex/trim_01_s.jpg"\r
-texture z "textures/yves_allaire/ex/trim_01_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/trim_baseboard_02_d.jpg"\r
-texture n "textures/yves_allaire/ex/trim_baseboard_02_local.png"\r
-texture s "textures/yves_allaire/ex/trim_baseboard_02_s.jpg"\r
-texture z "textures/yves_allaire/ex/trim_baseboard_02_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/trim_baseboard_03_d.jpg"\r
-texture n "textures/yves_allaire/ex/trim_baseboard_03_local.png"\r
-texture s "textures/yves_allaire/ex/trim_baseboard_03_s.jpg"\r
-texture z "textures/yves_allaire/ex/trim_baseboard_03_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/trim_baseboard_d.jpg"\r
-texture n "textures/yves_allaire/ex/trim_baseboard_local.png"\r
-texture s "textures/yves_allaire/ex/trim_baseboard_s.jpg"\r
-texture z "textures/yves_allaire/ex/trim_baseboard_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/trim_psimple_04_d.jpg"\r
-texture n "textures/yves_allaire/ex/trim_psimple_04_local.png"\r
-texture s "textures/yves_allaire/ex/trim_psimple_04_s.jpg"\r
-texture z "textures/yves_allaire/ex/trim_psimple_04_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/trim_psimple_05_d.jpg"\r
-texture n "textures/yves_allaire/ex/trim_psimple_05_local.png"\r
-texture s "textures/yves_allaire/ex/trim_psimple_05_s.jpg"\r
-texture z "textures/yves_allaire/ex/trim_psimple_05_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/trim_simple_01_d.jpg"\r
-texture n "textures/yves_allaire/ex/trim_simple_01_local.png"\r
-texture s "textures/yves_allaire/ex/trim_simple_01_s.jpg"\r
-texture z "textures/yves_allaire/ex/trim_simple_01_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/trim_simple03_d.jpg"\r
-texture n "textures/yves_allaire/ex/trim_simple03_local.png"\r
-texture s "textures/yves_allaire/ex/trim_simple03_s.jpg"\r
-texture z "textures/yves_allaire/ex/trim_simple03_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/trim_support_03_d.jpg"\r
-texture n "textures/yves_allaire/ex/trim_support_03_local.png"\r
-texture s "textures/yves_allaire/ex/trim_support_03_s.jpg"\r
-texture z "textures/yves_allaire/ex/trim_support_03_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/trim_vert_01_d.jpg"\r
-texture n "textures/yves_allaire/ex/trim_vert_01_local.png"\r
-texture s "textures/yves_allaire/ex/trim_vert_01_s.jpg"\r
-texture z "textures/yves_allaire/ex/trim_vert_01_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/wall_01_d.jpg"\r
-texture n "textures/yves_allaire/ex/wall_01_local.png"\r
-texture s "textures/yves_allaire/ex/wall_01_s.jpg"\r
-texture z "textures/yves_allaire/ex/wall_01_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/wall_01b_d.jpg"\r
-texture n "textures/yves_allaire/ex/wall_01_local.png"\r
-texture s "textures/yves_allaire/ex/wall_01_s.jpg"\r
-texture z "textures/yves_allaire/ex/wall_01_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/wall_b01_d.jpg"\r
-texture n "textures/yves_allaire/ex/wall_b01_local.png"\r
-texture s "textures/yves_allaire/ex/wall_b01_s.jpg"\r
-texture z "textures/yves_allaire/ex/wall_b01_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/wall_bigrib_02_d.jpg"\r
-texture n "textures/yves_allaire/ex/wall_bigrib_02_local.png"\r
-texture s "textures/yves_allaire/ex/wall_bigrib_02_s.jpg"\r
-texture z "textures/yves_allaire/ex/wall_bigrib_02_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/wall_bplate_06_d.jpg"\r
-texture n "textures/yves_allaire/ex/wall_bplate_06_local.png"\r
-texture s "textures/yves_allaire/ex/wall_bplate_06_s.jpg"\r
-texture z "textures/yves_allaire/ex/wall_bplate_06_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/wall_panel_05_d.jpg"\r
-texture n "textures/yves_allaire/ex/wall_panel_05_local.png"\r
-texture s "textures/yves_allaire/ex/wall_panel_05_s.jpg"\r
-texture z "textures/yves_allaire/ex/wall_panel_05_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/wall_panels_08_d.jpg"\r
-texture n "textures/yves_allaire/ex/wall_panels_08_local.png"\r
-texture s "textures/yves_allaire/ex/wall_panels_08_s.jpg"\r
-texture z "textures/yves_allaire/ex/wall_panels_08_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/wall_panels_08b_d.jpg"\r
-texture n "textures/yves_allaire/ex/wall_panels_08b_local.png"\r
-texture s "textures/yves_allaire/ex/wall_panels_08b_s.jpg"\r
-texture z "textures/yves_allaire/ex/wall_panels_08b_h.jpg"\r
-texscale 0.5\r
-\r
-setshader bumpspecmapworld\r
-setshaderparam specscale 2 2 2\r
-\r
-texture 0 "textures/yves_allaire/ex/wall_pipe_d.jpg"\r
-texture n "textures/yves_allaire/ex/wall_pipe_local.png"\r
-texture s "textures/yves_allaire/ex/wall_pipe_s.jpg"\r
-texscale 0.5\r
-\r
-setshader bumpspecmapparallaxworld\r
-setshaderparam specscale 2 2 2\r
-setshaderparam parallaxscale 0.04 -0.02\r
-\r
-texture 0 "textures/yves_allaire/ex/wall_u207_d.jpg"\r
-texture n "textures/yves_allaire/ex/wall_u207_local.png"\r
-texture s "textures/yves_allaire/ex/wall_u207_s.jpg"\r
-texture z "textures/yves_allaire/ex/wall_u207_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/metal_plate_01_d.jpg"\r
-texture n "textures/yves_allaire/ex/metal_plate_01_local.png"\r
-texture s "textures/yves_allaire/ex/metal_plate_01_s.jpg"\r
-texture z "textures/yves_allaire/ex/metal_plate_01_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/metal_plate_01b_d.jpg"\r
-texture n "textures/yves_allaire/ex/metal_plate_01b_local.png"\r
-texture s "textures/yves_allaire/ex/metal_plate_01b_s.jpg"\r
-texture z "textures/yves_allaire/ex/metal_plate_01b_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/metal_plate_01c_d.jpg"\r
-texture n "textures/yves_allaire/ex/metal_plate_01c_local.png"\r
-texture s "textures/yves_allaire/ex/metal_plate_01c_s.jpg"\r
-texture z "textures/yves_allaire/ex/metal_plate_01c_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/metal_base_01_d.jpg"\r
-texture n "textures/yves_allaire/ex/metal_base_01_local.png"\r
-texture s "textures/yves_allaire/ex/metal_base_01_s.jpg"\r
-texture z "textures/yves_allaire/ex/metal_base_01_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/metal_base_02_d.jpg"\r
-texture n "textures/yves_allaire/ex/metal_base_02_local.png"\r
-texture s "textures/yves_allaire/ex/metal_base_02_s.jpg"\r
-texture z "textures/yves_allaire/ex/metal_base_02_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/metal_base_03_d.jpg"\r
-texture n "textures/yves_allaire/ex/metal_base_03_local.png"\r
-texture s "textures/yves_allaire/ex/metal_base_03_s.jpg"\r
-texture z "textures/yves_allaire/ex/metal_base_03_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/metal_base_04_d.jpg"\r
-texture n "textures/yves_allaire/ex/metal_base_03_local.png"\r
-texture s "textures/yves_allaire/ex/metal_base_03_s.jpg"\r
-texture z "textures/yves_allaire/ex/metal_base_03_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/metal_base_05_rust_d.jpg"\r
-texture n "textures/yves_allaire/ex/metal_base_05_rust_local.png"\r
-texture s "textures/yves_allaire/ex/metal_base_05_rust_s.jpg"\r
-texture z "textures/yves_allaire/ex/metal_base_05_rust_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/metal_base_06_rust_d.jpg"\r
-texture n "textures/yves_allaire/ex/metal_base_05_rust_local.png"\r
-texture s "textures/yves_allaire/ex/metal_base_05_rust_s.jpg"\r
-texture z "textures/yves_allaire/ex/metal_base_05_rust_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/metal_base_07_rust_d.jpg"\r
-texture n "textures/yves_allaire/ex/metal_base_05_rust_local.png"\r
-texture s "textures/yves_allaire/ex/metal_base_05_rust_s.jpg"\r
-texture z "textures/yves_allaire/ex/metal_base_05_rust_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/metal_floor_02_d.jpg"\r
-texture n "textures/yves_allaire/ex/metal_floor_02_local.png"\r
-texture s "textures/yves_allaire/ex/metal_floor_02_s.jpg"\r
-texture z "textures/yves_allaire/ex/metal_floor_02_h.jpg"\r
-texscale 0.5\r
-\r
-texture 0 "textures/yves_allaire/ex/metal_rib_01_d.jpg"\r
-texture n "textures/yves_allaire/ex/metal_rib_01_local.png"\r
-texture s "textures/yves_allaire/ex/metal_rib_01_s.jpg"\r
-texture z "textures/yves_allaire/ex/metal_rib_01_h.jpg"\r
-texscale 0.5\r
--- /dev/null
+// automatically written on exit, DO NOT MODIFY
+// delete this file to have data/defaults.cfg overwrite these settings
+// modify settings in game, or put settings in autoexec.cfg to override anything
+
+name "unnamed"
+
+
+ammobar 0
+ammobaralign 0
+ammobarcountscale 1.5
+ammobarcountsep 20
+ammobarflip 0
+ammobarhideempty 1
+ammobarhorizontal 0
+ammobarscale 0.5
+ammobarsep 20
+ammobarx 0.025
+ammobary 0.5
+ammohud 1
+aniso 0
+applydialog 1
+aspect 0.0
+ati_skybox_bug 0
+attackspawn 1
+autoauth 1
+autocompactvslots 256
+autosortservers 1
+autoupdateservers 1
+bilinear 1
+blobdyntris 4096
+blobfadehigh 8
+blobfadelow 8
+blobheight 32
+blobintensity 60
+blobmargin 1
+blobs 1
+blobstattris 4096
+blood 1
+blurdepthfx 0
+blurdepthfxsigma 50
+blurglare 4
+blurglareaspect 1
+blurglaresigma 50
+blurshadowmap 1
+blursmsigma 100
+bumpmodels 1
+caustics 1
+chainsawhudgun 1
+clockerror 1000000
+clockfix 0
+compresspng 9
+compresstga 1
+confade 30
+confilter 11519
+connectname ""
+connectport 0
+conscale 0.33
+consize 5
+contags 3
+crosshaircolors 1
+crosshairfx 1
+crosshairsize 15
+cursorsize 30
+damagecompass 1
+damagecompassalpha 25
+damagecompassfade 1000
+damagecompassmax 200
+damagecompassmin 25
+damagecompasssize 30
+damagescreen 1
+damagescreenalpha 45
+damagescreenfactor 7
+damagescreenfade 125
+damagescreenmax 100
+damagescreenmin 10
+deadpush 2
+deathscore 1
+decalfade 10000
+decals 1
+demodir "demo"
+depthfx 1
+depthfxblend 16
+depthfxemuprecision 1
+depthfxfpscale 4096
+depthfxpartblend 8
+depthfxparts 1
+depthfxscale 64
+depthfxsize 10
+dynlightdist 1024
+editinview 1
+emitmillis 17
+entcamdir 1
+envmapmodels 1
+envmapsize 7
+explodebright 1.0
+fewparticles 100
+filltjoints 1
+fixwav 1
+flarecutoff 1000
+flaresize 100
+fov 100
+fpdepthfx 0
+fpshadowmap 0
+fullbrightmodels 60
+fullconfilter 65535
+fullconsize 75
+gameclock 0
+gameclockalign 0
+gameclockalpha 255
+gameclockcolour 16777215
+gameclocklowcolour 16760896
+gameclockscale 0.75
+gameclockx 0.5
+gameclocky 0.03
+gamma 100
+glare 1
+glarescale 1.0
+glaresize 8
+glassenv 1
+gpumipmap 0
+gpuskel 1
+grass 1
+grassdist 256
+grassheight 4
+grassmargin 8
+grassstep 3.0
+grasstaper 0.2
+gui2d 1
+guiautotab 16
+guiclicktab 0
+guifadein 1
+guifollow 1
+guipreviewtime 15
+guipushdist 4
+guisens 1.0
+healthcolors 1
+hidedead 0
+hidefrags 1
+highlightscore 1
+hitcrosshair 425
+hitsound 0
+hudgun 1
+hudgunsdir ""
+hudgunsway 1
+hudscore 0
+hudscorealign 0
+hudscorealpha 255
+hudscoreenemycolour 16728128
+hudscoreplayercolour 6332671
+hudscorescale 1.0
+hudscoresep 200
+hudscorex 0.5
+hudscorey 0.03
+invmouse 0
+jumpspawn 1
+lightthreads 0
+maxbarreldebris 10
+maxcon 200
+maxdebris 25
+maxdecaldistance 512
+maxdecaltris 1024
+maxdynlights 5
+maxfps 200
+maxhistory 1000
+maxparticledistance 1024
+maxparticles 4000
+maxparticletextdistance 128
+maxreflect 2
+maxroll 0
+maxservpings 10
+maxsoundsatonce 7
+maxtexsize 0
+maxtrail 500
+menuautoclose 120
+menudistance 40
+miniconfade 30
+miniconfilter 768
+miniconsize 5
+miniconwidth 40
+minimizedsounds 0
+motionblur 0
+motionblurmillis 5
+motionblurscale 0.5
+mouseaccel 0.0
+movieaccel 1
+moviefps 24
+movieh 240
+movieminquality 0.0
+moviesound 1
+moviesync 0
+moview 320
+mumble 1
+musicvol 60
+muzzleflash 1
+muzzlelight 1
+nompedit 1
+outlinecolour 0
+outlinemeters 0
+particleglare 2
+particlesize 100
+particletext 1
+playermodel 0
+pvsthreads 0
+ragdoll 1
+ragdollfade 1000
+ragdollmillis 10000
+reducefilter 1
+reflectdist 2000
+reflectmms 1
+reflectsize 8
+relativemouse 1
+savebak 2
+scoreboard2d 1
+screenshotdir "screenshot"
+screenshotformat 2
+screenshotquality 97
+searchlan 0
+sensitivity 3.0
+sensitivityscale 1.0
+servpingdecay 15000
+servpingrate 5000
+shaderdetail 3
+shadowmap 1
+shadowmapbias 5
+shadowmapdist 256
+shadowmapintensity 40
+shadowmappeelbias 20
+shadowmapprecision 0
+shadowmapradius 96
+shadowmapsize 9
+showclientnum 0
+showconnecting 0
+showdeaths 0
+showfps 1
+showfpsrange 0
+showmat 1
+showmodeinfo 1
+showparticles 1
+showping 1
+showpj 0
+showservinfo 1
+showspectatorping 0
+showspectators 1
+skyboxglare 1
+smoothdist 32
+smoothmove 75
+soundvol 255
+sparklyfix 0
+spawnwait 0
+statusbars 1
+statusbarscale 1.0
+statusicons 1
+teamcolorchat 1
+teamcolorfrags 1
+teamcolortext 1
+teamcrosshair 1
+teamhudguns 1
+teamskins 0
+teamsounds 1
+texcompress 1025
+texcompressquality -1
+texgui2d 1
+texguiheight 8
+texguiname 1
+texguiscale 1.5
+texguitime 15
+texguiwidth 15
+texreduce 0
+trilinear 1
+undomegs 8
+usenp2 0
+vertwater 1
+vsync 0
+vsynctear 0
+wallclock 0
+wallclock24 0
+wallclocksecs 0
+waterenvmap 1
+waterfade 1
+waterfallenv 1
+waterfallrefract 1
+waterlod 1
+waterreflect 1
+waterrefract 1
+watersubdiv 2
+zoomaccel 0.0
+zoomautosens 1
+zoomfov 35
+zoominvel 250
+zoomoutvel 100
+zoomsens 1.0
+
+bind "0" [setweapon FI]
+bind "1" [setweapon SG]
+bind "2" [setweapon CG]
+bind "3" [setweapon RL]
+bind "4" [setweapon RI]
+bind "5" [setweapon GL]
+bind "6" [setweapon PI]
+bind "7" [setweapon FI]
+bind "9" [if (allowthirdperson) [togglevar thirdperson]]
+bind "A" [left]
+bind "BACKQUOTE" [saycommand /]
+bind "D" [right]
+bind "DELETE" [delbot]
+bind "DOWN" [backward]
+bind "E" [edittoggle]
+bind "ESCAPE" [togglemainmenu]
+bind "F1" [set paused (= $paused 0)]
+bind "F11" [toggleconsole]
+bind "F12" [screenshot]
+bind "G" [togglezoom]
+bind "I" [taunt]
+bind "INSERT" [addbot]
+bind "KP_MINUS" [conskip 5]
+bind "KP_PLUS" [conskip -1000]
+bind "LEFT" [left]
+bind "MOUSE1" [attack]
+bind "MOUSE2" [jump]
+bind "MOUSE3" [weapon]
+bind "MOUSE4" [universaldelta 1]
+bind "MOUSE5" [universaldelta -1]
+bind "PAUSE" [set paused (= $paused 0)]
+bind "RIGHT" [right]
+bind "S" [backward]
+bind "SLASH" [saycommand /]
+bind "SPACE" [jump]
+bind "T" [saycommand]
+bind "TAB" [showscores]
+bind "UP" [forward]
+bind "W" [forward]
+bind "Y" [sayteamcommand]
+bind "Z" [togglezoom]
+specbind "MOUSE1" [nextfollow]
+specbind "MOUSE2" [nextfollow -1]
+specbind "MOUSE3" [follow]
+specbind "SPACE" [follow]
+editbind "0" [togglevar allfaces]
+editbind "1" [domodifier 11]
+editbind "2" [domodifier 12]
+editbind "3" [domodifier 13]
+editbind "4" [domodifier 14]
+editbind "5" [togglevar hidehud]
+editbind "6" [togglevar entselsnap]
+editbind "7" [togglevar outline]
+editbind "8" [togglevar wireframe]
+editbind "B" [domodifier 9]
+editbind "C" [editcopy]
+editbind "COMMA" [domodifier 10; onrelease entautoview]
+editbind "DELETE" [editdel]
+editbind "F" [domodifier 2]
+editbind "F2" [showtexgui]
+editbind "F3" [if (cleargui 1) [] [showentgui]]
+editbind "F4" [if (cleargui 1) [] [showgui mapmodels]]
+editbind "F5" [savemap]
+editbind "F6" [notepad (mapcfgname)]
+editbind "F9" [echo (getseltex) : (gettexname (getseltex))]
+editbind "G" [domodifier 1]
+editbind "H" [if $hmapedit [ editface 1 -1 ] [ hmapedit 1 ]]
+editbind "I" [redo]
+editbind "J" [gotosel]
+editbind "K" [calclight]
+editbind "KP0" [setblendpaintmode 0]
+editbind "KP1" [setblendpaintmode 1]
+editbind "KP2" [setblendpaintmode 2]
+editbind "KP3" [setblendpaintmode 3]
+editbind "KP4" [setblendpaintmode 4]
+editbind "KP5" [setblendpaintmode 5]
+editbind "KP8" [scrollblendbrush -1]
+editbind "KP9" [scrollblendbrush 1]
+editbind "KP_ENTER" [entselect insel]
+editbind "L" [togglevar fullbright]
+editbind "LALT" [set hmapedit 1; onrelease [set hmapedit 0]]
+editbind "LCTRL" [set passthrough 1; onrelease [set passthrough 0]]
+editbind "LSHIFT" [editcut]
+editbind "M" [togglevar showmat]
+editbind "MOUSE1" [if $blendpaintmode [paintblendmap] [editdrag]]
+editbind "MOUSE2" [if $blendpaintmode [rotateblendbrush] [editextend]]
+editbind "MOUSE3" [selcorners]
+editbind "N" [selentfindall]
+editbind "O" [domodifier 15]
+editbind "P" [domodifier 16]
+editbind "PERIOD" [selentedit]
+editbind "Q" [domodifier 3]
+editbind "R" [domodifier 4]
+editbind "SPACE" [cancelsel]
+editbind "T" [saycommand]
+editbind "U" [undo; passthroughsel 0]
+editbind "V" [editpaste]
+editbind "X" [editflip]
+editbind "Y" [domodifier 6]
+editbind "Z" [undo; passthroughsel 0]
+
+defaultmodifier = [0]
+delta_edit_0 = [
+ if $blendpaintmode [
+ scrollblendbrush $arg1
+ ] [
+ editfacewentpush $arg1 1
+ ]
+]
+delta_edit_1 = [ nodebug [ gridpower (+ $arg1 $gridpower) ] ]
+delta_edit_10 = [ entautoview $arg1 ]
+delta_edit_11 = [ entproperty 0 (* $arg1 $multiplier) ]
+delta_edit_12 = [ entproperty 1 (* $arg1 $multiplier) ]
+delta_edit_13 = [ entproperty 2 (* $arg1 $multiplier) ]
+delta_edit_14 = [ entproperty 3 (* $arg1 $multiplier) ]
+delta_edit_15 = [ vdelta [voffset (* $arg1 $multiplier2) 0] ]
+delta_edit_16 = [ vdelta [voffset 0 (* $arg1 $multiplier2)] ]
+delta_edit_17 = [ vdelta [vrotate $arg1] ]
+delta_edit_18 = [ vdelta [vscale (if (< $arg1 0) 0.5 2)] ]
+delta_edit_2 = [ editfacewentpush $arg1 0 ]
+delta_edit_3 = [ editfacewentpush $arg1 2 ]
+delta_edit_4 = [ if $blendpaintmode [rotateblendbrush $arg1] [editrotate $arg1] ]
+delta_edit_5 = [ entproperty 0 $arg1 ]
+delta_edit_6 = [ edittex $arg1 ]
+delta_edit_9 = [ selectbrush $arg1 ]
+delta_game_0 = [ if (= $arg1 1) [ weapon 2 3 5 4 1 6 0 ] [ weapon 4 1 6 2 3 5 0 ] ]
+domodifier = [ modifier = $arg1; onrelease [ modifier = $defaultmodifier ] ]
+modifier = [0]
+multiplier = [1]
+multiplier2 = [16]
+universaldelta = "^n do [delta_@(if $editing [ result edit ] [ result game ])_@modifier @arg1]^n"
+
+listcomplete clearents [
+ light mapmodel playerstart envmap particles sound
+ shells bullets rockets riflerounds grenades cartridges
+ health healthboost greenarmour yellowarmour quaddamage
+ teleport teledest
+ monster carrot jumppad
+ base respawnpoint
+ spotlight
+ box barrel platform elevator
+ flag
+]
+complete coop "packages/base" "ogz"
+varcomplete demo "demodir" "dmo"
+listcomplete editmat [air water clip glass noclip lava gameclip death alpha]
+complete effic "packages/base" "ogz"
+complete efficteam "packages/base" "ogz"
+listcomplete entfind [
+ light mapmodel playerstart envmap particles sound
+ shells bullets rockets riflerounds grenades cartridges
+ health healthboost greenarmour yellowarmour quaddamage
+ teleport teledest
+ monster carrot jumppad
+ base respawnpoint
+ spotlight
+ box barrel platform elevator
+ flag
+]
+complete ffa "packages/base" "ogz"
+complete insta "packages/base" "ogz"
+complete instateam "packages/base" "ogz"
+complete map "packages/base" "ogz"
+listcomplete newent [
+ light mapmodel playerstart envmap particles sound
+ shells bullets rockets riflerounds grenades cartridges
+ health healthboost greenarmour yellowarmour quaddamage
+ teleport teledest
+ monster carrot jumppad
+ base respawnpoint
+ spotlight
+ box barrel platform elevator
+ flag
+]
+complete teamplay "packages/base" "ogz"
# SAUER_OPTIONS contains any command line options you would like to start Sauerbraten with.
#SAUER_OPTIONS="-f"
-SAUER_OPTIONS="-q${HOME}/.sauerbraten"
+SAUER_OPTIONS="-q${HOME}/.uberbraten"
# SYSTEM_NAME should be set to the name of your operating system.
#SYSTEM_NAME=Linux
-CXXFLAGS= -O3 -fomit-frame-pointer -ffast-math
+CXXFLAGS= -O3 -g -fomit-frame-pointer -ffast-math
override CXXFLAGS+= -Wall -fsigned-char -fno-exceptions -fno-rtti
PLATFORM= $(shell uname -s | tr '[:lower:]' '[:upper:]')
PLATFORM_PREFIX= native
-INCLUDES= -Ishared -Iengine -Ifpsgame -Ienet/include
+INCLUDES= -Ishared -Iengine -Ifpsgame
STRIP=
ifeq (,$(findstring -g,$(CXXFLAGS)))
engine/client.o \
engine/command.o \
engine/console.o \
- engine/cubeloader.o \
engine/decal.o \
engine/dynlight.o \
engine/glare.o \
fpsgame/client.o \
fpsgame/entities.o \
fpsgame/fps.o \
- fpsgame/monster.o \
- fpsgame/movable.o \
fpsgame/render.o \
fpsgame/scoreboard.o \
fpsgame/server.o \
install: all
else
-client: libenet $(CLIENT_OBJS)
+client: $(CLIENT_OBJS)
$(CXX) $(CXXFLAGS) -o sauer_client $(CLIENT_OBJS) $(CLIENT_LIBS)
ifneq (,$(findstring DARWIN,$(PLATFORM)))
install_name_tool -add_rpath @executable_path/../Frameworks sauer_client
endif
-server: libenet $(SERVER_OBJS)
+server: $(SERVER_OBJS)
$(CXX) $(CXXFLAGS) -o sauer_server $(SERVER_OBJS) $(SERVER_LIBS)
-master: libenet $(MASTER_OBJS)
+master: $(MASTER_OBJS)
$(CXX) $(CXXFLAGS) -o sauer_master $(MASTER_OBJS) $(MASTER_LIBS)
shared/cube2font.o: shared/cube2font.c
endif
endif
-enet/libenet.a:
- $(MAKE) -C enet CC='$(CC)' AR='$(AR)'
-libenet: enet/libenet.a
-
depend:
makedepend -Y -Ishared -Iengine -Ifpsgame $(CLIENT_OBJS:.o=.cpp)
makedepend -a -o.h.gch -Y -Ishared -Iengine -Ifpsgame $(CLIENT_PCH:.h.gch=.h)
engine/console.o: shared/glemu.h shared/iengine.h shared/igame.h
engine/console.o: engine/world.h engine/octa.h engine/lightmap.h engine/bih.h
engine/console.o: engine/texture.h engine/model.h
-engine/cubeloader.o: engine/engine.h shared/cube.h shared/tools.h
-engine/cubeloader.o: shared/geom.h shared/ents.h shared/command.h
-engine/cubeloader.o: shared/glexts.h shared/glemu.h shared/iengine.h
-engine/cubeloader.o: shared/igame.h engine/world.h engine/octa.h
-engine/cubeloader.o: engine/lightmap.h engine/bih.h engine/texture.h
-engine/cubeloader.o: engine/model.h
engine/decal.o: engine/engine.h shared/cube.h shared/tools.h shared/geom.h
engine/decal.o: shared/ents.h shared/command.h shared/glexts.h shared/glemu.h
engine/decal.o: shared/iengine.h shared/igame.h engine/world.h engine/octa.h
engine/rendermodel.o: shared/igame.h engine/world.h engine/octa.h
engine/rendermodel.o: engine/lightmap.h engine/bih.h engine/texture.h
engine/rendermodel.o: engine/model.h engine/ragdoll.h engine/animmodel.h
-engine/rendermodel.o: engine/vertmodel.h engine/skelmodel.h engine/md2.h
+engine/rendermodel.o: engine/vertmodel.h engine/skelmodel.h
engine/rendermodel.o: engine/md3.h engine/md5.h engine/obj.h engine/smd.h
-engine/rendermodel.o: engine/iqm.h
engine/renderparticles.o: engine/engine.h shared/cube.h shared/tools.h
engine/renderparticles.o: shared/geom.h shared/ents.h shared/command.h
engine/renderparticles.o: shared/glexts.h shared/glemu.h shared/iengine.h
fpsgame/client.o: fpsgame/game.h shared/cube.h shared/tools.h shared/geom.h
fpsgame/client.o: shared/ents.h shared/command.h shared/glexts.h
fpsgame/client.o: shared/glemu.h shared/iengine.h shared/igame.h fpsgame/ai.h
-fpsgame/client.o: fpsgame/capture.h fpsgame/ctf.h fpsgame/collect.h
fpsgame/entities.o: fpsgame/game.h shared/cube.h shared/tools.h shared/geom.h
fpsgame/entities.o: shared/ents.h shared/command.h shared/glexts.h
fpsgame/entities.o: shared/glemu.h shared/iengine.h shared/igame.h
fpsgame/fps.o: fpsgame/game.h shared/cube.h shared/tools.h shared/geom.h
fpsgame/fps.o: shared/ents.h shared/command.h shared/glexts.h shared/glemu.h
fpsgame/fps.o: shared/iengine.h shared/igame.h fpsgame/ai.h
-fpsgame/monster.o: fpsgame/game.h shared/cube.h shared/tools.h shared/geom.h
-fpsgame/monster.o: shared/ents.h shared/command.h shared/glexts.h
-fpsgame/monster.o: shared/glemu.h shared/iengine.h shared/igame.h
-fpsgame/monster.o: fpsgame/ai.h
-fpsgame/movable.o: fpsgame/game.h shared/cube.h shared/tools.h shared/geom.h
-fpsgame/movable.o: shared/ents.h shared/command.h shared/glexts.h
-fpsgame/movable.o: shared/glemu.h shared/iengine.h shared/igame.h
-fpsgame/movable.o: fpsgame/ai.h
fpsgame/render.o: fpsgame/game.h shared/cube.h shared/tools.h shared/geom.h
fpsgame/render.o: shared/ents.h shared/command.h shared/glexts.h
fpsgame/render.o: shared/glemu.h shared/iengine.h shared/igame.h fpsgame/ai.h
fpsgame/server.o: fpsgame/game.h shared/cube.h shared/tools.h shared/geom.h
fpsgame/server.o: shared/ents.h shared/command.h shared/glexts.h
fpsgame/server.o: shared/glemu.h shared/iengine.h shared/igame.h fpsgame/ai.h
-fpsgame/server.o: fpsgame/capture.h fpsgame/ctf.h fpsgame/collect.h
fpsgame/server.o: fpsgame/extinfo.h fpsgame/aiman.h
fpsgame/waypoint.o: fpsgame/game.h shared/cube.h shared/tools.h shared/geom.h
fpsgame/waypoint.o: shared/ents.h shared/command.h shared/glexts.h
fpsgame/server-standalone.o: fpsgame/game.h shared/cube.h shared/tools.h
fpsgame/server-standalone.o: shared/geom.h shared/ents.h shared/command.h
fpsgame/server-standalone.o: shared/iengine.h shared/igame.h fpsgame/ai.h
-fpsgame/server-standalone.o: fpsgame/capture.h fpsgame/ctf.h
-fpsgame/server-standalone.o: fpsgame/collect.h fpsgame/extinfo.h
+fpsgame/server-standalone.o: fpsgame/extinfo.h
fpsgame/server-standalone.o: fpsgame/aiman.h
engine/master-standalone.o: shared/cube.h shared/tools.h shared/geom.h
engine/master-standalone.o: shared/ents.h shared/command.h shared/iengine.h
extern void gl_drawhud();
extern void gl_drawframe();
extern void gl_drawmainmenu();
-extern void drawminimap();
extern void drawtextures();
extern void enablepolygonoffset(GLenum type);
extern void disablepolygonoffset(GLenum type);
logoutf("init: console");
if(!execfile("data/stdlib.cfg", false)) fatal("cannot find data files (you are running from the wrong folder, try .bat file in the main folder)"); // this is the first file we load.
- if(!execfile("data/font.cfg", false)) fatal("cannot find font definitions");
+ if(!execfile("packages/fonts/default.cfg", false)) fatal("cannot find font definitions");
if(!setfont("default")) fatal("no default font specified");
inbetweenframes = true;
execfile("data/menus.cfg");
execfile("data/heightmap.cfg");
execfile("data/blendbrush.cfg");
- defformatstring(gamecfgname, "data/game_%s.cfg", game::gameident());
- execfile(gamecfgname);
+ execfile("data/game_fps.cfg");
if(game::savedservers()) execfile(game::savedservers(), false);
identflags |= IDF_PERSIST;
-enum { MDL_MD2 = 0, MDL_MD3, MDL_MD5, MDL_OBJ, MDL_SMD, MDL_IQM, NUMMODELTYPES };
+enum { MDL_MD3, MDL_MD5, MDL_OBJ, MDL_SMD, NUMMODELTYPES };
struct model
{
static inline clipplanes &getclipplanes(const cube &c, const ivec &o, int size, bool collide = true, int offset = 0)
{
clipplanes &p = clipcache[int(&c - worldroot)&(MAXCLIPPLANES-1)];
- if(p.owner != &c || p.version != clipcacheversion+offset)
+ if(p.owner != &c || p.version != clipcacheversion+offset)
{
p.owner = &c;
p.version = clipcacheversion+offset;
void freeshadowraycache(ShadowRayCache *&cache) { delete cache; cache = NULL; }
-void resetshadowraycache(ShadowRayCache *cache)
-{
+void resetshadowraycache(ShadowRayCache *cache)
+{
cache->version++;
if(!cache->version)
{
}
return false;
}
-
+
template<class E>
static bool fuzzycollideplanes(physent *d, const vec &dir, float cutoff, const cube &c, const ivec &co, int size) // collide with deformed cube geometry
{
stepfloor.normalize();
if(d->physstate >= PHYS_SLOPE && d->floor != stepfloor)
{
- // prevent alternating step-down/step-up states if player would keep bumping into the same floor
+ // prevent alternating step-down/step-up states if player would keep bumping into the same floor
vec stepped(d->o);
d->o.z -= 0.5f;
d->zmargin = -0.5f;
{
static struct dropent : physent
{
- dropent()
- {
- type = ENT_BOUNCE;
+ dropent()
+ {
+ type = ENT_BOUNCE;
vel = vec(0, 0, -1);
}
} d;
d.o = o;
- if(!insideworld(d.o))
+ if(!insideworld(d.o))
{
if(d.o.z < worldsize) return false;
d.o.z = worldsize - 1e-3f;
switch(e.type)
{
case ET_PARTICLES:
- case ET_MAPMODEL: return 0.0f;
+ case ET_MAPMODEL:
+ return 0.0f;
default:
- if(e.type >= ET_GAMESPECIFIC) return entities::dropheight(e);
return 4.0f;
}
}
void dropenttofloor(entity *e)
{
- droptofloor(e->o, 1.0f, dropheight(*e));
+ droptofloor(e->o, 1.0f, 4.0f);
}
void phystest()
glClearDepth(1);
glDepthFunc(GL_LESS);
glDisable(GL_DEPTH_TEST);
-
+
glEnable(GL_LINE_SMOOTH);
//glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
ICOMMAND(getcamyaw, "", (), floatret(camera1->yaw));
ICOMMAND(getcampitch, "", (), floatret(camera1->pitch));
ICOMMAND(getcamroll, "", (), floatret(camera1->roll));
-ICOMMAND(getcampos, "", (),
+ICOMMAND(getcampos, "", (),
{
defformatstring(pos, "%s %s %s", floatstr(camera1->o.x), floatstr(camera1->o.y), floatstr(camera1->o.z));
result(pos);
void setcamprojmatrix(bool init = true, bool flush = false)
{
if(init)
- {
+ {
setcammatrix();
}
fogplane.x /= projmatrix.a.x;
fogplane.y /= projmatrix.b.y;
fogplane.z /= projmatrix.c.w;
- GLOBALPARAMF(fogplane, fogplane.x, fogplane.y, 0, fogplane.z);
+ GLOBALPARAMF(fogplane, fogplane.x, fogplane.y, 0, fogplane.z);
}
else
{
FVARP(sensitivityscale, 1e-3f, 1, 1000);
VARP(invmouse, 0, 0, 1);
FVARP(mouseaccel, 0, 0, 1000);
-
+
VAR(thirdperson, 0, 0, 2);
FVAR(thirdpersondistance, 0, 20, 50);
FVAR(thirdpersonup, -25, 0, 25);
float cursens = sensitivity, curaccel = mouseaccel;
if(zoom)
{
- if(zoomautosens)
+ if(zoomautosens)
{
cursens = float(sensitivity*zoomfov)/fov;
curaccel = float(mouseaccel*zoomfov)/fov;
}
- else
+ else
{
cursens = zoomsens;
curaccel = zoomaccel;
camera1->type = ENT_CAMERA;
camera1->move = -1;
camera1->eyeheight = camera1->aboveeye = camera1->radius = camera1->xradius = camera1->yradius = 2;
-
+
matrix3 orient;
orient.identity();
orient.rotate_around_z(camera1->yaw*RAD);
orient.rotate_around_y(camera1->roll*-RAD);
vec dir = vec(orient.b).neg(), side = vec(orient.a).neg(), up = orient.c;
- if(game::collidecamera())
+ if(game::collidecamera())
{
movecamera(camera1, dir, thirdpersondistance, 1);
movecamera(camera1, dir, clamp(thirdpersondistance - camera1->o.dist(player->o), 0.0f, 1.0f), 0.1f);
movecamera(camera1, side, clamp(dist - camera1->o.dist(pos), 0.0f, 1.0f), 0.1f);
}
}
- else
+ else
{
camera1->o.add(vec(dir).mul(thirdpersondistance));
if(thirdpersonup) camera1->o.add(vec(up).mul(thirdpersonup));
glEnable(type);
return;
}
-
+
bool clipped = reflectz < 1e15f && reflectclip;
nooffsetmatrix = projmatrix;
glDisable(type);
return;
}
-
+
projmatrix = nooffsetmatrix;
setcamprojmatrix(false, true);
}
void calcspherescissor(const vec ¢er, float size, float &sx1, float &sy1, float &sx2, float &sy2)
{
vec worldpos(center), e;
- if(reflecting) worldpos.z = 2*reflectz - worldpos.z;
- cammatrix.transform(worldpos, e);
+ if(reflecting) worldpos.z = 2*reflectz - worldpos.z;
+ cammatrix.transform(worldpos, e);
if(e.z > 2*size) { sx1 = sy1 = 1; sx2 = sy2 = -1; return; }
float zzrr = e.z*e.z - size*size,
dx = e.x*e.x + zzrr, dy = e.y*e.y + zzrr,
glScissor(sx, sy, sw, sh);
if(scissoring<=1) glEnable(GL_SCISSOR_TEST);
-
+
return scissoring;
}
rendergame();
if(refracting && z>=0 && !isthirdperson() && fabs(camera1->o.z-z) <= 0.5f*(player->eyeheight + player->aboveeye))
- {
+ {
matrix4 oldprojmatrix = projmatrix, avatarproj;
avatarproj.perspective(curavatarfov, aspect, nearplane, farplane);
if(reflectclip)
if(fading) glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
- if(reflectclip && z>=0) projmatrix = noclipmatrix;
+ if(reflectclip && z>=0) projmatrix = noclipmatrix;
if(reflecting)
{
popfogdist();
popfogcolor();
-
+
reflectz = 1e16f;
refracting = 0;
reflecting = fading = fogging = false;
cmcamera.roll = 0;
camera1 = &cmcamera;
setviewcell(camera1->o);
-
+
int fogmat = lookupmaterial(o)&(MATF_VOLUME|MATF_INDEX);
setfog(fogmat);
return vec(0, dist, 0).rotate_around_x(camera1->pitch*RAD);
}
-GLuint minimaptex = 0;
-vec minimapcenter(0, 0, 0), minimapradius(0, 0, 0), minimapscale(0, 0, 0);
-
-void clearminimap()
-{
- if(minimaptex) { glDeleteTextures(1, &minimaptex); minimaptex = 0; }
-}
-
-VARR(minimapheight, 0, 0, 2<<16);
-bvec minimapcolor(0, 0, 0);
-HVARFR(minimapcolour, 0, 0, 0xFFFFFF,
-{
- minimapcolor = bvec((minimapcolour>>16)&0xFF, (minimapcolour>>8)&0xFF, minimapcolour&0xFF);
-});
-VARR(minimapclip, 0, 0, 1);
-VARFP(minimapsize, 7, 8, 10, { if(minimaptex) drawminimap(); });
-
-void bindminimap()
-{
- glBindTexture(GL_TEXTURE_2D, minimaptex);
-}
-
-void clipminimap(ivec &bbmin, ivec &bbmax, cube *c = worldroot, const ivec &co = ivec(0, 0, 0), int size = worldsize>>1)
-{
- loopi(8)
- {
- ivec o(i, co, size);
- if(c[i].children) clipminimap(bbmin, bbmax, c[i].children, o, size>>1);
- else if(!isentirelysolid(c[i]) && (c[i].material&MATF_CLIP)!=MAT_CLIP)
- {
- loopk(3) bbmin[k] = min(bbmin[k], o[k]);
- loopk(3) bbmax[k] = max(bbmax[k], o[k] + size);
- }
- }
-}
-
-void drawminimap()
-{
- if(!game::needminimap()) { clearminimap(); return; }
-
- renderprogress(0, "generating mini-map...", 0, !renderedframe);
-
- int size = 1<<minimapsize, sizelimit = min(hwtexsize, min(screenw, screenh));
- while(size > sizelimit) size /= 2;
- if(!minimaptex) glGenTextures(1, &minimaptex);
-
- ivec bbmin(worldsize, worldsize, worldsize), bbmax(0, 0, 0);
- loopv(valist)
- {
- vtxarray *va = valist[i];
- loopk(3)
- {
- if(va->geommin[k]>va->geommax[k]) continue;
- bbmin[k] = min(bbmin[k], va->geommin[k]);
- bbmax[k] = max(bbmax[k], va->geommax[k]);
- }
- }
- if(minimapclip)
- {
- ivec clipmin(worldsize, worldsize, worldsize), clipmax(0, 0, 0);
- clipminimap(clipmin, clipmax);
- loopk(2) bbmin[k] = max(bbmin[k], clipmin[k]);
- loopk(2) bbmax[k] = min(bbmax[k], clipmax[k]);
- }
-
- minimapradius = vec(bbmax).sub(vec(bbmin)).mul(0.5f);
- minimapcenter = vec(bbmin).add(minimapradius);
- minimapradius.x = minimapradius.y = max(minimapradius.x, minimapradius.y);
- minimapscale = vec((0.5f - 1.0f/size)/minimapradius.x, (0.5f - 1.0f/size)/minimapradius.y, 1.0f);
-
- drawtex = DRAWTEX_MINIMAP;
-
- physent *oldcamera = camera1;
- static physent cmcamera;
- cmcamera = *player;
- cmcamera.reset();
- cmcamera.type = ENT_CAMERA;
- cmcamera.o = vec(minimapcenter.x, minimapcenter.y, max(minimapcenter.z + minimapradius.z + 1, float(minimapheight)));
- cmcamera.yaw = 0;
- cmcamera.pitch = -90;
- cmcamera.roll = 0;
- camera1 = &cmcamera;
- setviewcell(vec(-1, -1, -1));
-
- projmatrix.ortho(-minimapradius.x, minimapradius.x, -minimapradius.y, minimapradius.y, 0, camera1->o.z + 1);
- projmatrix.a.mul(-1);
- setcamprojmatrix();
-
- setnofog(minimapcolor.tocolor());
-
- glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
-
- glViewport(0, 0, size, size);
-
- glEnable(GL_CULL_FACE);
- glEnable(GL_DEPTH_TEST);
-
- glFrontFace(GL_CCW);
-
- xtravertsva = xtraverts = glde = gbatches = 0;
-
- visiblecubes(false);
- queryreflections();
- drawreflections();
-
- loopi(minimapheight > 0 && minimapheight < minimapcenter.z + minimapradius.z ? 2 : 1)
- {
- if(i)
- {
- glClear(GL_DEPTH_BUFFER_BIT);
- camera1->o.z = minimapheight;
- setcamprojmatrix();
- }
- rendergeom();
- rendermapmodels();
- renderwater();
- rendermaterials();
- renderalphageom();
- }
-
- glFrontFace(GL_CW);
-
- glDisable(GL_DEPTH_TEST);
- glDisable(GL_CULL_FACE);
-
- glViewport(0, 0, screenw, screenh);
-
- camera1 = oldcamera;
- drawtex = 0;
-
- glBindTexture(GL_TEXTURE_2D, minimaptex);
- glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB5, 0, 0, size, size, 0);
- setuptexparameters(minimaptex, NULL, 3, 1, GL_RGB5, GL_TEXTURE_2D);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
- GLfloat border[4] = { minimapcolor.x/255.0f, minimapcolor.y/255.0f, minimapcolor.z/255.0f, 1.0f };
- glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, border);
- glBindTexture(GL_TEXTURE_2D, 0);
-}
-
bool deferdrawtextures = false;
void drawtextures()
if(minimized) { deferdrawtextures = true; return; }
deferdrawtextures = false;
genenvmaps();
- drawminimap();
}
GLuint motiontex = 0;
int w = screenw, h = screenh;
aspect = forceaspect ? forceaspect : w/float(h);
fovy = 2*atan2(tan(curfov/2*RAD), aspect)/RAD;
-
+
int fogmat = lookupmaterial(camera1->o)&(MATF_VOLUME|MATF_INDEX), abovemat = MAT_AIR;
float fogblend = 1.0f, causticspass = 0.0f;
if(isliquid(fogmat&MATF_VOLUME))
if(caustics && (fogmat&MATF_VOLUME)==MAT_WATER && camera1->o.z < z)
causticspass = min(z - camera1->o.z, 1.0f);
}
- else fogmat = MAT_AIR;
+ else fogmat = MAT_AIR;
setfog(fogmat, fogblend, abovemat);
if(fogmat!=MAT_AIR)
{
xtravertsva = xtraverts = glde = gbatches = 0;
visiblecubes();
-
+
glClear(GL_DEPTH_BUFFER_BIT|(wireframe && editmode ? GL_COLOR_BUFFER_BIT : 0));
- if(wireframe && editmode) glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ if(wireframe && editmode) glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
if(limitsky()) drawskybox(farplane, true);
{
if(!usedamagecompass || minimized) return;
vec delta(loc);
- delta.sub(camera1->o);
+ delta.sub(camera1->o);
float yaw = 0, pitch;
if(delta.magnitude() > 4)
{
{
if(i < 0 || i >= MAXCROSSHAIRS) return;
crosshairs[i] = name ? textureload(name, 3, true) : notexture;
- if(crosshairs[i] == notexture)
+ if(crosshairs[i] == notexture)
{
name = game::defaultcrosshair(i);
if(!name) name = "data/crosshair.png";
COMMANDN(loadcrosshair, loadcrosshair_, "si");
-ICOMMAND(getcrosshair, "i", (int *i),
+ICOMMAND(getcrosshair, "i", (int *i),
{
const char *name = "";
if(*i >= 0 && *i < MAXCROSSHAIRS)
}
result(name);
});
-
+
void writecrosshairs(stream *f)
{
loopi(MAXCROSSHAIRS) if(crosshairs[i] && crosshairs[i]!=notexture)
g3d_cursorpos(cx, cy);
}
else
- {
+ {
int index = game::selectcrosshair(color);
if(index < 0) return;
if(!crosshairfx) index = 0;
if(!crosshairfx || !crosshaircolors) color = vec(1, 1, 1);
crosshair = crosshairs[index];
- if(!crosshair)
+ if(!crosshair)
{
loadcrosshair(NULL, index);
crosshair = crosshairs[index];
hudmatrix.ortho(0, w, h, 0, -1, 1);
resethudmatrix();
-
+
gle::colorf(1, 1, 1);
extern int debugsm;
}
glEnable(GL_BLEND);
-
+
extern void debugparticles();
debugparticles();
-
+
if(!mainmenu)
{
drawdamagescreen(w, h);
char *dst = buf;
const char *src = &buf[!wallclock24 && buf[0]=='0' ? 1 : 0];
while(*src) *dst++ = tolower(*src++);
- *dst++ = '\0';
+ *dst++ = '\0';
draw_text(buf, conw-5*FONTH, conh-FONTH*3/2-roffset);
roffset += FONTH;
}
}
-
+
if(editmode || showeditstats)
{
static int laststats = 0, prevstats[8] = { 0, 0, 0, 0, 0, 0, 0 }, curstats[8] = { 0, 0, 0, 0, 0, 0, 0 };
{
cleanupmotionblur();
- clearminimap();
-
cleanupscreenquad();
gle::cleanup();
return new modelclass(filename); \
} \
UNUSED static int __dummy__##modelclass = addmodeltype((modeltype), __loadmodel__##modelclass);
-
-#include "md2.h"
+
#include "md3.h"
#include "md5.h"
#include "obj.h"
#include "smd.h"
-#include "iqm.h"
-MODELTYPE(MDL_MD2, md2);
MODELTYPE(MDL_MD3, md3);
MODELTYPE(MDL_MD5, md5);
MODELTYPE(MDL_OBJ, obj);
MODELTYPE(MDL_SMD, smd);
-MODELTYPE(MDL_IQM, iqm);
#define checkmdl if(!loadingmodel) { conoutf(CON_ERROR, "not loading a model"); return; }
{
checkmdl;
loadingmodel->ellipsecollide = *collide!=0;
-}
-
+}
+
COMMAND(mdlellipsecollide, "i");
void mdlspec(int *percent)
{
checkmdl;
- float spec = 1.0f;
+ float spec = 1.0f;
if(*percent>0) spec = *percent/100.0f;
else if(*percent<0) spec = 0.0f;
loadingmodel->setspec(spec);
COMMAND(mdlambient, "i");
void mdlalphatest(float *cutoff)
-{
+{
checkmdl;
loadingmodel->setalphatest(max(0.0f, min(1.0f, *cutoff)));
}
COMMAND(mdlalphatest, "f");
void mdlalphablend(int *blend)
-{
+{
checkmdl;
loadingmodel->setalphablend(*blend!=0);
}
float scale = 1.0f;
if(*percent>0) scale = *percent/100.0f;
loadingmodel->scale = scale;
-}
+}
COMMAND(mdlscale, "i");
{
checkmdl;
loadingmodel->translate = vec(*x, *y, *z);
-}
+}
COMMAND(mdltrans, "fff");
checkmdl;
loadingmodel->collidexyradius = *rad;
loadingmodel->collideheight = *h;
- loadingmodel->eyeheight = *eyeheight;
+ loadingmodel->eyeheight = *eyeheight;
}
COMMAND(mdlbb, "fff");
if(!skel->ragdoll) skel->ragdoll = new ragdollskel; \
ragdollskel *ragdoll = skel->ragdoll; \
if(ragdoll->loaded) return;
-
+
void rdvert(float *x, float *y, float *z, float *radius)
{
j.vert[2] = *v3;
}
COMMAND(rdjoint, "iibbb");
-
+
void rdlimitdist(int *v1, int *v2, float *mindist, float *maxdist)
{
checkragdoll;
mmodel(name);
}
-void mapmodelreset(int *n)
-{
+void mapmodelreset(int *n)
+{
if(!(identflags&IDF_OVERRIDDEN) && !game::allowedittoggle()) return;
- mapmodels.shrink(clamp(*n, 0, mapmodels.length()));
+ mapmodels.shrink(clamp(*n, 0, mapmodels.length()));
}
mapmodelinfo *getmminfo(int i) { return mapmodels.inrange(i) ? &mapmodels[i] : 0; }
model *m;
if(mm) m = *mm;
else
- {
+ {
if(!name[0] || loadingmodel || lightmapping > 1) return NULL;
if(msg)
{
dynent *d;
int attached;
occludequery *query;
-};
+};
struct modelbatch
{
model *m;
int flags;
vector<batchedmodel> batched;
-};
+};
static vector<modelbatch *> batches;
static vector<modelattach> modelattached;
static int numbatches = -1;
int anim = b.anim;
if(shadowmapping)
{
- anim |= ANIM_NOSKIN;
+ anim |= ANIM_NOSKIN;
GLOBALPARAMF(shadowintensity, b.transparent);
}
- else
+ else
{
if(b.flags&MDL_FULLBRIGHT) anim |= ANIM_FULLBRIGHT;
if(b.flags&MDL_GHOST) anim |= ANIM_GHOST;
if(!rendered) { b.m->startrender(); rendered = true; }
renderbatchedmodel(b.m, bm);
}
- if(rendered)
+ if(rendered)
{
b.m->endrender();
rendered = false;
}
}
- loopvj(b.batched)
+ loopvj(b.batched)
{
batchedmodel &bm = b.batched[j];
if(bm.flags&(MDL_CULL_VFC|MDL_GHOST)) continue;
void rendermodel(entitylight *light, const char *mdl, int anim, const vec &o, float yaw, float pitch, int flags, dynent *d, modelattach *a, int basetime, int basetime2, float trans)
{
if(shadowmapping && !(flags&(MDL_SHADOW|MDL_DYNSHADOW))) return;
- model *m = loadmodel(mdl);
+ model *m = loadmodel(mdl);
if(!m) return;
vec center(0, 0, 0), bbradius(0, 0, 0);
float radius = 0;
else if(showboundingbox && !shadowmapping && !reflecting && !refracting && editmode)
{
notextureshader->set();
- if(d && showboundingbox==1)
+ if(d && showboundingbox==1)
{
render3dbox(d->o, d->eyeheight, d->aboveeye, d->radius);
renderellipse(d->o, d->xradius, d->yradius, d->yaw);
if(!shadowmapping)
{
vec pos = o;
- if(d)
+ if(d)
{
if(!reflecting && !refracting) d->occluded = OCCLUDE_NOTHING;
if(!light) light = &d->light;
}
else if(flags&MDL_LIGHT)
{
- if(!light)
+ if(!light)
{
lightreaching(pos, lightcolor, lightdir, (flags&MDL_LIGHT_FAST)!=0);
dynlightreaching(pos, lightcolor, lightdir, (flags&MDL_HUD)!=0);
b.basetime2 = basetime2;
b.transparent = trans;
b.flags = flags & ~(MDL_CULL_VFC | MDL_CULL_DIST | MDL_CULL_OCCLUDED);
- if(!shadow || reflecting || refracting>0)
+ if(!shadow || reflecting || refracting>0)
{
b.flags &= ~(MDL_SHADOW|MDL_DYNSHADOW);
if((flags&MDL_CULL_VFC) && refracting<0 && center.z-radius>=reflectz) b.flags |= MDL_CULL_VFC;
anim |= ANIM_NOSKIN;
GLOBALPARAMF(shadowintensity, trans);
}
- else
+ else
{
if(flags&MDL_FULLBRIGHT) anim |= ANIM_FULLBRIGHT;
if(flags&MDL_GHOST) anim |= ANIM_GHOST;
{
c = *pattern;
if(!c || c=='|') break;
- else if(c=='*')
+ else if(c=='*')
{
if(!*s || iscubespace(*s)) break;
do s++; while(*s && !iscubespace(*s));
} \
} \
}
-
+
defformatstring(mdir, "packages/models/%s", dir);
defformatstring(maltdir, "packages/models/%s", altdir);
masks = notexture;
basetime = lastpain;
if(ragdoll)
{
- if(!d->ragdoll || d->ragdoll->millis < basetime)
+ if(!d->ragdoll || d->ragdoll->millis < basetime)
{
DELETEP(d->ragdoll);
anim |= ANIM_RAGDOLL;
else if(d->state==CS_LAGGED) anim = ANIM_LAG|ANIM_LOOP;
else
{
- if(lastmillis-lastpain < 300)
- {
+ if(lastmillis-lastpain < 300)
+ {
anim = ANIM_PAIN;
basetime = lastpain;
}
else if(lastpain < lastaction && (attack < 0 || (d->type != ENT_AI && lastmillis-lastaction < attackdelay)))
- {
- anim = attack < 0 ? -attack : attack;
- basetime = lastaction;
+ {
+ anim = attack < 0 ? -attack : attack;
+ basetime = lastaction;
}
if(d->inwater && d->physstate<=PHYS_FALL) anim |= (((game::allowmove(d) && (d->move || d->strafe)) || d->vel.z+d->falling.z>0 ? ANIM_SWIM : ANIM_SINK)|ANIM_LOOP)<<ANIM_SECONDARY;
else if(d->timeinair>100) anim |= (ANIM_JUMP|ANIM_END)<<ANIM_SECONDARY;
- else if(game::allowmove(d) && (d->move || d->strafe))
+ else if(game::allowmove(d) && (d->move || d->strafe))
{
if(d->move>0) anim |= (ANIM_FORWARD|ANIM_LOOP)<<ANIM_SECONDARY;
else if(d->strafe)
}
else if(d->move<0) anim |= (ANIM_BACKWARD|ANIM_LOOP)<<ANIM_SECONDARY;
}
-
+
if((anim&ANIM_INDEX)==ANIM_IDLE && (anim>>ANIM_SECONDARY)&ANIM_INDEX) anim >>= ANIM_SECONDARY;
}
if(d->ragdoll && (!ragdoll || (anim&ANIM_INDEX)!=ANIM_DYING)) DELETEP(d->ragdoll);
void setbbfrommodel(dynent *d, const char *mdl)
{
- model *m = loadmodel(mdl);
+ model *m = loadmodel(mdl);
if(!m) return;
vec center, radius;
m->collisionbox(center, radius);
void sortvisiblevas()
{
- visibleva = NULL;
+ visibleva = NULL;
vtxarray **last = &visibleva;
loopi(VASORTSIZE) if(vasort[i])
{
vtxarray &v = *vas[i];
int prevvfc = resetocclude ? VFC_NOT_VISIBLE : v.curvfc;
v.curvfc = isvisiblecube(v.o, v.size);
- if(v.curvfc!=VFC_NOT_VISIBLE)
+ if(v.curvfc!=VFC_NOT_VISIBLE)
{
if(pvsoccluded(v.o, v.size))
{
loopk(3) if(p[k] > 0) vfcDfar[i] += p[k];
else vfcDnear[i] += p[k];
}
-}
+}
void setvfcP(float z, const vec &bbmin, const vec &bbmax)
{
static inline bool insideva(const vtxarray *va, const vec &v, int margin = 2)
{
int size = va->size + margin;
- return v.x>=va->o.x-margin && v.y>=va->o.y-margin && v.z>=va->o.z-margin &&
+ return v.x>=va->o.x-margin && v.y>=va->o.y-margin && v.z>=va->o.z-margin &&
v.x<=va->o.x+size && v.y<=va->o.y+size && v.z<=va->o.z+size;
}
void rendermapmodel(extentity &e)
{
int anim = ANIM_MAPMODEL|ANIM_LOOP, basetime = 0;
- if(e.flags&EF_ANIM) entities::animatemapmodel(e, anim, basetime);
mapmodelinfo *mmi = getmminfo(e.attr2);
if(mmi) rendermodel(&e.light, mmi->name, anim, e.o, e.attr1, 0, MDL_CULL_VFC | MDL_CULL_DIST | MDL_DYNLIGHT, NULL, NULL, basetime);
}
for(vtxarray *va = reflectedva; va; va = va->rnext)
{
if(va->mapmodels.empty() || va->distance > reflectdist) continue;
- loopv(va->mapmodels)
+ loopv(va->mapmodels)
{
octaentities *oe = va->mapmodels[i];
*lastmms = oe;
rendered = true;
oe->query = doquery && oe->distance>0 && !(++skipoq%oqmm) ? newquery(oe) : NULL;
if(oe->query) startmodelquery(oe->query);
- }
+ }
rendermapmodel(e);
e.flags &= ~EF_RENDER;
}
static inline bool bbinsideva(const ivec &bo, const ivec &br, vtxarray *va)
{
return bo.x >= va->bbmin.x && bo.y >= va->bbmin.y && bo.z >= va->bbmin.z &&
- br.x <= va->bbmax.x && br.y <= va->bbmax.y && br.z <= va->bbmax.z;
+ br.x <= va->bbmax.x && br.y <= va->bbmax.y && br.z <= va->bbmax.z;
}
static inline bool bboccluded(const ivec &bo, const ivec &br, cube *c, const ivec &o, int size)
drawvatris(va, 3*va->alphatris, &va->edata[3*(va->tris + va->blendtris)]);
xtravertsva += 3*va->alphatris;
}
-
+
prev = va;
}
gle::clearebo();
gle::disablevertex();
}
-
+
void rendershadowmapreceivers()
{
SETSHADER(shadowmapreceiver);
glEnable(GL_BLEND);
glBlendEquation_(GL_MAX);
glBlendFunc(GL_ONE, GL_ONE);
-
+
vtxarray *prev = NULL;
for(vtxarray *va = visibleva; va; va = va->next)
{
glCullFace(GL_BACK);
glDepthMask(GL_TRUE);
glDepthFunc(GL_LESS);
-
+
if(!ati_minmax_bug) glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
gle::clearvbo();
SETSHADER(depthfxworld);
if(!numranges) loopi(4) scales[i] = 1.0f/scale;
- else loopi(numranges)
+ else loopi(numranges)
{
scales[i] = 1.0f/scale;
offsets[i] = -ranges[i]/scale;
vtxarray *prev = NULL;
for(vtxarray *va = visibleva; va; va = va->next)
{
- if(!va->texs || va->occluded >= OCCLUDE_GEOM ||
+ if(!va->texs || va->occluded >= OCCLUDE_GEOM ||
va->o.x > bbmax.x || va->o.y > bbmax.y || va->o.z > bbmax.z ||
va->o.x + va->size < bbmin.x || va->o.y + va->size < bbmin.y || va->o.z + va->size < bbmin.z)
continue;
static void mergetexs(renderstate &cur, vtxarray *va, elementset *texs = NULL, int numtexs = 0, ushort *edata = NULL)
{
- if(!texs)
- {
- texs = va->eslist;
- numtexs = va->texs;
+ if(!texs)
+ {
+ texs = va->eslist;
+ numtexs = va->texs;
edata = va->edata;
if(cur.alphaing)
{
{
firstbatch = geombatches.length();
numbatches = numtexs;
- loopi(numtexs-1)
+ loopi(numtexs-1)
{
geombatches.add(geombatch(texs[i], edata, va)).next = i+1;
edata += texs[i].length[1];
geombatches.add(geombatch(texs[numtexs-1], edata, va));
return;
}
-
+
int prevbatch = -1, curbatch = firstbatch, curtex = 0;
do
{
{
b.batch = next;
geombatches[last].batch = geombatches.length()-1;
- }
+ }
}
- else
+ else
{
numbatches++;
b.next = curbatch;
bool changed = false;
extern bool brightengeom;
extern int fullbright;
- int lmid = brightengeom && (b.es.lmid < LMID_RESERVED || (fullbright && editmode)) ? LMID_BRIGHT : b.es.lmid;
+ int lmid = brightengeom && (b.es.lmid < LMID_RESERVED || (fullbright && editmode)) ? LMID_BRIGHT : b.es.lmid;
if(cur.textures[1]!=lightmaptexs[lmid].id)
{
glActiveTexture_(GL_TEXTURE1);
if(cur.alphaing)
{
float alpha = cur.alphaing > 1 ? vslot.alphafront : vslot.alphaback;
- if(cur.colorscale != vslot.colorscale || cur.alphascale != alpha)
+ if(cur.colorscale != vslot.colorscale || cur.alphascale != alpha)
{
cur.colorscale = vslot.colorscale;
cur.alphascale = alpha;
glBindTexture(GL_TEXTURE_CUBE_MAP, cur.textures[envmaptmu] = t.t->id);
}
}
- else
+ else
{
if(cur.textures[tmu]!=t.t->id)
{
for(geombatch *curbatch = &b;; curbatch = &geombatches[curbatch->batch])
{
ushort len = curbatch->es.length[curbatch->va->shadowed ? 0 : 1];
- if(len)
+ if(len)
{
if(rendered < 0)
{
gbatches++;
}
ushort minvert = curbatch->es.minvert[0], maxvert = curbatch->es.maxvert[0];
- if(!curbatch->va->shadowed) { minvert = min(minvert, curbatch->es.minvert[1]); maxvert = max(maxvert, curbatch->es.maxvert[1]); }
- drawtris(len, curbatch->edata, minvert, maxvert);
+ if(!curbatch->va->shadowed) { minvert = min(minvert, curbatch->es.minvert[1]); maxvert = max(maxvert, curbatch->es.maxvert[1]); }
+ drawtris(len, curbatch->edata, minvert, maxvert);
vtris += len/3;
}
if(curbatch->es.length[1] > len && !shadowed) shadowed = curbatch;
if(cur.vquery) disablevquery(cur);
enablevattribs(cur);
}
- }
+ }
while(curbatch >= 0)
{
geombatch &b = geombatches[curbatch];
curbatch = b.next;
if(cur.vbuf != b.va->vbuf) changevbuf(cur, pass, b.va);
- if(cur.vslot != &b.vslot)
+ if(cur.vslot != &b.vslot)
{
changeslottmus(cur, pass, *b.vslot.slot, b.vslot);
if(cur.texgendim != b.es.dim || (cur.texgendim <= 2 && cur.texgenvslot != &b.vslot)) changetexgen(cur, b.es.dim, *b.vslot.slot, b.vslot);
void renderzpass(renderstate &cur, vtxarray *va)
{
if(!cur.vattribs)
- {
+ {
if(cur.vquery) disablevquery(cur);
enablevattribs(cur, false);
}
drawvatris(va, 3*va->tris, va->edata);
xtravertsva += va->verts;
break;
-
+
case RENDERPASS_Z:
if(doquery) startvaquery(va, );
renderzpass(cur, va);
{
if(!va->texs) continue;
if(refracting)
- {
+ {
if((refracting < 0 ? va->geommin.z > reflectz : va->geommax.z <= reflectz) || va->occluded >= OCCLUDE_GEOM) continue;
if(ishiddencube(va->o, va->size)) continue;
}
flipqueries();
vtris = vverts = 0;
}
- if(!doZP)
+ if(!doZP)
{
if(shadowmap && mainpass) rendershadowmap();
setupgeom(cur);
va->occluded = pvsoccluded(va->geommin, va->geommax) ? OCCLUDE_GEOM : OCCLUDE_NOTHING;
if(va->occluded >= OCCLUDE_GEOM)
{
- if(va->query)
+ if(va->query)
{
if(!zpass && geombatches.length()) renderbatches(cur, RENDERPASS_LIGHTMAP);
if(cur.vattribs) disablevattribs(cur, !doZP);
if(!cur.colormask) { cur.colormask = true; glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); }
if(!cur.depthmask) { cur.depthmask = true; glDepthMask(GL_TRUE); }
-
+
bool multipassing = false;
if(doZP)
{
if(va->geommax.z <= reflectz) continue;
}
- else
+ else
{
if(va->occluded >= OCCLUDE_BB) continue;
if(va->occluded >= OCCLUDE_GEOM && pvsoccluded(va->geommin, va->geommax)) continue;
if(cur.depthmask) { cur.depthmask = false; glDepthMask(GL_FALSE); }
cur.colormask = true;
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE);
-
+
if(cur.vattribs) disablevattribs(cur, false);
if(cur.vbuf) disablevbuf(cur);
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, fading ? GL_FALSE : GL_TRUE);
}
-
+
void findreflectedvas(vector<vtxarray *> &vas, int prevvfc = VFC_PART_VISIBLE)
{
loopv(vas)
rendergeom(causticspass ? 1 : 0, fogpass);
}
else rendergeom(causticspass ? 1 : 0, fogpass);
-}
+}
static vtxarray *prevskyva = NULL;
if(prevvfc >= VFC_NOT_VISIBLE) va->curvfc = prevvfc;
if((va->curvfc == VFC_FULL_VISIBLE && va->occluded >= OCCLUDE_BB) || va->curvfc==PVS_FULL_VISIBLE) continue;
if(va->o.z+va->size <= reflectz || ishiddencube(va->o, va->size)) continue;
- if(va->sky+va->explicitsky)
+ if(va->sky+va->explicitsky)
{
updateskystats(va);
renderskyva(va);
if(prevskyva)
{
- gle::disablevertex();
+ gle::disablevertex();
gle::clearvbo();
gle::clearebo();
}
{
if(lastmillis >= d->ai->lastaimrnd)
{
- const int aiskew[NUMGUNS] = { 1, 10, 50, 5, 20, 1, 100, 10, 10, 10, 1, 1 };
+ const int aiskew[NUMGUNS] = { 1, 10, 50, 5, 20, 1, 100 };
#define rndaioffset(r) ((rnd(int(r*aiskew[d->gunselect]*2)+1)-(r*aiskew[d->gunselect]))*(1.f/float(max(d->skill, 1))))
loopk(3) d->ai->aimrnd[k] = rndaioffset(e->radius);
int dur = (d->skill+10)*10;
d->ownernum = ocn;
d->plag = 0;
d->skill = sk;
- d->playermodel = chooserandomplayermodel(pm);
+ d->playermodel = 0;
if(resetthisguy) removeweapons(d);
if(d->ownernum >= 0 && player1->clientnum == d->ownernum)
float radius = 18*18;
loopv(entities::ents) if(entities::ents[i]->type == JUMPPAD)
{
- fpsentity &e = *(fpsentity *)entities::ents[i];
+ extentity &e = *(extentity *)entities::ents[i];
if(e.o.squaredist(pos) <= radius) { jump = false; break; }
}
}
copystring(ci->name, "bot", MAXNAMELEN+1);
ci->state.state = CS_DEAD;
copystring(ci->team, team, MAXTEAMLEN+1);
- ci->playermodel = rnd(128);
+ ci->playermodel = 0;
ci->aireinit = 2;
ci->connected = true;
dorefresh = true;
namespace game
{
- VARP(minradarscale, 0, 384, 10000);
- VARP(maxradarscale, 1, 1024, 10000);
- VARP(radarteammates, 0, 1, 1);
- FVARP(minimapalpha, 0, 1, 1);
-
- float calcradarscale()
- {
- return clamp(max(minimapradius.x, minimapradius.y)/3, float(minradarscale), float(maxradarscale));
- }
-
- void drawminimap(fpsent *d, float x, float y, float s)
- {
- vec pos = vec(d->o).sub(minimapcenter).mul(minimapscale).add(0.5f), dir;
- vecfromyawpitch(camera1->yaw, 0, 1, 0, dir);
- float scale = calcradarscale();
- gle::defvertex(2);
- gle::deftexcoord0();
- gle::begin(GL_TRIANGLE_FAN);
- loopi(16)
- {
- vec v = vec(0, -1, 0).rotate_around_z(i/16.0f*2*M_PI);
- gle::attribf(x + 0.5f*s*(1.0f + v.x), y + 0.5f*s*(1.0f + v.y));
- vec tc = vec(dir).rotate_around_z(i/16.0f*2*M_PI);
- gle::attribf(pos.x + tc.x*scale*minimapscale.x, pos.y + tc.y*scale*minimapscale.y);
- }
- gle::end();
- }
-
- void drawradar(float x, float y, float s)
- {
- gle::defvertex(2);
- gle::deftexcoord0();
- gle::begin(GL_TRIANGLE_STRIP);
- gle::attribf(x, y); gle::attribf(0, 0);
- gle::attribf(x+s, y); gle::attribf(1, 0);
- gle::attribf(x, y+s); gle::attribf(0, 1);
- gle::attribf(x+s, y+s); gle::attribf(1, 1);
- gle::end();
- }
-
- void drawteammate(fpsent *d, float x, float y, float s, fpsent *o, float scale)
- {
- vec dir = d->o;
- dir.sub(o->o).div(scale);
- float dist = dir.magnitude2(), maxdist = 1 - 0.05f - 0.05f;
- if(dist >= maxdist) dir.mul(maxdist/dist);
- dir.rotate_around_z(-camera1->yaw*RAD);
- float bs = 0.06f*s,
- bx = x + s*0.5f*(1.0f + dir.x),
- by = y + s*0.5f*(1.0f + dir.y);
- vec v(-0.5f, -0.5f, 0);
- v.rotate_around_z((90+o->yaw-camera1->yaw)*RAD);
- gle::attribf(bx + bs*v.x, by + bs*v.y); gle::attribf(0, 0);
- gle::attribf(bx + bs*v.y, by - bs*v.x); gle::attribf(1, 0);
- gle::attribf(bx - bs*v.x, by - bs*v.y); gle::attribf(1, 1);
- gle::attribf(bx - bs*v.y, by + bs*v.x); gle::attribf(0, 1);
- }
-
- void drawteammates(fpsent *d, float x, float y, float s)
- {
- if(!radarteammates) return;
- float scale = calcradarscale();
- int alive = 0, dead = 0;
- loopv(players)
- {
- fpsent *o = players[i];
- if(o != d && o->state == CS_ALIVE && isteam(o->team, d->team))
- {
- if(!alive++)
- {
- settexture(isteam(d->team, player1->team) ? "packages/hud/blip_blue_alive.png" : "packages/hud/blip_red_alive.png");
- gle::defvertex(2);
- gle::deftexcoord0();
- gle::begin(GL_QUADS);
- }
- drawteammate(d, x, y, s, o, scale);
- }
- }
- if(alive) gle::end();
- loopv(players)
- {
- fpsent *o = players[i];
- if(o != d && o->state == CS_DEAD && isteam(o->team, d->team))
- {
- if(!dead++)
- {
- settexture(isteam(d->team, player1->team) ? "packages/hud/blip_blue_dead.png" : "packages/hud/blip_red_dead.png");
- gle::defvertex(2);
- gle::deftexcoord0();
- gle::begin(GL_QUADS);
- }
- drawteammate(d, x, y, s, o, scale);
- }
- }
- if(dead) gle::end();
- }
-
- #include "capture.h"
- #include "ctf.h"
- #include "collect.h"
-
clientmode *cmode = NULL;
- captureclientmode capturemode;
- ctfclientmode ctfmode;
- collectclientmode collectmode;
void setclientmode()
{
- if(m_capture) cmode = &capturemode;
- else if(m_ctf) cmode = &ctfmode;
- else if(m_collect) cmode = &collectmode;
- else cmode = NULL;
+ cmode = NULL;
}
bool senditemstoserver = false, sendcrc = false; // after a map change, since server doesn't have map data
void switchname(const char *name)
{
filtertext(player1->name, name, false, false, MAXNAMELEN);
- if(!player1->name[0]) copystring(player1->name, "unnamed");
+ if(!player1->name[0]) copystring(player1->name, "Anonymous");
addmsg(N_SWITCHNAME, "rs", player1->name);
}
void printname()
});
ICOMMAND(getteam, "", (), result(player1->team));
- void switchplayermodel(int playermodel)
- {
- player1->playermodel = playermodel;
- addmsg(N_SWITCHMODEL, "ri", player1->playermodel);
- }
-
struct authkey
{
char *name, *key, *desc;
}
ICOMMAND(getclientteam, "i", (int *cn), result(getclientteam(*cn)));
- int getclientmodel(int cn)
- {
- fpsent *d = getclient(cn);
- return d ? d->playermodel : -1;
- }
- ICOMMAND(getclientmodel, "i", (int *cn), intret(getclientmodel(*cn)));
-
const char *getclienticon(int cn)
{
fpsent *d = getclient(cn);
{
authkey *a = findauthkey(desc);
int vn = parseplayer(victim);
- if(a && vn>=0 && vn!=player1->clientnum)
+ if(a && vn>=0 && vn!=player1->clientnum)
{
a->lastauth = lastmillis;
addmsg(N_AUTHKICK, "rssis", a->desc, a->name, vn, reason);
bool isignored(int cn) { return ignores.find(cn) >= 0; }
ICOMMAND(ignore, "s", (char *arg), ignore(parseplayer(arg)));
- ICOMMAND(unignore, "s", (char *arg), unignore(parseplayer(arg)));
+ ICOMMAND(unignore, "s", (char *arg), unignore(parseplayer(arg)));
ICOMMAND(isignored, "s", (char *arg), intret(isignored(parseplayer(arg)) ? 1 : 0));
void setteam(const char *arg1, const char *arg2)
}
string hash = "";
if(!arg[1] && isdigit(arg[0])) val = parseint(arg);
- else
+ else
{
if(cn != player1->clientnum) return;
server::hashpassword(player1->clientnum, sessionid, arg, hash);
}
ICOMMAND(mode, "i", (int *val), setmode(*val));
ICOMMAND(getmode, "", (), intret(gamemode));
- ICOMMAND(timeremaining, "i", (int *formatted),
+ ICOMMAND(timeremaining, "i", (int *formatted),
{
int val = max(maplimit - lastmillis + 999, 0)/1000;
if(*formatted)
ICOMMANDS("m_noitems", "i", (int *mode), { int gamemode = *mode; intret(m_noitems); });
ICOMMANDS("m_noammo", "i", (int *mode), { int gamemode = *mode; intret(m_noammo); });
ICOMMANDS("m_insta", "i", (int *mode), { int gamemode = *mode; intret(m_insta); });
- ICOMMANDS("m_tactics", "i", (int *mode), { int gamemode = *mode; intret(m_tactics); });
ICOMMANDS("m_efficiency", "i", (int *mode), { int gamemode = *mode; intret(m_efficiency); });
- ICOMMANDS("m_capture", "i", (int *mode), { int gamemode = *mode; intret(m_capture); });
- ICOMMANDS("m_regencapture", "i", (int *mode), { int gamemode = *mode; intret(m_regencapture); });
- ICOMMANDS("m_ctf", "i", (int *mode), { int gamemode = *mode; intret(m_ctf); });
- ICOMMANDS("m_protect", "i", (int *mode), { int gamemode = *mode; intret(m_protect); });
- ICOMMANDS("m_hold", "i", (int *mode), { int gamemode = *mode; intret(m_hold); });
- ICOMMANDS("m_collect", "i", (int *mode), { int gamemode = *mode; intret(m_collect); });
ICOMMANDS("m_teammode", "i", (int *mode), { int gamemode = *mode; intret(m_teammode); });
ICOMMANDS("m_demo", "i", (int *mode), { int gamemode = *mode; intret(m_demo); });
ICOMMANDS("m_edit", "i", (int *mode), { int gamemode = *mode; intret(m_edit); });
ICOMMANDS("m_lobby", "i", (int *mode), { int gamemode = *mode; intret(m_lobby); });
- ICOMMANDS("m_sp", "i", (int *mode), { int gamemode = *mode; intret(m_sp); });
- ICOMMANDS("m_dmsp", "i", (int *mode), { int gamemode = *mode; intret(m_dmsp); });
- ICOMMANDS("m_classicsp", "i", (int *mode), { int gamemode = *mode; intret(m_classicsp); });
void changemap(const char *name, int mode) // request map change, server may ignore
{
int val = *id->storage.i;
string str;
if(val < 0)
- formatstring(str, "%d", val);
+ formatstring(str, "%d", val);
else if(id->flags&IDF_HEX && id->maxval==0xFFFFFF)
formatstring(str, "0x%.6X (%d, %d, %d)", val, (val>>16)&0xFF, (val>>8)&0xFF, val&0xFF);
else
}
ICOMMAND(pausegame, "i", (int *val), pausegame(*val > 0));
ICOMMAND(paused, "iN$", (int *val, int *numargs, ident *id),
- {
- if(*numargs > 0) pausegame(clampvar(id, *val, 0, 1) > 0);
+ {
+ if(*numargs > 0) pausegame(clampvar(id, *val, 0, 1) > 0);
else if(*numargs < 0) intret(gamepaused ? 1 : 0);
- else printvar(id, gamepaused ? 1 : 0);
+ else printvar(id, gamepaused ? 1 : 0);
});
bool ispaused() { return gamepaused; }
gamepaused = val;
player1->attacking = false;
}
- if(a) conoutf("%s %s the game", colorname(a), val ? "paused" : "resumed");
+ if(a) conoutf("%s %s the game", colorname(a), val ? "paused" : "resumed");
else conoutf("game is %s", val ? "paused" : "resumed");
break;
}
fpsent *a = cn >= 0 ? getclient(cn) : NULL;
if(!demopacket) gamespeed = val;
extern int slowmosp;
- if(m_sp && slowmosp) break;
if(a) conoutf("%s set gamespeed to %d", colorname(a), val);
else conoutf("gamespeed is %d", val);
break;
}
-
+
case N_CLIENT:
{
int cn = getint(p), len = getuint(p);
}
getstring(text, p);
filtertext(text, text, false, false, MAXNAMELEN);
- if(!text[0]) copystring(text, "unnamed");
+ if(!text[0]) copystring(text, "Anonymous");
if(d->name[0]) // already connected
{
if(strcmp(d->name, text) && !isignored(d->clientnum))
getstring(text, p);
filtertext(d->team, text, false, false, MAXTEAMLEN);
d->playermodel = getint(p);
+ d->playermodel = 0;
break;
}
if(d)
{
filtertext(text, text, false, false, MAXNAMELEN);
- if(!text[0]) copystring(text, "unnamed");
+ if(!text[0]) copystring(text, "Anonymous");
if(strcmp(text, d->name))
{
if(!isignored(d->clientnum)) conoutf("%s is now known as %s", colorname(d), colorname(d, text));
int model = getint(p);
if(d)
{
- d->playermodel = model;
+ d->playermodel = 0;
if(d->ragdoll) cleanragdoll(d);
}
break;
break;
}
- #define PARSEMESSAGES 1
- #include "capture.h"
- #include "ctf.h"
- #include "collect.h"
- #undef PARSEMESSAGES
-
case N_ANNOUNCE:
{
int t = getint(p);
{
if(ver <= 30) switch(e.type)
{
- case FLAG:
- case MONSTER:
case TELEDEST:
- case RESPAWNPOINT:
- case BOX:
- case BARREL:
- case PLATFORM:
- case ELEVATOR:
e.attr1 = (int(e.attr1)+180)%360;
break;
}
- if(ver <= 31) switch(e.type)
- {
- case BOX:
- case BARREL:
- case PLATFORM:
- case ELEVATOR:
- int yaw = (int(e.attr1)%360 + 360)%360 + 7;
- e.attr1 = yaw - yaw%15;
- break;
- }
}
#ifndef STANDALONE
case I_HEALTH: case I_BOOST: case I_GREENARMOUR: case I_YELLOWARMOUR: case I_QUAD:
if(m_noitems) continue;
break;
- case CARROT: case RESPAWNPOINT:
- if(!m_classicsp) continue;
- break;
}
const char *mdl = entmdlname(i);
if(!mdl) continue;
int revs = 10;
switch(e.type)
{
- case CARROT:
- case RESPAWNPOINT:
- if(e.attr2) revs = 1;
- break;
case TELEPORT:
if(e.attr2 < 0) continue;
break;
if(ents.inrange(tp) && ents[tp]->type == TELEPORT)
{
extentity &e = *ents[tp];
- if(e.attr4 >= 0)
+ if(e.attr4 >= 0)
{
int snd = S_TELEPORT, flags = 0;
if(e.attr4 > 0) { snd = e.attr4; flags = SND_MAP; }
break;
}
- case RESPAWNPOINT:
- if(!m_classicsp || d!=player1 || n==respawnent) break;
- respawnent = n;
- conoutf(CON_GAMEINFO, "\f2respawn point set!");
- playsound(S_V_RESPAWNPOINT);
- break;
-
case JUMPPAD:
{
if(d->lastpickup==e->type && lastmillis-d->lastpickupmillis<300) break;
{
extentity &e = *ents[i];
if(e.type==NOTUSED) continue;
- if((!e.spawned() || e.nopickup()) && e.type!=TELEPORT && e.type!=JUMPPAD && e.type!=RESPAWNPOINT) continue;
+ if((!e.spawned() || e.nopickup()) && e.type!=TELEPORT && e.type!=JUMPPAD) continue;
float dist = e.o.dist(o);
if(dist<(e.type==TELEPORT ? 16 : 12)) trypickup(i, d);
}
extentity *e = ents[i];
if(e->type>=I_SHELLS && e->type<=I_QUAD && (!m_noammo || e->type<I_SHELLS || e->type>I_CARTRIDGES))
{
- e->setspawned(force || m_sp || !server::delayspawn(e->type));
+ e->setspawned(force || !server::delayspawn(e->type));
e->clearnopickup();
}
}
void setspawn(int i, bool on) { if(ents.inrange(i)) { extentity *e = ents[i]; e->setspawned(on); e->clearnopickup(); } }
- extentity *newentity() { return new fpsentity(); }
- void deleteentity(extentity *e) { delete (fpsentity *)e; }
+ extentity *newentity() { return new extentity(); }
+ void deleteentity(extentity *e) { delete e; }
void clearents()
{
while(ents.length()) deleteentity(ents.pop());
}
- enum
- {
- TRIG_COLLIDE = 1<<0,
- TRIG_TOGGLE = 1<<1,
- TRIG_ONCE = 0<<2,
- TRIG_MANY = 1<<2,
- TRIG_DISAPPEAR = 1<<3,
- TRIG_AUTO_RESET = 1<<4,
- TRIG_RUMBLE = 1<<5,
- TRIG_LOCKED = 1<<6,
- TRIG_ENDSP = 1<<7
- };
-
- static const int NUMTRIGGERTYPES = 32;
-
- static const int triggertypes[NUMTRIGGERTYPES] =
- {
- -1,
- TRIG_ONCE, // 1
- TRIG_RUMBLE, // 2
- TRIG_TOGGLE, // 3
- TRIG_TOGGLE | TRIG_RUMBLE, // 4
- TRIG_MANY, // 5
- TRIG_MANY | TRIG_RUMBLE, // 6
- TRIG_MANY | TRIG_TOGGLE, // 7
- TRIG_MANY | TRIG_TOGGLE | TRIG_RUMBLE, // 8
- TRIG_COLLIDE | TRIG_TOGGLE | TRIG_RUMBLE, // 9
- TRIG_COLLIDE | TRIG_TOGGLE | TRIG_AUTO_RESET | TRIG_RUMBLE, // 10
- TRIG_COLLIDE | TRIG_TOGGLE | TRIG_LOCKED | TRIG_RUMBLE, // 11
- TRIG_DISAPPEAR, // 12
- TRIG_DISAPPEAR | TRIG_RUMBLE, // 13
- TRIG_DISAPPEAR | TRIG_COLLIDE | TRIG_LOCKED, // 14
- -1 /* reserved 15 */,
- -1 /* reserved 16 */,
- -1 /* reserved 17 */,
- -1 /* reserved 18 */,
- -1 /* reserved 19 */,
- -1 /* reserved 20 */,
- -1 /* reserved 21 */,
- -1 /* reserved 22 */,
- -1 /* reserved 23 */,
- -1 /* reserved 24 */,
- -1 /* reserved 25 */,
- -1 /* reserved 26 */,
- -1 /* reserved 27 */,
- -1 /* reserved 28 */,
- TRIG_DISAPPEAR | TRIG_RUMBLE | TRIG_ENDSP, // 29
- -1 /* reserved 30 */,
- -1 /* reserved 31 */,
- };
-
- #define validtrigger(type) (triggertypes[(type) & (NUMTRIGGERTYPES-1)]>=0)
- #define checktriggertype(type, flag) (triggertypes[(type) & (NUMTRIGGERTYPES-1)] & (flag))
-
- static inline void cleartriggerflags(extentity &e)
- {
- e.flags &= ~(EF_ANIM | EF_NOVIS | EF_NOSHADOW | EF_NOCOLLIDE);
- }
-
- static inline void setuptriggerflags(fpsentity &e)
- {
- cleartriggerflags(e);
- e.flags |= EF_ANIM;
- if(checktriggertype(e.attr3, TRIG_COLLIDE|TRIG_DISAPPEAR)) e.flags |= EF_NOSHADOW;
- if(!checktriggertype(e.attr3, TRIG_COLLIDE)) e.flags |= EF_NOCOLLIDE;
- switch(e.triggerstate)
- {
- case TRIGGERING:
- if(checktriggertype(e.attr3, TRIG_COLLIDE) && lastmillis-e.lasttrigger >= 500) e.flags |= EF_NOCOLLIDE;
- break;
- case TRIGGERED:
- if(checktriggertype(e.attr3, TRIG_COLLIDE)) e.flags |= EF_NOCOLLIDE;
- break;
- case TRIGGER_DISAPPEARED:
- e.flags |= EF_NOVIS | EF_NOCOLLIDE;
- break;
- }
- }
-
- void resettriggers()
- {
- loopv(ents)
- {
- fpsentity &e = *(fpsentity *)ents[i];
- if(e.type != ET_MAPMODEL || !validtrigger(e.attr3)) continue;
- e.triggerstate = TRIGGER_RESET;
- e.lasttrigger = 0;
- setuptriggerflags(e);
- }
- }
-
- void unlocktriggers(int tag, int oldstate = TRIGGER_RESET, int newstate = TRIGGERING)
- {
- loopv(ents)
- {
- fpsentity &e = *(fpsentity *)ents[i];
- if(e.type != ET_MAPMODEL || !validtrigger(e.attr3)) continue;
- if(e.attr4 == tag && e.triggerstate == oldstate && checktriggertype(e.attr3, TRIG_LOCKED))
- {
- if(newstate == TRIGGER_RESETTING && checktriggertype(e.attr3, TRIG_COLLIDE) && overlapsdynent(e.o, 20)) continue;
- e.triggerstate = newstate;
- e.lasttrigger = lastmillis;
- if(checktriggertype(e.attr3, TRIG_RUMBLE)) playsound(S_RUMBLE, &e.o);
- }
- }
- }
-
- ICOMMAND(trigger, "ii", (int *tag, int *state),
- {
- if(*state) unlocktriggers(*tag);
- else unlocktriggers(*tag, TRIGGERED, TRIGGER_RESETTING);
- });
-
- VAR(triggerstate, -1, 0, 1);
-
- void doleveltrigger(int trigger, int state)
- {
- defformatstring(aliasname, "level_trigger_%d", trigger);
- if(identexists(aliasname))
- {
- triggerstate = state;
- execident(aliasname);
- }
- }
-
- void checktriggers()
- {
- if(player1->state != CS_ALIVE) return;
- vec o = player1->feetpos();
- loopv(ents)
- {
- fpsentity &e = *(fpsentity *)ents[i];
- if(e.type != ET_MAPMODEL || !validtrigger(e.attr3)) continue;
- switch(e.triggerstate)
- {
- case TRIGGERING:
- case TRIGGER_RESETTING:
- if(lastmillis-e.lasttrigger>=1000)
- {
- if(e.attr4)
- {
- if(e.triggerstate == TRIGGERING) unlocktriggers(e.attr4);
- else unlocktriggers(e.attr4, TRIGGERED, TRIGGER_RESETTING);
- }
- if(checktriggertype(e.attr3, TRIG_DISAPPEAR)) e.triggerstate = TRIGGER_DISAPPEARED;
- else if(e.triggerstate==TRIGGERING && checktriggertype(e.attr3, TRIG_TOGGLE)) e.triggerstate = TRIGGERED;
- else e.triggerstate = TRIGGER_RESET;
- }
- setuptriggerflags(e);
- break;
- case TRIGGER_RESET:
- if(e.lasttrigger)
- {
- if(checktriggertype(e.attr3, TRIG_AUTO_RESET|TRIG_MANY|TRIG_LOCKED) && e.o.dist(o)-player1->radius>=(checktriggertype(e.attr3, TRIG_COLLIDE) ? 20 : 12))
- e.lasttrigger = 0;
- break;
- }
- else if(e.o.dist(o)-player1->radius>=(checktriggertype(e.attr3, TRIG_COLLIDE) ? 20 : 12)) break;
- else if(checktriggertype(e.attr3, TRIG_LOCKED))
- {
- if(!e.attr4) break;
- doleveltrigger(e.attr4, -1);
- e.lasttrigger = lastmillis;
- break;
- }
- e.triggerstate = TRIGGERING;
- e.lasttrigger = lastmillis;
- setuptriggerflags(e);
- if(checktriggertype(e.attr3, TRIG_RUMBLE)) playsound(S_RUMBLE, &e.o);
- if(checktriggertype(e.attr3, TRIG_ENDSP)) endsp(false);
- if(e.attr4) doleveltrigger(e.attr4, 1);
- break;
- case TRIGGERED:
- if(e.o.dist(o)-player1->radius<(checktriggertype(e.attr3, TRIG_COLLIDE) ? 20 : 12))
- {
- if(e.lasttrigger) break;
- }
- else if(checktriggertype(e.attr3, TRIG_AUTO_RESET))
- {
- if(lastmillis-e.lasttrigger<6000) break;
- }
- else if(checktriggertype(e.attr3, TRIG_MANY))
- {
- e.lasttrigger = 0;
- break;
- }
- else break;
- if(checktriggertype(e.attr3, TRIG_COLLIDE) && overlapsdynent(e.o, 20)) break;
- e.triggerstate = TRIGGER_RESETTING;
- e.lasttrigger = lastmillis;
- setuptriggerflags(e);
- if(checktriggertype(e.attr3, TRIG_RUMBLE)) playsound(S_RUMBLE, &e.o);
- if(checktriggertype(e.attr3, TRIG_ENDSP)) endsp(false);
- if(e.attr4) doleveltrigger(e.attr4, 0);
- break;
- }
- }
- }
-
- void animatemapmodel(const extentity &e, int &anim, int &basetime)
- {
- const fpsentity &f = (const fpsentity &)e;
- if(validtrigger(f.attr3)) switch(f.triggerstate)
- {
- case TRIGGER_RESET: anim = ANIM_TRIGGER|ANIM_START; break;
- case TRIGGERING: anim = ANIM_TRIGGER; basetime = f.lasttrigger; break;
- case TRIGGERED: anim = ANIM_TRIGGER|ANIM_END; break;
- case TRIGGER_RESETTING: anim = ANIM_TRIGGER|ANIM_REVERSE; basetime = f.lasttrigger; break;
- }
- }
-
void fixentity(extentity &e)
{
- switch(e.type)
- {
- case FLAG:
- case BOX:
- case BARREL:
- case PLATFORM:
- case ELEVATOR:
- e.attr5 = e.attr4;
- e.attr4 = e.attr3;
- case TELEDEST:
- e.attr3 = e.attr2;
- case MONSTER:
- e.attr2 = e.attr1;
- case RESPAWNPOINT:
- e.attr1 = (int)player1->yaw;
- break;
- }
+ if(e.type == TELEDEST) e.attr3 = e.attr2;
}
void entradius(extentity &e, bool color)
renderentarrow(e, vec((int)(char)e.attr3*10.0f, (int)(char)e.attr2*10.0f, e.attr1*12.5f).normalize(), 4);
break;
- case FLAG:
- case MONSTER:
- case TELEDEST:
- case RESPAWNPOINT:
- case BOX:
- case BARREL:
- case PLATFORM:
- case ELEVATOR:
- {
- vec dir;
- vecfromyawpitch(e.attr1, 0, 1, 0, dir);
- renderentarrow(e, dir, 4);
- break;
- }
- case MAPMODEL:
- if(validtrigger(e.attr3)) renderentring(e, checktriggertype(e.attr3, TRIG_COLLIDE) ? 20 : 12);
- break;
+ default: break;
}
}
"shells", "bullets", "rockets", "riflerounds", "grenades", "cartridges",
"health", "healthboost", "greenarmour", "yellowarmour", "quaddamage",
"teleport", "teledest",
- "monster", "carrot", "jumppad",
- "base", "respawnpoint",
- "box", "barrel",
- "platform", "elevator",
- "flag",
+ "jumppad",
"", "", "", "",
};
return i>=0 && size_t(i)<sizeof(entnames)/sizeof(entnames[0]) ? entnames[i] : "";
void editent(int i, bool local)
{
extentity &e = *ents[i];
- if(e.type == ET_MAPMODEL && validtrigger(e.attr3))
- {
- fpsentity &f = (fpsentity &)e;
- f.triggerstate = TRIGGER_RESET;
- f.lasttrigger = 0;
- setuptriggerflags(f);
- }
- else cleartriggerflags(e);
if(local) addmsg(N_EDITENT, "rii3ii5", i, (int)(e.o.x*DMF), (int)(e.o.y*DMF), (int)(e.o.z*DMF), e.type, e.attr1, e.attr2, e.attr3, e.attr4, e.attr5);
}
- float dropheight(entity &e)
- {
- if(e.type==BASE || e.type==FLAG) return 0.0f;
- return 4.0f;
- }
#endif
}
void resetgamestate()
{
- if(m_classicsp)
- {
- clearmovables();
- clearmonsters(); // all monsters back at their spawns for editing
- entities::resettriggers();
- }
clearprojectiles();
clearbouncers();
}
}
}
- VARFP(slowmosp, 0, 0, 1, { if(m_sp && !slowmosp) server::forcegamespeed(100); });
-
void checkslowmo()
{
static int lastslowmohealth = 0;
ai::update();
moveragdolls();
gets2c();
- updatemovables(curtime);
- updatemonsters(curtime);
if(connected)
{
if(player1->state == CS_DEAD)
moveplayer(player1, 10, true);
swayhudgun(curtime);
entities::checkitems(player1);
- if(m_sp)
- {
- if(slowmosp) checkslowmo();
- if(m_classicsp) entities::checktriggers();
- }
- else if(cmode) cmode->checkitems(player1);
+ if(cmode) cmode->checkitems(player1);
}
}
if(player1->clientnum>=0) c2sinfo(); // do this last, to reduce the effective frame lag
void pickgamespawn(fpsent *d)
{
- int ent = m_classicsp && d == player1 && respawnent >= 0 ? respawnent : -1;
+ int ent = d == player1 && respawnent >= 0 ? respawnent : -1;
int tag = cmode ? cmode->getspawngroup(d) : 0;
findplayerspawn(d, ent, tag);
}
return;
}
if(lastmillis < player1->lastpain + spawnwait) return;
- if(m_dmsp) { changemap(clientmap, gamemode); return; } // if we die in SP we try the same map again
respawnself();
- if(m_classicsp)
- {
- conoutf(CON_GAMEINFO, "\f2You wasted another life! The monsters stole your armour and some ammo...");
- loopi(NUMGUNS) if(i!=GUN_PISTOL && (player1->ammo[i] = savedammo[i]) > 5) player1->ammo[i] = max(player1->ammo[i]/3, 5);
- }
}
}
COMMAND(respawn, "");
}
damageeffect(damage, d, d!=h);
- ai::damaged(d, actor);
-
- if(m_sp && slowmosp && d==player1 && d->health < 1) d->health = 1;
+ ai::damaged(d, actor);
if(d->health<=0) { if(local) killed(d, actor); }
else if(d==h) playsound(S_PAIN6);
if(cmode) cmode->gameover();
conoutf(CON_GAMEINFO, "\f2intermission:");
conoutf(CON_GAMEINFO, "\f2game has ended!");
- if(m_ctf) conoutf(CON_GAMEINFO, "\f2player frags: %d, flags: %d, deaths: %d", player1->frags, player1->flags, player1->deaths);
- else if(m_collect) conoutf(CON_GAMEINFO, "\f2player frags: %d, skulls: %d, deaths: %d", player1->frags, player1->flags, player1->deaths);
- else conoutf(CON_GAMEINFO, "\f2player frags: %d, deaths: %d", player1->frags, player1->deaths);
+ conoutf(CON_GAMEINFO, "\f2player frags: %d, deaths: %d", player1->frags, player1->deaths);
int accuracy = (player1->totaldamage*100)/max(player1->totalshots, 1);
conoutf(CON_GAMEINFO, "\f2player total damage dealt: %d, damage wasted: %d, accuracy(%%): %d", player1->totaldamage, player1->totalshots-player1->totaldamage, accuracy);
- if(m_sp) spsummary(accuracy);
showscores(true);
disablezoom();
void initclient()
{
player1 = spawnstate(new fpsent);
- filtertext(player1->name, "unnamed", false, false, MAXNAMELEN);
+ filtertext(player1->name, "Anonymous", false, false, MAXNAMELEN);
players.add(player1);
}
void startgame()
{
- clearmovables();
- clearmonsters();
-
clearprojectiles();
clearbouncers();
clearragdolls();
conoutf(CON_GAMEINFO, "\f2game mode is %s", server::modename(gamemode));
- if(m_sp)
- {
- defformatstring(scorename, "bestscore_%s", getclientmap());
- const char *best = getalias(scorename);
- if(*best) conoutf(CON_GAMEINFO, "\f2try to beat your best score so far: %s", best);
- }
- else
- {
- const char *info = m_valid(gamemode) ? gamemodes[gamemode - STARTGAMEMODE].info : NULL;
- if(showmodeinfo && info) conoutf(CON_GAMEINFO, "\f0%s", info);
- }
-
- if(player1->playermodel != playermodel) switchplayermodel(playermodel);
+ const char *info = m_valid(gamemode) ? gamemodes[gamemode - STARTGAMEMODE].info : NULL;
+ if(showmodeinfo && info) conoutf(CON_GAMEINFO, "\f0%s", info);
showscores(false);
disablezoom();
void dynentcollide(physent *d, physent *o, const vec &dir)
{
- switch(d->type)
- {
- case ENT_AI: if(dir.z > 0) stackmonster((monster *)d, o); break;
- case ENT_INANIMATE: if(dir.z > 0) stackmovable((movable *)d, o); break;
- }
+ return;
}
void msgsound(int n, physent *d)
}
}
- int numdynents() { return players.length()+monsters.length()+movables.length(); }
+ int numdynents() { return players.length(); }
dynent *iterdynents(int i)
{
if(i<players.length()) return players[i];
i -= players.length();
- if(i<monsters.length()) return (dynent *)monsters[i];
- i -= monsters.length();
- if(i<movables.length()) return (dynent *)movables[i];
return NULL;
}
if(pl->suicided!=seq) { addmsg(N_SUICIDE, "rc", pl); pl->suicided = seq; }
}
}
- else if(d->type==ENT_AI) suicidemonster((monster *)d);
- else if(d->type==ENT_INANIMATE) suicidemovable((movable *)d);
}
ICOMMAND(suicide, "", (), suicide(player1));
- bool needminimap() { return m_ctf || m_protect || m_hold || m_capture || m_collect; }
-
void drawicon(int icon, float x, float y, float sz)
{
settexture("packages/hud/items.png");
if(ammobar) drawammobar(w, h, d);
}
- if(!m_edit && !m_sp)
+ if(!m_edit)
{
if(gameclock) drawgameclock(w, h);
if(hudscore) drawhudscore(w, h);
I_QUAD,
TELEPORT, // attr1 = idx, attr2 = model, attr3 = tag
TELEDEST, // attr1 = angle, attr2 = idx
- MONSTER, // attr1 = angle, attr2 = monstertype
- CARROT, // attr1 = tag, attr2 = type
JUMPPAD, // attr1 = zpush, attr2 = ypush, attr3 = xpush
- BASE,
- RESPAWNPOINT,
- BOX, // attr1 = angle, attr2 = idx, attr3 = weight
- BARREL, // attr1 = angle, attr2 = idx, attr3 = weight, attr4 = health
- PLATFORM, // attr1 = angle, attr2 = idx, attr3 = tag, attr4 = speed
- ELEVATOR, // attr1 = angle, attr2 = idx, attr3 = tag, attr4 = speed
- FLAG, // attr1 = angle, attr2 = team
MAXENTTYPES
};
-enum
-{
- TRIGGER_RESET = 0,
- TRIGGERING,
- TRIGGERED,
- TRIGGER_RESETTING,
- TRIGGER_DISAPPEARED
-};
-
-struct fpsentity : extentity
-{
- int triggerstate, lasttrigger;
-
- fpsentity() : triggerstate(TRIGGER_RESET), lasttrigger(0) {}
-};
-
-enum { GUN_FIST = 0, GUN_SG, GUN_CG, GUN_RL, GUN_RIFLE, GUN_GL, GUN_PISTOL, GUN_FIREBALL, GUN_ICEBALL, GUN_SLIMEBALL, GUN_BITE, GUN_BARREL, NUMGUNS };
+enum { GUN_FIST = 0, GUN_SG, GUN_CG, GUN_RL, GUN_RIFLE, GUN_GL, GUN_PISTOL, NUMGUNS };
enum { A_BLUE, A_GREEN, A_YELLOW }; // armour types... take 20/40/60 % off
-enum { M_NONE = 0, M_SEARCH, M_HOME, M_ATTACKING, M_PAIN, M_SLEEP, M_AIMING }; // monster states
enum
{
M_NOAMMO = 1<<2,
M_INSTA = 1<<3,
M_EFFICIENCY = 1<<4,
- M_TACTICS = 1<<5,
- M_CAPTURE = 1<<6,
- M_REGEN = 1<<7,
- M_CTF = 1<<8,
- M_PROTECT = 1<<9,
- M_HOLD = 1<<10,
M_EDIT = 1<<12,
M_DEMO = 1<<13,
M_LOCAL = 1<<14,
- M_LOBBY = 1<<15,
- M_DMSP = 1<<16,
- M_CLASSICSP = 1<<17,
- M_SLOWMO = 1<<18,
- M_COLLECT = 1<<19
+ M_LOBBY = 1<<15
};
static struct gamemodeinfo
const char *info;
} gamemodes[] =
{
- { "SP", M_LOCAL | M_CLASSICSP, NULL },
- { "DMSP", M_LOCAL | M_DMSP, NULL },
{ "demo", M_DEMO | M_LOCAL, NULL},
{ "ffa", M_LOBBY, "Free For All: Collect items for ammo. Frag everyone to score points." },
{ "coop edit", M_EDIT, "Cooperative Editing: Edit maps with multiple players simultaneously." },
{ "insta team", M_NOITEMS | M_INSTA | M_TEAM, "Instagib Team: You spawn with full rifle ammo and die instantly from one shot. There are no items. Frag \fs\f3the enemy team\fr to score points for \fs\f1your team\fr." },
{ "efficiency", M_NOITEMS | M_EFFICIENCY, "Efficiency: You spawn with all weapons and armour. There are no items. Frag everyone to score points." },
{ "effic team", M_NOITEMS | M_EFFICIENCY | M_TEAM, "Efficiency Team: You spawn with all weapons and armour. There are no items. Frag \fs\f3the enemy team\fr to score points for \fs\f1your team\fr." },
- { "tactics", M_NOITEMS | M_TACTICS, "Tactics: You spawn with two random weapons and armour. There are no items. Frag everyone to score points." },
- { "tac team", M_NOITEMS | M_TACTICS | M_TEAM, "Tactics Team: You spawn with two random weapons and armour. There are no items. Frag \fs\f3the enemy team\fr to score points for \fs\f1your team\fr." },
- { "capture", M_NOAMMO | M_TACTICS | M_CAPTURE | M_TEAM, "Capture: Capture neutral bases or steal \fs\f3enemy bases\fr by standing next to them. \fs\f1Your team\fr scores points for every 10 seconds it holds a base. You spawn with two random weapons and armour. Collect extra ammo that spawns at \fs\f1your bases\fr. There are no ammo items." },
- { "regen capture", M_NOITEMS | M_CAPTURE | M_REGEN | M_TEAM, "Regen Capture: Capture neutral bases or steal \fs\f3enemy bases\fr by standing next to them. \fs\f1Your team\fr scores points for every 10 seconds it holds a base. Regenerate health and ammo by standing next to \fs\f1your bases\fr. There are no items." },
- { "ctf", M_CTF | M_TEAM, "Capture The Flag: Capture \fs\f3the enemy flag\fr and bring it back to \fs\f1your flag\fr to score points for \fs\f1your team\fr. Collect items for ammo." },
- { "insta ctf", M_NOITEMS | M_INSTA | M_CTF | M_TEAM, "Instagib Capture The Flag: Capture \fs\f3the enemy flag\fr and bring it back to \fs\f1your flag\fr to score points for \fs\f1your team\fr. You spawn with full rifle ammo and die instantly from one shot. There are no items." },
- { "protect", M_CTF | M_PROTECT | M_TEAM, "Protect The Flag: Touch \fs\f3the enemy flag\fr to score points for \fs\f1your team\fr. Pick up \fs\f1your flag\fr to protect it. \fs\f1Your team\fr loses points if a dropped flag resets. Collect items for ammo." },
- { "insta protect", M_NOITEMS | M_INSTA | M_CTF | M_PROTECT | M_TEAM, "Instagib Protect The Flag: Touch \fs\f3the enemy flag\fr to score points for \fs\f1your team\fr. Pick up \fs\f1your flag\fr to protect it. \fs\f1Your team\fr loses points if a dropped flag resets. You spawn with full rifle ammo and die instantly from one shot. There are no items." },
- { "hold", M_CTF | M_HOLD | M_TEAM, "Hold The Flag: Hold \fs\f7the flag\fr for 20 seconds to score points for \fs\f1your team\fr. Collect items for ammo." },
- { "insta hold", M_NOITEMS | M_INSTA | M_CTF | M_HOLD | M_TEAM, "Instagib Hold The Flag: Hold \fs\f7the flag\fr for 20 seconds to score points for \fs\f1your team\fr. You spawn with full rifle ammo and die instantly from one shot. There are no items." },
- { "effic ctf", M_NOITEMS | M_EFFICIENCY | M_CTF | M_TEAM, "Efficiency Capture The Flag: Capture \fs\f3the enemy flag\fr and bring it back to \fs\f1your flag\fr to score points for \fs\f1your team\fr. You spawn with all weapons and armour. There are no items." },
- { "effic protect", M_NOITEMS | M_EFFICIENCY | M_CTF | M_PROTECT | M_TEAM, "Efficiency Protect The Flag: Touch \fs\f3the enemy flag\fr to score points for \fs\f1your team\fr. Pick up \fs\f1your flag\fr to protect it. \fs\f1Your team\fr loses points if a dropped flag resets. You spawn with all weapons and armour. There are no items." },
- { "effic hold", M_NOITEMS | M_EFFICIENCY | M_CTF | M_HOLD | M_TEAM, "Efficiency Hold The Flag: Hold \fs\f7the flag\fr for 20 seconds to score points for \fs\f1your team\fr. You spawn with all weapons and armour. There are no items." },
- { "collect", M_COLLECT | M_TEAM, "Skull Collector: Frag \fs\f3the enemy team\fr to drop \fs\f3skulls\fr. Collect them and bring them to \fs\f3the enemy base\fr to score points for \fs\f1your team\fr or steal back \fs\f1your skulls\fr. Collect items for ammo." },
- { "insta collect", M_NOITEMS | M_INSTA | M_COLLECT | M_TEAM, "Instagib Skull Collector: Frag \fs\f3the enemy team\fr to drop \fs\f3skulls\fr. Collect them and bring them to \fs\f3the enemy base\fr to score points for \fs\f1your team\fr or steal back \fs\f1your skulls\fr. You spawn with full rifle ammo and die instantly from one shot. There are no items." },
- { "effic collect", M_NOITEMS | M_EFFICIENCY | M_COLLECT | M_TEAM, "Efficiency Skull Collector: Frag \fs\f3the enemy team\fr to drop \fs\f3skulls\fr. Collect them and bring them to \fs\f3the enemy base\fr to score points for \fs\f1your team\fr or steal back \fs\f1your skulls\fr. You spawn with all weapons and armour. There are no items." }
};
-#define STARTGAMEMODE (-3)
+#define STARTGAMEMODE (-1)
#define NUMGAMEMODES ((int)(sizeof(gamemodes)/sizeof(gamemodes[0])))
#define m_valid(mode) ((mode) >= STARTGAMEMODE && (mode) < STARTGAMEMODE + NUMGAMEMODES)
#define m_noitems (m_check(gamemode, M_NOITEMS))
#define m_noammo (m_check(gamemode, M_NOAMMO|M_NOITEMS))
#define m_insta (m_check(gamemode, M_INSTA))
-#define m_tactics (m_check(gamemode, M_TACTICS))
#define m_efficiency (m_check(gamemode, M_EFFICIENCY))
-#define m_capture (m_check(gamemode, M_CAPTURE))
-#define m_capture_only (m_checkonly(gamemode, M_CAPTURE, M_REGEN))
-#define m_regencapture (m_checkall(gamemode, M_CAPTURE | M_REGEN))
-#define m_ctf (m_check(gamemode, M_CTF))
-#define m_ctf_only (m_checkonly(gamemode, M_CTF, M_PROTECT | M_HOLD))
-#define m_protect (m_checkall(gamemode, M_CTF | M_PROTECT))
-#define m_hold (m_checkall(gamemode, M_CTF | M_HOLD))
-#define m_collect (m_check(gamemode, M_COLLECT))
#define m_teammode (m_check(gamemode, M_TEAM))
#define isteam(a,b) (m_teammode && strcmp(a, b)==0)
#define m_botmode (m_checknot(gamemode, M_DEMO|M_LOCAL))
#define m_mp(mode) (m_checknot(mode, M_LOCAL))
-#define m_sp (m_check(gamemode, M_DMSP | M_CLASSICSP))
-#define m_dmsp (m_check(gamemode, M_DMSP))
-#define m_classicsp (m_check(gamemode, M_CLASSICSP))
-
enum { MM_AUTH = -1, MM_OPEN = 0, MM_VETO, MM_LOCKED, MM_PRIVATE, MM_PASSWORD, MM_START = MM_AUTH };
static const char * const mastermodenames[] = { "auth", "open", "veto", "locked", "private", "password" };
S_PAIN1, S_PAIN2, S_PAIN3, S_PAIN4, S_PAIN5, S_PAIN6,
S_DIE1, S_DIE2,
S_FLAUNCH, S_FEXPLODE,
+ S_SPLASH1, S_SPLASH2,
S_JUMPPAD, S_PISTOL,
S_V_FIGHT,
N_TIMEUP, N_FORCEINTERMISSION,
N_SERVMSG, N_ITEMLIST, N_RESUME,
N_EDITMODE, N_EDITENT, N_EDITF, N_EDITT, N_EDITM, N_FLIP, N_COPY, N_PASTE, N_ROTATE, N_REPLACE, N_DELCUBE, N_REMIP, N_EDITVSLOT, N_UNDO, N_REDO, N_NEWMAP, N_GETMAP, N_SENDMAP, N_CLIPBOARD, N_EDITVAR,
- N_MASTERMODE, N_KICK, N_CLEARBANS, N_CURRENTMASTER, N_SPECTATOR, N_SETMASTER, N_SETTEAM,
- N_BASES, N_BASEINFO, N_BASESCORE, N_REPAMMO, N_BASEREGEN, N_ANNOUNCE,
+ N_MASTERMODE, N_KICK, N_CLEARBANS, N_CURRENTMASTER, N_SPECTATOR, N_SETMASTER, N_SETTEAM, N_ANNOUNCE,
N_LISTDEMOS, N_SENDDEMOLIST, N_GETDEMO, N_SENDDEMO,
N_DEMOPLAYBACK, N_RECORDDEMO, N_STOPDEMO, N_CLEARDEMOS,
- N_TAKEFLAG, N_RETURNFLAG, N_RESETFLAG, N_INVISFLAG, N_TRYDROPFLAG, N_DROPFLAG, N_SCOREFLAG, N_INITFLAGS,
N_SAYTEAM,
N_CLIENT,
N_AUTHTRY, N_AUTHKICK, N_AUTHCHAL, N_AUTHANS, N_REQAUTH,
N_TIMEUP, 2, N_FORCEINTERMISSION, 1,
N_SERVMSG, 0, N_ITEMLIST, 0, N_RESUME, 0,
N_EDITMODE, 2, N_EDITENT, 11, N_EDITF, 16, N_EDITT, 16, N_EDITM, 16, N_FLIP, 14, N_COPY, 14, N_PASTE, 14, N_ROTATE, 15, N_REPLACE, 17, N_DELCUBE, 14, N_REMIP, 1, N_EDITVSLOT, 16, N_UNDO, 0, N_REDO, 0, N_NEWMAP, 2, N_GETMAP, 1, N_SENDMAP, 0, N_EDITVAR, 0,
- N_MASTERMODE, 2, N_KICK, 0, N_CLEARBANS, 1, N_CURRENTMASTER, 0, N_SPECTATOR, 3, N_SETMASTER, 0, N_SETTEAM, 0,
- N_BASES, 0, N_BASEINFO, 0, N_BASESCORE, 0, N_REPAMMO, 1, N_BASEREGEN, 6, N_ANNOUNCE, 2,
+ N_MASTERMODE, 2, N_KICK, 0, N_CLEARBANS, 1, N_CURRENTMASTER, 0, N_SPECTATOR, 3, N_SETMASTER, 0, N_SETTEAM, 0, N_ANNOUNCE, 2,
N_LISTDEMOS, 1, N_SENDDEMOLIST, 0, N_GETDEMO, 3, N_SENDDEMO, 0,
N_DEMOPLAYBACK, 3, N_RECORDDEMO, 2, N_STOPDEMO, 1, N_CLEARDEMOS, 2,
- N_TAKEFLAG, 3, N_RETURNFLAG, 4, N_RESETFLAG, 6, N_INVISFLAG, 3, N_TRYDROPFLAG, 1, N_DROPFLAG, 7, N_SCOREFLAG, 10, N_INITFLAGS, 0,
N_SAYTEAM, 0,
N_CLIENT, 0,
N_AUTHTRY, 0, N_AUTHKICK, 0, N_AUTHCHAL, 0, N_AUTHANS, 0, N_REQAUTH, 0,
HICON_QUAD,
- HICON_RED_FLAG,
- HICON_BLUE_FLAG,
- HICON_NEUTRAL_FLAG,
-
HICON_TOKEN,
HICON_X = 20,
{20000, 30000, S_ITEMPUP, "Q", HICON_QUAD, -1},
};
-#define MAXRAYS 20
+#define MAXRAYS 12
#define EXP_SELFDAMDIV 2
#define EXP_SELFPUSH 2.5f
#define EXP_DISTSCALE 1.5f
static const struct guninfo { int sound, attackdelay, damage, spread, projspeed, kickamount, range, rays, hitpush, exprad, ttl; const char *name, *file; short part; } guns[NUMGUNS] =
{
- { S_PUNCH1, 250, 50, 0, 0, 0, 14, 1, 80, 0, 0, "fist", "fist", 0 },
- { S_SG, 1400, 10, 400, 0, 20, 1024, 20, 80, 0, 0, "shotgun", "shotg", 0 },
- { S_CG, 100, 30, 100, 0, 7, 1024, 1, 80, 0, 0, "chaingun", "chaing", 0 },
- { S_RLFIRE, 800, 120, 0, 320, 10, 1024, 1, 160, 40, 0, "rocketlauncher", "rocket", 0 },
- { S_RIFLE, 1500, 100, 0, 0, 30, 2048, 1, 80, 0, 0, "rifle", "rifle", 0 },
- { S_FLAUNCH, 600, 90, 0, 200, 10, 1024, 1, 250, 45, 1500, "grenadelauncher", "gl", 0 },
- { S_PISTOL, 500, 35, 50, 0, 7, 1024, 1, 80, 0, 0, "pistol", "pistol", 0 },
- { S_FLAUNCH, 200, 20, 0, 200, 1, 1024, 1, 80, 40, 0, "fireball", NULL, PART_FIREBALL1 },
- { S_ICEBALL, 200, 40, 0, 120, 1, 1024, 1, 80, 40, 0, "iceball", NULL, PART_FIREBALL2 },
- { S_SLIMEBALL, 200, 30, 0, 640, 1, 1024, 1, 80, 40, 0, "slimeball", NULL, PART_FIREBALL3 },
- { S_PIGR1, 250, 50, 0, 0, 1, 12, 1, 80, 0, 0, "bite", NULL, 0 },
- { -1, 0, 120, 0, 0, 0, 0, 1, 80, 40, 0, "barrel", NULL, 0 }
+ // delay| dmg| spr| spd| kck| rng| ray| pus| exp|
+ { S_PUNCH1, 100, 30, 0, 0, 0, 30, 1, 80, 0, 0, "fist", "fist", 0 },
+ { S_SG, 1000, 20, 280, 0, 20, 1024, MAXRAYS, 80, 0, 0, "shotgun", "shotg", 0 },
+ { S_CG, 100, 20, 70, 0, 10, 1024, 1, 80, 0, 0, "chaingun", "chaing", 0 },
+ { S_RLFIRE, 800, 120, 0, 270, 10, 1024, 1, 160, 40, 0, "rocketlauncher", "rocket", 0 },
+ { S_RIFLE, 1200, 120, 0, 0, 30, 2048, 1, 80, 0, 0, "rifle", "rifle", 0 },
+ { S_FLAUNCH, 600, 90, 0, 300, 20, 1024, 1, 250, 45, 1500, "grenadelauncher", "gl", 0 },
+ { S_PISTOL, 400, 60, 160, 0, 10, 1024, 1, 80, 0, 0, "pistol", "pistol", 0 },
};
#include "ai.h"
gunselect = GUN_RIFLE;
ammo[GUN_RIFLE] = 100;
}
- else if(m_regencapture)
- {
- extern int regenbluearmour;
- if(regenbluearmour)
- {
- armourtype = A_BLUE;
- armour = 25;
- }
- gunselect = GUN_PISTOL;
- ammo[GUN_PISTOL] = 40;
- ammo[GUN_GL] = 1;
- }
- else if(m_tactics)
- {
- armourtype = A_GREEN;
- armour = 100;
- ammo[GUN_PISTOL] = 40;
- int spawngun1 = rnd(5)+1, spawngun2;
- gunselect = spawngun1;
- baseammo(spawngun1, m_noitems ? 2 : 1);
- do spawngun2 = rnd(5)+1; while(spawngun1==spawngun2);
- baseammo(spawngun2, m_noitems ? 2 : 1);
- if(m_noitems) ammo[GUN_GL] += 1;
- }
else if(m_efficiency)
{
armourtype = A_GREEN;
gunselect = GUN_CG;
ammo[GUN_CG] /= 2;
}
- else if(m_ctf || m_collect)
- {
- armourtype = A_BLUE;
- armour = 50;
- ammo[GUN_PISTOL] = 40;
- ammo[GUN_GL] = 1;
- }
- else if(m_sp)
- {
- if(m_dmsp)
- {
- armourtype = A_BLUE;
- armour = 25;
- }
- ammo[GUN_PISTOL] = 80;
- ammo[GUN_GL] = 1;
- }
else
{
armourtype = A_BLUE;
extern void preloadentities();
extern void renderentities();
- extern void resettriggers();
- extern void checktriggers();
extern void checkitems(fpsent *d);
extern void checkquad(int time, fpsent *d);
extern void resetspawns();
extern bool addmsg(int type, const char *fmt = NULL, ...);
extern void switchname(const char *name);
extern void switchteam(const char *name);
- extern void switchplayermodel(int playermodel);
extern void sendmapinfo();
extern void stopdemo();
extern void changemap(const char *name, int mode);
extern void c2sinfo(bool force = false);
extern void sendposition(fpsent *d, bool reliable = false);
- // monster
- struct monster;
- extern vector<monster *> monsters;
-
- extern void clearmonsters();
- extern void preloadmonsters();
- extern void stackmonster(monster *d, physent *o);
- extern void updatemonsters(int curtime);
- extern void rendermonsters();
- extern void suicidemonster(monster *m);
- extern void hitmonster(int damage, monster *m, fpsent *at, const vec &vel, int gun);
- extern void monsterkilled();
- extern void endsp(bool allkilled);
- extern void spsummary(int accuracy);
-
- // movable
- struct movable;
- extern vector<movable *> movables;
-
- extern void clearmovables();
- extern void stackmovable(movable *d, physent *o);
- extern void updatemovables(int curtime);
- extern void rendermovables();
- extern void suicidemovable(movable *m);
- extern void hitmovable(int damage, movable *m, fpsent *at, const vec &vel, int gun);
-
// weapon
extern int getweapon(const char *name);
extern void shoot(fpsent *d, const vec &targ);
extern void saveragdoll(fpsent *d);
extern void clearragdolls();
extern void moveragdolls();
- extern void changedplayermodel();
extern const playermodelinfo &getplayermodelinfo(fpsent *d);
- extern int chooserandomplayermodel(int seed);
extern void swayhudgun(int curtime);
extern vec hudgunorigin(int gun, const vec &from, const vec &to, fpsent *d);
}
extern float gatherspawninfos(dynent *d, int tag, vector<spawninfo> &spawninfos);
namespace game
-{
+{
vector<fpsent *> bestplayers;
vector<const char *> bestteams;
VARP(ragdoll, 0, 1, 1);
VARP(ragdollmillis, 0, 10000, 300000);
VARP(ragdollfade, 0, 1000, 300000);
- VARFP(playermodel, 0, 0, 4, changedplayermodel());
- VARP(forceplayermodels, 0, 0, 1);
+ VARP(playermodel, 0, 0, 0);
VARP(hidedead, 0, 0, 2);
vector<fpsent *> ragdolls;
r->attackchan = r->idlechan = -1;
if(d==player1) r->playermodel = playermodel;
ragdolls.add(r);
- d->ragdoll = NULL;
+ d->ragdoll = NULL;
}
void clearragdolls()
}
}
- static const playermodelinfo playermodels[5] =
+ static const playermodelinfo playermodels[1] =
{
{ "mrfixit", "mrfixit/blue", "mrfixit/red", "mrfixit/hudguns", NULL, "mrfixit/horns", { "mrfixit/armor/blue", "mrfixit/armor/green", "mrfixit/armor/yellow" }, "mrfixit", "mrfixit_blue", "mrfixit_red", true },
- { "snoutx10k", "snoutx10k/blue", "snoutx10k/red", "snoutx10k/hudguns", NULL, "snoutx10k/wings", { "snoutx10k/armor/blue", "snoutx10k/armor/green", "snoutx10k/armor/yellow" }, "snoutx10k", "snoutx10k_blue", "snoutx10k_red", true },
- //{ "ogro/green", "ogro/blue", "ogro/red", "mrfixit/hudguns", "ogro/vwep", NULL, { NULL, NULL, NULL }, "ogro", "ogro_blue", "ogro_red", false },
- { "ogro2", "ogro2/blue", "ogro2/red", "mrfixit/hudguns", NULL, "ogro2/quad", { "ogro2/armor/blue", "ogro2/armor/green", "ogro2/armor/yellow" }, "ogro", "ogro_blue", "ogro_red", true },
- { "inky", "inky/blue", "inky/red", "inky/hudguns", NULL, "inky/quad", { "inky/armor/blue", "inky/armor/green", "inky/armor/yellow" }, "inky", "inky_blue", "inky_red", true },
- { "captaincannon", "captaincannon/blue", "captaincannon/red", "captaincannon/hudguns", NULL, "captaincannon/quad", { "captaincannon/armor/blue", "captaincannon/armor/green", "captaincannon/armor/yellow" }, "captaincannon", "captaincannon_blue", "captaincannon_red", true }
};
- int chooserandomplayermodel(int seed)
- {
- return (seed&0xFFFF)%(sizeof(playermodels)/sizeof(playermodels[0]));
- }
-
const playermodelinfo *getplayermodelinfo(int n)
{
- if(size_t(n) >= sizeof(playermodels)/sizeof(playermodels[0])) return NULL;
- return &playermodels[n];
+ (void) n;
+ return &playermodels[0];
}
const playermodelinfo &getplayermodelinfo(fpsent *d)
{
- const playermodelinfo *mdl = getplayermodelinfo(d==player1 || forceplayermodels ? playermodel : d->playermodel);
+ const playermodelinfo *mdl = getplayermodelinfo(0);
if(!mdl) mdl = getplayermodelinfo(playermodel);
return *mdl;
}
- void changedplayermodel()
- {
- if(player1->clientnum < 0) player1->playermodel = playermodel;
- if(player1->ragdoll) cleanragdoll(player1);
- loopv(ragdolls)
- {
- fpsent *d = ragdolls[i];
- if(!d->ragdoll) continue;
- if(!forceplayermodels)
- {
- const playermodelinfo *mdl = getplayermodelinfo(d->playermodel);
- if(mdl) continue;
- }
- cleanragdoll(d);
- }
- loopv(players)
- {
- fpsent *d = players[i];
- if(d == player1 || !d->ragdoll) continue;
- if(!forceplayermodels)
- {
- const playermodelinfo *mdl = getplayermodelinfo(d->playermodel);
- if(mdl) continue;
- }
- cleanragdoll(d);
- }
- }
-
void preloadplayermodel()
{
- loopi(sizeof(playermodels)/sizeof(playermodels[0]))
+ const playermodelinfo *mdl = getplayermodelinfo(0);
+ if(m_teammode)
{
- const playermodelinfo *mdl = getplayermodelinfo(i);
- if(!mdl) break;
- if(i != playermodel && (!multiplayer(false) || forceplayermodels)) continue;
- if(m_teammode)
- {
- preloadmodel(mdl->blueteam);
- preloadmodel(mdl->redteam);
- }
- else preloadmodel(mdl->ffa);
- if(mdl->vwep) preloadmodel(mdl->vwep);
- if(mdl->quad) preloadmodel(mdl->quad);
- loopj(3) if(mdl->armour[j]) preloadmodel(mdl->armour[j]);
+ preloadmodel(mdl->blueteam);
+ preloadmodel(mdl->redteam);
}
+ else preloadmodel(mdl->ffa);
+ if(mdl->vwep) preloadmodel(mdl->vwep);
+ if(mdl->quad) preloadmodel(mdl->quad);
+ loopj(3) if(mdl->armour[j]) preloadmodel(mdl->armour[j]);
}
-
+
VAR(testquad, 0, 0, 1);
VAR(testarmour, 0, 0, 1);
VAR(testteam, 0, 0, 3);
case 2: mdlname = mdl.redteam; break;
}
renderclient(d, mdlname, a[0].tag ? a : NULL, hold, attack, delay, lastaction, intermission && d->state!=CS_DEAD ? 0 : d->lastpain, fade, ragdoll && mdl.ragdoll);
-#if 0
- if(d->state!=CS_DEAD && d->quadmillis)
- {
- entitylight light;
- rendermodel(&light, "quadrings", ANIM_MAPMODEL|ANIM_LOOP, vec(d->o).sub(vec(0, 0, d->eyeheight/2)), 360*lastmillis/1000.0f, 0, MDL_DYNSHADOW | MDL_CULL_VFC | MDL_CULL_DIST);
- }
-#endif
}
VARP(teamskins, 0, 0, 1);
int team = 0;
if(teamskins || m_teammode) team = isteam(player1->team, d->team) ? 1 : 2;
float fade = 1.0f;
- if(ragdollmillis && ragdollfade)
+ if(ragdollmillis && ragdollfade)
fade -= clamp(float(lastmillis - (d->lastupdate + max(ragdollmillis - ragdollfade, 0)))/min(ragdollmillis, ragdollfade), 0.0f, 1.0f);
renderplayer(d, getplayermodelinfo(d), team, fade, mainpass);
- }
+ }
if(isthirdperson() && !followingplayer() && (player1->state!=CS_DEAD || hidedead != 1)) renderplayer(player1, getplayermodelinfo(player1), teamskins || m_teammode ? 1 : 0, 1, mainpass);
- rendermonsters();
- rendermovables();
entities::renderentities();
renderbouncers();
renderprojectiles();
void drawhudgun()
{
fpsent *d = hudplayer();
- if(d->state==CS_SPECTATOR || d->state==CS_EDITING || !hudgun || editmode)
- {
+ if(d->state==CS_SPECTATOR || d->state==CS_EDITING || !hudgun || editmode)
+ {
d->muzzle = player1->muzzle = vec(-1, -1, -1);
return;
}
void preloadsounds()
{
- for(int i = S_JUMP; i <= S_SPLASH2; i++) preloadsound(i);
- for(int i = S_JUMPPAD; i <= S_PISTOL; i++) preloadsound(i);
- for(int i = S_V_BOOST; i <= S_V_QUAD10; i++) preloadsound(i);
- for(int i = S_BURN; i <= S_HIT; i++) preloadsound(i);
+ for(int i = S_JUMP; i <= S_HIT; i++) preloadsound(i);
}
void preload()
preloadplayermodel();
preloadsounds();
entities::preloadentities();
- if(m_sp) preloadmonsters();
}
}
else return false;
}
else if(b->state==CS_SPECTATOR) return true;
- if(m_ctf || m_collect)
- {
- if(a->flags > b->flags) return true;
- if(a->flags < b->flags) return false;
- }
if(a->frags > b->frags) return true;
if(a->frags < b->frags) return false;
return strcmp(a->name, b->name) < 0;
void setexceeded()
{
if(state.state==CS_ALIVE && !exceeded && !checkpushed(gamemillis, calcpushrange())) exceeded = gamemillis;
- scheduleexceeded();
+ scheduleexceeded();
}
-
+
void setpushed()
{
pushed = max(pushed, gamemillis);
if(exceeded && checkpushed(exceeded, calcpushrange())) exceeded = 0;
}
-
+
bool checkexceeded()
{
return state.state==CS_ALIVE && exceeded && gamemillis > exceeded + calcpushrange();
if(getclientip(c.clientnum) == ip) disconnect_client(c.clientnum, DISC_KICK);
}
}
-
+
struct maprotation
{
static int exclude;
int modes;
string map;
-
+
int calcmodemask() const { return modes&(1<<NUMGAMEMODES) ? modes & ~exclude : modes; }
bool hasmode(int mode, int offset = STARTGAMEMODE) const { return (calcmodemask() & (1 << (mode-offset))) != 0; }
for(; *h && *n; h++)
{
if(*h == *n) n++;
- else if(*h != ' ') break;
+ else if(*h != ' ') break;
}
if(!*n) return true;
if(*n == '.') return !*h;
}
return modemask;
}
-
+
bool addmaprotation(int modemask, const char *map)
{
if(!map[0]) loopk(NUMGAMEMODES) if(modemask&(1<<k) && !m_check(k+STARTGAMEMODE, M_EDIT)) modemask &= ~(1<<k);
copystring(rot.map, map);
return true;
}
-
+
void addmaprotations(tagval *args, int numargs)
{
vector<char *> modes, maps;
rot.map[0] = '\0';
}
}
-
+
COMMAND(maprotationreset, "");
COMMANDN(maprotation, addmaprotations, "ss2V");
teamkillkick &kick = teamkillkicks.add();
kick.modes = genmodemask(modes);
kick.limit = *limit;
- kick.ban = *ban > 0 ? *ban*60000 : (*ban < 0 ? 0 : 30*60000);
+ kick.ban = *ban > 0 ? *ban*60000 : (*ban < 0 ? 0 : 30*60000);
modes.deletearrays();
}
if(!m_timed || actor->state.aitype != AI_NONE || actor->local || actor->privilege || (victim && victim->state.aitype != AI_NONE)) return;
shouldcheckteamkills = true;
uint ip = getclientip(actor->clientnum);
- loopv(teamkills) if(teamkills[i].ip == ip)
- {
+ loopv(teamkills) if(teamkills[i].ip == ip)
+ {
teamkills[i].teamkills += n;
return;
}
int numclients(int exclude = -1, bool nospec = true, bool noai = true, bool priv = false)
{
int n = 0;
- loopv(clients)
+ loopv(clients)
{
clientinfo *ci = clients[i];
if(ci->clientnum!=exclude && (!nospec || ci->state.state!=CS_SPECTATOR || (priv && (ci->privilege || ci->local))) && (!noai || ci->state.aitype == AI_NONE)) n++;
};
#define SERVMODE 1
- #include "capture.h"
- #include "ctf.h"
- #include "collect.h"
-
- captureservmode capturemode;
- ctfservmode ctfmode;
- collectservmode collectmode;
servmode *smode = NULL;
bool canspawnitem(int type) { return !m_noitems && (type>=I_SHELLS && type<=I_QUAD && (!m_noammo || type<I_SHELLS || type>I_CARTRIDGES)); }
int spawntime(int type)
{
- if(m_classicsp) return INT_MAX;
int np = numclients(-1, true, false);
np = np<3 ? 4 : (np>4 ? 2 : 3); // spawn times are dependent on number of players
int sec = 0;
{
case I_GREENARMOUR:
case I_YELLOWARMOUR:
- return !m_classicsp;
case I_BOOST:
case I_QUAD:
return true;
return false;
}
}
-
+
bool pickup(int i, int sender) // server side item pickup, acknowledge first client that gets it
{
if((m_timed && gamemillis>=gamelimit) || !sents.inrange(i) || !sents[i].spawned) return false;
loopi(n) delete[] demos[i].data;
demos.remove(0, n);
}
-
+
void adddemo()
{
if(!demotmp) return;
demotmp->read(d.data, len);
DELETEP(demotmp);
}
-
+
void enddemorecord()
{
if(!demorecord) return;
{
char *name;
char *desc;
-
+
userkey() : name(NULL), desc(NULL) {}
userkey(char *name, char *desc) : name(name), desc(desc) {}
};
if(wantpriv <= ci->privilege) return true;
else if(wantpriv <= PRIV_MASTER && !force)
{
- if(ci->state.state==CS_SPECTATOR)
+ if(ci->state.state==CS_SPECTATOR)
{
sendf(ci->clientnum, 1, "ris", N_SERVMSG, "Spectators may not claim master.");
return false;
allowedips.shrink(0);
}
string msg;
- if(val && authname)
+ if(val && authname)
{
if(authdesc && authdesc[0]) formatstring(msg, "%s claimed %s as '\fs\f5%s\fr' [\fs\f0%s\fr]", colorname(ci), name, authname, authdesc);
else formatstring(msg, "%s claimed %s as '\fs\f5%s\fr'", colorname(ci), name, authname);
- }
+ }
else formatstring(msg, "%s %s %s", colorname(ci), val ? "claimed" : "relinquished", name);
packetbuf p(MAXTRANS, ENET_PACKET_FLAG_RELIABLE);
putint(p, N_SERVMSG);
}
uchar operator[](int msg) const { return msg >= 0 && msg < NUMMSG ? msgmask[msg] : 0; }
- } msgfilter(-1, N_CONNECT, N_SERVINFO, N_INITCLIENT, N_WELCOME, N_MAPCHANGE, N_SERVMSG, N_DAMAGE, N_HITPUSH, N_SHOTFX, N_EXPLODEFX, N_DIED, N_SPAWNSTATE, N_FORCEDEATH, N_TEAMINFO, N_ITEMACC, N_ITEMSPAWN, N_TIMEUP, N_CDIS, N_CURRENTMASTER, N_PONG, N_RESUME, N_BASESCORE, N_BASEINFO, N_BASEREGEN, N_ANNOUNCE, N_SENDDEMOLIST, N_SENDDEMO, N_DEMOPLAYBACK, N_SENDMAP, N_DROPFLAG, N_SCOREFLAG, N_RETURNFLAG, N_RESETFLAG, N_INVISFLAG, N_CLIENT, N_AUTHCHAL, N_INITAI, N_EXPIRETOKENS, N_DROPTOKENS, N_STEALTOKENS, N_DEMOPACKET, -2, N_REMIP, N_NEWMAP, N_GETMAP, N_SENDMAP, N_CLIPBOARD, -3, N_EDITENT, N_EDITF, N_EDITT, N_EDITM, N_FLIP, N_COPY, N_PASTE, N_ROTATE, N_REPLACE, N_DELCUBE, N_EDITVAR, N_EDITVSLOT, N_UNDO, N_REDO, -4, N_POS, NUMMSG),
+ } msgfilter(-1, N_CONNECT, N_SERVINFO, N_INITCLIENT, N_WELCOME, N_MAPCHANGE, N_SERVMSG, N_DAMAGE, N_HITPUSH, N_SHOTFX, N_EXPLODEFX, N_DIED,
+ N_SPAWNSTATE, N_FORCEDEATH, N_TEAMINFO, N_ITEMACC, N_ITEMSPAWN, N_TIMEUP, N_CDIS, N_CURRENTMASTER, N_PONG, N_RESUME,
+ N_ANNOUNCE, N_SENDDEMOLIST, N_SENDDEMO, N_DEMOPLAYBACK, N_SENDMAP,
+ N_CLIENT, N_AUTHCHAL, N_INITAI, N_EXPIRETOKENS, N_DROPTOKENS, N_STEALTOKENS, N_DEMOPACKET, -2, N_REMIP,
+ N_NEWMAP, N_GETMAP, N_SENDMAP, N_CLIPBOARD, -3, N_EDITENT, N_EDITF, N_EDITT, N_EDITM, N_FLIP, N_COPY, N_PASTE, N_ROTATE, N_REPLACE,
+ N_DELCUBE, N_EDITVAR, N_EDITVSLOT, N_UNDO, N_REDO, -4, N_POS, NUMMSG),
connectfilter(-1, N_CONNECT, -2, N_AUTHANS, -3, N_PING, NUMMSG);
int checktype(int type, clientinfo *ci)
if(t.frags) { sendstring(t.team, p); putint(p, t.frags); }
);
sendstring("", p);
- }
+ }
if(ci)
{
putint(p, N_SETTEAM);
}
notgotitems = false;
}
-
+
void changemap(const char *s, int mode)
{
stopdemo();
sendf(-1, 1, "risii", N_MAPCHANGE, smapname, gamemode, 1);
- if(m_capture) smode = &capturemode;
- else if(m_ctf) smode = &ctfmode;
- else if(m_collect) smode = &collectmode;
- else smode = NULL;
+ smode = NULL;
clearteaminfo();
if(m_teammode) autoteam();
changemap("", 1);
return;
}
- if(next)
+ if(next)
{
curmaprotation = findmaprotation(gamemode, smapname);
if(curmaprotation >= 0) nextmaprotation();
maprotation &rot = maprotations[curmaprotation];
changemap(rot.map, rot.findmode(gamemode));
}
-
+
struct votecount
{
char *map;
void forcemap(const char *map, int mode)
{
stopdemo();
- if(!map[0] && !m_check(mode, M_EDIT))
+ if(!map[0] && !m_check(mode, M_EDIT))
{
int idx = findmaprotation(mode, smapname);
if(idx < 0 && smapname[0]) idx = findmaprotation(mode, "");
clientinfo *ci = getinfo(sender);
if(!ci || (ci->state.state==CS_SPECTATOR && !ci->privilege && !ci->local) || (!ci->local && !m_mp(reqmode))) return;
if(!m_valid(reqmode)) return;
- if(!map[0] && !m_check(reqmode, M_EDIT))
+ if(!map[0] && !m_check(reqmode, M_EDIT))
{
int idx = findmaprotation(reqmode, smapname);
if(idx < 0 && smapname[0]) idx = findmaprotation(reqmode, "");
if(idx < 0) return;
map = maprotations[idx].map;
}
- if(lockmaprotation && !ci->local && ci->privilege < (lockmaprotation > 1 ? PRIV_ADMIN : PRIV_MASTER) && findmaprotation(reqmode, map) < 0)
+ if(lockmaprotation && !ci->local && ci->privilege < (lockmaprotation > 1 ? PRIV_ADMIN : PRIV_MASTER) && findmaprotation(reqmode, map) < 0)
{
sendf(sender, 1, "ris", N_SERVMSG, "This server has locked the map rotation.");
return;
actor->state.effectiveness += fragvalue*friends/float(max(enemies, 1));
}
teaminfo *t = m_teammode ? teaminfos.access(actor->team) : NULL;
- if(t) t->frags += fragvalue;
+ if(t) t->frags += fragvalue;
sendf(-1, 1, "ri5", N_DIED, target->clientnum, actor->clientnum, actor->state.frags, t ? t->frags : 0);
target->position.setsize(0);
if(smode) smode->died(target, actor);
ts.state = CS_DEAD;
ts.lastdeath = gamemillis;
- if(actor!=target && isteam(actor->team, target->team))
+ if(actor!=target && isteam(actor->team, target->team))
{
actor->state.teamkills++;
addteamkill(actor, target, 1);
if(nextexceeded && gamemillis > nextexceeded && (!m_timed || gamemillis < gamelimit))
{
nextexceeded = 0;
- loopvrev(clients)
+ loopvrev(clients)
{
clientinfo &c = *clients[i];
if(c.state.aitype != AI_NONE) continue;
void clientdisconnect(int n)
{
clientinfo *ci = getinfo(n);
- loopv(clients) if(clients[i]->authkickvictim == ci->clientnum) clients[i]->cleanauth();
+ loopv(clients) if(clients[i]->authkickvictim == ci->clientnum) clients[i]->cleanauth();
if(ci->connected)
{
if(ci->privilege) setmaster(ci, false);
verifybans();
}
- } ipbans, gbans;
+ } ipbans, gbans;
bool checkbans(uint ip)
{
ICOMMAND(clearipbans, "", (), ipbans.clear());
ICOMMAND(ipban, "s", (const char *ipname), ipbans.add(ipname));
-
+
int allowconnect(clientinfo *ci, const char *pwd = "")
{
if(ci->local) return DISC_NONE;
if(ci->authkickvictim >= 0)
{
if(setmaster(ci, true, "", ci->authname, NULL, PRIV_AUTH, false, true))
- trykick(ci, ci->authkickvictim, ci->authkickreason, ci->authname, NULL, PRIV_AUTH);
+ trykick(ci, ci->authkickvictim, ci->authkickreason, ci->authname, NULL, PRIV_AUTH);
ci->cleanauthkick();
}
else setmaster(ci, true, "", ci->authname, NULL, PRIV_AUTH);
if(ci->authdesc[0])
{
userinfo *u = users.access(userkey(ci->authname, ci->authdesc));
- if(u)
+ if(u)
{
uint seed[3] = { ::hthash(serverauth) + detrnd(size_t(ci) + size_t(user) + size_t(desc), 0x10000), uint(totalmillis), randomMT() };
vector<char> buf;
bool answerchallenge(clientinfo *ci, uint id, char *val, const char *desc)
{
- if(ci->authreq != id || strcmp(ci->authdesc, desc))
+ if(ci->authreq != id || strcmp(ci->authdesc, desc))
{
ci->cleanauth();
return !ci->connectauth;
if(ci->authchallenge && checkchallenge(val, ci->authchallenge))
{
userinfo *u = users.access(userkey(ci->authname, ci->authdesc));
- if(u)
+ if(u)
{
if(ci->connectauth) connected(ci);
if(ci->authkickvictim >= 0)
else setmaster(ci, true, "", ci->authname, ci->authdesc, u->privilege);
}
}
- ci->cleanauth();
- }
+ ci->cleanauth();
+ }
else if(!requestmasterf("confauth %u %s\n", id, val))
{
ci->cleanauth();
loopvrev(clients)
{
clientinfo *ci = clients[i];
- if(ci->authreq) authfailed(ci);
+ if(ci->authreq) authfailed(ci);
}
}
{
getstring(text, p);
filtertext(text, text, false, false, MAXNAMELEN);
- if(!text[0]) copystring(text, "unnamed");
+ if(!text[0]) copystring(text, "Anonymous");
copystring(ci->name, text, MAXNAMELEN+1);
- ci->playermodel = getint(p);
+ ci->playermodel = 0;
string password, authdesc, authname;
getstring(password, p, sizeof(password));
getstring(desc, p, sizeof(desc));
uint id = (uint)getint(p);
getstring(ans, p, sizeof(ans));
- if(!answerchallenge(ci, id, ans, desc))
+ if(!answerchallenge(ci, id, ans, desc))
{
disconnect_client(sender, ci->connectauth);
return;
{
case N_POS:
{
- int pcn = getuint(p);
- p.get();
+ int pcn = getuint(p);
+ p.get();
uint flags = getuint(p);
clientinfo *cp = getinfo(pcn);
if(cp && pcn != sender && cp->ownernum != sender) cp = NULL;
if(cp && (!ci->local || demorecord || hasnonlocalclients()) && (cp->state.state==CS_ALIVE || cp->state.state==CS_EDITING))
{
flushclientposition(*cp);
- sendf(-1, 0, "ri4x", N_TELEPORT, pcn, teleport, teledest, cp->ownernum);
+ sendf(-1, 0, "ri4x", N_TELEPORT, pcn, teleport, teledest, cp->ownernum);
}
break;
}
}
break;
}
-
+
case N_FROMAI:
{
int qcn = getint(p);
hit.rays = getint(p);
loopk(3) hit.dir[k] = getint(p)/DNF;
}
- if(cq)
+ if(cq)
{
cq->addevent(shot);
cq->setpushed();
QUEUE_MSG;
getstring(text, p);
filtertext(ci->name, text, false, false, MAXNAMELEN);
- if(!ci->name[0]) copystring(ci->name, "unnamed");
+ if(!ci->name[0]) copystring(ci->name, "Anonymous");
QUEUE_STR(ci->name);
break;
}
case N_SWITCHMODEL:
{
- ci->playermodel = getint(p);
+ ci->playermodel = 0;
QUEUE_MSG;
break;
}
{
int val = getint(p);
if(ci->privilege < (restrictdemos ? PRIV_ADMIN : PRIV_MASTER) && !ci->local) break;
- if(!maxdemos || !maxdemosize)
+ if(!maxdemos || !maxdemosize)
{
sendf(ci->clientnum, 1, "ris", N_SERVMSG, "the server has disabled demo recording");
break;
{
ci->authkickvictim = victim;
ci->authkickreason = newstring(text);
- }
+ }
break;
}
case N_PASTE:
if(ci->state.state!=CS_SPECTATOR) sendclipboard(ci);
goto genericmsg;
-
+
case N_CLIPBOARD:
{
- int unpacklen = getint(p), packlen = getint(p);
+ int unpacklen = getint(p), packlen = getint(p);
ci->cleanclipboard(false);
if(ci->state.state==CS_SPECTATOR)
{
if(packlen > 0) p.subbuf(packlen);
break;
}
- if(packlen <= 0 || packlen > (1<<16) || unpacklen <= 0)
+ if(packlen <= 0 || packlen > (1<<16) || unpacklen <= 0)
{
if(packlen > 0) p.subbuf(packlen);
packlen = unpacklen = 0;
putint(q, N_CLIPBOARD);
putint(q, ci->clientnum);
putint(q, unpacklen);
- putint(q, packlen);
+ putint(q, packlen);
if(packlen > 0) p.get(q.subbuf(packlen).buf, packlen);
ci->clipboard = q.finalize();
ci->clipboard->referenceCount++;
break;
- }
+ }
case N_EDITT:
case N_REPLACE:
case N_SERVCMD:
getstring(text, p);
break;
-
- #define PARSEMESSAGES 1
- #include "capture.h"
- #include "ctf.h"
- #include "collect.h"
- #undef PARSEMESSAGES
+
case -1:
disconnect_client(sender, DISC_MSGERR);
extentity &e = *entities::ents[i];
switch(e.type)
{
- case PLAYERSTART: case TELEPORT: case JUMPPAD: case FLAG: case BASE:
+ case PLAYERSTART: case TELEPORT: case JUMPPAD:
addwaypoint(e.o);
break;
default:
namespace game
{
- static const int MONSTERDAMAGEFACTOR = 4;
static const int OFFSETMILLIS = 500;
vec rays[MAXRAYS];
vector<hitmsg> hits;
VARP(maxdebris, 10, 25, 1000);
- VARP(maxbarreldebris, 5, 10, 1000);
ICOMMAND(getweapon, "", (), intret(player1->gunselect));
loopi(guns[gun].rays) offsetray(from, to, guns[gun].spread, guns[gun].range, rays[i]);
}
- enum { BNC_GRENADE, BNC_GIBS, BNC_DEBRIS, BNC_BARRELDEBRIS };
+ enum { BNC_GRENADE, BNC_GIBS, BNC_DEBRIS };
struct bouncer : physent
{
if(bouncetype == BNC_GRENADE && offsetmillis > 0 && offset.z < 0)
offsetheight = raycube(vec(o.x + offset.x, o.y + offset.y, o.z), vec(0, 0, -1), -offset.z);
else offsetheight = -1;
- }
+ }
};
vector<bouncer *> bouncers;
switch(type)
{
case BNC_GRENADE: bnc.collidetype = COLLIDE_ELLIPSE_PRECISE; break;
- case BNC_DEBRIS: case BNC_BARRELDEBRIS: bnc.variant = rnd(4); break;
+ case BNC_DEBRIS: bnc.variant = rnd(4); break;
case BNC_GIBS: bnc.variant = rnd(3); break;
}
b->bounces++;
adddecal(DECAL_BLOOD, vec(b->o).sub(vec(surface).mul(b->radius)), surface, 2.96f/b->bounces, bvec(0x60, 0xFF, 0xFF), rnd(4));
}
-
+
void updatebouncers(int time)
{
loopv(bouncers)
lasthit = lastmillis;
}
- if(d->type==ENT_INANIMATE)
- {
- hitmovable(damage, (movable *)d, at, vel, gun);
- return;
- }
-
fpsent *f = (fpsent *)d;
f->lastpain = lastmillis;
if(f->type==ENT_AI || !m_mp(gamemode) || f==at) f->hitpush(damage, vel, at, gun);
- if(f->type==ENT_AI) hitmonster(damage, (monster *)f, at, vel, gun);
- else if(!m_mp(gamemode)) damaged(damage, f, at);
+ if(!m_mp(gamemode)) damaged(damage, f, at);
else
{
hitmsg &h = hits.add();
if(gun==GUN_RL) adddynlight(v, 1.15f*guns[gun].exprad, vec(2, 1.5f, 1), 700, 100, 0, guns[gun].exprad/2, vec(1, 0.75f, 0.5f));
else if(gun==GUN_GL) adddynlight(v, 1.15f*guns[gun].exprad, vec(0.5f, 1.5f, 2), 600, 100, 0, 8, vec(0.25f, 1, 1));
else adddynlight(v, 1.15f*guns[gun].exprad, vec(2, 1.5f, 1), 700, 100);
- int numdebris = gun==GUN_BARREL ? rnd(max(maxbarreldebris-5, 1))+5 : rnd(maxdebris-5)+5;
+ int numdebris = rnd(maxdebris-5)+5;
vec debrisvel = vec(owner->o).sub(v).safenormalize(), debrisorigin(v);
if(gun==GUN_RL) debrisorigin.add(vec(debrisvel).mul(8));
if(numdebris)
entitylight light;
lightreaching(debrisorigin, light.color, light.dir);
loopi(numdebris)
- spawnbouncer(debrisorigin, debrisvel, owner, gun==GUN_BARREL ? BNC_BARRELDEBRIS : BNC_DEBRIS, &light);
+ spawnbouncer(debrisorigin, debrisvel, owner, BNC_DEBRIS, &light);
}
if(!local) return;
int numdyn = numdynents();
projectile &p = projs[i];
p.offsetmillis = max(p.offsetmillis-time, 0);
int qdam = guns[p.gun].damage*(p.owner->quadmillis ? 4 : 1);
- if(p.owner->type==ENT_AI) qdam /= MONSTERDAMAGEFACTOR;
vec dv;
- float dist = p.to.dist(p.o, dv);
+ float dist = p.to.dist(p.o, dv);
dv.mul(time/max(dist*1000/p.speed, float(time)));
vec v = vec(p.o).add(dv);
bool exploded = false;
{
vec pos(v);
pos.add(vec(p.offset).mul(p.offsetmillis/float(OFFSETMILLIS)));
- if(guns[p.gun].part)
- {
- regular_particle_splash(PART_SMOKE, 2, 300, pos, 0x404040, 0.6f, 150, -20);
- int color = 0xFFFFFF;
- switch(guns[p.gun].part)
- {
- case PART_FIREBALL1: color = 0xFFC8C8; break;
- }
- particle_splash(guns[p.gun].part, 1, 1, pos, color, 4.8f, 150, 20);
- }
- else regular_particle_splash(PART_SMOKE, 2, 300, pos, 0x404040, 2.4f, 50, -20);
+ regular_particle_splash(PART_SMOKE, 2, 300, pos, 0x404040, 2.4f, 50, -20);
}
}
if(exploded)
case GUN_RL:
if(muzzleflash && d->muzzle.x >= 0)
particle_flare(d->muzzle, d->muzzle, 250, PART_MUZZLE_FLASH2, 0xFFFFFF, 3.0f, d);
- case GUN_FIREBALL:
- case GUN_ICEBALL:
- case GUN_SLIMEBALL:
pspeed = guns[gun].projspeed;
- if(d->type==ENT_AI) pspeed /= 2;
newprojectile(from, to, (float)pspeed, local, id, d, gun);
break;
{
int qdam = guns[d->gunselect].damage;
if(d->quadmillis) qdam *= 4;
- if(d->type==ENT_AI) qdam /= MONSTERDAMAGEFACTOR;
dynent *o;
float dist;
if(guns[d->gunselect].rays > 1)
{
dynent *hits[MAXRAYS];
int maxrays = guns[d->gunselect].rays;
- loopi(maxrays)
+ loopi(maxrays)
{
if((hits[i] = intersectclosest(from, rays[i], d, dist))) shorten(from, rays[i], dist);
else adddecal(DECAL_BULLET, rays[i], vec(from).sub(rays[i]).safenormalize(), 2.0f);
shorten(from, to, dist);
hitpush(qdam, o, d, from, to, d->gunselect, 1);
}
- else if(d->gunselect!=GUN_FIST && d->gunselect!=GUN_BITE) adddecal(DECAL_BULLET, to, vec(from).sub(to).safenormalize(), d->gunselect==GUN_RIFLE ? 3.0f : 2.0f);
+ else if(d->gunselect!=GUN_FIST) adddecal(DECAL_BULLET, to, vec(from).sub(to).safenormalize(), d->gunselect==GUN_RIFLE ? 3.0f : 2.0f);
}
void shoot(fpsent *d, const vec &targ)
static const char * const projnames[2] = { "projectiles/grenade", "projectiles/rocket" };
static const char * const gibnames[3] = { "gibs/gib01", "gibs/gib02", "gibs/gib03" };
static const char * const debrisnames[4] = { "debris/debris01", "debris/debris02", "debris/debris03", "debris/debris04" };
- static const char * const barreldebrisnames[4] = { "barreldebris/debris01", "barreldebris/debris02", "barreldebris/debris03", "barreldebris/debris04" };
-
+
void preloadbouncers()
{
loopi(sizeof(projnames)/sizeof(projnames[0])) preloadmodel(projnames[i]);
loopi(sizeof(gibnames)/sizeof(gibnames[0])) preloadmodel(gibnames[i]);
loopi(sizeof(debrisnames)/sizeof(debrisnames[0])) preloadmodel(debrisnames[i]);
- loopi(sizeof(barreldebrisnames)/sizeof(barreldebrisnames[0])) preloadmodel(barreldebrisnames[i]);
}
void renderbouncers()
{
case BNC_GIBS: mdl = gibnames[bnc.variant]; cull |= MDL_LIGHT|MDL_LIGHT_FAST|MDL_DYNSHADOW; break;
case BNC_DEBRIS: mdl = debrisnames[bnc.variant]; break;
- case BNC_BARRELDEBRIS: mdl = barreldebrisnames[bnc.variant]; break;
default: continue;
}
rendermodel(&bnc.light, mdl, ANIM_MAPMODEL|ANIM_LOOP, pos, yaw, pitch, cull, NULL, NULL, 0, 0, fade);
uchar physstate; // one of PHYS_* above
uchar state, editstate; // one of CS_* above
uchar type; // one of ENT_* above
- uchar collidetype; // one of COLLIDE_* above
+ uchar collidetype; // one of COLLIDE_* above
bool blocked; // used by physics to signal ai
- physent() : o(0, 0, 0), deltapos(0, 0, 0), newpos(0, 0, 0), yaw(0), pitch(0), roll(0), maxspeed(100),
+ physent() : o(0, 0, 0), deltapos(0, 0, 0), newpos(0, 0, 0), yaw(0), pitch(0), roll(0), maxspeed(100),
radius(4.1f), eyeheight(14), aboveeye(1), xradius(4.1f), yradius(4.1f), zmargin(0),
state(CS_ALIVE), editstate(CS_ALIVE), type(ENT_PLAYER),
collidetype(COLLIDE_ELLIPSE),
blocked(false)
{ reset(); }
-
+
void resetinterp()
{
newpos = o;
vec feetpos(float offset = 0) const { return vec(o).add(vec(0, 0, offset - eyeheight)); }
vec headpos(float offset = 0) const { return vec(o).add(vec(0, 0, offset)); }
- bool maymove() const { return timeinair || physstate < PHYS_FLOOR || vel.squaredlen() > 1e-4f || deltapos.squaredlen() > 1e-4f; }
+ bool maymove() const { return timeinair || physstate < PHYS_FLOOR || vel.squaredlen() > 1e-4f || deltapos.squaredlen() > 1e-4f; }
};
enum
ANIM_EDIT, ANIM_LAG, ANIM_TAUNT, ANIM_WIN, ANIM_LOSE,
ANIM_GUN_IDLE, ANIM_GUN_SHOOT,
ANIM_VWEP_IDLE, ANIM_VWEP_SHOOT, ANIM_SHIELD, ANIM_POWERUP,
- ANIM_MAPMODEL, ANIM_TRIGGER,
+ ANIM_MAPMODEL,
NUMANIMS
};
"edit", "lag", "taunt", "win", "lose",
"gun idle", "gun shoot",
"vwep idle", "vwep shoot", "shield", "powerup",
- "mapmodel", "trigger"
+ "mapmodel"
};
#define ANIM_ALL 0x7F
uchar occluded;
dynent() : ragdoll(NULL), query(NULL), lastrendered(0), occluded(0)
- {
- reset();
+ {
+ reset();
}
~dynent()
if(ragdoll) cleanragdoll(this);
#endif
}
-
+
void stopmoving()
{
k_left = k_right = k_up = k_down = jumping = false;
move = strafe = 0;
}
-
+
void reset()
{
physent::reset();
extern int worldsize;
if(grid <= 0 || grid >= worldsize) return false;
if(o.x >= worldsize || o.y >= worldsize || o.z >= worldsize) return false;
- if(o.x < 0) { s.x -= (grid - 1 - o.x)/grid; o.x = 0; }
- if(o.y < 0) { s.y -= (grid - 1 - o.y)/grid; o.y = 0; }
- if(o.z < 0) { s.z -= (grid - 1 - o.z)/grid; o.z = 0; }
+ if(o.x < 0) { s.x -= (grid - 1 - o.x)/grid; o.x = 0; }
+ if(o.y < 0) { s.y -= (grid - 1 - o.y)/grid; o.y = 0; }
+ if(o.z < 0) { s.z -= (grid - 1 - o.z)/grid; o.z = 0; }
s.x = clamp(s.x, 0, (worldsize - o.x)/grid);
s.y = clamp(s.y, 0, (worldsize - o.y)/grid);
s.z = clamp(s.z, 0, (worldsize - o.z)/grid);
extern void damagecompass(int n, const vec &loc);
extern void cleardamagescreen();
-extern vec minimapcenter, minimapradius, minimapscale;
-extern void bindminimap();
-
extern matrix4 hudmatrix;
extern void resethudmatrix();
extern void pushhudmatrix();
extern int extraentinfosize();
extern void writeent(entity &e, char *buf);
extern void readent(entity &e, char *buf, int ver);
- extern float dropheight(entity &e);
extern void fixentity(extentity &e);
extern void entradius(extentity &e, bool color);
extern bool mayattach(extentity &e);
extern void clearents();
extern vector<extentity *> &getents();
extern const char *entmodel(const entity &e);
- extern void animatemapmodel(const extentity &e, int &anim, int &basetime);
}
namespace game
extern bool serverinfostartcolumn(g3d_gui *g, int i);
extern void serverinfoendcolumn(g3d_gui *g, int i);
extern bool serverinfoentry(g3d_gui *g, int i, const char *name, int port, const char *desc, const char *map, int ping, const vector<int> &attr, int np);
- extern bool needminimap();
-}
-
+}
+
namespace server
{
extern void *newclientinfo();