From 9d9fc756ca2c93c6f274965c654d92095c0ef1d3 Mon Sep 17 00:00:00 2001 From: archive Date: Sun, 17 Sep 2000 00:00:00 +0000 Subject: [PATCH] as released 2000-09-17 --- bin/Mp3dec.asi | Bin 0 -> 126976 bytes bin/Mss32.dll | Bin 0 -> 352256 bytes bin/Radiant plugins/Fakk2Plug.dll | Bin 0 -> 270336 bytes bin/dlgedit.exe | Bin 0 -> 266297 bytes bin/fontgen.exe | Bin 0 -> 61440 bytes bin/ftxconvert.exe | Bin 0 -> 69632 bytes bin/lipsync.exe | Bin 0 -> 258103 bytes bin/lw2tan.exe | Bin 0 -> 90112 bytes bin/max2plugins/animout.dle | Bin 0 -> 110662 bytes bin/max2plugins/animout.ilk | Bin 0 -> 86444 bytes bin/max2plugins/skelout.dle | Bin 0 -> 319558 bytes bin/max2plugins/skelout.ilk | Bin 0 -> 411912 bytes bin/max2plugins/uvout.dle | Bin 0 -> 102470 bytes bin/max2skl.exe | Bin 0 -> 139327 bytes bin/max2tan.exe | Bin 0 -> 86016 bytes bin/max3plugins/animout.dle | Bin 0 -> 110666 bytes bin/max3plugins/animout.ilk | Bin 0 -> 111856 bytes bin/max3plugins/skelout.dle | Bin 0 -> 323656 bytes bin/max3plugins/skelout.ilk | Bin 0 -> 450496 bytes bin/max3plugins/uvout.dle | Bin 0 -> 106566 bytes bin/maxscripts/example.ms | 26 + bin/maxscripts/exportskl.ms | 26 + bin/maxscripts/jimtest.ms | 56 + bin/mcopy.exe | Bin 0 -> 65536 bytes bin/newq3map.exe | Bin 0 -> 315451 bytes bin/q3map.exe | Bin 0 -> 307268 bytes bin/q3radiant.exe | Bin 0 -> 823296 bytes bin/radiant.ini | 241 + bin/runq3radiant.bat | 1 + bin/tgaconvert.exe | Bin 0 -> 65536 bytes docs/AI.doc | Bin 0 -> 103424 bytes docs/CVAR DOCUMENTATION.doc | Bin 0 -> 72192 bytes docs/Client Side Commands.doc | Bin 0 -> 49152 bytes docs/Coordinate System.doc | Bin 0 -> 59392 bytes .../Description of Menus and Ingame Utils.doc | Bin 0 -> 22016 bytes docs/Dialog System.doc | Bin 0 -> 39424 bytes docs/Dumping Demo AVI.doc | Bin 0 -> 32768 bytes docs/Event Spec Documentation.doc | Bin 0 -> 20992 bytes docs/FAKK FAQ.doc | Bin 0 -> 35840 bytes docs/GUI Documentation.doc | Bin 0 -> 37376 bytes docs/Ghost Particle System.doc | Bin 0 -> 55808 bytes docs/Gibs.doc | Bin 0 -> 35328 bytes docs/How to Make Weapons and Ammo.doc | Bin 0 -> 53248 bytes docs/Inventory System Commands.doc | Bin 0 -> 30208 bytes docs/Items.doc | Bin 0 -> 20992 bytes docs/MAX2SKL Reference Guide.doc | Bin 0 -> 38400 bytes docs/Radiant Commands.doc | Bin 0 -> 31232 bytes docs/Sound System.doc | Bin 0 -> 23552 bytes docs/TIKI Model System.doc | Bin 0 -> 62976 bytes docs/Tiki QuakeEd Specs.doc | Bin 0 -> 25088 bytes docs/camera documentation.doc | Bin 0 -> 29696 bytes docs/commands.txt | 273 + docs/shader_manual_new.doc | Bin 0 -> 569856 bytes entities/entities.def | 1194 ++ fakk/maps/example/CameraScript.bsp | Bin 0 -> 63760 bytes fakk/maps/example/CameraScript.map | 406 + fakk/maps/example/CameraScript.prt | 24 + fakk/maps/example/CameraScript.scr | 47 + fakk/maps/example/autocamera.bsp | Bin 0 -> 734708 bytes fakk/maps/example/autocamera.map | 2116 +++ fakk/maps/example/autocamera.prt | 2315 +++ fakk/maps/example/autosprite.bsp | Bin 0 -> 62764 bytes fakk/maps/example/autosprite.map | 281 + fakk/maps/example/autosprite.prt | 24 + fakk/maps/example/beam.bsp | Bin 0 -> 73116 bytes fakk/maps/example/beam.map | 320 + fakk/maps/example/beam.prt | 96 + fakk/maps/example/beam.scr | 3 + fakk/maps/example/beam1.bsp | Bin 0 -> 69764 bytes fakk/maps/example/beam1.map | 279 + fakk/maps/example/beam1.prt | 96 + fakk/maps/example/box3.bsp | Bin 0 -> 69920 bytes fakk/maps/example/box3.map | 298 + fakk/maps/example/climb.bsp | Bin 0 -> 60372 bytes fakk/maps/example/climb.map | 145 + fakk/maps/example/climb.prt | 24 + fakk/maps/example/cover.bsp | Bin 0 -> 232684 bytes fakk/maps/example/cover.map | 1408 ++ fakk/maps/example/cover.prt | 538 + fakk/maps/example/cover.pth | Bin 0 -> 12640 bytes fakk/maps/example/door.bsp | Bin 0 -> 98312 bytes fakk/maps/example/door.map | 327 + fakk/maps/example/door.prt | 216 + fakk/maps/example/door.pth | Bin 0 -> 937 bytes fakk/maps/example/door.scr | 18 + fakk/maps/example/doors.bsp | Bin 0 -> 81652 bytes fakk/maps/example/doors.map | 330 + fakk/maps/example/doors.prt | 132 + fakk/maps/example/earthquake.bsp | Bin 0 -> 58780 bytes fakk/maps/example/earthquake.map | 100 + fakk/maps/example/earthquake.prt | 68 + fakk/maps/example/explodeobject.bsp | Bin 0 -> 83760 bytes fakk/maps/example/explodeobject.map | 360 + fakk/maps/example/explodeobject.prt | 96 + fakk/maps/example/exploder.bsp | Bin 0 -> 58764 bytes fakk/maps/example/exploder.map | 99 + fakk/maps/example/exploder.prt | 68 + fakk/maps/example/explodingwall.bsp | Bin 0 -> 112144 bytes fakk/maps/example/explodingwall.map | 356 + fakk/maps/example/explodingwall.prt | 98 + fakk/maps/example/fallingrock.bsp | Bin 0 -> 79568 bytes fakk/maps/example/fallingrock.map | 300 + fakk/maps/example/fallingrock.prt | 145 + fakk/maps/example/fulcrum.bsp | Bin 0 -> 121680 bytes fakk/maps/example/fulcrum.map | 490 + fakk/maps/example/fulcrum.prt | 289 + fakk/maps/example/fulcrum.scr | 12 + fakk/maps/example/funcspawn.bsp | Bin 0 -> 56220 bytes fakk/maps/example/funcspawn.map | 114 + fakk/maps/example/funcspawn.prt | 24 + fakk/maps/example/gibs_and_health.bsp | Bin 0 -> 232976 bytes fakk/maps/example/gibs_and_health.map | 1422 ++ fakk/maps/example/gibs_and_health.prt | 538 + fakk/maps/example/gibs_and_health.pth | Bin 0 -> 12640 bytes fakk/maps/example/letterbox.bsp | Bin 0 -> 58492 bytes fakk/maps/example/letterbox.map | 145 + fakk/maps/example/letterbox.prt | 24 + fakk/maps/example/letterbox.pth | Bin 0 -> 1420 bytes fakk/maps/example/letterbox.scr | 16 + fakk/maps/example/multiexploder.bsp | Bin 0 -> 61580 bytes fakk/maps/example/multiexploder.map | 108 + fakk/maps/example/multiexploder.prt | 68 + fakk/maps/example/patrol.bsp | Bin 0 -> 232420 bytes fakk/maps/example/patrol.map | 1397 ++ fakk/maps/example/patrol.prt | 538 + fakk/maps/example/patrol.pth | Bin 0 -> 12654 bytes fakk/maps/example/patrol.scr | 18 + fakk/maps/example/pickup.bsp | Bin 0 -> 98436 bytes fakk/maps/example/pickup.map | 335 + fakk/maps/example/pickup.prt | 216 + fakk/maps/example/pickup.pth | Bin 0 -> 937 bytes fakk/maps/example/pickup.scr | 25 + fakk/maps/example/pushobject.bsp | Bin 0 -> 95140 bytes fakk/maps/example/pushobject.map | 454 + fakk/maps/example/pushobject.prt | 163 + fakk/maps/example/rain.bsp | Bin 0 -> 56300 bytes fakk/maps/example/rain.map | 114 + fakk/maps/example/rain.prt | 24 + fakk/maps/example/rain.pth | Bin 0 -> 88 bytes fakk/maps/example/runthrough.bsp | Bin 0 -> 75908 bytes fakk/maps/example/runthrough.map | 293 + fakk/maps/example/runthrough.prt | 140 + fakk/maps/example/scriptgravity.bsp | Bin 0 -> 68460 bytes fakk/maps/example/scriptgravity.map | 198 + fakk/maps/example/scriptgravity.prt | 24 + fakk/maps/example/scriptgravity.scr | 59 + fakk/maps/example/sinkobject.bsp | Bin 0 -> 181212 bytes fakk/maps/example/sinkobject.map | 723 + fakk/maps/example/sinkobject.prt | 510 + fakk/maps/example/teleporter.bsp | Bin 0 -> 86508 bytes fakk/maps/example/teleporter.map | 208 + fakk/maps/example/teleporter.prt | 142 + fakk/maps/example/useanim.bsp | Bin 0 -> 80820 bytes fakk/maps/example/useanim.map | 348 + fakk/maps/example/useanim.prt | 96 + fakk/maps/example/useobject.bsp | Bin 0 -> 75028 bytes fakk/maps/example/useobject.map | 225 + fakk/maps/example/useobject.prt | 117 + fakk/maps/example/vehicle.bsp | Bin 0 -> 170324 bytes fakk/maps/example/vehicle.map | 328 + fakk/maps/example/vehicle.prt | 95 + fakk/maps/example/zoo.bsp | Bin 0 -> 1494196 bytes fakk/maps/example/zoo.map | 10786 +++++++++++++ fakk/scripts/fakk.qe4 | 12 + fakk/scripts/surfacelist.txt | 750 + license.rtf | 235 + readme.txt | 165 + source/source/cgame/Linklist.h | 129 + source/source/cgame/cg_beam.cpp | 1569 ++ source/source/cgame/cg_class.cpp | 581 + source/source/cgame/cg_class.h | 402 + source/source/cgame/cg_commands.cpp | 6942 +++++++++ source/source/cgame/cg_commands.h | 1061 ++ source/source/cgame/cg_consolecmds.c | 314 + source/source/cgame/cg_container.h | 381 + source/source/cgame/cg_drawtools.cpp | 363 + source/source/cgame/cg_ents.c | 925 ++ source/source/cgame/cg_event.c | 35 + source/source/cgame/cg_lightstyles.cpp | 640 + source/source/cgame/cg_listener.cpp | 1394 ++ source/source/cgame/cg_listener.h | 541 + source/source/cgame/cg_local.h | 937 ++ source/source/cgame/cg_main.c | 611 + source/source/cgame/cg_marks.c | 388 + source/source/cgame/cg_modelanim.c | 1405 ++ source/source/cgame/cg_player.cpp | 102 + source/source/cgame/cg_playerstate.c | 38 + source/source/cgame/cg_predict.c | 702 + source/source/cgame/cg_public.h | 422 + source/source/cgame/cg_servercmds.c | 166 + source/source/cgame/cg_snapshot.c | 573 + source/source/cgame/cg_sound.cpp | 38 + source/source/cgame/cg_specialfx.cpp | 370 + source/source/cgame/cg_swipe.cpp | 315 + source/source/cgame/cg_syscalls.c | 264 + source/source/cgame/cg_testemitter.cpp | 637 + source/source/cgame/cg_vector.h | 862 ++ source/source/cgame/cg_view.c | 663 + source/source/cgame/cgame.def | 2 + source/source/cgame/cgame.dsp | 273 + source/source/cgame/cgame.dsw | 29 + source/source/cgame/class.cpp | 1035 ++ source/source/cgame/class.h | 511 + source/source/cgame/container.cpp | 243 + source/source/cgame/container.h | 538 + source/source/cgame/listener.cpp | 3435 +++++ source/source/cgame/listener.h | 1208 ++ source/source/cgame/script.cpp | 1038 ++ source/source/cgame/script.h | 158 + source/source/cgame/str.cpp | 657 + source/source/cgame/str.h | 839 ++ source/source/cgame/tr_types.h | 335 + source/source/cgame/vector.h | 1092 ++ source/source/fgame/PlayerStart.cpp | 172 + source/source/fgame/PlayerStart.h | 83 + source/source/fgame/actor.cpp | 12449 ++++++++++++++++ source/source/fgame/actor.h | 2117 +++ source/source/fgame/ammo.cpp | 218 + source/source/fgame/ammo.h | 115 + source/source/fgame/animate.cpp | 1131 ++ source/source/fgame/animate.h | 386 + source/source/fgame/archive.cpp | 1214 ++ source/source/fgame/archive.h | 315 + source/source/fgame/armor.cpp | 114 + source/source/fgame/armor.h | 46 + source/source/fgame/b_files.cpp | 487 + source/source/fgame/b_local.h | 167 + source/source/fgame/b_nav.cpp | 632 + source/source/fgame/b_navgen.cpp | 3089 ++++ source/source/fgame/beam.cpp | 924 ++ source/source/fgame/beam.h | 164 + source/source/fgame/behavior.cpp | 7898 ++++++++++ source/source/fgame/behavior.h | 1887 +++ source/source/fgame/bg_local.h | 98 + source/source/fgame/bg_misc.c | 117 + source/source/fgame/bg_pmove.c | 2558 ++++ source/source/fgame/bg_public.h | 783 + source/source/fgame/bspline.cpp | 1008 ++ source/source/fgame/bspline.h | 617 + source/source/fgame/bullet.cpp | 298 + source/source/fgame/bullet.h | 45 + source/source/fgame/camera.cpp | 3829 +++++ source/source/fgame/camera.h | 520 + source/source/fgame/characterstate.cpp | 1324 ++ source/source/fgame/characterstate.h | 543 + source/source/fgame/class.cpp | 1035 ++ source/source/fgame/class.h | 511 + source/source/fgame/clusterbomb.cpp | 143 + source/source/fgame/clusterbomb.h | 63 + source/source/fgame/container.cpp | 243 + source/source/fgame/container.h | 538 + source/source/fgame/crossbow.cpp | 93 + source/source/fgame/crossbow.h | 46 + source/source/fgame/deadbody.cpp | 112 + source/source/fgame/deadbody.h | 42 + source/source/fgame/debuglines.cpp | 793 + source/source/fgame/debuglines.h | 64 + source/source/fgame/decals.cpp | 94 + source/source/fgame/decals.h | 63 + source/source/fgame/doors.cpp | 1768 +++ source/source/fgame/doors.h | 266 + source/source/fgame/earthquake.cpp | 258 + source/source/fgame/earthquake.h | 82 + source/source/fgame/edenwater.cpp | 106 + source/source/fgame/edenwater.h | 40 + source/source/fgame/entity.cpp | 5211 +++++++ source/source/fgame/entity.h | 1189 ++ source/source/fgame/events.h | 70 + source/source/fgame/explosion.cpp | 768 + source/source/fgame/explosion.h | 172 + source/source/fgame/fgame.dsp | 756 + source/source/fgame/fgame.dsw | 29 + source/source/fgame/fists.cpp | 175 + source/source/fgame/fists.h | 70 + source/source/fgame/flamethrower.cpp | 108 + source/source/fgame/flamethrower.h | 63 + source/source/fgame/flashbang.cpp | 174 + source/source/fgame/flashbang.h | 85 + source/source/fgame/g_local.h | 219 + source/source/fgame/g_main.cpp | 1989 +++ source/source/fgame/g_main.h | 142 + source/source/fgame/g_phys.cpp | 1673 +++ source/source/fgame/g_phys.h | 93 + source/source/fgame/g_public.h | 529 + source/source/fgame/g_spawn.cpp | 606 + source/source/fgame/g_spawn.h | 88 + source/source/fgame/g_utils.cpp | 2440 +++ source/source/fgame/g_utils.h | 403 + source/source/fgame/game.cpp | 78 + source/source/fgame/game.def | 2 + source/source/fgame/game.h | 56 + source/source/fgame/gamecmds.cpp | 644 + source/source/fgame/gamecmds.h | 62 + source/source/fgame/gamecvars.cpp | 250 + source/source/fgame/gamecvars.h | 141 + source/source/fgame/gamescript.cpp | 543 + source/source/fgame/gamescript.h | 204 + source/source/fgame/gibs.cpp | 390 + source/source/fgame/gibs.h | 120 + source/source/fgame/goo.cpp | 278 + source/source/fgame/goo.h | 89 + source/source/fgame/gravpath.cpp | 836 ++ source/source/fgame/gravpath.h | 222 + source/source/fgame/health.cpp | 393 + source/source/fgame/health.h | 110 + source/source/fgame/hornofconjuring.cpp | 84 + source/source/fgame/hornofconjuring.h | 46 + source/source/fgame/inventoryitem.cpp | 149 + source/source/fgame/inventoryitem.h | 56 + source/source/fgame/ipfilter.cpp | 356 + source/source/fgame/ipfilter.h | 28 + source/source/fgame/item.cpp | 1068 ++ source/source/fgame/item.h | 217 + source/source/fgame/level.cpp | 1022 ++ source/source/fgame/level.h | 190 + source/source/fgame/light.cpp | 170 + source/source/fgame/light.h | 41 + source/source/fgame/linklist.h | 129 + source/source/fgame/listener.cpp | 3435 +++++ source/source/fgame/listener.h | 1208 ++ source/source/fgame/misc.cpp | 3757 +++++ source/source/fgame/misc.h | 710 + source/source/fgame/mover.cpp | 309 + source/source/fgame/mover.h | 80 + source/source/fgame/nature.cpp | 153 + source/source/fgame/nature.h | 67 + source/source/fgame/navigate.cpp | 2673 ++++ source/source/fgame/navigate.h | 841 ++ source/source/fgame/object.cpp | 493 + source/source/fgame/object.h | 91 + source/source/fgame/path.cpp | 469 + source/source/fgame/path.h | 119 + source/source/fgame/player.cpp | 11381 ++++++++++++++ source/source/fgame/player.h | 1682 +++ source/source/fgame/player_combat.cpp | 916 ++ source/source/fgame/player_util.cpp | 687 + source/source/fgame/portal.cpp | 198 + source/source/fgame/portal.h | 49 + source/source/fgame/powerups.cpp | 298 + source/source/fgame/powerups.h | 60 + source/source/fgame/prioritystack.h | 165 + source/source/fgame/q_math.c | 2290 +++ source/source/fgame/q_mathsys.c | 142 + source/source/fgame/q_shared.c | 1217 ++ source/source/fgame/q_shared.h | 1787 +++ source/source/fgame/queue.h | 244 + source/source/fgame/rope.cpp | 1667 +++ source/source/fgame/rope.h | 192 + source/source/fgame/script.cpp | 950 ++ source/source/fgame/script.h | 145 + source/source/fgame/scriptmaster.cpp | 3706 +++++ source/source/fgame/scriptmaster.h | 539 + source/source/fgame/scriptslave.cpp | 2442 +++ source/source/fgame/scriptslave.h | 289 + source/source/fgame/scriptvariable.cpp | 1518 ++ source/source/fgame/scriptvariable.h | 251 + source/source/fgame/sentient.cpp | 4109 +++++ source/source/fgame/sentient.h | 443 + source/source/fgame/shield.cpp | 84 + source/source/fgame/shield.h | 66 + source/source/fgame/soulsucker.cpp | 162 + source/source/fgame/soulsucker.h | 64 + source/source/fgame/soundman.cpp | 1822 +++ source/source/fgame/soundman.h | 141 + source/source/fgame/spawners.cpp | 572 + source/source/fgame/spawners.h | 154 + source/source/fgame/specialfx.cpp | 1174 ++ source/source/fgame/specialfx.h | 241 + source/source/fgame/stack.h | 148 + source/source/fgame/steering.cpp | 1524 ++ source/source/fgame/steering.h | 363 + source/source/fgame/str.cpp | 657 + source/source/fgame/str.h | 839 ++ source/source/fgame/surfaceflags.h | 124 + source/source/fgame/sword.cpp | 393 + source/source/fgame/sword.h | 109 + source/source/fgame/testweapon.cpp | 98 + source/source/fgame/testweapon.h | 42 + source/source/fgame/trigger.cpp | 3457 +++++ source/source/fgame/trigger.h | 737 + source/source/fgame/ulinklist.h | 414 + source/source/fgame/umap.h | 351 + source/source/fgame/vector.h | 1092 ++ source/source/fgame/vehicle.cpp | 1277 ++ source/source/fgame/vehicle.h | 212 + source/source/fgame/viewthing.cpp | 1224 ++ source/source/fgame/viewthing.h | 213 + source/source/fgame/weapon.cpp | 3384 +++++ source/source/fgame/weapon.h | 529 + source/source/fgame/weaputils.cpp | 2478 +++ source/source/fgame/weaputils.h | 404 + source/source/fgame/worldspawn.cpp | 788 + source/source/fgame/worldspawn.h | 154 + source/source/qcommon/alias.h | 157 + source/source/qcommon/cm_public.h | 109 + source/source/qcommon/qcommon.h | 1045 ++ source/source/qcommon/qfiles.h | 1180 ++ source/source/win32/win_bounds.cpp | 193 + source/utils/common/aselib.c | 886 ++ source/utils/common/aselib.h | 10 + source/utils/common/cmdlib.c | 1425 ++ source/utils/common/cmdlib.h | 211 + source/utils/common/imagelib.c | 1173 ++ source/utils/common/imagelib.h | 24 + source/utils/common/mathlib.c | 327 + source/utils/common/mathlib.h | 90 + source/utils/common/polylib.c | 739 + source/utils/common/polylib.h | 39 + source/utils/common/polyset.h | 30 + source/utils/common/qfiles.h | 1180 ++ source/utils/common/scriplib.c | 363 + source/utils/common/scriplib.h | 42 + source/utils/common/surfaceflags.h | 124 + source/utils/dlgedit/dlgedit.cpp | 72 + source/utils/dlgedit/dlgedit.dsp | 179 + source/utils/dlgedit/dlgedit.dsw | 37 + source/utils/dlgedit/dlgedit.h | 49 + source/utils/dlgedit/dlgedit.rc | 349 + source/utils/dlgedit/dlgeditdlg.cpp | 443 + source/utils/dlgedit/dlgeditdlg.h | 67 + source/utils/dlgedit/drawobj.cpp | 502 + source/utils/dlgedit/drawobj.h | 65 + source/utils/dlgedit/menuprops.cpp | 60 + source/utils/dlgedit/menuprops.h | 49 + source/utils/dlgedit/mousehandle.cpp | 284 + source/utils/dlgedit/mousehandle.h | 59 + source/utils/dlgedit/objprops.cpp | 183 + source/utils/dlgedit/objprops.h | 63 + source/utils/dlgedit/readme.txt | 88 + source/utils/dlgedit/res/dlgedit.ico | Bin 0 -> 1078 bytes source/utils/dlgedit/res/dlgedit.rc2 | 13 + source/utils/dlgedit/res/vssver.scc | Bin 0 -> 64 bytes source/utils/dlgedit/resource.h | 44 + source/utils/dlgedit/stdafx.cpp | 8 + source/utils/dlgedit/stdafx.h | 27 + source/utils/fontgen/fontgen.cpp | 462 + source/utils/fontgen/fontgen.dsp | 104 + source/utils/fontgen/fontgen.dsw | 29 + source/utils/fontgen/fontgen.h | 74 + source/utils/ftxconvert/ftxconvert.c | 307 + source/utils/ftxconvert/ftxconvert.dsp | 126 + source/utils/ftxconvert/ftxconvert.dsw | 37 + source/utils/lipsync/code/cmdlib.c | 1768 +++ source/utils/lipsync/code/cmdlib.h | 271 + source/utils/lipsync/code/lipsync.c | 717 + source/utils/lipsync/code/mathlib.c | 265 + source/utils/lipsync/code/mathlib.h | 104 + source/utils/lipsync/code/qfiles.h | 1075 ++ source/utils/lipsync/code/scriplib.c | 351 + source/utils/lipsync/code/scriplib.h | 59 + source/utils/lipsync/lipsync.dsp | 138 + source/utils/lipsync/lipsync.dsw | 37 + source/utils/lw2tan/calclod.cpp | 76 + source/utils/lw2tan/calclod.h | 38 + source/utils/lw2tan/list.h | 128 + source/utils/lw2tan/lw2tan.c | 676 + source/utils/lw2tan/lw2tan.dsp | 205 + source/utils/lw2tan/lw2tan.dsw | 37 + source/utils/lw2tan/lwolib.c | 289 + source/utils/lw2tan/lwolib.h | 51 + source/utils/lw2tan/md3lib.c | 187 + source/utils/lw2tan/md3lib.h | 7 + source/utils/lw2tan/models.c | 1075 ++ source/utils/lw2tan/models.h | 113 + source/utils/lw2tan/progmesh.cpp | 409 + source/utils/lw2tan/progmesh.h | 33 + source/utils/lw2tan/stripper.c | 284 + source/utils/lw2tan/tikidata.h | 111 + source/utils/lw2tan/uv.c | 424 + source/utils/lw2tan/uv.h | 12 + source/utils/lw2tan/vector.cpp | 108 + source/utils/lw2tan/vector.h | 66 + source/utils/lw2tan/writetan.c | 324 + source/utils/lw2tan/writetan.h | 61 + source/utils/max2plugins/animout/animout.cpp | 695 + source/utils/max2plugins/animout/animout.def | 8 + source/utils/max2plugins/animout/animout.dsp | 134 + source/utils/max2plugins/animout/animout.dsw | 37 + source/utils/max2plugins/animout/animout.rc | 106 + source/utils/max2plugins/animout/core.lib | Bin 0 -> 1916044 bytes source/utils/max2plugins/animout/geom.lib | Bin 0 -> 199860 bytes source/utils/max2plugins/animout/mesh.lib | Bin 0 -> 81156 bytes source/utils/max2plugins/animout/resource.h | 27 + source/utils/max2plugins/animout/util.lib | Bin 0 -> 90782 bytes source/utils/max2plugins/skelout/container.h | 364 + source/utils/max2plugins/skelout/core.lib | Bin 0 -> 1916044 bytes source/utils/max2plugins/skelout/dllmain.cpp | 101 + source/utils/max2plugins/skelout/dllmain.h | 28 + .../utils/max2plugins/skelout/enumobjects.cpp | 221 + .../utils/max2plugins/skelout/enumobjects.h | 76 + source/utils/max2plugins/skelout/geom.lib | Bin 0 -> 199860 bytes source/utils/max2plugins/skelout/mesh.lib | Bin 0 -> 81156 bytes source/utils/max2plugins/skelout/resource.h | 31 + source/utils/max2plugins/skelout/skelout.cpp | 1397 ++ source/utils/max2plugins/skelout/skelout.def | 8 + source/utils/max2plugins/skelout/skelout.dsp | 180 + source/utils/max2plugins/skelout/skelout.dsw | 37 + source/utils/max2plugins/skelout/skelout.h | 238 + source/utils/max2plugins/skelout/str.cpp | 347 + source/utils/max2plugins/skelout/str.h | 621 + source/utils/max2plugins/skelout/util.cpp | 109 + source/utils/max2plugins/skelout/util.h | 34 + source/utils/max2plugins/skelout/util.lib | Bin 0 -> 90782 bytes source/utils/max2plugins/uvout/core.lib | Bin 0 -> 1916044 bytes source/utils/max2plugins/uvout/geom.lib | Bin 0 -> 199860 bytes source/utils/max2plugins/uvout/mesh.lib | Bin 0 -> 81156 bytes source/utils/max2plugins/uvout/util.lib | Bin 0 -> 90782 bytes source/utils/max2plugins/uvout/uvout.cpp | 568 + source/utils/max2plugins/uvout/uvout.def | 8 + source/utils/max2plugins/uvout/uvout.dsp | 126 + source/utils/max2plugins/uvout/uvout.dsw | 37 + source/utils/max2skl/container.h | 412 + source/utils/max2skl/fixmirror.cpp | 566 + source/utils/max2skl/fixmirror.h | 61 + source/utils/max2skl/list.h | 128 + source/utils/max2skl/max2skl.cpp | 3183 ++++ source/utils/max2skl/max2skl.dsp | 279 + source/utils/max2skl/max2skl.dsw | 37 + source/utils/max2skl/max2skl.h | 214 + source/utils/max2skl/progmesh.cpp | 409 + source/utils/max2skl/progmesh.h | 33 + source/utils/max2skl/script.cpp | 1058 ++ source/utils/max2skl/script.h | 104 + source/utils/max2skl/str.cpp | 608 + source/utils/max2skl/str.h | 738 + source/utils/max2skl/streams.cpp | 92 + source/utils/max2skl/streams.h | 101 + source/utils/max2skl/stripper.c | 284 + source/utils/max2skl/ucasts.h | 42 + source/utils/max2skl/ucommon.cpp | 133 + source/utils/max2skl/ucommon.h | 105 + source/utils/max2skl/ueuler.cpp | 79 + source/utils/max2skl/ueuler.h | 90 + source/utils/max2skl/umath.cpp | 120 + source/utils/max2skl/umath.h | 118 + source/utils/max2skl/umatrix.cpp | 381 + source/utils/max2skl/umatrix.h | 256 + source/utils/max2skl/umem.h | 51 + source/utils/max2skl/uparse.cpp | 127 + source/utils/max2skl/uparse.h | 68 + source/utils/max2skl/uplane3.cpp | 33 + source/utils/max2skl/uplane3.h | 101 + source/utils/max2skl/uquat.cpp | 119 + source/utils/max2skl/uquat.h | 312 + source/utils/max2skl/usys.h | 52 + source/utils/max2skl/uvector3.cpp | 208 + source/utils/max2skl/uvector3.h | 412 + source/utils/max2skl/vector.cpp | 108 + source/utils/max2skl/vector.h | 68 + source/utils/max2tan/calclod.cpp | 76 + source/utils/max2tan/calclod.h | 38 + source/utils/max2tan/list.h | 128 + source/utils/max2tan/max2tan.c | 824 + source/utils/max2tan/max2tan.dsp | 175 + source/utils/max2tan/max2tan.dsw | 29 + source/utils/max2tan/models.c | 1075 ++ source/utils/max2tan/models.h | 113 + source/utils/max2tan/progmesh.cpp | 409 + source/utils/max2tan/progmesh.h | 33 + source/utils/max2tan/stripper.c | 284 + source/utils/max2tan/tikidata.h | 111 + source/utils/max2tan/vector.cpp | 108 + source/utils/max2tan/vector.h | 66 + source/utils/max3plugins/animout/animout.cpp | 695 + source/utils/max3plugins/animout/animout.def | 8 + source/utils/max3plugins/animout/animout.dsp | 118 + source/utils/max3plugins/animout/animout.dsw | 37 + source/utils/max3plugins/animout/animout.rc | 106 + source/utils/max3plugins/animout/resource.h | 27 + source/utils/max3plugins/skelout/container.h | 364 + source/utils/max3plugins/skelout/dllmain.cpp | 101 + source/utils/max3plugins/skelout/dllmain.h | 28 + .../utils/max3plugins/skelout/enumobjects.cpp | 221 + .../utils/max3plugins/skelout/enumobjects.h | 76 + source/utils/max3plugins/skelout/resource.h | 31 + source/utils/max3plugins/skelout/skelout.cpp | 1397 ++ source/utils/max3plugins/skelout/skelout.def | 8 + source/utils/max3plugins/skelout/skelout.dsp | 160 + source/utils/max3plugins/skelout/skelout.dsw | 37 + source/utils/max3plugins/skelout/skelout.h | 238 + source/utils/max3plugins/skelout/skelout.rc | 125 + source/utils/max3plugins/skelout/str.cpp | 347 + source/utils/max3plugins/skelout/str.h | 621 + source/utils/max3plugins/skelout/util.cpp | 109 + source/utils/max3plugins/skelout/util.h | 34 + source/utils/max3plugins/uvout/uvout.cpp | 568 + source/utils/max3plugins/uvout/uvout.def | 8 + source/utils/max3plugins/uvout/uvout.dsp | 110 + source/utils/max3plugins/uvout/uvout.dsw | 37 + source/utils/tgaconvert/tgaconvert.c | 234 + source/utils/tgaconvert/tgaconvert.dsp | 138 + source/utils/tgaconvert/tgaconvert.dsw | 29 + 592 files changed, 273033 insertions(+) create mode 100644 bin/Mp3dec.asi create mode 100644 bin/Mss32.dll create mode 100644 bin/Radiant plugins/Fakk2Plug.dll create mode 100755 bin/dlgedit.exe create mode 100755 bin/fontgen.exe create mode 100755 bin/ftxconvert.exe create mode 100755 bin/lipsync.exe create mode 100755 bin/lw2tan.exe create mode 100644 bin/max2plugins/animout.dle create mode 100644 bin/max2plugins/animout.ilk create mode 100644 bin/max2plugins/skelout.dle create mode 100644 bin/max2plugins/skelout.ilk create mode 100644 bin/max2plugins/uvout.dle create mode 100755 bin/max2skl.exe create mode 100755 bin/max2tan.exe create mode 100644 bin/max3plugins/animout.dle create mode 100644 bin/max3plugins/animout.ilk create mode 100644 bin/max3plugins/skelout.dle create mode 100644 bin/max3plugins/skelout.ilk create mode 100644 bin/max3plugins/uvout.dle create mode 100644 bin/maxscripts/example.ms create mode 100644 bin/maxscripts/exportskl.ms create mode 100644 bin/maxscripts/jimtest.ms create mode 100755 bin/mcopy.exe create mode 100755 bin/newq3map.exe create mode 100755 bin/q3map.exe create mode 100755 bin/q3radiant.exe create mode 100644 bin/radiant.ini create mode 100644 bin/runq3radiant.bat create mode 100755 bin/tgaconvert.exe create mode 100644 docs/AI.doc create mode 100644 docs/CVAR DOCUMENTATION.doc create mode 100644 docs/Client Side Commands.doc create mode 100644 docs/Coordinate System.doc create mode 100644 docs/Description of Menus and Ingame Utils.doc create mode 100644 docs/Dialog System.doc create mode 100644 docs/Dumping Demo AVI.doc create mode 100644 docs/Event Spec Documentation.doc create mode 100644 docs/FAKK FAQ.doc create mode 100644 docs/GUI Documentation.doc create mode 100644 docs/Ghost Particle System.doc create mode 100644 docs/Gibs.doc create mode 100644 docs/How to Make Weapons and Ammo.doc create mode 100644 docs/Inventory System Commands.doc create mode 100644 docs/Items.doc create mode 100644 docs/MAX2SKL Reference Guide.doc create mode 100644 docs/Radiant Commands.doc create mode 100644 docs/Sound System.doc create mode 100644 docs/TIKI Model System.doc create mode 100644 docs/Tiki QuakeEd Specs.doc create mode 100644 docs/camera documentation.doc create mode 100644 docs/commands.txt create mode 100644 docs/shader_manual_new.doc create mode 100644 entities/entities.def create mode 100644 fakk/maps/example/CameraScript.bsp create mode 100644 fakk/maps/example/CameraScript.map create mode 100644 fakk/maps/example/CameraScript.prt create mode 100644 fakk/maps/example/CameraScript.scr create mode 100644 fakk/maps/example/autocamera.bsp create mode 100644 fakk/maps/example/autocamera.map create mode 100644 fakk/maps/example/autocamera.prt create mode 100644 fakk/maps/example/autosprite.bsp create mode 100644 fakk/maps/example/autosprite.map create mode 100644 fakk/maps/example/autosprite.prt create mode 100644 fakk/maps/example/beam.bsp create mode 100644 fakk/maps/example/beam.map create mode 100644 fakk/maps/example/beam.prt create mode 100644 fakk/maps/example/beam.scr create mode 100644 fakk/maps/example/beam1.bsp create mode 100644 fakk/maps/example/beam1.map create mode 100644 fakk/maps/example/beam1.prt create mode 100644 fakk/maps/example/box3.bsp create mode 100644 fakk/maps/example/box3.map create mode 100644 fakk/maps/example/climb.bsp create mode 100644 fakk/maps/example/climb.map create mode 100644 fakk/maps/example/climb.prt create mode 100644 fakk/maps/example/cover.bsp create mode 100644 fakk/maps/example/cover.map create mode 100644 fakk/maps/example/cover.prt create mode 100644 fakk/maps/example/cover.pth create mode 100644 fakk/maps/example/door.bsp create mode 100644 fakk/maps/example/door.map create mode 100644 fakk/maps/example/door.prt create mode 100644 fakk/maps/example/door.pth create mode 100644 fakk/maps/example/door.scr create mode 100644 fakk/maps/example/doors.bsp create mode 100644 fakk/maps/example/doors.map create mode 100644 fakk/maps/example/doors.prt create mode 100644 fakk/maps/example/earthquake.bsp create mode 100644 fakk/maps/example/earthquake.map create mode 100644 fakk/maps/example/earthquake.prt create mode 100644 fakk/maps/example/explodeobject.bsp create mode 100644 fakk/maps/example/explodeobject.map create mode 100644 fakk/maps/example/explodeobject.prt create mode 100644 fakk/maps/example/exploder.bsp create mode 100644 fakk/maps/example/exploder.map create mode 100644 fakk/maps/example/exploder.prt create mode 100644 fakk/maps/example/explodingwall.bsp create mode 100644 fakk/maps/example/explodingwall.map create mode 100644 fakk/maps/example/explodingwall.prt create mode 100644 fakk/maps/example/fallingrock.bsp create mode 100644 fakk/maps/example/fallingrock.map create mode 100644 fakk/maps/example/fallingrock.prt create mode 100644 fakk/maps/example/fulcrum.bsp create mode 100644 fakk/maps/example/fulcrum.map create mode 100644 fakk/maps/example/fulcrum.prt create mode 100644 fakk/maps/example/fulcrum.scr create mode 100644 fakk/maps/example/funcspawn.bsp create mode 100644 fakk/maps/example/funcspawn.map create mode 100644 fakk/maps/example/funcspawn.prt create mode 100644 fakk/maps/example/gibs_and_health.bsp create mode 100644 fakk/maps/example/gibs_and_health.map create mode 100644 fakk/maps/example/gibs_and_health.prt create mode 100644 fakk/maps/example/gibs_and_health.pth create mode 100644 fakk/maps/example/letterbox.bsp create mode 100644 fakk/maps/example/letterbox.map create mode 100644 fakk/maps/example/letterbox.prt create mode 100644 fakk/maps/example/letterbox.pth create mode 100644 fakk/maps/example/letterbox.scr create mode 100644 fakk/maps/example/multiexploder.bsp create mode 100644 fakk/maps/example/multiexploder.map create mode 100644 fakk/maps/example/multiexploder.prt create mode 100644 fakk/maps/example/patrol.bsp create mode 100644 fakk/maps/example/patrol.map create mode 100644 fakk/maps/example/patrol.prt create mode 100644 fakk/maps/example/patrol.pth create mode 100644 fakk/maps/example/patrol.scr create mode 100644 fakk/maps/example/pickup.bsp create mode 100644 fakk/maps/example/pickup.map create mode 100644 fakk/maps/example/pickup.prt create mode 100644 fakk/maps/example/pickup.pth create mode 100644 fakk/maps/example/pickup.scr create mode 100644 fakk/maps/example/pushobject.bsp create mode 100644 fakk/maps/example/pushobject.map create mode 100644 fakk/maps/example/pushobject.prt create mode 100644 fakk/maps/example/rain.bsp create mode 100644 fakk/maps/example/rain.map create mode 100644 fakk/maps/example/rain.prt create mode 100644 fakk/maps/example/rain.pth create mode 100644 fakk/maps/example/runthrough.bsp create mode 100644 fakk/maps/example/runthrough.map create mode 100644 fakk/maps/example/runthrough.prt create mode 100644 fakk/maps/example/scriptgravity.bsp create mode 100644 fakk/maps/example/scriptgravity.map create mode 100644 fakk/maps/example/scriptgravity.prt create mode 100644 fakk/maps/example/scriptgravity.scr create mode 100644 fakk/maps/example/sinkobject.bsp create mode 100644 fakk/maps/example/sinkobject.map create mode 100644 fakk/maps/example/sinkobject.prt create mode 100644 fakk/maps/example/teleporter.bsp create mode 100644 fakk/maps/example/teleporter.map create mode 100644 fakk/maps/example/teleporter.prt create mode 100644 fakk/maps/example/useanim.bsp create mode 100644 fakk/maps/example/useanim.map create mode 100644 fakk/maps/example/useanim.prt create mode 100644 fakk/maps/example/useobject.bsp create mode 100644 fakk/maps/example/useobject.map create mode 100644 fakk/maps/example/useobject.prt create mode 100644 fakk/maps/example/vehicle.bsp create mode 100644 fakk/maps/example/vehicle.map create mode 100644 fakk/maps/example/vehicle.prt create mode 100644 fakk/maps/example/zoo.bsp create mode 100644 fakk/maps/example/zoo.map create mode 100644 fakk/scripts/fakk.qe4 create mode 100644 fakk/scripts/surfacelist.txt create mode 100644 license.rtf create mode 100644 readme.txt create mode 100644 source/source/cgame/Linklist.h create mode 100644 source/source/cgame/cg_beam.cpp create mode 100644 source/source/cgame/cg_class.cpp create mode 100644 source/source/cgame/cg_class.h create mode 100644 source/source/cgame/cg_commands.cpp create mode 100644 source/source/cgame/cg_commands.h create mode 100644 source/source/cgame/cg_consolecmds.c create mode 100644 source/source/cgame/cg_container.h create mode 100644 source/source/cgame/cg_drawtools.cpp create mode 100644 source/source/cgame/cg_ents.c create mode 100644 source/source/cgame/cg_event.c create mode 100644 source/source/cgame/cg_lightstyles.cpp create mode 100644 source/source/cgame/cg_listener.cpp create mode 100644 source/source/cgame/cg_listener.h create mode 100644 source/source/cgame/cg_local.h create mode 100644 source/source/cgame/cg_main.c create mode 100644 source/source/cgame/cg_marks.c create mode 100644 source/source/cgame/cg_modelanim.c create mode 100644 source/source/cgame/cg_player.cpp create mode 100644 source/source/cgame/cg_playerstate.c create mode 100644 source/source/cgame/cg_predict.c create mode 100644 source/source/cgame/cg_public.h create mode 100644 source/source/cgame/cg_servercmds.c create mode 100644 source/source/cgame/cg_snapshot.c create mode 100644 source/source/cgame/cg_sound.cpp create mode 100644 source/source/cgame/cg_specialfx.cpp create mode 100644 source/source/cgame/cg_swipe.cpp create mode 100644 source/source/cgame/cg_syscalls.c create mode 100644 source/source/cgame/cg_testemitter.cpp create mode 100644 source/source/cgame/cg_vector.h create mode 100644 source/source/cgame/cg_view.c create mode 100644 source/source/cgame/cgame.def create mode 100644 source/source/cgame/cgame.dsp create mode 100644 source/source/cgame/cgame.dsw create mode 100644 source/source/cgame/class.cpp create mode 100644 source/source/cgame/class.h create mode 100644 source/source/cgame/container.cpp create mode 100644 source/source/cgame/container.h create mode 100644 source/source/cgame/listener.cpp create mode 100644 source/source/cgame/listener.h create mode 100644 source/source/cgame/script.cpp create mode 100644 source/source/cgame/script.h create mode 100644 source/source/cgame/str.cpp create mode 100644 source/source/cgame/str.h create mode 100644 source/source/cgame/tr_types.h create mode 100644 source/source/cgame/vector.h create mode 100644 source/source/fgame/PlayerStart.cpp create mode 100644 source/source/fgame/PlayerStart.h create mode 100644 source/source/fgame/actor.cpp create mode 100644 source/source/fgame/actor.h create mode 100644 source/source/fgame/ammo.cpp create mode 100644 source/source/fgame/ammo.h create mode 100644 source/source/fgame/animate.cpp create mode 100644 source/source/fgame/animate.h create mode 100644 source/source/fgame/archive.cpp create mode 100644 source/source/fgame/archive.h create mode 100644 source/source/fgame/armor.cpp create mode 100644 source/source/fgame/armor.h create mode 100644 source/source/fgame/b_files.cpp create mode 100644 source/source/fgame/b_local.h create mode 100644 source/source/fgame/b_nav.cpp create mode 100644 source/source/fgame/b_navgen.cpp create mode 100644 source/source/fgame/beam.cpp create mode 100644 source/source/fgame/beam.h create mode 100644 source/source/fgame/behavior.cpp create mode 100644 source/source/fgame/behavior.h create mode 100644 source/source/fgame/bg_local.h create mode 100644 source/source/fgame/bg_misc.c create mode 100644 source/source/fgame/bg_pmove.c create mode 100644 source/source/fgame/bg_public.h create mode 100644 source/source/fgame/bspline.cpp create mode 100644 source/source/fgame/bspline.h create mode 100644 source/source/fgame/bullet.cpp create mode 100644 source/source/fgame/bullet.h create mode 100644 source/source/fgame/camera.cpp create mode 100644 source/source/fgame/camera.h create mode 100644 source/source/fgame/characterstate.cpp create mode 100644 source/source/fgame/characterstate.h create mode 100644 source/source/fgame/class.cpp create mode 100644 source/source/fgame/class.h create mode 100644 source/source/fgame/clusterbomb.cpp create mode 100644 source/source/fgame/clusterbomb.h create mode 100644 source/source/fgame/container.cpp create mode 100644 source/source/fgame/container.h create mode 100644 source/source/fgame/crossbow.cpp create mode 100644 source/source/fgame/crossbow.h create mode 100644 source/source/fgame/deadbody.cpp create mode 100644 source/source/fgame/deadbody.h create mode 100644 source/source/fgame/debuglines.cpp create mode 100644 source/source/fgame/debuglines.h create mode 100644 source/source/fgame/decals.cpp create mode 100644 source/source/fgame/decals.h create mode 100644 source/source/fgame/doors.cpp create mode 100644 source/source/fgame/doors.h create mode 100644 source/source/fgame/earthquake.cpp create mode 100644 source/source/fgame/earthquake.h create mode 100644 source/source/fgame/edenwater.cpp create mode 100644 source/source/fgame/edenwater.h create mode 100644 source/source/fgame/entity.cpp create mode 100644 source/source/fgame/entity.h create mode 100644 source/source/fgame/events.h create mode 100644 source/source/fgame/explosion.cpp create mode 100644 source/source/fgame/explosion.h create mode 100644 source/source/fgame/fgame.dsp create mode 100644 source/source/fgame/fgame.dsw create mode 100644 source/source/fgame/fists.cpp create mode 100644 source/source/fgame/fists.h create mode 100644 source/source/fgame/flamethrower.cpp create mode 100644 source/source/fgame/flamethrower.h create mode 100644 source/source/fgame/flashbang.cpp create mode 100644 source/source/fgame/flashbang.h create mode 100644 source/source/fgame/g_local.h create mode 100644 source/source/fgame/g_main.cpp create mode 100644 source/source/fgame/g_main.h create mode 100644 source/source/fgame/g_phys.cpp create mode 100644 source/source/fgame/g_phys.h create mode 100644 source/source/fgame/g_public.h create mode 100644 source/source/fgame/g_spawn.cpp create mode 100644 source/source/fgame/g_spawn.h create mode 100644 source/source/fgame/g_utils.cpp create mode 100644 source/source/fgame/g_utils.h create mode 100644 source/source/fgame/game.cpp create mode 100644 source/source/fgame/game.def create mode 100644 source/source/fgame/game.h create mode 100644 source/source/fgame/gamecmds.cpp create mode 100644 source/source/fgame/gamecmds.h create mode 100644 source/source/fgame/gamecvars.cpp create mode 100644 source/source/fgame/gamecvars.h create mode 100644 source/source/fgame/gamescript.cpp create mode 100644 source/source/fgame/gamescript.h create mode 100644 source/source/fgame/gibs.cpp create mode 100644 source/source/fgame/gibs.h create mode 100644 source/source/fgame/goo.cpp create mode 100644 source/source/fgame/goo.h create mode 100644 source/source/fgame/gravpath.cpp create mode 100644 source/source/fgame/gravpath.h create mode 100644 source/source/fgame/health.cpp create mode 100644 source/source/fgame/health.h create mode 100644 source/source/fgame/hornofconjuring.cpp create mode 100644 source/source/fgame/hornofconjuring.h create mode 100644 source/source/fgame/inventoryitem.cpp create mode 100644 source/source/fgame/inventoryitem.h create mode 100644 source/source/fgame/ipfilter.cpp create mode 100644 source/source/fgame/ipfilter.h create mode 100644 source/source/fgame/item.cpp create mode 100644 source/source/fgame/item.h create mode 100644 source/source/fgame/level.cpp create mode 100644 source/source/fgame/level.h create mode 100644 source/source/fgame/light.cpp create mode 100644 source/source/fgame/light.h create mode 100644 source/source/fgame/linklist.h create mode 100644 source/source/fgame/listener.cpp create mode 100644 source/source/fgame/listener.h create mode 100644 source/source/fgame/misc.cpp create mode 100644 source/source/fgame/misc.h create mode 100644 source/source/fgame/mover.cpp create mode 100644 source/source/fgame/mover.h create mode 100644 source/source/fgame/nature.cpp create mode 100644 source/source/fgame/nature.h create mode 100644 source/source/fgame/navigate.cpp create mode 100644 source/source/fgame/navigate.h create mode 100644 source/source/fgame/object.cpp create mode 100644 source/source/fgame/object.h create mode 100644 source/source/fgame/path.cpp create mode 100644 source/source/fgame/path.h create mode 100644 source/source/fgame/player.cpp create mode 100644 source/source/fgame/player.h create mode 100644 source/source/fgame/player_combat.cpp create mode 100644 source/source/fgame/player_util.cpp create mode 100644 source/source/fgame/portal.cpp create mode 100644 source/source/fgame/portal.h create mode 100644 source/source/fgame/powerups.cpp create mode 100644 source/source/fgame/powerups.h create mode 100644 source/source/fgame/prioritystack.h create mode 100644 source/source/fgame/q_math.c create mode 100644 source/source/fgame/q_mathsys.c create mode 100644 source/source/fgame/q_shared.c create mode 100644 source/source/fgame/q_shared.h create mode 100644 source/source/fgame/queue.h create mode 100644 source/source/fgame/rope.cpp create mode 100644 source/source/fgame/rope.h create mode 100644 source/source/fgame/script.cpp create mode 100644 source/source/fgame/script.h create mode 100644 source/source/fgame/scriptmaster.cpp create mode 100644 source/source/fgame/scriptmaster.h create mode 100644 source/source/fgame/scriptslave.cpp create mode 100644 source/source/fgame/scriptslave.h create mode 100644 source/source/fgame/scriptvariable.cpp create mode 100644 source/source/fgame/scriptvariable.h create mode 100644 source/source/fgame/sentient.cpp create mode 100644 source/source/fgame/sentient.h create mode 100644 source/source/fgame/shield.cpp create mode 100644 source/source/fgame/shield.h create mode 100644 source/source/fgame/soulsucker.cpp create mode 100644 source/source/fgame/soulsucker.h create mode 100644 source/source/fgame/soundman.cpp create mode 100644 source/source/fgame/soundman.h create mode 100644 source/source/fgame/spawners.cpp create mode 100644 source/source/fgame/spawners.h create mode 100644 source/source/fgame/specialfx.cpp create mode 100644 source/source/fgame/specialfx.h create mode 100644 source/source/fgame/stack.h create mode 100644 source/source/fgame/steering.cpp create mode 100644 source/source/fgame/steering.h create mode 100644 source/source/fgame/str.cpp create mode 100644 source/source/fgame/str.h create mode 100644 source/source/fgame/surfaceflags.h create mode 100644 source/source/fgame/sword.cpp create mode 100644 source/source/fgame/sword.h create mode 100644 source/source/fgame/testweapon.cpp create mode 100644 source/source/fgame/testweapon.h create mode 100644 source/source/fgame/trigger.cpp create mode 100644 source/source/fgame/trigger.h create mode 100644 source/source/fgame/ulinklist.h create mode 100644 source/source/fgame/umap.h create mode 100644 source/source/fgame/vector.h create mode 100644 source/source/fgame/vehicle.cpp create mode 100644 source/source/fgame/vehicle.h create mode 100644 source/source/fgame/viewthing.cpp create mode 100644 source/source/fgame/viewthing.h create mode 100644 source/source/fgame/weapon.cpp create mode 100644 source/source/fgame/weapon.h create mode 100644 source/source/fgame/weaputils.cpp create mode 100644 source/source/fgame/weaputils.h create mode 100644 source/source/fgame/worldspawn.cpp create mode 100644 source/source/fgame/worldspawn.h create mode 100644 source/source/qcommon/alias.h create mode 100644 source/source/qcommon/cm_public.h create mode 100644 source/source/qcommon/qcommon.h create mode 100644 source/source/qcommon/qfiles.h create mode 100644 source/source/win32/win_bounds.cpp create mode 100644 source/utils/common/aselib.c create mode 100644 source/utils/common/aselib.h create mode 100644 source/utils/common/cmdlib.c create mode 100644 source/utils/common/cmdlib.h create mode 100644 source/utils/common/imagelib.c create mode 100644 source/utils/common/imagelib.h create mode 100644 source/utils/common/mathlib.c create mode 100644 source/utils/common/mathlib.h create mode 100644 source/utils/common/polylib.c create mode 100644 source/utils/common/polylib.h create mode 100644 source/utils/common/polyset.h create mode 100644 source/utils/common/qfiles.h create mode 100644 source/utils/common/scriplib.c create mode 100644 source/utils/common/scriplib.h create mode 100644 source/utils/common/surfaceflags.h create mode 100644 source/utils/dlgedit/dlgedit.cpp create mode 100644 source/utils/dlgedit/dlgedit.dsp create mode 100644 source/utils/dlgedit/dlgedit.dsw create mode 100644 source/utils/dlgedit/dlgedit.h create mode 100644 source/utils/dlgedit/dlgedit.rc create mode 100644 source/utils/dlgedit/dlgeditdlg.cpp create mode 100644 source/utils/dlgedit/dlgeditdlg.h create mode 100644 source/utils/dlgedit/drawobj.cpp create mode 100644 source/utils/dlgedit/drawobj.h create mode 100644 source/utils/dlgedit/menuprops.cpp create mode 100644 source/utils/dlgedit/menuprops.h create mode 100644 source/utils/dlgedit/mousehandle.cpp create mode 100644 source/utils/dlgedit/mousehandle.h create mode 100644 source/utils/dlgedit/objprops.cpp create mode 100644 source/utils/dlgedit/objprops.h create mode 100644 source/utils/dlgedit/readme.txt create mode 100644 source/utils/dlgedit/res/dlgedit.ico create mode 100644 source/utils/dlgedit/res/dlgedit.rc2 create mode 100644 source/utils/dlgedit/res/vssver.scc create mode 100644 source/utils/dlgedit/resource.h create mode 100644 source/utils/dlgedit/stdafx.cpp create mode 100644 source/utils/dlgedit/stdafx.h create mode 100644 source/utils/fontgen/fontgen.cpp create mode 100644 source/utils/fontgen/fontgen.dsp create mode 100644 source/utils/fontgen/fontgen.dsw create mode 100644 source/utils/fontgen/fontgen.h create mode 100644 source/utils/ftxconvert/ftxconvert.c create mode 100644 source/utils/ftxconvert/ftxconvert.dsp create mode 100644 source/utils/ftxconvert/ftxconvert.dsw create mode 100644 source/utils/lipsync/code/cmdlib.c create mode 100644 source/utils/lipsync/code/cmdlib.h create mode 100644 source/utils/lipsync/code/lipsync.c create mode 100644 source/utils/lipsync/code/mathlib.c create mode 100644 source/utils/lipsync/code/mathlib.h create mode 100644 source/utils/lipsync/code/qfiles.h create mode 100644 source/utils/lipsync/code/scriplib.c create mode 100644 source/utils/lipsync/code/scriplib.h create mode 100644 source/utils/lipsync/lipsync.dsp create mode 100644 source/utils/lipsync/lipsync.dsw create mode 100644 source/utils/lw2tan/calclod.cpp create mode 100644 source/utils/lw2tan/calclod.h create mode 100644 source/utils/lw2tan/list.h create mode 100644 source/utils/lw2tan/lw2tan.c create mode 100644 source/utils/lw2tan/lw2tan.dsp create mode 100644 source/utils/lw2tan/lw2tan.dsw create mode 100644 source/utils/lw2tan/lwolib.c create mode 100644 source/utils/lw2tan/lwolib.h create mode 100644 source/utils/lw2tan/md3lib.c create mode 100644 source/utils/lw2tan/md3lib.h create mode 100644 source/utils/lw2tan/models.c create mode 100644 source/utils/lw2tan/models.h create mode 100644 source/utils/lw2tan/progmesh.cpp create mode 100644 source/utils/lw2tan/progmesh.h create mode 100644 source/utils/lw2tan/stripper.c create mode 100644 source/utils/lw2tan/tikidata.h create mode 100644 source/utils/lw2tan/uv.c create mode 100644 source/utils/lw2tan/uv.h create mode 100644 source/utils/lw2tan/vector.cpp create mode 100644 source/utils/lw2tan/vector.h create mode 100644 source/utils/lw2tan/writetan.c create mode 100644 source/utils/lw2tan/writetan.h create mode 100644 source/utils/max2plugins/animout/animout.cpp create mode 100644 source/utils/max2plugins/animout/animout.def create mode 100644 source/utils/max2plugins/animout/animout.dsp create mode 100644 source/utils/max2plugins/animout/animout.dsw create mode 100644 source/utils/max2plugins/animout/animout.rc create mode 100644 source/utils/max2plugins/animout/core.lib create mode 100644 source/utils/max2plugins/animout/geom.lib create mode 100644 source/utils/max2plugins/animout/mesh.lib create mode 100644 source/utils/max2plugins/animout/resource.h create mode 100644 source/utils/max2plugins/animout/util.lib create mode 100644 source/utils/max2plugins/skelout/container.h create mode 100644 source/utils/max2plugins/skelout/core.lib create mode 100644 source/utils/max2plugins/skelout/dllmain.cpp create mode 100644 source/utils/max2plugins/skelout/dllmain.h create mode 100644 source/utils/max2plugins/skelout/enumobjects.cpp create mode 100644 source/utils/max2plugins/skelout/enumobjects.h create mode 100644 source/utils/max2plugins/skelout/geom.lib create mode 100644 source/utils/max2plugins/skelout/mesh.lib create mode 100644 source/utils/max2plugins/skelout/resource.h create mode 100644 source/utils/max2plugins/skelout/skelout.cpp create mode 100644 source/utils/max2plugins/skelout/skelout.def create mode 100644 source/utils/max2plugins/skelout/skelout.dsp create mode 100644 source/utils/max2plugins/skelout/skelout.dsw create mode 100644 source/utils/max2plugins/skelout/skelout.h create mode 100644 source/utils/max2plugins/skelout/str.cpp create mode 100644 source/utils/max2plugins/skelout/str.h create mode 100644 source/utils/max2plugins/skelout/util.cpp create mode 100644 source/utils/max2plugins/skelout/util.h create mode 100644 source/utils/max2plugins/skelout/util.lib create mode 100644 source/utils/max2plugins/uvout/core.lib create mode 100644 source/utils/max2plugins/uvout/geom.lib create mode 100644 source/utils/max2plugins/uvout/mesh.lib create mode 100644 source/utils/max2plugins/uvout/util.lib create mode 100644 source/utils/max2plugins/uvout/uvout.cpp create mode 100644 source/utils/max2plugins/uvout/uvout.def create mode 100644 source/utils/max2plugins/uvout/uvout.dsp create mode 100644 source/utils/max2plugins/uvout/uvout.dsw create mode 100644 source/utils/max2skl/container.h create mode 100644 source/utils/max2skl/fixmirror.cpp create mode 100644 source/utils/max2skl/fixmirror.h create mode 100644 source/utils/max2skl/list.h create mode 100644 source/utils/max2skl/max2skl.cpp create mode 100644 source/utils/max2skl/max2skl.dsp create mode 100644 source/utils/max2skl/max2skl.dsw create mode 100644 source/utils/max2skl/max2skl.h create mode 100644 source/utils/max2skl/progmesh.cpp create mode 100644 source/utils/max2skl/progmesh.h create mode 100644 source/utils/max2skl/script.cpp create mode 100644 source/utils/max2skl/script.h create mode 100644 source/utils/max2skl/str.cpp create mode 100644 source/utils/max2skl/str.h create mode 100644 source/utils/max2skl/streams.cpp create mode 100644 source/utils/max2skl/streams.h create mode 100644 source/utils/max2skl/stripper.c create mode 100644 source/utils/max2skl/ucasts.h create mode 100644 source/utils/max2skl/ucommon.cpp create mode 100644 source/utils/max2skl/ucommon.h create mode 100644 source/utils/max2skl/ueuler.cpp create mode 100644 source/utils/max2skl/ueuler.h create mode 100644 source/utils/max2skl/umath.cpp create mode 100644 source/utils/max2skl/umath.h create mode 100644 source/utils/max2skl/umatrix.cpp create mode 100644 source/utils/max2skl/umatrix.h create mode 100644 source/utils/max2skl/umem.h create mode 100644 source/utils/max2skl/uparse.cpp create mode 100644 source/utils/max2skl/uparse.h create mode 100644 source/utils/max2skl/uplane3.cpp create mode 100644 source/utils/max2skl/uplane3.h create mode 100644 source/utils/max2skl/uquat.cpp create mode 100644 source/utils/max2skl/uquat.h create mode 100644 source/utils/max2skl/usys.h create mode 100644 source/utils/max2skl/uvector3.cpp create mode 100644 source/utils/max2skl/uvector3.h create mode 100644 source/utils/max2skl/vector.cpp create mode 100644 source/utils/max2skl/vector.h create mode 100644 source/utils/max2tan/calclod.cpp create mode 100644 source/utils/max2tan/calclod.h create mode 100644 source/utils/max2tan/list.h create mode 100644 source/utils/max2tan/max2tan.c create mode 100644 source/utils/max2tan/max2tan.dsp create mode 100644 source/utils/max2tan/max2tan.dsw create mode 100644 source/utils/max2tan/models.c create mode 100644 source/utils/max2tan/models.h create mode 100644 source/utils/max2tan/progmesh.cpp create mode 100644 source/utils/max2tan/progmesh.h create mode 100644 source/utils/max2tan/stripper.c create mode 100644 source/utils/max2tan/tikidata.h create mode 100644 source/utils/max2tan/vector.cpp create mode 100644 source/utils/max2tan/vector.h create mode 100644 source/utils/max3plugins/animout/animout.cpp create mode 100644 source/utils/max3plugins/animout/animout.def create mode 100644 source/utils/max3plugins/animout/animout.dsp create mode 100644 source/utils/max3plugins/animout/animout.dsw create mode 100644 source/utils/max3plugins/animout/animout.rc create mode 100644 source/utils/max3plugins/animout/resource.h create mode 100644 source/utils/max3plugins/skelout/container.h create mode 100644 source/utils/max3plugins/skelout/dllmain.cpp create mode 100644 source/utils/max3plugins/skelout/dllmain.h create mode 100644 source/utils/max3plugins/skelout/enumobjects.cpp create mode 100644 source/utils/max3plugins/skelout/enumobjects.h create mode 100644 source/utils/max3plugins/skelout/resource.h create mode 100644 source/utils/max3plugins/skelout/skelout.cpp create mode 100644 source/utils/max3plugins/skelout/skelout.def create mode 100644 source/utils/max3plugins/skelout/skelout.dsp create mode 100644 source/utils/max3plugins/skelout/skelout.dsw create mode 100644 source/utils/max3plugins/skelout/skelout.h create mode 100644 source/utils/max3plugins/skelout/skelout.rc create mode 100644 source/utils/max3plugins/skelout/str.cpp create mode 100644 source/utils/max3plugins/skelout/str.h create mode 100644 source/utils/max3plugins/skelout/util.cpp create mode 100644 source/utils/max3plugins/skelout/util.h create mode 100644 source/utils/max3plugins/uvout/uvout.cpp create mode 100644 source/utils/max3plugins/uvout/uvout.def create mode 100644 source/utils/max3plugins/uvout/uvout.dsp create mode 100644 source/utils/max3plugins/uvout/uvout.dsw create mode 100644 source/utils/tgaconvert/tgaconvert.c create mode 100644 source/utils/tgaconvert/tgaconvert.dsp create mode 100644 source/utils/tgaconvert/tgaconvert.dsw diff --git a/bin/Mp3dec.asi b/bin/Mp3dec.asi new file mode 100644 index 0000000000000000000000000000000000000000..89b7eb02bdd303e52c5ae9a9db5a2a779187646c GIT binary patch literal 126976 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

28jsT2?kswy68PvVDP2ejuT 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�I!BQ$p$k35qM`_fx=A#@7 zZGd-0!QnF~jk?i%kVqsR)8HHRd+zB(jKBe&g+fxeg;$zP#Fc16;okS3-AJ7Tw53tEY z^>2B~t8^}b&ESOh;MnhlJzXQPzImOI;l2YG#SSmPW5EOV5KqJs+H z4UZe<%~M{bQwveN^FU?<8J&O-s@KJj^5=*V{<%Oj0MW`uf6vfS2Jp9y^5-e9(z%8x z{)<3{cHBy5B)~s$ls`v|@LvittL$B3JrzpTb zeUv{(jPNf2q6vt!y8`}n90L5Y01?&?PkEKjMnv&n4KnzNRyt<^{&}PPIbwvr6Nqpc zt#p(E{OQ01_!o`x=P9q!>4_-*H6Vj8X{D1G;J3l^L|4NX-54O@-4e+lT<)e396h(e8bFy9IT#{2R3o~^7R4KWoa`P}z0MNhn+=QzQyZ89 zOcTa3l=6YpQD%s)NsMAfP9JFVjo_9r$_*$HZizqvn5L3tsPhNbj&ehEO-d9u>LP%K z5l!{F%294WiEv8+3cxhUEJMXTkUPo^(KYE&+^9nV+I-mmx<#YhfD+-B4wTXJBV2tD z02A=A0aqis#vH}fG^)O&QKrC%Fg1f|SbfOl5M>D0H%2}Q(u&9lc^7AwD`9!O1AOp8$HLu)raCdU>z+n zqHBy%B{qzzZ`o*pfe|UNF{C~yzKqlt#cVS50gc&96u0r}BYPqBp)}Fl5S?JlVf96E z8*j^`K4_k)FG{w_)CaWr@LubpxQ$mIf$e<7NhkdMuuy#?dLDE{D=}F(go!{euEQ8& z{dt#AcePN5sRv&*LzhMCkl4g1hecw=o3N`_!VWQQz?_1Z2)*dSN}$g&C<)^`VGtWA2uPOF?$J|1+hR6$yk;{ zlPjSn$XZto_K;Qh6Ihoef-PWd856p|ve)_}d@=*}btOrBGa@?y(*uxvh%Ce2>MxM~ z-@pzFG;G9pFT8n4s1BV}gaoy2mus;{l6xd~DW+LX^OTkXyyl6fH+qSEs2Te)ms21 z!tE>c76m8{w9IT7m;x(P@vw+ z=`L0S71jMk-Gvh<%Yl*r{iTkT4bd^Z?OLFszQ3rur~%68St{T{Gi4}Gv{OcOONvY16r5EpT&ivA;K|qndJL_ zgbSn8>UHKx;12ld&F>R$@t$&>H%-QB8(51#O@= z8z%`g8P)_!i~eaMJX}(gW?kw8_*W^wk2l&>Y6k#SzW^hn5{q)liCVwfY};pXfj)a4KQ1UrY5yj*uZR<0x1wCKGxLu zIW4~7`&I2=;Bz)`W9ownv65f?0NPAMf21E=7i|kveq0x|bt)gO$!+;7nefFd04BTu z+G5@SwiYP?YMx1el3|iJPK6<_rGsW9a_;HhfCQ ze*(kqqaU`nwbb6FAU9kz5szv{UY3Ne~|!75vm5DQ@;$MtC9Bnas=9O z0?<8(tmgI|9Ye~9M@=u z)&s?W^R);GjZc$gn*b6T>C0jN%2UrExFOFb)E}=GJoi&idCLE7Al0A4FMp{0?zvl0 z42|H~g)})X7c#wu@4#pV{*HJA_{*_CzlcxJ{E*}`_-_H|OqT6xgG-wcNIvFcUu_D! zg`^n<*AU`ZV$=kFpWGd|I=TB+`eoDU_~4C;6aO3kl#Nm9xs{}C_>kcER>{zM*Ockt z?rOuQbzXN5I;De!P!lO>sm<_I-@h3ApOAbVrp0~t8~S409Zve`kRh;R`48NM1I47v zaE1oKa~9n~AAY3KW@egk&h@V))l}I8@5!lWvuxMYBkH{R=xwW^gT_D5@07P;dZihl z@2;yKH~v9r+z9?^{{WS~PYJU&xu&ZA0T+Qj9;l{=&yUX&0kN@L@U*gA`;?=%^@A-J z?tc(NuR5Zr|4Z}KpZlM2U4!4Z0Q3UAn>%t$WofY&eC>ToJAM|z5aX%~&eY-4U8^+D zA0eZY@I@Jqcd^j;-;mF9l!V_YihB>wTZ2gP-9|~K=X-G%=M{v4GnazV z^TV^irW>~W{0=1g17PTX=t|svXTohZEHJ3w4#=vQMf;5SOzE5~RK_QBSX$kU!8n4= z(Hn36WR^?szZ2;G1w?o|_ypcg_682%P%Hfcd5PpQF2p;do-_D4*ttZd3Cwa|pkIi+ z5bL`6xe>^L&rw~muw+3HpCEJ^5%3#OdHC6S9r(y4yV>0I4O1I)~6;p&!?JPF}WMAv}ZIP zZZ^5jFm8R3-^qFAVI7K!l9HMV3*EH_P0(d>UMD+-3;a3P!lgNkix=Z-clfpte&sM% z*WE5VOa=bMqac%L=qBp=xqHZL7L+)@C6$_1YUgFh!|*lvTl{_f!4Zqx)lS%W!|Tyyi-&ebw?O%g$cV#Na27&t8!Jgyd-~ zdD@s{&0_rGl@a#Z9#%jxKA>bOS?K)sb6(^vEyYKd?jUWXwYzel2Pzhc^9RYdUz1e7 zEJhQcpBplVRk4*+yA)qBgD$dl+V+Slv~Lyo4FHBT@VRU1euw5Zxi$u9_>{hBRm?(v z3p$R)`==%?&I!b7hoPJdN?n80ZDc@;o2N=^bUBMXXKE8d;yQI_j|HZjJ(hN?CRRGO zV4cC>JOO)H%L=&m(6oQb$sxW0irAwYaW|mN@cUDJYYhIQP&`^hUxlG>3Pwd`=v?#z?I=dr8V(+;|Je+^>&go0 z>7|gS{*STsf4%U^4+6T1*MIPh3i0VO67e^5fBkck<1Zrnj!CF!yq+{qZIG!bJ;!^_ z_4qdUY{Cb^o8E@wIt+`YKWP0Tv$q_M>n7GfH#xH*`Pac@THI)4+>5 zHDp#Xz53H+m}>WA$XA4r15a>=>b(V(&Z4Qjud^KzQr71pJTY9 zq1J%Og;sqC-7a?=p*xvk?{T!;eszc(h5C7)O1}u9Yxs~h9oz@jSKw2AQ`9Qkly(fQ z4I1YZHt28f)o(*r$*otqOUH)zY;fkDpX;VDV+&*KK7YM)s$XK<{SS?1 z(x*QN1weDq7_@l2_xe4EQ$uGzp!!H>Z(J`D0(<-P9peypg%P1)&6;O=|9w7oH$%m8AfZ-#s2UIki#L)WPxCQ4p%&wF<#U|H6RBmJh`jZvWv4hR{Sq8e0*_?c{>lPxsAsY23cSXk@=?uir!BFYDbBZyuqFG3v!xa9F#AntR zFe(Pyz)zx6A6cn>99S_Y-{@KaD%Uc=P!x3di=xSC1Vtm|nVbcFWs+v8eWfO#2fj6i z-!%k8R`rxsEI!c0kz!Rp%F}0&_Ls5oBhwep>G@e0#q8L)*mXBF$CK)iM5A};sMN4{ zF|u|gl78GfuY5Z`VG!$uHxGJW6&Ri4CtgZx}Avn{5IRT~y zW;`$(G-?)L6lWIa(&Vf8dIKS*KX;nXqi&Ysh7c-||79d?=;3cjQ@B*_k9BEx5XvJb z%PK7-l9@#MHnLp2xY9}q@sxle6%ss0m$+!KV-T4b!I>uHT;9$mB59EPk+=xo{kp)( zGK}(9X=s92slgl&V`~U&W%HQlPasd{O#d5bwwQ|u!8<4+I5QqlObuv;ups&9oa>ca zKbci5-Ijplx~%7V5yOaZt_@LnwXsrThaxrL9sFMKgGx=k2I`_X#vVLvX)cKTQ(cUPFVAWqtxb$iO+(ydIb$F`oGSgfn&7k`|xXc7AU|zUGWC#(Dc0 zpTRX9Ql>ykn8poKCw|R-Snoc5qongtd1PIeG@X74TGO1X%W=5db!iuBUQ0g83!AP4 zV|ZTi4*yuR60RFimRDWxw&@{dX`<0%K{|9Sl0JSs2L%t1u|N_1`#P)h&g;r5)^$0t!g9(H%z&+-Fa2|TxU#9iGKyYE4)~CPKgQl zW!)Rp+zR{;&1Q9<_NjQs5GY^)SNQ+@cUXWlmpG)}=$uo$&_5fLl7F$I{s(iNHy8U; zL6p|MSe(MpcM|%-;P?FRVd;kiTde&&^+s2BX^;uwuLJgC@p@t>-cVlFsrN%tSd4~E zeF_U%1BghUi4P9HX-1o_)By*JA~VyWjOS>%M!Z9Vbm>B>#ThFN(?nW!j1(-u%qpL3 z3%^Z~KO*az3;a)@T}wmm4oljnkkH_tK@x`XX?a=KM4#x!_kKY&g27_0c!wY2m6tt# z0*@ukYfAYR$zfhl;=V~ExlEX!89T|;Kw-eN!yx_>Oirvd)~DX=`akTw4SbZMB?ln*IM3^97!_6q&rMvVg zYq4V2-LhSt)+%jTO$ZC&Lj`5qps3NZI_YFJND4tB^Zc)K&m;l0yT5ne_j$j}?|1UQ z&-Zn%bIx_Xu5)JE#v&mv^y!V}&CRcyHyJOye)jRU%umLOrj`(}MdRM+YZ)~?kAMFg z|Bk=PEn;Xan@$N#&x=pxE-vo9(U)hu@aEa@@I+i2(_5~ej$Hhvj9lc+|??oOlIaN@0bX$i-HfJEiWek(L-K~T(_ z8b3!QO*q>w1aHbtOm0fY{>N(JM*MnZP_*{OoslN|2D+C0`s8`(cvw0zFa22DdgFfl z2AFp$5whRCV0uEhKX_)N4|LuaZc1lp=pZE*q?q5LjS%xT1iX4!5#2U_Y~C2d80ZAo z5<*^gDdvB?lwepw=)Q`q3DX(=8mc1=OVtEh*gj{@)9GVA8H-x9IXOLe-iA-c@3-zMKyt_Wi;MG$i;GH%i!p_pnD~Pg%ZZzJ%!|3k z*br1ang`geBxfjlcVFZL8>vk>K=SE zE!e=jWEb$3)Gpu+RRbtyEFJ%z&H%g0k^?)5uo&@&@BFRr*#SOU^ROSZ+m8*993Or( zpjFD}`*Mw^ORUpvA2@UVhP;do^sYrJGov|%G*D_inW54A2RN+%lyWtiPvd`d!vahp zxd14_5XL0{B3zkt-!l@^f!HJ1Rxc~Fo#q!s|AnH&9>;7tuPod@W#!GbPf@HEPLLKn z$#5*E+Ue}C+Km+E$9{bqamE+jK#TFJZ9LTxNY!?jUldClv{Y^7zD_tKUdTk5>@Y>K z(@^8Zlt)NLs;cARj$%X&@0+kVK9&|5JVG@qf{1)y1JU@X?z2Y<3>b4!E6I6U$&XJo z4J3jCv2TG1RxftH&K(^Ckj4ZwwYMbpYdDu-AGhqpa*a>!_<{guy$NbgQfxQMfoi4c zk(Av!4?TFk>8$pZo^2ORhbEnEmjL3~b|1iTw%rd9&bH$`1uT-7@#5hU>)1;SB)&|` znlZos7dksON3Z{s6t&DWpahh1ejilT196Y~uW@JSh%n~0MW&kbN>D>8*m9%99BlEz zvj=<+@svfDqNs$jc4E>qNJ)||?4D>okPGmiYv(H{P-q?gEvMtqOPr4DaLj{tWL}Z; zsww9j3hJRFT3iYpk%$V>I!xz5PG)L!8YD0rpP;F$dlyl9B74Y0ARph01wW$&f}PkZ z&E73GUKI1=4_F-~)}6F@+;(0vUO0AkT8R)^WO_pt7gM~Fo04- z3l)3nI)@KL)k16uulEeJRmZ`0P0)Cu$pAN8=05l4}2t%Fdmy9*q_XafaVSDWi5c z{!sW(;*Iyuy}luBS1@BbjwPB#M8#dQR17iXD}sz1e>)w1Ad@zBvuG;-js9>e=K6x^+V9dt9K5% z4N{J-PE`BL!W9E7x>!Iq?Te5$Xzs8#odeRMY9UhCkNE;R)c8*xv|fGV{S7|zhN;*E zm11ecYaB2Iz4OUBi>!Ehs0?YNloYnwS$2aDbB?^6wk8c?aC}E}%H!FsXMT$3?Hu3npp_MwD1Zz11^>K=?_HvU{`}`ZU(8PpXls`R^?c&ed7DeggM)An9opE8 zYLXtpFQNa)I*cC*L-%Co&SRGYz9?6?LSxpUH$E8u=DFWn9;;)_t0)>AVroE(;P=Y< zt;3kDywR1wNdp$GC-DP1)sBa(bJbE=+Xs%EcN-0qz-q%NCi)`ch&ZB1;Y@+uAMO^{ zbn)WQW=aocL{w|Wiv@~x0{tz7No}EI6}ag~%L*LEi_q=#t^XrEZ?rz1$R*$Ywl3fL z3qmWsDKrp-JnYLpTNHDHp>%$?;TQ@6x1v}K;=8QcQQF;>bcqIHMX?v*nph?A5To%8 zag7EbOttP6t&Z`trJNH@8u$DMiXNYm)448pe7n_4k-7UyxZ|UwDE5nCNgc=jwRNwS zXNTFs6ZU7H?QTSFIinlL@u(#{f)*+~7vgr>*05Hkp(Q%MSuJ!wfUpV3k5y@*igW8I zg!4>n2Evq;VL3RuZ2WA^TIYM?1FKLvcjDTEB%N4DJ*@`&!il_~ZWW@{^hX{OBO~HU zIN=Yv;1ao=^SY{ICyvIj&?FOkoRg=uS9J|{tx3A_deO35i|~id^k_h{3uRz%L(}Dy z?*ygceVJSmp+$W@@cZcfslY!>1s>W0qrG-1ULD<$i83&Yekezrf3A%hp=oRs@|#=D z9NQW^Z3(|kT)eo}c{JRc$liWw3Cz-E@WTy<|Ui;v>2$W>_0JReI)=46c+%;a+8I4Vn5hM==o_)6R*%-SWheQQ%#xlov$#o;Xp2@?%#m37n3jNG9{5#;9 ziT{}}yU8y(&A>q*I&r0SkNf2WCNx&ZP1KRwy2UZC(IGLmA+IoAJn<4T5Ah@Z4R1w) z1Ll=E@0wEdH*5+`o?qrKnB9>57G~F1%lY`xE%^ zLo$cL?>pPN9j5!t&k@y)F!v!0ZxHw|4sQCQ{^!%Vy;bPLv7FUr9dqu_xwulw={Fu< zjS4$=fSP_V4QV08@Oi2J<}=SGGJiPkQ14jlz;DSDg0o%=cR8IMiOdao2YbgRGNY5= zy&1R%*3Cuu*9fy6X3R01PJ1>^7h3KWHcodS*_L}9;r-6=0iO7g!Nj98*kD*5N(k?F zgbz4~gr5zD+H8lJju7{f&!#~i#2*bJG#C+P0D1Sp^uU~gISFG;d*W1N+LNb%F<=bX z1MC6z0x{%2(Fg1U_5=HY_~Ec8v8Ilq*v#4M>`!qbK?Tl(nF;eS4BEh=#RuCrQ)!2P z+a*uBfW}L>0am2KM$Ov?qK%UWlKjsc;=lgcnP&%(Z|h;?k~nt)T&}|>(n{6GdAmNw zQ+;%R7KEU{n>+E{595br<8ytCdGG}Jv`*4h6fillD|Ag+<`G7(;g$P92z6?`KU9#tv#B5k<#a1pACM| zkU?(Mj+h@mcvm*qmx-*mpf&&_Qdf7j8sYDOhC5;S5aczT@0@RMi{Yoe**~2g%YtM@ zNbK2R8e=|k7l(&W(67)<%goSo(Y|a@Frw|H#n#(ic#w0@3nze=#9ow)O#xET?t>e*BP85n-%2Jk+->Zz zFgRfvq{a((h5hG?uNpF^C+!4@E*^43lad7n7UX&jbHW-8bqjdpa6yARTGh-mDG z;snoeh(_+-#oY(P9v-4`KlvQyG#vhcQVFGk4bo^wuj1}Q z`4WwDQ(=c_JWTFWE)9ERh{hYqhx)hw#4DH3$mxhVQ{LJz?-Q?Z8i%EF62HJ^r^4w$ zQ?aA(=2FIy$?SVXETDQ{^}5oZ<5ceoW|EKp^?)O`(4UgJ2B*a z;*xTI4NgdQDV zht}bsI<(Hrez)r;HVJ}TKLL-}ix_B2_li(`z|aC{XZ%Hq07?X<^T0%X>?+F_g^UgTAtQrvQG5 z=Q28Y`ER`>?&r!+g8XykKM&bcu*BeXjMgCO>w>)=Ge&;`6$DEjFwL@D?u+DM+q!n@CBmUiNgt=BlNvMbR9gY z&*XEQaJLXVMd{iUA#BE5x6UQ6ekhGmO#FDIT?*3+?KFi`O78vV_VP`IlD8W(r<~i1 zl(GFhNIz``r|3VaPoV^n5GchH+&p1C>3tKMip5t?#)*lU>&r96#2&_E%&|^nLXjq; z?4i>32f{r>S2|=t_Unl2rkUnCQ;EHeh85nI^_w zN;8=$Zc<^Wy8OJV?|KPy##QOzL&8aYA_%0Ml3!CY;YBB$JH{CfYLXu54_5>zi?fm4T z{luB}6Q9_7T%}OOE2a$=<3-7G&o77+`poeKW@dqTU4c2Oz#LsrV0sFIE2@3*Q3u>4 z1>)bXz9OzvkBCFrA9_d9L(#SAbLQhrWDGwVz(GhpmaXA_AAYpFe-ut4`>(?c^tqIkV*cEW469EawcwN{CElX{S&%ucUGz+~@lX6{zh^k!wo)LmZ6@H0W zZL5p~E<&}6Z@p%}z8?27=xUEl`d_1}h4>WPC1JaeQq?U;X?H)Q$e51GoQ|Ma?TlYl zx&AyNU5Q^COJKt;=t6AMRV|h-#3=#aHsl&!w)R;GDR5~gKFU4|61x8eyvsgVc`o2Z z0u?*~gAyo|OlZX=mFQlgX)3Ama_xev74X89xDgX8Z%TNKmwVTLL|g*Tz?VqY zFcq~E0|=L579#$p7i_SOjyYDDbBybx*_r(k$(9wAnO7E=S^@YVfDd5Yd9;i_@1~Q& zh3$O2s@(9p)e*ctRcJTYJTR;_($&e_>7ojYT3q)^LwZ6#DT zuwQzmm^1TADOiB5)$nE%e66(V2pH?hiLK?wWQ{4vt5zH%yLahTFQ5-Uyux zv1ivl#6Tc71zLmO9=}qu8m|;1{8PlI~JD?rL#JBG4yi6?}4r! zW5aeNF@D|vTsVc1dHpjU%sB)ySGpo7^C2hpj4vPoik|c7N{97n&THnQxF%!G5p(7Y zqn?Cd=#4*d+Frk5?hy4OIQ2>I6!ov)u;mi!=ZHK>$(kWX?z6u|YlalLPr{*0xT%Ms zLpEtfa|F3qg}qVjd@3Y;BUl6}+$Ton;B-LDxlal%-8j=D;uxo;(74#vg71c#LQUvu z-ro_O)@yIX!8G~mL0fd%u4!_5{AM1=7oFY3ee6(WBJ8Q!Y36jxlPoYb&>OiXvf#>r z1XNDZY;f@n&5CsE-X${iBe2;@gKh5_&I0XsG*9HpgT-^8iNgJPlq7THB8gj*G4p)k z9W7MFcDh!c?_$AJJ3xUiv}P)J5`I{`$X&v#r9`l%7#*TcOZ)S2S6 zEBOq0Med|xrerU=%CKyTOOVlgoWmk8^^Jn7!teE>U!bYYK$CCs;{5cDkHUrhiAb<7 z?n5IFcOT5wY+@6-RZ~z|l9|D7G ztT%HyDcHzMg1HbZ{y|P>und73MufjBVIB@QgpB_O#T%Q7r*l6Z{v(9<#wMXdTb(#+ zStyxl#j!VGEwk?TMFeZAFFYv`^klbo8*q$V$Elp^vwY!C6OnlXW}3BWGgX__xOrNN z-fvpAQ{A*N^ZLi&$dS&$3#O^Rw}O4atE?Y1BYYw-08gBnSr^AlR{vn)@CxTO*$G>? zqy!5Nc4s2pS8-x#XH)G*CW|*5Y;+xa@80-13jyYyhvxct$e+`6-g{A;6~36e79D?4 z&N-u5hj>bMk|pRMP2&gq0IBOWP7=?(5n0$XW8+aBAVq57XZGNd6|o&W3}g8c`xMM+|^u2)1Ca^H_A2Ku&iIpnfdxhJ(>HLgen? zH96N&lMiAJGmyi(Z_tw*Yv2-*qW6frBiLO)r|||_Zy2A0Sv9f6ru)oWszs=BCv}mbP{w#_ zk?9)lajoMLakvtLVW%q$S7pld!4-MxU=tX06Ej7XTKv3_v*)XOag(F*uN; zi;|5N^yVB|d4QBfXKSv0v|(ta)6r$V6unQwxnv|?43|GOjYal6MV)Ws^r;&=F19td zLiDuEni_PD=o#6iHS)udBqJn{X1#)wM7Sf(9F1a2C5(-3TW!mH{W4 zWR9AQ4IqhXcXSL1!PBp z=u6db!NKntqq&5>Uf;bH)J)DY>%*;C_uSR;&!@*Wo+kYZs4$izJ+4RzT@qHEm)%8~FXzC@Kj-I%CbQsiNW^fv6mA+2>)TL|2V6T*W>C(Go}tpm_7h<* zY(w0ax5NJIvt`c^?a#*NA%QgsY$z3AM-LNHn?fn?t^{J#E65 z{_&oBHr|uKrPia1AA)Mzh92~Z#GOla|e`D1AKR>|TfI zv%UP}g|y>;3~eV*mY1Io2D}`fk>m<=1M9DbULX{UctiJX>aPs< ze`l39m0U-t+aK>rC5EJ4!kQ|47irY9;1$)M#U>!PvI8!1ptjO};i>WlRolJOJBuLtH7 z%t@HzFh^ka!R&#-x%erZi~l$E8#pHtRA4{M1eiP+$c+Ds^&7VLAQxM|p$MPgSE@dS z>o+_HT2K!Zc=K+2cfv4OQhEuW({G@VNGs+47xWu=n#02V=lTuFwC5s=1u*3>H83Vj zBTO^Q-@>3?{!h?vpvNw#urEpCA{+R`Ur|BEIjH41qY1(gkpC(s0 zxbO~$)rpZmJ!NnQhEl^2fc>6$|B)lmbES6B^qXL9 z{03a~CmksBCWzCUZU11L3(nx2@E@I~ZU=zx*Kt<^Ba81LT$r~tYs@Pss?od=i6(Vz zKC+|Mz~lblrw`E)2Gr=d9^MS|pKVn7u+AY zDxOY{-Cz!ORosg&WQ8v=`*ogXcIymN$!?8!pyxLu*bjn(8&WhvdQ~T?(oq3byM@zZ z%b!M6R#YCr{v0GSpSVOSVo#TYWn4e)?r7i?g#V(Fsx-vGtfUb&1xAaw3vnI!l~no2 z18iQ+eT?Q;krH%KpP@A9`bDM{$bhDs>uD1X{Cxtvmp~5}K!2a&bpM31rW+%)(3re1 zJt*-JHxfw46%X7cgf3aY&o7B}NqNxIOizq75f4|EbK1?Nn72fypeKi0otXo%+wcYp z3Sjj`f+yz}m&Cj$=wL#NtC(1{TNN?7))FopNZ>-t&52-FiJd-FqEo3NN#vM@2^cmj zd1+}=FIsT~I~nB>9TYM?ov;}>?#mdNff*p^z!jjos!;6U^!d=ceyEspkq_UPAdYOd zc_~G%qcHIs=g%*;xe32elAAYT)H&cHe~g}Na#Pw`B9C@jpMp;r6syyoCST(8b%|g` z>cIzM8!rMS)cp?Pau&bA6Y&qS*gqc=RZ7kZWDaAo-)6CeW%{X{ca7$4h(?Wu_D zbIzG}oDJxrnK!v9!)T^iTuv}!-Su|SE{}r!n+;DQ2-Q%>Wi zGP1CX(|pAs&Dn2}gN5ARHJ?XY4xYM zN`(7Q2E*F!=y|IoxPRYv$C?u2LBx78%UUg3uR700vZ51n+qy@qr>z3X`a`5nZ2Qyb zWACYlu!@rgLt|N1AX=YT=i5FQeXLu36)QYTYWoo1$Nr?gwm4EGMGzPrCESDNr9maw zmyLBu2`Xk*9@@{9kzz4YEUla~KY}xWGts8rXP+&8Hb&1C6vwLZKN{%8TTKpbe-QsM z6oo7La8s|J886|-i+k+=?_q|D1Ik1|N)-BnFJ!;Icyh5697mf=ZEZ1MWU6F2t=_he zd~NUf)YGI=9~kH*;n^TYobfkaVj-*%8>FDGIM#=x;7g*lEFQ1K3U*OtWU69cY7F-* zphb6+FB;f^`wvjYZ+$Ql=#0#ZK|3GRpf5lsMFPhofuoVYDQt>G0zHu?-$o;J-j6#a z=Vem~omX(J@Vp*$-W&h0T3obo^u6JJ)%gA@YDk$IO8YVCyKsA>7P>Hbou}H_eI4At zbsasD6ZBNOx~Icxywo0!jW@5yIgd9Sa~d0t!;xRRtHyQ2PAW}l{O`jRog{_hPa(O; zyxv9^Qe68BJ1L_XC%Y_kVZ3>J=)$e$gwTa7^MTNXsm2o#Bo(?4SbIh2!cyaj?{Zs( z@nk(ds@>fk=ufk&)$UdxQ7I!$;|WsYNTpkbZ=_~y_%(u9d%LfL9l1{)$uHuJFkWcK zWrF9?cFS-_<-xc&d4cGKcDy)6S8~kjv4Fg~0nMck>&Z|&D-q~xNsl`dfqrl*{$i39 zkD!C?rCM(qU`ReP?<6iXUC4sOF680PT$43S7nI%W48u*hguc$scB zngx7x{~NNkQ%A0AlO=lp(3h6TXr`M=7%k^VXJ4ecDD>HNF)dk-ChD=A*P{WRRZH=T z$h(rh4JKiQ3sxI(=5QVWr*<Xx`l|up9_a`3UR z7uxBuu(JoLtZ`#_)$zx|%nakD!%^{tsF{Cs{l%g*{CGDn!b>mB!FMEh>hhF!erZZP z-qG1{hjku;Biz)>B9n~f6QHL$y>xP5VCBeA)9+l3&WnNH(Qldu`U=oMXq&r_T7>bv zXAu(D2e5yPOFQKCNi@)k^U58#A6OKthK83FIE9Nt`?Sf0u_nj4PG_Kha$#4{=?tV# zE<71@jt^wqMI~69bs%t@_&~3K(IDx=C53R)ab`Z8{nl<$ZsnVk*{>f6^q`Nh_@cXZ z#S@7p`9R<(MT;Mxxdde%`y);-t$D51!o5~-zZHOXrG|G6U(asEJ=?e9KTmxjA#511 z_{eb6QCtui=FG_`l+-}y;>cs}NSUKDlCM~S9!RJW5KuSt^^UEBIRJASX6B!J$F{?q zhnae|ckGQYe-HBmn1wK0E@z-bkjoh*R>woGu_nr?f%f<2(Jva^A7p)!(fj-cNWczHjbKufHX zx=%xtz#*I%iT(bOi;Wk9pW=8o7wiaEe2Na3fw=;+WdL&4=)~>Yqi|?fVe;#3gM&$OT!IZ^d|}FrEn|E<6v@{%7W&S%`Ai+`KM?R?($^}Nif7v#CS9L_3pO`f z!v&(F`EbhR2eu0Wi76-S3{oHoFIl9VHrr0<-dJWx)eg&R6-nogjX4~C|KqmzM0?Hy z#{eAR6Mj!T_Fnk?bLt^Xg@&Aub;Be4{)Nk&+q#`&UJJkf+2@>Hl>SBT9P7vWv$@^$ zprGLyn(sL=^(j3kr9Q>yd?pEmEIH$TparUN5QoP$?C;N@|0dz34}|a!P$D1ziTLlL9XgX@-^l&`7{4YNw*Ealxymd|tz7HhAI&Z%P$cq_OL@ixe&~*;LVCLt zQWV}r6u+Q|ds|HzkpgnS6Mm(6v9q9puGi8DDVBdDTWD?_kj~~wxBwj6sB6b;Bqq!Fb0U3ccdM#ZLa=jCkM9%X@n? zmVv2jXP~ZlJ{~UlaCEisob-^H*1XVX8pW|iC`noP!*kt-AbU`+qs|6=qUoy^W7BM( z3*GcnTFvc7^Xur)@Wl~92fpy`#*GwWH`On0QjO^_nrT$V#cQhPQXqtbIWDKe*nkF% zAllnP@>M5S9roCvk+I4_FCX>2jn}+Z4D*N2;0sH5{)hq(hMWHRaO59PzQ{Bf?)qWj z?3b1<$?xr}!yjJk{ype=&SCEdpkzLyc^_O#vd^L^JFGJp*zw3Fr*H7-C!?7bbD)^s zCb1P(9y&>bHQpJ49!wvevcYcg`tz@11aFd0d}N)0V|*?m3?|VaT5n**{`$tir_fB* ze9$5KbT{ef=<)47DAv2rt;RUeY>DGxlsBs$u}Qf3bS3H8T4aVNPHp;`=9*9S%eWy z@DOjZoqoF$Hi(rIaSD2{{provQNV26pffajS+~qgJ;+M?-&h6BqgSV@IvF*h$Z)+ z;N!PSC96&gUrd;{;l-#-b6j-dN=y3{batgkffjE3m59ChDgiymn)WLxmWSAhxxbR) z?d4D6jDnBE_I_Wv#W!r$uMsID%-`l{)&tsPsKU7Hcjb!b{7wTq;!5%Z5;k(b6qzbU z9@WYof>!&HBPCPs$SR$hmBr^vbn1$O{)IGDoXg{dG&VerEV02_9Jq4kPV|4#IyibHLUMhHpTO>rQ z7A)LFi_wdPmiT03s)o1{BEZX<_+=o#N(?b{$&?^zNaMJ=+I^O>pZ zy_MGe*lEQ2y(hK!JymHC4R$_=f*MakD;V-Al7m0)>}cciC7qhPW-=;^LS;OtgX z^1GhAvECmwd8!y3G1(c^Bh#hGbTQ)YeiVWDE&&$h0|x>cH4f+jIa}$8=e0AO`=h99 zsyGc-@bR`Ge+8)z7x9f3W#gaQpe7J*8<j-UM{Rknp-~>jRRbm8Nl+p{~8@Y~aICFg+SLSrq#rl7T1RUf{m#-nU_L z(v{nq#-ndb=Q;(9kez1(Cj}GhU%a}A1Rh5M_m>6#L|RrPxlRh0a-L+NRfZKfiTlO^ zbn8QSzvIqu(>saagmA?>cv$%TMDV(B#rt4+(+7z}PzA#(4+K77p}4m)5%?f3B?9l$ z68jxAYO1D&Yb&k7chm!w5ij&VBeNV<;i7_Qf%O?}Tk`)s1{EbesE=4`AUt5rM~aFE^v zwABNSByQS-xkBQm=lK6E{Qp+|e;fb5o&Vo~|DgS=zpps(6$ifJz*ijjiUVJ9;42P% z#euIl@V|irPhBmrE7Aq#hq(i0I?P;{Dwsx?jWAnbeg^YPn0+wEVcv)7gHaGa6XtH1 zxiB>_--G!p7zY1e0QbOjz`PFg4$Ma|;xz&r1v3t25=;TigD~{B3Ah8M73NKt0T>g; z{_D7hFmE)b`*&lrbRjHFutO&x1Z~sSH(|$xiqIs4UnQ^*9sTtI@4yDuV=(mhUkJ~` zeuVIkVv`^S^S;P#EV1*WeCd1IPCHLZkG@CXb=)iX|KhOQqBR|b;UAHy&&B;&X-nA{9`=!b(TlKwmp{p+PLt!ss%d|)V%xHo@B zLs5P0(u#(L+WP4gOUz(>MNxf4L&XXc0qzexFe@-K`wo1vit$-lS@dzqUvKU@$DMnt zZuse&#=*Pk@kIQ6yv`1S-2wi$wKa)(HqwnV`>#H@!d$kz!e3EeUt8~IOjj72J9Bn% zvF$=uRy4ia1Eu z?UO0qP`PXCDv)sPiiTS7p}b<{vZceqCV5n`x~^iWSy9e8GsHzk{JEX;Cx{%AVU`DL z%w=X(eZ`V;aA@hHmxupyz9b`+FEN*ZTwPi6?G?54%fW!U`r1e8mn`?274^%Pt+}f61~2s;a5u$NL{hHqe>NzFohhehsx+1&uQ09H4f4gQB1Z zQK7ztCd_WT?KUUE{~GOZJq8N z`y|ZmW9H1tpT*eiV`j`EVL>>JV=;GMyk-SkyykY8ELK^MDu-X?^4f9$TU@oKt`-7d z@zN#VZh*a}-1dieCHYs{&I~NAt%rSS#WGHzxnu=fTHC-HmaSk7kJXb1VQ2v>NPrM> zI|U#+1;QVks|exD5zZWIY9G0s0{aw)7W57tx^ zAW{vYU;qq2Zcs1^@|0t4vfDw(+fM8p&nH-4j~U*a>Lz3!O5th{1s)sp(T zwS^?b?pXuk-IV_46JpXAyU%CrUB~?TWo89Y!+ylenqLD+$bOgNf^B6#<$e!T*w&Xh zPm8Ef>^JnCKeY%wkaC$FD5USb!c54Xq*y^2PYHum&aF+6&Wb69U0UK8!j)X=0t#Oi zW=<_!QfG%kh}PkD_^XZwmMm+i2&`UOQAZ;WV_$bXVAjlAu?q5LaD=yI%zCysf5yzk z%PW>IhDfMbOfo-jA|?t$?ijXem!>>Mu?J?{vpBe-zT%N(4Up)IAy_NwD>0}tb_MtQ zBA@BPVv1H*U%L`@RKK{!7Osn{c%#ijr=M)+S6EoOc*)8o%W7!UBlqPE4VR01(2mU|9foHnyx!zwY(7YAp6_uDLlz*L;Z}lrN#V;%h-0QDdvZkV*&vqMv zb#=A%nENyCF_U}T?ytny)^J$>WHcbFPd6tC(CZR?SXs@RH-;NUDcJX>s6_~NBCwGEu!VQvi-6^{-N(@v&+maK5eYR>CQ zEYK?aHkXt9ptj{VF|ncriCwl!oLFkIO%qX~tLTB*B{QZ49$1X#QNL#KB{bvrFuHz* z17pE?5+E=~CxPHR4k#}#-wM4Rq>u`8l!7|k9XzOWpB^p*bX}r9NP#6)8PpScFzB`bS|T33nl0DYyt@EQnK95yb5s;KD@BJiksO`!I08}5AaE%@fQv~Yfgtto0663x0;keNAS%ZRTuKLE zhzH5GVv>m(7IWgeDZgO<-WWa;xVM9&urtA=RlFiB4B#4|QVUP!Qd*IwcYvs+t zDQ!mt@L&spi<9kSoY_u+^9MX=fggC#NFZ|7J6%d0Y$B7&2?Wk;@PIf89uS*EQ7I+A z6c6N?unqBmnC)`PdE_Xn6A4`EIKU7OQtgili1z0vaJth8L{1ZUpuslS8acPn8maxE zHBy5WM9w?#fESR7A|jw|4m<;JxcUg3?j8csbBe$vbpo8seUw0Obr3k*tps-4a@uXn z>Ee9}?SPt!DDdVdIy}1(Qgqs_LgZC0qQxLvv;$(cOW^&}<*-|YQ`(6LE>Yf2;F7lh zhIsJBeW3+mm?$?Axa2wlH|H<&DCMwyu4hmI(KD!Nqg7Cw7F=>EIl6gk5M?3 zE@Va#f}o#FBM{|D1TJL)fm`+ycsSYUHR-US*HFhoi_ysDlo^4j^!*gzQep&d`6Piy zISN4g*+(Go1}8e?-DGnrI|)Q(JAq5tLf}?f2t0PLVR9pEEO5j#S0>nd=d6?Y)G(g}D+~eTQ z&f`>i$Wi27!Q)c9$mUj$6L>Cb%a`_N*Aaw)EZs+d{!HNFg=cQgZ06w-XRvp38H|=q zB2_?pwd-*w;-O`e6cgOM6`~%u!x1CXRszAbnZV(0A#i#^1fpaTxHtTx0*QIF#Y98v~>Q}z*vyn&(~iM^tm z^A7b$!hs|sf{;|$4sh@mhI;HFo5-6o>amM#Zq97f<8jyq>yfu;x83L5PPbs)OO?tvb=2YQ^m4Wk~Z;yo_j!aQy+mpz`#lZMDTvEcN8skHKs^$n zsK+V-!4_K%yH;%(2zm7|`MK=sbn{^k^+<9K(yJ7HkY3c#AicOObGnPjQRK}4(u-J+ zdL)_TwCf+TtN=kE%c#LXmgSMn$(w;_%MH=R#}?6Tk9T(cqaG(BBqZAe0=xcQPRUO; zkvC9CHX1)%C?A1`kD;hXYEy0@RgWY|QI9m>xJBNS-L{N(yZP`uSdVfVl16{rjgY8E z8h22SG{kspN$Ro3GLM^!-p|!zQm*o$0^=(mRGgflL;X=g7O2O8pHMw2y#$hcia=I6 z2^94RfvUC=Xxc6UUE5CJ)i)CudI&Hik9h}n@QQ#urtSrKOuYsDxF7imZrP*=9xe?8 ziFZ;#maE87Q5F!WN)dskP9xB@i3DCPlfcl@0GRJkjbrY|JHCUrFvxL<{6yZJ(fC6BATwn*fgtZBu;&Z1Q`t^7QQbn|Qd1e!O4K=*0{USI!KfMLV{3R6xJ2+C0chq8~rsqQ8a z)tv+`Z5x4G+eF~e8wn(>hCtRA5GdZ61gbuTK=V!@(2WcNuTLT{M)dvd>9HzPV+4Y7 zlEA^ITB=h$N;XkzC2(oG2;ACs0*|(tK+;15vR+4^=noU9-Xa3c$Rp5=ECR3LCop^( zKw~N+5Y)cE0XWncfm7=w5VZ~hm%f|8tvyHJ(YF#v-WCGcyP7~Tst8o0lt42I2z1{> z0b0>kG6c$v-!1g&=qz@c>!IQ63hqTWj2(svQKjqL;;?`8tY8zPWL z)DS4f0s_^TNuU{12=o!-2)w>D0>j4u2Ge@~8X#z01P=Wufz#VcAbNKZxV+m5+{R`C zk2gdh8Fd7*@i2knn@OPhCJ|^?W)kRE_z1jL4*V6s@WlW_>x<+XOYDLx<};lHPR~&S z(bGZTlJ*d|Y4o#^eM_nx^ z@bWRsVW_3BVcu0lAh-(%9PT^n^R?r!VZL^Rz~R|P;PmVv5T#uNE@=mWTi#0Gkv9=Ya)>~- zM@&UA$%gz0G-UySt`-q^)oBCFOS`dHH0+WoSEL!#KE|K;Y9-w?o=OHp~wRM5&Pg z>t6!5Tuy*>6M-bpB#@On0)Y-pbtz1_Mxj%;2o9o+^OQ&{I^z!CFG9|6_} z1WvjC34kc~5V+(n0=Ime0P6z+N!dey{4jIzV4g;!qN?m7M@`*9pz~qI<9DD^KIpsRCiE=ps*69RpK8un(%1p9JeAXr*Ke8!&!7QojM6zk>I09Wu zC-8DXFBx2f$xPPZC}ZA?d5nyC4B4D~`Xq~djw9RiLfNhKMd9b+lN(u5Vq}xmlLU%- zlt8tIN{tUQvd*Qy?Bya;Mt+bw7zg(uq$0?>2^=y_sTC)m+$f^5lN?>jb^^Dug}|e< z5J*ZRfy@VgMX?7?RjngOO)V$TwYdadeHwwGO$4Y+8Al-SX}ao=GsuQ@D1pc)XsV0P zJXJTJ!mA!W0aYbcq#!b%5UL6vp;cAw-vmcZixHrF1YWI!z|eOCFb?h{5R~l%_B=*& z@(GM4DqG0W#kW5+x7tEBkJ?BesdWUhT27#-r39)vlR)D$c}>@*kj={{yqcj;fK6w7 z8mkL@rldO*KRG&;Gy+kP2wdub1#t64iH><8*(APJ&}FTQY>IZ2K-F3aG`?ieb!`{f zy!v(mL*ESWGA%?Ps3w7fPh-7KKH2b!Y85%U)CB}?J{9nK)FQG;S{{L{Wf3TvpFq`o z1o(Mu0$uOj2=HoM1crVTfN^jidX6FR6@cO3vkb$j?jt{u&oT^qU&nB(yUEd`Jx3sE zTM1-)7*(_uvZ>l?0!^p?Cuu^yzZgY_US z2n5L<@?^fY!FrIIonViW8J!Eq$T?8I3shyH~oNTh%L7-^62~_Pl0!`aWpzAFJUVSxz!T0<`#)UHWpJ;`P z^vh#61dd@0*^X{KvJ^^WX(^YXg&f}V+5Ms`+b0}cM*8?qXY)u z2*i4jq(9b!w3UYSAZ?IgH=7o^SP$+)NbFnfCUC1e2|U_10!iIWAZsB4MXMuF^@j;G zy@){9^9a1&ECR#clw?XKY*-Jb6FB(%2kSwNY@*5tTx#F<0B$u#;89N!NZJtsS=&RP zXgdj1Z5x56Zz9n3Mgp(5hQLrB24Fonmq6g-HP(ZCbi;ZVO%dzC0`haIQwZE@7J*0e z6G)nmK-L+7qW5k9sCpNHrXMBHjaCA$v5Uaq+jhu_wq>W< zN{*uXJb_EwLEzT55P0-v0!cRsWWAg~(dQDV-f0AyK9NB8W)gVyGy+4F018tF!T>?- zCBXU&jKq5I6xl@WIDt#sN8r|;C-7)H2qb+Af$VK2P`oCA>MbYGjJX85F^$0Mok(Et z?M{_xnXsvXnoa<@4LO1JAZ;9AJt&c*OY46e;MQXV9&aas&bEg-sW<0s@CNiNL9iBM|j;0+%ikxV`-$fX5pn zki4A)vTq-OVmwcv8aoIyV+(;kB1GUd>Ie+Josae4!?1Y;y@!oKsswJ?N8nLJ0!is#3y{?w0!8g2P}SoEn%Y5t z`8|PG+eu*X$u!o3J75z8zWx*(u5Dy(g+N`fW$bc!G`sqNPzR_CIHT#2}Dm1flKNla7)JtJaPwtB<~@> zdWk@hcMzz`Rsv1gM4&4n06uF)N(BTiX$pZ`$|CT{ znFNxYP9Vz~0oI=cs?yg8(3BW~uAC(BDn|(ndnXj-_#nZP5jCXnPB0$F~TKvCurs7e8Wrc5Ewl`I0Unn_^r13!#|>9Aov=p(>5PvDgL zzY7qh9s=-_0P7_J@RI=iBmh4N6lDhi_(=eM5`dosUd1FZ>=ObeSHXt!y9EResfYmQ zlLVqPiNGaKAi((~fk#dwkYtHKRtCNUzszyNrK$B2H=om1Wx%RfhZp(aLM}!FfSzV$U6xnc{_ouY#~sT76MgiB*1O{B=9Kxs{xYILm(?%1d4K;0PA@I zP2EGFtGfui>J9>fpJ!nl+zK1kgPRB(a)`hwn*^dB@pH330%r^1a4&;fk)X) zASulRva*^$QECWO^@3zNua6Q39x@afc-53$TJKHSPwSBhV@__0rs^Ca1Kr& zDl-XiUQ6IsCK6!1OCYHk1hVQQP*jls>)jwgQ+o(>wTr;39w#ukmIBs;`(X15%5DOO zvXcP&=mc2r65!mGz^ybAc+@%qNi8Rk)lvdQok^goc?6m|kpTNK1YR|Rz~H(_2ICte zhJCJNK!@pR3}jAz%4mpOJHc>qodd%@|28~a{lbvAZjK>yEeu293Ky7)@nKZsN8N_b zM?S;Ll{gH8YsCzWgM2-Rafz!k+2`&~Tcbo2`RT38#T97WZmv?~@o?2EN#X~!vds0H z6oo5~sH%I%&!`^xVZ5$$r6;e~O`1@K!S$ks^5x?%@}*(X;o!rt)5%9i1i|)g;;J^7NAU@qv#f?)Y!nk217`mfKuSb!a3x?eBySLm=2I9p>?oW5K=+6b0 z5$q~<9UH^OvpZQno6Q!p24=CpX9w7Suxo|cf+f5r$c|jc7l(a}eV;we+SrGBz=|Kr>hwTh2Bh?RL;HT9_w1E#x{b4|_Aao#n85*?hK) ztz$oC|HA&AT`9~E)_p-(yL@w41@0mJ7!-fZz9u{>ye!-VdhK+H6QkM9?3>7aDGRfI z!X?<0&(+}2*Fo28_6SP+t1t1{Ff5M2MuM+jW7*(pG3fjLU>x$fmfZx}bCKRs(38r? zj&n2aoD?FT2+s#qhCeqR)w_bFv+G$Vo4~%o?qNmjVP>*T>^auKK4KX{k+4ZPDkzRT zGz^>@C&T;ME%3nPyxG|1R1TW^| zVYe1e)8#4M!tP*GSOF_Vh!ER`r*A)CX((anvXnB|ScJ?&`O4YaFHFhi`U9*I{@cK* zUN%ms5n6?@!}w&=bPM|yn*}~?O!A59&+d!V|9mhb$pL?E7>$2j`j7fG_3@OUzMeAV zmon7P$dFUheu&Hbs3$W?v&jsj#_p$rgO!R{X*+bywY}Cvg_5ga)!)yua zdmbx6uP=p^s6*_ zA^3z5!WF`mf?v2nxKS7*bg}o?`|OWs!>8FN>SCJTvpmTC>lY zX(HE?>&po_DXVfy)?^)TE^Q&VlrNN9AxB>!cal5HSIS-FtK{DDjq**%#(m^l&dn9b#hO+mwdf^gWO*p zAP$nVPQTf7Vw2@5@>F@6JY9Z5o-aQqFOV0?&&w~!E98}O z9O8v%EwNQof4}Ms}(yVc4n-0EIU>w);QKAro`g0L@XJr7^@Vk96L33TC7U!tXSPx zy;%KNgIL3u8cW5rm>x4?W~^$gTI}>#^;nHq&Dhzob7JSl&WkmQogcGecFc*nF%Q?@ z|E>H(c_x~JD9=Rm5apR@9uj#bnu|o9iRL4bXQKHinrEUpDVk%Vc`2G-isz+hekq=p zqIsowUW(?EKg&zeeDY^`DVjh2EH6d##ox_KB47O7oFwwY-_1uNAN;5JNaTb6G#`m` z|3A$~;ynK+^HKCX|0i=&G&lT{c`2Gt{wy#3SuQHcKYX53l7IeqUiAM${yCo9b3A$H zpPmQ(({rGb`A=s3CDvYI-9_s$vF@Vvn3(g>dQ8lBXgwBPcjaJB7F~DIx-7cxqIH>= z4~cnBcdX6Cd`RRNTAzvekeJ`l`Ybvh67w5cqebUKVs1n0wCH?D%xlCtEjk|(^BS>E zi_V9{d`7I(qVpj!k14)Ri_V9{Jf`?MEjk|(bC=@lwCH?D%vb(uohI@T%~$?veJ18Y zlpp?TT_)y1ln?%sb(xq4{U>WOF$Ze;AFRjz+w-44n@{|==0$%tPx)`nm;R^bKgXMY zqPZuUcf|dmXx#uT+$X|bzXQKJ*@8+3k9{aobC7RFv zZeEGrXA=4BzqPLVv%C_$S0(b||8%a2-tQ9m_5b($LwP2egDA&D^AP2iKbrs0yylPQ zKs2xUqj}I@-G8S1Qampe&oRaGQ}I0WSNEYso>}l0_o79 zA1(64zjHrYHT?f z8OF!@=sV1GZG2=gJ`)uGI|FE!VvLXVoq{I4WJ!{9eHl;R2E}}(mkZ_MnbCm6`sh1S z+OnkGuSrrzTgv@vxisULBbAxCQtJDjEA^|KFO5eW`&IT?yUa|Njpu#^+#PMmF?+`& z-(SjITA1Ds`(12&fwBS*40oj73sy?TGFO^cJzp9G`$jomD*Oz#A9L|#8s0;+)=sA{ zwJS**%zr}uM5#R9C)L%Kaw@_8FOKx;(v?!q99PMDp>f)uNBlMWr}X{I{_)C}mYQ?>Qil~%?t6}8>|Du?^U`j9?semRY1evB zT6c;k71%Dmymn=&I^wU`Cri1^{_)96c=cU}ApX5pNIUXz{QrRC?|w)6xLJPg1>=0_ z`vOmTxib83fPH_=$&x;^j-}7GkEXl9{_)FaNxhfJQg_7vPVE0hj->2gc`W^qC5^o( zKlhh0zI4`N9Dh|jX+|Yi%0A@8qzTAJb?m+AOPT%Sl|MncXW6mz)i|E+!}&ME!5=8# zmBV+fkj}g;UmE(5FFiQNlRBS{_#-#u{OTM`SFmDI4ZEtOF#E?VUrHK{^RJUFWsk%0 zH`b9BWaUXSvQ|nDcFLDNf54X-P4=W(H9RSIlOyf;(Lv0SKToyGNZCRB|8x0iX&?Ll z5$yjGZSE=ivJD>LuRt69=29DjAO|ChtQX-jLWPrR2KOvt^zmND=vZWoXSFl`qq#A73%#%(XoR8vz_M{`# zJd9c3alpGAG8Swz`^O`XH%urr2SF95Iv%v+3VReh+Huy8VNmp`fH$DQ63|R6q#+{c zcu12*!4FNLEI5cJ4cN#UrAOTJC8Jb~Y zvIH-Kj{q{;G?u|Zq5-B%KWU`s5<^Y}2FAx+)9pCrS0 zqFZ2Kx`G%o{elKdh=GZc9;OA|f+jTqO+x`qE@tA)6ba1W68ISi2yqw5FQS=^00V0V zG~*L=)D~#&3lWeAFfi?$MsJ9dm;~m4o#Ute5HptuFf#)jCw&I74V1DTSQWc^fPDyPEr~kt3I^YMmB5Bx{BWGyMu3?t z1a<>aW{cStc&Nc?rXD2mkV1i(0Tun|&h&@+p`D-wIEe~kNNSiS5THUDecVF8kclB_ z;us)+pMVA_XwpR80nR8M-VX-a7*0l`oA(J{*)XAGaV20OUUZTcW}B2i3(;IYpqV7I zPs}0SK$PR+-JAx$z)LY8n(2$s1c1py8?S|50alKK%tf&>4b($W10M(-Ge|wOi5N03 zc-&|};AYYpe9^dZ+)O!0rWdfNCUk*WiVvBGMt*LIaq4HiK@15G8Ks*223Qz&K|_E7 z#5qVKqX{jGA=R{@n{Y6Ns7W)&!*Ma-WP_9u6LAQdn1fg`j-a17L_d?@{hSmrWUUY% z2f~yPfB+L26Eqnmt<*zy$shEwae_e`Rm7iZ2XSPG7|qNQI8s3(q>0m{jc6L69}zp! z8^kU!Kot`u3^dF*I4%qjK86gR1QYp_Z`2edi3l1BB6Pq*I0DU#Pqc+x(8d_S$ePcmx-dXCE1PY6^R#jiiMvQy$LL4!mcB+Y>U*Q{XLxZqQ9mH0|caDblb7>JP(k85nakSBwi5-~> z+r&%~!X8t=%m==6hKw&vy%=Mv#Te;fzs2`k5nq{gF3-3LWfU9XDbi-aATDN^EJm@S zSJ-EsLw&RzuxIe{(1vYdC)K2%G}8wwP)j}7$SKax5oBT&APQs2+T4H;L>KE|?Z8ST z)=Yb}O~xW^H1QMqOVJJe6WVB4;D)}855&swlg?ltfZ+Z?D#VCE(i*mjDbfyH;NyXG z1{1l!#Kkz-BJrRNX+BJCVr8EZ%%naTW4sw!^alo*Bx&c^nH_$y7H%Vrg zD91%Ea#g&|Y@jE^O)$X|wwZLXSTlBkmuchPG2Of$dPytwGZR7FS#Lm-9d0eU56~Cd zCJ(@oX)^&d1MEy(U?bE}$qv&1TPPm31t#Ld#``%8LDLAMg?6+_vB1S>3J@vaBh;1g zfm%g<;GhC_ZaU%vGni@fAo4a1QJZ6<27WOVU}e?=8eExplL*7da7XcwI;JrgXBNKJfe3df+NNRd1P!uS zFeId&d}9*4pF!ccnEj|;CKJ(1VgWuvHAPbD#kI*y) zA#4=Y%QZ*GNj%an<|j9l8K>b0PP70F!vYJ%iPOvjejE@FSz(xn;_-zn(V2Y~U@n3O zvdn<+r>K248nI6ri{K*^8N6hSAA{U>fQfWc^vMQj@I+{67q*#D=qqE4*d{H3@1#P| zOkwCdx;f3bGc@7k_KBa{Cl-_d3n349&`%>p;uJIm)<8>$odr6wpJ-h8EA%oMa)@ik zXNC@A!c9Y%kFh4(jnOuT7GNP{!hiB7unQ{c8)*!bW&CG|1Rm%K;zE?bN!mkMC=j-& zmjtMb>&@ulcEfJ)5KWRC1JNWM`iLerjxSI~0*n;<3gUr3ps+Dr=%U|{=1Qp(KY@Ot z&v-Z>^DMA zz4RmKfMoiaNQeR8GIj+9a*?`;pZv|xXoUUb7vo_X84f;1*0~pKgwa7PsDsM{9NcGy zmh}@-{Bjyp#Gb%JfTA?GiI32*nh0)#b&`i%f{QVlbci@{(I94|D8v+Cr9NySzL2Ka za9gC0!w&A}z$T$5+xVnt(kIv$7NXf0NzpI)z-!RLK5=sz7MUTi5HGh$grG?Yj|11m z^fQ}G2@P_++#tAvm|!@-M7kJGLd1HRZO*`PFykP}Cqm18Bwb{W`^dnd#cHO98r%jj z@Bxx$jle(F3~1_SHki_=uPg-2Hq!@20?afaBBYSZajVQ9rjuD?_QW`|En+|oiXCSo zrEFhNC-aHGk#w+MsFw_J7Z?kpiHGek8s{X757S5TkfI^t3C9`K@FR*p>;%EEMLP&U zkv3~^A4ETF1#uKTu>A*p1U2MfEKxneZ^6MLk>Mw|U`32F$D`QD??{^fkduNR+Ndeo ze}s=Diu*xbzwaxin{2?m(9N2piilt%bkR13IUvD6c8dB(EFoTIAfki07x52m4pi79 zfg^C@;lGZ@H27*vRn8pYdDd_sG~KJhb)Mf=E3G2cmfu|DF8?t2C&^o6+sbYy}yn89bp z4#S>lqlxj*7uu;sv6BJLY(5;{gi6&-4}Xhil7>GfbhsTp6=Pngll1&G#XL z6YN9oG1o=hQCti-EDPM!hHRz{{ZZU(T;M>1nGD<1io~5-%v#_Fb2BndroaJlW{+VG zYzx*fcET4j$>YqWL)(m#p%?nNPa#|A6B!M31nSWd>cJ4UBJIElK0py*!(1O%A3d*# zyLda|BNGVxrSORTMX}Kb+Q5L1uua;9EE{DE zp*-0L&QS(~?NY9b4T(4dOu$F_!OF2Sj7*-H3GotpfSm>+G_izO85`$gT+qw_um(ki zY=!)!lQao=hJ%I$UM5XEV5DD;k(35D7|CNzyu?L3j3C2Aqd}saW?BS|hOotWm|A9o zH<_4dLwzKcq?X$f);J#nA!5mFvwmV0cu2R19~b6$Kr;&%476l$@|bbAczj4Bw?o=M zM}1-DGQP3VOk4?85Ho^Bk|fT|i?|XCj|~$R@gpWd(?A3lnG>-hRna!ti?o?!5j^C0 zfB_ZP!wm;CH3S~$3TQ4upfa|}qez>X&e*>Gr&w2>kj3Te{9aWH+MZL$Spj5TnQ zXfTI1(GWCo1b#B@kYkDiJj4jwG{i8F8tCS%0WVvRW#Y{FAeT88GT2C4fQ@kw&Fpau z%nsK_d}s#P7*|L$e+U=fU`p&8@PUhsLoZZtnxPKq5CaorJb~emX5r!b2?R6+It2!Z zGE?X$2C`4FVK_)_V4DlGF@_5xWFwTt2-8mb!HW&U0Uhd~0VYF(jEO!lENCzUG-Ks7 zNMu zWPF5H_`ppwUdA8Dkz~XNp_{P;c8Df2kY&eIpqC#|fq8~CiV1?~BM^|~73x4&5xcy> z^aQ*?j3LW5uA7nJ@xq+vT~N;PQIkc55t;b#e$pKo;AF)A2quuElHsSCR0X1}pDZ$6 z>?6<%nxsU(I35B>yq`l2XkjCe2=*1J3H=X%5C=q~`-%xONq~#;2Q;w z22w{2+C3yk8|NV^+%IBGV1$0|GYJzTw@2C-4rY;Q;5yhICv1X`tdJZTWAeOaSO`4H zGTjU#bTT`*P7t`Fo4;joSO2?~`~9D@QvTk1v;5a<$o}Ss%KGPYs^hnBcDX;mea7!{ z&VU@X`o;P0Y^j-l&Aol{tNge+ujBhe^5@ON|H$C~S<&_|<`WN%2V>q#;|u*EHP`r? zH@xVfN`8}L0JKIaEvDv8gZ#Am={NxB2& z=$yg^r_JSs$83k+_qIDF@0G#^)7JfQDS8M>x$J+XsWUg7{`8qGuibZjzZXx=;autT z$vOMAX5}YW|Lw7(^ncdab_6xirFsqOOEuf%)1=p*FKqDMi-ip~qR5L18;GGuU64+v zR`sqkYg>i4(}AW!UoMkX2G89uQ%1rIm001=uqHWrhCKblIz30aRTVs+A9XF%^uOeV zr{VP!sMn#chQhl?qdpz=?o;4s|WmXQLj3 z`gGKHp)P}ZFzN%9_cb_z`WMt`)VomAGp-w>Q2ploeGRC<((iuG#*?b~&+o^6-_r`u zzy4Q0Bk`<`;y*?ChvPZZ;zySL-cMA+2t1`){KOFTzw;yHvk{B`?>9V1K|X?`9D$(c z804VPGY@i6567`g#~~fV*(k$M!VL!!MDZj99MSZG1*tF25B7Y9ZrF{*#%O%6IDeW^ z3ugoVhnUqtzc^FV>0`q-zgO5`8_MS>U!i=5Qi$>!$`O><`oachqSQq(Q9P6`C^w-D zMHz?kJj!B}_fR&X{De~aeaN9CP%cO5gwhXXAj;z?^HElze1!5F%3+i$8wwlLK(SET zqFj$M7-cHTQz);YL3OhirBkuj+0dNUF=o!9rEu8O)p>T0O_pgs$AZ`5^B_e5O}b$8Sg z!(&p)t=ODjM=+F&7a2&|Cp=2(|9G1b%Lxb8o{*srl?myb>E%PZ-RcS za#cZRugI&;>8$*>YmQTip83PN^)***YMYZ?_~eql=gnLA#uGQ@Z0LHl{#P}|U0Qw5 zy*d3J-||?qQ%)Fr&I?cG9L%55{DW;jy=7kI1cxJDkGxwDn`@C?%N`2HGKk2S$ zI{2#(C+2_jjlb&X(e*t>R=RWDbG!T|ZLa#_k~Mh~AN%@k|B*HA?E%f-J1uYO3;t&} zESqSySa{}(?@#pW)qV5J70c{+kB0{PJvv_b`p_5K-&1*cH-F3CCSyzIJ#t@_!_EDA z{+w^kISs!XHt$@2$by->R`k55<%aDYz3c8Sy{>MDJMT?DJluWwkX3!~b@iLY3l=za z9{9i*ap9y_rK4NyPe*qyQ}e~$J4ekeWxqMHMbi^snKD5Cq_LIkS8HS4PZE1uPv~OK zy+5y@)3!My=FVD@__Fs)m7cl$speNMt=Oo3>s{w->ZR?UUw?D`@mFTeF8FNKki)y* zJoCwKMtAA-u#?~J-m^|`dvUL8kKQ}}h0+s;RN8g^XHTu)xHfD1+^uvfmuw{wD2YHx z1WF=M5`mHkltiE;0wobBi9ksN{v-lf?45yF3g?yvM=R8{p6`vC*6+FO7eu(xeNH@) z@pt_(*1rh-bYEfZ@5Z^@jz8%?@CW@TW#N7V87s2M67^^QNx$+Z{W*Wq-wyrV<1uMB z-SiH&d3p@@ku%!{v`1u`QY$sa?v;qH?r1k9r-O}Tvr%$T@UD1#!nufk))9W>a?f*f zB~U2%p)PzB6cnH*&3cl*akriVVnF;SKw`;|Ha0UK{;*Ut1u-!<=|6Oo|-b{;FPB_?evs%`XFy( zh&wqg<7$Uv`+`{|cC}f+CZduCCF2jy;I)nI0*0huggje7x z>)r6#g1zUnHQvS77VXyfYzdmSm03UHzA4FwlZV$n8|5EdW2WP4W~Dve0eU;${&_3j zM$-~?AG{f~HCor>ZK0C1it#9TKdFK@lTzIRMZ&xPs=!(^@Z5rTiuM5iT|m;S^6k+(0R24~eHVL^X)jo(?OZ$oI-~Cj=%Y98Wb|mTtKe-swB>@9@ix_7@V*Do zkw<;u3t6YP^YjPL@B6Zm)0*MULD~3z+{8~DZ*xsRC;gCjf8YD*c-w2#eg|0Y!QRe# z3+mhPM%FtR&cEY(HZW6cdZ5rgEvhFQo?ZWMVQb0uOFL+~4TuI{pY$)XkN*xP0^gYJ zkD_{t@0I92X^VH~iern8r(0o{qR;{RgO0SD;l*8S|7WwK^meodusux2a5mmhz>nfP z@b2BrmWB5`W%hff|F5ZxbzUF5#(zUr=U3*0qsj@QcT z?Dh4=cr(10y|vy3Z-=)VuX8W&*Y_2_wco+N#UJE9>`(WX_yzvQ{w|;W9b7j4<_uWt zC@qv5l>DW%?8K5peqwWCdtz_m zm&CEeDaqQ&`pG8A7Re6DUdfx21CnPJQQN z=NqSq|Fr)iEqZcrUqzOr&k|oJ$|b7->-gl;$@$4u$={Nt)XHitwVv8oy-@9?_EB@y zQR*u7TeVQFkUA%&q?}ZnRQJ??RBr0Q)P&Rw;4etMmD-j14tw}mDoZP;Ro1F&*;+%b zv1Vz$)<)~E4c2n8&u3~cXiK!Wv`yM~S~yL!YY8)C=@&`WN~S`cb`- z(ExkhHZCwOGj1}5854|Y#w=r*vDY|klr>K?Ynci2LbI)Tt=Ze0ZN6)6H20b1tjgAz zR%5HF)ycZn>SNt*jj*O!v#e*WH?4Kn2i6YjYwHK=7wa%yAAgcv(XM6Ju^ZbL+n3p$ z?3?UC_9%OdJs%O>Ztu4D+9x>`of=MS=Vs@2=V9kL=Ori4S?_%5?8l4e%e$4`hHj2~ zp?igUm3y<>&mH6rb4R&ju?MEPb8#$gb$@j0c}=~Wz5d={Z#a&_$GmyoYVQZ{H}8m7 z%CGF7;WzYK__z9Z`a}GY{&;^X_RDsEKi&&~zeB<9X@EaP))iN2qjXeyE5nq9$}7qW zWtH-wvO_tlRExKaUl#8a?;7tDzcc=Pe0h9bd}n-LymX>!qG4i4;=aTqiK&T2iB}VA z66+E>6MGT|5)$@u?PQ~*n!GsKKG{9lJ9%&Nq2%P`jO5Z}esW!Mb8=7e=cJ^TQRk~G z)aA}LXQkKN@959%vqtw3CL7erqG)HTWobr6Uf0*@J8>)=z)@e_sE1>rh0)Hq!RTk)V?2sXFwe*{)*73P z&v8r~HC}L*I-fW@os-;3?pbb6w~w2P95Ef4;U(mR_3mc(JGam+?Unb=^3L`=uesO7 zgF}7!-=lux@AZGBb0QaiGlZ&va=xM}*DJRu{gqGQ?+NkpaWCE?-X=a2xnN8@50O3) zPsig4BjG3dB?cviC3YvuCMzXRPhOO~EZI5vVDe!^_MK#5a)0tz(pHrA_!J=FfimYmW!KSnrXoC2IY7F9Ja1oRgH(lpe~rN;^ccPvX2}Bh^taQ9B~n3`C|` zqOMlgt9#WWYK>HVWSc8fy^(1qq`pp7*3Qt*(i&-TttYM_cOqAg)h23BYD;k?S)*;x zKGgPT`?PxcdANo&)i2kt)Vu4w_3`>NeU83RU!pJ9cj@2hWsEb7wur$^@PC%E+SqFR zYSc2%HLo&zn75gu&Bu^YJ~F>H&#_XLZ?(62ShretSa(^Qtxv4Fc5nM)r>8T;ndvNd z-g34$Ro&~|yWFMj+t@eXxfQ)Lyz@NGYmGfK%zNGY(EHg-do^**Y3W~r_bst|+0uGt zyON6E5+4?SB)&f0BXwu$cKreUQGGIw{5kq_`V0EY`st=(>ZWftH(OzE3^1peOUxB! zfw{(9Ypydln48V5=2_O+RwGNXRBNg=$11SiLY~_IocpYr_9b=)yR&_@-QDg9%zf;> z_A?5NE_(hfh2vXR@YSRKCJ=H$IJDx`Ul4MhHHLd z?lDiczPBdZ@7f!jBglUzA^%m!{%+_dT+4mHpX5J*E6xi4UH=3B3;%on7@bQyaIYKt zx{^{$IZJ7XGs;prDP57vZdC>;LzQvLL}jZoG=6h(U~(wVmPyHl$(M1RT!XXb{p5$q zuabL{Wz_0wZ8f1zRK3*j)a=y!)TY$Osb5nSaD<tu)@t8sKWoRd zQhGVPE@ly)evy8eeziVSe^8&OKczpbFVdbIvJM)|c&LO81;#kG4 z;ns7{bCa%#>q!e-Pi}WddJlMWyjQ(^?*s2+?_2MXcQR%zE&OTzLjOH~qrZ>Gw~(bP zshm?H$ay zPSZOZR~y}po%5I# z6~8lGrLf^`QTU8upWdbnSLP_|l#}BF;}haj;@_x;)oW5cQ#YmhrUs_&NsXXCn#Pwa zr=gO^*J96aNq&ZX|2?imhmta`MHMhts;xFq&xbEO zkG4}gsn@7CsJE&E)O*x>)d$sw)ye8p>Rff9`m(wlGnKd14eK7vD8Va zim7V2Le)<-N+nYku2Zd2m!>+Uu1WPu^-0~48jRy>bZUI+@zfJI&YnxX6wGPXr#?)5 zn%aq(&A!xuR612!J6StTtBEXh4t&sqeBEBVO1oCOk>#YJIDf`qrZW{smTXck;nGvKj{Z`$vDwC1xIr&qpoo-W=w|R8!e4Xj1IJ4!GcPhPGdr8z%L%x<_PlvbAma^d=h8J0&}ss%zPc$=zV0%?dC3IiJ#1a zrevLHonlq7YFTxy^Q?qrS~=E*R$F%UxX!xC>SqnIhFPPmvDU<3cDBe`YUNpPAa`xD zwpm|TyR9Fs->jonmR-)SY*)9l?S`1ArEJG;W?zKaT4%ePeZ75)-QT|39$`OVPp~K1 zPug>E-YrIsdmS0>efuNK;&$14?4RvJw(OK~DmYc0Gn{(Pc}~JHaXwz?v~@Z30vCc$inlsCJ)>(wvM4t18v(DLsSFLOJ)-EbAS#qICj?T&CCz}0$^`=mPu^T5UKa(5N34IA7o?q}{-?)UD`?jcw9 z%6JuUbvy&t@$o_gChWBAk7B-Wxar zH+kERgV|MzDvRC<4Iii$`myK77 zpB}FrZxBB}uEyd z596O=KKorT&nlfbIdNK|X5uWYzLbQX@DeQ&Z4&LV3hR;RowzMA5HsG9iH9)fosyW5 zcqZ{Y)@3Uas}t`eK1gg$e2x{)4_KcaPQ;QYB`abUd?r?DjgrZvmAoL?DtT%0ie%Sh zPpsE&Pu`WxP2P_++hfV;Y&G;^@>R@@-%P%T+3_dIFO%N}GrAM7hC5ZQq1I8)R-34r z>Z;Avi`C23E7k7*A~UU4-%&qMxBiXHbVaHw@+Y4k=BDmXjY~b2nvPlZ{M3u7S5x_z zTfdjuocbj7W$N2hVQN2CT_?Q-o(tvhDjw`v2ld$fDC z2eG=GtUaa8#rpDPZ8@%+Z)4uH1#|JQFgyHNJA_wlm(eTeRrNFUdYDHgbW_jKFVx%W z9dRwaPQOX-rw`JH>7y_^n234REL>L?VYZ&9zk&JsCboXtt^cV1hBaIkuC$dgch5E& z;%b{R9IWCm!g{W=(apHtxCK|7yNwaX1DJQWSmC{nS^fLQN5*zz7p}`c z83%D~KG8hItb#RPUCh$rrh!>eOY;)517>X3nm3w#%{y_my3ZVAK59-iXJY310j_-tpR-=FUSspB_11^hr`AsEJIt*PSZS-YeKM~2HSM$PbFdQEZO?9Dx3SyX zUF;s1ZQW)Mw1?Ou?T73~uu7*n!SnVKdxgCkGpLRB$Mz2U8>}#YwU5}PoU%?Otln!o z4IG*+*iKWdIomm%oNJt3P9NtEXRtHe8SRXB9(SI=%z@USuQ>&nd9HUpbUww3=R0Sg zbHGVsop7>ynp+dApL1Nr)m;y>i8gL~w~O1u?d{&?4s?gOBQZOF#GQgWCeOIfyGwAd zWVQQ_`vGRIpSxeXKe)fRhuxTWl2_5I=AG%)_ZoRg&+;z7y_8G6E4;2=PpoHe_wMp? zF((*@743BIX>Y#wBActc>AmM|_CE2x#EhlT+wUFoPQcxkQ~er#9sg{_3H7=0g8vf4RTPf7{>SZ}C6#zrsxNXa5l8rX0M< z5%UCDDWgtdOr(u2XJO`e9}{Oc|w&#oTh5GD~?@S)?pg z@{~6)H`%0YQ@&7kD?ci~Vf~yHFBh*IuO82iH^e=jRNRR-i(iBlb?11u`1P2X_mAHl z9}#~5vzbZpC*yPC3*w98%i^!c*T&z+ylQ)VSA0+Wr})9RlsGYQN}@`lR-$g=+yq|_ zwoF`-=#aQ7aV_o<^-bKF7>d>Sn8c%4kIziZOT3VHC9x8#@^=%P65A4AVBPp*;I>~0iTC!X6`s6Li{-Q7YQ`9QBe^XaI7k8Nq)mK|$b=5(=O1)OSQSGbVsSZ`|Q^%-}s#DdO z>OA!Y^%Zrcx<-9h-Kc)7?ohwM+Ur-WzDlLarYfaQPw};?nzB<(vAS>f56+spXg##v zxFax78={TW9>RTrDcTI}8SQ!8BU+)Y#ys@{ZL9XV_O-n#Ouatt z7AA4$=mNc!eyM(i-c|3Z->l!R-=*j3_v_>I$Mos?)B1e17Pv4CDiC^N5 zVxhiYKc=5xls8T_YT(}D*+vsXGhCy&aj|i^aV2KNHyF1X127l9*Lcu)7;D6*jJd`_ z<7H#HvC4Sc*kEiiJ~O_;%IIg~kRh98%nD{z^9-||c^>XbnPv{VFV)e!+Pn^HiGJoF zbC@~G9BWR*3T~G9thvZsYUY`5U=6p){KWjy{MIZq_nXJe6Rh&qsa6fE4%Qk?EX{JQ z=GMhneRje6v$u7dHP9MjjkF%J9>A2gKZP&BUwi_W|skVXHRF2);ZiTFc^J|98?t7}ptqxY3?T}kL!-MW- z&v3n24=YX8a)7Fh)d6<`dLm!;x9$O^F__6sN48u5JO$P@?zNZ;-Q?bimCQhQusakp zqEYUH?l@$g$K9!z7tO*QviZnAFX4{HGB*$Nqc@R-*1H?skKApTC4Grp^qsrc{mK0e zbERX*NTt29-YH&X%$RB*FP-Hzztl;iPR{C?Y%I(%RL`;}7^{+>7GdwlmfHh0Qj@ICcwE7#jMT;u+pH^qT^ z`-Us0Jj~x!TyMVm3MX`~;sy$w1Jv&$L~+$c7^m-ge_6tZx3)3(_^3xo6%u?=stE8qFOS zqn5A}vn&JkEVh+`Gv#TT87DwqS&&8}j?=f#zXH^rdE-qtUV%Es3e4PQd#CdX&b;x; z`Pbt_-AtSe8EEF>TZ3<(e+6LQ=jR{AKP2#n1pbh~9}@UO0)I&04+;Dsfj=bhhXnqR zz#kF_BLSs2L#s^B&?(xwProq^aT@t+gHE$j{!=F6xVDClZP239abT8349CDS`;bL^ zusU8-SDaxesY*4+0kXxK8+TP9{?>_rW}N4yz-0@aPeUlx9k*(&RE-jntD zs4qbM#Er7P=rdVgjCvF5r>~RsGe##comr@#i~4!b%6jV-E!WQ%jZegDtdF5qobxIe zo1URH*GHqLzApK=bpH47~^x*XApm>R|1pR9Ib+bSHd8lLhD>~7i zfkPH6onRJ?PY30n4vOh+`Xcjv2+2fM{rnrrM;$kEdZ$LRaL8h%6U<^}@J8sM_;D>W zu&KhaaaOampX|m4nm~DtrZ!p<_ri<{xb!tjw{wY1>mC?XOQH_OL-PjCq!}o+B+jDW zxUePBNF~fptXaSZ(&*l9+{3DxEk61!qzYKG)=Pv4B5|__G+FEs2Zp$*8LN=MsGWic6hIccJvp ztzR35K&BQ^rPpYb_Ihf$rg2TZ>l=_YMGPzQ;drutV=x`-38v~)YyAof*N%c?h znaRr%P*?w~{Bh4AP@WqrK__K)igTC?#A!r6*V}mTp349DDOAz zORUr8I&$LebK_>{6+Xp%Y-iJ#i3z)uDf+qzdc|zWd#8F_<~vSZJyB7T=<=q$iOO`H zE}_ZnGHLy;-GoDR#vGrEZ);|D3iH|}AJvXI?XD!kHxu717Lpu%L6VY0!Ygs5==PmB zq+)|n^?cHP9S3wuiXPY1f5?m&I*da~l|cpw+EQ*dIVWZqoy8fct{vmzA>QN~1#p#d zdK^~9>hM{=9M{6B^sCaS|B0MqE?3*MdLmU7XL9Yp;S){tPYlKpC5aA{v}IN$R*@4k znycbnJHctTqa)5fK&4Wp5$(UbTujB}+NC5BlS&G4Sz>mxV_Q0>BD-;>W226JHzBHj z45v8`=q=^huDll83Ch|J!M90FFVkr94lA4NKfv?p$nzOW*sVCLGg3wW=iGh`$H0=o zY|R*L98%6Fm_!l$uG?=KaG|b5p2B|T(`Thi5Y1$LtI@b@wH0zQi8IrKw91Z%T3yZ8 z!drVK;x!o+Hr3w;;gpw`n?x(*SuSq;N4zGN`;F~pF?JBlDusGjc4OYI z#V5!fk(+CuS>R|&&)ZP_OYXQvTyM)&lGp@XDXCp! zk`r8lNvufLz%thmFne!DtLqZ<1GgAA*K9|})hr&`mdG9wuBk-}8-<)v&E8{tUMrna z{RQ(LSEX^Ki~=`nNWicxjfv{5=_v*V=SmqtFq2JdNXo914E&PJsfw%FZh^nhE;cId zP2VOu@{iZp`V{1Cpt|YUZi5E6M#qO#C}?DB{4m*pTRI3XM!P* zpKO_^LzIw}gqeE2{73m5B7{9LyAesAn?K}#c?wL3tOtRky1fE+7Mxx@(IfqI zL2vMYQ1lEQ{-9}6m79`3Ki465@aLzV0cWicLH~#ee;cb~mlqThH)BgCkDBt<{ai!IlPWv3xJp@zC{&8_QE-~es?dWU-`3az4OnrC0uC#k*@({t!Wb< zLif(cm9iQGga$faynZ;2f?HaZ!TJW`gtZzU5aBE!%5Ge`ky>w-m%!4IMdWlQu_%DV zm>?w9ku|x=so3Zn_NQ|Q4R;gg*p(2W?bITBrg-cZWD4(#-_a+*owj0wUW1>x^}jNhfRo8%|WA|gq$2kkZQXmAoO&^;@H55Q`Xi<6 zX`n!gbEOpFfFCV{J?eSo*7S2=HAZ|O;*Oh$Dr9R`ty;Mz9VA>kIfJ8O&E`34GVont z%R@Wo@*vjQKFBb{Is&!Uj=;lSZ^85)$G=1%j}&l}>sP9~8EvwW>!| z+0eIJGPdL*7KgnzOqkkNJ83;Zgi}E~7jn##P?Z!C00pA@EhuEZLnCUmDiSoBfm_Wb zV&dQgM3=82G(>2U9n>#wAC#aW2jEIshVH|zpqun5gfRWDL8=q|Q~c zohCMcX>wX331FeR6PXq3bY|eQG}eNpYM>bWgLEI+huV6J8?eYARhx)Vi{XVkP}!iAqowjOfXpYokcF-}Qek zm*lKR|Gz z4>zdiI#vn%F+)5v2|t5 zZla%rA|kHR;f>;m;mYB+1TOJJaV3e`uu`3MIkaAK*B}kJ5ydCN7%1;|Y)s8-o?{!v zxqn`>-6)3+rKP2=o#2qi4L^B?4Q^JCS6RIbB5F$%m$tcFxr2xt#`Y<64MsmSiV#`9 zxm;_g<3kKm_-Byu3W0jrL8{3Xp%bot`6L#Nl(K4ejsuHI%Ph+NawY${qv)r1_da{i z*_)R&I_GDk-Zd-3a2HZ0<)`Fjo59SRQ%g(Blh<#BjT$C9ew~-R>|WG5eqCU@%JHi$ zx#j`*y$YEQ0thOXYAC32_1 zUucdsJEt#8qgLB4hW|Cd&&b+|_sQB^Wj?ssD(jbiLr3eT-QL`F^o`SKdK?uiqLSm68zEFPx{=S&xLy5>n=HkAB(%8j~{MFaR?L}iI@#_Fq zojRE8&R|q^IAm6on2WwNTazf7;VM;nm^0!z8fjM^kC`m}o>^Q#-C?7aNx3~FSUs6% z>43E#Tm+55TM{?IcMxP%8j z$f47WW}ril(4RZerrV!ub4UY=n2FB*JW#pk2Z=J7qL*aqR57)K@ts6&Ub+vH)rba4 z!~kwU?^c(^mITYxWp5TUk3wC2X-UH@e*6J|+>tV*03K!$+DQP(uy?Njc*qeMzZOa3 zRPp!2o%zjTey>U)t*HFkQYo|Jsd4cyShBlSG)ak+SzJk+%h;-pe53~o;76wOwt^s1 z93>iAc=n;9x8&+%NKr4PSZ=ZwGh17Y#Fjy|?9YP8G9};lM-q z+4~Y!)NtlHz<&A?+gHQ*ytX3k=ka#mI+YoG2k^t=O51rs%x9Qb%CfT$60I0(f+?fB zgWtzeeBcDO=Q`~xJTVi$?wO~b9(j1bf=QWE61E}aro+Rz+479uSFYTj396y_u?3gU zAr_1MR54Dn;wPV{SU$ZaKW>Aw*rKy!T>~v^i2g7^)rmZed?GqSE|6T4jeG;X-NGO{ z_Rh!!>Vu|33?ce+JA+4mJ{OK13i0pH8(9pRelh9KSCJG9uu4yVZjM?Exsq)X!{-!{ zq+1K#pLsSY1pI@H8t`*|^1#=5+}YO*KhEF>KbpW#4o%lU$)rezt+D`gaA-e$?@0jW z_)kx(osSmH1N0dV&kz-l6%NO(PA?v9E=9S~$uYunIpH}U2I;|bd93l2uv(y>2jP4= z;TgerE;~L(c&;Ek*Tb?rc>cXV3jKueH?^!0_?!2BWGH_ArkIgDkVHuIYJiK@(zFd% z5|YPZ3+!+Z`*XcOg4>zbdvvn55b^L8)(GO^?>yjF=L6;eiAlVtCnUO_AfXUiNjN@( z4IqR*Aw0UE1y?XgoCn3=;O$D zUNHW7OppXE5Kr*=nPC!7nz;7AY+vsAnFm=Pit&KsR7 zp2IW*y1Jh}*0Mep_Ki{hs3IISFkn?54d2FGAFEgm=pUaU$^nmCA6r=;&-ICkKCU4g zZ$k0VM}Hp(-O@*?g3*2%#^eUh{L^g{f~0O|icPE*`)MLc;z^?sygO8umYJ*vSVbS| z2w1Ax@uSO_j15Ty>}yy=TM{~qvAnd*EdH+-%_XXo{d4hGSe;*PH9R9PUo=KL3YN0R@B^8XB*@FTDU z;-4Y$_wvYlhf5|oBe;EeV6Z{OD@WXKi;(t)$*ZSh`*8UUUsSIsHBMBe{rmObnK5_2pX*3+8 z{ya>@b1h~`0`a`Wc+O4m#S^_fHxZmdSfZ-WcQjZzi^?@GVBzyj**7qdNc0(Yekxtk z8!E2)nx)`Bp54M?$ciU1^mu-114*F(_UIYU?ugo~uV$UG7>-BLEr#IZ*%1D0m?Uwk zxb~~g`fr!|ht+w<7t!mVR_R0`>`m2w-!r21=L=X(3_JzJNc0~HzoZ2GSXm9Ue`6lS z=W}7EvA}-<H`{ccZw=8O`b%1v z|NWw~JuG7p4FBEN9(oYp`jZgG!T{MIFupwrYrLvtV-(*CS(k{{b)R>}^AzJLKN=%E z*kY#iTTJYg?i>(z!#2G3x@Azb_WEyD z1>0*mijmnX$-_wFO(S>W4BO-&oj6-qB<+#n@1L?zc-s_q2N~sxD29Zl66*no#w_Oi zN}@?q4KBK_Y-~7*L~}jNtnCCij8tliTM@tc3CMp30C<0*x5kA}{p%ItB!o2vN>D?22;nr_1V~t_Gy6puIohb{LCiz2go{v8jp+uD2lTQ6ch=RjeGu>(6#F z6u7YIYxL+ zAw1u}7F0a@y%rZMJck$t&3}BSwdJ<8)g;;ru}f>xR}pcLebV3mDa92V>+9P9;>=!^}PY;B4Fi(QSVa z4$o574e+#X4}#|r#&d6bjPML4JpX`Mc<}raH&n(H&x@=U;OW>F1WzO5Y5Flncrpmj z2e1eao)cn?XCJEtct!-nvzPH4{2@koP9r=nScC_UIT}2iABM{p^b%BtDBa3RqUivi zd`R~vibVq%m1jC2+Ni2;7)Gd0CsZ^c!1>VM;=E?p{d_1yd_9LX1pj^82aL)uzK&r` zlmAPaQsZm%^L@A#P$Mibb#`}Hzc}w0b`VE3-@AlWz!~ppD7rJ=u=|%n;g^(v|NYMR zO%nfs*x(<*_+dpV{$GEO8b2#b;zzM3_$4Laf3Guso5bH18~mp;e%PCe|Gen&v$7<9 z6nlbSQUd-ho$;@f_`i=0{*jCy_NL;$^=Q=kXJtwJDE0)uqy+r$cE`ldgcl7vKSrR{r5#g^0GCwp$oFgfX7q`8`_;Ws{NnX#MZroq?Sy~1@QJqFVW@S(@ z9hJCqhs85Oka#lO2|*90KhGffoCAAoJBj9iIlSPR1!nxfjmc&)&>Pl*XNLx#yQw?v zzoPgi_h(R$OAE0*V>nv@wr5w{lmai`~USPUjcMy1*4IbC-I{giT#I*Z#PJCL&dr# z7J`3#D_|)s{eq+rgZMUv#BdMH&=cRxkVCBE+Y_ut#JB%8cGjnrk-YkOZ1g#nfNX;O zsQRor7_C0rS?;XQ`%#QUpJDeOt(NqLitpa?C{&$mFj?{`&nl!h6=A+55E5>JbpI($VrYQbdFLDV;7(uFt%n$gg;{?MYu}BmRt(5`OKkr8E9Wt^t-E8Q-*XAr zUf7dIze9n`o40f)Z1<6D)3)K~!FbsI9U@=Z#DEdsl3ru2`pviA#lUy%BH%rrZ_Od( z-@=O2_%`y}Xn`9f*SudEd`A-BBAah`m8F3BhGXkk9D(`zvn-LfcalV6kgw;GNOnMr zKJyI|eayU@`MRF=AL%JGOSR<(nO+(pb~O+z`zd0u#MhtiRK`4qbuW;aMB7I_=)ZW7 z2x#j-P2B#vx32<3&^vd0_Wsd^33fmdKsGcgAKsJ8+mL*2yY5q&%g^qy4Hw5rEQ5vl zRn}DsV*wPy1cH*zP@+sQC6qouVt)-r+M&*-1po=ZFQ|%T4EOti_yT6HT4~E13@SR^ zpU?2wNrl}1Dam2~=PQgiV16MVs7u7i5B(GvT^43&IFAhTJah){{DM9$+WkP6vwk=X z?SifQxT)^XFZ7qRu>bRA7J{F@n#&>>zQfmF^lqs`#(P(;92nsKI7T_ z{TGF-OZeZqmpbFAW<2HFeep!U-bK&n5|uC_)&KTQjaH*8S@^8cu_&sR9qxYp5b>u_ zQUd<}bjH6{;@=h<{Noru?58{UX9jVjlf_C_mi-&Mx+RI#4F5AmTFhGCcyj!l*{CNm_=`Se(|BIdRAC>q&@U@p7^#Aj@|HDAl z{(l4lP$PkVp4RpKie3BnJk}^S0N$~dp#}K&j0?!WPr*a!eG=?w{d)mHyA-zM_3!yn zYxfRT1#5RWiaql0=SW&u|9hdcev4TIli!Pxe#es#%3x5cem5h;MXTQs_FBohgnxhT z`ObK(jA!AN7~z>fcxqrpDxM2tk7pID1$aJtt}~uxjOWRBV}$1d!t*i=LdEm1*yGv6 zYN7E@5Im1Do?Y+62+u^q^9>9_#d8a8sfpI!*q>0UA8Nn!0R{wjlKrg5ov3qm*e~74 z*nZng*kUkVpG4UD5H`>LAiBT6jqZQ3Us|u?D}5#yKEe0~#tL5{;X571@5QI|2w%AQ z^U>}_@mF)*0QoBeiVCxUs3}8Cp+V>miXU}4Ssrav8aW;srdUwozbji zWl8)f_5{DA1pH5Q#{Y=KzcDuWFJk<#Hx>V-CqACI#T z{QX%YOW}rQl0pppSuu&>c9@;VpWTRYt{RAfkK4O({|Bp)@}I{#>r*h2CpW}KpHm6Q zE3h9`pV5!k_p;nspEW2(qR$Zd>?%nK_}6sCubV`X>B*+p;Gf3$VLB@QOELWt-9-6b zR+hw%VkG#x9M3)o_D-f-9K7sY-iQ6 zG!~-hmPQx*eZsDvERht4ik5m$2Ul}VlXW^vV&z+Y9XvWo=o?HViPf+|&-%%lsLf(C zD~<(m9g04J2r)k!F5j+}#4<$lYL7XnGC;m0h0*;_CuumAP|7P0>hYp+{bMF2Fw z3rN)!hDHo%?;C!AqP5p+2~Im~!(*>QqwcsTNw#U(YlYX12Vc((kDp-^{zp9u_2NGu z@xLAu{MRvl7?2151u4-wu9GC&jNj|VqruOx3IE@N;7=>0Ft+!#nBc#j@k4PQ{8t#G z#xL1s{Qi!+v%dD~T@IM>`|6>wA-VE!LkVotPZe;vW zoCkk%zo_*u*=GFcQDO0SIX||Ap<{mR#D`c00sC3DvJm#*&96S`TeMM4-%v_o*bn{r z#B1-<52KhL3#;FDh6Med`(P0L9%X16hUOV?MXTTG1k6Cd)aTg`1+M7Q^jyg{>GyLm z9#+5M@|A;(8t`)-@WA)xE9sNTy~n-mXWr3jR@Xr9`4P#mOcnsmpG`>iCSnoiDSkjQ&rI^l2e6oDWO%=<_GYK~1b9)@PUgrD2DYvq+fY|1X*r+h{ru$B`J;+&;Nx5LAOU3>4lNLk9+zQ@-T}9 zYe^oS+ascNNQQ<>NFs}2U3`NCwbT^)7r`j=Z%JO~ZlN+r1^rlYh@!|UCQr0rm z-FmM_-Clp2Rz&{x-WUAT9W6Xv!=(i8A22Xa|NM&&u5R_u2%Zo91nUhO0{^>`p#?r4 zdLn~+>3IU@*$^0AEHyUFBxoC9GCt3TemUxgFt)KW*qY~hoiL4-y77GICnOQv|8NiE z_lrN(4E|NT^4c4Jda&PO7QufTw!{I5p6}m-{T3mf@4u7Pi079Nl6c(DFMkY3Oya+I zZ8bgLKb6^djMNB1%(`zGmOOj2tKuOF=D0*X`=Slu@!%JlQeTGSDi2o}( z%YPlq|6Jx;ecz46y{w0~Git;lSg#t*t7{@){#BL=+srH!z0CW(h$Z-b9eO{GKE(S- zE|XL-|6dpAA1o&87DjOcUhYldK+4_?LQ5e20~3^e-C`EQB0+JGWyL5ey?&h151Qx? z&A)-1oFT;X#~zVHvHyKJgYb#h7Q7@%Fp6iMCKN_r6#9llLP7pR#$F3j#ET<=G13d; z0|?GH9ATq-fc;QBa{DuAB3%Zh3xe!kJ4M2-++Mo3|$94V6w(nR}%y1hM|(?9Bfx=Kskj zgYo|?@h_k~mH*{8M!^4YFaMADInyrvQ3(Ebve+U2K|%PhX8yl>!k2&d`{!)L{^?%3 zMfTJMr@njLF-!ao+|%~i2rr44we6B{rSHnh-;rD4zrZ(`93eB zJT254lU-}#)i+VLLy#u%11dUgOIE{Wg!X*1WB~U+*L234#(3}KW&-`&Erhof+E(#? zN`~X!3?1^7l)Yth6jYvtfV-hD9-mXvl1ia6HN^8ro@A{d{r_PZ!|}Nv2%*np&0$0@ z|C0olsz%CzcrTiv;Z_24*lR>{@H7PjISss!22T?`gWR9{l`VWEviQ+oGKBrlk|Do* zd_HqCoVf{<@1KbsE7(!xTOEo2eUi1v{h=7eZpb%;zq3e!h<}dG_OXolzp6f1f2bz@ zpMtto{^v)+|931U=6^Yg-Qb^0BWylM^l-aVhS+fjBMHa{A7dNiiH0sSxVCWQS65O zgy7#I3BvxDbmm`k5ygY69t|e{CB*+zumF|+0}CRM|931UY5yqpoc~plAo9Q4JM*8$ z{6G2kVEiv7{spwB@;^Tk{)c<{-vWVkga2^j(QPby%vYsK5I+0SFdofe6#E__6anMW zI|#&30zr!%I*dnqMS|io*&g+RUj8UTk4L*Po{N{{hlvXpvramV=VmdYWJVM)o^ueQ z5*VfLcy9E<2uy1^%Z^QJG>Sgns5|4iLP;e})ZNCsyT^0O!Ldoq{u}8)osY2@F&(pv z_^tPvaUsBeED~ecb&w3F4%YXYtMN1G=dSqcsHCqlt`xV{JUF%*h4;Zbs2LN;D7HXuGYYs zJoa#NBvReS*x4RxQS^x--L{8Sk`&_KqR#d(i#dOCRST|j$uop~ z_EPzo8iXGk^E1GYA9Z|LM-0sXL#lo1t0S<_2UuY&$$S)jBSY!<5e6OYRcCya-bU1rnDhXlz z>*gT#ypB1)_dep>W6vk?yR%mi=R3S6NfXrW#NzLSK=v~^ZQWgY9$+ydo@Gm>0_6EA zbM@O_{p2a***(P7I4@Uz@$5=3U*Y3f@aLOaBv<3b-|Z}_?mXXAJC)pR5wo134z^Pv zNNvMPV)<^bMY>1Yot{}b+{-;q@x)>(1jtv;56HQJ;P2y7SgsK8cALjwJisQXiTus*nogzz{Fh+P)uUazk4ENBN`_w{v30s0NQe_<_a6a$3A zH+nj>cmINoVKuIl9lA%F)i*pqpti!4IHb|@&W6@TtJou~16J&#DEcV2^Zw8f@#Gar z0`tE&bk^sC47}x@80qstg8mTo^)&?(8_OL@{Vu7vMib;g^(v|Ju&@b0mHxHu(R}_+dIK z{!g4y<7Z__{3u3(KV1L3L6XDsPv-}*XA?_d>D@81=SN8l_rUBt_WaXbv9sqVSdFmf z|6bEspVf@yRcCDU`40lJ3HGDva|&=M?ds~g{{vUlr{n~GKVdt|o%MM?ijn9uggrkY zDFJ^~XZ))r{<~s>zn<~KbX5F(qsPz6lK4@K1V87yWYnRaC-I1+iTy8Evm|`R6SNZ6 z$g+6mPLhS^cE@O=sJ`K!B#Z_apB&TCikX7ENZr2J{r#%p`fC&G7V$?Xq50D5 z+8FiM)r9N|n3bo$-r-GSdmMibF#`10an{cEYP^`@Pj5z|=Ht=FpEU%eKLK&C2#v&4 zMs)qPKypnJ=riXk7J|P%vsemoH8IlXVna`ZXa#^&PH z_TQ}fP|sif8*3a6{L5L4iX6Dle18YSdiqv^<#FKAsoK!6mO#A*Tl3EMA8EnSX(bfU9=;_e@_3Qt@iffJD-S)i99^2So%P4^ znC$QN!^k6?y)TsnvHo{y5PP4| zOBjmZdd@sX(z1|{sN=^TtmpiPkbDFy;sFQNb54SZ2cPZg zPj}+;5{A3`W`Y}o`1}&V{T8MYB0gW#75W&&=UprX#OJ{?SiOPq`6-6{jh!IJAU?lL zkbj0r`NZe@e5|#b@tI$35NdwvC?kSM2-*4QHXi@-&mEq7pdz22 z>T*0(%xZ$Z{#q7HUs;T5=1qhu2Ksu9P+bk{_v-7JZC+U2*H@SL=CiJV??2On;hW3& z{(NJM@U0_!PS}YT-|N^d75#WGoIT#l8pCjJcWDrNT+YbqZ-|jS;s!j8cmc-ZvBxic zfJGedy42SjtS0CyL4pbxpRZ$7?=FauzTO~IAHzhv`nm=i(*HO5+Q*2XuMy@T`uduY z9lSn9`g)y^xnLn4ef`A;Sj74YXMg=vJTppy;4zevKO7P(JogfwvwZQ~Xz?m4Vmu+% zmkL=U$hYcD48EhDmOE$AV^NG`em4|; zNeTEb?u>ty#D8sU@c)(Z!*o>qmqw4Dl_l|`*c1Gc67Wy!jK5mqpC23i_c4Chn~MLn z=~3&Sl_l|`7zuvzzY*S_ezv4OOx!Y+Wzy+>hWl79=U+o|p{Wq}ZRnqT7{LzKk66yk z`mHGX42I=x3!XiJ0pkneUq_ojjpUh(A>OaGP*OidtS@HP<@>d8!=H5{cs2>8ig+e| z#r%&V;C8r|+bs}=54XNURpvP=ep^_=cpupDf&3m|e)nAM;rEeGBH(wSq(=*RY2D+O z_t#3NpBH52Z8+1z{@}slii=pZ@^xR9a%<{zlI&>a6!%t&X52N<<&6&SGhQ}>n^5!- zton?I0C{%FU$vw-STs-Z=Wh)2cdwNsN&KDoW(0yf)63ru;O&|}vQPK>nqj0FB*_e0 zQ4mRv5!+dS_Dpe-DmFLESG>7*auENiH2<1Pk{&_)kFXU7;Xg;5APJu(F1e5;JxrYmRb7FJ z-^f&Awk~JU_h$?l>MSkJW`|K?Hi?$!A^`GF78BdbWE6dL;hq`|*8h0wOz-pNy1u~D z7Y~-v*oFy{q&P@CP{as~@-=+ct;}y_CCOY3_}$nuT;o#4ZbcKeUe0m!t#cP! zu}~T9>0aN?i+H}}ZgdmPiExa7ZCo!*sHE&hof>H`TQx2 zR^;}^o3=a~hPs7%Ju8AyUxA{(j(OM~#9nm_)o2Uuu&$9L2aA6f`ZxrHg0wPnSWD)y zLx={c*xM^=pdYc^8R)Gj`T(Vu5_+Ovr~L`kA$1|ld8wp1NVHD!Gv^!z`oI-_=G>h* zmvV7Phldo%E!J}a9>C&eU40Tr5dB18kDFLG2!KhFb+0{|nE6jGkJ=uq;;i{u#vx^5 z`!~LMR=3P@xMYuf=oT>Oqb;}|-`S*2`iihWZerMke_}v?TrKfm))V|oKm+){jvl{c zkMV=SaQI7t7=Sk*8e1l2=#c^QY*L@n7?Mg!~7yPaY8R16aE1pMzB(SDx>qh_cdh>lOxbcJx4G|6D5#l00^~SdFm` zEKU!D9Kt=cv?`vvZn>zzAxN|@_0TfvqUz){Z8iw-?Q+%1ZHJ-p%T?Ac`sW~4AT&Ae zPXPijmh<>$mY*iO(?4xfeS79FQV_EHJ@B!oXO7^WNrI4vs&NQ{=;!U37&Sm1>W;gv zI%ZV%Jb<+iDO8N}kplI{i7bW8nSN4;qCb}XPy1szD-ZlXnjgTwjrqUk(jM^7{qg=t z`(sG?ht1ztvD^XRv%CNRs~N!4m-qpQ+zcsy|2XuCOm zAG(zqB26D4>BIk@>kGfE)Or`g&n)wU-yPenaoHvy6-X_iY@7_Cw52zv>3`kMf$lWK zKckuRc#}LXZjnbQTTi7_Al2F1FO^H8p+Jc%MUPQ{TNK_wTR?xM@tVXR*8lcrwZs3; zJ|{o`Yo-3D`w1X&{|o481YLqwZql+bSj7F?82tc~Mf~~&>;eH^InG?-TDcm72`}D| zS-1yq5WJj!^L)A?guaKfngRE^u|9Aq?fZq{=9T)v?T)@#*ObnXuFJ)9TN!7DTgyb< zedMq52xWY!obh=woKP7bV-AUz^&4sd;T%>g0N*wyDBvk(KfsaeS6QfK6>}yFbQbaY z2aLEsG@FiLCu=sjj8sdvw5W#MwPJ&hufoPx6KfLz=z(lTsm9lgOUQ>;mJr6M;_Fr4 zM(w)ZV1cvi8tw18yB%L|kfa8Qb!Yp*D`t3in*88($7ajLP9zYjYJv|pLd4f_`9KqE z0qW5C^Sglg-F0yf__h2m`0c0iJ7ct;e3vu7!+XN-PRv!sT)vmFSRvo1vi$gciuqkQ zttayRU-0`PixvEKoaM*wM&`F=Y7h9``Bjwi<@o4!ox$hZe`DcdfpCK4S}qV`zI`vV zZD6(yZsm3>GZZFp9c4yzrR0icF#DqDlM#iVZ|@rKaVlQ(nXDxbUhSpiMbnE(P0`_9 z{bkg6?JRtDqbH--J-p3Ulr6>H~v+sY-|067R@c&h&KmUuE{}(Up3IDFW|8xF7 zWwC?*p#l6q!u%gB>IwhX$Atf`=c5Nm5E%cAWF>f)t2Q!Voe3V(p|$=bN`{1^3%|M2^be`AqjJTXD??io*1GwTLs zUColaH~-m)MZhTC!j+OMa(kcnyS?!9pJC&(K@uG#%1`q14-YcZVdqBeA9_a*w3?+Z z{U3^5`G>IhvLr3|zf?bbZ!o^XbE3vKya)b|MJ@dwie2IJ%twTp&n=ep28+KAV2mDf z{g6RkHkLqo%(YuX!cuX)kE4rjJ~ym>Rl#S&Xco zdK7!CpJye#!Q$r>fBhILC?Yjw_e4Ku`8dM=fqvRqEtLOB-qqQLG0b`|X5BN}(4Fx~ z@AsnC&n(FkIl^slUtQ@(<`3ru$sdM^ek!~fMnCg2F}&et`l{TS|!J`TSdwLZ46?4&=7z+Z>c$5KfO_rILr2X8sUdmzgX zUib7-34m(G(=B~SeuKXybQ^2Io-a}*zuCw?Wfwu_iL6uRpXu}io04#lCWXtbPcfX< zvj|R9&%;qCg|U+c>8Pn(tb3in8ZPbWuGi^`msL#1PG~}@@s-g z_$1maH`GxKbqhoN>`a0>D$4oqRAk*oKsA(53T`%Gc|zxpH`w&PQN0H%DBj@ujFWit zMUjE=MyStU7-Yv8vD2q@a}V`-YY=@_iXp5<`)pxNW_;73&-70E9Ob9a9Qn&2wL1~o zHQ=fOx0dr+%jt6{k{upJ0?3b2%jvvt3id@>PNfI&rP4D1Q`x>BZ0%AW^k_Z)7ohLR z=2LsK!tp$(X~(l<0_RgrKv*JD7-7%mQ{VJ~6488WRCvy11q09Gq@Z|gjAv3NX{={> z&WHh?2=7kz%?v#eI`m3f)EGVl zEyF&4z$~d}iii3zzrmkBPz=`1;?m)yhQQ|!v_}G>jitdLR-)(+B9-p%(ppSa1+J9& z=uWs-(~2*pz2=a;uXP#P7S|w4@_F+jonO;vu?@tji`=K$j<>i{Z1{n%1^BA)SthK{ zLa+6CBPq8>w>)BVZB+uga-0>VC8m}{IuS*UD`g4ObsTfqPqyAiJbZ`9e%vN`N&-%y z2Fj~6Xs()CRXSWLM!Kd2?_%@2JAdU$Y7h6X;%sVC7q-a`hs$LjB%8FMN!+{TZ8N)( zW@@T5<+4$FL_^JgmEE>Jj^AB2t@3|u$JJe=EfK|V-6TF`lf9q3I35hMDBGsuRC}Ux za9yFcif(yLHJ6$|ZW&m|Eq48L@#qS>0TqOWo-_a}(`oX4u=TQt$3a$-OC)m7l2o=K zA5hP(m@WBZyee8vRXq7h5^zBX0S~ku04YgXi}OS^h|bAwu~+A4)K#LX32>wnmVW7SX*5gs(P#1t?KXnJ8Bwd+D?Xi3+zUJ`ARZ@B7PT^;ca9kFz7&03+j4$6ta0J zc@Dj&2iAXxZl<&r)NHn_p<;3kp8uzgtpZ|;GWI?&TyE7Y0nnY+t)v%pwUt!4W;ZT& z?W~G(rKIDxXK)tzu(h5j&^@HCBx2<3#)@WT>_pJAzJZ2JuAOT>MKzygeN5IUNmNy{ zdCgvY+2Dul1C%5pgS$(X<4P~3wQ&^^vYOBOP4lx5=r-#jmVteUn@UR}(U*E9dM$}W zoPG!3?AFqQNA}bOmL8z@y}=_X2bJ1qQOy2t-rME&<3u)`vy*Fb&zS!$;0;t(9Hrxp zdG96P*9ZeNQU`?zrnTvvctAJRP`^_KQ6f~go}S=ew_-J&gY8e~76zqv-rF{vVlcVP zI_FvFWClfp8oi=3xk|`N49<}(A5`|^^a@U$?$U8rD&uU#$Z32i?``|>Wo2cq9eHod zd;5R#q+Ig!-|f>t$Ny$GYD1}|S9Fz`L7TPL$fqYSZ-isS1yw5b8UEDUin^eNhYYwW zy(lTAtCT|VncdisNjxzdrID(Okz+YCNPB1_NTZXa{ zfFDr;Bx$;*EL2{)21xypt4*>23baWN*p3lmONG>Q(s{shF&d=ja#61C@4=GD?$WM!9u;3ptH=h#Q* zJx|=&Pp^bN3M%uMTl>Juy!G@tKl=$(JqFdpe)6)#;G|}Aa?Q>7hIOP-xr)m2u@Pw~ zlB`+h+5g@D=uwvoCfX&_)+LuCSZAPnBcDK&Ub>NF)*R8L)9KRv$PfK4C8MGq9I3jj zV~ET@gOFj@5HT4ok(t?v4EvRCa`Y)2x-bNif<-x8hUEJ;WN)r?vO=A#z)B}8tg@w+ zG!>_rP>DX2d|#8YVSMrnO*oY#iak{n*WY&5lI_VpdLmnlPT3`6zqk%Z*lED|ck)!J zN<2&}juHt-H%mQlD7zK-gMM@bPd7n?c0b+3;{l-_&Vf|rx|1DzISyoGH=@rP$}IRy zQ@*FX55E6+{7N_DV+7S_!LGP3yGry*FL%O)GYw|GTMgEjgTY}?v@4ovt zWn0t!c%`{%uc1nGVDxNd5 zf+aZHu`#2$BD;~lAwL@S=`b4UMLDTX!$Vn%b3Hj!(T*J5BEH7}#X0UlIK(;bJk<9A zPA~w<6S9@0)i?vZ&O(h2>OWp_t_Be&-pD{lP)pCb_>*!k#ZjjL$t;-E)ofRaw8|0# z`o68NMR}1gIlBUf^flXU21kd>cAVl|i%S&kQfEBh^5|7QO7$7kY@;o4|4%<1b2WGR zjXXf?cDY>buEbX48cJ;=Xo2BrO6_hg*$lF4weW9LX_Q)G5i|`lw72kYd1SSEgdIdn zE&Zl{;+I3zMiR9l7NI?NdbF}WRq{tuv^wZRi=+{0{=O53K-$@j`0#@h;{4^^Jb$G; zUs+0F6~oE$w_bv8u_wOu2);2kpe8+(_WMJ8Q@|w$)UzLNl1-XNQgz#dF2@qsJ zIEO4Xhh{Z%ARdgl9z-Kbhx@8wGVf@%8|Bk(N=r*!JM)?Yvm_dw&Yp?wD;NvpKKdaz zvz=rux&r#pY1zR`4R z1UyKo9+!9=kt74&v&cq!<9QVbc=6ed%KJ{v$HYzlN3#z0fmn!JgbT$Lov+RvM2Tqf zvJNzu`zWa@x#j>qr2%GdMvh5&W*Yv|@t1+W5%5>3CC*yn7d|b`NT*Yj(Zgk=E1VWM z*Y8Db@(U^RKz-egsh1lLf2q8qv^4GS_0ZuXuTx6pTp{q8*X*qQ8sF9C?8ZukoqXLQ zmr}bIbq^h0PlswcoV9eSEm`4Hi{uq}HOvY+tgPCLPsE744Ys7Z@kp?#Hm~`%*K!}F zQgYpGun{-K%njQ*oLntw?!OGj>aAc>URJ*hMM<|#Taed!TQ6C!te}9C{6dl!&pxI0 zG1N7E-wPO4F@w5jt?=8nQt$5aGgPhQdWfC!-xrihxg~-?yCx%l!OTG`yP{ z{#t{E-@?y;hGF4`?CpnNAsH7qYsoyFwe9$Cfrg>osN8hxLFcHHYWRt z*T=d23D$ARF_fuEfZy;D4&V`X0P4}m2fgG3niXaQolobESj~X?^ATW^EP_LLE$N}X z{QRUG3BeDh30C)nAIyiAp>^rKltJ{gHsuT&)hlj;*3a|DlUmL@N^N(xsrW%b>q1`hv@iAAwVI@Lhz%(@~~V zQR(U!dNoZ~RUOAHaYmIAhJmLyQ;+b1(wl6lIeWS9C%UY#1+ocq0m6hZV za9|b%_vs|53@XhtnK6M@V1iRBGE?xMkDoSE34YI_BlAqIRjJ?(O`PCuxK7`D|JBH? zK!8>t^Y`yQ#{LRUW(*$n%Vvgp${KNswp6(^2Q$+)t#jhTbbgvrjql=zjdf#s=N-IR zoB09q9^1qEgu{?+s?w_LM-GGx=snJWl=(Or^$EgBC5*^nU>%r}ZY4!7u2yce)f}?* za@~;ygpOP1$J?)NAe+ek7&J4GQP0A+k>>f~QJqr?Xhj1xX}HLz#(8OuLfkP|BbY1j z!CbW~?L;w&}2J4czeNGY_za5gVCDnNC**CbK2ZM% z+&v9!Uc`msm3b`q=2B6OJV{wWZj7fZXxuNXKcQ|AJ2(z}${FnP+=0kD0#sd|JP_99 z?NEJHL!is^J`0mv-bZZ@()?~;>wHSvl7Bts65szUd6izMgeC^3>5%*$(K>6#Kn%`W z(x9_82cO9`cj8l-rp+CnUs_fUYd0jX_!*d#!W^Z#)~L*{O;ai+D!Vd2a{LyD0m8Im z#}SuJm-oR<+RXQqZP}aiw%vY9?lc<=gUQla;}lDgb9!ysp+b|^rgyH`2zt&Hjrh!6 zk&osmw_1&F;(t{!wO=?9qmQXY&ccaplNHPS2GVEVHoL{q9;ZyN&8XRKzep*rrIF!z z_{Kzv{cLApPTRoTX$z=fLIp#?j*$1o8`KzJC>AYsjl2o@$;;0|A8Jc)DJ;NwnzjK- z;UYM;X*zcWQ6O0;OsA%CPF;~}wsQp$ooO3jaak6qNANNU=PIhV?^hUYO(V{At{{2x znKn-~ok`VnCJ}d^Nku+$k*Au@q-y*Aic1i(90zjbWbSoZWp*l@QbG3iL(TCNFATQS zLxt1hU&F~7{@LfX@$RBB&7?Fr_QuL=IJ7}$OFXn8&el&^Jg>pk z8?rrOPt2WWr85k4hO&4D+;k3{at@}%zcCJ3+C+)X?xYb2N1xb@?78P>((`53QdHZhzm2{#)<9zVoXpB#Op+#A&Ro;an(!>*G@MNqT72oz}Wm=9hYXzeGiZlo+VaK5+Ew-&sl*doD%{k;VXe5W(U|#; z6J`pZY^0cg1si85_e85#dQhdEdn$!j9`)m6~! z?ih?6KourW44w!sC@SK|C=_#S7lTa$rj#l6V+8?c)~%o^Nf5P~70Wz|R%6T*sSv}k zpjA?i;&gKv$}>uo6>I5&=@~QdfFsi=^kQ^=t#SvF}BgetvwBsuWK#b05Sx(CsRsHsUq2V4TzIDG<1ihQT&j!^WD66Za-dGK_}&X zP>sx`O^4}$_4Hd=^))`7wRAp@pz}6VC)7=F<+Uc)twUXAlXKEhb+pbGG$m{xkMk%E z>6BlSU-(VDdcXsKR->o>Qc^dy9e)S#rz{&{g4uV<;%Hnc5q3jn`FlME!9e)S#rz7bUixN74F)5RdjxTa@5zHpnOyvo?BvSaC znV3~0OQ`>vRMxs=U+;oto7d0}d!iT&d#O;qneCl{DwQKkG3Gl6@qJ~t7zhouBo^R& zFhy}3v&&EeC|B0=fZ~WUEuSV6n=S|BkUP+6OOTEw`v^AR-{){tt-aEU|JL6rLudL!>-3lU}uvOWR*EGk;RWqymw$#!w z`UlzF1)h`@%(Ml5Js+;Qz)X(?UNsLVRm}EX5Vm9=${kD2Cb{MeK*}9UV0_Vak(ek6qmAfztzV@wFoUotX ziLK1BDL*Tl4iy^W?0uAJ`a|P&akjpSMX%hb&1<)R=RQ!VKU9DNxyp&k2jXJP2`U%q zl^e85fBY<p9^h7M|t1gA4iCiJxN)h%{yr8MfJAtmCxPn zSoDV`pq;@u%`sPZ4BS_xTR`O~SSO;m=x6&5$$$1CK&`=Uf7eX$#-3xYIqoh;HewME zqehJikx#@d#Rir)VVw3^>I{9q`i)=FzJnAkW#$ayc-s8q13L}aibL5HacH(wP26LaFwC&yfv21eN7c%v&-W*ckv zU@T~pE1>Jvb-K>l3d0j?zlZ72)~-~mp3Yk-&qIQ#anr{NIlWj{Irj52^;(>wOw~Di zIY*0EzCu^s0=w0UtSV#v}pRjjn9#Fh<;22hcmJv2guDO9Ill0lHycS!$Gu65TS6hqF#jLB( zMSxwr!1^_=!{E}ol76pm#Bt|h3@_$W>#md;(0^6jYkP5016?KrCMV#idb`iSvE{f> z9@`?1B{&z)S9s~0r>Y66(_)mVe_=Y;5zHo$khj5Em|;JqWm3ly{8Of-=e^@xoQ7>- zi&NW9Z7HN#1x?#Y&f7ZVAqyR{q_&~)RG6zKcbs$(cxt7lDqVbrSnQl+%)QNM?`M69 z#PNC?1aad2&uMCPsAcoVOU1GNbcWBWj(C^i}DoQ%lU zk*;(kzi^wbPP+s;Nx03ZOv{kb@jJvt$A$#Qmq(Rm%<9pEzh#uOaD;Q(yu2hMe0lY@ zw*GQqz*#sC*o%^o7uU7MqXkghi+#r4Xo^=t@G*R)i_y-qyK&grm(;yrXmfoh{^bbqw#SBN>VkE zYeHij@0^cPe6#DEk5UY6TZ9N%H&N#Ti&$JSIcq5<3KQB?I`V#Va-g-3vldaSBR#FI zrk-mlFpFJuBC}=^@1krGZ{st718z4k3|Ga8hu=Hqs?#rN+LxHn+O#je1TzcH3VlnV z;dW?WZ25*#7H8oY`?=P1YW^A04>fwZPoox;a~~z9lb6x%A!P-@D%ro9%7r=EdukdN z=VxzM7LUnpO!&2-9+Z&@6pm4nQbE&+*~r2%EfWnSX^bt$IBos3xa@+Z8tT~JWZ9_~73rO$speKah&fuc z7l5}{9KX4eYyQOz*kGqj$u^VRz<7#vMUn)dmQCU`Fo-isL>d*!bWRW@4(zRM zL#*vImvsSbsO>pxE0xcsay?Eki37yhwCWP^6%{OF@GdnfknL@w!U{6b67e>b*@_6& zVALtANG0a|NmMSh0r51O6Fe3!%0||hyka=&v-e=YYZki^od|s#xXnE|dD-uT4Zx<& zb0Rl^v%A!QpUxRZ>Fg{BB=3s^>;v^dN`x`)seT@NfRk(90R@g;MqlNhL}7ZgjiS-eZt7-x$ORG3y! zA{wZ$isWJz&!H?072Eb|Ng^ik5FKa#Oa9FwocQhEcdU<*7G8v^_U9mLs^_f_kSmSW zoVAn^TKAsQZ-{d&9T5LQXF$H=EYv2~P{gt>r>k$m)#`xYas>*2K&9*#Pw^E&+ZP@Y zXo#^OA`oAqo<#5k6_8S}8c77Nun1bIx^^SjLVAyF<+P?VZA^(+OZC)spX3urA|~-S zE>qWqt?Jz!SJd#S6qEA4CYjjr+dp-(v@mcqq7miyVp(wsBv5rW@90Ufp-D`*Fb~N! zh%TzkC{@O;?*7P>yu$FB1>6J)1EP`f>hsSb44~_07C-M}&@_lI(K<2g#7RZ^60wKs zDR6A(6LeCpQW(@vUZ-m6C;z4b^^<>5!QD^(PGwI&!JaZ$itHyxz;s=08f4T!o~4C= zY8;K$3+=zul^r!BnQF%qzD4z)QUNWBrc^gU6EiB z)2NKy>htjI4fJWq!crn`As1lLn#EqY);ZX##4D1;+GjS#2YgrPKrRHrd#N-V2FgZDon9 zvmcNpC!gbC5aT4Wt?RLaTpeooZyyWHA|kz8Ni`}n`c_S&vewq3K0!3iw7xBnygo5XiZ`{%H^V#YT$FGEh@-sQhtN`sea2tz|H)raCmBSeU!p# zlQ7X$)X^qWfjZissNfFFXLC8QqotwNo&H!vGJgC&d+!1tRdwx;PcoBaAQR3EOfYKD zq>e2LRy1%WPN<25Au5EK1SU}+p%rNws3M#ZY(q#q3FKrmh_|SCi(C-3TDe85ReZq& zkl|r@h$1Q~KB^}KZIDU=O6LDvd!KoQK&3z1-uwBJPxhSseyqLr+H0@9_TEu=#Gd2q zt}p#v;Qbqx1c*|3Mrv(T@U~$K_+^y zg9{69p0m)i+NsT=l_u}jWuW5WX2gjH|IuD0JjNDhS?v#Vwh%QRp@P1&m=!JcwCE4M#;c-bUnyVpiB%><(7cCS zfB^bYU-9k#AcBKo>I11U!5j)*wO7Qz+{$5|7Bp~@IEqBI@t}VzcL1%YWC+B>_^XYA z{Uhk*#e*H>vN0fFjf@PHG7+w8KZ$78#kEXeE!w9MsY|0@4oK%#U*Fs$Dis34laRn_ z%MKU}Ui2D|$me8i!dkuBOybg?C&C2$ZWj_U$k(Gq%%E7wP+B@FTgBn;@s^sUVzfcW(5hS2dA<;EwmP zKY1fkkn$x!>>V0ry!}I)@m|8;5Il%7+!8r=1>rsPEoIV`HMxTj0HO9;$1#XIgc2UF zPZ=1h4yge%0VLI}s5CU9GjKwRS9vRV;*RtymhXwOMM#Kp?kTJ5;S5 ztkw<>y7DmNh180CwW3h1Eeg8Ez=^@&R%^!xUFEhxn0r3`3%GUHq~HSDEu!(EuBW*` ztod0%1|$S&KuyR+r{u%G4a@i`5SrG`RBL4wBKh@v19troo^m+t#x;@A%TVujNEC+t{LAY}{SO z?w-QFy4#dw#s-CI21y%H|YWd7msXjx?8)th(O){ilux?r+`rl_Hbjk1GzEB-MdIOKm zY7=!!yaEn|W0$%`CLLk3ihU1ggQ{-3T4Ys=GEUX6rSX8R#cP;{HrLF~jTGOPD$()I)kv zUwSXj>@1iho7I9zS_ed@dQNfar~JM2Qz-ou?S-DxH{}8E030)?JJcgZZsmBAoTeO4 zke+nBItfJWyaS*rzf(v%&WEI1S`O8Wn1@XMyUIA9ATZ!E*zmd z{)7oI=iD@h`GPRa*#cgrz^N()#lzK_#hDls@#lLJd;KH)Ud#9L(o(!`%DGPwowxM-x1%2^&p2+WGHuI13~a@I@EQ#hy+Iq7b_m z(yb5tSRe^>Gy zpal6xN@t?{1FY{bu?fl)RU*2xb#GQT{C78UY&B1ABJbQgjpSR(7{TT6=dE+sz6< zDmOl~=ktybloRaiPP?>r(?cCytaBA$tXKd7gf}uR; z{E)-{+yt9oFT&bYgnFCS5q52Q1Yu9;<`4LiS+0L6Okk$?74Y@Sw*iEtmtX-SdkiOX z8jk_p9W>hUwWx9vo+@q1MD9TIeEP^aK-rh5ROfbRdhl^U6CHadfL|~)srtyMz&?iR zHfxFC>Bt^iI{J^(M_+ind-9YMUGfi=6CqYGT<+)G9S%_o@}O;mZh|FD-hu@KQIsKA zkVl+=(EEozCt*V#)}v@sp@TG+l31}F=RR7L@ ztA|2$!a^dWA>=b`83fx~QVe09-CVU2tWsHMA9N(FI2*9966bw~M%sn;m>ahdR8g!u z6T)~P5oj_TS=?a}4m)>{$`nE};Kmnu4er3OAt5 zCg?rc52Otz#orpx3Mg{oO3}Y0L5Ytl-fj8{&rcT-9w4qoZ6XGekU(9+b$**_;Ete6 zI6j@o0^Z>C?h=Y0!4$Z8sxTUvSskTU6T&%&@hdg_iC~pRs|@5am=z7dX8>y=GUj1L zQ(vNuc}UN-!0SIroW#CcX`)^%d2PCpSwx(7;7j7Iq}(3$}hG;(!-UQ964`3-Q{K zA>?TMc9IQ}s;3b`a)q5VZgy#x0_cjC==P6J#=~*fU<)#5Tk|;6tF*?*d1GDv^^##w zYsc3JYdg{vA|az!JAzoK8D#8I!##-CI*0P&N4_C`l^SNlDQze-Vf`fqd4cdSv=XWc zCtQZsv2X$s>#38bvC&WxeS*CI1K#3X&Imf{BinQhMhcV~GANWM5%Tm%b7G5!%t70U??XF{XeR(eiXQ%&6celo zuyPocC6{=$ek7vPTi<|E+iJoEitp@6S6%UdxC!I!UXeSuA`sF@mwr|j0N&O6k zMq{S%n7)0|2A7$1%4xI3qK>mj8@&D1GAq1$tE27G227jdGI& z$s2e3<^E>2WzZ%`RYVbb%tv`l-#)*~td2G**V))zCUuTkYJ3CHl=)WdJrF(NnZJSw z6`9{DGXLSJ^}pMTy6drS5*fb>rD-6oIxa&k%R+B)o`4uSev)v*8f2-TCEUZ$5^mW2 zsXZIY^!z;Qqoi&~%-?7`W<0D9j)y0fahaG!dYDzr{=$S1);nb;7s`{?wySe8VoPP? zFvg}Be=e>}=mA4MfcQTKLqINZzL@Sv8baD5Qp2sl zf@?IT#3673yEYy(Ih^l76=2F)-1bHsqsPBtEN=ivatR~o821uwUD_fBwz`<;xR!!^(62kSE*yJO)>DN- zka_J#+1jrm&*GaJqUm%G4>%HnLe*vppBNtw<_!A!;Lb>6A2-;X@FnpRjI7uS4Sr~B zAGgX$ZK=u*ld>a$Bc;2vO#6)XqFol;{rEbF(y>h@Xkry-;-;_vp`{PVz{(D@@PF74C%;Ud0`7H&UBjfvah;KQ3VC>W8<^(<oHtyiPwozTYlB&B?eSrEc=M8Nvj*E5cu0M#{LXDPEc|1$+7X!)3YYR zLr>eE)by5~L&FItq^ zG5gT%PIl_IOqvZSmfHh~=@7MIs9G_Y>t~fgz_=LnAq)VDk7J)mlc5hT?Yc;g5fIcL zUJ9%!oxs*O9)-mVv{Fu**!wsu{2p8CcmjTY(?q{TVGY}feRc-@&v6SbVzNpNk5Tt* z8Wfbh7~~JYp>Hh2ZKIIRV6nL*9^7S66d}EXr zU5d#SO?#SJ^ESKPgfkL$)oYR(Or$e~#z+n8(2^o~6x!5o0swHf*@KJ9Xam*nvXtQL z1++gL!`HzLRx}Upd@W}}f}t`?J&0uf$dwexscybv~v4pqU2=zg%l(S*+$3RvSepfzhG+g;nJJ<`!x400o$B1a-#b>Jc$l}u=K1=cOyUP8=MTk$!4`i^M{BStM z?Jph!-V!`dJ~hH;iSSv5&s6dOR>O({R*HZp@NtW%Ps6G`?nww!qWFFK@L+V~4g35n z!NQ07V}IyuNC|UIat3`FAgfk&E*)R76Z04y?XQTDJI=(sZl%SJximBZjHQVcK^455 zODzf@D#G0_V{mqob&t34Y6KW^^objYpgeii1NkdK?_3aZN&Y{cwDU zc_(>Fm`3(V7>SwCsYgcrK=3n5%2>PR0|TX;O!V~!The94{b4!V__xJv{IjR6ci7hr zCgT?DrqYyyGg0Q{9Y?bmOuflYlzN*H-S5YxS6&K{a!A1qQK4F0^K^H_GqidB^U&O>W|YbI6IXsprOk*`Ph1*n(6|IqN{_RdRPKyqBoFCrlX^An>a3kSzv(`NuW)N zf9QbH3Ze~HcqpAygFFNUAzLb^Hfh~dIP^Wm*bXB+MSl^`kA)J+QRrT)hTp@^57XX7 z4axvbCV`5X3YNC0lkiiS+ivsGwJ?r7AAyM-ZU&!9j^iTGl;|_N z7MC;PKqH!kGm_{RE94#Gi-xUx#ewndr3ca)9B;y2I)PMTA;g*Fa7YanOyRl99lH@A zHH1vaVvXY<9L_eWfu{0f4UPkF;zlEsg(Sma?D-f$198Zpt#%$J-u(y%d+;efXi$y1 z+);#gi90U2uqGS*ngSUF@6s6)mI$XEqrW}u{*94a$7R3-tClbkyNl_P-4 zjlSQ#zhAFhg5I()bRNPbR~RnP21W`npBW8yt_K>V8mfeB5ATs;Z5kov*-!(q{^WX1rsH2aP1=0A!dZMb6hO=QAP#C^iBD z`0%l|+(9!U0*G}$08NT~gf4Z^#E1Zz7`00<(Ey@89hCm-GXXnuZjl-Igu@*(HD6z~ z$gGxI)pCnk?pDjktL5b!67Qh>1bzQ2f;*XMW$!~N0B25I-+ItN)PW^>wr*_@2927c zY$5g5n|yCWd;xBLodHyou0$A!_=F4q9i6Q#Y$LIMAw>dH1-c1}gLN;4K&G@-b_{I! zEV24R0Cti#bX8Z#U0Uk(FLfL+p}f#|$6RL{`Y;P7Us{aU>J7-7*Rz4w6WI;%-|1kr zpHiP}1o|qq2W7`>D^MnwKO=EAml@xhrvt=7ceFh9oIxjaNZMQ z%{APg4f^2tfutfKb{>NkjFHyXw(t4edAyd6VcMNr3YD@; z4aaz8+7m(eNPM5?_4Q@0PjRdhw;z^zw7yuKx8Vf#rzK^CHl=RuD7K!MkrjVB=rv_C zvYvxId7J>-O4FTM{3&wH2)c?;MMGOMGm_H}RuXWkzL05v^>FQP|IKF=99`AixK|BO zM9bZ1dV^ynlF)rjzQh;=e^Nw;UkiDUA;M7RJ>W+Vp>n+b8EDc8o7^|Shz2`%qh)WP zWxG{4Ff{-lXo3(#11li97q-SRBp=8H6m!0Yrse~@L!?D^EMReCZrZLAiuHZXiz;vdUy2Z5YGGBd8aytN^0XnO>{Z_;ZLG;WwB)$FUXZ9js;0 z7C?!R7daE9Gwwzbx*S6|rN$d@4-c}nLxTkxlJ~rTI)D%hc7(_z?wkm(8Fc58B{Xp# z+Xz9$aXE?W-9YY>k?1ojJIr)to*7$`I}(p=GRx*;n-a*|iUwJo9ps-?eX*9gg3wA% z5k4lc3Y#X1nN!Rz%x}^^b|T;2`q;?hw#sRu^i<|i|+wq=LA-FB3bU5`bqGUe;!&? zKM80qBCg^=uW+CFW7yLA1Bg>r1`5Yx*Kenxp-n}6QFa=|SJyOAR@^7lL?y+Rildwq zDPQT#;sw_BFWmuayAwpNOUwWaK7Mo>JreaQg4ez{ZN%qdf=kCM381nxgO| z-C&v;ZR}w*8=L?Vgz7nD(y8GbA}o#Ss4luE3cUOb0aiB^)SIPq=q_49oxlSU%0&bv zkm1(4uyHSn*CRIEM;+PvDWDN5&~qxvKznTf2TBd;+4Ix^q+V?Sx~-xhrSnRuVIP2? zbb6!)B7;h2IWJObWCUH256)4$tJpA(cCL)(B5+EMzhQ10q5TD_Tsxe*)HE})Ty4V7 zJWIzr!nwDzEphKb)ip!ZR=sWfT_9V6(gl#p|qU9itx5%wQB;c9yoi{a|#tyb1 zox9{~Z%~Vd@SxneLwti(w{W<%=e_~;;vK8rY}P9@m?~6F+Pq!tY2seuEr>3nmUXGVf& zre1@Bnam?Y?eb@XHmU`p1)+SsZBPJoLfy`$-W};HJ*T?|%2!o=3oNQ4eD!D(%$N$& z$U`6|FBluW5F_KFhk@a;pldi)@=w6L5gz`0pV*V<^yK3RP=SfL%?X~uaP&gvDMHn* zqN)|@osySZlwWHsXiGp(=7l5XIScZ!G$;@W=IuIGFgyi!T93n)vL3}V#_4g(H-?KC zA5J-*dCJ2@jMs}8lUw8t7cnLrag4LTO+|USl0h=&8DmK z>YBhKZ9!>1RP5^?U5`?E$~E&o9{tMf4|(x1SoAL?<)-vN2i=^lu}4`DW=ZJl@7(iJqG z>;FPiTK!2Xu#AKhke2u^MYXcfjw@KhigI)!HY{Y424@C^o3?PRbNBe5q89sR}F~B2x*z|3IV+C2(BnoH^%mLYI}b99?GO!(5ptlXlCn zG1+W4t4n#|lv=5IFeAa&J6C?N9Ot+|y6R6ZL3UDO5zUzm50<0d`K>pR!$lR}g+!Uq zN)GK-MUC5DtTwQ{)rR`*RE_GX*ml9CGa9zyNj{WC`|j1ZVbkoLSdSmV1G_7s*1Jin z&NXVJwZ(bF=Vq?E%$j^pN2_s9%ZW5yFra^R*IUmKe79d^Y8X zp>;52=AD7FuQ}T~-gUO9#Zy$A=JU>!8mRj`9&cG_H+9|3;60hkLE?=d0thZ1YEn2X zC*bEN3zXcDOwuP4NuR#LkJNy(Lj?6qb?E}W*ecGb#4SK`^-TG=^z)lNk=AD}Qd*(c zKJO@PljhIsR~c;JsZh_5o`QC)8m^~I7x5tM|4O)DXl^BrZ|hNRfNVzu%IjGn1-ZgO zyyjl*m$=9^TzB4~Qo~;X5W3zCLXeaB(!+rw}r_b z!2B2d45|P0zl798qbUi+B&V2r^^Tb<$conBy&3eE)yuwCKAYe2nOQkFKeZhTF1C

sQc>cbu+?Dpao<27`7gaITK1NExgCn$O<9rp)9FUL2=T0Qr8<_ zpHCKxy0pFyu}BYF1la4z4q9$jy5>j=Ay|jtu=#xm}aKM9|3x$C9e;^NyWNyTw(ft)-95UwQ@XihoMwA3;p&}AUrUZ~HlLH3z!sPl)vIv7?yh zcG7sLp2hYdO(EELR3?i%t`QEfI0(6%JH*5oKmvH3M_&2D>!9#5i6k?5k`6G~$Si?7 z4#Bai9g8)0bqe=*heGqKdvnL@leteNe2#50`ciO>!X;01g|HuPl@>w6j`R!!XUq3DAQ*x4 z1c#dk;3y($ubSiktT2%Rg-4sQe`Y7x?TentD_F}6?8wZP5y8*wEofCb3 zM{4*2)m}yIBi@2{vR+rY*E-~gk#5rEO7GwTPhA=TO(0xQI)>q5ie#wU*_-?pH}hKk zmS%p3*FcZ(7C?XOERq^AjTwy&wI3grBTx{cX*=wFtI83^5Bhv#MC<_Eo=r}V0 zB^-PKJ8;Af;lxoyACyvG)A29Gww zL&HTn^}*Uf1b>_iQHERbWE*W9Kvr)xzFnfVlftOWjx!=0<@eXT71M5=z!80`I!sxY zV8?*9lO~a`zqns%2uG~2Dk9EtSbu@_IaV@iGBG_$XP0^vu8>D!AAhLCxk+mHPZY0a zv@(43=LO<#*1hxa}8%aFIaf|LP-Knyp*s4J+a@$?0LX@&8kl|Tw5 z7FW4i9#AvX@_cn!9r-N_@LvNWDgo0CzJpaOXMv-9h^o);!@%npOr>3njr=~eZhEGjrV1R46KoZT4RQjpuZiL=Hw4Ut@inDgw0Q7OtH5k7J?W08~ zD0-4wR0H&QPtJQ~SjRS#C_+sTi&$&T*EkXR;uJJ#Lk0w4N1yV)L~AeZv!46lsT8%D zR<>&MBL2IC|1QO^|0QC^Ud)2^=u^;v_%9NZtG5hQZ<(UrGE==}2Cn^9ub&#cz6wm1 zA$YxP==&>!U=Z~AQBLz}2~c81J5U8a8S3?gGOBq39<_VlTjuM9kxrV67Q8>h&^Qo1 zkUt1Nf+P7MXl>_05ZiX=*SL{xDuJ#GU8}u=sF8#m8$L%F{+c0XWs3#7-_tGXbgMeu zKHCi~@JU2ccWR^1P%Nd4>TC-<#|zIP5l<^T#|Y00Bc8a=1{Y|MsNF9oo1GoAp3a?a zM@@!OO=POcxVW0^P^V|A)3em+4t4rKb^74o$RX5r?QZ-+N(ubqN*L-*d5|i?rH&k< zj&!q;7Hk`q=Bv|-)aixl^m29jcy;>#Jp_JjAvJOVJ0 zJSAR28^+h6N-d7_{@APC^a&7gr?we|qyK@wgyO7;<_w%+0$N{=2=FHA8$R?JLlGkU z;YvzIx2T%%1Z*evaPNf&?qug<+YGyQAH}FO`B&^m5fE+JDa%*$@sm42`pR=wq*vC9aH7O|dg?a7GXNi?Um?QF(Pj$AsVX-W2PcnpP{f+6*CM`@ z>5)>(^-}a)^jh2z2_LSP5}!VbI~jWV_*N!F(s$B5eW(`DHUqPjn`0&(7_%abr!y+bqek6RZUOprxG2s&<;pKYy@!^vr;luUv4gh$2wS1z)1pq5-Ml zl0+Lt`@^TQS^ki2Lk{6)4uf3IkjsUo{t63T8sIK%1ukm?<;KldcUk3ZG*+jm7~fX@ zWO*72uHQmD);QlMl{nM12q{3d%RzV>Z9MUqvyxZt7A2Tqe>q3q;4c4&P>nn4}ht3LJE5j5ilbz+57;P!pis{SpdE~ zTEjC$Rds8A)LIv{2BKCWXGI|m&*Xz-=*jA$)6%jC2^#}ny0{C0Ifw=)@JWM6b zT7*3W^C-+qFt5RU26F_a8sUb7e)N~vubFF-6{Rd!qKZYeN!#{ z`la=e`dMvo^rij>hTy)MnENxlVC`px>RX5-e~CDR+^cYh6LzX@^nD$J=aiQI!t~@; z49C(kqA0h}MV2G}28Oc{V{{6un95u;Ycp|qSxzHeopzA_9 zdT5`(-p=`A8oS)tCY$q>jmfy9;;)k@;tHQ(STfZIBR ze0Ki=aO0#IrsDDz6X}B%Ss;pwjP4%b#R{@iPgW$#DezSQ-c_Kggq9zBA}s(2S*?v z=u3Eh$&4+U;{)HXC)Itgf2^ep+JtuPh7YlI_v&0!MA;Eq4?cH3zXpW8jZ^LN1*|y$ zVJqFLDB-{&G%9*Kcg{0mw|jq)atPa_3G?>jf>_`6F=_fKFHsu0F8-9rA5!FWRNbx} z`GD^eV!0!=Tp=!ZGZUqzma5>>0Tlz53Wp(MpRE{=W zR2Ul5gU5`a;#t<&hV}WWFg&_8h7EVL*1(FeILyeMXD$rMNr--f=cQJ zinnoPTm%%qK$SCc=a}Vj0ur`3S!`{(5m41lSaaK`eexNL~6g zNfDUaq|`LqN#~%jc|1L1);wNZqQoI5enfiQ2NuC^N}3S|nKTJVz?s;7FU- zST>dV$5|$De7^etGz5-Gjr9~T3B5f78oHafQcd2|zFg&Gif?FG^I(j_v5sGd#{WvkN z_OSLr6Efynag8yae;73s!|fY9&(~SsRR{3R>t+0)fPmVzlWn=89X|3TMN5&(6wNGO zUjG^Sc(o#`CL-abkFF)~p#;8%p&AaIxNl`hC+;i2ab0*e+sG4ltkJ2}ue5^*Q@XB{ zvlHOUU&7;Mp|!X;dJ_VBstGv2pE1(Eao6wMR)}7{D6a`He%4>m!&vO*UINd)^>Zt>u(@^4Q_>E zqw}4Ob;v(1PIwi*Q!D3j0?twK5yH#xo!T`NVW9zYma{P*zma^14u@CcJ2fkhR>z~! z1SelaRXU#*B%Gt_BKf(o2OM6P@6-Z34&C5|V(}XnExbJ6 zsXau|M%Ot<1>z!v*XMYTS>yxoAs_t4MGG&}cWNF{B_549`?zS~)%s5DavqH$I2)-; z;-ZBY?YIw}N23VNM(VD(XyLW{PVK;c4q8M&-MU8$m$7GBBk)E4t- z6ajVX9xc3}->LnaN23U+8s*zM8wLHU3>LEIM#5@}&|j{^0GlZMu^S-TCxkKQNj*dO7Pb$)_mCxXVX zrzr_N)ckJ!=S2IIPo(@`ef8UWl42p(#q!>Z#S077qu()2mEHjif54dNfO1m49;jDl6agLKmT= zmk9f`sVGieu#O-p$|N<6H;E`mL6ohR2gp2zfkTqJK5+o~3;P50i}R%K$I5nW$2ERY zo8ezkj#0=`o!jS_z%6y=Qy;um^QAuC+*jF(4k**l8EJ}w-yU96j?+*mhFzOnB7Ztl8n?m#!U5D5y^QmzupWqnb1T{m|?ceBv3 zCvDl&(9&d>{xCm;`41Quj2Gqsgg*}RJj@oDeK4QF%tDx<5B?Go`}8rI$ac1WNvBVc z+$W`bAXI|;q*~yc#`~Y^2QA0o*RGz2aodia@vnXTs$QWzW-C}voz~**ZBR{+9XfiH ziKkfbE~9#p`Yg?Ge%E-e3$h^}z00X1ZUOj0tqQ0E)w%iV6V$2d66zXt9d(Ghgt~!U zL7IOE1qiuz%j;MuWFZ|ViAu=2&Wh~jC$eBJr>OI0@vZh5zd}OT)F)XX8T?arqtVkIQbtF_aMX{mqB5jw zSo=%1J*GCh`N?DF2n&KGWgw!mjU9s@&LZcU-PYB1Sa>~*X_Nz4)%Q@N`s0*U&DQ!> z`np6@C8ZTKDw6jyCto2uL#5BxzhK7wp)KeP<9Xj;H$J7&Lrq~9W^#%sIHIP(g zqAmJI8yMGVM!lit_=c_kCD9xDaO-_=#5A;$ZI?FmkL$QQ5aZPL{k@JOY~ffcDL+OA zKsjpCd-(n%opoUV-DMow7~5ZOgRtq%c(Qdn95Kzf_0(oOff%PYOb1DD_|JR2hYO&Crpjc6T!%Nula|~ zwF#VR)E^bJ0{{;YB7Tx;+|OxoneHce#nx~2O zN*lB|r2Rco_R!m}#nPV)&!bWJOlxtQ zZz7@MTl&EK-hpJq7>~lJJ8`}o^$5f0R|F%vwKR4pH=hSz|aSfc)Gf~(bfo8hiOFc7^>$){|AhP>^Z)}g9c^ZcD z`N&|Ob${!VaRa@!2Tp7uV*Fzr8Z-aW5o|t&&yuO^)`>mMnV*9^=q$)%t?$ASgQ(L_ zWh~bbB|DW~on`k$nl^j7-mJ4^FeBI!9n(?r96yCc2+zaa3D376ESaz1EGo=XFdxF$ zU$te=S#QgJZv!MyEoWjhUEqfxXu?*^ep916TZu7{$onwuV74V21`gC-&XXf6BnBNl~ z#xbxFJd6MhxAgprfp%s_))Iyo-kk__pHtkBmCl5D4CZ4P+a_Cf5lr@GTXyf)z~sV2 z_?57kwuI%-b-RZ?k3BZntGWvg1rFt1d%>Y&6O&M`Rfo(SL|?fiJbLg5&gT>nQ{% zPQr`4eiqH^#nuUM=&Y+=ho0prNOyTO-Je?rbWe9W%8Z0Dveehl$x^x8ls19R$x=^` z#NWG^@O0>@?+TuirH1!QdZ0f#jLykYqkGy>D4j;6af&Q;7q;mC3N!G}w(MWRtc3Xx zCa}|%{o*cLcGK>7_A??&4Ret(Ea>Pc3;KHNwXqBC(}`8XnZ&T7iP1~~tzQe?QeUB* zjvd_jt>p975 zoJz?V1m$rIU_2XpisbdKJ}+pnQt8X!KenC(D|vcOAU?}8P?zVU?CCSDPe$3(_zX@Xbpds{E1Leb)?b`1{TV6{ zBdOhdPEvb{&Qnk9?sw`No&7i`sm+d6D*LY58Sx-K9s24pJ}0RaDlPFqI}OdyVRlYZ ztLp*91MQ5MHv5c{+7oX>jI!UBT?lg*%tJ7nVIF?Rmc8IzTlU!Z;#uW?Kri*;gwfxd zUaFp#zA+dhdp)O@N(#4sNA`LidLmYLBCIa+Pu5GNPV2rX(g*Z8z0{~)bVM)p?{rgy zFaLkkOO1BR8JN~nWUqq`*s^beX@=Pja}4H^_dz^9fcrxzvmZPY(;Ah%@~wKVh<^5Z zsqs|cd(=yfWPDC9RjAW{SI*~*@@##q|J(Ia=g>!mSpy@r+OlUKvSt6S z?M#ej`~vy=(o2n}BL76a)JQ?+^ipwP>mN8M)vf<~R;5!?<{I^LvgfwSrY0y(& z2AtDN{a>h;8b|NrSkeE3vech<*s>SG1YnXnZP~+N=D?I6w`F@y*s`;5ZB*>BsE91J z2Nv|~^irdkAIFORv-DD<#dT*(VVPAE@d6a$qcS>IS zd~3`8F-$$oTQKP-aorTmi(Po3#n3m~lh7Ars;8@Y=<2C%5{`d@Uh3(o%fCo3_4E}u zrTK{iz106hdZ}^qNgR9pe@;@1`}Z$O zUS7`j4>K6D4DN@QmzO?_H>xk-_gzbmbZj(W`6#DyXUfHNZ9d(?V-QxJ_zdm|>@bh= z?L{eUo|%ocDD&(F-vvB{NBPKj^!GR84c4Pi@!YoIa&5Sn&&rZJerdNoffN1}xD3=N~ZMMJ~>#(%%&zjX6!Xc%3%6&gl2IfeMWn4w{GFKTEQU40rFM*L1_ z7~Sp{8kUJ)Hp+o>(QQ_|j=Gw1WSd5Ij2eOm=?t=I&%r&Pz=0b&bcZ^Cid#*WW3tH> z)(?R=V}@&d>*qP>64m*}mXED$awap1D^e$C!NzYLoNQ(}PM>uHVjE`Pz$V+7la0-A z9-lpejT*=%4_-~RR{32cY!tG{SWOqtsspI%sN!m>JR3D+H8rtCGyXVaZ?yi8EjwI+ zG`#|~xP!gT*m4LtnAIE%Wn=dyQQ`L{5v=b`B0$`mL=e-vW{4r&HOyzmn^e@@$MKTxmuRtZ zr!p_YAm7GDSz0ucJh@|(ow#uM2httM(yW82(jCQSY1T)n()1Q-eu@&r%f!|q-^bFN zwyR&R!=H5f-X3D!dC)A~8j$|FQL056+(Cpi`=vR~BeUm)3vjYzC79UKnF>T25yDOQ z^KByxb$H~p|1@=Um-EQ158FJ`f}^`a^I_lHHj3c-!dAnlTgy$uo+<6)+PoAp>wIH#9Icauz8sbsBj&-kae&fMxVntb|CxZVAYqQ zj?Ju_XEI0&cLN;CJlx#9@MYLoKemzi4Aa!}aGQS1A+z!&hC!n0GwbgOPtKe@gQYg_ zLFkrICUf9plk!Wm$vH1$c16n})3FxwG&XcX*6sG}=0E1&ZO`^ury1Lu_e^uP&$CWj z7nnTeZ5P>4aDU}@{6j?Gd> z*mD*D@nMddsiV9L2J8}r$rr* ze6OB-6M;NFc^{rURV1H(2Ty88Du7!}X=x+E27pVAzaUUewi4V2wxA~o3mON)lY_qt zZ#0C#FA?}BI}rJdozQwS67$|z4B#V6>X3u<)&nI6X>jP>@>lqsMYrsY;OP1&j@E6d z0~R)20~8$%OpU|QJ9@^^pPnU-js@uIHrD}eO+Ol4cesww^o1yz-p}FmOSCx*r@xP; zPwQwpkzgM|(@MC~dZ+as`->U3&CV*l!*~1CtkSz@%eVb9t@p?~X5KyP7eB9(vj&d5 zEbFS=+^eq09iCNEP?$CPr@y={Yy2H|%$Pkm>xSEJ{W0b6diYN{Y{yOX8E(7~m09&^ ztv%aAuV0xkrD&^c{COycve|-Xzvw+Di~A+R)i^4+O-mVmFyk39GxxfC;TC4H;2IF{$CPjkmPt5u@6wZ5V*3pz~?QGtfx1;teqO zs<}z&+4*?qa5Y(^#urdjDE%NR#I(jQqy{&Q-~k8VUY~(<^d5G#VeEve-GD_XeLwv1 zfJS3~#Hu#FcsXKh$S|d6AAM>SMW`aXJD5Ztx>h=vGz7LJ+_WD`e^XDonQD_xv0ucQ zOT&h8RO9GV)rl`&O0EFUjHNm7t)ie3br^lrv`P34CQZR_g29L~rg9sVQ3V^l1Qbk~ z0UPBI+KY#5Dp>kZ*hMJ@J>SjvuAYf#?$t7WMXf2&tq!A)nr5QkbTfW~Nml$4_<~7x z*eF>jeK&81oXygx4W3Z?>+lFBargiq0mH^1#%WvcU{Vbd08j>H1P}EUhtjtqGHb`n zZr8IBn_;gWLhp%{6njH&Pg80fg$cftV}*{Q1Yh6AW4@1pif(kh-tp=%%0^_1T*gX{klg^dB!2 z^{b*Msp8UaMab#WD~GL=1--U+9R~&Araeem^#P1b?y5wpjh)7i-r!$RARZdNA`Rup z7Z=G^J@1@Ag|gX-#&PCaw=Vk?1);?ddM)T)*nvF46DVZGs}QUY z2+%+_f=Uqdqi>}BD4%XfrPredhu+p^QTbz#@it^=XBr;IO<>9VS-q-AA~z)>6i0#r zN>GEcL-c_7C#aiqzb{Fd;jq)|uXf{~RY~A7RU`}`yx&T#v3j+y^f$}UUNe9^0qy&5 zB6QlS{lNO1*YN1pL37KO8L92`kkJMz^sb6hyfc;QFHb;Q>_oHep3)L6V-b>#cUVWW zARdKamc}v zR!(MH^y)Ry1WCOo2R5QUz$m>ZBX~r4M)Bh-jDj=d2Mi78 zx4+>``B?~_cCYpb@&i%~L&+JeKVW0>R9i3u&})p2s$}F>0vFy|v50DVwV6nPI$H4L z7_TE)C^NHHn;1^>C<_7pNWE~kw5TiZ(uwSwNYJW zmRuFik>e5{0AB4NMq+GU1TQ_m*AN8E*YiunvtBL>9?x=nyn3y)93X*Ld$@ZRXuJtf z8OsSjJ$E>grE#jZP0j@6<1>Mv@vDg3w`jeTgY!{o4nGhq4Fd-S(_?9-NFbi-4mX+C z55#6FP~OtGt!9#PeE$40G2baCLh=}$hO!pHa`v z(Is2>^SH(?WsAkxG5bo;c6&4%4YNPxk-~P|)VNJPpTBQ}2Yf<)Ioa&&nDtg=1--gw zHdKPjg`e3K1+4b^qYTS!+WyH zHP-j8U{L{mSTG={vtiTUVT*7C-m)qO*g?(F4>YVjC*@LL&Nkckfwk>G+X*eFx9Zj(MbmMrn$ z0pWKV-+Ps!c-dDf9ut-teh&v4Zbu)P8RMCn8;_OA)7fvxQKH?|m&lEpESHI3fO8z% zf#(zH;a?tyJxj$o_svRV``A@@k_k`9X0Yw7l|*En7*u~2gNo;F+&E~v%5A<^@dBfj z-m}7Ml;5xvxAroMVhT0SMN8%OyAG9Vzk^?81$%As#G3)th=m$O%)k-Ul^v2Awoo&G z0*&uU4KI;>0YQw|^)+x|QsS@pvh`HcK^&&e4`(N`Z!lr^FJo^3QCH}I81$hrNDl@# zz9-LP3kc$DF;&UA8p?uP^mX1ed5+;2>lYUC3I*i_&Fm9p%7wu&=t2t#yQW*9`K1p=d^AZmMr1$9uwKqUexy}n`iu%`(C^f>5_Zt&p& zY>9vp!N+*CQsth;y~Z6CDi2YcC?pDYJ$Jl^KE`3LKTHTv=5KIV@pXH^6Ix0%?NShh zZCGMh@N`*?!}Qf3I`-V)VT-W*z#DFOzfW^x1yWhRnG#0^q^D`T!&sew@Dyzb!f%d* zh$4aAWym!rz)t8H?$pebk3Oawx1o)4F{`J}b9UZ^!L}}`z-sFF9F(|Y&{uoD#LO1V zdE;fG1RY0PzLeBwIEvoK0bqK@xUoX5Cs<8XU*y;ltlWg>Zo}08@}`K);R{dUriig_ z8fU`2>N!lBK$@Im&MjqfFTH#4G9<>O^8=rhi?xU^>aD$E?h55>!z<-r#iaXN)M3kz zULCdszXi@MY8qwdvk*i1124xP{`|Z1OJCBf#1UdLa5%g0W-E=FoHwSix2ClmGEP&k z_yf{SQ%5|4&+13X9!y$^4`}$>x2LJ;YhY(-^jrTC$seS(Tb&=MX-~jI{&lsa4g2~e z@mE8YZxZDzt0-l4$Xi9V(*ElL&U&4{id?x*KZ=6oBDeM%to%g1s}qnxLm#|p7nkm5 zJe@p189{AI^d)ISQbE?#VdRXws0wD)xkYN&Ky7Q!d87U_;uMrFqjdj9y!XDbtE9Aw zAf#9lQMwZ4UKF$O9-hSHOIc@`Z_jS)lM_G$OqfNN8sG*7XR>sv zeAxs~se2V=hi65P;@MN@rqxT~@)fc)^7Ux9k3*vdke#;{8!ea#pF~6SMyLZQA2j8* z-uziVbpSO+yk(27*C#)F41>V&gJXwWlgm5XXU^r_Ezel>G!i?v$dX&T6e}Oy={vHD zDh2;EuUo6ZYqjby^57MRuf?qe0StjTqMF<@5!DnO5{3BsUgSr03{Q!`JK~4UER9;C zn&CEccRICNrNx3pgj1QSx!ZHZOT5)ZS~>cWWEz4UFUtwM*q6Gm>*!NJPm8-ud)wC) zDpQj+317AouRChE%nC#v#1`v6PGVVdW1uYPvcTWq!)nlh)s+}LU^F(dVw1;Tu&&Gsx~$Y4L6^f|sN2BNS#{Yf)nSC^;L1p@W!~h~hEraf zZ$n;PL=kjRr+L%E1NvsKh4~!jahMWxu>rFO@!ux=88JoZ>n&e0Ej!HyVB>aBRJObE z4Z=pV0oce+aC`(d(&Bf!dbN7JDR_M$^{+OMPbG*Kp5Tyy8qUB7{Op$A%*<+UR%B9d zG_j&W^~OS0G*rEDC@UJS-Z-4)4?*_V57B-^xe87~ubzO0gh6Pc)IfkPl2g%4S??r{Ms6+P zBFO5}@nRUWmr?TD%wxTKY(;j-~49OZp;mN&&etX!+k82{0^10s739DSW&ZcZp^k z+!cDq<#-2-%l-lGPy1zmc<|Wfd_3yy8qA6Zf>@Z{ynMHI*-%QG6_eY8NQ)R2M8G(_ z`3efpYYbpK&}tQZ&&#~;_we^xN`kID>K85hvaXO2Edn2r)UDm|qgWq(PI~vIIIt1z zKp{)Va_NyQ@r2Khi2{lM;L$#v$_uNi0{}|2eN(7P8~_%O1)k;+5B!QVmE$2S6vXM8`t^Ks5M~GzVbWa9C4QAef9*`qT3CQ(N@i=xA3P#{{Pf+*@ipEEu$Hs><5`Q7~Nn+!Z zcwW2yZ{e|e6(6e?>0>q1qm3RI9ixK~jnaCw`%v@n$W7OMmw@J&yk&09j<=5a9GO&E zfjN{!E)a0;yoY0LnpYbN8!dJzj22!2`3@}0rt^}o)k~hNt@wu5$)o)V7)B)dMm8er zAa)TTetBq2qG^6jwyaDIy4afq{3EY1Rm`&uFc{5Nuj=?_w_{b}o zH`&7Z&!qf;SynI2EyY>dCjc0gP{vCbqL*+({2=}bI!Yg!R|+iu7Cs!vXTtP3yebx| zO1S(v;qrmeAe%0ST0Bto4%Q~cRU0(QnNAs`No#8yg?Q?sz`}BN% z!t=?}^SK5c2ByR8CMwcJLmCc3c;rv3x)RV2Eji9VkAex8fhaNgUv=92Ia@B=m7qJ6djR{y+&5Fr3EqIc^i?Zi;;}<;d_R989 z8s);9y9C-J9(C-uY}B{yAv62SoJ(UyV4ON+=}% zniUUc-l44U0lSCt00ua7D1*7E16xeR8h1N)sNT8Az;_X`c5DF&i!fO&pitu9r-MaOoL-a0s z^Mc$JZz9}hrnw@e0c{R<*k^iwu{6rM`f87!r~GWiL@fL{>gvo}6km|zh01!$F;Qgs z90*(_%fEzIQ;?5vdWj`XnfwE+`7@9=}}s{?$G`};@$;3%Iex1pJXOsfC)3efP)5! zcB;Wd8=GhoC$R%0AwUR|J8B5D<>W-97GVakhLB-0keAI%vBlddS~zMyPHPK2wWq-< zBm@YE+^ZxairVTM2P+DaaMAhye*2xt1@SxeobP%5d7jC;@7J~0UTf{O*S_x~oH4if zu2ZL(inYI9OF^s&&&9W|T#x+R{X#s)XfPPe^Ne5wVrmi8P#PZ9fKreyQo6`VgkRjs zVfBuaHKEYqQ3tU)ZX}DxlZE__Km)-0^xys6o7+me1%aoOXv#~Y~ zLF1(;M%m7#8>&Lv9L5&aKG?NWPrWQ&d7Qb5wHy1gQBemiE7pcZ!XP3N750)YDn5bW z^k|=B8)qGf)<({=tOEQgB@kMw}i6S9r%`Ewy( zUEZEQ2bm4nG_Y*Be3b1?{J-)!=_Yt@B6g(6xCI_rydn{%76^ZVRU3YG4kpQWU+tP7 zVTxxEq>Dfh#iQM9u=a%{Hyj@A92`2F-y#!%(zpQ-A|#k{wnc>vr&xBtUxn6=#J%7& z&*srSz}ncvnmpPgM*Wx&+;MnRDw0b!o?u$LVEhPBKJyIEav_IDB_ne7v(0cz-V&=y zSxF=fhLfF&21YTl{tcXVaIuz%PiwPlpun;&4H_1bPl_HS-undRAg2+9Q$YrVPQFcy z-2g9mWK`}6A46B>#nLVImMAM5P$h)_X?i%q00T~>OF?8&Rrpw!f{|wy^70PPJQF&U zh!efzer)I^Q}Xkz!5;#Qu9o6zVa!!Ip(4*3O#QlCWP4?cU#a=AH_5fz>$zG%&_1z4 zyX^xsA1$_tBHO$eci_~QXnHXgR1*4wAnwSH5;PhTNe@tG7LG4`Td#;oW(@0)BUFN% zl(|*djC&)U#`rj8$DQmr*C%2{YpaF|P?u8|O3Lv;(j=KQO(wm{xLvI?vIp9?DcV%> z=W`XderyAQ;2jg_8Sb+NzA$;Ij39NY9BqM~aULA3Jm>5g;D<2!;MYZJ`9aS+qpo@AY0pV)Ls!92aDW!k7+M zXrogcfUs7{C)!JbtF_ArQIb+r2p0Pb8+1V80R{%N#Zhhz7QtQH1IbDsaBHi9Ky+2F zOFVa!jpCfv64%u>LmYs1p>R76=i04}Z!pnX0ySD#S&2zF#z;~VGI6n%1?&#&Q(jr3 z4dW8ex5Sa>=ed4CmFtkT@fR$@<1Q%b06C`WepzT}pvUZs zSL$af^<|K3`;3FD%S6$9VE6Q+-JiOSD-{d8aX6YQS|D@HZqN4uZGxvUDe+QTheju9jnF2*+vFG#4AP4X3 zOYkWBGEDX*gpF(gQ**DRL?Y5H%>xOsD4HoM$`H&QbjBzK%*SLx@^T}lRSrWxYQC2r zvNmR*QOHJl=Xg3t5y!gTC>3K#Q-ES4YWEEjKPL)SWNhe`;8C&Dn=G0b<~j(eGlfiN zLL|S`f~ZNqMw6IMe_Ks(VVMCsFt0(-YmArbfw+1Tl(K5Vk3jU~&;3kH&pFN;6%f zlTt+gU!k0i^^$cJXMd}`3z@*|`*b#;cM}2#Q2u_KXj+3_1^4-!fo5_5F+Qs(sDt0! zO!}VumK&t~D~VrH)ud111pEfKunOq#r=M`0tyE^6QD$k@#?jbhKpgMISOjwTA9CzV zn5V2~SdTUMiFA|1w+7#*yBg=x-eq1I6(qnNQUW5Gyz~~=UVT8k%7^iTt@K7gAdFGgXL|BaZ1LNEu8bo5!sXQ;id4&)DVGo(K$Mt27?L-Zn~-Oh^=h z*q4c8R?3pg$#S+U&3TsdUo_VxE4BtX#sNu}#^B&nCtRg^K;UkJ_lJRcZk#+io{rg8oG(^e@s|Ap74h?=K-4R-D85rUFO3 z*LcymlO-I2A^?JwdatiUtRzj0c^_1uNT~UbrM&Av?&ekc|gc^PhI3 zW2IsPbeN%GgJbZwt&J<-6ziQ*wS0g3B)O?-49xoDI+U$6$|&zBkC+4;_tdu`_PWo% ziv?kUWG$+zv^L6>H_cLBti9v_$|<#!2u<5E28UTBMwsp2xto<*{5$0xl+U&mp=9VG zILSPY&$>Vs)u5o~HGyK@ZoWJ>pu9@m-rSS+aS+4qSFRjxD3W5G_5^a-5S^-Uol`Kgf08O1CRD><)N z3pS7l9_Nxq;?L09>rYrQ9Duj8kQ8Pp)DX$uO8p8 z{(07~E&nH2qgT&=gJ_ZvypR3BeFxc-b$UycrX~zwq{&hF_78eN{u&H{4cROJaGuoP z0!$-M9C#pjP!pH2o{1%(2Qf!m1|Mm6C4Vkt*hN@--JgXU&?+!k{l;I9%VRN2hT|1F?GLr-O&oMpe*p7ZRi`y z@M=Wa^mJ7+ogJRhVjTyANdxbF8Q5vGZtnMM-qe>wr?JEV9Rcz_|QAZ6JE!7%*p_G;tc`|hRv+3S+|w( z@^B`SzZc#bn`E4sTEG#Ai}aseHg|Vkw=eK+tkOi9Dw2TuCl!?-86425ZG0CIVn*5d zR+IO(BVB=aW44!Lt@3&Q)5&1P!ZeMeI8iyjF{}PZfVW$J|7xSg^f6|q%ee= ziLuSdWPrkv`+RH6Hr?Gi0V%CpCVP-e$|$|JK@>bl;`GoBCni@ZUMJPOY)t-ELfU&H zZ+H_S??8bDU9jNlMU^uN!sLm_Wt*+@Wr~ps6c~z1?N1NOozQWDRLuXqBqKHgJsU?D z{b%oO?EPv~9qD~q#W(4Gb+rGJ3q#}noBm@nHld$p_Vb(odW9^|_JDx$kO;%o3UZtEOK-^m0Y|$oUX8YA@i9 zSH2}{smW)Z7gM4A{Kvh=yS;+{ccN;D(dJ2bhGs~yb_`?+pcwU=(N=6={%rP!?SZz4 zY_=$C$`X&rAK#x0p}1E;Zf^I=ypV7Z;tK}qaxefDDD)|9U|1b(*-UiSy$Z(rlr>4 zhvaya)+_N%gmg6*d1}u!*l#EeAFn;lFQi9sp3CwI)33EdZ zQj}e+y#s$2uS=C{rieg47v~-xG^~pjf<4-SFDRnO5QhWr#gu@T%Jpb3K>#j_a&dIG z5u|E#+y`#lJk2Z0K%?!o?ujFAs7>R)B>bzuksnTI)%-LMX!T%=%G8nh5DQG$X!a_@JxZ}j`xPRB=fxhM2EmfV0GCQ3SZYErSui3H z|7i>1t3td8h8ysF9=y|j;))lXN%RB0U#6F0Fl#U!LH=b1{nTLsJf&h5Mf-Noyydu> zA0G7_dM4Gccg(@Er3QA&1fvgnhH};#Wf4)wsdVgh|?34}iu(ZIdF%Vu8gdMes?AV{y7 z6fuOgF&kJ=pH$2#)~p3uwnd)V3bYFIJ=J|ZlOP_YFH?Y}xL&>`H@=EAkK~;K`(gmn z6_jt8HhM-U0jua9j*47GpoFkygr4x{Xo{;H`oNVYrPLE**Ak)W z={gh90X++z2H_^n2>lNNBkFg>y#^sMwyzGC>2;CFW@i80#PGhm{q^SD!qOz)9VkiS@Pk?%@<|ykbP(NdVH1K1 z4yz-(Mafn%^tB;8V_1bY4hd#A4~>*60kW^XUbAehp4sNll2v}k|FB-=O*pUL4B$Yu z7HtqJ1q58fj-vnzYGEbFDhtO~2X_2t`A8Zm+ho`V^kEe92s7-VbfuZxNvjouYm$|afLP#h2h#RgD0{DT^t0= z&nOm<1vUkgx_2nCbw#8P%RC5c?)c6>RKGjgna!Ix{g(X335Q(Zuia? zE1JM|;i$E(ehy@UE69Wy_jvEja(KUshNy{CRLfIh>|fcA`yf^j4%c+MZ&dmT#UbZM zHph+f?6^dDLN9Hye-AlOS5MuRELJjTUW}G;5_3CB7PHXgI%{owh5ajHX(FE4t-(zU z$zc*Le;-mq?m}1UaV)Dg_(Mlx((WO-u*FiORl?7qQ4*YAz6^v?=n9TBx z$^w(J#H{Vwix#1ot~PPT8pOF&IO}N=G!S*lZ`RYK0_c;}z$*j>*Cp?S?Gotn9II`s zU%hLzFY&JZUi)fK3_KMvzF~ouSQrz%YrpSQdP^t{W*j;&5nfBBc1I`r{4@&@K@#k) zw%NRBbG-~^fXLH(KOL|K14?@D%gqWT{&`5%r9SCL1fH|7NGhpa zKN}n;VAaI0_Rt|tIl)!Dv;klx_NE;2Uw9n(7Yz|BHX?+{logBv+ba`pUk^|7vFSgw zb^rQFI9or8$H{>Vjigw~;Pj(AG;pKc-O#mqoB?{IcN7j$;o}-GHQ-)5#aV#MmO#&3 zoM9n`e)9oWKPwu1Mcd zoMkZ{gVKh`8zS-TZGMteN|8MJ>xW+=wtO8ZeL zWnvwE7h7-IO5_Ym`JYJW5@RT@0HT#}L<%x}#Wk6*lEwlfcGn zi=Y5ggR;TT{EVtLDHUe$VfXq{%(8EDBs zjc@kVs9M~ry$S0`sap3M+lIP|%(GEhbu*f0xI&$B9mZFV+$K4E7*K0aK{|-QayT+s zvuzPM&=Oz?uMYytpCUTC){7*xN7g#J1ZeNK*3o?l?2(l|TCwRXJzkkC$1wM2maH^@ zIWpR?x|R4VSGi!NJ|Sk{;B%bzhu1MNvu!#`k`1FQO{TFnZsh3wYF9rrwSvj}p{a$^ z|4*VRpfS>P|4Sq_j_qL|tid_JP-3#pgMM`VRqsav2e?>!6J8w?muLs!o~=WvB60kc z>aXjH^%Y!No_?Yt{bOz&;5ocC{kDyJ`)wQF#kO(V)wc~0aW>a9yDvd*9TF|%U2V(w zqbnpg3?tUhfDJ4TdFxUcBMA#KerMh- zoijrUQX(>xR@#N=mXkpRQJb_5p#&xHxXn2v)2)r%t8=DHr{L7d%}X56KD>ki^8hX& zzoG<)^h5~|sPBJ;0O9;d0wn9f2=S3`64OC^tnEj984Aj{caaJ717SW9kf~wc-fWpi+vS8kuf!FltTyv^0 z2X-d)-PAQJQ_VOrRwi0PgSIdDVB`%*i;B>w3^6Uy9oU%*y%+=lb7m}DDXx=E3erR+ zuu$skYGu5xDx5?Te83-=!wPXG@Ij36jG8;z?Am)>OLs@#br4;CqO)(4%;i9s&h&k* zR*B`oa>0&{0T_OgP5n~?`k-1CtJ!N?Ka8yec11I+bzK zwxLbtDtpYJ+8<5-Sea*1=38GAkC==-7!nUrI*@m|wwe7$y~;EjB$Lha^I01o z0y;t)X#f=Z$aeK!i&Er(Rh~oQBh8L|3u_|F|9z~eTHk1OvRT;FqC^~$LzD_RuG_3k zFcan@%d5_6hN|!(?F8z_rVxlzriiS0~lCz}~Qm<`8 zUk_@Z%e88Tu0DwBDA7$%l<3|aWw84Z-MhhF{}V*_gOau0-OF0vk19!$Kzi23R@SG{ z%$UiDf3f|rm&9D%`AKMN1K4`r@K2>`G52iXfmGG98xBLtUhpHbixVJ3UtG%hEKkKF)-WE%$4WLrsFX@(?QUyNKMZ!GCA9lgv5u7yj#m-ol*u zKUnCs22}*Ak66SpjQkH|Chs!;_YrlwckC6D!z6dhB)*fOnU#>pAJnSRzEEMbfF!+u zY}bQ{i@xXozQn0^|8g@bO!5sCuS3r>Poq-p6{wCS{|#F-rhON{Q-V|kDyoK>afhp2 zMp}cn1NfrD5y2|*dSDtLEy1I0h0LQpKMh^N_)@TounjUSnPC#kfN{H^J@ID%4Nm=a z0{}?1_$oPn*q2k^+4~?1MfXA$uc=367g2T&@&62DMQ+Ssn?i=D;ASY=29aV^pQBi` zLfr(@{yMvm@~UcCT?w4GZ7h7-d;TslGl*aHVKZdtpS6Bq0*V9bPBVU{)NOTRppA#n zLLeY!U;I#Md5sv8e!h7Ga@M$Je(4)qBkqr_aRKJwFx9wfV|_#5iigYOO$fA@^K&jD z?ZTs>q`;SB7hNarF{>uMEjx{$fuO`V+Qi~yC2=LtfCJo|JJ4!@B_4Pd{$kdBv#TSD zj*!S^XS0f*5&ISGAez_HhiWYtbm$&m7fYIY>oCse8=X($6HD!ik1D|uaaV(+!;3)mVaHbqbBL)Eb>dtS z<}yM0QK*w9N-I>}>;8CKW|ckBJ5t6>?2T|8S@@w0+Ht0__q>#}zFKBajMDqENO=_~ z35UmS2R%`!;@;urRw=}DMk4+e8v4xQ`KE&Pu=K) zz!aZB!P63cN#ifzfus#Koi*Te(_rSEIQa92f8e}@+tOM=2MhBW<&~E=+ zj@`ph2#|}Mwsmb{wX7!(YkjEWinZ<(X5(J5LKbzqnrlo|(!@h1PUJ&oWr0~tk%Y_7 z8Q-2e($4-9R#492ASoE+IzvOZZ{yUEDZ+#CJ7xPW`-q+O5HDk-G zbIt^Egj{>4y6zlO>4NKzS}(@STfHDoXQXX9g+=7vJPzx_1HyCWv-HCz=1v}(%!Ixi zipUhJ8X$}g90+&JFn1)_K9tI61pv+h>y{Z7&?Uwru2pqNqEu#D8&{!ee|$t;(_S|O zJ(^%r?QYeyE+Q-|v1QF)VfSX>g~FIy8<5iL3}`mkDASUB<1+7w^<9gY2{B@?b_4jQ zkVRX~Pn>2Pj^KGKlxErI8iSU$GF(VU~q+@Yk z^$B?-)dD?KtWIux*0nh(4CXH3MrT{!Go~CCt9VqUW*i0s2JIWLVCYx=@br(tvxB~9 zeK!t`s>-VKUeoZ1$GvR0w8#KCf|6gWtmH{<)`N4gk4s9%+W21x5c#z!yS-Hf-c+1w z>Z$?yH3ir1`ca)L8EGQu06k2F3L1fwA6K=ejM}EcsnZ=bd0rdu4PW6^5B9gO3~8L5IB&70LX-6&Cw*j zSmm~?+pLYl(OH3pp!Mk=XZ@as)96VOJ{XBSr@cTV{%?8nGv)*l*%ps1E8&QZkLtq4UIZUkpAqEnh`=#WKp zKJz4ErYJH&7gLF~EK*s^@UCCs-_`5gj2OM%v8dNKRy@uSoa*3zyPPOFbU$E2-tUw* z#rxM7D$uWcp-s2xo$2^BuN-vB0{V|{yz=`<6E`A0WYfKR73^!IdB0|&PAI#I`~pn; z=mI6b0Hf<2dc&| zsUzVGBDLL}7~mpH#}qSaxW>AD+I1ZX$d+L3Sy?ofPZ+*|m%4j?IX zh$*S~Z<2Q8yXQGNTG8NS{8G`cs*@esoM#~%g>iUPlh!fcITN<6X7-;UGsbr&+GRMO zpBMvuQ_Kn)>&@H7#-{9dodiD6Gv{=$jTig35_P0{ohaJgah2E*=wD~5q2=M+&|7+M zI^jp#W+I}iqg!v<#0W%g!f&w8*HBV+ge&~?&R?b_|TSGle07Oqva5ai<5v}$Ig*gu0z z@7Jm;i=F8miXsQ0NRspO#%RYkQJe`D8rI+TnnK3FsY@{Jz^nAuwa+36@GNChprkon zI9msBxJ3m_vsuK08OB#}5c)diB4gR$l#j%2HPIZ3gI%VSojR(=%^DgB&7~4bBLB_h zzrqr=A{D>nl5!B2o)TlLN6mM7pqMkq6MkYdw*-`ky2Ozbk0p3QsYvo(>)MaNv_&S@ zfkney2Si00Lai$na^s=B^(0q;tqwQN(PXySA%4c4!!2cL4(pl&;4etvfsikV!G42% z78}hG?4dYqa~-bxJ{U$6g>$l6#k;BsAKqsk+zxxf_zRib%Hxj;;wIWf=^qf{o8#$iVpwwxYG2b<#*84+InOG98OcEV|OJQ%Bm^@$1z&QwN zxvjJ~TxH7qym7O1H()`{gp&-`adq!KZRm!D2 zuGU3yDXj&eSZty{<7v2Yum3^=5TGJ`i^uD9$-80|kHC4PzEhD-(VBjAn>nLQL_+a;B&sf`x7;!U$P{A1~vT20LpbO-fQp9#`v<-vR)}qiL$;QBe$? z9Z(zKycds457&shU7yqqp`$+5^+~fg>2mG+==xdWTGiYepMguhxC+de!$+ zblOK$9q)fXjNlzqxqz(h9qZ3ZQC9F{Us)hL7!SDUx)uK!DfN7PDjoro<-#nfhucn~ z>$ukvDf?huS7>NEN-`KECqOyF4A-S)Td9(J385UJ^DsN=o8NCD<&@ut8J9W}LXq=s z;=H$bZ<0%{*zWR}eAlin9)6bxug0t{9&wikGLM(gQiFyIU*UeG^?}6}Dds?pU|NP4 zpv9+`@0WeSTB@IgI`#go?qBE4z$6Ya!S0%9@?D2Hs1cqaXojuEYO7V4TV96L{XV7CRSN@RE`jPty_vrtrrGisU)WFgAB!n zy)Y4oJMm3?tuWLPiEDXtt~0T-I(v1VF}m?5GU-=0{>};ryzDs`pau!1RwnC6$Rq*N z)me?m?2{cQ+y%|!f}vtP9J?YFjBKs%4(je|y%~Y2;%HyO#WNQn1%kyD0=5|rN zgXOm8&n3tx)wLZ786>Dc3t?sWxZKC$agGE)f-U9vfa+;h$VTaex*w<_vMvKsNXhr|tkVfhm;LKzi>y=s{=EP{`^Rvi1g>~fw2nkyoKjs7x~&&10G$%jpFeQbaU?%oRDd!f z8DjPM?D%#fL0V@m<{_&-_z4b%7NmA0kfZ5Huyg9G3*{)9^-%=bM}))0<1=^0k(&(- z;d0g|LAJBAx@Ks=qi69p#Y37wBNpP&51G>r8<{OQRpin)_ z#Gw}MM#&>3Ug3l67B`uI0&&nLmZw^`^oS!$eWvmFY*-QOO{ELeWzWk+SAUYn{S}fY zk=tE)jL**Pt~}O966nV6ui5K%RnP7-!&r>n!cL8LyVzgufAr;2Az9hKYXl?W8$MC78IJ_AAEPhq zg}n=Xn-8>@@&m1da!w;d-GNX-yXjBNi!u%3ZP6Cc4Bndxd{)`x_J(z!NB9T3+s%*R z$ONaz*R{-Y!>$4z50Jn*FR|UvRKy0_`mdzX6*yNi1&D)Y{{{AK*;Y`Z_||RqU)YGR zcccHpI(%^?2i_0|RPxSg146iKq=)?%T4bzh`eo~>IAwhrk(IPI7n-V%k#Az);zDci zj|iVPT1!APBq<_W7|HdrxdE{e@}ba~tQ6Ynbc=Ol2FjdH*=053m#rVfLFShALcBzg zCRh^57Hi^V=Cb%Y@p3$C$5sZ8=V;*4U|1tA5y!Po3_xUOMp;VZFo{T6bnC60MQ=?& z!=Y+~kxKTIlxjDbAOqn52QDW0t`|8{*A=JPkp_D+_4alB2;7M4xHWhmxsoeWy_m_C z$&Pg0g#>|%@p?zH<2jg3jn@!YdlLf}Z}N@^TzuFEt8dUa*{|{FA!LQ+sF1N-27CyS zie!wUV-XnwYok>2X{MyHX-yBsi?RlxhivFsHZWv0E@m{X?*RoDrEq1=4TqNx48cfp zjFguTHy|Q1F)NrhDr=M;B$2X4>5&!dz~Tk6X+WHBbabi`K(R>yl>|?KY}_v-9B6uT z-Cn>1Zz|DFwo~4FAPX9C;c5yAJ_0trP~oL3a-6mf=b5(S zmQ|GGi_5BT!d}IlxC3zp>3CL}>R+0~#EA1ay`u&7PfklCJ3JPG$$6eX!eYAoM#J?Q zi)D)`QWh7~j2(bT+`2W3kCYAZ4osVt`g52){9?HdZ$OSDPi!3t*+j(~hEb-i52vzW zG`S#I8uHp0A=gCHhG8n&rl)G!Fq+qlWU8hO@&Cz)XsXwGQ|)OS{UJQb(PUlylW|q| z7WOGT(NqM!-ojph$2VS2hvKMQGgl_u(-=>!GPj;`PvfvB;9H(m1zo@hL!(rUu9Hcz z=E7Wa=uQI?={b}Q!?-BZ_mu$U!c206(vPe{eO{wyy&Pe@MMm9XE;!#X)uaHcShugw z};8>Jj&tcJp1<;PC=&w@t7(+oZ69)%gK6*Q-Wv)b|koE5T~!-*)-dWMw#@U z0$?pFwb8w2iL!J-_WncU8_gTEzr_Cw3H+mh72l zl!X;*o=k*ByKYxjY{oeE!iqzA^f~zT#*rjzqC6@6{JfZ#C=I~@f|LMaKo+d8dIQ_V}w2b=aEphMUi)g^m?1g ztGh1w#z3_Z>vM~Q?*a1;3n56-uc(0xrza*@&B-l#2 z`M1#mAyRm%`(Yb&`;-ZVGI9EOr7Avxu0(NRiT2TR(Zovbuxyzot12GX?#2NqE{KflJu{;*WiqoeGs@==uWfmluOl?W`fMce1aD*pVr$bHXvkzk zY+u|`?U|?hW`U<{kpeTd@(sO>oRFp$(Y_)|yvbB}I0W|2Uy!O-*aP)Zir!CysL$07 zGm_@n%{Uf>rVlQw!Hsh#xJ7|i*l=%gIF00TJe8&1NRdlrL{DGD(*D!q9qG{uw?tdq zJ~0CW7RKE$2T%nbBY1ajIIO*OAVNh${!rnl8QQ#4lKOoOFc+Uif4Uw^%=uxt_Mp{^w@A|avI1<8MR&NUBryf08$~BRH zbg}kF#OifQpq5UL_B4+$B+ep|guqC&4wPTYO+~&bq`$xwi!*7QG~k^i-Id(yN{hH4 zYQPb@e5vseb`3k^L|$kToLwtV!+YOsJfyuVLtr3ozB8#dDTpI`>i7K?ur5{bZN3q; ze85qLK88?I3$>1Dxc(5Z$P!568D>j29X-M)gNSM*J zm!X=Vbz$^%LWvep5^<*=_$m>g0O2MLPUEyyDvA5%Nade@Ll8`S%4?U}D>!MOu~%R< zn2!Dcd00#2O*mfEjXd`00rpJ7Q9MPH951vZR!N47QPbCdIeRR>eb+c-`}w@bBaWm(?oS1rd0 zl_I`7ESVL!c?dM})QkM*5EzxAoq?V)A|#Fqjpp=@u+A@j0gn zrP_?$t}}~rqo8n5`wWwVntB1?pms`z_>ypTUaX}H%pD%>6vrYjcJ9>ETSEV-S57@K zz`{Z89=--730@FJkb(E=3qu2&x@89|7hUVmqUO98&ls3sx&Ol$V~<*xWp*80_<@9T z@sLG6U979h0Nft3_=e0@O&ot8v(b2DHpbYg<~pD+yKozF zLEO-*B85SAeP&(pFxmweEab50+C2i7POpW+HsvSQfMNtB!{yJ?wM(bNkGsokt~Kap zBxWX}7L+^0tlndBb)b{k7|K*@;5sG%p#geP&2E4Kw*>CgsH*DQ;P;@YMItO$n;;Y`l*)8gx1NU4Q ziJF6RTwBLjvLrkLpWx#;uFYWBI}syfE14G?K0@8uDzp*B{sXxR@N?p4!!N@caIr;s zhMWaI`f-xaZrzbLx;@W8Q{kw@*%ij*=g{ZNs|hSK4@cZQ--8eMhFf<`x3d5YpskBc zc}-S1-ZVP|mox?-K8IRd?b+winhb;)YM$@vdWtc$t!)ji zg%jO%>Xx5HPiq(k$LgE~>Wsm~+G%dAXP}>d2E$WkZCuB;kD>wfpNcLj;V5HBRC^wCKY;; z^-m^0h0ZyFT^8e|V#1tuJBJ$J4bA9YjYDKeQ|FI2yEN+xsCQEZ%Z+S_{gxFLg<3Vz zjOD?lvEm$*sO6IET|Y>x77oW{9Q|@g-y&S`2-8LuX;fi)j2Yv0LheougYjSD?+_y@w9}>B|6bDR1a3?X${`8wQ`E6=Q zontx(-GC2L=c0RXXW*9!f3~ew`g7r@wojo!_m{yx6aK0*|0?6>!e0yj{I_(!7yhO2 z*X^bMMJJasK3ur%jZR8LUeF`BcF{(1>WCn#zCn+8PLJ5EM^J3iq(|_;3^|(hh?nv4 z>Jhv2h`oBmYxvC7Bl@j-)bSP~%Jhi8={Yn#$7y`rdc-+BqDPOoj8Cc_VbX_``!0&2 zWFwIg>zx#0po4Zj-l4}Q;$vg{8foJR@lJ$bW?GnRjnl3B4(q--y6+S}>zyw%aJ@54 zk89B5&ggM_^*E0nw~>Jm=@mz2RKCB1tX_nB5XMaKK8cTfMFT;Evq}tNCc@Bms?=IRkI>JiO)#LM`27_nX-;TPq) z(r!=20Ac$sndhiIhv-Ue9705+ldoWUYB!F6Iksn;;=r%n+Q|QRG~j<2`-i+;VDr)K z^wcJE<(IF!+R8^+4wMym*_nusO}y;1<0~{MUO0T2d^dL!M%e#_!314c{)3s`-5%g< zd!+}3CxPQJ8+%eT-&>(aT>tPc5eJ}j{v(9`Sk1lFkYh08N(D3_@R6BnPlLIX8ISaM zZ^ym0J@w;WVHh78h8gcr>qT?JXAMpEtO>5YbsvE*a{XK#X^^4)~}|6=_$*ZqKdc@TB1$rXJiE-&e$tzCiyag9W4ZhPbpiZijRp zni05QT9}vKQX`<=i?>yPp8Xg2-*>YZ!UrG6;^iYekj<08%LcEtRT~^QWh|gB?z93g z$Zg|9(LMwAhZp@NaLJ@T5?)x1u5U)y(a%?x%YNRSFJwK7{!aUBkq)4_kxRquF??uQ zv~%z!4DeC9(VMTghylB2#NKRVT%fI{kBfJZJ`&#oJix9U_(U@Ow8TY13Ivg2mJ?aM z(?NB6$?G4~hRcRWj6Kq1{3^3A+KA%l*9<69OU_~pfv@-n!xX|3YO~!7I_BJWO7Bl(Em(Ea@ zaM1XUcE4BfkdEXB1hx|1^4=)A@wTSJ|%ErsC5;$v9MEJ z`oxGEXe-KEJ7*PgJ&s(`;-vmW(<*u)zB1Ih8M_qTPQSbKRT+;ixzsXaw^ z8Qu5Rw$NQbcTw#|y0ht?Si2PN5RCuw6IbhG%#DcIly*H|m-5{j8drOU%}-$Rk+r+% zj_H@cf``jakA)?o7je+orcN>ZO`KL$1<2?w~CPYkQPIsFuZ;s5RmywlQgUCV5Dzw5g^kNQ+x)Z!2+ z_DY|S zwbvQjddl3|<$!tq*2u&60{3_)*mMm&J~&@2NyUp|ocM_aEx{`WF~!#)xh zK=|+1e#u<>wR8NO37i5)l4jCwLj6&Z8Fm+~BH986Bx3iYUMU1~Bh>#TX-bf3_QkiW z4~APm9xTl=zLdeC+OIv0q3RcKNJ~X#|38>#y6^RhXtKpf7V#X?2J8K@>-{>UZNoZ7 zwF^;OZ@(a|&>=ufv^C)ZnoYz`a4S=7O6(OKhM~+ylYw%f^cbJ7=NQ5&tBqtM(ONv4KtZ`U)B1Pb|KC6KbFJsgaJcmY z^X#EC&>C%MWC0b+2Pc6~Pn(Q3mut_nv-@E57pW~8&m_^)qsiluI)Qx8j6PXi#%HvK>TUdQ&Gd5Mcz9*)ew6$O$(Y&R=T;c%MhFwdQ zP4p$>^%^CBH+aK)8o!s!U6@NB?pnBGG#DQbE5^xzHj}GfzA{T5cj515$*n9hlKOx^ zwe$7fC2cnDykfXu5B<~C`Hu8`tFh0L3sQ?40v8u7c@QD14{zX0_38`wG&dlwx@~p- zwdbkl5jbUwV@O-`Mj76`RsXc;pTqj+l>A6^ax2UB4i9L9yq17w_6=*MrfPLtGsCL^ zbvPynPew&W_|3+z2EQNU=f&?4{8r%iYy1r6fqyXrz2?{}{KhN%rYrn$SNP+v@DGY2 z=Eye!pPy>Kz|`e5p!ExFoEq&%@HaKy&ADoLS^q2o;6&{0wLwb%i~|6$T2Io1hlN+t z?*K1>Yd_2Baqz5N<#`%A%BQ z#5ncWtAAj|)f;3%s&W^r8JKGHI9F&yUY0DRkawv1xa^({X_R_fl=PAq zMxKO#=q4TLjnkgy*0+jao_-#8jIZ~%F(;67;rATkn062Yq(|qw&Mefx3-)W8ERRf- zpHqfcBXo2%7`vHdzuKUz-?G?IWBsptuT}r>8%}H1_1>Jxfj#lAo`q+{HjcFT!^`-e z(yeB@l@}kThym$Ku2mb|uVcz)*C_T0HDOr+xu`ajEm@}CW=MJvXR{Y-#GeT=;!W{e z;vLXgZs5+LT#b_D!WO(=d+Uh@R7z&L#RyX&COx4KbAhsqir8MDw=v%2)!COw0`R8UXj773&v zHL+~YFaDOgg~ft*g1MH}(_?U@!o0fNAPaT}cE`H*EPUU!$CtPo8JZfG{EkhSHl}IK z66UH2uVS~NWdk1VVg);hjRGra-|DGjxUZ}7#WT^tqb#Yn3baoRKrmlG$YsOquERKq zKu6IEu=cBSZ_mKZ5qUvqPwp@~K*^FatpQn*w0p5&Mb8Xt;~FMU5o_fH9Vk}q-zhKA zEOM) zV}a}|dv0AZ1OSb}0^e+xFv7=7-o!wKw}vxw@3woblLO(Th35cAC>c0f9ua@Y{X?#q z^nKc!xP84kz#(qR{hpmOQTV+KT6HbkUM5y@FtF26ws{5Skjr6Rddq)?Gs|M^zQG_- zQ4x3+DbI)kY~XYl0dpo;}@w;>kJB=2>QvsnP&Z+}Jt)CVoEsGugft%gsiF+ma%ymFNU>Jt*N z?AJCTvb$sUbuHCyj9;>BvV2d`gC^H*27Xq`&neT-XiHY`&?$Ic@m=;=C2p0kw`o7a zYtgkW7$L13DR3;C*W(*iq4mJiFV+1>HBYw%u$?@ux@@cDZO=Zhm4NOA{sRqtD_&3Z zXxmxQ^qykvPjJkOk@f>r-_{+>7R~eT&jEUtUB;`6c90*9{$ zX5rf97QyG?+gHAbHWqSt*K!L21@SLH4B(j#>gF~YZ(``<+)`2`Sokm601u0xRxMBR zv|qDSQXVJue4_!5Ia>h})>UYY)VPH*!Vx(2EAP`JqM__utRiHIH7kiCASoFki@B3D z2zSfr(SmcafAU05MIO{jA(xhh$k1|`;d5kwnG!bP77!(?Cy&Wq=yhZ-#ZfZDYDlQC zyf6NNbcHhPXf&*gVVSqKph)lNfcAagx0v0yFfrS-_=fE7c*o-XQ5Lc(nxPpPWXKM^ zx0|smP$Kjus2!xc2chaS5{8a#BiXGz0nv~+w(UD~3+cwXT0zG_?F81EY}yZ5YB_jz zO_M<{VO$JaAwv&pK1@WVwxi(-Jg&YC{|C(c+2^ql>90kulkkZri$F${N{CQqT~=oG zXlCFk9gKHt&r&d>%|@i? zQI_>+<#e5Ssez2tL4dvHT@VgSDZ;dBJq7!L!#K3WLH0pXdDx{1Qz_tm~ zi6$U^2}*xS>dG9_?&AO)($*s-xWtnWu-nQJYMd1S~&b5Z%IC zBGfGd%M3Bz(X~xd{^gIJ=LL2#4mJYuh%oN$@@-);%O1ECMsi8V}sv`LcDf#XKJ%ZqVQN|TjIxN&ET z9_ptb#j!r#8SF+eKD#n0Z4=M%l}Q<*oCX2Ua4gV3d9%gZ7)$&#-PUYFoA4+gX1<48 zeRnrBT)(ug1l}@WcXZ%1+CEU9@$7E`%WO6bUNY4F8GDdt3-WxNr{ns`IEFSf41_`& z%CJ{xQr$Ywjr9`8F#Jdt{r;aO1}b#rGqWZkj{`dg^i*n^p5L~w5iO`v z+sJ0^g(?W{P@^E+#fBx(T%7Tg^c8pnk+>b$j`u5(ItC;WQyUMZbYn!*IP2D6EQwZ9 zH;YUu`_&1%jAxWdndpBecAP~fNW0DOP%COUj2}57=h8a3mTC{wNdS)SkA#K(>w%&^ zv_BZem7CAKBUi_!@5^Xdt-&h##2Gb8(U-oDXIG2evwG!eSU;#NiFY)uJ7&RdIEJ(G zDK-1fZW_4F6eHxsRpAEWdp2C31$rEMEbwKFGQ2(s>0^;5Tc(lb@B5{J2|bWK#!pns z9|EU((09&!vUM#_6$34US~Vm5c#0`~AI1|0$JQNCUPd*l{Z8XY9CGW9jPeCgff2`3 zj`7V8!^4CALJq6@P1hTBae@7&lsArisXJr)oG~eHoNqIGEl0jgc>@F+NY)VDpBcL` z^e`FdzZeF0B`-DG=nC2V7Yz_JF4J{v;Ii(p&+?$&7_{MGUVctv<)Psmn3rb4>H18n zqof^sAI#g(Hc)TYHFxPVnkY5fG9*(M!#-Qr68HiiUoY9NBusj=qjuFk7+wduIi1}^ zr~h{ywfF0&eLzR;U+JiwU5<7X_FT~p*;R+^YC_<`%zBQ8gWW~Hlf+(hw#78`EJ#9( zBRc$Db{NZ991MI6cts=^H$rGsGNXWVYYkq{{S~tgc!?~cOu)?$xM`CzTNw^idZcGI zGGp~cFk8Q;A|zM`P8Uj%Qk`=SpS0uIHOwiIvXF*ZW;^&+6iuE6zCYX=yqS*WHj_0t z7B1_S+4k1=O|2oL`ao*A=3lB)eY%$ACW$oT)oD%|og5_*W`%i^#FzP&8W_!s*n0wN zS|cifFe^rj$rc5Ismb=%Qzjkp;T`)LB|i!A)-9D5EU+7460-FpBkmIG2r!?QlVPer z0sz+lvU9BF1eV)lVZi}oPo*mxZeLfLfuiiiQs;fXZpTZTTmf2V3@q>g-`Gn$rARTK zNGz#D8&@tzw+@^FP=&7DIaeYLB@Ij?`p?t1Lg0rA?M`$Zdq@Ak+UK|(&iZNJcF3gb zHqE?c)D2+LfDrb&gZnBfpJjkGI13VpTElu!_;Cd{j=G@%rE6(RFrW$a;v(Hq*THAY zkhK18@J}ztbWj3Y7h~GQF!+UOdd=L;}lF5?6gbun9I%NPI;l$m2T(T!$Nk{;f~EE5B*9<+(!bqClc28vNK4~-a`6z}k@G8(7- zcVr{-SvUS!gJ)5-xRt5ZWl8b|lBoha3a8%AwWD41>AShLaWMKV_km+6N2HbSr22xC z{SqSP195Smv8x#|+qiQ}bzI%7_p8_+3QVBApOtO>}*- zER~kF0jc5;R4KQ@NVj_?yQi+(i1HM7nd0#-p$!Wr3y)d_KVpV-nEY1j zlQ6`1u3-nd?BPg9Mmv{m z%TiR!e*r*XEpe+jlydO@I_#?Hzc5>{A&f>Vg~|BcwpC0s8FypYr-$M`O7$?Gs4sQuh?AUXCx!MfMFYXoqP)Me(yRxS|!~=paK3d~AXs^$_m9 zy4t<>>a!{Z&n9DQ)>5-~vVfYh0!Mtr5H6m~ItX*2Hf4BL948kqYMCP-p-;1o7UJae zBcTybphy^zh=eLEcL2%@B3NWR+*x;U8Cx59M6`)(n28$Lkpk4rYAp~X;vTc^F|+xy zN%pHYi6!Vwq6^oEvP>%Rfp3WLm=(Kp3yCun7_mb`i9VtYr909FUxOIMhLtFH5G`rO zMHq3})GP_M-UU%m_WZvZA&w>lXF3}3D0j#eAQrM-E);o_jhi1Hr2ZH3vbU~>X-Uyj zYrtqJIaO#Z9zr~W8MWh8EsK=)c#_LNgk=O5R(_^iyIMbdg!hW{w9|FZ4)8L z{~>j%LA)=6G*(h5V+lecNA7)pBy6kp^RRLX{?DWMPAhqucJ3#@Nwfhz{j#-@S3IzC zkK>G@++06TS!SX6?^!*dcOz-h+ z7QWMzTui?#h0&s!t;O7$@idThi)GkROgR?N+jZ}{-d^TXO(#@)Ky5rC$NY_yW9W84#wa)o&=`WlMRD}xX7e0UOoc>d*PBIz=46Vzd{VaH+o<; z+$25nMF^M<&yYTSsf&XtuQpGA^w3M)@20$Zq{|4~D#&41>mA#2IcI+&*a0RWg~&S> zXtfn6P>|0%XAQmx5WbHWIVg0o$@`tUD+0eD9S6ei>8ru-83aZijOc~m_BqFg0Wfr^zzlfn2B{TjsS5FpkK_oOxRU_$&&lQFJvor|9b>o zk^LA4j0E;Mq!Hz3R;#jgK{mW`pZHlKQu#_Xk?s!`xU%w(V&`9cbWKxSQAC!A*qT@SgduuW(u#~#MhBB2DPGm9sj7!PH5 zpv9)-nZwhu>}xrhe5v9-NNIW@LpL4V0!llIZ$vlLI(8HQz4yv1BKLxI2$J~E#yLSn z({0N1b0|ZR14Fs{GRs%c;JIEf(&v1c{VI_0m=_)BX8>7M8K6uzi&g?)vj*&rEiHXQt ze?~|U<%m>)OF6Mpe1|h@0?UN}iec!6JTYx(XCLeI6&;xZ-{5p2EmH`WINJ>ETV;Ga61%JfN;JB&!*)_Ds_+;^sLJ7AU}|EHx=Pa{mJ^0#PLQAx^Y4I8q{=%RI{%3NVxhdO8}} zCO5$8HW7mt;p9OMjD5MV+(8qU+pR%qslo^2;ofw0Y2xb9ct7!)$YY8Xd`z*DsC!Rr zpk04VaUUL2+!yE!!+vDB-M7?r44uSf{i%{n-w)3Mv+@wh^!@Gb=pbN2e#ity6(#~mdFi0HR_|uwH37^KXeVNnW!=A|_+ru`txs5qwOj}ziIGjb%75{AL(0yW1 zDReyaQ}sXVHHDOb?^%RlTh-pv zTto-#EvM9u0Q|R2_;_0WRpWom9Adl&&S1RyUTf-fI5+shea-avkzUb<$5Ow?l@ zg^2e&>Na~SBVU;wU43j9hKiYe=f!5_{|7vdlSb&O;ViUWy8Yw!@|O3dTvp!?q=4za zW?Qld;DD$>GzArOygFjkbG+K826jBWu^-Av&JxLQHxy5kcRznvpjy=;9t71}M-WKk zZDOq^F#UktLV`0#aIhgRrx#A8v}L#omdGgescjhwRX`1{@FU>LJ|J=nB0HPsirgbU zs<_n*jmLf0QA%}ELf09`{=+gkk5svJnLNr`KaX)64|T{Zu^DUZ;V0}ZAF5LN0a5Xw zi7dXfrc?LIi{ndaP6Skk1F-gtMbS)M0t@8KNVYmT#!n3hi&EmfXudgfH(sr`*&Y25 zSxeX5|4SB=-qxZgkW=HO-0Hxj^`7x@QQtyQi1dve^|W>*c3#f+1||RtRE}pQda9mx zfxFy0#UYm%ZC2_AR77$)>==wc?5S$2fO^-v_HbasZI^JTdNE%`Uc*BBimmCk) z5C_syLwTthQqS+I$^Kc-@18Z;4}Ja2n)$cGU2EJtR2%vJT56-(eCfE<28v1K{EeER z8={KjuJ5Eu>`K+^U9Dx(fysyF!>Q7tWG+(!g;rBVxy({!GSqLWmX@Q!ucZ}FX@6}0 zKZfS+Y7)lgyE|%2}AR=H}SpR69XcdXj^ASv zv6bpGaTTg0SC5lAxryP%bB{<6Q;vzUdTC2WC(k)ZVWoC+>oif-@rL5%{N(Ivi|tky7SoCV6sx#~B8L@ts5Sq)Th0GEDvd8_PtverZ7M<4 zwaMIv)Qc~n^;ow{YJf^dYw41rNZZ?zJ_k^yg>nGK)=0Cwdn1FT+FXy8eb1fNHB}eY z_@OLe{DVQ%9-L9O(T#7aBU|RbpkMeO(Jwrg{!UrCrsawIeN)=isj-Yn!sq$&_`IZK zQoYnxF}=VUSc*O-YE70xA|;krOqYRIbM*Gfuzz3vOSom!J*iPMBxxt_Sd!yu|L=DmD%!V)sgqjosBQ|M&FrPoj&# zsRTMdcJE&CziYpO9@J3LLcfYDyV8wg_wG~(yA?v0AaK1_jEHxe7;WlyGJ<@9aF=++ z?%5##&c!Jv4-b=w3aos-0^HssZOT0fcOmYg9_C1cWI?d%@^OzUXiB6*r)-UFp4!m23!CSXn>Sez6MA(06e4t zl92&Jk&*%c(5?Ye5Jv>C$twj2KuQop3Y#=YN%jalq7*Fvkc!1Ptl>v6b_%@BYihtz zZS-mQag43NWA{o*h@~GR#vAq#Z=Q_wyiwn#o;ZrtJ7X2R0hk9)F%S?c#c1;e1g}0n zR#6bE@&a9@q3bpDJ_Vf+*{udJ4`aQM+OBSD6Jnu;FVXO&7y%vCG7VU+0YQvP4Op!K z%^DEFDAIs74cMpwn=lGAV6z51paEMk92&4)10K?V9T>+qs8sLPfOZY&!gxso_G>_o z1{}m_7XZ3BG~gv|9MoxQ~1r5Zimc{Cq z1Kp;fJ2iB#f(Bz%t77%iH3xK3W!RmHtE(=Fbh?F>-v&q(Aj*+_{2z>{0n{3H?qt@wlRE30Y<1=<_$sl>VUQ)#rU~W^^JF%`6(h@w`RyZeS48Fy(cA6G+Pvs6 zC4qjK$TP{T*g8)QehRfSO~`V#snsO=%cHB4{``7#GZY68LrHQ9Ki9%vsPTs>{DO2$ zD}OA>IIl%BgQh(o8kHrrSV@@V>R-LMQRj80%d7&HC z7*}1B^cRZLnzyD5=98+*3fXs62Pt8#(P5SLlktb0jlb|Ld=wk%l6i?cC2~$5 zyo&uccQ3jIwN5s-IHiDjS3{KX$yFug_8Y@${K@JiR)MG5OR9d_phtf@yMC6QRX>CL zVxh)YmzX8G=$v~UDO_p6XVlMNfBTFImDbJQ_=Eo{erJ08tLn}C zv*J(Hmp4`aeJZ`V@B>j;$Ylg}ZfZ3DTD@2_+?@GKg`Z@F->k!5M6f)WTMw^8PRLqk9+|0(=Q=itjkaR`5~|0_K9m0UyEK#Cz&RfHM{d4NFerm8(X z)LG&_Ye%(E@8-#H#5!F@6;|Cc8uZHs?`EaW65|04*oxuNyLrNT0SG%KgfPm7>QxBg zWdPbWKsb#lq;{*U0g!%jCKt;ssVi(AT_dG0|o?OZ9v~A zUTB5oQyb6`?H=5KUZ&lH8_;=@THdbZThh%2^l@>^`w|Pi%go20S8eNpz&t{kU9--q zTw{}J8Lal))lJ!fW)2N%%r-(zy{PSV&-kEoi<{Fa~BYpVRXjNHM^-e=p|AUS4j0s|Dd??nvJWurpguurdRb};2MaNvvupX4%L&ChCZYPU*kIi%yO5g`qK}gmX9`v#>jXTkq8MJec zZ{&$idvK(_Ngtw>7&(H7F7I7kzb7ddt(N!)robr_VApbd&7-)xvzq}C!e&lme+L=L z;0SYyvXOU%e9bfF|4PWgu~+$;r%A2svopc5BvZmii#WM$q*aa9Ascq}NiHHo@op7& zaLDZ!_fp)C{;F@RXe{v1HVb51CsuL7C~h?7+fiB2h*wRch@g;GdGcpIl>*o^vPaFYplT!IJEE{#Uj>8!ogHAb$KO^vzc8c`MP zOpMZrHDAWvi1O+&w%`S#x@CWKYGZVPeHXffiPZcb;!e1&@|z>+-cA4^JJ%-Y2ifH) ziC*t-jDEq+dlFpuRkRG$aQV4gLfS}7p{rGR4hiy1Ing+E`9Lf%aK{=|w6il2hLIbu z6Sk=I1V<@5IObfhCeEvsQ(3 zCvtVP{(x7-Sfa^UO5#*PN2r7bFWDko&&UzplC|eSVT4>nfBII}CfO9s>#VJli{5-5 zb2vqnYSnHP+iO>{lA(?!z!=48>qxhdouiknz_C zUh0zatx{y%@jD4`o|hINJ7o`@rwY41u%7__cr}Pt&gui(@TxXPS~PAD8c(?gvt@Q* z*OAt%ocaSn73rbLQWoxbjs)187GNXxSXELXhfl3_-MuSYlznXY-m3SNLbiFQcwtA^ zec+w3;{)>~N#+KN+@sFHqy-eXSS9ak7Wl^kR^{o};Cz*sITpAXa5`<9qJ5iQ z%}&X>%L30ln|2T28nbVb&Zze++7AKso6lI#VQ16cq-g)n0{?T=S?LZc+M6u!Ucl+; zo}*~rVL^W`ffWa{GVN8g8!WJKHtm7OCEdjqc-dLB4+8a@7h2FNfd;nW7cWYqvsy^R zFCPl(mr(IMg*{2IhoxcL6!r%Uj#efPb_n(x;t|+}J>H8oRd1{DsEI!{ggswj?^f88 z1pDV{*fxdz<00&W?Lzw=g}n`Xe03Uj1dp2dH-@n1E9@l-yI8QR(y%=Wd*%>!-(y1i z8ijojdt3(mRJwQKQ4`M{!rrW~?RY$LBmL30_fyZDe1Yd$meZ{Lfo2JRc!bTiO96W{ znNPK!?2S2F1*JN$Tv6-<=c5QL5duH{L;`+A;LeXBP$mQx15D*0U!m9HW7X5~M`$wpp`=>Zu8TUnWN%q zv8*G1ln9@}$I47Q9{za8P`GV)m~T!X+zvcHs#$CTBffqpL_|XTQ9|4~HV@e!~!2v7j{x+SPc5Pp`WpHF~&#_~T;-Q5k`b>=G8b|FfD$ z+5nl~9qcpKfUzH(n)pj-LNZqZ)4o<^0wVtcnx6t0ede5$omp7c9)DmHXz@*8=|l&X z2}QGB#p*B@ON4z}WF^5KOeqTbPTb)(9r&)ldl>`#EZ^xBea7>Th~0b#Z)WYT)_Fos z&kM^SXRd-;{Kg^AV)6VEoW{A;igc+&`T*$0^Hr_S1jkjF z?+&)z4LxQfkg8C^D)=RWyb`bY^+Ocqi05LVu&0W)b+E$xO*#dyrjXce(I^u1s{~zA z7W_$tIn*bK@I9}JFcGuR3j|$qsM6<(tUwC6!n`>>hR1b~c!NkT>lTtHp`OHFrO6d3 zQK2qK57lOc8b1`uDWNt=C|zj7RH%Opws(?OZ-q(>t(a^QYO#cp5_Cm+09Ba3Ob=CH zh59`p^Zx-!?;l5YN{#&z@oK88%8L30Ht;IUfOIJ8ON4H$oE-$)>;qZX*N6&prbc2p z?P1<;i~ks8^KW=s{PQ72f3DDfD{H7ltWq%yvtnqHK&NQ6x^efLZw}gf%~uBPrukgT z&YCXI?8e2?D=#fSHFdQOf%PiRLzhaN+2Jm<-KbV*S8;xyK$5EyB-dsK`@C&p3yQd8l=~6o+tDa zYuDr&0+rCIF)vqi=rwMu+00XPUZt%IoeEs3_65G#1iBUBM1}Z>bc!^(0god43{6a` zHuSf6mL%o-prz#_(5IHB+bt}M;vuTC!u-ldQ*0ih_#5y{xgDNPu}4w-!kHBBRupqT zn&Op%6cb-mjHEvBfFgpb1WCL~Rd7~?`5e1T6b5g6sf;!RBB0fnZxv`X#R3W{%wJh( zx%GjCAn0PNHoGk}-AmPugqH|d#dF#LALopDi>!Mq7pdhhSAz8x7saNwU5wncr74$4 zTKC-=&6NdeYHeyHqi>8Ezl-lQ-&Kh*<4fKdGk!kbO1}H~4jmga{yo0&?~WON9pA0k zKacrYmXfy7XZ|wIbdJtE%bj(W+kTci`z-gcv)scSBSwxMJ<4f$=PV(;Yx#b}x0~+; zzEga8M@cJR9bb^|`+UFQ>*0Hg?-bvtH^+?6=ld+*RKA<|>iE9Gw~8;!_XED4^8JRd zlkXtk-}&C*%Y19h_#D1V_zL;v@_mEv9=_l5JCBG3PM>)kz{c=XT+~&YE=e%=Kaek$dSnSas6mlTY@^fK?K zD?c;j{n-hZUtzf>PMUn>RfShyGo|R-6#Tl+6;Hk1S2FE}8%w9pm|0d{F>B*pw3T+g z%;RImU(L6K?_R$Be3|c!8DGq|obN|`&+t{87&HD?d?)y(p5y`>-wS*;X>S=SE5pZp z%+GPA|A;f4AK@A~X3QwOojD%?JIhPTDSZn}?`vLOlkdUV<3a(k=UVjYy~cOtqX* zEpwc!^=53E(*;zRJi=6)&wdI9rD*B?cs&#;ufN@>} z4E@dJ4B++F&}M<&bq;jba{M)l84#%J;qq+$>g@cjLDR@G;Cj1O_I=0vkx3Wl0jGVP zvis|9lzl_a1Pfv5><8w#?wL%&64{L$0C;4_+PyARnO&d8LACqXA!7pOYa z73&y+%aUfLm`C4si>UhvicZ+H1=m&vr&n56&{czqwRyKwx>h?WP$jjLICS|LyuLsR zXduoB)2jn{0!}Q~NhH$}(n_6#tTwNZkZNQ$p4C~Pz1gqutB}=+>r`_kl@hQ?o&!Ip@r;)UkU3uEdK>r@ez*mV0PhxYIoJ3Mk&oX*|nU4Z$1{!~W99h`w1$(1lpV4tFXi%UlJ`Orxpz}TsS|-rzJ`U;?Xx=$coyY;U!gZb2 zn340v5g)77M~Nwa0Oo_pDkm=fAW(7YQ(Tq zh~bXGAtQXWKyG@oV5eIa zNgF7Z_OL&CUL&f{r#^|^0=H0JR-Dr_4mCM~JRBgSwG5RguUy>eU zhCfV(zVOi$%7ubT4-v{yS-!rjj>h;9qkwRT8R1S(%Lgl1T?m76-6=Xrt=i|Th?63? zQhtUUTf~YUzTlQt^a=#q_I0JI9UpdQ#{E8sgYN1hmm83S@?qPsvWNkA0=<&ib5ki#rY&C z;}i-T8`@hP^W~*EeH|;Nfaa9LyfGR_^ZbrihmU$5PfwcD_xR$K*%Lc>noZ>7tOwdu zdU7MoFQ{-{Cg#ebycJnvPT8pr+Owy$r&68Urm+x1uSw>v$Dxj{&pg9xIjU|PkrPIp zNiplqPqd}NWD2O*IkAXWE-Nt*$Snv5SPN;q%K)vG6cFOLfH$d|Pqlxj~JSIz*oiA>uLW z3D}6bTu5@2l*}1d{M1XZZTgDej*qzFXFUj;N5K+4UyRM_rXPhacL=GyVhrj%59@rf z@{F$lHmPfha`Xvcl>j)u$2TBW-uM+9bLiVuJ?4C@uy zIamSsH9)p4tXE_gYM-ST*7LE;v`-MjdN+2p_K9Fv55`Kyq|IPhFU4-wK3g%YCt|m2 zpB)(1+pxQ}PZx%I6xJ%I9qJWjGoNLFkz@7uQor>yY_(|@|J~}6pwVED=E{q(C~G+5 znb_0=vApd1pzwlFo;>2}H+wG?Stm6N_7kf}NwOIgyV+UIO#)_%26vAQ%{^whg?We{ za}Og&sD!(D4ORp|^Nom7JAk&;YXhZr#G8^m2qs>xgGwlOU>>vf=(Q5e{Ng#WZjr}q z*;LBle!#p-K1`~2Y`y4OQ1M6<+-pB0nJQ6r0UIj@f6bIPjec;v#Lv62$}`K{B5|qL zYVi-5LrD~c#SwK`(YI$2_mAfAf<5}`1zjZ-HRYmRz$%cz@tTDVau>4mZl|bF{O@jk zlU;b45F!B9L!gdPT2eveI`K_C>G}?DtH^Oc2i_=BQZKLu^VCbD!Se#kC>gVAJd#&a z+C{0~nGbp9j$pcS_CuZzD1xCE&68NDGLO+$%M%7uovFtZ|6=C2fXtOAORLQT4tdOu z&dEL^Y&+j{3u0a?lcK+vM@EBKCy$QSsK*|UlLzX!0J4a~|Hbs+zV#OUEQ%ygzZUvG z1%v6eN(ki@?2b=quN6%@GCDYo8Fn6ed_AKftIv2J^$X6}ym1bcQz=j1saV-CN35tg zSY`~LHfMJ2yx^77YGzkdAP_&(?&~v7uQ{47vq1Y-9!WeL z?nFN=YU{(@&cx4*Cnx^p%!do%HBR55;CN${@eTXLKB2&P>w5v+P@x1bI-oy-^zuH} zkbSVO#WIv1F4AdBtPUzo}VX2`q_Bj>DavM9Uq;c9^?HL&*>BdpGwcrw^JGV zgU(Q`%Fxe^9bPx-L-^U~spBd6iBDI@mSv*3;i?9|`H&BYdXF|e&y*1BI|}LDt=!7X zLhvf8fIY-{x>Qhn_4qXT{RU!Nzh2W7wsIu3g*5fsv487c8#3zcHe)q(l8h_T))#ldg2g`!jFGbIY zevE-^GgFi%;5M={0(Kpl$M*t4PgXHV28W8la;1uaKHz9Mx{WRiD;xfxFy2J2KX4zt zRgEyF@rPtmdCQ*14y8e%WvxSAS8fPipnLVIi-u%Lg%YxY##*xGXkZoZ+tPqtu1cf`t_zQ?=E z9dk(w)3dylvs#Lm2fw&1I1!aSJd5^vM%FvAvO0rHDT(x*|>Ox2efA50yI ziZt3^^g{ltHzCPET%Sb4xEFx)e zSc`;V!^gU0~C-BMavY3PwV$XAheGEA**GmFjt%oIB-&WaiwLU9!=pt4< zl%3~@-Q@J`rGqSUg&!8osXEkpv42ZvZJjZFuv1NU@(3x3Ln?ib+T|(pE?;?*!9x*C zZwuZQvKzgLyq5PHzaA{W-k)%`yubWQU&l@i9y+`620bL}jabqa6l$#bqkA2=jL#uQ> z*5>^me5su>##$T9fmr9b9^2&oK2Fl@cRd!-((3cP^T}Tk!R8rlTHIXTICy+1B6oWU zRTQi@WI^U7)M~I+@dDv0VwH(L^UP+97xe7^5bdY;q7t6O&=)P`Aqo$xff?k<<8R7L zZt@-kTXJ`bRBaKCAdba2nm%jJIX%G37CTg`Pz+t>ox_7PCwv{QI}ygU87y-MTm$nf z)QW@{3;Z?aUB}eaAhJhrSa*fnXZX$PaqtACSx7c_n4nCeD0%f6_7?lj4TEI|zT0me z6yzNBro<>7;ZgFs`ca8m>rsiBPL}r3&+|l&dmL$Kq%`I?Mr+3r-XEPQqObD?-;|Jt zfac2|`v;%DRNmp~o>`D#OFhElHFDG=JfFWJI#cf7SOIl@J5FVhWge+~Y&AUPWY9Z5 zI`bMMS3Sp5dmY%5qBF0T+=M%>LqojU$V=_u#cDsJHu2JS?`WoOX@rRjnq=|ek=G~Y z)R;Tk<+8OaA`JwZba!`bxzm_;wKKN*YGw)7JN(RJ{%n?ixqNe;x3b2(0hBtkn15Khnz^Q!`VgmPFoR+G-l0_%)7IQ%$mR-53%6KhFvTjr zmc}XG!4N*DG_?saJ$DqazigJT817#V8L5|2+^Z zb31&UD}F^;aXny&6^?WG-f`V|yKn=2Sp|l|uqqD)S*slcM#lkD9wR^bPHD&C zJk=Tka3tB+NZLlJw<7f7p0Ugxosbw-XI|u?*$xhH!x-SQl0B4_tl&i7f>m6p(OBjq zn-B+7S9c!3BCl={`DX8SalFX2<(byRxq+Y@aaU@|$mtA%1y@kKNMX z-?+Xb#m}Dd(szIHNP$>)D>XMt<^8+AFdr549#lrM!gWP%XAB^SjW9IW!2nwc$NisO zwo=5Z1PG{E(~^Z>nhWlj=3?cO=3>7;&4qZ%yT3TWmI-Ok;P!I4us=^MWKW!@ib}bH zu(xGYbeng#l*Yc`C2GQOK>EpVMXE>M=Fmk&8`laEsisP_z~gj9{=w=yR&*C-F$raB z7UGqubYk4Oj!TS*^CSg>@yTYgZY`fJFhZh}Y6F+48 zj+stM^DvcAJa9T0TR6cHe!}TXxWf6+fV8|X$n(N~1fLAFzC+Q)=E}g}W?%d~4}8Vt=>i^mmu*zvMcg4WpTJ7tFRc|E&uET*Z8XlM!&HUt1I#Z|KT?Zg6D_d z;PmNI&>&l#5uF!V8uz4J#f}9!M6xm8S#E(F0&;#7K zOahcgcSK>}WSEIa^~Xgo@gOpF9{*{&2h|?`0UqJqk*xqTU9BQ;U=S7vdjD6epy4-4 zg&cL7_}Y|b!u=yix$$IZlhp|71Zn4*aBy)jJckSd6Qh>_k=s}Mo-M% zeBdy7C~ooTiL7WpYWa=>3I(oK5t|~-#WWmGxZ@i3bH$-K(hMGU2{Mre6ub$9VoG2h zF11n1glrB}%fP67A?Ph*9#+tM(PoYlhUQ@fDEpd0z=9g)VT!H22n!Z|V+~;6aT?vR zc^5L>cZKhzdA1ajsz7Ld3}wP`?kJI%`NmxP$qr!6#@8Jbxa_^35pq#)i|BaA)LV7}T$>oC}78$Z4&5En}_Tww=;V_~=Rmby8KHh#ywN|e% z;QJtzbi}`h;d`IDEpUbZ3wz6rx)6P0U*}l1;w!hiTCc<*`w7+>qJest>fi<9aIRok ztB%)58mkThQ0%hRl(sOx$r)S5sQnZD2@dXG&~AXY+2mFc4cPKQWfRvZUjm!?XIEOD?g6a&Z=v`u41SE-_BXk`i0ODV{0U z&>})DAf8(BUFx@#vHtql45#mjl~X8}qL$)sF1!6}Tr#e7@3CKeG1rBkjrK++}+Ej=ic7^{y|x#&W6vC+piJb?+I1(4Ev)kJUehy40P&lqXnu$IWVo6>M_R z-yY}Qm0EJ6URtX3>?P@|M6B6Bz>YF+*uYLH{5wQbM^ST$+ZGz8RXdlWY~1(6ilb@$ zxr#<1U7FHod17(mu6{(b?0_)S9p@(L5a?t>fiaP{%t~?{w-^8 zSL=&7NS)jGVB-7Xx19(Mzj=q7kcCr=gN_Om0sG!taU2A7M##)gW+J?0b`ARnc+&s! zgEyK#Hm*>sY(Ok8 zm~B+sQHUP#KBWADpN%>amkXrY?02xx*e)A1SB^S|`&XNX09z$ZXFGQeof;;RJI^0G zJ}+Uy&SX5t32eS)TjMciJ zM7%Z`zPLn>tG?ke{w07qU*kYiTy5&m47y&h2PBX_nxt)((a9>+DdRHLR_EcKuTB{m zKY%aA9Z;u?%ShugZxHt?b;`Ki+bp!VtBnTEf@GIN9XD=QCyD?h%>eGhP$!Pty$@go zAbc2rtbpXi5$krWa%>CmA;Hp40ZUpNuMfiSBgV{do(-` zLmfUw^r_-@b*czl##q8nz)**eZAwgs%oXATyaZFl58CHtB zT?6)Fr~^lR6c3;WpU@?NE;vtgvg~u2zZy2gf27~Clbya7zV3l!()Wbg4QH2F!kMej z4Z&>iJ}Jkig6GxM>1mvsiKp61pc2cf8`RFa-z@wA0#WLybDnozjdj%NH!r}O)#-X@ zF!hV(sH4uAjtAxRkYk=&2Bq++^I#cnS7d=?D)7J}XXH*SLx|9UC<=9inM;J6I>)>;yI`~Za7N&eXgR&H~4wb7Xf-}|OXM;NY{G2*} zRHvxE_o9;}T36&!T6Dd6X;y0cXg&!@&FQUDHN9`2rYL1>3SBXD{+X{y_}-JZ?_S9~ zCzy&&oqW<9MSF=lz%3#lUY%lY{>vHZ1Rtw1S48@}Q3gyMu&P5`>!7!Wm^~oM*>8Rw z&xNa`o1-OFD)Oa7Zq)K}&m$~CZN|H?-Cig0z5A2!cie8o$fxWJzn|&)K?ms&|C*+Z z+2L0*M|J3jwmH1|(%T;@h@e`=>dj7>@#G3YY3fG#5m=rV4A>Cu>dBpj+<&>UDn%M*jJ0*H9Mg2tp6YI4hk z#h{Ydu_Sy3C3Y+cpR*)()CjyoYYIO@Vn+?ddQTqlj|WH*+*rm}H5Bhq11kU-Q~~V3 zP($$!?{2IB+BHB1Rck2Ti&YK9h-F}fmG@{I8DG^q7b~grjS&FA6@3TzMcBe+zATCSZMFKNIL3~LlNHQ*>l$N^tt>_}YT z50oI@r;nc9_ru!uq=wr*VHY{cfkAd5OhERzw|gt4T;2+vS6|P=tgM>mQWB}*cFEvy z+YuWYZkG=Yw?D_*X!909qgIWis0k7t8@)&d+~_$%MHet^AXF6QAS}hWtdx+1>#VVn zWH7D`O51n>1Dp<8fCh#EtkiR>#t`!Cs0vu9*@igo;2j zYjQxYt7~8>1u_B}y~va_Obs$3RFg1yHDf~BI9MP6r?HzwafVGw zQm0Ao0Ng|py=t@();$MeH)-KhmvQOh)Xy)J^EHaxEa+|k|nl?6hOEIcR{)PWc6{N^Td3 z1;|(>)n{%TIH$_f#wx3V(#9&WB40xLMqORYX$qj3+OdZ`a1BSm`xg<4Uw!mL#DE=% zOJ8JQLu8r3!QGov%<-%|Qk4%*wK-qmxQ*ulI!ta|+ZMNU30ZEqa8h*0$k|BWsW;we zFrGC(pj~itfa?P%j1T18arRCr`iUK_?Q3ZOg1M^%vgR`&s>8_&3vZXgJK#IEx_679 z)dh-F5~m7cmy@jC()lm*vpu2nGv(#%{@2Hjmt6Jc6p|hD@m$8EoWfVfj<>QY87x&9 z{H6+&${<($lY={KuFA2BqC>!xGtTpyD^VLh_%snLa*3u=OEN0AK{zFci z9+c{JMSexQpd$#cMzTlvwDEZOa0aJ^bladO{1gqzIBh(oS`i9K_aq$n?L7Pp2Ul8X zw#E-PDm1^s#bqXT!EnDLSQG9a73A=ro*vi>rr*3jE~Uje1WO-t&Z&W<`G4H+6sfGC zglR#ds|2{=Twr7g?RAU*zkUu-H|g44LEKg8k@KWIwb$3mmP!So2x9hQ+$LQQv2b}oUm^OS(Z&MO=$UT3p*R`t@I`{ekU( zYRsPl3U?Li#H#8o^at7iRh!=hv|(1E6yQ+dtp;SiCiHY+s(O45_fS1vQxjOIqOB6N zn~PG_SfnDHDxR~7b#Q;ct)lXZr-&eRsnehHW#W)VKLq&X%mT95i~`qLrEruyo<6KC zG-fEfQOIFIR$uEr+H8?3iMxaiC9+^JjmF|kSqg;&7u;&w21paWwke3Y@RN?$-dL3UTKcERDXv=}>N?FE0c& ze`aVTN&|;A`YP?gQB?b^Y3~d23rs&e+(SW5Ol>1fWkKnRyg*X1<)gj`H4c|5>>;jYdQ!xaxB83jZ7+agQ%?wL?_pHALlJwQ7&%rHK#_B!M~Y-kkeai0~hoQTbud%~6x8o`lI zLHKm$Y6K-RgWoV_UClU`Ys@O(?L@!ve8;QVJkWamG=Gw3U!P|(xrlP_cs)DoWOqe5 zR!%vuCBRgpVQLd^TTPRTNylHI3F3KyuJgcA2BSdF5zqK!?rK2PxKS}Xhp^4jirJ_j zJX2)3mPw0Ih0fs(6@|o(q}MgmHuP@zKpl@8ogIg{2G==wNRAlvpk_v$!|+j$+{bHL zV?OiN0AdA5VJ1T30^6UZd>?uzHNOpad5D)YrU`6-T_XAT@ZDehe9Km_qU8uGd!lm- zVrv|aFoi}^zIZH;t()IJHjoVWC!^)|P=26I=q-U>o%wBBYKLctD(8ILGHJZ>#yw2% zac_p|()1#ChD~Pk1v5_c%G7>LiW|!U;o`;)Gt2dBZVQV`UC~fw==!y^t2|2yZH|#6 z`ev&wJ+-3)a>K1Qu#r?US;?=7l~1i^|8sz{Hu|kF-jw3nF`}|IS9I5=)YiT=sJ6Dz z_d)O~t!J_!5FmqR)>>V3(Nr@wxIVQqi+bcbFBzH;TQh+Hh4J>yfuyf9iVTk>+Bboo zVGs9bl7$JYUoz%Sh?P&{rUs$vrbic*M;FbGE}9!%R2^MJ3=52F`$>3Hf!`>f>Q6r3 zh_c-)jk%Lz<%_H^w?!9yIlAbp(M4a6F8W4vQ7F3TTj|)rSyr=q~!74SThmFVD3HWG|`OocS)z zthL}2c52d|H3zh394w?rosUbMdZZcmh?5rzNUF@$$m2|g?MJy)&3Y1P~1KeFPRhnCP&xFSqt!&0H zh`9Xbw_Nyj*}J7J14PF9wX|Lbm*DwV$6zmnWjRC=UL;j3uJ(1X{V2OyQ{MDFg$x9? z=ja5xn$c`@7yokZX+fvs<2oMsu`&cJ%fyr)L8Syii;J)f61D za_T?VNxp=5jz#nH>0;- zZFI`QaPX34Lw)TOVfmg>?Q1-de(szqkZ6g z)3IW>oCDmEQAOL_b8~3;$rn!chF`GVviMeR`0Q6df~aHgQF|fp42{5TKluva+LN!S z=pB&uWJy9CCtt~W_7*^O#?kr)o~<|E8%;CniMlPzgL3XJKO*Ch-~74?i%u|l*lXuv0%(5KUVdo+a>XDn4 z-m)j7z^L%tfAWKH``GDRR=!jL@T$Fk@yXLQ)h2pU=}m=uY$KbOpq*KAe@mwnUVYQZ z`xl%%CH<#q(7&7sy9N8@C~*#!>6>z$H+kbZ8B{P zo7Q|h%eHp@v~{Bf)~%_Ym_6s9j6_@karn(Y@tX7S=>xdY3sfa~pRMuZR147v_6k0GLUwY|9nw>-nr(KLWq?)hM$R2 z!AlYAo)5QQl4OXkaCTSZFC&lL6>elMYzZmfmZLH?jFtDnJlg5#(zKGfyRkJINDp_>*#WKHkIP#l+Qds z`j}>Qs8VH8*l#YTL!$!m1jGr_+P)?m{KOce zBA?M?6g`9E!Ej?fEw4M==;W?hr-|Zan`tYs*&f_aR?MG5>cv+(J9oa($QYDud(Ja{ z-IvCWe{g`d)tzm}`5MmdYzMYaE1MJBQ-b2g(y94W>Yplv#Tp@}vBnY0J~D~>sjD2e zknf?SksR3`ymG^^iVdHgRooRkHfegvg%|E?ex)F@!#@44!)G{)4+o#QusuKNdbB-J zw38{mZOV%({AVTnC9{fqgU9@}=8rFKUn2@Bn)QdT`pB*0~3 za)qZQF80at*P5aHS00_X*XU}^FkUenXlL+C3#<-LJ4&)`wV{h>(&7HwTy4K50pb2{ zyT1EVv6uyMH8on~X!$^Pwbo1sPb>JVXMDz5XH#aa>HUmw!NjO79!h6}eSY|GCe>~? zIulb8XaKFR#@ZJ+;H)S*jM>l_Yq-}k4_n`xTn0BqTy_^*PAmm zfm9BchY#BcoD;MEcWhxrj|50O9sY2#(HY9*F+^doG;6ylH@z054K=B8#%&EUWK$10 z)>xAvO_wFc>2eJN4`<}qMVUE|;{7SQ{^)~AM z&^zWE>}fTh$_Qm1Ivk$1mmXzvwFU_o%PFP@?V@Aa;=jf{2y8eLXwHVf7bJZS^B-7G zlzGQFLWtE*`CErcfo?x-Id09$OeUWgk;2mu(aih>#BaQvyqtjUMW! zZ=I}@UAAdr4GkLw_0Ud~`~NX~G-&LvrkJFV7J423{qi>)=5Hl^UG4=h-{yEZBit2~ zL#l@$r{a&#pyGsZDnf^=^(1R(^4fW|`O3{^szLW#03faR$e|IJuCH z5qT;|;iwbG_z40YdMme;^1ltb{^d9<+?Z5wi_5 z$L%Ye;lo*3dz0Q)f2Gn{RS9?_x~ul%+_;3lHok}WE<3Pc*!tlcDl*p3%Ggkm3EB0t zGQ)ea!rhAa{z2mCz8S<-SQ+6xnc?nCNy1MDu{LU)3NU5~q-_vF_^U`nKA(rr$!F&q zAPvX)j`A60_Z*3qefJ2aiD_aU#XO4HhuMdD9P>D4KW0DX0Oml<9wXbftiG)NR7oTy z!+ySne9QS@mBMm2N^aBbI_H)TX*{DeD2fzrEO_-mZ1vOutNgt~<)6d-+5zJ2xrtbk zCl67|%~+w8s*h8;J|;?i^pX}Z1bL&0-GQZ$Z$m}aWe3*J%Bq6!%~Em?r;(L(S@5Ac zLhtO`s`T5^FgK>*k$Q4x)fGBP-3sNbkFcgik5DX z|L6>Mz>}d7-81s3hh)Mh6Z%p65J854MQ3<*!Sk8o1rd1t_Jr`M zVRvM!U88q@a_i!W?RpBvodR#Y8Gsux^R5q$^qY5!eZk^Ru7h7YX9iMjxm`>q7k9Gf z;K&HAP3G>$*<^drGnvu4luW9bzT7F?B3>+ka&j@1p1_XD;^lrYpZ{o10sjo(Ssf4N zVN2%jh0ue3qA>qd%#7`z%-H@ug|X>2u9%t+QWs{=HB1b$dw?)&c-+ap?NrJ!bZn~f zTYE_|M_^O4=Rh!&ZT=l}bCv}B2Q!t#pPA-930JH&7CBhlI2(*LZXW*`5uPTYY>Cf= zPiM$fATxC7mU*Ouk$wa-JS8dR#A2e=LeB9}l$EFw_f0+Qvz^X}mODetM?;@$V4}tW z1gf=#OjhVKg7mC-w1=|Bmpj92oVMV3DcTN2o4`gnCxf>vB0pPRA|W)3U=AThho>FJ znL$SWMuDh_#ptQ*^2sDInOh3yU$8(|o6L(>vNELXgWqg9{Xj1VE0W4lEvMVX{w0bl znZ4x7-0_VkE1b@ZP))d`^@wD;wjri%f0VgmsG!z7O%%|H4iAluRd|{*qb!w%&5u^( zMJw#I>>Hzt^P+1V(Ho+R?Tsx}&dl?mjk*r>TBt^0x77zPWlzR=q9Vr~yu9ALl}UJW zW6oRQMzl$Nh8eoUMst!jdZHAJ;eK-(7)N7+q*?-;`$(4h$pIGv%47bw^!oqJ+KqgM!s#n?G2!ZnW#s&JE4Y$o6vsFOfN= z-Suc>&jUC+`q{}E9xd;2-TnU&00!Do2h!ZWWVCL7w5~T=cQ{&iBw9BRt$QiH3JeG_ z0S@}YW>#=AvJ}BfDl3CyaG^mGaCq*3BktE0dwiC*WW;a4(mZ#dIexA7$&61DpAW7G zT_(E|=6krLc*_sFVq-Ll{bVoBxE&XZIM<_pj@g@IWz%~S@n~IN{LO3~{9+aS;Z*QG zSL|6JlK%LUSYr05gd|wByf3~}1)3eaviXBRu%P*aWx+AcAAHl*`hfV){m>Erp$a?T zj^Cp#1@Tq^-FRKd)4VRDC^UN3Eby8s_xLgZ(YhWzfu?X=4|kp@W1k>+L9F~J+bs?X z%5Sa%Yr`dB6vh)K9ndHdbUEXn#*`xM|BCCoBE%K$|FSD4H>bk=^IhLfVBrd-_?t6b zkssrvw3qWO3!6??Yn93Gv5TC8*!Llb%cNqvgk0uwK($-Yeu2 zmxs+S1g{C3BZ5yn2aP115PSCM%oq-%DwJ`6Zha#$&elgE+U8NlCDZkIPg)RN^Pfv{jGXN2u=dgN#46M9IXC1O4$G_~_bKd7j&EReR9U zTx<(wl_uVq*b)D(3fAW!7@>z_oG2e?rtD#cw&0=-=8XWAU0uR9YAk zCg>vznTcyvy?lxq1Xi#hID$vYjy7_uCL1&AuxdSinbZf(3i2X3M7=c!=_)XVH-Rij zOqbBX@%)#nrsOpDioffz_WKi`Hg_xgAKDYg1`!7)jy{WrhD~lPX&?!m9m*J^bZ?lg6G=-63p8Xlj3; zofzeP$+>;(WDOHY&}Wn%zrV)cP#-OCkJfdWQEDt1>SAM}voINIZ>Tqi;}ia1s>HK4 zD{Ij~qr5*kw|{+J;`b1oh@-rp_%msx!3&JJ{moMgL!>m615zpOJsE|7!fSe2S&Fo( zv1s5#XKC;=C%Q9&!>EeM3D1d6ZJn4HACpw*>F%}c5 zZz?d)2g;&Pd}8Hqz_OB|BYyK5?R%n=?!$wAX(0;D*C0m-wMRBRyym!Vt>oQU)E`^L zsd&~*=jJ@PT;wT=~~66HskAMESA(LZ*4?#)c{`BwA&j_;3reSBeH44}qbXL7cE z)oA0q4eYaICNt3LoERkuGyf0j3l=bAq@Rbf!;a*l&ZKQor#fYItCX%C&$yje&qO1S z&tq?rlS|rzBiG*(`3PZqSRgx%xTJOvelZ0n8Okd${Xf7 z);kiOrVMtuZWWUA2T4v{kFW#r6(;@8?s8mCUa0b5hX7aml5`?*39MG)_N?L-N$%ZVQ--v=f5sVxs+ zaOgE=Vn;Mr_WcR}plsDAoYBeRj!qVr$m|){_AtTs*EQYvm(K#(f@F65OFtTLjv?qO)K$GVirT4lbP9Vu^1!NvaK~BASb0HG~mU&mIy5ky;z_k2H zz2E#EYl^0WW z`!MJ@c}NqWdy)sKkYK(_xD<~0BrQ`F6U|dnO8q3?=lRcX(yG*Mu5}3J55Ry`&;~fhlK){}Z8w=&_?`^8rtI@&n^M+4 z>M%MI9pda4=jM*Y+we@5ml>>W-Sw{4D2Xx3J<&z(@R!|LMqg-@(rY~M0zGqtvKGEb z0-uG?ef62IQ<$-t$%c;pOyd-XUH!4h^`G91Tqs9qMtRQ?9JN;Wc^Lq2lnG|DV0Lfs5ii_l9TL0R~vuRZ-EPV#L%0lainbxEL2@6%#QS z6eNn8R4Ji0u{xu%1zj?bvW%N}+O#J3vx{h&bI$vFp7(v8_xBcl_q8+k=XKw6e_r?X0SR&_NfwZ+5v9E_4ZqGq zTT;}{XsA_oW6`!^A8xB<1fuak#ar`J)G81W(lmFfH=de}>g%3j&RhIE)vUbLoxYPQ zZY<%b)VO9;f_yb-bq|S3jj}mDQdoXnPsS;Wv&ARY&PANcYtmX= z&X&r=w3e5J+7B)C9O+7HF{~Aq6+8E#7is=iJc}&CFSJXP%g%%FLRNno2wGcedtRqD z!$F3c3@gJH@t&;cs;JrEL@|2qsEGECY(Vrh@#iZlvUk2pnYjhN^c8VotNCB&Ib~!s z0`R_K<+7c7DEEdg7-q3HYkqj{d>%e%sI+Ev@?kt;3fhgIJp{rR;;BRvsW#SPX;ClD zwQt*rdR1Sl2ed!-uYi0a*QUM3pG|Sl=ZsQ=5nC*C_0_aP3Ha^|-rqnS$$ue2d)KS< z;YPKz3rx35l6~NHLsxX4_Su@hw?EsOpG1)7x4YD;6pObC+Z*4uVV>$GmAG=1(J4}b zN=oP+Ssv|kw-@L?0FPP;t{JgHL|Nl$O~DADJ4@_~(DfHB!iHh`Y7jV>ba32T+UG6p zuaC~YS00`RJwUb0{)8BkBA9T{faxzrc3 zrpND6s?_~1MTTXR%xGdQllk#_8$ko0l{@gl$Lmmbj@f`KN_lou%oGv>Wt5uTL3yII+>Ox1*`+(?uz~+5G^4{cq05|P? zwMKg#y5)1uOaXPyu0De5YfaGNhCSHF6MV_M2lIby)vP_a>7qrxzgXW&8?3%yiJYwl ziMAJvP)1cm=;iRPuxPrz5)UQLH%sK?V!e=_akfpwHU-=E*x<-_@TBP=B7Ih@zk;<= zvzB;Pr;AVpCdVw%Z^a(6#2ASNOH?P@KyegsbBv!DpoNafD2I5cY`DrEw@Z@81UE|h zPd|mW`sy-U@1+dTfue}MHdlms6|Afhkt2)re?bl)h!yFR@IXg>x({Cw07cCu+lkiq zcOcW-TC(Dr1}3|q?}Ol$alDu|%+NPt^<0QhZY%qpWRY(UZD?zQTdt$U%%Pv=3ox6r zNlBo~c3jJ*euZ785lx#WERkhmlvgm%|U_>pg@r+|3Rg*Bj2TyPVO;xnx|&y$%h zU(9qUmc065uAG{qbq=M64^StB_HoiNe_(18=qi;jcb=z=- z4C)Xlr~TeMaesj64r49{IlL0jq@J0rv_=#bK`nBrW5+vq$=DCQb;s?$_AkP`nR%oA zalbX+wn!&}6j~t@$CX8kP6)VU)xS^ql{&PpB5jGyH^)){@u%C705aN~f%UMp1;PbH zBiNUS5TK=i0qRCq?eQ&%XpCatLzX(pY(sQ}Iw@m+`4gyNW;`K91vgs{EYgSHfDEb< zQM%SFTN^EIbmSarrfhA6c<1KG-s6py8*|i4t1E|Tfr{0{4+ULg0a`HMhj%P{$6nzr zlvscaZ3My%KpO%FRQ}ztqa9`A(3`AHr`7BM1Wq~nO27;cLD zP)Q_8rM8$WS_6YkVSTeeKZNr`s0F@Kq8r`9jlL=iqT#HJ&2_Q94YPAeV|04SJR`!| zhsMbv-;MBnnmSMkE*>|E^Ga%as-}d{mBrqZMpW-f=gG65(-RCZFmKuw&FZ|9At>hgy!C^SE{cCJWIMl|jWK$~J_aWw2a z>*6~ou}jQT`}%iM+DbH0)j0IzSa7h^G$+?+JUWup_&2~AO$wriiP4i$B8_yM0jy0gLRyo}ARKPN2 z1j-Dt298B+pn(#hmVVIpL--oQuJ8hXFd{li1GMbeYJ>7vo@k5oo3EwQVUe}BNdI{U z$62wGhhCVWrl>f?Qj=rf_Is*h-#zxncF;pZO6M=|i|y7M#8FdWaelC(YI4?eVyoE_ zhx?+p&0!TAW~!Oghu>)&HKiJ)!xZSE~sacaWM3*(dld`(oNf3 zoQ^EZ3d^5Cg4d~5;K>}>Va~0RcO1nruEpu8{Aom>uyziEdJ4n^;}ybbjmfG?+(KOg zQVMft13m2cJ!kcdEF_+;0>kh zaBApnW&U+n0k)RGk*z>LYxS0%c79;5c?#*hRk-`VMs2XB_UnIn9|Y+&I?PtN+d;1l z8Y5_O)u_VWD)!MzPiIxN%Vp@q?PduTmce|{xcR6o2bow>Q)pdYrPbLh-_qlb7iCvg z6(m>w0|h&k32OP_eFiF2^c#JSyD z+QB#vAH*3fO{j#1(m#-&$91N1`YP0b@KeC2xL6U3i;XA~nWDmSCeu)B5#a`EGkWbc zKfn^HHFgqz6RxU>?MSRWTI9PUh-C{@b;+fjn~y!rdAzJpBGV8Y(Dw4kz$$^mCU}nU zVK>>#Wz+tmm}A_nHDl{e%vpZ$6ufYxC%4GrSwYNV143PXf1Ud)lUeL5P~X8O24=BX zW)>5OS**VR`;%hq5QzP-L5bKO08?V@B)1JLagDX>faXB#XUd&z``gYL@ga{}K5P5* zHH7$QhhGc z;i5nBme0^D<%piYA@ftluRC`ku=92+vG@?%4sipS1x5tgK0}<-Po8*f6-s*2EHFno z+IB7wia`lxAVDB@zfu@zJ7Yvp61@BgaXJ@Lv2^`JIm0ud?JT;x5@li)&ciH{0zN}P zXIqEy_Y5RC}5)&#`KD;#Lo9n$E&MhCFK4bP7nag(W&D%E(FqGJi4l8 zKO=sm%ca%-j9R#Df9t71zqV6tU6ciQnV4&7Y+FNn{C&vmGAEN9&s)*LMuT;_&Ii zr(^eh9T(k?wgZ!3Ye0XITCs;dYTH>bh~Y;M9DnUT)aLjf3HH?959pF5v#QadZe?kY ze4aXH+x~wPIVKd@h&CTAC;k60)0F>ya2_%Opg!Pk^bE-EzWfg8QPMAgSrA)*6YjpU>M9A$ zk=C~FWB<#1m0>_#vHcWAZbw@eO%!ckooEXXgHH8_IGhM-%T^MLifUV%8WjL*pd`pq z%(NJ2k8Hp?XZBv`>BFMgwUwC@W$THE0DROlv6#t&TOo)Mg;y=s{!DY6|5O~_MXxRO z_|#N&Uo5gjubPbs6f7=7^02T+AjH&ZZJU~UPoNB3LS-{ijqzn_M~XZWV~QVaduW5D zLu)|ro&d+BA(NO&^R~Lr%oV5CuldO{O?+1lW_$zXr%ViIoWvQc7stuby2iQd-@jbQ ziO4f(0JI!h46S&oeOx=Z2Oc~WWgN}uL53U9AMl|uNpx*}2_Tr|PE@94EpaHt__%{d!A)z1zODa0&XFfU zLUJd8M0X;ovl)eDss<;0*lx-0qSS%t#<#A>Z!`s> zC=V4C(RMZzDWXkBeNH5?P)fMH%#t$jHA{AFFHz>B7jDF(GHbg0HaK{?n9E+OULvvihR^y)*!p zG_f~_I9p5xTiH&%8H32-jo3qL3mp;BYgyng~hJmP*<>8<;)h zo1AiLsyxLvZKG!U3#1e!Z=Ox91UrN>yxfARUd#Q9q`QzhxcD!U5m^0LBxQwR4rFjP zUaj%=sd}?W1z}UT$fn(G%UUEUk>*$}T=dFe%sWPG=mF$LFYH6i5xw8Dl`PvUlC%-F z#nSn2*cLm?Z87fAao(0R?CqC=>S>I@{Vi@iVb*gd5Ng1g3Knc>H`&1ZvMcs=C?uny zf&`nTa-s?1=nOK&8Qw1MB=$Rbq`nQ6!d}N7=Eu_!ijzO>_X;zPXN}86v?bb&#HP0; zcSj!H(8M#l@Cvg9<$?=WfKag{1aA$#$I9kG{JbY!=QEG1Da0d=wq4}vY(#FktW%+0+<^iJl9974T%O?i;s0@512)M^E{lD1%k=!6zv z=yuJwsTWckxb2n^?I!cOVA06#3G`EF)F*cZ7lwI~3#9-TRONk)kNl zW)V3`TIC241}`adJW5uqMw=xdqh0a`#kkvb3p~d@W!#QV zTznb(VT^q!IE?+#iH~1_{UVXGl(hMx_YU(})aFaxJ0J+#r&gU2lo(uA+iSci1&0!! z?Ls&vJtLYIIou(77fFE5J0#^h^$Vg!HJDPDZy)g2;d#SkPn8|aLaz{>+S|trG+NA< z!8c#-?%bFp<9d$d@ZHtHA!e)+5%1xzQ^R=2WNK(scb9jpcln6^Am(Ls8({}^JL2vC zfY6N3#G5$={HN^JJliXRhlYU*G!ha_<#0|CYMht?iC;r0T@Lk`I{L(BzM9K1kT=JS zkmvAho`W_~SBV4c10kTGvbGQdVx2Ac9(x7XIWCV68kgMZwUIPNe4@wS5ur76#I$B8 zeLl0umzTH*^0tR@$bwi7)EiHO$skteofPDqPSp$_;2~Z< zq?p1Y6a-$+hY^{^M&4-kR2Rkty4rkn`KkoyTMKf$lES$iLP+!1Z$711IQ&G^{a zs+1tohGFWDASxxn4>66;DBX48bnzU<@y{ZDf}V*1P1b1;RZc9_-^Xi-cBjK@(dIbR z%phM)+u`XQ$5_sBXb$xvxH|ixL}lA{`fOU|_S`VOw`r!=y4*=i`X(veG+q1ha$y5i z=~hN-|5AhaL3cj_p$S_Xn3NUwp4_QnT()Ec&B-M^vE+Aa3y|+2B|cP4MG6X8S-Zb7 z^2n)qMz4kli!We%mxlT09OfSXfVfZ{n6(81e+8YU<7v?{2g$t{AXRCDV*rzYuQF5Y zJ?1SvGiiBUt`}~=uAr-ffO}?QoN@EealvtY+qj4J9-BC3z>Z{4t6)aHQ$!cRBL?sf zMYXC=pjinc8yx1FC40@|)IPwp@|@_ior4YEe=vks*Dr_y^E-xcT-Egheos}LPzN6+ zj)$Ul=-B5m&cR3E9#dJDYkYf1#CYGr@UV^f5hj&>->Zx*ykAH8o?~ZYZo{+#cE&hw ztarh%exQtrP3eNEn1vSdx}_iAM@y*P@7rwg-mZ*wj-xKG3`bs09==L+Xsv;dSMtpk zc_5fWAfDD6VrFpqm2_XOw*W(~z+Bcq88g}1`!Oz^P4c~}xj5~l5f(~KkLCMvu*yjo zMP>ruv}!1j;56R34*7-(v0O+AEv=w%^@T!gpg(PN3>HFz9~VZW)rC?JEYw@XU?dG~ zs3QPF7F~0hv=Un1inSj=BRFhx)i$6%b<9D33RKLxzk!ywdwezNytcXfy)Mb?BDwfG z&^(taME@st>t-zTSY3H_58;9hgM<;?`BSvE?_Y&=AUs{%l_cZ1U*vAkRq3)|c1iY}wePx%*+aGmc?IFPwiUE*M{I-{qteb2r^E~vskPK_rCT=R{|?A3fgP$ z!h^NVdEWjQE2QVO6%*bpjK+;o6|+k4tF08BE3tgi%0FRnt?A?C^Vr1Y+Xol_F}!?! zEyhzkpM)3x5>dNLLY7{75Vfr|$RL50cF2O2zN%laKT7mqtqSYBjaG6PFz6rL43u{J zlCi`)v}K$g)c6u?K}D@Z#6}d*St2RR2ba?kq2+XAL{-wguDwZGz@W(GuPss4e_X3`a0*KIl%}t2S0Y-3_z{ac0F>& z7`?OKw>$%b)Zs0)(L@Ii%yqQMSpiN*e2QACx6&V)1UUdL}^uZZ<4$}0GqhOs`Psm#}%bs zp6z}_4NIR2+MP=zK%Y@Y#y;6hbM9P{JJ?DD>r1$Rm|J z#;`~2@ns6#-AG7#Os+5Y@8bzyMyAWjZ!3q86PsMAa3$e zG$}`!4c@;ukrce^K8*udqV>mvmErBH*-5oHFStg9x;$~7TMdZLfy$RNj+>RuZVmdT zwJQ0w#~bI0)k$$@XDun#NdQLEOWdAWGv#ZS=mkjR41kS-qrXbg zi-Wi7U2(`Ch?Q8s%ABC=FAXvhdJ<4B@s6YHyyI7{Xo^e)rsy#OUyOo@=nCxbP8WpN z7Xy`Y5pi&HGSY>{*g+y{-svv*YXg}{;8^IRYj(PeD8#*MKJ_gy&SQ%s*1>Qt>IU<} z`;wgJfuW?2B@DyyX$ch{DS(E^(VU9pDe}D2ry%Qt%UwFSq9hymGeNx@{xhN$?jzK9g zo{KTc!J4CrHO~M8i!6G|g5beU5^xD*ujv4u^$v;~N%2VTg8hl)HWYbnNn$Xf35qq~ zpK;uixm*!l*z*udQ?ZgOlX2Tvm4s`ihb-6n3M{x0-D}|RE|H`d#K4m5kMH#^NjhR^ z$L_2>Dksb#L>i-(&kb7cRL<8sfae`xRTR+CfyykPBF`W;3Hc^O95bYfQD*y?Z3D#t zgAHg!s|78t&ZQtqb1l(eK}+XodJW1}^;`HHiI~xeseaL-9ZSKB292;creY9c=Xo5Q zQcyOfWCZ_)o3!(?ttpaXP;HGV!I3FERGpXXHJ`%A48uN8=zI)-?>4LPfIeh1)7xwI z;=L?uyw)fuxLjpfNy-KD=ZmyPZ6;mV9qB79bQKmB6crYNt~?E=T-|BNx4;l0GNvH| zs+&Biuy6?}=}1Ma;Ct94Cg8=PcfCpDgcNSV6+sIZp%*X;Y0_BWyaX%;F_yD4CumJz z_R36BE)nQSYjSD&68#0#jfXQN5qpfdB@hm|;YKFMVKPdh3>!&2kLDJz_go?Qctcq7 zabkHts;MUd>{yQG0<$)+lQf0t)IQ7?RDI?dDr*V2MfP-ofai3u`oNr-9>_jco`ae; zFoijPPC@os(mon445C-a1GSD16=<({4<6MQsZ@K-IY3|Sa?rJT0)XBha|S?y5g~v5 zORTQ?!^{t4dKDM=UZW&B-MqOVZ;`$6dNZUzzes5InQyA@tgym%{AuJ+tdj<0tna>B zx*;rY=3I%($n<~>gKrPMl<(uv@$d+~(2Y8oaSC)Be99dumQbSdr#PO$9PCq98rRY7 z2Pdcy3NS?yvnJTxZmsAxR|+f`b?7$GXcV0O9NL=JaAG{hB2U7;V#lUy;U((H@FLNP zQADJaX{i@=`?pQMlc3Tu2bFXBX<)V~u1H^xGXzCX#+ptHv1+3oTX}FNgwI`chFTHW zL2O_}6^XSCE0pLx0@}`qayC{$)9p?QA+D=8QInFL#4bqr!K=v2%wzgQ9+n zeW8o`(L2y5^LZ<74rkJ?37T^{{|CxtMl2_94%S;yd$8YiOz>Zb)NDRlE9-OpqT1o& zizTLo`>93c#Cl6kO@r*}hn_&VrnLeW2w;k6FfRZ`VH8iE@g~P3Z3S_- zEWPsn3?$mzK}BM$Dr``Zm@TA8teG~WbQ^$}wj-TKjeR%40dRzr zmf28N0+g0X8>KW%mDfOx8Ga@F+QQ1qP&mpI3(fCeRJ>sWiU3KC*-^8(0}wl^y(jl( zu%kk5q$`GI^I!?IjSaGj8h2p`C85blcq%yZDGUe5(_Lcr7Ggl9NfHeng8_g6USgzZ z(Zq!Ml@C0wn3KPO_mnp@)n^iE`vGc#GoChRMa6b?GtEJMOo?A(nyp8MyDavaV#J`u z)&ZeRZ&eqQ*T`>IiVUqk#fw-B9%m2DYHfs^lgD1;r{3$fQ4$a&swDd(pTNggdxjK? z=J%(8(w^_wa6KMDSgVimT!>YogYK?IA>LI7mXT)P&nRYE3%EmoZ{WAI$Q%gdS=@cjrph>Mq|#u5-tAal50!W1XRpl?onrd$@zXR3`}brF*n4P0nr&5`7Ib-qn% z%1I*9i!lr@qAw>A0q~*~5F{e?Ua;%pS{PdMia|m9A(T?Jfgw1tw~;0ru&zPX40LxW z4;o-hom&?@Z@xSkGs^X5xMFB+6uLx(_Z5YRc2Z>2fGAew} zq#~7|@yu9k&akrGoN%4t3HLvrYbRl@9c#|D376;E%|WRD+dN=MzRh15R^MitTy3HJ z$J7r4XRf@uZuGoR5oe7^#@TEHOSln+4bJPQ5PupP;aj0b7;ZKKru8Q8XtN>9%!kH# z5yHwq=w)S~E)+_)WI#dc-AkWY$<`ufSd^QfdF;9w_hP>sds-gn*Bvu*B9t-k95&-# zs{*>dsO}YGPb)_?Xp|3Zzoy{`RwwA1*^2>A>r%vQWYU>~1RcG5sej44%Crb|FXep{ zzAcpZe&p?krCnp2I+IRN;1<^S%vLO~!7_hM*7QvDdAUTtZVGR&3d~UKn&;9C4CC3i z7wVtE0(uE-G(}-3f4e|GiC1S+2^4xqd9pKSD)!>S0{yq&;teBWM56N;$FwM4Zl=ZD zHu4MyUPP>7IJOn__&voC1GWKWZ>cWFfCAp=4mylD&zc})G0sr^_6Q!})2s~ZdDEpx zS&`3Un}g#@e$Z24)%+_aHKqmR8}sCedGbhe0FR>F#_?=18I1wKZFn>oP~$}pE(4o83C2y3vN5hl6zm@4vG~P& zB*!>gWfspmi^{`Vhj=9zB+x zeGWMyt`}3j#GaB7yUQU*@v}qUiTtoey&ZIZpp3Xe_JMZl#_doC3pr<>`!tv>yIANM zgeVU!Y+xdkhvPtD5+jsr@R$gHb7n2jKSFY-@9TUQzb1hqKj<=Ih(JM~NdkN9t0=pq z-i@wvUOQm3n2T+lJI*&`z4fe#%d5kht30&JBg;K*TZH@oWO0LqI_|fK^%rX}IEIvj zYMz``lqTmJvpj1?KdW3jm&QiO7(+KC=w@!4B*$UBUXU)PnCmr@{4i>1N{gqCwWl2WQ71_~HAu5(9&V=- zi+W+i`f=)o)J;idH;e~@0ZshdT14GRA|`?A3$Ma&{qX7wE%-HKfs`d|jJ@1(iM0aq z92vOAdx_~b7L23YeA}6RwRb}@)@~AsX^@O_AY-Lj{C!x^&8^2`%oFp}#+2#{OxJnS zm}9c_>Zi{0ZeGp^(ZhVU*C=Z|vl z%f4xeWk!@Da~D*+VabpUQ1+nIP&996Eb?u*Qv~aHNcql$jE1yk*)d<1<|`u#sN@1F zx!`iisx2LJ={J{*3Y+!a0KK?ZoDO<$I(V7H#vR)_@rK8~@+u@ssVapD9*AxuJefoazU2}TQkQhEc-xCaci11~ckEw3{kGzDX(k%v1E(VPlh zB?oPWhh$u>koJS8d)#EiJTD=0rvSSBNqgZcEJeS&oDR!l$(V>bmY zvL)1xX)S6?@YsjFM{5&zE6H=AEUIdlPuvY%G)e-QHik##7r@Uy3UxlptnW%dw7v;B9(oDleG}A4*0T2K-1|3BY@9$Xoqfgw)6 z6R9WAnLL42F)yT790W>`H)=_7E373G9oUzWV;|$J+S_)`ei~hZC+=Jv*fWAI@K@xc*Yx3H&pXVB z1*e1p#X2_c&D_@Iv}R&PG9`f?X7p@T*~JDbCI^`rW)Yw7r5 zw%l{TRNa>vzK;HS6RWjw_FvXn@Olo?+RK#j!BN@Q@h zXbdmbU;7N~*-*WsrvgKKT2wxy&D>T5(jMrJ^d0U(!!FJw3+hF2 z{f)hCkdc+8v?Fw&RW54HtcH+&99F;90&S=`5X({L|A3@W@;UDg#6fa%{s};Sc=2xZ zT%vXr&ABCg>74X*9`H2U!6$@!Xt&hsVy0Jn?ZfyWtVoGyBe?kS&gs`S*t8!>#L;@M z&$dymd`uK%chM5x_Z-2+kBOx#kOKrvG9JoCtU~=4@6hKK5sKaKA%2mN4C2eskEt*E z8^)RVn0Jm1X(c2;kT&fxV+S~*(cH<**=mfW%xVAosF~ih>KbO!U4mAUwClB;58pA4g$DrVJSF z($YD^UPEUNOl3PM58Csmf{`CxBytClDNW%jQ`!p~97@yqYb4++k;n0nRhl#??v;c) z45r^`?vx?oUP-377X$^I0r@-VVZLmLjhkXq&Ci%(Q_wNkUR+qDH)F2DL}A3yszN-v zxVIrLUEJ7QA5=QXW&n^OVXsiG$Pzw@1qi{mi)u@!Q{S3{SIKLkuN;RwDV#`M$=YCw zuM@K~lNb_Y>&XiNzn<*bBbS6W6sEHu868^3SR^Qnv)N4e_(Es7(%@N8id# zO@RnP3Vf3|E}BLj-5T#eE)cm1{USy(GHi`c40)TsA#bD=G0W9qSlSG>4GC^*VVs8K zLjBRqC4^Tf`EK?P;{i`#_f$Bp?MnZeE916Y#<7AzS{TOzSK!Ea=y!&LZEcr>+YT^} zLvl$CM@tFgXePI@{~#_cgkv8hYPrPAII@2S`wzxFa2dx&3OT?y9=rla#zX&YIM~*9 zIk@d0<2WQ2PdM5jj%M<5_P<;%;kY;)_cD$L$UpnaxCbxecrAs{_)cki>k1qh58WCL zwhakxdy8=#l1n>i;ASq2Pj;$V4SgT`58`-`aM>M>dl^Uef8xrxZ(YW53x&MJI3BtJ zN5(^684k9!T@G$L#5fMgB{LjtupQ0hDeOOp<6DHIEgbhUj_ltJ`nK5+ocp26IKEFI zhZx7VufUP<&|e7$+uAM%x4nIJE{}(!4dQ4fuVnv091jtWWY>&Kyo@9J7YxS5^n{31 zhVFzXqXnP1)NB?;}Emn0Mn;_(5c z{q|LOz%x-FdqrB5KbQtaUM2k!CbFTp!!uEbxyvhX|1av_a#bE&|G!?9M=Qwp|Bd=@ z;k>S@|NU3wh5B<|U#tJ@tMK6Z-*`pZuhpL>@~_qZ0_L`%->zUtH%Vj~QYBdCj#*A2-s^?5E}e?9P|}?_9SBw1na>%cu_QTgCKROAnY_OH~ns6 zKUmhrYba#488Q{SirQPvXRO8c+8fO0(7vEy7RU$b=7BSV0Tjf~&1UeRsHr*3I??PTlnwT1gl=5bC;fF8g zi`QP1j$=V_J*-+Qj zAH@bNpu4cn1=`LB+P*O9KucN70BUCKFG^ZeaUNs{SL2)1E%eB9ofSoXzmE8l%B0 zghV5H-L@cTKuRRy!hDzrz9Et@aLCh+tib$Z?)^;|d2Pky@9Bl`Sw!Q8IWUz)a z0JnT(R=y-dN;{O~b=oE)*#OwPUhbJ8=a~@$CX|u5ZK(-}$CGv8*HpjOam6cDb33Kuldz0muwtoiz90&d-WFIv#+S2Ss%<#QARRk6JHmyEg~I0KZP=5j)S?|3@sWAhMr|gq?i3Q z6bBQ<)p0^L<2c^!h^Ovb4lK~6hgF@=IccAu0a?f6vu{VQK zC+5twJ&G=7^w2XEe3aVM}4!$pHf%HIZc55y!9hsJ8x4$ zIJ;&~XNu7g&J0<-j(J9%N#YUUzpVI5pNi5-nj*=A`pT93llWT2tOfo5rv0wI=W!qY z5A1h2;17FI(qCaO3cuU%x;+J80o*#cL7QCvnf)%x-1lGF@1j`$*nU?i{pX0#4)+e+ zLAZTzufjbK_Z%GTKAnc$r_=cTpRnJ>EfJ&&JK&Px(%~?F{6B2JYx@f*#kAk$!Xw%% z{5^)+?|K5b;5$&{?Yr>Y4A%u0w!8H;`&|?hd479=a6{+wf(M8-nl4Z0o-D^ z<#4Ov*22kfKZe8i_+MbZiwe_%PXq3P+XHuye8S)5f5v_nOYl66!3+7L+2z?i#9OqT zIFI^ZGW@&R^jtibr^CCLw9W6Nm@*igO^9Z6>&jyLpTVQ44s>WI zH^pDU9G?NBQXQLaaE@ah`uIZqCR_+>eI>O)C9SAJ8p=4Y^}+L6btWyTv8e(#?Krl10 zax}*YPTQ@w{WKWlml8E~w-DCd`YL74TWV4Q4kk?~Ry3CulbMzvtbB$h@jHjpHkXvO zMH2_fRxqSD3_xNAGJqPh4MIv=i-I8bLTwz0u|UsyG3>q*7sD|~uzW7xzC>U4HuDPN z6z-6}U0l4RpduK&m1E$`j4wuuC+e#bu{(nCa>#&ztx(w$k~9erd)AkjT3O|?-i)e} z>T4+ec8()nC%ZZlGx66fJM`o>i(rigvj+q)aSs=Hl$(|L$guG;$Ug%9pTVFlnj8N1 z8e(E2S*8n11mbk#uL?SFvG!3+FrrN# zED0Bulv9%Np2}=%kxGc!i`c`!?0}1@LjBLk4N6&ERbawnk7dB9P~UW%@Pcvdk-6A- zfVckSH9fs2p^PA?gjgLZ6O(U<`GqJoE+5C4^?_u%5#sd^u@I3CLbM{tndr@mRP1DN zLA&}UwO%9CF@wJxyze2U%pu_lYh!(Zh_x6deGpAu(+3U+7)1jY{oC?)u@Ecw_3Xvz ztKJov9g88C?|`0DtM4vLh=Z{)H$5^Ix7^?e2PZfwubu`*?HY6v^rjgm@)eOKkns=I ziEuT!>^g6!0{gzt%9pMWh=WfdqNPMS@%mnYT*YqJNZhvDuvtkv| zhSOf^C78*^RX15!a#)+4esF8p)dPrzGeo_R4aV<3;Uzm>j>C;{(Cz3XEza|^!1xYE z5Qoc?84H!^ZbyW%qA@yt9x^dDm~}y1pBsDAFnfEbLLvRrsMpZXvt_;LJhXxMtPtQ>;f*x~ zfQT6zl4G~wn0f$30S64t(Z0DNHhaNzCWxDU*5F);yn~xW`2Tt^uIVqqUxNRSO@GWY zw9|%efOPF4Q9ESq@uvHx&GL6nh&!j{N!okfb)x^%2}e%FwLl|*G#DEy2J%Gh3+;mc z;|WJP;|_tLK$HBR;Q7d>ac{5m7D!%1=Kc&eB^w!0$iShd2+TtZUFbt2yoI8-P};bt z7~f4h@2l#1_SwQ`^>x6iP)AFHYo-fhHG<#o0VFcOnr`mm_SbR$-(^NPh3zgTzo1(} z=T=_GIJz>cP=bg%MEw2W)%MPj&=XC3}ij<|Eg4CL z9EEx}vO*|P3rY+F*1!8#lzHdGhKJ>H91_7^%3cG~DXizE$v1m0-6&7>TuPVk_FS4{ zf7FYtJeS;CVAt+D_D6rjZ)@z2t;a(}RA)1W^<5QloelUUEMt(T{ZYCl3FljaXXIwD z{VUA?dppPB9i?ZDWJSEgVB`+d^qfCnjsSPvJw`%EW9bWldNGGo^2+0J8XdC%-K86c zQ;(4zba%tdl@$iA&{D>Wp{DpQw59H)uMX7@$R6hNz)E;29rT-gj(7gb0+0Uwn+r_l z0*4JPkWFh*aWA2X>@~4mryK1x7CdzR4aJ(dqtq>-8vWp#3$WMx9&HUqjbh(j1N1HO z9p<;l4Sh#4NwAu~qaAHlAsK66Gm$D2NhtIniG3Sg9Z*|8)`h@*v1JAZOoQFn5qf#J5CPbgO+H>C}8ZSP{Ln(~IczTTQ>QcP&->V(m3Q zLxj!;;e+noS%;SYSY4m=mWve3t>sDVR9OqMA3;UegAADv}^})W310r|Ol+ zO6!386%0LmyF7FdXw@JiXHW+6$g_wEmM;*T!EQ)FU-;Y&AP7DK&fEgM0#~S-`!rY{ z_t~=Y^(q({x4JQbcPLh?J1Hx_U9qOQlV?&5wxl`9h^ANhyGTjeQhvRVXZ9~N~IBe(Z9!PBKgm#@MZ z!k7!RNoM+S^zmI+N~iaOC6K@T^p(uIa+2)Mr~*=3R2}d;9afRXx7vEw;~IJ%d%q zKLEb7FYIqL_O{~Vb`|KU2^e4dAovL}vsvr0K%Aay1{kC=p`^#1WGVAz$iuX%M5Kc9 z`QTQm^BkrUc&NdV&|NihrTsZTTix_~(BzwTwm*Vm>n4estoCBNj=-!hs zPlBK=@f`R70vDDj=dqd2mY?idbBT7&BBtKtV18nqMR@_dWA%Bk4C%Qr-FK&0neOzjw-ZBU6c{S= zjB`*fD7wmm)&b#$z*KA994l1jdR8Zi*u$B8$cPUizI0M$(2dA#SM&i(y5~EQXzHcL zF?30=s%A747D3q&o^bepNFE-Rd2?*_`HmjHLykxDH@O{<;BSaoDzfnl(+8B&1~pHN zs5u}L6C~nbt4KbGB!;~}W+X2OT0+8J+f6SFZ{jelh|m(W0trGq2hR>M8NaDfPqNxE5@ME_)y8M1cC?rK`OCoz_Wjs~>*#HSb8ue}KL9KF}p=0x;_b zLE-r}$1XAaD8aZ%$X6smAw-DTY=ihv6tIa|YSW@#B3A!NetFtV0keiYVJ5Tp+pt-m zf+(tFgEweQ2M+A4%Vt*1&2IfJYlIz@4-w8-rEAw_J?Ec$UHh+xuqVL1knTax&b^$^l%9e zB0cot0m_Ee>prhp${`Zxc-Gh)6RJzp6$aTIQu5+=2H-iiQAIzL#w2`5~x6B9s_ z2(tFU2n=2YCvtpVguRBZ}>W zC8WkTavccvxboN(K}vkPPe6V114F_QGN@7)`fe%mV7$3sk4ND~NCod;yzxWgnW}ZK zDDT7=^^*Y>H`^6qvZA79uq(L_n1UvNt{ee5Gq(-qO&GsHUBC7kjB9BB?Iyi1=8e!r zkXkU0U~)xVs0jk;x%$E(tl(8KZD+Of@H7@9!C)2}MC}-uMUU3IFM{>M=D;Q0#XWQh z2IFuO()=~0-EtJ@LO|fi_q%IK`(#{q^?Htczb{Yu2uD*W=5Nfz7`P! zrp(Ypdc^Gmro2T@o~RnIzu_J*nZogM{KLzyBu@lHAW%UQ(4_qSxMnCXh4c`j^qVOb z!2%}fK8ihl<7wPz9xs)ir1{MO)zGF7uHK%+3r(Mh(}g(XL(?MK5K6euooK}yrj<5> z0ytNw6rbvo_2dLmlbe`XW!!0gpdw)e+OtS5em{pog)+@+Hh2Fv5Sl)I}BI0Vk zCS+BCriqa43d+6nw-{6;t^P~=W|gK4@-nA@<2VLc+H0RckuVYg5*p+^9-?Sf$y;EL zwR0^c?cJK=bMGr);}dkJN9wI$Y7VMmw!rSmzKHeL`rIv&tNMXyzxZHh~u)moTU=`*Bzcds49Lk3{fi$DV{>VdE-8s>Roj=55VIj3b zMa-b>3mhiNsOa0k8CQPR29wMBzD*{V^}et{4O}{h*sHyzra=t_R#8`GmA2b!=pNCu zQ9*g*rZYvGPUbq;I_PF%@uns=%Y2twz5`8lub1q1glu7)-)I&GRRpcXylo8H!hrQE z*13!{m*gAi8kO_9!gj|f@*Zj;gSv>x)cyQbOx-jjV0eyLtul^huCUl24>%*I;Z3m>=uhH9mF%Q2SmRm@t-A7sb0`O8fH@~!3ft`TYwp(2dMOch5j8qEpTtejx zaCO1Ps_!MlVwB{Y;9mq)&+uq0NpnjjIPG{+1Xu6zYmWCGo79T#HgYjON0GjeaD^s9 zy4?>8pR*|WjYN1VCK1I%y}UC-d4dE{RK1u9f(?b{Ckg8X| z-yIRm*Og|~-5&wHBtd8aN5)&9s&-2e4RpxC`EASO9``36C5f$3ZbCK)Wa1l#ZvD{w z$qM=MTU8oXKB>3Wg8gG_kGtI>gE|Bw6zv82YGiO{iSjAw)24O3-GT#IyWrUb1x%p7@hQ)He3T0KPTgw%3#Vmzr(vQLd!qxT^Lp7of~UhQ`Y;zH9<1;htG=BY;}|1 z32sHF^lmZbr})rqD||&bl}OgWj8(8;Ab+O{TVmTQt3FJe*xQO53-)$E>p2SaN)#gp zWJmZ17DLd}s&+(!OXpiYoVlvARl(z%rmna7s=A+j_Ss;552Vz1N?H$E4#WWWlZgZ} ziM!vF;9XKwd%PH0?s3JYSKvm!q?33&adVc0O;JLjzF@OC1AGef`NqutV|*)IsQi8h zMxtI)`+7tnPcW+Ot>;Vof?KHALhHfapAkX z#3KDAToSR|=QxZXHrq)zZKe@7b!Izu76RIbcN6-rfn7-n3@+qLW#Fj6pp$3VUpO4r z{x=rPHl&~gww4>fuLF6vxVjm{(kQ8LSozVzQCZGaAN0yQd{$ESAe2jiz8>9MT6zNg+!5l6&uG;MW%vSkU zO#Gi`w#(mwZkJC$YlqiJc(ubT3SRFRKVPxZ#CSHD(GB=!e`Wsk(@${nX>38LCjb2V zXAAtZ1^(Fr|7?MOw!lAI;GZq<&ldP+3;chh1^T|S3eR1z3a`Sw3->WxKV0lZt1t@g zI=GwQX2abLcOTqFxNUI1fqNP5Fx-c5{cuT_tilwy+u`npTMhRR+%~v>gWCo70$d~9 zyKtxBzJMEmi-l62B)BPXnQ*yqMR51Qt%rLA?k8}+fqNeA5Zp<)vv3#TY^cjvxO6xd zToGIu+(x*E;kLv53hp_$J#fu%@4}sidy47|;g7L!Q{ZO6Erxpl?h&}B;daCAgL@ZF zhwFwLfQtg- zg|To`;by}Xz^#DW2v-Al_1}ZT)fuB-Jd!C0o_T{|uE$*czdLs{|Gom;_R?RMi+_ZU zSw!v|1_y>tVFVnQ5Cm`^3Z%Be;j*NH^(E;GTqg2JTOAWbI)e z91*44;fOP(7cSBQeBma;-3CV%(@Wvj!;x&wui=QobrkM1xVQ*GxB>1?xCh{V3imSH zX*dTy@9l8w;7EAmINT^S@nX22!?nX*2eOq6*9?~eB5@U52V7pXAiM~7BO3H~a5sWR zw+C)PEO3R}j*EF0F4r!?HGoa?UlIi2K|729IY8~e2Uvy=@B@5+U*H2A!v{#g2k_tn zbdSL=KENb=fRp$D&!-5&zh5f|FQf{>NB964*W(=@z!mxcouLmf7a!nNe1Q9NfCE0j z+WCUeh!0SP53m3qz!Uxeg69o1qp+t2`j>)F1ESpkEy6m$2w^E8Mkk;sOaX-PAiyZ0 zPfeUyEp!0>SZD^U7j^?`!sCF!;6s4;#();V1sEZu0$K$LP!!HQ3}`tF7-@MPFe>5+ z!03odKq+DsU`#|VU~I$`f>s+~oVBYuaiY!o4q&`>4`2emj`=6zyV4)^1$qoSieM3{ zL+{me?aY5s_}26n9r}$8{l?&z9x0sS4u*#k#)W>vCCB5P;>Y5bg2LhGCIUIa1Kotf zD4qrXQ9_Vs5sFXl$02{}^OQyly%SZE!o$B${pq=Wyn4Rbv6}aP5dJlPWZ??s<-$cJ zO1K4H>_`5lAN#|X=7Ves9`e_P=Phts;n20Yo-`II&DCL4?{F9%&A>71~y$Md!;LB5BklJK7k5821<`|;Z_n>=a0d+oMIrek!@5uSbz zJ>7F#?0b_KWlzmbIY@uYTL%yR6%KKlktPpwU>=2M390gY!kPXe(E3rh71J+dWQ86M?jdVo)A*v{P zxYQv9VqS|q92c}LNO;-4U|95svx!lo7msPb=GpNtOdL76Wy%Lrm)(5ltuHzMBPTa+ z%UwSx{`RUv_unTIrJw%Jm48(C*S^!Yulg&E!2*W43^N%{VVKO&#<2Z)ig}RXK8BAo zT+MJALy_S-f1#MqF#PZ5zm4P9FdSNnS^7ilzt+r?VFANw43il4{|A-Z!EhhLT@1G| zT*q)R!)!pzISg$KyZ;CIv@_ht@HvK$GpuB|7Ldm50{jZXRE9Q&XLgg%L59yU+{SP% z!vzedFccYf{F&mv%J2z>GQ$FfQyEGOPydNxHZa@;Xc4wEe2C#HhItIr8746l80vqd z_=g$pVfZw|I)>{QE@kLqIEA5^zk{F6{QI7xe9Zhi_}R?AnV-%4ck{EE{}cRd=I`NW zGyipX7KBv{3mCc>rZY@o=wK)??D_-6?_k&fXc3-fxSe4Q!_^G)7*1g*F+BZyir>ue zIfmO9u47ohFr8r{!@l29{C0*744+|G$8asfJcj8ElNk2zqEsCW8yG&ru#RCl!vze} z89Eqt{gzT4X81hACm2>TT*WY#VJbtB;pu;;R1FMwG2F&*EyD#2r!urLJo7BYZ)W%$ z!|e=ZhD#Y{GfZaK{|v=%XSj#q6AUXEE@zm{Fo|LRPKw{buz}$-3~Ly!W|+rtDnkdu z?%z1T}7_MfR%P^Ip$WVWpQXOQto8jXO zA7Z$aVJ5>QhTXrW`0WfE7(UI=!*CTt7sC{W{lB949Srv|+{JJk!*vV`7^X9HFg){1 z#){!?hT9pgW4M4}I>SVU-A_^cR)%{RKEbe(;VOo?45u)(G3j2Unzb&!v==WFsxy?nqe-(6ovxB(?6$F`xrjM(8F*w!#svl z7}^+~`5DDO$Z$8q#~D7va5+O4!&HV6!_$v*Du&N9e1c&m!{rQJ3{x434E3LKDu&N7 z+{SP%!vcoW7$!07{|UwKVA#O$X@(w#%Ngb}oWf9IsQ(M4YG$~LVI9NO4D%RHW$0ko zy`AE>GTg)P35E|bT+DD9pjAj@*!>tizr*l(hL1Cp87^ixjbS1~+IMt4O6x5B_3(c8 zsZU2tJPbeD%aS2*3-(j#`iP0ou%87!BF>phga-K4z>oI8W?D(0wCmtUduY<|Y{B+- zJK`;eADvtAXR!z_j#mIb9HsC#n#*lPygc}&kQa8bwD(@!Ibvca{9Npp!hY@WOM#!c zZK7Bf4$Uu|Ei8b0u&hjY@B#MXy*}YbWm8!xa4t9xoS7_dHjaW(^z0CQ@m#N;&Nr~`uhv-rStS1_dYOp&3*azuFqMw zKL6g$cPJ0sp{&hOzFW9v-Cf_27e2T#cg=SwpT+kOq`xlgjfI9SmVzAodV;}uIrBFZ ztbg!3Yc_0naQ)mh_sYupH3jR}Y*_OET|Ha;Wz(-Z3|HEfOsDdCxK~Zmn zK#k*WE!ewacUcSeu2|?K^M0RG z?mhR;oxuM7zxVV0KcANi-<-MUdCqgrc}~5jW@{GIkDeA7kWmQG?_Xg44hWXbg{P-Y ze5NJi=8b({o;i!?;E+96k&296wO;UEHA}jYbn!+mR>iRL9*DMu;(=Db;g3ecQ3LU* ztf{XTZ++E+CttXLBA0X8-Y+D9`FVOC;5#Q zzc<3gFyfm`e4%jM@Q1=}OIwUs#M|UIn&EFSydt1E^u`0>kmYVtN_VliuM>9@$z23$ zH-kG2Lvc0FhF__(HzKLibiL#@cWkcY5l z^Z2;(dZSC*h%u)0o1IH~Y7U0sU1+Hh2?s)Po(*8*^ZSH8s{&2Ya4g&$Hx>k9lvE{S z#u#-nb5;hHM7_~flzV$2Q!48+%Ci~0dZCn2q^2VKvhm}`v*{|9Aun=vTWDD*ydpGH zd}EKhaX>~6Fxwxm^v2>v$PUZ>wc$uxgfZBO_l1FwFT8?Pq3C*-`isLWi&$ICAI-}h z?+XSoRyS;3bx}2$71ibNlgv_X)^q#DRUy{6DhJ4B%~2#LXw9u*9}L#mvMLfr1<=^! zT@u54&?o31Hxs>CSTm?A9L0N+KL8&wZsrZKrf`hK0wESVG0LkDq;80YAIKygFENlw zOn6}3LME)a32SZ!!%K6hzJbXih^GjF(9Z?0;V=e(>WE!r0_ScMEfC2%fkt39VH}xu zLdd5Z+M#1V!6=*Rf>_Izh=n^s7aCEGvPAm_s0BHZK$OgdqZ*7qqb3e7>6$jhGYIY z-jFZoXa2N$f4potZ;A_934DkP=V-hCl2#w|`y=ce;t{^rMg!q!AijznDS1^WbL2Z0 z1-BzSs6(p4zP6zB33l75UMXpdM&X<64^;TrQN&rlDi-&*mIk7TNjSQyh@DEdqV|bt z)@-;Xw>%K^SEF8oW^YP)=4Rk z`cG{0hniNgHj=ZzAB~}9EJIzl#Z%K3kF>>0{Y%i{iASMF_%>Ji){Fos%O+OZ76}HL zpgyVD9a?OambPhjQUmM)&+K4$i8ok@b`5)F#0FL6@K_BEDiqFNUb;C0`74#GC4qLt(g zE#`SVCaoc?9I&T6l_gc)h{_Udz5b5bk_l;b@!3PhA$&%;#ehdRTn*tPskls?>o zleR$g(s+=s<}{HX{-r45mEFu~b$;=BDl0?ZOy#Q^(i&vf2Ayr*`DUz@(oAF*UL4Sa z;JS4iVifTaw8}8Ad3b6`mzCtQAsmsf z>`9N_ORJ+0QT9id`|$Mx}bKh#e@yv>+TrPlD#)5o%-z^&S;6U}Fyz z&6ZQjSA@`zijszP2*Sp$mfNH)4=TG(zKKZRCEuJXzC+rJq_|VQ)yGl2u!R-XRaN4n zLUxqDy6$YOKfoMy-*i4KGS@>bFJ|A+pZ=pe)=u%!271>U_Ooa7a{j~m?Ig>ZUyi~lKl>2_h-QFa%_2e54MzO1OB5d;N%F*TH+nwcbgZ1cQbxhf`+=X_8ahi z3G-XH{}1pHbb*s8YCphl>^Sdt8Gc_1cL@Im{9e5Y@frlbKL-61$odrV!y#4|HeNw*kbftaDO`6d=%^q z__ZI>2Jv7272-?rp8~!84SwAR`iBVHK^SYk4R&|H{Vi~NE9Czb_OQ!-3)lcY&=zA+ zhXHq+L0f$n?7_SEX83(4e!mTQw<9iB;`ddszYe@OigpvQ_(qu593Kxfr}>0%rkhfHRQJkHb70bfopVwUF~O+~-5? z`S7y{2ty{``yriH&jk(j>n7+9l^SEm!~J}iufc2p>flEsOtdw#=0OjBnDwAvi1-5i zPC~d|#qZPcdj+r(GS7v%3jSPy@ZSS}4?rHzUoL+({?#Dfi0Arh(6P3JA)eV~aK8ZN9E8D#c)@#lG z@rpyA=fG_nXb(f~Barb1cpre<2SI-n{7=D;C&6<+WM;$N1lW%U#sMQ>kMm8}9fG+0 z41aUrKf*KXMEt%NZo%Jg7;n1^NM}a?Gk{}&<-ldYgTPzBFF;>h zh&~#a4%7mE;56V0;9lSv;630wfI)YIfYCq+5C{GY+zLDZyaoIS^uj`~(ZC#_5jX|7 z1h@rw1lR;5fDs3!vm=2v;3D7_;341z-~-@WU>7hL=aJ+CRX{87XW$0lU%*?yW}wTE zbT$MS1Iz%bfyKbdz&XIRz&*e#z$Rb|(C^@MHXJAbjscbdX8>0N4*<^r?*rch9l+2- zu-*`;1da#dz}djfz(0XEfp3AGz(GUPSvD{mSPU!&E&$d6e+OOw{sU|V(hfyF0J4EH z;AkKUoD19tJPN!Cd;x3+1{{{oMgfIDBXA0EHSjR70r&~n?{K66a3l}}E&%QZo&ml9 zx)|x~P#_z=zI19KHcp3N}*aaLqBArbG76WGi*8z_K8-O2y?jxZmpcq&ToC;hEJOI1}{0Q{S zN@v4>X}}`jMBrlJe&AK$d!XAWOMobF3-B25 zHt;pD8|XI%ege6`9H0@10_Ol%1NQ(g0G|QB1AS4KjR2+t^MC+w8gMP}SKtZYb>K5# zBI>e}fk%O@Kq2a|lYwi1hk+re%ccU;Szpgs&p6L`&je4lCl@QO@;wthlRX8Vsh(+` z8J?M*S)Ni)nWx-S;W^Sn({^dB3rlBRSvTff>(v*tcn4r*>;TLk4noiTAoRwEU`6a9 zSow7*R>L0743>d!%3*9c%VZLaYFb z&Ze?ySQ$H$6|z}a9b1gXw3L;xayFaI!RoOi*<4nMZ=q^dgZaXFST9@88u0zJ0IOyf zv7^}0=wuwrjzc%2kuAnLvn8yF`S9h^jFq%4EP(s0mtlUe6*Gll7GWo{D2rijZ5vjj zt-u=PRqQ0JvOR^JiuHS^v(;=3)~KDq&SYm{?eaP7Ty`GT-k#4cKqGh|)~;R5F2Oq7 z%P^vI1=clR$*y8ovun_)x(;JLH?SMoI(8Ggncc!}Ww+s5;|_Kw?!vi?{S9A-_h8NL zee8aGMgAR)?St$gtcQLC-;j^u`}AMzarOk(#688<<2&&gblRU|&$AcUi&!uHGJA!+ zimub^>__$!x@^C&&Fok98~dI8!M0#FdK*SDcVHd%F18zM@j6%niSO~GdAfMg zJzYKBJl#D#JUuA)cY0Lp_Ii z4)++I49^jsVV>chOwS0u4$uq?>-Bai(@)UbYJhMG>Jgu>q{9JD= zs;F$tD{b_)#lwwl5zKD+8zbQuW*ftySp`gyF;t78Rz9~iE7!6%IddkNtdVGVIR?I> zjovthIhSAnc~(xYNsWfXt&MSvvdqdi?PA_m3_iQ_OB$vCA;$7VTKfVqOvqq5SocEG z{21NAV0L5BzuX^8_ATfSEseLh*oVWB#wHr!O{RsHV34hi&vv>Ho0>4PL~2Wl87A#9 z43TUf33^v8@ir}Mj6&_nWW+7r7E88Y&cDTV`-tDW3>tUnHFa{*%v&SPWNJwaErpvf zAaAOxXJw1rRaH@1(b&Q#DB#fBbYdGO29)OP zL_XhPBcVhrs;Zckt7KIzYV zM4|VG{81GXlMv?9S4q~YLb4MOZKQ?WE)c>DjonHHUl!>mMZAIuAU}?ehQKT^ugdAtaoNQ?pBih&!Sc;+;M**bbBU=JmjpfK+!b)W@ zr5#?O2oGgof@lI7ZRtSOnFz0x&Mm0DFl!CoK1ziw;j>m|fus3b6)gJQDCAhoN zBm0dqc2U1?NjQwu;C)_)rJq*DsO+OS13sq>hGiR$IAxIFWv-U8UX|ZyN(SdQzhRWEy$2liFQqPB zl*)Bk4L&+h15rm&WmA)0R#V&=vAi>4Ct@o~iWXi77k>yX8(dvZcHt>lVualKkux7P>Ha@>97~xIW1MYElZcJ zsTKKJeFWM`)O|8*Zb`zjS*(M{vJHGn+vQ>TsbgqCI??M+Rp&`k#B0_k$_DjA(x8E& zsgWDI$Byb(GTRHiv`iWqkoNWxiv{;Sm7u6n=sT}fEbKMwVa^g;74xq&NiyZlM0L@J z>X*1`L=nx((A1TpIHIJiu^=!KHWNeHCP!6KoRN(#H^2AYKWnLGMdjr-N+wBGm}Ld2 z?A2(Q)(N$u#id$9W~KtUy-XR~(3q4eNy)=wcDj9t%vCx%N#^*E-LXErVW;qPUBWw% zj;P3RX$kM@sXor;&R~wUxs%0sn=8#e=H|{~eGj;Y-`shP?=7kYY?+q!ET{niG5Vu%t0t0Io&g7tg&*3W# zzB_ubA_cWfsH$>7&@-T!wFODP+96>uoHrE_aP4jAKvsv#HJU_CQ!lVQ^+)KKtef#vc&w4*ty8vI&IZw zDaskSG|Bi9K}B!QdD>`tHY0*L-e74ZV^!V01Ea_xL^%W*Beq+Bd=D;}J z8^f|v;tQ;VSyi#9td0-1s^1vlU+S0k&9pB>{*KA!M)9eT;2mM+tMavgaQ{sgjPW>X z?>sKrdqa!gAUUO#l|~?jz1>Y=>||?-2Up=Yyu$RL55Ejd0vcjZM$8cT*D$-ISc1y_ zCvtQFRj8U`hS-Q?*dMlY4-dR&mrop+aWOD<`@oC~V4e${37jJB$bKb$6ODcoe*_@Y z2}KWTH2UoW7E91O{dT$~KXkb9kQ?Gz1k?ibuK4EQ_bh8~DEMI)I6 zCPy#L<(GRffuF6e<;78yL;ea4S_&yuQnsG#*6AT!@tjIg=`?D;m`Ak|H9^ zZsipJbvf-jxz+E7Ccnxi*2$-iE|Gy z*%8DweMY7@;DGpK&CEH*{qH_~dWi~>&l($ISE$iOrxzHprf47%He6pS_aj3ujh zjlN*g`0OQpdeu|IWl&FiDx!pw8vb{mKE1^G4lBmQsXao-_^x7>4c$_r0m1_B)mS)3 zIxj{h;HO0RqejFViy_Q7R>UQObaV(BoxI!_H8FhgiE0gHGH^Q@c~bA#g(cD@du8S# z1dY;#ri{^$g`4=CaaLw9Akt9L%<1GTI0`P}M4q0!$E4=t;m$V}u-sbn=fZd8h7U?* zWyXk;?D%{=ITud3o!NQf-$<6nN(Q%Xq+Xcxx6Sg``YaWnt2&3>z4@i9vvB_{8S*pP z#vyghKS)IYGlL=kTt2tAz73V`1x5UngI@>cTdC`*Wxufi^uG9}S@*`TFIa(qjsf>{_S zEG7^7#)?q}Na$Q6UzR^Ty1>NyDjJ|^*K{Mr z3VvQbg$u!;)g4q0lS$m2n7~h_lHROUY?ef)KK1bzGhkYMsimtJHE}RG<#|JP1_#|5 zHL|lgb!H8KT6`)?2wt(~8_hS?X$T&(-jI5?&D3Ztx_doNN$yo#h`{3^{B*{_a%bfY zF-S$8E*hKJEdE=3LXM3GZ1msa(eklvCPm8B+a;CXllizf9(J58m13!s&=%f*C-Z6P za&jSDK9)x>8bPczM{w%qO+idM_U#sLt*tN zh>hgw%L(-e5zS={zs|zUzA37Ah~x6?Zjw6{B-d^6wdQG~0>_*DG&Fq(>G>=6$~GMTJ(Qig5C_B-tr<%k!ZMKc5bh0n~CK_n+!V z#i!T2dgY_O8FXG}jjJjulUJ@rO==Bf-dBEVVN-d-H9T7WGU?7R*m&Z!G}*a9gOq?e zUDVVR|5Q9GEUNse;PPo&EhR{Xa|1xKrbV1>TOceZ9%_*mQfKzs&@8?BHs%=2WR_`b@|y{vR+c3@u*tWruG<5zeXU&*vrR5Odh}&+ zPG+H7EuSaXxb}8dC3Z3&*RaiRbD^QrSCQs4Q>9i_2@a7-g$%J=PUZ_Kz+QK_t?afK ztwKlgTqn&eW-XtkTInU3MZKQ%SCxt6Wnj8HD}E{Vzv#>|Z`XKjKCDip9tDEla}! z%&atfMUDy&gOUQ}|ORkGHe@B4wLmn9~CxVTy#y7^OkhGKKPPtji~!A zzU3^UPScx9XWCNxtJ77cBKPKUc3R}l$BTq=xQ5gp!-}Wmm$OaQ7@4paos(FWO}B+7Ta4Cp;tk3q>6|RPj40Opf-eK z`Q^-=x=bEUwGn~}qp3Khe<7RqerOwlj1aLU>C>4)oyf923xkW`XS0GOlaE)4`Q7KmV138i_Y@L*+#gF*G} zl4bBfaQA{{x+Q{BuFLp_nLxUXWIijdLPr>g#xRUqpG=D@=i!U*WOS&AsSM!=n^PXo zU}hXd+>$b=Lx#P&G9`$7EW>T*5z%t$N&6(Tm2H<=RMls4!N2sx(JK=|G{5-y0DH)E zj<_ZFh%8mg{K;1*CG%;0Q!Q<*g5@?QBlKw z+VTR?crBxim_nR6kVyJ4c~E0wd%Mh4A^?g}@#!_Bv+u#fA(k2m8ICZLo~+0x*F4G( z`j)rziLlsmjYBrM(K48(J;7+EyXp&TOUSecoBd()Q^1{Xku&ach-#1AW;n!Hi95fZ zw?v+C=hH%A%I%C_lWVmr?xH0tF9U)%iH|Fm{59!fi(XRN3%WIwO%BN&|C|*E7|0}` z{H-OOrexx`Zzk7L&7lW&J%4Zsnl@v)nVx5A4b$voVR+i=Zu*q`flq5+a zPrCZ*q7U#nB|5mUj)Iu>kWX~~QYL`ZjX9odc`iqaRf!RCP~*v|*eH!ezux3fNhIqDC5kYS9!y7~Ct$1Sc$jQFC_xxh(JRAb9{I&9xXkemyI=Mx zK#kQbGgi37AxqL%t*@bnUF)(7VV&`b&j9HuDz+41)HbUL&zn_wvBxE>_N-}KZu+JD ze3E4>^(IAcAz6R6&3j2Q&2d*KNZ(T}7_Bm`>CZacikNsSWtJ;hUTksT9271~h81>a zV`%3~3cHJ}q)#WF=9XVp{!#k2Xi53TMZT3^lHJSBmQ;g1?DjmQ+}hLH+<0jwB+nGG zF0jJs;L{3>mfqI)k(C$CIvKK(=qgNdKEm=&eEgb;E8}JEFICB|`E8@=b0H*D+wiEI z+RCMauAFlo)y}BHoRk3a+iYi?M5#aJR-E;rT#CGEx^)n>IGNwmT%FqFzQ&_AV3Kfi z0RVoO`ADX>;*%RSZR}27ZFjJZ&y=sy4Z5|5(NUNvoZwM@3t{d&Nq$;vsrn2sazz z3mdBzt+lU|Q)p*_pRZ-K>}i1C&7KeL)51t{V`QOtF2nt1!C)aRjn(9e*$O3r4$=b| z>th$-v}wARDsGTjS5c1Btns9!ck9us_x}C*4?J-2!9x!-ju<{7YxGzwg3X^)Fm?LO zS;eL0bB?U6uB~fWu;}Pxk6*mR*W7YK5EmoFm#;kOl-2*Ik2V)yrcSadLa;P@bzulA zt*@D1T`Cs**5m#Ty7DHTHOgqlxp!DIifi8F*O4KXfskH=W4=tbn4eCx2Y$#c!B`wE zoyAExm2^I%>4M}Xg$vZCHjK)*8luk>mB9hC8?OlKc%5d9o zje+76ZVUSOjcOSEka5KVT5&L@jV|*-4Ck?hd^iV4GJ}WqXXswgeh*Z^QtlEzE})~! z+9=AluzG`(KWQ_Fy7W)*SYhHlKqJg=6teu2<$y2il$zp;crACT7ixFP)6fi;$up<4 zu5mst_Au~4f}f5nAkv@-&zPn| zVw7nwzoq0n4+smz?JLOMv=%&WcqwYK;=(>a+Ae^4jo;=cDm@YpcNHO=PZ&Ufk7B!1 z47c1Z6~6OMG3eu4BYDED84M9dUUOOz;B^B^Iq{BPP*cK91cA&7TA6G4%J&A;(HJ7O z>iG;g(+yk8PDXDZ2$J(Gx z#}sbbVj9BlTtzW4Duf z5bjJda-SR@bEoc$^~oyYB@}9YZp~H~RF%?=6lQspL*jaM3|)w_#n%&I z+(WG78PCcVRAXli@^5inHJJ?+RmEghhYdFeF*L>e>RZ|?s5&_=@s&5j%4*lD8W4^c zn(IIl9qlZ8PrL@4L$zQ1QPmA|oV68&=D&S#s5wqGXRA@q%*W4JjOC%`xN9_Hmk!6f z!PtpI8M}H2_8uJsoVs=cdgFc$;O6~sr44Ww za>NYa!=8+t3=9X}>A~2!Kruj)B+0#5*U0G9%%0s&wFPzvM%ILe>lY6^y<+}Y+XxEBO?8+aCY z2)Glt7Pt^t1GE7F;CP@Om;=lJ@_6E$2V4PM1e^=31x^8$0}5x^0^ zp}-JeAkYu!4fFug0UT$~b|d+>1AhRUfggeIfUkhhfKPypzz4v)zy{!T;1%FS;8|cj z@C5J}@CfiA@OR)o;BMfr!0o`Tz)ipnz;(dYz?Hz|z@@-Nz@LFX0p|i|17`qhfYX6f zfs=rhz;YlCM1cqp0)oH^Knu_e_<$wAV&Hh-Sm0=25wH-L57YzmfLfp$s08S&{|aC> zP!5y=#Xu2I2+Rbg1Ji&hKmjlbmUA1;zlQfGl7nkO>S2h5;FX0UQn- z1`GvoZ4K@tMA`v^0bFIn%@XSc^aOBC7V8dl z18|)WO9#3DX@CcyvQPIJ&|L<-7z!*)B-#_Z6FU;y6I&Bo5=89^YERJmu)dtS3)F3( z{hs*Mr1xUI+5V^u$TiWoCjLnLme|bc-5{G>_ru)?MBfS74PBqFx>4x zbdvr9WPhIc1oZCE%mHvclx5(~hYslG4}|Tz#FvRr6B{|b4}2%r!*Lq~(SL{UL-V4$PBV;3RheST;TOs{hgluEtoy2RLPSTHn z>>O6W=_LIV$bK{NQUW*rAnb?2^?2MjQOI^9bU!4%fa|vtFDIS`y$>{VI9%uA9*R=X ze}`s1gX=dE&nF&FbVcZf;6{t_kX?+MD0U%q-y}YU>z5KwCLRR6AM`c?u4mxBih9sD zLvI`5`q{)k6Za&#A?}Cc28;s8o`-uXb|UVdCEkPU#}oG@ZUKD&^fn%@kHmcze$an{ z-rk1mhZA=uu1$1D=rR%S65M>@#SYsY2;F}W?hzoah1FjKVD%N8%=oWw^^? zJ9P6w;zhW=J#j_itVB0``*NLi9aP)CVC-Va&gy?yH&S&v zZscgiof+5TUW-4Fs?R0vPF$8aInk7uo9KgEK#Flg$4cCsaS!ga_&xD&=QxD+>Myo0+dHYYYf zZx_LJbz)qiPvQXRW)b4O4)LyWyE|U%xW40H+)T0-w|V@4nyub*j_2#d-=Vi76N3_;b==djs$(eb zD!B+Zd8FaCl{U}4o-Y%BgWd`f9UaeioZnH`aX4-+xgPNz>N&=9jpyH<&k{F7Z^IK` zcHGv{+%dA_2;5_G4{q(4;yKOpoTq2nCyA?}xBU|@cC77~-m$HH1a35W3N_+Up4&XX zd1j_9JDzDDjhjv0#vR5dd*1X6OIwlleqwE6d}3qASsghYAGe>^ zJ{~ume8WmSH+kAUN2fiU_I6@9^!7wYV@H>c+uM(9&%+%j3Fh~_>d8sFGOa!B^~BPI zCvk1Z#Ev)H1MOYf3vkQHV9&Xp9iBkiztbwZyp&i3y{+u%-f?C7$o5Be&%iAw`JVec zW72Lds3VcM5z z=XM#F{#N?EiCzhR$J6aY+gI*>XV-*XN2B$4&a*0Qe3vh}T$Ntc_4dTC(AzofZ|^>I zcgwDS>}+DAJ->SXnRa@Y^7KAk-|c#R;{A@k9dp{(?0#(5?>ootY-Mwxw~n-bcX=@V zqOK=&yDaff=q;^%)b-+9=MkGEaF z^?vktPVDkldS187y8qFmp;v8UbNfZRC+vECN9*?9+wR`-3@cB2rAu|!x4SLqv9agz z`^`)|);?+X-*=ARao4sHTW|j3J$8E9==68HuI@g%=X#25rv3e0V|T9J{{Gf6 zTh{#kJ?`+mBK?GJvw95b^}~Ma`y7}kYG1bNFFV$6`(ewVKW6=w=IPdDzpj0|59~R3 zzeD?E^zG=_xqHjbU$_6b_1izb`0dlpLp=>$F6jDP_uW17dk6QwwcnQ=ckhnxoW4DM z>ubMX{_C;76nO6JGNjviJ$Ch4*5{+XmHl7pShV|_9V@nV-Ezfm!#6+p(?Ulk#N?+1_L9ZkG%?u>!~P#1aOj|82YWk?*!B6gTmD$`>#(1{`2N;! zUiKW@^_L!Ndk^Y&=YVMky>am5j$3yguhC}N>cG$De{_A?husJE zsp)_IK`#tVJ7UJjruMAuKmPW>Pi@~${i5UJXFuGOc2ke0{f7_yddMAz2Qo*GG1?oq zUH|JxKOFq^QJb#Z`2M@2yPV$h-M*s^JZJeq*rstov`@$_({=Dv+zi#^bzyJ02bFaSJ<<$K~40!Y4RYx2# z`qiBHl(Ddt z58QaiTT@l?H^wJ=M!iDE3{x+uDn*JXiHh#?6lRqlSt3B`7_ja8AQ`Tp1zkAY4!ykYB zz7@B;-0hfwKWD6-FmT50M^0Jvs(MEw{l^c-@?=yB5uE9V{86ly#Dob6k``SSg@pI`sry|-L<>7UlD{H5m` zhu)j>=d#wLDqF{{+3$)2w&s3b_eSio%Wi-0(sxhWa>CEOUNLT;w6?Nw$+VRRUHJPg z{kKf|^yrsQ`^Qb!KYz}5C-ynEYwv!;hfW{akRL2ObMAEu9^Cc&=Kp;8?7#o^+GS6l z{7}Pe?ri+5_~pz*-;N0#HSOV!i`wsNe{=UQp3P|+((dna zaayEHZI|qHeBFxa0p0A^Khh|Nb*&h$chbVIZ9-359=0H3kAF9kjcxcW=nFrzl z`EX?(gombNlsOm=$QjBUf`?{olzA{7kcTPr5Ii)Yqs*arK+aU=p?GM%N12D=0ePe{ z5645(LCQ4nfILc>8F*;6NSR0A0eOrvhvA{gBxMfA1M)a!X5yi_CS{Jm1M&oAj>JP# zQOeB119FZsN8zEFDrJtw19F}+$KaufEM<UMz9*~Qa zIRy{R&?$2&9*|3vISmg@;3;!D9+1nFIRg*P?FxKwhZK8ay=ZsmxkDATLtpJUk#TQf3_g1B527}DLWNjg}-5;!GyYL&j+u1~VHWOkT?=B5O`Nyad<5hYYV;PbUU?X>9vg zJR}PX1r2$4B4)Ki{2sd)_qUnL9ESnr@Dki^wu)PNaY7V7q>g0ZC(U~qv`@gAeZ?4c zbQJ{(Q|4HP!jGAvReicobUO?}g){MkhL{7B^1zrZ(u$8cUzijlNXHa%k$y&IiC7w6 zB~IZK;hilH;-s)!XJ`tVcrVACws^0^Oe`D=3-HrBf5Gn(x(@_wN(W@hu&eX3Xd+h} zsby*yk+kAMbgmRNAIO&^SY!2a-2oj_AEhZ|_#j90Y0ES66J}#Nkq5uTNlxUhKHMB% z;f?xnVwHJ~7{&yJYPi%B?LMwF*rDc^xN7>^*wDLMJEd-J+?zKhLqz?1Z<5yeJP%_7)*xl*jCl=iu z!dO;4zo?<2M#$D_)iu>+nn;_wis}VLl@&aBIE!*uUsuvtQj(Knx|3-x?X%tOC!5yr zgy$d0?`qHEx^PZeStZCCKk}O^f7xs+I6D8_vZJc!R~2I!f?W>mYpRi7Yf35_j?&~K zZCvHs^rZ3IbcAvKrdIflvGdrmnX&Phb(g<=^0!gXH<$48SZZFuheK;oGvWdewl z-BqYfFgAq4 zMyofpicYt~K6-;6>x~5y8gs-Oh|;O1rU#~*6ykMelQ)LrZi2Yn)gNx-Z4^!_)kLCh zC2z1yfM#>4x$=)g8t{VvY;vhgwZ)*Y7+{K}~U>J?1MrPE=$krATXaSLok_^Cn+>43*Fo-BmQl1ScTvZLx zWt5&3)#Wv0meRTr944#Q4ypY-lpPffS~4oCiV%5mizU%&aP%&%@d#UK3BTwF;{Y^H zE_mO-#+OV*c|q>VM5!qE26}bDA?VS!Oflt8ktM*->Yt8doyVZ(3)M z|8DCE70t08(R8D&Z8YuFnn>l=T(PCr^TV$sceEG+_R6hX%PC|!Xy(2E@Y`hLov)E- z6zfiv|5V16m9i6jYHh2f1J0{ibAImGA`q;Wq|Ad=8+!O$X$YsZx7IOh>7Z!* za^z%tv1U5i-nQOa#Z$@>>$H>IhytVRrJj}lv{jccy6J@8gib48zoezDbZ-x*U3PL< z?R0y1?KH8{ll-IebWB|$kYtC|7`CgY%&^<`WXOEQ&x^Ap2>0%HY$-XaM{Iel4pLHcA)Vpn6zs(P^CDYtL;6}6dA4q+g z+G$LdYtig7HTxuaG7i`dA=ALNX9Z0HY9ysA5nj6;*kwFzOQ#%ek~hrpHdij;8LyV# zA&%m^PJKI|ey0P_@d$qLZZ`0+SNqOH*vw^G%3jnfB81A0*D2D9pG%HPD~|Ka%|%|c z9}cn6tvH_$Ccf7wOvJ~9Nh^9+`3vjSto7I6wfbKME5cV_#2ZCzPn#ssT|gp`yoGdK zwjp~vcrOjas9-XA%r3rPysSZVG31xau*^2_)q3MiEr!iX@imyAPepKTWWn3Gf$cM_ zu4PrcrPZkS;|L9maI23j!G#ZLW3GRdF^scH`A#NNRHuIBj4Pl|E0#4sgpXmLF>ajd zC5igT7+zjZ44u%+_CPP)1HEJq^x{3xi}paDvIja>Kqv8=ya)G_IK37r7eJ?LSpF!Z zVL_2mR=vQG->8QCNX>HN;WQ(Ur$K6Z?jGp0Cv>53Qdnp1UFr1cX4IEeqb^Qz z>z>Btdyx+WPwIT2)7|ocPIt=(g6^IVG+I(V&}d2dK%*t)1C5rH4>X!<8Vh=9SuNIa zat4Q<1wC~-Xzr8JsNAsfk2C!wjpv;SrTF|!@|Qy6o^Q(yjDyrv7h$=ri=QR)8!&Kf z(9la#8Lb^hU;b4!r6N<={1h~u ztxRgur|G`DqS~29O+Q({Gii?dwV&NbS)<*g^i0% z$_JuuP1&d6as^N7e4x|a@_|lw%Ljt)o)0uyQa;dVN%=sdCFKK+mXr@Pnrj*hx@%je z=_++PXzpFo!pc9+wC|)Xlm1%OM6z4gwoJN9*_MHxvMn=dF7>KObF^i!cWui!{~p>h zlSkx2TU+L!A&1%WzTO7f+A`CfOIv2A+1oNZ&EA&TX-Q?Y)3(fXtK}ZoxVY<_>im># z8DtaPwJno0*S1X1I&aIQ`;={&PPa0tEsf0f%Gs9bZr$3l+`VYaG#=MFEQ#)@!;2;Wsrq^Lknp<1ul5W*SjE8qGD01>LnR({zT-!21>%1+K?o+m9I^D{owlqrFmg#QY+OnLzXv;Jn z*E%eT?x@3(=#Dx}qbJp2PMThaIca(w=A`L$n3Ja0VNRM`Tju0()^n0>)kTiBOsBiG zWjb9b++GfJx?5W&=~^kU@`|K!v3l9y_M&c0*_LTMsq=x5A?R-TK&QLq13`Ds2O2FY zA853se4x>i@_|N6$_E%7yp46;+UWs>IFmI+$tZJBhRvMtl;RwlKjU&^*jcWbp} zlvyzF&Bq&Sv0|~JsM4sKj{$8w_3G>%nxQr4#Ed*+gh9i|spvVN^STR}p}4Nhs4l|t z&m80z{e24D>+c1Q_sNd;Nsjl4j&}->E|2n={!RhX-zh(d`Cu`dEM|Pg9Bi^ZpL%rR z=TnX@_7iC;(#1YMg?(NM``i@vIov)=9gH%{$f{{>#_YH;JR7sba_&1RVy^s{6?Wkl zbFFUjF$?U%FXmp|_%ZA2!p{}t8XoxU!p{}w$`45{{9K`~{Ghn-b49!IL)9+)JOQd2 z#^GM%%92u?)WugI7+Fm%Sg+882< zbf~gZI@DNIRNsIZs|7Wc^Q)+G=W9z#<`h*|W05s)K#V%durBsI1G?DrOy^?HGn$J% z&s;9{JVUwI^GxJo&ohpTJ* zoA=9T#NFVj#~6BnM*WSe^>>Hxuo?uiK)s~FQF>0e>+;!X9>W_|$8FlI|dt-K6z~?vPoH;&s zkzxJG${e59hIjdgpSEkQ{l^-`fZT{6mQ9O&2E)lc&JHv82#5^|{76hm!>t#bH%9$` zb<|vR9M%Fi1#t8mj(v-J#|dYAaWn1S<69xHOTmZuXSSh=SP}~dp}$cE(hhWWR}dHj zOP4~e4ko;EKEBw~po<)h3Gm1p!x5s`e1KKkaAT9o*fK1^jG>0Ybo8n4(NKms@*Xs)ajN-;bMsg5(SEux?Z9ZOpTP6|iEUVH z=#P%WRtG=H3$`(=?Ivw;HIQu1hhAYQOhpHY z7mML86|tj8<}Aowg@Za<4eQWF$u?H6%EIG@AMy&Fs?Q$AMw6V0R8#zGaNQe-5g>Th~Vf&?brNI|TPZfu!3T7@e62>mu zRyw;j93pqE;Se@fiFaHBM)iOUZj6OnLjgr2UhTaZ+iDnX$))T|Wt`q|k0=(;%CL&6 zm5H)QoK_sD&ZY8f<||R;Ee08X*D{~PC1f>W3q#bk%xfM?e`yDbW;@lWE?d+v0mBVN zbERH|{>lF&UM%twmNSeTE2(&V5Djb%Lx$JFD2nY^!yAoyR~zYnB77EcLOn!V-H<)vkV;LX6|UuBDyT^$E?ea{y4Tf(C5dN(y!=CXuI_L^pDkiG zVO90ToGyb)8P}DsGMO)gvxHrFU1X-@b&*RA2TlsbLD*E!p})!ZqJ_-&NQ)OY$AKdf zZ&5`BTP5k3U!1XyRrw(_EjB9Z)s}D+8~<#!xPGfO91Pnnk(W?CinC?qHW4SoQhx|% zjic&ri=x(}Cdk~_IIKVg2y!~(o4l8NllGEtqQ=(}4*HB-vWTI+ZjKufzYoEc@6b}H zjp`yQu8fX~MvWYT1*iM483ei&F0x`cB^`$Vj1n{|H==7IkJ1jJp%04Ol|t(C8B z?s&cAq{)(l#uENx-zaKKS!gWTf=Buu!$|*>6E;-WAK9%u;rLcBg7s>GN<+1V*E74O{tf|rVvo7_(0gyG%2 zh?B{cDx6xJ_Q1Ba3f1|&JUO+tVMVqX4{K`_N@$i0>?R_kI)qH!V(-qDVph_(lA3b=e zUt8KhA1;~W^Mh@?Q%-jL8^RY@9-w5KN*_2rKeo4z<4Qwke;H2mMm?&!-Q+dz%#vI2 zZDVuHyXC@(xOf76#x~TUN)D%!0CGRf{F;f8&!$`+Cf-*Sr^zT{jhu%-3>M+Qf|fSw z58>Nh+=_%_*kMmXGGp^Y=x2qOhHx;xkB$XsqbmiF6wwJj|8nXW(WfZwcM}&3&}XbX z`y6}F!S6FFFeH>!$8RX-im5wNjQM2YM3>e!Br(qiG1ZMOtHTIqR+;!fqc&lxQC35v zN?Aos)4h=c2@QPE5&E}ekbT`eZjTtsRFV-iD9x*oq(P(`#X4t_ z$Ook&wWTF}hJjDZ4w5}ThuA^0=NtKPDKa7G@YSl|v{N;zkzQWyY@8|_k%VI~Y8#3x z@v%g?l%G|=&)<-DDDd1(=U|X-%lQsl8stLaYiD&p2IbQx;T(U_pE0kY2#ZS`M6ZNN;mCqX;YgS7n_dAuXF$f|Fvo^~bW!F~oPqof?c%4*YwQ4w|22yd>6FR}7 zNs!;zI!`wD8Lggrl6fXO#TXcOMdMK|hEh_59P__CJ`4F+f;*FtQxn3tDL(W9aU6|e z4=@6yzZkw^Rz%~+ZTQ$f$sY|fwAGp7<~Fbhp4J#QaZHSO zpL3Eho6zAz#a+=#=Mx1mvOw*rYW?Y?6mcmX1rX;^8Wok5WwWvNrM{%7vZ#(*)z8RW z)MAwIzoqXbXtN3nsqwY`qv_`Tn})jT#`)EAt7{fk6Z~f7;V2HK^D(=8 zor~lcCAfjE0YUar3X&#Fe|X$Dg$EaXUY{}NB>Wvmhh=5Pz)a()q&rfHKWt>lJV8mv zj4a-Io1F`uo@9p+`jF^o3O-u^ZCZ4MT`x&a{g&g@CW8;hBa}QR+v2hiz52?j#(doI z#*bSh&4Gc!7^ktl=5gk@It7Y!KouX2-_ZahPM5%+vHSx_<%zLISfw};9Cv~cn{a?k zK)$10L?h+Hhm$ogfi?vb6vi@DzKZ$qC(jjAkE3z_N5YPYebfr9t1)k9d0d*0n=ZK!<{7^g)$5#dEj_zQq z2%!h>xaAOYQs_RSKTHQ)LCbDuj!~yl-X+GbNVMeDc6Q~JDO31egX5%}w_=$r>dq

QQyr^p}NPghN*b@UwO0We2^8d;r3X@<`2mO9}#uLn|lP9ETCy9#9w_^o(AM$Zxf zLDBziDvX3zaEs?oACS@eH}rRZ9gwj)!k7oPn}1CtYU>+x2mkf&+S30s_lw>gm~j+f@}ACTdO!`>U1K|qa=^e+pytcZWfv}Bt(xZR|)e`n&}4(C5R{~Bif^RT`9 zr%PCi+cng`G+gGiH~*A-Ls#7YPk&Q>rVmmwwP$tWbosVAk@)D24<0?M`NRkM%o28q zM4wsPCYAKQYRJ|r+6#r_I)`aC2cPB^hn1s?*L2hEx?%3^|B$BGk*OV+ulW-LyW6{=sGVJ--7Qxm~&wE zggF!@H7?u#7?9Bq=4&tyfO#Fv{xDa<900Qt=3tluVUj05{yre%V3-fWJOt(`FmV+e zYk;{DW+}{7F!N!a1ammd-7qU3M!AGJ5brE!kccl#kFI12h~uHK>nsj3j~nsqd-iEy zZ#6*e!C_#Y1{@7gzP%E72zVFx9iThZ=&m-p`>hpFZl;2E6hJNEUw{XJcYxo3e&Cw` zQ~`A79RA}bDpCF@kD^HO{F)Av%2ZbX*CXP#G2F`r;F?3+yv46S(4gw^n z6)=DZKxID)P*^D*#J?J#Ft3s3T9`yX10edD0Li%o7zNxQ-*19R;k^|g|Ly>Y?-78) z_Xa@p4*;SMhEhlu3<~w^Mr|qWXTiiJXFMEhkZ`1H(whOC4p73t30xzT0qcPmfY*SxfuDijfu1)F z$k-nk4NL{9f#ZSGfHQ#Wft!J6fcJr)fwY?kWE=sE1d4!ipcyy`xD>b@cma47_zL(Q z=yl70jKhFQz>&ZSKo~d=xDdD(cm~)A{0!`WD{6mW9FPmt0nNZ^z@@<7fk%M1fcJr| zK(E^nEkMK7Gr^TMR)?`n#q>Sk02=Lwm_zB>5i(|C={|dGo>StDC>Q`Iyx5PrHe` zn1_NqZ{zVB4c55vgpIk${O^4D$)+8Q<(wu$2KM!of9W|CzmXUD^B3*+pYfY32b2r7 z-xq1WFV=peESdb5YQHbjej{4E9-*>%0Wc64ylp@R!oUW?q;|a@%tK)IfO$Af26F(6 z?OO+AQ2K0!xj)QrVN%iA1e5BY4`EWuZh%Sk+DkAGgZUiH{xH|WG+;gslgjLaFi8h@ z!yE+jR+v)7# z@ARi$KIFoD`hC++uf1`|Gw)Q-GB)4vP-M)V_dI`nVAh7?+B3g8_`;eYKb$e^#J_xS zMalkM|2*ox8)ofzYF+71Yx-ZbX6>W1o|^vN?QbS34qy4qJF~(sY`WmP)i2L}?6NzH z9zSc@{E<`sye+cnl;X!fzVMSB*YEn_w7ce&-1PPGFJAj?)PytFj3~|OchFti@9p=+ z^Uv)p{o#&xf8X}QXGflN#hYdR*IvA2|J(0fH{^?3%KP{a>fN^H?6&1ENe{N){& zO_?_FpMU?UzUq#zj+^oPansJf;nJfM$KAg9CS!fWZ5K@TzSVyI(dU1ddE9wB{4m)%9A+zs({*IpuXWjmAAb4NbCnlf$Lt);G z$BR$;>b=XKdjFfkXWHA}@Sb_Vir4=3W#NR%V?L{T?#auq`1<9-OP{Ns)`p3gC$G7$ z@ROyFT|TAkp2Hq^^YX&s!(RCO@yDj+c+Wqn&^!OAr%!vJ{*?azYApQV=LvuA_T;5! z4cb*&IK1$-@21=~^83^899?+o-8X&txbKwm4Ij^+*>rNZ*M>E$I3sb%ni-euoI2#B zrp%I@^>T$>e-+poS?Omq5aAsL?_lK`;oBW^gQ}a$7 z`u4E@MkMtXxS@Gq#N%=MP_r9?# z^P;2DZ(aY%GpFwQ_JzZ4_~zWB7hW>`soFD+7+gKqzoh+)i|*@o`KbqdIqs7i-+23_ z^p9`({S`O@jZ&05tsq@Qv1_F#2Q51z}Z1c^dc+$A3&T)^rvoW6kJ3h>m1~ z;9CiJS}}Lw1^+69#)~&U_n?jyu~KHR+0xEn4d4w!dW?;QJ^9eYXNEB^#0Ef?^1Bog zVxUo&A_!Xmu0mX9l?+`B?(1RO279cg!tYgZ5r?~0&NmvfL6*D)u#bXn$(aOyv)K~P zyBfbetP(s+5z-)!Q3UeH_ob-02L5{8pV4XPhrZ#hNi0w z@?JjaO!q_C?u}`=9QXffUf7$k?Bm&|fqfd-r-6MM*r$Pg8u-6J1O4z_jXv^z+5NLe zW>;j_WFM2=lpV`HIs5$V%d&6D{#*9HvY*X21vbGfhNzMK2++)s1A z&HXuddu~T=kGwv41M&{d8<96QZ&F@iURmDUy!m;Jc`bRNyjb3#KQACP}&{;2%y{JHt_@{h@H$v-Xs%>0}3@5p~F ze|`SO{4er<%HNW|Ge3ReeiJh%j-Hr3aq`3k6OWzfop|!Z%O^fP@s)`iCjL6{&`AZ8 zW==Y0QfSg;lkT1L;H0-EeK#q6a<9oFCl^jWdh+7Qr%pb9^18|QOn!9otCQcEym9iT z$=^->dGa5V+b4G`=v^?lAg`dLU|zw|1^$9~!Rmrb3a%-*so;TvXA3qIyjSp5!5;-( zrwpDlVM_j#;whC=8m1gQW$~2eDYs2|Y|5Kc*wpN)WmEq%)iZ6tv@z4>O>3HV^0Z5) z-7@WgX^%{MVcPrCKA-m8v@O%pruUpaX!_LYh0`mhA2Ypq`m*U)Pk&(g>(k$z{>k(o zr+1&R|BRtC#?Hu@Q7~iPjK&$^8Sxn>&$xHSkeScTd}-!uGdIk9cjh-Uch4MJII3_$ zVL{={!a0S<7A`4VS{N=|QFuz>n!*bTFE6~U@UFu93Lh+dwD5((e;0mI_%(fO8H`P* zZ>H@1vIk~oWanj1$u7=5KHHzYB6|&T#MRk1XFr+!eD(*~+p`nd2mL?oy=AnPWxMw~ znM~>KW|9&DS9j1QBGN4}mBxuQ(jZ*|N=isK(j5ZQjevx-A_9US0wTP>>xA{Z?|Rn$ zu=f~yf7oL@>kFTrvEaUs`+xlFIF*~p9p%CD7rDDM{4iYDOkNR&BMs`2L%yAF1utPtqT4$}R)=L|pjnux<=4i{cjoNnYymnRl zMSG|{)m~{S^>lhR-P7MUnj5W+4#ps3wDFbkwXw+f);MgOFn%(AG5#=;m}$*SW@*#n zo3CuXZ#FX%%uZ%6v%fjXoNmrHSDFXRqvj3sck`K<*(zYYZE2Qgm9uJCwXLpJA8V*J z&RSuuwRT%Ktq0a~D~nyoF2Oe+*v;(Lb{Bh;J~)Sgx1D>=-%c*Ks4KbEnUD5vH@Cn0wV07Z?oaL`_qm(W z%j}i%RIjnu(i`H9@+Nz;yzSl|@1%FpyX8IhUU_kTabNLmzpP)~uj_aAhxnuX>Hd6w zkAKKN?_cwO^Pl@~1*rllu!FKemEeP*NzgqQ5{wF_1@nUMf`h@i;A-$&@H|Ksre=!l zuxwZ*tP?g4+l5`jiQ%+xQMfwX8XgMIh8IK8N|xwPGCL`y3{rNfkW_-%sUWqI+A%u= z!ISCILh$6c^rLiD`bByqJ(uF-baE+KmCMQ1<$7|0oG5pfr^<8X#quh7k9MWLZylF5%bhl8KR6*CM&a)?aChIq;f&Ir94(*)VI`P%#;PH)KMF& z2_VV{b*wrABw3~I5YzOV`ltFrO$v(S(h6&(wfD3-T1&0H)*Td?pna)r(spYHwBz8& z9qqC9Qp=&|)l2G{9_lsq#`=e#$mjYPeUd&;U#jobkLmaHCwiQb*2r!YHDtqJ*4lt7 z-HidpNMoL{*4Sd~HI5ngj7LmbDl@BD*py7&Y-qML+nS%4L(Ea;WOJ6e-P~iIG%uRB zz?fHNoK@UXEZZt;Rk!L|ovk6(C~LAc%i0dYoU|?qgn4Df*~M+ew(YWZbugy0J%m}C z%(QK{_t+=xi}o%1vHi-9bBa5PV>@M?>P}s!vopjQ9v z;UEa=1dW4)pmQ)bm=w$nmIdoUvEv}vvmiE18D0Cq2kPVWDf(P}wZ2u~rT?No(Erk3>M4v&#yds@qq^~- z(asoQOfY5%B-@Oq6Om3z#bC?B9&#c1^>kNiXF=w;GHkiB36XqrJ8oMhayDLB2 z%du)&4XvKm0BfxE6}xM-wG9OO*?MR_wO(17?Oe>3YS*?K*=_7Z`!go%D|?2$(>`dQ zu+P~y>^scXOFOSq$dSRZN=#M@=Obr?^My0jnf)&$yXQP&&!uv+x`n|q-EHW$blbY0 zxI^4g?qqkCyWQR6o^&s`x7^2WjQ5sT%#%Hfofl14g4fv_%Y4oCmU`>Gz1|7t>#3K- zPvNKc3;88LwhDeLzn$OHALx$;*%mTi$NeAutNt(kBd{%HkU3Dmwkkm_kga{tBls+s z9V`h}2OEPu!J**C;D(s5>|uOZGIYYq;k#_d-r>M-I1@HKToSGgPq7z&2_J-ihcUHc zVwy5zsibUDZYhK*)sh;(l-f)Er4iC1X_d5H`W~KiRk|xZl(NYMn6NT(1#qpd++6M_ z_|gm*(>i%4JMvfg5BZrKqoe}YN-GtV>PlUuxzZ0z`$CzaEKt@dJK;^gDt{=?z_e6q z7PYimL9MRVWy<=gL)0%ov<2!qb*H*l{Z;)#eWu1}skAJhSp}`SR#$7T_0xuEUodA2 zv~}7}Z7*~7hxSa1(NpPJ^wN3-y}DjkZ?5;#hv;AEGxP=eI(;W-_N)Gf{!EWCQW;r{ z(qh)?f@gz_Z;aK(W^nAZamBc4WHa-dMa@!X1+%)@nq4`@{L-9fE;l!t-;Vx@!GmJz`tN+3D<3OjZ>m+5$vbgzN z->m?rYT|yx&K%$lb(gqn+|BMT_Yeqn-%aYJ@(QsxYk2j%)?P=ir#H--=uKgB9%R1G zc{jW}?9FuWD%Y>(*Y=zG9sC|JtHu5rf3v@f&3VSZ?^q+zNsXILmKA65$+ge}4jVV`hVI2y*aIouWQ4^M{|!keLJleeI| z%50^TGQ+q^O1e}L9$pvp8Z3>JCa^c>!?{jN7o z>!ox$^1#ImtGrdk>SXn1zJ^z?(*N@8cQ^VkL0lA&GMeh(z;X%7U;=GjZ_P4;g42wUD;6`eXx zW9Jj6H%Ks;c22<8uR6)y3~qL2teC5~HU5p4ZE^Q8VOK%26kbLzhnF92=6Dso znqDWbt2f9S?S1LZ_f~o9ydS;m-ml&R?>Uo}&sTlNujtqGJNaGxLEzYzFtkClxg77W5CkhNpcSYz_7?Z&!kwLCP=_6Bi$r2(_?g z*g9+E6?skB$RD?^#MFO^No zZsmY-T)818?xm7fEd)bzPc3Jxwjvu3^(KCvPtIFnVt+&_v>m&3<`YL_9{=I%uzpCFw>18tt z7{!b-0?its0|vv(rWkXKWiYev*`2=|&&2M`Z03TSl{VjFd$u$?nBAGU@o=-v=6B{n z_U8rjruh;DkjpA;mA2lq>R2tU4pw*g|9H6BX6rlaAnNY|D&VEqpM~wxOk5qirQN~q zZV$D`!_79^--!)+!M@4NWp;8og`LvQdrVwQr-Reo8S0FOn{9T!a}F|d7o3~UODD6N z%PsDzZf&=b+r~{qEsk=(a%Z?Z-GlB4_ndpfy~Fl=>E;F5WY6^~d3C)H*`6aowrSoR zw&yzUm_WA2-b*hpyE8(!N@#));btTKiT*Tyj=z+dJLcc;@A$9SoW)QDfzSjkf(}7q zFeR81EDBZzo6rT9f=6hARAH7-WouRqKM0#JY287$Iqb~U;l^-xc$hhR6h4n;ZQyHe zmX1j?*_-c4^`(|lqSO~PxlsC6+9d51$o4CGAd{R^ep{9VvelQH$OGOW+dO%xP?k49 zwx@CuB{kSqL@A-vQW_~Ols0I~&zQ4$%2H(uTQi!or|8SnU|SKj1k9`va~5&4&(tr~ zdFoOzXE#8$r_5PuxLFacgjP#yq_xo6XkE0=&;awarML-ug$8)4CBaF^CA@@M@Us?r z8@&rE;7g$Zwy-sC=y&v|dJ-eGk;^Coy45lofo^S#F2-lZmuP^cLId0|?if$e0I8X? zB4!D*7TDIpY-4sYKNI_NsksBC`3pKT@)$B&@zy(*Y}IGV+FG9o1u)&35C1=8owu%8 zzp*>tvQycT;Qv+Z59}sPS)>4_fo{>1owKjnzo9piIjNm8g8x?$$d-Tx80$=O<~qxq z_2|vx&Kc*K6YHh~-EzUx0-*rfxn13f?lgCiyV~8#_B`uebYG!5GkDpVvl1wPs$LuK z6R#f|^b4kJIU3-scg?%){q808Q~A04!tk@|enY<{JG77gIqGw@*rEIVlm12jPq9S{ z1*KqTjf1v9m!NMjnmL;p><7&*2G_-ur3^EN3d*xeSW8S=KD}RZ-SzJ}s+RRoP^yM_>YP;B% z_nE5fT7In*EUX2pa;P>*n~tXZPP?Z41_LVy`?B=f0?N zS@{IRuL#HQghw%mt+-N5&Kc_`>mMtroe_s30Gk@axH{Wo?Me1rd%u0!zHI;XZ>Th! zN%@*BxDKZEy>r+(>suRa_r(un=Nuf2K9N5rr0 z;awGiy=#8pH}hNjUHmEjJb#71UtrHmKSl6%PzGj|0P6G!CbQv|2J3o z$jp|iV$|W=?ujEg-I$Lnc@(~V&3JC4et{uCk-4O0GfbV*py$dhurr^~noy@`;sDgUyA)J9(&SGajm~h#7 z;-qs6xg}f;L}=*_b|=84kBDs(;XpA@0t2deA9yYBCKKV%bG${~N^g_*op;H5B-l+l zzZCqY94JtaO_S(%_ow0lEQa4i9@GW@roez4L4lxT;J|FE^PTq&1_r}}FM=7k0Fg>N z6Z{nX1DDQ-3s3}JQ#Py=whg<4y}|+iS1K(gX7y`s^FMW3Z)phLcl@Gx30_NGg4B2WsSJcEigaiif>MxY&nqGVkL&rP6Y0g|zZoHLU>{(Lw8@ z4bw(ztF+Dd*U`LO&~C!0)9RV^0ys~)UJ-UvSMRM4)<^0S^y&J1eaF8|PDvPbMdN*= zuF+fYn+alqb}&B|jQebz>?pQUreT(2>okSk3^Ttlr{WDneEJ}a`VYL#0sC^o}# ztq)ObiDFx-4AI z%yM4YBR8odHkGq)&cV3Rmv<+wTsB%tu zC?+c>yt%wuO>F?1>7e#ehv77>dXtVsO6_-CfE-#p9)O8EUW;U;g*II1w1_pY(T)f< z6S?BW$V39Yiv9syrh}e{*E9##yi(t!f2Us(IxQu5q!>1cREvzHz0m_EGuv2#3$W4H zV;nNh;GO?tBsDV%E~A-c%}ThLU2vQR{L3{z$yCKyDXlD^QyDz-k6|%AtbYH}XqRv? zA6YM~7nl{eRpH8?FipeAR_3_NNmtIg*WBCg@4^Gf2YyxY-uIf3 ztaR}PdSl=)8@%1#0q?kA%Fp011@X^K-1B$wFh7RFj2Aq4k-wISI);P(7fd-V+N=Ov z*$c`AAH!jK;R8$xrsD*x4Nl=O{SrI~{)Q`O3v-7dK0qy;fM|F14u^!_z+*Pz1RTZ( z_&NM7+FvJPVl3t_yDV}3wdt6Yaqd7H^eBitj$ zs>oJLus*duvpz><&9)Xc;F3%*6QPYE||@H!Gd=>KjKtAXM!@jrO;aC$X)8;f=6m=7~Ezu z*~?OV@MBES1GH9hG=4m&qm^ip1_C|Fchsv$K6jS@*-hDf8{@So%0(a*S(F>)F? zk6aw3Wx|2qCBf^#&YLPPWNx;|2jw5wdq1PIaw%`4=XD(LcX7ab;!RFd7U6$yff1b% z{&y<$Rg|?<7HLaYyvZqWq7~`}b+>wg)b6fuCXQv!KQFJq!mTARVA z%dq5!@TRxSEM~k}lD+4f6~&BoBh{NquDcSiGV;VPqUj%+f19!3RAwu$WuodElj!!h zrdo60%p38jg%QgJaG0R+F?G7Sr{XpGGk0$UkZhzxouP@^gQ(KigmKZ}7L1v_vTNhu~N_gF6Ks3{4rZkBBR}b|$on2C|A1Pl)vRPNwwS=q zYA;y%GTHQ+8cb5F+zR3Hc45qYZX|>V$ZL~yG{wPx8Z?u)#dTrakJj_gbPW^4R zql-UYUvCATb=Uin^-UMs@s$3fNMruiQyJNef;i;5;lbG(8(oclD74uqv<=2?lI2UZ z37)Va(*aiq#i&GqIs62H^9O23+q%#6%lNp@t2Vry)*$5rYJ z_ln%imDVP3?jF+@XQ#LGq1(#hlt;NtYrDPO8^u4D3EYZPejKm-4toDBCk?E=5Kd<3 zRC8K8?VVmCU!E=!=Ito{!_E)R6*PY~H!qWDxV7B+U|lD-7qd9Y{l;D4u0!+hBlUaa zX7loT?|6n+3pJMj#`OZ_CVAg@D{z&z!oQBg^)sXPRo}-g{|FbeF9`RQ{|$c9E>zty z|7ZW6{{ozg$HUZ^!m4nu*1@MiKOFPX!Ixw*d(d`w@RZ`hd`zFh^i^W^J`6jCJ;HwB z&~RKhHC!XmE^^FYvMH0qj1asl6Io0VNyAsFf!=Q>B}kodF(-m|OQkK+Ug;+k{~yxd z(pz#CIX@nzA^RX+O}QaVe~3Ivp3bh^K^}98sk?=1{z^`R?$4_f2KOwbwwSv<@cdci zerr&I`@p>`%3bA&n7njq4pkAkOkGiIJNrF?H46 zAYWIbk1^huCj9dQv{)|U5Bv!;OAGep#%C&HR>LD`|HeO`Z>}-7n)}Q%<`wg<`2?pa z&PqojsF2cBXYvw2zM{`wx`<*?KSoe zdmnrDhM2xMCm)`s0s=;v;D=5}bY(w$&2ix18WQJ2&QJ6kBDX2K8&ChmaVz6&HYcy? zC{n@c?tFI#oAwm!KS~8(frZfw7WPV$4AvHoLT?%muN{R*0i5x!dcS#3ynpc1qe+as zg_^jVt>A3k{h{!-nPh`2n8zLd0bKP*Z?eHs`03@)ob`m)@Y$Qa8~F{JnaFEogBfts z3*&NzVWTjC{N__w+bDVu^KdxtMVTN6Nom9!rkC>3cBn>X(}cc5SE&!V%_Q8-Q{;ia zlG!Ac)3a|ioXzs6fW~q=Q11)4|22ViaY_co7F+i9#0|l1iunH?uDF`=Oo2Y$_j~TTY&I9d6`AwZGlmVE!!FmFoF%c+*nVS;Q|@pOSoGu zIy2?Xk4R@Gp(U4qXBWtr@50@3;$F&Po)TgFgCXEb2{KS4b`mN3Tf=+)nN+kAt5tkXOs=VOf{tyLbyP?? ztC`fPe0OIw89vm6boQkFGahp`IwqBkhI9bFFy^vr&XdUgY$PN3&kC20xX$}%`}<}M zKI<1&9+LaH_F{POQIXo;XFudYNhywxf?Dc)>s)glunA(^e~2 zGlhhHk>DkV-OD&Xzq)C~Z?ULX#w$0RWM3*x#~l_#pR)NN{3eULE4EZj*89myJ$EK4rhkf>5?RgflkL{X0sH8)07e4W(~g2 zZD{(V(hoRCH>4+05;+CGyG=p4%NSnmdRfJ&PQlQ#?n#BZ04}uw^Gi?!L3l0tEwo4yS+Ox5jz}k1;3esWG>@F{g*+DZ z@F!Zc1bK5o(cvtsRlzB5qJ2#A5_S2;;F`{%%eh8-p{3DFfIqd3R>r3^_mi8WexhMnjGjnWa;`o0dHZj> z5ZRXIl!IeT1I@m3&N=zuunXKq-UM#}=pP}#+cbn`<2qmTpO9^45NUczw!ahb51f!B z#^R50&bCN`N%`tcJ zM~c!D{98+{XVT-zhKrHgNpSg@D9HKNVrw*8u9wr7#>!CoQDdA5B)n6dnRE;0Ud6#H^Kc&-DoK03y{!s29cfltgifWrg?_`ENn+#GdDN!3N^M9@K1ZE>OIEgrUhh?AB`=vt8FX2Q zW0{Bt{`z-xUc0NkMYf+^FGTaQHjKEv-W5(f1TD6fE=iP>-O~TjGcrrM;o?&^#H0M& z7$=hbMSM@^N%dceMt4E66Pw_Aw-fqnh&h~Y_jqP(3R5;4M*O{b9TgTs=K3~sRu10M z#u{dQ$uDRDczqD|`^ZX3pF6_qGPVl?Ze#Z#OBq3?KOOadk)-tr_??cHQbDJfn8yar z$8<<~p#NvmhTBA|_cBe(ht6L#l`_!m)k#&VxHZZ2dy?mmXJR+dhC4uqMb zFG0K#qTgFRsLyn?#a~*)Z0w{Z{@U;U8HXt&oTfhcYD;{{v24M4;Y#`JdIvZmuXj4 zB6aPf58#)+7$n+)LwOpu8zuKyK%`1ED_h`m4+n+66#bA@sH%;|R?v74$?IWsRT48j zyXQT#2?+c-6SRiR^@#Z+*-189mBrw^7F)h8zxtK*kT!$8x7a}`QSQ0zcSu{?*`LD5 zhT5a;nf5l&D~Xc~wO$xs`va#Ly!R7OVwSVQ+2HJ?*LED0{>q7GT1wK*t>!j!ySsyg zMxXC~Cwh}N$VVQzaj2t8aNtOzclHK*Gf3iAFeAHgijKpB&d~|K0uug$PI~Djqd%D! zUJyCkkxJ@{Z#10VQIyL?S;-mra15?wjvzl-Yz1bf6Rq%xxZ3mZwb#=CxrVF#x|^E? zuc#i4@I)>OMv%wN#MNF&C;TK$qhCRnr(w*A*Z7i+Twal?!lOQvI*`fs!v}9Zq6ylPkh1O1} zrop1!HbdKrDv#0MqWe(@PqH$~yrG@|4)xH7i@s#kF*>fFMVUtlZaNx9QLC*iNYs%j z8q5Zn$}V5Z{QPL#7Jg(>xK&0Px`lAO6VT+Ju3h-p{s(4O*seyRn;=wpq@re{!K19?SKOZxY{W|9vfvYXk|W;C z({5(z30DOfMHAO>%e(K3j$}W0{z}x<_wFV4FQKb4dUEzr@ZjMYN+WZK^vIGLMCMgU5*oY*tdfeWcKfcwZn!? z%1|0jkPOf>ynT8|&YsQcmDjHgk%n2h!)({TmW_E1lcTllu&8#Rr3U`$8&Y#+AO|6~{^ z*;@~c94I*pl&NcWGzX!7=HgdJlkxicC@qOvZmWn@i9}?yHG%f_O1ft!X$4(pQ$4m~ zXm^B6M+5SZcB1jv-yTVy_O^YW%>S945tSV|)RmpuWFZN(&L%nEkb#l6;<{F&P)=xSxznj%EDsW!%Qc^ zN57$Uwl%mA{2KfbycHG@E$x&W{(p>b}S`AU2 zUotm~Xq0Wl)!Rq!|98I(8JffFGz>b@^dAfho*K-;&D+ZCJQdkSW;!GV!eTgjb>P8M zMKg9QHzYsNR(ue?0EuE_DxwQx$@B9|KAv(t=BEulPIvl>!$>psgG8s`IS<%YnMpDV zv#$){>2(o3?1`}9Z{#KTJ6my-U&ygaa(GS=+`X#G`!vZuhS_veT(z89MSTxt*@&yh zk4W>os6CmYvEa{o64x7QN-aHkMLZf)qIKPtz0{BX>qu=p-NYH<)^P<4XEV+ICPqsm z>Z$Hwf4rg*c+akk3ObAq`UPL-m1vLV7nfuXnRso!kG44d-S|BZd~<{G4fwx_>}j8S zm_F$b?1Ah2y6+1H8Vmc(Ocqs&O;DEBe1C5!zvjPS5z!S!R{wq6)yw`z;Cwgkan3|o z&N1l`{wO02!1u|*rRYI!YN9;xH|`xQT&@O6Go=+AZzN6hwOntVfZzS8d@dN>az265 zT3H;-uKZ>Skkq!J?Z4Pr1v+h|mvj{O_)q5_C$*cOoK|-$(p4P7-+u?Qb&B@&Z6@oP zXeq{%%+`btHKXO<9Y1h1tY{9nv;k-60xkdNUetSiM&B$C&c*5AWsp|n4vo;iiS(v> zfiW@hu`yH&V|qyo#0_jE_{UDJUHgIpDY(g)NJF$5h`tB?eZtIUb+LP~i>LCN`5r&~ zkzEN!*Abts4~^d4G3MJ7z7cX*&Yen>#nmPA zjr{1j;__*ic38W}_0v7BQnKiU@ktCE>E`-JY|vSBQC8ze9nqt_?JlWD3L`6SbRll* zqONvkTu#NTYSxB@ecSom#{v;w#UPwD-qp!XkLFqP*rt~s7zZ+kF~;SBPM z)OcFCg~wKb4cLrpxJk}*bohEW_c5Hd{A9Bqd)ZLkyU9;~=Tfa$(33{m4tVdk_-C=a z>BhX4X;UHg)uE+#ea9A8Ej^cTpU*^O38a`KWUTM45w*P)Z?CT4IJ^Nna4W8 zWW9?gDA7uYbif&Ml32dU*0gbZk`hlRojb*Mm=&(3((`Uj^DgS&egnVXOe*}0EH3gu z_(vqh#zc?kcadgFspZNz(;MZq^pAS;yZn(W-Qx7uMlwlFL7*Yv&MhtKu2#^iqN0Z4 zVI4<@UlqOQY(^gD>jcTbE%K)*b&4)FK1XM-qCdZv-$xFsAp1wLs&O^l0Kcvc&D0*G zoU^Q@xK!U;w_z@ETx+z1%f_Ol^Ej##uw{BWGn|~Hl$F^c-?KT=vm?5Y|4gI*wU6I% zJPp!Q{F{<^Zw}4dEjfDN(a{* zB&|ig{>5!z7Wice(Tey0zrHIT#}b_Seei)NV0k8`09vCqpHLT}GwzWCzEDze%U+h5 z@5C=Kx@B0-UDkH>doCHyakG9$^kD|?`j)Vp+VG!8}8w-pVe@m>ybjA5F4|L z?=cIkr!xAg7v4=#681)4H210@w_f$}9y`#}>1z(;Hev)0`rkXQpRLn=i z>=8M3YW$H#+;R1_li_N3sE6g??mF^;Z79;cAk7hPFO9rBT&fgi8}k>R6C304M;&sG z5HBZcn{6=?xlB9{qt&=>?N5_EH!R~EEJKBne(h()w|p6JVX!*(jZc|@?CrUfk&HoQ zBflrNL?84MeW*FK?bfo9_mT5PiQC_Da&b>w9CZ-zdA!R`%8lDwlDiZW1gj3KYk(%` z%pLkDHHm0!2YNNV9u23qv{DA}iojv~+iSD|{-BYPlLJW4H=i1QUt6I|FfICvwBOgza>hZ#rJl=uFf^51&)ofx(m2e_#|{ z;SdoQjc&FMY3G=|yP$96j^v=fRRRrTaVuXI9Bu>>AJz{VDa{NZ>@Q}#Rhc%zG=8Zk z$dt;^cB$yR5A)kVlA8@@qMh5@{XA;f@eLm#b-4>)OGAIo#b4+IS6hgy@UuS*O}LYe z#CBh24N6?*Qe-S>@kC6&I5gXHx8OTX$f0=wGJvVOUNJ_i%Z(Be{e~un*O1jzA zz@{U(iZ7Mysze*I9SF5UJ)>vB9T`oZWgE8xkApPf41VWFqS?9{8*_;rR*+WI2U1(w zP-~@>BvD29eRKh-;a4t17oNvw%E&(T;bzVFJ@+GH-NG;VC~m=R(XV_<%K$5@ zf?F^ME_Q*p27ad1|6Gg3CCJMs*o+O<0f*o-eHc#vX1swLcmt2#%t&wYt_}DBInj5z z>2fjot+3%O|$FByD0KU?2o>sRm^ zz>iunVV~hEPG)n=_STY}?O=bL<9mESTAIX93meEs7qSfBXIVVx2K4sZ;Xg+^Wi%bz znK(yl*)03$bf3jLimq>;a=ly*6--o7_i{xAY)Z_y%!g6j`~P zEQ-VA^IAo1sUb~}cChw7c#|{voh&E4+YQE_rT=yp1^5p*k)33=1PZVw`@5a!e9r;v z4}q0;_zk_HHCdQ>i_oDZyuAlEMpNk@?SlPWh4*A4k1qxDie{y@c(Gz4?$UR72UnPs z$9R${K~@!KyO!39#?cTk|7#fgF*+Z=^EOFJ?ujabDWB>+>3A&Bvlw~Ndi}tR-SqyS z(jCglHCiQ5w}aUOr+OwY1RS8Rb`57J1+N2?u>v|9jjR^pwzeNV?WzAt9G0W&*3lc< zX6>@}S_f!xoUrQBk8Fw~knko4>IPTs%Pr(kblw;mlat}CGs#oulNK-M_I4fjk=wWw z*o*o*Lc8q@Y0D*i?wj}scWG2U2Ay8mF;1M50tYh#oGJ%9J035ynDY+oO2gCixY(`e zRCQ{QW!A-OXo@S9;IxGkCpz7nr??C;Zk(IKO@kwz#m(X7p%GFT*Wn#fXblDFxn)HU zBvOn?;HG!T?{hMXQFgE4U{>Ttwie6zC(J-iLHz2c9+e~ZbGRJ?V0N16gBt%>gXi1yqi`o6o=U0N%B z0nTago`$+G|)JIw9Dll@N z*rfO2`O*6s@3T9HlLsy_YO^Va;;{dM@0HssY8zyjAHf8sFr8bO$9tsH`Gs@d9uB|M z=|PGz*IkQ_Jx5dFZ#N5$f`V?1?gsjJpOXj9I#4qWq3MMLc7)rg<)kzTNKQt0oHYn0V%z?<6OJPzirXrew7 z?{OoyMUj5G2S2ICC1N*Y7%j22_(#8SJ@$-bEE5~3BPsGku;puz<+vH$QP;+4&LrCS zrD#?}v-OwV35T$+Gm?CDE*odPvke`7o;2%*Q=9w1S)#AimQ?DQmx*^j@`~4pCbAJ) zz)}anQ<YKkwqO!UJ~SZDaf zT%sj@6MdoBmhI8Ds7N<_y?DjqHJ&BG(`xpA;L_`?_7L~CXZUwsa>{e**nkdh7q2(& z$0+7#I!?j@X6c}J8C3es%Z+LuNf%-*KGYqu*vQAs72KuypAo&7G$xLDDHpX6VcwnS z89Y;VGxZ1Yhfgy5Kf)4TkW@D3f?_w{!xbj}9!fR^?tgCH8!AbvZ}Z*MwCaHc?W``` zo86{QD~g<4K_pbH~Z|-y*5_ZzGmLYkkOd%oOggu1nDiEK&cr zIu}(_K#}9z?f%21OB(c)$M2#IS@92QF)qNDiI<&<>o(f+d-PFm?zzi@6bIBpsX(;1pgqb!G~ z^Tt+Py4A&Tqpe_h&>@=H#Me8aBltI#6k>t2f&R~*H2Knzf_pI2kI)y>Xg%zbPsl~d zE$5;H3&RPj!U(pIBAntXFk+2QP+3L9>j@Rai)Afg1D$C|^ylhp46i86*6tfGj94>| zS%8;;4Bnvn08h6E&i`-})|nQhA&l;s?(iqLMGQ!+RQcf zWg4>)GYYvV=}Eg|1-SnZJ|rmy9mQtcMfS$I+X@4Z-X$qUf>MEhb4~6=R?~I$wRpa# z&T!xfAklLDH{B)m7()`af^Bn)_qJl_c;$oH)WxS>3i6yWAMlz(Zv26gyma)1H3d&# z6OO^WR_G~tD#?syX8X*{o{VR{jK_<)A}V%`9uK{zL==%KtNrDf;NkrtT0 z;)m3uR}e#|pqVq*-A4N^dS~gfx6N{eK&M=DU(c|Lp?uq8p%dDV)5K{QJLPS5IRi=8_{Xf!};f6SobG zgNa<*wKm7n%3r~J?&6)lt8A6%nz}OiS}{1-I66IR#7iNsoaoJ?{2-|UhwV6uawcj+tIzKiM1 zJW&HZ=4#SN*2XmCou345%oDk&>C3xPBj8+NGZWq7EBi1SQ=}&Ca zJM5b$cmc8atm*75G&AF2r0UmaSM(g81aExp03%m*VGu-A6GPRdnY^0(kpN(d8L8iAf7itc_ugYN!k@YvH zHQ%0JTMx37!SqAM@#f@oUI|$kE@vlgqCLGAJ%0j4e+eJ+HaPhB^_w9NlE(C9{$r$M zQX1YR%|SD*FxVzZ2F>d7v`A{wv~Nti^kdNz=*3G9L+O)5O{6)zU9%2`c>r(h5?cQO zZKODS-5mHy@36Pa(i^BNFDJ>^1kR-avpoFNie!8Lv%i!G@9)K%mjmH@BiJz$&`MKz6?G1m zB#UVaujckL`Wx&bDL82&~kU4C)#dy@K zaj7@aX5B?*eLy|JwcZ){$|dy2O;G+WD&#TS`~`R)r=`%+;CsEs{CHmFDaH$&66v<3 zc_@^MBpfwxIqLFKPg7bn38V!b!K7~VdHeEK)KGBg-*?1vnEX2MX&V>sdr^o-z^F59 z*h@HSH^Hg9yo&euUwb6_ui{4Y5Kr%=7$_t0y5@gz`KqYGTCm>#uiTB86LG>Di1uCl zn}2Qe_k6wKQt$#%23}Olq5qd3{+PF^;&>r83$IfZrU@Fo6vyzv`Ht?(7;eW^P`Vf8VQ@Csw_-$XuQ@z98 z!XNy;pVRb<4U+LLS-Kz-H_5qpova|pi@~axdE&EKokmdZUw(+||M#Cy Z;6Ic}$Z^K^7(*JL~=Gm;*wfEKh`(oCnOJ2&_J#s_VI=mN+{A1R7{9bj<@3UUw_djKA z#P7tuf6NNu_ZOG0;_?&w{+WMses-5axI2@?JKkcMWKFW1^NZo5beR2?{zLj&lPwl+ z0+Q%|i>3Wy2yUagxt{-_f+zc*>Ka!RC3>Qd)w3ppia)&YP$}<_Rw7k zF3#cNwWS@()SD7qB{U4QcuRs8(yuSSKs{V)3Hm(_@x+-4mS^W&kmw3MQirUDaUM5; z1g+{IPTjDX-UciCn-g4H#(7c_8j@Wl2`(|^Z&r)48j0!-aWkIPNgju~rMRdh*pJEw zHcKux*)%~UJGJ@hVUdFTW8*w_tG{=?IR3g7z&3SD5rcx?U&i5AJq%`Tp+|@ru;{|z z-y+^yW3@=G!I;Y;>hZ2NQFaIZiC%*fh%0*pOVRpWxB8kySIYLF-W!vi7E} zw^|C;T@0qv>)t#B;3KP^or9l-BznQ<`^JW(qj-865XGD9CY3RmsXm|e1I+Xu55rnQ zs=+{?B1WGTZ5GS~sFfZUesc5j3%sF89=CYuuUw5TWz60Lm#?AHlZI^iC)%APLnsWXwmpQ8YrBi`sod1O5f*&HUW1O7A6lw8UPKzPM62>~Wt zFgr3PZoyx#hVYBoN{fr8->$iqip>rHY;ticq4ww%Yhbyz>HfohbF9D9{l|-tmmCCs zEaEXjANChV$$doo3$&k0;^335zzwpp71*lkbhKJ4c&}2gci>EgHd54NUk;N?A>le| zWn1v~HrhcHarOg9v*oLB)akp19d5Su-!o*-xi7;1{&WAa&13!jZVGI)1x_T+J9uSX zQT=LbQ9bw##PD0uMh+A0C=EZ<-qpiiWgB`LIMpe=vKDhtwsPo|{Vrxj=Ngc!0(5i9@?GzouCG;%lxlx=)&wKD3 z%AO+z;3c%65IS=cwE|@=G88mrw6j(|b&R8-(Uzv!?!bU5vf>P>T9n zS)*zu)su_ndV$zZb%7epe+f#+p0x!z31T9@DD+|#WB8?nUM%8ryqMZpExEJkHl~FJ z`~%7b>O7Allv(0c-hhb~i2S|@prrVeGad9gfnM`xnOYiw#>;_Quy`9crBKp z1mjz~8a8R_FLOEcv5F6y!AQOm*w&$*NU!_)TsSxreaWPt7anbEMi)g=lJFSmUcB=UH zfE7W6+Jvsx6-*9h+QiSOjXdyOZ6K1DK660QCm|%DaLDUp4tYHMvRMg@qxB9uG-+tLt+|a2uk8XpR$IEQvCze$#yl7`ZqM^4sTkkQyp(t2O=TCi-epsbzmrS zxKfT%{5}%$1m~X;GYDamScLAUvd&pK62Ix&(s$KlUw${tB$(|8=DR52ZZ&%(Qbr7W zJH2i!z2;vT%yy@5tI50+Syu-$?a0|xlYh_HV0KFSHl)oCv?m20VXZ7BtvIWe;csa2 z0r7GRXeO2>KniMsO2?^=4*1;hr)(YGq2P1;f5@c3^hn}x1E9<2|Ht91LQG&$EGQyo zzX%NN>*`QCy)L-Gc4QUWKcUVg)B_ncRf1yqPD92(`h z5{|4=-wu45c;p4OnnisjGsXEzrrRstBH%|TO>K9+l8w}Cw^k;20|E%6U}*9_u~YyU zbqKzC6Z7R%jP%ln^fKO|&PR=U3s^Hc?<-NJ02TOC=%%u+pzM6{5J*BBt+UiT``SGa zBA6%YVGP0Xf?w;!Z4yFSrggPdoqSYlWoWhP!RhFwQC6KSa)Oihi(wL4mQ}}#;P^fA zS!dx~Vtew@;-V|-G&CBL&_v4t(5L^GnSSY+{{MTb#YGOSW#1Q8)9|3S{DI+p%KYUI zTxKnsonA+_HWsGm8!>ECRo#L@E#+#YT*)c7pz6k6imJ2y>Lyg%>hmnF@&_)r`xCFM zt4Gl}cVBO{_oY)R{lUzR$%M*8JxY^TK@tt=>NZj=lk$K z@u~kKf05pyX2SZx(CpkiH9sZvGpoAE`N~GM(fP{Tqc_gK5z&#m#yz;^?eb6S%8%ET zWduIEaYEHD|2YJaodS>nYN5xi_RqMbCiO>)3auSw2i5l{IA6(68NF%VMqpPPM{k|? z-1OUv5d)!%d;^?XS~qHMIxqAK=aC!ZJbZ{E-Qd)#G{~UHAr4c&B}c&7-2DNeB{)FI zLdb)j&24Q+uA7NyC+kmugY#`b*n)o%KA8GyV2vE__WpBp|Et9EgHk-+4U-oC`U41s zgVhNyNV?H3f9*;6#qBDz1m-?WlfRegP+{htv~EtKp4~ z{J|Tlp$D-Pf`>Z<9UjhJ7HC($PTzavPiTy6l4>~>Qn{$tCvLQowlVZ@E~#U!Ncs~n zW|8zcw&sXq9VH(5Lzon?TT9~$(5kVgcT{fk4`DMrl9JmT?o*EtT8K z4i*;$wszcJuQq6XI&8z1n_ib+GoW&pKLvrjOMUm+`!f8ln%l+&Hjc|s->uwR_HUHY zLV$|4X<$RG^pw!gVvmBK-1NQZ?HzfE8}kc-h3NLt7LbsJ-&72J=Kv(M#N)?Lju_qt z#g=&HQt5FX4}9C`oz6frTx3ncn9H42Z^1}M-DGuEt;a)PQv$}hR1lfD&Z;V;l|N`5 zU-s+r2NTAXJy8B&;&o;Bmp^DrE4ydiSY)Qxh30um0-KVKtkMhiN$)5>-p`*F@_S0u zO~bw}Kix2yCmkDs=8eQ+F;Jw5bTEtb`_c<7`WFYZF4Pna_ z=w`OAJykf!bLow*J@E z`!5K5pE3WuMdL<#G687o?-dRm(*J=5nb@S*&Pa3x7qi|W;ZUEbN7Ip(S9K8Nl+;16 z<h_&d73Y=oMfQtAlhyL~xg z`lC=;c1obm7IIIVIC^_%TE9pi(u z9l>e#;9R?!Z6CeeZwp#m6A?Nh5HVFNy4UqAc>1v#C)Mfs803_w4Z}VxKYn>xa`{~A z<$h<4J#&%6g=*zm{a51mL0P8deh373PmVIcqTrKt~->8UTUG5&>&kib~v|AHCz30h%+E!ToiX^btG5zEwk+098Ml9y{qMMi0YvY7QY>N{#$4pKJl z(2`AS(X+ZNXGvMOX(jZ$WhMS^h-7M6nhlgDDV5Ci!x)9caJ_4#&h=f#Q3LP{nWy3z3o=LpX|Gr~@2N20xiRPvIgM{N&gUFpoOG@p=ac1oq%$S8y(M zfb$&_Fczf_a1I7);SO-TO{;_8czgOW^zI2>arp_-H`(|o)f@&~Qt`bF3YdRBI&D|x zqH$+-X#E+AIg)+i+v8d}|5oc7?&w;SV;vni)W_$D4ofDj%%3wmYte!@ zrmxscVP!qS`}DfowHJ-?#KlNs{|FB+HXxS499uTT7f z!N~74!{In`l%ZcE78!N4qk|%mc0?krAc;=gp=2On^NMqik)CLLQ28k3U=dRpg&dzq z)N}j~5GrLjQgg&t-)QjuA&e!Bv3zKx_AM@gf&-f~FfH(A3NkVK2ML#w?a(CSu;c1R z^;`7>O@sVF-I`uU6Cuy(kUR}pT%>N)F}Qk+L4%COfNH4ADzvw-1>;kP3or7@NMd38{75`vJ z*;fD(%63slG3p4s$0W}T@!;1mg`HG?Cpw&!*I*RSagxYgX?_W}wng@AV)TCKaXLyBJTm>KzkF&aB?Ikkz~b zJ&vZ{CWMyJNa)?985f%DGv5aJAm`H|gwW@n^q|Bly za(eUnR%>48{Ks&Pl^>yx2sf_BYr#kyr^Wt4*7gPpT05)l17G*3w*SFkVSO-z$|Q2P zvi%=oG=B#(vD?7Sm-mbxdpG>N z^>0lqXVu+^L5dfx5MZiEt)Cv@EfyfQ>{K<+$%^mFJCcFVXRs*Mkm(ePlgL6)IgMQL zUi^BSSCH!vy+GE~rXrp4rHrr3W=u{wIg+f&Ybc}8wnTkvxLrL=!M)LG^`KqdjnJ`E zy(~8Bx=WLp$zV}>F}17nzv3$Dq+M-C>8N(~E=A^@+3~k}g?H`RcQRP#OoiI?<`C7c zMl(MV?P_dS{QR_M{A6^)&v%FyIX)!6V{TWgP|)ZJWxIM6VP>cL`A}-RJ7ZqWV4dsd z9)q7V;3i-7rCxd@2%3C$U;-dd=zue+_LwnZKI{OtPvB)=$=IY<1 zDGk+*b?D#Fn2wgXbL+vbZ z6Di^FG-f<8=m^)%G(9}cGVF}PQ;a8~!&8SIo}R~$R3je{B!UqK!c&UC#GjDWy!S#3&}$PUJ8$ z$`NDZkb|QGImCKD?VcP3BN>t8AP1zQSZ|uxhOFl0r-&S0ePY+)F3h|AOKK-wN=Lr> zT?R9xGb?in$OQwmFHtJ;*hl z9UyI!d|#<3_Dd(VE=1YKwXTP4VlO)y64uAk=7#?sO-h%hOGJIf$qbzRYMZDG^d= z)|*NLBaFXC8ja;7i1ytNKwY(e-uGwT9UJ98`gc>_*-bue zhmAu&pW0u6I?5-S{>^GZ(?+#nw#drz(zL{7sB@R*M&yc7;GSMAgv-N9gC{feVVXkI=|az)!KqpQ4!{JiyLq`ule?-4)mGMI^<+a!a*Kp|L) zrzP@_VgHjY$r}Er!XSG^*#BIl&9a@hsPcvxKx=kEUW0)hBz<&ij`F7^wr>34h89+X z!O!8(bTxFs&rD!6^HawKNFkl@)5H3>N-|>fSBk-i$v$H3cdS94Ch{VJyEkQ4Ffc1A ze$B`!(jM~nxQMiut)J?O>XN@_8I0{En!iiHU-NR_`@z9yI#HmwgSsZf9d~olE+aAu zk#3BnU=ERp$L8glGLV*DXRx?hx=Ioc1}Z@y+DG)z{ss|Org$!k$(hzu;`{d@QCyic z`&*e63@nPnm9czajt{!(f65L<^7s5FJ!&5n3>Ma!iN6k+6$~u?-{9~41CjjMd&b|V zA4l50iN8`{XkK0m=A>ob4+`PvC~ENdB;)DQh{#OuizH_@)04<*UcQ9L@!-)Ghnz8Z zyrg?_WV4Bp_?IZ8=Nc}I`*CYG5gTdn3$3JCOF!1#MhJCz- z*wfs;#NIgk#g3OYG8ps6<0VD3Q2h5{-1tx3TDNpvp$!7 z)FXZVg2BT26gKeNy!?5ZqlzDen)vBz{PO;O$xpb2n#M0Do1>VE7~&g?)4Lfg%$&0G z6e@f9`*ABfJZi~L=vky68IN?gUTc#A8C~r)h78@U*Y-2Spb0U3@l)CVowlI#_HL+3 zU$3ot%)$=N#S_n7@zMvns)oHeM^1A{>0tgYxiqd&dUzf8$aAeX(@0q-NAiFkNXo&rGSz z8NGVVihmz4n#dpsMhX)@@CK)17sBp+u_7Dm_$S_{nqrY3qXAdvB9p@3VQ53-J5YiQ z+$Rc{`a81PWBJ3BZ*~M1ZftyCMG-k7e#GN`#!Guys`?pRkSqF8#YvkLdzWad3{N<^ z`{syD6Bm1(IIgBCUU6A*-9Xa2x>s^m)=^e?_3B~pXKFI~Ru-P$C&?4H)AX?n=%3l! zMb&NIZ8VnYAQ9GD+-)LD8Je|5kknu2*nS;eF1~daV>K;nZ34ska`91MF{A4(MrFAK>Mx1@iCY2(6BfYt}fM_K%X$0tz}4}9mEcSv978;8&f3Bg$&*ZfxX zt&RJW6WUn1Xm8@CKm6>G@x&{hoQvqRBs}S{ae6P)yuWd5Rsx1M;&X@m&!B|!(6Z<=rWN2~P+lIzFnfN~lM&tBZ zaVGv@uHp4)I`9}JUqt>z-Q?39wNd5u@kU;OI<$-R>X{s<+S2!is`MtFdb4ceC(*>Q z{&&(^r8_5L##d0HUUX|(he7}iHiTYyCx9XyZ>n%-&bg2%777(Di1w6vL_ zBY2EET6$o!hLuK3M@{Tq%8th%#6??g1_IfZ{x-gc#0|+CiIYtaPKdLvecgn=x zA|Pm9p_#4J-XrgHp}jS_5p_FSs$ocz=HiT&ZZ_DW(UJ{~$GrQN+tn99)4aki+f`?y zCEQE#^6eNeP4D{u5y+*lA*-PAr5K(^@A3E#F(?F@p$A=G80sg1v>~5)V#65n{evO( z%A|QVH=Tdk>0p6M#Di}Fv(|rxM-(&yLZlR!M74(jVBhgcYhay$?`-o9;ZG!BXxvLQ zgF{2IkgYCc3((N3p`6MhsK9Y^FP?BWjNjujDTcy7c}xjf37kl#zOSJl_kHu`aNma` z3hTE?xx=0}Mc>$SOnio^7umaC*^Ls`GNhq|s$)?Cuu_a!o)R&$PRHC2S29f764*(y zv<`+(#zivyp;9ClQrxtBH*(PWz^kh(Ua#&kua48?b={j9uedQNk^3~T_;Vm>UcL{! zfk|yqmquAsuaet4w|1e~MH_YbY2#T}GYUlv$(oI)RjE@kNawNaY#OkmligCzD%F>j zG``$E@hT8fU#s)o{1j;zC3NmFfc1*!8e-!DBPw~@sJ*W2f+CWY4B4q&XpWf1-B4Nz zg8L1+UZU)RCsK|9TclkuukDBeP4*jk9N;{iS7%i=8cSH)F^!q{J;Zu6@$0Pepp-uO zz*=OQm0i(%!KjVy^iv*9FS6al=;zXZbfupUfGv)G_Po`Fe!e#}-W{*I8PcSiZg{O& zuk(6lanY8*9%|vni8IzDSLzTj-Dyi=U8i)#{|yHJT{&v1TX!V?yt-Zpvvd2DL;VpO zzPrxod5no4W>cRGBTuCbF(0diG!dg{?s;U(S2lOi@*gp3uq%DjwwMxz>{Q>fqcQo^ z0e{!^-COskbjS+MY6CDyM~X%-dEAUZnEE?Yy9xXKFO8b(j>kHN>^YD3ykX*zErMfJ z@OU=!s5w;0V_H`{X7-rJ)YIf~+d31E`^jo`9)Af;&C3rU$gQ!sPpKo`ZS6B)0TjUZC~7LezdU*4lO zVpo0y*dn`lZsgzmqYGZo=`pW||Hewu7C;N*1)Qd_bBTBcV-`6;K$jEY&Tj=xqgR*i z+}9P4zhcU?p|LxCPCiW@PyE%yV}v{Z6EH=&^Ox3lp~v@(n(2pb7!kwc|8 zuAD3X7|=E^r`C)92WA^#vlA^Z+-Y&yN-VBT`2Vw+7FYI9Ew06-7S~(%gzt2e_phok zR~A;Z(M9aI)*}?!`91D)nt4bZU4olhrt8t9SNQt) zCe%^5L^K(w#2JYQ%j zT@JvaQbaqk?4mb!0}ctM2?Tv+MJ}Fj1vXc=#jv6=*9BY6)r(OoNAlQQP4_YA&y~ir z@*MM?%Dj(j`Ha+5%e;@$c`xgu%tA^FmQ^fD3FoDn@+MIp-Yv>F&a;^EhEv`W%JXpE zfmbwrl=V^^NNIgYv2n(BQ$|}VGVW9k;HNF*>NT>OV;R@9T{eog?}|yWUXsIJ|f@ z%gzEFpZEiG7165P@fv1LHQn8S1%NZP!eh9wA{E`5)?BUGqI3Xck)r^C-AWAMGEqOJw$_YR}i%sv|Z7p$f3(bEa=817$?DkknVQ;tTzsE6q3js&3ZqYQ=6 zEf>M3h1&~zL{dl^E99ykqNF3!K$))T+s*oJe>tkM?C~nAxtfkPhd(!v;lHlAx;-lC z;^t~PB5a0otJQRj7hQ25wc5r{{+a3{^rSAO99hIi?O9eIH+{maw`w9RpOyA=$Z2Or zb38O2$7(elGlkP1sT*e-O8bO8x^&!Lqo$h9pPH1lj|*>qsVB;+siwoJroub9@FP7e zOea@Oh1YXoUk?jYk6AfszEoCBh@a1^52%!=Q zIbvuuyK$XQXz9CA_(YH z?Si8ZYVK1RV`el)Ow`B5J%VK%nYV@VU z8Oe*$Na7mdv1&q+V3c)n**T|C)@GDFdKMY&$kQlmH_Gngvh4`rO`#M<;PKQZc}_FR zZsxM)6Ys7oS$?a4nDG(%Gj~I$Y0bT-tS7rNgylhcG8wY_POM=N{4HEHBw&K=I?Ov-<@9Za8qBy#qT=3;^DUbG#B@rUh!~aujJwfSDu#aX@=_NaPdF( zsCZ~8ohOYSicMoYMbUWThGI327c5BVmbR5(icOdNM6QbrIc@$&Z z@!Ke^#1E4HMps(X9=jh8KxDT?y*l{XJ`CQ~417n(MaMHnC(({#8Pt1uTGJ=)kH#HW z)Yj+mtp$8}q?a-j9JMAXY50+dd}2g2ins!+dD?BcZ;VKgJD(<&-6St-lZbK@H%t5J zGf~pU}5r`VXr{Ae0+HHuG%=HXj-8$V4> zY{I2mOKM1cY&SgVcrkdn6 znVaD9f9YBI>irfDAFGezwqMX(rJ2DmrJigZF0GVW$%9W7dyja(Z47aN9f6X%od`dujwKBo$=654x`^4 zAN{Z%qTi#TS7^>%??L`8>x#JF7mZ#{G{3_T-7DvSM6X9wDO_=nqHsjT#dWcvr3Z<2 z+;uY>Y!dg=IV5J8p_fF#Qflm>5r((_s+#tgK~nLqLv}?N(Ehr&|;X#PtTc zKFV_dlFM7m@Khj%nDWXgkC(TkYf3WmdMUGzhvltlT&N8|();#O#!$wc%5ctj&y?Y! z3@mSkri`NlkugGZN6(rvc2mY+&ABWxGR{)!kf9sv*riOnh1QU?<*n&DsIv+m zbcL^>^A`W5uXz!qd}1FYk1*LzOpVS-#Q2)uO0`jQ(rU-(E;MH_pCP($PIS&827N{t zy=Dl}=+EmRdOD{NgZ@*gOyXX*yeLokCPQ@3JsmdydTk+V3@>EyIRjJwsV!v9>JiG& zQU_4RcM(r>y?KDA`+94r5?}`2#-j2QK7{EEt+U}Z&lR$jha7ckWex3%uc`};tO>rh z2hh&SWdI0mpiT115)dm8|N4#I3VxymqWAzE0@2?-7R5v-u7$SSN{K^=lv_2^riPKq5=c3(P7;P4Ug`K6*r3F)r|0Ug) z4RCBRT%*7Qt7tX4ON$*Q(53b2q^k54EnFE$&sa%9x<}IC?TjnjO`pyao z33r{NxWEK%t7m-=Z#jqfvN2yzKB{Y{Od2H(*nqyWd?DDx6TLX+0FP)~UD|b209GUQPHsixBid^z4AJ9CkBskzh0$xOk4E3Shv;c@SBz79N2-Om z*J?Q${R<4yJ@>RLiw1uazcU+=;bCRCHN8j3I@o!&jG~XN@Ki(9G5=hec)*l{oG&;R zd+!FQA=)&hzDjqrw-nNq&cC#^OvNuU`>T(0=3gkYH4!x)^NF*JuHXoM)Xf9@0!hDLXY|$bG;gR2SSI&JA$FzB>iNER~^ui z<5EX-40`bne0DuwDF;b$1Pj#IKNgzo5H*+KTlS%MP%pj?d|eP0(BgLho}ki%J-jCO;ILT<(l0@%kkdPne9n?EV|fDIqpe8{fe>I&L} zH@noE9a+Jf9c3QCjc)KKtCrCXWhc~I-NA<(!G~Oc3_fHNkDp_;1Rru=yMex+CKuDy zYMN#OYK2fgLN5|~a&QAxqPmp7vgQg_^EU&lsbp4=f6A_vg-!Gx*^2BSqYrN2f{Y}% zf$)kmiTnlv$rA-5paDjMU4x?=oK^Q@Ts`_*KPG6zx$sc=;wnHOk91J=J#=0)y;%RC zJ-)a6x0ua>a7DRlGk?t15&A2AD=xhwh%Zml0kno>`fi+>Y1=|ya5XWUjW5T`Psrn2 z@;2ee5zdfG`~2`tdHQA@nCcL9m?**#9XBra)v7A6*=_n9a&64_m>;;DdB=yF>2uBW zedw(*{Q6L;0Ls&SUC32-PsC zQQtSj$P;LD;KH8*^*E~7g*!OzorRB(dT^1BJM@_FQ*Bq9)P+PJcft%r ziO-Sv_d`3;#%{H#3wdpOYpKQWPzRP;mBXmboYp>SBFNCQ7g!!767^XXCl56zxaMsO zJxaXz_ycX?<4Wwr-E7ZLn}~Kc(f*3q%0!vwg_U@x;05QjDD+qf8_N+7Eh4{5*6L7k zPmKj8DyA^FwyzU*YJmI1Bn=$by{I@AI{=}$NMmr?6H3@&9XfV=&`$%WFJ>qSzzqQo z7o!TEs0BDaD@Whvxj2^Ve-qcW0IXR^!%Kt#Da4_&ncGtXA~A>w?OR*VZ(gWxQjB2q z_YC9W8Y0yxXV9>sNsK1y8uurO%AHI_+o@=#az`W;eXn8!mFuIa43t#fFA7unj;NeM zLe0Ycv9g@3j*#Vmro{*0K;kD%!q9vn-ECQfZ4v}8d5nuVOn?^vuz4YWARt4q+b=w%+U}pz`uV8R(qn2)H1nw12Y2a*VyCom98JsqInfxJv z=ZK$c;2JaU6ZRXK?Q(#V4s^E1MzUQ;kb@YKc9fYR2S-9~BFNUCkSb_bm=B;XO%-1~ z9HELg334MtMk}p85|Wkn1R$FiYTL4OrIDM*{tpH>l=coGRv4Uig2njlnHo4Ntr5Ve zylWYpc8QskCOeUO7O@zGBe zoFgz4MPfLIoWqp>uUSYd-mzwWOk(_S8WFKsi3or4cKrO9M)xUk^D+TGLHl6khf_pq zEZ{~0tOB6AkhW8o($2XEKl70!dM7|?79Il8Sibg1kQ*6wh$4mzv0649rJyVS6h{b$ zD9})FII4!`3Whg}*LkklOPNvSoNDZT>65fK&X!x;BSjL-|tHWEgkC}WKK z@IrbdFHAO*qfjgbjGs(3^T;t*qd18~jYo>+z#|m6B|y&>eE*a&9?&p`tB~R*U|bx5 zk>jgI@#io`irjRm=^0YLJD;THfGt95im!n2Iuw?5y#j!m7;2;Zf{i8)MOR_~0digc znlT=Y;gMo0U=+CkWHZZWz;+GLY-Su!y-9#CCv zqeTG}(yf&K7==)pmMC08dP|O0>D-zrG(uuBfMsi@vj(yO&{MbpEXJ3j(87Drnkjq& z$_mhtYW~kdRKwb*nL+`Msr2^DfmOcF5_u_wL#ak_KN2+^P{>6(pkJ;LO;U;pKxwc+ z=|NC}i5OpC(cOVp;UMbYKCr|UTF5MM^cCedD1Z`g5g=D+Is9 zQXdB7h)bHW;j%bxy5AuE!GjTIOhK1cK^!*SVvv4G17usGh)a{2VkVFtVvw$sfb!EQ z#5MzZ6^elX*zVP(z8iq@8z4qI(nwPTBz6!WOMN{9a^MspHN`!^_(uX{sof07Ark-t z{JAB)YAGfX4{5|T-Z}bd6f+G3TOZJBObeRAHAdl&7^4;UiQh^qpM)Uq~J&F1Ds}-6e5vX z(ywg6+@vV*0m8omP&O&@xw1*oQ@BYTINW8E3inYIApzqZ21W{~Bu08NVLaYFMizxb zsz%`i#$rfQRA!f-OlSEIN-3`o%#0n)DtkYle#;SK{* zj7EU;YY9!BmFp8p_i->*Sy$Fq%_~tGa|EWca4m7g=5dhNh|c8w#L9CRfs`gRWQ-tf zh_5GGEygq^Zn3Z_FY5WowuoKk{Ix4F`)tC8`Oe2<<_9a<5VX>CoO)O!AhJ{1fRG#d zzELy+Ts9cNb3dBdP2U@Q+A|BlH1)Zqk{_*a^6c9bTWCVv=5v-d7hNAlv0WRa_J~>TM9_DlW(5qNgI9Ae~sif=nPG6*yctO<6ap4JzJiWHPeV)eX@qZp1g|6Sq*%NViboCq zPA?}OK`Bh9=K6hJrCLt~wqFvqCNUeHMa`T62J})q2|G=e@?Vv!m7-K)SeDu|2%0)8 zHv-{>GV5F*q+V>1v=U*FvO5~2sqh4G+d$A>>?r{|#YJoJ*P_o8S8S$4leKE!`>Co^ z5BnWnvGkYHnP(P~yFLvPW!J!*G55X}ucH{zN zI6yK0l89OLRBfJps5nGIa}z?#ajS#Kwg5av!EMKSWotPGfd8Krsm@28y2|upm%XXjqd(CUKT$azQ)9SU~0GnVS6$aT$`7 zNzeeiqFXvlQ3@TZmRw~3X$@F)^Ky%G!6`N($*zMH;9OEK_BpMV%DsNW(YKSM-y!~d z6&!s%DH{JNDuiP9h@5qqAh0L>7^W*8d6EJ0<4=9?X_f{nJHd@ESS>jz4hGPO$8N zD04zvnI*I=?W{ZsWY^9e>8xtyhY`+7ZhyEsg5rXeX&e_km`*)iva_lJK*|y%YRkWw zC80c#6Uwrw8MY2@ifReYKc%lAPZs*Nh=P7FWYeNCN@ckNbvE>yX|#g9`*jM~99X~i z=nY?ygsmWq4Heo-tv0<@P@q(j#cCaAFGO_^NA=pkM@P;iJO}D9AN$BBa5LE@&@aVA zBaY!Mza;qJ$l!t!%-aD8%{)o7ZxWks=Dyrn*^ER)2NVS9d4EKn+K!fTesI1}d#MGs zP_d0K4@wLC+TKxSFr6Wpo^)j#rqx7sdxv*~S2$qA>Oc;s)a}9fZ5=ry)UD}t>brD* z?ke?dx&Y^e(BwVhQ?hNWtwM`n2JKYcjvJ8@I=n+sd^;5z=vBwJsoT9BIU`#yS10dR z^F(m+KJ_MB=oZw*Bz5uuU7c=lCe~bGwXD7N4eVD@%MR#uvyP}t7rb>KSL8eJmTL<= zWK(y50^twc>h}6%JyE+;^V)*r59Em1WPjri1U9=7D!8DP9iZ57^GIT~b*_3dTzT0w z>fq4${fOUaM-9nAQvil}?AKWs)t91T_&I4*t=Fj!rBrqJ)74_T+LR0b#NitUPv_hO zFR8_DTJ_tJq~2K7QMMCeush>eOy&lQO2ijq0nj9VO+&@WM~xj85i_-N(*oj|tO?Qa zOrUL6Zl2nl{#71Yze9{lg<-Toop@8wrIte^aW6@*Uq&6X!~nb@*S=+(XO;zj?y-tW z_zVg+rXYO|+VDK|!C1NJ!+;84<|T+L% z6EUG!hgyS~kABOap@l(_e?x5_e{|41lm6n-aVm;{DM4D zRf1}s=b48YBYZ<*vrU^eqHpqir+tn`-qLh`Nnndx&2*^?=q|NO)y$Mq2fAmkPkc@t zVs=W%J#k{yw$QlR_Ib{+YQ8Jz3TC!K^%CzN~?EnoY(=PgFpkfc@<;#AQD}1{+ek0A0<;#v#OFM`(b-S34 zhzRv?Q@gCd|?jY~m@I;L=KQT^yrkGRZT~!#pJRiLaJ#Kxuja8b z2?72sS+VVH4t+qY8QWJ-St+6+MT=6xEN(|#EF)R)PuRhcDgsR%qyJrYB}&XgCiZn$ zxP^V3%+>2hZBkl-cn1mEi?t`HYu8)2A0uA3sO^R3tqm&XiYxI} z5L)ahM`={re5;s)6i{{x3KyuE-(=#0%`7jHk0dcJ%m;<0b3{54f@_$|mi53)4N%2- z#!_t!CXX)w#u!z37*(a+wazsr+v0Z7F$SC?L{_&Ww5-tUQwSvMv8L7@-bWJ2U9AJ5 zacrd0+r@1d(wLaXdX+^iONvmUT`ZId)M!Yny~Hn(psAhAmUXeKHxNoKMKqIn;iw4p ze^H$JcjThUVDw1wzRLTyMsIgk{vMRBeUdzyf3jLZeyn06c`((b&b5zzFX*G~lRu&D zlegJbAGw;bE_E!nPmXnzC5ep~Ru_nMs3?gM%|aq8`>VQvwuX&9iK=$^uM0iOo3^lF zn#Ph1R&tQ2u4fdgB^B3!s>1Kcup=F8ZbFJouEjGg(i$PI94(RJQnHScy? zUj#?KlpYK4@l1MINJS{rs)tj+Ce$~e)Vx+Z%*L(4=RlK6D#R2&1v~1VTyX-03UWna zG0Ogp5Ct~7Dz>oN;lF2-+aF`C^x_}&sE4aX}TC3{7IA*49f&Ql>HO0Jn)7S{7c}Uoo z634#$9SkCBZE8T`ap=Eg00tDYgWm%?BkS1W&y*d! zx+ln8yvaURvwf^)`&iBPv6}5;b)z{_peO;k9*f4IEHiUXg5kCUs>Y;q`7s8Bv zi@tpEIz1NHVMywZQY;}BU|b!7Ok94MtFiK}D+^;48!6CRn6qLpHAQx0VoYc4gs|FdFqIZCio_2uT# zq?`0WY76%cLSXJhpYcVDp9Krf&n+-HqDJu+K#)Woi;Mvp)k9)6m78CpPDp`O_q}$G z-EYV4^ZK%H((6V~NGa=u=xs_$YcCAD@YHAYgw!%So`VIca3}oav#C=&*u_4?yQ-+!+ip7pLnx7qd?K5P^QM=gT;kO&R*l)AJfS(}~@5wIq@Mc@N zi=EL2pW$}GNP^Fh5eqMoe})=Mf%uITvKzbD>$P3%M=;K55(W79S-!Xz5NMI)G$ZD5 z8-vpoQHI$S*g-$k3w`BIZq9~JqW#6j|i7^>A)(F3f8s2#JGVpnF1$r_hNtZT+wbGps`aEndaAjJ%Xj{HO>kZ09b+ zPF1i^lQC)&m&j3g8F3K-0*hB1n@)ghG(ePPFrUK9h)trH08u6Fc*rqw5!(As=mOdu#7EDU}uknv;lvEF$&+lLYDu`2PGjulHIFwyrse zh)CFt`|W+(#j36gs7pL(GBla91mrgEclB)#yqy@l{&}DYuJ@cmBIbh$MC3wyh}@i2 zSYWWIl`;<}q|~kI&WcZogWq#01hm*+_Rm=!_r@>n`1mEEz>%sw{r1zk2lTN~xGtnr zsbd0!BXkoC)S4>cq*^IYe-CSqb|>40(8AEKZ|Clot4%HkH;G)#he(ylU2ds5c#iOD z;GjmE9=SF>3{J=i9R61a_lY4II9ost*Q)pi6BkMX2I(-+i)j)gBem3;ivjzZyD;x8 zwFrll3Kg+K`VRz!KXT(e+znT3rgt{&inelS0&-(KMmq6gBRcQxJ0Hlwj?E`(!G>Xu zFh!y+R$-z-^@29~2T8ohxZ3{LsqzBix@0>NNzR#Un}1<{ST9GVg1*@ zP4z(k*2`n{|J7x>{%IoxhjcQY)AdiADx&m%7-gdM{{+^w$bby}SIdO3{>x-Sg#O=! zm3FOv>JO)pzvbD4t*E%jE|J&FU&m*UF-6f~S{i8*14*(b(HG%WI=WL#=BmKM6Sm^p zOKBlwK_+GnwJ?X5E}FzA$WZqnTE!4qctI^!JdcV(PsLLp1_rfhg7^zyN4L*gf4iDl zh;c}7ueiH_L9wDM-}ANiCh-DdfnwquOx_;Hp6oRFPRD~BSm7`9q=tUwrlD;^GOd+s zhu69|6!iM%(Eb!#kWU1qin*w0J`t44R(|pu)^glKY~W{Z3_mmETtc7z!&GYgIV8xpEJnUSTNJC;HFu5)>w?#rc?>Z@HHO_^cFK+jEFVfulL;MI-VMSLf+b ziW6pLL^X$6dvBmlj;7R_lb#F1CmZm60Usx-Sz^FaRC7qYKUF6Xw*bX4hZGxi(>sD! zJ&nTR!Al@#Mk?a56x!sm8r`+pk8&u*m(%h%HL?s^*0$pVO_?OndV{E#Y0&FJpt>;p zRR(-q{+g548n99zTh|4oK#7__D^Xbd`Nt5*n+k@(z7*(L%4m6uYSGJ*L0-^suFU+>W7-9PKVQ{!Q;g{ynS{ThyWGhsf-+oN61>?))0@7nTXpZ5C2s>#b=rB zGw|>C5q`366aJGIvyA^0e%`EmhJnAF@l%U1;a}cE{1Kfy!bEi=4wGg%f?2L$mOYqd z3ud{=+ca2slTud7COX7x`UiiqHpZWr&hu*iy1Vnd$)CVR;W}c@^ZN4CSsn-cuR7lS z?M~bdoPmiiAA+7UZ-N4UX`@>KX&F|{bB8kR-|jlL$y$nq#zucHaZv`gcO?lItz=w{ z6Z!j!rr!qkQI^-gwr0VPSH6O>8My^CLk1M3HpbxZPXiCN(JMYf;Z_IiB$a5sMf2vE z#KV-bS|lg(@@f4h(~Twh3qA%H-A?4`OE}Z?C7dG1%{b56+0+W=QfR!KC1>z{0#h%( zU5cUA0rgCCzwhWch6M|&zjwaq{k80Kwe!}<$LV?Wn4O>WuGxnH8J(jhTOdtmVk1|? z9Ay?DdL-IZ4<<6OLd8{ynGH-7ImTj!QWGz7D-=rrNP7VkYEQ2_vZ|O`Y~(-K*YQ~U zf==9YfcUUip)HsQ4cy|l)T_%A(bA2VZo7!@7bZhEHZ6#HZ{ORQTmXIi#o-i?JXnmvQ}QMZ`mV^>6zp!yhk z&{Q7}V1Ad{rB)x{+!olV_>{Ha+bcf0)wFk#Bws6j7O_8)@O23tqqj zS87%}RwrpMjq^Wv>lKtsQsmG9^)w)s0fX4P6B@$+j1s9RNLgC;;|~BGRZonk)R2Tsu;Fb%9gD^P-Ej>q-)=QGU5Cz0T?-P2Q=%#+Lv=H1(KuQMfIkbpB z?ZzFF<7Yyd=apUt;NcP&OrNRV(mre}K7`UF9%i7s0W_4taBUk;X|d=_wEC+P+XEYq zkKS0;r?eM==K{R+a!_g#EAfa+L>lwCg2dYMc@2p8MW15{E%vO(kGLHUO;ZYGasT!@ zX>75F4vdA3uVOR3*Bc=so2;-5FtF0lwe@+uF6o!zyqXCl;E>R-6qYdyOhF-#vA^oW zY4%||;mw|TPcj{vqKGf?3^jd>1}2?^2_e~YK21^x&=Tjs`7|W&{5clLGYdf*m$k}k z0E`l3&(tyve|6he5$&U;2|6^O(H;(=bsE-Ki~gMEo~Y>yaTNF$6w)*eTx9b?bchz3 ztf3Q(Ug4iecqwME`;@Q19MqpR1bzM!!vRM}biX8yucD-dBcMi_0cxeB^C{`kk$A+1 zM`b}L7aT?57789As8eZFa0~{CRPY!jwNTQd85n>2l;g7C2bA>0xL&g0DT1o!f?0N1 zu!E9TBdKN~dTdMwpk^Wt1Ew)ikq3}s-kgeg9a4d&6N=|!+Gn6`7WAymhrEHUgUU{r z22@c3zc`QTMI35@moVl-{)gW5@wnKHHvrp&^)Ok6)qfG*!c!sZ1!rqR@t5%iM>^Nq zdKGM87Ab=jyYEMkTr0*i5>=*RN#a*pF$>egug8&SU>wa1g!MG_kI`xnp)%X?I#E{4FV#LBx51H7=jO?Zov zml}mQb#9cre=rqG5>IHwq`X0y7nWCi*}1%nx|a9LZ{x|EMiLtGZUViqyf$6lE8tsV zThq1}OTIP6o=+Vx%lmJiie`)8RKme<~eyhA5- zY0rJ)%9}wF8uESydSQ7znzn@xUL#gshl%k7@%`s9@{+F>!!fZEA@BPD)SE$)XwZsD zdDqFju)HZ~Zk^Td+^*$4`m>;ddA|m|u)HHRZHqhLHDcvWH8Gwb`fH4v{4;k$ zW6q9}_uyw{c|XJ(nT3>ho6HN#I}}Z-GkLdmE$<~q&-j6v!ri0k07& z?{E|23F17Bag)5<$4)vcO5SfiHOu=2-oo-W%e=6>qtK+{$}8g$Uavt+!bj}9GTc~D zC}yWHO*?Kq9g8`D-%^Bvv49?eXb1ARyS$k|IS$cqP^W^BWf-M%Fv96ZL^6=lpP-0D z!$M99@Fxco9tuk|Jk*$x{yC*{Y@*@O0+j8P&H;*shl~U8e`P!rrD%9aiAZ0Lbe{S} zS7}kS;AAZlQ7>g@s!fYHj1jNGGK=*{1?LMm)gqoUCv%i%#E&$uF80E#((4*BOK1yG zFmp~Y(;v*770gtEnR6R5=V4_5JLzULB=5fmvvnL=#>A7oKW825fhXdHLvifUbU)ht z*wu}R=F_?yt)LOg*p5Ln0v0)^JQ!^f1`;!;95FbA#QJ?xWD2GwA(##yo1J|oX%d5z z|}44Yy)BH#FrYpR)fuKo!P9@p9o?1ogzjs1V$|X~n25JriZbqe+6)M};yO|f;(g*3hB4ifbdHo{0#Tpp8BWo-%>l!i%~ZC= zQn@FR$~*C>OpKc@;6%0?KW$6`31p}&BSw0^_@|t8hS5kS%L?xN1 z{0<2<3-`oQd6qF48rv6-%KT_5=SeDqOjLRil`%+A7w!iRtTIf-61-QTZyShJqu4BH zKsYFaEHE3E%J%`m!gdU#`GmV=Ib6koFBXUg!v#iAf!4FwKbVUxL$Pq8c6Uqwi8Tuk zfPq+p<)iyeVg^7$kD_YY?jW%i)$DcCPL!iI$J8h%^(-W1<@9}4xd3B z(M{vA9MM^5D4+=-p(pME2(CKo1&+qVa>UE^e;~kxF9Fc24DAEJfw6#mkb52z{R)8G zK5)Q>+lNp5^}2}mq2G5s)nl}e9Puc_m~84yDeT2W9Zii!V-~9IY^I`JdQD3KI+e+h zRP<}FBdGj1n#y2FWg{jUbShS&B9KtCP`mruOy!GfBV^HUzmA|%&oCxgQY4kzO;qT@ zIq@)4v0)Efl*TF|spuDCM^Kp_P30^}?Sg^rR_CqW0m@tZ~m(edk{OCRt%bf5ek{;~WW@d@{tlBaFLWVyeTAStc#H?>XvrhO%UJ#<+NarqzlJN%IR9YMEfh&u=+3$D1sf`2VR zQjW;q)T8n@?Hl>)X_vo4kIUcTC*-3)rJPnf!R|UUtH8-Bt^O^&TkSjY$<4Q)KsNsB`$d_3qi44qm{inJJUlQwTY?6^YU+NK-|iJ~@zJg1?! zDH6rg2&&?upkOHq#T^pGV-#g+SU4C5C+}FW+SldnG$VZ+8DZ5*^fia<96>dTB;cly z9XB&kY{qvKjo8A^*kF7q)Y-gzGie&b75ETs5I|87FfNV2$k7t+|3IRKk>W65oa6yU zddAI6dq)z+cQlMsHHehVKFq z98E|J6(ywSmn2LlCT zGh>uust}We%DiMBJ7_pF^&0yt0!`!)n-&{1^o~K3FqZ~4=g!7W6=H}0@$PXDIpg#i zYaNA1ELm)-&^xBev)?3$oD<{f#>T)lJiGzo)#D&?Ch0YH(sg&LW~X|b|sH(HD`!kV`mX)wwhS2SgYwBt#)vToWmMBRZMqBPa!Y$DREC`Z-8di zgNup}NTVaP9}&-VQFoBRwu|^DFg~y0Jc_t4vkMmIX5J;SVHid|Xs;D$TnmkmN$wOtEJXDU! zL(MXIsM#hDm1pu$^EeN64M39hSkoa|>BbzL#pEq^LuLgJ@ha^lEqo!XfPUX6iKGSS zeDDnNsYk2SXJBfH#gRKX^rPpvqr=@`bGkehM3`1~T9sgQW?if!>nyOZ<4~cV`W)A$ zS69NK{1x^PFQIY%Ma~nS0b8V1EgfSx^ZD2@0T`q|t@=nG+hvgX+X2l9Xw=0fpY-p! zoKJ%8LP}>#GwNsM6U$|MU}E{dj*0azoQJ}Jd;+fQyV0bP{cY$oHc)54+bk8Ck5*Y)6Y6oUWZO*~! zZ&}lYIG6^r}TzoyYB`@X#(M&$qu|F{;r1m4i z<)tg9Dy<#0Yc$Q-SCTrEFCG1yz8`u1N9OFSFETTOE|exyRlH-n73)`_72PyYX&RgH zu6>Q=ATVxhW`?;a;cILbSbm^(oKgD+hk4kjQTv-lz^GCCpN)WVM(s0RMQ~s4l<*by5_nCbJ@I8|EI#IAoDx2|X96Ft|0R4p z_8nnI?kTI zfPjCQJ%1X=JVyJdJ%6+lM_tX_kk;DQgy|l)=QsPa?+bv7#Audb&)*IxF?zL={R6># zfCdO4*L&G7jWW{N8<-G8tS+(Ue*lG!sYN2&K3WT6Nw=_#2#8tpV_?Ls`N>SyAViS+ zz^GRHBb8faG6>uPlh_TaJJ^j^ST5BbT!H#ZA|Jt~VL!z)C&ht>s4yK#nGKFa4J3@E z{bvydXr$;yZGbky>k5q;_zNRDRu&G(mMKKOt+*a0*oY@i8g?u={?p6oropsBr#-Ug0It zv`+=Nueb(jQM{}q7_4?kpDPcNWvcQZHywSDn^^OUl~it6%ACIkp6(|DQu?c6D=?10 zHo#V+bUlSoOXHowD#$wK4R#kI;x`}x8CVTkftT13S}s!2>BW3ta{T$(B*cvFw2ebE z_!0R0b3SIBkF>WYU!vbe=ZoDRa>I(^vzM_y#r*x_CG)p}wCw8EvpYI@bD+F?sWXuf z=Ct8VL@iwp?Lsb(rNIJMA^JaI@g%82ikigTg1}%HGQ65mZK$|PTm{#{jG@3BF|*Jj z_^BJw$!6WzOm4TJMV+pCz>GCaAeHGE2!dtBG>#4x*fXfg8|=gL7E76Xz}c)L5avLp zCo^-Ty@6N?`@v`qwTD~7sjJo+9ws0MNiAH>#~C<3SU%&ny_Vz72f@Wy)F0A7Q)d}o zDBK5O5&ai9p)f3>^OU*nV!L4xU15hsv`gJ0C|iX~9aGFY0o3g<7sZwjrBXOPs3NiF zt%y)!Y(pjy4#gVh8nmreZ{Isq3kok0#z$bn!qt%l>gKPr$Z-QqxdrTHqEbu_GN6Y| z**tJb&B-1C`{8JlYK1Xva{a$((;X;tY?~%jq9VUY#?;GJJpymtw_?>2;#@CU;o*)R z3?A)v?Oxqy_%Sg%Y+8iG=7zT)Gbj~7<5#CQ*f41rLoN3UR011rb7ufD6^QK%V*Ku9 z&aD54%rxOPTs+_QAYydB8HdoAZ*4riRm$UWD`_Zk5!>snrB-%NEDsMij|x{K5Hqv0 z)HE84RR&M43F?oc-X&Ye$Ut0Isg~4&TCJu_+*a1c?uTpKtgaMcSzjU|VHs2lU|C;M zJ60)vr_#7ZX%v;l&2V+bq<^E6h@F+}1&BwH1yl*w$UU(Jz4DhMyf#K9us@>7o_`vh z7c;|ukjBNB%j7O=hHsEW`&V5i_unzN=3C4_$ej)l-9zH0TFV#c5Bs6rDls#BO;|z zQ_HHT%$l9?AxmZv-?bxUo;qq0;XF#mrHxL|+# z6(&a|7gU(W;xXI*4+c^3ZhmDnmtSe=8c8E>XXR6fqJx?{Tl^rQbT38BdjJ<9;x;d2 zrS-mo(dB)orXDryawR=XQqFFQ&Xwc6c_Uw zFp54p_A>kil=5yR4QZDt3x1tVIfw2`^oPeX! z02EJN!TKPQlW|5yqZ|q={1E#kB(I&0-4O`N$DiPFk>3E4D}jTAmY1pje*kHAbAep^ z>cuf`1L71B<3DoA_=kNbXcQ_Xuthi(1BowyFmyJGur%!ys1_pp79y0)IV=Cd2QWzw zW)nZcZo~m#4fv1jILk_wbujky8P=YA=vZ#dcw}Wjk2x5>+}d-@U?g;!J}fS8?Kyrh z4zLe^(67i~m=tp4!laPK65EaQk4vmQDTX?>;&$qIcE6z!IcigwN4SDD%etCzEsx`x zUO-X&MEe?ri)^OSG0aD4ANT0@Wwg)1XIWevvELy)Akcdzhfd{AS$a0Yx$txR!>=~NrY#+caG9+2YChIZ zQf=T4{8X{fvr%AM5sJ?uj1%vp+A5eD4WEaZPZ9X_vK34E@_49!H~ zQrMp1k;mSj1d4qQW11>Kf6m_xYYyzz>CEG6f1)WOVXW{6+jf)qX0IGF_DAj%4fQ^Xx~ScRDVg ztGMlsI;SC0E z+4xwYEkObu37S5p3GVz|#LvEArd-IbGg6kpr05t@7m#eoMf=>Ci&KDEN)GPKFd!ty z`MW!E?jUz|zd__|^$5JcnbEJuLT9N*Vqu1-RCs5{$j6?6?hrs%t!F<4`q55No&OB% zplh=ri@{};)*xhU`kR;nVr5+d|E$p8BrnG}Z6m*V1*m}+(MvU9O-FBn+(|^kg@#er zEkys6VPwq1CM26|_>mzKdyfa(5RdnzsBi%=>N?$=(?dbfj>#QHU?za1b0GCOc}S2B zsU(d>`Jf=TJLC>WkH>Oq^}wl8q38Wms|Qb&+Iu$Idv1&NcoGOY~>j4D7dfr=w0iJg%5S4y~;ugN$^L7uKP=qFsQD-)4m1R4E5URIJbNma{ z!gdVN^K9L=$jW$&s5_C?*)ogR5HTl*+C{V)c?$q(Hnv-{45VncrORFL8sxGACuO+f zbRJ;mp&HqMMotZApK=H7kf=1&Y6alUdNlVSfjJf-L?W;Vcvwh*$P*9Dra%*W9CLS& z9_y)tJ;nX(36tRq@6@+h${eyr2siwo3}<=yT+#NbaebJLCg9X;&Qav6M?2O0L-TLp^!Wbrxn1=JnRz9 zjHuTgkmNt;HUQ?Kjx^(P)Q(($N1h^lW#a1~p5(Z17Jpl)XGGzH7EsbvhEy(1_@=gM z&|BfJ(lhLsCDcw$Sm5>hVgb}4G&*MIX{CczJ}++gH50mg2=RMie9r@@9Pj~v;Iegk zHKEX3H5%oD&jEqp0~8?8t63Ekh$>?AEvWF5BOw!3CZ)86yp_H&1!C_p1|)ox#nPi( zDo_)yMz(Zs)tEfUFs3w0SUG5Wg^H}GBu@xtV{)`5gE$uh(tNQ%RG`XNIR+Gx_`H>) zHK01?@b-qh6_;sj9N9U%IBof01(014gO9PT33I(b;-%&CqRgTR%_t?^i@-71&f!f( z2YSh7Jj?7aJUE^~E76!DxyvDk95g*T;pY;8s7VoSt)QJR1{uJPj#D&@#wl(f&nD`D z?DK5z*hVn;vJtj|ND0ETD6EW+NE)3;~XM#)5807cA;0~AV z>ih`aYoA51Uw_jb+S`rPVomL1@qkw;U}f#@c)(E#SX8?+9&nNZX4h_r2b`gRDYbXR z1E>n(1T=duRVI!sRUb@N&uCq1V!PMRi+Yvu0%>pJ(1szUI_X8YzD>$uXHMUq-RjY!nX~195ykTCk`*-;ps%=+eN45IqBsA znFt7{X`TV&v)za%I26W8QDgGOdN@{;tJ25ryr?k3PWZb`4R)%P^li1;kw4^qN4!&Z z&)QlAFg~xZE>F*J8L*f5m2HBu&F)j@Q}gsU>#WKWhyJGa{d7$lc=E|7Wp`Pf^~rV0 z5|^?qr)H~D4$Z246|ImQGS2Saq; z*Y^|#ExcA^;blMkEgxRk9U#Qc-t6ZS-63ysSmaGEi*o-X=&G)yc3e(EmMV7e;h(T{ zgc)|x$v#&6EC#b-#nNS^bfFk9h$=kLJPE2$W;A5RS{X@a1v2W!IPD@-y^C9G8?Xj>|<~0<87R zfju=A7^Nd%7Y>ypcyo|L8@X{rxq8HsW( zla42%E1Syg&I3mwSaBX`r~T$6wWIoA_T>u>BE3LJI&HoDM4x(swLuV*uoe<`e; zMk6l4q#I&bv*-5zkuWKw0h36kNCRC-PXYVpRS)bp*x?6(SZ!rCd*^3ZL(8MOwo+in z@eVx4j!q7Tu;2;+U`$23MM*+{1G{Ohgm^NMPx{!5bYMoxoi3lAu@m9zsHgo}BZz;- z21>Wm&dPs^6r1e$IV=d?j9^Hr_s_c>bzP0@azA&??N>J99+7@+9T67FD>q`5{HA^r zjRiQa(YIshzxNYVb)~ROJ?8w~l_W7p5b7u54gd$;0pQ3@S|*)?Y@m|-Ks$`0&@iL<7%VoK#`9iReLsU+h90VDYuE?T&x3-&)f z+6B$jtS0OljlsOI$sEkvKI2F>#UzI>oe|r{0GU?_APeI_er5t8viU8L(6N)k$GpIy zK7VivWH_@k5t%`+0X1y^5A~DWPqF88cWzsBJDZ4D-gF~z>I{4y!kt`_kUtcjZDhzz zquhJxU&r|b&C#kDaBw~cN|Q)11*r6rG9btwO-X^>hec_)XG(iuxTh>s8^nNMcTXbL zBEaEDX?2-wAq*4u@QTUV#>-xU6~dgXAfp8j?ZgyMbb~q-`Ef(Z2Jkg_dhA%f)Ne=C zd!l+TmTg*PRtFvsa`ayFK@bSUhCP%)@kB7(-A4pRF<^{R3ufRgTk()3BYZBAAqLNd(?f^6u^-)I zS3HA=>GBM;PPe*>l=28Q&8%R**3u7*84Uy}ssJHkZ_PptyD>J+c6S^mm{CB)k&(W| zrEh^EB2la@#89vYvZ?Q~&4TBly7I;zaGGbnoo#igo=nBli>$a(MfGGU9;SLw-F|uF zfJNRoh+hQ1D3TA%M{;H3pmI+nR=Xap1;?&t?Yca#62pXEP&`L*HmZ0|YM!IGzs0WS zvCmLt-CG+7$Qxg^$PH18cvZaj)asr%VsUEj>4|mctAu818ey1vw@8qCHxUbj`gRq8 zspjl#xEzPN9*4e#aEj*h{{{y5D@Vc)rgJ19K;D^yvv^{lBnJ!AMui4VmU?%#{_RY# zi71q#3gd)$Z`jD#)g2DC2AqWgM%@#wFT_zW9QrFaqP69&m71`xaD^;rg4~ekF0(f# zQnZ8GjnU(YA``)BIHG!@YI%Bz@=dioQ?a^B9XkZ~0Jw!>zyXY!b%22OzG^fWw~aug zw0VXV3y+pxo^UtidA8Z^mT*iSe=bxd6zLg16J}heG@9tE}L|cjww%zh7>3?QO+N zSK`C?pSgk}9>E(fGQ``@@Mb~S-pBC5XV;=L-$f9xAYEas+U)EcP~AYEg1XjS%>wvR z(M1jRz$WKDr*mINsZ#D33cmM`pjhISZOOQ}GfCd)fTBkJ@zS2ON^;gYs+Teo^@Q(?73O4&sHEnXSki=tMcs7>x_M_@|3+?!Aqo`5hn zRfcaYs)@AMP3cN{7F3%ZoQ-O27Xr{!0LMy>aszc!SQ@3~YbARFlP%8C{^OGfH`vNo z<9`@CeqW{0HZ5`goj5+(X}3u3XLVJd&@O(xEvcmKhSGvV;-|BV7hZGC;oy7O2^~W5 z{k`Kp3wp)l*R*Hp&X?Q6I|uZ{LqMmzsGX3y3#MV=i~&83!s;foiKugzz^5YjlAVA0 zVU%+Nl{3Axphx`FTgmPuboW3W&AfQSvmhk?75M1U)t=R<*aMj0fSk!}8UP}R8d|fi zhEINKPq`}<&gJ^hd!!lL;26`imCqOd;m&>8+A>Sq^%KsvC5tmq{?wAvg6P(yf-^f3 z68=^Y!CMdBItva-Y0IRy@(&jrayI`npuGTu>dqgK@ObzXA03xz?bT-W)KgTw+<1G{ zSMu9&P_4HmrM934uU}pSMGvD=!Lu13TVEOorq-xaj;Z z9v!AnHBFpjbF~S@axdpgOT)*V`))3kN9L#>i6C~ll0e`2r(-Z2b%KvQVE{y>nI zy-LEziDvrPTi6~1fF9=avNw?a?IIUMKxq1_L|f%Uga3T0VdS4Tsh*MGtBy?|(WmZ- zzS}T(>Yfo5OL0|%7%prdFbx;grLfr`&p!4UZ1V!(QpCvsI{9XhkrcKKF`$I&LU{iU z-UHB{(&xX3iGf>g!GXh390)TGXPqsr=rBFw3~`axy+?`8{Rb*W@D}c&&-}w}X~*#7 zj@vutP>^eH5B@7@XYe0ROl=)|PvVVTKZEi~DePGQfIMLCd%_5l|`fO58nSJL-W;Bb&f@i-)6FmLu_28Afi5P`8t*Hfb38<}h~uz(YF zofLy@=dh6(OFJ#ysN9}Is0gV|rUBeUc~Lh$t!Uf#fE~_+{su2xDL~IC!s3K!P^Wth zriMhN4s)f10NbJA=Z%ktX+HKn2fW*P**+}4d_1ILJnSpQ2WT{T`rDHUh-hkpezf+H zqY!Te@sIp7S!(O)(?Xx8@hKm2g)m;NsF8y&f*49663bz_3OwEs^0Qyytt|Fi3>7q__8AIzf&%99fR@v1-~g03-x|KLR(NgnjK@)dnowOD zvtN&V^s=76@aY4_!m%waUSOvX{ty%54s4vjzqA||OY_^?Fg zDK=`Z)VGjXocn8xY>SxMHgSPdy1k^dOq|*_vF)mYW0I$BrM1m(#hY91!l_$=%o3#k z#I{rImV0@rx#xZ*-k`3Gs{SZaxe7j$936d7qj2FXq2ROq0Bo7kUV{Z~T?nNgg8rei z;E41=nV4Ddk1aC|A)mKzz46?Wdd`nqXM=U``XfckeZp1;Dr)Q2b6OtH1;3c1{S46$ zg+DfcY4r?n(0NB=2G}$J1ap14Ufnz<5r{$@vgczU)RruF< zs)vmi02@lIJbK!f@c)Zs3vG=w#7DJi^MRYQ-dGJ?-~5s3AV>h?8C#<+Oh9O%gqqt z8OCA*sEDQ2#BWBm`ogG*|C~|$r+snm$tcRr{yIw0hfe{^N9R~wfEDYH^G1KFVQ$|Tuv9NIezcE1N{~P1*xx-S<-=prq4sE< z*;gOgpTX}ee*O3j;upnFKqarDRxN!H=PnOr;fbTOhj9G= zAZ`$O2&a4xLL=xQig)1Yz!QhC55c4EgHTC$2pgcW{bJxJ5AX``E5mOs!H)Gyi4CnE z(+~U`tsT<`XdBWPVdMIZ2*@V6(4rM5h!ZxcuA-t%Eytyy+>T?BvT^*s4`Fy^17rTs-T0lRpRm$}$O zVRdVr*qC0@`t`6g$F+ST={8-z`C$pQrJ5<^f5^L{71kn`ghC#as`hCOrVnEbKx-`6^krT*uYt(eQSDCAHC0^e=SxXzO6sE zTRqfbRo{cwXp!LMdwoAKQU8zW|6I(a%hCUD8uTC0oc`1ES%jUz&w`IQP5(;zkA$ET z@w6sQxtRVF?90=CBmXWuHsiMezqRSLi61V&`)d4x_{HelAya z>HLcb*qYIF{s^8s(pUx_T^2k3BQZU?ELR#I^KhDo0zxd8zc`3u@Y8N0T@WQc8y>r&*8QrHGW2H>tNh22SSW2pTzpqAWt}Uw4L^yJA*e)W$^DrS2x2i7wI|@7O6zSvskTeW`9pnM z5K4Y*e0b&`-`|7bRG2A>a(mw5McrScu?4w;7pG1|d@sMw-RW$ZfwXl+@^!RM(;9oA z7i&wQ#Lhka8z>t9y7T@pupMmp$l`3K5vP@Z+%~ECxN%*Ab6>IU+;`l4(D?wJVh3CK z3Re{Vh{W!7MKO5VyxY$`-SIc!H`>n`Diw6YoKBpLWe}_2bY$~+WuK_aj?)Lozy*1IRsgBRM^^qdDxXmLl;%Ic=u8z+3QrZeP@vOz)^fZ z`D9=(wdl$4?Er9}ZgIAdMuFOC)X-kURfe~IQptXdj7D08ujJum`8t9P@dStT^wUp= zu?=@&V`>qd>`^3VFX3O`ZfxptZ8AD#7LJ=Bp28S6P88+qcxpK^B0<7S?^IF!x`n{H z9Qk5=;IrstITDqedyXREXmY;T&v^o~1;l{~;#D$B6CGuu4SdXgx|Srg{|f$Jz*G4gjG#R=G^CpP(=q8ZPruJ=aBaq@-~u1`hD7sUCI+sxIk6uN zEpm5m9c=S_+Sx*1*_e(uSNgT8bIyGez-ziYc1+Ff)?VaEi}z>aPdx=<4rSF>xaR5N z#chjq2%L}Btby~Smj2Jt7o0ORiuNK1V13>?E7Nbmc%(Eq+%RH&@o1mPPTsS?Oaoh= zi__Fv5`b%i?erj>d}u9vRcKV?CUp|71QD+^#(=Bskwhw_^gb&f~Z3}2|Ub*r6^u3Ixa(sEq!yBd3c3jMCb_aL_8^90*Lt=T%`F-)OVkWpy!?DZ2{ z4%c4^z0KWjqzF4&4mUvP=+x%mOLJ`Rc+UnA7*qxx9UjR)E=Mw*KR&1)Bn29>mw|^G zm>=QBS_4qK0SIOg1gPBrbQWLg>vtbsI1bLjad6rxO(`_u$HDo{I5=e9^VM*qdNmm! z((Ou>y?#PVJDPU9zBUYbaRX#M4ePkf?iTjjML5~*%|j1)?AYr-Q4g)4Rb-L6D!b+I zE_=f)d1tnz@!CCXOrozNQ6M~#X8@hx864Pc41kIS&OI5n$=z@_Ves~J^p%%?nl(dA z*D|C=8j|zd`}&Yc-cUVMQZ1P;Pm^GA05`!qjwz- z_TCqK>?{k~^>%kM!Ju{g#&Zt@NI_ICmh7?admT3|6E+dLUR~ zwG8VA9zp*r#aVZ?2Y)-F+XirlaN+?P6KVzSlU%LU2!)dyl8WSz5FSDhZU=YOCFiC; z0MS)C2ch5$&4Q}b)GdSx57nvjfD0mRr6Q9;m16r{?E|0a0FA*ptmA=tA=!3Jx$?$xoLJb^^JtHatT64=QbhZNh7|eWLOhKW zbwI)SfUN}Qut;*AQrH{pfZ(&o69ix~(cN-bDYrLHr<=i(Z5;umReYH!!dgNnv(}O< za3j^BhVwjuw$z?HK1m7Y(5^S-_UZb{bf|}Pm1J#38@ozesc2-FGk+xh_M>x2-;Vui z0E4P86KSxS!=`s)CENc2f-v}?m}JR^fV^)Z%5P%ngYee9JP038WnUwy5*Bw7ag2bD5!rJwyVtm~Cjg+{=`F-MCo6@AsN zTa5t5wDB;u$6zclV4#jaMI8g-8}O#l{`F!8D}K&F3>JZurpk**t^mH&$9{st5^7e9 zfW@URLL&lV2;*2C<1*8KAUp9#R~OzQCbFdy&@PXCs7Tl(PL~@6i};UnLzYFlt4{ZE zO$rCg!U7IqdDurvKBBj&;M?2o>BRxY&h+g!sAXB|GP<^Vs&ije4!G`YsB9S-ac=JL z>c=262~UryXyuHFVkjAKv-y#~sT_e3;s}yfMiC?|y5bqAx8tzhT`bfmvj3Apw!fHF zf1>iuCQNg-EJy#!jnD!8hr-5msakGC?fr~c3VG*dFnmz2wXn~U(abHI*@yHj+EQo5 zah|Kw({E+f#ykn&e4+p)6awOTsu)3Z5yVsuF_B$k#`3cR#5!A!AstdUTe|V0HVhDF zs(GSbKW}a(yZK%6o|&%pK=Z)uVNRKryF&M_diVE*T|3kzH1X9X7=X|~Y22V|NN0Vl*kKGGCDiGk@9|ck`8j5caxQwdb`C?rb z{!8D}KqRPK1$+arpCu8lYc1l8ShmqTRDI!X!b27ggSM#+S(+y@4oj2XF|dTy1Xzk} zTjjo`eu=wL*mVmOy5NYaqgTKIMA;w)SyJ#m9Hw7iXO-JgF{&XpIo`2Vq~eGgqOH`> z&h+rFYrv;qQ6h~oEVJ$6Z9$yKYhJrpOj{u+sJS~tm)v28lb>6#O{GnhbnQ@5f|xjz zY!|ulm1@CFZTQ5EWKSiCDMQH#{PYY<542T?7{N@@BIC@aY%9bqd(g`kuX%>W73QEW z$3U*sZFWUEi{m=ClrC05`=c?@y@Q7K0YV^l8{j9@r2|w+M=g;p5Td)m6qD{>_!{&t z!$u6}JnBY9K>$QR0TJ2eK_BmI_+OzLtd?|19`?BVmH{8otv4HLd$X0-xfnuvdv88 zuf3>4)2*CP-YD+^DVf={E1ih01k->sV1(p`lNNCzTL5@oKl=m~g&-I#2xh-YV6T>U zBH!euokqS1@=i=l+@-XdbpMSpH|xug2qjI9M4W0BV>mgRB@{s8-r0ON-qd0;`EFiM zuT>7M-UU^-sAb4%$HARs2jjjylX(iMN|Y=Q$?B|rwkjTiyMdrzoryc>%F}7)c-c=8 z5(p^CeVi?p(ub0);_VonfVC}?oiB*NIt!cd_rd8qi$5g7;o%@Ymy;Z5v2 zv2;GFjTHMTqn69`g;DDsN)kk{jL>KG5|}?2V35SmX1|54)$~}*qhn%HDJGHi6TziP zI({}%_hI_>ZAP@whXt4KL#`%C^MLCjPvPqz+G9(JFQ6z`zV1ef>Ht(f9pFXJfUZGXo68LJ zy+Npli3{pP?2t(v5u7X78u3Q#h$%+TSdVl-d!~=gBYf%^1(b26pu@-^X|-{>&wdY( zdni4*=$ME@_$`zujYHt`r>n^81+&{#gbM+%3q@@+oDe;Ih& zGjK+VoGFi-xo6<*YWB8=ote55QSbKte0w6`9|qMt9IAZ=L52wws*q9pFh0>o5p*NI z6M?m(p}t2^Fz-R<%Sm4LTdbCHWMe>_T_VSIv|diat*oq=c=P~tv|b*o3k7;Booq{M z#t9uxw9kS>u8%;(tKDt$5oPqwhSI?$Jv)-!4c8kR%XRHm^9dCr{l1%wNXS` z@cc&69z5?6ZAIY^)$X!jL7w<|flIQMwM{C*$y%#R8sa1VZOfUd`;De<9kV`ERLBjm zxsYIuMJyLP0kVc^4J|ZiID<=w;yT>JA?UL~*=#h*rP#UFpWHu7^YlP&^g9^1XDVJk zlm~tcy$IobK{ctErIT1loC4#mYKQX|?F8@^f@kaUvh5%$&{@7^j@l(9btcczO07uM zctxAns+Cz=U22Dc=vF&)3ac|~+kpn>BOSJGTe+ix{bDBA?P{nOsokQj)9L{~Sxi`5 zsIC*1-LsD}5Ls{)-35 zEodHT@m0IDE%2~wjt#V2jnJUMhWSZsPLTo|0&>jtSO+A>_1C*Y4cB7OPiRXng^cxl zcIgP=$O=I}hR%P10MQ0C!w3T>$Ah2$!l;y~q%JqOHi~oc-y_b(|4q_lWB*F5=t>U3 zQ5}ly6}V3NJWTZPq;WwB9Hy%}#5WAssb52s0Ou{Xzd?fR_1T7ftouD)opm)hjGs>i zHW1a)0`{gp|D^dmWImtZPbd%j)kQmz^5w@7z*Vwxn?@*;IJ0SlGKo`~MktdwxoLzl ziK#GM)Nf+vu*e5s6w)-Zel`w24(anL6{3uy@FXboO}X^9jO_>}tWRDDWhBT0w0Zm~ z-QtI3NAO+n>?Fkimp6&s0po!Ho=1QOh^hj9X@X%fq}&otVmqm5#M04Spay(DH}rwf z29p;B=muQF)}}h907iOW#BdBB1RHFT7ODvgtkTz^5q$lEZ&{`5CY%+g!WwHqae{O; z0w*o_7B<;9C4(=731_9_Dn?A`;VJFMdW%9h+dW7tIL_G;76V9MF*5WHA0#$Id}@=L zARi>y#}RsjU>^qT4!I*Cyqg~jwnMZiO$I{^K|*nT0D|sacgXG8FeQDNG^hQrfy#yj zSK-ule5s4l@h(pE>2E>B_)i!tP_tYE@wJOVAcOO$02z2=t2~+M6dAT5C168^g3J0U zpq!2JxW@Zb;08rHcat~{#X29_Loe;weZ(bVW*;Dasm|(tcU{AEh4V@4w=oq8mV+RW zSWG6E`ns!Uc48fY8g_W2nn5bOYN#V(ckb&RT6&u`C^~~1Cs^tdT0QpG>Xg;tl;Fk` zODi^mo!Ag-<DLbUsdGrzHjQ}aVl3O6Mz-K7rB<>M5J%czL%)6)lp?TcxWr+%`o-_S=bd^>ZUj_a znFv2K%UX10r2x}3=%T)Zl^?qTi0Z;O!EK~?HI%bM9p@9}-s!4Cd;A`Fy%E|qp$VqF zKLa))%E}hg>Js2=k-Y*=5?KMft=!&f52te#pBjSN8i!ig;HVLkFbrGlTm?96 zcVwdp5Nw+Suc^NbBafup4Y1IKZhiAn8^lJxW!tQgv3TiYirS`gS4(0Ld&{bj!>p&XJj2oL*KYUV$%XO90W> z71;Z{#*5HbYP?wcZox~iJR0nqZ-gZD&8CnGUz28XF5okKp>MFKc4}7`Nrd4ZeD;y8 z3l!R&FTbJ*L2YUA(QuzqHPH7VSR=|ljb|r~T%LWvshuFE3H9$gf)`CtC?~Q(px3vb zXIdtHJ$Rv3%nn}IEM5`3u*2E%IE9ygVek7X&l`31J!rgS_q9;etv5;O!ClsQ(!|nI zqzeM?eVY-XR2?-G(SaONC0kmI>2Wm<1tAx*15sYK3#rf6~Rd)W%aV9Scmzv8pI*d+%8WKRUmw$%CD6*V zc6kOVsR0Lq%DxYP8{SZuEzuAV^I<=Zz3S{C&lh&_D(3;qF~-g62F+&n{Rd$avK>Ok z0ZZRreD2vym;j^N_aJ~vj^KswNXcjw6$NWHU3wMj9}wC?2@JQNE9LvuA_#?Eq#ia~ zq@`@0(3|ORzW+FX<43`1~{R%oKhzFCQQy|FEI!8)FM_RR) zUI3ziVaU4P0oCs#agxmLGTg<>EYaEga})qHHPb_^pb6Og1@e?3?B5Z_XC$3;c6m-h zxxx}&NIH^z&mqLGUSN{fqQH^EMj$= z=VYhn?|DK6>`#C_ORFawE;Cb59?^{^B!uVlewl(EL|k@2OxdKC_roMUoQS7lH+#Kr zCiMq~6~L2J9{m;+F;%cN_z*FHa53c;XW)MkA4(3^P2sSrel&a?dy&6C-yZ%np1{t2 z#WVJ@U(hrEIK_xlT8{6!svd0Wwn@W1@^Od&hW|>KRzDBJP*we$%9U*L2e42aur#EY zy&o2^ZyZ)TQ@bR*oyAalo~s28=;Z_8c#|kbbc3aQ^mh2QQ9SKR)giVQlwX$)!3rpp zr%UaAADcmI!G%I9r_pAsKB;;l5T>_ghW`TqbMfJcp!@{L;<3V%M}mcU5^d$ukf;dX zoz^@=$qhZw!x#jP)avL^s7SnisLLuQp)2Nu(}zOFYi>AYD3lGm#R8(}&?vh2pWT6sUrR_#2T^%%L;u2pE;QDUh%q12^8 zU5c12~w#$aWokx&@|r#Dhc25;bj{ z0WLh#2aYTgzjXEtajb_N@+~^tu~33tWG_Hw7!EbG9LIv~jn^YH`RH9l9>gqo>8X&E?r=WeKGU!qhP2HN z#>bGP!PJ%8dpVy6tlQOY+G7B82Xx8z9UEHevj*3R6N4K^EUo3yR?io83B>$;f%zYW zltU}WaSmCq5c?OUvbSYX*>v`ja5#jTPMGO&kRg`&M+`FfbysRP{=;;VP%-=-+#pmA zzlU=x#13!BNw*nq@7YeQF+3!2Wv=`ozYl-dp`omN9VId^+nA5R4%53V3|len0BN#t zJ}DCZI;rsTG*f3`Xkv!o%niCaIGqn-cwzF;Cv@8=M#|8*s%q}uCBHS&56fmkm@xmOIajqNWSh_yjbMx2pF~nd!NCxEAa{ZCqlnE zw1*-zN03((HvaC8ZRD*?$n`p!AlP0xFZ3dsG?K!Y~39Vey5F7?ygdmZYX zQTbrh-|>+Xj`+S8z3Z@mK3T3bM77=4rKp)wJ*a?Zbxa=Wuwp%yc6FQ=>TX?D1B+bu z8{2K*nbZ}N1^0@{cBu@LSU#Vw!$h5zcr)&*`*^XQZ7oJQ5epVJ9^D% zq&8E$`0OF%K%yi{bRV{elkIB#WI^Gt0$%MlnD^gjM`hFt9lEee)^FWztGl%ZV?cfn z_38(Q2oSkdu;GsK8Y)$hWp{!DDtBy8gn6)f#8w?uF8}~#cYnS;LH*qQhIltfH^km< zSVYHbPgE{=;_tj}$7kFzTKh@7_GWaf_Qz*DGOqR&0tabVmkG*k#=8Jvx^kNxri*ez zzeP&Hj>6fjpcHHdG{^Z^N_s~!xYJf|6O;-&{=09pOW$r=ku1o1c5AtFq@xw@+pY^X zIKi^~iR!7oaUu+)rCc5V(w08EG$k{9BTwYgR`v22BUM1acdU1sdA(B#R3Ozepj@M@ zogCHe&K3+C%N`nbbhz>^RWt1=d>M0~<2|RX%<(50_$pJq-N zcs|ieU2MQri(DgRON<0%uHb!3fD?JWFv3G%5Uop_;ftNzBfQ0f;51-#e$c$+gI>*` zIf5Mrd@-usJRvmnR!r)z(8|(r=2Uc)79cy;0X>Z-i93a)@@g-%LUavvph0$B=rsG4}{X))lo!j{QyttKJ~Be z9!i!mE?FXyh5zR6kpf7xZIb+boOIg}hLqtCDc|+6d}%z6r~e4)C$a)eXtk&1G?I$x zmF%zh45-WDEFLNba)A!L+V(yt0+p$}mP=f!Oa2^t%P8ET?S7cLO|5@;X{^3Ct47e4 zr8BD{Go?Wi+G}M?Q{PmjLFp>>hs{Wjvvov5aHEdQEKGe%?1S1X+;T$Kj)+T)u)v$k z3c!6`N;8Y8%SItJP`XPz_FidtnB2YGab8d-Uh$#3^B@W7X)Nks5~E!_j%c(`vi<2pv8# zJesH2jS*3DdNdv1yy~eGrwX z_9Cw>g6SMIc;cg!n?ZK4sY+EQC@UsKQDqP|X~1?&TWO`Bxl#0w3XMkXKC5zzbd7r| z4SDGbz;g5HEkP@og3y?#V%HYK^)6OZV+y3vdgCLt?+z(XTdH_5<)BkblL#UtT37W9 z(ll~+iQkfq#fdLqW^PJXd#D(zoE@{s$e_(@()n8F?ovuz;@9e+DUfY0tvES5#G#Rt zC|%z^S_n;koUUIbue9sRElQ)HC(_i0OJcBv{G^RIFuuO|)q8QeZO=aqZO6o8y-P5j zLUp&^)lMVuPOUkQuWfMuQDj%(x1`;E8_;v1PU!f+X}b^0JXTk}x|?+Y!(hjZ?)wq2 zjeCl>KppJ!9SgNmms}Rn<<@>D2EEoA#iOezI)DdI*c$y9`@=G!E65N)fr$iGD;sbh z+1>>I_i9|2DJjmEW2h z`5*~S)dsBd4qC~z72k};nSts-EelJ$OI^eBSG$w|+?fb!K!8&d{C5ZJ(%SfPI@w%K zX9OE2U$UISdH+%a%Ws6S-Xg)JOKCH&IVeeN)pK#?Dyl7=iz%e6u+lW-$6(50n8wbH z^x;YesGavM!NaL7AdFT!ZUkh^(dAKXZ9XQc3tlUU&>;Y{j+mTv*l(dLTBzMp)FgsD z0vK|yvPcP(F_NiP9|MsICsr0HrW7uYvL)`VzFm%?>cXLs0JJ znBQSn?uD=lIwo+D;~H1$D7E`OA(pyoIS`H;>IC<4j$xD9afT&H*ai#}!!m}%*;5Kf zG5k7V7zu!f7?mTI<~~6)F}!jNhT*x$rYy~*?ab(?FT;4R4GLtq(1}%_R0nW`F@^o` z0Je_Gd=dh8B|Z*Hkqsnj_ftyuz_w{Yl1fk1$)j0kN#cY(luquDjJBGmM5uD4w zW6a+nYa`(qwzR|+b<%5rwi;HoZkQkLC!-{Hq&`876fUB28hkH50boX*ZbY3(?zK=h z>YyZPt-J~y+p>b|Q3bm$uSXS%5+|q=<@TJW4qky?9PAj->YooMsT^+pP>bHU0<=T5 z%jb2mpv?xc``oAO61K`2c{ruOIrU61@|~9vfMfQmDT=)@ z>LsL87ZHSl>0)7(pJgJa$^xF?t&7BKafuT$xkCXZi6_sdhn>6 zlr*p6xkxTrrp!MJ&^7D!_Tph2`#{SUKG5KCYX+TN(;-I}ZNh06jzdtpax;`pu@ejy zTq`Zb;d@c=^J~Q$4a=wFLqFgaQ=&t+!pP*N0L z!b1{ybepTlx$mz-@>n2=ZJDjpN>EC+n1WJLf}f{IufmwvRtA%XAyEi!(jh<2v_M|! zZ0oKa09Gg&77?db=)Nb!$c$LJJF_~9x? zP5n;*k7^avO!l|qjM0q)da#tmT=%N}6F3p;_?ylB6N+-SWFcv+FdU%(23nnF7U*n# z3js}^Q>o78Pw-!BS&K7e<7!;&f;k01hRJ5Q>j9`Jv6Dy`2pB=oxp;}Puz&nBbP^yp zUAX;5BgV_tA_&xigOr)O&Ss0$Isn1X4qnN{##+mI45!+G`w40zFP;LRpiA9v#`g1A z@W2**-yyWg2*$Jh1AibZP*c+gn0ld@=8tV#{ zm*>zcP;`ljA73RAuRUC+JpmX%Ft>#Dn+CQ{!@$-ZGqC+?+uE71t-a>gs4>)P@i1*` z@6+Le>%Nh&UAym#uuZ#=?Z%CqPmo;NLpGG+GMVyMi)s17i z;rv(N_vXC(iB1OIZ{&AEa|OPIVB;-iUB^wmPte0E*_-}`iU*}b>uT0OG^;L-!WrL9 zFgpFX;EZ?!#_9*qgF#RRg3cf)2|*{rKUr5})Ohg-@`bd;Ul@-lJ!sOPpM2cWDSVxJ zxe6Y9)g(X%CV8>*X(1n;@m6bY&!?XC{X+`bjzT2p9flSSt|uo?H)_u zq5+UWsl@Mx3QT3~Y-He8w4_KofMEvuXji6En((!Le`W0~B%ru{9_MU^JASM#6i?K% zupzw>N4DgVmHiws&=L2f@1a;C^iwb6-!LoE!nwkvEs@0!?u9Hsh%9p zwf5SJyrklvVW$-Yg0-{mcb(0TAsdPDgeh{nEhoy(f-NI$>O+d>3@J^AC)05NG_mt> zz{^9_>a&FnXT(iVEjweB04?(vTr|2Ijpb3KI%c3kh0R5edsv)1RLxmqhef)k&@cY9_MrC}Jwb|$t-YQzZ!6rb+b}z`k+Sx~r|7b?g z2~f*%pLUxLP6)@*_9FF@WuQ^#@Uc!x%tdraJs6|l7?1Fu0v_otOpSJ2wEgLCLkUpOtMu^cuqAdPOU)v-)iUje$tLIBp7%}N> z$t49x`4mot!%e(Sfb!yJ>(?xvu%?O zb+v+C@!jyhlTZGdwu61&zJQB1N_BjM)Gqq}-|g4&dQ z8MPr-5SWg8ENiiEI}N7w7R_@O$Cc}RoZwJD8Kefz^21Xp&SwxB?2sZRp?MwCs4ijk zUV=fyBnR%30V#10X}lRT*q9MuJ19@zFOY%L6q4u`R%ga(N+vi{?q43Rm&eeQOoOIC z0SZn-zYVdOwh%tXjJf&9^9DVE2G|*l5B9{fd~J;@$P+hCQxtsojc{0mLsC@9K@`P= z3XoJuFJeGVsI@dIwT-V{L=>P|i1t~eoVrwYEm?dR-vKF=WRCDDNzsV=4ry!h<7x7* zUFWFDKkZklBkZHUAWvE=%%AbtNe^YJ9a-Qr_7U_Bb4~%lbT}dVrIv`I}K?jHGk`fFzpy zOW?{bTmw>w6Oq(C6dPQBt0inVUbE@wopS5*w-^~~$7ggl--cBPnVl`gc-cd#2tXf6 zi{ZEnw+mD7i$;AXd423_Kp^Q+IGb^w9+}-DimiPbCIal^7f2_Vn!Rxnj2qNNc|+KuQ~;++lgqzDnZflo6go$O9uA3#EhRqI4}+7yAM(`h zyAE@k^E5(kThhW@(Y_#5pS-Yem#rlHaqyM}(n_R$8L5FwIFP4gwr<5tKAQ9#C7p?+ zKO(?ik&X^NMEme50|b;Na7ImC0}CjsJ|T)VLOF<|3~VITJv_-kV74Wk>}O{|bqyO* z9|oj^FA#YLgGAg?mkK}hhY&*iCwD`GvxY)$>dsH6R-pByt3kH>CF$-&8mN-Pok-)> z*_?pb!bLQ`oXxKSn)CUzefX%@RJiCV3Vc58Ir_x&_vZ6idP;C3m-Y#t#37#A!jnGEz^~_SH(!k>HvyH~v zJb8Pm;o&Ntl#pvArT^S(g3U7~DV1_xTB2p`^@+>&@**ewkv`l9>nG+OEapK<8bMK} z(%2>CVOSWhqlv(O85V4SLBA66hiD#*kL%_u+eL9$9fWat>L#!{+6`XGj%E-;U1wwS zF}Kl86+Spt#{CCT!>Dxt<~GAeXX0Up(ogDukNpQm61hAGoVtgmA$RoyeP?}GCkc(6 zVS@-oEUrfd7OVLf;b^m6DI@`A~&rN)2X!xdjl#7NhcuVb}V|@bK3K_JzBNe^Y6uTY9+K* z5`rXH4i~W+m0I*rUE|O;R2qU%=KH;CPcG8-d%h2z$=-Y2ukU*AtJB9LrLQxehf_4& z(ndPqkK=Q(#yb3(TpYa1!NQvK_OC_#$C!wo3Z$r!%@a(_aQojjv$DG48CkE#Q=9iY zCmmd2WcmNc^iYb^5tqWCotO7@`IhRET{zT-OGJxmq-wFc9&AanT`9E0M{{}PpYD{# zNDHms{8G2$jn{NLCfEvA#u)zrV+5;yB;Kdv?&ke&X$2m?#Yb$a!|;%dc9`i|aF4Qf zuaNRwj->{Pe4-uZMs4rA__zp7M3oQ@7p^VpB)IU6@EeIEADw=4OZH1S7aFDY=2rr2u>B-vFHN-gZZ(<+M0a54&C0zcNqHB6`WE)>KEW##5n`rPgVDO#-w0zu)Ag2i&H( z*K+wHuF-MvSsN~JI&QMp#)?SEHP+KK#;WRK7G_iUb1*lG3Jt|$m!PdEv{ zM{tHSSkzl6DO>YBrRd|4=3Bbpe7vu1B8h+ECQSbbuF)Ah%@wDc_4n8Kwl-w55>s)N z8e2%(1lo!?kXn5jMfX#|)X&rc(ujRL3%KwOkG0u%Bzq#$^wMc?U@kHMGu1bA^E{mmxx+*6ONQ!s;p#WxhiFwq zkKL)G;3}+S-Ev!9v><8N_zx2QY*^xN)2;9xJF&Ic$GPVbuOrr%JlvJ!+?!ss<$bHG zX(Gxt)87{_az?uMwKwPDhp6bzZNAb(h1*0M#@C#W+0dpj&BZe}jl^`b*i6G_FaFo_ z;Cs`|w8Sm0_?TMtQ_E+;ShkExOZ5G6*K?jgDAO$FVH5O9SpKbPGPp5<{4ywS@nLRU0hN8V9dE|9GdHs;{J*KjNILL*i24c>wOi%=wh!UFD8FS0GV z93zNQKjbx>?+|k*o3}y<$5~s@es$(Z)ijtgK9xeV5mQh!boHwuWD#kx5V2xrZ+k~G zuycKfC0$2>@rm4o_whu;)z;o2bFJo8Ev~;sX{~O`|Brrcr&WL7uXm-b1N}Ng&B=Zp zkbRZx7k~nXfgmERev$O~u=|G~{cN?V8`ZG~^$)x4rN z_vnb`Gnr;aBG9|nF|u?U?6vObweHDEbsVLI4ndVJPuaG7Nn}P|5^Pu~KD#N+JI7-ZbkH zZ|i?DLTZ7oE{|rY`BL4i_?v}+UcI3cX_J>D^A=?(^~dKZM(_lj9?f+dBf|?k?ykAH z5*HuMhbuZan+SryCB<_|_-+>$DQZ1^zgD+cn<@-;?h24ahACijl|9Pp3S&t6Ofw1y zHKFV+?JLZTHo*kr>HfWq8P?usB}NSS>oM-Fd$xf#3CeRB*QZ2gN}Q_rLWDbXiOT;T zNs$5;aTZxQk_CJL>rO;OB`?iDN8!`y`+iv}kteN=j`P|`amFuXNlD9GTiHSq{SwW#(RYzM?0k|f5+N!CEF=~gRiiIWg2eB zoMDW}*E*@3ohX;^*|rP)*^S61iT(`50PR!8eL<3cUgBlLO1$syOH9$x0s!q2brSYf z^%sq5ZF5?=inblCjRCXTRniEtCZz9 zn$!li<{0dkJoPPS5{?bUA?G&tlI5LIys@u#JE}y3SgdI|G-0#_ZC1CpS~bF;TqNx>vzz0Ss2jB=WZ>?gb&GMv6a4Wd>+(?7DC%;rcNfz3 z@rw$wdAfOePQQoA)q4)9oPmX<_MLymoK1>?o|(epMx&tX|1)zIDbN6OR=8}!oRu=f z#$()YhOEu+j7=sDj9c%P3A~_rF~pCB1p=fMP?Qu{z%;c57FyuqZ55kL#5*=G*8KyU z7mIA?tr`T`x&KFyDbL@DdEQFOOo|)d^0tbIxE3pL-17c|ibMnK5mF3@WNy77#jfiq z@DPzBA(J^e#OzJj@)%Gg*a&%yn9YQSZ62LHB06JYeak3Zx3-8E0;sDVT`4|=^k~6e zu5W1~#<;k?Fe`#9xp*4_OiM?^7Jc!<*75vFWFFQMOm+=Cg&ywC1x@jVaA%i;RWM zXXkkzk5E+e*+3IE!uNO|e^`I5_I`6MFQN2UHw)*EP*$v+r?heeWqKd40f8SVw~lv8 z^KSVCNvz$m34Bv~agIQWCN4GTgfe>Y4L}c|>CX75r0vx!om{si7Wl@c=%ik}4np@7 zXLobFC=ob?$zUqRf{avrM{+3cMS!-OITQs}ipLZg?!wt3u%Zf`?z1me=>C7HFi%%F zdU%D}Oi`-a$q;#4Gj*S)dRv{m#C}V)cInhQ(4!aj{nH+CIpZf<;1QMmE;5TV5t#xI!gD8B1ajlFPG2o|$(n3HN7uTfa?$*w+bR zdB?W#(G@sGa~z0O2EFjS(kX}cueznLnC{zVb9(CR%g*w&!TKvvW9}h55rFz`)?Ik* zwJP3mmv>=F5B$@TbiPA(Abvapjw9Boky*BX)==(};=sA}In9l~O52orKJY8H9&=aD z0zo%e3`S9D-ugT(hYEy~2?s)={t^web5K18vo5Hf0qe5@$KitP@f266MlNJa4fGdR z95Yi>1G&W&N6pm2KwgRTpsA=U@Rp1N+*l#}0%#;-3W_heyQaV2CS;i=+@`?>|Fdel)Aw_JnNK)g)w)z4k^_a^VEe~V!5sz){< zDUD#m9y_4nC3!wOgTTbw&(7lUjJ&gfFG?H|+ZbciGZIQb8dsrNJp(j^JP|5NX`rTB zEhbzdI-8IQmevxjHC7}39$!536xxzTow}TH11SmGvFPcQi3%Gv++3}G_aCf9t6!_T zUKdmc`1E(xtsiHlH_x6`VtQ-w==dx$AjVo+0oKo#hlDFAdOO9jFgZbIyU* zb2+{-*pOx7KYcE{5*=gSt_iDjBe&epCJSXugf-z-daz6W#BZ@Cl*)(viO;kql*@H61Nh!#CU@Vcj1>{Vtj%%VYZ}{KOtxGsu^`YSl+XU96jTqy_Jq*~Jy-4D4Oi2NDiX`k5!mNH_Z3MkXf;o$Ys-hL25c98^AnxeGt5WchnIkEz z5=k;Q6%)TrAH`E5UTK=He}&W!o`=SCV*L_Sq>ca_xQ3J$LbLFO%ma&R$RtS>DO-e5 zB1BHv5>-+AF;!wdgui(f+7nqvIkQ8B1O>|b2?%Zvrby& zsAxpixH>+ac=*GtH!w$W52nVxq};_-ZD%?@o_IKxbpRHPwJTEXUSCyaU{G?L! z_nrLJtJ}WX*!vpFWxaNS59I*ela~kpBz@*9)8AZKT)l%*o`+!g|-jz9T2 zKJ;as6t-&MT(7WE*1007@guJZqOoP2+vF;XQxrw4Fj?y2ac-JC2T+=qY3n+NPvnUK zjkrFwx?j`0TFuFww6}iCzS_NkAaEgHF zJkG-(i6#K`q-o}V?0zb0I580USTZubF8-l+$8PH&0~*WyO1lrG@{T{b>%*&iu~v$D zD(fSQKmY2!ib!K$^kt{#kFN?T)^Q#N$6vg=_MYzH2D^&|-twpOa~O{B>d!gm z^NKweWYQjr}s zd!vo+=bx8E&#O3VKqvo5zlakA@@^Oi-OtOTfwNXcUi0d+!a;I@;N>MMvbQ2^+gzK9puxSu$xVloTOL2j#&?z0CsNNluIZeTx@}%6xAiu!%5`y++X4{M z!wxADrS(%Je)kJ&z**FMPZ~qLgabf?B>s_N;ZVD732PlL)NGpz)sbXEWx#~e+$N`S zBNm-FXh~kGIdOV>VYlI1V7M2UV}qenad$BE*LZ3$)Q9ql9G)3rPZ3_V;uoo%-x*~8 z?BF$=FT`&WX4s6Bbx4OUd?)9>h1=1>{y2FuV;r+OeO;Ae*Ilqt`C%x>@a zBqjB9xQTT;34dbCeop0lz*vly;UPRnyHG0=hh#q>s?JK~Jd|)@X~>Z%Ky9G(A@&Z; zLrJ7r5Y@=gxpN>zvWHT+tW%gbP0MSZ5&n#ITEx;W^cjq~eWjkTF*2z3vp$8li6kYQ z$li3dozRtTvo*vZMTaD2q^k!a=#oh}b>V_^$9%sod(-nPU`l_+VOoc<9j9V|e0PnS z#PWoL#91ed)V{Kjr6{_s_o?@&?sQMxit+6r7|Ba`JSgahpRI0g7im6|V%}K)Be&C- zmh^*#5zv*js0jGfu}?M7ho~Gy@)w(pQ3Zd)Y?3=(a99=ojfnKc_f{lbJLl`<1Qxsx zAuhs224#9e#s4dTrE(p<#$;5CWM5xmJXY%Qs6)$T_a6s(S!cOkvdTSu9bu!0i|M$y z)f-fKY(za?6XwM)kx++;yMPoNuqq)!G@Cdjt3NqtFV(0$lvh_*=GS#@dW^x^ODo8k z?PSETXc2$(_L)*JAYrMuZiDg7A#!4Xa6Mjcm1SCIekm||djF)|liq0gM4)_q37(a* zo!oWd4U2-XFoZUH!#~llpZ{%__mLmiue;`K5Us(R>bJE2l6G!J`wEUy4QB-ICd;tT zElxKxVqYim^!9pxw|S{VbLd=DJkMp0E>1N^B3D705=oDV-(-DMK~SIT3V1O8VW;<| z;^GkZiVITrMlqDLZ>y`oA{@uPSm>NWBIw;Q!uzuhn7`qUb5+5_G}VK<6Z^;q@i-@z zEP?)%@YhbIBr25Ijp0@b%wg`Xmx4Dx)e>;0vA#(6FW)5 z(&cDQY{uj((qs#MY-G6lSG_Pkp^oBr$z_oD;PyP=`Bm_SRG)Y!^XOnMe31$xZb>m0 z7({sIA|%tP;bR#%c)uzNtZtbdb~Hz4gx7kaji;V}{`o{jA0jo;z*B2EO^{peBfB|d zY%97atRLLb=u07!+;QO-f$1hM=y`&5VLMpKXp#u?;^S)6uVbR71}9w$f1EZX8IrgpGlY#9 z$cvCbh=gc0N4kKWM%K4pq>X758y~~%1hge9sP1lM_15P(>ZB4~mR8R2PmuGgrgq(0 zaa1^XfOQT#z(h!ZSMX}J{|p#FMxFhAb+vkkZ|p>J+JL)IRyd&)Q4%+=p(O)-m7_AC zB_c)Y^b-Ro7bPWskugerFccw2ng%RzIDKGG|4`Yz2;c}8PdL=8G_|wREUj%5 zRresS0U-x{x+N&Omq>hkQf-^4xhEq%I?~%JqJ*wANgxmxN4EaYn!xJObbt9xSxurI zo?W~=PZZ$uQ2bQi)4?Dr&qyZGSskBL%pO=-NYSM9*b6Kw5#oH0XYul3+VAL-j-W{I zmhVs{dgd%dR0cLmvc|k7d?Cf;o)rJ-&2yuHJrH^5#mhx$!q4P#9L&3#@Qu1BW$oqB zz#FrczhPX0G2cx`jIppPA02U%d#&rHH`f28RE(@X4yDGQm)1|y8NjD>hVR)K{uP5k zoxy$68{VxOS@=5BN3n-^t*(|)2#pw2pNIMA@AS4Fq|Hc$0hwASKls=n-&Skj$1egM z(mMHgvd|%nsocH2{HV9}U&w2#xl7q_hx4tOqVcb_K_3(aUKwJ$&bMXck1P>BGTKWt;oqi1`%E@Jj$D`2_}|1)BQiW}q=PVcum{b{{?ab=47KTK5Jvl7Rl zzX)G4#>K@Yn)xtVJ=m9kzH#A9AVZKvaMXI-~LX$SgaLIhLqMGD;V+ zCo-!Lb%qkDfbr4b?~p8D?T>xayzm@{aWm|U>k~6}L}%|%YnoZi5}1Y3Ntu>Qqs_lp zdx${Q>;dpV(G)Uf!)rhdz_lZOJ-6~a1j?Rr`h%$J7lO{Cim)J=&f8kb5;&~~& z>Lr&$H(1U(qf7?s-yfH?6jZ;p2TWYVUrTt6I=qi;d+Q3hya?`CbH1bW^!wxAKYe6U z56dklo9O`U*i2)vzdr_zF~Gjj%$TV{af46^B)$Ce=3?>>%zh@H12DyVuUDm>~Ot(_SmN*{c@UvbAu8VJBP|BpNf7U;j^-n-j zzv+~K`N>iv5d44m0&;86toE?SlCtpKyxK_rkc{6UX$23S9X{^_Z9Si2UIeZd`wUL3 zld_KSBFBx9SEJsNcc65xh9`qix}Qxz?Kcu@?G-_Pe;O#HCSRhSzUEciTw;WaJL$db zzdAXsY)*;ppJ23MW5SDW;Zi9 zZ2d8V7cE;By1hEM7iSDz>1aA~BO|lLnr1X3TVIqEul4d*Oa!8jzrd1U>)NL1!*t(tX$oEgNJ-f=5-7X(Z8@tLjxd@0n-pqH`)>i(O@++Qj zyX^j4_1Kj{LKqq0$0axZi6tBtsgFO&r(4~N@esEJMaov;*t~1&(**wcC8y8uYWqAj}(#8vuyW*Q96GL3I#8d^OLfCjcxq1=V7X@jA@fjf`!%p-tjpUXMYftU-L; z$VHGz)1-a7b6Hj=)tjO7i9TeBP6OY)>n;UEAgh;H* zvnKqQ#EB#LV9g|f+Ig`ERJd)1_j#m*#0YOhGk+S4^~9PyDez4M*EPhmKi|Z9gR)jj zSsU_nDK|*Yb(A7Un!F$79iK>v2Q~t9Rloj1ZBj7o!6|mh{WhdMOnIczOp=T77%))A zccfL_ZLKmMRht+OJsj4%ePKNy#&T<(pocZ~7|8ha+WpUwp+I$!CJ&84zq-V3w;lu9 zog-tgas^{BLt62R+@YE;rRK!Xn`IHx`kMw@|MzXr8P@jYV(dK7e@ctLF}v!spJ_Jm$&tM ze3kq_ziyS+XL&Uimpmtrl9K1;aZSk&S5mDVV$6JS%=6`9*_Usb^U@YRpv6jU_6W-UWy)*RB`%&Cq&f=b{ZMpMbi!05ZATvYeeMO9m)2ZU1oZX@zB@_;9(QU-P*rXDyNqr}t#vr$6N=FheaKbUmGac46d%gd zyXE9RsqfCRp)G*!xn>%yfo*5oT_o#lI~Qalc7t|v{Te`DA88?n`YOO(YkW5?3l(7U z-Ie|v$yEkOIpfk*HalYthfYR;%()ydk+SP95g6ltIT|T0=dGKYj8B> z?kd|TCk)zIWetV|I+F*)An?#DON}W^44n_v?78ImAoHoRXcz!rz_gm*&rBTvcoh){ zYJdtL%Cjjf($0o)*QWS(<}PMQbhXlzc2}pm?FvTL<7jg<)A6B2;%yaIOAW`aAwzEs z8QuyrNWHj@hgq&~cSwAR66(1xs?qZ+@q&RMxN5ZL&*ktp-^1!XWpJ za(P?jEQXKYPTV)P@h&+F>7UixaBQ8NkE&{s9{dr>)6QJ&FOf!>UciExJpdNs5BW=^ zedZO(X){KEcSN=ds$p+@0RrJ4%C{q4;V+R+qH=i`?zfjgb$`Y{W{TXNt zixt1km}F>WMr(8g|BI|!R^#XzYg&~mm8dO!)&cXR;NK^OEyUfXO`b@T4}KS}?iBtk z6Okr7yx1)7DqqBxSm5D)TKpWnK^#NMb#675&syW==G7_}oSrYc9Qen++wI`~C+Q|e zMHcp3qGnx=uQ~3*%NF@Um*Y5#x2x2RR-q$Oo@>J@#U^tMB6Z)-9^ACZzEA4=WQ60h zm2hFw)oI2r!fua|SBsa{Pf}{tT;gg$^x%=Ir%eGfzLk*`Zq6GGJO|6TWuOfDER3UY zz0aY9N(#1nMH2940M^LB$q{5;7m@>rtJs3-A(1Cl z<}&`#>;(((e|YQmQ=7bVtr~`p;|w4D3(UW8ELrYEnI}@|!x5=Nym9@bQC?t=vQ3-p zo&IKra-GIW8q*u`;l-87^jWSaz;s54$T!_`#6N?fulxFdYfE3PF$vrOZ$Va9GH3R` zimRaFhp>*e#^9ad7Pn3Q*t-MR*a))aW*OFMDK2OFb;6fMfsySAMYK*jcR=5@7(u36 z=@L5?&lB9=q+cVhCsyKzhE*+RkKKgpFKB}6U!$}F`nGtZH2DyXK4}#NBiE~Q6fP1d zO^{In{nXN9xxU~MtI9o{3xd~=X31Ga;%;p|L+t+?>++kSeJ3-u)mEL`9;450@gKo0 z@m%QM?ba-!-M2{MBWwS%R0fX~=!?uE2QEoPt+LF$GU608p-tTnRM(Tr<%T}x;e4X0 z8JuNf9tD;iP%ozlSYe>fsQwjAM0+J+(@ zfH0@Q-K1mwTgR9Z6A~mXh|i*xOXHaf1tU^jF4{`9z!yEU)=31Ob8FRp`d~fYOlt+L zVG-SAIms%wyt<8R?U?9d_d*HHW_Ncdo|Mx;3wA$@j|?YpCsNB;v{DY95faXoE4)v& z%bZgabgd0cH2DeBur*3vYeGI)Suk+~Q>7H9Befg%aZ_x{eGT{*tPswg1HGD?w9?x8 zE%Lyl=DxE()@u_~0gL82Zfhb*FmwxKlav?H2@^-qgx80Hq`(mhJOrmPI*CmFm;xfN zNr7UCxRO}V&wVsj9crdwrK0`pR^PYZJJq*&Y2KLaFtMVqZ6ZOheeoZbE)9*ZIx+rE z3PGsAL1I0jweA4)t#c&qW2e7^KUU%BGMs-;Sx57&$=kV-yo}L z;a!BmO#xGRM=#~zGB(3iC%EelL6{p>aw;<3I5lc0JjHJ zE@gxt*GQPPeo_3JYUG722|q~n4RB=DX?8ux&KVwv4ew*{;n1-I8ICH;DH9z5z$Jo{ zflhz)|J7K^8JW9F&^&9N3w5D!i}8TA-lYmAOa10G)(!r@a#`;T0OI1swL#_4;fAux zebxy7Z7#!2aJW4;ew+(+1z;xDxq%FWpc=6cRRdx;YhXW`nY9`%Vewq7j?@W|WLc*o zv7zi7dd{kmD-h#X5IhmX(I=P&hWh5~XwF^(CMduqv0a9H=qM1P2RF6io?ob)(cylt znaR4JhPKElYvz3<41u*H*4;EN zG}?X{6&ho|=)Q8M33;Yby?j8ViM-wa8H|Z@-d0gO2Oli#G)z?MGN+1oIX0F+^s!7< z4xTEOF+OG2l1!8j?|^UiPTVa^L>L>rIQb%o`Vq>j&?$G@yq znXl%S>fVe8v{W1uN+7s|dOhK1bw*h$Ba-hTW(0b3md?#*fsMt<77y5H4a`AMl|ksq z`HkE@7;P#F2C)HHMhvB0+0rya&S@CydVxt5VoscM7x6q+$s`JI0)#c>I>LTM>(W<9Xb*2|C{+RDt+37`k*zhNR;?862U3rPY$dJ!Hijh*IY|JuIvR7x`oSqb3bPy@y8W+n3Y*Jf*o>>-)DiT9OVWr8Pw(`wF^s4LN+NxDI|(;$!7b%#H64{y!w(wggV;$pKc z%Kkth?>i6`%z!R$$@Z?b$y-(bhGDiX<_XyNr|zej9w`T z1$nQ(;%r}57b`4CSp%iqDy785SDBku(*?C+>ELk4j9AX_##4?>qatXIodV~PD<$JT zTdb6xm8{P4eUCp$b z@C@DZ_{aLBki24Wjy zqCJ6f4=C3{iJR`2M{VakPEKZ0X6m1*Q;!jevz=6UUk#*_B`nJUSxt^!6lwY*>4xnx z2UX05CSt7{!%e50O%qikSrY5}!7RjcgH_gFiYu@i)qSfq%;ZoMs!k9*JY#P><=mX+ z-*~Qx8+_EQHq;Tx|(~TR@)=@t2C^O5u zqcf;x%m)d)O#D!bC{IoRu4jh-Kz_{9ZczJI>Go*>p}l9NiEu9}q*-i~Y!badBASiV zbR(t^%>}a@G!%5v?$1fs^cntcqd5HFDF>#i9my#GePS;)juc90O}~1E0^>Qn&4k+aFL*9xvmH`$Q_^;-^X)%IKeRRnwX21MgQ&Fw8 zvEP5NF~vFvXjBh?U~?aKFgg!C*c;UKx)Tg~HKVTXpnEH=biHGkY}L#+Xf<0$&e9u_ zEgglR#2U4t8BZs}#%19HuP|)s{9gRw4#vWu~{jC(&{Vb1uc*n?Uz${U@_LJ+Ykq_{!NB-kwz}C zSJ@auBa&JDTFYje3R#BeFWf&~tXNXbJ3_tKZsdH6)8R#|avFNpa)#Wfey~UiGNy%6 zG*fB@(R^}|^MFiy9H(K*pa5@xp&r+~oe@(xZ)H`3$1?w104_)yo^@bQ`|wLv&?lsU zxr7~=7Dn-MQD0ZHaYxHpN3X-NZoaP27HPih(XALO*@cxPxf2To3(Hdv{YldoxqlaD z(}$W5sL>{wJ#c~{-mv&!NeXn@vPBAf+X@jrX~9!h`f&z8W9ChH4kJz7O;)W?bwGWW z1B?YexVmjmPBj)TfX>)}C$bV?9^O0~hf6@9$o$zVd_Q^CctUBS*W&>W0U2|AJZnG+ z*|B)fp=q)`HIJDfIQZvaPx0on4rt~~c2IG~gSlvG(ygVLaM6G9B~~OriZz%Wsl44f z5R^R0q%4gh>Dn3=Sop+@>Kb^3Xj#z5)##HQ#p7b^YqX5}WCA|*fxNZ}P8~vv3b(T- zBFh!3B^om3-0TN&NKek zK5zoZqk&_hih?}icn}Y;BvyZ!$H4CKU~tvRE%#OjWmSi+!Be_kYTni@l;5x)NfN4R zY8`g4dLLZb@M<#Xu7RMj4KF8yDw09w?WhYMLkwzH6|HDjN9IZskMT-7Qq=idMTMbV z)!m|>$Ze!~YBrz6%TI{R?F0xA(?CbUl~WSoO2Dq_8O1o^o1#-g$yBQ}ue#w(w^Jwt z7>t0-DYQL`PH;eNWAv^=rxQ!GinmnLEXjB@Ts|ey7T@m#Zx**rJxNRJv&Q(Lp+m`1 zp`DgqJut@Vr_{=dhfga(&oL~LWK3TfZenPt!r+f;nK5ZO#$mMF!2;7SE?!{sELYxd zx3hFt4y;|MV4F38srB3?LRJ7nPO2Y*)WhLRTh&FRU@5i+ zRUB1U-$1(p$MvErJ*XGeaa;Mbn3l;14zz~GqUWHw9R9LAljB`hH_fz3z9kg9Mh@?? zDPLS8GDEa5SI9pNnSzFXh?pXe>^9;;5Rl!vSskq4++vOXTf04C%K>dRvLxtVdSbh< zp49_iq1oF6*g(Ebx5|WBGsUX89obT*RUBMclc>$(9+%N@8B5`_L64dvLn1f&IupP# zHj~#>O4bv0WnbA9PJ`tNpp;hGBw!=avQSti^$ZunNtPP`RwN848K^%&b1{V*U3wq; z)mH;D8?T8pbQ zmeR-%3v??+vLV3X^l6;z$@2`h*v@EyG?9-MQnc_nvlS#tLUi)*GjuF1sBWGr+*;i1 zQ3+hz3HF&TJAgGrDJweBa1`HW8X*sFE_GNN%B}gg8kbfpE)`8K_6-*<_N6j9oaM6C ztzNiHeM^iR@!Wt}qcsW+N2Ld272K1o&yKsrY=t*Z{pk*8uIUx@I

GXxfToh}>pV+vMm=;t7#HUaG!+uO3N4M_O>rWT2n?4ogE=b(+;F3_8h_ z0XRz0d|W0kMhZv6TN{CFIUW|@vwP6C>9nanwj?WH=Qh#5$>%WYY^Z$`g72N%1iR`> zYbD%ij&2^QUv#qA{!HPNP=O<+b31pIOYV;d=xq45~u?R z0nVKbMj$-pk0S7$+c*S|sO^;uFB?ph(=phwpGbmW5=GHsvLOz0UrhWCz6O3b4ng zP!dxXoP?Rx8?0TR#sPKiYNil5!3wPxpc&J?zQ9;tjd?Ey)+BhJ1V5rbK@;b1z3gQ+ zr_PI4Hn+c`*PO#%@&`_tH-=m~(m}yN)tRFAOcpygbd9`nNuxgYeoR@iX!T|~FcEA> zPB6Wpf%~>d@!n*erRH2(Fa<3Z{4KyuJgD+{_xFIkVE6$L?>EyfYdjZEN4}#KG|-VS zJq`CmN~6R$pune(NaJNnYd%2POfO?F!(w|Yf@8^geSp3WBR@-(t)_zf)MBQq&kdKp1 zGso2q6x^(yP)1#}u{}C(hTy8$2rNGVLmW4RP;0ojLfMHcIZ`6?Q0C2zteX{?SBlBq z9W#=GJx3zAOvJY>=QY_eO2qcIlf6;E65-(r$I{HMNo<#mX(x*Wa?N5e9Xp|$gz;$e456?u>7G6XZ=D^EWh|3DO+T%+yN-|$+uKDJUEf)>;J-LDo3T&&r6-vjVnwU zSq6-$3FS5Piw^a#X8_&-Q9=+@N6NC*xs!>+QaS@iZ2+|r>99yk6^e3DfckVipcFZ+ zevp3kSB`ak9*Mr4x=RvuPj9Cl0iiBjZ>dcmX!V!@<^~1`LcSG9nbRbBe|2OKvM4l~;Jl8ot?Dp{hXqUYG?eobv)zE=0j z1scbhF<~yq5Zc;NAt!DgmU>%%!jyy+e$~SI<;%vMQy=HeyXC+6%gsKtRy=+lXFVRm zma_>SgWZk>S*l=I;Jb>_p$fpp>_nSLB$FT)xF=Z;>|SoYHdW{xt#Pp*rBx@$2l;h^ zQ;)-MGLQJ2T6Kq1S&^-E$#$Vj21y2XCRcGHuZS}m*=h<&YVrDAz*9_ig6bPoiCsx# zaEyjpMzdn~%RHf_6?j>c=>u(AN$gdvFxIZxe@`S>#>;xc9Mc;HL(CJZb_yG&q=(^U zPPij*-c%F-jtdua%Q6-X1az-0xtQOQn8|1u`7MbXGtOW-c(>H%osdvj)NGICIck>LFY^oFA zaJPp(1_AG3VmK|FEQ4F6u=$g%Zsr4D0p_^;3YJ4}C@ok|Fw@q9c)d3HJONb7-TtLHh)0mi1;UhKgk7Zt)RsF11QT3xlmv72cfhFmBU4{;#ta z(BLpXmz@K9%$T9lS^c4N)sTZWuOwmiTD^s)yZZD8m*y=O4StYV@^hQFjK(wN{@z~94&QV#q1o;tD6|jaC z-A0HS-Zc^2Ceym;deH&Ef88kcl8=9Vh6#UJg2u%zurRZada-xtVI735h=$v zw#oTg3$s9LWKP!FnNvg+vqz;?jNaZ6~LMU^06X=Bb1U&+#0-d>B5oe#eqt@ZsSlZAn0DLl^9xf)*R7 zQ@Cj|PP2jCtMkNmX7V|pr1a5dkI@tOIoxbBJ%Nj*joAI=(?zlD38JY6lhi{83O_I0 z3nw_>TPUb%X$^ZB!ru*We=E6b^Biq^1R%G7Hx6>L1f?6~WL?p6UeIG>Ld$tUbn(G) zUQkwJWXpL$KH+q2keydKfFg*pkX1H|sX{%lz;uQ0Dj48{P5+Q}J)955f%Cn#}eNB&}1Xj?s5&I(yP_G zUq;HhGOu_;KFpkz`Br6-|2GDbszfjtSy4o#&@TIyq6vtu49ZPZ+q$B_xLv)sgub*1 zy~)-t32%m#cVlQuH1HOvvf9HSfe8wdtDVXbj3cVaBo;lbG#6Da@6po6AG0;B64{`k zbAqY8gRXav+HzW8f&PXSls5!kEP<>Z_Mpb<B8^*~^JAHl>`c90MLlbnawLLv+XnZk{3Z zIuu!rrUVYz3Mn;eZ7q?#)>b{z?GVqUXjFhPf!Z`U8AuA0G1LNG>lIP)FeX3)UJP?0 z=RP7t=>@5f(D$}2$pF`wGYQEYiyVwxm7=er$^8mB#rMnJGkplzxAXzY@gH*YoG|JVy7outbgdZOHF@kdAg?tuS}Fx)Zw8{Qh^NBbSqX<&RQ@4vVB&^v#xE52 zRH)OoqEW5|n^w30@f_hVWUEy6AL9seteT;w2AB#s=|uY)%H|}Rd+Gy^9;!3~up~L4 zYDlS7wMAx80|7%Sk80DY^wiCi1U7p@Ca%H*GKlsz*0U%V%cu_)m1P&Dr7F^7M7&%M zDeJ5U{nq!JitUhB8KIz>V0S_|$#9TG=bENp97kP6a?u_Q^-7n7E7GmDW(|&K5!Rb}JlhTlAZsfV%o5vnq3xo9ZtzNo$O5eS@fl3h z>56dF+jtd@gdoUe>LOMnCdf;&+3ZeLc&BXSbIL&|S*@AJ1asIp1D9*jK<3^+W@fN< z+w!c$+k(xL{;Q-1Fke8LfTcTCkSL6ns?}wcwsFr1kDN_%%5W}uhDHa!m1^8V2B>rv zK8UAY&w{U#6D*xI3E5|pQ=AQMN854f=3zKbTIp5YStGez9B%3kc?DIU_<=wUv@Q?O zjl^~sC^B-%!=_i(x2=~@T^$0^13HP8VDdxF9YG-n)Rk^AmF)dTDJGJFTkT~XbQ&3w z4--Fj99DV)5MFwW8Z?~vu^#W0!n~?($UxCSZJYxx#i*(0;ORRx9V6!I28tGbD3xqu`Q@nYP#jz*qQeCCcFeUs$f@og?StI3%4oJ^?r# zOf1|a*laQBVv{7!^o7r+o5%_N2306&YSmIMHwmB3hoIgI^%}%+6xQP}5GXl+1)4da z8ia-y2u)8Lj!GPpdM0&;GN!+)z9P^SVXJGY-?QauWbfk8n+JrBImJKEZC=IQ@u3Xv zuTeiG>6Z7st^ZEXTcB&(#Vki?t(ZkEAZb~+95akKo<&Yjs;(E9_?+tl5!;xx}AuK0QGA0Kw9%{sYPm~ zp^t~}VGm^}k8Dm`2r;xu5Ibj}MWy~MOCIr5h0j`=9e&V#3F>j?7|>opb1QtaUE|ve zdc*D4m52L_ypQY!hU3pQBgTz)sIMr?8 zrGzLv^f!Q!P(re_q7_erL8@m@$fmOZVSIv7uR3h0I7RlVyZcxK+JN(D{937XkzFgWk{X4bVjaY+ zkR~~j`AJMhNm@?dVsFdp3V37%)u^XgJ@KoOpWYn-PfSQa5hosr{inRC0@%rN9O)HD z0*WW@aVbPzw(%kZH9`VpS;AD&D>L@q(9rGJ8_TrQsq3hadMC>RS<(j7_}YUpfj=^w z*U*<>?AOV!AHlSXi$euj>^t_#CQ#p&Fxi@MXN~#@scrn=V1jriTLLe5-dzXuu2Q=t z{uw<{J9v%V%TZFJe#~ny?jIb3rzDl!-{ReMh^oR5`X-3~B$z``c3zwaNP21nn#I2q zTo`vrfx7b+4INfxe1n9>Q3{mD1C&@ZFlw<}sved!Swj4FNlVd3x&pn7kR$G=qjbT> z01gghXDKj+vG?E;*h}0aA~BZuQn+e%V~7XWXAwaa_D1l+vn2LANX8i-JAJqC`x3ve z^ZNt837`w`E(X;WJ=-8Xpt3qK&XI`$6k8q!~a zOo!@`k<#{DnC0O9UOpppC)+eo_{0>TJp_Vx2c!YlPb*CR!Oh*~P0$JTQ3R+zW-dhZ z{8n{UNVB{edlEqpSKk>ob7UYb6>+I3f(FIix}2{=XR_M*CF*W&qe`S-#z<@&J*rqk zMO(J>KiDX|3Ig%Erc}^3MZp?u(7F`5TaZmKO*u@;+(Tuu&eU~7#m=W#&JeByW)sVV zGM90T1!3}>0={CR=xN#Ka8x?vlAjEYuyfWyT&E1Q77SGG0hzA#k&P*~&Aqm_|2aH* z%|lMI!EGD>#A|&X7mFls1P4ur&a6>CAu*MU<-v(5`t>UC@%ZJTUN9vgVqmd2O7+d5 zqFxan!QBAJig^{Rn+9aq3el-3w$#A5P|w+TT$HxZExy9V($aelocPk~$1-wW@-tDfPiT;oc+;n94k`RhV=90j+#h zH%+toLHzBrJx5egtdi%L7hT7-HNq#6`zPfrsL^(ZK3zVy z8e&HOx`wE8hxDkfp-~~H|G*NXA>xd$D#?~s7nJ1iSf5cMs;+_nXQw${l_Oaebx@6f zQj8au=nfW@=>A>JWl3qm3Wiw^6Ai=UQ?*>*Rnu@W`S4<_ehUd!eB(;2w%S3PeYok{ zRNz89d(yy{Dk^FzrdR7D`P5msp-iq&w;MmUiC3N2Vdkintew8*-_xN|yy`pEJ4}~t zVZ)hVERg*!Bke6-lV@h`>|FwP`_FL3R2@;;cCJwUN4M_xQ z)VUEY39GEYt|WZLQy|?M*@f_bnVxAvRnEBQDADeZPuiKKH%+&iCad~@dK>cHZrUYk zJk5~yLHmn&AL`mP@hPwa*-*k9dsn?Mn7mB&6i|YIDZf=Bj1nw_-VtWW6fA`F%Oos> z^b0bcFFMm0)WyrNexu$!E@ZXn8cTD(L8<<|1H=C6cp85|p_M$?O1y&oeJlImgOl!Y z;*xBN;S3L#`lHA~hH)uYOG2?tr%DkLv!SpuRNvLf^rD%ki_-8F2gcI-l1+5-waZx2 z@CgtZ9|zRE%MnPq7l|}zz{DmQ7mOdLbLak7cP_czrM3!e+gbhBUeKZ=Bpd+fQX7(# zcO@aynK~?K$uNn_*m*!rrT_(|&3RzzYRw zNyB8`;Sg&@SG<4c+zPxWA8$p(B;ohI-PvgNCeXTo=AJB&`Qe!YnG2++qVGorFsB;T zLZekX{o?(Xx^YEWgETNGQGUDB3s4N zRb0oTz6n+nRHyiB&794gL<28F0Coq3vm|edw>Yb~J6M}I0(lt3##r5{GwtH@ zV|Dw@6GWLO;=a@m{L4=@jX*`Q&^(@Mo(koJ5}`y*l~vKtE?(}|>Z&5;X8nn0UNouj zM`yij%v9f&#kI!M(96gPh61wTp~+~vT|A)oiW@*-)}h{IYajL3vWL=1Z$l}Kf=||L zKQYWmIwZIG8bFELDXrcbg<#Oz+DxXhvU)4Mtjvgr2ojDZR?F0C(dy0{&ynME6) zRbP_oLO3>$4;?-}Tyc~M=mD4FJ{MWnxL4G?>iF3Dl4hroUSBfLX}>{`km#soLA30|#Fg-Ix@)F*b>hKo?& z;Oc?*or{~WJhife`X>Zsv8eFtMNChwv0n5Chpe^ll{qswG1IfAY<^I9jw(}40KEEt!F+;VY%^Eb)=oPi0<}6 zWNyZ4UF{?*;3^Rs(8wqeXJT@4(~hd)?a)+3a1D88t8eNu7E2+k2=H{FqNHbz=6$hS z+hbm4rB*$|xeR+B$I|r$pCEArqh5+T4~Ey8TM#~G-!2xJJB6O~+yE>U5d?23$DaK_)MjCazoA|DP zcI&HB29u?b%w^;^I3MC<3hZylBNck%WKybLa~bjGb->k%iuqLyDak}rBvG<$6v<+8 zsA4;DO4etTi13qhwm}A%bo~iQP)CBS-ujl+?m6uwDK)Z55-OE=$Sk{ntX^W8jd7B> znLvqT7#%84XKq7p!LbGJ7hWL$DVo`@Qj-y+l8CW7f?WBM>tm4TtlnQa;2UqD17pcl zEk(+TR{M11E-rm`Y-zM3YbCN&B7dwS+vGaIFBD5j4)x7sWc~$_%@Qdtp|g719Hn+- zvZamvsxBEpsxNk-G#NqXzEGEgKB-9qk!W-d@1Kl>R+Y%=#iIO|GSVX+$hGF?TK$tg z_kV7>J-+Y(Uxe?yD<@$mw6sv%d5>=|mE*)}u_;w!Oi9WyU_(}kQyvJ8mWUGya0500 z&Sw!Jvk$Jb0mLxn4v_e}-sfCK{3@G8YyDu#Yo9H2f z&=05lO#~OQYpuDEr)G{M*3dv04ncJ_)yA{1u_agl(Had){ywE(H&AJ|ou$A%+Kh&e zy)Esclbiv;_Tr|ik>DotX8AGSpC+|*4M_>l2@#U(ZDWndr{sKF6^k|ijXTR<;67*Le^L=*Tpq?+tw(ZEXTwHIshH?qk4Id{g z)I!D8!*oWZ$Z(Sj^!J>=BO^=O$fv0vvF)`;qtc^l_j05U*Z*M3s_-%SZpf$p2K6lV zYNE2=tu_f`#&)V}&1~n03Z;Yq=;uJJ5^sZ7x#VxoA$|OH!UYbCs0!jkaXdCXqrk_BD%uU@=0PdHUCE4_&P0s z{MphALhooV$V!Q_kT33Jv4W~`8}i^{o0=>jnOpSKB)48zWcheEoP})>DL|k8F5ycTCj7OXkS4?N5Gxx_p~-r%U(`ug3@h{rNh{nU`X_@W z)c0h$p-r|G0uVlWMAZQPEARFlDz=&EcVwflx&luvCvIoU$PA;$eIls+*n*$3HgdMx zO~V`<@rUgR72CcR)^E~^PrSRqFoZ%sr@*=J+Z*T=!KVt=)R2i~dkkz9kbO&Epf|-7 z8|M3fwtTqEDbX!2$`;f$eTSN4YQ{0RGe{BLB6@7Zoj`M#I1ou&Ug}nHA!YVn$lR4f z7UWuJ2h{ey%QPZ4>aVG;Rf;}>$I8;nPIlr^uhn(aZ;Z>E&nz>z9rQYL7#B^kCgNY0<#IHA!LOHH zI{?vgMi-x382$D+kh%sz?-nALqBc&`bI~mlN*jXe_6gKEUOP+4!2d~pue9%+Ognt6 zdx;b_94k}2E2>QDx7?9Yks^`!h}M=siy;XEx|6+FW}#D!cS>TSWq7zCoq`$8iDBJ{ zBO=&_Y1%`8l^)3;wypPJIhUP@Bo3y&LM3bmtz5>{h=Q15(yc($Y<48%n;?#D&&lGy z7rqO8ISgUjYm4W4V2c@E)Ds|(5>?0=VOpUVG2AGj6F!N0oyllxOs8I2?Yo|afrh-T(w%xR z;!f_bUM==0eE0;u0ffbqFI_3mEvb1%s++qRa*C!(P1$ zdl^t${lKUG?`w2h>mKx~|KOcI()2-=oGh3&CGDFp?W^Kyadneyxn8bzI3exf^qB^2 zF7BUoGv(ZI3NzG{^M^x2>}k8w3z!=@oo4I;P3Ec-T_;-FrT@tZE^?etCIdJja9umI z7#x3x_YqMWx4n&r`)~F>@_k0j+xjj3hWjtxaFwwz+@I@xWG9JG_2?NPcC4}2hz+@7 zugD`M_A{OKstvb$TYslt^EX_9?+Y<5*vEId;pKK#?Ln~IyJZapg+|1iLRs;L!s;?_ zYdQht#w0u_{X{Nt4NCl|_=<4*elBnHK2mB|JUbI`lp3GU)v@!!{a@WsW^n8I{0(_{ zd{CvvjB;aIxv{d`I7&tLuea3pp@PznP^0wws8rcK^38lxoLL=i`O#HC7_3JvkwZVSe%>%m% zZ!5Exh)JHEGB}hx%jll^1h2;Auo~fQouw0Icw4WtbAY_4RC7g4iVJyStK^XpTh3$Z z4sv;0Yjird@eLWnhxErtZ>!vQS6*&j8B@GW{a?-_6oH5&%|!blS`(7xBAy{3KFHgxY=?2nE zxhfBXq(rH$lLo9A$tQ}Febzjmf3LUoF#Rs~?~Tm!dAGdIyIgC6b0~Inwi@|U5u9L` zUAl;ei{tK)bz8nV%p$RF%TxRGGgo!!XSR}6Yu#3${)?w-2GDVb)$e^J~>6{Q;+|vNST=nc5w0x;4e@iah9w@3w8V zwhC;loUH{IjK=uS`Glp06++by;QmpF`YL5G4g!WExoWXwD5JF8)J|PmsyLwS)T>`c zYbNm`I8<{PHV#G(3QjUW-(q-&!k`dUwtizyE#m|Ef})pjdc?W1`W6*YbSkzO`B<9M zQkOX8h5f;aG2lc~+nVfMDGmGi3&25)hGAxlGzYZLi{d7uIGIN_wiG}qzic?WwY$C0%0@eb0Est{y*%!4SZC^^*4TZ6EHw1D?%Fuby2XfAchwe2xvlH z2nt~#0YXK{l5E&u*j@Jpf&~nX*u*t9)!Ne9`in1Z`KhgWY^!Tk8pH}#v{9^0eT_=n z-C}Ki7BMO%&-XhsclYkHiIDI-|305T3nz2$nKNh3oS8fCb7oE^hMHh941PGEkIfDB zTb&v*9ydt*HVZBGpl}!t`?r2Zcdip%v|#tTGAvB2`#L5zGkOkS0l%>jgY{YvpxeSN zo2p;3ixWD_(FwrUz6|}dG?*L=+fnGyL_ariFV?X(!15b=2_UeAuXuuk5gdT{ueL)o zN`lAWm2zx((>!>63@lVNYG)r=r<$v)8YgA-k7IFWXr=3p$MZhS+(sZGYZq7;JkEP zntevk<)2{F+2Hz46ZI`@Er=!+O??pd`p`$j+!LfkSEYU&dSPhus1^Yy?;7#Egyz!ArpcsZ1j@(gcD{X4LS4$J33;u(L$Yv719Jua&itGRWSc4&Ir=aVolh;dT@wte1>hfxzpus>Y$y zo|m-vIIZifu%kA={#~SDdJ%ehW5Zv;vL~*W!#WMicLsFM4j{_YYmc+>(a#atxJ0!n zwQ*s$uvYSKln3k`hw)ElHyVKFtAcrE-0#-|J0x^a$RS%EWlP~vt4$dB+`gpP`$Z1|gbK3wcm1Y({Eufi?`7Z|R!3@UZ_& zO{rJd!a-ENE1DJ*nz4_zDSu|l_@hmmzk+R~hwJ}#R9yUw{3sFmQGyEq)BG8@e0Kxx zH0z$&k+LGS1p9|aVe%5iQdGrVRoK-r@i`l=DTgE}FWDA{KSt&T1Kkt190n222Vyoy z6jF|Qsg!G1v!^allu(g0ZbD>It;rfEW~v+`$dyqH+MGw1iW-w>^f8sy%tspU=ezR>FhvX zZQBP{RIfZHD+j>1VvDz!>!X2nCb6=x3Omkm+6iOs|Me>{YTEu+QP);xqE;98+(dxp zE^&?ornJVHUQlE%SQIuRQb0ymsvI)s=?fniG{ zmmoNgihDgp`y`qR%+sN$axo6rdpKKT#{CwhP^_Yx=2^v_*<(5+z zgn{Yh>9{@BRM35K!O`t)8wRt++4#=H>$+!d=^nAY9>GypZcPgm;D8)Xon&`xMAd}7 zuakJvCCUanSHXrna1VCdhN0xLAvODR@0+A79FL1^8jCYwrluI?DKeY3PO=4I9A^X4 z+Oxz4`*(%ok4wr`$V?-U8HTZeZH1RVrjcJ05@pP^YCNhbwWn$Mk-||X zY!zIFdjrO2x5J7_v324z*cTF<*|QwDOr-A+OmB`4E}H}!{WDjkK?8x2+0Xbd6O^_k z!LxfxW*qt|FlPd@v;^BUE-t|)k)EZt>!`D3nMN?XW?*vWQYMn_@w@$*w z6d@{%N~pXo%v?ROaQv!kvkSU?u-LIKC43v!Gex&f^w-30C3e|-Fmn4P6KZRkj1Q;c zi5<2J;bQ$L6d`B&GCjI&IY|`axM@7;|xQX z*QGjJwt&Y2AH_8}W5e&G8k9}WSYy?T{g8$x=Kw+>nX(g$uf0dqK^K5%4cZLsk4@!G zDlI=kjhcnIUUW<`uZ!z6Fn_~facxmnd|UJ+0?8FpTv4K$q|kUKchv}t%f!VbR20Wh zY^wa}VvjxQ#~G;a&}Qi4InjS@%uQoug`R9tMxCygrn>L!Z^j8d{P%gdtXehi&yl;)S^BR#b8b;l^|6|VW!M#Ycf zQ&B5MnEqptnzP^(^0J*mUS%;}XUR0i)_kKW#dZp&H0F~uy`$Kt(9>HU<2zv8t&H&+ zxQr<1SSm*+GmxcbT( zo(5uBUs-#vuP(%~Du^LU$yU7+yf(h#nY*K}PH-g>!e&h0A$t~f5OCp$I|%AKM`YtT zH@jgMVtQpAst$VH#t~J)Vdt9|nxJ~hLjO)}8Bv26%*b?N2o@zqxd$dGsRc_`>7wfd z(5y5oiudYse4 z7HH6j!^2_}E$q`nNu#M$TFXcpVe=g1k!%WdHm=v(soue7GcsoBqLwPVLNu6Cq_3x6s;qv&c!#v>@BoKO7}jqED6RWQ$Y{}|{Nvs9*CEzFEt_;-8T z)^RviVCbWT|u zQZp=i0n3{H7a1&X3U!?a#hrvc z`dN1L0i023F*d1Gy}oT9a0QL~6yFGbT7v15@Dun@F!O3F3G;CFv?Ca@6&&_w;Lgwu zXyCaJDMn8?$&L%M4h_Y*!NEbIF6nQGIdL9UBxvW1b2hLddzslrc&#oQFi)hOu&&eV*s5BeR#&9!NQ#~Z(er6 zs4e4pUO#mk@^%b_W$TvGamX^_vE4`N-gT!~QvK$aI4e(w77u%SRdYtjOebz z1uL#wvAbeIV9~9G#^`bo-R$F|D=b8Gn+HF4##QqUJrj*Igu@YHzX%)=dH1287$Q$? z7%{K#*1-*D%qu+9G%-8)!t(GgL@&ni7Og2CGsPyJqvTivi(B}-kcrNnynppa-PpMo zfx9?Z$YFmOoX$}?fD}NM2TX`oQ889aGbuGfqgpo(gLt{rsTKFMQVXd$BPzvs351+|cI>Z%ZO+ns97QO{19!^#$As}rVU*aV9&L(6Z!%m4is=5u_gmQU z5LyV1#zAchECXlMKT!u7t!Wz_Z0WVsPoS4-+hiMpPs;|AJM|N?F5q!Jw19PRiXM9IOTN<^Az9uNSo7!66h?)AM}z2;Q$@hZa{wv zg#`ibzOW4Pj|_in1U66dHbkBi#rOg`V1WPyPi_{@KsRxp3!j0s!i$OvwsS{(4ViU5 z8cJO4Ld%EZBaFO@x;}IR^RWfyEU_99zKWY*Fc;H>asNKdP-3glh%bpm=tWC>T~DEb zjTWq1?}-+y&<-*yAu~wMk1PMX?72c61xNP|&hhX=Spb9QVWfeoF*KEAj1?u^|J=BB ztgUgYwQ*}^=vQcyu>XYAG5$OTIZ>r%s4MUndy5>kbKgH}=|7nR8@au=Tw zy*iCv=SRIn`@uqi&KBwg$Ufq?9XNyxbE~jh)41^P)|7SDYn$?pHu*;27}@S)SR4&L z_j1qf&QwepeqP^`4ubU6>#Swj`?hiw%UK6zP1`-lZYKvHw(wGDIf&)0XVdH3KEuA^ z!w~r8?h%hXmxAM6-H=3U`fdT~G4B}sL)D1Kv;&34cGYO}aL4rt|%q5Mj^g*+_=KJ-;W!Yc%$Rcq8?m&>S1| zzY1&BEI}ohArr%6LlOEZ`twHZhpaSV6k5V?7cty2d3+%BPj+WfY*6~TSo(OGO*I1V z9sB_f^@t6N(XN#!h#5$x%$Z?|M+&wi%j}8dU}iBy1GDN=V41_cO0#8TfBWzl?mWtb zEzs~_?7yKw>m4|cEDTzU2SFAIlPu(*sNeXUNwkE|L4%P{zUr{b6_>)D+(RDXWw9!9 zG#{Gt!Y(edJW)H&{lVxx@| zBcj9zV>)HeI&`a)=dit62j^9>2SkY3M*n3`)UjK!?H_6sM8g=1z+vy;FlbQzZe@nudK$XICV;6>Y3;jkPCN|q;U^O z9eYFQrDLFQ=2oacD4VtqH2+Z0pySj43Wnh1F^>3QO&PbzrQ$=u`rh6`aXK0+h`68| zy+4p*^wl^R-1cn2ptX=z75$7t8f9OO+oZ6+gu6sM#1@W17M_I-V(T<6g8Yp|9izm+ zKXA=Ae7*uYC+WITKWpe>!{NM5{d2G;GP)K%XkQjDUJBWkGcFte#Ub)ahH#|@x29$P zdkbzXv>Zw8HjTJh>?Sm=&i?1tF~H%n?IW7W&%3Zew)tP#{~mGM_mL=i{m#0*tpqn@ z{%&_?ip^=ZaspyJm>#-7m!|_2Fy#sUPI!|Jn3arJ+}8|2I4L$pnCxQ;U=a!0gm5)@ z3IA*}YJ7IS4~Vsb;J)hTfjB?q#irCfyWdS&3~hwRz#uD^u2xwZU9f?+HGT77ToMIM zQ^NFaPH|wfMYq6VP(;35d%teQ3b9ni#ez?p=0PXe(R1T&daCD7%MLq zI|n1orqyZLDI;!UAC5bvN8HTb^CztF_=em4{;L*W$#=TA12gohGtw zixLw%*hYm@5kM9mk*;~zl8wt03e$IYnlTL_OYI>{pro%e?|#?Jm2Dd&!Ct0$xOOsJ z^bHi`6s6UxQi{__6I_Hd3r(rpY~kHlV`pli+?3@^MLAP34>tO+Bmfgijp@x|^_6uA zIu5Z;#a~b%%MV0!gK&QU$|Fk~Zatk@oWAvZX3ge(sfcD@Af3hQ3~cDZEvTuv*~RIb z-vzZ)Bt9qfJ*Y-3>f^}IpI2j$i6PC_xmf*0xzE6+q?!4jrlM(uoU=nP8pt`0Lo(As z37Hns=4Ee9+x)DUc$wMs4PB~bP1lSHzla{HiWl>h@@qyJfRzKp`x2(9w4P~F10sLZ z&=-Qi!Bt~XoS8Dz1h^IS96hfg+awgcbS^#4LXkamp8SNr!W-Bu_>So@4j$qwKC~KK zm|}Uu6OD{wIDCn`e;Wo}$3784O&;70u0w=55LihvW5tx;S@^+3&%ElfAz2CwBPKWf|Cvfvb?_X5EOq0dgrDYZ4) z3W=Fz3~U%L6>SUu9D;C)c~7W@jmJ6vLgRtF!vyCvZta|TW#BxN@h8wJM;793P|wmd zOoL&J0rW`hz{9j(-0pg0KYY3oU|P@e<>BW)JH~yNi|c3did~#KhSBGv_$%^r2v(`& z2Z|+LU8o_@c51j5i3F=CR-RPk?9dDhd@u;_8PtkI?5Uqa2ZqsmhVvotOJz1{HB?1&hZ_xv8iR^kVt z0M*3G0hH|ui1Rk~2%*!{g)~Wfh`Xn~($p~9g6y%4ZM0b%ZQ~nlnT=;QE>5j)SO9cS zQ$rDb7pFBY9^1IsdMl=d_i7=eV{c9-R+_ZEIo45daF20A(Wt#SS&VFNT@J#qt0CLQ z_?qHL%%Lb1eMlAk72Ud+ipV;6dp^RelZJ*5`t};2n|ARpuxI0Z%J(Q7kEO&ZPn>bM zT}*MzV_`QGu;=$grW3WBM;`0T)6qR@6N#Y}J|rgdp?$Dqa$L3wBg!&cH7;OGrOd1i zM7ELxu9Ib+O0(0LcrQV#QJeuW_2;pMXRG0Pyy1BUp1)GRDIHhXhd;Ry(~IGMew%}l z;u(h`FmVlEWzbq$)sDU}oc}0K2*{6pPt*uSIPr=9~i~ zoG*e_5Q&;*Pxz0hw&HHEzXrrqQ&XW84a_J}P+?RW*Qn4CZJMoTF(y@E%vvn`M-geL zD3&?>$g}YGIrYIA(6d zp{s|UpqvTa_CY$vN}@uOn^3!hh0Z5g1@OFSp%aa2)Aqv<2N!s4aLU<#iC8xomqCDU zomE@00yS3Cc3P3gHZehN3v1zvjqc^^y@fIRyuBr`81vP3|IeY8W zIw9)kuZaG_5b0w(G+52(>=GdhYlDTgjq@xs@8R4|lbF5>j0;|O)cGoOizeqFbf$|C zM3BZa>Mqn))QcHDEiggK;oJ{mtjk%N{|~bnz0ncv&P)mcwXq8@Ir+$SBN)ppOV!QrMG-O%ThM!8S^dZ*%Zm4L)2V<7&+q>3!IS z18-|2nzde5htFUL#{-KWGe2yL?mr9+htN^7C{_Ig66qA;8<%Bm+Vks7 zx9%VDSo?^_p5OgmTFUPmi%WU$$oaEV8;i@vw5`aQ_Qu40+#I^HvADdku(ENL(?1d) zR}nI3j;5t*uw2nt=tRAC!%I*Frc%d;FXYpl@1pQK&6tfsVH37tun&1Q&u!$ug6^u7 zjjM2dLH=qS%0YO{G>$@rckQ0gD7HDfBC?&7O%CSD*rP_1gBq8MN9}S$4-D~3n=i(5 z_@PWP*g^(kWY4L=dwIW!3O^*6lL0oIeKkxm8XJ$>uL6UXw?!tbM8L?e(TW=h9wEU^ zl7O5e<(!iU)uEFl%WD%(6=Mbt8iJDp2X$Z^hh?%A!vUNTGi|DP#GQ^RFldO+&Rs$1~scO z{UL4|Pn@O@%+|lbX^#7Hz~{ENsFNdu>L8Gq<`54;zKDxtAt&VuP3IKv=YP{9;oQGiHhv17|1lB2VK}ji`K_wJE zZ2uVeF4_5Q5*=SGUVI51-{ugqo`tXR{ICmwxujx^c7MTOFuK3I(*qk=^%r5bX;1xb z9BLT)7CIvP<9}FGkDT{cCb4VV?l!QGJYBEep5@ykcnj^j(`<>fpj7PNPx=r4Vx(^( zh4x)gYz0MA6I=L5EtzcZ#-lC#gIE6Dv!|(vhoB=r#*x^AFhfXHlw zRgY7|qX@YNhCVH z&Ll~7JPGc(+qSzEL)OSruqL;^gY zfBkl)`t7ZFw1qdLe6H9NY~owwWUufkMG>TG9KpR6@r7nek!o95<4!2{iVQ)Ph;m@4AxEpEkSLv1jG67|jZUu1o=kA7b__%TtGt0N%g`z5l5@?|SIrU|zpa<{@?sPJPH zzFy&nDSQgtP#0r4{F<%@ly~*L{bh>~HFBdH+AY5uR4;*w@t3Lirzw6c=zBtW_qtteDhR%4=MaK zg`ddyEI$IXvGL55{&pySJ{9is%~Jk<3AZ6~t-`;r@Nd8kImvJTA9X$H@}qu=JPCie zEbiw$CY4s;Vo7C?AH)Y?eH0|WZhCHx_Z0HI8rk;;_*;Jr|CPu2vpj{@gLx7CXD9W) z8y~eQZ&o21ie7nSwEpOf45a`bGWh(}gaoPjX2J`sZ$xcz<9DEa+0wr94Jb-tD+N{% ztiWTamE3-w$W4~lOrOlZ6jnCKzaZJ5ywnS~A#zB3p9dp8g})wds9U7}IEJG9qvoai zOBF6#g`1}M-L3E!D*PDov)uy$)06URQ2Z)XxI>s8qI~ZQw;^(k!XHrh7vP3=lHXGY z64WQY&l!r}St{J!D%_ol-{<1{I~b`~_-~M(_Fv#vlaybW6(`aw>l>7R6)sQldr0w{ zrtlNVuZ;Z0Cgrz7@$;#0pKp@s{g-f2{uTaxg?|HXsFnQozmhDyMT(!SZw^KtQsM4b z{A7J|Fmk8D2gxt31^hNA<=4#`AL%_HzUPCHYgM=s#ZT5Z2P1h3pG|({ytW;;T^c9jaCNFI?om!XHrh7vP4%%zoGE5zBw4VUg0a?hH~yjJf+ciMEkIDFWZM!`pk;@$Qnu2r@w1LQaea+ zc02+5cg`2USGy0MN868=zd6$JGTX`KNC~TnOwzq7=%~YA?gisA;@YCP7jUF1R7c#y zQQYIi?Ido8z;Qq9x$j{-5o#y0o=Db(H*Ex6H&LEw*m>BP60+V8+{!3!8gWI$6-D{I z_%8W*h@3_w<=gLsd^?D;3OdpMLmZfSf$;!dG?j*73XZ%+1_6ssJxM?QgHQv*Uwk{_ z=_0aIAVvGXf#snsa>sAsm+=7no)vzfIzETQGsD_$6aCR`ySXPT@)Lv#b&%qFpr9Og z5|j25U~X2tk$&Q`i1SFEWqhs_&)jEtHOlr15;ksqRH3^ z-x~yL#GMwop2#91R|;gP?!WPD6VKG+HSmW~rbr&?I_NiD_`#N0cqQfHN52O)Yel1M ziHsqg?Lp9`3p&d1z^%|r199CiGR@TW+b9v#HL>pjOS;Wq6Y3zQJxceOq|+V(_BV>I zlysTI>=bkin?sz9xbF&FsFu$Sx+G1N|qDo}*9hw-%1NShI(9ZuRZ zQp^Gc;~MiU!ZZ+*sfUT20UZ3c?dEb#Wc6PWrj-v<6OV;Isx#Yv8m7 zPHW(_22N|>{}Bz$eb%gH0WJV^?J;Yk;Fbb30)A&=%M0DX&%h6GWVczH4EF*+KA;pZ z15gEM0Nexc10Dsu4%i3y5O54|4)|vRz66*Hm=5Rwzc7HmUxdusbAV332Y_zC&?n4V z24E84YCt8x1!w?#5AXosQNS~RR{%2r%K)1ZwgvFvV`l9RxaGewYc~RJ1^f^Y0{kBE zCg20WQ9$~WX6-yc7U1n)L3Y4z01pFp0B!@+0crrt03PtI1WX0k0OJ8i9*3Ub4hFR0 zISgnA+z!|YxCc-S*Z^1u$N^jq_!{6Gz+iwGvgCvRbigP)KZ`WH4amTIJJSPb1>6Iu z1l$6s1xyDl0n7!Y0xkla19aDY<48h{^gE8vHKp8`UF-vizTbODY5(vjEa0WJbe1>^&4 zfK>o5;G2Nk0Y3t?0(Jo|K)6wWG{Di{LMFiLfL{Ra0o(%c11bSa06Bmxz<9uy0A@hf zF0=L?pdHW#co6ViKm%X{pbD@6FddKy7zz0M(CXJ!Z0e{vp&HCaXt5FHUcc_5WOYJ%2quy*9*mqUjxr zwCd?Se=ySj1I^OBBbBM{&6dlfJ6F9Js( zUV9;ie+f7O@#Q)m&s;qr5Z`9NDr&G5lMQg+RRR)foOOKoE#;)$w??AWj1DEDvy!{zQFo_ZNRZb&vet{eDiQzG#L_ ztS{PL(kz_-))zVWCio4tzb3z-ZFP0ons!qj>yfVN*msl)#So~UtUvdypYo0`)=vv) zPNY5PPkmYk-u@>(cXx!PrKK}^zZ?`0Rr{V{${M)eh3_a__nuV`2PWpKz!@l zG5lfR2*kI%6T^Q39D(@e&KUkP;0VOmy&J>-8#n^-p7&yS4P}`?eEIu*=T{xl%l5mk z_OBH*|EKaRS$l9I<+%+qF~4jF!EiX!LeI_gzgRP_O?QCGkD@S%4!<0)8F(ojN^n=L4AMKLs96(x1)i*ih}*XtS?% z_()LV@cXM>YsK@<2D9aVE;3t+8qF5=vyXfgY5RhH_HWVeJ(2J9RQI#9pg$fF(e>GG z&}XUB>#$cs^GL_*Uo%@40lp|5*I_JhBI)25;|BnJyb!=xf#Zc60A)|bj~Chz|CJNX z7VE8M%L=&EcNlW=?4&L?@2?_0FK>NisolHQ;m2IYh!G>Oqd59YL)nPFBzee!f6;|0 zmIVNMvz#Q78FA&Hw<+2$qGve%NY{*TnJ6Q=Fgkvxl23mRsdrrlC({3C=(qYAljQ}# zxIHFI7id<3K$nz8RY;$gUu~~(uhnw+?loIr2`lc0sz!SP{c*kAoA6HHcXD)e4A1X? zKz!<#F%CkTW&H7=(Tm_yl>|TR6_Z6AATk6X{h$9}vSb->d?fzYz`K+1$^KXG^Cay`jPUT5W4#=7sIrq+SY6{#Wx*CSTfPn*RXzB{I*PQOdL0%2 zT#lRjqoZ#^W?e^{9yM8-0nDF^!E-WT3Sc^5p#i8D3(Eg&xYWxIq&@n5lseXXmb*~9 z$=?hET{-At^`N4GK8rvzgCB|E$8!6#_e_>)z2GnF1wXwP{N=sir}l!sq8I!`gN%H% z0ybejgYBL1XT{6y@0ya<53@fqS!NoE@jMRj82IqYdgBjxQRDAiyu1wj z=w9%b7>V(01$2V{r3rXZk3&w}_Z9ck@!yQY%KGY0Z=wES5FzS4^Kejby+9F?}jKCwR_tyZl~v&0M=zqKI3VKflmx zU+)kYyo;Ab-eu_GM8hqraj2jw+&qVWq1#pMcYEi%s@%C+fh({+zuM=iv2Rj%pQauP zz3%lkceP8@)dt)WM}^-=gI-*vdn4oo?~+YEzhnJEhu>RWA^KHIOA3}uo2qH~^Gj?C za#v^-?)B>{{N9??`Cj|l1=T+PLZ7G)8&J>Pfp56@fUM^@zuDXT;2+*U_4S-SKWMDy z?!bItZ}WqkOJ#qE^QhJ99a;zEKZtoo_K9_v4?X80y>6Gv17ATc^EPkM!o1Q2)22?& zU$B7hS+|)j|3=z7Scj=T=l?5dr~GX<%6^gFjz#-*Y{%eVhxGX`FPZ_%1{ z{N^&@KML=9ywP+~&xW{dpsO>`Mf(+b?i#mObu8eo)gcc+o2;MtF8UHAN&36pYo<}|uM|DV)zlA&(!3>>zY{OT*cI>8LmvAd^D3)Vc4#5s z>B0PXeKN|UkuE<^>oD;74g90!#K1%7cWaE#kBxNT!JifWNz3z6pTld&_oCkDmN z)@)f1cmiyF6&D@?1H%^j+#8D-L=+HiK?}_YLk?u9Wo~!=P$H-Y<_R48-GYy3*9^c z`w7{}{w+L0c(g^o4efZZ!;>@M+$ zcr@_Wz?VEV@FE|83*k0t;KA?=t6gn(X(e`lz*`9q^7B@Ur&4FY>r=Spj!Kt9y_5#z z6Z(+Cw97RdK9xN88UYn^AZ{0gAc zjV!{r0HD9qz4>bS?t$wEFdXr(EBteCf3Kdg!gUqA+P0c(xp3=xdgkTM_pyWS@cG={ zLI>0Dz>K2LAv(y{6f7w&K%b8M^q*s5R#p~XFy0xgp+H!)l))PMD5(Vn1%vpzEK9SI z*qS-RR(3|3c12d!avN6atX6g}w6t<(IewTl_tfH-1`4d>rKQ11!#}=inVL%rXf^nE zF@tECu0Tx<9=!pVAN^9R!|Qc>t(sQ4U{Ohld>hVjO3D1C+`Nc8JlFPHE z&KN%Q5^KO^UsL0-`rX!QbZ0R^Rehtw>U7vWf{jMHD@f;Z`>hU_JFwPi^?B?S4r>+S zt#NOxHUt#)M=adsy@vDoEBgp{8N+#?e(Q#6uRma~u~r3K6|9@A7517M5dr0z-Yfsr zZkMCB+JC9tPsi$K5~FfWnaOambh|wcFm}6qZs?&BQ^*wtTBRdLtp`0cN2SnAOp7qm zc6rtmp&xvUI?eh(jlbG2CTgLfit7{Ud)JE!RB89yA@1;@_BAfIcRdu~@w(SyENJyR zyz8r7@p{e@=}DSD4i_}&cCAMl20zG}CDN0W78A4q68d!gW=*A@s%qSb&b8L+;ZRW& z17Ip0l~SJzt1G;2HgMKu)jnob-o%O4C8}^Ps9xh$_0UihN*!ImGCOYQP<(An)GQQV zZSv&F+H5_QE;LZcpzB@kjV`P*=s$kXvjQf|l>k0}2=^oP{GCnM-vU70f+_|z4JsVe zJE(q8lYs&1G*oS<;ZV_`zC*Q#+7Fc=>OxeBs2N#7;#c~0Suc(Iw#hO9z<9R8{U!k8 z-vxG`KNm%DgTv@p*RVy5(5c>NJUI(Cl zFerl-~fe&o@naGAaE z3-`fK!`!)^Cc5N-0kXiA;aT@H>T5yB*4teG%TyHWnjn0H{)Jd(5 z8=t%!w7@@6*Nl|94C!Hs;14|ZDO?Volj*e!{=Laa7Svf9=0fDO}n`$>ptue{bcbIe{N}v?!dl7k>Nt;MbYJk36~*E(g!a%2@`+@X2Ik zS;>N*F}>uGqi|)t@N>dHnT+IDm%xuaniZ}V&&kSXi2lgKzRG8N0$=h9D_l!2d@Y!R z_#(cUq%r)+D@Wnl@SLoCI^o}2`K(LeM;^@z*NJC6Dq}q!N(jR^+Y@jM+o9vWnp`do zb1S{cl>t9JZsCGQrovf!;b-fEpEH3UdDJRgPA~jg`rsEz;71<&6wZm~WaYXG{>fxy z8B4=lhcUh6k)d$Sy~vjX|K7givIKtQ;Z(TRUidZl!Ea{*Kk^7E+&(-fOK&IqlksGF zyA$}4M;hi{sDsX4_+`OA**8aiMJg=A^G6E-Em1&p(m;4IhG92||g$+W|CH@$$T!nKg`XL~)^+8{!=!44Lq1^l7GOk}J z_bKJ>RsOFi_bs@Ti!z4#h)2td(RKDgXH|4;&(iMdJ)JqA1BrGGT*kcuF6CVdm%0tW zrCe;|ZGG@*1|3MW9dOC#ez+ptDm-z`eS~i}(1rS->r!-FqwWM9<;sEWML5wP^UsnW zkE18?8Nf4L{OK<7R^Zv6F?1N4#kUY}hQg75pSs(OPMV|?mI=EbgW0`91 zBb-fzyHis6TEMK?6r5qV}?(BnK3+O&N%yncWZKg!(-I=UgnzYQ+s-ly>Ga4B~OT*}?4@L{;rNf%t! zSKV-#9)_*!BR)%!l;u3Qq$iKoKIpSRNBL&JWtwx~GL9mJx51@+WpF89Ib6LQrTwV) zbk`|5#-G&(T?^bT*ki-F5_>9tEa1>558S0d^cS3)#gjSX>b`I zHf0FD8F0zh3YUCYRy+IPn*%zsD}qbDB`O@BGk)B=K0F4xoIdE94Rp>v=voyWb<^Aj zT|4MNqIJNfjPJvxem_*{3UkhCF%}{tNT=LC?OTJlfb-q@Zw*>0AAN62U;mhEXZ#i7@bt=3EF8S8NCEq%@ zI^Wtp__nCUVD_rsoDSR7T^4$lQeB0sbeB1lr+oi&H!zEvBf#jP8m+7&kd^lD5LE@f_p%l2dkT*gNp?R~`8YM|@xgRb2` zXT7g?y>ux$%3Rb3ouydnF9WVFXKf$!lMHk%ebD6?==SwNS8AZ^>VwW{pv$Z5W&w7MB`LlwaG?{RXc*>>sBRz)jVXSk#3c}a+<2;Z0j$2ebtp+;s*7@l!ar`kp z!af5%`MwFliGPUk?Kb!`oc<%fBFM{kn@X=p!%uqGi_<`7>w|8yqGS4NK}Ws~3G{k; zbeD4Qr>CpMK+kk>eDTXa%5;&Y-Qdq~`j7m6WQf08#h>=m_;l&<>aHGMkKbybXZ-B< z|Dhumzs=yUhowt?PZ{E`1)WHL0=*uu?&>`B_*)G0jQ?2>ejn#4^m?V;;ID_(<9}1d z&$8Fu2VEEF7^WMpki!>#I?C)!pcniUJ)G!|v6_69odyAOZ1zgG_ zw@gO{*0YF9CI|V<09{{v%HSWZ{}j(wxOzNB-g+FmAN54oXP~EEI1l#i!7;ww27f&) zUGi&H`4>|8!tuTCN7tAyd`^3?cb$+v6aGvOzdH|}iA(%3-u)`xKdN}&f~%MFoqdEm zY@loJgD!1xj9+&jbYl&4)`xnRH_Jd*)CXO@fzHzhU74a|J+K3G%*UMx^wbk|r@MUS zPtW%@13mNo0}%f6vRJ-%8T@5P`Ir1^5kKGR4RTl?mU3jlO{C|0Z*mkF=yf?Zq{rl_ zHTWm;eL%_ah>}C-p%40J4f3}4LD!-9b{hC1s%z*Y&Bpx;%RRwixL3@A{pwvG$9IlKFyD>cwrf6=>soCdn0 zKIk?Z((UPkZU^WnYqNpAr4RaN75!5N`u0BP!-~EOt|(J|)YGijI>D>Ax}I`skH~yy zy;g*0flK&9y{DE)zu|Bh?`XJsy;j#pxJjV%2qP;TL`260A^`7cn?Wq2oi@u3zUX6Q=y(ZsLWT*hcZ;v&1N5~oC4P4ivYyw2_Lj>`G2 z3a^8E%{A@kMm+Xl>-e-3%2wlWfzvDI<<*rA97Mv=qJ`XBKX;Sgp&c|upG)03fwtGQ z0K3!m194dY7y8lPbG1Lhzv6oR9eo3pl0vV;p=o!jx1}x$idA$WMTKV*#JG~F9s6youq_EQI`2=7!ymXFp?E z=J5K&S=L|SM2*9tZ>)btq*lFwwnEDfcxtLEaPC3r{S!mJQ+NtKUCVBe3LeVO<|oNBSz{Z5ts8yJ>*?bR2spRw3$L?*q@ ze9y0j6^?xpD~qJ|AWD*cfF%#9fEH>>aA<>SyU$!&<5P4?apsEUI*}%*azZIiyPsi1 zjJr(>9QF;z1<<~&LM(Ae)>Sxdk20RfSo;Y%AwkRRH8=tF2Pw54NPB?3%wpkNDYV7| z68NByBi~YS6xP^b$mlOJe{A0B4ah&_XBG0I1c&imYmxf})TGK}y}SN3}$6Am$=YFJS1LV@3+72uqXUOw+Jm#SkfOrj{V z+7Co{spnzlCH88c@z~z|!dD2b-6x)P^*+J4a+zWeQ$vxzj>AEQ5~yiE79sK-sBqky zw7bQd{6aMCx8`N?43ZH2N&QWgrI2a9Z?3&kd^9}txSqKu3s9aLhhT8#g|U|SEA>(} zI;zu69*1U=zIL2)@<@9PkBaZRAa-s?<}Nblm%aEb*9Mcz@jqX3|MYb8=@mby};0_A2|JO&(oEj7ccMVtnGRKDk-P>c7? zjKQFnaax{xy$9z|qcU9(j{(m$;@gO+W|`ev&68cZntnP@p0(L!GM>VD9A71=bTbw= zqMq1*V{SNPE)i0aO6_dw>$tN-ml11&4p4AJT4f+#k=uQJ0nQU06>^GLAdsfL zX|g#S*TxKkYS?>_Jk=L}jbl@ZAL`KF5?_lr-=x%a zmqzO$c7KI47SA`$rC!)R!f|1Tt`O~Ols!r^jc<$w){si=Yv$t!t9Ax)h3<*~B>%O_ z6CUUlo@|qxjtV43A!bse`rF)U|9ZOz;hr_2R>V1EdgN+fm2tWPQh03#YF2xtB+k{& z(|sjlyZ8EheEcppqu^wwFQk*P-;OpxeEllb3seg!Z7IxmRaSe^k|1mBXvA><3tJYhmDF9}31&ZmulK2a29!H*V_@0gc*SRd-~+#|jumbqLll^j(7sj^ATlQ>KR zN~kQ}QI^^&Qb~qN)96t;-5d2dF2xsb_b&B#9A2b*7DfxKfYG<8KnE8G#Q#lAz(Pg} z%218N?sMSTXGU$Z1}8g_b&CSby+as`4eGKQ>Yp)QZxz+f;&H zHEc!5@Cy4WDP^`Q%rlZM4p*YmqRTZwlq+%EI**n6gUAcL-TDPmSP^|2g#MtO-}j)W zD6}WC|1Pb-S7Ap-N}HEIUmdj_#yqB~*j-iQi6O)-!Z~jP?hN8&m)6fd1il?qKR(#g zf)O3O!U{%Z&078Z?pQgRMbDdEe8i{aqbXzk%*x5(^;fe4y;)-TG&o3^qEn2i- za{iKKtb0%^0JaCkR~zCSB4?FQn=L{MBSLU7=ZSM3(QG5a`D5Y(%M zzs`{;uOU3&bMu$w+H}=uB}D}bXqbvelA~6t#Q9`>-f_$glV!3|6gk0p*<$c>wxrUVb=(da*5gUy-UrO*8nrGFk5E9 zw&0c=oK+l+`=~C)y#?^!cooh&18_pqQhp}xpTV6?=e+`3+W;@174RXT4zwY_w8>`6 z^?+|*WVS@+m@V%ytomJfp2>34ER*HJAnwH4DD9`w>jk{)G{p*UukkqTK6J^2HDKNM z#9iJU!Z8JAIPDyM+G|cctdVjo_;9C01^V}1dj$s8M&A>E9tS?$gHq}6+l2wW6Av0k zc>(zFj6fA^`w!&zHSnR*YwVRA_4NBU5qzwI&jx$HnIPaK@X3J-1IL_L?6;yX0iQbX zak(q)>+NeXTJPU)GWf6nfe+?<`p1KzE+ronAo6kdv+R&h7Wtq6x!l!Qx`1KDe*UJA z4+@aWT~oc*$*J!CF`7y~C_pavddzlXlDnV3Y2;%iA7neH-TV2QPChy0L)&`QmHlL+ zT}D22n&$RaudSA*Bm2eba`Hg|qA~OV6ld)U!3XzAR#&(yoV?Yff4>=mPpam-UYObJ z9}|R{DfpymKCJv>(?Y+0vjiUt`C#It|G#X($EsmPB~XEh?EcpCvjv|V&Ck`Q{)?l{ z5q#>jjhNvcK((q}DfqAk8rbhD$w$MgQoqX%CCHI{%xk&EFaVKqC7;ywXa{Qsz-O-H zlZLrzX_&U3yz(R;%SN}m-*pC~&X;_w{S+e_tU&V7a@V*6{_IP#7YV!aK0KAe{Hnd$ zWu516p(lbV`D{63S&+|*v7&RGsI&@mueoNbm6M$y_lji+?@~#xQ&r@xxW|!>+CaHc}bR?vge}tynve);j%8*mRZBP39R%{z*blQ=T;LX&|>& zvyHYQjGnp*yQ>0=43*^Jsi@U#d1co5f{4@SK5ORJCIfx(X5nn!tf}>ND-6V<>c0dg zSbcswY==U9SV=`}Fi-4r3bC|Ys}C3$UKKd&dMs#J*Ep;`v8W-VjLH$!GGx>Bj7O}A z1!^jV?nLq(N%cD}nx1^ImP$k!ILi-zg=gI??;$jGfQTDu7Vy+qLL(*0n zvs!b`TIpQBvI;ZZD`9{Y=aXXZDocFvI1xo0&R5~B_W0FD-MUTo*C*R@mx;TBqBh}k za+n6JK&-`%G@4KqzY1)ol285n+c`1o~&80&?xRkI=PTB z>XsSg0aLnI@As}1v->g66MX6d5A@3yxunVL6ATqkh6{Jd1557f`(4dufyaQ90g;-s zHH+vW#*24SZ{@Q!3;KuE9+dL_CZ>Y_Zv*DKoBlL#(ITjF^r^>T;kiT^BldRlzS0{@AJ z)hSyIJiJxdqSTKHDXWm>qrai0BnBS2>_6!8os8QalSA#kIGNCr)-x}fmV9n5^Y^0? z=_-oy@Su%3c_9#@c|P*i;a%;(-HR9}_iLKPcD3X&knvWh;^D%6ZSRJDWeaT5U=|~4 z;h)VGB$(nJ z@EVC#@EF+oNDg=mbZw*#JO;Whaw^tDPQ`l2saOj+73(0UVh!X}tbd$}wGRyiWT5LF zr((^63uXgd@8DwDK-W6BP&UwY4la@nbd7@xWCLB_;NsXo`r4>E@EiEL2AG&C2e=ji z9s^#70FME$L4e1A*B`)Rz-tfSVLcUN81T_JdqH;~zbae<*1ukzjFo*5Oy>7*K&J#} zALLZ%#2)awOT;{vV%!fW#$#$fLW^w(+L}O3|2H!rR_cSNqxvO)3X}rZ<8|}?U`(}f zHRI$r=dfSLd9ADg2r@|Vm@)t!JZC^T`j;azV%qE^k7)ytgMC!;m_7g=w9!u=IZ(>O@BdWf4f?5AuERyI1NdPA6epA& z{a(LhzUVww_fsI|OO!_d4GlJBooterFQ-DMWP|O1FlRBa?{AIWg)Iu?*1sS1TIs;y zzy1Xmp{Q4v1I4|c^Gjqxy}CX28(>JI-#?c3f$TqJ#BA?;4hIbE@Jd`_PX5RCZlL2K zws+W7;qVS%a}(RUQ&Cpu6-=2b4iA!FKY#N|2ht0X_40z!fyu#gdMfn6JB7LNrJt%0 z!7AMY3NG3yxrd_vQcxc-z|_A9ZWS%RTeSy=4~`11Ry z7k;-okA6pErq-H;LpnW^`Q%}YBa=Kp^ z%bEYAe%-tUtMf}rSLZESuxLq4!V`ZQjKqM)qT+%R50gmA{)gnTdg1)yr6v85=!~cw zibu(kyw$l2Y(=?=vGx9*B6;*9WQ?a-^7wkel0`9Of1Xa!cK|FHaZV2nACemhfEGe9Q%eosXkK{ltNUp27ajO=GRYH{eNKaD>V zf#0d>SLuDT1steiH?`z`;(yt%()(ul)m2pi*cm<9-+xlSYM^~0_NxZkClYsbo}&8s zbiXK88d0_W$IN%Ffl;cMWc_=>0fA~P&CrlgzZkGy72oavHW8hw@vd7~k?L16qJg|_ zVTdsLezFhL2TVfse=-!|sSg~$a1Z1Z1JV z`WajV<2===XuD6>W3gQLPpZcXT$NULm6eCN#Az~d0?q1yDQ-LWy4P&NxuS(IH-}SV zIA}J-%6iYrg(-MiUD*HVvu@-`GOCt#mj%F+yaAenyFB zb8NKlDQs$H`YyJ9b%O7!GF<`K5v*{pb=_F)sI;!xBoE8EuSXux{Uz}P%=MJhAdjNcRW(lgS_KCw#{*BPD z^wzMxAKijlU1g2V3lT3ZD>AJ-OT~C#JsEr^_-0v?oC(}W(DAZ;v1)odqvK`UW!3aHjCkxqg$#N+<<3@=rwveqk7*q; zMB!wIQxHaR$4?L@_m`89@qP)Nae5}8VsR&S{z06Gf~d#SgDxtoVIae}46gRB8VHPdLk>%S9bt$oF7Nnd3>gwVtzeaO3A^OMirkRl zj7y%5fLM|i9a&WphI~WDiSiV!C5airgD#@tkeMsq)q#_!zu_Q^Ua*F!Lr18!*IRkG z9K>-rad2J5X`~egtzB1kkYakx!>_VR-<$R`fZsSrctVM*iBycjRt4^3jUA+LmYd{~ix(Zh*J z{G@RK*{Z7e;tp1d^duhI)awKNK&Z~wc*sD%R&hobR{CQu!+R(?V=Qt%=AVe$l3l9GNrtj=fI za>1@tv~MSQAp;CJtA-}kcvxQ~1NkEQDEd5BA`QFmSAd;xnbrgz#9yxbx&JJg|7FUb zd)$)wPgnlad-0#9{JB>zS@@~Se`+uOQ5b?xRc$$Nidy zY&))p$~|HFp3cOuV!voKFk?i&UhN@Gq&4hM6@-TOi^pe)db&FQ6= zmK5aAk_f$TOF?E?QQjs`6Kyb>WsT!Ew#a$H_JG)vK zM2s2Kzz6Lh_NBto#$;{f*Cs~~U?&-K1ZaL<3_4)9L=x7(YRF`Nt$*@Rn=t=w6*L@# zR%0N=0U-=QV_`!KPqmftfs)xeiL;I3a%|LxXJUYZWGP!9lDEAEmQ*S?S%vWu-(+Rc z-C80Jk&B@+#un;CxdADRp-4RKp~xqgM1g)~s!^?T;43|pzEpaIL6juAp&;?95h9L@ zlNUU6k=Hm#&HfMUr!ZYfcqWYTq&VY1%Z@pNt8iBI_x$Kc`Zz)0kLHaPb^xsvmpY-PTR+fOTWF&&g4vk3%F9OA6mrV1^E}!)q;u)=Q)cg>i0{x#^T#5w0nq!}9BGa8RVSY;$gzsywKs*Fe#?Dk-YjtPxw zSA`q5rB(PbocBASF+C2Qt$(duE49M{Nut#ocrcgYFpHz%a2*K@=;)!7q+JpS;l}Gd z9)usi(TO~hXSao!cxHq$!b9UOVhs&+QF|~~!5&PpyOh%=(yD$=4!q<1SLYU%t%e!; z)g`65r3J_P=NSUV@y%Ob$uv9sGE5@hJlOV^x6AeJpX>1m&nREouSu|7lgL-dn^(GE zT7FF8Xn3U8;9pv_q#!pRG4TFR{g=ou59wGsU&?s%g(;R=0BK35{~p>WZCx7U$y@HK z)KeCRm)Bgxr;GVO!}M;K!8bl1gx#Jv-voc2x;4m3*`o1MZ%Z-Jl%Tt)KjSZTtoJCH zAR_ewdJwZl!P@Y@?*McrIfwfa}%VlgP6kT>qv^ z99{Mg>BqAqx*z#6EZq?R^5wZ~;&45PHc|oc>{k%aaRT3S)q9?Lx4~tYB?@1nTwM7k z_^*J=xVeXgeAWZ301sd+zzd+POb6wu15oB|%Kau>`qu;Ke=~r5z5}=zaF2Sw7cS*{ z0KoWu1|Z$z0Lu3gfc}31&_4r8p?>tA$(%~{Xb(Wq<=@=&&2h@(r|-yzdw(L`ZU5DI zlutQZ>x8=#^t&UbkwiUtjmX+xr&yD2n9&SrQ-$NDx#&#GpI^Mwr=|-JO}8*$EO}$|FkD zh#&+KOf-ZLf<#0O5+o`L3MwipC@LzR==nfFjfx5i$|)YG=tV_EMU9FQ5zYTw-80$Q zWEO~b_xaub^U1(u9@W*|Rb5?GUESOBA&tIbkGb#d{G|FfL6ENEHQUxNftp^Zy{1L- zKAbf;_u|}xb2rXvoI7!D!?_9P2ApeguEx0>=Q5m2aW2NW5N9RM3Y_IQ=in^ES&Fk5 zXCcm9oY^=taSp>t>CZ+?qpvKj+%QcpN+);~88HJVR|) zkzJzWB;1por{gx){f)S1Mhfq5a@{X--7j|C!$#Jpzr}UG#B~prG5>(->1JDbG3RZ~ zk9BpKW3mAK>qlnBzlXn9Oh`_XxGrby>#B)WPvLwI=TA73k!}FakvI!+vI7m|J6Kmoei5}>I?g&UvmDpC z$du%R+A0O-)i}$?^ZL`(=j4I+OmOMyI!HF%Nn9XyOK>`yk7f=WDF;Yb(y>-aNX~`~ z9`3x_KGq>U$F%>hXpwH;;Un%XqxT1r>hIH+x2?a=e6@Z3eb0TzI``$bEj!-1PucKd z7k;1k(&iIyQs{o=cU#^*@s;;RrKi-~^K|iPs~>yq?t=7fXEYtt^D$`&$s;4cRsy>NabvHUpjX(sW$PAx{BBJ*kKS>AG5x8v#^#3qHTuTe zi;kW5i}mVzX?a~f%Rb@RfBa}|Ykz9R&=ZHQdF`R^t@H<z{3SJ}l+jFx$#G_kx$NdSc9+W7kixc6>kJ##S%hGXJ>WGpwH0 z17B+o^!euM)%~n1*R0&VA$QJ@Z6BW-nS4d7EvIJ9npb!8T=V7wdY9RgdkvDR))+mm z`-ghX(A(Duf9weFs?1J0@rga3U;AJ}`1OjxXS9Cij+vp4`s?!aZttG@k^lSQi^pmY zE_ku({0|?v=E3`(_J5ZDWQT{&xi{m2XOq)<4c~owP#HbuZ*O1PYtaRXtExVE<;vgp zyx#quuPVo$f3xvY=Dbrnk2))F(jW5{J>F{Rl^u4U{>i;>zq={%;|F)T%^I<~`Do@q zGY6VE(9D5m4m5M1nFId;4zyhE_;l?T(#&r{}t8v|oYZb0<;<^*pw{We&)rUcJQbNOg+Xy~P9HiiV3tUxP z6L8JMwF9pCxE_mZIj$XXU50BHT-V~-71vF;o``ETuHA4&+@|~_T$2+UmV>w&=t}i^ z59-nzy-yT~&TPCVI*V~7dMa@xdR8<_?-Pzn#P`v0#vc6rra13+#(BRd&imRp?~_PK zVh&zz=Q!_Ey4ujPrg^ocFbH z-X~G#j5%!n$9bO`=e-)|{jfOiv*WzakMq7P&il$Z@0Z1Sznb3vnjk2y;F7vOfyKHU zHgra3-0kAmo<9?Wbq)~M6$o`N3fT={KUmms83P|-fhUPutOQ83ItCN4}6 zmeItVeN=BqVDUERxpqCucOG!9x-LOj;R<%u-jN_|p&*}q4ErbG?uk6qcaHP3 zBJI(m8qfWrk3w=nqHw0G{u2`uh0k35b!Xc|;XZfyP#C*h&%^M%#+BdN;}eBXT+ik0 z6NQbg{DyT(6mnhoi%&=t(p>3l&>p9_o~y0}GhO^tze^DEUHE%GOAubhT&8oZ{U$+} z>w>TNAwd||NFI+cCm$VYDy`&%^O|2=3{4A@K*yD-wffj)M+< zwb(tMk9HNu-d==bJQ-osU?~ns-lvGwRi$`IL@6S@T3qa z-Li31;@ZS2VN*F0L7M33>m#{vQx>FWKS1J2Q9-%t(}@?I|}ZqtHnvv|#zPh74*b zmF6w35qg8lJj`>HqJ^k_B;y6_j@oM)?k)$X=_nWGGW?;a#~rB0@onqs=GN!!%ck3E zz}f(I0$}BsU88^eaLVqA+?=w7^E|}L?&3*zh?m`f zZXcd)<_nP3#aZm(T3>G;-NaH)nl=a8gxY^Fcv4`uJ)eORe211$UJA+Sb(kIFGD`De zu~KTM%6!XCLpnd6q&jI^L!Np;Ug_K6ly($qNb_s4hcB}=R_IW=khC>?-KnsjQFQj|-;q$G`><@k{5DYfaTUR&F4MxienNI_LG~jTl(5uL< zm7?q!u*fsf!*bD|XQAFQ^aM#jF_S)SnW9<2707%8`K-e%DCr2|dvDlQqM?Y%2H9iM zXQVy3CE(VK+m2{XEi$*l6X|NpJ!zXUr~&C2(o0;cL{lgDdSw2BeCG>y2{hKKtD7GM zvOCJpkGgRELHTj(O`4fn!_m;OIrDr)ueW4VU;61}a3p~7>p>QQMCk<^Uag1yx zX;3baq)|uW9le=?bMj$iXe<1+tArgMc9 z597dh*zk|yzz^E+U2)(&e7yXRL?#WBWg+|072K=N@oQ|3{4e z-5&W9{7Heszla0hVZ*=>OIO z&guV}(ZAOte@;J#e-{V7L*Vf5Hv@E_v9d-ynhO&s_T8~&pQoVV|OM&Hj29!o!` zZ$G1Np9emtkHde71K%NVcx@c`K^y*C9C!~O$3GAUKE#Iq?g8ieV=nZERrj3y7gQ({0P3+wKzn$?6u%TLgk( zzZSx}M)P-Dz$455dgOnb@Qz3R34$*(=(_>d3cItmVbf%Z*MR;3;8<6s7 zp_=7OBOBrqjqOt!ja?e*-y(3NAt!mBcfd0_TKLS)lj=eqFvS?$2e0=Xf`zod+G$6j zeQ1;vtvy+R8NiP{2=^C^-RA-K7@KDDUump$25YZelt%U;l|?jY6fza>3jyc6aF5FH zeQ?w-7wIX|Kee4C3vw7?-mDsy$wGp4t$jj?;Zz!oR61}uo(JHxx08){s0?}FqkKNxDD?d z2R_+`ckzI8zC8@SM*Bq;B+%O*a`~MtXic9F{>(Ydr#sn|cf)bngN&kUeZTqWCU#u* zSI1&hZyG!GbJaUG=OK^<9#Nao$P=e=Niynvv~Vi(lj4rMvS|!O=~C@K)TBTrFVZ`hde}>2zpX zkghAMV^2Gs!~57uP<}mGy54rWI5Z<&f0nM7oz98THO^0E>4wA{&l*#n1Drp610%Z?R;3% zUIF0@i;L6PhP@+jSsES(huYhHkZpMfznGzN&WwXY?d?7|4wt2~;^0twyAO`TWobkl z9BOa(!Ev}Ojr7Ff(%Tq^%hD)M94@_$akw5D?TN#sw;@iFkNZEFo;X~38{=@5GkVxa^$cf#dYW#yDJd#(3a3eX%hPmz^vR9H%cf#^JJaZX+Crn#OIK@b!EsaLg~MfMVhoO(8ZR6!J2@_# zSZcg*xa>@F;lxtY2q%4@kIT+v7fviSUN~HKa$PvF)WqWOaoB#0!@Adx!v?XK63vJ5 zc{_?R<|2YYb8)>f9;3()L1GVz2PXKAi5VkOY^t!)*f7D@BeOe3?^!(c?K8kuzp=ol`u)Mi>~mw9gW#n${LeV> zn{0TU2b{;T24ay$v<)bZiQVehIGke0Jc>C3&pZE7yb+(ywc&jJ zy)hrB+wgdER5#l26Ih>%#piXM>g(>R>rhB0MP>`|mwZK6jal7@PnvKkt219~5Su6Y zBv)ZYWIy;z8(G_xBc4xuO2I0hBJhE)cZw29ee()LVxn!CfzoO9PP`caUWdzB9rzlC z*gEjGx)J@ZTYX#6`T!>?9~-Hmnou2<`FgqPz*mcLPdVC8W4S^7L=$fF4aYn&p96~R zCzS8C$oDu`zGK*&DMiX-^CFt=MqVTfd`{hqrpG{&zn-Qeoo}HwX(v?q!e|p(-_F;b zP~3kc)@5X}E3H{-$QQz!E^PME+ybqSC%jCwCFwd^LFYbr+Gl(Nk(STrmd8ZmsVs{2 z)2hEoz-<^0PIW*`07B4Ra0MTxNe4*U*)4UiG048;=Dv-CU7U$ z)7r4k?S%JyB5?Q|bu4|PD`-WR`{4E5?27=0ek0)Ugyi~Slt*jhMnl6-0XJzD#(j`n zzJYm-br|b7I%FjHL32MmW=U&Uh&MEQG8*q4twrnTQiZdz)@39jkC}~TOlU1hf-lV_ zXJ;Va$*4Wi5S?pjEOR~_h0xP{jmlhib#d>@oChNBjIG*7E_ z8_#!9{ytxbmH$%Q{D=D7v2%C+hq7Bf-(cvfc0!9dZE}(g=WAyg^IWsxe0@=4__;Rx z?YQ+m*O%&Q6L-CbGvA8V|HVoh=f@Z(?|ki4Y`I+C$1r(MI;^};_BrcLY3)|D{OI~m zvL4wJZsVKA%6Ts?FRzX% zhkWc3;WF@#w1-zYjrrQfcO@%>uZ4=Gh3mZ~uwAFs>pf>aimXWrJoi{_7u78Mj(D*m zM!&@3$7^xU=RbtIebXST&wJAE%PjQW&DtFGJdBQeJf<(YS5(uAaBA<#umiE&aq6&! z@#jPjKa6b3aNlFdyWzY%t$XGz;pPbE=PTgnN%j0}Y^iv;TZJvY3*l3|=0Q8xKU+|* zw!**Sz|Zz^IA5<2+pg4K@`c@pT_gL5ou-YgD+a={6~oTOT2`Xam$}zY3)Rosg4Rb& zW46@I0X`q)^CdGo%-467+n&KB@T?FrMI(Udngcg>g0DwrnLWmPnb95f+njaqw6`AZ zlJ^9=I#zlhTDTx)# z>PTRVOsf99LTl_{7)_JKXozY@k^@RdsTQJ6-z2zKEBY9031GAqelK8dFTlaQ7w}ZT zzjNU_u-4c$k@Ef41*5j6GM4~G`FQAJD2BT~F79}S`P6L{-$h){>T|8{ zMOHz#@84KcA*t`s+KOd{Kh5iJI47Fd-!%N42A7Th#`>GfF;1T8@^9ShZ%$|9WoPt5 z5rQLIk28XdYqwH`AT!ZO<9jK6xNtxwh;yWj)SZTXveV9%rsCJ55=SGuM`#rmV-AYs*f0jIN5E z{c}7Ax{{AM*Or~8tjC#a%g!0Dat=3_IoFn*K`xxb&1KHDWhcXh6HATgCWq)rpKHrb zQ`Y0O#_p->5Y={Kzehe7_&Zw*AAc_JcdVm5)LbBkcVOf1xiPemUtB71cnd~Oo@pj_XU@#g{uH(@R?gU$cM zp9|#h_;Z0Ae!NFJQaj&>ok?hZDgInw)?b(lJcs2OZ!S<1CikUGtog!Uo6nku=-;8{v*uxp-;VayLf>^qvZ88{?3K@Vi$HUH zO^q#LJe0i^5x2iM7nbew-Hn(++_|vqE;c;QTv)bb!{f|_We>OEapuCZb8L8=xiHYS z26KSXx%wu|g@Lw5g+t7RW%sq=@#n(U$CMqNb4jV+g(lvN3+X?f?>Sa}{JF5rF~1{m z=YQzAus86_p+n7uad`Z>FbIs{ZNssJAM>Re;xDz~$9cgqt_=Hl zA9ByZ(i{fma~{j=THpB|^B9NP-|0~E8P446b;22TTY1mDzGcJX&pA1BX3l<2l#hEi zCkO8A<3#XyyEr*%o&B45+Qz##Iq96en1M)zxq&H|)hO&h_Ydo{(*W*u&)CK?wJzI%_Rrti?i=egbcGkNXK zM6nDiE4nX}d-o(KkLaFEhue`UnxC^DQ#3z^F4~K!%$LgI1Vop6ABy-pG4Z;z!-~J? z+1w4#vKH1dP| zN4mQO_Q?$C>&X(4kk-r_?(<**XjP|ofF!H6nw4&`5 zEi<~0R{0T@c&J^pqGdY!XGP0&V6=CZ#P-gL!W_AtZtrXLfoqL}1G~+JedqyOZ^J(F zfK}VDT^_KO_4{N+WyvY8U;Q3gQJ6zRJM2G2`-6RoJe@w^z$^wEFMRHTIeAXE_pRFP zQJ33n*cTqK^)~EF4_LJg`^p2>vVI?|C=E_s`ql4&6@@u8w8Q>VMBg{avoU=H8!vq8 zf;o9kxA&#m>rt26Y}j`mu=O_Vdk7zY*t`dGi zo{i}v*m&V*7tG0Xy1g&eK99QGX2X8*fUUP-wH~l)8}^$AtY!T^S5X?Ay7a5x<0=Y^ z_UmJOWxfIRw)^nATXFr}R_KiJ3Ll?yAHvxg%F*S{x_<7HJNz6Z9PcY-ds;>L>FCv$ zk*Bkt71`40evXIE^H=0q!S=C==9vKBpX^mz;Zz^Z8~+PD<36HOPg+Gd1HT^NM>KtZ zAK$x*(*L!ctDL+p6Z*69=V$e0$L?6=q+5w}e7`Cx^U%9hIXKaMsyNPna+j*N+9V{h zAqm~kzU@OtOvo6MHDM5aCLO<`NJxbA(96-I2D3+6AjTgjj2u4d+%XMOHv*42XV8R! zBQl2#WY~5Iu`ekehb+eqK4&!c0JZBwH?E@T@ep~(1#>zG+^FaVFQX~l_1Wswhi>Rc zBa^2U%_z+&D#cEs2{f@KC6yi}OnhiY^{goHu!9 zVNMB4iP&)45lfakBWG6Wv}vXJECp3Q<^>Ttqo9ZZsiYaxXXcdf z+$e2nNkLB0#f5po7AJeUiD4JLaIuIUiSWF#oXMp&84gZ8+vo+Wqs_+=Hv3pH$-s8_ znNcuh%FG$Ocn{W5KJM49@~BESpD0y5pZDbq@(vNu$((wQZb z@B=uzNV@T41_5H2K`$I;(7lTpPTG2Ad1GFikM>j?E97_?s zsi)|3Jg_3^#*-of#85;p9E#}PMUj)Xo}zC6XW7$@iz4UIridP+6gfbfB6@UFM9;Al z(VKdTzQqG8l5RXHB0vm9^unQt?p+i)Y3nKa8E}?8-FRkCfSBy*g_AwqyRvuE)@T1u zz*+WmLoCUIf+@r==r~#-e|*PDMK_dc=wQjOVoyt6(9kTA-4kR)7D4tq2y}y4Y$0c6 z>9jG$B?agp^olxL^p&5zBkV~t3oqs=h`&>(L2*)YqPw_c+9i3DOADqIjmgi+oklx4 z^146~mx?h@Qp{5{cSYGhF&#f4ZVx9hMwwKLl2&;ad0?m+)olKpYkJ^Kjuk}c~WAY z0x?g)n5PhXs%Opjs1@S~-FQkY0b(SUUN{m<_b!Qb($-7tkASo6>4tKdR#E_cotKNB zPV*PVIVCxTg?WYS#j!}?yqFM^lyS~ZI$G?1LJav4w7$#fo`U|2ty!sna@iLp|kiT7sII zH7DJWl;`B;7L*o1AJU6M3g*8pc&sO0dO0hJBq>JR-f}8NH_hV~Hf|!0JL9OW4u9x| z8tzEPEyQVZSONu9B=g!9TZ5TP9F-E=B~w3y?K|EESbt}3|H6qQ!5Bk*k!~DX>E1;vJyKoj&D8(L z0}Y47|MlU6Q_uhPL4i}x!@2rDIdVofBwO|X(|NQ9FZ4*R2p?cNKzr~)kM6+>J;x4S z=naWB8(`9SfQk11z?cDb!qEc%QgKbenT`{4?fA=X__e`btbuRv#^aHG@+9Ic#yJsZ zHO?wQ=zz0JxgeZO=Rur!jydVQAYc|qz-n834;Clsmxc#lhmXI1wr+gR!+Sbg0M@E? z-Jdw$KBjfuMx0gM6Y8o?_SIGS%5hd*UFEB`s(dy46mTyHR#l2{bycxYS5@n)dl^6G zeHB@~f%6@l&O!AdJ`vxjekt}dE4hv@XYY25SYOVv`_j9wrD6mth_j*Lip@ z&&Bz!Ak6KHXH5|1qZul%!MAPa;9Hf*uL@`F)i@!jWjMtJC>y5_Cl&+H!VdvI$*yM@ ztv_jvJlbR1?UT`DR(-Qki>IKii30k9rVlivu&1YhLwIzg;v9mr4^E#zT}lw#VyWqp{lA17$}^|2M^c(}FR2)H0g!FjfJ_Op;1TzHz<;9BbikPT3_zg9ScH2H^3v!M1G zCk?NUQx>n!Y}BW0LGAYIuRxv4DzCo+bm2nv!KDmz)nBe%@X-48&zDs?m(`U>fG78* zWhEL8Zw_^-qDG(s4sl7g`{JQ4)9rqCs7p1YeO;|{Va0NGQ~#=~TvS{8mIGYdX1#!< zcAD~}N`d<6)wQ!~YrEE`5!SlXK=V+VS^H;I)}H00AwEa*VIqrM!RN}_#r0{{3eX!) zS(V6!>a$>0U1jak`ZRI!xw^LYGbhbj@A@o2o$szs<4IQ;B)hiQNkby*st@tNsa-zn zi>qr7b*YZ+lAceGklNTNY+~x8CH6GvDm=?{zEHm=F1i~;KGxyTj*PT>Rv~sdu#Zf- zwh~$jSJcm&_O`K8SQ4MG(oWM}xDqqVxlm{@Nj8knXI_UKXb+Njd#YTAUse$OaO?W6 z6Ha64hI~r%hrO{c2GyC&1-EAuLL%qPv1hDe1Z;Ga!+7B(>=(P>FK%%j-kv2vS!*ob?MCrWp z^C;J=elc`3BG!IE{O*C1#=Z`}ciFJUm-4^NZ?tyIft-Xz#Aw(~SWmJzBsR`F(1Uk) z>v{*i*Diq8aJ{QR6W1<)d2_#mSAlm(7{vt_h1vx$CJUnPP%Pe&^@({`!|D?I&Q-q{ zBJe=CbR@E!!Dwf#*7#jSj=d|{K&(z^&sIT@CUL%b%y&ubhjps`utQ>!a4xWDr3HO8 zG!Ghsj`qld_U@w{{Am3b?HHSjXZo69<6S8kiv6c0(*y-bo#%cX=f1nWR)O|%q@7#% z_ptbmF3z`UY2UUKMic*5m$NfwfAmz^X^Pi!2I@-tW$}GCd2Q*N*_3m1XVMhxh)HWU zC_nn`2z>*aR&!AL{#biF5D>lwawaIHJEEGdGmx|M71L-g#2?~z!0L`jDJ)zuZ^>FkT*j+uwQsleF{;3cZ)f# z*dOCO`U*F1M@m6oe5P`USHw;FVl0(NbtcJ(hcSauPP^YV#^~sh!pUq^D(yB+Ty)Co z1?yzt$*V5(W%fMePVGWm;caxeXGz_$l8~%rR5nvUn^O)^MqiGj9aSk!EUo=vgK5Po z?Qu<_$6)<5{}L5_C63zRV#ZJUiW9W}FM;+5=B-I`%J)E=gg0D*2#chh-c!Au z`qOs{sTGE!*AK_l(I&KOD}5=Ir@S1LMSB?O5z;tLA3cL<3~CMHBP(piw$7x8*f4{&b#?efU6jDo( zJP`-^j=4l5FVjtBfAA)LZFqW;v?8ojk!(0;?D2 zEZ?!4w?woDIQ^1%(I3C-A^mtXGyricDiOprqJvt3x2%%`{Sq*f^%VXK0Eds%uZTv% zpuD54NZjXEg?11pE)bk_m(yRJyh$^1AAn%IN03&a{#}IHp3HtZLt2CC$6J$2EUh1> z6_R8li1S=iI5p?r7U(Yo4%2E=fXlyHNnD|R!}q)9`8bw~b954;maH}DK&k~vA?XnM zT||Fa-g8+U9cklz!QHa_jaNyI9J$+^YmcVYfokFSEsbTu?FBTn{*J~VjTn_d;yU$Q zsx$38{h!I*;Yn=njzq^^J2#L$ZY78kE=^p6kPat1T!K0te@G0HIPyTqrcmmBhfGbp zq*_MvPhps)=z4@!7F#tbR-E=&}QWS_Q!AN#-RK>W@YKi ztI?4ix531X0NRH8VDy_V;v;X{;lconRNdo_sAN(K#}9NkOkM|Xi}(^Qva)6{e}im3 zw@tMFI(^^8?H&BpKEz9)9k1!z4gZZ2PJ&0{crFg7kFV6v-Li*~80=Inw-_#zm4K zvb;x{yHiK%caAUW)Zd}ZkwdP1I@vmaG#J<1q;2^qB-YnI#icEx+Mf3~(tbR?)!0v@ zSi~jZ9cdo2uUylTS0BwK)@C&H_-6o@v>HjIBU!P2o%eW(dLE~QFi9g&%)}ixh>gZk z3}j@Slo`SZ{ByKgtR?7=*f8lfKIVz$5Ub_5ogw?h(~-A8_JPL_z3FnOYy}NhfblLL zA2@HDugx52=0GzCnmN$Sfo2XgbKpP7fn-70i|jgzJw!?6Bmkih^xfEi3!ql zX|8m$^sw|d=^5!IX`{47`iJzn^o>*_9gsTsd-(l+!#~(R#y{Wxr~hQRmwc9dwme>* zBF~cVlvl_pN^fPbGFF+WtW+LS-d3uW8f8#mNuXzNQ1J5LqTn6D2ZE0UUkJVtd@uN~ zU~RB<=(y17q4A*`LmNWXp>IRKhJFvJ>M(VNx=3BAo~>P}U9UZ?ZPLEd67(^8@9?w6 z9Pp6HNasjVWNqZB$hydeNL6IAb(6Kider)vCigIk5`=-` zI{8)Q7v=fDmx1n~?V)P5i}s0jw7y<{OWzg#A>7qC-O!EEW`Q}+yu*Cl++zM}9urX` zM_K1vw5~NBdF1<(wCk`86Ozm8VP1sQ#6N}7nrx32y4-Q;Tka{eI(8HcaU@C ze7R6AmP_R_d5&BzSICv}LixGC*MZ@|tAYbUoAs~t-}R2+e&O_RcDNw?Ncc{3t(k|~ zuC|cTL|$J@Tq-UTmy0XVva7{4;#%=3ah<42NBJN0pCoUVrz=w6?BE~4XF}7}9jUb7jtZNQO`14IEEg-pN=V0IQ{3rSQ_%;6^|JD9m{LlNt z@+f(td4z(6M{>E4+ftLb_k6QEevfAwNeLxlY3O3)?FK*&C*`de%3nZgZ0V!N>JT9Tohgt z?q-ZNmKj@&e;Gd+spb^(QS&SF)X0R$U6CD;j@D@FM(Zu&L%D#RzXjnaai}<7d=($b zwWO=07o>wy*gxC$-B_1d)01Qx^})+tj*IFY0qkJYP+;AwOXx(-bwGSi@L6l(9hHJ^%DIy z)cNoF3;Gv&`|t?V{L%2%@X!jbL zw*H>}OZ;>EFZti`f9gK~3eT0Vls`l}FN6U`V75Hze>Mfe_Q`bKQTN5G+b;fHy$x|8Es76oM8R&Y z|EvC={5|B0AmPu-zsYAPmnypgrv$TusiD659P@2+u$5=cwU$`VSTCVXzp${>PN+nl zJw#a?ES@P|0lECUxIw%?%9rN(@Ap6E|HS{5{}{QmJV4$e|3m&!&Qv~DK2rvwRlf`L z56Y0VzM=O*dqc;osTM8HE<`AB%2!k>rVGxi(p%oEL5(cAto+dxKlM81ps9=YFo z!}{3z))K0*&K*2iB0h_@{z#lBJ%qM?OPb-o9qqE-KUrP?{rRZ;P~i2z&w-R+%g||| zEJ)t!&^MuD)J$m6XVeeTw?;x2ou!xRtMpC!(c%8#;_%Y&Kf?#Y0pmNA+b(iapbRVeSO7*=6XZC#DA6l8~>y7Px2LkfuUPN?}tuR zduU_yS^ACoUHWy#9p;kAX_iTNSoxKYzhnHLhfY^Db-H>dBx1Arj(SjSp`~j5wQ1Ue zXuE%Ed$pgmgXrr?dNTUDrBBd{(91v9F9=US3oZ&j9bO;)Dcs6vYkY3(Fh2&LI-qxt zj!P6nrRxl$tDtIn*>6Bn`a8__`urhcH zZ0-H9wND4v2VaK0-3p8QLGWPkMDV;YbR~4{%b`7?1EHSkY3fk*Ch-0vXn+qvSs#70 zK3y-@AJm_L^#6)pe^z*Q_;%2>HJoCo#xP@oaj{WhylLz)lFSp#2=v%I^A__N^JR0B z`MLRU8ta$t2slmyxh8;s)Lj6O5 zP)2A(=zMq*lS5NO^F!B%mWKWYpJHR^%}_h_Wc3R5HuVAZWwj%$%BkAvnqRv_yA0mN zjoK3JPHmO;g7zBvDFj|@^W*;*R7F{vVHm@)rgHBv$ZZNCNjo`=@a~t$yN~C8bHIf#&J+dh> z7&pj_*MTk;M79@V(3wlm=w8>oF7AyYy#L$`&Nhh7N15qdYYBlItL zW^L3CY8SPKnx>9br@-sELY)tbc&oZo{Y?D|R`EymXf0X0TAQ!k4^8(5tl|MJNk2~S zr4P~1(Q{!B=jylUox+N7f$^fz$xMa3yl4JsrbhZlM!|FWoAo<8bOze3W~gcAu80chgVN`|Gm4 zNM8!u`5gWZiDv3tw@qwZYnGZLzjn z-&j9c2dG^#d0kqFM~f$ky~K0Gsjy@7#4eH|8PXZjFzGt!W$8WXOX(E<3jb<<3%R}g zr2MkHLv9^-Iq+8S*pM7LGxSnufqnyOvqZlgI_F+k((9qkz6iH6+nL?Xo{*TZd4_qW zIUV|bfw>6&;N6g)znjlP&%SBCYwkpk`qmUC`h@MMk}eJtM~V5U$sF+-@fPuJ@p17L zXxsP1o#H3(1Cpd;q%P9QQeSBRyq&?Q;Q)U(rH?W|IYSwyT%_c|!p>B#P|B5Sq5tny zo>Sgbwke-0g9EL#cJQ|bX*0Ds+RfUl+E(p*_}qQ;v!US@!;`sR-w6M!R&O2F!o$N0 z!^^_=g`Wv;4F3bv>P^u2z~AwnkbrtaA9} zcUWtz_pHx|zr{Ww4RYTTa(|vUNxVv2B0dZ+^#jT0Z|(2s7nOjLrQ|3@N||zva=o$) zGW(wLtw=ltk++KJ$_gJRNtfjpx43vbPe|i zr^3%ZKU@MY;F0iC;m^WH866DC(2OkOBBQ{VVa$a*?|?V@tx;v5Q?#Eg^Ez!z=_j-{v&6)$b zyw$qPdcxXDUJra(e2Ea39m;pgFR;>A!^3z&-KtirS=v5rAgC#Vw<3g32=@#};A@Tz z=fP{aI(%dJw(vvnD&7t64u6Mwrx`)RGA=Z(GOjajHf}fWHNG+0qpp3-a3mc*+_cDL zsMF%eipaB(cOu_J#-P1kr1BU01p2MmL~$16t*fL-=SbH`k4UddNzh2Y_}j^re7<}a zB+P7A3P!0E!Z>I7nW>H@ZI2!;6CW13qt?We#1DekN#HpL-+vQjN!(3)cYP|BRtSw z4IemtGR9Honq%QH%`i`oD3OtoMUj;eRCa}r+(qF_@qkz$T?t+KH|YldUH+~99T@+d zA`g^Dpw2mR0mfO^!2f(#{#rg&xlj2+nG~2Ecrmag@F7NA9fKzY`v=3&kVl2OhsK63 z34I#c7n;HR#y#ry>OS>=Drl{=w%V~;56IdDup^(L=XBC<(jV5}fGo-3f#Hi-OS~E` z0@qg>Zy1{Sg;@bEuZ}zyc{%c?^`o^PzO7GKiu$IAXNh_6>bHyEh=SBolBA$yLf;IR zMoH&NW2GEviZoR!k>*HCq|F$cACOvLG&aJ2seh<^f!t5or0h_tf~`WMLiwSt>gnnw z@N7R(zeJCyQInxH1KL!KT71w(Z|Z;QS>aOS3F8@KE4aA^Hmhai=*aBIQjDe7N2()2 z71ui#Nx9M`QZa1N-=ycH1po19^>qKu{^js5fA=TA-yR4revy2e{Ji`c{O-N-emOzu zuJlD8&QvZ`E>^BoZc-jZ4}M)asI(7s51byz2xOusmjtc|+!tsU>;f)d06*o&VEfRd zP*G@6NK@CTFQO+Oqbbly^R>I+fo;&*!ZW-U{qt-6sPO3Uc6eGHjo#>si;bs^SBx*g z*)z>C7?mVOI!5Hkbm*XK!Q(d~Ve4FLqE%!)27lTo>;|6)i5G#BB~nj+KmP##KydH^ z|0I7t#1i$0&(69%z-b^3m z>X+%Op?P-c`}M@|QQ>akw6F@BH9UM_xG-EEo*!Nrei&Z(Tj6ctn((8bGh$|9^p$TG zn`P!Lk!9$ueXU|^zV%P*2kNiYK4A+keZ;YdDh!9bEQiPSywn=rgY2J(G5bqsIYpj{ z@%lD-tkONu3z9AdTWf8!_F6~n1noraWOzz_U||Qq#)h;oWP6Y{R69!>t&M@jy%1V; zvUag{DLmsD7^hzW3p`I-pxuBm@e=KJwAQ`w10K>I)gA|>&uZ&2l7AIi_;pz<|D9ug^_)hP~*dXuK0a0;#Gy>bn#BH zGi>jr(jQWH|2%j=t>k0TE@^TGA`ew^DkSbK<$PrpWbJ3=PbHDH&8LByz^Oq4F^0U* zL!sA0hI$>miS6nx^$YZh-_%Z;s2Py5WvJ_RXw_;0@plM#ls3*-FZ{BY{2XEyE za{$Kam63-cZ$fLQSdw*~b+J`qRapPxz8rqBgyEWStk_06Nh**^rTe7ErE2L1#7w$^ z^AZ18$k#HAhF*tM{orpepD14l@BSu4&t8$=g9iFVZmEn>LV=Ir-+vX@4<9W%xGcC6 zx^P&iEVL3n?e@@#h%oJhe^ssR*7jgTQiB@TVpJmNi5Qo(#mJd*);iG+zxLyk(3BH2?iMUmK1UBhMald%7WU-Ov4u2on z51sz1yi@)bJ@q=}9@x!a;W-=|I4$rJG2+==V@4mU;_=fbk) z7)y*hj0cR@jIWJ9jbqJ|;0MU2W@eZ(F*3LX-rd9S?%p)tH$R16_oLY&at!?6!Jv6u zWJ=^pP`xzrG{y+;!*kjPx_iTWvaD=B18qAL4>3wG z$^<1}xk_0A>-PcURJ%Zzz^TyCIf1Exn*$F7dV^o*1;=B2SrohyTze+C8PVH*p#h=6 zp|e9bhdw|=0@G+2EzG9+?#Hb&`5Zs`x=)Un~fh~wN{$zLDO$$k4OOVg7J}($o$A1h;Y0DNf4~# zplM8N0;GRFq~Ia=g|8vr0naeA1&bXYg%L_$F@pHe6hv(A5FZd<7QYt%5Iah}q_8v+ zKEqULk#vW&9&w@{;9no-@9Pivhx;e^rz4WT*1yaD8{%*QS(w;DSe1Y<3Ze|jN+(2a zyVZ{xMMY6m#Zc0f42&g4z^-R0*~&P?`g0*Yg-S6ZjAhCkj4djZN^oVdvJ^i1a%F|G zN?EO}Ri1($xLw()?825v zR3Yu@h^Y(;1t$h`gZaTi#8*mT+vfz!gB6IfEDSCVE`@$x5nL7A5Zn$u zk{Ie1QV@&C4b4FeVhth?yWlUjReP$2nuQ)xfti7)FpAv`uQ3s$*tQrmchWj*-Lw>~ zCn8O0utbWc!WyM(8QL&ygqEpgY1xpUiCQkkxrNZErCJ$mRk>E7RicM2)|SFUtTE@mkb4{H-9Vx*oA9ajuLt4yDRI8cRNsV~GB zaH+mbUygCoDtIbu^tJj^7;$XSt1vFyggEIoeY?IB{!2A%${u~MUZd~R+hR0ggtOqm zRD_pfpaH28G;6p1_6RfAoMSG<$ZMln zZSFSrn0w6{=#Sb)vq;_Q<1`|4iW)I6D$0lqLnJFRk`>8@j-D9FMMSGGQVa`K7MX*n zcLj9zLX4S~!V6mtpMDj*`ZdttJ0p7{dn1WfH%qY!;hU9OWf<3$!&j)Z7Fvs~rPeZQ zIp(QWA@;Eb+UY68_ctKkyV2SN{k{#6h@FU{S6jQSJ&2vvSo`2%93;m--o%CgML9yl#>v9PL?~t+H^yFs;8W4N2pZ9qtoHB4Z|2LQ_hmJ<#Cun@}Bov zEH8zZx*W5MtK`-48hI_e?;1H#NmAM>|5+WihH0sF$_AxM*@$t}77vY83y(4h8j7?N z>7{YdK?|X8HbBqp4J1O7D9{?Y&=5<5YcOiug>h`#P|uLT;;t2lsXZ0i6xtHn3%_%p zT8sGde?t$fsn-Jkj(>P~U9cKDAYSjU)ej;fkr+-2w+$zUJB2%ARFeXYkczR57*;U8 z85YhDmm!k0I=mrVg;>(2@RkNTq9&Y-xGTk+sn5^BtRL^)tKl20HJ&oop`Ta5i`<0S zz-{R9I}sJAHg+R2y%!$CKEz`VA|jIr&!MfEY<4m`Lm#9d>XvFpYgN-Q)8U&9gO12F zvku0AoLN{!Q zY>RA%hS-HM_HL#pYT)hFMh?Q(Ct68XTPxY>WOat_NI_gE6+WN{Euvb6m5vzEFl&UB zi5POWH4bCiT=<4f)h|MM3tLia2Mwl!4LK z2q}|kgK^SCL;~`qGHEG%qUG=}d3<`UM18$8>*HyNK~wL}WW73{&0{MeHI&X`^qJ@Z zD=_D?27Y#DH3fDt8?od{cuA{Z7uTs(h$q*mN%ht+gIT|c%=XP;)@~V-?JaElvxkj& zy0I~iig8UYvs&e_RBLVfw4K?b8a*jS_C|!qg(pJ#3NgD>f%&Cn;T4DrZ-9N;4a-!6 z2yt6xjnWLVK92M)gkQQ0a>u1@H`G9|*skR)X>$ti}!EJOr??9B#9%_e4Z4w`K- zCqh!A)Z3MD%#M^X+p&hNT-e0q;b4T?zq8%uBUmfv+m>TFvlZ*=?E}Wgi(3el*u;sf zK{6~snkb42>;PGSd^Ur>oX!5PgKpm~?!(*ywQn~>v8iP<(VB%)1#3^5L*4)lzZ+wP z8btQm`jZjoQ83ex?$2hLz5?Uz#fWvU@o&UT)lTSquIW25-7ebtJeRFpD2LWw!)741 zAs)03{&EuLAJX7MX2EOBg~wP5Z?OWN;!^mC8=!A@!y{}9AFvzzzchG$SvS^sRyXZBRGCGusQzd{9k;am8+UJo~U> zrWyB8QtJlWI*2(V!g~#_z4>@_?o~v*zszN6gp!(kcN>!7Cirac=#k^>)_#6L%I?}Z9|>m<)?=z zCR2gA)TPjBtKsW!!#KDWnk@z1eg@{W3o)y`6mqp464j~R%O`0XSMSfyffv6R-uf2! z>D7qhBqD;7X2)zsAWl=tWN0yb?sf37t6^1>AUz`FCOce;*kC0z7fH-cc+&@=xssu= zNLD7oURFS3t$~%?4!gJq-f%MPo(erhk;7&6@=*;xI0=#=*2_dCq+tzKQ*mi9XwFO%P;dr5);D>e-Q^cP2I!HaNS6X4OE?SNiN~zGTyNnd*(AAJu5wf`s zGMJ8%Heqc6ALq7(ce@mGUEN@ZRzXXpVb=I5=pX~Dq&7moj6nNtS2{ym><*-2w6+%7 zK!paVLa!eN8?z0qkc~boq+pN>SyiFe%AnEK`nSP%O@bU{GkaAjFNUvK1y56e1f^q~ zTa297LUwjy#M&92-$aZ$S3@K12_#|cn2s@G8AgFskPji00?EjS&RGjjuR7FO?FM;B zg}%vDH+hbeY7grv8JK~}fWI^%oC$4_&8%0hZNEz4L(PHqsD%Dl%xu|m%v^6|w#@Nj zHnN#bS6>wq@Qq&Tt8K+jXtkcM9$SbwzX+Yb4m!D^AG}8aQuEQwfo2XgbD)_6%^Yav vKr;uLInd03W)3uSpqT^B9BAf1GY6VE(9D5m4m5M1nFGxnXy(BG90&d%zV{&i literal 0 HcmV?d00001 diff --git a/bin/dlgedit.exe b/bin/dlgedit.exe new file mode 100755 index 0000000000000000000000000000000000000000..6eb0e24579c73351c5a2ab059cf97a635fdbdaca GIT binary patch literal 266297 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 RgaQ!?L?{rUz<($O{udT2G&2AI literal 0 HcmV?d00001 diff --git a/bin/ftxconvert.exe b/bin/ftxconvert.exe new file mode 100755 index 0000000000000000000000000000000000000000..ad520cf254f0dd37b8fb49857daa80376510642c GIT binary patch literal 69632 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 literal 0 HcmV?d00001 diff --git a/bin/lipsync.exe b/bin/lipsync.exe new file mode 100755 index 0000000000000000000000000000000000000000..b62de513ad8360f4da04dfdf9214049c0856b3a5 GIT binary patch literal 258103 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 YbWvf6XIgRYXl5kIe-&4fH%|Ef06f+-&;S4c literal 0 HcmV?d00001 diff --git a/bin/lw2tan.exe b/bin/lw2tan.exe new file mode 100755 index 0000000000000000000000000000000000000000..4aeb5149236cc7fecff7e69c03f5f443f82f8ccc GIT binary patch literal 90112 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 Vub!4wtyvlLHzZDHw>7L3{|g**>U;nI literal 0 HcmV?d00001 diff --git a/bin/max2plugins/animout.ilk b/bin/max2plugins/animout.ilk new file mode 100644 index 0000000000000000000000000000000000000000..797d58ed86d72037452e79f2396540dbe426d6e3 GIT binary patch literal 86444 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 z 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

  • Gy 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 literal 0 HcmV?d00001 diff --git a/bin/max2plugins/skelout.ilk b/bin/max2plugins/skelout.ilk new file mode 100644 index 0000000000000000000000000000000000000000..518ca124890d50036287b63f7a712ef5032516dc GIT binary patch literal 411912 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 literal 0 HcmV?d00001 diff --git a/bin/max3plugins/uvout.dle b/bin/max3plugins/uvout.dle new file mode 100644 index 0000000000000000000000000000000000000000..974809ba2c18fc841984832a224321299e16e90a GIT binary patch literal 106566 zcmeI34|G&loyYGalXglcFtnhwq7Eyms4e>@k3jxF^M_1Ly9`W1CV)ai{!Ew&`R8PY zhF#(ULzLk$9%!+LYPBHLgWXoUJzWj8+lD`FP~j|gyDqr32bH=Ll6qpBwy8$met&o7 zC6ka4P|qI!{NBmE@BaDS-~HXs{rld$xIVK-qzWO-aJnu;C+>6=NdM~IAhM@^^tq|x z*_+PH=`<}nGpF3=Z?(4snl}Wh8tpYzO-;=~d$rdd2sPRLP4?myEA5TVwch#Z=~Lz= zRNpmw?|FZ_zRPg8RK2}xBjT5;ezVJm`@`$r+0}^qw(8#{?gKL2-+p;l2YSTRHwfW231K5DLbx38 zYzar9M3{KdW!yyzLX?LqMf!-yxN(n1-E}7M9jF&>v)C==Ch*pq#adFd-XvyEATnO^ ztTN~&{S#dCgWk3v@{}TKBLcFmqlN9Lb$+0>Dp-XvaU=3zgOsIv(p7+AGCwXRPW>m0 zZAr+{J?Vm6*L;6m@Fn1-wo83m$B_$o8=7l`crFccU?Ao8Tp?GKq@IIJfC(@GCcp%k z025#WOn?b60VZ$_1Wwb{Q(+OJ=U?%()$=5IpZ*ZMXQspZ8fBcqqj1kdcna-Vj;FUC zKOW6`=92f~E%5Hc6JpOh6x~C@H z5em(?72ac{;D;1_oH7ci#Am6*Pssb+P4F6ShWEc@%Xae4kdd7qfcHzP<4aU!glq|t zX^)YD`rF{WL*7>MZYK4cNO%s(ttF8MsMs@jfbDsTlv*e)l|rwR89CJGa!Ql>o*-L1 zr0T#2;r$O)w2+ierxLq~#;R%XzCk5^MrBLLyOnaANG^xU2FZeaQuP&zzC$85if$yO zH;~+3vTrt7@Bj&yQCgI=oFhv=h78$x?ENJZ@MwMEzJiq%t6~^OqVoRFYHzGNk<_5! z{G-qRDAg9L_`R-=5|a7FC?9bRX|AEziXmOsoI~AW_Ii^IflL)(3UKn!M*p|f!CChixYpOB8WqwJbf1H+xb1>XKD1s@yH+D9lMZIaA zKHTDk#xrb`{+40U;URKe`8y^lzkiba5mU#nf3ke<1bht>EVdX6V>-zg?8f{c`MACZ#?_ZJ-{y}MNYX{YkL*ILwUGC z$?fm7Pcih4&R-UvAHJiDrq1#0|J0lQsB0kh$w6IrYc5M{IRcu~GQL5h^l!a-{lx#9 zab?Nt!+9JZu5W!v*jsNpXvdklf}nB6cHDK3lt;1)!+g4vk!nrl#-4o`n@ z8O~BznX1Bl7VY%Gf|X{QJJ$Ff8aOPmCoYkH@GJ)Ou?uNw_K?X&AV>qWmQyAA%$;Rs zTll1Y5h=rG&21)z0=!=Mq z(Rq-vh9SqwXVOrxbUOziDtd3ibO;|aMO*`#XCQAT$+mk(7lFjFpQmj*Mx9ie+$(vS zlt1>1v~9;Jv&{D>Y>jpVG11U{2jWes7rvd89Hr#adZEv>Vo3CUak#!vx~wnUWjaLF z|A~6_YCS$WPxgN;`UL$Sbv+$h`i`zgU5E9VLD-qxn@0xFn{pmtoQ^*q_F-g4oCBJ3 zAl$V&;ye&;KOjPBJy}TBTsCd*PB8bsvPbrkExOxAp@{3E=DDajZQ9PQ6x~I>k+MUk zkWVSwDQjaFHho)kpJ~rqCK2)UV}a9llElUz%+ox!=#D9SaL~e&p{$7s1vz)j zgNG1wzvem+d+BW&oEIb8$S6v9ff76yBird$J4lB+DM!#5<6`)z{3$QA00L#cS7krj z$M*9n+0T?b+|NC^v_e4nlTfa{f^q%WaWpluht$=JadAdFVwdH@XqewdI{J^&q8)92 z`t8RPYku!7*j+GeB2JtO`@_eq5m&$DHk7xWEN{nZF|_dqR?TxjD_Wg;%#GeHjehwx zC@<4zwovb$v}%@!>#*iFM?6Qg0vukRgeuK*I5J&x_G_*qkrJ~;h@XrUS$g-3RO}j( zvt~&1^o5Vli+K8|7hFSmJE>jMqVL1+b`HX)DdrgrA2&tdw-2UHi+&%8nsZQgV_&q~ zgsNj`$i}W2;G~t7r=IOZd&Q@)rdqe7J*n{l;fzJlZMH;51S>Vq(8gD+n)85GQk(k2 z=VTGjpl04H6+_W_?1tKmlt?L^3ys9uQQ8eS>(8g1MBkmOwU|-p{2EK|49yekE;3UC zG;Fd377F!bqH85nWP@pW>Zw@KTe_Y>KdWo5zKE&kmw<~w7$2z^H>vT_<*`NN*p;I^ zF`83%#mAW~B1iA=`~WLCLZ}NTKE;fl!+%XNxgMQHZ5c29(9B*LwtGL-Sa$`bEsUP_%o8T=cQDik>Re|EK9q z$)^MZ5`4l-UPU9x;9z$e1*tB5W(l^QNXH-!9Z{!ME)PScFsv-vF@$Fv>`hO`_of6m zElQ$T8Ys8SXRfAQYzRriyO<5T*pOV^D0z5w`-2(;`@?;7zV0# zc}`m}-B&=GFZGe;t2{fD_NuUn!qF$4LP35Qk>2J3~Xk*trOa+=2yQBTEJ8yRi?a!f<-jv?|phJ+SKlCv}4qJ~!+aU!aJEXYW z*>FDV@7-RX;v1k5;~6T8eY-a?2KwE;3zSH&0Un7bj!bi7;~`s}{q28GXVHC9EtZKg zq-wi6$R;cXrM{Df?lP&y*4qUd@iR%O?^z==Yiu1@HfRgR1Av8Alf7FBiAOdF2M5df z9j5&_r{Em*v)OYYAonb!+V+j4x(4M&gw!c?rish?j!>1(A$RQfC2Fg^cOO-;mynnF z_8Xax%S`J?o5$;-Y0;-q3ayt%B#UuG>gYq;wJ7=L3+EE$08J z`24?~5&h@28_M~03j8s@=@p*Sc8H!OyXF3bWZ|RtYIIn|{$8N(PMZ{V@_Kow3wDH;oPsYx_U<$a(3Yj8QwDl_u{@QU^_lp} z&6aF}bwU${^>>7LktkkBWAi7n&!~T* z{K@zy@@>g;E1B;#=8yXMVVv?4<{S1;#%H4T8RaL+PuM?d?MSw7vhtb6E61eec--JHsAtfFot{B25QnR$_Q_-WLsmUF7hCKRB&|8&dlqRvnGu|8jlCeXSWl2h>_?dH@16Tl*P8dv zm7LHs_RHEIg+EgJY1Bq^ysE%(36~=(J6g;0N?4a-deiFTRsq;6wRM&XEo5D#wc9%04c!!8Le`4jJHnSu z!L;z@l+fQDJc1Nda?`4cmHJuwnG%86Owfc0Wbkr|cfO9Z?qxhXSVMT>9a^-?y)yP2 zyg%xAm(-+&?jWHHl+YDQo#V8I+pQuv-Oz23x=|Ph1B}jfFiy`Pi}j4d(tlR^#45SB zsK0i~9D3D0I)`ISfC(@GCcp%k025#WOn?b60Vco%n805P0esKmj&NfC(@GCcp%k025#WOn?b6fomc_UkmcZ1egF5U;<2l2`~XB zzyz286JP>NfC(@GCcp%k025#WOn?b60Vco%m;e)C0!)AjFaajO1egF5U;<2l2`~XB zzyz286JP>NfC(@GCcp%k025#WOn?b60Vco%m;e)C0!)AjFaajO1egF5U;<2l2`~XB zzyz286JP>NfC(@GCcp%k025#WOn?b60Vco%m;e)C0!)AjFaajO1egF5U;<2l2`~XB zzyz286JP>NfC(@GCcp%k025#WOn?b60Vco%m;e)C0!)AjFaajO1egF5U;<2l2`~XB zzyz286JP>NfC(@GCcp%k025#WOn?b60Vco%m;e)C0!)AjFaajO1egF5U;<2l2`~XB zzyz286JP>NfC(@GCcp%k025#WOn?b60Vco%m;e)C0!)AjFaajO1egF5U;<2l2`~XB zzyz286JP>NfC(@GCcp%k025#WOn?b60Vco%m;e)C0!)AjFaajO1egF5U;<2l2`~XB zzyz286JP>NfC(@GCcp%k025#WOn?b60Vco%m;e)C0!)AjFaajO1egF5U;<2l2`~XB zzyz4UUoL?+Hl<{f^(k=o7|l3f61#1}W>$pl3EZc_Jq))9E)(vt>B80t_hGo-B7P6t zD{yzgoq#(7XQ(pno(ds6750_>rVR~VySJ^SIS`~gS5;u6y|}r?7xV@itD2f9ZE17M z=74{LFKC}v^9j2nCuiY&dtpO^y^PXY?PcCpZ(x(RmPF;X0(KOl&Klf*h5G@x`w>pV z{R_B%1ov&YH{m`5?r}H`@hxx;xPHX9!?nTfg>xe9%W(4$Zp8gtaI@f!B7Pt4KDcKQ z{wmy5g#EbRiuTC)%x&zHMRIWJG(%`SD3VQ9$ z)%D(*pgp5?zM-$Wxyei6YJUs-t@(wuwJW3$V(|c^?Y^p7dsDN0lQ#fn%>jE|RgJfm zipk3v2s8%}%4nT}>X%iu24%{;PuQ2(GyF+1_U0CE6M79QbK&ASLOg)LJ$`g$z>9k7 zs{9S1fHcZTe<0w8@uM;_YVGt_C;!F)zt7jID_uMvm>{;CGj zY=je8Bx@wK8oE%p)!*D?M3cs((Hla19Q{aRpPVtCjJR?Ca~V(OBwG#Ju67@9ZjO-W zP%;5~+C#UQkWk@=#;7 zHy|aj#37*~KFj|WfO8v}025#WOn?b60Vco%u8Y9dTZPR&1Mdtzz~}hu0>{EkfC(@G zCcp%k025#WOn?b60VePlLtwX?ew~S5hgX`#tTMBBJ}K=u(n^rFwRA-8b);G0o=!?z zTy7SNk#;dDZ9CFhkk*%^FVkZdZO}K~g`b1Aj+Z`B+B497J=a;-^A_C8a64hg7Ptnu zYPj7<+YfgH?s>Sok+ux(rwIQFt^(m9+|9UK;XVLohx;VlA9J0(&NfVi4VSL7%snX6 z1b00b_r>J2{=fQS=?d4<@?~l!egvhz;K6#<-RTO_eS9f~2Mj&720wOlWi$uD+M*x>rjq;ASl~uL%U|U&N>)#~Azndz_ z?8X*+Yx9x}H~A5peBiMJ6JP>NfC(@GCcp%k02BB_3EagQ zC+nZGwr4$+btdc0tn`IWi4(0tzUe4mB zi&rdOwRq){^-JoPY+my9CEr}~!MpFshY@xmw&3=@GRINuD0QrMyzc06yzQ8g>Bzi0 zvm|p>=2tQgXMQ*H#mv*0x2boiesz<2LOs3U=L_a#IkP&m{wwS7!WS1lwCIsV-&pjc zMZaDoveU9ZlKrXdX!b+dk7j=}`>E{jW?#zA&N-I*^Sh_#7v{g5e>(q_{DJ)6Qr(IW z>v0px4T@E{O|dH(%6*DksaAYSlM+<^QQ4||LD{W5sO(q1t~{wct30Q?q`ad1REa5X zDsL(8DJhO=j@umb9l4GIN3|p9IP2(hyyX~lTz1@&IV)2X2w{c#*_rUxo5VQ^qn5eK zJmpSBQ5GoK%3`HJDOO69WvI7YS*@H>PAg}XSCwzL=b)1f#PIIi-l;0;0ySG* ztQM%nYKgi`b*ts-YIUu;UaeJqYJ=LM2Guroi@H_aq3%?7t9#Ua>VEZ6^?-UNfC(@G zCcp&#YzQnba^T5V2>PE*`d>|F?%JB>TJPGrs*M}hhJyZv*0qgQZE8zHXoJ70b*=n& T%(W$(s{{Vpcw~M{ZMFD6Eat}M literal 0 HcmV?d00001 diff --git a/bin/maxscripts/example.ms b/bin/maxscripts/example.ms new file mode 100644 index 0000000..dc4e9fc --- /dev/null +++ b/bin/maxscripts/example.ms @@ -0,0 +1,26 @@ +-- Always include this line. It defines the "exportskl" command. +include "o:\fakkutils\maxscripts\exportskl.ms" + +-- This is a comment. All comments begin with double dashes + +-- Because of some wierd behavior of slashes in filename strings, I +-- recommend you only use forwardslashes in filenames. That means +-- that "h:\hm\fakk\models\julie\walk_norm.skl" should be +-- written as "h:/hm/fakk/models/julie/walk_norm.skl". The +-- other alternative is to use double forward slashes ( "\\" ), +-- like this: "h:\\hm\\fakk\\models\\julie\\walk_norm.skl". +-- Choose whichever is easiest for you to do. + +-- The following line says to export froms 449 through 481 to the +-- file d:/winnt/profiles/jimdose/desktop/test.skl. Do this +-- for each animation you want to export. If you have a lot +-- of animations listed and only want to export some of them, +-- comment out lines that you don't need by placing a '--' in front +-- of them. + +exportskl "d:/winnt/profiles/jimdose/desktop/test.skl" 449 481 + +-- The command "exportsklf" tells Max to export the animation +-- at a different frame rate. The 3rd parameter after the filename +-- is the target frame rate. +exportsklf "d:/winnt/profiles/jimdose/desktop/test.skl" 449 481 10 \ No newline at end of file diff --git a/bin/maxscripts/exportskl.ms b/bin/maxscripts/exportskl.ms new file mode 100644 index 0000000..f703a1e --- /dev/null +++ b/bin/maxscripts/exportskl.ms @@ -0,0 +1,26 @@ +function exportskl name start end = +( +local range = animationRange + +-- HACK to prevent Max from crashing from a divide by zero. +if start == end then end = end + 0.1 + +animationRange = interval start end +exportFile name #noPrompt +animationRange = range +) + +function exportsklf name start end rate= +( +local range = animationRange +local oldrate = frameRate + +-- HACK to prevent Max from crashing from a divide by zero. +if start == end then end = end + 0.1 + +frameRate = rate +animationRange = interval start end +exportFile name #noPrompt +animationRange = range +frameRate = oldrate +) diff --git a/bin/maxscripts/jimtest.ms b/bin/maxscripts/jimtest.ms new file mode 100644 index 0000000..a7378db --- /dev/null +++ b/bin/maxscripts/jimtest.ms @@ -0,0 +1,56 @@ +animate on +lastpos = 0 +thepos = 0 +for t in 1920 to 1941 by 1 do + ( + format "Frame: % \t" t + + guysize=80 + bboxminy = -9 + 15 + horizminy = -9 + bboxminz = 118.5 + + at time t PelvisPos=$Bip01_Pelvis.objectTransform.pos + at time t $TAG_ORIGIN_MANUAL.pos.x=PelvisPos.x + if ( PelvisPos.y <= horizminy ) then + ( + format " One: %, %\t\t" PelvisPos.y horizminy + if ( lastpos == 2 ) then + ( + print "Last pos" + at time t $TAG_ORIGIN_MANUAL.pos.z=bboxminz + at time t $TAG_ORIGIN_MANUAL.pos.y=bboxminy + ) + else + ( + at time t $TAG_ORIGIN_MANUAL.pos.y=PelvisPos.y + + if ( PelvisPos.z - guysize <= bboxminz ) then + at time t $TAG_ORIGIN_MANUAL.pos.z=bboxminz + else + at time t $TAG_ORIGIN_MANUAL.pos.z=PelvisPos.z-guysize + + ) + lastpos = 1 + ) + else + ( + format " Two: %, %\t\t" PelvisPos.y horizminy + if ( PelvisPos.y <= bboxminy ) then + ( + thepos = bboxminy + at time t $TAG_ORIGIN_MANUAL.pos.y = bboxminy + ) + else + ( + thepos = PelvisPos.y + at time t $TAG_ORIGIN_MANUAL.pos.y=PelvisPos.y + ) + + at time t $TAG_ORIGIN_MANUAL.pos.z=PelvisPos.z-guysize + + lastpos = 2 + ) + + at time t format " Result: %\n" $TAG_ORIGIN_MANUAL.pos.y + ) diff --git a/bin/mcopy.exe b/bin/mcopy.exe new file mode 100755 index 0000000000000000000000000000000000000000..09e6156ee606659cc21ecf0c89cfdbc65dc53ddf GIT binary patch literal 65536 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 literal 0 HcmV?d00001 diff --git a/bin/newq3map.exe b/bin/newq3map.exe new file mode 100755 index 0000000000000000000000000000000000000000..e9749aed4fb7268ece263935cb322732f1c17cdc GIT binary patch literal 315451 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

    =5zC3IO1_RD&2If_{ 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₀> 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 CfnkvV literal 0 HcmV?d00001 diff --git a/bin/q3map.exe b/bin/q3map.exe new file mode 100755 index 0000000000000000000000000000000000000000..6dd4fa3f4da62da980b58bdc1e847ca3b874d4d0 GIT binary patch literal 307268 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

    6>)+f_n_Bvtf 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

    @aF5gsH&+eHu9+Qm(|>&(uvNTy$CyIZ=QMi*qO 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 literal 0 HcmV?d00001 diff --git a/bin/q3radiant.exe b/bin/q3radiant.exe new file mode 100755 index 0000000000000000000000000000000000000000..ee8e58f4760a1045be039d1343d024dddf5daf18 GIT binary patch literal 823296 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�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 i<)>0=+#p!c_(^SA~@~U4lHS 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⁡a!D*@ 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 SKu4e>&=KeebOio41bzW?AS=TF literal 0 HcmV?d00001 diff --git a/bin/radiant.ini b/bin/radiant.ini new file mode 100644 index 0000000..8507cfb --- /dev/null +++ b/bin/radiant.ini @@ -0,0 +1,241 @@ +; Command mapping for QERadiant +; +; Syntax is as follows: +; Command name=+modifier+modifier +; +; Use +ALT, +SHIFT, and +CTRL to modify the keys +; +; Example: +; FileNew=N+CTRL +; +; Valid keys are: +; +; A-Z +; 0-9 +; ESCAPE +; TAB +; SPACE +; BACKSPACE +; RETURN +; INSERT +; DELETE +; HOME +; END +; PAGEUP +; PAGEDOWN +; UP +; DOWN +; LEFT +; RIGHT +; PLUS +; MINUS +; MULTIPLY +; DIVIDE +; COMMA +; PERIOD +; LBRACKET +; RBRACKET +; TILDE +; BKSLASH +; FWSLASH +; SEMICOLON +; QUOTE +; F1 +; F2 +; F3 +; F4 +; F5 +; F6 +; F7 +; F8 +; F9 +; F10 +; F11 +; F12 +; NUMPAD0 +; NUMPAD1 +; NUMPAD2 +; NUMPAD3 +; NUMPAD4 +; NUMPAD5 +; NUMPAD6 +; NUMPAD7 +; NUMPAD8 +; NUMPAD9 + + +[Commands] +;file menu +FileNew=N+CTRL +FileOpen=O+CTRL +FileSave=S+CTRL +;Exit= + +; edit menu +Undo=Z+CTRL +Copy=C+CTRL +Paste=V+CTRL +;Preferences= + +; view menu +NextView=TAB+CTRL +;ToggleCamera= +;ToggleConsole= +;ToggleEntity= +;ToggleZ= +CenterView=END +UpFloor=PAGEUP +DownFloor=PAGEDOWN +ZoomOut=INSERT +ZoomIn=DELETE +ZZoomOut=INSERT+CTRL +ZZoomIn=DELETE+CTRL +FilterWorldBrushes=1+ALT +FilterEntities=2+ALT +FilterPatches=3+ALT +FilterTranslucent4+ALT +FilterLiquids=5+ALT +FilterCaulk=6+ALT +FilterClips=7+ALT +FilterPaths=8+ALT +FilterAINodes=9+ALT +FilterLights=0+ALT +FilterDetails=D+CTRL +FilterHintsSkips=H+CTRL +FilterModels=M+CTRL +FilterAreaportals=P+CTRL +FilterTriggers=T+CTRL +CameraFromEntity=J+CTRL +CameraToEntity=J+CTRL+SHIFT +CameraGridMove=FWSLASH +;ToggleCubicClip= +CubicClipZoomOut=RBRACKET +CubicClipZoomIn=LBRACKET +ToggleSizePaint=Q+SHIFT +CenterXYFromCamera=X+ALT +; select menu +DragEdges=E +DragVertices=V +CloneSelection=SPACE +CloneSelectionExact=SPACE+CTRL +UnSelectSelection=ESCAPE +DeleteSelection=BACKSPACE +SelectCompleteEntity=E+CTRL +;SelectNextTarget= +;SelectAllOfType= +SelectSnapPointsToGrid=G+CTRL +SelectClampPlanePoints=G+CTRL+SHIFT +IncreaseLightmapDensity=RBRACKET+CTRL +DecreaseLightmapDensity=LBRACKET+CTRL +MouseRotate=R +MouseScale=L +;SelectScale= +ToggleClipper=X +FlipClip=TILDE +ClipSelected=RETURN +SplitSelected=RETURN+SHIFT +EntityColor=K +ConnectSelection=K+CTRL +MakeDetail=D+CTRL+SHIFT +MakeStructural=D+CTRL+ALT +ToggleDetail=D+CTRL+ALT+SHIFT + +; grid menu +SetGrid1=1 +SetGrid2=2 +SetGrid4=3 +SetGrid8=4 +SetGrid16=5 +SetGrid32=6 +SetGrid64=7 +;ToggleGrid= +;GridUp= +;GridDown= + +; texture menu +ShowAllTextures=A+CTRL +ShowInUseTextures=U +SurfaceInspector=S +CloseSurfDialog=ESCAPE+SHIFT +PatchInspector=P +TextureFit=F+CTRL +ToggleMoveLock=M+SHIFT +ToggleRotateLock=R+SHIFT + +; misc menu +NextLeakSpot=L+CTRL +PrevLeakSpot=L+SHIFT + +; brush menu +Brush3Sided=3+CTRL +Brush4Sided=4+CTRL +Brush5Sided=5+CTRL +Brush6Sided=6+CTRL +Brush7Sided=7+CTRL +Brush8Sided=8+CTRL +Brush9Sided=9+CTRL + +; curve menu +InvertCurve=I+CTRL +BendMode=B+CTRL +PatchTAB=TAB +TogglePatchOverlay=Y+CTRL +;MakeOverlayPatch= +;ClearPatchOverlays= +;RedisperseRows= +;RedisperseCols= +ThickenPatch=T+CTRL +;IncPatchColumn= +;IncPatchRow= +;DecPatchColumn= +;DecPatchRow= +IncreaseComplexity=RBRACKET+SHIFT +DecreaseComplexity=LBRACKET+SHIFT + +; commands not on the menu +ViewEntityInfo=N +ViewConsole=O +ViewTextures=T +ToggleCurveSelection=U+CTRL +CameraForward=UP +CameraBack=DOWN +CameraLeft=LEFT +CameraRight=RIGHT +CameraUp=D +CameraDown=C +CameraAngleUp=A +CameraAngleDown=Z +CameraStrafeRight=PERIOD +CameraStrafeLeft=COMMA +CameraGridForward=UP+CTRL +CameraGridBack=DOWN+CTRL +;CameraGridUp= +;CameraGridDown= +CameraGridStrafeRight=PERIOD+CTRL +CameraGridStrafeLeft=COMMA+CTRL +CameraFastForward=UP+SHIFT +CameraFastBack=DOWN+SHIFT +CameraFastUp=D+SHIFT +CameraFastDown=C+SHIFT +CameraFastStrafeRight=PERIOD+SHIFT +CameraFastStrafeLeft=COMMA+SHIFT +IncreaseLightRadius=RBRACKET+ALT +DecreaseLightRadius=LBRACKET+ALT +;TexShiftLeft= +;TexShiftRight= +;TexShiftUp= +;TexShiftDown= +;TexScaleLeft= +;TexScaleRight= +;TexScaleUp= +;TexScaleDown= +TexRotateClock=PAGEDOWN+SHIFT +TexRotateCounter=PAGEUP+SHIFT +TexDecrement=SUBTRACT+SHIFT +TexIncrement=ADD+SHIFT +MoveSelectionDown=SUBTRACT +MoveSelectionUp=ADD +SelectNudgeLeft=LEFT+ALT +SelectNudgeRight=RIGHT+ALT +SelectNudgeUp=UP+ALT +SelectNudgeDown=DOWN+ALT diff --git a/bin/runq3radiant.bat b/bin/runq3radiant.bat new file mode 100644 index 0000000..29918ac --- /dev/null +++ b/bin/runq3radiant.bat @@ -0,0 +1 @@ +q3radiant ..\fakk\scripts\fakk.qe4 \ No newline at end of file diff --git a/bin/tgaconvert.exe b/bin/tgaconvert.exe new file mode 100755 index 0000000000000000000000000000000000000000..6029dbc2a43e9f6255a05aaf5cbf22b30b17752e GIT binary patch literal 65536 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 literal 0 HcmV?d00001 diff --git a/docs/AI.doc b/docs/AI.doc new file mode 100644 index 0000000000000000000000000000000000000000..c8474ca52baacf5780c1247747d95e8cf55072f2 GIT binary patch literal 103424 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 literal 0 HcmV?d00001 diff --git a/docs/CVAR DOCUMENTATION.doc b/docs/CVAR DOCUMENTATION.doc new file mode 100644 index 0000000000000000000000000000000000000000..2a1ff70262e24f2c5558d861dbe59fb93056b5a9 GIT binary patch literal 72192 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 H0tfy-<>E>_ literal 0 HcmV?d00001 diff --git a/docs/Coordinate System.doc b/docs/Coordinate System.doc new file mode 100644 index 0000000000000000000000000000000000000000..c31e3ebd198810c44139c03ca0acdb429209b666 GIT binary patch literal 59392 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 literal 0 HcmV?d00001 diff --git a/docs/Dumping Demo AVI.doc b/docs/Dumping Demo AVI.doc new file mode 100644 index 0000000000000000000000000000000000000000..ff4127c3ad361c0c09e116912d316bba14cfc5df GIT binary patch literal 32768 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 literal 0 HcmV?d00001 diff --git a/docs/Event Spec Documentation.doc b/docs/Event Spec Documentation.doc new file mode 100644 index 0000000000000000000000000000000000000000..107c21d8a6431fd5b00fd52a6e8be5204047a6ea GIT binary patch literal 20992 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 Dbtv}( literal 0 HcmV?d00001 diff --git a/docs/FAKK FAQ.doc b/docs/FAKK FAQ.doc new file mode 100644 index 0000000000000000000000000000000000000000..89e70efb7d8a0b08af58713bdd5d3321f77ed6eb GIT binary patch literal 35840 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 wItJC3gcNB} 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 D9>Hr% literal 0 HcmV?d00001 diff --git a/docs/Gibs.doc b/docs/Gibs.doc new file mode 100644 index 0000000000000000000000000000000000000000..4d6bc5373f7af71b72c520108ca668dc769317ab GIT binary patch literal 35328 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

  • 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 literal 0 HcmV?d00001 diff --git a/docs/Inventory System Commands.doc b/docs/Inventory System Commands.doc new file mode 100644 index 0000000000000000000000000000000000000000..6fddcee1221563d6524b9c5272de737d736c608d GIT binary patch literal 30208 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 literal 0 HcmV?d00001 diff --git a/docs/MAX2SKL Reference Guide.doc b/docs/MAX2SKL Reference Guide.doc new file mode 100644 index 0000000000000000000000000000000000000000..9ba8b1a01e299052e76a75d3117e93d42a2b8563 GIT binary patch literal 38400 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 UYg8{SyY;;BEH4TBQ_#Tw0hzEgLI3~& literal 0 HcmV?d00001 diff --git a/docs/Sound System.doc b/docs/Sound System.doc new file mode 100644 index 0000000000000000000000000000000000000000..0c185ba11d5ac5633f95831b4ce5edad5877fb2e GIT binary patch literal 23552 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 BN00yj literal 0 HcmV?d00001 diff --git a/docs/TIKI Model System.doc b/docs/TIKI Model System.doc new file mode 100644 index 0000000000000000000000000000000000000000..542abbbc7c0d677d87b37606ba6989a4e36b380e GIT binary patch literal 62976 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 G8u(u#@B*&@ literal 0 HcmV?d00001 diff --git a/docs/camera documentation.doc b/docs/camera documentation.doc new file mode 100644 index 0000000000000000000000000000000000000000..70e107f393e0d2634dc64be517e95957f650efb8 GIT binary patch literal 29696 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 literal 0 HcmV?d00001 diff --git a/docs/commands.txt b/docs/commands.txt new file mode 100644 index 0000000..24b2b73 --- /dev/null +++ b/docs/commands.txt @@ -0,0 +1,273 @@ +COMMAND DOCUMENTATION +- Version 1.0, March 13, 2000 + + +Client Game +=========== + +cg_classlist +cg_classtree +cg_dumpevents +cg_eventhelp +cg_eventlist +cg_pendingevents + +AI/Routing/Actor stuff +========== + +ai_clearnodes +ai_load +ai_recalcpaths +ai_save +ai_savepaths +actor +actorinfo + +Client +====== + +cl_classlist +cl_classtree +cl_dumpevents +cl_eventhelp +cl_eventlist +cl_pendingevents +clientinfo +fov +rcon +reconnect + +Game Module +=========== + +cam +changeoutfit +classlist +classtree +dualwield +dumpevents +evaluatetorsoanim +eventhelp +eventlist +exec +gameversion +give +giveweapon +god +headtarget +kill +killclass +killent +noclip +notarget +pendingevents +removeclass +removeent +reset +resetstate +restart +script +showvar +snd +spawn +state +testthread +viewangles +viewanimate +viewattach +viewdelete +viewdeleteall +viewdetach +viewdetachall +viewmodel +viewnext +viewnextanim +vieworigin +viewpitch +viewpos +viewprev +viewprevanim +viewroll +viewscale +viewscaledown +viewscaleup +viewspawn +viewthingnext +viewthingprev +viewyaw +whatis +wuss + +Server +====== + +kick +killserver +pause +record +sectorlist +serverinfo +status +stoprecord +systeminfo + + +Sound +===== + +loadsoundtrack +play +playmp3 +playsong +snd_restart +soundinfo +soundlist +stopmp3 +stopsound + +Network +======= +changeVectors +configstrings +globalservers +localservers +heartbeat +net_restart + + +Renderer +======== + +gfxinfo +imagelist +modelist +shaderlist +skinlist +vidmode + + +Input System +============ + ++attack ++attackleft ++attackright ++back ++button0 ++button1 ++button2 ++button3 ++button4 ++button5 ++button6 ++cameralook ++forward ++holster ++info ++left ++lookdown ++lookup ++mlook ++movedown ++moveleft ++moveright ++moveup ++right ++scores ++sneak ++speed ++strafe ++togglemouse ++use +centerview +in_restart +midiinfo + +User Interface +============== + +dumpemitter +editscript +editshader +inv_restart +inventory +invnext +invprev +invuse +listinventory +listmenus +loadmenu +notepad +pushmenu +soundpicker +testcenterprint +testemitter +togglemenu +ui_hidemouse +ui_loadconsolepos +ui_saveconsolepos +ui_showmouse +ui_testlist +usedualwield +warpinv + +File System +=========== + +cd +dir +path +touchFile + +General / Common +======= + +add +alias +bind +bindlist +clear +cmd +connect +cvar_restart +cvarlist +demo +devmap +disconnect +dumpuser +echo +map +map_restart +maplist +meminfo +modellist +nextframe +nextskin +ping +prevframe +prevskin +quit +scale +set +seta +setenv +sets +setu +subtract +testmodel +tiki +tikilist +toggle +unbind +unbindall +vstr +wait +writeconfig + +Video System +============ + +screenshot +sizedown +sizeup +vid_restart \ No newline at end of file diff --git a/docs/shader_manual_new.doc b/docs/shader_manual_new.doc new file mode 100644 index 0000000000000000000000000000000000000000..2bca65e581e042adb2aebb05573fa06e53eea202 GIT binary patch literal 569856 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 z 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�&j>?3%Y09pG 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

    $$FxvIaZYq_WH`CUIh%TA!hS4e9O?h`W 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ό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 literal 0 HcmV?d00001 diff --git a/entities/entities.def b/entities/entities.def new file mode 100644 index 0000000..76c0098 --- /dev/null +++ b/entities/entities.def @@ -0,0 +1,1194 @@ +/*QUAKED func_beam (0 0.25 .5) (-8 -8 -8) (8 8 8) START_ON PERSIST WAVE NOISE + +This creates a beam effect from the origin to the target's origin. If no +target is specified, uses angles and projects beam out from there. + +"model" Specifies the model to use as the beam +"overlap" Specifies the amount of overlap each beam link should have. Use this to fill +in the cracks when using electric on beams. (Default is 0) +"minoffset" Minimum amount of electrical variation (Default is 0) +"maxoffset" Maximum amount of electrical variation (Default is 5) +"color" Vector specifiying the red,green, and blue components. (Default is "1 1 1") +"alpha" Alpha of the beam (Default is 1.0) +"damage" Amount of damage the beam inflicts if beam hits someone (Default is 0) +"angles" Sets the angle of the beam if no target is specified. +"life" Sets the life of the beam for use with the persist spawnflag. This is how long a beam will +be displayed. +"numsegments" Number of segments in a beam (Default is 4) +"delay" Delay between beam updates. (i.e. slows the effect of the beam down) +"shader" Set the shader of the beam +"scale" Set the width of the beam + +START_ON - Starts the beam on +PERSIST - Keeps the last few beams around and fades them out over the life of the beam +WAVE - Make the beam follow a sin wave pattern +NOISE - Use a more computationally expensive random effect, but the results are smoother + +If the model field is not set, then a renderer generated beam will be created +using the color, minoffset, maxoffset, scale, and subdivisions fields + +If the targetname is set, it will use the target specified as the endpoint of the beam + +/*****************************************************************************/ + + +/*QUAKED func_rotatingdoor (0 0.25 0.5) ? START_OPEN OPEN_DIRECTION DOOR_DONT_LINK NOT_PLAYERS NOT_MONSTERS TOGGLE AUTO_OPEN TARGETED +if two doors touch, they are assumed to be connected and operate as a unit. + +TOGGLE causes the door to wait in both the start and end states for a trigger event. +DOOR_DONT_LINK is for when you have two doors that are touching but you want to operate independently. + +START_OPEN causes the door to move to its destination when spawned, and operate in reverse. It is used to temporarily or permanently close off an area when triggered (not usefull for touch or takedamage doors). +OPEN_DIRECTION indicates which direction to open when START_OPEN is set. +AUTO_OPEN causes the door to open when a player is near instead of waiting for the player to use the door. +TARGETED door is only operational from triggers or script + +"message" is printed when the door is touched if it is a trigger door and it hasn't been fired yet +"openangle" how wide to open the door +"angle" determines the opening direction. point toward the middle of the door (away from the hinge) +"targetname" if set, no touch field will be spawned and a remote button or trigger field activates the door. +"health" if set, door must be shot open +"time" move time (0.3 default) +"wait" wait before returning (3 default, -1 = never return) +"dmg" damage to inflict when blocked (0 default) +"key" The item needed to open this door (default nothing) + +"sound_stop" Specify the sound that plays when the door stops moving (default global door_stop) +"sound_move" Specify the sound that plays when the door opens or closes (default global door_moving) +"sound_message" Specify the sound that plays when the door displays a message +"sound_locked" Specify the sound that plays when the door is locked + +******************************************************************************/ + + +/*QUAKED func_door (0 0.25 0.5) ? START_OPEN x DOOR_DONT_LINK NOT_PLAYERS NOT_MONSTERS TOGGLE AUTO_OPEN TARGETED +if two doors touch, they are assumed to be connected and operate as a unit. + +TOGGLE causes the door to wait in both the start and end states for a trigger event. +DOOR_DONT_LINK is for when you have two doors that are touching but you want to operate independently. + +START_OPEN causes the door to move to its destination when spawned, and operate in reverse. It is used to temporarily or permanently close off an area when triggered (not usefull for touch or takedamage doors). +OPEN_DIRECTION indicates which direction to open when START_OPEN is set. +AUTO_OPEN causes the door to open when a player is near instead of waiting for the player to use the door. +TARGETED door is only operational from triggers or script + +"message" is printed when the door is touched if it is a trigger door and it hasn't been fired yet +"angle" determines the opening direction. point toward the middle of the door (away from the hinge) +"targetname" if set, no touch field will be spawned and a remote button or trigger field activates the door. +"health" if set, door must be shot open +"speed" move speed (100 default) +"time" move time (1/speed default, overides speed) +"wait" wait before returning (3 default, -1 = never return) +"lip" lip remaining at end of move (8 default) +"dmg" damage to inflict when blocked (0 default) +"key" The item needed to open this door (default nothing) + +"sound_stop" Specify the sound that plays when the door stops moving (default global door_stop) +"sound_move" Specify the sound that plays when the door opens or closes (default global door_moving) +"sound_message" Specify the sound that plays when the door displays a message +"sound_locked" Specify the sound that plays when the door is locked + +******************************************************************************/ + + +/*QUAKED script_door (0 0.5 1) ? START_OPEN x DOOR_DONT_LINK NOT_PLAYERS NOT_MONSTERS TOGGLE AUTO_OPEN TARGETED +if two doors touch, they are assumed to be connected and operate as a unit. + +TOGGLE causes the door to wait in both the start and end states for a trigger event. +DOOR_DONT_LINK is for when you have two doors that are touching but you want to operate independently. + +START_OPEN causes the door to move to its destination when spawned, and operate in reverse. It is used to temporarily or permanently close off an area when triggered (not usefull for touch or takedamage doors). +OPEN_DIRECTION indicates which direction to open when START_OPEN is set. +AUTO_OPEN causes the door to open when a player is near instead of waiting for the player to use the door. +TARGETED door is only operational from triggers or script + +"message" is printed when the door is touched if it is a trigger door and it hasn't been fired yet +"angle" determines the opening direction. point toward the middle of the door (away from the hinge) +"targetname" if set, no touch field will be spawned and a remote button or trigger field activates the door. +"health" if set, door must be shot open +"speed" move speed (100 default) +"time" move time (1/speed default, overides speed) +"wait" wait before returning (3 default, -1 = never return) +"dmg" damage to inflict when blocked (0 default) +"key" The item needed to open this door (default nothing) +"initthread" code to execute to setup the door (optional) +"openthread" code to execute when opening the door (required) + The openthread should send the "dooropened" event to the door, when it is completely open +"closethread" code to execute when closing the door (required) + The closethread should send the "doorclosed" event to the door, when it is completely closed + +"sound_stop" Specify the sound that plays when the door stops moving (default global door_stop) +"sound_move" Specify the sound that plays when the door opens or closes (default global door_moving) +"sound_message" Specify the sound that plays when the door displays a message +"sound_locked" Specify the sound that plays when the door is locked + +******************************************************************************/ + + +/*QUAKED func_earthquake (0 0.25 0.5) (-8 -8 -8) (8 8 8) NO_RAMPUP NO_RAMPDOWN + Causes an earthquake +"duration" is the duration of the earthquake. Default is 0.8 seconds. +"magnitude" severity of the quake. Default 1.0 +******************************************************************************/ + + +/*QUAKED func_exploder (0 0.25 0.5) (0 0 0) (8 8 8) + + Spawns an explosion when triggered. Triggers any targets. + + "dmg" specifies how much damage to cause. Default indicates 120. + "key" The item needed to activate this. (default nothing) + "thread" name of thread to trigger. This can be in a different script file as well\ +by using the '::' notation. +******************************************************************************/ + + +/*QUAKED func_multi_exploder (0 0.25 0.5) ? MULTI_USE RANDOM_TIME VISIBLE RANDOM_SCALE + + Spawns an explosion when triggered. Triggers any targets. + size of brush determines where explosions will occur. + + "dmg" specifies how much damage to cause from each explosion. (Default 120) + "delay" delay before exploding (Default 0 seconds) + "duration" how long to explode for (Default 1 second) + "wait" time between each explosion (default 0.25 seconds) + "random" random factor (default 0.25) + "key" The item needed to activate this. (default nothing) + "thread" name of thread to trigger. This can be in a different script file as well\ +by using the '::' notation. + "health" makes the object damageable + "scale" set the maximum size for spawned debris and explosions. + + MULTI_USE allows the func_multi_exploder to be used more than once + RANDOM_TIME adjusts the wait between each explosion by the random factor + VISIBLE allows you to make the trigger visible + RANDOM_SCALE scale explosions randomly. size will be between 0.25 and 1 times scale + +******************************************************************************/ + + +/*QUAKED func_explodeobject (0 0.25 0.5) ? MULTI_USE RANDOM_TIME VISIBLE RANDOM_SCALE NO_EXPLOSIONS METAL_DEBRIS ROCK_DEBRIS NOTSOLID + + Spawns different kinds of debris when triggered. Triggers any targets. + size of brush determines where explosions and debris will be spawned. + + "dmg" specifies how much damage to cause from each explosion. (Default 120) + "delay" delay before exploding (Default 0 seconds) + "duration" how long to explode for (Default 1 second) + "wait" time between each explosion (default 0.25 seconds) + "random" random factor (default 0.25) + "health" if specified, object must be damaged to trigger + "key" The item needed to activate this. (default nothing) + "severity" how violent the debris should be ejected from the object( default 1.0 ) + "debrismodel" What kind of debris to spawn (default nothing) + "amount" how much debris to spawn for each explosion (default 4) + "thread" name of thread to trigger. This can be in a different script file as well\ +by using the '::' notation. + "health" makes the object damageable + "scale" set the maximum size for spawned debris and explosions + + MULTI_USE allows the func_explodeobject to be used more than once + RANDOM_TIME adjusts the wait between each explosion by the random factor + VISIBLE allows you to make the trigger visible + RANDOM_SCALE scale explosions and debris randomly. size will be between 0.25 and 1 times scale + NO_EXPLOSIONS, if checked no explosions will be created + METAL_DEBRIS automatically spawn metal debris, no need for debrismodel to be set + ROCK_DEBRIS automatically spawn rock debris, no need for debrismodel to be set + NOTSOLID debris is not solid + + other valid tiki files include: + + obj_debris_glass1-4.tik + obj_debris_wood1-4.tik + +******************************************************************************/ + + +/*QUAKED info_grav_pathnode (0 0 .5) (-16 -16 0) (16 16 32) HEADNODE FORCE PULL_UPWARDS + "radius" Radius of the effect of the pull (Default is 256) + "speed" Speed of the pull (Use negative for a repulsion) (Default is 100) + + Set HEADNODE to signify the head of the path. + Set FORCE if you want un-fightable gravity ( i.e. can't go backwards ) + Set PULL_UPWARDS if you want the gravnodes to pull you upwards also +******************************************************************************/ + + +/*QUAKED light (0.75 0.5 0) (-8 -8 -8) (8 8 8) LINEAR NO_ENTITIES ENTITY_TRACE + +Non-displayed light. If it targets another entity it will become a spot light +if "LINEAR" is set, it will be a linear light +if "NO_ENTITIES" is set, this light will only effect the world, not entities +if "ENTITY_TRACE" is set, a trace is done betwee the light and the entity.\ +The light is only added if the trace is clear + +"no_entity_light" - this light will not effect entities, just the world +"light" - the intensity of the light, default 300 +"color" - the color of the light +"falloff" - if linear, specify the linear falloff (defaults to 1) +"radius" - make this a spot light of the given radius +"angles" - make this a spot light centered on angles +"spot_angle" - if this is a spot light, what angle to use (default 45) +"entity_trace" - trace between the entity and the light + +******************************************************************************/ + + +/*QUAKED detail (0.5 0 1.0) ? + +Used to fake detail brushes, convenient for grouping + +******************************************************************************/ + + +/*QUAKED func_group (0.5 0.5 0.5) ? + +Used to group brushes together just for editor convenience. + +******************************************************************************/ + + +/*QUAKED func_remove (0.75 0.75 0.75) ? + +Used for lighting and such + +******************************************************************************/ + + +/*QUAKED misc_model (1 0.5 1) (0 0 0) (0 0 0) +"model" arbitrary .tik file to display +******************************************************************************/ + + +/*QUAKED info_null (0 0.5 0) (-4 -4 -4) (4 4 4) + +Used as a positional target for spotlights, etc. + +******************************************************************************/ + + +/*QUAKED info_notnull (0 0.5 0) (-4 -4 -4) (4 4 4) + +Used as a positional target for lightning. + +******************************************************************************/ + + +/*QUAKED func_explodingwall (0 0.25 0.5) ? RANDOMANGLES LANDSHATTER NOT_PLAYERS MONSTERS PROJECTILES INVISIBLE ACCUMALATIVE TWOSTAGE + +Blows up on activation or when attacked + +"explosions" number of explosions to spawn ( default 1 ) +"land_angles" The angles you want this piece to\ + orient to when it lands on the ground +"land_radius" The distance of the ground the piece\ + should be when on the ground ( default 16 ) +"anglespeed" Speed at which pieces rotate ( default 100 ) \ + if RANDOMANGLES ( default is 600 ) +"key" The item needed to activate this. (default nothing) +"base_velocity" The speed that the debris will have when triggered. (default 0 0 280) +"random_velocity" The variation of the velocity. x & y will be from -n < X,Y < n and z is 0 <= Z < n. (default 140 140 140) + + +IF RANDOMANGLES is set, object randomly spins while in the air. +IF LANDSHATTER is set, object shatters when it hits the ground. +IF TWOSTAGE is set, object can be shattered once it lands on the ground. +IF ACCUMALATIVE is set, damage is accumlative not threshold +IF INVISIBLE is set, these are invisible and not solid until triggered +If NOT_PLAYERS is set, the trigger does not respond to players +If MONSTERS is set, the trigger will respond to monsters +If PROJECTILES is set, the trigger will respond to projectiles (rockets, grenades, etc.) + +******************************************************************************/ + + +/*QUAKED trigger_teleport (0.5 0.5 0.5) ? VISIBLE x NOT_PLAYERS NOT_MONSTERS NOT_PROJECTILES NO_EFFECTS + +Touching this entity will teleport players to the targeted object. + +"key" The item needed to activate this. (default nothing) + +"teleportthread" The thread that is run when the player is teleported + +If NOT_PLAYERS is set, the teleporter does not teleport players +If NOT_MONSTERS is set, the teleporter does not teleport monsters +If NOT_PROJECTILES is set, the teleporter does not teleport projectiles (rockets, grenades, etc.) +If NO_EFFECTS is set, the special effect will not happen and the teleport will be instant + +******************************************************************************/ + + +/*QUAKED func_teleportdest (0 0.25 0.5) (-32 -32 0) (32 32 8) + +Point trigger_teleport at these. + +******************************************************************************/ + + +/*QUAKED func_useanim (0 0.5 0) ? VISIBLE TOUCHABLE CONTINUOUS + +This object allows you to place the player into a specific animation for the +purposes of using an object within the world. + +This object should point at a func_useanimdest which contains specific +information about how the player is supposed to be posed. + +"count" - how many times this should trigger (default -1, infinite) +"thread" - thread to fire when used +"triggertarget" - what to trigger when used. +"delay" - how long it takes to be re-triggered ( default 3 seconds ) +"key" - item needed to activate this + +VISIBLE - if this is checked the trigger itself will be visible +TOUCHABLE - if this is set we can activate the trigger by standing in it. +CONTINUOUS - if this is checked the thing will re-trigger continously, otherwise +it waits until the player has left the trigger field. + +******************************************************************************/ + + +/*QUAKED func_useobject (0 0.5 0) ? MULTI-STATE + +Allows you to setup a special object that places the player into a specific state +sequence. Primarily used for levers and cranks. + +Object starts out in the "start" animation, when used the following occurs: + +It is determined whether or not the player is in the right position to activate +the object, if it is, the player is moved to the exact offset and angle specified +by "offset" and "yaw_offset". The right position is determined by a dot product +with "offset" and "yaw_offset". The "cone" parameter controls the cone in which the +object can be triggered. Once the player is in the right position, the player is placed +into "state" and the "move" animation is played. Once the player animation ends, the +"move_thread" will be called. If the use button is continued to be held down and count +is not finite, the animation will be continued to be played until the use key is held +down. Once the use key is let go, the "stop" animation will be played on the lever and +the "stop_thread" will be called. + +"activate" - turns the useobject on +"deactivate" - turns the useobject off +"offset" - vector offset of where the player should stand +"state" - state to go into when used +"state_backwards" - what state to use when reversing the object +"yaw_offset" - what direction the player should be facing when using the object +"cone" - the cone in which the object can be used +"count" - how many times this should trigger (default -1, infinite) +"move_thread" - thread that is fired when the object has cycled one animation +"stop_thread" - thread that is fired when the object has finished animating +"reset_thread" - thread that is fired when the object is resetting itself +"reset_time" - the time it takes for the object to reset, (default 0, it doesn't) +"triggertarget" - target to trigger when finished animating, if reset_time is set, target +will be fired again when resetting +"damage_type" - if set, can be triggered by using a weapon to activate it. If set to "all", +any damage will activate it. + +MULTI-STATE - the object has two different states and must be used each time to set the state +when multi state is active, the reset_thread is called instead of stop_thread. All UseObjects +have two states on and off. When reset_time is set, the object will automatically return to the +off state after a preset amount of time. When multi-state is set this must be done manually. + +******************************************************************************/ + + +/*QUAKED info_waypoint (0 0.5 0) (-8 -8 -8) (8 8 8) + +Used as a positioning device for objects + +******************************************************************************/ + + +/*QUAKED func_monkeybars (0.75 0.75 0.75) ? + +Monkey bars + +******************************************************************************/ + + +/*QUAKED func_horizontalpipe (0.75 0.75 0.75) ? + +Horizontal pipe that play can crawl upside down on. + +******************************************************************************/ + + +/*QUAKED func_pushobject (0.75 0.75 0.75) ? + +Pushable object + +"dmg" how much damage to cause when blocked. (default 2) +"pushsound" Sound to play when object is pushed (default is none) + +******************************************************************************/ + + +/*QUAKED func_fallingrock (0.75 0.75 0.75) ? AUTO_RESET NO_RANDOMNESS REMOVE_ON_GROUND + +Creates a rock that, when triggered, begins falling and bounces along a path +specified by targetname. Use info_waypoint for the path. + +"targetname" the path to follow. +"dmg" how much damage to cause creatures it hits (default 20). +"speed" how fast to move (default 200). +"wait" how long to wait before falling when triggered (default 0). +"noise" sound to play when rock touches the world + +AUTO_RESET - when done falling, automatically return to the start +NO_RANDOMNESS - don't use any randomness when making the rocks fall +REMOVE_ON_GROUND - remove the rocks when done + +******************************************************************************/ + + +/*QUAKED func_supplywater (0.75 0.75 0.75) ? x x NOT_PLAYERS MONSTERS PROJECTILES + +Creates a trigger than when touched gives the player water over a continuous time + +"wait" - how long to wait before re-triggering ( default 0.1 seconds ) +"amount" - how much water to give player on each trigger ( default 1 unit ) +"maxwater" - what the maximum amount of water this supply should charge the player to ( default 50 ) + +If NOT_PLAYERS is set, the trigger does not respond to players +If MONSTERS is set, the trigger will respond to monsters +If PROJECTILES is set, the trigger will respond to projectiles (rockets, grenades, etc.) + +******************************************************************************/ + + +/*QUAKED func_emitter (0 0.25 0.5) ? + +"emitter" - Name of emitter to use. +******************************************************************************/ + + +/*QUAKED func_rain (0 0.25 0.5) ? + +This creates a raining effect in the brush + +"emitter" - Name of emitter to use for the rain. +******************************************************************************/ + + +/*QUAKED info_pathnode (1 0 0) (-24 -24 0) (24 24 32) FLEE DUCK COVER DOOR JUMP LADDER + +FLEE marks the node as a safe place to flee to. Actor will be removed when it reaches a flee node and is not visible to a player. + +DUCK marks the node as a good place to duck behind during weapon fire. + +COVER marks the node as a good place to hide behind during weapon fire. + +DOOR marks the node as a door node. If an adjacent node has DOOR marked as well, the actor will only use the path if the door in between them is unlocked. + +JUMP marks the node as one to jump from when going to the node specified by target. +"target" the pathnode to jump to. + +******************************************************************************/ + + +/*QUAKED func_throwobject (0 0.25 0.5) (-16 -16 0) (16 16 32) + +This is an object you can pickup and throw at people +******************************************************************************/ + + +/*QUAKED info_player_start (0.75 0.75 0) (-16 -16 0) (16 16 96) + +The normal starting point for a level. + +"angle" - the direction the player should face +"thread" - the thread that should be called when spawned at this position + +******************************************************************************/ + + +/*QUAKED info_player_deathmatch (0.75 0.75 1) (-16 -16 0) (16 16 96) + +potential spawning position for deathmatch games + +"angle" - the direction the player should face +"thread" - the thread that should be called when spawned at this position + +******************************************************************************/ + + +/*QUAKED info_player_intermission (0.75 0.75 0) (-16 -16 0) (16 16 96) + +viewing point in between deathmatch levels + +******************************************************************************/ + + +/*QUAKED portal_surface (1 0 1) (-8 -8 -8) (8 8 8) +The portal surface nearest this entity will show a view from the targeted portal_camera, or a mirror view if untargeted. +*/ + + +/*QUAKED portal_camera (1 0 1) (-8 -8 -8) (8 8 8) slowrotate fastrotate +The target for a portal_surface. You can set either angles or target another entity to determine the direction of view. +"roll" an angle modifier to orient the camera around the target vector; +*/ + + +/*QUAKED func_rope (0.0 0.25 0.5) ? + +The rope is defined by a bounding box. The top of the box denotes the top of the rope and +the bottom of the rope is denoted by the bottom of the box. The width of the box determines +the trigger field in which the player will hang on to the rope when grabbing it. + +"ropeshader" : Name of the shader to use to render the rope (default is "ropeshader") +*/ + + +/*QUAKED func_rope_piece (0.0 0.25 0.5) (-16 -16 -16) (16 16 16) WIGGLE ATT_WIGGLE +Rope Piece - A single piece of a rope + +WIGGLE : Makes this piece of the rope wiggle about randomly. Only does this while not attached. + +ATT_WIGGLE : Makes this piece of the rope wiggle around even while attached. WIGGLE must also be marked for this to work. + +"target" : the "targetname" of the next piece in the rope. This should be blank if it's the last piece in the rope. +If a non-rope_piece entity is targeted, it will attach itself to it. + +"targetname" : used for the previous piece in the rope to find and link to this piece of the rope. + +"target2" : the targetname of the entity to attach this piece of the rope to. +Any piece of a rope can be attached to something and be triggered at any time to detach it. +Triggering the base of an attached rope will detach all attached points on that rope. + +"wigglemove" : the amount of force the random wiggling has. + Default = 32 + +"wiggletime" : number of seconds between each time the rope wiggles. + Default = 0.5 + +All other settings are set in the rope's rope_base entity. +*/ + + +/*QUAKED func_rope_base (0.0 0.25 0.5) (-16 -16 -16) (16 16 16) START_STILL +Rope Base - the main control and top end attachment entity for ropes + +This entity is the point to where ropes attach their top end. It's a stationary point entity. +All setting for the whole rope are specified through this entity. +If you want/need to trigger a rope to do something, then this is the entity to trigger. +Trying to trigger a rope_piece will do nothing. + +START_STILL : Specifies that the whole rope will be completely stationary untill it is either triggered, or grabbed. + +"targetname" : The name that the rope is triggered with. + +"target" : The "targetname" of the first rope_piece in the rope. + +"piecelength" : The distance between each piece of the rope. + Default = 24 + +"piecemodel" : The model to use for the rope pieces. + +"ropedampener" : Horizontal velocity dampener for the rope. + Default = 0.8 + +"stiffness" : Movement restricter on the amount that the rope can flex and bend. +Valid values are from -1 (no restriction) to 1 (tried to be perfectly straight. +The position of the first rope piece determines what direction the rope is pushed from the base of the rope. + Default = -1 + +"strength" : How strongly a stiff rope goes to position. + Default = 1; + +"attachmodel" : name of a model to attach onto this piece of rope + +"ropeshader" : Name of the shader to use to render the rope (default is "ropeshader") +*/ + + +/*QUAKED script_object (0 0.5 1) ? NOT_SOLID + +******************************************************************************/ + + +/*QUAKED script_model (0 0.5 1) (0 0 0) (0 0 0) NOT_SOLID + +******************************************************************************/ + + +/*QUAKED script_origin (1.0 0 0) (-8 -8 -8) (8 8 8) + +Used as an alternate origin for objects. Bind the object to the script_origin +in order to simulate changing that object's origin. +******************************************************************************/ + + +/*QUAKED script_skyorigin (1.0 0 0) ? + +Used to specify the origin of a portal sky +******************************************************************************/ + + +/*QUAKED func_spawn(0 0.25 0.5) (-8 -8 -8) (8 8 8) +"modelname" The name of the TIKI file you wish to spawn. (Required) +"spawntargetname" This will be the targetname of the spawned model. (default is null) +"spawntarget" This will be the target of the spawned model. (default is null) +"pickup_thread" passed on to the spawned model +"key" The item needed to activate this. (default nothing) +"attackmode" Attacking mode of the spawned actor (default 0) +******************************************************************************/ + + +/*QUAKED func_randomspawn(0 0.25 0.5) (-8 -8 -8) (8 8 8) START_OFF +Randomly spawns an entity. The time between spawns is determined by min_time and max_time +The entity can be turned off and on by triggering it +"modelname" The name of the TIKI file you wish to spawn. (Required) +"key" The item needed to activate this. (default nothing) +"min_time" The minimum time between spawns (default 0.2 seconds) +"max_time" The maximum time between spawns (default 1 seconds) +START_OFF - spawn is off by default +******************************************************************************/ + + +/*QUAKED func_respawn(0 0.25 0.5) (-8 -8 -8) (8 8 8) +When the thing that is spawned is killed, this func_respawn will get +triggered. +"modelname" The name of the TIKI file you wish to spawn. (Required) +"key" The item needed to activate this. (default nothing) +******************************************************************************/ + + +/*QUAKED func_spawnoutofsight(0 0.25 0.5) (-8 -8 -8) (8 8 8) +Will only spawn something out of sight of its targets. +"modelname" The name of the TIKI file you wish to spawn. (Required) +"spawntargetname" This will be the targetname of the spawned model. (default is null) +"spawntarget" This will be the target of the spawned model. (default is null) +"key" The item needed to activate this. (default nothing) +******************************************************************************/ + + +/*QUAKED func_spawnchain(0 0.25 0.5) (-8 -8 -8) (8 8 8) +Tries to spawn something out of the sight of players. If it fails, it will +trigger its targets. +"modelname" The name of the TIKI file you wish to spawn. (Required) +"spawntargetname" This will be the targetname of the spawned model. (default is null) +"spawntarget" This will be the target of the spawned model. (default is null) +"key" The item needed to activate this. (default nothing) +******************************************************************************/ + + +/*QUAKED func_fulcrum (0 0 1) ? X_AXIS_ONLY Y_AXIS_ONLY + +This creates a fulcrum that when you stand on it, it will rotate due to +the weight exerted it will start rotating, when not standing on it, it +will return to its rest position. +"speed" - set the speed at which the fulcrum will operate (default is 48) +"resetspeed" - speed at whcih fulcrum resets, (default speed * 0.002) +"dampening" - dampen constant (default 0.95) +"limit" - limit the movement of the fulcrum (default 90 degrees) +"movesound" - sound to be played while fulcrum is moving + +X_AXIS_ONLY - only adjust the X axis +Y_AXIS_ONLY - only adjust the Y axis + +******************************************************************************/ + + +/*QUAKED func_runthrough (0 0 1) ? + +This is a trigger field that the player can run through and spawn tiki models +at that position. Used for releasing chaff from grass or butterflys from +flower gardens +"speed" - speed at which you have to be moving to trigger ( default 100 ) +"delay" - time between triggering ( default 0.1 ) +"chance" - chance that the trigger will spawn something( default 0.5 ) +"lip" - how far below the surface of the trigger we should spawn these things ( default 3 ) +"offset" - vector offset oriented along velocity vector( default "0 0 0" ) +"spawnmodel" - thing to spawn when triggered + +******************************************************************************/ + + +/*QUAKED func_sinkobject (0 0 1) ? x FALLAWAY NO_RESET + +This creates an object which gradually sinks downward when stepped on. +"delay" - delay between when object starts reacting towards weight (default 0 seconds) +"speed" - set the speed at which sinkobject sinks (default is 50) +"resetspeed" - speed at which sinkobject resets its position, (default speed * 0.1) +"dampening" - dampening constant to mitigate acceleration (default 0.95) +"limit" - limit the movement of the sinkobject how far down it should go (default 1000 units) +"resetdelay" - time between player gets off platform, and platform starts resetting itself. +"sinksound" - sound to be played while platform is sinking. +"resetsound" - sound to be played while platform is resetting. +"active" - make the sink object active +"notactive" - make the sink object not active + +FALLAWAY - the sink object will progressively fall down faster and faster +NO_RESET - the sink object will not reset, only move downward + +******************************************************************************/ + + +/*QUAKED trigger_multiple (1 0 0) ? x x NOT_PLAYERS MONSTERS PROJECTILES + +Variable sized repeatable trigger. Must be targeted at one or more entities. + +If "health" is set, the trigger must be killed to activate each time. +If "delay" is set, the trigger waits some time after activating before firing. + +"thread" name of thread to trigger. This can be in a different script file as well\ +by using the '::' notation. + +if "angle" is set, the trigger will only fire when someone is facing the +direction of the angle. +"cone" the cone in which a directed trigger can be triggered (default 60 degrees) + +"wait" : Seconds between triggerings. (.2 default) +"cnt" how many times it can be triggered (infinite default) + +"triggerable" turn trigger on +"nottriggerable" turn trigger off + +If NOT_PLAYERS is set, the trigger does not respond to players +If MONSTERS is set, the trigger will respond to monsters +If PROJECTILES is set, the trigger will respond to projectiles (rockets, grenades, etc.) + +set "message" to text string + +******************************************************************************/ + + +/*QUAKED trigger_once (1 0 0) ? NOTOUCH x NOT_PLAYERS MONSTERS PROJECTILES + +Variable sized trigger. Triggers once, then removes itself. +You must set the key "target" to the name of another object in the +level that has a matching + +If "health" is set, the trigger must be killed to activate it. +If "delay" is set, the trigger waits some time after activating before firing. + +"targetname". If "health" is set, the trigger must be killed to activate. + +"thread" name of thread to trigger. This can be in a different script file as well\ +by using the '::' notation. + +if "killtarget" is set, any objects that have a matching "target" will be +removed when the trigger is fired. + +if "angle" is set, the trigger will only fire when someone is facing the +direction of the angle. +"cone" the cone in which a directed trigger can be triggered (default 60 degrees) + +"key" The item needed to activate this. (default nothing) + +"triggerable" turn trigger on +"nottriggerable" turn trigger off + +If NOTOUCH is set, trigger will not respond to touch +If NOT_PLAYERS is set, the trigger does not respond to players +If MONSTERS is set, the trigger will respond to monsters +If PROJECTILES is set, the trigger will respond to projectiles (rockets, grenades, etc.) + +set "message" to text string + +******************************************************************************/ + + +/*QUAKED trigger_relay (1 0 0) (-8 -8 -8) (8 8 8) x x NOT_PLAYERS MONSTERS PROJECTILES + +This fixed size trigger cannot be touched, it can only be fired by other events. +It can contain killtargets, targets, delays, and messages. + +If NOT_PLAYERS is set, the trigger does not respond to events triggered by players +If MONSTERS is set, the trigger will respond to events triggered by monsters +If PROJECTILES is set, the trigger will respond to events triggered by projectiles (rockets, grenades, etc.) + +******************************************************************************/ + + +/*QUAKED trigger_secret (1 0 0) ? NOTOUCH x NOT_PLAYERS MONSTERS PROJECTILES +Secret counter trigger. Automatically sets and increments script variables \ +level.total_secrets and level.found_secrets. + +set "message" to text string + +"key" The item needed to activate this. (default nothing) + +if "angle" is set, the trigger will only fire when someone is facing the +direction of the angle. +"cone" the cone in which a directed trigger can be triggered (default 60 degrees) + +"thread" name of thread to trigger. This can be in a different script file as well \ +by using the '::' notation. (defaults to "global/universal_script.scr::secret") + +"triggerable" turn trigger on +"nottriggerable" turn trigger off + +If NOTOUCH is set, trigger will not respond to touch +If NOT_PLAYERS is set, the trigger does not respond to players +If MONSTERS is set, the trigger will respond to monsters +If PROJECTILES is set, the trigger will respond to projectiles (rockets, grenades, etc.) + +******************************************************************************/ + + +/*QUAKED trigger_setvariable (1 0 0) ? NOTOUCH LEVEL NOT_PLAYERS MONSTERS PROJECTILES + +Sets a variable specified by "variable" and "value". +Variable is assumed to be of the "global" variety unless LEVEL is set. +Variable sized trigger. Triggers once by default. +You must set the key "target" to the name of another object in the +level that has a matching + +"variable" - variable to set +"value" - value to set in variable, value can also be one of the following reserved\ +tokens. + - "increment" - add one to the variable + - "decrement" - subtract one from the variable + - "toggle" - if 1, then zero. If zero then 1. + +If "health" is set, the trigger must be killed to activate it. +If "delay" is set, the trigger waits some time after activating before firing. + +"targetname". If "health" is set, the trigger must be killed to activate. + +"thread" name of thread to trigger. This can be in a different script file as well\ +by using the '::' notation. + +if "killtarget" is set, any objects that have a matching "target" will be +removed when the trigger is fired. + +if "angle" is set, the trigger will only fire when someone is facing the +direction of the angle. +"cone" the cone in which a directed trigger can be triggered (default 60 degrees) + +"key" The item needed to activate this. (default nothing) + +"triggerable" turn trigger on +"nottriggerable" turn trigger off + +If NOTOUCH is set, trigger will not respond to touch +if LEVEL is set, variable will be a level variable otherwise it will be a game variable +If NOT_PLAYERS is set, the trigger does not respond to players +If MONSTERS is set, the trigger will respond to monsters +If PROJECTILES is set, the trigger will respond to projectiles (rockets, grenades, etc.) + +set "message" to text string + +******************************************************************************/ + + +/*QUAKED trigger_push (1 0 0) ? x x NOT_PLAYERS NOT_MONSTERS NOT_PROJECTILES + +Pushes entities as if they were caught in a heavy wind. + +"speed" indicates the rate that entities are pushed (default 1000). + +"angle" indicates the direction the wind is blowing (-1 is up, -2 is down) + +"key" The item needed to activate this. (default nothing) + +"target" if target is set, then a velocity will be calculated based on speed + +"triggerable" turn trigger on +"nottriggerable" turn trigger off + +If NOT_PLAYERS is set, the trigger does not push players +If NOT_MONSTERS is set, the trigger will not push monsters +If NOT_PROJECTILES is set, the trigger will not push projectiles (rockets, grenades, etc.) + +******************************************************************************/ + + +/*QUAKED trigger_pushany (1 0 0) ? x x NOT_PLAYERS NOT_MONSTERS NOT_PROJECTILES + +Pushes entities as if they were caught in a heavy wind. + +"speed" indicates the rate that entities are pushed (default 1000). +"angles" indicates the direction of the push +"key" The item needed to activate this. (default nothing) +"target" if target is set, then a velocity will be calculated based on speed + +"triggerable" turn trigger on +"nottriggerable" turn trigger off + +If NOT_PLAYERS is set, the trigger does not push players +If NOT_MONSTERS is set, the trigger will not push monsters +If NOT_PROJECTILES is set, the trigger will not push projectiles (rockets, grenades, etc.) + +******************************************************************************/ + + +/*QUAKED sound_speaker (0 0.75 0.75) (-8 -8 -8) (8 8 8) AMBIENT-ON AMBIENT-OFF NOT_PLAYERS MONSTERS PROJECTILES TOGGLE + +play a sound when it is used + +AMBIENT-ON specifies an ambient sound that starts on +AMBIENT-OFF specifies an ambient sound that starts off +TOGGLE specifies that the speaker toggles on triggering + +if (AMBIENT-?) is not set, then the sound is sent over explicitly this creates more net traffic + +"volume" how loud 0-4 (1 default full volume, ambients do not respond to volume) +"noise" sound to play +"channel" channel on which to play sound\ +(0 auto, 1 weapon, 2 voice, 3 item, 4 body, 8 don't use PHS) (voice is default) +"key" The item needed to activate this. (default nothing) +"thread" name of thread to trigger. This can be in a different script file as well\ +by using the '::' notation. + +Normal sounds play each time the target is used. + +Ambient Looped sounds have a volume 1, and the use function toggles it on/off. + +If NOT_PLAYERS is set, the trigger does not respond to players +If MONSTERS is set, the trigger will respond to monsters +If PROJECTILES is set, the trigger will respond to projectiles (rockets, grenades, etc.) + +******************************************************************************/ + + +/*QUAKED sound_randomspeaker (0 0.75 0.75) (-8 -8 -8) (8 8 8) x x NOT_PLAYERS MONSTERS PROJECTILES x x + +play a sound at random times + +"mindelay" minimum delay between sound triggers (default 3) +"maxdelay" maximum delay between sound triggers (default 10) +"chance" chance that sound will play when fired (default 1) +"volume" how loud 0-4 (1 default full volume) +"noise" sound to play +"channel" channel on which to play sound\ +(0 auto, 1 weapon, 2 voice, 3 item, 4 body, 8 don't use PHS) (voice is default) +"key" The item needed to activate this. (default nothing) + +Normal sounds play each time the target is used. + +If NOT_PLAYERS is set, the trigger does not respond to players +If MONSTERS is set, the trigger will respond to monsters +If PROJECTILES is set, the trigger will respond to projectiles (rockets, grenades, etc.) + +******************************************************************************/ + + +/*QUAKED trigger_changelevel (1 0 0) ? NO_INTERMISSION x NOT_PLAYERS MONSTERS PROJECTILES + +When the player touches this, he gets sent to the map listed in the "map" variable. +Unless the NO_INTERMISSION flag is set, the view will go to the info_intermission +spot and display stats. + +"spawnspot" name of the spawn location to start at in next map. +"key" The item needed to activate this. (default nothing) +"thread" This defaults to "LevelComplete" and should point to a thread that is called just +before the level ends. + +"triggerable" turn trigger on +"nottriggerable" turn trigger off + +If NOT_PLAYERS is set, the trigger does not respond to players +If MONSTERS is set, the trigger will respond to monsters +If PROJECTILES is set, the trigger will respond to projectiles (rockets, grenades, etc.) + +******************************************************************************/ + + +/*QUAKED trigger_use (1 0 0) ? VISIBLE x NOT_PLAYERS MONSTERS + +Activates targets when 'used' by an entity +"key" The item needed to activate this. (default nothing) +"thread" name of thread to trigger. This can be in a different script file as well\ +by using the '::' notation. + +"triggerable" turn trigger on +"nottriggerable" turn trigger off + +If NOT_PLAYERS is set, the trigger does not respond to players +If MONSTERS is set, the trigger will respond to monsters + +******************************************************************************/ + + +/*QUAKED trigger_useonce (1 0 0) ? VISIBLE x NOT_PLAYERS MONSTERS + +Activates targets when 'used' by an entity, but only once +"key" The item needed to activate this. (default nothing) +"thread" name of thread to trigger. This can be in a different script file as well\ +by using the '::' notation. + +"triggerable" turn trigger on +"nottriggerable" turn trigger off + +If NOT_PLAYERS is set, the trigger does not respond to players +If MONSTERS is set, the trigger will respond to monsters + +******************************************************************************/ + + +/*QUAKED trigger_hurt (1 0 0) ? x x NOT_PLAYERS NOT_MONSTERS PROJECTILES + +"damage" amount of damage to cause. (default 10) +"key" The item needed to activate this. (default nothing) +"damagetype" what kind of damage should be given to the player. (default CRUSH) + +"triggerable" turn trigger on +"nottriggerable" turn trigger off + +If NOT_PLAYERS is set, the trigger does not hurt players +If NOT_MONSTERS is set, the trigger does not hurt monsters +If PROJECTILES is set, the trigger will hurt projectiles (rockets, grenades, etc.) + +******************************************************************************/ + + +/*QUAKED trigger_damagetargets (1 0 0) ? SOLID x NOT_PLAYERS NOT_MONSTERS PROJECTILES + +"damage" amount of damage to cause. If no damage is specified, objects\ +are damaged by the current health+1 + +"key" The item needed to activate this. (default nothing) + +if a trigger_damagetargets is shot at and the SOLID flag is set,\ +the damage is passed on to the targets + +"triggerable" turn trigger on +"nottriggerable" turn trigger off + +If NOT_PLAYERS is set, the trigger does not hurt players +If NOT_MONSTERS is set, the trigger does not hurt monsters +If PROJECTILES is set, the trigger will hurt projectiles (rockets, grenades, etc.) + +******************************************************************************/ + + +/*QUAKED trigger_camerause (1 0 0) ? VISIBLE x NOT_PLAYERS MONSTERS + +Activates 'targeted' camera when 'used' +If activated, toggles through cameras +"key" The item needed to activate this. (default nothing) +"thread" name of thread to trigger. This can be in a different script file as well\ +by using the '::' notation. + +"triggerable" turn trigger on +"nottriggerable" turn trigger off + +If NOT_PLAYERS is set, the trigger does not respond to players +If MONSTERS is set, the trigger will respond to monsters + +******************************************************************************/ + + +/*QUAKED trigger_exit (1 0 0) ? + +When the player touches this, an exit icon will be displayed in his hud. +This is to inform him that he is near an exit. + +"triggerable" turn trigger on +"nottriggerable" turn trigger off + +******************************************************************************/ + + +/*QUAKED trigger_music (1 0 0) ? NORMAL ACTION NOT_PLAYERS MONSTERS PROJECTILES SUSPENSE MYSTERY SURPRISE + +Variable sized repeatable trigger to change the music mood. + +If "delay" is set, the trigger waits some time after activating before firing. +"current" can be used to set the current mood +"fallback" can be used to set the fallback mood +"altcurrent" can be used to set the current mood of the opposite face, if multiFaceted +"altfallback" can be used to set the fallback mood of the opposite face, if multiFaceted +"edgeTriggerable" trigger only fires when entering a trigger +"multiFaceted" if 1, then trigger is North/South separate triggerable\ +if 2, then trigger East/West separate triggerable + +"thread" name of thread to trigger. This can be in a different script file as well\ +by using the '::' notation. +"wait" : Seconds between triggerings. (1.0 default) +"cnt" how many times it can be triggered (infinite default) +"oneshot" make this a one time trigger + +"triggerable" turn trigger on +"nottriggerable" turn trigger off + +If NOT_PLAYERS is set, the trigger does not respond to players +If MONSTERS is set, the trigger will respond to monsters +If PROJECTILES is set, the trigger will respond to projectiles (rockets, grenades, etc.) + +NORMAL, ACTION, SUSPENSE, MYSTERY, and SURPRISE are the moods that can be triggered + +******************************************************************************/ + + +/*QUAKED trigger_reverb (1 0 0) ? x x NOT_PLAYERS MONSTERS PROJECTILES + +Variable sized repeatable trigger to change the reverb level in the game + +If "delay" is set, the trigger waits some time after activating before firing. +"reverbtype" what kind of reverb should be used +"reverblevel" how much of the reverb effect should be applied +"altreverbtype" what kind of reverb should be used +"altreverblevel" how much of the reverb effect should be applied +"edgeTriggerable" trigger only fires when entering a trigger +"multiFaceted" if 1, then trigger is North/South separate triggerable\ +if 2, then trigger East/West separate triggerable + +"thread" name of thread to trigger. This can be in a different script file as well\ +by using the '::' notation. +"wait" : Seconds between triggerings. (1.0 default) +"cnt" how many times it can be triggered (infinite default) +"oneshot" make this a one time trigger + +"triggerable" turn trigger on +"nottriggerable" turn trigger off + +If NOT_PLAYERS is set, the trigger does not respond to players +If MONSTERS is set, the trigger will respond to monsters +If PROJECTILES is set, the trigger will respond to projectiles (rockets, grenades, etc.) + +******************************************************************************/ + + +/*QUAKED trigger_pushobject (1 0 0) ? +Special trigger that can only be triggered by a push object. + +"triggername" if set, trigger only responds to objects with a targetname the same as triggername. +"cnt" how many times it can be triggered (default 1, use -1 for infinite) +******************************************************************************/ + + +/*QUAKED trigger_givepowerup (1 0 0) ? x x NOT_PLAYERS MONSTERS x + +Variable sized repeatable trigger to give a powerup to the player + +"oneshot" makes this triggerable only once +"powerupname" sets the name of the powerup to give to the player + +If NOT_PLAYERS is set, the trigger does not respond to players +If MONSTERS is set, the trigger will respond to monsters + +******************************************************************************/ + + +/*QUAKED worldspawn (0 0 0) ? CINEMATIC + +Only used for the world. + +"soundtrack" the soundtrack to use on the map +"gravity" 800 is default gravity +"skipthread" thread that is activated to skip this level (if cinematic) +"nextmap" map to goto when player exits +"message" text to print at user logon +"script" script to run on start of map +"watercolor" view color when underwater +"wateralpha" view alpha when underwater +"lavacolor" view alpha when in lava +"lavaalpha" view alpha when in lava +"farplane_color" color to fade to when the far clip plane is on +"farplane_cull" whether or not the far plane should cull, default is yes +"farplane" distance from the viewer that the far clip plane is +"ambientlight" ambient lighting to be applied to all entities +"ambient" ambient lighting to be applied to all entities, use _color to specify color +"suncolor" color of the sun in the level +"sunlight" intensity of the sun in the level +"sundirection" direction of the sun in the level +"sunflare" worldspace position of the sun flare +"sunflare_inportalsky" whether or not the flare is in the portal sky +"lightmapdensity" default lightmap density to be used for all surfaces +"skyalpha" initial value of the sky's alpha, defaults to 1 + +******************************************************************************/ + + diff --git a/fakk/maps/example/CameraScript.bsp b/fakk/maps/example/CameraScript.bsp new file mode 100644 index 0000000000000000000000000000000000000000..33d89f917404495b1998ea23906a7f3a436e6408 GIT binary patch literal 63760 zcmeHuX^bSvbzbdqDIO-R)$Yvn-F4q*W@X)1)_qrXS5@El^nLeq_Z)l7Y;#FMqGcL{ zY!HMC*>-+S>Q;zd>_UMzl0p-}w!zkTEN*KvLQX@z3)0}6%sj6(5+58=fr zuD_>HJo`a~;-7w3q4@Df6pGjWgF^8GWPR>GDikNUKKq{(iVa-v;5veG-}$2^pW{El zOYl1WQ;Cg2_%l2s(e)0lujBf=A4mRQDHJ9=e+k!dNY#^s~EqytH$BX=jJnK0@<@j)O_YpXplRWhR zUYXJY$+xk8^Jvw5PX5rl2k}Zac^&TWuRSU&#WN3(i-dYSyiP<3FBge^hS&1`?(Y7c z^JshX;Gs?G$~+OJ7oEH$Jw876C!&Pcd%{Zrw8$o4w&!hpm-a=x&eKT@_a|-7Z=T=N z9p#@S&flFN|KwZE_w4NtzK!R$az98mb0prl71?u(Mg%=2mcQ7QzleO6M|6Kc&u#qw z0QBwoRK7i*%CkgtuOXi$qI<0?UzK9HO+Ko(I{7Q;xvhRhi~dZ87XLGv7XPz+l&5r- z-zqP?gM7X1�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 T`;p5~|9mI1{r|$?VfFk!&-09m literal 0 HcmV?d00001 diff --git a/fakk/maps/example/CameraScript.map b/fakk/maps/example/CameraScript.map new file mode 100644 index 0000000..065c2da --- /dev/null +++ b/fakk/maps/example/CameraScript.map @@ -0,0 +1,406 @@ +{ +"classname" "worldspawn" +// brush 0 +{ +( 224 192 0 ) ( 224 224 0 ) ( -480 224 0 ) eden/bedtrim -224 -32 90.00 1 1 0 0 0 +( -480 224 64 ) ( 224 224 64 ) ( 224 192 64 ) eden/bedtrim -224 -32 90.00 1 1 0 0 0 +( -480 224 256 ) ( -480 192 256 ) ( -480 192 0 ) eden/bedtrim -224 0 0.00 1 1 0 0 0 +( -480 192 256 ) ( 224 192 256 ) ( 224 192 0 ) common/skip 0 0 0.00 1 1 805306368 16512 0 +( 224 224 256 ) ( -480 224 256 ) ( -480 224 0 ) eden/bedtrim 224 0 -180.00 1 -1 0 0 0 +( -416 224 0 ) ( -416 192 0 ) ( -416 208 64 ) eden/bedtrim 224 0 -180.00 1 -1 0 0 0 +} +// brush 1 +{ +( 224 192 0 ) ( 224 224 0 ) ( -480 224 0 ) eden/bedtrim -224 -32 90.00 1 1 0 0 0 +( -480 224 64 ) ( 224 224 64 ) ( 224 192 64 ) eden/bedtrim -224 -32 90.00 1 1 0 0 0 +( -480 192 256 ) ( 224 192 256 ) ( 224 192 0 ) eden/bedtrim 224 0 -180.00 1 -1 0 0 0 +( 224 192 256 ) ( 224 224 256 ) ( 224 224 0 ) eden/bedtrim -224 0 0.00 1 1 0 0 0 +( 224 224 256 ) ( -480 224 256 ) ( -480 224 0 ) eden/bedtrim 224 0 -180.00 1 -1 0 0 0 +( -480 192 0 ) ( -480 224 0 ) ( -480 208 64 ) eden/bedtrim 224 0 -180.00 1 -1 0 0 0 +} +// brush 2 +{ +( 224 192 64 ) ( 224 224 64 ) ( -480 224 64 ) eden/edenmetalwall -224 -224 90.00 1 1 0 0 0 +( -480 224 320 ) ( 224 224 320 ) ( 224 192 320 ) eden/edenmetalwall -224 -224 90.00 1 1 0 0 0 +( -480 224 96 ) ( -480 192 96 ) ( -480 192 64 ) eden/edenmetalwall -224 64 0.00 1 1 0 0 0 +( -480 192 96 ) ( 224 192 96 ) ( 224 192 64 ) common/skip 0 0 0.00 1 1 805306368 16512 0 +( 224 224 96 ) ( -480 224 96 ) ( -480 224 64 ) eden/edenmetalwall 224 63 -180.00 1 -1 0 0 0 +( -416 224 64 ) ( -416 192 64 ) ( -416 208 320 ) eden/edenmetalwall 224 63 -180.00 1 -1 0 0 0 +} +// brush 3 +{ +( 224 192 64 ) ( 224 224 64 ) ( -480 224 64 ) eden/edenmetalwall -224 -224 90.00 1 1 0 0 0 +( -480 224 640 ) ( 224 224 640 ) ( 224 192 640 ) eden/edenmetalwall -224 -224 90.00 1 1 0 0 0 +( -480 192 96 ) ( 224 192 96 ) ( 224 192 64 ) eden/edenmetalwall 224 63 -180.00 1 -1 0 0 0 +( 224 192 96 ) ( 224 224 96 ) ( 224 224 64 ) eden/edenmetalwall -224 64 0.00 1 1 0 0 0 +( 224 224 96 ) ( -480 224 96 ) ( -480 224 64 ) eden/edenmetalwall 224 63 -180.00 1 -1 0 0 0 +( -480 192 384 ) ( -480 224 384 ) ( -480 208 640 ) eden/edenmetalwall 224 63 -180.00 1 -1 0 0 0 +} +// brush 4 + { + patchDef2 + { + eden/edenmetalwall + ( 3 3 0 536870912 0 ) +( +( ( -480 96 63.999981 0 0 ) ( -480 96 352.000061 0 0.500000 ) ( -480 96 640 0 1 ) ) +( ( -384 96 63.999981 0.500000 0 ) ( -384 96 352.000061 0.500000 0.500000 ) ( -384 96 640 0.500000 1 ) ) +( ( -384 192 63.999981 1 0 ) ( -384 192 352.000061 1 0.500000 ) ( -384 192 640 1 1 ) ) +) + } + } +// brush 5 +{ +( -480 192 0 ) ( -512 192 0 ) ( -512 -512 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -512 -512 64 ) ( -512 192 64 ) ( -480 192 64 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -480 -512 256 ) ( -480 192 256 ) ( -480 192 0 ) common/skip 0 0 0.00 1 1 805306368 16512 0 +( -480 192 256 ) ( -512 192 256 ) ( -512 192 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -512 192 256 ) ( -512 -512 256 ) ( -512 -512 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -480 128 0 ) ( -512 128 0 ) ( -496 128 64 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +} +// brush 6 +{ +( -480 192 0 ) ( -512 192 0 ) ( -512 -512 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -512 -512 64 ) ( -512 192 64 ) ( -480 192 64 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -512 -512 256 ) ( -480 -512 256 ) ( -480 -512 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -480 -512 256 ) ( -480 192 256 ) ( -480 192 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -512 192 256 ) ( -512 -512 256 ) ( -512 -512 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -512 192 0 ) ( -480 192 0 ) ( -496 192 64 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +} +// brush 7 +{ +( -480 192 64 ) ( -512 192 64 ) ( -512 -512 64 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +( -512 -512 320 ) ( -512 192 320 ) ( -480 192 320 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +( -480 -512 96 ) ( -480 192 96 ) ( -480 192 64 ) common/skip 0 0 0.00 1 1 805306368 16512 0 +( -480 192 96 ) ( -512 192 96 ) ( -512 192 64 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +( -512 192 96 ) ( -512 -512 96 ) ( -512 -512 64 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +( -480 128 64 ) ( -512 128 64 ) ( -496 128 320 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +} +// brush 8 +{ +( -480 192 64 ) ( -512 192 64 ) ( -512 -512 64 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +( -512 -512 640 ) ( -512 192 640 ) ( -480 192 640 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +( -512 -512 96 ) ( -480 -512 96 ) ( -480 -512 64 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +( -480 -512 416 ) ( -480 192 416 ) ( -480 192 384 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +( -512 192 96 ) ( -512 -512 96 ) ( -512 -512 64 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +( -512 192 64 ) ( -480 192 64 ) ( -496 192 320 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +} +// brush 9 + { + patchDef2 + { + eden/bedtrim + ( 3 3 0 536870912 0 ) +( +( ( -480 96 0 0 0 ) ( -480 96 32 0 0.500000 ) ( -480 96 64 0 1 ) ) +( ( -384 96 0 0.500000 0 ) ( -384 96 32 0.500000 0.500000 ) ( -384 96 64 0.500000 1 ) ) +( ( -384 192 0 1 0 ) ( -384 192 32 1 0.500000 ) ( -384 192 64 1 1 ) ) +) + } + } +// brush 10 +{ +( 192 192 608 ) ( -480 192 608 ) ( -480 -512 608 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( -480 -512 640 ) ( -480 192 640 ) ( 192 192 640 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( -480 -512 640 ) ( 192 -512 640 ) ( 192 -512 608 ) eden/CL_edenroof3 0 -96 0.00 1 1 0 0 0 +( 192 192 640 ) ( -480 192 640 ) ( -480 192 608 ) eden/CL_edenroof3 0 -96 0.00 1 1 0 0 0 +( -480 192 640 ) ( -480 -512 640 ) ( -480 -512 608 ) eden/CL_edenroof3 0 -96 0.00 1 1 0 0 0 +( 216 -112 608 ) ( 216 -240 608 ) ( 216 -176 640 ) eden/CL_edenroof3 0 -96 0.00 1 1 0 0 0 +} +// brush 11 +{ +( 192 192 -32 ) ( -480 192 -32 ) ( -480 -512 -32 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( -480 -512 0 ) ( -480 192 0 ) ( 192 192 0 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( -480 -512 224 ) ( 192 -512 224 ) ( 192 -512 -32 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 192 -512 224 ) ( 192 192 224 ) ( 192 192 -32 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 192 192 224 ) ( -480 192 224 ) ( -480 192 -32 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( -480 192 224 ) ( -480 -512 224 ) ( -480 -512 -32 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +} +// brush 12 +{ +( -480 -512 64 ) ( -480 -544 64 ) ( 224 -544 64 ) eden/edenmetalwall -31 31 -90.00 1 1 0 0 0 +( 224 -544 640 ) ( -480 -544 640 ) ( -480 -512 640 ) eden/edenmetalwall -31 31 -90.00 1 1 0 0 0 +( 224 -544 96 ) ( 224 -512 96 ) ( 224 -512 64 ) eden/edenmetalwall -32 63 -180.00 1 -1 0 0 0 +( 224 -512 96 ) ( -480 -512 96 ) ( -480 -512 64 ) eden/edenmetalwall -32 62 0.00 1.000008 1 0 0 0 +( -480 -512 416 ) ( -480 -544 416 ) ( -480 -544 384 ) eden/edenmetalwall -33 63 -180.00 1 -1 0 0 0 +( -480 -544 96 ) ( 224 -544 96 ) ( 224 -544 64 ) eden/edenmetalwall -32 62 0.00 1.000008 1 0 0 0 +} +// brush 13 +{ +( -480 -512 0 ) ( -480 -544 0 ) ( 224 -544 0 ) eden/bedtrim -31 32 -90.00 1 1 0 0 0 +( 224 -544 64 ) ( -480 -544 64 ) ( -480 -512 64 ) eden/bedtrim -31 32 -90.00 1 1 0 0 0 +( 224 -544 256 ) ( 224 -512 256 ) ( 224 -512 0 ) eden/bedtrim -32 0 -180.00 1 -1 0 0 0 +( 224 -512 256 ) ( -480 -512 256 ) ( -480 -512 0 ) eden/bedtrim -32 0 0.00 1 1 0 0 0 +( -480 -512 256 ) ( -480 -544 256 ) ( -480 -544 0 ) eden/bedtrim -33 0 -180.00 1 -1 0 0 0 +( -480 -544 256 ) ( 224 -544 256 ) ( 224 -544 0 ) eden/bedtrim -32 0 0.00 1 1 0 0 0 +} +// brush 14 +{ +( 192 -512 0 ) ( 224 -512 0 ) ( 224 192 0 ) eden/bedtrim 160 0 -180.00 1 1 0 0 0 +( 224 192 64 ) ( 224 -512 64 ) ( 192 -512 64 ) eden/bedtrim 160 0 -180.00 1 1 0 0 0 +( 224 192 256 ) ( 192 192 256 ) ( 192 192 0 ) eden/bedtrim 160 0 -180.00 1 -1 0 0 0 +( 192 192 256 ) ( 192 -512 256 ) ( 192 -512 0 ) eden/bedtrim -64 0 -180.00 1 -1 0 0 0 +( 192 -512 256 ) ( 224 -512 256 ) ( 224 -512 0 ) eden/bedtrim 159 0 -180.00 1 -1 0 0 0 +( 224 -512 256 ) ( 224 192 256 ) ( 224 192 0 ) eden/bedtrim -64 0 -180.00 1 -1 0 0 0 +} +// brush 15 +{ +( 192 -512 64 ) ( 224 -512 64 ) ( 224 192 64 ) eden/edenmetalwall 160 63 -180.00 1 1 0 0 0 +( 224 192 640 ) ( 224 -512 640 ) ( 192 -512 640 ) eden/edenmetalwall 160 63 -180.00 1 1 0 0 0 +( 224 192 96 ) ( 192 192 96 ) ( 192 192 64 ) eden/edenmetalwall 160 64 -180.00 1 -1 0 0 0 +( 192 192 416 ) ( 192 -512 416 ) ( 192 -512 384 ) eden/edenmetalwall -64 62 -180.00 1 -1 0 0 0 +( 192 -512 96 ) ( 224 -512 96 ) ( 224 -512 64 ) eden/edenmetalwall 159 64 -180.00 1 -1 0 0 0 +( 224 -512 96 ) ( 224 192 96 ) ( 224 192 64 ) eden/edenmetalwall -64 62 -180.00 1 -1 0 0 0 +} +} +// entity 1 +{ +"classname" "Characters_Gruff" +"scale" "1.0" +"model" "gruff.tik" +"targetname" "gruff" +"angle" "90" +"origin" "-148.00 -364.00 0.00" +} +// entity 2 +{ +"classname" "func_camera" +"scale" "1.0" +"model" "func_camera.tik" +"targetname" "camera1" +"origin" "-144.00 -216.00 0.00" +} +// entity 3 +{ +"classname" "info_splinepath" +"scale" "1.0" +"model" "func_spline.tik" +"angles" " 0.0 22.5 0" +"origin" "-389.55 -69.55 136.00" +"target" "t1" +"targetname" "campath1" +} +// entity 4 +{ +"classname" "Characters_EdenMale_Random2" +"scale" "1.0" +"model" "edenmale_random2.tik" +"angle" "225" +"origin" "-105.37 86.63 0.00" +"targetname" "edenmale" +} +// entity 5 +{ +"targetname" "movinlight2" +"classname" "script_object" +// brush 0 +{ +( 16 -368 144 ) ( 0 -368 144 ) ( 0 -384 144 ) common/skip 32 16 0.00 1 1 805306368 16512 0 +( 0 -384 160 ) ( 0 -368 160 ) ( 16 -368 160 ) common/skip 32 16 0.00 1 1 805306368 16512 0 +( 0 -384 240 ) ( 16 -384 240 ) ( 16 -384 144 ) common/skip 32 -48 0.00 1 1 805306368 16512 0 +( 16 -384 240 ) ( 16 -368 240 ) ( 16 -368 144 ) common/skip -16 -48 0.00 1 1 805306368 16512 0 +( 16 -368 240 ) ( 0 -368 240 ) ( 0 -368 144 ) common/skip 32 -48 0.00 1 1 805306368 16512 0 +( 0 -368 240 ) ( 0 -384 240 ) ( 0 -384 144 ) common/skip -16 -48 0.00 1 1 805306368 16512 0 +} +} +// entity 6 +{ +"targetname" "movinlight1" +"classname" "script_object" +// brush 0 +{ +( -344 64 144 ) ( -360 64 144 ) ( -360 48 144 ) common/skip 0 0 0.00 1 1 805306368 16512 0 +( -360 48 160 ) ( -360 64 160 ) ( -344 64 160 ) common/skip 0 0 0.00 1 1 805306368 16512 0 +( -360 48 240 ) ( -344 48 240 ) ( -344 48 144 ) common/skip 0 -48 0.00 1 1 805306368 16512 0 +( -344 48 240 ) ( -344 64 240 ) ( -344 64 144 ) common/skip 0 -48 0.00 1 1 805306368 16512 0 +( -344 64 240 ) ( -360 64 240 ) ( -360 64 144 ) common/skip 0 -48 0.00 1 1 805306368 16512 0 +( -360 64 240 ) ( -360 48 240 ) ( -360 48 144 ) common/skip 0 -48 0.00 1 1 805306368 16512 0 +} +} +// entity 7 +{ +"classname" "light" +"spawnflags" "0" +"origin" "-352 56 168" +"light" "200" +"_color" "1.000000 0.724409 0.523622" +} +// entity 8 +{ +"classname" "info_player_start" +"angle" "0" +"origin" "-416 -176 24" +} +// entity 9 +{ +"origin" "8 56 168" +"spawnflags" "0" +"classname" "light" +"light" "200" +"_color" "0.629921 0.846457 1.000000" +} +// entity 10 +{ +"origin" "-344 -376 168" +"spawnflags" "0" +"classname" "light" +"light" "200" +} +// entity 11 +{ +"classname" "light" +"spawnflags" "0" +"origin" "8 -376 168" +"light" "200" +} +// entity 12 +{ +"light" "200" +"classname" "light" +"spawnflags" "0" +"origin" "-168 -160 168" +} +// entity 13 +{ +"_color" "1.000000 0.724409 0.523622" +"light" "200" +"origin" "-352 56 384" +"spawnflags" "0" +"classname" "light" +} +// entity 14 +{ +"_color" "0.629921 0.846457 1.000000" +"light" "200" +"classname" "light" +"spawnflags" "0" +"origin" "8 56 384" +} +// entity 15 +{ +"light" "200" +"classname" "light" +"spawnflags" "0" +"origin" "-344 -376 384" +} +// entity 16 +{ +"light" "200" +"origin" "8 -376 384" +"spawnflags" "0" +"classname" "light" +} +// entity 17 +{ +"origin" "-168 -160 384" +"spawnflags" "0" +"classname" "light" +"light" "200" +} +// entity 18 +{ +"origin" "-349.55 24.00 178.45" +"angles" "22.5 0.0 0" +"model" "func_spline.tik" +"scale" "1.0" +"classname" "info_splinepath" +"targetname" "t1" +"target" "t2" +} +// entity 19 +{ +"classname" "info_splinepath" +"scale" "1.0" +"model" "func_spline.tik" +"angles" "22 337 0" +"origin" "-315.29 99.43 178.41" +"targetname" "t2" +"target" "t3" +} +// entity 20 +{ +"origin" "-178.96 125.10 42.49" +"angles" "337 314 0" +"model" "func_spline.tik" +"scale" "1.0" +"classname" "info_splinepath" +"targetname" "t3" +"target" "t4" +} +// entity 21 +{ +"classname" "info_splinepath" +"scale" "1.0" +"model" "func_spline.tik" +"angles" "314.5 359.0 0" +"origin" "-164.55 64.20 43.31" +"targetname" "t4" +"target" "t5" +} +// entity 22 +{ +"origin" "-103.80 35.45 43.31" +"angles" "314 89 0" +"model" "func_spline.tik" +"scale" "1.0" +"classname" "info_splinepath" +"targetname" "t5" +"target" "t6" +} +// entity 23 +{ +"classname" "info_splinepath" +"scale" "1.0" +"model" "func_spline.tik" +"angles" "355 179 0" +"origin" "-47.19 80.15 40.67" +"targetname" "t6" +"target" "t7" +} +// entity 24 +{ +"origin" " 0.15 128.81 40.67" +"angles" "355 269 0" +"model" "func_spline.tik" +"scale" "1.0" +"classname" "info_splinepath" +"targetname" "t7" +"target" "t8" +} +// entity 25 +{ +"classname" "info_splinepath" +"scale" "1.0" +"model" "func_spline.tik" +"angles" "355.0 179.0 0" +"origin" "64.81 -15.85 40.67" +"targetname" "t8" +"target" "t9" +} +// entity 26 +{ +"origin" "-151.85 -63.19 40.67" +"angles" "355.0 89.0 0" +"model" "func_spline.tik" +"scale" "1.0" +"classname" "info_splinepath" +"targetname" "t9" +"target" "t10" +} +// entity 27 +{ +"classname" "info_splinepath" +"scale" "1.0" +"model" "func_spline.tik" +"angles" "355.0 134.0 0" +"origin" "-340.22 -132.21 40.67" +"targetname" "t10" +} +// entity 28 +{ +"origin" "-144.00 -248.00 0.00" +"targetname" "camera2" +"model" "func_camera.tik" +"scale" "1.0" +"classname" "func_camera" +} \ No newline at end of file diff --git a/fakk/maps/example/CameraScript.prt b/fakk/maps/example/CameraScript.prt new file mode 100644 index 0000000..ff1e3bb --- /dev/null +++ b/fakk/maps/example/CameraScript.prt @@ -0,0 +1,24 @@ +PRT1 +4 +4 +16 +4 0 2 0 (0 0 0 ) (0 0 608 ) (0 192 608 ) (0 192 0 ) +4 0 1 0 (0 0 608 ) (0 0 0 ) (192 0 0 ) (192 0 608 ) +4 1 3 0 (0 -512 0 ) (0 -512 608 ) (0 0 608 ) (0 0 0 ) +4 2 3 0 (0 0 0 ) (0 0 608 ) (-480 0 608 ) (-480 0 0 ) +4 0 (0 0 608 ) (192 0 608 ) (192 192 608 ) (0 192 608 ) +4 0 (192 192 608 ) (192 192 0 ) (0 192 0 ) (0 192 608 ) +4 0 (192 0 608 ) (192 0 0 ) (192 192 0 ) (192 192 608 ) +4 0 (0 192 0 ) (192 192 0 ) (192 0 0 ) (0 0 0 ) +4 1 (0 -512 608 ) (192 -512 608 ) (192 0 608 ) (0 0 608 ) +4 1 (0 -512 608 ) (0 -512 0 ) (192 -512 0 ) (192 -512 608 ) +4 1 (192 -512 608 ) (192 -512 0 ) (192 0 0 ) (192 0 608 ) +4 1 (0 0 0 ) (192 0 0 ) (192 -512 0 ) (0 -512 0 ) +4 2 (0 192 608 ) (-480 192 608 ) (-480 0 608 ) (0 0 608 ) +4 2 (-480 192 0 ) (-480 192 608 ) (0 192 608 ) (0 192 0 ) +4 2 (-480 192 608 ) (-480 192 0 ) (-480 0 0 ) (-480 0 608 ) +4 2 (0 0 0 ) (-480 0 0 ) (-480 192 0 ) (0 192 0 ) +4 3 (0 0 608 ) (-480 0 608 ) (-480 -512 608 ) (0 -512 608 ) +4 3 (-480 0 608 ) (-480 0 0 ) (-480 -512 0 ) (-480 -512 608 ) +4 3 (-480 -512 608 ) (-480 -512 0 ) (0 -512 0 ) (0 -512 608 ) +4 3 (0 -512 0 ) (-480 -512 0 ) (-480 0 0 ) (0 0 0 ) diff --git a/fakk/maps/example/CameraScript.scr b/fakk/maps/example/CameraScript.scr new file mode 100644 index 0000000..2bab2d7 --- /dev/null +++ b/fakk/maps/example/CameraScript.scr @@ -0,0 +1,47 @@ +// +// Camera Script Map script +// by Mark Dochtermann +// + +// wait for the player to join +waitforplayer +// wait 5 seconds +wait 5 + +// setup camera 1 +// follow the path called campath1 +$camera1 orbit $campath1 +// no transition, the camera should start immediately +$camera1 cut + +// setup camera 2 +// orbit $gruff +$camera2 follow_distance 180 +$camera2 orbit_height 8 +$camera2 orbit $gruff +$camera2 cut + +loop: +// tell the user we are going to switch +print "Following a Camera Path\n" +//wait a second +wait 1 +// cue to the camera over 1 second +cuecamera $camera1 0 +// wait until the camera is done +wait 5 +// tell the user we are going to orbit the other character +print "Orbiting a character\n" +// wait a second +wait 1 +cuecamera $camera2 0 +// wait a while +wait 5 + +cueplayer 0 +end +// loop ad infinitum +goto loop + +// finished +end \ No newline at end of file diff --git a/fakk/maps/example/autocamera.bsp b/fakk/maps/example/autocamera.bsp new file mode 100644 index 0000000000000000000000000000000000000000..31aee1e9020293e4b27b2f011b7a8586769ea4b7 GIT binary patch literal 734708 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 z

    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 literal 0 HcmV?d00001 diff --git a/fakk/maps/example/autosprite.map b/fakk/maps/example/autosprite.map new file mode 100644 index 0000000..2a77c4b --- /dev/null +++ b/fakk/maps/example/autosprite.map @@ -0,0 +1,281 @@ +{ +"classname" "worldspawn" +// brush 0 +{ +( -64 -320 136 ) ( -192 -320 136 ) ( -192 -448 136 ) common/skip -24 0 0.00 1 1 805306368 16512 0 +( -192 -448 240 ) ( -192 -320 240 ) ( -64 -320 240 ) common/skip -24 0 0.00 1 1 805306368 16512 0 +( -192 -448 144 ) ( -64 -448 144 ) ( -64 -448 136 ) common/skip -24 0 0.00 1 1 805306368 16512 0 +( -64 -448 144 ) ( -64 -320 144 ) ( -64 -320 136 ) common/skip 0 0 0.00 1 1 805306368 16512 0 +( -64 -320 144 ) ( -192 -320 144 ) ( -192 -320 136 ) common/skip -24 0 0.00 1 1 805306368 16512 0 +( -192 -320 144 ) ( -192 -448 144 ) ( -192 -448 136 ) testsprite2 0 0 0.00 1 1 805306368 16512 0 +} +// brush 1 +{ +( -64 0 136 ) ( -192 0 136 ) ( -192 -128 136 ) common/skip -24 0 0.00 1 1 805306368 16512 0 +( -192 -128 240 ) ( -192 0 240 ) ( -64 0 240 ) common/skip -24 0 0.00 1 1 805306368 16512 0 +( -192 -128 144 ) ( -64 -128 144 ) ( -64 -128 136 ) common/skip -24 0 0.00 1 1 805306368 16512 0 +( -64 -128 144 ) ( -64 0 144 ) ( -64 0 136 ) common/skip 0 0 0.00 1 1 805306368 16512 0 +( -64 0 144 ) ( -192 0 144 ) ( -192 0 136 ) common/skip -24 0 0.00 1 1 805306368 16512 0 +( -192 0 144 ) ( -192 -128 144 ) ( -192 -128 136 ) testsprite1 0 0 0.00 1 1 805306368 16512 0 +} +// brush 2 +{ +( 224 192 0 ) ( 224 224 0 ) ( -480 224 0 ) eden/bedtrim -224 -32 90.00 1 1 0 0 0 +( -480 224 64 ) ( 224 224 64 ) ( 224 192 64 ) eden/bedtrim -224 -32 90.00 1 1 0 0 0 +( -480 224 256 ) ( -480 192 256 ) ( -480 192 0 ) eden/bedtrim -224 0 0.00 1 1 0 0 0 +( -480 192 256 ) ( 224 192 256 ) ( 224 192 0 ) common/skip 0 0 0.00 1 1 805306368 16512 0 +( 224 224 256 ) ( -480 224 256 ) ( -480 224 0 ) eden/bedtrim 224 0 -180.00 1 -1 0 0 0 +( -416 224 0 ) ( -416 192 0 ) ( -416 208 64 ) eden/bedtrim 224 0 -180.00 1 -1 0 0 0 +} +// brush 3 +{ +( 224 192 0 ) ( 224 224 0 ) ( -480 224 0 ) eden/bedtrim -224 -32 90.00 1 1 0 0 0 +( -480 224 64 ) ( 224 224 64 ) ( 224 192 64 ) eden/bedtrim -224 -32 90.00 1 1 0 0 0 +( -480 192 256 ) ( 224 192 256 ) ( 224 192 0 ) eden/bedtrim 224 0 -180.00 1 -1 0 0 0 +( 224 192 256 ) ( 224 224 256 ) ( 224 224 0 ) eden/bedtrim -224 0 0.00 1 1 0 0 0 +( 224 224 256 ) ( -480 224 256 ) ( -480 224 0 ) eden/bedtrim 224 0 -180.00 1 -1 0 0 0 +( -480 192 0 ) ( -480 224 0 ) ( -480 208 64 ) eden/bedtrim 224 0 -180.00 1 -1 0 0 0 +} +// brush 4 +{ +( 224 192 64 ) ( 224 224 64 ) ( -480 224 64 ) eden/edenmetalwall -224 -224 90.00 1 1 0 0 0 +( -480 224 320 ) ( 224 224 320 ) ( 224 192 320 ) eden/edenmetalwall -224 -224 90.00 1 1 0 0 0 +( -480 224 96 ) ( -480 192 96 ) ( -480 192 64 ) eden/edenmetalwall -224 64 0.00 1 1 0 0 0 +( -480 192 96 ) ( 224 192 96 ) ( 224 192 64 ) common/skip 0 0 0.00 1 1 805306368 16512 0 +( 224 224 96 ) ( -480 224 96 ) ( -480 224 64 ) eden/edenmetalwall 224 63 -180.00 1 -1 0 0 0 +( -416 224 64 ) ( -416 192 64 ) ( -416 208 320 ) eden/edenmetalwall 224 63 -180.00 1 -1 0 0 0 +} +// brush 5 +{ +( 224 192 64 ) ( 224 224 64 ) ( -480 224 64 ) eden/edenmetalwall -224 -224 90.00 1 1 0 0 0 +( -480 224 640 ) ( 224 224 640 ) ( 224 192 640 ) eden/edenmetalwall -224 -224 90.00 1 1 0 0 0 +( -480 192 96 ) ( 224 192 96 ) ( 224 192 64 ) eden/edenmetalwall 224 63 -180.00 1 -1 0 0 0 +( 224 192 96 ) ( 224 224 96 ) ( 224 224 64 ) eden/edenmetalwall -224 64 0.00 1 1 0 0 0 +( 224 224 96 ) ( -480 224 96 ) ( -480 224 64 ) eden/edenmetalwall 224 63 -180.00 1 -1 0 0 0 +( -480 192 384 ) ( -480 224 384 ) ( -480 208 640 ) eden/edenmetalwall 224 63 -180.00 1 -1 0 0 0 +} +// brush 6 + { + patchDef2 + { + eden/edenmetalwall + ( 3 3 0 536870912 0 ) +( +( ( -480 96 63.999981 0 0 ) ( -480 96 352.000061 0 0.500000 ) ( -480 96 640 0 1 ) ) +( ( -384 96 63.999981 0.500000 0 ) ( -384 96 352.000061 0.500000 0.500000 ) ( -384 96 640 0.500000 1 ) ) +( ( -384 192 63.999981 1 0 ) ( -384 192 352.000061 1 0.500000 ) ( -384 192 640 1 1 ) ) +) + } + } +// brush 7 +{ +( -480 192 0 ) ( -512 192 0 ) ( -512 -512 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -512 -512 64 ) ( -512 192 64 ) ( -480 192 64 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -480 -512 256 ) ( -480 192 256 ) ( -480 192 0 ) common/skip 0 0 0.00 1 1 805306368 16512 0 +( -480 192 256 ) ( -512 192 256 ) ( -512 192 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -512 192 256 ) ( -512 -512 256 ) ( -512 -512 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -480 128 0 ) ( -512 128 0 ) ( -496 128 64 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +} +// brush 8 +{ +( -480 192 0 ) ( -512 192 0 ) ( -512 -512 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -512 -512 64 ) ( -512 192 64 ) ( -480 192 64 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -512 -512 256 ) ( -480 -512 256 ) ( -480 -512 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -480 -512 256 ) ( -480 192 256 ) ( -480 192 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -512 192 256 ) ( -512 -512 256 ) ( -512 -512 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -512 192 0 ) ( -480 192 0 ) ( -496 192 64 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +} +// brush 9 +{ +( -480 192 64 ) ( -512 192 64 ) ( -512 -512 64 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +( -512 -512 320 ) ( -512 192 320 ) ( -480 192 320 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +( -480 -512 96 ) ( -480 192 96 ) ( -480 192 64 ) common/skip 0 0 0.00 1 1 805306368 16512 0 +( -480 192 96 ) ( -512 192 96 ) ( -512 192 64 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +( -512 192 96 ) ( -512 -512 96 ) ( -512 -512 64 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +( -480 128 64 ) ( -512 128 64 ) ( -496 128 320 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +} +// brush 10 +{ +( -480 192 64 ) ( -512 192 64 ) ( -512 -512 64 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +( -512 -512 640 ) ( -512 192 640 ) ( -480 192 640 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +( -512 -512 96 ) ( -480 -512 96 ) ( -480 -512 64 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +( -480 -512 416 ) ( -480 192 416 ) ( -480 192 384 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +( -512 192 96 ) ( -512 -512 96 ) ( -512 -512 64 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +( -512 192 64 ) ( -480 192 64 ) ( -496 192 320 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +} +// brush 11 + { + patchDef2 + { + eden/bedtrim + ( 3 3 0 536870912 0 ) +( +( ( -480 96 0 0 0 ) ( -480 96 32 0 0.500000 ) ( -480 96 64 0 1 ) ) +( ( -384 96 0 0.500000 0 ) ( -384 96 32 0.500000 0.500000 ) ( -384 96 64 0.500000 1 ) ) +( ( -384 192 0 1 0 ) ( -384 192 32 1 0.500000 ) ( -384 192 64 1 1 ) ) +) + } + } +// brush 12 +{ +( 192 192 608 ) ( -480 192 608 ) ( -480 -512 608 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( -480 -512 640 ) ( -480 192 640 ) ( 192 192 640 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( -480 -512 640 ) ( 192 -512 640 ) ( 192 -512 608 ) eden/CL_edenroof3 0 -96 0.00 1 1 0 0 0 +( 192 192 640 ) ( -480 192 640 ) ( -480 192 608 ) eden/CL_edenroof3 0 -96 0.00 1 1 0 0 0 +( -480 192 640 ) ( -480 -512 640 ) ( -480 -512 608 ) eden/CL_edenroof3 0 -96 0.00 1 1 0 0 0 +( 216 -112 608 ) ( 216 -240 608 ) ( 216 -176 640 ) eden/CL_edenroof3 0 -96 0.00 1 1 0 0 0 +} +// brush 13 +{ +( 192 192 -32 ) ( -480 192 -32 ) ( -480 -512 -32 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( -480 -512 0 ) ( -480 192 0 ) ( 192 192 0 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( -480 -512 224 ) ( 192 -512 224 ) ( 192 -512 -32 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 192 -512 224 ) ( 192 192 224 ) ( 192 192 -32 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 192 192 224 ) ( -480 192 224 ) ( -480 192 -32 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( -480 192 224 ) ( -480 -512 224 ) ( -480 -512 -32 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +} +// brush 14 +{ +( -480 -512 64 ) ( -480 -544 64 ) ( 224 -544 64 ) eden/edenmetalwall -31 31 -90.00 1 1 0 0 0 +( 224 -544 640 ) ( -480 -544 640 ) ( -480 -512 640 ) eden/edenmetalwall -31 31 -90.00 1 1 0 0 0 +( 224 -544 96 ) ( 224 -512 96 ) ( 224 -512 64 ) eden/edenmetalwall -32 63 -180.00 1 -1 0 0 0 +( 224 -512 96 ) ( -480 -512 96 ) ( -480 -512 64 ) eden/edenmetalwall -32 62 0.00 1.000008 1 0 0 0 +( -480 -512 416 ) ( -480 -544 416 ) ( -480 -544 384 ) eden/edenmetalwall -33 63 -180.00 1 -1 0 0 0 +( -480 -544 96 ) ( 224 -544 96 ) ( 224 -544 64 ) eden/edenmetalwall -32 62 0.00 1.000008 1 0 0 0 +} +// brush 15 +{ +( -480 -512 0 ) ( -480 -544 0 ) ( 224 -544 0 ) eden/bedtrim -31 32 -90.00 1 1 0 0 0 +( 224 -544 64 ) ( -480 -544 64 ) ( -480 -512 64 ) eden/bedtrim -31 32 -90.00 1 1 0 0 0 +( 224 -544 256 ) ( 224 -512 256 ) ( 224 -512 0 ) eden/bedtrim -32 0 -180.00 1 -1 0 0 0 +( 224 -512 256 ) ( -480 -512 256 ) ( -480 -512 0 ) eden/bedtrim -32 0 0.00 1 1 0 0 0 +( -480 -512 256 ) ( -480 -544 256 ) ( -480 -544 0 ) eden/bedtrim -33 0 -180.00 1 -1 0 0 0 +( -480 -544 256 ) ( 224 -544 256 ) ( 224 -544 0 ) eden/bedtrim -32 0 0.00 1 1 0 0 0 +} +// brush 16 +{ +( 192 -512 0 ) ( 224 -512 0 ) ( 224 192 0 ) eden/bedtrim 160 0 -180.00 1 1 0 0 0 +( 224 192 64 ) ( 224 -512 64 ) ( 192 -512 64 ) eden/bedtrim 160 0 -180.00 1 1 0 0 0 +( 224 192 256 ) ( 192 192 256 ) ( 192 192 0 ) eden/bedtrim 160 0 -180.00 1 -1 0 0 0 +( 192 192 256 ) ( 192 -512 256 ) ( 192 -512 0 ) eden/bedtrim -64 0 -180.00 1 -1 0 0 0 +( 192 -512 256 ) ( 224 -512 256 ) ( 224 -512 0 ) eden/bedtrim 159 0 -180.00 1 -1 0 0 0 +( 224 -512 256 ) ( 224 192 256 ) ( 224 192 0 ) eden/bedtrim -64 0 -180.00 1 -1 0 0 0 +} +// brush 17 +{ +( 192 -512 64 ) ( 224 -512 64 ) ( 224 192 64 ) eden/edenmetalwall 160 63 -180.00 1 1 0 0 0 +( 224 192 640 ) ( 224 -512 640 ) ( 192 -512 640 ) eden/edenmetalwall 160 63 -180.00 1 1 0 0 0 +( 224 192 96 ) ( 192 192 96 ) ( 192 192 64 ) eden/edenmetalwall 160 64 -180.00 1 -1 0 0 0 +( 192 192 416 ) ( 192 -512 416 ) ( 192 -512 384 ) eden/edenmetalwall -64 62 -180.00 1 -1 0 0 0 +( 192 -512 96 ) ( 224 -512 96 ) ( 224 -512 64 ) eden/edenmetalwall 159 64 -180.00 1 -1 0 0 0 +( 224 -512 96 ) ( 224 192 96 ) ( 224 192 64 ) eden/edenmetalwall -64 62 -180.00 1 -1 0 0 0 +} +} +// entity 1 +{ +"targetname" "movinlight2" +"classname" "script_object" +// brush 0 +{ +( 16 -368 144 ) ( 0 -368 144 ) ( 0 -384 144 ) common/skip 32 16 0.00 1 1 805306368 16512 0 +( 0 -384 160 ) ( 0 -368 160 ) ( 16 -368 160 ) common/skip 32 16 0.00 1 1 805306368 16512 0 +( 0 -384 240 ) ( 16 -384 240 ) ( 16 -384 144 ) common/skip 32 -48 0.00 1 1 805306368 16512 0 +( 16 -384 240 ) ( 16 -368 240 ) ( 16 -368 144 ) common/skip -16 -48 0.00 1 1 805306368 16512 0 +( 16 -368 240 ) ( 0 -368 240 ) ( 0 -368 144 ) common/skip 32 -48 0.00 1 1 805306368 16512 0 +( 0 -368 240 ) ( 0 -384 240 ) ( 0 -384 144 ) common/skip -16 -48 0.00 1 1 805306368 16512 0 +} +} +// entity 2 +{ +"targetname" "movinlight1" +"classname" "script_object" +// brush 0 +{ +( -344 64 144 ) ( -360 64 144 ) ( -360 48 144 ) common/skip 0 0 0.00 1 1 805306368 16512 0 +( -360 48 160 ) ( -360 64 160 ) ( -344 64 160 ) common/skip 0 0 0.00 1 1 805306368 16512 0 +( -360 48 240 ) ( -344 48 240 ) ( -344 48 144 ) common/skip 0 -48 0.00 1 1 805306368 16512 0 +( -344 48 240 ) ( -344 64 240 ) ( -344 64 144 ) common/skip 0 -48 0.00 1 1 805306368 16512 0 +( -344 64 240 ) ( -360 64 240 ) ( -360 64 144 ) common/skip 0 -48 0.00 1 1 805306368 16512 0 +( -360 64 240 ) ( -360 48 240 ) ( -360 48 144 ) common/skip 0 -48 0.00 1 1 805306368 16512 0 +} +} +// entity 3 +{ +"classname" "light" +"spawnflags" "0" +"origin" "-352 56 168" +"light" "200" +"_color" "1.000000 0.724409 0.523622" +} +// entity 4 +{ +"classname" "info_player_start" +"angle" "0" +"origin" "-416 -176 24" +} +// entity 5 +{ +"origin" "8 56 168" +"spawnflags" "0" +"classname" "light" +"light" "200" +"_color" "0.629921 0.846457 1.000000" +} +// entity 6 +{ +"origin" "-344 -376 168" +"spawnflags" "0" +"classname" "light" +"light" "200" +} +// entity 7 +{ +"classname" "light" +"spawnflags" "0" +"origin" "8 -376 168" +"light" "200" +} +// entity 8 +{ +"light" "200" +"classname" "light" +"spawnflags" "0" +"origin" "-168 -160 168" +} +// entity 9 +{ +"_color" "1.000000 0.724409 0.523622" +"light" "200" +"origin" "-352 56 384" +"spawnflags" "0" +"classname" "light" +} +// entity 10 +{ +"_color" "0.629921 0.846457 1.000000" +"light" "200" +"classname" "light" +"spawnflags" "0" +"origin" "8 56 384" +} +// entity 11 +{ +"light" "200" +"classname" "light" +"spawnflags" "0" +"origin" "-344 -376 384" +} +// entity 12 +{ +"light" "200" +"origin" "8 -376 384" +"spawnflags" "0" +"classname" "light" +} +// entity 13 +{ +"origin" "-168 -160 384" +"spawnflags" "0" +"classname" "light" +"light" "200" +} diff --git a/fakk/maps/example/autosprite.prt b/fakk/maps/example/autosprite.prt new file mode 100644 index 0000000..ff1e3bb --- /dev/null +++ b/fakk/maps/example/autosprite.prt @@ -0,0 +1,24 @@ +PRT1 +4 +4 +16 +4 0 2 0 (0 0 0 ) (0 0 608 ) (0 192 608 ) (0 192 0 ) +4 0 1 0 (0 0 608 ) (0 0 0 ) (192 0 0 ) (192 0 608 ) +4 1 3 0 (0 -512 0 ) (0 -512 608 ) (0 0 608 ) (0 0 0 ) +4 2 3 0 (0 0 0 ) (0 0 608 ) (-480 0 608 ) (-480 0 0 ) +4 0 (0 0 608 ) (192 0 608 ) (192 192 608 ) (0 192 608 ) +4 0 (192 192 608 ) (192 192 0 ) (0 192 0 ) (0 192 608 ) +4 0 (192 0 608 ) (192 0 0 ) (192 192 0 ) (192 192 608 ) +4 0 (0 192 0 ) (192 192 0 ) (192 0 0 ) (0 0 0 ) +4 1 (0 -512 608 ) (192 -512 608 ) (192 0 608 ) (0 0 608 ) +4 1 (0 -512 608 ) (0 -512 0 ) (192 -512 0 ) (192 -512 608 ) +4 1 (192 -512 608 ) (192 -512 0 ) (192 0 0 ) (192 0 608 ) +4 1 (0 0 0 ) (192 0 0 ) (192 -512 0 ) (0 -512 0 ) +4 2 (0 192 608 ) (-480 192 608 ) (-480 0 608 ) (0 0 608 ) +4 2 (-480 192 0 ) (-480 192 608 ) (0 192 608 ) (0 192 0 ) +4 2 (-480 192 608 ) (-480 192 0 ) (-480 0 0 ) (-480 0 608 ) +4 2 (0 0 0 ) (-480 0 0 ) (-480 192 0 ) (0 192 0 ) +4 3 (0 0 608 ) (-480 0 608 ) (-480 -512 608 ) (0 -512 608 ) +4 3 (-480 0 608 ) (-480 0 0 ) (-480 -512 0 ) (-480 -512 608 ) +4 3 (-480 -512 608 ) (-480 -512 0 ) (0 -512 0 ) (0 -512 608 ) +4 3 (0 -512 0 ) (-480 -512 0 ) (-480 0 0 ) (0 0 0 ) diff --git a/fakk/maps/example/beam.bsp b/fakk/maps/example/beam.bsp new file mode 100644 index 0000000000000000000000000000000000000000..c393cb56dbd0b4a5e6dfa86fff16d2b734eb8460 GIT binary patch literal 73116 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 literal 0 HcmV?d00001 diff --git a/fakk/maps/example/beam.map b/fakk/maps/example/beam.map new file mode 100644 index 0000000..096c6da --- /dev/null +++ b/fakk/maps/example/beam.map @@ -0,0 +1,320 @@ +{ +"classname" "worldspawn" +// brush 0 +{ +( 224 192 0 ) ( 224 224 0 ) ( -480 224 0 ) eden/bedtrim -224 -32 90.00 1 1 0 0 0 +( -480 224 64 ) ( 224 224 64 ) ( 224 192 64 ) eden/bedtrim -224 -32 90.00 1 1 0 0 0 +( -480 224 256 ) ( -480 192 256 ) ( -480 192 0 ) eden/bedtrim -224 0 0.00 1 1 0 0 0 +( -480 192 256 ) ( 224 192 256 ) ( 224 192 0 ) common/skip 0 0 0.00 1 1 805306368 16512 0 +( 224 224 256 ) ( -480 224 256 ) ( -480 224 0 ) eden/bedtrim 224 0 -180.00 1 -1 0 0 0 +( -416 224 0 ) ( -416 192 0 ) ( -416 208 64 ) eden/bedtrim 224 0 -180.00 1 -1 0 0 0 +} +// brush 1 +{ +( 224 192 0 ) ( 224 224 0 ) ( -480 224 0 ) eden/bedtrim -224 -32 90.00 1 1 0 0 0 +( -480 224 64 ) ( 224 224 64 ) ( 224 192 64 ) eden/bedtrim -224 -32 90.00 1 1 0 0 0 +( -480 192 256 ) ( 224 192 256 ) ( 224 192 0 ) eden/bedtrim 224 0 -180.00 1 -1 0 0 0 +( 224 192 256 ) ( 224 224 256 ) ( 224 224 0 ) eden/bedtrim -224 0 0.00 1 1 0 0 0 +( 224 224 256 ) ( -480 224 256 ) ( -480 224 0 ) eden/bedtrim 224 0 -180.00 1 -1 0 0 0 +( -480 192 0 ) ( -480 224 0 ) ( -480 208 64 ) eden/bedtrim 224 0 -180.00 1 -1 0 0 0 +} +// brush 2 +{ +( 224 192 64 ) ( 224 224 64 ) ( -480 224 64 ) eden/edenmetalwall -224 -224 90.00 1 1 0 0 0 +( -480 224 320 ) ( 224 224 320 ) ( 224 192 320 ) eden/edenmetalwall -224 -224 90.00 1 1 0 0 0 +( -480 224 96 ) ( -480 192 96 ) ( -480 192 64 ) eden/edenmetalwall -224 64 0.00 1 1 0 0 0 +( -480 192 96 ) ( 224 192 96 ) ( 224 192 64 ) common/skip 0 0 0.00 1 1 805306368 16512 0 +( 224 224 96 ) ( -480 224 96 ) ( -480 224 64 ) eden/edenmetalwall 224 63 -180.00 1 -1 0 0 0 +( -416 224 64 ) ( -416 192 64 ) ( -416 208 320 ) eden/edenmetalwall 224 63 -180.00 1 -1 0 0 0 +} +// brush 3 +{ +( 224 192 64 ) ( 224 224 64 ) ( -480 224 64 ) eden/edenmetalwall -224 -224 90.00 1 1 0 0 0 +( -480 224 320 ) ( 224 224 320 ) ( 224 192 320 ) eden/edenmetalwall -224 -224 90.00 1 1 0 0 0 +( -480 192 96 ) ( 224 192 96 ) ( 224 192 64 ) eden/edenmetalwall 224 63 -180.00 1 -1 0 0 0 +( 224 192 96 ) ( 224 224 96 ) ( 224 224 64 ) eden/edenmetalwall -224 64 0.00 1 1 0 0 0 +( 224 224 96 ) ( -480 224 96 ) ( -480 224 64 ) eden/edenmetalwall 224 63 -180.00 1 -1 0 0 0 +( -480 192 64 ) ( -480 224 64 ) ( -480 208 320 ) eden/edenmetalwall 224 63 -180.00 1 -1 0 0 0 +} +// brush 4 + { + patchDef2 + { + eden/edenmetalwall + ( 3 3 0 536870912 0 ) +( +( ( -480 96 63.999992 0 0 ) ( -480 96 192 0 0.500000 ) ( -480 96 320 0 1 ) ) +( ( -384 96 63.999992 0.500000 0 ) ( -384 96 192 0.500000 0.500000 ) ( -384 96 320 0.500000 1 ) ) +( ( -384 192 63.999992 1 0 ) ( -384 192 192 1 0.500000 ) ( -384 192 320 1 1 ) ) +) + } + } +// brush 5 +{ +( -480 192 0 ) ( -512 192 0 ) ( -512 -512 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -512 -512 64 ) ( -512 192 64 ) ( -480 192 64 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -480 -512 256 ) ( -480 192 256 ) ( -480 192 0 ) common/skip 0 0 0.00 1 1 805306368 16512 0 +( -480 192 256 ) ( -512 192 256 ) ( -512 192 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -512 192 256 ) ( -512 -512 256 ) ( -512 -512 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -480 128 0 ) ( -512 128 0 ) ( -496 128 64 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +} +// brush 6 +{ +( -480 192 0 ) ( -512 192 0 ) ( -512 -512 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -512 -512 64 ) ( -512 192 64 ) ( -480 192 64 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -512 -512 256 ) ( -480 -512 256 ) ( -480 -512 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -480 -512 256 ) ( -480 192 256 ) ( -480 192 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -512 192 256 ) ( -512 -512 256 ) ( -512 -512 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -512 192 0 ) ( -480 192 0 ) ( -496 192 64 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +} +// brush 7 +{ +( -480 192 64 ) ( -512 192 64 ) ( -512 -512 64 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +( -512 -512 320 ) ( -512 192 320 ) ( -480 192 320 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +( -480 -512 96 ) ( -480 192 96 ) ( -480 192 64 ) common/skip 0 0 0.00 1 1 805306368 16512 0 +( -480 192 96 ) ( -512 192 96 ) ( -512 192 64 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +( -512 192 96 ) ( -512 -512 96 ) ( -512 -512 64 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +( -480 128 64 ) ( -512 128 64 ) ( -496 128 320 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +} +// brush 8 +{ +( -480 192 64 ) ( -512 192 64 ) ( -512 -512 64 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +( -512 -512 320 ) ( -512 192 320 ) ( -480 192 320 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +( -512 -512 96 ) ( -480 -512 96 ) ( -480 -512 64 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +( -480 -512 96 ) ( -480 192 96 ) ( -480 192 64 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +( -512 192 96 ) ( -512 -512 96 ) ( -512 -512 64 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +( -512 192 64 ) ( -480 192 64 ) ( -496 192 320 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +} +// brush 9 + { + patchDef2 + { + eden/bedtrim + ( 3 3 0 536870912 0 ) +( +( ( -480 96 0 0 0 ) ( -480 96 32 0 0.500000 ) ( -480 96 64 0 1 ) ) +( ( -384 96 0 0.500000 0 ) ( -384 96 32 0.500000 0.500000 ) ( -384 96 64 0.500000 1 ) ) +( ( -384 192 0 1 0 ) ( -384 192 32 1 0.500000 ) ( -384 192 64 1 1 ) ) +) + } + } +// brush 10 +{ +( 96 96 352 ) ( -32 96 352 ) ( -32 -416 352 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( -32 -416 416 ) ( -32 96 416 ) ( 96 96 416 ) we_cemetary_test/levelord_sky 0 0 0.00 1 1 0 0 0 +( -32 -416 416 ) ( 96 -416 416 ) ( 96 -416 352 ) we_cemetary_test/levelord_sky 0 0 0.00 1 1 0 0 0 +( 96 -416 416 ) ( 96 96 416 ) ( 96 96 352 ) we_cemetary_test/levelord_sky 0 0 0.00 1 1 0 0 0 +( 96 96 416 ) ( -32 96 416 ) ( -32 96 352 ) we_cemetary_test/levelord_sky 0 0 0.00 1 1 0 0 0 +( -32 96 416 ) ( -32 -416 416 ) ( -32 -416 352 ) we_cemetary_test/levelord_sky 0 0 0.00 1 1 0 0 0 +} +// brush 11 +{ +( -64 -416 304 ) ( -64 -448 304 ) ( 128 -448 304 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( 128 -448 352 ) ( -64 -448 352 ) ( -64 -416 352 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( 96 -416 352 ) ( -32 -416 352 ) ( -32 -416 320 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( 128 -448 352 ) ( 96 -416 352 ) ( 96 -416 320 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( -64 -448 320 ) ( -64 -448 352 ) ( 128 -448 352 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( -64 -448 320 ) ( -32 -416 320 ) ( -32 -416 352 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +} +// brush 12 +{ +( -32 128 304 ) ( -64 128 304 ) ( -64 -64 304 ) eden/FL_edenhouse 0 32 90.00 1 1 0 0 0 +( -64 -64 352 ) ( -64 128 352 ) ( -32 128 352 ) eden/FL_edenhouse 0 32 90.00 1 1 0 0 0 +( -32 -32 352 ) ( -32 96 352 ) ( -32 96 320 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( -64 -448 352 ) ( -32 -416 352 ) ( -32 -416 320 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( -64 128 320 ) ( -64 128 352 ) ( -64 -64 352 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( -64 128 320 ) ( -32 96 320 ) ( -32 96 352 ) eden/FL_edenhouse -64 0 -180.00 1 -1 0 0 0 +} +// brush 13 +{ +( 128 -64 304 ) ( 128 128 304 ) ( 96 128 304 ) eden/FL_edenhouse 0 -96 90.00 1 1 0 0 0 +( 96 128 352 ) ( 128 128 352 ) ( 128 -64 352 ) eden/FL_edenhouse 0 -96 90.00 1 1 0 0 0 +( 96 96 320 ) ( 96 96 352 ) ( 96 -32 352 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( 96 -416 320 ) ( 96 -416 352 ) ( 128 -448 352 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( 128 -64 352 ) ( 128 128 352 ) ( 128 128 320 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( 96 96 352 ) ( 96 96 320 ) ( 128 128 320 ) eden/FL_edenhouse -64 0 -180.00 1 -1 0 0 0 +} +// brush 14 +{ +( 128 128 304 ) ( -64 128 304 ) ( -64 96 304 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( -64 96 352 ) ( -64 128 352 ) ( 128 128 352 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( -32 96 320 ) ( -32 96 352 ) ( 96 96 352 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( 96 96 320 ) ( 96 96 352 ) ( 128 128 352 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( 128 128 352 ) ( -64 128 352 ) ( -64 128 320 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( -32 96 352 ) ( -32 96 320 ) ( -64 128 320 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +} +// brush 15 +{ +( 128 192 320 ) ( -64 192 320 ) ( -64 128 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( -64 128 352 ) ( -64 192 352 ) ( 128 192 352 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( -64 128 352 ) ( 128 128 352 ) ( 128 128 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( 128 128 352 ) ( 128 192 352 ) ( 128 192 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( 128 192 352 ) ( -64 192 352 ) ( -64 192 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( -64 192 352 ) ( -64 128 352 ) ( -64 128 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +} +// brush 16 +{ +( 192 192 320 ) ( 128 192 320 ) ( 128 -448 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( 128 -448 352 ) ( 128 192 352 ) ( 192 192 352 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( 128 -448 352 ) ( 192 -448 352 ) ( 192 -448 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( 192 -448 352 ) ( 192 192 352 ) ( 192 192 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( 192 192 352 ) ( 128 192 352 ) ( 128 192 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( 128 192 352 ) ( 128 -448 352 ) ( 128 -448 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +} +// brush 17 +{ +( 192 192 320 ) ( -480 192 320 ) ( -480 -512 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( -480 -512 352 ) ( -480 192 352 ) ( 192 192 352 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( -480 -512 352 ) ( 192 -512 352 ) ( 192 -512 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( 192 -512 352 ) ( 192 192 352 ) ( 192 192 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( 224 -448 352 ) ( -448 -448 352 ) ( -448 -448 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( -64 -256 320 ) ( -64 -128 320 ) ( -64 -192 352 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +} +// brush 18 +{ +( 192 192 320 ) ( -480 192 320 ) ( -480 -512 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( -480 -512 352 ) ( -480 192 352 ) ( 192 192 352 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( -480 -512 352 ) ( 192 -512 352 ) ( 192 -512 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( 192 192 352 ) ( -480 192 352 ) ( -480 192 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( -480 192 352 ) ( -480 -512 352 ) ( -480 -512 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( -64 -128 320 ) ( -64 -256 320 ) ( -64 -192 352 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +} +// brush 19 +{ +( 192 192 -32 ) ( -480 192 -32 ) ( -480 -512 -32 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( -480 -512 0 ) ( -480 192 0 ) ( 192 192 0 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( -480 -512 224 ) ( 192 -512 224 ) ( 192 -512 -32 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 192 -512 224 ) ( 192 192 224 ) ( 192 192 -32 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 192 192 224 ) ( -480 192 224 ) ( -480 192 -32 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( -480 192 224 ) ( -480 -512 224 ) ( -480 -512 -32 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +} +// brush 20 +{ +( -480 -512 64 ) ( -480 -544 64 ) ( 224 -544 64 ) eden/edenmetalwall -31 31 -90.00 1 1 0 0 0 +( 224 -544 320 ) ( -480 -544 320 ) ( -480 -512 320 ) eden/edenmetalwall -31 31 -90.00 1 1 0 0 0 +( 224 -544 96 ) ( 224 -512 96 ) ( 224 -512 64 ) eden/edenmetalwall -32 63 -180.00 1 -1 0 0 0 +( 224 -512 96 ) ( -480 -512 96 ) ( -480 -512 64 ) eden/edenmetalwall -32 62 0.00 1.000008 1 0 0 0 +( -480 -512 96 ) ( -480 -544 96 ) ( -480 -544 64 ) eden/edenmetalwall -33 63 -180.00 1 -1 0 0 0 +( -480 -544 96 ) ( 224 -544 96 ) ( 224 -544 64 ) eden/edenmetalwall -32 62 0.00 1.000008 1 0 0 0 +} +// brush 21 +{ +( -480 -512 0 ) ( -480 -544 0 ) ( 224 -544 0 ) eden/bedtrim -31 32 -90.00 1 1 0 0 0 +( 224 -544 64 ) ( -480 -544 64 ) ( -480 -512 64 ) eden/bedtrim -31 32 -90.00 1 1 0 0 0 +( 224 -544 256 ) ( 224 -512 256 ) ( 224 -512 0 ) eden/bedtrim -32 0 -180.00 1 -1 0 0 0 +( 224 -512 256 ) ( -480 -512 256 ) ( -480 -512 0 ) eden/bedtrim -32 0 0.00 1 1 0 0 0 +( -480 -512 256 ) ( -480 -544 256 ) ( -480 -544 0 ) eden/bedtrim -33 0 -180.00 1 -1 0 0 0 +( -480 -544 256 ) ( 224 -544 256 ) ( 224 -544 0 ) eden/bedtrim -32 0 0.00 1 1 0 0 0 +} +// brush 22 +{ +( 192 -512 0 ) ( 224 -512 0 ) ( 224 192 0 ) eden/bedtrim 160 0 -180.00 1 1 0 0 0 +( 224 192 64 ) ( 224 -512 64 ) ( 192 -512 64 ) eden/bedtrim 160 0 -180.00 1 1 0 0 0 +( 224 192 256 ) ( 192 192 256 ) ( 192 192 0 ) eden/bedtrim 160 0 -180.00 1 -1 0 0 0 +( 192 192 256 ) ( 192 -512 256 ) ( 192 -512 0 ) eden/bedtrim -64 0 -180.00 1 -1 0 0 0 +( 192 -512 256 ) ( 224 -512 256 ) ( 224 -512 0 ) eden/bedtrim 159 0 -180.00 1 -1 0 0 0 +( 224 -512 256 ) ( 224 192 256 ) ( 224 192 0 ) eden/bedtrim -64 0 -180.00 1 -1 0 0 0 +} +// brush 23 +{ +( 192 -512 64 ) ( 224 -512 64 ) ( 224 192 64 ) eden/edenmetalwall 160 63 -180.00 1 1 0 0 0 +( 224 192 320 ) ( 224 -512 320 ) ( 192 -512 320 ) eden/edenmetalwall 160 63 -180.00 1 1 0 0 0 +( 224 192 96 ) ( 192 192 96 ) ( 192 192 64 ) eden/edenmetalwall 160 64 -180.00 1 -1 0 0 0 +( 192 192 96 ) ( 192 -512 96 ) ( 192 -512 64 ) eden/edenmetalwall -64 62 -180.00 1 -1 0 0 0 +( 192 -512 96 ) ( 224 -512 96 ) ( 224 -512 64 ) eden/edenmetalwall 159 64 -180.00 1 -1 0 0 0 +( 224 -512 96 ) ( 224 192 96 ) ( 224 192 64 ) eden/edenmetalwall -64 62 -180.00 1 -1 0 0 0 +} +} +// entity 1 +{ +"origin" "-116 -44 76" +"targetname" "t6" +"classname" "info_notnull" +} +// entity 2 +{ +"origin" "-196 -60 180" +"targetname" "t5" +"classname" "info_notnull" +} +// entity 3 +{ +"shader" "beam_darkblue" +"numsegments" "5" +"maxoffset" "0" +"minoffset" "0" +"origin" "-416 -56 184" +"spawnflags" "1" +"target" "t5" +"classname" "func_beam" +"targetname" "blah" +"rendereffects" "+lightstyledynamiclight" +} +// entity 4 +{ +"classname" "script_object" +"targetname" "t2" +// brush 0 +{ +( 16 -360 144 ) ( 0 -360 144 ) ( 0 -376 144 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( 0 -376 160 ) ( 0 -360 160 ) ( 16 -360 160 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( 0 -376 240 ) ( 16 -376 240 ) ( 16 -376 144 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( 16 -376 240 ) ( 16 -360 240 ) ( 16 -360 144 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( 16 -360 240 ) ( 0 -360 240 ) ( 0 -360 144 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( 0 -360 240 ) ( 0 -376 240 ) ( 0 -376 144 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +} +} +// entity 5 +{ +"_color" "1.000000 0.724409 0.523622" +"light" "200" +"origin" "-352 48 168" +"spawnflags" "0" +"classname" "light" +} +// entity 6 +{ +"origin" "-432 -464 24" +"angle" "45" +"classname" "info_player_start" +} +// entity 7 +{ +"_color" "0.629921 0.846457 1.000000" +"light" "200" +"classname" "light" +"spawnflags" "0" +"origin" "8 56 168" +} +// entity 8 +{ +"light" "200" +"classname" "light" +"spawnflags" "0" +"origin" "-344 -376 168" +} +// entity 9 +{ +"light" "200" +"origin" "8 -380 168" +"spawnflags" "0" +"classname" "light" +} +// entity 10 +{ +"origin" "-168 -160 168" +"spawnflags" "0" +"classname" "light" +"light" "200" +} +// entity 11 +{ +"classname" "func_beam" +"target" "t6" +"spawnflags" "1" +"origin" "-112 -40 248" +"minoffset" "0" +"maxoffset" "0" +"numsegments" "5" +"shader" "beam_darkblue" +} diff --git a/fakk/maps/example/beam.prt b/fakk/maps/example/beam.prt new file mode 100644 index 0000000..63b4d74 --- /dev/null +++ b/fakk/maps/example/beam.prt @@ -0,0 +1,96 @@ +PRT1 +16 +28 +64 +4 0 4 0 (128 0 304 ) (192 0 304 ) (192 0 320 ) (128 0 320 ) +4 0 3 0 (128 192 304 ) (192 192 304 ) (192 0 304 ) (128 0 304 ) +4 0 1 0 (128 192 320 ) (128 192 304 ) (128 128 304 ) (128 128 320 ) +4 1 8 0 (0 192 320 ) (0 192 304 ) (0 128 304 ) (0 128 320 ) +4 1 3 0 (0 192 304 ) (128 192 304 ) (128 128 304 ) (0 128 304 ) +4 2 9 0 (0 0 304 ) (0 0 352 ) (0 96 352 ) (0 96 304 ) +4 2 5 0 (0 0 352 ) (0 0 304 ) (96 0 304 ) (96 0 352 ) +4 2 3 0 (96 0 304 ) (0 0 304 ) (0 96 304 ) (96 96 304 ) +4 3 11 0 (0 0 0 ) (0 0 304 ) (0 192 304 ) (0 192 0 ) +4 3 7 0 (0 0 304 ) (0 0 0 ) (192 0 0 ) (192 0 304 ) +4 4 7 0 (128 0 304 ) (192 0 304 ) (192 -448 304 ) (128 -448 304 ) +4 4 6 0 (128 -448 304 ) (192 -448 304 ) (192 -448 320 ) (128 -448 320 ) +4 5 12 0 (0 0 352 ) (0 0 304 ) (0 -416 304 ) (0 -416 352 ) +4 5 7 0 (0 0 304 ) (96 0 304 ) (96 -416 304 ) (0 -416 304 ) +4 6 13 0 (0 -512 304 ) (0 -512 320 ) (0 -448 320 ) (0 -448 304 ) +4 6 7 0 (192 -448 304 ) (192 -512 304 ) (0 -512 304 ) (0 -448 304 ) +4 7 15 0 (0 -512 0 ) (0 -512 304 ) (0 0 304 ) (0 0 0 ) +4 8 11 0 (-64 128 304 ) (-64 192 304 ) (0 192 304 ) (0 128 304 ) +4 8 10 0 (-64 192 320 ) (-64 192 304 ) (-64 128 304 ) (-64 128 320 ) +4 9 12 0 (0 0 304 ) (0 0 352 ) (-32 0 352 ) (-32 0 304 ) +4 9 11 0 (0 0 304 ) (-32 0 304 ) (-32 96 304 ) (0 96 304 ) +4 10 14 0 (-480 0 320 ) (-480 0 304 ) (-64 0 304 ) (-64 0 320 ) +4 10 11 0 (-64 0 304 ) (-480 0 304 ) (-480 192 304 ) (-64 192 304 ) +4 11 15 0 (0 0 0 ) (0 0 304 ) (-480 0 304 ) (-480 0 0 ) +4 12 15 0 (-32 0 304 ) (0 0 304 ) (0 -416 304 ) (-32 -416 304 ) +4 13 15 0 (0 -512 304 ) (-64 -512 304 ) (-64 -448 304 ) (0 -448 304 ) +4 13 14 0 (-64 -448 304 ) (-64 -512 304 ) (-64 -512 320 ) (-64 -448 320 ) +4 14 15 0 (-64 -512 304 ) (-480 -512 304 ) (-480 0 304 ) (-64 0 304 ) +4 0 (128 96 304 ) (128 0 304 ) (128 0 320 ) (128 96 320 ) +4 0 (128 128 304 ) (128 96 304 ) (128 96 320 ) (128 128 320 ) +4 0 (192 0 320 ) (192 0 304 ) (192 192 304 ) (192 192 320 ) +4 0 (128 192 320 ) (192 192 320 ) (192 192 304 ) (128 192 304 ) +4 0 (192 0 320 ) (192 192 320 ) (128 192 320 ) (128 0 320 ) +4 1 (0 128 304 ) (128 128 304 ) (128 128 320 ) (0 128 320 ) +4 1 (128 192 320 ) (128 192 304 ) (0 192 304 ) (0 192 320 ) +4 1 (128 192 320 ) (0 192 320 ) (0 128 320 ) (128 128 320 ) +4 2 (96 96 352 ) (0 96 352 ) (0 0 352 ) (96 0 352 ) +4 2 (0 96 352 ) (96 96 352 ) (96 96 304 ) (0 96 304 ) +4 2 (96 0 352 ) (96 0 304 ) (96 96 304 ) (96 96 352 ) +4 3 (192 192 304 ) (192 192 0 ) (0 192 0 ) (0 192 304 ) +4 3 (192 0 304 ) (192 0 0 ) (192 192 0 ) (192 192 304 ) +4 3 (0 128 304 ) (0 96 304 ) (128 96 304 ) (128 128 304 ) +4 3 (96 96 304 ) (96 0 304 ) (128 0 304 ) (128 96 304 ) +4 3 (0 192 0 ) (192 192 0 ) (192 0 0 ) (0 0 0 ) +4 4 (128 0 304 ) (128 -448 304 ) (128 -448 320 ) (128 0 320 ) +4 4 (192 -448 320 ) (192 -448 304 ) (192 0 304 ) (192 0 320 ) +4 4 (192 0 320 ) (128 0 320 ) (128 -448 320 ) (192 -448 320 ) +4 5 (96 -416 352 ) (96 0 352 ) (0 0 352 ) (0 -416 352 ) +4 5 (96 0 352 ) (96 -416 352 ) (96 -416 304 ) (96 0 304 ) +4 5 (0 -416 304 ) (96 -416 304 ) (96 -416 352 ) (0 -416 352 ) +4 6 (192 -448 320 ) (192 -512 320 ) (192 -512 304 ) (192 -448 304 ) +4 6 (0 -512 320 ) (0 -512 304 ) (192 -512 304 ) (192 -512 320 ) +4 6 (96 -448 320 ) (128 -448 320 ) (128 -448 304 ) (96 -448 304 ) +4 6 (96 -448 320 ) (96 -448 304 ) (0 -448 304 ) (0 -448 320 ) +4 6 (0 -512 320 ) (192 -512 320 ) (192 -448 320 ) (0 -448 320 ) +4 7 (0 -512 304 ) (0 -512 0 ) (192 -512 0 ) (192 -512 304 ) +4 7 (192 -512 304 ) (192 -512 0 ) (192 0 0 ) (192 0 304 ) +4 7 (96 -448 304 ) (128 -448 304 ) (128 0 304 ) (96 0 304 ) +4 7 (0 -416 304 ) (0 -448 304 ) (96 -448 304 ) (96 -416 304 ) +4 7 (0 0 0 ) (192 0 0 ) (192 -512 0 ) (0 -512 0 ) +4 8 (-64 128 320 ) (-64 128 304 ) (0 128 304 ) (0 128 320 ) +4 8 (-64 192 304 ) (-64 192 320 ) (0 192 320 ) (0 192 304 ) +4 8 (0 192 320 ) (-64 192 320 ) (-64 128 320 ) (0 128 320 ) +4 9 (0 96 352 ) (-32 96 352 ) (-32 0 352 ) (0 0 352 ) +4 9 (0 96 304 ) (-32 96 304 ) (-32 96 352 ) (0 96 352 ) +4 9 (-32 96 352 ) (-32 96 304 ) (-32 0 304 ) (-32 0 352 ) +4 10 (-480 192 320 ) (-480 192 304 ) (-480 0 304 ) (-480 0 320 ) +4 10 (-64 192 320 ) (-64 192 304 ) (-480 192 304 ) (-480 192 320 ) +4 10 (-64 128 320 ) (-64 96 320 ) (-64 96 304 ) (-64 128 304 ) +4 10 (-64 96 320 ) (-64 0 320 ) (-64 0 304 ) (-64 96 304 ) +4 10 (-64 0 320 ) (-64 192 320 ) (-480 192 320 ) (-480 0 320 ) +4 11 (-480 192 0 ) (-480 192 304 ) (0 192 304 ) (0 192 0 ) +4 11 (-480 192 304 ) (-480 192 0 ) (-480 0 0 ) (-480 0 304 ) +4 11 (0 96 304 ) (0 128 304 ) (-64 128 304 ) (-64 96 304 ) +4 11 (-32 96 304 ) (-64 96 304 ) (-64 0 304 ) (-32 0 304 ) +4 11 (0 0 0 ) (-480 0 0 ) (-480 192 0 ) (0 192 0 ) +4 12 (0 -416 352 ) (-32 -416 352 ) (-32 -416 304 ) (0 -416 304 ) +4 12 (-32 -416 352 ) (0 -416 352 ) (0 0 352 ) (-32 0 352 ) +4 12 (-32 0 304 ) (-32 -416 304 ) (-32 -416 352 ) (-32 0 352 ) +4 13 (-64 -512 304 ) (0 -512 304 ) (0 -512 320 ) (-64 -512 320 ) +4 13 (0 -448 320 ) (0 -448 304 ) (-64 -448 304 ) (-64 -448 320 ) +4 13 (0 -448 320 ) (-64 -448 320 ) (-64 -512 320 ) (0 -512 320 ) +4 14 (-480 -512 320 ) (-480 -512 304 ) (-64 -512 304 ) (-64 -512 320 ) +4 14 (-480 0 320 ) (-480 0 304 ) (-480 -512 304 ) (-480 -512 320 ) +4 14 (-64 -416 320 ) (-64 -448 320 ) (-64 -448 304 ) (-64 -416 304 ) +4 14 (-64 -416 320 ) (-64 -416 304 ) (-64 0 304 ) (-64 0 320 ) +4 14 (-480 0 320 ) (-480 -512 320 ) (-64 -512 320 ) (-64 0 320 ) +4 15 (-480 0 304 ) (-480 0 0 ) (-480 -512 0 ) (-480 -512 304 ) +4 15 (-480 -512 304 ) (-480 -512 0 ) (0 -512 0 ) (0 -512 304 ) +4 15 (0 -448 304 ) (0 -416 304 ) (-64 -416 304 ) (-64 -448 304 ) +4 15 (-32 -416 304 ) (-32 0 304 ) (-64 0 304 ) (-64 -416 304 ) +4 15 (0 -512 0 ) (-480 -512 0 ) (-480 0 0 ) (0 0 0 ) diff --git a/fakk/maps/example/beam.scr b/fakk/maps/example/beam.scr new file mode 100644 index 0000000..29a9b55 --- /dev/null +++ b/fakk/maps/example/beam.scr @@ -0,0 +1,3 @@ +waitforplayer +$blah lightstyle 20 +end diff --git a/fakk/maps/example/beam1.bsp b/fakk/maps/example/beam1.bsp new file mode 100644 index 0000000000000000000000000000000000000000..6a4cb28d61919f549e1c836cc02b767c5a8bbb9c GIT binary patch literal 69764 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 literal 0 HcmV?d00001 diff --git a/fakk/maps/example/beam1.map b/fakk/maps/example/beam1.map new file mode 100644 index 0000000..fb8dad5 --- /dev/null +++ b/fakk/maps/example/beam1.map @@ -0,0 +1,279 @@ +{ +"classname" "worldspawn" +// brush 0 +{ +( 224 192 0 ) ( 224 224 0 ) ( -480 224 0 ) eden/bedtrim -224 -32 90.00 1 1 0 0 0 +( -480 224 64 ) ( 224 224 64 ) ( 224 192 64 ) eden/bedtrim -224 -32 90.00 1 1 0 0 0 +( -480 224 256 ) ( -480 192 256 ) ( -480 192 0 ) eden/bedtrim -224 0 0.00 1 1 0 0 0 +( -480 192 256 ) ( 224 192 256 ) ( 224 192 0 ) common/skip 0 0 0.00 1 1 805306368 16512 0 +( 224 224 256 ) ( -480 224 256 ) ( -480 224 0 ) eden/bedtrim 224 0 -180.00 1 -1 0 0 0 +( -416 224 0 ) ( -416 192 0 ) ( -416 208 64 ) eden/bedtrim 224 0 -180.00 1 -1 0 0 0 +} +// brush 1 +{ +( 224 192 0 ) ( 224 224 0 ) ( -480 224 0 ) eden/bedtrim -224 -32 90.00 1 1 0 0 0 +( -480 224 64 ) ( 224 224 64 ) ( 224 192 64 ) eden/bedtrim -224 -32 90.00 1 1 0 0 0 +( -480 192 256 ) ( 224 192 256 ) ( 224 192 0 ) eden/bedtrim 224 0 -180.00 1 -1 0 0 0 +( 224 192 256 ) ( 224 224 256 ) ( 224 224 0 ) eden/bedtrim -224 0 0.00 1 1 0 0 0 +( 224 224 256 ) ( -480 224 256 ) ( -480 224 0 ) eden/bedtrim 224 0 -180.00 1 -1 0 0 0 +( -480 192 0 ) ( -480 224 0 ) ( -480 208 64 ) eden/bedtrim 224 0 -180.00 1 -1 0 0 0 +} +// brush 2 +{ +( 224 192 64 ) ( 224 224 64 ) ( -480 224 64 ) eden/edenmetalwall -224 -224 90.00 1 1 0 0 0 +( -480 224 320 ) ( 224 224 320 ) ( 224 192 320 ) eden/edenmetalwall -224 -224 90.00 1 1 0 0 0 +( -480 224 96 ) ( -480 192 96 ) ( -480 192 64 ) eden/edenmetalwall -224 64 0.00 1 1 0 0 0 +( -480 192 96 ) ( 224 192 96 ) ( 224 192 64 ) common/skip 0 0 0.00 1 1 805306368 16512 0 +( 224 224 96 ) ( -480 224 96 ) ( -480 224 64 ) eden/edenmetalwall 224 63 -180.00 1 -1 0 0 0 +( -416 224 64 ) ( -416 192 64 ) ( -416 208 320 ) eden/edenmetalwall 224 63 -180.00 1 -1 0 0 0 +} +// brush 3 +{ +( 224 192 64 ) ( 224 224 64 ) ( -480 224 64 ) eden/edenmetalwall -224 -224 90.00 1 1 0 0 0 +( -480 224 320 ) ( 224 224 320 ) ( 224 192 320 ) eden/edenmetalwall -224 -224 90.00 1 1 0 0 0 +( -480 192 96 ) ( 224 192 96 ) ( 224 192 64 ) eden/edenmetalwall 224 63 -180.00 1 -1 0 0 0 +( 224 192 96 ) ( 224 224 96 ) ( 224 224 64 ) eden/edenmetalwall -224 64 0.00 1 1 0 0 0 +( 224 224 96 ) ( -480 224 96 ) ( -480 224 64 ) eden/edenmetalwall 224 63 -180.00 1 -1 0 0 0 +( -480 192 64 ) ( -480 224 64 ) ( -480 208 320 ) eden/edenmetalwall 224 63 -180.00 1 -1 0 0 0 +} +// brush 4 + { + patchDef2 + { + eden/edenmetalwall + ( 3 3 0 536870912 0 ) +( +( ( -480 96 63.999992 0 0 ) ( -480 96 192 0 0.500000 ) ( -480 96 320 0 1 ) ) +( ( -384 96 63.999992 0.500000 0 ) ( -384 96 192 0.500000 0.500000 ) ( -384 96 320 0.500000 1 ) ) +( ( -384 192 63.999992 1 0 ) ( -384 192 192 1 0.500000 ) ( -384 192 320 1 1 ) ) +) + } + } +// brush 5 +{ +( -480 192 0 ) ( -512 192 0 ) ( -512 -512 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -512 -512 64 ) ( -512 192 64 ) ( -480 192 64 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -480 -512 256 ) ( -480 192 256 ) ( -480 192 0 ) common/skip 0 0 0.00 1 1 805306368 16512 0 +( -480 192 256 ) ( -512 192 256 ) ( -512 192 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -512 192 256 ) ( -512 -512 256 ) ( -512 -512 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -480 128 0 ) ( -512 128 0 ) ( -496 128 64 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +} +// brush 6 +{ +( -480 192 0 ) ( -512 192 0 ) ( -512 -512 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -512 -512 64 ) ( -512 192 64 ) ( -480 192 64 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -512 -512 256 ) ( -480 -512 256 ) ( -480 -512 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -480 -512 256 ) ( -480 192 256 ) ( -480 192 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -512 192 256 ) ( -512 -512 256 ) ( -512 -512 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -512 192 0 ) ( -480 192 0 ) ( -496 192 64 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +} +// brush 7 +{ +( -480 192 64 ) ( -512 192 64 ) ( -512 -512 64 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +( -512 -512 320 ) ( -512 192 320 ) ( -480 192 320 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +( -480 -512 96 ) ( -480 192 96 ) ( -480 192 64 ) common/skip 0 0 0.00 1 1 805306368 16512 0 +( -480 192 96 ) ( -512 192 96 ) ( -512 192 64 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +( -512 192 96 ) ( -512 -512 96 ) ( -512 -512 64 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +( -480 128 64 ) ( -512 128 64 ) ( -496 128 320 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +} +// brush 8 +{ +( -480 192 64 ) ( -512 192 64 ) ( -512 -512 64 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +( -512 -512 320 ) ( -512 192 320 ) ( -480 192 320 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +( -512 -512 96 ) ( -480 -512 96 ) ( -480 -512 64 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +( -480 -512 96 ) ( -480 192 96 ) ( -480 192 64 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +( -512 192 96 ) ( -512 -512 96 ) ( -512 -512 64 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +( -512 192 64 ) ( -480 192 64 ) ( -496 192 320 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +} +// brush 9 + { + patchDef2 + { + eden/bedtrim + ( 3 3 0 536870912 0 ) +( +( ( -480 96 0 0 0 ) ( -480 96 32 0 0.500000 ) ( -480 96 64 0 1 ) ) +( ( -384 96 0 0.500000 0 ) ( -384 96 32 0.500000 0.500000 ) ( -384 96 64 0.500000 1 ) ) +( ( -384 192 0 1 0 ) ( -384 192 32 1 0.500000 ) ( -384 192 64 1 1 ) ) +) + } + } +// brush 10 +{ +( 96 96 352 ) ( -32 96 352 ) ( -32 -416 352 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( -32 -416 416 ) ( -32 96 416 ) ( 96 96 416 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( -32 -416 416 ) ( 96 -416 416 ) ( 96 -416 352 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( 96 -416 416 ) ( 96 96 416 ) ( 96 96 352 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( 96 96 416 ) ( -32 96 416 ) ( -32 96 352 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( -32 96 416 ) ( -32 -416 416 ) ( -32 -416 352 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +} +// brush 11 +{ +( -64 -416 304 ) ( -64 -448 304 ) ( 128 -448 304 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( 128 -448 352 ) ( -64 -448 352 ) ( -64 -416 352 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( 96 -416 352 ) ( -32 -416 352 ) ( -32 -416 320 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( 128 -448 352 ) ( 96 -416 352 ) ( 96 -416 320 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( -64 -448 320 ) ( -64 -448 352 ) ( 128 -448 352 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( -64 -448 320 ) ( -32 -416 320 ) ( -32 -416 352 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +} +// brush 12 +{ +( -32 128 304 ) ( -64 128 304 ) ( -64 -64 304 ) eden/FL_edenhouse 0 32 90.00 1 1 0 0 0 +( -64 -64 352 ) ( -64 128 352 ) ( -32 128 352 ) eden/FL_edenhouse 0 32 90.00 1 1 0 0 0 +( -32 -32 352 ) ( -32 96 352 ) ( -32 96 320 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( -64 -448 352 ) ( -32 -416 352 ) ( -32 -416 320 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( -64 128 320 ) ( -64 128 352 ) ( -64 -64 352 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( -64 128 320 ) ( -32 96 320 ) ( -32 96 352 ) eden/FL_edenhouse -64 0 -180.00 1 -1 0 0 0 +} +// brush 13 +{ +( 128 -64 304 ) ( 128 128 304 ) ( 96 128 304 ) eden/FL_edenhouse 0 -96 90.00 1 1 0 0 0 +( 96 128 352 ) ( 128 128 352 ) ( 128 -64 352 ) eden/FL_edenhouse 0 -96 90.00 1 1 0 0 0 +( 96 96 320 ) ( 96 96 352 ) ( 96 -32 352 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( 96 -416 320 ) ( 96 -416 352 ) ( 128 -448 352 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( 128 -64 352 ) ( 128 128 352 ) ( 128 128 320 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( 96 96 352 ) ( 96 96 320 ) ( 128 128 320 ) eden/FL_edenhouse -64 0 -180.00 1 -1 0 0 0 +} +// brush 14 +{ +( 128 128 304 ) ( -64 128 304 ) ( -64 96 304 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( -64 96 352 ) ( -64 128 352 ) ( 128 128 352 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( -32 96 320 ) ( -32 96 352 ) ( 96 96 352 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( 96 96 320 ) ( 96 96 352 ) ( 128 128 352 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( 128 128 352 ) ( -64 128 352 ) ( -64 128 320 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( -32 96 352 ) ( -32 96 320 ) ( -64 128 320 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +} +// brush 15 +{ +( 128 192 320 ) ( -64 192 320 ) ( -64 128 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( -64 128 352 ) ( -64 192 352 ) ( 128 192 352 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( -64 128 352 ) ( 128 128 352 ) ( 128 128 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( 128 128 352 ) ( 128 192 352 ) ( 128 192 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( 128 192 352 ) ( -64 192 352 ) ( -64 192 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( -64 192 352 ) ( -64 128 352 ) ( -64 128 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +} +// brush 16 +{ +( 192 192 320 ) ( 128 192 320 ) ( 128 -448 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( 128 -448 352 ) ( 128 192 352 ) ( 192 192 352 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( 128 -448 352 ) ( 192 -448 352 ) ( 192 -448 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( 192 -448 352 ) ( 192 192 352 ) ( 192 192 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( 192 192 352 ) ( 128 192 352 ) ( 128 192 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( 128 192 352 ) ( 128 -448 352 ) ( 128 -448 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +} +// brush 17 +{ +( 192 192 320 ) ( -480 192 320 ) ( -480 -512 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( -480 -512 352 ) ( -480 192 352 ) ( 192 192 352 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( -480 -512 352 ) ( 192 -512 352 ) ( 192 -512 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( 192 -512 352 ) ( 192 192 352 ) ( 192 192 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( 224 -448 352 ) ( -448 -448 352 ) ( -448 -448 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( -64 -256 320 ) ( -64 -128 320 ) ( -64 -192 352 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +} +// brush 18 +{ +( 192 192 320 ) ( -480 192 320 ) ( -480 -512 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( -480 -512 352 ) ( -480 192 352 ) ( 192 192 352 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( -480 -512 352 ) ( 192 -512 352 ) ( 192 -512 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( 192 192 352 ) ( -480 192 352 ) ( -480 192 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( -480 192 352 ) ( -480 -512 352 ) ( -480 -512 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( -64 -128 320 ) ( -64 -256 320 ) ( -64 -192 352 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +} +// brush 19 +{ +( 192 192 -32 ) ( -480 192 -32 ) ( -480 -512 -32 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( -480 -512 0 ) ( -480 192 0 ) ( 192 192 0 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( -480 -512 224 ) ( 192 -512 224 ) ( 192 -512 -32 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 192 -512 224 ) ( 192 192 224 ) ( 192 192 -32 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 192 192 224 ) ( -480 192 224 ) ( -480 192 -32 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( -480 192 224 ) ( -480 -512 224 ) ( -480 -512 -32 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +} +// brush 20 +{ +( -480 -512 64 ) ( -480 -544 64 ) ( 224 -544 64 ) eden/edenmetalwall -31 31 -90.00 1 1 0 0 0 +( 224 -544 320 ) ( -480 -544 320 ) ( -480 -512 320 ) eden/edenmetalwall -31 31 -90.00 1 1 0 0 0 +( 224 -544 96 ) ( 224 -512 96 ) ( 224 -512 64 ) eden/edenmetalwall -32 63 -180.00 1 -1 0 0 0 +( 224 -512 96 ) ( -480 -512 96 ) ( -480 -512 64 ) eden/edenmetalwall -32 62 0.00 1.000008 1 0 0 0 +( -480 -512 96 ) ( -480 -544 96 ) ( -480 -544 64 ) eden/edenmetalwall -33 63 -180.00 1 -1 0 0 0 +( -480 -544 96 ) ( 224 -544 96 ) ( 224 -544 64 ) eden/edenmetalwall -32 62 0.00 1.000008 1 0 0 0 +} +// brush 21 +{ +( -480 -512 0 ) ( -480 -544 0 ) ( 224 -544 0 ) eden/bedtrim -31 32 -90.00 1 1 0 0 0 +( 224 -544 64 ) ( -480 -544 64 ) ( -480 -512 64 ) eden/bedtrim -31 32 -90.00 1 1 0 0 0 +( 224 -544 256 ) ( 224 -512 256 ) ( 224 -512 0 ) eden/bedtrim -32 0 -180.00 1 -1 0 0 0 +( 224 -512 256 ) ( -480 -512 256 ) ( -480 -512 0 ) eden/bedtrim -32 0 0.00 1 1 0 0 0 +( -480 -512 256 ) ( -480 -544 256 ) ( -480 -544 0 ) eden/bedtrim -33 0 -180.00 1 -1 0 0 0 +( -480 -544 256 ) ( 224 -544 256 ) ( 224 -544 0 ) eden/bedtrim -32 0 0.00 1 1 0 0 0 +} +// brush 22 +{ +( 192 -512 0 ) ( 224 -512 0 ) ( 224 192 0 ) eden/bedtrim 160 0 -180.00 1 1 0 0 0 +( 224 192 64 ) ( 224 -512 64 ) ( 192 -512 64 ) eden/bedtrim 160 0 -180.00 1 1 0 0 0 +( 224 192 256 ) ( 192 192 256 ) ( 192 192 0 ) eden/bedtrim 160 0 -180.00 1 -1 0 0 0 +( 192 192 256 ) ( 192 -512 256 ) ( 192 -512 0 ) eden/bedtrim -64 0 -180.00 1 -1 0 0 0 +( 192 -512 256 ) ( 224 -512 256 ) ( 224 -512 0 ) eden/bedtrim 159 0 -180.00 1 -1 0 0 0 +( 224 -512 256 ) ( 224 192 256 ) ( 224 192 0 ) eden/bedtrim -64 0 -180.00 1 -1 0 0 0 +} +// brush 23 +{ +( 192 -512 64 ) ( 224 -512 64 ) ( 224 192 64 ) eden/edenmetalwall 160 63 -180.00 1 1 0 0 0 +( 224 192 320 ) ( 224 -512 320 ) ( 192 -512 320 ) eden/edenmetalwall 160 63 -180.00 1 1 0 0 0 +( 224 192 96 ) ( 192 192 96 ) ( 192 192 64 ) eden/edenmetalwall 160 64 -180.00 1 -1 0 0 0 +( 192 192 96 ) ( 192 -512 96 ) ( 192 -512 64 ) eden/edenmetalwall -64 62 -180.00 1 -1 0 0 0 +( 192 -512 96 ) ( 224 -512 96 ) ( 224 -512 64 ) eden/edenmetalwall 159 64 -180.00 1 -1 0 0 0 +( 224 -512 96 ) ( 224 192 96 ) ( 224 192 64 ) eden/edenmetalwall -64 62 -180.00 1 -1 0 0 0 +} +} +// entity 1 +{ +"spawnflags" "1" +"angles" "0 0 0" +"classname" "func_beam" +"origin" "-128 -128 136" +"damage" "10" +"shootradius" "10" +} +// entity 2 +{ +"classname" "light" +"spawnflags" "0" +"origin" "-352 48 168" +"light" "200" +"_color" "1.000000 0.724409 0.523622" +} +// entity 3 +{ +"classname" "info_player_start" +"angle" "45" +"origin" "-432 -464 24" +} +// entity 4 +{ +"origin" "8 56 168" +"spawnflags" "0" +"classname" "light" +"light" "200" +"_color" "0.629921 0.846457 1.000000" +} +// entity 5 +{ +"origin" "-344 -376 168" +"spawnflags" "0" +"classname" "light" +"light" "200" +} +// entity 6 +{ +"classname" "light" +"spawnflags" "0" +"origin" "8 -380 168" +"light" "200" +} +// entity 7 +{ +"light" "200" +"classname" "light" +"spawnflags" "0" +"origin" "-168 -160 168" +} diff --git a/fakk/maps/example/beam1.prt b/fakk/maps/example/beam1.prt new file mode 100644 index 0000000..63b4d74 --- /dev/null +++ b/fakk/maps/example/beam1.prt @@ -0,0 +1,96 @@ +PRT1 +16 +28 +64 +4 0 4 0 (128 0 304 ) (192 0 304 ) (192 0 320 ) (128 0 320 ) +4 0 3 0 (128 192 304 ) (192 192 304 ) (192 0 304 ) (128 0 304 ) +4 0 1 0 (128 192 320 ) (128 192 304 ) (128 128 304 ) (128 128 320 ) +4 1 8 0 (0 192 320 ) (0 192 304 ) (0 128 304 ) (0 128 320 ) +4 1 3 0 (0 192 304 ) (128 192 304 ) (128 128 304 ) (0 128 304 ) +4 2 9 0 (0 0 304 ) (0 0 352 ) (0 96 352 ) (0 96 304 ) +4 2 5 0 (0 0 352 ) (0 0 304 ) (96 0 304 ) (96 0 352 ) +4 2 3 0 (96 0 304 ) (0 0 304 ) (0 96 304 ) (96 96 304 ) +4 3 11 0 (0 0 0 ) (0 0 304 ) (0 192 304 ) (0 192 0 ) +4 3 7 0 (0 0 304 ) (0 0 0 ) (192 0 0 ) (192 0 304 ) +4 4 7 0 (128 0 304 ) (192 0 304 ) (192 -448 304 ) (128 -448 304 ) +4 4 6 0 (128 -448 304 ) (192 -448 304 ) (192 -448 320 ) (128 -448 320 ) +4 5 12 0 (0 0 352 ) (0 0 304 ) (0 -416 304 ) (0 -416 352 ) +4 5 7 0 (0 0 304 ) (96 0 304 ) (96 -416 304 ) (0 -416 304 ) +4 6 13 0 (0 -512 304 ) (0 -512 320 ) (0 -448 320 ) (0 -448 304 ) +4 6 7 0 (192 -448 304 ) (192 -512 304 ) (0 -512 304 ) (0 -448 304 ) +4 7 15 0 (0 -512 0 ) (0 -512 304 ) (0 0 304 ) (0 0 0 ) +4 8 11 0 (-64 128 304 ) (-64 192 304 ) (0 192 304 ) (0 128 304 ) +4 8 10 0 (-64 192 320 ) (-64 192 304 ) (-64 128 304 ) (-64 128 320 ) +4 9 12 0 (0 0 304 ) (0 0 352 ) (-32 0 352 ) (-32 0 304 ) +4 9 11 0 (0 0 304 ) (-32 0 304 ) (-32 96 304 ) (0 96 304 ) +4 10 14 0 (-480 0 320 ) (-480 0 304 ) (-64 0 304 ) (-64 0 320 ) +4 10 11 0 (-64 0 304 ) (-480 0 304 ) (-480 192 304 ) (-64 192 304 ) +4 11 15 0 (0 0 0 ) (0 0 304 ) (-480 0 304 ) (-480 0 0 ) +4 12 15 0 (-32 0 304 ) (0 0 304 ) (0 -416 304 ) (-32 -416 304 ) +4 13 15 0 (0 -512 304 ) (-64 -512 304 ) (-64 -448 304 ) (0 -448 304 ) +4 13 14 0 (-64 -448 304 ) (-64 -512 304 ) (-64 -512 320 ) (-64 -448 320 ) +4 14 15 0 (-64 -512 304 ) (-480 -512 304 ) (-480 0 304 ) (-64 0 304 ) +4 0 (128 96 304 ) (128 0 304 ) (128 0 320 ) (128 96 320 ) +4 0 (128 128 304 ) (128 96 304 ) (128 96 320 ) (128 128 320 ) +4 0 (192 0 320 ) (192 0 304 ) (192 192 304 ) (192 192 320 ) +4 0 (128 192 320 ) (192 192 320 ) (192 192 304 ) (128 192 304 ) +4 0 (192 0 320 ) (192 192 320 ) (128 192 320 ) (128 0 320 ) +4 1 (0 128 304 ) (128 128 304 ) (128 128 320 ) (0 128 320 ) +4 1 (128 192 320 ) (128 192 304 ) (0 192 304 ) (0 192 320 ) +4 1 (128 192 320 ) (0 192 320 ) (0 128 320 ) (128 128 320 ) +4 2 (96 96 352 ) (0 96 352 ) (0 0 352 ) (96 0 352 ) +4 2 (0 96 352 ) (96 96 352 ) (96 96 304 ) (0 96 304 ) +4 2 (96 0 352 ) (96 0 304 ) (96 96 304 ) (96 96 352 ) +4 3 (192 192 304 ) (192 192 0 ) (0 192 0 ) (0 192 304 ) +4 3 (192 0 304 ) (192 0 0 ) (192 192 0 ) (192 192 304 ) +4 3 (0 128 304 ) (0 96 304 ) (128 96 304 ) (128 128 304 ) +4 3 (96 96 304 ) (96 0 304 ) (128 0 304 ) (128 96 304 ) +4 3 (0 192 0 ) (192 192 0 ) (192 0 0 ) (0 0 0 ) +4 4 (128 0 304 ) (128 -448 304 ) (128 -448 320 ) (128 0 320 ) +4 4 (192 -448 320 ) (192 -448 304 ) (192 0 304 ) (192 0 320 ) +4 4 (192 0 320 ) (128 0 320 ) (128 -448 320 ) (192 -448 320 ) +4 5 (96 -416 352 ) (96 0 352 ) (0 0 352 ) (0 -416 352 ) +4 5 (96 0 352 ) (96 -416 352 ) (96 -416 304 ) (96 0 304 ) +4 5 (0 -416 304 ) (96 -416 304 ) (96 -416 352 ) (0 -416 352 ) +4 6 (192 -448 320 ) (192 -512 320 ) (192 -512 304 ) (192 -448 304 ) +4 6 (0 -512 320 ) (0 -512 304 ) (192 -512 304 ) (192 -512 320 ) +4 6 (96 -448 320 ) (128 -448 320 ) (128 -448 304 ) (96 -448 304 ) +4 6 (96 -448 320 ) (96 -448 304 ) (0 -448 304 ) (0 -448 320 ) +4 6 (0 -512 320 ) (192 -512 320 ) (192 -448 320 ) (0 -448 320 ) +4 7 (0 -512 304 ) (0 -512 0 ) (192 -512 0 ) (192 -512 304 ) +4 7 (192 -512 304 ) (192 -512 0 ) (192 0 0 ) (192 0 304 ) +4 7 (96 -448 304 ) (128 -448 304 ) (128 0 304 ) (96 0 304 ) +4 7 (0 -416 304 ) (0 -448 304 ) (96 -448 304 ) (96 -416 304 ) +4 7 (0 0 0 ) (192 0 0 ) (192 -512 0 ) (0 -512 0 ) +4 8 (-64 128 320 ) (-64 128 304 ) (0 128 304 ) (0 128 320 ) +4 8 (-64 192 304 ) (-64 192 320 ) (0 192 320 ) (0 192 304 ) +4 8 (0 192 320 ) (-64 192 320 ) (-64 128 320 ) (0 128 320 ) +4 9 (0 96 352 ) (-32 96 352 ) (-32 0 352 ) (0 0 352 ) +4 9 (0 96 304 ) (-32 96 304 ) (-32 96 352 ) (0 96 352 ) +4 9 (-32 96 352 ) (-32 96 304 ) (-32 0 304 ) (-32 0 352 ) +4 10 (-480 192 320 ) (-480 192 304 ) (-480 0 304 ) (-480 0 320 ) +4 10 (-64 192 320 ) (-64 192 304 ) (-480 192 304 ) (-480 192 320 ) +4 10 (-64 128 320 ) (-64 96 320 ) (-64 96 304 ) (-64 128 304 ) +4 10 (-64 96 320 ) (-64 0 320 ) (-64 0 304 ) (-64 96 304 ) +4 10 (-64 0 320 ) (-64 192 320 ) (-480 192 320 ) (-480 0 320 ) +4 11 (-480 192 0 ) (-480 192 304 ) (0 192 304 ) (0 192 0 ) +4 11 (-480 192 304 ) (-480 192 0 ) (-480 0 0 ) (-480 0 304 ) +4 11 (0 96 304 ) (0 128 304 ) (-64 128 304 ) (-64 96 304 ) +4 11 (-32 96 304 ) (-64 96 304 ) (-64 0 304 ) (-32 0 304 ) +4 11 (0 0 0 ) (-480 0 0 ) (-480 192 0 ) (0 192 0 ) +4 12 (0 -416 352 ) (-32 -416 352 ) (-32 -416 304 ) (0 -416 304 ) +4 12 (-32 -416 352 ) (0 -416 352 ) (0 0 352 ) (-32 0 352 ) +4 12 (-32 0 304 ) (-32 -416 304 ) (-32 -416 352 ) (-32 0 352 ) +4 13 (-64 -512 304 ) (0 -512 304 ) (0 -512 320 ) (-64 -512 320 ) +4 13 (0 -448 320 ) (0 -448 304 ) (-64 -448 304 ) (-64 -448 320 ) +4 13 (0 -448 320 ) (-64 -448 320 ) (-64 -512 320 ) (0 -512 320 ) +4 14 (-480 -512 320 ) (-480 -512 304 ) (-64 -512 304 ) (-64 -512 320 ) +4 14 (-480 0 320 ) (-480 0 304 ) (-480 -512 304 ) (-480 -512 320 ) +4 14 (-64 -416 320 ) (-64 -448 320 ) (-64 -448 304 ) (-64 -416 304 ) +4 14 (-64 -416 320 ) (-64 -416 304 ) (-64 0 304 ) (-64 0 320 ) +4 14 (-480 0 320 ) (-480 -512 320 ) (-64 -512 320 ) (-64 0 320 ) +4 15 (-480 0 304 ) (-480 0 0 ) (-480 -512 0 ) (-480 -512 304 ) +4 15 (-480 -512 304 ) (-480 -512 0 ) (0 -512 0 ) (0 -512 304 ) +4 15 (0 -448 304 ) (0 -416 304 ) (-64 -416 304 ) (-64 -448 304 ) +4 15 (-32 -416 304 ) (-32 0 304 ) (-64 0 304 ) (-64 -416 304 ) +4 15 (0 -512 0 ) (-480 -512 0 ) (-480 0 0 ) (0 0 0 ) diff --git a/fakk/maps/example/box3.bsp b/fakk/maps/example/box3.bsp new file mode 100644 index 0000000000000000000000000000000000000000..e0937eb792076ff4e4e53909189f5f0bef47da51 GIT binary patch literal 69920 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 literal 0 HcmV?d00001 diff --git a/fakk/maps/example/box3.map b/fakk/maps/example/box3.map new file mode 100644 index 0000000..646545b --- /dev/null +++ b/fakk/maps/example/box3.map @@ -0,0 +1,298 @@ +{ +"classname" "worldspawn" +// brush 0 +{ +( 384 320 0 ) ( 384 352 0 ) ( -320 352 0 ) eden/bedtrim -96 0 90.00 1 1 0 0 0 +( -320 352 64 ) ( 384 352 64 ) ( 384 320 64 ) eden/bedtrim -96 0 90.00 1 1 0 0 0 +( -320 352 256 ) ( -320 320 256 ) ( -320 320 0 ) eden/bedtrim -96 0 0.00 1 1 0 0 0 +( -320 320 256 ) ( 384 320 256 ) ( 384 320 0 ) common/skip -32 0 0.00 1 1 805306368 16512 0 +( 384 352 256 ) ( -320 352 256 ) ( -320 352 0 ) eden/bedtrim 128 0 -180.00 1 -1 0 0 0 +( -256 352 0 ) ( -256 320 0 ) ( -256 336 64 ) eden/bedtrim 96 0 -180.00 1 -1 0 0 0 +} +// brush 1 +{ +( 384 320 0 ) ( 384 352 0 ) ( -320 352 0 ) eden/bedtrim -96 0 90.00 1 1 0 0 0 +( -320 352 64 ) ( 384 352 64 ) ( 384 320 64 ) eden/bedtrim -96 0 90.00 1 1 0 0 0 +( -320 320 256 ) ( 384 320 256 ) ( 384 320 0 ) eden/bedtrim 128 0 -180.00 1 -1 0 0 0 +( 384 320 256 ) ( 384 352 256 ) ( 384 352 0 ) eden/bedtrim -96 0 0.00 1 1 0 0 0 +( 384 352 256 ) ( -320 352 256 ) ( -320 352 0 ) eden/bedtrim 128 0 -180.00 1 -1 0 0 0 +( -320 320 0 ) ( -320 352 0 ) ( -320 336 64 ) eden/bedtrim 96 0 -180.00 1 -1 0 0 0 +} +// brush 2 +{ +( 384 320 64 ) ( 384 352 64 ) ( -320 352 64 ) eden/edenmetalwall -96 -128 90.00 1 1 0 0 0 +( -320 352 320 ) ( 384 352 320 ) ( 384 320 320 ) eden/edenmetalwall -96 -128 90.00 1 1 0 0 0 +( -320 352 96 ) ( -320 320 96 ) ( -320 320 64 ) eden/edenmetalwall -96 64 0.00 1 1 0 0 0 +( -320 320 96 ) ( 384 320 96 ) ( 384 320 64 ) common/skip -32 0 0.00 1 1 805306368 16512 0 +( 384 352 96 ) ( -320 352 96 ) ( -320 352 64 ) eden/edenmetalwall 128 63 -180.00 1 -1 0 0 0 +( -256 352 64 ) ( -256 320 64 ) ( -256 336 320 ) eden/edenmetalwall 96 63 -180.00 1 -1 0 0 0 +} +// brush 3 +{ +( 384 320 64 ) ( 384 352 64 ) ( -320 352 64 ) eden/edenmetalwall -96 -128 90.00 1 1 0 0 0 +( -320 352 320 ) ( 384 352 320 ) ( 384 320 320 ) eden/edenmetalwall -96 -128 90.00 1 1 0 0 0 +( -320 320 96 ) ( 384 320 96 ) ( 384 320 64 ) eden/edenmetalwall 128 63 -180.00 1 -1 0 0 0 +( 384 320 96 ) ( 384 352 96 ) ( 384 352 64 ) eden/edenmetalwall -96 64 0.00 1 1 0 0 0 +( 384 352 96 ) ( -320 352 96 ) ( -320 352 64 ) eden/edenmetalwall 128 63 -180.00 1 -1 0 0 0 +( -320 320 64 ) ( -320 352 64 ) ( -320 336 320 ) eden/edenmetalwall 96 63 -180.00 1 -1 0 0 0 +} +// brush 4 + { + patchDef2 + { + eden/edenmetalwall + ( 3 3 0 536870912 0 ) +( +( ( -320 224 63.999992 0 0 ) ( -320 224 192 0 0.500000 ) ( -320 224 320 0 1 ) ) +( ( -224 224 63.999992 0.500000 0 ) ( -224 224 192 0.500000 0.500000 ) ( -224 224 320 0.500000 1 ) ) +( ( -224 320 63.999992 1 0 ) ( -224 320 192 1 0.500000 ) ( -224 320 320 1 1 ) ) +) + } + } +// brush 5 +{ +( -320 320 0 ) ( -352 320 0 ) ( -352 -384 0 ) eden/bedtrim -160 0 0.00 1 1 0 0 0 +( -352 -384 64 ) ( -352 320 64 ) ( -320 320 64 ) eden/bedtrim -160 0 0.00 1 1 0 0 0 +( -320 -384 256 ) ( -320 320 256 ) ( -320 320 0 ) common/skip 0 0 0.00 1 1 805306368 16512 0 +( -320 320 256 ) ( -352 320 256 ) ( -352 320 0 ) eden/bedtrim -160 0 0.00 1 1 0 0 0 +( -352 320 256 ) ( -352 -384 256 ) ( -352 -384 0 ) eden/bedtrim -128 0 0.00 1 1 0 0 0 +( -320 256 0 ) ( -352 256 0 ) ( -336 256 64 ) eden/bedtrim -160 0 0.00 1 1 0 0 0 +} +// brush 6 +{ +( -320 320 0 ) ( -352 320 0 ) ( -352 -384 0 ) eden/bedtrim -160 0 0.00 1 1 0 0 0 +( -352 -384 64 ) ( -352 320 64 ) ( -320 320 64 ) eden/bedtrim -160 0 0.00 1 1 0 0 0 +( -352 -384 256 ) ( -320 -384 256 ) ( -320 -384 0 ) eden/bedtrim -160 0 0.00 1 1 0 0 0 +( -320 -384 256 ) ( -320 320 256 ) ( -320 320 0 ) eden/bedtrim -128 0 0.00 1 1 0 0 0 +( -352 320 256 ) ( -352 -384 256 ) ( -352 -384 0 ) eden/bedtrim -128 0 0.00 1 1 0 0 0 +( -352 320 0 ) ( -320 320 0 ) ( -336 320 64 ) eden/bedtrim -160 0 0.00 1 1 0 0 0 +} +// brush 7 +{ +( -320 320 64 ) ( -352 320 64 ) ( -352 -384 64 ) eden/edenmetalwall -160 128 0.00 1 1 0 0 0 +( -352 -384 320 ) ( -352 320 320 ) ( -320 320 320 ) eden/edenmetalwall -160 128 0.00 1 1 0 0 0 +( -320 -384 96 ) ( -320 320 96 ) ( -320 320 64 ) common/skip 0 0 0.00 1 1 805306368 16512 0 +( -320 320 96 ) ( -352 320 96 ) ( -352 320 64 ) eden/edenmetalwall -160 64 0.00 1 1 0 0 0 +( -352 320 96 ) ( -352 -384 96 ) ( -352 -384 64 ) eden/edenmetalwall -128 64 0.00 1 1 0 0 0 +( -320 256 64 ) ( -352 256 64 ) ( -336 256 320 ) eden/edenmetalwall -160 64 0.00 1 1 0 0 0 +} +// brush 8 +{ +( -320 320 64 ) ( -352 320 64 ) ( -352 -384 64 ) eden/edenmetalwall -160 128 0.00 1 1 0 0 0 +( -352 -384 320 ) ( -352 320 320 ) ( -320 320 320 ) eden/edenmetalwall -160 128 0.00 1 1 0 0 0 +( -352 -384 96 ) ( -320 -384 96 ) ( -320 -384 64 ) eden/edenmetalwall -160 64 0.00 1 1 0 0 0 +( -320 -384 96 ) ( -320 320 96 ) ( -320 320 64 ) eden/edenmetalwall -128 64 0.00 1 1 0 0 0 +( -352 320 96 ) ( -352 -384 96 ) ( -352 -384 64 ) eden/edenmetalwall -128 64 0.00 1 1 0 0 0 +( -352 320 64 ) ( -320 320 64 ) ( -336 320 320 ) eden/edenmetalwall -160 64 0.00 1 1 0 0 0 +} +// brush 9 + { + patchDef2 + { + eden/bedtrim + ( 3 3 0 536870912 0 ) +( +( ( -320 224 0 0 0 ) ( -320 224 32 0 0.500000 ) ( -320 224 64 0 1 ) ) +( ( -224 224 0 0.500000 0 ) ( -224 224 32 0.500000 0.500000 ) ( -224 224 64 0.500000 1 ) ) +( ( -224 320 0 1 0 ) ( -224 320 32 1 0.500000 ) ( -224 320 64 1 1 ) ) +) + } + } +// brush 10 +{ +( 256 224 352 ) ( 128 224 352 ) ( 128 -288 352 ) we_cemetary_test/levelord_sky -160 128 0.00 1 1 0 1044 0 +( 128 -288 416 ) ( 128 224 416 ) ( 256 224 416 ) we_cemetary_test/levelord_sky -160 128 0.00 1 1 0 1044 0 +( 128 -288 416 ) ( 256 -288 416 ) ( 256 -288 352 ) we_cemetary_test/levelord_sky -160 0 0.00 1 1 0 1044 0 +( 256 -288 416 ) ( 256 224 416 ) ( 256 224 352 ) we_cemetary_test/levelord_sky -128 0 0.00 1 1 0 1044 0 +( 256 224 416 ) ( 128 224 416 ) ( 128 224 352 ) we_cemetary_test/levelord_sky -160 0 0.00 1 1 0 1044 0 +( 128 224 416 ) ( 128 -288 416 ) ( 128 -288 352 ) we_cemetary_test/levelord_sky -128 0 0.00 1 1 0 1044 0 +} +// brush 11 +{ +( 96 -288 304 ) ( 96 -320 304 ) ( 288 -320 304 ) eden/FL_edenhouse -32 0 0.00 1 1 0 0 0 +( 288 -320 352 ) ( 96 -320 352 ) ( 96 -288 352 ) eden/FL_edenhouse -32 0 0.00 1 1 0 0 0 +( 256 -288 352 ) ( 128 -288 352 ) ( 128 -288 320 ) eden/FL_edenhouse -32 0 0.00 1 1 0 0 0 +( 288 -320 352 ) ( 256 -288 352 ) ( 256 -288 320 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( 96 -320 320 ) ( 96 -320 352 ) ( 288 -320 352 ) eden/FL_edenhouse -32 0 0.00 1 1 0 0 0 +( 96 -320 320 ) ( 128 -288 320 ) ( 128 -288 352 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +} +// brush 12 +{ +( 128 256 304 ) ( 96 256 304 ) ( 96 64 304 ) eden/FL_edenhouse 0 0 90.00 1 1 0 0 0 +( 96 64 352 ) ( 96 256 352 ) ( 128 256 352 ) eden/FL_edenhouse 0 0 90.00 1 1 0 0 0 +( 128 96 352 ) ( 128 224 352 ) ( 128 224 320 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( 96 -320 352 ) ( 128 -288 352 ) ( 128 -288 320 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( 96 256 320 ) ( 96 256 352 ) ( 96 64 352 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( 96 256 320 ) ( 128 224 320 ) ( 128 224 352 ) eden/FL_edenhouse 64 0 -180.00 1 -1 0 0 0 +} +// brush 13 +{ +( 288 64 304 ) ( 288 256 304 ) ( 256 256 304 ) eden/FL_edenhouse 0 0 90.00 1 1 0 0 0 +( 256 256 352 ) ( 288 256 352 ) ( 288 64 352 ) eden/FL_edenhouse 0 0 90.00 1 1 0 0 0 +( 256 224 320 ) ( 256 224 352 ) ( 256 96 352 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( 256 -288 320 ) ( 256 -288 352 ) ( 288 -320 352 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( 288 64 352 ) ( 288 256 352 ) ( 288 256 320 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( 256 224 352 ) ( 256 224 320 ) ( 288 256 320 ) eden/FL_edenhouse 64 0 -180.00 1 -1 0 0 0 +} +// brush 14 +{ +( 288 256 304 ) ( 96 256 304 ) ( 96 224 304 ) eden/FL_edenhouse -32 0 0.00 1 1 0 0 0 +( 96 224 352 ) ( 96 256 352 ) ( 288 256 352 ) eden/FL_edenhouse -32 0 0.00 1 1 0 0 0 +( 128 224 320 ) ( 128 224 352 ) ( 256 224 352 ) eden/FL_edenhouse -32 0 0.00 1 1 0 0 0 +( 256 224 320 ) ( 256 224 352 ) ( 288 256 352 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( 288 256 352 ) ( 96 256 352 ) ( 96 256 320 ) eden/FL_edenhouse -32 0 0.00 1 1 0 0 0 +( 128 224 352 ) ( 128 224 320 ) ( 96 256 320 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +} +// brush 15 +{ +( 288 320 320 ) ( 96 320 320 ) ( 96 256 320 ) eden/CL_edenroof3 -32 0 0.00 1 1 0 0 0 +( 96 256 352 ) ( 96 320 352 ) ( 288 320 352 ) eden/CL_edenroof3 -32 0 0.00 1 1 0 0 0 +( 96 256 352 ) ( 288 256 352 ) ( 288 256 320 ) eden/CL_edenroof3 -32 0 0.00 1 1 0 0 0 +( 288 256 352 ) ( 288 320 352 ) ( 288 320 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( 288 320 352 ) ( 96 320 352 ) ( 96 320 320 ) eden/CL_edenroof3 -32 0 0.00 1 1 0 0 0 +( 96 320 352 ) ( 96 256 352 ) ( 96 256 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +} +// brush 16 +{ +( 352 320 320 ) ( 288 320 320 ) ( 288 -320 320 ) eden/CL_edenroof3 -32 0 0.00 1 1 0 0 0 +( 288 -320 352 ) ( 288 320 352 ) ( 352 320 352 ) eden/CL_edenroof3 -32 0 0.00 1 1 0 0 0 +( 288 -320 352 ) ( 352 -320 352 ) ( 352 -320 320 ) eden/CL_edenroof3 -32 0 0.00 1 1 0 0 0 +( 352 -320 352 ) ( 352 320 352 ) ( 352 320 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( 352 320 352 ) ( 288 320 352 ) ( 288 320 320 ) eden/CL_edenroof3 -32 0 0.00 1 1 0 0 0 +( 288 320 352 ) ( 288 -320 352 ) ( 288 -320 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +} +// brush 17 +{ +( 352 320 320 ) ( -320 320 320 ) ( -320 -384 320 ) eden/CL_edenroof3 -32 0 0.00 1 1 0 0 0 +( -320 -384 352 ) ( -320 320 352 ) ( 352 320 352 ) eden/CL_edenroof3 -32 0 0.00 1 1 0 0 0 +( -320 -384 352 ) ( 352 -384 352 ) ( 352 -384 320 ) eden/CL_edenroof3 -32 0 0.00 1 1 0 0 0 +( 352 -384 352 ) ( 352 320 352 ) ( 352 320 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( 384 -320 352 ) ( -288 -320 352 ) ( -288 -320 320 ) eden/CL_edenroof3 -32 0 0.00 1 1 0 0 0 +( 96 -128 320 ) ( 96 0 320 ) ( 96 -64 352 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +} +// brush 18 +{ +( 352 320 320 ) ( -320 320 320 ) ( -320 -384 320 ) eden/CL_edenroof3 -32 0 0.00 1 1 0 0 0 +( -320 -384 352 ) ( -320 320 352 ) ( 352 320 352 ) eden/CL_edenroof3 -32 0 0.00 1 1 0 0 0 +( -320 -384 352 ) ( 352 -384 352 ) ( 352 -384 320 ) eden/CL_edenroof3 -32 0 0.00 1 1 0 0 0 +( 352 320 352 ) ( -320 320 352 ) ( -320 320 320 ) eden/CL_edenroof3 -32 0 0.00 1 1 0 0 0 +( -320 320 352 ) ( -320 -384 352 ) ( -320 -384 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( 96 0 320 ) ( 96 -128 320 ) ( 96 -64 352 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +} +// brush 19 +{ +( 352 320 -32 ) ( -320 320 -32 ) ( -320 -384 -32 ) eden/FL_edenhouse3 -32 0 0.00 1 1 0 0 0 +( -320 -384 0 ) ( -320 320 0 ) ( 352 320 0 ) eden/FL_edenhouse3 -32 0 0.00 1 1 0 0 0 +( -320 -384 224 ) ( 352 -384 224 ) ( 352 -384 -32 ) eden/FL_edenhouse3 -32 0 0.00 1 1 0 0 0 +( 352 -384 224 ) ( 352 320 224 ) ( 352 320 -32 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 352 320 224 ) ( -320 320 224 ) ( -320 320 -32 ) eden/FL_edenhouse3 -32 0 0.00 1 1 0 0 0 +( -320 320 224 ) ( -320 -384 224 ) ( -320 -384 -32 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +} +// brush 20 +{ +( -320 -384 64 ) ( -320 -416 64 ) ( 384 -416 64 ) eden/edenmetalwall 97 190 -90.00 1 1 0 0 0 +( 384 -416 320 ) ( -320 -416 320 ) ( -320 -384 320 ) eden/edenmetalwall 97 190 -90.00 1 1 0 0 0 +( 384 -416 96 ) ( 384 -384 96 ) ( 384 -384 64 ) eden/edenmetalwall 96 63 -180.00 1 -1 0 0 0 +( 384 -384 96 ) ( -320 -384 96 ) ( -320 -384 64 ) eden/edenmetalwall -191 62 0.00 1.000008 1 0 0 0 +( -320 -384 96 ) ( -320 -416 96 ) ( -320 -416 64 ) eden/edenmetalwall 95 63 -180.00 1 -1 0 0 0 +( -320 -416 96 ) ( 384 -416 96 ) ( 384 -416 64 ) eden/edenmetalwall -191 62 0.00 1.000008 1 0 0 0 +} +// brush 21 +{ +( -320 -384 0 ) ( -320 -416 0 ) ( 384 -416 0 ) eden/bedtrim 97 63 -90.00 1 1 0 0 0 +( 384 -416 64 ) ( -320 -416 64 ) ( -320 -384 64 ) eden/bedtrim 97 63 -90.00 1 1 0 0 0 +( 384 -416 256 ) ( 384 -384 256 ) ( 384 -384 0 ) eden/bedtrim 96 0 -180.00 1 -1 0 0 0 +( 384 -384 256 ) ( -320 -384 256 ) ( -320 -384 0 ) eden/bedtrim -192 0 0.00 1 1 0 0 0 +( -320 -384 256 ) ( -320 -416 256 ) ( -320 -416 0 ) eden/bedtrim 95 0 -180.00 1 -1 0 0 0 +( -320 -416 256 ) ( 384 -416 256 ) ( 384 -416 0 ) eden/bedtrim -192 0 0.00 1 1 0 0 0 +} +// brush 22 +{ +( 352 -384 0 ) ( 384 -384 0 ) ( 384 320 0 ) eden/bedtrim 64 0 -180.00 1 1 0 0 0 +( 384 320 64 ) ( 384 -384 64 ) ( 352 -384 64 ) eden/bedtrim 64 0 -180.00 1 1 0 0 0 +( 384 320 256 ) ( 352 320 256 ) ( 352 320 0 ) eden/bedtrim 64 0 -180.00 1 -1 0 0 0 +( 352 320 256 ) ( 352 -384 256 ) ( 352 -384 0 ) eden/bedtrim 64 0 -180.00 1 -1 0 0 0 +( 352 -384 256 ) ( 384 -384 256 ) ( 384 -384 0 ) eden/bedtrim 63 0 -180.00 1 -1 0 0 0 +( 384 -384 256 ) ( 384 320 256 ) ( 384 320 0 ) eden/bedtrim 64 0 -180.00 1 -1 0 0 0 +} +// brush 23 +{ +( 352 -384 64 ) ( 384 -384 64 ) ( 384 320 64 ) eden/edenmetalwall 64 -65 -180.00 1 1 0 0 0 +( 384 320 320 ) ( 384 -384 320 ) ( 352 -384 320 ) eden/edenmetalwall 64 -65 -180.00 1 1 0 0 0 +( 384 320 96 ) ( 352 320 96 ) ( 352 320 64 ) eden/edenmetalwall 64 64 -180.00 1 -1 0 0 0 +( 352 320 96 ) ( 352 -384 96 ) ( 352 -384 64 ) eden/edenmetalwall 64 62 -180.00 1 -1 0 0 0 +( 352 -384 96 ) ( 384 -384 96 ) ( 384 -384 64 ) eden/edenmetalwall 63 64 -180.00 1 -1 0 0 0 +( 384 -384 96 ) ( 384 320 96 ) ( 384 320 64 ) eden/edenmetalwall 64 62 -180.00 1 -1 0 0 0 +} +} +// entity 1 +{ +"classname" "script_object" +"targetname" "movinlight2" +// brush 0 +{ +( 176 -240 144 ) ( 160 -240 144 ) ( 160 -256 144 ) common/skip 0 16 0.00 1 1 805306368 16512 0 +( 160 -256 160 ) ( 160 -240 160 ) ( 176 -240 160 ) common/skip 0 16 0.00 1 1 805306368 16512 0 +( 160 -256 240 ) ( 176 -256 240 ) ( 176 -256 144 ) common/skip 0 -48 0.00 1 1 805306368 16512 0 +( 176 -256 240 ) ( 176 -240 240 ) ( 176 -240 144 ) common/skip -16 -48 0.00 1 1 805306368 16512 0 +( 176 -240 240 ) ( 160 -240 240 ) ( 160 -240 144 ) common/skip 0 -48 0.00 1 1 805306368 16512 0 +( 160 -240 240 ) ( 160 -256 240 ) ( 160 -256 144 ) common/skip -16 -48 0.00 1 1 805306368 16512 0 +} +} +// entity 2 +{ +"classname" "script_object" +"targetname" "movinlight1" +// brush 0 +{ +( -184 192 144 ) ( -200 192 144 ) ( -200 176 144 ) common/skip -32 0 0.00 1 1 805306368 16512 0 +( -200 176 160 ) ( -200 192 160 ) ( -184 192 160 ) common/skip -32 0 0.00 1 1 805306368 16512 0 +( -200 176 240 ) ( -184 176 240 ) ( -184 176 144 ) common/skip -32 -48 0.00 1 1 805306368 16512 0 +( -184 176 240 ) ( -184 192 240 ) ( -184 192 144 ) common/skip 0 -48 0.00 1 1 805306368 16512 0 +( -184 192 240 ) ( -200 192 240 ) ( -200 192 144 ) common/skip -32 -48 0.00 1 1 805306368 16512 0 +( -200 192 240 ) ( -200 176 240 ) ( -200 176 144 ) common/skip 0 -48 0.00 1 1 805306368 16512 0 +} +} +// entity 3 +{ +"_color" "1.000000 0.724409 0.523622" +"light" "200" +"origin" "-192 184 168" +"spawnflags" "0" +"classname" "light" +} +// entity 4 +{ +"origin" "-272 -336 24" +"angle" "45" +"classname" "info_player_start" +} +// entity 5 +{ +"_color" "0.629921 0.846457 1.000000" +"light" "200" +"classname" "light" +"spawnflags" "0" +"origin" "168 184 168" +} +// entity 6 +{ +"light" "200" +"classname" "light" +"spawnflags" "0" +"origin" "-184 -248 168" +} +// entity 7 +{ +"light" "200" +"origin" "168 -248 168" +"spawnflags" "0" +"classname" "light" +} +// entity 8 +{ +"origin" "-8 -32 168" +"spawnflags" "0" +"classname" "light" +"light" "200" +} diff --git a/fakk/maps/example/climb.bsp b/fakk/maps/example/climb.bsp new file mode 100644 index 0000000000000000000000000000000000000000..a9609d438f1558b49c223a8971a9b5be76917065 GIT binary patch literal 60372 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 literal 0 HcmV?d00001 diff --git a/fakk/maps/example/climb.map b/fakk/maps/example/climb.map new file mode 100644 index 0000000..5bda77c --- /dev/null +++ b/fakk/maps/example/climb.map @@ -0,0 +1,145 @@ +{ +"classname" "worldspawn" +// brush 0 +{ +( 264 -272 8 ) ( 264 264 8 ) ( 264 264 0 ) eden/WL_edenhouse 0 0 0.00 1 1 0 0 0 +( 264 264 8 ) ( -264 264 8 ) ( -264 264 0 ) eden/WL_edenhouse 0 0 0.00 1 1 0 0 0 +( -264 256 8 ) ( 264 256 8 ) ( -264 256 0 ) eden/WL_edenhouse 0 0 0.00 1 1 0 0 0 +( -128 256 384 ) ( -128 272 384 ) ( 120 272 384 ) eden/WL_edenhouse 0 0 0.00 1 1 0 0 0 +( -128 264 256 ) ( -224 264 256 ) ( -224 256 256 ) eden/WL_edenhouse 0 0 0.00 1 1 0 0 0 +( 256 264 384 ) ( 256 256 384 ) ( 256 264 0 ) eden/WL_edenhouse 0 0 0.00 1 1 0 0 0 +} +// brush 1 +{ +( 264 -272 8 ) ( 264 264 8 ) ( 264 264 0 ) eden/WL_edenhouse 0 0 0.00 1 1 0 0 0 +( 264 264 8 ) ( -264 264 8 ) ( -264 264 0 ) eden/WL_edenhouse 0 0 0.00 1 1 0 0 0 +( -264 256 8 ) ( 264 256 8 ) ( -264 256 0 ) eden/WL_edenhouse 0 0 0.00 1 1 0 0 0 +( 120 272 0 ) ( -128 272 0 ) ( -128 256 0 ) eden/WL_edenhouse 0 0 0.00 1 1 0 0 0 +( 128 272 8 ) ( 128 256 8 ) ( 128 272 0 ) eden/WL_edenhouse 0 0 0.00 1 1 0 0 0 +( -224 264 256 ) ( -128 264 256 ) ( -224 256 256 ) eden/WL_edenhouse 0 0 0.00 1 1 0 0 0 +} +// brush 2 +{ +( 264 264 8 ) ( -264 264 8 ) ( -264 264 0 ) eden/WL_edenhouse 0 0 0.00 1 1 0 0 0 +( -264 264 8 ) ( -264 -272 8 ) ( -264 -272 0 ) eden/WL_edenhouse 0 0 0.00 1 1 0 0 0 +( -264 256 8 ) ( 264 256 8 ) ( -264 256 0 ) eden/WL_edenhouse 0 0 0.00 1 1 0 0 0 +( -128 256 384 ) ( -128 272 384 ) ( 120 272 384 ) eden/WL_edenhouse 0 0 0.00 1 1 0 0 0 +( -128 264 256 ) ( -224 264 256 ) ( -224 256 256 ) eden/WL_edenhouse 0 0 0.00 1 1 0 0 0 +( -256 256 384 ) ( -256 264 384 ) ( -256 256 0 ) eden/WL_edenhouse 0 0 0.00 1 1 0 0 0 +} +// brush 3 +{ +( 264 264 8 ) ( -264 264 8 ) ( -264 264 0 ) eden/WL_edenhouse 0 0 0.00 1 1 0 0 0 +( -264 264 8 ) ( -264 -272 8 ) ( -264 -272 0 ) eden/WL_edenhouse 0 0 0.00 1 1 0 0 0 +( -264 256 8 ) ( 264 256 8 ) ( -264 256 0 ) eden/WL_edenhouse 0 0 0.00 1 1 0 0 0 +( 120 272 0 ) ( -128 272 0 ) ( -128 256 0 ) eden/WL_edenhouse 0 0 0.00 1 1 0 0 0 +( -128 256 8 ) ( -128 272 8 ) ( -128 256 0 ) eden/WL_edenhouse 0 0 0.00 1 1 0 0 0 +( -224 264 256 ) ( -128 264 256 ) ( -224 256 256 ) eden/WL_edenhouse 0 0 0.00 1 1 0 0 0 +} +// brush 4 +{ +( 120 272 0 ) ( -128 272 0 ) ( -128 256 0 ) swamps/CL_new_canopy5b 0 0 0.00 1 1 0 0 0 +surfaceparm ladder +( -128 256 8 ) ( 120 256 8 ) ( 120 256 0 ) swamps/CL_new_canopy5b 0 0 0.00 1 1 0 0 0 +surfaceparm ladder +( 128 256 8 ) ( 128 272 8 ) ( 128 272 0 ) swamps/CL_new_canopy5b 0 0 0.00 1 1 0 0 0 +surfaceparm ladder +( 120 264 8 ) ( -128 264 8 ) ( -128 264 0 ) swamps/CL_new_canopy5b 0 0 0.00 1 1 0 0 0 +surfaceparm ladder +( -128 272 8 ) ( -128 256 8 ) ( -128 256 0 ) swamps/CL_new_canopy5b 0 0 0.00 1 1 0 0 0 +surfaceparm ladder +( -224 264 256 ) ( -128 264 256 ) ( -224 256 256 ) swamps/CL_new_canopy5b 0 0 0.00 1 1 0 0 0 +surfaceparm ladder +} +// brush 5 +{ +( -128 264 256 ) ( -224 264 256 ) ( -224 256 256 ) swamps/CL_new_canopy5b 0 0 0.00 1 1 0 0 0 +surfaceparm ladder +( -224 256 384 ) ( -224 264 384 ) ( -128 264 384 ) swamps/CL_new_canopy5b 0 0 0.00 1 1 0 0 0 +surfaceparm ladder +( -224 256 384 ) ( -128 256 384 ) ( -128 256 0 ) swamps/CL_new_canopy5b 0 0 0.00 1 1 0 0 0 +surfaceparm ladder +( 256 256 384 ) ( 256 264 384 ) ( 256 264 0 ) swamps/CL_new_canopy5b 0 0 0.00 1 1 0 0 0 +surfaceparm ladder +( -128 264 384 ) ( -224 264 384 ) ( -224 264 0 ) swamps/CL_new_canopy5b 0 0 0.00 1 1 0 0 0 +surfaceparm ladder +( -256 264 384 ) ( -256 256 384 ) ( -256 256 0 ) swamps/CL_new_canopy5b 0 0 0.00 1 1 0 0 0 +surfaceparm ladder +} +// brush 6 +{ +( -264 -272 448 ) ( -264 264 448 ) ( 264 264 448 ) eden/WL_edenhouse 0 0 0.00 1 1 0 0 0 +( 264 -272 8 ) ( 264 264 8 ) ( 264 264 0 ) eden/WL_edenhouse 0 0 0.00 1 1 0 0 0 +( 264 264 8 ) ( -264 264 8 ) ( -264 264 0 ) eden/WL_edenhouse 0 0 0.00 1 1 0 0 0 +( -264 264 8 ) ( -264 -272 8 ) ( -264 -272 0 ) eden/WL_edenhouse 0 0 0.00 1 1 0 0 0 +( -264 256 8 ) ( 264 256 8 ) ( -264 256 0 ) eden/WL_edenhouse 0 0 0.00 1 1 0 0 0 +( -128 272 384 ) ( -128 256 384 ) ( 120 272 384 ) eden/WL_edenhouse 0 0 0.00 1 1 0 0 0 +} +// brush 7 +{ +( 264 264 -8 ) ( -264 264 -8 ) ( -264 -272 -8 ) eden/WL_edenhouse 0 0 0.00 1 1 0 0 0 +( 264 -272 8 ) ( 264 264 8 ) ( 264 264 0 ) eden/WL_edenhouse 0 0 0.00 1 1 0 0 0 +( 264 264 8 ) ( -264 264 8 ) ( -264 264 0 ) eden/WL_edenhouse 0 0 0.00 1 1 0 0 0 +( -264 264 8 ) ( -264 -272 8 ) ( -264 -272 0 ) eden/WL_edenhouse 0 0 0.00 1 1 0 0 0 +( -264 256 8 ) ( 264 256 8 ) ( -264 256 0 ) eden/WL_edenhouse 0 0 0.00 1 1 0 0 0 +( -128 272 0 ) ( 120 272 0 ) ( -128 256 0 ) eden/WL_edenhouse 0 0 0.00 1 1 0 0 0 +} +// brush 8 +{ +( 264 264 -8 ) ( -264 264 -8 ) ( -264 -272 -8 ) eden/WL_edenhouse 0 0 0.00 1 1 0 0 0 +( -264 -272 448 ) ( -264 264 448 ) ( 264 264 448 ) eden/WL_edenhouse 0 0 0.00 1 1 0 0 0 +( -264 -264 8 ) ( 264 -264 8 ) ( 264 -264 0 ) eden/WL_edenhouse 0 0 0.00 1 1 0 0 0 +( 264 264 8 ) ( -264 264 8 ) ( -264 264 0 ) eden/WL_edenhouse 0 0 0.00 1 1 0 0 0 +( -264 264 8 ) ( -264 -272 8 ) ( -264 -272 0 ) eden/WL_edenhouse 0 0 0.00 1 1 0 0 0 +( -256 -272 192 ) ( -256 264 192 ) ( -256 -272 184 ) eden/WL_edenhouse 0 0 0.00 1 1 0 0 0 +} +// brush 9 +{ +( 264 264 -8 ) ( -264 264 -8 ) ( -264 -272 -8 ) eden/WL_edenhouse 0 0 0.00 1 1 0 0 0 +( -264 -272 448 ) ( -264 264 448 ) ( 264 264 448 ) eden/WL_edenhouse 0 0 0.00 1 1 0 0 0 +( -264 -264 8 ) ( 264 -264 8 ) ( 264 -264 0 ) eden/WL_edenhouse 0 0 0.00 1 1 0 0 0 +( 264 -272 8 ) ( 264 264 8 ) ( 264 264 0 ) eden/WL_edenhouse 0 0 0.00 1 1 0 0 0 +( 264 264 8 ) ( -264 264 8 ) ( -264 264 0 ) eden/WL_edenhouse 0 0 0.00 1 1 0 0 0 +( 256 264 192 ) ( 256 -272 192 ) ( 256 264 184 ) eden/WL_edenhouse 0 0 0.00 1 1 0 0 0 +} +// brush 10 +{ +( 264 264 -8 ) ( -264 264 -8 ) ( -264 -272 -8 ) eden/WL_edenhouse 0 0 0.00 1 1 0 0 0 +( -264 -272 448 ) ( -264 264 448 ) ( 264 264 448 ) eden/WL_edenhouse 0 0 0.00 1 1 0 0 0 +( -264 -264 8 ) ( 264 -264 8 ) ( 264 -264 0 ) eden/WL_edenhouse 0 0 0.00 1 1 0 0 0 +( 264 -272 8 ) ( 264 264 8 ) ( 264 264 0 ) eden/WL_edenhouse 0 0 0.00 1 1 0 0 0 +( -264 264 8 ) ( -264 -272 8 ) ( -264 -272 0 ) eden/WL_edenhouse 0 0 0.00 1 1 0 0 0 +( 264 -256 8 ) ( -264 -256 8 ) ( 264 -256 0 ) eden/WL_edenhouse 0 0 0.00 1 1 0 0 0 +} +// brush 11 +{ +( -264 -272 456 ) ( -264 264 456 ) ( 264 264 456 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +( -264 -264 16 ) ( 264 -264 16 ) ( 264 -264 8 ) eden/FL_edenhouse2 0 8 0.00 1 1 0 0 0 +( 264 -272 16 ) ( 264 264 16 ) ( 264 264 8 ) eden/FL_edenhouse2 0 8 0.00 1 1 0 0 0 +( 264 264 16 ) ( -264 264 16 ) ( -264 264 8 ) eden/FL_edenhouse2 0 8 0.00 1 1 0 0 0 +( -264 264 16 ) ( -264 -272 16 ) ( -264 -272 8 ) eden/FL_edenhouse2 0 8 0.00 1 1 0 0 0 +( -264 264 448 ) ( -264 -272 448 ) ( 264 264 448 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +} +// brush 12 +{ +( 264 264 -8 ) ( -264 264 -8 ) ( -264 -272 -8 ) eden/fl_street1 0 0 0.00 1 1 0 0 0 +( -264 -264 8 ) ( 264 -264 8 ) ( 264 -264 0 ) eden/fl_street1 0 0 0.00 1 1 0 0 0 +( 264 -272 8 ) ( 264 264 8 ) ( 264 264 0 ) eden/fl_street1 0 0 0.00 1 1 0 0 0 +( 264 264 8 ) ( -264 264 8 ) ( -264 264 0 ) eden/fl_street1 0 0 0.00 1 1 0 0 0 +( -264 264 8 ) ( -264 -272 8 ) ( -264 -272 0 ) eden/fl_street1 0 0 0.00 1 1 0 0 0 +( -264 264 0 ) ( 264 264 0 ) ( -264 -272 0 ) eden/fl_street1 0 0 0.00 1 1 0 0 0 +} +} +// entity 1 +{ +"classname" "func_rope" +// brush 0 +{ +( 48 64 24 ) ( -24 64 24 ) ( -24 -16 24 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( -24 -16 448 ) ( -24 64 448 ) ( 48 64 448 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( -24 -16 416 ) ( 48 -16 416 ) ( 48 -16 352 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( 40 -24 416 ) ( 40 56 416 ) ( 40 56 352 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( 48 56 416 ) ( -24 56 416 ) ( -24 56 352 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( -24 64 416 ) ( -24 -16 416 ) ( -24 -16 352 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +} +} +// entity 2 +{ +"origin" "0 0 128" +"light" "1000" +"classname" "light" +} +// entity 3 +{ +"origin" "0 -192 16" +"angle" "90" +"classname" "info_player_start" +} diff --git a/fakk/maps/example/climb.prt b/fakk/maps/example/climb.prt new file mode 100644 index 0000000..a62fb9c --- /dev/null +++ b/fakk/maps/example/climb.prt @@ -0,0 +1,24 @@ +PRT1 +4 +4 +16 +4 0 2 0 (0 0 0 ) (0 0 448 ) (0 256 448 ) (0 256 0 ) +4 0 1 0 (0 0 448 ) (0 0 0 ) (256 0 0 ) (256 0 448 ) +4 1 3 0 (0 0 448 ) (0 0 0 ) (0 -256 0 ) (0 -256 448 ) +4 2 3 0 (-256 0 0 ) (0 0 0 ) (0 0 448 ) (-256 0 448 ) +4 0 (256 0 448 ) (256 0 0 ) (256 256 0 ) (256 256 448 ) +4 0 (256 256 448 ) (256 256 0 ) (0 256 0 ) (0 256 448 ) +4 0 (256 0 0 ) (0 0 0 ) (0 256 0 ) (256 256 0 ) +4 0 (0 0 448 ) (256 0 448 ) (256 256 448 ) (0 256 448 ) +4 1 (0 -256 448 ) (0 -256 0 ) (256 -256 0 ) (256 -256 448 ) +4 1 (256 -256 448 ) (256 -256 0 ) (256 0 0 ) (256 0 448 ) +4 1 (0 -256 0 ) (0 0 0 ) (256 0 0 ) (256 -256 0 ) +4 1 (256 0 448 ) (0 0 448 ) (0 -256 448 ) (256 -256 448 ) +4 2 (-256 256 448 ) (-256 256 0 ) (-256 0 0 ) (-256 0 448 ) +4 2 (-256 256 0 ) (-256 256 448 ) (0 256 448 ) (0 256 0 ) +4 2 (0 0 0 ) (-256 0 0 ) (-256 256 0 ) (0 256 0 ) +4 2 (0 256 448 ) (-256 256 448 ) (-256 0 448 ) (0 0 448 ) +4 3 (-256 -256 448 ) (-256 -256 0 ) (0 -256 0 ) (0 -256 448 ) +4 3 (-256 0 448 ) (-256 0 0 ) (-256 -256 0 ) (-256 -256 448 ) +4 3 (-256 -256 0 ) (-256 0 0 ) (0 0 0 ) (0 -256 0 ) +4 3 (0 0 448 ) (-256 0 448 ) (-256 -256 448 ) (0 -256 448 ) diff --git a/fakk/maps/example/cover.bsp b/fakk/maps/example/cover.bsp new file mode 100644 index 0000000000000000000000000000000000000000..a0a325a95b83038d062deca1e0daa6c292f88c84 GIT binary patch literal 232684 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Ä{jIiCxddvcOs{!kYH5 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 literal 0 HcmV?d00001 diff --git a/fakk/maps/example/cover.map b/fakk/maps/example/cover.map new file mode 100644 index 0000000..48b5b06 --- /dev/null +++ b/fakk/maps/example/cover.map @@ -0,0 +1,1408 @@ +{ +"classname" "worldspawn" +// brush 0 +{ +( 152 560 64 ) ( 152 576 64 ) ( 136 576 64 ) eden/genmetal 0 8 0.00 1 1 0 0 0 +( 136 576 240 ) ( 152 576 240 ) ( 152 560 240 ) eden/genmetal 0 8 0.00 1 1 0 0 0 +( 136 576 256 ) ( 136 560 256 ) ( 136 560 0 ) eden/genmetal -32 0 0.00 1 1 0 0 0 +( 136 568 256 ) ( 152 568 256 ) ( 152 568 0 ) eden/genmetal 24 0 0.00 1 1 0 0 0 +( 152 568 256 ) ( 152 584 256 ) ( 152 584 0 ) eden/genmetal -32 0 0.00 1 1 0 0 0 +( 152 576 256 ) ( 136 576 256 ) ( 136 576 0 ) eden/genmetal 56 0 -180.00 1 -1 0 0 0 +} +// brush 1 +{ +( 184 560 64 ) ( 184 576 64 ) ( 168 576 64 ) eden/genmetal 0 -8 0.00 1 1 0 0 0 +( 168 576 240 ) ( 184 576 240 ) ( 184 560 240 ) eden/genmetal 0 -8 0.00 1 1 0 0 0 +( 168 584 256 ) ( 168 568 256 ) ( 168 568 0 ) eden/genmetal -32 0 0.00 1 1 0 0 0 +( 168 568 256 ) ( 184 568 256 ) ( 184 568 0 ) eden/genmetal 40 0 0.00 1 1 0 0 0 +( 184 560 256 ) ( 184 576 256 ) ( 184 576 0 ) eden/genmetal -32 0 0.00 1 1 0 0 0 +( 184 576 256 ) ( 168 576 256 ) ( 168 576 0 ) eden/genmetal 72 0 -180.00 1 -1 0 0 0 +} +// brush 2 +{ +( 176 576 272 ) ( 144 576 272 ) ( 144 576 16 ) eden/genmetal 32 16 0.00 1 1 0 0 0 +( 168 568 272 ) ( 168 584 272 ) ( 168 584 16 ) eden/genmetal -32 16 0.00 1 1 0 0 0 +( 136 568 256 ) ( 168 568 256 ) ( 168 568 0 ) eden/genmetal 32 16 0.00 1 1 0 0 0 +( 152 584 272 ) ( 152 568 272 ) ( 152 568 16 ) eden/genmetal -32 16 0.00 1 1 0 0 0 +( 144 576 80 ) ( 176 576 80 ) ( 176 560 80 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( 176 560 64 ) ( 176 576 64 ) ( 144 576 64 ) eden/genmetal 0 -64 90.00 1 1 0 0 0 +} +// brush 3 +{ +( 176 576 432 ) ( 144 576 432 ) ( 144 576 176 ) eden/genmetal 32 48 0.00 1 1 0 0 0 +( 168 568 432 ) ( 168 584 432 ) ( 168 584 176 ) eden/genmetal -32 48 0.00 1 1 0 0 0 +( 136 568 416 ) ( 168 568 416 ) ( 168 568 160 ) eden/genmetal 32 48 0.00 1 1 0 0 0 +( 152 584 432 ) ( 152 568 432 ) ( 152 568 176 ) eden/genmetal -32 48 0.00 1 1 0 0 0 +( 144 576 240 ) ( 176 576 240 ) ( 176 560 240 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( 176 560 224 ) ( 176 576 224 ) ( 144 576 224 ) eden/genmetal 0 -64 90.00 1 1 0 0 0 +} +// brush 4 +{ +( 168 576 240 ) ( 152 576 240 ) ( 152 576 64 ) otto/ottolight 35 -16 90.00 -2.250000 -0.500000 0 0 0 +( 168 568 240 ) ( 168 576 240 ) ( 168 576 64 ) otto/ottolight 35 16 90.00 -2.250000 -0.500000 0 0 0 +( 152 572 240 ) ( 168 572 240 ) ( 168 572 64 ) otto/ottolight 35 -16 90.00 -2.250000 -0.500000 0 0 0 +( 152 576 240 ) ( 152 568 240 ) ( 152 568 64 ) otto/ottolight 35 16 90.00 -2.250000 -0.500000 0 0 0 +( 152 576 224 ) ( 168 576 224 ) ( 168 568 224 ) otto/ottolight 35 -16 90.00 -2.250000 -0.500000 0 0 0 +( 168 568 80 ) ( 168 576 80 ) ( 152 576 80 ) otto/ottolight 6 16 0.00 2.250000 0.500000 0 0 0 +} +// brush 5 +{ +( 152 -768 64 ) ( 152 -768 240 ) ( 168 -768 240 ) otto/ottolight 35 -16 90.00 -2.250000 -0.500000 0 0 0 +( 168 -768 64 ) ( 168 -768 240 ) ( 168 -760 240 ) otto/ottolight 34 16 90.00 -2.250000 -0.500000 0 0 0 +( 168 -764 64 ) ( 168 -764 240 ) ( 152 -764 240 ) otto/ottolight 35 -16 90.00 -2.250000 -0.500000 0 0 0 +( 152 -760 64 ) ( 152 -760 240 ) ( 152 -768 240 ) otto/ottolight 34 16 90.00 -2.250000 -0.500000 0 0 0 +( 168 -760 224 ) ( 168 -768 224 ) ( 152 -768 224 ) otto/ottolight 34 -16 90.00 -2.250000 -0.500000 0 0 0 +( 152 -768 80 ) ( 168 -768 80 ) ( 168 -760 80 ) otto/ottolight 5 16 0.00 2.250000 0.500000 0 0 0 +} +// brush 6 +{ +( 144 -768 176 ) ( 144 -768 432 ) ( 176 -768 432 ) eden/genmetal 32 48 0.00 1 1 0 0 0 +( 168 -776 176 ) ( 168 -776 432 ) ( 168 -760 432 ) eden/genmetal -96 48 0.00 1 1 0 0 0 +( 168 -760 160 ) ( 168 -760 416 ) ( 136 -760 416 ) eden/genmetal 32 48 0.00 1 1 0 0 0 +( 152 -760 176 ) ( 152 -760 432 ) ( 152 -776 432 ) eden/genmetal -96 48 0.00 1 1 0 0 0 +( 176 -752 240 ) ( 176 -768 240 ) ( 144 -768 240 ) eden/genmetal -64 0 0.00 1 1 0 0 0 +( 144 -768 224 ) ( 176 -768 224 ) ( 176 -752 224 ) eden/genmetal 64 -63 90.00 1 1 0 0 0 +} +// brush 7 +{ +( 144 -768 16 ) ( 144 -768 272 ) ( 176 -768 272 ) eden/genmetal 32 16 0.00 1 1 0 0 0 +( 168 -776 16 ) ( 168 -776 272 ) ( 168 -760 272 ) eden/genmetal -96 16 0.00 1 1 0 0 0 +( 168 -760 0 ) ( 168 -760 256 ) ( 136 -760 256 ) eden/genmetal 32 16 0.00 1 1 0 0 0 +( 152 -760 16 ) ( 152 -760 272 ) ( 152 -776 272 ) eden/genmetal -96 16 0.00 1 1 0 0 0 +( 176 -752 80 ) ( 176 -768 80 ) ( 144 -768 80 ) eden/genmetal -64 0 0.00 1 1 0 0 0 +( 144 -768 64 ) ( 176 -768 64 ) ( 176 -752 64 ) eden/genmetal 64 -63 90.00 1 1 0 0 0 +} +// brush 8 +{ +( 168 -768 64 ) ( 184 -768 64 ) ( 184 -752 64 ) eden/genmetal -64 -8 0.00 1 1 0 0 0 +( 184 -752 240 ) ( 184 -768 240 ) ( 168 -768 240 ) eden/genmetal -64 -8 0.00 1 1 0 0 0 +( 168 -760 0 ) ( 168 -760 256 ) ( 168 -776 256 ) eden/genmetal -96 0 0.00 1 1 0 0 0 +( 184 -760 0 ) ( 184 -760 256 ) ( 168 -760 256 ) eden/genmetal 40 0 0.00 1 1 0 0 0 +( 184 -768 0 ) ( 184 -768 256 ) ( 184 -752 256 ) eden/genmetal -96 0 0.00 1 1 0 0 0 +( 168 -768 0 ) ( 168 -768 256 ) ( 184 -768 256 ) eden/genmetal 71 0 -180.00 1 -1 0 0 0 +} +// brush 9 +{ +( 136 -768 64 ) ( 152 -768 64 ) ( 152 -752 64 ) eden/genmetal -64 8 0.00 1 1 0 0 0 +( 152 -752 240 ) ( 152 -768 240 ) ( 136 -768 240 ) eden/genmetal -64 8 0.00 1 1 0 0 0 +( 136 -752 0 ) ( 136 -752 256 ) ( 136 -768 256 ) eden/genmetal -96 0 0.00 1 1 0 0 0 +( 152 -760 0 ) ( 152 -760 256 ) ( 136 -760 256 ) eden/genmetal 24 0 0.00 1 1 0 0 0 +( 152 -776 0 ) ( 152 -776 256 ) ( 152 -760 256 ) eden/genmetal -96 0 0.00 1 1 0 0 0 +( 136 -768 0 ) ( 136 -768 256 ) ( 152 -768 256 ) eden/genmetal 55 0 -180.00 1 -1 0 0 0 +} +// brush 10 +{ +( 832 -120 64 ) ( 832 -104 64 ) ( 816 -104 64 ) eden/genmetal -64 8 0.00 1 1 0 0 0 +( 816 -104 240 ) ( 832 -104 240 ) ( 832 -120 240 ) eden/genmetal -64 8 0.00 1 1 0 0 0 +( 816 -120 0 ) ( 816 -120 256 ) ( 832 -120 256 ) eden/genmetal -64 0 0.00 1 1 0 0 0 +( 824 -104 0 ) ( 824 -104 256 ) ( 824 -120 256 ) eden/genmetal -8 0 0.00 1 1 0 0 0 +( 840 -104 0 ) ( 840 -104 256 ) ( 824 -104 256 ) eden/genmetal -64 0 0.00 1 1 0 0 0 +( 832 -120 0 ) ( 832 -120 256 ) ( 832 -104 256 ) eden/genmetal -8 0 0.00 1 1 0 0 0 +} +// brush 11 +{ +( 832 -88 64 ) ( 832 -72 64 ) ( 816 -72 64 ) eden/genmetal -64 -8 0.00 1 1 0 0 0 +( 816 -72 240 ) ( 832 -72 240 ) ( 832 -88 240 ) eden/genmetal -64 -8 0.00 1 1 0 0 0 +( 824 -88 0 ) ( 824 -88 256 ) ( 840 -88 256 ) eden/genmetal -64 0 0.00 1 1 0 0 0 +( 824 -72 0 ) ( 824 -72 256 ) ( 824 -88 256 ) eden/genmetal 8 0 0.00 1 1 0 0 0 +( 832 -72 0 ) ( 832 -72 256 ) ( 816 -72 256 ) eden/genmetal -64 0 0.00 1 1 0 0 0 +( 832 -88 0 ) ( 832 -88 256 ) ( 832 -72 256 ) eden/genmetal 8 0 0.00 1 1 0 0 0 +} +// brush 12 +{ +( 832 -112 16 ) ( 832 -112 272 ) ( 832 -80 272 ) eden/genmetal 0 16 0.00 1 1 0 0 0 +( 840 -88 16 ) ( 840 -88 272 ) ( 824 -88 272 ) eden/genmetal -64 16 0.00 1 1 0 0 0 +( 824 -88 0 ) ( 824 -88 256 ) ( 824 -120 256 ) eden/genmetal 0 16 0.00 1 1 0 0 0 +( 824 -104 16 ) ( 824 -104 272 ) ( 840 -104 272 ) eden/genmetal -64 16 0.00 1 1 0 0 0 +( 816 -80 80 ) ( 832 -80 80 ) ( 832 -112 80 ) eden/genmetal -64 0 0.00 1 1 0 0 0 +( 832 -112 64 ) ( 832 -80 64 ) ( 816 -80 64 ) eden/genmetal -64 0 0.00 1 1 0 0 0 +} +// brush 13 +{ +( 832 -112 176 ) ( 832 -112 432 ) ( 832 -80 432 ) eden/genmetal 0 48 0.00 1 1 0 0 0 +( 840 -88 176 ) ( 840 -88 432 ) ( 824 -88 432 ) eden/genmetal -64 48 0.00 1 1 0 0 0 +( 824 -88 160 ) ( 824 -88 416 ) ( 824 -120 416 ) eden/genmetal 0 48 0.00 1 1 0 0 0 +( 824 -104 176 ) ( 824 -104 432 ) ( 840 -104 432 ) eden/genmetal -64 48 0.00 1 1 0 0 0 +( 816 -80 240 ) ( 832 -80 240 ) ( 832 -112 240 ) eden/genmetal -64 0 0.00 1 1 0 0 0 +( 832 -112 224 ) ( 832 -80 224 ) ( 816 -80 224 ) eden/genmetal -64 0 0.00 1 1 0 0 0 +} +// brush 14 +{ +( 832 -104 64 ) ( 832 -104 240 ) ( 832 -88 240 ) otto/ottolight 35 16 90.00 -2.250000 -0.500000 0 0 0 +( 832 -88 64 ) ( 832 -88 240 ) ( 824 -88 240 ) otto/ottolight 34 16 90.00 -2.250000 -0.500000 0 0 0 +( 828 -88 64 ) ( 828 -88 240 ) ( 828 -104 240 ) otto/ottolight 35 16 90.00 -2.250000 -0.500000 0 0 0 +( 824 -104 64 ) ( 824 -104 240 ) ( 832 -104 240 ) otto/ottolight 34 16 90.00 -2.250000 -0.500000 0 0 0 +( 824 -88 224 ) ( 832 -88 224 ) ( 832 -104 224 ) otto/ottolight 34 16 90.00 -2.250000 -0.500000 0 0 0 +( 832 -104 80 ) ( 832 -88 80 ) ( 824 -88 80 ) otto/ottolight 34 16 90.00 -2.250000 -0.500000 0 0 0 +} +// brush 15 +{ +( -512 -88 240 ) ( -512 -104 240 ) ( -512 -104 64 ) otto/ottolight 35 16 90.00 -2.250000 -0.500000 0 0 0 +( -504 -88 240 ) ( -512 -88 240 ) ( -512 -88 64 ) otto/ottolight 35 16 90.00 -2.250000 -0.500000 0 0 0 +( -508 -104 240 ) ( -508 -88 240 ) ( -508 -88 64 ) otto/ottolight 35 16 90.00 -2.250000 -0.500000 0 0 0 +( -512 -104 240 ) ( -504 -104 240 ) ( -504 -104 64 ) otto/ottolight 35 16 90.00 -2.250000 -0.500000 0 0 0 +( -512 -104 224 ) ( -512 -88 224 ) ( -504 -88 224 ) otto/ottolight 35 16 90.00 -2.250000 -0.500000 0 0 0 +( -504 -88 80 ) ( -512 -88 80 ) ( -512 -104 80 ) otto/ottolight 35 16 90.00 -2.250000 -0.500000 0 0 0 +} +// brush 16 +{ +( -512 -80 432 ) ( -512 -112 432 ) ( -512 -112 176 ) eden/genmetal 0 48 0.00 1 1 0 0 0 +( -504 -88 432 ) ( -520 -88 432 ) ( -520 -88 176 ) eden/genmetal 0 48 0.00 1 1 0 0 0 +( -504 -120 416 ) ( -504 -88 416 ) ( -504 -88 160 ) eden/genmetal 0 48 0.00 1 1 0 0 0 +( -520 -104 432 ) ( -504 -104 432 ) ( -504 -104 176 ) eden/genmetal 0 48 0.00 1 1 0 0 0 +( -512 -112 240 ) ( -512 -80 240 ) ( -496 -80 240 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -496 -80 224 ) ( -512 -80 224 ) ( -512 -112 224 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +} +// brush 17 +{ +( -512 -80 272 ) ( -512 -112 272 ) ( -512 -112 16 ) eden/genmetal 0 16 0.00 1 1 0 0 0 +( -504 -88 272 ) ( -520 -88 272 ) ( -520 -88 16 ) eden/genmetal 0 16 0.00 1 1 0 0 0 +( -504 -120 256 ) ( -504 -88 256 ) ( -504 -88 0 ) eden/genmetal 0 16 0.00 1 1 0 0 0 +( -520 -104 272 ) ( -504 -104 272 ) ( -504 -104 16 ) eden/genmetal 0 16 0.00 1 1 0 0 0 +( -512 -112 80 ) ( -512 -80 80 ) ( -496 -80 80 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -496 -80 64 ) ( -512 -80 64 ) ( -512 -112 64 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +} +// brush 18 +{ +( -496 -72 64 ) ( -512 -72 64 ) ( -512 -88 64 ) eden/genmetal 0 -8 0.00 1 1 0 0 0 +( -512 -88 240 ) ( -512 -72 240 ) ( -496 -72 240 ) eden/genmetal 0 -8 0.00 1 1 0 0 0 +( -520 -88 256 ) ( -504 -88 256 ) ( -504 -88 0 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -504 -88 256 ) ( -504 -72 256 ) ( -504 -72 0 ) eden/genmetal 8 0 0.00 1 1 0 0 0 +( -496 -72 256 ) ( -512 -72 256 ) ( -512 -72 0 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -512 -72 256 ) ( -512 -88 256 ) ( -512 -88 0 ) eden/genmetal 8 0 0.00 1 1 0 0 0 +} +// brush 19 +{ +( -496 -104 64 ) ( -512 -104 64 ) ( -512 -120 64 ) eden/genmetal 0 8 0.00 1 1 0 0 0 +( -512 -120 240 ) ( -512 -104 240 ) ( -496 -104 240 ) eden/genmetal 0 8 0.00 1 1 0 0 0 +( -512 -120 256 ) ( -496 -120 256 ) ( -496 -120 0 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -504 -120 256 ) ( -504 -104 256 ) ( -504 -104 0 ) eden/genmetal -8 0 0.00 1 1 0 0 0 +( -504 -104 256 ) ( -520 -104 256 ) ( -520 -104 0 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -512 -104 256 ) ( -512 -120 256 ) ( -512 -120 0 ) eden/genmetal -8 0 0.00 1 1 0 0 0 +} +// brush 20 +{ +( 128 704 -96 ) ( 128 672 -96 ) ( 128 672 -128 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +( 352 704 -96 ) ( 128 704 -96 ) ( 128 704 -128 ) eden/edenmetalwall 64 0 0.00 1 1 0 0 0 +( 384 672 -96 ) ( 384 704 -96 ) ( 384 704 -128 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +( 128 672 -96 ) ( 352 672 -96 ) ( 352 672 -128 ) eden/edenmetalwall 64 0 0.00 1 1 0 0 0 +( 128 672 -96 ) ( 128 704 -96 ) ( 352 704 -96 ) eden/edenmetalwall 64 0 0.00 1 1 0 0 0 +( 352 704 -128 ) ( 128 704 -128 ) ( 128 672 -128 ) eden/edenmetalwall 64 0 0.00 1 1 0 0 0 +} +// brush 21 + { + patchDef2 + { + eden/edenmetalwall + ( 9 3 0 536870912 0 subdivisions 90.458153 ) +( +( ( -344 -568 288 0 0 ) ( -344 -568 496 0 0.812500 ) ( 72 -184 496 0 3.437500 ) ) +( ( -312 -600 288 0.125000 0 ) ( -312 -600 496 0.125000 0.812500 ) ( 104 -216 496 0.125000 3.437500 ) ) +( ( -280 -568 288 0.250000 0 ) ( -280 -568 464 0.250000 0.812500 ) ( 104 -216 464 0.250000 3.437500 ) ) +( ( -248 -536 288 0.375000 0 ) ( -248 -536 432 0.375000 0.812500 ) ( 104 -216 432 0.375000 3.437500 ) ) +( ( -280 -504 288 0.500000 0 ) ( -280 -504 432 0.500000 0.812500 ) ( 72 -184 432 0.500000 3.437500 ) ) +( ( -312 -472 288 0.625000 0 ) ( -312 -472 432 0.625000 0.812500 ) ( 40 -152 432 0.625000 3.437500 ) ) +( ( -344 -504 288 0.750000 0 ) ( -344 -504 464 0.750000 0.812500 ) ( 40 -152 464 0.750000 3.437500 ) ) +( ( -376 -536 288 0.875000 0 ) ( -376 -536 496 0.875000 0.812500 ) ( 40 -152 496 0.875000 3.437500 ) ) +( ( -344 -568 288 1 0 ) ( -344 -568 496 1 0.812500 ) ( 72 -184 496 1 3.437500 ) ) +) + } + } +// brush 22 + { + patchDef2 + { + eden/edenmetalwall + ( 9 3 0 536870912 0 subdivisions 90.458153 ) +( +( ( 88 -8 496 0 3.437500 ) ( -328 376 496 0 0.812500 ) ( -328 376 288 0 0 ) ) +( ( 120 24 496 0.125000 3.437500 ) ( -296 408 496 0.125000 0.812500 ) ( -296 408 288 0.125000 0 ) ) +( ( 120 24 464 0.250000 3.437500 ) ( -264 376 464 0.250000 0.812500 ) ( -264 376 288 0.250000 0 ) ) +( ( 120 24 432 0.375000 3.437500 ) ( -232 344 432 0.375000 0.812500 ) ( -232 344 288 0.375000 0 ) ) +( ( 88 -8 432 0.500000 3.437500 ) ( -264 312 432 0.500000 0.812500 ) ( -264 312 288 0.500000 0 ) ) +( ( 56 -40 432 0.625000 3.437500 ) ( -296 280 432 0.625000 0.812500 ) ( -296 280 288 0.625000 0 ) ) +( ( 56 -40 464 0.750000 3.437500 ) ( -328 312 464 0.750000 0.812500 ) ( -328 312 288 0.750000 0 ) ) +( ( 56 -40 496 0.875000 3.437500 ) ( -360 344 496 0.875000 0.812500 ) ( -360 344 288 0.875000 0 ) ) +( ( 88 -8 496 1 3.437500 ) ( -328 376 496 1 0.812500 ) ( -328 376 288 1 0 ) ) +) + } + } +// brush 23 + { + patchDef2 + { + eden/edenmetalwall + ( 9 3 0 536870912 0 subdivisions 90.458153 ) +( +( ( 648 376 288 0 0 ) ( 648 376 496 0 0.812500 ) ( 232 -8 496 0 3.437500 ) ) +( ( 616 408 288 0.125000 0 ) ( 616 408 496 0.125000 0.812500 ) ( 200 24 496 0.125000 3.437500 ) ) +( ( 584 376 288 0.250000 0 ) ( 584 376 464 0.250000 0.812500 ) ( 200 24 464 0.250000 3.437500 ) ) +( ( 552 344 288 0.375000 0 ) ( 552 344 432 0.375000 0.812500 ) ( 200 24 432 0.375000 3.437500 ) ) +( ( 584 312 288 0.500000 0 ) ( 584 312 432 0.500000 0.812500 ) ( 232 -8 432 0.500000 3.437500 ) ) +( ( 616 280 288 0.625000 0 ) ( 616 280 432 0.625000 0.812500 ) ( 264 -40 432 0.625000 3.437500 ) ) +( ( 648 312 288 0.750000 0 ) ( 648 312 464 0.750000 0.812500 ) ( 264 -40 464 0.750000 3.437500 ) ) +( ( 680 344 288 0.875000 0 ) ( 680 344 496 0.875000 0.812500 ) ( 264 -40 496 0.875000 3.437500 ) ) +( ( 648 376 288 1 0 ) ( 648 376 496 1 0.812500 ) ( 232 -8 496 1 3.437500 ) ) +) + } + } +// brush 24 + { + patchDef2 + { + eden/edenmetalwall + ( 9 3 0 536870912 0 subdivisions 90.458153 ) +( +( ( 248 -184 496 0 3.437500 ) ( 664 -568 496 0 0.812500 ) ( 664 -568 288 0 0 ) ) +( ( 216 -216 496 0.125000 3.437500 ) ( 632 -600 496 0.125000 0.812500 ) ( 632 -600 288 0.125000 0 ) ) +( ( 216 -216 464 0.250000 3.437500 ) ( 600 -568 464 0.250000 0.812500 ) ( 600 -568 288 0.250000 0 ) ) +( ( 216 -216 432 0.375000 3.437500 ) ( 568 -536 432 0.375000 0.812500 ) ( 568 -536 288 0.375000 0 ) ) +( ( 248 -184 432 0.500000 3.437500 ) ( 600 -504 432 0.500000 0.812500 ) ( 600 -504 288 0.500000 0 ) ) +( ( 280 -152 432 0.625000 3.437500 ) ( 632 -472 432 0.625000 0.812500 ) ( 632 -472 288 0.625000 0 ) ) +( ( 280 -152 464 0.750000 3.437500 ) ( 664 -504 464 0.750000 0.812500 ) ( 664 -504 288 0.750000 0 ) ) +( ( 280 -152 496 0.875000 3.437500 ) ( 696 -536 496 0.875000 0.812500 ) ( 696 -536 288 0.875000 0 ) ) +( ( 248 -184 496 1 3.437500 ) ( 664 -568 496 1 0.812500 ) ( 664 -568 288 1 0 ) ) +) + } + } +// brush 25 +{ +( 280 -144 408 ) ( 280 -144 504 ) ( 280 -48 504 ) eden/edenmetalwall 8 24 0.00 1 1 0 0 0 +( 280 -48 496 ) ( 232 -64 496 ) ( 232 -64 408 ) eden/edenmetalwall -216 24 0.00 1 1 0 0 0 +( 232 -64 496 ) ( 232 -128 496 ) ( 232 -128 408 ) eden/edenmetalwall 8 24 0.00 1 1 0 0 0 +( 280 -144 408 ) ( 232 -128 408 ) ( 232 -128 496 ) eden/edenmetalwall -216 24 0.00 1 1 0 0 0 +( 224 -48 496 ) ( 288 -48 496 ) ( 288 -144 496 ) eden/edenmetalwall -200 8 0.00 1 1 0 0 0 +( 288 -144 408 ) ( 288 -48 408 ) ( 224 -48 408 ) eden/edenmetalwall 64 193 -180.00 1 1 0 0 0 +} +// brush 26 +{ +( 208 24 504 ) ( 112 24 504 ) ( 112 24 408 ) eden/edenmetalwall -72 24 0.00 1 1 0 0 0 +( 192 -24 408 ) ( 192 -24 496 ) ( 208 24 496 ) eden/edenmetalwall -120 24 0.00 1 1 0 0 0 +( 128 -24 408 ) ( 128 -24 496 ) ( 192 -24 496 ) eden/edenmetalwall -72 24 0.00 1 1 0 0 0 +( 128 -24 496 ) ( 128 -24 408 ) ( 112 24 408 ) eden/edenmetalwall -120 24 0.00 1 1 0 0 0 +( 112 32 496 ) ( 208 32 496 ) ( 208 -32 496 ) eden/edenmetalwall -88 104 0.00 1 1 0 0 0 +( 208 -32 408 ) ( 208 32 408 ) ( 112 32 408 ) eden/edenmetalwall -192 -47 90.00 1 1 0 0 0 +} +// brush 27 +{ +( 40 -48 408 ) ( 112 24 408 ) ( 112 24 496 ) eden/edenmetalwall -160 0 0.00 1 1 0 0 0 +( 40 -48 496 ) ( 88 -64 496 ) ( 88 -64 408 ) eden/edenmetalwall -16 0 0.00 1 1 0 0 0 +( 88 -64 496 ) ( 128 -24 496 ) ( 128 -24 408 ) eden/edenmetalwall -160 0 0.00 1 1 0 0 0 +( 112 24 408 ) ( 128 -24 408 ) ( 128 -24 496 ) eden/edenmetalwall -160 0 0.00 1 1 0 0 0 +( 40 -48 496 ) ( 80 0 496 ) ( 128 -16 496 ) eden/edenmetalwall -16 160 0.00 1 1 0 0 0 +( 88 -64 408 ) ( 128 -16 408 ) ( 80 0 408 ) eden/edenmetalwall -16 160 0.00 1 1 0 0 0 +} +// brush 28 +{ +( 208 24 496 ) ( 208 24 408 ) ( 280 -48 408 ) eden/edenmetalwall -160 0 0.00 1 1 0 0 0 +( 232 -64 408 ) ( 232 -64 496 ) ( 280 -48 496 ) eden/edenmetalwall -160 0 0.00 1 1 0 0 0 +( 192 -24 408 ) ( 192 -24 496 ) ( 232 -64 496 ) eden/edenmetalwall -160 0 0.00 1 1 0 0 0 +( 192 -24 496 ) ( 192 -24 408 ) ( 208 24 408 ) eden/edenmetalwall -160 0 0.00 1 1 0 0 0 +( 192 -16 496 ) ( 240 0 496 ) ( 280 -48 496 ) eden/edenmetalwall -160 160 0.00 1 1 0 0 0 +( 240 0 408 ) ( 192 -16 408 ) ( 232 -64 408 ) eden/edenmetalwall -160 160 0.00 1 1 0 0 0 +} +// brush 29 +{ +( 232 -128 408 ) ( 192 -176 408 ) ( 240 -192 408 ) eden/edenmetalwall -160 0 0.00 1 1 0 0 0 +( 280 -144 496 ) ( 240 -192 496 ) ( 192 -176 496 ) eden/edenmetalwall -160 0 0.00 1 1 0 0 0 +( 208 -216 408 ) ( 192 -168 408 ) ( 192 -168 496 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +( 232 -128 496 ) ( 192 -168 496 ) ( 192 -168 408 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +( 280 -144 496 ) ( 232 -128 496 ) ( 232 -128 408 ) eden/edenmetalwall -160 0 0.00 1 1 0 0 0 +( 280 -144 408 ) ( 208 -216 408 ) ( 208 -216 496 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +} +// brush 30 +{ +( 112 -224 408 ) ( 208 -224 408 ) ( 208 -160 408 ) eden/edenmetalwall 0 -47 90.00 1 1 0 0 0 +( 208 -160 496 ) ( 208 -224 496 ) ( 112 -224 496 ) eden/edenmetalwall -88 -88 0.00 1 1 0 0 0 +( 112 -216 408 ) ( 128 -168 408 ) ( 128 -168 496 ) eden/edenmetalwall 72 24 0.00 1 1 0 0 0 +( 192 -168 496 ) ( 128 -168 496 ) ( 128 -168 408 ) eden/edenmetalwall -72 24 0.00 1 1 0 0 0 +( 208 -216 496 ) ( 192 -168 496 ) ( 192 -168 408 ) eden/edenmetalwall 72 24 0.00 1 1 0 0 0 +( 112 -216 408 ) ( 112 -216 504 ) ( 208 -216 504 ) eden/edenmetalwall -72 24 0.00 1 1 0 0 0 +} +// brush 31 +{ +( 112 -216 496 ) ( 112 -216 408 ) ( 40 -144 408 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +( 88 -128 408 ) ( 88 -128 496 ) ( 40 -144 496 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +( 128 -168 408 ) ( 128 -168 496 ) ( 88 -128 496 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +( 128 -168 496 ) ( 128 -168 408 ) ( 112 -216 408 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +( 128 -176 496 ) ( 80 -192 496 ) ( 40 -143.999954 496 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +( 80 -192 408 ) ( 128 -176 408 ) ( 88 -127.999954 408 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +} +// brush 32 +{ +( 96 -48 408 ) ( 32 -48 408 ) ( 32 -144 408 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +( 32 -144 496 ) ( 32 -48 496 ) ( 96 -48 496 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +( 88 -128 496 ) ( 88 -128 408 ) ( 40 -144 408 ) eden/edenmetalwall 0 24 0.00 1 1 0 0 0 +( 88 -128 408 ) ( 88 -128 496 ) ( 88 -64 496 ) eden/edenmetalwall 0 24 0.00 1 1 0 0 0 +( 88 -64 408 ) ( 88 -64 496 ) ( 40 -48 496 ) eden/edenmetalwall 0 24 0.00 1 1 0 0 0 +( 40 -48 504 ) ( 40 -144 504 ) ( 40 -144 408 ) eden/edenmetalwall 0 24 0.00 1 1 0 0 0 +} +// brush 33 + { + patchDef2 + { + eden/edenmetalwall + ( 3 3 0 536870912 0 ) +( +( ( 32 -96 400 0 0 ) ( 16 -240 400 0 0.093750 ) ( 160 -224 400 0 0.187500 ) ) +( ( 64 -96 400 0.156250 0 ) ( 72 -184 400 0.156250 0.093750 ) ( 160 -200 400 0.156250 0.187500 ) ) +( ( 96 -96 400 0.312500 0 ) ( 96 -160 400 0.312500 0.093750 ) ( 160 -160 400 0.312500 0.187500 ) ) +) + } + } +// brush 34 + { + patchDef2 + { + eden/edenmetalwall + ( 3 3 0 536870912 0 ) +( +( ( 160 -224 400 0 0.187500 ) ( 304 -240 400 0 0.093750 ) ( 288 -96 400 0 0 ) ) +( ( 160 -200 400 0.156250 0.187500 ) ( 248 -184 400 0.156250 0.093750 ) ( 256 -96 400 0.156250 0 ) ) +( ( 160 -160 400 0.312500 0.187500 ) ( 224 -160 400 0.312500 0.093750 ) ( 224 -96 400 0.312500 0 ) ) +) + } + } +// brush 35 + { + patchDef2 + { + eden/edenmetalwall + ( 3 3 0 536870912 0 ) +( +( ( 288 -96 400 0 0 ) ( 304 48 400 0 0.093750 ) ( 160 32 400 0 0.187500 ) ) +( ( 256 -96 400 0.156250 0 ) ( 248 -8 400 0.156250 0.093750 ) ( 160 8 400 0.156250 0.187500 ) ) +( ( 224 -96 400 0.312500 0 ) ( 224 -32 400 0.312500 0.093750 ) ( 160 -32 400 0.312500 0.187500 ) ) +) + } + } +// brush 36 + { + patchDef2 + { + eden/edenmetalwall + ( 3 3 0 536870912 0 ) +( +( ( 160 32 400 0 0.187500 ) ( 16 48 400 0 0.093750 ) ( 32 -96 400 0 0 ) ) +( ( 160 8 400 0.156250 0.187500 ) ( 72 -8 400 0.156250 0.093750 ) ( 64 -96 400 0.156250 0 ) ) +( ( 160 -32 400 0.312500 0.187500 ) ( 96 -32 400 0.312500 0.093750 ) ( 96 -96 400 0.312500 0 ) ) +) + } + } +// brush 37 + { + patchDef2 + { + eden/edenmetalwall + ( 9 3 0 536870912 0 ) +( +( ( 95.999992 -96.000008 496 0 0.375000 ) ( 95.999992 -96.000008 448 0 0.187500 ) ( 95.999992 -96.000008 400 0 0 ) ) +( ( 96 -160 496 0.125000 0.375000 ) ( 96 -160 448 0.125000 0.187500 ) ( 96 -160 400 0.125000 0 ) ) +( ( 160 -159.999969 496 0.250000 0.375000 ) ( 160 -159.999969 448 0.250000 0.187500 ) ( 160 -159.999969 400 0.250000 0 ) ) +( ( 224 -160 496 0.375000 0.375000 ) ( 224 -160 448 0.375000 0.187500 ) ( 224 -160 400 0.375000 0 ) ) +( ( 223.999969 -96.000008 496 0.500000 0.375000 ) ( 223.999969 -96.000008 448 0.500000 0.187500 ) ( 223.999969 -96.000008 400 0.500000 0 ) ) +( ( 224 -31.999996 496 0.625000 0.375000 ) ( 224 -31.999996 448 0.625000 0.187500 ) ( 224 -31.999996 400 0.625000 0 ) ) +( ( 160 -32 496 0.750000 0.375000 ) ( 160 -32 448 0.750000 0.187500 ) ( 160 -32 400 0.750000 0 ) ) +( ( 96 -31.999996 496 0.875000 0.375000 ) ( 96 -31.999996 448 0.875000 0.187500 ) ( 96 -31.999996 400 0.875000 0 ) ) +( ( 95.999992 -96.000008 496 1 0.375000 ) ( 95.999992 -96.000008 448 1 0.187500 ) ( 95.999992 -96.000008 400 1 0 ) ) +) + } + } +// brush 38 + { + patchDef2 + { + eden/edenmetalwall + ( 9 3 0 536870912 0 subdivisions 90.501022 ) +( +( ( 160 576 288 0 0 ) ( 160 576 496 0 0.812500 ) ( 160 32 496 0 3.437500 ) ) +( ( 128 576 288 0.125000 0 ) ( 128 576 496 0.125000 0.812500 ) ( 128 32 496 0.125000 3.437500 ) ) +( ( 128 544 288 0.250000 0 ) ( 128 544 464 0.250000 0.812500 ) ( 128 32 464 0.250000 3.437500 ) ) +( ( 128 512 288 0.375000 0 ) ( 128 512 432 0.375000 0.812500 ) ( 128 32 432 0.375000 3.437500 ) ) +( ( 160 512 288 0.500000 0 ) ( 160 512 432 0.500000 0.812500 ) ( 160 32 432 0.500000 3.437500 ) ) +( ( 192 512 288 0.625000 0 ) ( 192 512 432 0.625000 0.812500 ) ( 192 32 432 0.625000 3.437500 ) ) +( ( 192 544 288 0.750000 0 ) ( 192 544 464 0.750000 0.812500 ) ( 192 32 464 0.750000 3.437500 ) ) +( ( 192 576 288 0.875000 0 ) ( 192 576 496 0.875000 0.812500 ) ( 192 32 496 0.875000 3.437500 ) ) +( ( 160 576 288 1 0 ) ( 160 576 496 1 0.812500 ) ( 160 32 496 1 3.437500 ) ) +) + } + } +// brush 39 + { + patchDef2 + { + eden/edenmetalwall + ( 9 3 0 536870912 0 subdivisions 91.251312 ) +( +( ( 160 -224 496 0 3.437500 ) ( 160 -768 496 0 0.812500 ) ( 160 -768 288 0 0 ) ) +( ( 128 -224 496 0.125000 3.437500 ) ( 128 -768 496 0.125000 0.812500 ) ( 128 -768 288 0.125000 0 ) ) +( ( 128 -224 464 0.250000 3.437500 ) ( 128 -736 464 0.250000 0.812500 ) ( 128 -736 288 0.250000 0 ) ) +( ( 128 -224 432 0.375000 3.437500 ) ( 128 -704 432 0.375000 0.812500 ) ( 128 -704 288 0.375000 0 ) ) +( ( 160 -224 432 0.500000 3.437500 ) ( 160 -704 432 0.500000 0.812500 ) ( 160 -704 288 0.500000 0 ) ) +( ( 192 -224 432 0.625000 3.437500 ) ( 192 -704 432 0.625000 0.812500 ) ( 192 -704 288 0.625000 0 ) ) +( ( 192 -224 464 0.750000 3.437500 ) ( 192 -736 464 0.750000 0.812500 ) ( 192 -736 288 0.750000 0 ) ) +( ( 192 -224 496 0.875000 3.437500 ) ( 192 -768 496 0.875000 0.812500 ) ( 192 -768 288 0.875000 0 ) ) +( ( 160 -224 496 1 3.437500 ) ( 160 -768 496 1 0.812500 ) ( 160 -768 288 1 0 ) ) +) + } + } +// brush 40 + { + patchDef2 + { + eden/edenmetalwall + ( 9 3 0 536870912 0 subdivisions 90.458153 ) +( +( ( 288 -96 496 0 3.437500 ) ( 832 -96 496 0 0.812500 ) ( 832 -96 288 0 0 ) ) +( ( 288 -128 496 0.125000 3.437500 ) ( 832 -128 496 0.125000 0.812500 ) ( 832 -128 288 0.125000 0 ) ) +( ( 288 -128 464 0.250000 3.437500 ) ( 800 -128 464 0.250000 0.812500 ) ( 800 -128 288 0.250000 0 ) ) +( ( 288 -128 432 0.375000 3.437500 ) ( 768 -128 432 0.375000 0.812500 ) ( 768 -128 288 0.375000 0 ) ) +( ( 288 -96 432 0.500000 3.437500 ) ( 768 -96 432 0.500000 0.812500 ) ( 768 -96 288 0.500000 0 ) ) +( ( 288 -64 432 0.625000 3.437500 ) ( 768 -64 432 0.625000 0.812500 ) ( 768 -64 288 0.625000 0 ) ) +( ( 288 -64 464 0.750000 3.437500 ) ( 800 -64 464 0.750000 0.812500 ) ( 800 -64 288 0.750000 0 ) ) +( ( 288 -64 496 0.875000 3.437500 ) ( 832 -64 496 0.875000 0.812500 ) ( 832 -64 288 0.875000 0 ) ) +( ( 288 -96 496 1 3.437500 ) ( 832 -96 496 1 0.812500 ) ( 832 -96 288 1 0 ) ) +) + } + } +// brush 41 + { + patchDef2 + { + eden/edenmetalwall + ( 9 3 0 536870912 0 subdivisions 91.251312 ) +( +( ( -512 -96 288 0 0 ) ( -512 -96 496 0 0.812500 ) ( 32 -96 496 0 3.437500 ) ) +( ( -512 -128 288 0.125000 0 ) ( -512 -128 496 0.125000 0.812500 ) ( 32 -128 496 0.125000 3.437500 ) ) +( ( -480 -128 288 0.250000 0 ) ( -480 -128 464 0.250000 0.812500 ) ( 32 -128 464 0.250000 3.437500 ) ) +( ( -448 -128 288 0.375000 0 ) ( -448 -128 432 0.375000 0.812500 ) ( 32 -128 432 0.375000 3.437500 ) ) +( ( -448 -96 288 0.500000 0 ) ( -448 -96 432 0.500000 0.812500 ) ( 32 -96 432 0.500000 3.437500 ) ) +( ( -448 -64 288 0.625000 0 ) ( -448 -64 432 0.625000 0.812500 ) ( 32 -64 432 0.625000 3.437500 ) ) +( ( -480 -64 288 0.750000 0 ) ( -480 -64 464 0.750000 0.812500 ) ( 32 -64 464 0.750000 3.437500 ) ) +( ( -512 -64 288 0.875000 0 ) ( -512 -64 496 0.875000 0.812500 ) ( 32 -64 496 0.875000 3.437500 ) ) +( ( -512 -96 288 1 0 ) ( -512 -96 496 1 0.812500 ) ( 32 -96 496 1 3.437500 ) ) +) + } + } +// brush 42 +{ +( 8 -576 -128 ) ( -8 -576 -128 ) ( -8 -584 -128 ) eden/genmetal 24 0 0.00 1 1 0 0 0 +( -8 -584 8 ) ( -8 -576 8 ) ( 8 -576 8 ) eden/genmetal 24 0 0.00 1 1 0 0 0 +( -8 -584 8 ) ( 8 -584 8 ) ( 8 -584 -128 ) eden/genmetal 24 0 0.00 1 1 0 0 0 +( 8 -584 8 ) ( 8 -576 8 ) ( 8 -576 -128 ) eden/genmetal 24 0 0.00 1 1 0 0 0 +( 8 -576 8 ) ( -8 -576 8 ) ( -8 -576 -128 ) eden/genmetal 24 0 0.00 1 1 0 0 0 +( -8 -576 8 ) ( -8 -584 8 ) ( -8 -584 -128 ) eden/genmetal 24 0 0.00 1 1 0 0 0 +} +// brush 43 +{ +( 0 -352 8 ) ( 0 -776 8 ) ( 0 -776 -128 ) eden/genmetal 32 0 0.00 1 1 0 0 0 +( 8 -344 8 ) ( -120 -344 8 ) ( -120 -344 -128 ) eden/genmetal 32 0 0.00 1 1 0 0 0 +( 8 -768 8 ) ( 8 -344 8 ) ( 8 -344 -128 ) eden/genmetal 32 0 0.00 1 1 0 0 0 +( 8 -344 -128 ) ( -120 -344 -128 ) ( -120 -768 -128 ) eden/genmetal 32 0 0.00 1 1 0 0 0 +( -120 -576 8 ) ( -120 -344 -112 ) ( 8 -460 -52 ) eden/genmetal 32 0 0.00 1 1 0 0 0 +( 8 -576 -128 ) ( 0 -576 -128 ) ( 4 -576 8 ) eden/genmetal 32 0 0.00 1 1 0 0 0 +} +// brush 44 +{ +( 0 328 0 ) ( -8 328 0 ) ( -8 224 0 ) eden/genmetal 24 0 0.00 1 1 0 0 0 +( -8 224 8 ) ( -8 328 8 ) ( 0 328 8 ) eden/genmetal 24 0 0.00 1 1 0 0 0 +( -16 -576 8 ) ( -8 -576 8 ) ( -8 -576 -128 ) eden/genmetal 24 0 0.00 1 1 0 0 0 +( 0 224 8 ) ( 0 328 8 ) ( 0 328 -128 ) eden/genmetal 24 0 0.00 1 1 0 0 0 +( 0 328 8 ) ( -8 328 8 ) ( -8 328 -128 ) eden/genmetal 24 0 0.00 1 1 0 0 0 +( -8 120 8 ) ( -8 16 8 ) ( -8 16 -128 ) eden/genmetal 24 0 0.00 1 1 0 0 0 +} +// brush 45 +{ +( 8 0 -120 ) ( 0 0 -120 ) ( 0 320 8 ) eden/genmetal 24 0 0.00 1 1 0 0 0 +( 0 0 -128 ) ( 8 0 -128 ) ( 8 512 -128 ) eden/genmetal 24 0 0.00 1 1 0 0 0 +( 8 320 8 ) ( 0 320 8 ) ( 0 512 8 ) eden/genmetal 24 0 0.00 1 1 0 0 0 +( 0 -8 -112 ) ( 0 -8 -128 ) ( 0 512 -128 ) eden/genmetal 32 0 0.00 1 1 0 0 0 +( 8 0 -128 ) ( 0 0 -128 ) ( 0 0 -120 ) eden/genmetal 24 0 0.00 1 1 0 0 0 +( 8 -8 -128 ) ( 8 -8 -112 ) ( 8 312 8 ) eden/genmetal 32 0 0.00 1 1 0 0 0 +( 0 328 -128 ) ( 8 328 -128 ) ( 4 328 8 ) eden/genmetal 32 0 0.00 1 1 0 0 0 +} +// brush 46 +{ +( -544 192 496 ) ( -544 -352 496 ) ( -544 -352 240 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( -512 192 496 ) ( -544 192 496 ) ( -544 192 240 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( -512 -384 496 ) ( -512 160 496 ) ( -512 160 240 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -544 -384 496 ) ( -512 -384 496 ) ( -512 -384 240 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( -544 -352 496 ) ( -544 192 496 ) ( -512 192 496 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( -512 192 288 ) ( -544 192 288 ) ( -544 -352 288 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +} +// brush 47 +{ +( 832 192 544 ) ( 832 -352 544 ) ( 832 -352 288 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( 864 192 496 ) ( 832 192 496 ) ( 832 192 240 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( 864 -384 496 ) ( 864 160 496 ) ( 864 160 240 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( 832 -384 496 ) ( 864 -384 496 ) ( 864 -384 240 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( 832 -352 496 ) ( 832 192 496 ) ( 864 192 496 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( 864 192 288 ) ( 832 192 288 ) ( 832 -352 288 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +} +// brush 48 +{ +( 448 -800 288 ) ( 448 -768 288 ) ( -96 -768 288 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( -96 -768 496 ) ( 448 -768 496 ) ( 448 -800 496 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( -128 -768 544 ) ( -128 -800 544 ) ( -128 -800 288 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( -128 -800 496 ) ( 416 -800 496 ) ( 416 -800 240 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( 448 -800 544 ) ( 448 -768 544 ) ( 448 -768 288 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( 448 -768 496 ) ( -96 -768 496 ) ( -96 -768 240 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +} +// brush 49 +{ +( 448 576 288 ) ( 448 608 288 ) ( -96 608 288 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( -96 608 496 ) ( 448 608 496 ) ( 448 576 496 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( -128 608 544 ) ( -128 576 544 ) ( -128 576 288 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( -128 576 496 ) ( 416 576 496 ) ( 416 576 240 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( 448 576 544 ) ( 448 608 544 ) ( 448 608 288 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( 448 608 496 ) ( -96 608 496 ) ( -96 608 240 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +} +// brush 50 +{ +( 448 -768 544 ) ( 448 -800 544 ) ( 448 -800 288 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( 832 -384 240 ) ( 832 -384 496 ) ( 448 -768 496 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( 864 -384 240 ) ( 864 -384 496 ) ( 832 -384 496 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( 864 -384 496 ) ( 864 -384 240 ) ( 448 -800 240 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( 832 -384 496 ) ( 832 -416 496 ) ( 448 -800 496 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( 832 -416 288 ) ( 832 -384 288 ) ( 448 -768 288 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +} +// brush 51 +{ +( -128 -800 288 ) ( -128 -800 544 ) ( -128 -768 544 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( -128 -768 496 ) ( -512 -384 496 ) ( -512 -384 240 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -512 -384 496 ) ( -544 -384 496 ) ( -544 -384 240 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( -128 -800 240 ) ( -544 -384 240 ) ( -544 -384 496 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( -128 -800 496 ) ( -512 -416 496 ) ( -512 -384 496 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( -128 -768 288 ) ( -512 -384 288 ) ( -512 -416 288 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +} +// brush 52 +{ +( -512 224 288 ) ( -512 192 288 ) ( -128 576 288 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( -512 192 496 ) ( -512 224 496 ) ( -128 608 496 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( -544 192 496 ) ( -544 192 240 ) ( -128 608 240 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( -544 192 240 ) ( -544 192 496 ) ( -512 192 496 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( -512 192 240 ) ( -512 192 496 ) ( -128 576 496 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -128 576 544 ) ( -128 608 544 ) ( -128 608 288 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +} +// brush 53 +{ +( 448 576 288 ) ( 832 192 288 ) ( 832 224 288 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( 448 608 496 ) ( 832 224 496 ) ( 832 192 496 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( 448 608 240 ) ( 864 192 240 ) ( 864 192 496 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( 832 192 496 ) ( 864 192 496 ) ( 864 192 240 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( 448 576 496 ) ( 832 192 496 ) ( 832 192 240 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( 448 608 288 ) ( 448 608 544 ) ( 448 576 544 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +} +// brush 54 +{ +( -512 192 496 ) ( -496 208 496 ) ( -504 200 512 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( 832 -384 480 ) ( 800 -416 480 ) ( 816 -400 736 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( 832 576 736 ) ( -544 576 736 ) ( -544 576 480 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( 832 -768 736 ) ( 832 640 736 ) ( 832 640 480 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( -544 -768 736 ) ( 832 -768 736 ) ( 832 -768 480 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( -544 -768 512 ) ( -544 640 512 ) ( 832 640 512 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( 832 640 496 ) ( -544 640 496 ) ( -544 -768 496 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( 448 576 480 ) ( 480 544 480 ) ( 464 560 736 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( -512 352 480 ) ( -512 432 480 ) ( -512 392 512 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( -128 -768 496 ) ( -144 -752 496 ) ( -136 -760 512 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +} +// brush 55 +{ +( 624 -384.000244 256 ) ( 600 192.000046 256 ) ( 576 -384.000244 256 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -448 -352 400 ) ( -448 -352 384 ) ( -512 -384 384 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -448 -352 384 ) ( -448 -352 400 ) ( -448 160 400 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -448 160 384 ) ( -448 160 400 ) ( -512 192 400 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -512 192 384 ) ( -512 -384 384 ) ( -512 -384 352 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( 544 -384.000244 288 ) ( 576 192.000046 288 ) ( 608 -384.000244 288 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +} +// brush 56 +{ +( 624 -767.999939 256 ) ( 600 -351.999878 256 ) ( 576 -767.999939 256 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -128 -768 400 ) ( -128 -768 384 ) ( -512 -384.000427 384 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -448 -352 384 ) ( -448 -352 400 ) ( -512 -384 400 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -448 -352 400 ) ( -448 -352 384 ) ( -96 -704 384 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -96 -704 224 ) ( -96 -704 208 ) ( -128 -768 208 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( 544 -767.999939 288 ) ( 576 -351.999878 288 ) ( 608 -767.999939 288 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +} +// brush 57 +{ +( -128 -768 352 ) ( -128 -768 384 ) ( 448 -768 384 ) eden/genmetal 32 0 0.00 1 1 0 0 0 +( 416 -704 96 ) ( 416 -704 80 ) ( 448 -768 80 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -96 -704 400 ) ( -96 -704 384 ) ( 416 -704 384 ) eden/genmetal 32 0 0.00 1 1 0 0 0 +( -96 -704 208 ) ( -96 -704 224 ) ( -128 -768 224 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -128 -768 256 ) ( 448 -768 256 ) ( 448 -704 256 ) eden/genmetal 0 -64 90.00 1 1 0 0 0 +( 544 -768 288 ) ( 576 -704 288 ) ( 608 -768 288 ) eden/genmetal 0 -64 90.00 1 1 0 0 0 +} +// brush 58 +{ +( 768 -320 256 ) ( 384 -704 256 ) ( 448 -768 256 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( 416 -704 80 ) ( 416 -704 96 ) ( 448 -768 96 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( 416 -704 96 ) ( 416 -704 80 ) ( 768 -352 80 ) eden/genmetal -32 0 0.00 1 1 0 0 0 +( 768 -352 224 ) ( 768 -352 208 ) ( 832 -384 208 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( 832 -384 384 ) ( 448 -768 384 ) ( 448 -768 400 ) eden/genmetal -32 0 0.00 1 1 0 0 0 +( 544 -768.000061 288 ) ( 576 -352 288 ) ( 608 -768.000061 288 ) eden/genmetal -32 0 0.00 1 1 0 0 0 +} +// brush 59 +{ +( 832 -384 352 ) ( 832 -384 384 ) ( 832 192 384 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( 768 160 96 ) ( 768 160 80 ) ( 832 192 80 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( 768 -352 272 ) ( 768 -352 256 ) ( 768 160 256 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( 768 -352 208 ) ( 768 -352 224 ) ( 832 -384 224 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( 832 -384 256 ) ( 832 192 256 ) ( 768 192 256 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( 544 -384 288 ) ( 576 192.000504 288 ) ( 608 -384 288 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +} +// brush 60 +{ +( 448 576 400 ) ( 448 576 384 ) ( 832 192 384 ) eden/genmetal -64 0 0.00 1 1 0 0 0 +( 768 160 80 ) ( 768 160 96 ) ( 832 192 96 ) eden/genmetal -32 0 0.00 1 1 0 0 0 +( 768 160 272 ) ( 768 160 256 ) ( 416 512 256 ) eden/genmetal -64 0 0.00 1 1 0 0 0 +( 416 512 96 ) ( 416 512 80 ) ( 448 576 80 ) eden/genmetal -32 0 0.00 1 1 0 0 0 +( 448 576 256 ) ( 384 512 256 ) ( 768 128 256 ) eden/genmetal 0 32 0.00 1 1 0 0 0 +( 544 159.999893 288 ) ( 576 576 288 ) ( 608 159.999893 288 ) eden/genmetal 0 32 0.00 1 1 0 0 0 +} +// brush 61 +{ +( 448 576 208 ) ( -128 576 208 ) ( -128 576 176 ) eden/genmetal 32 0 0.00 1 1 0 0 0 +( 416 512 80 ) ( 416 512 96 ) ( 448 576 96 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( 416 512 400 ) ( 416 512 384 ) ( -96 512 384 ) eden/genmetal 32 0 0.00 1 1 0 0 0 +( -96 512 224 ) ( -96 512 208 ) ( -128 576 208 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( 448 512 256 ) ( 448 576 256 ) ( -128 576 256 ) eden/genmetal 0 -64 90.00 1 1 0 0 0 +( 544 512 288 ) ( 576 576 288 ) ( 608 512 288 ) eden/genmetal 0 -64 90.00 1 1 0 0 0 +} +// brush 62 +{ +( 624 159.999817 256 ) ( 600 576 256 ) ( 576 159.999817 256 ) eden/genmetal 0 32 0.00 1 1 0 0 0 +( -96 512 208 ) ( -96 512 224 ) ( -128 576 224 ) eden/genmetal -32 0 0.00 1 1 0 0 0 +( -448 160 384 ) ( -448 160 400 ) ( -96 512 400 ) eden/genmetal -64 0 0.00 1 1 0 0 0 +( -448 160 400 ) ( -448 160 384 ) ( -512 192 384 ) eden/genmetal -32 0 0.00 1 1 0 0 0 +( -512 192 384 ) ( -128 576 384 ) ( -128 576 400 ) eden/genmetal -64 0 0.00 1 1 0 0 0 +( 544 159.999817 288 ) ( 576 576 288 ) ( 608 159.999817 288 ) eden/genmetal -64 0 0.00 1 1 0 0 0 +} +// brush 63 +{ +( 320 192 0 ) ( 320 64 0 ) ( 320 64 -128 ) eden/edentable 64 0 0.00 -1 1 0 0 0 +( 448 192 0 ) ( 320 192 0 ) ( 320 192 -128 ) eden/edentable 64 0 0.00 -1 1 0 0 0 +( 448 64 0 ) ( 448 192 0 ) ( 448 192 -128 ) eden/edentable 64 0 0.00 -1 1 0 0 0 +( 320 64 0 ) ( 448 64 0 ) ( 448 64 -128 ) eden/edentable 64 0 0.00 -1 1 0 0 0 +( 320 64 0 ) ( 320 192 0 ) ( 448 192 0 ) eden/edentable 64 64 0.00 -1 1 0 0 0 +( 448 192 -128 ) ( 320 192 -128 ) ( 320 64 -128 ) eden/edentable 64 64 0.00 -1 1 0 0 0 +} +// brush 64 +{ +( 136 -8 -128 ) ( 136 -8 -112 ) ( 136 312 8 ) eden/genmetal 32 0 0.00 1 1 0 0 0 +( 136 0 -128 ) ( 128 0 -128 ) ( 128 0 -120 ) eden/genmetal 24 0 0.00 1 1 0 0 0 +( 128 -8 -112 ) ( 128 -8 -128 ) ( 128 512 -128 ) eden/genmetal 32 0 0.00 1 1 0 0 0 +( 256 512 8 ) ( 128 512 8 ) ( 128 512 -128 ) eden/genmetal 24 0 0.00 1 1 0 0 0 +( 136 320 8 ) ( 128 320 8 ) ( 128 512 8 ) eden/genmetal 24 0 0.00 1 1 0 0 0 +( 128 0 -128 ) ( 136 0 -128 ) ( 136 512 -128 ) eden/genmetal 24 0 0.00 1 1 0 0 0 +( 136 0 -120 ) ( 128 0 -120 ) ( 128 320 8 ) eden/genmetal 24 0 0.00 1 1 0 0 0 +} +// brush 65 +{ +( 128 -352 8 ) ( 128 -776 8 ) ( 128 -776 -128 ) eden/genmetal 32 0 0.00 1 1 0 0 0 +( 136 -344 8 ) ( 8 -344 8 ) ( 8 -344 -128 ) eden/genmetal 32 0 0.00 1 1 0 0 0 +( 136 -768 8 ) ( 136 -344 8 ) ( 136 -344 -128 ) eden/genmetal 32 0 0.00 1 1 0 0 0 +( 8 -768 8 ) ( 136 -768 8 ) ( 136 -768 -128 ) eden/genmetal 32 0 0.00 1 1 0 0 0 +( 8 -768 8 ) ( 8 -344 8 ) ( 136 -344 8 ) eden/genmetal 32 0 0.00 1 1 0 0 0 +( 136 -344 -128 ) ( 8 -344 -128 ) ( 8 -768 -128 ) eden/genmetal 32 0 0.00 1 1 0 0 0 +( 8 -576 8 ) ( 8 -344 -112 ) ( 136 -460 -52 ) eden/genmetal 32 0 0.00 1 1 0 0 0 +} +// brush 66 +{ +( 0 -352 -96 ) ( 0 -384 -96 ) ( 0 -384 -224 ) eden/FL_edenhouse3 -64 -96 0.00 1 1 0 0 0 +( 128 -352 -96 ) ( 0 -352 -96 ) ( 0 -352 -224 ) eden/FL_edenhouse2 0 -96 0.00 1 1 0 0 0 +( 128 -384 -96 ) ( 128 -352 -96 ) ( 128 -352 -224 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +( 0 -384 -96 ) ( 128 -384 -96 ) ( 128 -384 -224 ) eden/FL_edenhouse3 0 -96 0.00 1 1 0 0 0 +( 0 -384 -112 ) ( 0 -352 -112 ) ( 128 -352 -112 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 0 -304 -128 ) ( 0 -384 -128 ) ( 128 -344 -128 ) eden/FL_edenhouse3 0 64 0.00 1 1 0 0 0 +} +// brush 67 +{ +( 0 -416 -96 ) ( 0 -384 -96 ) ( 128 -384 -96 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 0 -416 -48 ) ( 128 -416 -48 ) ( 128 -416 -176 ) eden/FL_edenhouse3 0 -48 0.00 1 1 0 0 0 +( 128 -416 -48 ) ( 128 -384 -48 ) ( 128 -384 -176 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +( 128 -384 -48 ) ( 0 -384 -48 ) ( 0 -384 -176 ) eden/FL_edenhouse2 0 -48 0.00 1 1 0 0 0 +( 0 -384 -48 ) ( 0 -416 -48 ) ( 0 -416 -176 ) eden/FL_edenhouse3 -32 -48 0.00 1 1 0 0 0 +( 112 -416 -128 ) ( 80 -384 -128 ) ( 48 -416 -128 ) eden/FL_edenhouse3 -32 -48 0.00 1 1 0 0 0 +} +// brush 68 +{ +( 112 -448 -128 ) ( 80 -416 -128 ) ( 48 -448 -128 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 0 -448 -80 ) ( 0 -416 -80 ) ( 128 -416 -80 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 0 -448 -48 ) ( 128 -448 -48 ) ( 128 -448 -176 ) eden/FL_edenhouse3 0 -48 0.00 1 1 0 0 0 +( 128 -448 -48 ) ( 128 -416 -48 ) ( 128 -416 -176 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +( 128 -416 -48 ) ( 0 -416 -48 ) ( 0 -416 -176 ) eden/FL_edenhouse2 0 -48 0.00 1 1 0 0 0 +( 0 -416 -48 ) ( 0 -448 -48 ) ( 0 -448 -176 ) eden/FL_edenhouse3 0 -48 0.00 1 1 0 0 0 +} +// brush 69 +{ +( 0 -480 -64 ) ( 0 -448 -64 ) ( 128 -448 -64 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 0 -480 -48 ) ( 128 -480 -48 ) ( 128 -480 -176 ) eden/FL_edenhouse3 0 -48 0.00 1 1 0 0 0 +( 128 -480 -48 ) ( 128 -448 -48 ) ( 128 -448 -176 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +( 128 -448 -48 ) ( 0 -448 -48 ) ( 0 -448 -176 ) eden/FL_edenhouse2 0 -48 0.00 1 1 0 0 0 +( 0 -448 -48 ) ( 0 -480 -48 ) ( 0 -480 -176 ) eden/FL_edenhouse3 -96 -48 0.00 1 1 0 0 0 +( 112 -480 -128 ) ( 80 -448 -128 ) ( 48 -480 -128 ) eden/FL_edenhouse3 -96 -48 0.00 1 1 0 0 0 +} +// brush 70 +{ +( 0 -480 0 ) ( 0 -512 0 ) ( 0 -512 -128 ) eden/FL_edenhouse3 -64 0 0.00 1 1 0 0 0 +( 128 -480 0 ) ( 0 -480 0 ) ( 0 -480 -128 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +( 128 -512 0 ) ( 128 -480 0 ) ( 128 -480 -128 ) eden/FL_edenhouse2 -64 0 0.00 1 1 0 0 0 +( 0 -512 0 ) ( 128 -512 0 ) ( 128 -512 -128 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 0 -512 -48 ) ( 0 -480 -48 ) ( 128 -480 -48 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 128 -480 -128 ) ( 0 -480 -128 ) ( 0 -512 -128 ) eden/FL_edenhouse3 0 64 0.00 1 1 0 0 0 +} +// brush 71 +{ +( 128 -512 -128 ) ( 0 -512 -128 ) ( 0 -544 -128 ) eden/FL_edenhouse3 0 32 0.00 1 1 0 0 0 +( 0 -544 -32 ) ( 0 -512 -32 ) ( 128 -512 -32 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 0 -544 0 ) ( 128 -544 0 ) ( 128 -544 -128 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 128 -544 0 ) ( 128 -512 0 ) ( 128 -512 -128 ) eden/FL_edenhouse2 -32 0 0.00 1 1 0 0 0 +( 128 -512 0 ) ( 0 -512 0 ) ( 0 -512 -128 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +( 0 -512 0 ) ( 0 -544 0 ) ( 0 -544 -128 ) eden/FL_edenhouse3 -32 0 0.00 1 1 0 0 0 +} +// brush 72 +{ +( 0 -544 0 ) ( 0 -576 0 ) ( 0 -576 -128 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 128 -544 0 ) ( 0 -544 0 ) ( 0 -544 -128 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +( 128 -576 0 ) ( 128 -544 0 ) ( 128 -544 -128 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +( 0 -576 0 ) ( 128 -576 0 ) ( 128 -576 -128 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 0 -576 -16 ) ( 0 -544 -16 ) ( 128 -544 -16 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 128 -544 -128 ) ( 0 -544 -128 ) ( 0 -576 -128 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +} +// brush 73 +{ +( 128 -512 -128 ) ( 0 -512 -128 ) ( 0 -704 -128 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 0 -704 0 ) ( 0 -512 0 ) ( 128 -512 0 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 0 -704 0 ) ( 128 -704 0 ) ( 128 -704 -128 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +( 128 -704 0 ) ( 128 -512 0 ) ( 128 -512 -128 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +( 144 -576 0 ) ( 16 -576 0 ) ( 16 -576 -128 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +( 0 -512 0 ) ( 0 -704 0 ) ( 0 -704 -128 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +} +// brush 74 +{ +( 144 0 -128 ) ( 96 320 -128 ) ( 48 0 -128 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +( 128 0 -128 ) ( 0 0 -128 ) ( 0 320 0 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 128 0 -256 ) ( 128 0 -128 ) ( 128 320 0 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +( 128 320 0 ) ( 0 320 0 ) ( 0 320 -128 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +( 0 0 -128 ) ( 0 0 -256 ) ( 0 320 -128 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +} +// brush 75 +{ +( 0 512 0 ) ( 0 320 0 ) ( 0 320 -128 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 128 512 0 ) ( 0 512 0 ) ( 0 512 -128 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 128 320 0 ) ( 128 512 0 ) ( 128 512 -128 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +( 0 320 0 ) ( 128 320 0 ) ( 128 320 -128 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +( 0 320 0 ) ( 0 512 0 ) ( 128 512 0 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 128 512 -128 ) ( 0 512 -128 ) ( 0 320 -128 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +} +// brush 76 +{ +( 832 -384 -160 ) ( 800 -416 -160 ) ( 816 -400 96 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 832 576 96 ) ( -544 576 96 ) ( -544 576 -160 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 832 -768 96 ) ( 832 640 96 ) ( 832 640 -160 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( -544 -768 96 ) ( 832 -768 96 ) ( 832 -768 -160 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( -544 -768 -128 ) ( -544 640 -128 ) ( 832 640 -128 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 832 640 -160 ) ( -544 640 -160 ) ( -544 -768 -160 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 448 576 -160 ) ( 480 544 -160 ) ( 464 560 96 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 0 336 -160 ) ( 0 416 -160 ) ( 0 376 -128 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +} +// brush 77 +{ +( -512 192 -32 ) ( -480 224 -32 ) ( -496 208 224 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( -512 640 224 ) ( -512 -768 224 ) ( -512 -768 -32 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 832 576 224 ) ( -544 576 224 ) ( -544 576 -32 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( -544 -768 224 ) ( 832 -768 224 ) ( 832 -768 -32 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( -544 -768 0 ) ( -544 640 0 ) ( 832 640 0 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 832 640 -128 ) ( -544 640 -128 ) ( -544 -768 -128 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( -128 -768 -32 ) ( -160 -736 -32 ) ( -144 -752 224 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 0 416 -32 ) ( 0 336 -32 ) ( 0 376 0 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +} +// brush 78 +{ +( -512 192 0 ) ( -128 576 0 ) ( -128 576 16 ) eden/genmetal -64 0 0.00 1 1 0 0 0 +( -448 160 16 ) ( -448 160 0 ) ( -512 192 0 ) eden/genmetal -32 0 0.00 1 1 0 0 0 +( -448 160 0 ) ( -448 160 16 ) ( -96 512 16 ) eden/genmetal -64 0 0.00 1 1 0 0 0 +( -96 512 0 ) ( -96 512 16 ) ( -128 576 16 ) eden/genmetal -32 0 0.00 1 1 0 0 0 +( -448 128 0 ) ( -64 512 0 ) ( -128 576 0 ) eden/genmetal 0 32 0.00 1 1 0 0 0 +( -432 159.999817 8 ) ( -420 576 8 ) ( -408 159.999817 8 ) eden/genmetal 0 32 0.00 1 1 0 0 0 +} +// brush 79 +{ +( 448 512 -128 ) ( 448 576 -128 ) ( -128 576 -128 ) eden/genmetal 0 -64 90.00 1 1 0 0 0 +( -128 576 8 ) ( 448 576 8 ) ( 448 512 8 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -96 512 16 ) ( -96 512 0 ) ( -128 576 0 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( 416 512 16 ) ( 416 512 0 ) ( -96 512 0 ) eden/genmetal 32 0 0.00 1 1 0 0 0 +( 416 512 -128 ) ( 416 512 -112 ) ( 448 576 -112 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( 448 576 0 ) ( -128 576 0 ) ( -128 576 -32 ) eden/genmetal 32 0 0.00 1 1 0 0 0 +} +// brush 80 +{ +( -432 159.999832 8 ) ( -420 576.000183 8 ) ( -408 159.999832 8 ) eden/genmetal 0 32 0.00 1 1 0 0 0 +( 448 576 -128 ) ( 384 512 -128 ) ( 768 128 -128 ) eden/genmetal 0 32 0.00 1 1 0 0 0 +( 416 512 -112 ) ( 416 512 -128 ) ( 448 576 -128 ) eden/genmetal -32 0 0.00 1 1 0 0 0 +( 768 160 -112 ) ( 768 160 -128 ) ( 416 512 -128 ) eden/genmetal -64 0 0.00 1 1 0 0 0 +( 768 160 -128 ) ( 768 160 -112 ) ( 832 192 -112 ) eden/genmetal -32 0 0.00 1 1 0 0 0 +( 448 576 16 ) ( 448 576 0 ) ( 832 192 0 ) eden/genmetal -64 0 0.00 1 1 0 0 0 +} +// brush 81 +{ +( 832 -384 -128 ) ( 832 192 -128 ) ( 768 192 -128 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( 768 192 8 ) ( 832 192 8 ) ( 832 -384 8 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( 768 -352 0 ) ( 768 -352 16 ) ( 832 -384 16 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( 768 -352 -112 ) ( 768 -352 -128 ) ( 768 160 -128 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( 768 160 -112 ) ( 768 160 -128 ) ( 832 192 -128 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( 832 -384 -32 ) ( 832 -384 0 ) ( 832 192 0 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +} +// brush 82 +{ +( -432 -768.000244 8 ) ( -420 -351.999817 8 ) ( -408 -768.000244 8 ) eden/genmetal -32 0 0.00 1 1 0 0 0 +( 832 -384 0 ) ( 448 -768 0 ) ( 448 -768 16 ) eden/genmetal -32 0 0.00 1 1 0 0 0 +( 768 -352 16 ) ( 768 -352 0 ) ( 832 -384 0 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( 416 -704 -112 ) ( 416 -704 -128 ) ( 768 -352 -128 ) eden/genmetal -32 0 0.00 1 1 0 0 0 +( 416 -704 -128 ) ( 416 -704 -112 ) ( 448 -768 -112 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( 768 -320 -128 ) ( 384 -704 -128 ) ( 448 -768 -128 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +} +// brush 83 +{ +( -128 -768 -128 ) ( 448 -768 -128 ) ( 448 -704 -128 ) eden/genmetal 0 -64 90.00 1 1 0 0 0 +( 448 -704 8 ) ( 448 -768 8 ) ( -128 -768 8 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -96 -704 0 ) ( -96 -704 16 ) ( -128 -768 16 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -96 -704 16 ) ( -96 -704 0 ) ( 416 -704 0 ) eden/genmetal 32 0 0.00 1 1 0 0 0 +( 416 -704 -112 ) ( 416 -704 -128 ) ( 448 -768 -128 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -128 -768 -32 ) ( -128 -768 0 ) ( 448 -768 0 ) eden/genmetal 32 0 0.00 1 1 0 0 0 +} +// brush 84 +{ +( -128 -768 0 ) ( -64 -704 0 ) ( -448 -320.000427 0 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -96 -704 16 ) ( -96 -704 0 ) ( -128 -768 0 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -448 -352 16 ) ( -448 -352 0 ) ( -96 -704 0 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -448 -352 0 ) ( -448 -352 16 ) ( -512 -384 16 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -128 -768 16 ) ( -128 -768 0 ) ( -512 -384.000427 0 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -432 -767.999939 8 ) ( -420 -351.999878 8 ) ( -408 -767.999939 8 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +} +// brush 85 +{ +( -512 192 0 ) ( -512 -384 0 ) ( -512 -384 -32 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -448 160 0 ) ( -448 160 16 ) ( -512 192 16 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -448 -352 0 ) ( -448 -352 16 ) ( -448 160 16 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -448 -352 16 ) ( -448 -352 0 ) ( -512 -384 0 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -512 -384 8 ) ( -512 192 8 ) ( -448 192 8 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -448 192 0 ) ( -512 192 0 ) ( -512 -384 0 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +} +// brush 86 +{ +( 448 576 0 ) ( 832 192 0 ) ( 832 224 0 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +( 448 608 256 ) ( 832 224 256 ) ( 832 192 256 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +( 448 608 0 ) ( 864 192 0 ) ( 864 192 256 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +( 832 192 256 ) ( 864 192 256 ) ( 864 192 0 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +( 448 576 256 ) ( 832 192 256 ) ( 832 192 0 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +( 448 608 0 ) ( 448 608 256 ) ( 448 576 256 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +} +// brush 87 +{ +( -512 224 0 ) ( -512 192 0 ) ( -128 576 0 ) eden/WL_edentown2 -64 0 0.00 1 1 0 0 0 +( -512 192 256 ) ( -512 224 256 ) ( -128 608 256 ) eden/WL_edentown2 -64 0 0.00 1 1 0 0 0 +( -544 192 256 ) ( -544 192 0 ) ( -128 608 0 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +( -544 192 0 ) ( -544 192 256 ) ( -512 192 256 ) eden/WL_edentown2 -64 0 0.00 1 1 0 0 0 +( -512 192 0 ) ( -512 192 256 ) ( -128 576 256 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +( -128 576 256 ) ( -128 608 256 ) ( -128 608 0 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +} +// brush 88 +{ +( -128 -800 0 ) ( -128 -800 256 ) ( -128 -768 256 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +( -128 -768 256 ) ( -512 -384 256 ) ( -512 -384 0 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +( -512 -384 256 ) ( -544 -384 256 ) ( -544 -384 0 ) eden/WL_edentown2 -64 0 0.00 1 1 0 0 0 +( -128 -800 0 ) ( -544 -384 0 ) ( -544 -384 256 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +( -128 -800 256 ) ( -512 -416 256 ) ( -512 -384 256 ) eden/WL_edentown2 -64 0 0.00 1 1 0 0 0 +( -128 -768 0 ) ( -512 -384 0 ) ( -512 -416 0 ) eden/WL_edentown2 -64 0 0.00 1 1 0 0 0 +} +// brush 89 +{ +( 448 -768 256 ) ( 448 -800 256 ) ( 448 -800 0 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +( 832 -384 0 ) ( 832 -384 256 ) ( 448 -768 256 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +( 864 -384 0 ) ( 864 -384 256 ) ( 832 -384 256 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +( 864 -384 256 ) ( 864 -384 0 ) ( 448 -800 0 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +( 832 -384 256 ) ( 832 -416 256 ) ( 448 -800 256 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +( 832 -416 0 ) ( 832 -384 0 ) ( 448 -768 0 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +} +// brush 90 +{ +( 448 576 0 ) ( 448 608 0 ) ( -96 608 0 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +( -96 608 256 ) ( 448 608 256 ) ( 448 576 256 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +( -128 608 256 ) ( -128 576 256 ) ( -128 576 0 ) eden/WL_edentown2 -64 0 0.00 1 1 0 0 0 +( -128 576 256 ) ( 416 576 256 ) ( 416 576 0 ) eden/WL_edentown2 64 0 0.00 1 1 0 0 0 +( 448 576 256 ) ( 448 608 256 ) ( 448 608 0 ) eden/WL_edentown2 -64 0 0.00 1 1 0 0 0 +( 448 608 256 ) ( -96 608 256 ) ( -96 608 0 ) eden/WL_edentown2 64 0 -180.00 1 -1 0 0 0 +} +// brush 91 +{ +( 448 -800 0 ) ( 448 -768 0 ) ( -96 -768 0 ) eden/WL_edentown2 32 0 0.00 1 1 0 0 0 +( -96 -768 256 ) ( 448 -768 256 ) ( 448 -800 256 ) eden/WL_edentown2 32 0 0.00 1 1 0 0 0 +( -128 -768 256 ) ( -128 -800 256 ) ( -128 -800 0 ) eden/WL_edentown2 -32 0 0.00 1 1 0 0 0 +( -128 -800 256 ) ( 416 -800 256 ) ( 416 -800 0 ) eden/WL_edentown2 64 0 0.00 1 1 0 0 0 +( 448 -800 256 ) ( 448 -768 256 ) ( 448 -768 0 ) eden/WL_edentown2 -32 0 0.00 1 1 0 0 0 +( 448 -768 256 ) ( -96 -768 256 ) ( -96 -768 0 ) eden/WL_edentown2 63 0 -180.00 1 -1 0 0 0 +} +// brush 92 +{ +( 832 192 256 ) ( 832 -352 256 ) ( 832 -352 0 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +( 864 192 256 ) ( 832 192 256 ) ( 832 192 0 ) eden/WL_edentown2 -96 0 0.00 1 1 0 0 0 +( 864 -384 256 ) ( 864 160 256 ) ( 864 160 0 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +( 832 -384 256 ) ( 864 -384 256 ) ( 864 -384 0 ) eden/WL_edentown2 -96 0 0.00 1 1 0 0 0 +( 832 -352 256 ) ( 832 192 256 ) ( 864 192 256 ) eden/WL_edentown2 -96 0 0.00 1 1 0 0 0 +( 864 192 0 ) ( 832 192 0 ) ( 832 -352 0 ) eden/WL_edentown2 -96 0 0.00 1 1 0 0 0 +} +// brush 93 +{ +( -544 192 256 ) ( -544 -352 256 ) ( -544 -352 0 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +( -512 192 256 ) ( -544 192 256 ) ( -544 192 0 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +( -512 -384 256 ) ( -512 160 256 ) ( -512 160 0 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +( -544 -384 256 ) ( -512 -384 256 ) ( -512 -384 0 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +( -544 -352 256 ) ( -544 192 256 ) ( -512 192 256 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +( -512 192 0 ) ( -544 192 0 ) ( -544 -352 0 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +} +} +// entity 1 +{ +"classname" "Characters_EdenMale_EAtest" +"scale" "1.0" +"model" "edenmale_EAexample.tik" +"origin" "-168.00 -160.00 0.00" +} +// entity 2 +{ +"classname" "light" +"_color" "0.710744 0.987603 1.000000" +"origin" "-500 -96 200" +} +// entity 3 +{ +"origin" "184 424 -128" +"classname" "info_pathnode" +"spawnflags" "4" +} +// entity 4 +{ +"origin" "624 -464 -128" +"angle" "135" +"classname" "info_player_start" +} +// entity 5 +{ +"type" "patchCapped" +"classname" "func_group" +// brush 0 + { + patchDef2 + { + eden/edenmetalwall + ( 9 3 0 536870912 0 ) +( +( ( 32 -96 400 0 0 ) ( 32 -96 448 0 0.406250 ) ( 32 -96 496 0 0.812500 ) ) +( ( 16 -240 400 0.500000 0 ) ( 16 -240 448 0.500000 0.406250 ) ( 16 -240 496 0.500000 0.812500 ) ) +( ( 160 -224 400 1 0 ) ( 160 -224 448 1 0.406250 ) ( 160 -224 496 1 0.812500 ) ) +( ( 304 -240 400 1.500000 0 ) ( 304 -240 448 1.500000 0.406250 ) ( 304 -240 496 1.500000 0.812500 ) ) +( ( 288 -96 400 2 0 ) ( 288 -96 448 2 0.406250 ) ( 288 -96 496 2 0.812500 ) ) +( ( 304 48 400 2.500000 0 ) ( 304 48 448 2.500000 0.406250 ) ( 304 48 496 2.500000 0.812500 ) ) +( ( 160 32 400 3 0 ) ( 160 32 448 3 0.406250 ) ( 160 32 496 3 0.812500 ) ) +( ( 16 48 400 3.500000 0 ) ( 16 48 448 3.500000 0.406250 ) ( 16 48 496 3.500000 0.812500 ) ) +( ( 32 -96 400 4 0 ) ( 32 -96 448 4 0.406250 ) ( 32 -96 496 4 0.812500 ) ) +) + } + } +} +// entity 6 +{ +"classname" "info_pathnode" +"origin" "360 424 -128" +"spawnflags" "4" +} +// entity 7 +{ +"classname" "info_pathnode" +"origin" "184 232 -128" +"spawnflags" "4" +} +// entity 8 +{ +"spawnflags" "6" +"origin" "360 232 -128" +"classname" "info_pathnode" +} +// entity 9 +{ +"classname" "info_pathnode" +"origin" "184 72 -128" +"spawnflags" "4" +} +// entity 10 +{ +"origin" "184 -120 -128" +"classname" "info_pathnode" +} +// entity 11 +{ +"classname" "info_pathnode" +"origin" "360 -120 -128" +"spawnflags" "4" +} +// entity 12 +{ +"origin" "184 -280 -128" +"classname" "info_pathnode" +} +// entity 13 +{ +"classname" "info_pathnode" +"origin" "360 -280 -128" +} +// entity 14 +{ +"classname" "info_pathnode" +"origin" "184 -472 -128" +} +// entity 15 +{ +"origin" "360 -472 -128" +"classname" "info_pathnode" +} +// entity 16 +{ +"classname" "info_pathnode" +"origin" "184 -632 -128" +} +// entity 17 +{ +"origin" "360 -632 -128" +"classname" "info_pathnode" +} +// entity 18 +{ +"origin" "536 -120 -128" +"classname" "info_pathnode" +"spawnflags" "4" +} +// entity 19 +{ +"classname" "info_pathnode" +"origin" "536 -312 -128" +} +// entity 20 +{ +"classname" "info_pathnode" +"origin" "536 -472 -128" +} +// entity 21 +{ +"classname" "info_pathnode" +"origin" "696 88 -128" +"spawnflags" "4" +} +// entity 22 +{ +"classname" "info_pathnode" +"origin" "696 -72 -128" +"spawnflags" "4" +} +// entity 23 +{ +"origin" "696 -264 -128" +"classname" "info_pathnode" +} +// entity 24 +{ +"spawnflags" "4" +"classname" "info_pathnode" +"origin" "536 232 -128" +} +// entity 25 +{ +"spawnflags" "4" +"classname" "info_pathnode" +"origin" "536 40 -128" +} +// entity 26 +{ +"classname" "info_pathnode" +"origin" "72 -280 -128" +} +// entity 27 +{ +"origin" "72 -56 -128" +"classname" "info_pathnode" +} +// entity 28 +{ +"origin" "72 -344 -112" +"classname" "info_pathnode" +} +// entity 29 +{ +"classname" "info_pathnode" +"origin" "72 -408 -80" +} +// entity 30 +{ +"origin" "72 -472 -48" +"classname" "info_pathnode" +} +// entity 31 +{ +"classname" "info_pathnode" +"origin" "72 -536 -16" +} +// entity 32 +{ +"origin" "72 -568 0" +"classname" "info_pathnode" +} +// entity 33 +{ +"classname" "info_pathnode" +"origin" "72 -696 0" +} +// entity 34 +{ +"origin" "-56 -664 0" +"classname" "info_pathnode" +} +// entity 35 +{ +"classname" "info_pathnode" +"origin" "72 -24 -128" +} +// entity 36 +{ +"origin" "72 72 -80" +"classname" "info_pathnode" +} +// entity 37 +{ +"classname" "info_pathnode" +"origin" "72 312 0" +} +// entity 38 +{ +"origin" "72 440 0" +"classname" "info_pathnode" +} +// entity 39 +{ +"classname" "info_pathnode" +"origin" "-88 440 0" +} +// entity 40 +{ +"classname" "info_pathnode" +"origin" "-88 -376 0" +} +// entity 41 +{ +"classname" "info_pathnode" +"origin" "-88 -536 0" +} +// entity 42 +{ +"classname" "info_pathnode" +"origin" "-88 328 0" +} +// entity 43 +{ +"classname" "info_pathnode" +"origin" "-88 168 0" +} +// entity 44 +{ +"origin" "-88 -24 0" +"classname" "info_pathnode" +} +// entity 45 +{ +"origin" "-88 -184 0" +"classname" "info_pathnode" +} +// entity 46 +{ +"origin" "-248 -376 0" +"classname" "info_pathnode" +} +// entity 47 +{ +"origin" "-216 -504 0" +"classname" "info_pathnode" +} +// entity 48 +{ +"origin" "-248 264 0" +"classname" "info_pathnode" +} +// entity 49 +{ +"origin" "-248 168 0" +"classname" "info_pathnode" +} +// entity 50 +{ +"classname" "info_pathnode" +"origin" "-248 -24 0" +} +// entity 51 +{ +"classname" "info_pathnode" +"origin" "-248 -184 0" +} +// entity 52 +{ +"classname" "info_pathnode" +"origin" "-408 -312 0" +} +// entity 53 +{ +"classname" "info_pathnode" +"origin" "-408 104 0" +} +// entity 54 +{ +"origin" "-408 -24 0" +"classname" "info_pathnode" +} +// entity 55 +{ +"origin" "-408 -184 0" +"classname" "info_pathnode" +} +// entity 56 +{ +"spawnflags" "6" +"origin" "360 8 -128" +"classname" "info_pathnode" +} +// entity 57 +{ +"classname" "info_pathnode" +"origin" "72 168 -48" +} +// entity 58 +{ +"origin" "72 256 -16" +"classname" "info_pathnode" +} +// entity 59 +{ +"origin" "-500 -96 112" +"_color" "0.710744 0.987603 1.000000" +"classname" "light" +} +// entity 60 +{ +"origin" "820 -96 200" +"_color" "0.710744 0.987603 1.000000" +"classname" "light" +} +// entity 61 +{ +"classname" "light" +"_color" "0.710744 0.987603 1.000000" +"origin" "820 -96 112" +} +// entity 62 +{ +"origin" "160 564 200" +"_color" "0.710744 0.987603 1.000000" +"classname" "light" +} +// entity 63 +{ +"classname" "light" +"_color" "0.710744 0.987603 1.000000" +"origin" "160 564 112" +} +// entity 64 +{ +"classname" "light" +"_color" "0.710744 0.987603 1.000000" +"origin" "160 -756 200" +} +// entity 65 +{ +"origin" "160 -756 112" +"_color" "0.710744 0.987603 1.000000" +"classname" "light" +} +// entity 66 +{ +"origin" "-308 112 424" +"_color" "1.000000 1.000000 1.000000" +"classname" "light" +} +// entity 67 +{ +"classname" "light" +"_color" "1.000000 1.000000 1.000000" +"origin" "-4 352 424" +} +// entity 68 +{ +"origin" "348 352 424" +"_color" "1.000000 1.000000 1.000000" +"classname" "light" +} +// entity 69 +{ +"classname" "light" +"_color" "1.000000 1.000000 1.000000" +"origin" "620 80 424" +} +// entity 70 +{ +"origin" "636 -288 424" +"_color" "1.000000 1.000000 1.000000" +"classname" "light" +} +// entity 71 +{ +"classname" "light" +"_color" "1.000000 1.000000 1.000000" +"origin" "348 -576 424" +} +// entity 72 +{ +"origin" "-20 -560 424" +"_color" "1.000000 1.000000 1.000000" +"classname" "light" +} +// entity 73 +{ +"classname" "light" +"_color" "1.000000 1.000000 1.000000" +"origin" "-276 -256 424" +} +// entity 74 +{ +"origin" "164 -96 424" +"_color" "1.000000 1.000000 1.000000" +"classname" "light" +} +// entity 75 +{ +"origin" "616 184 -128" +"classname" "info_pathnode" +"spawnflags" "4" +} +// entity 76 +{ +"classname" "info_pathnode" +"origin" "632 -376 -128" +} +// entity 77 +{ +"classname" "info_pathnode" +"origin" "456 344 -128" +"spawnflags" "4" +} +// entity 78 +{ +"origin" "488 -552 -128" +"classname" "info_pathnode" +} diff --git a/fakk/maps/example/cover.prt b/fakk/maps/example/cover.prt new file mode 100644 index 0000000..1133044 --- /dev/null +++ b/fakk/maps/example/cover.prt @@ -0,0 +1,538 @@ +PRT1 +74 +187 +347 +4 0 59 0 (0 24 496 ) (0 576 496 ) (0 576 408 ) (0 24 408 ) +5 0 3 0 (0 576 408 ) (448 576 408 ) (832 192 408 ) (832 24 408 ) (0 24 408 ) +4 0 2 0 (208 24 408 ) (832 24 408 ) (832 24 496 ) (208 24 496 ) +4 0 1 0 (0 24 408 ) (112 24 408 ) (112 24 496 ) (0 24 496 ) +4 1 59 0 (0 0 408 ) (0 0 496 ) (0 24 496 ) (0 24 408 ) +4 1 27 0 (40 0 408 ) (88 0 408 ) (88 0 496 ) (40 0 496 ) +4 1 30 0 (0 0 496 ) (0 0 408 ) (40 0 408 ) (40 0 496 ) +4 1 3 0 (88 0 408 ) (0 0 408 ) (0 24 408 ) (112 24 408 ) +4 2 23 0 (232 0 408 ) (280 0 408 ) (280 0 496 ) (232 0 496 ) +4 2 21 0 (280 0 408 ) (832 0 408 ) (832 0 496 ) (280 0 496 ) +4 2 3 0 (832 24 408 ) (832 0 408 ) (232 0 408 ) (208 24 408 ) +4 3 59 0 (0 0 288 ) (0 0 408 ) (0 576 408 ) (0 576 288 ) +4 3 31 0 (0 0 408 ) (0 0 288 ) (832 0 288 ) (832 0 408 ) +5 3 4 0 (768 0 288 ) (0 0 288 ) (0 512 288 ) (416 512 288 ) (768 160 288 ) +4 4 60 0 (0 0 256 ) (0 0 288 ) (0 512 288 ) (0 512 256 ) +4 4 32 0 (0 0 288 ) (0 0 256 ) (768 0 256 ) (768 0 288 ) +5 4 10 0 (768 0 256 ) (0 0 256 ) (0 512 256 ) (416 512 256 ) (768 160 256 ) +4 5 61 0 (0 568 256 ) (0 576 256 ) (0 576 240 ) (0 568 240 ) +4 5 10 0 (456 568 256 ) (0 568 256 ) (0 568 240 ) (456 568 240 ) +4 5 8 0 (136 568 240 ) (0 568 240 ) (0 576 240 ) (136 576 240 ) +4 5 6 0 (456 568 240 ) (184 568 240 ) (184 576 240 ) (448 576 240 ) +4 6 10 0 (456 568 240 ) (184 568 240 ) (184 568 64 ) (456 568 64 ) +4 6 9 0 (456 568 64 ) (184 568 64 ) (184 576 64 ) (448 576 64 ) +4 7 10 0 (152 568 224 ) (152 568 80 ) (168 568 80 ) (168 568 224 ) +4 8 61 0 (0 576 240 ) (0 576 64 ) (0 568 64 ) (0 568 240 ) +4 8 10 0 (136 568 240 ) (0 568 240 ) (0 568 64 ) (136 568 64 ) +4 8 9 0 (136 568 64 ) (0 568 64 ) (0 576 64 ) (136 576 64 ) +4 9 61 0 (0 576 64 ) (0 576 8 ) (0 568 8 ) (0 568 64 ) +4 9 10 0 (0 568 8 ) (456 568 8 ) (456 568 64 ) (0 568 64 ) +4 10 61 0 (0 0 8 ) (0 0 256 ) (0 568 256 ) (0 568 8 ) +4 10 38 0 (0 0 240 ) (0 0 8 ) (824 0 8 ) (824 0 240 ) +4 10 37 0 (824 0 8 ) (832 0 8 ) (832 0 64 ) (824 0 64 ) +4 10 34 0 (832 0 64 ) (832 0 240 ) (824 0 240 ) (824 0 64 ) +4 10 33 0 (0 0 256 ) (0 0 240 ) (832 0 240 ) (832 0 256 ) +4 10 19 0 (8 328 8 ) (128 328 8 ) (128 320 8 ) (8 320 8 ) +4 10 18 0 (0 328 8 ) (0 512 8 ) (128 512 8 ) (128 328 8 ) +4 10 17 0 (128 0 8 ) (0 0 8 ) (0 320 8 ) (128 320 8 ) +4 10 16 0 (136 0 8 ) (128 0 8 ) (128 320 8 ) (136 320 8 ) +4 10 15 0 (320 0 8 ) (136 0 8 ) (136 512 8 ) (320 512 8 ) +5 10 11 0 (320 64 8 ) (320 512 8 ) (416 512 8 ) (768 160 8 ) (768 64 8 ) +4 10 14 0 (768 0 8 ) (320 0 8 ) (320 64 8 ) (768 64 8 ) +4 11 15 0 (320 512 8 ) (320 512 0 ) (320 64 0 ) (320 64 8 ) +5 11 13 0 (768 64 0 ) (448 64 0 ) (448 192 0 ) (736 192 0 ) (768 160 0 ) +4 11 12 0 (320 192 0 ) (320 512 0 ) (416 512 0 ) (736 192 0 ) +4 11 14 0 (320 64 8 ) (320 64 0 ) (768 64 0 ) (768 64 8 ) +4 12 15 0 (320 512 0 ) (320 512 -128 ) (320 192 -128 ) (320 192 0 ) +4 12 13 0 (736 192 -128 ) (736 192 0 ) (448 192 0 ) (448 192 -128 ) +4 13 14 0 (448 64 -128 ) (768 64 -128 ) (768 64 0 ) (448 64 0 ) +4 14 43 0 (320 0 -128 ) (768 0 -128 ) (768 0 8 ) (320 0 8 ) +4 14 15 0 (320 64 -128 ) (320 0 -128 ) (320 0 8 ) (320 64 8 ) +4 15 43 0 (136 0 -128 ) (320 0 -128 ) (320 0 8 ) (136 0 8 ) +3 15 16 0 (136 0 -120 ) (136 0 8 ) (136 320 8 ) +4 16 43 0 (136 0 -120 ) (136 0 8 ) (128 0 8 ) (128 0 -120 ) +3 16 17 0 (128 0 -120 ) (128 0 8 ) (128 320 8 ) +4 17 55 0 (0 0 8 ) (0 0 -120 ) (8 0 -120 ) (8 0 8 ) +4 17 43 0 (8 0 -120 ) (128 0 -120 ) (128 0 8 ) (8 0 8 ) +4 17 20 0 (128 300 0 ) (128 0 -120 ) (8 0 -120 ) (8 300 0 ) +4 17 19 0 (8 320 8 ) (128 320 8 ) (128 300 0 ) (8 300 0 ) +4 18 62 0 (0 328 8 ) (0 512 8 ) (0 512 0 ) (0 328 0 ) +4 18 19 0 (8 328 0 ) (128 328 0 ) (128 328 8 ) (8 328 8 ) +4 19 20 0 (128 300 0 ) (8 300 0 ) (8 320 0 ) (128 320 0 ) +4 20 43 0 (8 0 -128 ) (128 0 -128 ) (128 0 -120 ) (8 0 -120 ) +5 21 31 0 (280 0 408 ) (832 0 408 ) (832 -384 408 ) (448 -768 408 ) (280 -768 408 ) +4 21 23 0 (280 0 408 ) (280 -48 408 ) (280 -48 496 ) (280 0 496 ) +4 21 22 0 (280 -144 408 ) (280 -216 408 ) (280 -216 496 ) (280 -144 496 ) +4 21 29 0 (280 -216 408 ) (280 -768 408 ) (280 -768 496 ) (280 -216 496 ) +4 22 31 0 (280 -144 408 ) (280 -216 408 ) (232 -216 408 ) (232 -192 408 ) +4 22 25 0 (232 -192 408 ) (232 -216 408 ) (232 -216 496 ) (232 -192 496 ) +4 22 29 0 (232 -216 408 ) (280 -216 408 ) (280 -216 496 ) (232 -216 496 ) +3 23 31 0 (232 0 408 ) (280 0 408 ) (280 -48 408 ) +8 24 31 0 (232 -64 408 ) (232 -128 408 ) (192 -168 408 ) (128 -168 408 ) (88 -128 408 ) (88 -64 408 ) (128 -24 408 ) (192 -24 408 ) +3 25 31 0 (232 -192 408 ) (232 -216 408 ) (208 -216 408 ) +4 25 29 0 (208 -216 408 ) (232 -216 408 ) (232 -216 496 ) (208 -216 496 ) +3 26 31 0 (112 -216 408 ) (88 -216 408 ) (88 -192 408 ) +4 26 28 0 (88 -192 408 ) (88 -216 408 ) (88 -216 496 ) (88 -192 496 ) +4 26 29 0 (88 -216 408 ) (112 -216 408 ) (112 -216 496 ) (88 -216 496 ) +3 27 31 0 (40 0 408 ) (88 0 408 ) (40 -48 408 ) +4 27 30 0 (40 0 408 ) (40 -48 408 ) (40 -48 496 ) (40 0 496 ) +4 28 31 0 (88 -192 408 ) (88 -216 408 ) (40 -216 408 ) (40 -144 408 ) +4 28 29 0 (40 -216 496 ) (40 -216 408 ) (88 -216 408 ) (88 -216 496 ) +4 28 30 0 (40 -144 408 ) (40 -216 408 ) (40 -216 496 ) (40 -144 496 ) +4 29 31 0 (280 -216 408 ) (280 -768 408 ) (40 -768 408 ) (40 -216 408 ) +4 29 30 0 (40 -216 408 ) (40 -768 408 ) (40 -768 496 ) (40 -216 496 ) +4 30 64 0 (0 -768 496 ) (0 0 496 ) (0 0 408 ) (0 -768 408 ) +4 30 31 0 (0 -768 408 ) (0 0 408 ) (40 0 408 ) (40 -768 408 ) +4 31 64 0 (0 -768 408 ) (0 0 408 ) (0 0 288 ) (0 -768 288 ) +5 31 32 0 (0 -704 288 ) (0 0 288 ) (768 0 288 ) (768 -352 288 ) (416 -704 288 ) +4 32 65 0 (0 -704 288 ) (0 0 288 ) (0 0 256 ) (0 -704 256 ) +5 32 33 0 (0 -704 256 ) (0 0 256 ) (768 0 256 ) (768 -352 256 ) (416 -704 256 ) +4 33 66 0 (0 -768 256 ) (0 0 256 ) (0 0 240 ) (0 -768 240 ) +4 33 39 0 (184 -760 240 ) (456 -760 240 ) (448 -768 240 ) (184 -768 240 ) +4 33 41 0 (0 -768 240 ) (0 -760 240 ) (136 -760 240 ) (136 -768 240 ) +5 33 38 0 (0 -760 240 ) (0 0 240 ) (824 0 240 ) (824 -392 240 ) (456 -760 240 ) +4 33 36 0 (832 -120 240 ) (832 -384 240 ) (824 -392 240 ) (824 -120 240 ) +4 33 34 0 (824 0 240 ) (832 0 240 ) (832 -72 240 ) (824 -72 240 ) +4 34 38 0 (824 -72 240 ) (824 0 240 ) (824 0 64 ) (824 -72 64 ) +4 34 37 0 (824 -72 64 ) (824 0 64 ) (832 0 64 ) (832 -72 64 ) +4 35 38 0 (824 -88 224 ) (824 -88 80 ) (824 -104 80 ) (824 -104 224 ) +4 36 38 0 (824 -392 240 ) (824 -120 240 ) (824 -120 64 ) (824 -392 64 ) +4 36 37 0 (824 -392 64 ) (824 -120 64 ) (832 -120 64 ) (832 -384 64 ) +4 37 38 0 (824 0 8 ) (824 -392 8 ) (824 -392 64 ) (824 0 64 ) +4 38 66 0 (0 -760 240 ) (0 0 240 ) (0 0 8 ) (0 -760 8 ) +4 38 58 0 (0 -704 8 ) (0 -584 8 ) (8 -584 8 ) (8 -704 8 ) +4 38 56 0 (0 -576 8 ) (0 -344 8 ) (8 -344 8 ) (8 -576 8 ) +4 38 55 0 (0 -344 8 ) (0 0 8 ) (8 0 8 ) (8 -344 8 ) +4 38 53 0 (128 -704 8 ) (8 -704 8 ) (8 -576 8 ) (128 -576 8 ) +4 38 51 0 (8 -576 8 ) (8 -544 8 ) (128 -544 8 ) (128 -576 8 ) +4 38 49 0 (8 -544 8 ) (8 -512 8 ) (128 -512 8 ) (128 -544 8 ) +4 38 47 0 (8 -512 8 ) (8 -480 8 ) (128 -480 8 ) (128 -512 8 ) +4 38 46 0 (8 -480 8 ) (8 -344 8 ) (128 -344 8 ) (128 -480 8 ) +4 38 45 0 (128 -576 8 ) (128 -344 8 ) (136 -344 8 ) (136 -576 8 ) +5 38 44 0 (768 -344 8 ) (768 -352 8 ) (416 -704 8 ) (136 -704 8 ) (136 -344 8 ) +4 38 43 0 (8 0 8 ) (768 0 8 ) (768 -344 8 ) (8 -344 8 ) +4 38 42 0 (0 -760 8 ) (456 -760 8 ) (456 -760 64 ) (0 -760 64 ) +4 38 40 0 (152 -760 224 ) (152 -760 80 ) (168 -760 80 ) (168 -760 224 ) +4 38 39 0 (456 -760 64 ) (456 -760 240 ) (184 -760 240 ) (184 -760 64 ) +4 38 41 0 (136 -760 240 ) (0 -760 240 ) (0 -760 64 ) (136 -760 64 ) +4 39 42 0 (448 -768 64 ) (184 -768 64 ) (184 -760 64 ) (456 -760 64 ) +4 41 66 0 (0 -768 240 ) (0 -760 240 ) (0 -760 64 ) (0 -768 64 ) +4 41 42 0 (136 -768 64 ) (0 -768 64 ) (0 -760 64 ) (136 -760 64 ) +4 42 66 0 (0 -760 64 ) (0 -760 8 ) (0 -768 8 ) (0 -768 64 ) +4 43 55 0 (8 0 -128 ) (8 -344 -128 ) (8 -344 8 ) (8 0 8 ) +4 43 54 0 (8 -344 -112 ) (8 -344 -128 ) (128 -344 -128 ) (128 -344 -112 ) +4 43 52 0 (8 -344 -96 ) (8 -344 -112 ) (128 -344 -112 ) (128 -344 -96 ) +4 43 50 0 (8 -344 -80 ) (8 -344 -96 ) (128 -344 -96 ) (128 -344 -80 ) +4 43 48 0 (8 -344 -64 ) (8 -344 -80 ) (128 -344 -80 ) (128 -344 -64 ) +4 43 46 0 (8 -344 8 ) (8 -344 -64 ) (128 -344 -64 ) (128 -344 8 ) +4 43 45 0 (136 -344 -112 ) (136 -344 8 ) (128 -344 8 ) (128 -344 -112 ) +4 43 44 0 (136 -344 -128 ) (768 -344 -128 ) (768 -344 8 ) (136 -344 8 ) +3 44 45 0 (136 -344 8 ) (136 -344 -112 ) (136 -576 8 ) +3 45 52 0 (128 -344 -96 ) (128 -344 -112 ) (128 -374.933319 -96 ) +3 45 51 0 (128 -544 -8.551724 ) (128 -576 8 ) (128 -544 8 ) +4 45 50 0 (128 -344 -80 ) (128 -344 -96 ) (128 -374.933319 -96 ) (128 -405.866669 -80 ) +4 45 49 0 (128 -512 -25.103449 ) (128 -544 -8.551724 ) (128 -544 8 ) (128 -512 8 ) +4 45 48 0 (128 -344 -64 ) (128 -344 -80 ) (128 -405.866669 -80 ) (128 -436.799988 -64 ) +4 45 47 0 (128 -480 -41.655170 ) (128 -512 -25.103449 ) (128 -512 8 ) (128 -480 8 ) +5 45 46 0 (128 -344 8 ) (128 -344 -64 ) (128 -436.799988 -64 ) (128 -480 -41.655170 ) (128 -480 8 ) +5 46 57 0 (8 -344 0 ) (8 -344 -64 ) (8 -436.799988 -64 ) (8 -480 -41.655167 ) (8 -480 0 ) +4 46 56 0 (8 -480 8 ) (8 -344 8 ) (8 -344 0 ) (8 -480 0 ) +4 46 48 0 (8 -448 -64 ) (8 -344 -64 ) (128 -344 -64 ) (128 -448 -64 ) +4 46 47 0 (8 -480 8 ) (8 -480 -48 ) (128 -480 -48 ) (128 -480 8 ) +4 47 57 0 (8 -480 0 ) (8 -480 -41.655163 ) (8 -512 -25.103441 ) (8 -512 0 ) +4 47 56 0 (8 -512 8 ) (8 -480 8 ) (8 -480 0 ) (8 -512 0 ) +4 47 49 0 (8 -512 8 ) (8 -512 -32 ) (128 -512 -32 ) (128 -512 8 ) +4 48 57 0 (8 -344 -64 ) (8 -344 -80 ) (8 -405.866638 -80 ) (8 -436.799988 -64 ) +4 48 50 0 (8 -416 -80 ) (8 -344 -80 ) (128 -344 -80 ) (128 -416 -80 ) +4 49 57 0 (8 -512 0 ) (8 -512 -25.103439 ) (8 -544 -8.551716 ) (8 -544 0 ) +4 49 56 0 (8 -544 8 ) (8 -512 8 ) (8 -512 0 ) (8 -544 0 ) +4 49 51 0 (8 -544 8 ) (8 -544 -16 ) (128 -544 -16 ) (128 -544 8 ) +4 50 57 0 (8 -344 -80 ) (8 -344 -96 ) (8 -374.933319 -96 ) (8 -405.866638 -80 ) +4 50 52 0 (8 -384 -96 ) (8 -344 -96 ) (128 -344 -96 ) (128 -384 -96 ) +3 51 57 0 (8 -544 0 ) (8 -544 -8.551715 ) (8 -560.533325 0 ) +4 51 56 0 (8 -576 8 ) (8 -544 8 ) (8 -544 0 ) (8 -560.533325 0 ) +4 51 53 0 (8 -576 8 ) (8 -576 0 ) (128 -576 0 ) (128 -576 8 ) +3 52 57 0 (8 -344 -96 ) (8 -344 -112 ) (8 -374.933319 -96 ) +4 52 54 0 (8 -352 -112 ) (8 -344 -112 ) (128 -344 -112 ) (128 -352 -112 ) +4 53 58 0 (8 -704 0 ) (8 -704 8 ) (8 -584 8 ) (8 -584 0 ) +4 55 57 0 (8 -344 -112 ) (8 -344 0 ) (0 -344 0 ) (0 -344 -112 ) +4 55 56 0 (8 -344 0 ) (8 -344 8 ) (0 -344 8 ) (0 -344 0 ) +4 56 57 0 (0 -560.533325 0 ) (0 -344 0 ) (8 -344 0 ) (8 -560.533325 0 ) +4 58 72 0 (0 -704 8 ) (0 -584 8 ) (0 -584 0 ) (0 -704 0 ) +4 59 64 0 (-512 0 288 ) (0 0 288 ) (0 0 496 ) (-512 0 496 ) +5 59 60 0 (0 0 288 ) (-448 0 288 ) (-448 160 288 ) (-96 512 288 ) (0 512 288 ) +4 60 65 0 (-448 0 256 ) (0 0 256 ) (0 0 288 ) (-448 0 288 ) +5 60 61 0 (0 0 256 ) (-448 0 256 ) (-448 160 256 ) (-96 512 256 ) (0 512 256 ) +4 61 71 0 (-512 0 8 ) (-504 0 8 ) (-504 0 64 ) (-512 0 64 ) +4 61 68 0 (-504 0 64 ) (-504 0 240 ) (-512 0 240 ) (-512 0 64 ) +4 61 67 0 (-504 0 240 ) (-504 0 256 ) (-512 0 256 ) (-512 0 240 ) +4 61 66 0 (-504 0 8 ) (0 0 8 ) (0 0 256 ) (-504 0 256 ) +5 61 63 0 (-8 0 8 ) (-448 0 8 ) (-448 160 8 ) (-96 512 8 ) (-8 512 8 ) +4 61 62 0 (-8 328 8 ) (-8 512 8 ) (0 512 8 ) (0 328 8 ) +4 62 63 0 (-8 512 8 ) (-8 512 0 ) (-8 328 0 ) (-8 328 8 ) +4 63 73 0 (-8 0 8 ) (-448 0 8 ) (-448 0 0 ) (-8 0 0 ) +5 64 65 0 (-448 0 288 ) (0 0 288 ) (0 -704 288 ) (-96 -704 288 ) (-448 -352 288 ) +5 65 66 0 (-448 0 256 ) (0 0 256 ) (0 -704 256 ) (-96 -704 256 ) (-448 -352 256 ) +5 66 73 0 (-448 0 8 ) (-8 0 8 ) (-8 -704 8 ) (-96 -704 8 ) (-448 -352 8 ) +4 66 72 0 (0 -584 8 ) (0 -704 8 ) (-8 -704 8 ) (-8 -584 8 ) +4 66 71 0 (-504 0 8 ) (-504 -392 8 ) (-504 -392 64 ) (-504 0 64 ) +4 66 70 0 (-504 -392 64 ) (-504 -392 240 ) (-504 -120 240 ) (-504 -120 64 ) +4 66 69 0 (-504 -104 80 ) (-504 -104 224 ) (-504 -88 224 ) (-504 -88 80 ) +4 66 68 0 (-504 -72 240 ) (-504 0 240 ) (-504 0 64 ) (-504 -72 64 ) +4 66 67 0 (-504 -392 240 ) (-504 -392 256 ) (-504 0 256 ) (-504 0 240 ) +4 67 70 0 (-512 -384 240 ) (-512 -120 240 ) (-504 -120 240 ) (-504 -392 240 ) +4 67 68 0 (-512 -72 240 ) (-512 0 240 ) (-504 0 240 ) (-504 -72 240 ) +4 68 71 0 (-512 -72 64 ) (-512 0 64 ) (-504 0 64 ) (-504 -72 64 ) +4 70 71 0 (-512 -384 64 ) (-512 -120 64 ) (-504 -120 64 ) (-504 -392 64 ) +4 72 73 0 (-8 -584 0 ) (-8 -704 0 ) (-8 -704 8 ) (-8 -584 8 ) +4 0 (112 24 408 ) (208 24 408 ) (208 24 496 ) (112 24 496 ) +4 0 (448 576 408 ) (0 576 408 ) (0 576 496 ) (448 576 496 ) +5 0 (832 24 496 ) (832 192 496 ) (448 576 496 ) (0 576 496 ) (0 24 496 ) +4 0 (832 24 408 ) (832 192 408 ) (832 192 496 ) (832 24 496 ) +4 0 (832 192 496 ) (832 192 408 ) (448 576 408 ) (448 576 496 ) +4 1 (88 0 408 ) (112 24 408 ) (112 24 496 ) (88 0 496 ) +4 1 (112 24 496 ) (0 24 496 ) (0 0 496 ) (88 0 496 ) +4 2 (832 24 408 ) (832 24 496 ) (832 0 496 ) (832 0 408 ) +4 2 (832 24 496 ) (208 24 496 ) (232 0 496 ) (832 0 496 ) +4 2 (208 24 496 ) (208 24 408 ) (232 0 408 ) (232 0 496 ) +4 3 (416 512 288 ) (512 512 288 ) (768 256 288 ) (768 160 288 ) +4 3 (832 0 288 ) (768 0 288 ) (768 256 288 ) (832 192 288 ) +4 3 (0 512 288 ) (0 576 288 ) (448 576 288 ) (512 512 288 ) +4 3 (832 192 408 ) (832 0 408 ) (832 0 288 ) (832 192 288 ) +4 3 (0 576 408 ) (448 576 408 ) (448 576 288 ) (0 576 288 ) +4 3 (208 24 408 ) (112 24 408 ) (88 0 408 ) (232 0 408 ) +4 3 (448 576 288 ) (448 576 408 ) (832 192 408 ) (832 192 288 ) +4 4 (768 160 288 ) (768 0 288 ) (768 0 256 ) (768 160 256 ) +4 4 (0 512 288 ) (416 512 288 ) (416 512 256 ) (0 512 256 ) +4 4 (768 160 288 ) (768 160 256 ) (416 512 256 ) (416 512 288 ) +4 5 (152 568 240 ) (136 568 240 ) (136 576 240 ) (152 576 240 ) +4 5 (168 568 240 ) (152 568 240 ) (152 572 240 ) (168 572 240 ) +4 5 (152 572 240 ) (152 576 240 ) (168 576 240 ) (168 572 240 ) +4 5 (184 568 240 ) (168 568 240 ) (168 576 240 ) (184 576 240 ) +4 5 (456 568 256 ) (448 576 256 ) (0 576 256 ) (0 568 256 ) +4 5 (448 576 240 ) (0 576 240 ) (0 576 256 ) (448 576 256 ) +4 5 (456 568 256 ) (456 568 240 ) (448 576 240 ) (448 576 256 ) +4 6 (184 576 64 ) (184 568 64 ) (184 568 240 ) (184 576 240 ) +4 6 (448 576 64 ) (184 576 64 ) (184 576 240 ) (448 576 240 ) +4 6 (456 568 64 ) (448 576 64 ) (448 576 240 ) (456 568 240 ) +4 7 (152 568 80 ) (152 568 224 ) (152 572 224 ) (152 572 80 ) +4 7 (168 572 224 ) (168 572 80 ) (152 572 80 ) (152 572 224 ) +4 7 (168 572 80 ) (168 572 224 ) (168 568 224 ) (168 568 80 ) +4 7 (152 568 80 ) (152 572 80 ) (168 572 80 ) (168 568 80 ) +4 7 (168 568 224 ) (168 572 224 ) (152 572 224 ) (152 568 224 ) +4 8 (136 576 64 ) (0 576 64 ) (0 576 240 ) (136 576 240 ) +4 8 (136 576 240 ) (136 568 240 ) (136 568 64 ) (136 576 64 ) +4 9 (0 568 8 ) (0 576 8 ) (448 576 8 ) (456 568 8 ) +4 9 (0 576 64 ) (448 576 64 ) (448 576 8 ) (0 576 8 ) +4 9 (184 576 64 ) (168 576 64 ) (168 568 64 ) (184 568 64 ) +4 9 (168 576 64 ) (152 576 64 ) (152 568 64 ) (168 568 64 ) +4 9 (152 576 64 ) (136 576 64 ) (136 568 64 ) (152 568 64 ) +4 9 (448 576 8 ) (448 576 64 ) (456 568 64 ) (456 568 8 ) +4 10 (0 320 8 ) (0 328 8 ) (8 328 8 ) (8 320 8 ) +4 10 (128 320 8 ) (128 512 8 ) (136 512 8 ) (136 320 8 ) +4 10 (416 512 8 ) (512 512 8 ) (768 256 8 ) (768 160 8 ) +4 10 (0 512 8 ) (0 568 8 ) (456 568 8 ) (512 512 8 ) +4 10 (832 0 8 ) (768 0 8 ) (768 256 8 ) (832 192 8 ) +4 10 (832 192 256 ) (832 0 256 ) (832 0 8 ) (832 192 8 ) +4 10 (152 568 64 ) (136 568 64 ) (136 568 240 ) (152 568 240 ) +4 10 (168 568 224 ) (152 568 224 ) (152 568 240 ) (168 568 240 ) +4 10 (168 568 80 ) (168 568 64 ) (152 568 64 ) (152 568 80 ) +4 10 (184 568 64 ) (168 568 64 ) (168 568 240 ) (184 568 240 ) +4 10 (512 512 256 ) (456 568 256 ) (0 568 256 ) (0 512 256 ) +4 10 (832 192 256 ) (768 256 256 ) (768 0 256 ) (832 0 256 ) +4 10 (768 160 256 ) (768 256 256 ) (512 512 256 ) (416 512 256 ) +4 10 (832 192 256 ) (832 192 8 ) (456 568 8 ) (456 568 256 ) +4 11 (448 64 0 ) (320 64 0 ) (320 192 0 ) (448 192 0 ) +4 11 (768 64 0 ) (768 160 0 ) (768 160 8 ) (768 64 8 ) +4 11 (416 512 0 ) (320 512 0 ) (320 512 8 ) (416 512 8 ) +4 11 (768 160 8 ) (768 160 0 ) (416 512 0 ) (416 512 8 ) +4 12 (448 192 0 ) (320 192 0 ) (320 192 -128 ) (448 192 -128 ) +4 12 (416 512 -128 ) (416 512 0 ) (736 192 0 ) (736 192 -128 ) +4 12 (320 512 0 ) (416 512 0 ) (416 512 -128 ) (320 512 -128 ) +4 12 (320 192 -128 ) (320 512 -128 ) (416 512 -128 ) (736 192 -128 ) +5 13 (768 160 -128 ) (768 64 -128 ) (448 64 -128 ) (448 192 -128 ) (736 192 -128 ) +4 13 (768 160 0 ) (768 64 0 ) (768 64 -128 ) (768 160 -128 ) +4 13 (736 192 0 ) (768 160 0 ) (768 160 -128 ) (736 192 -128 ) +4 13 (448 192 0 ) (448 192 -128 ) (448 64 -128 ) (448 64 0 ) +4 14 (448 64 0 ) (448 64 -128 ) (320 64 -128 ) (320 64 0 ) +4 14 (768 64 -128 ) (768 0 -128 ) (320 0 -128 ) (320 64 -128 ) +4 14 (768 64 -128 ) (768 64 8 ) (768 0 8 ) (768 0 -128 ) +5 15 (136 512 8 ) (136 512 -128 ) (136 0 -128 ) (136 0 -120 ) (136 320 8 ) +4 15 (320 192 0 ) (320 64 0 ) (320 64 -128 ) (320 192 -128 ) +4 15 (136 512 8 ) (320 512 8 ) (320 512 -128 ) (136 512 -128 ) +4 15 (320 0 -128 ) (136 0 -128 ) (136 512 -128 ) (320 512 -128 ) +4 16 (128 0 -120 ) (128 319.998993 8 ) (136 320 8 ) (136 0 -120 ) +4 17 (0 0 0 ) (0 0 8 ) (0 320 8 ) (0 300 0 ) +3 17 (0 0 -120 ) (0 0 0 ) (0 300 0 ) +4 17 (8 0 -120 ) (0 0 -120 ) (0 300 0 ) (8 300 0 ) +4 17 (0 320 8 ) (8 320 8 ) (8 300 0 ) (0 300 0 ) +4 18 (8 512 0 ) (128 512 0 ) (128 328 0 ) (8 328 0 ) +4 18 (0 328 0 ) (0 512 0 ) (8 512 0 ) (8 328 0 ) +4 18 (0 328 0 ) (8 328 0 ) (8 328 8 ) (0 328 8 ) +4 18 (0 512 0 ) (0 512 8 ) (128 512 8 ) (128 512 0 ) +4 18 (128 328 8 ) (128 328 0 ) (128 512 0 ) (128 512 8 ) +4 19 (8 320 0 ) (8 328 0 ) (128 328 0 ) (128 320 0 ) +4 19 (128 328 8 ) (128 320 8 ) (128 300 0 ) (128 328 0 ) +4 19 (8 328 8 ) (8 328 0 ) (8 300 0 ) (8 320 8 ) +4 20 (8 0 -120 ) (8 300 0 ) (8 320 0 ) (8 0 -128 ) +4 20 (128 320 0 ) (128 300 0 ) (128 0 -120 ) (128 0 -128 ) +4 20 (8 0 -128 ) (8 319.998627 0 ) (128 319.998627 0 ) (128 0 -128 ) +4 21 (280 -48 408 ) (280 -144 408 ) (280 -144 496 ) (280 -48 496 ) +4 21 (832 0 496 ) (832 -384 496 ) (832 -384 408 ) (832 0 408 ) +5 21 (280 -768 496 ) (448 -768 496 ) (832 -384 496 ) (832 0 496 ) (280 0 496 ) +4 21 (280 -768 408 ) (448 -768 408 ) (448 -768 496 ) (280 -768 496 ) +4 21 (448 -768 496 ) (448 -768 408 ) (832 -384 408 ) (832 -384 496 ) +4 22 (280 -144 496 ) (280 -144 408 ) (232 -192 408 ) (232 -192 496 ) +4 22 (232 -192 496 ) (232 -216 496 ) (280 -216 496 ) (280 -144 496 ) +3 23 (280 -48 496 ) (280 0 496 ) (232 0 496 ) +4 23 (232 0 496 ) (232 0 408 ) (280 -48 408 ) (280 -48 496 ) +4 24 (88 -64 408 ) (88 -128 408 ) (88 -128 496 ) (88 -64 496 ) +4 24 (128 -168 408 ) (192 -168 408 ) (192 -168 496 ) (128 -168 496 ) +4 24 (192 -168 496 ) (192 -168 408 ) (232 -128 408 ) (232 -128 496 ) +4 24 (88 -128 496 ) (88 -128 408 ) (128 -168 408 ) (128 -168 496 ) +4 24 (232 -64 496 ) (232 -128 496 ) (232 -128 408 ) (232 -64 408 ) +8 24 (192 -24 496 ) (128 -24 496 ) (88 -64 496 ) (88 -128 496 ) (128 -168 496 ) (192 -168 496 ) (232 -128 496 ) (232 -64 496 ) +4 24 (128 -24 496 ) (192 -24 496 ) (192 -24 408 ) (128 -24 408 ) +4 24 (128 -24 496 ) (128 -24 408 ) (88 -64 408 ) (88 -64 496 ) +4 24 (232 -64 496 ) (232 -64 408 ) (192 -24 408 ) (192 -24 496 ) +4 25 (232 -192 496 ) (232 -192 408 ) (208 -216 408 ) (208 -216 496 ) +3 25 (208 -216 496 ) (232 -216 496 ) (232 -192 496 ) +3 26 (88 -192 496 ) (88 -216 496 ) (112 -216 496 ) +4 26 (112 -216 496 ) (112 -216 408 ) (88 -192 408 ) (88 -192 496 ) +4 27 (40 -48 496 ) (40 -48 408 ) (88 0 408 ) (88 0 496 ) +3 27 (40 -48 496 ) (88 0 496 ) (40 0 496 ) +4 28 (40 -144 496 ) (40 -216 496 ) (88 -216 496 ) (88 -192 496 ) +4 28 (88 -192 496 ) (88 -192 408 ) (40 -144 408 ) (40 -144 496 ) +4 29 (112 -216 496 ) (208 -216 496 ) (208 -216 408 ) (112 -216 408 ) +4 29 (40 -768 408 ) (280 -768 408 ) (280 -768 496 ) (40 -768 496 ) +4 29 (40 -216 496 ) (40 -768 496 ) (280 -768 496 ) (280 -216 496 ) +4 30 (40 -48 496 ) (40 -144 496 ) (40 -144 408 ) (40 -48 408 ) +4 30 (40 -768 496 ) (40 0 496 ) (0 0 496 ) (0 -768 496 ) +4 30 (0 -768 408 ) (40 -768 408 ) (40 -768 496 ) (0 -768 496 ) +4 31 (768 -352 288 ) (768 -448 288 ) (512 -704 288 ) (416 -704 288 ) +4 31 (0 -768 288 ) (0 -704 288 ) (512 -704 288 ) (448 -768 288 ) +4 31 (768 0 288 ) (832 0 288 ) (832 -384 288 ) (768 -448 288 ) +4 31 (832 0 408 ) (832 -384 408 ) (832 -384 288 ) (832 0 288 ) +4 31 (232 -192 408 ) (280 -144 408 ) (280 -48 408 ) (232 0 408 ) +4 31 (88 -24 408 ) (232 -24 408 ) (232 0 408 ) (88 0 408 ) +3 31 (88 -128 408 ) (88 -168 408 ) (128 -168 408 ) +3 31 (128 -24 408 ) (88 -24 408 ) (88 -64 408 ) +3 31 (192 -168 408 ) (232 -168 408 ) (232 -128 408 ) +3 31 (192 -24 408 ) (232 -64 408 ) (232 -24 408 ) +6 31 (88 -168 408 ) (88 -192 408 ) (112 -216 408 ) (208 -216 408 ) (232 -192 408 ) (232 -168 408 ) +4 31 (40 -48 408 ) (40 -144 408 ) (88 -192 408 ) (88 0 408 ) +4 31 (0 -768 288 ) (448 -768 288 ) (448 -768 408 ) (0 -768 408 ) +4 31 (448 -768 408 ) (448 -768 288 ) (832 -384 288 ) (832 -384 408 ) +4 32 (0 -704 256 ) (416 -704 256 ) (416 -704 288 ) (0 -704 288 ) +4 32 (768 0 288 ) (768 -352 288 ) (768 -352 256 ) (768 0 256 ) +4 32 (416 -704 288 ) (416 -704 256 ) (768 -352 256 ) (768 -352 288 ) +4 33 (152 -760 240 ) (168 -760 240 ) (168 -764 240 ) (152 -764 240 ) +4 33 (168 -760 240 ) (184 -760 240 ) (184 -764 240 ) (168 -764 240 ) +4 33 (184 -764 240 ) (184 -768 240 ) (152 -768 240 ) (152 -764 240 ) +4 33 (136 -760 240 ) (152 -760 240 ) (152 -768 240 ) (136 -768 240 ) +4 33 (832 -104 240 ) (832 -120 240 ) (824 -120 240 ) (824 -104 240 ) +4 33 (828 -104 240 ) (824 -104 240 ) (824 -88 240 ) (828 -88 240 ) +4 33 (832 -88 240 ) (832 -104 240 ) (828 -104 240 ) (828 -88 240 ) +4 33 (832 -72 240 ) (832 -88 240 ) (824 -88 240 ) (824 -72 240 ) +4 33 (832 0 256 ) (832 -384 256 ) (832 -384 240 ) (832 0 240 ) +4 33 (768 -448 256 ) (832 -384 256 ) (832 0 256 ) (768 0 256 ) +4 33 (448 -768 256 ) (512 -704 256 ) (0 -704 256 ) (0 -768 256 ) +4 33 (416 -704 256 ) (512 -704 256 ) (768 -448 256 ) (768 -352 256 ) +4 33 (0 -768 240 ) (448 -768 240 ) (448 -768 256 ) (0 -768 256 ) +4 33 (448 -768 256 ) (448 -768 240 ) (832 -384 240 ) (832 -384 256 ) +4 34 (832 0 240 ) (832 -72 240 ) (832 -72 64 ) (832 0 64 ) +4 34 (824 -72 240 ) (824 -72 64 ) (832 -72 64 ) (832 -72 240 ) +4 35 (824 -104 224 ) (824 -104 80 ) (828 -104 80 ) (828 -104 224 ) +4 35 (828 -104 224 ) (828 -104 80 ) (828 -88 80 ) (828 -88 224 ) +4 35 (828 -88 224 ) (828 -88 80 ) (824 -88 80 ) (824 -88 224 ) +4 35 (828 -104 80 ) (824 -104 80 ) (824 -88 80 ) (828 -88 80 ) +4 35 (824 -104 224 ) (828 -104 224 ) (828 -88 224 ) (824 -88 224 ) +4 36 (832 -120 240 ) (832 -120 64 ) (824 -120 64 ) (824 -120 240 ) +4 36 (832 -120 240 ) (832 -384 240 ) (832 -384 64 ) (832 -120 64 ) +4 36 (824 -392 240 ) (824 -392 64 ) (832 -384 64 ) (832 -384 240 ) +4 37 (824 0 8 ) (832 0 8 ) (832 -384 8 ) (824 -392 8 ) +4 37 (832 0 64 ) (832 -384 64 ) (832 -384 8 ) (832 0 8 ) +4 37 (832 -120 64 ) (832 -104 64 ) (824 -104 64 ) (824 -120 64 ) +4 37 (832 -104 64 ) (832 -88 64 ) (824 -88 64 ) (824 -104 64 ) +4 37 (832 -88 64 ) (832 -72 64 ) (824 -72 64 ) (824 -88 64 ) +4 37 (832 -384 8 ) (832 -384 64 ) (824 -392 64 ) (824 -392 8 ) +4 38 (0 -584 8 ) (0 -576 8 ) (8 -576 8 ) (8 -584 8 ) +4 38 (136 -704 8 ) (128 -704 8 ) (128 -576 8 ) (136 -576 8 ) +4 38 (768 -352 8 ) (768 -448 8 ) (512 -704 8 ) (416 -704 8 ) +4 38 (768 0 8 ) (824 0 8 ) (824 -392 8 ) (768 -448 8 ) +4 38 (0 -760 8 ) (0 -704 8 ) (512 -704 8 ) (456 -760 8 ) +4 38 (152 -760 80 ) (152 -760 64 ) (168 -760 64 ) (168 -760 80 ) +4 38 (168 -760 240 ) (152 -760 240 ) (152 -760 224 ) (168 -760 224 ) +4 38 (184 -760 240 ) (168 -760 240 ) (168 -760 64 ) (184 -760 64 ) +4 38 (152 -760 240 ) (136 -760 240 ) (136 -760 64 ) (152 -760 64 ) +4 38 (824 -120 64 ) (824 -104 64 ) (824 -104 240 ) (824 -120 240 ) +4 38 (824 -104 224 ) (824 -88 224 ) (824 -88 240 ) (824 -104 240 ) +4 38 (824 -104 80 ) (824 -104 64 ) (824 -88 64 ) (824 -88 80 ) +4 38 (824 -88 64 ) (824 -72 64 ) (824 -72 240 ) (824 -88 240 ) +4 38 (456 -760 240 ) (456 -760 8 ) (824 -392 8 ) (824 -392 240 ) +4 39 (184 -760 240 ) (184 -760 64 ) (184 -764 64 ) (184 -764 240 ) +4 39 (184 -764 64 ) (184 -768 64 ) (184 -768 240 ) (184 -764 240 ) +4 39 (448 -768 240 ) (184 -768 240 ) (184 -768 64 ) (448 -768 64 ) +4 39 (448 -768 240 ) (448 -768 64 ) (456 -760 64 ) (456 -760 240 ) +4 40 (152 -760 224 ) (152 -764 224 ) (168 -764 224 ) (168 -760 224 ) +4 40 (152 -764 224 ) (152 -764 80 ) (168 -764 80 ) (168 -764 224 ) +4 40 (152 -760 224 ) (152 -760 80 ) (152 -764 80 ) (152 -764 224 ) +4 40 (168 -764 224 ) (168 -764 80 ) (168 -760 80 ) (168 -760 224 ) +4 40 (168 -760 80 ) (168 -764 80 ) (152 -764 80 ) (152 -760 80 ) +4 41 (136 -768 240 ) (136 -768 64 ) (136 -760 64 ) (136 -760 240 ) +4 41 (136 -768 240 ) (0 -768 240 ) (0 -768 64 ) (136 -768 64 ) +4 42 (0 -768 8 ) (0 -760 8 ) (456 -760 8 ) (448 -768 8 ) +4 42 (0 -768 8 ) (448 -768 8 ) (448 -768 64 ) (0 -768 64 ) +4 42 (152 -760 64 ) (136 -760 64 ) (136 -768 64 ) (152 -768 64 ) +4 42 (184 -764 64 ) (152 -764 64 ) (152 -768 64 ) (184 -768 64 ) +4 42 (168 -764 64 ) (184 -764 64 ) (184 -760 64 ) (168 -760 64 ) +4 42 (168 -764 64 ) (168 -760 64 ) (152 -760 64 ) (152 -764 64 ) +4 42 (456 -760 8 ) (456 -760 64 ) (448 -768 64 ) (448 -768 8 ) +4 43 (128 -344 -128 ) (136 -344 -128 ) (136 -344 -112 ) (128 -344 -112 ) +4 43 (768 0 8 ) (768 -344 8 ) (768 -344 -128 ) (768 0 -128 ) +4 43 (128 0 -120 ) (136 0 -120 ) (136 0 -128 ) (128 0 -128 ) +4 43 (8 0 -128 ) (768 0 -128 ) (768 -344 -128 ) (8 -344 -128 ) +5 44 (136 -344 -112 ) (136 -344 -128 ) (136 -704 -128 ) (136 -704 8 ) (136 -576 8 ) +5 44 (768 -344 -128 ) (768 -352 -128 ) (416 -704 -128 ) (136 -704 -128 ) (136 -344 -128 ) +4 44 (136 -704 -128 ) (416 -704 -128 ) (416 -704 8 ) (136 -704 8 ) +4 44 (768 -344 8 ) (768 -352 8 ) (768 -352 -128 ) (768 -344 -128 ) +4 44 (416 -704 8 ) (416 -704 -128 ) (768 -352 -128 ) (768 -352 8 ) +4 45 (128 -576 8 ) (128 -344 -112 ) (136 -344 -112 ) (136 -576 8 ) +3 46 (8 -436.799988 -64 ) (8 -480 -64 ) (8 -480 -41.655167 ) +4 46 (8 -480 -64 ) (8 -448 -64 ) (128 -448 -64 ) (128 -480 -64 ) +4 46 (8 -480 -48 ) (8 -480 -64 ) (128 -480 -64 ) (128 -480 -48 ) +3 46 (128 -480 -64 ) (128 -436.799988 -64 ) (128 -480 -41.655167 ) +4 47 (8 -480 -41.655163 ) (8 -480 -48 ) (8 -512 -48 ) (8 -512 -25.103441 ) +4 47 (8 -512 -32 ) (8 -512 -48 ) (128 -512 -48 ) (128 -512 -32 ) +4 47 (128 -512 -48 ) (128 -480 -48 ) (128 -480 -41.655167 ) (128 -512 -25.103443 ) +4 47 (128 -512 -48 ) (8 -512 -48 ) (8 -480 -48 ) (128 -480 -48 ) +4 48 (8 -405.866638 -80 ) (8 -448 -80 ) (8 -448 -64 ) (8 -436.799988 -64 ) +4 48 (8 -448 -80 ) (8 -416 -80 ) (128 -416 -80 ) (128 -448 -80 ) +4 48 (128 -448 -64 ) (128 -448 -80 ) (128 -405.866638 -80 ) (128 -436.799988 -64 ) +4 48 (8 -448 -80 ) (128 -448 -80 ) (128 -448 -64 ) (8 -448 -64 ) +4 49 (8 -512 -25.103439 ) (8 -512 -32 ) (8 -544 -32 ) (8 -544 -8.551716 ) +4 49 (8 -544 -16 ) (8 -544 -32 ) (128 -544 -32 ) (128 -544 -16 ) +4 49 (128 -544 -32 ) (128 -512 -32 ) (128 -512 -25.103443 ) (128 -544 -8.551723 ) +4 49 (128 -544 -32 ) (8 -544 -32 ) (8 -512 -32 ) (128 -512 -32 ) +4 50 (8 -374.933319 -96 ) (8 -416 -96 ) (8 -416 -80 ) (8 -405.866638 -80 ) +4 50 (8 -416 -96 ) (8 -384 -96 ) (128 -384 -96 ) (128 -416 -96 ) +4 50 (128 -416 -80 ) (128 -416 -96 ) (128 -374.933319 -96 ) (128 -405.866638 -80 ) +4 50 (8 -416 -96 ) (128 -416 -96 ) (128 -416 -80 ) (8 -416 -80 ) +5 51 (8 -544 -8.551715 ) (8 -544 -16 ) (8 -576 -16 ) (8 -576 0 ) (8 -560.533325 0 ) +3 51 (8 -576 8 ) (8 -560.533325 0 ) (8 -576 0 ) +4 51 (8 -576 0 ) (8 -576 -16 ) (128 -576 -16 ) (128 -576 0 ) +4 51 (128 -544 -16 ) (128 -544 -8.551723 ) (128 -576 8 ) (128 -576 -16 ) +4 51 (128 -576 -16 ) (8 -576 -16 ) (8 -544 -16 ) (128 -544 -16 ) +4 52 (8 -344 -112 ) (8 -384 -112 ) (8 -384 -96 ) (8 -374.933319 -96 ) +4 52 (8 -384 -112 ) (8 -352 -112 ) (128 -352 -112 ) (128 -384 -112 ) +4 52 (128 -374.933319 -96 ) (128 -384 -96 ) (128 -384 -112 ) (128 -344 -112 ) +4 52 (8 -384 -112 ) (128 -384 -112 ) (128 -384 -96 ) (8 -384 -96 ) +4 53 (8 -584 8 ) (8 -576 8 ) (8 -576 0 ) (8 -584 0 ) +4 53 (128 -704 0 ) (128 -704 8 ) (8 -704 8 ) (8 -704 0 ) +4 53 (128 -576 0 ) (128 -576 8 ) (128 -704 8 ) (128 -704 0 ) +4 53 (8 -704 0 ) (8 -576 0 ) (128 -576 0 ) (128 -704 0 ) +4 54 (8 -344 -128 ) (8 -352 -128 ) (8 -352 -112 ) (8 -344 -112 ) +4 54 (128 -352 -112 ) (128 -352 -128 ) (128 -344 -128 ) (128 -344 -112 ) +4 54 (8 -352 -128 ) (8 -344 -128 ) (128 -344 -128 ) (128 -352 -128 ) +4 54 (128 -352 -128 ) (128 -352 -112 ) (8 -352 -112 ) (8 -352 -128 ) +4 55 (0 -344 8 ) (0 0 8 ) (0 0 0 ) (0 -344 0 ) +4 55 (0 0 0 ) (0 0 -128 ) (0 -344 -128 ) (0 -344 0 ) +4 55 (0 -344 -128 ) (8 -344 -128 ) (8 -344 -112 ) (0 -344 -112 ) +4 55 (0 -344 -128 ) (0 0 -128 ) (8 0 -128 ) (8 -344 -128 ) +4 55 (8 0 -120 ) (8 0 -128 ) (0 0 -128 ) (0 0 -120 ) +4 56 (0 -576 8 ) (0 -344 8 ) (0 -344 0 ) (0 -560.533325 0 ) +4 56 (0 -560.532898 0 ) (8 -560.532898 0 ) (8 -576 8 ) (0 -576 8 ) +3 57 (0 -344 0 ) (0 -344 -112 ) (0 -560.533325 0 ) +4 57 (8 -560.532898 0 ) (0 -560.532898 0 ) (0 -344 -112 ) (8 -344 -112 ) +4 58 (8 -704 0 ) (8 -704 8 ) (0 -704 8 ) (0 -704 0 ) +4 58 (0 -584 0 ) (0 -584 8 ) (8 -584 8 ) (8 -584 0 ) +4 58 (0 -584 0 ) (8 -584 0 ) (8 -704 0 ) (0 -704 0 ) +4 59 (-448 160 288 ) (-448 256 288 ) (-192 512 288 ) (-96 512 288 ) +4 59 (-448 0 288 ) (-512 0 288 ) (-512 192 288 ) (-448 256 288 ) +4 59 (-192 512 288 ) (-128 576 288 ) (0 576 288 ) (0 512 288 ) +4 59 (-128 576 496 ) (0 576 496 ) (0 576 288 ) (-128 576 288 ) +5 59 (0 576 496 ) (-128 576 496 ) (-512 192 496 ) (-512 0 496 ) (0 0 496 ) +4 59 (-512 192 288 ) (-512 0 288 ) (-512 0 496 ) (-512 192 496 ) +4 59 (-128 576 496 ) (-128 576 288 ) (-512 192 288 ) (-512 192 496 ) +4 60 (-448 160 256 ) (-448 0 256 ) (-448 0 288 ) (-448 160 288 ) +4 60 (-96 512 288 ) (0 512 288 ) (0 512 256 ) (-96 512 256 ) +4 60 (-96 512 288 ) (-96 512 256 ) (-448 160 256 ) (-448 160 288 ) +4 61 (-448 160 8 ) (-448 256 8 ) (-192 512 8 ) (-96 512 8 ) +4 61 (0 0 8 ) (-8 0 8 ) (-8 328 8 ) (0 328 8 ) +4 61 (-192 512 8 ) (-128 576 8 ) (0 576 8 ) (0 512 8 ) +4 61 (-448 0 8 ) (-512 0 8 ) (-512 192 8 ) (-448 256 8 ) +4 61 (-512 192 8 ) (-512 0 8 ) (-512 0 256 ) (-512 192 256 ) +4 61 (-192 512 256 ) (0 512 256 ) (0 576 256 ) (-128 576 256 ) +4 61 (-448 256 256 ) (-512 192 256 ) (-512 0 256 ) (-448 0 256 ) +4 61 (-96 512 256 ) (-192 512 256 ) (-448 256 256 ) (-448 160 256 ) +4 61 (-128 576 256 ) (0 576 256 ) (0 576 8 ) (-128 576 8 ) +4 61 (-128 576 256 ) (-128 576 8 ) (-512 192 8 ) (-512 192 256 ) +4 62 (-8 512 8 ) (0 512 8 ) (0 512 0 ) (-8 512 0 ) +4 62 (-8 328 0 ) (-8 512 0 ) (0 512 0 ) (0 328 0 ) +4 62 (-8 328 8 ) (-8 328 0 ) (0 328 0 ) (0 328 8 ) +4 63 (-96 512 8 ) (-8 512 8 ) (-8 512 0 ) (-96 512 0 ) +4 63 (-448 0 0 ) (-448 0 8 ) (-448 160 8 ) (-448 160 0 ) +5 63 (-8 0 0 ) (-448 0 0 ) (-448 160 0 ) (-96 512 0 ) (-8 512 0 ) +4 63 (-8 328 8 ) (-8 0 8 ) (-8 0 0 ) (-8 328 0 ) +4 63 (-96 512 8 ) (-96 512 0 ) (-448 160 0 ) (-448 160 8 ) +4 64 (-96 -704 288 ) (-192 -704 288 ) (-448 -448 288 ) (-448 -352 288 ) +4 64 (-512 0 288 ) (-448 0 288 ) (-448 -448 288 ) (-512 -384 288 ) +4 64 (0 -704 288 ) (0 -768 288 ) (-128 -768 288 ) (-192 -704 288 ) +4 64 (-128 -768 288 ) (0 -768 288 ) (0 -768 496 ) (-128 -768 496 ) +5 64 (-512 -384 496 ) (-128 -768 496 ) (0 -768 496 ) (0 0 496 ) (-512 0 496 ) +4 64 (-512 0 288 ) (-512 -384 288 ) (-512 -384 496 ) (-512 0 496 ) +4 64 (-512 -384 496 ) (-512 -384 288 ) (-128 -768 288 ) (-128 -768 496 ) +4 65 (-448 0 256 ) (-448 -352 256 ) (-448 -352 288 ) (-448 0 288 ) +4 65 (-96 -704 256 ) (0 -704 256 ) (0 -704 288 ) (-96 -704 288 ) +4 65 (-448 -352 288 ) (-448 -352 256 ) (-96 -704 256 ) (-96 -704 288 ) +4 66 (-96 -704 8 ) (-192 -704 8 ) (-448 -448 8 ) (-448 -352 8 ) +4 66 (-8 0 8 ) (0 0 8 ) (0 -584 8 ) (-8 -584 8 ) +4 66 (0 -704 8 ) (0 -768 8 ) (-128 -768 8 ) (-192 -704 8 ) +4 66 (-504 0 8 ) (-448 0 8 ) (-448 -448 8 ) (-504 -392 8 ) +4 66 (-504 -88 64 ) (-504 -104 64 ) (-504 -104 80 ) (-504 -88 80 ) +4 66 (-504 -72 224 ) (-504 -72 64 ) (-504 -88 64 ) (-504 -88 224 ) +4 66 (-504 -104 240 ) (-504 -72 240 ) (-504 -72 224 ) (-504 -104 224 ) +4 66 (-504 -120 240 ) (-504 -104 240 ) (-504 -104 64 ) (-504 -120 64 ) +4 66 (-128 -768 8 ) (0 -768 8 ) (0 -768 256 ) (-128 -768 256 ) +4 66 (-128 -768 256 ) (0 -768 256 ) (0 -704 256 ) (-192 -704 256 ) +4 66 (-504 -392 256 ) (-448 -448 256 ) (-448 0 256 ) (-504 0 256 ) +4 66 (-448 -352 256 ) (-448 -448 256 ) (-192 -704 256 ) (-96 -704 256 ) +4 66 (-504 -392 256 ) (-504 -392 8 ) (-128 -768 8 ) (-128 -768 256 ) +4 67 (-508 -72 240 ) (-504 -72 240 ) (-504 -104 240 ) (-508 -104 240 ) +4 67 (-504 -104 240 ) (-504 -120 240 ) (-508 -120 240 ) (-508 -104 240 ) +4 67 (-512 -120 240 ) (-512 -72 240 ) (-508 -72 240 ) (-508 -120 240 ) +4 67 (-512 -384 256 ) (-504 -392 256 ) (-504 0 256 ) (-512 0 256 ) +4 67 (-512 -384 256 ) (-512 0 256 ) (-512 0 240 ) (-512 -384 240 ) +4 67 (-512 -384 256 ) (-512 -384 240 ) (-504 -392 240 ) (-504 -392 256 ) +4 68 (-508 -72 64 ) (-504 -72 64 ) (-504 -72 224 ) (-508 -72 224 ) +4 68 (-504 -72 224 ) (-504 -72 240 ) (-508 -72 240 ) (-508 -72 224 ) +4 68 (-512 -72 64 ) (-508 -72 64 ) (-508 -72 240 ) (-512 -72 240 ) +4 68 (-512 -72 240 ) (-512 0 240 ) (-512 0 64 ) (-512 -72 64 ) +4 69 (-504 -88 80 ) (-508 -88 80 ) (-508 -88 224 ) (-504 -88 224 ) +4 69 (-508 -104 224 ) (-508 -104 80 ) (-504 -104 80 ) (-504 -104 224 ) +4 69 (-508 -104 80 ) (-508 -104 224 ) (-508 -88 224 ) (-508 -88 80 ) +4 69 (-504 -88 224 ) (-508 -88 224 ) (-508 -104 224 ) (-504 -104 224 ) +4 69 (-504 -104 80 ) (-508 -104 80 ) (-508 -88 80 ) (-504 -88 80 ) +4 70 (-512 -384 240 ) (-512 -120 240 ) (-512 -120 64 ) (-512 -384 64 ) +4 70 (-512 -120 240 ) (-508 -120 240 ) (-508 -120 64 ) (-512 -120 64 ) +4 70 (-508 -120 240 ) (-504 -120 240 ) (-504 -120 64 ) (-508 -120 64 ) +4 70 (-512 -384 64 ) (-504 -392 64 ) (-504 -392 240 ) (-512 -384 240 ) +4 71 (-512 0 8 ) (-504 0 8 ) (-504 -392 8 ) (-512 -384 8 ) +4 71 (-512 0 8 ) (-512 -384 8 ) (-512 -384 64 ) (-512 0 64 ) +4 71 (-508 -120 64 ) (-508 -72 64 ) (-512 -72 64 ) (-512 -120 64 ) +4 71 (-508 -104 64 ) (-508 -120 64 ) (-504 -120 64 ) (-504 -104 64 ) +4 71 (-508 -88 64 ) (-504 -88 64 ) (-504 -72 64 ) (-508 -72 64 ) +4 71 (-508 -88 64 ) (-508 -104 64 ) (-504 -104 64 ) (-504 -88 64 ) +4 71 (-504 -392 8 ) (-504 -392 64 ) (-512 -384 64 ) (-512 -384 8 ) +4 72 (-8 -704 0 ) (0 -704 0 ) (0 -704 8 ) (-8 -704 8 ) +4 72 (0 -704 0 ) (-8 -704 0 ) (-8 -584 0 ) (0 -584 0 ) +4 72 (0 -584 8 ) (0 -584 0 ) (-8 -584 0 ) (-8 -584 8 ) +4 73 (-96 -704 0 ) (-8 -704 0 ) (-8 -704 8 ) (-96 -704 8 ) +4 73 (-448 -352 8 ) (-448 0 8 ) (-448 0 0 ) (-448 -352 0 ) +5 73 (-8 -704 0 ) (-96 -704 0 ) (-448 -352 0 ) (-448 0 0 ) (-8 0 0 ) +4 73 (-8 0 8 ) (-8 -584 8 ) (-8 -584 0 ) (-8 0 0 ) +4 73 (-448 -352 8 ) (-448 -352 0 ) (-96 -704 0 ) (-96 -704 8 ) diff --git a/fakk/maps/example/cover.pth b/fakk/maps/example/cover.pth new file mode 100644 index 0000000000000000000000000000000000000000..717df7ba108111861f88168e30805e6f170b3829 GIT binary patch literal 12640 zcmb7LTZkoB72Pv^@9oF*`~B|Q@9ycx^mN~TDQIRoi60RW1j&z*pz{cdkwnA~l@eQ2 z5F8OiWx#*~g5+Ze35W?Y(=*A}L?Vb95RJ+BWfX<{7zT8&v+LfjI(62))f=jA*RJze zYwvybId!V~(F>0~RuGXvJs#D+%NL&c%+;s9e5w4&OV2#})YD%mS3anBN_u=i4~gD? zL>_wcRf(ckyY#aCyhxk=e*DQVUH!zRC$;J+y+TRc{k$G6df@KIp8o8m)A~0A{fX=y zi2VLQZvF4bU6NB}>vtE>ChDG&o7!VBV7-9%D|l1I#b#k;DwF==<27 z*Df}Sx1avxw6iDpo+kDwCNW2mmNXfZUpj2n>+0{MVXj`*ez)Z1DwmoLe}K!X8ZODD zS#`ifkDaqRcvq*d=BR!k5l-@B7HPEfZ-J~z1T-kCJVTKV=gmzo}!@9U8q zr|o(T-?%moxd}&fr?$>kY1aNO5`NxYf#|V9N5bj+WE{3R=*ko6p^=xA0_vO8W z-gG#JVz?*PTPbkQpIZ>aUfxrV){>XsYWhyXaaX>bz^ujNcJ}2{3B9$AGr0I`@?O=! zmjyjU)|Jc6hU;5bR8OeWlfh;v`e^KhV|Ay_GmekB&-I(cd@c7n7MMFoY;+SYy(ISf z$$B+p=YH)Mwl;yC4|9(fVD2QCJBXco2QmnQoBdg3)|c)eXDTn6PW zA6taJhvb5pl3`1RS5pofF{S0fMqmX=HIAPP`gdIZ?(55FYC`^@qbe(*m><_-@VyCaQo1Yh_1jfVyvM_F_jq<*C__IXF9plbWy?n>AL2ftdc=eYxOd*wEu0TkHT8atdpPz+B0@@~=j836K9swrw0-!}MCU76$jt@0Yh1z@M#wlCC9yY_jx*vEgI87Y}46s6rqn9ozX*F=1EL0kY|UA{5aUow!TRWwGaRL&y};PgO5$X z{m;3%7qpVD@Pd8K5H9m%{k$!|3bqp(Uvt_od}ea<=p>jizRJY@(-d>~Szsl-FXv1S zOxvk_74ro2AujW(hYw7^<&`^mV-H-|9J)lFt(FPLvm{Th%YUg~?rZ=Y4BVbx5?S#hNik63OOulmGB>5BLj^%{Fnl?foON0x{73;)S=g4^6 zB<+K{KXkXC@*w|kqenc$!T((sQ-<0&QZ{+mFPlIoC z^=+Yh*9I;H@=arre5Y6Pxx0SxZZ7;?Uq5-L7UHs_ZNWDt*b`Vf_|L_U>N>HpfXkr2 zXC6fnYEF`UC$>*jru!S84$j@+;y;`0st&#}0hj3D2Y>q7?W(5UFMK&g_L0hDk7b@b zH&rBzd7A8d%+%RK@blQ7;)Kr%j?C!8I*uB?v#xA)xY$FTKJu=)UvBtzc0F{H?-us5 zeR(IrF@~c*ADj=JI2_u5#SFQe_hM+2mazpmTeh~?~!D%u?2|W*d!s9WJ{I}LQ*X` z7;uvF9B3J%Y2s$285v1NqjWG@O4HPB(=<&eI+(PfE#>hV+R~KL+m@zjnwR>~G;y0W zx4++BYwol5KIh(ht|WLG&Ypv{*V=3S*PQ=3*IaAweJqK$Zhhc^HN9T%!Jj?<(9cnS z;@f(?ooDrW$0#p4Fr@xMulGaO^m@;HgZ5mncVN@1-nv)zdLMn$s@~dFz21-AwW@bu zHP|`sU)}4i-MOlF7jt*KcUA8&`aZp9RgbRTnn$@H)=yJ^l=|~$fZI<$|J(8Ss@`+d zUwvX#Z=Uf_zi(A<3**1{fmOW=UeoIx-S_m-r=Hw*$qv^Ei^^! zH=RsQJbLH@A2@XI4M(4RV*mbq)1RsXLJ{ZcC@KS<6oYNW{c-MJDDD~WZ!hi{?|&}c zJGYX1@;zgf{3<$PjEf+7@rC}it@&%gm*eyJQ`(=$ z-*SBL+2;6QYir#5f`5fC>>q3CKi1OUZ;kic4&DWSgbH4ddkAXE`LbTKH z2M*z{7{`w>KSVvpm|yanA%9E#Gp+npUpd~er~T}|HpI34-;Mop{%-VDSmrA7Q3501 zl3&Fay&>)K*%tp<_$#4fE#uXF*0HuVF5hxI{E7K}_>|-Q%(v>(hnD}n*814&Gf&?0#<-v3{%-EU*ScxU#C_H=13tKkdyw%`|AUP8dgxN$XDF3_)Y`k7 zlKF;?VKqL|F=RZ()HE25#;W^%Yux+7Kk-WFcqZ&+%rjwcF5#Yy`#k<^g%7^p_UP@^ zIQNx5+{btoudiKmcZ}=bXSioPY-_>zmHgWA>$T3mUhDj;?hF6KE47V^Phq3tQ;f%b z=xFh)bj4V8bJ=B=U4HrHS6p$$l~-OlGc!YjTRJZ&t_ z*l=|SZRSGl;)^c^#+0kBx@!IU^^9|+jSDzZchXOro}`nBOuylV8?L|p`s=Q{jw@|c zK`hO>_S$P-|N7U{$(1%bF>%Qymp}$DUiGS1C12=)Cz=<-qqB-uk08AAm3$g1a7&VI z(=~-Xxsbd7L+82Yo_pST=cOw_LlT~tAYd3uZJ1yswNuPf8vw9YxadJuihl|hJv5Ly zfVfP!a3O^&#Xm8mjq-~wx(EOyAxs1aBSJi{x#k*r5E?1G^aG#=FjJVwbYjaW{ak4i zOe})o_U4;!-nen&rcIl;(xwMu5QYpBNd~U8>7jpVdG^X#+Frj0Fx26mIsh7xPaloT!i z^dzCpqOdyvfQ0akH{M8~kehD0DFv2J8r-IS0Q3N63KN;0+)UA+ot6?l;LkeitUK?# zv%aPtJc0~Pkv3du(*s*ZH*eky{!MRs6Ia^w(4X+Qj}Sm|GPPlakP_)OT_FaO#FcD}=+1$kc*pGtQk?EdwC`4$Kon`!)-coq-`QK8Q;)ziL!m6FB{3j;p zY}sNvu!(T_mRoLNmoZwV6N^HBqCtaO!jhttLX-fI1d{+|UbSqc+q8GsGAYfVgsLR8 zSyQCdNp=Bd3f#uy&qCuG0A@jtbV_+elBe^N&U6H&egO0UX3E4oVNcP$DZ} zo(^8FtXeH)CxHS?o)BuLx74;4l=!3_R4*T7>P|eRoq~_fi3^IMdV8{1WEB2#rHxLA zrR2wp>EHj+*`l3pQ~r}Wn#?BPSmoFAi<~j!-^y%8f5Z`<$pSV&;x&h zMtF%B>xF)V6SIbhM%>EhWLc_10Tg zqzXK<(o!Z$BtNM|R-CG5B5TU_C%ouqu?Rco4C%pX&y_Yk^fL-(N*D@xz2qF=KzRGx z-##(sWoJ5nK!Rr$LnJM`kJZO_IIQ&jhgr<64-JAw#^Mgo=oLLmz%z@vXsDB!fTSJ7 zSx2^T1w&8DSQ406kxpD`lgXTQjG_u83C5K+J@hk5l5l{hO^OCQVE2}2=A%Jliqwt{V$|L|v*)%(3Zlb1cT0l=1U)o~zhti{PcO3=eTB4TVwl9N0k zn5X2Mh^$6AoOz=0x%7^Aykpm{U5`EX7+2c#(4P`uN*D@BX_h#h|L{yt&obxBcFKQX z_4!|po@6`4jU93Fj}med-v`VM)s1@b=*j7&K9n9Ppgrhzpc(wb<55=RgV((6nR*G0db7fPl5DAV3ZK0 z$7R~T^sx09UF?ztcQ!5^ee5B-ed1yaHQ00aE^ zDTFdjCgfI)8X!<4og$^6q!Pd+*-8?|=XMxxVXN@4EZ$ zyLkjN${HawxTTY!M<0FkeeZi8Fs3k(=`0f)5QS%)aR#f;X-OPf=RZ#__T$p=XZxgg zT~u*^kR+((N}Igm`NAle^r12R_e;Gf^&TWch(O(6H(H$Q{#K*)%wny1mu_LWC1||G zVU%4zZVn%D4Ghm&l5^X(ZJZVFeCInKc;Er_lhqs-oMT`R8r;&!5P%xSM5d#JGb)|` zfXg6bJw1-={9lYMgj4XL%8C=B^wi@@n;!bp5~L3eu2bUc$kZIrNuJdGb)&Us>;6^) z7;!*b>W3Kb5-kk3q$NoUjK;V*;(${GmOYhV1d1apFi?Ibycu|sUE%7~qvwUc9of6NMK{%Z2J%}&xLaHmNTUM|RRs5>^6WjW>Y`_OH zOj-JS1PwS#Jg3BuMNBQv0}=l^W1$kVR-a{G*|4V;p@Brd5#KS0kg|P}t zKbR68o!`6|o{Z*n{w({x!Tv?YVaxvhc>>&)ebIsmm=u4mQ{qp6$+ut%{HJ_>o)U(_ z#a`^Ebcc9yq;mxER9)hGq>TSG_$jS_i(#A<=?EgXdA9PF&RaJR0sB59IW-S7`{S)>5dm656ihun* zvh?pi>8)Uz-+xX+Pft%uJWY7AoZ8<%(Rq40dm6G@(T4`lohk9Bp{J)Or4@Z>O#l6I zdOCX=vLdDHPk<%9N79GJ^xrS1p{J)Or4@Z>O#l6IdOCX=vRcuH#`NDWr=h1Er7i+p z1iA=x5$Gb&MWBm77lAGUT?D!abP?zx&_$q&Ko@~70$l{U2y_wXBG5&ki$E8FE&^Qy zx(IX;=pxWXpo>5kfi41F1iA=x5$Gb&MWBm77lAGUT?D!abP?zx&_$q&Ko@~70$l{U z2y_wXBG5&ki$E8FE&^Qyx(IX;=pxWXpo>5kfi41F1iA=x5$Gb&MWBm77lAGUT?D!a zbP?zx&_$q&Ko@~70$l{U2y_wXBG5&ki$E8FE&^Qyx(IX;=pxWXpo>5kfi41F1iA=x z5$Gb&MWBm77lAGUT?D!abP?zx&_$q&Ko@~70$l{U2y_wXBG5&ki$E8FE&^Qyx(IX; z=pxWXV5tZ!AgeOqj8=VCzF$rKZB@I!z1JIT%iUIGJKqnE7vptP8(~X3Wf63R7i45> z$27L)(yZpSw51PcQmn(D%QAdqtKnDMr>(%NzU|-r^c>|gd3sfqw$7nPzt-eh!0Wsq zBU=wnZ{U> zp>eFF?bB!Jt@_Bppa9}CDr=mwiWl2^H4v+ z)-ANPbr&UUy^FS@olzbR)W4LiWn;J*1!q(4qr^I$Pg`lmu(mb9r-V<}rhjE_=#RF( zixRfNzX`Tfx16npf8~1J!(`)hfbvR;a$~A`=TfJ>Ms7Gd!Cup!tfI=hSg*Iysja6d zVe73KII^{yb*l5w(Mh%%{$v%sGKTM<(_Hy}O60uH8KoJ++E&|+(A+ofTN%S|2dG~k zrG#HIw3U%x+8KN<^;XxmJ?_Wth%9sdVeYl{=P6<9O|+GfEn~Q>tz~2QUUX{v$0-p* z^HNz&kw;pqLHH7NHIgs6Z!l)h`H>sDX=~%BDUs`&XzSzUxz0Y_!>zKEt>XzYx|X&c zqg%f|NeRC$p{=c`Id`$MYz)WjprVRP`1L;Swe|Cqutl@NjBIIVSzBZA3q4`$V7BoK z)Dgpn1R>2B*0z?4;g~)7hpnTuy&qD-);nn%L(fHh>-8FW*tXTWZ|27sr0Oj}!D zpoFdOp{*_7+} zEH_G9KDV@WZDGqZ%4dPLR#RZ2PZs@|;8O+4mu4(WTfYQCTQ{|A>Cd>WmFI@5m|#v^C^jzqS;%Jfm8+woYMdVs4bSel^>=yRhZC z(aeqB3n!WzrLE6rTlW;U%#E;R91(1tSZ2!Dd&gS zIyg5iF?3Bwds$m2mK&w5`E2X)!j^tbwzcxyFg}qRU(dD<7Pb!1x0bS+ zl4983R`^Bl^tn;m`Yk59UPlXCzKi;PJ+gId8e0={qqOxq+17^(TYgVy%k@fr>BouX zMrq6ULj4*PwmhT!Mj7RXwoWWJN?X5|ZT*?Tmg_ay*2;53J&_wPWm`W~*t(iNzf(r* z)yJuX{qOkQ5?v0^- zHEpdtH{3gs8*8$yPZhRi8E@u>&y?CPMk8i6E5Wy>KQU0+TAOV>U)Z_@VAGb*lx1yA z%#G5P@7Bif7YkcAW?Q4&@SH!f+$e3W%eFpU*t)*3wVHOXr>)wrZB^Ik(zl*Yl^Du0!JU7g-$PM4)jp64DTW`*`^eLUazKhm=(K~%^l(sfxTVE_}`CDZ( zHwIg$ur)C^N?X@wTVF10ZOOJqxzS_2PAoS{TYfVb!`~=u-B#E#jtI8u7;Z~l^|f{1 z%#G64Y_>ID*xH1eW^RP7mFLE*(G|I|IotZp!j@-LbG`hAt^LxWmM`8n{Sl;;w){RZ zhQCwT@|~?|YyO2PY)#CK($-zs);9`Ue>&S5<;Dztomg&^w))xDONFh2g{{@Jd(}5= z9m5Int3dhEjAd!dZy{s&$AzsO+&6PWzqEC7xp7~%btVqPZ$$TJTl$pFjh)%nAbg4% zL?zre{fU9nuN~ReIVcWW_W^9?#_TknyNu!5!q!`|tuv^TU%Rn&^11O~wslcq zi-5G&OIs(O8}G@sE-P#qjAm|xt(E5ns_JvYZ#-kTzOc24`wJ+pUw)qZ2 zhTu4(c4u4H7q+fpyk)CDg{_IXf%@9k-fZiZ!j}6>Tjoa2&FquDO*#wdt)-d!rLD)a zt<8n4ZOjW>#uw2BrP^N(m(sd#{adquO&tQbDv|ieIhBDEwt-vdL`Oj3` zT@op69nQA;g)QH)+qM=K{x9@RwDsA-mVb_@VJn?$RXnzjIPBz=W-VnD?+qI^EEL!b zHAZ3wyq1ixmtA&Q#t!uny@PD?@R;7Kuf7_re@-K?eRL|%FsI^>?|Z##uDK>-E53pl zlfzN46^9yo`Q?|FSbfW5Vw-xez4ltL?&07N*u5Ex6Zy|zty{M)W7{0W%3*|k^{Zc9 za$sZ~9OS!y32bl>tB95FNN?ispmELd4ZaU%>}V~ny6P%8)L7MI4q}_@cIl;;W^8ci zXAbWj(>pUW19o>2vsmNVSmQjm*Sr4u>oc~F88nPTwGQS^jlJ^9D@&~FmPKrZudz4W za06I<3%=LqvA2!I?2=0^$=Ki^R=Z*+t((3D);NgWu>>|ah*iYOceHLJ4m0|telW`B zj2*38im$%)#VVP@U75oOJ6g92D?W1&TgB{nrGZPzhuxu8v zqjj6nzWTG?V`F+p`OwDRl=)UMtNyH6ido4)y>bv+uUmyp`>l*wtnurYzy^oN9kKPg z6&(8b6xi@h`_1^K^GvKok*lR2F*~06d%e*)Sz*D8Q^Yp)rt{ZxGO)djy)5&Mx%~H^ z>O8BlDg^7e*yg&8&dC}1$^ndW!I<9B`5V|cqh67*qjgJXRLLREKCzS5O}{LaWWHxE zfej832eHj{8=cka9jHIY?6)&^w1-A(;hq;8arlj8u)V;dTWl5IKdyMj1oYU^P zkSZ@0(tAnhHGhYc-vz7Qkigc@SoC|Ai2cSQ*xdz(J~%nNv5ETTkl-jZ#4&C!QqRG zU~AvNhHw9T44clg-315ZC5NvpfvwgUnAl;)Hr9A9>8;l|a}XMW`Cj?TUc3tYYO6{~L}4oUBBb!OlCeJAk7;+)1iVtUSt4ZS@uV$U1H zHqW!3`o&PhHqXA%8KvGq#xkSARxx8vl968dimmuEDBmV_^c|qy9;M24nm^Av#C}V$ z7`@vEHr`AA_HtPCiPbl;kvmE61s7bfkj}G8FIYKgxWVTDW)b`B*t(5!CvyE* z*88b3>?n6CEc(UvC}J1O9kGMJ0vFrN-$E~Z#fHeYiA{WWgVDDV`@4aaQzfH33l1~= zG;%JO<{FRkA$${S%)~C1XB8Hem0s{-o4H=-g>Nlj<=e!L-hYEbzxs}? z&nV&%Ir+oOVVx~cir6}LD!nPs+UKNLIZVP)R2FIZ)+$@xi9=P#j)RZ_Z{U= zm7;qotQfI!5c?DGP)fb#L!3J=f)RVh7&fg%zrfCC?5Z*B6<1ubfF9Q@pJ$a#aQZfh zgTA$Maz~Cs;;M#=FTNPPfwf1GuUPd?!Ul(aKVkpTGFbP8SVgSyZR@SL>R%Q)xW2P; zpq(V~4Q#pJ#QIF0gq3f};U4TSh1FL0CUz2sh?#oL2W1~T-N#Dek@m$TzBey}OK1o@J+q?re1xU#6hg_RR;a4>fH(U&k(ne z!Q8p$p1aV@GqFR8*vMb;fi3y=!HB(b3|pMP+nmk1f!WJ#Oj;a zrf}%a{d+10@IA{CBX|yk=pvFYO86KCm3N;2^fgCvH#tngj`;@e2};CQ zYR0j*P{cR%(*O7pSm*WvOH=Hz^1GXR^~#|VYx@v6Ov3K`9DFR>5-+*EpEB#S@OYYA zT^IOoE8q@itbJmQ!&2Cq3wW{a`AK@^P{j_6B8N%X*$EtsgWvvDT&vmXcV)3{-}aAT z(-{@ml7ra8@}*8P!WxItH#s!1iNnrr~ z%G`?{l9Naj#|KhZ7L zJX;D|@)i5}3HvQLl=&csN!WRwZHMK|`Jl+*dnwhPr%saItHs8;g>O%dVbhr!*ph?T zYR}htM_4(OzR979O&rRY1&8m-Sh?EATjQN~E^uZ{@a?^0*lpXk71)x4*snD9al!_N z(lUq2fw!Ic&J)=TGZ>&YR#&Vd1l|$ru#8-NYJ*vND!r(3@ix9ONvAN!Vi(o&krzex07LY9F*kmz4zX`kodOa>l!z)_uY42fi2@JRt_V*2^$w4wJBQD04@wzBRDiyWfIuI}Q!L87qhO8XMom zu)!htik-xvzb)~Nn927$DQEhFuzE`crcLF|Tx-VrwV zYG08<6Pq|3o50~H*q1yX@?8FoRrQP&+g@XT*JxtTJMX*&)*@rewGiv?Q6s%0Y+vJe2#-ZdZ zN1uf+PTCg*HaPe^UJTn_3$eZvgv9%#90Kc@y5%qlt8ZoQh&9g|Snl0#Vk5r6S8RiC z#zq{<{C)2d*x(R+#V*Dn{_MCMEYFc+{^mH^Z=-!t{pJYo(EFof*wNk;Tk;jVxuJK2 zl|z~9a%f@`2jkG@@B?tJ_B?fx(Y|Q=_Wfhn(Y|PN5L@l}TJH$k_Dv2=>^KLx8Q+iR zm{s@3y{7$UKD7CMbPPM%Lv6ldjhT|xZnTF2n?@6dCU&&v%lL}-&osxL_dfQ8d;=T# zdw2lS>)#ydgSs-A_}w=#b{ z9~Q%w@m06jNgRB}hHv65zY5n2D5L$B_==7A1~>nE;ZoR=uUOZ3lHTAOagf6#tk3y2 zhtC8DxF;FCBes3}^cZ&Z?%C!bw&GCh9bseL!lE3S*l`YG_3sxlhwA>g*U@`loA2{u z*!12P>lS&Y7O`?rQjACMh~ZlrO&pro(R*qcU-6$r=cN5s=0mL8CzimreG@xz4;4A7 zeRa!W61E)&u|Ltq(iiWOv2MXvY{R#VjXW#!_otV@mhn}$*aqLM*WWok{`U2jA2K=frM|B z9yp4Q0pCG+v_HWCU%^Ie(B$16ggD)$Gwhzw{P>^JBCfa+sC?XySK zY&#BOU)RQRuioHW#!PI(w~UQEEA#iVC9q|DgNdI8Y}UVcYvn z4o&Ph2X)Bde98rleKGp)(rvzL#<1zXOUJsExg%B%m7U{WNB<2we5(ez$f1cH{de?o zjm4i0wvm(SUP%AFJFu~CXDxwk`zE%LlUZ-MZrWG3942Agaj1B-vD}w@%b4{TYxtJ2 za%ivd>LsvceB~gv!8hw24EgPc=fJ?{1_E}*KXbaFu`kl!85H~MwuDuuSpN>wV%Rgq zQu^BBkE{823GQj=P5G;X~DLA`|%~PZ4N&f z9BRGk@5&9(+xG1*FNPhC_^wmWTyMyk+BXg%)%ml4@52#avBQkjw~!j!A7QUg*#4#H zT?`xRCKe7Ab}R~-w9Z^S`tKVxGb%Xtvk{wQX00NZ~BWif1U5DSM2 z+wiT>TVgTU_s>@+-{SAfr{CIKx5x+e!mYw4y@9>xqKg*B*8=RY$DGBm!J%4XmQL(M z4#QC#GPZXl=MH~(Ed9OlyE9*~v2J4FP+@Bh)!)z0eDN)?*|*+P=v@pO>n2taTl1~- z%3*aH?5(0M+h^o{`^x^s+W&vy^S`aoI}@H3MPF=N%gYk}trYLSm8zVTi*0pzZ>>H{ zsoxj{AKThLReHk5@C((I?b65S3l71}``{y9@!q0{Q>>SoI}K(r{VR?CVtN+qU#b3Y zHhwXlUH>R=&8K!AcJb-rQ=Us*K6Lr;t;~nBIg|YNM*TOcqwO=_=c2V-d`?E6&v#4Q zTbr}-+z%br7g8>!*!JJMT|@CXq%Cba$A8b#f78i-U(A0CIdGxJe}CMzdM=`@qxk=& z5&hQAiCVqt@jm+0{aT9uR-FGvVvL79aj&CXO1Uhz!=Bunrw#cU7ddN3Uizb-+K7Jj zMO=(s^lQ&}-be96NL%_OH+dN!|8k6d-oJ(N#(aM-wSNFYjxqjL+Wvv^D|3IT#~3T& zk1^9H{kfeoLvhT0=UqWjcifA)yy&}w_RSRMh`W>WhJ5cF{~gPlD7O9gGjE}UzHg`f zc8Y#)r>Mhq)Q@{8{oKBv+Lw6y-${8}Zoh*%@b9ASzolk8wo$YZV>@X-Krt>`DKWO0 zwp?$ZTtf-JowtdiU)NKvro^0$v~Q&7&n)G-+`g82eQsZsYxUep(dXAwHc-NM$KFGE znDP+iJ17rQ-c4Dl_;1-M^G-C8kdITJZ86ab@iw6|-Z47GJGaD(E%5^}Spr`Ha-YNE zL*}DFUCk{3=3zY3g3nNVwlPn$&0l=UXUKgebk5sgZpq(0S>nIUeV;O*%u^~`1!4DW zL9rKjq4Sg>Wk8X;x?e$2g1`8msd`5G2l?Jgy!uOgpL=DVvYRrXglMPa{{`-cc~Dyo zvfO&UwDEoV1{Co_N(Hb+Ja@#)Nl|~_1`_xIZO=H*v^5kZ_=^vjr_uMOh^P3H&(LvX zK&j?xxWH@2HIBR((#{|672f*+#dGycif5q`e1^0m{-J+BUx;{3miQPGzne0kgm`wB z_^O|dAq`7AKQExK^q1QtbPjDXx6Dud5U($#47ssX#sPTNm^+?-O7O34(AlRkq{zoQ zM7;XVYsGW$MLPP_LyG#XXDG(p=YSIWJ>LTF+`!vZ#H;@-ZxG`fc;^QGYMScz%u_M!wPlp#fb`_v)ENqp=}`_-=uy=45gG>wVRcE#Lo%a9J|T6^BR7X#nm zL;p*3d>q~KDMh?~2Y$f#OMkquAV$1W=7Z1Gw!amgPUk8m-em7M0dOY`_0LotBmK{FKg@iFd2Ents~L*= zJ%<$W!GB28xdUq7iQFSsQ54S=CHUB`=28zR+bAX8b0uVL=2OkJ69R9gD)GL<)dGIV zjreLVc;81#JdjFe>6d?>D)2+vA@XN>_1D*9IhVNU({OI! zt9~xx)nDn2&OC3Y{j~ekzAMS!eW{fCBR{MBajpupi1)UQkNgi@)Ej7+wt=s7(=p5d z_e+`2*V13=4=y!_7XG@7_dUE4`69#WhKt5g=)09?g70!lgAez^+!=Up74c(y(Ajqo zk^iu2rOWH7O8ko$iu0{PwD7)niuXCAe5t@YS3X1f-%BwcJcpFv|9pXWZr~Ft;nnYZ zyz*RucW&T!F{b{T1R)Gna+quIcW&SlD&f`db5Ge>;GG-zM;KGT@6!rHmCSMt{mu=1 zLM6QVeNI+V;GG-zeGIDK_iTlsO3a_oZ)e~WD&f_i;R}(U=Cc^rw{Ihh-wNX6IqXFB z*OKv%(_y~3rVI=W)%tCiKmFYA{V>|p;?+-gC6RA^`s@t--YUM=i1$6N5-{T8 zR(zkEAEuc9a}c7Z< z`(+zN{maQuWx#f7@t&vFp6?|m-=X6j!e=$N^*e5bgL8?QVcd27_l4j3R${JY+;^i3 zDW#Mc&k5gm&!!A1Atgo~EX{&`&j*0I#Q41Z-(XzZc}j>Fo$+k)neazo{*W>s0P4UP z7;XJ8#{CW$QbOiwoSpS(>wkjrU4BRjnYWQKZ>8zGxbGuFO31toIbo|$<@@*lhpsPB zhs@i^m>o2I=Uz(@)2Ar&UNUAqO=EvP^_MAqiZbsdW8OjYRh0h$ZW3m|*nN~gVEp%& zz-$BadyM;@Sn^S4*pknG2lEX|8#5G#?_yqL-1n&=B}9Dak@E$V{}&gPgoaS7!= z6c~qx6m3~6K3C$bif8|jzQD-mzn~+Y4`TZC4Jm;!w>;nfQ?^xN6^*r|H+v0++e8QgY%4EWd|b0`s3(OjG=M< zcVO06JtNGZz!=>NBr;UXBh zewFd-s7pN+-Z}8`8^yErUxS;3889Z_f5Z51P@bn9e1^7>0mU`{3ghalgtm31(+0K- z)xV-YzH>s4nCe*tMlsgEp69nQL&nUXf5~`!Z;0vB7kY-Y&BK2||Cb9refnl8+8R>p zx9|Kuhsx&;xAh*BvvYj+jl8Iymj%W={1Q5SUk}WXwqhPe{`}uyeCKXs42&4Zz6j=@ zQ6^!Gp?i5VWox0Q5B0cr+88;10XybVVEVL`*vn_r_MO)Eur@}{L;5`n zw@`f7+=;%}r`%QxKBQVp`KOHCN&WmH7|+6g!q`8il$aN}4_iJ8*;Cn&oKTE3JhJ91O|20e|x)^T0T_)pHQPb zd7Svzjq-Q1 zowe5L%rd0b_rFKqFBX_QTvfw-^8odOl(sE(ic!xF%3sfV#PzvX0;6AVr~Dk4@T;@oF!hVl^QlUYZF zvyH5!?o%7*PtpEs1%|Fl0^_qyF%LRhxorpi^Rs((9mO&oXqtUdpftrYK_XMI(! z*XMe%dFGRN_vWN|=C=K9p3YOsdESS;a-QEb^7OpfO7Y%#)>l*1?=#bT?RYQVTD*1G zabJ5slWXzL3;o-3zqZ6(MRB~;U*fOKxPGqNc%PeoOU>rmw#8?YwRmgwTl);P_L*a? zerx$yxA8s;>^JA8!MFMNOmd#NHc7wFKlifyt>t4aA8Vhp)-$;;qG7 z&*WOX`&a$e;;qG7`;KFMORjx)(w_RQugUfGxi&ubn@85#^1D$T*6O$R+_hen>(#kF zkJ@((_qnxrYw_0Nt;JjW&2=v2HMth=y?AT!*5a)%qsbaba0=W*)=-XZXSn{eLgq5#!>j7Q`!VRh zviIyZ`nI|L>Jp=FBa+Pm)n+V<_;cklyy4(!|Y$esg7AK&xgJx|_p z^ojQaIPxgH05;yDijwa3$M-zB=h374o;Db=ivUz?VFi8nNb;vnr)?}UZPvKY@XVUv31+E zci$0nVJZr@-En(ZYEr23W2!h#W#?v+Zn7aW)ly|@gLF>nCa=xJtWNAj;U%ZBy`hTQ zVx_%Kg-vBDm`pd{x@kNWj~vRqi&R=k3YF@&t9_8jk9b2pHZ+`r2;uhwZ^)Mxy$YI+O*JN3Vq>$sm#S7%k-pY{CA!mm|& ze`evI=K9xj{U4k5!fxBn_buF8@%X-l2Xb9K>K49l;n9-cFaNS%nD3e4@9jVQ@Wb~W z$@QAtzl;Bmm~Gp(ZFxWczY+J}fB(Dx75|Pqe=YakKbz}6%>92I+~&=j@A$L7@+*GT ze&-eI)~$Q!p@;7M{#>uh{kxgRKXGx#NBBEy?|ILA?)^OfKF7w58{hJYTz@V1|9$@L zkS$xb-1*aT{gWj=cdF+XdEwvpi}K^!w=Nk7=T*(py{I?r)0tpBe!%zf?Mzvj=XQ=Oy# z*!f7^8{%7d5NoCkmE(A?(L{{NayzZYIkb1r-O z!*dV){)bky7hZ02UikWl=00`%%3|B^!8?9U|_6 z0%#EfBSQc~4HV?W_}J*k@GyYHnHX+h6=z{s!O#E#Ks_+^AZxI>4PrjbZ51TD4d_d( zZeU{Q!0HATh96kfV{;oQeqdq8z;J*Jw_y(-MjUQqW;g(GGbrpJ02FNCaEk@f$Z^UF zqa~g%yw6LV%_s2M8#;fC2>q91a6%qTL1x2NoQ50RTJ(jqLyc literal 0 HcmV?d00001 diff --git a/fakk/maps/example/door.scr b/fakk/maps/example/door.scr new file mode 100644 index 0000000..68f4465 --- /dev/null +++ b/fakk/maps/example/door.scr @@ -0,0 +1,18 @@ +waitforplayer +start: + +end + +dude_go_thread: + +$dude thread dude_AIthread + +end + +dude_AIthread: +local.self walkto $dude_dest +waitFor local.self +local.self idle STAND_IDLE + +end + diff --git a/fakk/maps/example/doors.bsp b/fakk/maps/example/doors.bsp new file mode 100644 index 0000000000000000000000000000000000000000..1b59506f692074eac2a62690ad9f225b34c6f1df GIT binary patch literal 81652 zcmeI43$$HDndeUegEZ|xc*!$xxk-40gggleube!HK*CERAPLKnk$JJ`Tq&By$)jqc!f+qLJ zYPEa!sMU^sn)_7xw;xwqP2bTwjjKHlcH5oD)qcqRC%cTRP5A3t?YW8LYJKmj)y|qS zuJ$Z?=1(10n@|5`hjO9l{y6vf)5g{QWjr=#_~+NTHQV14{}{+u2^;cnoT|Hdp7i~ntkO+ zG%@RTT^DRzzkcI}8Eblb)?Bu+w{Ok5k!iZU4z5v~DRgm;7jE3xJ73~al-3+ugBlBI z|84TzPkT}FO#h8bl4tsFe8fMyu{0Z@zoD^urr-MX{I$hAhd%c_plb_b`VAxf>G&pi z>(jU<`cw?FcxiYJHWokH>Qj&Kh4GpFrP=tU+4!$z_T79IdYig7vi=74oIGHbW%`$8 z`rUjJej*=Xd_5aq&&R`mI=`Gh`IGj`Un`Eouzt>G`2qi~9qiv6`c22pS^ws&e{9c;>v$1|)Ypi>gt}r(}-=3|{?W|AQzdGw*9oEk1>BU}H*qdV`s^KQHC zw&$LE?zi85lO|0%=%9lRJ@n91PC4bY(@x{MV#SJs4?YF0*Is+=zWeSTzsDYX z?7Q#22OMw!_@jO|NfIsI%(?|E3drz>Z`fZ&K^evE;U-}9%^^l zWfxe5+sHrj0{p)By^kwxn1p|NJ^$cg@;&c)&p!L?!vyJ_Hf`F;C!Y)+Hn`G8f}CD3 zAi-1ol1-jG8N#9B@WT&>s3VU&k}GW_$m#V<1|F8sGk5OXV~;%+^3iAH36`uh4HpDXR`aa7<^qowYl7V`Jr zdvC(~zylAQK7Be=;O*IGpUon2rHuqRy7biOfMKOk3x^9m*r+&o?C{)IbqM0cJ`R@pY>*srAEQDyN6n$8e(yV z2!yxyzW2QsU3Afg4I3`M{Bo|ekszlRjL$->LRVK88yv`s&rIv31o| zR{^8Y3kIZj7zto{!GHvhDlZgz)+{y%0Ir@}$YD61aHX9+X8dQp*<-2EQuk0x%4MGt zEyo;l40#e)Kl;&+e(F=7`pjoO!<9A?7}>bcH2Go-1CJm ze1R)%B*^In0}?z7M=~b^5S(}m?VtF>C*ly=NRZPD1|)b-_0dNk&F(nkj5A<{;4Brg z*DygZ7?9u@g=xU0LXQW)b|bDlx9mjLj^TJtJA2Id&w8`RQlq6p)cQ2S-sHWB{~!6t zN51lvuYC8r-~G{#e#DhF66ExP@hOG)By0#LANhCRefPJ&{q3iodg}S-pXW*&iQffa zK!W#~heaesZ`!np#cej5zxvg$UU}seuC$RLrx%RRLZ0eQ@lTM)P2tHY4X{$7$NQHK z%Z+a&BBnNb_H5oq>|EaCObur!Gp#^4F2i2;rcWczEcz4q&0 z|N3u!^P52{w2>gE7Ys=7I6&~=(s}2dchgNb_4oI`{`%`SVvsfx-Fl36k!H$p2`D8MX|0)z7*#!Ila=-p_*ANNq7k*d|#qUtZi4 z8ayKOCoBJ2!M9T8$KVO7hy+%g_tYJC-0{<&{?rrlXCnv+a(cml1W$gTflHTMa>-{u z``KUr`q$YIB*^In0}?!i+|DNY(1$+s`Okko4lyHxNRZPD1|)d+A=rq|((_L$^s{Cy z2v?F%dj2UDX4GMe6A_C})?!<6@aF7s;e{7o>UKoZf5*M;(M)wru(R?|+{S zL4urKFy0E02{Xi7>G?ku`ni*Y+t2@{!jvo8@JaGvp*e#QFuVfJKmU9p;WAff@Q9Eu z0KfoKG9~F_snJp)qavA}|Ce8W*)tR4A4w_yd>WACd56CG>Z=)-GKU>46 zIB&vVkswdwAO6{EoE3defB_PkKcYYg?K96jlg&c9W{uGA-!fy!{l=$81zeCxrFv+_3UfQHJ-mM&0;&*F|D3T}Icz?08@En~! z|L_w0@sEEDnJF_!kjMN39$E+k_9KpQMtb6jCo=w#Ag31$Nbool^Z&;__Ob7L=R4UD zB*@eJ@0sM4M@nJ)^JRe#u)!YTN*f7sdciPp@MFv5V~hXx?^b*uS_lTNw3#(;_Vl|o zW>mHk|2aea zs?kP*oL(>>!KddR2xNCW{`liBzW5?9Yp%4BASZ#x^N$aHwhu{+@WWL;N#a)qZ6wHj ziet*)i4DjcZ6+sH$1tk>yOjeH8-(4;l{Qh$L5`5%EbYHr@enpRM*5Qj{%SK3IBv(w}GGk$y#-h3TgbImpP-+%u%zxmC9fdQ_xkszm+Hz~6N zpPv6A4XW?D>#i?;@rxX;xY9;~oQ=tTfkuxfFcvIWK;~qh67!IM{q@ _C6L337VD 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 A)c^nh literal 0 HcmV?d00001 diff --git a/fakk/maps/example/doors.map b/fakk/maps/example/doors.map new file mode 100644 index 0000000..e8d34b2 --- /dev/null +++ b/fakk/maps/example/doors.map @@ -0,0 +1,330 @@ +{ +"classname" "worldspawn" +// brush 0 +{ +( 88 264 -8 ) ( -96 264 -8 ) ( -96 256 -8 ) common/areaportal 8 -8 0.00 1 1 805339136 16528 0 +( -96 256 264 ) ( -96 264 264 ) ( 88 264 264 ) common/areaportal 8 -8 0.00 1 1 805339136 16528 0 +( -96 256 8 ) ( 88 256 8 ) ( 88 256 0 ) common/areaportal 8 0 0.00 1 1 805339136 16528 0 +( 88 256 8 ) ( 88 264 8 ) ( 88 264 0 ) common/areaportal 8 0 0.00 1 1 805339136 16528 0 +( 88 264 8 ) ( -96 264 8 ) ( -96 264 0 ) common/areaportal 8 0 0.00 1 1 805339136 16528 0 +( -96 264 8 ) ( -96 256 8 ) ( -96 256 0 ) common/areaportal 8 0 0.00 1 1 805339136 16528 0 +} +// brush 1 +{ +( 96 784 -8 ) ( -88 784 -8 ) ( -88 776 -8 ) common/areaportal 0 0 0.00 1 1 805339136 16528 0 +( -88 776 264 ) ( -88 784 264 ) ( 96 784 264 ) common/areaportal 0 0 0.00 1 1 805339136 16528 0 +( -88 776 8 ) ( 96 776 8 ) ( 96 776 0 ) common/areaportal 0 0 0.00 1 1 805339136 16528 0 +( 96 776 8 ) ( 96 784 8 ) ( 96 784 0 ) common/areaportal 0 0 0.00 1 1 805339136 16528 0 +( 96 784 8 ) ( -88 784 8 ) ( -88 784 0 ) common/areaportal 0 0 0.00 1 1 805339136 16528 0 +( -88 784 8 ) ( -88 776 8 ) ( -88 776 0 ) common/areaportal 0 0 0.00 1 1 805339136 16528 0 +} +// brush 2 +{ +( 264 784 -8 ) ( -264 784 -8 ) ( -264 248 -8 ) eden/WL_basement_2w 0 16 0.00 0.500000 0.500000 0 0 0 +( -264 248 264 ) ( -264 784 264 ) ( 264 784 264 ) eden/WL_basement_2w 0 16 0.00 0.500000 0.500000 0 0 0 +( -64 232 8 ) ( -64 768 8 ) ( -64 768 0 ) eden/WL_basement_2w -16 0 0.00 0.500000 0.500000 0 0 0 +( 264 792 8 ) ( -264 792 8 ) ( -264 792 0 ) eden/WL_basement_2w 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 784 8 ) ( -264 248 8 ) ( -264 248 0 ) eden/WL_basement_2w -16 0 0.00 0.500000 0.500000 0 0 0 +( -264 768 8 ) ( 264 768 8 ) ( -264 768 0 ) eden/WL_basement_2w 0 0 0.00 0.500000 0.500000 0 0 0 +} +// brush 3 +{ +( 592 784 -8 ) ( 64 784 -8 ) ( 64 248 -8 ) eden/WL_basement_2w -144 16 0.00 0.500000 0.500000 0 0 0 +( 64 248 264 ) ( 64 784 264 ) ( 592 784 264 ) eden/WL_basement_2w -144 16 0.00 0.500000 0.500000 0 0 0 +( 264 232 8 ) ( 264 768 8 ) ( 264 768 0 ) eden/WL_basement_2w -16 0 0.00 0.500000 0.500000 0 0 0 +( 592 792 8 ) ( 64 792 8 ) ( 64 792 0 ) eden/WL_basement_2w -144 0 0.00 0.500000 0.500000 0 0 0 +( 64 784 8 ) ( 64 248 8 ) ( 64 248 0 ) eden/WL_basement_2w -16 0 0.00 0.500000 0.500000 0 0 0 +( 64 768 8 ) ( 592 768 8 ) ( 64 768 0 ) eden/WL_basement_2w -144 0 0.00 0.500000 0.500000 0 0 0 +} +// brush 4 +{ +( 464 784 128 ) ( -64 784 128 ) ( -64 248 128 ) eden/WL_basement_2w 112 16 0.00 0.500000 0.500000 0 0 0 +( -64 248 264 ) ( -64 784 264 ) ( 464 784 264 ) eden/WL_basement_2w 112 16 0.00 0.500000 0.500000 0 0 0 +( 64 224 8 ) ( 64 760 8 ) ( 64 760 0 ) eden/WL_basement_2w -16 0 0.00 0.500000 0.500000 0 0 0 +( 424 792 8 ) ( -104 792 8 ) ( -104 792 0 ) eden/WL_basement_2w 112 0 0.00 0.500000 0.500000 0 0 0 +( -64 784 8 ) ( -64 248 8 ) ( -64 248 0 ) eden/WL_basement_2w -16 0 0.00 0.500000 0.500000 0 0 0 +( -64 768 8 ) ( 464 768 8 ) ( -64 768 0 ) eden/WL_basement_2w 112 0 0.00 0.500000 0.500000 0 0 0 +} +// brush 5 +{ +( 464 264 128 ) ( -64 264 128 ) ( -64 -272 128 ) eden/WL_basement_2w 112 0 0.00 0.500000 0.500000 0 0 0 +( -64 -272 264 ) ( -64 264 264 ) ( 464 264 264 ) eden/WL_basement_2w 112 0 0.00 0.500000 0.500000 0 0 0 +( 64 -296 8 ) ( 64 240 8 ) ( 64 240 0 ) eden/WL_basement_2w 0 0 0.00 0.500000 0.500000 0 0 0 +( 424 272 8 ) ( -104 272 8 ) ( -104 272 0 ) eden/WL_basement_2w 112 0 0.00 0.500000 0.500000 0 0 0 +( -64 264 8 ) ( -64 -272 8 ) ( -64 -272 0 ) eden/WL_basement_2w 0 0 0.00 0.500000 0.500000 0 0 0 +( -64 248 8 ) ( 464 248 8 ) ( -64 248 0 ) eden/WL_basement_2w 112 0 0.00 0.500000 0.500000 0 0 0 +} +// brush 6 +{ +( 592 264 -8 ) ( 64 264 -8 ) ( 64 -272 -8 ) eden/WL_basement_2w -144 0 0.00 0.500000 0.500000 0 0 0 +( 64 -272 264 ) ( 64 264 264 ) ( 592 264 264 ) eden/WL_basement_2w -144 0 0.00 0.500000 0.500000 0 0 0 +( 264 -288 8 ) ( 264 248 8 ) ( 264 248 0 ) eden/WL_basement_2w 0 0 0.00 0.500000 0.500000 0 0 0 +( 592 272 8 ) ( 64 272 8 ) ( 64 272 0 ) eden/WL_basement_2w -144 0 0.00 0.500000 0.500000 0 0 0 +( 64 264 8 ) ( 64 -272 8 ) ( 64 -272 0 ) eden/WL_basement_2w 0 0 0.00 0.500000 0.500000 0 0 0 +( 64 248 8 ) ( 592 248 8 ) ( 64 248 0 ) eden/WL_basement_2w -144 0 0.00 0.500000 0.500000 0 0 0 +} +// brush 7 +{ +( 264 1304 -8 ) ( -264 1304 -8 ) ( -264 768 -8 ) eden/WL_basement_2w 0 32 0.00 0.500000 0.500000 0 0 0 +( -264 768 264 ) ( -264 1304 264 ) ( 264 1304 264 ) eden/WL_basement_2w 0 32 0.00 0.500000 0.500000 0 0 0 +( -264 776 8 ) ( 264 776 8 ) ( 264 776 0 ) eden/WL_basement_2w 0 0 0.00 0.500000 0.500000 0 0 0 +( 264 1304 8 ) ( -264 1304 8 ) ( -264 1304 0 ) eden/WL_basement_2w 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 1304 8 ) ( -264 768 8 ) ( -264 768 0 ) eden/WL_basement_2w -32 0 0.00 0.500000 0.500000 0 0 0 +( -256 768 8 ) ( -256 1304 8 ) ( -256 768 0 ) eden/WL_basement_2w -32 0 0.00 0.500000 0.500000 0 0 0 +} +// brush 8 +{ +( 264 1304 -8 ) ( -264 1304 -8 ) ( -264 768 -8 ) eden/WL_basement_2w 0 32 0.00 0.500000 0.500000 0 0 0 +( -264 768 264 ) ( -264 1304 264 ) ( 264 1304 264 ) eden/WL_basement_2w 0 32 0.00 0.500000 0.500000 0 0 0 +( 264 768 8 ) ( 264 1304 8 ) ( 264 1304 0 ) eden/WL_basement_2w -32 0 0.00 0.500000 0.500000 0 0 0 +( 264 1304 8 ) ( -264 1304 8 ) ( -264 1304 0 ) eden/WL_basement_2w 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 1304 8 ) ( -264 768 8 ) ( -264 768 0 ) eden/WL_basement_2w -32 0 0.00 0.500000 0.500000 0 0 0 +( -264 1296 8 ) ( 264 1296 8 ) ( -264 1296 0 ) eden/WL_basement_2w 0 0 0.00 0.500000 0.500000 0 0 0 +} +// brush 9 +{ +( 264 1304 -8 ) ( -264 1304 -8 ) ( -264 768 -8 ) eden/WL_basement_2w 0 32 0.00 0.500000 0.500000 0 0 0 +( -264 768 264 ) ( -264 1304 264 ) ( 264 1304 264 ) eden/WL_basement_2w 0 32 0.00 0.500000 0.500000 0 0 0 +( -264 776 8 ) ( 264 776 8 ) ( 264 776 0 ) eden/WL_basement_2w 0 0 0.00 0.500000 0.500000 0 0 0 +( 264 768 8 ) ( 264 1304 8 ) ( 264 1304 0 ) eden/WL_basement_2w -32 0 0.00 0.500000 0.500000 0 0 0 +( 264 1304 8 ) ( -264 1304 8 ) ( -264 1304 0 ) eden/WL_basement_2w 0 0 0.00 0.500000 0.500000 0 0 0 +( 256 1304 8 ) ( 256 768 8 ) ( 256 1304 0 ) eden/WL_basement_2w -32 0 0.00 0.500000 0.500000 0 0 0 +} +// brush 10 +{ +( -264 768 264 ) ( -264 1304 264 ) ( 264 1304 264 ) eden/WL_basement_2w 0 32 0.00 0.500000 0.500000 0 0 0 +( -264 776 8 ) ( 264 776 8 ) ( 264 776 0 ) eden/WL_basement_2w 0 0 0.00 0.500000 0.500000 0 0 0 +( 264 768 8 ) ( 264 1304 8 ) ( 264 1304 0 ) eden/WL_basement_2w -32 0 0.00 0.500000 0.500000 0 0 0 +( 264 1304 8 ) ( -264 1304 8 ) ( -264 1304 0 ) eden/WL_basement_2w 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 1304 8 ) ( -264 768 8 ) ( -264 768 0 ) eden/WL_basement_2w -32 0 0.00 0.500000 0.500000 0 0 0 +( -264 1304 256 ) ( -264 768 256 ) ( 264 1304 256 ) eden/WL_basement_2w 0 32 0.00 0.500000 0.500000 0 0 0 +} +// brush 11 +{ +( 264 1304 -8 ) ( -264 1304 -8 ) ( -264 768 -8 ) eden/FL_edenhouse2 0 32 0.00 0.500000 0.500000 0 0 0 +( -264 776 8 ) ( 264 776 8 ) ( 264 776 0 ) eden/FL_edenhouse2 0 0 0.00 0.500000 0.500000 0 0 0 +( 264 768 8 ) ( 264 1304 8 ) ( 264 1304 0 ) eden/FL_edenhouse2 -32 0 0.00 0.500000 0.500000 0 0 0 +( 264 1304 8 ) ( -264 1304 8 ) ( -264 1304 0 ) eden/FL_edenhouse2 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 1304 8 ) ( -264 768 8 ) ( -264 768 0 ) eden/FL_edenhouse2 -32 0 0.00 0.500000 0.500000 0 0 0 +( -264 1304 0 ) ( 264 1304 0 ) ( -264 768 0 ) eden/FL_edenhouse2 0 32 0.00 0.500000 0.500000 0 0 0 +} +// brush 12 +{ +( 264 784 -8 ) ( -264 784 -8 ) ( -264 248 -8 ) eden/FL_edenhouse2 0 16 0.00 0.500000 0.500000 0 0 0 +( -264 256 8 ) ( 264 256 8 ) ( 264 256 0 ) eden/FL_edenhouse2 0 0 0.00 0.500000 0.500000 0 0 0 +( 264 248 8 ) ( 264 784 8 ) ( 264 784 0 ) eden/FL_edenhouse2 -16 0 0.00 0.500000 0.500000 0 0 0 +( 264 784 8 ) ( -264 784 8 ) ( -264 784 0 ) eden/FL_edenhouse2 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 784 8 ) ( -264 248 8 ) ( -264 248 0 ) eden/FL_edenhouse2 -16 0 0.00 0.500000 0.500000 0 0 0 +( -264 784 0 ) ( 264 784 0 ) ( -264 248 0 ) eden/FL_edenhouse2 0 16 0.00 0.500000 0.500000 0 0 0 +} +// brush 13 +{ +( -264 248 264 ) ( -264 784 264 ) ( 264 784 264 ) eden/WL_basement_2w 0 16 0.00 0.500000 0.500000 0 0 0 +( -264 256 8 ) ( 264 256 8 ) ( 264 256 0 ) eden/WL_basement_2w 0 0 0.00 0.500000 0.500000 0 0 0 +( 264 248 8 ) ( 264 784 8 ) ( 264 784 0 ) eden/WL_basement_2w -16 0 0.00 0.500000 0.500000 0 0 0 +( 264 784 8 ) ( -264 784 8 ) ( -264 784 0 ) eden/WL_basement_2w 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 784 8 ) ( -264 248 8 ) ( -264 248 0 ) eden/WL_basement_2w -16 0 0.00 0.500000 0.500000 0 0 0 +( -264 784 256 ) ( -264 248 256 ) ( 264 784 256 ) eden/WL_basement_2w 0 16 0.00 0.500000 0.500000 0 0 0 +} +// brush 14 +{ +( 264 784 -8 ) ( -264 784 -8 ) ( -264 248 -8 ) eden/WL_basement_2w 0 16 0.00 0.500000 0.500000 0 0 0 +( -264 248 264 ) ( -264 784 264 ) ( 264 784 264 ) eden/WL_basement_2w 0 16 0.00 0.500000 0.500000 0 0 0 +( -264 256 8 ) ( 264 256 8 ) ( 264 256 0 ) eden/WL_basement_2w 0 0 0.00 0.500000 0.500000 0 0 0 +( 264 248 8 ) ( 264 784 8 ) ( 264 784 0 ) eden/WL_basement_2w -16 0 0.00 0.500000 0.500000 0 0 0 +( 264 784 8 ) ( -264 784 8 ) ( -264 784 0 ) eden/WL_basement_2w 0 0 0.00 0.500000 0.500000 0 0 0 +( 256 784 8 ) ( 256 248 8 ) ( 256 784 0 ) eden/WL_basement_2w -16 0 0.00 0.500000 0.500000 0 0 0 +} +// brush 15 +{ +( 264 784 -8 ) ( -264 784 -8 ) ( -264 248 -8 ) eden/WL_basement_2w 0 16 0.00 0.500000 0.500000 0 0 0 +( -264 248 264 ) ( -264 784 264 ) ( 264 784 264 ) eden/WL_basement_2w 0 16 0.00 0.500000 0.500000 0 0 0 +( -264 256 8 ) ( 264 256 8 ) ( 264 256 0 ) eden/WL_basement_2w 0 0 0.00 0.500000 0.500000 0 0 0 +( 264 784 8 ) ( -264 784 8 ) ( -264 784 0 ) eden/WL_basement_2w 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 784 8 ) ( -264 248 8 ) ( -264 248 0 ) eden/WL_basement_2w -16 0 0.00 0.500000 0.500000 0 0 0 +( -256 248 8 ) ( -256 784 8 ) ( -256 248 0 ) eden/WL_basement_2w -16 0 0.00 0.500000 0.500000 0 0 0 +} +// brush 16 +{ +( 264 264 -8 ) ( -264 264 -8 ) ( -264 -272 -8 ) eden/WL_basement_2w 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 -272 264 ) ( -264 264 264 ) ( 264 264 264 ) eden/WL_basement_2w 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 -264 8 ) ( 264 -264 8 ) ( 264 -264 0 ) eden/WL_basement_2w 0 0 0.00 0.500000 0.500000 0 0 0 +( 264 264 8 ) ( -264 264 8 ) ( -264 264 0 ) eden/WL_basement_2w 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 264 8 ) ( -264 -272 8 ) ( -264 -272 0 ) eden/WL_basement_2w 0 0 0.00 0.500000 0.500000 0 0 0 +( -256 -272 8 ) ( -256 264 8 ) ( -256 -272 0 ) eden/WL_basement_2w 0 0 0.00 0.500000 0.500000 0 0 0 +} +// brush 17 +{ +( 264 264 -8 ) ( -264 264 -8 ) ( -264 -272 -8 ) eden/WL_basement_2w 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 -272 264 ) ( -264 264 264 ) ( 264 264 264 ) eden/WL_basement_2w 0 0 0.00 0.500000 0.500000 0 0 0 +( -64 -288 8 ) ( -64 248 8 ) ( -64 248 0 ) eden/WL_basement_2w 0 0 0.00 0.500000 0.500000 0 0 0 +( 264 272 8 ) ( -264 272 8 ) ( -264 272 0 ) eden/WL_basement_2w 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 264 8 ) ( -264 -272 8 ) ( -264 -272 0 ) eden/WL_basement_2w 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 248 8 ) ( 264 248 8 ) ( -264 248 0 ) eden/WL_basement_2w 0 0 0.00 0.500000 0.500000 0 0 0 +} +// brush 18 +{ +( 264 264 -8 ) ( -264 264 -8 ) ( -264 -272 -8 ) eden/WL_basement_2w 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 -272 264 ) ( -264 264 264 ) ( 264 264 264 ) eden/WL_basement_2w 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 -264 8 ) ( 264 -264 8 ) ( 264 -264 0 ) eden/WL_basement_2w 0 0 0.00 0.500000 0.500000 0 0 0 +( 264 -272 8 ) ( 264 264 8 ) ( 264 264 0 ) eden/WL_basement_2w 0 0 0.00 0.500000 0.500000 0 0 0 +( 264 264 8 ) ( -264 264 8 ) ( -264 264 0 ) eden/WL_basement_2w 0 0 0.00 0.500000 0.500000 0 0 0 +( 256 264 8 ) ( 256 -272 8 ) ( 256 264 0 ) eden/WL_basement_2w 0 0 0.00 0.500000 0.500000 0 0 0 +} +// brush 19 +{ +( 264 264 -8 ) ( -264 264 -8 ) ( -264 -272 -8 ) eden/WL_basement_2w 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 -272 264 ) ( -264 264 264 ) ( 264 264 264 ) eden/WL_basement_2w 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 -264 8 ) ( 264 -264 8 ) ( 264 -264 0 ) eden/WL_basement_2w 0 0 0.00 0.500000 0.500000 0 0 0 +( 264 -272 8 ) ( 264 264 8 ) ( 264 264 0 ) eden/WL_basement_2w 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 264 8 ) ( -264 -272 8 ) ( -264 -272 0 ) eden/WL_basement_2w 0 0 0.00 0.500000 0.500000 0 0 0 +( 264 -256 8 ) ( -264 -256 8 ) ( 264 -256 0 ) eden/WL_basement_2w 0 0 0.00 0.500000 0.500000 0 0 0 +} +// brush 20 +{ +( -264 -272 264 ) ( -264 264 264 ) ( 264 264 264 ) eden/WL_basement_2w 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 -264 8 ) ( 264 -264 8 ) ( 264 -264 0 ) eden/WL_basement_2w 0 0 0.00 0.500000 0.500000 0 0 0 +( 264 -272 8 ) ( 264 264 8 ) ( 264 264 0 ) eden/WL_basement_2w 0 0 0.00 0.500000 0.500000 0 0 0 +( 264 264 8 ) ( -264 264 8 ) ( -264 264 0 ) eden/WL_basement_2w 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 264 8 ) ( -264 -272 8 ) ( -264 -272 0 ) eden/WL_basement_2w 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 264 256 ) ( -264 -272 256 ) ( 264 264 256 ) eden/WL_basement_2w 0 0 0.00 0.500000 0.500000 0 0 0 +} +// brush 21 +{ +( 264 264 -8 ) ( -264 264 -8 ) ( -264 -272 -8 ) eden/FL_edenhouse2 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 -264 8 ) ( 264 -264 8 ) ( 264 -264 0 ) eden/FL_edenhouse2 0 0 0.00 0.500000 0.500000 0 0 0 +( 264 -272 8 ) ( 264 264 8 ) ( 264 264 0 ) eden/FL_edenhouse2 0 0 0.00 0.500000 0.500000 0 0 0 +( 264 264 8 ) ( -264 264 8 ) ( -264 264 0 ) eden/FL_edenhouse2 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 264 8 ) ( -264 -272 8 ) ( -264 -272 0 ) eden/FL_edenhouse2 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 264 0 ) ( 264 264 0 ) ( -264 -272 0 ) eden/FL_edenhouse2 0 0 0.00 0.500000 0.500000 0 0 0 +} +} +// entity 1 +{ +"classname" "func_door" +// brush 0 +{ +( 64 264 0 ) ( 0 264 0 ) ( 0 256 0 ) eden/door8 0 0 0.00 1 1 0 0 0 +( 0 256 128 ) ( 0 264 128 ) ( 64 264 128 ) eden/door8 0 0 0.00 1 1 0 0 0 +( 0 256 264 ) ( 64 256 264 ) ( 64 256 -8 ) eden/door8 0 0 0.00 1 1 0 0 0 +( 64 256 264 ) ( 64 264 264 ) ( 64 264 -8 ) eden/door8 0 0 0.00 1 1 0 0 0 +( 64 264 264 ) ( 0 264 264 ) ( 0 264 -8 ) eden/door8 0 0 0.00 1 1 0 0 0 +( 0 264 136 ) ( 0 256 136 ) ( 0 256 -136 ) eden/door8 0 0 0.00 1 1 0 0 0 +} +// brush 1 +{ +( 72 264 0 ) ( 56 264 0 ) ( 56 248 0 ) common/origin 0 -8 0.00 1 1 16777216 16512 0 +( 56 248 128 ) ( 56 264 128 ) ( 72 264 128 ) common/origin 0 -8 0.00 1 1 16777216 16512 0 +( 56 248 128 ) ( 72 248 128 ) ( 72 248 0 ) common/origin 0 0 0.00 1 1 16777216 16512 0 +( 72 248 128 ) ( 72 264 128 ) ( 72 264 0 ) common/origin 8 0 0.00 1 1 16777216 16512 0 +( 72 272 128 ) ( 56 272 128 ) ( 56 272 0 ) common/origin 0 0 0.00 1 1 16777216 16512 0 +( 56 264 128 ) ( 56 248 128 ) ( 56 248 0 ) common/origin 8 0 0.00 1 1 16777216 16512 0 +} +} +// entity 2 +{ +"angle" "180" +"classname" "func_door" +// brush 0 +{ +( -56 264 0 ) ( -72 264 0 ) ( -72 248 0 ) common/origin 0 -8 0.00 1 1 16777216 16512 0 +( -72 248 128 ) ( -72 264 128 ) ( -56 264 128 ) common/origin 0 -8 0.00 1 1 16777216 16512 0 +( -72 248 128 ) ( -56 248 128 ) ( -56 248 0 ) common/origin 0 0 0.00 1 1 16777216 16512 0 +( -56 248 128 ) ( -56 264 128 ) ( -56 264 0 ) common/origin 8 0 0.00 1 1 16777216 16512 0 +( -56 272 128 ) ( -72 272 128 ) ( -72 272 0 ) common/origin 0 0 0.00 1 1 16777216 16512 0 +( -72 264 128 ) ( -72 248 128 ) ( -72 248 0 ) common/origin 8 0 0.00 1 1 16777216 16512 0 +} +// brush 1 +{ +( 0 264 0 ) ( -64 264 0 ) ( -64 256 0 ) eden/door8 0 0 0.00 1 1 0 0 0 +( -64 256 128 ) ( -64 264 128 ) ( 0 264 128 ) eden/door8 0 0 0.00 1 1 0 0 0 +( -64 256 264 ) ( 0 256 264 ) ( 0 256 -8 ) eden/door8 0 0 0.00 1 1 0 0 0 +( 0 256 136 ) ( 0 264 136 ) ( 0 264 -136 ) eden/door8 0 0 0.00 1 1 0 0 0 +( 0 264 264 ) ( -64 264 264 ) ( -64 264 -8 ) eden/door8 0 0 0.00 1 1 0 0 0 +( -64 264 264 ) ( -64 256 264 ) ( -64 256 -8 ) eden/door8 0 0 0.00 1 1 0 0 0 +} +} +// entity 3 +{ +"classname" "func_rotatingdoor" +"spawnflags" "2" +"angle" "0" +// brush 0 +{ +( -56 784 0 ) ( -72 784 0 ) ( -72 768 0 ) common/origin 0 0 0.00 1 1 16777216 16512 0 +( -72 768 128 ) ( -72 784 128 ) ( -56 784 128 ) common/origin 0 0 0.00 1 1 16777216 16512 0 +( -72 768 128 ) ( -56 768 128 ) ( -56 768 0 ) common/origin 0 0 0.00 1 1 16777216 16512 0 +( -56 768 128 ) ( -56 784 128 ) ( -56 784 0 ) common/origin 0 0 0.00 1 1 16777216 16512 0 +( -56 792 128 ) ( -72 792 128 ) ( -72 792 0 ) common/origin 0 0 0.00 1 1 16777216 16512 0 +( -72 784 128 ) ( -72 768 128 ) ( -72 768 0 ) common/origin 0 0 0.00 1 1 16777216 16512 0 +} +// brush 1 +{ +( 0 784 0 ) ( -64 784 0 ) ( -64 776 0 ) eden/door8 0 0 0.00 1 1 0 0 0 +( -64 776 128 ) ( -64 784 128 ) ( 0 784 128 ) eden/door8 0 0 0.00 1 1 0 0 0 +( -64 776 264 ) ( 0 776 264 ) ( 0 776 -8 ) eden/door8 0 0 0.00 1 1 0 0 0 +( 0 776 136 ) ( 0 784 136 ) ( 0 784 -136 ) eden/door8 0 0 0.00 1 1 0 0 0 +( 0 784 264 ) ( -64 784 264 ) ( -64 784 -8 ) eden/door8 0 0 0.00 1 1 0 0 0 +( -64 784 264 ) ( -64 776 264 ) ( -64 776 -8 ) eden/door8 0 0 0.00 1 1 0 0 0 +} +} +// entity 4 +{ +"spawnflags" "0" +"classname" "func_rotatingdoor" +"angle" "180" +// brush 0 +{ +( 72 784 0 ) ( 56 784 0 ) ( 56 768 0 ) common/origin 0 0 0.00 1 1 16777216 16512 0 +( 56 768 128 ) ( 56 784 128 ) ( 72 784 128 ) common/origin 0 0 0.00 1 1 16777216 16512 0 +( 56 768 128 ) ( 72 768 128 ) ( 72 768 0 ) common/origin 0 0 0.00 1 1 16777216 16512 0 +( 72 768 128 ) ( 72 784 128 ) ( 72 784 0 ) common/origin 0 0 0.00 1 1 16777216 16512 0 +( 72 792 128 ) ( 56 792 128 ) ( 56 792 0 ) common/origin 0 0 0.00 1 1 16777216 16512 0 +( 56 784 128 ) ( 56 768 128 ) ( 56 768 0 ) common/origin 0 0 0.00 1 1 16777216 16512 0 +} +// brush 1 +{ +( 64 784 0 ) ( 0 784 0 ) ( 0 776 0 ) eden/door8 0 0 0.00 1 1 0 0 0 +( 0 776 128 ) ( 0 784 128 ) ( 64 784 128 ) eden/door8 0 0 0.00 1 1 0 0 0 +( 0 776 264 ) ( 64 776 264 ) ( 64 776 -8 ) eden/door8 0 0 0.00 1 1 0 0 0 +( 64 776 264 ) ( 64 784 264 ) ( 64 784 -8 ) eden/door8 0 0 0.00 1 1 0 0 0 +( 64 784 264 ) ( 0 784 264 ) ( 0 784 -8 ) eden/door8 0 0 0.00 1 1 0 0 0 +( 0 784 136 ) ( 0 776 136 ) ( 0 776 -136 ) eden/door8 0 0 0.00 1 1 0 0 0 +} +} +// entity 5 +{ +"classname" "light" +"light" "1000" +"origin" "0 0 128" +} +// entity 6 +{ +"classname" "info_player_start" +"angle" "90" +"origin" "0 -192 16" +} +// entity 7 +{ +"origin" "0 520 128" +"light" "1000" +"classname" "light" +} +// entity 8 +{ +"origin" "0 328 16" +"angle" "90" +"classname" "info_player_start" +} +// entity 9 +{ +"classname" "light" +"light" "1000" +"origin" "0 1040 128" +} +// entity 10 +{ +"classname" "info_player_start" +"angle" "90" +"origin" "0 848 16" +} diff --git a/fakk/maps/example/doors.prt b/fakk/maps/example/doors.prt new file mode 100644 index 0000000..74f5a02 --- /dev/null +++ b/fakk/maps/example/doors.prt @@ -0,0 +1,132 @@ +PRT1 +24 +40 +88 +4 0 12 0 (0 1024 0 ) (0 1024 256 ) (0 1296 256 ) (0 1296 0 ) +4 0 1 0 (0 1024 256 ) (0 1024 0 ) (256 1024 0 ) (256 1024 256 ) +4 1 13 0 (0 792 256 ) (0 1024 256 ) (0 1024 0 ) (0 792 0 ) +4 1 6 0 (0 792 0 ) (64 792 0 ) (64 792 128 ) (0 792 128 ) +4 2 8 0 (64 768 0 ) (64 272 0 ) (64 272 128 ) (64 768 128 ) +4 2 4 0 (64 272 128 ) (64 272 256 ) (64 768 256 ) (64 768 128 ) +4 3 11 0 (64 0 0 ) (256 0 0 ) (256 0 256 ) (64 0 256 ) +4 3 10 0 (64 248 0 ) (64 0 0 ) (64 0 128 ) (64 248 128 ) +4 3 5 0 (64 0 128 ) (64 0 256 ) (64 248 256 ) (64 248 128 ) +4 4 14 0 (0 272 256 ) (0 768 256 ) (0 768 128 ) (0 272 128 ) +4 4 8 0 (64 768 128 ) (64 272 128 ) (0 272 128 ) (0 768 128 ) +4 5 15 0 (0 0 128 ) (0 0 256 ) (0 248 256 ) (0 248 128 ) +4 5 11 0 (0 0 256 ) (0 0 128 ) (64 0 128 ) (64 0 256 ) +4 5 10 0 (64 248 128 ) (64 0 128 ) (0 0 128 ) (0 248 128 ) +4 6 16 0 (0 784 128 ) (0 792 128 ) (0 792 0 ) (0 784 0 ) +4 6 7 0 (0 784 0 ) (64 784 0 ) (64 784 128 ) (0 784 128 ) +4 7 17 0 (0 776 128 ) (0 784 128 ) (0 784 0 ) (0 776 0 ) +4 7 8 0 (0 776 0 ) (64 776 0 ) (64 776 128 ) (0 776 128 ) +4 8 18 0 (0 264 128 ) (0 776 128 ) (0 776 0 ) (0 264 0 ) +4 8 9 0 (0 264 0 ) (64 264 0 ) (64 264 128 ) (0 264 128 ) +4 9 19 0 (0 256 128 ) (0 264 128 ) (0 264 0 ) (0 256 0 ) +4 9 10 0 (0 256 0 ) (64 256 0 ) (64 256 128 ) (0 256 128 ) +4 10 20 0 (0 0 0 ) (0 0 128 ) (0 256 128 ) (0 256 0 ) +4 10 11 0 (0 0 128 ) (0 0 0 ) (64 0 0 ) (64 0 128 ) +4 11 23 0 (0 0 256 ) (0 0 0 ) (0 -256 0 ) (0 -256 256 ) +4 12 13 0 (0 1024 0 ) (0 1024 256 ) (-256 1024 256 ) (-256 1024 0 ) +4 13 16 0 (-64 792 128 ) (-64 792 0 ) (0 792 0 ) (0 792 128 ) +4 14 21 0 (-64 768 128 ) (-64 272 128 ) (-64 272 256 ) (-64 768 256 ) +4 14 18 0 (-64 272 128 ) (-64 768 128 ) (0 768 128 ) (0 272 128 ) +4 15 23 0 (0 0 128 ) (0 0 256 ) (-64 0 256 ) (-64 0 128 ) +4 15 22 0 (-64 248 128 ) (-64 0 128 ) (-64 0 256 ) (-64 248 256 ) +4 15 20 0 (0 0 128 ) (-64 0 128 ) (-64 248 128 ) (0 248 128 ) +4 16 17 0 (0 784 128 ) (-64 784 128 ) (-64 784 0 ) (0 784 0 ) +4 17 18 0 (0 776 128 ) (-64 776 128 ) (-64 776 0 ) (0 776 0 ) +4 18 21 0 (-64 768 0 ) (-64 272 0 ) (-64 272 128 ) (-64 768 128 ) +4 18 19 0 (0 264 128 ) (-64 264 128 ) (-64 264 0 ) (0 264 0 ) +4 19 20 0 (0 256 128 ) (-64 256 128 ) (-64 256 0 ) (0 256 0 ) +4 20 23 0 (-64 0 0 ) (0 0 0 ) (0 0 128 ) (-64 0 128 ) +4 20 22 0 (-64 248 0 ) (-64 0 0 ) (-64 0 128 ) (-64 248 128 ) +4 22 23 0 (-256 0 0 ) (-64 0 0 ) (-64 0 256 ) (-256 0 256 ) +4 0 (256 1296 256 ) (0 1296 256 ) (0 1024 256 ) (256 1024 256 ) +4 0 (256 1024 0 ) (0 1024 0 ) (0 1296 0 ) (256 1296 0 ) +4 0 (256 1296 256 ) (256 1296 0 ) (0 1296 0 ) (0 1296 256 ) +4 0 (256 1024 0 ) (256 1296 0 ) (256 1296 256 ) (256 1024 256 ) +4 1 (64 792 128 ) (64 792 256 ) (0 792 256 ) (0 792 128 ) +4 1 (64 792 0 ) (256 792 0 ) (256 792 256 ) (64 792 256 ) +4 1 (0 792 256 ) (256 792 256 ) (256 1024 256 ) (0 1024 256 ) +4 1 (0 792 0 ) (0 1024 0 ) (256 1024 0 ) (256 792 0 ) +4 1 (256 792 256 ) (256 792 0 ) (256 1024 0 ) (256 1024 256 ) +4 2 (64 768 256 ) (64 272 256 ) (256 272 256 ) (256 768 256 ) +4 2 (64 272 0 ) (64 768 0 ) (256 768 0 ) (256 272 0 ) +4 2 (256 768 256 ) (256 272 256 ) (256 272 0 ) (256 768 0 ) +4 2 (256 768 256 ) (256 768 0 ) (64 768 0 ) (64 768 256 ) +4 2 (64 272 256 ) (64 272 0 ) (256 272 0 ) (256 272 256 ) +4 3 (256 248 256 ) (256 248 0 ) (64 248 0 ) (64 248 256 ) +4 3 (256 248 256 ) (256 0 256 ) (256 0 0 ) (256 248 0 ) +4 3 (256 0 0 ) (64 0 0 ) (64 248 0 ) (256 248 0 ) +4 3 (64 248 256 ) (64 0 256 ) (256 0 256 ) (256 248 256 ) +4 4 (0 768 256 ) (64 768 256 ) (64 768 128 ) (0 768 128 ) +4 4 (64 272 256 ) (64 768 256 ) (0 768 256 ) (0 272 256 ) +4 4 (0 272 128 ) (64 272 128 ) (64 272 256 ) (0 272 256 ) +4 5 (0 248 256 ) (64 248 256 ) (64 248 128 ) (0 248 128 ) +4 5 (64 248 256 ) (0 248 256 ) (0 0 256 ) (64 0 256 ) +4 6 (0 784 128 ) (64 784 128 ) (64 792 128 ) (0 792 128 ) +4 6 (0 784 0 ) (0 792 0 ) (64 792 0 ) (64 784 0 ) +4 6 (64 784 128 ) (64 784 0 ) (64 792 0 ) (64 792 128 ) +4 7 (0 784 128 ) (0 776 128 ) (64 776 128 ) (64 784 128 ) +4 7 (0 776 0 ) (0 784 0 ) (64 784 0 ) (64 776 0 ) +4 7 (64 784 128 ) (64 776 128 ) (64 776 0 ) (64 784 0 ) +4 8 (0 272 128 ) (0 264 128 ) (64 264 128 ) (64 272 128 ) +4 8 (0 776 128 ) (0 768 128 ) (64 768 128 ) (64 776 128 ) +4 8 (0 264 0 ) (0 776 0 ) (64 776 0 ) (64 264 0 ) +4 8 (64 776 128 ) (64 768 128 ) (64 768 0 ) (64 776 0 ) +4 8 (64 272 128 ) (64 264 128 ) (64 264 0 ) (64 272 0 ) +4 9 (64 264 128 ) (64 256 128 ) (64 256 0 ) (64 264 0 ) +4 9 (0 256 0 ) (0 264 0 ) (64 264 0 ) (64 256 0 ) +4 9 (0 264 128 ) (0 256 128 ) (64 256 128 ) (64 264 128 ) +4 10 (64 256 128 ) (64 248 128 ) (64 248 0 ) (64 256 0 ) +4 10 (64 0 0 ) (0 0 0 ) (0 256 0 ) (64 256 0 ) +4 10 (0 256 128 ) (0 248 128 ) (64 248 128 ) (64 256 128 ) +4 11 (0 -256 256 ) (0 -256 0 ) (256 -256 0 ) (256 -256 256 ) +4 11 (256 -256 256 ) (256 -256 0 ) (256 0 0 ) (256 0 256 ) +4 11 (0 -256 0 ) (0 0 0 ) (256 0 0 ) (256 -256 0 ) +4 11 (256 0 256 ) (0 0 256 ) (0 -256 256 ) (256 -256 256 ) +4 12 (0 1296 256 ) (-256 1296 256 ) (-256 1024 256 ) (0 1024 256 ) +4 12 (0 1024 0 ) (-256 1024 0 ) (-256 1296 0 ) (0 1296 0 ) +4 12 (-256 1296 0 ) (-256 1024 0 ) (-256 1024 256 ) (-256 1296 256 ) +4 12 (0 1296 0 ) (-256 1296 0 ) (-256 1296 256 ) (0 1296 256 ) +4 13 (-64 792 256 ) (-256 792 256 ) (-256 792 0 ) (-64 792 0 ) +4 13 (0 792 256 ) (-64 792 256 ) (-64 792 128 ) (0 792 128 ) +4 13 (0 792 256 ) (0 1024 256 ) (-256 1024 256 ) (-256 792 256 ) +4 13 (-256 792 0 ) (-256 1024 0 ) (0 1024 0 ) (0 792 0 ) +4 13 (-256 1024 256 ) (-256 1024 0 ) (-256 792 0 ) (-256 792 256 ) +4 14 (0 768 256 ) (0 768 128 ) (-64 768 128 ) (-64 768 256 ) +4 14 (0 272 256 ) (0 768 256 ) (-64 768 256 ) (-64 272 256 ) +4 14 (-64 272 256 ) (-64 272 128 ) (0 272 128 ) (0 272 256 ) +4 15 (0 248 256 ) (0 248 128 ) (-64 248 128 ) (-64 248 256 ) +4 15 (0 248 256 ) (-64 248 256 ) (-64 0 256 ) (0 0 256 ) +4 16 (-64 792 128 ) (-64 792 0 ) (-64 784 0 ) (-64 784 128 ) +4 16 (0 784 128 ) (0 792 128 ) (-64 792 128 ) (-64 784 128 ) +4 16 (-64 784 0 ) (-64 792 0 ) (0 792 0 ) (0 784 0 ) +4 17 (-64 784 0 ) (-64 776 0 ) (-64 776 128 ) (-64 784 128 ) +4 17 (0 776 128 ) (0 784 128 ) (-64 784 128 ) (-64 776 128 ) +4 17 (-64 776 0 ) (-64 784 0 ) (0 784 0 ) (0 776 0 ) +4 18 (-64 272 0 ) (-64 264 0 ) (-64 264 128 ) (-64 272 128 ) +4 18 (-64 776 0 ) (-64 768 0 ) (-64 768 128 ) (-64 776 128 ) +4 18 (0 264 128 ) (0 272 128 ) (-64 272 128 ) (-64 264 128 ) +4 18 (0 768 128 ) (0 776 128 ) (-64 776 128 ) (-64 768 128 ) +4 18 (-64 264 0 ) (-64 776 0 ) (0 776 0 ) (0 264 0 ) +4 19 (-64 264 0 ) (-64 256 0 ) (-64 256 128 ) (-64 264 128 ) +4 19 (-64 256 0 ) (-64 264 0 ) (0 264 0 ) (0 256 0 ) +4 19 (0 256 128 ) (0 264 128 ) (-64 264 128 ) (-64 256 128 ) +4 20 (-64 256 0 ) (-64 248 0 ) (-64 248 128 ) (-64 256 128 ) +4 20 (0 0 0 ) (-64 0 0 ) (-64 256 0 ) (0 256 0 ) +4 20 (0 248 128 ) (0 256 128 ) (-64 256 128 ) (-64 248 128 ) +4 21 (-64 272 256 ) (-64 768 256 ) (-256 768 256 ) (-256 272 256 ) +4 21 (-256 272 0 ) (-256 768 0 ) (-64 768 0 ) (-64 272 0 ) +4 21 (-256 768 0 ) (-256 272 0 ) (-256 272 256 ) (-256 768 256 ) +4 21 (-256 768 0 ) (-256 768 256 ) (-64 768 256 ) (-64 768 0 ) +4 21 (-64 272 0 ) (-64 272 256 ) (-256 272 256 ) (-256 272 0 ) +4 22 (-256 248 0 ) (-256 248 256 ) (-64 248 256 ) (-64 248 0 ) +4 22 (-256 248 0 ) (-256 0 0 ) (-256 0 256 ) (-256 248 256 ) +4 22 (-64 0 0 ) (-256 0 0 ) (-256 248 0 ) (-64 248 0 ) +4 22 (-64 248 256 ) (-256 248 256 ) (-256 0 256 ) (-64 0 256 ) +4 23 (-256 -256 256 ) (-256 -256 0 ) (0 -256 0 ) (0 -256 256 ) +4 23 (-256 0 256 ) (-256 0 0 ) (-256 -256 0 ) (-256 -256 256 ) +4 23 (-256 -256 0 ) (-256 0 0 ) (0 0 0 ) (0 -256 0 ) +4 23 (0 0 256 ) (-256 0 256 ) (-256 -256 256 ) (0 -256 256 ) diff --git a/fakk/maps/example/earthquake.bsp b/fakk/maps/example/earthquake.bsp new file mode 100644 index 0000000000000000000000000000000000000000..2c8571ba908f37f1fb9f46e86f8428c5ca51f247 GIT binary patch literal 58780 zcmeHMOK_A~6~4?MFvti98Wk9tCO`lo4-g1L=nmnb72eboRGA`aNhh>Px?`tPj5AKz z3regh7qeht$wnxbE?l@^K~*x~LMiokvS4(#wRe+>@^^>OHa z=#%hYziZ5StYfbm^HJ#Y(7T|&3_S_m_l7Zh&`%-#d|^DF9&1kbr?brm5BE}^&yA0z z+kkoynPX7SN_nnNr2F%^+{lBZ2r-W{m#NVg_BfvHPv-~oIq0zTw3E4&xz6QAMsnHa zLOwG%n9ffd?K_KD2wzk7VghrzoD?Ty7HI45oU&Q}tDX4il~=-sKaFW%GUJreI_I#(Ek4AJl4b%J*+wjvP63=uje&*tv6Ob8~Z3QxovBHe~72rOTErYiMX#v0}yQ)vMR8UAun$ zdi1<;<3>C&hXro^=D{(?V_?9hO+S=N1u5ftp#2l932mymv0DK)G<@A>x zn(^|0;P9iv&dyGpd=TE(*EcXQkjZ55#2gmb;ROaC6X0iU2q*=yIOI4d+qZA;=;%0b z;6QhG_tB$A@x&Y!*x>~xcm;KYJYN2B9$H#j+S}Xr@85s?_;H+h(4Ng^M@L8T#2gmb z;ROar;Ad?JE*6}8(2LXF)zx+Kj-(g{Nru}tGjpa z#wCOHaP8pagZ#0vF+4Gc1$KCW0TTFG8-lwXX9Fi3B%e8R2DD$gbm_{KE7z`F!xM8@ zV22kNAc3zVP_=STnS={ruYH->?`2G9$!{drMEU?2143NNAhC~Rh42b|9ak*~Y zI$VYi{`&{`SsQ|n4DNP()#A3tg@ZE>^53>EAb7$8JG{UE34CQpgwM*52;dQyv-Zb) z9gX3O2|v>CYX_GM?tEN3;o%P^u)q#4FhJU`vS>(z&&rSpK$jr{m4|uupZ~D=cfh3b zGN1kT|2u&8a0_+(n5iQqET@wQ19kkEuOlQ|@bX}Zq;h~aR3t(ZbMHo_Rn?teAQ+7V>zKC%3EB8dF)M5?RdM}35 ziepakYGFUD7fO}ARqjX7Qfmnetn~p5sTJ^6R*Ub8{86HHJX`g8QfoPoto00r)M7Bj z+ZSuiw6BUY!5mLwNGw}@oJ$?SPOM4#MvtM=I@K#vDOX@sWs$MMQTY6(GF#m z)T-EurJmN_GI_fiAA(lWF7sCm3=mu3^_KVr{c3*1X4^aS+b-A z+bxVPu?CvhxqGKNXTbXX63ZT{=0y*FzwDtZHi9$gcaiIX zdkAv7ejV1&OKix)1S87#=J)%#8L+lq5>E_b!*}fGWe*sk085-5cz=O-{YLgjoaLb! zwhMVUkdwmmI31Q4d2hs4?cpZu82n5c)Evba$CzZ#6U^YG6yU=96&RjDVr||D0YaA? zc3)tdBnIOp>RNe;MGwTX2V$%C09>@+A;Ch2QUZ?HNZzrTut*^N5^MXdmiMNsL<|Od zsEP$H+HVS2?u`<1T*93FGOx!&W+p7)(l4>>fl`)NdZ2?C4E9hHi$47Ga2nXKU(BtP z5YN2CQkV~e*f1~VR!RX*u#?1K^ioT|m{(vu9*C{k1NxADnfr*BmpO|G{yu`1e%)C& z4!gwNsbyH~%Rf8BK8H~g>v~{)4q|0*Q+c1{6!L@{oX^4df3x#95BJQyQ)JFHe+LO4 z)Z|KV;ujk=h56_cKi3rgei9$o;*ZA5?>hP^^D!1;_AM#r`aqcp(WkV!5{3 z1rW=gLcFuvxGH$=!%Hb>%b6cT2Xm8Kio_)C$~`1Mmc;sapQogQTa6g<%E5Og`78Q| zFX;xcBE++76fb;+jk*ANhan!pZ@pbAg?Qk6KII⪼>+((vYcOHn)y^*Y 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�Fv= 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 literal 0 HcmV?d00001 diff --git a/fakk/maps/example/exploder.map b/fakk/maps/example/exploder.map new file mode 100644 index 0000000..f23782b --- /dev/null +++ b/fakk/maps/example/exploder.map @@ -0,0 +1,99 @@ +{ +"classname" "worldspawn" +// brush 0 +{ +( 64 64 0 ) ( -64 64 0 ) ( -64 -64 0 ) eden/FL_underground 0 0 0.00 1 1 0 0 0 +( -64 -64 8 ) ( -64 64 8 ) ( 64 64 8 ) eden/FL_underground 0 0 0.00 1 1 0 0 0 +( -72 -64 8 ) ( 56 -64 8 ) ( 56 -64 0 ) eden/FL_underground 0 0 0.00 1 1 0 0 0 +( 64 -64 8 ) ( 64 64 8 ) ( 64 64 0 ) eden/FL_underground 0 0 0.00 1 1 0 0 0 +( 64 64 8 ) ( -64 64 8 ) ( -64 64 0 ) eden/FL_underground 0 0 0.00 1 1 0 0 0 +( -64 64 8 ) ( -64 -64 8 ) ( -64 -64 0 ) eden/FL_underground 0 0 0.00 1 1 0 0 0 +} +// brush 1 +{ +( 264 264 -8 ) ( -264 264 -8 ) ( -264 -272 -8 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 -272 264 ) ( -264 264 264 ) ( 264 264 264 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 -264 8 ) ( 264 -264 8 ) ( 264 -264 0 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( 264 264 8 ) ( -264 264 8 ) ( -264 264 0 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 264 8 ) ( -264 -272 8 ) ( -264 -272 0 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( -256 -272 8 ) ( -256 264 8 ) ( -256 -272 0 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +} +// brush 2 +{ +( 264 264 -8 ) ( -264 264 -8 ) ( -264 -272 -8 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 -272 264 ) ( -264 264 264 ) ( 264 264 264 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( 264 -272 8 ) ( 264 264 8 ) ( 264 264 0 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( 264 264 8 ) ( -264 264 8 ) ( -264 264 0 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 264 8 ) ( -264 -272 8 ) ( -264 -272 0 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 256 8 ) ( 264 256 8 ) ( -264 256 0 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +} +// brush 3 +{ +( 264 264 -8 ) ( -264 264 -8 ) ( -264 -272 -8 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 -272 264 ) ( -264 264 264 ) ( 264 264 264 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 -264 8 ) ( 264 -264 8 ) ( 264 -264 0 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( 264 -272 8 ) ( 264 264 8 ) ( 264 264 0 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( 264 264 8 ) ( -264 264 8 ) ( -264 264 0 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( 256 264 8 ) ( 256 -272 8 ) ( 256 264 0 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +} +// brush 4 +{ +( 264 264 -8 ) ( -264 264 -8 ) ( -264 -272 -8 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 -272 264 ) ( -264 264 264 ) ( 264 264 264 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 -264 8 ) ( 264 -264 8 ) ( 264 -264 0 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( 264 -272 8 ) ( 264 264 8 ) ( 264 264 0 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 264 8 ) ( -264 -272 8 ) ( -264 -272 0 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( 264 -256 8 ) ( -264 -256 8 ) ( 264 -256 0 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +} +// brush 5 +{ +( -264 -272 264 ) ( -264 264 264 ) ( 264 264 264 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 -264 8 ) ( 264 -264 8 ) ( 264 -264 0 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( 264 -272 8 ) ( 264 264 8 ) ( 264 264 0 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( 264 264 8 ) ( -264 264 8 ) ( -264 264 0 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 264 8 ) ( -264 -272 8 ) ( -264 -272 0 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 264 256 ) ( -264 -272 256 ) ( 264 264 256 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +} +// brush 6 +{ +( 264 264 -8 ) ( -264 264 -8 ) ( -264 -272 -8 ) eden/FL_edenhouse2 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 -264 8 ) ( 264 -264 8 ) ( 264 -264 0 ) eden/FL_edenhouse2 0 0 0.00 0.500000 0.500000 0 0 0 +( 264 -272 8 ) ( 264 264 8 ) ( 264 264 0 ) eden/FL_edenhouse2 0 0 0.00 0.500000 0.500000 0 0 0 +( 264 264 8 ) ( -264 264 8 ) ( -264 264 0 ) eden/FL_edenhouse2 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 264 8 ) ( -264 -272 8 ) ( -264 -272 0 ) eden/FL_edenhouse2 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 264 0 ) ( 264 264 0 ) ( -264 -272 0 ) eden/FL_edenhouse2 0 0 0.00 0.500000 0.500000 0 0 0 +} +} +// entity 1 +{ +"wait" "5" +"classname" "trigger_multiple" +"target" "t1" +// brush 0 +{ +( 64 64 8 ) ( -56 64 8 ) ( -56 -64 8 ) common/trigger 0 0 0.00 1 1 0 128 0 +( -56 -64 192 ) ( -56 64 192 ) ( 64 64 192 ) common/trigger 0 0 0.00 1 1 0 128 0 +( -56 -64 16 ) ( 64 -64 16 ) ( 64 -64 8 ) common/trigger 0 0 0.00 1 1 0 128 0 +( 64 -64 16 ) ( 64 64 16 ) ( 64 64 8 ) common/trigger 0 0 0.00 1 1 0 128 0 +( 64 64 16 ) ( -56 64 16 ) ( -56 64 8 ) common/trigger 0 0 0.00 1 1 0 128 0 +( -64 64 16 ) ( -64 -64 16 ) ( -64 -64 8 ) common/trigger 0 0 0.00 1 1 0 128 0 +} +} +// entity 2 +{ +"origin" "0 192 112" +"classname" "func_exploder" +"targetname" "t1" +} +// entity 3 +{ +"classname" "light" +"light" "1000" +"origin" "0 0 128" +} +// entity 4 +{ +"classname" "info_player_start" +"angle" "90" +"origin" "0 -192 16" +} diff --git a/fakk/maps/example/exploder.prt b/fakk/maps/example/exploder.prt new file mode 100644 index 0000000..67779b6 --- /dev/null +++ b/fakk/maps/example/exploder.prt @@ -0,0 +1,68 @@ +PRT1 +12 +20 +44 +4 0 6 0 (0 0 8 ) (0 0 256 ) (0 256 256 ) (0 256 8 ) +4 0 3 0 (0 0 256 ) (0 0 8 ) (256 0 8 ) (256 0 256 ) +4 0 2 0 (0 256 8 ) (64 256 8 ) (64 64 8 ) (0 64 8 ) +4 0 1 0 (64 256 8 ) (256 256 8 ) (256 0 8 ) (64 0 8 ) +4 1 4 0 (64 0 0 ) (256 0 0 ) (256 0 8 ) (64 0 8 ) +4 1 2 0 (64 256 0 ) (64 64 0 ) (64 64 8 ) (64 256 8 ) +4 2 7 0 (0 64 8 ) (0 256 8 ) (0 256 0 ) (0 64 0 ) +4 3 9 0 (0 0 256 ) (0 0 8 ) (0 -256 8 ) (0 -256 256 ) +4 3 5 0 (64 -256 8 ) (0 -256 8 ) (0 -64 8 ) (64 -64 8 ) +4 3 4 0 (256 -256 8 ) (64 -256 8 ) (64 0 8 ) (256 0 8 ) +4 4 5 0 (64 -64 0 ) (64 -256 0 ) (64 -256 8 ) (64 -64 8 ) +4 5 10 0 (0 -64 0 ) (0 -256 0 ) (0 -256 8 ) (0 -64 8 ) +4 6 9 0 (0 0 8 ) (0 0 256 ) (-256 0 256 ) (-256 0 8 ) +4 6 7 0 (-64 64 8 ) (-64 256 8 ) (0 256 8 ) (0 64 8 ) +4 6 8 0 (-64 0 8 ) (-256 0 8 ) (-256 256 8 ) (-64 256 8 ) +4 7 8 0 (-64 64 8 ) (-64 256 8 ) (-64 256 0 ) (-64 64 0 ) +4 8 11 0 (-64 0 8 ) (-256 0 8 ) (-256 0 0 ) (-64 0 0 ) +4 9 10 0 (0 -256 8 ) (-64 -256 8 ) (-64 -64 8 ) (0 -64 8 ) +4 9 11 0 (-64 -256 8 ) (-256 -256 8 ) (-256 0 8 ) (-64 0 8 ) +4 10 11 0 (-64 -64 0 ) (-64 -256 0 ) (-64 -256 8 ) (-64 -64 8 ) +4 0 (64 64 8 ) (64 0 8 ) (0 0 8 ) (0 64 8 ) +4 0 (0 0 256 ) (256 0 256 ) (256 256 256 ) (0 256 256 ) +4 0 (256 256 256 ) (256 256 8 ) (0 256 8 ) (0 256 256 ) +4 0 (256 0 256 ) (256 0 8 ) (256 256 8 ) (256 256 256 ) +4 1 (64 64 0 ) (64 0 0 ) (64 0 8 ) (64 64 8 ) +4 1 (256 0 8 ) (256 0 0 ) (256 256 0 ) (256 256 8 ) +4 1 (64 256 8 ) (256 256 8 ) (256 256 0 ) (64 256 0 ) +4 1 (256 0 0 ) (64 0 0 ) (64 256 0 ) (256 256 0 ) +4 2 (0 64 0 ) (0 256 0 ) (64 256 0 ) (64 64 0 ) +4 2 (64 256 8 ) (64 256 0 ) (0 256 0 ) (0 256 8 ) +4 2 (0 64 0 ) (64 64 0 ) (64 64 8 ) (0 64 8 ) +4 3 (0 -64 8 ) (0 0 8 ) (64 0 8 ) (64 -64 8 ) +4 3 (256 0 256 ) (0 0 256 ) (0 -256 256 ) (256 -256 256 ) +4 3 (256 -256 256 ) (256 -256 8 ) (256 0 8 ) (256 0 256 ) +4 3 (0 -256 256 ) (0 -256 8 ) (256 -256 8 ) (256 -256 256 ) +4 4 (64 0 0 ) (64 -64 0 ) (64 -64 8 ) (64 0 8 ) +4 4 (64 -256 0 ) (256 -256 0 ) (256 -256 8 ) (64 -256 8 ) +4 4 (256 -256 8 ) (256 -256 0 ) (256 0 0 ) (256 0 8 ) +4 4 (64 0 0 ) (256 0 0 ) (256 -256 0 ) (64 -256 0 ) +4 5 (0 -256 0 ) (0 -64 0 ) (64 -64 0 ) (64 -256 0 ) +4 5 (0 -256 8 ) (0 -256 0 ) (64 -256 0 ) (64 -256 8 ) +4 5 (0 -64 8 ) (64 -64 8 ) (64 -64 0 ) (0 -64 0 ) +4 6 (0 0 8 ) (-64 0 8 ) (-64 64 8 ) (0 64 8 ) +4 6 (0 256 256 ) (-256 256 256 ) (-256 0 256 ) (0 0 256 ) +4 6 (-256 0 8 ) (-256 0 256 ) (-256 256 256 ) (-256 256 8 ) +4 6 (0 256 256 ) (0 256 8 ) (-256 256 8 ) (-256 256 256 ) +4 7 (-64 64 0 ) (-64 256 0 ) (0 256 0 ) (0 64 0 ) +4 7 (-64 256 8 ) (0 256 8 ) (0 256 0 ) (-64 256 0 ) +4 7 (-64 64 8 ) (-64 64 0 ) (0 64 0 ) (0 64 8 ) +4 8 (-64 0 0 ) (-64 64 0 ) (-64 64 8 ) (-64 0 8 ) +4 8 (-64 256 8 ) (-64 256 0 ) (-256 256 0 ) (-256 256 8 ) +4 8 (-256 0 0 ) (-256 0 8 ) (-256 256 8 ) (-256 256 0 ) +4 8 (-64 0 0 ) (-256 0 0 ) (-256 256 0 ) (-64 256 0 ) +4 9 (-64 -64 8 ) (-64 0 8 ) (0 0 8 ) (0 -64 8 ) +4 9 (0 0 256 ) (-256 0 256 ) (-256 -256 256 ) (0 -256 256 ) +4 9 (-256 0 256 ) (-256 0 8 ) (-256 -256 8 ) (-256 -256 256 ) +4 9 (-256 -256 256 ) (-256 -256 8 ) (0 -256 8 ) (0 -256 256 ) +4 10 (0 -64 0 ) (0 -256 0 ) (-64 -256 0 ) (-64 -64 0 ) +4 10 (-64 -256 0 ) (0 -256 0 ) (0 -256 8 ) (-64 -256 8 ) +4 10 (0 -64 8 ) (0 -64 0 ) (-64 -64 0 ) (-64 -64 8 ) +4 11 (-64 0 8 ) (-64 -64 8 ) (-64 -64 0 ) (-64 0 0 ) +4 11 (-256 -256 8 ) (-256 -256 0 ) (-64 -256 0 ) (-64 -256 8 ) +4 11 (-256 0 8 ) (-256 0 0 ) (-256 -256 0 ) (-256 -256 8 ) +4 11 (-256 -256 0 ) (-256 0 0 ) (-64 0 0 ) (-64 -256 0 ) diff --git a/fakk/maps/example/explodingwall.bsp b/fakk/maps/example/explodingwall.bsp new file mode 100644 index 0000000000000000000000000000000000000000..12f4efcb0637a1c7f06c0d43b8d0ff6f41476c9c GIT binary patch literal 112144 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 literal 0 HcmV?d00001 diff --git a/fakk/maps/example/fallingrock.map b/fakk/maps/example/fallingrock.map new file mode 100644 index 0000000..358b667 --- /dev/null +++ b/fakk/maps/example/fallingrock.map @@ -0,0 +1,300 @@ +{ +"classname" "worldspawn" +// brush 0 +{ +( 264 -248 0 ) ( 112 -248 0 ) ( 112 -416 0 ) tom/wl_wood_dark 0 0 0.00 1 1 0 0 0 +( 112 -416 8 ) ( 112 -248 8 ) ( 264 -248 8 ) tom/wl_wood_dark 0 0 0.00 1 1 0 0 0 +( 112 -416 8 ) ( 264 -416 8 ) ( 264 -416 -56 ) tom/wl_wood_dark 0 0 0.00 1 1 0 0 0 +( 264 -416 64 ) ( 264 -248 64 ) ( 264 -248 0 ) tom/wl_wood_dark 0 0 0.00 1 1 0 0 0 +( 264 -248 64 ) ( 112 -248 64 ) ( 112 -248 0 ) tom/wl_wood_dark 0 0 0.00 1 1 0 0 0 +( 112 -248 8 ) ( 112 -416 8 ) ( 112 -416 -56 ) tom/wl_wood_dark 0 0 0.00 1 1 0 0 0 +} +// brush 1 +{ +( -128 0 0 ) ( -320 0 0 ) ( -320 -192 0 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +( -320 -192 32 ) ( -320 0 32 ) ( -128 0 32 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +( -320 -192 96 ) ( -128 -192 96 ) ( -128 -192 0 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +( -128 -192 32 ) ( -128 0 32 ) ( -128 0 -64 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +( -128 0 32 ) ( -320 0 32 ) ( -320 0 -64 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +( -320 0 96 ) ( -320 -192 96 ) ( -320 -192 0 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +} +// brush 2 +{ +( -128 192 0 ) ( -320 192 0 ) ( -320 0 0 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +( -128 0 32 ) ( -320 0 32 ) ( -320 192 96 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +( -320 0 32 ) ( -128 0 32 ) ( -128 0 0 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +( -128 0 96 ) ( -128 192 96 ) ( -128 192 -96 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +( -128 192 128 ) ( -320 192 128 ) ( -320 192 -64 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +( -320 192 192 ) ( -320 0 192 ) ( -320 0 0 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +} +// brush 3 +{ +( 64 192 0 ) ( -128 192 0 ) ( -128 0 0 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +( -128 0 96 ) ( -128 192 96 ) ( 64 192 192 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +( -128 0 128 ) ( 64 0 128 ) ( 64 0 0 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +( 64 0 192 ) ( 64 192 192 ) ( 64 192 0 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +( 64 192 128 ) ( -128 192 128 ) ( -128 192 0 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +( -128 192 96 ) ( -128 0 96 ) ( -128 0 0 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +} +// brush 4 +{ +( 64 0 0 ) ( -128 0 0 ) ( -128 -192 0 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +( 64 -192 224 ) ( -128 -192 224 ) ( -128 0 192 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +( -128 -192 224 ) ( 64 -192 224 ) ( 64 -192 0 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +( 64 -192 128 ) ( 64 0 128 ) ( 64 0 0 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +( 64 0 192 ) ( -128 0 192 ) ( -128 0 0 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +( -128 0 128 ) ( -128 -192 128 ) ( -128 -192 0 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +} +// brush 5 +{ +( 256 0 0 ) ( 64 0 0 ) ( 64 -192 0 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +( 64 0 192 ) ( 256 0 288 ) ( 256 -192 320 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +( 64 -192 320 ) ( 256 -192 320 ) ( 256 -192 0 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +( 256 -192 128 ) ( 256 0 128 ) ( 256 0 0 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +( 256 0 288 ) ( 64 0 192 ) ( 64 0 0 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +( 64 0 224 ) ( 64 -192 224 ) ( 64 -192 0 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +} +// brush 6 +{ +( 256 192 0 ) ( 64 192 0 ) ( 64 0 0 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +( 64 192 544 ) ( 256 192 544 ) ( 256 0 320 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +( 64 0 320 ) ( 256 0 320 ) ( 256 0 0 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +( 256 0 -128 ) ( 256 192 -128 ) ( 256 192 -256 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +( 256 192 544 ) ( 64 192 544 ) ( 64 192 0 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +( 64 192 128 ) ( 64 0 128 ) ( 64 0 0 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +} +// brush 7 +{ +( 256 384 0 ) ( 64 384 0 ) ( 64 192 0 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +( 256 192 544 ) ( 64 192 544 ) ( 64 384 640 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +( 64 192 544 ) ( 256 192 544 ) ( 256 192 0 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +( 256 192 512 ) ( 256 384 640 ) ( 256 384 0 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +( 256 384 128 ) ( 64 384 128 ) ( 64 384 0 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +( 64 384 640 ) ( 64 192 640 ) ( 64 192 0 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +} +// brush 8 +{ +( 64 384 0 ) ( -128 384 0 ) ( -128 192 0 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +( 64 384 640 ) ( 64 192 640 ) ( -128 192 768 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +( -128 192 128 ) ( 64 192 128 ) ( 64 192 0 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +( 64 192 640 ) ( 64 384 640 ) ( 64 384 0 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +( 64 384 128 ) ( -128 384 128 ) ( -128 384 0 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +( -128 384 128 ) ( -128 192 128 ) ( -128 192 0 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +} +// brush 9 +{ +( -128 384 0 ) ( -320 384 0 ) ( -320 192 0 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +( -320 192 1024 ) ( -320 384 1024 ) ( -128 384 768 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +( -320 192 128 ) ( -128 192 128 ) ( -128 192 0 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +( -128 192 128 ) ( -128 384 128 ) ( -128 384 0 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +( -128 384 128 ) ( -320 384 128 ) ( -320 384 0 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +( -320 384 1024 ) ( -320 192 1024 ) ( -320 192 0 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +} +// brush 10 +{ +( 512 512 -32 ) ( -312 512 -32 ) ( -312 -512 -32 ) tom/right_thingie 0 0 0.00 1 1 0 0 0 +( -312 -512 1568 ) ( -312 512 1568 ) ( 512 512 1568 ) tom/right_thingie 0 0 0.00 1 1 0 0 0 +( -304 -520 32 ) ( 520 -520 32 ) ( 520 -520 0 ) tom/right_thingie 0 0 0.00 1 1 0 0 0 +( 512 520 32 ) ( -312 520 32 ) ( -312 520 0 ) tom/right_thingie 0 0 0.00 1 1 0 0 0 +( -520 512 32 ) ( -520 -512 32 ) ( -520 -512 0 ) tom/right_thingie 0 0 0.00 1 1 0 0 0 +( -512 -512 32 ) ( -512 512 32 ) ( -512 -512 0 ) tom/wl_wood_dark 0 0 0.00 1 1 0 0 0 +} +// brush 11 +{ +( 512 512 -32 ) ( -312 512 -32 ) ( -312 -512 -32 ) tom/right_thingie 0 0 0.00 1 1 0 0 0 +( -312 -512 1568 ) ( -312 512 1568 ) ( 512 512 1568 ) tom/right_thingie 0 0 0.00 1 1 0 0 0 +( 520 -520 32 ) ( 520 504 32 ) ( 520 504 0 ) tom/right_thingie 0 0 0.00 1 1 0 0 0 +( 512 520 32 ) ( -312 520 32 ) ( -312 520 0 ) tom/right_thingie 0 0 0.00 1 1 0 0 0 +( -520 512 32 ) ( -520 -512 32 ) ( -520 -512 0 ) tom/right_thingie 0 0 0.00 1 1 0 0 0 +( -312 512 32 ) ( 512 512 32 ) ( -312 512 0 ) tom/wl_wood_dark 0 0 0.00 1 1 0 0 0 +} +// brush 12 +{ +( 512 512 -32 ) ( -312 512 -32 ) ( -312 -512 -32 ) tom/right_thingie 0 0 0.00 1 1 0 0 0 +( -312 -512 1568 ) ( -312 512 1568 ) ( 512 512 1568 ) tom/right_thingie 0 0 0.00 1 1 0 0 0 +( -304 -520 32 ) ( 520 -520 32 ) ( 520 -520 0 ) tom/right_thingie 0 0 0.00 1 1 0 0 0 +( 520 -520 32 ) ( 520 504 32 ) ( 520 504 0 ) tom/right_thingie 0 0 0.00 1 1 0 0 0 +( 512 520 32 ) ( -312 520 32 ) ( -312 520 0 ) tom/right_thingie 0 0 0.00 1 1 0 0 0 +( 512 504 32 ) ( 512 -520 32 ) ( 512 504 0 ) tom/wl_wood_dark 0 0 0.00 1 1 0 0 0 +} +// brush 13 +{ +( 512 512 -32 ) ( -312 512 -32 ) ( -312 -512 -32 ) tom/right_thingie 0 0 0.00 1 1 0 0 0 +( -312 -512 1568 ) ( -312 512 1568 ) ( 512 512 1568 ) tom/right_thingie 0 0 0.00 1 1 0 0 0 +( -304 -520 32 ) ( 520 -520 32 ) ( 520 -520 0 ) tom/right_thingie 0 0 0.00 1 1 0 0 0 +( 520 -520 32 ) ( 520 504 32 ) ( 520 504 0 ) tom/right_thingie 0 0 0.00 1 1 0 0 0 +( -520 512 32 ) ( -520 -512 32 ) ( -520 -512 0 ) tom/right_thingie 0 0 0.00 1 1 0 0 0 +( 520 -512 32 ) ( -304 -512 32 ) ( 520 -512 0 ) tom/wl_wood_dark 0 0 0.00 1 1 0 0 0 +} +// brush 14 +{ +( -312 -512 1576 ) ( -312 512 1576 ) ( 512 512 1576 ) tom/wl_wood_dark 0 0 0.00 1 1 0 0 0 +( -304 -520 1192 ) ( 520 -520 1192 ) ( 520 -520 1184 ) tom/wl_wood_dark 0 0 0.00 1 1 0 0 0 +( 520 -520 1192 ) ( 520 504 1192 ) ( 520 504 1184 ) tom/wl_wood_dark 0 0 0.00 1 1 0 0 0 +( 512 520 1192 ) ( -312 520 1192 ) ( -312 520 1184 ) tom/wl_wood_dark 0 0 0.00 1 1 0 0 0 +( -520 512 1192 ) ( -520 -512 1192 ) ( -520 -512 1184 ) tom/wl_wood_dark 0 0 0.00 1 1 0 0 0 +( -312 512 1568 ) ( -312 -512 1568 ) ( 512 512 1568 ) tom/wl_wood_dark 0 0 0.00 1 1 0 0 0 +} +// brush 15 +{ +( 512 512 -8 ) ( -312 512 -8 ) ( -312 -512 -8 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +( -304 -520 8 ) ( 520 -520 8 ) ( 520 -520 0 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +( 520 -520 8 ) ( 520 504 8 ) ( 520 504 0 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +( 512 520 8 ) ( -312 520 8 ) ( -312 520 0 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +( -520 512 8 ) ( -520 -512 8 ) ( -520 -512 0 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +( -312 512 0 ) ( 512 512 0 ) ( -312 -512 0 ) tom/fl_wgmarb 0 0 0.00 1 1 0 0 0 +} +} +// entity 1 +{ +"target" "t10" +"classname" "trigger_multiple" +// brush 0 +{ +( 264 -248 0 ) ( 112 -248 0 ) ( 112 -416 0 ) common/trigger 0 0 0.00 1 1 0 128 0 +( 112 -416 152 ) ( 112 -248 152 ) ( 264 -248 152 ) common/trigger 0 0 0.00 1 1 0 128 0 +( 112 -416 8 ) ( 264 -416 8 ) ( 264 -416 0 ) common/trigger 0 0 0.00 1 1 0 128 0 +( 264 -416 8 ) ( 264 -248 8 ) ( 264 -248 0 ) common/trigger 0 0 0.00 1 1 0 128 0 +( 264 -248 8 ) ( 112 -248 8 ) ( 112 -248 0 ) common/trigger 0 0 0.00 1 1 0 128 0 +( 112 -248 8 ) ( 112 -416 8 ) ( 112 -416 0 ) common/trigger 0 0 0.00 1 1 0 128 0 +} +} +// entity 2 +{ +"targetname" "t10" +"target" "t9" +"classname" "func_fallingrock" +"spawnflags" "1" +// brush 0 +{ +( -152 296 1216 ) ( -248 296 1216 ) ( -248 200 1216 ) tom/wl_wood_dark 0 0 0.00 1 1 0 0 0 +( -248 200 1280 ) ( -248 296 1280 ) ( -152 296 1280 ) tom/wl_wood_dark 0 0 0.00 1 1 0 0 0 +( -280 232 1280 ) ( -184 232 1280 ) ( -184 232 1264 ) tom/wl_wood_dark 0 0 0.00 1 1 0 0 0 +( -184 232 1280 ) ( -184 328 1280 ) ( -184 328 1264 ) tom/wl_wood_dark 0 0 0.00 1 1 0 0 0 +( -152 296 1280 ) ( -248 296 1280 ) ( -248 296 1264 ) tom/wl_wood_dark 0 0 0.00 1 1 0 0 0 +( -248 296 1280 ) ( -248 200 1280 ) ( -248 200 1264 ) tom/wl_wood_dark 0 0 0.00 1 1 0 0 0 +} +} +// entity 3 +{ +"target" "t1" +"origin" "-144 264 824" +"classname" "info_waypoint" +"targetname" "t9" +} +// entity 4 +{ +"origin" "136 264 776" +"classname" "light" +} +// entity 5 +{ +"origin" "336 -304 0" +"angle" "135" +"classname" "info_player_start" +} +// entity 6 +{ +"classname" "light" +"origin" "-216 264 1064" +} +// entity 7 +{ +"origin" "136 -88 424" +"classname" "light" +} +// entity 8 +{ +"classname" "light" +"origin" "-216 -88 328" +} +// entity 9 +{ +"origin" "-216 -344 328" +"classname" "light" +} +// entity 10 +{ +"classname" "light" +"origin" "136 -312 328" +} +// entity 11 +{ +"origin" "424 -312 328" +"classname" "light" +} +// entity 12 +{ +"classname" "light" +"origin" "392 104 328" +} +// entity 13 +{ +"origin" "-24 72 456" +"classname" "light" +} +// entity 14 +{ +"target" "t2" +"targetname" "t1" +"classname" "info_waypoint" +"origin" "-24 264 712" +} +// entity 15 +{ +"target" "t3" +"targetname" "t2" +"origin" "168 296 600" +"classname" "info_waypoint" +} +// entity 16 +{ +"target" "t4" +"targetname" "t3" +"classname" "info_waypoint" +"origin" "152 72 408" +} +// entity 17 +{ +"target" "t5" +"targetname" "t4" +"origin" "168 -88 264" +"classname" "info_waypoint" +} +// entity 18 +{ +"target" "t6" +"targetname" "t5" +"classname" "info_waypoint" +"origin" "-40 -104 216" +} +// entity 19 +{ +"target" "t7" +"targetname" "t6" +"origin" "-40 112 176" +"classname" "info_waypoint" +} +// entity 20 +{ +"target" "t8" +"targetname" "t7" +"classname" "info_waypoint" +"origin" "-256 104 96" +} +// entity 21 +{ +"targetname" "t8" +"origin" "-248 -88 40" +"classname" "info_waypoint" +} +// entity 22 +{ +"origin" "-128 192 1256" +"classname" "light" +} +// entity 23 +{ +"classname" "light" +"origin" "-256 296 1256" +} diff --git a/fakk/maps/example/fallingrock.prt b/fakk/maps/example/fallingrock.prt new file mode 100644 index 0000000..fe326cd --- /dev/null +++ b/fakk/maps/example/fallingrock.prt @@ -0,0 +1,145 @@ +PRT1 +23 +49 +92 +4 0 7 0 (256 0 0 ) (512 0 0 ) (512 0 1568 ) (256 0 1568 ) +3 0 3 0 (256 192 544 ) (256 384 768 ) (256 384 640 ) +4 0 2 0 (256 0 320 ) (256 0 1568 ) (256 384 1568 ) (256 384 768 ) +4 0 1 0 (256 512 1568 ) (256 512 0 ) (256 384 0 ) (256 384 1568 ) +4 1 4 0 (64 512 0 ) (64 384 0 ) (64 384 1568 ) (64 512 1568 ) +4 1 3 0 (64 384 768 ) (64 384 640 ) (256 384 640 ) (256 384 768 ) +4 1 2 0 (64 384 1568 ) (64 384 768 ) (256 384 768 ) (256 384 1568 ) +4 2 8 0 (256 0 320 ) (256 0 1568 ) (64 0 1568 ) (64 0 320 ) +4 2 6 0 (64 0 320 ) (64 0 1568 ) (64 192 1568 ) (64 192 544 ) +5 2 5 0 (64 192 1568 ) (64 384 1568 ) (64 384 768 ) (64 274.285736 640 ) (64 192 640 ) +4 2 3 0 (64 192.001160 544 ) (64 384 768 ) (256 384 768 ) (256 192 544 ) +3 3 5 0 (64 274.285736 640 ) (64 384 768 ) (64 384 640 ) +4 4 14 0 (0 384 1568 ) (0 512 1568 ) (0 512 0 ) (0 384 0 ) +4 4 5 0 (64 384 640 ) (64 384 1568 ) (0 384 1568 ) (0 384 682.666748 ) +4 5 15 0 (0 192 1568 ) (0 384 1568 ) (0 384 682.666748 ) (0 192 682.666687 ) +4 5 6 0 (64 192 640 ) (64 192 1568 ) (0 192 1568 ) (0 192 682.666748 ) +4 6 16 0 (0 0 160 ) (0 0 1568 ) (0 192 1568 ) (0 192 160 ) +4 6 8 0 (0 0 1568 ) (0 0 192 ) (64 0 192 ) (64 0 1568 ) +4 7 9 0 (256 -192 0 ) (512 -192 0 ) (512 -192 1568 ) (256 -192 1568 ) +4 7 8 0 (256 -192 320 ) (256 -192 1568 ) (256 0 1568 ) (256 0 288 ) +4 8 19 0 (0 0 1568 ) (0 0 192 ) (0 -192 224 ) (0 -192 1568 ) +5 8 9 0 (0 -192 1568 ) (0 -192 224 ) (64 -192 224 ) (256 -192 320 ) (256 -192 1568 ) +4 9 22 0 (0 -248 1568 ) (0 -192 1568 ) (0 -192 0 ) (0 -248 0 ) +4 9 11 0 (264 -248 0 ) (512 -248 0 ) (512 -248 8 ) (264 -248 8 ) +4 9 13 0 (0 -248 0 ) (112 -248 0 ) (112 -248 8 ) (0 -248 8 ) +4 9 10 0 (512 -248 8 ) (512 -248 1568 ) (0 -248 1568 ) (0 -248 8 ) +4 10 22 0 (0 -512 1568 ) (0 -248 1568 ) (0 -248 8 ) (0 -512 8 ) +4 10 11 0 (264 -248 8 ) (512 -248 8 ) (512 -416 8 ) (264 -416 8 ) +4 10 12 0 (512 -512 8 ) (112 -512 8 ) (112 -416 8 ) (512 -416 8 ) +4 10 13 0 (112 -512 8 ) (0 -512 8 ) (0 -248 8 ) (112 -248 8 ) +4 11 12 0 (264 -416 0 ) (512 -416 0 ) (512 -416 8 ) (264 -416 8 ) +4 12 13 0 (112 -512 0 ) (112 -512 8 ) (112 -416 8 ) (112 -416 0 ) +4 13 22 0 (0 -248 8 ) (0 -248 0 ) (0 -512 0 ) (0 -512 8 ) +5 14 15 0 (0 384 682.666687 ) (0 384 1568 ) (-320 384 1568 ) (-320 384 1024 ) (-128 384 768 ) +4 14 18 0 (-512 384 1568 ) (-512 384 0 ) (-320 384 0 ) (-320 384 1568 ) +4 15 17 0 (-320 192 1568 ) (-320 192 1024 ) (-128 192 768 ) (-128 192 1568 ) +4 15 16 0 (-128 192 768 ) (0 192 682.666687 ) (0 192 1568 ) (-128 192 1568 ) +4 15 18 0 (-320 192 1568 ) (-320 384 1568 ) (-320 384 1024 ) (-320 192 1024 ) +4 16 19 0 (0 0 192 ) (0 0 1568 ) (-128 0 1568 ) (-128 0 192 ) +4 16 17 0 (-128 192 1568 ) (-128 192 96 ) (-128 0 96 ) (-128 0 1568 ) +4 17 20 0 (-128 0 1568 ) (-320 0 1568 ) (-320 0 32 ) (-128 0 32 ) +4 17 18 0 (-320 0 1568 ) (-320 192 1568 ) (-320 192 96 ) (-320 0 32 ) +4 18 21 0 (-512 0 32 ) (-512 0 0 ) (-320 0 0 ) (-320 0 32 ) +4 18 20 0 (-320 0 1568 ) (-512 0 1568 ) (-512 0 32 ) (-320 0 32 ) +4 19 22 0 (0 -192 224 ) (0 -192 1568 ) (-128 -192 1568 ) (-128 -192 224 ) +4 19 20 0 (-128 -192 224 ) (-128 -192 1568 ) (-128 0 1568 ) (-128 0 192 ) +4 20 22 0 (-512 -192 1568 ) (-512 -192 32 ) (-128 -192 32 ) (-128 -192 1568 ) +4 20 21 0 (-320 -192 32 ) (-512 -192 32 ) (-512 0 32 ) (-320 0 32 ) +4 21 22 0 (-512 -192 32 ) (-512 -192 0 ) (-320 -192 0 ) (-320 -192 32 ) +5 0 (256 384 0 ) (256 0 0 ) (256 0 320 ) (256 192 544 ) (256 384 640 ) +4 0 (512 512 1568 ) (256 512 1568 ) (256 0 1568 ) (512 0 1568 ) +4 0 (512 0 0 ) (256 0 0 ) (256 512 0 ) (512 512 0 ) +4 0 (256 512 1568 ) (512 512 1568 ) (512 512 0 ) (256 512 0 ) +4 0 (512 512 1568 ) (512 0 1568 ) (512 0 0 ) (512 512 0 ) +4 1 (64 384 640 ) (64 384 0 ) (256 384 0 ) (256 384 640 ) +4 1 (64 512 1568 ) (256 512 1568 ) (256 512 0 ) (64 512 0 ) +4 1 (64 384 0 ) (64 512 0 ) (256 512 0 ) (256 384 0 ) +4 1 (64 384 1568 ) (256 384 1568 ) (256 512 1568 ) (64 512 1568 ) +3 2 (64 274.285736 640 ) (64 192 544 ) (64 192 640 ) +4 2 (64 0 320 ) (64 192.001160 544 ) (256 192 544 ) (256 0 320 ) +4 2 (64 384 1568 ) (64 0 1568 ) (256 0 1568 ) (256 384 1568 ) +3 3 (64 192 544 ) (64 274.285736 640 ) (64 384 640 ) +4 3 (256 192 544 ) (64 192 544 ) (64 384 640 ) (256 384 640 ) +4 4 (0 384 0 ) (64 384 0 ) (64 384 640 ) (0 384 682.666748 ) +4 4 (0 384 1568 ) (64 384 1568 ) (64 512 1568 ) (0 512 1568 ) +4 4 (0 384 0 ) (0 512 0 ) (64 512 0 ) (64 384 0 ) +4 4 (64 512 1568 ) (64 512 0 ) (0 512 0 ) (0 512 1568 ) +4 5 (0 384 1568 ) (0 192 1568 ) (64 192 1568 ) (64 384 1568 ) +4 5 (64 192 640 ) (0 192 682.666931 ) (0 384 682.666504 ) (64 384 640 ) +3 6 (0 0 192 ) (0 0 160 ) (64 0 192 ) +4 6 (64 192 192 ) (64 192 544 ) (64 0 320 ) (64 0 192 ) +4 6 (0 192 1568 ) (0 0 1568 ) (64 0 1568 ) (64 192 1568 ) +4 6 (0 192 160 ) (0 192 682.666748 ) (64 192 640 ) (64 192 192 ) +4 6 (0 192 160 ) (64 192 192 ) (64 0 192 ) (0 0 160 ) +4 7 (256 0 0 ) (256 -192 0 ) (256 -192 320 ) (256 0 288 ) +4 7 (512 0 1568 ) (256 0 1568 ) (256 -192 1568 ) (512 -192 1568 ) +4 7 (256 0 0 ) (512 0 0 ) (512 -192 0 ) (256 -192 0 ) +4 7 (512 -192 1568 ) (512 -192 0 ) (512 0 0 ) (512 0 1568 ) +4 8 (256 0 288 ) (256 -192 320 ) (64 -192 224 ) (64 0 192 ) +4 8 (256 0 1568 ) (0 0 1568 ) (0 -192 1568 ) (256 -192 1568 ) +4 8 (64 0 192 ) (64 0 320 ) (256 0 320 ) (256 0 288 ) +4 8 (0 0 192 ) (64 0 192 ) (64 -192 224 ) (0 -192 224 ) +4 9 (112 -248 0 ) (264 -248 0 ) (264 -248 8 ) (112 -248 8 ) +4 9 (512 -248 1568 ) (512 -192 1568 ) (0 -192 1568 ) (0 -248 1568 ) +3 9 (64 -192 224 ) (0 -192 192 ) (0 -192 224 ) +4 9 (256 -192 320 ) (256 -192 0 ) (0 -192 0 ) (0 -192 192 ) +4 9 (0 -248 0 ) (0 -192 0 ) (512 -192 0 ) (512 -248 0 ) +4 9 (512 -192 1568 ) (512 -248 1568 ) (512 -248 0 ) (512 -192 0 ) +4 10 (112 -416 8 ) (112 -248 8 ) (264 -248 8 ) (264 -416 8 ) +4 10 (512 -512 8 ) (512 -512 1568 ) (0 -512 1568 ) (0 -512 8 ) +4 10 (512 -512 1568 ) (512 -248 1568 ) (0 -248 1568 ) (0 -512 1568 ) +4 10 (512 -248 8 ) (512 -248 1568 ) (512 -512 1568 ) (512 -512 8 ) +4 11 (512 -248 8 ) (512 -416 8 ) (512 -416 0 ) (512 -248 0 ) +4 11 (264 -248 0 ) (512 -248 0 ) (512 -416 0 ) (264 -416 0 ) +4 11 (264 -416 0 ) (264 -416 8 ) (264 -248 8 ) (264 -248 0 ) +4 12 (264 -416 8 ) (264 -416 0 ) (112 -416 0 ) (112 -416 8 ) +4 12 (112 -512 0 ) (512 -512 0 ) (512 -512 8 ) (112 -512 8 ) +4 12 (512 -416 0 ) (512 -512 0 ) (112 -512 0 ) (112 -416 0 ) +4 12 (512 -416 8 ) (512 -512 8 ) (512 -512 0 ) (512 -416 0 ) +4 13 (112 -416 0 ) (112 -248 0 ) (112 -248 8 ) (112 -416 8 ) +4 13 (0 -512 0 ) (0 -248 0 ) (112 -248 0 ) (112 -512 0 ) +4 13 (0 -512 0 ) (112 -512 0 ) (112 -512 8 ) (0 -512 8 ) +3 14 (-320 384 1024 ) (-320 384 896 ) (-128 384 768 ) +4 14 (-320 384 0 ) (0 384 0 ) (0 384 682.666687 ) (-320 384 896 ) +4 14 (0 512 1568 ) (-512 512 1568 ) (-512 384 1568 ) (0 384 1568 ) +4 14 (-512 384 0 ) (-512 512 0 ) (0 512 0 ) (0 384 0 ) +4 14 (-512 512 0 ) (-512 384 0 ) (-512 384 1568 ) (-512 512 1568 ) +4 14 (-512 512 1568 ) (0 512 1568 ) (0 512 0 ) (-512 512 0 ) +4 15 (0 192 682.666565 ) (-128 192 768 ) (-128 384 768 ) (0 384 682.666565 ) +4 15 (0 192 1568 ) (0 384 1568 ) (-320 384 1568 ) (-320 192 1568 ) +4 15 (-128 384 768 ) (-128 192 768 ) (-320 192 1024 ) (-320 384 1024 ) +4 16 (0 0 160 ) (0 0 192 ) (-128 0 192 ) (-128 0 96 ) +4 16 (-128 192 96 ) (-128 192 768 ) (0 192 682.666687 ) (0 192 160 ) +4 16 (0 192 1568 ) (-128 192 1568 ) (-128 0 1568 ) (0 0 1568 ) +4 16 (-128 0 96 ) (-128 192 96 ) (0 192 160 ) (0 0 160 ) +3 17 (-128 192 768 ) (-320 192 896 ) (-320 192 1024 ) +4 17 (-128 192 768 ) (-128 192 96 ) (-320 192 96 ) (-320 192 896 ) +4 17 (-128 192 1568 ) (-320 192 1568 ) (-320 0 1568 ) (-128 0 1568 ) +3 17 (-128 0 96 ) (-128 0 32 ) (-128 192 96 ) +4 17 (-320 0 32 ) (-320 192 96 ) (-128 192 96 ) (-128 0 32 ) +4 18 (-320 0 32 ) (-320 0 0 ) (-320 192 0 ) (-320 192 96 ) +4 18 (-320 192 1024 ) (-320 192 896 ) (-320 384 896 ) (-320 384 1024 ) +4 18 (-320 192 896 ) (-320 192 0 ) (-320 384 0 ) (-320 384 896 ) +4 18 (-320 384 1568 ) (-512 384 1568 ) (-512 0 1568 ) (-320 0 1568 ) +4 18 (-320 0 0 ) (-512 0 0 ) (-512 384 0 ) (-320 384 0 ) +4 18 (-512 0 0 ) (-512 0 1568 ) (-512 384 1568 ) (-512 384 0 ) +4 19 (0 0 1568 ) (-128 0 1568 ) (-128 -192 1568 ) (0 -192 1568 ) +4 19 (0 -192 224 ) (-128 -192 224 ) (-128 0 192 ) (0 0 192 ) +4 20 (-128 -192 32 ) (-320 -192 32 ) (-320 0 32 ) (-128 0 32 ) +4 20 (-128 0 192 ) (-128 -192 224 ) (-128 -192 32 ) (-128 0 32 ) +4 20 (-512 0 1568 ) (-512 0 32 ) (-512 -192 32 ) (-512 -192 1568 ) +4 20 (-128 0 1568 ) (-512 0 1568 ) (-512 -192 1568 ) (-128 -192 1568 ) +4 21 (-512 0 32 ) (-512 0 0 ) (-512 -192 0 ) (-512 -192 32 ) +4 21 (-512 -192 0 ) (-512 0 0 ) (-320 0 0 ) (-320 -192 0 ) +4 21 (-320 0 32 ) (-320 -192 32 ) (-320 -192 0 ) (-320 0 0 ) +4 22 (0 -512 1568 ) (0 -192 1568 ) (-512 -192 1568 ) (-512 -512 1568 ) +4 22 (-320 -192 32 ) (0 -192 32 ) (0 -192 0 ) (-320 -192 0 ) +4 22 (-128 -192 224 ) (0 -192 224 ) (0 -192 32 ) (-128 -192 32 ) +4 22 (-512 -512 0 ) (-512 -192 0 ) (0 -192 0 ) (0 -512 0 ) +4 22 (-512 -192 0 ) (-512 -512 0 ) (-512 -512 1568 ) (-512 -192 1568 ) +4 22 (-512 -512 0 ) (0 -512 0 ) (0 -512 1568 ) (-512 -512 1568 ) diff --git a/fakk/maps/example/fulcrum.bsp b/fakk/maps/example/fulcrum.bsp new file mode 100644 index 0000000000000000000000000000000000000000..3987fabcba84ad64ecbbea85f09eb7ea24761915 GIT binary patch literal 121680 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 b-UpkGotgX0W807GcjaoIe6AXUkz?>L8C|)d literal 0 HcmV?d00001 diff --git a/fakk/maps/example/fulcrum.map b/fakk/maps/example/fulcrum.map new file mode 100644 index 0000000..5bc01f3 --- /dev/null +++ b/fakk/maps/example/fulcrum.map @@ -0,0 +1,490 @@ +{ +"classname" "worldspawn" +// brush 0 +{ +( -64 -264 0 ) ( -320 -264 0 ) ( -320 -384 0 ) eden/woodfloor 0 -8 0.00 1 1 0 0 0 +( -320 -384 16 ) ( -320 -264 16 ) ( -64 -264 16 ) eden/woodfloor 0 -8 0.00 1 1 0 0 0 +( -320 -384 96 ) ( -64 -384 96 ) ( -64 -384 0 ) eden/woodfloor 0 -24 0.00 1 1 0 0 0 +( -64 -384 96 ) ( -64 -264 96 ) ( -64 -264 0 ) eden/woodfloor 72 -24 0.00 1 1 0 0 0 +( -64 -264 96 ) ( -320 -264 96 ) ( -320 -264 0 ) eden/woodfloor 0 -24 0.00 1 1 0 0 0 +( -320 -264 96 ) ( -320 -384 96 ) ( -320 -384 0 ) eden/woodfloor 72 -24 0.00 1 1 0 0 0 +} +// brush 1 +{ +( -48 -264 16 ) ( -304 -264 16 ) ( -304 -384 16 ) eden/woodfloor -16 -8 0.00 1 1 0 0 0 +( -304 -384 32 ) ( -304 -264 32 ) ( -48 -264 32 ) eden/woodfloor -16 -8 0.00 1 1 0 0 0 +( -304 -384 112 ) ( -48 -384 112 ) ( -48 -384 16 ) eden/woodfloor -16 -8 0.00 1 1 0 0 0 +( -64 -384 112 ) ( -64 -264 112 ) ( -64 -264 16 ) eden/woodfloor 72 -8 0.00 1 1 0 0 0 +( -48 -264 112 ) ( -304 -264 112 ) ( -304 -264 16 ) eden/woodfloor -16 -8 0.00 1 1 0 0 0 +( -304 -264 112 ) ( -304 -384 112 ) ( -304 -384 16 ) eden/woodfloor 72 -8 0.00 1 1 0 0 0 +} +// brush 2 +{ +( -32 -264 32 ) ( -288 -264 32 ) ( -288 -384 32 ) eden/woodfloor -32 -8 0.00 1 1 0 0 0 +( -288 -384 48 ) ( -288 -264 48 ) ( -32 -264 48 ) eden/woodfloor -32 -8 0.00 1 1 0 0 0 +( -288 -384 128 ) ( -32 -384 128 ) ( -32 -384 32 ) eden/woodfloor -32 8 0.00 1 1 0 0 0 +( -64 -384 128 ) ( -64 -264 128 ) ( -64 -264 32 ) eden/woodfloor 72 8 0.00 1 1 0 0 0 +( -32 -264 128 ) ( -288 -264 128 ) ( -288 -264 32 ) eden/woodfloor -32 8 0.00 1 1 0 0 0 +( -288 -264 128 ) ( -288 -384 128 ) ( -288 -384 32 ) eden/woodfloor 72 8 0.00 1 1 0 0 0 +} +// brush 3 +{ +( -16 -264 48 ) ( -272 -264 48 ) ( -272 -384 48 ) eden/woodfloor -48 -8 0.00 1 1 0 0 0 +( -272 -384 64 ) ( -272 -264 64 ) ( -16 -264 64 ) eden/woodfloor -48 -8 0.00 1 1 0 0 0 +( -272 -384 144 ) ( -16 -384 144 ) ( -16 -384 48 ) eden/woodfloor -48 24 0.00 1 1 0 0 0 +( -64 -384 144 ) ( -64 -264 144 ) ( -64 -264 48 ) eden/woodfloor 72 24 0.00 1 1 0 0 0 +( -16 -264 144 ) ( -272 -264 144 ) ( -272 -264 48 ) eden/woodfloor -48 24 0.00 1 1 0 0 0 +( -272 -264 144 ) ( -272 -384 144 ) ( -272 -384 48 ) eden/woodfloor 72 24 0.00 1 1 0 0 0 +} +// brush 4 +{ +( 0 -264 64 ) ( -256 -264 64 ) ( -256 -384 64 ) eden/woodfloor -64 -8 0.00 1 1 0 0 0 +( -256 -384 80 ) ( -256 -264 80 ) ( 0 -264 80 ) eden/woodfloor -64 -8 0.00 1 1 0 0 0 +( -256 -384 160 ) ( 0 -384 160 ) ( 0 -384 64 ) eden/woodfloor -64 -24 0.00 1 1 0 0 0 +( -64 -384 160 ) ( -64 -264 160 ) ( -64 -264 64 ) eden/woodfloor 72 -24 0.00 1 1 0 0 0 +( 0 -264 160 ) ( -256 -264 160 ) ( -256 -264 64 ) eden/woodfloor -64 -24 0.00 1 1 0 0 0 +( -256 -264 160 ) ( -256 -384 160 ) ( -256 -384 64 ) eden/woodfloor 72 -24 0.00 1 1 0 0 0 +} +// brush 5 +{ +( 16 -264 80 ) ( -240 -264 80 ) ( -240 -384 80 ) eden/woodfloor -80 -8 0.00 1 1 0 0 0 +( -240 -384 96 ) ( -240 -264 96 ) ( 16 -264 96 ) eden/woodfloor -80 -8 0.00 1 1 0 0 0 +( -240 -384 176 ) ( 16 -384 176 ) ( 16 -384 80 ) eden/woodfloor -80 -8 0.00 1 1 0 0 0 +( -64 -384 176 ) ( -64 -264 176 ) ( -64 -264 80 ) eden/woodfloor 72 -8 0.00 1 1 0 0 0 +( 16 -264 176 ) ( -240 -264 176 ) ( -240 -264 80 ) eden/woodfloor -80 -8 0.00 1 1 0 0 0 +( -240 -264 176 ) ( -240 -384 176 ) ( -240 -384 80 ) eden/woodfloor 72 -8 0.00 1 1 0 0 0 +} +// brush 6 +{ +( 32 -264 96 ) ( -224 -264 96 ) ( -224 -384 96 ) eden/woodfloor -96 -8 0.00 1 1 0 0 0 +( -224 -384 112 ) ( -224 -264 112 ) ( 32 -264 112 ) eden/woodfloor -96 -8 0.00 1 1 0 0 0 +( -224 -384 192 ) ( 32 -384 192 ) ( 32 -384 96 ) eden/woodfloor -96 8 0.00 1 1 0 0 0 +( -64 -384 192 ) ( -64 -264 192 ) ( -64 -264 96 ) eden/woodfloor 72 8 0.00 1 1 0 0 0 +( 32 -264 192 ) ( -224 -264 192 ) ( -224 -264 96 ) eden/woodfloor -96 8 0.00 1 1 0 0 0 +( -224 -264 192 ) ( -224 -384 192 ) ( -224 -384 96 ) eden/woodfloor 72 8 0.00 1 1 0 0 0 +} +// brush 7 +{ +( 48 -264 112 ) ( -208 -264 112 ) ( -208 -384 112 ) eden/woodfloor -112 -8 0.00 1 1 0 0 0 +( -208 -384 128 ) ( -208 -264 128 ) ( 48 -264 128 ) eden/woodfloor -112 -8 0.00 1 1 0 0 0 +( -208 -384 208 ) ( 48 -384 208 ) ( 48 -384 112 ) eden/woodfloor -112 24 0.00 1 1 0 0 0 +( -64 -384 208 ) ( -64 -264 208 ) ( -64 -264 112 ) eden/woodfloor 72 24 0.00 1 1 0 0 0 +( 48 -264 208 ) ( -208 -264 208 ) ( -208 -264 112 ) eden/woodfloor -112 24 0.00 1 1 0 0 0 +( -208 -264 208 ) ( -208 -384 208 ) ( -208 -384 112 ) eden/woodfloor 72 24 0.00 1 1 0 0 0 +} +// brush 8 +{ +( 64 -264 128 ) ( -192 -264 128 ) ( -192 -384 128 ) eden/woodfloor 0 -8 0.00 1 1 0 0 0 +( -192 -384 144 ) ( -192 -264 144 ) ( 64 -264 144 ) eden/woodfloor 0 -8 0.00 1 1 0 0 0 +( -192 -384 224 ) ( 64 -384 224 ) ( 64 -384 128 ) eden/woodfloor 0 -24 0.00 1 1 0 0 0 +( -64 -376 224 ) ( -64 -256 224 ) ( -64 -256 128 ) eden/woodfloor 72 -24 0.00 1 1 0 0 0 +( 64 -264 224 ) ( -192 -264 224 ) ( -192 -264 128 ) eden/woodfloor 0 -24 0.00 1 1 0 0 0 +( -192 -264 224 ) ( -192 -384 224 ) ( -192 -384 128 ) eden/woodfloor 72 -24 0.00 1 1 0 0 0 +} +// brush 9 +{ +( 80 -264 144 ) ( -176 -264 144 ) ( -176 -384 144 ) eden/woodfloor -16 -8 0.00 1 1 0 0 0 +( -176 -384 160 ) ( -176 -264 160 ) ( 80 -264 160 ) eden/woodfloor -16 -8 0.00 1 1 0 0 0 +( -176 -384 240 ) ( 80 -384 240 ) ( 80 -384 144 ) eden/woodfloor -16 -8 0.00 1 1 0 0 0 +( -64 -376 240 ) ( -64 -256 240 ) ( -64 -256 144 ) eden/woodfloor 72 -8 0.00 1 1 0 0 0 +( 80 -264 240 ) ( -176 -264 240 ) ( -176 -264 144 ) eden/woodfloor -16 -8 0.00 1 1 0 0 0 +( -176 -264 240 ) ( -176 -384 240 ) ( -176 -384 144 ) eden/woodfloor 72 -8 0.00 1 1 0 0 0 +} +// brush 10 +{ +( 96 -264 160 ) ( -160 -264 160 ) ( -160 -384 160 ) eden/woodfloor -32 -8 0.00 1 1 0 0 0 +( -160 -384 176 ) ( -160 -264 176 ) ( 96 -264 176 ) eden/woodfloor -32 -8 0.00 1 1 0 0 0 +( -160 -384 256 ) ( 96 -384 256 ) ( 96 -384 160 ) eden/woodfloor -32 8 0.00 1 1 0 0 0 +( -64 -376 256 ) ( -64 -256 256 ) ( -64 -256 160 ) eden/woodfloor 72 8 0.00 1 1 0 0 0 +( 96 -264 256 ) ( -160 -264 256 ) ( -160 -264 160 ) eden/woodfloor -32 8 0.00 1 1 0 0 0 +( -160 -264 256 ) ( -160 -384 256 ) ( -160 -384 160 ) eden/woodfloor 72 8 0.00 1 1 0 0 0 +} +// brush 11 +{ +( 96 64 160 ) ( -160 64 160 ) ( -160 -56 160 ) eden/woodfloor -32 0 0.00 1 1 0 0 0 +( -160 -56 176 ) ( -160 64 176 ) ( 96 64 176 ) eden/woodfloor -32 0 0.00 1 1 0 0 0 +( -160 -56 256 ) ( 96 -56 256 ) ( 96 -56 160 ) eden/woodfloor -32 8 0.00 1 1 0 0 0 +( -64 -48 256 ) ( -64 72 256 ) ( -64 72 160 ) eden/woodfloor 0 8 0.00 1 1 0 0 0 +( 96 64 256 ) ( -160 64 256 ) ( -160 64 160 ) eden/woodfloor -32 8 0.00 1 1 0 0 0 +( -160 64 256 ) ( -160 -56 256 ) ( -160 -56 160 ) eden/woodfloor 0 8 0.00 1 1 0 0 0 +} +// brush 12 +{ +( 80 64 144 ) ( -176 64 144 ) ( -176 -56 144 ) eden/woodfloor -16 0 0.00 1 1 0 0 0 +( -176 -56 160 ) ( -176 64 160 ) ( 80 64 160 ) eden/woodfloor -16 0 0.00 1 1 0 0 0 +( -176 -56 240 ) ( 80 -56 240 ) ( 80 -56 144 ) eden/woodfloor -16 -8 0.00 1 1 0 0 0 +( -64 -48 240 ) ( -64 72 240 ) ( -64 72 144 ) eden/woodfloor 0 -8 0.00 1 1 0 0 0 +( 80 64 240 ) ( -176 64 240 ) ( -176 64 144 ) eden/woodfloor -16 -8 0.00 1 1 0 0 0 +( -176 64 240 ) ( -176 -56 240 ) ( -176 -56 144 ) eden/woodfloor 0 -8 0.00 1 1 0 0 0 +} +// brush 13 +{ +( 64 64 128 ) ( -192 64 128 ) ( -192 -56 128 ) eden/woodfloor 0 0 0.00 1 1 0 0 0 +( -192 -56 144 ) ( -192 64 144 ) ( 64 64 144 ) eden/woodfloor 0 0 0.00 1 1 0 0 0 +( -192 -56 224 ) ( 64 -56 224 ) ( 64 -56 128 ) eden/woodfloor 0 -24 0.00 1 1 0 0 0 +( -64 -48 224 ) ( -64 72 224 ) ( -64 72 128 ) eden/woodfloor 0 -24 0.00 1 1 0 0 0 +( 64 64 224 ) ( -192 64 224 ) ( -192 64 128 ) eden/woodfloor 0 -24 0.00 1 1 0 0 0 +( -192 64 224 ) ( -192 -56 224 ) ( -192 -56 128 ) eden/woodfloor 0 -24 0.00 1 1 0 0 0 +} +// brush 14 +{ +( 48 64 112 ) ( -208 64 112 ) ( -208 -56 112 ) eden/woodfloor -112 0 0.00 1 1 0 0 0 +( -208 -56 128 ) ( -208 64 128 ) ( 48 64 128 ) eden/woodfloor -112 0 0.00 1 1 0 0 0 +( -208 -56 208 ) ( 48 -56 208 ) ( 48 -56 112 ) eden/woodfloor -112 24 0.00 1 1 0 0 0 +( -64 -56 208 ) ( -64 64 208 ) ( -64 64 112 ) eden/woodfloor 0 24 0.00 1 1 0 0 0 +( 48 64 208 ) ( -208 64 208 ) ( -208 64 112 ) eden/woodfloor -112 24 0.00 1 1 0 0 0 +( -208 64 208 ) ( -208 -56 208 ) ( -208 -56 112 ) eden/woodfloor 0 24 0.00 1 1 0 0 0 +} +// brush 15 +{ +( 32 64 96 ) ( -224 64 96 ) ( -224 -56 96 ) eden/woodfloor -96 0 0.00 1 1 0 0 0 +( -224 -56 112 ) ( -224 64 112 ) ( 32 64 112 ) eden/woodfloor -96 0 0.00 1 1 0 0 0 +( -224 -56 192 ) ( 32 -56 192 ) ( 32 -56 96 ) eden/woodfloor -96 8 0.00 1 1 0 0 0 +( -64 -56 192 ) ( -64 64 192 ) ( -64 64 96 ) eden/woodfloor 0 8 0.00 1 1 0 0 0 +( 32 64 192 ) ( -224 64 192 ) ( -224 64 96 ) eden/woodfloor -96 8 0.00 1 1 0 0 0 +( -224 64 192 ) ( -224 -56 192 ) ( -224 -56 96 ) eden/woodfloor 0 8 0.00 1 1 0 0 0 +} +// brush 16 +{ +( 16 64 80 ) ( -240 64 80 ) ( -240 -56 80 ) eden/woodfloor -80 0 0.00 1 1 0 0 0 +( -240 -56 96 ) ( -240 64 96 ) ( 16 64 96 ) eden/woodfloor -80 0 0.00 1 1 0 0 0 +( -240 -56 176 ) ( 16 -56 176 ) ( 16 -56 80 ) eden/woodfloor -80 -8 0.00 1 1 0 0 0 +( -64 -56 176 ) ( -64 64 176 ) ( -64 64 80 ) eden/woodfloor 0 -8 0.00 1 1 0 0 0 +( 16 64 176 ) ( -240 64 176 ) ( -240 64 80 ) eden/woodfloor -80 -8 0.00 1 1 0 0 0 +( -240 64 176 ) ( -240 -56 176 ) ( -240 -56 80 ) eden/woodfloor 0 -8 0.00 1 1 0 0 0 +} +// brush 17 +{ +( 0 64 64 ) ( -256 64 64 ) ( -256 -56 64 ) eden/woodfloor -64 0 0.00 1 1 0 0 0 +( -256 -56 80 ) ( -256 64 80 ) ( 0 64 80 ) eden/woodfloor -64 0 0.00 1 1 0 0 0 +( -256 -56 160 ) ( 0 -56 160 ) ( 0 -56 64 ) eden/woodfloor -64 -24 0.00 1 1 0 0 0 +( -64 -56 160 ) ( -64 64 160 ) ( -64 64 64 ) eden/woodfloor 0 -24 0.00 1 1 0 0 0 +( 0 64 160 ) ( -256 64 160 ) ( -256 64 64 ) eden/woodfloor -64 -24 0.00 1 1 0 0 0 +( -256 64 160 ) ( -256 -56 160 ) ( -256 -56 64 ) eden/woodfloor 0 -24 0.00 1 1 0 0 0 +} +// brush 18 +{ +( -16 64 48 ) ( -272 64 48 ) ( -272 -56 48 ) eden/woodfloor -48 0 0.00 1 1 0 0 0 +( -272 -56 64 ) ( -272 64 64 ) ( -16 64 64 ) eden/woodfloor -48 0 0.00 1 1 0 0 0 +( -272 -56 144 ) ( -16 -56 144 ) ( -16 -56 48 ) eden/woodfloor -48 24 0.00 1 1 0 0 0 +( -64 -56 144 ) ( -64 64 144 ) ( -64 64 48 ) eden/woodfloor 0 24 0.00 1 1 0 0 0 +( -16 64 144 ) ( -272 64 144 ) ( -272 64 48 ) eden/woodfloor -48 24 0.00 1 1 0 0 0 +( -272 64 144 ) ( -272 -56 144 ) ( -272 -56 48 ) eden/woodfloor 0 24 0.00 1 1 0 0 0 +} +// brush 19 +{ +( -32 64 32 ) ( -288 64 32 ) ( -288 -56 32 ) eden/woodfloor -32 0 0.00 1 1 0 0 0 +( -288 -56 48 ) ( -288 64 48 ) ( -32 64 48 ) eden/woodfloor -32 0 0.00 1 1 0 0 0 +( -288 -56 128 ) ( -32 -56 128 ) ( -32 -56 32 ) eden/woodfloor -32 8 0.00 1 1 0 0 0 +( -64 -56 128 ) ( -64 64 128 ) ( -64 64 32 ) eden/woodfloor 0 8 0.00 1 1 0 0 0 +( -32 64 128 ) ( -288 64 128 ) ( -288 64 32 ) eden/woodfloor -32 8 0.00 1 1 0 0 0 +( -288 64 128 ) ( -288 -56 128 ) ( -288 -56 32 ) eden/woodfloor 0 8 0.00 1 1 0 0 0 +} +// brush 20 +{ +( -48 64 16 ) ( -304 64 16 ) ( -304 -56 16 ) eden/woodfloor -16 0 0.00 1 1 0 0 0 +( -304 -56 32 ) ( -304 64 32 ) ( -48 64 32 ) eden/woodfloor -16 0 0.00 1 1 0 0 0 +( -304 -56 112 ) ( -48 -56 112 ) ( -48 -56 16 ) eden/woodfloor -16 -8 0.00 1 1 0 0 0 +( -64 -56 112 ) ( -64 64 112 ) ( -64 64 16 ) eden/woodfloor 0 -8 0.00 1 1 0 0 0 +( -48 64 112 ) ( -304 64 112 ) ( -304 64 16 ) eden/woodfloor -16 -8 0.00 1 1 0 0 0 +( -304 64 112 ) ( -304 -56 112 ) ( -304 -56 16 ) eden/woodfloor 0 -8 0.00 1 1 0 0 0 +} +// brush 21 +{ +( -64 64 0 ) ( -320 64 0 ) ( -320 -56 0 ) eden/woodfloor 0 0 0.00 1 1 0 0 0 +( -320 -56 16 ) ( -320 64 16 ) ( -64 64 16 ) eden/woodfloor 0 0 0.00 1 1 0 0 0 +( -320 -56 96 ) ( -64 -56 96 ) ( -64 -56 0 ) eden/woodfloor 0 -24 0.00 1 1 0 0 0 +( -64 -56 96 ) ( -64 64 96 ) ( -64 64 0 ) eden/woodfloor 0 -24 0.00 1 1 0 0 0 +( -64 64 96 ) ( -320 64 96 ) ( -320 64 0 ) eden/woodfloor 0 -24 0.00 1 1 0 0 0 +( -320 64 96 ) ( -320 -56 96 ) ( -320 -56 0 ) eden/woodfloor 0 -24 0.00 1 1 0 0 0 +} +// brush 22 +{ +( 224 192 0 ) ( 224 224 0 ) ( -480 224 0 ) eden/bedtrim -224 -32 90.00 1 1 0 0 0 +( -480 224 64 ) ( 224 224 64 ) ( 224 192 64 ) eden/bedtrim -224 -32 90.00 1 1 0 0 0 +( -480 224 256 ) ( -480 192 256 ) ( -480 192 0 ) eden/bedtrim -224 0 0.00 1 1 0 0 0 +( -480 192 256 ) ( 224 192 256 ) ( 224 192 0 ) common/skip 0 0 0.00 1 1 805306368 16512 0 +( 224 224 256 ) ( -480 224 256 ) ( -480 224 0 ) eden/bedtrim 224 0 -180.00 1 -1 0 0 0 +( -416 224 0 ) ( -416 192 0 ) ( -416 208 64 ) eden/bedtrim 224 0 -180.00 1 -1 0 0 0 +} +// brush 23 +{ +( 224 192 0 ) ( 224 224 0 ) ( -480 224 0 ) eden/bedtrim -224 -32 90.00 1 1 0 0 0 +( -480 224 64 ) ( 224 224 64 ) ( 224 192 64 ) eden/bedtrim -224 -32 90.00 1 1 0 0 0 +( -480 192 256 ) ( 224 192 256 ) ( 224 192 0 ) eden/bedtrim 224 0 -180.00 1 -1 0 0 0 +( 224 192 256 ) ( 224 224 256 ) ( 224 224 0 ) eden/bedtrim -224 0 0.00 1 1 0 0 0 +( 224 224 256 ) ( -480 224 256 ) ( -480 224 0 ) eden/bedtrim 224 0 -180.00 1 -1 0 0 0 +( -480 192 0 ) ( -480 224 0 ) ( -480 208 64 ) eden/bedtrim 224 0 -180.00 1 -1 0 0 0 +} +// brush 24 +{ +( 224 192 64 ) ( 224 224 64 ) ( -480 224 64 ) eden/edenmetalwall -224 -224 90.00 1 1 0 0 0 +( -480 224 320 ) ( 224 224 320 ) ( 224 192 320 ) eden/edenmetalwall -224 -224 90.00 1 1 0 0 0 +( -480 224 96 ) ( -480 192 96 ) ( -480 192 64 ) eden/edenmetalwall -224 64 0.00 1 1 0 0 0 +( -480 192 96 ) ( 224 192 96 ) ( 224 192 64 ) common/skip 0 0 0.00 1 1 805306368 16512 0 +( 224 224 96 ) ( -480 224 96 ) ( -480 224 64 ) eden/edenmetalwall 224 63 -180.00 1 -1 0 0 0 +( -416 224 64 ) ( -416 192 64 ) ( -416 208 320 ) eden/edenmetalwall 224 63 -180.00 1 -1 0 0 0 +} +// brush 25 +{ +( 224 192 64 ) ( 224 224 64 ) ( -480 224 64 ) eden/edenmetalwall -224 -224 90.00 1 1 0 0 0 +( -480 224 640 ) ( 224 224 640 ) ( 224 192 640 ) eden/edenmetalwall -224 -224 90.00 1 1 0 0 0 +( -480 192 96 ) ( 224 192 96 ) ( 224 192 64 ) eden/edenmetalwall 224 63 -180.00 1 -1 0 0 0 +( 224 192 96 ) ( 224 224 96 ) ( 224 224 64 ) eden/edenmetalwall -224 64 0.00 1 1 0 0 0 +( 224 224 96 ) ( -480 224 96 ) ( -480 224 64 ) eden/edenmetalwall 224 63 -180.00 1 -1 0 0 0 +( -480 192 384 ) ( -480 224 384 ) ( -480 208 640 ) eden/edenmetalwall 224 63 -180.00 1 -1 0 0 0 +} +// brush 26 + { + patchDef2 + { + eden/edenmetalwall + ( 3 3 0 536870912 0 ) +( +( ( -480 96 63.999981 0 0 ) ( -480 96 352.000061 0 0.500000 ) ( -480 96 640 0 1 ) ) +( ( -384 96 63.999981 0.500000 0 ) ( -384 96 352.000061 0.500000 0.500000 ) ( -384 96 640 0.500000 1 ) ) +( ( -384 192 63.999981 1 0 ) ( -384 192 352.000061 1 0.500000 ) ( -384 192 640 1 1 ) ) +) + } + } +// brush 27 +{ +( -480 192 0 ) ( -512 192 0 ) ( -512 -512 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -512 -512 64 ) ( -512 192 64 ) ( -480 192 64 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -480 -512 256 ) ( -480 192 256 ) ( -480 192 0 ) common/skip 0 0 0.00 1 1 805306368 16512 0 +( -480 192 256 ) ( -512 192 256 ) ( -512 192 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -512 192 256 ) ( -512 -512 256 ) ( -512 -512 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -480 128 0 ) ( -512 128 0 ) ( -496 128 64 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +} +// brush 28 +{ +( -480 192 0 ) ( -512 192 0 ) ( -512 -512 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -512 -512 64 ) ( -512 192 64 ) ( -480 192 64 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -512 -512 256 ) ( -480 -512 256 ) ( -480 -512 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -480 -512 256 ) ( -480 192 256 ) ( -480 192 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -512 192 256 ) ( -512 -512 256 ) ( -512 -512 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -512 192 0 ) ( -480 192 0 ) ( -496 192 64 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +} +// brush 29 +{ +( -480 192 64 ) ( -512 192 64 ) ( -512 -512 64 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +( -512 -512 320 ) ( -512 192 320 ) ( -480 192 320 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +( -480 -512 96 ) ( -480 192 96 ) ( -480 192 64 ) common/skip 0 0 0.00 1 1 805306368 16512 0 +( -480 192 96 ) ( -512 192 96 ) ( -512 192 64 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +( -512 192 96 ) ( -512 -512 96 ) ( -512 -512 64 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +( -480 128 64 ) ( -512 128 64 ) ( -496 128 320 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +} +// brush 30 +{ +( -480 192 64 ) ( -512 192 64 ) ( -512 -512 64 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +( -512 -512 640 ) ( -512 192 640 ) ( -480 192 640 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +( -512 -512 96 ) ( -480 -512 96 ) ( -480 -512 64 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +( -480 -512 416 ) ( -480 192 416 ) ( -480 192 384 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +( -512 192 96 ) ( -512 -512 96 ) ( -512 -512 64 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +( -512 192 64 ) ( -480 192 64 ) ( -496 192 320 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +} +// brush 31 + { + patchDef2 + { + eden/bedtrim + ( 3 3 0 536870912 0 ) +( +( ( -480 96 0 0 0 ) ( -480 96 32 0 0.500000 ) ( -480 96 64 0 1 ) ) +( ( -384 96 0 0.500000 0 ) ( -384 96 32 0.500000 0.500000 ) ( -384 96 64 0.500000 1 ) ) +( ( -384 192 0 1 0 ) ( -384 192 32 1 0.500000 ) ( -384 192 64 1 1 ) ) +) + } + } +// brush 32 +{ +( 192 192 608 ) ( -480 192 608 ) ( -480 -512 608 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( -480 -512 640 ) ( -480 192 640 ) ( 192 192 640 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( -480 -512 640 ) ( 192 -512 640 ) ( 192 -512 608 ) eden/CL_edenroof3 0 -96 0.00 1 1 0 0 0 +( 192 192 640 ) ( -480 192 640 ) ( -480 192 608 ) eden/CL_edenroof3 0 -96 0.00 1 1 0 0 0 +( -480 192 640 ) ( -480 -512 640 ) ( -480 -512 608 ) eden/CL_edenroof3 0 -96 0.00 1 1 0 0 0 +( 216 -112 608 ) ( 216 -240 608 ) ( 216 -176 640 ) eden/CL_edenroof3 0 -96 0.00 1 1 0 0 0 +} +// brush 33 +{ +( 192 192 -32 ) ( -480 192 -32 ) ( -480 -512 -32 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( -480 -512 0 ) ( -480 192 0 ) ( 192 192 0 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( -480 -512 224 ) ( 192 -512 224 ) ( 192 -512 -32 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 192 -512 224 ) ( 192 192 224 ) ( 192 192 -32 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 192 192 224 ) ( -480 192 224 ) ( -480 192 -32 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( -480 192 224 ) ( -480 -512 224 ) ( -480 -512 -32 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +} +// brush 34 +{ +( -480 -512 64 ) ( -480 -544 64 ) ( 224 -544 64 ) eden/edenmetalwall -31 31 -90.00 1 1 0 0 0 +( 224 -544 640 ) ( -480 -544 640 ) ( -480 -512 640 ) eden/edenmetalwall -31 31 -90.00 1 1 0 0 0 +( 224 -544 96 ) ( 224 -512 96 ) ( 224 -512 64 ) eden/edenmetalwall -32 63 -180.00 1 -1 0 0 0 +( 224 -512 96 ) ( -480 -512 96 ) ( -480 -512 64 ) eden/edenmetalwall -32 62 0.00 1.000008 1 0 0 0 +( -480 -512 416 ) ( -480 -544 416 ) ( -480 -544 384 ) eden/edenmetalwall -33 63 -180.00 1 -1 0 0 0 +( -480 -544 96 ) ( 224 -544 96 ) ( 224 -544 64 ) eden/edenmetalwall -32 62 0.00 1.000008 1 0 0 0 +} +// brush 35 +{ +( -480 -512 0 ) ( -480 -544 0 ) ( 224 -544 0 ) eden/bedtrim -31 32 -90.00 1 1 0 0 0 +( 224 -544 64 ) ( -480 -544 64 ) ( -480 -512 64 ) eden/bedtrim -31 32 -90.00 1 1 0 0 0 +( 224 -544 256 ) ( 224 -512 256 ) ( 224 -512 0 ) eden/bedtrim -32 0 -180.00 1 -1 0 0 0 +( 224 -512 256 ) ( -480 -512 256 ) ( -480 -512 0 ) eden/bedtrim -32 0 0.00 1 1 0 0 0 +( -480 -512 256 ) ( -480 -544 256 ) ( -480 -544 0 ) eden/bedtrim -33 0 -180.00 1 -1 0 0 0 +( -480 -544 256 ) ( 224 -544 256 ) ( 224 -544 0 ) eden/bedtrim -32 0 0.00 1 1 0 0 0 +} +// brush 36 +{ +( 192 -512 0 ) ( 224 -512 0 ) ( 224 192 0 ) eden/bedtrim 160 0 -180.00 1 1 0 0 0 +( 224 192 64 ) ( 224 -512 64 ) ( 192 -512 64 ) eden/bedtrim 160 0 -180.00 1 1 0 0 0 +( 224 192 256 ) ( 192 192 256 ) ( 192 192 0 ) eden/bedtrim 160 0 -180.00 1 -1 0 0 0 +( 192 192 256 ) ( 192 -512 256 ) ( 192 -512 0 ) eden/bedtrim -64 0 -180.00 1 -1 0 0 0 +( 192 -512 256 ) ( 224 -512 256 ) ( 224 -512 0 ) eden/bedtrim 159 0 -180.00 1 -1 0 0 0 +( 224 -512 256 ) ( 224 192 256 ) ( 224 192 0 ) eden/bedtrim -64 0 -180.00 1 -1 0 0 0 +} +// brush 37 +{ +( 192 -512 64 ) ( 224 -512 64 ) ( 224 192 64 ) eden/edenmetalwall 160 63 -180.00 1 1 0 0 0 +( 224 192 640 ) ( 224 -512 640 ) ( 192 -512 640 ) eden/edenmetalwall 160 63 -180.00 1 1 0 0 0 +( 224 192 96 ) ( 192 192 96 ) ( 192 192 64 ) eden/edenmetalwall 160 64 -180.00 1 -1 0 0 0 +( 192 192 416 ) ( 192 -512 416 ) ( 192 -512 384 ) eden/edenmetalwall -64 62 -180.00 1 -1 0 0 0 +( 192 -512 96 ) ( 224 -512 96 ) ( 224 -512 64 ) eden/edenmetalwall 159 64 -180.00 1 -1 0 0 0 +( 224 -512 96 ) ( 224 192 96 ) ( 224 192 64 ) eden/edenmetalwall -64 62 -180.00 1 -1 0 0 0 +} +} +// entity 1 +{ +"limit" "45" +"spawnflags" "2" +"classname" "func_fulcrum" +// brush 0 +{ +( 176 -256 152 ) ( 8 -256 152 ) ( 8 -416 152 ) eden/edentable 112 101 0.00 -1.500000 1.500000 0 0 0 +( 8 -416 168 ) ( 8 -256 168 ) ( 176 -256 168 ) eden/edentable 112 101 0.00 -1.500000 1.500000 0 0 0 +( 24 -424 168 ) ( 192 -424 168 ) ( 192 -424 152 ) eden/edentable 112 64 0.00 -1.500000 0.125000 0 0 0 +( 168 -416 168 ) ( 168 -256 168 ) ( 168 -256 152 ) eden/edentable 101 64 0.00 -1.500000 0.125000 0 0 0 +( 144 -232 168 ) ( -24 -232 168 ) ( -24 -232 152 ) eden/edentable 112 64 0.00 -1.500000 0.125000 0 0 0 +( -24 -232 168 ) ( -24 -392 168 ) ( -24 -392 152 ) eden/edentable 101 64 0.00 -1.500000 0.125000 0 0 0 +} +} +// entity 2 +{ +"limit" "45" +"classname" "func_fulcrum" +// brush 0 +{ +( 176 72 152 ) ( 8 72 152 ) ( 8 -88 152 ) eden/edentable 112 64 0.00 -1.500000 1.500000 0 0 0 +( 8 -88 168 ) ( 8 72 168 ) ( 176 72 168 ) eden/edentable 112 64 0.00 -1.500000 1.500000 0 0 0 +( 24 -96 168 ) ( 192 -96 168 ) ( 192 -96 152 ) eden/edentable 112 64 0.00 -1.500000 0.125000 0 0 0 +( 168 -88 168 ) ( 168 72 168 ) ( 168 72 152 ) eden/edentable 64 64 0.00 -1.500000 0.125000 0 0 0 +( 144 96 168 ) ( -24 96 168 ) ( -24 96 152 ) eden/edentable 112 64 0.00 -1.500000 0.125000 0 0 0 +( -24 96 168 ) ( -24 -64 168 ) ( -24 -64 152 ) eden/edentable 64 64 0.00 -1.500000 0.125000 0 0 0 +} +} +// entity 3 +{ +"classname" "script_object" +"targetname" "movinlight2" +// brush 0 +{ +( 16 -368 144 ) ( 0 -368 144 ) ( 0 -384 144 ) common/skip 32 16 0.00 1 1 805306368 16512 0 +( 0 -384 160 ) ( 0 -368 160 ) ( 16 -368 160 ) common/skip 32 16 0.00 1 1 805306368 16512 0 +( 0 -384 240 ) ( 16 -384 240 ) ( 16 -384 144 ) common/skip 32 -48 0.00 1 1 805306368 16512 0 +( 16 -384 240 ) ( 16 -368 240 ) ( 16 -368 144 ) common/skip -16 -48 0.00 1 1 805306368 16512 0 +( 16 -368 240 ) ( 0 -368 240 ) ( 0 -368 144 ) common/skip 32 -48 0.00 1 1 805306368 16512 0 +( 0 -368 240 ) ( 0 -384 240 ) ( 0 -384 144 ) common/skip -16 -48 0.00 1 1 805306368 16512 0 +} +} +// entity 4 +{ +"classname" "script_object" +"targetname" "movinlight1" +// brush 0 +{ +( -344 64 144 ) ( -360 64 144 ) ( -360 48 144 ) common/skip 0 0 0.00 1 1 805306368 16512 0 +( -360 48 160 ) ( -360 64 160 ) ( -344 64 160 ) common/skip 0 0 0.00 1 1 805306368 16512 0 +( -360 48 240 ) ( -344 48 240 ) ( -344 48 144 ) common/skip 0 -48 0.00 1 1 805306368 16512 0 +( -344 48 240 ) ( -344 64 240 ) ( -344 64 144 ) common/skip 0 -48 0.00 1 1 805306368 16512 0 +( -344 64 240 ) ( -360 64 240 ) ( -360 64 144 ) common/skip 0 -48 0.00 1 1 805306368 16512 0 +( -360 64 240 ) ( -360 48 240 ) ( -360 48 144 ) common/skip 0 -48 0.00 1 1 805306368 16512 0 +} +} +// entity 5 +{ +"_color" "1.000000 0.724409 0.523622" +"light" "200" +"origin" "-352 56 168" +"spawnflags" "0" +"classname" "light" +} +// entity 6 +{ +"origin" "-416 -176 24" +"angle" "0" +"classname" "info_player_start" +} +// entity 7 +{ +"_color" "0.629921 0.846457 1.000000" +"light" "200" +"classname" "light" +"spawnflags" "0" +"origin" "8 56 168" +} +// entity 8 +{ +"light" "200" +"classname" "light" +"spawnflags" "0" +"origin" "-344 -376 168" +} +// entity 9 +{ +"light" "200" +"origin" "8 -376 168" +"spawnflags" "0" +"classname" "light" +} +// entity 10 +{ +"origin" "-168 -160 168" +"spawnflags" "0" +"classname" "light" +"light" "200" +} +// entity 11 +{ +"classname" "light" +"spawnflags" "0" +"origin" "-352 56 384" +"light" "200" +"_color" "1.000000 0.724409 0.523622" +} +// entity 12 +{ +"origin" "8 56 384" +"spawnflags" "0" +"classname" "light" +"light" "200" +"_color" "0.629921 0.846457 1.000000" +} +// entity 13 +{ +"origin" "-344 -376 384" +"spawnflags" "0" +"classname" "light" +"light" "200" +} +// entity 14 +{ +"classname" "light" +"spawnflags" "0" +"origin" "8 -376 384" +"light" "200" +} +// entity 15 +{ +"light" "200" +"classname" "light" +"spawnflags" "0" +"origin" "-168 -160 384" +} diff --git a/fakk/maps/example/fulcrum.prt b/fakk/maps/example/fulcrum.prt new file mode 100644 index 0000000..9714f97 --- /dev/null +++ b/fakk/maps/example/fulcrum.prt @@ -0,0 +1,289 @@ +PRT1 +43 +124 +161 +4 0 3 0 (0 0 0 ) (0 0 608 ) (0 64 608 ) (0 64 0 ) +4 0 2 0 (0 64 608 ) (0 192 608 ) (0 192 0 ) (0 64 0 ) +4 0 1 0 (0 0 608 ) (0 0 0 ) (192 0 0 ) (192 0 608 ) +4 1 16 0 (0 -512 0 ) (0 -512 608 ) (0 0 608 ) (0 0 0 ) +4 2 10 0 (-240 64 96 ) (-256 64 96 ) (-256 64 80 ) (-240 64 80 ) +4 2 9 0 (-224 64 96 ) (-224 64 112 ) (-256 64 112 ) (-256 64 96 ) +4 2 11 0 (-272 64 112 ) (-272 64 64 ) (-256 64 64 ) (-256 64 112 ) +4 2 8 0 (-208 64 128 ) (-272 64 128 ) (-272 64 112 ) (-208 64 112 ) +4 2 12 0 (-272 64 128 ) (-288 64 128 ) (-288 64 48 ) (-272 64 48 ) +4 2 7 0 (-192 64 128 ) (-192 64 144 ) (-288 64 144 ) (-288 64 128 ) +4 2 13 0 (-304 64 144 ) (-304 64 32 ) (-288 64 32 ) (-288 64 144 ) +4 2 6 0 (-176 64 160 ) (-304 64 160 ) (-304 64 144 ) (-176 64 144 ) +4 2 14 0 (-304 64 160 ) (-320 64 160 ) (-320 64 16 ) (-304 64 16 ) +4 2 5 0 (-160 64 160 ) (-160 64 176 ) (-320 64 176 ) (-320 64 160 ) +4 2 15 0 (-480 64 176 ) (-480 64 0 ) (-320 64 0 ) (-320 64 176 ) +4 2 4 0 (-64 64 608 ) (-480 64 608 ) (-480 64 176 ) (-64 64 176 ) +4 2 3 0 (0 64 0 ) (0 64 608 ) (-64 64 608 ) (-64 64 0 ) +4 3 16 0 (0 0 0 ) (0 0 608 ) (-64 0 608 ) (-64 0 0 ) +4 3 4 0 (-64 64 608 ) (-64 64 176 ) (-64 0 176 ) (-64 0 608 ) +4 4 17 0 (-64 0 176 ) (-64 0 608 ) (-480 0 608 ) (-480 0 176 ) +4 4 5 0 (-320 64 176 ) (-160 64 176 ) (-160 0 176 ) (-320 0 176 ) +4 4 15 0 (-480 0 176 ) (-480 64 176 ) (-320 64 176 ) (-320 0 176 ) +4 5 18 0 (-160 0 176 ) (-320 0 176 ) (-320 0 160 ) (-160 0 160 ) +4 5 6 0 (-304 64 160 ) (-176 64 160 ) (-176 0 160 ) (-304 0 160 ) +4 5 14 0 (-320 0 160 ) (-320 64 160 ) (-304 64 160 ) (-304 0 160 ) +4 5 15 0 (-320 0 160 ) (-320 0 176 ) (-320 64 176 ) (-320 64 160 ) +4 6 19 0 (-176 0 144 ) (-176 0 160 ) (-304 0 160 ) (-304 0 144 ) +4 6 7 0 (-288 64 144 ) (-192 64 144 ) (-192 0 144 ) (-288 0 144 ) +4 6 13 0 (-304 0 144 ) (-304 64 144 ) (-288 64 144 ) (-288 0 144 ) +4 6 14 0 (-304 0 144 ) (-304 0 160 ) (-304 64 160 ) (-304 64 144 ) +4 7 20 0 (-192 0 144 ) (-288 0 144 ) (-288 0 128 ) (-192 0 128 ) +4 7 8 0 (-272 64 128 ) (-208 64 128 ) (-208 0 128 ) (-272 0 128 ) +4 7 12 0 (-288 0 128 ) (-288 64 128 ) (-272 64 128 ) (-272 0 128 ) +4 7 13 0 (-288 0 128 ) (-288 0 144 ) (-288 64 144 ) (-288 64 128 ) +4 8 21 0 (-208 0 112 ) (-208 0 128 ) (-272 0 128 ) (-272 0 112 ) +4 8 9 0 (-256 64 112 ) (-224 64 112 ) (-224 0 112 ) (-256 0 112 ) +4 8 11 0 (-272 0 112 ) (-272 64 112 ) (-256 64 112 ) (-256 0 112 ) +4 8 12 0 (-272 0 112 ) (-272 0 128 ) (-272 64 128 ) (-272 64 112 ) +4 9 22 0 (-224 0 112 ) (-256 0 112 ) (-256 0 96 ) (-224 0 96 ) +4 9 10 0 (-256 0 96 ) (-256 64 96 ) (-240 64 96 ) (-240 0 96 ) +4 9 11 0 (-256 0 96 ) (-256 0 112 ) (-256 64 112 ) (-256 64 96 ) +4 10 23 0 (-256 0 96 ) (-256 0 80 ) (-240 0 80 ) (-240 0 96 ) +4 10 11 0 (-256 0 80 ) (-256 0 96 ) (-256 64 96 ) (-256 64 80 ) +4 11 24 0 (-256 0 112 ) (-272 0 112 ) (-272 0 64 ) (-256 0 64 ) +4 11 12 0 (-272 0 64 ) (-272 0 112 ) (-272 64 112 ) (-272 64 64 ) +4 12 25 0 (-288 0 128 ) (-288 0 48 ) (-272 0 48 ) (-272 0 128 ) +4 12 13 0 (-288 0 48 ) (-288 0 128 ) (-288 64 128 ) (-288 64 48 ) +4 13 26 0 (-288 0 144 ) (-304 0 144 ) (-304 0 32 ) (-288 0 32 ) +4 13 14 0 (-304 0 32 ) (-304 0 144 ) (-304 64 144 ) (-304 64 32 ) +4 14 27 0 (-320 0 160 ) (-320 0 16 ) (-304 0 16 ) (-304 0 160 ) +4 14 15 0 (-320 0 16 ) (-320 0 160 ) (-320 64 160 ) (-320 64 16 ) +4 15 28 0 (-320 0 176 ) (-480 0 176 ) (-480 0 0 ) (-320 0 0 ) +4 16 42 0 (-64 -384 0 ) (-64 -512 0 ) (-64 -512 608 ) (-64 -384 608 ) +4 16 30 0 (-64 -384 176 ) (-64 -384 608 ) (-64 -264 608 ) (-64 -264 176 ) +4 16 29 0 (-64 -56 0 ) (-64 -264 0 ) (-64 -264 608 ) (-64 -56 608 ) +4 16 17 0 (-64 0 608 ) (-64 0 176 ) (-64 -56 176 ) (-64 -56 608 ) +4 17 29 0 (-64 -56 176 ) (-64 -56 608 ) (-480 -56 608 ) (-480 -56 176 ) +4 17 18 0 (-160 -56 176 ) (-320 -56 176 ) (-320 0 176 ) (-160 0 176 ) +4 17 28 0 (-320 -56 176 ) (-480 -56 176 ) (-480 0 176 ) (-320 0 176 ) +4 18 29 0 (-160 -56 176 ) (-320 -56 176 ) (-320 -56 160 ) (-160 -56 160 ) +4 18 19 0 (-304 0 160 ) (-176 0 160 ) (-176 -56 160 ) (-304 -56 160 ) +4 18 27 0 (-320 -56 160 ) (-320 0 160 ) (-304 0 160 ) (-304 -56 160 ) +4 18 28 0 (-320 -56 160 ) (-320 -56 176 ) (-320 0 176 ) (-320 0 160 ) +4 19 29 0 (-176 -56 144 ) (-176 -56 160 ) (-304 -56 160 ) (-304 -56 144 ) +4 19 20 0 (-288 0 144 ) (-192 0 144 ) (-192 -56 144 ) (-288 -56 144 ) +4 19 26 0 (-304 -56 144 ) (-304 0 144 ) (-288 0 144 ) (-288 -56 144 ) +4 19 27 0 (-304 -56 144 ) (-304 -56 160 ) (-304 0 160 ) (-304 0 144 ) +4 20 29 0 (-192 -56 144 ) (-288 -56 144 ) (-288 -56 128 ) (-192 -56 128 ) +4 20 21 0 (-272 0 128 ) (-208 0 128 ) (-208 -56 128 ) (-272 -56 128 ) +4 20 25 0 (-288 -56 128 ) (-288 0 128 ) (-272 0 128 ) (-272 -56 128 ) +4 20 26 0 (-288 -56 128 ) (-288 -56 144 ) (-288 0 144 ) (-288 0 128 ) +4 21 29 0 (-208 -56 112 ) (-208 -56 128 ) (-272 -56 128 ) (-272 -56 112 ) +4 21 22 0 (-256 0 112 ) (-224 0 112 ) (-224 -56 112 ) (-256 -56 112 ) +4 21 24 0 (-272 -56 112 ) (-272 0 112 ) (-256 0 112 ) (-256 -56 112 ) +4 21 25 0 (-272 -56 112 ) (-272 -56 128 ) (-272 0 128 ) (-272 0 112 ) +4 22 29 0 (-224 -56 112 ) (-256 -56 112 ) (-256 -56 96 ) (-224 -56 96 ) +4 22 23 0 (-256 -56 96 ) (-256 0 96 ) (-240 0 96 ) (-240 -56 96 ) +4 22 24 0 (-256 -56 96 ) (-256 -56 112 ) (-256 0 112 ) (-256 0 96 ) +4 23 29 0 (-256 -56 96 ) (-256 -56 80 ) (-240 -56 80 ) (-240 -56 96 ) +4 23 24 0 (-256 -56 80 ) (-256 -56 96 ) (-256 0 96 ) (-256 0 80 ) +4 24 29 0 (-256 -56 112 ) (-272 -56 112 ) (-272 -56 64 ) (-256 -56 64 ) +4 24 25 0 (-272 -56 64 ) (-272 -56 112 ) (-272 0 112 ) (-272 0 64 ) +4 25 29 0 (-288 -56 128 ) (-288 -56 48 ) (-272 -56 48 ) (-272 -56 128 ) +4 25 26 0 (-288 -56 48 ) (-288 -56 128 ) (-288 0 128 ) (-288 0 48 ) +4 26 29 0 (-288 -56 144 ) (-304 -56 144 ) (-304 -56 32 ) (-288 -56 32 ) +4 26 27 0 (-304 -56 32 ) (-304 -56 144 ) (-304 0 144 ) (-304 0 32 ) +4 27 29 0 (-320 -56 160 ) (-320 -56 16 ) (-304 -56 16 ) (-304 -56 160 ) +4 27 28 0 (-320 -56 16 ) (-320 -56 160 ) (-320 0 160 ) (-320 0 16 ) +4 28 29 0 (-320 -56 176 ) (-480 -56 176 ) (-480 -56 0 ) (-320 -56 0 ) +4 29 41 0 (-320 -264 16 ) (-480 -264 16 ) (-480 -264 0 ) (-320 -264 0 ) +4 29 40 0 (-304 -264 32 ) (-480 -264 32 ) (-480 -264 16 ) (-304 -264 16 ) +4 29 39 0 (-480 -264 48 ) (-480 -264 32 ) (-288 -264 32 ) (-288 -264 48 ) +4 29 38 0 (-480 -264 64 ) (-480 -264 48 ) (-272 -264 48 ) (-272 -264 64 ) +4 29 37 0 (-480 -264 80 ) (-480 -264 64 ) (-256 -264 64 ) (-256 -264 80 ) +4 29 36 0 (-480 -264 96 ) (-480 -264 80 ) (-240 -264 80 ) (-240 -264 96 ) +4 29 34 0 (-208 -264 608 ) (-224 -264 608 ) (-224 -264 112 ) (-208 -264 112 ) +4 29 35 0 (-224 -264 608 ) (-480 -264 608 ) (-480 -264 96 ) (-224 -264 96 ) +4 29 33 0 (-192 -264 608 ) (-208 -264 608 ) (-208 -264 128 ) (-192 -264 128 ) +4 29 32 0 (-176 -264 608 ) (-192 -264 608 ) (-192 -264 144 ) (-176 -264 144 ) +4 29 31 0 (-160 -264 608 ) (-176 -264 608 ) (-176 -264 160 ) (-160 -264 160 ) +4 29 30 0 (-64 -264 176 ) (-64 -264 608 ) (-160 -264 608 ) (-160 -264 176 ) +4 30 42 0 (-64 -384 176 ) (-64 -384 608 ) (-160 -384 608 ) (-160 -384 176 ) +4 30 31 0 (-160 -384 176 ) (-160 -384 608 ) (-160 -264 608 ) (-160 -264 176 ) +4 31 42 0 (-160 -384 608 ) (-176 -384 608 ) (-176 -384 160 ) (-160 -384 160 ) +4 31 32 0 (-176 -384 160 ) (-176 -384 608 ) (-176 -264 608 ) (-176 -264 160 ) +4 32 42 0 (-176 -384 608 ) (-192 -384 608 ) (-192 -384 144 ) (-176 -384 144 ) +4 32 33 0 (-192 -384 144 ) (-192 -384 608 ) (-192 -264 608 ) (-192 -264 144 ) +4 33 42 0 (-192 -384 608 ) (-208 -384 608 ) (-208 -384 128 ) (-192 -384 128 ) +4 33 34 0 (-208 -384 128 ) (-208 -384 608 ) (-208 -264 608 ) (-208 -264 128 ) +4 34 42 0 (-208 -384 608 ) (-224 -384 608 ) (-224 -384 112 ) (-208 -384 112 ) +4 34 35 0 (-224 -384 112 ) (-224 -384 608 ) (-224 -264 608 ) (-224 -264 112 ) +4 35 42 0 (-224 -384 608 ) (-480 -384 608 ) (-480 -384 96 ) (-224 -384 96 ) +4 35 36 0 (-480 -384 96 ) (-480 -264 96 ) (-240 -264 96 ) (-240 -384 96 ) +4 36 42 0 (-480 -384 96 ) (-480 -384 80 ) (-240 -384 80 ) (-240 -384 96 ) +4 36 37 0 (-480 -384 80 ) (-480 -264 80 ) (-256 -264 80 ) (-256 -384 80 ) +4 37 42 0 (-480 -384 80 ) (-480 -384 64 ) (-256 -384 64 ) (-256 -384 80 ) +4 37 38 0 (-480 -384 64 ) (-480 -264 64 ) (-272 -264 64 ) (-272 -384 64 ) +4 38 42 0 (-480 -384 64 ) (-480 -384 48 ) (-272 -384 48 ) (-272 -384 64 ) +4 38 39 0 (-480 -384 48 ) (-480 -264 48 ) (-288 -264 48 ) (-288 -384 48 ) +4 39 42 0 (-480 -384 48 ) (-480 -384 32 ) (-288 -384 32 ) (-288 -384 48 ) +4 39 40 0 (-304 -384 32 ) (-480 -384 32 ) (-480 -264 32 ) (-304 -264 32 ) +4 40 42 0 (-304 -384 32 ) (-480 -384 32 ) (-480 -384 16 ) (-304 -384 16 ) +4 40 41 0 (-320 -384 16 ) (-480 -384 16 ) (-480 -264 16 ) (-320 -264 16 ) +4 41 42 0 (-320 -384 16 ) (-480 -384 16 ) (-480 -384 0 ) (-320 -384 0 ) +4 0 (0 0 608 ) (192 0 608 ) (192 192 608 ) (0 192 608 ) +4 0 (192 192 608 ) (192 192 0 ) (0 192 0 ) (0 192 608 ) +4 0 (192 0 608 ) (192 0 0 ) (192 192 0 ) (192 192 608 ) +4 0 (0 192 0 ) (192 192 0 ) (192 0 0 ) (0 0 0 ) +4 1 (0 -512 608 ) (192 -512 608 ) (192 0 608 ) (0 0 608 ) +4 1 (0 -512 608 ) (0 -512 0 ) (192 -512 0 ) (192 -512 608 ) +4 1 (192 -512 608 ) (192 -512 0 ) (192 0 0 ) (192 0 608 ) +4 1 (0 0 0 ) (192 0 0 ) (192 -512 0 ) (0 -512 0 ) +4 2 (-224 64 80 ) (-224 64 96 ) (-240 64 96 ) (-240 64 80 ) +4 2 (-256 64 64 ) (-224 64 64 ) (-224 64 80 ) (-256 64 80 ) +4 2 (-224 64 64 ) (-208 64 64 ) (-208 64 112 ) (-224 64 112 ) +4 2 (-272 64 64 ) (-272 64 48 ) (-208 64 48 ) (-208 64 64 ) +4 2 (-192 64 48 ) (-192 64 128 ) (-208 64 128 ) (-208 64 48 ) +4 2 (-288 64 32 ) (-192 64 32 ) (-192 64 48 ) (-288 64 48 ) +4 2 (-192 64 32 ) (-176 64 32 ) (-176 64 144 ) (-192 64 144 ) +4 2 (-304 64 32 ) (-304 64 16 ) (-176 64 16 ) (-176 64 32 ) +4 2 (-160 64 16 ) (-160 64 160 ) (-176 64 160 ) (-176 64 16 ) +4 2 (-320 64 0 ) (-160 64 0 ) (-160 64 16 ) (-320 64 16 ) +4 2 (-160 64 0 ) (-64 64 0 ) (-64 64 176 ) (-160 64 176 ) +4 2 (0 64 0 ) (-480 64 0 ) (-480 192 0 ) (0 192 0 ) +4 2 (-480 64 0 ) (-480 64 608 ) (-480 192 608 ) (-480 192 0 ) +4 2 (0 192 608 ) (0 192 0 ) (-480 192 0 ) (-480 192 608 ) +4 2 (0 192 608 ) (-480 192 608 ) (-480 64 608 ) (0 64 608 ) +4 3 (-64 64 176 ) (-64 64 0 ) (-64 0 0 ) (-64 0 176 ) +4 3 (0 64 608 ) (-64 64 608 ) (-64 0 608 ) (0 0 608 ) +4 3 (0 0 0 ) (-64 0 0 ) (-64 64 0 ) (0 64 0 ) +4 4 (-160 64 176 ) (-64 64 176 ) (-64 0 176 ) (-160 0 176 ) +4 4 (-480 64 608 ) (-480 64 176 ) (-480 0 176 ) (-480 0 608 ) +4 4 (-64 0 608 ) (-64 64 608 ) (-480 64 608 ) (-480 0 608 ) +4 5 (-176 64 160 ) (-160 64 160 ) (-160 0 160 ) (-176 0 160 ) +4 5 (-160 64 160 ) (-160 64 176 ) (-160 0 176 ) (-160 0 160 ) +4 6 (-192 64 144 ) (-176 64 144 ) (-176 0 144 ) (-192 0 144 ) +4 6 (-176 64 144 ) (-176 64 160 ) (-176 0 160 ) (-176 0 144 ) +4 7 (-208 64 128 ) (-192 64 128 ) (-192 0 128 ) (-208 0 128 ) +4 7 (-192 64 128 ) (-192 64 144 ) (-192 0 144 ) (-192 0 128 ) +4 8 (-224 64 112 ) (-208 64 112 ) (-208 0 112 ) (-224 0 112 ) +4 8 (-208 64 112 ) (-208 64 128 ) (-208 0 128 ) (-208 0 112 ) +4 9 (-240 64 96 ) (-224 64 96 ) (-224 0 96 ) (-240 0 96 ) +4 9 (-224 64 96 ) (-224 64 112 ) (-224 0 112 ) (-224 0 96 ) +4 10 (-256 0 80 ) (-256 64 80 ) (-240 64 80 ) (-240 0 80 ) +4 10 (-240 64 96 ) (-240 0 96 ) (-240 0 80 ) (-240 64 80 ) +4 11 (-256 64 80 ) (-256 0 80 ) (-256 0 64 ) (-256 64 64 ) +4 11 (-272 0 64 ) (-272 64 64 ) (-256 64 64 ) (-256 0 64 ) +4 12 (-272 64 64 ) (-272 0 64 ) (-272 0 48 ) (-272 64 48 ) +4 12 (-288 0 48 ) (-288 64 48 ) (-272 64 48 ) (-272 0 48 ) +4 13 (-288 64 48 ) (-288 0 48 ) (-288 0 32 ) (-288 64 32 ) +4 13 (-304 0 32 ) (-304 64 32 ) (-288 64 32 ) (-288 0 32 ) +4 14 (-304 64 32 ) (-304 0 32 ) (-304 0 16 ) (-304 64 16 ) +4 14 (-320 0 16 ) (-320 64 16 ) (-304 64 16 ) (-304 0 16 ) +4 15 (-320 64 16 ) (-320 0 16 ) (-320 0 0 ) (-320 64 0 ) +4 15 (-480 64 176 ) (-480 64 0 ) (-480 0 0 ) (-480 0 176 ) +4 15 (-480 0 0 ) (-480 64 0 ) (-320 64 0 ) (-320 0 0 ) +4 16 (-64 -264 0 ) (-64 -384 0 ) (-64 -384 16 ) (-64 -264 16 ) +4 16 (-64 -384 16 ) (-64 -384 32 ) (-64 -264 32 ) (-64 -264 16 ) +4 16 (-64 -384 32 ) (-64 -384 176 ) (-64 -264 176 ) (-64 -264 32 ) +4 16 (-64 0 176 ) (-64 0 0 ) (-64 -56 0 ) (-64 -56 176 ) +4 16 (0 0 608 ) (-64 0 608 ) (-64 -512 608 ) (0 -512 608 ) +4 16 (-64 -512 608 ) (-64 -512 0 ) (0 -512 0 ) (0 -512 608 ) +4 16 (0 -512 0 ) (-64 -512 0 ) (-64 0 0 ) (0 0 0 ) +4 17 (-64 -56 176 ) (-160 -56 176 ) (-160 0 176 ) (-64 0 176 ) +4 17 (-480 0 608 ) (-480 0 176 ) (-480 -56 176 ) (-480 -56 608 ) +4 17 (-64 0 608 ) (-480 0 608 ) (-480 -56 608 ) (-64 -56 608 ) +4 18 (-176 0 160 ) (-160 0 160 ) (-160 -56 160 ) (-176 -56 160 ) +4 18 (-160 0 160 ) (-160 0 176 ) (-160 -56 176 ) (-160 -56 160 ) +4 19 (-192 0 144 ) (-176 0 144 ) (-176 -56 144 ) (-192 -56 144 ) +4 19 (-176 0 144 ) (-176 0 160 ) (-176 -56 160 ) (-176 -56 144 ) +4 20 (-208 0 128 ) (-192 0 128 ) (-192 -56 128 ) (-208 -56 128 ) +4 20 (-192 0 128 ) (-192 0 144 ) (-192 -56 144 ) (-192 -56 128 ) +4 21 (-224 0 112 ) (-208 0 112 ) (-208 -56 112 ) (-224 -56 112 ) +4 21 (-208 0 112 ) (-208 0 128 ) (-208 -56 128 ) (-208 -56 112 ) +4 22 (-240 0 96 ) (-224 0 96 ) (-224 -56 96 ) (-240 -56 96 ) +4 22 (-224 0 96 ) (-224 0 112 ) (-224 -56 112 ) (-224 -56 96 ) +4 23 (-256 -56 80 ) (-256 0 80 ) (-240 0 80 ) (-240 -56 80 ) +4 23 (-240 0 96 ) (-240 -56 96 ) (-240 -56 80 ) (-240 0 80 ) +4 24 (-256 0 80 ) (-256 -56 80 ) (-256 -56 64 ) (-256 0 64 ) +4 24 (-272 -56 64 ) (-272 0 64 ) (-256 0 64 ) (-256 -56 64 ) +4 25 (-272 0 64 ) (-272 -56 64 ) (-272 -56 48 ) (-272 0 48 ) +4 25 (-288 -56 48 ) (-288 0 48 ) (-272 0 48 ) (-272 -56 48 ) +4 26 (-288 0 48 ) (-288 -56 48 ) (-288 -56 32 ) (-288 0 32 ) +4 26 (-304 -56 32 ) (-304 0 32 ) (-288 0 32 ) (-288 -56 32 ) +4 27 (-304 0 32 ) (-304 -56 32 ) (-304 -56 16 ) (-304 0 16 ) +4 27 (-320 -56 16 ) (-320 0 16 ) (-304 0 16 ) (-304 -56 16 ) +4 28 (-320 0 16 ) (-320 -56 16 ) (-320 -56 0 ) (-320 0 0 ) +4 28 (-480 0 176 ) (-480 0 0 ) (-480 -56 0 ) (-480 -56 176 ) +4 28 (-320 -56 0 ) (-480 -56 0 ) (-480 0 0 ) (-320 0 0 ) +4 29 (-64 -264 0 ) (-64 -264 16 ) (-320 -264 16 ) (-320 -264 0 ) +4 29 (-64 -264 16 ) (-64 -264 32 ) (-304 -264 32 ) (-304 -264 16 ) +4 29 (-288 -264 32 ) (-160 -264 32 ) (-160 -264 48 ) (-288 -264 48 ) +4 29 (-272 -264 48 ) (-176 -264 48 ) (-176 -264 64 ) (-272 -264 64 ) +4 29 (-256 -264 64 ) (-192 -264 64 ) (-192 -264 80 ) (-256 -264 80 ) +4 29 (-240 -264 80 ) (-208 -264 80 ) (-208 -264 96 ) (-240 -264 96 ) +4 29 (-224 -264 112 ) (-224 -264 96 ) (-208 -264 96 ) (-208 -264 112 ) +4 29 (-208 -264 128 ) (-208 -264 80 ) (-192 -264 80 ) (-192 -264 128 ) +4 29 (-192 -264 144 ) (-192 -264 64 ) (-176 -264 64 ) (-176 -264 144 ) +4 29 (-176 -264 160 ) (-176 -264 48 ) (-160 -264 48 ) (-160 -264 160 ) +4 29 (-64 -264 32 ) (-64 -264 176 ) (-160 -264 176 ) (-160 -264 32 ) +4 29 (-64 -56 608 ) (-480 -56 608 ) (-480 -264 608 ) (-64 -264 608 ) +4 29 (-240 -56 96 ) (-224 -56 96 ) (-224 -56 80 ) (-240 -56 80 ) +4 29 (-224 -56 80 ) (-224 -56 64 ) (-256 -56 64 ) (-256 -56 80 ) +4 29 (-224 -56 64 ) (-224 -56 112 ) (-208 -56 112 ) (-208 -56 64 ) +4 29 (-272 -56 64 ) (-208 -56 64 ) (-208 -56 48 ) (-272 -56 48 ) +4 29 (-208 -56 128 ) (-192 -56 128 ) (-192 -56 48 ) (-208 -56 48 ) +4 29 (-192 -56 48 ) (-192 -56 32 ) (-288 -56 32 ) (-288 -56 48 ) +4 29 (-192 -56 32 ) (-192 -56 144 ) (-176 -56 144 ) (-176 -56 32 ) +4 29 (-304 -56 32 ) (-176 -56 32 ) (-176 -56 16 ) (-304 -56 16 ) +4 29 (-176 -56 160 ) (-160 -56 160 ) (-160 -56 16 ) (-176 -56 16 ) +4 29 (-160 -56 16 ) (-160 -56 0 ) (-320 -56 0 ) (-320 -56 16 ) +4 29 (-160 -56 0 ) (-160 -56 176 ) (-64 -56 176 ) (-64 -56 0 ) +4 29 (-480 -56 608 ) (-480 -56 0 ) (-480 -264 0 ) (-480 -264 608 ) +4 29 (-64 -264 0 ) (-480 -264 0 ) (-480 -56 0 ) (-64 -56 0 ) +4 30 (-64 -264 608 ) (-160 -264 608 ) (-160 -384 608 ) (-64 -384 608 ) +4 30 (-64 -384 176 ) (-160 -384 176 ) (-160 -264 176 ) (-64 -264 176 ) +4 31 (-160 -264 608 ) (-176 -264 608 ) (-176 -384 608 ) (-160 -384 608 ) +4 31 (-160 -264 160 ) (-160 -264 176 ) (-160 -384 176 ) (-160 -384 160 ) +4 31 (-176 -384 160 ) (-176 -264 160 ) (-160 -264 160 ) (-160 -384 160 ) +4 32 (-176 -264 608 ) (-192 -264 608 ) (-192 -384 608 ) (-176 -384 608 ) +4 32 (-176 -264 144 ) (-176 -264 160 ) (-176 -384 160 ) (-176 -384 144 ) +4 32 (-192 -384 144 ) (-192 -264 144 ) (-176 -264 144 ) (-176 -384 144 ) +4 33 (-192 -264 608 ) (-208 -264 608 ) (-208 -384 608 ) (-192 -384 608 ) +4 33 (-192 -264 128 ) (-192 -264 144 ) (-192 -384 144 ) (-192 -384 128 ) +4 33 (-208 -384 128 ) (-208 -264 128 ) (-192 -264 128 ) (-192 -384 128 ) +4 34 (-208 -264 608 ) (-224 -264 608 ) (-224 -384 608 ) (-208 -384 608 ) +4 34 (-208 -264 112 ) (-208 -264 128 ) (-208 -384 128 ) (-208 -384 112 ) +4 34 (-224 -384 112 ) (-224 -264 112 ) (-208 -264 112 ) (-208 -384 112 ) +4 35 (-240 -264 96 ) (-224 -264 96 ) (-224 -384 96 ) (-240 -384 96 ) +4 35 (-224 -264 112 ) (-224 -384 112 ) (-224 -384 96 ) (-224 -264 96 ) +4 35 (-480 -264 608 ) (-480 -264 96 ) (-480 -384 96 ) (-480 -384 608 ) +4 35 (-224 -264 608 ) (-480 -264 608 ) (-480 -384 608 ) (-224 -384 608 ) +4 36 (-256 -264 80 ) (-240 -264 80 ) (-240 -384 80 ) (-256 -384 80 ) +4 36 (-480 -264 96 ) (-480 -264 80 ) (-480 -384 80 ) (-480 -384 96 ) +4 36 (-240 -264 96 ) (-240 -384 96 ) (-240 -384 80 ) (-240 -264 80 ) +4 37 (-272 -264 64 ) (-256 -264 64 ) (-256 -384 64 ) (-272 -384 64 ) +4 37 (-480 -264 80 ) (-480 -264 64 ) (-480 -384 64 ) (-480 -384 80 ) +4 37 (-256 -264 80 ) (-256 -384 80 ) (-256 -384 64 ) (-256 -264 64 ) +4 38 (-288 -264 48 ) (-272 -264 48 ) (-272 -384 48 ) (-288 -384 48 ) +4 38 (-480 -264 64 ) (-480 -264 48 ) (-480 -384 48 ) (-480 -384 64 ) +4 38 (-272 -264 64 ) (-272 -384 64 ) (-272 -384 48 ) (-272 -264 48 ) +4 39 (-288 -384 32 ) (-304 -384 32 ) (-304 -264 32 ) (-288 -264 32 ) +4 39 (-480 -264 48 ) (-480 -264 32 ) (-480 -384 32 ) (-480 -384 48 ) +4 39 (-288 -264 48 ) (-288 -384 48 ) (-288 -384 32 ) (-288 -264 32 ) +4 40 (-304 -384 16 ) (-320 -384 16 ) (-320 -264 16 ) (-304 -264 16 ) +4 40 (-480 -264 32 ) (-480 -264 16 ) (-480 -384 16 ) (-480 -384 32 ) +4 40 (-304 -264 32 ) (-304 -384 32 ) (-304 -384 16 ) (-304 -264 16 ) +4 41 (-480 -264 16 ) (-480 -264 0 ) (-480 -384 0 ) (-480 -384 16 ) +4 41 (-320 -384 0 ) (-480 -384 0 ) (-480 -264 0 ) (-320 -264 0 ) +4 41 (-320 -264 16 ) (-320 -384 16 ) (-320 -384 0 ) (-320 -264 0 ) +4 42 (-64 -384 608 ) (-480 -384 608 ) (-480 -512 608 ) (-64 -512 608 ) +4 42 (-480 -384 608 ) (-480 -384 0 ) (-480 -512 0 ) (-480 -512 608 ) +4 42 (-320 -384 0 ) (-320 -384 16 ) (-64 -384 16 ) (-64 -384 0 ) +4 42 (-304 -384 16 ) (-304 -384 32 ) (-64 -384 32 ) (-64 -384 16 ) +4 42 (-288 -384 48 ) (-160 -384 48 ) (-160 -384 32 ) (-288 -384 32 ) +4 42 (-272 -384 64 ) (-176 -384 64 ) (-176 -384 48 ) (-272 -384 48 ) +4 42 (-256 -384 80 ) (-192 -384 80 ) (-192 -384 64 ) (-256 -384 64 ) +4 42 (-240 -384 96 ) (-208 -384 96 ) (-208 -384 80 ) (-240 -384 80 ) +4 42 (-208 -384 112 ) (-208 -384 96 ) (-224 -384 96 ) (-224 -384 112 ) +4 42 (-192 -384 128 ) (-192 -384 80 ) (-208 -384 80 ) (-208 -384 128 ) +4 42 (-176 -384 144 ) (-176 -384 64 ) (-192 -384 64 ) (-192 -384 144 ) +4 42 (-160 -384 160 ) (-160 -384 48 ) (-176 -384 48 ) (-176 -384 160 ) +4 42 (-160 -384 32 ) (-160 -384 176 ) (-64 -384 176 ) (-64 -384 32 ) +4 42 (-480 -512 608 ) (-480 -512 0 ) (-64 -512 0 ) (-64 -512 608 ) +4 42 (-64 -512 0 ) (-480 -512 0 ) (-480 -384 0 ) (-64 -384 0 ) diff --git a/fakk/maps/example/fulcrum.scr b/fakk/maps/example/fulcrum.scr new file mode 100644 index 0000000..4cf02db --- /dev/null +++ b/fakk/maps/example/fulcrum.scr @@ -0,0 +1,12 @@ +end +waitforplayer +wait 5 +loop: +cuecamera $cam1 0 +wait 5 +cuecamera $cam2 0 +wait 5 +cueplayer 0 +wait 5 +//goto loop +end \ No newline at end of file diff --git a/fakk/maps/example/funcspawn.bsp b/fakk/maps/example/funcspawn.bsp new file mode 100644 index 0000000000000000000000000000000000000000..4e346384a442ca893e94896cb5ac2b3359ba92d0 GIT binary patch literal 56220 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 =%(#7s6;n_lM0 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 GAN~V90sQa) literal 0 HcmV?d00001 diff --git a/fakk/maps/example/letterbox.scr b/fakk/maps/example/letterbox.scr new file mode 100644 index 0000000..91dc144 --- /dev/null +++ b/fakk/maps/example/letterbox.scr @@ -0,0 +1,16 @@ +waitforplayer +//fadeout 3 0 0 0 1 +//wait 3 +//clearfade + +top: +wait 5 +$beam activate +//fadeout 2 1 1 1 1 +letterbox 1 +wait 8 +$beam deactivate +clearletterbox 1 +//fadein 2 1 1 1 1 +goto top +end diff --git a/fakk/maps/example/multiexploder.bsp b/fakk/maps/example/multiexploder.bsp new file mode 100644 index 0000000000000000000000000000000000000000..af2addb23fdbffe6b981d241349f507847690b38 GIT binary patch literal 61580 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 bYf49g&fLyUdDUFjw4+-&%Ku+(v&H#8$sH}* literal 0 HcmV?d00001 diff --git a/fakk/maps/example/multiexploder.map b/fakk/maps/example/multiexploder.map new file mode 100644 index 0000000..8fe5309 --- /dev/null +++ b/fakk/maps/example/multiexploder.map @@ -0,0 +1,108 @@ +{ +"classname" "worldspawn" +// brush 0 +{ +( 64 64 0 ) ( -64 64 0 ) ( -64 -64 0 ) eden/FL_underground 0 0 0.00 1 1 0 0 0 +( -64 -64 8 ) ( -64 64 8 ) ( 64 64 8 ) eden/FL_underground 0 0 0.00 1 1 0 0 0 +( -72 -64 8 ) ( 56 -64 8 ) ( 56 -64 0 ) eden/FL_underground 0 0 0.00 1 1 0 0 0 +( 64 -64 8 ) ( 64 64 8 ) ( 64 64 0 ) eden/FL_underground 0 0 0.00 1 1 0 0 0 +( 64 64 8 ) ( -64 64 8 ) ( -64 64 0 ) eden/FL_underground 0 0 0.00 1 1 0 0 0 +( -64 64 8 ) ( -64 -64 8 ) ( -64 -64 0 ) eden/FL_underground 0 0 0.00 1 1 0 0 0 +} +// brush 1 +{ +( 264 264 -8 ) ( -264 264 -8 ) ( -264 -272 -8 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 -272 264 ) ( -264 264 264 ) ( 264 264 264 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 -264 8 ) ( 264 -264 8 ) ( 264 -264 0 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( 264 264 8 ) ( -264 264 8 ) ( -264 264 0 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 264 8 ) ( -264 -272 8 ) ( -264 -272 0 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( -256 -272 8 ) ( -256 264 8 ) ( -256 -272 0 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +} +// brush 2 +{ +( 264 264 -8 ) ( -264 264 -8 ) ( -264 -272 -8 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 -272 264 ) ( -264 264 264 ) ( 264 264 264 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( 264 -272 8 ) ( 264 264 8 ) ( 264 264 0 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( 264 264 8 ) ( -264 264 8 ) ( -264 264 0 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 264 8 ) ( -264 -272 8 ) ( -264 -272 0 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 256 8 ) ( 264 256 8 ) ( -264 256 0 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +} +// brush 3 +{ +( 264 264 -8 ) ( -264 264 -8 ) ( -264 -272 -8 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 -272 264 ) ( -264 264 264 ) ( 264 264 264 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 -264 8 ) ( 264 -264 8 ) ( 264 -264 0 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( 264 -272 8 ) ( 264 264 8 ) ( 264 264 0 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( 264 264 8 ) ( -264 264 8 ) ( -264 264 0 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( 256 264 8 ) ( 256 -272 8 ) ( 256 264 0 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +} +// brush 4 +{ +( 264 264 -8 ) ( -264 264 -8 ) ( -264 -272 -8 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 -272 264 ) ( -264 264 264 ) ( 264 264 264 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 -264 8 ) ( 264 -264 8 ) ( 264 -264 0 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( 264 -272 8 ) ( 264 264 8 ) ( 264 264 0 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 264 8 ) ( -264 -272 8 ) ( -264 -272 0 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( 264 -256 8 ) ( -264 -256 8 ) ( 264 -256 0 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +} +// brush 5 +{ +( -264 -272 264 ) ( -264 264 264 ) ( 264 264 264 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 -264 8 ) ( 264 -264 8 ) ( 264 -264 0 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( 264 -272 8 ) ( 264 264 8 ) ( 264 264 0 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( 264 264 8 ) ( -264 264 8 ) ( -264 264 0 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 264 8 ) ( -264 -272 8 ) ( -264 -272 0 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 264 256 ) ( -264 -272 256 ) ( 264 264 256 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +} +// brush 6 +{ +( 264 264 -8 ) ( -264 264 -8 ) ( -264 -272 -8 ) eden/FL_edenhouse2 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 -264 8 ) ( 264 -264 8 ) ( 264 -264 0 ) eden/FL_edenhouse2 0 0 0.00 0.500000 0.500000 0 0 0 +( 264 -272 8 ) ( 264 264 8 ) ( 264 264 0 ) eden/FL_edenhouse2 0 0 0.00 0.500000 0.500000 0 0 0 +( 264 264 8 ) ( -264 264 8 ) ( -264 264 0 ) eden/FL_edenhouse2 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 264 8 ) ( -264 -272 8 ) ( -264 -272 0 ) eden/FL_edenhouse2 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 264 0 ) ( 264 264 0 ) ( -264 -272 0 ) eden/FL_edenhouse2 0 0 0.00 0.500000 0.500000 0 0 0 +} +} +// entity 1 +{ +"classname" "func_multi_exploder" +"targetname" "t1" +"duration" "4" +// brush 0 +{ +( 16 240 48 ) ( -16 240 48 ) ( -16 208 48 ) notexture 0 -24 0.00 1 1 0 0 0 +( -16 208 192 ) ( -16 240 192 ) ( 16 240 192 ) notexture 0 -24 0.00 1 1 0 0 0 +( -16 160 192 ) ( 16 160 192 ) ( 16 160 184 ) eden/FL_underground 0 0 0.00 1 1 0 0 0 +( 128 208 192 ) ( 128 240 192 ) ( 128 240 184 ) notexture 24 -8 0.00 1 1 0 0 0 +( 16 224 192 ) ( -16 224 192 ) ( -16 224 184 ) notexture 0 -8 0.00 1 1 0 0 0 +( -128 240 192 ) ( -128 208 192 ) ( -128 208 184 ) notexture 24 -8 0.00 1 1 0 0 0 +} +} +// entity 2 +{ +"wait" "5" +"classname" "trigger_multiple" +"target" "t1" +// brush 0 +{ +( 64 64 8 ) ( -56 64 8 ) ( -56 -64 8 ) common/trigger 0 0 0.00 1 1 0 128 0 +( -56 -64 192 ) ( -56 64 192 ) ( 64 64 192 ) common/trigger 0 0 0.00 1 1 0 128 0 +( -56 -64 16 ) ( 64 -64 16 ) ( 64 -64 8 ) common/trigger 0 0 0.00 1 1 0 128 0 +( 64 -64 16 ) ( 64 64 16 ) ( 64 64 8 ) common/trigger 0 0 0.00 1 1 0 128 0 +( 64 64 16 ) ( -56 64 16 ) ( -56 64 8 ) common/trigger 0 0 0.00 1 1 0 128 0 +( -64 64 16 ) ( -64 -64 16 ) ( -64 -64 8 ) common/trigger 0 0 0.00 1 1 0 128 0 +} +} +// entity 3 +{ +"classname" "light" +"light" "1000" +"origin" "0 0 128" +} +// entity 4 +{ +"classname" "info_player_start" +"angle" "90" +"origin" "0 -192 16" +} diff --git a/fakk/maps/example/multiexploder.prt b/fakk/maps/example/multiexploder.prt new file mode 100644 index 0000000..67779b6 --- /dev/null +++ b/fakk/maps/example/multiexploder.prt @@ -0,0 +1,68 @@ +PRT1 +12 +20 +44 +4 0 6 0 (0 0 8 ) (0 0 256 ) (0 256 256 ) (0 256 8 ) +4 0 3 0 (0 0 256 ) (0 0 8 ) (256 0 8 ) (256 0 256 ) +4 0 2 0 (0 256 8 ) (64 256 8 ) (64 64 8 ) (0 64 8 ) +4 0 1 0 (64 256 8 ) (256 256 8 ) (256 0 8 ) (64 0 8 ) +4 1 4 0 (64 0 0 ) (256 0 0 ) (256 0 8 ) (64 0 8 ) +4 1 2 0 (64 256 0 ) (64 64 0 ) (64 64 8 ) (64 256 8 ) +4 2 7 0 (0 64 8 ) (0 256 8 ) (0 256 0 ) (0 64 0 ) +4 3 9 0 (0 0 256 ) (0 0 8 ) (0 -256 8 ) (0 -256 256 ) +4 3 5 0 (64 -256 8 ) (0 -256 8 ) (0 -64 8 ) (64 -64 8 ) +4 3 4 0 (256 -256 8 ) (64 -256 8 ) (64 0 8 ) (256 0 8 ) +4 4 5 0 (64 -64 0 ) (64 -256 0 ) (64 -256 8 ) (64 -64 8 ) +4 5 10 0 (0 -64 0 ) (0 -256 0 ) (0 -256 8 ) (0 -64 8 ) +4 6 9 0 (0 0 8 ) (0 0 256 ) (-256 0 256 ) (-256 0 8 ) +4 6 7 0 (-64 64 8 ) (-64 256 8 ) (0 256 8 ) (0 64 8 ) +4 6 8 0 (-64 0 8 ) (-256 0 8 ) (-256 256 8 ) (-64 256 8 ) +4 7 8 0 (-64 64 8 ) (-64 256 8 ) (-64 256 0 ) (-64 64 0 ) +4 8 11 0 (-64 0 8 ) (-256 0 8 ) (-256 0 0 ) (-64 0 0 ) +4 9 10 0 (0 -256 8 ) (-64 -256 8 ) (-64 -64 8 ) (0 -64 8 ) +4 9 11 0 (-64 -256 8 ) (-256 -256 8 ) (-256 0 8 ) (-64 0 8 ) +4 10 11 0 (-64 -64 0 ) (-64 -256 0 ) (-64 -256 8 ) (-64 -64 8 ) +4 0 (64 64 8 ) (64 0 8 ) (0 0 8 ) (0 64 8 ) +4 0 (0 0 256 ) (256 0 256 ) (256 256 256 ) (0 256 256 ) +4 0 (256 256 256 ) (256 256 8 ) (0 256 8 ) (0 256 256 ) +4 0 (256 0 256 ) (256 0 8 ) (256 256 8 ) (256 256 256 ) +4 1 (64 64 0 ) (64 0 0 ) (64 0 8 ) (64 64 8 ) +4 1 (256 0 8 ) (256 0 0 ) (256 256 0 ) (256 256 8 ) +4 1 (64 256 8 ) (256 256 8 ) (256 256 0 ) (64 256 0 ) +4 1 (256 0 0 ) (64 0 0 ) (64 256 0 ) (256 256 0 ) +4 2 (0 64 0 ) (0 256 0 ) (64 256 0 ) (64 64 0 ) +4 2 (64 256 8 ) (64 256 0 ) (0 256 0 ) (0 256 8 ) +4 2 (0 64 0 ) (64 64 0 ) (64 64 8 ) (0 64 8 ) +4 3 (0 -64 8 ) (0 0 8 ) (64 0 8 ) (64 -64 8 ) +4 3 (256 0 256 ) (0 0 256 ) (0 -256 256 ) (256 -256 256 ) +4 3 (256 -256 256 ) (256 -256 8 ) (256 0 8 ) (256 0 256 ) +4 3 (0 -256 256 ) (0 -256 8 ) (256 -256 8 ) (256 -256 256 ) +4 4 (64 0 0 ) (64 -64 0 ) (64 -64 8 ) (64 0 8 ) +4 4 (64 -256 0 ) (256 -256 0 ) (256 -256 8 ) (64 -256 8 ) +4 4 (256 -256 8 ) (256 -256 0 ) (256 0 0 ) (256 0 8 ) +4 4 (64 0 0 ) (256 0 0 ) (256 -256 0 ) (64 -256 0 ) +4 5 (0 -256 0 ) (0 -64 0 ) (64 -64 0 ) (64 -256 0 ) +4 5 (0 -256 8 ) (0 -256 0 ) (64 -256 0 ) (64 -256 8 ) +4 5 (0 -64 8 ) (64 -64 8 ) (64 -64 0 ) (0 -64 0 ) +4 6 (0 0 8 ) (-64 0 8 ) (-64 64 8 ) (0 64 8 ) +4 6 (0 256 256 ) (-256 256 256 ) (-256 0 256 ) (0 0 256 ) +4 6 (-256 0 8 ) (-256 0 256 ) (-256 256 256 ) (-256 256 8 ) +4 6 (0 256 256 ) (0 256 8 ) (-256 256 8 ) (-256 256 256 ) +4 7 (-64 64 0 ) (-64 256 0 ) (0 256 0 ) (0 64 0 ) +4 7 (-64 256 8 ) (0 256 8 ) (0 256 0 ) (-64 256 0 ) +4 7 (-64 64 8 ) (-64 64 0 ) (0 64 0 ) (0 64 8 ) +4 8 (-64 0 0 ) (-64 64 0 ) (-64 64 8 ) (-64 0 8 ) +4 8 (-64 256 8 ) (-64 256 0 ) (-256 256 0 ) (-256 256 8 ) +4 8 (-256 0 0 ) (-256 0 8 ) (-256 256 8 ) (-256 256 0 ) +4 8 (-64 0 0 ) (-256 0 0 ) (-256 256 0 ) (-64 256 0 ) +4 9 (-64 -64 8 ) (-64 0 8 ) (0 0 8 ) (0 -64 8 ) +4 9 (0 0 256 ) (-256 0 256 ) (-256 -256 256 ) (0 -256 256 ) +4 9 (-256 0 256 ) (-256 0 8 ) (-256 -256 8 ) (-256 -256 256 ) +4 9 (-256 -256 256 ) (-256 -256 8 ) (0 -256 8 ) (0 -256 256 ) +4 10 (0 -64 0 ) (0 -256 0 ) (-64 -256 0 ) (-64 -64 0 ) +4 10 (-64 -256 0 ) (0 -256 0 ) (0 -256 8 ) (-64 -256 8 ) +4 10 (0 -64 8 ) (0 -64 0 ) (-64 -64 0 ) (-64 -64 8 ) +4 11 (-64 0 8 ) (-64 -64 8 ) (-64 -64 0 ) (-64 0 0 ) +4 11 (-256 -256 8 ) (-256 -256 0 ) (-64 -256 0 ) (-64 -256 8 ) +4 11 (-256 0 8 ) (-256 0 0 ) (-256 -256 0 ) (-256 -256 8 ) +4 11 (-256 -256 0 ) (-256 0 0 ) (-64 0 0 ) (-64 -256 0 ) diff --git a/fakk/maps/example/patrol.bsp b/fakk/maps/example/patrol.bsp new file mode 100644 index 0000000000000000000000000000000000000000..687c7648d3960d8932dfa98d5b878a00807ffd42 GIT binary patch literal 232420 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

    _ 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 Ndmpr{&&IPp{{w_N`i}qr literal 0 HcmV?d00001 diff --git a/fakk/maps/example/patrol.map b/fakk/maps/example/patrol.map new file mode 100644 index 0000000..a3ae506 --- /dev/null +++ b/fakk/maps/example/patrol.map @@ -0,0 +1,1397 @@ +{ +"classname" "worldspawn" +// brush 0 +{ +( 152 560 64 ) ( 152 576 64 ) ( 136 576 64 ) eden/genmetal 0 8 0.00 1 1 0 0 0 +( 136 576 240 ) ( 152 576 240 ) ( 152 560 240 ) eden/genmetal 0 8 0.00 1 1 0 0 0 +( 136 576 256 ) ( 136 560 256 ) ( 136 560 0 ) eden/genmetal -32 0 0.00 1 1 0 0 0 +( 136 568 256 ) ( 152 568 256 ) ( 152 568 0 ) eden/genmetal 24 0 0.00 1 1 0 0 0 +( 152 568 256 ) ( 152 584 256 ) ( 152 584 0 ) eden/genmetal -32 0 0.00 1 1 0 0 0 +( 152 576 256 ) ( 136 576 256 ) ( 136 576 0 ) eden/genmetal 56 0 -180.00 1 -1 0 0 0 +} +// brush 1 +{ +( 184 560 64 ) ( 184 576 64 ) ( 168 576 64 ) eden/genmetal 0 -8 0.00 1 1 0 0 0 +( 168 576 240 ) ( 184 576 240 ) ( 184 560 240 ) eden/genmetal 0 -8 0.00 1 1 0 0 0 +( 168 584 256 ) ( 168 568 256 ) ( 168 568 0 ) eden/genmetal -32 0 0.00 1 1 0 0 0 +( 168 568 256 ) ( 184 568 256 ) ( 184 568 0 ) eden/genmetal 40 0 0.00 1 1 0 0 0 +( 184 560 256 ) ( 184 576 256 ) ( 184 576 0 ) eden/genmetal -32 0 0.00 1 1 0 0 0 +( 184 576 256 ) ( 168 576 256 ) ( 168 576 0 ) eden/genmetal 72 0 -180.00 1 -1 0 0 0 +} +// brush 2 +{ +( 176 576 272 ) ( 144 576 272 ) ( 144 576 16 ) eden/genmetal 32 16 0.00 1 1 0 0 0 +( 168 568 272 ) ( 168 584 272 ) ( 168 584 16 ) eden/genmetal -32 16 0.00 1 1 0 0 0 +( 136 568 256 ) ( 168 568 256 ) ( 168 568 0 ) eden/genmetal 32 16 0.00 1 1 0 0 0 +( 152 584 272 ) ( 152 568 272 ) ( 152 568 16 ) eden/genmetal -32 16 0.00 1 1 0 0 0 +( 144 576 80 ) ( 176 576 80 ) ( 176 560 80 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( 176 560 64 ) ( 176 576 64 ) ( 144 576 64 ) eden/genmetal 0 -64 90.00 1 1 0 0 0 +} +// brush 3 +{ +( 176 576 432 ) ( 144 576 432 ) ( 144 576 176 ) eden/genmetal 32 48 0.00 1 1 0 0 0 +( 168 568 432 ) ( 168 584 432 ) ( 168 584 176 ) eden/genmetal -32 48 0.00 1 1 0 0 0 +( 136 568 416 ) ( 168 568 416 ) ( 168 568 160 ) eden/genmetal 32 48 0.00 1 1 0 0 0 +( 152 584 432 ) ( 152 568 432 ) ( 152 568 176 ) eden/genmetal -32 48 0.00 1 1 0 0 0 +( 144 576 240 ) ( 176 576 240 ) ( 176 560 240 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( 176 560 224 ) ( 176 576 224 ) ( 144 576 224 ) eden/genmetal 0 -64 90.00 1 1 0 0 0 +} +// brush 4 +{ +( 168 576 240 ) ( 152 576 240 ) ( 152 576 64 ) otto/ottolight 35 -16 90.00 -2.250000 -0.500000 0 0 0 +( 168 568 240 ) ( 168 576 240 ) ( 168 576 64 ) otto/ottolight 35 16 90.00 -2.250000 -0.500000 0 0 0 +( 152 572 240 ) ( 168 572 240 ) ( 168 572 64 ) otto/ottolight 35 -16 90.00 -2.250000 -0.500000 0 0 0 +( 152 576 240 ) ( 152 568 240 ) ( 152 568 64 ) otto/ottolight 35 16 90.00 -2.250000 -0.500000 0 0 0 +( 152 576 224 ) ( 168 576 224 ) ( 168 568 224 ) otto/ottolight 35 -16 90.00 -2.250000 -0.500000 0 0 0 +( 168 568 80 ) ( 168 576 80 ) ( 152 576 80 ) otto/ottolight 6 16 0.00 2.250000 0.500000 0 0 0 +} +// brush 5 +{ +( 152 -768 64 ) ( 152 -768 240 ) ( 168 -768 240 ) otto/ottolight 35 -16 90.00 -2.250000 -0.500000 0 0 0 +( 168 -768 64 ) ( 168 -768 240 ) ( 168 -760 240 ) otto/ottolight 34 16 90.00 -2.250000 -0.500000 0 0 0 +( 168 -764 64 ) ( 168 -764 240 ) ( 152 -764 240 ) otto/ottolight 35 -16 90.00 -2.250000 -0.500000 0 0 0 +( 152 -760 64 ) ( 152 -760 240 ) ( 152 -768 240 ) otto/ottolight 34 16 90.00 -2.250000 -0.500000 0 0 0 +( 168 -760 224 ) ( 168 -768 224 ) ( 152 -768 224 ) otto/ottolight 34 -16 90.00 -2.250000 -0.500000 0 0 0 +( 152 -768 80 ) ( 168 -768 80 ) ( 168 -760 80 ) otto/ottolight 5 16 0.00 2.250000 0.500000 0 0 0 +} +// brush 6 +{ +( 144 -768 176 ) ( 144 -768 432 ) ( 176 -768 432 ) eden/genmetal 32 48 0.00 1 1 0 0 0 +( 168 -776 176 ) ( 168 -776 432 ) ( 168 -760 432 ) eden/genmetal -96 48 0.00 1 1 0 0 0 +( 168 -760 160 ) ( 168 -760 416 ) ( 136 -760 416 ) eden/genmetal 32 48 0.00 1 1 0 0 0 +( 152 -760 176 ) ( 152 -760 432 ) ( 152 -776 432 ) eden/genmetal -96 48 0.00 1 1 0 0 0 +( 176 -752 240 ) ( 176 -768 240 ) ( 144 -768 240 ) eden/genmetal -64 0 0.00 1 1 0 0 0 +( 144 -768 224 ) ( 176 -768 224 ) ( 176 -752 224 ) eden/genmetal 64 -63 90.00 1 1 0 0 0 +} +// brush 7 +{ +( 144 -768 16 ) ( 144 -768 272 ) ( 176 -768 272 ) eden/genmetal 32 16 0.00 1 1 0 0 0 +( 168 -776 16 ) ( 168 -776 272 ) ( 168 -760 272 ) eden/genmetal -96 16 0.00 1 1 0 0 0 +( 168 -760 0 ) ( 168 -760 256 ) ( 136 -760 256 ) eden/genmetal 32 16 0.00 1 1 0 0 0 +( 152 -760 16 ) ( 152 -760 272 ) ( 152 -776 272 ) eden/genmetal -96 16 0.00 1 1 0 0 0 +( 176 -752 80 ) ( 176 -768 80 ) ( 144 -768 80 ) eden/genmetal -64 0 0.00 1 1 0 0 0 +( 144 -768 64 ) ( 176 -768 64 ) ( 176 -752 64 ) eden/genmetal 64 -63 90.00 1 1 0 0 0 +} +// brush 8 +{ +( 168 -768 64 ) ( 184 -768 64 ) ( 184 -752 64 ) eden/genmetal -64 -8 0.00 1 1 0 0 0 +( 184 -752 240 ) ( 184 -768 240 ) ( 168 -768 240 ) eden/genmetal -64 -8 0.00 1 1 0 0 0 +( 168 -760 0 ) ( 168 -760 256 ) ( 168 -776 256 ) eden/genmetal -96 0 0.00 1 1 0 0 0 +( 184 -760 0 ) ( 184 -760 256 ) ( 168 -760 256 ) eden/genmetal 40 0 0.00 1 1 0 0 0 +( 184 -768 0 ) ( 184 -768 256 ) ( 184 -752 256 ) eden/genmetal -96 0 0.00 1 1 0 0 0 +( 168 -768 0 ) ( 168 -768 256 ) ( 184 -768 256 ) eden/genmetal 71 0 -180.00 1 -1 0 0 0 +} +// brush 9 +{ +( 136 -768 64 ) ( 152 -768 64 ) ( 152 -752 64 ) eden/genmetal -64 8 0.00 1 1 0 0 0 +( 152 -752 240 ) ( 152 -768 240 ) ( 136 -768 240 ) eden/genmetal -64 8 0.00 1 1 0 0 0 +( 136 -752 0 ) ( 136 -752 256 ) ( 136 -768 256 ) eden/genmetal -96 0 0.00 1 1 0 0 0 +( 152 -760 0 ) ( 152 -760 256 ) ( 136 -760 256 ) eden/genmetal 24 0 0.00 1 1 0 0 0 +( 152 -776 0 ) ( 152 -776 256 ) ( 152 -760 256 ) eden/genmetal -96 0 0.00 1 1 0 0 0 +( 136 -768 0 ) ( 136 -768 256 ) ( 152 -768 256 ) eden/genmetal 55 0 -180.00 1 -1 0 0 0 +} +// brush 10 +{ +( 832 -120 64 ) ( 832 -104 64 ) ( 816 -104 64 ) eden/genmetal -64 8 0.00 1 1 0 0 0 +( 816 -104 240 ) ( 832 -104 240 ) ( 832 -120 240 ) eden/genmetal -64 8 0.00 1 1 0 0 0 +( 816 -120 0 ) ( 816 -120 256 ) ( 832 -120 256 ) eden/genmetal -64 0 0.00 1 1 0 0 0 +( 824 -104 0 ) ( 824 -104 256 ) ( 824 -120 256 ) eden/genmetal -8 0 0.00 1 1 0 0 0 +( 840 -104 0 ) ( 840 -104 256 ) ( 824 -104 256 ) eden/genmetal -64 0 0.00 1 1 0 0 0 +( 832 -120 0 ) ( 832 -120 256 ) ( 832 -104 256 ) eden/genmetal -8 0 0.00 1 1 0 0 0 +} +// brush 11 +{ +( 832 -88 64 ) ( 832 -72 64 ) ( 816 -72 64 ) eden/genmetal -64 -8 0.00 1 1 0 0 0 +( 816 -72 240 ) ( 832 -72 240 ) ( 832 -88 240 ) eden/genmetal -64 -8 0.00 1 1 0 0 0 +( 824 -88 0 ) ( 824 -88 256 ) ( 840 -88 256 ) eden/genmetal -64 0 0.00 1 1 0 0 0 +( 824 -72 0 ) ( 824 -72 256 ) ( 824 -88 256 ) eden/genmetal 8 0 0.00 1 1 0 0 0 +( 832 -72 0 ) ( 832 -72 256 ) ( 816 -72 256 ) eden/genmetal -64 0 0.00 1 1 0 0 0 +( 832 -88 0 ) ( 832 -88 256 ) ( 832 -72 256 ) eden/genmetal 8 0 0.00 1 1 0 0 0 +} +// brush 12 +{ +( 832 -112 16 ) ( 832 -112 272 ) ( 832 -80 272 ) eden/genmetal 0 16 0.00 1 1 0 0 0 +( 840 -88 16 ) ( 840 -88 272 ) ( 824 -88 272 ) eden/genmetal -64 16 0.00 1 1 0 0 0 +( 824 -88 0 ) ( 824 -88 256 ) ( 824 -120 256 ) eden/genmetal 0 16 0.00 1 1 0 0 0 +( 824 -104 16 ) ( 824 -104 272 ) ( 840 -104 272 ) eden/genmetal -64 16 0.00 1 1 0 0 0 +( 816 -80 80 ) ( 832 -80 80 ) ( 832 -112 80 ) eden/genmetal -64 0 0.00 1 1 0 0 0 +( 832 -112 64 ) ( 832 -80 64 ) ( 816 -80 64 ) eden/genmetal -64 0 0.00 1 1 0 0 0 +} +// brush 13 +{ +( 832 -112 176 ) ( 832 -112 432 ) ( 832 -80 432 ) eden/genmetal 0 48 0.00 1 1 0 0 0 +( 840 -88 176 ) ( 840 -88 432 ) ( 824 -88 432 ) eden/genmetal -64 48 0.00 1 1 0 0 0 +( 824 -88 160 ) ( 824 -88 416 ) ( 824 -120 416 ) eden/genmetal 0 48 0.00 1 1 0 0 0 +( 824 -104 176 ) ( 824 -104 432 ) ( 840 -104 432 ) eden/genmetal -64 48 0.00 1 1 0 0 0 +( 816 -80 240 ) ( 832 -80 240 ) ( 832 -112 240 ) eden/genmetal -64 0 0.00 1 1 0 0 0 +( 832 -112 224 ) ( 832 -80 224 ) ( 816 -80 224 ) eden/genmetal -64 0 0.00 1 1 0 0 0 +} +// brush 14 +{ +( 832 -104 64 ) ( 832 -104 240 ) ( 832 -88 240 ) otto/ottolight 35 16 90.00 -2.250000 -0.500000 0 0 0 +( 832 -88 64 ) ( 832 -88 240 ) ( 824 -88 240 ) otto/ottolight 34 16 90.00 -2.250000 -0.500000 0 0 0 +( 828 -88 64 ) ( 828 -88 240 ) ( 828 -104 240 ) otto/ottolight 35 16 90.00 -2.250000 -0.500000 0 0 0 +( 824 -104 64 ) ( 824 -104 240 ) ( 832 -104 240 ) otto/ottolight 34 16 90.00 -2.250000 -0.500000 0 0 0 +( 824 -88 224 ) ( 832 -88 224 ) ( 832 -104 224 ) otto/ottolight 34 16 90.00 -2.250000 -0.500000 0 0 0 +( 832 -104 80 ) ( 832 -88 80 ) ( 824 -88 80 ) otto/ottolight 34 16 90.00 -2.250000 -0.500000 0 0 0 +} +// brush 15 +{ +( -512 -88 240 ) ( -512 -104 240 ) ( -512 -104 64 ) otto/ottolight 35 16 90.00 -2.250000 -0.500000 0 0 0 +( -504 -88 240 ) ( -512 -88 240 ) ( -512 -88 64 ) otto/ottolight 35 16 90.00 -2.250000 -0.500000 0 0 0 +( -508 -104 240 ) ( -508 -88 240 ) ( -508 -88 64 ) otto/ottolight 35 16 90.00 -2.250000 -0.500000 0 0 0 +( -512 -104 240 ) ( -504 -104 240 ) ( -504 -104 64 ) otto/ottolight 35 16 90.00 -2.250000 -0.500000 0 0 0 +( -512 -104 224 ) ( -512 -88 224 ) ( -504 -88 224 ) otto/ottolight 35 16 90.00 -2.250000 -0.500000 0 0 0 +( -504 -88 80 ) ( -512 -88 80 ) ( -512 -104 80 ) otto/ottolight 35 16 90.00 -2.250000 -0.500000 0 0 0 +} +// brush 16 +{ +( -512 -80 432 ) ( -512 -112 432 ) ( -512 -112 176 ) eden/genmetal 0 48 0.00 1 1 0 0 0 +( -504 -88 432 ) ( -520 -88 432 ) ( -520 -88 176 ) eden/genmetal 0 48 0.00 1 1 0 0 0 +( -504 -120 416 ) ( -504 -88 416 ) ( -504 -88 160 ) eden/genmetal 0 48 0.00 1 1 0 0 0 +( -520 -104 432 ) ( -504 -104 432 ) ( -504 -104 176 ) eden/genmetal 0 48 0.00 1 1 0 0 0 +( -512 -112 240 ) ( -512 -80 240 ) ( -496 -80 240 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -496 -80 224 ) ( -512 -80 224 ) ( -512 -112 224 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +} +// brush 17 +{ +( -512 -80 272 ) ( -512 -112 272 ) ( -512 -112 16 ) eden/genmetal 0 16 0.00 1 1 0 0 0 +( -504 -88 272 ) ( -520 -88 272 ) ( -520 -88 16 ) eden/genmetal 0 16 0.00 1 1 0 0 0 +( -504 -120 256 ) ( -504 -88 256 ) ( -504 -88 0 ) eden/genmetal 0 16 0.00 1 1 0 0 0 +( -520 -104 272 ) ( -504 -104 272 ) ( -504 -104 16 ) eden/genmetal 0 16 0.00 1 1 0 0 0 +( -512 -112 80 ) ( -512 -80 80 ) ( -496 -80 80 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -496 -80 64 ) ( -512 -80 64 ) ( -512 -112 64 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +} +// brush 18 +{ +( -496 -72 64 ) ( -512 -72 64 ) ( -512 -88 64 ) eden/genmetal 0 -8 0.00 1 1 0 0 0 +( -512 -88 240 ) ( -512 -72 240 ) ( -496 -72 240 ) eden/genmetal 0 -8 0.00 1 1 0 0 0 +( -520 -88 256 ) ( -504 -88 256 ) ( -504 -88 0 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -504 -88 256 ) ( -504 -72 256 ) ( -504 -72 0 ) eden/genmetal 8 0 0.00 1 1 0 0 0 +( -496 -72 256 ) ( -512 -72 256 ) ( -512 -72 0 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -512 -72 256 ) ( -512 -88 256 ) ( -512 -88 0 ) eden/genmetal 8 0 0.00 1 1 0 0 0 +} +// brush 19 +{ +( -496 -104 64 ) ( -512 -104 64 ) ( -512 -120 64 ) eden/genmetal 0 8 0.00 1 1 0 0 0 +( -512 -120 240 ) ( -512 -104 240 ) ( -496 -104 240 ) eden/genmetal 0 8 0.00 1 1 0 0 0 +( -512 -120 256 ) ( -496 -120 256 ) ( -496 -120 0 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -504 -120 256 ) ( -504 -104 256 ) ( -504 -104 0 ) eden/genmetal -8 0 0.00 1 1 0 0 0 +( -504 -104 256 ) ( -520 -104 256 ) ( -520 -104 0 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -512 -104 256 ) ( -512 -120 256 ) ( -512 -120 0 ) eden/genmetal -8 0 0.00 1 1 0 0 0 +} +// brush 20 +{ +( 128 704 -96 ) ( 128 672 -96 ) ( 128 672 -128 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +( 352 704 -96 ) ( 128 704 -96 ) ( 128 704 -128 ) eden/edenmetalwall 64 0 0.00 1 1 0 0 0 +( 384 672 -96 ) ( 384 704 -96 ) ( 384 704 -128 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +( 128 672 -96 ) ( 352 672 -96 ) ( 352 672 -128 ) eden/edenmetalwall 64 0 0.00 1 1 0 0 0 +( 128 672 -96 ) ( 128 704 -96 ) ( 352 704 -96 ) eden/edenmetalwall 64 0 0.00 1 1 0 0 0 +( 352 704 -128 ) ( 128 704 -128 ) ( 128 672 -128 ) eden/edenmetalwall 64 0 0.00 1 1 0 0 0 +} +// brush 21 + { + patchDef2 + { + eden/edenmetalwall + ( 9 3 0 536870912 0 subdivisions 90.458153 ) +( +( ( -344 -568 288 0 0 ) ( -344 -568 496 0 0.812500 ) ( 72 -184 496 0 3.437500 ) ) +( ( -312 -600 288 0.125000 0 ) ( -312 -600 496 0.125000 0.812500 ) ( 104 -216 496 0.125000 3.437500 ) ) +( ( -280 -568 288 0.250000 0 ) ( -280 -568 464 0.250000 0.812500 ) ( 104 -216 464 0.250000 3.437500 ) ) +( ( -248 -536 288 0.375000 0 ) ( -248 -536 432 0.375000 0.812500 ) ( 104 -216 432 0.375000 3.437500 ) ) +( ( -280 -504 288 0.500000 0 ) ( -280 -504 432 0.500000 0.812500 ) ( 72 -184 432 0.500000 3.437500 ) ) +( ( -312 -472 288 0.625000 0 ) ( -312 -472 432 0.625000 0.812500 ) ( 40 -152 432 0.625000 3.437500 ) ) +( ( -344 -504 288 0.750000 0 ) ( -344 -504 464 0.750000 0.812500 ) ( 40 -152 464 0.750000 3.437500 ) ) +( ( -376 -536 288 0.875000 0 ) ( -376 -536 496 0.875000 0.812500 ) ( 40 -152 496 0.875000 3.437500 ) ) +( ( -344 -568 288 1 0 ) ( -344 -568 496 1 0.812500 ) ( 72 -184 496 1 3.437500 ) ) +) + } + } +// brush 22 + { + patchDef2 + { + eden/edenmetalwall + ( 9 3 0 536870912 0 subdivisions 90.458153 ) +( +( ( 88 -8 496 0 3.437500 ) ( -328 376 496 0 0.812500 ) ( -328 376 288 0 0 ) ) +( ( 120 24 496 0.125000 3.437500 ) ( -296 408 496 0.125000 0.812500 ) ( -296 408 288 0.125000 0 ) ) +( ( 120 24 464 0.250000 3.437500 ) ( -264 376 464 0.250000 0.812500 ) ( -264 376 288 0.250000 0 ) ) +( ( 120 24 432 0.375000 3.437500 ) ( -232 344 432 0.375000 0.812500 ) ( -232 344 288 0.375000 0 ) ) +( ( 88 -8 432 0.500000 3.437500 ) ( -264 312 432 0.500000 0.812500 ) ( -264 312 288 0.500000 0 ) ) +( ( 56 -40 432 0.625000 3.437500 ) ( -296 280 432 0.625000 0.812500 ) ( -296 280 288 0.625000 0 ) ) +( ( 56 -40 464 0.750000 3.437500 ) ( -328 312 464 0.750000 0.812500 ) ( -328 312 288 0.750000 0 ) ) +( ( 56 -40 496 0.875000 3.437500 ) ( -360 344 496 0.875000 0.812500 ) ( -360 344 288 0.875000 0 ) ) +( ( 88 -8 496 1 3.437500 ) ( -328 376 496 1 0.812500 ) ( -328 376 288 1 0 ) ) +) + } + } +// brush 23 + { + patchDef2 + { + eden/edenmetalwall + ( 9 3 0 536870912 0 subdivisions 90.458153 ) +( +( ( 648 376 288 0 0 ) ( 648 376 496 0 0.812500 ) ( 232 -8 496 0 3.437500 ) ) +( ( 616 408 288 0.125000 0 ) ( 616 408 496 0.125000 0.812500 ) ( 200 24 496 0.125000 3.437500 ) ) +( ( 584 376 288 0.250000 0 ) ( 584 376 464 0.250000 0.812500 ) ( 200 24 464 0.250000 3.437500 ) ) +( ( 552 344 288 0.375000 0 ) ( 552 344 432 0.375000 0.812500 ) ( 200 24 432 0.375000 3.437500 ) ) +( ( 584 312 288 0.500000 0 ) ( 584 312 432 0.500000 0.812500 ) ( 232 -8 432 0.500000 3.437500 ) ) +( ( 616 280 288 0.625000 0 ) ( 616 280 432 0.625000 0.812500 ) ( 264 -40 432 0.625000 3.437500 ) ) +( ( 648 312 288 0.750000 0 ) ( 648 312 464 0.750000 0.812500 ) ( 264 -40 464 0.750000 3.437500 ) ) +( ( 680 344 288 0.875000 0 ) ( 680 344 496 0.875000 0.812500 ) ( 264 -40 496 0.875000 3.437500 ) ) +( ( 648 376 288 1 0 ) ( 648 376 496 1 0.812500 ) ( 232 -8 496 1 3.437500 ) ) +) + } + } +// brush 24 + { + patchDef2 + { + eden/edenmetalwall + ( 9 3 0 536870912 0 subdivisions 90.458153 ) +( +( ( 248 -184 496 0 3.437500 ) ( 664 -568 496 0 0.812500 ) ( 664 -568 288 0 0 ) ) +( ( 216 -216 496 0.125000 3.437500 ) ( 632 -600 496 0.125000 0.812500 ) ( 632 -600 288 0.125000 0 ) ) +( ( 216 -216 464 0.250000 3.437500 ) ( 600 -568 464 0.250000 0.812500 ) ( 600 -568 288 0.250000 0 ) ) +( ( 216 -216 432 0.375000 3.437500 ) ( 568 -536 432 0.375000 0.812500 ) ( 568 -536 288 0.375000 0 ) ) +( ( 248 -184 432 0.500000 3.437500 ) ( 600 -504 432 0.500000 0.812500 ) ( 600 -504 288 0.500000 0 ) ) +( ( 280 -152 432 0.625000 3.437500 ) ( 632 -472 432 0.625000 0.812500 ) ( 632 -472 288 0.625000 0 ) ) +( ( 280 -152 464 0.750000 3.437500 ) ( 664 -504 464 0.750000 0.812500 ) ( 664 -504 288 0.750000 0 ) ) +( ( 280 -152 496 0.875000 3.437500 ) ( 696 -536 496 0.875000 0.812500 ) ( 696 -536 288 0.875000 0 ) ) +( ( 248 -184 496 1 3.437500 ) ( 664 -568 496 1 0.812500 ) ( 664 -568 288 1 0 ) ) +) + } + } +// brush 25 +{ +( 280 -144 408 ) ( 280 -144 504 ) ( 280 -48 504 ) eden/edenmetalwall 8 24 0.00 1 1 0 0 0 +( 280 -48 496 ) ( 232 -64 496 ) ( 232 -64 408 ) eden/edenmetalwall -216 24 0.00 1 1 0 0 0 +( 232 -64 496 ) ( 232 -128 496 ) ( 232 -128 408 ) eden/edenmetalwall 8 24 0.00 1 1 0 0 0 +( 280 -144 408 ) ( 232 -128 408 ) ( 232 -128 496 ) eden/edenmetalwall -216 24 0.00 1 1 0 0 0 +( 224 -48 496 ) ( 288 -48 496 ) ( 288 -144 496 ) eden/edenmetalwall -200 8 0.00 1 1 0 0 0 +( 288 -144 408 ) ( 288 -48 408 ) ( 224 -48 408 ) eden/edenmetalwall 64 193 -180.00 1 1 0 0 0 +} +// brush 26 +{ +( 208 24 504 ) ( 112 24 504 ) ( 112 24 408 ) eden/edenmetalwall -72 24 0.00 1 1 0 0 0 +( 192 -24 408 ) ( 192 -24 496 ) ( 208 24 496 ) eden/edenmetalwall -120 24 0.00 1 1 0 0 0 +( 128 -24 408 ) ( 128 -24 496 ) ( 192 -24 496 ) eden/edenmetalwall -72 24 0.00 1 1 0 0 0 +( 128 -24 496 ) ( 128 -24 408 ) ( 112 24 408 ) eden/edenmetalwall -120 24 0.00 1 1 0 0 0 +( 112 32 496 ) ( 208 32 496 ) ( 208 -32 496 ) eden/edenmetalwall -88 104 0.00 1 1 0 0 0 +( 208 -32 408 ) ( 208 32 408 ) ( 112 32 408 ) eden/edenmetalwall -192 -47 90.00 1 1 0 0 0 +} +// brush 27 +{ +( 40 -48 408 ) ( 112 24 408 ) ( 112 24 496 ) eden/edenmetalwall -160 0 0.00 1 1 0 0 0 +( 40 -48 496 ) ( 88 -64 496 ) ( 88 -64 408 ) eden/edenmetalwall -16 0 0.00 1 1 0 0 0 +( 88 -64 496 ) ( 128 -24 496 ) ( 128 -24 408 ) eden/edenmetalwall -160 0 0.00 1 1 0 0 0 +( 112 24 408 ) ( 128 -24 408 ) ( 128 -24 496 ) eden/edenmetalwall -160 0 0.00 1 1 0 0 0 +( 40 -48 496 ) ( 80 0 496 ) ( 128 -16 496 ) eden/edenmetalwall -16 160 0.00 1 1 0 0 0 +( 88 -64 408 ) ( 128 -16 408 ) ( 80 0 408 ) eden/edenmetalwall -16 160 0.00 1 1 0 0 0 +} +// brush 28 +{ +( 208 24 496 ) ( 208 24 408 ) ( 280 -48 408 ) eden/edenmetalwall -160 0 0.00 1 1 0 0 0 +( 232 -64 408 ) ( 232 -64 496 ) ( 280 -48 496 ) eden/edenmetalwall -160 0 0.00 1 1 0 0 0 +( 192 -24 408 ) ( 192 -24 496 ) ( 232 -64 496 ) eden/edenmetalwall -160 0 0.00 1 1 0 0 0 +( 192 -24 496 ) ( 192 -24 408 ) ( 208 24 408 ) eden/edenmetalwall -160 0 0.00 1 1 0 0 0 +( 192 -16 496 ) ( 240 0 496 ) ( 280 -48 496 ) eden/edenmetalwall -160 160 0.00 1 1 0 0 0 +( 240 0 408 ) ( 192 -16 408 ) ( 232 -64 408 ) eden/edenmetalwall -160 160 0.00 1 1 0 0 0 +} +// brush 29 +{ +( 232 -128 408 ) ( 192 -176 408 ) ( 240 -192 408 ) eden/edenmetalwall -160 0 0.00 1 1 0 0 0 +( 280 -144 496 ) ( 240 -192 496 ) ( 192 -176 496 ) eden/edenmetalwall -160 0 0.00 1 1 0 0 0 +( 208 -216 408 ) ( 192 -168 408 ) ( 192 -168 496 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +( 232 -128 496 ) ( 192 -168 496 ) ( 192 -168 408 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +( 280 -144 496 ) ( 232 -128 496 ) ( 232 -128 408 ) eden/edenmetalwall -160 0 0.00 1 1 0 0 0 +( 280 -144 408 ) ( 208 -216 408 ) ( 208 -216 496 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +} +// brush 30 +{ +( 112 -224 408 ) ( 208 -224 408 ) ( 208 -160 408 ) eden/edenmetalwall 0 -47 90.00 1 1 0 0 0 +( 208 -160 496 ) ( 208 -224 496 ) ( 112 -224 496 ) eden/edenmetalwall -88 -88 0.00 1 1 0 0 0 +( 112 -216 408 ) ( 128 -168 408 ) ( 128 -168 496 ) eden/edenmetalwall 72 24 0.00 1 1 0 0 0 +( 192 -168 496 ) ( 128 -168 496 ) ( 128 -168 408 ) eden/edenmetalwall -72 24 0.00 1 1 0 0 0 +( 208 -216 496 ) ( 192 -168 496 ) ( 192 -168 408 ) eden/edenmetalwall 72 24 0.00 1 1 0 0 0 +( 112 -216 408 ) ( 112 -216 504 ) ( 208 -216 504 ) eden/edenmetalwall -72 24 0.00 1 1 0 0 0 +} +// brush 31 +{ +( 112 -216 496 ) ( 112 -216 408 ) ( 40 -144 408 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +( 88 -128 408 ) ( 88 -128 496 ) ( 40 -144 496 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +( 128 -168 408 ) ( 128 -168 496 ) ( 88 -128 496 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +( 128 -168 496 ) ( 128 -168 408 ) ( 112 -216 408 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +( 128 -176 496 ) ( 80 -192 496 ) ( 40 -143.999954 496 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +( 80 -192 408 ) ( 128 -176 408 ) ( 88 -127.999954 408 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +} +// brush 32 +{ +( 96 -48 408 ) ( 32 -48 408 ) ( 32 -144 408 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +( 32 -144 496 ) ( 32 -48 496 ) ( 96 -48 496 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +( 88 -128 496 ) ( 88 -128 408 ) ( 40 -144 408 ) eden/edenmetalwall 0 24 0.00 1 1 0 0 0 +( 88 -128 408 ) ( 88 -128 496 ) ( 88 -64 496 ) eden/edenmetalwall 0 24 0.00 1 1 0 0 0 +( 88 -64 408 ) ( 88 -64 496 ) ( 40 -48 496 ) eden/edenmetalwall 0 24 0.00 1 1 0 0 0 +( 40 -48 504 ) ( 40 -144 504 ) ( 40 -144 408 ) eden/edenmetalwall 0 24 0.00 1 1 0 0 0 +} +// brush 33 + { + patchDef2 + { + eden/edenmetalwall + ( 3 3 0 536870912 0 ) +( +( ( 32 -96 400 0 0 ) ( 16 -240 400 0 0.093750 ) ( 160 -224 400 0 0.187500 ) ) +( ( 64 -96 400 0.156250 0 ) ( 72 -184 400 0.156250 0.093750 ) ( 160 -200 400 0.156250 0.187500 ) ) +( ( 96 -96 400 0.312500 0 ) ( 96 -160 400 0.312500 0.093750 ) ( 160 -160 400 0.312500 0.187500 ) ) +) + } + } +// brush 34 + { + patchDef2 + { + eden/edenmetalwall + ( 3 3 0 536870912 0 ) +( +( ( 160 -224 400 0 0.187500 ) ( 304 -240 400 0 0.093750 ) ( 288 -96 400 0 0 ) ) +( ( 160 -200 400 0.156250 0.187500 ) ( 248 -184 400 0.156250 0.093750 ) ( 256 -96 400 0.156250 0 ) ) +( ( 160 -160 400 0.312500 0.187500 ) ( 224 -160 400 0.312500 0.093750 ) ( 224 -96 400 0.312500 0 ) ) +) + } + } +// brush 35 + { + patchDef2 + { + eden/edenmetalwall + ( 3 3 0 536870912 0 ) +( +( ( 288 -96 400 0 0 ) ( 304 48 400 0 0.093750 ) ( 160 32 400 0 0.187500 ) ) +( ( 256 -96 400 0.156250 0 ) ( 248 -8 400 0.156250 0.093750 ) ( 160 8 400 0.156250 0.187500 ) ) +( ( 224 -96 400 0.312500 0 ) ( 224 -32 400 0.312500 0.093750 ) ( 160 -32 400 0.312500 0.187500 ) ) +) + } + } +// brush 36 + { + patchDef2 + { + eden/edenmetalwall + ( 3 3 0 536870912 0 ) +( +( ( 160 32 400 0 0.187500 ) ( 16 48 400 0 0.093750 ) ( 32 -96 400 0 0 ) ) +( ( 160 8 400 0.156250 0.187500 ) ( 72 -8 400 0.156250 0.093750 ) ( 64 -96 400 0.156250 0 ) ) +( ( 160 -32 400 0.312500 0.187500 ) ( 96 -32 400 0.312500 0.093750 ) ( 96 -96 400 0.312500 0 ) ) +) + } + } +// brush 37 + { + patchDef2 + { + eden/edenmetalwall + ( 9 3 0 536870912 0 ) +( +( ( 95.999992 -96.000008 496 0 0.375000 ) ( 95.999992 -96.000008 448 0 0.187500 ) ( 95.999992 -96.000008 400 0 0 ) ) +( ( 96 -160 496 0.125000 0.375000 ) ( 96 -160 448 0.125000 0.187500 ) ( 96 -160 400 0.125000 0 ) ) +( ( 160 -159.999969 496 0.250000 0.375000 ) ( 160 -159.999969 448 0.250000 0.187500 ) ( 160 -159.999969 400 0.250000 0 ) ) +( ( 224 -160 496 0.375000 0.375000 ) ( 224 -160 448 0.375000 0.187500 ) ( 224 -160 400 0.375000 0 ) ) +( ( 223.999969 -96.000008 496 0.500000 0.375000 ) ( 223.999969 -96.000008 448 0.500000 0.187500 ) ( 223.999969 -96.000008 400 0.500000 0 ) ) +( ( 224 -31.999996 496 0.625000 0.375000 ) ( 224 -31.999996 448 0.625000 0.187500 ) ( 224 -31.999996 400 0.625000 0 ) ) +( ( 160 -32 496 0.750000 0.375000 ) ( 160 -32 448 0.750000 0.187500 ) ( 160 -32 400 0.750000 0 ) ) +( ( 96 -31.999996 496 0.875000 0.375000 ) ( 96 -31.999996 448 0.875000 0.187500 ) ( 96 -31.999996 400 0.875000 0 ) ) +( ( 95.999992 -96.000008 496 1 0.375000 ) ( 95.999992 -96.000008 448 1 0.187500 ) ( 95.999992 -96.000008 400 1 0 ) ) +) + } + } +// brush 38 + { + patchDef2 + { + eden/edenmetalwall + ( 9 3 0 536870912 0 subdivisions 90.501022 ) +( +( ( 160 576 288 0 0 ) ( 160 576 496 0 0.812500 ) ( 160 32 496 0 3.437500 ) ) +( ( 128 576 288 0.125000 0 ) ( 128 576 496 0.125000 0.812500 ) ( 128 32 496 0.125000 3.437500 ) ) +( ( 128 544 288 0.250000 0 ) ( 128 544 464 0.250000 0.812500 ) ( 128 32 464 0.250000 3.437500 ) ) +( ( 128 512 288 0.375000 0 ) ( 128 512 432 0.375000 0.812500 ) ( 128 32 432 0.375000 3.437500 ) ) +( ( 160 512 288 0.500000 0 ) ( 160 512 432 0.500000 0.812500 ) ( 160 32 432 0.500000 3.437500 ) ) +( ( 192 512 288 0.625000 0 ) ( 192 512 432 0.625000 0.812500 ) ( 192 32 432 0.625000 3.437500 ) ) +( ( 192 544 288 0.750000 0 ) ( 192 544 464 0.750000 0.812500 ) ( 192 32 464 0.750000 3.437500 ) ) +( ( 192 576 288 0.875000 0 ) ( 192 576 496 0.875000 0.812500 ) ( 192 32 496 0.875000 3.437500 ) ) +( ( 160 576 288 1 0 ) ( 160 576 496 1 0.812500 ) ( 160 32 496 1 3.437500 ) ) +) + } + } +// brush 39 + { + patchDef2 + { + eden/edenmetalwall + ( 9 3 0 536870912 0 subdivisions 91.251312 ) +( +( ( 160 -224 496 0 3.437500 ) ( 160 -768 496 0 0.812500 ) ( 160 -768 288 0 0 ) ) +( ( 128 -224 496 0.125000 3.437500 ) ( 128 -768 496 0.125000 0.812500 ) ( 128 -768 288 0.125000 0 ) ) +( ( 128 -224 464 0.250000 3.437500 ) ( 128 -736 464 0.250000 0.812500 ) ( 128 -736 288 0.250000 0 ) ) +( ( 128 -224 432 0.375000 3.437500 ) ( 128 -704 432 0.375000 0.812500 ) ( 128 -704 288 0.375000 0 ) ) +( ( 160 -224 432 0.500000 3.437500 ) ( 160 -704 432 0.500000 0.812500 ) ( 160 -704 288 0.500000 0 ) ) +( ( 192 -224 432 0.625000 3.437500 ) ( 192 -704 432 0.625000 0.812500 ) ( 192 -704 288 0.625000 0 ) ) +( ( 192 -224 464 0.750000 3.437500 ) ( 192 -736 464 0.750000 0.812500 ) ( 192 -736 288 0.750000 0 ) ) +( ( 192 -224 496 0.875000 3.437500 ) ( 192 -768 496 0.875000 0.812500 ) ( 192 -768 288 0.875000 0 ) ) +( ( 160 -224 496 1 3.437500 ) ( 160 -768 496 1 0.812500 ) ( 160 -768 288 1 0 ) ) +) + } + } +// brush 40 + { + patchDef2 + { + eden/edenmetalwall + ( 9 3 0 536870912 0 subdivisions 90.458153 ) +( +( ( 288 -96 496 0 3.437500 ) ( 832 -96 496 0 0.812500 ) ( 832 -96 288 0 0 ) ) +( ( 288 -128 496 0.125000 3.437500 ) ( 832 -128 496 0.125000 0.812500 ) ( 832 -128 288 0.125000 0 ) ) +( ( 288 -128 464 0.250000 3.437500 ) ( 800 -128 464 0.250000 0.812500 ) ( 800 -128 288 0.250000 0 ) ) +( ( 288 -128 432 0.375000 3.437500 ) ( 768 -128 432 0.375000 0.812500 ) ( 768 -128 288 0.375000 0 ) ) +( ( 288 -96 432 0.500000 3.437500 ) ( 768 -96 432 0.500000 0.812500 ) ( 768 -96 288 0.500000 0 ) ) +( ( 288 -64 432 0.625000 3.437500 ) ( 768 -64 432 0.625000 0.812500 ) ( 768 -64 288 0.625000 0 ) ) +( ( 288 -64 464 0.750000 3.437500 ) ( 800 -64 464 0.750000 0.812500 ) ( 800 -64 288 0.750000 0 ) ) +( ( 288 -64 496 0.875000 3.437500 ) ( 832 -64 496 0.875000 0.812500 ) ( 832 -64 288 0.875000 0 ) ) +( ( 288 -96 496 1 3.437500 ) ( 832 -96 496 1 0.812500 ) ( 832 -96 288 1 0 ) ) +) + } + } +// brush 41 + { + patchDef2 + { + eden/edenmetalwall + ( 9 3 0 536870912 0 subdivisions 91.251312 ) +( +( ( -512 -96 288 0 0 ) ( -512 -96 496 0 0.812500 ) ( 32 -96 496 0 3.437500 ) ) +( ( -512 -128 288 0.125000 0 ) ( -512 -128 496 0.125000 0.812500 ) ( 32 -128 496 0.125000 3.437500 ) ) +( ( -480 -128 288 0.250000 0 ) ( -480 -128 464 0.250000 0.812500 ) ( 32 -128 464 0.250000 3.437500 ) ) +( ( -448 -128 288 0.375000 0 ) ( -448 -128 432 0.375000 0.812500 ) ( 32 -128 432 0.375000 3.437500 ) ) +( ( -448 -96 288 0.500000 0 ) ( -448 -96 432 0.500000 0.812500 ) ( 32 -96 432 0.500000 3.437500 ) ) +( ( -448 -64 288 0.625000 0 ) ( -448 -64 432 0.625000 0.812500 ) ( 32 -64 432 0.625000 3.437500 ) ) +( ( -480 -64 288 0.750000 0 ) ( -480 -64 464 0.750000 0.812500 ) ( 32 -64 464 0.750000 3.437500 ) ) +( ( -512 -64 288 0.875000 0 ) ( -512 -64 496 0.875000 0.812500 ) ( 32 -64 496 0.875000 3.437500 ) ) +( ( -512 -96 288 1 0 ) ( -512 -96 496 1 0.812500 ) ( 32 -96 496 1 3.437500 ) ) +) + } + } +// brush 42 +{ +( 8 -576 -128 ) ( -8 -576 -128 ) ( -8 -584 -128 ) eden/genmetal 24 0 0.00 1 1 0 0 0 +( -8 -584 8 ) ( -8 -576 8 ) ( 8 -576 8 ) eden/genmetal 24 0 0.00 1 1 0 0 0 +( -8 -584 8 ) ( 8 -584 8 ) ( 8 -584 -128 ) eden/genmetal 24 0 0.00 1 1 0 0 0 +( 8 -584 8 ) ( 8 -576 8 ) ( 8 -576 -128 ) eden/genmetal 24 0 0.00 1 1 0 0 0 +( 8 -576 8 ) ( -8 -576 8 ) ( -8 -576 -128 ) eden/genmetal 24 0 0.00 1 1 0 0 0 +( -8 -576 8 ) ( -8 -584 8 ) ( -8 -584 -128 ) eden/genmetal 24 0 0.00 1 1 0 0 0 +} +// brush 43 +{ +( 0 -352 8 ) ( 0 -776 8 ) ( 0 -776 -128 ) eden/genmetal 32 0 0.00 1 1 0 0 0 +( 8 -344 8 ) ( -120 -344 8 ) ( -120 -344 -128 ) eden/genmetal 32 0 0.00 1 1 0 0 0 +( 8 -768 8 ) ( 8 -344 8 ) ( 8 -344 -128 ) eden/genmetal 32 0 0.00 1 1 0 0 0 +( 8 -344 -128 ) ( -120 -344 -128 ) ( -120 -768 -128 ) eden/genmetal 32 0 0.00 1 1 0 0 0 +( -120 -576 8 ) ( -120 -344 -112 ) ( 8 -460 -52 ) eden/genmetal 32 0 0.00 1 1 0 0 0 +( 8 -576 -128 ) ( 0 -576 -128 ) ( 4 -576 8 ) eden/genmetal 32 0 0.00 1 1 0 0 0 +} +// brush 44 +{ +( 0 328 0 ) ( -8 328 0 ) ( -8 224 0 ) eden/genmetal 24 0 0.00 1 1 0 0 0 +( -8 224 8 ) ( -8 328 8 ) ( 0 328 8 ) eden/genmetal 24 0 0.00 1 1 0 0 0 +( -16 -576 8 ) ( -8 -576 8 ) ( -8 -576 -128 ) eden/genmetal 24 0 0.00 1 1 0 0 0 +( 0 224 8 ) ( 0 328 8 ) ( 0 328 -128 ) eden/genmetal 24 0 0.00 1 1 0 0 0 +( 0 328 8 ) ( -8 328 8 ) ( -8 328 -128 ) eden/genmetal 24 0 0.00 1 1 0 0 0 +( -8 120 8 ) ( -8 16 8 ) ( -8 16 -128 ) eden/genmetal 24 0 0.00 1 1 0 0 0 +} +// brush 45 +{ +( 8 0 -120 ) ( 0 0 -120 ) ( 0 320 8 ) eden/genmetal 24 0 0.00 1 1 0 0 0 +( 0 0 -128 ) ( 8 0 -128 ) ( 8 512 -128 ) eden/genmetal 24 0 0.00 1 1 0 0 0 +( 8 320 8 ) ( 0 320 8 ) ( 0 512 8 ) eden/genmetal 24 0 0.00 1 1 0 0 0 +( 0 -8 -112 ) ( 0 -8 -128 ) ( 0 512 -128 ) eden/genmetal 32 0 0.00 1 1 0 0 0 +( 8 0 -128 ) ( 0 0 -128 ) ( 0 0 -120 ) eden/genmetal 24 0 0.00 1 1 0 0 0 +( 8 -8 -128 ) ( 8 -8 -112 ) ( 8 312 8 ) eden/genmetal 32 0 0.00 1 1 0 0 0 +( 0 328 -128 ) ( 8 328 -128 ) ( 4 328 8 ) eden/genmetal 32 0 0.00 1 1 0 0 0 +} +// brush 46 +{ +( -544 192 496 ) ( -544 -352 496 ) ( -544 -352 240 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( -512 192 496 ) ( -544 192 496 ) ( -544 192 240 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( -512 -384 496 ) ( -512 160 496 ) ( -512 160 240 ) eden/TR_church2_fx 0 0 0.00 1 1 0 0 0 +( -544 -384 496 ) ( -512 -384 496 ) ( -512 -384 240 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( -544 -352 496 ) ( -544 192 496 ) ( -512 192 496 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( -512 192 288 ) ( -544 192 288 ) ( -544 -352 288 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +} +// brush 47 +{ +( 832 192 544 ) ( 832 -352 544 ) ( 832 -352 288 ) eden/TR_church2_fx 0 0 0.00 1 1 0 0 0 +( 864 192 496 ) ( 832 192 496 ) ( 832 192 240 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( 864 -384 496 ) ( 864 160 496 ) ( 864 160 240 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( 832 -384 496 ) ( 864 -384 496 ) ( 864 -384 240 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( 832 -352 496 ) ( 832 192 496 ) ( 864 192 496 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( 864 192 288 ) ( 832 192 288 ) ( 832 -352 288 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +} +// brush 48 +{ +( 448 -800 288 ) ( 448 -768 288 ) ( -96 -768 288 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( -96 -768 496 ) ( 448 -768 496 ) ( 448 -800 496 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( -128 -768 544 ) ( -128 -800 544 ) ( -128 -800 288 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( -128 -800 496 ) ( 416 -800 496 ) ( 416 -800 240 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( 448 -800 544 ) ( 448 -768 544 ) ( 448 -768 288 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( 448 -768 496 ) ( -96 -768 496 ) ( -96 -768 240 ) eden/TR_church2_fx 0 0 0.00 1 1 0 0 0 +} +// brush 49 +{ +( 448 576 288 ) ( 448 608 288 ) ( -96 608 288 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( -96 608 496 ) ( 448 608 496 ) ( 448 576 496 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( -128 608 544 ) ( -128 576 544 ) ( -128 576 288 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( -128 576 496 ) ( 416 576 496 ) ( 416 576 240 ) eden/TR_church2_fx 0 0 0.00 1 1 0 0 0 +( 448 576 544 ) ( 448 608 544 ) ( 448 608 288 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( 448 608 496 ) ( -96 608 496 ) ( -96 608 240 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +} +// brush 50 +{ +( 448 -768 544 ) ( 448 -800 544 ) ( 448 -800 288 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( 832 -384 240 ) ( 832 -384 496 ) ( 448 -768 496 ) eden/TR_church2_fx 0 0 0.00 1 1 0 0 0 +( 864 -384 240 ) ( 864 -384 496 ) ( 832 -384 496 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( 864 -384 496 ) ( 864 -384 240 ) ( 448 -800 240 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( 832 -384 496 ) ( 832 -416 496 ) ( 448 -800 496 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( 832 -416 288 ) ( 832 -384 288 ) ( 448 -768 288 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +} +// brush 51 +{ +( -128 -800 288 ) ( -128 -800 544 ) ( -128 -768 544 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( -128 -768 496 ) ( -512 -384 496 ) ( -512 -384 240 ) eden/TR_church2_fx 0 0 0.00 1 1 0 0 0 +( -512 -384 496 ) ( -544 -384 496 ) ( -544 -384 240 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( -128 -800 240 ) ( -544 -384 240 ) ( -544 -384 496 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( -128 -800 496 ) ( -512 -416 496 ) ( -512 -384 496 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( -128 -768 288 ) ( -512 -384 288 ) ( -512 -416 288 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +} +// brush 52 +{ +( -512 224 288 ) ( -512 192 288 ) ( -128 576 288 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( -512 192 496 ) ( -512 224 496 ) ( -128 608 496 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( -544 192 496 ) ( -544 192 240 ) ( -128 608 240 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( -544 192 240 ) ( -544 192 496 ) ( -512 192 496 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( -512 192 240 ) ( -512 192 496 ) ( -128 576 496 ) eden/TR_church2_fx 0 0 0.00 1 1 0 0 0 +( -128 576 544 ) ( -128 608 544 ) ( -128 608 288 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +} +// brush 53 +{ +( 448 576 288 ) ( 832 192 288 ) ( 832 224 288 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( 448 608 496 ) ( 832 224 496 ) ( 832 192 496 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( 448 608 240 ) ( 864 192 240 ) ( 864 192 496 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( 832 192 496 ) ( 864 192 496 ) ( 864 192 240 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( 448 576 496 ) ( 832 192 496 ) ( 832 192 240 ) eden/TR_church2_fx 0 0 0.00 1 1 0 0 0 +( 448 608 288 ) ( 448 608 544 ) ( 448 576 544 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +} +// brush 54 +{ +( -512 192 496 ) ( -496 208 496 ) ( -504 200 512 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( 832 -384 480 ) ( 800 -416 480 ) ( 816 -400 736 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( 832 576 736 ) ( -544 576 736 ) ( -544 576 480 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( 832 -768 736 ) ( 832 640 736 ) ( 832 640 480 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( -544 -768 736 ) ( 832 -768 736 ) ( 832 -768 480 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( -544 -768 512 ) ( -544 640 512 ) ( 832 640 512 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( 832 640 496 ) ( -544 640 496 ) ( -544 -768 496 ) eden/TR_church2_fx 0 0 0.00 1 1 0 0 0 +( 448 576 480 ) ( 480 544 480 ) ( 464 560 736 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( -512 352 480 ) ( -512 432 480 ) ( -512 392 512 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +( -128 -768 496 ) ( -144 -752 496 ) ( -136 -760 512 ) sky/cliffsky 0 0 0.00 1 1 0 0 0 +} +// brush 55 +{ +( 624 -384.000244 256 ) ( 600 192.000046 256 ) ( 576 -384.000244 256 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -448 -352 400 ) ( -448 -352 384 ) ( -512 -384 384 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -448 -352 384 ) ( -448 -352 400 ) ( -448 160 400 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -448 160 384 ) ( -448 160 400 ) ( -512 192 400 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -512 192 384 ) ( -512 -384 384 ) ( -512 -384 352 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( 544 -384.000244 288 ) ( 576 192.000046 288 ) ( 608 -384.000244 288 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +} +// brush 56 +{ +( 624 -767.999939 256 ) ( 600 -351.999878 256 ) ( 576 -767.999939 256 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -128 -768 400 ) ( -128 -768 384 ) ( -512 -384.000427 384 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -448 -352 384 ) ( -448 -352 400 ) ( -512 -384 400 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -448 -352 400 ) ( -448 -352 384 ) ( -96 -704 384 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -96 -704 224 ) ( -96 -704 208 ) ( -128 -768 208 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( 544 -767.999939 288 ) ( 576 -351.999878 288 ) ( 608 -767.999939 288 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +} +// brush 57 +{ +( -128 -768 352 ) ( -128 -768 384 ) ( 448 -768 384 ) eden/genmetal 32 0 0.00 1 1 0 0 0 +( 416 -704 96 ) ( 416 -704 80 ) ( 448 -768 80 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -96 -704 400 ) ( -96 -704 384 ) ( 416 -704 384 ) eden/genmetal 32 0 0.00 1 1 0 0 0 +( -96 -704 208 ) ( -96 -704 224 ) ( -128 -768 224 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -128 -768 256 ) ( 448 -768 256 ) ( 448 -704 256 ) eden/genmetal 0 -64 90.00 1 1 0 0 0 +( 544 -768 288 ) ( 576 -704 288 ) ( 608 -768 288 ) eden/genmetal 0 -64 90.00 1 1 0 0 0 +} +// brush 58 +{ +( 768 -320 256 ) ( 384 -704 256 ) ( 448 -768 256 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( 416 -704 80 ) ( 416 -704 96 ) ( 448 -768 96 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( 416 -704 96 ) ( 416 -704 80 ) ( 768 -352 80 ) eden/genmetal -32 0 0.00 1 1 0 0 0 +( 768 -352 224 ) ( 768 -352 208 ) ( 832 -384 208 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( 832 -384 384 ) ( 448 -768 384 ) ( 448 -768 400 ) eden/genmetal -32 0 0.00 1 1 0 0 0 +( 544 -768.000061 288 ) ( 576 -352 288 ) ( 608 -768.000061 288 ) eden/genmetal -32 0 0.00 1 1 0 0 0 +} +// brush 59 +{ +( 832 -384 352 ) ( 832 -384 384 ) ( 832 192 384 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( 768 160 96 ) ( 768 160 80 ) ( 832 192 80 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( 768 -352 272 ) ( 768 -352 256 ) ( 768 160 256 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( 768 -352 208 ) ( 768 -352 224 ) ( 832 -384 224 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( 832 -384 256 ) ( 832 192 256 ) ( 768 192 256 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( 544 -384 288 ) ( 576 192.000504 288 ) ( 608 -384 288 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +} +// brush 60 +{ +( 448 576 400 ) ( 448 576 384 ) ( 832 192 384 ) eden/genmetal -64 0 0.00 1 1 0 0 0 +( 768 160 80 ) ( 768 160 96 ) ( 832 192 96 ) eden/genmetal -32 0 0.00 1 1 0 0 0 +( 768 160 272 ) ( 768 160 256 ) ( 416 512 256 ) eden/genmetal -64 0 0.00 1 1 0 0 0 +( 416 512 96 ) ( 416 512 80 ) ( 448 576 80 ) eden/genmetal -32 0 0.00 1 1 0 0 0 +( 448 576 256 ) ( 384 512 256 ) ( 768 128 256 ) eden/genmetal 0 32 0.00 1 1 0 0 0 +( 544 159.999893 288 ) ( 576 576 288 ) ( 608 159.999893 288 ) eden/genmetal 0 32 0.00 1 1 0 0 0 +} +// brush 61 +{ +( 448 576 208 ) ( -128 576 208 ) ( -128 576 176 ) eden/genmetal 32 0 0.00 1 1 0 0 0 +( 416 512 80 ) ( 416 512 96 ) ( 448 576 96 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( 416 512 400 ) ( 416 512 384 ) ( -96 512 384 ) eden/genmetal 32 0 0.00 1 1 0 0 0 +( -96 512 224 ) ( -96 512 208 ) ( -128 576 208 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( 448 512 256 ) ( 448 576 256 ) ( -128 576 256 ) eden/genmetal 0 -64 90.00 1 1 0 0 0 +( 544 512 288 ) ( 576 576 288 ) ( 608 512 288 ) eden/genmetal 0 -64 90.00 1 1 0 0 0 +} +// brush 62 +{ +( 624 159.999817 256 ) ( 600 576 256 ) ( 576 159.999817 256 ) eden/genmetal 0 32 0.00 1 1 0 0 0 +( -96 512 208 ) ( -96 512 224 ) ( -128 576 224 ) eden/genmetal -32 0 0.00 1 1 0 0 0 +( -448 160 384 ) ( -448 160 400 ) ( -96 512 400 ) eden/genmetal -64 0 0.00 1 1 0 0 0 +( -448 160 400 ) ( -448 160 384 ) ( -512 192 384 ) eden/genmetal -32 0 0.00 1 1 0 0 0 +( -512 192 384 ) ( -128 576 384 ) ( -128 576 400 ) eden/genmetal -64 0 0.00 1 1 0 0 0 +( 544 159.999817 288 ) ( 576 576 288 ) ( 608 159.999817 288 ) eden/genmetal -64 0 0.00 1 1 0 0 0 +} +// brush 63 +{ +( 320 192 0 ) ( 320 64 0 ) ( 320 64 -128 ) eden/edentable 64 0 0.00 -1 1 0 0 0 +( 448 192 0 ) ( 320 192 0 ) ( 320 192 -128 ) eden/edentable 64 0 0.00 -1 1 0 0 0 +( 448 64 0 ) ( 448 192 0 ) ( 448 192 -128 ) eden/edentable 64 0 0.00 -1 1 0 0 0 +( 320 64 0 ) ( 448 64 0 ) ( 448 64 -128 ) eden/edentable 64 0 0.00 -1 1 0 0 0 +( 320 64 0 ) ( 320 192 0 ) ( 448 192 0 ) eden/edentable 64 64 0.00 -1 1 0 0 0 +( 448 192 -128 ) ( 320 192 -128 ) ( 320 64 -128 ) eden/edentable 64 64 0.00 -1 1 0 0 0 +} +// brush 64 +{ +( 136 -8 -128 ) ( 136 -8 -112 ) ( 136 312 8 ) eden/genmetal 32 0 0.00 1 1 0 0 0 +( 136 0 -128 ) ( 128 0 -128 ) ( 128 0 -120 ) eden/genmetal 24 0 0.00 1 1 0 0 0 +( 128 -8 -112 ) ( 128 -8 -128 ) ( 128 512 -128 ) eden/genmetal 32 0 0.00 1 1 0 0 0 +( 256 512 8 ) ( 128 512 8 ) ( 128 512 -128 ) eden/genmetal 24 0 0.00 1 1 0 0 0 +( 136 320 8 ) ( 128 320 8 ) ( 128 512 8 ) eden/genmetal 24 0 0.00 1 1 0 0 0 +( 128 0 -128 ) ( 136 0 -128 ) ( 136 512 -128 ) eden/genmetal 24 0 0.00 1 1 0 0 0 +( 136 0 -120 ) ( 128 0 -120 ) ( 128 320 8 ) eden/genmetal 24 0 0.00 1 1 0 0 0 +} +// brush 65 +{ +( 128 -352 8 ) ( 128 -776 8 ) ( 128 -776 -128 ) eden/genmetal 32 0 0.00 1 1 0 0 0 +( 136 -344 8 ) ( 8 -344 8 ) ( 8 -344 -128 ) eden/genmetal 32 0 0.00 1 1 0 0 0 +( 136 -768 8 ) ( 136 -344 8 ) ( 136 -344 -128 ) eden/genmetal 32 0 0.00 1 1 0 0 0 +( 8 -768 8 ) ( 136 -768 8 ) ( 136 -768 -128 ) eden/genmetal 32 0 0.00 1 1 0 0 0 +( 8 -768 8 ) ( 8 -344 8 ) ( 136 -344 8 ) eden/genmetal 32 0 0.00 1 1 0 0 0 +( 136 -344 -128 ) ( 8 -344 -128 ) ( 8 -768 -128 ) eden/genmetal 32 0 0.00 1 1 0 0 0 +( 8 -576 8 ) ( 8 -344 -112 ) ( 136 -460 -52 ) eden/genmetal 32 0 0.00 1 1 0 0 0 +} +// brush 66 +{ +( 0 -352 -96 ) ( 0 -384 -96 ) ( 0 -384 -224 ) eden/FL_edenhouse3 -64 -96 0.00 1 1 0 0 0 +( 128 -352 -96 ) ( 0 -352 -96 ) ( 0 -352 -224 ) eden/FL_edenhouse2 0 -96 0.00 1 1 0 0 0 +( 128 -384 -96 ) ( 128 -352 -96 ) ( 128 -352 -224 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +( 0 -384 -96 ) ( 128 -384 -96 ) ( 128 -384 -224 ) eden/FL_edenhouse3 0 -96 0.00 1 1 0 0 0 +( 0 -384 -112 ) ( 0 -352 -112 ) ( 128 -352 -112 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 0 -304 -128 ) ( 0 -384 -128 ) ( 128 -344 -128 ) eden/FL_edenhouse3 0 64 0.00 1 1 0 0 0 +} +// brush 67 +{ +( 0 -416 -96 ) ( 0 -384 -96 ) ( 128 -384 -96 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 0 -416 -48 ) ( 128 -416 -48 ) ( 128 -416 -176 ) eden/FL_edenhouse3 0 -48 0.00 1 1 0 0 0 +( 128 -416 -48 ) ( 128 -384 -48 ) ( 128 -384 -176 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +( 128 -384 -48 ) ( 0 -384 -48 ) ( 0 -384 -176 ) eden/FL_edenhouse2 0 -48 0.00 1 1 0 0 0 +( 0 -384 -48 ) ( 0 -416 -48 ) ( 0 -416 -176 ) eden/FL_edenhouse3 -32 -48 0.00 1 1 0 0 0 +( 112 -416 -128 ) ( 80 -384 -128 ) ( 48 -416 -128 ) eden/FL_edenhouse3 -32 -48 0.00 1 1 0 0 0 +} +// brush 68 +{ +( 112 -448 -128 ) ( 80 -416 -128 ) ( 48 -448 -128 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 0 -448 -80 ) ( 0 -416 -80 ) ( 128 -416 -80 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 0 -448 -48 ) ( 128 -448 -48 ) ( 128 -448 -176 ) eden/FL_edenhouse3 0 -48 0.00 1 1 0 0 0 +( 128 -448 -48 ) ( 128 -416 -48 ) ( 128 -416 -176 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +( 128 -416 -48 ) ( 0 -416 -48 ) ( 0 -416 -176 ) eden/FL_edenhouse2 0 -48 0.00 1 1 0 0 0 +( 0 -416 -48 ) ( 0 -448 -48 ) ( 0 -448 -176 ) eden/FL_edenhouse3 0 -48 0.00 1 1 0 0 0 +} +// brush 69 +{ +( 0 -480 -64 ) ( 0 -448 -64 ) ( 128 -448 -64 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 0 -480 -48 ) ( 128 -480 -48 ) ( 128 -480 -176 ) eden/FL_edenhouse3 0 -48 0.00 1 1 0 0 0 +( 128 -480 -48 ) ( 128 -448 -48 ) ( 128 -448 -176 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +( 128 -448 -48 ) ( 0 -448 -48 ) ( 0 -448 -176 ) eden/FL_edenhouse2 0 -48 0.00 1 1 0 0 0 +( 0 -448 -48 ) ( 0 -480 -48 ) ( 0 -480 -176 ) eden/FL_edenhouse3 -96 -48 0.00 1 1 0 0 0 +( 112 -480 -128 ) ( 80 -448 -128 ) ( 48 -480 -128 ) eden/FL_edenhouse3 -96 -48 0.00 1 1 0 0 0 +} +// brush 70 +{ +( 0 -480 0 ) ( 0 -512 0 ) ( 0 -512 -128 ) eden/FL_edenhouse3 -64 0 0.00 1 1 0 0 0 +( 128 -480 0 ) ( 0 -480 0 ) ( 0 -480 -128 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +( 128 -512 0 ) ( 128 -480 0 ) ( 128 -480 -128 ) eden/FL_edenhouse2 -64 0 0.00 1 1 0 0 0 +( 0 -512 0 ) ( 128 -512 0 ) ( 128 -512 -128 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 0 -512 -48 ) ( 0 -480 -48 ) ( 128 -480 -48 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 128 -480 -128 ) ( 0 -480 -128 ) ( 0 -512 -128 ) eden/FL_edenhouse3 0 64 0.00 1 1 0 0 0 +} +// brush 71 +{ +( 128 -512 -128 ) ( 0 -512 -128 ) ( 0 -544 -128 ) eden/FL_edenhouse3 0 32 0.00 1 1 0 0 0 +( 0 -544 -32 ) ( 0 -512 -32 ) ( 128 -512 -32 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 0 -544 0 ) ( 128 -544 0 ) ( 128 -544 -128 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 128 -544 0 ) ( 128 -512 0 ) ( 128 -512 -128 ) eden/FL_edenhouse2 -32 0 0.00 1 1 0 0 0 +( 128 -512 0 ) ( 0 -512 0 ) ( 0 -512 -128 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +( 0 -512 0 ) ( 0 -544 0 ) ( 0 -544 -128 ) eden/FL_edenhouse3 -32 0 0.00 1 1 0 0 0 +} +// brush 72 +{ +( 0 -544 0 ) ( 0 -576 0 ) ( 0 -576 -128 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 128 -544 0 ) ( 0 -544 0 ) ( 0 -544 -128 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +( 128 -576 0 ) ( 128 -544 0 ) ( 128 -544 -128 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +( 0 -576 0 ) ( 128 -576 0 ) ( 128 -576 -128 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 0 -576 -16 ) ( 0 -544 -16 ) ( 128 -544 -16 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 128 -544 -128 ) ( 0 -544 -128 ) ( 0 -576 -128 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +} +// brush 73 +{ +( 128 -512 -128 ) ( 0 -512 -128 ) ( 0 -704 -128 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 0 -704 0 ) ( 0 -512 0 ) ( 128 -512 0 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 0 -704 0 ) ( 128 -704 0 ) ( 128 -704 -128 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +( 128 -704 0 ) ( 128 -512 0 ) ( 128 -512 -128 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +( 144 -576 0 ) ( 16 -576 0 ) ( 16 -576 -128 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +( 0 -512 0 ) ( 0 -704 0 ) ( 0 -704 -128 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +} +// brush 74 +{ +( 144 0 -128 ) ( 96 320 -128 ) ( 48 0 -128 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +( 128 0 -128 ) ( 0 0 -128 ) ( 0 320 0 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 128 0 -256 ) ( 128 0 -128 ) ( 128 320 0 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +( 128 320 0 ) ( 0 320 0 ) ( 0 320 -128 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +( 0 0 -128 ) ( 0 0 -256 ) ( 0 320 -128 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +} +// brush 75 +{ +( 0 512 0 ) ( 0 320 0 ) ( 0 320 -128 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 128 512 0 ) ( 0 512 0 ) ( 0 512 -128 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 128 320 0 ) ( 128 512 0 ) ( 128 512 -128 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +( 0 320 0 ) ( 128 320 0 ) ( 128 320 -128 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +( 0 320 0 ) ( 0 512 0 ) ( 128 512 0 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 128 512 -128 ) ( 0 512 -128 ) ( 0 320 -128 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +} +// brush 76 +{ +( 832 -384 -160 ) ( 800 -416 -160 ) ( 816 -400 96 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 832 576 96 ) ( -544 576 96 ) ( -544 576 -160 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 832 -768 96 ) ( 832 640 96 ) ( 832 640 -160 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( -544 -768 96 ) ( 832 -768 96 ) ( 832 -768 -160 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( -544 -768 -128 ) ( -544 640 -128 ) ( 832 640 -128 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 832 640 -160 ) ( -544 640 -160 ) ( -544 -768 -160 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 448 576 -160 ) ( 480 544 -160 ) ( 464 560 96 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 0 336 -160 ) ( 0 416 -160 ) ( 0 376 -128 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +} +// brush 77 +{ +( -512 192 -32 ) ( -480 224 -32 ) ( -496 208 224 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( -512 640 224 ) ( -512 -768 224 ) ( -512 -768 -32 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 832 576 224 ) ( -544 576 224 ) ( -544 576 -32 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( -544 -768 224 ) ( 832 -768 224 ) ( 832 -768 -32 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( -544 -768 0 ) ( -544 640 0 ) ( 832 640 0 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 832 640 -128 ) ( -544 640 -128 ) ( -544 -768 -128 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( -128 -768 -32 ) ( -160 -736 -32 ) ( -144 -752 224 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 0 416 -32 ) ( 0 336 -32 ) ( 0 376 0 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +} +// brush 78 +{ +( -512 192 0 ) ( -128 576 0 ) ( -128 576 16 ) eden/genmetal -64 0 0.00 1 1 0 0 0 +( -448 160 16 ) ( -448 160 0 ) ( -512 192 0 ) eden/genmetal -32 0 0.00 1 1 0 0 0 +( -448 160 0 ) ( -448 160 16 ) ( -96 512 16 ) eden/genmetal -64 0 0.00 1 1 0 0 0 +( -96 512 0 ) ( -96 512 16 ) ( -128 576 16 ) eden/genmetal -32 0 0.00 1 1 0 0 0 +( -448 128 0 ) ( -64 512 0 ) ( -128 576 0 ) eden/genmetal 0 32 0.00 1 1 0 0 0 +( -432 159.999817 8 ) ( -420 576 8 ) ( -408 159.999817 8 ) eden/genmetal 0 32 0.00 1 1 0 0 0 +} +// brush 79 +{ +( 448 512 -128 ) ( 448 576 -128 ) ( -128 576 -128 ) eden/genmetal 0 -64 90.00 1 1 0 0 0 +( -128 576 8 ) ( 448 576 8 ) ( 448 512 8 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -96 512 16 ) ( -96 512 0 ) ( -128 576 0 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( 416 512 16 ) ( 416 512 0 ) ( -96 512 0 ) eden/genmetal 32 0 0.00 1 1 0 0 0 +( 416 512 -128 ) ( 416 512 -112 ) ( 448 576 -112 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( 448 576 0 ) ( -128 576 0 ) ( -128 576 -32 ) eden/genmetal 32 0 0.00 1 1 0 0 0 +} +// brush 80 +{ +( -432 159.999832 8 ) ( -420 576.000183 8 ) ( -408 159.999832 8 ) eden/genmetal 0 32 0.00 1 1 0 0 0 +( 448 576 -128 ) ( 384 512 -128 ) ( 768 128 -128 ) eden/genmetal 0 32 0.00 1 1 0 0 0 +( 416 512 -112 ) ( 416 512 -128 ) ( 448 576 -128 ) eden/genmetal -32 0 0.00 1 1 0 0 0 +( 768 160 -112 ) ( 768 160 -128 ) ( 416 512 -128 ) eden/genmetal -64 0 0.00 1 1 0 0 0 +( 768 160 -128 ) ( 768 160 -112 ) ( 832 192 -112 ) eden/genmetal -32 0 0.00 1 1 0 0 0 +( 448 576 16 ) ( 448 576 0 ) ( 832 192 0 ) eden/genmetal -64 0 0.00 1 1 0 0 0 +} +// brush 81 +{ +( 832 -384 -128 ) ( 832 192 -128 ) ( 768 192 -128 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( 768 192 8 ) ( 832 192 8 ) ( 832 -384 8 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( 768 -352 0 ) ( 768 -352 16 ) ( 832 -384 16 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( 768 -352 -112 ) ( 768 -352 -128 ) ( 768 160 -128 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( 768 160 -112 ) ( 768 160 -128 ) ( 832 192 -128 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( 832 -384 -32 ) ( 832 -384 0 ) ( 832 192 0 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +} +// brush 82 +{ +( -432 -768.000244 8 ) ( -420 -351.999817 8 ) ( -408 -768.000244 8 ) eden/genmetal -32 0 0.00 1 1 0 0 0 +( 832 -384 0 ) ( 448 -768 0 ) ( 448 -768 16 ) eden/genmetal -32 0 0.00 1 1 0 0 0 +( 768 -352 16 ) ( 768 -352 0 ) ( 832 -384 0 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( 416 -704 -112 ) ( 416 -704 -128 ) ( 768 -352 -128 ) eden/genmetal -32 0 0.00 1 1 0 0 0 +( 416 -704 -128 ) ( 416 -704 -112 ) ( 448 -768 -112 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( 768 -320 -128 ) ( 384 -704 -128 ) ( 448 -768 -128 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +} +// brush 83 +{ +( -128 -768 -128 ) ( 448 -768 -128 ) ( 448 -704 -128 ) eden/genmetal 0 -64 90.00 1 1 0 0 0 +( 448 -704 8 ) ( 448 -768 8 ) ( -128 -768 8 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -96 -704 0 ) ( -96 -704 16 ) ( -128 -768 16 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -96 -704 16 ) ( -96 -704 0 ) ( 416 -704 0 ) eden/genmetal 32 0 0.00 1 1 0 0 0 +( 416 -704 -112 ) ( 416 -704 -128 ) ( 448 -768 -128 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -128 -768 -32 ) ( -128 -768 0 ) ( 448 -768 0 ) eden/genmetal 32 0 0.00 1 1 0 0 0 +} +// brush 84 +{ +( -128 -768 0 ) ( -64 -704 0 ) ( -448 -320.000427 0 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -96 -704 16 ) ( -96 -704 0 ) ( -128 -768 0 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -448 -352 16 ) ( -448 -352 0 ) ( -96 -704 0 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -448 -352 0 ) ( -448 -352 16 ) ( -512 -384 16 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -128 -768 16 ) ( -128 -768 0 ) ( -512 -384.000427 0 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -432 -767.999939 8 ) ( -420 -351.999878 8 ) ( -408 -767.999939 8 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +} +// brush 85 +{ +( -512 192 0 ) ( -512 -384 0 ) ( -512 -384 -32 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -448 160 0 ) ( -448 160 16 ) ( -512 192 16 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -448 -352 0 ) ( -448 -352 16 ) ( -448 160 16 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -448 -352 16 ) ( -448 -352 0 ) ( -512 -384 0 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -512 -384 8 ) ( -512 192 8 ) ( -448 192 8 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +( -448 192 0 ) ( -512 192 0 ) ( -512 -384 0 ) eden/genmetal 0 0 0.00 1 1 0 0 0 +} +// brush 86 +{ +( 448 576 0 ) ( 832 192 0 ) ( 832 224 0 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +( 448 608 256 ) ( 832 224 256 ) ( 832 192 256 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +( 448 608 0 ) ( 864 192 0 ) ( 864 192 256 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +( 832 192 256 ) ( 864 192 256 ) ( 864 192 0 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +( 448 576 256 ) ( 832 192 256 ) ( 832 192 0 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +( 448 608 0 ) ( 448 608 256 ) ( 448 576 256 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +} +// brush 87 +{ +( -512 224 0 ) ( -512 192 0 ) ( -128 576 0 ) eden/WL_edentown2 -64 0 0.00 1 1 0 0 0 +( -512 192 256 ) ( -512 224 256 ) ( -128 608 256 ) eden/WL_edentown2 -64 0 0.00 1 1 0 0 0 +( -544 192 256 ) ( -544 192 0 ) ( -128 608 0 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +( -544 192 0 ) ( -544 192 256 ) ( -512 192 256 ) eden/WL_edentown2 -64 0 0.00 1 1 0 0 0 +( -512 192 0 ) ( -512 192 256 ) ( -128 576 256 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +( -128 576 256 ) ( -128 608 256 ) ( -128 608 0 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +} +// brush 88 +{ +( -128 -800 0 ) ( -128 -800 256 ) ( -128 -768 256 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +( -128 -768 256 ) ( -512 -384 256 ) ( -512 -384 0 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +( -512 -384 256 ) ( -544 -384 256 ) ( -544 -384 0 ) eden/WL_edentown2 -64 0 0.00 1 1 0 0 0 +( -128 -800 0 ) ( -544 -384 0 ) ( -544 -384 256 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +( -128 -800 256 ) ( -512 -416 256 ) ( -512 -384 256 ) eden/WL_edentown2 -64 0 0.00 1 1 0 0 0 +( -128 -768 0 ) ( -512 -384 0 ) ( -512 -416 0 ) eden/WL_edentown2 -64 0 0.00 1 1 0 0 0 +} +// brush 89 +{ +( 448 -768 256 ) ( 448 -800 256 ) ( 448 -800 0 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +( 832 -384 0 ) ( 832 -384 256 ) ( 448 -768 256 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +( 864 -384 0 ) ( 864 -384 256 ) ( 832 -384 256 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +( 864 -384 256 ) ( 864 -384 0 ) ( 448 -800 0 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +( 832 -384 256 ) ( 832 -416 256 ) ( 448 -800 256 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +( 832 -416 0 ) ( 832 -384 0 ) ( 448 -768 0 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +} +// brush 90 +{ +( 448 576 0 ) ( 448 608 0 ) ( -96 608 0 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +( -96 608 256 ) ( 448 608 256 ) ( 448 576 256 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +( -128 608 256 ) ( -128 576 256 ) ( -128 576 0 ) eden/WL_edentown2 -64 0 0.00 1 1 0 0 0 +( -128 576 256 ) ( 416 576 256 ) ( 416 576 0 ) eden/WL_edentown2 64 0 0.00 1 1 0 0 0 +( 448 576 256 ) ( 448 608 256 ) ( 448 608 0 ) eden/WL_edentown2 -64 0 0.00 1 1 0 0 0 +( 448 608 256 ) ( -96 608 256 ) ( -96 608 0 ) eden/WL_edentown2 64 0 -180.00 1 -1 0 0 0 +} +// brush 91 +{ +( 448 -800 0 ) ( 448 -768 0 ) ( -96 -768 0 ) eden/WL_edentown2 32 0 0.00 1 1 0 0 0 +( -96 -768 256 ) ( 448 -768 256 ) ( 448 -800 256 ) eden/WL_edentown2 32 0 0.00 1 1 0 0 0 +( -128 -768 256 ) ( -128 -800 256 ) ( -128 -800 0 ) eden/WL_edentown2 -32 0 0.00 1 1 0 0 0 +( -128 -800 256 ) ( 416 -800 256 ) ( 416 -800 0 ) eden/WL_edentown2 64 0 0.00 1 1 0 0 0 +( 448 -800 256 ) ( 448 -768 256 ) ( 448 -768 0 ) eden/WL_edentown2 -32 0 0.00 1 1 0 0 0 +( 448 -768 256 ) ( -96 -768 256 ) ( -96 -768 0 ) eden/WL_edentown2 63 0 -180.00 1 -1 0 0 0 +} +// brush 92 +{ +( 832 192 256 ) ( 832 -352 256 ) ( 832 -352 0 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +( 864 192 256 ) ( 832 192 256 ) ( 832 192 0 ) eden/WL_edentown2 -96 0 0.00 1 1 0 0 0 +( 864 -384 256 ) ( 864 160 256 ) ( 864 160 0 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +( 832 -384 256 ) ( 864 -384 256 ) ( 864 -384 0 ) eden/WL_edentown2 -96 0 0.00 1 1 0 0 0 +( 832 -352 256 ) ( 832 192 256 ) ( 864 192 256 ) eden/WL_edentown2 -96 0 0.00 1 1 0 0 0 +( 864 192 0 ) ( 832 192 0 ) ( 832 -352 0 ) eden/WL_edentown2 -96 0 0.00 1 1 0 0 0 +} +// brush 93 +{ +( -544 192 256 ) ( -544 -352 256 ) ( -544 -352 0 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +( -512 192 256 ) ( -544 192 256 ) ( -544 192 0 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +( -512 -384 256 ) ( -512 160 256 ) ( -512 160 0 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +( -544 -384 256 ) ( -512 -384 256 ) ( -512 -384 0 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +( -544 -352 256 ) ( -544 192 256 ) ( -512 192 256 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +( -512 192 0 ) ( -544 192 0 ) ( -544 -352 0 ) eden/WL_edentown2 0 0 0.00 1 1 0 0 0 +} +} +// entity 1 +{ +"classname" "Enemies_DarkCreeper" +"scale" "1.0" +"model" "creeper.tik" +"targetname" "creeper1" +"origin" "-312.00 -80.00 0.00" +} +// entity 2 +{ +"origin" "-500 -96 200" +"_color" "0.710744 0.987603 1.000000" +"classname" "light" +} +// entity 3 +{ +"classname" "info_pathnode" +"origin" "184 424 -128" +} +// entity 4 +{ +"classname" "info_player_start" +"angle" "135" +"origin" "496 128 -128" +} +// entity 5 +{ +"classname" "func_group" +"type" "patchCapped" +// brush 0 + { + patchDef2 + { + eden/edenmetalwall + ( 9 3 0 536870912 0 ) +( +( ( 32 -96 400 0 0 ) ( 32 -96 448 0 0.406250 ) ( 32 -96 496 0 0.812500 ) ) +( ( 16 -240 400 0.500000 0 ) ( 16 -240 448 0.500000 0.406250 ) ( 16 -240 496 0.500000 0.812500 ) ) +( ( 160 -224 400 1 0 ) ( 160 -224 448 1 0.406250 ) ( 160 -224 496 1 0.812500 ) ) +( ( 304 -240 400 1.500000 0 ) ( 304 -240 448 1.500000 0.406250 ) ( 304 -240 496 1.500000 0.812500 ) ) +( ( 288 -96 400 2 0 ) ( 288 -96 448 2 0.406250 ) ( 288 -96 496 2 0.812500 ) ) +( ( 304 48 400 2.500000 0 ) ( 304 48 448 2.500000 0.406250 ) ( 304 48 496 2.500000 0.812500 ) ) +( ( 160 32 400 3 0 ) ( 160 32 448 3 0.406250 ) ( 160 32 496 3 0.812500 ) ) +( ( 16 48 400 3.500000 0 ) ( 16 48 448 3.500000 0.406250 ) ( 16 48 496 3.500000 0.812500 ) ) +( ( 32 -96 400 4 0 ) ( 32 -96 448 4 0.406250 ) ( 32 -96 496 4 0.812500 ) ) +) + } + } +} +// entity 6 +{ +"origin" "360 424 -128" +"classname" "info_pathnode" +} +// entity 7 +{ +"origin" "184 232 -128" +"classname" "info_pathnode" +} +// entity 8 +{ +"classname" "info_pathnode" +"origin" "360 232 -128" +} +// entity 9 +{ +"origin" "184 72 -128" +"classname" "info_pathnode" +} +// entity 10 +{ +"classname" "info_pathnode" +"origin" "184 -120 -128" +} +// entity 11 +{ +"origin" "360 -120 -128" +"classname" "info_pathnode" +} +// entity 12 +{ +"classname" "info_pathnode" +"origin" "184 -280 -128" +} +// entity 13 +{ +"origin" "360 -280 -128" +"classname" "info_pathnode" +} +// entity 14 +{ +"origin" "184 -472 -128" +"classname" "info_pathnode" +} +// entity 15 +{ +"classname" "info_pathnode" +"origin" "360 -472 -128" +} +// entity 16 +{ +"origin" "184 -632 -128" +"classname" "info_pathnode" +} +// entity 17 +{ +"classname" "info_pathnode" +"origin" "360 -632 -128" +} +// entity 18 +{ +"classname" "info_pathnode" +"origin" "536 -120 -128" +} +// entity 19 +{ +"origin" "536 -312 -128" +"classname" "info_pathnode" +} +// entity 20 +{ +"origin" "536 -472 -128" +"classname" "info_pathnode" +} +// entity 21 +{ +"origin" "696 88 -128" +"classname" "info_pathnode" +} +// entity 22 +{ +"origin" "696 -72 -128" +"classname" "info_pathnode" +} +// entity 23 +{ +"classname" "info_pathnode" +"origin" "696 -264 -128" +} +// entity 24 +{ +"origin" "536 232 -128" +"classname" "info_pathnode" +} +// entity 25 +{ +"origin" "536 40 -128" +"classname" "info_pathnode" +} +// entity 26 +{ +"origin" "72 -280 -128" +"classname" "info_pathnode" +} +// entity 27 +{ +"classname" "info_pathnode" +"origin" "72 -56 -128" +} +// entity 28 +{ +"classname" "info_pathnode" +"origin" "72 -344 -112" +} +// entity 29 +{ +"origin" "72 -408 -80" +"classname" "info_pathnode" +} +// entity 30 +{ +"classname" "info_pathnode" +"origin" "72 -472 -48" +} +// entity 31 +{ +"origin" "72 -536 -16" +"classname" "info_pathnode" +} +// entity 32 +{ +"classname" "info_pathnode" +"origin" "72 -568 0" +} +// entity 33 +{ +"origin" "72 -696 0" +"classname" "info_pathnode" +} +// entity 34 +{ +"classname" "info_pathnode" +"origin" "-56 -664 0" +} +// entity 35 +{ +"origin" "72 -24 -128" +"classname" "info_pathnode" +} +// entity 36 +{ +"classname" "info_pathnode" +"origin" "72 72 -80" +} +// entity 37 +{ +"origin" "72 312 0" +"classname" "info_pathnode" +} +// entity 38 +{ +"classname" "info_pathnode" +"origin" "72 440 0" +} +// entity 39 +{ +"origin" "-88 440 0" +"classname" "info_pathnode" +} +// entity 40 +{ +"origin" "-88 -376 0" +"classname" "info_pathnode" +} +// entity 41 +{ +"origin" "-88 -536 0" +"classname" "info_pathnode" +"targetname" "patrol1" +} +// entity 42 +{ +"origin" "-88 328 0" +"classname" "info_pathnode" +"targetname" "patrol2" +} +// entity 43 +{ +"origin" "-88 168 0" +"classname" "info_pathnode" +} +// entity 44 +{ +"classname" "info_pathnode" +"origin" "-88 -24 0" +} +// entity 45 +{ +"classname" "info_pathnode" +"origin" "-88 -184 0" +} +// entity 46 +{ +"classname" "info_pathnode" +"origin" "-248 -376 0" +} +// entity 47 +{ +"classname" "info_pathnode" +"origin" "-216 -504 0" +} +// entity 48 +{ +"classname" "info_pathnode" +"origin" "-248 264 0" +} +// entity 49 +{ +"classname" "info_pathnode" +"origin" "-248 168 0" +} +// entity 50 +{ +"origin" "-248 -24 0" +"classname" "info_pathnode" +} +// entity 51 +{ +"origin" "-248 -184 0" +"classname" "info_pathnode" +} +// entity 52 +{ +"origin" "-408 -312 0" +"classname" "info_pathnode" +} +// entity 53 +{ +"origin" "-408 104 0" +"classname" "info_pathnode" +} +// entity 54 +{ +"classname" "info_pathnode" +"origin" "-408 -24 0" +} +// entity 55 +{ +"classname" "info_pathnode" +"origin" "-408 -184 0" +} +// entity 56 +{ +"classname" "info_pathnode" +"origin" "360 8 -128" +} +// entity 57 +{ +"origin" "72 168 -48" +"classname" "info_pathnode" +} +// entity 58 +{ +"classname" "info_pathnode" +"origin" "72 256 -16" +} +// entity 59 +{ +"classname" "light" +"_color" "0.710744 0.987603 1.000000" +"origin" "-500 -96 112" +} +// entity 60 +{ +"classname" "light" +"_color" "0.710744 0.987603 1.000000" +"origin" "820 -96 200" +} +// entity 61 +{ +"origin" "820 -96 112" +"_color" "0.710744 0.987603 1.000000" +"classname" "light" +} +// entity 62 +{ +"classname" "light" +"_color" "0.710744 0.987603 1.000000" +"origin" "160 564 200" +} +// entity 63 +{ +"origin" "160 564 112" +"_color" "0.710744 0.987603 1.000000" +"classname" "light" +} +// entity 64 +{ +"origin" "160 -756 200" +"_color" "0.710744 0.987603 1.000000" +"classname" "light" +} +// entity 65 +{ +"classname" "light" +"_color" "0.710744 0.987603 1.000000" +"origin" "160 -756 112" +} +// entity 66 +{ +"classname" "light" +"_color" "1.000000 1.000000 1.000000" +"origin" "-308 112 424" +} +// entity 67 +{ +"origin" "-4 352 424" +"_color" "1.000000 1.000000 1.000000" +"classname" "light" +} +// entity 68 +{ +"classname" "light" +"_color" "1.000000 1.000000 1.000000" +"origin" "348 352 424" +} +// entity 69 +{ +"origin" "620 80 424" +"_color" "1.000000 1.000000 1.000000" +"classname" "light" +} +// entity 70 +{ +"classname" "light" +"_color" "1.000000 1.000000 1.000000" +"origin" "636 -288 424" +} +// entity 71 +{ +"origin" "348 -576 424" +"_color" "1.000000 1.000000 1.000000" +"classname" "light" +} +// entity 72 +{ +"classname" "light" +"_color" "1.000000 1.000000 1.000000" +"origin" "-20 -560 424" +} +// entity 73 +{ +"origin" "-276 -256 424" +"_color" "1.000000 1.000000 1.000000" +"classname" "light" +} +// entity 74 +{ +"classname" "light" +"_color" "1.000000 1.000000 1.000000" +"origin" "164 -96 424" +} +// entity 75 +{ +"classname" "info_pathnode" +"origin" "616 184 -128" +} +// entity 76 +{ +"origin" "632 -376 -128" +"classname" "info_pathnode" +} +// entity 77 +{ +"origin" "456 344 -128" +"classname" "info_pathnode" +} +// entity 78 +{ +"classname" "info_pathnode" +"origin" "488 -552 -128" +} diff --git a/fakk/maps/example/patrol.prt b/fakk/maps/example/patrol.prt new file mode 100644 index 0000000..1133044 --- /dev/null +++ b/fakk/maps/example/patrol.prt @@ -0,0 +1,538 @@ +PRT1 +74 +187 +347 +4 0 59 0 (0 24 496 ) (0 576 496 ) (0 576 408 ) (0 24 408 ) +5 0 3 0 (0 576 408 ) (448 576 408 ) (832 192 408 ) (832 24 408 ) (0 24 408 ) +4 0 2 0 (208 24 408 ) (832 24 408 ) (832 24 496 ) (208 24 496 ) +4 0 1 0 (0 24 408 ) (112 24 408 ) (112 24 496 ) (0 24 496 ) +4 1 59 0 (0 0 408 ) (0 0 496 ) (0 24 496 ) (0 24 408 ) +4 1 27 0 (40 0 408 ) (88 0 408 ) (88 0 496 ) (40 0 496 ) +4 1 30 0 (0 0 496 ) (0 0 408 ) (40 0 408 ) (40 0 496 ) +4 1 3 0 (88 0 408 ) (0 0 408 ) (0 24 408 ) (112 24 408 ) +4 2 23 0 (232 0 408 ) (280 0 408 ) (280 0 496 ) (232 0 496 ) +4 2 21 0 (280 0 408 ) (832 0 408 ) (832 0 496 ) (280 0 496 ) +4 2 3 0 (832 24 408 ) (832 0 408 ) (232 0 408 ) (208 24 408 ) +4 3 59 0 (0 0 288 ) (0 0 408 ) (0 576 408 ) (0 576 288 ) +4 3 31 0 (0 0 408 ) (0 0 288 ) (832 0 288 ) (832 0 408 ) +5 3 4 0 (768 0 288 ) (0 0 288 ) (0 512 288 ) (416 512 288 ) (768 160 288 ) +4 4 60 0 (0 0 256 ) (0 0 288 ) (0 512 288 ) (0 512 256 ) +4 4 32 0 (0 0 288 ) (0 0 256 ) (768 0 256 ) (768 0 288 ) +5 4 10 0 (768 0 256 ) (0 0 256 ) (0 512 256 ) (416 512 256 ) (768 160 256 ) +4 5 61 0 (0 568 256 ) (0 576 256 ) (0 576 240 ) (0 568 240 ) +4 5 10 0 (456 568 256 ) (0 568 256 ) (0 568 240 ) (456 568 240 ) +4 5 8 0 (136 568 240 ) (0 568 240 ) (0 576 240 ) (136 576 240 ) +4 5 6 0 (456 568 240 ) (184 568 240 ) (184 576 240 ) (448 576 240 ) +4 6 10 0 (456 568 240 ) (184 568 240 ) (184 568 64 ) (456 568 64 ) +4 6 9 0 (456 568 64 ) (184 568 64 ) (184 576 64 ) (448 576 64 ) +4 7 10 0 (152 568 224 ) (152 568 80 ) (168 568 80 ) (168 568 224 ) +4 8 61 0 (0 576 240 ) (0 576 64 ) (0 568 64 ) (0 568 240 ) +4 8 10 0 (136 568 240 ) (0 568 240 ) (0 568 64 ) (136 568 64 ) +4 8 9 0 (136 568 64 ) (0 568 64 ) (0 576 64 ) (136 576 64 ) +4 9 61 0 (0 576 64 ) (0 576 8 ) (0 568 8 ) (0 568 64 ) +4 9 10 0 (0 568 8 ) (456 568 8 ) (456 568 64 ) (0 568 64 ) +4 10 61 0 (0 0 8 ) (0 0 256 ) (0 568 256 ) (0 568 8 ) +4 10 38 0 (0 0 240 ) (0 0 8 ) (824 0 8 ) (824 0 240 ) +4 10 37 0 (824 0 8 ) (832 0 8 ) (832 0 64 ) (824 0 64 ) +4 10 34 0 (832 0 64 ) (832 0 240 ) (824 0 240 ) (824 0 64 ) +4 10 33 0 (0 0 256 ) (0 0 240 ) (832 0 240 ) (832 0 256 ) +4 10 19 0 (8 328 8 ) (128 328 8 ) (128 320 8 ) (8 320 8 ) +4 10 18 0 (0 328 8 ) (0 512 8 ) (128 512 8 ) (128 328 8 ) +4 10 17 0 (128 0 8 ) (0 0 8 ) (0 320 8 ) (128 320 8 ) +4 10 16 0 (136 0 8 ) (128 0 8 ) (128 320 8 ) (136 320 8 ) +4 10 15 0 (320 0 8 ) (136 0 8 ) (136 512 8 ) (320 512 8 ) +5 10 11 0 (320 64 8 ) (320 512 8 ) (416 512 8 ) (768 160 8 ) (768 64 8 ) +4 10 14 0 (768 0 8 ) (320 0 8 ) (320 64 8 ) (768 64 8 ) +4 11 15 0 (320 512 8 ) (320 512 0 ) (320 64 0 ) (320 64 8 ) +5 11 13 0 (768 64 0 ) (448 64 0 ) (448 192 0 ) (736 192 0 ) (768 160 0 ) +4 11 12 0 (320 192 0 ) (320 512 0 ) (416 512 0 ) (736 192 0 ) +4 11 14 0 (320 64 8 ) (320 64 0 ) (768 64 0 ) (768 64 8 ) +4 12 15 0 (320 512 0 ) (320 512 -128 ) (320 192 -128 ) (320 192 0 ) +4 12 13 0 (736 192 -128 ) (736 192 0 ) (448 192 0 ) (448 192 -128 ) +4 13 14 0 (448 64 -128 ) (768 64 -128 ) (768 64 0 ) (448 64 0 ) +4 14 43 0 (320 0 -128 ) (768 0 -128 ) (768 0 8 ) (320 0 8 ) +4 14 15 0 (320 64 -128 ) (320 0 -128 ) (320 0 8 ) (320 64 8 ) +4 15 43 0 (136 0 -128 ) (320 0 -128 ) (320 0 8 ) (136 0 8 ) +3 15 16 0 (136 0 -120 ) (136 0 8 ) (136 320 8 ) +4 16 43 0 (136 0 -120 ) (136 0 8 ) (128 0 8 ) (128 0 -120 ) +3 16 17 0 (128 0 -120 ) (128 0 8 ) (128 320 8 ) +4 17 55 0 (0 0 8 ) (0 0 -120 ) (8 0 -120 ) (8 0 8 ) +4 17 43 0 (8 0 -120 ) (128 0 -120 ) (128 0 8 ) (8 0 8 ) +4 17 20 0 (128 300 0 ) (128 0 -120 ) (8 0 -120 ) (8 300 0 ) +4 17 19 0 (8 320 8 ) (128 320 8 ) (128 300 0 ) (8 300 0 ) +4 18 62 0 (0 328 8 ) (0 512 8 ) (0 512 0 ) (0 328 0 ) +4 18 19 0 (8 328 0 ) (128 328 0 ) (128 328 8 ) (8 328 8 ) +4 19 20 0 (128 300 0 ) (8 300 0 ) (8 320 0 ) (128 320 0 ) +4 20 43 0 (8 0 -128 ) (128 0 -128 ) (128 0 -120 ) (8 0 -120 ) +5 21 31 0 (280 0 408 ) (832 0 408 ) (832 -384 408 ) (448 -768 408 ) (280 -768 408 ) +4 21 23 0 (280 0 408 ) (280 -48 408 ) (280 -48 496 ) (280 0 496 ) +4 21 22 0 (280 -144 408 ) (280 -216 408 ) (280 -216 496 ) (280 -144 496 ) +4 21 29 0 (280 -216 408 ) (280 -768 408 ) (280 -768 496 ) (280 -216 496 ) +4 22 31 0 (280 -144 408 ) (280 -216 408 ) (232 -216 408 ) (232 -192 408 ) +4 22 25 0 (232 -192 408 ) (232 -216 408 ) (232 -216 496 ) (232 -192 496 ) +4 22 29 0 (232 -216 408 ) (280 -216 408 ) (280 -216 496 ) (232 -216 496 ) +3 23 31 0 (232 0 408 ) (280 0 408 ) (280 -48 408 ) +8 24 31 0 (232 -64 408 ) (232 -128 408 ) (192 -168 408 ) (128 -168 408 ) (88 -128 408 ) (88 -64 408 ) (128 -24 408 ) (192 -24 408 ) +3 25 31 0 (232 -192 408 ) (232 -216 408 ) (208 -216 408 ) +4 25 29 0 (208 -216 408 ) (232 -216 408 ) (232 -216 496 ) (208 -216 496 ) +3 26 31 0 (112 -216 408 ) (88 -216 408 ) (88 -192 408 ) +4 26 28 0 (88 -192 408 ) (88 -216 408 ) (88 -216 496 ) (88 -192 496 ) +4 26 29 0 (88 -216 408 ) (112 -216 408 ) (112 -216 496 ) (88 -216 496 ) +3 27 31 0 (40 0 408 ) (88 0 408 ) (40 -48 408 ) +4 27 30 0 (40 0 408 ) (40 -48 408 ) (40 -48 496 ) (40 0 496 ) +4 28 31 0 (88 -192 408 ) (88 -216 408 ) (40 -216 408 ) (40 -144 408 ) +4 28 29 0 (40 -216 496 ) (40 -216 408 ) (88 -216 408 ) (88 -216 496 ) +4 28 30 0 (40 -144 408 ) (40 -216 408 ) (40 -216 496 ) (40 -144 496 ) +4 29 31 0 (280 -216 408 ) (280 -768 408 ) (40 -768 408 ) (40 -216 408 ) +4 29 30 0 (40 -216 408 ) (40 -768 408 ) (40 -768 496 ) (40 -216 496 ) +4 30 64 0 (0 -768 496 ) (0 0 496 ) (0 0 408 ) (0 -768 408 ) +4 30 31 0 (0 -768 408 ) (0 0 408 ) (40 0 408 ) (40 -768 408 ) +4 31 64 0 (0 -768 408 ) (0 0 408 ) (0 0 288 ) (0 -768 288 ) +5 31 32 0 (0 -704 288 ) (0 0 288 ) (768 0 288 ) (768 -352 288 ) (416 -704 288 ) +4 32 65 0 (0 -704 288 ) (0 0 288 ) (0 0 256 ) (0 -704 256 ) +5 32 33 0 (0 -704 256 ) (0 0 256 ) (768 0 256 ) (768 -352 256 ) (416 -704 256 ) +4 33 66 0 (0 -768 256 ) (0 0 256 ) (0 0 240 ) (0 -768 240 ) +4 33 39 0 (184 -760 240 ) (456 -760 240 ) (448 -768 240 ) (184 -768 240 ) +4 33 41 0 (0 -768 240 ) (0 -760 240 ) (136 -760 240 ) (136 -768 240 ) +5 33 38 0 (0 -760 240 ) (0 0 240 ) (824 0 240 ) (824 -392 240 ) (456 -760 240 ) +4 33 36 0 (832 -120 240 ) (832 -384 240 ) (824 -392 240 ) (824 -120 240 ) +4 33 34 0 (824 0 240 ) (832 0 240 ) (832 -72 240 ) (824 -72 240 ) +4 34 38 0 (824 -72 240 ) (824 0 240 ) (824 0 64 ) (824 -72 64 ) +4 34 37 0 (824 -72 64 ) (824 0 64 ) (832 0 64 ) (832 -72 64 ) +4 35 38 0 (824 -88 224 ) (824 -88 80 ) (824 -104 80 ) (824 -104 224 ) +4 36 38 0 (824 -392 240 ) (824 -120 240 ) (824 -120 64 ) (824 -392 64 ) +4 36 37 0 (824 -392 64 ) (824 -120 64 ) (832 -120 64 ) (832 -384 64 ) +4 37 38 0 (824 0 8 ) (824 -392 8 ) (824 -392 64 ) (824 0 64 ) +4 38 66 0 (0 -760 240 ) (0 0 240 ) (0 0 8 ) (0 -760 8 ) +4 38 58 0 (0 -704 8 ) (0 -584 8 ) (8 -584 8 ) (8 -704 8 ) +4 38 56 0 (0 -576 8 ) (0 -344 8 ) (8 -344 8 ) (8 -576 8 ) +4 38 55 0 (0 -344 8 ) (0 0 8 ) (8 0 8 ) (8 -344 8 ) +4 38 53 0 (128 -704 8 ) (8 -704 8 ) (8 -576 8 ) (128 -576 8 ) +4 38 51 0 (8 -576 8 ) (8 -544 8 ) (128 -544 8 ) (128 -576 8 ) +4 38 49 0 (8 -544 8 ) (8 -512 8 ) (128 -512 8 ) (128 -544 8 ) +4 38 47 0 (8 -512 8 ) (8 -480 8 ) (128 -480 8 ) (128 -512 8 ) +4 38 46 0 (8 -480 8 ) (8 -344 8 ) (128 -344 8 ) (128 -480 8 ) +4 38 45 0 (128 -576 8 ) (128 -344 8 ) (136 -344 8 ) (136 -576 8 ) +5 38 44 0 (768 -344 8 ) (768 -352 8 ) (416 -704 8 ) (136 -704 8 ) (136 -344 8 ) +4 38 43 0 (8 0 8 ) (768 0 8 ) (768 -344 8 ) (8 -344 8 ) +4 38 42 0 (0 -760 8 ) (456 -760 8 ) (456 -760 64 ) (0 -760 64 ) +4 38 40 0 (152 -760 224 ) (152 -760 80 ) (168 -760 80 ) (168 -760 224 ) +4 38 39 0 (456 -760 64 ) (456 -760 240 ) (184 -760 240 ) (184 -760 64 ) +4 38 41 0 (136 -760 240 ) (0 -760 240 ) (0 -760 64 ) (136 -760 64 ) +4 39 42 0 (448 -768 64 ) (184 -768 64 ) (184 -760 64 ) (456 -760 64 ) +4 41 66 0 (0 -768 240 ) (0 -760 240 ) (0 -760 64 ) (0 -768 64 ) +4 41 42 0 (136 -768 64 ) (0 -768 64 ) (0 -760 64 ) (136 -760 64 ) +4 42 66 0 (0 -760 64 ) (0 -760 8 ) (0 -768 8 ) (0 -768 64 ) +4 43 55 0 (8 0 -128 ) (8 -344 -128 ) (8 -344 8 ) (8 0 8 ) +4 43 54 0 (8 -344 -112 ) (8 -344 -128 ) (128 -344 -128 ) (128 -344 -112 ) +4 43 52 0 (8 -344 -96 ) (8 -344 -112 ) (128 -344 -112 ) (128 -344 -96 ) +4 43 50 0 (8 -344 -80 ) (8 -344 -96 ) (128 -344 -96 ) (128 -344 -80 ) +4 43 48 0 (8 -344 -64 ) (8 -344 -80 ) (128 -344 -80 ) (128 -344 -64 ) +4 43 46 0 (8 -344 8 ) (8 -344 -64 ) (128 -344 -64 ) (128 -344 8 ) +4 43 45 0 (136 -344 -112 ) (136 -344 8 ) (128 -344 8 ) (128 -344 -112 ) +4 43 44 0 (136 -344 -128 ) (768 -344 -128 ) (768 -344 8 ) (136 -344 8 ) +3 44 45 0 (136 -344 8 ) (136 -344 -112 ) (136 -576 8 ) +3 45 52 0 (128 -344 -96 ) (128 -344 -112 ) (128 -374.933319 -96 ) +3 45 51 0 (128 -544 -8.551724 ) (128 -576 8 ) (128 -544 8 ) +4 45 50 0 (128 -344 -80 ) (128 -344 -96 ) (128 -374.933319 -96 ) (128 -405.866669 -80 ) +4 45 49 0 (128 -512 -25.103449 ) (128 -544 -8.551724 ) (128 -544 8 ) (128 -512 8 ) +4 45 48 0 (128 -344 -64 ) (128 -344 -80 ) (128 -405.866669 -80 ) (128 -436.799988 -64 ) +4 45 47 0 (128 -480 -41.655170 ) (128 -512 -25.103449 ) (128 -512 8 ) (128 -480 8 ) +5 45 46 0 (128 -344 8 ) (128 -344 -64 ) (128 -436.799988 -64 ) (128 -480 -41.655170 ) (128 -480 8 ) +5 46 57 0 (8 -344 0 ) (8 -344 -64 ) (8 -436.799988 -64 ) (8 -480 -41.655167 ) (8 -480 0 ) +4 46 56 0 (8 -480 8 ) (8 -344 8 ) (8 -344 0 ) (8 -480 0 ) +4 46 48 0 (8 -448 -64 ) (8 -344 -64 ) (128 -344 -64 ) (128 -448 -64 ) +4 46 47 0 (8 -480 8 ) (8 -480 -48 ) (128 -480 -48 ) (128 -480 8 ) +4 47 57 0 (8 -480 0 ) (8 -480 -41.655163 ) (8 -512 -25.103441 ) (8 -512 0 ) +4 47 56 0 (8 -512 8 ) (8 -480 8 ) (8 -480 0 ) (8 -512 0 ) +4 47 49 0 (8 -512 8 ) (8 -512 -32 ) (128 -512 -32 ) (128 -512 8 ) +4 48 57 0 (8 -344 -64 ) (8 -344 -80 ) (8 -405.866638 -80 ) (8 -436.799988 -64 ) +4 48 50 0 (8 -416 -80 ) (8 -344 -80 ) (128 -344 -80 ) (128 -416 -80 ) +4 49 57 0 (8 -512 0 ) (8 -512 -25.103439 ) (8 -544 -8.551716 ) (8 -544 0 ) +4 49 56 0 (8 -544 8 ) (8 -512 8 ) (8 -512 0 ) (8 -544 0 ) +4 49 51 0 (8 -544 8 ) (8 -544 -16 ) (128 -544 -16 ) (128 -544 8 ) +4 50 57 0 (8 -344 -80 ) (8 -344 -96 ) (8 -374.933319 -96 ) (8 -405.866638 -80 ) +4 50 52 0 (8 -384 -96 ) (8 -344 -96 ) (128 -344 -96 ) (128 -384 -96 ) +3 51 57 0 (8 -544 0 ) (8 -544 -8.551715 ) (8 -560.533325 0 ) +4 51 56 0 (8 -576 8 ) (8 -544 8 ) (8 -544 0 ) (8 -560.533325 0 ) +4 51 53 0 (8 -576 8 ) (8 -576 0 ) (128 -576 0 ) (128 -576 8 ) +3 52 57 0 (8 -344 -96 ) (8 -344 -112 ) (8 -374.933319 -96 ) +4 52 54 0 (8 -352 -112 ) (8 -344 -112 ) (128 -344 -112 ) (128 -352 -112 ) +4 53 58 0 (8 -704 0 ) (8 -704 8 ) (8 -584 8 ) (8 -584 0 ) +4 55 57 0 (8 -344 -112 ) (8 -344 0 ) (0 -344 0 ) (0 -344 -112 ) +4 55 56 0 (8 -344 0 ) (8 -344 8 ) (0 -344 8 ) (0 -344 0 ) +4 56 57 0 (0 -560.533325 0 ) (0 -344 0 ) (8 -344 0 ) (8 -560.533325 0 ) +4 58 72 0 (0 -704 8 ) (0 -584 8 ) (0 -584 0 ) (0 -704 0 ) +4 59 64 0 (-512 0 288 ) (0 0 288 ) (0 0 496 ) (-512 0 496 ) +5 59 60 0 (0 0 288 ) (-448 0 288 ) (-448 160 288 ) (-96 512 288 ) (0 512 288 ) +4 60 65 0 (-448 0 256 ) (0 0 256 ) (0 0 288 ) (-448 0 288 ) +5 60 61 0 (0 0 256 ) (-448 0 256 ) (-448 160 256 ) (-96 512 256 ) (0 512 256 ) +4 61 71 0 (-512 0 8 ) (-504 0 8 ) (-504 0 64 ) (-512 0 64 ) +4 61 68 0 (-504 0 64 ) (-504 0 240 ) (-512 0 240 ) (-512 0 64 ) +4 61 67 0 (-504 0 240 ) (-504 0 256 ) (-512 0 256 ) (-512 0 240 ) +4 61 66 0 (-504 0 8 ) (0 0 8 ) (0 0 256 ) (-504 0 256 ) +5 61 63 0 (-8 0 8 ) (-448 0 8 ) (-448 160 8 ) (-96 512 8 ) (-8 512 8 ) +4 61 62 0 (-8 328 8 ) (-8 512 8 ) (0 512 8 ) (0 328 8 ) +4 62 63 0 (-8 512 8 ) (-8 512 0 ) (-8 328 0 ) (-8 328 8 ) +4 63 73 0 (-8 0 8 ) (-448 0 8 ) (-448 0 0 ) (-8 0 0 ) +5 64 65 0 (-448 0 288 ) (0 0 288 ) (0 -704 288 ) (-96 -704 288 ) (-448 -352 288 ) +5 65 66 0 (-448 0 256 ) (0 0 256 ) (0 -704 256 ) (-96 -704 256 ) (-448 -352 256 ) +5 66 73 0 (-448 0 8 ) (-8 0 8 ) (-8 -704 8 ) (-96 -704 8 ) (-448 -352 8 ) +4 66 72 0 (0 -584 8 ) (0 -704 8 ) (-8 -704 8 ) (-8 -584 8 ) +4 66 71 0 (-504 0 8 ) (-504 -392 8 ) (-504 -392 64 ) (-504 0 64 ) +4 66 70 0 (-504 -392 64 ) (-504 -392 240 ) (-504 -120 240 ) (-504 -120 64 ) +4 66 69 0 (-504 -104 80 ) (-504 -104 224 ) (-504 -88 224 ) (-504 -88 80 ) +4 66 68 0 (-504 -72 240 ) (-504 0 240 ) (-504 0 64 ) (-504 -72 64 ) +4 66 67 0 (-504 -392 240 ) (-504 -392 256 ) (-504 0 256 ) (-504 0 240 ) +4 67 70 0 (-512 -384 240 ) (-512 -120 240 ) (-504 -120 240 ) (-504 -392 240 ) +4 67 68 0 (-512 -72 240 ) (-512 0 240 ) (-504 0 240 ) (-504 -72 240 ) +4 68 71 0 (-512 -72 64 ) (-512 0 64 ) (-504 0 64 ) (-504 -72 64 ) +4 70 71 0 (-512 -384 64 ) (-512 -120 64 ) (-504 -120 64 ) (-504 -392 64 ) +4 72 73 0 (-8 -584 0 ) (-8 -704 0 ) (-8 -704 8 ) (-8 -584 8 ) +4 0 (112 24 408 ) (208 24 408 ) (208 24 496 ) (112 24 496 ) +4 0 (448 576 408 ) (0 576 408 ) (0 576 496 ) (448 576 496 ) +5 0 (832 24 496 ) (832 192 496 ) (448 576 496 ) (0 576 496 ) (0 24 496 ) +4 0 (832 24 408 ) (832 192 408 ) (832 192 496 ) (832 24 496 ) +4 0 (832 192 496 ) (832 192 408 ) (448 576 408 ) (448 576 496 ) +4 1 (88 0 408 ) (112 24 408 ) (112 24 496 ) (88 0 496 ) +4 1 (112 24 496 ) (0 24 496 ) (0 0 496 ) (88 0 496 ) +4 2 (832 24 408 ) (832 24 496 ) (832 0 496 ) (832 0 408 ) +4 2 (832 24 496 ) (208 24 496 ) (232 0 496 ) (832 0 496 ) +4 2 (208 24 496 ) (208 24 408 ) (232 0 408 ) (232 0 496 ) +4 3 (416 512 288 ) (512 512 288 ) (768 256 288 ) (768 160 288 ) +4 3 (832 0 288 ) (768 0 288 ) (768 256 288 ) (832 192 288 ) +4 3 (0 512 288 ) (0 576 288 ) (448 576 288 ) (512 512 288 ) +4 3 (832 192 408 ) (832 0 408 ) (832 0 288 ) (832 192 288 ) +4 3 (0 576 408 ) (448 576 408 ) (448 576 288 ) (0 576 288 ) +4 3 (208 24 408 ) (112 24 408 ) (88 0 408 ) (232 0 408 ) +4 3 (448 576 288 ) (448 576 408 ) (832 192 408 ) (832 192 288 ) +4 4 (768 160 288 ) (768 0 288 ) (768 0 256 ) (768 160 256 ) +4 4 (0 512 288 ) (416 512 288 ) (416 512 256 ) (0 512 256 ) +4 4 (768 160 288 ) (768 160 256 ) (416 512 256 ) (416 512 288 ) +4 5 (152 568 240 ) (136 568 240 ) (136 576 240 ) (152 576 240 ) +4 5 (168 568 240 ) (152 568 240 ) (152 572 240 ) (168 572 240 ) +4 5 (152 572 240 ) (152 576 240 ) (168 576 240 ) (168 572 240 ) +4 5 (184 568 240 ) (168 568 240 ) (168 576 240 ) (184 576 240 ) +4 5 (456 568 256 ) (448 576 256 ) (0 576 256 ) (0 568 256 ) +4 5 (448 576 240 ) (0 576 240 ) (0 576 256 ) (448 576 256 ) +4 5 (456 568 256 ) (456 568 240 ) (448 576 240 ) (448 576 256 ) +4 6 (184 576 64 ) (184 568 64 ) (184 568 240 ) (184 576 240 ) +4 6 (448 576 64 ) (184 576 64 ) (184 576 240 ) (448 576 240 ) +4 6 (456 568 64 ) (448 576 64 ) (448 576 240 ) (456 568 240 ) +4 7 (152 568 80 ) (152 568 224 ) (152 572 224 ) (152 572 80 ) +4 7 (168 572 224 ) (168 572 80 ) (152 572 80 ) (152 572 224 ) +4 7 (168 572 80 ) (168 572 224 ) (168 568 224 ) (168 568 80 ) +4 7 (152 568 80 ) (152 572 80 ) (168 572 80 ) (168 568 80 ) +4 7 (168 568 224 ) (168 572 224 ) (152 572 224 ) (152 568 224 ) +4 8 (136 576 64 ) (0 576 64 ) (0 576 240 ) (136 576 240 ) +4 8 (136 576 240 ) (136 568 240 ) (136 568 64 ) (136 576 64 ) +4 9 (0 568 8 ) (0 576 8 ) (448 576 8 ) (456 568 8 ) +4 9 (0 576 64 ) (448 576 64 ) (448 576 8 ) (0 576 8 ) +4 9 (184 576 64 ) (168 576 64 ) (168 568 64 ) (184 568 64 ) +4 9 (168 576 64 ) (152 576 64 ) (152 568 64 ) (168 568 64 ) +4 9 (152 576 64 ) (136 576 64 ) (136 568 64 ) (152 568 64 ) +4 9 (448 576 8 ) (448 576 64 ) (456 568 64 ) (456 568 8 ) +4 10 (0 320 8 ) (0 328 8 ) (8 328 8 ) (8 320 8 ) +4 10 (128 320 8 ) (128 512 8 ) (136 512 8 ) (136 320 8 ) +4 10 (416 512 8 ) (512 512 8 ) (768 256 8 ) (768 160 8 ) +4 10 (0 512 8 ) (0 568 8 ) (456 568 8 ) (512 512 8 ) +4 10 (832 0 8 ) (768 0 8 ) (768 256 8 ) (832 192 8 ) +4 10 (832 192 256 ) (832 0 256 ) (832 0 8 ) (832 192 8 ) +4 10 (152 568 64 ) (136 568 64 ) (136 568 240 ) (152 568 240 ) +4 10 (168 568 224 ) (152 568 224 ) (152 568 240 ) (168 568 240 ) +4 10 (168 568 80 ) (168 568 64 ) (152 568 64 ) (152 568 80 ) +4 10 (184 568 64 ) (168 568 64 ) (168 568 240 ) (184 568 240 ) +4 10 (512 512 256 ) (456 568 256 ) (0 568 256 ) (0 512 256 ) +4 10 (832 192 256 ) (768 256 256 ) (768 0 256 ) (832 0 256 ) +4 10 (768 160 256 ) (768 256 256 ) (512 512 256 ) (416 512 256 ) +4 10 (832 192 256 ) (832 192 8 ) (456 568 8 ) (456 568 256 ) +4 11 (448 64 0 ) (320 64 0 ) (320 192 0 ) (448 192 0 ) +4 11 (768 64 0 ) (768 160 0 ) (768 160 8 ) (768 64 8 ) +4 11 (416 512 0 ) (320 512 0 ) (320 512 8 ) (416 512 8 ) +4 11 (768 160 8 ) (768 160 0 ) (416 512 0 ) (416 512 8 ) +4 12 (448 192 0 ) (320 192 0 ) (320 192 -128 ) (448 192 -128 ) +4 12 (416 512 -128 ) (416 512 0 ) (736 192 0 ) (736 192 -128 ) +4 12 (320 512 0 ) (416 512 0 ) (416 512 -128 ) (320 512 -128 ) +4 12 (320 192 -128 ) (320 512 -128 ) (416 512 -128 ) (736 192 -128 ) +5 13 (768 160 -128 ) (768 64 -128 ) (448 64 -128 ) (448 192 -128 ) (736 192 -128 ) +4 13 (768 160 0 ) (768 64 0 ) (768 64 -128 ) (768 160 -128 ) +4 13 (736 192 0 ) (768 160 0 ) (768 160 -128 ) (736 192 -128 ) +4 13 (448 192 0 ) (448 192 -128 ) (448 64 -128 ) (448 64 0 ) +4 14 (448 64 0 ) (448 64 -128 ) (320 64 -128 ) (320 64 0 ) +4 14 (768 64 -128 ) (768 0 -128 ) (320 0 -128 ) (320 64 -128 ) +4 14 (768 64 -128 ) (768 64 8 ) (768 0 8 ) (768 0 -128 ) +5 15 (136 512 8 ) (136 512 -128 ) (136 0 -128 ) (136 0 -120 ) (136 320 8 ) +4 15 (320 192 0 ) (320 64 0 ) (320 64 -128 ) (320 192 -128 ) +4 15 (136 512 8 ) (320 512 8 ) (320 512 -128 ) (136 512 -128 ) +4 15 (320 0 -128 ) (136 0 -128 ) (136 512 -128 ) (320 512 -128 ) +4 16 (128 0 -120 ) (128 319.998993 8 ) (136 320 8 ) (136 0 -120 ) +4 17 (0 0 0 ) (0 0 8 ) (0 320 8 ) (0 300 0 ) +3 17 (0 0 -120 ) (0 0 0 ) (0 300 0 ) +4 17 (8 0 -120 ) (0 0 -120 ) (0 300 0 ) (8 300 0 ) +4 17 (0 320 8 ) (8 320 8 ) (8 300 0 ) (0 300 0 ) +4 18 (8 512 0 ) (128 512 0 ) (128 328 0 ) (8 328 0 ) +4 18 (0 328 0 ) (0 512 0 ) (8 512 0 ) (8 328 0 ) +4 18 (0 328 0 ) (8 328 0 ) (8 328 8 ) (0 328 8 ) +4 18 (0 512 0 ) (0 512 8 ) (128 512 8 ) (128 512 0 ) +4 18 (128 328 8 ) (128 328 0 ) (128 512 0 ) (128 512 8 ) +4 19 (8 320 0 ) (8 328 0 ) (128 328 0 ) (128 320 0 ) +4 19 (128 328 8 ) (128 320 8 ) (128 300 0 ) (128 328 0 ) +4 19 (8 328 8 ) (8 328 0 ) (8 300 0 ) (8 320 8 ) +4 20 (8 0 -120 ) (8 300 0 ) (8 320 0 ) (8 0 -128 ) +4 20 (128 320 0 ) (128 300 0 ) (128 0 -120 ) (128 0 -128 ) +4 20 (8 0 -128 ) (8 319.998627 0 ) (128 319.998627 0 ) (128 0 -128 ) +4 21 (280 -48 408 ) (280 -144 408 ) (280 -144 496 ) (280 -48 496 ) +4 21 (832 0 496 ) (832 -384 496 ) (832 -384 408 ) (832 0 408 ) +5 21 (280 -768 496 ) (448 -768 496 ) (832 -384 496 ) (832 0 496 ) (280 0 496 ) +4 21 (280 -768 408 ) (448 -768 408 ) (448 -768 496 ) (280 -768 496 ) +4 21 (448 -768 496 ) (448 -768 408 ) (832 -384 408 ) (832 -384 496 ) +4 22 (280 -144 496 ) (280 -144 408 ) (232 -192 408 ) (232 -192 496 ) +4 22 (232 -192 496 ) (232 -216 496 ) (280 -216 496 ) (280 -144 496 ) +3 23 (280 -48 496 ) (280 0 496 ) (232 0 496 ) +4 23 (232 0 496 ) (232 0 408 ) (280 -48 408 ) (280 -48 496 ) +4 24 (88 -64 408 ) (88 -128 408 ) (88 -128 496 ) (88 -64 496 ) +4 24 (128 -168 408 ) (192 -168 408 ) (192 -168 496 ) (128 -168 496 ) +4 24 (192 -168 496 ) (192 -168 408 ) (232 -128 408 ) (232 -128 496 ) +4 24 (88 -128 496 ) (88 -128 408 ) (128 -168 408 ) (128 -168 496 ) +4 24 (232 -64 496 ) (232 -128 496 ) (232 -128 408 ) (232 -64 408 ) +8 24 (192 -24 496 ) (128 -24 496 ) (88 -64 496 ) (88 -128 496 ) (128 -168 496 ) (192 -168 496 ) (232 -128 496 ) (232 -64 496 ) +4 24 (128 -24 496 ) (192 -24 496 ) (192 -24 408 ) (128 -24 408 ) +4 24 (128 -24 496 ) (128 -24 408 ) (88 -64 408 ) (88 -64 496 ) +4 24 (232 -64 496 ) (232 -64 408 ) (192 -24 408 ) (192 -24 496 ) +4 25 (232 -192 496 ) (232 -192 408 ) (208 -216 408 ) (208 -216 496 ) +3 25 (208 -216 496 ) (232 -216 496 ) (232 -192 496 ) +3 26 (88 -192 496 ) (88 -216 496 ) (112 -216 496 ) +4 26 (112 -216 496 ) (112 -216 408 ) (88 -192 408 ) (88 -192 496 ) +4 27 (40 -48 496 ) (40 -48 408 ) (88 0 408 ) (88 0 496 ) +3 27 (40 -48 496 ) (88 0 496 ) (40 0 496 ) +4 28 (40 -144 496 ) (40 -216 496 ) (88 -216 496 ) (88 -192 496 ) +4 28 (88 -192 496 ) (88 -192 408 ) (40 -144 408 ) (40 -144 496 ) +4 29 (112 -216 496 ) (208 -216 496 ) (208 -216 408 ) (112 -216 408 ) +4 29 (40 -768 408 ) (280 -768 408 ) (280 -768 496 ) (40 -768 496 ) +4 29 (40 -216 496 ) (40 -768 496 ) (280 -768 496 ) (280 -216 496 ) +4 30 (40 -48 496 ) (40 -144 496 ) (40 -144 408 ) (40 -48 408 ) +4 30 (40 -768 496 ) (40 0 496 ) (0 0 496 ) (0 -768 496 ) +4 30 (0 -768 408 ) (40 -768 408 ) (40 -768 496 ) (0 -768 496 ) +4 31 (768 -352 288 ) (768 -448 288 ) (512 -704 288 ) (416 -704 288 ) +4 31 (0 -768 288 ) (0 -704 288 ) (512 -704 288 ) (448 -768 288 ) +4 31 (768 0 288 ) (832 0 288 ) (832 -384 288 ) (768 -448 288 ) +4 31 (832 0 408 ) (832 -384 408 ) (832 -384 288 ) (832 0 288 ) +4 31 (232 -192 408 ) (280 -144 408 ) (280 -48 408 ) (232 0 408 ) +4 31 (88 -24 408 ) (232 -24 408 ) (232 0 408 ) (88 0 408 ) +3 31 (88 -128 408 ) (88 -168 408 ) (128 -168 408 ) +3 31 (128 -24 408 ) (88 -24 408 ) (88 -64 408 ) +3 31 (192 -168 408 ) (232 -168 408 ) (232 -128 408 ) +3 31 (192 -24 408 ) (232 -64 408 ) (232 -24 408 ) +6 31 (88 -168 408 ) (88 -192 408 ) (112 -216 408 ) (208 -216 408 ) (232 -192 408 ) (232 -168 408 ) +4 31 (40 -48 408 ) (40 -144 408 ) (88 -192 408 ) (88 0 408 ) +4 31 (0 -768 288 ) (448 -768 288 ) (448 -768 408 ) (0 -768 408 ) +4 31 (448 -768 408 ) (448 -768 288 ) (832 -384 288 ) (832 -384 408 ) +4 32 (0 -704 256 ) (416 -704 256 ) (416 -704 288 ) (0 -704 288 ) +4 32 (768 0 288 ) (768 -352 288 ) (768 -352 256 ) (768 0 256 ) +4 32 (416 -704 288 ) (416 -704 256 ) (768 -352 256 ) (768 -352 288 ) +4 33 (152 -760 240 ) (168 -760 240 ) (168 -764 240 ) (152 -764 240 ) +4 33 (168 -760 240 ) (184 -760 240 ) (184 -764 240 ) (168 -764 240 ) +4 33 (184 -764 240 ) (184 -768 240 ) (152 -768 240 ) (152 -764 240 ) +4 33 (136 -760 240 ) (152 -760 240 ) (152 -768 240 ) (136 -768 240 ) +4 33 (832 -104 240 ) (832 -120 240 ) (824 -120 240 ) (824 -104 240 ) +4 33 (828 -104 240 ) (824 -104 240 ) (824 -88 240 ) (828 -88 240 ) +4 33 (832 -88 240 ) (832 -104 240 ) (828 -104 240 ) (828 -88 240 ) +4 33 (832 -72 240 ) (832 -88 240 ) (824 -88 240 ) (824 -72 240 ) +4 33 (832 0 256 ) (832 -384 256 ) (832 -384 240 ) (832 0 240 ) +4 33 (768 -448 256 ) (832 -384 256 ) (832 0 256 ) (768 0 256 ) +4 33 (448 -768 256 ) (512 -704 256 ) (0 -704 256 ) (0 -768 256 ) +4 33 (416 -704 256 ) (512 -704 256 ) (768 -448 256 ) (768 -352 256 ) +4 33 (0 -768 240 ) (448 -768 240 ) (448 -768 256 ) (0 -768 256 ) +4 33 (448 -768 256 ) (448 -768 240 ) (832 -384 240 ) (832 -384 256 ) +4 34 (832 0 240 ) (832 -72 240 ) (832 -72 64 ) (832 0 64 ) +4 34 (824 -72 240 ) (824 -72 64 ) (832 -72 64 ) (832 -72 240 ) +4 35 (824 -104 224 ) (824 -104 80 ) (828 -104 80 ) (828 -104 224 ) +4 35 (828 -104 224 ) (828 -104 80 ) (828 -88 80 ) (828 -88 224 ) +4 35 (828 -88 224 ) (828 -88 80 ) (824 -88 80 ) (824 -88 224 ) +4 35 (828 -104 80 ) (824 -104 80 ) (824 -88 80 ) (828 -88 80 ) +4 35 (824 -104 224 ) (828 -104 224 ) (828 -88 224 ) (824 -88 224 ) +4 36 (832 -120 240 ) (832 -120 64 ) (824 -120 64 ) (824 -120 240 ) +4 36 (832 -120 240 ) (832 -384 240 ) (832 -384 64 ) (832 -120 64 ) +4 36 (824 -392 240 ) (824 -392 64 ) (832 -384 64 ) (832 -384 240 ) +4 37 (824 0 8 ) (832 0 8 ) (832 -384 8 ) (824 -392 8 ) +4 37 (832 0 64 ) (832 -384 64 ) (832 -384 8 ) (832 0 8 ) +4 37 (832 -120 64 ) (832 -104 64 ) (824 -104 64 ) (824 -120 64 ) +4 37 (832 -104 64 ) (832 -88 64 ) (824 -88 64 ) (824 -104 64 ) +4 37 (832 -88 64 ) (832 -72 64 ) (824 -72 64 ) (824 -88 64 ) +4 37 (832 -384 8 ) (832 -384 64 ) (824 -392 64 ) (824 -392 8 ) +4 38 (0 -584 8 ) (0 -576 8 ) (8 -576 8 ) (8 -584 8 ) +4 38 (136 -704 8 ) (128 -704 8 ) (128 -576 8 ) (136 -576 8 ) +4 38 (768 -352 8 ) (768 -448 8 ) (512 -704 8 ) (416 -704 8 ) +4 38 (768 0 8 ) (824 0 8 ) (824 -392 8 ) (768 -448 8 ) +4 38 (0 -760 8 ) (0 -704 8 ) (512 -704 8 ) (456 -760 8 ) +4 38 (152 -760 80 ) (152 -760 64 ) (168 -760 64 ) (168 -760 80 ) +4 38 (168 -760 240 ) (152 -760 240 ) (152 -760 224 ) (168 -760 224 ) +4 38 (184 -760 240 ) (168 -760 240 ) (168 -760 64 ) (184 -760 64 ) +4 38 (152 -760 240 ) (136 -760 240 ) (136 -760 64 ) (152 -760 64 ) +4 38 (824 -120 64 ) (824 -104 64 ) (824 -104 240 ) (824 -120 240 ) +4 38 (824 -104 224 ) (824 -88 224 ) (824 -88 240 ) (824 -104 240 ) +4 38 (824 -104 80 ) (824 -104 64 ) (824 -88 64 ) (824 -88 80 ) +4 38 (824 -88 64 ) (824 -72 64 ) (824 -72 240 ) (824 -88 240 ) +4 38 (456 -760 240 ) (456 -760 8 ) (824 -392 8 ) (824 -392 240 ) +4 39 (184 -760 240 ) (184 -760 64 ) (184 -764 64 ) (184 -764 240 ) +4 39 (184 -764 64 ) (184 -768 64 ) (184 -768 240 ) (184 -764 240 ) +4 39 (448 -768 240 ) (184 -768 240 ) (184 -768 64 ) (448 -768 64 ) +4 39 (448 -768 240 ) (448 -768 64 ) (456 -760 64 ) (456 -760 240 ) +4 40 (152 -760 224 ) (152 -764 224 ) (168 -764 224 ) (168 -760 224 ) +4 40 (152 -764 224 ) (152 -764 80 ) (168 -764 80 ) (168 -764 224 ) +4 40 (152 -760 224 ) (152 -760 80 ) (152 -764 80 ) (152 -764 224 ) +4 40 (168 -764 224 ) (168 -764 80 ) (168 -760 80 ) (168 -760 224 ) +4 40 (168 -760 80 ) (168 -764 80 ) (152 -764 80 ) (152 -760 80 ) +4 41 (136 -768 240 ) (136 -768 64 ) (136 -760 64 ) (136 -760 240 ) +4 41 (136 -768 240 ) (0 -768 240 ) (0 -768 64 ) (136 -768 64 ) +4 42 (0 -768 8 ) (0 -760 8 ) (456 -760 8 ) (448 -768 8 ) +4 42 (0 -768 8 ) (448 -768 8 ) (448 -768 64 ) (0 -768 64 ) +4 42 (152 -760 64 ) (136 -760 64 ) (136 -768 64 ) (152 -768 64 ) +4 42 (184 -764 64 ) (152 -764 64 ) (152 -768 64 ) (184 -768 64 ) +4 42 (168 -764 64 ) (184 -764 64 ) (184 -760 64 ) (168 -760 64 ) +4 42 (168 -764 64 ) (168 -760 64 ) (152 -760 64 ) (152 -764 64 ) +4 42 (456 -760 8 ) (456 -760 64 ) (448 -768 64 ) (448 -768 8 ) +4 43 (128 -344 -128 ) (136 -344 -128 ) (136 -344 -112 ) (128 -344 -112 ) +4 43 (768 0 8 ) (768 -344 8 ) (768 -344 -128 ) (768 0 -128 ) +4 43 (128 0 -120 ) (136 0 -120 ) (136 0 -128 ) (128 0 -128 ) +4 43 (8 0 -128 ) (768 0 -128 ) (768 -344 -128 ) (8 -344 -128 ) +5 44 (136 -344 -112 ) (136 -344 -128 ) (136 -704 -128 ) (136 -704 8 ) (136 -576 8 ) +5 44 (768 -344 -128 ) (768 -352 -128 ) (416 -704 -128 ) (136 -704 -128 ) (136 -344 -128 ) +4 44 (136 -704 -128 ) (416 -704 -128 ) (416 -704 8 ) (136 -704 8 ) +4 44 (768 -344 8 ) (768 -352 8 ) (768 -352 -128 ) (768 -344 -128 ) +4 44 (416 -704 8 ) (416 -704 -128 ) (768 -352 -128 ) (768 -352 8 ) +4 45 (128 -576 8 ) (128 -344 -112 ) (136 -344 -112 ) (136 -576 8 ) +3 46 (8 -436.799988 -64 ) (8 -480 -64 ) (8 -480 -41.655167 ) +4 46 (8 -480 -64 ) (8 -448 -64 ) (128 -448 -64 ) (128 -480 -64 ) +4 46 (8 -480 -48 ) (8 -480 -64 ) (128 -480 -64 ) (128 -480 -48 ) +3 46 (128 -480 -64 ) (128 -436.799988 -64 ) (128 -480 -41.655167 ) +4 47 (8 -480 -41.655163 ) (8 -480 -48 ) (8 -512 -48 ) (8 -512 -25.103441 ) +4 47 (8 -512 -32 ) (8 -512 -48 ) (128 -512 -48 ) (128 -512 -32 ) +4 47 (128 -512 -48 ) (128 -480 -48 ) (128 -480 -41.655167 ) (128 -512 -25.103443 ) +4 47 (128 -512 -48 ) (8 -512 -48 ) (8 -480 -48 ) (128 -480 -48 ) +4 48 (8 -405.866638 -80 ) (8 -448 -80 ) (8 -448 -64 ) (8 -436.799988 -64 ) +4 48 (8 -448 -80 ) (8 -416 -80 ) (128 -416 -80 ) (128 -448 -80 ) +4 48 (128 -448 -64 ) (128 -448 -80 ) (128 -405.866638 -80 ) (128 -436.799988 -64 ) +4 48 (8 -448 -80 ) (128 -448 -80 ) (128 -448 -64 ) (8 -448 -64 ) +4 49 (8 -512 -25.103439 ) (8 -512 -32 ) (8 -544 -32 ) (8 -544 -8.551716 ) +4 49 (8 -544 -16 ) (8 -544 -32 ) (128 -544 -32 ) (128 -544 -16 ) +4 49 (128 -544 -32 ) (128 -512 -32 ) (128 -512 -25.103443 ) (128 -544 -8.551723 ) +4 49 (128 -544 -32 ) (8 -544 -32 ) (8 -512 -32 ) (128 -512 -32 ) +4 50 (8 -374.933319 -96 ) (8 -416 -96 ) (8 -416 -80 ) (8 -405.866638 -80 ) +4 50 (8 -416 -96 ) (8 -384 -96 ) (128 -384 -96 ) (128 -416 -96 ) +4 50 (128 -416 -80 ) (128 -416 -96 ) (128 -374.933319 -96 ) (128 -405.866638 -80 ) +4 50 (8 -416 -96 ) (128 -416 -96 ) (128 -416 -80 ) (8 -416 -80 ) +5 51 (8 -544 -8.551715 ) (8 -544 -16 ) (8 -576 -16 ) (8 -576 0 ) (8 -560.533325 0 ) +3 51 (8 -576 8 ) (8 -560.533325 0 ) (8 -576 0 ) +4 51 (8 -576 0 ) (8 -576 -16 ) (128 -576 -16 ) (128 -576 0 ) +4 51 (128 -544 -16 ) (128 -544 -8.551723 ) (128 -576 8 ) (128 -576 -16 ) +4 51 (128 -576 -16 ) (8 -576 -16 ) (8 -544 -16 ) (128 -544 -16 ) +4 52 (8 -344 -112 ) (8 -384 -112 ) (8 -384 -96 ) (8 -374.933319 -96 ) +4 52 (8 -384 -112 ) (8 -352 -112 ) (128 -352 -112 ) (128 -384 -112 ) +4 52 (128 -374.933319 -96 ) (128 -384 -96 ) (128 -384 -112 ) (128 -344 -112 ) +4 52 (8 -384 -112 ) (128 -384 -112 ) (128 -384 -96 ) (8 -384 -96 ) +4 53 (8 -584 8 ) (8 -576 8 ) (8 -576 0 ) (8 -584 0 ) +4 53 (128 -704 0 ) (128 -704 8 ) (8 -704 8 ) (8 -704 0 ) +4 53 (128 -576 0 ) (128 -576 8 ) (128 -704 8 ) (128 -704 0 ) +4 53 (8 -704 0 ) (8 -576 0 ) (128 -576 0 ) (128 -704 0 ) +4 54 (8 -344 -128 ) (8 -352 -128 ) (8 -352 -112 ) (8 -344 -112 ) +4 54 (128 -352 -112 ) (128 -352 -128 ) (128 -344 -128 ) (128 -344 -112 ) +4 54 (8 -352 -128 ) (8 -344 -128 ) (128 -344 -128 ) (128 -352 -128 ) +4 54 (128 -352 -128 ) (128 -352 -112 ) (8 -352 -112 ) (8 -352 -128 ) +4 55 (0 -344 8 ) (0 0 8 ) (0 0 0 ) (0 -344 0 ) +4 55 (0 0 0 ) (0 0 -128 ) (0 -344 -128 ) (0 -344 0 ) +4 55 (0 -344 -128 ) (8 -344 -128 ) (8 -344 -112 ) (0 -344 -112 ) +4 55 (0 -344 -128 ) (0 0 -128 ) (8 0 -128 ) (8 -344 -128 ) +4 55 (8 0 -120 ) (8 0 -128 ) (0 0 -128 ) (0 0 -120 ) +4 56 (0 -576 8 ) (0 -344 8 ) (0 -344 0 ) (0 -560.533325 0 ) +4 56 (0 -560.532898 0 ) (8 -560.532898 0 ) (8 -576 8 ) (0 -576 8 ) +3 57 (0 -344 0 ) (0 -344 -112 ) (0 -560.533325 0 ) +4 57 (8 -560.532898 0 ) (0 -560.532898 0 ) (0 -344 -112 ) (8 -344 -112 ) +4 58 (8 -704 0 ) (8 -704 8 ) (0 -704 8 ) (0 -704 0 ) +4 58 (0 -584 0 ) (0 -584 8 ) (8 -584 8 ) (8 -584 0 ) +4 58 (0 -584 0 ) (8 -584 0 ) (8 -704 0 ) (0 -704 0 ) +4 59 (-448 160 288 ) (-448 256 288 ) (-192 512 288 ) (-96 512 288 ) +4 59 (-448 0 288 ) (-512 0 288 ) (-512 192 288 ) (-448 256 288 ) +4 59 (-192 512 288 ) (-128 576 288 ) (0 576 288 ) (0 512 288 ) +4 59 (-128 576 496 ) (0 576 496 ) (0 576 288 ) (-128 576 288 ) +5 59 (0 576 496 ) (-128 576 496 ) (-512 192 496 ) (-512 0 496 ) (0 0 496 ) +4 59 (-512 192 288 ) (-512 0 288 ) (-512 0 496 ) (-512 192 496 ) +4 59 (-128 576 496 ) (-128 576 288 ) (-512 192 288 ) (-512 192 496 ) +4 60 (-448 160 256 ) (-448 0 256 ) (-448 0 288 ) (-448 160 288 ) +4 60 (-96 512 288 ) (0 512 288 ) (0 512 256 ) (-96 512 256 ) +4 60 (-96 512 288 ) (-96 512 256 ) (-448 160 256 ) (-448 160 288 ) +4 61 (-448 160 8 ) (-448 256 8 ) (-192 512 8 ) (-96 512 8 ) +4 61 (0 0 8 ) (-8 0 8 ) (-8 328 8 ) (0 328 8 ) +4 61 (-192 512 8 ) (-128 576 8 ) (0 576 8 ) (0 512 8 ) +4 61 (-448 0 8 ) (-512 0 8 ) (-512 192 8 ) (-448 256 8 ) +4 61 (-512 192 8 ) (-512 0 8 ) (-512 0 256 ) (-512 192 256 ) +4 61 (-192 512 256 ) (0 512 256 ) (0 576 256 ) (-128 576 256 ) +4 61 (-448 256 256 ) (-512 192 256 ) (-512 0 256 ) (-448 0 256 ) +4 61 (-96 512 256 ) (-192 512 256 ) (-448 256 256 ) (-448 160 256 ) +4 61 (-128 576 256 ) (0 576 256 ) (0 576 8 ) (-128 576 8 ) +4 61 (-128 576 256 ) (-128 576 8 ) (-512 192 8 ) (-512 192 256 ) +4 62 (-8 512 8 ) (0 512 8 ) (0 512 0 ) (-8 512 0 ) +4 62 (-8 328 0 ) (-8 512 0 ) (0 512 0 ) (0 328 0 ) +4 62 (-8 328 8 ) (-8 328 0 ) (0 328 0 ) (0 328 8 ) +4 63 (-96 512 8 ) (-8 512 8 ) (-8 512 0 ) (-96 512 0 ) +4 63 (-448 0 0 ) (-448 0 8 ) (-448 160 8 ) (-448 160 0 ) +5 63 (-8 0 0 ) (-448 0 0 ) (-448 160 0 ) (-96 512 0 ) (-8 512 0 ) +4 63 (-8 328 8 ) (-8 0 8 ) (-8 0 0 ) (-8 328 0 ) +4 63 (-96 512 8 ) (-96 512 0 ) (-448 160 0 ) (-448 160 8 ) +4 64 (-96 -704 288 ) (-192 -704 288 ) (-448 -448 288 ) (-448 -352 288 ) +4 64 (-512 0 288 ) (-448 0 288 ) (-448 -448 288 ) (-512 -384 288 ) +4 64 (0 -704 288 ) (0 -768 288 ) (-128 -768 288 ) (-192 -704 288 ) +4 64 (-128 -768 288 ) (0 -768 288 ) (0 -768 496 ) (-128 -768 496 ) +5 64 (-512 -384 496 ) (-128 -768 496 ) (0 -768 496 ) (0 0 496 ) (-512 0 496 ) +4 64 (-512 0 288 ) (-512 -384 288 ) (-512 -384 496 ) (-512 0 496 ) +4 64 (-512 -384 496 ) (-512 -384 288 ) (-128 -768 288 ) (-128 -768 496 ) +4 65 (-448 0 256 ) (-448 -352 256 ) (-448 -352 288 ) (-448 0 288 ) +4 65 (-96 -704 256 ) (0 -704 256 ) (0 -704 288 ) (-96 -704 288 ) +4 65 (-448 -352 288 ) (-448 -352 256 ) (-96 -704 256 ) (-96 -704 288 ) +4 66 (-96 -704 8 ) (-192 -704 8 ) (-448 -448 8 ) (-448 -352 8 ) +4 66 (-8 0 8 ) (0 0 8 ) (0 -584 8 ) (-8 -584 8 ) +4 66 (0 -704 8 ) (0 -768 8 ) (-128 -768 8 ) (-192 -704 8 ) +4 66 (-504 0 8 ) (-448 0 8 ) (-448 -448 8 ) (-504 -392 8 ) +4 66 (-504 -88 64 ) (-504 -104 64 ) (-504 -104 80 ) (-504 -88 80 ) +4 66 (-504 -72 224 ) (-504 -72 64 ) (-504 -88 64 ) (-504 -88 224 ) +4 66 (-504 -104 240 ) (-504 -72 240 ) (-504 -72 224 ) (-504 -104 224 ) +4 66 (-504 -120 240 ) (-504 -104 240 ) (-504 -104 64 ) (-504 -120 64 ) +4 66 (-128 -768 8 ) (0 -768 8 ) (0 -768 256 ) (-128 -768 256 ) +4 66 (-128 -768 256 ) (0 -768 256 ) (0 -704 256 ) (-192 -704 256 ) +4 66 (-504 -392 256 ) (-448 -448 256 ) (-448 0 256 ) (-504 0 256 ) +4 66 (-448 -352 256 ) (-448 -448 256 ) (-192 -704 256 ) (-96 -704 256 ) +4 66 (-504 -392 256 ) (-504 -392 8 ) (-128 -768 8 ) (-128 -768 256 ) +4 67 (-508 -72 240 ) (-504 -72 240 ) (-504 -104 240 ) (-508 -104 240 ) +4 67 (-504 -104 240 ) (-504 -120 240 ) (-508 -120 240 ) (-508 -104 240 ) +4 67 (-512 -120 240 ) (-512 -72 240 ) (-508 -72 240 ) (-508 -120 240 ) +4 67 (-512 -384 256 ) (-504 -392 256 ) (-504 0 256 ) (-512 0 256 ) +4 67 (-512 -384 256 ) (-512 0 256 ) (-512 0 240 ) (-512 -384 240 ) +4 67 (-512 -384 256 ) (-512 -384 240 ) (-504 -392 240 ) (-504 -392 256 ) +4 68 (-508 -72 64 ) (-504 -72 64 ) (-504 -72 224 ) (-508 -72 224 ) +4 68 (-504 -72 224 ) (-504 -72 240 ) (-508 -72 240 ) (-508 -72 224 ) +4 68 (-512 -72 64 ) (-508 -72 64 ) (-508 -72 240 ) (-512 -72 240 ) +4 68 (-512 -72 240 ) (-512 0 240 ) (-512 0 64 ) (-512 -72 64 ) +4 69 (-504 -88 80 ) (-508 -88 80 ) (-508 -88 224 ) (-504 -88 224 ) +4 69 (-508 -104 224 ) (-508 -104 80 ) (-504 -104 80 ) (-504 -104 224 ) +4 69 (-508 -104 80 ) (-508 -104 224 ) (-508 -88 224 ) (-508 -88 80 ) +4 69 (-504 -88 224 ) (-508 -88 224 ) (-508 -104 224 ) (-504 -104 224 ) +4 69 (-504 -104 80 ) (-508 -104 80 ) (-508 -88 80 ) (-504 -88 80 ) +4 70 (-512 -384 240 ) (-512 -120 240 ) (-512 -120 64 ) (-512 -384 64 ) +4 70 (-512 -120 240 ) (-508 -120 240 ) (-508 -120 64 ) (-512 -120 64 ) +4 70 (-508 -120 240 ) (-504 -120 240 ) (-504 -120 64 ) (-508 -120 64 ) +4 70 (-512 -384 64 ) (-504 -392 64 ) (-504 -392 240 ) (-512 -384 240 ) +4 71 (-512 0 8 ) (-504 0 8 ) (-504 -392 8 ) (-512 -384 8 ) +4 71 (-512 0 8 ) (-512 -384 8 ) (-512 -384 64 ) (-512 0 64 ) +4 71 (-508 -120 64 ) (-508 -72 64 ) (-512 -72 64 ) (-512 -120 64 ) +4 71 (-508 -104 64 ) (-508 -120 64 ) (-504 -120 64 ) (-504 -104 64 ) +4 71 (-508 -88 64 ) (-504 -88 64 ) (-504 -72 64 ) (-508 -72 64 ) +4 71 (-508 -88 64 ) (-508 -104 64 ) (-504 -104 64 ) (-504 -88 64 ) +4 71 (-504 -392 8 ) (-504 -392 64 ) (-512 -384 64 ) (-512 -384 8 ) +4 72 (-8 -704 0 ) (0 -704 0 ) (0 -704 8 ) (-8 -704 8 ) +4 72 (0 -704 0 ) (-8 -704 0 ) (-8 -584 0 ) (0 -584 0 ) +4 72 (0 -584 8 ) (0 -584 0 ) (-8 -584 0 ) (-8 -584 8 ) +4 73 (-96 -704 0 ) (-8 -704 0 ) (-8 -704 8 ) (-96 -704 8 ) +4 73 (-448 -352 8 ) (-448 0 8 ) (-448 0 0 ) (-448 -352 0 ) +5 73 (-8 -704 0 ) (-96 -704 0 ) (-448 -352 0 ) (-448 0 0 ) (-8 0 0 ) +4 73 (-8 0 8 ) (-8 -584 8 ) (-8 -584 0 ) (-8 0 0 ) +4 73 (-448 -352 8 ) (-448 -352 0 ) (-96 -704 0 ) (-96 -704 8 ) diff --git a/fakk/maps/example/patrol.pth b/fakk/maps/example/patrol.pth new file mode 100644 index 0000000000000000000000000000000000000000..21897315f35d7df17b41f2d1047f83a65f4c934e GIT binary patch literal 12654 zcmb7LTZkoB72Pv^@9oF*``x!+)$i`<$Mp2O71Wtd;zvXTLHtoN=->o{6DC3YP${uR z1;G(P{1`CcfFScRgb2apV_xwqNIpaj2)^2{L{Z3(VLCp41uDp2d(^s!()iZj9lDPYv9&LKy?kBH*@#4H3 zz5hLE==d+xJtKFuWk;TxGv{S44%Be7*t`H0@Sq!!2^?V>-&te1k z~k&HK8DS2hn6hnq<8yMl9#gB>UV(cmL6HVmG#>CKrz@Y9GmgV_zq2^ za)#J#fM7n5A2%@98qqT_zoJJLGoluKo4}qoFNek(_?{*9DQ7XK{zMHa;PUSWpiOa0PD zxU`da8;D`TIe@X%b2{IFK=pZJYZZPCQJ|y;kH6Nv=%T} ztd@zbD#W%Od0VMPteq~>PPe?A=a`m9Jh*xLoa*3L6U4*2!SPViO09WpwT5)o&*XE1 zo7_8>=U6Y_ndeg11M`U<*>T#b*YJ%A{1T2CvENRxwdJ|M%rW{nN3eC~xzx*d=gZgi zJ^6mq)IaFfn$3eQ_g-xuzBH*Q_gld^0o>b2{&8X~VT3-q2=|@> z7emxfY_cyeI5x5Jhw@%VZ#w+-#c*G$w^HC9o?8&ZPTo_F){>Lo>iTZNabLch!K}s8 zb`Irp8NIcQzu@BL_I}mDmnIv^kq41(?N273Ff_AJR{EI1k!`SCu&`Xzm?aUI>}?Me@FEmd~5=a&jjZL_;-k4E|KT) zvbf_Yj?s53c?Ox1D98xnw^ci-!HA? zxv5;_m~=5JA9uJ|&tvk#ygmg~mEY&}DaY|*`!TBcV!Nt(_}&EE-&F2D3*uhUN<$>} zMhKVU^P2TM=9W(pRbB3Nj{N!SvDVGzu5rDFk4?Z)*BkLigE*p{f?v{>hRFCDaWSXm zTiuvU^;MU9o#U6i{+*D2xcUf9P0Bkus*2)^`3Wrs-tU5+W{ zf*(`;2#wV_mrIPkCyMhz1pTD^%3FTESUyI1ANNVsBPLA1z59`F;e4c~X?8a5{@5E6 zzrU*D=jhpgi_!OldQr`ml?eJt!f{@HF4@BPjq>2`K0i*W4!$=5_l;ogWvw(uVy{}n z7NL)E%H`WG=A`_*{LQQP<*sRMAHFov`AQapxgd8KVxXIFkhIi6^}>|8Ue z*O4A3;CSokG`U4%+KX+bIF4fUF{`UpAD0CZlZ)ipVMl)IZD&{CB>LKif8FQGIn}|( zCgA?3VD2TYq$@mcU$cbE0$D%r%B$XXeB*0g`-RU;?mjpTW{j_h*nfs%_CE`(=J(|i zlLOOkZePVb0lkmQg6iP|6L5L`VQB1u3!6ii$+Oi8;dq|p$qo50^~*cje|8)#CU}gA z?x`r33eD}9lb^rx;*IOi>8tRDK<$~9Vw4ysQ|3f5HAg5vNmBV7F~Lf)ofz$$C+)zU zt_hY@2bY?_1h?sMYM5ZFRsm}?VoUL@^+`(r(_xdvPdwq z9I{DPf)`27*&=v+HrZ5OhzS$eBs{OeCM$&F9O2034mL+D5iS>~P5k+Ji`WV_Io2Z^ zCs^wtR!nr)Qs1D4&YLY-X@$h<2En`~{-+aQbMq$_Vepv=u)TFT6dUsAI>E3??7T*} zTx^2bU59LIzm4@XFo%yje(yQ+h4Oz_2rz6J{XVi#OW8J~OF4q2nm{4R%Q@4Ujj_gL2!o zbJ9gG`HJD7I9`(SzTA7LciH~f3Vo@a>tePbE_lK@+ryr-Bug1?f(SneQS W5&J*@ literal 0 HcmV?d00001 diff --git a/fakk/maps/example/patrol.scr b/fakk/maps/example/patrol.scr new file mode 100644 index 0000000..59a30d8 --- /dev/null +++ b/fakk/maps/example/patrol.scr @@ -0,0 +1,18 @@ +waitforplayer +start: + +$creeper1 thread creeper_thread +$creeper1 setidlethread creeper_thread + +end + +creeper_thread: + +local.self walkto $patrol1 +waitFor local.self +local.self walkto $patrol2 +waitFor local.self +goto creeper_thread + +end + diff --git a/fakk/maps/example/pickup.bsp b/fakk/maps/example/pickup.bsp new file mode 100644 index 0000000000000000000000000000000000000000..a2f8625e5eaeef74780f1bb7944ea556b812acee GIT binary patch literal 98436 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 literal 0 HcmV?d00001 diff --git a/fakk/maps/example/pickup.scr b/fakk/maps/example/pickup.scr new file mode 100644 index 0000000..2c4dfe3 --- /dev/null +++ b/fakk/maps/example/pickup.scr @@ -0,0 +1,25 @@ +waitforplayer +start: + +$shgliek1 idle STILL + +end + +dude_go_thread: + +$dude thread dude_AIthread + +end + +dude_AIthread: +local.self pickupent $shgliek1 shgliek_pickup +waitFor local.self +local.self walkto $dude_dest walk_shgliek +waitFor local.self +local.self throwent shgliek_toss +waitFor local.self +local.self idle STAND_IDLE + +end + + diff --git a/fakk/maps/example/pushobject.bsp b/fakk/maps/example/pushobject.bsp new file mode 100644 index 0000000000000000000000000000000000000000..8ea5013f1841524e8985d75243f965020b589138 GIT binary patch literal 95140 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 Hsm=cjSug)4 literal 0 HcmV?d00001 diff --git a/fakk/maps/example/pushobject.map b/fakk/maps/example/pushobject.map new file mode 100644 index 0000000..9a02b14 --- /dev/null +++ b/fakk/maps/example/pushobject.map @@ -0,0 +1,454 @@ +{ +"classname" "worldspawn" +// brush 0 +{ +( -480 -512 64 ) ( -480 -544 64 ) ( 224 -544 64 ) eden/edenmetalwall -31 31 -90.00 1 1 0 0 0 +( 224 -512 96 ) ( -480 -512 96 ) ( -480 -512 64 ) eden/edenmetalwall -32 62 0.00 1.000008 1 0 0 0 +( -480 -512 96 ) ( -480 -544 96 ) ( -480 -544 64 ) eden/edenmetalwall -33 63 -180.00 1 -1 0 0 0 +( -480 -544 96 ) ( 224 -544 96 ) ( 224 -544 64 ) eden/edenmetalwall -32 62 0.00 1.000008 1 0 0 0 +( -56 -544 128 ) ( -56 -512 128 ) ( 72 -512 128 ) eden/edenmetalwall -32 62 0.00 1.000008 1 0 0 0 +( -64 -544 256 ) ( -64 -512 256 ) ( -64 -544 0 ) eden/edenmetalwall -32 62 0.00 1.000008 1 0 0 0 +} +// brush 1 +{ +( -480 -512 64 ) ( -480 -544 64 ) ( 224 -544 64 ) eden/edenmetalwall -31 31 -90.00 1 1 0 0 0 +( 224 -544 96 ) ( 224 -512 96 ) ( 224 -512 64 ) eden/edenmetalwall -32 63 -180.00 1 -1 0 0 0 +( 224 -512 96 ) ( -480 -512 96 ) ( -480 -512 64 ) eden/edenmetalwall -32 62 0.00 1.000008 1 0 0 0 +( -480 -544 96 ) ( 224 -544 96 ) ( 224 -544 64 ) eden/edenmetalwall -32 62 0.00 1.000008 1 0 0 0 +( -56 -544 128 ) ( -56 -512 128 ) ( 72 -512 128 ) eden/edenmetalwall -32 62 0.00 1.000008 1 0 0 0 +( 64 -512 256 ) ( 64 -544 256 ) ( 64 -512 0 ) eden/edenmetalwall -32 62 0.00 1.000008 1 0 0 0 +} +// brush 2 +{ +( 224 -544 320 ) ( -480 -544 320 ) ( -480 -512 320 ) eden/edenmetalwall -32 62 0.00 1.000008 1 0 0 0 +( 224 -544 96 ) ( 224 -512 96 ) ( 224 -512 64 ) eden/edenmetalwall -32 62 0.00 1.000008 1 0 0 0 +( 224 -512 96 ) ( -480 -512 96 ) ( -480 -512 64 ) eden/edenmetalwall -32 62 0.00 1.000008 1 0 0 0 +( -480 -512 96 ) ( -480 -544 96 ) ( -480 -544 64 ) eden/edenmetalwall -32 62 0.00 1.000008 1 0 0 0 +( -480 -544 96 ) ( 224 -544 96 ) ( 224 -544 64 ) eden/edenmetalwall -32 62 0.00 1.000008 1 0 0 0 +( -56 -512 128 ) ( -56 -544 128 ) ( 72 -512 128 ) eden/edenmetalwall -32 62 0.00 1.000008 1 0 0 0 +} +// brush 3 +{ +( -480 -512 0 ) ( -480 -544 0 ) ( 224 -544 0 ) eden/bedtrim -32 0 0.00 1 1 0 0 0 +( 224 -544 64 ) ( -480 -544 64 ) ( -480 -512 64 ) eden/bedtrim -32 0 0.00 1 1 0 0 0 +( 224 -512 256 ) ( -480 -512 256 ) ( -480 -512 0 ) eden/bedtrim -32 0 0.00 1 1 0 0 0 +( -480 -512 256 ) ( -480 -544 256 ) ( -480 -544 0 ) eden/bedtrim -32 0 0.00 1 1 0 0 0 +( -480 -544 256 ) ( 224 -544 256 ) ( 224 -544 0 ) eden/bedtrim -32 0 0.00 1 1 0 0 0 +( -64 -544 256 ) ( -64 -512 256 ) ( -64 -544 0 ) eden/bedtrim -32 0 0.00 1 1 0 0 0 +} +// brush 4 +{ +( -480 -512 0 ) ( -480 -544 0 ) ( 224 -544 0 ) eden/bedtrim -31 32 -90.00 1 1 0 0 0 +( 224 -544 64 ) ( -480 -544 64 ) ( -480 -512 64 ) eden/bedtrim -31 32 -90.00 1 1 0 0 0 +( 224 -544 256 ) ( 224 -512 256 ) ( 224 -512 0 ) eden/bedtrim -32 0 -180.00 1 -1 0 0 0 +( 224 -512 256 ) ( -480 -512 256 ) ( -480 -512 0 ) eden/bedtrim -32 0 0.00 1 1 0 0 0 +( -480 -544 256 ) ( 224 -544 256 ) ( 224 -544 0 ) eden/bedtrim -32 0 0.00 1 1 0 0 0 +( 64 -512 256 ) ( 64 -544 256 ) ( 64 -512 0 ) eden/bedtrim -32 0 0.00 1 1 0 0 0 +} +// brush 5 +{ +( -480 -768 0 ) ( -480 -800 0 ) ( 224 -800 0 ) eden/bedtrim -31 32 -90.00 1 1 0 0 0 +( 224 -800 64 ) ( -480 -800 64 ) ( -480 -768 64 ) eden/bedtrim -31 32 -90.00 1 1 0 0 0 +( 224 -800 256 ) ( 224 -768 256 ) ( 224 -768 0 ) eden/bedtrim -32 0 -180.00 1 -1 0 0 0 +( 224 -768 256 ) ( -480 -768 256 ) ( -480 -768 0 ) eden/bedtrim -32 0 0.00 1 1 0 0 0 +( -480 -768 256 ) ( -480 -800 256 ) ( -480 -800 0 ) eden/bedtrim -33 0 -180.00 1 -1 0 0 0 +( -480 -800 256 ) ( 224 -800 256 ) ( 224 -800 0 ) eden/bedtrim -32 0 0.00 1 1 0 0 0 +} +// brush 6 +{ +( -480 -768 64 ) ( -480 -800 64 ) ( 224 -800 64 ) eden/edenmetalwall -31 31 -90.00 1 1 0 0 0 +( 224 -800 320 ) ( -480 -800 320 ) ( -480 -768 320 ) eden/edenmetalwall -31 31 -90.00 1 1 0 0 0 +( 224 -800 96 ) ( 224 -768 96 ) ( 224 -768 64 ) eden/edenmetalwall -32 62 -180.00 1 -1 0 0 0 +( 224 -768 96 ) ( -480 -768 96 ) ( -480 -768 64 ) eden/edenmetalwall -31 62 0.00 1.000008 1 0 0 0 +( -480 -768 96 ) ( -480 -800 96 ) ( -480 -800 64 ) eden/edenmetalwall -33 62 -180.00 1 -1 0 0 0 +( -480 -800 96 ) ( 224 -800 96 ) ( 224 -800 64 ) eden/edenmetalwall -31 62 0.00 1.000008 1 0 0 0 +} +// brush 7 +{ +( 64 -96 0 ) ( 0 -96 0 ) ( 0 -224 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( 0 -224 96 ) ( 0 -96 96 ) ( 64 -96 96 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( 8 -256 96 ) ( 72 -256 96 ) ( 72 -256 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( 64 -224 96 ) ( 64 -96 96 ) ( 64 -96 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( 72 -64 96 ) ( 8 -64 96 ) ( 8 -64 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( 0 -96 96 ) ( 0 -224 96 ) ( 0 -224 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +} +// brush 8 +{ +( 224 192 0 ) ( 224 224 0 ) ( -480 224 0 ) eden/bedtrim -224 -32 90.00 1 1 0 0 0 +( -480 224 64 ) ( 224 224 64 ) ( 224 192 64 ) eden/bedtrim -224 -32 90.00 1 1 0 0 0 +( -480 224 256 ) ( -480 192 256 ) ( -480 192 0 ) eden/bedtrim -224 0 0.00 1 1 0 0 0 +( -480 192 256 ) ( 224 192 256 ) ( 224 192 0 ) common/skip 0 0 0.00 1 1 805306368 16512 0 +( 224 224 256 ) ( -480 224 256 ) ( -480 224 0 ) eden/bedtrim 224 0 -180.00 1 -1 0 0 0 +( -416 224 0 ) ( -416 192 0 ) ( -416 208 64 ) eden/bedtrim 224 0 -180.00 1 -1 0 0 0 +} +// brush 9 +{ +( 224 192 0 ) ( 224 224 0 ) ( -480 224 0 ) eden/bedtrim -224 -32 90.00 1 1 0 0 0 +( -480 224 64 ) ( 224 224 64 ) ( 224 192 64 ) eden/bedtrim -224 -32 90.00 1 1 0 0 0 +( -480 192 256 ) ( 224 192 256 ) ( 224 192 0 ) eden/bedtrim 224 0 -180.00 1 -1 0 0 0 +( 224 192 256 ) ( 224 224 256 ) ( 224 224 0 ) eden/bedtrim -224 0 0.00 1 1 0 0 0 +( 224 224 256 ) ( -480 224 256 ) ( -480 224 0 ) eden/bedtrim 224 0 -180.00 1 -1 0 0 0 +( -480 192 0 ) ( -480 224 0 ) ( -480 208 64 ) eden/bedtrim 224 0 -180.00 1 -1 0 0 0 +} +// brush 10 +{ +( 224 192 64 ) ( 224 224 64 ) ( -480 224 64 ) eden/edenmetalwall -224 -224 90.00 1 1 0 0 0 +( -480 224 320 ) ( 224 224 320 ) ( 224 192 320 ) eden/edenmetalwall -224 -224 90.00 1 1 0 0 0 +( -480 224 96 ) ( -480 192 96 ) ( -480 192 64 ) eden/edenmetalwall -224 64 0.00 1 1 0 0 0 +( -480 192 96 ) ( 224 192 96 ) ( 224 192 64 ) common/skip 0 0 0.00 1 1 805306368 16512 0 +( 224 224 96 ) ( -480 224 96 ) ( -480 224 64 ) eden/edenmetalwall 224 63 -180.00 1 -1 0 0 0 +( -416 224 64 ) ( -416 192 64 ) ( -416 208 320 ) eden/edenmetalwall 224 63 -180.00 1 -1 0 0 0 +} +// brush 11 +{ +( 224 192 64 ) ( 224 224 64 ) ( -480 224 64 ) eden/edenmetalwall -224 -224 90.00 1 1 0 0 0 +( -480 224 320 ) ( 224 224 320 ) ( 224 192 320 ) eden/edenmetalwall -224 -224 90.00 1 1 0 0 0 +( -480 192 96 ) ( 224 192 96 ) ( 224 192 64 ) eden/edenmetalwall 224 63 -180.00 1 -1 0 0 0 +( 224 192 96 ) ( 224 224 96 ) ( 224 224 64 ) eden/edenmetalwall -224 64 0.00 1 1 0 0 0 +( 224 224 96 ) ( -480 224 96 ) ( -480 224 64 ) eden/edenmetalwall 224 63 -180.00 1 -1 0 0 0 +( -480 192 64 ) ( -480 224 64 ) ( -480 208 320 ) eden/edenmetalwall 224 63 -180.00 1 -1 0 0 0 +} +// brush 12 + { + patchDef2 + { + eden/edenmetalwall + ( 3 3 0 536870912 0 ) +( +( ( -480 96 63.999992 0 0 ) ( -480 96 192 0 0.500000 ) ( -480 96 320 0 1 ) ) +( ( -384 96 63.999992 0.500000 0 ) ( -384 96 192 0.500000 0.500000 ) ( -384 96 320 0.500000 1 ) ) +( ( -384 192 63.999992 1 0 ) ( -384 192 192 1 0.500000 ) ( -384 192 320 1 1 ) ) +) + } + } +// brush 13 +{ +( -480 192 0 ) ( -512 192 0 ) ( -512 -512 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -512 -512 64 ) ( -512 192 64 ) ( -480 192 64 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -480 -512 256 ) ( -480 192 256 ) ( -480 192 0 ) common/skip 0 0 0.00 1 1 805306368 16512 0 +( -480 192 256 ) ( -512 192 256 ) ( -512 192 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -512 192 256 ) ( -512 -512 256 ) ( -512 -512 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -480 128 0 ) ( -512 128 0 ) ( -496 128 64 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +} +// brush 14 +{ +( -480 192 0 ) ( -512 192 0 ) ( -512 -512 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -512 -512 64 ) ( -512 192 64 ) ( -480 192 64 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -504 -800 256 ) ( -472 -800 256 ) ( -472 -800 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -480 -512 256 ) ( -480 192 256 ) ( -480 192 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -512 192 256 ) ( -512 -512 256 ) ( -512 -512 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -512 192 0 ) ( -480 192 0 ) ( -496 192 64 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +} +// brush 15 +{ +( -480 192 64 ) ( -512 192 64 ) ( -512 -512 64 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +( -512 -512 320 ) ( -512 192 320 ) ( -480 192 320 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +( -480 -512 96 ) ( -480 192 96 ) ( -480 192 64 ) common/skip 0 0 0.00 1 1 805306368 16512 0 +( -480 192 96 ) ( -512 192 96 ) ( -512 192 64 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +( -512 192 96 ) ( -512 -512 96 ) ( -512 -512 64 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +( -480 128 64 ) ( -512 128 64 ) ( -496 128 320 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +} +// brush 16 +{ +( -480 192 64 ) ( -512 192 64 ) ( -512 -512 64 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +( -512 -512 320 ) ( -512 192 320 ) ( -480 192 320 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +( -512 -800 96 ) ( -480 -800 96 ) ( -480 -800 64 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +( -480 -512 96 ) ( -480 192 96 ) ( -480 192 64 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +( -512 192 96 ) ( -512 -512 96 ) ( -512 -512 64 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +( -512 192 64 ) ( -480 192 64 ) ( -496 192 320 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +} +// brush 17 + { + patchDef2 + { + eden/bedtrim + ( 3 3 0 536870912 0 ) +( +( ( -480 96 0 0 0 ) ( -480 96 32 0 0.500000 ) ( -480 96 64 0 1 ) ) +( ( -384 96 0 0.500000 0 ) ( -384 96 32 0.500000 0.500000 ) ( -384 96 64 0.500000 1 ) ) +( ( -384 192 0 1 0 ) ( -384 192 32 1 0.500000 ) ( -384 192 64 1 1 ) ) +) + } + } +// brush 18 +{ +( 96 96 352 ) ( -32 96 352 ) ( -32 -416 352 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( -32 -416 416 ) ( -32 96 416 ) ( 96 96 416 ) we_cemetary_test/levelord_sky 0 0 0.00 1 1 0 0 0 +( -32 -416 416 ) ( 96 -416 416 ) ( 96 -416 352 ) we_cemetary_test/levelord_sky 0 0 0.00 1 1 0 0 0 +( 96 -416 416 ) ( 96 96 416 ) ( 96 96 352 ) we_cemetary_test/levelord_sky 0 0 0.00 1 1 0 0 0 +( 96 96 416 ) ( -32 96 416 ) ( -32 96 352 ) we_cemetary_test/levelord_sky 0 0 0.00 1 1 0 0 0 +( -32 96 416 ) ( -32 -416 416 ) ( -32 -416 352 ) we_cemetary_test/levelord_sky 0 0 0.00 1 1 0 0 0 +} +// brush 19 +{ +( -64 -416 304 ) ( -64 -448 304 ) ( 128 -448 304 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( 128 -448 352 ) ( -64 -448 352 ) ( -64 -416 352 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( 96 -416 352 ) ( -32 -416 352 ) ( -32 -416 320 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( 128 -448 352 ) ( 96 -416 352 ) ( 96 -416 320 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( -64 -448 320 ) ( -64 -448 352 ) ( 128 -448 352 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( -64 -448 320 ) ( -32 -416 320 ) ( -32 -416 352 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +} +// brush 20 +{ +( -32 128 304 ) ( -64 128 304 ) ( -64 -64 304 ) eden/FL_edenhouse 0 32 90.00 1 1 0 0 0 +( -64 -64 352 ) ( -64 128 352 ) ( -32 128 352 ) eden/FL_edenhouse 0 32 90.00 1 1 0 0 0 +( -32 -32 352 ) ( -32 96 352 ) ( -32 96 320 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( -64 -448 352 ) ( -32 -416 352 ) ( -32 -416 320 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( -64 128 320 ) ( -64 128 352 ) ( -64 -64 352 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( -64 128 320 ) ( -32 96 320 ) ( -32 96 352 ) eden/FL_edenhouse -64 0 -180.00 1 -1 0 0 0 +} +// brush 21 +{ +( 128 -64 304 ) ( 128 128 304 ) ( 96 128 304 ) eden/FL_edenhouse 0 -96 90.00 1 1 0 0 0 +( 96 128 352 ) ( 128 128 352 ) ( 128 -64 352 ) eden/FL_edenhouse 0 -96 90.00 1 1 0 0 0 +( 96 96 320 ) ( 96 96 352 ) ( 96 -32 352 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( 96 -416 320 ) ( 96 -416 352 ) ( 128 -448 352 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( 128 -64 352 ) ( 128 128 352 ) ( 128 128 320 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( 96 96 352 ) ( 96 96 320 ) ( 128 128 320 ) eden/FL_edenhouse -64 0 -180.00 1 -1 0 0 0 +} +// brush 22 +{ +( 128 128 304 ) ( -64 128 304 ) ( -64 96 304 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( -64 96 352 ) ( -64 128 352 ) ( 128 128 352 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( -32 96 320 ) ( -32 96 352 ) ( 96 96 352 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( 96 96 320 ) ( 96 96 352 ) ( 128 128 352 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( 128 128 352 ) ( -64 128 352 ) ( -64 128 320 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( -32 96 352 ) ( -32 96 320 ) ( -64 128 320 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +} +// brush 23 +{ +( 128 192 320 ) ( -64 192 320 ) ( -64 128 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( -64 128 352 ) ( -64 192 352 ) ( 128 192 352 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( -64 128 352 ) ( 128 128 352 ) ( 128 128 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( 128 128 352 ) ( 128 192 352 ) ( 128 192 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( 128 192 352 ) ( -64 192 352 ) ( -64 192 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( -64 192 352 ) ( -64 128 352 ) ( -64 128 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +} +// brush 24 +{ +( 192 192 320 ) ( 128 192 320 ) ( 128 -448 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( 128 -448 352 ) ( 128 192 352 ) ( 192 192 352 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( 128 -448 352 ) ( 192 -448 352 ) ( 192 -448 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( 192 -448 352 ) ( 192 192 352 ) ( 192 192 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( 192 192 352 ) ( 128 192 352 ) ( 128 192 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( 128 192 352 ) ( 128 -448 352 ) ( 128 -448 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +} +// brush 25 +{ +( 192 192 320 ) ( -480 192 320 ) ( -480 -512 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( -480 -512 352 ) ( -480 192 352 ) ( 192 192 352 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( -480 -768 352 ) ( 192 -768 352 ) ( 192 -768 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( 192 -512 352 ) ( 192 192 352 ) ( 192 192 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( 224 -448 352 ) ( -448 -448 352 ) ( -448 -448 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( -64 -512 320 ) ( -64 -384 320 ) ( -64 -448 352 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +} +// brush 26 +{ +( 192 192 320 ) ( -480 192 320 ) ( -480 -512 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( -480 -512 352 ) ( -480 192 352 ) ( 192 192 352 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( -480 -768 352 ) ( 192 -768 352 ) ( 192 -768 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( 192 192 352 ) ( -480 192 352 ) ( -480 192 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( -480 192 352 ) ( -480 -512 352 ) ( -480 -512 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( -64 -384 320 ) ( -64 -512 320 ) ( -64 -448 352 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +} +// brush 27 +{ +( 192 192 -32 ) ( -480 192 -32 ) ( -480 -512 -32 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( -480 -512 0 ) ( -480 192 0 ) ( 192 192 0 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( -464 -768 224 ) ( 208 -768 224 ) ( 208 -768 -32 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 192 -512 224 ) ( 192 192 224 ) ( 192 192 -32 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 192 192 224 ) ( -480 192 224 ) ( -480 192 -32 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( -480 192 224 ) ( -480 -512 224 ) ( -480 -512 -32 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +} +// brush 28 +{ +( 192 -512 0 ) ( 224 -512 0 ) ( 224 192 0 ) eden/bedtrim 160 0 -180.00 1 1 0 0 0 +( 224 192 64 ) ( 224 -512 64 ) ( 192 -512 64 ) eden/bedtrim 160 0 -180.00 1 1 0 0 0 +( 224 192 256 ) ( 192 192 256 ) ( 192 192 0 ) eden/bedtrim 160 0 -180.00 1 -1 0 0 0 +( 192 192 256 ) ( 192 -512 256 ) ( 192 -512 0 ) eden/bedtrim -64 0 -180.00 1 -1 0 0 0 +( 208 -768 256 ) ( 240 -768 256 ) ( 240 -768 0 ) eden/bedtrim 159 0 -180.00 1 -1 0 0 0 +( 224 -512 256 ) ( 224 192 256 ) ( 224 192 0 ) eden/bedtrim -64 0 -180.00 1 -1 0 0 0 +} +// brush 29 +{ +( 192 -512 64 ) ( 224 -512 64 ) ( 224 192 64 ) eden/edenmetalwall 160 63 -180.00 1 1 0 0 0 +( 224 192 320 ) ( 224 -512 320 ) ( 192 -512 320 ) eden/edenmetalwall 160 63 -180.00 1 1 0 0 0 +( 224 192 96 ) ( 192 192 96 ) ( 192 192 64 ) eden/edenmetalwall 160 64 -180.00 1 -1 0 0 0 +( 192 -96 96 ) ( 192 -800 96 ) ( 192 -800 64 ) eden/edenmetalwall -64 62 -180.00 1 -1 0 0 0 +( 192 -768 96 ) ( 224 -768 96 ) ( 224 -768 64 ) eden/edenmetalwall 159 64 -180.00 1 -1 0 0 0 +( 224 -512 96 ) ( 224 192 96 ) ( 224 192 64 ) eden/edenmetalwall -64 62 -180.00 1 -1 0 0 0 +} +} +// entity 1 +{ +"classname" "func_door" +"angle" "0" +"targetname" "t1" +// brush 0 +{ +( 72 -512 0 ) ( -56 -512 0 ) ( -56 -544 0 ) eden/WL_edendoor2 -64 0 0.00 1 1 0 0 0 +( -56 -544 128 ) ( -56 -512 128 ) ( 72 -512 128 ) eden/WL_edendoor2 -64 0 0.00 1 1 0 0 0 +( -64 -536 256 ) ( 64 -536 256 ) ( 64 -536 0 ) eden/WL_edendoor2 -64 0 0.00 1 1 0 0 0 +( 64 -536 256 ) ( 64 -504 256 ) ( 64 -504 0 ) eden/WL_edendoor2 0 0 0.00 1 1 0 0 0 +( 72 -520 256 ) ( -56 -520 256 ) ( -56 -520 0 ) eden/WL_edendoor2 -64 0 0.00 1 1 0 0 0 +( 0 -528 256 ) ( 0 -560 256 ) ( 0 -560 0 ) eden/WL_edendoor2 0 0 0.00 1 1 0 0 0 +} +} +// entity 2 +{ +"classname" "func_door" +"angle" "180" +"targetname" "t1" +// brush 0 +{ +( 72 -520 0 ) ( -56 -520 0 ) ( -56 -552 0 ) eden/WL_edendoor2 -64 -8 0.00 1 1 0 0 0 +( -56 -552 128 ) ( -56 -520 128 ) ( 72 -520 128 ) eden/WL_edendoor2 -64 -8 0.00 1 1 0 0 0 +( -56 -536 256 ) ( 72 -536 256 ) ( 72 -536 0 ) eden/WL_edendoor2 -64 0 0.00 1 1 0 0 0 +( 0 -544 256 ) ( 0 -512 256 ) ( 0 -512 0 ) eden/WL_edendoor2 8 0 0.00 1 1 0 0 0 +( 64 -520 256 ) ( -64 -520 256 ) ( -64 -520 0 ) eden/WL_edendoor2 -64 0 0.00 1 1 0 0 0 +( -64 -520 256 ) ( -64 -552 256 ) ( -64 -552 0 ) eden/WL_edendoor2 8 0 0.00 1 1 0 0 0 +} +} +// entity 3 +{ +"classname" "trigger_pushobject" +"message" "Got me!" +// brush 0 +{ +( 184 184 0 ) ( 168 184 0 ) ( 168 160 0 ) common/trigger 0 0 0.00 1 1 0 128 0 +( 168 160 192 ) ( 168 184 192 ) ( 184 184 192 ) common/trigger 0 0 0.00 1 1 0 128 0 +( 176 176 8 ) ( 192 176 8 ) ( 192 176 0 ) common/trigger 0 0 0.00 1 1 0 128 0 +( 192 168 8 ) ( 192 192 8 ) ( 192 192 0 ) common/trigger 0 0 0.00 1 1 0 128 0 +( 192 192 8 ) ( 176 192 8 ) ( 176 192 0 ) common/trigger 0 0 0.00 1 1 0 128 0 +( 176 200 8 ) ( 176 176 8 ) ( 176 176 0 ) common/trigger 0 0 0.00 1 1 0 128 0 +} +} +// entity 4 +{ +"classname" "func_pushobject" +// brush 0 +{ +( -176 16 96 ) ( -176 -16 96 ) ( -208 -16 96 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -256 -64 0 ) ( -128 -64 0 ) ( -128 64 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -208 -16 96 ) ( -176 -16 96 ) ( -128 -64 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -176 -16 96 ) ( -176 16 96 ) ( -128 64 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -176 16 96 ) ( -208 16 96 ) ( -256 64 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -208 16 96 ) ( -208 -16 96 ) ( -256 -64 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +} +} +// entity 5 +{ +"targetname" "box1" +"classname" "func_pushobject" +// brush 0 +{ +( -72 -128 0 ) ( -256 -128 0 ) ( -256 -272 0 ) otto/ottocrate 0 0 0.00 1 1 0 0 0 +( -256 -272 128 ) ( -256 -128 128 ) ( -72 -128 128 ) otto/ottocrate 0 0 0.00 1 1 0 0 0 +( -312 -256 8 ) ( -128 -256 8 ) ( -128 -256 0 ) otto/ottocrate 0 0 0.00 1 1 0 0 0 +( -128 -256 8 ) ( -128 -112 8 ) ( -128 -112 0 ) otto/ottocrate 0 0 0.00 1 1 0 0 0 +( -72 -128 8 ) ( -256 -128 8 ) ( -256 -128 0 ) otto/ottocrate 0 0 0.00 1 1 0 0 0 +( -256 -128 8 ) ( -256 -272 8 ) ( -256 -272 0 ) otto/ottocrate 0 0 0.00 1 1 0 0 0 +} +} +// entity 6 +{ +"classname" "script_object" +"targetname" "movinlight2" +// brush 0 +{ +( 16 -368 144 ) ( 0 -368 144 ) ( 0 -384 144 ) common/skip 32 16 0.00 1 1 805306368 16512 0 +( 0 -384 160 ) ( 0 -368 160 ) ( 16 -368 160 ) common/skip 32 16 0.00 1 1 805306368 16512 0 +( 0 -384 240 ) ( 16 -384 240 ) ( 16 -384 144 ) common/skip 32 -48 0.00 1 1 805306368 16512 0 +( 16 -384 240 ) ( 16 -368 240 ) ( 16 -368 144 ) common/skip -16 -48 0.00 1 1 805306368 16512 0 +( 16 -368 240 ) ( 0 -368 240 ) ( 0 -368 144 ) common/skip 32 -48 0.00 1 1 805306368 16512 0 +( 0 -368 240 ) ( 0 -384 240 ) ( 0 -384 144 ) common/skip -16 -48 0.00 1 1 805306368 16512 0 +} +} +// entity 7 +{ +"classname" "script_object" +"targetname" "movinlight1" +// brush 0 +{ +( -344 64 144 ) ( -360 64 144 ) ( -360 48 144 ) common/skip 0 0 0.00 1 1 805306368 16512 0 +( -360 48 160 ) ( -360 64 160 ) ( -344 64 160 ) common/skip 0 0 0.00 1 1 805306368 16512 0 +( -360 48 240 ) ( -344 48 240 ) ( -344 48 144 ) common/skip 0 -48 0.00 1 1 805306368 16512 0 +( -344 48 240 ) ( -344 64 240 ) ( -344 64 144 ) common/skip 0 -48 0.00 1 1 805306368 16512 0 +( -344 64 240 ) ( -360 64 240 ) ( -360 64 144 ) common/skip 0 -48 0.00 1 1 805306368 16512 0 +( -360 64 240 ) ( -360 48 240 ) ( -360 48 144 ) common/skip 0 -48 0.00 1 1 805306368 16512 0 +} +} +// entity 8 +{ +"_color" "1.000000 0.724409 0.523622" +"light" "200" +"origin" "-352 56 168" +"spawnflags" "0" +"classname" "light" +} +// entity 9 +{ +"origin" "-432 -464 24" +"angle" "45" +"classname" "info_player_start" +} +// entity 10 +{ +"_color" "0.629921 0.846457 1.000000" +"light" "200" +"classname" "light" +"spawnflags" "0" +"origin" "8 56 168" +} +// entity 11 +{ +"light" "200" +"classname" "light" +"spawnflags" "0" +"origin" "-344 -376 168" +} +// entity 12 +{ +"light" "200" +"origin" "8 -376 168" +"spawnflags" "0" +"classname" "light" +} +// entity 13 +{ +"origin" "-168 -160 168" +"spawnflags" "0" +"classname" "light" +"light" "200" +} +// entity 14 +{ +"triggername" "box1" +"classname" "trigger_pushobject" +"cnt" "-1" +"message" "Got me!" +"target" "t1" +// brush 0 +{ +( 184 -504 0 ) ( 168 -504 0 ) ( 168 -528 0 ) common/trigger 0 -48 0.00 1 1 0 128 0 +( 168 -528 192 ) ( 168 -504 192 ) ( 184 -504 192 ) common/trigger 0 -48 0.00 1 1 0 128 0 +( 176 -512 8 ) ( 192 -512 8 ) ( 192 -512 0 ) common/trigger 0 0 0.00 1 1 0 128 0 +( 192 -520 8 ) ( 192 -496 8 ) ( 192 -496 0 ) common/trigger 48 0 0.00 1 1 0 128 0 +( 192 -496 8 ) ( 176 -496 8 ) ( 176 -496 0 ) common/trigger 0 0 0.00 1 1 0 128 0 +( 176 -488 8 ) ( 176 -512 8 ) ( 176 -512 0 ) common/trigger 48 0 0.00 1 1 0 128 0 +} +} +// entity 15 +{ +"origin" "-312 -648 168" +"spawnflags" "0" +"classname" "light" +"light" "200" +} +// entity 16 +{ +"light" "200" +"classname" "light" +"spawnflags" "0" +"origin" "-8 -648 168" +} diff --git a/fakk/maps/example/pushobject.prt b/fakk/maps/example/pushobject.prt new file mode 100644 index 0000000..1ef1d69 --- /dev/null +++ b/fakk/maps/example/pushobject.prt @@ -0,0 +1,163 @@ +PRT1 +27 +54 +105 +4 0 4 0 (128 0 304 ) (192 0 304 ) (192 0 320 ) (128 0 320 ) +4 0 3 0 (128 192 304 ) (192 192 304 ) (192 0 304 ) (128 0 304 ) +4 0 1 0 (128 192 320 ) (128 192 304 ) (128 128 304 ) (128 128 320 ) +4 1 13 0 (0 192 320 ) (0 192 304 ) (0 128 304 ) (0 128 320 ) +4 1 3 0 (0 192 304 ) (128 192 304 ) (128 128 304 ) (0 128 304 ) +4 2 14 0 (0 0 304 ) (0 0 352 ) (0 96 352 ) (0 96 304 ) +4 2 5 0 (0 0 352 ) (0 0 304 ) (96 0 304 ) (96 0 352 ) +4 2 3 0 (96 0 304 ) (0 0 304 ) (0 96 304 ) (96 96 304 ) +4 3 16 0 (0 0 0 ) (0 0 304 ) (0 192 304 ) (0 192 0 ) +4 3 8 0 (0 0 96 ) (0 0 0 ) (192 0 0 ) (192 0 96 ) +4 3 7 0 (0 0 304 ) (0 0 96 ) (192 0 96 ) (192 0 304 ) +4 4 7 0 (128 0 304 ) (192 0 304 ) (192 -448 304 ) (128 -448 304 ) +4 4 6 0 (128 -448 304 ) (192 -448 304 ) (192 -448 320 ) (128 -448 320 ) +4 5 18 0 (0 0 320 ) (0 0 304 ) (0 -416 304 ) (0 -416 320 ) +4 5 17 0 (0 -416 352 ) (0 0 352 ) (0 0 320 ) (0 -416 320 ) +4 5 7 0 (0 -416 304 ) (0 0 304 ) (96 0 304 ) (96 -416 304 ) +4 6 19 0 (0 -512 304 ) (0 -512 320 ) (0 -448 320 ) (0 -448 304 ) +4 6 7 0 (192 -512 304 ) (0 -512 304 ) (0 -448 304 ) (192 -448 304 ) +4 7 24 0 (0 -512 96 ) (0 -512 128 ) (0 0 128 ) (0 0 96 ) +4 7 22 0 (0 -512 128 ) (0 -512 304 ) (0 0 304 ) (0 0 128 ) +4 7 11 0 (0 -512 128 ) (0 -512 96 ) (64 -512 96 ) (64 -512 128 ) +4 7 10 0 (64 -512 96 ) (0 -512 96 ) (0 -256 96 ) (64 -256 96 ) +4 7 9 0 (192 -512 96 ) (64 -512 96 ) (64 -64 96 ) (192 -64 96 ) +4 7 8 0 (0 -64 96 ) (0 0 96 ) (192 0 96 ) (192 -64 96 ) +4 8 24 0 (0 -64 96 ) (0 0 96 ) (0 0 0 ) (0 -64 0 ) +4 8 9 0 (64 -64 0 ) (192 -64 0 ) (192 -64 96 ) (64 -64 96 ) +4 9 10 0 (64 -256 0 ) (64 -512 0 ) (64 -512 96 ) (64 -256 96 ) +4 10 24 0 (0 -512 0 ) (0 -512 96 ) (0 -256 96 ) (0 -256 0 ) +4 10 11 0 (0 -512 96 ) (0 -512 0 ) (64 -512 0 ) (64 -512 96 ) +4 11 25 0 (0 -512 128 ) (0 -512 0 ) (0 -544 0 ) (0 -544 128 ) +4 11 12 0 (0 -544 128 ) (0 -544 0 ) (64 -544 0 ) (64 -544 128 ) +4 12 25 0 (0 -768 0 ) (0 -768 128 ) (0 -544 128 ) (0 -544 0 ) +4 12 23 0 (0 -768 128 ) (0 -768 304 ) (0 -544 304 ) (0 -544 128 ) +4 12 21 0 (0 -768 304 ) (0 -768 320 ) (0 -544 320 ) (0 -544 304 ) +4 13 16 0 (-64 128 304 ) (-64 192 304 ) (0 192 304 ) (0 128 304 ) +4 13 15 0 (-64 192 320 ) (-64 192 304 ) (-64 128 304 ) (-64 128 320 ) +4 14 18 0 (0 0 304 ) (0 0 320 ) (-32 0 320 ) (-32 0 304 ) +4 14 17 0 (0 0 320 ) (0 0 352 ) (-32 0 352 ) (-32 0 320 ) +4 14 16 0 (0 0 304 ) (-32 0 304 ) (-32 96 304 ) (0 96 304 ) +4 15 20 0 (-480 0 320 ) (-480 0 304 ) (-64 0 304 ) (-64 0 320 ) +4 15 16 0 (-64 0 304 ) (-480 0 304 ) (-480 192 304 ) (-64 192 304 ) +4 16 24 0 (0 0 0 ) (0 0 128 ) (-480 0 128 ) (-480 0 0 ) +4 16 22 0 (0 0 128 ) (0 0 304 ) (-480 0 304 ) (-480 0 128 ) +4 17 18 0 (-32 0 320 ) (0 0 320 ) (0 -416 320 ) (-32 -416 320 ) +4 18 22 0 (-32 0 304 ) (0 0 304 ) (0 -416 304 ) (-32 -416 304 ) +4 19 22 0 (0 -448 304 ) (0 -512 304 ) (-64 -512 304 ) (-64 -448 304 ) +4 19 20 0 (-64 -448 304 ) (-64 -512 304 ) (-64 -512 320 ) (-64 -448 320 ) +4 20 22 0 (-480 -512 304 ) (-480 0 304 ) (-64 0 304 ) (-64 -512 304 ) +4 21 23 0 (0 -768 304 ) (-480 -768 304 ) (-480 -544 304 ) (0 -544 304 ) +4 22 24 0 (-480 -512 128 ) (-480 0 128 ) (0 0 128 ) (0 -512 128 ) +4 23 26 0 (-64 -768 128 ) (-480 -768 128 ) (-480 -544 128 ) (-64 -544 128 ) +4 23 25 0 (0 -768 128 ) (-64 -768 128 ) (-64 -544 128 ) (0 -544 128 ) +4 24 25 0 (-64 -512 0 ) (0 -512 0 ) (0 -512 128 ) (-64 -512 128 ) +4 25 26 0 (-64 -544 0 ) (-64 -768 0 ) (-64 -768 128 ) (-64 -544 128 ) +4 0 (128 96 304 ) (128 0 304 ) (128 0 320 ) (128 96 320 ) +4 0 (128 128 304 ) (128 96 304 ) (128 96 320 ) (128 128 320 ) +4 0 (192 0 320 ) (192 0 304 ) (192 192 304 ) (192 192 320 ) +4 0 (128 192 320 ) (192 192 320 ) (192 192 304 ) (128 192 304 ) +4 0 (192 0 320 ) (192 192 320 ) (128 192 320 ) (128 0 320 ) +4 1 (0 128 304 ) (128 128 304 ) (128 128 320 ) (0 128 320 ) +4 1 (128 192 320 ) (128 192 304 ) (0 192 304 ) (0 192 320 ) +4 1 (128 192 320 ) (0 192 320 ) (0 128 320 ) (128 128 320 ) +4 2 (96 96 352 ) (0 96 352 ) (0 0 352 ) (96 0 352 ) +4 2 (0 96 352 ) (96 96 352 ) (96 96 304 ) (0 96 304 ) +4 2 (96 0 352 ) (96 0 304 ) (96 96 304 ) (96 96 352 ) +4 3 (192 192 304 ) (192 192 0 ) (0 192 0 ) (0 192 304 ) +4 3 (192 0 304 ) (192 0 0 ) (192 192 0 ) (192 192 304 ) +4 3 (0 128 304 ) (0 96 304 ) (128 96 304 ) (128 128 304 ) +4 3 (96 96 304 ) (96 0 304 ) (128 0 304 ) (128 96 304 ) +4 3 (0 192 0 ) (192 192 0 ) (192 0 0 ) (0 0 0 ) +4 4 (128 0 304 ) (128 -448 304 ) (128 -448 320 ) (128 0 320 ) +4 4 (192 -448 320 ) (192 -448 304 ) (192 0 304 ) (192 0 320 ) +4 4 (192 0 320 ) (128 0 320 ) (128 -448 320 ) (192 -448 320 ) +4 5 (96 0 352 ) (96 -416 352 ) (96 -416 304 ) (96 0 304 ) +4 5 (96 -416 352 ) (96 0 352 ) (0 0 352 ) (0 -416 352 ) +4 5 (0 -416 304 ) (96 -416 304 ) (96 -416 352 ) (0 -416 352 ) +4 6 (0 -512 320 ) (0 -512 304 ) (64 -512 304 ) (64 -512 320 ) +4 6 (64 -512 304 ) (192 -512 304 ) (192 -512 320 ) (64 -512 320 ) +4 6 (192 -448 320 ) (192 -512 320 ) (192 -512 304 ) (192 -448 304 ) +4 6 (96 -448 320 ) (128 -448 320 ) (128 -448 304 ) (96 -448 304 ) +4 6 (0 -448 320 ) (96 -448 320 ) (96 -448 304 ) (0 -448 304 ) +4 6 (192 -448 320 ) (0 -448 320 ) (0 -512 320 ) (192 -512 320 ) +4 7 (0 -512 304 ) (0 -512 128 ) (64 -512 128 ) (64 -512 304 ) +4 7 (64 -512 96 ) (192 -512 96 ) (192 -512 304 ) (64 -512 304 ) +4 7 (0 -256 96 ) (0 -64 96 ) (64 -64 96 ) (64 -256 96 ) +4 7 (192 -512 304 ) (192 -512 96 ) (192 0 96 ) (192 0 304 ) +4 7 (96 -448 304 ) (128 -448 304 ) (128 0 304 ) (96 0 304 ) +4 7 (96 -448 304 ) (96 -416 304 ) (0 -416 304 ) (0 -448 304 ) +4 8 (0 -64 0 ) (64 -64 0 ) (64 -64 96 ) (0 -64 96 ) +4 8 (0 -64 0 ) (0 0 0 ) (192 0 0 ) (192 -64 0 ) +4 8 (192 -64 96 ) (192 -64 0 ) (192 0 0 ) (192 0 96 ) +4 9 (64 -512 0 ) (192 -512 0 ) (192 -512 96 ) (64 -512 96 ) +4 9 (64 -64 96 ) (64 -64 0 ) (64 -256 0 ) (64 -256 96 ) +4 9 (192 -64 96 ) (192 -512 96 ) (192 -512 0 ) (192 -64 0 ) +4 9 (192 -512 0 ) (64 -512 0 ) (64 -64 0 ) (192 -64 0 ) +4 10 (64 -512 0 ) (0 -512 0 ) (0 -256 0 ) (64 -256 0 ) +4 10 (0 -256 96 ) (64 -256 96 ) (64 -256 0 ) (0 -256 0 ) +4 11 (64 -512 128 ) (64 -544 128 ) (64 -544 0 ) (64 -512 0 ) +4 11 (0 -512 0 ) (64 -512 0 ) (64 -544 0 ) (0 -544 0 ) +4 11 (0 -544 128 ) (64 -544 128 ) (64 -512 128 ) (0 -512 128 ) +4 12 (0 -768 320 ) (0 -768 0 ) (192 -768 0 ) (192 -768 320 ) +4 12 (192 -544 0 ) (192 -544 320 ) (192 -768 320 ) (192 -768 0 ) +4 12 (192 -544 0 ) (192 -768 0 ) (0 -768 0 ) (0 -544 0 ) +4 12 (64 -544 320 ) (192 -544 320 ) (192 -544 0 ) (64 -544 0 ) +4 12 (64 -544 320 ) (64 -544 128 ) (0 -544 128 ) (0 -544 320 ) +4 12 (0 -768 320 ) (192 -768 320 ) (192 -544 320 ) (0 -544 320 ) +4 13 (-64 128 320 ) (-64 128 304 ) (0 128 304 ) (0 128 320 ) +4 13 (-64 192 304 ) (-64 192 320 ) (0 192 320 ) (0 192 304 ) +4 13 (0 192 320 ) (-64 192 320 ) (-64 128 320 ) (0 128 320 ) +4 14 (0 96 352 ) (-32 96 352 ) (-32 0 352 ) (0 0 352 ) +4 14 (0 96 304 ) (-32 96 304 ) (-32 96 352 ) (0 96 352 ) +4 14 (-32 96 352 ) (-32 96 304 ) (-32 0 304 ) (-32 0 352 ) +4 15 (-480 192 320 ) (-480 192 304 ) (-480 0 304 ) (-480 0 320 ) +4 15 (-64 192 320 ) (-64 192 304 ) (-480 192 304 ) (-480 192 320 ) +4 15 (-64 128 320 ) (-64 96 320 ) (-64 96 304 ) (-64 128 304 ) +4 15 (-64 96 320 ) (-64 0 320 ) (-64 0 304 ) (-64 96 304 ) +4 15 (-64 0 320 ) (-64 192 320 ) (-480 192 320 ) (-480 0 320 ) +4 16 (-480 192 0 ) (-480 192 304 ) (0 192 304 ) (0 192 0 ) +4 16 (-480 192 304 ) (-480 192 0 ) (-480 0 0 ) (-480 0 304 ) +4 16 (0 96 304 ) (0 128 304 ) (-64 128 304 ) (-64 96 304 ) +4 16 (-32 96 304 ) (-64 96 304 ) (-64 0 304 ) (-32 0 304 ) +4 16 (0 0 0 ) (-480 0 0 ) (-480 192 0 ) (0 192 0 ) +4 17 (-32 -416 320 ) (0 -416 320 ) (0 -416 352 ) (-32 -416 352 ) +4 17 (-32 -416 352 ) (0 -416 352 ) (0 0 352 ) (-32 0 352 ) +4 17 (-32 0 320 ) (-32 -416 320 ) (-32 -416 352 ) (-32 0 352 ) +4 18 (-32 -416 304 ) (0 -416 304 ) (0 -416 320 ) (-32 -416 320 ) +4 18 (-32 0 304 ) (-32 -416 304 ) (-32 -416 320 ) (-32 0 320 ) +4 19 (-64 -512 304 ) (0 -512 304 ) (0 -512 320 ) (-64 -512 320 ) +4 19 (-64 -448 320 ) (-64 -512 320 ) (0 -512 320 ) (0 -448 320 ) +4 19 (0 -448 320 ) (0 -448 304 ) (-64 -448 304 ) (-64 -448 320 ) +4 20 (-480 -512 304 ) (-64 -512 304 ) (-64 -512 320 ) (-480 -512 320 ) +4 20 (-64 -416 320 ) (-64 -448 320 ) (-64 -448 304 ) (-64 -416 304 ) +4 20 (-64 0 320 ) (-64 -416 320 ) (-64 -416 304 ) (-64 0 304 ) +4 20 (-64 -416 320 ) (-64 0 320 ) (-480 0 320 ) (-480 -416 320 ) +4 20 (-64 -512 320 ) (-64 -416 320 ) (-480 -416 320 ) (-480 -512 320 ) +4 20 (-480 0 320 ) (-480 0 304 ) (-480 -512 304 ) (-480 -512 320 ) +4 21 (0 -544 320 ) (-480 -544 320 ) (-480 -768 320 ) (0 -768 320 ) +4 21 (0 -768 304 ) (0 -768 320 ) (-480 -768 320 ) (-480 -768 304 ) +4 21 (-480 -544 304 ) (-480 -768 304 ) (-480 -768 320 ) (-480 -544 320 ) +4 21 (-480 -544 320 ) (0 -544 320 ) (0 -544 304 ) (-480 -544 304 ) +4 22 (-64 -416 304 ) (-64 -448 304 ) (0 -448 304 ) (0 -416 304 ) +4 22 (-64 -416 304 ) (-32 -416 304 ) (-32 0 304 ) (-64 0 304 ) +4 22 (-480 0 304 ) (-480 0 128 ) (-480 -512 128 ) (-480 -512 304 ) +4 22 (-480 -512 128 ) (0 -512 128 ) (0 -512 304 ) (-480 -512 304 ) +4 23 (-480 -544 304 ) (0 -544 304 ) (0 -544 128 ) (-480 -544 128 ) +4 23 (0 -768 128 ) (0 -768 304 ) (-480 -768 304 ) (-480 -768 128 ) +4 23 (-480 -544 128 ) (-480 -768 128 ) (-480 -768 304 ) (-480 -544 304 ) +4 24 (-480 -512 0 ) (-64 -512 0 ) (-64 -512 128 ) (-480 -512 128 ) +4 24 (-480 -512 0 ) (-480 0 0 ) (0 0 0 ) (0 -512 0 ) +4 24 (-480 0 128 ) (-480 0 0 ) (-480 -512 0 ) (-480 -512 128 ) +4 24 (0 -256 0 ) (0 -64 0 ) (0 -64 96 ) (0 -256 96 ) +4 25 (-64 -512 128 ) (-64 -512 0 ) (-64 -544 0 ) (-64 -544 128 ) +4 25 (0 -768 0 ) (0 -768 128 ) (-64 -768 128 ) (-64 -768 0 ) +4 25 (-64 -544 128 ) (0 -544 128 ) (0 -512 128 ) (-64 -512 128 ) +4 25 (0 -768 0 ) (-64 -768 0 ) (-64 -512 0 ) (0 -512 0 ) +4 26 (-64 -768 0 ) (-480 -768 0 ) (-480 -544 0 ) (-64 -544 0 ) +4 26 (-480 -544 0 ) (-480 -768 0 ) (-480 -768 128 ) (-480 -544 128 ) +4 26 (-64 -768 128 ) (-480 -768 128 ) (-480 -768 0 ) (-64 -768 0 ) +4 26 (-480 -544 128 ) (-64 -544 128 ) (-64 -544 0 ) (-480 -544 0 ) diff --git a/fakk/maps/example/rain.bsp b/fakk/maps/example/rain.bsp new file mode 100644 index 0000000000000000000000000000000000000000..67f53f0e6f42872c8faddc1d04cd10113de14de9 GIT binary patch literal 56300 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 literal 0 HcmV?d00001 diff --git a/fakk/maps/example/rain.map b/fakk/maps/example/rain.map new file mode 100644 index 0000000..6dae0c1 --- /dev/null +++ b/fakk/maps/example/rain.map @@ -0,0 +1,114 @@ +{ +"classname" "worldspawn" +// brush 0 +{ +( 320 192 -16 ) ( -192 192 -16 ) ( -192 -320 -16 ) eden/WL_inside_3 0 0 0.00 1 1 0 0 0 +( -192 -320 272 ) ( -192 192 272 ) ( 320 192 272 ) eden/WL_inside_3 0 0 0.00 1 1 0 0 0 +( -192 -336 16 ) ( 320 -336 16 ) ( 320 -336 0 ) eden/WL_inside_3 0 0 0.00 1 1 0 0 0 +( 320 208 16 ) ( -192 208 16 ) ( -192 208 0 ) eden/WL_inside_3 0 0 0.00 1 1 0 0 0 +( -208 192 16 ) ( -208 -320 16 ) ( -208 -320 0 ) eden/WL_inside_3 0 0 0.00 1 1 0 0 0 +( -192 -320 16 ) ( -192 192 16 ) ( -192 -320 0 ) eden/WL_inside_3 0 0 0.00 1 1 0 0 0 +} +// brush 1 +{ +( 320 192 -16 ) ( -192 192 -16 ) ( -192 -320 -16 ) eden/WL_inside_3 0 0 0.00 1 1 0 0 0 +( -192 -320 272 ) ( -192 192 272 ) ( 320 192 272 ) eden/WL_inside_3 0 0 0.00 1 1 0 0 0 +( 336 -320 16 ) ( 336 192 16 ) ( 336 192 0 ) eden/WL_inside_3 0 0 0.00 1 1 0 0 0 +( 320 208 16 ) ( -192 208 16 ) ( -192 208 0 ) eden/WL_inside_3 0 0 0.00 1 1 0 0 0 +( -208 192 16 ) ( -208 -320 16 ) ( -208 -320 0 ) eden/WL_inside_3 0 0 0.00 1 1 0 0 0 +( -192 192 16 ) ( 320 192 16 ) ( -192 192 0 ) eden/WL_inside_3 0 0 0.00 1 1 0 0 0 +} +// brush 2 +{ +( 320 192 -16 ) ( -192 192 -16 ) ( -192 -320 -16 ) eden/WL_inside_3 0 0 0.00 1 1 0 0 0 +( -192 -320 272 ) ( -192 192 272 ) ( 320 192 272 ) eden/WL_inside_3 0 0 0.00 1 1 0 0 0 +( -192 -336 16 ) ( 320 -336 16 ) ( 320 -336 0 ) eden/WL_inside_3 0 0 0.00 1 1 0 0 0 +( 336 -320 16 ) ( 336 192 16 ) ( 336 192 0 ) eden/WL_inside_3 0 0 0.00 1 1 0 0 0 +( 320 208 16 ) ( -192 208 16 ) ( -192 208 0 ) eden/WL_inside_3 0 0 0.00 1 1 0 0 0 +( 320 192 16 ) ( 320 -320 16 ) ( 320 192 0 ) eden/WL_inside_3 0 0 0.00 1 1 0 0 0 +} +// brush 3 +{ +( 320 192 -16 ) ( -192 192 -16 ) ( -192 -320 -16 ) eden/WL_inside_3 0 0 0.00 1 1 0 0 0 +( -192 -320 272 ) ( -192 192 272 ) ( 320 192 272 ) eden/WL_inside_3 0 0 0.00 1 1 0 0 0 +( -192 -336 16 ) ( 320 -336 16 ) ( 320 -336 0 ) eden/WL_inside_3 0 0 0.00 1 1 0 0 0 +( 336 -320 16 ) ( 336 192 16 ) ( 336 192 0 ) eden/WL_inside_3 0 0 0.00 1 1 0 0 0 +( -208 192 16 ) ( -208 -320 16 ) ( -208 -320 0 ) eden/WL_inside_3 0 0 0.00 1 1 0 0 0 +( 320 -320 16 ) ( -192 -320 16 ) ( 320 -320 0 ) eden/WL_inside_3 0 0 0.00 1 1 0 0 0 +} +// brush 4 +{ +( -192 -320 272 ) ( -192 192 272 ) ( 320 192 272 ) eden/WL_market_sides 0 0 0.00 1 1 0 0 0 +( -192 -336 16 ) ( 320 -336 16 ) ( 320 -336 0 ) eden/WL_market_sides 0 0 0.00 1 1 0 0 0 +( 336 -320 16 ) ( 336 192 16 ) ( 336 192 0 ) eden/WL_market_sides 0 0 0.00 1 1 0 0 0 +( 320 208 16 ) ( -192 208 16 ) ( -192 208 0 ) eden/WL_market_sides 0 0 0.00 1 1 0 0 0 +( -208 192 16 ) ( -208 -320 16 ) ( -208 -320 0 ) eden/WL_market_sides 0 0 0.00 1 1 0 0 0 +( -192 192 256 ) ( -192 -320 256 ) ( 320 192 256 ) eden/WL_market_sides 0 0 0.00 1 1 0 0 0 +} +// brush 5 +{ +( 320 192 -16 ) ( -192 192 -16 ) ( -192 -320 -16 ) eden/WL_neweden_2 0 0 0.00 1 1 0 0 0 +( -192 -336 16 ) ( 320 -336 16 ) ( 320 -336 0 ) eden/WL_neweden_2 0 0 0.00 1 1 0 0 0 +( 336 -320 16 ) ( 336 192 16 ) ( 336 192 0 ) eden/WL_neweden_2 0 0 0.00 1 1 0 0 0 +( 320 208 16 ) ( -192 208 16 ) ( -192 208 0 ) eden/WL_neweden_2 0 0 0.00 1 1 0 0 0 +( -208 192 16 ) ( -208 -320 16 ) ( -208 -320 0 ) eden/WL_neweden_2 0 0 0.00 1 1 0 0 0 +( -192 192 0 ) ( 320 192 0 ) ( -192 -320 0 ) eden/WL_neweden_2 0 0 0.00 1 1 0 0 0 +} +} +// entity 1 +{ +"light" "200" +"classname" "light" +"origin" "-56 -136 104" +} +// entity 2 +{ +"classname" "info_player_start" +"angle" "45" +"origin" "-128 -240 0" +} +// entity 3 +{ +"classname" "func_rain" +// brush 0 +{ +( 304 176 224 ) ( -176 176 224 ) ( -176 -304 224 ) common/trigger 0 0 0.00 1 1 0 128 0 +( -176 -304 240 ) ( -176 176 240 ) ( 304 176 240 ) common/trigger 0 0 0.00 1 1 0 128 0 +( -176 -304 240 ) ( 304 -304 240 ) ( 304 -304 224 ) common/trigger 0 0 0.00 1 1 0 128 0 +( 64 -320 240 ) ( 64 160 240 ) ( 64 160 224 ) common/trigger 0 0 0.00 1 1 0 128 0 +( 304 176 240 ) ( -176 176 240 ) ( -176 176 224 ) common/trigger 0 0 0.00 1 1 0 128 0 +( -176 176 240 ) ( -176 -304 240 ) ( -176 -304 224 ) common/trigger 0 0 0.00 1 1 0 128 0 +} +} +// entity 4 +{ +"light" "200" +"origin" "-56 88 104" +"classname" "light" +} +// entity 5 +{ +"light" "200" +"classname" "light" +"origin" "200 72 104" +} +// entity 6 +{ +"light" "200" +"origin" "216 -184 104" +"classname" "light" +} +// entity 7 +{ +"emitter" "defaultleaf" +"classname" "func_emitter" +// brush 0 +{ +( 544 176 224 ) ( 64 176 224 ) ( 64 -304 224 ) common/trigger -48 0 0.00 1 1 0 128 0 +( 64 -304 240 ) ( 64 176 240 ) ( 544 176 240 ) common/trigger -48 0 0.00 1 1 0 128 0 +( 64 -304 240 ) ( 544 -304 240 ) ( 544 -304 224 ) common/trigger -48 0 0.00 1 1 0 128 0 +( 304 -320 240 ) ( 304 160 240 ) ( 304 160 224 ) common/trigger 0 0 0.00 1 1 0 128 0 +( 544 176 240 ) ( 64 176 240 ) ( 64 176 224 ) common/trigger -48 0 0.00 1 1 0 128 0 +( 64 176 240 ) ( 64 -304 240 ) ( 64 -304 224 ) common/trigger 0 0 0.00 1 1 0 128 0 +} +} diff --git a/fakk/maps/example/rain.prt b/fakk/maps/example/rain.prt new file mode 100644 index 0000000..dd2ecc7 --- /dev/null +++ b/fakk/maps/example/rain.prt @@ -0,0 +1,24 @@ +PRT1 +4 +4 +16 +4 0 2 0 (0 0 0 ) (0 0 256 ) (0 192 256 ) (0 192 0 ) +4 0 1 0 (0 0 256 ) (0 0 0 ) (320 0 0 ) (320 0 256 ) +4 1 3 0 (0 0 256 ) (0 0 0 ) (0 -320 0 ) (0 -320 256 ) +4 2 3 0 (0 0 0 ) (0 0 256 ) (-192 0 256 ) (-192 0 0 ) +4 0 (320 0 256 ) (320 0 0 ) (320 192 0 ) (320 192 256 ) +4 0 (320 192 256 ) (320 192 0 ) (0 192 0 ) (0 192 256 ) +4 0 (320 0 0 ) (0 0 0 ) (0 192 0 ) (320 192 0 ) +4 0 (0 0 256 ) (320 0 256 ) (320 192 256 ) (0 192 256 ) +4 1 (0 -320 256 ) (0 -320 0 ) (320 -320 0 ) (320 -320 256 ) +4 1 (320 -320 256 ) (320 -320 0 ) (320 0 0 ) (320 0 256 ) +4 1 (0 -320 0 ) (0 0 0 ) (320 0 0 ) (320 -320 0 ) +4 1 (320 0 256 ) (0 0 256 ) (0 -320 256 ) (320 -320 256 ) +4 2 (0 192 256 ) (0 192 0 ) (-192 192 0 ) (-192 192 256 ) +4 2 (-192 0 0 ) (-192 0 256 ) (-192 192 256 ) (-192 192 0 ) +4 2 (0 0 0 ) (-192 0 0 ) (-192 192 0 ) (0 192 0 ) +4 2 (0 192 256 ) (-192 192 256 ) (-192 0 256 ) (0 0 256 ) +4 3 (-192 -320 256 ) (-192 -320 0 ) (0 -320 0 ) (0 -320 256 ) +4 3 (-192 0 256 ) (-192 0 0 ) (-192 -320 0 ) (-192 -320 256 ) +4 3 (-192 -320 0 ) (-192 0 0 ) (0 0 0 ) (0 -320 0 ) +4 3 (0 0 256 ) (-192 0 256 ) (-192 -320 256 ) (0 -320 256 ) diff --git a/fakk/maps/example/rain.pth b/fakk/maps/example/rain.pth new file mode 100644 index 0000000000000000000000000000000000000000..d95140ec865e59b689dff61c5fe2b6d6460dad85 GIT binary patch literal 88 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 literal 0 HcmV?d00001 diff --git a/fakk/maps/example/sinkobject.map b/fakk/maps/example/sinkobject.map new file mode 100644 index 0000000..bb597a8 --- /dev/null +++ b/fakk/maps/example/sinkobject.map @@ -0,0 +1,723 @@ +{ +"classname" "worldspawn" +// brush 0 +{ +( -64 -896 0 ) ( -320 -896 0 ) ( -320 -1016 0 ) eden/woodfloor 0 0 0.00 1 1 0 0 0 +( -320 -1016 16 ) ( -320 -896 16 ) ( -64 -896 16 ) eden/woodfloor 0 0 0.00 1 1 0 0 0 +( -320 -1016 96 ) ( -64 -1016 96 ) ( -64 -1016 0 ) eden/woodfloor 0 -24 0.00 1 1 0 0 0 +( -64 -1016 96 ) ( -64 -896 96 ) ( -64 -896 0 ) eden/woodfloor 64 -24 0.00 1 1 0 0 0 +( -64 -896 96 ) ( -320 -896 96 ) ( -320 -896 0 ) eden/woodfloor 0 -24 0.00 1 1 0 0 0 +( -320 -896 96 ) ( -320 -1016 96 ) ( -320 -1016 0 ) eden/woodfloor 64 -24 0.00 1 1 0 0 0 +} +// brush 1 +{ +( -48 -896 16 ) ( -304 -896 16 ) ( -304 -1016 16 ) eden/woodfloor -16 0 0.00 1 1 0 0 0 +( -304 -1016 32 ) ( -304 -896 32 ) ( -48 -896 32 ) eden/woodfloor -16 0 0.00 1 1 0 0 0 +( -304 -1016 112 ) ( -48 -1016 112 ) ( -48 -1016 16 ) eden/woodfloor -16 -8 0.00 1 1 0 0 0 +( -64 -1016 112 ) ( -64 -896 112 ) ( -64 -896 16 ) eden/woodfloor 64 -8 0.00 1 1 0 0 0 +( -48 -896 112 ) ( -304 -896 112 ) ( -304 -896 16 ) eden/woodfloor -16 -8 0.00 1 1 0 0 0 +( -304 -896 112 ) ( -304 -1016 112 ) ( -304 -1016 16 ) eden/woodfloor 64 -8 0.00 1 1 0 0 0 +} +// brush 2 +{ +( -32 -896 32 ) ( -288 -896 32 ) ( -288 -1016 32 ) eden/woodfloor -32 0 0.00 1 1 0 0 0 +( -288 -1016 48 ) ( -288 -896 48 ) ( -32 -896 48 ) eden/woodfloor -32 0 0.00 1 1 0 0 0 +( -288 -1016 128 ) ( -32 -1016 128 ) ( -32 -1016 32 ) eden/woodfloor -32 8 0.00 1 1 0 0 0 +( -64 -1016 128 ) ( -64 -896 128 ) ( -64 -896 32 ) eden/woodfloor 64 8 0.00 1 1 0 0 0 +( -32 -896 128 ) ( -288 -896 128 ) ( -288 -896 32 ) eden/woodfloor -32 8 0.00 1 1 0 0 0 +( -288 -896 128 ) ( -288 -1016 128 ) ( -288 -1016 32 ) eden/woodfloor 64 8 0.00 1 1 0 0 0 +} +// brush 3 +{ +( -16 -896 48 ) ( -272 -896 48 ) ( -272 -1016 48 ) eden/woodfloor -48 0 0.00 1 1 0 0 0 +( -272 -1016 64 ) ( -272 -896 64 ) ( -16 -896 64 ) eden/woodfloor -48 0 0.00 1 1 0 0 0 +( -272 -1016 144 ) ( -16 -1016 144 ) ( -16 -1016 48 ) eden/woodfloor -48 24 0.00 1 1 0 0 0 +( -64 -1016 144 ) ( -64 -896 144 ) ( -64 -896 48 ) eden/woodfloor 64 24 0.00 1 1 0 0 0 +( -16 -896 144 ) ( -272 -896 144 ) ( -272 -896 48 ) eden/woodfloor -48 24 0.00 1 1 0 0 0 +( -272 -896 144 ) ( -272 -1016 144 ) ( -272 -1016 48 ) eden/woodfloor 64 24 0.00 1 1 0 0 0 +} +// brush 4 +{ +( 0 -896 64 ) ( -256 -896 64 ) ( -256 -1016 64 ) eden/woodfloor -64 0 0.00 1 1 0 0 0 +( -256 -1016 80 ) ( -256 -896 80 ) ( 0 -896 80 ) eden/woodfloor -64 0 0.00 1 1 0 0 0 +( -256 -1016 160 ) ( 0 -1016 160 ) ( 0 -1016 64 ) eden/woodfloor -64 -24 0.00 1 1 0 0 0 +( -64 -1016 160 ) ( -64 -896 160 ) ( -64 -896 64 ) eden/woodfloor 64 -24 0.00 1 1 0 0 0 +( 0 -896 160 ) ( -256 -896 160 ) ( -256 -896 64 ) eden/woodfloor -64 -24 0.00 1 1 0 0 0 +( -256 -896 160 ) ( -256 -1016 160 ) ( -256 -1016 64 ) eden/woodfloor 64 -24 0.00 1 1 0 0 0 +} +// brush 5 +{ +( 16 -896 80 ) ( -240 -896 80 ) ( -240 -1016 80 ) eden/woodfloor -80 0 0.00 1 1 0 0 0 +( -240 -1016 96 ) ( -240 -896 96 ) ( 16 -896 96 ) eden/woodfloor -80 0 0.00 1 1 0 0 0 +( -240 -1016 176 ) ( 16 -1016 176 ) ( 16 -1016 80 ) eden/woodfloor -80 -8 0.00 1 1 0 0 0 +( -64 -1016 176 ) ( -64 -896 176 ) ( -64 -896 80 ) eden/woodfloor 64 -8 0.00 1 1 0 0 0 +( 16 -896 176 ) ( -240 -896 176 ) ( -240 -896 80 ) eden/woodfloor -80 -8 0.00 1 1 0 0 0 +( -240 -896 176 ) ( -240 -1016 176 ) ( -240 -1016 80 ) eden/woodfloor 64 -8 0.00 1 1 0 0 0 +} +// brush 6 +{ +( 32 -896 96 ) ( -224 -896 96 ) ( -224 -1016 96 ) eden/woodfloor -96 0 0.00 1 1 0 0 0 +( -224 -1016 112 ) ( -224 -896 112 ) ( 32 -896 112 ) eden/woodfloor -96 0 0.00 1 1 0 0 0 +( -224 -1016 192 ) ( 32 -1016 192 ) ( 32 -1016 96 ) eden/woodfloor -96 8 0.00 1 1 0 0 0 +( -64 -1016 192 ) ( -64 -896 192 ) ( -64 -896 96 ) eden/woodfloor 64 8 0.00 1 1 0 0 0 +( 32 -896 192 ) ( -224 -896 192 ) ( -224 -896 96 ) eden/woodfloor -96 8 0.00 1 1 0 0 0 +( -224 -896 192 ) ( -224 -1016 192 ) ( -224 -1016 96 ) eden/woodfloor 64 8 0.00 1 1 0 0 0 +} +// brush 7 +{ +( 48 -896 112 ) ( -208 -896 112 ) ( -208 -1016 112 ) eden/woodfloor 16 0 0.00 1 1 0 0 0 +( -208 -1016 128 ) ( -208 -896 128 ) ( 48 -896 128 ) eden/woodfloor 16 0 0.00 1 1 0 0 0 +( -208 -1016 208 ) ( 48 -1016 208 ) ( 48 -1016 112 ) eden/woodfloor 16 24 0.00 1 1 0 0 0 +( -64 -1016 208 ) ( -64 -896 208 ) ( -64 -896 112 ) eden/woodfloor 64 24 0.00 1 1 0 0 0 +( 48 -896 208 ) ( -208 -896 208 ) ( -208 -896 112 ) eden/woodfloor 16 24 0.00 1 1 0 0 0 +( -208 -896 208 ) ( -208 -1016 208 ) ( -208 -1016 112 ) eden/woodfloor 64 24 0.00 1 1 0 0 0 +} +// brush 8 +{ +( 64 -896 128 ) ( -192 -896 128 ) ( -192 -1016 128 ) eden/woodfloor 0 0 0.00 1 1 0 0 0 +( -192 -1016 144 ) ( -192 -896 144 ) ( 64 -896 144 ) eden/woodfloor 0 0 0.00 1 1 0 0 0 +( -192 -1016 224 ) ( 64 -1016 224 ) ( 64 -1016 128 ) eden/woodfloor 0 -24 0.00 1 1 0 0 0 +( -64 -1008 224 ) ( -64 -888 224 ) ( -64 -888 128 ) eden/woodfloor 64 -24 0.00 1 1 0 0 0 +( 64 -896 224 ) ( -192 -896 224 ) ( -192 -896 128 ) eden/woodfloor 0 -24 0.00 1 1 0 0 0 +( -192 -896 224 ) ( -192 -1016 224 ) ( -192 -1016 128 ) eden/woodfloor 64 -24 0.00 1 1 0 0 0 +} +// brush 9 +{ +( 80 -896 144 ) ( -176 -896 144 ) ( -176 -1016 144 ) eden/woodfloor -16 0 0.00 1 1 0 0 0 +( -176 -1016 160 ) ( -176 -896 160 ) ( 80 -896 160 ) eden/woodfloor -16 0 0.00 1 1 0 0 0 +( -176 -1016 240 ) ( 80 -1016 240 ) ( 80 -1016 144 ) eden/woodfloor -16 -8 0.00 1 1 0 0 0 +( -64 -1008 240 ) ( -64 -888 240 ) ( -64 -888 144 ) eden/woodfloor 64 -8 0.00 1 1 0 0 0 +( 80 -896 240 ) ( -176 -896 240 ) ( -176 -896 144 ) eden/woodfloor -16 -8 0.00 1 1 0 0 0 +( -176 -896 240 ) ( -176 -1016 240 ) ( -176 -1016 144 ) eden/woodfloor 64 -8 0.00 1 1 0 0 0 +} +// brush 10 +{ +( 96 -896 160 ) ( -160 -896 160 ) ( -160 -1016 160 ) eden/woodfloor -32 0 0.00 1 1 0 0 0 +( -160 -1016 176 ) ( -160 -896 176 ) ( 96 -896 176 ) eden/woodfloor -32 0 0.00 1 1 0 0 0 +( -160 -1016 256 ) ( 96 -1016 256 ) ( 96 -1016 160 ) eden/woodfloor -32 8 0.00 1 1 0 0 0 +( -64 -1008 256 ) ( -64 -888 256 ) ( -64 -888 160 ) eden/woodfloor 64 8 0.00 1 1 0 0 0 +( 96 -896 256 ) ( -160 -896 256 ) ( -160 -896 160 ) eden/woodfloor -32 8 0.00 1 1 0 0 0 +( -160 -896 256 ) ( -160 -1016 256 ) ( -160 -1016 160 ) eden/woodfloor 64 8 0.00 1 1 0 0 0 +} +// brush 11 +{ +( 96 -576 160 ) ( -160 -576 160 ) ( -160 -696 160 ) eden/woodfloor -32 0 0.00 1 1 0 0 0 +( -160 -696 176 ) ( -160 -576 176 ) ( 96 -576 176 ) eden/woodfloor -32 0 0.00 1 1 0 0 0 +( -160 -696 256 ) ( 96 -696 256 ) ( 96 -696 160 ) eden/woodfloor -32 8 0.00 1 1 0 0 0 +( -64 -688 256 ) ( -64 -568 256 ) ( -64 -568 160 ) eden/woodfloor 0 8 0.00 1 1 0 0 0 +( 96 -576 256 ) ( -160 -576 256 ) ( -160 -576 160 ) eden/woodfloor -32 8 0.00 1 1 0 0 0 +( -160 -576 256 ) ( -160 -696 256 ) ( -160 -696 160 ) eden/woodfloor 0 8 0.00 1 1 0 0 0 +} +// brush 12 +{ +( 80 -576 144 ) ( -176 -576 144 ) ( -176 -696 144 ) eden/woodfloor -16 0 0.00 1 1 0 0 0 +( -176 -696 160 ) ( -176 -576 160 ) ( 80 -576 160 ) eden/woodfloor -16 0 0.00 1 1 0 0 0 +( -176 -696 240 ) ( 80 -696 240 ) ( 80 -696 144 ) eden/woodfloor -16 -8 0.00 1 1 0 0 0 +( -64 -688 240 ) ( -64 -568 240 ) ( -64 -568 144 ) eden/woodfloor 0 -8 0.00 1 1 0 0 0 +( 80 -576 240 ) ( -176 -576 240 ) ( -176 -576 144 ) eden/woodfloor -16 -8 0.00 1 1 0 0 0 +( -176 -576 240 ) ( -176 -696 240 ) ( -176 -696 144 ) eden/woodfloor 0 -8 0.00 1 1 0 0 0 +} +// brush 13 +{ +( 64 -576 128 ) ( -192 -576 128 ) ( -192 -696 128 ) eden/woodfloor 0 0 0.00 1 1 0 0 0 +( -192 -696 144 ) ( -192 -576 144 ) ( 64 -576 144 ) eden/woodfloor 0 0 0.00 1 1 0 0 0 +( -192 -696 224 ) ( 64 -696 224 ) ( 64 -696 128 ) eden/woodfloor 0 -24 0.00 1 1 0 0 0 +( -64 -688 224 ) ( -64 -568 224 ) ( -64 -568 128 ) eden/woodfloor 0 -24 0.00 1 1 0 0 0 +( 64 -576 224 ) ( -192 -576 224 ) ( -192 -576 128 ) eden/woodfloor 0 -24 0.00 1 1 0 0 0 +( -192 -576 224 ) ( -192 -696 224 ) ( -192 -696 128 ) eden/woodfloor 0 -24 0.00 1 1 0 0 0 +} +// brush 14 +{ +( 48 -576 112 ) ( -208 -576 112 ) ( -208 -696 112 ) eden/woodfloor 16 0 0.00 1 1 0 0 0 +( -208 -696 128 ) ( -208 -576 128 ) ( 48 -576 128 ) eden/woodfloor 16 0 0.00 1 1 0 0 0 +( -208 -696 208 ) ( 48 -696 208 ) ( 48 -696 112 ) eden/woodfloor 16 24 0.00 1 1 0 0 0 +( -64 -696 208 ) ( -64 -576 208 ) ( -64 -576 112 ) eden/woodfloor 0 24 0.00 1 1 0 0 0 +( 48 -576 208 ) ( -208 -576 208 ) ( -208 -576 112 ) eden/woodfloor 16 24 0.00 1 1 0 0 0 +( -208 -576 208 ) ( -208 -696 208 ) ( -208 -696 112 ) eden/woodfloor 0 24 0.00 1 1 0 0 0 +} +// brush 15 +{ +( 32 -576 96 ) ( -224 -576 96 ) ( -224 -696 96 ) eden/woodfloor -96 0 0.00 1 1 0 0 0 +( -224 -696 112 ) ( -224 -576 112 ) ( 32 -576 112 ) eden/woodfloor -96 0 0.00 1 1 0 0 0 +( -224 -696 192 ) ( 32 -696 192 ) ( 32 -696 96 ) eden/woodfloor -96 8 0.00 1 1 0 0 0 +( -64 -696 192 ) ( -64 -576 192 ) ( -64 -576 96 ) eden/woodfloor 0 8 0.00 1 1 0 0 0 +( 32 -576 192 ) ( -224 -576 192 ) ( -224 -576 96 ) eden/woodfloor -96 8 0.00 1 1 0 0 0 +( -224 -576 192 ) ( -224 -696 192 ) ( -224 -696 96 ) eden/woodfloor 0 8 0.00 1 1 0 0 0 +} +// brush 16 +{ +( 16 -576 80 ) ( -240 -576 80 ) ( -240 -696 80 ) eden/woodfloor -80 0 0.00 1 1 0 0 0 +( -240 -696 96 ) ( -240 -576 96 ) ( 16 -576 96 ) eden/woodfloor -80 0 0.00 1 1 0 0 0 +( -240 -696 176 ) ( 16 -696 176 ) ( 16 -696 80 ) eden/woodfloor -80 -8 0.00 1 1 0 0 0 +( -64 -696 176 ) ( -64 -576 176 ) ( -64 -576 80 ) eden/woodfloor 0 -8 0.00 1 1 0 0 0 +( 16 -576 176 ) ( -240 -576 176 ) ( -240 -576 80 ) eden/woodfloor -80 -8 0.00 1 1 0 0 0 +( -240 -576 176 ) ( -240 -696 176 ) ( -240 -696 80 ) eden/woodfloor 0 -8 0.00 1 1 0 0 0 +} +// brush 17 +{ +( 0 -576 64 ) ( -256 -576 64 ) ( -256 -696 64 ) eden/woodfloor -64 0 0.00 1 1 0 0 0 +( -256 -696 80 ) ( -256 -576 80 ) ( 0 -576 80 ) eden/woodfloor -64 0 0.00 1 1 0 0 0 +( -256 -696 160 ) ( 0 -696 160 ) ( 0 -696 64 ) eden/woodfloor -64 -24 0.00 1 1 0 0 0 +( -64 -696 160 ) ( -64 -576 160 ) ( -64 -576 64 ) eden/woodfloor 0 -24 0.00 1 1 0 0 0 +( 0 -576 160 ) ( -256 -576 160 ) ( -256 -576 64 ) eden/woodfloor -64 -24 0.00 1 1 0 0 0 +( -256 -576 160 ) ( -256 -696 160 ) ( -256 -696 64 ) eden/woodfloor 0 -24 0.00 1 1 0 0 0 +} +// brush 18 +{ +( -16 -576 48 ) ( -272 -576 48 ) ( -272 -696 48 ) eden/woodfloor -48 0 0.00 1 1 0 0 0 +( -272 -696 64 ) ( -272 -576 64 ) ( -16 -576 64 ) eden/woodfloor -48 0 0.00 1 1 0 0 0 +( -272 -696 144 ) ( -16 -696 144 ) ( -16 -696 48 ) eden/woodfloor -48 24 0.00 1 1 0 0 0 +( -64 -696 144 ) ( -64 -576 144 ) ( -64 -576 48 ) eden/woodfloor 0 24 0.00 1 1 0 0 0 +( -16 -576 144 ) ( -272 -576 144 ) ( -272 -576 48 ) eden/woodfloor -48 24 0.00 1 1 0 0 0 +( -272 -576 144 ) ( -272 -696 144 ) ( -272 -696 48 ) eden/woodfloor 0 24 0.00 1 1 0 0 0 +} +// brush 19 +{ +( -32 -576 32 ) ( -288 -576 32 ) ( -288 -696 32 ) eden/woodfloor -32 0 0.00 1 1 0 0 0 +( -288 -696 48 ) ( -288 -576 48 ) ( -32 -576 48 ) eden/woodfloor -32 0 0.00 1 1 0 0 0 +( -288 -696 128 ) ( -32 -696 128 ) ( -32 -696 32 ) eden/woodfloor -32 8 0.00 1 1 0 0 0 +( -64 -696 128 ) ( -64 -576 128 ) ( -64 -576 32 ) eden/woodfloor 0 8 0.00 1 1 0 0 0 +( -32 -576 128 ) ( -288 -576 128 ) ( -288 -576 32 ) eden/woodfloor -32 8 0.00 1 1 0 0 0 +( -288 -576 128 ) ( -288 -696 128 ) ( -288 -696 32 ) eden/woodfloor 0 8 0.00 1 1 0 0 0 +} +// brush 20 +{ +( -48 -576 16 ) ( -304 -576 16 ) ( -304 -696 16 ) eden/woodfloor -16 0 0.00 1 1 0 0 0 +( -304 -696 32 ) ( -304 -576 32 ) ( -48 -576 32 ) eden/woodfloor -16 0 0.00 1 1 0 0 0 +( -304 -696 112 ) ( -48 -696 112 ) ( -48 -696 16 ) eden/woodfloor -16 -8 0.00 1 1 0 0 0 +( -64 -696 112 ) ( -64 -576 112 ) ( -64 -576 16 ) eden/woodfloor 0 -8 0.00 1 1 0 0 0 +( -48 -576 112 ) ( -304 -576 112 ) ( -304 -576 16 ) eden/woodfloor -16 -8 0.00 1 1 0 0 0 +( -304 -576 112 ) ( -304 -696 112 ) ( -304 -696 16 ) eden/woodfloor 0 -8 0.00 1 1 0 0 0 +} +// brush 21 +{ +( -64 -576 0 ) ( -320 -576 0 ) ( -320 -696 0 ) eden/woodfloor 0 0 0.00 1 1 0 0 0 +( -320 -696 16 ) ( -320 -576 16 ) ( -64 -576 16 ) eden/woodfloor 0 0 0.00 1 1 0 0 0 +( -320 -696 96 ) ( -64 -696 96 ) ( -64 -696 0 ) eden/woodfloor 0 -24 0.00 1 1 0 0 0 +( -64 -696 96 ) ( -64 -576 96 ) ( -64 -576 0 ) eden/woodfloor 0 -24 0.00 1 1 0 0 0 +( -64 -576 96 ) ( -320 -576 96 ) ( -320 -576 0 ) eden/woodfloor 0 -24 0.00 1 1 0 0 0 +( -320 -576 96 ) ( -320 -696 96 ) ( -320 -696 0 ) eden/woodfloor 0 -24 0.00 1 1 0 0 0 +} +// brush 22 +{ +( -64 -264 0 ) ( -320 -264 0 ) ( -320 -384 0 ) eden/woodfloor 0 -8 0.00 1 1 0 0 0 +( -320 -384 16 ) ( -320 -264 16 ) ( -64 -264 16 ) eden/woodfloor 0 -8 0.00 1 1 0 0 0 +( -320 -384 96 ) ( -64 -384 96 ) ( -64 -384 0 ) eden/woodfloor 0 -24 0.00 1 1 0 0 0 +( -64 -384 96 ) ( -64 -264 96 ) ( -64 -264 0 ) eden/woodfloor 72 -24 0.00 1 1 0 0 0 +( -64 -264 96 ) ( -320 -264 96 ) ( -320 -264 0 ) eden/woodfloor 0 -24 0.00 1 1 0 0 0 +( -320 -264 96 ) ( -320 -384 96 ) ( -320 -384 0 ) eden/woodfloor 72 -24 0.00 1 1 0 0 0 +} +// brush 23 +{ +( -48 -264 16 ) ( -304 -264 16 ) ( -304 -384 16 ) eden/woodfloor -16 -8 0.00 1 1 0 0 0 +( -304 -384 32 ) ( -304 -264 32 ) ( -48 -264 32 ) eden/woodfloor -16 -8 0.00 1 1 0 0 0 +( -304 -384 112 ) ( -48 -384 112 ) ( -48 -384 16 ) eden/woodfloor -16 -8 0.00 1 1 0 0 0 +( -64 -384 112 ) ( -64 -264 112 ) ( -64 -264 16 ) eden/woodfloor 72 -8 0.00 1 1 0 0 0 +( -48 -264 112 ) ( -304 -264 112 ) ( -304 -264 16 ) eden/woodfloor -16 -8 0.00 1 1 0 0 0 +( -304 -264 112 ) ( -304 -384 112 ) ( -304 -384 16 ) eden/woodfloor 72 -8 0.00 1 1 0 0 0 +} +// brush 24 +{ +( -32 -264 32 ) ( -288 -264 32 ) ( -288 -384 32 ) eden/woodfloor -32 -8 0.00 1 1 0 0 0 +( -288 -384 48 ) ( -288 -264 48 ) ( -32 -264 48 ) eden/woodfloor -32 -8 0.00 1 1 0 0 0 +( -288 -384 128 ) ( -32 -384 128 ) ( -32 -384 32 ) eden/woodfloor -32 8 0.00 1 1 0 0 0 +( -64 -384 128 ) ( -64 -264 128 ) ( -64 -264 32 ) eden/woodfloor 72 8 0.00 1 1 0 0 0 +( -32 -264 128 ) ( -288 -264 128 ) ( -288 -264 32 ) eden/woodfloor -32 8 0.00 1 1 0 0 0 +( -288 -264 128 ) ( -288 -384 128 ) ( -288 -384 32 ) eden/woodfloor 72 8 0.00 1 1 0 0 0 +} +// brush 25 +{ +( -16 -264 48 ) ( -272 -264 48 ) ( -272 -384 48 ) eden/woodfloor -48 -8 0.00 1 1 0 0 0 +( -272 -384 64 ) ( -272 -264 64 ) ( -16 -264 64 ) eden/woodfloor -48 -8 0.00 1 1 0 0 0 +( -272 -384 144 ) ( -16 -384 144 ) ( -16 -384 48 ) eden/woodfloor -48 24 0.00 1 1 0 0 0 +( -64 -384 144 ) ( -64 -264 144 ) ( -64 -264 48 ) eden/woodfloor 72 24 0.00 1 1 0 0 0 +( -16 -264 144 ) ( -272 -264 144 ) ( -272 -264 48 ) eden/woodfloor -48 24 0.00 1 1 0 0 0 +( -272 -264 144 ) ( -272 -384 144 ) ( -272 -384 48 ) eden/woodfloor 72 24 0.00 1 1 0 0 0 +} +// brush 26 +{ +( 0 -264 64 ) ( -256 -264 64 ) ( -256 -384 64 ) eden/woodfloor -64 -8 0.00 1 1 0 0 0 +( -256 -384 80 ) ( -256 -264 80 ) ( 0 -264 80 ) eden/woodfloor -64 -8 0.00 1 1 0 0 0 +( -256 -384 160 ) ( 0 -384 160 ) ( 0 -384 64 ) eden/woodfloor -64 -24 0.00 1 1 0 0 0 +( -64 -384 160 ) ( -64 -264 160 ) ( -64 -264 64 ) eden/woodfloor 72 -24 0.00 1 1 0 0 0 +( 0 -264 160 ) ( -256 -264 160 ) ( -256 -264 64 ) eden/woodfloor -64 -24 0.00 1 1 0 0 0 +( -256 -264 160 ) ( -256 -384 160 ) ( -256 -384 64 ) eden/woodfloor 72 -24 0.00 1 1 0 0 0 +} +// brush 27 +{ +( 16 -264 80 ) ( -240 -264 80 ) ( -240 -384 80 ) eden/woodfloor -80 -8 0.00 1 1 0 0 0 +( -240 -384 96 ) ( -240 -264 96 ) ( 16 -264 96 ) eden/woodfloor -80 -8 0.00 1 1 0 0 0 +( -240 -384 176 ) ( 16 -384 176 ) ( 16 -384 80 ) eden/woodfloor -80 -8 0.00 1 1 0 0 0 +( -64 -384 176 ) ( -64 -264 176 ) ( -64 -264 80 ) eden/woodfloor 72 -8 0.00 1 1 0 0 0 +( 16 -264 176 ) ( -240 -264 176 ) ( -240 -264 80 ) eden/woodfloor -80 -8 0.00 1 1 0 0 0 +( -240 -264 176 ) ( -240 -384 176 ) ( -240 -384 80 ) eden/woodfloor 72 -8 0.00 1 1 0 0 0 +} +// brush 28 +{ +( 32 -264 96 ) ( -224 -264 96 ) ( -224 -384 96 ) eden/woodfloor -96 -8 0.00 1 1 0 0 0 +( -224 -384 112 ) ( -224 -264 112 ) ( 32 -264 112 ) eden/woodfloor -96 -8 0.00 1 1 0 0 0 +( -224 -384 192 ) ( 32 -384 192 ) ( 32 -384 96 ) eden/woodfloor -96 8 0.00 1 1 0 0 0 +( -64 -384 192 ) ( -64 -264 192 ) ( -64 -264 96 ) eden/woodfloor 72 8 0.00 1 1 0 0 0 +( 32 -264 192 ) ( -224 -264 192 ) ( -224 -264 96 ) eden/woodfloor -96 8 0.00 1 1 0 0 0 +( -224 -264 192 ) ( -224 -384 192 ) ( -224 -384 96 ) eden/woodfloor 72 8 0.00 1 1 0 0 0 +} +// brush 29 +{ +( 48 -264 112 ) ( -208 -264 112 ) ( -208 -384 112 ) eden/woodfloor -112 -8 0.00 1 1 0 0 0 +( -208 -384 128 ) ( -208 -264 128 ) ( 48 -264 128 ) eden/woodfloor -112 -8 0.00 1 1 0 0 0 +( -208 -384 208 ) ( 48 -384 208 ) ( 48 -384 112 ) eden/woodfloor -112 24 0.00 1 1 0 0 0 +( -64 -384 208 ) ( -64 -264 208 ) ( -64 -264 112 ) eden/woodfloor 72 24 0.00 1 1 0 0 0 +( 48 -264 208 ) ( -208 -264 208 ) ( -208 -264 112 ) eden/woodfloor -112 24 0.00 1 1 0 0 0 +( -208 -264 208 ) ( -208 -384 208 ) ( -208 -384 112 ) eden/woodfloor 72 24 0.00 1 1 0 0 0 +} +// brush 30 +{ +( 64 -264 128 ) ( -192 -264 128 ) ( -192 -384 128 ) eden/woodfloor 0 -8 0.00 1 1 0 0 0 +( -192 -384 144 ) ( -192 -264 144 ) ( 64 -264 144 ) eden/woodfloor 0 -8 0.00 1 1 0 0 0 +( -192 -384 224 ) ( 64 -384 224 ) ( 64 -384 128 ) eden/woodfloor 0 -24 0.00 1 1 0 0 0 +( -64 -376 224 ) ( -64 -256 224 ) ( -64 -256 128 ) eden/woodfloor 72 -24 0.00 1 1 0 0 0 +( 64 -264 224 ) ( -192 -264 224 ) ( -192 -264 128 ) eden/woodfloor 0 -24 0.00 1 1 0 0 0 +( -192 -264 224 ) ( -192 -384 224 ) ( -192 -384 128 ) eden/woodfloor 72 -24 0.00 1 1 0 0 0 +} +// brush 31 +{ +( 80 -264 144 ) ( -176 -264 144 ) ( -176 -384 144 ) eden/woodfloor -16 -8 0.00 1 1 0 0 0 +( -176 -384 160 ) ( -176 -264 160 ) ( 80 -264 160 ) eden/woodfloor -16 -8 0.00 1 1 0 0 0 +( -176 -384 240 ) ( 80 -384 240 ) ( 80 -384 144 ) eden/woodfloor -16 -8 0.00 1 1 0 0 0 +( -64 -376 240 ) ( -64 -256 240 ) ( -64 -256 144 ) eden/woodfloor 72 -8 0.00 1 1 0 0 0 +( 80 -264 240 ) ( -176 -264 240 ) ( -176 -264 144 ) eden/woodfloor -16 -8 0.00 1 1 0 0 0 +( -176 -264 240 ) ( -176 -384 240 ) ( -176 -384 144 ) eden/woodfloor 72 -8 0.00 1 1 0 0 0 +} +// brush 32 +{ +( 96 -264 160 ) ( -160 -264 160 ) ( -160 -384 160 ) eden/woodfloor -32 -8 0.00 1 1 0 0 0 +( -160 -384 176 ) ( -160 -264 176 ) ( 96 -264 176 ) eden/woodfloor -32 -8 0.00 1 1 0 0 0 +( -160 -384 256 ) ( 96 -384 256 ) ( 96 -384 160 ) eden/woodfloor -32 8 0.00 1 1 0 0 0 +( -64 -376 256 ) ( -64 -256 256 ) ( -64 -256 160 ) eden/woodfloor 72 8 0.00 1 1 0 0 0 +( 96 -264 256 ) ( -160 -264 256 ) ( -160 -264 160 ) eden/woodfloor -32 8 0.00 1 1 0 0 0 +( -160 -264 256 ) ( -160 -384 256 ) ( -160 -384 160 ) eden/woodfloor 72 8 0.00 1 1 0 0 0 +} +// brush 33 +{ +( 96 64 160 ) ( -160 64 160 ) ( -160 -56 160 ) eden/woodfloor -32 0 0.00 1 1 0 0 0 +( -160 -56 176 ) ( -160 64 176 ) ( 96 64 176 ) eden/woodfloor -32 0 0.00 1 1 0 0 0 +( -160 -56 256 ) ( 96 -56 256 ) ( 96 -56 160 ) eden/woodfloor -32 8 0.00 1 1 0 0 0 +( -64 -48 256 ) ( -64 72 256 ) ( -64 72 160 ) eden/woodfloor 0 8 0.00 1 1 0 0 0 +( 96 64 256 ) ( -160 64 256 ) ( -160 64 160 ) eden/woodfloor -32 8 0.00 1 1 0 0 0 +( -160 64 256 ) ( -160 -56 256 ) ( -160 -56 160 ) eden/woodfloor 0 8 0.00 1 1 0 0 0 +} +// brush 34 +{ +( 80 64 144 ) ( -176 64 144 ) ( -176 -56 144 ) eden/woodfloor -16 0 0.00 1 1 0 0 0 +( -176 -56 160 ) ( -176 64 160 ) ( 80 64 160 ) eden/woodfloor -16 0 0.00 1 1 0 0 0 +( -176 -56 240 ) ( 80 -56 240 ) ( 80 -56 144 ) eden/woodfloor -16 -8 0.00 1 1 0 0 0 +( -64 -48 240 ) ( -64 72 240 ) ( -64 72 144 ) eden/woodfloor 0 -8 0.00 1 1 0 0 0 +( 80 64 240 ) ( -176 64 240 ) ( -176 64 144 ) eden/woodfloor -16 -8 0.00 1 1 0 0 0 +( -176 64 240 ) ( -176 -56 240 ) ( -176 -56 144 ) eden/woodfloor 0 -8 0.00 1 1 0 0 0 +} +// brush 35 +{ +( 64 64 128 ) ( -192 64 128 ) ( -192 -56 128 ) eden/woodfloor 0 0 0.00 1 1 0 0 0 +( -192 -56 144 ) ( -192 64 144 ) ( 64 64 144 ) eden/woodfloor 0 0 0.00 1 1 0 0 0 +( -192 -56 224 ) ( 64 -56 224 ) ( 64 -56 128 ) eden/woodfloor 0 -24 0.00 1 1 0 0 0 +( -64 -48 224 ) ( -64 72 224 ) ( -64 72 128 ) eden/woodfloor 0 -24 0.00 1 1 0 0 0 +( 64 64 224 ) ( -192 64 224 ) ( -192 64 128 ) eden/woodfloor 0 -24 0.00 1 1 0 0 0 +( -192 64 224 ) ( -192 -56 224 ) ( -192 -56 128 ) eden/woodfloor 0 -24 0.00 1 1 0 0 0 +} +// brush 36 +{ +( 48 64 112 ) ( -208 64 112 ) ( -208 -56 112 ) eden/woodfloor -112 0 0.00 1 1 0 0 0 +( -208 -56 128 ) ( -208 64 128 ) ( 48 64 128 ) eden/woodfloor -112 0 0.00 1 1 0 0 0 +( -208 -56 208 ) ( 48 -56 208 ) ( 48 -56 112 ) eden/woodfloor -112 24 0.00 1 1 0 0 0 +( -64 -56 208 ) ( -64 64 208 ) ( -64 64 112 ) eden/woodfloor 0 24 0.00 1 1 0 0 0 +( 48 64 208 ) ( -208 64 208 ) ( -208 64 112 ) eden/woodfloor -112 24 0.00 1 1 0 0 0 +( -208 64 208 ) ( -208 -56 208 ) ( -208 -56 112 ) eden/woodfloor 0 24 0.00 1 1 0 0 0 +} +// brush 37 +{ +( 32 64 96 ) ( -224 64 96 ) ( -224 -56 96 ) eden/woodfloor -96 0 0.00 1 1 0 0 0 +( -224 -56 112 ) ( -224 64 112 ) ( 32 64 112 ) eden/woodfloor -96 0 0.00 1 1 0 0 0 +( -224 -56 192 ) ( 32 -56 192 ) ( 32 -56 96 ) eden/woodfloor -96 8 0.00 1 1 0 0 0 +( -64 -56 192 ) ( -64 64 192 ) ( -64 64 96 ) eden/woodfloor 0 8 0.00 1 1 0 0 0 +( 32 64 192 ) ( -224 64 192 ) ( -224 64 96 ) eden/woodfloor -96 8 0.00 1 1 0 0 0 +( -224 64 192 ) ( -224 -56 192 ) ( -224 -56 96 ) eden/woodfloor 0 8 0.00 1 1 0 0 0 +} +// brush 38 +{ +( 16 64 80 ) ( -240 64 80 ) ( -240 -56 80 ) eden/woodfloor -80 0 0.00 1 1 0 0 0 +( -240 -56 96 ) ( -240 64 96 ) ( 16 64 96 ) eden/woodfloor -80 0 0.00 1 1 0 0 0 +( -240 -56 176 ) ( 16 -56 176 ) ( 16 -56 80 ) eden/woodfloor -80 -8 0.00 1 1 0 0 0 +( -64 -56 176 ) ( -64 64 176 ) ( -64 64 80 ) eden/woodfloor 0 -8 0.00 1 1 0 0 0 +( 16 64 176 ) ( -240 64 176 ) ( -240 64 80 ) eden/woodfloor -80 -8 0.00 1 1 0 0 0 +( -240 64 176 ) ( -240 -56 176 ) ( -240 -56 80 ) eden/woodfloor 0 -8 0.00 1 1 0 0 0 +} +// brush 39 +{ +( 0 64 64 ) ( -256 64 64 ) ( -256 -56 64 ) eden/woodfloor -64 0 0.00 1 1 0 0 0 +( -256 -56 80 ) ( -256 64 80 ) ( 0 64 80 ) eden/woodfloor -64 0 0.00 1 1 0 0 0 +( -256 -56 160 ) ( 0 -56 160 ) ( 0 -56 64 ) eden/woodfloor -64 -24 0.00 1 1 0 0 0 +( -64 -56 160 ) ( -64 64 160 ) ( -64 64 64 ) eden/woodfloor 0 -24 0.00 1 1 0 0 0 +( 0 64 160 ) ( -256 64 160 ) ( -256 64 64 ) eden/woodfloor -64 -24 0.00 1 1 0 0 0 +( -256 64 160 ) ( -256 -56 160 ) ( -256 -56 64 ) eden/woodfloor 0 -24 0.00 1 1 0 0 0 +} +// brush 40 +{ +( -16 64 48 ) ( -272 64 48 ) ( -272 -56 48 ) eden/woodfloor -48 0 0.00 1 1 0 0 0 +( -272 -56 64 ) ( -272 64 64 ) ( -16 64 64 ) eden/woodfloor -48 0 0.00 1 1 0 0 0 +( -272 -56 144 ) ( -16 -56 144 ) ( -16 -56 48 ) eden/woodfloor -48 24 0.00 1 1 0 0 0 +( -64 -56 144 ) ( -64 64 144 ) ( -64 64 48 ) eden/woodfloor 0 24 0.00 1 1 0 0 0 +( -16 64 144 ) ( -272 64 144 ) ( -272 64 48 ) eden/woodfloor -48 24 0.00 1 1 0 0 0 +( -272 64 144 ) ( -272 -56 144 ) ( -272 -56 48 ) eden/woodfloor 0 24 0.00 1 1 0 0 0 +} +// brush 41 +{ +( -32 64 32 ) ( -288 64 32 ) ( -288 -56 32 ) eden/woodfloor -32 0 0.00 1 1 0 0 0 +( -288 -56 48 ) ( -288 64 48 ) ( -32 64 48 ) eden/woodfloor -32 0 0.00 1 1 0 0 0 +( -288 -56 128 ) ( -32 -56 128 ) ( -32 -56 32 ) eden/woodfloor -32 8 0.00 1 1 0 0 0 +( -64 -56 128 ) ( -64 64 128 ) ( -64 64 32 ) eden/woodfloor 0 8 0.00 1 1 0 0 0 +( -32 64 128 ) ( -288 64 128 ) ( -288 64 32 ) eden/woodfloor -32 8 0.00 1 1 0 0 0 +( -288 64 128 ) ( -288 -56 128 ) ( -288 -56 32 ) eden/woodfloor 0 8 0.00 1 1 0 0 0 +} +// brush 42 +{ +( -48 64 16 ) ( -304 64 16 ) ( -304 -56 16 ) eden/woodfloor -16 0 0.00 1 1 0 0 0 +( -304 -56 32 ) ( -304 64 32 ) ( -48 64 32 ) eden/woodfloor -16 0 0.00 1 1 0 0 0 +( -304 -56 112 ) ( -48 -56 112 ) ( -48 -56 16 ) eden/woodfloor -16 -8 0.00 1 1 0 0 0 +( -64 -56 112 ) ( -64 64 112 ) ( -64 64 16 ) eden/woodfloor 0 -8 0.00 1 1 0 0 0 +( -48 64 112 ) ( -304 64 112 ) ( -304 64 16 ) eden/woodfloor -16 -8 0.00 1 1 0 0 0 +( -304 64 112 ) ( -304 -56 112 ) ( -304 -56 16 ) eden/woodfloor 0 -8 0.00 1 1 0 0 0 +} +// brush 43 +{ +( -64 64 0 ) ( -320 64 0 ) ( -320 -56 0 ) eden/woodfloor 0 0 0.00 1 1 0 0 0 +( -320 -56 16 ) ( -320 64 16 ) ( -64 64 16 ) eden/woodfloor 0 0 0.00 1 1 0 0 0 +( -320 -56 96 ) ( -64 -56 96 ) ( -64 -56 0 ) eden/woodfloor 0 -24 0.00 1 1 0 0 0 +( -64 -56 96 ) ( -64 64 96 ) ( -64 64 0 ) eden/woodfloor 0 -24 0.00 1 1 0 0 0 +( -64 64 96 ) ( -320 64 96 ) ( -320 64 0 ) eden/woodfloor 0 -24 0.00 1 1 0 0 0 +( -320 64 96 ) ( -320 -56 96 ) ( -320 -56 0 ) eden/woodfloor 0 -24 0.00 1 1 0 0 0 +} +// brush 44 +{ +( 224 192 0 ) ( 224 224 0 ) ( -480 224 0 ) eden/bedtrim -224 -32 90.00 1 1 0 0 0 +( -480 224 64 ) ( 224 224 64 ) ( 224 192 64 ) eden/bedtrim -224 -32 90.00 1 1 0 0 0 +( -480 224 256 ) ( -480 192 256 ) ( -480 192 0 ) eden/bedtrim -224 0 0.00 1 1 0 0 0 +( -480 192 256 ) ( 224 192 256 ) ( 224 192 0 ) common/skip 0 0 0.00 1 1 805306368 16512 0 +( 224 224 256 ) ( -480 224 256 ) ( -480 224 0 ) eden/bedtrim 224 0 -180.00 1 -1 0 0 0 +( -416 224 0 ) ( -416 192 0 ) ( -416 208 64 ) eden/bedtrim 224 0 -180.00 1 -1 0 0 0 +} +// brush 45 +{ +( 224 192 0 ) ( 224 224 0 ) ( -480 224 0 ) eden/bedtrim -224 -32 90.00 1 1 0 0 0 +( -480 224 64 ) ( 224 224 64 ) ( 224 192 64 ) eden/bedtrim -224 -32 90.00 1 1 0 0 0 +( -480 192 256 ) ( 224 192 256 ) ( 224 192 0 ) eden/bedtrim 224 0 -180.00 1 -1 0 0 0 +( 224 192 256 ) ( 224 224 256 ) ( 224 224 0 ) eden/bedtrim -224 0 0.00 1 1 0 0 0 +( 224 224 256 ) ( -480 224 256 ) ( -480 224 0 ) eden/bedtrim 224 0 -180.00 1 -1 0 0 0 +( -480 192 0 ) ( -480 224 0 ) ( -480 208 64 ) eden/bedtrim 224 0 -180.00 1 -1 0 0 0 +} +// brush 46 +{ +( 224 192 64 ) ( 224 224 64 ) ( -480 224 64 ) eden/edenmetalwall -224 -224 90.00 1 1 0 0 0 +( -480 224 320 ) ( 224 224 320 ) ( 224 192 320 ) eden/edenmetalwall -224 -224 90.00 1 1 0 0 0 +( -480 224 96 ) ( -480 192 96 ) ( -480 192 64 ) eden/edenmetalwall -224 64 0.00 1 1 0 0 0 +( -480 192 96 ) ( 224 192 96 ) ( 224 192 64 ) common/skip 0 0 0.00 1 1 805306368 16512 0 +( 224 224 96 ) ( -480 224 96 ) ( -480 224 64 ) eden/edenmetalwall 224 63 -180.00 1 -1 0 0 0 +( -416 224 64 ) ( -416 192 64 ) ( -416 208 320 ) eden/edenmetalwall 224 63 -180.00 1 -1 0 0 0 +} +// brush 47 +{ +( 224 192 64 ) ( 224 224 64 ) ( -480 224 64 ) eden/edenmetalwall -224 -224 90.00 1 1 0 0 0 +( -480 224 640 ) ( 224 224 640 ) ( 224 192 640 ) eden/edenmetalwall -224 -224 90.00 1 1 0 0 0 +( -480 192 96 ) ( 224 192 96 ) ( 224 192 64 ) eden/edenmetalwall 224 63 -180.00 1 -1 0 0 0 +( 224 192 96 ) ( 224 224 96 ) ( 224 224 64 ) eden/edenmetalwall -224 64 0.00 1 1 0 0 0 +( 224 224 96 ) ( -480 224 96 ) ( -480 224 64 ) eden/edenmetalwall 224 63 -180.00 1 -1 0 0 0 +( -480 192 384 ) ( -480 224 384 ) ( -480 208 640 ) eden/edenmetalwall 224 63 -180.00 1 -1 0 0 0 +} +// brush 48 + { + patchDef2 + { + eden/edenmetalwall + ( 3 3 0 536870912 0 ) +( +( ( -480 96 63.999981 0 0 ) ( -480 96 352.000061 0 0.500000 ) ( -480 96 640 0 1 ) ) +( ( -384 96 63.999981 0.500000 0 ) ( -384 96 352.000061 0.500000 0.500000 ) ( -384 96 640 0.500000 1 ) ) +( ( -384 192 63.999981 1 0 ) ( -384 192 352.000061 1 0.500000 ) ( -384 192 640 1 1 ) ) +) + } + } +// brush 49 +{ +( -480 192 0 ) ( -512 192 0 ) ( -512 -512 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -512 -512 64 ) ( -512 192 64 ) ( -480 192 64 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -480 -512 256 ) ( -480 192 256 ) ( -480 192 0 ) common/skip 0 0 0.00 1 1 805306368 16512 0 +( -480 192 256 ) ( -512 192 256 ) ( -512 192 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -512 192 256 ) ( -512 -512 256 ) ( -512 -512 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -480 128 0 ) ( -512 128 0 ) ( -496 128 64 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +} +// brush 50 +{ +( -480 192 0 ) ( -512 192 0 ) ( -512 -512 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -512 -512 64 ) ( -512 192 64 ) ( -480 192 64 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -512 -1272 256 ) ( -480 -1272 256 ) ( -480 -1272 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -480 -1272 256 ) ( -480 -568 256 ) ( -480 -568 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -512 192 256 ) ( -512 -512 256 ) ( -512 -512 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -512 192 0 ) ( -480 192 0 ) ( -496 192 64 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +} +// brush 51 +{ +( -480 192 64 ) ( -512 192 64 ) ( -512 -512 64 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +( -512 -512 320 ) ( -512 192 320 ) ( -480 192 320 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +( -480 -512 96 ) ( -480 192 96 ) ( -480 192 64 ) common/skip 0 0 0.00 1 1 805306368 16512 0 +( -480 192 96 ) ( -512 192 96 ) ( -512 192 64 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +( -512 192 96 ) ( -512 -512 96 ) ( -512 -512 64 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +( -480 128 64 ) ( -512 128 64 ) ( -496 128 320 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +} +// brush 52 +{ +( -480 192 64 ) ( -512 192 64 ) ( -512 -512 64 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +( -512 -512 640 ) ( -512 192 640 ) ( -480 192 640 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +( -512 -1272 96 ) ( -480 -1272 96 ) ( -480 -1272 64 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +( -480 -1272 416 ) ( -480 -568 416 ) ( -480 -568 384 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +( -512 192 96 ) ( -512 -512 96 ) ( -512 -512 64 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +( -512 192 64 ) ( -480 192 64 ) ( -496 192 320 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +} +// brush 53 + { + patchDef2 + { + eden/bedtrim + ( 3 3 0 536870912 0 ) +( +( ( -480 96 0 0 0 ) ( -480 96 32 0 0.500000 ) ( -480 96 64 0 1 ) ) +( ( -384 96 0 0.500000 0 ) ( -384 96 32 0.500000 0.500000 ) ( -384 96 64 0.500000 1 ) ) +( ( -384 192 0 1 0 ) ( -384 192 32 1 0.500000 ) ( -384 192 64 1 1 ) ) +) + } + } +// brush 54 +{ +( 192 192 608 ) ( -480 192 608 ) ( -480 -512 608 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( -480 -512 640 ) ( -480 192 640 ) ( 192 192 640 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( -480 -1272 640 ) ( 192 -1272 640 ) ( 192 -1272 608 ) eden/CL_edenroof3 0 -96 0.00 1 1 0 0 0 +( 192 192 640 ) ( -480 192 640 ) ( -480 192 608 ) eden/CL_edenroof3 0 -96 0.00 1 1 0 0 0 +( -480 -568 640 ) ( -480 -1272 640 ) ( -480 -1272 608 ) eden/CL_edenroof3 0 -96 0.00 1 1 0 0 0 +( 216 -112 608 ) ( 216 -240 608 ) ( 216 -176 640 ) eden/CL_edenroof3 0 -96 0.00 1 1 0 0 0 +} +// brush 55 +{ +( 192 192 -32 ) ( -480 192 -32 ) ( -480 -512 -32 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( -480 -512 0 ) ( -480 192 0 ) ( 192 192 0 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( -480 -1272 224 ) ( 192 -1272 224 ) ( 192 -1272 -32 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 192 -1272 224 ) ( 192 -568 224 ) ( 192 -568 -32 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 192 192 224 ) ( -480 192 224 ) ( -480 192 -32 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( -480 -568 224 ) ( -480 -1272 224 ) ( -480 -1272 -32 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +} +// brush 56 +{ +( -480 -512 64 ) ( -480 -544 64 ) ( 224 -544 64 ) eden/edenmetalwall -31 31 -90.00 1 1 0 0 0 +( 224 -544 640 ) ( -480 -544 640 ) ( -480 -512 640 ) eden/edenmetalwall -31 31 -90.00 1 1 0 0 0 +( 224 -544 96 ) ( 224 -512 96 ) ( 224 -512 64 ) eden/edenmetalwall -32 63 -180.00 1 -1 0 0 0 +( 224 -1272 96 ) ( -480 -1272 96 ) ( -480 -1272 64 ) eden/edenmetalwall -32 62 0.00 1.000008 1 0 0 0 +( -480 -1272 416 ) ( -480 -1304 416 ) ( -480 -1304 384 ) eden/edenmetalwall -33 63 -180.00 1 -1 0 0 0 +( -480 -1304 96 ) ( 224 -1304 96 ) ( 224 -1304 64 ) eden/edenmetalwall -32 62 0.00 1.000008 1 0 0 0 +} +// brush 57 +{ +( -496 -1240 0 ) ( -496 -1272 0 ) ( 208 -1272 0 ) eden/bedtrim -247 16 -90.00 1 1 0 0 0 +( 208 -1272 64 ) ( -496 -1272 64 ) ( -496 -1240 64 ) eden/bedtrim -247 16 -90.00 1 1 0 0 0 +( 208 -1272 256 ) ( 208 -1240 256 ) ( 208 -1240 0 ) eden/bedtrim -248 0 -180.00 1 -1 0 0 0 +( 208 -1240 256 ) ( -496 -1240 256 ) ( -496 -1240 0 ) eden/bedtrim -16 0 0.00 1 1 0 0 0 +( -496 -1240 256 ) ( -496 -1272 256 ) ( -496 -1272 0 ) eden/bedtrim -249 0 -180.00 1 -1 0 0 0 +( -496 -1272 256 ) ( 208 -1272 256 ) ( 208 -1272 0 ) eden/bedtrim -16 0 0.00 1 1 0 0 0 +} +// brush 58 +{ +( 192 -512 0 ) ( 224 -512 0 ) ( 224 192 0 ) eden/bedtrim 160 0 -180.00 1 1 0 0 0 +( 224 192 64 ) ( 224 -512 64 ) ( 192 -512 64 ) eden/bedtrim 160 0 -180.00 1 1 0 0 0 +( 224 192 256 ) ( 192 192 256 ) ( 192 192 0 ) eden/bedtrim 160 0 -180.00 1 -1 0 0 0 +( 192 -568 256 ) ( 192 -1272 256 ) ( 192 -1272 0 ) eden/bedtrim -64 0 -180.00 1 -1 0 0 0 +( 192 -1272 256 ) ( 224 -1272 256 ) ( 224 -1272 0 ) eden/bedtrim 159 0 -180.00 1 -1 0 0 0 +( 224 -512 256 ) ( 224 192 256 ) ( 224 192 0 ) eden/bedtrim -64 0 -180.00 1 -1 0 0 0 +} +// brush 59 +{ +( 192 -512 64 ) ( 224 -512 64 ) ( 224 192 64 ) eden/edenmetalwall 160 63 -180.00 1 1 0 0 0 +( 224 192 640 ) ( 224 -512 640 ) ( 192 -512 640 ) eden/edenmetalwall 160 63 -180.00 1 1 0 0 0 +( 224 192 96 ) ( 192 192 96 ) ( 192 192 64 ) eden/edenmetalwall 160 64 -180.00 1 -1 0 0 0 +( 192 -568 416 ) ( 192 -1272 416 ) ( 192 -1272 384 ) eden/edenmetalwall -64 62 -180.00 1 -1 0 0 0 +( 192 -1272 96 ) ( 224 -1272 96 ) ( 224 -1272 64 ) eden/edenmetalwall 159 64 -180.00 1 -1 0 0 0 +( 224 -512 96 ) ( 224 192 96 ) ( 224 192 64 ) eden/edenmetalwall -64 62 -180.00 1 -1 0 0 0 +} +} +// entity 1 +{ +"classname" "func_sinkobject" +// brush 0 +{ +( 112 64 144 ) ( 0 64 144 ) ( 0 -56 144 ) swamps/FL_lilypad 0 0 0.00 1 1 0 0 0 +( 0 -56 160 ) ( 0 64 160 ) ( 112 64 160 ) swamps/FL_lilypad 72 128 0.00 1 1 0 0 0 +( 8 -96 160 ) ( 120 -96 160 ) ( 120 -96 144 ) swamps/FL_lilypad 0 0 0.00 1 1 0 0 0 +( 160 -48 160 ) ( 160 72 160 ) ( 160 72 144 ) swamps/FL_lilypad 0 0 0.00 1 1 0 0 0 +( 112 104 160 ) ( 0 104 160 ) ( 0 104 144 ) swamps/FL_lilypad 0 0 0.00 1 1 0 0 0 +( -40 56 160 ) ( -40 -64 160 ) ( -40 -64 144 ) swamps/FL_lilypad 0 0 0.00 1 1 0 0 0 +} +} +// entity 2 +{ +"_color" "1.000000 0.724409 0.523622" +"light" "200" +"origin" "-352 56 168" +"spawnflags" "0" +"classname" "light" +} +// entity 3 +{ +"origin" "-416 -176 24" +"angle" "0" +"classname" "info_player_start" +} +// entity 4 +{ +"_color" "0.629921 0.846457 1.000000" +"light" "200" +"classname" "light" +"spawnflags" "0" +"origin" "8 56 168" +} +// entity 5 +{ +"light" "200" +"classname" "light" +"spawnflags" "0" +"origin" "-344 -376 168" +} +// entity 6 +{ +"light" "200" +"origin" "8 -376 168" +"spawnflags" "0" +"classname" "light" +} +// entity 7 +{ +"origin" "-168 -160 168" +"spawnflags" "0" +"classname" "light" +"light" "200" +} +// entity 8 +{ +"classname" "light" +"spawnflags" "0" +"origin" "-352 56 384" +"light" "200" +"_color" "1.000000 0.724409 0.523622" +} +// entity 9 +{ +"origin" "8 56 384" +"spawnflags" "0" +"classname" "light" +"light" "200" +"_color" "0.629921 0.846457 1.000000" +} +// entity 10 +{ +"origin" "-344 -376 384" +"spawnflags" "0" +"classname" "light" +"light" "200" +} +// entity 11 +{ +"classname" "light" +"spawnflags" "0" +"origin" "8 -376 384" +"light" "200" +} +// entity 12 +{ +"light" "200" +"classname" "light" +"spawnflags" "0" +"origin" "-168 -160 384" +} +// entity 13 +{ +"_color" "1.000000 0.724409 0.523622" +"light" "200" +"origin" "-344 -656 384" +"spawnflags" "0" +"classname" "light" +} +// entity 14 +{ +"_color" "0.629921 0.846457 1.000000" +"light" "200" +"classname" "light" +"spawnflags" "0" +"origin" "16 -656 384" +} +// entity 15 +{ +"light" "200" +"classname" "light" +"spawnflags" "0" +"origin" "-336 -1088 384" +} +// entity 16 +{ +"light" "200" +"origin" "16 -1088 384" +"spawnflags" "0" +"classname" "light" +} +// entity 17 +{ +"origin" "-160 -872 384" +"spawnflags" "0" +"classname" "light" +"light" "200" +} +// entity 18 +{ +"classname" "func_sinkobject" +"spawnflags" "4" +// brush 0 +{ +( 112 -264 144 ) ( 0 -264 144 ) ( 0 -384 144 ) swamps/FL_lilypad 0 -8 0.00 1 1 0 0 0 +( 0 -384 160 ) ( 0 -264 160 ) ( 112 -264 160 ) swamps/FL_lilypad 72 -200 0.00 1 1 0 0 0 +( 8 -424 160 ) ( 120 -424 160 ) ( 120 -424 144 ) swamps/FL_lilypad 0 0 0.00 1 1 0 0 0 +( 160 -376 160 ) ( 160 -256 160 ) ( 160 -256 144 ) swamps/FL_lilypad 8 0 0.00 1 1 0 0 0 +( 112 -224 160 ) ( 0 -224 160 ) ( 0 -224 144 ) swamps/FL_lilypad 0 0 0.00 1 1 0 0 0 +( -40 -272 160 ) ( -40 -392 160 ) ( -40 -392 144 ) swamps/FL_lilypad 8 0 0.00 1 1 0 0 0 +} +} +// entity 19 +{ +"classname" "func_sinkobject" +"spawnflags" "2" +// brush 0 +{ +( 112 -576 144 ) ( 0 -576 144 ) ( 0 -696 144 ) swamps/FL_lilypad 0 0 0.00 1 1 0 0 0 +( 0 -696 160 ) ( 0 -576 160 ) ( 112 -576 160 ) swamps/FL_lilypad 72 0 0.00 1 1 0 0 0 +( 8 -736 160 ) ( 120 -736 160 ) ( 120 -736 144 ) swamps/FL_lilypad 0 0 0.00 1 1 0 0 0 +( 160 -688 160 ) ( 160 -568 160 ) ( 160 -568 144 ) swamps/FL_lilypad 0 0 0.00 1 1 0 0 0 +( 112 -536 160 ) ( 0 -536 160 ) ( 0 -536 144 ) swamps/FL_lilypad 0 0 0.00 1 1 0 0 0 +( -40 -584 160 ) ( -40 -704 160 ) ( -40 -704 144 ) swamps/FL_lilypad 0 0 0.00 1 1 0 0 0 +} +} +// entity 20 +{ +"classname" "func_sinkobject" +"speed" "1" +// brush 0 +{ +( 112 -896 144 ) ( 0 -896 144 ) ( 0 -1016 144 ) swamps/FL_lilypad 0 0 0.00 1 1 0 0 0 +( 0 -1016 160 ) ( 0 -896 160 ) ( 112 -896 160 ) swamps/FL_lilypad 72 -64 0.00 1 1 0 0 0 +( 8 -1056 160 ) ( 120 -1056 160 ) ( 120 -1056 144 ) swamps/FL_lilypad 0 0 0.00 1 1 0 0 0 +( 160 -1008 160 ) ( 160 -888 160 ) ( 160 -888 144 ) swamps/FL_lilypad 0 0 0.00 1 1 0 0 0 +( 112 -856 160 ) ( 0 -856 160 ) ( 0 -856 144 ) swamps/FL_lilypad 0 0 0.00 1 1 0 0 0 +( -40 -904 160 ) ( -40 -1024 160 ) ( -40 -1024 144 ) swamps/FL_lilypad 0 0 0.00 1 1 0 0 0 +} +} diff --git a/fakk/maps/example/sinkobject.prt b/fakk/maps/example/sinkobject.prt new file mode 100644 index 0000000..86e3e9d --- /dev/null +++ b/fakk/maps/example/sinkobject.prt @@ -0,0 +1,510 @@ +PRT1 +73 +217 +289 +4 0 4 0 (0 0 0 ) (0 0 608 ) (0 192 608 ) (0 192 0 ) +4 0 1 0 (0 0 608 ) (0 0 0 ) (192 0 0 ) (192 0 608 ) +4 1 18 0 (0 -1024 0 ) (0 -1024 608 ) (0 0 608 ) (0 0 0 ) +4 1 3 0 (0 -1024 64 ) (0 -1024 0 ) (192 -1024 0 ) (192 -1024 64 ) +4 1 2 0 (0 -1024 608 ) (0 -1024 64 ) (192 -1024 64 ) (192 -1024 608 ) +4 2 71 0 (0 -1272 608 ) (0 -1024 608 ) (0 -1024 64 ) (0 -1272 64 ) +4 2 3 0 (0 -1240 64 ) (0 -1024 64 ) (192 -1024 64 ) (192 -1240 64 ) +4 3 72 0 (0 -1240 64 ) (0 -1024 64 ) (0 -1024 0 ) (0 -1240 0 ) +4 4 18 0 (0 0 0 ) (0 0 608 ) (-64 0 608 ) (-64 0 0 ) +4 4 6 0 (-64 0 176 ) (-64 0 608 ) (-64 64 608 ) (-64 64 176 ) +4 4 5 0 (-64 64 608 ) (-64 192 608 ) (-64 192 0 ) (-64 64 0 ) +4 5 12 0 (-256 64 96 ) (-256 64 80 ) (-240 64 80 ) (-240 64 96 ) +4 5 11 0 (-224 64 112 ) (-256 64 112 ) (-256 64 96 ) (-224 64 96 ) +4 5 13 0 (-256 64 112 ) (-272 64 112 ) (-272 64 64 ) (-256 64 64 ) +4 5 10 0 (-208 64 112 ) (-208 64 128 ) (-272 64 128 ) (-272 64 112 ) +4 5 14 0 (-288 64 128 ) (-288 64 48 ) (-272 64 48 ) (-272 64 128 ) +4 5 9 0 (-192 64 144 ) (-288 64 144 ) (-288 64 128 ) (-192 64 128 ) +4 5 15 0 (-288 64 144 ) (-304 64 144 ) (-304 64 32 ) (-288 64 32 ) +4 5 8 0 (-176 64 144 ) (-176 64 160 ) (-304 64 160 ) (-304 64 144 ) +4 5 16 0 (-320 64 160 ) (-320 64 16 ) (-304 64 16 ) (-304 64 160 ) +4 5 7 0 (-160 64 176 ) (-320 64 176 ) (-320 64 160 ) (-160 64 160 ) +4 5 17 0 (-320 64 176 ) (-480 64 176 ) (-480 64 0 ) (-320 64 0 ) +4 5 6 0 (-64 64 176 ) (-64 64 608 ) (-480 64 608 ) (-480 64 176 ) +4 6 19 0 (-64 0 176 ) (-64 0 608 ) (-480 0 608 ) (-480 0 176 ) +4 6 7 0 (-320 64 176 ) (-160 64 176 ) (-160 0 176 ) (-320 0 176 ) +4 6 17 0 (-480 0 176 ) (-480 64 176 ) (-320 64 176 ) (-320 0 176 ) +4 7 20 0 (-160 0 176 ) (-320 0 176 ) (-320 0 160 ) (-160 0 160 ) +4 7 8 0 (-304 64 160 ) (-176 64 160 ) (-176 0 160 ) (-304 0 160 ) +4 7 16 0 (-320 0 160 ) (-320 64 160 ) (-304 64 160 ) (-304 0 160 ) +4 7 17 0 (-320 0 160 ) (-320 0 176 ) (-320 64 176 ) (-320 64 160 ) +4 8 21 0 (-176 0 144 ) (-176 0 160 ) (-304 0 160 ) (-304 0 144 ) +4 8 9 0 (-288 64 144 ) (-192 64 144 ) (-192 0 144 ) (-288 0 144 ) +4 8 15 0 (-304 0 144 ) (-304 64 144 ) (-288 64 144 ) (-288 0 144 ) +4 8 16 0 (-304 0 144 ) (-304 0 160 ) (-304 64 160 ) (-304 64 144 ) +4 9 22 0 (-192 0 144 ) (-288 0 144 ) (-288 0 128 ) (-192 0 128 ) +4 9 10 0 (-272 64 128 ) (-208 64 128 ) (-208 0 128 ) (-272 0 128 ) +4 9 14 0 (-288 0 128 ) (-288 64 128 ) (-272 64 128 ) (-272 0 128 ) +4 9 15 0 (-288 0 128 ) (-288 0 144 ) (-288 64 144 ) (-288 64 128 ) +4 10 23 0 (-208 0 112 ) (-208 0 128 ) (-272 0 128 ) (-272 0 112 ) +4 10 11 0 (-256 64 112 ) (-224 64 112 ) (-224 0 112 ) (-256 0 112 ) +4 10 13 0 (-272 0 112 ) (-272 64 112 ) (-256 64 112 ) (-256 0 112 ) +4 10 14 0 (-272 0 112 ) (-272 0 128 ) (-272 64 128 ) (-272 64 112 ) +4 11 24 0 (-224 0 112 ) (-256 0 112 ) (-256 0 96 ) (-224 0 96 ) +4 11 12 0 (-256 0 96 ) (-256 64 96 ) (-240 64 96 ) (-240 0 96 ) +4 11 13 0 (-256 0 96 ) (-256 0 112 ) (-256 64 112 ) (-256 64 96 ) +4 12 25 0 (-256 0 96 ) (-256 0 80 ) (-240 0 80 ) (-240 0 96 ) +4 12 13 0 (-256 0 80 ) (-256 0 96 ) (-256 64 96 ) (-256 64 80 ) +4 13 26 0 (-256 0 112 ) (-272 0 112 ) (-272 0 64 ) (-256 0 64 ) +4 13 14 0 (-272 0 64 ) (-272 0 112 ) (-272 64 112 ) (-272 64 64 ) +4 14 27 0 (-288 0 128 ) (-288 0 48 ) (-272 0 48 ) (-272 0 128 ) +4 14 15 0 (-288 0 48 ) (-288 0 128 ) (-288 64 128 ) (-288 64 48 ) +4 15 28 0 (-288 0 144 ) (-304 0 144 ) (-304 0 32 ) (-288 0 32 ) +4 15 16 0 (-304 0 32 ) (-304 0 144 ) (-304 64 144 ) (-304 64 32 ) +4 16 29 0 (-320 0 160 ) (-320 0 16 ) (-304 0 16 ) (-304 0 160 ) +4 16 17 0 (-320 0 16 ) (-320 0 160 ) (-320 64 160 ) (-320 64 16 ) +4 17 30 0 (-320 0 176 ) (-480 0 176 ) (-480 0 0 ) (-320 0 0 ) +4 18 72 0 (0 -1024 0 ) (0 -1024 64 ) (-64 -1024 64 ) (-64 -1024 0 ) +4 18 71 0 (0 -1024 64 ) (0 -1024 608 ) (-64 -1024 608 ) (-64 -1024 64 ) +4 18 70 0 (-64 -1016 0 ) (-64 -1024 0 ) (-64 -1024 608 ) (-64 -1016 608 ) +4 18 58 0 (-64 -1016 176 ) (-64 -1016 608 ) (-64 -896 608 ) (-64 -896 176 ) +4 18 57 0 (-64 -696 0 ) (-64 -896 0 ) (-64 -896 608 ) (-64 -696 608 ) +4 18 45 0 (-64 -696 176 ) (-64 -696 608 ) (-64 -576 608 ) (-64 -576 176 ) +4 18 44 0 (-64 -384 0 ) (-64 -576 0 ) (-64 -576 608 ) (-64 -384 608 ) +4 18 32 0 (-64 -384 176 ) (-64 -384 608 ) (-64 -264 608 ) (-64 -264 176 ) +4 18 31 0 (-64 -56 0 ) (-64 -264 0 ) (-64 -264 608 ) (-64 -56 608 ) +4 18 19 0 (-64 0 608 ) (-64 0 176 ) (-64 -56 176 ) (-64 -56 608 ) +4 19 31 0 (-64 -56 176 ) (-64 -56 608 ) (-480 -56 608 ) (-480 -56 176 ) +4 19 20 0 (-160 -56 176 ) (-320 -56 176 ) (-320 0 176 ) (-160 0 176 ) +4 19 30 0 (-320 -56 176 ) (-480 -56 176 ) (-480 0 176 ) (-320 0 176 ) +4 20 31 0 (-160 -56 176 ) (-320 -56 176 ) (-320 -56 160 ) (-160 -56 160 ) +4 20 21 0 (-304 0 160 ) (-176 0 160 ) (-176 -56 160 ) (-304 -56 160 ) +4 20 29 0 (-320 -56 160 ) (-320 0 160 ) (-304 0 160 ) (-304 -56 160 ) +4 20 30 0 (-320 -56 160 ) (-320 -56 176 ) (-320 0 176 ) (-320 0 160 ) +4 21 31 0 (-176 -56 144 ) (-176 -56 160 ) (-304 -56 160 ) (-304 -56 144 ) +4 21 22 0 (-288 0 144 ) (-192 0 144 ) (-192 -56 144 ) (-288 -56 144 ) +4 21 28 0 (-304 -56 144 ) (-304 0 144 ) (-288 0 144 ) (-288 -56 144 ) +4 21 29 0 (-304 -56 144 ) (-304 -56 160 ) (-304 0 160 ) (-304 0 144 ) +4 22 31 0 (-192 -56 144 ) (-288 -56 144 ) (-288 -56 128 ) (-192 -56 128 ) +4 22 23 0 (-272 0 128 ) (-208 0 128 ) (-208 -56 128 ) (-272 -56 128 ) +4 22 27 0 (-288 -56 128 ) (-288 0 128 ) (-272 0 128 ) (-272 -56 128 ) +4 22 28 0 (-288 -56 128 ) (-288 -56 144 ) (-288 0 144 ) (-288 0 128 ) +4 23 31 0 (-208 -56 112 ) (-208 -56 128 ) (-272 -56 128 ) (-272 -56 112 ) +4 23 24 0 (-256 0 112 ) (-224 0 112 ) (-224 -56 112 ) (-256 -56 112 ) +4 23 26 0 (-272 -56 112 ) (-272 0 112 ) (-256 0 112 ) (-256 -56 112 ) +4 23 27 0 (-272 -56 112 ) (-272 -56 128 ) (-272 0 128 ) (-272 0 112 ) +4 24 31 0 (-224 -56 112 ) (-256 -56 112 ) (-256 -56 96 ) (-224 -56 96 ) +4 24 25 0 (-256 -56 96 ) (-256 0 96 ) (-240 0 96 ) (-240 -56 96 ) +4 24 26 0 (-256 -56 96 ) (-256 -56 112 ) (-256 0 112 ) (-256 0 96 ) +4 25 31 0 (-256 -56 96 ) (-256 -56 80 ) (-240 -56 80 ) (-240 -56 96 ) +4 25 26 0 (-256 -56 80 ) (-256 -56 96 ) (-256 0 96 ) (-256 0 80 ) +4 26 31 0 (-256 -56 112 ) (-272 -56 112 ) (-272 -56 64 ) (-256 -56 64 ) +4 26 27 0 (-272 -56 64 ) (-272 -56 112 ) (-272 0 112 ) (-272 0 64 ) +4 27 31 0 (-288 -56 128 ) (-288 -56 48 ) (-272 -56 48 ) (-272 -56 128 ) +4 27 28 0 (-288 -56 48 ) (-288 -56 128 ) (-288 0 128 ) (-288 0 48 ) +4 28 31 0 (-288 -56 144 ) (-304 -56 144 ) (-304 -56 32 ) (-288 -56 32 ) +4 28 29 0 (-304 -56 32 ) (-304 -56 144 ) (-304 0 144 ) (-304 0 32 ) +4 29 31 0 (-320 -56 160 ) (-320 -56 16 ) (-304 -56 16 ) (-304 -56 160 ) +4 29 30 0 (-320 -56 16 ) (-320 -56 160 ) (-320 0 160 ) (-320 0 16 ) +4 30 31 0 (-320 -56 176 ) (-480 -56 176 ) (-480 -56 0 ) (-320 -56 0 ) +4 31 43 0 (-320 -264 16 ) (-480 -264 16 ) (-480 -264 0 ) (-320 -264 0 ) +4 31 42 0 (-304 -264 32 ) (-480 -264 32 ) (-480 -264 16 ) (-304 -264 16 ) +4 31 41 0 (-480 -264 48 ) (-480 -264 32 ) (-288 -264 32 ) (-288 -264 48 ) +4 31 40 0 (-480 -264 64 ) (-480 -264 48 ) (-272 -264 48 ) (-272 -264 64 ) +4 31 39 0 (-480 -264 80 ) (-480 -264 64 ) (-256 -264 64 ) (-256 -264 80 ) +4 31 38 0 (-480 -264 96 ) (-480 -264 80 ) (-240 -264 80 ) (-240 -264 96 ) +4 31 36 0 (-208 -264 608 ) (-224 -264 608 ) (-224 -264 112 ) (-208 -264 112 ) +4 31 37 0 (-224 -264 608 ) (-480 -264 608 ) (-480 -264 96 ) (-224 -264 96 ) +4 31 35 0 (-192 -264 608 ) (-208 -264 608 ) (-208 -264 128 ) (-192 -264 128 ) +4 31 34 0 (-176 -264 608 ) (-192 -264 608 ) (-192 -264 144 ) (-176 -264 144 ) +4 31 33 0 (-160 -264 608 ) (-176 -264 608 ) (-176 -264 160 ) (-160 -264 160 ) +4 31 32 0 (-64 -264 176 ) (-64 -264 608 ) (-160 -264 608 ) (-160 -264 176 ) +4 32 44 0 (-64 -384 176 ) (-64 -384 608 ) (-160 -384 608 ) (-160 -384 176 ) +4 32 33 0 (-160 -384 176 ) (-160 -384 608 ) (-160 -264 608 ) (-160 -264 176 ) +4 33 44 0 (-160 -384 608 ) (-176 -384 608 ) (-176 -384 160 ) (-160 -384 160 ) +4 33 34 0 (-176 -384 160 ) (-176 -384 608 ) (-176 -264 608 ) (-176 -264 160 ) +4 34 44 0 (-176 -384 608 ) (-192 -384 608 ) (-192 -384 144 ) (-176 -384 144 ) +4 34 35 0 (-192 -384 144 ) (-192 -384 608 ) (-192 -264 608 ) (-192 -264 144 ) +4 35 44 0 (-192 -384 608 ) (-208 -384 608 ) (-208 -384 128 ) (-192 -384 128 ) +4 35 36 0 (-208 -384 128 ) (-208 -384 608 ) (-208 -264 608 ) (-208 -264 128 ) +4 36 44 0 (-208 -384 608 ) (-224 -384 608 ) (-224 -384 112 ) (-208 -384 112 ) +4 36 37 0 (-224 -384 112 ) (-224 -384 608 ) (-224 -264 608 ) (-224 -264 112 ) +4 37 44 0 (-224 -384 608 ) (-480 -384 608 ) (-480 -384 96 ) (-224 -384 96 ) +4 37 38 0 (-480 -384 96 ) (-480 -264 96 ) (-240 -264 96 ) (-240 -384 96 ) +4 38 44 0 (-480 -384 96 ) (-480 -384 80 ) (-240 -384 80 ) (-240 -384 96 ) +4 38 39 0 (-480 -384 80 ) (-480 -264 80 ) (-256 -264 80 ) (-256 -384 80 ) +4 39 44 0 (-480 -384 80 ) (-480 -384 64 ) (-256 -384 64 ) (-256 -384 80 ) +4 39 40 0 (-480 -384 64 ) (-480 -264 64 ) (-272 -264 64 ) (-272 -384 64 ) +4 40 44 0 (-480 -384 64 ) (-480 -384 48 ) (-272 -384 48 ) (-272 -384 64 ) +4 40 41 0 (-480 -384 48 ) (-480 -264 48 ) (-288 -264 48 ) (-288 -384 48 ) +4 41 44 0 (-480 -384 48 ) (-480 -384 32 ) (-288 -384 32 ) (-288 -384 48 ) +4 41 42 0 (-304 -384 32 ) (-480 -384 32 ) (-480 -264 32 ) (-304 -264 32 ) +4 42 44 0 (-304 -384 32 ) (-480 -384 32 ) (-480 -384 16 ) (-304 -384 16 ) +4 42 43 0 (-320 -384 16 ) (-480 -384 16 ) (-480 -264 16 ) (-320 -264 16 ) +4 43 44 0 (-320 -384 16 ) (-480 -384 16 ) (-480 -384 0 ) (-320 -384 0 ) +4 44 51 0 (-256 -576 96 ) (-256 -576 80 ) (-240 -576 80 ) (-240 -576 96 ) +4 44 50 0 (-224 -576 112 ) (-256 -576 112 ) (-256 -576 96 ) (-224 -576 96 ) +4 44 52 0 (-256 -576 112 ) (-272 -576 112 ) (-272 -576 64 ) (-256 -576 64 ) +4 44 49 0 (-208 -576 112 ) (-208 -576 128 ) (-272 -576 128 ) (-272 -576 112 ) +4 44 53 0 (-288 -576 128 ) (-288 -576 48 ) (-272 -576 48 ) (-272 -576 128 ) +4 44 48 0 (-192 -576 144 ) (-288 -576 144 ) (-288 -576 128 ) (-192 -576 128 ) +4 44 54 0 (-288 -576 144 ) (-304 -576 144 ) (-304 -576 32 ) (-288 -576 32 ) +4 44 47 0 (-176 -576 144 ) (-176 -576 160 ) (-304 -576 160 ) (-304 -576 144 ) +4 44 55 0 (-320 -576 160 ) (-320 -576 16 ) (-304 -576 16 ) (-304 -576 160 ) +4 44 46 0 (-160 -576 176 ) (-320 -576 176 ) (-320 -576 160 ) (-160 -576 160 ) +4 44 56 0 (-320 -576 176 ) (-480 -576 176 ) (-480 -576 0 ) (-320 -576 0 ) +4 44 45 0 (-64 -576 176 ) (-64 -576 608 ) (-480 -576 608 ) (-480 -576 176 ) +4 45 57 0 (-64 -696 176 ) (-64 -696 608 ) (-480 -696 608 ) (-480 -696 176 ) +4 45 46 0 (-160 -696 176 ) (-320 -696 176 ) (-320 -576 176 ) (-160 -576 176 ) +4 45 56 0 (-320 -696 176 ) (-480 -696 176 ) (-480 -576 176 ) (-320 -576 176 ) +4 46 57 0 (-160 -696 176 ) (-320 -696 176 ) (-320 -696 160 ) (-160 -696 160 ) +4 46 47 0 (-304 -576 160 ) (-176 -576 160 ) (-176 -696 160 ) (-304 -696 160 ) +4 46 55 0 (-320 -696 160 ) (-320 -576 160 ) (-304 -576 160 ) (-304 -696 160 ) +4 46 56 0 (-320 -696 160 ) (-320 -696 176 ) (-320 -576 176 ) (-320 -576 160 ) +4 47 57 0 (-176 -696 144 ) (-176 -696 160 ) (-304 -696 160 ) (-304 -696 144 ) +4 47 48 0 (-288 -576 144 ) (-192 -576 144 ) (-192 -696 144 ) (-288 -696 144 ) +4 47 54 0 (-304 -696 144 ) (-304 -576 144 ) (-288 -576 144 ) (-288 -696 144 ) +4 47 55 0 (-304 -696 144 ) (-304 -696 160 ) (-304 -576 160 ) (-304 -576 144 ) +4 48 57 0 (-192 -696 144 ) (-288 -696 144 ) (-288 -696 128 ) (-192 -696 128 ) +4 48 49 0 (-272 -576 128 ) (-208 -576 128 ) (-208 -696 128 ) (-272 -696 128 ) +4 48 53 0 (-288 -696 128 ) (-288 -576 128 ) (-272 -576 128 ) (-272 -696 128 ) +4 48 54 0 (-288 -696 128 ) (-288 -696 144 ) (-288 -576 144 ) (-288 -576 128 ) +4 49 57 0 (-208 -696 112 ) (-208 -696 128 ) (-272 -696 128 ) (-272 -696 112 ) +4 49 50 0 (-256 -576 112 ) (-224 -576 112 ) (-224 -696 112 ) (-256 -696 112 ) +4 49 52 0 (-272 -696 112 ) (-272 -576 112 ) (-256 -576 112 ) (-256 -696 112 ) +4 49 53 0 (-272 -696 112 ) (-272 -696 128 ) (-272 -576 128 ) (-272 -576 112 ) +4 50 57 0 (-224 -696 112 ) (-256 -696 112 ) (-256 -696 96 ) (-224 -696 96 ) +4 50 51 0 (-256 -696 96 ) (-256 -576 96 ) (-240 -576 96 ) (-240 -696 96 ) +4 50 52 0 (-256 -696 96 ) (-256 -696 112 ) (-256 -576 112 ) (-256 -576 96 ) +4 51 57 0 (-256 -696 96 ) (-256 -696 80 ) (-240 -696 80 ) (-240 -696 96 ) +4 51 52 0 (-256 -696 80 ) (-256 -696 96 ) (-256 -576 96 ) (-256 -576 80 ) +4 52 57 0 (-256 -696 112 ) (-272 -696 112 ) (-272 -696 64 ) (-256 -696 64 ) +4 52 53 0 (-272 -696 64 ) (-272 -696 112 ) (-272 -576 112 ) (-272 -576 64 ) +4 53 57 0 (-288 -696 128 ) (-288 -696 48 ) (-272 -696 48 ) (-272 -696 128 ) +4 53 54 0 (-288 -696 48 ) (-288 -696 128 ) (-288 -576 128 ) (-288 -576 48 ) +4 54 57 0 (-288 -696 144 ) (-304 -696 144 ) (-304 -696 32 ) (-288 -696 32 ) +4 54 55 0 (-304 -696 32 ) (-304 -696 144 ) (-304 -576 144 ) (-304 -576 32 ) +4 55 57 0 (-320 -696 160 ) (-320 -696 16 ) (-304 -696 16 ) (-304 -696 160 ) +4 55 56 0 (-320 -696 16 ) (-320 -696 160 ) (-320 -576 160 ) (-320 -576 16 ) +4 56 57 0 (-320 -696 176 ) (-480 -696 176 ) (-480 -696 0 ) (-320 -696 0 ) +4 57 69 0 (-320 -896 16 ) (-480 -896 16 ) (-480 -896 0 ) (-320 -896 0 ) +4 57 68 0 (-304 -896 32 ) (-480 -896 32 ) (-480 -896 16 ) (-304 -896 16 ) +4 57 67 0 (-480 -896 48 ) (-480 -896 32 ) (-288 -896 32 ) (-288 -896 48 ) +4 57 66 0 (-480 -896 64 ) (-480 -896 48 ) (-272 -896 48 ) (-272 -896 64 ) +4 57 65 0 (-480 -896 80 ) (-480 -896 64 ) (-256 -896 64 ) (-256 -896 80 ) +4 57 64 0 (-480 -896 96 ) (-480 -896 80 ) (-240 -896 80 ) (-240 -896 96 ) +4 57 62 0 (-208 -896 608 ) (-224 -896 608 ) (-224 -896 112 ) (-208 -896 112 ) +4 57 63 0 (-224 -896 608 ) (-480 -896 608 ) (-480 -896 96 ) (-224 -896 96 ) +4 57 61 0 (-192 -896 608 ) (-208 -896 608 ) (-208 -896 128 ) (-192 -896 128 ) +4 57 60 0 (-176 -896 608 ) (-192 -896 608 ) (-192 -896 144 ) (-176 -896 144 ) +4 57 59 0 (-160 -896 608 ) (-176 -896 608 ) (-176 -896 160 ) (-160 -896 160 ) +4 57 58 0 (-64 -896 176 ) (-64 -896 608 ) (-160 -896 608 ) (-160 -896 176 ) +4 58 70 0 (-64 -1016 176 ) (-64 -1016 608 ) (-160 -1016 608 ) (-160 -1016 176 ) +4 58 59 0 (-160 -1016 176 ) (-160 -1016 608 ) (-160 -896 608 ) (-160 -896 176 ) +4 59 70 0 (-160 -1016 608 ) (-176 -1016 608 ) (-176 -1016 160 ) (-160 -1016 160 ) +4 59 60 0 (-176 -1016 160 ) (-176 -1016 608 ) (-176 -896 608 ) (-176 -896 160 ) +4 60 70 0 (-176 -1016 608 ) (-192 -1016 608 ) (-192 -1016 144 ) (-176 -1016 144 ) +4 60 61 0 (-192 -1016 144 ) (-192 -1016 608 ) (-192 -896 608 ) (-192 -896 144 ) +4 61 70 0 (-192 -1016 608 ) (-208 -1016 608 ) (-208 -1016 128 ) (-192 -1016 128 ) +4 61 62 0 (-208 -1016 128 ) (-208 -1016 608 ) (-208 -896 608 ) (-208 -896 128 ) +4 62 70 0 (-208 -1016 608 ) (-224 -1016 608 ) (-224 -1016 112 ) (-208 -1016 112 ) +4 62 63 0 (-224 -1016 112 ) (-224 -1016 608 ) (-224 -896 608 ) (-224 -896 112 ) +4 63 70 0 (-224 -1016 608 ) (-480 -1016 608 ) (-480 -1016 96 ) (-224 -1016 96 ) +4 63 64 0 (-480 -1016 96 ) (-480 -896 96 ) (-240 -896 96 ) (-240 -1016 96 ) +4 64 70 0 (-480 -1016 96 ) (-480 -1016 80 ) (-240 -1016 80 ) (-240 -1016 96 ) +4 64 65 0 (-480 -1016 80 ) (-480 -896 80 ) (-256 -896 80 ) (-256 -1016 80 ) +4 65 70 0 (-480 -1016 80 ) (-480 -1016 64 ) (-256 -1016 64 ) (-256 -1016 80 ) +4 65 66 0 (-480 -1016 64 ) (-480 -896 64 ) (-272 -896 64 ) (-272 -1016 64 ) +4 66 70 0 (-480 -1016 64 ) (-480 -1016 48 ) (-272 -1016 48 ) (-272 -1016 64 ) +4 66 67 0 (-480 -1016 48 ) (-480 -896 48 ) (-288 -896 48 ) (-288 -1016 48 ) +4 67 70 0 (-480 -1016 48 ) (-480 -1016 32 ) (-288 -1016 32 ) (-288 -1016 48 ) +4 67 68 0 (-304 -1016 32 ) (-480 -1016 32 ) (-480 -896 32 ) (-304 -896 32 ) +4 68 70 0 (-304 -1016 32 ) (-480 -1016 32 ) (-480 -1016 16 ) (-304 -1016 16 ) +4 68 69 0 (-320 -1016 16 ) (-480 -1016 16 ) (-480 -896 16 ) (-320 -896 16 ) +4 69 70 0 (-320 -1016 16 ) (-480 -1016 16 ) (-480 -1016 0 ) (-320 -1016 0 ) +4 70 72 0 (-64 -1024 0 ) (-64 -1024 64 ) (-480 -1024 64 ) (-480 -1024 0 ) +4 70 71 0 (-64 -1024 64 ) (-64 -1024 608 ) (-480 -1024 608 ) (-480 -1024 64 ) +4 71 72 0 (-480 -1240 64 ) (-480 -1024 64 ) (0 -1024 64 ) (0 -1240 64 ) +4 0 (0 192 0 ) (192 192 0 ) (192 0 0 ) (0 0 0 ) +4 0 (192 192 0 ) (192 192 608 ) (192 0 608 ) (192 0 0 ) +4 0 (192 192 608 ) (192 192 0 ) (0 192 0 ) (0 192 608 ) +4 0 (0 0 608 ) (192 0 608 ) (192 192 608 ) (0 192 608 ) +4 1 (0 -1024 608 ) (192 -1024 608 ) (192 0 608 ) (0 0 608 ) +4 1 (192 -1024 608 ) (192 -1024 0 ) (192 0 0 ) (192 0 608 ) +4 1 (0 0 0 ) (192 0 0 ) (192 -1024 0 ) (0 -1024 0 ) +4 2 (0 -1272 64 ) (0 -1240 64 ) (192 -1240 64 ) (192 -1272 64 ) +4 2 (192 -1272 608 ) (192 -1024 608 ) (0 -1024 608 ) (0 -1272 608 ) +4 2 (192 -1272 608 ) (192 -1272 64 ) (192 -1024 64 ) (192 -1024 608 ) +4 2 (0 -1272 64 ) (192 -1272 64 ) (192 -1272 608 ) (0 -1272 608 ) +4 3 (0 -1240 0 ) (0 -1024 0 ) (192 -1024 0 ) (192 -1240 0 ) +4 3 (192 -1240 64 ) (192 -1240 0 ) (192 -1024 0 ) (192 -1024 64 ) +4 3 (0 -1240 0 ) (192 -1240 0 ) (192 -1240 64 ) (0 -1240 64 ) +4 4 (-64 0 0 ) (-64 0 176 ) (-64 64 176 ) (-64 64 0 ) +4 4 (0 0 0 ) (-64 0 0 ) (-64 192 0 ) (0 192 0 ) +4 4 (0 192 608 ) (0 192 0 ) (-64 192 0 ) (-64 192 608 ) +4 4 (0 192 608 ) (-64 192 608 ) (-64 0 608 ) (0 0 608 ) +4 5 (-240 64 80 ) (-224 64 80 ) (-224 64 96 ) (-240 64 96 ) +4 5 (-256 64 80 ) (-256 64 64 ) (-224 64 64 ) (-224 64 80 ) +4 5 (-208 64 64 ) (-208 64 112 ) (-224 64 112 ) (-224 64 64 ) +4 5 (-272 64 48 ) (-208 64 48 ) (-208 64 64 ) (-272 64 64 ) +4 5 (-208 64 48 ) (-192 64 48 ) (-192 64 128 ) (-208 64 128 ) +4 5 (-288 64 48 ) (-288 64 32 ) (-192 64 32 ) (-192 64 48 ) +4 5 (-176 64 32 ) (-176 64 144 ) (-192 64 144 ) (-192 64 32 ) +4 5 (-304 64 16 ) (-176 64 16 ) (-176 64 32 ) (-304 64 32 ) +4 5 (-176 64 16 ) (-160 64 16 ) (-160 64 160 ) (-176 64 160 ) +4 5 (-320 64 16 ) (-320 64 0 ) (-160 64 0 ) (-160 64 16 ) +4 5 (-64 64 0 ) (-64 64 176 ) (-160 64 176 ) (-160 64 0 ) +4 5 (-64 64 0 ) (-480 64 0 ) (-480 192 0 ) (-64 192 0 ) +4 5 (-480 64 0 ) (-480 64 608 ) (-480 192 608 ) (-480 192 0 ) +4 5 (-64 192 608 ) (-64 192 0 ) (-480 192 0 ) (-480 192 608 ) +4 5 (-64 192 608 ) (-480 192 608 ) (-480 64 608 ) (-64 64 608 ) +4 6 (-160 64 176 ) (-64 64 176 ) (-64 0 176 ) (-160 0 176 ) +4 6 (-480 64 608 ) (-480 64 176 ) (-480 0 176 ) (-480 0 608 ) +4 6 (-64 0 608 ) (-64 64 608 ) (-480 64 608 ) (-480 0 608 ) +4 7 (-176 64 160 ) (-160 64 160 ) (-160 0 160 ) (-176 0 160 ) +4 7 (-160 64 160 ) (-160 64 176 ) (-160 0 176 ) (-160 0 160 ) +4 8 (-192 64 144 ) (-176 64 144 ) (-176 0 144 ) (-192 0 144 ) +4 8 (-176 64 144 ) (-176 64 160 ) (-176 0 160 ) (-176 0 144 ) +4 9 (-208 64 128 ) (-192 64 128 ) (-192 0 128 ) (-208 0 128 ) +4 9 (-192 64 128 ) (-192 64 144 ) (-192 0 144 ) (-192 0 128 ) +4 10 (-224 64 112 ) (-208 64 112 ) (-208 0 112 ) (-224 0 112 ) +4 10 (-208 64 112 ) (-208 64 128 ) (-208 0 128 ) (-208 0 112 ) +4 11 (-240 64 96 ) (-224 64 96 ) (-224 0 96 ) (-240 0 96 ) +4 11 (-224 64 96 ) (-224 64 112 ) (-224 0 112 ) (-224 0 96 ) +4 12 (-256 0 80 ) (-256 64 80 ) (-240 64 80 ) (-240 0 80 ) +4 12 (-240 64 96 ) (-240 0 96 ) (-240 0 80 ) (-240 64 80 ) +4 13 (-256 64 80 ) (-256 0 80 ) (-256 0 64 ) (-256 64 64 ) +4 13 (-272 0 64 ) (-272 64 64 ) (-256 64 64 ) (-256 0 64 ) +4 14 (-272 64 64 ) (-272 0 64 ) (-272 0 48 ) (-272 64 48 ) +4 14 (-288 0 48 ) (-288 64 48 ) (-272 64 48 ) (-272 0 48 ) +4 15 (-288 64 48 ) (-288 0 48 ) (-288 0 32 ) (-288 64 32 ) +4 15 (-304 0 32 ) (-304 64 32 ) (-288 64 32 ) (-288 0 32 ) +4 16 (-304 64 32 ) (-304 0 32 ) (-304 0 16 ) (-304 64 16 ) +4 16 (-320 0 16 ) (-320 64 16 ) (-304 64 16 ) (-304 0 16 ) +4 17 (-320 64 16 ) (-320 0 16 ) (-320 0 0 ) (-320 64 0 ) +4 17 (-480 64 176 ) (-480 64 0 ) (-480 0 0 ) (-480 0 176 ) +4 17 (-480 0 0 ) (-480 64 0 ) (-320 64 0 ) (-320 0 0 ) +4 18 (-64 -896 0 ) (-64 -1016 0 ) (-64 -1016 16 ) (-64 -896 16 ) +4 18 (-64 -1016 16 ) (-64 -1016 32 ) (-64 -896 32 ) (-64 -896 16 ) +4 18 (-64 -1016 32 ) (-64 -1016 176 ) (-64 -896 176 ) (-64 -896 32 ) +4 18 (-64 -576 0 ) (-64 -696 0 ) (-64 -696 176 ) (-64 -576 176 ) +4 18 (-64 -264 0 ) (-64 -384 0 ) (-64 -384 16 ) (-64 -264 16 ) +4 18 (-64 -384 16 ) (-64 -384 32 ) (-64 -264 32 ) (-64 -264 16 ) +4 18 (-64 -384 32 ) (-64 -384 176 ) (-64 -264 176 ) (-64 -264 32 ) +4 18 (-64 0 176 ) (-64 0 0 ) (-64 -56 0 ) (-64 -56 176 ) +4 18 (0 0 608 ) (-64 0 608 ) (-64 -1024 608 ) (0 -1024 608 ) +4 18 (0 -1024 0 ) (-64 -1024 0 ) (-64 0 0 ) (0 0 0 ) +4 19 (-64 -56 176 ) (-160 -56 176 ) (-160 0 176 ) (-64 0 176 ) +4 19 (-480 0 608 ) (-480 0 176 ) (-480 -56 176 ) (-480 -56 608 ) +4 19 (-64 0 608 ) (-480 0 608 ) (-480 -56 608 ) (-64 -56 608 ) +4 20 (-176 0 160 ) (-160 0 160 ) (-160 -56 160 ) (-176 -56 160 ) +4 20 (-160 0 160 ) (-160 0 176 ) (-160 -56 176 ) (-160 -56 160 ) +4 21 (-192 0 144 ) (-176 0 144 ) (-176 -56 144 ) (-192 -56 144 ) +4 21 (-176 0 144 ) (-176 0 160 ) (-176 -56 160 ) (-176 -56 144 ) +4 22 (-208 0 128 ) (-192 0 128 ) (-192 -56 128 ) (-208 -56 128 ) +4 22 (-192 0 128 ) (-192 0 144 ) (-192 -56 144 ) (-192 -56 128 ) +4 23 (-224 0 112 ) (-208 0 112 ) (-208 -56 112 ) (-224 -56 112 ) +4 23 (-208 0 112 ) (-208 0 128 ) (-208 -56 128 ) (-208 -56 112 ) +4 24 (-240 0 96 ) (-224 0 96 ) (-224 -56 96 ) (-240 -56 96 ) +4 24 (-224 0 96 ) (-224 0 112 ) (-224 -56 112 ) (-224 -56 96 ) +4 25 (-256 -56 80 ) (-256 0 80 ) (-240 0 80 ) (-240 -56 80 ) +4 25 (-240 0 96 ) (-240 -56 96 ) (-240 -56 80 ) (-240 0 80 ) +4 26 (-256 0 80 ) (-256 -56 80 ) (-256 -56 64 ) (-256 0 64 ) +4 26 (-272 -56 64 ) (-272 0 64 ) (-256 0 64 ) (-256 -56 64 ) +4 27 (-272 0 64 ) (-272 -56 64 ) (-272 -56 48 ) (-272 0 48 ) +4 27 (-288 -56 48 ) (-288 0 48 ) (-272 0 48 ) (-272 -56 48 ) +4 28 (-288 0 48 ) (-288 -56 48 ) (-288 -56 32 ) (-288 0 32 ) +4 28 (-304 -56 32 ) (-304 0 32 ) (-288 0 32 ) (-288 -56 32 ) +4 29 (-304 0 32 ) (-304 -56 32 ) (-304 -56 16 ) (-304 0 16 ) +4 29 (-320 -56 16 ) (-320 0 16 ) (-304 0 16 ) (-304 -56 16 ) +4 30 (-320 0 16 ) (-320 -56 16 ) (-320 -56 0 ) (-320 0 0 ) +4 30 (-480 0 176 ) (-480 0 0 ) (-480 -56 0 ) (-480 -56 176 ) +4 30 (-320 -56 0 ) (-480 -56 0 ) (-480 0 0 ) (-320 0 0 ) +4 31 (-64 -264 0 ) (-64 -264 16 ) (-320 -264 16 ) (-320 -264 0 ) +4 31 (-64 -264 16 ) (-64 -264 32 ) (-304 -264 32 ) (-304 -264 16 ) +4 31 (-288 -264 32 ) (-160 -264 32 ) (-160 -264 48 ) (-288 -264 48 ) +4 31 (-272 -264 48 ) (-176 -264 48 ) (-176 -264 64 ) (-272 -264 64 ) +4 31 (-256 -264 64 ) (-192 -264 64 ) (-192 -264 80 ) (-256 -264 80 ) +4 31 (-240 -264 80 ) (-208 -264 80 ) (-208 -264 96 ) (-240 -264 96 ) +4 31 (-224 -264 112 ) (-224 -264 96 ) (-208 -264 96 ) (-208 -264 112 ) +4 31 (-208 -264 128 ) (-208 -264 80 ) (-192 -264 80 ) (-192 -264 128 ) +4 31 (-192 -264 144 ) (-192 -264 64 ) (-176 -264 64 ) (-176 -264 144 ) +4 31 (-176 -264 160 ) (-176 -264 48 ) (-160 -264 48 ) (-160 -264 160 ) +4 31 (-64 -264 32 ) (-64 -264 176 ) (-160 -264 176 ) (-160 -264 32 ) +4 31 (-64 -56 608 ) (-480 -56 608 ) (-480 -264 608 ) (-64 -264 608 ) +4 31 (-240 -56 96 ) (-224 -56 96 ) (-224 -56 80 ) (-240 -56 80 ) +4 31 (-224 -56 80 ) (-224 -56 64 ) (-256 -56 64 ) (-256 -56 80 ) +4 31 (-224 -56 64 ) (-224 -56 112 ) (-208 -56 112 ) (-208 -56 64 ) +4 31 (-272 -56 64 ) (-208 -56 64 ) (-208 -56 48 ) (-272 -56 48 ) +4 31 (-208 -56 128 ) (-192 -56 128 ) (-192 -56 48 ) (-208 -56 48 ) +4 31 (-192 -56 48 ) (-192 -56 32 ) (-288 -56 32 ) (-288 -56 48 ) +4 31 (-192 -56 32 ) (-192 -56 144 ) (-176 -56 144 ) (-176 -56 32 ) +4 31 (-304 -56 32 ) (-176 -56 32 ) (-176 -56 16 ) (-304 -56 16 ) +4 31 (-176 -56 160 ) (-160 -56 160 ) (-160 -56 16 ) (-176 -56 16 ) +4 31 (-160 -56 16 ) (-160 -56 0 ) (-320 -56 0 ) (-320 -56 16 ) +4 31 (-160 -56 0 ) (-160 -56 176 ) (-64 -56 176 ) (-64 -56 0 ) +4 31 (-480 -56 608 ) (-480 -56 0 ) (-480 -264 0 ) (-480 -264 608 ) +4 31 (-64 -264 0 ) (-480 -264 0 ) (-480 -56 0 ) (-64 -56 0 ) +4 32 (-64 -264 608 ) (-160 -264 608 ) (-160 -384 608 ) (-64 -384 608 ) +4 32 (-64 -384 176 ) (-160 -384 176 ) (-160 -264 176 ) (-64 -264 176 ) +4 33 (-160 -264 608 ) (-176 -264 608 ) (-176 -384 608 ) (-160 -384 608 ) +4 33 (-160 -264 160 ) (-160 -264 176 ) (-160 -384 176 ) (-160 -384 160 ) +4 33 (-176 -384 160 ) (-176 -264 160 ) (-160 -264 160 ) (-160 -384 160 ) +4 34 (-176 -264 608 ) (-192 -264 608 ) (-192 -384 608 ) (-176 -384 608 ) +4 34 (-176 -264 144 ) (-176 -264 160 ) (-176 -384 160 ) (-176 -384 144 ) +4 34 (-192 -384 144 ) (-192 -264 144 ) (-176 -264 144 ) (-176 -384 144 ) +4 35 (-192 -264 608 ) (-208 -264 608 ) (-208 -384 608 ) (-192 -384 608 ) +4 35 (-192 -264 128 ) (-192 -264 144 ) (-192 -384 144 ) (-192 -384 128 ) +4 35 (-208 -384 128 ) (-208 -264 128 ) (-192 -264 128 ) (-192 -384 128 ) +4 36 (-208 -264 608 ) (-224 -264 608 ) (-224 -384 608 ) (-208 -384 608 ) +4 36 (-208 -264 112 ) (-208 -264 128 ) (-208 -384 128 ) (-208 -384 112 ) +4 36 (-224 -384 112 ) (-224 -264 112 ) (-208 -264 112 ) (-208 -384 112 ) +4 37 (-240 -264 96 ) (-224 -264 96 ) (-224 -384 96 ) (-240 -384 96 ) +4 37 (-224 -264 112 ) (-224 -384 112 ) (-224 -384 96 ) (-224 -264 96 ) +4 37 (-480 -264 608 ) (-480 -264 96 ) (-480 -384 96 ) (-480 -384 608 ) +4 37 (-224 -264 608 ) (-480 -264 608 ) (-480 -384 608 ) (-224 -384 608 ) +4 38 (-256 -264 80 ) (-240 -264 80 ) (-240 -384 80 ) (-256 -384 80 ) +4 38 (-480 -264 96 ) (-480 -264 80 ) (-480 -384 80 ) (-480 -384 96 ) +4 38 (-240 -264 96 ) (-240 -384 96 ) (-240 -384 80 ) (-240 -264 80 ) +4 39 (-272 -264 64 ) (-256 -264 64 ) (-256 -384 64 ) (-272 -384 64 ) +4 39 (-480 -264 80 ) (-480 -264 64 ) (-480 -384 64 ) (-480 -384 80 ) +4 39 (-256 -264 80 ) (-256 -384 80 ) (-256 -384 64 ) (-256 -264 64 ) +4 40 (-288 -264 48 ) (-272 -264 48 ) (-272 -384 48 ) (-288 -384 48 ) +4 40 (-480 -264 64 ) (-480 -264 48 ) (-480 -384 48 ) (-480 -384 64 ) +4 40 (-272 -264 64 ) (-272 -384 64 ) (-272 -384 48 ) (-272 -264 48 ) +4 41 (-288 -384 32 ) (-304 -384 32 ) (-304 -264 32 ) (-288 -264 32 ) +4 41 (-480 -264 48 ) (-480 -264 32 ) (-480 -384 32 ) (-480 -384 48 ) +4 41 (-288 -264 48 ) (-288 -384 48 ) (-288 -384 32 ) (-288 -264 32 ) +4 42 (-304 -384 16 ) (-320 -384 16 ) (-320 -264 16 ) (-304 -264 16 ) +4 42 (-480 -264 32 ) (-480 -264 16 ) (-480 -384 16 ) (-480 -384 32 ) +4 42 (-304 -264 32 ) (-304 -384 32 ) (-304 -384 16 ) (-304 -264 16 ) +4 43 (-320 -384 0 ) (-480 -384 0 ) (-480 -264 0 ) (-320 -264 0 ) +4 43 (-480 -264 16 ) (-480 -264 0 ) (-480 -384 0 ) (-480 -384 16 ) +4 43 (-320 -264 16 ) (-320 -384 16 ) (-320 -384 0 ) (-320 -264 0 ) +4 44 (-240 -576 80 ) (-224 -576 80 ) (-224 -576 96 ) (-240 -576 96 ) +4 44 (-256 -576 80 ) (-256 -576 64 ) (-224 -576 64 ) (-224 -576 80 ) +4 44 (-208 -576 64 ) (-208 -576 112 ) (-224 -576 112 ) (-224 -576 64 ) +4 44 (-272 -576 48 ) (-208 -576 48 ) (-208 -576 64 ) (-272 -576 64 ) +4 44 (-208 -576 48 ) (-192 -576 48 ) (-192 -576 128 ) (-208 -576 128 ) +4 44 (-288 -576 48 ) (-288 -576 32 ) (-192 -576 32 ) (-192 -576 48 ) +4 44 (-176 -576 32 ) (-176 -576 144 ) (-192 -576 144 ) (-192 -576 32 ) +4 44 (-304 -576 16 ) (-176 -576 16 ) (-176 -576 32 ) (-304 -576 32 ) +4 44 (-176 -576 16 ) (-160 -576 16 ) (-160 -576 160 ) (-176 -576 160 ) +4 44 (-320 -576 16 ) (-320 -576 0 ) (-160 -576 0 ) (-160 -576 16 ) +4 44 (-64 -576 0 ) (-64 -576 176 ) (-160 -576 176 ) (-160 -576 0 ) +4 44 (-64 -576 0 ) (-480 -576 0 ) (-480 -384 0 ) (-64 -384 0 ) +4 44 (-160 -384 32 ) (-160 -384 176 ) (-64 -384 176 ) (-64 -384 32 ) +4 44 (-160 -384 160 ) (-160 -384 48 ) (-176 -384 48 ) (-176 -384 160 ) +4 44 (-176 -384 144 ) (-176 -384 64 ) (-192 -384 64 ) (-192 -384 144 ) +4 44 (-192 -384 128 ) (-192 -384 80 ) (-208 -384 80 ) (-208 -384 128 ) +4 44 (-208 -384 112 ) (-208 -384 96 ) (-224 -384 96 ) (-224 -384 112 ) +4 44 (-240 -384 96 ) (-208 -384 96 ) (-208 -384 80 ) (-240 -384 80 ) +4 44 (-256 -384 80 ) (-192 -384 80 ) (-192 -384 64 ) (-256 -384 64 ) +4 44 (-272 -384 64 ) (-176 -384 64 ) (-176 -384 48 ) (-272 -384 48 ) +4 44 (-288 -384 48 ) (-160 -384 48 ) (-160 -384 32 ) (-288 -384 32 ) +4 44 (-304 -384 16 ) (-304 -384 32 ) (-64 -384 32 ) (-64 -384 16 ) +4 44 (-320 -384 0 ) (-320 -384 16 ) (-64 -384 16 ) (-64 -384 0 ) +4 44 (-480 -384 608 ) (-480 -384 0 ) (-480 -576 0 ) (-480 -576 608 ) +4 44 (-64 -384 608 ) (-480 -384 608 ) (-480 -576 608 ) (-64 -576 608 ) +4 45 (-64 -696 176 ) (-160 -696 176 ) (-160 -576 176 ) (-64 -576 176 ) +4 45 (-480 -576 608 ) (-480 -576 176 ) (-480 -696 176 ) (-480 -696 608 ) +4 45 (-64 -576 608 ) (-480 -576 608 ) (-480 -696 608 ) (-64 -696 608 ) +4 46 (-176 -576 160 ) (-160 -576 160 ) (-160 -696 160 ) (-176 -696 160 ) +4 46 (-160 -576 160 ) (-160 -576 176 ) (-160 -696 176 ) (-160 -696 160 ) +4 47 (-192 -576 144 ) (-176 -576 144 ) (-176 -696 144 ) (-192 -696 144 ) +4 47 (-176 -576 144 ) (-176 -576 160 ) (-176 -696 160 ) (-176 -696 144 ) +4 48 (-208 -576 128 ) (-192 -576 128 ) (-192 -696 128 ) (-208 -696 128 ) +4 48 (-192 -576 128 ) (-192 -576 144 ) (-192 -696 144 ) (-192 -696 128 ) +4 49 (-224 -576 112 ) (-208 -576 112 ) (-208 -696 112 ) (-224 -696 112 ) +4 49 (-208 -576 112 ) (-208 -576 128 ) (-208 -696 128 ) (-208 -696 112 ) +4 50 (-240 -576 96 ) (-224 -576 96 ) (-224 -696 96 ) (-240 -696 96 ) +4 50 (-224 -576 96 ) (-224 -576 112 ) (-224 -696 112 ) (-224 -696 96 ) +4 51 (-256 -696 80 ) (-256 -576 80 ) (-240 -576 80 ) (-240 -696 80 ) +4 51 (-240 -576 96 ) (-240 -696 96 ) (-240 -696 80 ) (-240 -576 80 ) +4 52 (-256 -576 80 ) (-256 -696 80 ) (-256 -696 64 ) (-256 -576 64 ) +4 52 (-272 -696 64 ) (-272 -576 64 ) (-256 -576 64 ) (-256 -696 64 ) +4 53 (-272 -576 64 ) (-272 -696 64 ) (-272 -696 48 ) (-272 -576 48 ) +4 53 (-288 -696 48 ) (-288 -576 48 ) (-272 -576 48 ) (-272 -696 48 ) +4 54 (-288 -576 48 ) (-288 -696 48 ) (-288 -696 32 ) (-288 -576 32 ) +4 54 (-304 -696 32 ) (-304 -576 32 ) (-288 -576 32 ) (-288 -696 32 ) +4 55 (-304 -576 32 ) (-304 -696 32 ) (-304 -696 16 ) (-304 -576 16 ) +4 55 (-320 -696 16 ) (-320 -576 16 ) (-304 -576 16 ) (-304 -696 16 ) +4 56 (-320 -576 16 ) (-320 -696 16 ) (-320 -696 0 ) (-320 -576 0 ) +4 56 (-480 -576 176 ) (-480 -576 0 ) (-480 -696 0 ) (-480 -696 176 ) +4 56 (-320 -696 0 ) (-480 -696 0 ) (-480 -576 0 ) (-320 -576 0 ) +4 57 (-64 -896 0 ) (-64 -896 16 ) (-320 -896 16 ) (-320 -896 0 ) +4 57 (-64 -896 16 ) (-64 -896 32 ) (-304 -896 32 ) (-304 -896 16 ) +4 57 (-288 -896 32 ) (-160 -896 32 ) (-160 -896 48 ) (-288 -896 48 ) +4 57 (-272 -896 48 ) (-176 -896 48 ) (-176 -896 64 ) (-272 -896 64 ) +4 57 (-256 -896 64 ) (-192 -896 64 ) (-192 -896 80 ) (-256 -896 80 ) +4 57 (-240 -896 80 ) (-208 -896 80 ) (-208 -896 96 ) (-240 -896 96 ) +4 57 (-224 -896 112 ) (-224 -896 96 ) (-208 -896 96 ) (-208 -896 112 ) +4 57 (-208 -896 128 ) (-208 -896 80 ) (-192 -896 80 ) (-192 -896 128 ) +4 57 (-192 -896 144 ) (-192 -896 64 ) (-176 -896 64 ) (-176 -896 144 ) +4 57 (-176 -896 160 ) (-176 -896 48 ) (-160 -896 48 ) (-160 -896 160 ) +4 57 (-64 -896 32 ) (-64 -896 176 ) (-160 -896 176 ) (-160 -896 32 ) +4 57 (-64 -896 0 ) (-480 -896 0 ) (-480 -696 0 ) (-64 -696 0 ) +4 57 (-160 -696 0 ) (-160 -696 176 ) (-64 -696 176 ) (-64 -696 0 ) +4 57 (-160 -696 16 ) (-160 -696 0 ) (-320 -696 0 ) (-320 -696 16 ) +4 57 (-176 -696 160 ) (-160 -696 160 ) (-160 -696 16 ) (-176 -696 16 ) +4 57 (-304 -696 32 ) (-176 -696 32 ) (-176 -696 16 ) (-304 -696 16 ) +4 57 (-192 -696 32 ) (-192 -696 144 ) (-176 -696 144 ) (-176 -696 32 ) +4 57 (-192 -696 48 ) (-192 -696 32 ) (-288 -696 32 ) (-288 -696 48 ) +4 57 (-208 -696 128 ) (-192 -696 128 ) (-192 -696 48 ) (-208 -696 48 ) +4 57 (-272 -696 64 ) (-208 -696 64 ) (-208 -696 48 ) (-272 -696 48 ) +4 57 (-224 -696 64 ) (-224 -696 112 ) (-208 -696 112 ) (-208 -696 64 ) +4 57 (-224 -696 80 ) (-224 -696 64 ) (-256 -696 64 ) (-256 -696 80 ) +4 57 (-240 -696 96 ) (-224 -696 96 ) (-224 -696 80 ) (-240 -696 80 ) +4 57 (-480 -696 608 ) (-480 -696 0 ) (-480 -896 0 ) (-480 -896 608 ) +4 57 (-64 -696 608 ) (-480 -696 608 ) (-480 -896 608 ) (-64 -896 608 ) +4 58 (-64 -896 608 ) (-160 -896 608 ) (-160 -1016 608 ) (-64 -1016 608 ) +4 58 (-64 -1016 176 ) (-160 -1016 176 ) (-160 -896 176 ) (-64 -896 176 ) +4 59 (-160 -896 608 ) (-176 -896 608 ) (-176 -1016 608 ) (-160 -1016 608 ) +4 59 (-160 -896 160 ) (-160 -896 176 ) (-160 -1016 176 ) (-160 -1016 160 ) +4 59 (-176 -1016 160 ) (-176 -896 160 ) (-160 -896 160 ) (-160 -1016 160 ) +4 60 (-176 -896 608 ) (-192 -896 608 ) (-192 -1016 608 ) (-176 -1016 608 ) +4 60 (-176 -896 144 ) (-176 -896 160 ) (-176 -1016 160 ) (-176 -1016 144 ) +4 60 (-192 -1016 144 ) (-192 -896 144 ) (-176 -896 144 ) (-176 -1016 144 ) +4 61 (-192 -896 608 ) (-208 -896 608 ) (-208 -1016 608 ) (-192 -1016 608 ) +4 61 (-192 -896 128 ) (-192 -896 144 ) (-192 -1016 144 ) (-192 -1016 128 ) +4 61 (-208 -1016 128 ) (-208 -896 128 ) (-192 -896 128 ) (-192 -1016 128 ) +4 62 (-208 -896 608 ) (-224 -896 608 ) (-224 -1016 608 ) (-208 -1016 608 ) +4 62 (-208 -896 112 ) (-208 -896 128 ) (-208 -1016 128 ) (-208 -1016 112 ) +4 62 (-224 -1016 112 ) (-224 -896 112 ) (-208 -896 112 ) (-208 -1016 112 ) +4 63 (-240 -896 96 ) (-224 -896 96 ) (-224 -1016 96 ) (-240 -1016 96 ) +4 63 (-224 -896 112 ) (-224 -1016 112 ) (-224 -1016 96 ) (-224 -896 96 ) +4 63 (-480 -896 608 ) (-480 -896 96 ) (-480 -1016 96 ) (-480 -1016 608 ) +4 63 (-224 -896 608 ) (-480 -896 608 ) (-480 -1016 608 ) (-224 -1016 608 ) +4 64 (-256 -896 80 ) (-240 -896 80 ) (-240 -1016 80 ) (-256 -1016 80 ) +4 64 (-480 -896 96 ) (-480 -896 80 ) (-480 -1016 80 ) (-480 -1016 96 ) +4 64 (-240 -896 96 ) (-240 -1016 96 ) (-240 -1016 80 ) (-240 -896 80 ) +4 65 (-272 -896 64 ) (-256 -896 64 ) (-256 -1016 64 ) (-272 -1016 64 ) +4 65 (-480 -896 80 ) (-480 -896 64 ) (-480 -1016 64 ) (-480 -1016 80 ) +4 65 (-256 -896 80 ) (-256 -1016 80 ) (-256 -1016 64 ) (-256 -896 64 ) +4 66 (-288 -896 48 ) (-272 -896 48 ) (-272 -1016 48 ) (-288 -1016 48 ) +4 66 (-480 -896 64 ) (-480 -896 48 ) (-480 -1016 48 ) (-480 -1016 64 ) +4 66 (-272 -896 64 ) (-272 -1016 64 ) (-272 -1016 48 ) (-272 -896 48 ) +4 67 (-288 -1016 32 ) (-304 -1016 32 ) (-304 -896 32 ) (-288 -896 32 ) +4 67 (-480 -896 48 ) (-480 -896 32 ) (-480 -1016 32 ) (-480 -1016 48 ) +4 67 (-288 -896 48 ) (-288 -1016 48 ) (-288 -1016 32 ) (-288 -896 32 ) +4 68 (-304 -1016 16 ) (-320 -1016 16 ) (-320 -896 16 ) (-304 -896 16 ) +4 68 (-480 -896 32 ) (-480 -896 16 ) (-480 -1016 16 ) (-480 -1016 32 ) +4 68 (-304 -896 32 ) (-304 -1016 32 ) (-304 -1016 16 ) (-304 -896 16 ) +4 69 (-480 -896 16 ) (-480 -896 0 ) (-480 -1016 0 ) (-480 -1016 16 ) +4 69 (-320 -1016 0 ) (-480 -1016 0 ) (-480 -896 0 ) (-320 -896 0 ) +4 69 (-320 -896 16 ) (-320 -1016 16 ) (-320 -1016 0 ) (-320 -896 0 ) +4 70 (-480 -1024 0 ) (-480 -1016 0 ) (-64 -1016 0 ) (-64 -1024 0 ) +4 70 (-160 -1016 32 ) (-160 -1016 176 ) (-64 -1016 176 ) (-64 -1016 32 ) +4 70 (-160 -1016 160 ) (-160 -1016 48 ) (-176 -1016 48 ) (-176 -1016 160 ) +4 70 (-176 -1016 144 ) (-176 -1016 64 ) (-192 -1016 64 ) (-192 -1016 144 ) +4 70 (-192 -1016 128 ) (-192 -1016 80 ) (-208 -1016 80 ) (-208 -1016 128 ) +4 70 (-208 -1016 112 ) (-208 -1016 96 ) (-224 -1016 96 ) (-224 -1016 112 ) +4 70 (-240 -1016 96 ) (-208 -1016 96 ) (-208 -1016 80 ) (-240 -1016 80 ) +4 70 (-256 -1016 80 ) (-192 -1016 80 ) (-192 -1016 64 ) (-256 -1016 64 ) +4 70 (-272 -1016 64 ) (-176 -1016 64 ) (-176 -1016 48 ) (-272 -1016 48 ) +4 70 (-288 -1016 48 ) (-160 -1016 48 ) (-160 -1016 32 ) (-288 -1016 32 ) +4 70 (-304 -1016 16 ) (-304 -1016 32 ) (-64 -1016 32 ) (-64 -1016 16 ) +4 70 (-320 -1016 0 ) (-320 -1016 16 ) (-64 -1016 16 ) (-64 -1016 0 ) +4 70 (-480 -1016 608 ) (-480 -1016 0 ) (-480 -1024 0 ) (-480 -1024 608 ) +4 70 (-64 -1024 608 ) (-64 -1016 608 ) (-480 -1016 608 ) (-480 -1024 608 ) +4 71 (-480 -1272 64 ) (-480 -1240 64 ) (0 -1240 64 ) (0 -1272 64 ) +4 71 (0 -1272 608 ) (0 -1024 608 ) (-480 -1024 608 ) (-480 -1272 608 ) +4 71 (-480 -1024 608 ) (-480 -1024 64 ) (-480 -1272 64 ) (-480 -1272 608 ) +4 71 (-480 -1272 64 ) (0 -1272 64 ) (0 -1272 608 ) (-480 -1272 608 ) +4 72 (-480 -1240 0 ) (-480 -1024 0 ) (0 -1024 0 ) (0 -1240 0 ) +4 72 (-480 -1024 64 ) (-480 -1024 0 ) (-480 -1240 0 ) (-480 -1240 64 ) +4 72 (-480 -1240 0 ) (0 -1240 0 ) (0 -1240 64 ) (-480 -1240 64 ) diff --git a/fakk/maps/example/teleporter.bsp b/fakk/maps/example/teleporter.bsp new file mode 100644 index 0000000000000000000000000000000000000000..6f6c0c3dcab93fa1ffc8cde426269a674c51f200 GIT binary patch literal 86508 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 literal 0 HcmV?d00001 diff --git a/fakk/maps/example/teleporter.map b/fakk/maps/example/teleporter.map new file mode 100644 index 0000000..185f01c --- /dev/null +++ b/fakk/maps/example/teleporter.map @@ -0,0 +1,208 @@ +{ +"classname" "worldspawn" +// brush 0 +{ +( 264 264 -8 ) ( -264 264 -8 ) ( -264 -272 -8 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 -272 264 ) ( -264 264 264 ) ( 264 264 264 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( -64 -280 8 ) ( -64 256 8 ) ( -64 256 0 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +( 264 264 8 ) ( -264 264 8 ) ( -264 264 0 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 264 8 ) ( -264 -272 8 ) ( -264 -272 0 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 256 8 ) ( 264 256 8 ) ( -264 256 0 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +} +// brush 1 +{ +( 592 264 -8 ) ( 64 264 -8 ) ( 64 -272 -8 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( 64 -272 264 ) ( 64 264 264 ) ( 592 264 264 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( 264 -280 8 ) ( 264 256 8 ) ( 264 256 0 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( 592 264 8 ) ( 64 264 8 ) ( 64 264 0 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( 64 264 8 ) ( 64 -272 8 ) ( 64 -272 0 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +( 256 256 8 ) ( 784 256 8 ) ( 256 256 0 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +} +// brush 2 +{ +( 472 264 128 ) ( -56 264 128 ) ( -56 -272 128 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( -64 -272 264 ) ( -64 264 264 ) ( 464 264 264 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( 64 -288 8 ) ( 64 248 8 ) ( 64 248 0 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( 464 264 8 ) ( -64 264 8 ) ( -64 264 0 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( -64 264 8 ) ( -64 -272 8 ) ( -64 -272 0 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( 128 256 8 ) ( 656 256 8 ) ( 128 256 0 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +} +// brush 3 +{ +( 472 272 128 ) ( -56 272 128 ) ( -56 -264 128 ) eden/WL_darkbrick 0 0 0.00 1 1 0 0 0 +( -64 -264 264 ) ( -64 272 264 ) ( 464 272 264 ) eden/WL_darkbrick 0 0 0.00 1 1 0 0 0 +( 64 -280 8 ) ( 64 256 8 ) ( 64 256 0 ) eden/WL_darkbrick 0 0 0.00 1 1 0 0 0 +( 464 272 8 ) ( -64 272 8 ) ( -64 272 0 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +( -64 272 8 ) ( -64 -264 8 ) ( -64 -264 0 ) eden/WL_darkbrick 0 0 0.00 1 1 0 0 0 +( 128 264 8 ) ( 656 264 8 ) ( 128 264 0 ) eden/WL_darkbrick 0 0 0.00 1 1 0 0 0 +} +// brush 4 +{ +( 592 272 -8 ) ( 64 272 -8 ) ( 64 -264 -8 ) eden/WL_darkbrick 0 0 0.00 1 1 0 0 0 +( 64 -264 264 ) ( 64 272 264 ) ( 592 272 264 ) eden/WL_darkbrick 0 0 0.00 1 1 0 0 0 +( 264 -272 8 ) ( 264 264 8 ) ( 264 264 0 ) eden/WL_darkbrick 0 0 0.00 1 1 0 0 0 +( 592 272 8 ) ( 64 272 8 ) ( 64 272 0 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +( 64 272 8 ) ( 64 -264 8 ) ( 64 -264 0 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +( 256 264 8 ) ( 784 264 8 ) ( 256 264 0 ) eden/WL_darkbrick 0 0 0.00 1 1 0 0 0 +} +// brush 5 +{ +( 264 784 -8 ) ( -264 784 -8 ) ( -264 248 -8 ) eden/FL_edenhouse2 0 16 0.00 0.500000 0.500000 0 0 0 +( -264 256 8 ) ( 264 256 8 ) ( 264 256 0 ) eden/FL_edenhouse2 0 0 0.00 0.500000 0.500000 0 0 0 +( 264 248 8 ) ( 264 784 8 ) ( 264 784 0 ) eden/FL_edenhouse2 -16 0 0.00 0.500000 0.500000 0 0 0 +( 264 784 8 ) ( -264 784 8 ) ( -264 784 0 ) eden/FL_edenhouse2 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 784 8 ) ( -264 248 8 ) ( -264 248 0 ) eden/FL_edenhouse2 -16 0 0.00 0.500000 0.500000 0 0 0 +( -264 784 0 ) ( 264 784 0 ) ( -264 248 0 ) eden/FL_edenhouse2 0 16 0.00 0.500000 0.500000 0 0 0 +} +// brush 6 +{ +( -264 248 264 ) ( -264 784 264 ) ( 264 784 264 ) eden/WL_darkbrick 0 0 0.00 1 1 0 0 0 +( -264 256 8 ) ( 264 256 8 ) ( 264 256 0 ) eden/WL_darkbrick 0 0 0.00 1 1 0 0 0 +( 264 248 8 ) ( 264 784 8 ) ( 264 784 0 ) eden/WL_darkbrick 0 0 0.00 1 1 0 0 0 +( 264 784 8 ) ( -264 784 8 ) ( -264 784 0 ) eden/WL_darkbrick 0 0 0.00 1 1 0 0 0 +( -264 784 8 ) ( -264 248 8 ) ( -264 248 0 ) eden/WL_darkbrick 0 0 0.00 1 1 0 0 0 +( -264 784 256 ) ( -264 248 256 ) ( 264 784 256 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +} +// brush 7 +{ +( 264 784 -8 ) ( -264 784 -8 ) ( -264 248 -8 ) eden/WL_darkbrick 0 0 0.00 1 1 0 0 0 +( -264 248 264 ) ( -264 784 264 ) ( 264 784 264 ) eden/WL_darkbrick 0 0 0.00 1 1 0 0 0 +( -264 256 8 ) ( 264 256 8 ) ( 264 256 0 ) eden/WL_darkbrick 0 0 0.00 1 1 0 0 0 +( 264 248 8 ) ( 264 784 8 ) ( 264 784 0 ) eden/WL_darkbrick 0 0 0.00 1 1 0 0 0 +( 264 784 8 ) ( -264 784 8 ) ( -264 784 0 ) eden/WL_darkbrick 0 0 0.00 1 1 0 0 0 +( 256 784 8 ) ( 256 248 8 ) ( 256 784 0 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +} +// brush 8 +{ +( 264 784 -8 ) ( -264 784 -8 ) ( -264 248 -8 ) eden/WL_darkbrick 0 0 0.00 1 1 0 0 0 +( -264 248 264 ) ( -264 784 264 ) ( 264 784 264 ) eden/WL_darkbrick 0 0 0.00 1 1 0 0 0 +( 264 248 8 ) ( 264 784 8 ) ( 264 784 0 ) eden/WL_darkbrick 0 0 0.00 1 1 0 0 0 +( 264 784 8 ) ( -264 784 8 ) ( -264 784 0 ) eden/WL_darkbrick 0 0 0.00 1 1 0 0 0 +( -264 784 8 ) ( -264 248 8 ) ( -264 248 0 ) eden/WL_darkbrick 0 0 0.00 1 1 0 0 0 +( -264 776 8 ) ( 264 776 8 ) ( -264 776 0 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +} +// brush 9 +{ +( 264 784 -8 ) ( -264 784 -8 ) ( -264 248 -8 ) eden/WL_darkbrick 0 0 0.00 1 1 0 0 0 +( -264 248 264 ) ( -264 784 264 ) ( 264 784 264 ) eden/WL_darkbrick 0 0 0.00 1 1 0 0 0 +( -264 256 8 ) ( 264 256 8 ) ( 264 256 0 ) eden/WL_darkbrick 0 0 0.00 1 1 0 0 0 +( 264 784 8 ) ( -264 784 8 ) ( -264 784 0 ) eden/WL_darkbrick 0 0 0.00 1 1 0 0 0 +( -264 784 8 ) ( -264 248 8 ) ( -264 248 0 ) eden/WL_darkbrick 0 0 0.00 1 1 0 0 0 +( -256 248 8 ) ( -256 784 8 ) ( -256 248 0 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +} +// brush 10 +{ +( 96 600 8 ) ( -32 600 8 ) ( -32 472 8 ) eden/FL_underground 64 64 0.00 -0.500000 0.500000 0 0 0 +( -32 472 16 ) ( -32 600 16 ) ( 96 600 16 ) eden/FL_underground 64 64 0.00 -0.500000 0.500000 0 0 0 +( -104 480 16 ) ( 24 480 16 ) ( 24 480 8 ) eden/FL_underground 64 0 0.00 -0.500000 0.062500 0 0 0 +( 32 480 16 ) ( 32 608 16 ) ( 32 608 8 ) eden/FL_underground 64 0 0.00 -0.500000 0.062500 0 0 0 +( 104 544 16 ) ( -24 544 16 ) ( -24 544 8 ) eden/FL_underground 64 0 0.00 -0.500000 0.062500 0 0 0 +( -32 600 16 ) ( -32 472 16 ) ( -32 472 8 ) eden/FL_underground 64 0 0.00 -0.500000 0.062500 0 0 0 +} +// brush 11 +{ +( 64 64 0 ) ( -64 64 0 ) ( -64 -64 0 ) eden/FL_underground 0 0 0.00 1 1 0 0 0 +( -64 -64 8 ) ( -64 64 8 ) ( 64 64 8 ) eden/FL_underground 0 0 0.00 1 1 0 0 0 +( -72 -64 8 ) ( 56 -64 8 ) ( 56 -64 0 ) eden/FL_underground 0 0 0.00 1 1 0 0 0 +( 64 -64 8 ) ( 64 64 8 ) ( 64 64 0 ) eden/FL_underground 0 0 0.00 1 1 0 0 0 +( 64 64 8 ) ( -64 64 8 ) ( -64 64 0 ) eden/FL_underground 0 0 0.00 1 1 0 0 0 +( -64 64 8 ) ( -64 -64 8 ) ( -64 -64 0 ) eden/FL_underground 0 0 0.00 1 1 0 0 0 +} +// brush 12 +{ +( 264 264 -8 ) ( -264 264 -8 ) ( -264 -272 -8 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 -272 264 ) ( -264 264 264 ) ( 264 264 264 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 -264 8 ) ( 264 -264 8 ) ( 264 -264 0 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( 264 264 8 ) ( -264 264 8 ) ( -264 264 0 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 264 8 ) ( -264 -272 8 ) ( -264 -272 0 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( -256 -272 8 ) ( -256 264 8 ) ( -256 -272 0 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +} +// brush 13 +{ +( 264 272 -8 ) ( -264 272 -8 ) ( -264 -264 -8 ) eden/WL_darkbrick 0 0 0.00 1 1 0 0 0 +( -264 -264 264 ) ( -264 272 264 ) ( 264 272 264 ) eden/WL_darkbrick 0 0 0.00 1 1 0 0 0 +( -64 -272 8 ) ( -64 264 8 ) ( -64 264 0 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +( 264 272 8 ) ( -264 272 8 ) ( -264 272 0 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +( -264 272 8 ) ( -264 -264 8 ) ( -264 -264 0 ) eden/WL_darkbrick 0 0 0.00 1 1 0 0 0 +( -264 264 8 ) ( 264 264 8 ) ( -264 264 0 ) eden/WL_darkbrick 0 0 0.00 1 1 0 0 0 +} +// brush 14 +{ +( 264 264 -8 ) ( -264 264 -8 ) ( -264 -272 -8 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 -272 264 ) ( -264 264 264 ) ( 264 264 264 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 -264 8 ) ( 264 -264 8 ) ( 264 -264 0 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( 264 -272 8 ) ( 264 264 8 ) ( 264 264 0 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( 264 264 8 ) ( -264 264 8 ) ( -264 264 0 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( 256 264 8 ) ( 256 -272 8 ) ( 256 264 0 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +} +// brush 15 +{ +( 264 264 -8 ) ( -264 264 -8 ) ( -264 -272 -8 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 -272 264 ) ( -264 264 264 ) ( 264 264 264 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 -264 8 ) ( 264 -264 8 ) ( 264 -264 0 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( 264 -272 8 ) ( 264 264 8 ) ( 264 264 0 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 264 8 ) ( -264 -272 8 ) ( -264 -272 0 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( 264 -256 8 ) ( -264 -256 8 ) ( 264 -256 0 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +} +// brush 16 +{ +( -264 -272 264 ) ( -264 264 264 ) ( 264 264 264 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 -264 8 ) ( 264 -264 8 ) ( 264 -264 0 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( 264 -272 8 ) ( 264 264 8 ) ( 264 264 0 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( 264 264 8 ) ( -264 264 8 ) ( -264 264 0 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 264 8 ) ( -264 -272 8 ) ( -264 -272 0 ) eden/bedroom 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 264 256 ) ( -264 -272 256 ) ( 264 264 256 ) eden/FL_edenhouse2 0 0 0.00 1 1 0 0 0 +} +// brush 17 +{ +( 264 264 -8 ) ( -264 264 -8 ) ( -264 -272 -8 ) eden/FL_edenhouse2 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 -264 8 ) ( 264 -264 8 ) ( 264 -264 0 ) eden/FL_edenhouse2 0 0 0.00 0.500000 0.500000 0 0 0 +( 264 -272 8 ) ( 264 264 8 ) ( 264 264 0 ) eden/FL_edenhouse2 0 0 0.00 0.500000 0.500000 0 0 0 +( 264 264 8 ) ( -264 264 8 ) ( -264 264 0 ) eden/FL_edenhouse2 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 264 8 ) ( -264 -272 8 ) ( -264 -272 0 ) eden/FL_edenhouse2 0 0 0.00 0.500000 0.500000 0 0 0 +( -264 264 0 ) ( 264 264 0 ) ( -264 -272 0 ) eden/FL_edenhouse2 0 0 0.00 0.500000 0.500000 0 0 0 +} +} +// entity 1 +{ +"origin" "-2.38 6.55 8.20" +"spawnflags" "1" +"make_static" "1" +"model" "obj_pad.tik" +"scale" "0.70" +"classname" "Objects_TeleportPad" +} +// entity 2 +{ +"origin" "0 512 8" +"targetname" "t1" +"angle" "270" +"classname" "func_teleportdest" +} +// entity 3 +{ +"classname" "light" +"light" "1000" +"origin" "0 0 128" +} +// entity 4 +{ +"classname" "info_player_start" +"angle" "90" +"origin" "0 -192 16" +} +// entity 5 +{ +"origin" "0 512 128" +"light" "1000" +"classname" "light" +} +// entity 6 +{ +"classname" "Objects_TeleportPad" +"scale" "0.70" +"model" "obj_pad.tik" +"make_static" "1" +"spawnflags" "1" +"origin" " 5.62 510.55 8.20" +} diff --git a/fakk/maps/example/teleporter.prt b/fakk/maps/example/teleporter.prt new file mode 100644 index 0000000..463768f --- /dev/null +++ b/fakk/maps/example/teleporter.prt @@ -0,0 +1,142 @@ +PRT1 +24 +51 +87 +4 0 3 0 (32 544 0 ) (32 480 0 ) (32 480 8 ) (32 544 8 ) +4 0 2 0 (32 776 16 ) (32 776 0 ) (32 544 0 ) (32 544 16 ) +4 0 1 0 (32 776 256 ) (32 776 16 ) (32 480 16 ) (32 480 256 ) +4 0 4 0 (32 480 0 ) (256 480 0 ) (256 480 256 ) (32 480 256 ) +4 1 12 0 (0 480 256 ) (0 776 256 ) (0 776 16 ) (0 480 16 ) +4 1 2 0 (0 776 16 ) (32 776 16 ) (32 544 16 ) (0 544 16 ) +4 1 4 0 (32 480 16 ) (32 480 256 ) (0 480 256 ) (0 480 16 ) +4 2 13 0 (0 776 16 ) (0 776 8 ) (0 544 8 ) (0 544 16 ) +4 2 14 0 (0 776 8 ) (0 776 0 ) (0 544 0 ) (0 544 8 ) +4 2 3 0 (0 544 0 ) (32 544 0 ) (32 544 8 ) (0 544 8 ) +4 3 14 0 (0 544 0 ) (0 480 0 ) (0 480 8 ) (0 544 8 ) +4 3 4 0 (0 480 0 ) (32 480 0 ) (32 480 8 ) (0 480 8 ) +4 4 15 0 (0 480 16 ) (0 480 0 ) (0 272 0 ) (0 272 16 ) +4 4 12 0 (0 272 256 ) (0 480 256 ) (0 480 16 ) (0 272 16 ) +4 4 5 0 (0 272 0 ) (64 272 0 ) (64 272 128 ) (0 272 128 ) +4 5 17 0 (0 272 128 ) (0 272 0 ) (0 256 0 ) (0 256 128 ) +4 5 8 0 (0 256 0 ) (64 256 0 ) (64 256 8 ) (0 256 8 ) +4 5 6 0 (64 256 8 ) (64 256 128 ) (0 256 128 ) (0 256 8 ) +4 6 18 0 (0 0 8 ) (0 0 256 ) (0 256 256 ) (0 256 8 ) +4 6 9 0 (0 0 256 ) (0 0 8 ) (256 0 8 ) (256 0 256 ) +4 6 8 0 (0 256 8 ) (64 256 8 ) (64 64 8 ) (0 64 8 ) +4 6 7 0 (64 256 8 ) (256 256 8 ) (256 0 8 ) (64 0 8 ) +4 7 10 0 (64 0 0 ) (256 0 0 ) (256 0 8 ) (64 0 8 ) +4 7 8 0 (64 64 8 ) (64 256 8 ) (64 256 0 ) (64 64 0 ) +4 8 19 0 (0 64 8 ) (0 256 8 ) (0 256 0 ) (0 64 0 ) +4 9 21 0 (0 0 256 ) (0 0 8 ) (0 -256 8 ) (0 -256 256 ) +4 9 11 0 (64 -256 8 ) (0 -256 8 ) (0 -64 8 ) (64 -64 8 ) +4 9 10 0 (256 -256 8 ) (64 -256 8 ) (64 0 8 ) (256 0 8 ) +4 10 11 0 (64 -64 0 ) (64 -256 0 ) (64 -256 8 ) (64 -64 8 ) +4 11 22 0 (0 -64 0 ) (0 -256 0 ) (0 -256 8 ) (0 -64 8 ) +4 12 17 0 (0 272 16 ) (0 272 128 ) (-32 272 128 ) (-32 272 16 ) +4 12 16 0 (-32 776 256 ) (-32 776 16 ) (-32 272 16 ) (-32 272 256 ) +4 12 13 0 (-32 544 16 ) (-32 776 16 ) (0 776 16 ) (0 544 16 ) +4 12 15 0 (0 272 16 ) (-32 272 16 ) (-32 480 16 ) (0 480 16 ) +4 13 16 0 (-32 776 16 ) (-32 776 8 ) (-32 544 8 ) (-32 544 16 ) +4 13 14 0 (-32 544 8 ) (-32 776 8 ) (0 776 8 ) (0 544 8 ) +4 14 16 0 (-32 776 8 ) (-32 776 0 ) (-32 480 0 ) (-32 480 8 ) +4 14 15 0 (-32 480 8 ) (-32 480 0 ) (0 480 0 ) (0 480 8 ) +4 15 17 0 (-32 272 0 ) (0 272 0 ) (0 272 16 ) (-32 272 16 ) +4 15 16 0 (-32 480 0 ) (-32 272 0 ) (-32 272 16 ) (-32 480 16 ) +4 16 17 0 (-64 272 0 ) (-32 272 0 ) (-32 272 128 ) (-64 272 128 ) +4 17 19 0 (-64 256 0 ) (0 256 0 ) (0 256 8 ) (-64 256 8 ) +4 17 18 0 (0 256 8 ) (0 256 128 ) (-64 256 128 ) (-64 256 8 ) +4 18 21 0 (0 0 8 ) (0 0 256 ) (-256 0 256 ) (-256 0 8 ) +4 18 19 0 (-64 64 8 ) (-64 256 8 ) (0 256 8 ) (0 64 8 ) +4 18 20 0 (-64 0 8 ) (-256 0 8 ) (-256 256 8 ) (-64 256 8 ) +4 19 20 0 (-64 64 8 ) (-64 256 8 ) (-64 256 0 ) (-64 64 0 ) +4 20 23 0 (-256 0 0 ) (-64 0 0 ) (-64 0 8 ) (-256 0 8 ) +4 21 22 0 (0 -256 8 ) (-64 -256 8 ) (-64 -64 8 ) (0 -64 8 ) +4 21 23 0 (-64 -256 8 ) (-256 -256 8 ) (-256 0 8 ) (-64 0 8 ) +4 22 23 0 (-64 -64 0 ) (-64 -256 0 ) (-64 -256 8 ) (-64 -64 8 ) +4 0 (32 480 8 ) (32 480 16 ) (32 544 16 ) (32 544 8 ) +4 0 (32 776 256 ) (256 776 256 ) (256 776 0 ) (32 776 0 ) +4 0 (256 776 256 ) (256 480 256 ) (256 480 0 ) (256 776 0 ) +4 0 (32 776 0 ) (256 776 0 ) (256 480 0 ) (32 480 0 ) +4 0 (32 480 256 ) (256 480 256 ) (256 776 256 ) (32 776 256 ) +4 1 (32 544 16 ) (32 480 16 ) (0 480 16 ) (0 544 16 ) +4 1 (32 480 256 ) (32 776 256 ) (0 776 256 ) (0 480 256 ) +4 1 (0 776 16 ) (0 776 256 ) (32 776 256 ) (32 776 16 ) +4 2 (32 544 8 ) (32 544 16 ) (0 544 16 ) (0 544 8 ) +4 2 (0 776 16 ) (32 776 16 ) (32 776 0 ) (0 776 0 ) +4 2 (0 544 0 ) (0 776 0 ) (32 776 0 ) (32 544 0 ) +4 3 (0 480 0 ) (0 544 0 ) (32 544 0 ) (32 480 0 ) +4 3 (0 480 8 ) (32 480 8 ) (32 544 8 ) (0 544 8 ) +4 4 (64 272 128 ) (64 272 256 ) (0 272 256 ) (0 272 128 ) +4 4 (64 272 0 ) (256 272 0 ) (256 272 256 ) (64 272 256 ) +4 4 (0 480 8 ) (0 480 16 ) (32 480 16 ) (32 480 8 ) +4 4 (256 480 256 ) (256 272 256 ) (256 272 0 ) (256 480 0 ) +4 4 (0 272 0 ) (0 480 0 ) (256 480 0 ) (256 272 0 ) +4 4 (256 272 256 ) (256 480 256 ) (0 480 256 ) (0 272 256 ) +4 5 (64 256 128 ) (64 256 0 ) (64 272 0 ) (64 272 128 ) +4 5 (0 256 0 ) (0 272 0 ) (64 272 0 ) (64 256 0 ) +4 5 (0 256 128 ) (64 256 128 ) (64 272 128 ) (0 272 128 ) +4 6 (64 64 8 ) (64 0 8 ) (0 0 8 ) (0 64 8 ) +4 6 (256 0 256 ) (256 0 8 ) (256 256 8 ) (256 256 256 ) +4 6 (0 256 128 ) (0 256 256 ) (64 256 256 ) (64 256 128 ) +4 6 (64 256 8 ) (64 256 256 ) (256 256 256 ) (256 256 8 ) +4 6 (256 256 256 ) (0 256 256 ) (0 0 256 ) (256 0 256 ) +4 7 (64 0 8 ) (64 64 8 ) (64 64 0 ) (64 0 0 ) +4 7 (256 0 0 ) (64 0 0 ) (64 256 0 ) (256 256 0 ) +4 7 (64 256 8 ) (256 256 8 ) (256 256 0 ) (64 256 0 ) +4 7 (256 0 8 ) (256 0 0 ) (256 256 0 ) (256 256 8 ) +4 8 (0 64 0 ) (0 256 0 ) (64 256 0 ) (64 64 0 ) +4 8 (0 64 0 ) (64 64 0 ) (64 64 8 ) (0 64 8 ) +4 9 (0 -64 8 ) (0 0 8 ) (64 0 8 ) (64 -64 8 ) +4 9 (256 0 256 ) (0 0 256 ) (0 -256 256 ) (256 -256 256 ) +4 9 (256 -256 256 ) (256 -256 8 ) (256 0 8 ) (256 0 256 ) +4 9 (0 -256 256 ) (0 -256 8 ) (256 -256 8 ) (256 -256 256 ) +4 10 (64 0 0 ) (64 -64 0 ) (64 -64 8 ) (64 0 8 ) +4 10 (64 -256 0 ) (256 -256 0 ) (256 -256 8 ) (64 -256 8 ) +4 10 (256 -256 8 ) (256 -256 0 ) (256 0 0 ) (256 0 8 ) +4 10 (64 0 0 ) (256 0 0 ) (256 -256 0 ) (64 -256 0 ) +4 11 (0 -256 0 ) (0 -64 0 ) (64 -64 0 ) (64 -256 0 ) +4 11 (0 -256 8 ) (0 -256 0 ) (64 -256 0 ) (64 -256 8 ) +4 11 (0 -64 8 ) (64 -64 8 ) (64 -64 0 ) (0 -64 0 ) +4 12 (0 272 128 ) (0 272 256 ) (-32 272 256 ) (-32 272 128 ) +4 12 (-32 480 16 ) (-32 544 16 ) (0 544 16 ) (0 480 16 ) +4 12 (-32 272 256 ) (0 272 256 ) (0 776 256 ) (-32 776 256 ) +4 12 (-32 776 16 ) (-32 776 256 ) (0 776 256 ) (0 776 16 ) +4 13 (-32 776 8 ) (-32 776 16 ) (0 776 16 ) (0 776 8 ) +4 13 (-32 544 8 ) (0 544 8 ) (0 544 16 ) (-32 544 16 ) +4 14 (0 544 8 ) (-32 544 8 ) (-32 480 8 ) (0 480 8 ) +4 14 (-32 776 0 ) (0 776 0 ) (0 480 0 ) (-32 480 0 ) +4 14 (-32 776 8 ) (0 776 8 ) (0 776 0 ) (-32 776 0 ) +4 15 (0 480 8 ) (-32 480 8 ) (-32 480 16 ) (0 480 16 ) +4 15 (0 480 0 ) (0 272 0 ) (-32 272 0 ) (-32 480 0 ) +4 16 (-32 272 128 ) (-32 272 256 ) (-64 272 256 ) (-64 272 128 ) +4 16 (-256 272 0 ) (-64 272 0 ) (-64 272 256 ) (-256 272 256 ) +4 16 (-256 272 256 ) (-32 272 256 ) (-32 776 256 ) (-256 776 256 ) +4 16 (-256 776 0 ) (-32 776 0 ) (-32 272 0 ) (-256 272 0 ) +4 16 (-256 776 256 ) (-32 776 256 ) (-32 776 0 ) (-256 776 0 ) +4 16 (-32 544 16 ) (-32 480 16 ) (-32 480 8 ) (-32 544 8 ) +4 16 (-256 776 256 ) (-256 776 0 ) (-256 272 0 ) (-256 272 256 ) +4 17 (-64 272 128 ) (-64 272 0 ) (-64 256 0 ) (-64 256 128 ) +4 17 (-64 272 0 ) (0 272 0 ) (0 256 0 ) (-64 256 0 ) +4 17 (0 272 128 ) (-64 272 128 ) (-64 256 128 ) (0 256 128 ) +4 18 (0 0 8 ) (-64 0 8 ) (-64 64 8 ) (0 64 8 ) +4 18 (-256 256 256 ) (-256 256 8 ) (-256 0 8 ) (-256 0 256 ) +4 18 (-64 256 128 ) (-64 256 256 ) (0 256 256 ) (0 256 128 ) +4 18 (-256 256 8 ) (-256 256 256 ) (-64 256 256 ) (-64 256 8 ) +4 18 (0 256 256 ) (-256 256 256 ) (-256 0 256 ) (0 0 256 ) +4 19 (-64 64 0 ) (-64 256 0 ) (0 256 0 ) (0 64 0 ) +4 19 (-64 64 8 ) (-64 64 0 ) (0 64 0 ) (0 64 8 ) +4 20 (-64 0 0 ) (-64 64 0 ) (-64 64 8 ) (-64 0 8 ) +4 20 (-64 0 0 ) (-256 0 0 ) (-256 256 0 ) (-64 256 0 ) +4 20 (-256 256 8 ) (-64 256 8 ) (-64 256 0 ) (-256 256 0 ) +4 20 (-256 256 8 ) (-256 256 0 ) (-256 0 0 ) (-256 0 8 ) +4 21 (-64 -64 8 ) (-64 0 8 ) (0 0 8 ) (0 -64 8 ) +4 21 (0 0 256 ) (-256 0 256 ) (-256 -256 256 ) (0 -256 256 ) +4 21 (-256 0 256 ) (-256 0 8 ) (-256 -256 8 ) (-256 -256 256 ) +4 21 (-256 -256 256 ) (-256 -256 8 ) (0 -256 8 ) (0 -256 256 ) +4 22 (0 -64 0 ) (0 -256 0 ) (-64 -256 0 ) (-64 -64 0 ) +4 22 (-64 -256 0 ) (0 -256 0 ) (0 -256 8 ) (-64 -256 8 ) +4 22 (0 -64 8 ) (0 -64 0 ) (-64 -64 0 ) (-64 -64 8 ) +4 23 (-64 0 8 ) (-64 -64 8 ) (-64 -64 0 ) (-64 0 0 ) +4 23 (-256 -256 8 ) (-256 -256 0 ) (-64 -256 0 ) (-64 -256 8 ) +4 23 (-256 0 8 ) (-256 0 0 ) (-256 -256 0 ) (-256 -256 8 ) +4 23 (-256 -256 0 ) (-256 0 0 ) (-64 0 0 ) (-64 -256 0 ) diff --git a/fakk/maps/example/useanim.bsp b/fakk/maps/example/useanim.bsp new file mode 100644 index 0000000000000000000000000000000000000000..acdf5cc7d4178b91a84c4711b359d2c3f4f1b6b7 GIT binary patch literal 80820 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 XezW|s`;InWzuNKh&1#>2&U*eo*=-mg literal 0 HcmV?d00001 diff --git a/fakk/maps/example/useanim.map b/fakk/maps/example/useanim.map new file mode 100644 index 0000000..c3f61ed --- /dev/null +++ b/fakk/maps/example/useanim.map @@ -0,0 +1,348 @@ +{ +"classname" "worldspawn" +// brush 0 +{ +( 224 192 0 ) ( 224 224 0 ) ( -480 224 0 ) eden/bedtrim -224 -32 90.00 1 1 0 0 0 +( -480 224 64 ) ( 224 224 64 ) ( 224 192 64 ) eden/bedtrim -224 -32 90.00 1 1 0 0 0 +( -480 224 256 ) ( -480 192 256 ) ( -480 192 0 ) eden/bedtrim -224 0 0.00 1 1 0 0 0 +( -480 192 256 ) ( 224 192 256 ) ( 224 192 0 ) common/skip 0 0 0.00 1 1 805306368 16512 0 +( 224 224 256 ) ( -480 224 256 ) ( -480 224 0 ) eden/bedtrim 224 0 -180.00 1 -1 0 0 0 +( -416 224 0 ) ( -416 192 0 ) ( -416 208 64 ) eden/bedtrim 224 0 -180.00 1 -1 0 0 0 +} +// brush 1 +{ +( 224 192 0 ) ( 224 224 0 ) ( -480 224 0 ) eden/bedtrim -224 -32 90.00 1 1 0 0 0 +( -480 224 64 ) ( 224 224 64 ) ( 224 192 64 ) eden/bedtrim -224 -32 90.00 1 1 0 0 0 +( -480 192 256 ) ( 224 192 256 ) ( 224 192 0 ) eden/bedtrim 224 0 -180.00 1 -1 0 0 0 +( 224 192 256 ) ( 224 224 256 ) ( 224 224 0 ) eden/bedtrim -224 0 0.00 1 1 0 0 0 +( 224 224 256 ) ( -480 224 256 ) ( -480 224 0 ) eden/bedtrim 224 0 -180.00 1 -1 0 0 0 +( -480 192 0 ) ( -480 224 0 ) ( -480 208 64 ) eden/bedtrim 224 0 -180.00 1 -1 0 0 0 +} +// brush 2 +{ +( 224 192 64 ) ( 224 224 64 ) ( -480 224 64 ) eden/edenmetalwall -224 -224 90.00 1 1 0 0 0 +( -480 224 320 ) ( 224 224 320 ) ( 224 192 320 ) eden/edenmetalwall -224 -224 90.00 1 1 0 0 0 +( -480 224 96 ) ( -480 192 96 ) ( -480 192 64 ) eden/edenmetalwall -224 64 0.00 1 1 0 0 0 +( -480 192 96 ) ( 224 192 96 ) ( 224 192 64 ) common/skip 0 0 0.00 1 1 805306368 16512 0 +( 224 224 96 ) ( -480 224 96 ) ( -480 224 64 ) eden/edenmetalwall 224 63 -180.00 1 -1 0 0 0 +( -416 224 64 ) ( -416 192 64 ) ( -416 208 320 ) eden/edenmetalwall 224 63 -180.00 1 -1 0 0 0 +} +// brush 3 +{ +( 224 192 64 ) ( 224 224 64 ) ( -480 224 64 ) eden/edenmetalwall -224 -224 90.00 1 1 0 0 0 +( -480 224 320 ) ( 224 224 320 ) ( 224 192 320 ) eden/edenmetalwall -224 -224 90.00 1 1 0 0 0 +( -480 192 96 ) ( 224 192 96 ) ( 224 192 64 ) eden/edenmetalwall 224 63 -180.00 1 -1 0 0 0 +( 224 192 96 ) ( 224 224 96 ) ( 224 224 64 ) eden/edenmetalwall -224 64 0.00 1 1 0 0 0 +( 224 224 96 ) ( -480 224 96 ) ( -480 224 64 ) eden/edenmetalwall 224 63 -180.00 1 -1 0 0 0 +( -480 192 64 ) ( -480 224 64 ) ( -480 208 320 ) eden/edenmetalwall 224 63 -180.00 1 -1 0 0 0 +} +// brush 4 + { + patchDef2 + { + eden/edenmetalwall + ( 3 3 0 536870912 0 ) +( +( ( -480 96 63.999992 0 0 ) ( -480 96 192 0 0.500000 ) ( -480 96 320 0 1 ) ) +( ( -384 96 63.999992 0.500000 0 ) ( -384 96 192 0.500000 0.500000 ) ( -384 96 320 0.500000 1 ) ) +( ( -384 192 63.999992 1 0 ) ( -384 192 192 1 0.500000 ) ( -384 192 320 1 1 ) ) +) + } + } +// brush 5 +{ +( -480 192 0 ) ( -512 192 0 ) ( -512 -512 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -512 -512 64 ) ( -512 192 64 ) ( -480 192 64 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -480 -512 256 ) ( -480 192 256 ) ( -480 192 0 ) common/skip 0 0 0.00 1 1 805306368 16512 0 +( -480 192 256 ) ( -512 192 256 ) ( -512 192 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -512 192 256 ) ( -512 -512 256 ) ( -512 -512 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -480 128 0 ) ( -512 128 0 ) ( -496 128 64 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +} +// brush 6 +{ +( -480 192 0 ) ( -512 192 0 ) ( -512 -512 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -512 -512 64 ) ( -512 192 64 ) ( -480 192 64 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -512 -512 256 ) ( -480 -512 256 ) ( -480 -512 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -480 -512 256 ) ( -480 192 256 ) ( -480 192 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -512 192 256 ) ( -512 -512 256 ) ( -512 -512 0 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +( -512 192 0 ) ( -480 192 0 ) ( -496 192 64 ) eden/bedtrim 0 0 0.00 1 1 0 0 0 +} +// brush 7 +{ +( -480 192 64 ) ( -512 192 64 ) ( -512 -512 64 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +( -512 -512 320 ) ( -512 192 320 ) ( -480 192 320 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +( -480 -512 96 ) ( -480 192 96 ) ( -480 192 64 ) common/skip 0 0 0.00 1 1 805306368 16512 0 +( -480 192 96 ) ( -512 192 96 ) ( -512 192 64 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +( -512 192 96 ) ( -512 -512 96 ) ( -512 -512 64 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +( -480 128 64 ) ( -512 128 64 ) ( -496 128 320 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +} +// brush 8 +{ +( -480 192 64 ) ( -512 192 64 ) ( -512 -512 64 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +( -512 -512 320 ) ( -512 192 320 ) ( -480 192 320 ) eden/edenmetalwall 0 0 0.00 1 1 0 0 0 +( -512 -512 96 ) ( -480 -512 96 ) ( -480 -512 64 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +( -480 -512 96 ) ( -480 192 96 ) ( -480 192 64 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +( -512 192 96 ) ( -512 -512 96 ) ( -512 -512 64 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +( -512 192 64 ) ( -480 192 64 ) ( -496 192 320 ) eden/edenmetalwall 0 64 0.00 1 1 0 0 0 +} +// brush 9 + { + patchDef2 + { + eden/bedtrim + ( 3 3 0 536870912 0 ) +( +( ( -480 96 0 0 0 ) ( -480 96 32 0 0.500000 ) ( -480 96 64 0 1 ) ) +( ( -384 96 0 0.500000 0 ) ( -384 96 32 0.500000 0.500000 ) ( -384 96 64 0.500000 1 ) ) +( ( -384 192 0 1 0 ) ( -384 192 32 1 0.500000 ) ( -384 192 64 1 1 ) ) +) + } + } +// brush 10 +{ +( 96 96 352 ) ( -32 96 352 ) ( -32 -416 352 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( -32 -416 416 ) ( -32 96 416 ) ( 96 96 416 ) we_cemetary_test/levelord_sky 0 0 0.00 1 1 0 0 0 +( -32 -416 416 ) ( 96 -416 416 ) ( 96 -416 352 ) we_cemetary_test/levelord_sky 0 0 0.00 1 1 0 0 0 +( 96 -416 416 ) ( 96 96 416 ) ( 96 96 352 ) we_cemetary_test/levelord_sky 0 0 0.00 1 1 0 0 0 +( 96 96 416 ) ( -32 96 416 ) ( -32 96 352 ) we_cemetary_test/levelord_sky 0 0 0.00 1 1 0 0 0 +( -32 96 416 ) ( -32 -416 416 ) ( -32 -416 352 ) we_cemetary_test/levelord_sky 0 0 0.00 1 1 0 0 0 +} +// brush 11 +{ +( -64 -416 304 ) ( -64 -448 304 ) ( 128 -448 304 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( 128 -448 352 ) ( -64 -448 352 ) ( -64 -416 352 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( 96 -416 352 ) ( -32 -416 352 ) ( -32 -416 320 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( 128 -448 352 ) ( 96 -416 352 ) ( 96 -416 320 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( -64 -448 320 ) ( -64 -448 352 ) ( 128 -448 352 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( -64 -448 320 ) ( -32 -416 320 ) ( -32 -416 352 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +} +// brush 12 +{ +( -32 128 304 ) ( -64 128 304 ) ( -64 -64 304 ) eden/FL_edenhouse 0 32 90.00 1 1 0 0 0 +( -64 -64 352 ) ( -64 128 352 ) ( -32 128 352 ) eden/FL_edenhouse 0 32 90.00 1 1 0 0 0 +( -32 -32 352 ) ( -32 96 352 ) ( -32 96 320 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( -64 -448 352 ) ( -32 -416 352 ) ( -32 -416 320 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( -64 128 320 ) ( -64 128 352 ) ( -64 -64 352 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( -64 128 320 ) ( -32 96 320 ) ( -32 96 352 ) eden/FL_edenhouse -64 0 -180.00 1 -1 0 0 0 +} +// brush 13 +{ +( 128 -64 304 ) ( 128 128 304 ) ( 96 128 304 ) eden/FL_edenhouse 0 -96 90.00 1 1 0 0 0 +( 96 128 352 ) ( 128 128 352 ) ( 128 -64 352 ) eden/FL_edenhouse 0 -96 90.00 1 1 0 0 0 +( 96 96 320 ) ( 96 96 352 ) ( 96 -32 352 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( 96 -416 320 ) ( 96 -416 352 ) ( 128 -448 352 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( 128 -64 352 ) ( 128 128 352 ) ( 128 128 320 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( 96 96 352 ) ( 96 96 320 ) ( 128 128 320 ) eden/FL_edenhouse -64 0 -180.00 1 -1 0 0 0 +} +// brush 14 +{ +( 128 128 304 ) ( -64 128 304 ) ( -64 96 304 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( -64 96 352 ) ( -64 128 352 ) ( 128 128 352 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( -32 96 320 ) ( -32 96 352 ) ( 96 96 352 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( 96 96 320 ) ( 96 96 352 ) ( 128 128 352 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( 128 128 352 ) ( -64 128 352 ) ( -64 128 320 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +( -32 96 352 ) ( -32 96 320 ) ( -64 128 320 ) eden/FL_edenhouse 0 0 0.00 1 1 0 0 0 +} +// brush 15 +{ +( 128 192 320 ) ( -64 192 320 ) ( -64 128 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( -64 128 352 ) ( -64 192 352 ) ( 128 192 352 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( -64 128 352 ) ( 128 128 352 ) ( 128 128 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( 128 128 352 ) ( 128 192 352 ) ( 128 192 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( 128 192 352 ) ( -64 192 352 ) ( -64 192 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( -64 192 352 ) ( -64 128 352 ) ( -64 128 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +} +// brush 16 +{ +( 192 192 320 ) ( 128 192 320 ) ( 128 -448 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( 128 -448 352 ) ( 128 192 352 ) ( 192 192 352 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( 128 -448 352 ) ( 192 -448 352 ) ( 192 -448 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( 192 -448 352 ) ( 192 192 352 ) ( 192 192 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( 192 192 352 ) ( 128 192 352 ) ( 128 192 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( 128 192 352 ) ( 128 -448 352 ) ( 128 -448 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +} +// brush 17 +{ +( 192 192 320 ) ( -480 192 320 ) ( -480 -512 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( -480 -512 352 ) ( -480 192 352 ) ( 192 192 352 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( -480 -512 352 ) ( 192 -512 352 ) ( 192 -512 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( 192 -512 352 ) ( 192 192 352 ) ( 192 192 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( 224 -448 352 ) ( -448 -448 352 ) ( -448 -448 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( -64 -256 320 ) ( -64 -128 320 ) ( -64 -192 352 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +} +// brush 18 +{ +( 192 192 320 ) ( -480 192 320 ) ( -480 -512 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( -480 -512 352 ) ( -480 192 352 ) ( 192 192 352 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( -480 -512 352 ) ( 192 -512 352 ) ( 192 -512 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( 192 192 352 ) ( -480 192 352 ) ( -480 192 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( -480 192 352 ) ( -480 -512 352 ) ( -480 -512 320 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +( -64 -128 320 ) ( -64 -256 320 ) ( -64 -192 352 ) eden/CL_edenroof3 0 0 0.00 1 1 0 0 0 +} +// brush 19 +{ +( 192 192 -32 ) ( -480 192 -32 ) ( -480 -512 -32 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( -480 -512 0 ) ( -480 192 0 ) ( 192 192 0 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( -480 -512 224 ) ( 192 -512 224 ) ( 192 -512 -32 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 192 -512 224 ) ( 192 192 224 ) ( 192 192 -32 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( 192 192 224 ) ( -480 192 224 ) ( -480 192 -32 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( -480 192 224 ) ( -480 -512 224 ) ( -480 -512 -32 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +} +// brush 20 +{ +( -480 -512 64 ) ( -480 -544 64 ) ( 224 -544 64 ) eden/edenmetalwall -31 31 -90.00 1 1 0 0 0 +( 224 -544 320 ) ( -480 -544 320 ) ( -480 -512 320 ) eden/edenmetalwall -31 31 -90.00 1 1 0 0 0 +( 224 -544 96 ) ( 224 -512 96 ) ( 224 -512 64 ) eden/edenmetalwall -32 63 -180.00 1 -1 0 0 0 +( 224 -512 96 ) ( -480 -512 96 ) ( -480 -512 64 ) eden/edenmetalwall -32 62 0.00 1.000008 1 0 0 0 +( -480 -512 96 ) ( -480 -544 96 ) ( -480 -544 64 ) eden/edenmetalwall -33 63 -180.00 1 -1 0 0 0 +( -480 -544 96 ) ( 224 -544 96 ) ( 224 -544 64 ) eden/edenmetalwall -32 62 0.00 1.000008 1 0 0 0 +} +// brush 21 +{ +( -480 -512 0 ) ( -480 -544 0 ) ( 224 -544 0 ) eden/bedtrim -31 32 -90.00 1 1 0 0 0 +( 224 -544 64 ) ( -480 -544 64 ) ( -480 -512 64 ) eden/bedtrim -31 32 -90.00 1 1 0 0 0 +( 224 -544 256 ) ( 224 -512 256 ) ( 224 -512 0 ) eden/bedtrim -32 0 -180.00 1 -1 0 0 0 +( 224 -512 256 ) ( -480 -512 256 ) ( -480 -512 0 ) eden/bedtrim -32 0 0.00 1 1 0 0 0 +( -480 -512 256 ) ( -480 -544 256 ) ( -480 -544 0 ) eden/bedtrim -33 0 -180.00 1 -1 0 0 0 +( -480 -544 256 ) ( 224 -544 256 ) ( 224 -544 0 ) eden/bedtrim -32 0 0.00 1 1 0 0 0 +} +// brush 22 +{ +( 192 -512 0 ) ( 224 -512 0 ) ( 224 192 0 ) eden/bedtrim 160 0 -180.00 1 1 0 0 0 +( 224 192 64 ) ( 224 -512 64 ) ( 192 -512 64 ) eden/bedtrim 160 0 -180.00 1 1 0 0 0 +( 224 192 256 ) ( 192 192 256 ) ( 192 192 0 ) eden/bedtrim 160 0 -180.00 1 -1 0 0 0 +( 192 192 256 ) ( 192 -512 256 ) ( 192 -512 0 ) eden/bedtrim -64 0 -180.00 1 -1 0 0 0 +( 192 -512 256 ) ( 224 -512 256 ) ( 224 -512 0 ) eden/bedtrim 159 0 -180.00 1 -1 0 0 0 +( 224 -512 256 ) ( 224 192 256 ) ( 224 192 0 ) eden/bedtrim -64 0 -180.00 1 -1 0 0 0 +} +// brush 23 +{ +( 192 -512 64 ) ( 224 -512 64 ) ( 224 192 64 ) eden/edenmetalwall 160 63 -180.00 1 1 0 0 0 +( 224 192 320 ) ( 224 -512 320 ) ( 192 -512 320 ) eden/edenmetalwall 160 63 -180.00 1 1 0 0 0 +( 224 192 96 ) ( 192 192 96 ) ( 192 192 64 ) eden/edenmetalwall 160 64 -180.00 1 -1 0 0 0 +( 192 192 96 ) ( 192 -512 96 ) ( 192 -512 64 ) eden/edenmetalwall -64 62 -180.00 1 -1 0 0 0 +( 192 -512 96 ) ( 224 -512 96 ) ( 224 -512 64 ) eden/edenmetalwall 159 64 -180.00 1 -1 0 0 0 +( 224 -512 96 ) ( 224 192 96 ) ( 224 192 64 ) eden/edenmetalwall -64 62 -180.00 1 -1 0 0 0 +} +} +// entity 1 +{ +"classname" "script_object" +"targetname" "pushwall" +// brush 0 +{ +( -160 40 0 ) ( -320 40 0 ) ( -320 -104 0 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( -320 -104 128 ) ( -320 40 128 ) ( -160 40 128 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( -320 -102 104 ) ( -160 -102 104 ) ( -160 -102 0 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( -200 -104 104 ) ( -200 40 104 ) ( -200 40 0 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( -154 -34 104 ) ( -314 -34 104 ) ( -314 -34 0 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +( -264 34 104 ) ( -264 -110 104 ) ( -264 -110 0 ) eden/FL_edenhouse3 0 0 0.00 1 1 0 0 0 +} +} +// entity 2 +{ +"targetname" "t1" +"origin" "-219.66 -118.36 4.27" +"model" "func_useanimdest.tik" +"scale" "1.0" +"classname" "func_useanimdest" +"angle" "90" +"anim" "push" +} +// entity 3 +{ +"target" "t1" +"classname" "func_useanim" +"spawnflags" "2" +// brush 0 +{ +( -146 -54 0 ) ( -298 -54 0 ) ( -298 -134 0 ) eden/CL_edenroof3 2 58 0.00 1 1 0 0 0 +( -298 -134 120 ) ( -298 -54 120 ) ( -146 -54 120 ) eden/CL_edenroof3 2 58 0.00 1 1 0 0 0 +( -298 -134 8 ) ( -146 -134 8 ) ( -146 -134 0 ) eden/CL_edenroof3 2 0 0.00 1 1 0 0 0 +( -204 -134 8 ) ( -204 -54 8 ) ( -204 -54 0 ) eden/CL_edenroof3 -58 0 0.00 1 1 0 0 0 +( -146 -102 8 ) ( -298 -102 8 ) ( -298 -102 0 ) eden/CL_edenroof3 2 0 0.00 1 1 0 0 0 +( -262 -54 8 ) ( -262 -134 8 ) ( -262 -134 0 ) eden/CL_edenroof3 -58 0 0.00 1 1 0 0 0 +} +} +// entity 4 +{ +"classname" "light" +"spawnflags" "0" +"origin" "-352 56 168" +"light" "200" +"_color" "1.000000 0.724409 0.523622" +} +// entity 5 +{ +"classname" "info_player_start" +"angle" "45" +"origin" "-432 -464 24" +} +// entity 6 +{ +"origin" "8 56 168" +"spawnflags" "0" +"classname" "light" +"light" "200" +"_color" "0.629921 0.846457 1.000000" +} +// entity 7 +{ +"origin" "-344 -376 168" +"spawnflags" "0" +"classname" "light" +"light" "200" +} +// entity 8 +{ +"classname" "light" +"spawnflags" "0" +"origin" "8 -376 168" +"light" "200" +} +// entity 9 +{ +"light" "200" +"classname" "light" +"spawnflags" "0" +"origin" "-168 -160 168" +} +// entity 10 +{ +"targetname" "t2" +"classname" "script_object" +// brush 0 +{ +( 104 -248 0 ) ( -56 -248 0 ) ( -56 -392 0 ) eden/FL_edenhouse3 -8 -32 0.00 1 1 0 0 0 +( -56 -392 128 ) ( -56 -248 128 ) ( 104 -248 128 ) eden/FL_edenhouse3 -8 -32 0.00 1 1 0 0 0 +( -56 -390 104 ) ( 104 -390 104 ) ( 104 -390 0 ) eden/FL_edenhouse3 -8 0 0.00 1 1 0 0 0 +( 64 -392 104 ) ( 64 -248 104 ) ( 64 -248 0 ) eden/FL_edenhouse3 31 0 0.00 1 1 0 0 0 +( 110 -322 104 ) ( -50 -322 104 ) ( -50 -322 0 ) eden/FL_edenhouse3 -8 0 0.00 1 1 0 0 0 +( 0 -254 104 ) ( 0 -398 104 ) ( 0 -398 0 ) eden/FL_edenhouse3 31 0 0.00 1 1 0 0 0 +} +} +// entity 11 +{ +"anim" "push" +"angle" "0" +"classname" "func_useanimdest" +"scale" "1.00" +"model" "func_useanimdest.tik" +"origin" "-16.36 -377.79 4.27" +"targetname" "t3" +} +// entity 12 +{ +"spawnflags" "1" +"classname" "func_useanim" +"target" "t3" +// brush 0 +{ +( -70 -392 -2 ) ( -222 -392 -2 ) ( -222 -472 -2 ) eden/CL_edenroof3 54 -24 0.00 1 1 0 0 0 +( -222 -472 118 ) ( -222 -392 118 ) ( -70 -392 118 ) eden/CL_edenroof3 54 -24 0.00 1 1 0 0 0 +( -220 -508 6 ) ( -68 -508 6 ) ( -68 -508 -2 ) eden/CL_edenroof3 54 -2 0.00 1 1 0 0 0 +( -128 -472 6 ) ( -128 -392 6 ) ( -128 -392 -2 ) eden/CL_edenroof3 23 -2 0.00 1 1 0 0 0 +( -68 -448 6 ) ( -220 -448 6 ) ( -220 -448 -2 ) eden/CL_edenroof3 54 -2 0.00 1 1 0 0 0 +( -186 -392 6 ) ( -186 -472 6 ) ( -186 -472 -2 ) eden/CL_edenroof3 23 -2 0.00 1 1 0 0 0 +} +} diff --git a/fakk/maps/example/useanim.prt b/fakk/maps/example/useanim.prt new file mode 100644 index 0000000..63b4d74 --- /dev/null +++ b/fakk/maps/example/useanim.prt @@ -0,0 +1,96 @@ +PRT1 +16 +28 +64 +4 0 4 0 (128 0 304 ) (192 0 304 ) (192 0 320 ) (128 0 320 ) +4 0 3 0 (128 192 304 ) (192 192 304 ) (192 0 304 ) (128 0 304 ) +4 0 1 0 (128 192 320 ) (128 192 304 ) (128 128 304 ) (128 128 320 ) +4 1 8 0 (0 192 320 ) (0 192 304 ) (0 128 304 ) (0 128 320 ) +4 1 3 0 (0 192 304 ) (128 192 304 ) (128 128 304 ) (0 128 304 ) +4 2 9 0 (0 0 304 ) (0 0 352 ) (0 96 352 ) (0 96 304 ) +4 2 5 0 (0 0 352 ) (0 0 304 ) (96 0 304 ) (96 0 352 ) +4 2 3 0 (96 0 304 ) (0 0 304 ) (0 96 304 ) (96 96 304 ) +4 3 11 0 (0 0 0 ) (0 0 304 ) (0 192 304 ) (0 192 0 ) +4 3 7 0 (0 0 304 ) (0 0 0 ) (192 0 0 ) (192 0 304 ) +4 4 7 0 (128 0 304 ) (192 0 304 ) (192 -448 304 ) (128 -448 304 ) +4 4 6 0 (128 -448 304 ) (192 -448 304 ) (192 -448 320 ) (128 -448 320 ) +4 5 12 0 (0 0 352 ) (0 0 304 ) (0 -416 304 ) (0 -416 352 ) +4 5 7 0 (0 0 304 ) (96 0 304 ) (96 -416 304 ) (0 -416 304 ) +4 6 13 0 (0 -512 304 ) (0 -512 320 ) (0 -448 320 ) (0 -448 304 ) +4 6 7 0 (192 -448 304 ) (192 -512 304 ) (0 -512 304 ) (0 -448 304 ) +4 7 15 0 (0 -512 0 ) (0 -512 304 ) (0 0 304 ) (0 0 0 ) +4 8 11 0 (-64 128 304 ) (-64 192 304 ) (0 192 304 ) (0 128 304 ) +4 8 10 0 (-64 192 320 ) (-64 192 304 ) (-64 128 304 ) (-64 128 320 ) +4 9 12 0 (0 0 304 ) (0 0 352 ) (-32 0 352 ) (-32 0 304 ) +4 9 11 0 (0 0 304 ) (-32 0 304 ) (-32 96 304 ) (0 96 304 ) +4 10 14 0 (-480 0 320 ) (-480 0 304 ) (-64 0 304 ) (-64 0 320 ) +4 10 11 0 (-64 0 304 ) (-480 0 304 ) (-480 192 304 ) (-64 192 304 ) +4 11 15 0 (0 0 0 ) (0 0 304 ) (-480 0 304 ) (-480 0 0 ) +4 12 15 0 (-32 0 304 ) (0 0 304 ) (0 -416 304 ) (-32 -416 304 ) +4 13 15 0 (0 -512 304 ) (-64 -512 304 ) (-64 -448 304 ) (0 -448 304 ) +4 13 14 0 (-64 -448 304 ) (-64 -512 304 ) (-64 -512 320 ) (-64 -448 320 ) +4 14 15 0 (-64 -512 304 ) (-480 -512 304 ) (-480 0 304 ) (-64 0 304 ) +4 0 (128 96 304 ) (128 0 304 ) (128 0 320 ) (128 96 320 ) +4 0 (128 128 304 ) (128 96 304 ) (128 96 320 ) (128 128 320 ) +4 0 (192 0 320 ) (192 0 304 ) (192 192 304 ) (192 192 320 ) +4 0 (128 192 320 ) (192 192 320 ) (192 192 304 ) (128 192 304 ) +4 0 (192 0 320 ) (192 192 320 ) (128 192 320 ) (128 0 320 ) +4 1 (0 128 304 ) (128 128 304 ) (128 128 320 ) (0 128 320 ) +4 1 (128 192 320 ) (128 192 304 ) (0 192 304 ) (0 192 320 ) +4 1 (128 192 320 ) (0 192 320 ) (0 128 320 ) (128 128 320 ) +4 2 (96 96 352 ) (0 96 352 ) (0 0 352 ) (96 0 352 ) +4 2 (0 96 352 ) (96 96 352 ) (96 96 304 ) (0 96 304 ) +4 2 (96 0 352 ) (96 0 304 ) (96 96 304 ) (96 96 352 ) +4 3 (192 192 304 ) (192 192 0 ) (0 192 0 ) (0 192 304 ) +4 3 (192 0 304 ) (192 0 0 ) (192 192 0 ) (192 192 304 ) +4 3 (0 128 304 ) (0 96 304 ) (128 96 304 ) (128 128 304 ) +4 3 (96 96 304 ) (96 0 304 ) (128 0 304 ) (128 96 304 ) +4 3 (0 192 0 ) (192 192 0 ) (192 0 0 ) (0 0 0 ) +4 4 (128 0 304 ) (128 -448 304 ) (128 -448 320 ) (128 0 320 ) +4 4 (192 -448 320 ) (192 -448 304 ) (192 0 304 ) (192 0 320 ) +4 4 (192 0 320 ) (128 0 320 ) (128 -448 320 ) (192 -448 320 ) +4 5 (96 -416 352 ) (96 0 352 ) (0 0 352 ) (0 -416 352 ) +4 5 (96 0 352 ) (96 -416 352 ) (96 -416 304 ) (96 0 304 ) +4 5 (0 -416 304 ) (96 -416 304 ) (96 -416 352 ) (0 -416 352 ) +4 6 (192 -448 320 ) (192 -512 320 ) (192 -512 304 ) (192 -448 304 ) +4 6 (0 -512 320 ) (0 -512 304 ) (192 -512 304 ) (192 -512 320 ) +4 6 (96 -448 320 ) (128 -448 320 ) (128 -448 304 ) (96 -448 304 ) +4 6 (96 -448 320 ) (96 -448 304 ) (0 -448 304 ) (0 -448 320 ) +4 6 (0 -512 320 ) (192 -512 320 ) (192 -448 320 ) (0 -448 320 ) +4 7 (0 -512 304 ) (0 -512 0 ) (192 -512 0 ) (192 -512 304 ) +4 7 (192 -512 304 ) (192 -512 0 ) (192 0 0 ) (192 0 304 ) +4 7 (96 -448 304 ) (128 -448 304 ) (128 0 304 ) (96 0 304 ) +4 7 (0 -416 304 ) (0 -448 304 ) (96 -448 304 ) (96 -416 304 ) +4 7 (0 0 0 ) (192 0 0 ) (192 -512 0 ) (0 -512 0 ) +4 8 (-64 128 320 ) (-64 128 304 ) (0 128 304 ) (0 128 320 ) +4 8 (-64 192 304 ) (-64 192 320 ) (0 192 320 ) (0 192 304 ) +4 8 (0 192 320 ) (-64 192 320 ) (-64 128 320 ) (0 128 320 ) +4 9 (0 96 352 ) (-32 96 352 ) (-32 0 352 ) (0 0 352 ) +4 9 (0 96 304 ) (-32 96 304 ) (-32 96 352 ) (0 96 352 ) +4 9 (-32 96 352 ) (-32 96 304 ) (-32 0 304 ) (-32 0 352 ) +4 10 (-480 192 320 ) (-480 192 304 ) (-480 0 304 ) (-480 0 320 ) +4 10 (-64 192 320 ) (-64 192 304 ) (-480 192 304 ) (-480 192 320 ) +4 10 (-64 128 320 ) (-64 96 320 ) (-64 96 304 ) (-64 128 304 ) +4 10 (-64 96 320 ) (-64 0 320 ) (-64 0 304 ) (-64 96 304 ) +4 10 (-64 0 320 ) (-64 192 320 ) (-480 192 320 ) (-480 0 320 ) +4 11 (-480 192 0 ) (-480 192 304 ) (0 192 304 ) (0 192 0 ) +4 11 (-480 192 304 ) (-480 192 0 ) (-480 0 0 ) (-480 0 304 ) +4 11 (0 96 304 ) (0 128 304 ) (-64 128 304 ) (-64 96 304 ) +4 11 (-32 96 304 ) (-64 96 304 ) (-64 0 304 ) (-32 0 304 ) +4 11 (0 0 0 ) (-480 0 0 ) (-480 192 0 ) (0 192 0 ) +4 12 (0 -416 352 ) (-32 -416 352 ) (-32 -416 304 ) (0 -416 304 ) +4 12 (-32 -416 352 ) (0 -416 352 ) (0 0 352 ) (-32 0 352 ) +4 12 (-32 0 304 ) (-32 -416 304 ) (-32 -416 352 ) (-32 0 352 ) +4 13 (-64 -512 304 ) (0 -512 304 ) (0 -512 320 ) (-64 -512 320 ) +4 13 (0 -448 320 ) (0 -448 304 ) (-64 -448 304 ) (-64 -448 320 ) +4 13 (0 -448 320 ) (-64 -448 320 ) (-64 -512 320 ) (0 -512 320 ) +4 14 (-480 -512 320 ) (-480 -512 304 ) (-64 -512 304 ) (-64 -512 320 ) +4 14 (-480 0 320 ) (-480 0 304 ) (-480 -512 304 ) (-480 -512 320 ) +4 14 (-64 -416 320 ) (-64 -448 320 ) (-64 -448 304 ) (-64 -416 304 ) +4 14 (-64 -416 320 ) (-64 -416 304 ) (-64 0 304 ) (-64 0 320 ) +4 14 (-480 0 320 ) (-480 -512 320 ) (-64 -512 320 ) (-64 0 320 ) +4 15 (-480 0 304 ) (-480 0 0 ) (-480 -512 0 ) (-480 -512 304 ) +4 15 (-480 -512 304 ) (-480 -512 0 ) (0 -512 0 ) (0 -512 304 ) +4 15 (0 -448 304 ) (0 -416 304 ) (-64 -416 304 ) (-64 -448 304 ) +4 15 (-32 -416 304 ) (-32 0 304 ) (-64 0 304 ) (-64 -416 304 ) +4 15 (0 -512 0 ) (-480 -512 0 ) (-480 0 0 ) (0 0 0 ) diff --git a/fakk/maps/example/useobject.bsp b/fakk/maps/example/useobject.bsp new file mode 100644 index 0000000000000000000000000000000000000000..4dc75006804a24e3be5cc7ae8bbfc28c218c7ebc GIT binary patch literal 75028 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 literal 0 HcmV?d00001 diff --git a/fakk/maps/example/useobject.map b/fakk/maps/example/useobject.map new file mode 100644 index 0000000..2217b3c --- /dev/null +++ b/fakk/maps/example/useobject.map @@ -0,0 +1,225 @@ +{ +"classname" "worldspawn" +// brush 0 +{ +( 176 48 32 ) ( -32 48 32 ) ( -32 -112 32 ) eden/wood -96 0 -180.00 1 -1 0 0 0 +( -16 -112 48 ) ( -16 48 48 ) ( 192 48 48 ) eden/wood -96 0 -180.00 1 -1 0 0 0 +( -32 -96 96 ) ( 176 -96 96 ) ( 176 -96 32 ) eden/wood -96 0 -180.00 1 -1 0 0 0 +( 176 -112 96 ) ( 176 48 96 ) ( 176 48 32 ) eden/wood -96 0 -180.00 1 -1 0 0 0 +( 176 16 96 ) ( -32 16 96 ) ( -32 16 32 ) eden/wood -96 0 -180.00 1 -1 0 0 0 +( 0 48 96 ) ( 0 -112 96 ) ( 0 -112 32 ) eden/wood -96 0 -180.00 1 -1 0 0 0 +} +// brush 1 +{ +( -288 -256 384 ) ( 544 -256 384 ) ( 544 -1120 384 ) eden/wood -96 96 90.00 1 1 0 0 0 +( -288 -256 32 ) ( -288 -1120 32 ) ( -288 -1120 0 ) eden/wood -96 0 0.00 1 1 0 0 0 +( 512 -1120 32 ) ( 512 -256 32 ) ( 512 -256 0 ) eden/wood -95 0 0.00 1 1 0 0 0 +( 544 -256 32 ) ( -288 -256 32 ) ( -288 -256 0 ) eden/wood -96 0 -180.00 1 -1 0 0 0 +( -288 -288 32 ) ( 544 -288 32 ) ( -288 -288 0 ) eden/wood -96 0 -180.00 1 -1 0 0 0 +( 512 -544 320 ) ( -288 -512 320 ) ( -288 -576 320 ) eden/wood -96 96 90.00 1 1 0 0 0 +} +// brush 2 +{ +( -288 -64 384 ) ( 544 -64 384 ) ( 544 -928 384 ) eden/wood -96 96 90.00 1 1 0 0 0 +( -288 -64 32 ) ( -288 -928 32 ) ( -288 -928 0 ) eden/wood -96 0 0.00 1 1 0 0 0 +( 512 -928 32 ) ( 512 -64 32 ) ( 512 -64 0 ) eden/wood -95 0 0.00 1 1 0 0 0 +( 544 -64 32 ) ( -288 -64 32 ) ( -288 -64 0 ) eden/wood -96 0 -180.00 1 -1 0 0 0 +( -288 -96 32 ) ( 544 -96 32 ) ( -288 -96 0 ) eden/wood -96 0 -180.00 1 -1 0 0 0 +( 512 -352 320 ) ( -288 -320 320 ) ( -288 -384 320 ) eden/wood -96 96 90.00 1 1 0 0 0 +} +// brush 3 +{ +( -288 96 384 ) ( 544 96 384 ) ( 544 -768 384 ) eden/wood -96 96 90.00 1 1 0 0 0 +( -288 96 32 ) ( -288 -768 32 ) ( -288 -768 0 ) eden/wood -96 0 0.00 1 1 0 0 0 +( 512 -768 32 ) ( 512 96 32 ) ( 512 96 0 ) eden/wood -95 0 0.00 1 1 0 0 0 +( 544 96 32 ) ( -288 96 32 ) ( -288 96 0 ) eden/wood -96 0 -180.00 1 -1 0 0 0 +( -288 64 32 ) ( 544 64 32 ) ( -288 64 0 ) eden/wood -96 0 -180.00 1 -1 0 0 0 +( 512 -192 320 ) ( -288 -160 320 ) ( -288 -224 320 ) eden/wood -96 96 90.00 1 1 0 0 0 +} +// brush 4 +{ +( -288 256 384 ) ( 544 256 384 ) ( 544 -608 384 ) eden/wood -96 96 90.00 1 1 0 0 0 +( -288 256 32 ) ( -288 -608 32 ) ( -288 -608 0 ) eden/wood -96 0 0.00 1 1 0 0 0 +( 512 -608 32 ) ( 512 256 32 ) ( 512 256 0 ) eden/wood -95 0 0.00 1 1 0 0 0 +( 544 256 32 ) ( -288 256 32 ) ( -288 256 0 ) eden/wood -96 0 -180.00 1 -1 0 0 0 +( -288 224 32 ) ( 544 224 32 ) ( -288 224 0 ) eden/wood -96 0 -180.00 1 -1 0 0 0 +( 512 -32 320 ) ( -288 0 320 ) ( -288 -64 320 ) eden/wood -96 96 90.00 1 1 0 0 0 +} +// brush 5 +{ +( 544 416 0 ) ( -320 416 0 ) ( -320 -416 0 ) eden/wood 0 0 0.00 1 1 0 0 0 +( -320 -416 32 ) ( 544 -416 32 ) ( 544 -416 0 ) eden/wood 0 0 0.00 1 1 0 0 0 +( 544 384 32 ) ( -320 384 32 ) ( -320 384 0 ) eden/wood 0 0 0.00 1 1 0 0 0 +( -320 416 32 ) ( -320 -416 32 ) ( -320 -416 0 ) eden/wood 0 0 0.00 1 1 0 0 0 +( -288 -416 32 ) ( -288 416 32 ) ( -288 -416 0 ) eden/wood 0 0 0.00 1 1 0 0 0 +( -128 -416 64 ) ( -64 384 64 ) ( 0 -416 64 ) eden/wood 0 0 0.00 1 1 0 0 0 +} +// brush 6 +{ +( 544 416 0 ) ( -320 416 0 ) ( -320 -416 0 ) eden/wood 0 0 0.00 1 1 0 0 0 +( 544 -416 32 ) ( 544 416 32 ) ( 544 416 0 ) eden/wood 0 0 0.00 1 1 0 0 0 +( 544 384 32 ) ( -320 384 32 ) ( -320 384 0 ) eden/wood 0 0 0.00 1 1 0 0 0 +( -320 416 32 ) ( -320 -416 32 ) ( -320 -416 0 ) eden/wood 0 0 0.00 1 1 0 0 0 +( -320 352 32 ) ( 544 352 32 ) ( -320 352 0 ) eden/wood 0 0 0.00 1 1 0 0 0 +( -128 352 64 ) ( -64 384 64 ) ( 0 352 64 ) eden/wood 0 0 0.00 1 1 0 0 0 +} +// brush 7 +{ +( 544 416 0 ) ( -320 416 0 ) ( -320 -416 0 ) eden/wood 0 0 0.00 1 1 0 0 0 +( -320 -416 32 ) ( 544 -416 32 ) ( 544 -416 0 ) eden/wood 0 0 0.00 1 1 0 0 0 +( 544 -416 32 ) ( 544 416 32 ) ( 544 416 0 ) eden/wood 0 0 0.00 1 1 0 0 0 +( -320 416 32 ) ( -320 -416 32 ) ( -320 -416 0 ) eden/wood 0 0 0.00 1 1 0 0 0 +( 544 -384 32 ) ( -320 -384 32 ) ( 544 -384 0 ) eden/wood 0 0 0.00 1 1 0 0 0 +( -128 -416 64 ) ( -64 -384 64 ) ( 0 -416 64 ) eden/wood 0 0 0.00 1 1 0 0 0 +} +// brush 8 +{ +( 544 416 0 ) ( -320 416 0 ) ( -320 -416 0 ) eden/wood 0 0 0.00 1 1 0 0 0 +( -320 -416 32 ) ( 544 -416 32 ) ( 544 -416 0 ) eden/wood 0 0 0.00 1 1 0 0 0 +( 544 -416 32 ) ( 544 416 32 ) ( 544 416 0 ) eden/wood 0 0 0.00 1 1 0 0 0 +( 544 384 32 ) ( -320 384 32 ) ( -320 384 0 ) eden/wood 0 0 0.00 1 1 0 0 0 +( 512 416 32 ) ( 512 -416 32 ) ( 512 416 0 ) eden/wood 0 0 0.00 1 1 0 0 0 +( -128 -416 64 ) ( -64 384 64 ) ( 0 -416 64 ) eden/wood 0 0 0.00 1 1 0 0 0 +} +// brush 9 +{ +( -320 -416 32 ) ( 544 -416 32 ) ( 544 -416 0 ) eden/WL_church_2big 0 0 0.00 1 1 0 0 0 +( 544 384 32 ) ( -320 384 32 ) ( -320 384 0 ) eden/WL_church_2big 0 0 0.00 1 1 0 0 0 +( -320 416 32 ) ( -320 -416 32 ) ( -320 -416 0 ) eden/WL_church_2big 0 0 0.00 1 1 0 0 0 +( -288 -416 32 ) ( -288 416 32 ) ( -288 -416 0 ) eden/WL_church_2big 0 0 0.00 1 1 0 0 0 +( -64 384 64 ) ( -128 -416 64 ) ( 0 -416 64 ) eden/WL_church_2big 0 0 0.00 1 1 0 0 0 +( -64 -416 320 ) ( -32 384 320 ) ( 0 -416 320 ) eden/WL_church_2big 0 0 0.00 1 1 0 0 0 +} +// brush 10 +{ +( -320 -416 384 ) ( -320 416 384 ) ( 544 416 384 ) eden/wood 0 0 0.00 1 1 0 0 0 +( -320 -416 32 ) ( 544 -416 32 ) ( 544 -416 0 ) eden/wood 0 0 0.00 1 1 0 0 0 +( 544 384 32 ) ( -320 384 32 ) ( -320 384 0 ) eden/wood 0 0 0.00 1 1 0 0 0 +( -320 416 32 ) ( -320 -416 32 ) ( -320 -416 0 ) eden/wood 0 0 0.00 1 1 0 0 0 +( -288 -416 32 ) ( -288 416 32 ) ( -288 -416 0 ) eden/wood 0 0 0.00 1 1 0 0 0 +( -32 384 320 ) ( -64 -416 320 ) ( 0 -416 320 ) eden/wood 0 0 0.00 1 1 0 0 0 +} +// brush 11 +{ +( 544 -416 32 ) ( 544 416 32 ) ( 544 416 0 ) eden/WL_church_2big 0 0 0.00 1 1 0 0 0 +( 544 384 32 ) ( -320 384 32 ) ( -320 384 0 ) eden/WL_church_2big 0 0 0.00 1 1 0 0 0 +( -320 416 32 ) ( -320 -416 32 ) ( -320 -416 0 ) eden/WL_church_2big 0 0 0.00 1 1 0 0 0 +( -320 352 32 ) ( 544 352 32 ) ( -320 352 0 ) eden/WL_church_2big 0 0 0.00 1 1 0 0 0 +( -64 384 64 ) ( -128 352 64 ) ( 0 352 64 ) eden/WL_church_2big 0 0 0.00 1 1 0 0 0 +( -64 352 320 ) ( -32 384 320 ) ( 0 352 320 ) eden/WL_church_2big 0 0 0.00 1 1 0 0 0 +} +// brush 12 +{ +( -320 -416 384 ) ( -320 416 384 ) ( 544 416 384 ) eden/wood 0 0 0.00 1 1 0 0 0 +( 544 -416 32 ) ( 544 416 32 ) ( 544 416 0 ) eden/wood 0 0 0.00 1 1 0 0 0 +( 544 384 32 ) ( -320 384 32 ) ( -320 384 0 ) eden/wood 0 0 0.00 1 1 0 0 0 +( -320 416 32 ) ( -320 -416 32 ) ( -320 -416 0 ) eden/wood 0 0 0.00 1 1 0 0 0 +( -320 352 32 ) ( 544 352 32 ) ( -320 352 0 ) eden/wood 0 0 0.00 1 1 0 0 0 +( -32 384 320 ) ( -64 352 320 ) ( 0 352 320 ) eden/wood 0 0 0.00 1 1 0 0 0 +} +// brush 13 +{ +( -320 -416 32 ) ( 544 -416 32 ) ( 544 -416 0 ) eden/WL_church_2big 0 0 0.00 1 1 0 0 0 +( 544 -416 32 ) ( 544 416 32 ) ( 544 416 0 ) eden/WL_church_2big 0 0 0.00 1 1 0 0 0 +( -320 416 32 ) ( -320 -416 32 ) ( -320 -416 0 ) eden/WL_church_2big 0 0 0.00 1 1 0 0 0 +( 544 -384 32 ) ( -320 -384 32 ) ( 544 -384 0 ) eden/WL_church_2big 0 0 0.00 1 1 0 0 0 +( -64 -384 64 ) ( -128 -416 64 ) ( 0 -416 64 ) eden/WL_church_2big 0 0 0.00 1 1 0 0 0 +( -64 -416 320 ) ( -32 -384 320 ) ( 0 -416 320 ) eden/WL_church_2big 0 0 0.00 1 1 0 0 0 +} +// brush 14 +{ +( -320 -416 384 ) ( -320 416 384 ) ( 544 416 384 ) eden/wood 0 0 0.00 1 1 0 0 0 +( -320 -416 32 ) ( 544 -416 32 ) ( 544 -416 0 ) eden/wood 0 0 0.00 1 1 0 0 0 +( 544 -416 32 ) ( 544 416 32 ) ( 544 416 0 ) eden/wood 0 0 0.00 1 1 0 0 0 +( -320 416 32 ) ( -320 -416 32 ) ( -320 -416 0 ) eden/wood 0 0 0.00 1 1 0 0 0 +( 544 -384 32 ) ( -320 -384 32 ) ( 544 -384 0 ) eden/wood 0 0 0.00 1 1 0 0 0 +( -32 -384 320 ) ( -64 -416 320 ) ( 0 -416 320 ) eden/wood 0 0 0.00 1 1 0 0 0 +} +// brush 15 +{ +( -320 -416 32 ) ( 544 -416 32 ) ( 544 -416 0 ) eden/WL_church_2big 0 0 0.00 1 1 0 0 0 +( 544 -416 32 ) ( 544 416 32 ) ( 544 416 0 ) eden/WL_church_2big 0 0 0.00 1 1 0 0 0 +( 544 384 32 ) ( -320 384 32 ) ( -320 384 0 ) eden/WL_church_2big 0 0 0.00 1 1 0 0 0 +( 512 416 32 ) ( 512 -416 32 ) ( 512 416 0 ) eden/WL_church_2big 0 0 0.00 1 1 0 0 0 +( -64 384 64 ) ( -128 -416 64 ) ( 0 -416 64 ) eden/WL_church_2big 0 0 0.00 1 1 0 0 0 +( -64 -416 320 ) ( -32 384 320 ) ( 0 -416 320 ) eden/WL_church_2big 0 0 0.00 1 1 0 0 0 +} +// brush 16 +{ +( -320 -416 384 ) ( -320 416 384 ) ( 544 416 384 ) eden/wood 0 0 0.00 1 1 0 0 0 +( -320 -416 32 ) ( 544 -416 32 ) ( 544 -416 0 ) eden/wood 0 0 0.00 1 1 0 0 0 +( 544 -416 32 ) ( 544 416 32 ) ( 544 416 0 ) eden/wood 0 0 0.00 1 1 0 0 0 +( 544 384 32 ) ( -320 384 32 ) ( -320 384 0 ) eden/wood 0 0 0.00 1 1 0 0 0 +( 512 416 32 ) ( 512 -416 32 ) ( 512 416 0 ) eden/wood 0 0 0.00 1 1 0 0 0 +( -32 384 320 ) ( -64 -416 320 ) ( 0 -416 320 ) eden/wood 0 0 0.00 1 1 0 0 0 +} +// brush 17 +{ +( -320 -416 384 ) ( -320 416 384 ) ( 544 416 384 ) eden/CL_church 0 0 0.00 1 1 0 0 0 +( -320 -416 32 ) ( 544 -416 32 ) ( 544 -416 0 ) eden/CL_church 0 0 0.00 1 1 0 0 0 +( 544 -416 32 ) ( 544 416 32 ) ( 544 416 0 ) eden/CL_church 0 0 0.00 1 1 0 0 0 +( 544 384 32 ) ( -320 384 32 ) ( -320 384 0 ) eden/CL_church 0 0 0.00 1 1 0 0 0 +( -320 416 32 ) ( -320 -416 32 ) ( -320 -416 0 ) eden/CL_church 0 0 0.00 1 1 0 0 0 +( -320 416 352 ) ( -320 -416 352 ) ( 544 416 352 ) eden/CL_church 0 0 0.00 1 1 0 0 0 +} +// brush 18 +{ +( 544 416 0 ) ( -320 416 0 ) ( -320 -416 0 ) eden/FL_basement2 0 0 0.00 1 1 0 0 0 +( -320 -416 32 ) ( 544 -416 32 ) ( 544 -416 0 ) eden/FL_basement2 0 0 0.00 1 1 0 0 0 +( 544 -416 32 ) ( 544 416 32 ) ( 544 416 0 ) eden/FL_basement2 0 0 0.00 1 1 0 0 0 +( 544 384 32 ) ( -320 384 32 ) ( -320 384 0 ) eden/FL_basement2 0 0 0.00 1 1 0 0 0 +( -320 416 32 ) ( -320 -416 32 ) ( -320 -416 0 ) eden/FL_basement2 0 0 0.00 1 1 0 0 0 +( -320 416 32 ) ( 544 416 32 ) ( -320 -416 32 ) eden/FL_basement2 0 0 0.00 1 1 0 0 0 +} +} +// entity 1 +{ +"origin" "-120 168 184" +"classname" "light" +} +// entity 2 +{ +"origin" "-176 -272 32" +"angle" "45" +"classname" "info_player_start" +} +// entity 3 +{ +"targetname" "t1" +"origin" "105.34 -40.46 48.27" +"anim" "crank_turn_forward" +"model" "func_useanimdest.tik" +"scale" "1.0" +"classname" "func_useanimdest" +} +// entity 4 +{ +"target" "t1" +"count" "1" +"spawnflags" "2" +"classname" "func_useanim" +// brush 0 +{ +( 64 -32 48 ) ( 32 -32 48 ) ( 32 -64 48 ) eden/FL_basement2 0 0 0.00 1 1 0 0 0 +( 32 -64 112 ) ( 32 -32 112 ) ( 64 -32 112 ) eden/FL_basement2 0 0 0.00 1 1 0 0 0 +( 32 -64 112 ) ( 64 -64 112 ) ( 64 -64 48 ) eden/FL_basement2 0 0 0.00 1 1 0 0 0 +( 64 -64 112 ) ( 64 -32 112 ) ( 64 -32 48 ) eden/FL_basement2 0 0 0.00 1 1 0 0 0 +( 64 -16 112 ) ( 32 -16 112 ) ( 32 -16 48 ) eden/FL_basement2 0 0 0.00 1 1 0 0 0 +( 32 -32 112 ) ( 32 -64 112 ) ( 32 -64 48 ) eden/FL_basement2 0 0 0.00 1 1 0 0 0 +} +} +// entity 5 +{ +"classname" "light" +"origin" "344 136 184" +} +// entity 6 +{ +"origin" "360 -248 184" +"classname" "light" +} +// entity 7 +{ +"classname" "light" +"origin" "-104 -264 184" +} diff --git a/fakk/maps/example/useobject.prt b/fakk/maps/example/useobject.prt new file mode 100644 index 0000000..633801e --- /dev/null +++ b/fakk/maps/example/useobject.prt @@ -0,0 +1,117 @@ +PRT1 +20 +33 +80 +4 0 12 0 (0 256 352 ) (0 352 352 ) (0 352 320 ) (0 256 320 ) +4 0 3 0 (0 352 320 ) (512 352 320 ) (512 256 320 ) (0 256 320 ) +4 1 13 0 (0 96 352 ) (0 224 352 ) (0 224 320 ) (0 96 320 ) +4 1 3 0 (512 224 320 ) (512 96 320 ) (0 96 320 ) (0 224 320 ) +4 2 14 0 (0 0 320 ) (0 0 352 ) (0 64 352 ) (0 64 320 ) +4 2 6 0 (0 0 352 ) (0 0 320 ) (512 0 320 ) (512 0 352 ) +4 2 3 0 (512 64 320 ) (512 0 320 ) (0 0 320 ) (0 64 320 ) +4 3 15 0 (0 0 48 ) (0 0 320 ) (0 352 320 ) (0 352 48 ) +4 3 9 0 (0 0 320 ) (0 0 48 ) (512 0 48 ) (512 0 320 ) +4 3 5 0 (0 352 48 ) (176 352 48 ) (176 16 48 ) (0 16 48 ) +4 3 4 0 (176 352 48 ) (512 352 48 ) (512 0 48 ) (176 0 48 ) +4 4 10 0 (176 0 32 ) (512 0 32 ) (512 0 48 ) (176 0 48 ) +4 4 5 0 (176 352 32 ) (176 16 32 ) (176 16 48 ) (176 352 48 ) +4 5 15 0 (0 16 48 ) (0 352 48 ) (0 352 32 ) (0 16 32 ) +4 6 16 0 (0 -64 352 ) (0 0 352 ) (0 0 320 ) (0 -64 320 ) +4 6 9 0 (0 0 320 ) (512 0 320 ) (512 -64 320 ) (0 -64 320 ) +4 7 17 0 (0 -256 352 ) (0 -96 352 ) (0 -96 320 ) (0 -256 320 ) +4 7 9 0 (512 -96 320 ) (512 -256 320 ) (0 -256 320 ) (0 -96 320 ) +4 8 18 0 (0 -384 320 ) (0 -384 352 ) (0 -288 352 ) (0 -288 320 ) +4 8 9 0 (512 -288 320 ) (512 -384 320 ) (0 -384 320 ) (0 -288 320 ) +4 9 19 0 (0 -384 48 ) (0 -384 320 ) (0 0 320 ) (0 0 48 ) +4 9 11 0 (176 -96 48 ) (176 -384 48 ) (0 -384 48 ) (0 -96 48 ) +4 9 10 0 (176 0 48 ) (512 0 48 ) (512 -384 48 ) (176 -384 48 ) +4 10 11 0 (176 -96 32 ) (176 -384 32 ) (176 -384 48 ) (176 -96 48 ) +4 11 19 0 (0 -384 32 ) (0 -384 48 ) (0 -96 48 ) (0 -96 32 ) +4 12 15 0 (-288 256 320 ) (-288 352 320 ) (0 352 320 ) (0 256 320 ) +4 13 15 0 (-288 96 320 ) (-288 224 320 ) (0 224 320 ) (0 96 320 ) +4 14 16 0 (0 0 320 ) (0 0 352 ) (-288 0 352 ) (-288 0 320 ) +4 14 15 0 (0 0 320 ) (-288 0 320 ) (-288 64 320 ) (0 64 320 ) +4 15 19 0 (0 0 32 ) (0 0 320 ) (-288 0 320 ) (-288 0 32 ) +4 16 19 0 (-288 -64 320 ) (-288 0 320 ) (0 0 320 ) (0 -64 320 ) +4 17 19 0 (-288 -256 320 ) (-288 -96 320 ) (0 -96 320 ) (0 -256 320 ) +4 18 19 0 (0 -384 320 ) (-288 -384 320 ) (-288 -288 320 ) (0 -288 320 ) +4 0 (0 256 352 ) (512 256 352 ) (512 352 352 ) (0 352 352 ) +4 0 (512 256 352 ) (512 256 320 ) (512 352 320 ) (512 352 352 ) +4 0 (512 352 352 ) (512 352 320 ) (0 352 320 ) (0 352 352 ) +4 0 (0 256 320 ) (512 256 320 ) (512 256 352 ) (0 256 352 ) +4 1 (0 96 320 ) (512 96 320 ) (512 96 352 ) (0 96 352 ) +4 1 (0 224 352 ) (512 224 352 ) (512 224 320 ) (0 224 320 ) +4 1 (512 224 352 ) (512 96 352 ) (512 96 320 ) (512 224 320 ) +4 1 (0 224 352 ) (0 96 352 ) (512 96 352 ) (512 224 352 ) +4 2 (512 64 352 ) (512 0 352 ) (512 0 320 ) (512 64 320 ) +4 2 (0 64 352 ) (0 0 352 ) (512 0 352 ) (512 64 352 ) +4 2 (0 64 352 ) (512 64 352 ) (512 64 320 ) (0 64 320 ) +4 3 (176 16 48 ) (176 0 48 ) (0 0 48 ) (0 16 48 ) +4 3 (0 96 320 ) (0 64 320 ) (512 64 320 ) (512 96 320 ) +4 3 (0 256 320 ) (0 224 320 ) (512 224 320 ) (512 256 320 ) +4 3 (512 0 320 ) (512 0 48 ) (512 352 48 ) (512 352 320 ) +4 3 (512 352 320 ) (512 352 48 ) (0 352 48 ) (0 352 320 ) +4 4 (176 16 32 ) (176 0 32 ) (176 0 48 ) (176 16 48 ) +4 4 (176 352 48 ) (512 352 48 ) (512 352 32 ) (176 352 32 ) +4 4 (512 0 48 ) (512 0 32 ) (512 352 32 ) (512 352 48 ) +4 4 (176 352 32 ) (512 352 32 ) (512 0 32 ) (176 0 32 ) +4 5 (0 352 32 ) (176 352 32 ) (176 16 32 ) (0 16 32 ) +4 5 (176 352 48 ) (176 352 32 ) (0 352 32 ) (0 352 48 ) +4 5 (0 16 32 ) (176 16 32 ) (176 16 48 ) (0 16 48 ) +4 6 (0 -64 352 ) (512 -64 352 ) (512 0 352 ) (0 0 352 ) +4 6 (512 -64 352 ) (512 -64 320 ) (512 0 320 ) (512 0 352 ) +4 6 (0 -64 320 ) (512 -64 320 ) (512 -64 352 ) (0 -64 352 ) +4 7 (0 -256 320 ) (512 -256 320 ) (512 -256 352 ) (0 -256 352 ) +4 7 (0 -96 352 ) (512 -96 352 ) (512 -96 320 ) (0 -96 320 ) +4 7 (512 -96 352 ) (512 -256 352 ) (512 -256 320 ) (512 -96 320 ) +4 7 (0 -96 352 ) (0 -256 352 ) (512 -256 352 ) (512 -96 352 ) +4 8 (0 -384 352 ) (0 -384 320 ) (512 -384 320 ) (512 -384 352 ) +4 8 (512 -288 352 ) (512 -384 352 ) (512 -384 320 ) (512 -288 320 ) +4 8 (0 -288 352 ) (0 -384 352 ) (512 -384 352 ) (512 -288 352 ) +4 8 (0 -288 352 ) (512 -288 352 ) (512 -288 320 ) (0 -288 320 ) +4 9 (0 0 48 ) (176 0 48 ) (176 -96 48 ) (0 -96 48 ) +4 9 (0 -256 320 ) (0 -288 320 ) (512 -288 320 ) (512 -256 320 ) +4 9 (0 -64 320 ) (0 -96 320 ) (512 -96 320 ) (512 -64 320 ) +4 9 (512 -384 320 ) (512 -384 48 ) (512 0 48 ) (512 0 320 ) +4 9 (0 -384 320 ) (0 -384 48 ) (512 -384 48 ) (512 -384 320 ) +4 10 (176 0 32 ) (176 -96 32 ) (176 -96 48 ) (176 0 48 ) +4 10 (176 -384 32 ) (512 -384 32 ) (512 -384 48 ) (176 -384 48 ) +4 10 (512 -384 48 ) (512 -384 32 ) (512 0 32 ) (512 0 48 ) +4 10 (176 0 32 ) (512 0 32 ) (512 -384 32 ) (176 -384 32 ) +4 11 (176 -96 32 ) (176 -384 32 ) (0 -384 32 ) (0 -96 32 ) +4 11 (0 -384 48 ) (0 -384 32 ) (176 -384 32 ) (176 -384 48 ) +4 11 (0 -96 48 ) (176 -96 48 ) (176 -96 32 ) (0 -96 32 ) +4 12 (0 256 352 ) (0 352 352 ) (-288 352 352 ) (-288 256 352 ) +4 12 (0 352 352 ) (0 352 320 ) (-288 352 320 ) (-288 352 352 ) +4 12 (-288 256 352 ) (-288 352 352 ) (-288 352 320 ) (-288 256 320 ) +4 12 (-288 256 320 ) (0 256 320 ) (0 256 352 ) (-288 256 352 ) +4 13 (-288 96 320 ) (0 96 320 ) (0 96 352 ) (-288 96 352 ) +4 13 (-288 224 352 ) (0 224 352 ) (0 224 320 ) (-288 224 320 ) +4 13 (-288 96 352 ) (-288 224 352 ) (-288 224 320 ) (-288 96 320 ) +4 13 (0 96 352 ) (0 224 352 ) (-288 224 352 ) (-288 96 352 ) +4 14 (-288 0 320 ) (-288 0 352 ) (-288 64 352 ) (-288 64 320 ) +4 14 (0 64 352 ) (-288 64 352 ) (-288 0 352 ) (0 0 352 ) +4 14 (-288 64 352 ) (0 64 352 ) (0 64 320 ) (-288 64 320 ) +4 15 (-288 0 32 ) (-288 0 320 ) (-288 352 320 ) (-288 352 32 ) +4 15 (0 16 32 ) (0 16 48 ) (0 0 48 ) (0 0 32 ) +4 15 (0 352 320 ) (0 352 32 ) (-288 352 32 ) (-288 352 320 ) +4 15 (0 224 320 ) (0 256 320 ) (-288 256 320 ) (-288 224 320 ) +4 15 (0 64 320 ) (0 96 320 ) (-288 96 320 ) (-288 64 320 ) +4 15 (0 0 32 ) (-288 0 32 ) (-288 352 32 ) (0 352 32 ) +4 16 (0 -64 352 ) (0 0 352 ) (-288 0 352 ) (-288 -64 352 ) +4 16 (-288 0 352 ) (-288 0 320 ) (-288 -64 320 ) (-288 -64 352 ) +4 16 (-288 -64 320 ) (0 -64 320 ) (0 -64 352 ) (-288 -64 352 ) +4 17 (-288 -256 320 ) (0 -256 320 ) (0 -256 352 ) (-288 -256 352 ) +4 17 (-288 -96 352 ) (0 -96 352 ) (0 -96 320 ) (-288 -96 320 ) +4 17 (-288 -96 320 ) (-288 -256 320 ) (-288 -256 352 ) (-288 -96 352 ) +4 17 (0 -256 352 ) (0 -96 352 ) (-288 -96 352 ) (-288 -256 352 ) +4 18 (-288 -288 320 ) (-288 -384 320 ) (-288 -384 352 ) (-288 -288 352 ) +4 18 (-288 -384 352 ) (-288 -384 320 ) (0 -384 320 ) (0 -384 352 ) +4 18 (0 -288 352 ) (-288 -288 352 ) (-288 -384 352 ) (0 -384 352 ) +4 18 (-288 -288 352 ) (0 -288 352 ) (0 -288 320 ) (-288 -288 320 ) +4 19 (-288 0 320 ) (-288 0 32 ) (-288 -384 32 ) (-288 -384 320 ) +4 19 (0 -96 32 ) (0 0 32 ) (0 0 48 ) (0 -96 48 ) +4 19 (-288 -384 320 ) (-288 -384 32 ) (0 -384 32 ) (0 -384 320 ) +4 19 (0 -96 320 ) (0 -64 320 ) (-288 -64 320 ) (-288 -96 320 ) +4 19 (0 -288 320 ) (0 -256 320 ) (-288 -256 320 ) (-288 -288 320 ) +4 19 (0 -384 32 ) (-288 -384 32 ) (-288 0 32 ) (0 0 32 ) diff --git a/fakk/maps/example/vehicle.bsp b/fakk/maps/example/vehicle.bsp new file mode 100644 index 0000000000000000000000000000000000000000..a409eb8a2bb48e9bbe140f7064a521d75be52428 GIT binary patch literal 170324 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 z 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

  • V!7iao#o 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

    %8~O}H#u#z^w14Hf&aO@VIyop+#r_H^jk(h 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 = (rootnode); \ + (rootnode)->next = (rootnode); \ + } + +#define LL_Add(rootnode, newnode, next, prev) \ + { \ + (newnode)->next = (rootnode); \ + (newnode)->prev = (rootnode)->prev; \ + (rootnode)->prev->next = (newnode); \ + (rootnode)->prev = (newnode); \ + } +//MED +#define LL_AddFirst(rootnode, newnode, next, prev) \ + { \ + (newnode)->prev = (rootnode); \ + (newnode)->next = (rootnode)->next; \ + (rootnode)->next->prev = (newnode); \ + (rootnode)->next = (newnode); \ + } + +#define LL_Transfer(oldroot,newroot,next,prev) \ + { \ + if (oldroot->prev != oldroot) \ + { \ + oldroot->prev->next = newroot; \ + oldroot->next->prev = newroot->prev; \ + newroot->prev->next = oldroot->next; \ + newroot->prev = oldroot->prev; \ + oldroot->next = oldroot; \ + oldroot->prev = oldroot; \ + } \ + } + +#define LL_Reverse(root,type,next,prev) \ + { \ + type *newend,*trav,*tprev; \ + \ + newend = root->next; \ + for(trav = root->prev; trav != newend; trav = tprev) \ + { \ + tprev = trav->prev; \ + LL_Move(trav,newend,next,prev); \ + } \ + } + + +#define LL_Remove(node,next,prev) \ + { \ + node->prev->next = node->next; \ + node->next->prev = node->prev; \ + node->next = node; \ + node->prev = node; \ + } + +#define LL_SortedInsertion(rootnode,insertnode,next,prev,type,sortparm) \ + { \ + type *hoya; \ + \ + hoya = rootnode->next; \ + while((hoya != rootnode) && (insertnode->sortparm > hoya->sortparm)) \ + { \ + hoya = hoya->next; \ + } \ + LL_Add(hoya,insertnode,next,prev); \ + } + +#define LL_Move(node,newroot,next,prev) \ + { \ + LL_Remove(node,next,prev); \ + LL_Add(newroot,node,next,prev); \ + } + +#define LL_Empty(list,next,prev) \ + ( \ + ((list)->next == (list)) && \ + ((list)->prev == (list)) \ + ) + +#define LL_Free(list) Z_Free(list) +#define LL_Reset(list,next,prev) (list)->next = (list)->prev = (list) + +#ifdef __cplusplus +} + +#endif +#endif diff --git a/source/source/cgame/cg_beam.cpp b/source/source/cgame/cg_beam.cpp new file mode 100644 index 0000000..cba7cc1 --- /dev/null +++ b/source/source/cgame/cg_beam.cpp @@ -0,0 +1,1569 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/cgame/cg_beam.cpp $ +// $Revision:: 57 $ +// $Author:: Aldie $ +// $Date:: 7/25/00 11:30p $ +// +// Copyright (C) 1999 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/cgame/cg_beam.cpp $ +// +// 57 7/25/00 11:30p Aldie +// Made some memory changes and fixed some memory allocation bugs +// +// 56 7/18/00 4:31p Aldie +// Fix some client side multibeam stuff incase the whole group is not available +// to the client +// +// 55 6/27/00 7:16p Aldie +// Fixed it so beam emitters use alpha from entity +// +// 54 6/26/00 8:02p Aldie +// Fixed some checks for multibeams +// +// 53 6/17/00 1:54p Markd +// Added server restarted code +// +// 52 6/14/00 12:14p Markd +// more intel compiler bug fixes +// +// 51 6/08/00 3:51p Markd +// fixed unused variable warning +// +// 50 6/07/00 5:02p Aldie +// Fixed beam offset from owner bug +// +// 49 6/03/00 10:55a Markd +// Sped up tracing and debug print messages +// +// 48 5/30/00 11:00a Aldie +// Some mods for Circle of Protection powerup +// +// 47 5/16/00 6:24p Markd +// added cg_traceinfo support +// +// 46 5/06/00 3:27p Aldie +// Fix for beam emitters turning off +// +// 45 5/04/00 8:38p Aldie +// Made beam emitters work better +// +// 44 5/04/00 2:38p Aldie +// Fixed warnings +// +// 43 5/04/00 2:30p Aldie +// Fix for beam rendering tex coords +// +// 42 4/21/00 4:10p Markd +// fixed rope rendering +// +// 41 4/10/00 11:44a Markd +// fixed rope rendering +// +// 40 4/10/00 11:16a Markd +// added rope code +// +// 39 3/28/00 3:16p Aldie +// Fixed some beam problems for Pat +// +// 38 3/16/00 3:37p Aldie +// Fixed chceks for multi beam on invalid ents +// +// 37 3/01/00 1:45p Aldie +// Added some more beam functionality for beau. Added taglist to do beam +// chains. +// +// 36 2/25/00 6:19p Aldie +// Changed texture coords on beams +// +// 35 2/15/00 7:04p Aldie +// More beam rendering fixes +// +// 34 2/14/00 7:34p Aldie +// Fixed some beam rendering issues +// +// 33 2/14/00 2:31p Aldie +// Fix for the first point on multibeam rendering (ropes) +// +// 32 1/27/00 11:47a Aldie +// Made beam_t a class +// +// 31 1/26/00 5:07p Aldie +// Removed warning +// +// 30 1/25/00 3:59p Aldie +// Added warning for multibeam +// +// 29 1/24/00 6:19p Aldie +// Fixed tex coords on the beams +// +// 28 1/22/00 12:41p Jimdose +// got rid of calls to vec3() +// +// 27 1/20/00 5:26p Aldie +// Fixed some beam bugs +// +// 26 1/12/00 3:17p Aldie +// Fixed beams so that there may be multiple beams on a model +// +// 25 1/05/00 7:26p Jimdose +// made angle functions all use the same coordinate system +// AngleVectors now returns left instead of right +// no longer need to invert pitch +// +// 24 11/10/99 6:35p Aldie +// Fix to draw the entire beam for ropes +// +// 23 10/29/99 7:16p Aldie +// Updated rope stuff +// +// 22 10/26/99 2:11p Aldie +// Fix beam crash +// +// 21 10/22/99 7:18p Aldie +// Fix for model lightning +// +// 20 10/22/99 6:29p Aldie +// Fix for beams in the sky +// +// 19 10/21/99 2:51p Aldie +// Added some more beam functions +// +// 18 10/20/99 12:20p Aldie +// Cleanup and fix color bug +// +// 17 10/19/99 4:57p Aldie +// More fixes for beams +// +// 16 10/19/99 4:30p Aldie +// Added beam wave effects +// +// 15 10/19/99 12:01p Aldie +// moved a piece of code +// +// 14 10/19/99 11:57a Aldie +// Added some more beam features +// +// 13 10/18/99 1:59p Aldie +// Lots of fixes for beams and stuff +// +// 12 10/14/99 7:19p Aldie +// Fix some beam stuff +// +// 11 10/13/99 3:26p Aldie +// Various fixes for particles, beams and lensflares +// +// 10 10/08/99 5:47p Aldie +// More beam stuff +// +// 9 10/08/99 5:07p Aldie +// More beam stuff and fix for UI_CenterPrint +// +// 8 10/07/99 7:14p Aldie +// more beam stuff (woohoo!) +// +// 7 10/07/99 3:08p Aldie +// more beam fun +// +// 6 10/06/99 3:11p Aldie +// Added more docs to commands +// +// 5 10/05/99 6:01p Aldie +// Added headers +// +// DESCRIPTION: +// Beam effects + +#include "cg_local.h" +#include "vector.h" +#include "container.h" +#include "cg_commands.h" + +class beam_t : public Class + { + public: + beam_t(); + + int entity; + qhandle_t hModel; + int endtime; + Vector start, end; + float scale; + float alpha; + int flags; + int parent; + float max_offset; + float min_offset; + int numSubdivisions; + int overlap; + int beamshader; + byte shaderRGBA[4]; + int update_time; + int delay; + float life; + int numspherebeams; + float sphereradius; + int toggletime; + int toggledelay; + qboolean active; + float alphastep; + int renderfx; + str name; + }; + +beam_t::beam_t() + { + entity=0; + hModel=0; + endtime=0; + scale=0; + alpha=0; + flags=0; + parent=ENTITYNUM_NONE; + max_offset=0; + min_offset=0; + numSubdivisions=0; + overlap=0; + beamshader=0; + update_time=0; + delay=0; + life=0; + numspherebeams=0; + sphereradius=0; + toggletime=0; + toggledelay=0; + active=0; + alphastep=0; + renderfx=0; + memset( shaderRGBA, 0, 4 ); + } + +beam_t cl_beams[MAX_BEAMS]; + +static int seed = 100; + +// Recursive beam builder - I don't use it anymore +/* +void CG_BuildRenderBeam_r + ( + Vector start, + Vector end, + float angleVar, + int numSubdivisions, + int maxSubdivisions + ) + + { + if ( numSubdivisions == maxSubdivisions ) + { + return; + } + else + { + // subdivide line and call on both halves + numSubdivisions += 1; + + mid = ( p1 * 0.5 ) + ( p2 * 0.5 ); + + int seed = 100; + + mid[0] += Q_crandom( &seed ) * angleVar; + mid[1] += Q_crandom( &seed ) * angleVar; + mid[2] += Q_crandom( &seed ) * angleVar; + + CG_BuildRendererBeam( p1, mid, angleVar, numSubdivisions, maxSubdivisions, color, beamshader, scale ); + CG_BuildRendererBeam( mid, p2, angleVar, numSubdivisions, maxSubdivisions, color, beamshader, scale ); + } + } +*/ + +#define MAX_BEAM_BACKUP 6 +#define MAX_BEAM_SEGMENTS 32 + +typedef struct beamSegment_t + { + polyVert_t points[4]; + } beamSegment_t; + +typedef struct beamList_t + { + int time; + int updatetime; + int numsegments; + beamSegment_t segments[MAX_BEAM_SEGMENTS]; + } beamList_t; + +typedef struct beamEnt_t + { + int owner; + int numbeams; + int life; + int renderfx; + beamList_t beamlist[MAX_BEAM_BACKUP]; + } beamEnt_t; + +Container beamManager; + +void RemoveBeamList + ( + int owner + ) + + { + int i,num; + + num = beamManager.NumObjects(); + + for ( i=1; i<=num; i++ ) + { + beamEnt_t *be = beamManager.ObjectAt( i ); + + if ( be->owner == owner ) + { + beamManager.RemoveObjectAt( i ); + delete be; + return; + } + } + } + +beamEnt_t *FindBeamList + ( + int owner + ) + + { + int i,num; + + num = beamManager.NumObjects(); + + for ( i=1; i<=num; i++ ) + { + beamEnt_t *be = beamManager.ObjectAt( i ); + + if ( be->owner == owner ) + return be; + } + return NULL; + } + +int CreateNewBeamEntity + ( + int owner, + float life + ) + + { + beamEnt_t *be; + int i,oldest,oldest_time; + + be = FindBeamList( owner ); + + if ( !be ) + { + be = new beamEnt_t; + + if ( !be ) + cgi.Error( ERR_DROP, "Could not allocate memory for beamEnt.\n" ); + + memset ( be, 0, sizeof( beamEnt_t ) ); + memset ( be->beamlist, 0, sizeof( beamList_t ) * MAX_BEAM_BACKUP ); + be->owner = owner; + be->life = life; + + beamManager.AddObject( be ); + } + + // find the oldest beam and overwrite it. + oldest = -1; + oldest_time = 999999999; + + for ( i=0; ibeamlist[ i ].time; + + if ( !t ) + { + oldest = i; + break; + } + + if ( t < oldest_time ) + { + oldest = i; + oldest_time = t; + } + } + + // Use the oldest beam for the next beam. + be->beamlist[ oldest ].numsegments = 0; + be->beamlist[ oldest ].time = cg.time; + be->beamlist[ oldest ].updatetime = cg.time + be->life; + return oldest; + } + +void RemoveBeamEntity + ( + int owner + ) + + { + RemoveBeamList( owner ); + } + +void AddBeamSegmentToList + ( + int owner, + polyVert_t points[4], + int beamnum, + int segnum, + int renderfx + ) + + { + beamEnt_t *be; + + be = FindBeamList( owner ); + + if ( !be ) + { + cgi.DPrintf( "Could not find beam entity for owner:%d\n", owner ); + return; + } + + if ( segnum >= MAX_BEAM_SEGMENTS ) + return; + + be->renderfx = renderfx; + + // Copy the 4 points + memcpy( &be->beamlist[beamnum].segments[segnum].points, points, 4 * sizeof( polyVert_t ) ); + + // Increase the segment counter + be->beamlist[beamnum].numsegments++; + } + +void CG_AddBeamsFromList + ( + int owner, + int beamshader + ) + + { + int i,j,k,l; + float frac, fade; + beamEnt_t *be = FindBeamList( owner ); + polyVert_t newpoints[4]; + + if ( !be ) + { + return; + } + + for ( i=0; ibeamlist[i]; + + if ( !bl->time ) + continue; + + // Calculate the blend factor for fading + frac = (float)( cg.time - bl->time ) / (float)be->life; + fade = 1.0f - frac; + + if ( fade <= 0 ) + { + bl->time = 0; // RemoveBeamList( owner ); + continue; + } + + // Go through each segment and draw it with the new modulate + assert( bl->numsegments < MAX_BEAM_SEGMENTS ); + + for ( j=0; jnumsegments; j++ ) + { + memcpy( newpoints, bl->segments[j].points, 4 * sizeof( polyVert_t ) ); + + for ( k=0; k<4; k++ ) + { + for ( l=0; l<4; l++ ) + { + newpoints[k].modulate[l] = bl->segments[j].points[k].modulate[l] * fade; + } + } + + cgi.R_AddPolyToScene( beamshader, 4, newpoints, be->renderfx ); + } + } + } + +void RenderSegment + ( + Vector pt1a, + Vector pt1b, + Vector pt2a, + Vector pt2b, + byte modulate[4], + int beamshader, + int renderfx + ) + + { + int i,j; + polyVert_t points[4]; + + VectorCopy( pt1a, points[0].xyz ); + VectorCopy( pt2a, points[1].xyz ); + VectorCopy( pt2b, points[2].xyz ); + VectorCopy( pt1b, points[3].xyz ); + + points[0].st[0] = 1; points[0].st[1] = 1; + points[1].st[0] = 0; points[1].st[1] = 1; + points[2].st[0] = 0; points[2].st[1] = 0; + points[3].st[0] = 1; points[3].st[1] = 0; + + // Set the color of the verts + for ( i=0; i<4; i++ ) + { + for ( j=0; j<4; j++ ) + { + points[i].modulate[j] = modulate[j]; + } + } + + // Add a segment to the list + cgi.R_AddPolyToScene( beamshader, 4, points, renderfx ); + } + +const int MAX_SUBPOINTS=256; +static Vector subpoints[MAX_SUBPOINTS]; +static int ptctr=0; +/* +=============== +CG_Subdivide + +a, b, and c are control points. +the subdivided sequence will be: a, out1, out2, out3, c +=============== +*/ +static void CG_Subdivide( Vector a, Vector b, Vector c, Vector &out1, Vector &out2, Vector &out3 ) + { + out1 = 0.5 * (a + b); + out3 = 0.5 * (b + c); + out2 = 0.5 * (out1 + out3); + } + +void CG_MultiBeamBegin + ( + void + ) + + { + ptctr = 0; + } + +void CG_MultiBeamAddPoints + ( + vec3_t start, + vec3_t end, + int numsegments, + int flags, + float minoffset, + float maxoffset, + qboolean addstartpoint + ) + + { + Vector delta,dir,randdir; + float length; + int i; + + if ( ptctr > MAX_SUBPOINTS ) + return; + + if ( addstartpoint ) + { + subpoints[ ptctr++ ] = start; + } + + delta = Vector( end ) - Vector( start ); + length = delta.length(); + length /= numsegments; + + // get the dir of beam + dir = delta; + dir.normalize(); + + for ( i=1; i MAX_SUBPOINTS ) + return; + + randdir = Vector( crandom(), crandom(), crandom() ); + + newpt = Vector( start ) + dir * i * length; + newpt += minoffset * randdir + maxoffset * randdir; + + subpoints[ ptctr++ ] = newpt; + } + subpoints[ ptctr++ ] = end; + } + +void CG_MultiBeamEnd + ( + float scale, + int renderfx, + const char *beamshadername, + byte modulate[4], + int flags, + int owner, + float life + ) + + { + Vector prevpt,currpt; + Vector p1,p2,p3,p4,v1,v2,up,currpt1,currpt2,prevpt1,prevpt2; + qboolean prevptvalid=false; + int i,beamshader; + + beamshader = cgi.R_RegisterShader( beamshadername ); + + prevpt = subpoints[0]; + prevptvalid = false; + + for ( i=1; icurrentState.tag_num == ENTITYNUM_NONE ) + { + cgi.DPrintf( "CG_MultiBeamSubdivide : Multi beam entity does not have a child\n" ); + return; + } + pt1 = current->lerpOrigin; + + // Get pt2 + current = &cg_entities[ current->currentState.tag_num ]; + // Make sure that child is a multibeam + if ( current->currentState.eType != ET_MULTIBEAM ) + return; + + if ( current->currentState.tag_num == ENTITYNUM_NONE ) + { + cgi.DPrintf( "CG_MultiBeamSubdivide : Multi beam entity does not have a child\n" ); + return; + } + pt2 = current->lerpOrigin; + + // Get pt3 + current = &cg_entities[ current->currentState.tag_num ]; + // Make sure that child is a multibeam + if ( current->currentState.eType != ET_MULTIBEAM ) + { + return; + } + + if ( current->currentState.tag_num == ENTITYNUM_NONE ) + { + cgi.DPrintf( "CG_MultiBeamSubdivide : Multi beam entity does not have a child\n" ); + return; + } + pt3 = current->lerpOrigin; + + // First point into the subdivided points + subpoints[ptctr++] = pt1; + + while ( 1 ) + { + // Do the subdivide + CG_Subdivide( pt1, pt2, pt3, out1, out2, out3 ); + CG_Subdivide( pt1, out1, out2, out4, out5, out6 ); + + if ( ( ptctr + 4 ) > MAX_SUBPOINTS ) + break; + + // Save the points + subpoints[ptctr++] = out4; + subpoints[ptctr++] = out5; + subpoints[ptctr++] = out6; + subpoints[ptctr++] = out2; + + // end condition + if ( ( current->currentState.tag_num == ENTITYNUM_NONE ) || ( !current->currentValid ) ) + { + CG_Subdivide( out2, out3, pt3, out7, out8, out9 ); + subpoints[ptctr++] = out7; + subpoints[ptctr++] = out8; + subpoints[ptctr++] = out9; + subpoints[ptctr++] = pt3; + break; + } + + // Advance to next ent + current = &cg_entities[ current->currentState.tag_num ]; + + if ( !current->currentValid ) + { + break; + } + + // Advance the points down the line + pt1 = out2; + pt2 = pt3; + pt3 = current->lerpOrigin; + } + } + + +void CG_MultiBeam + ( + centity_t *cent + ) + + { + Vector prevpt,currpt; + entityState_t *s1; + Vector p1,p2,p3,p4,v1,v2,up,currpt1,currpt2,prevpt1,prevpt2; + const char *beamshadername; + int beamshader; + byte modulate[4]; + qboolean prevptvalid=false; + int i; + + s1 = ¢->currentState; + + // If this isn't the parent of the beam, then return + if ( !s1->surfaces[0] ) + { + return; + } + + // Subdivide up the segments + CG_MultiBeamSubdivide( cent ); + + // This is the top of the beam ent list, build up a renderer beam based on all the children + beamshadername = CG_ConfigString( CS_IMAGES + s1->surfaces[1] ); // index for shader configstring + beamshader = cgi.R_RegisterShader( beamshadername ); + //beamshader = cgi.R_RegisterShader( "" ); + for ( i=0;i<4;i++ ) + modulate[i] = cent->color[i] * 255; + + if ( ptctr < 3 ) + { + return; + } + + prevpt = subpoints[0]; + prevptvalid = false; + + for ( i=1; iscale ); + currpt2 = currpt + ( up * -s1->scale ); + + if ( !prevptvalid ) + { + prevpt1 = prevpt + up * s1->scale; + prevpt2 = prevpt + up * -s1->scale; + prevptvalid = true; + } + + RenderSegment( currpt1, currpt2, prevpt1, prevpt2, modulate, beamshader, s1->renderfx ); + + prevpt = currpt; + prevpt1 = currpt1; + prevpt2 = currpt2; + } + } + +void CG_BuildRendererBeam + ( + Vector start, + Vector end, + float angleVar, + int numSubdivisions, + byte color[4], + int beamshader, + float scale, + float overlap, + int owner, + float life, + int flags, + float startalpha, + float alphastep, + int renderfx + ) + { + Vector p1, p2, v1, v2, dir, prevpt1, prevpt2, nextpt, mid, delta, up; + int i,ii,jj; + polyVert_t points[4]; + float length; + int segnum = 0; + int beamnum = 0; + float alphafactor; + int picW; + + // Create or increment the number of beams for this owner and check to + // see if we should add a new beam + if ( flags & BEAM_PERSIST_EFFECT ) + { + beamnum = CreateNewBeamEntity( owner, life ); + if ( beamnum < 0 ) + return; + } + + // For debugging texture coords + //beamshader = cgi.R_RegisterShader( "" ); + + picW = cgi.R_GetShaderWidth( beamshader ); + + // calcluate length of beam segment + delta = end-start; + length = delta.length(); + length /= numSubdivisions; + + // get the dir of beam + dir = delta; + dir.normalize(); + + // Calculate the first up vector + v1 = start - cg.refdef.vieworg; + v2 = end - cg.refdef.vieworg; + up.CrossProduct( v1, v2 ); + up.normalize(); + + // Calculate the first points + prevpt1 = start + ( up * scale ); + prevpt2 = start + ( up * -scale ); + p1 = start; + + // go through and calculate each point of the beam and offset it by the anglevar + for ( i=1; i<=numSubdivisions; i++ ) + { + // Calculate the next point along the beam + p2 = start + ( dir * i * length ); + + // Random variance on the next point ( except if it's the last ) + if ( i != numSubdivisions ) + { + if ( flags & BEAM_WAVE_EFFECT ) + { + float phase = p2.x + p2.y; + p2.z += sin( phase + cg.time ) * angleVar; + } + else if ( flags & BEAM_USE_NOISE ) + { + p2.x += cgi.R_Noise( p2.x,p2.y,p2.z,cg.time ) * angleVar; + p2.y += cgi.R_Noise( p2.x,p2.y,p2.z,cg.time ) * angleVar; + p2.z += cgi.R_Noise( p2.x,p2.y,p2.z,cg.time ) * angleVar; + } + else + { + p2.x += Q_crandom( &seed ) * angleVar; + p2.y += Q_crandom( &seed ) * angleVar; + p2.z += Q_crandom( &seed ) * angleVar; + } + } + + // Create the up vec for the beam which is parallel to the viewplane + v1 = p1 - cg.refdef.vieworg; + v2 = p2 - cg.refdef.vieworg; + up.CrossProduct( v1, v2 ); + up.normalize(); + + // Build the quad + VectorMA( p2, scale, up, points[0].xyz ); + VectorCopy( prevpt1, points[1].xyz ); + VectorCopy( prevpt2, points[2].xyz ); + VectorMA( p2, -scale, up, points[3].xyz ); + + if ( flags & BEAM_TILESHADER ) // Tile the shader across the beam + { + float startS = ( length * ( i-1 ) ) / (float)picW; + float endS = ( length * ( i ) ) / (float)picW; + + points[0].st[0] = startS; points[0].st[1] = 1; + points[1].st[0] = endS; points[1].st[1] = 1; + points[2].st[0] = endS; points[2].st[1] = 0; + points[3].st[0] = startS; points[3].st[1] = 0; + } + else + { + points[0].st[0] = 1; points[0].st[1] = 1; + points[1].st[0] = 0; points[1].st[1] = 1; + points[2].st[0] = 0; points[2].st[1] = 0; + points[3].st[0] = 1; points[3].st[1] = 0; + } + + + if ( !alphastep ) + alphafactor = 1.0f; + else + alphafactor = startalpha + (alphastep * i); + + // Set the color of the verts + for ( ii=0; ii<4; ii++ ) + { + for ( jj=0; jj<4; jj++ ) + { + points[ii].modulate[jj] = color[jj] * alphafactor; + } + } + + if ( flags & BEAM_PERSIST_EFFECT ) + { + // Save the segment for backup for drawing faded out + AddBeamSegmentToList( owner, points, beamnum, segnum++, renderfx ); + } + else + { + // Add it to the ref + cgi.R_AddPolyToScene( beamshader, 4, points, renderfx ); + } + + + // Subtract off the overlap + if ( overlap ) + { + p2 = p2 + ( dir * -overlap ); + } + + // Save off the last point to use as the first point on the next quad + VectorMA( p2, scale, up, prevpt1 ); + VectorMA( p2, -scale, up, prevpt2 ); + p1 = p2; + } + } + +void CG_CreateModelBeam + ( + beam_t *b, + vec3_t org, + vec3_t dist, + float total_length, + vec3_t ndir, + vec3_t left, + vec3_t up + ) + + { + int tikihandle; + vec3_t mins,maxs; + int single_beam_length; + refEntity_t ent; + int count; + int j; + float factor[3]; + float t; + vec3_t angles; + int i; + + // Find the length of a single beam + tikihandle = cgi.TIKI_GetHandle( b->hModel ); + + // Calculate the bounds of the model to get it's length + cgi.CalculateBounds( tikihandle, 1.0, mins, maxs); + single_beam_length = maxs[0] - mins[0]; + + // Create the beam entity + memset (&ent, 0, sizeof(ent)); + count = 0; + + // Initialize the factors + for ( j=0; j<3; j++) + factor[j] = 0.3f * crandom(); + + t = 0; + + while ( t >= 0 && t < 1 ) + { + float dot; + vec3_t pdir; + float delta; + vec3_t distance_point; + + count++; + + // Set the origin of the current beam using the last calculated org + VectorCopy( org, ent.origin ); + + // Advance the org one beam length in the new direction ( dist is the newly calculated direction ) + for ( j=0 ; j<3 ; j++ ) + org[j] += dist[j] * ( single_beam_length - b->overlap ); + + // Offset the org by a random amount to simulate lightning + + VectorMA( org, single_beam_length * factor[2], up, org ); + VectorMA( org, single_beam_length * factor[1], left, org ); + + // Calculate (t) - how far this new point is along the overall distance + VectorSubtract( org, b->start, pdir ); + dot = DotProduct( pdir, ndir ); + t = dot/total_length; + + // Calculate point at current distance along center beam + VectorMA( b->start, total_length * t, ndir, distance_point ); + + // Allow any variations + if ( t > 0.1 && t < 0.9 ) + { + for ( j=0; j<3; j++ ) + { + delta = org[j] - distance_point[j]; + if ( delta > b->max_offset ) + { + org[j] = distance_point[j] + b->max_offset; + factor[j] = -0.3 * crandom(); + } + else if ( delta < -b->max_offset ) + { + org[j] = distance_point[j] - b->max_offset; + factor[j] = 0.3 * crandom(); + } + else + factor[j] = 0.3 * crandom(); + } + } + else // Clamp to mins + { + for ( j=0; j<3; j++ ) + { + delta = org[j] - distance_point[j]; + if ( delta > b->min_offset ) + { + org[j] -= 0.4 * single_beam_length; + factor[j] = -0.2; + } + else if ( delta < -b->min_offset ) + { + org[j] += 0.4 * single_beam_length; + factor[j] = 0.2; + } + else + factor[j] = 0; + } + } + + // Calculate the new dist vector so we can get pitch and yaw for this beam + VectorSubtract (org, ent.origin, dist); + + // Set the pitch and the yaw based off this new vector + vectoangles( dist, angles ); + + // Fill in the ent fields + ent.hModel = b->hModel; + ent.scale = b->scale; + ent.renderfx = b->renderfx; + + for( i=0; i<4; i++ ) + ent.shaderRGBA[i] = b->shaderRGBA[i]; + + VectorCopy(ent.origin, ent.oldorigin); + AnglesToAxis( angles, ent.axis ); + + // Add in this beam to the ref + cgi.R_AddRefEntityToScene( &ent ); + } + } + +void CG_AddBeams + ( + void + ) + + { + int i,ii; + beam_t *b; + vec3_t delta; + vec3_t angles; + vec3_t forward, left, up; + float length; + byte color[4]; + float fade; + + for (i=0, b=cl_beams ; ihModel || b->endtime < cg.time ) + { + // Make sure endtime is not 0, and remove the beam entirely + if ( b->endtime ) + { + RemoveBeamList( b->entity ); + b->entity = ENTITYNUM_NONE; + b->endtime = 0; + } + continue; + } + + // Fade the beam based on it's life + fade = (float)( b->endtime - cg.time ) / (float) b->life; + + for ( ii=0; ii<4; ii++ ) + color[ii] = b->shaderRGBA[ii] * fade; + + // Check to see if the beam should be toggled + if ( b->flags & BEAM_TOGGLE ) + { + if ( cg.time > b->toggletime ) + { + b->active = !b->active; + if ( b->flags & BEAM_RANDOM_TOGGLEDELAY ) + b->toggletime = cg.time + random() * b->toggledelay; + else + b->toggletime = cg.time + b->toggledelay; + } + } + + if ( !b->active ) + { + CG_AddBeamsFromList( b->entity, b->beamshader ); + continue; + } + + if ( ( b->flags & BEAM_PERSIST_EFFECT ) && ( b->update_time > cg.time ) ) + { + CG_AddBeamsFromList( b->entity, b->beamshader ); + continue; + } + + b->update_time = cg.time + b->delay; + + if ( !b->active ) + continue; + + if ( b->flags & BEAM_USEMODEL ) + { + // Calculate the direction + VectorSubtract( b->start, b->end, delta ); + + // Calculate the beam length + length = VectorLength( delta ); + + // Get the perpendicular vectors to this vector + vectoangles( delta, angles ); + AngleVectors( angles, forward, left, up ); + CG_CreateModelBeam( b, b->start, delta, length, forward, left, up ); + } + else + { + // Do a sphere effect + if ( b->flags & BEAM_SPHERE_EFFECT ) + { + int k; + + // Calculate the direction + VectorSubtract( b->start, b->end, delta ); + + // Calculate the beam length + length = VectorLength( delta ); + + for( k=0; knumspherebeams; k++ ) + { + Vector offset( crandom(), crandom(), crandom() ); + Vector start( b->start + offset * b->sphereradius ); + Vector end( b->start + offset * length ); + + CG_BuildRendererBeam( start, + end, + b->max_offset, + b->numSubdivisions, + color, + b->beamshader, + b->scale, + b->overlap, + b->entity, + b->life, + b->flags, + b->alpha, + b->alphastep, + b->renderfx + ); + + } + } + else + { + //cgi.DPrintf( "%2f %2f %2f\n", b->start[0],b->start[1],b->start[2] ); + CG_BuildRendererBeam( b->start, + b->end, + b->max_offset, + b->numSubdivisions, + color, + b->beamshader, + b->scale, + b->overlap, + b->entity, + b->life, + b->flags, + b->alpha, + b->alphastep, + b->renderfx + ); + } + if ( b->flags & BEAM_PERSIST_EFFECT ) + CG_AddBeamsFromList( b->entity, b->beamshader ); + } + } + } + +void CG_CreateBeam + ( + vec3_t start, + vec3_t dir, + int owner, + qhandle_t hModel, + float alpha, + float scale, + int flags, + float length, + int life, + qboolean create, + vec3_t endpointvec, + int min_offset, + int max_offset, + int overlap, + int numSubdivisions, + int delay, + const char *beamshadername, + byte modulate[4], + int numspherebeams, + float sphereradius, + int toggledelay, + float endalpha, + int renderfx, + const char *name + ) + + { + int i; + beam_t *b; + vec3_t end; + trace_t trace; + + // Check to see if endpoint is specified + if ( endpointvec ) + { + VectorCopy( endpointvec, end ); + } + else + { + // Trace to find the endpoint with a shot + VectorMA( start, length, dir, end ); + CG_Trace( &trace,start, vec3_origin, vec3_origin, end, 0, MASK_SHOT, false, true, "Create Beam" ); + VectorCopy( trace.endpos, end ); + } + + // If we aren't creating a beam, then search the beams for this one already active + if ( !create ) + { + for ( i=0, b=cl_beams ; i< MAX_BEAMS ; i++, b++ ) + { + if ( b->entity == owner ) + { + if ( name && b->name == name ) + { + b->endtime = cg.time + life; + b->hModel = hModel; + b->scale = scale; + b->flags = flags; + b->overlap = overlap; + b->min_offset = min_offset; + b->max_offset = max_offset; + b->alpha = alpha; + b->beamshader = cgi.R_RegisterShader( beamshadername ); + b->numSubdivisions = numSubdivisions; + b->delay = delay; + b->life = life; + b->numspherebeams = numspherebeams; + b->sphereradius = sphereradius; + b->renderfx = renderfx; + + // take the alpha from the entity if less than 1, else grab it from the client commands version + if ( alpha < 1 ) + b->shaderRGBA[ 3 ] = alpha * 255; + else + b->shaderRGBA[ 3 ] = modulate[3]; + + // Modulation based off the color + for( i=0; i<3; i++ ) + b->shaderRGBA[ i ] = modulate[ i ] * ( (float)b->shaderRGBA[3] / 255.0f ); + + b->alphastep = ( (float)( endalpha - alpha ) / (float)b->numSubdivisions ); + + VectorCopy( start, b->start ); + VectorCopy( end, b->end ); + return; + } + } + } + } + + // find a free beam + for ( i=0, b=cl_beams ; i< MAX_BEAMS ; i++, b++ ) + { + if ( b->endtime < cg.time ) + { + b->entity = owner; + b->endtime = cg.time + life; + b->hModel = hModel; + b->alpha = alpha; + b->scale = scale; + b->flags = flags; + b->overlap = overlap; + b->min_offset = min_offset; + b->max_offset = max_offset; + b->beamshader = cgi.R_RegisterShader( beamshadername ); + b->numSubdivisions = numSubdivisions; + b->delay = delay; + b->update_time = 0;//cg.time + delay; + b->life = life; + b->numspherebeams = numspherebeams; + b->sphereradius = sphereradius; + b->active = true; + b->toggledelay = toggledelay; + b->renderfx = renderfx; + b->name = name; + + // take the alpha from the entity if less than 1, else grab it from the client commands version + if ( alpha < 1 ) + b->shaderRGBA[ 3 ] = alpha * 255; + else + b->shaderRGBA[ 3 ] = modulate[ 3 ]; + + // Modulation based off the color + for( i=0; i<3; i++ ) + b->shaderRGBA[ i ] = modulate[ i ] * ( (float)b->shaderRGBA[3] / 255.0f ); + + + b->alphastep = ( (float)( endalpha - alpha ) / (float)b->numSubdivisions ); + + VectorCopy( start, b->start ); + VectorCopy( end, b->end ); + return; + } + } + return; + } + +void CG_KillBeams + ( + int entity_number + ) + + { + int i; + beam_t *b; + + for ( i=0, b=cl_beams ; i< MAX_BEAMS ; i++, b++ ) + { + if ( b->entity == entity_number ) + { + b->entity = ENTITYNUM_NONE; + b->endtime = 0; + } + } + } + +void CG_RestartBeams + ( + int timedelta + ) + + { + int i; + beam_t *b; + + for ( i=0, b=cl_beams ; i< MAX_BEAMS ; i++, b++ ) + { + if ( b->active && ( b->update_time > cg.time ) ) + { + b->endtime -= timedelta; + b->update_time -= timedelta; + if ( b->toggletime ) + b->toggletime -= timedelta; + } + } + } + + +void CG_Rope + ( + centity_t *cent + ) + + { + Vector prevpt,currpt; + entityState_t *s1; + Vector top, mid, bottom, up, v1, v2; + Vector currpt1, currpt2, prevpt1, prevpt2; + const char *beamshadername; + int beamshader; + byte modulate[4]; + float picH, length, endT; + int i,j; + polyVert_t points[4]; + + + s1 = ¢->currentState; + + top = s1->origin2; + mid = cent->lerpOrigin; + bottom = cent->lerpOrigin; + bottom.z -= s1->alpha; + + // This is the top of the beam ent list, build up a renderer beam based on all the children + beamshadername = CG_ConfigString( CS_IMAGES + s1->surfaces[0] ); // index for shader configstring + beamshader = cgi.R_RegisterShader( beamshadername ); + + picH = cgi.R_GetShaderHeight( beamshader ); + + for ( i=0;i<4;i++ ) + modulate[i] = cent->color[i] * 255; + + // Generate the up vector + v1 = top - cg.refdef.vieworg; + v2 = bottom - cg.refdef.vieworg; + + up.CrossProduct( v1, v2 ); + up.normalize(); + + // Set the color of the verts + for ( i=0; i<4; i++ ) + { + for ( j=0; j<4; j++ ) + { + points[i].modulate[j] = modulate[j]; + } + } + // set the s coordinates + points[0].st[0] = 1; + points[1].st[0] = 1; + points[2].st[0] = 0; + points[3].st[0] = 0; + + // Calculate the first points + prevpt1 = top + ( up * s1->scale ); + prevpt2 = top + ( up * -s1->scale ); + + // draw the top section + currpt1 = mid + ( up * s1->scale ); + currpt2 = mid + ( up * -s1->scale ); + + length = Vector( mid - top ).length(); + + VectorCopy( currpt1, points[0].xyz ); + VectorCopy( prevpt1, points[1].xyz ); + VectorCopy( prevpt2, points[2].xyz ); + VectorCopy( currpt2, points[3].xyz ); + + endT = length / picH; + points[0].st[1] = endT; + points[3].st[1] = endT; + points[1].st[1] = 0; + points[2].st[1] = 0; + + // Add a segment to the list + cgi.R_AddPolyToScene( beamshader, 4, points, s1->renderfx ); + + if ( s1->alpha > 0 ) + { + // draw the bottom section + prevpt1 = currpt1; + prevpt2 = currpt2; + currpt1 = bottom + ( up * s1->scale ); + currpt2 = bottom + ( up * -s1->scale ); + VectorCopy( currpt1, points[0].xyz ); + VectorCopy( prevpt1, points[1].xyz ); + VectorCopy( prevpt2, points[2].xyz ); + VectorCopy( currpt2, points[3].xyz ); + + // add on the rest of the rope + length += s1->alpha; + + // use previous T value for the start of this segment + points[1].st[1] = endT; + points[2].st[1] = endT; + endT = length / picH; + points[0].st[1] = endT; + points[3].st[1] = endT; + + // Add a segment to the list + cgi.R_AddPolyToScene( beamshader, 4, points, s1->renderfx ); + } + } diff --git a/source/source/cgame/cg_class.cpp b/source/source/cgame/cg_class.cpp new file mode 100644 index 0000000..3938f0c --- /dev/null +++ b/source/source/cgame/cg_class.cpp @@ -0,0 +1,581 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/cgame/cg_class.cpp $ +// $Revision:: 2 $ +// $Author:: Aldie $ +// $Date:: 9/10/99 5:24p $ +// +// Copyright (C) 1997 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/cgame/cg_class.cpp $ +// +// 2 9/10/99 5:24p Aldie +// Merge code +// +// 1 9/10/99 10:48a Jimdose +// +// 2 9/09/99 3:29p Aldie +// Merge +// +// 1 9/08/99 3:35p Aldie +// +// 3 7/29/99 3:32p Aldie +// Updated to new class system +// +// DESCRIPTION: +// Base class that all classes that are used in conjunction with Sin should +// be based off of. Class gives run-time type information about any class +// derived from it. This is really handy when you have a pointer to an object +// that you need to know if it supports certain behaviour. +// + +#include +#include +#include +#include "cg_class.h" +#include "cg_listener.h" +#include "../fgame/linklist.h" +#include "../qcommon/qcommon.h" +#include "cg_local.h" + +int totalmemallocated = 0; +int numclassesallocated = 0; + +static ClassDef *classlist = NULL; + +ClassDef::ClassDef() + { + this->classname = NULL; + this->classID = NULL; + this->superclass = NULL; + this->responses = NULL, + this->numEvents = 0; + this->responseLookup = NULL; + this->newInstance = NULL; + this->classSize = 0; + this->super = NULL; + this->prev = this; + this->next = this; + } + +ClassDef::ClassDef + ( + const char *classname, + const char *classID, + const char *superclass, + ResponseDef *responses, + void *( *newInstance )( void ), + int classSize + ) + + { + ClassDef *node; + + if ( classlist == NULL ) + { + classlist = new ClassDef; + } + + this->classname = classname; + this->classID = classID; + this->superclass = superclass; + this->responses = responses; + this->numEvents = 0; + this->responseLookup = NULL; + this->newInstance = newInstance; + this->classSize = classSize; + this->super = getClass( superclass ); + + // It's not uncommon for classes to not have a class id, so just set it + // to an empty string so that we're not checking for it all the time. + if ( !classID ) + { + this->classID = ""; + } + + // Check if any subclasses were initialized before their superclass + for( node = classlist->next; node != classlist; node = node->next ) + { + if ( ( node->super == NULL ) && ( !Q_stricmp( node->superclass, this->classname ) ) && + ( Q_stricmp( node->classname, "Class" ) ) ) + { + node->super = this; + } + } + + // Add to front of list + LL_Add( classlist, this, prev, next ); + } + +ClassDef::~ClassDef() + { + ClassDef *node; + + if ( classlist != this ) + { + LL_Remove( this, prev, next ); + + // Check if any subclasses were initialized before their superclass + for( node = classlist->next; node != classlist; node = node->next ) + { + if ( node->super == this ) + { + node->super = NULL; + } + } + } + else + { + // If the head of the list is deleted before the list is cleared, then we may have problems + assert( this->next == this->prev ); + } + + if ( responseLookup ) + { + delete[] responseLookup; + responseLookup = NULL; + } + } + +void ClassDef::BuildResponseList + ( + void + ) + + { + ClassDef *c; + ResponseDef *r; + int ev; + int i; + qboolean *set; + int num; + + if ( responseLookup ) + { + delete[] responseLookup; + responseLookup = NULL; + } + + num = Event::NumEventCommands(); + responseLookup = ( Response ** )new char[ sizeof( Response * ) * num ]; + memset( responseLookup, 0, sizeof( Response * ) * num ); + + set = new qboolean[ num ]; + memset( set, 0, sizeof( qboolean ) * num ); + + this->numEvents = num; + + for( c = this; c != NULL; c = c->super ) + { + r = c->responses; + if ( r ) + { + for( i = 0; r[ i ].event != NULL; i++ ) + { + ev = ( int )*r[ i ].event; + if ( !set[ ev ] ) + { + set[ ev ] = qtrue; + if ( r[ i ].response ) + { + responseLookup[ ev ] = &r[ i ].response; + } + else + { + responseLookup[ ev ] = NULL; + } + } + } + } + } + + delete[] set; + } + +void BuildEventResponses + ( + void + ) + + { + ClassDef *c; + int amount; + int numclasses; + + amount = 0; + numclasses = 0; + for( c = classlist->next; c != classlist; c = c->next ) + { + c->BuildResponseList(); + + amount += c->numEvents * sizeof( Response * ); + numclasses++; + } + + cgi.Printf( "\n------------------\nEvent system initialized:\n" + "%d classes\n%d events\n%d total memory in response list\n\n", + numclasses, Event::NumEventCommands(), amount ); + } + +ClassDef *getClassForID + ( + const char *name + ) + + { + ClassDef *c; + + for( c = classlist->next; c != classlist; c = c->next ) + { + if ( c->classID && !Q_stricmp( c->classID, name ) ) + { + return c; + } + } + + return NULL; + } + +ClassDef *getClass + ( + const char *name + ) + + { + ClassDef *c; + + for( c = classlist->next; c != classlist; c = c->next ) + { + if ( !Q_stricmp( c->classname, name ) ) + { + return c; + } + } + + return NULL; + } + +ClassDef *getClassList + ( + void + ) + + { + return classlist; + } + +void listAllClasses + ( + void + ) + + { + ClassDef *c; + + for( c = classlist->next; c != classlist; c = c->next ) + { + cgi.Printf( "%s\n", c->classname ); + } + } + +void listInheritanceOrder + ( + const char *classname + ) + + { + ClassDef *cls; + ClassDef *c; + + cls = getClass( classname ); + if ( !cls ) + { + cgi.Printf( "Unknown class: %s\n", classname ); + return; + } + for( c = cls; c != NULL; c = c->super ) + { + cgi.Printf( "%s\n", c->classname ); + } + } + +qboolean checkInheritance + ( + ClassDef *superclass, + ClassDef *subclass + ) + + { + ClassDef *c; + + for( c = subclass; c != NULL; c = c->super ) + { + if ( c == superclass ) + { + return qtrue; + } + } + return qfalse; + } + +qboolean checkInheritance + ( + ClassDef *superclass, + const char *subclass + ) + + { + ClassDef *c; + + c = getClass( subclass ); + if ( c == NULL ) + { + cgi.Printf( "Unknown class: %s\n", subclass ); + return qfalse; + } + return checkInheritance( superclass, c ); + } + +qboolean checkInheritance + ( + const char *superclass, + const char *subclass + ) + + { + ClassDef *c1; + ClassDef *c2; + + c1 = getClass( superclass ); + c2 = getClass( subclass ); + if ( c1 == NULL ) + { + cgi.Printf( "Unknown class: %s\n", superclass ); + return qfalse; + } + if ( c2 == NULL ) + { + cgi.Printf( "Unknown class: %s\n", subclass ); + return qfalse; + } + return checkInheritance( c1, c2 ); + } + +CLASS_DECLARATION( NULL, Class, NULL ) + { + { NULL, NULL } + }; + +#ifdef NDEBUG + +void * Class::operator new( size_t s ) + { + int *p; + + s += sizeof( int ); + p = ( int * )::new char[ s ]; + *p = s; + totalmemallocated += s; + numclassesallocated++; + return p + 1; + } + +void Class::operator delete( void *ptr ) + { + int *p; + + p = ( ( int * )ptr ) - 1; + totalmemallocated -= *p; + numclassesallocated--; + ::delete[]( p ); + } + +#else + +void * Class::operator new( size_t s ) + { + int *p; + + s += sizeof( int ) * 3; + p = ( int * )::new char[ s ]; + p[ 0 ] = 0x12348765; + *( int * )( ((byte *)p) + s - sizeof( int ) ) = 0x56784321; + p[ 1 ] = s; + totalmemallocated += s; + numclassesallocated++; + return p + 2; + } + +void Class::operator delete( void *ptr ) + { + int *p; + + p = ( ( int * )ptr ) - 2; + + assert( p[ 0 ] == 0x12348765 ); + assert( *( int * )( ((byte *)p) + p[ 1 ] - sizeof( int ) ) == 0x56784321 ); + + totalmemallocated -= p[ 1 ]; + numclassesallocated--; + ::delete[]( p ); + } + +#endif + +void DisplayMemoryUsage + ( + void + ) + + { + cgi.Printf( "Classes %-5d Class memory used: %d\n", numclassesallocated, totalmemallocated ); + } + +Class::Class() + { + SafePtrList = NULL; + } + +Class::~Class() + { + while( SafePtrList != NULL ) + { + SafePtrList->Clear(); + } + } + +void Class::warning + ( + const char *function, + const char *fmt, + ... + ) + + { + va_list argptr; + char text[ 1024 ]; + + va_start( argptr, fmt ); + vsprintf( text, fmt, argptr ); + va_end( argptr ); + + if ( getClassID() ) + { + cgi.Printf( "%s::%s : %s\n", getClassID(), function, text ); + } + else + { + cgi.Printf( "%s::%s : %s\n", getClassname(), function, text ); + } + } + +void Class::error + ( + const char *function, + const char *fmt, + ... + ) + + { + va_list argptr; + char text[ 1024 ]; + + va_start( argptr, fmt ); + vsprintf( text, fmt, argptr ); + va_end( argptr ); + + if ( getClassID() ) + { + cgi.Error( ERR_DROP, "%s::%s : %s\n", getClassID(), function, text ); + } + else + { + cgi.Error( ERR_DROP, "%s::%s : %s\n", getClassname(), function, text ); + } + } + +qboolean Class::inheritsFrom + ( + const char *name + ) + + { + ClassDef *c; + + c = getClass( name ); + if ( c == NULL ) + { + cgi.Printf( "Unknown class: %s\n", name ); + return qfalse; + } + return checkInheritance( c, classinfo() ); + } + +qboolean Class::isInheritedBy + ( + const char *name + ) + + { + ClassDef *c; + + c = getClass( name ); + if ( c == NULL ) + { + cgi.Printf( "Unknown class: %s\n", name ); + return qfalse; + } + return checkInheritance( classinfo(), c ); + } + +const char *Class::getClassname + ( + void + ) + + { + ClassDef *cls; + + cls = classinfo(); + return cls->classname; + } + +const char *Class::getClassID + ( + void + ) + + { + ClassDef *cls; + + cls = classinfo(); + return cls->classID; + } + +const char *Class::getSuperclass + ( + void + ) + + { + ClassDef *cls; + + cls = classinfo(); + return cls->superclass; + } + +void *Class::newInstance + ( + void + ) + + { + ClassDef *cls; + + cls = classinfo(); + return cls->newInstance(); + } diff --git a/source/source/cgame/cg_class.h b/source/source/cgame/cg_class.h new file mode 100644 index 0000000..cd10fb7 --- /dev/null +++ b/source/source/cgame/cg_class.h @@ -0,0 +1,402 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/cgame/cg_class.h $ +// $Revision:: 1 $ +// $Author:: Jimdose $ +// $Date:: 9/10/99 10:48a $ +// +// Copyright (C) 1997 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/cgame/cg_class.h $ +// +// 1 9/10/99 10:48a Jimdose +// +// 1 9/08/99 3:35p Aldie +// +// 2 7/29/99 3:32p Aldie +// Updated to new class system +// +// DESCRIPTION: +// Base class that all classes that are used in conjunction with Sin should +// be based off of. Class gives run-time type information about any class +// derived from it. This is really handy when you have a pointer to an object +// that you need to know if it supports certain behaviour. +// + +#ifndef __CG_CLASS_H__ +#define __CG_CLASS_H__ + +#include "../fgame/q_shared.h" +#include "../fgame/linklist.h" + +class Class; +class Event; + +typedef void ( Class::*Response )( Event *event ); + +template< class Type > +struct ResponseDef + { + Event *event; + void ( Type::*response )( Event *event ); + }; + +/*********************************************************************** + + ClassDef + +***********************************************************************/ + +class ClassDef + { + public: + const char *classname; + const char *classID; + const char *superclass; + void *( *newInstance )( void ); + int classSize; + ResponseDef *responses; + int numEvents; + Response **responseLookup; + ClassDef *super; + ClassDef *next; + ClassDef *prev; + + ClassDef(); + ~ClassDef(); + ClassDef( const char *classname, const char *classID, const char *superclass, + ResponseDef *responses, void *( *newInstance )( void ), int classSize ); + void BuildResponseList( void ); + }; + +/*********************************************************************** + + SafePtr + +***********************************************************************/ + +class SafePtrBase; + +class Class; + +class SafePtrBase + { + private: + void AddReference( Class *ptr ); + void RemoveReference( Class *ptr ); + + protected: + SafePtrBase *prevSafePtr; + SafePtrBase *nextSafePtr; + Class *ptr; + + public: + SafePtrBase(); + virtual ~SafePtrBase(); + void InitSafePtr( Class *newptr ); + void Clear( void ); + }; + +/*********************************************************************** + + Class + +***********************************************************************/ + +#define CLASS_DECLARATION( nameofsuperclass, nameofclass, classid ) \ + ClassDef nameofclass::ClassInfo \ + ( \ + #nameofclass, classid, #nameofsuperclass, \ + ( ResponseDef * )nameofclass::Responses, \ + nameofclass::_newInstance, sizeof( nameofclass ) \ + ); \ + void *nameofclass::_newInstance( void ) \ + { \ + return new nameofclass; \ + } \ + ClassDef *nameofclass::classinfo( void ) \ + { \ + return &( nameofclass::ClassInfo ); \ + } \ + ResponseDef nameofclass::Responses[] = + + +#define CLASS_PROTOTYPE( nameofclass ) \ + public: \ + static ClassDef ClassInfo; \ + static void *nameofclass::_newInstance( void ); \ + virtual ClassDef *nameofclass::classinfo( void ); \ + static ResponseDef nameofclass::Responses[]; + +class Class + { + private: + SafePtrBase *SafePtrList; + friend class SafePtrBase; + + public: + CLASS_PROTOTYPE( Class ); + void * operator new( size_t ); + void operator delete( void * ); + + Class(); + virtual ~Class(); + void warning( const char *function, const char *fmt, ... ); + void error( const char *function, const char *fmt, ... ); + qboolean inheritsFrom( ClassDef *c ); + qboolean inheritsFrom( const char *name ); + qboolean isInheritedBy( const char *name ); + qboolean isInheritedBy( ClassDef *c ); + const char *getClassname( void ); + const char *getClassID( void ); + const char *getSuperclass( void ); + void *newInstance( void ); + }; + +void BuildEventResponses( void ); +ClassDef *getClassForID( const char *name ); +ClassDef *getClass( const char *name ); +ClassDef *getClassList( void ); +void listAllClasses( void ); +void listInheritanceOrder( const char *classname ); +qboolean checkInheritance( ClassDef *superclass, ClassDef *subclass ); +qboolean checkInheritance( ClassDef *superclass, const char *subclass ); +qboolean checkInheritance( const char *superclass, const char *subclass ); +void DisplayMemoryUsage( void ); + +inline qboolean Class::inheritsFrom + ( + ClassDef *c + ) + + { + return checkInheritance( c, classinfo() ); + } + +inline qboolean Class::isInheritedBy + ( + ClassDef *c + ) + + { + return checkInheritance( classinfo(), c ); + } + +// The lack of a space between the ")" and "inheritsFrom" is intentional. +// It allows the macro to compile like a function call. However, this +// may cause problems in some compilers (like gcc), so we may have to +// change this to work like a normal macro with the object passed in +// as a parameter to the macro. +#define isSubclassOf( classname )inheritsFrom( &classname::ClassInfo ) +#define isSuperclassOf( classname )isInheritedBy( &classname::ClassInfo ) + +/*********************************************************************** + + SafePtr + +***********************************************************************/ + +inline SafePtrBase::SafePtrBase() + { + prevSafePtr = NULL; + nextSafePtr = NULL; + ptr = NULL; + } + +inline SafePtrBase::~SafePtrBase() + { + Clear(); + } + +inline void SafePtrBase::Clear + ( + void + ) + + { + if ( ptr ) + { + RemoveReference( ptr ); + ptr = NULL; + } + } + +inline void SafePtrBase::InitSafePtr + ( + Class *newptr + ) + + { + if ( ptr != newptr ) + { + if ( ptr ) + { + RemoveReference( ptr ); + } + + ptr = newptr; + if ( ptr == NULL ) + { + return; + } + + AddReference( ptr ); + } + } + +inline void SafePtrBase::AddReference + ( + Class *ptr + ) + + { + if ( !ptr->SafePtrList ) + { + ptr->SafePtrList = this; + LL_Reset( this, nextSafePtr, prevSafePtr ); + } + else + { + LL_Add( ptr->SafePtrList, this, nextSafePtr, prevSafePtr ); + } + } + +inline void SafePtrBase::RemoveReference + ( + Class *ptr + ) + + { + if ( ptr->SafePtrList == this ) + { + if ( ptr->SafePtrList->nextSafePtr == this ) + { + ptr->SafePtrList = NULL; + } + else + { + ptr->SafePtrList = nextSafePtr; + LL_Remove( this, nextSafePtr, prevSafePtr ); + } + } + else + { + LL_Remove( this, nextSafePtr, prevSafePtr ); + } + } + +template +class SafePtr : public SafePtrBase + { + public: + SafePtr( T* objptr = 0 ); + SafePtr( const SafePtr& obj ); + + SafePtr& operator=( const SafePtr& obj ); + SafePtr& operator=( T * const obj ); + + friend int operator==( SafePtr a, T *b ); + friend int operator!=( SafePtr a, T *b ); + friend int operator==( T *a, SafePtr b ); + friend int operator!=( T *a, SafePtr b ); + + operator T*() const; + T* operator->() const; + T& operator*() const; + }; + +template +inline SafePtr::SafePtr( T* objptr ) + { + InitSafePtr( objptr ); + } + +template +inline SafePtr::SafePtr( const SafePtr& obj ) + { + InitSafePtr( obj.ptr ); + } + +template +inline SafePtr& SafePtr::operator=( const SafePtr& obj ) + { + InitSafePtr( obj.ptr ); + return *this; + } + +template +inline SafePtr& SafePtr::operator=( T * const obj ) + { + InitSafePtr( obj ); + return *this; + } + +template +inline int operator== + ( + SafePtr a, + T* b + ) + + { + return a.ptr == b; + } + +template +inline int operator!= + ( + SafePtr a, + T* b + ) + + { + return a.ptr != b; + } + +template +inline int operator== + ( + T* a, + SafePtr b + ) + + { + return a == b.ptr; + } + +template +inline int operator!= + ( + T* a, + SafePtr b + ) + + { + return a != b.ptr; + } + +template +inline SafePtr::operator T*() const + { + return ( T * )ptr; + } + +template +inline T* SafePtr::operator->() const + { + return ( T * )ptr; + } + +template +inline T& SafePtr::operator*() const + { + return *( T * )ptr; + } + +typedef SafePtr ClassPtr; + +#endif /* class.h */ \ No newline at end of file diff --git a/source/source/cgame/cg_commands.cpp b/source/source/cgame/cg_commands.cpp new file mode 100644 index 0000000..f378384 --- /dev/null +++ b/source/source/cgame/cg_commands.cpp @@ -0,0 +1,6942 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/cgame/cg_commands.cpp $ +// $Revision:: 202 $ +// $Author:: Aldie $ +// $Date:: 8/10/00 9:26p $ +// +// Copyright (C) 1999 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/cgame/cg_commands.cpp $ +// +// 202 8/10/00 9:26p Aldie +// Fixed a lot of memory leaks on exit +// +// 201 8/10/00 4:00p Steven +// Fixed some case sensitive stuff in CacheResource. +// +// 200 7/31/00 1:30a Markd +// fixed invalid tiki handle check on temp entities +// +// 199 7/29/00 9:04p Aldie +// Added originbeamemitter +// +// 198 7/28/00 9:16p Aldie +// Changed align for parentlink +// +// 197 7/26/00 6:19p Aldie +// Added a comment +// +// 196 7/26/00 3:49p Aldie +// Fix for swipes yet again. +// +// 195 7/24/00 3:07p Aldie +// Fix for cg_effectdetail for emitters +// +// 194 7/24/00 11:52a Aldie +// Added cg_effectdetail for reducing number of effects +// +// 193 7/23/00 1:36p Aldie +// Removed time adjustment print +// +// 192 7/22/00 5:50p Markd +// added flushtikis support +// +// 191 7/22/00 5:38p Aldie +// Fix for weird cg.time values coming in +// +// 190 7/21/00 2:03p Markd +// changed detail to be on by default, not off +// +// 189 7/20/00 3:48p Aldie +// Fix for anims on tempmodels +// +// 188 7/19/00 9:52p Aldie +// Put ET_EVENTS back in. They will get sent over once, and should get +// processed once on the client. +// +// 187 7/17/00 3:26p Aldie +// Added detail command +// +// 186 7/16/00 7:08p Aldie +// Removed some unused debugging code +// +// 185 7/16/00 2:09p Aldie +// Took out some prints +// +// 184 7/16/00 11:11a Aldie +// Added some beam stuff and fixed a bug with swipes (yet again) +// +// 183 7/15/00 12:32p Aldie +// Fixed a bug for restarting tempmodels on a save game +// +// 182 7/11/00 8:17p Aldie +// Fixed emitter bug (what else), where I was accidentally removing numbers +// from the global pool when a tempent was being removed. +// +// 181 7/08/00 3:21p Aldie +// Removed some duplicate code +// +// 180 7/07/00 2:58p Markd +// fixed alias bug +// +// 179 6/27/00 7:16p Aldie +// Fixed it so beam emitters use alpha from entity +// +// 178 6/26/00 7:14p Markd +// added parentangles command +// +// 177 6/26/00 5:50p Markd +// re-did some renderfx commands, fixed anti-sb juice stuff +// +// 176 6/23/00 8:00p Aldie +// Fixed some problems with newEnt. Ugh. spawned entities in the sky were not +// inheriting renderfx. newEnt now has the right renderfx when animating so we +// get the right inheritance to tempmodels +// +// 175 6/22/00 3:13p Aldie +// Some tweaks to scaleupdown and scalemin,scalemax +// +// 174 6/21/00 6:03p Markd +// put in better bullet proofing when tiki_commands are invalid +// +// 173 6/20/00 8:04p Aldie +// Fix for axis with tempmodels +// +// 172 6/17/00 1:54p Markd +// Added server restarted code +// +// 171 6/15/00 8:21p Markd +// Added CleanupCommandManager support +// +// 170 6/15/00 7:44p Aldie +// Fix for axis on endtagtraceimpactspawn +// +// 169 6/15/00 6:54p Steven +// Fixed a looping sound issue. +// +// 168 6/14/00 8:12p Aldie +// Fix for parallel and offset along axis +// +// 167 6/14/00 12:14p Markd +// more intel compiler bug fixes +// +// 166 6/13/00 6:45p Aldie +// Added some more optimizations +// +// 165 6/13/00 1:46p Aldie +// Fixed some initialization stuff +// +// 164 6/13/00 10:57a Steven +// Moved splash stuff to cg_specialfx.cpp. +// +// 163 6/10/00 6:43p Aldie +// Fixed shadertime bug +// +// 162 6/10/00 5:52p Aldie +// Made some improvements to help speed, added tag_axis, removed notagangles +// command. Removed some unused code. Changed the method of adding +// tempmodels. +// +// 161 6/09/00 7:53p Aldie +// Added origin to playsound and fixed bouncesound and a couple other sound +// things +// +// 160 6/08/00 6:26p Aldie +// Fixed some crashbugs +// +// 159 6/07/00 9:53a Steven +// Made player splashes go twice as slow when the player is not moving. +// +// 158 6/06/00 1:59p Aldie +// Added fadein to marks +// +// 157 6/05/00 3:10p Markd +// Added has_commands check to client side command processing +// +// 156 6/05/00 3:06p Steven +// Made sure in PlaySound that current_tiki was set before trying to find a +// local alias. +// +// 155 6/04/00 6:03p Markd +// Added precise shadow support +// +// 154 6/03/00 8:19p Markd +// Added footstep code +// +// 153 6/03/00 2:07p Aldie +// Fix for HARDLINK when doing a tag emitter +// +// 152 6/03/00 10:55a Markd +// Sped up tracing and debug print messages +// +// 151 6/02/00 7:04p Aldie +// Moved the parallel check +// +// 150 6/02/00 6:52p Aldie +// Added in parallel command +// +// 149 6/01/00 7:45p Aldie +// Made it so that swipes are removed when client entities are reset. +// +// 148 6/01/00 12:20p Steven +// Improvement to splashes. +// +// 147 5/30/00 2:46p Aldie +// Fix for beam parents +// +// 146 5/25/00 5:58p Aldie +// Fix for client tempmodel animations +// +// 145 5/24/00 6:05p Markd +// fixed bug where MAX_MAP_BOUNDS was being used instead of MAP_SIZE +// +// 144 5/23/00 6:53p Aldie +// Removed scale from angles +// +// 143 5/22/00 8:02p Markd +// changed behavior of cg_debuganimwatch +// +// 142 5/22/00 6:37p Aldie +// Added originbeamspawn and fixed a velocity bug with the new tempmodels +// +// 141 5/20/00 4:42p Aldie +// Removed some unused flags and code. Fixed emitters that have parentlink or +// hardlink +// +// 140 5/20/00 11:33a Aldie +// Fix for fading on impact marks +// +// 139 5/18/00 3:32p Aldie +// Added bouncedecal +// +// 138 5/18/00 11:47a Aldie +// Added tempmodelsRealtimeEffects proc +// +// 137 5/16/00 6:24p Markd +// added cg_traceinfo support +// +// 136 5/16/00 3:40p Aldie +// Changed method of calculating physicsTime. And added physicsrate command +// +// 135 5/15/00 2:19p Aldie +// Added new tempmodel system and added player accumulated pain +// +// 133 5/09/00 1:29p Aldie +// Added lightstyles to impact marks +// +// 132 5/08/00 6:12p Markd +// Added lightstyle support for the client +// +// 131 5/06/00 5:21p Aldie +// Changed to for "dlight" command +// +// 130 5/05/00 4:30p Aldie +// Fix docs for twinkle +// +// 129 5/05/00 1:07p Aldie +// Fix for hardlink +// +// 128 5/04/00 8:38p Aldie +// Made beam emitters work better +// +// 127 5/04/00 7:45p Aldie +// Fix for hardlink +// +// 126 5/04/00 7:19p Aldie +// Added notagangles command +// +// 125 5/04/00 4:34p Aldie +// Added trail command that uses swipe code to do a trail +// +// 124 5/03/00 6:03p Aldie +// Fix for origin on physics tempmodels +// +// 123 5/02/00 7:29p Aldie +// Fix for command delay +// +// 122 5/01/00 2:42p Steven +// Improved client side caching a little bit and fixed client side aliases. +// +// 121 4/27/00 7:42p Aldie +// Added trace_count functionality for multiple spawns for tagtraceimpactmark +// and spawn +// +// 120 4/27/00 4:00p Aldie +// Removed an unused piece of code. +// +// 119 4/26/00 9:05p Markd +// Added client and cgame class commands +// +// 118 4/26/00 7:05p Aldie +// Fixed alpha bug yet again +// +// 117 4/26/00 3:07p Aldie +// Fix crashbug in swarm code +// +// 116 4/19/00 6:06p Aldie +// Fix alpha bug +// +// 115 4/19/00 5:43p Aldie +// Fix for duplicate alpha multiply +// +// 114 4/14/00 6:29p Aldie +// Removed a printf +// +// 113 4/14/00 5:54p Aldie +// Put back in fadedelay. Somewhere it accidentally got removed. +// +// 112 4/10/00 6:10p Steven +// Made it so if the render flag RF_DONT_PROCESS_COMMANDS is set that the +// client doesn't process any of this entities commands. +// +// 111 4/08/00 3:43p Aldie +// Added scale to velocity for spawntempmodels +// +// 110 4/06/00 12:12p Aldie +// Fix for CG_Emitter to use angles from the entity +// +// 109 3/31/00 4:55p Steven +// Added UseLastTraceEnd so that tracecommands could use the end point of the +// previous command. +// +// 108 3/30/00 4:22p Aldie +// Added scale to dlights and beams +// +// 107 3/28/00 5:24p Aldie +// Changed CG_Trace funcs +// +// 106 3/28/00 11:43a Aldie +// Fix scaleupdown +// +// 105 3/27/00 6:50p Aldie +// Added resolution changing for menus +// +// 104 3/27/00 1:50p Aldie +// Removed some unused code +// +// 103 3/23/00 11:09a Aldie +// Fixed a bug with the new flag changes +// +// 102 3/21/00 4:32p Aldie +// Fixed a bug with missing dlight flag +// +// 101 3/16/00 6:51p Aldie +// Added some shortcut flags for tempmodel optimization +// +// 100 3/16/00 5:09p Aldie +// Added some optimizations for tempmodels +// +// 99 3/15/00 11:01a Aldie +// Changed m_emitters to container instead of array. +// +// 98 3/14/00 3:22p Aldie +// Changed some client side emitter functionality and added func_emitter +// +// 97 3/13/00 12:24p Aldie +// Fixed some rain problems and added some functionality +// +// 96 3/13/00 10:51a Aldie +// Removed a printf +// +// 95 3/11/00 4:47p Aldie +// Fix for scaleupdown +// +// 94 3/11/00 4:06p Aldie +// Added scaleupdown code +// +// 93 3/06/00 8:07p Markd +// cleaned up unused cvar's +// +// 92 3/04/00 6:03p Aldie +// Made commandManager static +// +// 91 3/04/00 3:52p Aldie +// Fixed typo +// +// 90 3/04/00 3:51p Aldie +// Added more types for dynamic lights +// +// 89 3/04/00 2:53p Markd +// Fixed dynamic light types +// +// 88 3/04/00 2:33p Aldie +// Added lightstyle support +// +// 87 3/03/00 2:40p Aldie +// Added in tagtraceimpactsound command +// +// 86 3/01/00 5:55p Aldie +// Added alignonce flag for aligning models one time, but not every frame. Use +// if you have avelocity on a tempmodel +// +// 85 3/01/00 1:45p Aldie +// Added some more beam functionality for beau. Added taglist to do beam +// chains. +// +// 84 2/29/00 12:21p Aldie +// Added taglist to beam emitters. Allows for a list of tags to be named for a +// chain of beams +// +// 83 2/25/00 5:01p Aldie +// Changed some of the dlight stuff and added a new command +// +// 82 2/22/00 6:54p Aldie +// Added a bool to tempmodels so that they will get added at least one time to +// the ref. This is useful for getting things to show up in low framerate +// situations. +// +// 81 2/20/00 5:40p Aldie +// Fixed the twinkle command +// +// 80 2/16/00 6:55p Markd +// Added more debugging information +// +// 79 2/10/00 5:45p Aldie +// added tagtraceimpactspawn +// +// 78 2/09/00 5:38p Aldie +// removed printf +// +// 77 2/09/00 4:27p Aldie +// Fixed pause on the client emitters +// +// 76 2/07/00 4:30p Markd +// got rid of unused comments +// +// 75 2/07/00 2:47p Markd +// Added entry support to client command processor +// +// 74 2/04/00 10:50a Aldie +// Fixed beam trace +// +// 73 2/01/00 7:08p Aldie +// Added renderfx inheritance to beams +// +// 72 1/29/00 6:17p Aldie +// Added TIKI_NameForNum +// +// 71 1/29/00 10:16a Steven +// Added stop sound support in cgame. +// +// 70 1/28/00 7:16p Aldie +// Added more features to the impact decal code +// +// 69 1/27/00 4:19p Aldie +// Added a quick tagtraceimpactmark +// +// 68 1/27/00 3:20p Aldie +// Added twinkle and fixed a bug with the beams +// +// 67 1/26/00 3:34p Markd +// Added Renderfx mask for inherited entities +// +// 66 1/26/00 11:35a Aldie +// New data structures for emitters +// +// 65 1/24/00 6:19p Aldie +// Added some new commands - commanddelay and randomchance +// +// 64 1/24/00 12:50p Aldie +// Added current_entity's scale to the origin offset calculation +// +// 63 1/24/00 12:03p Aldie +// Fixed another emitter bug with align flag +// +// 62 1/22/00 6:41p Aldie +// Typo fix +// +// 61 1/22/00 1:48p Aldie +// Removed .vec3 references, fixed bouncesound and added bouncesoundonce +// +// 60 1/22/00 10:37a Aldie +// Changed default life +// +// 59 1/21/00 7:52p Aldie +// Added randvelaxis for setting velocities along the axis of the entity +// +// 58 1/20/00 5:26p Aldie +// Fixed a warning +// +// 57 1/20/00 3:23p Aldie +// Fixed a dangling else and color init for the tempmodels +// +// 56 1/20/00 2:57p Jimdose +// got rid of angmod +// +// 55 1/20/00 11:03a Markd +// Added Bouncesound but then took it out temporarily +// +// 54 1/20/00 10:38a Markd +// fixed model orientation a bit. +// +// 53 1/19/00 8:34p Markd +// Fixed GetOrientation +// +// 52 1/19/00 3:18p Aldie +// Moved cg_updateentity +// +// 51 1/18/00 3:13p Aldie +// Fix for fadedelay +// +// 50 1/15/00 2:38p Aldie +// Added fadedelay and Cachedmodellist for init command processing +// +// 49 1/12/00 7:58p Aldie +// Fix for shaderTime +// +// 48 1/12/00 4:18p Markd +// Put in extra code in ProcessCommands for better range checking +// +// 47 1/12/00 3:17p Aldie +// Fixed beams so that there may be multiple beams on a model +// +// 46 1/12/00 11:25a Markd +// added numframes == 1 protection to frame processor +// +// 45 1/05/00 7:25p Jimdose +// made angle functions all use the same coordinate system +// AngleVectors now returns left instead of right +// no longer need to invert pitch +// +// 44 12/15/99 4:19p Markd +// Fixed performance counter stuff +// +// 43 12/09/99 10:52a Jimdose +// got tags working with torso and crossblended animations +// +// 42 12/01/99 11:26a Aldie +// Couple of fixes for emitters and more ammo stuff +// +// 41 11/01/99 4:11p Jimdose +// made tags work with bone controllers +// +// 40 10/22/99 6:47p Aldie +// Fix for beams in sky +// +// 39 10/22/99 4:56p Markd +// Fixed client command processing +// +// 38 10/22/99 11:34a Aldie +// Fix for alpha from entity +// +// 37 10/22/99 10:43a Markd +// Rewrote command processor +// +// 36 10/21/99 6:17p Aldie +// Fix for randvel +// +// 35 10/21/99 2:51p Aldie +// Added some more beam functions +// +// 34 10/19/99 7:52p Markd +// Removed three part model system +// +// 33 10/19/99 11:57a Aldie +// Added some more beam features +// +// 32 10/18/99 1:59p Aldie +// Lots of fixes for beams and stuff +// +// 31 10/14/99 7:19p Aldie +// Fix some beam stuff +// +// 30 10/14/99 11:07a Aldie +// Fixed parentlink in emitter +// +// 29 10/13/99 3:26p Aldie +// Various fixes for particles, beams and lensflares +// +// 28 10/11/99 3:47p Steven +// Event documentation cleanup. +// +// 27 10/11/99 3:38p Aldie +// Fix for some command doc stuff +// +// 26 10/09/99 5:26p Markd +// Added proper portal entity support +// +// 25 10/08/99 5:47p Aldie +// More beam stuff +// +// 24 10/08/99 5:07p Aldie +// More beam stuff and fix for UI_CenterPrint +// +// 23 10/07/99 7:14p Aldie +// more beam stuff (woohoo!) +// +// 22 10/07/99 3:08p Aldie +// more beam fun +// +// 21 10/06/99 6:54p Aldie +// Fixed some stuff with tempmodel using the animatonce command +// +// 20 10/06/99 3:23p Steven +// Added a dumpevents command. +// +// 19 10/06/99 3:11p Aldie +// Added more docs to commands +// +// 18 10/05/99 6:01p Aldie +// Added headers +// +// DESCRIPTION: +// Client side command events. These are in the .TIK files and +// are processed when the animation specifies it to. + +#include "cg_commands.h" + +Container cachedModelList; + +Vector vec_zero = "0 0 0"; + +refEntity_t *current_entity = NULL; +int current_entity_number = -1; +centity_t *current_centity = NULL; +float current_scale = -1; +int current_tiki = -1; +cvar_t *cg_showtempmodels; +cvar_t *cg_showemitters; +cvar_t *cg_physics_fps; +cvar_t *cg_detail; +cvar_t *cg_effectdetail; + +Vector last_trace_end; + +void CacheResource( const char * stuff ); + +ClientGameCommandManager commandManager; + +Event EV_Client_StartBlock + ( + "(", + EV_DEFAULT, + NULL, + NULL, + "Signals the beginning of a block of commands" + ); +Event EV_Client_EndBlock + ( + ")", + EV_DEFAULT, + NULL, + NULL, + "Signals the end of a block of commands" + ); +Event EV_Client_EmitterStartOff + ( + "startoff", + EV_DEFAULT, + NULL, + NULL, + "Signals an emitter to start in the off state (no tempmodels are emitted)" + ); +Event EV_Client_SetAlpha + ( + "alpha", + EV_DEFAULT, + "f", + "alpha", + "Set the alpha of the spawned tempmodel" + ); +Event EV_Client_SetDieTouch + ( + "dietouch", + EV_DEFAULT, + NULL, + NULL, + "Set the spawned tempmodels to die when they touch a solid" + ); +Event EV_Client_SetBounceFactor + ( + "bouncefactor", + EV_DEFAULT, + "f", + "factor", + "Set the bounciness of a tempmodel when it hits a solid.\n" + "A factor > 1 will make the model bounce higher and higher on each hit" + ); +Event EV_Client_SetBounceSound + ( + "bouncesound", + EV_DEFAULT, + "sF", + "sound [delay]", + "When bouncing, what sound to play on impact and an option delay (default is 1 second) between playing this sound" + ); +Event EV_Client_SetBounceSoundOnce + ( + "bouncesoundonce", + EV_DEFAULT, + "s", + "sound", + "When bouncing, what sound to play on impact one time" + ); +Event EV_Client_SetScale + ( + "scale", + EV_DEFAULT, + "f", + "scale", + "Set the scale of a spawned tempmodel" + ); +Event EV_Client_SetScaleUpDown + ( + "scaleupdown", + EV_DEFAULT, + NULL, + NULL, + "Set the tempmodel to scale up to scale value and then down." + ); +Event EV_Client_SetScaleMin + ( + "scalemin", + EV_DEFAULT, + "f", + "scalemin", + "Set the minimum scale of a spawned tempmodel" + ); +Event EV_Client_SetScaleMax + ( + "scalemax", + EV_DEFAULT, + "f", + "scalemax", + "Set the maximum scale of a spawned tempmodel" + ); +Event EV_Client_SetModel + ( + "model", + EV_DEFAULT, + "sSSSSS", + "modelname1 modelname2 modelname3 modelname4 modelname5 modelname6", + "Set the modelname of the tempmodel. If more than 1 model is specified, it will\n" + "be randomly chosen when spawned" + ); +Event EV_Client_SetLife + ( + "life", + EV_DEFAULT, + "f", + "life", + "Set the life (in seconds) of the spawned tempmodel" + ); +Event EV_Client_SetColor + ( + "color", + EV_DEFAULT, + "fffF", + "red green blue alpha", + "Set the color (modulate) of the spawned tempmodel." + ); +Event EV_Client_SetVelocity + ( + "velocity", + EV_DEFAULT, + "f", + "forwardVelocity", + "Set the forward velocity of the spawned tempmodel" + ); +Event EV_Client_SetAngularVelocity + ( + "avelocity", + EV_DEFAULT, + "fff", + "yawVel pitchVel rollVel", + "Set the angular velocity of the spawned tempmodel" + ); +Event EV_Client_SetRandomVelocity + ( + "randvel", + EV_DEFAULT, + "SFSFSF", + "[random|crandom] xVel [random|crandom] yVel [random|crandom] zVel", + "Add a random component to the regular velocity.\n" + "If random is specified, the component will range from 0 to specified velocity.\n" + "If crandom is specified, the component will range from -specified to +specified velocity.\n" + "If neither random or crandom is specified, then the component will just be added on\n" + "without randomness.\n" + "This velocity is applied using the world axis" + ); +Event EV_Client_SetRandomVelocityAlongAxis + ( + "randvelaxis", + EV_DEFAULT, + "SFSFSF", + "[random|crandom] forwardVel [random|crandom] rightVel [random|crandom] upVel", + "Add a random component to the regular velocity.\n" + "If random is specified, the component will range from 0 to specified velocity.\n" + "If crandom is specified, the component will range from -specified to +specified velocity.\n" + "If neither random or crandom is specified, then the component will just be added on\n" + "without randomness.\n" + "This velocity is applied using the parent axis" + ); +Event EV_Client_SetAccel + ( + "accel", + EV_DEFAULT, + "fff", + "xAcc yAcc zAcc", + "Set the acceleration of the spawned tempmodel.\n" + "This acceleration is applied using the world axis" + ); +Event EV_Client_SetCount + ( + "count", + EV_DEFAULT, + "i", + "count", + "Set the number of tempmodels that are spawned\n" + "This is only used for the originspawn and tagspawn commands,\n" + "and not for emitters, use spawnrate instead" + ); +Event EV_Client_SetTraceCount + ( + "tracecount", + EV_DEFAULT, + "i", + "count", + "Set the number of traces that are done\n" + ); +Event EV_Client_SetFade + ( + "fade", + EV_DEFAULT, + NULL, + NULL, + "Set the tempmodel to fade out over it's life" + ); +Event EV_Client_SetFadeDelay + ( + "fadedelay", + EV_DEFAULT, + "f", + "time", + "Set the amount of time to delay a fade" + ); +Event EV_Client_SetFadeIn + ( + "fadein", + EV_DEFAULT, + "f", + "time", + "Set the tempmodel to fade in over the specified time" + ); +Event EV_Client_SetTwinkle + ( + "twinkle", + EV_DEFAULT, + "ffff", + "mintimeoff maxtimeoff mintimeon maxtimeon", + "Set the tempmodel to twinkle with the specified settings" + ); +Event EV_Client_SetTrail + ( + "trail", + EV_DEFAULT, + "sssf", + "shader startTag endTag life", + "Set the tempmodel to have a swipe that follows it" + ); +Event EV_Client_SetSpawnRate + ( + "spawnrate", + EV_DEFAULT, + "f", + "rate", + "Set the spawnrate of the emitter (models per second).\n" + "This is only used for emitters and not for the originspawn and tagspawn commands" + ); +Event EV_Client_SetOriginOffset + ( + "offset", + EV_DEFAULT, + "SFSFSF", + "[random|crandom] offsetX [random|crandom] offsetY [random|crandom] offsetZ", + "If random is specified, the component will range from 0 to +specified offset.\n" + "If crandom is specified, the component will range from -specified to +specified offset.\n" + "If neither random or crandom is specified, then the component will just be added on\n" + "without randomness.\n" + "This offset is applied using the world axis." + ); +Event EV_Client_SetScaleRate + ( + "scalerate", + EV_DEFAULT, + "f", + "rate", + "Set the scaling rate of the spawned tempmodel\n" + "If a negative rate is used, the model will shrink" + ); +Event EV_Client_SetCircle + ( + "circle", + EV_DEFAULT, + NULL, + NULL, + "Set the tempmodels to be spawned in a circle around the origin\n" + "This circle will be generated in the X/Y axis of the model" + ); +Event EV_Client_SetSphere + ( + "sphere", + EV_DEFAULT, + NULL, + NULL, + "Set the tempmodels to spawn in a sphere around the origin.\n" + "If sphereradius is set, the tempmodels will spawn at the radius distance from\n" + "the origin" + ); +Event EV_Client_SetInwardSphere + ( + "inwardsphere", + EV_DEFAULT, + NULL, + NULL, + "Create the tempmodels in a sphere around the origin, and adjust their\n" + "angle so they point toward the center of the sphere. This is best used with a\n" + "spehere radius and some velocity so the models look like they're heading toward the\n" + "center of the sphere." + ); +Event EV_Client_SetRadius + ( + "radius", + EV_DEFAULT, + "f", + "radius", + "Set the radius of the sphere for the inwardsphere amd sphere settings" + ); +Event EV_Client_SetSwarm + ( + "swarm", + EV_DEFAULT, + "iff", + "frequency maxspeed delta", + "Create a swarm like effect that the tempmodels follow when they are spawned\n" + "frequency is how often they change direction\n" + "maxspeed is how fast the tempmodel will move (it's randomly generated every\n" + "time the frequency is hit\n" + "delta is how much the tempmodel moves toward the origin every frame" + ); +Event EV_Client_SetWavy + ( + "wavy", + EV_DEFAULT, + "SF", + "[random|crandom] distance", + "Set the tempmodel to move in a wavy path to a maxmimun of the distance specified\n" + "If random is specified, the distance is between 0 and +specified distance\n" + "If crandom is specified, the distance is between -specified and +specified distance" + ); +Event EV_Client_SetAlign + ( + "align", + EV_DEFAULT, + NULL, + NULL, + "Align the tempmodels to the direction they are traveling" + ); +Event EV_Client_SetAlignOnce + ( + "alignonce", + EV_DEFAULT, + NULL, + NULL, + "Align the tempmodels to the direction they are traveling at the time they are initialized" + ); +Event EV_Client_SetFlickerAlpha + ( + "flicker", + EV_DEFAULT, + NULL, + NULL, + "Set the tempmodel to change it's alpha every frame. Creates a flickering effect" + ); +Event EV_Client_SetCollision + ( + "collision", + EV_DEFAULT, + "S", + "water", + "Turn on collision for the tempmodel.\n" + "If the keyword water is specified, then the tempmodel will collide with water" + ); +Event EV_Client_TagSpawn + ( + "tagspawn", + EV_DEFAULT, + "s", + "tagName", + "Spawn tempmodels from the specified tag.\n" + "This command is followed by a ( to specify a block of commands that modify the tempmodels" + ); +Event EV_Client_OriginSpawn + ( + "originspawn", + EV_DEFAULT, + NULL, + NULL, + "Spawn tempmodels from the origin.\n" + "This command is followed by a ( to specify a block of commands that modify the tempmodels" + ); +Event EV_Client_OriginBeamSpawn + ( + "originbeamspawn", + EV_DEFAULT, + NULL, + NULL, + "Spawn a beam from the origin.\n" + "This command is followed by a ( to specify a block of commands that modify the beam" + ); +Event EV_Client_OriginBeamEmitter + ( + "originbeamemitter", + EV_DEFAULT, + NULL, + NULL, + "Spawn beams from the origin.\n" + "This command is followed by a ( to specify a block of commands that modify the beam" + ); +Event EV_Client_TagEmitter + ( + "tagemitter", + EV_DEFAULT, + "ss", + "tagName emitterName", + "Create an emitter that spawns tempmodels from the specified tag.\n" + "This command is followed by a ( to specify a block of commands that modify the tempmodels" + ); +Event EV_Client_OriginEmitter + ( + "originemitter", + EV_DEFAULT, + "s", + "emitterName", + "Create an emitter that spawns tempmodels from the origin.\n" + "This command is followed by a ( to specify a block of commands that modify the tempmodels" + ); +Event EV_Client_EmitterOn + ( + "emitteron", + EV_DEFAULT, + "s", + "emitterName", + "Turn the specified emitter on" + ); +Event EV_Client_EmitterOff + ( + "emitteroff", + EV_DEFAULT, + "s", + "emitterName", + "Turn the specified emitter off" + ); +Event EV_Client_Sound + ( + "sound", + EV_DEFAULT, + "sIFF", + "soundName channel volume min_distance", + "Play the specified sound" + ); +Event EV_Client_StopSound + ( + "stopsound", + EV_DEFAULT, + "i", + "channel", + "Stops the sound on the specified channel." + ); +Event EV_Client_LoopSound + ( + "loopsound", + EV_DEFAULT, + "sFF", + "soundName volume min_distance", + "Play the specifed sound as a looping sound" + ); +Event EV_Client_Cache + ( + "cache", + EV_DEFAULT, + "s", + "resourceName", + "Cache the specified resource" + ); +Event EV_Client_AliasCache + ( + "aliascache", + EV_DEFAULT, + "ssSSSSSS", + "alias realPath arg1 arg2 arg3 arg4 arg5 arg6", + "Create an alias to the specified path and cache the resource" + ); +Event EV_Client_Alias + ( + "alias", + EV_DEFAULT, + "ssSSSSSS", + "alias realPath arg1 arg2 arg3 arg4 arg5 arg6", + "Create an alias to the specified path" + ); +Event EV_Client_Footstep + ( + "footstep", + EV_DEFAULT, + NULL, + NULL, + "Play a footstep sound that is appropriate to the surface we are currently stepping on" + ); +Event EV_Client_Client + ( + "client", + EV_DEFAULT, + "SSSSSS", + "arg1 arg2 arg3 arg4 arg5 arg6", + "Execute the specified command arg string" + ); +Event EV_Client_OriginDynamicLight + ( + "origindlight", + EV_DEFAULT, + "fffffSS", + "red green blue intensity life type1 type2", + "Spawn a dynamic light from the origin of the model\n" + "The red,green,blue parms are the color of the light\n" + "The intensity is the radius of the light\n" + "type is the type of light to create (lensflare,viewlensflare,additive)" + ); +Event EV_Client_TagDynamicLight + ( + "tagdlight", + EV_DEFAULT, + "sfffffSS", + "tagName red green blue intensity life type1 type2", + "Spawn a dynamic light from the specified tag\n" + "The red,green,blue parms are the color of the light\n" + "The intensity is the radius of the light\n" + "type is the type of light to create (lensflare,viewlensflare,additive)" + ); +Event EV_Client_DynamicLight + ( + "dlight", + EV_DEFAULT, + "ffffSS", + "red green blue intensity type1 type2", + "This makes the emitter itself a dynamic light" + "The red,green,blue parms are the color of the light\n" + "The intensity is the radius of the light\n" + "type is the type of light to create (lensflare,viewlensflare,additive)" + ); +Event EV_Client_SetEntityColor + ( + "entcolor", + EV_DEFAULT, + "fffF", + "red green blue alpha", + "Set the color(modulate) of this entity" + ); +Event EV_Client_SetTexAnimTime + ( + "texanimtime", + EV_DEFAULT, + "f", + "time", + "Set the texture animation speed" + ); +Event EV_Client_SetGlobalFade + ( + "globalfade", + EV_DEFAULT, + "S", + "[in|out]", + "Set the tempmodels to globally fade in or out together" + ); +Event EV_Client_SetParentLink + ( + "parentlink", + EV_DEFAULT, + NULL, + NULL, + "Set the tempmodels linked to the parent, so they move with the parent model" + ); +Event EV_Client_SetHardLink + ( + "hardlink", + EV_DEFAULT, + NULL, + NULL, + "Set the tempmodels linked to the model they are spawned from, so they move with it" + ); +Event EV_Client_SetRandomRoll + ( + "randomroll", + EV_DEFAULT, + NULL, + NULL, + "Set the tempmodels so they pick a random roll value every frame" + ); +Event EV_Client_ParentAngles + ( + "parentangles", + EV_DEFAULT, + NULL, + NULL, + "Set the tempmodels angles to that of its parent" + ); +Event EV_Client_SetAngles + ( + "angles", + EV_DEFAULT, + "SFSFSF", + "[random|crandom] pitch [random|crandom] yaw [random|crandom] roll", + "If random is specified, the component will range from 0 to +specified value.\n" + "If crandom is specified, the component will range from -specified to +specified value.\n" + "If neither random or crandom is specified, then the component will be just set\n" + "without randomness." + ); +Event EV_Client_Swipe + ( + "swipe", + EV_DEFAULT, + "V", + "origin", + "Do a swipe and add it on to the swipe rendering list." + ); +Event EV_Client_SwipeOn + ( + "swipeon", + EV_DEFAULT, + "ssff", + "shader startTagName endTagNamelife life", + "Signal the start of a swipe from the current tag" + ); +Event EV_Client_SwipeOff + ( + "swipeoff", + EV_DEFAULT, + NULL, + NULL, + "Signal the end of a swipe" + ); +Event EV_Client_BeginTagBeamEmitter + ( + "tagbeamemitter", + EV_DEFAULT, + "sss", + "tagstart tagend name", + "Create a beam emitter that uses 2 tags to determine it's start and end position" + ); +Event EV_Client_BeginTagBeamSpawn + ( + "tagbeamspawn", + EV_DEFAULT, + "sf", + "tagstart name", + "Create a beam emitter that uses the tag to determine it's starting position." + ); +Event EV_Client_AnimateOnce + ( + "animateonce", + EV_DEFAULT, + NULL, + NULL, + "Set a tempmodel to animate once and then get removed" + ); +Event EV_Client_SetAnim + ( + "anim", + EV_DEFAULT, + "s", + "animation", + "Set a tempmodel the the specified animation" + ); +Event EV_Client_SetSubdivisions + ( + "numsegments", + EV_DEFAULT, + "i", + "numsegments", + "Set the number of segments in a beam" + ); +Event EV_Client_SetMinOffset + ( + "minoffset", + EV_DEFAULT, + "f", + "minoffset", + "Set the minimum offset from center in a beam" + ); +Event EV_Client_SetMaxOffset + ( + "maxoffset", + EV_DEFAULT, + "f", + "maxoffset", + "Set the maximum offset from center in a beam" + ); +Event EV_Client_SetBeamShader + ( + "beamshader", + EV_DEFAULT, + "s", + "shadername", + "Set the shader to use for the beam" + ); +Event EV_Client_SetBeamLength + ( + "beamlength", + EV_DEFAULT, + "f", + "length", + "Set the length of the beam or trace length (for decals)" + ); +Event EV_Client_SetBeamDelay + ( + "beamdelay", + EV_DEFAULT, + "SF", + "[random] delay", + "Set the delay time between creating new beams.\n" + "If the keyword random is specified, the delay between beams will occur randomly between 0 and the time specified" + ); +Event EV_Client_SetBeamToggleDelay + ( + "beamtoggledelay", + EV_DEFAULT, + "SF", + "[random] delay", + "Set a delay between toggling the beams on and off.\n" + "If the keyword random is specified, the delay between toggling will occur randomly between 0 and the time specified" + ); +Event EV_Client_SetBeamPersist + ( + "beampersist", + EV_DEFAULT, + NULL, + NULL, + "Make the beams persist instead of blinking out" + ); +Event EV_Client_SetBeamOffsetEndpoints + ( + "beam_offset_endpoints", + EV_DEFAULT, + NULL, + NULL, + "Make the beams endpoints offset to reduce the bunching up effect" + ); +Event EV_Client_BeamSphere + ( + "beamsphere", + EV_DEFAULT, + "i", + "count", + "Create a sphere shaped beam effect from the origin. Count is the number of beams" + ); +Event EV_Client_Spread + ( + "spread", + EV_DEFAULT, + "ff", + "spreadx spready", + "Add a random variance in the spawned beam in the forward direction by the amound specified in spreadx and spready" + ); +Event EV_Client_UseLastTraceEnd + ( + "uselasttraceend", + EV_DEFAULT, + NULL, + NULL, + "Makes this trace command use the end results of the last trace command" + ); +Event EV_Client_OffsetAlongAxis + ( + "offsetalongaxis", + EV_DEFAULT, + "SfSfSf", + "[crandom|random] offsetx [crandom|random] offsety [crandom|random] offsetz", + "If random is specified, the component will range from 0 to specified offset.\n" + "If crandom is specified, the component will range from -specified to +specified offset.\n" + "If neither random or crandom is specified, then the component will just be added on\n" + "without randomness.\n" + "This offset is applied using the model's local axis" + ); +Event EV_Client_SetEndAlpha + ( + "endalpha", + EV_DEFAULT, + "f", + "alpha", + "Set the alpha of the beam's endpoint" + ); +Event EV_Client_RandomChance + ( + "randomchance", + EV_DEFAULT, + "fSSSSSS", + "percentage [arg1] [arg2] [arg3] [arg4] [arg5] [arg6]", + "Set the percentage chance that command will occur" + ); +Event EV_Client_CommandDelay + ( + "commanddelay", + EV_DEFAULT, + "fiSSSSSS", + "time commandnumber [arg1] [arg2] [arg3] [arg4] [arg5] [arg6]", + "Set the time delay between this command getting executed. This requires a command number to be assigned here.\n" + "This is internally used to keep track of the commands this entity executes and will resolve naming conflicts." + ); +Event EV_Client_TagTraceImpactSound + ( + "tagtraceimpactsound", + EV_DEFAULT, + "si", + "tagname maxlength", + "Perform a trace from the specified tag to the maxlength and play a sound at that position" + ); +Event EV_Client_TagTraceImpactSpawn + ( + "tagtraceimpactspawn", + EV_DEFAULT, + "s", + "tagname", + "Perform a trace from the specified tag to the maxlength and spawn the specified model there." + ); +Event EV_Client_TagTraceImpactMark + ( + "tagtraceimpactmark", + EV_DEFAULT, + "sI", + "tagname temporary", + "Perform a trace from the specified tag to the maxlength and put the shader as a decal on the surface it hits\n" + "temporary = specify 1 for a temporary mark that only appears for a short time, 0 for a decal that stays aroung longer (default is 0)\n" + ); +Event EV_Client_BounceDecal + ( + "bouncedecal", + EV_DEFAULT, + "iI", + "maxamount temporary", + "Put a mark when the tempmodel bounces and hits a surface\n" + "maxamount = Max amount of decals to make when bouncing\n" + "temporary = specify 1 for a temporary mark that only appears for a short time, 0 for a decal that stays aroung longer (default is 0)\n" + ); +Event EV_Client_SetDecalRadius + ( + "decalradius", + EV_DEFAULT, + "f", + "radius", + "Set the radius of the decal" + ); +Event EV_Client_SetDecalOrientation + ( + "orientation", + EV_DEFAULT, + "f", + "degrees", + "Set the degrees to orient the decal. Specify 'random' to use a random orientation" + ); +Event EV_Client_SetDecalShader + ( + "decalshader", + EV_DEFAULT, + "s", + "shadername", + "Set the shader to use for the impact decal" + ); +Event EV_Client_SetTraceLength + ( + "tracelength", + EV_DEFAULT, + "f", + "length", + "Set the length of the trace for the decal" + ); +Event EV_Client_TraceSpawn + ( + "tracespawn", + EV_DEFAULT, + "s", + "modelname", + "Spawn the specified model when the trace hits a solid object" + ); +Event EV_Client_TagList + ( + "taglist", + EV_DEFAULT, + "ssSSSSSS", + "arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8", + "Set the tag list to create a beam that travels between all the tags" + ); +Event EV_Client_Lightstyle + ( + "lightstyle", + EV_DEFAULT, + "s", + "nameOfImage", + "Set a lightstyle to determine the color of this tempmodel, the image\n" + "specified is used to determine the look of the light style" + ); +Event EV_Client_DuplicateCount + ( + "duplicatecount", + EV_DEFAULT, + "i", + "num", + "Set a duplication number for the tempmodels" + ); +Event EV_Client_PhysicsRate + ( + "physicsrate", + EV_DEFAULT, + "s", + "rate", + "Set the rate (in updates per second) for the tempmodel's physics to be updated" + ); +Event EV_Client_Parallel + ( + "parallel", + EV_DEFAULT, + NULL, + NULL, + "Set tempmodel to be parallel to the viewer" + ); +Event EV_Client_Detail + ( + "detail", + EV_DEFAULT, + NULL, + NULL, + "Set emitter/tempmodel to be detail. Which can be turned off by detail" + ); +Event EV_Client_Print + ( + "print", + EV_DEFAULT, + "s", + "string", + "Prints a string." + ); + +CLASS_DECLARATION( Listener, ClientGameCommandManager, NULL ) + { + { &EV_Client_StartBlock, StartBlock }, + { &EV_Client_EndBlock, EndBlock }, + { &EV_Client_EmitterStartOff, EmitterStartOff }, + { &EV_Client_OriginSpawn, BeginOriginSpawn }, + { &EV_Client_OriginBeamSpawn, BeginOriginBeamSpawn }, + { &EV_Client_OriginBeamEmitter, BeginOriginBeamEmitter }, + { &EV_Client_TagSpawn, BeginTagSpawn }, + { &EV_Client_TagEmitter, BeginTagEmitter }, + { &EV_Client_BeginTagBeamEmitter, BeginTagBeamEmitter }, + { &EV_Client_BeginTagBeamSpawn, BeginTagBeamSpawn }, + { &EV_Client_OriginEmitter, BeginOriginEmitter }, + { &EV_Client_EmitterOn, EmitterOn }, + { &EV_Client_EmitterOff, EmitterOff }, + { &EV_Client_SetAlpha, SetAlpha }, + { &EV_Client_SetDieTouch, SetDieTouch }, + { &EV_Client_SetBounceFactor, SetBounceFactor }, + { &EV_Client_SetBounceSound, SetBounceSound }, + { &EV_Client_SetBounceSoundOnce, SetBounceSoundOnce }, + { &EV_Client_SetScale, SetScale }, + { &EV_Client_SetScaleUpDown, SetScaleUpDown }, + { &EV_Client_SetScaleMin, SetScaleMin }, + { &EV_Client_SetScaleMax, SetScaleMax }, + { &EV_Client_SetModel, SetModel }, + { &EV_Client_SetLife, SetLife }, + { &EV_Client_SetColor, SetColor }, + { &EV_Client_SetVelocity, SetVelocity }, + { &EV_Client_SetAngularVelocity, SetAngularVelocity }, + { &EV_Client_SetRandomVelocity, SetRandomVelocity }, + { &EV_Client_SetRandomVelocityAlongAxis, SetRandomVelocityAlongAxis }, + { &EV_Client_SetAccel, SetAccel }, + { &EV_Client_SetCount, SetCount }, + { &EV_Client_SetTraceCount, SetTraceCount }, + { &EV_Client_SetFade, SetFade }, + { &EV_Client_SetFadeDelay, SetFadeDelay }, + { &EV_Client_SetFadeIn, SetFadeIn }, + { &EV_Client_SetTwinkle, SetTwinkle }, + { &EV_Client_SetTrail, SetTrail }, + { &EV_Client_SetSpawnRate, SetSpawnRate }, + { &EV_Client_SetScaleRate, SetScaleRate }, + { &EV_Client_SetOriginOffset, SetOriginOffset }, + { &EV_Client_SetSphere, SetSphere }, + { &EV_Client_SetCircle, SetCircle }, + { &EV_Client_SetInwardSphere, SetInwardSphere }, + { &EV_Client_SetRadius, SetRadius }, + { &EV_Client_SetWavy, SetWavy }, + { &EV_Client_SetSwarm, SetSwarm }, + { &EV_Client_SetAlign, SetAlign }, + { &EV_Client_SetAlignOnce, SetAlignOnce }, + { &EV_Client_SetCollision, SetCollision }, + { &EV_Client_SetFlickerAlpha, SetFlickerAlpha }, + { &EV_Client_Sound, Sound }, + { &EV_Client_StopSound, StopSound }, + { &EV_Client_LoopSound, LoopSound }, + { &EV_Client_Cache, Cache }, + { &EV_Client_AliasCache, AliasCache }, + { &EV_Client_Alias, Alias }, + { &EV_Client_Footstep, Footstep }, + { &EV_Client_Client, Client }, + { &EV_Client_TagDynamicLight, TagDynamicLight }, + { &EV_Client_OriginDynamicLight, OriginDynamicLight }, + { &EV_Client_DynamicLight, DynamicLight }, + { &EV_Client_SetEntityColor, SetEntityColor }, + { &EV_Client_SetGlobalFade, SetGlobalFade }, + { &EV_Client_SetParentLink, SetParentLink }, + { &EV_Client_SetHardLink, SetHardLink }, + { &EV_Client_SetRandomRoll, SetRandomRoll }, + { &EV_Client_SetAngles, SetAngles }, + { &EV_Client_ParentAngles, ParentAngles }, + { &EV_Client_Swipe, Swipe }, + { &EV_Client_SwipeOn, SwipeOn }, + { &EV_Client_SwipeOff, SwipeOff }, + { &EV_Client_SetAnim, SetAnim }, + { &EV_Client_AnimateOnce, AnimateOnce }, + { &EV_Client_SetSubdivisions, SetSubdivisions }, + { &EV_Client_SetMinOffset, SetMinOffset }, + { &EV_Client_SetMaxOffset, SetMaxOffset }, + { &EV_Client_SetBeamShader, SetShader }, + { &EV_Client_SetBeamLength, SetLength }, + { &EV_Client_SetDecalShader, SetShader }, + { &EV_Client_SetTraceLength, SetLength }, + { &EV_Client_SetBeamDelay, SetBeamDelay }, + { &EV_Client_SetBeamToggleDelay, SetBeamToggleDelay }, + { &EV_Client_SetBeamPersist, SetBeamPersist }, + { &EV_Client_SetBeamOffsetEndpoints, SetBeamOffsetEndpoints }, + { &EV_Client_BeamSphere, SetBeamSphere }, + { &EV_Client_Spread, SetSpread }, + { &EV_Client_UseLastTraceEnd, SetUseLastTraceEnd }, + { &EV_Client_OffsetAlongAxis, SetOffsetAlongAxis }, + { &EV_Client_SetEndAlpha, SetEndAlpha }, + { &EV_Client_RandomChance, RandomChance }, + { &EV_Client_CommandDelay, CommandDelay }, + { &EV_Client_TagTraceImpactMark, BeginTagTraceImpactMark }, + { &EV_Client_BounceDecal, SetBounceDecal }, + { &EV_Client_SetDecalRadius, SetDecalRadius }, + { &EV_Client_SetDecalOrientation, SetDecalOrientation }, + { &EV_Client_TagTraceImpactSpawn, BeginTagTraceImpactSpawn }, + { &EV_Client_TagTraceImpactSound, TagTraceImpactSound }, + { &EV_Client_TagList, TagList }, + { &EV_Client_Lightstyle, SetLightstyle }, + { &EV_Client_DuplicateCount, SetDuplicateCount }, + { &EV_Client_PhysicsRate, SetPhysicsRate }, + { &EV_Client_Parallel, SetParallel }, + { &EV_Client_Detail, SetDetail }, + { &EV_Client_Print, Print }, + { NULL, NULL } + }; + +static int DLightNameToNum + ( + str s + ) + + { + if ( !s.icmp( "normal" ) ) + return 0; + else if ( !s.icmp( "lensflare" ) ) + return lensflare; + else if ( !s.icmp( "viewlensflare" ) ) + return viewlensflare; + else if ( !s.icmp( "additive" ) ) + return additive; + else + return 0; + } + +float RandomizeRange + ( + float start, + float end + ) + + { + float t; + + if ( start > end ) + { + return start; + } + + t = start + ( ( end - start ) * random() ); + return t; + } + +//============= +//ClientGameCommandManager +//============= +ClientGameCommandManager::ClientGameCommandManager + ( + ) + + { + m_seed = 0; + + InitializeTempModels(); + InitializeEmitters(); + } + +void ClientGameCommandManager::Print + ( + Event *ev + ) + + { + if ( current_entity ) + cgi.DPrintf( "%d:%s\n", current_entity->entityNumber, ev->GetString( 1 ) ); + } + +//=============== +// CommandDelay +//=============== +void ClientGameCommandManager::CommandDelay + ( + Event *ev + ) + + { + int i; + int delay; + Event *ev1; + + delay = ev->GetFloat( 1 ) * 1000; + if ( current_entity ) + { + commandtime_t *ct = m_command_time_manager.GetLastCommandTime( current_entity->entityNumber, ev->GetInteger( 2 ) ); + + if ( !ct->last_command_time ) + { + ct->last_command_time = cg.time + delay; + return; + } + + if ( ct->last_command_time > cg.time ) + return; + else + ct->last_command_time = cg.time + delay; + } + else + { + warning( "CCM:CommandDelay", "Cannot perform command delay on spawned tempmodels" ); + } + + ev1 = new Event( ev->GetString( 3 ) ); + + for ( i=4; i<=ev->NumArgs(); i++ ) + { + ev1->AddToken( ev->GetToken( i ) ); + } + ProcessEvent( ev1 ); + } + +//=============== +// RandomChance +//=============== +void ClientGameCommandManager::RandomChance + ( + Event *ev + ) + + { + int i; + float percentage = ev->GetFloat( 1 ); + + if ( ( random() < percentage ) && ( ev->NumArgs() >= 2 ) ) + { + Event *ev1; + + ev1 = new Event( ev->GetString( 2 ) ); + + for ( i=3; i<=ev->NumArgs(); i++ ) + { + ev1->AddToken( ev->GetToken( i ) ); + } + ProcessEvent( ev1 ); + } + } +//=============== +// SetDetail +//=============== +void ClientGameCommandManager::SetDetail + ( + Event *ev + ) + + { + m_spawnthing->cgd.flags |= T_DETAIL; + } + +//=============== +// SetDecalRadius +//=============== +void ClientGameCommandManager::SetDecalRadius + ( + Event *ev + ) + + { + m_spawnthing->cgd.decal_radius = ev->GetFloat( 1 ); + } + +//=============== +// SetDecalOrientation +//=============== +void ClientGameCommandManager::SetDecalOrientation + ( + Event *ev + ) + + { + str deg; + + deg = ev->GetString( 1 ); + + if ( !deg.icmp( "random" ) ) + m_spawnthing->cgd.decal_orientation = random() * 360; + else + m_spawnthing->cgd.decal_orientation = ev->GetFloat( 1 ); + } + +//=============== +// SetBounceDecal +//=============== +void ClientGameCommandManager::SetBounceDecal + ( + Event *ev + ) + { + m_spawnthing->cgd.flags2 |= T2_BOUNCE_DECAL; + if ( ev->NumArgs() > 1 ) + { + m_spawnthing->cgd.maxbouncecount = ev->GetInteger( 1 ); + + if ( ev->NumArgs() > 2 ) + { + qboolean b = ev->GetBoolean( 2 ); + if ( b ) + { + m_spawnthing->cgd.flags2 |= T2_TEMPORARY_DECAL; + } + } + } + } + +//=============== +// BeginTagTraceImpactMark +//=============== +void ClientGameCommandManager::BeginTagTraceImpactMark + ( + Event *ev + ) + { + // Setup ending function + endblockfcn = EndTagTraceImpactMark; + m_spawnthing = InitializeSpawnthing( &m_localemitter ); + + // Get the tagname and orientation + m_spawnthing->tagname = ev->GetString( 1 ); + GetOrientation( m_spawnthing->tagname, m_spawnthing ); + + if ( ev->NumArgs() > 2 ) + { + if ( ev->GetBoolean( 2 ) ) + { + m_spawnthing->cgd.flags2 |= T2_TEMPORARY_DECAL; + } + } + } + +//=============== +// EndTagTraceImpactMark +//=============== +void ClientGameCommandManager::EndTagTraceImpactMark + ( + void + ) + + { + Vector end; + trace_t trace; + int i; + + for ( i=0; itrace_count; i++ ) + { + if ( m_spawnthing->use_last_trace_end ) + { + end = last_trace_end; + } + else + { + end = m_spawnthing->cgd.origin + m_spawnthing->forward * m_spawnthing->length + + m_spawnthing->right * crandom() * m_spawnthing->spreadx + + m_spawnthing->up * crandom() * m_spawnthing->spready; + last_trace_end = end; + } + + // Do the trace to get the endpoint + CG_Trace( &trace, m_spawnthing->cgd.origin, vec_zero, vec_zero, end, ENTITYNUM_NONE, MASK_SHOT, false, true, "EndTagTraceImpactMark" ); + + if ( ( trace.fraction != 1.0f ) && !( trace.surfaceFlags & SURF_SKY ) && ( trace.entityNum == ENTITYNUM_WORLD ) ) + { + qhandle_t shader = cgi.R_RegisterShader( m_spawnthing->cgd.shadername ); + + CG_ImpactMark( shader, + trace.endpos, + trace.plane.normal, + m_spawnthing->cgd.decal_orientation, + (float)m_spawnthing->cgd.color[0]/255.0f, + (float)m_spawnthing->cgd.color[1]/255.0f, + (float)m_spawnthing->cgd.color[2]/255.0f, + m_spawnthing->cgd.alpha, + m_spawnthing->cgd.flags & T_FADE, + m_spawnthing->cgd.decal_radius, + m_spawnthing->cgd.flags2 & T2_TEMPORARY_DECAL, + m_spawnthing->cgd.lightstyle, + m_spawnthing->cgd.flags & T_FADEIN); + } + } + } + +//=============== +// BeginTagTraceImpactSpawn +//=============== +void ClientGameCommandManager::BeginTagTraceImpactSpawn + ( + Event *ev + ) + { + // Setup ending function + endblockfcn = EndTagTraceImpactSpawn; + m_spawnthing = InitializeSpawnthing( &m_localemitter ); + + // Get the tagname and orientation + m_spawnthing->tagname = ev->GetString( 1 ); + GetOrientation( m_spawnthing->tagname, m_spawnthing ); + } + +//=============== +// EndTagTraceImpactSpawn +//=============== +void ClientGameCommandManager::EndTagTraceImpactSpawn + ( + void + ) + + { + Vector end,dir,org,f,r,u; + trace_t trace; + int i; + + org = m_spawnthing->cgd.origin; + f = m_spawnthing->forward; + r = m_spawnthing->right; + u = m_spawnthing->up; + + for ( i=0; itrace_count; i++ ) + { + if ( m_spawnthing->use_last_trace_end ) + { + end = last_trace_end; + } + else + { + end = org + f * m_spawnthing->length + + r * crandom() * m_spawnthing->spreadx + + u * crandom() * m_spawnthing->spready; + + last_trace_end = end; + } + + // Do the trace to get the endpoint + CG_Trace( &trace, org, vec_zero, vec_zero, end, ENTITYNUM_NONE, MASK_SHOT, false, true, "EndTagTraceImpactSpawn" ); + + if ( ( trace.fraction != 1.0f ) && !( trace.surfaceFlags & SURF_SKY ) && ( trace.entityNum == ENTITYNUM_WORLD ) ) + { + dir = trace.endpos - m_spawnthing->cgd.origin; + dir.normalize(); + + m_spawnthing->forward = trace.plane.normal; + VectorCopy( m_spawnthing->forward, m_spawnthing->tag_axis[0] ); + m_spawnthing->cgd.origin = trace.endpos; + SpawnTempModel( m_spawnthing->count ); + } + } + } + +//=============== +// EndTagTraceImpactSound +//=============== +void ClientGameCommandManager::TagTraceImpactSound + ( + Event *ev + ) + + { + float maxlength; + Vector end; + trace_t trace; + + maxlength = ev->GetFloat( 1 ); + end = m_spawnthing->cgd.origin + m_spawnthing->forward * maxlength; + + // Do the trace to get the endpoint + CG_Trace( &trace, m_spawnthing->cgd.origin, vec_zero, vec_zero, end, ENTITYNUM_NONE, MASK_SHOT, false, true, "EndTagTraceImpactSound" ); + + if ( ( trace.fraction != 1.0f ) && !( trace.surfaceFlags & SURF_SKY ) && ( trace.entityNum == ENTITYNUM_WORLD ) ) + { + PlaySound( ev->GetString( 2 ), &trace.endpos ); + } + } + +//=============== +// SetDuplicateCount +//=============== +void ClientGameCommandManager::SetDuplicateCount + ( + Event *ev + ) + + { + m_spawnthing->cgd.duplicateCount = ev->GetInteger( 1 ); + } + +//=============== +// SetParallel +//=============== +void ClientGameCommandManager::SetParallel + ( + Event *ev + ) + + { + m_spawnthing->cgd.flags2 |= T2_PARALLEL; + } + +//=============== +// PhysicsRate +//=============== +void ClientGameCommandManager::SetPhysicsRate + ( + Event *ev + ) + + { + str rate; + + rate = ev->GetString( 1 ); + + if ( !rate.icmp( rate, "every" ) ) + m_spawnthing->cgd.flags2 |= T2_PHYSICS_EVERYFRAME; + else + m_spawnthing->cgd.physicsRate = atof( rate ); + } + +//=============== +// SetLightstyle +//=============== +void ClientGameCommandManager::SetLightstyle + ( + Event *ev + ) + + { + m_spawnthing->cgd.lightstyle = CG_RegisterLightStyle( ev->GetString( 1 ) ); + } + +//=============== +// SetBeamSphere +//=============== +void ClientGameCommandManager::SetBeamSphere + ( + Event *ev + ) + + { + m_spawnthing->numspherebeams = ev->GetInteger( 1 ); + m_spawnthing->beamflags = BEAM_SPHERE_EFFECT; + } + +//=============== +// SetBeamSpread +//=============== +void ClientGameCommandManager::SetSpread + ( + Event *ev + ) + + { + m_spawnthing->spreadx = ev->GetFloat( 1 ); + m_spawnthing->spready = ev->GetFloat( 2 ); + } + +//=============== +// SetUseLastTraceEnd +//=============== +void ClientGameCommandManager::SetUseLastTraceEnd + ( + Event *ev + ) + + { + m_spawnthing->use_last_trace_end = qtrue; + } + +//=============== +// SetSubdivisions +//=============== +void ClientGameCommandManager::SetSubdivisions + ( + Event *ev + ) + + { + m_spawnthing->numSubdivisions = ev->GetInteger( 1 ); + } + +//=============== +// SetBeamPersist +//=============== +void ClientGameCommandManager::SetBeamPersist + ( + Event *ev + ) + + { + m_spawnthing->beamflags |= BEAM_PERSIST_EFFECT; + } + +//=============== +// SetBeamOffsetEndponts +//=============== +void ClientGameCommandManager::SetBeamOffsetEndpoints + ( + Event *ev + ) + + { + m_spawnthing->beamflags |= BEAM_OFFSET_ENDPOINTS; + } + +//=============== +// SetBeamDelay +//=============== +void ClientGameCommandManager::SetBeamDelay + ( + Event *ev + ) + + { + if ( ev->NumArgs() > 1 ) + { + str r = ev->GetString( 1 ); + if ( r.icmp( "random" ) ) + m_spawnthing->beamflags |= BEAM_RANDOM_DELAY; + m_spawnthing->delay = ev->GetFloat( 2 ) * 1000.0f; + } + else + { + m_spawnthing->delay = ev->GetFloat( 1 ) * 1000.0f; + } + } + +//=============== +// SetBeamToggleDelay +//=============== +void ClientGameCommandManager::SetBeamToggleDelay + ( + Event *ev + ) + + { + m_spawnthing->beamflags |= BEAM_TOGGLE; + if ( ev->NumArgs() > 1 ) + { + str r = ev->GetString( 1 ); + if ( !r.icmp( "random" ) ) + m_spawnthing->beamflags |= BEAM_RANDOM_TOGGLEDELAY; + + m_spawnthing->toggledelay = ev->GetFloat( 2 ) * 1000.0f; + } + else + { + m_spawnthing->toggledelay = ev->GetFloat( 1 ) * 1000.0f; + } + } + +//=============== +// SetBeamLength +//=============== +void ClientGameCommandManager::SetLength + ( + Event *ev + ) + + { + m_spawnthing->length = ev->GetFloat( 1 ); + } + +//=============== +// SetShader +//=============== +void ClientGameCommandManager::SetShader + ( + Event *ev + ) + + { + m_spawnthing->cgd.shadername = ev->GetString( 1 ); + } + +//=============== +// SetMinOffset +//=============== +void ClientGameCommandManager::SetMinOffset + ( + Event *ev + ) + + { + m_spawnthing->min_offset = ev->GetInteger( 1 ); + } + +//=============== +// SetSubdivisions +//=============== +void ClientGameCommandManager::SetMaxOffset + ( + Event *ev + ) + + { + m_spawnthing->max_offset = ev->GetInteger( 1 ); + } + +//=============== +// SetAnim +//=============== +void ClientGameCommandManager::SetAnim + ( + Event *ev + ) + + { + m_spawnthing->animName = ev->GetString( 1 ); + } + +//=============== +// AnimateOnce +//=============== +void ClientGameCommandManager::AnimateOnce + ( + Event *ev + ) + + { + m_spawnthing->cgd.flags |= T_ANIMATEONCE; + } + +//=============== +// EmitterStartOff +//=============== +void ClientGameCommandManager::EmitterStartOff + ( + Event *ev + ) + + { + m_spawnthing->startoff = qtrue; + } + +//=============== +// StartBlock +//=============== +void ClientGameCommandManager::StartBlock + ( + Event *ev + ) + + { + // Make sure there are no more args on this line, because + // they will be lost + if ( ev->NumArgs() > 1 ) + cgi.DPrintf( "CCM::StartBlock : Invalid commands on start block '{'\n" ); + } + +//=============== +// EndBlock +//=============== +void ClientGameCommandManager::EndBlock + ( + Event *ev + ) + + { + // Make sure there are no more args on this line, because + // they will be lost + + if ( ev->NumArgs() > 1 ) + cgi.DPrintf( "CCM::StartBlock : Invalid commands on start block '{'\n" ); + + if ( endblockfcn ) + ( this->*endblockfcn)( ) ; + + endblockfcn = NULL; + } + +//============= +//SetSwarm +//============= +void ClientGameCommandManager::SetSwarm + ( + Event *ev + ) + + { + m_spawnthing->cgd.swarmfreq = ev->GetInteger( 1 ); + m_spawnthing->cgd.swarmmaxspeed = ev->GetFloat( 2 ); + m_spawnthing->cgd.swarmdelta = ev->GetFloat( 3 ); + m_spawnthing->cgd.flags |= T_SWARM; + } + + +//============= +//SetWavy +//============= +void ClientGameCommandManager::SetWavy + ( + Event *ev + ) + + { + str wave; + + wave = ev->GetString( 1 ); + if ( wave == "crandom" ) + { + m_spawnthing->cgd.wave = crandom() * ev->GetFloat( 2 ); + } + else if ( wave == "random" ) + { + m_spawnthing->cgd.wave = random() * ev->GetFloat( 2); + } + else + { + m_spawnthing->cgd.wave = atof( wave.c_str() ); + } + m_spawnthing->cgd.flags |= T_WAVE; + } + +//============= +//SetCircle +//============= +void ClientGameCommandManager::SetCircle + ( + Event *ev + ) + + { + m_spawnthing->cgd.flags |= T_CIRCLE; + } + +//============= +//SetSphere +//============= +void ClientGameCommandManager::SetSphere + ( + Event *ev + ) + + { + m_spawnthing->cgd.flags |= T_SPHERE; + } + +//============= +//SetSphere +//============= +void ClientGameCommandManager::SetRadius + ( + Event *ev + ) + + { + m_spawnthing->sphereRadius = ev->GetFloat( 1 ); + } + +//============= +//SetInwardSphere +//============= +void ClientGameCommandManager::SetInwardSphere + ( + Event *ev + ) + + { + m_spawnthing->cgd.flags |= T_INWARDSPHERE; + m_spawnthing->sphereRadius = ev->GetFloat( 1 ); + } + +//============= +//SetAlign +//============= +void ClientGameCommandManager::SetAlign + ( + Event *ev + ) + + { + m_spawnthing->cgd.flags |= T_ALIGN; + } + +//============= +//SetAlignOnce +//============= +void ClientGameCommandManager::SetAlignOnce + ( + Event *ev + ) + + { + m_spawnthing->cgd.flags |= T_ALIGNONCE; + } + +//============= +//SetRandomRoll +//============= +void ClientGameCommandManager::SetRandomRoll + ( + Event *ev + ) + + { + m_spawnthing->cgd.flags |= T_RANDOMROLL; + } + +//============= +//SetCollision +//============= +void ClientGameCommandManager::SetCollision + ( + Event *ev + ) + + { + str mask; + + m_spawnthing->cgd.flags |= T_COLLISION; + m_spawnthing->cgd.collisionmask = ( CONTENTS_SOLID ); + + if ( ev->NumArgs() > 1 ) + { + mask = ev->GetString( 1 ); + + if ( mask == "water" ) + { + m_spawnthing->cgd.collisionmask = ( CONTENTS_SOLID|CONTENTS_WATER ); + } + } + } + +//============= +//SetFlickerAlpha +//============= +void ClientGameCommandManager::SetFlickerAlpha + ( + Event *ev + ) + + { + m_spawnthing->cgd.flags |= T_FLICKERALPHA; + } + +//============= +//SetEndAlpha +//============= +void ClientGameCommandManager::SetEndAlpha + ( + Event *ev + ) + + { + m_spawnthing->endalpha = ev->GetFloat( 1 ); + } + + +//============= +//SetOffsetAlongAxis +//============= +void ClientGameCommandManager::SetOffsetAlongAxis + ( + Event *ev + ) + + { + int i = 1; + int j = 0; + + while ( j < 3 ) + { + str org; + + org = ev->GetString( i++ ); + if ( org == "crandom" ) + { + m_spawnthing->randaxis[ j ] = CRANDOM; + m_spawnthing->axis_offset[j++] = ev->GetFloat( i++ ); + } + else if ( org == "random" ) + { + m_spawnthing->randaxis[ j ] = RANDOM; + m_spawnthing->axis_offset[j++] = ev->GetFloat( i++ ); + } + else + { + m_spawnthing->randaxis[ j ] = NOT_RANDOM; + m_spawnthing->axis_offset[j++] = atof( org.c_str() ); + } + } + } + +//============= +//SetOriginOffset +//============= +void ClientGameCommandManager::SetOriginOffset + ( + Event *ev + ) + + { + int i = 1; + int j = 0; + + while ( j < 3 ) + { + str org; + + org = ev->GetString( i++ ); + if ( org == "crandom" ) + { + m_spawnthing->randorg[ j ] = CRANDOM; + m_spawnthing->origin_offset[j++] = ev->GetFloat( i++ ); + } + else if ( org == "random" ) + { + m_spawnthing->randorg[ j ] = RANDOM; + m_spawnthing->origin_offset[j++] = ev->GetFloat( i++ ); + } + else + { + m_spawnthing->randorg[ j ] = NOT_RANDOM; + m_spawnthing->origin_offset[j++] = atof( org.c_str() ); + } + } + } + +//============= +//SetAlpha +//============= +void ClientGameCommandManager::SetAlpha + ( + Event *ev + ) + + { + m_spawnthing->cgd.alpha = ev->GetFloat( 1 ); + } + +//============= +//SetDieTouch +//============= +void ClientGameCommandManager::SetDieTouch + ( + Event *ev + ) + + { + m_spawnthing->cgd.flags |= T_DIETOUCH; + } + +//============= +//SetBounceFactor +//============= +void ClientGameCommandManager::SetBounceFactor + ( + Event *ev + ) + + { + m_spawnthing->cgd.bouncefactor = ev->GetFloat( 1 ); + m_spawnthing->cgd.flags |= T_COLLISION; + m_spawnthing->cgd.collisionmask = ( CONTENTS_SOLID ); + } + +//============= +//SetBounceSound +//============= +void ClientGameCommandManager::SetBounceSound + ( + Event *ev + ) + + { + m_spawnthing->cgd.bouncesound = ev->GetString( 1 ); + + if ( ev->NumArgs() == 2 ) + m_spawnthing->cgd.bouncesound_delay = ev->GetFloat( 1 ) * 1000; + + m_spawnthing->cgd.flags |= T_BOUNCESOUND; + } + +//============= +//SetBounceSoundOnce +//============= +void ClientGameCommandManager::SetBounceSoundOnce + ( + Event *ev + ) + + { + m_spawnthing->cgd.flags |= T_BOUNCESOUNDONCE; + SetBounceSound( ev ); + } + +//============= +//SetScale +//============= +void ClientGameCommandManager::SetScale + ( + Event *ev + ) + + { + m_spawnthing->cgd.scale = ev->GetFloat( 1 ); + } + +//============= +//SetScaleUpDown +//============= +void ClientGameCommandManager::SetScaleUpDown + ( + Event *ev + ) + + { + m_spawnthing->cgd.flags |= T_SCALEUPDOWN; + } + +//============= +//SetScaleMin +//============= +void ClientGameCommandManager::SetScaleMin + ( + Event *ev + ) + + { + m_spawnthing->cgd.flags |= T_RANDSCALE; + m_spawnthing->cgd.scalemin = ev->GetFloat( 1 ); + } + +//============= +//SetScaleMax +//============= +void ClientGameCommandManager::SetScaleMax + ( + Event *ev + ) + + { + m_spawnthing->cgd.flags |= T_RANDSCALE; + m_spawnthing->cgd.scalemax = ev->GetFloat( 1 ); + } + +//============= +//SetScaleRate +//============= +void ClientGameCommandManager::SetScaleRate + ( + Event *ev + ) + + { + m_spawnthing->cgd.scaleRate = ev->GetFloat( 1 ); + } + +//============= +//SetFade +//============= +void ClientGameCommandManager::SetFade + ( + Event *ev + ) + + { + m_spawnthing->cgd.flags |= T_FADE; + } + +//============= +//SetFadeDelay +//============= +void ClientGameCommandManager::SetFadeDelay + ( + Event *ev + ) + + { + m_spawnthing->cgd.fadedelay = ev->GetFloat( 1 ) * 1000; + m_spawnthing->cgd.flags |= T_FADE; + } + +//============= +//SetFadeIn +//============= +void ClientGameCommandManager::SetFadeIn + ( + Event *ev + ) + + { + m_spawnthing->cgd.flags |= T_FADEIN; + + if ( ev->NumArgs() > 0 ) + m_spawnthing->cgd.fadeintime = ev->GetFloat( 1 ) * 1000; + } + +//============= +//SetTwinkle +//============= +void ClientGameCommandManager::SetTwinkle + ( + Event *ev + ) + + { + m_spawnthing->cgd.flags |= T_TWINKLE; + m_spawnthing->cgd.min_twinkletimeoff = ev->GetFloat( 1 ) * 1000; + m_spawnthing->cgd.max_twinkletimeoff = ev->GetFloat( 2 ) * 1000; + m_spawnthing->cgd.min_twinkletimeon = ev->GetFloat( 3 ) * 1000; + m_spawnthing->cgd.max_twinkletimeon = ev->GetFloat( 4 ) * 1000; + } + +//============= +//SetSwipe +//============= +void ClientGameCommandManager::SetTrail + ( + Event *ev + ) + + { + m_spawnthing->cgd.flags2 |= T2_TRAIL; + m_spawnthing->cgd.swipe_shader = ev->GetString( 1 ); + m_spawnthing->cgd.swipe_tag_start = ev->GetString( 2 ); + m_spawnthing->cgd.swipe_tag_end = ev->GetString( 3 ); + m_spawnthing->cgd.swipe_life = ev->GetFloat( 4 ); + } + + +//============= +//SetSpawnRate +//============= +void ClientGameCommandManager::SetSpawnRate + ( + Event *ev + ) + + { + m_spawnthing->spawnRate = ( 1.0f / ev->GetFloat( 1 ) ) * 1000; + } + +//============= +//SetParentLink +//============= +void ClientGameCommandManager::SetParentLink + ( + Event *ev + ) + + { + m_spawnthing->cgd.flags |= T_PARENTLINK; + } + +//============= +//SetHardLink +//============= +void ClientGameCommandManager::SetHardLink + ( + Event *ev + ) + + { + m_spawnthing->cgd.flags |= T_HARDLINK; + m_spawnthing->cgd.parent = current_entity_number; + + if ( current_entity ) + m_spawnthing->cgd.origin = m_spawnthing->cgd.origin - current_entity->origin; + } + +//============= +//SetColor +//============= +void ClientGameCommandManager::SetColor + ( + Event *ev + ) + + { + m_spawnthing->cgd.color[0] = ev->GetFloat( 1 ) * 0xff; + m_spawnthing->cgd.color[1] = ev->GetFloat( 2 ) * 0xff; + m_spawnthing->cgd.color[2] = ev->GetFloat( 3 ) * 0xff; + + if ( ev->NumArgs() == 4 ) + { + m_spawnthing->cgd.color[3] = ev->GetFloat( 4 ) * 0xff; + m_spawnthing->cgd.alpha = ev->GetFloat( 4 ); + } + + } + +//============= +//SetEntityColor +//============= +void ClientGameCommandManager::SetEntityColor + ( + Event *ev + ) + + { + if ( current_centity ) + { + current_centity->client_color[0] = ev->GetFloat( 1 ); + current_centity->client_color[1] = ev->GetFloat( 2 ); + current_centity->client_color[2] = ev->GetFloat( 3 ); + if ( ev->NumArgs() == 4 ) + current_centity->client_color[3] = ev->GetFloat( 4 ); + } + } + +//============= +//SetGlobalFade +//============= +void ClientGameCommandManager::SetGlobalFade + ( + Event *ev + ) + + { + str mode; + + mode = ev->GetString( 1 ); + + if ( mode == "in" ) + m_spawnthing->cgd.flags |= T_GLOBALFADEIN; + else if ( mode == "out" ) + m_spawnthing->cgd.flags |= T_GLOBALFADEOUT; + else + cgi.DPrintf( "Illegal globalfade parm: %s\n", mode.c_str() ); + } + +//============= +//SetRandomVelocity +//============= +void ClientGameCommandManager::SetRandomVelocity + ( + Event *ev + ) + + { + int i = 1; + int j = 0; + Vector randval; + str vel; + + if ( ev->NumArgs() < 3 ) + { + warning( "ClientGameCommandManager::SetRandomVelocity", "Expecting at least 3 args for command randvel" ); + } + + while ( j < 3 ) + { + vel = ev->GetString( i++ ); + if ( vel == "crandom" ) + { + m_spawnthing->randvel[ j ] = CRANDOM; + m_spawnthing->velocityVariation[j++] = ev->GetFloat( i++ ); + } + else if ( vel == "random" ) + { + m_spawnthing->randvel[ j ] = RANDOM; + m_spawnthing->velocityVariation[j++] = ev->GetFloat( i++ ); + } + else + { + m_spawnthing->randvel[ j ] = NOT_RANDOM; + m_spawnthing->velocityVariation[j++] = atof( vel.c_str() ); + } + } + + m_spawnthing->cgd.flags2 |= T2_MOVE; + } + +//============= +//SetRandomVelocityAlongAxis +//============= +void ClientGameCommandManager::SetRandomVelocityAlongAxis + ( + Event *ev + ) + + { + m_spawnthing->cgd.flags |= T_RANDVELAXIS; + SetRandomVelocity( ev ); + } + + +//============= +//SetVelocity +//============= +void ClientGameCommandManager::SetVelocity + ( + Event *ev + ) + + { + m_spawnthing->forwardVelocity = ev->GetFloat( 1 ); + m_spawnthing->cgd.flags2 |= T2_MOVE; + } + +//============= +//SetAngularVelocity +//============= +void ClientGameCommandManager::SetAngularVelocity + ( + Event *ev + ) + + { + int i = 1; + int j = 0; + Vector randval; + str vel; + + if ( ev->NumArgs() < 3 ) + { + warning( "ClientGameCommandManager::SetAngularVelocity", "Expecting at least 3 args for command randvel" ); + } + + while ( j < 3 ) + { + vel = ev->GetString( i++ ); + if ( vel == "crandom" ) + { + m_spawnthing->randavel[ j ] = CRANDOM; + m_spawnthing->cgd.avelocity[j++] = ev->GetFloat( i++ ); + } + else if ( vel == "random" ) + { + m_spawnthing->randavel[ j ] = RANDOM; + m_spawnthing->cgd.avelocity[j++] = ev->GetFloat( i++ ); + } + else + { + m_spawnthing->randavel[ j ] = NOT_RANDOM; + m_spawnthing->cgd.avelocity[j++] = atof( vel.c_str() ); + } + } + + m_spawnthing->cgd.flags2 |= T2_AMOVE; + } + +//============= +//SetAngles +//============= +void ClientGameCommandManager::SetAngles + ( + Event *ev + ) + + { + int i = 1; + int j = 0; + Vector randval; + str vel; + + if ( ev->NumArgs() < 3 ) + { + warning( "ClientGameCommandManager::SetAngles", "Expecting at least 3 args for command randvel" ); + } + + while ( j < 3 ) + { + vel = ev->GetString( i++ ); + if ( vel == "crandom" ) + { + m_spawnthing->randangles[ j ] = CRANDOM; + m_spawnthing->cgd.angles[j++] = ev->GetFloat( i++ ); + } + else if ( vel == "random" ) + { + m_spawnthing->randangles[ j ] = RANDOM; + m_spawnthing->cgd.angles[j++] = ev->GetFloat( i++ ); + } + else + { + m_spawnthing->randangles[ j ] = NOT_RANDOM; + m_spawnthing->cgd.angles[j++] = atof( vel.c_str() ); + } + } + // Set the tag axis + m_spawnthing->cgd.flags |= T_ANGLES; + } + +//============= +//ParentAngles +//============= +void ClientGameCommandManager::ParentAngles + ( + Event *ev + ) + + { + if ( current_centity ) + { + m_spawnthing->cgd.angles = Vector( current_centity->currentState.angles ); + } + m_spawnthing->cgd.flags |= T_ANGLES; + } + +//============= +//SetAccel +//============= +void ClientGameCommandManager::SetAccel + ( + Event *ev + ) + + { + m_spawnthing->cgd.accel[0] = ev->GetFloat( 1 ); + m_spawnthing->cgd.accel[1] = ev->GetFloat( 2 ); + m_spawnthing->cgd.accel[2] = ev->GetFloat( 3 ); + + m_spawnthing->cgd.flags2 |= T2_ACCEL; + } + +//============= +//SetCount +//============= +void ClientGameCommandManager::SetCount + ( + Event *ev + ) + + { + m_spawnthing->count = ev->GetInteger( 1 ); + } + +//============= +//SetTraceCount +//============= +void ClientGameCommandManager::SetTraceCount + ( + Event *ev + ) + + { + m_spawnthing->trace_count = ev->GetInteger( 1 ); + } + +//============= +//SetLife +//============= +void ClientGameCommandManager::SetLife + ( + Event *ev + ) + + { + str life; + + life = ev->GetString( 1 ); + + if ( !life.icmp( "autocalc" ) ) + m_spawnthing->cgd.flags |= T_AUTOCALCLIFE; + else + m_spawnthing->cgd.life = atof( life ) * 1000; + } + +//============= +//SetModel +//============= +void ClientGameCommandManager::SetModel + ( + Event *ev + ) + + { + int i; + int num = ev->NumArgs(); + + for ( i=1; i<=num; i++ ) + { + str s_arg( ev->GetString( i ) ); + m_spawnthing->m_modellist.AddObject( s_arg ); + CacheResource( ev->GetString( i ) ); + } + } + +//============= +//TagList +//============= +void ClientGameCommandManager::TagList + ( + Event *ev + ) + + { + int i; + int num = ev->NumArgs(); + + if ( num < 2 ) + { + warning( "CCG::TagList", "Invalid number of tags specified in taglist. Minimum set of tags is 2.\n" ); + return; + } + + for ( i=1; i<=num; i++ ) + { + str s_arg( ev->GetString( i ) ); + m_spawnthing->m_taglist.AddObject( s_arg ); + } + } + +//============= +//InitializeSpawnthing +//============= +spawnthing_t *ClientGameCommandManager::InitializeSpawnthing + ( + spawnthing_t *sp + ) + + { + int i; + + // Initalize m_spawnthing - these can be overidden with other commands + sp->m_modellist.ClearObjectList(); + AxisClear( sp->axis ); + AxisClear( sp->tag_axis ); + + sp->startoff = qfalse; + sp->velocityVariation = Vector( 0,0,0 ); + sp->origin_offset = Vector( 0,0,0 ); + sp->axis_offset = Vector( 0,0,0 ); + sp->forwardVelocity = 0; + sp->count = 1; + sp->trace_count = 1; + sp->delay = 0; + sp->beamflags = 0; + sp->length = 1000; + sp->max_offset = 0; + sp->min_offset = 0; + sp->numSubdivisions = 1; + sp->overlap = 0; + sp->startoff = 0; + sp->numspherebeams = 0; + sp->spreadx = 0; + sp->spready = 0; + sp->use_last_trace_end = qfalse; + sp->endalpha = 1.0f; + sp->sphereRadius = 0; + sp->spawnRate = 1.0f/10.0f; + sp->touchfcn = NULL; + sp->forward = Vector( 1,0,0 ); + sp->right = Vector( 0,1,0 ); + sp->up = Vector( 0,0,1 ); + + sp->cgd.scale = 1.0f; + sp->cgd.createTime = cg.time; + sp->cgd.life = EMITTER_DEFAULT_LIFE; + sp->cgd.avelocity = Vector( 0,0,0 ); + sp->cgd.accel = Vector( 0,0,0 ); + sp->cgd.origin = Vector( 0,0,0 ); + sp->cgd.oldorigin = Vector( 0,0,0 ); + sp->cgd.angles = Vector( 0,0,0 ); + sp->cgd.alpha = 1.0f; + sp->cgd.scalemin = 0; + sp->cgd.scalemax = 999999.0f; + sp->cgd.scaleRate = 0; + sp->cgd.bouncefactor = 1.0f; + sp->cgd.bouncesound = ""; + sp->cgd.bouncesound_delay = 1000; + sp->cgd.bouncecount = 0; + sp->cgd.maxbouncecount = 3; + sp->cgd.flags = 0; + sp->cgd.flags2 = 0; + sp->cgd.duplicateCount = 0; + sp->cgd.wave = 0; + sp->cgd.swarmfreq = 0; + sp->cgd.swarmdelta = 0; + sp->cgd.swarmmaxspeed = 0; + sp->cgd.fadeintime = 0; + sp->cgd.fadedelay = 0; + sp->cgd.lightIntensity = 0; + sp->cgd.lightType = 0; + sp->cgd.collisionmask = CONTENTS_SOLID; + sp->cgd.parent = -1; + sp->cgd.tikihandle = -1; + sp->cgd.lightstyle = -1; + sp->cgd.physicsRate = 10; + sp->cgd.shadername = "beamshader"; + sp->cgd.decal_orientation = 0; + sp->cgd.decal_radius = 10; + sp->cgd.max_twinkletimeoff = 0; + sp->cgd.min_twinkletimeoff = 0; + sp->cgd.max_twinkletimeon = 0; + sp->cgd.min_twinkletimeon = 0; + sp->cgd.swipe_life = 0; + + for ( i=0; i<3; i++ ) + { + sp->dcolor[i] = 1.0f; + sp->randvel[i] = NOT_RANDOM; + sp->randorg[i] = NOT_RANDOM; + sp->randavel[i] = NOT_RANDOM; + sp->randangles[i] = NOT_RANDOM; + sp->randaxis[i] = NOT_RANDOM; + sp->cgd.color[i] = 0xff; + } + + sp->cgd.color[3] = 255; + + return sp; + } + +//================== +//GetEmitterByName +//================== +spawnthing_t *ClientGameCommandManager::GetEmitterByName + ( + str name + ) + + { + int i; + for ( i=1; i<=m_emitters.NumObjects(); i++ ) + { + spawnthing_t *st = m_emitters.ObjectAt( i ); + if ( st->emittername == name ) + { + return st; + } + } + return NULL; + } + +//================== +//CreateNewEmitter +//================== +spawnthing_t *ClientGameCommandManager::CreateNewEmitter + ( + str name + ) + + { + spawnthing_t *st; + + st = new spawnthing_t; + + // Init the emitter and set the internal pointer at it + InitializeSpawnthing( st ); + + // Set the emitter's name + st->emittername = name; + + // Store it in the container + m_emitters.AddObject( st ); + + return st; + } + +//================== +//CreateNewEmitter +//================== +spawnthing_t *ClientGameCommandManager::CreateNewEmitter + ( + void + ) + + { + return CreateNewEmitter( "" ); + } + +//=============== +//BeginOriginSpawn +//=============== +void ClientGameCommandManager::BeginOriginSpawn + ( + Event *ev + ) + + { + if ( !current_entity ) + { + cgi.DPrintf( "ClientGameCommandManager::BeginOriginSpawn : Illegal use of \"originspawn\"\n" ); + return; + } + + // Setup ending function + endblockfcn = EndOriginSpawn; + + // Init the thing we are going to spawn + m_spawnthing = InitializeSpawnthing( &m_localemitter ); + + // Set the origin based on the entity's origin + m_spawnthing->cgd.origin = current_entity->origin; + + // Set the axis based on the entity's axis + m_spawnthing->forward = current_entity->axis[0]; + m_spawnthing->right = current_entity->axis[1]; + m_spawnthing->up = current_entity->axis[2]; + } + +//=============== +// EndOriginSpawn +//=============== +void ClientGameCommandManager::EndOriginSpawn + ( + void + ) + + { + // Okay we should have a valid spawnthing, let's create a render entity + SpawnTempModel( m_spawnthing->count ); + } + +//=============== +//UpdateSpawnThing +//=============== +void ClientGameCommandManager::UpdateSpawnThing + ( + spawnthing_t *ep + ) + + { + int i; + orientation_t orientation; + + VectorCopy( current_entity->origin, ep->cgd.origin ); + + for ( i = 0 ; i < 3 ; i++ ) + { + VectorMA( ep->cgd.origin, orientation.origin[i], current_entity->axis[i], ep->cgd.origin ); + } + + MatrixMultiply( orientation.axis, current_entity->axis, ep->axis ); + + // Set the axis based on the tag's axis + ep->forward = ep->axis[0]; + ep->right = ep->axis[1]; + ep->up = ep->axis[2]; + } + +//=============== +//BeginTagEmitter +//=============== +void ClientGameCommandManager::BeginTagEmitter + ( + Event *ev + ) + + { + // Setup ending function + endblockfcn = EndTagEmitter; + + // Init the emitter + m_spawnthing = CreateNewEmitter(); + if( !m_spawnthing ) + { + return; + } + + // Get the tagname and orientation + m_spawnthing->tagname = ev->GetString( 1 ); + + if ( !m_spawnthing->tagname.length() ) + warning( "CCM::BeginTagEmitter", "Tagname not specified for tagemitter in model: '%s'\n", cgi.TIKI_NameForNum( current_tiki ) ); + + m_spawnthing->emittername = ev->GetString( 2 ); + if ( !m_spawnthing->emittername.length() ) + warning( "CCM::BeginTagEmitter", "Emittername not specified for tagemitter in model: '%s'\n", cgi.TIKI_NameForNum( current_tiki ) ); + + m_spawnthing->cgd.tikihandle = current_tiki; + } + +//=============== +// EndTagEmitter +//=============== +void ClientGameCommandManager::EndTagEmitter + ( + void + ) + + { + endblockfcn = NULL; + } + +//=============== +//BeginTagBeamEmitter +//=============== +void ClientGameCommandManager::BeginTagBeamEmitter + ( + Event *ev + ) + + { + // Setup ending function + endblockfcn = EndTagBeamEmitter; + + // Init the emitter + m_spawnthing = CreateNewEmitter(); + if( !m_spawnthing ) + { + return; + } + + m_spawnthing->cgd.flags |= T_BEAMTHING; + + // Get the tagname and orientation + + m_spawnthing->startTag = ev->GetString( 1 ); + + if ( m_spawnthing->startTag == "USE_TAGLIST" ) + { + if ( ev->NumArgs() == 2 ) + m_spawnthing->emittername = ev->GetString( 2 ); + } + else + { + if ( ev->NumArgs() == 3 ) + { + m_spawnthing->endTag = ev->GetString( 2 ); + m_spawnthing->emittername = ev->GetString( 3 ); + } + else if ( ev->NumArgs() == 2 ) + { + m_spawnthing->emittername = ev->GetString( 2 ); + } + } + + m_spawnthing->cgd.tikihandle = current_tiki; + } + +//=============== +// EndTagBeamEmitter +//=============== +void ClientGameCommandManager::EndTagBeamEmitter + ( + void + ) + + { + endblockfcn = NULL; + } + +//=============== +//BeginOriginEmitter +//=============== +void ClientGameCommandManager::BeginOriginEmitter + ( + Event *ev + ) + + { + // Setup ending function + endblockfcn = EndOriginEmitter; + + // Init the emitter + m_spawnthing = CreateNewEmitter(); + if( !m_spawnthing ) + { + return; + } + + // Get the emitter's name + m_spawnthing->emittername = ev->GetString( 1 ); + + if ( !m_spawnthing->emittername.length() ) + warning( "CCM::BeginOriginEmitter", "Emittername not specified for originemitter in model: '%s'\n", cgi.TIKI_NameForNum( current_tiki ) ); + + m_spawnthing->cgd.tikihandle = current_tiki; + } + +//=============== +//EndOriginEmitter +//=============== +void ClientGameCommandManager::EndOriginEmitter + ( + void + ) + + { + endblockfcn = NULL; + } + + +//=============== +//BeginOriginBeamEmitter +//=============== +void ClientGameCommandManager::BeginOriginBeamEmitter + ( + Event *ev + ) + + { + // Setup ending function + endblockfcn = EndOriginBeamEmitter; + + // Init the emitter + m_spawnthing = CreateNewEmitter(); + if( !m_spawnthing ) + { + return; + } + + // Get the emitter's name + m_spawnthing->emittername = ev->GetString( 1 ); + + if ( !m_spawnthing->emittername.length() ) + warning( "CCM::BeginOriginEmitter", "Emittername not specified for originemitter in model: '%s'\n", cgi.TIKI_NameForNum( current_tiki ) ); + + m_spawnthing->cgd.tikihandle = current_tiki; + m_spawnthing->cgd.flags |= T_BEAMTHING; + } + +//=============== +//EndOriginBeamEmitter +//=============== +void ClientGameCommandManager::EndOriginBeamEmitter + ( + void + ) + + { + endblockfcn = NULL; + } + +//=============== +//GetOrientation - Calculates the orientation of a tag +//=============== +void ClientGameCommandManager::GetOrientation + ( + str tagname, + spawnthing_t *sp + ) + + { + int i; + orientation_t or; + int tagnum; + + assert( current_entity ); + assert( current_tiki != -1 ); + + if ( !current_entity || ( current_tiki == -1 ) ) + { + return; + } + + tagnum = cgi.Tag_NumForName( current_tiki, tagname.c_str() ); + + if ( tagnum == -1 ) + { + warning( "ClientGameCommandManager::GetOrientation : Tagname %s does not exist", tagname.c_str() ); + return; + } + + or = cgi.Tag_LerpedOrientation( current_tiki, current_entity, tagnum ); + + VectorCopy( current_entity->origin, sp->cgd.origin ); + + for ( i = 0 ; i < 3 ; i++ ) + { + VectorMA( sp->cgd.origin, or.origin[i], current_entity->axis[i], sp->cgd.origin ); + } + + MatrixMultiply( or.axis, current_entity->axis, sp->axis ); + + // Set the axis based on the tag's axis + sp->forward = sp->axis[0]; + sp->right = sp->axis[1]; + sp->up = sp->axis[2]; + + // If angles are not set, then use the angles from the tag + if ( !( sp->cgd.flags & T_ANGLES ) ) + sp->cgd.angles = sp->forward.toAngles(); + + AxisCopy( sp->axis, sp->tag_axis ); + } + +//=============== +//BeginTagSpawn +//=============== +void ClientGameCommandManager::BeginTagSpawn + ( + Event *ev + ) + + { + str tagname; + + // Setup ending function + endblockfcn = EndTagSpawn; + + // Init the thing we are going to spawn + m_spawnthing = InitializeSpawnthing( &m_localemitter ); + + // Get the tagname and orientation + tagname = ev->GetString( 1 ); + GetOrientation( tagname, m_spawnthing ); + } + +//=============== +// EndTagSpawn +//=============== +void ClientGameCommandManager::EndTagSpawn + ( + void + ) + + { + // Okay we should have a valid spawnthing, let's create a render entity + SpawnTempModel( m_spawnthing->count ); + } + +//=============== +//BeginTagBeamShoot +//=============== +void ClientGameCommandManager::BeginTagBeamSpawn + ( + Event *ev + ) + + { + str tagname; + + // Setup ending function + endblockfcn = EndTagBeamSpawn; + + // Init the thing we are going to spawn + m_spawnthing = InitializeSpawnthing( &m_localemitter ); + + // Get the tagname and orientation + tagname = ev->GetString( 1 ); + GetOrientation( tagname, m_spawnthing ); + } + +//=============== +// EndTagSpawn +//=============== +void ClientGameCommandManager::EndTagBeamSpawn + ( + void + ) + + { + // Okay we should have a valid spawnthing, let's create the beam now + int i; + int renderfx; + Vector end; + trace_t trace; + float scale=1.0f; + + if ( current_entity ) + { + scale = current_entity->scale; + } + + for ( i=0; i<3; i++ ) + { + if ( m_spawnthing->randaxis[i] == RANDOM ) + m_spawnthing->cgd.origin += Vector( m_spawnthing->tag_axis[i] ) * m_spawnthing->axis_offset[i] * random(); + else if ( m_spawnthing->randaxis[i] == CRANDOM ) + m_spawnthing->cgd.origin += Vector( m_spawnthing->tag_axis[i] ) * m_spawnthing->axis_offset[i] * crandom(); + else + m_spawnthing->cgd.origin += Vector( m_spawnthing->tag_axis[i] ) * m_spawnthing->axis_offset[i]; + } + + if ( m_spawnthing->use_last_trace_end ) + { + end = last_trace_end; + } + else + { + end = m_spawnthing->cgd.origin + m_spawnthing->forward * m_spawnthing->length + + m_spawnthing->right * crandom() * m_spawnthing->spreadx + + m_spawnthing->up * crandom() * m_spawnthing->spready; + last_trace_end = end; + } + + + CG_Trace( &trace, m_spawnthing->cgd.origin, vec_zero, vec_zero, end, ENTITYNUM_NONE, MASK_SHOT, qfalse, qtrue, "EndTagBeamSpawn" ); + + if ( current_entity ) + renderfx = ( current_entity->renderfx & ~( RF_FLAGS_NOT_INHERITED | RF_LIGHTING_ORIGIN ) ); + else + renderfx = 0; + + CG_CreateBeam( m_spawnthing->cgd.origin, + vec_zero, + current_entity_number, + 1, + m_spawnthing->cgd.alpha, + m_spawnthing->cgd.scale * scale, + (m_spawnthing->beamflags | BEAM_LIGHTNING_EFFECT), + m_spawnthing->length, + m_spawnthing->cgd.life, + qfalse, + trace.endpos, + m_spawnthing->min_offset, + m_spawnthing->max_offset, + m_spawnthing->overlap, + m_spawnthing->numSubdivisions, + m_spawnthing->delay, + m_spawnthing->cgd.shadername, + m_spawnthing->cgd.color, + m_spawnthing->numspherebeams, + m_spawnthing->sphereRadius, + m_spawnthing->toggledelay, + m_spawnthing->endalpha, + renderfx, + m_spawnthing->emittername + ); + } + +//=============== +//BeginOriginBeamSpawn +//=============== +void ClientGameCommandManager::BeginOriginBeamSpawn + ( + Event *ev + ) + + { + // Setup ending function + endblockfcn = EndOriginBeamSpawn; + + // Init the emitter + m_spawnthing = CreateNewEmitter(); + if( !m_spawnthing ) + { + return; + } + + // Set the origin based on the entity's origin + m_spawnthing->cgd.origin = current_entity->origin; + + // Set the axis based on the entity's axis + m_spawnthing->forward = current_entity->axis[0]; + m_spawnthing->right = current_entity->axis[1]; + m_spawnthing->up = current_entity->axis[2]; + } + +//=============== +// EndOriginBeamSpawn +//=============== +void ClientGameCommandManager::EndOriginBeamSpawn + ( + void + ) + + { + // Okay we should have a valid spawnthing, let's create the beam now + int i,renderfx,c,count; + Vector end; + trace_t trace; + float scale=1.0f; + + if ( current_entity ) + { + scale = current_entity->scale; + } + + count = m_spawnthing->count * cg_effectdetail->value; + + for ( c=0; c<=count; c++ ) + { + Vector angles; + + for ( i=0; i<3; i++ ) + { + // Randomize angles or set absolute + if ( m_spawnthing->randangles[i] == RANDOM ) + angles[i] = random() * m_spawnthing->cgd.angles[i]; + else if ( m_spawnthing->randangles[i] == CRANDOM ) + angles[i] = crandom() * m_spawnthing->cgd.angles[i]; + else + angles[i] = m_spawnthing->cgd.angles[i]; + + if ( m_spawnthing->randaxis[i] == RANDOM ) + m_spawnthing->cgd.origin += Vector( m_spawnthing->tag_axis[i] ) * m_spawnthing->axis_offset[i] * random(); + else if ( m_spawnthing->randaxis[i] == CRANDOM ) + m_spawnthing->cgd.origin += Vector( m_spawnthing->tag_axis[i] ) * m_spawnthing->axis_offset[i] * crandom(); + else + m_spawnthing->cgd.origin += Vector( m_spawnthing->tag_axis[i] ) * m_spawnthing->axis_offset[i]; + } + + AnglesToAxis( angles, m_spawnthing->axis ); + m_spawnthing->forward = m_spawnthing->axis[0]; + m_spawnthing->right = m_spawnthing->axis[1]; + m_spawnthing->up = m_spawnthing->axis[2]; + + end = m_spawnthing->cgd.origin + m_spawnthing->forward * m_spawnthing->length + + m_spawnthing->right * crandom() * m_spawnthing->spreadx + + m_spawnthing->up * crandom() * m_spawnthing->spready; + + CG_Trace( &trace, m_spawnthing->cgd.origin, vec_zero, vec_zero, end, ENTITYNUM_NONE, MASK_SHOT, qfalse, qtrue, "EndOriginBeamSpawn" ); + + if ( current_entity ) + renderfx = ( current_entity->renderfx & ~( RF_FLAGS_NOT_INHERITED | RF_LIGHTING_ORIGIN ) ); + else + renderfx = 0; + + CG_CreateBeam( m_spawnthing->cgd.origin, + vec_zero, + current_entity_number, + 1, + m_spawnthing->cgd.alpha, + m_spawnthing->cgd.scale * scale, + (m_spawnthing->beamflags | BEAM_LIGHTNING_EFFECT), + m_spawnthing->length, + m_spawnthing->cgd.life, + qtrue, + trace.endpos, + m_spawnthing->min_offset, + m_spawnthing->max_offset, + m_spawnthing->overlap, + m_spawnthing->numSubdivisions, + m_spawnthing->delay, + m_spawnthing->cgd.shadername, + m_spawnthing->cgd.color, + m_spawnthing->numspherebeams, + m_spawnthing->sphereRadius, + m_spawnthing->toggledelay, + m_spawnthing->endalpha, + renderfx, + m_spawnthing->emittername + ); + } + } + +//============= +//AllocateTempModel +//============= +ctempmodel_t *ClientGameCommandManager::AllocateTempModel + ( + void + ) + + { + ctempmodel_t *p; + + if ( !m_free_tempmodels ) + { + // no free entities, so free the one at the end of the chain + // remove the oldest active entity + FreeTempModel( m_active_tempmodels.prev ); + } + + p = m_free_tempmodels; + m_free_tempmodels = m_free_tempmodels->next; + + // link into the active list + p->next = m_active_tempmodels.next; + p->prev = &m_active_tempmodels; + m_active_tempmodels.next->prev = p; + m_active_tempmodels.next = p; + + return p; + } + +//=============== +//FreeTempModel +//=============== +void ClientGameCommandManager::FreeTempModel + ( + ctempmodel_t *p + ) + + { + if ( !p->prev ) + { + cgi.Error( ERR_DROP, "CCM::FreeTempModel: not active" ); + } + + RemoveClientEntity( p->number, p->cgd.tikihandle, NULL, p ); + + // remove from the doubly linked active list + p->prev->next = p->next; + p->next->prev = p->prev; + + // the free list is only singly linked + p->next = m_free_tempmodels; + m_free_tempmodels = p; + } + +void ClientGameCommandManager::ResetTempModels + ( + void + ) + + { + // Go through all the active tempmodels and free them + ctempmodel_t *p,*next; + + p = m_active_tempmodels.prev; + for ( ; p != &m_active_tempmodels; p = next ) + { + next = p->prev; + FreeTempModel( p ); + } + } + +//============= +//InitializeTempModels +//============= +void ClientGameCommandManager::InitializeTempModels + ( + void + ) + + { + int i; + + m_numtempmodels = MAX_TEMPMODELS; + + m_active_tempmodels.next = &m_active_tempmodels; + m_active_tempmodels.prev = &m_active_tempmodels; + + m_free_tempmodels = &m_tempmodels[0]; + + for ( i=0 ; icgd.swarmfreq == 0 ) + return; + + // If the frequency is hit, set a new velocity + if ( !( rand() % p->cgd.swarmfreq ) ) + { + p->cgd.velocity.x = crandom() * p->cgd.swarmmaxspeed; + p->cgd.velocity.y = crandom() * p->cgd.swarmmaxspeed; + p->cgd.velocity.z = crandom() * p->cgd.swarmmaxspeed; + } + + // Try to move toward the origin by the specified delta + if ( p->cgd.origin.x < p->cgd.parentOrigin.x ) + p->cgd.velocity.x += p->cgd.swarmdelta; + else + p->cgd.velocity.x -= p->cgd.swarmdelta; + + if ( p->cgd.origin.y < p->cgd.parentOrigin.y ) + p->cgd.velocity.y += p->cgd.swarmdelta; + else + p->cgd.velocity.y -= p->cgd.swarmdelta; + + if ( p->cgd.origin.z < p->cgd.parentOrigin.z ) + p->cgd.velocity.z += p->cgd.swarmdelta; + else + p->cgd.velocity.z -= p->cgd.swarmdelta; + } + +void ClientGameCommandManager::OtherTempModelEffects + ( + ctempmodel_t *p, + Vector origin, + refEntity_t *newEnt + ) + + { + vec3_t axis[3]; + + if ( p->number != -1 ) + { + // Set the axis + AnglesToAxis( p->cgd.angles, axis ); + + current_scale = newEnt->scale; + current_entity = newEnt; + current_tiki = p->cgd.tikihandle; + current_entity_number = p->number; + + // Update any emitters that are active on this tempmodel + UpdateEmitter( p->cgd.tikihandle, axis, p->number, p->cgd.parent, origin ); + + // Add in trails for this tempmodel + if ( p->cgd.flags2 & T2_TRAIL ) + { + Event *ev = new Event( EV_Client_Swipe ); + ev->AddVector( origin ); + commandManager.ProcessEvent( ev ); + } + + current_entity_number = -1; + current_tiki = -1; + current_entity = NULL; + current_scale = -1; + } + } + +//=============== +//AnimateTempModel - animate temp models +//=============== +void ClientGameCommandManager::AnimateTempModel + ( + ctempmodel_t *p, + Vector origin, + refEntity_t *newEnt + ) + + { + int numframes; + int deltatime; + int frametime; + + // This code is for animating tempmodels that are spawned from the client side + + if ( p->cgd.tikihandle < 0 ) + return; + + // Calc frame stuff + frametime = 1000.0f * cgi.Frame_Time( p->cgd.tikihandle, p->ent.anim, 0 ); + deltatime = cg.time - p->lastAnimTime; + numframes = cgi.Anim_NumFrames( p->cgd.tikihandle, p->ent.anim ); + + if ( !p->addedOnce ) + { + // Process entry commands + CG_ProcessEntityCommands( p->cgd.tikihandle, TIKI_FRAME_CMD_ENTRY, p->ent.anim, -1, &p->ent, NULL ); + } + + if ( numframes < 2 ) + return; + + // Go through all the frames, and process any commands associated with the tempmodel as well + while( deltatime >= frametime ) + { + deltatime -= frametime; + p->lastAnimTime += frametime; + p->ent.oldanim = p->ent.anim; + p->ent.oldframe = p->ent.frame; + p->ent.frame = ( p->ent.frame + 1 ) % numframes; + CG_ProcessEntityCommands( p->cgd.tikihandle, p->ent.frame, p->ent.anim, -1, &p->ent, NULL ); + } + + p->ent.backlerp = 1.0f - ( ( float )deltatime / ( float )frametime ); + } + +qboolean ClientGameCommandManager::TempModelRealtimeEffects + ( + ctempmodel_t *p, + float ftime, + float dtime, + float scale + ) + + { + float fade,fadein; + byte tempColor[4]; + + if ( p->cgd.flags & ( T_FADE|T_SCALEUPDOWN ) ) + { + fade = 1.0f - ( float )( p->aliveTime - p->cgd.fadedelay ) / ( float )( p->cgd.life - p->cgd.fadedelay ); + + // Clamp the fade + if ( fade > 1 ) + fade = 1; + if ( fade < 0 ) + fade = 0; + } + else + { + fade = 1.0f; + } + + dtime = ( cg.time - p->cgd.createTime ); + + // Calculate fade in value + if ( p->cgd.flags & T_FADEIN ) + fadein = dtime / (float)p->cgd.fadeintime; + else + fadein = 0; + + // Convert dtime to seconds + dtime *= 0.001; + + // Do the scale animation + if ( ftime && p->cgd.scaleRate ) + p->ent.scale += p->ent.scale * ( p->cgd.scaleRate * ftime ); + + if ( p->cgd.flags & T_SCALEUPDOWN ) + { + p->ent.scale = p->cgd.scale * sin( ( fade ) * M_PI ); + + if ( p->ent.scale < p->cgd.scalemin ) + p->ent.scale = p->cgd.scalemin; + if ( p->ent.scale > p->cgd.scalemax ) + p->ent.scale = p->cgd.scalemax; + } + + if ( p->cgd.lightstyle >= 0 ) + { + int i; + float color[4]; + CG_LightStyleColor( p->cgd.lightstyle, dtime * 1000, color ); + for ( i=0; i<4; i++ ) + tempColor[i] = color[i] * 255; + } + else + { + memcpy( tempColor, p->cgd.color, 4 ); + } + + if ( p->cgd.flags & T_TWINKLE ) + { + // See if we should toggle the twinkle + if ( cg.time > p->twinkleTime ) + { + // If off, turn it on + if ( p->cgd.flags & T_TWINKLE_OFF ) + { + p->cgd.flags &= ~T_TWINKLE_OFF; + p->twinkleTime = cg.time + p->cgd.min_twinkletimeon + random() * p->cgd.max_twinkletimeon; + } + else + { + p->cgd.flags |= T_TWINKLE_OFF; + p->twinkleTime = cg.time + p->cgd.min_twinkletimeoff + random() * p->cgd.max_twinkletimeoff; + } + } + + if ( p->cgd.flags & T_TWINKLE_OFF ) + memset( tempColor, 0, 4 ); + } + + if ( p->cgd.flags & T_FADEIN && ( fadein < 1 ) ) // Do the fadein effect + { + p->ent.shaderRGBA[0] = (int)( tempColor[0] * ( fadein * p->cgd.alpha ) ); + p->ent.shaderRGBA[1] = (int)( tempColor[1] * ( fadein * p->cgd.alpha ) ); + p->ent.shaderRGBA[2] = (int)( tempColor[2] * ( fadein * p->cgd.alpha ) ); + p->ent.shaderRGBA[3] = (int)( tempColor[3] * ( fadein * p->cgd.alpha ) ); + } + else if ( p->cgd.flags & T_FADE ) // Do a fadeout effect + { + p->ent.shaderRGBA[0] = ( tempColor[0] * ( fade * p->cgd.alpha ) ); + p->ent.shaderRGBA[1] = ( tempColor[1] * ( fade * p->cgd.alpha ) ); + p->ent.shaderRGBA[2] = ( tempColor[2] * ( fade * p->cgd.alpha ) ); + p->ent.shaderRGBA[3] = ( tempColor[3] * ( fade * p->cgd.alpha ) ); + } + else + { + p->ent.shaderRGBA[0] = tempColor[0] * p->cgd.alpha; + p->ent.shaderRGBA[1] = tempColor[1] * p->cgd.alpha; + p->ent.shaderRGBA[2] = tempColor[2] * p->cgd.alpha; + p->ent.shaderRGBA[3] = tempColor[3] * p->cgd.alpha; + } + + if ( p->cgd.flags & T_FLICKERALPHA ) + { + float random = random(); + + if ( p->cgd.flags & (T_FADE|T_FADEIN) ) + { + p->ent.shaderRGBA[0] *= random; + p->ent.shaderRGBA[1] *= random; + p->ent.shaderRGBA[2] *= random; + p->ent.shaderRGBA[3] *= random; + } + else + { + p->ent.shaderRGBA[0] = p->cgd.color[0] * random; + p->ent.shaderRGBA[1] = p->cgd.color[1] * random; + p->ent.shaderRGBA[2] = p->cgd.color[2] * random; + p->ent.shaderRGBA[3] = p->cgd.color[3] * random; + } + } + + // Check for completely faded out model + if ( fade <= 0 && p->addedOnce ) + { + return false; + } + + // Check for completely scaled out model + if ( ( p->ent.scale <= 0 && p->addedOnce ) && !( p->cgd.flags & T_SCALEUPDOWN ) ) + { + return false; + } + + // Do swarming flies effects + if ( p->cgd.flags & T_SWARM ) + { + UpdateSwarm( p ); + } + + return true; + } + +qboolean ClientGameCommandManager::TempModelPhysics + ( + ctempmodel_t *p, + float ftime, + float time2, + float scale + ) + + { + int dtime; + Vector parentOrigin(0,0,0); + Vector parentAngles(0,0,0); + Vector tempangles; + trace_t trace; + float dot; + + VectorCopy( p->ent.origin, p->lastEnt.origin ); + AxisCopy( p->ent.axis, p->lastEnt.axis ); + + dtime = ( cg.time - p->cgd.createTime ); + + // Save oldorigin + p->cgd.oldorigin = p->cgd.origin; + + // Update the orign and the angles based on velocities first + if ( p->cgd.flags2 & (T2_MOVE|T2_ACCEL) ) + { + p->cgd.origin = p->cgd.origin + ( p->cgd.velocity * ftime * scale ) + ( time2 * p->cgd.accel ); + } + + // If linked to the parent or hardlinked, get the parent's origin + if ( ( p->cgd.flags & ( T_PARENTLINK | T_HARDLINK ) ) && ( p->cgd.parent != ENTITYNUM_NONE ) ) + { + centity_t *pc; + pc = &cg_entities[ p->cgd.parent ]; + + if ( pc->currentValid ) + { + refEntity_t *e; + + e = cgi.R_GetRenderEntity( p->cgd.parent ); + + if ( !e ) + return false; + + parentOrigin = e->origin; + vectoangles( e->axis[0], parentAngles ); + } + else + { + return false; + } + } + + // Align the object along it's traveling vector + if ( p->cgd.flags & T_ALIGN ) + { + p->cgd.angles = p->cgd.velocity.toAngles(); + parentAngles = vec_zero; + } + + if ( p->cgd.flags & T_RANDOMROLL ) + { + p->cgd.angles[ROLL] = random() * 360; + } + + // Update the angles based on angular velocity + if ( p->cgd.flags2 & T2_AMOVE ) + p->cgd.angles = p->cgd.angles + ( ftime * p->cgd.avelocity ); + + // Mod the angles if needed + p->cgd.angles[0] = AngleMod( p->cgd.angles[0] ); + p->cgd.angles[1] = AngleMod( p->cgd.angles[1] ); + p->cgd.angles[2] = AngleMod( p->cgd.angles[2] ); + + // Add in parent angles + tempangles = p->cgd.angles + parentAngles; + + // Convert to axis + if ( ( p->cgd.flags & ( T_ALIGN|T_RANDOMROLL|T_PARENTLINK|T_HARDLINK|T_ANGLES ) ) || ( p->cgd.flags2 & T2_AMOVE ) ) + { + AnglesToAxis( tempangles, p->ent.axis ); + } + + // Only do real collision if necessary + if ( p->cgd.flags & T_COLLISION ) + { + // trace a line from previous position to new position + CG_Trace( &trace, p->cgd.oldorigin, NULL, NULL, p->cgd.origin, -1, p->cgd.collisionmask, qfalse, qfalse, "Collision" ); + } + else + { + // Fake it out so it never collides + trace.fraction = 1.0; + } + + // Check for collision + if ( trace.fraction == 1.0 ) + { + // Acceleration of velocity + if ( p->cgd.flags2 & T2_ACCEL ) + p->cgd.velocity = p->cgd.velocity + ftime * p->cgd.accel; + } + else + { + if ( p->touchfcn ) + { + p->touchfcn( p, &trace ); + } + + if ( p->cgd.flags & T_DIETOUCH ) + return false; + + Vector normal; + + // Set the origin + p->cgd.origin = trace.endpos; + + if ( + ( p->cgd.flags2 & T2_BOUNCE_DECAL ) && + ( p->cgd.bouncecount < p->cgd.maxbouncecount ) + ) + { + // Put down a bounce decal + qhandle_t shader = cgi.R_RegisterShader( p->cgd.shadername ); + + CG_ImpactMark( shader, + trace.endpos, + trace.plane.normal, + p->cgd.decal_orientation, + (float)p->cgd.color[0]/255.0f, + (float)p->cgd.color[1]/255.0f, + (float)p->cgd.color[2]/255.0f, + p->cgd.alpha, + p->cgd.flags & T_FADE, + p->cgd.decal_radius, + p->cgd.flags2 & T2_TEMPORARY_DECAL, + p->cgd.lightstyle, + p->cgd.flags & T_FADEIN + ); + + p->cgd.bouncecount++; + } + + // calculate the bounce + normal = trace.plane.normal; + + // reflect the velocity on the trace plane + if ( p->cgd.flags2 & T2_ACCEL ) + p->cgd.velocity = p->cgd.velocity + ftime*trace.fraction * p->cgd.accel; + + dot = p->cgd.velocity * normal; + p->cgd.velocity = p->cgd.velocity + ( ( -2*dot ) * normal ); + p->cgd.velocity *= p->cgd.bouncefactor; + + // check for stop + if ( trace.plane.normal[2] > 0 && p->cgd.velocity[2] < 40 ) + { + p->cgd.velocity = Vector( 0,0,0 ); + p->cgd.avelocity = Vector( 0,0,0 ); + p->cgd.flags &= ~T_WAVE; + } + else + { + if ( p->cgd.flags & T_BOUNCESOUNDONCE ) + { + vec3_t org; + VectorCopy( p->cgd.origin, org ); + PlaySound( p->cgd.bouncesound, &org ); + p->cgd.flags &= ~(T_BOUNCESOUNDONCE|T_BOUNCESOUND); + } + else if ( ( p->cgd.flags & T_BOUNCESOUND ) && ( p->next_bouncesound_time < cg.time ) ) + { + vec3_t org; + VectorCopy( p->cgd.origin, org ); + PlaySound( p->cgd.bouncesound, &org ); + p->next_bouncesound_time = cg.time + p->cgd.bouncesound_delay; + } + } + } + + // copy over origin + VectorCopy( p->cgd.origin, p->ent.origin ); + + // Add in a waviness + if ( p->cgd.flags & T_WAVE ) + { + Vector add = p->perp * sin( dtime ) * p->cgd.wave; + VectorAdd( p->ent.origin, add, p->ent.origin ); + } + + // Add in parent's origin if linked + if ( p->cgd.flags & ( T_PARENTLINK | T_HARDLINK ) ) + VectorAdd( p->ent.origin, parentOrigin, p->ent.origin ); + + if ( !p->lastEntValid ) + { + // Make the lastEnt valid, by setting it to p->ent and setting the origin to the tempmodel's oldorigin + p->lastEnt = p->ent; + VectorCopy( p->cgd.oldorigin, p->lastEnt.origin ); + p->lastEntValid = true; + } + + return true; + } + +qboolean ClientGameCommandManager::LerpTempModel + ( + refEntity_t *newEnt, + ctempmodel_t *p, + float frac + ) + + { + int i,j; + + // If the tempmodel is parentlinked, then we need to get the origin of the parent and + // add it to the tempmodel's origin + if ( p->cgd.flags & (T_PARENTLINK|T_HARDLINK) ) + { + centity_t *pc; + Vector parentOrigin; + + // Lerp the tempmodel's local origin + for( i=0; i<3; i++ ) + { + newEnt->origin[i] = p->cgd.oldorigin[i] + frac * ( p->cgd.origin[i] - p->cgd.oldorigin[i] ); + } + + // Find the parent entity + pc = &cg_entities[ p->cgd.parent ]; + + if ( pc->currentValid ) + { + refEntity_t *e; + + e = cgi.R_GetRenderEntity( p->cgd.parent ); + + if ( !e ) + return false; + + parentOrigin = e->origin; + } + else + { + return false; + } + + // Add the parent ent's origin to the local origin + VectorAdd( newEnt->origin, parentOrigin, newEnt->origin ); + } + else + { + if ( p->cgd.flags2 & (T2_MOVE|T2_ACCEL) ) + { + // Lerp the ent's origin + for( i=0; i<3; i++ ) + { + newEnt->origin[i] = p->lastEnt.origin[i] + frac * ( p->ent.origin[i] - p->lastEnt.origin[i] ); + } + } + } + + if ( p->cgd.flags2 & T2_PARALLEL ) + { + Vector v1 = p->cgd.origin - cg.refdef.vieworg; + vectoangles( v1, p->cgd.angles ); + AnglesToAxis( p->cgd.angles, newEnt->axis ); + } + else if ( ( p->cgd.flags & ( T_ALIGN|T_RANDOMROLL|T_PARENTLINK|T_HARDLINK ) ) || ( p->cgd.flags2 & T2_AMOVE ) ) + { + // Lerp axis + for ( i=0; i<3; i++ ) + { + for ( j=0; j<3; j++ ) + { + newEnt->axis[i][j] = p->lastEnt.axis[i][j] + frac * ( p->ent.axis[i][j] - p->lastEnt.axis[i][j] ); + } + } + } + + return true; + } + + +static int lastFrameTime=0; + +//=============== +//AddTempModels - Update and add tempmodels to the ref +//=============== +#define TOO_MUCH_TIME_PASSED 500 +void ClientGameCommandManager::AddTempModels + ( + void + ) + + { + ctempmodel_t *p, *next; + int count=0; // Tempmodel count + int frameTime; + float effectTime, effectTime2; + int mstime=0; + float ftime=0; + float time2=0; + float scale=1.0f; + float lerpfrac=0; + int physics_rate=0; + qboolean ret; + refEntity_t newEnt; + + // To counteract cg.time going backwards + if ( lastFrameTime ) + { + if ( ( cg.time < lastFrameTime ) || ( cg.time - lastFrameTime > TOO_MUCH_TIME_PASSED ) ) + { + p = m_active_tempmodels.prev; + for ( ; p != &m_active_tempmodels; p = next ) + { + next = p->prev; + p->lastPhysicsTime = cg.time; + } + lastFrameTime = cg.time; + return; + } + } + + if ( lastFrameTime != 0 ) + frameTime = cg.time - lastFrameTime; + else + frameTime = 0; + + + if ( paused->integer ) + { + lastFrameTime = 0; + } + else + { + lastFrameTime = cg.time; + } + + memset( &newEnt, 0, sizeof( newEnt ) ); + // Set this frame time for the next one + effectTime = ( float )frameTime / 1000.0f; + effectTime2 = effectTime * effectTime; + + // If there is a current entity, it's scale is used as a factor + if ( current_entity ) + scale = current_entity->scale; + + // Go through all the temp models and run the physics if necessary, + // then add them to the ref + p = m_active_tempmodels.prev; + for ( ; p != &m_active_tempmodels; p = next ) + { + // grab next now, so if the local entity is freed we still have it + next = p->prev; + + if ( ( p->cgd.flags & T_DETAIL ) && !cg_detail->integer ) + { + FreeTempModel( p ); + continue; + } + + current_tiki = p->cgd.tikihandle; + + TempModelRealtimeEffects( p, effectTime, effectTime2, scale ); + + if ( p->lastPhysicsTime ) + { + mstime = cg.time - p->lastPhysicsTime; + + // Check for physics + physics_rate = 1000 / p->cgd.physicsRate; // Physics rate in milliseconds + + // Avoid large jumps in time + if ( mstime > physics_rate * 2 ) + { + mstime = physics_rate; + } + + if ( ( mstime >= physics_rate ) || ( p->cgd.flags2 & T2_PHYSICS_EVERYFRAME ) ) + { + ftime = mstime / 1000.0f; + time2 = ftime * ftime; + ret = TempModelPhysics( p, ftime, time2, scale ); + + if ( !ret ) + { + FreeTempModel( p ); + continue; + } + + p->lastPhysicsTime = cg.time; + } + } + + // Calculate the lerp value based on the time passed since last physics time of this tempmodel + lerpfrac = (float)( cg.time - p->lastPhysicsTime ) / (float)physics_rate; + + // Clamp + if ( lerpfrac > 1 ) + lerpfrac = 1; + if ( lerpfrac < 0 ) + lerpfrac = 0; + + // Increment the time this tempmodel has been alive + p->aliveTime += frameTime; + + // Dead, and free up the tempmodel + if ( p->aliveTime >= p->cgd.life && p->addedOnce ) + { + FreeTempModel( p ); + continue; + } + + // Run physics if the lastEnt is not valid to get a valid lerp + if ( !p->lastEntValid ) + { + float t,t2; + t = physics_rate / 1000.0f; + t2 = t * t; + + ret = TempModelPhysics( p, t, t2, scale ); + if ( !ret ) + { + FreeTempModel( p ); + continue; + } + + lerpfrac = 0; + p->lastPhysicsTime = cg.time; + } + + // clear out the new entity and initialize it + // this will become the current_entity if anything is spawned off it + + newEnt.scale = p->ent.scale; + memcpy( newEnt.shaderRGBA, p->ent.shaderRGBA, 4 ); + AxisCopy( p->ent.axis, newEnt.axis ); + VectorCopy( p->ent.origin, newEnt.origin ); + + // Lerp the tempmodel + if ( !LerpTempModel( &newEnt, p, lerpfrac ) ) + { + FreeTempModel( p ); + continue; + } + + // Animate and do trails (swipes) + newEnt.renderfx = p->ent.renderfx; + newEnt.hModel = p->ent.hModel; + newEnt.reType = p->ent.reType; + newEnt.shaderTime = p->ent.shaderTime; + + AnimateTempModel( p, newEnt.origin, &newEnt ); + + newEnt.anim = p->ent.anim; + newEnt.frame = p->ent.frame; + newEnt.oldanim = p->ent.oldanim; + newEnt.oldframe = p->ent.oldframe; + newEnt.backlerp = p->ent.backlerp; + + OtherTempModelEffects( p, newEnt.origin, &newEnt ); + + // Add to the ref + if ( p->cgd.flags & T_DLIGHT ) + { + // Tempmodel is a Dynamic Light + cgi.R_AddLightToScene( p->cgd.origin, + p->cgd.lightIntensity * scale, + (float)p->cgd.color[0]/255.0f, + (float)p->cgd.color[1]/255.0f, + (float)p->cgd.color[2]/255.0f, + p->cgd.lightType + ); + } + else if( p->ent.reType == RT_SPRITE ) + cgi.R_AddRefSpriteToScene( &newEnt ); // Sprite + else + cgi.R_AddRefEntityToScene( &newEnt ); // Model + + // Set the added once flag so we can delete it later + p->addedOnce = qtrue; + + // Local tempmodel count stat + count++; + current_tiki = -1; + } + + + // stats + if ( cg_showtempmodels->integer ) + { + cgi.DPrintf( "TC:%i\n", count ); + } + } + +//================= +//SpawnTempModel +//================= +void ClientGameCommandManager::SpawnTempModel + ( + int count, + spawnthing_t *sp + ) + { + m_spawnthing = sp; + SpawnTempModel( count ); + } + +//================= +//SpawnTempModel +//================= +void ClientGameCommandManager::SpawnTempModel + ( + int mcount, + int timeAlive + ) + + { + int i; + ctempmodel_t *p; + refEntity_t ent; + int count; + float current_entity_scale=1.0f; + Vector newForward; + + if ( current_entity ) + { + current_entity_scale = current_entity->scale; + } + else + { + current_entity_scale = 1.0f; + } + + if ( current_scale > 0 ) + current_entity_scale *= current_scale; + + if ( mcount > 1 ) + mcount *= cg_effectdetail->value; + + if ( mcount < 1 ) + mcount = 1; + + for ( count = 0; count < mcount; count++ ) + { + p = AllocateTempModel(); + + if (!p) + { + cgi.DPrintf( "Out of tempmodels\n" ); + return; + } + + memset( &ent, 0, sizeof( refEntity_t ) ); + memset( &p->lastEnt, 0, sizeof( refEntity_t ) ); + + // Copy over the common data block + p->cgd = m_spawnthing->cgd; + + // Copy over the vectors to the axis + VectorCopy( m_spawnthing->forward, m_spawnthing->axis[0] ); + VectorCopy( m_spawnthing->right, m_spawnthing->axis[1] ); + VectorCopy( m_spawnthing->up, m_spawnthing->axis[2] ); + + // newForward may be changed by spehere or circle + newForward = m_spawnthing->forward; + + // Set up the origin of the tempmodel + if ( m_spawnthing->cgd.flags & T_SPHERE ) + { + // Create a random forward vector so the particles burst out in a sphere + newForward = Vector( crandom(), crandom(), crandom() ); + } + else if ( m_spawnthing->cgd.flags & T_CIRCLE ) + { + if ( m_spawnthing->sphereRadius != 0 ) // Offset by the radius + { + Vector dst; + // Create a circular shaped burst around the up vector + float angle = ( ( float ) count / ( float ) m_spawnthing->count ) * 360;// * M_PI * 2; + + Vector end = m_spawnthing->forward * m_spawnthing->sphereRadius * current_entity_scale; + RotatePointAroundVector( dst, m_spawnthing->up, end, angle ); + + VectorAdd ( dst, m_spawnthing->cgd.origin, p->cgd.origin ); + newForward = p->cgd.origin - m_spawnthing->cgd.origin; + newForward.normalize(); + } + } + else if ( m_spawnthing->cgd.flags & T_INWARDSPHERE ) + { + // Project the origin along a random ray, and set the forward + // vector pointing back to the origin + Vector dir, end; + + dir = Vector( crandom(), crandom(), crandom() ); + + end = m_spawnthing->cgd.origin + dir * m_spawnthing->sphereRadius * current_entity_scale; + VectorCopy ( end, p->cgd.origin ); + newForward = dir * -1; + } + else if ( m_spawnthing->sphereRadius != 0 ) // Offset in a spherical pattern + { + Vector dir, end; + + dir = Vector( crandom(), crandom(), crandom() ); + + dir.normalize(); + + end = m_spawnthing->cgd.origin + dir * m_spawnthing->sphereRadius * current_entity_scale; + VectorCopy ( end, p->cgd.origin ); + newForward = dir; + } + else + { + VectorCopy ( m_spawnthing->cgd.origin, p->cgd.origin ); + } + + // Randomize the origin based on offsets + for ( i=0; i<3; i++ ) + { + if ( m_spawnthing->randorg[i] == RANDOM ) + p->cgd.origin[i] += random() * m_spawnthing->origin_offset[i] * current_entity_scale; + else if ( m_spawnthing->randorg[i] == CRANDOM ) + p->cgd.origin[i] += crandom() * m_spawnthing->origin_offset[i] * current_entity_scale; + else + p->cgd.origin[i] += m_spawnthing->origin_offset[i] * current_entity_scale; + } + + p->cgd.oldorigin = p->cgd.origin; + p->modelname = m_spawnthing->GetModel(); + p->addedOnce = qfalse; + p->lastEntValid = qfalse; + + if ( p->modelname.length() ) + ent.hModel = cgi.R_RegisterModel( p->modelname.c_str() ); + + // Initialize the refEntity + ent.oldframe = ent.frame; + ent.shaderTime = cg.time / 1000.0f; + + // Get the tikihandle + p->cgd.tikihandle = cgi.TIKI_GetHandle( ent.hModel ); + + // Set the reftype based on the modelname + if ( p->modelname == "*beam" ) + { + ent.reType = RT_BEAM; + ent.customShader = cgi.R_RegisterShader( "beamshader" ); + } + else if ( strstr( p->modelname, ".spr" ) ) + { + ent.reType = RT_SPRITE; + } + else + { + ent.reType = RT_MODEL; + } + + // Set the animation + if ( m_spawnthing->animName.length() && ( p->cgd.tikihandle > 0 ) ) + { + ent.anim = cgi.Anim_Random( p->cgd.tikihandle, m_spawnthing->animName ); + } + else if ( ent.reType == RT_MODEL && ( p->cgd.tikihandle > 0 ) ) + { + ent.anim = cgi.Anim_Random( p->cgd.tikihandle, "idle" ); + } + + // Randomize the scale + if ( m_spawnthing->cgd.flags & T_RANDSCALE ) // Check for random scale + { + ent.scale = RandomizeRange( m_spawnthing->cgd.scalemin, m_spawnthing->cgd.scalemax ); + p->cgd.scale = ent.scale; + } + else + { + ent.scale = m_spawnthing->cgd.scale; + } + + ent.scale *= current_entity_scale; + + // CURRENT ENTITY INFLUENCES ON THE TEMPMODELS HAPPEN HERE + // copy over the renderfx from the current_entity, but only the flags we want + if ( current_entity ) + { + // explicitly add RF_LIGHTING ORIGIN and RF_SHADOWPLANE because we don't want those on dynamic objects + ent.renderfx |= ( current_entity->renderfx & ~( RF_FLAGS_NOT_INHERITED | RF_LIGHTING_ORIGIN ) ); + } + + // Set up modulation for constant color + for ( i=0; i<4; i++ ) + { + p->cgd.color[i] = ent.shaderRGBA[i] = m_spawnthing->cgd.color[i]; + } + + // Apply the alpha from the current_entity to the tempmodel + if ( current_entity ) + { + float ealpha; + + ealpha = ( float )current_entity->shaderRGBA[3] / 255.0f; + + if ( ealpha != 1.0 ) + { + // pre-multiply the alpha from the entity + for ( i=0; i<4; i++ ) + { + p->cgd.color[i] = ent.shaderRGBA[i] = ent.shaderRGBA[i] * ealpha; + } + } + } + + p->ent = ent; + p->lastEnt = ent; + p->number = -1; + + // If createTime is specified, the use it. Otherwise use the createTime from the spawnthing. + if ( timeAlive > 0 ) + p->aliveTime = timeAlive; + else + p->aliveTime = 0; + + // If animateonce is set, set the life = to the length of the anim + if ( ( m_spawnthing->cgd.flags & T_ANIMATEONCE ) && ( p->ent.anim > 0 ) ) + { + p->cgd.life = cgi.Anim_Time( p->cgd.tikihandle, p->ent.anim ) * 1000.0f; + } + else + { + p->cgd.life = m_spawnthing->cgd.life; + } + + p->lastAnimTime = p->cgd.createTime; + p->lastPhysicsTime = p->cgd.createTime; + p->killTime = cg.time + p->cgd.life; // The time the tempmodel will die + p->seed = m_seed++; // For use with randomizations + p->cgd.velocity = Vector( 0,0,0 ); // Zero out the velocity + p->touchfcn = m_spawnthing->touchfcn; // Set up the touchfunction + p->perp.x = crandom(); // Create a random perp vector for waves + p->perp.y = crandom(); + p->perp.z = 0; + p->next_bouncesound_time = 0; // Init the next bouncesound time + + if ( p->cgd.flags & T_TWINKLE ) + if ( random() > 0.5f ) + p->cgd.flags |= T_TWINKLE_OFF; + + if ( p->cgd.flags2 & T2_TRAIL ) + { + // Assign a global number to this entity from the command_time_manager + // Tempmodels with trails need their own unique number. + p->number = m_command_time_manager.AssignNumber(); + p->cgd.flags |= T_ASSIGNED_NUMBER; + int oldnum = current_entity_number; + centity_t *oldcent = current_centity; + current_centity = NULL; + current_entity_number = p->number; + + Event *swipeEv = new Event( EV_Client_SwipeOn ); + swipeEv->AddString( p->cgd.swipe_shader ); + swipeEv->AddString( p->cgd.swipe_tag_start ); + swipeEv->AddString( p->cgd.swipe_tag_end ); + swipeEv->AddFloat( p->cgd.swipe_life ); + + commandManager.ProcessEvent( swipeEv ); + + current_centity = oldcent; + current_entity_number = oldnum; + } + + // Check to see if this tiki has any emitters bound to it and update it's number. This is + // used for updating emitters that are attached to tempmodels. + if ( p->cgd.tikihandle >= 0 ) + { + for ( i=1; i<=m_emitters.NumObjects(); i++ ) + { + spawnthing_t *st = m_emitters.ObjectAt( i ); + + if ( st->cgd.tikihandle == p->cgd.tikihandle ) + { + // Assign this tempmodel a number if he doesn't already have one + if ( p->number == -1 ) + p->number = st->AssignNumber(); + + st->GetEmitTime( p->number ); + } + } + } + + + for ( i=0; i<3; i++ ) + { + // Randomize avelocity or set absolute + if ( m_spawnthing->randavel[i] == RANDOM ) + p->cgd.avelocity[i] = m_spawnthing->cgd.avelocity[i] * random() * current_entity_scale; + else if ( m_spawnthing->randavel[i] == CRANDOM ) + p->cgd.avelocity[i] = m_spawnthing->cgd.avelocity[i] * crandom() * current_entity_scale; + else + p->cgd.avelocity[i] = m_spawnthing->cgd.avelocity[i] * current_entity_scale; + + // Randomize angles or set absolute + if ( m_spawnthing->randangles[i] == RANDOM ) + p->cgd.angles[i] = random() * m_spawnthing->cgd.angles[i]; + else if ( m_spawnthing->randangles[i] == CRANDOM ) + p->cgd.angles[i] = crandom() * m_spawnthing->cgd.angles[i]; + else + p->cgd.angles[i] = m_spawnthing->cgd.angles[i]; + } + + // If forward velocity is set, just use that otherwise use random variation of the velocity + if ( m_spawnthing->forwardVelocity != 0 ) + { + for ( i=0; i<3; i++ ) + { + p->cgd.velocity[i] = newForward[i] * m_spawnthing->forwardVelocity * current_entity_scale; + } + } + + if ( p->cgd.flags2 & T2_PARALLEL ) + { + Vector v1 = p->cgd.origin - cg.refdef.vieworg; + vectoangles( v1, p->cgd.angles ); + } + + AnglesToAxis( p->cgd.angles, m_spawnthing->axis ); + AxisCopy( m_spawnthing->axis, p->ent.axis ); + + // Random velocities along axis or world axis + for ( i=0; i<3; i++ ) + { + if ( m_spawnthing->randvel[i] == RANDOM ) + { + if ( m_spawnthing->cgd.flags & T_RANDVELAXIS ) + p->cgd.velocity += Vector( m_spawnthing->tag_axis[i] ) * m_spawnthing->velocityVariation[i] * random() * current_entity_scale; + else + p->cgd.velocity[i] += m_spawnthing->velocityVariation[i] * random() * current_entity_scale; + } + else if ( m_spawnthing->randvel[i] == CRANDOM ) + { + if ( m_spawnthing->cgd.flags & T_RANDVELAXIS ) + p->cgd.velocity += Vector( m_spawnthing->tag_axis[i] ) * m_spawnthing->velocityVariation[i] * crandom() * current_entity_scale; + else + p->cgd.velocity[i] += m_spawnthing->velocityVariation[i] * crandom() * current_entity_scale; + } + else + { + if ( m_spawnthing->cgd.flags & T_RANDVELAXIS ) + p->cgd.velocity += Vector( m_spawnthing->tag_axis[i] ) * m_spawnthing->velocityVariation[i] * current_entity_scale; + else + p->cgd.velocity[i] += m_spawnthing->velocityVariation[i] * current_entity_scale; + } + } + + // If align flag is set, adjust the angles to the direction of velocity + if ( p->cgd.flags & ( T_ALIGN|T_ALIGNONCE ) ) + { + p->cgd.angles = p->cgd.velocity.toAngles(); + } + + // Random offsets along axis + for ( i=0; i<3; i++ ) + { + if ( p->cgd.flags2 & T2_PARALLEL ) + { + if ( m_spawnthing->randaxis[i] == RANDOM ) + p->cgd.origin += Vector( m_spawnthing->axis[i] ) * m_spawnthing->axis_offset[i] * random() * current_entity_scale; + else if ( m_spawnthing->randaxis[i] == CRANDOM ) + p->cgd.origin += Vector( m_spawnthing->axis[i] ) * m_spawnthing->axis_offset[i] * crandom() * current_entity_scale; + else + p->cgd.origin += Vector( m_spawnthing->axis[i] ) * m_spawnthing->axis_offset[i] * current_entity_scale; + } + else + { + if ( m_spawnthing->randaxis[i] == RANDOM ) + p->cgd.origin += Vector( m_spawnthing->tag_axis[i] ) * m_spawnthing->axis_offset[i] * random() * current_entity_scale; + else if ( m_spawnthing->randaxis[i] == CRANDOM ) + p->cgd.origin += Vector( m_spawnthing->tag_axis[i] ) * m_spawnthing->axis_offset[i] * crandom() * current_entity_scale; + else + p->cgd.origin += Vector( m_spawnthing->tag_axis[i] ) * m_spawnthing->axis_offset[i] * current_entity_scale; + } + } + + // Calculate one tick of velocity based on time alive ( passed in ) + p->cgd.origin = p->cgd.origin + ( p->cgd.velocity * ( (float)p->aliveTime/1000.0f ) * current_entity_scale ); + + if ( p->cgd.flags & T_AUTOCALCLIFE ) + { + Vector end,delta; + float length,speed; + vec3_t axis[3]; + trace_t trace; + + AnglesToAxis( p->cgd.angles, axis ); + + end = p->cgd.origin + Vector( axis[0] ) * MAP_SIZE; + CG_Trace( &trace, p->cgd.origin, vec_zero, vec_zero, end, ENTITYNUM_NONE, CONTENTS_SOLID|CONTENTS_WATER, qfalse, qfalse, "AutoCalcLife" ); + + delta = trace.endpos - p->cgd.origin; + length = delta.length(); + speed = p->cgd.velocity.length(); + + p->cgd.life = ( length / speed ) * 1000.0f; + } + + // global fading is based on the number of animations in the current_entity's animation + if ( current_entity ) + { + if ( m_spawnthing->cgd.flags & (T_GLOBALFADEIN|T_GLOBALFADEOUT) ) + { + int numframes = cgi.Anim_NumFrames( current_tiki, current_entity->anim ); + + p->cgd.alpha = (float)current_entity->frame / (float)numframes; + + if ( m_spawnthing->cgd.flags & T_GLOBALFADEOUT ) + { + p->cgd.alpha = 1.0f - p->cgd.alpha; + } + } + } + } + } + +//=============== +//EmitterOn +//=============== +void ClientGameCommandManager::EmitterOn + ( + Event *ev + ) + + { + int i; + str name; + + name = ev->GetString( 1 ); + + for ( i=1; i<=m_emitters.NumObjects(); i++ ) + { + spawnthing_t *st = m_emitters.ObjectAt( i ); + + if ( st->emittername == name ) + { + emittertime_t *et; + + et = st->GetEmitTime( current_entity_number ); + + et->active = qtrue; + et->last_emit_time = cg.time; + et->lerp_emitter = qfalse; + } + } + } + +//=============== +//EmitterOff +//=============== +void ClientGameCommandManager::EmitterOff + ( + Event *ev + ) + + { + int i; + str name; + + name = ev->GetString( 1 ); + + for ( i=1; i<=m_emitters.NumObjects(); i++ ) + { + spawnthing_t *st = m_emitters.ObjectAt( i ); + + if ( st->emittername == name ) + { + emittertime_t *et; + + et = st->GetEmitTime( current_entity_number ); + et->active = qfalse; + + if ( st->cgd.flags & T_BEAMTHING ) + { + // Kill any active beams emitted from this thing + CG_KillBeams( current_entity_number ); + } + } + } + } + +//=============== +// Sound +//=============== +void ClientGameCommandManager::PlaySound + ( + str sound_name, + vec3_t *origin, + int channel, + float volume, + float min_distance + ) + + { + const char *name = NULL; + str random_alias; + + // Get the real sound to play + if ( current_tiki >= 0 ) + name = cgi.TIKI_Alias_FindRandom( current_tiki, sound_name.c_str() ); + + if ( !name ) + name = cgi.Alias_FindRandom( sound_name.c_str() ); + + if ( !name ) + name = sound_name.c_str(); + + if ( origin ) + cgi.S_StartSound( *origin, current_entity_number, channel, cgi.S_RegisterSound( name ), volume, min_distance ); + else + cgi.S_StartSound( NULL, current_entity_number, channel, cgi.S_RegisterSound( name ), volume, min_distance ); + } + +//=============== +// Sound +//=============== +void ClientGameCommandManager::Sound + ( + Event *ev + ) + + { + int channel = CHAN_AUTO; + str sound_name; + float volume = -1.0; + float min_distance = -1.0; + + if (ev->NumArgs() < 1) + return; + + // Get all of the parameters + + sound_name = ev->GetString( 1 ); + + if (ev->NumArgs() > 1) + channel = ev->GetInteger( 2 ); + + if (ev->NumArgs() > 2) + volume = ev->GetFloat( 3 ); + + if (ev->NumArgs() > 3) + min_distance = ev->GetFloat( 4 ); + + // play the sound + if ( current_entity ) + { + PlaySound( sound_name, ¤t_entity->origin, channel, volume, min_distance ); + } + else + { + PlaySound( sound_name, NULL, channel, volume, min_distance ); + } + } + +//=============== +// StopSound +//=============== +void ClientGameCommandManager::StopSound + ( + Event *ev + ) + + { + int channel; + + if (ev->NumArgs() > 0) + channel = ev->GetInteger( 1 ); + else + return; + + cgi.S_StopSound( current_entity_number, channel ); + } + +//=============== +// LoopSound +//=============== +void ClientGameCommandManager::LoopSound + ( + Event *ev + ) + + { + str sound_name; + float volume = -1.0; + float min_dist = -1.0; + const char *name = NULL; + + if ( !current_centity ) + { + cgi.DPrintf( "CCM::LoopSound : LoopSound in %s without current_centity\n", cgi.TIKI_NameForNum( current_tiki ) ); + return; + } + + if ( ev->NumArgs() < 1 ) + return; + + sound_name = ev->GetString( 1 ); + + if ( ev->NumArgs() > 1 ) + volume = ev->GetFloat( 2 ); + + if ( ev->NumArgs() > 2 ) + min_dist = ev->GetFloat( 3 ); + + // Get the real sound to play + + name = cgi.TIKI_Alias_FindRandom( current_tiki, sound_name.c_str() ); + + if ( !name ) + name = cgi.Alias_FindRandom( sound_name.c_str() ); + + if ( !name ) + name = sound_name.c_str(); + + current_centity->tikiLoopSound = cgi.S_RegisterSound( name ); + current_centity->tikiLoopSoundVolume = volume; + current_centity->tikiLoopSoundMinDist = min_dist; + } + +//=============== +// CacheResource +//=============== +void CacheResource + ( + const char * stuff + ) + + { + str real_stuff; + + if ( !stuff ) + return; + + real_stuff = stuff; + real_stuff.tolower(); + + if ( strstr( real_stuff.c_str(), ".wav" ) ) + { + cgi.S_RegisterSound( real_stuff.c_str() ); + } + else if ( strstr( real_stuff.c_str(), ".mp3" ) ) + { + cgi.S_RegisterSound( real_stuff.c_str() ); + } + else if ( strstr( real_stuff.c_str(), ".tik" ) ) + { + int hModel = cgi.R_RegisterModel( real_stuff.c_str() ); + cachedModelList.AddUniqueObject( hModel ); + } + else if ( strstr( real_stuff.c_str(), ".spr" ) ) + { + cgi.R_RegisterShader( real_stuff.c_str() ); + } + } + +//=============== +//Cache +//=============== +void ClientGameCommandManager::Cache + ( + Event *ev + ) + + { + if ( ev->NumArgs() < 1 ) + return; + + CacheResource( ev->GetString( 1 ) ); + } + +//=============== +// AliasResource +//=============== +void AliasResource + ( + int tikihandle, + const char * alias, + const char * realname, + const char * parameters + ) + { + if ( tikihandle >= 0 ) + { + cgi.TIKI_Alias_Add( tikihandle, alias, realname, parameters ); + } + else + { + cgi.Alias_Add( alias, realname, parameters ); + } + } + +//=============== +//AliasCache +//=============== +void ClientGameCommandManager::AliasCache + ( + Event *ev + ) + + { + int i; + char parmbuffer[ 512 ]; // this holds the parameters to be passed into the alias command + + if (ev->NumArgs() < 2) + return; + + // alias is in argument 1 + // real path is argument 2 + // any additional parameters are in arguments 3-n + + parmbuffer[ 0 ] = 0; + + for( i = 3; i <= ev->NumArgs(); i++ ) + { + strcat( parmbuffer, ev->GetToken( i ) ); + strcat( parmbuffer, " " ); + } + + AliasResource( current_tiki, ev->GetString( 1 ), ev->GetString( 2 ), parmbuffer ); + CacheResource( ev->GetString( 2 ) ); + } + +//=============== +//Alias +//=============== +void ClientGameCommandManager::Alias + ( + Event *ev + ) + + { + int i; + char parmbuffer[ 512 ]; // this holds the parameters to be passed into the alias command + + if (ev->NumArgs() < 2) + return; + + // alias is in argument 1 + // real path is argument 2 + // any additional parameters are in arguments 3-n + + parmbuffer[ 0 ] = 0; + + for( i = 3; i <= ev->NumArgs(); i++ ) + { + strcat( parmbuffer, ev->GetToken( i ) ); + strcat( parmbuffer, " " ); + } + + AliasResource( current_tiki, ev->GetString( 1 ), ev->GetString( 2 ), parmbuffer ); + } + +//=============== +//Footstep +//=============== +void ClientGameCommandManager::Footstep + ( + Event *ev + ) + + { + float volume; + + if ( ev->NumArgs() > 0 ) + { + volume = ev->GetFloat( 1 ); + } + else + { + volume = 1.0f; + } + + if ( current_centity ) + { + CG_Footstep( current_centity, volume ); + } + } + + + +//=============== +//Client +//=============== +void ClientGameCommandManager::Client + ( + Event *ev + ) + + { + Event *event; + const char * eventname; + int i; + + // see if it was a dummy command + if ( ev->NumArgs() < 1 ) + return; + + eventname = ev->GetString( 1 ); + event = new Event( eventname ); + + for( i = 2; i <= ev->NumArgs(); i++ ) + { + event->AddToken( ev->GetToken( i ) ); + } + ProcessEvent( event ); + } + +//=============== +//TagDynamicLight +//=============== +void ClientGameCommandManager::TagDynamicLight + ( + Event *ev + ) + + { + str tagname; + + // Spawn a single tempmodel that is a dynamic light + m_spawnthing = InitializeSpawnthing( &m_localemitter ); + + tagname = ev->GetString( 1 ); + GetOrientation( tagname, m_spawnthing ); + + m_spawnthing->cgd.flags |= T_DLIGHT; + m_spawnthing->cgd.color[0] = ev->GetFloat( 2 ) * 255; + m_spawnthing->cgd.color[1] = ev->GetFloat( 3 ) * 255; + m_spawnthing->cgd.color[2] = ev->GetFloat( 4 ) * 255; + m_spawnthing->cgd.color[3] = 255; + m_spawnthing->cgd.lightIntensity = ev->GetFloat( 5 ); + m_spawnthing->cgd.life = ev->GetFloat( 6 ) * 1000; + if ( ev->NumArgs() > 6 ) + { + m_spawnthing->cgd.lightType |= DLightNameToNum( ev->GetString( 7 ) ); + if ( ev->NumArgs() > 7 ) + m_spawnthing->cgd.lightType |= DLightNameToNum( ev->GetString( 8 ) ); + } + else + { + m_spawnthing->cgd.lightType = 0; + } + SpawnTempModel( 1, m_spawnthing ); + } + +//=============== +//OriginDynamicLight +//=============== +void ClientGameCommandManager::OriginDynamicLight + ( + Event *ev + ) + + { + str tagname; + + if ( !current_entity ) + { + cgi.DPrintf( "ClientGameCommandManager::OriginDynamicLight : Illegal use of \"origindlight\"\n" ); + return; + } + + // Spawn a single tempmodel that is a dynamic light + m_spawnthing = InitializeSpawnthing( &m_localemitter ); + + m_spawnthing->cgd.origin = current_entity->origin; + m_spawnthing->cgd.flags |= T_DLIGHT; + m_spawnthing->cgd.color[0] = ev->GetFloat( 1 ) * 255; + m_spawnthing->cgd.color[1] = ev->GetFloat( 2 ) * 255; + m_spawnthing->cgd.color[2] = ev->GetFloat( 3 ) * 255; + m_spawnthing->cgd.color[3] = 255; + m_spawnthing->cgd.lightIntensity = ev->GetFloat( 4 ); + m_spawnthing->cgd.life = ev->GetFloat( 5 ) * 1000; + if ( ev->NumArgs() > 5 ) + { + m_spawnthing->cgd.lightType |= DLightNameToNum( ev->GetString( 6 ) ); + if ( ev->NumArgs() > 6 ) + m_spawnthing->cgd.lightType |= DLightNameToNum( ev->GetString( 7 ) ); + } + else + { + m_spawnthing->cgd.lightType = 0; + } + SpawnTempModel( 1, m_spawnthing ); + } + + +//=============== +//DynamicLight +//=============== +void ClientGameCommandManager::DynamicLight + ( + Event *ev + ) + + { + str tagname; + + // The emitter itself has a dynamic light + m_spawnthing->cgd.flags |= T_DLIGHT; + m_spawnthing->dcolor[0] = ev->GetFloat( 1 ); + m_spawnthing->dcolor[1] = ev->GetFloat( 2 ); + m_spawnthing->dcolor[2] = ev->GetFloat( 3 ); + m_spawnthing->cgd.lightIntensity = ev->GetFloat( 4 ); + if ( ev->NumArgs() > 4 ) + { + m_spawnthing->cgd.lightType |= ( dlighttype_t )ev->GetInteger( 5 ); + if ( ev->NumArgs() > 5 ) + m_spawnthing->cgd.lightType |= DLightNameToNum( ev->GetString( 6 ) ); + } + else + { + m_spawnthing->cgd.lightType = 0; + } + } + +static int emittercount=0; + +//=============== +//UpdateBeam +//=============== +void ClientGameCommandManager::UpdateBeam + ( + int tikihandle, + int entity_number, + spawnthing_t *beamthing + ) + { + Vector start, end; + int renderfx; + qboolean addstartpoint; + float scale,alpha; + emittertime_t *et; + + et = beamthing->GetEmitTime( entity_number ); + + if ( !et->active ) + return; + + if ( current_entity ) + { + renderfx = ( current_entity->renderfx & ~( RF_FLAGS_NOT_INHERITED | RF_LIGHTING_ORIGIN ) ); + scale = current_entity->scale; + alpha = ( float )current_entity->shaderRGBA[3] / 255.0f; + } + else + { + renderfx = 0; + scale = 1.0f; + alpha = 1.0f; + } + + if ( beamthing->startTag == "USE_TAGLIST" ) + { + int i, count; + str startTag, endTag; + Vector dir; + + count = beamthing->m_taglist.NumObjects(); + + if ( !count ) + return; + + startTag = beamthing->m_taglist.ObjectAt( 1 ); + GetOrientation( startTag, beamthing ); + start = beamthing->cgd.origin; + if ( beamthing->beamflags & BEAM_OFFSET_ENDPOINTS ) + { + dir = Vector( crandom(), crandom(), crandom() ); + start += ( crandom() * beamthing->min_offset * dir ) + ( crandom() * beamthing->max_offset * dir ); + } + + CG_MultiBeamBegin(); + addstartpoint = qtrue; + + for( i=2; i<=count; i++ ) + { + str s; + + s = va( "%d", i ); + + endTag = beamthing->m_taglist.ObjectAt( i ); + + GetOrientation( endTag, beamthing ); + end = beamthing->cgd.origin; + + if ( beamthing->beamflags & BEAM_OFFSET_ENDPOINTS ) + { + dir = Vector( crandom(), crandom(), crandom() ); + end += ( crandom() * beamthing->min_offset * dir ) + ( crandom() * beamthing->max_offset * dir ); + } + + CG_MultiBeamAddPoints( start, + end, + beamthing->numSubdivisions, + beamthing->beamflags, + beamthing->min_offset, + beamthing->max_offset, + addstartpoint + ); + + addstartpoint = qfalse; + startTag = endTag; + start = end; + } + + byte newcolor[4]; + + newcolor[0] = beamthing->cgd.color[0] * alpha; + newcolor[1] = beamthing->cgd.color[1] * alpha; + newcolor[2] = beamthing->cgd.color[2] * alpha; + newcolor[3] = beamthing->cgd.color[3] * alpha; + + CG_MultiBeamEnd( beamthing->cgd.scale * scale, + renderfx, + beamthing->cgd.shadername, + newcolor, + beamthing->beamflags, + entity_number, + beamthing->cgd.life ); + } + else + { + if ( beamthing->startTag.length() ) + { + // Use a dummy sp to get the orientation + GetOrientation( beamthing->startTag, beamthing ); + start = beamthing->cgd.origin; + } + else + { + start = beamthing->cgd.origin; + } + + if ( beamthing->endTag.length() ) + { + // Use a dummy sp to get the orientation + GetOrientation( beamthing->endTag, beamthing ); + end = beamthing->cgd.origin; + } + else + { + end = start + beamthing->forward * beamthing->length; + } + + CG_CreateBeam( start, + vec_zero, + entity_number, + 1, + beamthing->cgd.alpha * alpha, + beamthing->cgd.scale * scale, + (beamthing->beamflags|BEAM_LIGHTNING_EFFECT), + beamthing->length, + beamthing->cgd.life, + qfalse, + end, + beamthing->min_offset, + beamthing->max_offset, + beamthing->overlap, + beamthing->numSubdivisions, + beamthing->delay, + beamthing->cgd.shadername, + beamthing->cgd.color, + beamthing->numspherebeams, + beamthing->sphereRadius, + beamthing->toggledelay, + beamthing->endalpha, + renderfx, + beamthing->emittername + ); + } + } + + +//=============== +//UpdateEmitter +//=============== +void ClientGameCommandManager::UpdateEmitter + ( + int tikihandle, + vec3_t axis[3], + int entity_number, + int parent_number, + Vector entity_origin + ) + + { + int parent,lastparent,i; + emittertime_t *et=NULL; + centity_t *pc; + int count=0; + float scale=1.0f; + + if ( current_entity ) + scale = current_entity->scale; + + // Find the emitter associated with this model + for ( i=1; i<=m_emitters.NumObjects(); i++ ) + { + m_spawnthing = m_emitters.ObjectAt( i ); + + if ( m_spawnthing->cgd.tikihandle != tikihandle ) + { + continue; + } + + et = m_spawnthing->GetEmitTime( entity_number ); + + if ( !et->active ) + continue; + + if ( ( m_spawnthing->cgd.flags & T_DETAIL ) && !cg_detail->integer ) + { + et->last_emit_time = 0; + continue; + } + + // Set the default origin (spawn from the parent's origin) + VectorCopy( entity_origin, m_spawnthing->cgd.origin ); + + if ( m_spawnthing->cgd.flags & T_BEAMTHING ) + { + if ( m_spawnthing->cgd.flags & T_ANGLES ) + { + vec3_t axis[3]; + + AnglesToAxis( m_spawnthing->cgd.angles, axis ); + + m_spawnthing->forward = axis[0]; + m_spawnthing->right = axis[1]; + m_spawnthing->up = axis[2]; + } + + UpdateBeam( tikihandle, entity_number, m_spawnthing ); + continue; + } + if ( m_spawnthing->tagname.length() ) + { + // Set the axis and origin based on the tag's axis and origin + GetOrientation( m_spawnthing->tagname, m_spawnthing ); + } + else if ( axis ) + { + // Set the axis based on the entity's axis. + m_spawnthing->forward = axis[0]; + m_spawnthing->right = axis[1]; + m_spawnthing->up = axis[2]; + } + else + { + m_spawnthing->forward = Vector( 1,0,0 ); + m_spawnthing->right = Vector( 0,1,0 ); + m_spawnthing->up = Vector( 0,0,1 ); + } + + // If we are HARDLINKed then subtract off the parent's origin + if ( m_spawnthing->cgd.flags & T_HARDLINK ) + { + m_spawnthing->cgd.parent = entity_number; + m_spawnthing->cgd.origin -= entity_origin; + } + else if ( m_spawnthing->cgd.flags & T_PARENTLINK ) + { + lastparent = ENTITYNUM_NONE; + + parent = parent_number; + + // Find the topmost parent + while ( parent != ENTITYNUM_NONE ) + { + pc = &cg_entities[ parent ]; + lastparent = parent; + parent = pc->currentState.parent; + } + + // The lastparent is the "real" parent + if ( lastparent != ENTITYNUM_NONE) + { + pc = &cg_entities[ lastparent ]; + + m_spawnthing->cgd.origin -= pc->lerpOrigin; + m_spawnthing->cgd.parent = lastparent; + } + } + + m_spawnthing->cgd.createTime = cg.time; + m_spawnthing->cgd.parentOrigin = Vector( entity_origin ); + + if ( m_spawnthing->cgd.flags & T_DLIGHT ) + { + cgi.R_AddLightToScene( m_spawnthing->cgd.origin, + m_spawnthing->cgd.lightIntensity * scale, + m_spawnthing->dcolor[0], + m_spawnthing->dcolor[1], + m_spawnthing->dcolor[2], + m_spawnthing->cgd.lightType + ); + continue; + } + + Vector save_origin = m_spawnthing->cgd.origin; + Vector delta = m_spawnthing->cgd.origin - et->oldorigin; + + if ( m_spawnthing->spawnRate < 0 ) + { + warning( "ClientGameCommandManager::UpdateEmitter", "Invalid spawnrate (negative)" ); + continue; + } + + if ( paused->integer ) + { + et->last_emit_time = 0; + } + else if ( ( et->last_emit_time > 0 ) && ( m_spawnthing->spawnRate ) ) + { + int dtime = cg.time - et->last_emit_time; + float lerp, lerpfrac; + + if ( et->last_emit_time > cg.time ) + et->last_emit_time = cg.time; + + count = dtime / ( m_spawnthing->spawnRate * ( 1.0f / cg_effectdetail->value ) ); + + // This is kind of a nasty bit of code. If the count is 1, just spawn + // a single tempmodel, if it's greater than 1, then spawn the number + // of tempmodels over a period of time, and adjust their create times + // accordingly. Also lerp the origins so they appear where they are + // supposed to. This helps smoothing out low frame rate situations + // where this is only get called a few times a second, but the spawn + // rate is high, and it will look a lot smoother. + if ( !count ) + { + continue; + } + else if ( count == 1 ) + { + SpawnTempModel( 1 ); + et->last_emit_time = cg.time; + } + else + { + lerpfrac = 1.0f / (float)count; + + lerp = 0; + while ( dtime > ( m_spawnthing->spawnRate * ( 1.0f / cg_effectdetail->value ) ) ) + { + et->last_emit_time = cg.time; + + dtime -= m_spawnthing->spawnRate * ( 1.0f / cg_effectdetail->value ); + + if ( et->lerp_emitter ) + m_spawnthing->cgd.origin = et->oldorigin + ( delta * lerp ); + + SpawnTempModel( 1, dtime ); + + lerp += lerpfrac; + } + } + } + else + { + et->last_emit_time = cg.time; + } + + if ( cg_showemitters->integer ) + { + if ( count ) + cgi.DPrintf( "%d:%s:%d tempmodels emitted\n", entity_number, m_spawnthing->emittername.c_str(), count ); + } + + // Since we have an oldorigin, now we can do lerping + m_spawnthing->cgd.origin = save_origin; + et->oldorigin = save_origin; + et->lerp_emitter = qtrue; + } + } + +//=============== +// RemoveClientEntity - Removes an entity from being +// updated if it has emitters attached +//=============== +void ClientGameCommandManager::RemoveClientEntity + ( + int number, + int tikihandle, + centity_t *cent, + ctempmodel_t *p + ) + + { + int i; + + // Kill the emitters if they are attached to this tiki + if ( number != -1 ) + { + for ( i=1; i<=m_emitters.NumObjects(); i++ ) + { + spawnthing_t *st = m_emitters.ObjectAt( i ); + + if ( st->cgd.tikihandle == tikihandle ) + { + st->RemoveEntity( number ); + } + } + } + + // Turn off any swiping for this entity number + int oldnum = current_entity_number; + centity_t *oldcent = current_centity; + + current_centity = cent; + current_entity_number = number; + ProcessEvent( EV_Client_SwipeOff ); + current_entity_number = oldnum; + current_centity = oldcent; + + // If this tempmodel was assigned a temporary number then remove it from the command_time_manager + if ( p && p->cgd.flags & T_ASSIGNED_NUMBER ) + { + m_command_time_manager.RemoveEntity( number ); + } + } + +//=============== +// FreeAllTempModels +//=============== +void ClientGameCommandManager::FreeAllTempModels + ( + void + ) + + { + ctempmodel_t *p, *next; + + // Go through all the temp models and run the physics if necessary, + // then add them to the ref + p = m_active_tempmodels.prev; + for ( ; p != &m_active_tempmodels; p = next ) + { + // grab next now, so if the local entity is freed we still have it + next = p->prev; + FreeTempModel( p ); + } + } + +//=============== +// RestartAllEmitters +//=============== +void ClientGameCommandManager::RestartAllEmitters + ( + int timedelta + ) + + { + int i; + + for( i = 1; i <= m_emitters.NumObjects(); i++ ) + { + spawnthing_t *st = m_emitters.ObjectAt( i ); + + if ( st->cgd.createTime > cg.time ) + { + st->cgd.createTime -= timedelta; + st->lastTime -= timedelta; + } + } + } + +//=============== +// FreeAllEmitters +//=============== +void ClientGameCommandManager::FreeAllEmitters + ( + void + ) + + { + m_emitters.ClearObjectList(); + } + +//=============== +//CG_RestartCommandManager +//=============== +void CG_RestartCommandManager + ( + int timedelta + ) + + { + commandManager.FreeAllTempModels(); + commandManager.RestartAllEmitters( timedelta ); + } + + +//=============== +//CG_FlushCommandManager +//=============== +void CG_FlushCommandManager + ( + void + ) + + { + commandManager.FreeAllTempModels(); + commandManager.FreeAllEmitters(); + } + + +void ProcessInitCommands + ( + int tikihandle + ) + + { + int i, j, num_args; + + // Process all the client side init commands + if ( tikihandle >= 0 ) + { + tiki_cmd_t tikicmds; + + if ( cgi.InitCommands( tikihandle, &tikicmds ) ) + { + for ( i = 0; i < tikicmds.num_cmds; i++ ) + { + Event *ev; + + num_args = tikicmds.cmds[ i ].num_args; + + // Create the event and Process it. + ev = new Event( tikicmds.cmds[ i ].args[ 0 ] ); + + for ( j=1; jAddToken( tikicmds.cmds[ i ].args[ j ] ); + + current_tiki = tikihandle; + commandManager.ProcessEvent( ev ); + current_tiki = -1; + } + } + } + } + +//================= +//CG_ProcessInitCommands +//================= +void CG_ProcessInitCommands + ( + int tikihandle + ) + + { + int i; + + ProcessInitCommands( tikihandle ); + // If any models were cached in this TIKI, then we have to Process their INIT commands too + + for( i=1; i<=cachedModelList.NumObjects(); i++ ) + { + int tikihandle; + int hModel = cachedModelList.ObjectAt( i ); + tikihandle = cgi.TIKI_GetHandle( hModel ); + ProcessInitCommands( tikihandle ); + } + + cachedModelList.ClearObjectList(); + } + +//================= +//CG_UpdateEntity +//================= +void CG_UpdateEntity + ( + int tikihandle, + refEntity_t *ent, + centity_t *cent + ) + { + // Check to see if this model has any emitters + current_entity = ent; + current_tiki = tikihandle; + + if ( cent->currentState.parent != ENTITYNUM_NONE ) + { + commandManager.UpdateEmitter( tikihandle, ent->axis, cent->currentState.number, cent->currentState.parent, ent->origin ); + } + else + { + commandManager.UpdateEmitter( tikihandle, ent->axis, cent->currentState.number, cent->currentState.parent, cent->lerpOrigin ); + } + current_entity = NULL; + current_tiki = -1; + } + +extern "C" + { + void CG_AnimationDebugMessage( int number, const char *fmt, ... ); + } + +//================= +//CG_ProcessEntityCommands +//================= +void CG_ProcessEntityCommands + ( + int tikihandle, + int frame, + int anim, + int entnum, + refEntity_t *ent, + centity_t *cent + ) + { + int i,j; + int num_args; + + tiki_cmd_t tikicmds; + + if ( cgi.Frame_Commands( tikihandle, anim, frame, &tikicmds ) ) + { + current_entity = ent; + current_centity = cent; + current_entity_number = entnum; + current_tiki = tikihandle; + CG_AnimationDebugMessage( entnum, "Processing Ent Commands: Entity: %3d Anim:#(%i) Frame:#(%i)\n", anim, frame ); + + for ( i = 0; i < tikicmds.num_cmds; i++ ) + { + Event *ev; + + num_args = tikicmds.cmds[ i ].num_args; + + if ( num_args > 0 ) + { + // Create the event and Process it. + ev = new Event( tikicmds.cmds[ i ].args[ 0 ] ); + + for ( j=1; jAddToken( tikicmds.cmds[ i ].args[ j ] ); + } + + commandManager.ProcessEvent( ev ); + } + } + + current_tiki = -1; + current_entity_number = -1; + current_entity = NULL; + current_centity = NULL; + } + } + +//================= +//CG_ClientCommandDebugMessage +//================= +void CG_ClientCommandDebugMessage + ( + centity_t *cent, + const char *fmt, + ... + ) + { +#ifndef NDEBUG + if ( cg_debugAnim->integer ) + { + va_list argptr; + char msg[1024]; + + va_start (argptr,fmt); + vsprintf (msg,fmt,argptr); + va_end (argptr); + + if ( ( !cg_debugAnimWatch->integer ) || ( ( cg_debugAnimWatch->integer - 1 ) == cent->currentState.number ) ) + { + if ( cg_debugAnim->integer == 2 ) + { + cgi.DebugPrintf( msg ); + } + else + { + cgi.Printf( msg ); + } + } + } +#endif + } + + +//================= +//CG_ClientCommands +//================= +void CG_ClientCommands + ( + int tikihandle, + int new_frame, + int new_anim, + animstate_t *state, + refEntity_t *ent, + centity_t *cent + ) + + { + int anim; + int frame; + + if ( tikihandle < 0 ) + return; + + if ( paused->integer ) + return; + + if ( cent->currentState.eFlags & EF_DONT_PROCESS_COMMANDS ) + return; + + assert( cent ); + + // don't do anything if the frame is illegal + if ( ( new_frame < 0 ) || ( new_frame >= state->numframes ) ) + return; + +#if 0 +#ifndef NDEBUG + CG_ClientCommandDebugMessage( + cent, + "Client Commands: cg.time %d checking Entity %d anim %d frame %d\n", + cg.time, + cent->currentState.number, + new_anim, + new_frame + ); +#endif +#endif + + anim = state->last_cmd_anim - 1; + frame = state->last_cmd_frame; + + // if we had a last anim and it it wasn't same as ours then + // we need to run any exit commands from the last animation + if ( ( anim != new_anim ) && ( anim >= 0 ) ) + { + // play the exit command + CG_ProcessEntityCommands( tikihandle, TIKI_FRAME_CMD_EXIT, anim, cent->currentState.number, ent, cent ); +#ifndef NDEBUG + CG_ClientCommandDebugMessage( + cent, + "Client Commands: Entity %d Exiting Anim: %s\n", + cent->currentState.number, + cgi.Anim_NameForNum( tikihandle, anim ) + ); +#endif + frame = 0; + + // Reset the tiki looping sound if changing animation + cent->tikiLoopSound = NULL; + } + + if ( state->has_commands ) + { + // if we are entering a new animation, than + // we need to run any entry commands for the new animation + if ( anim != new_anim ) + { + // play the exit command + CG_ProcessEntityCommands( tikihandle, TIKI_FRAME_CMD_ENTRY, new_anim, cent->currentState.number, ent, cent ); +#ifndef NDEBUG + CG_ClientCommandDebugMessage( + cent, + "Client Commands: Entity %d Entering Anim: %s\n", + cent->currentState.number, + cgi.Anim_NameForNum( tikihandle, new_anim ) + ); +#endif + } + + if ( state->driven ) + { + // make sure we process this frame if we are on a new frame + // although this is a hack, it guarantees that the frame will be processed + // below. + frame %= state->numframes; + if ( frame < new_frame ) + frame = new_frame; + } + else + { + // + // we need to catch up on the frames we haven't played yet + // + if ( ( new_frame != ( frame - 1 ) ) && ( state->numframes > 1 ) ) + { + // and frame number so that it wraps properly + frame %= state->numframes; + + // lerp to one minus the current frame + while ( frame != new_frame ) + { +#ifndef NDEBUG + CG_ClientCommandDebugMessage( + cent, + "Client Commands: cg.time %d Catching up Entity: %d Anim: %s frame: %d numframes: %d\n", + cg.time, + cent->currentState.number, + cgi.Anim_NameForNum( tikihandle, new_anim ), + frame, + state->numframes + ); +#endif + state->last_cmd_time = cg.time + TIKI_FRAME_CMD_MAXFRAMERATE; + CG_ProcessEntityCommands( tikihandle, frame, new_anim, cent->currentState.number, ent, cent ); + frame = ( frame + 1 ) % state->numframes; + } + } + } + + // + // handle the single frame and every frame case + // + if ( + ( frame == new_frame ) || + ( + ( cg.time > state->last_cmd_time ) && + ( cent->currentState.eFlags & EF_EVERYFRAME ) + ) + ) + { +#ifndef NDEBUG + CG_ClientCommandDebugMessage( + cent, + "Client Commands: cg.time %d Processing Entity: %d Anim: %s frame: %d numframes: %d\n", + cg.time, + cent->currentState.number, + cgi.Anim_NameForNum( tikihandle, new_anim ), + new_frame, + state->numframes + ); +#endif + state->last_cmd_time = cg.time + TIKI_FRAME_CMD_MAXFRAMERATE; + CG_ProcessEntityCommands( tikihandle, new_frame, new_anim, cent->currentState.number, ent, cent ); + } + } + + if ( cent->clientFlags & CF_UPDATESWIPE ) + { + current_entity = ent; + current_centity = cent; + current_entity_number = cent->currentState.number; + current_tiki = tikihandle; + + commandManager.ProcessEvent( EV_Client_Swipe ); + + current_tiki = -1; + current_entity_number = -1; + current_entity = NULL; + current_centity = NULL; + } + + state->last_cmd_anim = new_anim + 1; + state->last_cmd_frame = new_frame + 1; + } + +//=============== +//CG_AddTempModels +//=============== +void CG_AddTempModels + ( + void + ) + + { + commandManager.AddTempModels(); + } + +//=============== +//CG_InitializeCommandManager +//=============== +void CG_InitializeCommandManager + ( + void + ) + + { + cg_showtempmodels = cgi.Cvar_Get( "cg_showtempmodels", "0", 0 ); + cg_showemitters = cgi.Cvar_Get( "cg_showemitters", "0", 0 ); + cg_physics_fps = cgi.Cvar_Get( "cg_physics_fps", "10", CVAR_ARCHIVE ); + cg_detail = cgi.Cvar_Get( "detail", "1", CVAR_ARCHIVE ); + cg_effectdetail = cgi.Cvar_Get( "cg_effectdetail", "1", CVAR_ARCHIVE ); + + commandManager.InitializeTempModels(); + commandManager.InitializeEmitters(); + CG_InitTestEmitter(); + CG_InitializeClientEmitters(); + } + +void CG_ResetTempModels + ( + void + ) + + { + commandManager.ResetTempModels(); + lastFrameTime = cg.time; + } + +//=============== +//CG_RemoveClientEntity +//=============== +void CG_RemoveClientEntity + ( + int number, + int tikihandle, + centity_t *cent + ) + + { + commandManager.RemoveClientEntity( number, tikihandle, cent ); + + // Remove the beam list associated with this entity + RemoveBeamList( number ); + } + +//================= +//CG_Command_ProcessFile +//================= +qboolean CG_Command_ProcessFile( const char * filename, qboolean quiet ) + { + char *buffer; + const char *bufstart; + char com_token[MAX_STRING_CHARS]; + + if ( cgi.FS_ReadFile( filename, ( void ** )&buffer, quiet ) == -1 ) + { + return qfalse; + } + + if ( !quiet ) + cgi.DPrintf( "CG_Command_ProcessFile: %s\n", filename ); + + // we are not setting up for a tiki + current_tiki = -1; + + bufstart = buffer; + + while ( 1 ) + { + Event *ev; + + // grab each line as we go + strcpy( com_token, COM_ParseExt( &buffer, qtrue ) ); + if (!com_token[0]) + break; + + if ( + !strcmpi( com_token, "end" ) || + !strcmpi( com_token, "server" ) + ) + { + // skip the line + while( 1 ) + { + strcpy( com_token, COM_ParseExt( &buffer, qfalse ) ); + if (!com_token[0]) + break; + } + continue; + } + + // Create the event + ev = new Event( com_token ); + + // get the rest of the line + while( 1 ) + { + strcpy( com_token, COM_ParseExt( &buffer, qfalse ) ); + if (!com_token[0]) + break; + + ev->AddToken( com_token ); + } + commandManager.ProcessEvent( ev ); + } + cgi.FS_FreeFile( ( void * )bufstart ); + + return qtrue; + } + + +//=========================== +//CG_ConsoleCommand Functions +//=========================== +void CG_EventList_f( void ) + { + const char *mask; + + mask = NULL; + if ( cgi.Argc() > 1 ) + { + mask = cgi.Argv( 1 ); + } + Event::ListCommands( mask ); + } + +void CG_EventHelp_f( void ) + { + const char *mask; + + mask = NULL; + if ( cgi.Argc() > 1 ) + { + mask = cgi.Argv( 1 ); + } + Event::ListDocumentation( mask ); + } + +void CG_DumpEventHelp_f( void ) + { + const char *mask; + + mask = NULL; + if ( cgi.Argc() > 1 ) + { + mask = cgi.Argv( 1 ); + } + Event::ListDocumentation( mask, true ); + } + +void CG_PendingEvents_f( void ) + { + const char *mask; + + mask = NULL; + if ( cgi.Argc() > 1 ) + { + mask = cgi.Argv( 1 ); + } + Event::PendingEvents( mask ); + } + +void CG_ClassList_f( void ) + { + listAllClasses(); + } + +void CG_ClassTree_f( void ) + { + if ( cgi.Argc() > 1 ) + { + listInheritanceOrder( cgi.Argv( 1 ) ); + } + else + { + cgi.Printf( "Syntax: cg_classtree [classname].\n" ); + } + } + +void CG_ClassEvents_f( void ) + { + if ( cgi.Argc() > 1 ) + { + ClassEvents( cgi.Argv( 1 ) ); + } + else + { + Com_Printf( "Syntax: cg_classevents [classname].\n" ); + } + } + +void CG_DumpClassEvents_f( void ) + { + if ( cgi.Argc() > 1 ) + { + ClassEvents( cgi.Argv( 1 ), qtrue ); + } + else + { + Com_Printf( "Syntax: cg_dumpclassevents [classname].\n" ); + } + } + +void CG_DumpAllClasses_f( void ) + { + DumpAllClasses(); + } + +#define throw_assert assert ( 0 ), throw + +EmitterLoader emitterLoader; + +Event EV_EmitterLoader_Emitter + ( + "emitter", + EV_DEFAULT, + "s", + "emittername", + "Create a new emitter" + ); + +CLASS_DECLARATION( Listener, EmitterLoader, NULL ) + { + { &EV_EmitterLoader_Emitter, Emitter }, + { NULL, NULL } + }; + +EmitterLoader::EmitterLoader + ( + ) + + { + emitterActive = false; + } + +void EmitterLoader::Emitter + ( + Event *ev + ) + + { + spawnthing_t *st; + + st = commandManager.CreateNewEmitter( ev->GetString( 1 ) ); + + if ( st ) + { + emitterActive = true; + commandManager.SetSpawnthing( st ); + } + } + +void EmitterLoader::ProcessEmitter + ( + Script &script + ) + + { + str token; + + while ( script.TokenAvailable ( true ) ) + { + Event *ev = NULL; + + token = script.GetToken ( true ); + + if ( !str::cmp( "}", token ) ) + break; + + ev = new Event ( token ); + + while ( script.TokenAvailable ( false ) ) + ev->AddToken ( script.GetToken ( false ) ); + + if ( emitterActive ) + { + commandManager.ProcessEvent( ev ); + } + } + + commandManager.SetSpawnthing( NULL ); + emitterActive = NULL; + } + +bool EmitterLoader::Load + ( + Script &script + ) + + { + str token; + str errortext; + + try + { + while ( script.TokenAvailable ( true ) ) + { + Event *ev = NULL; + + token = script.GetToken ( true ); + + if ( !str::cmp( "{", token ) ) + { + ProcessEmitter( script ); + } + else if ( !token.length () || !ValidEvent ( token ) ) + { + throw_assert "invalid token"; + } + else + { + ev = new Event ( token ); + + while ( script.TokenAvailable ( false ) ) + ev->AddToken ( script.GetToken ( false ) ); + + ProcessEvent ( ev ); + } + } + } + catch ( const char *s ) + { + cgi.DPrintf ( "emitter: error on line %d: %s\n", script.GetLineNumber (), s ); + return false; + } + + return true; + } + +void CG_InitializeClientEmitters + ( + void + ) + + { + Script script; + + Com_Printf ( "Loading client emitters...\n" ); + script.LoadFile ( "global/emitters.scr" ); + emitterLoader.Load ( script ); + } + +void CG_Emitter + ( + centity_t *cent + ) + + { + spawnthing_t *emitter; + float dtime; + emittertime_t *et; + vec3_t mins, maxs; + + emitter = commandManager.GetEmitterByName( CG_ConfigString( CS_IMAGES + cent->currentState.tag_num ) ); + + if ( emitter ) + { + vec3_t axis[3]; + cgi.R_ModelBounds( cgs.inlineDrawModel[cent->currentState.modelindex], mins, maxs ); + + emitter->cgd.origin[0] = cent->lerpOrigin[0] + mins[0] + ( random() * ( maxs[0] - mins[0] ) ); + emitter->cgd.origin[1] = cent->lerpOrigin[1] + mins[1] + ( random() * ( maxs[1] - mins[1] ) ); + emitter->cgd.origin[2] = cent->lerpOrigin[2] + maxs[2]; + emitter->cgd.parentOrigin = Vector( cent->lerpOrigin ); + emitter->cgd.parentOrigin[2] = cent->lerpOrigin[2] + maxs[2]; + emitter->cgd.parentMins = mins; + emitter->cgd.parentMaxs = maxs; + + AnglesToAxis( cent->lerpAngles, axis ); + emitter->forward = axis[0]; + emitter->right = axis[1]; + emitter->up = axis[2]; + + // Update the emitter time and spawn the tempmodels + et = emitter->GetEmitTime( cent->currentState.number ); + + if ( et->last_emit_time > 0 ) + { + dtime = cg.time - et->last_emit_time; + while ( dtime > emitter->spawnRate ) + { + dtime -= emitter->spawnRate; + commandManager.SpawnTempModel( 1, emitter ); + et->last_emit_time = cg.time; + } + } + } + } + + +void ClientGameCommandManager::CGEvent + ( + centity_t *cent + ) + + { + str modelname; + vec3_t axis[3]; + int tikihandle; + + tikihandle = cgs.model_tiki[cent->currentState.modelindex]; + + if ( tikihandle == -1 ) + return; + + CG_EntityEffects( cent ); + + modelname = cgi.TIKI_NameForNum( tikihandle ); + m_spawnthing = InitializeSpawnthing( &m_localemitter ); + + AnglesToAxis( cent->lerpAngles, axis ); + m_spawnthing->cgd.angles = cent->lerpAngles; + m_spawnthing->forward = axis[0]; + m_spawnthing->right = axis[1]; + m_spawnthing->up = axis[2]; + m_spawnthing->cgd.origin = cent->lerpOrigin; + m_spawnthing->cgd.scale = cent->currentState.scale; + m_spawnthing->cgd.alpha = cent->currentState.alpha; + + m_spawnthing->cgd.color[0] = cent->color[0] * 255; + m_spawnthing->cgd.color[1] = cent->color[1] * 255; + m_spawnthing->cgd.color[2] = cent->color[2] * 255; + m_spawnthing->cgd.color[3] = cent->color[3] * 255; + + Event *ev; + ev = new Event( "model" ); + ev->AddString( modelname ); + ProcessEvent( ev ); + + ev = new Event( "anim" ); + ev->AddString( "idle" ); + ProcessEvent( ev ); + + SpawnTempModel( 1 ); + } + +void CG_Event + ( + centity_t *cent + ) + + { + commandManager.CGEvent( cent ); + } diff --git a/source/source/cgame/cg_commands.h b/source/source/cgame/cg_commands.h new file mode 100644 index 0000000..b4a8ec0 --- /dev/null +++ b/source/source/cgame/cg_commands.h @@ -0,0 +1,1061 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/cgame/cg_commands.h $ +// $Revision:: 75 $ +// $Author:: Aldie $ +// $Date:: 7/29/00 9:04p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/cgame/cg_commands.h $ +// +// 75 7/29/00 9:04p Aldie +// Added originbeamemitter +// +// 74 7/25/00 11:30p Aldie +// Made some memory changes and fixed some memory allocation bugs +// +// 73 7/22/00 5:50p Markd +// added flushtikis support +// +// 72 7/19/00 9:52p Aldie +// Put ET_EVENTS back in. They will get sent over once, and should get +// processed once on the client. +// +// 71 7/17/00 3:26p Aldie +// Added detail command +// +// 70 7/15/00 12:32p Aldie +// Fixed a bug for restarting tempmodels on a save game +// +// 69 7/11/00 9:57p Aldie +// Removed assertion +// +// 68 7/11/00 8:17p Aldie +// Fixed emitter bug (what else), where I was accidentally removing numbers +// from the global pool when a tempent was being removed. +// +// 67 6/27/00 2:34p Markd +// clear out swipes when restarting +// +// 66 6/26/00 7:14p Markd +// added parentangles command +// +// 65 6/17/00 1:54p Markd +// Added server restarted code +// +// 64 6/15/00 8:21p Markd +// Added CleanupCommandManager support +// +// 63 6/14/00 12:14p Markd +// more intel compiler bug fixes +// +// 62 6/10/00 5:52p Aldie +// Made some improvements to help speed, added tag_axis, removed notagangles +// command. Removed some unused code. Changed the method of adding +// tempmodels. +// +// 61 6/09/00 7:53p Aldie +// Added origin to playsound and fixed bouncesound and a couple other sound +// things +// +// 60 6/03/00 8:19p Markd +// Added footstep code +// +// 59 6/02/00 6:52p Aldie +// Added in parallel command +// +// 58 6/01/00 7:45p Aldie +// Made it so that swipes are removed when client entities are reset. +// +// 57 5/30/00 2:47p Aldie +// Fix for animateTempModel() +// +// 56 5/22/00 6:38p Aldie +// Added originbeamspawn +// +// 55 5/20/00 4:42p Aldie +// Removed some unused flags and code. Fixed emitters that have parentlink or +// hardlink +// +// 54 5/18/00 3:32p Aldie +// Added bouncedecal +// +// 53 5/18/00 11:47a Aldie +// Added tempmodelsRealtimeEffects proc +// +// 52 5/16/00 3:40p Aldie +// Changed method of calculating physicsTime. And added physicsrate command +// +// 51 5/15/00 2:19p Aldie +// Added new tempmodel system and added player accumulated pain +// +// 49 5/04/00 7:46p Aldie +// Added tagnoangles command +// +// 48 5/04/00 4:34p Aldie +// Added trail command that uses swipe code to do a trail +// +// 47 4/27/00 7:42p Aldie +// Added trace_count functionality for multiple spawns for tagtraceimpactmark +// and spawn +// +// 46 3/31/00 4:56p Steven +// Added UseLastTraceEnd so that tracecommands could use the end point of the +// previous command. +// +// 45 3/27/00 1:50p Aldie +// Removed some unused code +// +// 44 3/16/00 6:51p Aldie +// Added some shortcut flags for tempmodel optimization +// +// 43 3/16/00 5:09p Aldie +// Added some optimizations for tempmodels +// +// 42 3/15/00 11:01a Aldie +// Changed m_emitters to container instead of array. +// +// 41 3/14/00 3:22p Aldie +// Changed some client side emitter functionality and added func_emitter +// +// 40 3/13/00 1:54p Aldie +// Fixes for rain +// +// 39 3/11/00 4:47p Aldie +// Fix for scaleupdown +// +// 38 3/11/00 4:06p Aldie +// Added scaleupdown code +// +// 37 3/04/00 6:03p Aldie +// Made commandManager static +// +// 36 3/04/00 2:53p Markd +// Fixed dynamic light types +// +// 35 3/04/00 2:33p Aldie +// Added lightstyle support +// +// 34 3/03/00 2:40p Aldie +// Added in tagtraceimpactsound command +// +// 33 3/01/00 5:55p Aldie +// Added alignonce flag for aligning models one time, but not every frame. Use +// if you have avelocity on a tempmodel +// +// 32 2/29/00 12:22p Aldie +// Added taglist to beam emitters. Allows for a list of tags to be named for a +// chain of beams +// +// 31 2/25/00 5:01p Aldie +// Changed some of the dlight stuff and added a new command +// +// 30 2/22/00 6:54p Aldie +// Added a bool to tempmodels so that they will get added at least one time to +// the ref. This is useful for getting things to show up in low framerate +// situations. +// +// 29 2/20/00 5:40p Aldie +// Fixed the twinkle command +// +// 28 2/11/00 3:22p Aldie +// Changed swipe code a bit, and added cg_hidetempmodels cvar. +// +// 27 2/10/00 5:45p Aldie +// added tagtraceimpactspawn +// +// 26 2/09/00 4:27p Aldie +// Fixed pause on the client emitters +// +// 25 2/07/00 7:38p Aldie +// Fixed swiping, also various weapons fixes for sword and for sling +// +// 24 1/29/00 10:16a Steven +// Added stop sound support in cgame. +// +// 23 1/28/00 7:16p Aldie +// Added more features to the impact decal code +// +// 22 1/27/00 4:20p Aldie +// Added tagtraceimpactmark +// +// 21 1/27/00 3:21p Aldie +// Added twinkle +// +// 20 1/26/00 11:35a Aldie +// New data structures for emitters +// +// 19 1/24/00 7:42p Aldie +// Removed assertion +// +// 18 1/24/00 6:19p Aldie +// Added some new commands - commanddelay and randomchance +// +// 17 1/22/00 1:48p Aldie +// Removed .vec3 references, fixed bouncesound and added bouncesoundonce +// +// 16 1/22/00 10:37a Aldie +// Changed default life +// +// 15 1/21/00 7:53p Aldie +// Added randvelaxis command +// +// 14 1/20/00 11:03a Markd +// Added Bouncesound but then took it out temporarily +// +// 13 1/15/00 2:39p Aldie +// Added fadedelay and Cachedmodellist for init command processing +// +// 12 10/29/99 7:16p Aldie +// Updated rope stuff +// +// 11 10/19/99 11:57a Aldie +// Added some more beam features +// +// 10 10/13/99 3:26p Aldie +// Various fixes for particles, beams and lensflares +// +// 9 10/11/99 3:38p Aldie +// Fix for some command doc stuff +// +// 8 10/08/99 5:07p Aldie +// More beam stuff and fix for UI_CenterPrint +// +// 7 10/07/99 7:14p Aldie +// More beam stuff +// +// 6 10/07/99 3:08p Aldie +// more beam fun +// +// 5 10/06/99 6:55p Aldie +// Fix some problems with the animateonce command +// +// 4 10/06/99 3:11p Aldie +// Added more docs to commands +// +// 3 10/05/99 6:01p Aldie +// Added headers +// +// DESCRIPTION: +// client side entity commands + +/* +The cg_command system is used for a variety of different functions, but mostly it is +used for spawning client side temp models. Either through the use of emitters or +commands that are tied to various frames of animation. + +The ctempmodel_t class is the data structure for all of the static tempmodels. +These are updated every frame and refEntity and refSprite data is created and added +to the renderer for drawing. + +The spawnthing_t is the intermediate data holder. When the TIKI file is processed +the spawnthing_t is cleared out and values are assigned based on the commands issued. + +cg_common_data is a list of common data elements that are the same in the ctempmodel_t and +the spawhthing_t + +After the m_spawnthing is filled in, 1 or more ctempmodel_t structures are spawned. + +The ClientCommandManager is the listener that process all of the commands in the +TIKI file, similar to ScriptMaster in the server game dll. + +*/ + +#ifndef __CG_COMMANDS_H__ +#define __CG_COMMANDS_H__ + +#include "cg_local.h" +#include "listener.h" +#include "script.h" +#include "vector.h" +#include "../qcommon/qcommon.h" + +#define EMITTER_DEFAULT_LIFE 1000 +#define MAX_EMITTERS 32 +#define MAX_SWIPES 32 + +#define T_RANDSCALE (1<<0) +#define T_SCALEANIM (1<<1) +#define T_SPHERE (1<<2) +#define T_INWARDSPHERE (1<<3) +#define T_CIRCLE (1<<4) +#define T_FADE (1<<5) +#define T_DIETOUCH (1<<6) +#define T_ANGLES (1<<7) +#define T_WAVE (1<<8) +#define T_SWARM (1<<9) +#define T_ALIGN (1<<10) +#define T_COLLISION (1<<11) +#define T_FLICKERALPHA (1<<12) +#define T_DLIGHT (1<<13) +#define T_FADEIN (1<<14) +#define T_GLOBALFADEIN (1<<15) +#define T_GLOBALFADEOUT (1<<16) +#define T_PARENTLINK (1<<17) +#define T_RANDOMROLL (1<<18) +#define T_HARDLINK (1<<19) +#define T_ANIMATEONCE (1<<20) +#define T_BEAMTHING (1<<21) +#define T_RANDVELAXIS (1<<22) +#define T_BOUNCESOUND (1<<23) +#define T_BOUNCESOUNDONCE (1<<24) +#define T_TWINKLE (1<<25) +#define T_TWINKLE_OFF (1<<26) +#define T_ALIGNONCE (1<<27) +#define T_SCALEUPDOWN (1<<28) +#define T_AUTOCALCLIFE (1<<29) +#define T_ASSIGNED_NUMBER (1<<30) +#define T_DETAIL (1<<31) + +#define T2_MOVE (1<<0) +#define T2_AMOVE (1<<1) +#define T2_ACCEL (1<<2) +#define T2_TRAIL (1<<3) +#define T2_PHYSICS_EVERYFRAME (1<<4) +#define T2_TEMPORARY_DECAL (1<<5) +#define T2_BOUNCE_DECAL (1<<6) +#define T2_PARALLEL (1<<7) + +typedef enum { NOT_RANDOM, RANDOM, CRANDOM } randtype_t; + +class cg_common_data : public Class + { + public: + cg_common_data(); + + int life; + int createTime; + Vector origin; + Vector oldorigin; + Vector accel; + Vector angles; + Vector velocity; + Vector avelocity; + Vector parentOrigin; + Vector parentMins; + Vector parentMaxs; + byte color[4]; + float alpha; + float scaleRate; + float scalemin; + float scalemax; + float bouncefactor; + float wave; + int duplicateCount; + int bouncecount; + int maxbouncecount; + str bouncesound; + int bouncesound_delay; + int flags; + int flags2; + int tikihandle; + int swarmfreq; + float swarmmaxspeed; + float swarmdelta; + float lightIntensity; + int lightType; + int fadeintime; + int fadedelay; + int parent; + int collisionmask; + int min_twinkletimeoff; + int max_twinkletimeoff; + int min_twinkletimeon; + int max_twinkletimeon; + int lightstyle; + int physicsRate; + float scale; + str swipe_shader; + str swipe_tag_start; + str swipe_tag_end; + str shadername; + float swipe_life; + + float decal_orientation; + float decal_radius; + }; + +inline cg_common_data::cg_common_data() + { + int i; + + bouncesound_delay =0; + life =0; + createTime =0; + wave =0; + alpha =0; + fadedelay =0; + lightIntensity =0; + lightType =(dlighttype_t)0; + bouncefactor =0; + bouncecount =0; + maxbouncecount =0; + scaleRate =0; + scale =1; + scalemin =0; + scalemax =0; + swarmfreq =0; + swarmmaxspeed =0; + swarmdelta =0; + flags =0; + flags2 =0; + duplicateCount =0; + fadeintime =0; + parent =0; + tikihandle =0; + collisionmask =0; + min_twinkletimeoff =0; + max_twinkletimeoff =0; + min_twinkletimeon =0; + max_twinkletimeoff =0; + lightstyle =-1; + physicsRate =10; + + for (i=0;i<4;i++) + { + color[i] = 0; + } + } + +class ctempmodel_t : public Class + { + public: + ctempmodel_t(); + + class ctempmodel_t *next; + class ctempmodel_t *prev; + + cg_common_data cgd; + str modelname; + + refEntity_t lastEnt; + refEntity_t ent; + + int number; + int lastAnimTime; + int lastPhysicsTime; + int killTime; + int next_bouncesound_time; + Vector perp; + int seed; + int twinkleTime; + int aliveTime; + qboolean addedOnce; + qboolean lastEntValid; + + void (*touchfcn)( ctempmodel_t *ct, trace_t *trace ); + }; + +inline ctempmodel_t::ctempmodel_t() + { + number =0; + lastPhysicsTime =0; + lastAnimTime =0; + killTime =0; + next_bouncesound_time =0; + seed =0; + twinkleTime =0; + aliveTime =0; + addedOnce =qfalse; + lastEntValid =qfalse; + } + +#define LIFE_SWIPE 1 +#define MAX_SWIPE_POINTS 64 + +struct swipepoint_t + { + vec3_t points[2]; + float time; + }; + +class swipething_t : public Class + { + public: + qboolean enabled; + str tagname_start; + str tagname_end; + int entitynum; + float startcolor[4]; + float endcolor[4]; + swipepoint_t swipepoints[MAX_SWIPE_POINTS]; + swipepoint_t cntPoint; + int num_live_swipes; + int first_swipe; + float life; + qhandle_t shader; + void Init (); + }; + +inline void swipething_t::Init () + { + int i; + + enabled = qfalse; + tagname_start = ""; + tagname_end = ""; + entitynum = -1; + + for ( i=0; i < 4; i++ ) + { + startcolor[i] = 1.f; + endcolor[i] = 0.f; + } + + for ( i=0; i < MAX_SWIPE_POINTS; i++ ) + { + VectorSet ( swipepoints[i].points[0], 0.f, 0.f, 0.f ); + VectorSet ( swipepoints[i].points[1], 0.f, 0.f, 0.f ); + swipepoints[i].time = 0.f; + } + + num_live_swipes = 0; + first_swipe = 0; + } + +// Enttracker is used to keep track of client side tempmodels. They are assigned +// a number from a pool of 256. +class enttracker_t : public Class + { + public: + enttracker_t(); + int AssignNumber( void ); + + + protected: + qboolean usedNumbers[256]; + virtual void RemoveEntity( int entnum ); + + }; + +inline enttracker_t::enttracker_t + ( + ) + + { + memset( usedNumbers, 0, sizeof( usedNumbers ) ); + } + +inline void enttracker_t::RemoveEntity + ( + int entnum + ) + + { + // If the entnum is a magic number, then clear out the usedNumber field, so that it + // may be reused for this emitter. + + if ( entnum >= MAGIC_UNUSED_NUMBER ) + { + entnum -= MAGIC_UNUSED_NUMBER; + + assert( entnum >= 0 ); + assert( entnum < 256 ); + + usedNumbers[ entnum ] = qfalse; + } + } + +inline int enttracker_t::AssignNumber + ( + void + ) + + { + int i; + + // These numbers are used for client side tempmodels that are emitters themselves. + // Since they don't have real entity_numbers, they must be assigned a MAGIC number + // so we can keep track of the last time that the model emitted something. + + // Search for a number that is not used + for ( i=0; i<256; i++ ) + { + if ( !usedNumbers[i] ) + { + usedNumbers[i] = qtrue; + return MAGIC_UNUSED_NUMBER + i; + } + } + + return -1; + } + +class emittertime_t : public Class + { + public: + int entity_number; + int last_emit_time; + Vector oldorigin; + qboolean active; + qboolean lerp_emitter; + }; + +// emitterthing_t is used to keep track of the last time and emitter was updated +// for a particular entity number. It inherits from the enttracker_t so it can +// manage client side tempmodels +class emitterthing_t : public enttracker_t + { + protected: + Container m_emittertimes; // A list of entity numbers and the last time they emitted + + public: + emittertime_t *GetEmitTime( int entnum ); + virtual void RemoveEntity( int entnum ); + qboolean startoff; + + }; + +inline void emitterthing_t::RemoveEntity + ( + int entnum + ) + + { + int num,count; + emittertime_t *et; + + if ( entnum == -1 ) + return; + + count = m_emittertimes.NumObjects(); + + for ( num=count; num>=1; num-- ) + { + et = m_emittertimes.ObjectAt( num ); + if ( et->entity_number == entnum ) + { + m_emittertimes.RemoveObjectAt( num ); + delete et; + } + } + + enttracker_t::RemoveEntity( entnum ); + } + +inline emittertime_t *emitterthing_t::GetEmitTime + ( + int entnum + ) + + { + int num, count; + emittertime_t *et; + + count = m_emittertimes.NumObjects(); + + for ( num=1; num<=count; num++ ) + { + et = m_emittertimes.ObjectAt( num ); + if ( et->entity_number == entnum ) + { + return et; + } + } + + // Add a new entry if we didn't find it already + et = new emittertime_t; + et->entity_number = entnum; + et->last_emit_time = cg.time; + et->lerp_emitter = qfalse; + + if ( this->startoff ) + { + et->active = qfalse; + } + else + { + et->active = qtrue; + } + + m_emittertimes.AddObject( et ); + + return et; + } + +class commandtime_t : public Class + { + public: + int entity_number; + int command_number; + int last_command_time; + }; + +// This class is used for keeping track of the last time an entity executed a particular +// command. A command number must be assigned externally by the user +class commandthing_t : public enttracker_t + { + + Container m_commandtimes; // A list of entity numbers and the last time they executed a command + + public: + commandtime_t *GetLastCommandTime( int entnum, int commandnum ); + virtual void RemoveEntity( int entnum ); + }; + +inline void commandthing_t::RemoveEntity + ( + int entnum + ) + + { + int num,count; + commandtime_t *ct; + + count = m_commandtimes.NumObjects(); + + for ( num=count; num>=1; num-- ) + { + ct = m_commandtimes.ObjectAt( num ); + if ( ct->entity_number == entnum ) + { + m_commandtimes.RemoveObjectAt( num ); + } + } + + enttracker_t::RemoveEntity( entnum ); + } + +inline commandtime_t *commandthing_t::GetLastCommandTime + ( + int entnum, + int commandnum + ) + + { + int num, count; + commandtime_t *ct; + + // Search for this entity number + count = m_commandtimes.NumObjects(); + + for ( num=1; num<=count; num++ ) + { + ct = m_commandtimes.ObjectAt( num ); + if ( ( ct->entity_number == entnum ) && ( ct->command_number == commandnum ) ) + { + return ct; + } + } + + // Add a new entry if we didn't find it + ct = new commandtime_t; + ct->entity_number = entnum; + ct->command_number = commandnum; + ct->last_command_time = 0; + + m_commandtimes.AddObject( ct ); + + return ct; + } + +class spawnthing_t : public emitterthing_t + { + public: + Container m_modellist; // A list of models that should be spawned from the emitter + Container m_taglist; // A list of tags to create beams + + cg_common_data cgd; + + Vector origin_offset; + Vector axis_offset; + Vector velocityVariation; + Vector forward; + Vector right; + Vector up; + vec3_t axis[3]; + vec3_t tag_axis[3]; + randtype_t randvel[3]; + randtype_t randorg[3]; + randtype_t randavel[3]; + randtype_t randangles[3]; + randtype_t randaxis[3]; + float forwardVelocity; + float sphereRadius; + float spawnRate; + int lastTime; + int count; + int trace_count; + str tagname; + str emittername; + str animName; + float dcolor[3]; + qboolean dlight; + + // beam stuff also impact trace stuff + str startTag; + str endTag; + float length; + float min_offset; + float max_offset; + float overlap; + float numSubdivisions; + float delay; + float toggledelay; + int beamflags; + int numspherebeams; + float endalpha; + float spreadx; + float spready; + qboolean use_last_trace_end; + + void (*touchfcn)( ctempmodel_t *ct, trace_t *trace ); + str GetModel( void ); + void SetModel( str model ); + }; + +inline void spawnthing_t::SetModel + ( + str model + ) + + { + m_modellist.ClearObjectList(); + m_modellist.AddObject( model ); + } + +inline str spawnthing_t::GetModel + ( + void + ) + + { + int num, index; + + num = m_modellist.NumObjects(); + + if ( !num ) + { + return ""; + } + + index = ( num * random() ) + 1; + + if ( index > num ) + index = num; + + return m_modellist.ObjectAt( index ); + } + +// Keeps track of beams that are created by entities that need their positions updated every frame +class beamthing_t : public emitterthing_t + { + public: + str beamname; + str shadername; + str startTag; + str endTag; + int numSubdivisions; + int tikihandle; + float alpha; + float scale; + int flags; + float length; + int life; + float min_offset; + float max_offset; + float overlap; + int delay; + byte modulate[4]; + }; + +#define MAX_TEMPMODELS 1024 +#define MAX_BEAMS 128 + +class ClientGameCommandManager : public Listener + { + private: + spawnthing_t m_localemitter; // local emitter used by animation commands + ctempmodel_t m_active_tempmodels; + ctempmodel_t *m_free_tempmodels; + ctempmodel_t m_tempmodels[MAX_TEMPMODELS]; + spawnthing_t *m_spawnthing; + Container m_emitters; // Global emitters set up by client commands + int m_numtempmodels; // number of tempmodels + int m_seed; + commandthing_t m_command_time_manager; // Keeps track of entity numbers and the last time + // they executed particular commands + + void (ClientGameCommandManager::*endblockfcn)( void ); + ctempmodel_t *AllocateTempModel( void ); + qboolean TempModelPhysics( ctempmodel_t *p, float ftime, float time2, float scale ); + qboolean TempModelRealtimeEffects( ctempmodel_t *p, float ftime, float time2, float scale ); + qboolean LerpTempModel( refEntity_t *newEnt, ctempmodel_t *p, float frac ); + void Print( Event *ev ); + void StartBlock( Event *ev ); + void EndBlock( Event *ev ); + void UpdateSpawnThing( spawnthing_t *ep ); + void EmitterStartOff( Event *ev ); + void SetAlpha( Event *ev ); + void SetDieTouch( Event *ev ); + void SetBounceFactor( Event *ev ); + void SetBounceSound( Event *ev ); + void SetBounceSoundOnce( Event *ev ); + void SetModel( Event *ev ); + void SetLife( Event *ev ); + void SetColor( Event *ev ); + void SetColorRange( Event *ev ); + void SetLightstyle( Event *ev ); + void SetDuplicateCount( Event *ev ); + void SetVelocity( Event *ev ); + void SetAngularVelocity( Event *ev ); + void SetCount( Event *ev ); + void SetTraceCount( Event *ev ); + void SetScale( Event *ev ); + void SetScaleUpDown( Event *ev ); + void SetScaleMin( Event *ev ); + void SetScaleMax( Event *ev ); + void SetScaleRate( Event *ev ); + void SetRandomVelocity( Event *ev ); + void SetRandomVelocityAlongAxis( Event *ev ); + void SetAccel( Event *ev ); + void SetFade( Event *ev ); + void SetFadeDelay( Event *ev ); + void SetSpawnRate( Event *ev ); + void SetOriginOffset( Event *ev ); + void SetOffsetAlongAxis( Event *ev ); + void SetCircle( Event *ev ); + void SetSphere( Event *ev ); + void SetInwardSphere( Event *ev ); + void SetWavy( Event *ev ); + void SetRandomRoll( Event *ev ); + void SetSwarm( Event *ev ); + void SetAlign( Event *ev ); + void SetAlignOnce( Event *ev ); + void SetCollision( Event *ev ); + void SetFlickerAlpha( Event *ev ); + void SetFadeIn( Event *ev ); + void SetEntityColor( Event *ev ); + void SetGlobalFade( Event *ev ); + void SetRadius( Event *ev ); + void SetParentLink( Event *ev ); + void SetHardLink( Event *ev ); + void SetAngles( Event *ev ); + void ParentAngles( Event *ev ); + void SetTwinkle( Event *ev ); + void SetTrail( Event *ev ); + void SetPhysicsRate( Event *ev ); + void SetBounceDecal( Event *ev ); + void UpdateSwarm( ctempmodel_t *p ); + void SpawnTempModel( int count, int timealive=0 ); + void FreeTempModel( ctempmodel_t *le ); + void BeginOriginSpawn( Event *ev ); + void EndOriginSpawn( void ); + void BeginOriginBeamSpawn( Event *ev ); + void EndOriginBeamSpawn( void ); + void BeginOriginBeamEmitter( Event *ev ); + void EndOriginBeamEmitter( void ); + void BeginTagSpawn( Event *ev ); + void EndTagSpawn( void ); + void BeginTagBeamSpawn( Event *ev ); + void EndTagBeamSpawn( void ); + void BeginTagEmitter( Event *ev ); + void EndTagEmitter( void ); + void BeginOriginEmitter( Event *ev ); + void EndOriginEmitter( void ); + void BeginTagBeamEmitter( Event *ev ); + void EndTagBeamEmitter( void ); + void EmitterOn( Event *ev ); + void EmitterOff( Event *ev ); + void RainTouch( Event *ev ); + void Sound( Event *ev ); + void StopSound( Event *ev ); + void LoopSound( Event *ev ); + void Cache( Event *ev ); + void AliasCache( Event *ev ); + void Alias( Event *ev ); + void Client( Event *ev ); + void TagDynamicLight( Event *ev ); + void OriginDynamicLight( Event *ev ); + void DynamicLight( Event *ev ); + void GetOrientation( str tagname, spawnthing_t *sp ); + void AnimateTempModel( ctempmodel_t *ent, Vector origin, refEntity_t *newEnt ); + void OtherTempModelEffects( ctempmodel_t *p, Vector origin, refEntity_t *newEnt ); + void Swipe( Event *ev ); + void SwipeOn ( Event *ev ); + void SwipeOff ( Event *ev ); + void AnimateOnce( Event *ev ); + void SetAnim( Event *ev ); + void BeginTagTraceImpactMark( Event *ev ); + void EndTagTraceImpactMark( void ); + void BeginTagTraceImpactSpawn( Event *ev ); + void EndTagTraceImpactSpawn( void ); + void SetDecalRadius( Event *ev ); + void SetDecalOrientation( Event *ev ); + void TagList( Event *ev ); + void TagTraceImpactSound( Event *ev ); + void SetParallel( Event *ev ); + void Footstep( Event *ev ); + void SetDetail( Event *ev ); + + // Beam stuff + void SetSubdivisions( Event *ev ); + void SetMinOffset( Event *ev ); + void SetMaxOffset( Event *ev ); + void SetShader( Event *ev ); + void SetLength( Event *ev ); + void SetBeamDelay( Event *ev ); + void SetBeamToggleDelay( Event *ev ); + void SetBeamPersist( Event *ev ); + void SetBeamOffsetEndpoints( Event *ev ); + void SetBeamSphere( Event *ev ); + void SetSpread( Event *ev ); + void SetUseLastTraceEnd( Event *ev ); + void SetEndAlpha( Event *ev ); + + void RandomChance( Event *ev ); + void CommandDelay( Event *ev ); + public: + CLASS_PROTOTYPE( ClientGameCommandManager ); + + ClientGameCommandManager(); + void AddTempModels( void ); + void UpdateEmitter( int tikihandle, vec3_t axis[3], int entity_number, int parent_number, Vector entity_origin ); + void UpdateBeam( int tikihandle, int entity_number, spawnthing_t *beamthing ); + void PlaySound( str sound_name, vec3_t *origin=NULL, int channel = CHAN_AUTO, float volume = -1, float min_distance = -1 ); + + spawnthing_t *InitializeSpawnthing( spawnthing_t *ep ); + void SpawnTempModel( int count, class spawnthing_t *sp ); + void FreeAllTempModels( void ); + void RestartAllEmitters( int timedelta ); + void FreeAllEmitters( void ); + + void InitializeTempModels( void ); + void InitializeEmitters( void ); + void RemoveClientEntity( int number, int tikihandle, centity_t *cent, ctempmodel_t *p=NULL ); + void TestEmitter( void ); + void UpdateTestEmitter( void ); + void SetTestEmitterValues( void ); + void DumpEmitter( void ); + void ClearSwipes( void ); + void ResetTempModels( void ); + inline void SetSpawnthing( spawnthing_t *st ){ m_spawnthing = st; }; + spawnthing_t *CreateNewEmitter( str emittername ); + spawnthing_t *CreateNewEmitter( void ); + spawnthing_t *GetEmitterByName( str emittername ); + void CGEvent( centity_t *cent ); + }; + +class EmitterLoader : public Listener + { + private: + bool emitterActive; + + public: + CLASS_PROTOTYPE ( EmitterLoader ); + + EmitterLoader(); + bool Load( Script & ); + void ProcessEmitter( Script & ); + void Emitter( Event *ev ); + }; + +extern ClientGameCommandManager commandManager; + +#endif // __CG_COMMANDS_H__ + diff --git a/source/source/cgame/cg_consolecmds.c b/source/source/cgame/cg_consolecmds.c new file mode 100644 index 0000000..a04893c --- /dev/null +++ b/source/source/cgame/cg_consolecmds.c @@ -0,0 +1,314 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/cgame/cg_consolecmds.c $ +// $Revision:: 9 $ +// $Author:: Markd $ +// $Date:: 7/22/00 5:50p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/cgame/cg_consolecmds.c $ +// +// 9 7/22/00 5:50p Markd +// added flushtikis support +// +// 8 4/26/00 9:05p Markd +// Added client and cgame class commands +// +// 7 10/18/99 1:59p Aldie +// Lots of fixes for beams and stuff +// +// 6 10/13/99 3:26p Aldie +// Various fixes for particles, beams and lensflares +// +// 5 10/06/99 3:23p Steven +// Added a dumpevents command. +// +// 4 10/05/99 6:01p Aldie +// Added headers +// +// DESCRIPTION: +// text commands typed in at the local console, or executed by a key binding + +#include "cg_local.h" + +void CG_TargetCommand_f( void ); + +/* +================= +CG_SizeUp_f + +Keybinding command +================= +*/ +static void CG_SizeUp_f (void) { + cgi.Cvar_Set("viewsize", va("%i",(int)(cg_viewsize->integer+10))); +} + + +/* +================= +CG_SizeDown_f + +Keybinding command +================= +*/ +static void CG_SizeDown_f (void) { + cgi.Cvar_Set("viewsize", va("%i",(int)(cg_viewsize->integer-10))); +} + + +/* +============= +CG_Viewpos_f + +Debugging command to print the current position +============= +*/ +static void CG_Viewpos_f (void) { + cgi.Printf("(%i %i %i) : %i\n", (int)cg.refdef.vieworg[0], + (int)cg.refdef.vieworg[1], (int)cg.refdef.vieworg[2], + (int)cg.refdefViewAngles[YAW]); +} + +#if 0 +static void CG_ScoresDown_f( void ) { + // don't constantly send requests, or we would overflow + if ( cg.showScores && cg.scoresRequestTime + 2000 > cg.time ) { + return; + } + cg.scoresRequestTime = cg.time; + cgi.SendClientCommand( "score" ); + + if ( !cg.showScores ) { + // don't display anything until first score returns + cg.showScores = qtrue; + cg.numScores = 0; + } +} + +static void CG_ScoresUp_f( void ) { + cg.showScores = qfalse; + cg.scoreFadeTime = cg.time; +} + +static void CG_InfoDown_f( void ) { + cg.showInformation = qtrue; +} + +static void CG_InfoUp_f( void ) { + cg.showInformation = qfalse; +} + + +/* +============================================================================= + + MODEL TESTING + +The viewthing and gun positioning tools from Q2 have been integrated and +enhanced into a single model testing facility. + +Model viewing can begin with either "testmodel " or "testgun ". + +The names must be the full pathname after the basedir, like +"models/weapons/v_launch/tris.md3" or "players/male/tris.md3" + +Testmodel will create a fake entity 100 units in front of the current view +position, directly facing the viewer. It will remain immobile, so you can +move around it to view it from different angles. + +Testgun will cause the model to follow the player around and supress the real +view weapon model. The default frame 0 of most guns is completely off screen, +so you will probably have to cycle a couple frames to see it. + +"nextframe", "prevframe", "nextskin", and "prevskin" commands will change the +frame or skin of the testmodel. These are bound to F5, F6, F7, and F8 in +q3default.cfg. + +Note that none of the model testing features update while the game is paused, so +it may be convenient to test with deathmatch set to 1 so that bringing down the +console doesn't pause the game. + +============================================================================= +*/ + +/* +================= +CG_TestModel_f + +Creates an entity in front of the current position, which +can then be moved around +================= +*/ +void CG_TestModel_f (void) { + vec3_t angles; + + memset( &cg.testModelEntity, 0, sizeof(cg.testModelEntity) ); + if ( cgi.Argc() < 2 ) { + return; + } + + Q_strncpyz (cg.testModelName, cgi.Argv( 1 ), MAX_QPATH ); + cg.testModelEntity.hModel = cgi.R_RegisterModel( cg.testModelName ); + + if ( cgi.Argc() == 3 ) { + cg.testModelEntity.backlerp = atof( cgi.Argv( 2 ) ); + cg.testModelEntity.frame = 1; + cg.testModelEntity.oldframe = 0; + } + if (! cg.testModelEntity.hModel ) { + cgi.Printf( "Can't register model\n" ); + return; + } + + VectorMA( cg.refdef.vieworg, 100, cg.refdef.viewaxis[0], cg.testModelEntity.origin ); + + angles[PITCH] = 0; + angles[YAW] = 180 + cg.refdefViewAngles[1]; + angles[ROLL] = 0; + + AnglesToAxis( angles, cg.testModelEntity.axis ); + cg.testGun = qfalse; +} + +void CG_TestModelNextFrame_f (void) { + cg.testModelEntity.frame++; + cgi.Printf( "frame %i\n", cg.testModelEntity.frame ); +} + +void CG_TestModelPrevFrame_f (void) { + cg.testModelEntity.frame--; + cgi.Printf( "frame %i\n", cg.testModelEntity.frame ); +} + +void CG_TestModelNextSkin_f (void) { + cg.testModelEntity.skinNum++; + cgi.Printf( "skin %i\n", cg.testModelEntity.skinNum ); +} + +void CG_TestModelPrevSkin_f (void) { + cg.testModelEntity.skinNum--; + if ( cg.testModelEntity.skinNum < 0 ) { + cg.testModelEntity.skinNum = 0; + } + cgi.Printf( "skin %i\n", cg.testModelEntity.skinNum ); +} + +void CG_AddTestModel (void) { + // re-register the model, because the level may have changed + cg.testModelEntity.hModel = cgi.R_RegisterModel( cg.testModelName ); + if (! cg.testModelEntity.hModel ) { + cgi.Printf ("Can't register model\n"); + return; + } + cgi.R_AddRefEntityToScene( &cg.testModelEntity ); +} + + +#endif + +/* +================= +CG_FlushModels_f +================= +*/ +void CG_FlushModels_f( void ) + { + int i; + + // clear any tiki handles to bad values + memset( &cgs.model_tiki, -1, sizeof( cgs.model_tiki ) ); + + // reset all emitters + CG_FlushCommandManager(); + + // flush all the tikis + cgi.FlushAll(); + + // go through all the models and process them + for ( i = CS_MODELS ; i < MAX_MODELS ; i++ ) + { + CG_ProcessConfigString( i ); + } + } + + + +typedef struct { + char *cmd; + void (*function)(void); +} consoleCommand_t; + +static consoleCommand_t commands[] = { +// { "testmodel", CG_TestModel_f }, +// { "nextframe", CG_TestModelNextFrame_f }, +// { "prevframe", CG_TestModelPrevFrame_f }, +// { "nextskin", CG_TestModelNextSkin_f }, +// { "prevskin", CG_TestModelPrevSkin_f }, + { "viewpos", CG_Viewpos_f }, +// { "+scores", CG_ScoresDown_f }, +// { "-scores", CG_ScoresUp_f }, +// { "+info", CG_InfoDown_f }, +// { "-info", CG_InfoUp_f }, + { "sizeup", CG_SizeUp_f }, + { "sizedown", CG_SizeDown_f }, + { "cg_eventlist", CG_EventList_f }, + { "cg_eventhelp", CG_EventHelp_f }, + { "cg_dumpevents", CG_DumpEventHelp_f }, + { "cg_pendingevents", CG_PendingEvents_f }, + { "cg_classlist", CG_ClassList_f }, + { "cg_classtree", CG_ClassTree_f }, + { "cg_classevents", CG_ClassEvents_f }, + { "cg_dumpclassevents", CG_DumpClassEvents_f }, + { "cg_dumpallclasses", CG_DumpAllClasses_f }, + { "testemitter", CG_TestEmitter_f }, + { "dumpemitter", CG_DumpEmitter_f }, + { "flushtikis", CG_FlushModels_f } +}; + + +/* +================= +CG_ConsoleCommand + +The string has been tokenized and can be retrieved with +Cmd_Argc() / Cmd_Argv() +================= +*/ +qboolean CG_ConsoleCommand( void ) { + const char *cmd; + int i; + + cmd = cgi.Argv(0); + + for ( i = 0 ; i < sizeof( commands ) / sizeof( commands[0] ) ; i++ ) { + if ( !Q_stricmp( cmd, commands[i].cmd ) ) { + commands[i].function(); + return qtrue; + } + } + + return qfalse; +} + + +/* +================= +CG_InitConsoleCommands + +Let the client system know about all of our commands +so it can perform tab completion +================= +*/ +void CG_InitConsoleCommands( void ) { + int i; + + for ( i = 0 ; i < sizeof( commands ) / sizeof( commands[0] ) ; i++ ) { + cgi.AddCommand( commands[i].cmd ); + } +} diff --git a/source/source/cgame/cg_container.h b/source/source/cgame/cg_container.h new file mode 100644 index 0000000..6911d8a --- /dev/null +++ b/source/source/cgame/cg_container.h @@ -0,0 +1,381 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/cgame/cg_container.h $ +// $Revision:: 2 $ +// $Author:: Aldie $ +// $Date:: 9/10/99 5:24p $ +// +// Copyright (C) 1997 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/cgame/cg_container.h $ +// +// 2 9/10/99 5:24p Aldie +// Merge code +// +// 1 9/10/99 10:48a Jimdose +// +// 2 9/09/99 3:30p Aldie +// Merge +// +// 1 9/08/99 3:35p Aldie +// +// DESCRIPTION: +// Base class for a dynamic array. Allows adding, removing, index of, +// and finding of entries with specified value. Originally created for +// cataloging entities, but pointers to objects that may be removed at +// any time are bad to keep around, so only entity numbers should be +// used in the future. +// + +#ifndef __CONTAINER_H__ +#define __CONTAINER_H__ + +#include + +template< class Type > +class Container + { + private: + Type *objlist; + int numobjects; + int maxobjects; + + public: + Container(); + ~Container(); + void FreeObjectList( void ); + void ClearObjectList( void ); + int NumObjects( void ); + void Resize( int maxelements ); + void SetObjectAt( int index, Type& obj ); + int AddObject( Type& obj ); + int AddUniqueObject( Type& obj ); + void AddObjectAt( int index, Type& obj ); + int IndexOfObject( Type& obj ); + qboolean ObjectInList( Type& obj ); + Type& ObjectAt( int index ); + Type *AddressOfObjectAt( int index ); + void RemoveObjectAt( int index ); + void RemoveObject( Type& obj ); + void Sort( int ( __cdecl *compare )( const void *elem1, const void *elem2 ) ); + }; + +template< class Type > +Container::Container() + { + objlist = NULL; + FreeObjectList(); + } + +template< class Type > +Container::~Container() + { + FreeObjectList(); + } + +template< class Type > +void Container::FreeObjectList + ( + void + ) + + { + if ( objlist ) + { + delete[] objlist; + } + objlist = NULL; + numobjects = 0; + maxobjects = 0; + } + +template< class Type > +void Container::ClearObjectList + ( + void + ) + + { + // only delete the list if we have objects in it + if ( objlist && numobjects ) + { + delete[] objlist; + objlist = new Type[ maxobjects ]; + numobjects = 0; + } + } + +template< class Type > +int Container::NumObjects + ( + void + ) + + { + return numobjects; + } + +template< class Type > +void Container::Resize + ( + int maxelements + ) + + { + Type *temp; + int i; + + assert( maxelements >= 0 ); + + if ( maxelements <= 0 ) + { + FreeObjectList(); + return; + } + + if ( !objlist ) + { + maxobjects = maxelements; + objlist = new Type[ maxobjects ]; + } + else + { + temp = objlist; + maxobjects = maxelements; + if ( maxobjects < numobjects ) + { + maxobjects = numobjects; + } + + objlist = new Type[ maxobjects ]; + for( i = 0; i < numobjects; i++ ) + { + objlist[ i ] = temp[ i ]; + } + delete[] temp; + } + } + +template< class Type > +void Container::SetObjectAt + ( + int index, + Type& obj + ) + + { + if ( ( index <= 0 ) || ( index > numobjects ) ) + { + gi.Error( ERR_DROP, "Container::SetObjectAt : index out of range" ); + } + + objlist[ index - 1 ] = obj; + } + +template< class Type > +int Container::AddObject + ( + Type& obj + ) + + { + if ( !objlist ) + { + Resize( 10 ); + } + + if ( numobjects == maxobjects ) + { + Resize( maxobjects * 2 ); + } + + objlist[ numobjects ] = obj; + numobjects++; + + return numobjects; + } + +template< class Type > +int Container::AddUniqueObject + ( + Type& obj + ) + + { + int index; + + index = IndexOfObject( obj ); + if ( !index ) + index = AddObject( obj ); + return index; + } + +template< class Type > +void Container::AddObjectAt + ( + int index, + Type& obj + ) + + { + // + // this should only be used when reconstructing a list that has to be identical to the original + // + if ( index > maxobjects ) + { + Resize( index ); + } + if ( index > numobjects ) + { + numobjects = index; + } + SetObjectAt( index, obj ); + } + +template< class Type > +int Container::IndexOfObject + ( + Type& obj + ) + + { + int i; + + for( i = 0; i < numobjects; i++ ) + { + if ( objlist[ i ] == obj ) + { + return i + 1; + } + } + + return 0; + } + +template< class Type > +qboolean Container::ObjectInList + ( + Type& obj + ) + + { + if ( !IndexOfObject( obj ) ) + { + return false; + } + + return true; + } + +template< class Type > +Type& Container::ObjectAt + ( + int index + ) + + { + if ( ( index <= 0 ) || ( index > numobjects ) ) + { + cgi.Error( ERR_DROP, "Container::ObjectAt : index out of range" ); + } + + return objlist[ index - 1 ]; + } + +template< class Type > +Type * Container::AddressOfObjectAt + ( + int index + ) + + { + // + // this should only be used when reconstructing a list that has to be identical to the original + // + if ( index > maxobjects ) + { + cgi.Error( ERR_DROP, "Container::AddressOfObjectAt : index is greater than maxobjects" ); + } + if ( index > numobjects ) + { + numobjects = index; + } + return &objlist[ index - 1 ]; + } + +template< class Type > +void Container::RemoveObjectAt + ( + int index + ) + + { + int i; + + if ( !objlist ) + { + cgi.Printf( "Container::RemoveObjectAt : Empty list\n" ); + return; + } + + if ( ( index <= 0 ) || ( index > numobjects ) ) + { + cgi.Error( ERR_DROP, "Container::RemoveObjectAt : index out of range" ); + return; + } + + i = index - 1; + numobjects--; + for( i = index - 1; i < numobjects; i++ ) + { + objlist[ i ] = objlist[ i + 1 ]; + } + } + +template< class Type > +void Container::RemoveObject + ( + Type& obj + ) + + { + int index; + + index = IndexOfObject( obj ); + if ( !index ) + { + gi.DPrintf( "Container::RemoveObject : Object not in list\n" ); + return; + } + + RemoveObjectAt( index ); + } + +template< class Type > +void Container::Sort + ( + int ( __cdecl *compare )( const void *elem1, const void *elem2 ) + ) + + { + if ( !objlist ) + { + gi.DPrintf( "Container::RemoveObjectAt : Empty list\n" ); + return; + } + + qsort( ( void * )objlist, ( size_t )numobjects, sizeof( Type ), compare ); + } + +// +// Exported templated classes must be explicitly instantiated +// +#ifdef EXPORT_TEMPLATE +template class Container; +#endif + +#endif /* container.h */ \ No newline at end of file diff --git a/source/source/cgame/cg_drawtools.cpp b/source/source/cgame/cg_drawtools.cpp new file mode 100644 index 0000000..f2f50b4 --- /dev/null +++ b/source/source/cgame/cg_drawtools.cpp @@ -0,0 +1,363 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/cgame/cg_drawtools.cpp $ +// $Revision:: 8 $ +// $Author:: Markd $ +// $Date:: 7/27/00 11:35p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/cgame/cg_drawtools.cpp $ +// +// 8 7/27/00 11:35p Markd +// got rid of DrawDisconnect +// +// 7 7/10/00 11:54p Markd +// added exit level code +// +// 6 6/14/00 12:14p Markd +// more intel compiler bug fixes +// +// 5 6/09/00 10:27a Markd +// got lagometer and CG_2D operations functioning +// +// 4 12/11/99 5:51p Markd +// First wave of bug fixes after q3a gold merge +// +// 3 10/05/99 6:01p Aldie +// Added headers +// +// DESCRIPTION: +// Some tools used to drawing 2d stuff + +#include "cg_local.h" + +/* +================ +CG_AdjustFrom640 + +Adjusted for resolution and screen aspect ratio +================ +*/ +void CG_AdjustFrom640( float *x, float *y, float *w, float *h ) { +#if 0 + // adjust for wide screens + if ( cgs.glconfig.vidWidth * 480 > cgs.glconfig.vidHeight * 640 ) { + *x += 0.5 * ( cgs.glconfig.vidWidth - ( cgs.glconfig.vidHeight * 640 / 480 ) ); + } +#endif + // scale for screen sizes + *x *= cgs.screenXScale; + *y *= cgs.screenYScale; + *w *= cgs.screenXScale; + *h *= cgs.screenYScale; +} + +/* +============= +CG_TileClearBox + +This repeats a 64*64 tile graphic to fill the screen around a sized down +refresh window. +============= +*/ +void CG_TileClearBox( int x, int y, int w, int h, qhandle_t hShader ) { + float s1, t1, s2, t2; + + s1 = x/64.0; + t1 = y/64.0; + s2 = (x+w)/64.0; + t2 = (y+h)/64.0; + cgi.R_DrawStretchPic( x, y, w, h, s1, t1, s2, t2, hShader ); +} + + + +/* +============== +CG_TileClear + +Clear around a sized down screen +============== +*/ +void CG_TileClear( void ) { + int top, bottom, left, right; + int w, h; + + w = cgs.glconfig.vidWidth; + h = cgs.glconfig.vidHeight; + + if ( cg.refdef.x == 0 && cg.refdef.y == 0 && + cg.refdef.width == w && cg.refdef.height == h ) { + return; // full screen rendering + } + + top = cg.refdef.y; + bottom = top + cg.refdef.height-1; + left = cg.refdef.x; + right = left + cg.refdef.width-1; + + // clear above view screen + CG_TileClearBox( 0, 0, w, top, cgs.media.backTileShader ); + + // clear below view screen + CG_TileClearBox( 0, bottom, w, h - bottom, cgs.media.backTileShader ); + + // clear left of view screen + CG_TileClearBox( 0, top, left, bottom - top + 1, cgs.media.backTileShader ); + + // clear right of view screen + CG_TileClearBox( right, top, w - right, bottom - top + 1, cgs.media.backTileShader ); +} + + +/* +=============================================================================== + +LAGOMETER + +=============================================================================== +*/ + +#define LAG_SAMPLES 128 + + +typedef struct { + int frameSamples[LAG_SAMPLES]; + int frameCount; + int snapshotFlags[LAG_SAMPLES]; + int snapshotSamples[LAG_SAMPLES]; + int snapshotCount; +} lagometer_t; + +lagometer_t lagometer; + +/* +============== +CG_AddLagometerFrameInfo + +Adds the current interpolate / extrapolate bar for this frame +============== +*/ +void CG_AddLagometerFrameInfo( void ) { + int offset; + + offset = cg.time - cg.latestSnapshotTime; + lagometer.frameSamples[ lagometer.frameCount & ( LAG_SAMPLES - 1) ] = offset; + lagometer.frameCount++; +} + +/* +============== +CG_AddLagometerSnapshotInfo + +Each time a snapshot is received, log its ping time and +the number of snapshots that were dropped before it. + +Pass NULL for a dropped packet. +============== +*/ +void CG_AddLagometerSnapshotInfo( snapshot_t *snap ) { + // dropped packet + if ( !snap ) { + lagometer.snapshotSamples[ lagometer.snapshotCount & ( LAG_SAMPLES - 1) ] = -1; + lagometer.snapshotCount++; + return; + } + + // add this snapshot's info + lagometer.snapshotSamples[ lagometer.snapshotCount & ( LAG_SAMPLES - 1) ] = snap->ping; + lagometer.snapshotFlags[ lagometer.snapshotCount & ( LAG_SAMPLES - 1) ] = snap->snapFlags; + lagometer.snapshotCount++; +} + +/* +============== +CG_DrawDisconnect +============== +*/ +void CG_DrawDisconnect( void ) { + float x, y; + int cmdNum; + usercmd_t cmd; + + // draw the phone jack if we are completely past our buffers + cmdNum = cgi.GetCurrentCmdNumber() - CMD_BACKUP + 1; + cgi.GetUserCmd( cmdNum, &cmd ); + if ( !cg.snap || cmd.serverTime <= cg.snap->ps.commandTime + || cmd.serverTime > cg.time ) { // special check for map_restart + return; + } + + // blink it + if ( ( cg.time >> 9 ) & 1 ) { + return; + } + + x = 640 - 48; + y = 480 - 48; + + cgi.R_DrawStretchPic( x, y, 48, 48, 0, 0, 1, 1, cgi.R_RegisterShader("gfx/2d/net.tga" ) ); +} + + +#define MAX_LAGOMETER_PING 900 +#define MAX_LAGOMETER_RANGE 300 + +/* +============== +CG_DrawLagometer +============== +*/ +void CG_DrawLagometer( void ) { + int a, x, y, i; + float v; + float ax, ay, aw, ah, mid, range; + int color; + float vscale; + + if ( !cg_lagometer->integer ) { + // don't draw the disconnect icon in single player + //CG_DrawDisconnect(); + return; + } + + // + // draw the graph + // + x = 640 - 48; + y = 480 - 48; + + cgi.R_SetColor( NULL ); + cgi.R_DrawStretchPic( x, y, 48, 48, 0, 0, 1, 1, cgs.media.lagometerShader ); + + ax = x; + ay = y; + aw = 48; + ah = 48; + CG_AdjustFrom640( &ax, &ay, &aw, &ah ); + + color = -1; + range = ah / 3; + mid = ay + range; + + vscale = range / MAX_LAGOMETER_RANGE; + + // draw the frame interpoalte / extrapolate graph + for ( a = 0 ; a < aw ; a++ ) { + i = ( lagometer.frameCount - 1 - a ) & (LAG_SAMPLES - 1); + v = lagometer.frameSamples[i]; + v *= vscale; + if ( v > 0 ) { + if ( color != 1 ) { + color = 1; + cgi.R_SetColor( g_color_table[ColorIndex(COLOR_YELLOW)] ); + } + if ( v > range ) { + v = range; + } + cgi.R_DrawBox( ax + aw - a, mid - v, 1, v ); + } else if ( v < 0 ) { + if ( color != 2 ) { + color = 2; + cgi.R_SetColor( g_color_table[ColorIndex(COLOR_BLUE)] ); + } + v = -v; + if ( v > range ) { + v = range; + } + cgi.R_DrawBox( ax + aw - a, mid, 1, v ); + } + } + + // draw the snapshot latency / drop graph + range = ah / 2; + vscale = range / MAX_LAGOMETER_PING; + + for ( a = 0 ; a < aw ; a++ ) { + i = ( lagometer.snapshotCount - 1 - a ) & (LAG_SAMPLES - 1); + v = lagometer.snapshotSamples[i]; + if ( v > 0 ) { + if ( lagometer.snapshotFlags[i] & SNAPFLAG_RATE_DELAYED ) { + if ( color != 5 ) { + color = 5; // YELLOW for rate delay + cgi.R_SetColor( g_color_table[ColorIndex(COLOR_YELLOW)] ); + } + } else { + if ( color != 3 ) { + color = 3; + cgi.R_SetColor( g_color_table[ColorIndex(COLOR_GREEN)] ); + } + } + v = v * vscale; + if ( v > range ) { + v = range; + } + cgi.R_DrawBox( ax + aw - a, ay + ah - v, 1, v ); + } else if ( v < 0 ) { + if ( color != 4 ) { + color = 4; // RED for dropped snapshots + cgi.R_SetColor( g_color_table[ColorIndex(COLOR_RED)] ); + } + cgi.R_DrawBox( ax + aw - a, ay + ah - range, 1, range ); + } + } + + cgi.R_SetColor( NULL ); + + CG_DrawDisconnect(); +} + +/* +============== +CG_DrawIcons +============== +*/ +void CG_DrawIcons( void ) + { + qhandle_t handle; + float x,y,w,h; + + if ( paused->integer ) + { + handle = cgs.media.pausedShader; + } + else + { + if ( cg.predicted_player_state.pm_flags & PMF_LEVELEXIT ) + { + // blink it + if ( ( cg.time >> 9 ) & 1 ) + { + return; + } + handle = cgs.media.levelExitShader; + } + else + { + return; + } + } + w = cgi.R_GetShaderWidth( handle ); + h = cgi.R_GetShaderHeight( handle ); + x = w / 4; + y = cgs.glconfig.vidHeight - ( 1.25f * h ); + + cgi.R_SetColor( colorWhite ); + cgi.R_DrawStretchPic( x, y, w, h, 0, 0, 1, 1, handle ); + } + +/* +============== +CG_Draw2D +============== +*/ +void CG_Draw2D( void ) + { + CG_DrawIcons(); + CG_DrawLagometer(); + } diff --git a/source/source/cgame/cg_ents.c b/source/source/cgame/cg_ents.c new file mode 100644 index 0000000..2d8ac79 --- /dev/null +++ b/source/source/cgame/cg_ents.c @@ -0,0 +1,925 @@ +// cg_ents.c -- present snapshot entities, happens every single frame + +#include "cg_local.h" + +/* +========================================================================== + +FUNCTIONS CALLED EACH FRAME + +========================================================================== +*/ + +/* +====================== +CG_SetEntitySoundPosition +====================== +*/ +void CG_SetEntitySoundPosition( centity_t *cent ) + { + vec3_t origin; + + if ( cent->currentState.solid == SOLID_BMODEL ) + { + float *v; + vec3_t vel; + + v = cgs.inlineModelMidpoints[ cent->currentState.modelindex ]; + VectorAdd( cent->lerpOrigin, v, origin ); + + vel[0] = 0.0; + vel[1] = 0.0; + vel[2] = 0.0; + + cgi.S_UpdateEntity( cent->currentState.number, origin, vel, qfalse ); + } + else + { + if ( cent && cg.snap && cent->currentState.parent == cg.snap->ps.clientNum ) + { + vec3_t origin; + vec3_t velocity; + + origin[0] = 0; + origin[1] = 0; + origin[2] = 0; + + velocity[0] = 0; + velocity[1] = 0; + velocity[2] = 0; + + cgi.S_UpdateEntity( cent->currentState.number, origin, velocity, qtrue ); + } + else + { + CG_GetOrigin( cent, origin ); + cgi.S_UpdateEntity( cent->currentState.number, origin, cent->currentState.pos.trDelta, qfalse ); + } + } + } + +/* +================== +CG_EntityEffects + +Add continuous entity effects, like local entity emission and lighting +================== +*/ +void CG_EntityEffects( centity_t *cent ) + { + // initialize with the client colors + cent->color[ 0 ] = cent->client_color[ 0 ]; + cent->color[ 1 ] = cent->client_color[ 1 ]; + cent->color[ 2 ] = cent->client_color[ 2 ]; + cent->color[ 3 ] = cent->client_color[ 3 ]; + + if ( cent->currentState.constantLight != 0xffffff ) + { + int style; + unsigned cl; + float i, r, g, b; + + cl = cent->currentState.constantLight; + style = ( cl & 255 ); + r = ( float )style / 255.0f; + g = ( float )( ( cl >> 8 ) & 255 ) / 255.0f; + b = ( float )( ( cl >> 16 ) & 255 ) / 255.0f; + i = ( ( cl >> 24 ) & 255 ) * CONSTANTLIGHT_RADIUS_SCALE; + if ( cent->currentState.renderfx & RF_LIGHTSTYLE_DLIGHT ) + { + float color[ 4 ]; + + CG_LightStyleColor( style, cg.time, color, qfalse ); + r = color[ 0 ]; + g = color[ 1 ]; + b = color[ 2 ]; + i *= color[ 3 ]; + } + if ( i ) + { + int flags; + + flags = 0; + if ( cent->currentState.renderfx & RF_LENSFLARE ) + { + flags |= lensflare; + } + else if ( cent->currentState.renderfx & RF_VIEWLENSFLARE ) + { + flags |= viewlensflare; + } + if ( cent->currentState.renderfx & RF_ADDITIVE_DLIGHT ) + { + flags |= additive; + } + cgi.R_AddLightToScene( cent->lerpOrigin, i, r, g, b, flags ); + } + if ( r < cent->color[ 0 ] ) + cent->color[ 0 ] = r; + if ( g < cent->color[ 1 ] ) + cent->color[ 1 ] = g; + if ( b < cent->color[ 2 ] ) + cent->color[ 2 ] = b; + } + } + +/* +================== +CG_General +================== +*/ +void CG_General( centity_t *cent ) { + refEntity_t ent; + entityState_t *s1; + int i; + int tikihandle; + + s1 = ¢->currentState; + + // add loop sound + if ( s1->loopSound ) + { + cgi.S_AddLoopingSound( cent->lerpOrigin, vec3_origin, cgs.sound_precache[s1->loopSound], s1->loopSoundVolume, s1->loopSoundMinDist ); + } + if ( cent->tikiLoopSound ) + cgi.S_AddLoopingSound( cent->lerpOrigin, vec3_origin, cent->tikiLoopSound, cent->tikiLoopSoundVolume, cent->tikiLoopSoundMinDist ); + + // if set to invisible, skip + if (!s1->modelindex) { + return; + } + + memset (&ent, 0, sizeof(ent)); + + // set frame + + ent.frame = s1->frame; + ent.oldframe = ent.frame; + ent.backlerp = 0; + ent.uselegs = qtrue; + + VectorCopy( cent->lerpOrigin, ent.origin); + VectorCopy( cent->lerpOrigin, ent.oldorigin); + + // set skin + ent.skinNum = s1->skinNum; + ent.customSkin = 0; + + ent.hModel = cgs.model_draw[s1->modelindex]; + + // set surfaces + memcpy( ent.surfaces, s1->surfaces, MAX_MODEL_SURFACES ); + + // Modulation based off the color + for( i=0; i<3; i++ ) + ent.shaderRGBA[ i ] = cent->color[ i ] * 255; + + // take the alpha from the entity if less than 1, else grab it from the client commands version + if ( s1->alpha < 1 ) + { + ent.shaderRGBA[ 3 ] = s1->alpha * 255; + } + else + { + ent.shaderRGBA[ 3 ] = cent->color[ 3 ] * 255; + } + + // convert angles to axis + AnglesToAxis( cent->lerpAngles, ent.axis ); + + // Interpolated state variables + if ( cent->interpolate ) + { + ent.scale = s1->scale + cg.frameInterpolation * ( cent->nextState.scale - cent->currentState.scale ); + } + else + { + ent.scale = s1->scale; + } + // set the entity number + ent.entityNumber = s1->number; + + // copy shader specific data + ent.shader_data[ 0 ] = s1->tag_num; + ent.shader_data[ 1 ] = s1->skinNum; + ent.renderfx |= s1->renderfx; + + if ( ent.renderfx & RF_SKYORIGIN ) + { + memcpy( cg.sky_axis, ent.axis, sizeof( cg.sky_axis ) ); + VectorCopy( ent.origin, cg.sky_origin ); + } + + tikihandle = cgs.model_tiki[ s1->modelindex ]; + if ( tikihandle >= 0 ) + { + // update any emitter's... + CG_UpdateEntity( tikihandle, &ent, cent ); + } + + if ( s1->eFlags & ( EF_LEFT_TARGETED | EF_RIGHT_TARGETED ) ) + { + CG_EntityTargeted( tikihandle, cent, &ent ); + } + + // add to refresh list + if ( !( ent.renderfx & RF_DONTDRAW ) ) + cgi.R_AddRefEntityToScene (&ent); +} + +/* +================== +CG_Speaker + +Speaker entities can automatically play sounds +================== +*/ +void CG_Speaker( centity_t *cent ) + { + if ( ! cent->currentState.clientNum ) // FIXME: use something other than clientNum... + { + return; // not auto triggering + } + + if ( cg.time < cent->miscTime ) + { + return; + } + + // FIXME + //cgi.S_StartSound (NULL, cent->currentState.number, CHAN_ITEM, cgs.sound_precache[cent->currentState.eventParm] ); + + // ent->s.frame = ent->wait * 10; + // ent->s.clientNum = ent->random * 10; + cent->miscTime = cg.time + cent->currentState.frame * 100 + cent->currentState.clientNum * 100 * crandom(); + } + + +/* +=============== +CG_Mover +=============== +*/ +void CG_Mover( centity_t *cent ) { + refEntity_t ent; + entityState_t *s1; + + s1 = ¢->currentState; + + // create the render entity + memset (&ent, 0, sizeof(ent)); + VectorCopy( cent->lerpOrigin, ent.origin); + VectorCopy( cent->lerpOrigin, ent.oldorigin); + AnglesToAxis( cent->lerpAngles, ent.axis ); + + ent.renderfx &= ~RF_SHADOW; + + // flicker between two skins (FIXME?) + ent.skinNum = ( cg.time >> 6 ) & 1; + + // get the model, either as a bmodel or a modelindex + if ( s1->solid == SOLID_BMODEL ) { + ent.hModel = cgs.inlineDrawModel[s1->modelindex]; + } else { + ent.hModel = cgs.model_draw[s1->modelindex]; + } + + // add to refresh list + cgi.R_AddRefEntityToScene(&ent); +} + +/* +=============== +CG_Sprite +=============== +*/ +void CG_Sprite( centity_t *cent ) + { + refEntity_t ent; + entityState_t *s1; + int i; + + s1 = ¢->currentState; + + memset( &ent, 0, sizeof( refEntity_t ) ); + + if ( s1->parent != ENTITYNUM_NONE ) + { + refEntity_t *parent; + int tikihandle; + + parent = cgi.R_GetRenderEntity( s1->parent ); + + if ( !parent ) + { + cgi.DPrintf( "CG_Sprite: Could not find parent entity\n" ); + return; + } + + tikihandle = cgi.TIKI_GetHandle( parent->hModel ); + CG_AttachEntity( &ent, parent, tikihandle, s1->tag_num & TAG_MASK, s1->attach_use_angles, s1->attach_offset ); + } + else + { + VectorCopy( cent->lerpOrigin, ent.origin); + VectorCopy( cent->lerpOrigin, ent.oldorigin); + } + + ent.hModel = cgs.model_draw[s1->modelindex]; + + // Modulation based off the color + for( i=0; i<3; i++ ) + ent.shaderRGBA[ i ] = cent->color[ i ] * 255; + + // take the alpha from the entity if less than 1, else grab it from the client commands version + if ( s1->alpha < 1 ) + ent.shaderRGBA[ 3 ] = s1->alpha * 255; + else + ent.shaderRGBA[ 3 ] = cent->color[ 3 ] * 255; + + ent.renderfx |= s1->renderfx; + + // convert angles to axis + AnglesToAxis( cent->lerpAngles, ent.axis ); + + // Interpolated state variables + if ( cent->interpolate ) + { + ent.scale = s1->scale + cg.frameInterpolation * ( cent->nextState.scale - cent->currentState.scale ); + } + else + { + ent.scale = s1->scale; + } + + // add to refresh list + if ( !( cent->currentState.renderfx & RF_DONTDRAW ) ) + cgi.R_AddRefSpriteToScene( &ent ); + } + +/* +================== +CG_Item +================== +*/ +void CG_Item( centity_t *cent ) + { + entityState_t *es; + int thandle; + float radius, scale; + float frac; + vec3_t mins, maxs, mid, start, save; + polyVert_t verts[4]; + + es = ¢->currentState; + + // if set to invisible, skip + if ( !es->modelindex || ( es->parent != ENTITYNUM_NONE ) || ( es->renderfx & RF_DONTDRAW ) ) + { + return; + } + + // autorotate + VectorCopy( cg.autoAngles, cent->lerpAngles ); + + thandle = cgs.model_tiki[ es->modelindex ]; + if ( thandle == -1 ) + return; + + radius = cgi.R_ModelRadius( cgs.model_draw[ es->modelindex ] ) * 0.5f * es->scale; + cgi.R_ModelBounds( cgs.model_draw[ es->modelindex ], mins, maxs ); + VectorAdd( mins, maxs, mid ); + VectorScale( mid, 0.5f * es->scale, mid ); + + // offset the model from the ground + cent->lerpOrigin[ 2 ] += radius; + + // save off the center of the model for the rings + VectorCopy( cent->lerpOrigin, save ); + + // items bob up and down continuously + scale = 0.005 + es->number * 0.00001; + cent->lerpOrigin[2] += ( radius * 0.2f ) + cos( ( cg.time + 1000 ) * scale ) * ( radius * 0.2f ); + + // offset the origin to the centroid + cent->lerpOrigin[0] -= + mid[0] * cg.autoAxis[0][0] + + mid[1] * cg.autoAxis[1][0] + + mid[2] * cg.autoAxis[2][0]; + cent->lerpOrigin[1] -= + mid[0] * cg.autoAxis[0][1] + + mid[1] * cg.autoAxis[1][1] + + mid[2] * cg.autoAxis[2][1]; + + cent->lerpOrigin[2] -= + mid[0] * cg.autoAxis[0][2] + + mid[1] * cg.autoAxis[1][2] + + mid[2] * cg.autoAxis[2][2]; + + scale *= 0.5f; + + frac = cos( ( cg.time + 1000 ) * scale ) * radius; + VectorCopy( save, start ); + start[ 2 ] += frac; + frac = 1.5f * ( radius - fabs( frac * 0.5f ) ); + + // add the item rings + VectorCopy( start, verts[ 0 ].xyz ); + verts[ 0 ].xyz[ 0 ] -= frac; + verts[ 0 ].xyz[ 1 ] -= frac; + verts[ 0 ].st[0] = 0; + verts[ 0 ].st[1] = 0; + verts[ 0 ].modulate[0] = 255; + verts[ 0 ].modulate[1] = 255; + verts[ 0 ].modulate[2] = 255; + verts[ 0 ].modulate[3] = 255; + + VectorCopy( start, verts[ 1 ].xyz ); + verts[ 1 ].xyz[ 0 ] -= frac; + verts[ 1 ].xyz[ 1 ] += frac; + verts[ 1 ].st[0] = 0; + verts[ 1 ].st[1] = 1; + verts[ 1 ].modulate[0] = 255; + verts[ 1 ].modulate[1] = 255; + verts[ 1 ].modulate[2] = 255; + verts[ 1 ].modulate[3] = 255; + + VectorCopy( start, verts[ 2 ].xyz ); + verts[ 2 ].xyz[ 0 ] += frac; + verts[ 2 ].xyz[ 1 ] += frac; + verts[ 2 ].st[0] = 1; + verts[ 2 ].st[1] = 1; + verts[ 2 ].modulate[0] = 255; + verts[ 2 ].modulate[1] = 255; + verts[ 2 ].modulate[2] = 255; + verts[ 2 ].modulate[3] = 255; + + VectorCopy( start, verts[ 3 ].xyz ); + verts[ 3 ].xyz[ 0 ] += frac; + verts[ 3 ].xyz[ 1 ] -= frac; + verts[ 3 ].st[0] = 1; + verts[ 3 ].st[1] = 0; + verts[ 3 ].modulate[0] = 255; + verts[ 3 ].modulate[1] = 255; + verts[ 3 ].modulate[2] = 255; + verts[ 3 ].modulate[3] = 255; + + cgi.R_AddPolyToScene( cgs.media.itemRingShader, 4, verts, 0 ); + + frac = cos( ( cg.time + 1000 ) * scale + DEG2RAD( 180 ) ) * radius; + VectorCopy( save, start ); + start[ 2 ] += frac; + frac = 1.5f * ( radius - fabs( frac * 0.5f ) ); + + VectorCopy( start, verts[ 0 ].xyz ); + verts[ 0 ].xyz[ 0 ] -= frac; + verts[ 0 ].xyz[ 1 ] -= frac; + + VectorCopy( start, verts[ 1 ].xyz ); + verts[ 1 ].xyz[ 0 ] -= frac; + verts[ 1 ].xyz[ 1 ] += frac; + + VectorCopy( start, verts[ 2 ].xyz ); + verts[ 2 ].xyz[ 0 ] += frac; + verts[ 2 ].xyz[ 1 ] += frac; + + VectorCopy( start, verts[ 3 ].xyz ); + verts[ 3 ].xyz[ 0 ] += frac; + verts[ 3 ].xyz[ 1 ] -= frac; + + cgi.R_AddPolyToScene( cgs.media.itemRingShader, 4, verts, 0 ); + + } + + +/* +=============== +CG_Beam +=============== +*/ +void CG_Beam( centity_t *cent ) { + entityState_t *s1; + vec3_t vz={0,0,0},origin={0,0,0}; + byte modulate[4]; + int i; + + s1 = ¢->currentState; + + for ( i=0;i<4;i++ ) + modulate[i] = cent->color[i] * 255; + + if ( s1->torso_anim != ENTITYNUM_NONE ) + { + refEntity_t *parent; + parent = cgi.R_GetRenderEntity( s1->torso_anim ); + + if ( !parent ) + { + cgi.DPrintf( "CG_Beam: Could not find parent entity\n" ); + return; + } + + VectorAdd( s1->origin, parent->origin, origin ); + } + else + { + VectorCopy( s1->origin, origin ); + } + + CG_CreateBeam( origin, // start + vz, // dir ( auto calculated by using origin2-origin ) + s1->number, // owner number + cgs.model_draw[s1->modelindex], //hModel + s1->alpha, // alpha + s1->scale, // scale + s1->skinNum, // flags + 0, // length ( auto calculated ) + PKT_TO_BEAM_PARM( s1->surfaces[0] ) * 1000, // life + qfalse, // don't always create the beam, just update it + s1->origin2, // endpoint + s1->bone_angles[0][0], // min offset + s1->bone_angles[0][1], // max offset + PKT_TO_BEAM_PARM( s1->surfaces[3] ), // overlap + s1->surfaces[4], // subdivisions + PKT_TO_BEAM_PARM( s1->surfaces[5] ) * 1000, // delay + CG_ConfigString( CS_IMAGES + s1->tag_num ), // index for shader configstring + modulate, // modulate color + s1->surfaces[6], // num sphere beams + PKT_TO_BEAM_PARM( s1->surfaces[7] ), // sphere radius + PKT_TO_BEAM_PARM( s1->surfaces[8] ), // toggle delay + PKT_TO_BEAM_PARM( s1->surfaces[9] ), // end alpha + s1->renderfx, + "" + ); +} + + +void CG_Decal + ( + centity_t *cent + ) + + { + qhandle_t shader; + vec3_t dir; + entityState_t *s1; + + s1 = ¢->currentState; + + shader = cgi.R_RegisterShader( CG_ConfigString( CS_IMAGES + s1->tag_num ) ); + ByteToDir( s1->surfaces[0], dir ); + CG_ImpactMark( shader, + s1->origin, + dir, + s1->angles[2], + cent->color[0], + cent->color[1], + cent->color[2], + cent->color[3], + qtrue, + s1->scale, + qfalse, + -1, + qfalse); + } + +/* +=============== +CG_Portal +=============== +*/ +void CG_Portal( centity_t *cent ) + { + refEntity_t ent; + entityState_t *s1; + + s1 = ¢->currentState; + + // create the render entity + memset (&ent, 0, sizeof(ent)); + VectorCopy( cent->lerpOrigin, ent.origin ); + VectorCopy( s1->origin2, ent.oldorigin ); + AnglesToAxis( cent->currentState.angles, ent.axis ); + + // negating this tends to get the directions like they want + // we really should have a camera roll value + VectorSubtract( vec3_origin, ent.axis[1], ent.axis[1] ); + VectorSubtract( vec3_origin, ent.axis[2], ent.axis[2] ); + + ent.reType = RT_PORTALSURFACE; + ent.frame = s1->frame; // rotation speed + ent.skinNum = s1->clientNum/256.0 * 360; // roll offset + + // add to refresh list + cgi.R_AddRefEntityToScene(&ent); + } + + +/* +========================= +CG_AdjustPositionForMover +========================= +*/ +void CG_AdjustPositionForMover( const vec3_t in, int moverNum, int fromTime, int toTime, vec3_t out ) { + centity_t *cent; + vec3_t oldOrigin, origin, deltaOrigin; + vec3_t oldAngles, angles; + + if ( moverNum == ENTITYNUM_NONE ) { + VectorCopy( in, out ); + return; + } + + cent = &cg_entities[ moverNum ]; + + if ( cent->currentState.pos.trType == TR_LERP ) { + int i; + + if ( cent->interpolate ) + { + // we calculate lerpOrigin so we have always have the latest info. It is possible to call this before lerpOrigin + // is updated by AddEntities + for ( i=0; i<3; i++ ) + { + cent->lerpOrigin[i] = cent->currentState.origin[i] + + cg.frameInterpolation * ( cent->nextState.origin[i] - cent->currentState.origin[i] ); + } + } + for ( i=0; i<3; i++ ) + { + out[ i ] = in[ i ] + ( cent->lerpOrigin[i] - cent->currentState.origin[i] ); + } + return; + + } else if ( cent->currentState.eType != ET_MOVER ) { + VectorCopy( in, out ); + return; + } + + EvaluateTrajectory( ¢->currentState.pos, fromTime, oldOrigin ); + EvaluateTrajectory( ¢->currentState.apos, fromTime, oldAngles ); + + EvaluateTrajectory( ¢->currentState.pos, toTime, origin ); + EvaluateTrajectory( ¢->currentState.apos, toTime, angles ); + + VectorSubtract( origin, oldOrigin, deltaOrigin ); + + VectorAdd( in, deltaOrigin, out ); + + // FIXME: origin change when on a rotating object +} + + +/* +=============== +CG_CalcEntityLerpPositions + +=============== +*/ +void CG_CalcEntityLerpPositions( centity_t *cent ) { + int i; + float f; + + f = cg.frameInterpolation; + + if ( cg.snap->ps.pm_type < PM_DEAD ) + { + if ( cent->currentState.number == cg.snap->ps.clientNum ) + { + // if the player, take position from prediction + VectorCopy( cg.predicted_player_state.origin, cent->lerpOrigin ); + for ( i=0; i<3; i++ ) { + cent->lerpAngles[i] = LerpAngle( cent->currentState.angles[i], cent->nextState.angles[i], f ); + } + + return; + } + } + + if ( cent->currentState.pos.trType == TR_LERP ) { + float quat[ 4 ]; + float mat[ 3 ][ 3 ]; + + if ( !cent->interpolate ) { + VectorCopy( cent->currentState.angles, cent->lerpAngles ); + VectorCopy( cent->currentState.origin, cent->lerpOrigin ); + return; + } + + // it would be an internal error to find an entity that interpolates without + // a snapshot ahead of the current one + if ( cg.nextSnap == NULL ) { + cgi.Error( ERR_DROP, "CG_AddCEntity: cg.nextSnap == NULL" ); + } + + for ( i=0; i<3; i++ ) { + cent->lerpOrigin[i] = cent->currentState.origin[i] + + f * ( cent->nextState.origin[i] - cent->currentState.origin[i] ); + } + + if ( !memcmp( cent->currentState.angles, cent->nextState.angles, sizeof( vec3_t ) ) ) { + VectorCopy( cent->currentState.angles, cent->lerpAngles ); + } else { + // use spherical interpolation using quaternions so that bound objects + // rotate properly without gimble lock. + SlerpQuaternion( cent->currentState.quat, cent->nextState.quat, f, quat ); + QuatToMat( quat, mat ); + MatrixToEulerAngles( mat, cent->lerpAngles ); + } + } else if ( cent->interpolate && cent->currentState.pos.trType == TR_INTERPOLATE ) { + // if the entity has a valid next state, interpolate a value between the frames + // unless it is a mover with a known start and stop + vec3_t current, next; + + // it would be an internal error to find an entity that interpolates without + // a snapshot ahead of the current one + if ( cg.nextSnap == NULL ) { + cgi.Error( ERR_DROP, "CG_AddCEntity: cg.nextSnap == NULL" ); + } + + // this will linearize a sine or parabolic curve, but it is important + // to not extrapolate player positions if more recent data is available + EvaluateTrajectory( ¢->currentState.pos, cg.snap->serverTime, current ); + EvaluateTrajectory( ¢->nextState.pos, cg.nextSnap->serverTime, next ); + + cent->lerpOrigin[0] = current[0] + f * ( next[0] - current[0] ); + cent->lerpOrigin[1] = current[1] + f * ( next[1] - current[1] ); + cent->lerpOrigin[2] = current[2] + f * ( next[2] - current[2] ); + + EvaluateTrajectory( ¢->currentState.apos, cg.snap->serverTime, current ); + EvaluateTrajectory( ¢->nextState.apos, cg.nextSnap->serverTime, next ); + + // Lerp legs, torso, and head angles + for ( i=0; i<3; i++ ) { + cent->lerpAngles[i] = LerpAngle( current[i], next[i], f ); + } + } else { + // just use the current frame and evaluate as best we can + EvaluateTrajectory( ¢->currentState.pos, cg.time, cent->lerpOrigin ); + EvaluateTrajectory( ¢->currentState.apos, cg.time, cent->lerpAngles ); + + // adjust for riding a mover + CG_AdjustPositionForMover( cent->lerpOrigin, cent->currentState.groundEntityNum, + cg.snap->serverTime, cg.time, cent->lerpOrigin ); + } +} + +/* +=============== +CG_AddCEntity + +=============== +*/ +void CG_AddCEntity( centity_t *cent ) +{ + // event-only entities will have been dealt with already + if ( cent->currentState.eType >= ET_EVENTS ) { + return; + } + + // calculate the current origin + CG_CalcEntityLerpPositions( cent ); + + // add automatic effects + CG_EntityEffects( cent ); + + CG_SetEntitySoundPosition( cent ); + + switch ( cent->currentState.eType ) { + default: + cgi.Error( ERR_DROP, "Bad entity type: %i\n", cent->currentState.eType ); + break; + case ET_PLAYER: + CG_Player( cent ); + // intentional fallthrough + case ET_MODELANIM: + CG_Splash( cent ); + CG_ModelAnim( cent ); + break; + case ET_ITEM: + CG_Item( cent ); + CG_ModelAnim( cent ); + break; + case ET_GENERAL: + CG_General( cent ); + break; + case ET_MOVER: + CG_Mover( cent ); + break; + case ET_BEAM: + CG_Beam( cent ); + break; + case ET_ROPE: // skip + CG_Rope( cent ); + break; + case ET_MULTIBEAM: // skip + break; + case ET_SPRITE: + CG_Sprite( cent ); + break; + case ET_PORTAL: + CG_Portal( cent ); + break; + case ET_RAIN: + case ET_EMITTER: + CG_Emitter( cent ); + break; + case ET_DECAL: + CG_Decal( cent ); + break; + } + } + +/* +=============== +CG_AddPacketEntities + +=============== +*/ +void CG_AddPacketEntities( void ) { + int num; + centity_t *cent; +// playerState_t *ps; + + // the auto-rotating items will all have the same axis + cg.autoAngles[0] = 0; + cg.autoAngles[1] = ( cg.time & 2047 ) * 360 / 2048.0; + cg.autoAngles[2] = 0; + + cg.autoAnglesSlow[0] = 0; + cg.autoAnglesSlow[1] = ( cg.time & 4095 ) * 360 / 4096.0f; + cg.autoAnglesSlow[2] = 0; + + cg.autoAnglesFast[0] = 0; + cg.autoAnglesFast[1] = ( cg.time & 1023 ) * 360 / 1024.0f; + cg.autoAnglesFast[2] = 0; + + AnglesToAxis( cg.autoAngles, cg.autoAxis ); + AnglesToAxis( cg.autoAnglesSlow, cg.autoAxisSlow ); + AnglesToAxis( cg.autoAnglesFast, cg.autoAxisFast ); + + // generate and add the entity from the playerstate + //ps = &cg.predicted_player_state; + //PlayerStateToEntityState( ps, &cg_entities[ ps->clientNum ].currentState ); + //CG_AddCEntity( &cg_entities[ ps->clientNum ] ); + + // add each entity sent over by the server + for ( num = 0 ; num < cg.snap->numEntities ; num++ ) { + cent = &cg_entities[ cg.snap->entities[ num ].number ]; + CG_AddCEntity( cent ); + } + + // Add in the multibeams at the end + for ( num = 0 ; num < cg.snap->numEntities ; num++ ) { + cent = &cg_entities[ cg.snap->entities[ num ].number ]; + if ( cent->currentState.eType == ET_MULTIBEAM ) + CG_MultiBeam( cent ); + } + +} + +void CG_GetOrigin( centity_t *cent, vec3_t origin ) + { + if ( cent->currentState.parent == ENTITYNUM_NONE ) + { + VectorCopy( cent->lerpOrigin, origin ); + } + else + { + int i; + orientation_t or; + refEntity_t *parent; + int tikihandle; + + parent = cgi.R_GetRenderEntity( cent->currentState.parent ); + + if ( !parent ) + { + cgi.DPrintf( "CG_GetOrigin: Could not find parent entity\n" ); + return; + } + + tikihandle = cgi.TIKI_GetHandle( parent->hModel ); + + // lerp the tag + if ( r_lerpmodels->integer ) + { + or = cgi.Tag_LerpedOrientation( tikihandle, parent, cent->currentState.tag_num ); + } + else + { + //FIXME + // doesn't handle torso animations + or = cgi.Tag_Orientation( tikihandle, parent->anim, parent->frame, cent->currentState.tag_num, parent->scale, + parent->bone_tag, parent->bone_quat ); + } + + VectorCopy( parent->origin, origin ); + + for ( i = 0 ; i < 3 ; i++ ) + { + VectorMA( origin, or.origin[i], parent->axis[i], origin ); + } + } + } + diff --git a/source/source/cgame/cg_event.c b/source/source/cgame/cg_event.c new file mode 100644 index 0000000..c24b2e5 --- /dev/null +++ b/source/source/cgame/cg_event.c @@ -0,0 +1,35 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/cgame/cg_event.c $ +// $Revision:: 4 $ +// $Author:: Aldie $ +// $Date:: 10/05/99 6:01p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/cgame/cg_event.c $ +// +// 4 10/05/99 6:01p Aldie +// Added headers +// +// DESCRIPTION: +// handle entity events at snapshot or playerstate transitions + +#include "cg_local.h" + + +/* +============== +CG_EntityEvent + +An entity has an event value +============== +*/ + +void CG_EntityEvent( centity_t *cent, vec3_t position ) + { + } diff --git a/source/source/cgame/cg_lightstyles.cpp b/source/source/cgame/cg_lightstyles.cpp new file mode 100644 index 0000000..340d0ae --- /dev/null +++ b/source/source/cgame/cg_lightstyles.cpp @@ -0,0 +1,640 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/cgame/cg_lightstyles.cpp $ +// $Revision:: 7 $ +// $Author:: Markd $ +// $Date:: 6/14/00 12:14p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/cgame/cg_lightstyles.cpp $ +// +// 7 6/14/00 12:14p Markd +// more intel compiler bug fixes +// +// 6 5/09/00 1:33p Markd +// added some lightstyle utilities to SetLightStyle +// +// 5 5/08/00 6:12p Markd +// Added lightstyle support for the client +// +// 4 3/04/00 1:35p Markd +// fixed lerping bug with lightstyles +// +// 3 3/04/00 12:23p Markd +// Fixed some lightstyle bugs +// +// 2 3/04/00 11:45a Markd +// Added light style support and malloc and free to the cgame +// +// 1 3/04/00 11:02a Markd +// +// DESCRIPTION: +// light style code + +#include "cg_local.h" + +/* +=================================================================== + +LIGHT STYLE CODE + +=================================================================== +*/ + +#define MAX_LIGHTSTYLE_LENGTH 128 +#define MAX_LIGHTSTYLE_NAME_LENGTH 64 + +typedef struct + { + char name[ MAX_LIGHTSTYLE_NAME_LENGTH ]; + qboolean hasalpha; + int length; + float map[ MAX_LIGHTSTYLE_LENGTH ][ 4 ]; + } clightstyle_t; + +clightstyle_t cg_lightstyle[ MAX_LIGHTSTYLES * 2 ]; + +/* +================ +CG_LightStyleColor +================ +*/ +qboolean CG_LightStyleColor( int style, int realtime, float color[4], qboolean clamp ) + { + clightstyle_t *ls; + int i, time; + float frac; + qboolean at_end; + + time = realtime / 50; + frac = ( realtime - ( time * 50.0f ) ) / 50.0f; + memset( color, 0, sizeof( color ) ); + if ( ( style < 0 ) || ( style >= ( MAX_LIGHTSTYLES * 2 ) ) ) + { + cgi.DPrintf ("CG_LightStyleColor: style out of range.\n"); + return qtrue; + } + + ls = &cg_lightstyle[ style ]; + + if ( !ls->length ) + { + cgi.DPrintf ("CG_LightStyleColor: style %d has zero length.\n", style); + return qtrue; + } + + // by default we are not at the end + at_end = qfalse; + if ( clamp ) + { + if ( time >= ls->length ) + { + time = ls->length - 1; + at_end = qtrue; + } + } + else + { + time %= ls->length; + } + + // + // only lerp if we are before the end + // + if ( time == ls->length - 1 ) + { + memcpy( color, ls->map[ time ], 4 * sizeof( ls->map[ time ][ 0 ] ) ); + } + else + { + for( i = 0; i < 4; i++ ) + { + color[ i ] = ls->map[ time ][ i ] + frac * ( ls->map[ time + 1 ][ i ] - ls->map[ time ][ i ] ); + } + } + + if ( !ls->hasalpha ) + color[ 3 ] = 1; + + return at_end; + } + +/* +============= +LoadTGA +============= +*/ +static qboolean LoadTGA(const char * name, byte ** pic, int *width, int *height, qboolean * hasalpha ) + { + int columns, rows, numPixels; + byte *pixbuf; + int row, column; + byte *buf_p; + byte *buffer; + TargaHeader targa_header; + byte *targa_rgba; + byte targa_palette[ 256 * 4 ]; + int i; + + *pic = NULL; + *hasalpha = false; + + // + // load the file + // + cgi.FS_ReadFile(name, (void **)&buffer, qtrue); + if (!buffer) + { + cgi.DPrintf( "TGA File not found: %s\n", name ); + return false; + } + + buf_p = buffer; + + targa_header.id_length = *buf_p++; + targa_header.colormap_type = *buf_p++; + targa_header.image_type = *buf_p++; + + targa_header.colormap_index = LittleShort ( *((short *)buf_p) ); + buf_p += 2; + targa_header.colormap_length = LittleShort ( *((short *)buf_p) ); + buf_p += 2; + targa_header.colormap_size = *buf_p++ / 8; + targa_header.x_origin = LittleShort ( *((short *)buf_p) ); + buf_p += 2; + targa_header.y_origin = LittleShort ( *((short *)buf_p) ); + buf_p += 2; + targa_header.width = LittleShort ( *((short *)buf_p) ); + buf_p += 2; + targa_header.height = LittleShort ( *((short *)buf_p) ); + buf_p += 2; + targa_header.pixel_size = *buf_p++; + targa_header.attributes = *buf_p++; + + if (targa_header.image_type!=1 + && targa_header.image_type!=2 + && targa_header.image_type!=10) + { + cgi.DPrintf("LoadTGA: Only type 1, 2 and 10 targa RGB images supported\n"); + return false; + } + + if ( (targa_header.colormap_type !=0 && targa_header.colormap_type !=1) + || (targa_header.pixel_size!=32 && targa_header.pixel_size!=24 && targa_header.pixel_size!=8)) + { + cgi.DPrintf("LoadTGA: Only 24, 32 and colormap images supported (no colormaps)\n"); + return false; + } + + columns = targa_header.width; + rows = targa_header.height; + numPixels = columns * rows; + + if (width) + *width = columns; + if (height) + *height = rows; + + targa_rgba = ( byte * )cgi.Malloc( numPixels * 4 ); + *pic = targa_rgba; + + if (targa_header.id_length != 0) + buf_p += targa_header.id_length; // skip TARGA image comment + + for (i=0;i=0; row--) + { + pixbuf = targa_rgba + row*columns; + for(column=0; column=0; row--) { + pixbuf = targa_rgba + row*columns*4; + for(column=0; column=0; row--) { + pixbuf = targa_rgba + row*columns*4; + for(column=0; column0) + row--; + else + goto breakOut; + pixbuf = targa_rgba + row*columns*4; + } + } + } + else { // non run-length packet + for(j=0;j0) + row--; + else + goto breakOut; + pixbuf = targa_rgba + row*columns*4; + } + } + } + } + breakOut:; + } + } + cgi.FS_FreeFile( buffer ); + return true; + } + +void createLightstyleFromTGA( int num, const char *filename ) + { + byte *data=0; + int i, j, width, height; + qboolean hasalpha; + + if (!LoadTGA(filename, &data, &width, &height, &hasalpha)) + { + return; + } + + if ( width > MAX_LIGHTSTYLE_LENGTH ) + { + cgi.DPrintf("createLightstyleFromTGA: Light style too large, truncating.\n",filename); + width = MAX_LIGHTSTYLE_LENGTH; + } + + strncpy( cg_lightstyle[ num ].name, filename, MAX_LIGHTSTYLE_NAME_LENGTH ); + cg_lightstyle[ num ].hasalpha = hasalpha; + cg_lightstyle[ num ].length = width; + + for( i = 0; i < width; i++ ) + { + for ( j = 0; j < 4; j++ ) + { + cg_lightstyle[ num ].map[ i ][ j ] = ( float )data[ ( i * 4 ) + j ] / 255.0f; + } + } + + if ( data ) + cgi.Free( data ); + } + +void CG_SetLightStyle( int num, const char *s ) + { + char *r, *g, *b, *a; + int j, k, n, len; + float t; + + if ( ( num < 0 ) || ( num >= ( MAX_LIGHTSTYLES * 2 ) ) ) + { + cgi.DPrintf ("CG_SetLightStyle: num out of range.\n"); + return; + } + + len = strlen( s ); + + if ( !strcmpi( &s[ len - 4 ], ".tga" ) ) + { + createLightstyleFromTGA( num, s ); + return; + } + + if ( !s ) + return; + + r = strchr( s, 'R' ); + g = strchr( s, 'G' ); + b = strchr( s, 'B' ); + a = strchr( s, 'A' ); + + n = 0; + if (r) + n++; + if (g) + n++; + if (b) + n++; + if (a) + n++; + if (!n) + n++; + + if (!a) + cg_lightstyle[ num ].hasalpha = false; + else + cg_lightstyle[ num ].hasalpha = true; + + j = strlen (s) / n; + if (j >= MAX_LIGHTSTYLE_LENGTH) + { + cgi.DPrintf ( "svc_lightstyle length=%i", j); + j = MAX_LIGHTSTYLE_LENGTH - 1; + } + + if ( !r && !g && !b && !a ) + { + cg_lightstyle[ num ].length = j; + for( k = 0; k < j; k++ ) + { + t = ( float )( s[ k ] - 'a' ) * 127.5f / 12.5; + if ( t > 255 ) + { + t = 255.0f; + } + cg_lightstyle[ num ].map[ k ][ 0 ] = t / 255.0f; + cg_lightstyle[ num ].map[ k ][ 1 ] = t / 255.0f; + cg_lightstyle[ num ].map[ k ][ 2 ] = t / 255.0f; + cg_lightstyle[ num ].map[ k ][ 3 ] = 1; + } + } + else + { + n = 0; + // red + k = 0; + t = 0; + if ( r ) + { + r++; + while( ( r[ k ] >= 'a' ) && ( r[ k ] <= 'z' ) ) + { + t = ( float )( r[ k ] - 'a' ) * 127.5f / 12.5; + if ( t > 255 ) + { + t = 255.0f; + } + cg_lightstyle[ num ].map[ k ][ 0 ] = t / 255.0f; + k++; + } + n = k; + } + while( k < MAX_LIGHTSTYLE_LENGTH ) + { + cg_lightstyle[ num ].map[ k++ ][ 0 ] = t / 255.0f; + } + + // green + k = 0; + t = 0; + if ( g ) + { + g++; + while( ( g[ k ] >= 'a' ) && ( g[ k ] <= 'z' ) ) + { + t = ( float )( g[ k ] - 'a' ) * 127.5f / 12.5; + if ( t > 255 ) + { + t = 255.0f; + } + cg_lightstyle[ num ].map[ k ][ 1 ] = t / 255.0f; + k++; + } + n = max( n, k ); + } + while( k < MAX_LIGHTSTYLE_LENGTH ) + { + cg_lightstyle[ num ].map[ k++ ][ 1 ] = t / 255.0f; + } + + // blue + k = 0; + t = 0; + if ( b ) + { + b++; + while( ( b[ k ] >= 'a' ) && ( b[ k ] <= 'z' ) ) + { + t = ( float )( b[ k ] - 'a' ) * 127.5f / 12.5; + if ( t > 255 ) + { + t = 255.0f; + } + cg_lightstyle[ num ].map[ k ][ 2 ] = t / 255.0f; + k++; + } + n = max( n, k ); + } + while( k < MAX_LIGHTSTYLE_LENGTH ) + { + cg_lightstyle[ num ].map[ k++ ][ 2 ] = t / 255.0f; + } + + // alpha + k = 0; + t = 255; + if ( a ) + { + a++; + while( ( a[ k ] >= 'a' ) && ( a[ k ] <= 'z' ) ) + { + t = ( float )( a[ k ] - 'a' ) * 127.5f / 25; + if ( t > 255 ) + { + t = 255.0f; + } + cg_lightstyle[ num ].map[ k ][ 3 ] = t / 255.0f; + k++; + } + n = max( n, k ); + } + while( k < MAX_LIGHTSTYLE_LENGTH ) + { + cg_lightstyle[ num ].map[ k++ ][ 3 ] = t / 255.0f; + } + + cg_lightstyle[ num ].length = n; + } + } + +/* +================ +CG_GetLightStyle +================ +*/ +int CG_GetLightStyle( const char * name ) + { + int i; + + for( i = MAX_LIGHTSTYLES; i < MAX_LIGHTSTYLES * 2; i++ ) + { + if ( !strcmpi( cg_lightstyle[ i ].name, name ) ) + { + return i; + } + } + return -1; + } + +/* +================ +CG_GetFreeLightStyle +================ +*/ +int CG_GetFreeLightStyle( void ) + { + int i; + + for( i = MAX_LIGHTSTYLES; i < MAX_LIGHTSTYLES * 2; i++ ) + { + if ( !cg_lightstyle[ i ].name[ 0 ] ) + { + return i; + } + } + return -1; + } + +/* +================ +CG_ClearLightStyles +================ +*/ +void CG_ClearLightStyles( void ) + { + memset( cg_lightstyle, 0, sizeof( cg_lightstyle ) ); + } + +/* +================ +CG_RegisterLightStyle +================ +*/ +int CG_RegisterLightStyle( const char * name ) + { + int num; + + num = CG_GetLightStyle( name ); + if ( num == -1 ) + { + num = CG_GetFreeLightStyle(); + if ( num != -1 ) + { + CG_SetLightStyle( num, name ); + } + else + { + cgi.DPrintf ("CG_RegisterLightStyle: no free spots for lightstyle %s.\n"); + } + } + + return num; + } + diff --git a/source/source/cgame/cg_listener.cpp b/source/source/cgame/cg_listener.cpp new file mode 100644 index 0000000..ccf3653 --- /dev/null +++ b/source/source/cgame/cg_listener.cpp @@ -0,0 +1,1394 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/cgame/cg_listener.cpp $ +// $Revision:: 2 $ +// $Author:: Aldie $ +// $Date:: 9/10/99 5:24p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/cgame/cg_listener.cpp $ +// +// 2 9/10/99 5:24p Aldie +// Merge code +// +// 2 9/09/99 3:30p Aldie +// Merge +// +// 1 9/08/99 3:35p Aldie +// +// 5 7/29/99 3:32p Aldie +// Updated to new class system +// +// DESCRIPTION: +// + +#include "cg_local.h" +#include "cg_listener.h" + +cvar_t *cg_numevents; +cvar_t *cg_showevents; +cvar_t *cg_eventlimit; +cvar_t *cg_timeevents; +cvar_t *cg_watch; + +Vector vec_zero="0 0 0"; + +Event EV_Remove( "immediateremove" ); +Event EV_ScriptRemove( "remove" ); + +typedef struct eventcache_s + { + Listener *obj; + Event *event; + float time; + + struct eventcache_s *next; + struct eventcache_s *prev; + } eventcache_t; + +#define MAX_EVENTS 2000 + +extern "C" + { + eventcache_t Events[ MAX_EVENTS ]; + int numEvents = 0; + cvar_t *g_numevents; + }; + +eventcache_t FreeEventHead; +eventcache_t *FreeEvents = &FreeEventHead; +eventcache_t EventQueueHead; +eventcache_t *EventQueue = &EventQueueHead; + +Container *Event::commandList = NULL; +Container *Event::flagList = NULL; +Container *Event::sortedList = NULL; +qboolean Event::dirtylist = qfalse; + +qboolean IsNumeric + ( + const char *str + ) + + { + int len; + int i; + qboolean dot; + + if ( *str == '-' ) + { + str++; + } + + dot = qfalse; + len = strlen( str ); + for( i = 0; i < len; i++ ) + { + if ( !isdigit( str[ i ] ) ) + { + if ( ( str[ i ] == '.' ) && !dot ) + { + dot = qtrue; + continue; + } + return qfalse; + } + } + + return qtrue; + } + +Event NullEvent; + +CLASS_DECLARATION( Class, Event, NULL ) + { + { NULL, NULL } + }; + +int Event::NumEventCommands + ( + void + ) + + { + if ( commandList ) + { + // Add 1 since container gives the inclusive number of objects + return commandList->NumObjects() + 1; + } + + return 0; + } + +int Event::compareEvents + ( + const void *arg1, + const void *arg2 + ) + + { + int ev1; + int ev2; + + ev1 = *( int * )arg1; + ev2 = *( int * )arg2; + + return stricmp( commandList->ObjectAt( ev1 )->c_str(), commandList->ObjectAt( ev2 )->c_str() ); + } + +void Event::SortEventList + ( + void + ) + + { + dirtylist = qfalse; + + if ( sortedList && commandList ) + { +#ifndef EXPORT_TEMPLATE + qsort( ( void * )sortedList->AddressOfObjectAt( 1 ), + ( size_t )sortedList->NumObjects(), + sizeof( int ), compareEvents ); +#else + sortedList->Sort( compareEvents ); +#endif + } + } + +inline int Event::FindEvent + ( + const char *name + ) + + { + int eventnum; + int index; + int l; + int r; + int diff; + + assert( name ); + if ( !name ) + { + return 0; + } + + if ( !commandList ) + { + return 0; + } + + if ( dirtylist ) + { + SortEventList(); + } + + l = 1; + r = sortedList->NumObjects(); + while( r >= l ) + { + index = ( l + r ) >> 1; + eventnum = sortedList->ObjectAt( index ); + diff = stricmp( name, commandList->ObjectAt( eventnum )->c_str() ); + if ( diff < 0 ) + { + r = index - 1; + } + else if ( diff > 0 ) + { + l = index + 1; + } + else + { + return eventnum; + } + } + + return 0; + } + +int Event::FindEvent + ( + str &name + ) + + { + return FindEvent( name.c_str() ); + } + +void Event::ListCommands + ( + const char *mask + ) + + { + str name; + int flags; + int eventnum; + int num; + int i; + int n; + int l; + int p; + int hidden; + str text; + + if ( !commandList ) + { + cgi.Printf( "No events.\n" ); + return; + } + + if ( dirtylist ) + { + SortEventList(); + } + + l = 0; + if ( mask ) + { + l = strlen( mask ); + } + + hidden = 0; + num = 0; + n = sortedList->NumObjects(); + for( i = 1; i <= n; i++ ) + { + eventnum = sortedList->ObjectAt( i ); + name = commandList->ObjectAt( eventnum )->c_str(); + flags = flagList->ObjectAt( eventnum ); + + if ( flags & EV_HIDE ) + { + hidden++; + continue; + } + + if ( mask && strnicmp( name.c_str(), mask, l ) ) + { + continue; + } + + num++; + + text = " "; + p = 0; + if ( flags & EV_CONSOLE ) + { + text[ p++ ] = '*'; + } + if ( flags & EV_CHEAT ) + { + text[ p++ ] = 'C'; + } + + cgi.Printf( "%4d : %s%s\n", eventnum, text.c_str(), name.c_str() ); + } + + cgi.Printf( "\n* = console command.\nC = cheat command.\n\n" + "Printed %d of %d total commands.\n", num, n - hidden ); + +/* GAMEFIX + if ( developer->integer && hidden ) + { + cgi.Printf( "Suppressed %d commands.\n", hidden ); + } +*/ + } + +void Event::initCommandList + ( + void + ) + + { + int flags; + str *n; + + flags = 0; + commandList = new Container; + + n = new str( "NULL" ); + NullEvent.eventnum = commandList->AddObject( n ); + + flagList = new Container; + flagList->AddObject( flags ); + + sortedList = new Container; + sortedList->AddObject( NullEvent.eventnum ); + + dirtylist = qfalse; + + NullEvent.data = NULL; + NullEvent.info.inuse = 0; + NullEvent.info.source = EV_FROM_CODE; + NullEvent.info.flags = 0; + NullEvent.info.linenumber = 0; + } + +Event::Event() + { + info.inuse = 0; + info.source = EV_FROM_CODE; + info.flags = 0; + info.linenumber = 0; + threadnum = -1; + eventnum = 0; + data = NULL; + name = NULL; + } + +Event::Event + ( + int num + ) + + { + if ( !commandList ) + { + initCommandList(); + } + + assert( ( num > 0 ) && num <= commandList->NumObjects() ); + + if ( ( num <= 0 ) || ( num > commandList->NumObjects() ) ) + { + num = 0; + name = NULL; + info.flags = 0; + } + else + { + name = commandList->ObjectAt( num )->c_str(); + info.flags = flagList->ObjectAt( num ); + } + + eventnum = num; + data = NULL; + info.inuse = 0; + info.source = EV_FROM_CODE; + info.linenumber = 0; + threadnum = -1; + } + +Event::Event + ( + Event &ev + ) + + { + int num; + int i; + + eventnum = ( int )ev; + assert( ( eventnum > 0 ) && eventnum <= commandList->NumObjects() ); + data = NULL; + + name = commandList->ObjectAt( eventnum )->c_str(); + info.inuse = 0; + info.source = ev.info.source; + info.flags = ev.info.flags; + info.linenumber = ev.info.linenumber; + threadnum = ev.threadnum; + + if ( ev.data ) + { + num = ev.data->NumObjects(); + + data = new Container; + data->Resize( num ); + + for( i = 1; i <= num; i++ ) + { + data->AddObject( ev.data->ObjectAt( i ) ); + } + } + } + +Event::Event + ( + Event *ev + ) + + { + int num; + int i; + + assert( ev ); + if ( !ev ) + { + Class::error( "Event", "NULL Event\n" ); + } + + eventnum = ( int )*ev; + assert( ( eventnum > 0 ) && eventnum <= commandList->NumObjects() ); + data = NULL; + name = commandList->ObjectAt( eventnum )->c_str(); + info.inuse = 0; + info.source = ev->info.source; + info.flags = ev->info.flags; + info.linenumber = ev->info.linenumber; + threadnum = ev->threadnum; + if ( ev->data ) + { + num = ev->data->NumObjects(); + + data = new Container; + data->Resize( num ); + + for( i = 1; i <= num; i++ ) + { + data->AddObject( ev->data->ObjectAt( i ) ); + } + } + } + +Event::Event + ( + const char *command, + int flags + ) + + { + str c; + str *t; + + if ( !commandList ) + { + initCommandList(); + } + + c = command; + eventnum = FindEvent( c ); + if ( !eventnum ) + { + t = new str( c ); + eventnum = commandList->AddObject( t ); + // check for default flags + if ( flags == -1 ) + { + flags = 0; + } + flagList->AddObject( ( int )flags ); + sortedList->AddObject( eventnum ); + dirtylist = qtrue; + } + + // Use the name stored in the command list in case the string passed in + // is not in static memory. + name = commandList->ObjectAt( eventnum )->c_str(); + + data = NULL; + info.inuse = 0; + info.source = EV_FROM_CODE; + info.linenumber = 0; + threadnum = -1; + + // If flags have changed, let the user know. It's probably a development bug. + int &flagobj = flagList->ObjectAt( eventnum ); + + // check for default flags + if ( flags == -1 ) + { + flags = flagobj; + } + + assert( flags == flagobj ); + if ( flags != flagobj ) + { + // Flags not equal. Use combined value. + flagobj |= flags; + } + + info.flags = flagobj; + } + +Event::Event + ( + str &command, + int flags + ) + + { + str *t; + + if ( !commandList ) + { + initCommandList(); + } + + eventnum = FindEvent( command ); + if ( !eventnum ) + { + t = new str( command ); + eventnum = commandList->AddObject( t ); + // check for default flags + if ( flags == -1 ) + { + flags = 0; + } + flagList->AddObject( flags ); + sortedList->AddObject( eventnum ); + dirtylist = qtrue; + } + + // Use the name stored in the command list since the string passed in + // is not in static memory. + name = commandList->ObjectAt( eventnum )->c_str(); + data = NULL; + info.inuse = 0; + info.source = EV_FROM_CODE; + info.linenumber = 0; + threadnum = -1; + + // If flags have changed, let the user know. It's probably a development bug. + int &flagobj = flagList->ObjectAt( eventnum ); + + // check for default flags + if ( flags == -1 ) + { + flags = flagobj; + } + + assert( flags == flagobj ); + if ( flags != flagobj ) + { + // Flags not equal. Use combined value. + flagobj |= flags; + } + + info.flags = flagobj; + } + + Event::~Event() + { + if ( data ) + { + delete data; + data = NULL; + } + } + +void Event::Error + ( + const char *fmt, + ... + ) + + { + va_list argptr; + char text[ 1024 ]; + + va_start( argptr, fmt ); + vsprintf( text, fmt, argptr ); + va_end( argptr ); + + cgi.Printf( "Client: '%s' : %s\n", getName().c_str(), text ); + } + +const char *Event::GetString + ( + int pos + ) + + { + const char *text; + + if ( !data || ( pos < 1 ) || ( data->NumObjects() < pos ) ) + { + Error( "Index %d out of range.", pos ); + return ""; + } + + text = data->ObjectAt( pos ).c_str(); + assert( text ); + + /* GAMEFIX + var = Director.GetExistingVariable( text ); + if ( var ) + { + return var->stringValue(); + } + */ + return text; + } + +void *Event::GetPointer + ( + int pos + ) + + { + const char *text; + + if ( !data || ( pos < 1 ) || ( data->NumObjects() < pos ) ) + { + Error( "Index %d out of range.", pos ); + return 0; + } + + text = data->ObjectAt( pos ).c_str(); + assert( text ); + + if ( !IsNumeric( text ) ) + { + Error( "Expecting a numeric value but found '%s'.", text ); + return 0; + } + + return (void *)atoi( text ); + } + +int Event::GetInteger + ( + int pos + ) + + { + const char *text; + + if ( !data || ( pos < 1 ) || ( data->NumObjects() < pos ) ) + { + Error( "Index %d out of range.", pos ); + return 0; + } + + text = data->ObjectAt( pos ).c_str(); + assert( text ); + + /* GAMEFIX + var = Director.GetExistingVariable( text ); + if ( var ) + { + if ( !IsNumeric( var->stringValue() ) ) + { + Error( "Variable %s contains non-numeric value '%s'", text, var->stringValue() ); + } + return var->intValue(); + } + */ + + if ( !IsNumeric( text ) ) + { + Error( "Expecting a numeric value but found '%s'.", text ); + return 0; + } + + return atoi( text ); + } + +double Event::GetDouble + ( + int pos + ) + + { + const char *text; + + if ( !data || ( pos < 1 ) || ( data->NumObjects() < pos ) ) + { + Error( "Index %d out of range.", pos ); + return 0; + } + + text = data->ObjectAt( pos ).c_str(); + assert( text ); + + /* GAMEFIX + var = Director.GetExistingVariable( text ); + if ( var ) + { + if ( !IsNumeric( var->stringValue() ) ) + { + cgi.Error( "Variable %s contains non-numeric value '%s'", text, var->stringValue() ); + } + return ( double )var->floatValue(); + } + */ + + if ( !IsNumeric( text ) ) + { + Error( "Expecting a numeric value but found '%s'.", text ); + return 0; + } + + return ( double )atof( text ); + } + +float Event::GetFloat + ( + int pos + ) + + { + const char *text; + + if ( !data || ( pos < 1 ) || ( data->NumObjects() < pos ) ) + { + Error( "Index %d out of range.", pos ); + return 0; + } + + text = data->ObjectAt( pos ).c_str(); + assert( text ); + + /* GAMEFIX + var = Director.GetExistingVariable( text ); + if ( var ) + { + if ( !IsNumeric( var->stringValue() ) ) + { + cgi.Error( "Variable %s contains non-numeric value '%s'", text, var->stringValue() ); + } + return var->floatValue(); + } + */ + + if ( !IsNumeric( text ) ) + { + Error( "Expecting a numeric value but found '%s'.", text ); + return 0; + } + + return atof( text ); + } + +Vector Event::GetVector + ( + int pos + ) + + { + const char *text; + + if ( !data || ( pos < 1 ) || ( data->NumObjects() < pos ) ) + { + Error( "Index %d out of range.", pos ); + return vec_zero; + } + + text = data->ObjectAt( pos ).c_str(); + assert( text ); + + /* GAMEFIX + var = Director.GetExistingVariable( text ); + if ( var ) + { + text = var->stringValue(); + } + */ + + // Check if this is a ()-based vector + // we accept both, but using parenthesis we can determine if it is a vector or not + if ( text[ 0 ] == '(' ) + { + return Vector( &text[ 1 ] ); + } + + // give an cgi.Error, but try converting it anyways + Error( "Vector '%s' does not include '(' ')'.", text ); + return Vector( text ); + } + +CLASS_DECLARATION( Class, Listener, NULL ) + { + { &EV_Remove, Listener::Remove }, + { &EV_ScriptRemove, Listener::ScriptRemove }, + { NULL, NULL } + }; + + +void Listener::Remove + ( + Event *e + ) + + { + delete this; + } + +void Listener::ScriptRemove + ( + Event *e + ) + + { + // Forces the remove to be done at a safe time + PostEvent( EV_Remove, 0 ); + } + +#if 0 +void Listener::FloatVar + ( + Event &e, + float *var, + float defaultvalue + ) + + { + } + +void Listener::IntVar + ( + Event &e, + int *var, + float defaultvalue + ) + + { + } + +void Listener::StringVar + ( + Event &e, + str *var, + const char *defaultvalue + ) + + { + } + +void Listener::StringVar + ( + Event &e, + char **var, + const char *defaultvalue + ) + + { + } + +void Listener::VectorVar + ( + Event &e, + Vector *var, + Vector defaultvalue + ) + + { + } +#endif + +qboolean Listener::ValidEvent + ( + Event &e + ) + + { + ClassDef *c; + int ev; + + ev = ( int )e; + + c = this->classinfo(); + assert( ( ev >= 0 ) && ( ev < c->numEvents ) ); + if ( ( ev < 0 ) || ( ev >= c->numEvents ) ) + { + warning( "ValidEvent", "Event '%s' out of response range for class '%s'. " + "Event probably invalid or allocated late.\n", e.getName().c_str(), getClassname() ); + return qfalse; + } + + return ( qboolean )( c->responseLookup[ ev ] != NULL ); + } + +qboolean Listener::ValidEvent + ( + const char *name + ) + + { + ClassDef *c; + int ev; + + ev = Event::FindEvent( name ); + + c = this->classinfo(); + assert( ( ev >= 0 ) && ( ev < c->numEvents ) ); + if ( ( ev < 0 ) || ( ev >= c->numEvents ) ) + { + warning( "ValidEvent", "Event '%s' out of response range for class '%s'. " + "Event probably invalid or allocated late.\n", name, getClassname() ); + return qfalse; + } + + return ( qboolean )( c->responseLookup[ ev ] != NULL ); + } + +qboolean Listener::EventPending + ( + Event &ev + ) + + { + eventcache_t *event; + int eventnum; + + assert( EventQueue ); + assert( EventQueue->next ); + + event = EventQueue->next; + + eventnum = ( int )ev; + while( event != EventQueue ) + { + if ( ( event->obj == this ) && ( (int)*event->event == eventnum ) ) + { + return qtrue; + } + event = event->next; + } + + return qfalse; + } + +inline qboolean Listener::CheckEventFlags + ( + Event *event + ) + + { + /* GAMEFIX + // Special handling of console events + if ( event->GetSource() == EV_FROM_CONSOLE ) + { + if ( !( event->info.flags & (EV_CONSOLE|EV_CHEAT) ) ) + { + if ( isSubclassOf( Entity ) ) + { + Entity *ent; + + ent = ( Entity * )this; + gi.SendServerCommand( ent->edict, "print \"Command not available from console.\n\"" ); + } + + // don't process + return qfalse; + } + + // don't allow console cheats during deathmatch unless the server says it's ok. + if ( ( event->info.flags & EV_CHEAT ) && deathmatch->integer && !sv_cheats->integer ) + { + if ( isSubclassOf( Entity ) ) + { + Entity *ent; + + ent = ( Entity * )this; + gi.SendServerCommand( ent->edict, "print \"You must run the server with '+set cheats 1' to enable this command.\n\"" ); + } + + // don't process + return qfalse; + } + } + */ + // ok to process + return qtrue; + } + +qboolean Listener::ProcessEvent + ( + Event *event + ) + + { + ClassDef *c; + int ev; + int i; + + // Prevent overflow of the inuse count + if ( event->info.inuse >= MAX_EVENT_USE ) + { + cgi.Error( ERR_DROP, "ProcessEvent : Event usage overflow on '%s' event. Possible infinite loop.\n", event->getName().c_str() ); + } + + if ( cg_showevents->integer ) + { + int n; + str text; + + text = va( "%.1f: %s", (float)cgi.Milliseconds()/1000.0f, this->getClassname() ); + text += event->getName().c_str(); + n = event->NumArgs(); + for( i = 1; i <= n; i++ ) + { + text += va( " %s", event->GetToken( i ) ); + } + + text += "\n"; + } + + ev = ( int )*event; + c = this->classinfo(); + if ( ev >= c->numEvents ) + { + event->Error( "Event out of response range for class '%s'. Event probably invalid or allocated late.\n", getClassname() ); + return qfalse; + } + + if ( c->responseLookup[ ev ] ) + { + int start; + int end; + + event->info.inuse++; + + if ( !cg_timeevents->integer ) + { + // only process the event if we allow it + if ( CheckEventFlags( event ) ) + { + ( this->**c->responseLookup[ ev ] )( event ); + } + } + else + { + start = cgi.Milliseconds(); + + // only process the event if we allow it + if ( CheckEventFlags( event ) ) + { + ( this->**c->responseLookup[ ev ] )( event ); + } + + end = cgi.Milliseconds(); + + if ( cg_timeevents->integer == 1 ) + { + cgi.Printf( "'%s' : %d\n", event->getName().c_str(), end - start ); + } + else + { + // GAMEFIX G_DebugPrintf( "'%s' : %d\n", event->getName().c_str(), end - start ); + } + } + + // Prevent an event from being freed twice, in case it's been re-used + event->info.inuse--; + if ( !event->info.inuse ) + { + delete event; + } + + return qtrue; + } + + if ( !event->info.inuse ) + { + delete event; + } + + return qfalse; + } + +void Listener::PostEvent + ( + Event *ev, + float time + ) + + { + eventcache_t *newevent; + eventcache_t *event; + + if ( LL_Empty( FreeEvents, next, prev ) ) + { + cgi.Error( ERR_DROP, "PostEvent : No more free events on '%s' event.\n", ev->getName().c_str() ); + return; + } + + newevent = FreeEvents->next; + LL_Remove( newevent, next, prev ); + + // Probably don't have this many events, but it's a good safety precaution + if ( ev->info.inuse >= MAX_EVENT_USE ) + { + cgi.Error( ERR_DROP, "PostEvent : Event usage overflow on '%s' event. Possible infinite loop.\n", ev->getName().c_str() ); + return; + } + + ev->info.inuse++; + + newevent->obj = this; + newevent->event = ev; + newevent->time = ( ( float )cgi.Milliseconds() / 1000.0f ) + time; + + event = EventQueue->next; + while( ( event != EventQueue ) && ( newevent->time >= event->time ) ) + { + event = event->next; + } + + LL_Add( event, newevent, next, prev ); + numEvents++; + } + +qboolean Listener::PostponeEvent + ( + Event &ev, + float time + ) + + { + eventcache_t *event; + eventcache_t *node; + int eventnum; + + assert( EventQueue ); + assert( EventQueue->next ); + + eventnum = ( int )ev; + + event = EventQueue->next; + while( event != EventQueue ) + { + if ( ( event->obj == this ) && ( ( int )*event->event == eventnum ) ) + { + event->time += time; + + node = event->next; + while( ( node != EventQueue ) && ( event->time >= node->time ) ) + { + node = node->next; + } + + LL_Remove( event, next, prev ); + LL_Add( node, event, next, prev ); + + return qtrue; + } + event = event->next; + } + + return qfalse; + } + +void Listener::CancelEventsOfType + ( + Event *ev + ) + + { + eventcache_t *event; + eventcache_t *next; + int eventnum; + + assert( EventQueue ); + assert( EventQueue->next ); + + event = EventQueue->next; + + eventnum = (int)*ev; + while( event != EventQueue ) + { + next = event->next; + if ( ( event->obj == this ) && ( (int)*event->event == eventnum ) ) + { + delete event->event; + event->event = NULL; + LL_Remove( event, next, prev ); + LL_Add( FreeEvents, event, next, prev ); + numEvents--; + } + event = next; + } + } + +void Listener::CancelPendingEvents + ( + void + ) + + { + eventcache_t *event; + eventcache_t *next; + + assert( EventQueue ); + assert( EventQueue->next ); + + event = EventQueue->next; + + while( event != EventQueue ) + { + next = event->next; + if ( event->obj == this ) + { + delete event->event; + event->event = NULL; + LL_Remove( event, next, prev ); + LL_Add( FreeEvents, event, next, prev ); + numEvents--; + } + event = next; + } + } + +qboolean Listener::ProcessPendingEvents + ( + void + ) + + { + eventcache_t *event; + qboolean processedEvents; + float t; + + assert( EventQueue ); + assert( EventQueue->next ); + assert( EventQueue->prev ); + + processedEvents = qfalse; + + t = ( ( float )cgi.Milliseconds() / 1000.0f ) + 0.001; + + event = EventQueue->next; + while( event != EventQueue ) + { + assert( event ); + assert( event->event ); + assert( event->obj ); + + if ( event->time > t ) + { + break; + } + + if ( event->obj != this ) + { + // traverse normally + event = event->next; + } + else + { + LL_Remove( event, next, prev ); + numEvents--; + + assert( event->obj ); + + // ProcessEvent increments the inuse count, so decrement it since we've already incremented it in PostEvent + event->event->info.inuse--; + + event->obj->ProcessEvent( event->event ); + + event->event = NULL; + LL_Add( FreeEvents, event, next, prev ); + + // start over, since can't guarantee that we didn't process any previous or following events + event = EventQueue->next; + + processedEvents = qtrue; + } + } + + return processedEvents; + } + +Listener::~Listener() + { + CancelPendingEvents(); + } + +void CG_ClearEventList + ( + void + ) + + { + int i; + eventcache_t *e; + + LL_Reset( FreeEvents, next, prev ); + LL_Reset( EventQueue, next, prev ); + memset( Events, 0, sizeof( Events ) ); + + for( e = &Events[ 0 ], i = 0; i < MAX_EVENTS; i++, e++ ) + { + LL_Add( FreeEvents, e, next, prev ); + } + + numEvents = 0; + } + +void CG_ProcessPendingEvents + ( + void + ) + + { + eventcache_t *event; + float t; + int num; + int maxevents; + + assert( EventQueue ); + assert( EventQueue->next ); + assert( EventQueue->prev ); + + maxevents = ( int )cg_eventlimit->integer; + + num = 0; + t = ( ( float )cgi.Milliseconds() / 1000.0f ) + 0.001; + while( !LL_Empty( EventQueue, next, prev ) ) + { + event = EventQueue->next; + + assert( event ); + assert( event->event ); + assert( event->obj ); + + if ( event->time > t ) + { + break; + } + + LL_Remove( event, next, prev ); + numEvents--; + + assert( event->obj ); + + // ProcessEvent increments the inuse count, so decrement it since we've already incremented it in PostEvent + assert( event->event->info.inuse > 0 ); + event->event->info.inuse--; + + event->obj->ProcessEvent( event->event ); + + event->event = NULL; + LL_Add( FreeEvents, event, next, prev ); + + // Don't allow ourselves to stay in here too long. An abnormally high number + // of events being processed is evidence of an infinite loop of events. + num++; + if ( num > maxevents ) + { + cgi.Printf( "Event overflow. Possible infinite loop in script. " + "Enable g_showevents to trace. Aborting frame.\n" ); + break; + } + } + } + +void CG_InitEvents + ( + void + ) + + { + cg_numevents = cgi.Cvar_Get( "cg_numevents", "0", 0 ); + cg_showevents = cgi.Cvar_Get( "cg_showevents", "0", 0 ); + cg_eventlimit = cgi.Cvar_Get( "cg_eventlimit", "1500", 0 ); + cg_timeevents = cgi.Cvar_Get( "cg_timeevents", "0", 0 ); + cg_watch = cgi.Cvar_Get( "cg_watch", "0", 0 ); + + BuildEventResponses(); + CG_ClearEventList(); + CG_InitCommandManager(); + // Sort the list before we go on since we won't be adding any more events + Event::SortEventList(); + } \ No newline at end of file diff --git a/source/source/cgame/cg_listener.h b/source/source/cgame/cg_listener.h new file mode 100644 index 0000000..48ea636 --- /dev/null +++ b/source/source/cgame/cg_listener.h @@ -0,0 +1,541 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/cgame/cg_listener.h $ +// $Revision:: 2 $ +// $Author:: Aldie $ +// $Date:: 9/10/99 5:24p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/cgame/cg_listener.h $ +// +// 2 9/10/99 5:24p Aldie +// Merge code +// +// 1 9/10/99 10:48a Jimdose +// +// 2 9/09/99 3:30p Aldie +// Merge +// +// 1 9/08/99 3:35p Aldie +// +// DESCRIPTION: +// + +#include "cg_local.h" +#include "cg_class.h" +#include "cg_container.h" +#include "cg_vector.h" +#include "../fgame/str.h" + +#ifndef __LISTENER_H__ +#define __LISTENER_H__ + +typedef enum + { + EV_FROM_CODE, + EV_FROM_CONSOLE, + EV_FROM_SCRIPT + } eventsource_t; + +// Event flags +#define EV_CONSOLE 1 // Allow entry from console +#define EV_CHEAT 2 // Only allow entry from console if cheats are enabled +#define EV_HIDE 4 // Hide from eventlist + +#define MAX_EVENT_USE ( ( 1 << 8 ) - 1 ) + +class ScriptThread; + +#ifdef EXPORT_TEMPLATE +template class Container; +#endif + +class Event : public Class + { + private: + typedef struct EventInfo + { + unsigned inuse : 8; // must change MAX_EVENT_USE to reflect maximum number stored here + unsigned source : 2; + unsigned flags : 2; + unsigned linenumber : 20; // linenumber does double duty in the case of the console commands + }; + + int eventnum; + EventInfo info; + const char *name; + Container *data; + int threadnum; + + Event( int num ); + static void initCommandList( void ); + + friend class Listener; + + friend void CG_ProcessPendingEvents( void ); + friend void CG_ClearEventList( void ); + friend void CG_InitEvents( void ); + + static Container *Event::commandList; + static Container *Event::flagList; + static Container *Event::sortedList; + static qboolean Event::dirtylist; + + static int compareEvents( const void *arg1, const void *arg2 ); + static void SortEventList( void ); + static int FindEvent( const char *name ); + static int FindEvent( str &name ); + + public: + + CLASS_PROTOTYPE( Event ); + + static int NumEventCommands( void ); + static void ListCommands( const char *mask = NULL ); + + Event(); + Event( Event &ev ); + Event( Event *ev ); + Event( const char *command, int flags = -1 ); + Event( str &command, int flags = -1 ); + ~Event(); + + str getName( void ); + + void SetSource( eventsource_t source ); + void SetLineNumber( int linenumber ); + //void SetConsoleEdict( gentity_t *consoleedict ); + void SetThread( ScriptThread *thread ); + + eventsource_t GetSource( void ); + ScriptThread *GetThread( void ); + // gentity_t *GetConsoleEdict( void ); + int GetLineNumber( void ); + + void Error( const char *fmt, ... ); + + static Event Find( const char *command ); + static qboolean Exists( const char *command ); + static Event Find( str &command ); + + Event& printInfo(void); + + operator int(); + operator const char *(); + + int NumArgs( void ); + + qboolean IsVectorAt( int pos ); + qboolean IsEntityAt( int pos ); + qboolean IsNumericAt( int pos ); + + const char *GetToken( int pos ); + const char *GetString( int pos ); + int GetInteger( int pos ); + double GetDouble( int pos ); + float GetFloat( int pos ); + Vector GetVector( int pos ); + void *GetPointer( int pos ); + + void AddToken( const char *text ); + void AddTokens( int argc, const char **argv ); + void AddString( const char *text ); + void AddString( str &text ); + void AddInteger( int val ); + void AddDouble( double val ); + void AddFloat( float val ); + void AddVector( Vector &vec ); + void AddPointer( void *ptr ); + }; + +extern Event NullEvent; +extern Event EV_Remove; + +#ifdef EXPORT_TEMPLATE +template class Container; +#endif + +class Listener; + +class Listener : public Class + { + private: + void FloatVarEvent( Event *e ); + void IntVarEvent( Event *e ); + void StringVarEvent( Event *e ); + void CharPtrVarEvent( Event *e ); + void VectorVarEvent( Event *e ); + void ScriptRemove( Event *e ); + + protected: + void FloatVar( Event &e, float *var, float defaultvalue = 0 ); + void IntVar( Event &e, int *var, float defaultvalue = 0 ); + void StringVar( Event &e, str *var, const char *defaultvalue = "" ); + void StringVar( Event &e, char **var, const char *defaultvalue = "" ); + void VectorVar( Event &e, Vector *var, Vector defaultvalue = Vector( 0, 0, 0 ) ); + + qboolean CheckEventFlags( Event *event ); + + public: + CLASS_PROTOTYPE( Listener ); + + ~Listener(); + void Remove( Event *e ); + qboolean ValidEvent( Event &e ); + qboolean ValidEvent( const char *name ); + qboolean EventPending( Event &ev ); + qboolean ProcessEvent( Event *event ); + qboolean ProcessEvent( Event &event ); + void PostEvent( Event *event, float time ); + void PostEvent( Event &event, float time ); + qboolean PostponeEvent( Event &event, float time ); + qboolean PostponeEvent( Event *event, float time ); + void CancelEventsOfType( Event *event ); + void CancelEventsOfType( Event &event ); + void CancelPendingEvents( void ); + qboolean ProcessPendingEvents( void ); + }; + +inline qboolean Event::Exists + ( + const char *command + ) + + { + int num; + str c; + + if ( !commandList ) + { + initCommandList(); + } + + c = command; + num = FindEvent( c ); + if ( num ) + { + return qtrue; + } + + return qfalse; + } + + +inline Event Event::Find + ( + const char *command + ) + + { + int num; + str c; + + if ( !commandList ) + { + initCommandList(); + } + + c = command; + num = FindEvent( c ); + if ( num ) + { + return Event( num ); + } + + return NullEvent; + } + +inline Event Event::Find + ( + str &command + ) + + { + int num; + + if ( !commandList ) + { + initCommandList(); + } + + num = FindEvent( command ); + if ( num ) + { + return Event( num ); + } + + return NullEvent; + } + +inline void Event::SetSource + ( + eventsource_t source + ) + + { + info.source = ( unsigned )source; + } + +inline void Event::SetLineNumber + ( + int linenumber + ) + + { + info.linenumber = linenumber; + } + +inline eventsource_t Event::GetSource + ( + void + ) + + { + return ( eventsource_t )info.source; + } + +inline int Event::GetLineNumber + ( + void + ) + + { + // linenumber does double duty in the case of the console commands + if ( info.source == EV_FROM_SCRIPT ) + { + return info.linenumber; + } + + return 0; + } + +inline str Event::getName + ( + void + ) + + { + assert( name || !eventnum ); + + if ( !name ) + { + return "NULL"; + } + + return name; + } + +inline Event& Event::printInfo + ( + void + ) + + { + cgi.Printf( "event '%s' is number %d\n", getName().c_str(), eventnum ); + return *this; + } + +inline Event::operator int() + { + return eventnum; + } + +inline Event::operator const char *() + { + return getName().c_str(); + } + +inline int Event::NumArgs + ( + void + ) + + { + if ( !data ) + { + return 0; + } + + return ( data->NumObjects() ); + } + +inline void Event::AddToken + ( + const char *text + ) + + { + AddString( text ); + } + +inline void Event::AddTokens + ( + int argc, + const char **argv + ) + + { + int i; + + for( i = 0; i < argc; i++ ) + { + assert( argv[ i ] ); + AddString( argv[ i ] ); + } + } + +inline void Event::AddString + ( + const char *text + ) + + { + if ( !data ) + { + data = new Container; + data->Resize( 1 ); + } + + data->AddObject( str( text ) ); + } + +inline void Event::AddString + ( + str &text + ) + + { + if ( !data ) + { + data = new Container; + data->Resize( 1 ); + } + + data->AddObject( text ); + } + +inline void Event::AddPointer + ( + void *ptr + ) + + { + char text[ 128 ]; + + sprintf( text, "%d", ptr ); + AddString( text ); + } + +inline void Event::AddInteger + ( + int val + ) + + { + char text[ 128 ]; + + sprintf( text, "%d", val ); + AddString( text ); + } + +inline void Event::AddDouble + ( + double val + ) + + { + char text[ 128 ]; + + sprintf( text, "%f", val ); + AddString( text ); + } + +inline void Event::AddFloat + ( + float val + ) + + { + char text[ 128 ]; + + sprintf( text, "%f", val ); + AddString( text ); + } + +inline void Event::AddVector + ( + Vector &vec + ) + + { + char text[ 128 ]; + + sprintf( text, "(%f %f %f)", vec[ 0 ], vec[ 1 ], vec[ 2 ] ); + AddString( text ); + } + +inline const char *Event::GetToken + ( + int pos + ) + + { + if ( !data || ( pos < 1 ) || ( data->NumObjects() < pos ) ) + { + Error( "Index %d out of range.", pos ); + return ""; + } + + return data->ObjectAt( pos ).c_str(); + } + +inline qboolean Listener::ProcessEvent + ( + Event &event + ) + + { + Event *ev; + + ev = new Event( event ); + return ProcessEvent( ev ); + } + +inline void Listener::PostEvent + ( + Event &event, + float time + ) + + { + Event *ev; + + ev = new Event( event ); + PostEvent( ev, time ); + } + +inline qboolean Listener::PostponeEvent + ( + Event *event, + float time + ) + + { + return PostponeEvent( *event, time ); + } + +inline void Listener::CancelEventsOfType + ( + Event &event + ) + + { + CancelEventsOfType( &event ); + } + +#endif \ No newline at end of file diff --git a/source/source/cgame/cg_local.h b/source/source/cgame/cg_local.h new file mode 100644 index 0000000..d485022 --- /dev/null +++ b/source/source/cgame/cg_local.h @@ -0,0 +1,937 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/cgame/cg_local.h $ +// $Revision:: 93 $ +// $Author:: Aldie $ +// $Date:: 8/10/00 9:26p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/cgame/cg_local.h $ +// +// 93 8/10/00 9:26p Aldie +// Fixed a lot of memory leaks on exit +// +// 92 7/29/00 9:05p Aldie +// Added targeting to cg_general ents +// +// 91 7/24/00 11:52a Aldie +// Added cg_effectdetail for reducing number of effects +// +// 90 7/22/00 5:50p Markd +// added flushtikis support +// +// 89 7/19/00 9:52p Aldie +// Put ET_EVENTS back in. They will get sent over once, and should get +// processed once on the client. +// +// 88 7/15/00 12:32p Aldie +// Fixed a bug for restarting tempmodels on a save game +// +// 87 7/14/00 9:52p Markd +// added global volume dampener on ambient sound effects for cinematics +// +// 86 7/10/00 11:54p Markd +// added exit level code +// +// 85 7/07/00 2:58p Markd +// fixed alias bug +// +// 84 6/28/00 4:36p Markd +// added debug footsteps code +// +// 83 6/27/00 2:34p Markd +// clear out swipes when restarting +// +// 82 6/17/00 1:54p Markd +// Added server restarted code +// +// 81 6/15/00 8:21p Markd +// Added CleanupCommandManager support +// +// 80 6/14/00 12:14p Markd +// more intel compiler bug fixes +// +// 79 6/14/00 11:18a Markd +// cleaned up code using Intel compiler +// +// 78 6/09/00 10:27a Markd +// got lagometer and CG_2D operations functioning +// +// 77 6/06/00 1:59p Aldie +// Added fadein to marks +// +// 76 6/05/00 3:10p Markd +// Added has_commands check to client side command processing +// +// 75 6/03/00 8:19p Markd +// Added footstep code +// +// 74 6/03/00 10:55a Markd +// Sped up tracing and debug print messages +// +// 73 6/01/00 7:45p Aldie +// Made it so that swipes are removed when client entities are reset. +// +// 72 6/01/00 12:21p Steven +// Improvement to splashes. +// +// 71 5/20/00 5:14p Markd +// Added ITEM special effects +// +// 70 5/17/00 6:55p Markd +// working on 3rd person camera +// +// 69 5/16/00 6:24p Markd +// added cg_traceinfo support +// +// 68 5/09/00 1:33p Markd +// added some lightstyle utilities to SetLightStyle +// +// 67 5/09/00 1:23p Aldie +// Added lightstyle to marks +// +// 66 5/08/00 6:12p Markd +// Added lightstyle support for the client +// +// 65 5/04/00 8:38p Aldie +// Made beam emitters work better +// +// 64 4/26/00 9:05p Markd +// Added client and cgame class commands +// +// 63 4/10/00 11:16a Markd +// added rope code +// +// 62 4/03/00 4:43p Markd +// fixed a teleportation issue +// +// 61 3/31/00 11:49a Markd +// Added sky_portal control +// +// 60 3/14/00 3:22p Aldie +// Changed some client side emitter functionality and added func_emitter +// +// 59 3/06/00 8:07p Markd +// cleaned up unused cvar's +// +// 58 3/04/00 6:03p Aldie +// Made commandManager static +// +// 57 3/04/00 11:45a Markd +// Added light style support and malloc and free to the cgame +// +// 56 3/01/00 1:45p Aldie +// Added some more beam functionality for beau. Added taglist to do beam +// chains. +// +// 55 2/21/00 7:03p Markd +// Added skyalpha support +// +// 54 2/16/00 6:58p Markd +// cleaned up version of new animation system +// +// 53 2/16/00 6:56p Markd +// added new animation system +// +// 52 2/14/00 10:09a Markd +// Tweaked targeting reticles +// +// 51 2/11/00 3:22p Aldie +// Changed swipe code a bit, and added cg_hidetempmodels cvar. +// +// 50 2/08/00 6:24p Markd +// removed unused mediashader +// +// 49 1/27/00 9:06a Markd +// Added watermark +// +// 48 1/19/00 3:18p Aldie +// Moved cg_updateentity +// +// 47 1/15/00 2:39p Aldie +// Changed definition of RemoveClientEntity +// +// 46 1/12/00 8:03p Markd +// Added NextFrameCameraCut and LastCameraFlags +// +// 45 1/12/00 3:17p Aldie +// Fixed beams so that there may be multiple beams on a model +// +// 44 12/11/99 5:51p Markd +// First wave of bug fixes after q3a gold merge +// +// 43 12/11/99 3:37p Markd +// q3a gold checkin, first time +// +// 42 12/09/99 7:42p Jimdose +// got rid of ignore_angles +// +// 41 11/10/99 6:08p Steven +// Fixed the saving of sound origins of child entities. +// +// 40 11/10/99 2:18p Jimdose +// removed some unused variables from centity_t +// added torso animation control variables +// +// 39 11/04/99 3:18p Markd +// fixed fov lerping +// +// 38 11/04/99 10:03a Markd +// complete overhaul of the camera system +// +// 37 10/29/99 7:34p Aldie +// rope stuff +// +// 36 10/29/99 7:29p Steven +// Moved sound stuff into snapshot. +// +// 35 10/28/99 6:05p Steven +// Added a use_angles flag and an offset to the entity attach stuff. +// +// 34 10/27/99 12:18p Markd +// added smooth camera lerping +// +// 33 10/26/99 6:30p Jimdose +// added animation blending to animstate_t +// +// 32 10/25/99 12:19p Jimdose +// made head and torso angles local to each entity +// +// 31 10/22/99 6:29p Aldie +// Fix for beams in the sky +// +// 30 10/21/99 2:51p Aldie +// Added some more beam functions +// +// 29 10/19/99 7:52p Markd +// Removed three part model system +// +// 28 10/19/99 11:57a Aldie +// Added some more beam features +// +// 27 10/18/99 2:01p Aldie +// Fixed compile error +// +// 26 10/13/99 3:26p Aldie +// Various fixes for particles, beams and lensflares +// +// 25 10/08/99 5:47p Aldie +// More beam stuff +// +// 24 10/08/99 5:07p Aldie +// More beam stuff and fix for UI_CenterPrint +// +// 23 10/07/99 3:08p Aldie +// more beam fun +// +// 22 10/07/99 9:56a Markd +// made fov come out of playerstate, not cvar +// +// 21 10/06/99 3:23p Steven +// Added a dumpevents command. +// +// 20 10/05/99 6:01p Aldie +// Added headers +// +// DESCRIPTION: +// The entire cgame module is unloaded and reloaded on each level change, +// so there is NO persistant data between levels on the client side. +// If you absolutely need something stored, it can either be kept +// by the server in the server stored userinfos, or stashed in a cvar. + + +#include "../fgame/q_shared.h" +#include "tr_types.h" +#include "../fgame/bg_public.h" +#include "../qcommon/cm_public.h" +#include "cg_public.h" + +#ifndef __CG_LOCAL_H__ +#define __CG_LOCAL_H__ + +#ifdef __cplusplus +extern "C" + { +#endif + +typedef struct + { + int anim; + int frame; + int oldanim; + int oldframe; + int starttime; + float framelerp; + } lerpstate_t; + +typedef struct + { + lerpstate_t base; + + // crossblend variables + lerpstate_t crossblend; + int crossblend_totaltime; + float crossblend_lerp; + + // global variables + int numframes; + int time_per_frame; + qboolean driven; + + // non-driven variables + int next_evaluate_time; + + // driven variables + int last_driven_time; + vec3_t last_origin; + vec3_t frame_delta; // normalized frame delta + float frame_distance; // float distance till next frame + float current_distance; // current distance traveled + + // command variables + qboolean has_commands; + int last_cmd_frame; + int last_cmd_anim; + int last_cmd_time; + } animstate_t; + +//================================================= + +#define CF_UPDATESWIPE 0x0000001 +#define CF_COMMANDS_PROCESSED 0x0000002 + +// centity_t have a direct corespondence with gentity_t in the game, but +// not all of the gentity_t will be communicated to the client +typedef struct centity_s { + entityState_t currentState; // from cg.frame + entityState_t nextState; // from cg.nextFrame, if available + qboolean teleported; // true if the entity was just teleported + qboolean interpolate; // true if next is valid to interpolate to + qboolean currentValid; // true if cg.frame holds this entity + + int miscTime; + + animstate_t am; // this holds the animation information for this model + animstate_t torso_am; // this holds the torso animation information for this model + + int errorTime; // decay the error from this time + vec3_t errorOrigin; + vec3_t errorAngles; + + qboolean extrapolated; // false if origin / angles is an interpolation + vec3_t rawOrigin; + vec3_t rawAngles; + + vec3_t beamEnd; + + // exact interpolated position of entity on this frame + vec3_t lerpOrigin; + vec3_t lerpAngles; + + sfxHandle_t tikiLoopSound; + float tikiLoopSoundVolume; + float tikiLoopSoundMinDist; + + float color[4]; + float client_color[4]; // the color set by client commands + int clientFlags; + + int splash_last_spawn_time; + int splash_still_count; +} centity_t; + + +//====================================================================== + +// local entities are created as a result of events or predicted actions, +// and live independantly from all server transmitted entities + +#define MAX_VERTS_ON_POLY 10 +#define MAX_MARK_POLYS 64 + +typedef struct markPoly_s + { + struct markPoly_s *prevMark, *nextMark; + int time; + int lightstyle; + qhandle_t markShader; + qboolean alphaFade; // fade alpha instead of rgb + qboolean fadein; + float color[4]; + poly_t poly; + polyVert_t verts[MAX_VERTS_ON_POLY]; + } markPoly_t; + +#define MAX_CUSTOM_SOUNDS 32 +typedef struct { + char name[MAX_QPATH]; + char data[MAX_QPATH]; + + qhandle_t legsModel; + qhandle_t legsSkin; + + qhandle_t torsoModel; + qhandle_t torsoSkin; + + qhandle_t headModel; + qhandle_t headSkin; + + struct sfx_s *sounds[MAX_CUSTOM_SOUNDS]; + + vec3_t color; + vec3_t color2; +} clientInfo_t; + + +//====================================================================== + +// all cg.stepTime, cg.duckTime, cg.landTime, etc are set to cg.time when the action +// occurs, and they will have visible effects for #define STEP_TIME or whatever msec after + +typedef struct { + int clientFrame; // incremented each frame + + qboolean demoPlayback; + qboolean levelShot; // taking a level menu screenshot + + // there are only one or two snapshot_t that are relevent at a time + int latestSnapshotNum; // the number of snapshots the client system has received + int latestSnapshotTime; // the time from latestSnapshotNum, so we don't need to read the snapshot yet + snapshot_t *snap; // cg.snap->serverTime <= cg.time + snapshot_t *nextSnap; // cg.nextSnap->serverTime > cg.time, or NULL + snapshot_t activeSnapshots[2]; + + float frameInterpolation; // (float)( cg.time - cg.frame->serverTime ) / (cg.nextFrame->serverTime - cg.frame->serverTime) + + qboolean thisFrameTeleport; + qboolean nextFrameTeleport; + qboolean nextFrameCameraCut; + + int frametime; // cg.time - cg.oldTime + + int time; // this is the time value that the client + // is rendering at. + int oldTime; // time at last frame, used for missile trails and prediction checking + + int physicsTime; // either cg.snap->time or cg.nextSnap->time + + int timelimitWarnings; // 5 min, 1 min, overtime + + qboolean renderingThirdPerson; // during deaths, chasecams, etc + + // prediction state + qboolean hyperspace; // true if prediction has hit a trigger_teleport + playerState_t predicted_player_state; + qboolean validPPS; // clear until the first call to CG_PredictPlayerState + int predictedErrorTime; + vec3_t predictedError; + + float stepChange; // for stair up smoothing + int stepTime; + + float duckChange; // for duck viewheight smoothing + int duckTime; + + float landChange; // for landing hard + int landTime; + + // input state sent to server + int weaponSelect; + + // auto rotating items + vec3_t autoAngles; + vec3_t autoAxis[3]; + vec3_t autoAnglesSlow; + vec3_t autoAxisSlow[3]; + vec3_t autoAnglesFast; + vec3_t autoAxisFast[3]; + + // view rendering + refdef_t refdef; + vec3_t playerHeadPos; // position of the players head + vec3_t refdefViewAngles; // will be converted to refdef.viewaxis + vec3_t currentViewPos; // current position of the camera + vec3_t currentViewAngles; // current angles of the camera + + float SoundOrg[3]; // position from where sound should be played + vec3_t SoundAxis[3]; // axis from where sound should be played + + int lastCameraTime; // last time the camera moved + float lerpCameraTime; // is the camera currently lerping from camera to view or vice versa + qboolean inCameraView; // are we currently in a camera view + vec3_t camera_origin; // lerped camera_origin + vec3_t camera_angles; // lerped camera_angles + float camera_fov; // lerped camera_fov + int lastCameraFlags; // last Camera flags for interpolation testing + + // zoom key + qboolean zoomed; + int zoomTime; + float zoomSensitivity; + + // information screen text during loading + char infoScreenText[MAX_STRING_CHARS]; + qboolean showInformation; + + // scoreboard + int scoresRequestTime; + int numScores; + int teamScores[2]; + qboolean showScores; + int scoreFadeTime; + char killerName[MAX_NAME_LENGTH]; + + // centerprinting + int centerPrintTime; + int centerPrintCharWidth; + int centerPrintY; + char centerPrint[1024]; + int centerPrintLines; + + // low ammo warning state + qboolean lowAmmoWarning; // 1 = low, 2 = empty + + // kill timers for carnage reward + int lastKillTime; + + // crosshair client ID + int crosshairClientNum; + int crosshairClientTime; + + float crosshair_offset; + + // powerup active flashing + int powerupActive; + int powerupTime; + + // attacking player + int attackerTime; + + // warmup countdown + int warmupCount; + + //========================== + + int itemPickup; + int itemPickupTime; + int itemPickupBlendTime; // the pulse around the crosshair is timed seperately + + int weaponSelectTime; + int weaponAnimation; + int weaponAnimationTime; + + // blend blobs + float damageTime; + float damageX, damageY, damageValue; + + // status bar head + float headYaw; + float headEndPitch; + float headEndYaw; + int headEndTime; + float headStartPitch; + float headStartYaw; + int headStartTime; + + // view movement + float v_dmg_time; + float v_dmg_pitch; + float v_dmg_roll; + + vec3_t kick_angles; // weapon kicks + vec3_t kick_origin; + + // temp working variables for player view + float bobfracsin; + int bobcycle; + float xyspeed; + + // development tool + refEntity_t testModelEntity; + char testModelName[MAX_QPATH]; + qboolean testGun; + + // farplane parameters + float farplane_distance; + vec3_t farplane_color; + qboolean farplane_cull; + + // portal sky parameters + qboolean sky_portal; + float sky_alpha; + vec3_t sky_origin; + vec3_t sky_axis[3]; // rotation vectors +} cg_t; + + +typedef struct { + qhandle_t backTileShader; + qhandle_t lagometerShader; + qhandle_t shadowMarkShader; + qhandle_t wakeMarkShader; + qhandle_t leftTargetShader; + qhandle_t rightTargetShader; + qhandle_t itemRingShader; + qhandle_t leftTargetModel; + qhandle_t rightTargetModel; + qhandle_t pausedShader; + qhandle_t levelExitShader; + } media_t; + +// The client game static (cgs) structure hold everything +// loaded or calculated from the gamestate. It will NOT +// be cleared when a tournement restart is done, allowing +// all clients to begin playing instantly +typedef struct { + gameState_t gameState; // gamestate from server + glconfig_t glconfig; // rendering configuration + float screenXScale; // derived from glconfig + float screenYScale; + float screenXBias; + + int serverCommandSequence; // reliable command stream counter + int processedSnapshotNum;// the number of snapshots cgame has requested + + qboolean localServer; // detected on startup by checking sv_running + int levelStartTime; // time that game was started + + // parsed from serverinfo + gametype_t gametype; + int dmflags; + int teamflags; + int fraglimit; + int timelimit; + int maxclients; + int cinematic; + char mapname[MAX_QPATH]; + + // + // locally derived information from gamestate + // + qhandle_t model_draw[MAX_MODELS]; + sfxHandle_t sound_precache[MAX_SOUNDS]; + int numInlineModels; + qhandle_t inlineDrawModel[MAX_MODELS]; + vec3_t inlineModelMidpoints[MAX_MODELS]; + + // TIKI handles for all models + int model_tiki[ MAX_MODELS ]; + + clientInfo_t clientinfo[MAX_CLIENTS]; + + media_t media; + } cgs_t; + +//============================================================================== + +extern cgs_t cgs; +extern cg_t cg; +extern clientGameImport_t cgi; +extern centity_t cg_entities[MAX_GENTITIES]; +extern markPoly_t cg_markPolys[MAX_MARK_POLYS]; + +extern cvar_t *cg_animSpeed; +extern cvar_t *cg_debugAnim; +extern cvar_t *cg_debugAnimWatch; +extern cvar_t *cg_errorDecay; +extern cvar_t *cg_nopredict; +extern cvar_t *cg_showmiss; +extern cvar_t *cg_addMarks; +extern cvar_t *cg_viewsize; +extern cvar_t *cg_3rd_person; +extern cvar_t *cg_syncronousClients; +extern cvar_t *cg_stereoSeparation; +extern cvar_t *cg_stats; +extern cvar_t *cg_lagometer; +extern cvar_t *paused; +extern cvar_t *r_lerpmodels; +extern cvar_t *cg_cameraheight; +extern cvar_t *cg_cameradist; +extern cvar_t *cg_cameraverticaldisplacement; +extern cvar_t *cg_camerascale; +extern cvar_t *cg_shadows; +extern cvar_t *cg_hidetempmodels; +extern cvar_t *cg_traceinfo; +extern cvar_t *cg_debugFootsteps; + +// +// cg_main.c +// +void CG_ProcessConfigString( int num ); +const char *CG_ConfigString( int index ); +void CG_AddToTeamChat( const char *str ); +void CG_NewClientinfo( int clientNum ); +sfxHandle_t CG_CustomSound( int entityNum, const char *soundName ); +int CG_CrosshairPlayer( void ); +int CG_LastAttacker( void ); +void CG_Init( clientGameImport_t *imported, int serverMessageNum, int serverCommandSequence ); +void CG_Shutdown( void ); +void CG_ServerRestarted( void ); + +// +// cg_modelanim.cpp +// +void CG_ModelAnim( centity_t *cent ); +void CG_EntityTargeted( int tikihandle, centity_t *cent, refEntity_t *model ); +void CG_ClearModelAnimation( int tikihandle, animstate_t * state, int animationNumber, int time, vec3_t origin, int entnum ); +void CG_AttachEntity( refEntity_t *entity, refEntity_t *parent, int tikihandle, int tagnum, qboolean use_angles, vec3_t attach_offset ); + +// +// cg_commands.cpp +// +void CG_Event( centity_t *cent ); +void CG_UpdateEntity( int tikihandle, refEntity_t *ent, centity_t *cent ); +void CG_RemoveClientEntity( int number, int tikihandle, centity_t *cent ); +void CG_UpdateTestEmitter( void ); +void CG_AddTempModels( void ); +void CG_ResetTempModels( void ); +void CG_InitializeCommandManager( void ); +void CG_ProcessInitCommands( int tikihandle ); +qboolean CG_Command_ProcessFile( const char * filename, qboolean quiet ); +void CG_RestartCommandManager( int timedelta ); +void CG_FlushCommandManager( void ); +void CG_ProcessEntityCommands( int tikihandle, + int frame, + int anim, + int entnum, + refEntity_t *ent, + centity_t *cent + ); +void CG_ClientCommands + ( + int tikihandle, + int frame, + int anim, + animstate_t *state, + refEntity_t *ent, + centity_t *cent + ); + +void CG_Splash( centity_t *cent ); + +void CG_EventList_f( void ); +void CG_EventHelp_f( void ); +void CG_DumpEventHelp_f( void ); +void CG_PendingEvents_f( void ); +void CG_ClassList_f( void ); +void CG_ClassTree_f( void ); +void CG_ClassEvents_f( void ); +void CG_DumpClassEvents_f( void ); +void CG_DumpAllClasses_f( void ); + +void L_InitEvents( void ); +void L_ShutdownEvents( void ); + + +// +// cg_view.c +// +void CG_TestModel_f (void); +void CG_TestGun_f (void); +void CG_TestModelNextFrame_f (void); +void CG_TestModelPrevFrame_f (void); +void CG_TestModelNextSkin_f (void); +void CG_TestModelPrevSkin_f (void); + +void CG_ZoomDown_f( void ); +void CG_ZoomUp_f( void ); + +void CG_DrawActiveFrame( int serverTime, stereoFrame_t stereoView, qboolean demoPlayback ); + + +// +// cg_drawtools.c +// +void CG_AdjustFrom640( float *x, float *y, float *w, float *h ); +void CG_TileClear( void ); +void CG_Draw2D( void ); + +// +// cg_draw.c +// +void CG_AddLagometerFrameInfo( void ); +void CG_AddLagometerSnapshotInfo( snapshot_t *snap ); +void CG_CenterPrint( const char *str, int y, int charWidth ); +void CG_DrawHead( float x, float y, float w, float h, int clientNum, vec3_t headAngles ); +void CG_DrawActive( stereoFrame_t stereoView ); +void CG_DrawFlagModel( float x, float y, float w, float h, int team ); + +// +// cg_predict.c +// +void CG_BuildSolidList( void ); +int CG_PointContents( const vec3_t point, int passEntityNum ); +void CG_Trace( trace_t *result, const vec3_t start, const vec3_t mins, + const vec3_t maxs, const vec3_t end, int skipNumber, + int mask, qboolean cylinder, qboolean cliptoentities, const char * description ); +void CG_PredictPlayerState( void ); + + +// +// cg_ents.c +// +void CG_SetEntitySoundPosition( centity_t *cent ); +void CG_AddPacketEntities( void ); +void CG_Beam( centity_t *cent ); +void CG_AdjustPositionForMover( const vec3_t in, int moverNum, int fromTime, int toTime, vec3_t out ); + +void CG_PositionEntityOnTag( refEntity_t *entity, const refEntity_t *parent, + qhandle_t parentModel, char *tagName ); +void CG_PositionRotatedEntityOnTag( refEntity_t *entity, const refEntity_t *parent, + qhandle_t parentModel, char *tagName ); +void CG_GetOrigin( centity_t *cent, vec3_t origin ); +void CG_EntityEffects( centity_t *cent ); + +// +// cg_marks.c +// +void CG_InitMarkPolys( void ); +void CG_AddMarks( void ); +void CG_ImpactMark( qhandle_t markShader, + const vec3_t origin, const vec3_t dir, + float orientation, + float r, float g, float b, float a, + qboolean alphaFade, + float radius, qboolean temporary, + int lightstyle, qboolean fadein ); + +// +// cg_snapshot.c +// +void CG_ProcessSnapshots( void ); + +// +// cg_consolecmds.c +// +qboolean CG_ConsoleCommand( void ); +void CG_InitConsoleCommands( void ); +void CG_AddTestModel( void ); + +// +// cg_servercmds.c +// +void CG_ExecuteNewServerCommands( int latestSequence ); +void CG_ParseServerinfo( void ); + +// +// cg_playerstate.c +// +void CG_TransitionPlayerState( playerState_t *ps, playerState_t *ops ); + +// +// cg_player.cpp +// +void CG_ResetPlayerEntity( centity_t *cent ); +void CG_Player( centity_t *cent ); + +// +// cg_sound.cpp +// +void CG_ProcessSound( server_sound_t *sound ); + +// +// cg_beam.cpp +// +void CG_AddBeams( void ); +void CG_MultiBeamBegin( void ); +void CG_MultiBeamAddPoints + ( + vec3_t start, + vec3_t end, + int numsegments, + int flags, + float minoffset, + float maxoffset, + qboolean addstartpoint + ); +void CG_MultiBeamEnd + ( + float scale, + int renderfx, + const char *beamshadername, + byte modulate[4], + int flags, + int owner, + float life + ); +void CG_CreateBeam + ( + vec3_t start, + vec3_t dir, + int owner, + qhandle_t hModel, + float alpha, + float scale, + int flags, + float length, + int life, + qboolean create, + vec3_t endpointvec, + int min_offset, + int max_offset, + int overlap, + int subdivisions, + int delay, + const char *beamshader, + byte modulate[4], + int numspherebeams, + float sphereradius, + int toggledelay, + float endalpha, + int renderfx, + const char *name + ); + +void CG_KillBeams( int entity_number ); +void CG_Rope( centity_t *cent ); +void CG_RestartBeams( int timedelta ); + + +// +// cg_nature.cpp +// +void CG_Emitter( centity_t *cent ); + +// +// cg_testemitter.cpp +void CG_InitTestEmitter( void ); +void CG_TestEmitter_f( void ); +void CG_DumpEmitter_f( void ); +void CG_InitializeClientEmitters( void ); + +// +// cg_beam.cpp +void RemoveBeamList( int owner ); +void CG_MultiBeam( centity_t *cent ); + +// +// cg_lightstyles.cpp +void CG_SetLightStyle( int num, const char *s ); +#ifdef __cplusplus +qboolean CG_LightStyleColor( int style, int realtime, float color[4], qboolean clamp = qfalse ); +#else +qboolean CG_LightStyleColor( int style, int realtime, float color[4], qboolean clamp ); +#endif +void CG_ClearLightStyles( void ); +int CG_RegisterLightStyle( const char * name ); + +// +// cg_specialfx.cpp +void CG_Footstep( centity_t * ent, float volume ); + +// +// cg_swipe.cpp +void CG_ClearSwipes( void ); + + +#ifdef __cplusplus +} +#endif + +#endif // __CG_LOCAL_H__ + diff --git a/source/source/cgame/cg_main.c b/source/source/cgame/cg_main.c new file mode 100644 index 0000000..3827011 --- /dev/null +++ b/source/source/cgame/cg_main.c @@ -0,0 +1,611 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/cgame/cg_main.c $ +// $Revision:: 51 $ +// $Author:: Aldie $ +// $Date:: 7/24/00 9:58p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/cgame/cg_main.c $ +// +// 51 7/24/00 9:58p Aldie +// Fix for backtile +// +// 50 7/24/00 11:52a Aldie +// Added cg_effectdetail for reducing number of effects +// +// 49 7/16/00 11:01p Markd +// Added updateLoadingScreen calls +// +// 48 7/15/00 12:32p Aldie +// Fixed a bug for restarting tempmodels on a save game +// +// 47 7/10/00 11:54p Markd +// added exit level code +// +// 46 7/07/00 2:58p Markd +// fixed alias bug +// +// 45 6/28/00 4:36p Markd +// added debug footsteps code +// +// 44 6/27/00 2:34p Markd +// clear out swipes when restarting +// +// 43 6/26/00 9:36p Markd +// cleared out blood marks at the beginning of the level and also made sure +// that snapshots from previous games are not sent to the cgame +// +// 42 6/17/00 1:54p Markd +// Added server restarted code +// +// 41 6/14/00 12:14p Markd +// more intel compiler bug fixes +// +// 40 6/09/00 10:27a Markd +// got lagometer and CG_2D operations functioning +// +// 39 5/20/00 5:14p Markd +// Added ITEM special effects +// +// 38 5/16/00 6:24p Markd +// added cg_traceinfo support +// +// 37 5/11/00 11:06a Steven +// Changed the water ripple shader. +// +// 36 5/08/00 6:12p Markd +// Added lightstyle support for the client +// +// 35 5/02/00 7:20p Markd +// changed camera defaults +// +// 34 3/31/00 11:48a Markd +// Added sky_portal control +// +// 33 3/06/00 8:07p Markd +// cleaned up unused cvar's +// +// 32 3/06/00 1:16p Markd +// fixed bug where sounds were overflowing their configstring range +// +// 31 3/04/00 12:23p Markd +// Fixed some lightstyle bugs +// +// 30 3/04/00 11:45a Markd +// Added light style support and malloc and free to the cgame +// +// 29 2/21/00 7:03p Markd +// Added skyalpha support +// +// 28 2/14/00 10:09a Markd +// Tweaked targeting reticles +// +// 27 2/11/00 3:22p Aldie +// Changed swipe code a bit, and added cg_hidetempmodels cvar. +// +// 26 2/08/00 6:24p Markd +// removed unused mediashader +// +// 25 1/28/00 6:11p Jimdose +// added CG_GetRendererConfig +// +// 24 1/27/00 9:06a Markd +// Added watermark +// +// 23 1/06/00 11:10p Jimdose +// removed unused commands +// +// 22 12/11/99 5:51p Markd +// First wave of bug fixes after q3a gold merge +// +// 21 12/11/99 3:37p Markd +// q3a gold checkin, first time +// +// 20 10/29/99 7:23p Steven +// Moved sound stuff into snapshot. +// +// 19 10/07/99 9:56a Markd +// made fov come out of playerstate, not cvar +// +// 18 10/05/99 6:01p Aldie +// Added headers +// +// DESCRIPTION: +// Init functions for the cgame + +#include "cg_local.h" + +#ifdef _WIN32 +#include +#endif + +clientGameImport_t cgi; + +cg_t cg; +cgs_t cgs; +centity_t cg_entities[MAX_GENTITIES]; + +cvar_t *cg_animSpeed; +cvar_t *cg_debugFootsteps; +cvar_t *cg_debugAnim; +cvar_t *cg_debugAnimWatch; +cvar_t *cg_errorDecay; +cvar_t *cg_nopredict; +cvar_t *cg_showmiss; +cvar_t *cg_addMarks; +cvar_t *cg_viewsize; +cvar_t *cg_3rd_person; +cvar_t *cg_syncronousClients; +cvar_t *cg_stats; +cvar_t *cg_hidetempmodels; +cvar_t *paused; +cvar_t *r_lerpmodels; +cvar_t *cg_stereoSeparation; +cvar_t *cg_lagometer; +cvar_t *cg_cameraheight; +cvar_t *cg_cameradist; +cvar_t *cg_camerascale; +cvar_t *cg_cameraverticaldisplacement; +cvar_t *cg_traceinfo; +cvar_t *cg_shadows; +cvar_t *developer; + +/* +================= +CG_RegisterCvars +================= +*/ +void CG_RegisterCvars( void ) + { + cvar_t * temp; + + cg_viewsize = cgi.Cvar_Get( "viewsize", "100", CVAR_ARCHIVE ); + cg_addMarks = cgi.Cvar_Get( "cg_marks", "1", CVAR_ARCHIVE ); + cg_animSpeed = cgi.Cvar_Get( "cg_animspeed", "1", CVAR_CHEAT ); + cg_debugAnim = cgi.Cvar_Get( "cg_debuganim", "0", CVAR_CHEAT ); + cg_debugAnimWatch = cgi.Cvar_Get( "cg_debuganimwatch", "0", CVAR_CHEAT ); + cg_errorDecay = cgi.Cvar_Get( "cg_errordecay", "100", 0 ); + cg_nopredict = cgi.Cvar_Get( "cg_nopredict", "0", 0 ); + cg_showmiss = cgi.Cvar_Get( "cg_showmiss", "0", 0 ); + cg_stats = cgi.Cvar_Get( "cg_stats", "0", 0 ); + cg_hidetempmodels = cgi.Cvar_Get( "cg_hidetempmodels", "0", 0 ); + cg_syncronousClients = cgi.Cvar_Get( "g_syncronousClients", "0", 0 ); + cg_stereoSeparation = cgi.Cvar_Get( "cg_stereosep", "0.4", CVAR_ARCHIVE ); + cg_lagometer = cgi.Cvar_Get( "cg_lagometer", "0", 0 ); + paused = cgi.Cvar_Get( "paused", "0", 0 ); + r_lerpmodels = cgi.Cvar_Get( "r_lerpmodels", "1", 0 ); + cg_3rd_person = cgi.Cvar_Get( "cg_3rd_person", "1", 0 ); + cg_cameraheight = cgi.Cvar_Get ("cg_cameraheight", "18", CVAR_ARCHIVE); + cg_cameradist = cgi.Cvar_Get ("cg_cameradist" , "120", CVAR_ARCHIVE); + cg_cameraverticaldisplacement = cgi.Cvar_Get ("cg_cameraverticaldisplacement" , "-2", CVAR_ARCHIVE); + cg_camerascale = cgi.Cvar_Get ("cg_camerascale" , "0.3", CVAR_ARCHIVE); + cg_traceinfo = cgi.Cvar_Get ("cg_traceinfo" , "0", CVAR_ARCHIVE); + cg_debugFootsteps = cgi.Cvar_Get( "cg_debugfootsteps", "0", CVAR_CHEAT ); + + cg_shadows = cgi.Cvar_Get( "cg_shadows", "1", 0 ); + developer = cgi.Cvar_Get( "developer", "0", 0 ); + + // see if we are also running the server on this machine + temp = cgi.Cvar_Get( "sv_running", "0", 0 ); + cgs.localServer = temp->integer; + } + +/* +================= +CG_RegisterSounds + +called during a precache command +================= +*/ +void CG_RegisterSounds( void ) { + int i; + + // process the global defs + for ( i = 0; i < 10; i++ ) + { + char filename[ MAX_QPATH ]; + + Com_sprintf( filename, sizeof( filename ), "global/global%i.scr", i ); + if ( !CG_Command_ProcessFile( filename, qtrue ) ) + { + break; + } + } +} + +/* +================ +CG_ProcessConfigString +================ +*/ +void CG_ProcessConfigString( int num ) + { + const char *str; + + if ( num == CS_SOUNDTRACK ) + { + cgi.UpdateLoadingScreen(); + str = CG_ConfigString( num ); + cgi.MUSIC_NewSoundtrack( str ); + } + if ( num == CS_FOGINFO ) + { + str = CG_ConfigString( num ); + sscanf + ( + str, + "%d %f %f %f %f", + &cg.farplane_cull, + &cg.farplane_distance, + &cg.farplane_color[ 0 ], + &cg.farplane_color[ 1 ], + &cg.farplane_color[ 2 ] + ); + } + else if ( num == CS_SKYINFO ) + { + str = CG_ConfigString( num ); + sscanf + ( + str, + "%f %d", + &cg.sky_alpha, + &cg.sky_portal + ); + } + else if ( num == CS_SERVERINFO ) + { + CG_ParseServerinfo(); + } + else if ( num == CS_LEVEL_START_TIME ) + { + str = CG_ConfigString( num ); + cgs.levelStartTime = atoi( str ); + } + else if ( num >= CS_MODELS && num < CS_MODELS+MAX_MODELS ) + { + str = CG_ConfigString( num ); + if ( str && str[ 0 ] ) + { + cgs.model_draw[ num-CS_MODELS ] = cgi.R_RegisterModel( str ); + if ( strstr( str, ".tik" ) ) + { + cgs.model_tiki[ num-CS_MODELS ] = cgi.TIKI_GetHandle( cgs.model_draw[ num-CS_MODELS ] ); + if ( cgs.model_tiki[ num-CS_MODELS ] >= 0 ) + CG_ProcessInitCommands( cgs.model_tiki[ num-CS_MODELS ] ); + } + cgi.UpdateLoadingScreen(); + } + } + else if ( num >= CS_SOUNDS && num < CS_SOUNDS+MAX_SOUNDS ) + { + str = CG_ConfigString( num ); + if ( str && str[ 0 ] && ( str[0] != '*' ) ) + { + cgs.sound_precache[ num-CS_SOUNDS] = cgi.S_RegisterSound( str ); + cgi.UpdateLoadingScreen(); + } + } + else if ( num >= CS_LIGHTSTYLES && num < CS_LIGHTSTYLES+MAX_LIGHTSTYLES ) + { + str = CG_ConfigString( num ); + CG_SetLightStyle( num - CS_LIGHTSTYLES, str ); + } + } + +//=================================================================================== + +/* +================= +CG_PrepRefresh + +Call before entering a new level, or after changing renderers +This function may execute for a couple of minutes with a slow disk. +================= +*/ +void CG_PrepRefresh( void ) + { + int i; + + memset( &cg.refdef, 0, sizeof( cg.refdef ) ); + + cgi.R_ClearScene(); + + // clear any tiki handles to bad values + memset( &cgs.model_tiki, -1, sizeof( cgs.model_tiki ) ); + + cgi.R_LoadWorldMap( cgs.mapname ); + + // register the inline models + cgs.numInlineModels = cgi.CM_NumInlineModels(); + + for ( i=1; i= MAX_CONFIGSTRINGS ) { + cgi.Error( ERR_DROP, "CG_ConfigString: bad index: %i", index ); + } + return cgs.gameState.stringData + cgs.gameState.stringOffsets[ index ]; +} + +//================================================================== + + +void CG_GetRendererConfig( void ) + { + // get the rendering configuration from the client system + cgi.GetGlconfig( &cgs.glconfig ); + cgs.screenXScale = cgs.glconfig.vidWidth / 640.0; + cgs.screenYScale = cgs.glconfig.vidHeight / 480.0; + } + +/* +====================== +CG_GameStateReceived + +Displays the info screen while loading media +====================== +*/ +void CG_GameStateReceived( void ) + { + const char *s; + + // clear everything + memset( &cg, 0, sizeof( cg ) ); + memset( cg_entities, 0, sizeof(cg_entities) ); + + // clear the light styles + CG_ClearLightStyles(); + + // get the rendering configuration from the client system + CG_GetRendererConfig(); + + // get the gamestate from the client system + cgi.GetGameState( &cgs.gameState ); + + // check version + s = CG_ConfigString( CS_GAME_VERSION ); + if ( strcmp( s, GAME_VERSION ) ) { + cgi.Error( ERR_DROP, "Client/Server game mismatch: %s/%s", GAME_VERSION, s ); + } + + s = CG_ConfigString( CS_LEVEL_START_TIME ); + cgs.levelStartTime = atoi( s ); + + CG_ParseServerinfo(); + + // load the new map + cgi.CM_LoadMap( cgs.mapname ); + + CG_InitMarkPolys(); + + CG_RegisterSounds(); + + CG_PrepRefresh(); + + // remove the last loading update + cg.infoScreenText[0] = 0; + } + + +/* +====================== +CG_ServerRestarted + +The server has beeen restarted, adjust our cgame data accordingly +====================== +*/ +void CG_ServerRestarted( void ) + { + int timedelta; + const char * s; + + s = CG_ConfigString( CS_LEVEL_START_TIME ); + cgs.levelStartTime = atoi( s ); + + CG_ParseServerinfo(); + + cg.thisFrameTeleport = qtrue; + cg.lastCameraTime = -1; + timedelta = cg.oldTime - cg.time; + // free up any temp models currently spawned + CG_RestartCommandManager( timedelta ); + // restart beams + CG_RestartBeams( timedelta ); + // get rid of left over decals from the last game + CG_InitMarkPolys(); + // clear all the swipes + CG_ClearSwipes(); + // Reset tempmodels + CG_ResetTempModels(); + } + +/* +================= +CG_Init + +Called after every level change or subsystem restart +================= +*/ +void CG_Init( clientGameImport_t *imported, int serverMessageNum, int serverCommandSequence ) { + + cgi = *imported; + + memset( &cg, 0, sizeof( cg ) ); + memset( &cgs, 0, sizeof( cgs ) ); + + cgs.processedSnapshotNum = serverMessageNum; + cgs.serverCommandSequence = serverCommandSequence; + + CG_RegisterCvars(); + + L_InitEvents(); + + // init swapping for endian conversion + Swap_Init (); + + CG_InitializeCommandManager(); + + CG_GameStateReceived(); + + CG_InitConsoleCommands(); + } + +/* +================= +CG_Shutdown + +Called before every level change or subsystem restart +================= +*/ +void CG_Shutdown( void ) + { + L_ShutdownEvents(); + // some mods may need to do cleanup work here, + // like closing files or archiving session data + } + + +/* +================ +GetCGameAPI + +The only exported function from this module +================ +*/ +clientGameExport_t *GetCGameAPI( void ) + { + static clientGameExport_t cge; + + cge.CG_Init = CG_Init; + cge.CG_DrawActiveFrame = CG_DrawActiveFrame; + cge.CG_Shutdown = CG_Shutdown; + cge.CG_ConsoleCommand = CG_ConsoleCommand; + cge.CG_GetRendererConfig = CG_GetRendererConfig; + cge.CG_Draw2D = CG_Draw2D; + + return &cge; + } + +/* +===================== +CG_DrawActive + +Perform all drawing needed to completely fill the screen +===================== +*/ +void CG_DrawActive( stereoFrame_t stereoView ) + { + float separation; + vec3_t baseOrg; + + switch ( stereoView ) + { + case STEREO_CENTER: + separation = 0; + break; + case STEREO_LEFT: + separation = -cg_stereoSeparation->value / 2; + break; + case STEREO_RIGHT: + separation = cg_stereoSeparation->value / 2; + break; + default: + separation = 0; + cgi.Error( ERR_DROP, "CG_DrawActive: Undefined stereoView" ); + } + + // clear around the rendered view if sized down + CG_TileClear(); + + // offset vieworg appropriately if we're doing stereo separation + VectorCopy( cg.refdef.vieworg, baseOrg ); + if ( separation != 0 ) + { + VectorMA( cg.refdef.vieworg, -separation, cg.refdef.viewaxis[1], cg.refdef.vieworg ); + } + + // draw 3D view + cgi.R_RenderScene( &cg.refdef ); + + // restore original viewpoint if running stereo + if ( separation != 0 ) + { + VectorCopy( baseOrg, cg.refdef.vieworg ); + } + } + +#ifndef CGAME_HARD_LINKED +// this is only here so the functions in q_shared.c and bg_*.c can link (FIXME) + +void Com_Error( int level, const char *error, ... ) { + va_list argptr; + char text[1024]; + + va_start (argptr, error); + vsprintf (text, error, argptr); + va_end (argptr); + + cgi.Error( level, "%s", text); +} + +void Com_Printf( const char *msg, ... ) { + va_list argptr; + char text[1024]; + + va_start (argptr, msg); + vsprintf (text, msg, argptr); + va_end (argptr); + + cgi.Printf( "%s", text); +} + +#endif + + diff --git a/source/source/cgame/cg_marks.c b/source/source/cgame/cg_marks.c new file mode 100644 index 0000000..295893b --- /dev/null +++ b/source/source/cgame/cg_marks.c @@ -0,0 +1,388 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/cgame/cg_marks.c $ +// $Revision:: 11 $ +// $Author:: Aldie $ +// $Date:: 6/27/00 7:17p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/cgame/cg_marks.c $ +// +// 11 6/27/00 7:17p Aldie +// Increase projection of point for impact mark +// +// 10 6/06/00 1:59p Aldie +// Added fadein to marks +// +// 9 5/09/00 1:33p Markd +// added some lightstyle utilities to SetLightStyle +// +// 8 5/09/00 1:29p Aldie +// Added lightstyles to impact marks +// +// 7 2/10/00 8:05p Aldie +// Changed marks again +// +// 6 2/10/00 6:59p Aldie +// Made some changes to bulletholes. +// +// 5 12/11/99 3:37p Markd +// q3a gold checkin, first time +// +// 4 10/22/99 6:29p Aldie +// Fix for beams in the sky +// +// 3 10/05/99 6:01p Aldie +// Added headers +// +// DESCRIPTION: +// wall marks + +#include "cg_local.h" + +/* +=================================================================== + +MARK POLYS + +=================================================================== +*/ + + +markPoly_t cg_activeMarkPolys; // double linked list +markPoly_t *cg_freeMarkPolys; // single linked list +markPoly_t cg_markPolys[MAX_MARK_POLYS]; + +/* +=================== +CG_InitMarkPolys + +This is called at startup and for tournement restarts +=================== +*/ +void CG_InitMarkPolys( void ) { + int i; + + memset( cg_markPolys, 0, sizeof(cg_markPolys) ); + + cg_activeMarkPolys.nextMark = &cg_activeMarkPolys; + cg_activeMarkPolys.prevMark = &cg_activeMarkPolys; + cg_freeMarkPolys = cg_markPolys; + for ( i = 0 ; i < MAX_MARK_POLYS - 1 ; i++ ) { + cg_markPolys[i].nextMark = &cg_markPolys[i+1]; + } +} + + +/* +================== +CG_FreeMarkPoly +================== +*/ +void CG_FreeMarkPoly( markPoly_t *le ) { + if ( !le->prevMark ) { + cgi.Error( ERR_DROP, "CG_FreeLocalEntity: not active" ); + } + + // remove from the doubly linked active list + le->prevMark->nextMark = le->nextMark; + le->nextMark->prevMark = le->prevMark; + + // the free list is only singly linked + le->nextMark = cg_freeMarkPolys; + cg_freeMarkPolys = le; +} + +/* +=================== +CG_AllocMark + +Will allways succeed, even if it requires freeing an old active mark +=================== +*/ +markPoly_t *CG_AllocMark( void ) { + markPoly_t *le; + + if ( !cg_freeMarkPolys ) { + int time; + // no free entities, so free the one at the end of the chain + // remove the oldest active entity + time = cg_activeMarkPolys.prevMark->time; + while (cg_activeMarkPolys.prevMark && time == cg_activeMarkPolys.prevMark->time) { + CG_FreeMarkPoly( cg_activeMarkPolys.prevMark ); + } + } + + le = cg_freeMarkPolys; + cg_freeMarkPolys = cg_freeMarkPolys->nextMark; + + memset( le, 0, sizeof( *le ) ); + + // link into the active list + le->nextMark = cg_activeMarkPolys.nextMark; + le->prevMark = &cg_activeMarkPolys; + cg_activeMarkPolys.nextMark->prevMark = le; + cg_activeMarkPolys.nextMark = le; + return le; +} + + + +/* +================= +CG_ImpactMark + +origin should be a point within a unit of the plane +dir should be the plane normal + +temporary marks will not be stored or randomly oriented, but immediately +passed to the renderer. +================= +*/ +#define MAX_MARK_FRAGMENTS 128 +#define MAX_MARK_POINTS 384 + +void CG_ImpactMark + ( + qhandle_t markShader, + const vec3_t origin, + const vec3_t dir, + float orientation, + float red, + float green, + float blue, + float alpha, + qboolean alphaFade, + float radius, + qboolean temporary, + int lightstyle, + qboolean fadein + ) + + { + vec3_t axis[3]; + float texCoordScale; + vec3_t originalPoints[4]; + byte colors[4]; + int i, j; + int numFragments; + markFragment_t markFragments[MAX_MARK_FRAGMENTS], *mf; + vec3_t markPoints[MAX_MARK_POINTS]; + vec3_t projection; + + if ( !cg_addMarks->integer ) { + return; + } + + if ( radius <= 0 ) { + cgi.Error( ERR_DROP, "CG_ImpactMark called with <= 0 radius" ); + } + + // create the texture axis + + if ( orientation ) + { + VectorNormalize2( dir, axis[0] ); + PerpendicularVector( axis[1], axis[0] ); + RotatePointAroundVector( axis[2], axis[0], axis[1], orientation ); + CrossProduct( axis[0], axis[2], axis[1] ); + } + else + { + vec3_t angles; + vec3_t tmp; + + VectorNormalize2( dir, axis[0] ); + VectorCopy( dir, tmp ); + tmp[0] = -tmp[0]; + tmp[1] = -tmp[1]; + vectoangles( tmp, angles ); + AnglesToMat( angles, axis ); + VectorScale( axis[2], -1, axis[2] ); + } + + texCoordScale = 0.5 * 1.0 / radius; + + // create the full polygon + for ( i = 0 ; i < 3 ; i++ ) { + originalPoints[0][i] = origin[i] - radius * axis[1][i] - radius * axis[2][i]; + originalPoints[1][i] = origin[i] + radius * axis[1][i] - radius * axis[2][i]; + originalPoints[2][i] = origin[i] + radius * axis[1][i] + radius * axis[2][i]; + originalPoints[3][i] = origin[i] - radius * axis[1][i] + radius * axis[2][i]; + } + + // get the fragments + VectorScale( dir, -32, projection ); + + numFragments = cgi.CM_MarkFragments( 4, (void *)originalPoints, + projection, MAX_MARK_POINTS, markPoints[0], + MAX_MARK_FRAGMENTS, markFragments ); + + if ( fadein ) + { + colors[0] = 0; + colors[1] = 0; + colors[2] = 0; + colors[3] = 0; + } + else + { + colors[0] = red * 255; + colors[1] = green * 255; + colors[2] = blue * 255; + colors[3] = alpha * 255; + } + + for ( i = 0, mf = markFragments ; i < numFragments ; i++, mf++ ) { + polyVert_t *v; + polyVert_t verts[MAX_VERTS_ON_POLY]; + markPoly_t *mark; + + // we have an upper limit on the complexity of polygons + // that we store persistantly + if ( mf->numPoints > MAX_VERTS_ON_POLY ) { + mf->numPoints = MAX_VERTS_ON_POLY; + } + for ( j = 0, v = verts ; j < mf->numPoints ; j++, v++ ) { + vec3_t delta; + + VectorCopy( markPoints[mf->firstPoint + j], v->xyz ); + + VectorSubtract( v->xyz, origin, delta ); + v->st[0] = 0.5 + DotProduct( delta, axis[1] ) * texCoordScale; + v->st[1] = 0.5 + DotProduct( delta, axis[2] ) * texCoordScale; + *(int *)v->modulate = *(int *)colors; + } + + // if it is a temporary (shadow) mark, add it immediately and forget about it + if ( temporary ) { + cgi.R_AddPolyToScene( markShader, mf->numPoints, verts, 0 ); + continue; + } + + // otherwise save it persistantly + mark = CG_AllocMark(); + mark->time = cg.time; + mark->alphaFade = alphaFade; + mark->markShader = markShader; + mark->poly.numVerts = mf->numPoints; + mark->color[0] = red; + mark->color[1] = green; + mark->color[2] = blue; + mark->color[3] = alpha; + mark->fadein = fadein; + mark->lightstyle = lightstyle; + memcpy( mark->verts, verts, mf->numPoints * sizeof( verts[0] ) ); + } +} + + +/* +=============== +CG_AddMarks +=============== +*/ +#define MARK_TOTAL_TIME 10000 +#define MARK_FADE_TIME 1000 + +void CG_AddMarks( void ) { + int j; + markPoly_t *mp, *next; + int t; + int fade; + + if ( !cg_addMarks->integer ) { + return; + } + + mp = cg_activeMarkPolys.nextMark; + for ( ; mp != &cg_activeMarkPolys ; mp = next ) { + // grab next now, so if the local entity is freed we + // still have it + next = mp->nextMark; + + // see if it is time to completely remove it + if ( cg.time > mp->time + MARK_TOTAL_TIME ) { + CG_FreeMarkPoly( mp ); + continue; + } + + // fade all marks out with time + t = mp->time + MARK_TOTAL_TIME - cg.time; + + if ( mp->lightstyle > 0 ) + { + CG_LightStyleColor( mp->lightstyle, t, mp->color, qtrue ); + + if ( mp->color[3] <= 0 ) + { + CG_FreeMarkPoly( mp ); + continue; + } + + for ( j = 0 ; j < mp->poly.numVerts ; j++ ) + { + mp->verts[j].modulate[0] = mp->color[0] * 255; + mp->verts[j].modulate[1] = mp->color[1] * 255; + mp->verts[j].modulate[2] = mp->color[2] * 255; + mp->verts[j].modulate[3] = mp->color[3] * 255; + } + } + + // Fade in marks + if ( mp->fadein ) + { + fade = 255 * ( cg.time - mp->time ) / MARK_FADE_TIME; + + if ( fade > 255 ) + fade = 255; + + if ( mp->alphaFade ) + { + for ( j = 0 ; j < mp->poly.numVerts ; j++ ) + { + mp->verts[j].modulate[3] = fade; + } + } + else + { + for ( j = 0 ; j < mp->poly.numVerts ; j++ ) + { + mp->verts[j].modulate[0] = mp->color[0] * fade; + mp->verts[j].modulate[1] = mp->color[1] * fade; + mp->verts[j].modulate[2] = mp->color[2] * fade; + } + } + } + + // Fade out marks + if ( t < MARK_FADE_TIME ) + { + fade = 255 * t / MARK_FADE_TIME; + if ( mp->alphaFade ) + { + for ( j = 0 ; j < mp->poly.numVerts ; j++ ) + { + mp->verts[j].modulate[3] = fade; + } + } + else + { + for ( j = 0 ; j < mp->poly.numVerts ; j++ ) + { + mp->verts[j].modulate[0] = mp->color[0] * fade; + mp->verts[j].modulate[1] = mp->color[1] * fade; + mp->verts[j].modulate[2] = mp->color[2] * fade; + } + } + } + + cgi.R_AddPolyToScene( mp->markShader, mp->poly.numVerts, mp->verts, 0 ); + } +} + diff --git a/source/source/cgame/cg_modelanim.c b/source/source/cgame/cg_modelanim.c new file mode 100644 index 0000000..3a7e46b --- /dev/null +++ b/source/source/cgame/cg_modelanim.c @@ -0,0 +1,1405 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/cgame/cg_modelanim.c $ +// $Revision:: 83 $ +// $Author:: Markd $ +// $Date:: 7/30/00 2:58p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/cgame/cg_modelanim.c $ +// +// 83 7/30/00 2:58p Markd +// don't use ground targeting reticle when they are standing in water +// +// 82 7/28/00 2:39a Aldie +// Added notimecheck anim flag, and handle it in cg_modelanim to help with +// jittering on crossblending +// +// 81 7/23/00 1:28p Aldie +// Trying out some fixes for crossblending hitches +// +// 80 7/23/00 10:47a Aldie +// Fixed a syntax error +// +// 79 7/23/00 12:28a Aldie +// Slight fix for frame lerping problems in the player anims +// +// 78 7/03/00 9:11p Markd +// fixed lerping issue when entities are reset +// +// 77 6/26/00 5:50p Markd +// re-did some renderfx commands, fixed anti-sb juice stuff +// +// 76 6/06/00 1:59p Aldie +// Added fadein to marks +// +// 75 6/05/00 3:10p Markd +// Added has_commands check to client side command processing +// +// 74 6/04/00 6:03p Markd +// Added precise shadow support +// +// 73 6/03/00 5:25p Aldie +// Take out shadow on hidden RF_DONTDRAW objects +// +// 72 6/03/00 10:55a Markd +// Sped up tracing and debug print messages +// +// 71 5/25/00 9:57a Steven +// Made it so the player's shadow is not drawn if in first person mode. +// +// 70 5/22/00 8:00p Markd +// fixed crossblend problem +// +// 69 5/22/00 4:49p Markd +// added fix for blend bit not being masked off on crossblend anim +// +// 68 5/09/00 1:29p Aldie +// Added lightstyles to impact marks +// +// 67 5/03/00 5:27p Markd +// when resetting the animation, we set the old anim and old frame to the new +// anim and new frame so that we don't get unwanted crossfading +// +// 66 5/02/00 3:46p Markd +// fixed targeting reticles spinning the right direction +// +// 65 4/29/00 11:45a Markd +// made targeting reticles turn in the same direction +// +// 64 4/21/00 4:36p Steven +// Bulletproofed CG_RunModelAnimation a little more. +// +// 63 4/21/00 3:02p Markd +// removed RF_LIGHTINGORIGIN usage from models +// +// 62 4/05/00 7:09p Markd +// fixed exit command problem +// +// 61 4/03/00 10:55a Markd +// fixed targeting reticles on flying creatures +// +// 60 3/22/00 11:19a Markd +// fixed lighting bug on attached models +// +// 59 3/20/00 9:39a Markd +// fixed driven animations when switching animations and net resetting the +// frame of the animation +// +// 58 3/18/00 10:25a Markd +// fixed some bit masking issues with anims in ValidateSkelFrame and the model +// code +// +// 57 3/03/00 4:36p Markd +// Fixed air targeting on creatures +// +// 56 2/24/00 3:18p Jimdose +// when changing from no legs or no torso anim, crossblend from the opposite +// part's animation +// +// 55 2/23/00 1:46p Jimdose +// removed warning about uselegs and usetorso not being set +// +// 54 2/23/00 12:15p Jimdose +// added checks to prevent an animation without legs or torso +// +// 53 2/22/00 5:55p Markd +// Fixed 2 frame animations with low framerate +// +// 52 2/21/00 2:51p Markd +// Added GlobalRadius support to tikis +// +// 51 2/16/00 6:58p Markd +// cleaned up version of new animation system +// +// 50 2/16/00 6:56p Markd +// added new animation system +// +// 49 2/15/00 8:55p Jimdose +// fixed animation frames and delta sync problem +// +// 48 2/14/00 5:48p Jimdose +// legs animation now only plays when ANIM_BLEND is set on anim or if uselegs +// is set +// +// 47 2/14/00 10:09a Markd +// Tweaked targeting reticles +// +// 46 2/12/00 4:32p Markd +// fixed some bugs with the targeting +// +// 45 2/12/00 3:44p Markd +// Added targeted entity support +// +// 44 2/12/00 3:24p Jimdose +// renamed ANIM_BLEND_TORSO to ANIM_BLEND +// +// 43 1/27/00 1:16p Steven +// Fixed some looping sound origin issues. +// +// 42 1/26/00 10:49p Jimdose +// crossblending was taking the crossblend time from the source anim and not +// the destination anim +// +// 41 1/26/00 5:56p Jimdose +// CG_ClearModelAnimation now sets crossblend_frametime to cg.time. This way, +// the game doesn't try to crossblend just because a model entered the view +// +// 40 1/26/00 3:34p Markd +// Added Renderfx mask for inherited entities +// +// 39 1/25/00 8:08p Jimdose +// added crossblend time to tikis +// +// 38 1/19/00 6:42p Markd +// Added UpdateEntity to CG_General and ModelAnim specifically +// +// 37 1/19/00 12:32p Jimdose +// trying some code to fix pause in looking anims +// +// 36 1/11/00 7:16p Markd +// fixed com_speeds bug where rendering time was not being properly subtracted +// from client time +// +// 35 12/17/99 7:03p Markd +// changed shadow code a little bit +// +// 34 12/14/18 2:42p Jimdose +// fixed problem with FRAME_EXPLICIT models not showing proper animation frame. +// +// 33 12/13/99 3:30p Aldie +// Updated printout +// +// 32 12/09/99 7:42p Jimdose +// got rid of ignore_angles +// +// 31 12/09/99 10:52a Jimdose +// got tags working with torso and crossblended animations +// +// 30 11/17/99 3:07p Markd +// Fixed lerping problem in animation system +// +// 29 11/17/99 12:17p Markd +// Took out RF_NOSHADOW flag +// +// 28 11/17/99 10:08a Markd +// Lightened character shadows slightly +// +// 27 11/17/99 10:07a Markd +// fixed bug with first person models +// +// 26 11/16/99 7:03p Markd +// Put in variable shadows based off of bounding box sizes +// +// 25 11/11/99 3:53p Jimdose +// fixed crossblending into and out of torso animations +// +// 24 11/11/99 11:34a Jimdose +// first pass at torso animation blending in +// +// 23 11/10/99 2:18p Jimdose +// working on torso animation +// +// 22 11/04/99 11:34a Jimdose +// fixed problem where CG_ClearModelAnimation set the animation crossfading +// into a state that wouldn't animate until the animation changed +// +// 21 11/01/99 4:11p Jimdose +// made tags work with bone controllers +// +// 20 11/01/99 10:35a Markd +// if there is no tikihandle, still setup frame and anim as a general entity +// +// 19 10/29/99 6:52p Jimdose +// added bone controllers +// +// 18 10/28/99 6:05p Steven +// Added a use_angles flag and an offset to the entity attach stuff. +// +// 17 10/26/99 6:30p Jimdose +// added animation blending +// +// 16 10/25/99 12:20p Jimdose +// made head and torso angles local to each entity +// +// 15 10/22/99 10:43a Markd +// Rewrote command processor +// +// 14 10/19/99 7:52p Markd +// Removed three part model system +// +// 13 10/08/99 7:36p Markd +// put in -1 frame check in ModelAnim +// +// 12 10/06/99 7:25p Markd +// removed TIMESTAMP, time and fixed make_static bug +// +// 11 10/05/99 6:01p Aldie +// Added headers +// +// DESCRIPTION: +// Functions for doing model animation and attachments + +#include "cg_local.h" + +/* +=============== +CG_EntityTargeted +=============== +*/ +#define TARGET_GROUND_DISTANCE 32 +void CG_EntityTargeted( int tikihandle, centity_t *cent, refEntity_t *model ) { + vec3_t end, sprite_org; + trace_t trace; + qboolean ground; + float radius; + + // send a trace down from the player to the ground + VectorCopy( model->origin, end ); + end[2] -= TARGET_GROUND_DISTANCE; + + cgi.CM_BoxTrace( &trace, model->origin, end, NULL, NULL, 0, MASK_PLAYERSOLID, qfalse ); + + // no shadow if too high + if ( trace.fraction == 1.0 ) + { + ground = qfalse; + } + else + { + if ( trace.contents & MASK_WATER ) + { + ground = qfalse; + } + else + { + ground = qtrue; + } + } + + // + // get the bounds of the current frame + // + if ( ground ) + { + radius = cgi.R_ModelRadius( model->hModel ) * model->scale * 1.25f; + } + else + { + vec3_t mins, maxs; + //vec3_t delta; + + if ( tikihandle >= 0 ) + { + radius = cgi.R_ModelRadius( model->hModel ) * model->scale * 2.0f; + VectorCopy( model->origin, sprite_org ); + sprite_org[ 2 ] += 0.5f * radius; + } + else + { + cgi.R_ModelBounds( model->hModel, mins, maxs ); + radius = ( maxs[ 2 ] - mins[ 2 ] ) * 0.5f; + VectorAdd( mins, maxs, sprite_org ); + VectorMA( model->origin, 0.5f, sprite_org, sprite_org ); + } + } + + + if ( radius < 1 ) + { + return; + } + + if ( ground ) + { + if ( cent->currentState.eFlags & EF_LEFT_TARGETED ) + { + CG_ImpactMark( cgs.media.leftTargetShader, trace.endpos, trace.plane.normal, + ( cg.time * 120 / 1000 ) % 360, 1, 1, 1, 1, qfalse, radius, qtrue, -1, qfalse ); + } + if ( cent->currentState.eFlags & EF_RIGHT_TARGETED ) + { + CG_ImpactMark( cgs.media.rightTargetShader, trace.endpos, trace.plane.normal, + ( cg.time * 120 / 1000 ) % 360, 1, 1, 1, 1, qfalse, radius, qtrue, -1, qfalse ); + } + } + else + { + vec3_t angles; + refEntity_t sprite; + + memset( &sprite, 0, sizeof( sprite ) ); + VectorCopy( sprite_org, sprite.origin); + VectorCopy( sprite_org, sprite.oldorigin); + VectorCopy( vec3_origin, angles ); + sprite.shaderRGBA[ 0 ] = 255; + sprite.shaderRGBA[ 1 ] = 255; + sprite.shaderRGBA[ 2 ] = 255; + sprite.shaderRGBA[ 3 ] = 128; + + if ( cent->currentState.eFlags & EF_LEFT_TARGETED ) + { + angles[ ROLL ] = ( cg.time * 120 / 1000 ) % 360; + // convert angles to axis + AnglesToAxis( angles, sprite.axis ); + + sprite.hModel = cgs.media.leftTargetModel; + sprite.scale = radius / cgi.R_ModelRadius( sprite.hModel ); + // add to refresh list + cgi.R_AddRefSpriteToScene( &sprite ); + } + if ( cent->currentState.eFlags & EF_RIGHT_TARGETED ) + { + angles[ ROLL ] = ( cg.time * 120 / 1000 ) % 360; + // convert angles to axis + AnglesToAxis( angles, sprite.axis ); + + sprite.hModel = cgs.media.rightTargetModel; + sprite.scale = radius / cgi.R_ModelRadius( sprite.hModel ); + // add to refresh list + cgi.R_AddRefSpriteToScene( &sprite ); + } + } + + return; +} + +/* +=============== +CG_EntityShadow + +Returns the Z component of the surface being shadowed + + should it return a full plane instead of a Z? +=============== +*/ +#define SHADOW_DISTANCE 96 +qboolean CG_EntityShadow( centity_t *cent, refEntity_t *model ) { + vec3_t end; + trace_t trace; + float alpha, radius; + + + model->shadowPlane = 0; + + if ( cg_shadows->integer == 0 ) { + return qfalse; + } + + if ( model->renderfx & RF_SKYENTITY ) + { + // no shadows on sky entities + return qfalse; + } + + // no shadows when invisible +// if ( cent->currentState.powerups & ( 1 << PW_INVIS ) ) { +// return qfalse; +// } + + // send a trace down from the player to the ground + VectorCopy( model->origin, end ); + end[2] -= SHADOW_DISTANCE; + + cgi.CM_BoxTrace( &trace, model->origin, end, NULL, NULL, 0, MASK_PLAYERSOLID, qfalse ); + + // no shadow if too high + if ( trace.fraction == 1.0 ) { + return qfalse; + } + + model->shadowPlane = trace.endpos[2] + 1; + + if ( ( cg_shadows->integer == 2 ) && ( model->renderfx & RF_SHADOW_PRECISE ) ) + { + return qtrue; + } + + // + // get the bounds of the current frame + // + radius = model->scale * cgi.R_ModelRadius( model->hModel ); + + if ( radius < 1 ) + { + return qfalse; + } + + // fade the shadow out with height + alpha = ( 1.0 - trace.fraction ) * 0.8f; + + if ( ( cg_shadows->integer == 3 ) && ( model->renderfx & RF_SHADOW_PRECISE ) ) + { + if ( model->shaderRGBA[ 3 ] == 255 ) + { + model->shaderRGBA[ 3 ] = alpha * 255; + } + return qtrue; + } + + // add the mark as a temporary, so it goes directly to the renderer + // without taking a spot in the cg_marks array + CG_ImpactMark( cgs.media.shadowMarkShader, trace.endpos, trace.plane.normal, + cent->lerpAngles[ YAW ], alpha,alpha,alpha,1, qfalse, radius, qtrue, -1, qfalse ); + + return qtrue; +} + +// +// +// NEW ANIMATION AND THREE PART MODEL SYSTEM +// +// + +//================= +//CG_AnimationDebugMessage +//================= +void CG_AnimationDebugMessage + ( + int number, + const char *fmt, + ... + ) + { +#ifndef NDEBUG + if ( cg_debugAnim->integer ) + { + va_list argptr; + char msg[1024]; + + va_start (argptr,fmt); + vsprintf (msg,fmt,argptr); + va_end (argptr); + + if ( ( !cg_debugAnimWatch->integer ) || ( ( cg_debugAnimWatch->integer - 1 ) == number ) ) + { + if ( cg_debugAnim->integer == 2 ) + { + cgi.DebugPrintf( msg ); + } + else + { + cgi.Printf( msg ); + } + } + } +#endif + } + +/* +=============== +CG_SetModelAnimation + +may include ANIM_TOGGLEBIT +=============== +*/ +void CG_SetModelAnimation( int tikihandle, animstate_t * state, animstate_t * altstate, int newAnimation, int time, vec3_t origin, int entnum, qboolean timecheck ) + { + int numframes; + int flags; + qboolean driven; + + numframes = cgi.Anim_NumFrames( tikihandle, newAnimation & ANIM_MASK ); + if ( !numframes ) + { + cgi.DPrintf( "Can't find animation %i\n", newAnimation & ANIM_MASK ); + return; + } + flags = cgi.Anim_Flags( tikihandle, newAnimation & ANIM_MASK ); + if ( flags & MDL_ANIM_DELTA_DRIVEN ) + driven = qtrue; + else + driven = qfalse; + + state->time_per_frame = 1000.0f * cgi.Frame_Time( tikihandle, newAnimation & ANIM_MASK, 0 ); + if ( !state->time_per_frame ) + { + cgi.DPrintf( "Animation %i has no time information\n", newAnimation & ANIM_MASK ); + return; + } + +#if 0 + // set the oldanim + state->base.oldanim = state->base.anim; + // set the oldframe + state->base.oldframe = state->base.frame; +#else + // We are blending from the last state so set the oldanim and frame from it + if ( state->base.anim & ANIM_BLEND ) + { + // set the oldanim + state->base.oldanim = state->base.anim; + // set the oldframe + state->base.oldframe = state->base.frame; + } + else // We are not blending, so get the oldanim and oldframe from the alternate state + { + // set the oldanim + state->base.oldanim = altstate->base.oldanim; + // set the oldframe + state->base.oldframe = altstate->base.oldframe; + } +#endif + + // if the anims are different and we aren't crossblending than crossblend from the previous animation + if ( + ( ( newAnimation & ANIM_MASK ) != ( state->base.anim & ANIM_MASK ) ) && + ( ( ( time - state->crossblend.starttime ) >= state->crossblend_totaltime ) || !timecheck || ( flags & MDL_ANIM_NO_TIMECHECK ) ) + ) + { + // if we didn't have an anim last state then use the alternate state for the crossblend + if ( state->base.anim & ANIM_BLEND ) + { + // copy the previous state over + state->crossblend = state->base; +#if 0 + cgi.DPrintf( "Setting crossblend:%s\n", cgi.Anim_NameForNum( tikihandle, state->base.anim & ANIM_MASK ) ); +#endif + } + else + { + // copy the previous state over from the alternate state + state->crossblend = altstate->base; +#if 0 + cgi.DPrintf( "Setting crossblend (alt):%s\n", cgi.Anim_NameForNum( tikihandle, altstate->base.anim & ANIM_MASK ) ); +#endif + } + // start crossblending from the nearest serverTime so it is synced with the other animations + state->crossblend.starttime = time; + // total time is determined by the animation + state->crossblend_totaltime = cgi.Anim_CrossblendTime( tikihandle, newAnimation & ANIM_MASK ); + } + + // if we went from a non-driven to a driven or vice versa reset certain variables + if ( driven != state->driven ) + { + if ( driven ) + { + // reset our position + VectorCopy( origin, state->last_origin ); + // reset the last time we animated for driven animations + state->last_driven_time = cg.time; + // reset our current distance + state->current_distance = 0; + // reset our frame number so that we start at the beginning of the animation + state->base.frame = 0; + } + else + { + // we don't want to process commands from the previous delta-driven animation any more, so we skip over them + // by making it look like we are at the beginning of this animation + state->last_cmd_frame = 0; + } + } + // if we were driving last animatino, and our anim change, reset the frame number + else if ( driven && ( newAnimation & ANIM_MASK ) != ( state->base.anim & ANIM_MASK ) ) + { + state->base.frame = 0; + } + + // special case for single frame animations + // this makes sure that we replay any events on the first frame + if ( ( state->numframes == numframes ) && ( numframes < 3 ) ) + state->last_cmd_frame = 0; + + state->driven = driven; + + state->base.anim = newAnimation; + + newAnimation &= ANIM_MASK; + + if ( state->driven ) + { + cgi.Anim_Delta( tikihandle, newAnimation, state->frame_delta ); + VectorScale( state->frame_delta, 1.0f / ( float )numframes, state->frame_delta ); + state->frame_distance = VectorLength( state->frame_delta ); + VectorNormalize( state->frame_delta ); + if ( state->frame_distance < 0.1f ) + { + cgi.DPrintf( "Animation has no delta information, canceling delta.\n" ); + state->driven = qfalse; + } + } + else + { + // reset our frame number so that we start at the beginning of the animation + state->base.frame = 0; + } + + state->has_commands = cgi.Anim_HasCommands( tikihandle, newAnimation ); + + state->numframes = numframes; + + state->base.starttime = time; + + assert( cg.time >= time ); + + state->next_evaluate_time = time + state->time_per_frame; + +#ifndef NDEBUG + if ( state->driven ) + { + CG_AnimationDebugMessage( entnum, "cg.time: %d Entity: %3d Anim: %s(#%i) (%i) driven\n", + cg.time, entnum, cgi.Anim_NameForNum( tikihandle, newAnimation ), newAnimation, state->base.starttime ); + } + else + { + CG_AnimationDebugMessage( entnum, "cg.time: %d Entity: %3d Anim: %s(#%i) (%i) not-driven\n", + cg.time, entnum, cgi.Anim_NameForNum( tikihandle, newAnimation ), newAnimation, state->base.starttime ); + } +#endif + } + +/* +=============== +CG_RunModelAnimation +=============== +*/ +void CG_RunModelAnimation + ( + int tikihandle, + animstate_t * state, + animstate_t * altstate, + int newAnimation, + int animtime, + vec3_t origin, + vec3_t or[ 3 ], + centity_t * cent, + qboolean timecheck + ) + { + int f; + int timedelta; + + // must not be a tiki model + if ( tikihandle < 0 ) + return; + + // debugging tool to get no animations + if ( cg_animSpeed->value == 0 ) + { + state->base.oldframe = state->base.frame = state->base.framelerp = 0; + return; + } + + // see if the animation sequence is switching + if ( newAnimation != state->base.anim ) + { + CG_SetModelAnimation( tikihandle, state, altstate, newAnimation, animtime, origin, cent->currentState.number, timecheck ); + } + + // This is here to bullet proof this proc (prevents possible divide by 0 errors farther down) + + if ( !state->time_per_frame ) + return; + + if ( state->driven ) + { + vec3_t tmp; + vec3_t delta; + float dot; + float delta_length; + + // calculate distance since last time and time elapsed + VectorSubtract( origin, state->last_origin, tmp ); + VectorCopy( origin, state->last_origin ); + timedelta = cg.time - state->last_driven_time; + state->last_driven_time = cg.time; + + // transform the delta into our local coordinate system + delta[ 0 ] = DotProduct( tmp, or[ 0 ] ); + delta[ 1 ] = DotProduct( tmp, or[ 1 ] ); + delta[ 2 ] = DotProduct( tmp, or[ 2 ] ); + + delta_length = VectorNormalize( delta ); + dot = DotProduct( state->frame_delta, delta ); + delta_length *= dot; + + // add our distance along the direction of movement to our current distance + state->current_distance += delta_length; + // if we passed the distance for one frame in the forward direction, switch frames + while ( state->current_distance > state->frame_distance ) + { + state->base.oldanim = state->base.anim & ANIM_MASK; + state->base.oldframe = state->base.frame; + state->base.frame++; + state->current_distance -= state->frame_distance; + if ( state->base.frame >= state->numframes ) + state->base.frame -= state->numframes; + } + // if we passed the distance for one frame in the backwards direction, switch frames + while ( state->current_distance < -state->frame_distance ) + { + state->base.oldanim = state->base.anim & ANIM_MASK; + state->base.oldframe = state->base.frame; + state->base.frame--; + state->current_distance += state->frame_distance; + if ( state->base.frame < 0 ) + state->base.frame += state->numframes; + } + // calculate the lerp for this frame + if ( state->current_distance >= 0 ) + { + state->base.framelerp = ( ( state->frame_distance - state->current_distance ) / state->frame_distance ); + } + else + { + state->base.framelerp = ( ( state->current_distance + state->frame_distance ) / state->frame_distance ); + } + } + else + { + if ( cg.time >= state->next_evaluate_time ) + { + state->next_evaluate_time += state->time_per_frame; + + // calculate the current frame based on the starttime of the animation + timedelta = cg.time - state->base.starttime; + f = timedelta / state->time_per_frame; + + // make sure frame is not negative + if ( f < 0 ) + { + f = 0; + } + + // don't let frame wrap around numframes + if ( f >= state->numframes ) + { + f = state->numframes - 1; + } + +#ifndef NDEBUG + CG_AnimationDebugMessage( cent->currentState.number, "cg.time: %d Entity: %3d anim %s frame %d\n", + cg.time, cent->currentState.number, cgi.Anim_NameForNum( tikihandle, state->base.anim & ANIM_MASK ), f ); +#endif + state->base.oldframe = state->base.frame; + state->base.oldanim = state->base.anim & ANIM_MASK; + + state->base.frame = f; + } + + state->base.framelerp = 1.0f - ( float )( cg.time - state->base.starttime - ( state->base.frame * state->time_per_frame ) ) / ( float )state->time_per_frame; + + if ( state->base.framelerp < 0 ) + { + state->base.framelerp = 0; + } + } + + if ( state->crossblend_totaltime ) + { + state->crossblend_lerp = ( float )( cg.time - state->crossblend.starttime ) / ( float )state->crossblend_totaltime; + if ( state->crossblend_lerp < 0 ) + { + state->crossblend_lerp = 0; + } + if ( state->crossblend_lerp > 1.0f ) + { + // < 0 means no crossfade + state->crossblend_lerp = -1.0f; + } + } + else + { + // < 0 means no crossfade + state->crossblend_lerp = -1.0f; + } + } + + +/* +=============== +CG_ClearModelAnimation +=============== +*/ +void CG_ClearModelAnimation( int tikihandle, animstate_t * state, int animationNumber, int time, vec3_t origin, int entnum ) + { + memset( &state->base, 0, sizeof( state->base ) ); + if ( tikihandle >= 0 ) + { + CG_SetModelAnimation( tikihandle, state, state, animationNumber, time, origin, entnum, qtrue ); + // + // we set this hear to prevent unwanted crossfading when we first start + // + // set the oldanim + state->base.oldanim = state->base.anim; + // set the oldframe + state->base.oldframe = state->base.frame; + } + + memset( &state->crossblend, 0, sizeof( state->crossblend ) ); + state->crossblend.starttime = time; + state->crossblend_totaltime = 0; + state->crossblend_lerp = -1.0f; + + state->last_cmd_anim = state->last_cmd_frame = state->last_cmd_time = 0; + } + +/* +====================== +CG_AttachEntity + +Modifies the entities position and axis by the given +tag location +====================== +*/ +void CG_AttachEntity( refEntity_t *entity, refEntity_t *parent, int tikihandle, int tagnum, qboolean use_angles, vec3_t attach_offset ) + { + int i; + orientation_t or; + vec3_t tempAxis[3]; + + // lerp the tag + if ( r_lerpmodels->integer ) + { + or = cgi.Tag_LerpedOrientation( tikihandle, parent, tagnum ); + } + else + { + //FIXME + // doesn't handle torso animations + or = cgi.Tag_Orientation + ( + tikihandle, + parent->anim, + parent->frame, + tagnum, + parent->scale, + parent->bone_tag, + parent->bone_quat + ); + } + //cgi.Printf( "th = %d %.2f %.2f %.2f\n", tikihandle, or.origin[ 0 ], or.origin[ 1 ], or.origin[ 2 ] ); + + VectorCopy( parent->origin, entity->origin ); + + for ( i = 0 ; i < 3 ; i++ ) + { + VectorMA( entity->origin, or.origin[i], parent->axis[i], entity->origin ); + } + + VectorCopy( entity->origin, entity->oldorigin ); + + VectorAdd( entity->origin, attach_offset, entity->origin ); + + if ( use_angles ) + { + MatrixMultiply( entity->axis, parent->axis, tempAxis ); + MatrixMultiply( or.axis, tempAxis, entity->axis ); + } + + entity->scale *= parent->scale; + entity->renderfx |= ( parent->renderfx & ~( RF_FLAGS_NOT_INHERITED | RF_LIGHTING_ORIGIN ) ); + entity->shadowPlane = parent->shadowPlane; + VectorCopy( parent->lightingOrigin, entity->lightingOrigin ); + } + +void CG_ModelAnim + ( + centity_t *cent + ) + + { + entityState_t *s1; + refEntity_t model; + int thandle; + int i; + qboolean dolegs; + qboolean dotorso; + + memset( &model, 0, sizeof(model) ); + + s1 = ¢->currentState; + + // add loop sound only if it is not attached + if ( s1->loopSound && ( s1->parent == ENTITYNUM_NONE ) ) + { + cgi.S_AddLoopingSound( cent->lerpOrigin, vec3_origin, cgs.sound_precache[s1->loopSound], s1->loopSoundVolume, s1->loopSoundMinDist ); + } + if ( cent->tikiLoopSound && ( s1->parent == ENTITYNUM_NONE ) ) + cgi.S_AddLoopingSound( cent->lerpOrigin, vec3_origin, cent->tikiLoopSound, cent->tikiLoopSoundVolume, cent->tikiLoopSoundMinDist ); + + // if set to invisible, skip + if ( !s1->modelindex ) + { + return; + } + + // take the results of CL_InterpolateEntities + VectorCopy( cent->lerpOrigin, model.origin); + VectorCopy( cent->lerpOrigin, model.oldorigin); + + // convert angles to axis + AnglesToAxis( cent->lerpAngles, model.axis ); + + // set the entity number + model.entityNumber = s1->number; + + // copy shader specific data + model.shader_data[ 0 ] = s1->tag_num; + model.shader_data[ 1 ] = s1->skinNum; + + // set and lerp the bone controllers + model.useAngles = qfalse; + for( i = 0; i < NUM_BONE_CONTROLLERS; i++ ) + { + model.bone_tag[ i ] = s1->bone_tag[ i ]; + if ( model.bone_tag[ i ] >= 0 ) + { + model.useAngles = qtrue; + if ( ( cent->interpolate ) && ( cent->nextState.bone_tag[ i ] == cent->currentState.bone_tag[ i ] ) ) + { + SlerpQuaternion( cent->currentState.bone_quat[ i ], cent->nextState.bone_quat[ i ], + cg.frameInterpolation, model.bone_quat[ i ] ); + } + else + { + model.bone_quat[ i ][ 0 ] = s1->bone_quat[ i ][ 0 ]; + model.bone_quat[ i ][ 1 ] = s1->bone_quat[ i ][ 1 ]; + model.bone_quat[ i ][ 2 ] = s1->bone_quat[ i ][ 2 ]; + model.bone_quat[ i ][ 3 ] = s1->bone_quat[ i ][ 3 ]; + } + } + } + + // Interpolated state variables + if ( cent->interpolate ) + { + model.scale = s1->scale + cg.frameInterpolation * ( cent->nextState.scale - s1->scale ); + } + else + { + model.scale = s1->scale; + } + +#if 0 + if ( s1->parent != ENTITYNUM_NONE ) + { + refEntity_t *parent; + int tikihandle; + + parent = cgi.R_GetRenderEntity( s1->parent ); + + if ( !parent ) + { + cgi.DPrintf( "CG_ModelAnim: Could not find parent entity\n" ); + return; + } + + tikihandle = cgi.TIKI_GetHandle( parent->hModel ); + CG_AttachEntity( &model, parent, tikihandle, s1->tag_num & TAG_MASK, s1->attach_use_angles, s1->attach_offset ); + + if ( s1->loopSound ) + { + cgi.S_AddLoopingSound( model.origin, vec3_origin, cgs.sound_precache[s1->loopSound], s1->loopSoundVolume, s1->loopSoundMinDist ); + } + if ( cent->tikiLoopSound ) + cgi.S_AddLoopingSound( cent->lerpOrigin, vec3_origin, cent->tikiLoopSound, cent->tikiLoopSoundVolume, cent->tikiLoopSoundMinDist ); + } +#endif + + // + // add the model + // + thandle = cgs.model_tiki[ s1->modelindex ]; + + dolegs = ( s1->anim & ANIM_BLEND ); + dotorso = ( s1->torso_anim & ANIM_BLEND ); + + if ( !dolegs && !dotorso ) + { + // always do a leg anim if we don't have a torso + dolegs = qtrue; + } + + if ( dolegs ) + { + model.uselegs = qtrue; + + if ( ( thandle == -1 ) || ( s1->frame & FRAME_EXPLICIT ) ) + { + // explicit frame + model.anim = model.oldanim = s1->anim & ANIM_MASK; + model.frame = model.oldframe = s1->frame & FRAME_MASK; + model.backlerp = 0; + + // < 0 means no crossfade + model.crossblend_lerp = -1.0f; + + } + else + { + // run the animation + CG_RunModelAnimation + ( + thandle, + ¢->am, + ¢->torso_am, + s1->anim, + cg.snap->serverTime, + cent->lerpOrigin, + model.axis, + cent, + qtrue + ); + + model.anim = cent->am.base.anim & ANIM_MASK; + model.frame = cent->am.base.frame; + + model.oldanim = cent->am.base.oldanim & ANIM_MASK; + model.oldframe = cent->am.base.oldframe; + model.backlerp = cent->am.base.framelerp; + + model.crossblend_anim = cent->am.crossblend.anim & ANIM_MASK; + model.crossblend_frame = cent->am.crossblend.frame; + model.crossblend_oldframe = cent->am.crossblend.oldframe; + model.crossblend_backlerp = cent->am.crossblend.framelerp; + model.crossblend_lerp = cent->am.crossblend_lerp; + +#if 0 + cgi.DPrintf( "Crossblending to Legs Anim: %s from %s\n", cgi.Anim_NameForNum( thandle, model.anim ), + cgi.Anim_NameForNum( thandle, model.crossblend_anim ) + ); +#endif + + } + } + + // + // add the torso animation + // + if ( dotorso ) + { + int flags = cgi.Anim_Flags( thandle, cent->torso_am.base.anim & ANIM_MASK ); + + model.usetorso = qtrue; + + // if we're just switching to a torso animation and we don't have a crossblend going, + // set the crossblend to be from the base animation + if ( + !( cent->torso_am.base.anim & ANIM_BLEND ) && + ( ( ( cg.time - cent->torso_am.crossblend.starttime ) >= cent->torso_am.crossblend_totaltime ) || ( flags & MDL_ANIM_NO_TIMECHECK ) ) + ) + { + cent->torso_am.crossblend = cent->am.crossblend; + } + + // if we have a torso anim, we explicitly set the current anim and let CG_RunModelAnimation handle crossblending + if ( ( thandle == -1 ) || s1->torso_frame & FRAME_EXPLICIT ) + { + // explicit frame + model.torso_anim = model.torso_oldanim = s1->torso_anim & ANIM_MASK; + model.torso_frame = model.torso_oldframe = s1->torso_frame & FRAME_MASK; + model.torso_backlerp = 0; + + // < 0 means no crossfade + model.torso_crossblend_lerp = -1.0f; + } + else + { + // run the animation + CG_RunModelAnimation + ( + thandle, + ¢->torso_am, + ¢->am, + s1->torso_anim, + cg.snap->serverTime, + cent->lerpOrigin, + model.axis, + cent, + qfalse + ); + + model.torso_anim = cent->torso_am.base.anim & ANIM_MASK; + model.torso_frame = cent->torso_am.base.frame; + model.torso_oldanim = cent->torso_am.base.oldanim & ANIM_MASK; + model.torso_oldframe = cent->torso_am.base.oldframe; + model.torso_backlerp = cent->torso_am.base.framelerp; + + model.torso_crossblend_anim = cent->torso_am.crossblend.anim & ANIM_MASK; + model.torso_crossblend_frame = cent->torso_am.crossblend.frame; + model.torso_crossblend_oldframe = cent->torso_am.crossblend.oldframe; + model.torso_crossblend_backlerp = cent->torso_am.crossblend.framelerp; + model.torso_crossblend_lerp = cent->torso_am.crossblend_lerp; + } + +#if 0 + cgi.DPrintf( "Animating Torso: %s from %s\n", cgi.Anim_NameForNum( thandle, model.torso_anim ), + cgi.Anim_NameForNum( thandle, model.torso_crossblend_anim ) + ); +#endif + + } + else + { + // we don't have a torso anim, so crossblend from whatever the torso is currently doing +#if 1 + if ( + ( cent->torso_am.base.anim & ANIM_BLEND ) // This is a hack for the torso, don't do any crossblend time checking + ) +#else + if ( + ( cent->torso_am.base.anim & ANIM_BLEND ) && + ( ( cg.time - cent->torso_am.crossblend.starttime ) >= cent->torso_am.crossblend_totaltime ) + ) +#endif + { + CG_AnimationDebugMessage( cent->currentState.number, "TORSO_AM_BASE: %s\n", cgi.Anim_NameForNum( thandle, cent->torso_am.base.anim & ANIM_MASK ) ); + +#if 0 + cgi.DPrintf( "TORSO_AM_BASE: %s\n", cgi.Anim_NameForNum( thandle, cent->torso_am.base.anim & ANIM_MASK ) ); +#endif + + // only crossblend when the previous torso anim has it's flag set. + // set the crossblend information directly from the current animation + cent->torso_am.crossblend = cent->torso_am.base; + cent->torso_am.crossblend.starttime = cg.snap->serverTime; + cent->torso_am.crossblend_totaltime = cgi.Anim_CrossblendTime( thandle, cent->torso_am.crossblend.anim & ANIM_MASK ); + + // clear out the torso flag so that we only copy this when the torso animation goes away and there's no crossblending + cent->torso_am.base.anim &= ~ANIM_BLEND; + } + + // only set the torso information if we're crossblending from an anim + if ( ( cg.time - cent->torso_am.crossblend.starttime ) <= cent->torso_am.crossblend_totaltime ) + { + if ( cent->torso_am.crossblend_totaltime ) + { + cent->torso_am.crossblend_lerp = ( float )( cg.time - cent->torso_am.crossblend.starttime ) / + ( float )cent->torso_am.crossblend_totaltime; + if ( cent->torso_am.crossblend_lerp < 0 ) + { + cent->torso_am.crossblend_lerp = 0; + } + if ( cent->torso_am.crossblend_lerp > 1.0f ) + { + // < 0 means no crossfade + cent->torso_am.crossblend_lerp = -1.0f; + } + } + else + { + // < 0 means no crossfade + cent->torso_am.crossblend_lerp = -1.0f; + } + + model.usetorso = qtrue; + + model.torso_crossblend_anim = cent->torso_am.crossblend.anim & ANIM_MASK; + model.torso_crossblend_frame = cent->torso_am.crossblend.frame; + model.torso_crossblend_oldframe = cent->torso_am.crossblend.oldframe; + model.torso_crossblend_backlerp = cent->torso_am.crossblend.framelerp; + model.torso_crossblend_lerp = cent->torso_am.crossblend_lerp; + + // this isn't set if we don't have a leg anim + if ( s1->anim & ANIM_BLEND ) + { + model.torso_anim = model.anim; + model.torso_frame = model.frame; + model.torso_oldanim = model.oldanim; + model.torso_oldframe = model.oldframe; + model.torso_backlerp = model.backlerp; + } + else + { + // put in some valid frame info + model.torso_anim = model.torso_crossblend_anim; + model.torso_frame = model.torso_crossblend_frame; + model.torso_oldanim = model.torso_crossblend_anim; + model.torso_oldframe = model.torso_crossblend_oldframe; + model.torso_backlerp = model.torso_crossblend_backlerp; + } +#if 0 + cgi.DPrintf( "Crossblending to Torso Anim: %s from %s\n", cgi.Anim_NameForNum( thandle, model.torso_anim ), + cgi.Anim_NameForNum( thandle, model.torso_crossblend_anim ) + ); +#endif + } + } + + // if we don't have a leg anim + if ( !dolegs ) + { + // we don't have a leg anim, so crossblend from whatever the leg is currently doing + if ( + ( cent->am.base.anim & ANIM_BLEND ) && + ( ( cg.time - cent->am.crossblend.starttime ) >= cent->am.crossblend_totaltime ) + ) + { + // only crossblend when the previous leg anim has it's flag set. + // set the crossblend information directly from the current animation + cent->am.crossblend = cent->am.base; + cent->am.crossblend.starttime = cg.snap->serverTime; + cent->am.crossblend_totaltime = cgi.Anim_CrossblendTime( thandle, cent->am.crossblend.anim & ANIM_MASK ); + + // clear out the leg flag so that we only copy this when the leg animation goes away and there's no crossblending + cent->am.base.anim &= ~ANIM_BLEND; + } + + // only set the leg information if we're crossblending from an anim + if ( ( cg.time - cent->am.crossblend.starttime ) <= cent->am.crossblend_totaltime ) + { + if ( cent->am.crossblend_totaltime ) + { + cent->am.crossblend_lerp = ( float )( cg.time - cent->am.crossblend.starttime ) / + ( float )cent->am.crossblend_totaltime; + if ( cent->am.crossblend_lerp < 0 ) + { + cent->am.crossblend_lerp = 0; + } + if ( cent->am.crossblend_lerp > 1.0f ) + { + // < 0 means no crossfade + cent->am.crossblend_lerp = -1.0f; + } + } + else + { + // < 0 means no crossfade + cent->am.crossblend_lerp = -1.0f; + } + + model.uselegs = qtrue; + + model.crossblend_anim = cent->am.crossblend.anim & ANIM_MASK; + model.crossblend_frame = cent->am.crossblend.frame; + model.crossblend_oldframe = cent->am.crossblend.oldframe; + model.crossblend_backlerp = cent->am.crossblend.framelerp; + model.crossblend_lerp = cent->am.crossblend_lerp; + + model.anim = model.torso_anim; + model.frame = model.torso_frame; + model.oldanim = model.torso_oldanim; + model.oldframe = model.torso_oldframe; + model.backlerp = model.torso_backlerp; + } + } + + if ( s1->parent != ENTITYNUM_NONE ) + { + refEntity_t *parent; + int tikihandle; + + parent = cgi.R_GetRenderEntity( s1->parent ); + + if ( !parent ) + { + cgi.DPrintf( "CG_ModelAnim: Could not find parent entity\n" ); + return; + } + + tikihandle = cgi.TIKI_GetHandle( parent->hModel ); + CG_AttachEntity( &model, parent, tikihandle, s1->tag_num & TAG_MASK, s1->attach_use_angles, s1->attach_offset ); + + if ( s1->loopSound ) + { + cgi.S_AddLoopingSound( model.origin, vec3_origin, cgs.sound_precache[s1->loopSound], s1->loopSoundVolume, s1->loopSoundMinDist ); + } + if ( cent->tikiLoopSound ) + cgi.S_AddLoopingSound( model.origin, vec3_origin, cent->tikiLoopSound, cent->tikiLoopSoundVolume, cent->tikiLoopSoundMinDist ); + } + + // set skin + model.skinNum = s1->skinNum; + model.renderfx |= s1->renderfx; + model.customSkin = 0; + model.hModel = cgs.model_draw[s1->modelindex]; + + for( i=0; i<3; i++ ) + { + model.shaderRGBA[i] = cent->color[i] * 255; + } + model.shaderRGBA[3] = s1->alpha * 255; + + // set surfaces + memcpy( model.surfaces, s1->surfaces, MAX_MODEL_SURFACES ); + + // get the player model information + if ( + !( s1->renderfx & RF_DONTDRAW ) && + ( model.renderfx & RF_SHADOW ) && + !( model.renderfx & RF_DEPTHHACK ) && + !( ( s1->number == cg.snap->ps.clientNum ) && ( !cg_3rd_person->integer ) ) + ) + { + qboolean shadow; + + // add the shadow + shadow = CG_EntityShadow( cent, &model ); + if ( + shadow && + ( cg_shadows->integer == 3 ) && + ( model.renderfx & RF_SHADOW_PRECISE ) + ) + { + model.renderfx |= RF_SHADOW_PLANE; + } + } + + if ( s1->eFlags & ( EF_LEFT_TARGETED | EF_RIGHT_TARGETED ) ) + { + CG_EntityTargeted( thandle, cent, &model ); + } + + if ( s1->number == cg.snap->ps.clientNum ) + { + if (!cg_3rd_person->integer) + model.renderfx |= RF_THIRD_PERSON; // In 1st person, only draw self in mirrors + } + + if ( model.renderfx & RF_SKYORIGIN ) + { + memcpy( cg.sky_axis, model.axis, sizeof( cg.sky_axis ) ); + VectorCopy( model.origin, cg.sky_origin ); + } + + if ( s1->eFlags & EF_ANTISBJUICE ) + { + model.customShader = cgi.R_RegisterShader( "antisuckshader" ); + model.renderfx |= RF_CUSTOMSHADERPASS; + } + + if ( !( s1->renderfx & RF_DONTDRAW ) ) + { + // add to refresh list + cgi.R_AddRefEntityToScene( &model ); + } + + // Run any client frame commands + if ( thandle != -1 ) + { + // update any emitter's... + CG_UpdateEntity( thandle, &model, cent ); + + CG_ClientCommands + ( + thandle, + model.frame, + model.anim, + ¢->am, + &model, + cent + ); + + if ( s1->torso_anim & ANIM_BLEND ) + { + // Run any client frame commands + CG_ClientCommands + ( + thandle, + model.torso_frame, + model.torso_anim, + ¢->torso_am, + &model, + cent + ); + } + } + } diff --git a/source/source/cgame/cg_player.cpp b/source/source/cgame/cg_player.cpp new file mode 100644 index 0000000..e89dec3 --- /dev/null +++ b/source/source/cgame/cg_player.cpp @@ -0,0 +1,102 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/cgame/cg_player.cpp $ +// $Revision:: 13 $ +// $Author:: Steven $ +// $Date:: 6/01/00 12:21p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/cgame/cg_player.cpp $ +// +// 13 6/01/00 12:21p Steven +// Improvement to splashes. +// +// 12 5/11/00 11:08a Steven +// Added water ripple stuff. +// +// 11 1/27/00 9:06a Markd +// Added watermark +// +// 10 10/29/99 6:52p Jimdose +// moved torso and head angles to player.cpp +// +// 9 10/27/99 12:18p Markd +// added smooth camera lerping +// +// 8 10/25/99 12:20p Jimdose +// made head and torso angles local to each entity +// +// 7 10/19/99 7:52p Markd +// Removed three part model system +// +// 6 10/14/99 4:52p Jimdose +// added head_angles and torso_angles to refdef_t +// +// 5 10/05/99 6:01p Aldie +// Added headers +// +// DESCRIPTION: +// Player functions for the cgame + +#include "cg_local.h" +#include "cg_commands.h" + +/* + +player entities generate a great deal of information from implicit ques +taken from the entityState_t + +*/ + +//===================================================================== + +/* +=============== +CG_ResetPlayerEntity + +A player just came into view or teleported, so reset all animation info +=============== +*/ +void CG_ResetPlayerEntity( centity_t *cent ) + { + cent->errorTime = -99999; // guarantee no error decay added + cent->extrapolated = qfalse; + + VectorCopy( cent->currentState.origin, cent->lerpOrigin ); + VectorCopy( cent->lerpOrigin, cent->rawOrigin ); + + VectorCopy( cent->currentState.angles, cent->lerpAngles ); + VectorCopy( cent->lerpAngles, cent->rawAngles ); + + if ( cent->currentState.number == cg.snap->ps.clientNum ) + { + // initialize the camera position + VectorCopy( cent->lerpOrigin, cg.currentViewPos ); + // initialize the camera angles + VectorCopy( cent->lerpAngles, cg.currentViewAngles ); + // setup the lastCameraTime + cg.lastCameraTime = -1; + // setup the lerpCameraTime + cg.lerpCameraTime = 0; + // clear the cameraView flag + cg.inCameraView = qfalse; + } + + // Reset splash info + cent->splash_still_count = 0; + } + +/* +=============== +CG_Player +=============== +*/ +void CG_Player( centity_t *cent ) + { + //CG_PlayerSplash( cent ); + } diff --git a/source/source/cgame/cg_playerstate.c b/source/source/cgame/cg_playerstate.c new file mode 100644 index 0000000..ae7a52d --- /dev/null +++ b/source/source/cgame/cg_playerstate.c @@ -0,0 +1,38 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/cgame/cg_playerstate.c $ +// $Revision:: 2 $ +// $Author:: Aldie $ +// $Date:: 10/05/99 6:01p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/cgame/cg_playerstate.c $ +// +// 2 10/05/99 6:01p Aldie +// Added headers +// +// DESCRIPTION: +// +// this file acts on changes in a new playerState_t. +// With normal play, this will be done after local prediction, but when +// following another player or playing back a demo, it will be checked +// when the snapshot transitions like all the other entities + +#include "cg_local.h" + +/* +=============== +CG_TransitionPlayerState + +=============== +*/ +void CG_TransitionPlayerState( playerState_t *ps, playerState_t *ops ) + { + + } + diff --git a/source/source/cgame/cg_predict.c b/source/source/cgame/cg_predict.c new file mode 100644 index 0000000..dd87ec0 --- /dev/null +++ b/source/source/cgame/cg_predict.c @@ -0,0 +1,702 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/cgame/cg_predict.c $ +// $Revision:: 33 $ +// $Author:: Markd $ +// $Date:: 7/10/00 11:54p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/cgame/cg_predict.c $ +// +// 33 7/10/00 11:54p Markd +// added exit level code +// +// 32 6/25/00 11:21a Markd +// fixed slime code for player +// +// 31 6/14/00 12:14p Markd +// more intel compiler bug fixes +// +// 30 6/08/00 9:14p Markd +// improved player prediction model +// +// 29 6/03/00 10:55a Markd +// Sped up tracing and debug print messages +// +// 28 5/16/00 6:24p Markd +// added cg_traceinfo support +// +// 27 5/16/00 4:25p Steven +// Made entities use CONTENTS_BODY instead of CONTENTS_BODY and CONTENTS_SOLID. +// +// 26 5/11/00 11:08a Steven +// Made sure trypush is NULL on client side. +// +// 25 4/28/00 3:30p Steven +// If a trace started in a solid made sure the world is set as the entitynum +// +// 24 4/21/00 9:30a Markd +// fixed camera fov problems +// +// 23 4/20/00 5:38p Markd +// fixed fov lerping bug, I introduced yesterday +// +// 22 4/19/00 2:38p Markd +// fixed lerping bug +// +// 21 3/31/00 11:49a Markd +// Added contents support to TempBbox models +// +// 20 2/15/00 8:47p Jimdose +// fixed animation frames and delta sync problem +// +// 19 2/01/00 11:25a Markd +// Fixed up camera cutting so that there are no more false origin issues +// +// 18 1/27/00 11:35a Markd +// Fixed solid/notsolid client side entities +// +// 17 1/12/00 8:01p Markd +// Added nextFrameCameraCut variable for cameras +// +// 16 12/11/99 3:37p Markd +// q3a gold checkin, first time +// +// 15 11/29/99 6:32p Aldie +// Lots of changes for ammo system +// +// 14 11/05/99 11:18a Aldie +// Fixed fov bug with Mark +// +// 13 11/04/99 3:18p Markd +// fixed fov lerping +// +// 12 11/04/99 10:03a Markd +// complete overhaul of the camera system +// +// 11 10/27/99 4:31p Markd +// Fixed all camera prediction and smmoth lerping issues +// +// 10 10/12/99 6:56p Markd +// Fixed some player interpolation bugs and also interpolated camera +// +// 9 10/12/99 2:23p Markd +// Rewrote camera and player movetype system +// +// 8 10/08/99 2:10p Markd +// Added PM_LOCKVIEW for when playerstate should just be predicted +// +// 7 10/05/99 6:01p Aldie +// Added headers +// +// DESCRIPTION: +// this file generates cg.predicted_player_state by either +// interpolating between snapshots from the server or locally predicting +// ahead the client's movement. It also handles local physics interaction, +// like fragments bouncing off walls + +#include "cg_local.h" + +static pmove_t cg_pmove; + +static int cg_numSolidEntities; +static centity_t *cg_solidEntities[MAX_ENTITIES_IN_SNAPSHOT]; +static int cg_numTriggerEntities; +//static centity_t *cg_triggerEntities[MAX_ENTITIES_IN_SNAPSHOT]; + +/* +==================== +CG_BuildSolidList + +When a new cg.snap has been set, this function builds a sublist +of the entities that are actually solid, to make for more +efficient collision detection +==================== +*/ +void CG_BuildSolidList( void ) + { + int i; + centity_t *cent; + snapshot_t *snap; + entityState_t *ent; + + cg_numSolidEntities = 0; + cg_numTriggerEntities = 0; + + if ( cg.nextSnap && !cg.nextFrameTeleport && !cg.thisFrameTeleport ) + { + snap = cg.nextSnap; + } + else + { + snap = cg.snap; + } + + for ( i = 0 ; i < snap->numEntities ; i++ ) + { + cent = &cg_entities[ snap->entities[ i ].number ]; + ent = ¢->currentState; + + if ( ent->eType == ET_ITEM || ent->eType == ET_PUSH_TRIGGER || ent->eType == ET_TELEPORT_TRIGGER ) + { + /* + cg_triggerEntities[cg_numTriggerEntities] = cent; + cg_numTriggerEntities++; + */ + continue; + } + + if ( cent->nextState.solid ) + { + cg_solidEntities[cg_numSolidEntities] = cent; + cg_numSolidEntities++; + continue; + } + } + } + +/* +==================== +CG_ClipMoveToEntities + +==================== +*/ +static void CG_ClipMoveToEntities + ( + const vec3_t start, + const vec3_t mins, + const vec3_t maxs, + const vec3_t end, + int skipNumber, + int mask, + trace_t *tr, + qboolean cylinder + ) + + { + int i; + trace_t trace; + entityState_t *ent; + clipHandle_t cmodel; + vec3_t bmins, bmaxs; + vec3_t origin, angles; + centity_t *cent; + + for ( i = 0 ; i < cg_numSolidEntities ; i++) + { + cent = cg_solidEntities[ i ]; + ent = ¢->currentState; + + if ( ent->number == skipNumber ) + continue; + + if ( ent->solid == SOLID_BMODEL ) + { + // special value for bmodel + cmodel = cgi.CM_InlineModel( ent->modelindex ); + if ( !cmodel ) + continue; + VectorCopy( cent->lerpAngles, angles ); + VectorCopy( cent->lerpOrigin, origin ); + } + else + { + IntegerToBoundingBox( ent->solid, bmins, bmaxs ); + cmodel = cgi.CM_TempBoxModel( bmins, bmaxs, CONTENTS_BODY ); //CONTENTS_SOLID | CONTENTS_BODY ); + VectorCopy( vec3_origin, angles ); + VectorCopy( cent->lerpOrigin, origin ); + } + + cgi.CM_TransformedBoxTrace( &trace, start, end, mins, maxs, cmodel, mask, origin, angles, cylinder ); + + if (trace.allsolid || trace.fraction < tr->fraction) + { + trace.entityNum = ent->number; + *tr = trace; + } + else if (trace.startsolid) + { + tr->startsolid = qtrue; + } + } + } + +void CG_ShowTrace + ( + trace_t *trace, + int passent, + const char *reason + ) + + { + char text[ 1024 ]; + + assert( reason ); + assert( trace ); + + sprintf( text, "%0.2f : Pass (%d) Frac %f Hit (%d): '%s'\n", + ( float )cg.time / 1000.0f, passent, trace->fraction, trace->entityNum, reason ? reason : "" ); + + if ( cg_traceinfo->integer == 3 ) + { + cgi.DebugPrintf( text ); + } + else + { + cgi.DPrintf( text ); + } + } + +/* +================ +CG_Trace +================ +*/ +void CG_Trace + ( + trace_t *result, + const vec3_t start, + const vec3_t mins, + const vec3_t maxs, + const vec3_t end, + int skipNumber, + int mask, + qboolean cylinder, + qboolean cliptoentities, + const char * description + ) + + { + trace_t t; + + cgi.CM_BoxTrace ( &t, start, end, mins, maxs, 0, mask, cylinder ); + t.entityNum = t.fraction != 1.0 ? ENTITYNUM_WORLD : ENTITYNUM_NONE; + + // If starting in a solid make sure the world is set as the entitynum + + if ( t.startsolid ) + t.entityNum = ENTITYNUM_WORLD; + + if ( cliptoentities ) + { + // check all other solid models + CG_ClipMoveToEntities(start, mins, maxs, end, skipNumber, mask, &t, cylinder ); + } + + *result = t; + + if ( cg_traceinfo->integer ) + { + CG_ShowTrace( result, skipNumber, description ); + } + } + +/* +================ +CG_PlayerTrace +================ +*/ +void CG_PlayerTrace + ( + trace_t *result, + const vec3_t start, + const vec3_t mins, + const vec3_t maxs, + const vec3_t end, + int skipNumber, + int mask, + qboolean cylinder + ) + + { + CG_Trace( result, start, mins, maxs, end, skipNumber, mask, cylinder, qtrue, "PlayerTrace" ); + } + +/* +================ +CG_PointContents +================ +*/ +int CG_PointContents( const vec3_t point, int passEntityNum ) { + int i; + entityState_t *ent; + centity_t *cent; + clipHandle_t cmodel; + int contents; + + contents = cgi.CM_PointContents (point, 0); + + for ( i = 0 ; i < cg_numSolidEntities ; i++ ) { + cent = cg_solidEntities[ i ]; + + ent = ¢->currentState; + + if ( ent->number == passEntityNum ) { + continue; + } + + if (ent->solid != SOLID_BMODEL) { // special value for bmodel + continue; + } + + cmodel = cgi.CM_InlineModel( ent->modelindex ); + if ( !cmodel ) { + continue; + } + + contents |= cgi.CM_TransformedPointContents( point, cmodel, ent->origin, ent->angles ); + } + + return contents; +} + + +/* +======================== +CG_InterpolatePlayerStateCamera + +Generates cg.predicted_player_state by interpolating between +cg.snap->player_state and cg.nextFrame->player_state +======================== +*/ +static void CG_InterpolatePlayerStateCamera( void ) + { + float f; + int i; + snapshot_t *prev, *next; + + prev = cg.snap; + next = cg.nextSnap; + + // + // copy in the current ones if nothing else + // + VectorCopy( cg.predicted_player_state.camera_angles, cg.camera_angles ); + VectorCopy( cg.predicted_player_state.camera_origin, cg.camera_origin ); + cg.camera_fov = cg.predicted_player_state.fov; + + // if the next frame is a teleport, we can't lerp to it + if ( cg.nextFrameCameraCut ) + { + return; + } + + if ( + !next || + next->serverTime <= prev->serverTime + ) + { + return; + } + + f = (float)( cg.time - prev->serverTime ) / ( next->serverTime - prev->serverTime ); + + // interpolate fov + cg.camera_fov = prev->ps.fov + f * ( next->ps.fov - prev->ps.fov ); + + if ( !( cg.snap->ps.pm_flags & PMF_CAMERA_VIEW ) ) + { + return; + } + + for ( i = 0 ; i < 3 ; i++ ) + { + cg.camera_origin[i] = prev->ps.camera_origin[i] + f * (next->ps.camera_origin[i] - prev->ps.camera_origin[i] ); + cg.camera_angles[i] = LerpAngle( prev->ps.camera_angles[i], next->ps.camera_angles[i], f ); + } + } + +/* +======================== +CG_InterpolatePlayerState + +Generates cg.predicted_player_state by interpolating between +cg.snap->player_state and cg.nextFrame->player_state +======================== +*/ +static void CG_InterpolatePlayerState( qboolean grabAngles ) { + float f; + int i; + playerState_t *out; + snapshot_t *prev, *next; + + out = &cg.predicted_player_state; + prev = cg.snap; + next = cg.nextSnap; + + *out = cg.snap->ps; + + // interpolate the camera if necessary + CG_InterpolatePlayerStateCamera(); + + // if we are still allowing local input, short circuit the view angles + if ( grabAngles ) { + usercmd_t cmd; + int cmdNum; + + cmdNum = cgi.GetCurrentCmdNumber(); + cgi.GetUserCmd( cmdNum, &cmd ); + + PM_UpdateViewAngles( out, &cmd ); + } + + // if the next frame is a teleport, we can't lerp to it + if ( cg.nextFrameTeleport ) { + return; + } + + if ( !next || next->serverTime <= prev->serverTime ) { + return; + } + + f = cg.frameInterpolation; + + i = next->ps.bobCycle; + if ( i < prev->ps.bobCycle ) { + i += 256; // handle wraparound + } + out->bobCycle = prev->ps.bobCycle + f * ( i - prev->ps.bobCycle ); + + for ( i = 0 ; i < 3 ; i++ ) { + out->origin[i] = prev->ps.origin[i] + f * (next->ps.origin[i] - prev->ps.origin[i] ); + if ( !grabAngles ) { + out->viewangles[i] = LerpAngle( + prev->ps.viewangles[i], next->ps.viewangles[i], f ); + } + out->velocity[i] = prev->ps.velocity[i] + + f * (next->ps.velocity[i] - prev->ps.velocity[i] ); + } + +} + +/* +================= +CG_PredictPlayerState + +Generates cg.predicted_player_state for the current cg.time +cg.predicted_player_state is guaranteed to be valid after exiting. + +For demo playback, this will be an interpolation between two valid +playerState_t. + +For normal gameplay, it will be the result of predicted usercmd_t on +top of the most recent playerState_t received from the server. + +Each new snapshot will usually have one or more new usercmd over the last, +but we simulate all unacknowledged commands each time, not just the new ones. +This means that on an internet connection, quite a few pmoves may be issued +each frame. + +OPTIMIZE: don't re-simulate unless the newly arrived snapshot playerState_t +differs from the predicted one. Would require saving all intermediate +playerState_t during prediction. + +We detect prediction errors and allow them to be decayed off over several frames +to ease the jerk. +================= +*/ +void CG_PredictPlayerState( void ) { + int cmdNum, current; + playerState_t oldPlayerState; + qboolean moved; + usercmd_t oldestCmd; + usercmd_t latestCmd; + + cg.hyperspace = qfalse; // will be set if touching a trigger_teleport + + // if this is the first frame we must guarantee + // predicted_player_state is valid even if there is some + // other error condition + if ( !cg.validPPS ) { + cg.validPPS = qtrue; + cg.predicted_player_state = cg.snap->ps; + } + + // demo playback just copies the moves + if ( + cg.demoPlayback || + ( cg.snap->ps.pm_flags & PMF_NO_PREDICTION ) || + ( cg.snap->ps.pm_flags & PMF_FROZEN ) + ) + { + CG_InterpolatePlayerState( qfalse ); + return; + } + + // non-predicting local movement will grab the latest angles + //FIXME + // Noclip is jittery for some reason, so I'm disabling prediction while noclipping + if ( cg_nopredict->integer || cg_syncronousClients->integer || (cg.snap->ps.pm_type == PM_NOCLIP) ) { + CG_InterpolatePlayerState( qtrue ); + return; + } + + // prepare for pmove + cg_pmove.ps = &cg.predicted_player_state; + cg_pmove.trace = CG_PlayerTrace; + cg_pmove.pointcontents = CG_PointContents; + cg_pmove.trypush = NULL; + + if ( cg_pmove.ps->pm_type == PM_DEAD ) + { + cg_pmove.tracemask = MASK_PLAYERSOLID & ~CONTENTS_BODY; + } + else + { + cg_pmove.tracemask = MASK_PLAYERSOLID; + } + + /* FIXME + if ( cg.snap->ps.persistant[PERS_TEAM] == TEAM_SPECTATOR ) + { + cg_pmove.tracemask &= ~CONTENTS_BODY; // spectators can fly through bodies + } + */ + + cg_pmove.noFootsteps = ( cgs.dmflags & DF_NO_FOOTSTEPS ) > 0; + + // save the state before the pmove so we can detect transitions + oldPlayerState = cg.predicted_player_state; + + current = cgi.GetCurrentCmdNumber(); + + // if we don't have the commands right after the snapshot, we + // can't accurately predict a current position, so just freeze at + // the last good position we had + cmdNum = current - CMD_BACKUP + 1; + cgi.GetUserCmd( cmdNum, &oldestCmd ); + if ( oldestCmd.serverTime > cg.snap->ps.commandTime + && oldestCmd.serverTime < cg.time ) { // special check for map_restart + if ( cg_showmiss->integer ) { + cgi.Printf ("exceeded PACKET_BACKUP on commands\n"); + } + + return; + } + + // get the latest command so we can know which commands are from previous map_restarts + cgi.GetUserCmd( current, &latestCmd ); + + // get the most recent information we have, even if + // the server time is beyond our current cg.time, + // because predicted player positions are going to + // be ahead of everything else anyway + if ( cg.nextSnap && !cg.nextFrameTeleport && !cg.thisFrameTeleport ) { + cg.predicted_player_state = cg.nextSnap->ps; + cg.physicsTime = cg.nextSnap->serverTime; + } else { + cg.predicted_player_state = cg.snap->ps; + cg.physicsTime = cg.snap->serverTime; + } + + // run cmds + moved = qfalse; + for ( cmdNum = current - CMD_BACKUP + 1 ; cmdNum <= current ; cmdNum++ ) { + // get the command + cgi.GetUserCmd( cmdNum, &cg_pmove.cmd ); + + // don't do anything if the time is before the snapshot player time + if ( cg_pmove.cmd.serverTime <= cg.predicted_player_state.commandTime ) { + continue; + } + + // don't do anything if the command was from a previous map_restart + if ( cg_pmove.cmd.serverTime > latestCmd.serverTime ) { + continue; + } + + // check for a prediction error from last frame + // on a lan, this will often be the exact value + // from the snapshot, but on a wan we will have + // to predict several commands to get to the point + // we want to compare + if ( cg.predicted_player_state.commandTime == oldPlayerState.commandTime ) { + vec3_t delta; + float len; + + if ( cg.thisFrameTeleport ) { + // a teleport will not cause an error decay + VectorClear( cg.predictedError ); + cg.thisFrameTeleport = qfalse; + if ( cg_showmiss->integer ) { + cgi.Printf( "PredictionTeleport\n" ); + } + } else { + vec3_t adjusted; + + CG_AdjustPositionForMover( cg.predicted_player_state.origin, + cg.predicted_player_state.groundEntityNum, cg.physicsTime, cg.oldTime, adjusted ); + VectorSubtract( oldPlayerState.origin, adjusted, delta ); + len = VectorLength( delta ); + if ( len > 0.1 ) { + if ( cg_showmiss->integer ) { + cgi.Printf("Prediction miss: %f\n", len); + } + if ( cg_errorDecay->integer ) { + int t; + float f; + + t = cg.time - cg.predictedErrorTime; + f = ( cg_errorDecay->value - t ) / cg_errorDecay->value; + if ( f < 0 ) { + f = 0; + } + if ( f > 0 && cg_showmiss->integer ) { + cgi.Printf("Double prediction decay: %f\n", f); + } + VectorScale( cg.predictedError, f, cg.predictedError ); + } else { + VectorClear( cg.predictedError ); + } + VectorAdd( delta, cg.predictedError, cg.predictedError ); + cg.predictedErrorTime = cg.oldTime; + } + } + } + + // if our feet are falling, don't try to move + if ( cg_pmove.ps->feetfalling && ( cg_pmove.waterlevel < 2 ) ) + { + cg_pmove.cmd.forwardmove = 0; + cg_pmove.cmd.rightmove = 0; + } + + Pmove (&cg_pmove); + + moved = qtrue; + + // add push trigger movement effects + //CG_TouchTriggerPrediction(); + } + + if ( cg_showmiss->integer > 1 ) { + cgi.Printf( "[%i : %i] ", cg_pmove.cmd.serverTime, cg.time ); + } + + // interpolate the camera if necessary + CG_InterpolatePlayerStateCamera(); + + // adjust for the movement of the groundentity + CG_AdjustPositionForMover( cg.predicted_player_state.origin, + cg.predicted_player_state.groundEntityNum, + cg.snap->serverTime, cg.time, cg.predicted_player_state.origin ); + + if ( !moved ) { + if ( cg_showmiss->integer ) { + cgi.Printf( "not moved\n" ); + } + return; + } + + // fire events and other transition triggered things + CG_TransitionPlayerState( &cg.predicted_player_state, &oldPlayerState ); + + +} + + diff --git a/source/source/cgame/cg_public.h b/source/source/cgame/cg_public.h new file mode 100644 index 0000000..e54bf38 --- /dev/null +++ b/source/source/cgame/cg_public.h @@ -0,0 +1,422 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/cgame/cg_public.h $ +// $Revision:: 47 $ +// $Author:: Markd $ +// $Date:: 7/16/00 11:01p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/cgame/cg_public.h $ +// +// 47 7/16/00 11:01p Markd +// Added UpdateLoadingScreen call +// +// 46 7/14/00 9:52p Markd +// added global volume dampener on ambient sound effects for cinematics +// +// 45 7/10/00 11:54p Markd +// added exit level code +// +// 44 6/14/00 11:18a Markd +// cleaned up code using Intel compiler +// +// 43 6/09/00 10:27a Markd +// got lagometer and CG_2D operations functioning +// +// 42 6/05/00 3:10p Markd +// Added has_commands check to client side command processing +// +// 41 6/02/00 6:51p Markd +// added better camera look features +// +// 40 5/18/00 12:52p Steven +// Added use_listener to S_UpdateEntity. +// +// 39 3/31/00 11:45a Markd +// Added skyportal toggling support +// +// 38 3/04/00 11:45a Markd +// Added light style support and malloc and free to the cgame +// +// 37 3/02/00 10:35a Steven +// Changed reverb interface. +// +// 36 2/21/00 4:59p Steven +// Changed S_StartLocalSound to be able to use aliases. +// +// 35 2/21/00 2:51p Markd +// Added GlobalRadius support to tikis +// +// 34 2/14/00 7:34p Aldie +// Fixed some beam rendering issues +// +// 33 2/14/00 5:48p Jimdose +// legs animation now only plays when ANIM_BLEND is set on anim or if uselegs +// is set +// +// 32 2/12/00 3:45p Markd +// Added new exports for cgame access +// +// 31 2/07/00 7:38p Aldie +// Fixed swiping, also various weapons fixes for sword and for sling +// +// 30 2/03/00 1:05p Markd +// added real cameralook +// +// 29 1/29/00 6:17p Aldie +// Added TIKI_NameForNum +// +// 28 1/28/00 6:11p Jimdose +// added CG_GetRendererConfig to clientGameExport_t +// +// 27 1/25/00 8:07p Jimdose +// added Anim_CrossblendTime +// +// 26 1/24/00 6:43p Steven +// Added reverb stuff. +// +// 25 1/20/00 5:20p Markd +// Added skin support into the game +// +// 24 1/11/00 7:30p Jimdose +// added Tag_OrientationEx +// +// 23 12/11/99 5:51p Markd +// First wave of bug fixes after q3a gold merge +// +// 22 12/11/99 3:37p Markd +// q3a gold checkin, first time +// +// 21 12/09/99 10:52a Jimdose +// got tags working with torso and crossblended animations +// +// 20 12/02/99 4:33p Jimdose +// exported TIKI_Tag_NamedLerpOrientation +// +// 19 11/03/99 6:20p Steven +// Cleaned up some sound entity position stuff. +// +// 18 11/01/99 4:11p Jimdose +// made tags work with bone controllers +// +// 17 10/29/99 7:29p Steven +// Moved sound stuff into snapshot. +// +// 16 10/22/99 6:29p Aldie +// Fix for beams in the sky +// +// 15 10/22/99 4:29p Aldie +// Added debuglines +// +// 14 10/19/99 7:52p Markd +// Removed three part model system +// +// 13 10/05/99 6:01p Aldie +// Added headers +// +// DESCRIPTION: +// client game public interfaces + +#ifndef __CG_PUBLIC_H__ +#define __CG_PUBLIC_H__ + +#ifdef __cplusplus +extern "C" + { +#endif + +#define MAGIC_UNUSED_NUMBER 7777 +#define CMD_BACKUP 64 +#define CMD_MASK (CMD_BACKUP - 1) +// allow a lot of command backups for very fast systems +// multiple commands may be combined into a single packet, so this +// needs to be larger than PACKET_BACKUP + + +#define MAX_ENTITIES_IN_SNAPSHOT 256 + +// snapshots are a view of the server at a given time + +// Snapshots are generated at regular time intervals by the server, +// but they may not be sent if a client's rate level is exceeded, or +// they may be dropped by the network. +typedef struct { + int snapFlags; // SNAPFLAG_RATE_DELAYED, etc + int ping; + + int serverTime; // server time the message is valid for (in msec) + + byte areamask[MAX_MAP_AREA_BYTES]; // portalarea visibility bits + + playerState_t ps; // complete information about the current player at this time + + int numEntities; // all of the entities that need to be presented + entityState_t entities[MAX_ENTITIES_IN_SNAPSHOT]; // at the time of this snapshot + + int numServerCommands; // text based server commands to execute when this + int serverCommandSequence; // snapshot becomes current + + int number_of_sounds; + server_sound_t sounds[ MAX_SERVER_SOUNDS ]; +} snapshot_t; + + +/* +================================================================== + +functions imported from the main executable + +================================================================== +*/ + +#define CGAME_IMPORT_API_VERSION 3 + +/* +================================================================== + +functions exported to the main executable + +================================================================== +*/ + +// This was put back in for FAKK2 + +typedef struct + { + int apiversion; + + //============== general services ================== + + // print message on the local console + void (*Printf)( const char *fmt, ...); + void (*DPrintf)( const char *fmt, ...); + void (*DebugPrintf)( const char *fmt, ...); + + // managed memory allocation + void *(*Malloc)( int size ); + void (*Free)( void *block ); + + // abort the game + void (*Error)( int errorLevel, const char *fmt, ...); + + // milliseconds should only be used for profiling, never + // for anything game related. Get time from CG_ReadyToBuildScene. + int (*Milliseconds)( void ); + + // console variable interaction + cvar_t * (*Cvar_Get)( const char *var_name, const char *value, int flags ); + void (*Cvar_Set)( const char *var_name, const char *value ); + + // ClientCommand and ConsoleCommand parameter access + int (*Argc)( void ); + char * (*Argv)( int n ); + char * (*Args)( void ); // concatenation of all argv >= 1 + void (*AddCommand)( const char *cmd ); + + // a -1 return means the file does not exist + // NULL can be passed for buf to just determine existance + int (*FS_ReadFile)( const char *name, void **buf, qboolean quiet ); + void (*FS_FreeFile)( void *buf ); + void (*FS_WriteFile)( const char *qpath, const void *buffer, int size ); + void (*FS_WriteTextFile)( const char *qpath, const void *buffer, int size ); + // add commands to the local console as if they were typed in + // for map changing, etc. The command is not executed immediately, + // but will be executed in order the next time console commands + // are processed + void (*SendConsoleCommand)( const char *text ); + + void (*UpdateLoadingScreen)( void ); + // =========== client specific functions =============== + + // send a string to the server over the network + void (*SendClientCommand)( const char *s ); + + // CM functions + void (*CM_LoadMap)( const char *name ); + clipHandle_t (*CM_InlineModel)( int index ); // 0 = world, 1+ = bmodels + int (*CM_NumInlineModels)( void ); + int (*CM_PointContents)( const vec3_t p, int headnode ); + int (*CM_TransformedPointContents)( const vec3_t p, int headnode, vec3_t origin, vec3_t angles ); + void (*CM_BoxTrace)( trace_t *results, const vec3_t start, const vec3_t end, + const vec3_t mins, const vec3_t maxs, + int headnode, int brushmask, qboolean cylinder ); + void (*CM_TransformedBoxTrace)( trace_t *results, const vec3_t start, const vec3_t end, + const vec3_t mins, const vec3_t maxs, + int headnode, int brushmask, + const vec3_t origin, const vec3_t angles, + qboolean cylinder + ); + clipHandle_t (*CM_TempBoxModel)( const vec3_t mins, const vec3_t maxs, int contents ); + int (*CM_MarkFragments)( int numPoints, const vec3_t *points, const vec3_t projection, + int maxPoints, vec3_t pointBuffer, + int maxFragments, markFragment_t *fragmentBuffer ); + + // =========== sound function calls =============== + + void (*S_StartSound)( vec3_t origin, int entnum, int entchannel, sfxHandle_t sfx, float volume, float min_dist ); + void (*S_StartLocalSound)( const char *sound_name ); + void (*S_StopSound)( int entnum, int channel ); + void (*S_ClearLoopingSounds)( void ); + void (*S_AddLoopingSound)( const vec3_t origin, const vec3_t velocity, sfxHandle_t sfx, float volume, float min_dist ); + void (*S_Respatialize)( int entityNum, vec3_t origin, vec3_t axis[3] ); + void (*S_BeginRegistration)( void ); + sfxHandle_t (*S_RegisterSound)( const char *sample ); + void (*S_EndRegistration)( void ); + void (*S_UpdateEntity)( int entityNum, const vec3_t origin, const vec3_t velocity, qboolean use_listener ); + void (*S_SetReverb)( int reverb_type, float reverb_level ); + void (*S_SetGlobalAmbientVolumeLevel)( float volume ); + + // =========== music function calls =============== + + void (*MUSIC_NewSoundtrack)( const char *name ); + void (*MUSIC_UpdateMood)( int current_mood, int fallback_mood ); + void (*MUSIC_UpdateVolume)( float volume, float fade_time ); + + + // =========== lip function calls =============== + + float (*get_lip_length)(const char * name); + byte * (*get_lip_amplitudes)(const char * name, int *number_of_amplitudes); + + // =========== camera function calls =============== + + float * (*get_camera_offset)( qboolean *lookactive, qboolean *resetview ); + + // =========== renderer function calls ================ + void (*BeginRegistration)( void ); + void (*EndRegistration)( void ); + + void (*R_ClearScene)( void ); + void (*R_RenderScene)( const refdef_t *fd ); + void (*R_LoadWorldMap)( const char *mapname ); + qhandle_t (*R_RegisterModel)( const char *name ); + qhandle_t (*R_RegisterSkin)( const char *name ); + qhandle_t (*R_RegisterShader)( const char *name ); + qhandle_t (*R_RegisterShaderNoMip)( const char *name ); + void (*R_AddRefEntityToScene)( refEntity_t *ent ); + void (*R_AddRefSpriteToScene)( refEntity_t *ent ); + void (*R_AddLightToScene)( vec3_t origin, float intensity, float r, float g, float b, int type ); + void (*R_AddPolyToScene)( qhandle_t hShader, int numVerts, const polyVert_t *verts, int renderfx ); + void (*R_SetColor)( const vec4_t rgba ); // NULL = 1,1,1,1 + void (*R_DrawStretchPic) ( float x, float y, float w, float h, + float s1, float t1, float s2, float t2, + qhandle_t hShader ); // 0 = white + refEntity_t * (*R_GetRenderEntity)( int entityNumber ); + void (*R_ModelBounds)( clipHandle_t model, vec3_t mins, vec3_t maxs ); + float (*R_ModelRadius)( clipHandle_t model ); + float (*R_Noise)( float x, float y, float z, float t ); + void (*R_DebugLine)( vec3_t start, vec3_t end, float r, float g, float b, float alpha ); + // =========== Swipes ============= + void (*R_SwipeBegin) ( float thistime, float life, qhandle_t shader ); + void (*R_SwipePoint) ( vec3_t p1, vec3_t p2, float time ); + void (*R_SwipeEnd) ( void ); + int (*R_GetShaderWidth)( qhandle_t shader ); + int (*R_GetShaderHeight)( qhandle_t shader ); + void (*R_DrawBox)( float x, float y, float w, float h ); + + // =========== data shared with the client ============= + void (*GetGameState)( gameState_t *gamestate ); + int (*GetSnapshot)( int snapshotNumber, snapshot_t *snapshot ); + void (*GetCurrentSnapshotNumber)( int *snapshotNumber, int *serverTime ); + void (*GetGlconfig)( glconfig_t *glconfig ); + + // will return false if the number is so old that it doesn't exist in the buffer anymore + qboolean (*GetParseEntityState)( int parseEntityNumber, entityState_t *state ); + int (*GetCurrentCmdNumber)( void ); // returns the most recent command number + // which is the local predicted command for + // the following frame + qboolean (*GetUserCmd)( int cmdNumber, usercmd_t *ucmd ); + qboolean (*GetServerCommand)( int serverCommandNumber ); + + // ALIAS STUFF + qboolean (*Alias_Add)( const char * alias, const char * name, const char *parameters ); + const char * (*Alias_FindRandom)( const char * alias ); + void (*Alias_Dump)( void ); + void (*Alias_Clear)( void ); + + // ==================== TIKI STUFF ========================== + // TIKI SPECIFIC STUFF + int (*TIKI_GetHandle)( qhandle_t handle ); + int (*NumAnims) ( int tikihandle ); + int (*NumSkins) ( int tikihandle ); + int (*NumSurfaces) ( int tikihandle ); + int (*NumTags) ( int tikihandle ); + qboolean (*InitCommands) ( int tikihandle, tiki_cmd_t * tiki_cmd ); + void (*CalculateBounds) ( int tikihandle, float scale, vec3_t mins, vec3_t maxs ); + void (*FlushAll) ( void ); + const char * (*TIKI_NameForNum)( int tikihandle ); + + // ANIM SPECIFIC STUFF + const char * (*Anim_NameForNum) ( int tikihandle, int animnum ); + int (*Anim_NumForName) ( int tikihandle, const char * name ); + int (*Anim_Random) ( int tikihandle, const char * name ); + int (*Anim_NumFrames) ( int tikihandle, int animnum ); + float (*Anim_Time) ( int tikihandle, int animnum ); + void (*Anim_Delta) ( int tikihandle, int animnum, vec3_t delta ); + int (*Anim_Flags) ( int tikihandle, int animnum ); + int (*Anim_CrossblendTime) ( int tikihandle, int animnum ); + qboolean (*Anim_HasCommands) ( int tikihandle, int animnum ); + + // FRAME SPECIFIC STUFF + qboolean (*Frame_Commands) ( int tikihandle, int animnum, int framenum, tiki_cmd_t * tiki_cmd ); + void (*Frame_Delta) ( int tikihandle, int animnum, int framenum, vec3_t delta ); + float (*Frame_Time) ( int tikihandle, int animnum, int framenum ); + void (*Frame_Bounds)( int tikihandle, int animnum, int framenum, float scale, vec3_t mins, vec3_t maxs ); + float (*Frame_Radius)( int tikihandle, int animnum, int framenum ); + + // SURFACE SPECIFIC STUFF + int (*Surface_NameToNum) ( int tikihandle, const char * name ); + const char * (*Surface_NumToName) ( int tikihandle, int num ); + int (*Surface_Flags) ( int tikihandle, int num ); + int (*Surface_NumSkins) ( int tikihandle, int num ); + + // TAG SPECIFIC STUFF + int (*Tag_NumForName) ( int tikihandle, const char * name ); + const char * (*Tag_NameForNum) ( int tikihandle, int num ); + orientation_t (*Tag_Orientation) ( int tikihandle, int anim, int frame, int tagnum, float scale, int *bone_tag, vec4_t *bone_quat ); + orientation_t (*Tag_OrientationEx) ( int tikihandle, int anim, int frame, int tagnum, float scale, int *bone_tag, vec4_t *bone_quat, + int crossblend_anim, int crossblend_frame, float crossblend_lerp, qboolean uselegs, qboolean usetorso, int torso_anim, int torso_frame, + int torso_crossblend_anim, int torso_crossblend_frame, float torso_crossblend_lerp ); + + orientation_t (*Tag_NamedOrientation) ( int tikihandle, int anim, int frame, float scale, const char *tagName, int *bone_tag, vec4_t *bone_quat ); + orientation_t (*Tag_LerpedOrientation) ( int tikihandle, refEntity_t *model, int tagnum ); + + // ALIAS SPECIFIC STUF + qboolean (*TIKI_Alias_Add)( int tikihandle, const char * alias, const char * name, const char *parameters ); + const char * (*TIKI_Alias_FindRandom)( int tikihandle, const char * alias ); + void (*TIKI_Alias_Dump)( int tikihandle ); + void (*TIKI_Alias_Clear)( int tikihandle ); + const char * (*TIKI_Alias_FindDialog)( int tikihandle, const char * alias, int random, int entity_number ); + +} clientGameImport_t; + + +/* +================================================================== + +functions exported to the main executable + +================================================================== +*/ + +typedef struct { + void (*CG_Init)( clientGameImport_t *imported, int serverMessageNum, int serverCommandSequence ); + void (*CG_Shutdown)( void ); + void (*CG_DrawActiveFrame)( int serverTime, stereoFrame_t stereoView, qboolean demoPlayback ); + qboolean (*CG_ConsoleCommand)( void ); + void (*CG_GetRendererConfig)( void ); + void (*CG_Draw2D)( void ); + + } clientGameExport_t; + + +#ifdef __cplusplus +} +#endif + +#endif // __CG_PUBLIC_H__ diff --git a/source/source/cgame/cg_servercmds.c b/source/source/cgame/cg_servercmds.c new file mode 100644 index 0000000..5520649 --- /dev/null +++ b/source/source/cgame/cg_servercmds.c @@ -0,0 +1,166 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/cgame/cg_servercmds.c $ +// $Revision:: 8 $ +// $Author:: Steven $ +// $Date:: 7/24/00 6:46p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/cgame/cg_servercmds.c $ +// +// 8 7/24/00 6:46p Steven +// Changed sv_cinematic from a cvar to a player stat. +// +// 7 7/14/00 9:52p Markd +// added global volume dampener on ambient sound effects for cinematics +// +// 6 2/29/00 5:51p Jimdose +// added alternate spawnpoint support +// +// 5 12/11/99 5:51p Markd +// First wave of bug fixes after q3a gold merge +// +// 4 12/11/99 3:37p Markd +// q3a gold checkin, first time +// +// 3 10/05/99 6:01p Aldie +// Added headers +// +// DESCRIPTION: +// cg_servercmds.c -- text commands sent by the server + +#include "cg_local.h" + + +/* +================ +CG_ParseServerinfo + +This is called explicitly when the gamestate is first received, +and whenever the server updates any serverinfo flagged cvars +================ +*/ +void CG_ParseServerinfo( void ) { + const char *info; + const char *mapname; + char map[ MAX_QPATH ]; + char *spawnpos; + + info = CG_ConfigString( CS_SERVERINFO ); + cgs.gametype = atoi( Info_ValueForKey( info, "g_gametype" ) ); + cgs.dmflags = atoi( Info_ValueForKey( info, "dmflags" ) ); + cgs.teamflags = atoi( Info_ValueForKey( info, "teamflags" ) ); + cgs.fraglimit = atoi( Info_ValueForKey( info, "fraglimit" ) ); + cgs.timelimit = atoi( Info_ValueForKey( info, "timelimit" ) ); + cgs.maxclients = atoi( Info_ValueForKey( info, "sv_maxclients" ) ); + + mapname = Info_ValueForKey( info, "mapname" ); + + spawnpos = strchr( mapname, '$' ); + if ( spawnpos ) + { + Q_strncpyz( map, mapname, spawnpos - mapname + 1 ); + } + else + { + strcpy( map, mapname ); + } + + Com_sprintf( cgs.mapname, sizeof( cgs.mapname ), "maps/%s.bsp", map ); +} + + +/* +================ +CG_ConfigStringModified + +================ +*/ +static void CG_ConfigStringModified( void ) + { + int num; + + num = atoi( cgi.Argv( 1 ) ); + + // get the gamestate from the client system, which will have the + // new configstring already integrated + cgi.GetGameState( &cgs.gameState ); + + CG_ProcessConfigString( num ); + } + +/* +=============== +CG_MapRestart +=============== +*/ +static void CG_MapRestart( void ) { + if ( cg_showmiss->integer ) { + cgi.Printf( "CG_MapRestart\n" ); + } + CG_Shutdown(); + CG_Init( &cgi, cgs.processedSnapshotNum, cgs.serverCommandSequence ); +} + +/* +================= +CG_ServerCommand + +The string has been tokenized and can be retrieved with +Cmd_Argc() / Cmd_Argv() +================= +*/ +static void CG_ServerCommand( void ) + { + const char *cmd; + + cmd = cgi.Argv(0); + + if ( !cmd[0] ) + { + // server claimed the command + return; + } + + if ( !strcmp( cmd, "cs" ) ) + { + CG_ConfigStringModified(); + return; + } + + if ( !strcmp( cmd, "print" ) ) + { + cgi.Printf( "%s", cgi.Argv(1) ); + return; + } + + if ( !strcmp( cmd, "map_restart" ) ) + { + CG_MapRestart(); + return; + } + + cgi.Printf( "Unknown client game command: %s\n", cmd ); + } + + +/* +==================== +CG_ExecuteNewServerCommands + +Execute all of the server commands that were received along +with this this snapshot. +==================== +*/ +void CG_ExecuteNewServerCommands( int latestSequence ) { + while ( cgs.serverCommandSequence < latestSequence ) { + if ( cgi.GetServerCommand( ++cgs.serverCommandSequence ) ) { + CG_ServerCommand(); + } + } +} diff --git a/source/source/cgame/cg_snapshot.c b/source/source/cgame/cg_snapshot.c new file mode 100644 index 0000000..456f545 --- /dev/null +++ b/source/source/cgame/cg_snapshot.c @@ -0,0 +1,573 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/cgame/cg_snapshot.c $ +// $Revision:: 37 $ +// $Author:: Aldie $ +// $Date:: 7/19/00 9:52p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/cgame/cg_snapshot.c $ +// +// 37 7/19/00 9:52p Aldie +// Put ET_EVENTS back in. They will get sent over once, and should get +// processed once on the client. +// +// 36 6/17/00 1:54p Markd +// Added server restarted code +// +// 35 6/15/00 8:21p Markd +// Added CleanupCommandManager support +// +// 34 6/15/00 7:58p Markd +// added same map restarting support +// +// 33 6/01/00 7:45p Aldie +// Made it so that swipes are removed when client entities are reset. +// +// 32 6/01/00 12:21p Steven +// Improvement to splashes. +// +// 31 5/20/00 5:14p Markd +// Added ITEM special effects +// +// 30 5/04/00 9:45a Markd +// added check for different modelindex's +// +// 29 4/20/00 3:35p Steven +// Reset the teleport flag back to false in CG_ResetEntity. +// +// 28 4/03/00 4:43p Markd +// fixed a teleportation issue +// +// 27 3/24/00 1:05p Aldie +// Added flag clearing to CG_ResetEntity +// +// 26 3/02/00 10:35a Steven +// Changed reverb interface. +// +// 25 2/07/00 10:10a Markd +// fixed bug with interpolating attached and non-attached entites +// +// 24 1/24/00 6:43p Steven +// Added reverb stuff. +// +// 23 1/15/00 2:39p Aldie +// Changed definition of RemoveClientEntity +// +// 22 1/12/00 8:02p Markd +// nextFrameCameraCut gets set based on whether or not there is a camera cut in +// the following frame +// +// 21 12/13/99 3:31p Aldie +// Commented out some Carmack code to make fakk work +// +// 20 12/13/99 10:46a Markd +// incremental merge fix +// +// 19 12/11/99 5:51p Markd +// First wave of bug fixes after q3a gold merge +// +// 18 12/11/99 3:37p Markd +// q3a gold checkin, first time +// +// 17 11/11/99 11:35a Jimdose +// first pass at torso animation blending in +// +// 16 11/10/99 2:18p Jimdose +// removed some unused variables from centity_t +// working on torso animation +// +// 15 11/03/99 4:59p Steven +// Included music stuff in initial snapshot. +// +// 14 10/29/99 7:24p Steven +// Moved sound stuff into snapshot. +// +// 13 10/21/99 6:19p Markd +// removed torso and head members from entity_state +// +// 12 10/19/99 7:52p Markd +// Removed three part model system +// +// 11 10/12/99 2:23p Markd +// Rewrote camera and player movetype system +// +// 10 10/08/99 7:36p Markd +// Added ET_PLAYER check for ET_MODELANIM +// +// 9 10/06/99 7:25p Markd +// removed TIMESTAMP, time and fixed make_static bug +// +// 8 10/05/99 6:01p Aldie +// Added headers +// +// DESCRIPTION: +// things that happen on snapshot transition, not necessarily every +// single frame + +#include "cg_local.h" + +/* +================== +CG_ResetEntity +================== +*/ +static void CG_ResetEntity( centity_t *cent ) { + + VectorCopy (cent->currentState.origin, cent->lerpOrigin); + + VectorCopy (cent->currentState.angles, cent->lerpAngles); + + // if we just teleported, all we care about is the position and orientation information + if ( cent->teleported ) + { + cent->teleported = qfalse; + return; + } + + // reset local color + cent->client_color[ 0 ] = 1; + cent->client_color[ 1 ] = 1; + cent->client_color[ 2 ] = 1; + cent->client_color[ 3 ] = 1; + + // Make sure entity starts with no loop sound + cent->tikiLoopSound = 0; + + // Reset client flags + cent->clientFlags = 0; + + // Reset splash info + cent->splash_last_spawn_time = 0; + cent->splash_still_count = -1; + + // reset client command + CG_RemoveClientEntity( cent->currentState.number, cgs.model_tiki[ cent->currentState.modelindex ], cent ); + + // reset the animation for the entities + if ( cent->currentState.eType < ET_GENERAL ) + { + CG_ClearModelAnimation( cgs.model_tiki[ cent->currentState.modelindex ], + ¢->am, cent->currentState.anim, + cg.snap->serverTime, + cent->lerpOrigin, + cent->currentState.number + ); + CG_ClearModelAnimation( cgs.model_tiki[ cent->currentState.modelindex ], + ¢->torso_am, cent->currentState.torso_anim, + cg.snap->serverTime, + cent->lerpOrigin, + cent->currentState.number + ); + } + + if ( cent->currentState.eType == ET_PLAYER ) { + CG_ResetPlayerEntity( cent ); + } +} + +/* +=============== +CG_TransitionEntity + +cent->nextState is moved to cent->currentState and events are fired +=============== +*/ +static void CG_TransitionEntity( centity_t *cent ) + { + cent->currentState = cent->nextState; + cent->currentValid = qtrue; + + // reset if the entity wasn't in the last frame or was teleported + if ( !cent->interpolate ) { + CG_ResetEntity( cent ); + } + + // clear the next state. if will be set by the next CG_SetNextSnap + cent->interpolate = qfalse; + // reset the teleported state + cent->teleported = qfalse; + + if ( cent->currentState.eType == ET_EVENTS ) + { + CG_Event( cent ); + } + } + + +/* +================== +CG_SetInitialSnapshot + +This will only happen on the very first snapshot, or +on tourney restarts. All other times will use +CG_TransitionSnapshot instead. +================== +*/ +void CG_SetInitialSnapshot( snapshot_t *snap ) { + int i; + centity_t *cent; + entityState_t *state; + + cg.snap = snap; + + // sort out solid entities + CG_BuildSolidList(); + + CG_ExecuteNewServerCommands( snap->serverCommandSequence ); + + for ( i = 0 ; i < cg.snap->numEntities ; i++ ) { + state = &cg.snap->entities[ i ]; + cent = &cg_entities[ state->number ]; + + cent->currentState = *state; + cent->interpolate = qfalse; + cent->currentValid = qtrue; + + CG_ResetEntity( cent ); + } + + cgi.MUSIC_UpdateMood( snap->ps.current_music_mood, snap->ps.fallback_music_mood ); + cgi.MUSIC_UpdateVolume( snap->ps.music_volume, snap->ps.music_volume_fade_time ); + cgi.S_SetReverb( snap->ps.reverb_type, snap->ps.reverb_level ); +} + + +/* +=================== +CG_TransitionSnapshot + +The transition point from snap to nextSnap has passed +=================== +*/ +static void CG_TransitionSnapshot( void ) { + centity_t *cent; + snapshot_t *oldFrame; + qboolean differentServer; + int i; + + + if ( !cg.snap ) { + cgi.Error( ERR_DROP, "CG_TransitionSnapshot: NULL cg.snap" ); + } + if ( !cg.nextSnap ) { + cgi.Error( ERR_DROP, "CG_TransitionSnapshot: NULL cg.nextSnap" ); + } + + // execute any server string commands before transitioning entities + CG_ExecuteNewServerCommands( cg.nextSnap->serverCommandSequence ); + + // clear the currentValid flag for all entities in the existing snapshot + for ( i = 0 ; i < cg.snap->numEntities ; i++ ) { + cent = &cg_entities[ cg.snap->entities[ i ].number ]; + cent->currentValid = qfalse; + } + + // move nextSnap to snap and do the transitions + oldFrame = cg.snap; + cg.snap = cg.nextSnap; + + // if restarted, teleport and no camera lerp + if ( ( oldFrame->snapFlags ^ cg.snap->snapFlags ) & SNAPFLAG_SERVERCOUNT ) + { + CG_ServerRestarted(); + differentServer = qtrue; + } + else + { + differentServer = qfalse; + } + + //FAKK: Commented out to make our stuff work + //cg_entities[ cg.snap->ps.clientNum ].interpolate = qfalse; + + for ( i = 0 ; i < cg.snap->numEntities ; i++ ) { + cent = &cg_entities[ cg.snap->entities[ i ].number ]; + if ( differentServer ) + { + cent->interpolate = qfalse; + cent->teleported = qfalse; + } + CG_TransitionEntity( cent ); + } + + for ( i = 0 ; i < cg.snap->number_of_sounds ; i++ ) + { + CG_ProcessSound( &cg.snap->sounds[ i ] ); + } + + cg.nextSnap = NULL; + + // check for playerstate transition events + + if ( oldFrame ) + { + playerState_t *ops, *ps; + + ops = &oldFrame->ps; + ps = &cg.snap->ps; + + // teleporting checks are irrespective of prediction + if ( ps->pm_flags & PMF_TIME_TELEPORT ) { + cg.thisFrameTeleport = qtrue; + } + + if ( ( ops->current_music_mood != ps->current_music_mood ) || ( ops->fallback_music_mood != ps->fallback_music_mood ) ) + cgi.MUSIC_UpdateMood( ps->current_music_mood, ps->fallback_music_mood ); + + if ( ( ops->music_volume != ps->music_volume ) || ( ops->music_volume_fade_time != ps->music_volume_fade_time ) ) + cgi.MUSIC_UpdateVolume( ps->music_volume, ps->music_volume_fade_time ); + + if ( ( ops->reverb_type != ps->reverb_type ) || ( ops->reverb_level != ps->reverb_level ) ) + cgi.S_SetReverb( ps->reverb_type, ps->reverb_level ); + + // if we are not doing client side movement prediction for any + // reason, then the client events and view changes will be issued now + if + ( + cg.demoPlayback || + ( cg.snap->ps.pm_flags & PMF_NO_PREDICTION ) || + cg_nopredict->integer || + cg_syncronousClients->integer + ) + { + CG_TransitionPlayerState( ps, ops ); + } + } +} + + +/* +=================== +CG_SetNextSnap + +A new snapshot has just been read in from the client system. +=================== +*/ +static void CG_SetNextSnap( snapshot_t *snap ) { + int num; + entityState_t *es; + centity_t *cent; + + cg.nextSnap = snap; + + cg_entities[ cg.snap->ps.clientNum ].interpolate = qtrue; + + // check for extrapolation errors + for ( num = 0 ; num < snap->numEntities ; num++ ) { + es = &snap->entities[num]; + cent = &cg_entities[ es->number ]; + + cent->nextState = *es; + + // if this frame is a teleport, or the entity wasn't in the + // previous frame, don't interpolate + if ( + !cent->currentValid || + ( ( cent->currentState.eFlags ^ es->eFlags ) & EF_TELEPORT_BIT ) || + ( cent->currentState.parent != es->parent ) || + ( cent->currentState.modelindex != es->modelindex ) + ) { + cent->interpolate = qfalse; + // if this isn't the first frame and we have valid data, set the teleport flag + if ( cent->currentValid ) + { + cent->teleported = qtrue; + } + } else { + cent->interpolate = qtrue; + } + } + + // if the next frame is a teleport for the playerstate, we + // can't interpolate during demos + if ( cg.snap && ( snap->ps.pm_flags & PMF_TIME_TELEPORT ) ) { + cg.nextFrameTeleport = qtrue; + } else { + cg.nextFrameTeleport = qfalse; + } + + // if changing follow mode, don't interpolate + if ( cg.nextSnap->ps.clientNum != cg.snap->ps.clientNum ) { + cg.nextFrameTeleport = qtrue; + } + + // if the camera cut bit changed, than the next frame is a camera cut + if ( + ( cg.nextSnap->ps.camera_flags & CF_CAMERA_CUT_BIT ) != + ( cg.snap->ps.camera_flags & CF_CAMERA_CUT_BIT ) + ) { + cg.nextFrameCameraCut = qtrue; + } else { + cg.nextFrameCameraCut = qfalse; + } + + // if changing server restarts, don't interpolate + if ( ( cg.nextSnap->snapFlags ^ cg.snap->snapFlags ) & SNAPFLAG_SERVERCOUNT ) { + // reset the camera + cg.lastCameraTime = -1; + cg.nextFrameTeleport = qtrue; + } + + + + // sort out solid entities + CG_BuildSolidList(); +} + + +/* +======================== +CG_ReadNextSnapshot + +This is the only place new snapshots are requested +This may increment cgs.processedSnapshotNum multiple +times if the client system fails to return a +valid snapshot. +======================== +*/ +static snapshot_t *CG_ReadNextSnapshot( void ) { + qboolean r; + snapshot_t *dest; + + if ( cg.latestSnapshotNum > cgs.processedSnapshotNum + 1000 ) { + cgi.Error( ERR_DROP, "CG_ReadNextSnapshot: way out of range, %i > %i", + cg.latestSnapshotNum, cgs.processedSnapshotNum ); + } + + while ( cgs.processedSnapshotNum < cg.latestSnapshotNum ) { + // decide which of the two slots to load it into + if ( cg.snap == &cg.activeSnapshots[0] ) { + dest = &cg.activeSnapshots[1]; + } else { + dest = &cg.activeSnapshots[0]; + } + + // try to read the snapshot from the client system + cgs.processedSnapshotNum++; + r = cgi.GetSnapshot( cgs.processedSnapshotNum, dest ); + + // if it succeeded, return + if ( r ) { + CG_AddLagometerSnapshotInfo( dest ); + return dest; + } + + // a GetSnapshot will return failure if the snapshot + // never arrived, or is so old that its entities + // have been shoved off the end of the circular + // buffer in the client system. + + // record as a dropped packet + CG_AddLagometerSnapshotInfo( NULL ); + + // If there are additional snapshots, continue trying to + // read them. + } + + // nothing left to read + return NULL; +} + +/* +============ +CG_ProcessSnapshots + +We are trying to set up a renderable view, so determine +what the simulated time is, and try to get snapshots +both before and after that time if available. + +If we don't have a valid cg.snap after exiting this function, +then a 3D game view cannot be rendered. This should only happen +right after the initial connection. After cg.snap has been valid +once, it will never turn invalid. + +Even if cg.snap is valid, cg.nextSnap may not be, if the snapshot +hasn't arrived yet (it becomes an extrapolating situation instead +of an interpolating one) + +============ +*/ +void CG_ProcessSnapshots( void ) { + snapshot_t *snap; + int n; + + // see what the latest snapshot the client system has is + cgi.GetCurrentSnapshotNumber( &n, &cg.latestSnapshotTime ); + if ( n != cg.latestSnapshotNum ) { + if ( n < cg.latestSnapshotNum ) { + // this should never happen + cgi.Error( ERR_DROP, "CG_ProcessSnapshots: n < cg.latestSnapshotNum" ); + } + cg.latestSnapshotNum = n; + } + + // If we have yet to receive a snapshot, check for it. + // Once we have gotten the first snapshot, cg.snap will + // always have valid data for the rest of the game + while ( !cg.snap ) { + snap = CG_ReadNextSnapshot(); + if ( !snap ) { + // we can't continue until we get a snapshot + return; + } + + // set our weapon selection to what + // the playerstate is currently using + if ( !( snap->snapFlags & SNAPFLAG_NOT_ACTIVE ) ) { + CG_SetInitialSnapshot( snap ); + } + } + + // loop until we either have a valid nextSnap with a serverTime + // greater than cg.time to interpolate towards, or we run + // out of available snapshots + do { + // if we don't have a nextframe, try and read a new one in + if ( !cg.nextSnap ) { + snap = CG_ReadNextSnapshot(); + + // if we still don't have a nextframe, we will just have to + // extrapolate + if ( !snap ) { + break; + } + + CG_SetNextSnap( snap ); + + // if time went backwards, we have a level restart + if ( cg.nextSnap->serverTime < cg.snap->serverTime ) { + // only drop if this is not a restart or loadgame + if ( !( ( cg.nextSnap->snapFlags ^ cg.snap->snapFlags ) & SNAPFLAG_SERVERCOUNT ) ) { + cgi.Error( ERR_DROP, "CG_ProcessSnapshots: Server time went backwards" ); + } + } + } + + // if our time is < nextFrame's, we have a nice interpolating state + if ( cg.time >= cg.snap->serverTime && cg.time < cg.nextSnap->serverTime ) { + break; + } + + // we have passed the transition from nextFrame to frame + CG_TransitionSnapshot(); + } while ( 1 ); + + // assert our valid conditions upon exiting + if ( cg.snap == NULL ) { + cgi.Error( ERR_DROP, "CG_ProcessSnapshots: cg.snap == NULL" ); + } + if ( cg.time < cg.snap->serverTime ) { + // this can happen right after a vid_restart + cg.time = cg.snap->serverTime; + } + if ( cg.nextSnap != NULL && cg.nextSnap->serverTime <= cg.time ) { + cgi.Error( ERR_DROP, "CG_ProcessSnapshots: cg.nextSnap->serverTime <= cg.time" ); + } +} + diff --git a/source/source/cgame/cg_sound.cpp b/source/source/cgame/cg_sound.cpp new file mode 100644 index 0000000..3370bae --- /dev/null +++ b/source/source/cgame/cg_sound.cpp @@ -0,0 +1,38 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/cgame/cg_sound.cpp $ +// $Revision:: 4 $ +// $Author:: Steven $ +// $Date:: 10/29/99 7:24p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/cgame/cg_sound.cpp $ +// +// 4 10/29/99 7:24p Steven +// Moved sound stuff into snapshot. +// +// 3 10/05/99 6:01p Aldie +// Added headers +// +// DESCRIPTION: +// Sound function + +#include "cg_local.h" + +void CG_ProcessSound( server_sound_t *sound ) + { + if ( sound->stop_flag ) + { + cgi.S_StopSound( sound->entity_number, sound->channel ); + } + else + { + cgi.S_StartSound( sound->origin, sound->entity_number, sound->channel, cgs.sound_precache[sound->sound_index], + sound->volume, sound->min_dist ); + } + } diff --git a/source/source/cgame/cg_specialfx.cpp b/source/source/cgame/cg_specialfx.cpp new file mode 100644 index 0000000..eceeff2 --- /dev/null +++ b/source/source/cgame/cg_specialfx.cpp @@ -0,0 +1,370 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/cgame/cg_specialfx.cpp $ +// $Revision:: 12 $ +// $Author:: Markd $ +// $Date:: 7/29/00 12:05p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/cgame/cg_specialfx.cpp $ +// +// 12 7/29/00 12:05p Markd +// fixed footstep sounds +// +// 11 6/28/00 4:36p Markd +// added debug footsteps code +// +// 10 6/25/00 11:21a Markd +// fixed slime code for player +// +// 9 6/16/00 5:52p Steven +// Raised footstep special effect a little bit off of the ground. +// +// 8 6/16/00 5:45p Aldie +// Fix some stuff for footsteps +// +// 7 6/16/00 5:27p Steven +// More work on dirtcloud stuff. +// +// 6 6/16/00 3:31p Steven +// Commented out dirt cloud stuff temporarily until we get the correct effect. +// +// 5 6/15/00 10:11a Steven +// Added some temporary stuff so we could see the feet surface effects. +// +// 4 6/13/00 10:59a Steven +// Moved splash stuff to here, added the flagT_ANGLES to splashes, and added +// some of the stuff for footstep special effects. +// +// 3 6/09/00 7:53p Aldie +// Added origin to playsound and fixed bouncesound and a couple other sound +// things +// +// 2 6/03/00 8:19p Markd +// Added footstep code +// +// 1 6/03/00 7:26p Markd +// +// DESCRIPTION: +// Special Effects code + +#include "cg_local.h" +#include "cg_commands.h" + +extern refEntity_t *current_entity; +extern int current_tiki; + +/* +============================================================== + +FOOTSTEP CODE + +============================================================== +*/ + +#define GROUND_DISTANCE 32 +#define WATER_NO_SPLASH_HEIGHT 16 + +void CG_Footstep + ( + centity_t * ent, + float volume + ) + + { + vec3_t end, midlegs; + trace_t trace; + int contents, surftype; + spawnthing_t effect; + refEntity_t *old_entity; + int old_tiki; + refEntity_t new_entity; + int new_tiki; + qhandle_t hModel; + + // send a trace down from the player to the ground + VectorCopy( ent->lerpOrigin, end ); + end[2] -= GROUND_DISTANCE; + + if ( ent->currentState.eType == ET_PLAYER ) + { + CG_Trace( &trace, ent->lerpOrigin, NULL, NULL, end, ent->currentState.number, MASK_PLAYERSOLID, qtrue, qtrue, "Player Footsteps" ); + } + else + { + CG_Trace( &trace, ent->lerpOrigin, NULL, NULL, end, ent->currentState.number, MASK_MONSTERSOLID, qfalse, qfalse, "Monster Footsteps" ); + } + + if ( trace.fraction == 1.0f ) + { + return; + } + + contents = CG_PointContents( trace.endpos, -1 ); + if ( contents & MASK_WATER ) + { + // take our ground position and trace upwards + VectorCopy( trace.endpos, midlegs ); + midlegs[ 2 ] += WATER_NO_SPLASH_HEIGHT; + contents = CG_PointContents( midlegs, -1 ); + if ( contents & MASK_WATER ) + { + commandManager.PlaySound( "footstep_wade", NULL, CHAN_AUTO, volume ); + if ( cg_debugFootsteps->integer ) + { + cgi.DPrintf( "Footstep: wade volume: %.2f\n", volume ); + } + } + else + { + commandManager.PlaySound( "footstep_splash", NULL, CHAN_AUTO, volume ); + if ( cg_debugFootsteps->integer ) + { + cgi.DPrintf( "Footstep: splash volume: %.2f\n", volume ); + } + } + } + else + { + surftype = trace.surfaceFlags & MASK_SURF_TYPE; + switch ( surftype ) + { + case SURF_TYPE_WOOD: + commandManager.PlaySound( "footstep_wood", NULL, CHAN_AUTO, volume ); + if ( cg_debugFootsteps->integer ) + { + cgi.DPrintf( "Footstep: wood volume: %.2f\n", volume ); + } + break; + case SURF_TYPE_METAL: + commandManager.PlaySound( "footstep_metal", NULL, CHAN_AUTO, volume ); + if ( cg_debugFootsteps->integer ) + { + cgi.DPrintf( "Footstep: metal volume: %.2f\n", volume ); + } + break; + case SURF_TYPE_ROCK: + commandManager.PlaySound( "footstep_rock", NULL, CHAN_AUTO, volume ); + if ( cg_debugFootsteps->integer ) + { + cgi.DPrintf( "Footstep: rock volume: %.2f\n", volume ); + } + break; + case SURF_TYPE_DIRT: + memset( &new_entity, 0, sizeof( refEntity_t ) ); + + commandManager.PlaySound( "footstep_dirt", NULL, CHAN_AUTO, volume ); + + if ( cg_debugFootsteps->integer ) + { + cgi.DPrintf( "Footstep: dirt volume: %.2f\n", volume ); + } + + // Save the old stuff + + old_entity = current_entity; + old_tiki = current_tiki; + + // Setup the new entity + memset( &new_entity.shaderRGBA, 0xff, sizeof( new_entity.shaderRGBA ) ); + new_entity.origin[0] = trace.endpos[0]; + new_entity.origin[1] = trace.endpos[1]; + new_entity.origin[2] = trace.endpos[2] + 5; + new_entity.scale = 1; + + current_entity = &new_entity; + + // Setup the new tiki + + hModel = cgi.R_RegisterModel( "models/fx_dirtstep.tik" ); + new_tiki = cgi.TIKI_GetHandle( hModel ); + current_tiki = new_tiki; + + // Process new entity + + CG_ProcessInitCommands( current_tiki ); + + // Put the old stuff back + + current_entity = old_entity; + current_tiki = old_tiki; + + /* commandManager.InitializeSpawnthing( &effect ); + + effect.SetModel( "models/fx_dirtstep.tik" ); + + effect.cgd.origin[0] = trace.endpos[0]; + effect.cgd.origin[1] = trace.endpos[1]; + effect.cgd.origin[2] = trace.endpos[2] + 5; + + effect.cgd.scale = 1; + + //effect.cgd.scaleRate = 1; + + effect.cgd.life = 2000; + + effect.cgd.flags |= T_FADE; + + effect.cgd.flags |= T_ANGLES; + + effect.randangles[ 0 ] = NOT_RANDOM; + effect.cgd.angles[ 0 ] = 0; + effect.randangles[ 1 ] = NOT_RANDOM; + effect.cgd.angles[ 1 ] = 0; + effect.randangles[ 2 ] = NOT_RANDOM; + effect.cgd.angles[ 2 ] = 0; + + commandManager.SpawnTempModel( 1, &effect ); */ + + break; + case SURF_TYPE_GRILL: + commandManager.PlaySound( "footstep_grill", NULL, CHAN_AUTO, volume ); + if ( cg_debugFootsteps->integer ) + { + cgi.DPrintf( "Footstep: grill volume: %.2f\n", volume ); + } + break; + case SURF_TYPE_ORGANIC: + commandManager.PlaySound( "footstep_organic", NULL, CHAN_AUTO, volume ); + if ( cg_debugFootsteps->integer ) + { + cgi.DPrintf( "Footstep: organic volume: %.2f\n", volume ); + } + break; + case SURF_TYPE_SQUISHY: + commandManager.PlaySound( "footstep_squishy", NULL, CHAN_AUTO, volume ); + if ( cg_debugFootsteps->integer ) + { + cgi.DPrintf( "Footstep: squishy volume: %.2f\n", volume ); + } + break; + } + } + } + +/* +=============== +CG_Splash + +Draw a mark at the water surface +=============== +*/ +void CG_Splash( centity_t *cent ) { + vec3_t start, end, diff; + trace_t trace; + int contents; + float dist; + float time_required; + + spawnthing_t m_ripple; + + if ( !cg_shadows->integer ) { + return; + } + + VectorSubtract( cent->currentState.origin, cent->nextState.origin, diff ); + diff[ 2 ] = 0; + dist = VectorLength( diff ); + + // See if enough time has passed to add another ripple + + if ( dist >= 1 ) + time_required = 100 - dist; + else + time_required = 200; + + if ( time_required < 10 ) + time_required = 10; + + if ( cent->splash_last_spawn_time + time_required > cg.time ) + return; + + // Save the current time + + cent->splash_last_spawn_time = cg.time; + + // Make sure the entity is moving + if ( dist < 1 ) + { + if ( cent->splash_still_count >= 0 ) + { + cent->splash_still_count++; + + if ( cent->splash_still_count > 2 ) + cent->splash_still_count = 0; + else + return; + } + else + return; + } + + + VectorCopy( cent->lerpOrigin, end ); + + // if the feet aren't in liquid, don't make a mark + // this won't handle moving water brushes, but they wouldn't draw right anyway... + contents = cgi.CM_PointContents( end, 0 ); + if ( !( contents & ( CONTENTS_WATER | CONTENTS_SLIME | CONTENTS_LAVA ) ) ) { + return; + } + + VectorCopy( cent->lerpOrigin, start ); + start[2] += 88; + + // if the head isn't out of liquid, don't make a mark + contents = cgi.CM_PointContents( start, 0 ); + if ( contents & ( CONTENTS_SOLID | CONTENTS_WATER | CONTENTS_SLIME | CONTENTS_LAVA ) ) { + return; + } + + // trace down to find the surface + cgi.CM_BoxTrace( &trace, start, end, NULL, NULL, 0, ( CONTENTS_WATER | CONTENTS_SLIME | CONTENTS_LAVA ), qfalse ); + + if ( trace.fraction == 1.0 ) { + return; + } + + // Add a ripple to the scene + + commandManager.InitializeSpawnthing( &m_ripple ); + + m_ripple.SetModel( "ripple.spr" ); + + m_ripple.cgd.origin[0] = trace.endpos[0]; + m_ripple.cgd.origin[1] = trace.endpos[1]; + m_ripple.cgd.origin[2] = trace.endpos[2]; + + m_ripple.cgd.scale = 0.33 + dist / 100; + + if ( m_ripple.cgd.scale > 1 ) + m_ripple.cgd.scale = 1; + + m_ripple.cgd.scaleRate = 1 + dist / 250; + + if ( m_ripple.cgd.scaleRate > 1.4 ) + m_ripple.cgd.scaleRate = 1.4; + + m_ripple.cgd.life = 2000 - dist * 10; + + if ( m_ripple.cgd.life < 1000 ) + m_ripple.cgd.life = 1000; + + m_ripple.cgd.flags |= T_FADE; + + m_ripple.cgd.flags |= T_ANGLES; + + m_ripple.randangles[ 0 ] = NOT_RANDOM; + m_ripple.cgd.angles[ 0 ] = 90; + m_ripple.randangles[ 1 ] = NOT_RANDOM; + m_ripple.cgd.angles[ 1 ] = 0; + m_ripple.randangles[ 2 ] = NOT_RANDOM; + m_ripple.cgd.angles[ 2 ] = 0; + + commandManager.SpawnTempModel( 1, &m_ripple ); +} diff --git a/source/source/cgame/cg_swipe.cpp b/source/source/cgame/cg_swipe.cpp new file mode 100644 index 0000000..f00c160 --- /dev/null +++ b/source/source/cgame/cg_swipe.cpp @@ -0,0 +1,315 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/cgame/cg_swipe.cpp $ +// $Revision:: 12 $ +// $Author:: Markd $ +// $Date:: 6/27/00 2:34p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/cgame/cg_swipe.cpp $ +// +// 12 6/27/00 2:34p Markd +// clear out swipes when restarting +// +// 11 6/14/00 12:14p Markd +// more intel compiler bug fixes +// +// 10 5/15/00 2:19p Aldie +// Added new tempmodel system and added player accumulated pain +// +// 9 5/03/00 4:20p Markd +// Only turn off swipes when swipes were active +// +// 8 3/27/00 1:50p Aldie +// Made swipes work for multiple models +// +// 7 3/04/00 6:03p Aldie +// Made commandManager static +// +// 6 2/07/00 7:38p Aldie +// Fixed swiping, also various weapons fixes for sword and for sling +// +// 5 1/26/00 6:36p Aldie +// Fix the swipe +// +// 4 12/09/99 10:52a Jimdose +// got tags working with torso and crossblended animations +// +// 3 11/01/99 4:11p Jimdose +// made tags work with bone controllers +// +// 2 10/05/99 6:01p Aldie +// Added headers +// +// DESCRIPTION: +// General swiping functions + +#include "cg_commands.h" + +swipething_t m_swipes[MAX_SWIPES]; +extern int current_entity_number; +extern refEntity_t *current_entity; +extern int current_tiki; +extern centity_t *current_centity; + +void ClientGameCommandManager::SwipeOn + ( + Event *ev + ) + + { + // Make a swipe for this if available + int i; + int freeswipe = -1; + str tagname_start,tagname_end; + qhandle_t shader; + + if ( ev->NumArgs () != 4 ) + return; + + shader = cgi.R_RegisterShader( ev->GetString( 1 ) ); + tagname_start = ev->GetString( 2 ); + tagname_end = ev->GetString( 3 ); + + for ( i=0; i < MAX_SWIPES; i++ ) + { + swipething_t &swipe = m_swipes[i]; + + if ( !swipe.enabled || + ( + ( swipe.entitynum == current_entity_number ) && + ( tagname_start == swipe.tagname_start ) && + ( tagname_end == swipe.tagname_end ) && + ( shader == swipe.shader ) + ) + ) + { + freeswipe = i; + break; + } + } + + if ( freeswipe == -1 ) + return; + + swipething_t &swipe = m_swipes[freeswipe]; + + if ( !swipe.enabled ) + { + swipe.Init (); + swipe.enabled = qtrue; + swipe.entitynum = current_entity_number; + } + + swipe.shader = cgi.R_RegisterShader( ev->GetString( 1 ) ); + swipe.tagname_start = ev->GetString ( 2 ); + swipe.tagname_end = ev->GetString ( 3 ); + swipe.life = ev->GetFloat ( 4 ) * 1000.f; + + if ( current_centity ) + current_centity->clientFlags |= CF_UPDATESWIPE; + } + +void ClientGameCommandManager::SwipeOff + ( + Event *ev + ) + + { + qboolean was_enabled; + int i; + + was_enabled = qfalse; + for ( i=0; i < MAX_SWIPES; i++ ) + { + swipething_t &swipe = m_swipes[i]; + + if ( swipe.enabled && swipe.entitynum == current_entity_number ) + { + swipe.enabled = qfalse; + was_enabled = qtrue; + } + } + + if ( was_enabled ) + { + //cgi.R_SwipeBegin ( 0.f, 0.f, -1 ); + //cgi.R_SwipeEnd (); + + if ( current_centity ) + current_centity->clientFlags &= ~CF_UPDATESWIPE; + } + } + +void ClientGameCommandManager::Swipe + ( + Event *ev + ) + + { + // This does a swipe effect on the entity + int i,swipenum; + orientation_t or; + int tagnum_start,tagnum_end; + qboolean add_cnt_point = qfalse; + vec3_t tmp; + + assert( current_entity ); + assert( current_tiki != -1 ); + + if ( !current_entity || ( current_tiki == -1 ) ) + { + return; + } + + // Let's find us a new (or current) swipe + for ( swipenum=0; swipenum < MAX_SWIPES; swipenum++ ) + { + swipething_t &swipe = m_swipes[swipenum]; + + if ( swipe.enabled && swipe.entitynum == current_entity_number ) + { + while ( swipe.num_live_swipes > 1 ) + { + i = ( swipe.first_swipe + 1 ) % MAX_SWIPE_POINTS; + swipepoint_t &swipepoint = swipe.swipepoints[i]; + + if ( swipepoint.time < cg.time - swipe.life ) + { + // then let's delete the previous + swipe.first_swipe = ( swipe.first_swipe + 1 ) % MAX_SWIPE_POINTS; + swipe.num_live_swipes--; + } + else + { + break; + } + } + + if ( swipe.num_live_swipes == 1 ) + { + swipepoint_t &swipepoint = swipe.swipepoints[swipe.first_swipe]; + if ( swipepoint.time < cg.time - swipe.life ) + { + swipe.num_live_swipes = 0; + } + } + + swipe.cntPoint.time = cg.time; + VectorCopy ( current_entity->origin, swipe.cntPoint.points[0] ); + + tagnum_start = cgi.Tag_NumForName( current_tiki, swipe.tagname_start.c_str() ); + or = cgi.Tag_LerpedOrientation( current_tiki, current_entity, tagnum_start ); + + // Clear out the points + VectorClear ( tmp ); + VectorClear ( swipe.cntPoint.points[0] ); + VectorClear ( swipe.cntPoint.points[1] ); + + if ( ev->NumArgs() > 0 ) + VectorCopy( ev->GetVector( 1 ), tmp ); + else + VectorCopy ( current_entity->origin, tmp ); + + // Transform the origin of the tag by the axis of the entity and add it to the origin of the entity + for ( i = 0; i < 3; i++ ) + { + VectorMA ( tmp, or.origin[i], current_entity->axis[i], tmp ); + } + + // Copy tmp into the startpoint + VectorCopy ( tmp, swipe.cntPoint.points[0] ); + + tagnum_end = cgi.Tag_NumForName( current_tiki, swipe.tagname_end.c_str() ); + or = cgi.Tag_LerpedOrientation( current_tiki, current_entity, tagnum_end ); + + if ( ev->NumArgs() > 0 ) + VectorCopy( ev->GetVector( 1 ), tmp ); + else + VectorCopy ( current_entity->origin, tmp ); + + // Transform the origin of the tag by the axis of the entity and add it to the origin of the entity + for ( i = 0; i < 3; i++ ) + { + VectorMA ( tmp, or.origin[i], current_entity->axis[i], tmp ); + } + + // Copy tmp into the startpoint + VectorCopy ( tmp, swipe.cntPoint.points[1] ); + + if ( swipe.num_live_swipes == 0 ) + add_cnt_point = qtrue; + else + { + float deltime = swipe.life / float ( MAX_SWIPES ); + swipepoint_t &lastpoint = swipe.swipepoints[ ( swipe.first_swipe + swipe.num_live_swipes - 1 ) % MAX_SWIPE_POINTS]; + + if ( swipe.cntPoint.time - lastpoint.time >= deltime ) + add_cnt_point = qtrue; + } + + cgi.R_SwipeBegin ( cg.time, swipe.life, swipe.shader ); + + if ( add_cnt_point ) + { + swipepoint_t &swipepoint = swipe.swipepoints[ ( swipe.first_swipe + swipe.num_live_swipes ) % MAX_SWIPE_POINTS]; + + swipepoint = swipe.cntPoint; + + if ( swipe.num_live_swipes == MAX_SWIPE_POINTS ) + swipe.first_swipe = ( swipe.first_swipe + 1 ) % MAX_SWIPE_POINTS; + else + swipe.num_live_swipes++; + } + + for ( i = 0; i != swipe.num_live_swipes; i++ ) + { + swipepoint_t &swipepoint = swipe.swipepoints[ ( swipe.first_swipe + i ) % MAX_SWIPE_POINTS]; + + cgi.R_SwipePoint ( swipepoint.points[0], swipepoint.points[1], swipepoint.time ); + } + + if ( !add_cnt_point ) + cgi.R_SwipePoint ( swipe.cntPoint.points[0], swipe.cntPoint.points[1], swipe.cntPoint.time ); + + cgi.R_SwipeEnd (); + } + } + } + +void ClientGameCommandManager::ClearSwipes + ( + void + ) + + { + int i; + + for ( i=0; i < MAX_SWIPES; i++ ) + { + swipething_t &swipe = m_swipes[i]; + + swipe.enabled = qfalse; + } + + cgi.R_SwipeBegin ( 0.f, 0.f, -1 ); + cgi.R_SwipeEnd (); + } + + +/* +=================== +CG_ClearSwipes + +This is called at startup and for tournement restarts +=================== +*/ +void CG_ClearSwipes( void ) + { + commandManager.ClearSwipes(); + } diff --git a/source/source/cgame/cg_syscalls.c b/source/source/cgame/cg_syscalls.c new file mode 100644 index 0000000..8550343 --- /dev/null +++ b/source/source/cgame/cg_syscalls.c @@ -0,0 +1,264 @@ +#include "cg_local.h" + +// this file is only included when building a dll +// syscalls.asm is included instead when building a qvm + +static int (*syscall)( int arg, ... ) = (int (*)( int, ...))-1; + + +void dllEntry( int (*syscallptr)( int arg,... ) ) { + syscall = syscallptr; +} + + +int PASSFLOAT( float x ) { + float floatTemp; + floatTemp = x; + return *(int *)&floatTemp; +} + +void trap_Print( const char *fmt ) { + syscall( CG_PRINT, fmt ); +} + +void trap_Error( const char *fmt ) { + syscall( CG_ERROR, fmt ); +} + +int trap_Milliseconds( void ) { + return syscall( CG_MILLISECONDS ); +} + +void trap_Cvar_Register( vmCvar_t *vmCvar, const char *varName, const char *defaultValue, int flags ) { + syscall( CG_CVAR_REGISTER, vmCvar, varName, defaultValue, flags ); +} + +void trap_Cvar_Update( vmCvar_t *vmCvar ) { + syscall( CG_CVAR_UPDATE, vmCvar ); +} + +void trap_Cvar_Set( const char *var_name, const char *value ) { + syscall( CG_CVAR_SET, var_name, value ); +} + +int trap_Argc( void ) { + return syscall( CG_ARGC ); +} + +void trap_Argv( int n, char *buffer, int bufferLength ) { + syscall( CG_ARGV, n, buffer, bufferLength ); +} + +void trap_Args( char *buffer, int bufferLength ) { + syscall( CG_ARGS, buffer, bufferLength ); +} + +int trap_FS_FOpenFile( const char *qpath, fileHandle_t *f, fsMode_t mode ) { + return syscall( CG_FS_FOPENFILE, qpath, f, mode ); +} + +void trap_FS_Read( void *buffer, int len, fileHandle_t f ) { + syscall( CG_FS_READ, buffer, len, f ); +} + +void trap_FS_Write( const void *buffer, int len, fileHandle_t f ) { + syscall( CG_FS_WRITE, buffer, len, f ); +} + +void trap_FS_FCloseFile( fileHandle_t f ) { + syscall( CG_FS_FCLOSEFILE, f ); +} + +void trap_SendConsoleCommand( const char *text ) { + syscall( CG_SENDCONSOLECOMMAND, text ); +} + +void trap_AddCommand( const char *cmdName ) { + syscall( CG_ADDCOMMAND, cmdName ); +} + +void trap_SendClientCommand( const char *s ) { + syscall( CG_SENDCLIENTCOMMAND, s ); +} + +void trap_UpdateScreen( void ) { + syscall( CG_UPDATESCREEN ); +} + +void trap_CM_LoadMap( const char *mapname ) { + syscall( CG_CM_LOADMAP, mapname ); +} + +int trap_CM_NumInlineModels( void ) { + return syscall( CG_CM_NUMINLINEMODELS ); +} + +clipHandle_t trap_CM_InlineModel( int index ) { + return syscall( CG_CM_INLINEMODEL, index ); +} + +clipHandle_t trap_CM_TempBoxModel( const vec3_t mins, const vec3_t maxs ) { + return syscall( CG_CM_TEMPBOXMODEL, mins, maxs ); +} + +int trap_CM_PointContents( const vec3_t p, clipHandle_t model ) { + return syscall( CG_CM_POINTCONTENTS, p, model ); +} + +int trap_CM_TransformedPointContents( const vec3_t p, clipHandle_t model, const vec3_t origin, const vec3_t angles ) { + return syscall( CG_CM_TRANSFORMEDPOINTCONTENTS, p, model, origin, angles ); +} + +void trap_CM_BoxTrace( trace_t *results, const vec3_t start, const vec3_t end, + const vec3_t mins, const vec3_t maxs, + clipHandle_t model, int brushmask ) { + syscall( CG_CM_BOXTRACE, results, start, end, mins, maxs, model, brushmask ); +} + +void trap_CM_TransformedBoxTrace( trace_t *results, const vec3_t start, const vec3_t end, + const vec3_t mins, const vec3_t maxs, + clipHandle_t model, int brushmask, + const vec3_t origin, const vec3_t angles ) { + syscall( CG_CM_TRANSFORMEDBOXTRACE, results, start, end, mins, maxs, model, brushmask, origin, angles ); +} + +int trap_CM_MarkFragments( int numPoints, const vec3_t *points, + const vec3_t projection, + int maxPoints, vec3_t pointBuffer, + int maxFragments, markFragment_t *fragmentBuffer ) { + return syscall( CG_CM_MARKFRAGMENTS, numPoints, points, projection, maxPoints, pointBuffer, maxFragments, fragmentBuffer ); +} + +void trap_S_StartSound( vec3_t origin, int entityNum, int entchannel, sfxHandle_t sfx, float volume, float min_dist ) { + syscall( CG_S_STARTSOUND, origin, entityNum, entchannel, sfx, volume, min_dist ); +} + +void trap_S_StartLocalSound( sfxHandle_t sfx ) { + syscall( CG_S_STARTLOCALSOUND, sfx ); +} + +void trap_S_ClearLoopingSounds( void ) { + syscall( CG_S_CLEARLOOPINGSOUNDS ); +} + +void trap_S_AddLoopingSound( const vec3_t origin, const vec3_t velocity, sfxHandle_t sfx, float volume, float min_dist ) { + syscall( CG_S_ADDLOOPINGSOUND, origin, velocity, sfx, volume, min_dist ); +} + +void trap_S_UpdateEntityPosition( int entityNum, const vec3_t origin ) { + syscall( CG_S_UPDATEENTITYPOSITION, entityNum, origin ); +} + +void trap_S_UpdateEntityVelocity( int entityNum, const vec3_t vel ) { + syscall( CG_S_UPDATEENTITYVELOCITY, entityNum, vel ); +} + +void trap_S_Respatialize( int entityNum, const vec3_t origin, vec3_t axis[3] ) { + syscall( CG_S_RESPATIALIZE, entityNum, origin, axis ); +} + +sfxHandle_t trap_S_RegisterSound( const char *sample ) { + return syscall( CG_S_REGISTERSOUND, sample ); +} + +/* void trap_S_StartBackgroundTrack( const char *name ) { + syscall( CG_S_STARTBACKGROUNDTRACK, name ); +} */ + +/*qboolean trap_S_ChannelInUse( soundChannel_t entchannel ) { + return syscall( CG_S_CHANNELINUSE, entchannel ); +} */ + +void trap_R_LoadWorldMap( const char *mapname ) { + syscall( CG_R_LOADWORLDMAP, mapname ); +} + +qhandle_t trap_R_RegisterModel( const char *name ) { + return syscall( CG_R_REGISTERMODEL, name ); +} + +qhandle_t trap_R_RegisterSkin( const char *name ) { + return syscall( CG_R_REGISTERSKIN, name ); +} + +qhandle_t trap_R_RegisterShader( const char *name ) { + return syscall( CG_R_REGISTERSHADER, name ); +} + +void trap_R_ClearScene( void ) { + syscall( CG_R_CLEARSCENE ); +} + +void trap_R_AddRefEntityToScene( const refEntity_t *re ) { + syscall( CG_R_ADDREFENTITYTOSCENE, re ); +} + +void trap_R_AddPolyToScene( qhandle_t hShader , int numVerts, const polyVert_t *verts ) { + syscall( CG_R_ADDPOLYTOSCENE, hShader, numVerts, verts ); +} + +void trap_R_AddLightToScene( const vec3_t org, float intensity, float r, float g, float b ) { + syscall( CG_R_ADDLIGHTTOSCENE, org, PASSFLOAT(intensity), PASSFLOAT(r), PASSFLOAT(g), PASSFLOAT(b) ); +} + +void trap_R_RenderScene( const refdef_t *fd ) { + syscall( CG_R_RENDERSCENE, fd ); +} + +void trap_R_SetColor( const float *rgba ) { + syscall( CG_R_SETCOLOR, rgba ); +} + +void trap_R_DrawStretchPic( float x, float y, float w, float h, + float s1, float t1, float s2, float t2, qhandle_t hShader ) { + syscall( CG_R_DRAWSTRETCHPIC, PASSFLOAT(x), PASSFLOAT(y), PASSFLOAT(w), PASSFLOAT(h), PASSFLOAT(s1), PASSFLOAT(t1), PASSFLOAT(s2), PASSFLOAT(t2), hShader ); +} + +void trap_R_ModelBounds( clipHandle_t model, vec3_t mins, vec3_t maxs ) { + syscall( CG_R_MODELBOUNDS, model, mins, maxs ); +} + +void trap_R_LerpTag( orientation_t *tag, clipHandle_t mod, int startFrame, int endFrame, + float frac, const char *tagName ) { + syscall( CG_R_LERPTAG, tag, mod, startFrame, endFrame, PASSFLOAT(frac), tagName ); +} + +void trap_GetGlconfig( glconfig_t *glconfig ) { + syscall( CG_GETGLCONFIG, glconfig ); +} + +void trap_GetGameState( gameState_t *gamestate ) { + syscall( CG_GETGAMESTATE, gamestate ); +} + +void trap_GetCurrentSnapshotNumber( int *snapshotNumber, int *serverTime ) { + syscall( CG_GETCURRENTSNAPSHOTNUMBER, snapshotNumber, serverTime ); +} + +qboolean trap_GetSnapshot( int snapshotNumber, snapshot_t *snapshot ) { + return syscall( CG_GETSNAPSHOT, snapshotNumber, snapshot ); +} + +qboolean trap_GetServerCommand( int serverCommandNumber ) { + return syscall( CG_GETSERVERCOMMAND, serverCommandNumber ); +} + +int trap_GetCurrentCmdNumber( void ) { + return syscall( CG_GETCURRENTCMDNUMBER ); +} + +qboolean trap_GetUserCmd( int cmdNumber, usercmd_t *ucmd ) { + return syscall( CG_GETUSERCMD, cmdNumber, ucmd ); +} + +void trap_SetUserCmdValue( int stateValue, float sensitivityScale ) { + syscall( CG_SETUSERCMDVALUE, stateValue, PASSFLOAT(sensitivityScale) ); +} + +void testPrintInt( char *string, int i ) { + syscall( CG_TESTPRINTINT, string, i ); +} + +void testPrintFloat( char *string, float f ) { + syscall( CG_TESTPRINTFLOAT, string, PASSFLOAT(f) ); +} diff --git a/source/source/cgame/cg_testemitter.cpp b/source/source/cgame/cg_testemitter.cpp new file mode 100644 index 0000000..1097201 --- /dev/null +++ b/source/source/cgame/cg_testemitter.cpp @@ -0,0 +1,637 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/cgame/cg_testemitter.cpp $ +// $Revision:: 18 $ +// $Author:: Markd $ +// $Date:: 7/22/00 5:50p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/cgame/cg_testemitter.cpp $ +// +// 18 7/22/00 5:50p Markd +// added flushtikis support +// +// 17 7/10/00 11:54p Markd +// added exit level code +// +// 16 6/14/00 12:14p Markd +// more intel compiler bug fixes +// +// 15 5/15/00 2:19p Aldie +// Added new tempmodel system and added player accumulated pain +// +// 13 3/16/00 7:35p Aldie +// Added t2 flags to testemitter +// +// 12 3/16/00 5:09p Aldie +// Added some optimizations for tempmodels +// +// 11 3/15/00 11:01a Aldie +// Changed m_emitters to container instead of array. +// +// 10 3/11/00 4:47p Aldie +// Fix for scaleupdown +// +// 9 3/04/00 6:03p Aldie +// Made commandManager static +// +// 8 2/09/00 4:27p Aldie +// Fixed pause on the client emitters +// +// 7 1/26/00 11:35a Aldie +// New data structures for emitters +// +// 6 1/22/00 12:41p Jimdose +// got rid of calls to vec3() +// +// 5 10/22/99 4:29p Aldie +// Added debuglines +// +// 4 10/13/99 3:26p Aldie +// Various fixes for particles, beams and lensflares +// +// 3 10/05/99 6:01p Aldie +// Added headers +// +// DESCRIPTION: +// testemitter functions. Used for designing emitters in game + +#include "cg_commands.h" + +cvar_t *cg_te_xangles; +cvar_t *cg_te_yangles; +cvar_t *cg_te_zangles; +cvar_t *cg_te_alpha; +cvar_t *cg_te_dietouch; +cvar_t *cg_te_bouncefactor; +cvar_t *cg_te_scale; +cvar_t *cg_te_scalemin; +cvar_t *cg_te_scalemax; +cvar_t *cg_te_model; +cvar_t *cg_te_life; +cvar_t *cg_te_color_r; +cvar_t *cg_te_color_g; +cvar_t *cg_te_color_b; +cvar_t *cg_te_startcolor_r; +cvar_t *cg_te_startcolor_g; +cvar_t *cg_te_startcolor_b; +cvar_t *cg_te_endcolor_r; +cvar_t *cg_te_endcolor_g; +cvar_t *cg_te_endcolor_b; +cvar_t *cg_te_accel_x; +cvar_t *cg_te_accel_y; +cvar_t *cg_te_accel_z; +cvar_t *cg_te_count; +cvar_t *cg_te_fade; +cvar_t *cg_te_fadein; +cvar_t *cg_te_spawnrate; +cvar_t *cg_te_orgoffset_x; +cvar_t *cg_te_orgoffset_y; +cvar_t *cg_te_orgoffset_z; +cvar_t *cg_te_rorgx; +cvar_t *cg_te_rorgy; +cvar_t *cg_te_rorgz; +cvar_t *cg_te_scalerate; +cvar_t *cg_te_circle; +cvar_t *cg_te_sphere; +cvar_t *cg_te_insphere; +cvar_t *cg_te_radius; +cvar_t *cg_te_swarm; +cvar_t *cg_te_wavy; +cvar_t *cg_te_align; +cvar_t *cg_te_flickeralpha; +cvar_t *cg_te_collision; +cvar_t *cg_te_globalfade; +cvar_t *cg_te_randomroll; +cvar_t *cg_te_angles_pitch; +cvar_t *cg_te_angles_yaw; +cvar_t *cg_te_angles_roll; +cvar_t *cg_te_randpitch; +cvar_t *cg_te_randyaw; +cvar_t *cg_te_randroll; +cvar_t *cg_te_forwardvelocity; +cvar_t *cg_te_randvelx; +cvar_t *cg_te_randvely; +cvar_t *cg_te_randvelz; +cvar_t *cg_te_rvxtype; +cvar_t *cg_te_rvytype; +cvar_t *cg_te_rvztype; + +spawnthing_t *testspawnthing=NULL; + +//=============== +//UpdateTestEmitter +//=============== +void ClientGameCommandManager::UpdateTestEmitter + ( + void + ) + + { + int count; + Vector delta; + Vector end,end2,perp; + + emittertime_t *et=NULL; + + if ( !testspawnthing ) + return; + + SetTestEmitterValues(); + + et = testspawnthing->GetEmitTime( 1 ); + + if ( !et->active ) + return; + + testspawnthing->cgd.createTime = cg.time; + + end = testspawnthing->cgd.origin + testspawnthing->forward * 50; + + cgi.R_DebugLine( testspawnthing->cgd.origin, end, 1,0,0,1 ); + + PerpendicularVector( perp, testspawnthing->forward ); + perp.normalize(); + + end2 = end + ( perp * 16 ) + ( m_spawnthing->forward * -16 ); + cgi.R_DebugLine( end, end2, 1,0,0,1 ); + + end2 = end + ( perp * -16 ) + ( m_spawnthing->forward * -16 ); + cgi.R_DebugLine( end, end2, 1,0,0,1 ); + + if ( ( et->last_emit_time > 0 ) && ( testspawnthing->spawnRate ) ) + { + float dtime = cg.time - et->last_emit_time; + float lerp, lerpfrac; + + count = dtime / testspawnthing->spawnRate; + + // This is kind of a nasty bit of code. If the count is 1, just spawn + // a single tempmodel, if it's greater than 1, then spawn the number + // of tempmodels over a period of time, and adjust their create times + // accordingly. Also lerp the origins so they appear where they are + // supposed to. This helps smoothing out low frame rate situations + // where this is only get called a few times a second, but the spawn + // rate is high, and it will look a lot smoother. + if ( !count ) + { + return; + } + else if ( count == 1 ) + { + SpawnTempModel( 1 ); + et->last_emit_time = cg.time; + } + else + { + lerpfrac = 1.0f / (float)count; + + lerp = 0; + while ( dtime > testspawnthing->spawnRate ) + { + float last_time = et->last_emit_time; + et->last_emit_time = cg.time; + dtime -= testspawnthing->spawnRate; + if ( et->lerp_emitter ) + testspawnthing->cgd.origin = et->oldorigin + ( delta * lerp ); + SpawnTempModel( 1, last_time + dtime ); + lerp += lerpfrac; + } + } + } + else + { + et->last_emit_time = cg.time; + } + } + +void ClientGameCommandManager::DumpEmitter + ( + void + ) + + { + cvar_t *filename; + str buff; + int i; + + if ( !testspawnthing ) + return; + + filename = cgi.Cvar_Get( "cg_te_filename", "dump/emitter.txt", 0 ); + + buff += va( "model %s\n", testspawnthing->m_modellist.ObjectAt( 1 ).c_str() ); + + if ( testspawnthing->cgd.alpha != 1.0 ) + buff += va( "alpha %0.2f\n", testspawnthing->cgd.alpha ); + + if ( testspawnthing->cgd.bouncefactor != 1 ) + buff += va( "bouncefactor %0.2f\n", testspawnthing->cgd.bouncefactor ); + + if ( testspawnthing->cgd.scale != 1 ) + buff += va( "scale %0.2f\n", testspawnthing->cgd.scale ); + + buff += va( "life %0.2f\n", cg_te_life->value ); + + if ( testspawnthing->cgd.accel[0] || testspawnthing->cgd.accel[1] || testspawnthing->cgd.accel[2] ) + buff += va( "accel %0.2f %0.2f %0.2f\n", testspawnthing->cgd.accel[0], testspawnthing->cgd.accel[1], testspawnthing->cgd.accel[2] ); + + buff += va( "spawnrate %0.2f\n", cg_te_spawnrate->value ); + + if ( testspawnthing->cgd.scaleRate ) + buff += va( "scalerate %0.2f\n", testspawnthing->cgd.scaleRate ); + + if ( testspawnthing->sphereRadius ) + buff += va( "radius %0.2f\n", testspawnthing->sphereRadius ); + + if ( testspawnthing->forwardVelocity ) + buff += va( "velocity %0.2f\n", testspawnthing->forwardVelocity ); + + if ( testspawnthing->origin_offset[0] || testspawnthing->origin_offset[1] || testspawnthing->origin_offset[2] ) + { + buff += "offset "; + + for ( i=0; i<3; i++ ) + { + if ( testspawnthing->randorg[i] == NOT_RANDOM ) + buff += va( "%0.2f ", testspawnthing->origin_offset[i] ); + if ( testspawnthing->randorg[i] == RANDOM ) + buff += va( "random %0.2f ", testspawnthing->origin_offset[i] ); + if ( testspawnthing->randorg[i] == CRANDOM ) + buff += va( "crandom %0.2f ", testspawnthing->origin_offset[i] ); + } + buff += "\n"; + } + + if ( testspawnthing->cgd.angles[0] || testspawnthing->cgd.angles[1] || testspawnthing->cgd.angles[2] ) + { + buff += "angles "; + + for ( i=0; i<3; i++ ) + { + if ( testspawnthing->randangles[i] == NOT_RANDOM ) + buff += va( "%0.2f ", testspawnthing->cgd.angles[i] ); + if ( testspawnthing->randangles[i] == RANDOM ) + buff += va( "random %0.2f ", testspawnthing->cgd.angles[i] ); + if ( testspawnthing->randangles[i] == CRANDOM ) + buff += va( "crandom %0.2f ", testspawnthing->cgd.angles[i] ); + } + buff += "\n"; + } + + if ( testspawnthing->velocityVariation[0] || testspawnthing->velocityVariation[1] || testspawnthing->velocityVariation[2] ) + { + buff += "randvel "; + + for ( i=0; i<3; i++ ) + { + if ( testspawnthing->randvel[i] == NOT_RANDOM ) + buff += va( "%0.2f ", testspawnthing->velocityVariation[i] ); + if ( testspawnthing->randvel[i] == RANDOM ) + buff += va( "random %0.2f ", testspawnthing->velocityVariation[i] ); + if ( testspawnthing->randvel[i] == CRANDOM ) + buff += va( "crandom %0.2f ", testspawnthing->velocityVariation[i] ); + } + buff += "\n"; + } + + if ( testspawnthing->cgd.scalemin ) + buff += va( "scalemin %0.2f\n", testspawnthing->cgd.scalemin ); + + if ( testspawnthing->cgd.scalemax ) + buff += va( "scalemax %0.2f\n", testspawnthing->cgd.scalemax ); + + if ( testspawnthing->cgd.flags & T_DIETOUCH ) + buff +="dietouch\n"; + if ( testspawnthing->cgd.flags & T_FADE ) + buff +="fade\n"; + if ( testspawnthing->cgd.flags & T_CIRCLE ) + buff +="circle\n"; + if ( testspawnthing->cgd.flags & T_SPHERE ) + buff +="sphere\n"; + if ( testspawnthing->cgd.flags & T_INWARDSPHERE ) + buff +="inwardsphere\n"; + if ( testspawnthing->cgd.flags & T_ALIGN ) + buff +="align\n"; + if ( testspawnthing->cgd.flags & T_FLICKERALPHA ) + buff +="flickeralpha\n"; + if ( testspawnthing->cgd.flags & T_RANDOMROLL ) + buff +="randomroll\n"; + + cgi.FS_WriteTextFile( filename->string, buff.c_str(), buff.length() + 1 ); + } + +void ClientGameCommandManager::SetTestEmitterValues + ( + void + ) + + { + vec3_t angles; + vec3_t axis[3]; + + testspawnthing->cgd.flags2 |= (T2_MOVE|T2_AMOVE|T2_ACCEL); + + angles[0] = cg_te_xangles->value; + angles[1] = cg_te_yangles->value; + angles[2] = cg_te_zangles->value; + + AnglesToAxis( angles, axis ); + testspawnthing->SetModel( cg_te_model->string ); + + testspawnthing->forward = axis[0]; + testspawnthing->right = axis[1]; + testspawnthing->up = axis[2]; + testspawnthing->cgd.alpha = cg_te_alpha->value; + testspawnthing->cgd.color[3] = cg_te_alpha->value * 255; + testspawnthing->cgd.bouncefactor = cg_te_bouncefactor->value; + testspawnthing->cgd.scale = cg_te_scale->value; + testspawnthing->cgd.life = cg_te_life->value * 1000; + testspawnthing->cgd.color[0] = cg_te_color_r->value * 255; + testspawnthing->cgd.color[1] = cg_te_color_g->value * 255; + testspawnthing->cgd.color[2] = cg_te_color_b->value * 255; + testspawnthing->cgd.accel[0] = cg_te_accel_x->value; + testspawnthing->cgd.accel[1] = cg_te_accel_y->value; + testspawnthing->cgd.accel[2] = cg_te_accel_z->value; + testspawnthing->count = cg_te_count->value; + testspawnthing->spawnRate = ( 1.0f / cg_te_spawnrate->value ) * 1000.0f; + testspawnthing->cgd.scaleRate = cg_te_scalerate->value; + testspawnthing->sphereRadius = cg_te_radius->value; + testspawnthing->forwardVelocity = cg_te_forwardvelocity->value; + + // Orgin Offset + testspawnthing->origin_offset[0] = cg_te_orgoffset_x->value; + testspawnthing->origin_offset[1] = cg_te_orgoffset_y->value; + testspawnthing->origin_offset[2] = cg_te_orgoffset_z->value; + + if ( !strcmp( cg_te_rorgx->string, "No" ) ) + testspawnthing->randorg[0] = NOT_RANDOM; + else if ( !strcmp( cg_te_rorgx->string, "Cr" ) ) + testspawnthing->randorg[0] = CRANDOM; + else if ( !strcmp( cg_te_rorgx->string, "Ra" ) ) + testspawnthing->randorg[0] = RANDOM; + + if ( !strcmp( cg_te_rorgy->string, "No" ) ) + testspawnthing->randorg[1] = NOT_RANDOM; + else if ( !strcmp( cg_te_rorgy->string, "Cr" ) ) + testspawnthing->randorg[1] = CRANDOM; + else if ( !strcmp( cg_te_rorgy->string, "Ra" ) ) + testspawnthing->randorg[1] = RANDOM; + + if ( !strcmp( cg_te_rorgz->string, "No" ) ) + testspawnthing->randorg[2] = NOT_RANDOM; + else if ( !strcmp( cg_te_rorgz->string, "Cr" ) ) + testspawnthing->randorg[2] = CRANDOM; + else if ( !strcmp( cg_te_rorgz->string, "Ra" ) ) + testspawnthing->randorg[2] = RANDOM; + + // Random angles + testspawnthing->cgd.angles[PITCH] = cg_te_angles_pitch->value; + testspawnthing->cgd.angles[YAW] = cg_te_angles_yaw->value; + testspawnthing->cgd.angles[ROLL] = cg_te_angles_roll->value; + + if ( !strcmp( cg_te_randpitch->string, "No" ) ) + testspawnthing->randangles[0] = NOT_RANDOM; + else if ( !strcmp( cg_te_randpitch->string, "Cr" ) ) + testspawnthing->randangles[0] = CRANDOM; + else if ( !strcmp( cg_te_randpitch->string, "Ra" ) ) + testspawnthing->randangles[0] = RANDOM; + + if ( !strcmp( cg_te_randyaw->string, "No" ) ) + testspawnthing->randangles[0] = NOT_RANDOM; + else if ( !strcmp( cg_te_randyaw->string, "Cr" ) ) + testspawnthing->randangles[0] = CRANDOM; + else if ( !strcmp( cg_te_randyaw->string, "Ra" ) ) + testspawnthing->randangles[0] = RANDOM; + + if ( !strcmp( cg_te_randroll->string, "No" ) ) + testspawnthing->randangles[0] = NOT_RANDOM; + else if ( !strcmp( cg_te_randroll->string, "Cr" ) ) + testspawnthing->randangles[0] = CRANDOM; + else if ( !strcmp( cg_te_randroll->string, "Ra" ) ) + testspawnthing->randangles[0] = RANDOM; + + // Random Velocity + testspawnthing->velocityVariation[0] = cg_te_randvelx->value; + testspawnthing->velocityVariation[1] = cg_te_randvely->value; + testspawnthing->velocityVariation[2] = cg_te_randvelz->value; + + if ( !strcmp( cg_te_rvxtype->string, "No" ) ) + testspawnthing->randvel[0] = NOT_RANDOM; + else if ( !strcmp( cg_te_rvxtype->string, "Cr" ) ) + testspawnthing->randvel[0] = CRANDOM; + else if ( !strcmp( cg_te_rvxtype->string, "Ra" ) ) + testspawnthing->randvel[0] = RANDOM; + + if ( !strcmp( cg_te_rvytype->string, "No" ) ) + testspawnthing->randvel[1] = NOT_RANDOM; + else if ( !strcmp( cg_te_rvytype->string, "Cr" ) ) + testspawnthing->randvel[1] = CRANDOM; + else if ( !strcmp( cg_te_rvytype->string, "Ra" ) ) + testspawnthing->randvel[1] = RANDOM; + + if ( !strcmp( cg_te_rvztype->string, "No" ) ) + testspawnthing->randvel[2] = NOT_RANDOM; + else if ( !strcmp( cg_te_rvztype->string, "Cr" ) ) + testspawnthing->randvel[2] = CRANDOM; + else if ( !strcmp( cg_te_rvztype->string, "Ra" ) ) + testspawnthing->randvel[2] = RANDOM; + + testspawnthing->cgd.scalemin = cg_te_scalemin->value; + testspawnthing->cgd.scalemax = cg_te_scalemax->value; + + if ( testspawnthing->cgd.scalemin || testspawnthing->cgd.scalemax ) + testspawnthing->cgd.flags |= T_RANDSCALE; + else + testspawnthing->cgd.flags &= ~T_RANDSCALE; + + if ( cg_te_dietouch->integer ) + testspawnthing->cgd.flags |= T_DIETOUCH; + else + testspawnthing->cgd.flags &= ~T_DIETOUCH; + + if ( cg_te_fade->integer ) + testspawnthing->cgd.flags |= T_FADE; + else + testspawnthing->cgd.flags &= ~T_FADE; + + if ( cg_te_circle->integer ) + testspawnthing->cgd.flags |= T_CIRCLE; + else + testspawnthing->cgd.flags &= ~T_CIRCLE; + + if ( cg_te_sphere->integer ) + testspawnthing->cgd.flags |= T_SPHERE; + else + testspawnthing->cgd.flags &= ~T_SPHERE; + + if ( cg_te_insphere->integer ) + testspawnthing->cgd.flags |= T_INWARDSPHERE; + else + testspawnthing->cgd.flags &= ~T_INWARDSPHERE; + + if ( cg_te_align->integer ) + testspawnthing->cgd.flags |= T_ALIGN; + else + testspawnthing->cgd.flags &= ~T_ALIGN; + + if ( cg_te_flickeralpha->integer ) + testspawnthing->cgd.flags |= T_FLICKERALPHA; + else + testspawnthing->cgd.flags &= ~T_FLICKERALPHA; + + if ( cg_te_randomroll->integer ) + testspawnthing->cgd.flags |= T_RANDOMROLL; + else + testspawnthing->cgd.flags &= ~T_RANDOMROLL; + +#if 0 + testspawnthing->cgd.cg_te_globalfade; + testspawnthing->cgd.cg_te_collision; + testspawnthing->cgd.cg_te_swarm; + testspawnthing->cgd.cg_te_wavy; +#endif + } + +void ClientGameCommandManager::TestEmitter + ( + void + ) + + { + // Create a test emitter that can be modified by the user + + // Init the emitter + testspawnthing = CreateNewEmitter(); + if( !testspawnthing ) + { + return; + } + + // Get the emitter's name + testspawnthing->emittername = "TestEmitter"; + + // Set the origin of the emitter + VectorMA( cg.refdef.vieworg, 100, cg.refdef.viewaxis[0], testspawnthing->cgd.origin ); + + float angles[3]; + vec3_t axis[3]; + + angles[PITCH] = 0; + angles[YAW] = cg.refdefViewAngles[1]; + angles[ROLL] = 0; + + AnglesToAxis( angles, axis ); + + testspawnthing->forward = axis[0]; + testspawnthing->right = axis[1]; + testspawnthing->up = axis[2]; + testspawnthing->cgd.tikihandle = 9999999; + SetTestEmitterValues(); + } + +void CG_TestEmitter_f + ( + void + ) + + { + commandManager.TestEmitter(); + } + +void CG_DumpEmitter_f + ( + void + ) + + { + commandManager.DumpEmitter(); + } + +void CG_UpdateTestEmitter + ( + void + ) + + { + commandManager.UpdateTestEmitter(); + } + + +void CG_InitTestEmitter + ( + void + ) + + { + cg_te_xangles = cgi.Cvar_Get( "cg_te_xangles", "0", 0 ); + cg_te_yangles = cgi.Cvar_Get( "cg_te_yangles", "0", 0 ); + cg_te_zangles = cgi.Cvar_Get( "cg_te_zangles", "0", 0 ); + cg_te_life = cgi.Cvar_Get( "cg_te_life", "1", 0 ); + cg_te_alpha = cgi.Cvar_Get( "cg_te_alpha", "1", 0 ); + cg_te_dietouch = cgi.Cvar_Get( "cg_te_dietouch", "0", 0 ); + cg_te_bouncefactor = cgi.Cvar_Get( "cg_te_bouncefactor", "1", 0 ); + cg_te_scale = cgi.Cvar_Get( "cg_te_scale", "1", 0 ); + cg_te_scalemin = cgi.Cvar_Get( "cg_te_scalemin", "0", 0 ); + cg_te_scalemax = cgi.Cvar_Get( "cg_te_scalemax", "0", 0 ); + cg_te_model = cgi.Cvar_Get( "cg_te_model", "none", 0 ); + cg_te_life = cgi.Cvar_Get( "cg_te_life", "1", 0 ); + cg_te_color_r = cgi.Cvar_Get( "cg_te_color_r", "1", 0 ); + cg_te_color_g = cgi.Cvar_Get( "cg_te_color_g", "1", 0 ); + cg_te_color_b = cgi.Cvar_Get( "cg_te_color_b", "1", 0 ); + cg_te_startcolor_r = cgi.Cvar_Get( "cg_te_startcolor_r", "1", 0 ); + cg_te_startcolor_g = cgi.Cvar_Get( "cg_te_startcolor_g", "1", 0 ); + cg_te_startcolor_b = cgi.Cvar_Get( "cg_te_startcolor_b", "1", 0 ); + cg_te_endcolor_r = cgi.Cvar_Get( "cg_te_endcolor_r", "1", 0 ); + cg_te_endcolor_g = cgi.Cvar_Get( "cg_te_endcolor_g", "1", 0 ); + cg_te_endcolor_b = cgi.Cvar_Get( "cg_te_endcolor_b", "1", 0 ); + cg_te_accel_x = cgi.Cvar_Get( "cg_te_accel_x", "0", 0 ); + cg_te_accel_y = cgi.Cvar_Get( "cg_te_accel_y", "0", 0 ); + cg_te_accel_z = cgi.Cvar_Get( "cg_te_accel_z", "0", 0 ); + cg_te_count = cgi.Cvar_Get( "cg_te_count", "1", 0 ); + cg_te_fade = cgi.Cvar_Get( "cg_te_fade", "0", 0 ); + cg_te_fadein = cgi.Cvar_Get( "cg_te_fadein", "0", 0 ); + cg_te_spawnrate = cgi.Cvar_Get( "cg_te_spawnrate", "1", 0 ); + cg_te_scalerate = cgi.Cvar_Get( "cg_te_scalerate", "0", 0 ); + cg_te_circle = cgi.Cvar_Get( "cg_te_circle", "0", 0 ); + cg_te_sphere = cgi.Cvar_Get( "cg_te_sphere", "0", 0 ); + cg_te_insphere = cgi.Cvar_Get( "cg_te_insphere", "0", 0 ); + cg_te_radius = cgi.Cvar_Get( "cg_te_radius", "0", 0 ); + cg_te_swarm = cgi.Cvar_Get( "cg_te_swarm", "0", 0 ); + cg_te_wavy = cgi.Cvar_Get( "cg_te_wavy", "0", 0 ); + cg_te_align = cgi.Cvar_Get( "cg_te_align", "0", 0 ); + cg_te_flickeralpha = cgi.Cvar_Get( "cg_te_flickeralpha", "0", 0 ); + cg_te_collision = cgi.Cvar_Get( "cg_te_collision", "0", 0 ); + cg_te_globalfade = cgi.Cvar_Get( "cg_te_globalfade", "0", 0 ); + cg_te_randomroll = cgi.Cvar_Get( "cg_te_randomroll", "0", 0 ); + + cg_te_orgoffset_x = cgi.Cvar_Get( "cg_te_orgoffset_x", "0", 0 ); + cg_te_orgoffset_y = cgi.Cvar_Get( "cg_te_orgoffset_y", "0", 0 ); + cg_te_orgoffset_z = cgi.Cvar_Get( "cg_te_orgoffset_z", "0", 0 ); + cg_te_rorgx = cgi.Cvar_Get( "cg_te_rorgx", "No", 0 ); + cg_te_rorgy = cgi.Cvar_Get( "cg_te_rorgy", "No", 0 ); + cg_te_rorgz = cgi.Cvar_Get( "cg_te_rorgz", "No", 0 ); + + cg_te_angles_pitch = cgi.Cvar_Get( "cg_te_angles_pitch", "0", 0 ); + cg_te_angles_yaw = cgi.Cvar_Get( "cg_te_angles_yaw", "0", 0 ); + cg_te_angles_roll = cgi.Cvar_Get( "cg_te_angles_roll", "0", 0 ); + cg_te_randpitch = cgi.Cvar_Get( "cg_te_randpitch", "No", 0 ); + cg_te_randyaw = cgi.Cvar_Get( "cg_te_randyaw", "No", 0 ); + cg_te_randroll = cgi.Cvar_Get( "cg_te_randroll", "No", 0 ); + + cg_te_randvelx = cgi.Cvar_Get( "cg_te_randvelx", "0", 0 ); + cg_te_randvely = cgi.Cvar_Get( "cg_te_randvely", "0", 0 ); + cg_te_randvelz = cgi.Cvar_Get( "cg_te_randvelz", "0", 0 ); + cg_te_rvxtype = cgi.Cvar_Get( "cg_te_rvxtype", "No", 0 ); + cg_te_rvytype = cgi.Cvar_Get( "cg_te_rvytype", "No", 0 ); + cg_te_rvztype = cgi.Cvar_Get( "cg_te_rvztype", "No", 0 ); + + cg_te_forwardvelocity = cgi.Cvar_Get( "cg_te_forwardvel", "0", 0 ); + } + + diff --git a/source/source/cgame/cg_vector.h b/source/source/cgame/cg_vector.h new file mode 100644 index 0000000..37e40ff --- /dev/null +++ b/source/source/cgame/cg_vector.h @@ -0,0 +1,862 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/cgame/cg_vector.h $ +// $Revision:: 1 $ +// $Author:: Aldie $ +// $Date:: 9/10/99 2:46p $ +// +// Copyright (C) 1997 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/cgame/cg_vector.h $ +// +// 1 9/10/99 2:46p Aldie +// +// 1 9/09/99 5:06p Aldie +// +// DESCRIPTION: +// C++ implemention of a Vector object. Handles standard vector operations +// such as addition, subtraction, normalization, scaling, dot product, +// cross product, length, and decomposition into Euler angles. +// + +#ifndef __VECTOR_H__ +#define __VECTOR_H__ + +#include +#include + +class Vector + { + public: + float x; + float y; + float z; + + Vector(); + Vector( vec3_t src ); + Vector( double x, double y, double z ); + Vector( const char *text ); + + float *vec3( void ); + float pitch( void ); + float yaw( void ); + float roll( void ); + float operator[]( int index ) const; + float& operator[]( int index ); + void copyTo( vec3_t vec ); + void setPitch( double x ); + void setYaw( double y ); + void setRoll( double z ); + void setXYZ( double x, double y, double z ); + void operator=( Vector a ); + void operator=( vec3_t a ); + friend Vector operator+( Vector a, Vector b ); + Vector& operator+=( Vector a ); + friend Vector operator-( Vector a, Vector b ); + Vector& operator-=( Vector a ); + friend Vector operator*( Vector a, double b ); + friend Vector operator*( double a, Vector b ); + friend float operator*( Vector a, Vector b ); + Vector& operator*=( double a ); + friend int operator==( Vector a, Vector b ); + friend int operator!=( Vector a, Vector b ); + Vector& CrossProduct( Vector a, Vector b ); + float length( void ); + Vector& normalize( void ); +#if 0 +//FIXME +// Some kind of compiler bug in VC++ prevents this from working. +// Returns result of ( -x, -y, -x ) for some reason + Vector& operator-(); +#endif + friend Vector fabs( Vector a ); + float toYaw( void ); + float toPitch( void ); + Vector toAngles( void ); + void AngleVectors( Vector *forward, Vector *right, Vector *up ); + friend Vector LerpVector( Vector w1, Vector w2, float t ); + friend float MaxValue( Vector a ); + }; + +inline float Vector::pitch( void ) { return x; } +inline float Vector::yaw( void ) { return y; } +inline float Vector::roll( void ) { return z; } +inline void Vector::setPitch( double pitch ) { x = ( float )pitch; } +inline void Vector::setYaw( double yaw ) { y = ( float )yaw; } +inline void Vector::setRoll( double roll ) { z = ( float )roll; } + +inline void Vector::copyTo + ( + vec3_t vec + ) + + { + vec[ 0 ] = x; + vec[ 1 ] = y; + vec[ 2 ] = z; + } + +inline float Vector::operator[] + ( + int index + ) const + + { + assert( ( index >= 0 ) && ( index < 3 ) ); + return ( &x )[ index ]; + } + +inline float& Vector::operator[] + ( + int index + ) + + { + assert( ( index >= 0 ) && ( index < 3 ) ); + return ( &x )[ index ]; + } + +inline void Vector::setXYZ + ( + double x, + double y, + double z + ) + + { + this->x = x; + this->y = y; + this->z = z; + } + +inline Vector::Vector() + { + x = 0; + y = 0; + z = 0; + } + +inline Vector::Vector + ( + vec3_t src + ) + + { + x = src[ 0 ]; + y = src[ 1 ]; + z = src[ 2 ]; + } + +inline Vector::Vector + ( + double x, + double y, + double z + ) + + { + this->x = x; + this->y = y; + this->z = z; + } + +inline Vector::Vector + ( + const char *text + ) + + { + if ( text ) + { + sscanf( text, "%f %f %f", &x, &y, &z ); + } + else + { + x = 0; + y = 0; + z = 0; + } + } + +inline float *Vector::vec3 + ( + void + ) + + { + return &x; + } + +inline void Vector::operator= + ( + Vector a + ) + + { + x = a.x; + y = a.y; + z = a.z; + } + +inline void Vector::operator= + ( + vec3_t a + ) + + { + x = a[ 0 ]; + y = a[ 1 ]; + z = a[ 2 ]; + } + +inline Vector operator+ + ( + Vector a, + Vector b + ) + + { + return Vector( a.x + b.x, a.y + b.y, a.z + b.z ); + } + +inline Vector& Vector::operator+= + ( + Vector a + ) + + { + x += a.x; + y += a.y; + z += a.z; + + return *this; + } + +inline Vector operator- + ( + Vector a, + Vector b + ) + + { + return Vector( a.x - b.x, a.y - b.y, a.z - b.z ); + } + +inline Vector& Vector::operator-= + ( + Vector a + ) + + { + x -= a.x; + y -= a.y; + z -= a.z; + + return *this; + } + +inline Vector operator* + ( + Vector a, + double b + ) + + { + return Vector( a.x * b, a.y * b, a.z * b ); + } + +inline Vector operator* + ( + double a, + Vector b + ) + + { + return b * a; + } + +inline float operator* + ( + Vector a, + Vector b + ) + + { + return a.x * b.x + a.y * b.y + a.z * b.z; + } + +inline Vector& Vector::operator*= + ( + double a + ) + + { + x *= a; + y *= a; + z *= a; + + return *this; + } + +inline int operator== + ( + Vector a, + Vector b + ) + + { + return ( ( a.x == b.x ) && ( a.y == b.y ) && ( a.z == b.z ) ); + } + +inline int operator!= + ( + Vector a, + Vector b + ) + + { + return ( ( a.x != b.x ) || ( a.y != b.y ) || ( a.z != b.z ) ); + } + +inline Vector& Vector::CrossProduct + ( + Vector a, + Vector b + ) + + { + x = a.y * b.z - a.z * b.y; + y = a.z * b.x - a.x * b.z; + z = a.x * b.y - a.y * b.x; + + return *this; + } + +inline float Vector::length + ( + void + ) + + { + float length; + + length = x * x + y * y + z * z; + return ( float )sqrt( length ); + } + +inline Vector& Vector::normalize + ( + void + ) + + { + float length, ilength; + + length = this->length(); + if ( length ) + { + ilength = 1 / length; + x *= ilength; + y *= ilength; + z *= ilength; + } + + return *this; + } + +#if 0 +//FIXME +// Some kind of compiler bug in VC++ prevents this from working. +// Returns result of ( -x, -y, -x ) for some reason +inline Vector& Vector::operator-() + { + return Vector( -x, -y, -z ); + } +#endif + +inline Vector fabs + ( + Vector a + ) + + { + return Vector( fabs( a.x ), fabs( a.y ), fabs( a.z ) ); + } + +inline float MaxValue + ( + Vector a + ) + + { + float maxy; + float maxz; + float max; + + max = fabs( a.x ); + maxy = fabs( a.y ); + maxz = fabs( a.z ); + if ( maxy > max ) + max = maxy; + if ( maxz > max ) + max = maxz; + return max; + } + +inline float Vector::toYaw + ( + void + ) + + { + float yaw; + + if ( ( y == 0 ) && ( x == 0 ) ) + { + yaw = 0; + } + else + { + yaw = ( float )( ( int )( atan2( y, x ) * 180 / M_PI ) ); + if ( yaw < 0 ) + { + yaw += 360; + } + } + + return yaw; + } + +inline float Vector::toPitch + ( + void + ) + + { + float forward; + float pitch; + + if ( ( x == 0 ) && ( y == 0 ) ) + { + if ( z > 0 ) + { + pitch = 90; + } + else + { + pitch = 270; + } + } + else + { + forward = ( float )sqrt( x * x + y * y ); + pitch = ( float )( ( int )( atan2( z, forward ) * 180 / M_PI ) ); + if ( pitch < 0 ) + { + pitch += 360; + } + } + + return pitch; + } + +inline Vector Vector::toAngles + ( + void + ) + + { + float forward; + float yaw, pitch; + + if ( ( x == 0 ) && ( y == 0 ) ) + { + yaw = 0; + if ( z > 0 ) + { + pitch = 90; + } + else + { + pitch = 270; + } + } + else + { + yaw = atan2( y, x ) * 180 / M_PI; + if ( yaw < 0 ) + { + yaw += 360; + } + + forward = ( float )sqrt( x * x + y * y ); + pitch = atan2( z, forward ) * 180 / M_PI; + if ( pitch < 0 ) + { + pitch += 360; + } + } + + return Vector( pitch, yaw, 0 ); + } + +inline void Vector::AngleVectors + ( + Vector *forward, + Vector *right, + Vector *up + ) + + { + float angle; + static float sr, sp, sy, cr, cp, cy; // static to help MS compiler fp bugs + + angle = yaw() * ( M_PI * 2 / 360 ); + sy = sin( angle ); + cy = cos( angle ); + + angle = pitch() * ( M_PI * 2 / 360 ); + sp = sin( angle ); + cp = cos( angle ); + + angle = roll() * ( M_PI * 2 / 360 ); + sr = sin( angle ); + cr = cos( angle ); + + if ( forward ) + { + forward->setXYZ( cp * cy, cp * sy, -sp ); + } + + if ( right ) + { + right->setXYZ( -1 * sr * sp * cy + -1 * cr * -sy, -1 * sr * sp * sy + -1 * cr * cy, -1 * sr * cp ); + } + + if ( up ) + { + up->setXYZ( cr * sp * cy + -sr * -sy, cr * sp * sy + -sr * cy, cr * cp ); + } + } + + +#define LERP_DELTA 1e-6 +inline Vector LerpVector + ( + Vector w1, + Vector w2, + float t + ) + { + double omega, cosom, sinom, scale0, scale1; + + w1.normalize(); + w2.normalize(); + + cosom = w1 * w2; + if ( ( 1.0 - cosom ) > LERP_DELTA ) + { + omega = acos( cosom ); + sinom = sin( omega ); + scale0 = sin( ( 1.0 - t ) * omega ) / sinom; + scale1 = sin( t * omega ) / sinom; + } + else + { + scale0 = 1.0 - t; + scale1 = t; + } + + return ( w1 * scale0 + w2 * scale1 ); + } + +class Quat + { + public: + float x; + float y; + float z; + float w; + + Quat(); + Quat( Vector angles ); + Quat( float scrMatrix[ 3 ][ 3 ] ); + Quat( double x, double y, double z, double w ); + + float *vec4( void ); + float operator[]( int index ) const; + float& operator[]( int index ); + void set( double x, double y, double z, double w ); + void operator=( Quat a ); + friend Quat operator+( Quat a, Quat b ); + Quat& operator+=( Quat a ); + friend Quat operator-( Quat a, Quat b ); + Quat& operator-=( Quat a ); + friend Quat operator*( Quat a, double b ); + friend Quat operator*( double a, Quat b ); + Quat& operator*=( double a ); + friend int operator==( Quat a, Quat b ); + friend int operator!=( Quat a, Quat b ); + float length( void ); + Quat& normalize( void ); + Quat operator-(); + Vector toAngles( void ); + }; + +inline float Quat::operator[] + ( + int index + ) const + + { + assert( ( index >= 0 ) && ( index < 4 ) ); + return ( &x )[ index ]; + } + +inline float& Quat::operator[] + ( + int index + ) + + { + assert( ( index >= 0 ) && ( index < 4 ) ); + return ( &x )[ index ]; + } + +inline float *Quat::vec4 + ( + void + ) + + { + return &x; + } + +inline void Quat::set + ( + double x, + double y, + double z, + double w + ) + + { + this->x = x; + this->y = y; + this->z = z; + this->w = w; + } + +inline Quat::Quat() + { + x = 0; + y = 0; + z = 0; + w = 0; + } + +inline Quat::Quat + ( + Vector Angles + ) + + { + EulerToQuat( Angles.vec3(), this->vec4() ); + } + +inline Quat::Quat + ( + float srcMatrix[ 3 ][ 3 ] + ) + + { + MatToQuat( srcMatrix, this->vec4() ); + } + +inline Quat::Quat + ( + double x, + double y, + double z, + double w + ) + + { + this->x = x; + this->y = y; + this->z = z; + this->w = w; + } + +inline void Quat::operator= + ( + Quat a + ) + + { + x = a.x; + y = a.y; + z = a.z; + w = a.w; + } + +inline Quat operator+ + ( + Quat a, + Quat b + ) + + { + return Quat( a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w ); + } + +inline Quat& Quat::operator+= + ( + Quat a + ) + + { + x += a.x; + y += a.y; + z += a.z; + w += a.w; + + return *this; + } + +inline Quat operator- + ( + Quat a, + Quat b + ) + + { + return Quat( a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w ); + } + +inline Quat& Quat::operator-= + ( + Quat a + ) + + { + x -= a.x; + y -= a.y; + z -= a.z; + w -= a.w; + + return *this; + } + +inline Quat operator* + ( + Quat a, + double b + ) + + { + return Quat( a.x * b, a.y * b, a.z * b, a.w * b ); + } + +inline Quat operator* + ( + double a, + Quat b + ) + + { + return b * a; + } + +inline Quat& Quat::operator*= + ( + double a + ) + + { + x *= a; + y *= a; + z *= a; + w *= a; + + return *this; + } + +inline int operator== + ( + Quat a, + Quat b + ) + + { + return ( ( a.x == b.x ) && ( a.y == b.y ) && ( a.z == b.z ) && ( a.w == b.w ) ); + } + +inline int operator!= + ( + Quat a, + Quat b + ) + + { + return ( ( a.x != b.x ) || ( a.y != b.y ) || ( a.z != b.z ) && ( a.w != b.w ) ); + } + +inline float Quat::length + ( + void + ) + + { + float length; + + length = x * x + y * y + z * z + w * w; + return ( float )sqrt( length ); + } + +inline Quat& Quat::normalize + ( + void + ) + + { + float length, ilength; + + length = this->length(); + if ( length ) + { + ilength = 1 / length; + x *= ilength; + y *= ilength; + z *= ilength; + w *= ilength; + } + + return *this; + } + +inline Quat Quat::operator-() + { + return Quat( -x, -y, -z, -w ); + } + +inline Vector Quat::toAngles + ( + void + ) + + { + float m[ 3 ][ 3 ]; + vec3_t angles; + + QuatToMat( this->vec4(), m ); + MatrixToEulerAngles( m, angles ); + return Vector( angles ); + } + +extern Vector vec_zero; +#endif /* Vector.h */ diff --git a/source/source/cgame/cg_view.c b/source/source/cgame/cg_view.c new file mode 100644 index 0000000..5627828 --- /dev/null +++ b/source/source/cgame/cg_view.c @@ -0,0 +1,663 @@ + +#include "cg_local.h" + +//============================================================================ + +/* +================= +CG_CalcVrect + +Sets the coordinates of the rendered window +================= +*/ +static void CG_CalcVrect (void) { + int size; + + // the intermission should allways be full screen + if ( cg.snap->ps.pm_flags & PMF_INTERMISSION ) { + size = 100; + } else { + // bound normal viewsize + if (cg_viewsize->integer < 30) { + cgi.Cvar_Set ("viewsize","30"); + size = 30; + } else if (cg_viewsize->integer > 100) { + cgi.Cvar_Set ("viewsize","100"); + size = 100; + } else { + size = cg_viewsize->integer; + } + + } + cg.refdef.width = cgs.glconfig.vidWidth*size/100; + cg.refdef.width &= ~1; + + cg.refdef.height = cgs.glconfig.vidHeight*size/100; + cg.refdef.height &= ~1; + + cg.refdef.x = (cgs.glconfig.vidWidth - cg.refdef.width)/2; + cg.refdef.y = (cgs.glconfig.vidHeight - cg.refdef.height)/2; +} + +//============================================================================== + + +/* +=============== +CG_OffsetThirdPersonView + +=============== +*/ +#define CAMERA_MINIMUM_DISTANCE 40 +static void CG_OffsetThirdPersonView( void ) +{ + vec3_t forward; + vec3_t original_camera_position; + vec3_t new_vieworg; + trace_t trace; + vec3_t min, max; + float *look_offset; + float *target_angles; + float *target_position; + vec3_t delta; + vec3_t original_angles; + qboolean lookactive, resetview; + static vec3_t saved_look_offset; + vec3_t camera_offset; + + target_angles = cg.refdefViewAngles; + target_position = cg.refdef.vieworg; + + // see if angles are absolute + if ( cg.predicted_player_state.camera_flags & CF_CAMERA_ANGLES_ABSOLUTE ) + { + VectorClear( target_angles ); + } + + // see if we need to ignore yaw + if ( cg.predicted_player_state.camera_flags & CF_CAMERA_ANGLES_IGNORE_YAW ) + { + target_angles[ YAW ] = 0; + } + + // see if we need to ignore pitch + if ( cg.predicted_player_state.camera_flags & CF_CAMERA_ANGLES_IGNORE_PITCH ) + { + target_angles[ PITCH ] = 0; + } + + // offset the current angles by the camera offset + VectorSubtract( target_angles, cg.predicted_player_state.camera_offset, target_angles ); + + // Get the position of the camera after any needed rotation + look_offset = cgi.get_camera_offset( &lookactive, &resetview ); + + if ( + ( !resetview ) && + ( + ( cg.predicted_player_state.camera_flags & CF_CAMERA_ANGLES_ALLOWOFFSET ) || + ( lookactive ) + ) + ) + { + VectorSubtract( look_offset, saved_look_offset, camera_offset ); + VectorAdd( target_angles, camera_offset, target_angles ); + if ( target_angles[ PITCH ] > 90 ) + target_angles[ PITCH ] = 90; + else if ( target_angles[ PITCH ] < -90 ) + target_angles[ PITCH ] = -90; + } + else + { + VectorCopy( look_offset, saved_look_offset ); + } + + target_angles[ YAW ] = AngleNormalize360( target_angles[ YAW ] ); + target_angles[ PITCH ] = AngleNormalize180( target_angles[ PITCH ] ); + + // Move reference point up + + target_position[2] += cg_cameraheight->value; + + VectorCopy(target_position, original_camera_position); + + // Move camera back from reference point + + AngleVectors(target_angles, forward, NULL, NULL); + + VectorMA(target_position, -cg_cameradist->value, forward, new_vieworg); + + new_vieworg[ 2 ] += cg_cameraverticaldisplacement->value; + + // Create a bounding box for our camera + + min[0] = -5; + min[1] = -5; + min[2] = -5; + + max[0] = 5; + max[1] = 5; + max[2] = 5; + + // Make sure camera does not collide with anything + CG_Trace(&trace, cg.playerHeadPos, min, max, new_vieworg, 0, MASK_CAMERASOLID, qfalse, qtrue, "ThirdPersonTrace 1" ); + + VectorCopy(trace.endpos, target_position); + + // calculate distance from end position to head position + VectorSubtract( target_position, cg.playerHeadPos, delta ); + // kill any negative z difference in delta + if ( delta[ 2 ] < CAMERA_MINIMUM_DISTANCE ) + delta[ 2 ] = 0; + if ( VectorLength( delta ) < CAMERA_MINIMUM_DISTANCE ) + { + VectorNormalize( delta); +/* + // see if we are going straight up + if ( ( delta[ 2 ] > 0.75 ) && ( height > 0.85f * cg.predicted_player_state.viewheight ) ) + { + // we just need to lower our start position slightly, since we are on top of the player + new_vieworg[ 2 ] -= 16; + CG_Trace(&trace, cg.playerHeadPos, min, max, new_vieworg, 0, MASK_CAMERASOLID, qfalse, true, "ThirdPersonTrace 2" ); + VectorCopy(trace.endpos, target_position); + } + else +*/ + { + // we are probably up against the wall so we want the camera to pitch up on top of the player + // save off the original angles + VectorCopy( target_angles, original_angles ); + // start cranking up the target angles, pitch until we are the correct distance away from the player + while ( target_angles[ PITCH ] < 90 ) + { + target_angles[ PITCH ] += 2; + + AngleVectors(target_angles, forward, NULL, NULL); + + VectorMA( original_camera_position, -cg_cameradist->value, forward, new_vieworg); + + new_vieworg[ 2 ] += cg_cameraverticaldisplacement->value; + + CG_Trace(&trace, cg.playerHeadPos, min, max, new_vieworg, 0, MASK_CAMERASOLID, qfalse, qtrue, "ThirdPersonTrace 3" ); + + VectorCopy(trace.endpos, target_position); + + // calculate distance from end position to head position + VectorSubtract( target_position, cg.playerHeadPos, delta ); + // kill any negative z difference in delta + if ( delta[ 2 ] < 0 ) + delta[ 2 ] = 0; + if ( VectorLength( delta ) >= CAMERA_MINIMUM_DISTANCE ) + { + target_angles[ PITCH ] = ( 0.25f * target_angles[ PITCH ] ) + ( 0.75f * original_angles[ PITCH ] ); + // set the pitch to be that of the angle we are currently looking + //target_angles[ PITCH ] = original_angles[ PITCH ]; + break; + } + } + if ( target_angles[ PITCH ] > 90 ) + { + // if we failed, go with the original angles + target_angles[ PITCH ] = original_angles[ PITCH ]; + } + } + } + } + +/* +=============== +CG_OffsetFirstPersonView + +=============== +*/ +static void CG_OffsetFirstPersonView( void ) + { + float *origin; + float *angles; +#if 0 + float delta; + float f; +#endif + + // FIXME, rewrite this to just use what we need + + origin = cg.refdef.vieworg; + angles = cg.refdefViewAngles; + + // if dead, fix the angle and don't add any kick + if ( cg.snap->ps.stats[STAT_HEALTH] <= 0 ) { + angles[ROLL] = 40; + angles[PITCH] = -15; + angles[YAW] = cg.snap->ps.stats[STAT_DEAD_YAW]; + origin[2] += cg.predicted_player_state.viewheight; + return; + } + + //=================================== + + +#if 0 + // smooth out duck height changes + delta = cg.time - cg.duckTime; + if (delta < DUCK_TIME) { + cg.refdef.vieworg[2] -= cg.duckChange + * (DUCK_TIME - delta) / DUCK_TIME; + } + + // add fall height + delta = cg.time - cg.landTime; + if ( delta < LAND_DEFLECT_TIME ) { + f = delta / LAND_DEFLECT_TIME; + cg.refdef.vieworg[2] += cg.landChange * f; + } else if ( delta < LAND_DEFLECT_TIME + LAND_RETURN_TIME ) { + delta -= LAND_DEFLECT_TIME; + f = 1.0 - ( delta / LAND_RETURN_TIME ); + cg.refdef.vieworg[2] += cg.landChange * f; + } +#endif + + // add kick offset + VectorAdd (origin, cg.kick_origin, origin); + } + +/* +=============== +CG_InterpolateView + +=============== +*/ +static void CG_InterpolateView( void ) + { + float timedelta; + float scale; + vec3_t target_angles; + vec3_t target_position; + vec3_t delta_angles; + vec3_t delta_position; + + // if we just started out, or there is a camera cut, cut! + if ( + ( cg.lastCameraTime == -1 ) || + ( + ( cg.predicted_player_state.camera_flags & CF_CAMERA_CUT_BIT ) != + ( cg.lastCameraFlags & CF_CAMERA_CUT_BIT ) + ) + ) + { + // if we reset just set scale to 1 + timedelta = 0; + scale = 1; + } + else + { + timedelta = ( cg.time - cg.lastCameraTime ) / 1000.0f; + if ( paused->integer ) + { + scale = cg_camerascale->value; + } + else + { + scale = timedelta * cg_camerascale->value * 30.0f; + if ( scale > 1.0f ) + scale = 1.0f; + if ( scale < 0 ) + scale = 0; + } + } + + // save off cameraFlags + cg.lastCameraFlags = cg.predicted_player_state.camera_flags; + + // save off cameraTime + cg.lastCameraTime = cg.time; + + if ( cg.predicted_player_state.pm_flags & PMF_CAMERA_VIEW ) + { + if ( !cg.inCameraView ) + { + // we just entered camera view + cg.inCameraView = qtrue; + cg.lerpCameraTime = cg.predicted_player_state.camera_time; + } + // copy off target_angles and target_origin + VectorCopy( cg.camera_origin, target_position ); + VectorCopy( cg.camera_angles, target_angles ); + } + else + { + if ( cg.inCameraView ) + { + // we just left camera view + cg.inCameraView = qfalse; + cg.lerpCameraTime = cg.predicted_player_state.camera_time; + } + // copy off target_angles and target_origin + VectorCopy( cg.refdefViewAngles, target_angles ); + VectorCopy( cg.refdef.vieworg, target_position ); + } + + if ( cg.lerpCameraTime ) + { + scale = cg.lerpCameraTime / cg.snap->ps.camera_time; + cg.lerpCameraTime -= timedelta; + if ( cg.lerpCameraTime < 0 ) + cg.lerpCameraTime = 0; + if ( scale > 1.0f ) + scale = 1.0f; + scale = 1.0f - scale; + } + + if ( cg.lerpCameraTime || ( !( cg.predicted_player_state.pm_flags & PMF_CAMERA_VIEW ) ) ) + { + // interpolate the camera + AnglesSubtract( target_angles, cg.currentViewAngles, delta_angles ); + VectorSubtract( target_position, cg.currentViewPos, delta_position ); + + VectorMA( cg.currentViewAngles, scale, delta_angles, cg.refdefViewAngles ); + VectorMA( cg.currentViewPos, scale, delta_position, cg.refdef.vieworg ); + +#if 0 + // if we are in the normal 3rd person camera make sure we are looking at the player + if ( !cg.lerpCameraTime ) + { + VectorSubtract( cg.playerHeadPos, cg.refdef.vieworg, delta_position ); + vectoangles( delta_position, cg.refdefViewAngles ); + } +#endif + + cg.refdefViewAngles[ 0 ] = AngleMod( cg.refdefViewAngles[ 0 ] ); + cg.refdefViewAngles[ 1 ] = AngleMod( cg.refdefViewAngles[ 1 ] ); + cg.refdefViewAngles[ 2 ] = AngleMod( cg.refdefViewAngles[ 2 ] ); + } + else + { + // just a normal camera view + VectorCopy( cg.camera_origin, cg.refdef.vieworg ); + VectorCopy( cg.camera_angles, cg.refdefViewAngles ); + } + + if ( !cg.lerpCameraTime ) + { + // save off the current position and view + VectorCopy( cg.refdef.vieworg, cg.currentViewPos ); + VectorCopy( cg.refdefViewAngles, cg.currentViewAngles ); + } + } + + +/* +==================== +CG_CalcFov + +Fixed fov at intermissions, otherwise account for fov variable and zooms. +==================== +*/ +#define WAVE_AMPLITUDE 1 +#define WAVE_FREQUENCY 0.4 + +static int CG_CalcFov( void ) + { + float x; + float phase; + float v; + int contents; + float fov_x, fov_y; + int inwater; + + fov_x = cg.camera_fov; + x = cg.refdef.width / tan( fov_x / 360 * M_PI ); + fov_y = atan2( cg.refdef.height, x ); + fov_y = fov_y * 360 / M_PI; + + // warp if underwater + contents = CG_PointContents( cg.refdef.vieworg, -1 ); + if ( contents & ( CONTENTS_WATER | CONTENTS_SLIME | CONTENTS_LAVA ) ){ + phase = cg.time / 1000.0 * WAVE_FREQUENCY * M_PI * 2; + v = WAVE_AMPLITUDE * sin( phase ); + fov_x += v; + fov_y -= v; + inwater = qtrue; + } + else { + inwater = qfalse; + } + + + // set it + cg.refdef.fov_x = fov_x; + cg.refdef.fov_y = fov_y; + + if ( !cg.zoomed ) { + cg.zoomSensitivity = 1; + } else { + cg.zoomSensitivity = cg.refdef.fov_y / 75.0; + } + return inwater; + } + + +/* +=============== +CG_CalcViewValues + +Sets cg.refdef view values +=============== +*/ +static int CG_CalcViewValues( void ) { + playerState_t *ps; + float SoundAngles[3]; + + memset( &cg.refdef, 0, sizeof( cg.refdef ) ); + + // calculate size of 3D view + CG_CalcVrect(); + + // setup fog and far clipping plane + cg.refdef.farplane_distance = cg.farplane_distance; + VectorCopy( cg.farplane_color, cg.refdef.farplane_color ); + cg.refdef.farplane_cull = cg.farplane_cull; + + // setup portal sky + cg.refdef.sky_alpha = cg.sky_alpha; + cg.refdef.sky_portal = cg.sky_portal; + memcpy( cg.refdef.sky_axis, cg.sky_axis, sizeof( cg.sky_axis ) ); + VectorCopy( cg.sky_origin, cg.refdef.sky_origin ); + + ps = &cg.predicted_player_state; + + cg.bobcycle = ( ps->bobCycle & 128 ) >> 7; + cg.bobfracsin = fabs( sin( ( ps->bobCycle & 127 ) / 127.0 * M_PI ) ); + cg.xyspeed = sqrt( ps->velocity[0] * ps->velocity[0] + + ps->velocity[1] * ps->velocity[1] ); + + VectorCopy( ps->origin, cg.refdef.vieworg ); + VectorCopy( ps->viewangles, cg.refdefViewAngles ); + + // add error decay + if ( cg_errorDecay->value > 0 ) + { + int t; + float f; + + t = cg.time - cg.predictedErrorTime; + f = ( cg_errorDecay->value - t ) / cg_errorDecay->value; + if ( f > 0 && f < 1 ) + { + VectorMA( cg.refdef.vieworg, f, cg.predictedError, cg.refdef.vieworg ); + } + else + { + cg.predictedErrorTime = 0; + } + } + + // calculate position of player's head + cg.refdef.vieworg[ 2 ] += cg.predicted_player_state.viewheight; + // save off the position of the player's head + VectorCopy( cg.refdef.vieworg, cg.playerHeadPos ); + + // Set the aural position of the player + VectorCopy( cg.playerHeadPos, cg.SoundOrg ); + + // Set the aural axis of the player + VectorCopy( cg.refdefViewAngles, SoundAngles ); + // yaw is purposely inverted because of the miles sound system + SoundAngles[YAW] = -SoundAngles[YAW]; + AnglesToAxis( SoundAngles, cg.SoundAxis ); + + // decide on third person view + cg.renderingThirdPerson = cg_3rd_person->integer || (cg.snap->ps.stats[STAT_HEALTH] <= 0); + + if ( cg.renderingThirdPerson ) + { + // back away from character + CG_OffsetThirdPersonView(); + } + else + { + CG_OffsetFirstPersonView(); + // offset for local bobbing and kicks + cg.crosshair_offset = 0.0f; + } + + // interpolate the view as necessary + CG_InterpolateView(); + + // if we are in a camera view, we take our audio cues directly from the camera + if ( cg.inCameraView ) + { + // Set the aural position to that of the camera + VectorCopy( cg.refdef.vieworg, cg.SoundOrg ); + + // Set the aural axis to the camera's angles + VectorCopy( cg.refdefViewAngles, SoundAngles ); + // yaw is purposely inverted because of the miles sound system + SoundAngles[YAW] = -SoundAngles[YAW]; + AnglesToAxis( SoundAngles, cg.SoundAxis ); + } + + // offset the current angles by the damage angles + VectorSubtract( cg.refdefViewAngles, cg.predicted_player_state.damage_angles, cg.refdefViewAngles ); + + // position eye reletive to origin + AnglesToAxis( cg.refdefViewAngles, cg.refdef.viewaxis ); + + if ( cg.hyperspace ) { + cg.refdef.rdflags |= RDF_NOWORLDMODEL | RDF_HYPERSPACE; + } + + // field of view + return CG_CalcFov(); +} + +//========================================================================= + +/* +================= +CG_DrawActiveFrame + +Generates and draws a game scene and status information at the given time. +================= +*/ +void CG_DrawActiveFrame( int serverTime, stereoFrame_t stereoView, qboolean demoPlayback ) + { + cg.time = serverTime; + cg.demoPlayback = demoPlayback; + + // if we are only updating the screen as a loading + // pacifier, don't even try to read snapshots + if ( cg.infoScreenText[0] != 0 ) + { + return; + } + + // any looped sounds will be respecified as entities + // are added to the render list + cgi.S_ClearLoopingSounds(); + + // clear all the render lists + cgi.R_ClearScene(); + + // set up cg.snap and possibly cg.nextSnap + CG_ProcessSnapshots(); + + // if we haven't received any snapshots yet, all + // we can draw is the information screen + if ( !cg.snap || ( cg.snap->snapFlags & SNAPFLAG_NOT_ACTIVE ) ) + { + return; + } + + // this counter will be bumped for every valid scene we generate + cg.clientFrame++; + + // set cg.frameInterpolation + if ( cg.nextSnap && r_lerpmodels->integer ) { + int delta; + + delta = (cg.nextSnap->serverTime - cg.snap->serverTime); + if ( delta == 0 ) { + cg.frameInterpolation = 0; + } else { + cg.frameInterpolation = (float)( cg.time - cg.snap->serverTime ) / delta; + } + } else { + cg.frameInterpolation = 0; // actually, it should never be used, because + // no entities should be marked as interpolating + } + + // update cg.predicted_player_state + CG_PredictPlayerState(); + + // build cg.refdef + CG_CalcViewValues(); + + // build the render lists + if ( !cg.hyperspace ) + { + CG_AddPacketEntities(); // after calcViewValues, so predicted player state is correct + CG_AddMarks(); + } + + // finish up the rest of the refdef +#if 0 + if ( cg.testModelEntity.hModel ) + { + CG_AddTestModel(); + } +#endif + + cg.refdef.time = cg.time; + memcpy( cg.refdef.areamask, cg.snap->areamask, sizeof( cg.refdef.areamask ) ); + + // update audio positions + cgi.S_Respatialize( cg.snap->ps.clientNum, cg.SoundOrg, cg.SoundAxis ); + + // make sure the lagometerSample and frame timing isn't done twice when in stereo + if ( stereoView != STEREO_RIGHT ) + { + cg.frametime = cg.time - cg.oldTime; + if ( cg.frametime < 0 ) + { + cg.frametime = 0; + } + cg.oldTime = cg.time; + CG_AddLagometerFrameInfo(); + } + + CG_UpdateTestEmitter(); + + if ( !cg_hidetempmodels->integer ) + CG_AddTempModels(); + + CG_AddBeams(); + + // actually issue the rendering calls + CG_DrawActive( stereoView ); + + if ( cg_stats->integer ) + { + cgi.Printf( "cg.clientFrame:%i\n", cg.clientFrame ); + } + } + diff --git a/source/source/cgame/cgame.def b/source/source/cgame/cgame.def new file mode 100644 index 0000000..e224286 --- /dev/null +++ b/source/source/cgame/cgame.def @@ -0,0 +1,2 @@ +EXPORTS + GetCGameAPI diff --git a/source/source/cgame/cgame.dsp b/source/source/cgame/cgame.dsp new file mode 100644 index 0000000..a421c35 --- /dev/null +++ b/source/source/cgame/cgame.dsp @@ -0,0 +1,273 @@ +# Microsoft Developer Studio Project File - Name="cgame" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=cgame - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "cgame.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "cgame.mak" CFG="cgame - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "cgame - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "cgame - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName ""$/fakk2_code/fakk2_new/cgame", DYHAAAAA" +# PROP Scc_LocalPath "." +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "cgame - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /G5 /MT /W3 /GX /Zi /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "CGAME_DLL" /FR /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386 +# ADD LINK32 /nologo /base:"0x30000000" /subsystem:windows /dll /map /machine:I386 /out:"../Release/cgamex86.dll" +# SUBTRACT LINK32 /debug + +!ELSEIF "$(CFG)" == "cgame - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /G5 /MTd /W4 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "CGAME_DLL" /FR /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 /nologo /base:"0x30000000" /subsystem:windows /dll /map /debug /machine:I386 /out:"..\Debug/cgamex86.dll" +# SUBTRACT LINK32 /profile /nodefaultlib + +!ENDIF + +# Begin Target + +# Name "cgame - Win32 Release" +# Name "cgame - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "c" +# Begin Source File + +SOURCE=..\fgame\bg_misc.c +# End Source File +# Begin Source File + +SOURCE=..\fgame\bg_pmove.c +# End Source File +# Begin Source File + +SOURCE=.\cg_beam.cpp +# End Source File +# Begin Source File + +SOURCE=.\cg_commands.cpp +# End Source File +# Begin Source File + +SOURCE=.\cg_consolecmds.c +# End Source File +# Begin Source File + +SOURCE=.\cg_drawtools.cpp +# End Source File +# Begin Source File + +SOURCE=.\cg_ents.c +# End Source File +# Begin Source File + +SOURCE=.\cg_lightstyles.cpp +# End Source File +# Begin Source File + +SOURCE=.\cg_main.c +# End Source File +# Begin Source File + +SOURCE=.\cg_marks.c +# End Source File +# Begin Source File + +SOURCE=.\cg_modelanim.c +# End Source File +# Begin Source File + +SOURCE=.\cg_player.cpp +# End Source File +# Begin Source File + +SOURCE=.\cg_playerstate.c +# End Source File +# Begin Source File + +SOURCE=.\cg_predict.c +# End Source File +# Begin Source File + +SOURCE=.\cg_servercmds.c +# End Source File +# Begin Source File + +SOURCE=.\cg_snapshot.c +# End Source File +# Begin Source File + +SOURCE=.\cg_sound.cpp +# End Source File +# Begin Source File + +SOURCE=.\cg_specialfx.cpp +# End Source File +# Begin Source File + +SOURCE=.\cg_swipe.cpp +# End Source File +# Begin Source File + +SOURCE=.\cg_testemitter.cpp +# End Source File +# Begin Source File + +SOURCE=.\cg_view.c +# End Source File +# Begin Source File + +SOURCE=.\class.cpp +# End Source File +# Begin Source File + +SOURCE=.\listener.cpp +# End Source File +# Begin Source File + +SOURCE=..\fgame\q_math.c +# End Source File +# Begin Source File + +SOURCE=..\fgame\q_mathsys.c +# End Source File +# Begin Source File + +SOURCE=..\fgame\q_shared.c +# End Source File +# Begin Source File + +SOURCE=.\script.cpp +# End Source File +# Begin Source File + +SOURCE=.\str.cpp +# End Source File +# Begin Source File + +SOURCE=..\win32\win_bounds.cpp +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h" +# Begin Source File + +SOURCE=..\fgame\bg_local.h +# End Source File +# Begin Source File + +SOURCE=..\fgame\bg_public.h +# End Source File +# Begin Source File + +SOURCE=.\cg_commands.h +# End Source File +# Begin Source File + +SOURCE=.\cg_local.h +# End Source File +# Begin Source File + +SOURCE=.\cg_public.h +# End Source File +# Begin Source File + +SOURCE=.\class.h +# End Source File +# Begin Source File + +SOURCE=.\container.h +# End Source File +# Begin Source File + +SOURCE=.\Linklist.h +# End Source File +# Begin Source File + +SOURCE=.\listener.h +# End Source File +# Begin Source File + +SOURCE=.\script.h +# End Source File +# Begin Source File + +SOURCE=.\str.h +# End Source File +# Begin Source File + +SOURCE=.\tr_types.h +# End Source File +# Begin Source File + +SOURCE=.\vector.h +# End Source File +# End Group +# Begin Source File + +SOURCE=.\cgame.def +# End Source File +# End Target +# End Project diff --git a/source/source/cgame/cgame.dsw b/source/source/cgame/cgame.dsw new file mode 100644 index 0000000..4364e03 --- /dev/null +++ b/source/source/cgame/cgame.dsw @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "cgame"=.\cgame.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/source/source/cgame/class.cpp b/source/source/cgame/class.cpp new file mode 100644 index 0000000..c5c278d --- /dev/null +++ b/source/source/cgame/class.cpp @@ -0,0 +1,1035 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/cgame/class.cpp $ +// $Revision:: 17 $ +// $Author:: Aldie $ +// $Date:: 8/10/00 6:34p $ +// +// Copyright (C) 1997 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/cgame/class.cpp $ +// +// 17 8/10/00 6:34p Aldie +// Added a shutdown method +// +// 16 7/26/00 1:07p Steven +// Made it so in classes new function NULL is returned if we try to allocate 0 +// bytes. +// +// 15 7/07/00 6:57p Markd +// changed default debug printf when starting up event system +// +// 14 5/24/00 3:14p Markd +// first phase of save/load games +// +// 13 4/29/00 3:50p Markd +// added some convenience classes and printed out classID when appropriate +// +// 12 4/29/00 3:26p Markd +// fleshed out the rest of the event/class documentation +// +// 11 4/29/00 11:38a Markd +// changed formatting for dump all classes +// +// 10 4/26/00 7:55p Markd +// Added more documentation code into various systems +// +// 9 4/12/00 6:19p Aldie +// Fixed formatting +// +// 8 3/04/00 11:45a Markd +// Added malloc and free for cgame and client +// +// 7 2/26/00 3:27p Markd +// pre-initialized all memory with known bad value +// +// 6 2/04/00 11:20a Markd +// Added memory leak test code to new and delete operators +// +// 5 1/10/00 5:34p Markd +// Changed Allocation routines for fgame to use the gi.Malloc and gi.Free +// instead of the in game heap +// +// 4 12/15/99 11:45a Markd +// made Event's Classes and also freed up safe pointers at the appropriate +// times +// +// 3 10/05/99 2:03p Markd +// Added warning about files being in multiple projects +// +// 2 9/28/99 4:26p Markd +// merged listener, class and vector between 3 projects +// +// 1 9/10/99 10:53a Jimdose +// +// 1 9/08/99 3:15p Aldie +// +// DESCRIPTION: +// Base class that all classes that are used in conjunction with Sin should +// be based off of. Class gives run-time type information about any class +// derived from it. This is really handy when you have a pointer to an object +// that you need to know if it supports certain behaviour. +// +// WARNING: This file is shared between fgame, cgame and possibly the user interface. +// It is instanced in each one of these directories because of the way that SourceSafe works. +// + +#include +#include +#include + +#if defined( GAME_DLL ) + +#include "g_local.h" + +#elif defined ( CGAME_DLL ) + +#include "cg_local.h" +#include "listener.h" +#include "../qcommon/qcommon.h" + +#else + +#include "listener.h" +#include "../qcommon/qcommon.h" + +#endif + +#include "class.h" +#include "linklist.h" + +int totalmemallocated = 0; +int numclassesallocated = 0; + +static ClassDef *classlist = NULL; + + +ClassDef::ClassDef() + { + this->classname = NULL; + this->classID = NULL; + this->superclass = NULL; + this->responses = NULL, + this->numEvents = 0; + this->responseLookup = NULL; + this->newInstance = NULL; + this->classSize = 0; + this->super = NULL; + this->prev = this; + this->next = this; + } + +ClassDef::ClassDef + ( + const char *classname, + const char *classID, + const char *superclass, + ResponseDef *responses, + void *( *newInstance )( void ), + int classSize + ) + + { + ClassDef *node; + + if ( classlist == NULL ) + { + classlist = new ClassDef; + } + + this->classname = classname; + this->classID = classID; + this->superclass = superclass; + this->responses = responses; + this->numEvents = 0; + this->responseLookup = NULL; + this->newInstance = newInstance; + this->classSize = classSize; + this->super = getClass( superclass ); + + // It's not uncommon for classes to not have a class id, so just set it + // to an empty string so that we're not checking for it all the time. + if ( !classID ) + { + this->classID = ""; + } + + // Check if any subclasses were initialized before their superclass + for( node = classlist->next; node != classlist; node = node->next ) + { + if ( ( node->super == NULL ) && ( !Q_stricmp( node->superclass, this->classname ) ) && + ( Q_stricmp( node->classname, "Class" ) ) ) + { + node->super = this; + } + } + + // Add to front of list + LL_Add( classlist, this, prev, next ); + } + +void ClassDef::Shutdown + ( + void + ) + + { + if ( responseLookup ) + { + delete[] responseLookup; + responseLookup = NULL; + } + } + +ClassDef::~ClassDef() + { + ClassDef *node; + + if ( classlist != this ) + { + LL_Remove( this, prev, next ); + + // Check if any subclasses were initialized before their superclass + for( node = classlist->next; node != classlist; node = node->next ) + { + if ( node->super == this ) + { + node->super = NULL; + } + } + } + else + { + // If the head of the list is deleted before the list is cleared, then we may have problems + assert( this->next == this->prev ); + } + + if ( responseLookup ) + { + delete[] responseLookup; + responseLookup = NULL; + } + } + +void ClassDef::BuildResponseList + ( + void + ) + + { + ClassDef *c; + ResponseDef *r; + int ev; + int i; + qboolean *set; + int num; + + if ( responseLookup ) + { + delete[] responseLookup; + responseLookup = NULL; + } + + num = Event::NumEventCommands(); + responseLookup = ( Response ** )new char[ sizeof( Response * ) * num ]; + memset( responseLookup, 0, sizeof( Response * ) * num ); + + set = new qboolean[ num ]; + memset( set, 0, sizeof( qboolean ) * num ); + + this->numEvents = num; + + for( c = this; c != NULL; c = c->super ) + { + r = c->responses; + if ( r ) + { + for( i = 0; r[ i ].event != NULL; i++ ) + { + ev = ( int )*r[ i ].event; + if ( !set[ ev ] ) + { + set[ ev ] = true; + if ( r[ i ].response ) + { + responseLookup[ ev ] = &r[ i ].response; + } + else + { + responseLookup[ ev ] = NULL; + } + } + } + } + } + + delete[] set; + } + +void BuildEventResponses + ( + void + ) + + { + ClassDef *c; + int amount; + int numclasses; + + amount = 0; + numclasses = 0; + for( c = classlist->next; c != classlist; c = c->next ) + { + c->BuildResponseList(); + + amount += c->numEvents * sizeof( Response * ); + numclasses++; + } + + CLASS_DPrintf( "\n------------------\nEvent system initialized: " + "%d classes %d events %d total memory in response list\n\n", + numclasses, Event::NumEventCommands(), amount ); + } + +ClassDef *getClassForID + ( + const char *name + ) + + { + ClassDef *c; + + for( c = classlist->next; c != classlist; c = c->next ) + { + if ( c->classID && !Q_stricmp( c->classID, name ) ) + { + return c; + } + } + + return NULL; + } + +ClassDef *getClass + ( + const char *name + ) + + { + ClassDef *c; + + for( c = classlist->next; c != classlist; c = c->next ) + { + if ( !Q_stricmp( c->classname, name ) ) + { + return c; + } + } + + return NULL; + } + +ClassDef *getClassList + ( + void + ) + + { + return classlist; + } + +void listAllClasses + ( + void + ) + + { + ClassDef *c; + + for( c = classlist->next; c != classlist; c = c->next ) + { + CLASS_DPrintf( "%s\n", c->classname ); + } + } + +void listInheritanceOrder + ( + const char *classname + ) + + { + ClassDef *cls; + ClassDef *c; + + cls = getClass( classname ); + if ( !cls ) + { + CLASS_DPrintf( "Unknown class: %s\n", classname ); + return; + } + for( c = cls; c != NULL; c = c->super ) + { + CLASS_DPrintf( "%s\n", c->classname ); + } + } + +qboolean checkInheritance + ( + ClassDef *superclass, + ClassDef *subclass + ) + + { + ClassDef *c; + + for( c = subclass; c != NULL; c = c->super ) + { + if ( c == superclass ) + { + return true; + } + } + return false; + } + +qboolean checkInheritance + ( + ClassDef *superclass, + const char *subclass + ) + + { + ClassDef *c; + + c = getClass( subclass ); + if ( c == NULL ) + { + CLASS_DPrintf( "Unknown class: %s\n", subclass ); + return false; + } + return checkInheritance( superclass, c ); + } + +qboolean checkInheritance + ( + const char *superclass, + const char *subclass + ) + + { + ClassDef *c1; + ClassDef *c2; + + c1 = getClass( superclass ); + c2 = getClass( subclass ); + if ( c1 == NULL ) + { + CLASS_DPrintf( "Unknown class: %s\n", superclass ); + return false; + } + if ( c2 == NULL ) + { + CLASS_DPrintf( "Unknown class: %s\n", subclass ); + return false; + } + return checkInheritance( c1, c2 ); + } + +void CLASS_Print( FILE *class_file, const char *fmt, ... ) + { + va_list argptr; + char text[ 1024 ]; + + va_start( argptr, fmt ); + vsprintf( text, fmt, argptr ); + va_end( argptr ); + + if ( class_file ) + fprintf( class_file, text ); + else + CLASS_DPrintf( text ); + } + + +CLASS_DECLARATION( NULL, Class, NULL ) + { + { NULL, NULL } + }; + +#ifdef NDEBUG + +void * Class::operator new( size_t s ) + { + int *p; + + if ( s == 0 ) + return NULL; + + s += sizeof( int ); +#if defined( GAME_DLL ) + p = ( int * )gi.Malloc( s ); +#elif defined( CGAME_DLL ) + p = ( int * )cgi.Malloc( s ); +#else + p = ( int * )Z_TagMalloc( s, TAG_CLIENT ); +#endif + *p = s; + totalmemallocated += s; + numclassesallocated++; + return p + 1; + } + +void Class::operator delete( void *ptr ) + { + int *p; + + p = ( ( int * )ptr ) - 1; + totalmemallocated -= *p; + numclassesallocated--; +#if defined( GAME_DLL ) + gi.Free( p ); +#elif defined( CGAME_DLL ) + cgi.Free( p ); +#else + Z_Free( p ); +#endif + } + +#else + +#ifdef MEMORY_LEAK_TEST +int classindex = 0; +#endif + +void * Class::operator new( size_t s ) + { + int *p; + + s += sizeof( int ) * 3; +#if defined( GAME_DLL ) + p = ( int * )gi.Malloc( s ); +#elif defined( CGAME_DLL ) + p = ( int * )cgi.Malloc( s ); +#else + p = ( int * )Z_TagMalloc( s, TAG_CLIENT ); +#endif + // set memory to a known wrong number + memset( p, 0xaa, s ); +#ifdef MEMORY_LEAK_TEST + p[ 0 ] = classindex++; +#else + p[ 0 ] = 0x12348765; +#endif + *( int * )( ((byte *)p) + s - sizeof( int ) ) = 0x56784321; + p[ 1 ] = s; + totalmemallocated += s; + numclassesallocated++; + return p + 2; + } + +void Class::operator delete( void *ptr ) + { + int *p; + + p = ( ( int * )ptr ) - 2; +#ifndef MEMORY_LEAK_TEST + assert( p[ 0 ] == 0x12348765 ); +#endif + assert( *( int * )( ((byte *)p) + p[ 1 ] - sizeof( int ) ) == 0x56784321 ); + + totalmemallocated -= p[ 1 ]; + numclassesallocated--; +#if defined( GAME_DLL ) + gi.Free( p ); +#elif defined( CGAME_DLL ) + cgi.Free( p ); +#else + Z_Free( p ); +#endif + } + +#endif + +void DisplayMemoryUsage + ( + void + ) + + { + CLASS_Printf( "Classes %-5d Class memory used: %d\n", numclassesallocated, totalmemallocated ); + } + +Class::Class() + { + SafePtrList = NULL; + } + +Class::~Class() + { + ClearSafePointers(); + } + +#ifdef GAME_DLL + +void Class::Archive + ( + Archiver &arc + ) + + { + } + +#endif + +void Class::ClearSafePointers( void ) + { + while( SafePtrList != NULL ) + { + SafePtrList->Clear(); + } + } + + +void Class::warning + ( + const char *function, + const char *fmt, + ... + ) + + { + va_list argptr; + char text[ 1024 ]; + + va_start( argptr, fmt ); + vsprintf( text, fmt, argptr ); + va_end( argptr ); + + if ( getClassID() ) + { + CLASS_DPrintf( "%s::%s : %s\n", getClassID(), function, text ); + } + else + { + CLASS_DPrintf( "%s::%s : %s\n", getClassname(), function, text ); + } + } + +void Class::error + ( + const char *function, + const char *fmt, + ... + ) + + { + va_list argptr; + char text[ 1024 ]; + + va_start( argptr, fmt ); + vsprintf( text, fmt, argptr ); + va_end( argptr ); + + if ( getClassID() ) + { + CLASS_Error( ERR_DROP, "%s::%s : %s\n", getClassID(), function, text ); + } + else + { + CLASS_Error( ERR_DROP, "%s::%s : %s\n", getClassname(), function, text ); + } + } + +qboolean Class::inheritsFrom + ( + const char *name + ) + + { + ClassDef *c; + + c = getClass( name ); + if ( c == NULL ) + { + CLASS_DPrintf( "Unknown class: %s\n", name ); + return false; + } + return checkInheritance( c, classinfo() ); + } + +qboolean Class::isInheritedBy + ( + const char *name + ) + + { + ClassDef *c; + + c = getClass( name ); + if ( c == NULL ) + { + CLASS_DPrintf( "Unknown class: %s\n", name ); + return false; + } + return checkInheritance( classinfo(), c ); + } + +const char *Class::getClassname + ( + void + ) + + { + ClassDef *cls; + + cls = classinfo(); + return cls->classname; + } + +const char *Class::getClassID + ( + void + ) + + { + ClassDef *cls; + + cls = classinfo(); + return cls->classID; + } + +const char *Class::getSuperclass + ( + void + ) + + { + ClassDef *cls; + + cls = classinfo(); + return cls->superclass; + } + +void *Class::newInstance + ( + void + ) + + { + ClassDef *cls; + + cls = classinfo(); + return cls->newInstance(); + } + +#define MAX_INHERITANCE 64 +void ClassEvents + ( + const char *classname, + qboolean print_to_disk + ) + + { + ClassDef *c; + ResponseDef *r; + int ev; + int i, j; + qboolean *set; + int num, orderNum; + Event **events; + byte *order; + FILE *class_file; + str classNames[ MAX_INHERITANCE ]; + str class_filename; + + c = getClass( classname ); + if ( !c ) + { + CLASS_DPrintf( "Unknown class: %s\n", classname ); + return; + } + + class_file = NULL; + + if ( print_to_disk ) + { + class_filename = str ( classname ) + ".txt"; + class_file = fopen( class_filename.c_str(), "w" ); + if ( class_file == NULL ) + return; + } + + num = Event::NumEventCommands(); + + set = new qboolean[ num ]; + memset( set, 0, sizeof( qboolean ) * num ); + + events = new Event *[ num ]; + memset( events, 0, sizeof( Event * ) * num ); + + order = new byte[ num ]; + memset( order, 0, sizeof( byte ) * num ); + + orderNum = 0; + for( ; c != NULL; c = c->super ) + { + if ( orderNum < MAX_INHERITANCE ) + { + classNames[ orderNum ] = c->classname; + } + r = c->responses; + if ( r ) + { + for( i = 0; r[ i ].event != NULL; i++ ) + { + ev = ( int )*r[ i ].event; + if ( !set[ ev ] ) + { + set[ ev ] = true; + + if ( r[ i ].response ) + { + events[ ev ] = r[ i ].event; + order[ ev ] = orderNum; + } + } + } + } + orderNum++; + } + + CLASS_Print( class_file, "********************************************************\n" ); + CLASS_Print( class_file, "********************************************************\n" ); + CLASS_Print( class_file, "* All Events For Class: %s\n", classname ); + CLASS_Print( class_file, "********************************************************\n" ); + CLASS_Print( class_file, "********************************************************\n\n" ); + + for( j = orderNum - 1; j >= 0; j-- ) + { + CLASS_Print( class_file, "\n********************************************************\n" ); + CLASS_Print( class_file, "* Class: %s\n", classNames[ j ].c_str() ); + CLASS_Print( class_file, "********************************************************\n\n" ); + for( i = 1; i < num; i++ ) + { + int index; + + index = Event::MapSortedEventIndex( i ); + if ( events[ index ] && ( order[ index ] == j ) ) + { + Event::PrintEventDocumentation( events[ index ], class_file ); + } + } + } + + if ( class_file != NULL ) + { + CLASS_DPrintf( "Printed class info to file %s\n", class_filename.c_str() ); + fclose( class_file ); + } + + delete[] events; + delete[] order; + delete[] set; + } + +static int dump_numclasses; +static int dump_numevents; +void DumpClass + ( + FILE * class_file, + const char * className + ) + + { + ClassDef *c; + ResponseDef *r; + int ev; + int i; + int num; + Event **events; + + c = getClass( className ); + if ( !c ) + { + return; + } + + num = Event::NumEventCommands(); + + events = new Event *[ num ]; + memset( events, 0, sizeof( Event * ) * num ); + + // gather event responses for this class + r = c->responses; + if ( r ) + { + for( i = 0; r[ i ].event != NULL; i++ ) + { + ev = ( int )*r[ i ].event; + if ( r[ i ].response ) + { + events[ ev ] = r[ i ].event; + } + } + } + + CLASS_Print( class_file, "\n"); + if ( c->classID[ 0 ] ) + { + CLASS_Print( class_file, "

    %s (%s)", c->classname, c->classname, c->classID ); + } + else + { + CLASS_Print( class_file, "

    %s", c->classname, c->classname ); + } + + // print out lineage + for( c = c->super; c != NULL; c = c->super ) + { + CLASS_Print( class_file, " -> %s", c->classname, c->classname ); + } + CLASS_Print( class_file, "

    \n"); + + dump_numclasses++; + + CLASS_Print( class_file, "
    \n"); + for( i = 1; i < num; i++ ) + { + int index; + + index = Event::MapSortedEventIndex( i ); + if ( events[ index ] ) + { + Event::PrintEventDocumentation( events[ index ], class_file, qtrue ); + dump_numevents++; + } + } + CLASS_Print( class_file, "
    \n"); + delete[] events; + } + + +#define MAX_CLASSES 1024 +void DumpAllClasses + ( + void + ) + + { + int i, j, num, smallest; + ClassDef *c; + FILE * class_file; + str class_filename; + str class_title; + str classes[ MAX_CLASSES ]; + +#if defined( GAME_DLL ) + class_filename = "g_allclasses.html"; + class_title = "Game Module"; +#elif defined( CGAME_DLL ) + class_filename = "cg_allclasses.html"; + class_title = "Client Game Module"; +#else + class_filename = "cl_allclasses.html"; + class_title = "Client Module"; +#endif + + class_file = fopen( class_filename.c_str(), "w" ); + if ( class_file == NULL ) + return; + + // construct the HTML header for the document + CLASS_Print( class_file, "\n"); + CLASS_Print( class_file, "\n"); + CLASS_Print( class_file, "%s Classes\n", class_title.c_str() ); + CLASS_Print( class_file, "\n"); + CLASS_Print( class_file, "\n"); + CLASS_Print( class_file, "

    \n"); + CLASS_Print( class_file, "
    %s Classes
    \n", class_title.c_str() ); + CLASS_Print( class_file, "

    \n"); +#if defined( GAME_DLL ) + // + // print out some commonly used classnames + // + CLASS_Print( class_file, "

    " ); + CLASS_Print( class_file, "Actor, " ); + CLASS_Print( class_file, "Animate, " ); + CLASS_Print( class_file, "Entity, " ); + CLASS_Print( class_file, "ScriptSlave, " ); + CLASS_Print( class_file, "ScriptThread, " ); + CLASS_Print( class_file, "Sentient, " ); + CLASS_Print( class_file, "Trigger, " ); + CLASS_Print( class_file, "World" ); + CLASS_Print( class_file, "

    " ); +#endif + + dump_numclasses = 0; + dump_numevents = 0; + + // get all the classes + num = 0; + for( c = classlist->next; c != classlist; c = c->next ) + { + if ( num < MAX_CLASSES ) + { + classes[ num++ ] = c->classname; + } + } + + // go through and process each class from smallest to greatest + for( i = 0; i < num; i++ ) + { + smallest = -1; + for( j = 0; j < num; j++ ) + { + if ( classes[ j ].length() > 1 ) + { + if ( smallest >= 0 ) + { + if ( classes[ j ].icmp( classes[ smallest ] ) < 0 ) + { + smallest = j; + } + } + else + { + smallest = j; + } + } + } + DumpClass( class_file, classes[ smallest ] ); + // delete the name from the list + classes[ smallest ] = ""; + } + + if ( class_file != NULL ) + { + CLASS_Print( class_file, "

    \n"); + CLASS_Print( class_file, "%d %s Classes.
    %d %s Events.\n", dump_numclasses, class_title.c_str(), dump_numevents, class_title.c_str() ); + CLASS_Print( class_file, "

    \n"); + CLASS_Print( class_file, "\n"); + CLASS_Print( class_file, "\n"); + CLASS_DPrintf( "Dumped all classes to file %s\n", class_filename.c_str() ); + fclose( class_file ); + } + + } + + +void ShutdownClasses + ( + void + ) + + { + ClassDef *c; + + for( c = classlist->next; c != classlist; c = c->next ) + { + c->Shutdown(); + } + } diff --git a/source/source/cgame/class.h b/source/source/cgame/class.h new file mode 100644 index 0000000..71f3171 --- /dev/null +++ b/source/source/cgame/class.h @@ -0,0 +1,511 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/client/class.h $ +// $Revision:: 13 $ +// $Author:: Aldie $ +// $Date:: 8/10/00 9:27p $ +// +// Copyright (C) 1997 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/client/class.h $ +// +// 13 8/10/00 9:27p Aldie +// Fixing memory leaks +// +// 12 8/10/00 6:34p Aldie +// Added a shutdown method +// +// 11 6/14/00 12:14p Markd +// more intel compiler bug fixes +// +// 10 6/14/00 11:18a Markd +// cleaned up code using Intel compiler +// +// 9 5/26/00 7:44p Markd +// 2nd phase save games +// +// 8 5/25/00 4:28p Markd +// fixed up archive functions +// +// 7 5/24/00 3:14p Markd +// first phase of save/load games +// +// 6 4/26/00 7:55p Markd +// Added more documentation code into various systems +// +// 5 3/16/00 10:50a Markd +// Fixed some bad syntax in headers that exhibited itself in non-visualc +// compilers +// +// 4 12/15/99 11:45a Markd +// made Event's Classes and also freed up safe pointers at the appropriate +// times +// +// 3 10/05/99 2:03p Markd +// Added warning about files being in multiple projects +// +// 2 9/28/99 4:26p Markd +// merged listener, class and vector between 3 projects +// +// 1 9/10/99 10:53a Jimdose +// +// 1 9/08/99 3:15p Aldie +// +// 6 8/27/99 3:31p Markd +// externed totalmemallocated +// +// DESCRIPTION: +// Base class that all classes that are used in conjunction with Sin should +// be based off of. Class gives run-time type information about any class +// derived from it. This is really handy when you have a pointer to an object +// that you need to know if it supports certain behaviour. +// +// WARNING: This file is shared between fgame, cgame and possibly the user interface. +// It is instanced in each one of these directories because of the way that SourceSafe works. +// + +#ifndef __CLASS_H__ +#define __CLASS_H__ + +#if defined( GAME_DLL ) +// +// game dll specific defines +// +#include "g_local.h" +#include "linklist.h" + +#define CLASS_DPrintf gi.DPrintf +#define CLASS_Printf gi.Printf +#define CLASS_Error gi.Error + +class Archiver; + +#elif defined ( CGAME_DLL ) +// +// cgame dll specific defines +// +#include "../fgame/q_shared.h" +#include "linklist.h" + +#define CLASS_DPrintf cgi.DPrintf +#define CLASS_Printf cgi.Printf +#define CLASS_Error cgi.Error + +#else + +// +// client specific defines +// +#include "../fgame/q_shared.h" +#include "linklist.h" + +#define CLASS_DPrintf Com_DPrintf +#define CLASS_Printf Com_Printf +#define CLASS_Error Com_Error +#endif + +class Class; +class Event; + +typedef void ( Class::*Response )( Event *event ); + +template< class Type > +struct ResponseDef + { + Event *event; + void ( Type::*response )( Event *event ); + }; + +/*********************************************************************** + + ClassDef + +***********************************************************************/ + +class ClassDef + { + public: + const char *classname; + const char *classID; + const char *superclass; + void *( *newInstance )( void ); + int classSize; + ResponseDef *responses; + int numEvents; + Response **responseLookup; + ClassDef *super; + ClassDef *next; + ClassDef *prev; + + ClassDef(); + ~ClassDef(); + ClassDef( const char *classname, const char *classID, const char *superclass, + ResponseDef *responses, void *( *newInstance )( void ), int classSize ); + void BuildResponseList( void ); + void Shutdown( void ); + }; + +/*********************************************************************** + + SafePtr + +***********************************************************************/ + +class SafePtrBase; + +class Class; + +class SafePtrBase + { + private: + void AddReference( Class *ptr ); + void RemoveReference( Class *ptr ); + + protected: + SafePtrBase *prevSafePtr; + SafePtrBase *nextSafePtr; + Class *ptr; + + public: + SafePtrBase(); + virtual ~SafePtrBase(); + void InitSafePtr( Class *newptr ); + Class *Pointer( void ); + void Clear( void ); + }; + +/*********************************************************************** + + Class + +***********************************************************************/ + +#define CLASS_DECLARATION( nameofsuperclass, nameofclass, classid ) \ + ClassDef nameofclass::ClassInfo \ + ( \ + #nameofclass, classid, #nameofsuperclass, \ + ( ResponseDef * )nameofclass::Responses, \ + nameofclass::_newInstance, sizeof( nameofclass ) \ + ); \ + void *nameofclass::_newInstance( void ) \ + { \ + return new nameofclass; \ + } \ + ClassDef *nameofclass::classinfo( void ) \ + { \ + return &( nameofclass::ClassInfo ); \ + } \ + ResponseDef nameofclass::Responses[] = + +#define CLASS_PROTOTYPE( nameofclass ) \ + public: \ + static ClassDef ClassInfo; \ + static void *_newInstance( void ); \ + virtual ClassDef *classinfo( void ); \ + static ResponseDef Responses[] + +class Class + { + private: + SafePtrBase *SafePtrList; + friend class SafePtrBase; + + protected: + void ClearSafePointers( void ); + + public: + CLASS_PROTOTYPE( Class ); + void * operator new( size_t ); + void operator delete( void * ); + + Class(); + virtual ~Class(); + void warning( const char *function, const char *fmt, ... ); + void error( const char *function, const char *fmt, ... ); + qboolean inheritsFrom( ClassDef *c ); + qboolean inheritsFrom( const char *name ); + qboolean isInheritedBy( const char *name ); + qboolean isInheritedBy( ClassDef *c ); + const char *getClassname( void ); + const char *getClassID( void ); + const char *getSuperclass( void ); + void *newInstance( void ); + +#ifdef GAME_DLL + virtual void Archive( Archiver &arc ); +#endif + }; + +void BuildEventResponses( void ); +ClassDef *getClassForID( const char *name ); +ClassDef *getClass( const char *name ); +ClassDef *getClassList( void ); +void listAllClasses( void ); +void listInheritanceOrder( const char *classname ); +qboolean checkInheritance( ClassDef *superclass, ClassDef *subclass ); +qboolean checkInheritance( ClassDef *superclass, const char *subclass ); +qboolean checkInheritance( const char *superclass, const char *subclass ); +void DisplayMemoryUsage( void ); +void ClassEvents( const char *classname, qboolean dump = qfalse ); +void DumpAllClasses( void ); + +inline qboolean Class::inheritsFrom + ( + ClassDef *c + ) + + { + return checkInheritance( c, classinfo() ); + } + +inline qboolean Class::isInheritedBy + ( + ClassDef *c + ) + + { + return checkInheritance( classinfo(), c ); + } + +// The lack of a space between the ")" and "inheritsFrom" is intentional. +// It allows the macro to compile like a function call. However, this +// may cause problems in some compilers (like gcc), so we may have to +// change this to work like a normal macro with the object passed in +// as a parameter to the macro. +#define isSubclassOf( classname )inheritsFrom( &classname::ClassInfo ) +#define isSuperclassOf( classname )isInheritedBy( &classname::ClassInfo ) + +/*********************************************************************** + + SafePtr + +***********************************************************************/ + +inline void SafePtrBase::AddReference + ( + Class *ptr + ) + + { + if ( !ptr->SafePtrList ) + { + ptr->SafePtrList = this; + LL_Reset( this, nextSafePtr, prevSafePtr ); + } + else + { + LL_Add( ptr->SafePtrList, this, nextSafePtr, prevSafePtr ); + } + } + +inline void SafePtrBase::RemoveReference + ( + Class *ptr + ) + + { + if ( ptr->SafePtrList == this ) + { + if ( ptr->SafePtrList->nextSafePtr == this ) + { + ptr->SafePtrList = NULL; + } + else + { + ptr->SafePtrList = nextSafePtr; + LL_Remove( this, nextSafePtr, prevSafePtr ); + } + } + else + { + LL_Remove( this, nextSafePtr, prevSafePtr ); + } + } + +inline void SafePtrBase::Clear + ( + void + ) + + { + if ( ptr ) + { + RemoveReference( ptr ); + ptr = NULL; + } + } + +inline SafePtrBase::SafePtrBase() + { + prevSafePtr = NULL; + nextSafePtr = NULL; + ptr = NULL; + } + +inline SafePtrBase::~SafePtrBase() + { + Clear(); + } + +inline Class * SafePtrBase::Pointer + ( + void + ) + + { + return ptr; + } + +inline void SafePtrBase::InitSafePtr + ( + Class *newptr + ) + + { + if ( ptr != newptr ) + { + if ( ptr ) + { + RemoveReference( ptr ); + } + + ptr = newptr; + if ( ptr == NULL ) + { + return; + } + + AddReference( ptr ); + } + } + +template +class SafePtr : public SafePtrBase + { + public: + SafePtr( T* objptr = 0 ); + SafePtr( const SafePtr& obj ); + + SafePtr& operator=( const SafePtr& obj ); + SafePtr& operator=( T * const obj ); + + friend int operator==( SafePtr a, T *b ); + friend int operator!=( SafePtr a, T *b ); + friend int operator==( T *a, SafePtr b ); + friend int operator!=( T *a, SafePtr b ); + + operator T*() const; + T* operator->() const; + T& operator*() const; + }; + +template +inline SafePtr::SafePtr( T* objptr ) + { + InitSafePtr( objptr ); + } + +template +inline SafePtr::SafePtr( const SafePtr& obj ) + { + InitSafePtr( obj.ptr ); + } + +template +inline SafePtr& SafePtr::operator=( const SafePtr& obj ) + { + InitSafePtr( obj.ptr ); + return *this; + } + +template +inline SafePtr& SafePtr::operator=( T * const obj ) + { + InitSafePtr( obj ); + return *this; + } + +template +inline int operator== + ( + SafePtr a, + T* b + ) + + { + return a.ptr == b; + } + +template +inline int operator!= + ( + SafePtr a, + T* b + ) + + { + return a.ptr != b; + } + +template +inline int operator== + ( + T* a, + SafePtr b + ) + + { + return a == b.ptr; + } + +template +inline int operator!= + ( + T* a, + SafePtr b + ) + + { + return a != b.ptr; + } + +template +inline SafePtr::operator T*() const + { + return ( T * )ptr; + } + +template +inline T* SafePtr::operator->() const + { + return ( T * )ptr; + } + +template +inline T& SafePtr::operator*() const + { + return *( T * )ptr; + } + +typedef SafePtr ClassPtr; + +#ifdef GAME_DLL +#include "archive.h" +#endif + +// used by listener for event allocation +extern int totalmemallocated; + +#ifndef GAME_DLL +extern "C" + { + // interface functions + void ShutdownClasses( void ); + } +#endif + +#endif /* class.h */ diff --git a/source/source/cgame/container.cpp b/source/source/cgame/container.cpp new file mode 100644 index 0000000..1cd829d --- /dev/null +++ b/source/source/cgame/container.cpp @@ -0,0 +1,243 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/cgame/container.cpp $ +// $Revision:: 2 $ +// $Author:: Markd $ +// $Date:: 10/05/99 2:03p $ +// +// Copyright (C) 1997 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/cgame/container.cpp $ +// +// 2 10/05/99 2:03p Markd +// Added warning about files being in multiple projects +// +// 1 9/10/99 10:53a Jimdose +// +// 1 9/08/99 3:15p Aldie +// +// DESCRIPTION: +// Base class for a dynamic array. Allows adding, removing, index of, +// and finding of entries with specified value. Originally created for +// cataloging entities, but pointers to objects that may be removed at +// any time are bad to keep around, so only entity numbers should be +// used in the future. +// +// WARNING: This file is shared between fgame, cgame and possibly the user interface. +// It is instanced in each one of these directories because of the way that SourceSafe works. +// + +#if 0 + +#include "g_local.h" +#include "class.h" +#include "container.h" + +template< class Type > +Container::Container() + { + objlist = NULL; + FreeObjectList(); + } + +template< class Type > +Container::~Container() + { + FreeObjectList(); + } + +template< class Type > +void Container::FreeObjectList + ( + void + ) + + { + if ( objlist ) + { + delete objlist; + } + objlist = NULL; + numobjects = 0; + maxobjects = 0; + } + +template< class Type > +void Container::ClearObjectList + ( + void + ) + + { + if ( objlist ) + { + memset( objlist, 0, maxobjects * sizeof( Type ) ); + } + numobjects = 0; + } + +template< class Type > +int Container::NumObjects + ( + void + ) + + { + return numobjects; + } + +template< class Type > +void Container::Resize + ( + int maxelements + ) + + { + Type *temp; + + if ( !objlist ) + { + maxobjects = maxelements; + objlist = new Type[ maxobjects ]; + memset( objlist, 0, maxobjects * sizeof( Type ) ); + } + else + { + temp = objlist; + maxobjects = maxelements; + if ( maxobjects < numobjects ) + { + maxobjects = numobjects; + } + + objlist = new Type[ maxobjects ]; + memset( objlist, 0, maxobjects * sizeof( Type ) ); + memcpy( objlist, temp, numobjects * sizeof( Type ) ); + delete temp; + } + } + +template< class Type > +void Container::AddObject + ( + Type obj + ) + + { + Type *temp; + + if ( !objlist ) + { + Resize( 10 ); + } + + if ( numobjects == maxobjects ) + { + Resize( maxobjects * 2 ); + } + + objlist[ numobjects++ ] = obj; + } + +template< class Type > +int Container::IndexOfObject + ( + Type obj + ) + + { + int i; + + for( i = 0; i < numobjects; i++ ) + { + if ( objlist[ i ] == obj ) + { + return i + 1; + } + } + + return 0; + } + +template< class Type > +qboolean Container::ObjectInList + ( + Type obj + ) + + { + if ( !IndexOfObject( obj ) ) + { + return false; + } + + return true; + } + +template< class Type > +Type Container::ObjectAt + ( + int index + ) + + { + if ( ( index <= 0 ) || ( index > numobjects ) ) + { + gi.DPrintf( "Container::ObjectAt : index out of range" ); + return 0; + } + + return objlist[ index - 1 ]; + } + +template< class Type > +void Container::RemoveObjectAt + ( + int index + ) + + { + int i; + + if ( !objlist ) + { + gi.DPrintf( "Container::RemoveObjectAt : Empty list" ); + return; + } + + if ( ( index <= 0 ) || ( index > numobjects ) ) + { + gi.DPrintf( "Container::RemoveObjectAt : index out of range" ); + return; + } + + i = index - 1; + memcpy( &objlist[ i ], &objlist[ i + 1 ], ( numobjects - 1 - i ) * sizeof( Type ) ); + memset( &objlist[ numobjects - 1 ], 0, sizeof( Type ) ); + numobjects--; + } + +template< class Type > +void Container::RemoveObject + ( + Type obj + ) + + { + int index; + + index = IndexOfObject( obj ); + if ( !index ) + { + gi.DPrintf( "Container::RemoveObject : Object not in list" ); + return; + } + + RemoveObjectAt( index ); + } + +#endif \ No newline at end of file diff --git a/source/source/cgame/container.h b/source/source/cgame/container.h new file mode 100644 index 0000000..8cc7518 --- /dev/null +++ b/source/source/cgame/container.h @@ -0,0 +1,538 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/container.h $ +// $Revision:: 9 $ +// $Author:: Steven $ +// $Date:: 7/26/00 1:08p $ +// +// Copyright (C) 1997 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/container.h $ +// +// 9 7/26/00 1:08p Steven +// In ClearObjectList make sure we don't have 0 maxelements when creating a new +// array. +// +// 8 7/25/00 2:32p Aldie +// Undo checkout for new operator +// +// 7 7/25/00 2:18p Aldie +// changed the new operator for containers +// +// 6 5/26/00 7:44p Markd +// 2nd phase save games +// +// 5 1/06/00 11:18p Jimdose +// put sort back in +// +// 4 1/06/00 11:08p Jimdose +// cleaning up unused code +// +// 3 10/05/99 2:03p Markd +// Added warning about files being in multiple projects +// +// 2 9/28/99 4:26p Markd +// merged listener, class and vector between 3 projects +// +// 1 9/10/99 10:53a Jimdose +// +// 1 9/08/99 3:15p Aldie +// +// DESCRIPTION: +// Base class for a dynamic array. Allows adding, removing, index of, +// and finding of entries with specified value. NOTE: indices in container +// are 1 based, not 0. This means that loops must check from 1 up to and including +// NumObjects() (ei. for( i = 1; i <= list.NumObjects(); i++ ) ). +// +// FIXME: Someday make this 0 based and update all code to match. +// +// WARNING: This file is shared between fgame, cgame and possibly the user interface. +// It is instanced in each one of these directories because of the way that SourceSafe works. +// + +#ifndef __CONTAINER_H__ +#define __CONTAINER_H__ + +#if defined( GAME_DLL ) +// +// game dll specific defines +// +#include "g_local.h" + +#define CONTAINER_Error gi.Error +#define CONTAINER_DPrintf gi.DPrintf + +#elif defined ( CGAME_DLL ) +// +// cgame dll specific defines +// +#define CONTAINER_Error cgi.Error +#define CONTAINER_DPrintf cgi.DPrintf + +#else + +// +// client specific defines +// +#define CONTAINER_Error Com_Error +#define CONTAINER_DPrintf Com_DPrintf +#endif + +#include + +class Archiver; +template< class Type > +class Container + { + private: + Type *objlist; + int numobjects; + int maxobjects; + + public: + Container(); + ~Container(); + + void FreeObjectList( void ); + void ClearObjectList( void ); + int NumObjects( void ); + void Resize( int maxelements ); + void SetObjectAt( int index, Type& obj ); + int AddObject( Type& obj ); + int AddUniqueObject( Type& obj ); + void AddObjectAt( int index, Type& obj ); + int IndexOfObject( Type& obj ); + qboolean ObjectInList( Type& obj ); + Type& ObjectAt( int index ); + Type *AddressOfObjectAt( int index ); + void RemoveObjectAt( int index ); + void RemoveObject( Type& obj ); + void Sort( int ( __cdecl *compare )( const void *elem1, const void *elem2 ) ); +#if defined( GAME_DLL ) + void Archive( Archiver &arc ); +#endif + }; + +template< class Type > +Container::Container() + { + objlist = NULL; + FreeObjectList(); + } + +template< class Type > +Container::~Container() + { + FreeObjectList(); + } + +template< class Type > +void Container::FreeObjectList + ( + void + ) + + { + if ( objlist ) + { + delete[] objlist; + } + objlist = NULL; + numobjects = 0; + maxobjects = 0; + } + +template< class Type > +void Container::ClearObjectList + ( + void + ) + + { + // only delete the list if we have objects in it + if ( objlist && numobjects ) + { + delete[] objlist; + + if ( maxobjects == 0 ) + { + objlist = NULL; + return; + } + + objlist = new Type[ maxobjects ]; + numobjects = 0; + } + } + +template< class Type > +int Container::NumObjects + ( + void + ) + + { + return numobjects; + } + +template< class Type > +void Container::Resize + ( + int maxelements + ) + + { + Type *temp; + int i; + + assert( maxelements >= 0 ); + + if ( maxelements <= 0 ) + { + FreeObjectList(); + return; + } + + if ( !objlist ) + { + maxobjects = maxelements; + objlist = new Type[ maxobjects ]; + } + else + { + temp = objlist; + maxobjects = maxelements; + if ( maxobjects < numobjects ) + { + maxobjects = numobjects; + } + + objlist = new Type[ maxobjects ]; + for( i = 0; i < numobjects; i++ ) + { + objlist[ i ] = temp[ i ]; + } + delete[] temp; + } + } + +template< class Type > +void Container::SetObjectAt + ( + int index, + Type& obj + ) + + { + if ( ( index <= 0 ) || ( index > numobjects ) ) + { + CONTAINER_Error( ERR_DROP, "Container::SetObjectAt : index out of range" ); + } + + objlist[ index - 1 ] = obj; + } + +template< class Type > +int Container::AddObject + ( + Type& obj + ) + + { + if ( !objlist ) + { + Resize( 10 ); + } + + if ( numobjects == maxobjects ) + { + Resize( maxobjects * 2 ); + } + + objlist[ numobjects ] = obj; + numobjects++; + + return numobjects; + } + +template< class Type > +int Container::AddUniqueObject + ( + Type& obj + ) + + { + int index; + + index = IndexOfObject( obj ); + if ( !index ) + index = AddObject( obj ); + return index; + } + +template< class Type > +void Container::AddObjectAt + ( + int index, + Type& obj + ) + + { + // + // this should only be used when reconstructing a list that has to be identical to the original + // + if ( index > maxobjects ) + { + Resize( index ); + } + if ( index > numobjects ) + { + numobjects = index; + } + SetObjectAt( index, obj ); + } + +template< class Type > +int Container::IndexOfObject + ( + Type& obj + ) + + { + int i; + + for( i = 0; i < numobjects; i++ ) + { + if ( objlist[ i ] == obj ) + { + return i + 1; + } + } + + return 0; + } + +template< class Type > +qboolean Container::ObjectInList + ( + Type& obj + ) + + { + if ( !IndexOfObject( obj ) ) + { + return false; + } + + return true; + } + +template< class Type > +Type& Container::ObjectAt + ( + int index + ) + + { + if ( ( index <= 0 ) || ( index > numobjects ) ) + { + CONTAINER_Error( ERR_DROP, "Container::ObjectAt : index out of range" ); + } + + return objlist[ index - 1 ]; + } + +template< class Type > +Type * Container::AddressOfObjectAt + ( + int index + ) + + { + // + // this should only be used when reconstructing a list that has to be identical to the original + // + if ( index > maxobjects ) + { + CONTAINER_Error( ERR_DROP, "Container::AddressOfObjectAt : index is greater than maxobjects" ); + } + if ( index > numobjects ) + { + numobjects = index; + } + return &objlist[ index - 1 ]; + } + +template< class Type > +void Container::RemoveObjectAt + ( + int index + ) + + { + int i; + + if ( !objlist ) + { + CONTAINER_DPrintf( "Container::RemoveObjectAt : Empty list\n" ); + return; + } + + if ( ( index <= 0 ) || ( index > numobjects ) ) + { + CONTAINER_Error( ERR_DROP, "Container::RemoveObjectAt : index out of range" ); + return; + } + + i = index - 1; + numobjects--; + for( i = index - 1; i < numobjects; i++ ) + { + objlist[ i ] = objlist[ i + 1 ]; + } + } + +template< class Type > +void Container::RemoveObject + ( + Type& obj + ) + + { + int index; + + index = IndexOfObject( obj ); + if ( !index ) + { + CONTAINER_DPrintf( "Container::RemoveObject : Object not in list\n" ); + return; + } + + RemoveObjectAt( index ); + } + +template< class Type > +void Container::Sort + ( + int ( __cdecl *compare )( const void *elem1, const void *elem2 ) + ) + + { + if ( !objlist ) + { + CONTAINER_DPrintf( "Container::Sort : Empty list\n" ); + return; + } + + qsort( ( void * )objlist, ( size_t )numobjects, sizeof( Type ), compare ); + } + +#if 0 +#if defined( GAME_DLL ) + +#include "str.h" +void Container::Archive + ( + Archiver &arc + ) + { + int i, num; + + if ( arc.Loading() ) + { + ClearObjectList(); + arc.ArchiveInteger( &num ); + Resize( num ); + } + else + { + num = numobjects; + arc.ArchiveInteger( &num ); + } + for( i = 1; i <= num; i++ ) + { + arc.ArchiveString( AddressOfObjectAt( i ) ); + } + } + +#include "vector.h" +void Container::Archive + ( + Archiver &arc + ) + { + int i, num; + + if ( arc.Loading() ) + { + ClearObjectList(); + arc.ArchiveInteger( &num ); + Resize( num ); + } + else + { + num = numobjects; + arc.ArchiveInteger( &num ); + } + for( i = 1; i <= num; i++ ) + { + arc.ArchiveVector( AddressOfObjectAt( i ) ); + } + } + +void Container::Archive + ( + Archiver &arc + ) + { + int i, num; + + if ( arc.Loading() ) + { + ClearObjectList(); + arc.ArchiveInteger( &num ); + Resize( num ); + } + else + { + num = numobjects; + arc.ArchiveInteger( &num ); + } + for( i = 1; i <= num; i++ ) + { + arc.ArchiveInteger( AddressOfObjectAt( i ) ); + } + } + +void Container::Archive + ( + Archiver &arc + ) + { + int i, num; + + if ( arc.Loading() ) + { + ClearObjectList(); + arc.ArchiveInteger( &num ); + Resize( num ); + } + else + { + num = numobjects; + arc.ArchiveInteger( &num ); + } + for( i = 1; i <= num; i++ ) + { + arc.ArchiveFloat( AddressOfObjectAt( i ) ); + } + } + +#endif +#endif + +#endif /* container.h */ diff --git a/source/source/cgame/listener.cpp b/source/source/cgame/listener.cpp new file mode 100644 index 0000000..e485689 --- /dev/null +++ b/source/source/cgame/listener.cpp @@ -0,0 +1,3435 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/listener.cpp $ +// $Revision:: 61 $ +// $Author:: Aldie $ +// $Date:: 8/10/00 7:38p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/listener.cpp $ +// +// 61 8/10/00 7:38p Aldie +// Working on cleaning stuff +// +// 60 8/10/00 7:34p Aldie +// +// 59 8/10/00 7:21p Aldie +// Added some cleanup to events +// +// 58 8/10/00 7:04p Aldie +// Changed a string allocation +// +// 57 7/14/00 11:30a Markd +// changed initial number of allocated events +// +// 56 7/13/00 12:31p Steven +// Check to see if event is equal to EV_Remove before trying to use it to print +// out info on it. +// +// 55 7/03/00 2:12p Steven +// fixed a crash bug in EventVar::GetVector +// +// 54 6/27/00 2:35p Markd +// allowed vectors to be set to entities to get their origins +// +// 53 6/23/00 9:12p Markd +// fixed some loading of events at spawn time +// +// 52 6/22/00 3:45p Markd +// fixed a bunch of saved game issues +// +// 51 6/14/00 12:14p Markd +// more intel compiler bug fixes +// +// 50 6/06/00 10:57a Steven +// Fixed a compiler issue with g_timeevents change. +// +// 49 6/06/00 10:38a Steven +// Improved g_timeevents. +// +// 48 5/27/00 8:07p Markd +// Saved games 3rd pass +// +// 47 5/26/00 7:44p Markd +// 2nd phase save games +// +// 46 5/25/00 4:28p Markd +// fixed up archive functions +// +// 45 5/24/00 3:14p Markd +// first phase of save/load games +// +// 44 4/29/00 3:26p Markd +// fleshed out the rest of the event/class documentation +// +// 43 4/26/00 7:55p Markd +// Added more documentation code into various systems +// +// 42 4/08/00 3:57p Steven +// Made it so in EventVar( Entity *ent ) if ent was NULL it would save the +// entnum as ENTITYNUM_NONE instead of 0. +// +// 41 3/16/00 7:04p Markd +// Increased number of events allocated at startup +// +// 40 3/06/00 8:07p Markd +// cleaned up unused cvar's +// +// 39 2/24/00 3:16p Jimdose +// changed asserts when Event is unknown into dprintfs +// +// 38 2/23/00 10:07a Markd +// fixed center print and event system crash +// +// 37 2/15/00 5:17p Aldie +// Increased eventlimit and also added a count to print out the number of +// entities spawned +// +// 36 1/06/00 11:10p Jimdose +// cleaning up unused code +// +// 35 12/15/99 3:26p Markd +// fixed listener up a bit, but deleting events instead of realDeallocating +// them right away. +// +// 34 12/15/99 2:08p Markd +// undid test from before +// +// 33 12/15/99 12:11p Markd +// testing undoing my fix +// +// 32 12/15/99 11:45a Markd +// made Event's Classes and also freed up safe pointers at the appropriate +// times +// +// 31 12/13/99 11:14a Markd +// Incremental checkin +// +// 30 12/11/99 5:51p Markd +// First wave of bug fixes after q3a gold merge +// +// 29 12/11/99 3:37p Markd +// q3a gold checkin, first time +// +// 28 10/21/99 2:19p Markd +// Changed range to use ..., fixed fadein and fadeout some more +// +// 27 10/21/99 10:57a Markd +// fixed suppression of _events +// +// 26 10/20/99 7:04p Markd +// suppress commands starting with '_' +// +// 25 10/18/99 2:54p Aldie +// Upped the number of client events +// +// 24 10/11/99 12:01p Steven +// Added some more tabing support when printing out event documentation. +// +// 23 10/11/99 10:05a Markd +// Added some tabbing support to event documentation +// +// 22 10/09/99 6:04p Markd +// changed up documentation a bit +// +// 21 10/07/99 7:14p Aldie +// More beam stuff +// +// 20 10/07/99 3:03p Steven +// Added a new event constructor that only takes a const char * as a parm. +// +// 19 10/06/99 3:09p Steven +// Added dumpevents command. +// +// 18 10/05/99 2:03p Markd +// Added warning about files being in multiple projects +// +// 17 10/03/99 4:50p Markd +// removed str& constructor from listener +// +// 16 10/02/99 6:51p Markd +// Put in backend work for event documentation and fixed a lot of event +// documentation bugs +// +// 15 10/01/99 3:50p Markd +// fixed some level 4 warnings +// +// 14 9/30/99 10:50a Markd +// put in different warning printing depending on which module is used +// +// 13 9/29/99 7:43p Markd +// Made items behave better when dropping to floor +// +// 12 9/29/99 3:36p Steven +// Event formatting. +// +// 11 9/28/99 7:15p Morbid +// +// 10 9/28/99 5:31p Markd +// Successfully merged class.h, listener.h and vector.h into all three modules, +// cgame, fgame and client +// +// 9 9/28/99 5:15p Markd +// Fixed more merge bugs with sharing class, vector and listener between three +// modules +// +// 8 9/28/99 4:26p Markd +// merged listener, class and vector between 3 projects +// +// 7 9/28/99 10:12a Markd +// fixed some event issues +// +// 6 9/27/99 5:44p Markd +// began documentation and cleanup phase after merge +// +// 5 9/22/99 4:48p Markd +// fixed more G_GetEntity, G_FindClass and G_GetNextEntity bugs +// +// 4 9/21/99 7:51p Markd +// Fixed a lot of entitynum_none issues +// +// 3 9/15/99 6:57p Aldie +// Update to get game working +// +// 2 9/10/99 5:45p Jimdose +// merge +// +// 1 9/10/99 10:54a Jimdose +// +// 1 9/08/99 3:16p Aldie +// +// 17 9/02/99 2:33p Markd +// Added cache ability to entities +// +// 16 8/28/99 3:33p Jimdose +// Added EventVar +// All event args now have type information and use lazy evaluation +// +// 15 8/27/99 8:25p Markd +// added pengingevents and fixed some event holes +// +// 14 8/27/99 3:30p Markd +// put in event caching system so that events are reused +// +// 13 8/19/99 12:16p Jimdose +// added event stats +// added lru check to FindEvent +// +// DESCRIPTION: +// +// WARNING: This file is shared between fgame, cgame and possibly the user interface. +// It is instanced in each one of these directories because of the way that SourceSafe works. +// + +#include "listener.h" + +#if defined( GAME_DLL ) + +#include "scriptvariable.h" +#include "worldspawn.h" +#include "scriptmaster.h" + +#elif defined( CGAME_DLL ) + +#elif defined( UI_LIB ) + +#else + +#include "client.h" + +#endif + +Event EV_Remove + ( + "immediateremove", + EV_DEFAULT, + NULL, + NULL, + "Removes this listener immediately." + ); +Event EV_ScriptRemove + ( + "remove", + EV_DEFAULT, + NULL, + NULL, + "Removes this listener the next time events are processed." + ); + +extern "C" + { + int numEvents = 0; + int numFreeEvents = 0; + } + +cvar_t *g_showevents; +cvar_t *g_eventlimit; +cvar_t *g_timeevents; +cvar_t *g_watch; +cvar_t *g_eventstats; + +Event FreeEventHead; +Event *FreeEvents = &FreeEventHead; +Event EventQueueHead; +Event *EventQueue = &EventQueueHead; +Event ActiveEventHead; +Event *ActiveEvents = &ActiveEventHead; + +Container *Event::commandList = NULL; +Container *Event::flagList = NULL; +Container *Event::sortedList = NULL; +Container *Event::eventDefList = NULL; +qboolean Event::dirtylist = false; + +int Event::numfinds; +int Event::numfirstsearch; +int Event::numcompares; +int Event::lastevent; +bool Event::EventSystemStarted; + +int Event_totalmemallocated; + +Event NullEvent; + +void EV_Print( FILE *event_file, const char *fmt, ... ) + { + va_list argptr; + char text[ 1024 ]; + + va_start( argptr, fmt ); + vsprintf( text, fmt, argptr ); + va_end( argptr ); + + if ( event_file ) + fprintf( event_file, text ); + else + EVENT_Printf( text ); + } + +EventVar::EventVar + ( + const char *text + ) + + { + assert( text ); + if ( !text ) + { + text = ""; + } + + dirtyFlags = DIRTY_ALL & ~DIRTY_STRING; + stringValue = text; +#ifdef GAME_DLL + type = Director.isVarGroup( text ) ? IS_SCRIPTVARIABLE : IS_STRING; +#else + type = IS_STRING; +#endif + } + +EventVar::EventVar + ( + str &text + ) + + { + dirtyFlags = DIRTY_ALL & ~DIRTY_STRING; + stringValue = text; +#ifdef GAME_DLL + type = Director.isVarGroup( text.c_str() ) ? IS_SCRIPTVARIABLE : IS_STRING; +#else + type = IS_STRING; +#endif + } + +#ifdef GAME_DLL + +EventVar::EventVar + ( + Entity *ent + ) + + { + type = IS_ENTITY; + dirtyFlags = DIRTY_ALL & ~DIRTY_INTEGER; + if ( ent ) + { + intValue = ent->entnum; + } + else + { + intValue = ENTITYNUM_NONE; + } + } + +void EventVar::Archive + ( + Archiver &arc + ) + + { + arc.ArchiveShort( &type ); + arc.ArchiveShort( &dirtyFlags ); + arc.ArchiveString( &stringValue ); + arc.ArchiveVector( &vectorValue ); + arc.ArchiveInteger( &intValue ); + arc.ArchiveFloat( &floatValue ); + } + +#endif + +const char *EventVar::GetToken + ( + Event &ev + ) + + { + if ( dirtyFlags & DIRTY_STRING ) + { + switch( type ) + { + case IS_VECTOR : + stringValue = va( "(%f %f %f)", vectorValue.x, vectorValue.y, vectorValue.z ); + break; + + case IS_INTEGER : + stringValue = va( "%d", intValue ); + break; + + case IS_FLOAT : + stringValue = va( "%f", floatValue ); + break; + + case IS_ENTITY : + stringValue = va( "*%d", intValue ); + break; + } + + dirtyFlags &= ~DIRTY_STRING; + } + + return stringValue.c_str(); + } + +const char *EventVar::GetString + ( + Event &ev + ) + + { + if ( dirtyFlags & DIRTY_STRING ) + { + switch( type ) + { + case IS_VECTOR : + stringValue = va( "(%f %f %f)", vectorValue.x, vectorValue.y, vectorValue.z ); + break; + + case IS_INTEGER : + stringValue = va( "%d", intValue ); + break; + + case IS_FLOAT : + stringValue = va( "%f", floatValue ); + break; + + case IS_ENTITY : + stringValue = va( "*%d", intValue ); + break; + } + + dirtyFlags &= ~DIRTY_STRING; + } + +#ifdef GAME_DLL + if ( type == IS_SCRIPTVARIABLE ) + { + ScriptVariable *var; + + var = Director.GetExistingVariable( stringValue.c_str() ); + if ( var ) + { + return var->stringValue(); + } + else + { + ev.Error( "Variable %s does not exist.", stringValue.c_str() ); + return ""; + } + } +#endif + + return stringValue.c_str(); + } + +int EventVar::GetInteger + ( + Event &ev + ) + + { + if ( dirtyFlags & DIRTY_INTEGER ) + { + switch( type ) + { + case IS_STRING : + intValue = atoi( stringValue.c_str() ); + break; + + case IS_VECTOR : + intValue = 0; + break; + + case IS_FLOAT : + intValue = int( floatValue ); + break; + + case IS_SCRIPTVARIABLE : +#ifdef GAME_DLL + ScriptVariable *var; + + var = Director.GetExistingVariable( stringValue.c_str() ); + if ( var ) + { + if ( !::IsNumeric( var->stringValue() ) ) + { + ev.Error( "Variable %s contains non-numeric value '%s'", stringValue.c_str(), + var->stringValue() ); + } + + // don't change the dirty flag since the variable may change in the future + return var->intValue(); + } + else + { + ev.Error( "Variable %s does not exist.", stringValue.c_str() ); + // don't change the dirty flag since the variable may exist in the future + //FIXME + // someday, missing variable names should be an error... + return 0; + } +#endif + break; + } + + dirtyFlags &= ~DIRTY_INTEGER; + } + + return intValue; + } + +float EventVar::GetFloat + ( + Event &ev + ) + + { + if ( dirtyFlags & DIRTY_FLOAT ) + { + switch( type ) + { + case IS_STRING : + floatValue = atof( stringValue.c_str() ); + break; + + case IS_VECTOR : + floatValue = 0; + break; + + case IS_ENTITY : + case IS_INTEGER : + floatValue = float( intValue ); + break; + + case IS_SCRIPTVARIABLE : +#ifdef GAME_DLL + ScriptVariable *var; + + var = Director.GetExistingVariable( stringValue.c_str() ); + if ( var ) + { + if ( !::IsNumeric( var->stringValue() ) ) + { + ev.Error( "Variable %s contains non-numeric value '%s'", stringValue.c_str(), + var->stringValue() ); + } + + // don't change the dirty flag since the variable may change in the future + return var->floatValue(); + } + else + { + ev.Error( "Variable %s does not exist.", stringValue.c_str() ); + // don't change the dirty flag since the variable may exist in the future + //FIXME + // someday, missing variable names should be an error... + return 0.0f; + } +#endif + break; + } + + dirtyFlags &= ~DIRTY_FLOAT; + } + + return floatValue; + } + +Vector EventVar::GetVector + ( + Event &ev + ) + + { + if ( dirtyFlags & DIRTY_VECTOR ) + { + switch( type ) + { + case IS_STRING : + const char *text; + + text = stringValue.c_str(); + if ( text[ 0 ] == '(' ) + { + vectorValue = &text[ 1 ]; + } +#ifdef GAME_DLL + // is it an entity + else if ( text[ 0 ] == '$' ) + { + Entity * ent; + + // allow console users to not use '$' + ent = G_FindTarget( NULL, &text[ 1 ] ); + + if ( ent ) + { + vectorValue = ent->origin; + } + else + { + vectorValue = vec_zero; + } + } +#endif + else + { + vectorValue = text; + } + break; + + case IS_FLOAT : + case IS_INTEGER : + vectorValue = vec_zero; + break; + case IS_ENTITY : +#ifdef GAME_DLL + { + Entity * ent; + + ent = G_GetEntity( intValue ); + if ( ent ) + { + vectorValue = ent->origin; + } + else + { + vectorValue = vec_zero; + } + } +#else + vectorValue = vec_zero; +#endif + break; + + case IS_SCRIPTVARIABLE : +#ifdef GAME_DLL + ScriptVariable *var; + + var = Director.GetExistingVariable( stringValue.c_str() ); + if ( !var ) + { + ev.Error( "Variable %s does not exist.", stringValue.c_str() ); + return vec_zero; + } + + // don't change the dirty flag since the variable may change in the future + return var->vectorValue(); +#endif + break; + } + + dirtyFlags &= ~DIRTY_VECTOR; + } + + return vectorValue; + } + +#ifdef GAME_DLL +Entity *EventVar::GetEntity + ( + Event &ev + ) + + { + if ( dirtyFlags & DIRTY_INTEGER ) + { + switch( type ) + { + case IS_VECTOR : + intValue = 0; + break; + + case IS_FLOAT : + intValue = int( floatValue ); + break; + + case IS_SCRIPTVARIABLE : + case IS_STRING : + const char *name; + int t; + + t = 0; + if ( type == IS_STRING ) + { + name = stringValue.c_str(); + if ( ev.GetSource() == EV_FROM_CONSOLE ) + { + Entity * ent; + + // allow console users to not use '$' + ent = G_FindTarget( NULL, name ); + intValue = ent->entnum; + break; + } + } + else + { + ScriptVariable *var; + + var = Director.GetExistingVariable( stringValue.c_str() ); + if ( !var ) + { + ev.Error( "Variable %s does not exist.", stringValue.c_str() ); + return NULL; + } + + name = var->stringValue(); + } + + if ( name[ 0 ] == '$' ) + { + Entity * ent; + + ent = G_FindTarget( NULL, &name[ 1 ] ); + if ( !ent ) + { + ev.Error( "Entity with targetname of '%s' not found", &name[ 1 ] ); + + return NULL; + } + else + { + t = ent->entnum; + } + } + else + { + if ( name[ 0 ] != '*' ) + { + if ( ev.GetSource() == EV_FROM_CONSOLE ) + { + ev.Error( "Entity with targetname of '%s' not found", name ); + } + else + { + ev.Error( "Expecting a '*'-prefixed entity number but found '%s'.", name ); + } + + return NULL; + } + + if ( !::IsNumeric( &name[ 1 ] ) ) + { + ev.Error( "Expecting a numeric value but found '%s'.", &name[ 1 ] ); + + return NULL; + } + else + { + t = atoi( &name[ 1 ] ); + } + } + + if ( type == IS_STRING ) + { + intValue = t; + } + else + { + if ( ( t < 0 ) || ( t > game.maxentities ) ) + { + ev.Error( "%d out of valid range for entity.", t ); + return NULL; + } + + // don't change the dirty flag since the variable may change in the future + return G_GetEntity( t ); + } + break; + } + + dirtyFlags &= ~DIRTY_INTEGER; + } + + if ( ( intValue < 0 ) || ( intValue > game.maxentities ) ) + { + ev.Error( "%d out of valid range for entity.", intValue ); + return NULL; + } + + return G_GetEntity( intValue ); + } + +ScriptVariable *EventVar::GetVariable + ( + Event &ev + ) + + { + if ( type != IS_SCRIPTVARIABLE ) + { + return NULL; + } + + return Director.GetExistingVariable( stringValue.c_str() ); + } +#else + +qboolean IsNumeric + ( + const char *str + ) + + { + int len; + int i; + qboolean dot; + + if ( *str == '-' ) + { + str++; + } + + dot = qfalse; + len = strlen( str ); + for( i = 0; i < len; i++ ) + { + if ( !isdigit( str[ i ] ) ) + { + if ( ( str[ i ] == '.' ) && !dot ) + { + dot = qtrue; + continue; + } + return qfalse; + } + } + + return qtrue; + } + +#endif + +qboolean EventVar::IsVector + ( + Event &ev + ) + + { + switch( type ) + { + case IS_VECTOR : + return true; + break; + + case IS_STRING : + if ( stringValue.c_str()[ 0 ] == '(' ) + { + return true; + } + break; + + case IS_SCRIPTVARIABLE : +#ifdef GAME_DLL + ScriptVariable *var; + + var = Director.GetExistingVariable( stringValue.c_str() ); + if ( var && ( var->stringValue()[ 0 ] == '(' ) ) + { + return true; + } +#endif + break; + } + + return false; + } + +qboolean EventVar::IsNumeric + ( + Event &ev + ) + + { + switch( type ) + { + case IS_STRING : + return ::IsNumeric( stringValue.c_str() ); + break; + +#ifdef GAME_DLL + case IS_SCRIPTVARIABLE : + ScriptVariable *var; + + var = Director.GetExistingVariable( stringValue.c_str() ); + if ( var ) + { + return ::IsNumeric( var->stringValue() ); + } + break; +#endif + + case IS_FLOAT : + case IS_INTEGER : + return true; + break; + } + + return false; + } + +//=========================================================================== +// EventArgDef +//=========================================================================== + +void EventArgDef::Setup + ( + const char *eventName, + const char *argName, + const char *argType, + const char *argRange + ) + { + char scratch[ 256 ]; + const char *ptr; + char *tokptr; + const char *endptr; + int index; + + // set name + name = argName; + + // set optionality + if ( isupper( argType[ 0 ] ) ) + { + optional = qtrue; + } + else + { + optional = qfalse; + } + + // grab the ranges + index = 0; + memset( minRangeDefault, qtrue, sizeof( minRangeDefault ) ); + memset( minRange, 0, sizeof( minRange ) ); + memset( maxRangeDefault, qtrue, sizeof( maxRangeDefault ) ); + memset( maxRange, 0, sizeof( maxRange ) ); + + if ( argRange && argRange[ 0 ] ) + { + ptr = argRange; + while( 1 ) + { + // find opening '[' + tokptr = strchr( ptr, '[' ); + if ( !tokptr ) + { + break; + } + // find closing ']' + endptr = strchr( tokptr, ']' ); + if ( !endptr ) + { + assert( 0 ); + EVENT_DPrintf( "Argument defintion %s, no matching ']' found for range spec in event %s.\n", name, eventName ); + break; + } + // point to the next range + ptr = endptr; + // skip the '[' + tokptr++; + // copy off the range spec + // skip the ']' + strncpy( scratch, tokptr, endptr - tokptr ); + // terminate the range + scratch[ endptr - tokptr ] = 0; + // see if there is one or two parameters here + tokptr = strchr( scratch, ',' ); + if ( !tokptr ) + { + // just one parameter + minRange[ index >> 1 ] = atof( scratch ); + minRangeDefault[ index >> 1 ] = qfalse; + index++; + // skip the second parameter + index++; + } + else if ( tokptr == scratch ) + { + // just second parameter + // skip the first paremeter + index++; + tokptr++; + maxRange[ index >> 1 ] = atof( scratch ); + maxRangeDefault[ index >> 1 ] = qfalse; + index++; + } + else + { + qboolean second; + // one or two parameters + // see if there is anything behind the ',' + if ( strlen( scratch ) > ( tokptr - scratch + 1) ) + second = qtrue; + else + second = qfalse; + // zero out the ',' + *tokptr = 0; + minRange[ index >> 1 ] = atof( scratch ); + minRangeDefault[ index >> 1 ] = qfalse; + index++; + // skip over the nul character + tokptr++; + if ( second ) + { + maxRange[ index >> 1 ] = atof( tokptr ); + maxRangeDefault[ index >> 1 ] = qfalse; + } + index++; + } + } + } + + // figure out the type of variable it is + switch( tolower( argType[ 0 ] ) ) + { + case 'e': + type = IS_ENTITY; + break; + case 'v': + type = IS_VECTOR; + break; + case 'i': + type = IS_INTEGER; + break; + case 'f': + type = IS_FLOAT; + break; + case 's': + type = IS_STRING; + break; + case 'b': + type = IS_BOOLEAN; + break; + } + } + +void EventArgDef::PrintRange + ( + FILE *event_file + ) + { + qboolean integer; + qboolean single; + int numRanges; + int i; + + single = qfalse; + integer = qtrue; + numRanges = 1; + switch( type ) + { + case IS_VECTOR: + integer = qfalse; + numRanges = 3; + break; + case IS_FLOAT: + integer = qfalse; + break; + case IS_STRING: + single = qtrue; + break; + } + for( i = 0; i < numRanges; i++ ) + { + if ( single ) + { + if ( !minRangeDefault[ i ] ) + { + if ( integer ) + { + EV_Print( event_file, "<%d>", ( int )minRange[ i ] ); + } + else + { + EV_Print( event_file, "<%.2f>", minRange[ i ] ); + } + } + } + else + { + // both non-default + if ( !minRangeDefault[ i ] && !maxRangeDefault[ i ] ) + { + if ( integer ) + { + EV_Print( event_file, "<%d...%d>", ( int )minRange[ i ], ( int )maxRange[ i ] ); + } + else + { + EV_Print( event_file, "<%.2f...%.2f>", minRange[ i ], maxRange[ i ] ); + } + } + // max default + else if ( !minRangeDefault[ i ] && maxRangeDefault[ i ] ) + { + if ( integer ) + { + EV_Print( event_file, "<%d...max_integer>", ( int )minRange[ i ] ); + } + else + { + EV_Print( event_file, "<%.2f...max_float>", minRange[ i ] ); + } + } + // min default + else if ( minRangeDefault[ i ] && !maxRangeDefault[ i ] ) + { + if ( integer ) + { + EV_Print( event_file, "", ( int )maxRange[ i ] ); + } + else + { + EV_Print( event_file, "", maxRange[ i ] ); + } + } + } + } + } + +void EventArgDef::PrintArgument + ( + FILE *event_file + ) + { + if ( optional ) + { + EV_Print( event_file, "[ " ); + } + switch( type ) + { + case IS_ENTITY: + EV_Print( event_file, "Entity " ); + break; + case IS_VECTOR: + EV_Print( event_file, "Vector " ); + break; + case IS_INTEGER: + EV_Print( event_file, "Integer " ); + break; + case IS_FLOAT: + EV_Print( event_file, "Float " ); + break; + case IS_STRING: + EV_Print( event_file, "String " ); + break; + case IS_BOOLEAN: + EV_Print( event_file, "Boolean " ); + break; + } + EV_Print( event_file, "%s", name.c_str() ); + + // print the range of the argument + PrintRange( event_file ); + + if ( optional ) + { + EV_Print( event_file, " ]" ); + } + } + + +//=========================================================================== +// EventCode +//=========================================================================== + +CLASS_DECLARATION( Class, Event, NULL ) + { + { NULL, NULL } + }; + +// Free Event Management routines +static Event *RealAllocateEvent + ( + void + ) + { + Event *event; + + event = ( Event * )::new char[ sizeof( Event ) ]; + Event_totalmemallocated += sizeof( Event ); + + return event; + } + +static void RealDeallocateEvent + ( + Event * event + ) + { + ::delete[]( ( void * )event ); + Event_totalmemallocated -= sizeof( Event ); + } + +void * Event::operator new( size_t s ) + { + Event * newevent; + + assert( sizeof( Event ) == s ); + + // if the list is empty create a new one + if ( LL_Empty( FreeEvents, next, prev ) ) + { + // this is here to let us know that it is happening + assert( 0 ); + newevent = RealAllocateEvent(); + } + else + { + newevent = FreeEvents->next; + LL_Remove( newevent, next, prev ); + numFreeEvents--; + } + + // add it to the active list of events + LL_Add( ActiveEvents, newevent, next, prev ); + + newevent->time = EVENT_time; + newevent->flags = 0; + + return newevent; + } + +void Event::operator delete( void *ptr ) + { + Event * event; + + event = ( Event * )ptr; + + // clear out any safe pointers we have setup + event->ClearSafePointers(); + + LL_Remove( event, next, prev ); + LL_Add( FreeEvents, event, next, prev ); + numFreeEvents++; + } + +#if defined( GAME_DLL ) +#define INITIALLY_ALLOCATED_EVENTS 4500 +#elif defined ( CGAME_DLL ) +#define INITIALLY_ALLOCATED_EVENTS 512 +#elif defined ( UI_LIB ) +#define INITIALLY_ALLOCATED_EVENTS 192 +#else +#define INITIALLY_ALLOCATED_EVENTS 192 +#endif + +void Event::InitializeEventLists + ( + void + ) + { + Event * newevent; + int i; + + numEvents = 0; + numFreeEvents = 0; + // + // initialize lists + // + LL_Reset( FreeEvents, next, prev ); + LL_Reset( EventQueue, next, prev ); + LL_Reset( ActiveEvents, next, prev ); + + // + // allocate the initial allottment of events + // + for( i = 0; i < INITIALLY_ALLOCATED_EVENTS; i++ ) + { + newevent = RealAllocateEvent(); + LL_Add( FreeEvents, newevent, next, prev ); + numFreeEvents++; + } + } + +void Event::ShutdownEventLists + ( + void + ) + { + Event *event, *next; + + // free queued events + for( event = EventQueue->next; event != EventQueue; event = next ) + { + next = event->next; + delete event; + } + // free active events + for( event = ActiveEvents->next; event != ActiveEvents; event = next ) + { + next = event->next; + delete event; + } + // free free events + for( event = FreeEvents->next; event != FreeEvents; event = next ) + { + next = event->next; + RealDeallocateEvent( event ); + } + + assert( Event_totalmemallocated == 0 ); + + numEvents = 0; + numFreeEvents = 0; + + // + // initialize lists + // + LL_Reset( FreeEvents, next, prev ); + LL_Reset( EventQueue, next, prev ); + LL_Reset( ActiveEvents, next, prev ); + } + +int Event::NumEventCommands + ( + void + ) + + { + if ( commandList ) + { + // Add 1 since container gives the inclusive number of objects + return commandList->NumObjects() + 1; + } + + return 0; + } + +int Event::compareEvents + ( + const void *arg1, + const void *arg2 + ) + + { + int ev1; + int ev2; + + ev1 = *( int * )arg1; + ev2 = *( int * )arg2; + + return stricmp( commandList->ObjectAt( ev1 )->c_str(), commandList->ObjectAt( ev2 )->c_str() ); + } + +void Event::SortEventList + ( + void + ) + + { + dirtylist = false; + + if ( sortedList && commandList ) + { + qsort( ( void * )sortedList->AddressOfObjectAt( 1 ), + ( size_t )sortedList->NumObjects(), + sizeof( int ), compareEvents ); + } + } + +inline int Event::FindEvent + ( + const char *name + ) + + { + int eventnum; + int index; + int l; + int r; + int diff; + + assert( name ); + if ( !name ) + { + return 0; + } + + if ( !commandList ) + { + return 0; + } + + if ( dirtylist ) + { + SortEventList(); + } + + numfinds++; + numcompares++; + if ( lastevent && !stricmp( name, commandList->ObjectAt( lastevent )->c_str() ) ) + { + numfirstsearch++; + return lastevent; + } + + l = 1; + r = sortedList->NumObjects(); + while( r >= l ) + { + index = ( l + r ) >> 1; + eventnum = sortedList->ObjectAt( index ); + diff = stricmp( name, commandList->ObjectAt( eventnum )->c_str() ); + numcompares++; + if ( diff < 0 ) + { + r = index - 1; + } + else if ( diff > 0 ) + { + l = index + 1; + } + else + { + lastevent = eventnum; + return eventnum; + } + } + + return 0; + } + +int Event::MapSortedEventIndex + ( + int index + ) + { + return sortedList->ObjectAt( index ); + } + + +int Event::FindEvent + ( + str &name + ) + + { + return FindEvent( name.c_str() ); + } + +void Event::ListCommands + ( + const char *mask + ) + + { + str name; + int flags; + int eventnum; + int num; + int i; + int n; + int l; + int p; + int hidden; + str text; + + if ( !commandList ) + { + EVENT_DPrintf( "No events.\n" ); + return; + } + + if ( dirtylist ) + { + SortEventList(); + } + + l = 0; + if ( mask ) + { + l = strlen( mask ); + } + + hidden = 0; + num = 0; + n = sortedList->NumObjects(); + for( i = 1; i <= n; i++ ) + { + eventnum = sortedList->ObjectAt( i ); + name = commandList->ObjectAt( eventnum )->c_str(); + flags = flagList->ObjectAt( eventnum ); + + if ( flags & EV_HIDE ) + { + hidden++; + continue; + } + + if ( mask && Q_stricmpn( name.c_str(), mask, l ) ) + { + continue; + } + + num++; + + text = " "; + p = 0; + if ( flags & EV_CONSOLE ) + { + text[ p++ ] = '*'; + } + if ( flags & EV_CHEAT ) + { + text[ p++ ] = 'C'; + } + if ( flags & EV_CACHE ) + { + text[ p++ ] = '%'; + } + + EVENT_Printf( "%4d : %s%s\n", eventnum, text.c_str(), name.c_str() ); + } + + EVENT_Printf( "\n* = console command.\nC = cheat command.\n% = cache command.\n\n" + "Printed %d of %d total commands.\n", num, n - hidden ); + + if ( developer->integer && hidden ) + { + EVENT_Printf( "Suppressed %d commands.\n", hidden ); + } + } + +#ifdef GAME_DLL + +void Event::PrintEvent + ( + Event * event + ) + { + int i; + int n; + Listener * obj; + str text; + + obj = event->GetSourceObject(); + + text = va( "%6.1f:%1d: %s", event->time, event->flags, obj->getClassname() ); + if ( obj->isSubclassOf( Entity ) ) + { + text += va( " (*%d) ", ( ( Entity * )obj )->entnum ); + if ( ( ( Entity * )obj )->Targeted() ) + { + text += va( "'%s'", ( ( Entity * )obj )->TargetName() ); + } + } + else if ( obj->isSubclassOf( ScriptThread ) ) + { + text += va( " #%d:'%s'", ( ( ScriptThread * )obj )->ThreadNum(), ( ( ScriptThread * )obj )->ThreadName() ); + } + else if ( obj->isSubclassOf( ScriptVariable ) ) + { + text += va( " '%s'", ( ( ScriptVariable * )obj )->getName() ); + } + + switch( event->GetSource() ) + { + default : + case EV_FROM_CODE : + text += " : Code :"; + break; + + case EV_FROM_SCRIPT : + assert( event->GetThread() ); + if ( event->GetThread() ) + { + text += va( " : %s(%d) :", event->GetThread()->Filename(), event->info.linenumber ); + } + else + { + text += " : NULL :"; + } + break; + + case EV_FROM_CONSOLE : + text += " : Console :"; + break; + } + + text += event->getName().c_str(); + n = event->NumArgs(); + for( i = 1; i <= n; i++ ) + { + text += va( " %s", event->GetToken( i ) ); + } + + text += "\n"; + + if ( !g_watch->integer || ( obj->isSubclassOf( Entity ) && ( g_watch->integer == ( ( Entity * )obj )->entnum ) ) ) + { + if ( g_showevents->integer == 2 ) + { + EVENT_DebugPrintf( text.c_str() ); + } + else + { + EVENT_DPrintf( "%s", text.c_str() ); + } + } + } + +#else + +void Event::PrintEvent + ( + Event * event + ) + { + int i; + int n; + str text; + + + text = va( "%6.1f:%1d ", event->time, event->flags ); + + switch( event->GetSource() ) + { + default : + case EV_FROM_CODE : + text += " : Code :"; + break; + + case EV_FROM_CONSOLE : + text += " : Console :"; + break; + } + + text += event->getName().c_str(); + n = event->NumArgs(); + for( i = 1; i <= n; i++ ) + { + text += va( " %s", event->GetToken( i ) ); + } + + text += "\n"; + + if ( g_showevents->integer == 2 ) + { + EVENT_DebugPrintf( text.c_str() ); + } + else + { + EVENT_DPrintf( text.c_str() ); + } + } + +#endif + +void Event::PendingEvents + ( + const char *mask + ) + + { + Event *event; + int l, num; + + l = 0; + if ( mask ) + { + l = strlen( mask ); + } + + assert( EventQueue ); + assert( EventQueue->next ); + assert( EventQueue->prev ); + + num = 0; + event = EventQueue->next; + while( event != EventQueue ) + { + assert( event ); + assert( event->m_sourceobject ); + + if ( !mask || !Q_stricmpn( event->getName().c_str(), mask, l ) ) + { + num++; + Event::PrintEvent( event ); + } + + event = event->next; + } + EVENT_Printf( "%d pending events as of %.2f\n", num, EVENT_time ); + } + +void Event::PrintDocumentation + ( + FILE *event_file, + qboolean html + ) + + { + int i; + int p; + str text; + + if ( !html ) + { + text = " "; + p = 0; + + if ( flags & EV_CONSOLE ) + { + text[ p++ ] = '*'; + } + if ( flags & EV_CHEAT ) + { + text[ p++ ] = 'C'; + } + if ( flags & EV_CACHE ) + { + text[ p++ ] = '%'; + } + } + + if ( html ) + { + EV_Print( event_file, "\n

    %s", name ); + } + else + { + if ( text[ 0 ] != ' ' ) + { + EV_Print( event_file, "\n%s:%s", text.c_str(), name ); + } + else + { + EV_Print( event_file, "\n%s %s", text.c_str(), name ); + } + } + + if ( definition ) + { + if ( html ) + { + EV_Print( event_file, "( " ); + } + else + { + EV_Print( event_file, "( " ); + } + for( i = 1; i <= definition->NumObjects(); i++ ) + { + definition->ObjectAt( i ).PrintArgument( event_file ); + if ( i < definition->NumObjects() ) + { + EV_Print( event_file, ", " ); + } + } + if ( html ) + { + EV_Print( event_file, " )
    \n" ); + } + else + { + EV_Print( event_file, " )\n" ); + } + } + else + { + if ( html ) + { + EV_Print( event_file, "
    \n" ); + } + else + { + EV_Print( event_file, "\n" ); + } + } + if ( documentation ) + { + char new_doc[1024]; + int old_index; + int new_index = 0; + + for ( old_index = 0 ; old_index < strlen ( documentation ) ; old_index++ ) + { + if ( documentation[old_index] == '\n' ) + { + if ( html ) + { + new_doc[new_index ] = '<'; + new_doc[new_index + 1] = 'B'; + new_doc[new_index + 2] = 'R'; + new_doc[new_index + 3] = '>'; + new_doc[new_index + 4] = '\n'; + new_index += 5; + } + else + { + new_doc[new_index ] = '\n'; + new_doc[new_index + 1] = '\t'; + new_doc[new_index + 2] = '\t'; + new_index += 3; + } + } + else + { + new_doc[new_index] = documentation[old_index]; + new_index++; + } + + } + + new_doc[new_index] = 0; + + if ( html ) + { +// EV_Print( event_file, "

    %s
    \n", new_doc ); + EV_Print( event_file, "
      %s
    \n", new_doc ); + } + else + { + EV_Print( event_file, "\t\t- %s\n", new_doc ); + } + } + } + +void Event::PrintEventDocumentation + ( + Event * ePtr, + FILE *event_file, + qboolean html + ) + + { + int flags; + + flags = ePtr->GetFlags(); + + if ( flags & EV_HIDE ) + { + return; + } + + // purposely suppressed + if ( ePtr->name[ 0 ] == '_' ) + { + return; + } + + ePtr->PrintDocumentation( event_file, html ); + } + + +void Event::ListDocumentation + ( + const char *mask, + qboolean print_to_disk + ) + + { + Event * ePtr; + int num; + int i; + int n; + int l; + int flags; + int hidden; + str name; + str text; + FILE *event_file = NULL; + str event_filename; + + if ( !eventDefList ) + { + EVENT_DPrintf( "No events.\n" ); + return; + } + + if ( print_to_disk ) + { + if ( !mask || !mask[0] ) + event_filename = EVENT_FILENAME; + else + event_filename = str ( mask ) + ".txt"; + + event_file = fopen( event_filename.c_str(), "w" ); + + if ( event_file == NULL ) + return; + } + + l = 0; + if ( mask ) + { + l = strlen( mask ); + } + + + EV_Print( event_file, "\nCommand Documentation\n" ); + EV_Print( event_file, "=====================\n" ); + + hidden = 0; + num = 0; + n = eventDefList->NumObjects(); + for( i = 1; i <= n; i++ ) + { + ePtr = eventDefList->ObjectAt( i ); + flags = ePtr->GetFlags(); + name = ePtr->getName(); + + if ( flags & EV_HIDE ) + { + hidden++; + continue; + } + + if ( mask && Q_stricmpn( name, mask, l ) ) + { + continue; + } + + num++; + + ePtr->PrintDocumentation( event_file ); + } + + + EV_Print( event_file, "\n* = console command.\nC = cheat command.\n% = cache command.\n\n" + "Printed %d of %d total commands.\n", num, n - hidden ); + + if ( developer->integer && hidden ) + { + EV_Print( event_file, "Suppressed %d commands.\n", hidden ); + } + + if ( event_file != NULL ) + { + EVENT_Printf( "Printed event info to file %s\n", event_filename.c_str() ); + fclose( event_file ); + } + } + + +void Event::initCommandList + ( + void + ) + + { + int flags; + str *n; + + flags = 0; + commandList = new Container; + + n = new str( "NULL" ); + NullEvent.eventnum = commandList->AddObject( n ); + + flagList = new Container; + flagList->AddObject( flags ); + + sortedList = new Container; + sortedList->AddObject( NullEvent.eventnum ); + + eventDefList = new Container; + + dirtylist = false; + + NullEvent.data = NULL; + NullEvent.info.inuse = 0; + NullEvent.info.source = EV_FROM_CODE; + NullEvent.info.flags = 0; + NullEvent.info.linenumber = 0; + } + +Event::Event() + { + info.inuse = 0; + info.source = EV_FROM_CODE; + info.flags = 0; + info.linenumber = 0; + threadnum = -1; + eventnum = 0; + data = NULL; + definition = NULL; + name = NULL; + documentation = NULL; + } + +Event::Event + ( + int num + ) + + { + if ( !commandList ) + { + initCommandList(); + } + + assert( ( num > 0 ) && num <= commandList->NumObjects() ); + + if ( ( num <= 0 ) || ( num > commandList->NumObjects() ) ) + { + EVENT_DPrintf( "Event %d out of range.\n", num ); + num = 0; + name = NULL; + info.flags = 0; + } + else + { + name = commandList->ObjectAt( num )->c_str(); + info.flags = flagList->ObjectAt( num ); + } + + eventnum = num; + data = NULL; + definition = NULL; + documentation = NULL; + info.inuse = 0; + info.source = EV_FROM_CODE; + info.linenumber = 0; + threadnum = -1; + } + +Event::Event + ( + Event &ev + ) + + { + int num; + int i; + + eventnum = ( int )ev; + assert( ( eventnum > 0 ) && eventnum <= commandList->NumObjects() ); + data = NULL; + definition = NULL; + documentation = NULL; + + name = commandList->ObjectAt( eventnum )->c_str(); + info.inuse = 0; + info.source = ev.info.source; + info.flags = ev.info.flags; + info.linenumber = ev.info.linenumber; + threadnum = ev.threadnum; + + if ( ev.data ) + { + num = ev.data->NumObjects(); + + data = new Container; + data->Resize( num ); + + for( i = 1; i <= num; i++ ) + { + data->AddObject( ev.data->ObjectAt( i ) ); + } + } + } + +Event::Event + ( + Event *ev + ) + + { + int num; + int i; + + assert( ev ); + if ( !ev ) + { + EVENT_Error( ERR_DROP, "NULL Event\n" ); + } + + eventnum = ( int )*ev; + assert( ( eventnum > 0 ) && eventnum <= commandList->NumObjects() ); + data = NULL; + definition = NULL; + documentation = NULL; + name = commandList->ObjectAt( eventnum )->c_str(); + info.inuse = 0; + info.source = ev->info.source; + info.flags = ev->info.flags; + info.linenumber = ev->info.linenumber; + threadnum = ev->threadnum; + if ( ev->data ) + { + num = ev->data->NumObjects(); + + data = new Container; + data->Resize( num ); + + for( i = 1; i <= num; i++ ) + { + data->AddObject( ev->data->ObjectAt( i ) ); + } + } + } + +Event::Event + ( + const char *command, + int flags, + const char *theFormatspec, + const char *theArgument_names, + const char *theDocumentation + ) + + { + str *t; + + if ( !commandList ) + { + initCommandList(); + } + + eventnum = FindEvent( command ); + if ( !eventnum ) + { + t = new str( command ); + eventnum = commandList->AddObject( t ); + // check for default flags + if ( flags == EV_DEFAULT ) + { + flags = 0; + } + flagList->AddObject( ( int )flags ); + sortedList->AddObject( eventnum ); + dirtylist = true; + } + + // Use the name stored in the command list in case the string passed in + // is not in static memory. + name = commandList->ObjectAt( eventnum )->c_str(); + + data = NULL; + info.inuse = 0; + info.source = EV_FROM_CODE; + info.linenumber = 0; + threadnum = -1; + formatspec = theFormatspec; + argument_names = theArgument_names; + documentation = theDocumentation; + definition = NULL; + + // If flags have changed, let the user know. It's probably a development bug. + int &flagobj = flagList->ObjectAt( eventnum ); + + // check for default flags + if ( flags == EV_DEFAULT ) + { + flags = flagobj; + } + + assert( flags == flagobj ); + if ( flags != flagobj ) + { + // Flags not equal. Use combined value. + flagobj |= flags; + } + + info.flags = flagobj; + + // add it to the list for Documentation + // suppress it if it starts with '_' + if ( documentation && ( command[ 0 ] != '_' ) ) + { + eventDefList->AddObject( ( Event * )this ); + } + else + { + // purposely suppressed + if ( command[ 0 ] != '_' ) + { + // empty documentation! + assert( 0 ); + } + } + } + +Event::Event + ( + const char *command + ) + + { + if ( !commandList ) + { + initCommandList(); + } + + eventnum = FindEvent( command ); + if ( !eventnum ) + { + EVENT_DPrintf( "Event '%s' does not exist.\n", command ); + name = NULL; + info.flags = 0; + } + else + { + name = commandList->ObjectAt( eventnum )->c_str(); + info.flags = flagList->ObjectAt( eventnum ); + } + + data = NULL; + definition = NULL; + documentation = NULL; + info.inuse = 0; + info.source = EV_FROM_CODE; + info.linenumber = 0; + threadnum = -1; + } + +Event::Event + ( + str &command + ) + + { + if ( !commandList ) + { + initCommandList(); + } + + eventnum = FindEvent( command ); + if ( !eventnum ) + { + EVENT_DPrintf( "Event '%s' does not exist.\n", command.c_str() ); + name = NULL; + info.flags = 0; + } + else + { + name = commandList->ObjectAt( eventnum )->c_str(); + info.flags = flagList->ObjectAt( eventnum ); + } + + data = NULL; + definition = NULL; + documentation = NULL; + info.inuse = 0; + info.source = EV_FROM_CODE; + info.linenumber = 0; + threadnum = -1; + } + +Event::~Event() + { + if ( data ) + { + delete data; + data = NULL; + } + if ( definition ) + { + delete definition; + definition = NULL; + } + } + +void Event::SetupDocumentation + ( + void + ) + + { + // setup documentation + if ( formatspec ) + { + if ( argument_names ) + { + char argumentNames[ 256 ]; + str argSpec; + str rangeSpec; + str argName; + EventArgDef argDef; + const char *namePtr; + const char *specPtr; + int specLength, index; + Container argNames; + + specLength = strlen( formatspec ); + specPtr = formatspec; + // + // store off all the names + // + strcpy( argumentNames, argument_names ); + namePtr = strtok( argumentNames, " " ); + while ( namePtr != NULL ) + { + argNames.AddObject( str( namePtr ) ); + namePtr = strtok( NULL, " " ); + } + // + // create the definition container + // + definition = new Container; + definition->Resize( argNames.NumObjects() ); + index = 0; + // go throught he formatspec + while( specLength ) + { + // clear the rangeSpec + rangeSpec = ""; + // get the argSpec + argSpec = ""; + argSpec += *specPtr; + specPtr++; + specLength--; + // see if there is a range specified + while ( *specPtr == '[' ) + { + // add in all the characters until NULL or ']' + while( specLength && ( *specPtr != ']' ) ) + { + rangeSpec += *specPtr; + specPtr++; + specLength--; + } + if ( specLength && *specPtr == ']' ) + { + rangeSpec += *specPtr; + specPtr++; + specLength--; + } + } + if ( index < argNames.NumObjects() ) + { + argName = argNames.ObjectAt( index + 1 ); + argDef.Setup( name, argName, argSpec, rangeSpec ); + definition->AddObject( argDef ); + } + else + { + assert( 0 ); + Error( "More format specifiers than argument names for event %s\n", name ); + } + index++; + } + if ( index < argNames.NumObjects() ) + { + assert( 0 ); + Error( "More argument names than format specifiers for event %s\n", name ); + } + } + } + } + +void Event::DeleteDocumentation + ( + void + ) + + { + // setup documentation + if ( formatspec ) + { + if ( argument_names ) + { + definition->FreeObjectList(); + delete definition; + definition = NULL; + } + } + } + +#ifdef GAME_DLL + +void Event::SetThread + ( + ScriptThread *thread + ) + + { + if ( thread ) + { + threadnum = thread->ThreadNum(); + } + else + { + threadnum = -1; + } + } + +ScriptThread *Event::GetThread + ( + void + ) + + { + if ( threadnum != -1 ) + { + return Director.GetThread( threadnum ); + } + + return NULL; + } +#endif + +void Event::Error + ( + const char *fmt, + ... + ) + + { + va_list argptr; + char text[ 1024 ]; + + va_start( argptr, fmt ); + vsprintf( text, fmt, argptr ); + va_end( argptr ); + + switch( GetSource() ) + { + default : + case EV_FROM_CODE : +#if defined( GAME_DLL ) + EVENT_DPrintf( "Game: '%s' : %s\n", getName().c_str(), text ); +#elif defined( CGAME_DLL ) + EVENT_DPrintf( "CGame: '%s' : %s\n", getName().c_str(), text ); +#elif defined( UI_LIB ) + EVENT_DPrintf( "UI_Lib: '%s' : %s\n", getName().c_str(), text ); +#else + EVENT_DPrintf( "Client: '%s' : %s\n", getName().c_str(), text ); +#endif + break; +#ifdef GAME_DLL + case EV_FROM_SCRIPT : + { + ScriptThread *thread = GetThread(); + const char *filename = "Dead script"; + if ( thread ) + { + filename = thread->Filename(); + } + EVENT_DPrintf( "%s(%d): '%s' :\n%s\n", filename, info.linenumber, getName().c_str(), text ); + } + break; + + case EV_FROM_CONSOLE : + gi.SendServerCommand( GetConsoleEdict()-g_entities, "print \"Console: '%s' : %s\n\"", getName().c_str(), text ); + break; +#endif + } + } + +qboolean Event::IsVectorAt + ( + int pos + ) + + { + if ( !data || ( pos < 1 ) || ( data->NumObjects() < pos ) ) + { + Error( "Index %d out of range.", pos ); + return false; + } + + return data->ObjectAt( pos ).IsVector( *this ); + } + +#ifdef GAME_DLL +qboolean Event::IsEntityAt + ( + int pos + ) + + { + if ( !data || ( pos < 1 ) || ( data->NumObjects() < pos ) ) + { + Error( "Index %d out of range.", pos ); + return false; + } + + return data->ObjectAt( pos ).GetEntity( *this ) != NULL; + } +#endif + +qboolean Event::IsNumericAt + ( + int pos + ) + + { + if ( !data || ( pos < 1 ) || ( data->NumObjects() < pos ) ) + { + Error( "Index %d out of range.", pos ); + return false; + } + + return data->ObjectAt( pos ).IsNumeric( *this ); + } + +#ifdef GAME_DLL +void Event::Archive + ( + Archiver &arc + ) + + { + str name; + int num; + int i; + EventVar var; + + if ( arc.Saving() ) + { + name = getName(); + } + arc.ArchiveString( &name ); + if ( arc.Loading() ) + { + if ( data ) + { + delete data; + data = NULL; + } + *this = Event( name ); + } + + arc.ArchiveRaw( &info, sizeof( info ) ); + arc.ArchiveInteger( &threadnum ); + arc.ArchiveShort( &anim_number ); + arc.ArchiveShort( &anim_frame ); + arc.ArchiveSafePointer( &m_sourceobject ); + arc.ArchiveFloat( &time ); + arc.ArchiveInteger( &flags ); + + if ( arc.Saving() ) + { + if ( !data ) + { + num = 0; + } + else + { + num = data->NumObjects(); + } + } + arc.ArchiveInteger( &num ); + if ( arc.Loading() && num ) + { + data = new Container; + data->Resize( num ); + } + + for( i = 1; i <= num; i++ ) + { + if ( arc.Saving() ) + { + var = data->ObjectAt( i ); + } + var.Archive( arc ); + if ( arc.Loading() ) + { + data->AddObject( var ); + } + } + } +#endif + +CLASS_DECLARATION( Class, Listener, NULL ) + { + { &EV_Remove, Listener::Remove }, + { &EV_ScriptRemove, Listener::ScriptRemove }, + { NULL, NULL } + }; + +void Listener::Remove + ( + Event *e + ) + + { + delete this; + } + +void Listener::ScriptRemove + ( + Event *e + ) + + { + // Forces the remove to be done at a safe time + PostEvent( EV_Remove, 0 ); + } + +qboolean Listener::ValidEvent + ( + Event &e + ) + + { + ClassDef *c; + int ev; + + ev = ( int )e; + + c = this->classinfo(); + assert( ( ev >= 0 ) && ( ev < c->numEvents ) ); + if ( ( ev < 0 ) || ( ev >= c->numEvents ) ) + { + warning( "ValidEvent", "Event '%s' out of response range for class '%s'. " + "Event probably invalid or allocated late.\n", e.getName().c_str(), getClassname() ); + return false; + } + + return ( c->responseLookup[ ev ] != NULL ); + } + +qboolean Listener::ValidEvent + ( + const char *name + ) + + { + ClassDef *c; + int ev; + + ev = Event::FindEvent( name ); + + c = this->classinfo(); + assert( ( ev >= 0 ) && ( ev < c->numEvents ) ); + if ( ( ev < 0 ) || ( ev >= c->numEvents ) ) + { + warning( "ValidEvent", "Event '%s' out of response range for class '%s'. " + "Event probably invalid or allocated late.\n", name, getClassname() ); + return false; + } + + return ( c->responseLookup[ ev ] != NULL ); + } + +qboolean Listener::EventPending + ( + Event &ev + ) + + { + Event *event; + int eventnum; + + assert( EventQueue ); + assert( EventQueue->next ); + + event = EventQueue->next; + + eventnum = ( int )ev; + while( event != EventQueue ) + { + if ( ( event->m_sourceobject == this ) && ( (int)*event == eventnum ) ) + { + return true; + } + event = event->next; + } + + return false; + } + +inline qboolean Listener::CheckEventFlags + ( + Event *event + ) + + { +#ifdef GAME_DLL + // Special handling of console events + if ( event->GetSource() == EV_FROM_CONSOLE ) + { + if ( !( event->info.flags & (EV_CONSOLE|EV_CHEAT) ) ) + { + if ( isSubclassOf( Entity ) ) + { + Entity *ent; + + ent = ( Entity * )this; + gi.SendServerCommand( ent->edict-g_entities, "print \"Command not available from console.\n\"" ); + } + + // don't process + return false; + } + + // don't allow console cheats during deathmatch unless the server says it's ok. + if ( ( event->info.flags & EV_CHEAT ) && deathmatch->integer && !sv_cheats->integer ) + { + if ( isSubclassOf( Entity ) ) + { + Entity *ent; + + ent = ( Entity * )this; + gi.SendServerCommand( ent->edict-g_entities, "print \"You must run the server with '+set cheats 1' to enable this command.\n\"" ); + } + + // don't process + return false; + } + } +#endif + + // ok to process + return true; + } + +qboolean Listener::ProcessEvent + ( + Event *event + ) + + { + ClassDef *c; + int ev; + + if ( !Event::EventSystemStarted ) + { + assert( 0 ); + return false; + } + + // make sure the event has only been used once + if ( event->info.inuse ) + { + EVENT_Error( ERR_DROP, "ProcessEvent : Event '%s' has already been posted.\n", event->getName().c_str() ); + } + + if ( g_showevents->integer ) + { + Listener *obj; + + obj = event->GetSourceObject(); + if ( !obj ) + { + event->SetSourceObject( this ); + } + Event::PrintEvent( event ); + } + + ev = ( int )*event; + c = this->classinfo(); + if ( ev >= c->numEvents ) + { + event->Error( "Event out of response range for class '%s'. Event probably invalid or allocated late.\n", getClassname() ); + return false; + } + + if ( c->responseLookup[ ev ] ) + { + int start; + int end; + + event->info.inuse++; + + if ( !g_timeevents->integer ) + { + // only process the event if we allow it + if ( CheckEventFlags( event ) ) + { + ( this->**c->responseLookup[ ev ] )( event ); + } + } + else + { + start = EVENT_realtime; + + // only process the event if we allow it + if ( CheckEventFlags( event ) ) + { + ( this->**c->responseLookup[ ev ] )( event ); + } + + end = EVENT_realtime; + + if ( end - start >= g_timeevents->integer ) + { +#ifdef GAME_DLL + if ( event != EV_Remove && this->isSubclassOf( Entity ) ) + { + Entity *ent = (Entity *)this; + + EVENT_DebugPrintf( "(%d) ", ent->entnum ); + } +#endif + + EVENT_DebugPrintf( "'%s' : %d\n", event->getName().c_str(), end - start ); + } + } + + // Prevent an event from being freed twice, in case it's been re-used + event->info.inuse--; + if ( !event->info.inuse ) + { + delete event; + } + else + { + EVENT_Error( ERR_DROP, "ProcessEvent : Event '%s' is still in use after being processed.\n", event->getName().c_str() ); + } + + return true; + } + + if ( !event->info.inuse ) + { + delete event; + } + else + { + EVENT_Error( ERR_DROP, "ProcessEvent : Event '%s' is still in use after being processed.\n", event->getName().c_str() ); + } + + return false; + } + +void Listener::PostEvent + ( + Event *ev, + float time, + int flags + ) + + { + int evnum; + ClassDef *c; + Event *event; + +#ifdef GAME_DLL + if ( LoadingSavegame ) + { + // while technically not bad, if we got here we have an event that is being posted while loading which is a bad thing + assert( 0 ); + if ( !ev->info.inuse ) + { + delete ev; + } + else + { + EVENT_Error( ERR_DROP, "PostEvent : Event '%s' is still in use during loading.\n", ev->getName().c_str() ); + } + + return; + } +#endif + + if ( !Event::EventSystemStarted ) + { + assert( 0 ); + return; + } + + evnum = ( int )*ev; + c = this->classinfo(); + if ( evnum >= c->numEvents ) + { + ev->Error( "Event out of response range for class '%s'. Event probably invalid or allocated late.\n", getClassname() ); + return; + } + + if ( !c->responseLookup[ evnum ] ) + { + // we don't need it so lets delete it + delete ev; + return; + } + + LL_Remove( ev, next, prev ); + + ev->SetSourceObject( this ); + ev->time = EVENT_time + time; + ev->flags = flags; + + event = EventQueue->next; + while( ( event != EventQueue ) && ( ev->time >= event->time ) ) + { + event = event->next; + } + + LL_Add( event, ev, next, prev ); + numEvents++; + } + +qboolean Listener::PostponeEvent + ( + Event &ev, + float time + ) + + { + Event *event; + Event *node; + int eventnum; + + assert( EventQueue ); + assert( EventQueue->next ); + + eventnum = ( int )ev; + + event = EventQueue->next; + while( event != EventQueue ) + { + if ( ( event->GetSourceObject() == this ) && ( ( int )*event == eventnum ) ) + { + event->time += time; + + node = event->next; + while( ( node != EventQueue ) && ( event->time >= node->time ) ) + { + node = node->next; + } + + LL_Remove( event, next, prev ); + LL_Add( node, event, next, prev ); + + return true; + } + event = event->next; + } + + return false; + } + +void Listener::CancelEventsOfType + ( + Event *ev + ) + + { + Event *event; + Event *next; + int eventnum; + + assert( EventQueue ); + assert( EventQueue->next ); + + event = EventQueue->next; + + eventnum = (int)*ev; + while( event != EventQueue ) + { + next = event->next; + if ( ( event->GetSourceObject() == this ) && ( (int)*event == eventnum ) ) + { + LL_Remove( event, next, prev ); + numEvents--; + delete event; + } + event = next; + } + } + +void Listener::CancelFlaggedEvents + ( + int flags + ) + + { + Event *event; + Event *next; + + assert( EventQueue ); + assert( EventQueue->next ); + + event = EventQueue->next; + + while( event != EventQueue ) + { + next = event->next; + if ( ( event->GetSourceObject() == this ) && ( event->flags & flags ) ) + { + LL_Remove( event, next, prev ); + numEvents--; + delete event; + } + event = next; + } + } + + +void Listener::CancelPendingEvents + ( + void + ) + + { + Event *event; + Event *next; + + assert( EventQueue ); + assert( EventQueue->next ); + + event = EventQueue->next; + + while( event != EventQueue ) + { + next = event->next; + if ( event->GetSourceObject() == this ) + { + LL_Remove( event, next, prev ); + numEvents--; + delete event; + } + event = next; + } + } + +qboolean Listener::ProcessPendingEvents + ( + void + ) + + { + Event *event; + qboolean processedEvents; + float t; + + assert( EventQueue ); + assert( EventQueue->next ); + assert( EventQueue->prev ); + + processedEvents = false; + + t = EVENT_time + 0.001; + + event = EventQueue->next; + while( event != EventQueue ) + { + Listener * obj; + + assert( event ); + + obj = event->GetSourceObject(); + + if ( event->time > t ) + { + break; + } + + if ( obj != this ) + { + // traverse normally + event = event->next; + } + else + { + // the event is removed from its list and temporarily added to the active list + LL_Remove( event, next, prev ); + numEvents--; + LL_Add( ActiveEvents, event, next, prev ); + + + // ProcessEvent will dispose of this event when it is done + obj->ProcessEvent( event ); + + // start over, since can't guarantee that we didn't process any previous or following events + event = EventQueue->next; + + processedEvents = true; + } + } + + return processedEvents; + } + +Listener::~Listener() + { + if ( Event::EventSystemStarted ) + CancelPendingEvents(); + } + +void L_ClearEventList + ( + void + ) + + { + Event *event; + + // go through active and event queue lists + while( !LL_Empty( EventQueue, next, prev ) ) + { + event = EventQueue->next; + numEvents--; + LL_Remove( event, next, prev ); + delete event; + } + + while( !LL_Empty( ActiveEvents, next, prev ) ) + { + event = ActiveEvents->next; + LL_Remove( event, next, prev ); + delete event; + } + + numEvents = 0; + } + +void L_ProcessPendingEvents + ( + void + ) + + { + Event *event; + float t; + int num; + int maxevents; + + assert( EventQueue ); + assert( EventQueue->next ); + assert( EventQueue->prev ); + + maxevents = ( int )g_eventlimit->integer; + + num = 0; + t = EVENT_time + 0.001; + while( !LL_Empty( EventQueue, next, prev ) ) + { + Listener * obj; + + event = EventQueue->next; + + assert( event ); + + obj = event->GetSourceObject(); + + assert( obj ); + + if ( event->time > t ) + { + break; + } + + // the event is removed from its list and temporarily added to the active list + LL_Remove( event, next, prev ); + numEvents--; + LL_Add( ActiveEvents, event, next, prev ); + + + // ProcessEvent will dispose of this event when it is done + obj->ProcessEvent( event ); + + // Don't allow ourselves to stay in here too long. An abnormally high number + // of events being processed is evidence of an infinite loop of events. + num++; + if ( num > maxevents ) + { + EVENT_Printf( "Event overflow. Possible infinite loop in script. " + "Enable g_showevents to trace. Aborting frame.\n" ); + break; + } + } + + if ( g_eventstats->integer ) + { + if ( g_eventstats->integer == 1 ) + { + EVENT_Printf( "finds %d, searches %d, num first search %d, avg %f\n", + Event::numfinds, Event::numcompares, Event::numfirstsearch, + ( float )Event::numcompares / ( float )Event::numfinds ); + } + else if ( g_eventstats->integer == 2 ) + { + EVENT_Printf( "pending %5d free %5d active+pending %4d\n", + numEvents, numFreeEvents, numFreeEvents + numEvents ); + } + } + } + +#ifdef GAME_DLL + +void Event::SetConsoleEdict + ( + gentity_t *consoleedict + ) + + { + // linenumber does double duty in the case of the console commands + if ( consoleedict ) + { + info.linenumber = consoleedict->s.number; + } + else + { + // default to player 1 + info.linenumber = 0; + } + } + +gentity_t *Event::GetConsoleEdict + ( + void + ) + + { + // linenumber does double duty in the case of the console commands + if ( ( info.source != EV_FROM_CONSOLE ) || ( info.linenumber < 0 ) || ( info.linenumber >= game.maxclients ) ) + { + // default to player 1 for release + return &g_entities[ 0 ]; + } + + return &g_entities[ info.linenumber ]; + } + +void L_ArchiveEvents + ( + Archiver &arc + ) + + { + Event *event; + int num; + + assert( EventQueue ); + assert( EventQueue->next ); + assert( EventQueue->prev ); + + num = 0; + for( event = EventQueue->next; event != EventQueue; event = event->next ) + { + Listener * obj; + + assert( event ); + + obj = event->GetSourceObject(); + + assert( obj ); + + if ( obj->isSubclassOf( Entity ) && + ( ( ( Entity * )obj )->flags & FL_DONTSAVE ) ) + { + continue; + } + + num++; + } + + arc.ArchiveInteger( &num ); + for( event = EventQueue->next; event != EventQueue; event = event->next ) + { + Listener * obj; + + assert( event ); + + obj = event->GetSourceObject(); + + assert( obj ); + + if ( obj->isSubclassOf( Entity ) && + ( ( ( Entity * )obj )->flags & FL_DONTSAVE ) ) + { + continue; + } + + arc.ArchiveEvent( event ); + arc.ArchiveFloat( &event->time ); + arc.ArchiveInteger( &event->flags ); + } + } + +void L_UnarchiveEvents + ( + Archiver &arc + ) + + { + Event *e; + int i; + + // the FreeEvents list would already be allocated at this point + // clear out any events that may exist + L_ClearEventList(); + + arc.ArchiveInteger( &numEvents ); + for( i = 0; i < numEvents; i++ ) + { + e = new Event(); + LL_Remove( e, next, prev ); + arc.ArchiveEvent( e ); + arc.ArchiveFloat( &e->time ); + arc.ArchiveInteger( &e->flags ); + + LL_Add( EventQueue, e, next, prev ); + } + } +#endif + +void Event::InitializeDocumentation + ( + void + ) + { + Event * ePtr; + int i; + + for( i = 1; i <= eventDefList->NumObjects(); i++ ) + { + ePtr = eventDefList->ObjectAt( i ); + ePtr->SetupDocumentation(); + } + } + +void Event::ShutdownDocumentation + ( + void + ) + { + Event * ePtr; + int i; + + for( i = 1; i <= eventDefList->NumObjects(); i++ ) + { + ePtr = eventDefList->ObjectAt( i ); + ePtr->DeleteDocumentation(); + } + } + + +void L_InitEvents + ( + void + ) + + { + if ( Event::EventSystemStarted ) + { + assert( 0 ); + L_ShutdownEvents(); + } + + Event::lastevent = 0; + Event::numfinds = 0; + Event::numcompares = 0; + Event::numfirstsearch = 0; + Event_totalmemallocated = 0; + +#if defined( GAME_DLL ) + g_showevents = gi.cvar ( "g_showevents", "0", 0 ); + g_eventlimit = gi.cvar ( "g_eventlimit", "5000", 0 ); + g_timeevents = gi.cvar ( "g_timeevents", "0", 0 ); + g_watch = gi.cvar ( "g_watch", "0", 0 ); + g_eventstats = gi.cvar ( "g_eventstats", "0", 0 ); +#elif defined( CGAME_DLL ) + g_showevents = cgi.Cvar_Get ( "cg_showevents", "0", 0 ); + g_eventlimit = cgi.Cvar_Get ( "cg_eventlimit", "500", 0 ); + g_timeevents = cgi.Cvar_Get ( "cg_timeevents", "0", 0 ); + g_eventstats = cgi.Cvar_Get ( "cg_eventstats", "0", 0 ); +#else + g_showevents = Cvar_Get ( "cl_showevents", "0", 0 ); + g_eventlimit = Cvar_Get ( "cl_eventlimit", "500", 0 ); + g_timeevents = Cvar_Get ( "cl_timeevents", "0", 0 ); + g_eventstats = Cvar_Get ( "cl_eventstats", "0", 0 ); +#endif + + BuildEventResponses(); + + Event::InitializeEventLists(); + + L_ClearEventList(); + + // setup the documentation on all the events + Event::InitializeDocumentation(); + + // Sort the list before we go on since we won't be adding any more events + Event::SortEventList(); + + // the event system has started + Event::EventSystemStarted = true; + } + +void L_ShutdownEvents + ( + void + ) + + { + int i; + + if ( !Event::EventSystemStarted ) + return; + + Event::ShutdownEventLists(); + + // deletes all the documentation + Event::ShutdownDocumentation(); + + if ( Event::commandList ) + { + for ( i=Event::commandList->NumObjects(); i>0; i-- ) + { + str *s; + + s = Event::commandList->ObjectAt( i ); + assert( s ); + if ( s ) + delete s; + } + delete Event::commandList; + Event::commandList = NULL; + } + + if ( Event::eventDefList ) + { + delete Event::eventDefList; + Event::eventDefList = NULL; + } + + if ( Event::flagList ) + { + delete Event::flagList; + Event::flagList = NULL; + } + + if ( Event::sortedList ) + { + delete Event::sortedList; + Event::sortedList = NULL; + } + + // say it is now shutdown + Event::EventSystemStarted = false; + } diff --git a/source/source/cgame/listener.h b/source/source/cgame/listener.h new file mode 100644 index 0000000..481ffb2 --- /dev/null +++ b/source/source/cgame/listener.h @@ -0,0 +1,1208 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/listener.h $ +// $Revision:: 36 $ +// $Author:: Aldie $ +// $Date:: 7/25/00 11:32p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/listener.h $ +// +// 36 7/25/00 11:32p Aldie +// Made some changes to the memory system and fixed a memory allocation bug in +// Z_TagMalloc. Also changed a lot of classes to subclass from Class. +// +// 35 6/22/00 6:34p Markd +// fixed =operator assignment bug +// +// 34 6/22/00 3:45p Markd +// fixed a bunch of saved game issues +// +// 33 6/14/00 11:18a Markd +// cleaned up code using Intel compiler +// +// 32 5/30/00 7:06p Markd +// saved games 4th pass +// +// 31 5/24/00 3:14p Markd +// first phase of save/load games +// +// 30 4/29/00 3:26p Markd +// fleshed out the rest of the event/class documentation +// +// 29 4/26/00 7:55p Markd +// Added more documentation code into various systems +// +// 28 4/13/00 7:04p Aldie +// Fixed bug for animation events where the anim was greater than 255. Added +// animframe and animnumber to Event. +// +// 27 3/16/00 10:50a Markd +// Fixed some bad syntax in headers that exhibited itself in non-visualc +// compilers +// +// 26 1/06/00 11:10p Jimdose +// cleaning up unused code +// +// 25 12/15/99 11:45a Markd +// made Event's Classes and also freed up safe pointers at the appropriate +// times +// +// 24 12/11/99 5:51p Markd +// First wave of bug fixes after q3a gold merge +// +// 23 12/11/99 3:37p Markd +// q3a gold checkin, first time +// +// 22 11/11/99 3:54p Jimdose +// added EVENT_TORSO_ANIM +// +// 21 10/19/99 7:52p Markd +// Removed three part model system +// +// 20 10/12/99 11:09a Morbid +// UI merge back to FAKK +// +// 19 10/07/99 3:02p Steven +// Removed defaults for event constructor and added a new event constructor +// that only takes a const char * as a parm. +// +// 18 10/06/99 3:09p Steven +// Added dumpevents command. +// +// 17 10/05/99 2:03p Markd +// Added warning about files being in multiple projects +// +// 16 10/03/99 4:50p Markd +// removed str& constructor from listener +// +// 15 10/02/99 6:51p Markd +// Put in backend work for event documentation and fixed a lot of event +// documentation bugs +// +// 14 10/01/99 4:52p Markd +// Made Warning level 4 work on all projects +// +// 13 10/01/99 3:49p Markd +// fixed some level 4 warnings +// +// 12 9/29/99 3:10p Markd +// fixed listener problems +// +// 11 9/29/99 2:49p Morbid +// +// 10 9/28/99 7:13p Markd +// moved __LISTENER define up to the top of the file +// +// 9 9/28/99 5:31p Markd +// Successfully merged class.h, listener.h and vector.h into all three modules, +// cgame, fgame and client +// +// 8 9/28/99 5:15p Markd +// Fixed more merge bugs with sharing class, vector and listener between three +// modules +// +// 7 9/28/99 4:26p Markd +// merged listener, class and vector between 3 projects +// +// 6 9/28/99 10:12a Markd +// fixed some event issues +// +// 5 9/27/99 5:44p Markd +// began documentation and cleanup phase after merge +// +// 4 9/16/99 7:48p Jimdose +// made SetConsoleEdict use 0 based players +// +// 3 9/16/99 7:48p Jimdose +// fixed GetConsoleEdict to use 0 based players +// +// 2 9/16/99 11:18a Markd +// Continuing merge of code, not functional yet but closer +// +// 1 9/10/99 10:54a Jimdose +// +// 1 9/08/99 3:16p Aldie +// +// 14 9/02/99 2:33p Markd +// Added cache ability to entities +// +// 13 8/28/99 3:34p Jimdose +// Added EventVar +// All event args now have type information and use lazy evaluation +// +// 12 8/27/99 8:25p Markd +// added pengingevents and fixed some event holes +// +// 11 8/27/99 3:30p Markd +// put in event caching system so that events are reused +// +// 10 8/19/99 12:16p Jimdose +// added event stats +// added lru check to FindEvent +// +// 9 8/09/99 5:07p Aldie +// More changes to accomodate weapons system +// +// DESCRIPTION: +// +// WARNING: This file is shared between fgame, cgame and possibly the user interface. +// It is instanced in each one of these directories because of the way that SourceSafe works. +// + +// +// this has to be placed in front of the __LISTENER_H__ +// if it is not, listener.cpp will not compile +// +#if defined( GAME_DLL ) +// +// game dll specific defines +// +#include "g_local.h" + +#endif + +#ifndef __LISTENER_H__ +#define __LISTENER_H__ + +#if defined( GAME_DLL ) +// +// game dll specific defines +// +#define EVENT_DebugPrintf gi.DebugPrintf +#define EVENT_DPrintf gi.DPrintf +#define EVENT_Printf gi.Printf +#define EVENT_time level.time +#define EVENT_realtime gi.Milliseconds() +#define EVENT_Error gi.Error + +#define EVENT_FILENAME "events.txt" + +class Entity; +class ScriptVariable; +class ScriptThread; +class Archiver; + +#elif defined ( CGAME_DLL ) +// +// cgame dll specific defines +// +#include "cg_local.h" +#include "vector.h" +#include "str.h" +#include "../qcommon/qcommon.h" + +#define EVENT_DebugPrintf cgi.DebugPrintf +#define EVENT_DPrintf cgi.Printf +#define EVENT_Printf cgi.Printf +#define EVENT_time ( ( ( float )cg.time / 1000.0f ) ) +#define EVENT_realtime cgi.Milliseconds() +#define EVENT_Error cgi.Error + +#define EVENT_FILENAME "cg_events.txt" + +#elif defined ( UI_LIB ) + +#include "../fgame/q_shared.h" +#include "vector.h" +#include "str.h" +#include "../qcommon/qcommon.h" +#include "ui_local.h" + +#define EVENT_DebugPrintf Com_DebugPrintf +#define EVENT_DPrintf Com_Printf +#define EVENT_Printf Com_Printf +#define EVENT_time ( ( ( float )cls.realtime / 1000.0f ) ) +#define EVENT_realtime Sys_Milliseconds() +#define EVENT_Error Com_Error + +#define EVENT_FILENAME "ui_events.txt" + +#else + +// +// client specific defines +// +#include "../fgame/q_shared.h" +#include "vector.h" +#include "str.h" +#include "../qcommon/qcommon.h" + +#define EVENT_DebugPrintf Com_DebugPrintf +#define EVENT_DPrintf Com_Printf +#define EVENT_Printf Com_Printf +#define EVENT_time ( ( ( float )cls.realtime / 1000.0f ) ) +#define EVENT_realtime Sys_Milliseconds() +#define EVENT_Error Com_Error + +#define EVENT_FILENAME "cl_events.txt" +#endif + +#include "class.h" +#include "container.h" + +typedef enum + { + EV_FROM_CODE, + EV_FROM_CONSOLE, + EV_FROM_SCRIPT, + EV_FROM_ANIMATION + } eventsource_t; + +// Posted Event Flags +#define EVENT_LEGS_ANIM (1<<0) // this event is associated with an animation for the legs +#define EVENT_TORSO_ANIM (1<<1) // this event is associated with an animation for the torso +#define EVENT_DIALOG_ANIM (1<<2) // this event is associated with an animation for dialog lip syncing + + +// Event flags +#define EV_CONSOLE (1<<0) // Allow entry from console +#define EV_CHEAT (1<<1) // Only allow entry from console if cheats are enabled +#define EV_HIDE (1<<2) // Hide from eventlist +#define EV_CACHE (1<<3) // This event is used to cache data in + +#define EV_DEFAULT -1 // default flags + +#define INUSE_BITS 2 +#define MAX_EVENT_USE ( ( 1 << INUSE_BITS ) - 1 ) + +typedef enum + { + IS_STRING, + IS_VECTOR, + IS_BOOLEAN, + IS_INTEGER, + IS_FLOAT, + IS_ENTITY, + IS_SCRIPTVARIABLE + } vartype; + +#define DIRTY_STRING ( 1 << 0 ) +#define DIRTY_VECTOR ( 1 << 1 ) +#define DIRTY_INTEGER ( 1 << 2 ) +#define DIRTY_FLOAT ( 1 << 3 ) + +#define DIRTY_ALL ( 0x7fff ) + +class EventVar : public Class + { + private: + short type; + short dirtyFlags; + str stringValue; + Vector vectorValue; + int intValue; + float floatValue; + + public: + + EventVar() + { + type = IS_INTEGER; + dirtyFlags = DIRTY_ALL; + intValue = 0; + floatValue = 0; + }; + + EventVar( EventVar &ev ) + { + type = ev.type; + dirtyFlags = ev.dirtyFlags; + intValue = ev.intValue; + floatValue = ev.floatValue; + }; + + EventVar( const char *text ); + EventVar( str &text ); + + EventVar( int val ) + { + type = IS_INTEGER; + dirtyFlags = DIRTY_ALL & ~DIRTY_INTEGER; + intValue = val; + }; + + EventVar( float val ) + { + type = IS_FLOAT; + dirtyFlags = DIRTY_ALL & ~DIRTY_FLOAT; + floatValue = val; + }; + + EventVar( Vector &vec ) + { + type = IS_VECTOR; + dirtyFlags = DIRTY_ALL & ~DIRTY_VECTOR; + vectorValue = vec; + }; + +#ifdef GAME_DLL + EventVar( Entity *ent ); +#endif + + const char *GetToken( Event &ev ); + const char *GetString( Event &ev ); + qboolean GetBoolean( Event &ev ); + int GetInteger( Event &ev ); + float GetFloat( Event &ev ); + Vector GetVector( Event &ev ); +#ifdef GAME_DLL + Entity *GetEntity( Event &ev ); + ScriptVariable *GetVariable( Event &ev ); +#endif + + qboolean IsVector( Event &ev ); + qboolean IsNumeric( Event &ev ); + +#ifdef GAME_DLL + void Archive( Archiver &arc ); +#endif + }; + + +class EventArgDef : public Class + { + private: + int type; + str name; + float minRange[ 3 ]; + qboolean minRangeDefault[ 3 ]; + float maxRange[ 3 ]; + qboolean maxRangeDefault[ 3 ]; + qboolean optional; + public: + + EventArgDef() + { + type = IS_INTEGER; + //name = "undefined"; + optional = qfalse; + }; + void Setup( const char * eventName, const char *argName, const char *argType, const char *argRange ); + void PrintArgument( FILE *event_file = NULL ); + void PrintRange( FILE *event_file = NULL ); +#if 0 +#ifdef GAME_DLL + void Archive( Archiver &arc ); +#endif +#endif + }; + + + +#ifndef GAME_DLL +extern "C" + { + // interface functions + void L_ProcessPendingEvents( void ); + void L_ClearEventList( void ); + void L_InitEvents( void ); + void L_ShutdownEvents( void ); + } +#endif + + +class Listener; +typedef SafePtr ListenerPtr; + + +class Event : public Class + { + private: + friend class Listener; + + typedef struct EventInfo + { + unsigned inuse : INUSE_BITS; // must change MAX_EVENT_USE to reflect maximum number stored here + unsigned source : 2; + unsigned flags : 9; + unsigned linenumber : 19; // linenumber does double duty in the case of the console commands + } EventInfo_t; + + int eventnum; + EventInfo info; + const char *name; + const char *formatspec; + const char *argument_names; + const char *documentation; + Container *data; + Container *definition; + int threadnum; + short anim_number; + short anim_frame; + SafePtr m_sourceobject; + + //Listener *obj; + float time; + int flags; + + Event( int num ); + static void initCommandList( void ); + static void InitializeEventLists( void ); + static void ShutdownEventLists( void ); + static void InitializeDocumentation( void ); + static void ShutdownDocumentation( void ); + + static int numfinds; + static int numfirstsearch; + static int numcompares; + static int lastevent; + static bool EventSystemStarted; + + friend void L_ProcessPendingEvents( void ); + friend void L_ClearEventList( void ); + friend void L_InitEvents( void ); + friend void L_ShutdownEvents( void ); + +#ifdef GAME_DLL + friend void L_ArchiveEvents( Archiver &arc ); + friend void L_UnarchiveEvents( Archiver &arc ); + +#endif + + static Container *commandList; + static Container *flagList; + static Container *sortedList; + static Container *eventDefList; + static qboolean dirtylist; + + static int compareEvents( const void *arg1, const void *arg2 ); + static void SortEventList( void ); + static int FindEvent( const char *name ); + static int FindEvent( str &name ); + static void PrintEvent( Event *ev ); + + public: + CLASS_PROTOTYPE( Event ); + + Event *next; // next event in the list, used for event recycling + Event *prev; // previous event int the list, used for event recycling + + void * operator new( size_t ); + void operator delete( void * ); + + static int NumEventCommands( void ); + static void ListCommands( const char *mask = NULL ); + static void ListDocumentation( const char *mask, qboolean print_to_file = qfalse ); + static void PendingEvents( const char *mask = NULL ); + static void PrintEventDocumentation( Event * event, FILE *event_file = NULL, qboolean html = qfalse ); + static int MapSortedEventIndex( int index ); + + Event(); + Event( Event &ev ); + Event( Event *ev ); + Event + ( + const char *command, + int flags, + const char *formatspec, + const char *argument_names, + const char *documentation + ); + Event( const char *command ); + Event( str &command ); + ~Event(); + + void SetupDocumentation( void ); + void DeleteDocumentation( void ); + void PrintDocumentation( FILE *event_file = NULL, qboolean html = qfalse ); + + str getName( void ); + + void SetSource( eventsource_t source ); + void SetLineNumber( int linenumber ); + void SetSourceObject( Listener *source ); + Listener *GetSourceObject( void ); + SafePtr *GetSourceObjectPointer( void ); + + eventsource_t GetSource( void ); + int GetLineNumber( void ); + int GetAnimationNumber( void ); + int GetAnimationFrame( void ); + void SetAnimationNumber( int anim ); + void SetAnimationFrame( int frame ); + + int GetFlags( void ); + + void Error( const char *fmt, ... ); + + static Event Find( const char *command ); + static qboolean Exists( const char *command ); + static Event Find( str &command ); + + Event& printInfo(void); + + friend bool operator==( const Event &a, const Event &b ); + friend bool operator!=( const Event &a, const Event &b ); + void operator=( const Event &ev ); + + operator int(); + operator const char *(); + + int NumArgs( void ); + + qboolean IsVectorAt( int pos ); + qboolean IsEntityAt( int pos ); + qboolean IsNumericAt( int pos ); + + const char *GetToken( int pos ); + const char *GetString( int pos ); + int GetInteger( int pos ); + float GetFloat( int pos ); + Vector GetVector( int pos ); + bool GetBoolean( int pos ); + + void AddToken( const char *text ); + void AddTokens( int argc, const char **argv ); + void AddString( const char *text ); + void AddString( str &text ); + void AddInteger( int val ); + void AddFloat( float val ); + void AddVector( Vector &vec ); + +#ifdef GAME_DLL + void AddEntity( Entity *ent ); + Entity *GetEntity( int pos ); + ScriptVariable *GetVariable( int pos ); + void SetThread( ScriptThread *thread ); + ScriptThread *GetThread( void ); + void SetConsoleEdict( gentity_t *consoleedict ); + gentity_t *GetConsoleEdict( void ); + + virtual void Archive( Archiver &arc ); +#endif + }; + +extern Event NullEvent; +extern Event EV_Remove; + +class Listener; + +class Listener : public Class + { + private: + void ScriptRemove( Event *e ); + + protected: + qboolean CheckEventFlags( Event *event ); + + public: + CLASS_PROTOTYPE( Listener ); + + ~Listener(); + void Remove( Event *e ); + qboolean ValidEvent( Event &e ); + qboolean ValidEvent( const char *name ); + qboolean EventPending( Event &ev ); + qboolean ProcessEvent( Event *event ); + qboolean ProcessEvent( Event &event ); + void PostEvent( Event *event, float time, int flags = 0 ); + void PostEvent( Event &event, float time, int flags = 0 ); + qboolean PostponeEvent( Event &event, float time ); + qboolean PostponeEvent( Event *event, float time ); + void CancelEventsOfType( Event *event ); + void CancelEventsOfType( Event &event ); + void CancelFlaggedEvents( int flags ); + void CancelPendingEvents( void ); + qboolean ProcessPendingEvents( void ); + }; + +inline void Event::SetSourceObject + ( + Listener *source + ) + + { + m_sourceobject = source; + } + +inline Listener *Event::GetSourceObject + ( + void + ) + + { + return m_sourceobject; + } + +inline SafePtr *Event::GetSourceObjectPointer + ( + void + ) + + { + return &m_sourceobject; + } + +inline qboolean Event::Exists + ( + const char *command + ) + + { + int num; + str c; + + if ( !commandList ) + { + initCommandList(); + } + + c = command; + num = FindEvent( c ); + if ( num ) + { + return true; + } + + return false; + } + + +inline Event Event::Find + ( + const char *command + ) + + { + int num; + str c; + + if ( !commandList ) + { + initCommandList(); + } + + c = command; + num = FindEvent( c ); + if ( num ) + { + Event ev( num ); + return ev; + } + + return NullEvent; + } + +inline Event Event::Find + ( + str &command + ) + + { + int num; + + if ( !commandList ) + { + initCommandList(); + } + + num = FindEvent( command ); + if ( num ) + { + Event ev( num ); + return ev; + } + + return NullEvent; + } + +inline void Event::SetSource + ( + eventsource_t source + ) + + { + info.source = ( unsigned )source; + } + +inline void Event::SetLineNumber + ( + int linenumber + ) + + { + info.linenumber = linenumber; + } + +inline eventsource_t Event::GetSource + ( + void + ) + + { + return ( eventsource_t )info.source; + } + +inline int Event::GetAnimationNumber + ( + void + ) + + { + return anim_number; + } + +inline int Event::GetAnimationFrame + ( + void + ) + + { + return anim_frame; + } + +inline void Event::SetAnimationNumber + ( + int anim + ) + + { + anim_number = anim; + } + +inline void Event::SetAnimationFrame + ( + int frame + ) + + { + anim_frame = frame; + } + +inline int Event::GetLineNumber + ( + void + ) + + { + // linenumber does double duty in the case of the console commands + if ( info.source == EV_FROM_SCRIPT ) + { + return info.linenumber; + } + + return 0; + } + +inline int Event::GetFlags + ( + void + ) + + { + return info.flags; + } + +inline str Event::getName + ( + void + ) + + { + assert( name || !eventnum ); + + if ( !name ) + { + return "NULL"; + } + + return name; + } + +inline Event& Event::printInfo + ( + void + ) + + { + EVENT_DPrintf( "event '%s' is number %d\n", getName().c_str(), eventnum ); + + return *this; + } + +inline bool operator== + ( + const Event &a, + const Event &b + ) + + { + return a.eventnum == b.eventnum; + } + +inline bool operator!= + ( + const Event &a, + const Event &b + ) + + { + return a.eventnum != b.eventnum; + } + +inline void Event::operator= + ( + const Event &ev + ) + { + eventnum = ev.eventnum; + info = ev.info; + if ( ev.data ) + { + int i; + + data = new Container; + data->Resize( ev.data->NumObjects() ); + for( i = 1; i < ev.data->NumObjects(); i++ ) + { + data->AddObject( ev.data->ObjectAt( i ) ); + } + } + name = ev.name; + definition = NULL; + threadnum = ev.threadnum; + anim_number = ev.anim_number; + anim_frame = ev.anim_frame; + m_sourceobject = ev.m_sourceobject; + time = ev.time; + flags = ev.flags; + } + + +inline Event::operator int() + { + return eventnum; + } + +inline Event::operator const char *() + { + return getName().c_str(); + } + +inline int Event::NumArgs + ( + void + ) + + { + if ( !data ) + { + return 0; + } + + return ( data->NumObjects() ); + } + +#ifdef GAME_DLL +inline void Event::AddEntity + ( + Entity *ent + ) + + { + if ( !data ) + { + data = new Container; + data->Resize( 1 ); + } + + + EventVar var( ent ); + data->AddObject( var ); + } +#endif + +inline void Event::AddToken + ( + const char *text + ) + + { + if ( !data ) + { + data = new Container; + data->Resize( 1 ); + } + + EventVar var( text ); + data->AddObject( var ); + } + +inline void Event::AddTokens + ( + int argc, + const char **argv + ) + + { + int i; + + if ( !data ) + { + data = new Container; + data->Resize( argc ); + } + + for( i = 0; i < argc; i++ ) + { + assert( argv[ i ] ); + EventVar var( argv[ i ] ); + data->AddObject( var ); + } + } + +inline void Event::AddString + ( + const char *text + ) + + { + if ( !data ) + { + data = new Container; + data->Resize( 1 ); + } + + EventVar var( text ); + data->AddObject( var ); + } + +inline void Event::AddString + ( + str &text + ) + + { + if ( !data ) + { + data = new Container; + data->Resize( 1 ); + } + + EventVar var( text ); + data->AddObject( var ); + } + +inline void Event::AddInteger + ( + int val + ) + + { + if ( !data ) + { + data = new Container; + data->Resize( 1 ); + } + + EventVar var( val ); + data->AddObject( var ); + } + +inline void Event::AddFloat + ( + float val + ) + + { + if ( !data ) + { + data = new Container; + data->Resize( 1 ); + } + + EventVar var( val ); + data->AddObject( var ); + } + +inline void Event::AddVector + ( + Vector &vec + ) + + { + if ( !data ) + { + data = new Container; + data->Resize( 1 ); + } + + EventVar var( vec ); + data->AddObject( var ); + } + +inline const char *Event::GetToken + ( + int pos + ) + + { + if ( !data || ( pos < 1 ) || ( data->NumObjects() < pos ) ) + { + Error( "Index %d out of range.", pos ); + return ""; + } + + return data->ObjectAt( pos ).GetToken( *this ); + } + +inline const char *Event::GetString + ( + int pos + ) + + { + if ( !data || ( pos < 1 ) || ( data->NumObjects() < pos ) ) + { + Error( "Index %d out of range.", pos ); + return ""; + } + + return data->ObjectAt( pos ).GetString( *this ); + } + +inline int Event::GetInteger + ( + int pos + ) + + { + if ( !data || ( pos < 1 ) || ( data->NumObjects() < pos ) ) + { + Error( "Index %d out of range.", pos ); + return 0; + } + + return data->ObjectAt( pos ).GetInteger( *this ); + } + +inline float Event::GetFloat + ( + int pos + ) + + { + if ( !data || ( pos < 1 ) || ( data->NumObjects() < pos ) ) + { + Error( "Index %d out of range.", pos ); + return 0; + } + + return data->ObjectAt( pos ).GetFloat( *this ); + } + +inline Vector Event::GetVector + ( + int pos + ) + + { + if ( !data || ( pos < 1 ) || ( data->NumObjects() < pos ) ) + { + Error( "Index %d out of range.", pos ); + return vec_zero; + } + + return data->ObjectAt( pos ).GetVector( *this ); + } + +inline bool Event::GetBoolean + ( + int pos + ) + + { + int val; + + val = this->GetInteger( pos ); + + return ( val != 0 ) ? true : false; + } + +#ifdef GAME_DLL + +inline Entity *Event::GetEntity + ( + int pos + ) + + { + if ( !data || ( pos < 1 ) || ( data->NumObjects() < pos ) ) + { + Error( "Index %d out of range.", pos ); + return NULL; + } + + return data->ObjectAt( pos ).GetEntity( *this ); + } + +inline ScriptVariable *Event::GetVariable + ( + int pos + ) + + { + if ( !data || ( pos < 1 ) || ( data->NumObjects() < pos ) ) + { + Error( "Index %d out of range.", pos ); + return NULL; + } + + return data->ObjectAt( pos ).GetVariable( *this ); + } + +#endif + +inline qboolean Listener::ProcessEvent + ( + Event &event + ) + + { + Event *ev; + + ev = new Event( event ); + return ProcessEvent( ev ); + } + +inline void Listener::PostEvent + ( + Event &event, + float time, + int flags + ) + + { + Event *ev; + + ev = new Event( event ); + PostEvent( ev, time, flags ); + } + +inline qboolean Listener::PostponeEvent + ( + Event *event, + float time + ) + + { + return PostponeEvent( *event, time ); + } + +inline void Listener::CancelEventsOfType + ( + Event &event + ) + + { + CancelEventsOfType( &event ); + } + +#endif + diff --git a/source/source/cgame/script.cpp b/source/source/cgame/script.cpp new file mode 100644 index 0000000..eeb3bf2 --- /dev/null +++ b/source/source/cgame/script.cpp @@ -0,0 +1,1038 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/cgame/script.cpp $ +// $Revision:: 4 $ +// $Date:: 7/13/00 10:17a $ +// +// Copyright (C) 1999 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/cgame/script.cpp $ +// +// 4 7/13/00 10:17a Markd +// fixed a memory leak +// +// 3 3/14/00 3:35p Aldie +// Fix syntax error +// +// 2 3/14/00 3:22p Aldie +// Changed some client side emitter functionality and added func_emitter +// +// 1 9/10/99 10:51a Jimdose +// +// 1 9/09/99 7:51p Jimdose +// +// 3 7/29/99 3:31p Aldie +// Updated to new class system +// +// 2 7/01/99 6:56p Aldie +// Update UI +// +// 1 6/29/99 4:02p Aldie +// +// 1 6/23/99 2:50p Jimdose +// +// DESCRIPTION: +// C++ implementaion of tokenizing text interpretation. Class accepts filename +// to load or pointer to preloaded text data. Standard tokenizing operations +// such as skip white-space, get string, get integer, get float, get m_token, +// and skip line are implemented. +// +// Note: all '//', '#', and ';' are treated as comments. Probably should +// make this behaviour toggleable. +// + +#include "script.h" +#include "../qcommon/qcommon.h" +#include + +#if defined ( CGAME_DLL ) +// +// cgame dll specific defines +// +#include "cg_local.h" + +#define FILE_FS_FreeFile cgi.FS_FreeFile +#define FILE_FS_ReadFile(a,b) cgi.FS_ReadFile(a,b,false) +#define FILE_Malloc cgi.Malloc +#define FILE_Free cgi.Free + +#else + +#define FILE_FS_FreeFile FS_FreeFile +#define FILE_FS_ReadFile FS_ReadFile +#define FILE_Malloc Z_Malloc +#define FILE_Free Z_Free + +#endif + +#define TOKENCOMMENT (';') +//#define TOKENCOMMENT2 ('#') +#define TOKENEOL ('\n') +#define TOKENNULL ('\0') +#define TOKENSPACE (' ') + +CLASS_DECLARATION( Class, Script, NULL ) + { + { NULL, NULL } + }; + +Script::~Script() + { + Close(); + } + +Script::Script() + { + buffer = NULL; + m_script_p = NULL; + m_end_p = NULL; + m_line = 0; + m_releaseBuffer = false; + m_tokenready = false; + memset( m_token, 0, sizeof( m_token ) ); + } + +void Script::Close + ( + void + ) + + { + if ( m_releaseBuffer && buffer ) + { + FILE_Free( buffer ); + } + + buffer = NULL; + m_script_p = NULL; + m_end_p = NULL; + m_line = 0; + m_releaseBuffer = false; + m_tokenready = false; + memset( m_token, 0, sizeof( m_token ) ); + } + +/* +============== += += Filename += +============== +*/ + +const char *Script::Filename + ( + void + ) + + { + return m_filename.c_str(); + } + +/* +============== += += GetLineNumber += +============== +*/ + +int Script::GetLineNumber + ( + void + ) + + { + return m_line; + } + +/* +============== += += Reset += +============== +*/ + +void Script::Reset + ( + void + ) + + { + m_script_p = buffer; + m_line = 1; + m_tokenready = false; + } + +/* +============== += += MarkPosition += +============== +*/ + +void Script::MarkPosition + ( + scriptmarker_t *mark + ) + + { + assert( mark ); + + mark->tokenready = m_tokenready; + mark->offset = m_script_p - buffer; + mark->line = m_line; + strcpy( mark->token, m_token ); + } + +/* +============== += += RestorePosition += +============== +*/ + +void Script::RestorePosition + ( + scriptmarker_t *mark + ) + + { + assert( mark ); + + m_tokenready = mark->tokenready; + m_script_p = buffer + mark->offset; + m_line = mark->line; + strcpy( m_token, mark->token ); + + assert( m_script_p <= m_end_p ); + if ( m_script_p > m_end_p ) + { + m_script_p = m_end_p; + } + } + +/* +============== += += SkipToEOL += +============== +*/ + +bool Script::SkipToEOL + ( + void + ) + + { + if ( m_script_p >= m_end_p ) + { + return true; + } + + while( *m_script_p != TOKENEOL ) + { + if ( m_script_p >= m_end_p ) + { + return true; + } + m_script_p++; + } + return false; + } + +/* +============== += += CheckOverflow += +============== +*/ + +void Script::CheckOverflow + ( + void + ) + + { + if ( m_script_p >= m_end_p ) + { + Com_Error( ERR_DROP, "End of token file reached prematurely reading %s\n", m_filename.c_str() ); + } + } + +/* +============== += += SkipWhiteSpace += +============== +*/ + +void Script::SkipWhiteSpace + ( + bool crossline + ) + + { + // + // skip space + // + CheckOverflow(); + + while( ( *m_script_p <= TOKENSPACE ) || ( *m_script_p == ',' ) ) + { + if ( *m_script_p++ == TOKENEOL ) + { + if ( !crossline ) + { + Com_Error( ERR_DROP, "Line %i is incomplete in file %s\n", m_line, m_filename.c_str() ); + } + + m_line++; + } + CheckOverflow(); + } + } + +bool Script::AtComment + ( + void + ) + + { + if ( m_script_p >= m_end_p ) + { + return false; + } + + if ( *m_script_p == TOKENCOMMENT ) + { + return true; + } + +// if ( *m_script_p == TOKENCOMMENT2 ) + //{ + //return true; + //} + + // Two or more character comment specifiers + if ( ( m_script_p + 1 ) >= m_end_p ) + { + return false; + } + + if ( ( *m_script_p == '/' ) && ( *( m_script_p + 1 ) == '/' ) ) + { + return true; + } + + return false; + } + +/* +============== += += SkipNonToken += +============== +*/ + +void Script::SkipNonToken + ( + bool crossline + ) + + { + // + // skip space and comments + // + SkipWhiteSpace( crossline ); + while( AtComment() ) + { + SkipToEOL(); + SkipWhiteSpace( crossline ); + } + } + +/* +============================================================================= += += Token section += +============================================================================= +*/ + +/* +============== += += TokenAvailable += +============== +*/ + +bool Script::TokenAvailable + ( + bool crossline + ) + + { + if ( m_script_p >= m_end_p ) + { + return false; + } + + while ( 1 ) + { + while ( *m_script_p <= TOKENSPACE ) + { + if ( *m_script_p == TOKENEOL ) + { + if ( crossline==false ) + { + return( false ); + } + m_line++; + } + + m_script_p++; + if ( m_script_p >= m_end_p ) + { + return false; + } + } + + if ( AtComment() ) + { + bool done; + + done = SkipToEOL(); + if ( done ) + { + return false; + } + } + else + { + break; + } + } + + return true; + } + +/* +============== += += CommentAvailable += +============== +*/ + +bool Script::CommentAvailable + ( + bool crossline + ) + + { + const char *searchptr; + + searchptr = m_script_p; + + if ( searchptr >= m_end_p ) + { + return false; + } + + while ( *searchptr <= TOKENSPACE ) + { + if ( ( *searchptr == TOKENEOL ) && ( !crossline ) ) + { + return false; + } + searchptr++; + if ( searchptr >= m_end_p ) + { + return false; + } + } + + return true; + } + + +/* +============== += += UnGet += += Signals that the current token was not used, and should be reported += for the next GetToken. Note that + +GetToken (true); +UnGetToken (); +GetToken (false); + += could cross a line boundary. += +============== +*/ + +void Script::UnGetToken + ( + void + ) + + { + m_tokenready = true; + } + +/* +============== += += Get += +============== +*/ +bool Script::AtString + ( + bool crossline + ) + + { + // + // skip space + // + SkipNonToken( crossline ); + + return ( *m_script_p == '"' ); + } + +/* +============== += += Get += +============== +*/ + +const char *Script::GetToken + ( + bool crossline + ) + + { + char *token_p; + + // is a token already waiting? + if ( m_tokenready ) + { + m_tokenready = false; + return m_token; + } + + // + // skip space + // + SkipNonToken( crossline ); + + // + // copy token + // + + if ( *m_script_p == '"' ) + { + return GetString( crossline ); + } + + token_p = m_token; + while( *m_script_p > TOKENSPACE && *m_script_p != ',' && !AtComment() ) + { + if ( ( *m_script_p == '\\' ) && ( m_script_p < m_end_p - 1 ) ) + { + m_script_p++; + switch( *m_script_p ) + { + case 'n' : *token_p++ = '\n'; break; + case 'r' : *token_p++ = '\n'; break; + case '\'' : *token_p++ = '\''; break; + case '\"' : *token_p++ = '\"'; break; + case '\\' : *token_p++ = '\\'; break; + default: *token_p++ = *m_script_p; break; + } + m_script_p++; + } + else + { + *token_p++ = *m_script_p++; + } + + if ( token_p == &m_token[ MAXTOKEN ] ) + { + Com_Error( ERR_DROP, "Token too large on line %i in file %s\n", m_line, m_filename.c_str() ); + } + + if ( m_script_p == m_end_p ) + { + break; + } + } + + *token_p = 0; + + return m_token; + } + +/* +============== += += GetLine += +============== +*/ + +const char *Script::GetLine + ( + bool crossline + ) + + { + const char *start; + int size; + + // is a token already waiting? + if ( m_tokenready ) + { + m_tokenready = false; + return m_token; + } + + // + // skip space + // + SkipNonToken( crossline ); + + // + // copy token + // + start = m_script_p; + SkipToEOL(); + size = m_script_p - start; + if ( size < MAXTOKEN - 1 ) + { + memcpy( m_token, start, size ); + m_token[ size ] = '\0'; + } + else + { + Com_Error( ERR_DROP, "Token too large on line %i in file %s\n", m_line, m_filename.c_str() ); + } + + return m_token; + } + +/* +============== += += GetRaw += +============== +*/ + +const char *Script::GetRaw + ( + void + ) + + { + const char *start; + int size; + + // + // skip white space + // + SkipWhiteSpace( true ); + + // + // copy token + // + start = m_script_p; + SkipToEOL(); + size = m_script_p - start; + if ( size < MAXTOKEN - 1 ) + { + memset( m_token, 0, sizeof( m_token ) ); + memcpy( m_token, start, size ); + } + else + { + Com_Error( ERR_DROP, "Token too large on line %i in file %s\n", m_line, m_filename.c_str() ); + } + + return m_token; + } + +/* +============== += += GetString += +============== +*/ + +const char *Script::GetString + ( + bool crossline + ) + + { + int startline; + char *token_p; + + // is a token already waiting? + if ( m_tokenready ) + { + m_tokenready = false; + return m_token; + } + + // + // skip space + // + SkipNonToken( crossline ); + + if ( *m_script_p != '"' ) + { + Com_Error( ERR_DROP, "Expecting string on line %i in file %s\n", m_line, m_filename.c_str() ); + } + + m_script_p++; + + startline = m_line; + token_p = m_token; + while( *m_script_p != '"' ) + { + if ( *m_script_p == TOKENEOL ) + { + Com_Error( ERR_DROP, "Line %i is incomplete while reading string in file %s\n", m_line, m_filename.c_str() ); + } + + if ( ( *m_script_p == '\\' ) && ( m_script_p < m_end_p - 1 ) ) + { + m_script_p++; + switch( *m_script_p ) + { + case 'n' : *token_p++ = '\n'; break; + case 'r' : *token_p++ = '\n'; break; + case '\'' : *token_p++ = '\''; break; + case '\"' : *token_p++ = '\"'; break; + case '\\' : *token_p++ = '\\'; break; + default: *token_p++ = *m_script_p; break; + } + m_script_p++; + } + else + { + *token_p++ = *m_script_p++; + } + + if ( m_script_p >= m_end_p ) + { + Com_Error( ERR_DROP, "End of token file reached prematurely while reading string on\n" + "line %d in file %s\n", startline, m_filename.c_str() ); + } + + if ( token_p == &m_token[ MAXTOKEN ] ) + { + Com_Error( ERR_DROP, "String too large on line %i in file %s\n", m_line, m_filename.c_str() ); + } + } + + *token_p = 0; + + // skip last quote + m_script_p++; + + return m_token; + } + +const char *Script::GetExpression + ( + bool crossline + ) + + { + char *token_p; + + // is a token already waiting? + if ( m_tokenready ) + { + m_tokenready = false; + return m_token; + } + + // + // skip space + // + SkipNonToken( crossline ); + + // + // copy token + // + + if ( *m_script_p == '"' ) + { + return GetString( crossline ); + } + + token_p = m_token; + while( *m_script_p != ',' && !AtComment() ) + { + if ( ( *m_script_p == '\\' ) && ( m_script_p < m_end_p - 1 ) ) + { + m_script_p++; + switch( *m_script_p ) + { + case 'n' : *token_p++ = '\n'; break; + case 'r' : *token_p++ = '\n'; break; + case '\'' : *token_p++ = '\''; break; + case '\"' : *token_p++ = '\"'; break; + case '\\' : *token_p++ = '\\'; break; + default: *token_p++ = *m_script_p; break; + } + m_script_p++; + } + else + { + *token_p++ = *m_script_p++; + } + + if ( token_p == &m_token[ MAXTOKEN ] ) + { + Com_Error( ERR_DROP, "Token too large on line %i in file %s\n", m_line, m_filename.c_str() ); + } + + if ( m_script_p == m_end_p ) + { + break; + } + } + + *token_p = 0; + + return m_token; + } + +/* +============== += += GetSpecific += +============== +*/ + +bool Script::GetSpecific + ( + const char *string + ) + + { + do + { + if ( !TokenAvailable( true ) ) + { + return false; + } + GetToken( true ); + } + while( strcmp( m_token, string ) ); + + return true; + } + +/* +============== += += GetInteger += +============== +*/ + +int Script::GetInteger + ( + bool crossline + ) + + { + GetToken( crossline ); + return atoi( m_token ); + } + +/* +============== += += GetDouble += +============== +*/ + +double Script::GetDouble + ( + bool crossline + ) + + { + GetToken( crossline ); + return atof( m_token ); + } + +/* +============== += += GetFloat += +============== +*/ + +float Script::GetFloat + ( + bool crossline + ) + + { + return ( float )GetDouble( crossline ); + } + +/* +============== += += GetVector += +============== +*/ + +Vector Script::GetVector + ( + bool crossline + ) + + { + return Vector( GetFloat( crossline ), GetFloat( crossline ), GetFloat( crossline ) ); + } + +/* +=================== += += LinesInFile += +=================== +*/ +int Script::LinesInFile + ( + void + ) + + { + bool temp_tokenready; + const char *temp_script_p; + int temp_line; + char temp_token[ MAXTOKEN ]; + int numentries; + + temp_tokenready = m_tokenready; + temp_script_p = m_script_p; + temp_line = m_line; + strcpy( temp_token, m_token ); + + numentries = 0; + + Reset(); + while( TokenAvailable( true ) ) + { + GetLine( true ); + numentries++; + } + + m_tokenready = temp_tokenready; + m_script_p = temp_script_p; + m_line = temp_line; + strcpy( m_token, temp_token ); + + return numentries; + } + +/* +============== += += Parse += +============== +*/ + +void Script::Parse + ( + char *data, + int length, + const char *name + ) + + { + Close(); + + buffer = data; + Reset(); + m_end_p = m_script_p + length; + this->length = length; + m_filename = name; + } + +/* +============== += += Load += +============== +*/ + +void Script::LoadFile + ( + const char *name + ) + + { + int length; + char *buf; + + Close(); + + length = FILE_FS_ReadFile( name, (void **)&buf ); + + if ( length == -1 ) + { + error( "LoadFile", "Couldn't load %s\n", name ); + } + + buffer = ( char * )FILE_Malloc( length ); + memcpy( buffer, buf, length ); + FILE_FS_FreeFile( buf ); + + Parse( buffer, length, name ); + m_releaseBuffer = true; + } + +const char *Script::Token + ( + void + ) + + { + return m_token; + } diff --git a/source/source/cgame/script.h b/source/source/cgame/script.h new file mode 100644 index 0000000..fe1a73d --- /dev/null +++ b/source/source/cgame/script.h @@ -0,0 +1,158 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/client/script.h $ +// $Revision:: 2 $ +// $Date:: 9/28/99 4:26p $ +// +// Copyright (C) 1999 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/client/script.h $ +// +// 2 9/28/99 4:26p Markd +// merged listener, class and vector between 3 projects +// +// 1 9/10/99 10:51a Jimdose +// +// 1 9/09/99 7:51p Jimdose +// +// 2 7/01/99 6:56p Aldie +// Update UI +// +// 1 6/29/99 4:02p Aldie +// +// 1 6/23/99 2:50p Jimdose +// +// DESCRIPTION: +// C++ implementaion of tokenizing text interpretation. Class accepts filename +// to load or pointer to preloaded text data. Standard tokenizing operations +// such as skip white-space, get string, get integer, get float, get token, +// and skip line are implemented. +// +// Note: all '//', '#', and ';' are treated as comments. Probably should +// make this behaviour toggleable. +// + +#ifndef __SCRIPT_H__ +#define __SCRIPT_H__ + +#include "class.h" +#include "vector.h" +#include "str.h" + +#define MAXTOKEN 256 + +typedef struct + { + bool tokenready; + int offset; + int line; + char token[ MAXTOKEN ]; + } scriptmarker_t; + +class Script : public Class + { + protected: + bool m_tokenready; + + str m_filename; + const char *m_script_p; + const char *m_end_p; + + int m_line; + char m_token[ MAXTOKEN ]; + + bool m_releaseBuffer; + + bool AtComment( void ); + void CheckOverflow( void ); + + public: + char *buffer; + int length; + + CLASS_PROTOTYPE( Script ); + + ~Script(); + Script(); + void Close( void ); + const char *Filename( void ); + int GetLineNumber( void ); + void Reset( void ); + void MarkPosition( scriptmarker_t *mark ); + void RestorePosition( scriptmarker_t *mark ); + bool SkipToEOL( void ); + void SkipWhiteSpace( bool crossline ); + void SkipNonToken( bool crossline ); + bool TokenAvailable( bool crossline ); + bool CommentAvailable( bool crossline ); + void UnGetToken( void ); + bool AtString( bool crossline ); + const char *GetToken( bool crossline ); + const char *GetLine( bool crossline ); + const char *GetRaw( void ); + const char *GetString( bool crossline ); + const char *GetExpression( bool crossline ); + bool GetSpecific( const char *string ); + int GetInteger( bool crossline ); + double GetDouble( bool crossline ); + float GetFloat( bool crossline ); + Vector GetVector( bool crossline ); + int LinesInFile( void ); + void Parse( char *data, int length, const char *name ); + void LoadFile( const char *name ); + const char *Token( void ); +#if 0 + virtual void Archive( Archiver &arc ); + virtual void Unarchive( Archiver &arc ); +#endif + }; + +#if 0 +inline void Script::Archive + ( + Archiver &arc + ) + { + Class::Archive( arc ); + + arc.WriteString( m_filename ); + arc.WriteBoolean( m_tokenready ); + // + // save out current pointer as an offset + // + arc.WriteInteger( m_script_p - buffer ); + arc.WriteInteger( m_line ); + arc.WriteRaw( m_token, sizeof( m_token ) ); + } + +inline void Script::Unarchive + ( + Archiver &arc + ) + { + int i; + + Class::Unarchive( arc ); + + arc.ReadString( &m_filename ); + // + // load the file in + // + LoadFile( m_filename.c_str() ); + + arc.ReadBoolean( &m_tokenready ); + arc.ReadInteger( &i ); + // + // restore the script pointer + // + m_script_p = buffer + i; + arc.ReadInteger( &m_line ); + arc.ReadRaw( m_token, sizeof( m_token ) ); + } +#endif + +#endif diff --git a/source/source/cgame/str.cpp b/source/source/cgame/str.cpp new file mode 100644 index 0000000..cd48ad1 --- /dev/null +++ b/source/source/cgame/str.cpp @@ -0,0 +1,657 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/str.cpp $ +// $Revision:: 9 $ +// $Author:: Jimdose $ +// $Date:: 3/22/00 3:22p $ +// +// Copyright (C) 1997 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/str.cpp $ +// +// 9 3/22/00 3:22p Jimdose +// moved len from str to strdata +// +// 8 3/17/00 3:47p Markd +// changed ordering of include files to avoid sprintf error +// +// 7 10/06/99 10:01a Markd +// Fixed compiler warnings +// +// 6 10/05/99 2:03p Markd +// Added warning about files being in multiple projects +// +// 5 10/04/99 5:26p Morbid +// +// 4 10/03/99 3:48p Markd +// Added client and cgame listener and class documentation events +// +// 3 9/29/99 4:38p Morbid +// Added snprintf +// +// 2 9/24/99 1:55p Morbid +// Strings from Uber +// +// 1 9/10/99 10:55a Jimdose +// +// 1 9/08/99 3:16p Aldie +// +// DESCRIPTION: +// Simple, DLL portable string class +// +// WARNING: This file is shared between fgame, cgame and possibly the user interface. +// It is instanced in each one of these directories because of the way that SourceSafe works. +// + +#include "str.h" +#include +#include +#include +#include + +#ifdef _WIN32 +#pragma warning(disable : 4244) // 'conversion' conversion from 'type1' to 'type2', possible loss of data +#pragma warning(disable : 4710) // function 'blah' not inlined +#endif + +static const int STR_ALLOC_GRAN = 20; + +char *str::tolower + ( + char *s1 + ) + + { + char *s; + + s = s1; + while( *s ) + { + *s = ::tolower( *s ); + s++; + } + + return s1; + } + +char *str::toupper + ( + char *s1 + ) + + { + char *s; + + s = s1; + while( *s ) + { + *s = ::toupper( *s ); + s++; + } + + return s1; + } + +int str::icmpn + ( + const char *s1, + const char *s2, + int n + ) + + { + int c1; + int c2; + + do + { + c1 = *s1++; + c2 = *s2++; + + if ( !n-- ) + { + // strings are equal until end point + return 0; + } + + if ( c1 != c2 ) + { + if ( c1 >= 'a' && c1 <= 'z' ) + { + c1 -= ( 'a' - 'A' ); + } + + if ( c2 >= 'a' && c2 <= 'z' ) + { + c2 -= ( 'a' - 'A' ); + } + + if ( c1 < c2 ) + { + // strings less than + return -1; + } + else if ( c1 > c2 ) + { + // strings greater than + return 1; + } + } + } + while( c1 ); + + // strings are equal + return 0; + } + +int str::icmp + ( + const char *s1, + const char *s2 + ) + + { + int c1; + int c2; + + do + { + c1 = *s1++; + c2 = *s2++; + + if ( c1 != c2 ) + { + if ( c1 >= 'a' && c1 <= 'z' ) + { + c1 -= ( 'a' - 'A' ); + } + + if ( c2 >= 'a' && c2 <= 'z' ) + { + c2 -= ( 'a' - 'A' ); + } + + if ( c1 < c2 ) + { + // strings less than + return -1; + } + else if ( c1 > c2 ) + { + // strings greater than + return 1; + } + } + } + while( c1 ); + + // strings are equal + return 0; + } + +int str::cmpn + ( + const char *s1, + const char *s2, + int n + ) + + { + int c1; + int c2; + + do + { + c1 = *s1++; + c2 = *s2++; + + if ( !n-- ) + { + // strings are equal until end point + return 0; + } + + if ( c1 < c2 ) + { + // strings less than + return -1; + } + else if ( c1 > c2 ) + { + // strings greater than + return 1; + } + } + while( c1 ); + + // strings are equal + return 0; + } + +int str::cmp + ( + const char *s1, + const char *s2 + ) + + { + int c1; + int c2; + + do + { + c1 = *s1++; + c2 = *s2++; + + if ( c1 < c2 ) + { + // strings less than + return -1; + } + else if ( c1 > c2 ) + { + // strings greater than + return 1; + } + } + while( c1 ); + + // strings are equal + return 0; + } + +/* +============ +IsNumeric + +Checks a string to see if it contains only numerical values. +============ +*/ +bool str::isNumeric + ( + const char *str + ) + + { + int len; + int i; + bool dot; + + if ( *str == '-' ) + { + str++; + } + + dot = false; + len = strlen( str ); + for( i = 0; i < len; i++ ) + { + if ( !isdigit( str[ i ] ) ) + { + if ( ( str[ i ] == '.' ) && !dot ) + { + dot = true; + continue; + } + return false; + } + } + + return true; + } + +str operator+ + ( + const str& a, + const float b + ) + + { + char text[ 20 ]; + + str result( a ); + + sprintf( text, "%f", b ); + result.append( text ); + + return result; + } + +str operator+ + ( + const str& a, + const int b + ) + + { + char text[ 20 ]; + + str result( a ); + + sprintf( text, "%d", b ); + result.append( text ); + + return result; + } + +str operator+ + ( + const str& a, + const unsigned b + ) + + { + char text[ 20 ]; + + str result( a ); + + sprintf( text, "%u", b ); + result.append( text ); + + return result; + } + +str& str::operator+= + ( + const float a + ) + + { + char text[ 20 ]; + + sprintf( text, "%f", a ); + append( text ); + + return *this; + } + +str& str::operator+= + ( + const int a + ) + + { + char text[ 20 ]; + + sprintf( text, "%d", a ); + append( text ); + + return *this; + } + +str& str::operator+= + ( + const unsigned a + ) + + { + char text[ 20 ]; + + sprintf( text, "%u", a ); + append( text ); + + return *this; + } + +void str::CapLength + ( + int newlen + ) + + { + assert ( m_data ); + + if ( length() <= newlen ) + return; + + EnsureDataWritable (); + + m_data->data[newlen] = 0; + m_data->len = newlen; + } + +void str::EnsureDataWritable + ( + void + ) + + { + assert ( m_data ); + strdata *olddata; + int len; + + if ( !m_data->refcount ) + return; + + olddata = m_data; + len = length(); + + m_data = new strdata; + + EnsureAlloced ( len + 1, false ); + strncpy ( m_data->data, olddata->data, len+1 ); + m_data->len = len; + + olddata->DelRef (); + } + +void str::EnsureAlloced + ( + int amount, + bool keepold + ) + + { + if ( !m_data ) + m_data = new strdata; + + // Now, let's make sure it's writable + EnsureDataWritable (); + + char *newbuffer; + bool wasalloced = ( m_data->alloced != 0 ); + + if ( amount < m_data->alloced ) + return; + + assert ( amount ); + + if ( amount == 1 ) + { + m_data->alloced = 1; + } + else + { + int newsize, mod; + + mod = amount % STR_ALLOC_GRAN; + + if ( !mod ) + newsize = amount; + else + newsize = amount + STR_ALLOC_GRAN - mod; + + m_data->alloced = newsize; + } + + newbuffer = new char[m_data->alloced]; + + if ( wasalloced && keepold ) + { + strcpy ( newbuffer, m_data->data ); + } + + if ( m_data->data ) + { + delete [] m_data->data; + } + + m_data->data = newbuffer; + } + +void str::BackSlashesToSlashes + ( + void + ) + + { + int i; + + EnsureDataWritable (); + + for ( i=0; i < m_data->len; i++ ) + { + if ( m_data->data[i] == '\\' ) + m_data->data[i] = '/'; + } + } + +void str::snprintf + ( + char *dst, + int size, + const char *fmt, + ... + ) + + { + char buffer[0x10000]; + int len; + va_list argptr; + + va_start (argptr,fmt); + len = vsprintf (buffer,fmt,argptr); + va_end (argptr); + + assert ( len < size ); + + strncpy (dst, buffer, size-1); + } + +#ifdef _WIN32 +#pragma warning(disable : 4189) // local variable is initialized but not referenced +#endif + +/* +================= +TestStringClass + +This is a fairly rigorous test of the str class's functionality. +Because of the fairly global and subtle ramifications of a bug occuring +in this class, it should be run after any changes to the class. +Add more tests as functionality is changed. Tests should include +any possible bounds violation and NULL data tests. +================= +*/ +void TestStringClass + ( + void + ) + + { + char ch; // ch == ? + str *t; // t == ? + str a; // a.len == 0, a.data == "\0" + str b; // b.len == 0, b.data == "\0" + str c( "test" ); // c.len == 4, c.data == "test\0" + str d( c ); // d.len == 4, d.data == "test\0" + str e( reinterpret_cast(NULL) ); + // e.len == 0, e.data == "\0" ASSERT! + int i; // i == ? + + i = a.length(); // i == 0 + i = c.length(); // i == 4 + + const char *s1 = a.c_str(); // s1 == "\0" + const char *s2 = c.c_str(); // s2 == "test\0" + + t = new str(); // t->len == 0, t->data == "\0" + delete t; // t == ? + + b = "test"; // b.len == 4, b.data == "test\0" + t = new str( "test" ); // t->len == 4, t->data == "test\0" + delete t; // t == ? + + a = c; // a.len == 4, a.data == "test\0" +// a = ""; + a = NULL; // a.len == 0, a.data == "\0" ASSERT! + a = c + d; // a.len == 8, a.data == "testtest\0" + a = c + "wow"; // a.len == 7, a.data == "testwow\0" + a = c + reinterpret_cast(NULL); + // a.len == 4, a.data == "test\0" ASSERT! + a = "this" + d; // a.len == 8, a.data == "thistest\0" + a = reinterpret_cast(NULL) + d; + // a.len == 4, a.data == "test\0" ASSERT! + a += c; // a.len == 8, a.data == "testtest\0" + a += "wow"; // a.len == 11, a.data == "testtestwow\0" + a += reinterpret_cast(NULL); + // a.len == 11, a.data == "testtestwow\0" ASSERT! + + a = "test"; // a.len == 4, a.data == "test\0" + ch = a[ 0 ]; // ch == 't' + ch = a[ -1 ]; // ch == 0 ASSERT! + ch = a[ 1000 ]; // ch == 0 ASSERT! + ch = a[ 0 ]; // ch == 't' + ch = a[ 1 ]; // ch == 'e' + ch = a[ 2 ]; // ch == 's' + ch = a[ 3 ]; // ch == 't' + ch = a[ 4 ]; // ch == '\0' ASSERT! + ch = a[ 5 ]; // ch == '\0' ASSERT! + + a[ 1 ] = 'b'; // a.len == 4, a.data == "tbst\0" + a[ -1 ] = 'b'; // a.len == 4, a.data == "tbst\0" ASSERT! + a[ 0 ] = '0'; // a.len == 4, a.data == "0bst\0" + a[ 1 ] = '1'; // a.len == 4, a.data == "01st\0" + a[ 2 ] = '2'; // a.len == 4, a.data == "012t\0" + a[ 3 ] = '3'; // a.len == 4, a.data == "0123\0" + a[ 4 ] = '4'; // a.len == 4, a.data == "0123\0" ASSERT! + a[ 5 ] = '5'; // a.len == 4, a.data == "0123\0" ASSERT! + a[ 7 ] = '7'; // a.len == 4, a.data == "0123\0" ASSERT! + + a = "test"; // a.len == 4, a.data == "test\0" + b = "no"; // b.len == 2, b.data == "no\0" + + i = ( a == b ); // i == 0 + i = ( a == c ); // i == 1 + + i = ( a == "blow" ); // i == 0 + i = ( a == "test" ); // i == 1 + i = ( a == NULL ); // i == 0 ASSERT! + + i = ( "test" == b ); // i == 0 + i = ( "test" == a ); // i == 1 + i = ( NULL == a ); // i == 0 ASSERT! + + i = ( a != b ); // i == 1 + i = ( a != c ); // i == 0 + + i = ( a != "blow" ); // i == 1 + i = ( a != "test" ); // i == 0 + i = ( a != NULL ); // i == 1 ASSERT! + + i = ( "test" != b ); // i == 1 + i = ( "test" != a ); // i == 0 + i = ( NULL != a ); // i == 1 ASSERT! + + a = "test"; // a.data == "test" + b = a; // b.data == "test" + + a = "not"; // a.data == "not", b.data == "test" + + a = b; // a.data == b.data == "test" + + a += b; // a.data == "testtest", b.data = "test" + + a = b; + + a[1] = '1'; // a.data = "t1st", b.data = "test" + } + +#ifdef _WIN32 +#pragma warning(default : 4189) // local variable is initialized but not referenced +#pragma warning(disable : 4514) // unreferenced inline function has been removed +#endif diff --git a/source/source/cgame/str.h b/source/source/cgame/str.h new file mode 100644 index 0000000..672541f --- /dev/null +++ b/source/source/cgame/str.h @@ -0,0 +1,839 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/str.h $ +// $Revision:: 15 $ +// $Author:: Aldie $ +// $Date:: 7/25/00 11:32p $ +// +// Copyright (C) 1997 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/str.h $ +// +// 15 7/25/00 11:32p Aldie +// Made some changes to the memory system and fixed a memory allocation bug in +// Z_TagMalloc. Also changed a lot of classes to subclass from Class. +// +// 14 6/14/00 3:57p Markd +// fixed bug +// +// 13 6/14/00 3:50p Markd +// Cleaned up more Intel Compiler warnings +// +// 12 6/14/00 11:18a Markd +// cleaned up code using Intel compiler +// +// 11 5/25/00 4:29p Markd +// made archive a friend class of strings +// +// 10 3/22/00 3:23p Jimdose +// moved len from str to strdata +// +// 9 3/21/00 2:44p Jimdose +// fixed a bug where assigning the string to itself would corrupt the object +// +// 8 3/17/00 3:44p Markd +// added float, int and unsigned constructors +// +// 7 10/28/99 12:17p Morbid +// Fixed various const-ness issues with the compare functions +// +// 6 10/06/99 10:01a Markd +// Fixed compiler warnings +// +// 5 10/05/99 2:03p Markd +// Added warning about files being in multiple projects +// +// 4 9/29/99 4:38p Morbid +// Added snprintf +// +// 3 9/24/99 1:55p Morbid +// Strings from Uber +// +// 2 9/24/99 11:03a Morbid +// Added CapLength () +// +// 1 9/10/99 10:55a Jimdose +// +// 1 9/08/99 3:16p Aldie +// +// DESCRIPTION: +// Simple, DLL portable string class +// +// WARNING: This file is shared between fgame, cgame and possibly the user interface. +// It is instanced in each one of these directories because of the way that SourceSafe works. +// + +#ifndef __STR_H__ +#define __STR_H__ + +#include +#include +#include + +#ifdef _WIN32 +#pragma warning(disable : 4710) // function 'blah' not inlined +#endif + +void TestStringClass (); + +class strdata + { + public: + strdata () : len( 0 ), refcount ( 0 ), data ( NULL ), alloced ( 0 ) {} + ~strdata () + { + if ( data ) + delete [] data; + } + + void AddRef () { refcount++; } + bool DelRef () // True if killed + { + refcount--; + if ( refcount < 0 ) + { + delete this; + return true; + } + + return false; + } + + char *data; + int refcount; + int alloced; + int len; + }; + +#if 1 +class __declspec( dllexport ) str +#else +class str : public Class +#endif + { + protected: + + friend class Archiver; + strdata *m_data; + void EnsureAlloced ( int, bool keepold = true ); + void EnsureDataWritable (); + + public: + ~str(); + str(); + str( const char *text ); + str( const str& string ); + str( const str string, int start, int end ); + str( const char ch ); + str( const int num ); + str( const float num ); + str( const unsigned num ); + + + int length( void ) const; + const char * c_str( void ) const; + + void append( const char *text ); + void append( const str& text ); + + char operator[]( int index ) const; + char& operator[]( int index ); + + void operator=( const str& text ); + void operator=( const char *text ); + + friend str operator+( const str& a, const str& b ); + friend str operator+( const str& a, const char *b ); + friend str operator+( const char *a, const str& b ); + + friend str operator+( const str& a, const float b ); + friend str operator+( const str& a, const int b ); + friend str operator+( const str& a, const unsigned b ); + friend str operator+( const str& a, const bool b ); + friend str operator+( const str& a, const char b ); + + str& operator+=( const str& a ); + str& operator+=( const char *a ); + str& operator+=( const float a ); + str& operator+=( const char a ); + str& operator+=( const int a ); + str& operator+=( const unsigned a ); + str& operator+=( const bool a ); + + friend bool operator==( const str& a, const str& b ); + friend bool operator==( const str& a, const char *b ); + friend bool operator==( const char *a, const str& b ); + + friend bool operator!=( const str& a, const str& b ); + friend bool operator!=( const str& a, const char *b ); + friend bool operator!=( const char *a, const str& b ); + + operator const char * () const; + + int icmpn( const char *text, int n ) const; + int icmpn( const str& text, int n ) const; + int icmp( const char *text ) const; + int icmp( const str& text ) const; + int cmpn( const char *text, int n ) const; + int cmpn( const str& text, int n ) const; + + void tolower( void ); + void toupper( void ); + + static char *tolower( char *s1 ); + static char *toupper( char *s1 ); + + static int icmpn( const char *s1, const char *s2, int n ); + static int icmp( const char *s1, const char *s2 ); + static int cmpn( const char *s1, const char *s2, int n ); + static int cmp( const char *s1, const char *s2 ); + + static void snprintf ( char *dst, int size, const char *fmt, ... ); + + static bool isNumeric( const char *str ); + bool isNumeric( void ) const; + + void CapLength ( int ); + + void BackSlashesToSlashes (); + }; + + +inline char str::operator[]( int index ) const + { + assert ( m_data ); + + if ( !m_data ) + return 0; + + // don't include the '/0' in the test, because technically, it's out of bounds + assert( ( index >= 0 ) && ( index < m_data->len ) ); + + // In release mode, give them a null character + // don't include the '/0' in the test, because technically, it's out of bounds + if ( ( index < 0 ) || ( index >= m_data->len ) ) + { + return 0; + } + + return m_data->data[ index ]; + } + +inline int str::length( void ) const + { + return ( m_data != NULL ) ? m_data->len : 0; + } + +inline str::~str() + { + if ( m_data ) + { + m_data->DelRef (); + m_data = NULL; + } + } + +inline str::str() : m_data ( NULL ) + { + EnsureAlloced ( 1 ); + m_data->data[ 0 ] = 0; + } + +inline str::str + ( + const char *text + ) : m_data ( NULL ) + + { + int len; + + assert( text ); + + if ( text ) + { + len = strlen( text ); + EnsureAlloced ( len + 1 ); + strcpy( m_data->data, text ); + m_data->len = len; + } + else + { + EnsureAlloced ( 1 ); + m_data->data[ 0 ] = 0; + m_data->len = 0; + } + } + +inline str::str + ( + const str& text + ) : m_data ( NULL ) + + { + m_data = text.m_data; + m_data->AddRef (); + } + +inline str::str + ( + const str text, + int start, + int end + ) : m_data ( NULL ) + + { + int i; + int len; + + if ( end > text.length() ) + { + end = text.length(); + } + + if ( start > text.length() ) + { + start = text.length(); + } + + len = end - start; + if ( len < 0 ) + { + len = 0; + } + + EnsureAlloced ( len + 1 ); + + for( i = 0; i < len; i++ ) + { + m_data->data[ i ] = text[ start + i ]; + } + + m_data->data[ len ] = 0; + m_data->len = len; + } + +inline str::str + ( + const char ch + ) : m_data ( NULL ) + + { + EnsureAlloced ( 2 ); + + m_data->data[ 0 ] = ch; + m_data->data[ 1 ] = 0; + m_data->len = 1; + } + +inline str::str + ( + const float num + ) : m_data ( NULL ) + + { + char text[ 32 ]; + int len; + + sprintf( text, "%.3f", num ); + len = strlen( text ); + EnsureAlloced( len + 1 ); + strcpy( m_data->data, text ); + m_data->len = len; + } + +inline str::str + ( + const int num + ) : m_data ( NULL ) + + { + char text[ 32 ]; + int len; + + sprintf( text, "%d", num ); + len = strlen( text ); + EnsureAlloced( len + 1 ); + strcpy( m_data->data, text ); + m_data->len = len; + } + +inline str::str + ( + const unsigned num + ) : m_data ( NULL ) + + { + char text[ 32 ]; + int len; + + sprintf( text, "%u", num ); + len = strlen( text ); + EnsureAlloced( len + 1 ); + strcpy( m_data->data, text ); + m_data->len = len; + } + +inline const char *str::c_str( void ) const + { + assert( m_data ); + + return m_data->data; + } + +inline void str::append + ( + const char *text + ) + + { + int len; + + assert( text ); + + if ( text ) + { + len = length(); + len += strlen( text ); + EnsureAlloced( len + 1 ); + + strcat( m_data->data, text ); + m_data->len = len; + } + } + +inline void str::append + ( + const str& text + ) + + { + int len; + + len = length(); + len += text.length(); + EnsureAlloced ( len + 1 ); + + strcat ( m_data->data, text.c_str () ); + m_data->len = len; + } + + +inline char& str::operator[] + ( + int index + ) + + { + // Used for result for invalid indices + static char dummy = 0; + assert ( m_data ); + + // We don't know if they'll write to it or not + // if it's not a const object + EnsureDataWritable (); + + if ( !m_data ) + return dummy; + + // don't include the '/0' in the test, because technically, it's out of bounds + assert( ( index >= 0 ) && ( index < m_data->len ) ); + + // In release mode, let them change a safe variable + // don't include the '/0' in the test, because technically, it's out of bounds + if ( ( index < 0 ) || ( index >= m_data->len ) ) + { + return dummy; + } + + return m_data->data[ index ]; + } + +inline void str::operator= + ( + const str& text + ) + + { + // adding the reference before deleting our current reference prevents + // us from deleting our string if we are copying from ourself + text.m_data->AddRef(); + m_data->DelRef(); + m_data = text.m_data; + } + +inline void str::operator= + ( + const char *text + ) + + { + int len; + + assert( text ); + + if ( !text ) + { + // safe behaviour if NULL + EnsureAlloced ( 1, false ); + m_data->data[0] = 0; + m_data->len = 0; + return; + } + + if ( !m_data ) + { + len = strlen ( text ); + EnsureAlloced( len + 1, false ); + strcpy ( m_data->data, text ); + m_data->len = len; + return; + } + + if ( text == m_data->data ) + return; // Copying same thing. Punt. + + // If we alias and I don't do this, I could corrupt other strings... This + // will get called with EnsureAlloced anyway + EnsureDataWritable (); + + // Now we need to check if we're aliasing.. + if ( text >= m_data->data && text <= m_data->data + m_data->len ) + { + // Great, we're aliasing. We're copying from inside ourselves. + // This means that I don't have to ensure that anything is alloced, + // though I'll assert just in case. + int diff = text - m_data->data; + int i; + + assert ( strlen ( text ) < (unsigned) m_data->len ); + + for ( i = 0; text[i]; i++ ) + { + m_data->data[i] = text[i]; + } + + m_data->data[i] = 0; + + m_data->len -= diff; + + return; + } + + len = strlen( text ); + EnsureAlloced ( len + 1, false ); + strcpy( m_data->data, text ); + m_data->len = len; + } + +inline str operator+ + ( + const str& a, + const str& b + ) + + { + str result( a ); + + result.append( b ); + + return result; + } + +inline str operator+ + ( + const str& a, + const char *b + ) + + { + str result( a ); + + result.append( b ); + + return result; + } + +inline str operator+ + ( + const char *a, + const str& b + ) + + { + str result( a ); + + result.append( b ); + + return result; + } + +inline str operator+ + ( + const str& a, + const bool b + ) + + { + str result( a ); + + result.append( b ? "true" : "false" ); + + return result; + } + +inline str operator+ + ( + const str& a, + const char b + ) + + { + char text[ 2 ]; + + text[ 0 ] = b; + text[ 1 ] = 0; + + return a + text; + } + +inline str& str::operator+= + ( + const str& a + ) + + { + append( a ); + return *this; + } + +inline str& str::operator+= + ( + const char *a + ) + + { + append( a ); + return *this; + } + +inline str& str::operator+= + ( + const char a + ) + + { + char text[ 2 ]; + + text[ 0 ] = a; + text[ 1 ] = 0; + append( text ); + + return *this; + } + +inline str& str::operator+= + ( + const bool a + ) + + { + append( a ? "true" : "false" ); + return *this; + } + +inline bool operator== + ( + const str& a, + const str& b + ) + + { + return ( !strcmp( a.c_str(), b.c_str() ) ); + } + +inline bool operator== + ( + const str& a, + const char *b + ) + + { + assert( b ); + if ( !b ) + { + return false; + } + return ( !strcmp( a.c_str(), b ) ); + } + +inline bool operator== + ( + const char *a, + const str& b + ) + + { + assert( a ); + if ( !a ) + { + return false; + } + return ( !strcmp( a, b.c_str() ) ); + } + +inline bool operator!= + ( + const str& a, + const str& b + ) + + { + return !( a == b ); + } + +inline bool operator!= + ( + const str& a, + const char *b + ) + + { + return !( a == b ); + } + +inline bool operator!= + ( + const char *a, + const str& b + ) + + { + return !( a == b ); + } + +inline int str::icmpn + ( + const char *text, + int n + ) const + + { + assert( m_data ); + assert( text ); + + return str::icmpn( m_data->data, text, n ); + } + +inline int str::icmpn + ( + const str& text, + int n + ) const + + { + assert( m_data ); + assert( text.m_data ); + + return str::icmpn( m_data->data, text.m_data->data, n ); + } + +inline int str::icmp + ( + const char *text + ) const + + { + assert( m_data ); + assert( text ); + + return str::icmp( m_data->data, text ); + } + +inline int str::icmp + ( + const str& text + ) const + + { + assert( c_str () ); + assert( text.c_str () ); + + return str::icmp( c_str () , text.c_str () ); + } + +inline int str::cmpn + ( + const char *text, + int n + ) const + + { + assert( c_str () ); + assert( text ); + + return str::cmpn( c_str () , text, n ); + } + +inline int str::cmpn + ( + const str& text, + int n + ) const + + { + assert( c_str () ); + assert( text.c_str () ); + + return str::cmpn( c_str () , text.c_str () , n ); + } + +inline void str::tolower + ( + void + ) + + { + assert( m_data ); + + EnsureDataWritable (); + + str::tolower( m_data->data ); + } + +inline void str::toupper + ( + void + ) + + { + assert( m_data ); + + EnsureDataWritable (); + + str::toupper( m_data->data ); + } + +inline bool str::isNumeric + ( + void + ) const + + { + assert( m_data ); + return str::isNumeric( m_data->data ); + } + +inline str::operator const char * + ( + void + ) const + + { + return c_str (); + } + +#endif diff --git a/source/source/cgame/tr_types.h b/source/source/cgame/tr_types.h new file mode 100644 index 0000000..b3a1ba8 --- /dev/null +++ b/source/source/cgame/tr_types.h @@ -0,0 +1,335 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/cgame/tr_types.h $ +// $Revision:: 24 $ +// $Author:: Markd $ +// $Date:: 6/28/00 7:34p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/cgame/tr_types.h $ +// +// 24 6/28/00 7:34p Markd +// Increased EXTENSIONS string size +// +// 23 6/20/00 11:55a Markd +// changed frames from bytes to shorts +// +// 22 3/31/00 11:45a Markd +// Added skyportal toggling support +// +// 21 3/17/00 6:37p Markd +// fixed 8 bit anim bug +// +// 20 3/04/00 2:47p Markd +// Made dynamic light types into bits so that they could be combined +// +// 19 2/25/00 12:31p Markd +// Added additive dynamic light support +// +// 18 2/21/00 7:02p Markd +// started adding old-school dlights and sky_alpha support +// +// 17 2/14/00 5:41p Jimdose +// added uselegs to refEntity_t +// +// 16 12/11/99 3:37p Markd +// q3a gold checkin, first time +// +// 15 11/11/99 11:35a Jimdose +// added usetorso tp refEntity_t +// +// 14 11/10/99 2:16p Jimdose +// added torso animation variables to refEntity_t +// +// 13 10/29/99 6:52p Jimdose +// added bone controllers +// +// 12 10/26/99 6:29p Jimdose +// added animation blending vars to refEntity_t +// +// 11 10/25/99 12:19p Jimdose +// made head and torso angles local to each entity +// +// 10 10/19/99 7:52p Markd +// Removed three part model system +// +// 9 10/14/99 4:51p Jimdose +// added head_angles and torso_angles to refdef_t +// +// 8 10/05/99 6:01p Aldie +// Added headers +// +// DESCRIPTION: +// Renderer types + +#ifndef __TR_TYPES_H +#define __TR_TYPES_H + + +#define MAX_DLIGHTS 32 // can't be increased, because bit flags are used on surfaces +#define MAX_ENTITIES 1023 // can't be increased without changing drawsurf bit packing +#define MAX_POINTS 32 +#define MAX_SPRITES 1024 + +// refdef flags +#define RDF_NOWORLDMODEL 1 // used for player configuration screen +#define RDF_HYPERSPACE 4 // teleportation effect + +typedef struct + { + float pos[2]; + float size[2]; + } letterloc_t; + +typedef struct + { + int indirection[256]; + letterloc_t locations[256]; + char name[255]; + float height; + float aspectRatio; + void *shader; + int trhandle; // the last renderer handle this font used + } fontheader_t; + +typedef struct { + vec3_t xyz; + float st[2]; + byte modulate[4]; +} polyVert_t; + +typedef struct poly_s { + qhandle_t hShader; + int numVerts; + polyVert_t *verts; +} poly_t; + +typedef enum { + RT_MODEL, + RT_POLY, + RT_SPRITE, + RT_BEAM, + RT_RAIL_CORE, + RT_RAIL_RINGS, + RT_LIGHTNING, + RT_PORTALSURFACE, // doesn't draw anything, just info for portals + + RT_MAX_REF_ENTITY_TYPE +} refEntityType_t; + +typedef enum { + lensflare = ( 1 << 0 ), + viewlensflare = ( 1 << 1 ), + additive = ( 1 << 2 ) +} dlighttype_t; + +struct tikiFrame_s; +struct dtiki_s; + +typedef struct { + refEntityType_t reType; + + int renderfx; + + qhandle_t hModel; // opaque type outside refresh + + // most recent data + vec3_t lightingOrigin; // so multi-part models can be lit identically (RF_LIGHTING_ORIGIN) + float shadowPlane; // projection shadows go here, stencils go slightly lower + + vec3_t axis[3]; // rotation vectors + qboolean nonNormalizedAxes; // axis are not normalized, i.e. they have scale + float origin[3]; // also used as MODEL_BEAM's "from" + int anim; // animation + int oldanim; // old animation + short oldframe; // old frame + short frame; // also used as MODEL_BEAM's diameter + float scale; // scale of the thing + + qboolean useAngles; + + // torso animation + int torso_anim; // animation + int torso_oldanim; // old animation + short torso_frame; + short torso_oldframe; // old frame + + // data for animation cross-blending + float crossblend_lerp; + float crossblend_backlerp; // 0.0 = current, 1.0 = old + + int crossblend_anim; // crossblend animation + short crossblend_frame; // crossblend anim frame + short crossblend_oldframe; // crossblend anim old frame + int uselegs; // non-zero means use leg animation + + float torso_crossblend_lerp; + float torso_crossblend_backlerp; // 0.0 = current, 1.0 = old + + int torso_crossblend_anim; // crossblend animation + short torso_crossblend_frame; // crossblend anim frame + short torso_crossblend_oldframe; // crossblend anim old frame + int usetorso; // non-zero means use torso animation + + // previous data for frame interpolation + float oldorigin[3]; // also used as MODEL_BEAM's "to" + float backlerp; // 0.0 = current, 1.0 = old + float torso_backlerp; // 0.0 = current, 1.0 = old + + // texturing + int skinNum; // inline skin index + qhandle_t customSkin; // NULL for default skin + qhandle_t customShader; // use one image for the entire thing + + // misc + byte shaderRGBA[4]; // colors used by colorSrc=vertex shaders + float shaderTexCoord[2]; // texture coordinates used by tcMod=vertex modifiers + float shaderTime; // subtracted from refdef time to control effect start times + + int entityNumber; // the real entity number + + byte surfaces[MAX_MODEL_SURFACES]; // the surface state of the entity + short shader_data[ 2 ]; // data passed in from shader manipulation + + int bone_tag[ NUM_BONE_CONTROLLERS ]; + vec4_t bone_quat[ NUM_BONE_CONTROLLERS ]; + + // renderer use only + struct tikiFrame_s *of, + *nf; + struct dtiki_s *tiki; + int bonestart; + + // extra sprite information + float radius; + float rotation; + +} refEntity_t; + +#define MAX_RENDER_STRINGS 8 +#define MAX_RENDER_STRING_LENGTH 32 + +typedef struct { + int x, y, width, height; + float fov_x, fov_y; + vec3_t vieworg; + vec3_t viewaxis[3]; // transformation matrix + + // time in milliseconds for shader effects and other time dependent rendering issues + int time; + + int rdflags; // RDF_NOWORLDMODEL, etc + + // 1 bits will prevent the associated area from rendering at all + byte areamask[MAX_MAP_AREA_BYTES]; + + // text messages for deform text shaders + char text[MAX_RENDER_STRINGS][MAX_RENDER_STRING_LENGTH]; + + // fog stuff + float farplane_distance; + vec3_t farplane_color; + qboolean farplane_cull; + + // sky portal stuff + qboolean sky_portal; + float sky_alpha; + vec3_t sky_origin; + vec3_t sky_axis[ 3 ]; + +} refdef_t; + + +typedef enum { + STEREO_CENTER, + STEREO_LEFT, + STEREO_RIGHT +} stereoFrame_t; + + +/* +** glconfig_t +** +** Contains variables specific to the OpenGL configuration +** being run right now. These are constant once the OpenGL +** subsystem is initialized. +*/ +typedef enum { + TC_NONE, + TC_S3TC +} textureCompression_t; + +typedef enum { + GLDRV_ICD, // driver is integrated with window system + // WARNING: there are tests that check for + // > GLDRV_ICD for minidriverness, so this + // should always be the lowest value in this + // enum set + GLDRV_STANDALONE, // driver is a non-3Dfx standalone driver + GLDRV_VOODOO // driver is a 3Dfx standalone driver +} glDriverType_t; + +typedef enum { + GLHW_GENERIC, // where everthing works the way it should + GLHW_3DFX_2D3D, // Voodoo Banshee or Voodoo3, relevant since if this is + // the hardware type then there can NOT exist a secondary + // display adapter + GLHW_RIVA128, // where you can't interpolate alpha + GLHW_RAGEPRO, // where you can't modulate alpha on alpha textures + GLHW_PERMEDIA2 // where you don't have src*dst +} glHardwareType_t; + + +typedef struct { + char renderer_string[ MAX_STRING_CHARS ]; + char vendor_string[ MAX_STRING_CHARS ]; + char version_string[ MAX_STRING_CHARS ]; + char extensions_string[ MAX_STRING_CHARS * 2 ]; + + int maxTextureSize; // queried from GL + int maxActiveTextures; // multitexture ability + + int colorBits, depthBits, stencilBits; + + glDriverType_t driverType; + glHardwareType_t hardwareType; + + qboolean deviceSupportsGamma; + textureCompression_t textureCompression; + qboolean textureEnvAddAvailable; + + int vidWidth, vidHeight; + // aspect is the screen's physical width / height, which may be different + // than scrWidth / scrHeight if the pixels are non-square + // normal screens should be 4/3, but wide aspect monitors may be 16/9 + float windowAspect; + + int displayFrequency; + + // synonymous with "does rendering consume the entire screen?", therefore + // a Voodoo or Voodoo2 will have this set to TRUE, as will a Win32 ICD that + // used CDS. + qboolean isFullscreen; + qboolean stereoEnabled; + qboolean smpActive; // dual processor +} glconfig_t; + +#if !defined _WIN32 + +#define _3DFX_DRIVER_NAME "libMesaVoodooGL.so.3.1" +#define OPENGL_DRIVER_NAME "libGL.so" + +#else + +#define _3DFX_DRIVER_NAME "3dfxvgl" +#define OPENGL_DRIVER_NAME "opengl32" + +#endif // !defined _WIN32 + + +#endif // __TR_TYPES_H diff --git a/source/source/cgame/vector.h b/source/source/cgame/vector.h new file mode 100644 index 0000000..9508bd3 --- /dev/null +++ b/source/source/cgame/vector.h @@ -0,0 +1,1092 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/vector.h $ +// $Revision:: 12 $ +// $Author:: Jimdose $ +// $Date:: 3/13/00 7:15p $ +// +// Copyright (C) 1997 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/vector.h $ +// +// 12 3/13/00 7:15p Jimdose +// made normalize return the length +// +// 11 1/24/00 7:53p Jimdose +// removed vec3 +// +// 10 1/22/00 12:28p Jimdose +// added vec3_t conversions for FuzzyEqual and CrossProduct +// +// 9 1/22/00 12:19p Jimdose +// added some missing cases for vec3_t conversion +// +// 8 1/22/00 12:13p Jimdose +// added vec3_t conversions so that .vec3() is no longer needed +// +// 7 1/21/00 7:32p Markd +// Put in fuzzy equal support into script variables +// +// 6 1/05/00 6:39p Jimdose +// AngleVectors now returns left instead of right. +// +// 5 1/05/00 5:29p Jimdose +// made toAngles consitant with vectoangles +// +// 4 12/10/99 11:16a Jimdose +// made right and up optional in AngleVectors +// +// 3 10/05/99 2:03p Markd +// Added warning about files being in multiple projects +// +// 2 9/28/99 4:26p Markd +// merged listener, class and vector between 3 projects +// +// 1 9/10/99 10:55a Jimdose +// +// 1 9/08/99 3:16p Aldie +// +// 4 8/28/99 3:40p Jimdose +// changed all doubles to floats +// +// DESCRIPTION: +// C++ implemention of a Vector object. Handles standard vector operations +// such as addition, subtraction, normalization, scaling, dot product, +// cross product, length, and decomposition into Euler angles. +// +// WARNING: This file is shared between fgame, cgame and possibly the user interface. +// It is instanced in each one of these directories because of the way that SourceSafe works. +// + +#ifndef __VECTOR_H__ +#define __VECTOR_H__ + +#ifdef GAME_DLL +#include "g_local.h" +#endif + +#include +#include + +#ifdef __Q_FABS__ +#define VECTOR_FABS Q_fabs +#else +#define VECTOR_FABS fabs +#endif + +class Vector + { + public: + float x; + float y; + float z; + + Vector(); + Vector( vec3_t src ); + Vector( float x, float y, float z ); + Vector( const char *text ); + + operator float * (); + + float pitch( void ); + float yaw( void ); + float roll( void ); + float operator[]( int index ) const; + float& operator[]( int index ); + void copyTo( vec3_t vec ); + void setPitch( float x ); + void setYaw( float y ); + void setRoll( float z ); + void setXYZ( float x, float y, float z ); + void operator=( Vector a ); + void operator=( vec3_t a ); + friend Vector operator+( Vector a, Vector b ); + friend Vector operator+( vec3_t a, Vector b ); + friend Vector operator+( Vector a, vec3_t b ); + Vector& operator+=( Vector a ); + friend Vector operator-( Vector a, Vector b ); + friend Vector operator-( vec3_t a, Vector b ); + friend Vector operator-( Vector a, vec3_t b ); + Vector& operator-=( Vector a ); + friend Vector operator*( Vector a, float b ); + friend Vector operator*( float a, Vector b ); + friend float operator*( Vector a, Vector b ); + friend float operator*( vec3_t a, Vector b ); + friend float operator*( Vector a, vec3_t b ); + Vector& operator*=( float a ); + friend int operator==( Vector a, Vector b ); + friend int operator==( vec3_t a, Vector b ); + friend int operator==( Vector a, vec3_t b ); + friend int operator!=( Vector a, Vector b ); + friend int operator!=( vec3_t a, Vector b ); + friend int operator!=( Vector a, vec3_t b ); + int FuzzyEqual( Vector b, float epsilon ); + int FuzzyEqual( vec3_t b, float epsilon ); + Vector& CrossProduct( Vector a, Vector b ); + Vector& CrossProduct( vec3_t a, Vector b ); + Vector& CrossProduct( Vector a, vec3_t b ); + float length( void ); + float normalize( void ); +#if 0 +//FIXME +// Some kind of compiler bug in VC++ prevents this from working. +// Returns result of ( -x, -y, -x ) for some reason + Vector& operator-(); +#endif + friend Vector fabs( Vector a ); + float toYaw( void ); + float toPitch( void ); + Vector toAngles( void ); + void AngleVectors( Vector *forward, Vector *left = NULL, Vector *up = NULL ); + friend Vector LerpVector( Vector w1, Vector w2, float t ); + friend float MaxValue( Vector a ); + }; + +inline float Vector::pitch( void ) { return x; } +inline float Vector::yaw( void ) { return y; } +inline float Vector::roll( void ) { return z; } +inline void Vector::setPitch( float pitch ) { x = pitch; } +inline void Vector::setYaw( float yaw ) { y = yaw; } +inline void Vector::setRoll( float roll ) { z = roll; } + +inline void Vector::copyTo + ( + vec3_t vec + ) + + { + vec[ 0 ] = x; + vec[ 1 ] = y; + vec[ 2 ] = z; + } + +inline float Vector::operator[] + ( + int index + ) const + + { + assert( ( index >= 0 ) && ( index < 3 ) ); + return ( &x )[ index ]; + } + +inline float& Vector::operator[] + ( + int index + ) + + { + assert( ( index >= 0 ) && ( index < 3 ) ); + return ( &x )[ index ]; + } + +inline void Vector::setXYZ + ( + float x, + float y, + float z + ) + + { + this->x = x; + this->y = y; + this->z = z; + } + +inline Vector::Vector() + { + x = 0; + y = 0; + z = 0; + } + +inline Vector::Vector + ( + vec3_t src + ) + + { + x = src[ 0 ]; + y = src[ 1 ]; + z = src[ 2 ]; + } + +inline Vector::Vector + ( + float x, + float y, + float z + ) + + { + this->x = x; + this->y = y; + this->z = z; + } + +inline Vector::Vector + ( + const char *text + ) + + { + if ( text ) + { + sscanf( text, "%f %f %f", &x, &y, &z ); + } + else + { + x = 0; + y = 0; + z = 0; + } + } + +inline Vector::operator float * + ( + void + ) + + { + return &x; + } + +inline void Vector::operator= + ( + Vector a + ) + + { + x = a.x; + y = a.y; + z = a.z; + } + +inline void Vector::operator= + ( + vec3_t a + ) + + { + x = a[ 0 ]; + y = a[ 1 ]; + z = a[ 2 ]; + } + +inline Vector operator+ + ( + Vector a, + Vector b + ) + + { + return Vector( a.x + b.x, a.y + b.y, a.z + b.z ); + } + +inline Vector operator+ + ( + vec3_t a, + Vector b + ) + + { + return Vector( a[ 0 ] + b.x, a[ 1 ] + b.y, a[ 2 ] + b.z ); + } + +inline Vector operator+ + ( + Vector a, + vec3_t b + ) + + { + return Vector( a.x + b[ 0 ], a.y + b[ 1 ], a.z + b[ 2 ] ); + } + +inline Vector& Vector::operator+= + ( + Vector a + ) + + { + x += a.x; + y += a.y; + z += a.z; + + return *this; + } + +inline Vector operator- + ( + Vector a, + Vector b + ) + + { + return Vector( a.x - b.x, a.y - b.y, a.z - b.z ); + } + +inline Vector operator- + ( + vec3_t a, + Vector b + ) + + { + return Vector( a[ 0 ] - b.x, a[ 1 ] - b.y, a[ 2 ] - b.z ); + } + +inline Vector operator- + ( + Vector a, + vec3_t b + ) + + { + return Vector( a.x - b[ 0 ], a.y - b[ 1 ], a.z - b[ 2 ] ); + } + +inline Vector& Vector::operator-= + ( + Vector a + ) + + { + x -= a.x; + y -= a.y; + z -= a.z; + + return *this; + } + +inline Vector operator* + ( + Vector a, + float b + ) + + { + return Vector( a.x * b, a.y * b, a.z * b ); + } + +inline Vector operator* + ( + float a, + Vector b + ) + + { + return b * a; + } + +inline float operator* + ( + Vector a, + Vector b + ) + + { + return a.x * b.x + a.y * b.y + a.z * b.z; + } + +inline float operator* + ( + vec3_t a, + Vector b + ) + + { + return a[ 0 ] * b.x + a[ 1 ] * b.y + a[ 2 ] * b.z; + } + +inline float operator* + ( + Vector a, + vec3_t b + ) + + { + return a.x * b[ 0 ] + a.y * b[ 1 ] + a.z * b[ 2 ]; + } + +inline Vector& Vector::operator*= + ( + float a + ) + + { + x *= a; + y *= a; + z *= a; + + return *this; + } + +inline int Vector::FuzzyEqual + ( + Vector b, + float epsilon + ) + + { + return + ( + ( VECTOR_FABS( x - b.x ) < epsilon ) && + ( VECTOR_FABS( y - b.y ) < epsilon ) && + ( VECTOR_FABS( z - b.z ) < epsilon ) + ); + } + +inline int Vector::FuzzyEqual + ( + vec3_t b, + float epsilon + ) + + { + return + ( + ( VECTOR_FABS( x - b[ 0 ] ) < epsilon ) && + ( VECTOR_FABS( y - b[ 1 ] ) < epsilon ) && + ( VECTOR_FABS( z - b[ 2 ] ) < epsilon ) + ); + } + +inline int operator== + ( + Vector a, + Vector b + ) + + { + return ( ( a.x == b.x ) && ( a.y == b.y ) && ( a.z == b.z ) ); + } + +inline int operator== + ( + vec3_t a, + Vector b + ) + + { + return ( ( a[ 0 ] == b.x ) && ( a[ 1 ] == b.y ) && ( a[ 2 ] == b.z ) ); + } + +inline int operator== + ( + Vector a, + vec3_t b + ) + + { + return ( ( a.x == b[ 0 ] ) && ( a.y == b[ 1 ] ) && ( a.z == b[ 2 ] ) ); + } + +inline int operator!= + ( + Vector a, + Vector b + ) + + { + return ( ( a.x != b.x ) || ( a.y != b.y ) || ( a.z != b.z ) ); + } + +inline int operator!= + ( + vec3_t a, + Vector b + ) + + { + return ( ( a[ 0 ] != b.x ) || ( a[ 1 ] != b.y ) || ( a[ 2 ] != b.z ) ); + } + +inline int operator!= + ( + Vector a, + vec3_t b + ) + + { + return ( ( a.x != b[ 0 ] ) || ( a.y != b[ 1 ] ) || ( a.z != b[ 2 ] ) ); + } + +inline Vector& Vector::CrossProduct + ( + Vector a, + Vector b + ) + + { + x = a.y * b.z - a.z * b.y; + y = a.z * b.x - a.x * b.z; + z = a.x * b.y - a.y * b.x; + + return *this; + } + +inline Vector& Vector::CrossProduct + ( + vec3_t a, + Vector b + ) + + { + x = a[ 1 ] * b.z - a[ 2 ] * b.y; + y = a[ 2 ] * b.x - a[ 0 ] * b.z; + z = a[ 0 ] * b.y - a[ 1 ] * b.x; + + return *this; + } + +inline Vector& Vector::CrossProduct + ( + Vector a, + vec3_t b + ) + + { + x = a.y * b[ 2 ] - a.z * b[ 1 ]; + y = a.z * b[ 0 ] - a.x * b[ 2 ]; + z = a.x * b[ 1 ] - a.y * b[ 0 ]; + + return *this; + } + +inline float Vector::length + ( + void + ) + + { + float length; + + length = x * x + y * y + z * z; + return ( float )sqrt( length ); + } + +inline float Vector::normalize + ( + void + ) + + { + float length, ilength; + + length = this->length(); + if ( length ) + { + ilength = 1 / length; + x *= ilength; + y *= ilength; + z *= ilength; + } + + return length; + } + +#if 0 +//FIXME +// Some kind of compiler bug in VC++ prevents this from working. +// Returns result of ( -x, -y, -x ) for some reason +inline Vector& Vector::operator-() + { + return Vector( -x, -y, -z ); + } +#endif + +inline Vector fabs + ( + Vector a + ) + + { + return Vector( VECTOR_FABS( a.x ), VECTOR_FABS( a.y ), VECTOR_FABS( a.z ) ); + } + +inline float MaxValue + ( + Vector a + ) + + { + float maxy; + float maxz; + float max; + + max = VECTOR_FABS( a.x ); + maxy = VECTOR_FABS( a.y ); + maxz = VECTOR_FABS( a.z ); + + if ( maxy > max ) + { + max = maxy; + } + if ( maxz > max ) + { + max = maxz; + } + return max; + } + +inline float Vector::toYaw + ( + void + ) + + { + float yaw; + + if ( ( y == 0 ) && ( x == 0 ) ) + { + yaw = 0; + } + else + { + yaw = ( float )( ( int )( atan2( y, x ) * 180 / M_PI ) ); + if ( yaw < 0 ) + { + yaw += 360; + } + } + + return yaw; + } + +inline float Vector::toPitch + ( + void + ) + + { + float forward; + float pitch; + + if ( ( x == 0 ) && ( y == 0 ) ) + { + if ( z > 0 ) + { + pitch = 90; + } + else + { + pitch = 270; + } + } + else + { + forward = ( float )sqrt( x * x + y * y ); + pitch = ( float )( ( int )( atan2( z, forward ) * 180 / M_PI ) ); + if ( pitch < 0 ) + { + pitch += 360; + } + } + + return pitch; + } + +inline Vector Vector::toAngles + ( + void + ) + + { + float forward; + float yaw, pitch; + + if ( ( x == 0 ) && ( y == 0 ) ) + { + yaw = 0; + if ( z > 0 ) + { + pitch = 90; + } + else + { + pitch = 270; + } + } + else + { + yaw = atan2( y, x ) * 180 / M_PI; + if ( yaw < 0 ) + { + yaw += 360; + } + + forward = ( float )sqrt( x * x + y * y ); + pitch = atan2( z, forward ) * 180 / M_PI; + if ( pitch < 0 ) + { + pitch += 360; + } + } + + return Vector( -pitch, yaw, 0 ); + } + +inline void Vector::AngleVectors + ( + Vector *forward, + Vector *left, + Vector *up + ) + + { + float angle; + static float sr, sp, sy, cr, cp, cy; // static to help MS compiler fp bugs + + angle = yaw() * ( M_PI * 2 / 360 ); + sy = sin( angle ); + cy = cos( angle ); + + angle = pitch() * ( M_PI * 2 / 360 ); + sp = sin( angle ); + cp = cos( angle ); + + angle = roll() * ( M_PI * 2 / 360 ); + sr = sin( angle ); + cr = cos( angle ); + + if ( forward ) + { + forward->setXYZ( cp * cy, cp * sy, -sp ); + } + + if ( left ) + { + left->setXYZ( sr * sp * cy + cr * -sy, sr * sp * sy + cr * cy, sr * cp ); + } + + if ( up ) + { + up->setXYZ( cr * sp * cy + -sr * -sy, cr * sp * sy + -sr * cy, cr * cp ); + } + } + + +#define LERP_DELTA 1e-6 +inline Vector LerpVector + ( + Vector w1, + Vector w2, + float t + ) + { + float omega, cosom, sinom, scale0, scale1; + + w1.normalize(); + w2.normalize(); + + cosom = w1 * w2; + if ( ( 1.0 - cosom ) > LERP_DELTA ) + { + omega = acos( cosom ); + sinom = sin( omega ); + scale0 = sin( ( 1.0 - t ) * omega ) / sinom; + scale1 = sin( t * omega ) / sinom; + } + else + { + scale0 = 1.0 - t; + scale1 = t; + } + + return ( w1 * scale0 + w2 * scale1 ); + } + +class Quat + { + public: + float x; + float y; + float z; + float w; + + Quat(); + Quat( Vector angles ); + Quat( float scrMatrix[ 3 ][ 3 ] ); + Quat( float x, float y, float z, float w ); + + float *vec4( void ); + float operator[]( int index ) const; + float& operator[]( int index ); + void set( float x, float y, float z, float w ); + void operator=( Quat a ); + friend Quat operator+( Quat a, Quat b ); + Quat& operator+=( Quat a ); + friend Quat operator-( Quat a, Quat b ); + Quat& operator-=( Quat a ); + friend Quat operator*( Quat a, float b ); + friend Quat operator*( float a, Quat b ); + Quat& operator*=( float a ); + friend int operator==( Quat a, Quat b ); + friend int operator!=( Quat a, Quat b ); + float length( void ); + Quat& normalize( void ); + Quat operator-(); + Vector toAngles( void ); + }; + +inline float Quat::operator[] + ( + int index + ) const + + { + assert( ( index >= 0 ) && ( index < 4 ) ); + return ( &x )[ index ]; + } + +inline float& Quat::operator[] + ( + int index + ) + + { + assert( ( index >= 0 ) && ( index < 4 ) ); + return ( &x )[ index ]; + } + +inline float *Quat::vec4 + ( + void + ) + + { + return &x; + } + +inline void Quat::set + ( + float x, + float y, + float z, + float w + ) + + { + this->x = x; + this->y = y; + this->z = z; + this->w = w; + } + +inline Quat::Quat() + { + x = 0; + y = 0; + z = 0; + w = 0; + } + +inline Quat::Quat + ( + Vector Angles + ) + + { + EulerToQuat( Angles, this->vec4() ); + } + +inline Quat::Quat + ( + float srcMatrix[ 3 ][ 3 ] + ) + + { + MatToQuat( srcMatrix, this->vec4() ); + } + +inline Quat::Quat + ( + float x, + float y, + float z, + float w + ) + + { + this->x = x; + this->y = y; + this->z = z; + this->w = w; + } + +inline void Quat::operator= + ( + Quat a + ) + + { + x = a.x; + y = a.y; + z = a.z; + w = a.w; + } + +inline Quat operator+ + ( + Quat a, + Quat b + ) + + { + return Quat( a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w ); + } + +inline Quat& Quat::operator+= + ( + Quat a + ) + + { + x += a.x; + y += a.y; + z += a.z; + w += a.w; + + return *this; + } + +inline Quat operator- + ( + Quat a, + Quat b + ) + + { + return Quat( a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w ); + } + +inline Quat& Quat::operator-= + ( + Quat a + ) + + { + x -= a.x; + y -= a.y; + z -= a.z; + w -= a.w; + + return *this; + } + +inline Quat operator* + ( + Quat a, + float b + ) + + { + return Quat( a.x * b, a.y * b, a.z * b, a.w * b ); + } + +inline Quat operator* + ( + float a, + Quat b + ) + + { + return b * a; + } + +inline Quat& Quat::operator*= + ( + float a + ) + + { + x *= a; + y *= a; + z *= a; + w *= a; + + return *this; + } + +inline int operator== + ( + Quat a, + Quat b + ) + + { + return ( ( a.x == b.x ) && ( a.y == b.y ) && ( a.z == b.z ) && ( a.w == b.w ) ); + } + +inline int operator!= + ( + Quat a, + Quat b + ) + + { + return ( ( a.x != b.x ) || ( a.y != b.y ) || ( a.z != b.z ) && ( a.w != b.w ) ); + } + +inline float Quat::length + ( + void + ) + + { + float length; + + length = x * x + y * y + z * z + w * w; + return ( float )sqrt( length ); + } + +inline Quat& Quat::normalize + ( + void + ) + + { + float length, ilength; + + length = this->length(); + if ( length ) + { + ilength = 1 / length; + x *= ilength; + y *= ilength; + z *= ilength; + w *= ilength; + } + + return *this; + } + +inline Quat Quat::operator-() + { + return Quat( -x, -y, -z, -w ); + } + +inline Vector Quat::toAngles + ( + void + ) + + { + float m[ 3 ][ 3 ]; + vec3_t angles; + + QuatToMat( this->vec4(), m ); + MatrixToEulerAngles( m, angles ); + return Vector( angles ); + } + +extern Vector vec_zero; + +#undef VECTOR_FABS + +#endif /* Vector.h */ diff --git a/source/source/fgame/PlayerStart.cpp b/source/source/fgame/PlayerStart.cpp new file mode 100644 index 0000000..c786df9 --- /dev/null +++ b/source/source/fgame/PlayerStart.cpp @@ -0,0 +1,172 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/PlayerStart.cpp $ +// $Revision:: 11 $ +// $Author:: Markd $ +// $Date:: 7/03/00 8:53p $ +// +// Copyright (C) 1997 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/PlayerStart.cpp $ +// +// 11 7/03/00 8:53p Markd +// fixed player start bug +// +// 10 7/02/00 6:46p Markd +// added spawn thread to PlayerStart +// +// 9 6/14/00 3:50p Markd +// Cleaned up more Intel Compiler warnings +// +// 8 1/15/00 3:57p Markd +// Eliminated multiple "angle" events and replaced them with EV_SetAngle +// +// 7 12/17/99 6:35p Jimdose +// changed spawnarg code +// added Level class for spawning and map control +// got rid of unused or superflous variables +// changed setjmp/longjmp calls to try/throw/catch exception handling +// +// 6 11/04/99 10:03a Markd +// complete overhaul of the camera system +// +// 5 10/13/99 11:59a Phook +// +// 4 10/13/99 11:52a Phook +// adjusted the bounding box of player starts +// +// 3 9/28/99 9:51a Markd +// fixed default flags +// +// 2 9/27/99 5:45p Markd +// began documentation and cleanup phase after merge +// +// 1 9/10/99 10:54a Jimdose +// +// 1 9/08/99 3:16p Aldie +// +// 11 7/08/99 4:28p Markd +// Removed obsolete QUAKED functions +// +// 10 6/17/99 1:20p Phook +// Made the player starts 96 units tall +// +// 9 6/11/99 1:23p Phook +// +// 8 6/11/99 12:58p Phook +// Changed from SINED comments to QUAKED +// +// 7 6/11/99 12:46p Phook +// EClass color changes +// +// DESCRIPTION: +// Player start location entity declarations +// + +#include "g_local.h" +#include "entity.h" +#include "trigger.h" +#include "PlayerStart.h" + +/*****************************************************************************/ +/*QUAKED info_player_start (0.75 0.75 0) (-16 -16 0) (16 16 96) + +The normal starting point for a level. + +"angle" - the direction the player should face +"thread" - the thread that should be called when spawned at this position + +******************************************************************************/ + +Event EV_PlayerStart_SetThread + ( + "thread", + EV_DEFAULT, + "s", + "thread", + "Set the thread to execute when this player start is used" + ); + +CLASS_DECLARATION( Entity, PlayerStart, "info_player_start" ) + { + { &EV_SetAngle, SetAngle }, + { &EV_PlayerStart_SetThread, SetThread }, + { NULL, NULL } + }; + +void PlayerStart::SetAngle + ( + Event *ev + ) + + { + angles = Vector( 0, ev->GetFloat( 1 ), 0 ); + } + +void PlayerStart::SetThread + ( + Event *ev + ) + + { + thread = ev->GetString( 1 ); + } + +str PlayerStart::getThread + ( + void + ) + + { + return thread; + } + +/*****************************************************************************/ +/* saved out by quaked in region mode + +******************************************************************************/ + +CLASS_DECLARATION( PlayerStart, TestPlayerStart, "testplayerstart" ) + { + { NULL, NULL } + }; + +/*****************************************************************************/ +/*QUAKED info_player_deathmatch (0.75 0.75 1) (-16 -16 0) (16 16 96) + +potential spawning position for deathmatch games + +"angle" - the direction the player should face +"thread" - the thread that should be called when spawned at this position + +******************************************************************************/ + +CLASS_DECLARATION( PlayerStart, PlayerDeathmatchStart, "info_player_deathmatch" ) + { + { NULL, NULL } + }; + +/*****************************************************************************/ +/*QUAKED info_player_intermission (0.75 0.75 0) (-16 -16 0) (16 16 96) + +viewing point in between deathmatch levels + +******************************************************************************/ + +CLASS_DECLARATION( Camera, PlayerIntermission, "info_player_intermission" ) + { + { NULL, NULL } + }; + +PlayerIntermission::PlayerIntermission + ( + ) + + { + currentstate.watch.watchPath = false; + } + diff --git a/source/source/fgame/PlayerStart.h b/source/source/fgame/PlayerStart.h new file mode 100644 index 0000000..541a0a5 --- /dev/null +++ b/source/source/fgame/PlayerStart.h @@ -0,0 +1,83 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/PlayerStart.h $ +// $Revision:: 3 $ +// $Author:: Markd $ +// $Date:: 7/02/00 6:46p $ +// +// Copyright (C) 1997 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/PlayerStart.h $ +// +// 3 7/02/00 6:46p Markd +// added spawn thread to PlayerStart +// +// 2 12/17/99 6:35p Jimdose +// changed spawnarg code +// added Level class for spawning and map control +// got rid of unused or superflous variables +// changed setjmp/longjmp calls to try/throw/catch exception handling +// +// 1 9/10/99 10:54a Jimdose +// +// 1 9/08/99 3:16p Aldie +// +// 6 7/08/99 4:28p Markd +// Removed obsolete QUAKED functions +// +// DESCRIPTION: +// Player start location entity declarations +// + +#ifndef __PLAYERSTART_H__ +#define __PLAYERSTART_H__ + +#include "g_local.h" +#include "entity.h" +#include "camera.h" +#include "navigate.h" + +class PlayerStart : public Entity + { + private: + str thread; + public: + CLASS_PROTOTYPE( PlayerStart ); + + void SetAngle( Event *ev ); + void SetThread( Event *ev ); + str getThread( void ); + virtual void Archive(Archiver &arc); + }; + +inline void PlayerStart::Archive (Archiver &arc) + { + Entity::Archive( arc ); + + arc.ArchiveString(&thread); + } + +class TestPlayerStart : public PlayerStart + { + public: + CLASS_PROTOTYPE( TestPlayerStart ); + }; + +class PlayerDeathmatchStart : public PlayerStart + { + public: + CLASS_PROTOTYPE( PlayerDeathmatchStart ); + }; + +class PlayerIntermission : public Camera + { + public: + CLASS_PROTOTYPE( PlayerIntermission ); + PlayerIntermission(); + }; + +#endif /* PlayerStart.h */ diff --git a/source/source/fgame/actor.cpp b/source/source/fgame/actor.cpp new file mode 100644 index 0000000..2565137 --- /dev/null +++ b/source/source/fgame/actor.cpp @@ -0,0 +1,12449 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/actor.cpp $ +// $Revision:: 250 $ +// $Author:: Steven $ +// $Date:: 7/29/00 8:33p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/actor.cpp $ +// +// 250 7/29/00 8:33p Steven +// Fixed a wakeup problem when loading games. +// +// 249 7/29/00 7:11p Steven +// Made mission fail if you hurt an edenlander. +// +// 248 7/29/00 2:28p Steven +// Made it so LoadStateMap does not turn off think if we are +// loading a level. +// +// 247 7/28/00 9:18p Steven +// Made minimum mass to spawn a big water ampoule 125. +// +// 246 7/28/00 6:56p Steven +// Set boss health back to 0 if ai goes off. +// +// 245 7/28/00 1:22p Steven +// Made save attack longer and names spawned items. +// +// 244 7/27/00 11:46p Steven +// Fixed some depends/dependsnot dialog stuff. +// +// 243 7/27/00 10:53p Steven +// Added always give water stuff, don't make actor go to sleep +// initially if already has a behavior, and changed the teleport +// effect on spawned actors. +// +// 242 7/26/00 8:40p Steven +// Fixed a problem with actors getting stuck because of stepping +// up in the movement. +// +// 241 7/26/00 6:14p Steven +// made it so small actors will not spawn a big water ampoule +// +// 240 7/25/00 9:25p Steven +// Added damage allowed stuff, made set state run entry/exit +// commands, made it so when actors go into AI mode they turn +// sight/sound stuff back on, and fixed some spawning stuff. +// +// 239 7/24/00 6:08p Steven +// Added ignore pain from actors and fixed some direct pathfinding +// issues. +// +// 238 7/24/00 12:15p Steven +// Only update boss health when boss is in ai mode. +// +// 237 7/23/00 7:58p Steven +// Fixed some boss health stuff. +// +// 236 7/23/00 5:59p Steven +// Fixed some checkanimname stuff. +// +// 235 7/23/00 5:12p Steven +// Added check animname. +// +// 234 7/22/00 3:01p Steven +// Added boss health bar stuff. +// +// 233 7/22/00 1:18p Steven +// Added water level stuff. +// +// 232 7/20/00 6:22p Steven +// Tweaked actor spawn items stuff a little. +// +// 231 7/19/00 9:18p Steven +// Fixed checkmovingactorrange. +// +// 230 7/19/00 5:08p Steven +// Added electric water means of death and fixed max gibs when +// dying by gib death. +// +// 229 7/17/00 6:56p Steven +// Fixed a bug in Likes and added the spawning of a big fruit +// item. +// +// 228 7/17/00 4:42p Steven +// Fixed up some plasma stuff in SpawnItem and made it so we won't +// spawn any ammo for weapons the player doesn't have yet. +// +// 227 7/17/00 3:15p Steven +// added increment/decrement num spawns stuff +// +// 226 7/16/00 4:36p Steven +// Moved action level stuff to actor pain and killed. +// +// 225 7/16/00 2:35p Steven +// Moved Julie watching talking actor events to behavior. +// +// 224 7/15/00 3:11p Steven +// Added no pain sounds stuff. +// +// 223 7/15/00 12:47p Steven +// Fixed friend attacking other friends. +// +// 222 7/14/00 5:38p Steven +// Made spawned items not go through playerclips. +// +// 221 7/14/00 4:42p Steven +// Made playdialogs from script have no attenuation and added +// blind/deaf prints to actorinfo. +// +// 220 7/13/00 7:28p Steven +// Fixed some targetname stuff. +// +// 219 7/13/00 6:52p Steven +// Fixed some means of death stuff. +// +// 218 7/13/00 5:42p Steven +// Fixed spawned in items from killing actors. +// +// 217 7/13/00 3:42p Steven +// Added some simple path finding stuff and saved groundtrace +// results so we don't have to checkground. +// +// 216 7/13/00 12:29p Steven +// Added some ignore sound stuff, made actors not do pain sounds +// as much, and make sure gibs don't process their init commands. +// +// 215 7/12/00 3:36p Steven +// Made lots of optimizations to actors. +// +// 214 7/12/00 11:24a Steven +// Fixed some talk mode stuff. +// +// 213 7/11/00 11:08p Markd +// fixed crash bug where spawnitem wasn't being checked for NULL +// pointer +// +// 212 7/11/00 10:16p Markd +// spawned in ammo_plasma instead of ammo_bolt which is no more +// +// 211 7/11/00 7:07p Steven +// Made it so turntowardsenemy would work with killed enemies. +// +// 210 7/10/00 5:10p Steven +// Made it if get an anim command only go to script mode if +// command came from script and fixed stationary actors dying +// correctly. +// +// 209 7/07/00 6:34p Steven +// If actor is immmune to mod don't overwrite mod if already set +// this frame amd added more fail level stuff. +// +// 208 7/06/00 4:43p Steven +// Made sure when reposting an event to save the thread also and +// made sure to set the currentBehavior when restoring a mode. +// +// 207 7/06/00 12:59p Steven +// Made a way to stimuli an attack without it attacking the entity +// that caused it pain and made spawned actors fade out almost +// immediately. +// +// 206 7/06/00 9:23a Steven +// Added damage angles stuff. +// +// 205 7/06/00 7:47a Steven +// Added enemy on ground check. +// +// 204 7/05/00 5:17p Steven +// Added part of the code to make the player fail the level if she +// kills an innocent. +// +// 203 7/05/00 2:27p Steven +// Fixed reposting of events. +// +// 202 7/03/00 6:58p Steven +// Made actors wakeup instead op just turning on think, added some +// check shield stuff, and made spawned items have a mask of +// MASK_SOLID. +// +// 201 7/02/00 5:55p Steven +// Added SetIdleStateName. +// +// 200 7/02/00 5:08p Steven +// Added SpawnActorAtLocation, cleaned up the SpawnActor stuff and +// made it so all actors could gib if killed with mod of gib +// regardless if a bloodmodel is set. +// +// 199 7/02/00 1:10p Steven +// Added a RunThread event. +// +// 198 7/01/00 6:07p Steven +// Added falling damage for actors and added a bool parm for +// allowfall. +// +// 197 7/01/00 12:01p Steven +// Moved actor droptofloor back to 16 because it was causing some +// problems and added electricsword means of death. +// +// 196 6/30/00 5:05p Steven +// Added on fire check. +// +// 195 6/30/00 11:40a Steven +// Added a blocked check. +// +// 194 6/30/00 10:45a Markd +// added MOVETYPE_STATIONARY and revamped some physics +// +// 193 6/30/00 10:20a Steven +// Added some stuck/off ground stuff and allowed the suicide event +// to keep the old means of death. +// +// 192 6/30/00 7:51a Steven +// Added impact_sever sound call for cutting off a limb. +// +// 191 6/29/00 5:20p Steven +// Added min and max height for in range stuff. +// +// 190 6/28/00 3:11p Steven +// Added level wide ai_off and made actors being touched use +// STIMULI_SIGHT instead of STILUMI_PAIN. +// +// 189 6/27/00 5:44p Steven +// Made actors drop a little farther at start(32 now), made actors +// not broadcast sound in pain if dead or immune to the damage, +// changed notsolidmask from DEADSOLID TO SOLID, and made actors +// not do babble dialog for at least 5 seconds after a cinematic. +// +// 188 6/26/00 5:50p Markd +// re-did some renderfx commands, fixed anti-sb juice stuff +// +// 187 6/26/00 4:51p Steven +// Fixed some active/sleep list issues. +// +// 186 6/26/00 12:21p Steven +// Printing out better info on stuck warning. +// +// 185 6/24/00 7:00p Steven +// Fixed SaveAttack not tracing far enough, made InitState only +// get called if a valid state is set and fixed the loading parm +// in LoadStateMap. +// +// 184 6/24/00 11:21a Steven +// Added check to constructor that doesn't let event get posted if +// loading a savegame and fixed some loading savegame issues with +// dead actors. +// +// 183 6/22/00 5:32p Steven +// Added StopDialog stuff and fixed gibs from processing server +// commands. +// +// 182 6/21/00 4:21p Steven +// Improved checkcanflytoenemy. +// +// 181 6/20/00 7:00p Steven +// Changed saved_anim_event and last_anim_event to strings from +// event pointers. +// +// 180 6/20/00 12:16p Steven +// Added some SetMask stuff and made it so actors won't babble to +// players when they have weapons out. +// +// 179 6/19/00 6:19p Steven +// Added die completely stuff, added can bleed after death stuff, +// added actors getting pissed at the player touching them, and +// now make actors make noise when they take pain or die. +// +// 178 6/17/00 4:03p Steven +// Added GetStateAnims stuff. +// +// 177 6/17/00 11:09a Steven +// Made it so actors spawned from other actors have their +// targetname set to the parents targetname + _spawned. +// +// 176 6/15/00 6:55p Steven +// Added moving head while talking stuff. +// +// 175 6/14/00 2:50p Markd +// removed unused variable +// +// 174 6/13/00 3:46p Steven +// Added gibbing of actors when killed with a means of death of +// gib and fixed a problem with blind actors never thinking. +// +// 173 6/10/00 1:48p Steven +// Added statemap caching. +// +// 172 6/09/00 2:25p Steven +// Made melee weapons always do normal pain not small pain. +// +// 171 6/08/00 1:43p Steven +// Added minimum melee height and immortal events. +// +// 170 6/07/00 5:32p Steven +// Added ignore monster clip stuff. +// +// 169 6/06/00 2:35p Steven +// Improved Likes a little bit, made it so the client doesn't +// process animation commands on a dead actor, fixed IsBlind, +// added check no path, and improved ChangeType. +// +// 168 6/03/00 6:53p Steven +// Added actor blind stuff and added some farplane stuff to make +// sure actors wakeup and go back to sleep better. +// +// 167 6/03/00 3:46p Aldie +// Added in g_debugtargets for debugging targetnames and targets +// +// 166 6/01/00 3:18p Steven +// Added some changetype stuff, change some of the findenemy stuff +// a little, and added a check for in water. +// +// 165 5/31/00 3:55p Steven +// Another actor save game pass. +// +// 164 5/27/00 2:29p Steven +// Added attack actors stuff, added targetable stuff and added +// check player range. +// +// 163 5/26/00 6:19p Steven +// Added a gotoprevstage proc, added set attackable by actors, +// added a final height variable to MeleeEvent, added +// ShouldAttackEntity and made CanWalkTo use MASK_PATHSOLID +// instead of MASK_SOLID. +// +// 162 5/25/00 1:48p Steven +// Moved the rest of the max_gibs stuff to sentient. +// +// 161 5/23/00 6:42p Steven +// Moved small gib stuff to sentient. +// +// 160 5/23/00 10:18a Steven +// Made actors take a little time before doing babble dialog (half +// second or so) and added more items to actor random item spawns. +// +// 159 5/20/00 4:46p Steven +// Added sendcommand stuff, made pushing not assert gravity on +// flying actors, and added small pain to possible other part +// flags check. +// +// 158 5/19/00 3:42p Steven +// Added a noclip check. +// +// 157 5/19/00 11:24a Steven +// Moved little gibs to client side and some small clean up. +// +// 156 5/11/00 11:11a Steven +// Added pushing actors stuff, added chargewater attack, and did +// some cleanup. +// +// 155 5/10/00 10:31a Steven +// Fixed actors running in mid air, merged new TryMove stuff in, +// got rid of a trace in TryMove, added a can walk on others +// variable, added com_blood stuff, optimized CheckGround and +// FindEnemy stuff and made CanWalkTo take into account the final +// height compared to the specified position. +// +// 154 5/05/00 6:23p Steven +// Fixed a actorthread bug when the thread is not found and made +// it so fire will cause actors pain again. +// +// 153 5/05/00 2:13p Steven +// Made it so for now actors don't do pain when on fire. +// +// 152 5/04/00 2:07p Steven +// More finishing move stuff. +// +// 151 5/04/00 12:46p Steven +// Finishing move stuff. +// +// 150 5/03/00 11:49a Steven +// Made it so actors wouldn't do babble dialog if the player is +// moving. +// +// 149 5/02/00 3:13p Steven +// Fixed a bug in SpawnBloodyGibs and added player watching actors +// that talk to her. +// +// 148 5/01/00 2:45p Steven +// Added allow fall stuff, made it so we don't try to wake an +// already awake actor, made it so only a little bit of the pain +// stuff is processed for dead actors, and added volume and +// minimum distance to the playdialog stuff. +// +// 147 4/28/00 5:37p Steven +// Stop detaching things on death, always fade (don't worry about +// inventory), added an optional number of gibs parameter to +// SpawnBloodyGibs, and added saving of the last known position of +// the enemy. +// +// 146 4/25/00 10:10a Steven +// Made turntowardsenemy set the actor's roll to 0. +// +// 145 4/24/00 2:43p Steven +// Fixed the initial state not getting initialized correctly. +// +// 144 4/21/00 5:39p Steven +// Added some bounceoff stuff (mostly for fleshbinder's shield), +// added spawning of items on actor death stuff and optimized +// CanWalkTo a lot. +// +// 143 4/20/00 11:33a Steven +// Added stun stuff, made it so if monsters are notsolid in the +// first place they contents won't be set to corpse on death, made +// sure suicide set the actor's health to 0, and made sure the +// fade out flag is set properly. +// +// 142 4/15/00 11:49a Steven +// Added spawnbloodygibs, added setmaxgibs and cleaned up some +// blood stuff. +// +// 141 4/14/00 3:58p Steven +// Added a staysolid event. +// +// 140 4/14/00 11:15a Steven +// Made it so could do kickback and animation movement when dead. +// +// 139 4/14/00 10:35a Steven +// Fixed some minor pain threshold stuff, made it so KilledEffects +// doesn't overwrite the actor's name and made blood splat size +// scale with the actor size. +// +// 138 4/13/00 5:33p Steven +// Added a deathsink event, made it so only actors with deathsink +// turned on sink into ground after death and added a nomask event +// for the ghosts. +// +// 137 4/12/00 6:59p Steven +// Added an addhealth event and made the actors pain event always +// process even if the damage done is 0. +// +// 136 4/12/00 2:39p Steven +// Made it so named gibs don't spawn if the actor is fadig out. +// +// 135 4/11/00 6:56p Steven +// Got gibs to sink into ground correctly. +// +// 134 4/11/00 6:36p Steven +// Added deathshrink stuff. +// +// 133 4/11/00 5:42p Steven +// Sinking into ground and fading out work. +// +// 132 4/11/00 4:00p Steven +// Added attack_min_height to MeleeAttack. +// +// 131 4/11/00 3:07p Steven +// Cleaned up a bunch of spawn stuff and merged SpawnGib and +// SpawnGibAtTag. +// +// 130 4/11/00 10:31a Steven +// Cleaned up some gib stuff. +// +// 129 4/10/00 6:52p Steven +// Redid death state to be able to have more levels and to process +// entry and exit commands, made sure the ACTOR_FLAG_SPAWN_FAILED +// flag is always set properly, made it so gibs don't process +// animation commands on the client and made it so gibs use their +// angles not their bind masters. +// +// 128 4/10/00 10:51a Steven +// Fixed the throwing of shglieks by actors. +// +// 127 4/08/00 3:51p Steven +// Added a SpawnGibAtTag (temporarily, will be merged with +// SpawnGib soon), added attackmode stuff again, don't spawn gibs +// if fading out, added gibing/hurting of dead monsters, lots of +// general gib work, fixed actors not being able to get off of +// other actors and made ai_off kick the actor out of ai mode and +// NULL out the currentEnemy. +// +// 126 4/06/00 3:34p Steven +// Fixed a typo. +// +// 125 4/06/00 2:57p Steven +// Added death size event. +// +// 124 4/05/00 6:17p Steven +// Added in real support for gravity based projectiles. +// +// 123 4/04/00 6:54p Steven +// Added ResetHead event, started some projectile attack changes, +// added NoLerpThisFrame to the WarpTo event and added some tweaks +// to gibs. +// +// 122 4/03/00 1:56p Steven +// Added a way to set & unset the fly flag and made lighter +// creatures gibs go further. +// +// 121 4/01/00 4:33p Steven +// Added chackname. +// +// 120 4/01/00 2:39p Steven +// Added checkcanflytoenemy. +// +// 119 4/01/00 1:19p Steven +// Fixed up some gib stuff. +// +// 118 4/01/00 11:10a Steven +// Added checkenemydead and initialized use_gravity flag. +// +// 117 3/31/00 4:57p Steven +// Tweaked GetNearestEnemy a little and fixed actors not falling +// to the ground when killed. +// +// 116 3/31/00 1:01p Steven +// Added GetRandomEnemy (for recruiter). +// +// 115 3/30/00 2:02p Steven +// Added SpawnBlood, added usegravity, added save attack to +// FireBullet, some gib work, and fixed some movement issues. +// +// 114 3/28/00 6:48p Steven +// Added optional tag_name to TestAttack. +// +// 113 3/28/00 1:16p Steven +// Added range to bullet attack, fixed some noise heard stuff, and +// imprved checkhasthing so that you could check mulitple things +// at once. +// +// 112 3/24/00 6:31p Steven +// Fixed another TryMove issue, fixed actors going to sleep that +// have the max_inactive_time set to 0, changes the size parameter +// in SpawnActor to width & height, and started adding a better +// CheckBottom. +// +// 111 3/22/00 10:35a Steven +// Added SpawnNamedGib and GotoStage, fixed an event leak, and +// fixed some actor movement issues. +// +// 110 3/20/00 6:07p Steven +// Moved max_mouth_angle stuff to sentient, made it so actor knows +// when behavior's animations are done, and added setmouthangle. +// +// 109 3/18/00 4:15p Steven +// Added an allowhangback event, added a check for allowhangback, +// and fixed a TryMove issue. +// +// 108 3/18/00 3:12p Steven +// Fixed some anim_done issues, added a flag to keep track if the +// actor has been started yet or not, and made sure the +// attackplayer command was only received after the actor is +// started. +// +// 107 3/18/00 1:16p Steven +// Added FireBullet to actor and added pain_angles stuff. +// +// 106 3/17/00 2:37p Steven +// Made it so dead actors don't care about falling off edges. +// +// 105 3/17/00 11:49a Steven +// Added jumping stuff. +// +// 104 3/14/00 12:06p Steven +// Added walkwatch stuff. +// +// 103 3/13/00 4:42p Steven +// Added in the rest of the has_thing check. +// +// 102 3/13/00 2:31p Steven +// Added a can_shoot_enemy check, fixed the starting position in +// CanShootFrom, added a warning to SetState if the state doesn't +// exist, and added a check to PlayDialog to make sure the actor +// has a currentState if setting a new one. +// +// 101 3/11/00 4:11p Steven +// Added have thing stuff, added direction to pain, and made sure +// actors don't think before they are fully spawned. +// +// 100 3/11/00 2:17p Steven +// Added stun stuff (so the AI knows when the player is incapable +// of doing anything :) +// +// 99 3/11/00 12:04p Steven +// Added a check in SpawnActor to make sure the new actor isn't +// spawned inside of anything. +// +// 98 3/11/00 11:33a Steven +// Moved all actor booleans to 1 actor flags variable. +// +// 97 3/09/00 11:41a Steven +// Fixed a problem in checkcanseeenemy when having no +// currentEnemy. +// +// 96 3/08/00 6:41p Steven +// Fixed up checkcanseeenemy and made sure all bones of an actor +// are reset back to their normal position when the actor dies. +// +// 95 3/07/00 4:56p Steven +// Added bounce off stuff. +// +// 94 3/07/00 11:49a Steven +// Added checkenemyinfov. +// +// 93 3/04/00 11:49a Steven +// Added a stuck flag and added a check for it. +// +// 92 3/03/00 5:24p Steven +// Added fast_bullet stuff and made it so actors that are +// activated will automatically attack the player. +// +// 91 3/02/00 6:40p Steven +// Made which blood model to use a parameter to gib. +// +// 90 3/02/00 11:01a Steven +// Cleaned up some gib stuff, fixed a velocity problem with +// actors, and added checkenemyrelativeyaw. +// +// 89 2/29/00 12:21p Steven +// Fixed a problem with starting actorthreads (and going to AI +// mode in the middle of it) and took out actor droptofloor stuff +// temporarily. +// +// 88 2/28/00 11:18a Steven +// Fixed up some drop to ground stuff. +// +// 87 2/26/00 3:46p Steven +// Added some more stuff to stuck actor. +// +// 86 2/26/00 3:32p Steven +// Print a message if actors start stuck in the ground and make it +// very obvious something is wrong :) +// +// 85 2/26/00 2:56p Steven +// Fixed up some jump issues with actors. +// +// 84 2/26/00 11:22a Steven +// Added partial immobile flag. +// +// 83 2/25/00 7:02p Steven +// Added a way for actors to notify others of their kind when they +// are killed. +// +// 82 2/24/00 5:55p Steven +// Fixed a typo in the event documentation. +// +// 81 2/24/00 5:34p Steven +// Fixed up some event documentation. +// +// 80 2/24/00 5:10p Steven +// Fixed up some of the removing anim done events, added a speed +// parm to headwatch and added offset to spawnactor. +// +// 79 2/24/00 1:59p Steven +// Now make sure to get rid of all anim done events when ending a +// behavior and make sure actors won't go to talk mode while in a +// cinematic. +// +// 78 2/23/00 5:50p Steven +// Made it so the endthread command also ends the current behavior +// if in script mode. +// +// 77 2/23/00 5:09p Steven +// Fixed some bugs. +// +// 76 2/23/00 11:43a Steven +// Moved utility behaviors into actor and added entry and exit +// commands. +// +// 75 2/21/00 6:26p Steven +// Added an endthread event and made using the fov an option in +// the can see enemy check. +// +// 74 2/18/00 6:54p Steven +// Added warpto command, did lots move improvements of movement +// and path finding, cleaned up some ai to idle mode stuff, and +// fixed idle thread stuff. +// +// 73 2/17/00 6:26p Aldie +// Fixed naming conventions for weapon hand and also added various +// attachtotag functionality for weapons that attach to different +// tags depending on which hand they are wielded in. +// +// 72 2/17/00 5:42p Steven +// Lots of movement and path finding improvements. +// +// 71 2/16/00 6:44p Steven +// Fixed a bug in CanShootFrom (was negating the pitch still). +// +// 70 2/16/00 10:41a Steven +// Added small pain stuff, made sure actors would not go to AI +// mode if they don't have a statemap, and made sure actors don't +// go to sleep when they shouldn't. +// +// 69 2/14/00 3:32p Steven +// Added checks so an actor can tell what weapons the player is +// using and fixed a crash bug if an actor has no statemap but a +// state is set. +// +// 68 2/11/00 6:40p Steven +// Added pickup/throw stuff, added damage once stuff, added small +// pain stuff, and fixed some bugs. +// +// 67 2/09/00 10:34a Steven +// Added events to allow an actor's clipmask to be changed. +// +// 66 2/08/00 4:53p Steven +// Made it so actors would only try to go to talk mode if they +// have babble dialog. +// +// 65 2/08/00 11:59a Steven +// Added stuff to let actor know he had blocked a hit. +// +// 64 2/08/00 11:38a Steven +// Some general cleanup, added a state name to idle event, added a +// state name to playdialog event, and added a checkheld check. +// +// 63 2/04/00 3:11p Aldie +// Changed sword attack method for water usage +// +// 62 2/04/00 1:56p Steven +// Added a lot on the different modes (AI, script, idle and talk). +// +// 61 2/02/00 1:33p Steven +// Added headwatching stuff, tweaked meleeevent a little more, +// fixed up some init problems, made non-moving actors die +// properly, and fixed checkmovingactorrange stuff. +// +// 60 1/28/00 12:04p Steven +// Added another debug message for dialog stuff. +// +// 59 1/28/00 11:18a Steven +// Added a debug message if a dailog is played and no lip file is +// found. +// +// 58 1/27/00 2:50p Steven +// Improved all actor's vision distance, fixed various bugs and +// added checkincomingmeleeattackstart and +// checkincomingprojectilestart. +// +// 57 1/26/00 9:53a Markd +// Changed FOV command to an fov command +// +// 56 1/25/00 6:32p Steven +// Added knockback to melee event. +// +// 55 1/25/00 11:09a Steven +// Renamed health_less check to health. +// +// 54 1/24/00 6:55p Steven +// Made sure actors will fall if spawned off the ground and added +// support to limit the number of actors an actor can spawn. +// +// 53 1/22/00 5:07p Steven +// Added knockback to meleeattack. +// +// 52 1/22/00 1:43p Markd +// Fixed attached entity bug +// +// 51 1/22/00 12:42p Jimdose +// got rid of calls to vec3() +// +// 50 1/21/00 8:07p Aldie +// Fixed a link error - bad! +// +// 49 1/21/00 6:44p Steven +// Cleaned up idle_thread stuff, added tempstate ability, and +// added open door support for actors. +// +// 48 1/20/00 6:57p Markd +// removed get_lip functions and merged them with SoundLength and +// SoundAmplitudes +// +// 47 1/20/00 6:54p Aldie +// Removed bloodsplats until we do them the right way +// +// 46 1/20/00 12:19p Steven +// Fixed a problem in the checkmeansofdeath conditional. +// +// 45 1/19/00 8:56p Steven +// Improved location of spawned actors from the spawnactor +// command. +// +// 44 1/19/00 7:46p Aldie +// Fixed func_spawns of various types and removed some unused misc +// classes +// +// 43 1/19/00 6:33p Steven +// Added kill_thread stuff. +// +// 42 1/19/00 12:08p Steven +// Added to dialog stuff so that a specific sound could be played, +// fixed anim_done never being set on the first animation and +// fixed death a little. +// +// 41 1/17/00 10:20p Jimdose +// Rewrote state system initialization. Made conditionals defined +// with array. +// Made Evaluate functions early exit +// +// 40 1/14/00 5:06p Markd +// Removed surface num, tri_num and damage_multiplier from +// multiple functions and events +// +// 39 1/14/00 5:01p Steven +// Added stage stuff. +// +// 38 1/13/00 7:07p Steven +// Lots and lots of cleanup and fixed lip syncing. +// +// 37 1/07/00 6:33p Steven +// Stopped using dummy.tik for gibs. +// +// 36 1/06/00 6:49p Steven +// Removed need for dummy.tik and added a can jump to enemy ai +// check. +// +// 35 1/05/00 7:25p Jimdose +// made angle functions all use the same coordinate system +// AngleVectors now returns left instead of right +// no longer need to invert pitch +// +// 34 1/05/00 6:43p Steven +// More work on spawngib and fixed some traces. +// +// 33 1/05/00 3:07p Jimdose +// got rid of inverted pitch in MyGunAngles +// +// 32 1/05/00 1:53p Steven +// Added a lot to the spawn gib stuff, fixed the turning speed +// issue, and fixed a death state problem. +// +// 31 12/22/99 5:11p Steven +// Added incoming melee and incoming projectiles checks, fixed +// CanWalkTo a little and readded turn speed stuff. +// +// 30 12/20/99 6:50p Steven +// Moved jumpxy to sentient and clened up some stuff. +// +// 29 12/17/99 8:26p Jimdose +// got rid of unused vars and functions +// +// 28 12/17/99 5:40p Steven +// Added actor jump event. +// +// 27 12/07/99 6:09p Aldie +// Added weapon charging +// +// 26 12/01/99 4:56p Markd +// fixed some reference versus pointer issues with RandomAnimate +// and NewAnim +// +// 25 12/01/99 3:12p Steven +// Added an onground check and made it so dead flying actors +// always fall to the ground. +// +// 24 11/19/99 4:54p Steven +// Added some deathfade stuff back in. +// +// 23 11/19/99 4:29p Steven +// Minor fixes. +// +// 22 11/19/99 11:30a Steven +// Fixed AnimSame, added commands so actors could tell each other +// to do things, and added a health less than check for ai. +// +// 21 11/12/99 6:22p Steven +// Made state flags available to other part entities and added a +// attack_vector to melee attacks. +// +// 20 11/10/99 6:10p Steven +// Added means of death to melee attack, stopped prethinking on +// dead actors, and fixed a bug dealing with actors going back to +// sleep. +// +// 19 11/05/99 5:24p Steven +// Added attack_width to melee attacks. +// +// 18 10/28/99 6:34p Steven +// Fixed a bug where the actor would go to sleep when doing +// scripting. +// +// 17 10/27/99 10:26a Steven +// Added only shootable contents stuff. +// +// 16 10/21/99 5:26p Markd +// removed head_modelindex +// +// 15 10/21/99 5:24p Steven +// General AI work. +// +// 14 10/19/99 7:52p Markd +// Removed three part model system +// +// 13 10/19/99 7:10p Steven +// Lots of AI work. +// +// 12 10/11/99 7:50p Steven +// Major cleanup, made it so scripting and ai could co-exist, and +// fixed some actor bugs. +// +// 11 10/07/99 5:34p Steven +// Some stimuli work and some event documentation. +// +// 10 10/01/99 4:51p Markd +// Made Warning level 4 work on all projects +// +// 9 10/01/99 1:39p Steven +// Event formatting. +// +// 8 9/27/99 5:44p Markd +// began documentation and cleanup phase after merge +// +// 6 9/22/99 4:47p Markd +// fixed more G_GetEntity, G_FindClass and G_GetNextEntity bugs +// +// 5 9/21/99 7:51p Markd +// Fixed a lot of entitynum_none issues +// +// 4 9/20/99 5:23p Steven +// Added a canwalkto method and fixed a collision issue (ownerNum +// not being initialized). +// +// 3 9/16/99 4:47p Jimdose +// removed unused melee code +// +// 2 9/16/99 11:18a Markd +// Continuing merge of code, not functional yet but closer +// +// 1 9/10/99 10:53a Jimdose +// +// 1 9/08/99 3:15p Aldie +// +// 61 9/02/99 3:24p Steven +// Added an ECTS hack for creatures liking each other. +// +// 60 9/01/99 8:15p Steven +// Took out some old gas plant stuff. +// +// 59 9/01/99 3:49p Jimdose +// made checkmovingactorrange use findclientsinradius and only +// check active actors instead of findradius to try to reduce the +// cpu hit. +// +// 58 8/31/99 9:20p Steven +// Made actors melee attack range larger. +// +// 57 8/31/99 2:42p Steven +// Fixed some actor threading issues and added death state +// machine. +// +// 56 8/28/99 6:35p Steven +// More speed up. +// +// 55 8/28/99 6:35p Steven +// Made some checks only check 4 times a second and got rid of +// some more actor thread stuff. +// +// 54 8/28/99 11:42a Steven +// Cleanup and some spinning plant stuff. +// +// 53 8/27/99 5:03p Steven +// More general AI work. +// +// 52 8/24/99 11:24a Steven +// More general AI work. +// +// 51 8/18/99 3:28p Jimdose +// added cylindrical collision detection +// +// 50 8/17/99 5:08p Markd +// Changed all FS_ReadFile's to FS_ReadFileEx's in game code +// +// 49 8/17/99 4:58p Steven +// Some animation work for the AI. +// +// 48 8/16/99 10:29a Steven +// More general work on AI. +// +// 47 8/11/99 8:33p Steven +// Added ability to have a fov of 360 (for plants). +// +// 46 8/11/99 8:00p Steven +// Fixed a bug when checking if anims should be changed from the +// state machine. +// +// 45 8/11/99 7:23p Steven +// Added a behavior done check for the AI. +// +// 44 8/11/99 5:56p Steven +// More general AI work. +// +// 43 8/06/99 6:53p Jimdose +// changed format of state machine callback functions +// +// 42 8/06/99 6:38p Aldie +// Started removing concept of currentWeapon +// +// 41 8/05/99 9:13a Steven +// New AI stuff. +// +// 40 7/08/99 4:28p Markd +// Removed obsolete QUAKED functions +// +// 39 7/06/99 8:33p Jimdose +// removed unused player code +// added state machine for player animation +// +// DESCRIPTION: +// Base class for character AI. +// + +#include "g_local.h" +#include "actor.h" +#include "behavior.h" +#include "scriptmaster.h" +#include "doors.h" +#include "gibs.h" +#include "misc.h" +#include "specialfx.h" +#include "object.h" +#include "scriptslave.h" +#include "explosion.h" +#include "misc.h" +#include "playerstart.h" +#include "characterstate.h" +#include "weaputils.h" +#include "shield.h" +#include "player.h" + +//#define DEBUG_PRINT + +Container SleepList; +Container ActiveList; + +#define TURN_SPEED 20 + +Event EV_Actor_Sleep + ( + "sleep", + EV_DEFAULT, + NULL, + NULL, + "Put the actor to sleep." + ); +Event EV_Actor_Wakeup + ( + "wakeup", + EV_DEFAULT, + NULL, + NULL, + "Wake up the actor." + ); +Event EV_Actor_Fov + ( + "fov", + EV_CONSOLE, + "f", + "fov", + "Sets the actor's field of view (fov)." + ); +Event EV_Actor_VisionDistance + ( + "visiondistance", + EV_DEFAULT, + "f", + "vision_distance", + "Sets the distance the actor can see." + ); +Event EV_Actor_Start + ( + "start", + EV_DEFAULT, + NULL, + NULL, + "Initializes the actor a little, " + "it is not meant to be called from script." + ); +Event EV_Actor_Dead + ( + "dead", + EV_DEFAULT, + NULL, + NULL, + "Does everything necessary when an actor dies, " + "it is not meant to be called from script." + ); +Event EV_Actor_Friend + ( + "friend", + EV_DEFAULT, + NULL, + NULL, + "Makes the actor allied to the player." + ); +Event EV_Actor_Civilian + ( + "civilian", + EV_DEFAULT, + NULL, + NULL, + "Makes the actor nuetral to all, runs from danger." + ); +Event EV_Actor_Enemy + ( + "enemy", + EV_DEFAULT, + NULL, + NULL, + "Makes the actor an enemy to the player." + ); +Event EV_Actor_Monster + ( + "monster", + EV_DEFAULT, + NULL, + NULL, + "Makes the actor an enemy to player, civilians, and inanimate objects." + ); +Event EV_Actor_Animal + ( + "animal", + EV_DEFAULT, + NULL, + NULL, + "Makes the actor neutral to all." + ); +Event EV_Actor_Inanimate + ( + "inanimate", + EV_DEFAULT, + NULL, + NULL, + "Makes the actor an inanimate object." + ); +Event EV_Actor_SetEnemyType + ( + "enemytype", + EV_DEFAULT, + "s", + "enemytype", + "Sets the name of this actor's enemy type." + ); +Event EV_Actor_Swim + ( + "swim", + EV_DEFAULT, + NULL, + NULL, + "Specifies actor as being able to swim." + ); +Event EV_Actor_Fly + ( + "fly", + EV_DEFAULT, + "B", + "fly_bool", + "Specifies actor as being able to fly (optional bool can turn fly on or off)." + ); +Event EV_Actor_NotLand + ( + "noland", + EV_DEFAULT, + NULL, + NULL, + "Specifies actor as not being able to walk on land." + ); +Event EV_Actor_Thread + ( + "thread", + EV_DEFAULT, + "s", + "label", + "Sets which thread to use for this actor." + ); +Event EV_Actor_RunThread + ( + "runthread", + EV_DEFAULT, + "s", + "label", + "Runs the specified thread." + ); +Event EV_Actor_EndThread + ( + "endthread", + EV_DEFAULT, + NULL, + NULL, + "Ends the actors thread." + ); +Event EV_Actor_Statemap + ( + "statemap", + EV_DEFAULT, + "sS", + "statemap_name state_name", + "Sets which statemap file to use and optionally what the first state to go to." + ); +Event EV_Actor_IfEnemyVisible + ( + "ifenemyvisible", + EV_DEFAULT, + "SSSSSS", + "token1 token2 token3 token4 token5 token6", + "Process the following command if enemy is visible" + ); +Event EV_Actor_IfNear + ( + "ifnear", + EV_DEFAULT, + "sfSSSSSS", + "name distance token1 token2 token3 token4 token5 token6", + "Process the following command if enemy is within specified distance" + ); +Event EV_Actor_ForwardSpeed + ( + "forwardspeed", + EV_DEFAULT, + "f", + "forwardspeed", + "Sets the actor's forward speed." + ); +Event EV_Actor_Idle + ( + "idle", + EV_DEFAULT, + "S", + "state_name", + "Tells the actor to go into idle mode." + ); +Event EV_Actor_LookAt + ( + "lookat", + EV_DEFAULT, + "e", + "ent", + "Specifies an entity to look at." + ); +Event EV_Actor_TurnTo + ( + "turnto", + EV_DEFAULT, + "f", + "direction", + "Specifies the direction to look in." + ); +Event EV_Actor_HeadWatch + ( + "headwatch", + EV_DEFAULT, + "eF", + "entity_to_watch max_speed", + "Actor watches the specified entity by turning his head." + ); +Event EV_Actor_ResetHead + ( + "resethead", + EV_DEFAULT, + "F", + "max_speed", + "Actor resets its head back to looking forwards." + ); +Event EV_Actor_FinishedBehavior + ( + "finishedbehavior", + EV_DEFAULT, + NULL, + NULL, + "Ends the current behavior, " + "it is not meant to be called from script." + ); +Event EV_Actor_NotifyBehavior + ( + "notifybehavior", + EV_DEFAULT, + NULL, + NULL, + "Notifies the current behavior of an event," + "it is not meant to be called from script." + ); +Event EV_Actor_WalkTo + ( + "walkto", + EV_DEFAULT, + "sS", + "pathnode anim_name", + "Actor walks to specified path node" + ); +Event EV_Actor_WalkWatch + ( + "walkwatch", + EV_DEFAULT, + "seS", + "pathnode entity anim_name", + "Actor walks to specified path node and watches the specified entity" + ); +Event EV_Actor_WarpTo + ( + "warpto", + EV_DEFAULT, + "s", + "node_name", + "Warps the actor to the specified node" + ); +Event EV_Actor_JumpTo + ( + "jumpto", + EV_DEFAULT, + "SSSSSS", + "token1 token2 token3 token4 token5 token6", + "Actor jumps to specified path node" + ); +Event EV_Actor_RunTo + ( + "runto", + EV_DEFAULT, + "SSSSSS", + "token1 token2 token3 token4 token5 token6", + "Actor runs to specified path node" + ); +Event EV_Actor_PickupEnt + ( + "pickupent", + EV_DEFAULT, + "es", + "entity_to_pickup pickup_anim_name", + "Makes actor pick up the specified entity" + ); +Event EV_Actor_ThrowEnt + ( + "throwent", + EV_DEFAULT, + "s", + "throw_anim_name", + "Makes actor throw the entity in hands" + ); +Event EV_Actor_Anim + ( + "anim", + EV_DEFAULT, + "s", + "anim_name", + "Starts the PlayAnim behavior." + ); +Event EV_Actor_Attack + ( + "attack", + EV_DEFAULT, + "e", + "ent", + "Makes the actor attack the specified entity." + ); +Event EV_Actor_AttackPlayer + ( + "attackplayer", + EV_DEFAULT, + NULL, + NULL, + "Makes enemies of all the players." + ); +Event EV_Actor_ReserveNode + ( + "reservenode", + EV_DEFAULT, + "vf", + "pos time", + "Reserves a path node for the specified amount of time." + ); +Event EV_Actor_ReleaseNode + ( + "releasenode", + EV_DEFAULT, + "v", + "pos", + "Releases a path node from being reserved." + ); +Event EV_Actor_IfCanHideAt + ( + "ifcanhideat", + EV_DEFAULT, + "vSSSSSS", + "pos token1 token2 token3 token4 token5 token6", + "Processes command if actor can hide at specified position." + ); +Event EV_Actor_IfEnemyWithin + ( + "ifenemywithin", + EV_DEFAULT, + "fSSSSSS", + "distance token1 token2 token3 token4 token5 token6", + "Processes command if actor is within distance of its current enemy." + ); +Event EV_Actor_Remove + ( + "remove_useless", + EV_DEFAULT, + NULL, + NULL, + "Removes a useless dead body from the game." + ); +Event EV_Actor_Melee + ( + "melee", + EV_DEFAULT, + "FSSVFIF", + "damage tag_name means_of_death attack_vector knockback use_pitch_to_enemy attack_min_height", + "Makes the actor do a melee attack.\n" + " attack_vector = \"width length height\"" + ); +Event EV_Actor_PainThreshold + ( + "painthreshold", + EV_DEFAULT, + "f", + "pain_threshold", + "Sets the actor's pain threshold." + ); +Event EV_Actor_SetKillThread + ( + "killthread", + EV_DEFAULT, + "s", + "kill_thread", + "Sets the actor's kill thread." + ); +Event EV_Actor_EyePositionOffset + ( + "eyeoffset", + EV_DEFAULT, + "v", + "eyeoffset", + "Sets the actor's eye position." + ); +Event EV_Actor_DeathFade + ( + "deathfade", + EV_DEFAULT, + NULL, + NULL, + "Makes the actor fade when dead." + ); +Event EV_Actor_DeathShrink + ( + "deathshrink", + EV_DEFAULT, + NULL, + NULL, + "Makes the actor shrink when dead." + ); +Event EV_Actor_DeathSink + ( + "deathsink", + EV_DEFAULT, + NULL, + NULL, + "Makes the actor sink into the ground when dead." + ); +Event EV_Actor_StaySolid + ( + "staysolid", + EV_DEFAULT, + NULL, + NULL, + "Makes the actor stay solid after death." + ); +Event EV_Actor_NoChatter + ( + "nochatter", + EV_DEFAULT, + NULL, + NULL, + "Makes the actor not chatter." + ); +Event EV_Actor_TurnSpeed + ( + "turnspeed", + EV_DEFAULT, + "f", + "turnspeed", + "Sets the actor's turnspeed." + ); +Event EV_Actor_WatchOffset + ( + "watchoffset", + EV_DEFAULT, + "v", + "offset", + "Sets the actor's watch offset." + ); +Event EV_Anim_Done + ( + "anim_done", + EV_DEFAULT, + NULL, + NULL, + "Called when the actor's animation is done, " + "it is not meant to be called from script." + ); +Event EV_Actor_ProjAttack + ( + "proj", + EV_DEFAULT, + "ssIBF", + "tag_name projectile_name number_of_tags arc_bool speed", + "Fires a projectile from the actor towards the current enemy." + ); +Event EV_Actor_BulletAttack + ( + "bullet", + EV_DEFAULT, + "sB", + "tag_name use_current_pitch", + "Fires a bullet from the actor from the specified tag towards the current enemy." + ); +Event EV_Actor_Active + ( + "active", + EV_DEFAULT, + "i", + "active_flag", + "Specifies whether the actor's is active or not." + ); +Event EV_Actor_SpawnGib + ( + "spawngib", + EV_DEFAULT, + "vffssSSSSSSSS", + "offset final_pitch width cap_name surface_name1 surface_name2 surface_name3 surface_name4 surface_name5 surface_name6 surface_name7 surface_name8 surface_name9" , + "Spawns a body part." + ); +Event EV_Actor_SpawnGibAtTag + ( + "spawngibattag", + EV_DEFAULT, + "sffssSSSSSSSS", + "tag_name final_pitch width cap_name surface_name1 surface_name2 surface_name3 surface_name4 surface_name5 surface_name6 surface_name7 surface_name8 surface_name9" , + "Spawns a body part." + ); +Event EV_Actor_SpawnNamedGib + ( + "spawnnamedgib", + EV_DEFAULT, + "ssff", + "gib_name tag_name final_pitch width", + "Spawns a body named gib." + ); +Event EV_Actor_SpawnBlood + ( + "spawnblood", + EV_DEFAULT, + "ssB", + "blood_name tag_name use_last_spawn_result" , + "Spawns blood at the specified tag." + ); +Event EV_Actor_AIOn + ( + "ai_on", + EV_DEFAULT, + NULL, + NULL, + "Turns the AI on for this actor." + ); +Event EV_Actor_AIOff + ( + "ai_off", + EV_DEFAULT, + NULL, + NULL, + "Turns the AI off for this actor." + ); +Event EV_Actor_AIDeaf + ( + "ai_deaf", + EV_DEFAULT, + NULL, + NULL, + "Makes the actor ignore sounds." + ); +Event EV_Actor_AIDumb + ( + "ai_dumb", + EV_DEFAULT, + NULL, + NULL, + "Makes the actor ignore sounds and sight." + ); +Event EV_Actor_Deaf + ( + "deaf", + EV_DEFAULT, + NULL, + NULL, + "Makes the actor permanently deaf (will always ignore sounds)." + ); +Event EV_Actor_Blind + ( + "blind", + EV_DEFAULT, + NULL, + NULL, + "Makes the actor permanently blind (will never try to see)." + ); +Event EV_Actor_SetIdleThread + ( + "setidlethread", + EV_DEFAULT, + "s", + "thread", + "Sets the thread that will be run if this actor gets back to the idle state again." + ); +Event EV_Actor_SetMaxInactiveTime + ( + "max_inactive_time", + EV_DEFAULT, + "f", + "max_inactive_time", + "Sets the maximum amount of time an actor will stay idle before going to sleep.\n" + "Also sepecifies the maximum amount of time an actor will keep looking for an\n" + "enemy that the actor can no longer see." + ); +Event EV_ActorRegisterParts + ( + "register_parts", + EV_DEFAULT, + "ei", + "entity forward", + "Registers the passed in part as another part of this actor and specifies\n" + "whether or not to forward this message to the other parts." + ); +Event EV_ActorRegisterSelf + ( + "register_self", + EV_DEFAULT, + NULL, + NULL, + "Starts registration process for multi-entity actors" + ); +Event EV_ActorName + ( + "name", + EV_DEFAULT, + "s", + "name", + "Specifies the name of this actor type." + ); +Event EV_ActorPartName + ( + "part_name", + EV_DEFAULT, + "s", + "part_name", + "Specifies the name of this part (implying that this is a multi-part creature." + ); +Event EV_ActorSetupTriggerField + ( + "trigger_field", + EV_DEFAULT, + "vv", + "min max", + "Specifies to create a trigger field around the actor of the specified size." + ); +Event EV_ActorTriggerTouched + ( + "trigger_touched", + EV_DEFAULT, + "e", + "ent", + "Notifies the actor that its trigger field has been touched." + ); +Event EV_ActorOnlyShootable + ( + "only_shootable", + EV_DEFAULT, + NULL, + NULL, + "Makes the actor solid only to projectiles." + ); +Event EV_ActorIncomingProjectile + ( + "incoming_proj", + EV_DEFAULT, + "e", + "ent", + "Notifies the actor of an incoming projectile." + ); +Event EV_ActorSpawnActor + ( + "spawnactor", + EV_DEFAULT, + "ssibffF", + "model_name tag_name how_many attack width height spawn_offset", + "Spawns the specified number of actors." + ); +Event EV_ActorSpawnActorAtLocation + ( + "spawnactoratlocation", + EV_DEFAULT, + "ssibff", + "model_name pathnode_name how_many_path_nodes attack width height", + "Spawns the specified actor at the specified pathnode." + ); +Event EV_Actor_AddDialog + ( + "dialog", + EV_DEFAULT, + "sSSSSSS", + "alias token1 token2 token3 token4 token5 token6", + "Add a dialog to this sentient." + ); +Event EV_Actor_DialogDone + ( + "dialogdone", + EV_DEFAULT, + NULL, + NULL, + "Called when the sentient's dialog is done, " + "it is not meant to be called from script." + ); +Event EV_Actor_PlayDialog + ( + "playdialog", + EV_DEFAULT, + "SSE", + "sound_file state_name user", + "Plays a dialog." + ); +Event EV_Actor_StopDialog + ( + "stopdialog", + EV_DEFAULT, + NULL, + NULL, + "Stops the actor's dialog." + ); +Event EV_Actor_AllowTalk + ( + "allowtalk", + EV_DEFAULT, + "i", + "allow_bool", + "Sets whether or not the actor will bother to talk to the player." + ); +Event EV_Actor_AllowHangBack + ( + "allowhangback", + EV_DEFAULT, + "i", + "allow_bool", + "Sets whether or not the actor will bother to hang back." + ); +Event EV_Actor_SolidMask + ( + "solidmask", + EV_DEFAULT, + NULL, + NULL, + "Makes the actor use a solid mask." + ); +Event EV_Actor_NotSolidMask + ( + "notsolidmask", + EV_DEFAULT, + NULL, + NULL, + "Makes the actor use a nonsolid mask." + ); +Event EV_Actor_NoMask + ( + "nomask", + EV_DEFAULT, + NULL, + NULL, + "Makes the actor use a mask of 0." + ); +Event EV_Actor_SetMask + ( + "setmask", + EV_DEFAULT, + "s", + "mask_name", + "Sets the actor's mask to the specified mask." + ); +Event EV_Actor_Pickup + ( + "actor_pickup", + EV_DEFAULT, + "s", + "tag_name", + "Makes the actor pickup current pickup_ent (should only be called from a tiki)." + ); +Event EV_Actor_Throw + ( + "actor_throw", + EV_DEFAULT, + "s", + "tag_name", + "Makes the actor throw whatever is in its hand (should only be called from a tiki)." + ); +Event EV_Actor_DamageOnceStart + ( + "damage_once_start", + EV_DEFAULT, + NULL, + NULL, + "Makes the actor only do melee damage at most once during this attack." + ); +Event EV_Actor_DamageOnceStop + ( + "damage_once_stop", + EV_DEFAULT, + NULL, + NULL, + "Specifies that the actor is done with the damage once event." + ); +Event EV_Actor_GetNearestEnemy + ( + "getnearestenemy", + EV_DEFAULT, + NULL, + NULL, + "Sets currentEnemy to the nearest enemy." + ); +Event EV_Actor_GetRandomEnemy + ( + "getrandomenemy", + EV_DEFAULT, + "f", + "range", + "Sets currentEnemy to a random enemy in range." + ); +Event EV_Actor_DamageEnemy + ( + "damageenemy", + EV_DEFAULT, + "f", + "damage", + "Damages the current enemy by the specified amount." + ); +Event EV_Actor_TurnTowardsEnemy + ( + "turntowardsenemy", + EV_DEFAULT, + NULL, + NULL, + "Turns the actor towards the current enemy." + ); +Event EV_Actor_Suicide + ( + "suicide", + EV_DEFAULT, + NULL, + NULL, + "Makes the actor commit suicide." + ); +Event EV_Actor_GotoNextStage + ( + "gotonextstage", + EV_DEFAULT, + NULL, + NULL, + "Makes the actor goto his next stage." + ); +Event EV_Actor_GotoPrevStage + ( + "gotoprevstage", + EV_DEFAULT, + NULL, + NULL, + "Makes the actor goto his previous stage." + ); +Event EV_Actor_GotoStage + ( + "gotostage", + EV_DEFAULT, + "i", + "stage_number", + "Makes the actor goto the specified stage." + ); +Event EV_Actor_NotifyOthersAtDeath + ( + "notifyothersatdeath", + EV_DEFAULT, + NULL, + NULL, + "Makes the actor notify other actors of the same type when killed." + ); +Event EV_Actor_SetBounceOff + ( + "bounceoff", + EV_DEFAULT, + NULL, + NULL, + "Makes projectiles bounce off of actor (if they can't damage actor)." + ); +Event EV_Actor_SetHaveThing + ( + "havething", + EV_DEFAULT, + "ib", + "thing_number have_bool", + "Sets whether or not the actor has this thing number." + ); +Event EV_Actor_SetUseGravity + ( + "usegravity", + EV_DEFAULT, + "b", + "use_gravity", + "Tells the actor whether or not to use gravity for this animation." + ); +Event EV_Actor_SetDeathSize + ( + "deathsize", + EV_DEFAULT, + "vv", + "min max", + "Sets the actors new size for death." + ); +Event EV_Actor_Fade + ( + "actorfade", + EV_DEFAULT, + NULL, + NULL, + "Makes the actor fade out." + ); +Event EV_Actor_AttackMode + ( + "attackmode", + EV_DEFAULT, + "b", + "attack_bool", + "Makes the actor go directly into attacking the player if bool is true." + ); +Event EV_Actor_AddHealth + ( + "addhealth", + EV_DEFAULT, + "ff", + "health_to_add maxhealth", + "Adds health to the actor." + ); +Event EV_Actor_BounceOff + ( + "bounceoffevent", + EV_DEFAULT, + "v", + "object_origin", + "Lets the actor know something just bounces off of it." + ); +Event EV_Actor_SetBounceOffEffect + ( + "bounceoffeffect", + EV_DEFAULT, + "s", + "bounce_off_effect_name", + "Sets the name of the effect to play when something bounces off the actor." + ); +Event EV_Actor_AddSpawnItem + ( + "spawnitem", + EV_DEFAULT, + "s", + "spawn_item_name", + "Adds this names item to what will be spawned when this actor is killed." + ); +Event EV_Actor_SetSpawnChance + ( + "spawnchance", + EV_DEFAULT, + "f", + "spawn_chance", + "Sets the chance that this actor will spawn something when killed." + ); +Event EV_Actor_ClearSpawnItems + ( + "clearspawnitems", + EV_DEFAULT, + NULL, + NULL, + "Clears the list of items to spawn when this actor is killed." + ); +Event EV_Actor_SetAllowFall + ( + "allowfall", + EV_DEFAULT, + "B", + "allow_fall_bool", + "Makes the actor ignore falls when trying to move." + ); +Event EV_Actor_SetCanBeFinishedBy + ( + "canbefinishedby", + EV_DEFAULT, + "sSSSSS", + "mod1 mod2 mod3 mod4 mod5 mod6", + "Adds to the can be finished by list for this actor." + ); +Event EV_Actor_SetFeetWidth + ( + "feetwidth", + EV_DEFAULT, + "f", + "feet_width", + "Sets the width of the feet for this actor if different than the bounding box size." + ); +Event EV_Actor_SetCanWalkOnOthers + ( + "canwalkonothers", + EV_DEFAULT, + NULL, + NULL, + "Allows the actor to walk on top of others." + ); +Event EV_Actor_Push + ( + "push", + EV_DEFAULT, + "v", + "dir", + "Pushes the actor in the specified direction." + ); +Event EV_Actor_Pushable + ( + "pushable", + EV_DEFAULT, + NULL, + NULL, + "Sets whether or not an actor can be pushed out of the way." + ); +Event EV_Actor_ChargeWater + ( + "chargewater", + EV_DEFAULT, + "ff", + "damage range", + "Does a charge water attack." + ); +Event EV_Actor_SendCommand + ( + "sendcommand", + EV_DEFAULT, + "ss", + "command part_name", + "Sends a command to another one of its parts." + ); +Event EV_Actor_SetAttackableByActors + ( + "attackablebyactors", + EV_DEFAULT, + "b", + "attackable_by_actors", + "Sets whether or not this actor is allowed to be attacked by other actors." + ); +Event EV_Actor_SetAttackActors + ( + "attackactors", + EV_DEFAULT, + NULL, + NULL, + "Sets this actor to attack other actors." + ); +Event EV_Actor_SetTargetable + ( + "targetable", + EV_DEFAULT, + "b", + "should_target", + "Sets whether or not this actor should be targetable by the player." + ); +Event EV_Actor_ChangeType + ( + "changetype", + EV_DEFAULT, + "s", + "new_model_name", + "Changes the actor to the specified new type of actor." + ); +Event EV_Actor_IgnoreMonsterClip + ( + "ignoremonsterclip", + EV_DEFAULT, + NULL, + NULL, + "Makes the actor ignore monster clip brushes." + ); +Event EV_Actor_MinimumMeleeHeight + ( + "minmeleeheight", + EV_DEFAULT, + "f", + "minimum_height", + "Sets the minimum height a melee attack has to be to hurt the actor." + ); +Event EV_Actor_SetDamageAngles + ( + "damageangles", + EV_DEFAULT, + "f", + "damage_angles", + "Sets the the angles where the actor can be hurt (like fov)." + ); +Event EV_Actor_Immortal + ( + "immortal", + EV_DEFAULT, + "b", + "immortal_bool", + "Sets whether or not the actor is immortal or not." + ); +Event EV_Actor_HeadTwitch + ( + "headtwitch", + EV_DEFAULT, + "B", + "end", + "Makes the actors head twitch a little(used while talking)." + ); +Event EV_Actor_HeadTwitchEveryFrame + ( + "headtwitcheveryframe", + EV_DEFAULT, + NULL, + NULL, + "Makes the actors head twitch a little(used while talking)." + ); +Event EV_Actor_SetDieCompletely + ( + "diecompletely", + EV_DEFAULT, + "b", + "die_bool", + "Sets whether or not the actor dies completely (if he doesn't he mostly just" + " runs his kill_thread)." + ); +Event EV_Actor_SetBleedAfterDeath + ( + "bleed_after_death", + EV_DEFAULT, + "b", + "bleed_bool", + "Sets whether or not the actor will bleed after dying." + ); +Event EV_Actor_IgnorePlacementWarning + ( + "ignore_placement_warning", + EV_DEFAULT, + "s", + "warning_string", + "Makes the specified placement warning not get printed for this actor." + ); +Event EV_Actor_SetIdleStateName + ( + "set_idle_state_name", + EV_DEFAULT, + "s", + "new_idle_state_name", + "Sets the actor's new idle state name." + ); +Event EV_Actor_SetNotAllowedToKill + ( + "not_allowed_to_kill", + EV_DEFAULT, + NULL, + NULL, + "Player fails the level if he kills an actor with this set." + ); +Event EV_Actor_TouchTriggers + ( + "touchtriggers", + EV_DEFAULT, + "b", + "touch_triggers_bool", + "Sets whether or not this actor can touch triggers or not." + ); +Event EV_Actor_IgnoreWater + ( + "ignorewater", + EV_DEFAULT, + "b", + "ignore_water_bool", + "Sets whether or not this actor will ignore water when moving." + ); +Event EV_Actor_NeverIgnoreSounds + ( + "neverignoresounds", + EV_DEFAULT, + NULL, + NULL, + "Makes the actor always listen to sounds even if it already has an enemy." + ); +Event EV_Actor_SimplePathfinding + ( + "simplepathfinding", + EV_DEFAULT, + NULL, + NULL, + "Makes the actor use simplier path finding." + ); +Event EV_Actor_NoPainSounds + ( + "nopainsounds", + EV_DEFAULT, + NULL, + NULL, + "Makes the actor not broadcast sounds (AI stimuli) when taking pain or killed." + ); +Event EV_Actor_IncrementNumSpawns + ( + "incrementnumspawns", + EV_DEFAULT, + NULL, + NULL, + "Increments the number of spawns this actor has." + ); +Event EV_Actor_DecrementNumSpawns + ( + "decrementnumspawns", + EV_DEFAULT, + NULL, + NULL, + "Decrements the number of spawns this actor has." + ); +Event EV_Actor_SetWaterLevel + ( + "waterlevel", + EV_DEFAULT, + "f", + "waterlevel", + "Sets the actor's water level." + ); +Event EV_Actor_UpdateBossHealth + ( + "updatebosshealth", + EV_DEFAULT, + "f", + "waterlevel", + "Tells the actor to update the bosshealth cvar each time it thinks." + ); +Event EV_Actor_SetMaxBossHealth + ( + "maxbosshealth", + EV_DEFAULT, + "f", + "max_boss_health", + "Sets the actor's max boss health." + ); +Event EV_Actor_IgnorePainFromActors + ( + "ignorepainfromactors", + EV_DEFAULT, + NULL, + NULL, + "Makes this actor ignore pain from other actors." + ); +Event EV_Actor_DamageAllowed + ( + "damageallowed", + EV_DEFAULT, + "b", + "damage_allowed", + "Turns melee damage on and off." + ); +Event EV_Actor_AlwaysGiveWater + ( + "alwaysgivewater", + EV_DEFAULT, + "b", + "give_water", + "Turns the always give water bool on off (gives water from soul sucker weapon)." + ); + + +CLASS_DECLARATION( Sentient, Actor, "monster_generic" ) + { + { &EV_Activate, ActivateEvent }, + { &EV_Use, UseEvent }, + + { &EV_Actor_Sleep, Sleep }, + { &EV_Actor_Wakeup, Wakeup }, + + { &EV_Actor_Start, Start }, + { &EV_Pain, Pain }, + { &EV_Killed, Killed }, + { &EV_Actor_Dead, Dead }, + { &EV_Actor_Suicide, Suicide }, + + { &EV_Actor_ForwardSpeed, ForwardSpeedEvent }, + + { &EV_Actor_Fov, SetFov }, + { &EV_Actor_VisionDistance, SetVisionDistance }, + + { &EV_Actor_Friend, FriendEvent }, + { &EV_Actor_Civilian, CivilianEvent }, + { &EV_Actor_Enemy, EnemyEvent }, + { &EV_Actor_Monster, MonsterEvent }, + { &EV_Actor_Animal, AnimalEvent }, + { &EV_Actor_Inanimate, InanimateEvent }, + { &EV_Actor_SetEnemyType, SetEnemyType }, + + { &EV_Actor_Swim, SwimEvent }, + { &EV_Actor_Fly, FlyEvent }, + { &EV_Actor_NotLand, NotLandEvent }, + + { &EV_Actor_Thread, SetThread }, + { &EV_Actor_RunThread, RunThread }, + { &EV_Actor_EndThread, EndThread }, + + { &EV_Actor_Statemap, LoadStateMap }, + + { &EV_Actor_IfEnemyVisible, IfEnemyVisibleEvent }, + { &EV_Actor_IfNear, IfNearEvent }, + { &EV_Actor_Idle, IdleEvent }, + { &EV_Actor_LookAt, LookAt }, + { &EV_Actor_TurnTo, TurnToEvent }, + { &EV_Actor_HeadWatch, HeadWatchEvent }, + { &EV_Actor_ResetHead, ResetHeadEvent }, + { &EV_Actor_FinishedBehavior, FinishedBehavior }, + { &EV_Actor_NotifyBehavior, NotifyBehavior }, + { &EV_Actor_WalkTo, WalkTo }, + { &EV_Actor_WalkWatch, WalkWatch }, + { &EV_Actor_JumpTo, JumpToEvent }, + { &EV_Actor_RunTo, RunTo }, + { &EV_Actor_WarpTo, WarpTo }, + { &EV_Actor_Anim, Anim }, + { &EV_Actor_Attack, AttackEntity }, + { &EV_Actor_AttackPlayer, AttackPlayer }, + { &EV_Actor_Remove, RemoveUselessBody }, + + { &EV_Actor_ReserveNode, ReserveNodeEvent }, + { &EV_Actor_ReleaseNode, ReleaseNodeEvent }, + { &EV_Actor_IfCanHideAt, IfCanHideAtEvent }, + { &EV_Actor_IfEnemyWithin, IfEnemyWithinEvent }, + + { &EV_HeardSound, HeardSound }, + + { &EV_Actor_Melee, MeleeEvent }, + + { &EV_Actor_PainThreshold, SetPainThresholdEvent }, + { &EV_Actor_SetKillThread, SetKillThreadEvent }, + { &EV_SetHealth, SetHealth }, + { &EV_Actor_AddHealth, AddHealth }, + { &EV_Actor_EyePositionOffset, EyeOffset }, + { &EV_Actor_DeathFade, DeathFadeEvent }, + { &EV_Actor_DeathShrink, DeathShrinkEvent }, + { &EV_Actor_DeathSink, DeathSinkEvent }, + { &EV_Actor_StaySolid, StaySolidEvent }, + { &EV_Actor_NoChatter, NoChatterEvent }, + { &EV_Actor_TurnSpeed, SetTurnSpeed }, + { &EV_Actor_WatchOffset, SetWatchOffset }, + + { &EV_ScriptThread_Goto, GotoEvent }, + + { &EV_Actor_SetMaxInactiveTime, SetMaxInactiveTime }, + + { &EV_Anim_Done, AnimDone }, + + { &EV_Actor_ProjAttack, FireProjectile }, + { &EV_Actor_BulletAttack, FireBullet }, + + { &EV_Actor_Active, Active }, + + { &EV_Actor_SpawnGib, SpawnGib }, + { &EV_Actor_SpawnGibAtTag, SpawnGibAtTag }, + { &EV_Actor_SpawnNamedGib, SpawnNamedGib }, + { &EV_Actor_SpawnBlood, SpawnBlood }, + + { &EV_Actor_AIOn, TurnAIOn }, + { &EV_Actor_AIOff, TurnAIOff }, + + { &EV_Actor_AIDeaf, Deaf }, + { &EV_Actor_Deaf, PermanentDeaf }, + { &EV_Actor_Blind, PermanentBlind }, + { &EV_Actor_AIDumb, Dumb }, + + { &EV_Actor_SetIdleThread, SetIdleThread }, + + { &EV_ActorRegisterParts, RegisterParts }, + { &EV_ActorRegisterSelf, RegisterSelf }, + { &EV_ActorName, Name }, + { &EV_ActorPartName, PartName }, + { &EV_Actor_SendCommand, SendCommand }, + + { &EV_ActorSetupTriggerField, SetupTriggerField }, + { &EV_ActorTriggerTouched, TriggerTouched }, + { &EV_ActorOnlyShootable, OnlyShootable }, + + { &EV_ActorIncomingProjectile, IncomingProjectile }, + + { &EV_ActorSpawnActor, SpawnActorAtTag }, + { &EV_ActorSpawnActorAtLocation, SpawnActorAtLocation }, + + { &EV_Actor_AddDialog, AddDialog }, + { &EV_Actor_DialogDone, DialogDone }, + { &EV_Actor_PlayDialog, PlayDialog }, + { &EV_Actor_StopDialog, StopDialog }, + { &EV_Sentient_SetMouthAngle, SetMouthAngle }, + + { &EV_Actor_AllowTalk, AllowTalk }, + { &EV_Actor_AllowHangBack, AllowHangBack }, + + { &EV_Actor_SolidMask, SolidMask }, + { &EV_Actor_IgnoreMonsterClip, IgnoreMonsterClip }, + { &EV_Actor_NotSolidMask, NotSolidMask }, + { &EV_Actor_NoMask, NoMask }, + { &EV_Actor_SetMask, SetMask }, + + { &EV_Actor_PickupEnt, PickupEnt }, + { &EV_Actor_ThrowEnt, ThrowEnt }, + + { &EV_Actor_Pickup, Pickup }, + { &EV_Actor_Throw, Throw }, + + { &EV_Actor_DamageOnceStart, DamageOnceStart }, + { &EV_Actor_DamageOnceStop, DamageOnceStop }, + + { &EV_Actor_GetNearestEnemy, GetNearestEnemy }, + { &EV_Actor_GetRandomEnemy, GetRandomEnemy }, + { &EV_Actor_DamageEnemy, DamageEnemy }, + { &EV_Actor_TurnTowardsEnemy, TurnTowardsEnemy }, + + { &EV_Actor_GotoNextStage, GotoNextStage }, + { &EV_Actor_GotoPrevStage, GotoPrevStage }, + { &EV_Actor_GotoStage, GotoStage }, + + { &EV_Actor_NotifyOthersAtDeath, NotifyOthersAtDeath }, + + { &EV_Actor_SetBounceOff, SetBounceOff }, + { &EV_Actor_BounceOff, BounceOffEvent }, + { &EV_Actor_SetBounceOffEffect, SetBounceOffEffect }, + + { &EV_Actor_SetHaveThing, SetHaveThing }, + + { &EV_Actor_SetUseGravity, SetUseGravity }, + { &EV_Actor_SetAllowFall, SetAllowFall }, + + { &EV_Actor_SetDeathSize, SetDeathSize }, + + { &EV_Actor_Fade, FadeEvent }, + + { &EV_Actor_AttackMode, AttackModeEvent }, + + { &EV_Stun, StunEvent }, + + { &EV_Actor_AddSpawnItem, AddSpawnItem }, + { &EV_Actor_SetSpawnChance, SetSpawnChance }, + { &EV_Actor_ClearSpawnItems, ClearSpawnItems }, + + { &EV_Actor_SetCanBeFinishedBy, SetCanBeFinishedBy }, + + { &EV_Actor_SetFeetWidth, SetFeetWidth }, + { &EV_Actor_SetCanWalkOnOthers, SetCanWalkOnOthers }, + + { &EV_Actor_Push, Push }, + { &EV_Actor_Pushable, Pushable }, + + { &EV_Actor_ChargeWater, ChargeWater }, + { &EV_Actor_SetAttackableByActors, SetAttackableByActors }, + { &EV_Actor_SetAttackActors, SetAttackActors }, + + { &EV_Actor_SetTargetable, SetTargetable }, + + { &EV_Actor_ChangeType, ChangeType }, + + { &EV_Actor_MinimumMeleeHeight, MinimumMeleeHeight }, + { &EV_Actor_SetDamageAngles, SetDamageAngles }, + + { &EV_Actor_Immortal, SetImmortal }, + + { &EV_Actor_HeadTwitch, HeadTwitch }, + { &EV_Actor_HeadTwitchEveryFrame, HeadTwitchEveryFrame }, + + { &EV_Actor_SetDieCompletely, SetDieCompletely }, + { &EV_Actor_SetBleedAfterDeath, SetBleedAfterDeath }, + + { &EV_Actor_IgnorePlacementWarning, IgnorePlacementWarning }, + + { &EV_Actor_SetIdleStateName, SetIdleStateName }, + + { &EV_Actor_SetNotAllowedToKill, SetNotAllowedToKill }, + + { &EV_Actor_TouchTriggers, TouchTriggers }, + { &EV_Actor_IgnoreWater, IgnoreWater }, + { &EV_Actor_NeverIgnoreSounds, NeverIgnoreSounds }, + + { &EV_Actor_SimplePathfinding, SimplePathfinding }, + + { &EV_Actor_NoPainSounds, NoPainSounds }, + + { &EV_Actor_IncrementNumSpawns, IncrementNumSpawns }, + { &EV_Actor_DecrementNumSpawns, DecrementNumSpawns }, + + { &EV_Actor_SetWaterLevel, SetWaterLevel }, + + { &EV_Actor_UpdateBossHealth, UpdateBossHealth }, + { &EV_Actor_SetMaxBossHealth, SetMaxBossHealth }, + + { &EV_Actor_IgnorePainFromActors, IgnorePainFromActors }, + + { &EV_Actor_DamageAllowed, DamageAllowed }, + + { &EV_Actor_AlwaysGiveWater, AlwaysGiveWater }, + + { &EV_Touch, Touched }, + + { NULL, NULL } + }; + +//*********************************************************************************************** +// +// Initialization functions +// +//*********************************************************************************************** + +Actor::Actor() + { + Event *immunity_event; + + + // don't spawn monsters in deathmatch + if ( deathmatch->integer || nomonsters->integer ) + { + PostEvent( EV_Remove, EV_REMOVE ); + return; + } + + // + // make sure this is a modelanim entity + // + edict->s.eType = ET_MODELANIM; + + actortype = IS_ENEMY; + + setSolidType( SOLID_BBOX ); + setMoveType( MOVETYPE_STEP ); + + actorrange_time = 0; + + actor_flags1 = 0; + actor_flags2 = 0; + + canseeenemy_time = 0; + SetActorFlag( ACTOR_FLAG_LAST_CANSEEENEMY, false ); + SetActorFlag( ACTOR_FLAG_LAST_CANSEEENEMY_NOFOV, false ); + + health = 100; + max_health = health; + takedamage = DAMAGE_AIM; + mass = 200; + deadflag = DEAD_NO; + + edict->clipmask = MASK_MONSTERSOLID; + edict->svflags |= SVF_MONSTER; + edict->ownerNum = ENTITYNUM_NONE; + + forwardspeed = 0; //FIXME + + statemap = NULL; + SetActorFlag( ACTOR_FLAG_INACTIVE, false ); + SetActorFlag( ACTOR_FLAG_ANIM_DONE, false ); + currentState = NULL; + state_time = level.time; + times_done = 0; + SetActorFlag( ACTOR_FLAG_STATE_DONE_TIME_VALID, false ); + SetActorFlag( ACTOR_FLAG_AI_ON, true ); + stimuli = STIMULI_ALL; + permanent_stimuli = STIMULI_ALL; + last_enemy_sight_time = 0; + next_enemy_try_sight_time = 0; + next_try_sleep_time = 0; + last_time_active = 0; + next_player_near = 0; + + bullet_hits = 0; + + saved_anim_event_name = ""; + + mode = ACTOR_MODE_IDLE; + + state_flags = 0; + + max_inactive_time = MAX_INACTIVE_TIME; + + num_of_spawns = 0; + + SetActorFlag( ACTOR_FLAG_NOISE_HEARD, false ); + + noise_time = 0; + SetActorFlag( ACTOR_FLAG_INVESTIGATING, false ); + + dialog_list = NULL; + SetActorFlag( ACTOR_FLAG_DIALOG_PLAYING, false ); + dialog_done_time = 0; + + stage = 1; + + SetActorFlag( ACTOR_FLAG_NOTIFY_OTHERS_AT_DEATH, false ); + SetActorFlag( ACTOR_FLAG_ALLOW_TALK, true ); + SetActorFlag( ACTOR_FLAG_ALLOW_HANGBACK, true ); + SetActorFlag( ACTOR_FLAG_DAMAGE_ONCE_ON, false ); + SetActorFlag( ACTOR_FLAG_BOUNCE_OFF, false ); + + SetActorFlag( ACTOR_FLAG_HAS_THING1, false ); + SetActorFlag( ACTOR_FLAG_HAS_THING2, false ); + SetActorFlag( ACTOR_FLAG_HAS_THING3, false ); + SetActorFlag( ACTOR_FLAG_HAS_THING4, false ); + + SetActorFlag( ACTOR_FLAG_LAST_ATTACK_HIT, true ); + + SetActorFlag( ACTOR_FLAG_SPAWN_FAILED, false ); + + SetActorFlag( ACTOR_FLAG_FADING_OUT, false ); + + SetActorFlag( ACTOR_FLAG_USE_GRAVITY, true ); + SetActorFlag( ACTOR_FLAG_ALLOW_FALL, false ); + + SetActorFlag( ACTOR_FLAG_STUNNED, false ); + + SetActorFlag( ACTOR_FLAG_PUSHABLE, false ); + + lastmove = STEPMOVE_OK; + + gunoffset = "0 0 44"; + + behavior = NULL; + path = NULL; + + newanimnum = -1; + newanim = ""; + newanimevent = NULL; + last_anim_event_name = ""; + + vision_distance = 1536; + + fov = 150; + fovdot = cos( fov * 0.5 * M_PI / 180.0 ); + + eyeoffset = "0 0 0"; + eyeposition = "0 0 64"; + + SetActorFlag( ACTOR_FLAG_DEATHFADE, false ); + SetActorFlag( ACTOR_FLAG_DEATHSHRINK, false ); + SetActorFlag( ACTOR_FLAG_DEATHSINK, false ); + SetActorFlag( ACTOR_FLAG_NOCHATTER, false ); + + SetActorFlag( ACTOR_FLAG_STAYSOLID, false ); + + SetActorFlag( ACTOR_FLAG_FINISHED, false ); + SetActorFlag( ACTOR_FLAG_IN_LIMBO, false ); + + SetActorFlag( ACTOR_FLAG_CAN_WALK_ON_OTHERS, false ); + + SetActorFlag( ACTOR_FLAG_LAST_TRY_TALK, false ); + + SetActorFlag( ACTOR_FLAG_ATTACKABLE_BY_ACTORS, true ); + SetActorFlag( ACTOR_FLAG_ATTACK_ACTORS, false ); + + SetActorFlag( ACTOR_FLAG_TARGETABLE, true ); + + SetActorFlag( ACTOR_FLAG_IMMORTAL, false ); + + SetActorFlag( ACTOR_FLAG_ALLOWED_TO_KILL, true ); + + turnspeed = TURN_SPEED; + + if ( com_blood->integer ) + { + flags |= FL_BLOOD; + flags |= FL_DIE_GIBS; + } + + // don't talk all at once initially + + chattime = G_Random( 20 ); + nextsoundtime = 0; + + //trig = NULL; + SetActorFlag( ACTOR_FLAG_DEATHGIB, false ); + + // default pain_threshold + pain_threshold = 20; + + startpos = origin; + + next_drown_time = 0; + air_finished = level.time + 5; + last_jump_time = 0; + + groundentity = NULL; + velocity = "0 0 -20"; + + CheckWater(); + + setSize( "-16 -16 0", "16 16 116" ); + showModel(); + + SetActorFlag( ACTOR_FLAG_STARTED, false ); + + spawn_chance = 0; + + feet_width = 0; + + next_find_enemy_time = 0; + + saved_mode = ACTOR_MODE_NONE; + + minimum_melee_height = -100; + damage_angles = 0; + + real_head_pitch = 0; + SetActorFlag( ACTOR_FLAG_TURNING_HEAD, false ); + + SetActorFlag( ACTOR_FLAG_DIE_COMPLETELY, true ); + + SetActorFlag( ACTOR_FLAG_BLEED_AFTER_DEATH, true ); + + next_pain_sound_time = 0; + + SetActorFlag( ACTOR_FLAG_IGNORE_STUCK_WARNING, false ); + SetActorFlag( ACTOR_FLAG_IGNORE_OFF_GROUND_WARNING, false ); + + SetActorFlag( ACTOR_FLAG_TOUCH_TRIGGERS, true ); + + SetActorFlag( ACTOR_FLAG_IGNORE_WATER, false ); + + SetActorFlag( ACTOR_FLAG_NEVER_IGNORE_SOUNDS, false ); + + SetActorFlag( ACTOR_FLAG_SIMPLE_PATHFINDING, false ); + + SetActorFlag( ACTOR_FLAG_NO_PAIN_SOUNDS, false ); + + // All actors start immune to falling damage + + immunity_event = new Event( EV_Sentient_AddImmunity ); + immunity_event->AddString( "falling" ); + ProcessEvent( immunity_event ); + + water_level = 0; + + SetActorFlag( ACTOR_FLAG_UPDATE_BOSS_HEALTH, false ); + max_boss_health = 0; + + SetActorFlag( ACTOR_FLAG_IGNORE_PAIN_FROM_ACTORS, false ); + + SetActorFlag( ACTOR_FLAG_DAMAGE_ALLOWED, true ); + + SetActorFlag( ACTOR_FLAG_ALWAYS_GIVE_WATER, false ); + + if ( !LoadingSavegame ) + PostEvent( EV_Actor_Start, EV_POSTSPAWN ); + } + +Actor::~Actor() + { + if ( actorthread ) + { + actorthread->ProcessEvent( EV_ScriptThread_End ); + actorthread = NULL; + } + + if ( SleepList.ObjectInList( ( Actor * )this ) ) + { + SleepList.RemoveObject( ( Actor * )this ); + } + + if ( ActiveList.ObjectInList( ( Actor * )this ) ) + { + ActiveList.RemoveObject( ( Actor * )this ); + } + + if ( behavior ) + { + delete behavior; + behavior = NULL; + } + + if ( path ) + { + delete path; + path = NULL; + } + + /* if ( trig ) + { + delete trig; + trig = NULL; + } */ + + FreeDialogList(); + } + +void Actor::Sleep + ( + void + ) + + { + // inanimate actors don't target enemies + if ( actortype == IS_INANIMATE ) + { + return; + } + + if ( !SleepList.ObjectInList( ( Actor * )this ) ) + SleepList.AddObject( ( Actor * )this ); + + if ( ActiveList.ObjectInList( ( Actor * )this ) ) + ActiveList.RemoveObject( ( Actor * )this ); + + currentEnemy = NULL; + flags &= ~FL_THINK; + last_enemy_sight_time = 0; + } + +void Actor::Sleep + ( + Event *ev + ) + + { + Sleep(); + } + +void Actor::Wakeup + ( + void + ) + + { + // See if already awake + + if ( flags & FL_THINK && !LoadingSavegame ) + return; + + // inanimate actors don't target enemies + if ( actortype == IS_INANIMATE ) + { + return; + } + + if ( SleepList.ObjectInList( ( Actor * )this ) ) + SleepList.RemoveObject( ( Actor * )this ); + + if ( !ActiveList.ObjectInList( ( Actor * )this ) ) + ActiveList.AddObject( ( Actor * )this ); + + flags |= FL_THINK; + } + +void Actor::Wakeup + ( + Event *ev + ) + + { + Wakeup(); + } + +void Actor::Start + ( + Event *ev + ) + + { + trace_t trace; + Vector end; + Vector start; + qboolean stuck; + str monster_name; + + // Register with other parts of self if there are any + + if ( target.length() > 0 ) + PostEvent( EV_ActorRegisterSelf, FRAMETIME ); + + // add them to the active list (they will be removed by sleep). + ActiveList.AddObject( ( Actor * )this ); + + // Drop actor to the ground + + stuck = false; + + start = origin + Vector( "0 0 1" ); + end = origin; + end[ 2 ] -= 16; + + trace = G_Trace( start, mins, maxs, end, this, MASK_SOLID, false, "Actor::start" ); + + if ( trace.startsolid || trace.allsolid ) + { + stuck = true; + } + else if ( !( flags & FL_FLY ) ) + { + setOrigin( trace.endpos ); + groundentity = trace.ent; + } + + if ( name.length() ) + monster_name = name; + else + monster_name = getClassID(); + + if ( trace.fraction == 1 && movetype == MOVETYPE_STATIONARY && !GetActorFlag( ACTOR_FLAG_IGNORE_OFF_GROUND_WARNING ) ) + { + gi.DPrintf( "%s (%d) off of ground at '%5.1f %5.1f %5.1f'\n", monster_name.c_str(), entnum, origin.x, origin.y, origin.z ); + } + + if ( stuck && !GetActorFlag( ACTOR_FLAG_IGNORE_STUCK_WARNING ) ) + { + groundentity = world->edict; + + gi.DPrintf( "%s (%d) stuck in world at '%5.1f %5.1f %5.1f'\n", monster_name.c_str(), entnum, origin.x, origin.y, origin.z ); + } + + last_origin = origin; + + SetActorFlag( ACTOR_FLAG_HAVE_MOVED, false ); + + last_ground_z = origin.z; + + if ( !behavior || currentBehavior == "Idle" ) + Sleep(); + + SetActorFlag( ACTOR_FLAG_STARTED, true ); + } + +//*********************************************************************************************** +// +// Vision functions +// +//*********************************************************************************************** + +qboolean Actor::WithinVisionDistance + ( + Entity *ent + ) + { + float distance; + + // Use whichever is less : the actor's vision distance or the distance of the farplane (fog) + + if ( (world->farplane_distance != 0) && (world->farplane_distance < vision_distance) ) + distance = world->farplane_distance; + else + distance = vision_distance; + + return WithinDistance( ent, distance ); + } + +inline qboolean Actor::InFOV + ( + Vector pos, + float check_fov, + float check_fovdot + ) + { + Vector delta; + float dot; + + if ( check_fov == 360 ) + return true; + + delta = pos - EyePosition(); + + if ( !delta.x && !delta.y ) + { + // special case for straight up and down + return true; + } + + // give better vertical vision + delta.z = 0; + + delta.normalize(); + dot = DotProduct( orientation[ 0 ], delta ); + + return ( dot > check_fovdot ); + } + +inline qboolean Actor::InFOV + ( + Vector pos + ) + + { + return InFOV( pos, fov, fovdot ); + } + +inline qboolean Actor::InFOV + ( + Entity *ent + ) + + { + return InFOV( ent->centroid ); + } + +inline qboolean Actor::CanSeeFOV + ( + Entity *ent + ) + + { + return InFOV( ent ) && CanSeeFrom( origin, ent ); + } + +inline qboolean Actor::CanSeeFrom + ( + Vector pos, + Entity *ent + ) + + { + trace_t trace; + Vector p; + + p = ent->centroid; + + // Check if he's visible + trace = G_Trace( pos + eyeposition, vec_zero, vec_zero, p, this, MASK_OPAQUE, false, "Actor::CanSeeFrom 1" ); + if ( trace.fraction == 1.0 || trace.ent == ent->edict ) + { + return true; + } + + // Check if his head is visible + p.z = ent->absmax.z; + trace = G_Trace( pos + eyeposition, vec_zero, vec_zero, p, this, MASK_OPAQUE, false, "Actor::CanSeeFrom 2" ); + if ( trace.fraction == 1.0 || trace.ent == ent->edict ) + { + return true; + } + + return false; + } + +qboolean Actor::CanSee + ( + Entity *ent + ) + + { + return CanSeeFrom( origin, ent ); + } + +qboolean Actor::EnemyCanSeeMeFrom + ( + Vector pos + ) + + { + Vector d; + Vector p1; + Vector p2; + + + if ( !IsEntityAlive( currentEnemy ) ) + { + return false; + } + + if ( WithinVisionDistance( currentEnemy ) ) + { + // To check if we're visible, I create a plane that intersects the actor + // and is perpendicular to the delta vector between the actor and his enemy. + // I place four points on this plane that "frame" the actor and check if + // the enemy can see any of those points. + d = currentEnemy->centroid - pos; + d.z = 0; + d.normalize(); + p1.x = -d.y; + p1.y = d.x; + p1 *= max( size.x, size.y ) * 1.44 * 0.5; + p2 = p1; + + p1.z = mins.z; + p2.z = maxs.z; + if ( CanSeeFrom( pos + p1, currentEnemy ) ) + { + return true; + } + if ( CanSeeFrom( pos + p2, currentEnemy ) ) + { + return true; + } + + p1.z = -p1.z; + p2.z = -p2.z; + if ( CanSeeFrom( pos - p1, currentEnemy ) ) + { + return true; + } + if ( CanSeeFrom( pos - p2, currentEnemy ) ) + { + return true; + } + } + + return false; + } + +qboolean Actor::CanSeeEnemyFrom + ( + Vector pos + ) + + { + if ( !IsEntityAlive( currentEnemy ) ) + { + return false; + } + + if ( WithinVisionDistance( currentEnemy ) && CanSeeFrom( pos, currentEnemy ) ) + { + return true; + } + + return false; + } + +qboolean Actor::CanReallySee + ( + Entity *ent + ) + + { + if ( !IsEntityAlive( ent ) ) + return false; + + if ( WithinVisionDistance( ent ) && CanSeeFOV( ent ) ) + return true; + + return false; + } + +//*********************************************************************************************** +// +// Combat functions +// +//*********************************************************************************************** + +void Actor::IncomingProjectile + ( + Event *ev + ) + { + incoming_proj = ev->GetEntity( 1 ); + incoming_time = level.time + .1; //+ G_Random( .1 ); + } + +void Actor::FireProjectile + ( + Event *ev + ) + + { + Vector orig; + Vector dir; + str tag_name; + str projectile_name; + int number_of_tags = 1; + qboolean arc = false; + float speed = 0; + + if ( !currentEnemy ) + return; + + tag_name = ev->GetString( 1 ); + projectile_name = ev->GetString( 2 ); + + if ( ev->NumArgs() > 2 ) + number_of_tags = ev->GetInteger( 3 ); + + if ( ev->NumArgs() > 3 ) + arc = ev->GetBoolean( 4 ); + + if ( ev->NumArgs() > 4 ) + speed = ev->GetFloat( 5 ); + + // Find the closest tag + + if ( !GetClosestTag( tag_name, number_of_tags, currentEnemy->centroid, &orig ) ) + { + // Could not find the tag so just use the centroid of the actor + orig[0] = edict->centroid[0]; + orig[1] = edict->centroid[1]; + orig[2] = edict->centroid[2]; + } + + // Add projectile to world + + dir = currentEnemy->centroid - orig; + + if ( arc ) + { + Vector xydir; + float traveltime; + float vertical_speed; + Vector proj_velocity; + + xydir = dir; + xydir.z = 0; + + if ( speed == 0 ) + speed = 500; + + traveltime = xydir.length() / speed; + + vertical_speed = ( dir.z / traveltime ) + ( 0.5f * gravity * sv_gravity->value * traveltime ); + + xydir.normalize(); + + proj_velocity = speed * xydir; + proj_velocity.z = vertical_speed; + + speed = proj_velocity.length(); + proj_velocity.normalize(); + dir = proj_velocity; + } + + dir.normalize(); + + ProjectileAttack( orig, dir, this, projectile_name.c_str(), 1.0f, speed ); + + SaveAttack( orig, dir ); + } + +void Actor::FireBullet + ( + Event *ev + ) + + { + str tag_name; + qboolean use_current_pitch; + float range = 1000; + float damage; + float knockback; + str means_of_death_string; + int means_of_death; + Vector spread; + Vector pos; + Vector forward; + Vector left; + Vector right; + Vector up; + Vector attack_angles; + Vector dir; + Vector enemy_angles; + + tag_name = ev->GetString( 1 ); + use_current_pitch = ev->GetBoolean( 2 ); + damage = ev->GetFloat( 3 ); + knockback = ev->GetFloat( 4 ); + means_of_death_string = ev->GetString( 5 ); + spread = ev->GetVector( 6 ); + + if ( ev->NumArgs() > 6 ) + range = ev->GetFloat( 7 ); + + // Get the position where the bullet starts + + GetTag( tag_name, &pos, &forward, &left, &up ); + + right = left * -1; + + // Get the real pitch of the bullet attack + + if ( !use_current_pitch && currentEnemy ) + { + attack_angles = forward.toAngles(); + + dir = currentEnemy->centroid - pos; + enemy_angles = dir.toAngles(); + + attack_angles[PITCH] = enemy_angles[PITCH]; + + attack_angles.AngleVectors( &forward, &left, &up ); + + right = left * -1; + } + + means_of_death = MOD_string_to_int( means_of_death_string ); + + BulletAttack( pos, forward, right, up, range, damage, knockback, 0, means_of_death, spread, 1, this ); + + SaveAttack( pos, forward ); + } + +void Actor::SaveAttack + ( + Vector orig, + Vector dir + ) + { + Vector attack_mins; + Vector attack_maxs; + Vector end; + trace_t trace; + qboolean hit; + Entity *ent; + + if ( !currentEnemy ) + { + SetActorFlag( ACTOR_FLAG_LAST_ATTACK_HIT, true ); + return; + } + + // Do trace + + attack_mins = Vector( -1,-1,-1 ); + attack_maxs = Vector( 1,1,1 ); + + end = orig + dir * 8192; + + trace = G_Trace( orig, attack_mins, attack_maxs, end, this, MASK_SHOT, false, "Actor::SaveAttack" ); + + // See what we hit + + last_attack_entity_hit = NULL; + + if ( trace.ent ) + { + ent = trace.ent->entity; + + if ( ent == currentEnemy ) + { + hit = true; + } + else if ( ent->isSubclassOf( Entity ) && ent != world ) + { + last_attack_entity_hit = ent; + last_attack_entity_hit_pos = ent->origin; + hit = false; + } + else + { + hit = false; + } + } + else + { + hit = false; + } + + // Do an extra check because of NOCLIP + + if ( currentEnemy->movetype == MOVETYPE_NOCLIP ) + hit = true; + + // Save last attack info + + last_attack_pos = origin; + + if ( currentEnemy ) + last_attack_enemy_pos = currentEnemy->origin; + + SetActorFlag( ACTOR_FLAG_LAST_ATTACK_HIT, hit ); + } + +qboolean Actor::TestAttack( str tag_name ) + { + qboolean hit; + trace_t trace; + Vector attack_mins; + Vector attack_maxs; + Vector start; + + + // Make sure we still have an enemy and he is hitable + + if ( !currentEnemy ) + return false; + + if ( currentEnemy->movetype == MOVETYPE_NOCLIP ) + return false; + + // Make sure we won't hit any friends + + attack_mins = Vector( -1,-1,-1 ); + attack_maxs = Vector( 1,1,1 ); + + if ( tag_name.length() ) + { + GetTag( tag_name.c_str(), &start ); + } + else + { + start = centroid; + } + + trace = G_Trace( start, attack_mins, attack_maxs, currentEnemy->centroid, this, MASK_SHOT, false, "Actor::TestAttack" ); + + if ( trace.ent && trace.ent->entity != currentEnemy && trace.ent->entity->isSubclassOf( Sentient ) && !IsEnemy( trace.ent->entity ) ) + return false; + + // See if we hit last time + + hit = GetActorFlag( ACTOR_FLAG_LAST_ATTACK_HIT ); + + if ( hit ) + return true; + + // Didn't hit last time so see if anything has changed + + // See if actor has moved + + if ( last_attack_pos != origin ) + return true; + + // See if enemy has moved + + if ( last_attack_enemy_pos != currentEnemy->origin ) + return true; + + // See if entity in the way has moved + + if ( last_attack_entity_hit && last_attack_entity_hit_pos != last_attack_entity_hit->origin ) + return true; + + // See if entity in the way was a door and has opened + + if ( last_attack_entity_hit && last_attack_entity_hit->isSubclassOf( Entity ) ) + { + Door *door; + + door = (Door *)(Entity *)last_attack_entity_hit; + + if ( door->isOpen() ) + return true; + } + + // See if entity in the way has become non-solid + + if ( last_attack_entity_hit && last_attack_entity_hit->edict->solid == SOLID_NOT ) + return true; + + // Nothing has changed so this attack should fail too + + return false; + } + +void Actor::MeleeEvent + ( + Event *ev + ) + + { + Vector pos; + Vector end; + Vector dir; + float damage = 20; + qboolean success; + str tag_name; + Vector attack_vector; + float attack_width = 0; + float attack_max_height = 0; + float attack_min_height = 0; + float attack_length = 100; + str means_of_death_string; + meansOfDeath_t means_of_death; + float knockback; + qboolean use_pitch_to_enemy = false; + float attack_final_height; + + + // See if we should really attack + + if ( GetActorFlag( ACTOR_FLAG_DAMAGE_ONCE_ON ) && GetActorFlag( ACTOR_FLAG_DAMAGE_ONCE_DAMAGED ) ) + return; + + if ( !GetActorFlag( ACTOR_FLAG_DAMAGE_ALLOWED ) ) + return; + + // Get all of the parameters + + if ( ev->NumArgs() > 0 ) + damage = ev->GetFloat( 1 ); + + if ( ev->NumArgs() > 1 ) + tag_name = ev->GetString( 2 ); + + if ( ev->NumArgs() > 2 ) + means_of_death_string = ev->GetString( 3 ); + + if ( ev->NumArgs() > 3 ) + { + attack_vector = ev->GetVector( 4 ); + + attack_width = attack_vector[0]; + attack_length = attack_vector[1]; + attack_max_height = attack_vector[2]; + } + + if ( ev->NumArgs() > 4 ) + { + knockback = ev->GetFloat( 5 ); + } + else + { + knockback = damage * 8; + } + + if ( ev->NumArgs() > 5 ) + { + use_pitch_to_enemy = ev->GetInteger( 6 ); + } + + if ( ev->NumArgs() > 6 ) + attack_min_height = ev->GetFloat( 7 ); + else + attack_min_height = -attack_max_height; + + if ( ev->NumArgs() > 7 ) + attack_final_height = ev->GetFloat( 8 ); + else + attack_final_height = 50; + + if ( tag_name.length() && GetTag( tag_name.c_str(), &pos, &dir ) ) + { + end = pos + dir * attack_length; + } + else + { + pos = edict->centroid; + dir = orientation[0]; + dir.normalize(); + end = pos + dir * attack_length; + + if ( attack_length ) + end[2] += attack_final_height; + } + + if ( use_pitch_to_enemy ) + { + if ( currentEnemy ) + { + Vector enemy_dir; + Vector angles; + Vector enemy_angles; + float length; + + dir = end - pos; + length = dir.length(); + angles = dir.toAngles(); + + enemy_dir = currentEnemy->centroid - pos; + enemy_angles = enemy_dir.toAngles(); + + angles[PITCH] = enemy_angles[PITCH]; + angles.AngleVectors( &dir ); + end = pos + dir * length; + } + } + + if ( means_of_death_string.length() > 0 ) + means_of_death = (meansOfDeath_t)MOD_string_to_int( means_of_death_string ); + else + means_of_death = MOD_CRUSH; + + // Do the actual attack + + success = MeleeAttack( pos, end, damage, this, means_of_death, attack_width, attack_min_height, attack_max_height, knockback ); + + if ( success ) + { + AddStateFlag( STATE_FLAG_MELEE_HIT ); + + if ( GetActorFlag( ACTOR_FLAG_DAMAGE_ONCE_ON ) ) + SetActorFlag( ACTOR_FLAG_DAMAGE_ONCE_DAMAGED, true ); + } + } + +void Actor::ChargeWater + ( + Event *ev + ) + + { + int cont; + float damage; + float radius; + Entity *ent; + int brushnum; + int entity_brushnum; + float real_damage; + Vector dir; + float dist; + + // See if we are standing in water + + cont = gi.pointcontents( origin, 0 ); + + if ( !(cont & MASK_WATER) ) + return; + + // Get parms + + damage = ev->GetFloat( 1 ); + radius = ev->GetFloat( 2 ); + + if ( !damage || !radius ) + return; + + // Determine what brush we are in + + brushnum = gi.pointbrushnum( origin, 0 ); + + // Find everything in radius + + ent = NULL; + + for( ent = findradius( ent, origin, radius ) ; ent ; ent = findradius( ent, origin, radius ) ) + { + if ( ent->takedamage ) + { + entity_brushnum = gi.pointbrushnum( origin, 0 ); + + if ( brushnum == entity_brushnum ) + { + dir = ent->origin - origin; + dist = dir.length(); + + if ( dist < radius ) + { + real_damage = damage - damage * ( dist / radius ); + ent->Damage( this, this, real_damage, origin, dir, vec_zero, 0, 0, MOD_ELECTRICWATER ); + } + } + } + } + } + +void Actor::DamageOnceStart + ( + Event *ev + ) + + { + SetActorFlag( ACTOR_FLAG_DAMAGE_ONCE_ON, true ); + SetActorFlag( ACTOR_FLAG_DAMAGE_ONCE_DAMAGED, false ); + } + +void Actor::DamageOnceStop + ( + Event *ev + ) + + { + SetActorFlag( ACTOR_FLAG_DAMAGE_ONCE_ON, false ); + } + +void Actor::DamageAllowed + ( + Event *ev + ) + + { + SetActorFlag( ACTOR_FLAG_DAMAGE_ALLOWED, ev->GetBoolean( 1 ) ); + } + +qboolean Actor::CanShootFrom + ( + Vector pos, + Entity *ent, + qboolean usecurrentangles + ) + + { + int mask; + Vector delta; + Vector start; + Vector end; + float len; + trace_t trace; + Entity *t; + Vector ang; + + if ( usecurrentangles ) + { + Vector dir; + + // Fixme ? + //start = pos + GunPosition() - origin; + start = pos + centroid - origin; + end = ent->centroid; + end.z += ( ent->absmax.z - ent->centroid.z ) * 0.75f; + delta = end - start; + ang = delta.toAngles(); + ang.x = ang.x; + ang.y = angles.y; + len = delta.length(); + ang.AngleVectors( &dir, NULL, NULL ); + dir *= len; + end = start + dir; + } + else + { + // Fixme ? + //start = pos + GunPosition() - origin; + start = pos + centroid - origin; + end = ent->centroid; + end.z += ( ent->absmax.z - ent->centroid.z ) * 0.75f; + delta = end - start; + len = delta.length(); + } + + // shoot past the guy we're shooting at + end += delta * 4; + + // Check if he's visible + mask = MASK_SHOT; + trace = G_Trace( start, vec_zero, vec_zero, end, this, mask, false, "Actor::CanShootFrom" ); + if ( trace.startsolid ) + { + return false; + } + + // see if we hit anything at all + if ( !trace.ent ) + { + return false; + } + + // If we hit the guy we wanted, then shoot + if ( trace.ent == ent->edict ) + { + return true; + } + + // If we hit someone else we don't like, then shoot + t = trace.ent->entity; + if ( IsEnemy( t ) ) + { + return true; + } + + // if we hit something breakable, check if shooting it will + // let us shoot someone. + if ( t->isSubclassOf( Object ) || + t->isSubclassOf( ScriptModel ) ) + { + trace = G_Trace( Vector( trace.endpos ), vec_zero, vec_zero, end, t, mask, false, "Actor::CanShootFrom 2" ); + if ( trace.startsolid ) + { + return false; + } + // see if we hit anything at all + if ( !trace.ent ) + { + return false; + } + + // If we hit the guy we wanted, then shoot + if ( trace.ent == ent->edict ) + { + return true; + } + + // If we hit someone else we don't like, then shoot + if ( IsEnemy( trace.ent->entity ) ) + { + return true; + } + + // Forget it then + return false; + } + + return false; + } + +qboolean Actor::CanShoot + ( + Entity *ent, + qboolean usecurrentangles + ) + + { + return CanShootFrom( origin, ent, usecurrentangles ); + } + +qboolean Actor::EntityHasFireType + ( + Entity *ent, + firetype_t fire_type + ) + + { + Player *player; + Weapon *weapon; + firetype_t weapon_fire_type; + + + if ( !ent ) + return false; + + if ( !ent->isSubclassOf( Player ) ) + return true; + + player = (Player *)(Entity *)ent; + + // Try left hand + + weapon = player->GetActiveWeapon( WEAPON_LEFT ); + + if ( weapon ) + { + weapon_fire_type = weapon->GetFireType( FIRE_PRIMARY ); + + if ( weapon_fire_type == fire_type ) + return true; + } + + // Try right hand + + weapon = player->GetActiveWeapon( WEAPON_RIGHT ); + + if ( weapon ) + { + weapon_fire_type = weapon->GetFireType( FIRE_PRIMARY ); + + if ( weapon_fire_type == fire_type ) + return true; + } + + // Try dual weapons + + weapon = player->GetActiveWeapon( WEAPON_DUAL ); + + if ( weapon ) + { + weapon_fire_type = weapon->GetFireType( FIRE_PRIMARY ); + + if ( weapon_fire_type == fire_type ) + return true; + } + + return false; + } + +void Actor::DamageEnemy + ( + Event *ev + ) + { + float damage = 0; + + if ( ev->NumArgs() > 0 ) + damage = ev->GetFloat( 1 ); + + if ( ( damage > 0 ) && currentEnemy ) + currentEnemy->Damage( this, this, damage, vec_zero, vec_zero, vec_zero, 0, 0, MOD_CRUSH ); + } + +void Actor::TurnTowardsEnemy + ( + Event *ev + ) + { + Vector dir; + Vector new_angles; + + if ( currentEnemy && !(currentEnemy->flags & FL_NOTARGET) ) + { + dir = currentEnemy->centroid - origin; + new_angles = dir.toAngles(); + + angles[YAW] = new_angles[YAW]; + angles[ROLL] = 0; + setAngles( angles ); + } + } + +void Actor::AttackModeEvent + ( + Event *ev + ) + { + qboolean attack_bool; + + attack_bool = ev->GetBoolean( 1 ); + + if ( attack_bool ) + { + ProcessEvent( EV_Actor_AttackPlayer ); + } + } + +qboolean Actor::ShouldAttackEntity + ( + Entity *ent + ) + + { + if ( !ent || !ent->isSubclassOf( Sentient ) || Likes( ent ) ) + return false; + + if ( ent->isSubclassOf( Actor ) ) + { + Actor *act = (Actor *)ent; + + if ( GetActorFlag( ACTOR_FLAG_IGNORE_PAIN_FROM_ACTORS ) ) + return false; + + if ( !act->GetActorFlag( ACTOR_FLAG_ATTACKABLE_BY_ACTORS ) ) + return false; + } + + return true; + } + +void Actor::SetAttackableByActors + ( + Event *ev + ) + + { + qboolean bool; + + bool = ev->GetBoolean( 1 ); + + SetActorFlag( ACTOR_FLAG_ATTACKABLE_BY_ACTORS, bool ); + } + +void Actor::SetAttackActors + ( + Event *ev + ) + + { + SetActorFlag( ACTOR_FLAG_ATTACK_ACTORS, true ); + } + +void Actor::MinimumMeleeHeight + ( + Event *ev + ) + + { + minimum_melee_height = ev->GetFloat( 1 ); + } + +void Actor::SetDamageAngles + ( + Event *ev + ) + + { + damage_angles = ev->GetFloat( 1 ); + } + +void Actor::SetImmortal + ( + Event *ev + ) + + { + qboolean bool; + + if ( ev->NumArgs() > 0 ) + bool = ev->GetBoolean( 1 ); + else + bool = true; + + SetActorFlag( ACTOR_FLAG_IMMORTAL, bool ); + } + +qboolean Actor::IsImmortal + ( + void + ) + + { + return GetActorFlag( ACTOR_FLAG_IMMORTAL ); + } + +//*********************************************************************************************** +// +// Actor type script commands +// +//*********************************************************************************************** + +void Actor::FriendEvent + ( + Event *ev + ) + + { + actortype = IS_FRIEND; + } + +void Actor::CivilianEvent + ( + Event *ev + ) + + { + actortype = IS_CIVILIAN; + } + +void Actor::EnemyEvent + ( + Event *ev + ) + + { + actortype = IS_ENEMY; + } + +void Actor::InanimateEvent + ( + Event *ev + ) + + { + actortype = IS_INANIMATE; + // + // clear the monster flag so triggers are not triggered + // + edict->svflags &= ~SVF_MONSTER; + // + // don't make them move + // + setMoveType( MOVETYPE_STATIONARY ); + // + // don't make it bleed + // + flags &= ~FL_BLOOD; + // + // don't make it gib + // + flags &= ~FL_DIE_GIBS; + } + +void Actor::MonsterEvent + ( + Event *ev + ) + + { + actortype = IS_MONSTER; + } + +void Actor::AnimalEvent + ( + Event *ev + ) + + { + actortype = IS_ANIMAL; + } + +void Actor::SetEnemyType + ( + Event *ev + ) + { + enemytype = ev->GetString( 1 ); + } + +//*********************************************************************************************** +// +// Enemy management +// +//*********************************************************************************************** + +void Actor::FindEnemy + ( + void + ) + { + Entity *player; + + // don't target while player is not in the game or he's in notarget + player = g_entities[ 0 ].entity; + if ( !player || ( player->flags & FL_NOTARGET ) ) + { + return; + } + + if ( !GetActorFlag( ACTOR_FLAG_ATTACK_ACTORS ) ) + { + if ( Hates( player ) && ( ( last_enemy_sight_time && CanSee( player ) ) || CanReallySee( player ) ) ) + Stimuli( STIMULI_SIGHT, player, true ); + } + else + { + Entity *entity_to_attack; + + entity_to_attack = FindNearestEnemy(); + + if ( entity_to_attack ) + Stimuli( STIMULI_SIGHT, entity_to_attack, true ); + } + } + +Entity *Actor::FindNearestEnemy( void ) + { + Entity *ent_in_range; + int i; + Vector delta; + gentity_t *ed; + float best_dist = -1; + float dist; + Entity *nearest_enemy = NULL; + + + // Go through clients + + for( i = 0 ; i < game.maxclients; i++ ) + { + ed = &g_entities[ i ]; + + if ( !ed->inuse || !ed->entity ) + continue; + + ent_in_range = ed->entity; + + if ( IsEntityAlive( ent_in_range ) ) + { + delta = origin - ent_in_range->centroid; + + dist = delta * delta; + + if ( dist < best_dist || best_dist == -1 ) + { + if ( Hates( ent_in_range) && CanSee( ent_in_range ) ) + { + nearest_enemy = ent_in_range; + best_dist = dist; + } + } + } + } + + // Go through actors now + + for( i = 1; i <= ActiveList.NumObjects(); i++ ) + { + ent_in_range = ActiveList.ObjectAt( i ); + + if ( + ( ent_in_range->movetype != MOVETYPE_STATIONARY ) && + ( ent_in_range->movetype != MOVETYPE_NONE ) && + ( this != ent_in_range ) && + ( ent_in_range->health > 0 ) && + !( ent_in_range->flags & FL_NOTARGET ) + ) + { + delta = origin - ent_in_range->centroid; + + dist = delta * delta; + + if ( dist < best_dist || best_dist == -1 ) + { + if ( !Likes( ent_in_range) && CanSee( ent_in_range ) ) + { + nearest_enemy = ent_in_range; + best_dist = dist; + } + } + } + } + + return nearest_enemy; + } + +void Actor::GetNearestEnemy + ( + Event *ev + ) + { + currentEnemy = FindNearestEnemy(); + } + +#define MAX_RANDOM_ENTS 10 + +void Actor::GetRandomEnemy + ( + Event *ev + ) + { + float max_distance; + float max_distance2; + Entity *ent_in_range; + int i; + Vector delta; + gentity_t *ed; + float dist; + Entity *ents_found[MAX_RANDOM_ENTS]; + int number_of_ents_found = 0; + + + // Get the maximum distance that we will look for enemies + + max_distance = ev->GetFloat( 1 ) ; + max_distance2 = max_distance * max_distance; + + // Go through clients + + for( i = 0 ; i < game.maxclients; i++ ) + { + if ( number_of_ents_found >= MAX_RANDOM_ENTS ) + break; + + ed = &g_entities[ i ]; + + if ( !ed->inuse || !ed->entity ) + continue; + + ent_in_range = ed->entity; + + if ( IsEntityAlive( ent_in_range ) ) + { + delta = origin - ent_in_range->centroid; + + dist = delta * delta; + + if ( dist < max_distance2 ) + { + if ( CanSee( ent_in_range ) ) + { + ents_found[number_of_ents_found] = ent_in_range; + number_of_ents_found++; + } + } + } + } + + // Go through actors now + + for( i = 1; i <= ActiveList.NumObjects(); i++ ) + { + if ( number_of_ents_found >= MAX_RANDOM_ENTS ) + break; + + ent_in_range = ActiveList.ObjectAt( i ); + + if ( + ( ent_in_range->movetype != MOVETYPE_STATIONARY ) && + ( ent_in_range->movetype != MOVETYPE_NONE ) && + ( this != ent_in_range ) && + ( ent_in_range->health > 0 ) && + !( ent_in_range->flags & FL_NOTARGET ) && + ent_in_range->isSubclassOf( Actor ) + ) + { + Actor *act = (Actor *)ent_in_range; + + if ( act->actortype == IS_FRIEND && act->dialog_list ) + { + delta = origin - ent_in_range->centroid; + + dist = delta * delta; + + if ( dist < max_distance2 ) + { + if ( CanSee( ent_in_range ) ) + { + ents_found[number_of_ents_found] = ent_in_range; + number_of_ents_found++; + } + } + } + } + } + + if ( number_of_ents_found ) + currentEnemy = ents_found[ (int)G_Random( number_of_ents_found ) ]; + else + currentEnemy = NULL; + } + +qboolean Actor::HasEnemies + ( + void + ) + + { + return ( currentEnemy != NULL ); + } + +qboolean Actor::IsEnemy + ( + Entity *ent + ) + + { + return ( ent != NULL ) && ( currentEnemy == ent ); + } + +void Actor::MakeEnemy + ( + Entity *ent, + qboolean force + ) + + { + // Don't get mad at things that can't be hurt or the world + + if ( !ent || ( ent == world ) || ( ent == this ) || ( ent->flags & FL_NOTARGET ) || ( ent->takedamage == DAMAGE_NO ) ) + return; + + if ( !currentEnemy || force ) + { + currentEnemy = ent; + last_enemy_sight_time = level.time; + } + + Wakeup(); + } + +void Actor::ClearEnemies + ( + void + ) + + { + currentEnemy = NULL; + Sleep(); + } + + +qboolean Actor::Likes + ( + Entity *ent + ) + + { + Actor *act; + + if ( ent->isClient() ) + { + return ( actortype == IS_FRIEND ); + } + + if ( actortype == IS_MONSTER ) + { + // Monsters don't like anyone + return false; + } + + if ( ent->isSubclassOf( Actor ) ) + { + act = ( Actor * )ent; + + if ( act->enemytype == enemytype ) + return true; + + if ( act->actortype != actortype ) + return false; + else if ( actortype == IS_FRIEND ) + return true; + } + + return false; +} + +qboolean Actor::Hates + ( + Entity *ent + ) + + { + Actor *act; + + assert( ent ); + if ( !ent ) + { + return false; + } + + if ( ent->isClient() ) + { + return ( actortype != IS_CIVILIAN ) && ( actortype != IS_FRIEND ); + } + else if ( ent->isSubclassOf( Actor ) && ( actortype != IS_INANIMATE ) ) + { + act = ( Actor * )ent; + if ( ( act->actortype <= IS_ENEMY ) && ( actortype <= IS_ENEMY ) ) + { + return false; + } + if ( ( act->actortype == IS_FRIEND ) && ( actortype <= IS_ENEMY ) ) + { + return true; + } + if ( ( act->actortype <= IS_ENEMY ) && ( actortype == IS_FRIEND ) ) + { + return true; + } + } + + return false; + } + +//*********************************************************************************************** +// +// Targeting functions +// +//*********************************************************************************************** + +qboolean Actor::CloseToEnemy + ( + Vector pos, + float howclose + ) + + { + if ( !IsEntityAlive( currentEnemy ) ) + { + return false; + } + + if ( WithinDistance( currentEnemy, howclose ) ) + { + return true; + } + + return false; + } + +void Actor::EyeOffset + ( + Event *ev + ) + { + eyeposition -= eyeoffset; + eyeoffset = ev->GetVector( 1 ); + eyeposition += eyeoffset; + } + +qboolean Actor::EntityInRange + ( + Entity *ent, + float range, + float min_height, + float max_height + ) + + { + float r; + Vector delta; + float height_diff; + + // Make sure the entity is alive + + if ( !IsEntityAlive( ent ) ) + { + return false; + } + + // See if the entity is in range + + delta = ent->centroid - centroid; + + if ( max_height != 0 || min_height != 0 ) + { + height_diff = delta[ 2 ]; + + if ( ( height_diff < min_height ) || ( height_diff > max_height ) ) + { + return false; + } + + delta[ 2 ] = 0; + } + + r = delta * delta; + + return ( r < range * range ); + } + +//*********************************************************************************************** +// +// Thread management +// +//*********************************************************************************************** + +void Actor::SetupThread + ( + str filename, + str label + ) + { + + if ( actorthread ) + return; + + actorthread = Director.CreateThread( filename.c_str(), MODEL_SCRIPT ); + + if ( actorthread ) + { + if ( label.length() ) + { + if ( !actorthread->Goto( label.c_str() ) ) + { + gi.DPrintf( "Label '%s' not found in %s.", label.c_str(), filename.c_str() ); + return; + } + } + + ProcessScript( actorthread ); + } + } + +void Actor::ProcessScript + ( + ScriptThread *thread, + Event *ev + ) + + { + thread->Vars()->SetVariable( "self", this ); + thread->Vars()->SetVariable( "origin", origin ); + thread->Vars()->SetVariable( "yaw", angles.y ); + thread->Vars()->SetVariable( "health", health ); + thread->Vars()->SetVariable( "startpos", startpos ); + + if ( currentEnemy ) + { + thread->Vars()->SetVariable( "enemy", currentEnemy ); + } + else + { + thread->Vars()->SetVariable( "enemy", "" ); + } + + if ( ev ) + { + thread->ProcessEvent( ev ); + } + else + { + thread->ProcessEvent( EV_ScriptThread_Execute ); + } + } + +inline ScriptVariable *Actor::SetVariable + ( + const char *name, + float value + ) + + { + if ( actorthread ) + { + return actorthread->Vars()->SetVariable( name, value ); + } + + return NULL; + } + +inline ScriptVariable *Actor::SetVariable + ( + const char *name, + int value + ) + + { + if ( actorthread ) + { + return actorthread->Vars()->SetVariable( name, value ); + } + + return NULL; + } + +inline ScriptVariable *Actor::SetVariable + ( + const char *name, + const char *text + ) + + { + if ( actorthread ) + { + return actorthread->Vars()->SetVariable( name, text ); + } + + return NULL; + } + +inline ScriptVariable *Actor::SetVariable + ( + const char *name, + str &text + ) + + { + if ( actorthread ) + { + return actorthread->Vars()->SetVariable( name, text.c_str() ); + } + + return NULL; + } + +inline ScriptVariable *Actor::SetVariable + ( + const char *name, + Entity *ent + ) + + { + if ( actorthread ) + { + return actorthread->Vars()->SetVariable( name, ent ); + } + + return NULL; + } + +inline ScriptVariable *Actor::SetVariable + ( + const char *name, + Vector &vec + ) + + { + if ( actorthread ) + { + return actorthread->Vars()->SetVariable( name, vec ); + } + + return NULL; + } + +//*********************************************************************************************** +// +// State machine functions +// +//*********************************************************************************************** + +void Actor::SetIdleStateName + ( + Event *ev + ) + { + idle_state_name = ev->GetString( 1 ); + } + +void Actor::SetState( const char *state_name ) + { + ClassDef *cls; + int i; + Event *e; + + if ( !statemap ) + return; + + if ( deadflag ) + return; + + if ( currentState ) + currentState->ProcessExitCommands( this ); + + currentState = statemap->FindState( state_name ); + state_time = level.time; + + // Set the behavior + + if ( currentState ) + { + cls = getClass( currentState->getBehaviorName() ); + + if ( cls ) + { + if ( currentState->numBehaviorParms() ) + { + e = new Event( EV_Behavior_Args ); + + for ( i = 1 ; i <= currentState->numBehaviorParms() ; i++ ) + e->AddString( currentState->getBehaviorParm( i ) ); + + SetBehavior( ( Behavior * )cls->newInstance(), e ); + } + else + { + SetBehavior( ( Behavior * )cls->newInstance() ); + } + } + + InitState(); + currentState->ProcessEntryCommands( this ); + } + else + { + gi.DPrintf( "State %s not found\n", state_name ); + } + } + +void Actor::InitState + ( + void + ) + + { + float min_time; + float max_time; + + + min_time = currentState->getMinTime(); + max_time = currentState->getMaxTime(); + + if ( (min_time != -1) && (max_time != -1) ) + { + SetActorFlag( ACTOR_FLAG_STATE_DONE_TIME_VALID, true ); + + state_done_time = level.time + min_time + G_Random( max_time - min_time ); + } + else + { + SetActorFlag( ACTOR_FLAG_STATE_DONE_TIME_VALID, false ); + } + + state_time = level.time; + times_done = 0; + + ClearStateFlags(); + command = ""; + + SetActorFlag( ACTOR_FLAG_ANIM_DONE, false ); + SetActorFlag( ACTOR_FLAG_NOISE_HEARD, false ); + } + +void Actor::LoadStateMap + ( + Event *ev + ) + + { + str anim_name; + qboolean loading; + + + // Load the new state map + + statemap_name = ev->GetString( 1 ); + + conditionals.FreeObjectList(); + statemap = GetStatemap( statemap_name, ( Condition * )Conditions, &conditionals, false ); + + // Set the first state + + if ( ev->NumArgs() > 1 ) + idle_state_name = ev->GetString( 2 ); + else + idle_state_name = "IDLE"; + + if ( ev->NumArgs() > 2 ) + loading = ev->GetBoolean( 3 ); + else + loading = false; + + // Initialize the actors first animation + + if ( !loading ) + { + SetState( idle_state_name.c_str() ); + + if ( currentState ) + anim_name = currentState->getLegAnim( *this, &conditionals ); + + if ( anim_name == "" && !newanim.length() ) + anim_name = "idle"; + + SetAnim( anim_name.c_str(), EV_Anim_Done ); + ChangeAnim(); + + flags &= ~FL_THINK; + } + } + +void Actor::ProcessActorStateMachine( void ) + { + int count; + ClassDef *cls = NULL; + str behavior_arg; + const char *currentanim; + str behavior_name; + State *laststate; + + count = 0; + + if ( deadflag || !currentState ) + return; + + if ( mode != ACTOR_MODE_AI && mode != ACTOR_MODE_IDLE ) + return; + + do + { + // Since we could get into an infinite loop here, do a check to make sure we don't. + + count++; + if ( count > 10 ) + { + gi.DPrintf( "Possible infinite loop in state '%s'\n", currentState->getName() ); + if ( count > 20 ) + { + gi.Error( ERR_DROP, "Stopping due to possible infinite state loop\n" ); + break; + } + } + + // Determine the next state to go to + + laststate = currentState; + currentState = currentState->Evaluate( *this, &conditionals ); + + // Change the behavior if the state has changed + + if ( laststate != currentState ) + { + // Process exit commands of the last state + + laststate->ProcessExitCommands( this ); + + // Process entry commands of the new state + + currentState->ProcessEntryCommands( this ); + + // Setup the new behavior + + behavior_name = currentState->getBehaviorName(); + + if ( behavior_name.length() ) + cls = getClass( currentState->getBehaviorName() ); + + if ( cls ) + { + if ( currentState->numBehaviorParms() ) + { + int i; + Event *e = new Event( EV_Behavior_Args ); + + for ( i = 1 ; i <= currentState->numBehaviorParms() ; i++ ) + e->AddString( currentState->getBehaviorParm( i ) ); + + SetBehavior( ( Behavior * )cls->newInstance(), e ); + } + else + { + SetBehavior( ( Behavior * )cls->newInstance() ); + } + } + else if ( behavior_name.length() ) + { + gi.DPrintf( "Invalid behavior name %s\n", behavior_name.c_str() ); + } + + // Initialize some stuff for changing states + + InitState(); + } + + // Change the animation if it has changed + + currentanim = currentState->getLegAnim( *this, &conditionals ); + + if ( currentanim[0] != 0 && strcmp( animname, currentanim ) != 0 ) + SetAnim( currentanim, EV_Anim_Done ); + } + while( laststate != currentState ); + } + +//*********************************************************************************************** +// +// Thread based script commands +// +//*********************************************************************************************** + +void Actor::RunThread + ( + Event *ev + ) + + { + str thread_name; + ScriptThread *thread; + + + thread_name = ev->GetString( 1 ); + + thread = ExecuteThread( thread_name.c_str(), false ); + + if ( thread ) + ProcessScript( thread, NULL ); + else + warning( "RunThread", "could not process thread" ); + } + +void Actor::SetThread + ( + Event *ev + ) + + { + ScriptThread *thread; + str label; + + if ( mode == ACTOR_MODE_AI ) + return; + + thread = ev->GetThread(); + label = ev->GetString( 1 ); + + if ( !thread ) + return; + + if ( mode != ACTOR_MODE_TALK ) + StartMode( ACTOR_MODE_SCRIPT ); + + SetThread( thread->Filename(), label ); + + if ( mode == ACTOR_MODE_TALK ) + { + saved_mode = ACTOR_MODE_SCRIPT; + saved_actorthread = actorthread; + actorthread = NULL; + return; + } + } + +void Actor::SetThread + ( + str filename, + str label + ) + + { + str start; + + + if ( filename.length() == 0 || label.length() == 0 ) + return; + + if ( !actorthread ) + { + SetupThread( filename, label ); + } + else + { + start = filename + "::" + label; + + if ( actorthread->Goto( start.c_str() ) ) + { + ProcessScript( actorthread ); + } + else + gi.DPrintf( "Label '%s' not found. Couldn't change thread.", start.c_str() ); + } + } + +void Actor::EndThread + ( + Event *ev + ) + + { + if ( actorthread ) + { + actorthread->ProcessEvent( EV_ScriptThread_End ); + actorthread = NULL; + + if ( mode == ACTOR_MODE_SCRIPT ) + { + if ( behavior ) + EndBehavior(); + } + } + } + +//*********************************************************************************************** +// +// Behavior management +// +//*********************************************************************************************** + +void Actor::SendMoveDone( ScriptThread *script_thread ) + { + Event *event; + + if ( script_thread ) + { + event = new Event( EV_MoveDone ); + event->AddEntity( this ); + script_thread->PostEvent( event, FRAMETIME ); + } + } + +void Actor::EndBehavior + ( + void + ) + + { + ScriptThread *t; + Event *event; + + + if ( behavior ) + { + behavior->End( *this ); + delete behavior; + behavior = NULL; + + if ( scriptthread ) + { + t = scriptthread; + scriptthread = NULL; + + if ( actorthread ) + { + event = new Event( EV_MoveDone ); + event->AddEntity( this ); + ProcessScript( actorthread, event ); + } + + if ( t != actorthread ) + { + event = new Event( EV_MoveDone ); + event->AddEntity( this ); + t->ProcessEvent( event ); + } + } + } + + // Prevent previous behaviors from stopping the next behavior + CancelEventsOfType( EV_Actor_FinishedBehavior ); + } + +void Actor::SetBehavior + ( + Behavior *newbehavior, + Event *startevent, + ScriptThread *newthread + ) + + { + if ( ( deadflag ) && ( actortype != IS_INANIMATE ) ) + { + // Delete the unused stuff + + if ( newbehavior ) + delete newbehavior; + if ( startevent ) + delete startevent; + + return; + } + + // End any previous behavior, but don't call EV_MoveDone if we're using the same thread, + // or we'll end THIS behavior + if ( scriptthread == newthread ) + { + scriptthread = NULL; + } + EndBehavior(); + + behavior = newbehavior; + if ( behavior ) + { + //flags |= FL_THINK; + Wakeup(); + + if ( startevent ) + { + behavior->ProcessEvent( startevent ); + } + currentBehavior = behavior->getClassname(); + behavior->Begin( *this ); + scriptthread = newthread; + } + } + +void Actor::FinishedBehavior + ( + Event *ev + ) + + { + EndBehavior(); + } + +void Actor::NotifyBehavior + ( + Event *ev + ) + + { + if ( behavior ) + { + behavior->ProcessEvent( EV_Behavior_AnimDone ); + SetActorFlag( ACTOR_FLAG_ANIM_DONE, true ); + } + } + +//*********************************************************************************************** +// +// Path and node management +// +//*********************************************************************************************** + +PathNode *Actor::NearestNodeInPVS + ( + Vector pos + ) + + { + Vector delta; + PathNode *node; + PathNode *bestnode; + float bestdist; + float dist; + int number_nodes; + int i; + MapCell *cell; + Vector min; + Vector max; + + + cell = PathManager.GetNodesInCell( pos ); + + if ( !cell ) + return NULL; + + number_nodes = cell->NumNodes(); + + bestnode = NULL; + bestdist = 999999999; // greater than ( 8192 * sqr(2) ) ^ 2 -- maximum squared distance + + for( i = 0; i < number_nodes; i++ ) + { + node = ( PathNode * )cell->GetNode( i ); + + if ( !node ) + continue; + + delta = node->origin - pos; + + // get the distance squared (faster than getting real distance) + dist = delta * delta; + + if ( ( dist < bestdist ) && gi.inPVS( node->origin, pos ) ) + { + bestnode = node; + bestdist = dist; + + // if we're close enough, early exit + if ( dist < 16 ) + break; + } + } + + return bestnode; + } + +void Actor::SetPath + ( + Path *newpath + ) + + { + if ( path && ( path != newpath ) ) + { + delete path; + } + path = newpath; + } + +void Actor::ReserveNodeEvent + ( + Event *ev + ) + + { + PathNode *node; + Vector pos; + + pos = ev->GetVector( 1 ); + node = PathManager.NearestNode( pos, this ); + + if ( node && ( !node->entnum || ( node->entnum == entnum ) || ( node->occupiedTime < level.time ) ) ) + { + // Mark node as occupied for a short time + node->occupiedTime = level.time + ev->GetFloat( 2 ); + node->entnum = entnum; + } + } + +void Actor::ReleaseNodeEvent + ( + Event *ev + ) + + { + PathNode *node; + Vector pos; + + pos = ev->GetVector( 1 ); + node = PathManager.NearestNode( pos, this ); + + if ( node && ( node->entnum == entnum ) ) + { + node->occupiedTime = 0; + node->entnum = 0; + } + } + +//*********************************************************************************************** +// +// Animation control functions +// +//*********************************************************************************************** + +void Actor::RemoveAnimDoneEvent( void ) + { + SetAnimDoneEvent( NULL ); + + if ( newanimevent ) + { + delete newanimevent; + newanimevent = NULL; + } + + last_anim_event_name = ""; + } + +void Actor::ChangeAnim + ( + void + ) + + { + float time; + Vector totalmove; + + if ( newanimnum == -1 ) + { + return; + } + + // If we're changing to the same anim, don't restart the animation + if ( newanimnum == CurrentAnim() && animname == newanim) + { + SetAnimDoneEvent( newanimevent ); + } + else + { + animname = newanim; + + time = gi.Anim_Time( edict->s.modelindex, newanimnum ); + gi.Anim_Delta( edict->s.modelindex, newanimnum, totalmove ); + + totalmove *= edict->s.scale; + totallen = totalmove.length(); + + // always have a valid move direction + if ( totallen > 0.01 ) + { + movespeed = totallen / time; + animdir = totalmove * ( 1 / totallen ); + } + else + { + if ( forwardspeed ) + { + movespeed = forwardspeed; + } + else + { + movespeed = 1; + } + animdir = Vector( 1, 0, 0 ); + } + + MatrixTransformVector( animdir, orientation, movedir ); + movevelocity = movedir * movespeed; + + + NewAnim( newanimnum, newanimevent ); + } + + // clear the new anim variables + newanimnum = -1; + newanim = ""; + newanimevent = NULL; + } + +void Actor::AnimDone + ( + Event *ev + ) + + { + SetActorFlag( ACTOR_FLAG_ANIM_DONE, true ); + } + +qboolean Actor::SetAnim + ( + str anim, + Event *ev + ) + + { + int num; + + num = gi.Anim_Random( edict->s.modelindex, anim.c_str() ); + if ( num != -1 ) + { + newanim = anim; + newanimnum = num; + + if ( newanimevent ) + delete newanimevent; + + newanimevent = ev; + + if ( newanimevent ) + last_anim_event_name = newanimevent->getName(); + else + last_anim_event_name = ""; + + if ( actortype == IS_INANIMATE ) + { + // inanimate objects change anims immediately + ChangeAnim(); + } + + return true; + } + + // kill the event + if ( ev ) + { + delete ev; + } + + return false; + } + +qboolean Actor::SetAnim + ( + str anim, + Event &ev + ) + + { + Event * event; + + //last_anim_event = &ev; + + event = new Event( ev ); + return SetAnim( anim, event ); + } + +void Actor::Anim + ( + Event *ev + ) + + { + Event *e; + + if ( !ModeAllowed( ACTOR_MODE_SCRIPT ) ) + { + if ( mode == ACTOR_MODE_TALK ) + PostEvent( *ev, FRAMETIME ); + else if ( mode == ACTOR_MODE_AI ) + SendMoveDone( ev->GetThread() ); + return; + } + + if ( ( deadflag ) && ( actortype != IS_INANIMATE ) ) + { + return; + } + + e = new Event( EV_Behavior_Args ); + + e->SetSource( ev->GetSource() ); + + if ( ev->GetSource() == EV_FROM_SCRIPT ) + { + StartMode( ACTOR_MODE_SCRIPT ); + + e->SetThread( ev->GetThread() ); + e->SetLineNumber( ev->GetLineNumber() ); + } + + e->AddToken( ev->GetToken( 1 ) ); + + SetBehavior( new PlayAnim, e, ev->GetThread() ); + } + +//*********************************************************************************************** +// +// Script commands +// +//*********************************************************************************************** + +void Actor::IdleEvent + ( + Event *ev + ) + + { + const char *state_name; + + if ( !ModeAllowed( ACTOR_MODE_IDLE ) ) + { + if ( mode == ACTOR_MODE_TALK ) + RepostEvent( ev, EV_Actor_Idle ); + return; + } + + if ( ev->NumArgs() > 0 ) + state_name = ev->GetString( 1 ); + else + state_name = idle_state_name; + + SetState( state_name ); + + StartMode( ACTOR_MODE_IDLE ); + } + +void Actor::LookAt + ( + Event *ev + ) + + { + Entity *ent; + TurnTo *turnTo; + + if ( !ModeAllowed( ACTOR_MODE_SCRIPT ) ) + { + if ( mode == ACTOR_MODE_TALK ) + RepostEvent( ev, EV_Actor_LookAt ); + else if ( mode == ACTOR_MODE_AI ) + SendMoveDone( ev->GetThread() ); + return; + } + + StartMode( ACTOR_MODE_SCRIPT ); + + ent = ev->GetEntity( 1 ); + if ( ent && ent != world ) + { + turnTo = new TurnTo; + turnTo->SetTarget( ent ); + SetBehavior( turnTo, NULL, ev->GetThread() ); + } + } + +void Actor::TurnToEvent + ( + Event *ev + ) + + { + TurnTo *turnTo; + + if ( !ModeAllowed( ACTOR_MODE_SCRIPT ) ) + { + if ( mode == ACTOR_MODE_TALK ) + RepostEvent( ev, EV_Actor_TurnTo ); + else if ( mode == ACTOR_MODE_AI ) + SendMoveDone( ev->GetThread() ); + return; + } + + StartMode( ACTOR_MODE_SCRIPT ); + + turnTo = new TurnTo; + turnTo->SetDirection( ev->GetFloat( 1 ) ); + + SetBehavior( turnTo, NULL, ev->GetThread() ); + } + +void Actor::HeadWatchEvent + ( + Event *ev + ) + + { + Event *event; + + if ( !ModeAllowed( ACTOR_MODE_SCRIPT ) ) + { + if ( mode == ACTOR_MODE_TALK ) + RepostEvent( ev, EV_Actor_HeadWatch ); + else if ( mode == ACTOR_MODE_AI ) + SendMoveDone( ev->GetThread() ); + return; + } + + StartMode( ACTOR_MODE_SCRIPT ); + + event = new Event( EV_Behavior_Args ); + event->AddEntity( ev->GetEntity( 1 ) ); + + if ( ev->NumArgs() > 1 ) + event->AddFloat( ev->GetFloat( 2 ) ); + + SetBehavior( new HeadWatch, event, ev->GetThread() ); + } + +void Actor::ResetHeadEvent + ( + Event *ev + ) + + { + Event *event; + + if ( !ModeAllowed( ACTOR_MODE_SCRIPT ) ) + { + if ( mode == ACTOR_MODE_TALK ) + RepostEvent( ev, EV_Actor_ResetHead ); + else if ( mode == ACTOR_MODE_AI ) + SendMoveDone( ev->GetThread() ); + return; + } + + StartMode( ACTOR_MODE_SCRIPT ); + + event = new Event( EV_Behavior_Args ); + event->AddEntity( NULL ); + + if ( ev->NumArgs() > 0 ) + event->AddFloat( ev->GetFloat( 1 ) ); + + SetBehavior( new HeadWatch, event, ev->GetThread() ); + } + +void Actor::WalkTo + ( + Event *ev + ) + + { + Event *e; + + + if ( !ModeAllowed( ACTOR_MODE_SCRIPT ) ) + { + if ( mode == ACTOR_MODE_TALK ) + RepostEvent( ev, EV_Actor_WalkTo ); + else if ( mode == ACTOR_MODE_AI ) + SendMoveDone( ev->GetThread() ); + return; + } + + StartMode( ACTOR_MODE_SCRIPT ); + + e = new Event( EV_Behavior_Args ); + + e->SetSource( ev->GetSource() ); + + if ( ev->GetSource() == EV_FROM_SCRIPT ) + { + e->SetThread( ev->GetThread() ); + e->SetLineNumber( ev->GetLineNumber() ); + } + + if ( ev->NumArgs() > 1 ) + e->AddString( ev->GetString( 2 ) ); + else + e->AddString( "walk" ); + + if ( ev->NumArgs() > 0 ) + e->AddToken( ev->GetToken( 1 ) ); + + SetBehavior( new GotoPathNode, e, ev->GetThread() ); + } + +void Actor::WalkWatch + ( + Event *ev + ) + + { + Event *e; + + + if ( ev->NumArgs() < 2 ) + return; + + if ( !ModeAllowed( ACTOR_MODE_SCRIPT ) ) + { + if ( mode == ACTOR_MODE_TALK ) + RepostEvent( ev, EV_Actor_WalkWatch ); + else if ( mode == ACTOR_MODE_AI ) + SendMoveDone( ev->GetThread() ); + return; + } + + StartMode( ACTOR_MODE_SCRIPT ); + + e = new Event( EV_Behavior_Args ); + + e->SetSource( ev->GetSource() ); + + if ( ev->GetSource() == EV_FROM_SCRIPT ) + { + e->SetThread( ev->GetThread() ); + e->SetLineNumber( ev->GetLineNumber() ); + } + + // Get animation name + + if ( ev->NumArgs() > 2 ) + e->AddString( ev->GetString( 3 ) ); + else + e->AddString( "walk" ); + + // Get the node to walk to + + e->AddToken( ev->GetToken( 1 ) ); + + // Get the entity to watch + + e->AddEntity( ev->GetEntity( 2 ) ); + + SetBehavior( new GotoPathNode, e, ev->GetThread() ); + } + +void Actor::RunTo + ( + Event *ev + ) + + { + Event *e; + int i; + int n; + + if ( !ModeAllowed( ACTOR_MODE_SCRIPT ) ) + { + if ( mode == ACTOR_MODE_TALK ) + RepostEvent( ev, EV_Actor_RunTo ); + else if ( mode == ACTOR_MODE_AI ) + SendMoveDone( ev->GetThread() ); + return; + } + + StartMode( ACTOR_MODE_SCRIPT ); + + e = new Event( EV_Behavior_Args ); + + e->SetSource( ev->GetSource() ); + + if ( ev->GetSource() == EV_FROM_SCRIPT ) + { + e->SetThread( ev->GetThread() ); + e->SetLineNumber( ev->GetLineNumber() ); + } + + e->AddString( "run" ); + + n = ev->NumArgs(); + + for( i = 1; i <= n; i++ ) + { + e->AddToken( ev->GetToken( i ) ); + } + + SetBehavior( new GotoPathNode, e, ev->GetThread() ); + } + +void Actor::WarpTo + ( + Event *ev + ) + + { + PathNode *goal_node; + + if ( !ModeAllowed( ACTOR_MODE_SCRIPT ) ) + { + if ( mode == ACTOR_MODE_TALK ) + RepostEvent( ev, EV_Actor_WarpTo ); + return; + } + + if ( ev->NumArgs() > 0 ) + { + goal_node = AI_FindNode( ev->GetString( 1 ) ); + + if ( goal_node ) + { + origin = goal_node->origin; + setOrigin( origin ); + + angles = goal_node->angles; + setAngles( angles ); + + NoLerpThisFrame(); + } + } + } + +void Actor::PickupEnt + ( + Event *ev + ) + + { + Event *e; + + if ( !ModeAllowed( ACTOR_MODE_SCRIPT ) ) + { + if ( mode == ACTOR_MODE_TALK ) + RepostEvent( ev, EV_Actor_PickupEnt ); + else if ( mode == ACTOR_MODE_AI ) + SendMoveDone( ev->GetThread() ); + return; + } + + StartMode( ACTOR_MODE_SCRIPT ); + + e = new Event( EV_Behavior_Args ); + + e->SetSource( ev->GetSource() ); + + if ( ev->GetSource() == EV_FROM_SCRIPT ) + { + e->SetThread( ev->GetThread() ); + e->SetLineNumber( ev->GetLineNumber() ); + } + + e->AddEntity( ev->GetEntity( 1 ) ); + e->AddString( ev->GetString( 2 ) ); + + SetBehavior( new PickupEntity, e, ev->GetThread() ); + } + +void Actor::ThrowEnt + ( + Event *ev + ) + + { + Event *e; + + if ( !ModeAllowed( ACTOR_MODE_SCRIPT ) ) + { + if ( mode == ACTOR_MODE_TALK ) + RepostEvent( ev, EV_Actor_ThrowEnt ); + else if ( mode == ACTOR_MODE_AI ) + SendMoveDone( ev->GetThread() ); + return; + } + + StartMode( ACTOR_MODE_SCRIPT ); + + e = new Event( EV_Behavior_Args ); + + e->SetSource( ev->GetSource() ); + + if ( ev->GetSource() == EV_FROM_SCRIPT ) + { + e->SetThread( ev->GetThread() ); + e->SetLineNumber( ev->GetLineNumber() ); + } + + e->AddString( ev->GetString( 1 ) ); + + SetBehavior( new ThrowEntity, e, ev->GetThread() ); + } + +void Actor::AttackEntity + ( + Event *ev + ) + + { + Entity *ent; + + if ( ( deadflag ) && ( actortype != IS_INANIMATE ) ) + { + return; + } + + ent = ev->GetEntity( 1 ); + + // don't get mad at things that can't be hurt or the world + if ( + ent && + ( ent != world ) && + ( ent->takedamage != DAMAGE_NO ) + ) + + { + ClearEnemies(); + Stimuli( STIMULI_SCRIPT, ent, true ); + } + } + +void Actor::AttackPlayer + ( + Event *ev + ) + + { + int i; + gentity_t *ent; + + if ( !GetActorFlag( ACTOR_FLAG_STARTED ) ) + { + PostEvent( *ev, FRAMETIME ); + return; + } + + if ( ( deadflag ) && ( actortype != IS_INANIMATE ) ) + { + return; + } + + ClearEnemies(); + + // make enemies of all the players + for( i = 0; i < maxclients->integer; i++ ) + { + ent = &g_entities[ i ]; + if ( !ent->inuse || !ent->client || !ent->entity ) + { + continue; + } + + Stimuli( STIMULI_SCRIPT, ent->entity, true ); + } + } + +void Actor::JumpToEvent + ( + Event *ev + ) + + { + Event *e; + int i; + int n; + + if ( !ModeAllowed( ACTOR_MODE_SCRIPT ) ) + { + if ( mode == ACTOR_MODE_TALK ) + PostEvent( *ev, FRAMETIME ); + else if ( mode == ACTOR_MODE_AI ) + SendMoveDone( ev->GetThread() ); + return; + } + + StartMode( ACTOR_MODE_SCRIPT ); + + e = new Event( EV_Behavior_Args ); + + e->SetSource( ev->GetSource() ); + + if ( ev->GetSource() == EV_FROM_SCRIPT ) + { + e->SetThread( ev->GetThread() ); + e->SetLineNumber( ev->GetLineNumber() ); + } + + //e->AddString( "jump" ); + + n = ev->NumArgs(); + + for( i = 1; i <= n; i++ ) + { + e->AddToken( ev->GetToken( i ) ); + } + + SetBehavior( new JumpToPathNode, e, ev->GetThread() ); + } + +void Actor::GotoEvent + ( + Event *ev + ) + + { + // This command was added because it was a common mistake when writing actor scripts + // to say "local.self goto label". Since we're such nice guys, we'll print a warning + // and send it on the the calling thread. :) + ScriptThread *thread; + + thread = ev->GetThread(); + if ( thread ) + { + gi.DPrintf( "Actor recieved 'goto' command. Passing to thread.\n" ); + thread->ProcessEvent( ev ); + } + else + { + // should never happen, but say something anyways. + gi.DPrintf( "Actor recieved 'goto' command. Thread is NULL.\n" ); + } + } + +void Actor::RepostEvent + ( + Event *ev, + Event &event_type + ) + { + Event *event; + int i; + str token; + + event = new Event( event_type ); + + for( i = 1 ; i <= ev->NumArgs() ; i++ ) + { + token = ev->GetString( i ); + event->AddString( token.c_str() ); + } + + event->SetThread( ev->GetThread() ); + + PostEvent( event, FRAMETIME ); + } + +//*********************************************************************************************** +// +// Script conditionals +// +//*********************************************************************************************** + +void Actor::IfEnemyVisibleEvent + ( + Event *ev + ) + + { + ScriptThread *thread; + + thread = ev->GetThread(); + assert( thread ); + if ( !thread ) + { + return; + } + + if ( CanSeeEnemyFrom( origin ) ) + { + thread->ProcessCommandFromEvent( ev, 1 ); + } + } + +void Actor::IfNearEvent + ( + Event *ev + ) + + { + ScriptThread *thread; + Entity *ent; + Entity *bestent; + float bestdist; + float dist; + str name; + Vector delta; + float distance; + TargetList *tlist; + int n; + int i; + + thread = ev->GetThread(); + assert( thread ); + if ( !thread ) + { + return; + } + + name = ev->GetString( 1 ); + distance = ev->GetFloat( 2 ); + + if ( name[ 0 ] == '*' ) + { + ent = ev->GetEntity( 1 ); + if ( WithinDistance( ent, distance ) ) + { + SetVariable( "other", ent ); + thread->ProcessCommandFromEvent( ev, 3 ); + } + } + else if ( name[ 0 ] == '$' ) + { + bestent = NULL; + bestdist = distance * distance; + + tlist = world->GetTargetList( str( &name[ 1 ] ) ); + n = tlist->list.NumObjects(); + for( i = 1; i <= n; i++ ) + { + ent = tlist->list.ObjectAt( i ); + delta = centroid - ent->centroid; + dist = delta * delta; + if ( dist <= bestdist ) + { + bestent = ent; + bestdist = dist; + } + } + + if ( bestent ) + { + SetVariable( "other", bestent ); + thread->ProcessCommandFromEvent( ev, 3 ); + } + } + else + { + bestent = NULL; + bestdist = distance * distance; + + ent = NULL; + + for( ent = findradius( ent, origin, distance ) ; ent ; ent = findradius( ent, origin, distance ) ) + { + if ( ent->inheritsFrom( name.c_str() ) ) + { + delta = centroid - ent->centroid; + dist = delta * delta; + if ( dist <= bestdist ) + { + bestent = ent; + bestdist = dist; + } + } + } + + if ( bestent ) + { + SetVariable( "other", bestent ); + thread->ProcessCommandFromEvent( ev, 3 ); + } + } + } + +void Actor::IfCanHideAtEvent + ( + Event *ev + ) + + { + PathNode *node; + Vector pos; + ScriptThread *thread; + + thread = ev->GetThread(); + assert( thread ); + if ( !thread ) + { + return; + } + + pos = ev->GetVector( 1 ); + node = PathManager.NearestNode( pos, this ); + + if ( node && ( node->nodeflags & ( AI_DUCK | AI_COVER ) ) && !CanSeeEnemyFrom( pos ) ) + { + if ( !node->entnum || ( node->entnum == entnum ) || ( node->occupiedTime < level.time ) ) + { + thread->ProcessCommandFromEvent( ev, 2 ); + } + } + } + +void Actor::IfEnemyWithinEvent + ( + Event *ev + ) + + { + ScriptThread *thread; + + if ( !currentEnemy ) + { + return; + } + + thread = ev->GetThread(); + assert( thread ); + if ( !thread ) + { + return; + } + + if ( WithinDistance( currentEnemy, ev->GetFloat( 1 ) ) ) + { + thread->ProcessCommandFromEvent( ev, 2 ); + } + } + +//*********************************************************************************************** +// +// Sound reaction functions +// +//*********************************************************************************************** + +void Actor::NoPainSounds + ( + Event *ev + ) + + { + SetActorFlag( ACTOR_FLAG_NO_PAIN_SOUNDS, true ); + } + +void Actor::HeardSound + ( + Event *ev + ) + + { + Vector location; + + location = ev->GetVector( 2 ); + + Stimuli( STIMULI_SOUND, location ); + } + +qboolean Actor::IgnoreSounds + ( + void + ) + + { + if ( GetActorFlag( ACTOR_FLAG_NEVER_IGNORE_SOUNDS ) ) + return false; + + if ( currentEnemy && flags & FL_THINK ) + return true; + + if ( !( stimuli & STIMULI_SOUND ) ) + return true; + + return false; + } + +void Actor::NeverIgnoreSounds + ( + Event *ev + ) + { + SetActorFlag( ACTOR_FLAG_NEVER_IGNORE_SOUNDS, true ); + } + +//*********************************************************************************************** +// +// Pain and death related functions +// +//*********************************************************************************************** + +void Actor::Pain + ( + Event *ev + ) + + { + float damage; + Entity *ent; + int mod; + Vector direction; + Vector position; + Vector dir; + State *tempState; + + + damage = ev->GetFloat( 1 ); + ent = ev->GetEntity( 2 ); + mod = ev->GetInteger( 3 ); + position = ev->GetVector( 4 ); + direction = ev->GetVector( 5 ); + + // Add to the players action level + + if ( damage && !deadflag && ent && ent->isSubclassOf( Player ) ) + { + Player *player = (Player *)ent; + + player->IncreaseActionLevel( damage / 4 ); + } + + if ( deadflag ) + { + // Do gib stuff + + if ( statemap ) + { + tempState = statemap->FindState( "GIB" ); + + if ( tempState ) + tempState = tempState->Evaluate( *this, &conditionals ); + + if ( tempState ) + { + tempState->ProcessEntryCommands( this ); + } + } + return; + } + + if ( damage > 0 && next_pain_sound_time <= level.time && !GetActorFlag( ACTOR_FLAG_NO_PAIN_SOUNDS ) ) + { + next_pain_sound_time = level.time + 0.4 + G_Random( 0.2 ); + BroadcastSound(); + } + + if ( !GetActorFlag( ACTOR_FLAG_ALLOWED_TO_KILL ) && ent && ent->isSubclassOf( Player ) ) + { + if ( damage >= pain_threshold ) + G_MissionFailed(); + } + else + { + if ( ShouldAttackEntity( ent ) ) + Stimuli( STIMULI_PAIN, ent, true ); + else + StimuliNoAttack( STIMULI_PAIN ); + } + + if ( mod == MOD_BULLET && behavior && currentBehavior == "Pain" ) + { + bullet_hits++; + } + + // Determine which pain flags to set + + AddStateFlag( STATE_FLAG_SMALL_PAIN ); + + if ( damage < pain_threshold ) + { + if ( G_Random( 1 ) < damage / pain_threshold ) + { + if ( means_of_death == MOD_SWORD || means_of_death == MOD_AXE || means_of_death == MOD_FIRESWORD || + means_of_death == MOD_ELECTRICSWORD ) + pain_type = PAIN_BIG; + else + pain_type = PAIN_SMALL; + AddStateFlag( STATE_FLAG_IN_PAIN ); + } + } + else + { + pain_type = PAIN_BIG; + AddStateFlag( STATE_FLAG_IN_PAIN ); + } + + // Determine pain angles + + if ( Vector( position - centroid ).length() > 1 ) + dir = centroid - position; + else + dir = direction; + + dir = dir * -1; + + pain_angles = dir.toAngles(); + + pain_angles[YAW] = AngleNormalize180( angles[YAW] - pain_angles[YAW] ); + pain_angles[PITCH] = AngleNormalize180( angles[PITCH] - pain_angles[PITCH] ); + } + +void Actor::StunEvent + ( + Event *ev + ) + + { + float time; + + time = ev->GetFloat( 1 ); + + SetActorFlag( ACTOR_FLAG_STUNNED, true ); + + stunned_end_time = level.time + time; + } + +void Actor::CheckStun + ( + void + ) + + { + if ( GetActorFlag( ACTOR_FLAG_STUNNED ) && stunned_end_time <= level.time ) + SetActorFlag( ACTOR_FLAG_STUNNED, false ); + } + +void Actor::Dead + ( + Event *ev + ) + + { + Vector min, max; + + // stop animating + StopAnimatingAtEnd(); + + edict->s.eFlags |= EF_DONT_PROCESS_COMMANDS; + + if ( !groundentity && ( velocity != vec_zero ) && ( movetype != MOVETYPE_STATIONARY ) ) + { + // wait until we hit the ground + PostEvent( EV_Actor_Dead, FRAMETIME ); + return; + } + + // don't allow them to fly, think, or swim anymore + flags &= ~( FL_THINK | FL_SWIM | FL_FLY ); + + deadflag = DEAD_DEAD; + setMoveType( MOVETYPE_NONE ); + setOrigin( origin ); + + if ( trigger ) + { + trigger->ProcessEvent( EV_Remove ); + } + + if ( spawnparent ) + PostEvent( EV_Actor_Fade, .5 ); + else + PostEvent( EV_Actor_Fade, 10 ); + } + +void Actor::KilledEffects + ( + Entity *attacker + ) + + { + Entity *ent; + Event *event; + str target_name; + + if ( g_debugtargets->integer ) + { + G_DebugTargets( this, "Actor::KilledEffects" ); + } + + // + // kill the killtargets + // + target_name = KillTarget(); + if ( target_name && strcmp( target_name, "" ) ) + { + ent = NULL; + do + { + ent = G_FindTarget( ent, target_name ); + if ( !ent ) + { + break; + } + ent->PostEvent( EV_Remove, 0 ); + } + while ( 1 ); + } + + // + // fire targets + // + target_name = Target(); + if ( target_name && strcmp( target_name, "" ) ) + { + ent = NULL; + do + { + ent = G_FindTarget( ent, target_name ); + if ( !ent ) + { + break; + } + + event = new Event( EV_Activate ); + event->AddEntity( attacker ); + ent->PostEvent( event, 0 ); + } + while ( 1 ); + } + // + // see if we have a kill_thread + // + if ( kill_thread.length() > 1 ) + { + ScriptThread * thread; + + // + // create the thread, but don't start it yet + // + thread = ExecuteThread( kill_thread, false ); + if ( thread ) + { + ProcessScript( thread, NULL ); + } + else + { + warning( "Killed", "could not process kill_thread" ); + } + } + } + +void Actor::Killed + ( + Event *ev + ) + + { + Vector position; + ClassDef *cls; + str deathanim; + str newdeathanim; + Entity *attacker; + float damage; + + + attacker = ev->GetEntity( 1 ); + damage = ev->GetFloat( 2 ); + + if ( !GetActorFlag( ACTOR_FLAG_ALLOWED_TO_KILL ) && attacker && attacker->isSubclassOf( Player ) ) + G_MissionFailed(); + + // Update boss health if necessary + + if ( GetActorFlag( ACTOR_FLAG_UPDATE_BOSS_HEALTH ) && max_boss_health ) + { + char bosshealth_string[20]; + sprintf( bosshealth_string, "%.5f", health / max_boss_health ); + gi.cvar_set( "bosshealth", bosshealth_string ); + } + + // Add to the players action level + + if ( damage && attacker && attacker->isSubclassOf( Player ) ) + { + Player *player = (Player *)attacker; + + player->IncreaseActionLevel( damage / 4 ); + } + + KilledEffects( attacker ); + + if ( next_pain_sound_time <= level.time && !GetActorFlag( ACTOR_FLAG_NO_PAIN_SOUNDS ) ) + { + next_pain_sound_time = level.time + 0.4 + G_Random( 0.2 ); + BroadcastSound(); + } + + if ( !GetActorFlag( ACTOR_FLAG_DIE_COMPLETELY ) ) + return; + + // See if means of death should be bumped up from MOD_BULLET to MOD_FAST_BULLET + + if ( means_of_death == MOD_BULLET ) + { + if ( bullet_hits < 5 ) + bullet_hits = 0; + + if ( G_Random( 100 ) < bullet_hits * 10 ) + means_of_death = MOD_FAST_BULLET; + } + + // Make sure all bones are put back in their normal positions + + if ( edict->s.bone_tag[ ACTOR_MOUTH_TAG ] != -1 ) + SetControllerAngles( ACTOR_MOUTH_TAG, vec_zero ); + + if ( edict->s.bone_tag[ ACTOR_HEAD_TAG ] != -1 ) + SetControllerAngles( ACTOR_HEAD_TAG, vec_zero ); + + if ( edict->s.bone_tag[ ACTOR_TORSO_TAG ] != -1 ) + SetControllerAngles( ACTOR_TORSO_TAG, vec_zero ); + + // Stop behavior + + cls = getClass( "idle" ); + SetBehavior( ( Behavior * )cls->newInstance() ); + + // don't allow them to fly or swim anymore + flags &= ~( FL_SWIM | FL_FLY ); + + deadflag = DEAD_DYING; + + groundentity = NULL; + + edict->svflags |= SVF_DEADMONSTER; + + if ( !GetActorFlag( ACTOR_FLAG_STAYSOLID ) ) + { + edict->clipmask = MASK_DEADSOLID; + + if ( edict->solid != SOLID_NOT ) + setContents( CONTENTS_CORPSE ); + } + + // Stop the actor from talking + + if ( GetActorFlag( ACTOR_FLAG_DIALOG_PLAYING ) ) + { + CancelEventsOfType( EV_SetControllerAngles ); + StopSound( CHAN_DIALOG ); + } + + // Setup the default death animation + + deathanim = "death"; + + // See if this actor has a death state in its state machine + + if ( statemap ) + { + int count = 0; + State *temp_state; + State *last_temp_state = NULL; + str temp_anim; + + temp_state = statemap->FindState( "DEATH" ); + + if ( temp_state ) + { + do + { + count++; + if ( count > 10 ) + { + gi.Error( ERR_DROP, "Stopping due to possible infinite state loop in death state\n" ); + break; + } + + // Process the current state + + if ( last_temp_state != temp_state ) + { + // Get the new animation name + + temp_anim = temp_state->getLegAnim( *this, &conditionals ); + + if ( temp_anim.length() ) + newdeathanim = temp_anim; + + // Process exit commands of the last state + + if ( last_temp_state ) + last_temp_state->ProcessExitCommands( this ); + + // Process the entry commands of the new state + + temp_state->ProcessEntryCommands( this ); + } + + // Determine the next state to go to + + last_temp_state = temp_state; + temp_state = temp_state->Evaluate( *this, &conditionals ); + } + while ( last_temp_state != temp_state ); + } + + if ( newdeathanim.length() > 0 ) + deathanim = newdeathanim; + } + + // Play the death animation + + SetAnim( deathanim, EV_Actor_Dead ); + ChangeAnim(); + + // See if we were spawned by another actor + + if ( spawnparent ) + { + spawnparent->num_of_spawns--; + } + + // See if we should notify others + + if ( GetActorFlag( ACTOR_FLAG_NOTIFY_OTHERS_AT_DEATH ) ) + NotifyOthersOfDeath(); + + SpawnItems(); + + if ( means_of_death == MOD_GIB ) + { + Event *event; + int i; + + if ( blood_model.length() == 0 ) + blood_model = "fx_bspurt.tik"; + + if ( max_gibs == 0 ) + max_gibs = 4; + + for( i = 0 ; i < 4 ; i++ ) + { + event = new Event( EV_Sentient_SpawnBloodyGibs ); + event->AddInteger( max_gibs ); + ProcessEvent( event ); + } + + PostEvent( EV_Remove, 0 ); + } + } + +void Actor::SetDieCompletely + ( + Event *ev + ) + { + SetActorFlag( ACTOR_FLAG_DIE_COMPLETELY, ev->GetBoolean( 1 ) ); + } + +void Actor::SetBleedAfterDeath + ( + Event *ev + ) + { + SetActorFlag( ACTOR_FLAG_BLEED_AFTER_DEATH, ev->GetBoolean( 1 ) ); + } + +void Actor::SpawnGib + ( + Event *ev + ) + { + RealSpawnGib( false, ev ); + } + +void Actor::SpawnGibAtTag + ( + Event *ev + ) + { + RealSpawnGib( true, ev ); + } + +void Actor::RealSpawnGib + ( + qboolean use_tag, + Event *ev + ) + { + str tag_name; + Gib *gib; + Mover *ent = NULL; + Vector final_gib_offset; + Vector orig; + Vector dir; + int current_arg; + float final_pitch; + float vel; + trace_t trace; + float time; + float pitch_change; + float pitch_vel; + str attach_tag_name; + Vector offset; + str cap_name; + float width; + const char *current_arg_str; + int current_surface; + const char *current_surface_name; + qboolean use_blood; + str blood_name; + str blood_splat_name; + str blood_model_name; + float blood_splat_size; + Vector gib_mins; + Vector gib_maxs; + float m; + qboolean at_least_one_visible_surface = false; + int surface_length; + int tagnum; + orientation_t or; + float raw_offset; + Vector raw_offset_dir; + Vector real_tag_pos; + Vector real_tag_dir; + Vector real_tag_angles; + + + SetActorFlag( ACTOR_FLAG_SPAWN_FAILED, true ); + + if ( !com_blood->integer ) + return; + + if ( GetActorFlag( ACTOR_FLAG_FADING_OUT ) ) + return; + + if ( ev->NumArgs() < 5 ) + return; + + if ( use_tag ) + { + attach_tag_name = ev->GetString( 1 ); + raw_offset = ev->GetFloat( 2 ); + width = ev->GetFloat( 3 ); + + // Get all the tag information + + tagnum = gi.Tag_NumForName( edict->s.modelindex, attach_tag_name.c_str() ); + + if ( tagnum == -1 ) + return; + + GetRawTag( tagnum, &or ); + GetTag( tagnum, &real_tag_pos, &real_tag_dir ); + + real_tag_angles = real_tag_dir.toAngles(); + + // Determine the final pitch of the gib + + final_pitch = AngleNormalize180( angles[PITCH] - real_tag_angles[PITCH] ); + + // Determine the offset of the gib + + raw_offset_dir = or.axis[0]; + + offset = or.origin; + offset += raw_offset * raw_offset_dir; + MatrixTransformVector( offset, orientation, orig ); + orig += origin; + } + else + { + offset = ev->GetVector( 1 ); + final_pitch = ev->GetFloat( 2 ); + width = ev->GetFloat( 3 ); + + MatrixTransformVector( offset, orientation, orig ); + orig += origin; + } + + // Determine the mass + + m = mass; + + if ( m < 50 ) + m = 50; + else if ( m > 250 ) + m = 250; + + // Determine which blood spurt & splat to use for the gib + + blood_name = GetBloodSpurtName(); + blood_splat_name = GetBloodSplatName(); + blood_splat_size = GetBloodSplatSize(); + + if ( blood_name.length() && blood_splat_name.length() ) + use_blood = true; + else + use_blood = false; + + if ( GetActorFlag( ACTOR_FLAG_BLEED_AFTER_DEATH ) ) + blood_model_name = blood_model; + + // Get the mins and maxs for this gib + + gib_mins = Vector( -width, -width, -width ); + gib_maxs = Vector( width, width, width ); + + // Make sure we can spawn in a gib here + + trace = G_Trace( orig, gib_mins, gib_maxs, orig, NULL, MASK_DEADSOLID, false, "spawngib" ); + + if ( trace.allsolid || trace.startsolid ) + return; + + // Make sure at least one of the surfaces is not hidden + + for( current_arg = 5 ; current_arg <= ev->NumArgs() ; current_arg++ ) + { + current_arg_str = ev->GetString( current_arg ); + + for( current_surface = 0 ; current_surface < numsurfaces ; current_surface++ ) + { + current_surface_name = gi.Surface_NumToName( edict->s.modelindex, current_surface ); + + if ( current_arg_str[ strlen( current_arg_str ) - 1 ] == '*' ) + surface_length = strlen( current_arg_str ) - 1; + else + surface_length = strlen( current_arg_str ); + + if ( Q_stricmpn( current_surface_name, current_arg_str, surface_length ) == 0 ) + { + if ( !( edict->s.surfaces[ current_surface ] & MDL_SURFACE_NODRAW ) ) + at_least_one_visible_surface = true; + } + } + } + + if ( !at_least_one_visible_surface ) + return; + + // Determine time till it hits the ground + + vel = 100 + G_Random( 200 * ( 2 - ( (m - 50) / 200) ) ); + + time = SpawnGetTime( vel , orig, gib_mins, gib_maxs ); + + // Flip final pitch 180 degrees? + + if ( G_Random() > .5 ) + { + final_pitch += 180; + final_pitch = AngleNormalize360( final_pitch ); + } + + // Calculate the pitch change and velocity + + pitch_change = AngleNormalize180( final_pitch - angles[PITCH] ); + pitch_vel = pitch_change / time; + + // Spawn in the hidden gib + + gib = new Gib( "", use_blood, blood_name, blood_model_name, blood_splat_name, blood_splat_size, final_pitch ); + + gib->setOrigin( orig ); + + gib->angles[PITCH] = angles[PITCH]; + gib->angles[ROLL] = 0; + + if ( use_tag ) + gib->angles[YAW] = real_tag_angles[YAW]; + else + gib->angles[YAW] = angles[YAW]; + + gib->setAngles( gib->angles ); + + gib->velocity = Vector( G_CRandom( 150 * ( 2 - ( (m - 50) / 200) ) ), G_CRandom( 150 * ( 2 - ( (m - 50) / 200) ) ), vel ); + gib->avelocity = Vector( pitch_vel, G_CRandom( 300 ), 0 ); + + gib->setSize( gib_mins, gib_maxs ); + + gib->edict->svflags |= SVF_DEADMONSTER; + gib->edict->clipmask = MASK_DEADSOLID; + + gib->setSolidType( SOLID_BBOX ); + gib->setContents( CONTENTS_SHOOTABLE_ONLY ); + gib->link(); + + // Spawn in the visible gib + + ent = new Mover; + ent->setModel( model ); + + // Make sure the init stuff in the tiki get processed now + + //ent->ProcessPendingEvents(); + ent->CancelPendingEvents(); + + // Make sure no cleint side commands are processed + + ent->edict->s.eFlags |= EF_DONT_PROCESS_COMMANDS; + + // Set the animation to the current anim & frame of the actor + + ent->RandomAnimate( AnimName() ); + ent->SetFrame( CurrentFrame() ); + + ent->setAngles( angles ); + ent->bind( gib, true ); + ent->gravity = 0; + + final_gib_offset = offset * -1; + ent->setOrigin( final_gib_offset ); + + ent->setMoveType( MOVETYPE_BOUNCE ); + ent->setSolidType( SOLID_NOT ); + ent->showModel(); + + // Hide all of the surfaces on the gib + + ent->SurfaceCommand( "all", "+nodraw" ); + + cap_name = ev->GetString( 4 ); + + // Show the cap surface on the gib and the actor + + if ( cap_name.length() ) + { + ent->SurfaceCommand( cap_name.c_str(), "-nodraw" ); + + SurfaceCommand( cap_name.c_str(), "-nodraw" ); + } + + // Show and hide all of the rest of the necessary surfaces + + for ( current_arg = 5 ; current_arg <= ev->NumArgs() ; current_arg++ ) + { + current_arg_str = ev->GetString( current_arg ); + + if ( current_arg_str[ strlen( current_arg_str ) - 1 ] == '*' ) + surface_length = strlen( current_arg_str ) - 1; + else + surface_length = strlen( current_arg_str ); + + for( current_surface = 0 ; current_surface < numsurfaces ; current_surface++ ) + { + current_surface_name = gi.Surface_NumToName( edict->s.modelindex, current_surface ); + + if ( Q_stricmpn( current_surface_name, current_arg_str, surface_length ) == 0 ) + { + if ( !( edict->s.surfaces[ current_surface ] & MDL_SURFACE_NODRAW ) ) + { + // Show this surface on the gib + ent->SurfaceCommand( current_surface_name, "-nodraw" ); + + // Hide this surface on the actor + SurfaceCommand( current_surface_name, "+nodraw" ); + } + } + } + } + + // Make sure the gibs go away after a while + + if ( GetActorFlag( ACTOR_FLAG_DEATHFADE ) ) + { + ent->PostEvent( EV_Fade, 10 ); + gib->PostEvent( EV_Fade, 10.5 ); + } + else if ( GetActorFlag( ACTOR_FLAG_DEATHSHRINK ) ) + { + ent->PostEvent( EV_FadeOut, 10 ); + gib->PostEvent( EV_FadeOut, 10.5 ); + } + else + { + ent->PostEvent( EV_Unbind, 10 ); + ent->PostEvent( EV_DeathSinkStart, 12 ); + gib->PostEvent( EV_Remove, 10.5 ); + } + + // Mark the spawn as being successful + + SetActorFlag( ACTOR_FLAG_SPAWN_FAILED, false ); + + // Play the severed sound + + ent->Sound( "impact_sever", CHAN_BODY ); + } + +void Actor::SpawnNamedGib + ( + Event *ev + ) + { + str gib_name; + str tag_name; + Gib *gib; + Vector orig; + float final_pitch; + float vel; + trace_t trace; + float time; + float pitch_change; + float pitch_vel; + float width; + Vector gib_mins; + Vector gib_maxs; + + + SetActorFlag( ACTOR_FLAG_SPAWN_FAILED, true ); + + if ( !com_blood->integer ) + return; + + if ( GetActorFlag( ACTOR_FLAG_FADING_OUT ) ) + return; + + // Get all of the parameters + + gib_name = ev->GetString( 1 ); + tag_name = ev->GetString( 2 ); + final_pitch = ev->GetFloat( 3 ); + width = ev->GetFloat( 4 ); + + // Get the tag position + + GetTag( tag_name, &orig ); + + // Get the mins and maxs for this gib + + gib_mins = Vector( -width, -width, -width ); + gib_maxs = Vector( width, width, width ); + + // Make sure we can spawn in a gib here + + trace = G_Trace( orig, gib_mins, gib_maxs, orig, NULL, MASK_DEADSOLID, false, "spawnnamedgib1" ); + + if ( trace.allsolid || trace.startsolid ) + SetActorFlag( ACTOR_FLAG_SPAWN_FAILED, true ); + + // Determine time till it hits the ground + + vel = 200 + G_Random( 200 ); + + time = SpawnGetTime( vel , orig, gib_mins, gib_maxs ); + + pitch_change = AngleNormalize180( final_pitch - angles[PITCH] ); + pitch_vel = pitch_change / time; + + // Spawn the gib + + gib = new Gib( gib_name, false, "", "", "", final_pitch ); + + gib->setOrigin( orig ); + gib->setAngles( angles ); + + gib->velocity = Vector( G_CRandom( 100 ), G_CRandom( 100 ), vel ); + gib->avelocity = Vector( pitch_vel, G_CRandom( 300 ), 0 ); + + gib->edict->svflags |= SVF_DEADMONSTER; + gib->edict->clipmask = MASK_DEADSOLID; + + gib->setSolidType( SOLID_BBOX ); + gib->setContents( CONTENTS_CORPSE ); + + // Make sure the gib goes away after a while + + if ( GetActorFlag( ACTOR_FLAG_DEATHFADE ) ) + gib->PostEvent( EV_Fade, 10 ); + else if ( GetActorFlag( ACTOR_FLAG_DEATHSHRINK ) ) + gib->PostEvent( EV_FadeOut, 10 ); + else + gib->PostEvent( EV_DeathSinkStart, 10 ); + + // Mark the spawn as being successful + + SetActorFlag( ACTOR_FLAG_SPAWN_FAILED, false ); + } + +float Actor::SpawnGetTime( float vel, Vector orig, Vector gib_mins, Vector gib_maxs ) + { + float grav; + Vector end_pos; + Vector dir; + float time; + float other; + trace_t trace; + float dist; + + grav = -sv_gravity->value; + + end_pos = orig; + end_pos[2] = -10000; + + trace = G_Trace( orig, gib_mins, gib_maxs, end_pos, NULL, MASK_DEADSOLID, false, "SpawnGetTime" ); + + end_pos = trace.endpos; + + dir = end_pos - orig; + dist = dir.length(); + + time = ( (grav / -20) - vel ) / grav; + + other = sqrt( (grav / 20 + vel) * (grav / 20 + vel) - (2 * grav * dist) ); + + time = time - other / grav; + + return time; + } + +void Actor::SpawnBlood + ( + Event *ev + ) + { + str blood_name; + str tag_name; + qboolean use_last_result = false; + Event *attach_event; + + + if ( !com_blood->integer ) + return; + + blood_name = ev->GetString( 1 ); + tag_name = ev->GetString( 2 ); + + // See if we care about the last spawn working or not + + if ( ev->NumArgs() > 2 ) + use_last_result = ev->GetBoolean( 3 ); + + if ( use_last_result && GetActorFlag( ACTOR_FLAG_SPAWN_FAILED ) ) + return; + + // Spawn the blood + + attach_event = (Event *)new Event( EV_AttachModel ); + + attach_event->AddString( blood_name ); + attach_event->AddString( tag_name ); + attach_event->AddInteger( 1 ); + attach_event->AddString( "" ); + attach_event->AddInteger( 0 ); + attach_event->AddInteger( 5 ); + PostEvent( attach_event, 0 ); + } + +void Actor::RemoveUselessBody + ( + Event *ev + ) + + { + /* if ( trig ) + { + trig->PostEvent( EV_Remove, 0 ); + trig = NULL; + } */ + + CancelEventsOfType( EV_Sentient_UselessCheck ); + PostEvent( EV_FadeOut, 5); + } + +void Actor::SetPainThresholdEvent + ( + Event *ev + ) + + { + //pain_threshold = ( ev->GetFloat( 1 ) ) * skill->value * 0.66f; + pain_threshold = ( ev->GetFloat( 1 ) ); + } + +void Actor::SetKillThreadEvent + ( + Event *ev + ) + + { + kill_thread = ev->GetString( 1 ); + } + +void Actor::DeathFadeEvent + ( + Event *ev + ) + + { + SetActorFlag( ACTOR_FLAG_DEATHFADE, true ); + } + +void Actor::DeathShrinkEvent + ( + Event *ev + ) + + { + SetActorFlag( ACTOR_FLAG_DEATHSHRINK, true ); + } + +void Actor::DeathSinkEvent + ( + Event *ev + ) + + { + SetActorFlag( ACTOR_FLAG_DEATHSINK, true ); + } + +void Actor::StaySolidEvent + ( + Event *ev + ) + + { + SetActorFlag( ACTOR_FLAG_STAYSOLID, true ); + } + +void Actor::Suicide + ( + Event *ev + ) + + { + Event *event; + qboolean use_last_mod; + + health = 0; + + if ( ev->NumArgs() > 0 ) + use_last_mod = ev->GetBoolean( 1 ); + else + use_last_mod = false; + + if ( !use_last_mod ) + means_of_death = MOD_SUICIDE; + + event = new Event( EV_Killed ); + event->AddEntity( this ); + event->AddInteger( 0 ); + event->AddEntity( this ); + event->AddInteger( MOD_SUICIDE ); + ProcessEvent( event ); + } + +void Actor::SetDeathSize + ( + Event *ev + ) + + { + Vector death_min; + Vector death_max; + trace_t trace; + + death_min = ev->GetVector( 1 ); + death_max = ev->GetVector( 2 ); + + // Make sure actor will not be stuck if we change the bounding box + + trace = G_Trace( origin, death_min, death_max, origin, this, edict->clipmask, false, "Actor::SetDeathSize" ); + + if ( !trace.startsolid ) + { + setSize( death_min, death_max ); + return; + } + + // Try again, calculate a smaller death bounding box + + death_min = (death_min + mins) * .5; + death_max = (death_max + maxs) * .5; + + trace = G_Trace( origin, death_min, death_max, origin, this, edict->clipmask, false, "Actor::SetDeathSize2" ); + + if ( !trace.startsolid ) + setSize( death_min, death_max ); + } + +void Actor::FadeEvent + ( + Event *ev + ) + { + SetActorFlag( ACTOR_FLAG_FADING_OUT, true ); + + if ( GetActorFlag( ACTOR_FLAG_DEATHFADE ) ) + ProcessEvent( EV_Fade ); + else if ( GetActorFlag( ACTOR_FLAG_DEATHSHRINK ) ) + ProcessEvent( EV_FadeOut ); + else if ( GetActorFlag( ACTOR_FLAG_DEATHSINK ) ) + ProcessEvent( EV_DeathSinkStart ); + else + SetActorFlag( ACTOR_FLAG_FADING_OUT, false ); + } + +//*********************************************************************************************** +// +// Movement functions +// +//*********************************************************************************************** + +void Actor::SimplePathfinding + ( + Event *ev + ) + { + SetActorFlag( ACTOR_FLAG_SIMPLE_PATHFINDING, true ); + } + +void Actor::SetCanWalkOnOthers + ( + Event *ev + ) + + { + SetActorFlag( ACTOR_FLAG_CAN_WALK_ON_OTHERS, true ); + } + +void Actor::SetFeetWidth + ( + Event *ev + ) + + { + feet_width = ev->GetFloat( 1 ); + } + +void Actor::ForwardSpeedEvent + ( + Event *ev + ) + + { + forwardspeed = ev->GetFloat( 1 ); + } + +void Actor::SwimEvent + ( + Event *ev + ) + + { + flags &= ~FL_FLY; + flags |= FL_SWIM; + } + +void Actor::FlyEvent + ( + Event *ev + ) + + { + if ( ev->NumArgs() == 0 ) + { + // Turn flying on + flags &= ~FL_SWIM; + flags |= FL_FLY; + } + else + { + if ( ev->GetBoolean( 1 ) ) + { + // Turn flying on + flags &= ~FL_SWIM; + flags |= FL_FLY; + } + else + { + // Turn flying off + flags &= ~FL_FLY; + } + } + } + +void Actor::NotLandEvent + ( + Event *ev + ) + + { + flags &= FL_SWIM | FL_FLY; + } + +qboolean Actor::CanMoveTo + ( + Vector pos + ) + + { + Vector min; + trace_t trace; + Vector start; + Vector end; + Vector s; + + s = Vector( 0, 0, STEPSIZE ); + start = origin + s; + end = pos + s; + trace = G_Trace( start, mins, maxs, end, this, edict->clipmask, false, "Actor::CanMoveTo" ); + if ( trace.fraction == 1 ) + { + return true; + } + return false; + } + +qboolean Actor::CanWalkTo + ( + Vector pos, + int entnum + ) + + { + trace_t trace; + Vector dir; + float length; + float i; + float j; + Vector bottom; + Vector current_loc; + Vector last_loc; + float trace_step; + float small_trace_step; + float last_height; + Vector real_pos; + + + // Calculate the real position we have to get to + + if ( entnum != ENTITYNUM_NONE ) + { + Vector temp_dir; + float temp_length; + + temp_dir = pos - origin; + temp_length = temp_dir.length(); + + temp_length -= sqrt( maxs.x * maxs.x * 2 ) + 5; + + if ( temp_length < 0 ) + temp_length = 0; + + temp_dir.normalize(); + temp_dir *= temp_length; + + real_pos = origin + temp_dir; + } + else + { + real_pos = pos; + } + + + // Do simple CanWalkTo if specified + + if ( GetActorFlag( ACTOR_FLAG_SIMPLE_PATHFINDING ) ) + { + current_loc = origin; + current_loc[2] += STEPSIZE; + last_loc = real_pos; + last_loc[2] += STEPSIZE; + trace = G_Trace( current_loc, mins, maxs, last_loc, this, MASK_PATHSOLID, false, "Actor::CanWalkTo_Simple" ); + + if ( trace.fraction == 1 ) + return true; + else + return false; + } + + // Find the vector to walk + + dir = real_pos - origin; + length = dir.length(); + dir.normalize(); + + // Find the step amount + + trace_step = maxs[0] * 2; + + // Make sure trace_step is divisible by 8 + + trace_step = ( (int)(trace_step / 8 ) ) * 8; + + if ( trace_step < 8 ) + trace_step = 8; + + small_trace_step = 8; + + // Test each step to see if the ground is not too far below + + last_height = origin[2]; + + for( i = 0 ; i < length ; i += trace_step ) + { + last_loc = current_loc; + + current_loc = origin + dir * i; + current_loc[2] = last_height + STEPSIZE; + + bottom = current_loc; + + if ( !GetActorFlag( ACTOR_FLAG_ALLOW_FALL ) ) + bottom[2] = last_height - STEPSIZE; + else + bottom[2] = last_height - 1000; + + trace = G_Trace( current_loc, mins, maxs, bottom, this, MASK_PATHSOLID, false, "Actor::CanWalkTo1" ); + + if ( !( trace.fraction == 1 || trace.startsolid || trace.allsolid ) && feet_width ) + { + Vector temp_mins; + Vector temp_maxs; + Vector saved_endpos; + + saved_endpos = trace.endpos; + + temp_mins[0] = -feet_width; + temp_mins[1] = -feet_width; + temp_mins[2] = mins[2]; + + temp_maxs[0] = feet_width; + temp_maxs[1] = feet_width; + temp_maxs[2] = maxs[2]; + + trace = G_Trace( current_loc, temp_mins, temp_maxs, bottom, this, MASK_PATHSOLID, false, "Actor::CanWalkTo2" ); + + saved_endpos.copyTo( trace.endpos ); + } + + if ( trace.fraction == 1 || trace.startsolid || trace.allsolid ) + { + // The wide one failed, do the small traces for this segment + + if ( i == 0 || trace_step == small_trace_step ) + return false; + + for( j = small_trace_step ; j <= trace_step ; j += small_trace_step ) + { + current_loc = last_loc + dir * j; + current_loc[2] = last_height + STEPSIZE; + + bottom = current_loc; + bottom[2] = last_height - STEPSIZE; + + trace = G_Trace( current_loc, mins, maxs, bottom, this, MASK_PATHSOLID, false, "Actor::CanWalkTo3" ); + + if ( trace.fraction == 1 || trace.startsolid || trace.allsolid || + ( trace.ent && trace.ent->entity->isSubclassOf( Sentient ) && !GetActorFlag( ACTOR_FLAG_CAN_WALK_ON_OTHERS ) ) ) + return false; + + if ( feet_width ) + { + Vector temp_mins; + Vector temp_maxs; + Vector saved_endpos; + + saved_endpos = trace.endpos; + + temp_mins[0] = -feet_width; + temp_mins[1] = -feet_width; + temp_mins[2] = mins[2]; + + temp_maxs[0] = feet_width; + temp_maxs[1] = feet_width; + temp_maxs[2] = maxs[2]; + + trace = G_Trace( current_loc, temp_mins, temp_maxs, bottom, this, MASK_PATHSOLID, false, "Actor::CanWalkTo4" ); + + saved_endpos.copyTo( trace.endpos ); + } + + last_height = trace.endpos[2]; + } + } + + last_height = trace.endpos[2]; + } + + if ( last_height > pos.z + STEPSIZE * 2 || last_height < pos.z - STEPSIZE * 2 ) + return false; + + return true; + } + +void Actor::CheckWater + ( + void + ) + { + Vector sample[3]; + int cont; + + // + // get waterlevel and type + // + waterlevel = 0; + watertype = 0; + + sample[ 0 ] = origin; + sample[ 2 ] = EyePosition(); + sample[ 1 ] = ( sample[ 0 ] + sample[ 2 ] ) * 0.5f; + + cont = gi.pointcontents( sample[ 0 ], 0 ); + + if (cont & MASK_WATER) + { + watertype = cont; + waterlevel = 1; + cont = gi.pointcontents( sample[ 2 ], 0 ); + if (cont & MASK_WATER) + { + waterlevel = 3; + } + else + { + cont = gi.pointcontents( sample[ 1 ], 0 ); + if (cont & MASK_WATER) + { + waterlevel = 2; + } + } + } + } + +#define MAX_PITCH 75 + +void Actor::Accelerate + ( + Vector steering + ) + + { + // limit the actor's turnrate + + if ( steering.y > turnspeed ) + steering.y = turnspeed; + else if ( steering.y < -turnspeed ) + steering.y = -turnspeed; + + angles.y += steering.y; + + if ( frame_delta.x > 4 ) + { + // make him lean into the turn a bit + angles.z = movespeed * ( 0.4f / 320.0f ) * steering.y; + + if ( ( flags & FL_FLY ) || ( ( flags & FL_SWIM ) && waterlevel > 0 ) ) + { + angles.z = bound( angles.z, -2, 2 ); + } + else + { + angles.z = bound( angles.z, -5, 5 ); + } + } + else + { + angles.z = 0; + } + +#if 0 + if ( ( flags & FL_FLY ) || ( ( flags & FL_SWIM ) && waterlevel > 0 ) ) + { + //angles.x = bound( angles.x, -MAX_PITCH, MAX_PITCH ); + } +#endif + + setAngles( angles ); + } + +void Actor::CalcMove + ( + void + ) + + { + if ( total_delta != vec_zero ) + { + MatrixTransformVector( total_delta, orientation, move ); + total_delta = vec_zero; + } + else + { + move = vec_zero; + } + + // force movement if forwardspeed is set + if ( forwardspeed ) + { + if ( move == vec_zero ) + { + move = orientation[ 0 ]; + } + else + { + move.normalize(); + } + + animdir = move; + movedir = move; + movespeed = forwardspeed; + move *= movespeed * FRAMETIME; + totallen = forwardspeed; + movevelocity = movedir * movespeed; + } + } + +void Actor::setAngles + ( + Vector ang + ) + + { + Sentient::setAngles( ang ); + MatrixTransformVector( animdir, orientation, movedir ); + movevelocity = movedir * movespeed; + } + +stepmoveresult_t Actor::WaterMove + ( + void + ) + + { + Vector oldorg; + Vector neworg; + trace_t trace; + int oldwater; + + if ( ( totallen <= 0.01f ) || ( move == vec_zero ) ) + { + return STEPMOVE_OK; + } + + // try the move + oldorg = origin; + neworg = origin + move; + + trace = G_Trace( oldorg, mins, maxs, neworg, this, edict->clipmask, false, "Actor::WaterMove 1" ); + if ( trace.fraction == 0 ) + { + return STEPMOVE_STUCK; + } + + oldwater = waterlevel; + + setOrigin( trace.endpos ); + + CheckWater(); + + // swim monsters don't exit water voluntarily + if ( ( oldwater > 1 ) && ( waterlevel < 2 ) ) + { + waterlevel = oldwater; + setOrigin( oldorg ); + return STEPMOVE_STUCK; + } + + return STEPMOVE_OK; + } + +stepmoveresult_t Actor::AirMove + ( + void + ) + + { + Vector oldorg; + Vector neworg; + trace_t trace; + int oldwater; + + if ( ( totallen <= 0.01f ) || ( move == vec_zero ) ) + { + return STEPMOVE_OK; + } + + // try the move + oldorg = origin; + neworg = origin + move; + + trace = G_Trace( oldorg, mins, maxs, neworg, this, edict->clipmask, false, "Actor::AirMove 1" ); + if ( trace.fraction < 0.0001 ) + { + return STEPMOVE_BLOCKED_BY_WATER; + } + + oldwater = waterlevel; + + setOrigin( trace.endpos ); + + if ( !GetActorFlag( ACTOR_FLAG_IGNORE_WATER ) ) + { + CheckWater(); + + // fly monsters don't enter water voluntarily + if ( !oldwater && waterlevel ) + { + waterlevel = oldwater; + setOrigin( oldorg ); + return STEPMOVE_STUCK; + } + } + + return STEPMOVE_OK; + } + +stepmoveresult_t Actor::TryMove + ( + void + ) + + { + Vector oldorg; + Vector neworg; + Vector end; + trace_t trace; + Door *door; + static Vector step( 0, 0, STEPSIZE ); + qboolean allow_fall; + + + // See if we should bother doing any movement + + if ( velocity != vec_zero && !deadflag ) + { + // We have a velocity so movement of the actor is done in physics + return STEPMOVE_OK; + } + + if ( ( totallen <= 0.01f ) || ( move == vec_zero ) ) + { + return STEPMOVE_OK; + } + + // Try to make the move + + oldorg = origin + step; + neworg = oldorg + move; + trace = G_Trace( oldorg, mins, maxs, neworg, this, edict->clipmask, false, "Actor::TryMove 1" ); + + if ( trace.startsolid ) + { + oldorg = origin; + neworg = oldorg + move; + trace = G_Trace( oldorg, mins, maxs, neworg, this, edict->clipmask, false, "Actor::TryMove 1.5" ); + } + + if ( trace.startsolid || ( trace.fraction < 0.0001f ) ) + { + return STEPMOVE_STUCK; + } + + // If we hit an entity, check what it is + + if ( !deadflag && trace.ent ) + { + // Check if we hit a door + + if ( trace.ent->entity->isSubclassOf( Door ) ) + { + door = ( Door * )trace.ent->entity; + if ( !door->locked && !door->isOpen() ) + { + return STEPMOVE_BLOCKED_BY_DOOR; + } + } + } + + // Don't step down an extra step if gravity is turned off for this actor right now or the actor is dead + + if ( !GetActorFlag( ACTOR_FLAG_USE_GRAVITY ) || deadflag ) + { + // try stepping down + oldorg = trace.endpos; + neworg = oldorg - step; + trace = G_Trace( oldorg, mins, maxs, neworg, this, edict->clipmask, false, "Actor::TryMove 2" ); + + if ( trace.startsolid ) + { + return STEPMOVE_STUCK; + } + + setOrigin( trace.endpos ); + + return STEPMOVE_OK; + } + + // Step down to a step height below our original height to account for gravity + + oldorg = trace.endpos; + neworg = oldorg - step * 2; + trace = G_Trace( oldorg, mins, maxs, neworg, this, edict->clipmask, false, "Actor::TryMove 3" ); + + // Determine if we should allow the actor to fall + + if ( ( flags & FL_PARTIALGROUND ) || + ( groundentity && groundentity->entity && ( groundentity->entity->isSubclassOf( Sentient ) ) ) || + ( GetActorFlag( ACTOR_FLAG_ALLOW_FALL ) ) ) + allow_fall = true; + else + allow_fall = false; + + // Don't voluntarily step on flying monsters + + if ( trace.ent && trace.ent->entity->flags & FL_FLY && !allow_fall ) + return STEPMOVE_BLOCKED_BY_FALL; + + // Don't voluntarilty step on sentients + + if ( trace.ent && trace.ent->entity->isSubclassOf( Sentient ) && + !allow_fall && !GetActorFlag( ACTOR_FLAG_CAN_WALK_ON_OTHERS ) ) + return STEPMOVE_BLOCKED_BY_FALL; + + // Check if the move places us on solid ground + + if ( trace.fraction == 1 ) + { + if ( allow_fall ) + { + // don't let guys get stuck standing on other guys + // if monster had the ground pulled out, go ahead and fall + groundentity = NULL; + } + else + { + // walked off an edge + return STEPMOVE_BLOCKED_BY_FALL; + } + } + + // Make sure ground is not too slopped or we will just slide off + + if ( trace.plane.normal[ 2 ] <= 0.7 && !allow_fall ) + return STEPMOVE_BLOCKED_BY_FALL; + + // If the feet width is set make sure the actor's feet are really on the ground + + if ( feet_width ) + { + Vector temp_mins; + Vector temp_maxs; + Vector saved_endpos; + + saved_endpos = trace.endpos; + + temp_mins[0] = -feet_width; + temp_mins[1] = -feet_width; + temp_mins[2] = mins[2]; + + temp_maxs[0] = feet_width; + temp_maxs[1] = feet_width; + temp_maxs[2] = maxs[2]; + + oldorg = trace.endpos; + neworg = oldorg - step * 3; + trace = G_Trace( oldorg, temp_mins, temp_maxs, neworg, this, edict->clipmask, false, "Actor::TryMove 4" ); + + // Don't voluntarilty step on sentients + + if ( trace.ent && trace.ent->entity->isSubclassOf( Sentient ) && + !allow_fall && !GetActorFlag( ACTOR_FLAG_CAN_WALK_ON_OTHERS ) ) + return STEPMOVE_BLOCKED_BY_FALL; + + if ( trace.fraction == 1 && !allow_fall ) + return STEPMOVE_BLOCKED_BY_FALL; + + saved_endpos.copyTo( trace.endpos ); + } + + // The move is ok + + setOrigin( trace.endpos ); + + // Save the ground information now so we don't have to do it later + + if ( trace.fraction < 1 ) + { + groundentity = trace.ent; + groundplane = trace.plane; + groundcontents = trace.contents; + last_origin = origin; + SetActorFlag( ACTOR_FLAG_HAVE_MOVED, true ); + } + + flags &= ~FL_PARTIALGROUND; // set in Actor::Think + + CheckWater(); + + return STEPMOVE_OK; + } + +void Actor::Push + ( + Event *ev + ) + { + Push( ev->GetVector( 1 ) ); + } + +qboolean Actor::Push + ( + Vector dir + ) + { + Vector oldorg; + Vector neworg; + static Vector step( 0, 0, STEPSIZE ); + trace_t trace; + int i; + + + if ( !GetActorFlag( ACTOR_FLAG_PUSHABLE ) ) + return false; + + for( i = 0 ; i < 5 ; i++ ) + { + oldorg = origin + step; + neworg = oldorg + dir; + + trace = G_Trace( oldorg, mins, maxs, neworg, this, edict->clipmask, false, "Actor::Push 1" ); + + if ( trace.startsolid ) + { + oldorg = origin; + neworg = oldorg + dir; + + trace = G_Trace( oldorg, mins, maxs, neworg, this, edict->clipmask, false, "Actor::Push 2" ); + + if ( trace.startsolid ) + return false; + } + + if ( trace.ent && trace.ent->entity->isSubclassOf( Actor ) ) + { + Actor *act = (Actor *) trace.ent->entity; + act->Push( dir ); + continue; + } + else + break; + } + + if ( trace.endpos == oldorg ) + return false; + + // Step down to a step height below our original height to account for gravity + + oldorg = trace.endpos; + + if ( flags & FL_FLY ) + neworg = oldorg - step; + else + neworg = oldorg - step * 2; + + trace = G_Trace( oldorg, mins, maxs, neworg, this, edict->clipmask, false, "Actor::Push 3" ); + + setOrigin( trace.endpos ); + + return true; + } + +void Actor::Pushable + ( + Event *ev + ) + { + SetActorFlag( ACTOR_FLAG_PUSHABLE, true ); + } + +float Actor::JumpTo + ( + Vector targ, + float speed + ) + { + float traveltime; + float vertical_speed; + Vector target; + Vector dir; + Vector xydir; + + CheckWater(); + // + // if we got a jump, go into that mode + // + traveltime = 0; + if ( speed <= 0 ) + { + speed = movespeed * 1.5f; + if ( speed < (400 * gravity) ) + speed = (400 * gravity); + } + + target = targ; + dir = target - origin; + xydir = dir; + xydir.z = 0; + setAngles( xydir.toAngles() ); + traveltime = xydir.length() / speed; + // + // we add 16 to allow for a little bit higher + // + if ( waterlevel > 2 ) + { + vertical_speed = ( ( dir.z + 16 ) / traveltime ) + ( 0.5f * gravity * 60 * traveltime ); + } + else + { + vertical_speed = ( ( dir.z + 16 ) / traveltime ) + ( 0.5f * gravity * sv_gravity->value * traveltime ); + } + + if ( vertical_speed < 200 ) + vertical_speed = 200; + + xydir.normalize(); + + velocity = speed * xydir; + velocity.z = vertical_speed; + + groundentity = NULL; + + return traveltime; + } + +float Actor::JumpTo + ( + PathNode *goal, + float speed + ) + { + if ( goal ) + return JumpTo( goal->origin, speed ); + else + return 0; + } + +float Actor::JumpTo + ( + Entity *goal, + float speed + ) + { + if ( goal ) + return JumpTo( goal->origin, speed ); + else + return 0; + } + +//*********************************************************************************************** +// +// Debug functions +// +//*********************************************************************************************** + +void Actor::ShowInfo + ( + void + ) + + { + gi.Printf( "\nEntity # : %d\n", entnum ); + gi.Printf( "Class ID : %s\n", getClassID() ); + gi.Printf( "Classname : %s\n", getClassname() ); + gi.Printf( "Name : %s\n", name.c_str() ); + + if ( part_name.length() > 0 ) + gi.Printf( "Part name : %s\n", part_name.c_str() ); + + + gi.Printf( "\n" ); + + gi.Printf( "Targetname : %s\n", TargetName() ); + gi.Printf( "Origin : ( %f, %f, %f )\n", origin.x, origin.y, origin.z ); + gi.Printf( "Bounds : Mins( %.2f, %.2f, %.2f ) Maxs( %.2f, %.2f, %.2f )\n", mins.x, mins.y, mins.z, maxs.x, maxs.y, maxs.z ); + + gi.Printf( "\n" ); + + if ( behavior ) + gi.Printf( "Behavior : %s\n", behavior->getClassname() ); + else + gi.Printf( "Behavior : NULL -- was '%s'\n", currentBehavior.c_str() ); + + if ( currentState ) + gi.Printf( "State : %s\n", currentState->getName() ); + else + gi.Printf( "State : NONE\n" ); + + if ( GetActorFlag( ACTOR_FLAG_AI_ON ) ) + gi.Printf( "AI is ON\n" ); + else + gi.Printf( "AI is OFF\n" ); + + if ( !( permanent_stimuli & STIMULI_SIGHT ) || !( stimuli & STIMULI_SIGHT ) ) + gi.Printf( "Actor is BLIND\n" ); + + if ( !( permanent_stimuli & STIMULI_SOUND ) || !( stimuli & STIMULI_SOUND ) ) + gi.Printf( "Actor is DEAF\n" ); + + if ( flags & FL_THINK ) + gi.Printf( "Think is ON\n" ); + else + gi.Printf( "Think is OFF\n" ); + + if ( mode == ACTOR_MODE_IDLE ) + gi.Printf( "Mode : IDLE\n" ); + else if ( mode == ACTOR_MODE_AI ) + gi.Printf( "Mode : AI\n" ); + else if ( mode == ACTOR_MODE_SCRIPT ) + gi.Printf( "Mode : SCRIPT\n" ); + else if ( mode == ACTOR_MODE_TALK ) + gi.Printf( "Mode : TALK\n" ); + + gi.Printf( "\n" ); + + if ( actorthread ) + { + gi.Printf( "Thread : %s(%d)\n", actorthread->Filename(), actorthread->CurrentLine() ); + } + else + { + gi.Printf( "Thread : NULL\n" ); + } + + gi.Printf( "Actortype : %d\n", actortype ); + + gi.Printf( "Model : %s\n", model.c_str() ); + gi.Printf( "Anim : %s\n", animname.c_str() ); + gi.Printf( "Movespeed : %.2f\n", movespeed ); + gi.Printf( "Health : %f\n", health ); + + gi.Printf( "\ncurrentEnemy: " ); + if ( currentEnemy ) + { + gi.Printf( "%d : '%s'\n", currentEnemy->entnum, currentEnemy->targetname.c_str() ); + } + else + { + gi.Printf( "None\n" ); + } + + gi.Printf( "actortype: %d\n", actortype ); + + switch( deadflag ) + { + case DEAD_NO : + gi.Printf( "deadflag: NO\n" ); + break; + case DEAD_DYING : + gi.Printf( "deadflag: DYING\n" ); + break; + case DEAD_DEAD : + gi.Printf( "deadflag: DEAD\n" ); + break; + case DEAD_RESPAWNABLE : + gi.Printf( "deadflag: RESPAWNABLE\n" ); + break; + + } + + gi.Printf( "\n" ); + if ( behavior ) + { + gi.Printf( "Behavior Info:\n" ); + gi.Printf( "Game time: %f\n", level.time ); + behavior->ShowInfo( *this ); + gi.Printf( "\n" ); + } + } + +//*********************************************************************************************** +// +// Stimuli functions +// +//*********************************************************************************************** + +void Actor::TurnAIOn + ( + Event *ev + ) + { + SetActorFlag( ACTOR_FLAG_AI_ON, true ); + stimuli = STIMULI_ALL; + } + +void Actor::TurnAIOff + ( + Event *ev + ) + { + SetActorFlag( ACTOR_FLAG_AI_ON, false ); + stimuli = STIMULI_NONE; + + if ( mode == ACTOR_MODE_AI ) + { + // Ai is currently on, get out of AI mode + gi.DPrintf( "Forcing an actor (#%d, %s) out of AI mode, this can be dangerous.\n", entnum, name.c_str() ); + EndMode(); + } + } + +void Actor::Deaf + ( + Event *ev + ) + { + stimuli &= ~STIMULI_SOUND; + } + +void Actor::PermanentDeaf + ( + Event *ev + ) + { + permanent_stimuli &= ~STIMULI_SOUND; + } +void Actor::PermanentBlind + ( + Event *ev + ) + { + permanent_stimuli &= ~STIMULI_SIGHT; + } +qboolean Actor::IsBlind + ( + void + ) + { + return ( !( permanent_stimuli & STIMULI_SIGHT ) || !( stimuli & STIMULI_SIGHT ) ); + } + +void Actor::Dumb + ( + Event *ev + ) + { + stimuli &= ~STIMULI_SOUND; + stimuli &= ~STIMULI_SIGHT; + } + +bool Actor::RespondToStimuli( int new_stimuli ) + { + return ( (( new_stimuli & stimuli ) && ( new_stimuli & permanent_stimuli )) || ( new_stimuli == STIMULI_SCRIPT ) ); + } + +void Actor::Stimuli( int new_stimuli, Entity *ent, qboolean force ) + { + if ( RespondToStimuli( new_stimuli ) ) + { + MakeEnemy( ent, force ); + Wakeup(); + ActivateAI(); + } + } + +void Actor::Stimuli( int new_stimuli, Vector pos ) + { + if ( RespondToStimuli( new_stimuli ) ) + { + // Investigate the position + + if ( !GetActorFlag( ACTOR_FLAG_NOISE_HEARD ) ) + { + noise_position = pos; + SetActorFlag( ACTOR_FLAG_NOISE_HEARD, true ); + noise_time = level.time; + } + + Wakeup(); + ActivateAI(); + } + } + +void Actor::StimuliNoAttack( int new_stimuli ) + { + if ( RespondToStimuli( new_stimuli ) ) + { + Wakeup(); + ActivateAI(); + } + } + +void Actor::ActivateAI( void ) + { + if ( !statemap ) + return; + + StartMode( ACTOR_MODE_AI ); + + stimuli = STIMULI_ALL; + + last_time_active = level.time; + + if ( actorthread ) + { + actorthread->ProcessEvent( EV_ScriptThread_End ); + actorthread = NULL; + } + } + +void Actor::SetIdleThread( Event *ev ) + { + idle_thread = ev->GetString( 1 ); + } + +//*********************************************************************************************** +// +// Targeting functions +// +//*********************************************************************************************** + +void AI_TargetPlayer + ( + void + ) + + { + int i; + int n; + Entity *player; + Actor *ent; + + // don't target while player is not in the game or he's in notarget + player = g_entities[ 0 ].entity; + if ( !player || ( player->flags & FL_NOTARGET ) ) + { + return; + } + + // process the list in reverse order in case SleepList is changed + n = SleepList.NumObjects(); + for( i = n; i > 0; i-- ) + { + ent = SleepList.ObjectAt( i ); + + if ( gi.inPVS( player->centroid, ent->centroid ) ) + { + if ( !ent->currentEnemy && ent->Hates( player ) && !ent->IsBlind() && ent->CanReallySee( player ) ) + { + ent->Stimuli( STIMULI_SIGHT, player ); + } + else + { + if ( world->farplane_distance == 0 || Distance( player->centroid, ent->centroid ) < world->farplane_distance ) + ent->Wakeup(); + } + } + } + } + +//*********************************************************************************************** +// +// Actor checks +// +//*********************************************************************************************** + + +qboolean Actor::checkanimname + ( + Conditional &condition + ) + + { + str anim_name_test; + int use_length; + int result; + + anim_name_test = condition.getParm( 1 ); + + if ( condition.numParms() > 1 ) + use_length = atoi( condition.getParm( 2 ) ); + else + use_length = false; + + if ( use_length ) + result = strncmp( animname.c_str(), anim_name_test.c_str(), anim_name_test.length() ); + else + result = strcmp( animname.c_str(), anim_name_test.c_str() ); + + return (result == 0); + } + +qboolean Actor::checkinactive + ( + Conditional &condition + ) + + { + return GetActorFlag( ACTOR_FLAG_INACTIVE ); + } + +qboolean Actor::checkanimdone + ( + Conditional &condition + ) + + { + return GetActorFlag( ACTOR_FLAG_ANIM_DONE ); + } + +qboolean Actor::checkdead + ( + Conditional &condition + ) + + { + return deadflag != 0; + } + +qboolean Actor::checkhaveenemy + ( + Conditional &condition + ) + + { + return IsEntityAlive( currentEnemy ); + } + +qboolean Actor::checkenemydead + ( + Conditional &condition + ) + + { + if ( currentEnemy && ( currentEnemy->deadflag || currentEnemy->health <= 0 ) ) + return true; + + return false; + } + +qboolean Actor::checkenemynoclip + ( + Conditional &condition + ) + + { + if ( currentEnemy && currentEnemy->movetype == MOVETYPE_NOCLIP ) + return true; + + return false; + } + +qboolean Actor::checkcanseeenemy + ( + Conditional &condition + ) + + { + qboolean use_fov = true; + qboolean can_see; + qboolean in_fov; + qboolean real_can_see; + + + if ( condition.numParms() > 0 ) + use_fov = atoi( condition.getParm( 1 ) ); + + // See if we should check again + + if ( canseeenemy_time > level.time ) + { + if ( use_fov ) + return GetActorFlag( ACTOR_FLAG_LAST_CANSEEENEMY ); + else + return GetActorFlag( ACTOR_FLAG_LAST_CANSEEENEMY_NOFOV ); + } + + can_see = true; + in_fov = true; + + // Check to see if we can see enemy + + if ( !IsEntityAlive( currentEnemy ) ) + { + can_see = false; + in_fov = false; + } + + if ( can_see && !WithinVisionDistance( currentEnemy ) ) + can_see = false; + + if ( can_see && !CanSeeFrom( origin, currentEnemy ) ) + can_see = false; + + if ( in_fov && !InFOV( currentEnemy ) ) + in_fov = false; + + // Save can see info + + SetActorFlag( ACTOR_FLAG_LAST_CANSEEENEMY, can_see && in_fov ); + SetActorFlag( ACTOR_FLAG_LAST_CANSEEENEMY_NOFOV, can_see ); + + canseeenemy_time = level.time + 0.2f + G_Random( 0.1f ); + + if ( use_fov ) + real_can_see = GetActorFlag( ACTOR_FLAG_LAST_CANSEEENEMY ); + else + real_can_see = GetActorFlag( ACTOR_FLAG_LAST_CANSEEENEMY_NOFOV ); + + // Save the last known position of our enemy + + if ( real_can_see ) + last_known_enemy_pos = currentEnemy->origin; + + return real_can_see; + } + +qboolean Actor::checkcanshootenemy + ( + Conditional &condition + ) + + { + str tag_name; + + if ( !currentEnemy ) + return false; + + if ( condition.numParms() > 1 ) + tag_name = condition.getParm( 2 ); + + return ( checkcanseeenemy( condition ) && TestAttack( tag_name ) ); + } + +qboolean Actor::checkenemyinfov + ( + Conditional &condition + ) + { + float check_fov; + float check_fovdot; + + + if ( !currentEnemy ) + return false; + + if ( condition.numParms() > 0 ) + { + check_fov = atof( condition.getParm( 1 ) ); + check_fovdot = cos( check_fov * 0.5 * M_PI / 180.0 ); + + return InFOV( currentEnemy->centroid, check_fov, check_fovdot ); + } + else + { + return InFOV( currentEnemy ); + } + } + +qboolean Actor::checkenemyonground + ( + Conditional &condition + ) + { + if ( !currentEnemy ) + return false; + + if ( currentEnemy->groundentity ) + return true; + else + return false; + } + +qboolean Actor::checkenemyrelativeyaw + ( + Conditional &condition + ) + + { + Vector dir; + Vector dir_angles; + float relative_yaw; + float check_yaw; + Vector temp_angles; + + if ( !currentEnemy ) + return false; + + check_yaw = atof( condition.getParm( 1 ) ); + + dir = origin - currentEnemy->origin; + + dir_angles = dir.toAngles(); + + temp_angles = currentEnemy->angles; + + relative_yaw = AngleNormalize180( currentEnemy->angles[YAW] - dir_angles[YAW] ); + + if ( relative_yaw < check_yaw ) + return true; + else + return false; + } + +qboolean Actor::checkcanjumptoenemy + ( + Conditional &condition + ) + + { + return ( currentEnemy && CanWalkTo( currentEnemy->origin, currentEnemy->entnum ) ); + } + +qboolean Actor::checkcanflytoenemy + ( + Conditional &condition + ) + + { + trace_t trace; + + if ( !currentEnemy ) + return false; + + trace = G_Trace( origin, mins, maxs, currentEnemy->centroid, this, edict->clipmask, false, "Actor::checkcanflytoenemy" ); + + if ( trace.startsolid || trace.allsolid ) + return false; + + if ( trace.entityNum == currentEnemy->entnum ) + return true; + + return false; + } + +qboolean Actor::checkinpain + ( + Conditional &condition + ) + + { + return ( state_flags & STATE_FLAG_IN_PAIN ); + } + +qboolean Actor::checksmallpain + ( + Conditional &condition + ) + + { + return ( state_flags & STATE_FLAG_SMALL_PAIN ); + } + +qboolean Actor::checkpainyaw + ( + Conditional &condition + ) + + { + float check_yaw; + + check_yaw = atof( condition.getParm( 1 ) ); + + if ( pain_angles[YAW] <= check_yaw ) + return true; + else + return false; + } + +qboolean Actor::checkpainpitch + ( + Conditional &condition + ) + + { + float check_pitch; + + check_pitch = atof( condition.getParm( 1 ) ); + + if ( pain_angles[PITCH] <= check_pitch ) + return true; + else + return false; + } + +qboolean Actor::checkstunned + ( + Conditional &condition + ) + + { + return GetActorFlag( ACTOR_FLAG_STUNNED ); + } + +qboolean Actor::checkfinished + ( + Conditional &condition + ) + + { + return GetActorFlag( ACTOR_FLAG_FINISHED ); + } + +qboolean Actor::checkmeleehit + ( + Conditional &condition + ) + + { + return ( state_flags & STATE_FLAG_MELEE_HIT ); + } + +qboolean Actor::checkblockedhit + ( + Conditional &condition + ) + + { + return ( state_flags & STATE_FLAG_BLOCKED_HIT ); + } + +qboolean Actor::checkblocked + ( + Conditional &condition + ) + + { + if ( attack_blocked && attack_blocked_time + .75 > level.time ) + return true; + else + return false; + } + +qboolean Actor::checkonfire + ( + Conditional &condition + ) + + { + return on_fire; + } + +qboolean Actor::checkotherdied + ( + Conditional &condition + ) + + { + return ( state_flags & STATE_FLAG_OTHER_DIED ); + } + +qboolean Actor::checkstuck + ( + Conditional &condition + ) + + { + return ( state_flags & STATE_FLAG_STUCK ); + } + +qboolean Actor::checknopath + ( + Conditional &condition + ) + + { + return ( state_flags & STATE_FLAG_NO_PATH ); + } + +qboolean Actor::checkbehaviordone + ( + Conditional &condition + ) + + { + return ( behavior == NULL ); + } + +qboolean Actor::checktimedone + ( + Conditional &condition + ) + + { + if ( GetActorFlag( ACTOR_FLAG_STATE_DONE_TIME_VALID ) ) + { + return ( state_done_time < level.time ); + } + + return false; + } + +qboolean Actor::checkdone + ( + Conditional &condition + ) + + { + return ( checkbehaviordone( condition ) || checktimedone( condition ) ); + } + +qboolean Actor::checkenemyrange + ( + Conditional &condition + ) + + { + float range; + float min_height; + float max_height; + + range = atof( condition.getParm( 1 ) ); + + if ( condition.numParms() > 1 ) + max_height = atof( condition.getParm( 2 ) ); + else + max_height = 0; + + if ( condition.numParms() > 2 ) + min_height = atof( condition.getParm( 3 ) ); + else + min_height = -max_height; + + return EntityInRange( currentEnemy, range, min_height, max_height ); + } + +qboolean Actor::checkplayerrange + ( + Conditional &condition + ) + + { + float range; + float height; + Entity *player; + + range = atof( condition.getParm( 1 ) ); + + if ( condition.numParms() == 2 ) + height = atof( condition.getParm( 2 ) ); + else + height = 0; + + player = g_entities[ 0 ].entity; + + return EntityInRange( player, range, -height, height ); + } + +qboolean Actor::checkmovingactorrange + ( + Conditional &condition + ) + + { + float range; + float height = 0; + float height_diff; + Entity *ent_in_range; + int i; + Vector delta; + float r2; + gentity_t *ed; + float smallest_dist2; + float dist2; + + + // Get distances + range = atof( condition.getParm( 1 ) ); + + if ( condition.numParms() == 2 ) + { + height = atof( condition.getParm( 2 ) ); + } + + r2 = range * range; + + if ( actorrange_time > level.time && height == last_height ) + { + ent_in_range = last_ent; + + if ( IsEntityAlive( ent_in_range ) ) + { + delta = origin - ent_in_range->centroid; + + if ( height ) + { + height_diff = delta[ 2 ]; + delta[ 2 ] = 0; + + if ( ( height_diff < -height ) || ( height_diff > height ) ) + return false; + } + + // dot product returns length squared + if ( ( ( delta * delta ) <= r2 ) && CanSee( ent_in_range ) ) + return true; + } + + return false; + } + + actorrange_time = level.time + 0.2f + G_Random( 0.1f ); + + last_height = height; + last_ent = NULL; + + smallest_dist2 = 99999999; + + // See if any clients are in range + for( i = 0 ; i < game.maxclients; i++ ) + { + ed = &g_entities[ i ]; + + if ( !ed->inuse || !ed->entity ) + { + continue; + } + + ent_in_range = ed->entity; + + if ( IsEntityAlive( ent_in_range ) ) + { + delta = origin - ent_in_range->centroid; + + if ( height > 0 ) + { + height_diff = delta[ 2 ]; + + if ( ( height_diff < -height ) || ( height_diff > height ) ) + { + continue; + } + + delta[ 2 ] = 0; + } + + // dot product returns length squared + + dist2 = delta * delta; + + if ( ( dist2 <= r2 ) && CanSee( ent_in_range ) ) + { + if ( dist2 < smallest_dist2 ) + { + smallest_dist2 = dist2; + last_ent = ent_in_range; + } + } + } + } + + // See if any actors are in range + for( i = 1; i <= ActiveList.NumObjects(); i++ ) + { + ent_in_range = ActiveList.ObjectAt( i ); + + if ( + ( ent_in_range->movetype != MOVETYPE_NONE ) && + ( ent_in_range->movetype != MOVETYPE_STATIONARY ) && + ( this != ent_in_range ) && + ( ent_in_range->health > 0 ) && + !( ent_in_range->flags & FL_NOTARGET ) + ) + { + delta = origin - ent_in_range->centroid; + + if ( height > 0 ) + { + height_diff = delta[ 2 ]; + + if ( ( height_diff < -height ) || ( height_diff > height ) ) + { + continue; + } + + delta[ 2 ] = 0; + } + + // dot product returns length squared + + dist2 = delta * delta; + + if ( ( dist2 <= r2 ) && CanSee( ent_in_range ) ) + { + if ( dist2 < smallest_dist2 ) + { + smallest_dist2 = dist2; + last_ent = ent_in_range; + } + } + } + } + + if ( last_ent ) + return true; + + return false; + } + +qboolean Actor::checkchance + ( + Conditional &condition + ) + + { + float percent_chance; + + percent_chance = atof( condition.getParm( 1 ) ); + + return ( G_Random() < percent_chance ); + } + +qboolean Actor::checkstatetime + ( + Conditional &condition + ) + + { + float time_to_wait; + + time_to_wait = atof( condition.getParm( 1 ) ); + + return ( state_time + time_to_wait < level.time ); + } + +qboolean Actor::checktimesdone + ( + Conditional &condition + ) + + { + return ( times_done == atoi( condition.getParm( 1 ) ) ); + } + +qboolean Actor::checkmeansofdeath + ( + Conditional &condition + ) + + { + int mod; + + mod = MOD_string_to_int( condition.getParm( 1 ) ); + + return ( mod == means_of_death ); + } + +qboolean Actor::checknoiseheard + ( + Conditional &condition + ) + + { + return GetActorFlag( ACTOR_FLAG_NOISE_HEARD ); + } + +qboolean Actor::checkpartstate + ( + Conditional &condition + ) + + { + str part_name; + str state_name; + Actor *part; + + part_name = condition.getParm( 1 ); + state_name = condition.getParm( 2 ); + + part = FindPartActor( part_name ); + + return ( part && strnicmp( part->currentState->getName(), state_name.c_str(), strlen( state_name.c_str() ) ) == 0 ); + } + +qboolean Actor::checkpartflag + ( + Conditional &condition + ) + + { + str part_name; + str flag_name; + unsigned int flag; + int current_part; + part_t *part; + Entity *partent; + Actor *partact; + + part_name = condition.getParm( 1 ); + flag_name = condition.getParm( 2 ); + + if ( stricmp( flag_name, "pain" ) == 0 ) + { + flag = STATE_FLAG_IN_PAIN; + } + else if ( stricmp( flag_name, "small_pain" ) == 0 ) + { + flag = STATE_FLAG_SMALL_PAIN; + } + else if ( stricmp( flag_name, "melee_hit" ) == 0 ) + { + flag = STATE_FLAG_MELEE_HIT; + } + else if ( stricmp( flag_name, "touched" ) == 0 ) + { + flag = STATE_FLAG_TOUCHED; + } + else if ( stricmp( flag_name, "activated" ) == 0 ) + { + flag = STATE_FLAG_ACTIVATED; + } + else if ( stricmp( flag_name, "used" ) == 0 ) + { + flag = STATE_FLAG_USED; + } + else if ( stricmp( flag_name, "twitch" ) == 0 ) + { + flag = STATE_FLAG_TWITCH; + } + else + { + gi.DPrintf( "Unknown flag name (%s) in checkpartflag.", flag_name.c_str() ); + flag = 0; + } + + for( current_part = 1; current_part <= parts.NumObjects(); current_part++ ) + { + part = &parts.ObjectAt( current_part ); + + partent = part->ent; + partact = (Actor *)partent; + + if ( partact && partact->part_name == part_name ) + { + if ( part->state_flags & flag ) + { + return true; + } + } + } + + return false; + } + +qboolean Actor::checkpartdead + ( + Conditional &condition + ) + + { + str part_name; + str state_name; + Actor *part; + + part_name = condition.getParm( 1 ); + + part = FindPartActor( part_name ); + + if ( !part ) + return false; + + return ( part->deadflag || part->health <= 0 ); + } + +qboolean Actor::checknumspawns + ( + Conditional &condition + ) + + { + int check_num; + + check_num = atoi( condition.getParm( 1 ) ); + + return ( num_of_spawns < check_num ); + } + +qboolean Actor::checkcommand + ( + Conditional &condition + ) + + { + return ( command == condition.getParm( 1 ) ); + } + +qboolean Actor::checktouched + ( + Conditional &condition + ) + + { + return state_flags & STATE_FLAG_TOUCHED; + } + +qboolean Actor::checkactivated + ( + Conditional &condition + ) + + { + return state_flags & STATE_FLAG_ACTIVATED; + } + +qboolean Actor::checkused + ( + Conditional &condition + ) + + { + return ( state_flags & STATE_FLAG_USED ); + } + +qboolean Actor::checktwitch + ( + Conditional &condition + ) + + { + return ( state_flags & STATE_FLAG_TWITCH ); + } + +qboolean Actor::checkhealth + ( + Conditional &condition + ) + + { + return health < atof( condition.getParm( 1 ) ); + } + +qboolean Actor::checkonground + ( + Conditional &condition + ) + + { + return groundentity != NULL; + } + +qboolean Actor::checkinwater + ( + Conditional &condition + ) + + { + return (waterlevel > 0 ); + } + +qboolean Actor::checkincomingmeleeattack + ( + Conditional &condition + ) + + { + Entity *enemy_ent; + Sentient *enemy; + trace_t trace; + Vector forward; + Vector end_pos; + + if ( IsEntityAlive( currentEnemy ) ) + { + if ( currentEnemy->isSubclassOf( Sentient ) ) + { + enemy_ent = ( Entity * )currentEnemy; + enemy = ( Sentient * )enemy_ent; + + if ( enemy->in_melee_attack ) + { + enemy->angles.AngleVectors( &forward ); + end_pos = forward * 125 + enemy->centroid; + trace = G_Trace( enemy->centroid, vec_zero, vec_zero, end_pos, enemy, MASK_SHOT, false, "Actor::checkincomingmeleeattack" ); + + if ( trace.entityNum == entnum ) + { + return true; + } + } + } + } + + return false; + } + +qboolean Actor::checkincomingprojectile + ( + Conditional &condition + ) + + { + trace_t trace; + Vector forward; + Vector end_pos; + float time = 0; + float time_left; + Vector dir; + float dist; + + if ( condition.numParms() == 1 ) + { + time = atof( condition.getParm( 1 ) ); + } + + if ( incoming_proj && incoming_time <= level.time ) + { + incoming_proj->angles.AngleVectors( &forward ); + end_pos = forward * 1000 + incoming_proj->centroid; + trace = G_Trace( incoming_proj->centroid, vec_zero, vec_zero, end_pos, incoming_proj, MASK_SHOT, false, "Actor::checkincomingprojectile" ); + + if ( trace.entityNum == entnum ) + { + if ( time ) + { + dir = trace.endpos - incoming_proj->centroid; + dist = dir.length(); + time_left = dist / incoming_proj->velocity.length(); + + return ( time_left <= time ); + } + + return true; + } + } + + return false; + } + +qboolean Actor::checkenemystunned + ( + Conditional &condition + ) + + { + Sentient *enemy; + + + if ( IsEntityAlive( currentEnemy ) ) + { + if ( currentEnemy->isSubclassOf( Sentient ) ) + { + enemy = (Sentient *)(Entity *)currentEnemy; + + if ( enemy->in_stun ) + return true; + } + } + + return false; + } + +qboolean Actor::checkenemyinpath + ( + Conditional &condition + ) + + { + trace_t trace; + Vector end_pos; + + if ( IsEntityAlive( currentEnemy ) ) + { + Vector forward( orientation[ 0 ] ); + + forward *= 1000; + end_pos = origin + forward; + + trace = G_Trace( centroid, vec_zero, vec_zero, end_pos, this, MASK_SHOT, false, "Actor::checkenemyinpath" ); + + if ( trace.entityNum == currentEnemy->entnum ) + { + return true; + } + } + + return false; + } + +qboolean Actor::checkstage + ( + Conditional &condition + ) + + { + return ( stage == atoi( condition.getParm( 1 ) ) ); + } + +qboolean Actor::checkheld + ( + Conditional &condition + ) + + { + return ( edict->s.parent != ENTITYNUM_NONE ); + } + +qboolean Actor::checkenemymelee + ( + Conditional &condition + ) + + { + return ( EntityHasFireType( currentEnemy, FT_MELEE ) ); + } + +qboolean Actor::checkenemyranged + ( + Conditional &condition + ) + + { + return ( EntityHasFireType( currentEnemy, FT_BULLET ) || EntityHasFireType( currentEnemy, FT_PROJECTILE ) ); + } + +qboolean Actor::checkenemyshield + ( + Conditional &condition + ) + + { + if ( !currentEnemy ) + return false; + + if ( currentEnemy->isSubclassOf( Player ) ) + { + qboolean care_about_using_shield; + Weapon *weap; + Player *player; + + player = ( Player * )( Entity * )currentEnemy; + + // See if we care if the enemy is currently using a shield + + if ( condition.numParms() > 0 ) + care_about_using_shield = atoi( condition.getParm( 1 ) ); + else + care_about_using_shield = false; + + // See if they have a shield + + weap = player->GetActiveWeapon( WEAPON_LEFT ); + + if ( !weap || !weap->isSubclassOf( Shield ) ) + return false; + + // See if the enemy is using the shield right now (if we care) + + if ( !care_about_using_shield || player->ShieldActive() ) + return true; + } + else if ( currentEnemy->isSubclassOf( Sentient ) ) + { + Sentient *sent = ( Sentient * )( Entity * )currentEnemy; + + // If just a sentient, just return if they are currently blocking + + return sent->in_block; + } + + return false; + } + +qboolean Actor::checkhasthing + ( + Conditional &condition + ) + + { + int thing_number; + int i; + + + for( i = 1 ; i <= condition.numParms() ; i++ ) + { + thing_number = atoi( condition.getParm( i ) ); + + switch( thing_number ) + { + case 1 : + if ( GetActorFlag( ACTOR_FLAG_HAS_THING1 ) ) + return true; + break; + case 2 : + if ( GetActorFlag( ACTOR_FLAG_HAS_THING2 ) ) + return true; + break; + case 3 : + if ( GetActorFlag( ACTOR_FLAG_HAS_THING3 ) ) + return true; + break; + case 4 : + if ( GetActorFlag( ACTOR_FLAG_HAS_THING4 ) ) + return true; + break; + } + } + + return false; + } + +qboolean Actor::checkallowhangback + ( + Conditional &condition + ) + + { + return GetActorFlag( ACTOR_FLAG_ALLOW_HANGBACK ); + } + +qboolean Actor::checkname + ( + Conditional &condition + ) + + { + return ( name == condition.getParm( 1 ) ); + } + +qboolean Actor::returntrue + ( + Conditional &condition + ) + + { + return true; + } + +Condition Actor::Conditions[] = + { + { "default", returntrue }, + { "INACTIVE", checkinactive }, + { "ANIM_DONE", checkanimdone }, + { "DEAD", checkdead }, + + { "HAVE_ENEMY", checkhaveenemy }, + { "ENEMY_DEAD", checkenemydead }, + { "ENEMY_NOCLIP", checkenemynoclip }, + { "CAN_SEE_ENEMY", checkcanseeenemy }, + { "CAN_SHOOT_ENEMY", checkcanshootenemy }, + { "ENEMY_IN_FOV", checkenemyinfov }, + { "ENEMY_RELATIVE_YAW", checkenemyrelativeyaw }, + { "ENEMY_IN_FOV", checkenemyinfov }, + { "ENEMY_ON_GROUND", checkenemyonground }, + + + { "CAN_JUMP_TO_ENEMY", checkcanjumptoenemy }, + { "CAN_FLY_TO_ENEMY", checkcanflytoenemy }, + + { "PAIN", checkinpain }, + { "SMALL_PAIN", checksmallpain }, + { "PAIN_YAW", checkpainyaw }, + { "PAIN_PITCH", checkpainpitch }, + + { "STUNNED", checkstunned }, + { "FINISHED", checkfinished }, + + { "MELEE_HIT", checkmeleehit }, + { "BLOCKED_HIT", checkblockedhit }, + { "BLOCKED", checkblocked }, + { "OTHER_DIED", checkotherdied }, + { "STUCK", checkstuck }, + { "NO_PATH", checknopath }, + + { "ON_FIRE", checkonfire }, + + { "BEHAVIOR_DONE", checkbehaviordone }, + { "TIME_DONE", checktimedone }, + { "DONE", checkdone }, + + { "RANGE", checkenemyrange }, + { "PLAYER_RANGE", checkplayerrange }, + { "CHANCE", checkchance }, + { "MOVING_ACTOR_RANGE", checkmovingactorrange }, + { "STATE_TIME", checkstatetime }, + { "TIMES_DONE", checktimesdone }, + + { "MOD", checkmeansofdeath }, + + { "NOISE_HEARD", checknoiseheard }, + + { "PART_STATE", checkpartstate }, + { "PART_DEAD", checkpartdead }, + { "PART_FLAG", checkpartflag }, + + { "NUM_SPAWNS", checknumspawns }, + + { "COMMAND", checkcommand }, + + { "TOUCHED", checktouched }, + + { "ACTIVATED", checkactivated }, + { "USED", checkused }, + { "TWITCH", checktwitch }, + + { "HEALTH", checkhealth }, + + { "ON_GROUND", checkonground }, + { "IN_WATER", checkinwater }, + + { "INCOMING_MELEE_ATTACK", checkincomingmeleeattack }, + { "INCOMING_PROJECTILE", checkincomingprojectile }, + + { "ENEMY_STUNNED", checkenemystunned }, + + { "ENEMY_IN_PATH", checkenemyinpath }, + + { "STAGE", checkstage }, + + { "HELD", checkheld }, + + { "ENEMY_HAS_MELEE", checkenemymelee }, + { "ENEMY_HAS_RANGED", checkenemyranged }, + { "ENEMY_HAS_SHIELD", checkenemyshield }, + + { "HAS_THING", checkhasthing }, + + { "ALLOW_HANGBACK", checkallowhangback }, + + { "NAME", checkname }, + { "ANIM_NAME", checkanimname }, + + { NULL, NULL }, + }; + +//*********************************************************************************************** +// +// Actor subclasses +// +//*********************************************************************************************** + +Event EV_SpinningPlant_GetClip + ( + "get_clip", + EV_DEFAULT, + NULL, + NULL, + "Gets the clip brush for the spinning plant actor," + "it is not meant to be called from script." + ); + +CLASS_DECLARATION( Actor, SpinningPlant, NULL ) + { + { &EV_SpinningPlant_GetClip, GetClip }, + { NULL, NULL } + }; + +SpinningPlant::SpinningPlant + ( + ) + + { + spinner_model = NULL; + spinner_clip = NULL; + + PostEvent( EV_SpinningPlant_GetClip, 0 ); + } + +void SpinningPlant::GetClip + ( + Event *ev + ) + { + Entity * ent; + + spinner_model = new Mover; + spinner_model->setModel( model ); + spinner_model->setSolidType( SOLID_NOT ); + spinner_model->setOrigin( origin ); + + hideModel(); + setSolidType( SOLID_NOT ); + + if ( target.length() > 0 ) + { + ent = G_FindTarget( this, target.c_str() ); + + if ( ent ) + { + spinner_clip = (Mover *)ent; + } + } + + if ( spinner_clip ) + { + spinner_clip->hideModel(); + spinner_model->bind( spinner_clip ); + } + } + +SpinningPlant::~SpinningPlant() + { + if ( spinner_model ) + { + spinner_model->PostEvent( EV_Remove, 0 ); + spinner_model = NULL; + } + } + +//*********************************************************************************************** +// +// Code for seperate parts +// +//*********************************************************************************************** + +void Actor::RegisterParts + ( + Event *ev + ) + { + Entity *targetent; + qboolean forward; + int current_part; + part_t *forward_part; + part_t new_part; + Event *event; + + targetent = ev->GetEntity( 1 ); + forward = ev->GetInteger( 2 ); + + if ( !targetent ) + return; + + // See if we should tell other parts about each other + + if ( forward ) + { + // Tell all old parts about this new part and tell the new part about all of the old ones + + for ( current_part = 1 ; current_part <= parts.NumObjects() ; current_part++ ) + { + forward_part = &parts.ObjectAt( current_part ); + + if ( forward_part ) + { + // Tell old part about new part + + event = new Event( EV_ActorRegisterParts ); + event->AddEntity( targetent ); + event->AddInteger( false ); + forward_part->ent->PostEvent( event, 0 ); + + // Tell new part about old part + + event = new Event( EV_ActorRegisterParts ); + event->AddEntity( forward_part->ent ); + event->AddInteger( false ); + targetent->PostEvent( event, 0 ); + } + } + } + + // Add this part to our part list + + new_part.ent = targetent; + new_part.state_flags = 0; + + parts.AddObject( new_part ); + } + +void Actor::PartName + ( + Event *ev + ) + { + part_name = ev->GetString( 1 ); + } + +void Actor::RegisterSelf + ( + Event *ev + ) + { + Entity *targetent; + Actor *targetact; + Event *event; + part_t new_part; + + if ( target.length() > 0 ) + { + // Get the target entity + + targetent = G_FindTarget( this, target.c_str() ); + + if ( !targetent ) + return; + + // See if this target entity is a another part of ourselves + + if ( targetent->isSubclassOf( Actor ) ) + { + targetact = (Actor *)targetent; + + if ( name.length() > 0 && targetact->name == name ) + { + // Tell other part about ourselves + + event = new Event( EV_ActorRegisterParts ); + event->AddEntity( this ); + event->AddInteger( true ); + targetent->PostEvent( event, 0 ); + + // Add this part to our part list + + new_part.ent = targetent; + new_part.state_flags = 0; + parts.AddObject( new_part ); + } + } + } + } + +Actor *Actor::FindPartActor( const char *name ) + { + int current_part; + part_t *part; + Entity *partent; + Actor *partact; + + for ( current_part = 1 ; current_part <= parts.NumObjects() ; current_part++ ) + { + part = &parts.ObjectAt( current_part ); + + partent = part->ent; + partact = (Actor *)partent; + + if ( partact && partact->part_name == name ) + return partact; + } + + return NULL; + } + +void Actor::SendCommand + ( + Event *ev + ) + + { + str command; + str part_to_send_to; + int i; + part_t *part; + Actor *partact; + + command = ev->GetString( 1 ); + part_to_send_to = ev->GetString( 2 ); + + if ( command.length() == 0 || part_to_send_to.length() == 0 ) + return; + + for( i = 1 ; i <= parts.NumObjects(); i++ ) + { + part = &parts.ObjectAt( i ); + + partact = ( Actor * )(Entity *)part->ent; + + if ( partact && partact->part_name == part_to_send_to ) + { + partact->command = command; + } + } + } + +//*********************************************************************************************** +// +// Dialog functions +// +//*********************************************************************************************** + +void Actor::AddDialog + ( + Event *ev + ) + + { + DialogNode_t *dialog_node; + + dialog_node = NewDialogNode(); + + if (dialog_node != NULL) + { + // Add the alias name to the dialog + strcpy(dialog_node->alias_name, ev->GetString( 1 )); + + // Add all the other parameters to the dialog + AddDialogParms( dialog_node, ev ); + + // Add the new dialog to this dialog list + dialog_node->next = dialog_list; + dialog_list = dialog_node; + } + } + +DialogNode_t *Actor::NewDialogNode + ( + void + ) + + { + DialogNode_t *dialog_node; + + dialog_node = new DialogNode_t; + memset( dialog_node, 0 , sizeof( DialogNode_t ) ); + dialog_node->random_percent = 1.0; + + return dialog_node; + } + +void Actor::AddDialogParms + ( + DialogNode_t *dialog_node, + Event *ev + ) + + { + const char *token; + int parm_type; + float temp_float; + int current_parm; + int num_parms; + + + if ( dialog_node == NULL ) + return; + + current_parm = 2; + num_parms = ev->NumArgs(); + + // Get all of the parameters + + while( 1 ) + { + if ( current_parm > num_parms ) + break; + + token = ev->GetString( current_parm ); + current_parm++; + + parm_type = DIALOG_PARM_TYPE_NONE; + + if (stricmp(token, "randompick") == 0) + dialog_node->random_flag = qtrue; + else if (stricmp(token, "playerhas") == 0) + parm_type = DIALOG_PARM_TYPE_PLAYERHAS; + else if (stricmp(token, "playerhasnot") == 0) + parm_type = DIALOG_PARM_TYPE_PLAYERHASNOT; + else if (stricmp(token, "has") == 0) + parm_type = DIALOG_PARM_TYPE_HAS; + else if (stricmp(token, "has_not") == 0) + parm_type = DIALOG_PARM_TYPE_HASNOT; + else if (stricmp(token, "depends") == 0) + parm_type = DIALOG_PARM_TYPE_DEPENDS; + else if (stricmp(token, "dependsnot") == 0) + parm_type = DIALOG_PARM_TYPE_DEPENDSNOT; + else if (stricmp(token, "random") == 0) + { + if ( current_parm > num_parms ) + break; + + token = ev->GetString( current_parm ); + current_parm++; + + temp_float = atof(token); + + if ((temp_float >= 0.0) && (temp_float <= 1.0)) + dialog_node->random_percent = temp_float; + else + gi.DPrintf("Random percent out of range for dialog (alias %s)\n", dialog_node->alias_name); + } + else + gi.DPrintf("Unknown parameter for dialog (alias %s)\n", dialog_node->alias_name); + + if (parm_type != DIALOG_PARM_TYPE_NONE) + { + if ( current_parm > num_parms ) + break; + + token = ev->GetString( current_parm ); + current_parm++; + + if (dialog_node->number_of_parms < MAX_DIALOG_PARMS) + { + strcpy(dialog_node->parms[dialog_node->number_of_parms].parm, token); + dialog_node->parms[dialog_node->number_of_parms].type = parm_type; + dialog_node->number_of_parms++; + } + else + { + gi.DPrintf("Too many parms for dialog (alias %s)\n", dialog_node->alias_name); + } + } + } + } + +void Actor::PlayDialog + ( + Event *ev + ) + { + Sentient *user = NULL; + const char *dialog_name = NULL; + const char *state_name = NULL; + float volume = DEFAULT_VOL; + float min_dist = DEFAULT_MIN_DIST; + + if (ev->NumArgs() > 0) + { + dialog_name = ev->GetString( 1 ); + + if ( strcmp( dialog_name, "" ) == 0 ) + dialog_name = NULL; + } + + if ( ev->NumArgs() > 1 ) + volume = ev->GetFloat( 2 ); + + if ( ev->NumArgs() > 2 ) + min_dist = ev->GetFloat( 3 ); + + if ( ev->NumArgs() > 3 ) + { + state_name = ev->GetString( 4 ); + + if ( strcmp( state_name, "" ) == 0 ) + state_name = NULL; + } + + if ( ev->NumArgs() > 4 ) + user = (Sentient *)ev->GetEntity( 5 ); + + // Make sure any playdialog commands from script is full volume + + if ( ev->GetSource() == EV_FROM_SCRIPT ) + min_dist = LEVEL_WIDE_MIN_DIST; + + PlayDialog( user, volume, min_dist, dialog_name, state_name ); + } + +void Actor::PlayDialog + ( + Sentient *user, + float volume, + float min_dist, + const char *dialog_name, + const char *state_name + ) + + { + DialogNode_t *dialog_node; + int good_dialog; + int i; + ScriptVariable *script_var; + + if ( GetActorFlag( ACTOR_FLAG_DIALOG_PLAYING ) ) + return; + + if (dialog_name == NULL) + { + dialog_node = dialog_list; + + while(dialog_node != NULL) + { + // See if we should play the current dialog + + good_dialog = qtrue; + + for(i = 0 ; i < dialog_node->number_of_parms ; i++) + { + // Test to see if this parm passes + + switch(dialog_node->parms[ i ].type) + { + case DIALOG_PARM_TYPE_PLAYERHAS : + if (!user || !user->HasItem(dialog_node->parms[ i ].parm)) + good_dialog = qfalse; + break; + case DIALOG_PARM_TYPE_PLAYERHASNOT : + if (!user || user->HasItem(dialog_node->parms[ i ].parm)) + good_dialog = qfalse; + break; + case DIALOG_PARM_TYPE_HAS : + if (!HasItem(dialog_node->parms[ i ].parm)) + good_dialog = qfalse; + break; + case DIALOG_PARM_TYPE_HASNOT : + if (HasItem(dialog_node->parms[ i ].parm)) + good_dialog = qfalse; + break; + case DIALOG_PARM_TYPE_DEPENDS : + script_var = gameVars.GetVariable( dialog_node->parms[ i ].parm ); + + if ( script_var ) + { + if (!script_var->intValue()) + good_dialog = qfalse; + } + + script_var = levelVars.GetVariable( dialog_node->parms[ i ].parm ); + + if ( script_var ) + { + if (!script_var->intValue()) + good_dialog = qfalse; + } + + break; + case DIALOG_PARM_TYPE_DEPENDSNOT : + script_var = gameVars.GetVariable( dialog_node->parms[ i ].parm ); + + if ( script_var ) + { + if (script_var->intValue()) + good_dialog = qfalse; + } + + script_var = levelVars.GetVariable( dialog_node->parms[ i ].parm ); + + if ( script_var ) + { + if (script_var->intValue()) + good_dialog = qfalse; + } + + break; + } + + // If dialog is already not good go to next dialog + if (!good_dialog) + break; + } + + if ((dialog_node->random_percent < 1.0) && (G_Random() > dialog_node->random_percent)) + { + good_dialog = qfalse; + } + + if (good_dialog) + { + // Found a good dialog now get the real sound name from the alias + + dialog_name = gi.Alias_FindDialog( edict->s.modelindex, dialog_node->alias_name, dialog_node->random_flag, entnum); + + if (dialog_name != NULL) + break; + } + + // Try the next dialog in the list + + dialog_node = dialog_node->next; + } + } + + if (dialog_name != NULL) + { + byte *dialog_amplitudes = NULL; + int number_of_amplitudes = 0; + float dialog_length; + int current_amplitude; + Event *new_event; + float angle; + Vector mouth_angles; + + Sound( dialog_name, CHAN_DIALOG, volume, min_dist ); + SetActorFlag( ACTOR_FLAG_DIALOG_PLAYING, true ); + + dialog_amplitudes = gi.SoundAmplitudes( dialog_name, &number_of_amplitudes ); + dialog_length = gi.SoundLength( dialog_name ); + + dialog_done_time = level.time + dialog_length; + + if (dialog_length > 0) + { + int tag_num; + + if ( state_name != NULL && currentState ) + { + if ( mode == ACTOR_MODE_SCRIPT || mode == ACTOR_MODE_IDLE ) + { + dialog_old_state_name = currentState->getName(); + dialog_state_name = state_name; + + Event *idle_event = new Event( EV_Actor_Idle ); + idle_event->AddString( state_name ); + ProcessEvent( idle_event ); + } + } + + tag_num = gi.Tag_NumForName( edict->s.modelindex, "tag_mouth" ); + + if ( tag_num != -1 ) + { + SetControllerTag( ACTOR_MOUTH_TAG, tag_num ); + + for( current_amplitude = 0 ; current_amplitude < number_of_amplitudes ; current_amplitude++ ) + { + new_event = new Event ( EV_SetControllerAngles ); + + new_event->AddInteger( ACTOR_MOUTH_TAG ); + + angle = ( dialog_amplitudes[current_amplitude] / 256.0 ) * max_mouth_angle; + mouth_angles = vec_zero; + mouth_angles[PITCH] = angle; + + new_event->AddVector( mouth_angles ); + + PostEvent( new_event, current_amplitude * (1.0 / LIP_SYNC_HZ), EVENT_DIALOG_ANIM ); + + if ( current_amplitude % 10 == 0 ) + PostEvent( EV_Actor_HeadTwitch, current_amplitude * (1.0 / LIP_SYNC_HZ), EVENT_DIALOG_ANIM ); + } + } + + PostEvent( EV_Actor_DialogDone, dialog_length ); + + new_event = new Event ( EV_Actor_HeadTwitch ); + new_event->AddInteger( 1 ); + PostEvent( new_event, dialog_length, EVENT_DIALOG_ANIM ); + } + else + { + SetActorFlag( ACTOR_FLAG_DIALOG_PLAYING, false ); + gi.DPrintf( "Lip file not found for dialog %s\n", dialog_name ); + } + } + } + +void Actor::StopDialog + ( + Event *ev + ) + + { + StopSound( CHAN_DIALOG ); + + CancelEventsOfType( EV_SetControllerAngles ); + CancelEventsOfType( EV_Actor_DialogDone ); + CancelEventsOfType( EV_Actor_HeadTwitch ); + CancelEventsOfType( EV_Actor_HeadTwitchEveryFrame ); + + ProcessEvent( EV_Actor_DialogDone ); + } + + +void Actor::HeadTwitch + ( + Event *ev + ) + + { + qboolean end = false; + Vector real_head_angles; + float pitch_change; + float roll_change; + Event *event; + + + if ( ev->NumArgs() > 0 ) + end = ev->GetInteger( 1 ); + + SetControllerTag( ACTOR_HEAD_TAG, gi.Tag_NumForName( edict->s.modelindex, "Bip01 Head" ) ); + + real_head_angles = GetControllerAngles( ACTOR_HEAD_TAG ); + + CancelEventsOfType( EV_Actor_HeadTwitchEveryFrame ); + + if ( end ) + { + // Put head back to normal + + SetControllerTag( ACTOR_HEAD_TAG, gi.Tag_NumForName( edict->s.modelindex, "Bip01 Head" ) ); + + real_head_angles[PITCH] = real_head_pitch; + real_head_angles[ROLL] = 0; + SetControllerAngles( ACTOR_HEAD_TAG, real_head_angles ); + CancelEventsOfType( EV_Actor_HeadTwitch ); + } + else + { + pitch_change = (real_head_pitch + G_CRandom( 6 ) ) - real_head_angles[PITCH]; + roll_change = G_CRandom( 6 ) - real_head_angles[ROLL]; + + event = new Event( EV_Actor_HeadTwitchEveryFrame ); + + event->AddFloat( pitch_change / 10 ); + event->AddFloat( roll_change / 10 ); + + PostEvent( event, FRAMETIME ); + } + } + +void Actor::HeadTwitchEveryFrame + ( + Event *ev + ) + + { + Vector real_head_angles; + float pitch_change; + float roll_change; + + + pitch_change = ev->GetFloat( 1 ); + roll_change = ev->GetFloat( 1 ); + + SetControllerTag( ACTOR_HEAD_TAG, gi.Tag_NumForName( edict->s.modelindex, "Bip01 Head" ) ); + + real_head_angles = GetControllerAngles( ACTOR_HEAD_TAG ); + + if ( GetActorFlag( ACTOR_FLAG_TURNING_HEAD ) ) + { + // Can only change roll + + real_head_angles[ROLL] += roll_change; + SetControllerAngles( ACTOR_HEAD_TAG, real_head_angles ); + } + else + { + real_head_angles[PITCH] += pitch_change; + real_head_angles[ROLL] += roll_change; + SetControllerAngles( ACTOR_HEAD_TAG, real_head_angles ); + } + + PostEvent( *ev, FRAMETIME ); + } + +float Actor::GetDialogRemainingTime + ( + void + ) + + { + if ( GetActorFlag( ACTOR_FLAG_DIALOG_PLAYING ) ) + { + return dialog_done_time - level.time; + } + else + { + return 0; + } + } + +void Actor::FreeDialogList + ( + void + ) + + { + DialogNode_t *dialog_node; + + dialog_node = dialog_list; + + while( dialog_node != NULL ) + { + dialog_list = dialog_node->next; + + delete dialog_node; + + dialog_node = dialog_list; + } + } + +void Actor::DialogDone + ( + Event *ev + ) + + { + SetActorFlag( ACTOR_FLAG_DIALOG_PLAYING, false ); + + if ( dialog_state_name ) + { + dialog_state_name = ""; + + if ( mode != ACTOR_MODE_AI && mode != ACTOR_MODE_TALK ) + { + if ( dialog_old_state_name.length() ) + SetState( dialog_old_state_name.c_str() ); + } + } + } + +void Actor::SetMouthAngle + ( + Event *ev + ) + + { + int tag_num; + float angle_percent; + Vector mouth_angles; + + + angle_percent = ev->GetFloat( 1 ); + + if ( angle_percent < 0 ) + angle_percent = 0; + + if ( angle_percent > 1 ) + angle_percent = 1; + + tag_num = gi.Tag_NumForName( edict->s.modelindex, "tag_mouth" ); + + if ( tag_num != -1 ) + { + SetControllerTag( ACTOR_MOUTH_TAG, tag_num ); + + mouth_angles = vec_zero; + mouth_angles[PITCH] = max_mouth_angle * angle_percent; + + SetControllerAngles( ACTOR_MOUTH_TAG, mouth_angles ); + } + } + +//*********************************************************************************************** +// +// Mode functions +// +//*********************************************************************************************** + + +qboolean Actor::ModeAllowed( int new_mode ) + { + if ( deadflag && actortype != IS_INANIMATE ) + return false; + + if ( new_mode == ACTOR_MODE_SCRIPT || new_mode == ACTOR_MODE_IDLE ) + { + if ( mode == ACTOR_MODE_AI || mode == ACTOR_MODE_TALK ) + return false; + } + else if ( new_mode == ACTOR_MODE_TALK ) + { + if ( mode == ACTOR_MODE_AI || mode == ACTOR_MODE_TALK || actortype != IS_FRIEND || !GetActorFlag( ACTOR_FLAG_ALLOW_TALK ) || + !dialog_list || level.cinematic ) + return false; + } + + return true; + } + +void Actor::StartMode( int new_mode ) + { + if ( new_mode == ACTOR_MODE_TALK ) + { + SaveMode(); + CancelEventsOfType( EV_Actor_FinishedBehavior ); + RemoveAnimDoneEvent(); + } + + mode = new_mode; + } + +void Actor::EndMode( void ) + { + str currentanim; + + if ( mode == ACTOR_MODE_AI ) + { + if ( GetActorFlag( ACTOR_FLAG_UPDATE_BOSS_HEALTH ) && max_boss_health ) + { + char bosshealth_string[20]; + sprintf( bosshealth_string, "%.5f", 0 ); + gi.cvar_set( "bosshealth", bosshealth_string ); + } + + mode = ACTOR_MODE_IDLE; + ProcessEvent( EV_Actor_Idle ); + + currentanim = currentState->getLegAnim( *this, &conditionals ); + + if ( currentanim.length() && currentanim != animname ) + SetAnim( currentanim, EV_Anim_Done ); + + currentEnemy = NULL; + } + else if ( mode == ACTOR_MODE_TALK ) + { + next_player_near = level.time + 5.0; + RestoreMode(); + } + } + +void Actor::SaveMode( void ) + { + if ( mode == ACTOR_MODE_IDLE ) + { + saved_mode = ACTOR_MODE_IDLE; + saved_state_name = currentState->getName(); + } + else if ( mode == ACTOR_MODE_SCRIPT ) + { + saved_mode = ACTOR_MODE_SCRIPT; + saved_behavior = behavior; + saved_scriptthread = scriptthread; + saved_actorthread = actorthread; + saved_anim_name = animname; + saved_anim_event_name = last_anim_event_name; + + behavior = NULL; + scriptthread = NULL; + actorthread = NULL; + } + else + { + gi.DPrintf( "Can't saved specified mode: %d\n", mode ); + } + } + +void Actor::RestoreMode( void ) + { + Event *idle_event; + + if ( saved_mode == ACTOR_MODE_IDLE ) + { + mode = ACTOR_MODE_IDLE; + + idle_event = new Event( EV_Actor_Idle ); + idle_event->AddString( saved_state_name ); + ProcessEvent( idle_event ); + //StartMode( ACTOR_MODE_IDLE ); + } + else if ( saved_mode == ACTOR_MODE_SCRIPT ) + { + StartMode( ACTOR_MODE_SCRIPT ); + + behavior = saved_behavior; + scriptthread = saved_scriptthread; + actorthread = saved_actorthread; + + if ( saved_behavior ) + currentBehavior = saved_behavior->getClassname(); + else + currentBehavior = ""; + + if ( saved_anim_event_name.length() ) + { + Event *event = new Event( saved_anim_event_name.c_str() ); + SetAnim( saved_anim_name, event ); + } + else + SetAnim( saved_anim_name ); + } + else + { + gi.DPrintf( "Can't restore specified mode: %d\n", saved_mode ); + } + + saved_mode = ACTOR_MODE_NONE; + } + + +//*********************************************************************************************** +// +// Finishing functions +// +//*********************************************************************************************** + + +qboolean Actor::CanBeFinished + ( + void + ) + { + // See if actor can be finished by any means of death + + if ( can_be_finsihed_by_mods.NumObjects() > 0 ) + return true; + else + return false; + } + +qboolean Actor::CanBeFinishedBy + ( + int meansofdeath + ) + { + int number_of_mods; + int i; + + // Make sure in limbo + + if ( !InLimbo() ) + return false; + + // Make sure can be finished by this means of death + + number_of_mods = can_be_finsihed_by_mods.NumObjects(); + + for( i = 1 ; i <= number_of_mods ; i++ ) + { + if ( meansofdeath == can_be_finsihed_by_mods.ObjectAt( i ) ) + return true; + } + + return false; + } + +void Actor::SetCanBeFinishedBy + ( + Event *ev + ) + { + str mod_string; + int new_mod; + int number_of_mods; + int i; + + + number_of_mods = ev->NumArgs(); + + for ( i = 1 ; i <= number_of_mods ; i++ ) + { + mod_string = ev->GetString( i ); + + new_mod = MOD_string_to_int( mod_string ); + + if ( new_mod != -1 ) + can_be_finsihed_by_mods.AddObject( new_mod ); + } + } + +void Actor::Finish + ( + int meansofdeath + ) + { + // Make sure we can be finsihed by this means of death + + if ( CanBeFinishedBy( meansofdeath ) ) + { + // Save that the actor is being finished + + SetActorFlag( ACTOR_FLAG_FINISHED, true ); + + // Kill the actor + + ProcessEvent( EV_Actor_Suicide ); + + // Make sure the correct means of death is set + + means_of_death = meansofdeath; + } + else + { + gi.DPrintf( "Actor can't be finished by %d means of death\n", meansofdeath ); + } + } + +void Actor::StartLimbo + ( + void + ) + { + State *temp_state; + qboolean found_state; + + // Make sure we have a little bit of health + + health = 1; + + // Go to the limbo state + + found_state = false; + + if ( statemap ) + { + temp_state = statemap->FindState( "LIMBO" ); + + if ( temp_state ) + { + currentState = temp_state; + InitState(); + found_state = true; + SetActorFlag( ACTOR_FLAG_IN_LIMBO, true ); + } + } + + if ( !found_state ) + { + // Didn't find a limbo state so just die + + ProcessEvent( EV_Actor_Suicide ); + } + } + +qboolean Actor::InLimbo + ( + void + ) + { + return GetActorFlag( ACTOR_FLAG_IN_LIMBO ); + } + + +//*********************************************************************************************** +// +// General functions +// +//*********************************************************************************************** + +void Actor::AlwaysGiveWater + ( + Event *ev + ) + { + SetActorFlag( ACTOR_FLAG_ALWAYS_GIVE_WATER, ev->GetBoolean( 1 ) ); + } + +void Actor::IgnorePainFromActors + ( + Event *ev + ) + { + SetActorFlag( ACTOR_FLAG_IGNORE_PAIN_FROM_ACTORS, true ); + } + +void Actor::UpdateBossHealth + ( + Event *ev + ) + { + SetActorFlag( ACTOR_FLAG_UPDATE_BOSS_HEALTH, true ); + } + +void Actor::SetMaxBossHealth + ( + Event *ev + ) + { + max_boss_health = ev->GetFloat( 1 ); + } + +void Actor::SetWaterLevel + ( + Event *ev + ) + { + water_level = ev->GetFloat( 1 ); + } + +void Actor::IncrementNumSpawns + ( + Event *ev + ) + { + num_of_spawns++; + } + +void Actor::DecrementNumSpawns + ( + Event *ev + ) + { + num_of_spawns--; + + if ( num_of_spawns < 0 ) + num_of_spawns = 0; + } + +void Actor::TouchTriggers + ( + Event *ev + ) + { + SetActorFlag( ACTOR_FLAG_TOUCH_TRIGGERS, ev->GetBoolean( 1 ) ); + } + +void Actor::IgnoreWater + ( + Event *ev + ) + { + SetActorFlag( ACTOR_FLAG_IGNORE_WATER, ev->GetBoolean( 1 ) ); + } + +void Actor::SetNotAllowedToKill + ( + Event *ev + ) + { + SetActorFlag( ACTOR_FLAG_ALLOWED_TO_KILL, false ); + } + +void Actor::IgnorePlacementWarning + ( + Event *ev + ) + + { + str warning; + + warning = ev->GetString( 1 ); + + if ( warning == "stuck" ) + SetActorFlag( ACTOR_FLAG_IGNORE_STUCK_WARNING, true ); + else if ( warning == "off_ground" ) + SetActorFlag( ACTOR_FLAG_IGNORE_OFF_GROUND_WARNING, true ); + } + +void Actor::SetTargetable + ( + Event *ev + ) + + { + qboolean bool; + + bool = ev->GetBoolean( 1 ); + + SetActorFlag( ACTOR_FLAG_TARGETABLE, bool ); + } + +qboolean Actor::CanTarget + ( + void + ) + + { + return GetActorFlag( ACTOR_FLAG_TARGETABLE ); + } + +void Actor::SetSpawnChance + ( + Event *ev + ) + + { + spawn_chance = ev->GetFloat( 1 ); + } + +void Actor::AddSpawnItem + ( + Event *ev + ) + + { + str spawn_item_name; + + spawn_item_name = ev->GetString( 1 ); + + spawn_items.AddObject( spawn_item_name ); + } + +void Actor::ClearSpawnItems + ( + Event *ev + ) + + { + spawn_items.ClearObjectList(); + } + +void Actor::SpawnItems + ( + void + ) + + { + int number_of_spawn_items; + int i; + qboolean spawn_random = false; + str spawn_item_name; + Player *player; + float health_chance; + float water_chance; + float total_chance; + float plasma_chance; + float bullets_chance; + float player_health; + float player_water; + int player_plasma; + int player_bullets; + float random_number; + qboolean has_gun; + qboolean has_crossbow; + + + number_of_spawn_items = spawn_items.NumObjects(); + + // Spawn in all of the items in the spawn_item list + + if ( number_of_spawn_items ) + { + for( i = 1 ; i <= number_of_spawn_items ; i++ ) + { + spawn_item_name = spawn_items.ObjectAt( i ); + + if ( spawn_item_name == "random" ) + spawn_random = true; + else + SpawnItem( spawn_item_name ); + } + } + else + { + spawn_random = true; + } + + // See if we should spawn a random item + + if ( spawn_random ) + { + if ( G_Random( 100 ) < spawn_chance ) + { + // Set up default chances + + health_chance = 1; + water_chance = 1; + plasma_chance = 1; + bullets_chance = 1; + + // See what he player needs + + player = (Player *)g_entities[ 0 ].entity; + + player_health = player->health; + player_water = player->GetWaterPower(); + player_plasma = player->AmmoCount( "Plasma" ); + player_bullets = player->AmmoCount( "Bullet" ); + + has_gun = player->HasItem( "HandGun" ); + has_crossbow = player->HasItem( "Crossbow" ); + + // See if the player is low on health + + if ( player_health <= 50 ) + health_chance *= (60 - player_health) / 10; + + if ( player_water <= 50 ) + water_chance *= (60 - player_water) / 10; + + if ( player_plasma <= 20 ) + plasma_chance *= (30 - player_plasma) / 10; + + if ( !has_crossbow ) + plasma_chance = 0; + + if ( player_bullets <= 50 ) + bullets_chance *= (60 - player_bullets) / 10; + + if ( !has_gun ) + bullets_chance = 0; + + // Choose something randomly + + total_chance = health_chance + water_chance + plasma_chance + bullets_chance; + + random_number = G_Random( total_chance ); + + if ( random_number < health_chance ) + { + if ( G_Random( 10 ) < health_chance ) + SpawnItem( "item_bighealthfruit1.tik" ); + else + SpawnItem( "item_healthfruit1.tik" ); + } + else if ( random_number < health_chance + water_chance ) + { + if ( ( mass > 125 ) && ( G_Random( 4 ) < water_chance ) ) + SpawnItem( "item_bigwaterampoule.tik" ); + else + SpawnItem( "item_waterampoule.tik" ); + } + else if ( random_number < health_chance + water_chance + plasma_chance ) + SpawnItem( "ammo_plasma.tik" ); + else + { + if ( G_Random( 10 ) < bullets_chance ) + SpawnItem( "ammo_uziclip.tik" ); + else + SpawnItem( "ammo_gunclip.tik" ); + } + } + } + } + +void Actor::SpawnItem + ( + str spawn_item_name + ) + + { + SpawnArgs args; + Entity *ent; + Item *item; + + + args.setArg( "model", spawn_item_name ); + ent = args.Spawn(); + + if ( !ent || !ent->isSubclassOf( Item ) ) + return; + + item = (Item *)ent; + + item->setOrigin( centroid ); + + item->ProcessPendingEvents(); + + item->PlaceItem(); + item->setOrigin( centroid ); + item->velocity = Vector( G_CRandom( 100 ), G_CRandom( 100 ), 200 + G_Random( 200 ) ); + item->edict->clipmask = CONTENTS_SOLID | CONTENTS_PLAYERCLIP; + + // Give the new item a targetname + + item->targetname = targetname; + item->targetname += "_item"; + + item->SetTargetName( item->targetname ); + } + +qboolean Actor::CanJump( void ) + { + return ( HasAnim( "jump" ) && HasAnim( "fall" ) && HasAnim( "land" ) ); + } + +void Actor::SetUseGravity + ( + Event *ev + ) + + { + qboolean use_gravity; + + use_gravity = ev->GetBoolean( 1 ); + + SetActorFlag( ACTOR_FLAG_USE_GRAVITY, use_gravity ); + + if ( use_gravity ) + gravity = 1; + else + gravity = 0; + } + +void Actor::SetAllowFall + ( + Event *ev + ) + + { + qboolean allow_fall; + + if ( ev->NumArgs() > 0 ) + allow_fall = ev->GetBoolean( 1 ); + else + allow_fall = true; + + SetActorFlag( ACTOR_FLAG_ALLOW_FALL, allow_fall ); + } + +void Actor::SetHaveThing + ( + Event *ev + ) + + { + int thing_number; + qboolean thing_bool; + + thing_number = ev->GetInteger( 1 ); + thing_bool = ev->GetBoolean( 2 ); + + switch( thing_number ) + { + case 1 : + SetActorFlag( ACTOR_FLAG_HAS_THING1, thing_bool ); + break; + case 2 : + SetActorFlag( ACTOR_FLAG_HAS_THING2, thing_bool ); + break; + case 3 : + SetActorFlag( ACTOR_FLAG_HAS_THING3, thing_bool ); + break; + case 4 : + SetActorFlag( ACTOR_FLAG_HAS_THING4, thing_bool ); + break; + default : + gi.DPrintf( "Has thing %d out of range\n", thing_number ); + return; + } + } + +void Actor::SetActorFlag( int flag, qboolean flag_value ) + { + unsigned int *flags; + int index; + + if ( flag > ACTOR_FLAG_MAX ) + { + gi.DPrintf( "Actor flag %d out of range\n", flag ); + return; + } + + index = flag / 32; + + switch( index ) + { + case 0 : + flags = &actor_flags1; + break; + case 1 : + flags = &actor_flags2; + break; + default : + gi.DPrintf( "Actor flag %d out of range\n", flag ); + return; + } + + if ( flag_value ) + *flags |= 1 << flag; + else + *flags &= ~( 1 << flag ); + } + +qboolean Actor::GetActorFlag( int flag ) + { + unsigned int *flags; + int index; + + if ( flag > ACTOR_FLAG_MAX ) + { + gi.DPrintf( "Actor flag %d out of range\n", flag ); + return false; + } + + index = flag / 32; + + switch( index ) + { + case 0 : + flags = &actor_flags1; + break; + case 1 : + flags = &actor_flags2; + break; + default : + gi.DPrintf( "Actor flag %d out of range\n", flag ); + return false; + } + + if ( *flags & ( 1 << flag ) ) + return true; + else + return false; + } + +void Actor::SetBounceOff + ( + Event *ev + ) + + { + SetActorFlag( ACTOR_FLAG_BOUNCE_OFF, true ); + } + +void Actor::BounceOffEvent + ( + Event *ev + ) + + { + Vector object_origin; + Entity *effect; + Event *event; + + if ( bounce_off_effect.length() ) + { + object_origin = ev->GetVector( 1 ); + + effect = new Animate; + effect->setModel( bounce_off_effect ); + + effect->setOrigin( object_origin ); + effect->setSolidType( SOLID_NOT ); + + event = new Event( EV_Remove ); + effect->PostEvent( event, 5 ); + } + } + +void Actor::SetBounceOffEffect + ( + Event *ev + ) + + { + bounce_off_effect = ev->GetString( 1 ); + } + +void Actor::GotoNextStage + ( + Event *ev + ) + + { + stage++; + } + +void Actor::GotoPrevStage + ( + Event *ev + ) + + { + stage--; + + if ( stage < 1 ) + stage = 1; + } + +void Actor::GotoStage + ( + Event *ev + ) + + { + stage = ev->GetInteger( 1 ); + } + +void Actor::NotifyOthersAtDeath + ( + Event *ev + ) + + { + SetActorFlag( ACTOR_FLAG_NOTIFY_OTHERS_AT_DEATH, true ); + } + +void Actor::NotifyOthersOfDeath + ( + void + ) + + { + int i; + Actor *act; + + for( i = 1; i <= ActiveList.NumObjects(); i++ ) + { + act = ActiveList.ObjectAt( i ); + + if ( name.length() && name == act->name && Vector( act->origin - origin ).length() < 1000 ) + act->AddStateFlag( STATE_FLAG_OTHER_DIED ); + } + } + +void Actor::Pickup + ( + Event *ev + ) + + { + str tag_name; + int tag_num; + Vector new_angles; + + tag_name = ev->GetString( 1 ); + tag_num = gi.Tag_NumForName( edict->s.modelindex, tag_name.c_str() ); + + new_angles = "0 0 0"; + + if ( pickup_ent ) + { + pickup_ent->setAngles( new_angles ); + pickup_ent->attach( entnum, tag_num ); + } + } + +void Actor::Throw + ( + Event *ev + ) + + { + int i; + int num; + Entity *child; + Vector pos; + Vector forward; + str tag_name; + int tag_num; + + + tag_name = ev->GetString( 1 ); + tag_num = gi.Tag_NumForName( edict->s.modelindex, tag_name.c_str() ); + + + for ( i=0,num = numchildren; i < MAX_MODEL_CHILDREN; i++ ) + { + if ( children[i] == ENTITYNUM_NONE ) + { + continue; + } + + child = ( Entity * )G_GetEntity( children[i] ); + + if ( child->edict->s.tag_num == tag_num ) + { + child->detach(); + + child->setSolidType( SOLID_BBOX ); + + child->setAngles( angles ); + + child->groundentity = NULL; + + tag_num = gi.Tag_NumForName( edict->s.modelindex, tag_name.c_str() ); + GetTag( tag_num, &pos, &forward ); + + child->velocity = orientation[0]; + child->velocity *= 500; + + child->velocity.z = 400; + } + + num--; + + if ( !num ) + break; + } + } + +void Actor::SolidMask + ( + Event *ev + ) + + { + edict->clipmask = MASK_MONSTERSOLID; + } + +void Actor::IgnoreMonsterClip + ( + Event *ev + ) + + { + edict->clipmask &= ~CONTENTS_MONSTERCLIP; + } + +void Actor::NotSolidMask + ( + Event *ev + ) + + { + edict->clipmask = MASK_SOLID; + } + +void Actor::NoMask + ( + Event *ev + ) + + { + edict->clipmask = 0; + } + +void Actor::SetMask + ( + Event *ev + ) + + { + str mask_name; + + mask_name = ev->GetString( 1 ); + + if ( mask_name == "monstersolid" ) + edict->clipmask = MASK_MONSTERSOLID; + else if ( mask_name == "deadsolid" ) + edict->clipmask = MASK_DEADSOLID; + else if ( mask_name == "none" ) + edict->clipmask = 0; + else if ( mask_name == "pathsolid" ) + edict->clipmask = MASK_PATHSOLID; + else + gi.DPrintf( "Unknown mask name - %s\n", mask_name.c_str() ); + } + +void Actor::SetWatchOffset + ( + Event *ev + ) + { + watch_offset = ev->GetVector( 1 ); + } + +void Actor::setSize + ( + Vector min, + Vector max + ) + { + min *= edict->s.scale; + max *= edict->s.scale; + Sentient::setSize( min, max ); + } + +void Actor::SetHealth + ( + Event *ev + ) + + { + health = ev->GetFloat( 1 ) * edict->s.scale; + max_health = health; + } + +void Actor::AddHealth + ( + Event *ev + ) + + { + float health_to_add; + float maxhealth; + + + health_to_add = ev->GetFloat( 1 ); + + if ( ev->NumArgs() > 1 ) + maxhealth = ev->GetFloat( 2 ); + else + maxhealth = max_health; + + health += health_to_add; + + if ( health > maxhealth ) + health = maxhealth; + } + +void Actor::SetTurnSpeed + ( + Event *ev + ) + + { + turnspeed = ev->GetFloat( 1 ); + } + +void Actor::SetMaxInactiveTime + ( + Event *ev + ) + { + max_inactive_time = ev->GetFloat( 1 ); + } + +void Actor::SetFov + ( + Event *ev + ) + + { + fov = ev->GetFloat( 1 ); + fovdot = cos( fov * 0.5 * M_PI / 180.0 ); + } + +void Actor::SetVisionDistance + ( + Event *ev + ) + + { + vision_distance = ev->GetFloat( 1 ); + } + +bool Actor::IsEntityAlive + ( + Entity *ent + ) + + { + return ( ent && !ent->deadflag && (ent->health > 0) && !(ent->flags & FL_NOTARGET) && level.ai_on ); + } + +void Actor::Name + ( + Event *ev + ) + { + name = ev->GetString( 1 ); + } + +void Actor::SetupTriggerField + ( + Event *ev + ) + { + Vector min; + Vector max; + TouchField *trig; + + min = ev->GetVector( 1 ); + max = ev->GetVector( 2 ); + + min = min + origin; + max = max + origin; + + trig = new TouchField; + trig->Setup( this, EV_ActorTriggerTouched, min, max, TRIGGER_PLAYERS | TRIGGER_MONSTERS ); + trigger = trig; + } + +void Actor::TriggerTouched + ( + Event *ev + ) + { + Entity *other; + + other = ev->GetEntity( 1 ); + + if ( + ( other->movetype != MOVETYPE_NONE ) && + ( other->movetype != MOVETYPE_STATIONARY ) && + ( IsEntityAlive( other ) ) + ) + AddStateFlag( STATE_FLAG_TOUCHED ); + } + +void Actor::OnlyShootable + ( + Event *ev + ) + + { + setContents( CONTENTS_SHOOTABLE_ONLY ); + link(); + } + +void Actor::AddStateFlag + ( + unsigned int flag + ) + + { + int current_other_part; + part_t *other_part; + Entity *other_ent; + Actor *other_act; + int current_part; + part_t *part; + + + // Update my state flags + + state_flags |= flag; + + // Update all the other parts of my state flags + + for ( current_other_part = 1 ; current_other_part <= parts.NumObjects() ; current_other_part++ ) + { + other_part = &parts.ObjectAt( current_other_part ); + + other_ent = other_part->ent; + other_act = (Actor *)other_ent; + + // Look for ourselves in this part's part list + + for ( current_part = 1 ; current_part <= other_act->parts.NumObjects() ; current_part++ ) + { + part = &other_act->parts.ObjectAt( current_part ); + + if ( part->ent == this ) + { + // Found ourselves, update state flags + + part->state_flags |= flag; + } + } + } + } + +void Actor::ClearStateFlags + ( + void + ) + + { + int current_part; + part_t *part; + + + // Clear my state flags + + state_flags = 0; + + // Clear all the other parts state flags + + for ( current_part = 1 ; current_part <= parts.NumObjects() ; current_part++ ) + { + part = &parts.ObjectAt( current_part ); + + part->state_flags = 0; + } + } + +void Actor::NoChatterEvent + ( + Event *ev + ) + + { + SetActorFlag( ACTOR_FLAG_NOCHATTER, true ); + } + +void Actor::Chatter + ( + const char *snd, + float chance, + float volume, + int channel + ) + + { + str realname; + + if ( GetActorFlag( ACTOR_FLAG_NOCHATTER ) || chattime > level.time ) + { + return; + } + + if ( G_Random( 10 ) > chance ) + { + chattime = level.time + 1 + G_Random( 2 ); + return; + } + + realname = GetRandomAlias( snd ); + if ( realname.length() > 1 ) + { + float delay; + + delay = gi.SoundLength( realname.c_str() ); + + if ( delay < 0 ) + gi.DPrintf( "Lip file not found for dialog %s\n", realname.c_str() ); + + chattime = level.time + delay + 4 + G_Random( 5 ); + Sound( realname, channel, volume ); + } + else + { + // set it into the future, so we don't check it again right away + chattime = level.time + 1; + } + } + +void Actor::ActivateEvent + ( + Event *ev + ) + + { + Entity *ent; + + if ( ( deadflag ) && ( actortype != IS_INANIMATE ) ) + { + return; + } + + ent = ev->GetEntity( 1 ); + SetVariable( "other", ent ); + + ProcessEvent( EV_Actor_AttackPlayer ); + + AddStateFlag( STATE_FLAG_ACTIVATED ); + } + +void Actor::UseEvent + ( + Event *ev + ) + + { + Sentient *user; + Talk *talk; + + + AddStateFlag( STATE_FLAG_USED ); + + if ( !ModeAllowed( ACTOR_MODE_TALK ) ) + return; + + StartMode( ACTOR_MODE_TALK ); + + user = (Sentient *)ev->GetEntity( 1 ); + + talk = new Talk; + talk->SetUser( user ); + SetBehavior( talk ); + } + +void Actor::Think + ( + void + ) + + { + + // Update boss health if necessary + + if ( GetActorFlag( ACTOR_FLAG_UPDATE_BOSS_HEALTH ) && max_boss_health && mode == ACTOR_MODE_AI ) + { + char bosshealth_string[20]; + sprintf( bosshealth_string, "%.5f", health / max_boss_health ); + gi.cvar_set( "bosshealth", bosshealth_string ); + } + + // Check for the ground + + if ( last_origin != origin ) + SetActorFlag( ACTOR_FLAG_HAVE_MOVED, true ); + + if ( !( flags & FL_SWIM ) && !( flags & FL_FLY ) ) + { + if ( GetActorFlag( ACTOR_FLAG_HAVE_MOVED ) || + ( groundentity && groundentity->entity && groundentity->entity->entnum != ENTITYNUM_WORLD ) ) + CheckGround(); + } + + // Do falling stuff + + if ( groundentity ) + { + if ( !Immune( MOD_FALLING ) && !( flags & FL_FLY ) && ( origin.z + 1000 < last_ground_z ) ) + Damage( world, world, 1000, origin, vec_zero, vec_zero, 0, DAMAGE_NO_ARMOR, MOD_FALLING ); + + last_ground_z = origin.z; + } + + last_origin = origin; + + if ( !deadflag ) + { + // Check to see if stunned + + CheckStun(); + + // See if can talk to the player + + TryTalkToPlayer(); + + // Make sure we can still see our enemy + + if ( max_inactive_time && currentEnemy && next_enemy_try_sight_time < level.time && !IsBlind() ) + { + float next_sight_delay; + + next_sight_delay = max_inactive_time / 5 + G_CRandom( 0.5 ); + + if ( next_sight_delay < 1 ) + next_sight_delay = 1; + + next_enemy_try_sight_time = level.time + next_sight_delay; + + if ( !level.ai_on ) + { + last_enemy_sight_time = level.time; + } + else + { + if ( CanSeeEnemyFrom( origin ) ) + last_enemy_sight_time = level.time; + + if ( last_enemy_sight_time + max_inactive_time < level.time ) + currentEnemy = NULL; + } + } + + // If actor doesn't have an enemy right now try to find one + if ( !IsBlind() && !IsEntityAlive ( currentEnemy ) && next_find_enemy_time <= level.time ) + { + if ( level.ai_on ) + FindEnemy(); + next_find_enemy_time = level.time + .8 + G_Random( .4 ); + } + + // Make sure actor is not immobilized + + if ( flags & FL_IMMOBILE || flags & FL_PARTIAL_IMMOBILE ) + { + StopAnimating(); + return; + } + + // Do the state machine for this creature + + ProcessActorStateMachine(); + + // See if we should go back to sleep + + if ( ( mode == ACTOR_MODE_AI || mode == ACTOR_MODE_IDLE ) && !currentEnemy && !GetActorFlag( ACTOR_FLAG_INVESTIGATING ) + && next_try_sleep_time < level.time ) + { + Entity *player; + + next_try_sleep_time = level.time + 1.0; + + player = g_entities[ 0 ].entity; + + if ( mode == ACTOR_MODE_IDLE && player && !(player->flags & FL_NOTARGET) && gi.inPVS( player->centroid, centroid ) && + ( world->farplane_distance == 0 || Distance( player->centroid, centroid ) < world->farplane_distance ) ) + last_time_active = level.time; + + if ( !level.ai_on ) + last_time_active = level.time; + + if ( max_inactive_time && last_time_active + 5 < level.time ) + { + if ( mode == ACTOR_MODE_AI ) + { + EndMode(); + + Sleep(); + + if ( idle_thread.length() > 1 ) + { + //ScriptThread *thread = ExecuteThread( idle_thread, false ); + + actorthread = ExecuteThread( idle_thread, false ); + + if ( actorthread ) + ProcessScript( actorthread, NULL ); + else + warning( "Idle", "could not process idle_thread" ); + } + } + else + { + Sleep(); + } + } + } + else if ( currentEnemy || GetActorFlag( ACTOR_FLAG_INVESTIGATING ) || mode == ACTOR_MODE_SCRIPT || mode == ACTOR_MODE_TALK ) + { + last_time_active = level.time; + } + + if ( actortype == IS_INANIMATE ) + { + if ( behavior && !behavior->Evaluate( *this ) ) + { + // stop thinking + flags &= ~FL_THINK; + EndBehavior(); + + // remove them from the active list + ActiveList.RemoveObject( ( Actor * )this ); + } + return; + } + + eyeposition[ 2 ] = maxs[ 2 ] + eyeoffset[ 2 ]; + //angles.z = 0; + + // Process the current behavior + + if ( behavior && !behavior->Evaluate( *this ) ) + { + if ( stricmp( behavior->getClassname(), "Talk" ) == 0 ) + { + EndBehavior(); + EndMode(); + } + else + { + EndBehavior(); + } + + // Process state machine again because the behavior finished + ProcessActorStateMachine(); + } + + // Reset the animation is done flag + + SetActorFlag( ACTOR_FLAG_ANIM_DONE, false ); + + // Change the animation if necessary + + if ( newanimnum != -1 ) + ChangeAnim(); + } + + // Do the movement + + if ( !(flags & FL_IMMOBILE) && !(flags & FL_PARTIAL_IMMOBILE) ) + { + CalcMove(); + lastmove = STEPMOVE_STUCK; + + if ( flags & FL_SWIM ) + lastmove = WaterMove(); + else if ( flags & FL_FLY ) + lastmove = AirMove(); + else + lastmove = TryMove(); + } + + if ( !deadflag ) + { + // See if we should damage the actor because of waterlevel + + if ( waterlevel == 3 && !( flags & FL_SWIM ) ) + { + // if out of air, start drowning + if ( air_finished < level.time ) + { + // we may have been in a water brush when we spawned, so check our water level again to be sure + CheckWater(); + if ( waterlevel < 3 ) + { + // we're ok, so reset our air + air_finished = level.time + 5; + } + else if ( next_drown_time < level.time && health > 0 ) + { + // drown! + next_drown_time = level.time + 1; + + //Sound( "snd_uwchoke", CHAN_VOICE ); + BroadcastSound(); + + Damage( world, world, 15, origin, vec_zero, vec_zero, 0, DAMAGE_NO_ARMOR, MOD_DROWN ); + } + } + } + else + { + air_finished = level.time + 5; + } + + if ( + ( movetype != MOVETYPE_NONE ) && + ( movetype != MOVETYPE_STATIONARY ) && + GetActorFlag( ACTOR_FLAG_TOUCH_TRIGGERS ) && + GetActorFlag( ACTOR_FLAG_HAVE_MOVED ) + ) + G_TouchTriggers( this ); + + if ( groundentity && ( groundentity->entity != world ) && !M_CheckBottom( this ) ) + { + // G_FixCheckBottom( this ); + flags |= FL_PARTIALGROUND; + } + } + } + +qboolean Actor::GetClosestTag + ( + str tag_name, + int number_of_tags, + Vector target, + Vector *orig + ) + + { + str temp_tag_name; + Vector temp_orig; + Vector diff; + float dist; + float best_dist = -1; + qboolean found = false; + int i; + char number[5]; + + if ( number_of_tags == 1 ) + { + return GetTag( tag_name.c_str(), orig ); + } + + for( i = 1 ; i <= number_of_tags ; i++ ) + { + sprintf( number, "%d", i ); + + temp_tag_name = tag_name + str( number ); + + if ( GetTag( temp_tag_name.c_str(), &temp_orig ) ) + { + diff = target - temp_orig; + dist = diff * diff; + + if ( dist < best_dist || best_dist < 0 ) + { + best_dist = dist; + found = true; + *orig = temp_orig; + } + } + } + + return found; + } + +void Actor::Active + ( + Event *ev + ) + { + int active_flag; + + if ( ev->NumArgs() > 0 ) + { + active_flag = ev->GetInteger( 1 ); + + if ( active_flag ) + SetActorFlag( ACTOR_FLAG_INACTIVE, false ); + else + SetActorFlag( ACTOR_FLAG_INACTIVE, true ); + } + } + +void Actor::SpawnActorAtLocation + ( + Event *ev + ) + { + str model_name; + str pathnode_name; + qboolean attack; + Vector orig; + Vector ang; + float width; + float height; + PathNode *goal; + int number_of_pathnodes; + Animate *effect; + trace_t trace; + Vector spawn_mins; + Vector spawn_maxs; + + + model_name = ev->GetString( 1 ); + pathnode_name = ev->GetString( 2 ); + number_of_pathnodes = ev->GetInteger( 3 ); + attack = ev->GetBoolean( 4 ); + width = ev->GetFloat( 5 ); + height = ev->GetFloat( 6 ); + + // Get the pathnode name to spawn in to + + pathnode_name += (int)( G_Random( number_of_pathnodes ) + 1 ); + + // Find the path node + + goal = AI_FindNode( pathnode_name ); + + if ( !goal ) + { + gi.Printf( "Can't find position %s\n", pathnode_name.c_str() ); + return; + } + + // Set the spawn in position/direction + + orig = goal->origin; + ang = goal->angles; + + spawn_mins.x = -width; + spawn_mins.y = -width; + spawn_mins.z = 0; + + spawn_maxs.x = width; + spawn_maxs.y = width; + spawn_maxs.z = height; + + trace = G_Trace( orig + "0 0 64", spawn_mins, spawn_maxs, orig - "0 0 128", NULL, MASK_PATHSOLID, false, "SpawnActorAtLocation" ); + + if ( trace.allsolid ) + return; + + orig = trace.endpos; + + SpawnActor( model_name, orig, ang, 1, attack, width, height ); + + // Spawn in teleport effect + + effect = new Animate; + effect->setModel( "fx_teleport3.tik" ); + effect->setOrigin( orig ); + effect->setSolidType( SOLID_NOT ); + effect->RandomAnimate( "idle", EV_Remove ); + effect->Sound( "snd_teleport" ); + } + +void Actor::SpawnActorAtTag + ( + Event *ev + ) + { + str model_name; + str tag_name; + int how_many; + qboolean attack; + float spawn_offset = 0; + Vector tag_orig; + Vector tag_dir; + Vector new_orig; + Vector new_dir; + float width; + float height; + + + model_name = ev->GetString( 1 ); + tag_name = ev->GetString( 2 ); + how_many = ev->GetInteger( 3 ); + attack = ev->GetBoolean( 4 ); + width = ev->GetFloat( 5 ); + height = ev->GetFloat( 6 ); + + if ( ev->NumArgs() > 6 ) + spawn_offset = ev->GetFloat( 7 ); + + // Calculate a good origin/angles + + GetTag( tag_name.c_str(), &tag_orig, &tag_dir ); + + new_orig = tag_orig + tag_dir * spawn_offset; + new_dir = tag_dir * -1; + + SpawnActor( model_name, new_orig, new_dir, how_many, attack, width, height ); + } + +void Actor::SpawnActor + ( + str model_name, + Vector orig, + Vector ang, + int how_many, + qboolean attack, + float width, + float height + ) + + { + Actor *new_actor; + int current_actor; + trace_t trace; + Vector spawn_mins; + Vector spawn_maxs; + + + // Make sure this origin is reasonable + + spawn_mins[0] = -width; + spawn_mins[1] = -width; + spawn_mins[2] = 0; + + spawn_maxs[0] = width; + spawn_maxs[1] = width; + spawn_maxs[2] = height; + + //trace = G_Trace( tag_orig, spawn_mins, spawn_maxs, new_orig, this, MASK_MONSTERSOLID, false, "Actor::SpawnActor" ); + trace = G_Trace( orig, spawn_mins, spawn_maxs, orig, NULL, MASK_MONSTERSOLID, false, "Actor::SpawnActor" ); + + if ( trace.fraction != 1 || trace.allsolid ) + return; + + // Spawn in all new actors + + for( current_actor = 0 ; current_actor < how_many ; current_actor++ ) + { + new_actor = new Actor; + new_actor->setModel( model_name ); + + new_actor->setOrigin( orig ); + new_actor->setAngles( ang ); + + // Make new actor attack player if requested + + if ( attack ) + new_actor->PostEvent( EV_Actor_AttackPlayer, 0 ); + + // Update number of spawns + + num_of_spawns++; + + // Save our parent + + new_actor->spawnparent = this; + + // Give the new actor a targetname + + new_actor->targetname = targetname; + new_actor->targetname += "_spawned"; + + new_actor->SetTargetName( new_actor->targetname ); + } + } + +void Actor::TryTalkToPlayer( void ) + { + int player_near = false; + Entity *ent_in_range; + int i; + Vector delta; + gentity_t *ed; + float dist2; + Sentient *user = NULL; + Talk *talk; + + + // See if we should even bother looking for players + + if ( level.cinematic ) + next_player_near = level.time + 5.0; + + if ( deadflag || actortype != IS_FRIEND || next_player_near > level.time || !ModeAllowed( ACTOR_MODE_TALK ) ) + return; + + next_player_near = level.time + .2 + G_Random( .1 ); + + // See if we are near the player + + for( i = 0 ; i < game.maxclients; i++ ) + { + ed = &g_entities[ i ]; + + if ( !ed->inuse || !ed->entity ) + continue; + + ent_in_range = ed->entity; + + if ( EntityHasFireType( ent_in_range, FT_MELEE ) || EntityHasFireType( ent_in_range, FT_BULLET ) || + EntityHasFireType( ent_in_range, FT_PROJECTILE ) ) + continue; + + if ( IsEntityAlive( ent_in_range ) && ent_in_range->velocity == vec_zero ) + { + delta = centroid - ent_in_range->centroid; + + // dot product returns length squared + + dist2 = delta * delta; + + if ( ( dist2 <= 100 * 100 ) && CanSee( ent_in_range ) ) + { + player_near = true; + user = (Sentient *)ent_in_range; + } + } + } + + if ( !player_near ) + { + SetActorFlag( ACTOR_FLAG_LAST_TRY_TALK, false ); + return; + } + + if ( !GetActorFlag( ACTOR_FLAG_LAST_TRY_TALK ) ) + { + SetActorFlag( ACTOR_FLAG_LAST_TRY_TALK, true ); + return; + } + + SetActorFlag( ACTOR_FLAG_LAST_TRY_TALK, false ); + + // Go to talk mode + + StartMode( ACTOR_MODE_TALK ); + + talk = new Talk; + talk->SetUser( user ); + SetBehavior( talk ); + } + +void Actor::AllowTalk( Event *ev ) + { + SetActorFlag( ACTOR_FLAG_ALLOW_TALK, ev->GetBoolean( 1 ) ); + } + +void Actor::AllowHangBack( Event *ev ) + { + SetActorFlag( ACTOR_FLAG_ALLOW_HANGBACK, ev->GetBoolean( 1 ) ); + } + +qboolean Actor::CheckBottom( void ) + { + //Vector test_mins, test_maxs; + Vector start, stop; + trace_t trace; + int x, y; + int corners_ok; + int middle_ok; + float width; + + + width = maxs[0]; + + + //test_mins = origin + mins; + //test_maxs = origin + maxs; + + // First see if the origin is on a solid (this is the really simple test) + + start = origin - Vector(0, 0, 1); + + if ( gi.pointcontents( start, 0 ) == CONTENTS_SOLID ) + return true; + + // Next see if at least 3 corners are on a solid (this is the simple test) + + corners_ok = 0; + + start[ 2 ] = absmin[ 2 ] - 1; + + for( x = 0; x <= 1; x++ ) + { + for( y = 0; y <= 1; y++ ) + { + start[ 0 ] = x ? absmax[ 0 ] : absmin[ 0 ]; + start[ 1 ] = y ? absmax[ 1 ] : absmin[ 1 ]; + + if ( gi.pointcontents( start, 0 ) == CONTENTS_SOLID ) + corners_ok++; + } + } + + if ( corners_ok >= 3 ) + return true; + + // Next do the hard test + + corners_ok = 0; + middle_ok = 0; + + // Test the origin (if it is close to ground is a plus) + + start = origin; + stop = start - Vector(0, 0, width); // Test down as far as the actor is wide + + trace = G_Trace( start, vec_zero, vec_zero, stop, this, (CONTENTS_SOLID|CONTENTS_MONSTERCLIP), false, "CheckBottom 1" ); + + if ( trace.fraction < 1 && trace.plane.normal[2] > .7 ) + middle_ok = 1; + + // Test all of the corners + + for( x = 0; x <= 1; x++ ) + { + for( y = 0; y <= 1; y++ ) + { + start[ 0 ] = x ? absmax[ 0 ] : absmin[ 0 ]; + start[ 1 ] = y ? absmax[ 1 ] : absmin[ 1 ]; + start[ 2 ] = origin[ 2 ]; + + stop = start - Vector(0, 0, 2 * width); + + trace = G_Trace( start, vec_zero, vec_zero, stop, this, (CONTENTS_SOLID|CONTENTS_MONSTERCLIP), false, "CheckBottom 2" ); + + if ( trace.fraction < 1 && trace.plane.normal[2] > .7 ) + corners_ok++; + + if ( ( middle_ok && corners_ok >= 1 ) || ( corners_ok >= 3 ) ) + return true; + } + } + + return false; + } + +void Actor::ChangeType + ( + Event *ev + ) + + { + velocity = vec_zero; + setModel( ev->GetString( 1 ) ); + PostEvent( EV_Actor_Wakeup, FRAMETIME ); + NoLerpThisFrame(); + } + +void Actor::GetStateAnims + ( + Container *c + ) + + { + statemap->GetAllAnims( c ); + } + +void Actor::Touched + ( + Event *ev + ) + { + Entity *other; + + other = ev->GetEntity( 1 ); + + if ( other && other->isSubclassOf( Player ) && !Likes( other ) ) + Stimuli( STIMULI_SIGHT, other, false ); + } + diff --git a/source/source/fgame/actor.h b/source/source/fgame/actor.h new file mode 100644 index 0000000..737d3e8 --- /dev/null +++ b/source/source/fgame/actor.h @@ -0,0 +1,2117 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/actor.h $ +// $Revision:: 142 $ +// $Author:: Steven $ +// $Date:: 7/27/00 10:55p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/actor.h $ +// +// 142 7/27/00 10:55p Steven +// Added always give water stuff. +// +// 141 7/25/00 9:26p Steven +// Added damage allowed stuff. +// +// 140 7/24/00 6:08p Steven +// Added ignore pain from actors. +// +// 139 7/23/00 5:12p Steven +// Added check animname. +// +// 138 7/22/00 3:02p Steven +// Added boss health bar stuff. +// +// 137 7/22/00 1:22p Steven +// Added water level archiving. +// +// 136 7/22/00 1:18p Steven +// Added water level stuff. +// +// 135 7/17/00 3:16p Steven +// added increment/decrement num spawns stuff +// +// 134 7/17/00 2:57p Steven +// Made EV_Actor_SetTargetable extern. +// +// 133 7/15/00 3:11p Steven +// Added no pain sounds stuff. +// +// 132 7/13/00 3:43p Steven +// Added simple pathfinding and have moved stuff. +// +// 131 7/13/00 12:33p Steven +// Added ignore sounds stuff. +// +// 130 7/12/00 3:36p Steven +// Made lots of optimizations to actors. +// +// 129 7/06/00 4:44p Steven +// Made sure if no behavior was loaded to set the currentBehavior to "". +// +// 128 7/06/00 12:59p Steven +// Made a way to stimuli an attack without it attacking the entity that caused +// it pain and made spawned actors fade out almost immediately. +// +// 127 7/06/00 9:24a Steven +// Added damage angles stuff. +// +// 126 7/06/00 7:47a Steven +// Added enemy on ground check. +// +// 125 7/05/00 5:17p Steven +// Added part of the code to make the player fail the level if she kills an +// innocent. +// +// 124 7/05/00 2:27p Steven +// Fixed reposting of events. +// +// 123 7/02/00 5:55p Steven +// Added SetIdleStateName. +// +// 122 7/02/00 5:09p Steven +// Some SpawnActor work. +// +// 121 7/02/00 1:10p Steven +// Added a RunThread event. +// +// 120 7/01/00 6:19p Steven +// Added falling stuff. +// +// 119 6/30/00 5:05p Steven +// Added on fire check. +// +// 118 6/30/00 11:40a Steven +// Added a blocked check. +// +// 117 6/30/00 10:20a Steven +// Added some stuck/off ground stuff. +// +// 116 6/29/00 5:21p Steven +// Added min and max height for in range stuff. +// +// 115 6/28/00 3:12p Steven +// Fixed a loadgame bug where I referenced statemap without checking to see if +// it wasn't NULL. +// +// 114 6/26/00 4:52p Steven +// Fixed loading of the current state and forced each actor to sleep or to +// wakeup. +// +// 113 6/24/00 7:01p Steven +// Fixed a loading statemap issue. +// +// 112 6/24/00 11:22a Steven +// Fixed a loadgame issue with statemaps. +// +// 111 6/22/00 5:33p Steven +// Added StopDialog. +// +// 110 6/22/00 3:53p Steven +// Fixed some saving/loading issues. +// +// 109 6/20/00 7:00p Steven +// Changed saved_anim_event and last_anim_event to strings from event pointers. +// +// 108 6/20/00 12:17p Steven +// Added SetMask stuff. +// +// 107 6/19/00 6:21p Steven +// Added die completely, bleed after death, next pain sound time, and touched +// stuff. +// +// 106 6/17/00 4:03p Steven +// Added GetStateAnims stuff. +// +// 105 6/15/00 6:55p Steven +// Added moving head while talking stuff. +// +// 104 6/10/00 1:50p Steven +// Added statemap caching. +// +// 103 6/08/00 1:44p Steven +// Added minimum melee height and immortal events. +// +// 102 6/07/00 5:33p Steven +// Added ignore monster clip stuff. +// +// 101 6/06/00 2:51p Steven +// Added no path stuff. +// +// 100 6/03/00 6:53p Steven +// Added blind stuff. +// +// 99 6/03/00 5:23p Steven +// Added saving of dialog stuff. +// +// 98 6/01/00 3:18p Steven +// Added changetype and checkinwater. +// +// 97 5/31/00 3:55p Steven +// Another actor save game pass. +// +// 96 5/30/00 7:06p Markd +// saved games 4th pass +// +// 95 5/27/00 3:32p Markd +// 2nd pass save games +// +// 94 5/27/00 2:32p Steven +// Added targetable stuff, attack actor stuff, and check player range. +// +// 93 5/26/00 6:21p Steven +// Added attackable by actors stuff, should attack entity, and goto prev stage. +// +// 92 5/24/00 3:13p Markd +// first phase of save/load games +// +// 91 5/23/00 6:43p Steven +// Moved small gib stuff to sentient. +// +// 90 5/23/00 10:18a Steven +// Made actors take a little time before doing babble dialog (half second or +// so) and added more items to actor random item spawns. +// +// 89 5/20/00 4:46p Steven +// Added send command and fixed saving of noise stuff. +// +// 88 5/19/00 3:43p Steven +// Added a noclip check. +// +// 87 5/19/00 11:24a Steven +// Some cleanup and added in saving of actors. +// +// 86 5/11/00 11:12a Steven +// Added pushing stuff and chargewater attack. +// +// 85 5/10/00 10:36a Steven +// Added can walk on others stuff, feet width stuff, last_origin, and +// next_find_enemy_time. +// +// 84 5/04/00 2:07p Steven +// More finishing move stuff. +// +// 83 5/04/00 12:46p Steven +// Finishing move stuff. +// +// 82 5/01/00 2:47p Steven +// Added allow fall and added volume and minimum distance to PlayDialog stuff. +// +// 81 4/28/00 5:38p Steven +// Added a last known enemy position variable. +// +// 80 4/24/00 2:44p Steven +// Fixed the initial state not getting initialized correctly. +// +// 79 4/21/00 5:40p Steven +// Added bounce off stuff and added spawn item stuff. +// +// 78 4/20/00 11:35a Steven +// Added stun stuff. +// +// 77 4/15/00 11:50a Steven +// Added spawnbloodygibs, added setmaxgibs and cleaned up some blood stuff. +// +// 76 4/14/00 3:58p Steven +// Added a staysolid event. +// +// 75 4/13/00 5:33p Steven +// Added a deathsink event, made it so only actors with deathsink turned on +// sink into ground after death and added a nomask event for the ghosts. +// +// 74 4/12/00 6:59p Steven +// Added an addhealth event. +// +// 73 4/11/00 6:37p Steven +// Added deathshrink stuff. +// +// 72 4/11/00 3:07p Steven +// Cleaned up a bunch of spawn stuff and merged SpawnGib and SpawnGibAtTag. +// +// 71 4/08/00 3:58p Steven +// Added fading out stuff, attackmode stuff and SpawnGibAtTag. +// +// 70 4/06/00 2:57p Steven +// Added death size event. +// +// 69 4/04/00 6:54p Steven +// Added ResetHeadEvent. +// +// 68 4/01/00 4:33p Steven +// Added chackname. +// +// 67 4/01/00 2:39p Steven +// Added checkcanflytoenemy. +// +// 66 4/01/00 11:10a Steven +// Added checkenemydead. +// +// 65 3/31/00 5:33p Steven +// Made EV_ActorOnlyShootable extern. +// +// 64 3/31/00 1:01p Steven +// Added GetRandomEnemy (for recruiter). +// +// 63 3/30/00 2:03p Steven +// Added SpawnBlood and added usegravity. +// +// 62 3/28/00 6:48p Steven +// Added optional tag_name to TestAttack. +// +// 61 3/24/00 6:31p Steven +// Started adding a better CheckBottom. +// +// 60 3/22/00 10:35a Steven +// Added SpawnNamedGib and GotoStage. +// +// 59 3/20/00 6:07p Steven +// Moved max_mouth_angle stuff to sentient, added setmouthangle, and got rid of +// idle_thread_label. +// +// 58 3/18/00 4:15p Steven +// Added an allowhangback event and added a check for allowhangback. +// +// 57 3/18/00 3:13p Steven +// Added a flag to keep track if the actor has been started yet or not. +// +// 56 3/18/00 1:16p Steven +// Added FireBullet to actor and added pain_angles stuff. +// +// 55 3/17/00 11:52a Steven +// Added jumping stuff. +// +// 54 3/14/00 12:07p Steven +// Added walkwatch stuff. +// +// 53 3/13/00 2:32p Steven +// Added a can_shoot_enemy check. +// +// 52 3/11/00 4:11p Steven +// Added have thing stuff. +// +// 51 3/11/00 2:16p Steven +// Added stun stuff (so the AI knows when the player is incapable of doing +// anything :) +// +// 50 3/11/00 11:35a Steven +// Moved all actor booleans to 1 actor flags variable. +// +// 49 3/08/00 6:41p Steven +// Fixed up checkcanseeenemy. +// +// 48 3/07/00 4:56p Steven +// Added bounce off stuff. +// +// 47 3/07/00 11:49a Steven +// Added checkenemyinfov. +// +// 46 3/04/00 11:49a Steven +// Added a stuck flag and added a check for it. +// +// 45 3/03/00 5:25p Steven +// Added fast_bullet stuff. +// +// 44 3/02/00 11:01a Steven +// Added checkenemyrelativeyaw. +// +// 43 2/25/00 7:03p Steven +// Added a way for actors to notify others of their kind when they are killed. +// +// 42 2/24/00 5:25p Steven +// Fixed up some of the removing anim done event stuff. +// +// 41 2/23/00 11:44a Steven +// Moved utility behaviors into actor. +// +// 40 2/21/00 6:24p Steven +// Added a torso tag and added an endthread event. +// +// 39 2/18/00 6:54p Steven +// Added warpto command. +// +// 38 2/17/00 5:42p Steven +// Lots of movement and path finding improvements. +// +// 37 2/16/00 10:41a Steven +// Added small pain stuff. +// +// 36 2/14/00 3:32p Steven +// Added checks so an actor can tell what weapons the player is using. +// +// 35 2/11/00 6:40p Steven +// Added pickup/throw stuff, added damage once stuff, and added small pain +// stuff. +// +// 34 2/09/00 10:34a Steven +// Added events to allow an actor's clipmask to be changed. +// +// 33 2/08/00 11:59a Steven +// Added stuff to let actor know he had blocked a hit. +// +// 32 2/08/00 11:38a Steven +// Some general cleanup, added a state name to idle event, added a state name +// to playdialog event, and added a checkheld check. +// +// 31 2/04/00 1:56p Steven +// Added a lot on the different modes (AI, script, idle and talk). +// +// 30 2/02/00 1:34p Steven +// Added head watching stuff and fixed checkmovingactorrange. +// +// 29 1/27/00 2:50p Steven +// Added checkincomingmeleeattackstart and checkincomingprojectilestart. +// +// 28 1/25/00 11:09a Steven +// Renamed health_less check to health. +// +// 27 1/24/00 6:56p Steven +// Added limiting number of spawned stuff by an actor. +// +// 26 1/21/00 6:44p Steven +// Added tempstate ability. +// +// 25 1/19/00 7:46p Aldie +// Fixed func_spawns of various types and removed some unused misc classes +// +// 24 1/19/00 12:10p Steven +// Added a set mouth angle event and cleaned up dialog stuff a little. +// +// 23 1/17/00 10:20p Jimdose +// Rewrote state system initialization. Made conditionals defined with array. +// Made Evaluate functions early exit +// +// 22 1/14/00 5:01p Steven +// Added stage stuff. +// +// 21 1/13/00 7:08p Steven +// Lots and lots of cleanup. +// +// 20 1/05/00 7:25p Jimdose +// made angle functions all use the same coordinate system +// AngleVectors now returns left instead of right +// no longer need to invert pitch +// +// 19 12/22/99 5:11p Steven +// Added incoming melee and incoming projectiles checks, fixed CanWalkTo a +// little and readded turn speed stuff. +// +// 18 12/20/99 6:50p Steven +// Moved jumpxy to sentient. +// +// 17 12/19/99 8:21p Markd +// removed prioritystack.h from the header since it isn't used anymore +// +// 16 12/17/99 8:26p Jimdose +// got rid of unused vars and functions +// +// 15 12/17/99 6:11p Steven +// Added actor jump event. +// +// 14 11/19/99 4:54p Steven +// Added some deathfade stuff back in. +// +// 13 11/19/99 4:20p Steven +// Updated some of the actor saving stuff. +// +// 12 11/19/99 11:31a Steven +// Added commands so actors could tell each other to do things. +// +// 11 11/12/99 6:23p Steven +// Made state flags available to other part entities. +// +// 10 10/28/99 6:33p Markd +// Added fakeplayer ability, also added CloneEntity +// +// 9 10/27/99 10:30a Steven +// Added only shootable contents stuff. +// +// 8 10/21/99 5:24p Steven +// General AI work. +// +// 7 10/19/99 7:11p Steven +// Lots of AI work. +// +// 6 10/11/99 7:51p Steven +// Major cleanup, made it so scripting and ai could co-exist, and fixed some +// actor bugs. +// +// 5 10/07/99 5:34p Steven +// Some stimuli work. +// +// 4 10/01/99 1:39p Steven +// Event formatting. +// +// 3 9/27/99 4:42p Steven +// Fixed an animation/behavior issue dealing with the actor state machine. +// +// 2 9/20/99 5:22p Steven +// Added a canwalkto method. +// +// 1 9/10/99 10:53a Jimdose +// +// 1 9/08/99 3:15p Aldie +// +// 18 8/28/99 11:46a Steven +// Added some spinning plant stuff. +// +// 17 8/24/99 11:27a Steven +// More general AI work. +// +// 16 8/16/99 10:32a Steven +// More general AI work. +// +// 15 8/11/99 5:57p Steven +// More general AI work. +// +// 14 8/05/99 9:15a Steven +// New AI stuff. +// +// +// DESCRIPTION: +// Base class for character AI. +// + +#ifndef __ACTOR_H__ +#define __ACTOR_H__ + +#include "g_local.h" +#include "weapon.h" +#include "sentient.h" +#include "container.h" +#include "stack.h" +#include "navigate.h" +#include "behavior.h" +#include "scriptmaster.h" +#include "characterstate.h" + +extern Event EV_Actor_Start; +extern Event EV_Actor_Dead; +extern Event EV_Actor_LookAt; +extern Event EV_Actor_TurnTo; +extern Event EV_Actor_FinishedBehavior; +extern Event EV_Actor_NotifyBehavior; +extern Event EV_Actor_FinishedMove; +extern Event EV_Actor_FinishedAnim; +extern Event EV_Actor_WalkTo; +extern Event EV_Actor_RunTo; +extern Event EV_Actor_Anim; +extern Event EV_Actor_AttackFinished; +extern Event EV_Actor_Attack; +extern Event EV_Actor_AttackPlayer; +extern Event EV_Actor_AIOn; +extern Event EV_Actor_AIOff; +extern Event EV_Actor_AIDeaf; +extern Event EV_Actor_AIDumb; +extern Event EV_ActorIncomingProjectile; +extern Event EV_Anim_Done; +extern Event EV_ActorOnlyShootable; +extern Event EV_Actor_BounceOff; +extern Event EV_Actor_Push; +extern Event EV_Actor_Statemap; +extern Event EV_Actor_SetTargetable; + +// Bones used by actor + +#define ACTOR_MOUTH_TAG 0 +#define ACTOR_HEAD_TAG 1 +#define ACTOR_TORSO_TAG 2 + +// Dialog stuff + +#define LIP_SYNC_HZ 20.0 + +#define MAX_ALIAS_NAME_LENGTH 32 + +#define MAX_DIALOG_PARAMETERS_LENGTH 100 + +#define MAX_DIALOG_PARM_LENGTH 64 +#define MAX_DIALOG_PARMS 10 + +#define DIALOG_PARM_TYPE_NONE 0 +#define DIALOG_PARM_TYPE_PLAYERHAS 1 +#define DIALOG_PARM_TYPE_PLAYERHASNOT 2 +#define DIALOG_PARM_TYPE_HAS 3 +#define DIALOG_PARM_TYPE_HASNOT 4 +#define DIALOG_PARM_TYPE_DEPENDS 5 +#define DIALOG_PARM_TYPE_DEPENDSNOT 6 + +typedef struct +{ + byte type; + char parm[ MAX_DIALOG_PARM_LENGTH ]; +} DialogParm_t; + +typedef struct DialogNode_s + { + char alias_name[ MAX_ALIAS_NAME_LENGTH ]; + int random_flag; + int number_of_parms; + float random_percent; + DialogParm_t parms[ MAX_DIALOG_PARMS ]; + struct DialogNode_s *next; + } DialogNode_t; + +typedef enum + { + IS_INANIMATE, + IS_MONSTER, + IS_ENEMY, + IS_CIVILIAN, + IS_FRIEND, + IS_ANIMAL, + NUM_ACTORTYPES + } actortype_t; + +// Stimuli types + +#define STIMULI_ALL -1 +#define STIMULI_NONE 0 +#define STIMULI_SIGHT (1<<0) +#define STIMULI_SOUND (1<<1) +#define STIMULI_PAIN (1<<2) +#define STIMULI_SCRIPT (1<<3) + +#define MAX_INACTIVE_TIME 30.0 + +// State flags + +#define STATE_FLAG_IN_PAIN (1<<0) +#define STATE_FLAG_MELEE_HIT (1<<1) +#define STATE_FLAG_TOUCHED (1<<2) +#define STATE_FLAG_ACTIVATED (1<<3) +#define STATE_FLAG_USED (1<<4) +#define STATE_FLAG_TWITCH (1<<5) +#define STATE_FLAG_BLOCKED_HIT (1<<6) +#define STATE_FLAG_SMALL_PAIN (1<<7) +#define STATE_FLAG_OTHER_DIED (1<<8) +#define STATE_FLAG_STUCK (1<<9) +#define STATE_FLAG_NO_PATH (1<<10) + +// Actor modes + +#define ACTOR_MODE_NONE 0 +#define ACTOR_MODE_IDLE 1 +#define ACTOR_MODE_AI 2 +#define ACTOR_MODE_SCRIPT 3 +#define ACTOR_MODE_TALK 4 + +// Pain types + +#define PAIN_SMALL 0 +#define PAIN_BIG 1 + +typedef struct +{ + EntityPtr ent; + unsigned int state_flags; +} part_t; + +// Actor flags + +#define ACTOR_FLAG_NOISE_HEARD 0 +#define ACTOR_FLAG_INVESTIGATING 1 +#define ACTOR_FLAG_DEATHGIB 2 +#define ACTOR_FLAG_DEATHFADE 3 +#define ACTOR_FLAG_NOCHATTER 4 +#define ACTOR_FLAG_INACTIVE 5 +#define ACTOR_FLAG_ANIM_DONE 6 +#define ACTOR_FLAG_STATE_DONE_TIME_VALID 7 +#define ACTOR_FLAG_AI_ON 8 +#define ACTOR_FLAG_LAST_CANSEEENEMY 9 +#define ACTOR_FLAG_LAST_CANSEEENEMY_NOFOV 10 +#define ACTOR_FLAG_DIALOG_PLAYING 11 +#define ACTOR_FLAG_ALLOW_TALK 12 +#define ACTOR_FLAG_DAMAGE_ONCE_ON 13 +#define ACTOR_FLAG_DAMAGE_ONCE_DAMAGED 14 +#define ACTOR_FLAG_BOUNCE_OFF 15 +#define ACTOR_FLAG_NOTIFY_OTHERS_AT_DEATH 16 +#define ACTOR_FLAG_HAS_THING1 17 +#define ACTOR_FLAG_HAS_THING2 18 +#define ACTOR_FLAG_HAS_THING3 19 +#define ACTOR_FLAG_HAS_THING4 20 +#define ACTOR_FLAG_LAST_ATTACK_HIT 21 +#define ACTOR_FLAG_STARTED 22 +#define ACTOR_FLAG_ALLOW_HANGBACK 23 +#define ACTOR_FLAG_USE_GRAVITY 24 +#define ACTOR_FLAG_SPAWN_FAILED 25 +#define ACTOR_FLAG_FADING_OUT 26 +#define ACTOR_FLAG_DEATHSHRINK 27 +#define ACTOR_FLAG_DEATHSINK 28 +#define ACTOR_FLAG_STAYSOLID 29 +#define ACTOR_FLAG_STUNNED 30 +#define ACTOR_FLAG_ALLOW_FALL 31 +#define ACTOR_FLAG_FINISHED 32 +#define ACTOR_FLAG_IN_LIMBO 33 +#define ACTOR_FLAG_CAN_WALK_ON_OTHERS 34 +#define ACTOR_FLAG_PUSHABLE 35 +#define ACTOR_FLAG_LAST_TRY_TALK 36 +#define ACTOR_FLAG_ATTACKABLE_BY_ACTORS 37 +#define ACTOR_FLAG_TARGETABLE 38 +#define ACTOR_FLAG_ATTACK_ACTORS 39 +#define ACTOR_FLAG_IMMORTAL 40 +#define ACTOR_FLAG_TURNING_HEAD 41 +#define ACTOR_FLAG_DIE_COMPLETELY 42 +#define ACTOR_FLAG_BLEED_AFTER_DEATH 43 +#define ACTOR_FLAG_IGNORE_STUCK_WARNING 44 +#define ACTOR_FLAG_IGNORE_OFF_GROUND_WARNING 45 +#define ACTOR_FLAG_ALLOWED_TO_KILL 46 +#define ACTOR_FLAG_TOUCH_TRIGGERS 47 +#define ACTOR_FLAG_IGNORE_WATER 48 +#define ACTOR_FLAG_NEVER_IGNORE_SOUNDS 49 +#define ACTOR_FLAG_SIMPLE_PATHFINDING 50 +#define ACTOR_FLAG_HAVE_MOVED 51 +#define ACTOR_FLAG_NO_PAIN_SOUNDS 52 +#define ACTOR_FLAG_UPDATE_BOSS_HEALTH 53 +#define ACTOR_FLAG_IGNORE_PAIN_FROM_ACTORS 54 +#define ACTOR_FLAG_DAMAGE_ALLOWED 55 +#define ACTOR_FLAG_ALWAYS_GIVE_WATER 56 + + +// The last actor_flag number and this one (ACTOR_FLAG_MAX) should match + +#define ACTOR_FLAG_MAX 56 + +class Actor; + +typedef SafePtr ActorPtr; + +class Actor : public Sentient + { + public: + str newanim; + Event *newanimevent; + int newanimnum; + + stepmoveresult_t lastmove; + float forwardspeed; + + actortype_t actortype; + + //str state; + str animname; + + BehaviorPtr behavior; + str currentBehavior; + + PathPtr path; + + EntityPtr currentEnemy; + + unsigned int actor_flags1; + unsigned int actor_flags2; + + Vector noise_position; + float noise_time; + + float fov; + float fovdot; + float vision_distance; + + Vector startpos; + + Vector move; + Vector movedir; + float movespeed; + Vector movevelocity; + float totallen; + float turnspeed; + Vector animdir; + + float chattime; + float nextsoundtime; + + ThreadPtr scriptthread; + + ThreadPtr actorthread; + //TouchFieldPtr trig; + + float pain_threshold; + + float next_drown_time; + float air_finished; + + str kill_thread; + Vector eyeoffset; + float last_jump_time; + + str statemap_name; + StateMap *statemap; + State *currentState; + + // New stuff for ai + + float state_time; + int times_done; + float state_done_time; + int stimuli; + int permanent_stimuli; + str idle_thread; + float last_enemy_sight_time; + float next_enemy_try_sight_time; + float next_try_sleep_time; + float last_time_active; + + float max_inactive_time; + + str name; + str part_name; + + Container parts; + + EntityPtr trigger; + + str enemytype; + + unsigned int state_flags; + str command; + + EntityPtr incoming_proj; + float incoming_time; + + float actorrange_time; + float last_height; + EntityPtr last_ent; + + float canseeenemy_time; + + int stage; + + int num_of_spawns; + + ActorPtr spawnparent; + + DialogNode_t *dialog_list; + float dialog_done_time; + str dialog_state_name; + str dialog_old_state_name; + + Vector watch_offset; + + int mode; + str idle_state_name; + float next_player_near; + + int saved_mode; + BehaviorPtr saved_behavior; + ThreadPtr saved_scriptthread; + ThreadPtr saved_actorthread; + str saved_anim_name; + str saved_state_name; + str saved_anim_event_name; + + str last_anim_event_name; + + EntityPtr pickup_ent; + + int pain_type; + Vector pain_angles; + int bullet_hits; + + float stunned_end_time; + + Container spawn_items; + float spawn_chance; + + str bounce_off_effect; + + Vector last_attack_pos; + Vector last_attack_enemy_pos; + EntityPtr last_attack_entity_hit; + Vector last_attack_entity_hit_pos; + + Vector last_known_enemy_pos; + + Container can_be_finsihed_by_mods; + + float feet_width; + + Vector last_origin; + + float next_find_enemy_time; + + float minimum_melee_height; + float damage_angles; + + float real_head_pitch; + + float next_pain_sound_time; + + float last_ground_z; + + float water_level; + + float max_boss_health; + + static Condition Conditions[]; + + Container conditionals; + + CLASS_PROTOTYPE( Actor ); + + // Initialization functions + Actor(); + ~Actor(); + void Start( Event *ev ); + + void Sleep( void ); + void Sleep( Event *ev ); + void Wakeup( void ); + void Wakeup( Event *ev ); + + // Vision functions + qboolean WithinVisionDistance( Entity *ent ); + qboolean InFOV( Vector pos, float check_fov, float check_fovdot ); + qboolean InFOV( Vector pos ); + qboolean InFOV( Entity *ent ); + qboolean CanSeeFOV( Entity *ent ); + qboolean CanSeeFrom( Vector pos, Entity *ent ); + qboolean CanSee( Entity *ent ); + qboolean EnemyCanSeeMeFrom( Vector pos ); + qboolean CanSeeEnemyFrom( Vector pos ); + qboolean CanReallySee( Entity *ent ); + + // Combat functions + void MeleeEvent( Event *ev ); + void ChargeWater( Event *ev ); + void DamageOnceStart( Event *ev ); + void DamageOnceStop( Event *ev ); + void DamageAllowed( Event *ev ); + virtual qboolean CanShootFrom( Vector pos, Entity *ent, qboolean usecurrentangles ); + virtual qboolean CanShoot( Entity *ent, qboolean usecurrentangles ); + void FireProjectile( Event *ev ); + void FireBullet( Event *ev ); + void SaveAttack( Vector orig, Vector dir ); + qboolean TestAttack( str tag_name ); + void IncomingProjectile( Event *ev ); + qboolean EntityHasFireType( Entity *ent, firetype_t fire_type ); + void DamageEnemy( Event *ev ); + void TurnTowardsEnemy( Event *ev ); + void AttackModeEvent( Event *ev ); + qboolean ShouldAttackEntity( Entity *ent ); + void SetAttackableByActors( Event *ev ); + void SetAttackActors( Event *ev ); + void MinimumMeleeHeight( Event *ev ); + void SetDamageAngles( Event *ev ); + void SetImmortal( Event *ev ); + qboolean IsImmortal( void ); + + + // Enemy management + void ClearEnemies( void ); + qboolean HasEnemies( void ); + qboolean IsEnemy( Entity *ent ); + void MakeEnemy( Entity *ent, qboolean force = false ); + qboolean Likes( Entity *ent ); + qboolean Hates( Entity *ent ); + void FindEnemy( void ); + Entity *FindNearestEnemy( void ); + void GetNearestEnemy( Event *ev ); + void GetRandomEnemy( Event *ev ); + + // Targeting functions + qboolean CloseToEnemy( Vector pos, float howclose ); + qboolean EntityInRange( Entity *ent, float range, float min_height, float max_height ); + void EyeOffset( Event *ev ); + + // Actor type script commands + void FriendEvent( Event *ev ); + void CivilianEvent( Event *ev ); + void EnemyEvent( Event *ev ); + void InanimateEvent( Event *ev ); + void MonsterEvent( Event *ev ); + void AnimalEvent( Event *ev ); + void SetEnemyType( Event *ev ); + + // State machine functions + void SetIdleStateName( Event *ev ); + void SetState( const char *state_name ); + void InitState( void ); + void LoadStateMap( Event *ev ); + void ProcessActorStateMachine( void ); + + // Thread management + void SetupThread( str filename, str label ); + void EndThread( Event *ev ); + void SetThread( Event *ev ); + void RunThread( Event *ev ); + void SetThread( str filename, str label ); + void ProcessScript( ScriptThread *thread, Event *ev = NULL ); + ScriptVariable *SetVariable( const char *name, float value ); + ScriptVariable *SetVariable( const char *name, int value ); + ScriptVariable *SetVariable( const char *name, const char *text ); + ScriptVariable *SetVariable( const char *name, str &text ); + ScriptVariable *SetVariable( const char *name, Entity *ent ); + ScriptVariable *SetVariable( const char *name, Vector &vec ); + + // Behavior management + void SendMoveDone( ScriptThread *script_thread ); + void EndBehavior( void ); + void SetBehavior( Behavior *newbehavior, Event *argevent = NULL, ScriptThread *thread = NULL ); + void FinishedBehavior( Event *ev ); + void NotifyBehavior( Event *ev ); + + // Path and node management + PathNode *NearestNodeInPVS( Vector pos ); + void SetPath( Path *newpath ); + void ReserveNodeEvent( Event *ev ); + void ReleaseNodeEvent( Event *ev ); + + // Animation control functions + void RemoveAnimDoneEvent( void ); + void ChangeAnim( void ); + qboolean SetAnim( str anim, Event *ev = NULL ); + qboolean SetAnim( str anim, Event &ev ); + void AnimDone( Event *ev ); + + // Script commands + void IdleEvent( Event *ev ); + void LookAt( Event *ev ); + void TurnToEvent( Event *ev ); + void HeadWatchEvent( Event *ev ); + void ResetHeadEvent( Event *ev ); + void WalkTo( Event *ev ); + void WalkWatch( Event *ev ); + void RunTo( Event *ev ); + void WarpTo( Event *ev ); + void PickupEnt( Event *ev ); + void ThrowEnt( Event *ev ); + void AttackEntity( Event *ev ); + void AttackPlayer( Event *ev ); + void JumpToEvent( Event *ev ); + void GotoEvent( Event *ev ); + void Anim( Event *ev ); + void RepostEvent( Event *ev, Event &event_type ); + + // Script conditionals + void IfEnemyVisibleEvent( Event *ev ); + void IfNearEvent( Event *ev ); + void IfCanHideAtEvent( Event *ev ); + void IfEnemyWithinEvent( Event *ev ); + + // Sound reaction functions + void NoPainSounds( Event *ev ); + void HeardSound( Event *ev ); + qboolean IgnoreSounds( void ); + void NeverIgnoreSounds( Event *ev ); + + // Pain and death related functions + void Pain( Event *ev ); + void StunEvent( Event *ev ); + void CheckStun( void ); + void Dead( Event *ev ); + void Killed( Event *ev ); + void KilledEffects( Entity *attacker ); + void SetDieCompletely( Event *ev ); + void SetBleedAfterDeath( Event *ev ); + void RemoveUselessBody( Event *ev ); + void SetPainThresholdEvent( Event *ev ); + void SetKillThreadEvent( Event *ev ); + void DeathFadeEvent( Event *ev ); + void DeathShrinkEvent( Event *ev ); + void DeathSinkEvent( Event *ev ); + void StaySolidEvent( Event *ev ); + void SpawnGib( Event *ev ); + void SpawnGibAtTag( Event *ev ); + void RealSpawnGib( qboolean use_tag, Event *ev ); + void SpawnNamedGib( Event *ev ); + float SpawnGetTime( float vel, Vector orig, Vector gib_mins, Vector gib_maxs ); + void SpawnBlood( Event *ev ); + void Suicide( Event *ev ); + void SetDeathSize( Event *ev ); + void FadeEvent( Event *ev ); + + // Movement functions + void SimplePathfinding( Event *ev ); + void SetCanWalkOnOthers( Event *ev ); + void SetFeetWidth( Event *ev ); + void ForwardSpeedEvent( Event *ev ); + void SwimEvent( Event *ev ); + void FlyEvent( Event *ev ); + void NotLandEvent( Event *ev ); + qboolean CanMoveTo( Vector pos ); + qboolean CanWalkTo( Vector pos, int entnum = ENTITYNUM_NONE ); + void Accelerate( Vector steering ); + void CalcMove( void ); + void setAngles( Vector ang ); + stepmoveresult_t WaterMove( void ); + stepmoveresult_t AirMove( void ); + stepmoveresult_t TryMove( void ); + void Push( Event *ev ); + qboolean Push( Vector dir ); + void Pushable( Event *ev ); + void CheckWater( void ); + float JumpTo( PathNode * goal, float speed ); + float JumpTo( Entity * goal, float speed ); + float JumpTo( Vector targ, float speed ); + + // Debug functions + void ShowInfo( void ); + + // Stimuli functions + void Stimuli( int stimuli, Entity *ent, qboolean force = false ); + void Stimuli( int stimuli, Vector pos ); + void StimuliNoAttack( int stimuli ); + void Deaf( Event *ev ); + void PermanentDeaf( Event *ev ); + void PermanentBlind( Event *ev ); + qboolean IsBlind( void ); + void Dumb( Event *ev ); + //qboolean IsAIActive( void ); + void SetIdleThread( Event *ev ); + bool RespondToStimuli( int new_stimuli ); + void ActivateAI( void ); + void TurnAIOn( Event *ev ); + void TurnAIOff( Event *ev ); + + // Parts functions + + void RegisterParts( Event *ev ); + void RegisterSelf( Event *ev ); + void PartName( Event *ev ); + Actor *FindPartActor( const char *name ); + void SendCommand( Event *ev ); + + // Dialog functions + void AddDialog ( Event *ev ); + DialogNode_t *NewDialogNode(void); + void AddDialogParms( DialogNode_t *dialog_node, Event *ev ); + void PlayDialog( Sentient *user, float volume = -1.0, float min_dist = -1.0, + const char *dialog_name = NULL, const char *state_name = NULL ); + void FreeDialogList( void ); + void DialogDone( Event *ev ); + void PlayDialog( Event *ev ); + void StopDialog( Event *ev ); + void HeadTwitch( Event *ev ); + void HeadTwitchEveryFrame( Event *ev ); + float GetDialogRemainingTime( void ); + void SetMouthAngle( Event *ev ); + + // Mode functions + + qboolean ModeAllowed( int new_mode ); + void StartMode( int new_mode ); + void EndMode( void ); + void SaveMode( void ); + void RestoreMode( void ); + + // Finishing functions + + qboolean CanBeFinished( void ); + qboolean CanBeFinishedBy( int meansofdeath ); + void SetCanBeFinishedBy( Event *ev ); + void Finish( int meansofdeath ); + void StartLimbo( void ); + qboolean InLimbo( void ); + + // General functions + + void AlwaysGiveWater( Event *ev ); + void IgnorePainFromActors( Event *ev ); + void UpdateBossHealth( Event *ev ); + void SetMaxBossHealth( Event *ev ); + void SetWaterLevel( Event *ev ); + void IncrementNumSpawns( Event *ev ); + void DecrementNumSpawns( Event *ev ); + void TouchTriggers( Event *ev ); + void IgnoreWater( Event *ev ); + void SetNotAllowedToKill( Event *ev ); + void IgnorePlacementWarning( Event *ev ); + void SetTargetable( Event *ev ); + qboolean CanTarget( void ); + void AddSpawnItem( Event *ev ); + void SetSpawnChance( Event *ev ); + void ClearSpawnItems( Event *ev ); + void SpawnItems( void ); + void SpawnItem( str spawn_item_name ); + qboolean CanJump( void ); + void SetUseGravity( Event *ev ); + void SetAllowFall( Event *ev ); + void SetUseMovement( Event *ev ); + void SetHaveThing( Event *ev ); + void SetActorFlag( int flag, qboolean flag_value ); + qboolean GetActorFlag( int flag ); + void SetBounceOff( Event *ev ); + void BounceOffEvent( Event *ev ); + void SetBounceOffEffect( Event *ev ); + void NotifyOthersAtDeath( Event *ev ); + void NotifyOthersOfDeath( void ); + void GotoNextStage( Event *ev ); + void GotoPrevStage( Event *ev ); + void GotoStage( Event *ev ); + void Pickup( Event *ev ); + void Throw( Event *ev ); + void SetWatchOffset( Event *ev ); + void SetMaxInactiveTime( Event *ev ); + void SetTurnSpeed( Event *ev ); + void SetHealth( Event *ev ); + void AddHealth( Event *ev ); + virtual void setSize( Vector min, Vector max ); + void SetFov( Event *ev ); + void SetVisionDistance( Event *ev ); + void NoChatterEvent( Event *ev ); + virtual void Chatter( const char *sound, float chance = 10, float volume = 1.0f, int channel = CHAN_VOICE ); + void ActivateEvent( Event *ev ); + void UseEvent( Event *ev ); + void Think( void ); + void Active( Event *ev ); + bool IsEntityAlive( Entity *ent ); + void Name( Event *ev ); + void SetupTriggerField( Event *ev ); + void TriggerTouched( Event *ev ); + qboolean GetClosestTag( str tag_name, int number_of_tags, Vector target, Vector *orig ); + void AddStateFlag( unsigned int flag ); + void ClearStateFlags( void ); + void OnlyShootable( Event *ev ); + void SpawnActorAtTag( Event *ev ); + void SpawnActorAtLocation( Event *ev ); + void SpawnActor( str model_name, Vector orig, Vector ang, int how_many, qboolean attack, float width, float height ); + void TryTalkToPlayer( void ); + void AllowTalk( Event *ev ); + void AllowHangBack( Event *ev ); + void SolidMask( Event *ev ); + void IgnoreMonsterClip( Event *ev ); + void NotSolidMask( Event *ev ); + void NoMask( Event *ev ); + void SetMask( Event *ev ); + + qboolean CheckBottom( void ); + + void ChangeType( Event *ev ); + + void GetStateAnims( Container *c ); + + void Touched( Event *ev ); + + // State machine conditions + qboolean returntrue( Conditional &condition ); + qboolean checkanimname( Conditional &condition ); + qboolean checkinactive( Conditional &condition ); + qboolean checkanimdone( Conditional &condition ); + qboolean checkdead( Conditional &condition ); + qboolean checkhaveenemy( Conditional &condition ); + qboolean checkenemydead( Conditional &condition ); + qboolean checkenemynoclip( Conditional &condition ); + qboolean checkcanseeenemy( Conditional &condition ); + qboolean checkcanshootenemy( Conditional &condition ); + qboolean checkenemyinfov( Conditional &condition ); + qboolean checkenemyonground( Conditional &condition ); + qboolean checkenemyrelativeyaw( Conditional &condition ); + qboolean checkcanjumptoenemy( Conditional &condition ); + qboolean checkcanflytoenemy( Conditional &condition ); + qboolean checkinpain( Conditional &condition ); + qboolean checksmallpain( Conditional &condition ); + qboolean checkpainyaw( Conditional &condition ); + qboolean checkpainpitch( Conditional &condition ); + qboolean checkstunned( Conditional &condition ); + qboolean checkfinished( Conditional &condition ); + qboolean checkmeleehit( Conditional &condition ); + qboolean checkblockedhit( Conditional &condition ); + qboolean checkblocked( Conditional &condition ); + qboolean checkonfire( Conditional &condition ); + qboolean checkotherdied( Conditional &condition ); + qboolean checkstuck( Conditional &condition ); + qboolean checknopath( Conditional &condition ); + qboolean checkbehaviordone( Conditional &condition ); + qboolean checktimedone( Conditional &condition ); + qboolean checkdone( Conditional &condition ); + qboolean checkenemyrange( Conditional &condition ); + qboolean checkplayerrange( Conditional &condition ); + qboolean checkmovingactorrange( Conditional &condition ); + qboolean checkchance( Conditional &condition ); + qboolean checkstatetime( Conditional &condition ); + qboolean checktimesdone( Conditional &condition ); + qboolean checkmeansofdeath( Conditional &condition ); + qboolean checknoiseheard( Conditional &condition ); + qboolean checkpartstate( Conditional &condition ); + qboolean checkpartflag( Conditional &condition ); + qboolean checkpartdead( Conditional &condition ); + qboolean checknumspawns( Conditional &condition ); + qboolean checkcommand( Conditional &condition ); + qboolean checktouched( Conditional &condition ); + qboolean checkactivated( Conditional &condition ); + qboolean checkused( Conditional &condition ); + qboolean checktwitch( Conditional &condition ); + qboolean checkhealth( Conditional &condition ); + qboolean checkonground( Conditional &condition ); + qboolean checkinwater( Conditional &condition ); + qboolean checkincomingmeleeattack( Conditional &condition ); + qboolean checkincomingprojectile( Conditional &condition ); + qboolean checkenemystunned( Conditional &condition ); + qboolean checkenemyinpath( Conditional &condition ); + qboolean checkstage( Conditional &condition ); + qboolean checkheld( Conditional &condition ); + qboolean checkenemymelee( Conditional &condition ); + qboolean checkenemyranged( Conditional &condition ); + qboolean checkenemyshield( Conditional &condition ); + qboolean checkhasthing( Conditional &condition ); + qboolean checkallowhangback( Conditional &condition ); + qboolean checkname( Conditional &condition ); + + virtual void Archive( Archiver &arc ); + }; + +#define SAVE_FLAG_NEW_ANIM (1<<0) +#define SAVE_FLAG_FORWARD_SPEED (1<<1) +#define SAVE_FLAG_BEHAVIOR (1<<2) +#define SAVE_FLAG_PATH (1<<3) +#define SAVE_FLAG_NOISE (1<<4) +#define SAVE_FLAG_SCRIPT_THREAD (1<<5) +#define SAVE_FLAG_ACTOR_THREAD (1<<6) +#define SAVE_FLAG_KILL_THREAD (1<<7) +#define SAVE_FLAG_STATE (1<<8) +#define SAVE_FLAG_IDLE_THREAD (1<<7) +#define SAVE_FLAG_PARTS (1<<10) +#define SAVE_FLAG_TRIGGER (1<<11) +#define SAVE_FLAG_STATE_FLAGS (1<<12) +#define SAVE_FLAG_COMMAND (1<<13) +#define SAVE_FLAG_STAGE (1<<14) +#define SAVE_FLAG_NUM_OF_SPAWNS (1<<15) +#define SAVE_FLAG_SPAWN_PARENT (1<<16) +#define SAVE_FLAG_DIALOG (1<<17) +#define SAVE_FLAG_SAVED_STUFF (1<<18) +#define SAVE_FLAG_LAST_ANIM_EVENT (1<<19) +#define SAVE_FLAG_PICKUP_ENT (1<<20) +#define SAVE_FLAG_PAIN (1<<21) +#define SAVE_FLAG_SPAWN_ITEMS (1<<22) + +inline void Actor::Archive + ( + Archiver &arc + ) + { + //unsigned int save_flags; + str temp_state_name; + qboolean temp_bool; + + Sentient::Archive( arc ); + + arc.ArchiveString( &newanim ); + arc.ArchiveEventPointer( &newanimevent ); + arc.ArchiveInteger( &newanimnum ); + + arc.ArchiveInteger( (int *)&lastmove ); + arc.ArchiveFloat( &forwardspeed ); + + arc.ArchiveInteger( (int *)&actortype ); + + arc.ArchiveString( &animname ); + + if ( arc.Saving() ) + { + if ( behavior ) + { + temp_bool = true; + arc.ArchiveBoolean( &temp_bool ); + arc.ArchiveObject( behavior ); + } + else + { + temp_bool = false; + arc.ArchiveBoolean( &temp_bool ); + } + } + else + { + arc.ArchiveBoolean( &temp_bool ); + + if ( temp_bool ) + { + behavior = ( Behavior * )arc.ReadObject(); + currentBehavior = behavior->getClassname(); + } + else + { + behavior = NULL; + currentBehavior = ""; + } + } + + arc.ArchiveSafePointer( &path ); + + arc.ArchiveSafePointer( ¤tEnemy ); + + arc.ArchiveUnsigned( &actor_flags1 ); + arc.ArchiveUnsigned( &actor_flags2 ); + + arc.ArchiveVector ( &noise_position ); + arc.ArchiveFloat( &noise_time ); + + arc.ArchiveFloat( &fov ); + arc.ArchiveFloat( &fovdot ); + arc.ArchiveFloat( &vision_distance ); + + arc.ArchiveVector ( &startpos ); + + arc.ArchiveVector ( &move ); + arc.ArchiveVector ( &movedir ); + arc.ArchiveFloat ( &movespeed ); + arc.ArchiveVector ( &movevelocity ); + arc.ArchiveFloat ( &totallen ); + arc.ArchiveFloat ( &turnspeed ); + arc.ArchiveVector ( &animdir ); + + arc.ArchiveFloat ( &chattime ); + arc.ArchiveFloat ( &nextsoundtime ); + + arc.ArchiveSafePointer( &scriptthread ); + arc.ArchiveSafePointer( &actorthread ); + + arc.ArchiveFloat( &pain_threshold ); + + arc.ArchiveFloat( &next_drown_time ); + arc.ArchiveFloat( &air_finished ); + + arc.ArchiveString( &kill_thread ); + arc.ArchiveVector( &eyeoffset ); + arc.ArchiveFloat( &last_jump_time ); + + if ( arc.Saving() ) + { + + arc.ArchiveString( &statemap_name ); + + if ( currentState ) + temp_state_name = currentState->getName(); + + arc.ArchiveString( &temp_state_name ); + } + else + { + arc.ArchiveString( &statemap_name ); + + if ( statemap_name.length() ) + { + Event *event; + + event = new Event( EV_Actor_Statemap ); + event->AddString( statemap_name.c_str() ); + event->AddString( "" ); + event->AddInteger( 1 ); + ProcessEvent( event ); + } + + arc.ArchiveString( &temp_state_name ); + + if ( statemap ) + currentState = statemap->FindState( temp_state_name.c_str() ); + } + + arc.ArchiveFloat( &state_time ); + arc.ArchiveInteger( ×_done ); + arc.ArchiveFloat( &state_done_time ); + arc.ArchiveInteger( &stimuli ); + arc.ArchiveInteger( &permanent_stimuli ); + arc.ArchiveString( &idle_thread ); + arc.ArchiveFloat( &last_enemy_sight_time ); + arc.ArchiveFloat( &next_enemy_try_sight_time ); + arc.ArchiveFloat( &next_try_sleep_time ); + arc.ArchiveFloat( &last_time_active ); + + arc.ArchiveFloat( &max_inactive_time ); + + arc.ArchiveString( &name ); + arc.ArchiveString( &part_name ); + + { + part_t part; + int current_part; + int number_of_parts; + part_t *part_ptr; + + if ( arc.Saving() ) + { + number_of_parts = parts.NumObjects(); + } + else + { + parts.ClearObjectList(); + } + + arc.ArchiveInteger( &number_of_parts ); + + if ( arc.Loading() ) + parts.Resize( number_of_parts ); + + for( current_part = 1; current_part <= number_of_parts ; current_part++ ) + { + if ( arc.Saving() ) + { + part = parts.ObjectAt( current_part ); + part_ptr = ∂ + } + else + { + parts.AddObject( part ); + part_ptr = parts.AddressOfObjectAt( current_part ); + } + + arc.ArchiveSafePointer( &part_ptr->ent ); + arc.ArchiveUnsigned( &part_ptr->state_flags ); + } + } + + arc.ArchiveSafePointer( &trigger ); + + arc.ArchiveString( &enemytype ); + + arc.ArchiveUnsigned( &state_flags ); + arc.ArchiveString( &command ); + + arc.ArchiveSafePointer( &incoming_proj ); + arc.ArchiveFloat( &incoming_time ); + + arc.ArchiveFloat( &actorrange_time ); + arc.ArchiveFloat( &last_height ); + arc.ArchiveSafePointer( &last_ent ); + + arc.ArchiveFloat( &canseeenemy_time ); + + arc.ArchiveInteger( &stage ); + + arc.ArchiveInteger( &num_of_spawns ); + + arc.ArchiveSafePointer( &spawnparent ); + +// DialogNode_t *dialog_list; + + // Save dialog stuff + + if ( arc.Saving() ) + { + DialogNode_t *dialog_node; + byte more; + str alias_name; + str parm; + int current_parm; + + dialog_node = dialog_list; + + while( dialog_node ) + { + more = true; + arc.ArchiveByte( &more ); + + alias_name = dialog_node->alias_name; + + arc.ArchiveString( &alias_name ); + arc.ArchiveInteger( &dialog_node->random_flag ); + arc.ArchiveFloat( &dialog_node->random_percent ); + arc.ArchiveInteger( &dialog_node->number_of_parms ); + + for( current_parm = 0 ; current_parm < dialog_node->number_of_parms ; current_parm++ ) + { + arc.ArchiveByte( &dialog_node->parms[ current_parm ].type ); + + parm = dialog_node->parms[ current_parm ].parm; + + arc.ArchiveString( &parm ); + } + + dialog_node = dialog_node->next; + } + + more = false; + arc.ArchiveByte( &more ); + } + else + { + byte more; + DialogNode_t *new_dialog_node; + DialogNode_t *current_dialog_node = NULL; + str alias_name; + str parm; + int current_parm; + + arc.ArchiveByte( &more ); + + while( more ) + { + new_dialog_node = NewDialogNode(); + + if ( current_dialog_node ) + current_dialog_node->next = new_dialog_node; + else + dialog_list = new_dialog_node; + + current_dialog_node = new_dialog_node; + new_dialog_node->next = NULL; + + arc.ArchiveString( &alias_name ); + strcpy( new_dialog_node->alias_name, alias_name.c_str() ); + + arc.ArchiveInteger( &new_dialog_node->random_flag ); + arc.ArchiveFloat( &new_dialog_node->random_percent ); + arc.ArchiveInteger( &new_dialog_node->number_of_parms ); + + for( current_parm = 0 ; current_parm < new_dialog_node->number_of_parms ; current_parm++ ) + { + arc.ArchiveByte( &new_dialog_node->parms[ current_parm ].type ); + + arc.ArchiveString( &parm ); + strcpy( new_dialog_node->parms[ current_parm ].parm, parm.c_str() ); + } + + arc.ArchiveByte( &more ); + } + } + + arc.ArchiveFloat( &dialog_done_time ); + arc.ArchiveString( &dialog_state_name ); + arc.ArchiveString( &dialog_old_state_name ); + + arc.ArchiveVector( &watch_offset ); + + arc.ArchiveInteger( &mode ); + arc.ArchiveString( &idle_state_name ); + arc.ArchiveFloat( &next_player_near ); + + arc.ArchiveInteger( &saved_mode ); + + if ( arc.Saving() ) + { + if ( saved_behavior ) + { + temp_bool = true; + arc.ArchiveBoolean( &temp_bool ); + arc.ArchiveObject( saved_behavior ); + } + else + { + temp_bool = false; + arc.ArchiveBoolean( &temp_bool ); + } + } + else + { + arc.ArchiveBoolean( &temp_bool ); + + if ( temp_bool ) + saved_behavior = ( Behavior * )arc.ReadObject(); + else + saved_behavior = NULL; + } + + arc.ArchiveSafePointer( &saved_scriptthread ); + arc.ArchiveSafePointer( &saved_actorthread ); + arc.ArchiveString( &saved_anim_name ); + arc.ArchiveString( &saved_state_name ); + arc.ArchiveString( &saved_anim_event_name ); + + arc.ArchiveString( &last_anim_event_name ); + + arc.ArchiveSafePointer( &pickup_ent ); + + arc.ArchiveInteger( &pain_type ); + arc.ArchiveVector( &pain_angles ); + arc.ArchiveInteger( &bullet_hits ); + + arc.ArchiveFloat( &stunned_end_time ); + + spawn_items.Archive( arc ); + + arc.ArchiveFloat( &spawn_chance ); + + arc.ArchiveString( &bounce_off_effect ); + + arc.ArchiveVector( &last_attack_pos ); + arc.ArchiveVector( &last_attack_enemy_pos ); + arc.ArchiveSafePointer( &last_attack_entity_hit ); + arc.ArchiveVector( &last_attack_entity_hit_pos ); + + arc.ArchiveVector( &last_known_enemy_pos ); + + can_be_finsihed_by_mods.Archive( arc ); + + arc.ArchiveFloat( &feet_width ); + + arc.ArchiveVector( &last_origin ); + + arc.ArchiveFloat( &next_find_enemy_time ); + + arc.ArchiveFloat( &minimum_melee_height ); + arc.ArchiveFloat( &damage_angles ); + + arc.ArchiveFloat( &real_head_pitch ); + + arc.ArchiveFloat( &next_pain_sound_time ); + + arc.ArchiveFloat( &last_ground_z ); + + arc.ArchiveFloat( &water_level ); + + arc.ArchiveFloat( &max_boss_health ); + + if ( flags & FL_THINK ) + Wakeup(); + else + Sleep(); + + /* if ( arc.Saving() ) + { + // Determine the save flags + save_flags = 0; + + if ( newanim.length() ) + save_flags |= SAVE_FLAG_NEW_ANIM; + + if ( forwardspeed ) + save_flags |= SAVE_FLAG_FORWARD_SPEED; + + if ( behavior != NULL ) + save_flags |= SAVE_FLAG_BEHAVIOR; + + if ( path != NULL ) + save_flags |= SAVE_FLAG_PATH; + + if ( GetActorFlag( ACTOR_FLAG_NOISE_HEARD ) ) + save_flags |= SAVE_FLAG_NOISE; + + if ( scriptthread ) + save_flags |= SAVE_FLAG_SCRIPT_THREAD; + + if ( actorthread ) + save_flags |= SAVE_FLAG_ACTOR_THREAD; + + if ( kill_thread ) + save_flags |= SAVE_FLAG_KILL_THREAD; + + if ( currentState ) + save_flags |= SAVE_FLAG_STATE; + + if ( idle_thread ) + save_flags |= SAVE_FLAG_IDLE_THREAD; + + if ( parts.NumObjects() ) + save_flags |= SAVE_FLAG_PARTS; + + if ( trigger ) + save_flags |= SAVE_FLAG_TRIGGER; + + if ( state_flags ) + save_flags |= SAVE_FLAG_STATE_FLAGS; + + if ( command.length() ) + save_flags |= SAVE_FLAG_COMMAND; + + if ( stage ) + save_flags |= SAVE_FLAG_STAGE; + + if ( num_of_spawns ) + save_flags |= SAVE_FLAG_NUM_OF_SPAWNS; + + if ( spawnparent ) + save_flags |= SAVE_FLAG_SPAWN_PARENT; + + if ( GetActorFlag( ACTOR_FLAG_DIALOG_PLAYING ) ) + save_flags |= SAVE_FLAG_DIALOG; + + if ( saved_mode != ACTOR_MODE_NONE ) + save_flags |= SAVE_FLAG_SAVED_STUFF; + + if ( last_anim_event != NULL ) + save_flags |= SAVE_FLAG_LAST_ANIM_EVENT; + + if ( pickup_ent ) + save_flags |= SAVE_FLAG_PICKUP_ENT; + + if ( ( state_flags & STATE_FLAG_SMALL_PAIN ) || ( state_flags & STATE_FLAG_IN_PAIN ) ) + save_flags |= SAVE_FLAG_PAIN; + + if ( spawn_items.NumObjects() ) + save_flags |= SAVE_FLAG_SPAWN_ITEMS; + } + + // Save the save flags + + arc.ArchiveUnsigned( &save_flags ); + + // Add needed fields + + if ( save_flags & SAVE_FLAG_NEW_ANIM ) + { + arc.ArchiveString( &newanim ); + arc.ArchiveEventPointer( &newanimevent ); + arc.ArchiveInteger( &newanimnum ); + } + + if ( save_flags & SAVE_FLAG_FORWARD_SPEED ) + arc.ArchiveFloat( &forwardspeed ); + + arc.ArchiveString( &animname ); + + if ( save_flags & SAVE_FLAG_BEHAVIOR ) + { + if ( arc.Saving() ) + { + arc.ArchiveObject( behavior ); + } + else + { + behavior = ( Behavior * )arc.ReadObject(); + currentBehavior = behavior->getClassname(); + } + } + + if ( save_flags & SAVE_FLAG_PATH ) + arc.ArchiveSafePointer( &path ); + + arc.ArchiveSafePointer( ¤tEnemy ); + + arc.ArchiveUnsigned( &actor_flags1 ); + arc.ArchiveUnsigned( &actor_flags2 ); + + if ( save_flags & SAVE_FLAG_NOISE ) + { + arc.ArchiveVector( &noise_position ); + arc.ArchiveFloat( &noise_time ); + } + + arc.ArchiveFloat( &turnspeed ); + + if ( save_flags & SAVE_FLAG_SCRIPT_THREAD ) + arc.ArchiveSafePointer( &scriptthread ); + + if ( save_flags & SAVE_FLAG_ACTOR_THREAD ) + arc.ArchiveSafePointer( &actorthread ); + + if ( save_flags & SAVE_FLAG_KILL_THREAD ) + arc.ArchiveString( &kill_thread ); + + if ( save_flags & SAVE_FLAG_STATE ) + { + str temp_name; + + if ( arc.Saving() ) + { + temp_name = currentState->getName(); + } + arc.ArchiveString( &temp_name ); + if ( arc.Loading() ) + { + SetState( temp_name ); + } + } + + arc.ArchiveInteger( &stimuli ); + + if ( save_flags & SAVE_FLAG_IDLE_THREAD ) + arc.ArchiveString( &idle_thread ); + + if ( arc.Loading() ) + { + last_enemy_sight_time = level.time; + last_time_active = level.time; + } + + arc.ArchiveFloat( &max_inactive_time ); + + if ( save_flags & SAVE_FLAG_PARTS ) + { + part_t part; + int current_part; + int number_of_parts; + + if ( arc.Saving() ) + { + number_of_parts = parts.NumObjects(); + } + else + { + parts.ClearObjectList(); + } + + arc.ArchiveInteger( &number_of_parts ); + + for( current_part = 1; current_part <= number_of_parts ; current_part++ ) + { + if ( arc.Saving() ) + { + part = parts.ObjectAt( current_part ); + } + arc.ArchiveSafePointer( &part.ent ); + arc.ArchiveUnsigned( &part.state_flags ); + if ( arc.Loading() ) + { + parts.AddObject( part ); + } + } + } + + if ( save_flags & SAVE_FLAG_TRIGGER ) + arc.ArchiveSafePointer( &trigger ); + + if ( save_flags & SAVE_FLAG_STATE_FLAGS ) + arc.ArchiveUnsigned( &state_flags ); + + if ( save_flags & SAVE_FLAG_COMMAND ) + arc.ArchiveString( &command ); + + if ( save_flags & SAVE_FLAG_STAGE ) + { + arc.ArchiveInteger( &stage ); + } + + if ( save_flags & SAVE_FLAG_NUM_OF_SPAWNS ) + arc.ArchiveInteger( &num_of_spawns ); + + if ( save_flags & SAVE_FLAG_SPAWN_PARENT ) + arc.ArchiveSafePointer( &spawnparent ); + + if ( save_flags & SAVE_FLAG_DIALOG ) + { + arc.ArchiveFloat( &dialog_done_time ); + arc.ArchiveString( &dialog_state_name ); + arc.ArchiveString( &dialog_old_state_name ); + } + + arc.ArchiveInteger( &mode ); + + if ( save_flags & SAVE_FLAG_SAVED_STUFF ) + { + bool tempBool; + + arc.ArchiveInteger( &saved_mode ); + + tempBool = ( saved_behavior != NULL ); + arc.ArchiveBool( &tempBool ); + if ( tempBool ) + { + if ( arc.Saving() ) + { + arc.ArchiveObject( saved_behavior ); + } + else + { + Behavior * behavior; + + behavior = ( Behavior * )arc.ReadObject(); + saved_behavior = behavior; + } + } + + arc.ArchiveSafePointer( &saved_scriptthread ); + arc.ArchiveSafePointer( &saved_actorthread ); + + arc.ArchiveString( &saved_anim_name ); + arc.ArchiveString( &saved_state_name ); + + arc.ArchiveEventPointer( &saved_anim_event ); + } + + if ( arc.Loading() ) + { + stunned_end_time = level.time; + } + + if ( save_flags & SAVE_FLAG_LAST_ANIM_EVENT ) + { + arc.ArchiveEventPointer( &last_anim_event ); + } + + if ( save_flags & SAVE_FLAG_PICKUP_ENT ) + arc.ArchiveSafePointer( &pickup_ent ); + + if ( save_flags & SAVE_FLAG_PAIN ) + { + arc.ArchiveInteger( &pain_type ); + arc.ArchiveVector( &pain_angles ); + } + + if ( save_flags & SAVE_FLAG_SPAWN_ITEMS ) + { + spawn_items.Archive( arc ); + } + + if ( arc.Loading() ) + { + last_origin = origin + "1 1 1"; + } */ + } + +// Set destination to node with duck or cover set. Class will find a path to that node, or a closer one. +class FindCoverMovement : public StandardMovement + { + public: + Actor *self; + + inline qboolean validpath + ( + PathNode *node, + int i + ) + + { + pathway_t *path; + PathNode *n; + + path = &node->Child[ i ]; + + if ( !StandardMovement::validpath( node, i ) ) + { + return false; + } + + n = AI_GetNode( path->node ); + if ( !n || self->CloseToEnemy( n->origin, 128 ) ) + { + return false; + } + + return true; + } + + inline qboolean done + ( + PathNode *node, + PathNode *end + ) + + { + if ( node == end ) + { + return true; + } + + //if ( node->reject ) + if ( node->reject || !( node->nodeflags & ( AI_DUCK | AI_COVER ) ) ) + { + return false; + } + + if ( self ) + { + node->reject = self->CanSeeEnemyFrom( node->origin ); + return !node->reject; + } + + return false; + } + }; + +// Set destination to node with flee set. Class will find a path to that node, or a closer one. +class FindFleeMovement : public StandardMovement + { + public: + Actor *self; + + inline qboolean validpath + ( + PathNode *node, + int i + ) + + { + pathway_t *path; + PathNode *n; + + path = &node->Child[ i ]; + + if ( !StandardMovement::validpath( node, i ) ) + { + return false; + } + + n = AI_GetNode( path->node ); + if ( !n || self->CloseToEnemy( n->origin, 128 ) ) + { + return false; + } + + return true; + } + + inline qboolean done + ( + PathNode *node, + PathNode *end + ) + + { + if ( node == end ) + { + return true; + } + + //if ( node->reject ) + if ( node->reject || !( node->nodeflags & AI_FLEE ) ) + { + return false; + } + + if ( self ) + { + node->reject = self->CanSeeEnemyFrom( node->origin ); + return !node->reject; + } + + return false; + } + }; + +class FindEnemyMovement : public StandardMovement + { + public: + Actor *self; + + inline qboolean done + ( + PathNode *node, + PathNode *end + ) + + { + if ( node == end ) + { + return true; + } + + if ( node->reject ) + { + return false; + } + + if ( self ) + { + if ( self->currentEnemy ) + { + node->reject = !self->CanShootFrom( node->origin, self->currentEnemy, false ); + } + else + { + node->reject = false; + } + + return !node->reject; + } + + return false; + } + }; + +typedef PathFinder FindCoverPath; +typedef PathFinder FindFleePath; +typedef PathFinder FindEnemyPath; + +void AI_TargetPlayer( void ); + +class SpinningPlant : public Actor + { + public: + Mover *spinner_model; + Mover *spinner_clip; + + CLASS_PROTOTYPE( SpinningPlant ); + + SpinningPlant(); + ~SpinningPlant(); + + void GetClip( Event *ev ); + }; + +#endif /* actor.h */ \ No newline at end of file diff --git a/source/source/fgame/ammo.cpp b/source/source/fgame/ammo.cpp new file mode 100644 index 0000000..7ed83f8 --- /dev/null +++ b/source/source/fgame/ammo.cpp @@ -0,0 +1,218 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/ammo.cpp $ +// $Revision:: 11 $ +// $Author:: Markd $ +// $Date:: 7/01/00 4:11p $ +// +// Copyright (C) 1997 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/ammo.cpp $ +// +// 11 7/01/00 4:11p Markd +// added pickup_thread to ammo +// +// 10 6/23/00 8:41p Markd +// made a lot of changes to different constructors for saved game support +// +// 9 6/14/00 2:17p Markd +// fixed compiler warnings for Intel Compiler +// +// 8 5/22/00 4:41p Steven +// Fixed ammo ItemPickup (had different number of parms from item one). +// +// 7 4/05/00 7:13p Aldie +// Lots of inventory functionality changes. +// +// 6 3/02/00 4:43p Aldie +// Added some ammo functionality for the HUD +// +// 5 1/26/00 3:33p Aldie +// Change Amount to getAmount. Added some 'listinventory' command. Added give +// all cheat to execute the script in global/giveall.txt +// +// 4 12/03/99 7:02p Aldie +// More ammo joy +// +// 3 11/29/99 6:32p Aldie +// Lots of changes for ammo system +// +// 2 11/22/99 6:46p Aldie +// Started working on ammo changes - will finish after Thanksgiving break +// +// 1 9/10/99 10:53a Jimdose +// +// 1 9/08/99 3:15p Aldie +// +// +// DESCRIPTION: +// Base class for all ammunition for entities derived from the Weapon class. +// +// AmmoEntity is the Class which represents ammo that the player "sees" and " +// picks up" in the game +// +// Ammo is the Class which is used to keep track of how much ammo a player has +// in his inventory + +#include "ammo.h" +#include "player.h" + +CLASS_DECLARATION( Item, AmmoEntity, NULL ) + { + { NULL, NULL } + }; + +AmmoEntity::AmmoEntity + ( + ) + + { + if ( LoadingSavegame ) + { + // all data will be setup by the archive function + return; + } + setName( "UnknownAmmo" ); + amount = 0; + } + +Item *AmmoEntity::ItemPickup + ( + Entity *other, + qboolean add_to_inventory + ) + + { + Sentient *player; + str realname; + + if ( !other->isSubclassOf( Player ) ) + return NULL; + + player = ( Sentient * )other; + + // Play pickup sound + realname = GetRandomAlias( "snd_pickup" ); + if ( realname.length() > 1 ) + player->Sound( realname, CHAN_ITEM ); + + // Cancel some events + CancelEventsOfType( EV_Item_DropToFloor ); + CancelEventsOfType( EV_Item_Respawn ); + CancelEventsOfType( EV_FadeOut ); + + // Hide the model + setSolidType( SOLID_NOT ); + hideModel(); + + // Respawn? + if ( !Respawnable() ) + PostEvent( EV_Remove, FRAMETIME ); + else + PostEvent( EV_Item_Respawn, RespawnTime() ); + + // fire off any pickup_thread's + if ( pickup_thread.length() ) + { + ExecuteThread( pickup_thread ); + } + + // Give the ammo to the player + player->GiveAmmo( item_name, amount ); + return NULL; // This doesn't create any items + } + + +// This is the Class that is used to keep track of ammo in the player's inventory. +// It is not an entit, just a name and an amount. + +CLASS_DECLARATION( Class, Ammo, NULL ) + { + {NULL, NULL} + }; + +Ammo::Ammo + ( + ) + + { + if ( LoadingSavegame ) + { + // all data will be setup by the archive function + return; + } + setName( "UnknownAmmo" ); + setAmount( 0 ); + setMaxAmount( 100 ); + } + +void Ammo::setAmount + ( + int a + ) + + { + amount = a; + + if ( ( maxamount > 0 ) && ( amount > maxamount ) ) + amount = maxamount; + } + +int Ammo::getAmount + ( + void + ) + + { + return amount; + } + +void Ammo::setMaxAmount + ( + int a + ) + + { + maxamount = a; + } + +int Ammo::getMaxAmount + ( + void + ) + + { + return maxamount; + } + +void Ammo::setName + ( + str n + ) + + { + name = n; + name_index = gi.itemindex( name ); + } + +str Ammo::getName + ( + void + ) + + { + return name; + } + +int Ammo::getIndex + ( + void + ) + + { + return name_index; + } diff --git a/source/source/fgame/ammo.h b/source/source/fgame/ammo.h new file mode 100644 index 0000000..ea8d22c --- /dev/null +++ b/source/source/fgame/ammo.h @@ -0,0 +1,115 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/ammo.h $ +// $Revision:: 12 $ +// $Author:: Markd $ +// $Date:: 7/14/00 9:46a $ +// +// Copyright (C) 1997 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/ammo.h $ +// +// 12 7/14/00 9:46a Markd +// added comment about member variable not being in archive +// +// 11 6/14/00 2:17p Markd +// fixed compiler warnings for Intel Compiler +// +// 10 5/30/00 7:06p Markd +// saved games 4th pass +// +// 9 5/25/00 7:52p Markd +// 2nd pass save game stuff +// +// 8 5/24/00 3:13p Markd +// first phase of save/load games +// +// 7 5/22/00 4:40p Steven +// Fixed ammo ItemPickup (had different number of parms from item one). +// +// 6 5/20/00 5:15p Markd +// Added ammo archive member functions +// +// 5 3/02/00 4:43p Aldie +// Added some ammo functionality for the HUD +// +// 4 12/03/99 7:02p Aldie +// More ammo joy +// +// 3 11/29/99 6:32p Aldie +// Lots of changes for ammo system +// +// 2 11/22/99 6:46p Aldie +// Started working on ammo changes - will finish after Thanksgiving break +// +// 1 9/10/99 10:53a Jimdose +// +// 1 9/08/99 3:15p Aldie +// +// DESCRIPTION: +// Base class for all ammunition for entities derived from the Weapon class. +// + +#ifndef __AMMO_H__ +#define __AMMO_H__ + +#include "g_local.h" +#include "item.h" + +class AmmoEntity : public Item + { + public: + CLASS_PROTOTYPE( AmmoEntity ); + + AmmoEntity(); + virtual Item *ItemPickup( Entity *other, qboolean add_to_inventory ); + }; + +class Ammo : public Class + { + int amount; + int maxamount; + str name; + int name_index; + + public: + CLASS_PROTOTYPE( Ammo ); + + Ammo(); + Ammo(str name, int amount, int name_index ); + + void setAmount( int a ); + int getAmount( void ); + void setMaxAmount( int a ); + int getMaxAmount( void ); + void setName( str name); + str getName( void ); + int getIndex( void ); + virtual void Archive( Archiver &arc ); + }; + +inline void Ammo::Archive + ( + Archiver &arc + ) + + { + Class::Archive( arc ); + + arc.ArchiveInteger( &amount ); + arc.ArchiveInteger( &maxamount ); + arc.ArchiveString( &name ); + // + // name_index not archived, because it is auto-generated by gi.itemindex + // + if ( arc.Loading() ) + { + setName( name ); + } + } + +#endif /* ammo.h */ diff --git a/source/source/fgame/animate.cpp b/source/source/fgame/animate.cpp new file mode 100644 index 0000000..f54db01 --- /dev/null +++ b/source/source/fgame/animate.cpp @@ -0,0 +1,1131 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/animate.cpp $ +// $Revision:: 38 $ +// $Author:: Markd $ +// $Date:: 7/22/00 7:32p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/animate.cpp $ +// +// 38 7/22/00 7:32p Markd +// bullet proofed RandomAnimate code +// +// 37 6/26/00 5:50p Markd +// re-did some renderfx commands, fixed anti-sb juice stuff +// +// 36 6/23/00 9:14p Markd +// don't go into NewAnim if we are currently loading a saved game +// +// 35 6/22/00 5:32p Steven +// Made it so server commands don't get run if RF_DONT_PROCESS_COMMANDS is set. +// +// 34 6/21/00 6:02p Markd +// allowed lower framerate animations to still post animations properly +// +// 33 6/05/00 3:11p Markd +// fixed HasCommands calls in server +// +// 32 5/02/00 10:59a Aldie +// Fix for initializations +// +// 31 4/14/00 11:31a Aldie +// Fixed cut and paste error +// +// 30 4/13/00 7:04p Aldie +// Fixed bug for animation events where the anim was greater than 255. Added +// animframe and animnumber to Event. +// +// 29 4/11/00 5:30p Markd +// fixed one frame animation bug +// +// 28 4/01/00 3:46p Markd +// Added single frame animation optimization +// +// 27 3/27/00 6:24p Markd +// reworked NewAnim function +// +// 26 3/21/00 2:30p Aldie +// Fixed a statck overflow with ClearTorsoAnim and ClearLegsAnim +// +// 25 3/20/00 5:00p Aldie +// Fixes for entry and exit commands +// +// 24 3/15/00 4:09p Aldie +// Fixed a bug with using weapons, and added some ability to force a state in +// the player +// +// 23 2/23/00 11:44a Markd +// fixed bug with 1 frame animations +// +// 22 2/22/00 6:20p Markd +// modified the way that the animation system works so that the animdone event +// is actually played 1 frame before the end of the animation +// +// 21 2/16/00 6:54p Markd +// reordered deltas and time based events +// +// 20 2/14/00 5:43p Jimdose +// legs anims are now only mixed in if ANIM_BLEND is set +// +// 19 2/09/00 6:02p Markd +// added entry and exit support to server side +// +// 18 1/27/00 9:05a Markd +// fixed enttiy type over writing +// +// 17 1/26/00 12:03p Markd +// added back old lighting code for certain objects in the game +// +// 16 1/22/00 12:42p Jimdose +// got rid of calls to vec3() +// +// 15 1/19/00 8:50p Jimdose +// added Anim_AbsolueDelta +// +// 14 1/12/00 11:27a Markd +// made entities which don't explicitly animate, not animate +// +// 13 1/06/00 11:08p Jimdose +// cleaning up unused code +// +// 12 12/10/99 12:30p Jimdose +// calling NewAnim multiple times per frame no longer toggles the togglebit +// more than once (which used to sometimes cause the animation not to change) +// +// 11 12/09/99 7:37p Jimdose +// changed magic number to MDL_ANIM_DELTA_DRIVEN +// +// 10 12/01/99 4:56p Markd +// fixed some reference versus pointer issues with RandomAnimate and NewAnim +// +// 9 12/01/99 3:17p Aldie +// fix for animation bug +// +// 8 11/11/99 5:25p Jimdose +// added separate torso animation +// +// 7 11/11/99 3:54p Jimdose +// readded separate torso animations +// +// 6 10/19/99 7:52p Markd +// Removed three part model system +// +// 5 10/08/99 2:12p Markd +// Made Animate entities of type MODELANIM +// +// 4 10/06/99 7:25p Markd +// removed TIMESTAMP, time and fixed make_static bug +// +// 3 9/27/99 6:18p Markd +// Added event documentation +// +// 2 9/16/99 11:18a Markd +// Continuing merge of code, not functional yet but closer +// +// 1 9/10/99 10:53a Jimdose +// +// 1 9/08/99 3:15p Aldie +// +// 22 9/01/99 9:08p Markd +// added animate once support +// +// 21 8/27/99 5:00p Markd +// cleaned up animate code so that deltas were only posted as needed +// +// 20 8/27/99 4:35p Jimdose +// changed NewAnim to post the anim done event after the frame events instead +// of before. +// +// 19 8/19/99 6:59p Markd +// removed the old tiki_cmd structure, now tiki_cmd_t is passed into the tiki +// functions +// +// 18 8/19/99 6:40p Steven +// Added a stop anim event. +// +// 17 8/09/99 5:07p Aldie +// More changes to accomodate weapons system +// +// 16 8/05/99 9:14a Steven +// Added a stop animating at end so that it wouldn't skip to beginning of +// animation again. +// +// 15 7/14/99 4:41p Markd +// Changed at which times events are posted +// +// DESCRIPTION: Animate Class +// + +#include "g_local.h" +#include "animate.h" +#include "player.h" +#include "../qcommon/qfiles.h" + +// Leg Animation events +Event EV_Anim + ( + "anim", + 0, + "s", + "animName", + "set the legs animation to animName." + ); + +Event EV_SetFrame + ( + "setframe", + 0, + "iS", + "frameNumber animName", + "Set the frame on the legs, if anim is not specified, current is assumed." + ); +Event EV_AnimDone + ( + "animdone", + 0, + NULL, + NULL, + "Legs animation has finished, not for script use." + ); +Event EV_FrameDelta + ( + "setmovedelta", + 0, + "vf", + "moveDelta moveTime", + "movement from animation, not for script use." + ); +Event EV_StopAnimating + ( + "stopanimating", + 0, + NULL, + NULL, + "stop the legs from animating. Animation will end at the end of current cycle." + ); + +// Torso Animation events +Event EV_Torso_Anim + ( + "torso_anim", + 0, + "s", + "animName", + "set the torso animation to animName." + ); +Event EV_Torso_SetFrame + ( + "torso_setframe", + 0, + "iS", + "frameNumber animName", + "Set the frame on the torso, if anim is not specified, current is assumed." + ); +Event EV_Torso_AnimDone + ( + "torso_animdone", + 0, + NULL, + NULL, + "Torso animation has finished, not for script use." + ); +Event EV_Torso_StopAnimating + ( + "torso_stopanimating", + 0, + NULL, + NULL, + "stop the torso from animating. Animation will end at the end of current cycle." + ); + +Event EV_NewAnim + ( + "animate_newanim", + 0, + "ii", + "animNum bodyPart", + "Start a new animation, not for script use." + ); + +CLASS_DECLARATION( Entity, Animate, "animate" ) + { + { &EV_Anim, Legs_AnimEvent }, + { &EV_SetFrame, Legs_SetFrameEvent }, + { &EV_AnimDone, Legs_AnimDoneEvent }, + { &EV_StopAnimating, Legs_StopAnimating }, + { &EV_FrameDelta, FrameDeltaEvent }, + { &EV_NewAnim, NewAnimEvent }, + + { &EV_Torso_Anim, Torso_AnimEvent }, + { &EV_Torso_SetFrame, Torso_SetFrameEvent }, + { &EV_Torso_AnimDone, Torso_AnimDoneEvent }, + { &EV_Torso_StopAnimating,Torso_StopAnimating }, + + { NULL, NULL } + }; + +Animate::Animate() + { + // Animation variables + frame_delta = "0 0 0"; + animDoneEvent = NULL; + torso_animDoneEvent = NULL; + + legs_animtime = 0; + torso_animtime = 0; + + legs_starttime = 0; + torso_starttime = 0; + + legs_numframes = 0; + torso_numframes = 0; + + edict->s.anim |= (ANIM_SERVER_EXITCOMMANDS_PROCESSED); + edict->s.torso_anim |= (ANIM_SERVER_EXITCOMMANDS_PROCESSED); + } + +void Animate::NewAnim + ( + int animnum, + bodypart_t part + ) + + { + float totaltime; + int *anim; + int flags; + int i; + float time; + tiki_cmd_t cmds; + Event *ev; + float *starttime; + float *animtime; + float *frametime; + int *numframes; + int last_anim,last_anim_flags; + qboolean dodelta; // should we even post movement delta stuff? + qboolean has_commands; // does this animation have any frame commands + + // + // this is an animating model, we set this here so that non-animating models + // don't have to go through the animating code path + // + if ( edict->s.eType == ET_GENERAL ) + { + edict->s.eType = ET_MODELANIM; + } + + if ( LoadingSavegame ) + { + // if we are loading a game, we don't need to start animating, that will be automatic + // all these events would mess everything up anyway + return; + } + + // initially don't post move delta stuff + dodelta = qfalse; + + switch( part ) + { + case legs: + anim = &edict->s.anim; + edict->s.frame &= ~FRAME_EXPLICIT; + flags = EVENT_LEGS_ANIM; + animtime = &legs_animtime; + starttime = &legs_starttime; + frametime = &legs_frametime; + numframes = &legs_numframes; + break; + case torso: + anim = &edict->s.torso_anim; + edict->s.torso_frame &= ~FRAME_EXPLICIT; + flags = EVENT_TORSO_ANIM; + animtime = &torso_animtime; + starttime = &torso_starttime; + frametime = &torso_frametime; + numframes = &torso_numframes; + break; + default: + warning( "NewAnim", "Unknown body part %d", part ); + return; + break; + } + + last_anim = *anim & ANIM_MASK; + last_anim_flags = *anim; + + // + // if the animations were different we need to process the entry and exit events + // + if ( ( last_anim != animnum ) && !( last_anim_flags & ANIM_SERVER_EXITCOMMANDS_PROCESSED ) ) + { + // exit the previous animation + if ( gi.Frame_Commands( edict->s.modelindex, last_anim, TIKI_FRAME_CMD_EXIT, &cmds ) ) + { + int ii, j; + + for( ii = 0; ii < cmds.num_cmds; ii++ ) + { + ev = new Event( cmds.cmds[ ii ].args[ 0 ] ); + + ev->SetSource( EV_FROM_ANIMATION ); + ev->SetAnimationNumber( last_anim ); + ev->SetAnimationFrame( 0 ); + + for( j = 1; j < cmds.cmds[ ii ].num_args; j++ ) + { + ev->AddToken( cmds.cmds[ ii ].args[ j ] ); + } + ProcessEvent( ev ); + } + } + } + + if ( ( animnum >= 0 ) && ( animnum < gi.NumAnims( edict->s.modelindex ) ) ) + { + if ( *starttime == level.time ) + { + // don't toggle the togglebit if we've already had an animation set this frame + *anim = ( *anim & ANIM_TOGGLEBIT ) | animnum | ANIM_BLEND; + } + else + { + *anim = ( ( *anim & ANIM_TOGGLEBIT ) ^ ANIM_TOGGLEBIT ) | animnum | ANIM_BLEND; + } + } + else + { + // bad value + return; + } + + // get rid of old anim events + CancelFlaggedEvents( flags ); + + // get total time of animation + totaltime = gi.Anim_Time( edict->s.modelindex, animnum ); + + // set the total time for the animation + *animtime = totaltime; + + // set the start time of the animation + *starttime = level.time; + + // set the number of frames for the animation + *numframes = gi.Anim_NumFrames( edict->s.modelindex, animnum ); + + // set the time for each animation frame + *frametime = gi.Frame_Time( edict->s.modelindex, animnum, 0 ); + + has_commands = gi.Anim_HasCommands( edict->s.modelindex, animnum ); + + if ( edict->s.eFlags & EF_DONT_PROCESS_COMMANDS ) + has_commands = false; + + if ( ( last_anim != animnum ) && ( has_commands ) ) + { + // enter this animation + if ( gi.Frame_Commands( edict->s.modelindex, animnum, TIKI_FRAME_CMD_ENTRY, &cmds ) ) + { + int ii, j; + + for( ii = 0; ii < cmds.num_cmds; ii++ ) + { + ev = new Event( cmds.cmds[ ii ].args[ 0 ] ); + + ev->SetSource( EV_FROM_ANIMATION ); + ev->SetAnimationNumber( animnum ); + ev->SetAnimationFrame( 0 ); + + for( j = 1; j < cmds.cmds[ ii ].num_args; j++ ) + { + ev->AddToken( cmds.cmds[ ii ].args[ j ] ); + } + ProcessEvent( ev ); + } + } + } + + + // if it is the legs, find out if there is a delta and if it is a delta_driven animation + if ( part == legs ) + { + float length; + Vector totaldelta; + + gi.Anim_AbsoluteDelta( edict->s.modelindex, animnum, totaldelta ); + length = totaldelta.length(); + if ( length > MINIMUM_DELTA_MOVEMENT ) + { + int flags; + + flags = gi.Anim_Flags( edict->s.modelindex, animnum ); + if ( !( flags & MDL_ANIM_DELTA_DRIVEN ) ) + { + length /= *numframes; + if ( length > MINIMUM_DELTA_MOVEMENT_PER_FRAME ) + { + dodelta = qtrue; + } + } + } + } + + if ( has_commands || dodelta ) + { + time = 0; + + for( i = 0; i < *numframes; i++ ) + { + if ( has_commands ) + { + // we want normal frame commands to occur right on the frame + if ( gi.Frame_Commands( edict->s.modelindex, animnum, i, &cmds ) ) + { + int ii, j; + + for( ii = 0; ii < cmds.num_cmds; ii++ ) + { + ev = new Event( cmds.cmds[ ii ].args[ 0 ] ); + + ev->SetSource( EV_FROM_ANIMATION ); + ev->SetAnimationNumber( animnum ); + ev->SetAnimationFrame( i ); + + for( j = 1; j < cmds.cmds[ ii ].num_args; j++ ) + { + ev->AddToken( cmds.cmds[ ii ].args[ j ] ); + } + PostEvent( ev, time, flags ); + } + } + } + // add to time + time += *frametime; + + // we want deltas to occur at the end of the frame + // only add deltas on the legs + if ( dodelta ) + { + Vector delta; + + // get the current frame delta + gi.Frame_Delta( edict->s.modelindex, animnum, i, delta ); + + if ( *frametime > FRAMETIME ) + { + float time_offset; + + VectorScale( delta, ( FRAMETIME / *frametime ), delta ); + + for ( time_offset = 0; time_offset < *frametime; time_offset += FRAMETIME ) + { + ev = new Event( EV_FrameDelta ); + ev->AddVector( delta ); + ev->AddFloat( *frametime ); + PostEvent( ev, time + time_offset, flags ); + } + } + else + { + ev = new Event( EV_FrameDelta ); + ev->AddVector( delta ); + ev->AddFloat( *frametime ); + PostEvent( ev, time, flags ); + } + } + + } + } + + // + // if we have a 1 frame animation, which has no commands, + // we aren't a subclass of Sentient and our animation time is the same as frametime + // there is no reason for us to constantly animate, since nothing will change + // lets get the hell out of dodge! + if ( + ( *numframes == 1 ) && + !isSubclassOf( Player ) && + !has_commands && + ( *frametime == FRAMETIME ) + ) + { + switch( part ) + { + case legs: + if ( animDoneEvent ) + { + PostEvent( *animDoneEvent, 0 ); + } + break; + case torso: + if ( torso_animDoneEvent ) + { + PostEvent( *torso_animDoneEvent, 0 ); + } + break; + default: + break; + } + return; + } + + switch( part ) + { + case legs: + if ( totaltime > *frametime ) + PostEvent( EV_AnimDone, totaltime - *frametime, flags ); + else + PostEvent( EV_AnimDone, totaltime, flags ); + break; + case torso: + if ( totaltime > *frametime ) + PostEvent( EV_Torso_AnimDone, totaltime - *frametime, flags ); + else + PostEvent( EV_Torso_AnimDone, totaltime, flags ); + break; + default: + warning( "NewAnim", "Unknown body part %d", part ); + return; + break; + } + } + +void Animate::NewAnim + ( + int animnum, + Event &newevent, + bodypart_t part + ) + { + SetAnimDoneEvent( newevent, part ); + NewAnim( animnum, part ); + } + +void Animate::NewAnim + ( + int animnum, + Event *newevent, + bodypart_t part + ) + { + SetAnimDoneEvent( newevent, part ); + NewAnim( animnum, part ); + } + +void Animate::FrameDeltaEvent + ( + Event *ev + ) + + { + frame_delta = ev->GetVector( 1 ); + move_time = ev->GetFloat( 2 ); + total_delta += frame_delta * edict->s.scale; + } + +void Animate::EndAnim + ( + bodypart_t part + ) + + { + Event * ev; + + switch( part ) + { + case legs: + if ( animDoneEvent ) + { + PostEvent( *animDoneEvent, 0 ); + } + ev = new Event( EV_NewAnim ); + ev->AddInteger( edict->s.anim ); + ev->AddInteger( part ); + if ( legs_animtime > legs_frametime ) + PostEvent( ev, legs_frametime, EVENT_LEGS_ANIM ); + else + PostEvent( ev, 0, EVENT_LEGS_ANIM ); + break; + case torso: + if ( torso_animDoneEvent ) + { + PostEvent( *torso_animDoneEvent, 0 ); + } + ev = new Event( EV_NewAnim ); + ev->AddInteger( edict->s.torso_anim ); + ev->AddInteger( part ); + if ( torso_animtime > torso_frametime ) + PostEvent( ev, torso_frametime, EVENT_TORSO_ANIM ); + else + PostEvent( ev, 0, EVENT_TORSO_ANIM ); + break; + default: + warning( "EndAnim", "Unknown body part %d", part ); + return; + break; + } + } + +void Animate::SetAnimDoneEvent + ( + Event *event, + bodypart_t part + ) + { + Event **doneevent; + + switch( part ) + { + case legs: + doneevent = &animDoneEvent; + break; + case torso: + doneevent = &torso_animDoneEvent; + break; + default: + warning( "SetAnimDoneEvent", "Unknown body part %d", part ); + return; + break; + } + if ( *doneevent ) + { + delete *doneevent; + } + + *doneevent = event; + } + +void Animate::SetAnimDoneEvent + ( + Event &event, + bodypart_t part + ) + { + SetAnimDoneEvent( new Event( event ), part ); + } + +void Animate::RandomAnimate + ( + const char *animname, + Event *endevent, + bodypart_t part + ) + + { + Event *event_to_post; + int num; + int flags; + qboolean allparts; + + assert( animname ); + if ( !animname ) + { + return; + } + + allparts = false; + if ( part == all ) + { + allparts = true; + } + + do { + if ( allparts ) + { + switch( part ) + { + case all: + part = legs; + break; + case legs: + part = torso; + break; + case torso: + return; + break; + } + } + switch( part ) + { + case legs: + flags = EVENT_LEGS_ANIM; + break; + case torso: + flags = EVENT_TORSO_ANIM; + break; + default: + warning( "RandomAnimate", "Unknown body part %d", part ); + return; + break; + } + num = gi.Anim_Random( edict->s.modelindex, animname ); + + currentAnim = animname; + + // + // this is here to ensure that multiple distinct events are posted for each body part + // + if ( allparts && ( part != legs ) ) + { + if ( endevent ) + { + event_to_post = new Event( endevent ); + } + else + { + event_to_post = NULL; + } + } + else + { + event_to_post = endevent; + } + + // + // see if we even have a valid animation at all + // + if ( num == -1 ) + { + if ( event_to_post ) + { + PostEvent( event_to_post, FRAMETIME, flags ); + } + } + else + { + SetAnimDoneEvent( event_to_post, part ); + NewAnim( num, part ); + } + } while( allparts ); + } + +void Animate::SetFrame + ( + int framenum, + bodypart_t part, + int anim + ) + + { + int flags; + int numframes; + int *panim; + int *frame; + + switch( part ) + { + case legs: + frame = &edict->s.frame; + flags = EVENT_LEGS_ANIM; + numframes = legs_numframes; + panim = &edict->s.anim; + break; + case torso: + frame = &edict->s.torso_frame; + flags = EVENT_TORSO_ANIM; + numframes = torso_numframes; + panim = &edict->s.torso_anim; + break; + default: + warning( "SetFrame", "Unknown body part %d", part ); + return; + break; + } + + if ( anim >= 0 ) + { + numframes = gi.Anim_NumFrames( edict->s.modelindex, anim ); + } + + if ( framenum < 0 || framenum >= numframes ) + { + warning( "SetFrame","Frame is out of range" ); + return; + } + + // get rid of old anim events so we don't animate + CancelFlaggedEvents( flags ); + + *frame = framenum | FRAME_EXPLICIT; + + // if we have a frame override, make sure to set the animation as well + if ( anim >= 0 ) + { + *panim = anim | ANIM_BLEND; + } + } + +qboolean Animate::HasAnim + ( + const char *animname + ) + { + int num; + + num = gi.Anim_Random( edict->s.modelindex, animname ); + return ( num >= 0 ); + } + +void Animate::NewAnimEvent + ( + Event *ev + ) + + { + NewAnim( ev->GetInteger( 1 ) & ANIM_MASK, (bodypart_t) ev->GetInteger( 2 ) ); + } + +void Animate::StopAnimating + ( + bodypart_t part + ) + { + int frame; + int anim; + + if ( part == all ) + { + // legs + frame = CurrentFrame( legs ); + anim = CurrentAnim( legs ); + SetFrame( frame, legs, anim ); + // torso + frame = CurrentFrame( torso ); + anim = CurrentAnim( torso ); + SetFrame( frame, torso, anim ); + } + else + { + frame = CurrentFrame( part ); + anim = CurrentAnim( part ); + SetFrame( frame, part, anim ); + } + } + +void Animate::StopAnimatingAtEnd + ( + bodypart_t part + ) + { + int anim; + + if ( part == all ) + { + StopAnimatingAtEnd( legs ); + StopAnimatingAtEnd( torso ); + } + else if ( part == legs ) + { + anim = CurrentAnim( part ); + SetFrame( legs_numframes - 1, part, anim ); + } + else if ( part == torso ) + { + anim = CurrentAnim( part ); + SetFrame( legs_numframes - 1, part, anim ); + } + } + + +//////////////////////////// +// +// BODY PART SPECIFIC EVENTS +// +//////////////////////////// + +// Legs + +void Animate::Legs_AnimDoneEvent + ( + Event *ev + ) + + { + EndAnim( legs ); + } + + +void Animate::Legs_AnimEvent + ( + Event *ev + ) + + { + RandomAnimate( ev->GetString( 1 ), NULL, legs ); + } + +void Animate::Legs_SetFrameEvent + ( + Event *ev + ) + + { + int framenum; + int animnum; + + framenum = ev->GetInteger( 1 ); + if ( ev->NumArgs() > 1 ) + { + animnum = gi.Anim_NumForName( edict->s.modelindex, ev->GetString( 2 ) ); + } + else + { + animnum = -1; + } + + SetFrame( framenum, legs, animnum ); + } + +// HACK HACK HACK +void Animate::Legs_StopAnimating + ( + Event *ev + ) + + { + CancelFlaggedEvents( EVENT_LEGS_ANIM ); + } + +// Torso + +void Animate::Torso_AnimDoneEvent + ( + Event *ev + ) + + { + EndAnim( torso ); + } + +void Animate::Torso_AnimEvent + ( + Event *ev + ) + + { + RandomAnimate( ev->GetString( 1 ), NULL, torso ); + } + +void Animate::Torso_SetFrameEvent + ( + Event *ev + ) + + { + int framenum; + int animnum; + + framenum = ev->GetInteger( 1 ); + if ( ev->NumArgs() > 1 ) + { + animnum = gi.Anim_NumForName( edict->s.modelindex, ev->GetString( 2 ) ); + } + else + { + animnum = -1; + } + + SetFrame( framenum, torso, animnum ); + } + +// HACK HACK HACK +void Animate::Torso_StopAnimating + ( + Event *ev + ) + + { + CancelFlaggedEvents( EVENT_TORSO_ANIM ); + } + +void Animate::ClearTorsoAnim + ( + void + ) + + { + tiki_cmd_t cmds; + int last_anim; + static qboolean clearing=qfalse; + + last_anim = edict->s.torso_anim & ANIM_MASK; + + if ( ( edict->s.torso_anim & ANIM_BLEND ) && !( edict->s.torso_anim & ANIM_SERVER_EXITCOMMANDS_PROCESSED ) && !clearing ) + { + if ( gi.Frame_Commands( edict->s.modelindex, last_anim, TIKI_FRAME_CMD_EXIT, &cmds ) ) + { + int ii, j; + + clearing = qtrue; + for( ii = 0; ii < cmds.num_cmds; ii++ ) + { + Event *ev = new Event( cmds.cmds[ ii ].args[ 0 ] ); + + ev->SetSource( EV_FROM_ANIMATION ); + ev->SetAnimationNumber( last_anim ); + ev->SetAnimationFrame( 0 ); + + for( j = 1; j < cmds.cmds[ ii ].num_args; j++ ) + { + ev->AddToken( cmds.cmds[ ii ].args[ j ] ); + } + ProcessEvent( ev ); + } + clearing = qfalse; + } + edict->s.torso_anim |= ANIM_SERVER_EXITCOMMANDS_PROCESSED; + } + + CancelFlaggedEvents( EVENT_TORSO_ANIM ); + edict->s.torso_anim &= ~ANIM_BLEND; + } + +void Animate::ClearLegsAnim + ( + void + ) + + { + tiki_cmd_t cmds; + int last_anim; + static qboolean clearing=qfalse; + + if ( edict->s.anim & ANIM_SERVER_EXITCOMMANDS_PROCESSED ) + { + last_anim = edict->s.anim & ANIM_MASK; + + if ( gi.Frame_Commands( edict->s.modelindex, last_anim, TIKI_FRAME_CMD_EXIT, &cmds ) ) + { + int ii, j; + + clearing = qtrue; + for( ii = 0; ii < cmds.num_cmds; ii++ ) + { + Event *ev = new Event( cmds.cmds[ ii ].args[ 0 ] ); + + ev->SetSource( EV_FROM_ANIMATION ); + ev->SetAnimationNumber( last_anim ); + ev->SetAnimationFrame( 0 ); + + for( j = 1; j < cmds.cmds[ ii ].num_args; j++ ) + { + ev->AddToken( cmds.cmds[ ii ].args[ j ] ); + } + ProcessEvent( ev ); + } + clearing = qfalse; + } + edict->s.anim |= ANIM_SERVER_EXITCOMMANDS_PROCESSED; + } + + CancelFlaggedEvents( EVENT_LEGS_ANIM ); + + edict->s.anim &= ~ANIM_BLEND; + } diff --git a/source/source/fgame/animate.h b/source/source/fgame/animate.h new file mode 100644 index 0000000..02ab22f --- /dev/null +++ b/source/source/fgame/animate.h @@ -0,0 +1,386 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/animate.h $ +// $Revision:: 19 $ +// $Author:: Markd $ +// $Date:: 6/05/00 3:11p $ +// +// Copyright (C) 1997 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/animate.h $ +// +// 19 6/05/00 3:11p Markd +// fixed HasCommands calls in server +// +// 18 5/30/00 7:06p Markd +// saved games 4th pass +// +// 17 5/25/00 7:52p Markd +// 2nd pass save game stuff +// +// 16 5/24/00 3:13p Markd +// first phase of save/load games +// +// 15 3/16/00 10:50a Markd +// Fixed some bad syntax in headers that exhibited itself in non-visualc +// compilers +// +// 14 3/15/00 4:09p Aldie +// Fixed a bug with using weapons, and added some ability to force a state in +// the player +// +// 13 2/22/00 6:20p Markd +// modified the way that the animation system works so that the animdone event +// is actually played 1 frame before the end of the animation +// +// 12 2/14/00 5:37p Jimdose +// added ClearLegsAnim +// +// 11 1/25/00 7:02p Markd +// Fixed viewthing frame reporting +// +// 10 1/14/00 4:23p Steven +// Added an AnimatePtr type; +// +// 9 1/06/00 11:08p Jimdose +// cleaning up unused code +// +// 8 12/01/99 4:56p Markd +// fixed some reference versus pointer issues with RandomAnimate and NewAnim +// +// 7 11/18/99 6:26p Steven +// Fixed some tag stuff because CurrentAnim and CurrentFrame had different +// paramters in Entity and Animate which made the virtual stuff not work +// properly. +// +// 6 11/11/99 5:25p Jimdose +// added separate torso animation +// +// 5 11/11/99 3:54p Jimdose +// readded separate torso animations +// +// 4 10/19/99 7:52p Markd +// Removed three part model system +// +// 3 10/01/99 4:51p Markd +// Made Warning level 4 work on all projects +// +// 2 9/27/99 6:18p Markd +// Added event documentation +// +// 1 9/10/99 10:53a Jimdose +// +// 1 9/08/99 3:15p Aldie +// +// 18 9/01/99 9:08p Markd +// added animate once support +// +// 17 8/19/99 6:41p Steven +// Added a stop anim event. +// +// 16 8/05/99 9:16a Steven +// Added a stop animating at end so that it wouldn't skip to beginning of +// animation again. +// +// 15 7/15/99 4:15p Markd +// added time output to viewthing +// +// 14 6/23/99 3:57p Markd +// Added viewthing support +// +// DESCRIPTION: +// Animate class +// + +#ifndef __ANIMATE_H__ +#define __ANIMATE_H__ + +#include "g_local.h" +#include "entity.h" + +extern Event EV_SetFrame; +extern Event EV_StopAnimating; +extern Event EV_Torso_StopAnimating; + +#define MINIMUM_DELTA_MOVEMENT 8 +#define MINIMUM_DELTA_MOVEMENT_PER_FRAME ( MINIMUM_DELTA_MOVEMENT / 20.0f ) + +class Animate; + +typedef SafePtr AnimatePtr; + +class Animate : public Entity + { + private: + Event *animDoneEvent; + Event *torso_animDoneEvent; + + float legs_animtime; + float torso_animtime; + + float legs_starttime; + float torso_starttime; + + float legs_frametime; + float torso_frametime; + + int legs_numframes; + int torso_numframes; + + str currentAnim; + + void FrameDeltaEvent( Event *ev ); + void EndAnim( bodypart_t part ); + void Legs_AnimDoneEvent( Event *ev ); + void Legs_AnimEvent( Event *ev ); + void Legs_SetFrameEvent( Event *ev ); + void Legs_StopAnimating( Event *ev ); + void Torso_AnimDoneEvent( Event *ev ); + void Torso_AnimEvent( Event *ev ); + void Torso_SetFrameEvent( Event *ev ); + void Torso_StopAnimating( Event *ev ); + void NewAnimEvent( Event *ev ); + public: + + // Animation variables + Vector frame_delta; // current movement from this frame + CLASS_PROTOTYPE( Animate ); + Animate(); + + void RandomAnimate( const char *animname, Event *endevent = NULL, bodypart_t part = legs ); + void RandomAnimate( const char *animname, Event &endevent, bodypart_t part = legs ); + void NewAnim( int animnum, bodypart_t part = legs ); + void NewAnim( int animnum, Event *endevent, bodypart_t part = legs ); + void NewAnim( int animnum, Event &endevent, bodypart_t part = legs ); + void SetFrame( int framenum, bodypart_t part = legs, int anim = -1 ); + qboolean HasAnim( const char *animname ); + Event *AnimDoneEvent( bodypart_t part = legs ); + void SetAnimDoneEvent( Event &event, bodypart_t part = legs ); + void SetAnimDoneEvent( Event *event, bodypart_t part = legs ); + int NumFrames( bodypart_t part = legs ); + int NumAnims( void ); + const char *AnimName( bodypart_t part = legs ); + float AnimTime( bodypart_t part = legs ); + + void ClearLegsAnim( void ); + void ClearTorsoAnim( void ); + + virtual void StopAnimating( bodypart_t part = legs ); + virtual void StopAnimatingAtEnd( bodypart_t part = legs ); + + virtual int CurrentAnim( bodypart_t part = legs ); + virtual int CurrentFrame( bodypart_t part = legs ); + + virtual void Archive( Archiver &arc ); + }; + +inline void Animate::RandomAnimate + ( + const char *animname, + Event &endevent, + bodypart_t part + ) + { + Event *ev; + + ev = new Event( endevent ); + RandomAnimate( animname, ev, part ); + } + +inline int Animate::CurrentAnim + ( + bodypart_t part + ) + { + switch( part ) + { + case legs: + return edict->s.anim & ANIM_MASK; + break; + case torso: + return edict->s.torso_anim & ANIM_MASK; + break; + default: + warning( "CurrentAnim", "Unknown body part %d", part ); + return -1; + break; + } + } + +inline int Animate::CurrentFrame + ( + bodypart_t part + ) + { + int frame; + + switch( part ) + { + case legs: + if ( edict->s.frame & FRAME_EXPLICIT ) + { + frame = edict->s.frame & FRAME_MASK; + } + else + { + if ( legs_numframes ) + { + frame = ( int )( ( float )( ( level.time - legs_starttime ) * legs_numframes ) / legs_animtime + 0.5f ); + while ( frame >= legs_numframes ) + frame -= legs_numframes; + } + else + { + frame = 0; + } + } + break; + case torso: + if ( edict->s.torso_frame & FRAME_EXPLICIT ) + { + frame = edict->s.torso_frame & FRAME_MASK; + } + else + { + if ( torso_numframes ) + { + frame = ( int )( ( float )( ( level.time - torso_starttime ) * torso_numframes ) / torso_animtime + 0.5f ); + while ( frame >= torso_numframes ) + frame -= torso_numframes; + } + else + { + frame = 0; + } + } + break; + default: + warning( "CurrentFrame", "Unknown body part %d", part ); + frame = 0; + break; + } + return frame; + } + +inline int Animate::NumFrames + ( + bodypart_t part + ) + { + switch( part ) + { + case legs: + return legs_numframes; + break; + case torso: + return torso_numframes; + break; + default: + warning( "NumFrames", "Unknown body part %d", part ); + return 0; + break; + } + } + +inline float Animate::AnimTime + ( + bodypart_t part + ) + { + switch( part ) + { + case legs: + return legs_animtime; + break; + case torso: + return torso_animtime; + break; + default: + warning( "AnimTime", "Unknown body part %d", part ); + return 0; + break; + } + } + +inline int Animate::NumAnims + ( + void + ) + + { + return gi.NumAnims( edict->s.modelindex ); + } + +inline const char *Animate::AnimName + ( + bodypart_t part + ) + { + switch( part ) + { + case legs: + return gi.Anim_NameForNum( edict->s.modelindex, CurrentAnim( part ) ); + break; + case torso: + return gi.Anim_NameForNum( edict->s.modelindex, CurrentAnim( part ) ); + break; + default: + warning( "AnimName", "Unknown body part %d", part ); + return NULL; + break; + } + } + +inline Event * Animate::AnimDoneEvent + ( + bodypart_t part + ) + { + switch( part ) + { + case legs: + if ( animDoneEvent ) + return new Event( animDoneEvent ); + else + return NULL; + break; + case torso: + if ( torso_animDoneEvent ) + return new Event( torso_animDoneEvent ); + else + return NULL; + break; + default: + warning( "AnimDoneEvent", "Unknown body part %d", part ); + return NULL; + break; + } + } + +inline void Animate::Archive + ( + Archiver &arc + ) + + { + Entity::Archive( arc ); + + arc.ArchiveVector( &frame_delta ); + arc.ArchiveEventPointer( &animDoneEvent ); + arc.ArchiveEventPointer( &torso_animDoneEvent ); + arc.ArchiveFloat( &legs_animtime ); + arc.ArchiveFloat( &torso_animtime ); + arc.ArchiveFloat( &legs_starttime ); + arc.ArchiveFloat( &torso_starttime ); + arc.ArchiveInteger( &legs_numframes ); + arc.ArchiveInteger( &torso_numframes ); + arc.ArchiveFloat( &legs_frametime ); + arc.ArchiveFloat( &torso_frametime ); + arc.ArchiveString( ¤tAnim ); + } + +#endif /* animate.h */ diff --git a/source/source/fgame/archive.cpp b/source/source/fgame/archive.cpp new file mode 100644 index 0000000..10eb3d0 --- /dev/null +++ b/source/source/fgame/archive.cpp @@ -0,0 +1,1214 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/archive.cpp $ +// $Revision:: 20 $ +// $Author:: Markd $ +// $Date:: 6/23/00 8:41p $ +// +// Copyright (C) 1997 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/archive.cpp $ +// +// 20 6/23/00 8:41p Markd +// made a lot of changes to different constructors for saved game support +// +// 19 6/13/00 5:09p Markd +// changed archive version number +// +// 18 6/13/00 5:07p Markd +// turned off types on archives to trim down sizes +// +// 17 6/06/00 5:58p Markd +// fixed warning message on archive load +// +// 16 6/05/00 3:41p Markd +// Made Archvie load quiet +// +// 15 6/02/00 4:24p Markd +// cleaned up archive functions +// +// 14 5/31/00 2:58p Markd +// saved game fun +// +// 13 5/31/00 10:19a Markd +// 4th pass saved games +// +// 12 5/30/00 7:06p Markd +// saved games 4th pass +// +// 11 5/27/00 8:06p Markd +// Saved games 3rd pass +// +// 10 5/27/00 2:56p Markd +// Save games 2nd pass +// +// 9 5/26/00 7:44p Markd +// 2nd phase save games +// +// 8 5/25/00 4:28p Markd +// fixed up archive functions +// +// 7 5/24/00 3:14p Markd +// first phase of save/load games +// +// 6 2/04/00 1:29p Markd +// Added checksum to ai path nodes. It auto saves on exit now and will +// automatically re-build nodes as needed +// +// 5 1/10/00 5:27p Markd +// Replaced TAG calls with normal malloc and free calls +// +// 4 12/17/99 6:35p Jimdose +// changed spawnarg code +// added Level class for spawning and map control +// got rid of unused or superflous variables +// changed setjmp/longjmp calls to try/throw/catch exception handling +// +// 3 12/13/99 10:46a Markd +// incremental merge fix +// +// 2 10/01/99 4:51p Markd +// Made Warning level 4 work on all projects +// +// 1 9/10/99 10:53a Jimdose +// +// 1 9/08/99 3:15p Aldie +// +// 7 8/17/99 5:08p Markd +// Changed all FS_ReadFile's to FS_ReadFileEx's in game code +// +// 6 7/29/99 5:33p Markd +// Fixed weird compiler bug +// +// DESCRIPTION: +// Class for archiving objects +// +#include "g_local.h" +#include "archive.h" + +enum + { + ARC_NULL, ARC_Vector, ARC_Vec3, ARC_Vec4, ARC_Integer, ARC_Unsigned, ARC_Byte, ARC_Char, ARC_Short, ARC_UnsignedShort, + ARC_Float, ARC_Double, ARC_Boolean, ARC_String, ARC_Raw, ARC_Object, ARC_ObjectPointer, + ARC_SafePointer, ARC_Event, ARC_EventPointer, ARC_Quat, ARC_Entity, ARC_Bool, + ARC_NUMTYPES + }; + +static const char *typenames[] = + { + "NULL", "vector", "vec3", "vec4", "int", "unsigned", "byte", "char", "short", "unsigned short", + "float", "double", "qboolean", "string", "raw data", "object", "objectpointer", + "safepointer", "event", "eventpointer", "quaternion", "entity", "bool" + }; + +#define ArchiveHeader ( *( int * )"FAKK" ) +#define ArchiveVersion 4 // This must be changed any time the format changes! +#define ArchiveInfo "FAKK Archive Version 4" // This must be changed any time the format changes! + +CLASS_DECLARATION( Class, FileRead, NULL ) + { + { NULL, NULL } + }; + +FileRead::FileRead() + { + length = 0; + buffer = NULL; + pos = 0; + } + +FileRead::~FileRead() + { + Close(); + } + +void FileRead::Close + ( + void + ) + + { + if ( buffer ) + { + gi.Free( ( void * )buffer ); + buffer = NULL; + } + + filename = ""; + length = 0; + pos = 0; + } + +const char *FileRead::Filename + ( + void + ) + + { + return filename.c_str(); + } + +size_t FileRead::Length + ( + void + ) + + { + return length; + } + +size_t FileRead::Pos + ( + void + ) + + { + return pos - buffer; + } + +qboolean FileRead::Seek + ( + size_t newpos + ) + + { + if ( !buffer ) + { + return false; + } + + if ( newpos > length ) + { + return false; + } + + pos = buffer + newpos; + + return true; + } + +qboolean FileRead::Open + ( + const char *name + ) + + { + byte *tempbuf; + assert( name ); + + assert( !buffer ); + Close(); + + if ( !name ) + { + return false; + } + + length = gi.FS_ReadFile( name, ( void ** )&tempbuf, qtrue ); + if ( length == ( size_t )( -1 ) ) + { + return false; + } + // create our own space + buffer = ( byte * )gi.Malloc( length ); + // copy the file over to our space + memcpy( buffer, tempbuf, length ); + // free the file + gi.FS_FreeFile( tempbuf ); + + filename = name; + pos = buffer; + + return true; + } + +qboolean FileRead::Read + ( + void *dest, + size_t size + ) + + { + assert( dest ); + assert( buffer ); + assert( pos ); + + if ( !dest ) + { + return false; + } + + if ( size <= 0 ) + { + return false; + } + + if ( ( pos + size ) > ( buffer + length ) ) + { + return false; + } + + memcpy( dest, pos, size ); + pos += size; + + return true; + } + +CLASS_DECLARATION( Class, Archiver, NULL ) + { + { NULL, NULL } + }; + +Archiver::Archiver() + { + file = 0; + fileerror = false; + harderror = true; + assert( ( sizeof( typenames ) / sizeof( typenames[ 0 ] ) ) == ARC_NUMTYPES ); + } + +Archiver::~Archiver() + { + if ( file ) + { + Close(); + } + + readfile.Close(); + } + +void Archiver::FileError + ( + const char *fmt, + ... + ) + + { + va_list argptr; + char text[ 1024 ]; + + va_start( argptr, fmt ); + vsprintf( text, fmt, argptr ); + va_end( argptr ); + + fileerror = true; + Close(); + if ( archivemode == ARCHIVE_READ ) + { + if ( harderror ) + { + gi.Error( ERR_DROP, "Error while loading %s : %s\n", filename.c_str(), text ); + } + else + { + gi.Printf( "Error while loading %s : %s\n", filename.c_str(), text ); + } + } + else + { + if ( harderror ) + { + gi.Error( ERR_DROP, "Error while writing to %s : %s\n", filename.c_str(), text ); + } + else + { + gi.Printf( "Error while writing to %s : %s\n", filename.c_str(), text ); + } + } + } + +void Archiver::Close + ( + void + ) + + { + if ( file ) + { + if ( archivemode == ARCHIVE_WRITE ) + { + int numobjects; + + // write out the number of classpointers + gi.FS_FSeek( file, numclassespos, FS_SEEK_SET ); + numclassespos = gi.FS_FTell( file ); + numobjects = classpointerList.NumObjects(); + ArchiveInteger( &numobjects ); + } + + gi.FS_FCloseFile( file ); + file = NULL; + } + + readfile.Close(); + + if ( archivemode == ARCHIVE_READ ) + { + int i, num; + Class * classptr; + pointer_fixup_t *fixup; + + num = fixupList.NumObjects(); + for( i = 1; i <= num; i++ ) + { + fixup = fixupList.ObjectAt( i ); + classptr = classpointerList.ObjectAt( fixup->index ); + if ( fixup->type == pointer_fixup_normal ) + { + Class ** fixupptr; + fixupptr = ( Class ** )fixup->ptr; + *fixupptr = classptr; + } + else if ( fixup->type == pointer_fixup_safe ) + { + SafePtrBase * fixupptr; + fixupptr = ( SafePtrBase * )fixup->ptr; + fixupptr->InitSafePtr( classptr ); + } + delete fixup; + } + fixupList.FreeObjectList(); + classpointerList.FreeObjectList(); + } + } + +/**************************************************************************************** + + File Read/Write functions + +*****************************************************************************************/ + +qboolean Archiver::Read + ( + const char *name, + qboolean harderror + ) + + { + unsigned header; + unsigned version; + str info; + int num; + int i; + Class *null; + + this->harderror = harderror; + + assert( name ); + if ( !name ) + { + FileError( "NULL pointer for filename in Archiver::Read.\n" ); + return false; + } + + fileerror = false; + + archivemode = ARCHIVE_READ; + + filename = name; + + if ( !readfile.Open( filename.c_str() ) ) + { + if ( harderror ) + { + FileError( "Couldn't open file." ); + } + return false; + } + + ArchiveUnsigned( &header ); + if ( header != ArchiveHeader ) + { + readfile.Close(); + FileError( "Not a valid Fakk2 archive." ); + return false; + } + + ArchiveUnsigned( &version ); + if ( version > ArchiveVersion ) + { + readfile.Close(); + FileError( "Archive is from version %.2f. Check http://www.ritual.com for an update.", version ); + return false; + } + + if ( version < ArchiveVersion ) + { + readfile.Close(); + FileError( "Archive is out of date." ); + return false; + } + + ArchiveString( &info ); + gi.DPrintf( "%s\n", info.c_str() ); + + // setup out class pointers + ArchiveInteger( &num ); + classpointerList.Resize( num ); + null = NULL; + for( i = 1; i <= num; i++ ) + { + classpointerList.AddObject( null ); + } + + return true; + } + +qboolean Archiver::Create + ( + const char *name, + qboolean harderror + ) + + { + unsigned header; + unsigned version; + str info; + int numZero = 0; + + this->harderror = harderror; + + assert( name ); + if ( !name ) + { + FileError( "NULL pointer for filename in Archiver::Create.\n" ); + return false; + } + + fileerror = false; + + archivemode = ARCHIVE_WRITE; + + filename = name; + + file = gi.FS_FOpenFileWrite( filename.c_str() ); + if ( !file ) + { + FileError( "Couldn't open file." ); + return false; + } + + header = ArchiveHeader; + ArchiveUnsigned( &header ); + version = ArchiveVersion; + ArchiveUnsigned( &version ); + info = ArchiveInfo; + ArchiveString( &info ); + + numclassespos = gi.FS_FTell( file ); + ArchiveInteger( &numZero ); + + return true; + } + + +inline void Archiver::CheckRead + ( + void + ) + + { + assert( archivemode == ARCHIVE_READ ); + if ( !fileerror && ( archivemode != ARCHIVE_READ ) ) + { + FileError( "File read during a write operation." ); + } + } + +inline void Archiver::CheckWrite + ( + void + ) + + { + assert( archivemode == ARCHIVE_WRITE ); + if ( !fileerror && ( archivemode != ARCHIVE_WRITE ) ) + { + FileError( "File write during a read operation." ); + } + } + +inline size_t Archiver::ReadSize + ( + void + ) + + { + size_t s; + + s = 0; + if ( !fileerror ) + { + readfile.Read( &s, sizeof( s ) ); + } + + return s; + } + +inline void Archiver::CheckSize + ( + int type, + size_t size + ) + + { + size_t s; + + if ( !fileerror ) + { + s = ReadSize(); + + if ( size != s ) + { + FileError( "Invalid data size of %d on %s.", s, typenames[ type ] ); + } + } + } + +inline void Archiver::WriteSize + ( + size_t size + ) + + { + gi.FS_Write( &size, sizeof( size ), file ); + } + +inline int Archiver::ReadType + ( + void + ) + + { + int t; + + if ( !fileerror ) + { + readfile.Read( &t, sizeof( t ) ); + + return t; + } + + return ARC_NULL; + } + +inline void Archiver::WriteType + ( + int type + ) + + { + gi.FS_Write( &type, sizeof( type ), file ); + } + + +inline void Archiver::CheckType + ( + int type + ) + + { + int t; + + assert( ( type >= 0 ) && ( type < ARC_NUMTYPES ) ); + + if ( !fileerror ) + { + t = ReadType(); + if ( t != type ) + { + FileError( "Expecting %s", typenames[ type ] ); + } + } + } + +/**************************************************************************************** + + File Archive functions + +*****************************************************************************************/ + +//#define ARCHIVE_USE_TYPES 1 + +inline void Archiver::ArchiveData + ( + int type, + void *data, + size_t size + ) + { + if ( archivemode == ARCHIVE_READ ) + { +#ifndef NDEBUG + CheckRead(); +#endif +#ifdef ARCHIVE_USE_TYPES + CheckType( type ); +#endif + + if ( !fileerror && size ) + { + readfile.Read( data, size ); + } + } + else + { +#ifndef NDEBUG + CheckWrite(); +#endif +#ifdef ARCHIVE_USE_TYPES + WriteType( type ); +#endif + + if ( !fileerror && size ) + { + gi.FS_Write( data, size, file ); + } + } + } + + +#define ARCHIVE( func, type ) \ +void Archiver::Archive##func \ + ( \ + type * v \ + ) \ + \ + { \ + ArchiveData( ARC_##func, v, sizeof( type ) ); \ + } + + ARCHIVE( Vector, Vector ); + ARCHIVE( Integer, int ); + ARCHIVE( Unsigned, unsigned ); + ARCHIVE( Byte, byte ); + ARCHIVE( Char, char ); + ARCHIVE( Short, short ); + ARCHIVE( UnsignedShort, unsigned short ); + ARCHIVE( Float, float ); + ARCHIVE( Double, double ); + ARCHIVE( Boolean, qboolean ); + ARCHIVE( Quat, Quat ); + ARCHIVE( Bool, bool ); + +void Archiver::ArchiveVec3( vec3_t vec ) + { + ArchiveData( ARC_Vec3, vec, sizeof( vec3_t ) ); + } + +void Archiver::ArchiveVec4( vec4_t vec ) + { + ArchiveData( ARC_Vec4, vec, sizeof( vec4_t ) ); + } + +void Archiver::ArchiveObjectPointer + ( + Class ** ptr + ) + + { + int index = 0; + + if ( archivemode == ARCHIVE_READ ) + { + pointer_fixup_t *fixup; + ArchiveData( ARC_ObjectPointer, &index, sizeof( index ) ); + + // Check for a NULL pointer + assert( ptr ); + if ( !ptr ) + { + FileError( "NULL pointer in ArchiveObjectPointer." ); + } + + // + // see if the variable was NULL + // + if ( index == ARCHIVE_NULL_POINTER ) + { + *ptr = NULL; + } + else + { + // init the pointer with NULL until we can fix it + *ptr = NULL; + + fixup = new pointer_fixup_t; + fixup->ptr = ( void ** )ptr; + fixup->index = index; + fixup->type = pointer_fixup_normal; + fixupList.AddObject( fixup ); + } + } + else + { + if ( *ptr ) + { + index = classpointerList.AddUniqueObject( *ptr ); + } + else + { + index = ARCHIVE_NULL_POINTER; + } + ArchiveData( ARC_ObjectPointer, &index, sizeof( index ) ); + } + } + +void Archiver::ArchiveSafePointer + ( + SafePtrBase * ptr + ) + + { + int index = 0; + + if ( archivemode == ARCHIVE_READ ) + { + pointer_fixup_t *fixup; + + ArchiveData( ARC_SafePointer, &index, sizeof( &index ) ); + + // Check for a NULL pointer + assert( ptr ); + if ( !ptr ) + { + FileError( "NULL pointer in ReadSafePointer." ); + } + + // + // see if the variable was NULL + // + if ( index == ARCHIVE_NULL_POINTER ) + { + ptr->InitSafePtr( NULL ); + } + else + { + // init the pointer with NULL until we can fix it + ptr->InitSafePtr( NULL ); + + // Add new fixup + fixup = new pointer_fixup_t; + fixup->ptr = ( void ** )ptr; + fixup->index = index; + fixup->type = pointer_fixup_safe; + fixupList.AddObject( fixup ); + } + } + else + { + if ( ptr->Pointer() ) + { + Class * obj; + + obj = ptr->Pointer(); + index = classpointerList.AddUniqueObject( obj ); + } + else + { + index = ARCHIVE_NULL_POINTER; + } + ArchiveData( ARC_SafePointer, &index, sizeof( index ) ); + } + } + +void Archiver::ArchiveEvent + ( + Event * ev + ) + + { + if ( archivemode == ARCHIVE_READ ) + { +#ifndef NDEBUG + CheckRead(); +#endif +#ifdef ARCHIVE_USE_TYPES + CheckType( ARC_Event ); +#endif + + if ( !fileerror ) + { + ev->Archive( *this ); + } + } + else + { +#ifndef NDEBUG + CheckWrite(); +#endif +#ifdef ARCHIVE_USE_TYPES + WriteType( ARC_Event ); +#endif + + //FIXME!!!! Make this handle null events + if ( ev == NULL ) + { + NullEvent.Archive( *this ); + } + else + { + ev->Archive( *this ); + } + } + } + +void Archiver::ArchiveEventPointer + ( + Event ** ev + ) + + { + int index; + + if ( archivemode == ARCHIVE_READ ) + { +#ifndef NDEBUG + CheckRead(); +#endif +#ifdef ARCHIVE_USE_TYPES + CheckType( ARC_EventPointer ); +#endif + ArchiveInteger( &index ); + + if ( !fileerror ) + { + if ( index == ARCHIVE_POINTER_VALID ) + { + *ev = new Event; + (*ev)->Archive( *this ); + } + else + { + (*ev) = NULL; + } + } + } + else + { +#ifndef NDEBUG + CheckWrite(); +#endif + if ( *ev ) + { + index = ARCHIVE_POINTER_VALID; + } + else + { + index = ARCHIVE_NULL_POINTER; + } + +#ifdef ARCHIVE_USE_TYPES + WriteType( ARC_EventPointer ); +#endif + + ArchiveInteger( &index ); + if ( *ev ) + { + (*ev)->Archive( *this ); + } + } + } + +void Archiver::ArchiveRaw + ( + void *data, + size_t size + ) + + { + ArchiveData( ARC_Raw, data, size ); + } + +void Archiver::ArchiveString + ( + str * string + ) + + { + if ( archivemode == ARCHIVE_READ ) + { + size_t s; + char *data; + +#ifndef NDEBUG + CheckRead(); +#endif +#ifdef ARCHIVE_USE_TYPES + CheckType( ARC_String ); +#endif + + if ( !fileerror ) + { + s = ReadSize(); + if ( !fileerror ) + { + data = new char[ s + 1 ]; + if ( data ) + { + if ( s ) + { + readfile.Read( data, s ); + } + data[ s ] = 0; + + *string = data; + + delete [] data; + } + } + } + } + else + { +#ifndef NDEBUG + CheckWrite(); +#endif +#ifdef ARCHIVE_USE_TYPES + WriteType( ARC_String ); +#endif + WriteSize( string->length() ); + gi.FS_Write( string->m_data->data, string->length(), file ); + } + } + +Class * Archiver::ReadObject + ( + void + ) + + { + ClassDef *cls; + Class *obj; + str classname; + long objstart; + long endpos; + int index; + size_t size; + qboolean isent; + int type; + + CheckRead(); + + type = ReadType(); + if ( ( type != ARC_Object ) && ( type != ARC_Entity ) ) + { + FileError( "Expecting %s or %s", typenames[ ARC_Object ], typenames[ ARC_Entity ] ); + } + + size = ReadSize(); + ArchiveString( &classname ); + + cls = getClass( classname.c_str() ); + if ( !cls ) + { + FileError( "Invalid class %s.", classname.c_str() ); + } + + isent = checkInheritance( &Entity::ClassInfo, cls ); + if ( type == ARC_Entity ) + { + if ( !isent ) + { + FileError( "Non-Entity class object '%s' saved as an Entity based object.", classname.c_str() ); + } + + ArchiveInteger( &level.spawn_entnum ); + // + // make sure to setup spawnflags properly + // + ArchiveInteger( &level.spawnflags ); + } + else if ( isent ) + { + FileError( "Entity class object '%s' saved as non-Entity based object.", classname.c_str() ); + } + + ArchiveInteger( &index ); + objstart = readfile.Pos(); + + + obj = ( Class * )cls->newInstance(); + if ( !obj ) + { + FileError( "Failed to on new instance of class %s.", classname.c_str() ); + } + else + { + obj->Archive( *this ); + } + + if ( !fileerror ) + { + endpos = readfile.Pos(); + if ( ( endpos - objstart ) > size ) + { + FileError( "Object read past end of object's data" ); + } + else if ( ( endpos - objstart ) < size ) + { + FileError( "Object didn't read entire data from file" ); + } + } + + // + // register this pointer with our list + // + classpointerList.AddObjectAt( index, obj ); + + return obj; + } + +void Archiver::ArchiveObject + ( + Class *obj + ) + + { + str classname; + int index; + size_t size; + qboolean isent; + + if ( archivemode == ARCHIVE_READ ) + { + ClassDef *cls; + long objstart; + long endpos; + int type; + + CheckRead(); + type = ReadType(); + if ( ( type != ARC_Object ) && ( type != ARC_Entity ) ) + { + FileError( "Expecting %s or %s", typenames[ ARC_Object ], typenames[ ARC_Entity ] ); + } + + size = ReadSize(); + ArchiveString( &classname ); + + cls = getClass( classname.c_str() ); + if ( !cls ) + { + FileError( "Invalid class %s.", classname.c_str() ); + } + + if ( obj->classinfo() != cls ) + { + FileError( "Archive has a '%s' object, but was expecting a '%s' object.", classname.c_str(), obj->getClassname() ); + } + + isent = obj->isSubclassOf( Entity ); + if ( type == ARC_Entity ) + { + int entnum; + if ( !isent ) + { + FileError( "Non-Entity class object '%s' saved as an Entity based object.", classname.c_str() ); + } + + ArchiveInteger( &entnum ); + ( ( Entity * )obj )->SetEntNum( entnum ); + // + // make sure to setup spawnflags properly + // + ArchiveInteger( &level.spawnflags ); + } + else if ( isent ) + { + FileError( "Entity class object '%s' saved as non-Entity based object.", classname.c_str() ); + } + + ArchiveInteger( &index ); + objstart = readfile.Pos(); + + obj->Archive( *this ); + + if ( !fileerror ) + { + endpos = readfile.Pos(); + if ( ( endpos - objstart ) > size ) + { + FileError( "Object read past end of object's data" ); + } + else if ( ( endpos - objstart ) < size ) + { + FileError( "Object didn't read entire data from file" ); + } + } + + // + // register this pointer with our list + // + classpointerList.AddObjectAt( index, obj ); + } + else + { + long sizepos; + long objstart = 0; + long endpos; + + assert( obj ); + if ( !obj ) + { + FileError( "NULL object in WriteObject" ); + } + + isent = obj->isSubclassOf( Entity ); + + CheckWrite(); + if ( isent ) + { + WriteType( ARC_Entity ); + } + else + { + WriteType( ARC_Object ); + } + + sizepos = gi.FS_FTell( file ); + size = 0; + WriteSize( size ); + + classname = obj->getClassname(); + ArchiveString( &classname ); + + if ( isent ) + { + // Write out the entity number + ArchiveInteger( &( ( Entity * )obj )->entnum ); + // + // make sure to setup spawnflags properly + // + ArchiveInteger( &( ( Entity * )obj )->spawnflags ); + } + + // write out pointer index for this class pointer + index = classpointerList.AddUniqueObject( obj ); + ArchiveInteger( &index ); + + if ( !fileerror ) + { + objstart = gi.FS_FTell( file ); + obj->Archive( *this ); + } + + if ( !fileerror ) + { + endpos = gi.FS_FTell( file ); + size = endpos - objstart; + gi.FS_FSeek( file, sizepos, FS_SEEK_SET ); + WriteSize( size ); + + if ( !fileerror ) + { + gi.FS_FSeek( file, endpos, FS_SEEK_SET ); + } + } + } + } + diff --git a/source/source/fgame/archive.h b/source/source/fgame/archive.h new file mode 100644 index 0000000..5091ed4 --- /dev/null +++ b/source/source/fgame/archive.h @@ -0,0 +1,315 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/archive.h $ +// $Revision:: 7 $ +// $Author:: Markd $ +// $Date:: 5/31/00 10:19a $ +// +// Copyright (C) 1997 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/archive.h $ +// +// 7 5/31/00 10:19a Markd +// 4th pass saved games +// +// 6 5/30/00 7:06p Markd +// saved games 4th pass +// +// 5 5/27/00 8:06p Markd +// Saved games 3rd pass +// +// 4 5/27/00 2:56p Markd +// Save games 2nd pass +// +// 3 5/26/00 7:44p Markd +// 2nd phase save games +// +// 2 5/25/00 4:28p Markd +// fixed up archive functions +// +// 1 9/10/99 10:53a Jimdose +// +// 1 9/08/99 3:15p Aldie +// +// 5 7/29/99 5:33p Markd +// Fixed weird compiler bug +// +// DESCRIPTION: +// Class for archiving objects +// + +#ifndef __ARCHIVE_H__ +#define __ARCHIVE_H__ + +#include "g_local.h" +#include "class.h" +#include "str.h" + +#define ARCHIVE_NULL_POINTER ( -654321 ) +#define ARCHIVE_POINTER_VALID ( 0 ) +#define ARCHIVE_POINTER_NULL ( ARCHIVE_NULL_POINTER ) +#define ARCHIVE_POINTER_SELF_REFERENTIAL ( -123456 ) + +#define ARCHIVE_WRITE 0 +#define ARCHIVE_READ 1 + +enum + { + pointer_fixup_normal, + pointer_fixup_safe + }; + +typedef struct + { + void **ptr; + int index; + int type; + } pointer_fixup_t; + +class FileRead : public Class + { + protected: + str filename; + size_t length; + byte *buffer; + byte *pos; + + public: + CLASS_PROTOTYPE( FileRead ); + + FileRead(); + ~FileRead(); + void Close( void ); + const char *Filename( void ); + size_t Length( void ); + size_t Pos( void ); + qboolean Seek( size_t newpos ); + qboolean Open( const char *name ); + qboolean Read( void *dest, size_t size ); + }; + +class Archiver : public Class + { + private: + Container classpointerList; + Container fixupList; + + protected: + str filename; + qboolean fileerror; + fileHandle_t file; + FileRead readfile; + int archivemode; + int numclassespos; + qboolean harderror; + + void CheckRead( void ); + void CheckType( int type ); + int ReadType( void ); + size_t ReadSize( void ); + void CheckSize( int type, size_t size ); + void ArchiveData( int type, void *data, size_t size ); + + void CheckWrite( void ); + void WriteType( int type ); + void WriteSize( size_t size ); + + public: + CLASS_PROTOTYPE( Archiver ); + + Archiver(); + ~Archiver(); + void FileError( const char *fmt, ... ); + void Close( void ); + + qboolean Read( str &name, qboolean harderror = true ); + qboolean Read( const char *name, qboolean harderror = true ); + Class *ReadObject( void ); + + qboolean Create( str &name, qboolean harderror = true ); + qboolean Create( const char *name, qboolean harderror = true ); + + qboolean Loading( void ); + qboolean Saving( void ); + qboolean NoErrors( void ); + + void ArchiveVector( Vector * vec ); + void ArchiveQuat( Quat * quat ); + void ArchiveInteger( int * num ); + void ArchiveUnsigned( unsigned * unum); + void ArchiveByte( byte * num ); + void ArchiveChar( char * ch ); + void ArchiveShort( short * num ); + void ArchiveUnsignedShort( unsigned short * num ); + void ArchiveFloat( float * num ); + void ArchiveDouble( double * num ); + void ArchiveBoolean( qboolean * boolean ); + void ArchiveString( str * string ); + void ArchiveObjectPointer( Class ** ptr ); + void ArchiveSafePointer( SafePtrBase * ptr ); + void ArchiveEvent( Event * ev ); + void ArchiveEventPointer( Event ** ev ); + void ArchiveBool( bool * boolean ); + void ArchiveVec3( vec3_t vec ); + void ArchiveVec4( vec4_t vec ); + + void ArchiveRaw( void *data, size_t size ); + void ArchiveObject( Class *obj ); + + }; + +inline qboolean Archiver::Read + ( + str &name, + qboolean harderror + ) + + { + return Read( name.c_str(), harderror ); + } + +inline qboolean Archiver::Create + ( + str &name, + qboolean harderror + ) + + { + return Create( name.c_str(), harderror ); + } + +inline qboolean Archiver::Loading + ( + void + ) + { + return ( archivemode == ARCHIVE_READ ); + } + +inline qboolean Archiver::Saving + ( + void + ) + { + return ( archivemode == ARCHIVE_WRITE ); + } + +inline qboolean Archiver::NoErrors + ( + void + ) + { + return ( !fileerror ); + } + +inline void Container::Archive + ( + Archiver &arc + ) + { + int i, num; + + if ( arc.Loading() ) + { + ClearObjectList(); + arc.ArchiveInteger( &num ); + Resize( num ); + } + else + { + num = numobjects; + arc.ArchiveInteger( &num ); + } + for( i = 1; i <= num; i++ ) + { + arc.ArchiveString( AddressOfObjectAt( i ) ); + } + } + +inline void Container::Archive + ( + Archiver &arc + ) + { + int i, num; + + if ( arc.Loading() ) + { + ClearObjectList(); + arc.ArchiveInteger( &num ); + Resize( num ); + } + else + { + num = numobjects; + arc.ArchiveInteger( &num ); + } + for( i = 1; i <= num; i++ ) + { + arc.ArchiveVector( AddressOfObjectAt( i ) ); + } + } + +inline void Container::Archive + ( + Archiver &arc + ) + { + int i, num; + + if ( arc.Loading() ) + { + ClearObjectList(); + arc.ArchiveInteger( &num ); + Resize( num ); + } + else + { + num = numobjects; + arc.ArchiveInteger( &num ); + } + for( i = 1; i <= num; i++ ) + { + arc.ArchiveInteger( AddressOfObjectAt( i ) ); + } + } + +inline void Container::Archive + ( + Archiver &arc + ) + { + int i, num; + + if ( arc.Loading() ) + { + ClearObjectList(); + arc.ArchiveInteger( &num ); + Resize( num ); + } + else + { + num = numobjects; + arc.ArchiveInteger( &num ); + } + for( i = 1; i <= num; i++ ) + { + arc.ArchiveFloat( AddressOfObjectAt( i ) ); + } + } + +#define ArchiveEnum( thing, type ) \ + { \ + int tempInt; \ + \ + tempInt = ( int )( thing ); \ + arc.ArchiveInteger( &tempInt ); \ + ( thing ) = ( type )tempInt; \ + } + + +#endif /* archive.h */ diff --git a/source/source/fgame/armor.cpp b/source/source/fgame/armor.cpp new file mode 100644 index 0000000..0979310 --- /dev/null +++ b/source/source/fgame/armor.cpp @@ -0,0 +1,114 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/armor.cpp $ +// $Revision:: 5 $ +// $Author:: Markd $ +// $Date:: 6/23/00 8:41p $ +// +// Copyright (C) 1997 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/armor.cpp $ +// +// 5 6/23/00 8:41p Markd +// made a lot of changes to different constructors for saved game support +// +// 4 6/01/00 3:18p Markd +// rewrote giveItem and item management in sentient +// +// 3 1/26/00 3:33p Aldie +// Change Amount to getAmount. Added some 'listinventory' command. Added give +// all cheat to execute the script in global/giveall.txt +// +// 2 1/06/00 11:08p Jimdose +// cleaning up unused code +// +// 1 9/10/99 10:53a Jimdose +// +// 1 9/08/99 3:15p Aldie +// +// +// DESCRIPTION: +// Standard armor that prevents a percentage of damage per hit. +// + +#include "g_local.h" +#include "armor.h" + +CLASS_DECLARATION( Item, Armor, NULL ) + { + { NULL, NULL } + }; + +Armor::Armor() + { + if ( LoadingSavegame ) + { + // no need to proceed if loading a game + return; + } + + if ( DM_FLAG( DF_NO_ARMOR ) ) + { + PostEvent( EV_Remove, EV_REMOVE ); + return; + } + + setAmount( 0 ); + } + +void Armor::Setup + ( + const char *model, + int amount + ) + + { + assert( model ); + setModel( model ); + setAmount( amount ); + } + +void Armor::Add + ( + int num + ) + + { + // Armor never adds, it only replaces + amount = num; + if ( amount >= MaxAmount() ) + { + amount = MaxAmount(); + } + } + +qboolean Armor::Pickupable + ( + Entity *other + ) + + { + if ( !other->isSubclassOf( Sentient ) ) + { + return false; + } + else + { + Sentient * sent; + Item * item; + + sent = ( Sentient * )other; + item = sent->FindItem( getName() ); + + // If our armor is > than our current armor or armor has no value, then leave it alone. + if ( item && ( ( item->getAmount() >= this->getAmount() ) || !this->getAmount() ) ) + { + return false; + } + } + return true; + } diff --git a/source/source/fgame/armor.h b/source/source/fgame/armor.h new file mode 100644 index 0000000..229d91c --- /dev/null +++ b/source/source/fgame/armor.h @@ -0,0 +1,46 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/armor.h $ +// $Revision:: 2 $ +// $Author:: Jimdose $ +// $Date:: 1/06/00 11:08p $ +// +// Copyright (C) 1997 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/armor.h $ +// +// 2 1/06/00 11:08p Jimdose +// cleaning up unused code +// +// 1 9/10/99 10:53a Jimdose +// +// 1 9/08/99 3:15p Aldie +// +// DESCRIPTION: +// Standard armor that prevents a percentage of damage per hit. +// + +#ifndef __ARMOR_H__ +#define __ARMOR_H__ + +#include "item.h" + +class Armor : public Item + { + protected: + virtual void Setup( const char *model, int amount ); + virtual void Add( int amount ); + + public: + CLASS_PROTOTYPE( Armor ); + + Armor(); + + virtual qboolean Pickupable( Entity *other ); + }; + +#endif /* armor.h */ diff --git a/source/source/fgame/b_files.cpp b/source/source/fgame/b_files.cpp new file mode 100644 index 0000000..fe51ab2 --- /dev/null +++ b/source/source/fgame/b_files.cpp @@ -0,0 +1,487 @@ +// +// b_files.c +// + + +#include "b_local.h" + +#if 0 +// +// parse support routines +// + +static qboolean Nav_ParseLiteral( char **data, const char *string ) { + char *token; + + token = COM_ParseExt( data, qtrue ); + if ( token[0] == 0 ) { + gi.Printf( ERROR "unexpected EOF\n" ); + return qtrue; + } + + if ( Q_stricmp( token, string ) ) { + gi.Printf( ERROR "required string '%s' missing\n", string ); + return qtrue; + } + + return qfalse; +} + + +static qboolean Nav_ParseString( char **data, char **s ) { + *s = COM_ParseExt( data, qfalse ); + if ( s[0] == 0 ) { + gi.Printf( ERROR "unexpected EOF\n" ); + return qtrue; + } + return qfalse; +} + + +static qboolean Nav_ParseInt( char **data, int *i ) { + char *token; + + token = COM_ParseExt( data, qfalse ); + if ( token[0] == 0 ) { + gi.Printf( ERROR "unexpected EOF\n" ); + return qtrue; + } + + *i = atoi( token ); + return qfalse; +} + + +// +// bot parameters file : scripts/bots.cfg +// + +char botParms[0x10000]; + + +static int MethodNameToNumber( const char *name ) { + if ( !Q_stricmp( name, "EXPONENTIAL" ) ) { + return METHOD_EXPONENTIAL; + } + if ( !Q_stricmp( name, "LINEAR" ) ) { + return METHOD_LINEAR; + } + if ( !Q_stricmp( name, "LOGRITHMIC" ) ) { + return METHOD_LOGRITHMIC; + } + if ( !Q_stricmp( name, "ALWAYS" ) ) { + return METHOD_ALWAYS; + } + if ( !Q_stricmp( name, "NEVER" ) ) { + return METHOD_NEVER; + } + + return -1; +} + + +static int ItemNameToNumber( const char *name, int itemType ) { + int n; + + for ( n = 0; n < bg_numItems; n++ ) { + if ( bg_itemlist[n].type != itemType ) { + continue; + } + if ( Q_stricmp( bg_itemlist[n].classname, name ) == 0 ) { + return bg_itemlist[n].tag; + } + } + + return -1; +} + + +void Bot_ParseParms( const char *botName, gentity_t *bot, char *userinfo ) { + char *token; + char *value; + char *p; + int n; + int count; + + if ( !botName || !botName[0]) { + botName = "Player"; + } + + strcpy( userinfo, "\\name\\" ); + strcat( userinfo, botName ); + + // fill in defaults + bot->bot->reactions = 3; + bot->bot->aim = 3; + bot->bot->move = 3; + bot->bot->aggression = 3; + bot->bot->intelligence = 3; + bot->bot->hfov = 90 / 2; + bot->bot->vfov = 68 / 2; + bot->bot->healthMethod = METHOD_LOGRITHMIC; + bot->bot->armorMethod = METHOD_LINEAR; + bot->bot->ammoMethod = METHOD_EXPONENTIAL; + bot->bot->allWeaponOrder[0] = WP_BFG; + bot->bot->allWeaponOrder[1] = WP_ROCKET_LAUNCHER; + bot->bot->allWeaponOrder[2] = WP_RAILGUN; + bot->bot->allWeaponOrder[3] = WP_PLASMAGUN; + bot->bot->allWeaponOrder[4] = WP_GRENADE_LAUNCHER; + bot->bot->allWeaponOrder[5] = WP_SHOTGUN; + bot->bot->allWeaponOrder[6] = WP_MACHINEGUN; + bot->bot->allWeaponOrder[7] = WP_NONE; + + p = botParms; + COM_BeginParseSession(); + + // look for the right bot + while ( p ) { + token = COM_ParseExt( &p, qtrue ); + if ( token[0] == 0 ) + return; + + if ( !Q_stricmp( token, botName ) ) { + break; + } + + SkipBracedSection( &p ); + } + if ( !p ) { + return; + } + + if ( Nav_ParseLiteral( &p, "{" ) ) { + return; + } + + // parse the bot info block + while ( 1 ) { + token = COM_ParseExt( &p, qtrue ); + if ( !token[0] ) { + gi.Printf( "ERROR: unexpected EOF while parsing '%s'\n", botName ); + return; + } + + if ( !Q_stricmp( token, "}" ) ) { + break; + } + + // model + if ( !Q_stricmp( token, "model" ) ) { + if ( Nav_ParseString( &p, &value ) ) { + continue; + } + strcat ( userinfo, "\\model\\" ); + strcat ( userinfo, value ); + continue; + } + + // reactions + if ( !Q_stricmp( token, "reactions" ) ) { + if ( Nav_ParseInt( &p, &n ) ) { + SkipRestOfLine( &p ); + continue; + } + if ( n < 1 || n > 5 ) { + gi.Printf( WARNING "bad %s in bot '%s'\n", token, botName ); + continue; + } + bot->bot->reactions = n; + continue; + } + + // aim + if ( !Q_stricmp( token, "aim" ) ) { + if ( Nav_ParseInt( &p, &n ) ) { + SkipRestOfLine( &p ); + continue; + } + if ( n < 1 || n > 5 ) { + gi.Printf( WARNING "bad %s in bot '%s'\n", token, botName ); + continue; + } + bot->bot->aim = n; + continue; + } + + // move + if ( !Q_stricmp( token, "move" ) ) { + if ( Nav_ParseInt( &p, &n ) ) { + SkipRestOfLine( &p ); + continue; + } + if ( n < 1 || n > 5 ) { + gi.Printf( WARNING "bad %s in bot '%s'\n", token, botName ); + continue; + } + bot->bot->move = n; + continue; + } + + // aggression + if ( !Q_stricmp( token, "aggression" ) ) { + if ( Nav_ParseInt( &p, &n ) ) { + SkipRestOfLine( &p ); + continue; + } + if ( n < 1 || n > 5 ) { + gi.Printf( WARNING "bad %s in bot '%s'\n", token, botName ); + continue; + } + bot->bot->aggression = n; + continue; + } + + // intelligence + if ( !Q_stricmp( token, "intelligence" ) ) { + if ( Nav_ParseInt( &p, &n ) ) { + SkipRestOfLine( &p ); + continue; + } + if ( n < 1 || n > 5 ) { + gi.Printf( WARNING "bad %s in bot '%s'\n", token, botName ); + continue; + } + bot->bot->intelligence = n; + continue; + } + + // hfov + if ( !Q_stricmp( token, "hfov" ) ) { + if ( Nav_ParseInt( &p, &n ) ) { + SkipRestOfLine( &p ); + continue; + } + if ( n < 30 || n > 180 ) { + gi.Printf( WARNING "bad %s in bot '%s'\n", token, botName ); + continue; + } + bot->bot->hfov = n / 2; + continue; + } + + // vfov + if ( !Q_stricmp( token, "vfov" ) ) { + if ( Nav_ParseInt( &p, &n ) ) { + SkipRestOfLine( &p ); + continue; + } + if ( n < 30 || n > 180 ) { + gi.Printf( WARNING "bad %s in bot '%s'\n", token, botName ); + continue; + } + bot->bot->vfov = n / 2; + continue; + } + + // healthMethod + if ( !Q_stricmp( token, "healthMethod" ) ) { + if ( Nav_ParseString( &p, &value ) ) { + continue; + } + n = MethodNameToNumber( value ); + if ( n == -1 ) { + gi.Printf( "WARNING: bad %s in bot '%s'\n", token, botName ); + continue; + } + bot->bot->healthMethod = n; + continue; + } + + // armorMethod + if ( !Q_stricmp( token, "armorMethod" ) ) { + if ( Nav_ParseString( &p, &value ) ) { + continue; + } + n = MethodNameToNumber( value ); + if ( n == -1 ) { + gi.Printf( "WARNING: bad %s in bot '%s'\n", token, botName ); + continue; + } + bot->bot->armorMethod = n; + continue; + } + + // ammoMethod + if ( !Q_stricmp( token, "ammoMethod" ) ) { + if ( Nav_ParseString( &p, &value ) ) { + continue; + } + n = MethodNameToNumber( value ); + if ( n == -1 ) { + gi.Printf( "WARNING: bad %s in bot '%s'\n", token, botName ); + continue; + } + bot->bot->ammoMethod = n; + continue; + } + + // weapons + if ( !Q_stricmp( token, "weapons" ) ) { + for ( count = 0; count < MAX_WEAPONS; count++ ) { + if ( Nav_ParseString( &p, &value ) ) { + break; + } + if ( *value == 0 ) { + break; + } + n = ItemNameToNumber( value, IT_WEAPON ); + if ( n == -1 ) { + gi.Printf( "WARNING: bad %s in bot '%s'\n", token, botName ); + continue; + } + bot->bot->allWeaponOrder[count] = n; + } + if ( count < MAX_WEAPONS ) { + bot->bot->allWeaponOrder[count] = WP_NONE; + } + continue; + } + + // snd + if ( !Q_stricmp( token, "snd" ) ) { + if ( Nav_ParseString( &p, &value ) ) { + continue; + } + strcat( userinfo, "\\snd\\" ); + strcat( userinfo, value ); + continue; + } + + gi.Printf( "WARNING: unknown keyword '%s' while parsing '%s'\n", token, botName ); + SkipRestOfLine( &p ); + } +} + + +void Bot_LoadParms( void ) { + int len; + char filename[MAX_QPATH]; + char *buffer; + + sprintf( filename, "scripts/bots.cfg" ); + gi.Printf( "Parsing %s\n", filename ); + len = gi.FS_ReadFile( filename, &buffer, qtrue ); + if ( len == -1 ) { + gi.Printf( "file not found\n" ); + } + + if ( len >= sizeof( botParms ) ) { + gi.Error( ERR_DROP, "scripts/bots.cfg is too large" ); + } + strncpy( botParms, buffer, sizeof( botParms ) - 1 ); + gi.FS_FreeFile( buffer ); +} +#endif + + +// +// navigation data : maps/*.nav +// + +void Nav_LoadRoutes( void ) { + int len; + navheader_t *header; + int value; + int n; + str filename; + + Swap_Init(); + + surfaceCount = 0; + surface = NULL; + neighborCount = 0; + neighbor = NULL; + + // load the file + filename = "maps/"; + filename += level.mapname + ".nav"; + + gi.Printf( "Loading %s\n", filename.c_str() ); + len = gi.FS_ReadFile( filename.c_str(), ( void ** )&navFileData, qtrue ); + if ( len == -1 ) { + gi.Printf( WARNING "no navigation data\n" ); + return; + } + if ( len < sizeof( navheader_t ) ) { + gi.Printf( ERROR "no nav file header\n" ); + goto cleanup; + } + + // process the header + header = (navheader_t *)navFileData; + header->id = LittleLong( header->id ); + header->version = LittleLong( header->version ); + header->surfaceCount = LittleLong( header->surfaceCount ); + header->neighborCount = LittleLong( header->neighborCount ); + + // validate the header fields + if ( header->id != NAVFILE_ID ) { + gi.Printf( ERROR "incorrect nav file id\n" ); + goto cleanup; + } + if ( header->version != NAVFILE_VERSION ) { + gi.Printf( ERROR "incorrect nav file version (%i, should be %i)\n", header->version, NAVFILE_VERSION ); + goto cleanup; + } + + value = /* header */ sizeof( navheader_t ) + + /* surfaces */ header->surfaceCount * sizeof( nsurface_t ) + + /* neighbors */ header->neighborCount * sizeof( nneighbor_t ) + + /* routes */ header->surfaceCount * header->surfaceCount * sizeof( byte ); + + if ( value != len ) { + gi.Printf( ERROR "incorrect nav file length (%i, should be %i)\n", len, value ); + goto cleanup; + } + + surfaceCount = header->surfaceCount; + neighborCount = header->neighborCount; + + // process surfaces + surface = (nsurface_t *)(navFileData + sizeof( navheader_t ) ); + for ( n = 0; n < surfaceCount; n++ ) { + surface[n].origin[0] = LittleFloat( surface[n].origin[0] ); + surface[n].origin[1] = LittleFloat( surface[n].origin[1] ); + surface[n].origin[2] = LittleFloat( surface[n].origin[2] ); + + surface[n].absmin[0] = LittleFloat( surface[n].absmin[0] ); + surface[n].absmin[1] = LittleFloat( surface[n].absmin[1] ); + + surface[n].absmax[0] = LittleFloat( surface[n].absmax[0] ); + surface[n].absmax[1] = LittleFloat( surface[n].absmax[1] ); + + surface[n].flags = LittleLong( surface[n].flags ); + surface[n].neighborCount = LittleLong( surface[n].neighborCount ); + surface[n].neighborIndex = LittleLong( surface[n].neighborIndex ); + surface[n].parm = LittleLong( surface[n].parm ); + } + + // process neighbors + neighbor = (nneighbor_t *)((byte *)surface + surfaceCount * sizeof( nsurface_t )); + for ( n = 0; n < neighborCount; n++ ) { + neighbor[n].origin[0] = LittleFloat( neighbor[n].origin[0] ); + neighbor[n].origin[1] = LittleFloat( neighbor[n].origin[1] ); + neighbor[n].origin[2] = LittleFloat( neighbor[n].origin[2] ); + + neighbor[n].absmin[0] = LittleFloat( neighbor[n].absmin[0] ); + neighbor[n].absmin[1] = LittleFloat( neighbor[n].absmin[1] ); + + neighbor[n].absmax[0] = LittleFloat( neighbor[n].absmax[0] ); + neighbor[n].absmax[1] = LittleFloat( neighbor[n].absmax[1] ); + + neighbor[n].surfaceNum = LittleLong( neighbor[n].surfaceNum ); + neighbor[n].flags = LittleLong( neighbor[n].flags ); + neighbor[n].cost = LittleLong( neighbor[n].cost ); + neighbor[n].filler = LittleLong( neighbor[n].filler ); + } + + // process routes + route = (byte *)neighbor + neighborCount * sizeof( nneighbor_t ); + + gi.Printf( "...loaded %i surfaces and %i neighbors\n", surfaceCount, neighborCount ); + return; + +cleanup: + gi.FS_FreeFile ( navFileData ); + navFileData = NULL; +} diff --git a/source/source/fgame/b_local.h b/source/source/fgame/b_local.h new file mode 100644 index 0000000..ac094e5 --- /dev/null +++ b/source/source/fgame/b_local.h @@ -0,0 +1,167 @@ +#ifndef __B_LOCAL_H__ +#define __B_LOCAL_H__ + +#include "g_local.h" + +// +// This section should be moved to QFILES.H +// + +#define NAVFILE_ID (('I')+('N'<<8)+('A'<<16)+('V'<<24)) +#define NAVFILE_VERSION 2 + +typedef struct { + unsigned id; + unsigned version; + unsigned surfaceCount; + unsigned neighborCount; +} navheader_t; + + +#define MAX_SURFACES 4096 + +#define SF_PUSH 0x00000001 +#define SF_WATERLEVEL1 0x00000002 +#define SF_WATERLEVEL2 0x00000004 +#define SF_WATER_NOAIR 0x00000008 +#define SF_DUCK 0x00000010 +#define SF_PAIN 0x00000020 +#define SF_TELEPORTER 0x00000040 +#define SF_PLATHIGH 0x00000080 +#define SF_PLATLOW 0x00000100 + +typedef struct { + vec3_t origin; + vec2_t absmin; + vec2_t absmax; + int parm; + unsigned flags; + unsigned neighborCount; + unsigned neighborIndex; +} nsurface_t; + + +#define MAX_NEIGHBORS 16384 + +#define NF_JUMP 0x00000001 +#define NF_DUCK 0x00000002 +#define NF_PLAT 0x00000004 +#define NF_FALL1 0x00000008 +#define NF_FALL2 0x00000010 + +typedef struct { + vec3_t origin; + vec2_t absmin; // region within this surface that is the portal to the other surface + vec2_t absmax; + int surfaceNum; + unsigned flags; // jump, prerequisite button, will take falling damage, etc... + float cost; + unsigned filler; // to be used as a "string index" into an array of targetnames for buttons, etc +} nneighbor_t; + +#define WARNING "\033" "3" "WARNING: " +#define ERROR "\033" "1" "ERROR: " + + +// file buffers + +extern char botParms[0x10000]; +extern char *navFileData; + + +// +// Navigation susbsystem +// + +#define NAVF_DUCK 0x00000001 +#define NAVF_JUMP 0x00000002 +#define NAVF_HOLD 0x00000004 +#define NAVF_SLOW 0x00000008 + +#define METHOD_EXPONENTIAL 1 +#define METHOD_LINEAR 2 +#define METHOD_LOGRITHMIC 3 +#define METHOD_ALWAYS 4 +#define METHOD_NEVER 5 + +// combat maneuvers +#define CM_NONE 0 + +#define CM_CLOSE_DISTANCE 1 +#define CM_OPEN_DISTANCE 2 +#define CM_HOLD_DISTANCE 3 + +#define CM_GET_ITEM 4 +#define CM_RUN_AWAY 5 + +#define CM_CIRCLE 6 +#define CM_DUCK 7 + +typedef enum {SPOT_ORIGIN, SPOT_HEAD, SPOT_WEAPON, SPOT_LEGS, SPOT_GROUND} spot_t; + +#define BOT_TIME_TO_LOSE_SIGHT 2000 + +#define SF_FROMMAPFILE 0x80000000 + +#define DEBUG_LEVEL_DETAIL 4 +#define DEBUG_LEVEL_INFO 3 +#define DEBUG_LEVEL_WARNING 2 +#define DEBUG_LEVEL_ERROR 1 +#define DEBUG_LEVEL_NONE 0 + + +// +// b_main.c +// +void Debug_Printf( cvar_t *cv, int level, char *fmt, ... ); +void Debug_BotPrintf( gentity_t *bot, cvar_t *cv, int debugLevel, char *fmt, ... ); + + +// +// b_ai.c +// +extern cvar_t *debugBotAI; +extern cvar_t *debugBotFreeze; + +void Bot_InitAI( void ); +void Bot_Pain( gentity_t *bot, gentity_t *other, int damage ); +void Bot_Touch( gentity_t *bot, gentity_t *other, trace_t *trace ); +void BotSpawn( gentity_t *bot ); +void Bot_Fetch_f( void ); + +// +// b_nav.c +// +extern char *navFileData; +extern int surfaceCount; +extern nsurface_t *surface; +extern int neighborCount; +extern nneighbor_t *neighbor; +extern byte *route; + + +void Nav_InitPreSpawn( void ); +void Nav_InitPostSpawn( void ); +void Nav_Shutdown( void ); +void Nav_ShowPath( gentity_t *bot ); +int Nav_GroundSurfaceNumber( gentity_t *ent ); +int Nav_ItemSurfaceNumber( gentity_t *ent ); +int Nav_EntitySurfaceNumber( gentity_t *ent ); +int Nav_MoveToGoal( gentity_t *bot, vec3_t dir, int *flags ); + +// +// b_items.c +// +void Nav_InitRoamList( void ); +qboolean WeaponIsOnLevel( int weapon ); +gentity_t *Nav_ChooseRoamGoal( void ); + +// +// b_files.c +// +void Bot_ParseParms( const char *botName, gentity_t *bot, char *userinfo ); +void Bot_LoadParms( void ); +void Nav_LoadRoutes( void ); +void Nav_SaveRoutes( void ); + +#endif diff --git a/source/source/fgame/b_nav.cpp b/source/source/fgame/b_nav.cpp new file mode 100644 index 0000000..1abbb49 --- /dev/null +++ b/source/source/fgame/b_nav.cpp @@ -0,0 +1,632 @@ + +// +// b_nav.c +// + +//FIXME make botInfo, etc visible here too and get rid of all the mutliple dereferences like bot->bot-> + +#include "b_local.h" + + +#define NAVF_EDGEZONE 0x00000001 + +#define INFINITE 1000000 + +#define BOTAI_PUSHED (1<<0) + +cvar_t *nav_showsectors; + +char *navFileData; + +int surfaceCount; +nsurface_t *surface; +int neighborCount; +nneighbor_t *neighbor; +byte *route; + +//#if 0 + +static int spawnpadModelIndex; + + +int Nav_SurfaceUnderPlayer( gentity_t *player ) { + vec3_t start; + vec3_t end; + vec3_t p; + trace_t tr; + float bestDist; + int bestSurf; + vec3_t v; + int n; + float dist; + + VectorCopy( player->s.origin, start ); + VectorCopy( player->s.origin, end ); + end[2] -= 4096; + + gi.trace ( &tr, start, player->mins, player->maxs, end, player->s.number, MASK_DEADSOLID, true ); + +// p[0] = ((int)tr.endpos[0] + 8) & (~16); +// p[1] = ((int)tr.endpos[1] + 8) & (~16); + p[0] = tr.endpos[0]; + p[1] = tr.endpos[1]; + p[2] = floor(tr.endpos[2]+player->mins[2]); + + bestDist = INFINITE; + bestSurf = -1; + + for ( n = 0; n < surfaceCount; n++ ) { + if ( Q_fabs( surface[n].origin[2] - p[2] ) > 24 ) { + continue; + } + + VectorSubtract( p, surface[n].origin, v ); + dist = VectorLength( v ); + if ( dist < bestDist ) { + bestDist = dist; + bestSurf = n; + } + + if ( surface[n].origin[2] != p[2] ) { + continue; + } + if ( surface[n].absmin[0] > p[0] ) { + continue; + } + if ( surface[n].absmax[0] < p[0] ) { + continue; + } + if ( surface[n].absmin[1] > p[1] ) { + continue; + } + if ( surface[n].absmax[1] < p[1] ) { + continue; + } + return n; + } + +// gi.Printf( "guess for %s at %s\n", ent->classname, vtos( p ) ); + return bestSurf; +} + + +/* +============= +Nav_GroundSurfaceNumber + +Returns the surface number for where an entity is currently located. +If the entity is not on the ground, it returns -1. + +FIXME we can make this more efficient + right now surfaces are in Z sorted order + we could make a Z index and binary search it to get to right z group fast +============= +*/ +int Nav_GroundSurfaceNumber( gentity_t *ent ) { + vec3_t p; + vec3_t v; + int n; + float dist; + float bestDist; + int bestSurf; + gentity_t *groundEntity; + + // if ent is not on the ground it is not on a surface + if ( ent->s.groundEntityNum == -1 ) { + return -1; + } + +// p[0] = ((int)ent->s.origin[0] + 8) & (~16); +// p[1] = ((int)ent->s.origin[1] + 8) & (~16); + p[0] = ent->s.origin[0]; + p[1] = ent->s.origin[1]; + p[2] = floor(ent->s.origin[2]+ent->mins[2]); + + // if ground is not the world we need to handle it differently. + if ( ent->s.groundEntityNum != ENTITYNUM_WORLD ) { + groundEntity = &g_entities[ent->s.groundEntityNum]; + + // check for sitting on a spawn pad + if ( !groundEntity->bmodel && groundEntity->s.modelindex == spawnpadModelIndex ) { + p[2] -= 8.0; + } + // check for plats + /* else if ( groundEntity->bmodel && Q_stricmp( groundEntity->classname, "func_plat" ) == 0 ) { + // if at the top the return PLATHIGH surface number, otherwise return PLATLOW surface number + if ( VectorCompare( groundEntity->currentOrigin, groundEntity->pos2 ) ) { + return surface[groundEntity->navSurfaceNum].parm; + } + return groundEntity->navSurfaceNum; + } */ + } + + bestDist = INFINITE; + bestSurf = -1; + + for ( n = 0; n < surfaceCount; n++ ) { + if ( Q_fabs( surface[n].origin[2] - p[2] ) > 24 ) { + continue; + } + + VectorSubtract( p, surface[n].origin, v ); + dist = VectorLength( v ); + if ( dist < bestDist ) { + bestDist = dist; + bestSurf = n; + } + + if ( surface[n].origin[2] != p[2] ) { + continue; + } + if ( surface[n].absmin[0] > p[0] ) { + continue; + } + if ( surface[n].absmax[0] < p[0] ) { + continue; + } + if ( surface[n].absmin[1] > p[1] ) { + continue; + } + if ( surface[n].absmax[1] < p[1] ) { + continue; + } + return n; + } + +// gi.Printf( "guess for %s at %s\n", ent->classname, vtos( p ) ); + return bestSurf; +} + + +/* +============= +Nav_ItemSurfaceNumber + +Returns the surface number for where an item entity is currently located. +If the entity is not on the ground, it returns -1. This is a specialized +copy of Nav_GroundSurfaceNumber for items that caches the result. +============= +*/ +int Nav_ItemSurfaceNumber( gentity_t *ent ) { + if ( !VectorCompare( ent->s.origin, ent->navOrigin ) && level.time > ent->navTime ) { + VectorCopy( ent->s.origin, ent->navOrigin ); + ent->navTime = level.time; + ent->navSurfaceNum = Nav_GroundSurfaceNumber( ent ); + } + return ent->navSurfaceNum; +} + + +/* +============= +Nav_EntitySurfaceNumber +============= +*/ +int Nav_EntitySurfaceNumber( gentity_t *ent ) { + if ( ent->s.eType == ET_ITEM ) { + return Nav_ItemSurfaceNumber( ent ); + } + + /*if ( ent->classname&& strcmp( ent->classname, "bot_goal" ) == 0 ) { + return Nav_SurfaceUnderPlayer( ent ); + }*/ + + return Nav_GroundSurfaceNumber( ent ); +} + + +/* +============= +PathEdge +============= +*/ + +static nneighbor_t *PathEdge( int sourceSurfNum, int destSurfNum ) { + int base; + int n; + + base = surface[sourceSurfNum].neighborIndex; + for ( n = 0; n < surface[sourceSurfNum].neighborCount; n++ ) { + if ( neighbor[base+n].surfaceNum == destSurfNum ) { + return &neighbor[base+n]; + } + } + return NULL; +} + +/* +============= +PointIsInEdgeRegion +============= +*/ + +static qboolean PointIsInEdgeRegion( vec3_t p, nneighbor_t *n ) { + if ( p[0] < n->absmin[0] ) { + return qfalse; + } + if ( p[0] > n->absmax[0] ) { + return qfalse; + } + if ( p[1] < n->absmin[1] ) { + return qfalse; + } + if ( p[1] > n->absmax[1] ) { + return qfalse; + } + return qtrue; +} + + + +/* +============= +Nav_MoveToGoal +============= +*/ + +int Nav_MoveToGoal( gentity_t *bot, vec3_t dir, int *flags ) { + int currentSurf; + int nextSurf; + int thirdSurf; + int goalSurf; + int routeIndex; + nneighbor_t *edge; + nneighbor_t *nextEdge; + //gentity_t *ent; + //float dist; + + *flags = 0; + VectorCopy( bot->navDir, dir ); + + currentSurf = bot->currentSurface; + + // if bot is airborne, just keep heading the same + if ( currentSurf == -1 ) { + if ( bot->aiFlags & BOTAI_PUSHED ) { + //gi.Printf( "bot was bounced\n" ); + *flags |= NAVF_HOLD; + } + //gi.Printf( "not on ground\n" ); + return 0; + } + if ( bot->pushedTime < level.time ) { + bot->aiFlags &= ~BOTAI_PUSHED; + } + + if ( !bot->goalEntity ) { +// gi.Printf( ERROR "Nav_MoveToGoal called with no goalEntity set\n" ); + return -1; + } + + goalSurf = Nav_EntitySurfaceNumber( bot->goalEntity ); + if ( goalSurf == -1 ) { + return -1; + } + + // if we've changed surfaces, the surface to surface navigation flags and timer need to be cleared + if ( currentSurf != bot->lastSurface ) { + bot->navFlags = 0; + bot->navTime = 0; + //gi.Printf( "surface changed from %i to %i\n", bot->bot->lastSurface, bot->bot->currentSurface ); + } + + if ( currentSurf == goalSurf ) { + //gi.Printf( "On target surface\n" ); + VectorSubtract( bot->goalEntity->s.origin, bot->s.origin, dir ); + //VectorCopy( dir, bot->bot->navDir ); + VectorCopy( dir, bot->navDir ); + return 0; + } + + routeIndex = route[currentSurf * surfaceCount + goalSurf]; + if ( routeIndex == 255 ) { + //gi.Printf( "Nav_MoveToGoal - no known route from %i to %i\n", currentSurf, goalSurf ); + return -1; + } + if ( routeIndex >= surface[currentSurf].neighborCount ) { + gi.Printf( ERROR "Nav_MoveToGoal - bad routeIndex\n" ); + return -1; + } + nextSurf = neighbor[surface[currentSurf].neighborIndex + routeIndex].surfaceNum; + + edge = PathEdge( currentSurf, nextSurf ); + if ( !edge ) { + gi.Printf( ERROR "Nav_MoveToGoal - %i does not have %i as a neighbor\n", currentSurf, nextSurf ); + VectorClear( dir ); + return -1; + } + + if ( ! ( bot->navFlags & NAVF_EDGEZONE ) ) { + if ( PointIsInEdgeRegion( bot->s.origin, edge ) ) { + //gi.Printf( "hit edge\n" ); + bot->navFlags |= NAVF_EDGEZONE; + bot->navTime = level.time; + } + } + + // if we are in the edge zone + if ( bot->navFlags & NAVF_EDGEZONE ) { + // if we're trying to get onto a plat, we must make sure it's there + /*if ( surface[nextSurf].flags & SF_PLATLOW ) { + ent = &g_entities[surface[surface[nextSurf].parm].parm]; //FIXME this works for now, but I don't like it + if ( VectorCompare( ent->currentOrigin, ent->pos1 ) == 0 ) { + *flags |= NAVF_HOLD; + //gi.Printf(" wait for plat2\n" ); + } + }*/ + + // if we're riding up on a plat, we don't need to move + if ( surface[nextSurf].flags & SF_PLATHIGH ) { + *flags |= NAVF_HOLD; + //gi.Printf(" hold on plat\n" ); + } + + // if the next surface contains the goalEntity, head towards it + if ( nextSurf == goalSurf ) { + //gi.Printf( "next surf has goal - targeting directly\n" ); + VectorSubtract( bot->goalEntity->s.origin, bot->s.origin, dir ); + //VectorCopy( dir, bot->bot->navDir ); + VectorCopy( dir, bot->navDir ); + } + // start heading towards the next edge + else { + routeIndex = route[nextSurf * surfaceCount + goalSurf]; + if ( routeIndex == 255 ) { + gi.Printf( ERROR "Nav_MoveToGoal - no known route from %i to %i\n", nextSurf, goalSurf ); + return -1; + } + if ( routeIndex >= surface[nextSurf].neighborCount ) { + gi.Printf( ERROR "Nav_MoveToGoal - bad routeIndex\n" ); + return -1; + } + thirdSurf = neighbor[surface[nextSurf].neighborIndex + routeIndex].surfaceNum; + nextEdge = PathEdge( nextSurf, thirdSurf ); + if ( !nextEdge ) { + gi.Printf( ERROR "Nav_MoveToGoal - %i does not have %i as a neighbor\n", nextSurf, thirdSurf ); + VectorClear( dir ); + return -1; + } + //gi.Printf( "targeting next edge\n" ); + if ( surface[nextSurf].flags & SF_PLATHIGH ) { + VectorSubtract( nextEdge->origin, surface[nextSurf].origin, dir ); + } + else { + VectorSubtract( nextEdge->origin, bot->s.origin, dir ); + } + //VectorCopy( dir, bot->bot->navDir ); + VectorCopy( dir, bot->navDir ); + } + + if ( edge->flags & NF_DUCK ) { + *flags |= NAVF_DUCK; + } + if ( edge->flags & NF_JUMP ) { + *flags |= NAVF_JUMP; + } + } + else { + VectorSubtract( edge->origin, bot->s.origin, dir ); + //VectorCopy( dir, bot->bot->navDir ); + VectorCopy( dir, bot->navDir ); + + /*if ( surface[nextSurf].flags & SF_PLATLOW ) { + ent = &g_entities[surface[surface[nextSurf].parm].parm]; //FIXME this works for now, but I don't like it + if ( VectorCompare( ent->currentOrigin, ent->pos1 ) == 0 ) { + dist = VectorLength( dir ); + if ( dist > 64 ) { + *flags |= NAVF_SLOW; + //gi.Printf(" slow for plat\n" ); + } + else { + *flags |= NAVF_HOLD; + //gi.Printf(" wait for plat\n" ); + } + } + }*/ + } + + return 0; +} + + +void Nav_ShowPath( gentity_t *bot ) { +#if 0 + gentity_t *tent; + int m, n; + + if ( !bot->bot->goalEntity ) { + return; + } + + tent = G_TempEntity( bot->s.origin, EV_DEBUG_LINE ); + VectorCopy( bot->bot->currentWaypoint->s.origin, tent->s.origin2 ); + + m = bot->bot->currentWaypoint->count; + for (;;) { + if ( m == bot->bot->finalWaypoint->count ) { + break; + } + n = route[m*maxwaypoints+bot->bot->finalWaypoint->count]; + if ( n == -1 ) { + break; + } + tent = G_TempEntity( rents[m]->s.origin, EV_DEBUG_LINE ); + VectorCopy( rents[n]->s.origin, tent->s.origin2 ); + m = n; + } + + if ( bot->bot->finalWaypoint != bot->bot->goalEntity ) { + tent = G_TempEntity( bot->bot->finalWaypoint->s.origin, EV_DEBUG_LINE ); + VectorCopy( bot->bot->goalEntity->s.origin, tent->s.origin2 ); + } +#endif + /* gentity_t *tent; + int m, n; + gentity_t *player; + int pSurf; + + player = &g_entities[1]; + pSurf = Nav_GroundSurfaceNumber( player ); + + tent = G_TempEntity( player->s.origin, EV_DEBUG_LINE ); + VectorCopy( surface[pSurf].origin, tent->s.origin2 ); */ +} +//#endif + + +/* +// Init and Shutdown +// +// +*/ + +static void Nav_Cleanup( void ) { + if ( navFileData ) { + gi.FS_FreeFile ( navFileData ); + navFileData = NULL; + } + surfaceCount = 0; + neighborCount = 0; +} + +void Nav_InitPreSpawn( void ) { + nav_showsectors = gi.cvar( "nav_showsectors", "0", 0 ); + Nav_Cleanup(); + Nav_LoadRoutes(); +} + +void Nav_InitPostSpawn( void ) { +#if 0 + int n; + nsurface_t *s; + gentity_t *ent; + + // FIXME resolve targetnames here (like button needed to open a door) + + // get the modelindex for the spawnpad model so we can use it for surface determination + spawnpadModelIndex = G_ModelIndex( "models/objects/dmspot.md3" ); + + // set the navSurface for plats + for ( n = 0; n < surfaceCount; n++ ) { + s = &surface[n]; + if ( s->flags & SF_PLATLOW ) { + ent = &g_entities[surface[s->parm].parm]; //FIXME this works for now, but I don't like it + ent->navSurfaceNum = n; + } + } +#endif +} + + +void Nav_Shutdown ( void ) { + Nav_Cleanup(); +} + +void Nav_Test_f( void ) { +#if 0 + gentity_t *player; + gentity_t *goal; + char *goalname; + int pSurf; + int gSurf; + int cSurf; + int n; + gentity_t *tent; + + player = &g_entities[0]; + pSurf = Nav_GroundSurfaceNumber( player ); + + goalname = gi.argv(2); + if ( !goalname[0] ) { + gi.Printf( "Player1 is at (%f, %f, %f) on surface %i\n", player->s.origin[0], player->s.origin[1], player->s.origin[2] + player->mins[2], pSurf ); + return; + } + + goal = NULL; + goal = G_Find( goal, FOFS( classname ), goalname ); + if ( !goal ) { + gi.Printf( "no %s on level\n", goalname ); + return; + } + gSurf = Nav_EntitySurfaceNumber( goal ); + + + cSurf = pSurf; + while ( cSurf != gSurf ) { + n = route[cSurf * surfaceCount + gSurf]; + if ( n == 255 ) { + //gi.Printf( "no known route from %i to %i\n", cSurf, gSurf ); + return; + } + if ( n >= surface[cSurf].neighborCount ) { + gi.Printf( ERROR "bad routeIndex\n" ); + return; + } + n = neighbor[surface[cSurf].neighborIndex + n].surfaceNum; + + if ( cSurf == pSurf ) { + tent = G_TempEntity( player->s.origin, EV_DEBUG_LINE ); + } + else { + tent = G_TempEntity( surface[cSurf].origin, EV_DEBUG_LINE ); + } + if ( n == gSurf ) { + VectorCopy( goal->s.origin, tent->s.origin2 ); + } + else { + VectorCopy( surface[n].origin, tent->s.origin2 ); + } + + cSurf = n; + } +#endif +} + +void Nav_Gen_f( void ); + +void Cmd_Nav_f( void ) +{ + char *cmd; + + cmd = gi.argv(1); + + if ( Q_stricmp ( cmd, "gen" ) == 0 ) { + Nav_Gen_f(); + Nav_InitPreSpawn(); + } + else if ( Q_stricmp ( cmd, "test" ) == 0 ) { + Nav_Test_f(); + } + else { + gi.Printf("Unknown nav command '%s'\n", cmd); + } +} + +void Nav_ShowStuff + ( + void + ) + + { + int i; + nsurface_t *surf; + + if ( !nav_showsectors->integer ) + { + return; + } + + G_Color4f( 1, 1, 0, 1 ); + for( i = 0; i < surfaceCount; i++ ) + { + surf = &surface[ i ]; + + G_BeginLine(); + G_Vertex( Vector( surf->absmin[ 0 ], surf->absmin[ 1 ], surf->origin[ 2 ] ) ); + G_Vertex( Vector( surf->absmin[ 0 ], surf->absmax[ 1 ], surf->origin[ 2 ] ) ); + G_Vertex( Vector( surf->absmax[ 0 ], surf->absmax[ 1 ], surf->origin[ 2 ] ) ); + G_Vertex( Vector( surf->absmax[ 0 ], surf->absmin[ 1 ], surf->origin[ 2 ] ) ); + G_Vertex( Vector( surf->absmin[ 0 ], surf->absmin[ 1 ], surf->origin[ 2 ] ) ); + G_EndLine(); + } + } diff --git a/source/source/fgame/b_navgen.cpp b/source/source/fgame/b_navgen.cpp new file mode 100644 index 0000000..250c593 --- /dev/null +++ b/source/source/fgame/b_navgen.cpp @@ -0,0 +1,3089 @@ +// +// b_navgen.c +// + +/* +Path costs - time is the cost basis + For normal paths: take dist(sSurf.origin->edge + pmoveEndSpot->tSurf.origin) and + divide by speed to get time. Adjust for duck/wade/swim. Add on time used for + the pmoves to get from edge to pmoveEndspot. + Teleporter: fixed cost of teleport delay (currently 160ms, should be a shared define) + Plats: take vertical distance and divide by plat speed to get move time; add on + any delays (this assumes plats are always at bottom waiting for us) + Trains: ??? +*/ + +/* +FIXME for Q3MAP + When done in game, plates are seen at their low position. Once this is in Q3MAP they will + be seen in their high position requiring a bit of rework of that code. I've noted most of it. +*/ + + +#include +#include "b_local.h" +#include "mover.h" + + +// these defines are placeholders for when this code moves into Q3MAP and is multithreaded +#define ThreadLock() +#define ThreadUnlock() + +#define INFINITE 1000000 + +// these defines MUST match those in bg_pmove!!! +#define MIN_WALK_NORMAL 0.7 +#define STEPSIZE 18 +#define DEFAULT_VIEWHEIGHT 26 +#define CROUCH_VIEWHEIGHT 12 + +#define DUCKSCALE 0.25 +#define SWIMSCALE 0.50 +#define WADESCALE 0.70 + +// these defines MUST match the values used in the game dll +#define DEFAULT_MINS_0 -48 +#define DEFAULT_MINS_1 -48 +#define DEFAULT_MINS_2 0 +#define DEFAULT_MAXS_0 48 +#define DEFAULT_MAXS_1 48 +#define DEFAULT_MAXS_2 76 +#define CROUCH_MAXS_2 49 + +// although this is a derived value, it needs to match the game +#define MAX_JUMPHEIGHT 32 + +// these are used to drive the pmove based reachability function +#define MAX_PMOVES 64 +#define PMOVE_MSEC 50 +#define PLAYER_SPEED 320 + +// defines for ranges and granularity of the spot testing +#define XY_MIN -4080 +#define XY_MAX 4080 +#define XY_STEP 16 +#define Z_MIN -4096 +#define Z_MAX 4064 +#define Z_STEP 1 + +#define MAX_SPOTS 65536 +#define MAX_SPOTINDEX (((XY_MAX - XY_MIN) / XY_STEP) + 2 ) + +typedef struct { + unsigned flags; + int surfaceNum; + vec3_t origin; + int parm; +} nspot_t; + +static nspot_t *spot; +static int spotCount; + +static int sortIndex[MAX_SPOTS]; +static int spotIndex[MAX_SPOTINDEX]; +static int spotIndexCount; + + +#if 0 //Q3MAP +nsurface_t *surface; +int surfaceCount; + + +nneighbor_t *neighbor; +int neighborCount; + +byte *route; +#endif + +/* +============= +VectorToString + +This is just a convenience function +for printing vectors +============= +*/ +char *vtos( const vec3_t v ) { + static int index; + static char str[8][32]; + char *s; + + // use an array so that multiple vtos won't collide + s = str[index]; + index = (index + 1)&7; + + Com_sprintf (s, 32, "(%i %i %i)", (int)v[0], (int)v[1], (int)v[2]); + + return s; +} + +// +// FindSpots +// + +static vec3_t mins; +static vec3_t duckMaxs; +static vec3_t standMaxs; + +//FIXME this should NOT be global +static gentity_t *test; + +static void FindSpotsInY( int num ) { + trace_t tr; + trace_t tr2; + vec3_t origin; + vec3_t point2; + vec3_t testpoint; + qboolean roof; + float viewheight; + int cont; + float sample1; + float sample2; + int waterlevel; + //int numEnts; + //gentity_t *ents[MAX_GENTITIES]; + gentity_t *ent; + qboolean n; + vec3_t absmin; + vec3_t absmax; + int spotNum; + float height; + //gentity_t *target; + //gentity_t *destTarget; + + origin[0] = XY_MIN + num * XY_STEP; + + for ( origin[1] = XY_MIN; origin[1] <= XY_MAX; origin[1] += XY_STEP ) { + origin[2] = Z_MAX; + tr.endpos[2] = Z_MAX + Z_STEP; + point2[0] = origin[0]; + point2[1] = origin[1]; + point2[2] = Z_MIN; + roof = qtrue; + height = Z_STEP; + +// gi.Printf( "begin %i %i\n", (int)origin[0], (int)origin[1] ); + while ( origin[2] > Z_MIN ) { + origin[2] = tr.endpos[2] - height; + height = Z_STEP; + + gi.trace( &tr, origin, mins, duckMaxs, point2, ENTITYNUM_NONE, MASK_DEADSOLID, true ); + + // did we fall out the bottom? yes = this xy finished + if ( tr.endpos[2] <= point2[2] ) { +// gi.Printf( " done - fell out\n" ); + break; + } + + // were we in solid the whole time? yes = this xy finished + if ( tr.allsolid ) { +// gi.Printf( " done - all solid\n" ); + break; + } + + // did we end up inside a solid? + gi.trace( &tr2, tr.endpos, mins, duckMaxs, tr.endpos, ENTITYNUM_NONE, MASK_DEADSOLID, true ); + if ( tr2.startsolid ) { +// gi.Printf( " in solid @ %f\n", tr.endpos[2] - 24.0 ); + continue; + } + + // did we land on the roof of the level? yes = move z down a step from point of contact + if ( roof ) { +// gi.Printf( " fell onto level @ %f\n", tr.endpos[2] - 24.0 ); + roof = qfalse; + continue; + } + + // is this too steep to stand on? yes = move z down a step from point of contact + if ( tr.plane.normal[2] < MIN_WALK_NORMAL ) { +// gi.Printf( " spot too steep @ %f\n", tr.endpos[2] - 24.0 ); + continue; + } + +// FIXME rule out any we want ignored here + // see if we are on a special entity + ent = &g_entities[tr.entityNum]; + if ( ent->s.number != ENTITYNUM_WORLD ) { + if ( ent->entity && ent->entity->isSubclassOf( Mover ) ) { + continue; + } +#if 0 + if ( Q_stricmp( ent->entname, "func_plat" ) == 0 ) { + //FIXME what do we need to do if we are + } +#endif + } + + // see if we are outside the world + VectorCopy( tr.endpos, test->s.origin ); + gi.linkentity( test ); + n = test->linked; + gi.unlinkentity( test ); + if ( n == qfalse ) { +// gi.Printf( " outside world c @ %s\n", vtos( tr.endpos ) ); + continue; + } + + if ( spotCount == MAX_SPOTS ) { + gi.Printf( "MAX_SPOTS exceeded\n" ); + //FIXME in Q3MAP this should be an exit() + return; + } + + // we found a valid standing location, add it to spot list + ThreadLock(); + spotNum = spotCount++; + ThreadUnlock(); + +// gi.Printf( " found spot @ %f %f %f\n", tr.endpos[0], tr.endpos[1], tr.endpos[2] - 24.0); +// VectorCopy( tr.endpos, spot[spotNum].origin ); + spot[spotNum].origin[0] = tr.endpos[0]; + spot[spotNum].origin[1] = tr.endpos[1]; + spot[spotNum].origin[2] = COORDINATE_TO_FLOAT * (int)(tr.endpos[2]*FLOAT_TO_COORDINATE); + spot[spotNum].flags = 0; + spot[spotNum].surfaceNum = -1; + + // see if we are on a special entity + ent = &g_entities[tr.entityNum]; + if ( ent->s.number != ENTITYNUM_WORLD ) { +#if 0 + if ( Q_stricmp( ent->entname, "func_plat" ) == 0 ) { + spot[spotNum].flags |= SF_PLATLOW; // Q3MAP: SF_PLATHIGH + height = Z_STEP; // Q3MAP: ent->pos2[2] - ent->pos1[2]; + spot[spotNum].parm = tr.entityNum; + } +// else if ( Q_stricmp( ent->entname, "func_train" ) == 0 ) { +// spot[spotNum].flags |= SF_TRAIN; +// } +#endif + } + + // check if we must be ducked + VectorAdd( tr.endpos, mins, absmin ); + gi.trace( &tr2, tr.endpos, mins, standMaxs, tr.endpos, ENTITYNUM_NONE, MASK_DEADSOLID, true ); + if ( tr2.allsolid ) { + spot[spotNum].flags |= SF_DUCK; + viewheight = CROUCH_VIEWHEIGHT; + VectorAdd( tr.endpos, duckMaxs, absmax ); + } + else { + viewheight = DEFAULT_VIEWHEIGHT; + VectorAdd( tr.endpos, standMaxs, absmax ); + } + + // check water depth and type (depends on duck state to set viewheight) + waterlevel = 0; + testpoint[0] = tr.endpos[0]; + testpoint[1] = tr.endpos[1]; + testpoint[2] = tr.endpos[2] + mins[2] + 1; + cont = gi.pointcontents( testpoint, 0 ); + + if ( cont & MASK_WATER ) { + sample2 = viewheight - mins[2]; + sample1 = sample2 / 2; + + if ( cont & (CONTENTS_LAVA | CONTENTS_SLIME) ) { + spot[spotNum].flags |= SF_PAIN; + } + + waterlevel = 1; + testpoint[2] = tr.endpos[2] + mins[2] + sample1; + cont = gi.pointcontents( testpoint, 0 ); + if (cont & MASK_WATER) { + waterlevel = 2; + testpoint[2] = tr.endpos[2] + mins[2] + sample2; + cont = gi.pointcontents( testpoint, 0 ); + if (cont & MASK_WATER) { + waterlevel = 3; + } + } + } + if ( waterlevel & 1) { + spot[spotNum].flags |= SF_WATERLEVEL1; + } + if ( waterlevel & 2) { + spot[spotNum].flags |= SF_WATERLEVEL2; + } + + // if water depth 3, see if there is air above us + if ( waterlevel == 3) { + if ( spot[spotNum].flags & SF_DUCK ) { + spot[spotNum].flags |= SF_WATER_NOAIR; + } + else { + gi.trace( &tr2, tr.endpos, mins, standMaxs, origin, ENTITYNUM_NONE, MASK_DEADSOLID, true ); + testpoint[0] = tr2.endpos[0]; + testpoint[1] = tr2.endpos[1]; + testpoint[2] = tr2.endpos[2] + DEFAULT_VIEWHEIGHT; + cont = gi.pointcontents( testpoint, 0 ); + if (cont & MASK_WATER) { + spot[spotNum].flags |= SF_WATER_NOAIR; + } + } + } +#if 0 + // check if this spot is in a trigger we care about + numEnts = gi.EntitiesInBox( absmin, absmax, ents, MAX_GENTITIES ); + for ( n = 0; n < numEnts; n++ ) { + ent = ents[n]; +// if ( Q_stricmp ( ent->entname, "misc_teleporter" ) == 0 ) { + if ( Q_stricmp ( ent->entname, "trigger_teleport" ) == 0 ) { + spot[spotNum].flags |= SF_TELEPORTER; + destTarget = NULL; + destTarget = G_Find( destTarget, FOFS( targetname ), ent->target ); + if ( !destTarget ) { + gi.Printf( "target_teleporter with no target\n" ); + spot[spotNum].parm = 0; + } + else { + spot[spotNum].parm = destTarget->s.number; + } + } + if ( !( ent->contents & CONTENTS_TRIGGER ) ) { + continue; + } + if ( Q_stricmp ( ent->entname, "trigger_hurt" ) == 0 ) { + spot[spotNum].flags |= SF_PAIN; + } + if ( Q_stricmp ( ent->entname, "trigger_push" ) == 0 ) { + spot[spotNum].flags |= SF_PUSH; + spot[spotNum].parm = ent->s.number; + } + if ( Q_stricmp ( ent->entname, "trigger_multiple" ) == 0 ) { + target = NULL; + while ( (target = G_Find( target, FOFS( targetname ), ent->target ) ) != NULL ) { + if ( target == ent ) { + continue; + } + if ( Q_stricmp ( target->entname, "target_teleporter" ) == 0 ) { + spot[spotNum].flags |= SF_TELEPORTER; + destTarget = NULL; + destTarget = G_Find( destTarget, FOFS( targetname ), target->target ); + if ( !destTarget ) { + gi.Printf( "target_teleporter with no target\n" ); + spot[spotNum].parm = 0; + } + else { + spot[spotNum].parm = destTarget->s.number; + } + } + if ( Q_stricmp ( target->entname, "target_push" ) == 0 ) { + spot[spotNum].flags |= SF_PUSH; + spot[spotNum].parm = target->s.number; + } + } + } + } +#endif + } + } +} + +static void FindSpots( void ) { + int n; + //gentity_t *ent; + //gentity_t *target; + //int spotNum; + + spot = ( nspot_t * )gi.TagMalloc ( MAX_SPOTS * sizeof(spot[0]), TAG_GAME ); + spotCount = 0; + + for ( n = 0; n < MAX_SPOTS; n++ ) { + spot[n].flags = 0; + } + + VectorSet( mins, DEFAULT_MINS_0, DEFAULT_MINS_1, DEFAULT_MINS_2 ); + VectorSet( standMaxs, DEFAULT_MAXS_0, DEFAULT_MAXS_1, DEFAULT_MAXS_2 ); + VectorSet( duckMaxs, DEFAULT_MAXS_0, DEFAULT_MAXS_1, CROUCH_MAXS_2 ); + + test = G_Spawn(); + test->s.eType = ET_GENERAL; + VectorCopy( mins, test->mins ); + VectorCopy( duckMaxs, test->maxs ); + + // RunThreadsOn( (XY_MAX - XY_MIN) / XY_STEP, qtrue, FindSpotsInY ); + for ( n = 0; n < ((XY_MAX - XY_MIN) / XY_STEP); n++ ) { + gi.DebugPrintf( "FindSpotsInY %d/%d\n", n, ((XY_MAX - XY_MIN) / XY_STEP) ); + FindSpotsInY( n ); + } + + G_FreeEdict( test ); + + +#if 0 + //FIXME add spots for trigger_teleport + for ( n = 0; n < globals.num_entities; n++ ) { + ent = &g_entities[n]; + if ( !ent->inuse ) { + continue; + } + if ( Q_stricmp ( ent->entname, "misc_teleporter" ) == 0 ) { + if ( Q_stricmp ( ent->entname, "trigger_teleport" ) == 0 ) { + target = NULL; + target = G_Find( target, FOFS( targetname ), ent->target ); + if ( !target ) { + continue; + } + spotNum = spotCount++; + spot[spotNum].origin[0] = ent->s.origin[0]; + spot[spotNum].origin[1] = ent->s.origin[1]; + spot[spotNum].origin[2] = COORDINATE_TO_FLOAT * (int)(ent->s.origin[2]*FLOAT_TO_COORDINATE); + spot[spotNum].flags = SF_TELEPORTER; + spot[spotNum].surfaceNum = -1; + spot[spotNum].parm = target - &g_entities[0]; + } + } + +#endif + gi.Printf( " %i spots\n", spotCount ); +} + + +// +// FindSurfaces +// + +#define MAX_SURFACES 4096 + +static int zstart; +static int zend; +//static int surfaceSizes[10]; + +static int CompareSpotsByZ( const void *a, const void *b ) { + nspot_t *s1 = &spot[*(int *)a]; + nspot_t *s2 = &spot[*(int *)b]; + + // z + if ( s1->origin[2] > s2->origin[2] ) { + return -1; + } + if ( s1->origin[2] < s2->origin[2] ) { + return 1; + } + + // x + if ( s1->origin[0] < s2->origin[0] ) { + return -1; + } + if ( s1->origin[0] > s2->origin[0] ) { + return 1; + } + + // y + if ( s1->origin[1] < s2->origin[1] ) { + return -1; + } + if ( s1->origin[1] > s2->origin[1] ) { + return 1; + } + + return 0; +} + +static void BuildSpotIndexByZ( void ) { + int n; + int i; + float z; + float cz; + + for ( n = 0; n < spotCount; n++ ) { + sortIndex[n] = n; + } + for ( n = 0; n < (((XY_MAX - XY_MIN) / XY_STEP) + 2); n++ ) { + spotIndex[n] = 0; + } + qsort( sortIndex, spotCount, sizeof(sortIndex[0]), CompareSpotsByZ ); + + i = 0; + cz = -8192; + for ( n = 0; n < spotCount; n++ ) { + z = spot[sortIndex[n]].origin[2]; + if ( z != cz ) { + spotIndex[i++] = n; + cz = z; + if ( i >= ( MAX_SPOTINDEX - 1 ) ) + { + gi.Printf( "MAX_SPOTINDEX exceeded\n" ); + //FIXME in Q3MAP this should be an exit() + break; + } + } + } + spotIndexCount = i; + spotIndex[i] = n; +} + +static int SpotIndex( vec3_t origin, int flags ) { + int n; + +// gi.Printf( " SpotIndex( %s )\n", vtos( origin ) ); + + for ( n = zstart; n < zend; n++ ) { + if ( spot[sortIndex[n]].origin[0] < origin[0] ) { + continue; + } + if ( spot[sortIndex[n]].origin[0] > origin[0] ) { + return -1; + } + if ( spot[sortIndex[n]].origin[1] < origin[1] ) { + continue; + } + if ( spot[sortIndex[n]].origin[1] > origin[1] ) { + return -1; + } + if ( spot[sortIndex[n]].surfaceNum != -1 ) { + return -1; + } + if ( spot[sortIndex[n]].flags != flags ) { + return -1; + } + return sortIndex[n]; + } + return -1; +} + +static void BuildSurface( int index ) { + int surfaceNum; + int plusx; + int minusx; + int plusy; + int minusy; + qboolean plusxLock; + qboolean minusxLock; + qboolean plusyLock; + qboolean minusyLock; + float xmin, xmax, x; + float ymin, ymax, y; + vec3_t test; + int n; + int count; + int tbm[256]; + int sCount; + nsurface_t *surf; + //int surfaceNum2; + //gentity_t *ent; + //float height; + + if ( surfaceCount == MAX_SURFACES ) { + gi.Printf( "MAX_SURFACES exceeded\n" ); + //FIXME in Q3MAP this should be an exit() + return; + } + + ThreadLock(); + surfaceNum = surfaceCount++; + ThreadUnlock(); + + spot[index].surfaceNum = surfaceNum; + + plusx = 0; + minusx = 0; + plusy = 0; + minusy = 0; + plusxLock = qfalse; + minusxLock = qfalse; + plusyLock = qfalse; + minusyLock = qfalse; + test[2] = spot[index].origin[2]; + sCount = 1; + + while ( !plusxLock || !minusxLock || !plusyLock || !minusyLock ) { + if ( !plusxLock ) { + plusx++; + count = 0; + test[0] = spot[index].origin[0] + plusx * XY_STEP; + ymin = spot[index].origin[1] - minusy * XY_STEP; + ymax = spot[index].origin[1] + plusy * XY_STEP; + for ( y = ymin; y <= ymax; y += XY_STEP ) { + test[1] = y; + n = SpotIndex( test, spot[index].flags ); + if ( n == -1 ) { + plusx--; + plusxLock = qtrue; + break; + } + tbm[count++] = n; + } + for ( n = 0; n < count; n ++ ) { + spot[tbm[n]].surfaceNum = surfaceNum; + } + sCount += count; + } + + if ( !minusxLock ) { + minusx++; + count = 0; + test[0] = spot[index].origin[0] - minusx * XY_STEP; + ymin = spot[index].origin[1] - minusy * XY_STEP; + ymax = spot[index].origin[1] + plusy * XY_STEP; + for ( y = ymin; y <= ymax; y += XY_STEP ) { + test[1] = y; + n = SpotIndex( test, spot[index].flags ); + if ( n == -1 ) { + minusx--; + minusxLock = qtrue; + break; + } + tbm[count++] = n; + } + for ( n = 0; n < count; n ++ ) { + spot[tbm[n]].surfaceNum = surfaceNum; + } + sCount += count; + } + + if ( !plusyLock ) { + plusy++; + count = 0; + test[1] = spot[index].origin[1] + plusy * XY_STEP; + xmin = spot[index].origin[0] - minusx * XY_STEP; + xmax = spot[index].origin[0] + plusx * XY_STEP; + for ( x = xmin; x <= xmax; x += XY_STEP ) { + test[0] = x; + n = SpotIndex( test, spot[index].flags ); + if ( n == -1 ) { + plusy--; + plusyLock = qtrue; + break; + } + tbm[count++] = n; + } + for ( n = 0; n < count; n ++ ) { + spot[tbm[n]].surfaceNum = surfaceNum; + } + sCount += count; + } + + if ( !minusyLock ) { + minusy++; + count = 0; + test[1] = spot[index].origin[1] - minusy * XY_STEP; + xmin = spot[index].origin[0] - minusx * XY_STEP; + xmax = spot[index].origin[0] + plusx * XY_STEP; + for ( x = xmin; x <= xmax; x += XY_STEP ) { + test[0] = x; + n = SpotIndex( test, spot[index].flags ); + if ( n == -1 ) { + minusy--; + minusyLock = qtrue; + break; + } + tbm[count++] = n; + } + for ( n = 0; n < count; n ++ ) { + spot[tbm[n]].surfaceNum = surfaceNum; + } + sCount += count; + } + } + +#if 0 + if ( sCount <= 1 ) { + surfaceSizes[0]++; + } + else if ( sCount <= 2 ) { + surfaceSizes[1]++; + } + else if ( sCount <= 4 ) { + surfaceSizes[2]++; + } + else if ( sCount <= 8 ) { + surfaceSizes[3]++; + } + else if ( sCount <= 16 ) { + surfaceSizes[4]++; + } + else if ( sCount <= 32 ) { + surfaceSizes[5]++; + } + else if ( sCount <= 64 ) { + surfaceSizes[6]++; + } + else if ( sCount <= 128 ) { + surfaceSizes[7]++; + } + else if ( sCount <= 256 ) { + surfaceSizes[8]++; + } + else { + surfaceSizes[9]++; + } +#endif + + surf = &surface[surfaceNum]; + surf->flags = spot[index].flags; + + surf->absmin[0] = spot[index].origin[0] - ( minusx * XY_STEP ); + surf->absmin[1] = spot[index].origin[1] - ( minusy * XY_STEP ); + + surf->absmax[0] = spot[index].origin[0] + ( plusx * XY_STEP ); + surf->absmax[1] = spot[index].origin[1] + ( plusy * XY_STEP ); + + surf->origin[0] = ( surf->absmin[0] + surf->absmax[0] ) * 0.5; + surf->origin[1] = ( surf->absmin[1] + surf->absmax[1] ) * 0.5; + surf->origin[2] = spot[index].origin[2]; + + gi.DebugPrintf( "Spot %d : origin %s\n", index, vtos( surf->origin ) ); + +// gi.Printf( "Surface from %s ", vtos( surf->absmin ) ); +// gi.Printf( "to %s", vtos( surf->absmax) ); +// gi.Printf( "at %s\n", vtos( surf->origin) ); +#if 0 + // if this is a plat high position, build to plat low surface + // Q#MAP: numerous changes in here + if ( spot[index].flags & SF_PLATLOW ) { //Q3MAP: SF_PLATHIGH + // grab another surface + ThreadLock(); + surfaceNum2 = surfaceCount++; + ThreadUnlock(); + + // make a copy of the other plat surface + memcpy( &surface[surfaceNum2], &surface[surfaceNum], sizeof( nsurface_t ) ); + +// // switch the flag from high to low +// surface[surfaceNum2].flags &= ~SF_PLATHIGH; +// surface[surfaceNum2].flags |= SF_PLATLOW; + // switch the flag from low to high + surface[surfaceNum2].flags &= ~SF_PLATLOW; + surface[surfaceNum2].flags |= SF_PLATHIGH; + + // adjust the z value + ent = &g_entities[spot[index].parm]; + height = ent->pos2[2] - ent->pos1[2]; +// surface[surfaceNum2].origin[2] -= height; + surface[surfaceNum2].origin[2] += height; + + // set low plat surface parm to high plat surface number +// surface[surfaceNum2].parm = surfaceNum; + surface[surfaceNum].parm = surfaceNum2; + +// // set high plat surface parm plat cost +// surface[surfaceNum].parm = (height / ent->speed) * 1000; +// surface[surfaceNum2].parm = (height / ent->speed) * 1000; + // set high plat surface parm to plat entity number +// surface[surfaceNum].parm = spot[index].parm; + surface[surfaceNum2].parm = spot[index].parm; + } +#endif + if ( spot[index].flags & SF_PUSH ) { + surf->parm = spot[index].parm; + } + + if ( spot[index].flags & SF_TELEPORTER ) { + surf->parm = spot[index].parm; + } +} + +static void FindSurfacesAtZ( int zIndex ) { + int n; + + zstart = spotIndex[zIndex]; + zend = spotIndex[zIndex + 1]; + + for ( n = zstart; n < zend; n++ ) { + if ( spot[sortIndex[n]].surfaceNum == -1 ) { + BuildSurface( sortIndex[n] ); + } + } +} + +static void FindSurfaces( void ) { + int n; + + surface = ( nsurface_t * )gi.TagMalloc ( MAX_SURFACES * sizeof(surface[0]), TAG_GAME ); + surfaceCount = 0; + +// memset( surfaceSizes, 0, sizeof( surfaceSizes ) ); + BuildSpotIndexByZ(); + +// RunThreadsOn( spotIndexCount, qtrue, FindSurfacesAtZ ); + for ( n = 0; n < spotIndexCount; n++ ) { + FindSurfacesAtZ( n ); + } + + gi.TagFree( spot ); + +#if 0 + gi.Printf( "%3i @ 1\n", surfaceSizes[0] ); + gi.Printf( "%3i @ 2\n", surfaceSizes[1] ); + gi.Printf( "%3i @ 3-4\n", surfaceSizes[2] ); + gi.Printf( "%3i @ 5-8\n", surfaceSizes[3] ); + gi.Printf( "%3i @ 9-16\n", surfaceSizes[4] ); + gi.Printf( "%3i @ 17-32\n", surfaceSizes[5] ); + gi.Printf( "%3i @ 33-64\n", surfaceSizes[6] ); + gi.Printf( "%3i @ 65-128\n", surfaceSizes[7] ); + gi.Printf( "%3i @ 129-256\n", surfaceSizes[8] ); + gi.Printf( "%3i @ 257+\n", surfaceSizes[9] ); +#endif + + gi.Printf( " %i surfaces\n", surfaceCount ); +} + +int FindSpot( vec3_t origin, int flags, float min_height ) +{ + int n; + + for ( n = 0; n < spotCount ; n++ ) + { + if ( spot[sortIndex[n]].origin[0] < origin[0] ) { + continue; + } + if ( spot[sortIndex[n]].origin[0] > origin[0] ) { + return -1; + } + if ( spot[sortIndex[n]].origin[1] < origin[1] ) { + continue; + } + if ( spot[sortIndex[n]].origin[1] > origin[1] ) { + return -1; + } + if ( spot[sortIndex[n]].origin[2] <= min_height ) { + continue; + } + if ( spot[sortIndex[n]].surfaceNum != -1 ) { + return -1; + } + if ( spot[sortIndex[n]].flags != flags ) { + return -1; + } + return sortIndex[n]; + } + return -1; +} + +int FindUsedSpot( vec3_t origin, float min_height ) +{ + int n; + + for ( n = 0; n < spotCount ; n++ ) + { + if ( spot[sortIndex[n]].origin[0] < origin[0] ) { + continue; + } + if ( spot[sortIndex[n]].origin[0] > origin[0] ) { + return -1; + } + if ( spot[sortIndex[n]].origin[1] < origin[1] ) { + continue; + } + if ( spot[sortIndex[n]].origin[1] > origin[1] ) { + return -1; + } + if ( spot[sortIndex[n]].origin[2] <= min_height ) { + continue; + } + return sortIndex[n]; + } + return -1; +} + +int FindSpotInSurface( vec3_t origin, int surfaceNum ) +{ + int index; + float current_height; + + + current_height = Z_MIN; + + while( 1 ) + { + index = FindUsedSpot( origin, current_height ); + + if (index == -1) + return -1; + + if (spot[index].surfaceNum == surfaceNum) + return index; + + current_height = spot[index].origin[2]; + } + + return -1; +} + +qboolean IsConvex( int surfaceNum, vec3_t check_point, int n ) +{ + float i, j; + float x1, y1; + float x2, y2; + float step; + int test_y; + float y_diff; + vec3_t test_point; + int test = 0; + + + if (check_point[0] < spot[n].origin[0]) + { + x1 = check_point[0]; + y1 = check_point[1]; + + x2 = spot[n].origin[0]; + y2 = spot[n].origin[1]; + } + else + { + x1 = spot[n].origin[0]; + y1 = spot[n].origin[1]; + + x2 = check_point[0]; + y2 = check_point[1]; + } + + if (x2 - x1 != 0) + step = (y2 - y1) / (x2 - x1) / XY_STEP; + else + step = 0; + + j = 0; + + for ( i = x1 ; i < x2 ; i += XY_STEP ) + { + // Test points here + + test_point[0] = i; + + test_y = j + .5; + + y_diff = j - test_y; + + if (0) //((y_diff < .05) && (y_diff > -.05)) + { + test_point[1] = y1 + ((int)j) * XY_STEP; + + if (FindSpotInSurface( test_point, surfaceNum ) == -1) + //return qfalse; + test++; + else + test = 0; + + } + else + { + + test_point[1] = y1 + ((int)j) * XY_STEP; + + if (FindSpotInSurface( test_point, surfaceNum ) == -1) + { + if (j > 0) + test_point[1] = y1 + ((int)(j + 1)) * XY_STEP; + else + test_point[1] = y1 + ((int)(j - 1)) * XY_STEP; + + if (FindSpotInSurface( test_point, surfaceNum ) == -1) + //return qfalse; + test++; + else + test = 0; + } + else + test = 0; + } + + if (test == 3) + return qfalse; + + j += step; + } + + return qtrue; +} + +qboolean CanAddPoint1( int surfaceNum, int n ) +{ + int i, j; + float z_diff; + int index; + vec3_t check_point; + float current_height; + int has_neighbor_point; + + + // Make sure can walk to nearest points in this surface + + has_neighbor_point = qfalse; + + for ( i = -1 ; i <= 1 ; i++ ) + { + check_point[0] = spot[n].origin[0] + i * XY_STEP; + + for ( j = -1 ; j <= 1 ; j++ ) + { + check_point[1] = spot[n].origin[1] + j * XY_STEP; + + if (! ((i == 0) && (j == 0)) ) + { + // Find point in same surface + + current_height = Z_MIN; + + while( 1 ) + { + index = FindUsedSpot( check_point, current_height ); + + if (index == -1) + break; + + if (spot[index].surfaceNum == surfaceNum) + { + has_neighbor_point = qtrue; + + z_diff = spot[index].origin[2] - spot[n].origin[2]; + if (z_diff < 0) + z_diff = -z_diff; + + if (z_diff > STEPSIZE) + return qfalse; + + break; + } + + current_height = spot[index].origin[2]; + } + } + } + } + + // Make sure it was next to at least one other point in this surface + + if (!has_neighbor_point) + return qfalse; + + return qtrue; +} + +qboolean CanAddPoint2( int surfaceNum, int n ) +{ + int i, j; + vec3_t check_point; + vec2_t absmin; + vec2_t absmax; + qboolean skip_top, skip_left, skip_right, skip_bottom; + + + // Setup ansolute mins and maxs correctly + + if (spot[n].origin[0] < surface[surfaceNum].absmin[0]) + { + absmin[0] = spot[n].origin[0]; + skip_left = qtrue; + } + else + { + absmin[0] = surface[surfaceNum].absmin[0]; + skip_left = qfalse; + } + + if (spot[n].origin[0] > surface[surfaceNum].absmax[0]) + { + absmax[0] = spot[n].origin[0]; + skip_right = qtrue; + } + else + { + absmax[0] = surface[surfaceNum].absmax[0]; + skip_right = qfalse; + } + + if (spot[n].origin[1] < surface[surfaceNum].absmin[1]) + { + absmin[1] = spot[n].origin[1]; + skip_top = qtrue; + } + else + { + absmin[1] = surface[surfaceNum].absmin[1]; + skip_top = qfalse; + } + + if (spot[n].origin[1] > surface[surfaceNum].absmax[1]) + { + absmax[1] = spot[n].origin[1]; + skip_bottom = qtrue; + } + else + { + absmax[1] = surface[surfaceNum].absmax[1]; + skip_bottom = qfalse; + } + + // Test top and bottom points for convexness + + for( i = absmin[0] ; i <= absmax[0] ; i += XY_STEP ) + { + check_point[0] = i; + + // Find top point in this column + + if (!skip_top) + { + for( j = absmin[1] ; j <= absmax[1] ; j += XY_STEP ) + { + check_point[1] = j; + + if (FindSpotInSurface( check_point, surfaceNum ) != -1) + { + // Test for convexness + + if (!IsConvex( surfaceNum, check_point, n )) + return qfalse; + + break; + } + } + } + + // Find bottom point in this column + + if (!skip_bottom) + { + for( j = absmax[1] ; j >= absmin[1] ; j -= XY_STEP ) + { + check_point[1] = j; + + if (FindSpotInSurface( check_point, surfaceNum ) != -1) + { + // Test for convexness + + if (!IsConvex( surfaceNum, check_point, n )) + return qfalse; + + break; + } + } + } + } + + // Test left and right points for convexness + + for( j = absmin[1] ; j <= absmax[1] ; j += XY_STEP ) + { + check_point[1] = j; + + // Find left point in this row + + if (!skip_left) + { + for( i = absmin[0] ; i <= absmax[0] ; i += XY_STEP ) + { + check_point[0] = i; + + if (FindSpotInSurface( check_point, surfaceNum ) != -1) + { + // Test for convexness + + if (!IsConvex( surfaceNum, check_point, n )) + return qfalse; + + break; + } + } + } + + // Find right point in this row + + if (!skip_right) + { + for( i = absmax[0] ; i >= absmin[0] ; i -= XY_STEP ) + { + check_point[0] = i; + + if (FindSpotInSurface( check_point, surfaceNum ) != -1) + { + // Test for convexness + + if (!IsConvex( surfaceNum, check_point, n )) + return qfalse; + + break; + } + } + } + } + + + /* for ( i = -1 ; i <= 1 ; i++ ) + { + check_point[0] = spot[n].origin[0] + i * XY_STEP; + + for ( j = -1 ; j <= 1 ; j++ ) + { + check_point[1] = spot[n].origin[1] + j * XY_STEP; + + if (! ((i == 0) && (j == 0)) ) + { + // Find point in same surface + + current_height = Z_MIN; + + while( 1 ) + { + index = FindUsedSpot( check_point, current_height ); + + if (index == -1) + break; + + if (spot[index].surfaceNum == surfaceNum) + break; + + current_height = spot[index].origin[2]; + } + + if (index == -1) + { + current_height = Z_MIN; + + while( 1 ) + { + index = FindUsedSpot( check_point, current_height ); + + if (index == -1) + break; + + if (spot[index].surfaceNum == surfaceNum) + break; + + current_height = spot[index].origin[2]; + } + + if (index != -1) + return qfalse; + } + } + } + } */ + + return qtrue; +} + +void AddPointToSurface( int surfaceNum, int n ) +{ + spot[n].surfaceNum = surfaceNum; + + if (spot[n].origin[0] < surface[surfaceNum].absmin[0]) + surface[surfaceNum].absmin[0] = spot[n].origin[0]; + + if (spot[n].origin[0] > surface[surfaceNum].absmax[0]) + surface[surfaceNum].absmax[0] = spot[n].origin[0]; + + if (spot[n].origin[1] < surface[surfaceNum].absmin[1]) + surface[surfaceNum].absmin[1] = spot[n].origin[1]; + + if (spot[n].origin[1] > surface[surfaceNum].absmax[1]) + surface[surfaceNum].absmax[1] = spot[n].origin[1]; +} + +static void BuildConvexSurface( int index ) +{ + int surfaceNum; + int plusx; + int minusx; + int plusy; + int minusy; + qboolean plusxLock; + qboolean minusxLock; + qboolean plusyLock; + qboolean minusyLock; + qboolean plusxhold, minusxhold, plusyhold, minusyhold; + qboolean plusxalreadyheld, minusxalreadyheld, plusyalreadyheld, minusyalreadyheld; + float xmin, xmax, x; + float ymin, ymax, y; + vec3_t test; + int n; + int count; + int tbm[256]; + int sCount; + nsurface_t *surf; + qboolean valid_direction; + float current_height; + int i; + + + + if ( surfaceCount == MAX_SURFACES ) + { + gi.Printf( "MAX_SURFACES exceeded\n" ); + return; + } + + //if (surfaceCount > 100) + // return; + + ThreadLock(); + surfaceNum = surfaceCount++; + ThreadUnlock(); + + spot[index].surfaceNum = surfaceNum; + + surface[surfaceNum].absmin[0] = spot[index].origin[0]; + surface[surfaceNum].absmax[0] = spot[index].origin[0]; + surface[surfaceNum].absmin[1] = spot[index].origin[1]; + surface[surfaceNum].absmax[1] = spot[index].origin[1]; + + plusx = 0; + minusx = 0; + plusy = 0; + minusy = 0; + + plusxLock = qfalse; + minusxLock = qfalse; + plusyLock = qfalse; + minusyLock = qfalse; + + plusxhold = qfalse; + minusxhold = qfalse; + plusyhold = qfalse; + minusyhold = qfalse; + + plusxalreadyheld = qfalse; + minusxalreadyheld = qfalse; + plusyalreadyheld = qfalse; + minusyalreadyheld = qfalse; + + test[2] = spot[index].origin[2]; + sCount = 1; + + while ( !plusxLock || !minusxLock || !plusyLock || !minusyLock ) + { + if ( ( plusxLock || plusxhold ) && ( minusxLock || minusxhold ) && ( plusyLock || plusyhold ) && ( minusyLock || minusyhold ) ) + { + // Remove all of the holds + + plusxhold = qfalse; + minusxhold = qfalse; + plusyhold = qfalse; + minusyhold = qfalse; + + plusxalreadyheld = qtrue; + minusxalreadyheld = qtrue; + plusyalreadyheld = qtrue; + minusyalreadyheld = qtrue; + } + + if ( !plusxLock && !plusxhold ) + { + plusx++; + count = 0; + test[0] = spot[index].origin[0] + plusx * XY_STEP; + ymin = spot[index].origin[1] - minusy * XY_STEP; + ymax = spot[index].origin[1] + plusy * XY_STEP; + valid_direction = qfalse; + + for ( y = ymin; y <= ymax; y += XY_STEP ) + { + // Find this spot + + test[1] = y; + current_height = Z_MIN; + n = FindSpot( test, spot[index].flags, current_height ); + + while( n != -1 ) + { + // See if this point can be added and the surface stay convex + + if ( CanAddPoint1( surfaceNum, n ) ) + { + // Add this point to this surface + + spot[n].surfaceNum = surfaceNum; + tbm[count] = n; + count++; + + break; + } + + // Get the next spot at this x, y + + current_height = spot[n].origin[2]; + n = FindSpot( test, spot[index].flags, current_height ); + } + } + + if ( plusxalreadyheld ) + { + for( i = 0 ; i < count ; i++ ) + { + if ( CanAddPoint2( surfaceNum, tbm[i] ) ) + { + AddPointToSurface( surfaceNum, tbm[i] ); + valid_direction = qtrue; + } + else + spot[tbm[i]].surfaceNum = -1; + } + } + else + { + valid_direction = qtrue; + + if (count == (ymax - ymin) / XY_STEP + 1) + { + for( i = 0 ; i < count ; i++ ) + AddPointToSurface( surfaceNum, tbm[i] ); + } + else + { + for( i = 0 ; i < count ; i++ ) + spot[tbm[i]].surfaceNum = -1; + plusxhold = qtrue; + plusx--; + } + } + + if ( !valid_direction ) + { + plusx--; + plusxLock = qtrue; + } + } + + if ( !minusxLock && !minusxhold ) + { + minusx++; + count = 0; + test[0] = spot[index].origin[0] - minusx * XY_STEP; + ymin = spot[index].origin[1] - minusy * XY_STEP; + ymax = spot[index].origin[1] + plusy * XY_STEP; + valid_direction = qfalse; + + for ( y = ymin; y <= ymax; y += XY_STEP ) + { + // Find this spot + + test[1] = y; + current_height = Z_MIN; + n = FindSpot( test, spot[index].flags, current_height ); + + while( n != -1 ) + { + // See if this point can be added and the surface stay convex + + if ( CanAddPoint1( surfaceNum, n ) ) + { + // Add this point to this surface + + spot[n].surfaceNum = surfaceNum; + tbm[count] = n; + count++; + + break; + } + + // Get the next spot at this x, y + + current_height = spot[n].origin[2]; + n = FindSpot( test, spot[index].flags, current_height ); + } + } + + if ( minusxalreadyheld ) + { + for( i = 0 ; i < count ; i++ ) + { + if ( CanAddPoint2( surfaceNum, tbm[i] ) ) + { + AddPointToSurface( surfaceNum, tbm[i] ); + valid_direction = qtrue; + } + else + spot[tbm[i]].surfaceNum = -1; + } + } + else + { + valid_direction = qtrue; + + if (count == (ymax - ymin) / XY_STEP + 1) + { + for( i = 0 ; i < count ; i++ ) + AddPointToSurface( surfaceNum, tbm[i] ); + } + else + { + for( i = 0 ; i < count ; i++ ) + spot[tbm[i]].surfaceNum = -1; + minusxhold = qtrue; + minusx--; + } + } + + if ( !valid_direction ) + { + minusx--; + minusxLock = qtrue; + } + } + + if ( !plusyLock && !plusyhold ) + { + plusy++; + count = 0; + test[1] = spot[index].origin[1] + plusy * XY_STEP; + xmin = spot[index].origin[0] - minusx * XY_STEP; + xmax = spot[index].origin[0] + plusx * XY_STEP; + valid_direction = qfalse; + + for ( x = xmin; x <= xmax; x += XY_STEP ) + { + // Find this spot + + test[0] = x; + current_height = Z_MIN; + n = FindSpot( test, spot[index].flags, current_height ); + + while( n != -1 ) + { + // See if this point can be added and the surface stay convex + + if ( CanAddPoint1( surfaceNum, n ) ) + { + // Add this point to this surface + + spot[n].surfaceNum = surfaceNum; + tbm[count] = n; + count++; + + break; + } + + // Get the next spot at this x, y + + current_height = spot[n].origin[2]; + n = FindSpot( test, spot[index].flags, current_height ); + } + } + + if ( plusyalreadyheld ) + { + for( i = 0 ; i < count ; i++ ) + { + if ( CanAddPoint2( surfaceNum, tbm[i] ) ) + { + AddPointToSurface( surfaceNum, tbm[i] ); + valid_direction = qtrue; + } + else + spot[tbm[i]].surfaceNum = -1; + } + } + else + { + valid_direction = qtrue; + + if (count == (xmax - xmin) / XY_STEP + 1) + { + for( i = 0 ; i < count ; i++ ) + AddPointToSurface( surfaceNum, tbm[i] ); + } + else + { + for( i = 0 ; i < count ; i++ ) + spot[tbm[i]].surfaceNum = -1; + plusyhold = qtrue; + plusy--; + } + } + + if ( !valid_direction ) + { + plusy--; + plusyLock = qtrue; + } + } + + if ( !minusyLock && !minusyhold ) + { + minusy++; + count = 0; + test[1] = spot[index].origin[1] - minusy * XY_STEP; + xmin = spot[index].origin[0] - minusx * XY_STEP; + xmax = spot[index].origin[0] + plusx * XY_STEP; + valid_direction = qfalse; + + for ( x = xmin; x <= xmax; x += XY_STEP ) + { + // Find this spot + + test[0] = x; + current_height = Z_MIN; + n = FindSpot( test, spot[index].flags, current_height ); + + while( n != -1 ) + { + // See if this point can be added and the surface stay convex + + if ( CanAddPoint1( surfaceNum, n ) ) + { + // Add this point to this surface + + spot[n].surfaceNum = surfaceNum; + tbm[count] = n; + count++; + + break; + } + + // Get the next spot at this x, y + + current_height = spot[n].origin[2]; + n = FindSpot( test, spot[index].flags, current_height ); + } + } + + if ( minusyalreadyheld ) + { + for( i = 0 ; i < count ; i++ ) + { + if ( CanAddPoint2( surfaceNum, tbm[i] ) ) + { + AddPointToSurface( surfaceNum, tbm[i] ); + valid_direction = qtrue; + } + else + spot[tbm[i]].surfaceNum = -1; + } + } + else + { + valid_direction = qtrue; + + if (count == (xmax - xmin) / XY_STEP + 1) + { + for( i = 0 ; i < count ; i++ ) + AddPointToSurface( surfaceNum, tbm[i] ); + } + else + { + for( i = 0 ; i < count ; i++ ) + spot[tbm[i]].surfaceNum = -1; + minusyhold = qtrue; + minusy--; + } + } + + if ( !valid_direction ) + { + minusy--; + minusyLock = qtrue; + } + } + } + + // Setup surface info + + surf = &surface[surfaceNum]; + surf->flags = spot[index].flags; + + surf->absmin[0] = spot[index].origin[0] - ( minusx * XY_STEP ); + surf->absmin[1] = spot[index].origin[1] - ( minusy * XY_STEP ); + + surf->absmax[0] = spot[index].origin[0] + ( plusx * XY_STEP ); + surf->absmax[1] = spot[index].origin[1] + ( plusy * XY_STEP ); + + surf->origin[0] = ( surf->absmin[0] + surf->absmax[0] ) * 0.5; + surf->origin[1] = ( surf->absmin[1] + surf->absmax[1] ) * 0.5; + surf->origin[2] = spot[index].origin[2]; + + gi.DebugPrintf( "surface #%d - Spot %d : origin %s\n", surfaceNum, index, vtos( surf->origin ) ); +} + +static int CompareSpots( const void *a, const void *b ) { + nspot_t *s1 = &spot[*(int *)a]; + nspot_t *s2 = &spot[*(int *)b]; + + // x + if ( s1->origin[0] < s2->origin[0] ) { + return -1; + } + if ( s1->origin[0] > s2->origin[0] ) { + return 1; + } + + // y + if ( s1->origin[1] < s2->origin[1] ) { + return -1; + } + if ( s1->origin[1] > s2->origin[1] ) { + return 1; + } + + // z + if ( s1->origin[2] > s2->origin[2] ) { + return -1; + } + if ( s1->origin[2] < s2->origin[2] ) { + return 1; + } + + return 0; +} + +static void SortSpots( void ) +{ + int n; + //int i; + //float z; + //float cz; + + for ( n = 0; n < spotCount; n++ ) + sortIndex[n] = n; + + for ( n = 0; n < (((XY_MAX - XY_MIN) / XY_STEP) + 2); n++ ) + spotIndex[n] = 0; + + qsort( sortIndex, spotCount, sizeof(sortIndex[0]), CompareSpots ); +} + +static void FindConvexSurfaces( void ) +{ + int n; + + surface = ( nsurface_t * )gi.TagMalloc ( MAX_SURFACES * sizeof(surface[0]), TAG_GAME ); + surfaceCount = 0; + + SortSpots(); + + for ( n = 0; n < spotCount; n++ ) + { + if ( spot[sortIndex[n]].surfaceNum == -1 ) + BuildConvexSurface( sortIndex[n] ); + } + + gi.TagFree( spot ); + + gi.Printf( " %i surfaces\n", surfaceCount ); +} + +// +// FindNeighbors +// + +// stats on point to edge reachability testing +typedef struct { + int count; + int accept; + int reject1; + int reject2; + int reject3; + int pmoveCount; +} reachStats_t; + +// stats on surface to surface testing +typedef struct { + int count; + int accept; + int reject; + int treject1; + int treject2; + int treject3; + int treject4; + int zeroNeighbors; +} surfaceStats_t; + +// per source surface info +// +// The reason for the local neighbors array and MAX_NEIGHBORS_PER_SURFACE is so FindSurfaceNeighbors +// can be run on many surfaces at once when multithreaded. + +#define MAX_NEIGHBORS_PER_SURFACE 256 + +typedef struct { + int number; + nsurface_t *surface; + int neighborCount; + nneighbor_t neighbor[MAX_NEIGHBORS_PER_SURFACE]; +} sourceSurfaceInfo_t; + +// per target surface info +typedef struct { + int number; + nsurface_t *surface; + qboolean edgeActive; + vec2_t edgeStart; + vec2_t edgeEnd; + int edgeFlags; + float cost; +} targetSurfaceInfo_t; + +// per thread neighbor testing info block +typedef struct { + reachStats_t rStats; + surfaceStats_t sStats; + sourceSurfaceInfo_t sSurf; + targetSurfaceInfo_t tSurf; +} surfaceThreadInfo_t; + +// global (per map) instances of stats; used to sum all the per thread stats +static reachStats_t reachStats; +static surfaceStats_t surfStats; + + +#define FLOAT_TO_VELOCITY 16.0 +#define VELOCITY_TO_FLOAT (1.0/FLOAT_TO_VELOCITY) + +static int SurfaceNumberAtPoint( vec3_t point ) { + vec3_t p; + int n; + + p[0] = point[0]; + p[1] = point[1]; + p[2] = floor( point[2] ); + + for ( n = 0; n < surfaceCount; n++ ) { + if ( floor( surface[n].origin[2] ) != p[2] ) { + continue; + } + if ( ( surface[n].absmin[0] - 16 ) > p[0] ) { + continue; + } + if ( ( surface[n].absmax[0] + 16 ) < p[0] ) { + continue; + } + if ( ( surface[n].absmin[1] - 16 ) > p[1] ) { + continue; + } + if ( ( surface[n].absmax[1] + 16 ) < p[1] ) { + continue; + } + return n; + } + + return -1; +} + + +static qboolean PointIsOnSurfaceNumber( vec3_t point, int n ) { + vec3_t p; + + p[0] = point[0]; + p[1] = point[1]; + p[2] = floor( point[2] ); + + if ( floor( surface[n].origin[2] ) != p[2] ) { + return qfalse; + } + if ( ( surface[n].absmin[0] - 16 ) > p[0] ) { + return qfalse; + } + if ( ( surface[n].absmax[0] + 16 ) < p[0] ) { + return qfalse; + } + if ( ( surface[n].absmin[1] - 16 ) > p[1] ) { + return qfalse; + } + if ( ( surface[n].absmax[1] + 16 ) < p[1] ) { + return qfalse; + } + return qtrue; +} + +static void ReachTrace(trace_t *result, const vec3_t start, const vec3_t mins, const vec3_t maxs, const vec3_t end, int passEntityNum, int contents, qboolean cylinder ) + { + trace_t tr; + + gi.trace ( &tr, start, mins, maxs, end, passEntityNum, contents, cylinder ); + + //FIXME this is FUGLY + while ( tr.entityNum && ( g_entities[tr.entityNum].s.eType == ET_MOVER ) ) + { + if ( Q_stricmp( g_entities[tr.entityNum].entname, "func_plat" ) == 0 ) + { + *result = tr; + return; + } + gi.trace ( &tr, tr.endpos, mins, maxs, end, tr.entityNum, contents, cylinder ); + if ( tr.fraction == 0.0 ) + { + *result = tr; + return; + } + } + *result = tr; + return; + } + +//FIXME try start running, start walking, and start motionless (special flags set if slower speed required) +static qboolean CanReach( surfaceThreadInfo_t *info, vec3_t start, vec3_t dir, int *flags ) { + pmove_t pm; + playerState_t ps; + int n; + int currentSurface; + vec3_t lastOrigin; + + info->rStats.count++; + + *flags = 0; + + VectorNormalize( dir ); + VectorCopy( start, lastOrigin ); + + memset( &pm, 0, sizeof( pm ) ); + memset( &ps, 0, sizeof( ps ) ); + pm.ps = &ps; + pm.cmd.msec = PMOVE_MSEC; + pm.cmd.buttons = 0; + pm.cmd.weapon = 0; + pm.cmd.angles[0] = 0; + pm.cmd.angles[1] = 0; + pm.cmd.angles[2] = 0; + pm.cmd.forwardmove = 127; + pm.cmd.rightmove = 0; + pm.cmd.upmove = 0; + pm.tracemask = MASK_DEADSOLID; + pm.noFootsteps = qtrue; + pm.trace = ReachTrace; + pm.pointcontents = gi.pointcontents; + + ps.pm_type = PM_NORMAL; + ps.gravity = sv_gravity->value; + ps.speed = PLAYER_SPEED; + VectorCopy( start, ps.origin ); +// VectorClear( ps.velocity ); + VectorScale( dir, ps.speed, ps.velocity ); + ps.delta_angles[0] = 0; + ps.delta_angles[1] = ANGLE2SHORT ( vectoyaw ( dir ) ); + ps.delta_angles[2] = 0; + ps.groundEntityNum = 0; + ps.clientNum = 0; // FIXME? was ent->s.number; + + // do we need to start ducked? + if ( info->sSurf.surface->flags & SF_DUCK ) { + ps.pm_flags |= PMF_DUCKED; + } + + // does the target surface require us to be ducked + if ( info->tSurf.surface->flags & SF_DUCK ) { + ps.pm_flags |= PMF_DUCKED; + pm.cmd.upmove = -127; + } + + // do we need to jump up? + if ( ( info->tSurf.surface->origin[2] - info->sSurf.surface->origin[2] ) > STEPSIZE ) { + // if we're ducked we can't jump so it is unreachable + if ( ps.pm_flags & PMF_DUCKED ) { + return qfalse; + } + pm.cmd.upmove = 127; + *flags |= NF_JUMP; + } + + // junk we need to fill in so PMove behaves correctly + for( n = 0; n < MAX_STATS; n++ ) { + ps.stats[n] = 0; + } + ps.stats[STAT_HEALTH] = 100; + for( n = 0; n < PW_NUM_POWERUPS; n++ ) { + ps.powerups[n] = 0; + } + + for ( n = 0; n < MAX_PMOVES; n++ ) { + + Pmove( &pm ); + info->rStats.pmoveCount++; + + if( VectorCompare( ps.origin, lastOrigin ) != 0 ) { + info->rStats.reject1++; + return qfalse; + } + VectorCopy( ps.origin, lastOrigin ); + + if ( ps.groundEntityNum == -1 ) { + continue; + } + + currentSurface = SurfaceNumberAtPoint( ps.origin ); + + // FIXME - this happens at the spot under a door + if ( currentSurface == -1 ) { + continue; + } + + if ( pm.pmoveEvent == EV_FALL_FAR ) { + *flags |= NF_FALL2; + } + else if ( pm.pmoveEvent == EV_FALL_MEDIUM ) { + *flags |= NF_FALL1; + } + + if ( PointIsOnSurfaceNumber( ps.origin, info->tSurf.number ) ) { + info->rStats.accept++; + return qtrue; + } + + if ( !PointIsOnSurfaceNumber( ps.origin, info->sSurf.number ) ) { + info->rStats.reject2++; + return qfalse; + } + } + + info->rStats.reject3++; + return qfalse; +} + + +static int FindDestination_Push( surfaceThreadInfo_t *info, gentity_t *pushEnt, int *flags ) { + return -1; +#if 0 + vec3_t dir; + pmove_t pm; + playerState_t ps; + int n; + int currentSurface; + qboolean leftGround; + vec3_t pushVel; + vec3_t absmin; + vec3_t absmax; + int numEnts; + gentity_t *ents[MAX_GENTITIES]; + + *flags = 0; + VectorCopy( pushEnt->movedir, dir ); + VectorCopy( dir, pushVel ); + VectorNormalize( dir ); + + memset( &pm, 0, sizeof( pm ) ); + memset( &ps, 0, sizeof( ps ) ); + pm.ps = &ps; + pm.cmd.msec = PMOVE_MSEC; + pm.cmd.buttons = 0; + pm.cmd.weapon = 0; + pm.cmd.angles[0] = 0; + pm.cmd.angles[1] = 0; + pm.cmd.angles[2] = 0; + pm.cmd.forwardmove = 0; + pm.cmd.rightmove = 0; + pm.cmd.upmove = 0; + pm.tracemask = MASK_DEADSOLID; + pm.noFootsteps = qtrue; + pm.trace = ReachTrace; + pm.pointcontents = gi.pointcontents; + + ps.pm_type = PM_NORMAL; + ps.gravity = g_gravity->value; + ps.speed = PLAYER_SPEED; + VectorCopy( info->sSurf.surface->origin, ps.origin ); + VectorCopy( pushVel, ps.velocity ); + ps.delta_angles[0] = 0; + ps.delta_angles[1] = ANGLE2SHORT ( vectoyaw ( dir ) ); + ps.delta_angles[2] = 0; + ps.groundEntityNum = 0; + ps.playernum = 1; + + // junk we need to fill in so PMove behaves correctly + for( n = 0; n < MAX_STATS; n++ ) { + ps.stats[n] = 0; + } + ps.stats[STAT_HEALTH] = 100; + for( n = 0; n < PW_NUM_POWERUPS; n++ ) { + ps.powerups[n] = 0; + } + + leftGround = qfalse; + for ( n = 0; n < MAX_PMOVES; n++ ) { + VectorAdd( ps.origin, mins, absmin ); + VectorAdd( ps.origin, standMaxs, absmax ); + numEnts = gi.EntitiesInBox( absmin, absmax, ents, MAX_GENTITIES ); + for ( n = 0; n < numEnts; n++ ) { + if ( ents[n] == pushEnt ) { + VectorCopy( pushVel, ps.velocity ); + } + } + + Pmove( &pm ); + if ( ps.groundEntityNum == -1 ) { + leftGround = qtrue; + continue; + } + + currentSurface = SurfaceNumberAtPoint( ps.origin ); + + if ( currentSurface == info->sSurf.number && !leftGround ) { + continue; + } + + if ( pm.pmoveEvent == EV_FALL_FAR ) { + *flags |= NF_FALL2; + } + else if ( pm.pmoveEvent == EV_FALL_MEDIUM ) { + *flags |= NF_FALL1; + } + + info->tSurf.cost = n * PMOVE_MSEC; + + return currentSurface; + } + + return -1; +#endif +} + + +// TeleportPlayer( activator, dest->s.origin, dest->s.angles ); +// AngleVectors( angles, player->client->ps.velocity, NULL, NULL ); +// VectorScale( player->client->ps.velocity, 400, player->client->ps.velocity ); + +static int FindDestination_Teleport( surfaceThreadInfo_t *info, gentity_t *destEnt, int *flags ) { + pmove_t pm; + playerState_t ps; + int n; + int currentSurface; + vec3_t lastOrigin; + vec3_t angles; + + *flags = 0; + + VectorCopy( destEnt->s.origin, lastOrigin ); + lastOrigin[2] += 1; + + AngleVectors( destEnt->s.angles, angles, NULL, NULL ); + + memset( &pm, 0, sizeof( pm ) ); + memset( &ps, 0, sizeof( ps ) ); + pm.ps = &ps; + pm.cmd.msec = PMOVE_MSEC; + pm.cmd.buttons = 0; + pm.cmd.weapon = 0; + pm.cmd.angles[0] = 0; + pm.cmd.angles[1] = 0; + pm.cmd.angles[2] = 0; + pm.cmd.forwardmove = 0; + pm.cmd.rightmove = 0; + pm.cmd.upmove = 0; + pm.tracemask = MASK_DEADSOLID; + pm.noFootsteps = qtrue; + pm.trace = ReachTrace; + pm.pointcontents = gi.pointcontents; + + ps.pm_type = PM_NORMAL; + ps.gravity = sv_gravity->value; + ps.speed = PLAYER_SPEED; + VectorCopy( lastOrigin, ps.origin ); + VectorScale( angles, 400, ps.velocity ); + ps.delta_angles[0] = 0; + ps.delta_angles[1] = ANGLE2SHORT ( angles[YAW] ); + ps.delta_angles[2] = 0; + ps.groundEntityNum = 0; + ps.clientNum = 0; + + // junk we need to fill in so PMove behaves correctly + for( n = 0; n < MAX_STATS; n++ ) { + ps.stats[n] = 0; + } + ps.stats[STAT_HEALTH] = 100; + for( n = 0; n < PW_NUM_POWERUPS; n++ ) { + ps.powerups[n] = 0; + } + + n = 0; + while ( 1 ) { + n++; + Pmove( &pm ); + info->rStats.pmoveCount++; + + if( VectorCompare( ps.origin, lastOrigin ) != 0 ) { + break; + } + VectorCopy( ps.origin, lastOrigin ); + + if ( ps.groundEntityNum == -1 ) { + continue; + } + + currentSurface = SurfaceNumberAtPoint( ps.origin ); + + if ( pm.pmoveEvent == EV_FALL_FAR ) { + *flags |= NF_FALL2; + } + else if ( pm.pmoveEvent == EV_FALL_MEDIUM ) { + *flags |= NF_FALL1; + } + + info->tSurf.cost = n * PMOVE_MSEC; + + return currentSurface; + } + + return -1; +} + + +static vec3_t testDir[] = { {0, 1, 0}, {-1, 0, 0}, {0, -1, 0}, {1, 0, 0}, {-0.5, 0.5, 0}, {0.5, 0.5, 0}, {-0.5, -0.5, 0}, {0.5, -0.5, 0} }; + +static void EdgeOpen( surfaceThreadInfo_t *info, vec3_t spot, int flags ) { + info->tSurf.edgeActive = qtrue; + info->tSurf.edgeStart[0] = spot[0]; + info->tSurf.edgeStart[1] = spot[1]; + info->tSurf.edgeEnd[0] = spot[0]; + info->tSurf.edgeEnd[1] = spot[1]; + info->tSurf.edgeFlags = flags; +} + +static void EdgeClose( surfaceThreadInfo_t *info ) { + nneighbor_t *n; + vec3_t vec; + float d; + + n = &info->sSurf.neighbor[info->sSurf.neighborCount]; + + n->surfaceNum = info->tSurf.number; + if ( info->tSurf.edgeStart[0] <= info->tSurf.edgeEnd[0] ) { + n->absmin[0] = info->tSurf.edgeStart[0]; + n->absmax[0] = info->tSurf.edgeEnd[0]; + } + else { + n->absmin[0] = info->tSurf.edgeEnd[0]; + n->absmax[0] = info->tSurf.edgeStart[0]; + } + if ( info->tSurf.edgeStart[1] <= info->tSurf.edgeEnd[1] ) { + n->absmin[1] = info->tSurf.edgeStart[1]; + n->absmax[1] = info->tSurf.edgeEnd[1]; + } + else { + n->absmin[1] = info->tSurf.edgeEnd[1]; + n->absmax[1] = info->tSurf.edgeStart[1]; + } + + n->origin[0] = (n->absmin[0] + n->absmax[0]) * 0.5; + n->origin[1] = (n->absmin[1] + n->absmax[1]) * 0.5; + n->origin[2] = info->sSurf.surface->origin[2]; + + n->flags = info->tSurf.edgeFlags; + + // calc path cost + + if ( info->tSurf.cost ) { + n->cost = info->tSurf.cost; + } + else { + // take dist from source origin to point + VectorSubtract( info->sSurf.surface->origin, n->origin, vec ); + d = VectorLength( vec ); + + // add any movement weights + if ( ( info->sSurf.surface->flags & (SF_WATERLEVEL1 | SF_WATERLEVEL2 ) ) == (SF_WATERLEVEL1 | SF_WATERLEVEL2 ) ) { + d /= SWIMSCALE; + } + else if ( info->sSurf.surface->flags & SF_DUCK ) { + d /= DUCKSCALE; + } + else if ( info->sSurf.surface->flags & (SF_WATERLEVEL1 | SF_WATERLEVEL2 ) ) { + d /= WADESCALE; + } + + // save that as first segment distance + n->cost = d; + + // take dist from point to target origin + VectorSubtract( info->tSurf.surface->origin, n->origin, vec ); + d = VectorLength( vec ); + + // add any movement weights + if ( ( info->tSurf.surface->flags & (SF_WATERLEVEL1 | SF_WATERLEVEL2 ) ) == (SF_WATERLEVEL1 | SF_WATERLEVEL2 ) ) { + d /= SWIMSCALE; + } + else if ( info->tSurf.surface->flags & SF_DUCK ) { + d /= DUCKSCALE; + } + else if ( info->tSurf.surface->flags & (SF_WATERLEVEL1 | SF_WATERLEVEL2 ) ) { + d /= WADESCALE; + } + + // add that to first distance + n->cost += d; + + // convert distance to time + n->cost = ( n->cost / (float)PLAYER_SPEED ) * 1000.0; + + // possibly add a jump cost + if ( n->flags & NF_JUMP ) { + n->cost += 250.0; //FIXME what is a good value to use here? track actual time used for transitional pmoves! + } + } + + if ( info->tSurf.surface->flags & SF_DUCK ) { + n->flags |= NF_DUCK; + } + +// gi.Printf( "s%i to s%i: edge %f,%f to %f,%f f=%i\n", info->sSurf.number, info->tSurf.number, edgeStart[0], edgeStart[1], edgeEnd[0], edgeEnd[1], *edgeFlags ); +// gi.Printf( "s%i to s%i\n", info->sSurf.number, info->tSurf.number ); + info->tSurf.edgeActive = qfalse; + + info->sSurf.neighborCount++; + if ( info->sSurf.neighborCount == MAX_NEIGHBORS_PER_SURFACE ) { + gi.Printf( "MAX_NEIGHBORS_PER_SURFACE exceeded\n" ); + } +} + +static void EdgeUpdate( surfaceThreadInfo_t *info, qboolean reachable, vec3_t spot, int flags ) { +// gi.Printf( "s1=%i s2=%i spot=%s result=%i f=%i\n", info->sSurf.number, info->tSurf.number, vtos( spot ), reachable, flags ); + if ( reachable ) { + if ( info->tSurf.edgeActive ) { + if ( flags == info->tSurf.edgeFlags ) { + // continue edge + info->tSurf.edgeEnd[0] = spot[0]; + info->tSurf.edgeEnd[1] = spot[1]; + } + else { + EdgeClose( info ); + EdgeOpen( info, spot, flags ); + } + } + else { + EdgeOpen( info, spot, flags ); + } + } + else { + if ( info->tSurf.edgeActive ) { + EdgeClose( info ); + } + } +} + + +static void TestReachSurface( surfaceThreadInfo_t *info ) { + int edgeCode; + float xStart, xEnd; + float yStart, yEnd; + float x, y, z; + vec3_t spot; + int flags; + qboolean reachable; + + // determine which edges of s1 are facing s2 + edgeCode = 0; + + if ( info->tSurf.surface->absmin[1] > info->sSurf.surface->absmax[1] ) { + edgeCode |= 1; + } + if ( info->tSurf.surface->absmax[0] < info->sSurf.surface->absmin[0] ) { + edgeCode |= 2; + } + if ( info->tSurf.surface->absmin[0] > info->sSurf.surface->absmax[0] ) { + edgeCode |= 4; + } + if ( info->tSurf.surface->absmax[1] < info->sSurf.surface->absmin[1] ) { + edgeCode |= 8; + } + + if ( info->tSurf.surface->absmax[1] > info->sSurf.surface->absmax[1] && info->tSurf.surface->absmin[0] <= info->sSurf.surface->absmax[0] && info->tSurf.surface->absmax[0] >= info->sSurf.surface->absmin[0] ) { + edgeCode |= 1; + } + if ( info->tSurf.surface->absmin[0] < info->sSurf.surface->absmin[0] && info->tSurf.surface->absmin[1] <= info->sSurf.surface->absmax[1] && info->tSurf.surface->absmax[1] >= info->sSurf.surface->absmin[1] ) { + edgeCode |= 2; + } + if ( info->tSurf.surface->absmax[0] > info->sSurf.surface->absmax[0] && info->tSurf.surface->absmin[1] <= info->sSurf.surface->absmax[1] && info->tSurf.surface->absmax[1] >= info->sSurf.surface->absmin[1] ) { + edgeCode |= 4; + } + if ( info->tSurf.surface->absmin[1] < info->sSurf.surface->absmin[1] && info->tSurf.surface->absmin[0] <= info->sSurf.surface->absmax[0] && info->tSurf.surface->absmax[0] >= info->sSurf.surface->absmin[0] ) { + edgeCode |= 8; + } + + if ( edgeCode == 0 ) { + gi.Printf( "bad edgeCode\n" ); + return; + } + + // get coordinates for corners + xStart = info->sSurf.surface->absmin[0]; + xEnd = info->sSurf.surface->absmax[0]; + yStart = info->sSurf.surface->absmin[1]; + yEnd = info->sSurf.surface->absmax[1]; + z = info->sSurf.surface->origin[2]; + + // run through the spots on the relevant edges + // for each spot, see if the target surface is reachable from there + info->tSurf.edgeActive = qfalse; + + if ( edgeCode & 1 ) { + for ( x = xStart; x <= xEnd; x += XY_STEP ) { + VectorSet( spot, x, yEnd, z ); + reachable = CanReach( info, spot, testDir[0], &flags ); + EdgeUpdate( info, reachable, spot, flags ); + } + } + if ( info->tSurf.edgeActive ) { + EdgeClose( info ); + } + + if ( edgeCode & 2 ) { + for ( y = yStart; y <= yEnd; y += XY_STEP ) { + VectorSet( spot, xStart, y, z ); + reachable = CanReach( info, spot, testDir[1], &flags ); + EdgeUpdate( info, reachable, spot, flags ); + } + } + if ( info->tSurf.edgeActive ) { + EdgeClose( info ); + } + + if ( edgeCode & 4 ) { + for ( y = yStart; y <= yEnd; y += XY_STEP ) { + VectorSet( spot, xEnd, y, z ); + reachable = CanReach( info, spot, testDir[3], &flags ); + EdgeUpdate( info, reachable, spot, flags ); + } + } + if ( info->tSurf.edgeActive ) { + EdgeClose( info ); + } + + if ( edgeCode & 8 ) { + for ( x = xStart; x <= xEnd; x += XY_STEP ) { + VectorSet( spot, x, yStart, z ); + reachable = CanReach( info, spot, testDir[2], &flags ); + EdgeUpdate( info, reachable, spot, flags ); + } + } + if ( info->tSurf.edgeActive ) { + EdgeClose( info ); + } + + // special checks for corners + if ( ( edgeCode & 3 ) == 3 ) { + VectorSet( spot, xStart, yEnd, z ); + reachable = CanReach( info, spot, testDir[4], &flags ); + EdgeUpdate( info, reachable, spot, flags ); + } + if ( info->tSurf.edgeActive ) { + EdgeClose( info ); + } + + if ( ( edgeCode & 5 ) == 5 ) { + VectorSet( spot, xEnd, yEnd, z ); + reachable = CanReach( info, spot, testDir[5], &flags ); + EdgeUpdate( info, reachable, spot, flags ); + } + if ( info->tSurf.edgeActive ) { + EdgeClose( info ); + } + + if ( ( edgeCode & 10 ) == 10 ) { + VectorSet( spot, xStart, yStart, z ); + reachable = CanReach( info, spot, testDir[6], &flags ); + EdgeUpdate( info, reachable, spot, flags ); + } + if ( info->tSurf.edgeActive ) { + EdgeClose( info ); + } + + if ( ( edgeCode & 12 ) == 12 ) { + VectorSet( spot, xEnd, yStart, z ); + reachable = CanReach( info, spot, testDir[7], &flags ); + EdgeUpdate( info, reachable, spot, flags ); + } + if ( info->tSurf.edgeActive ) { + EdgeClose( info ); + } +} + + +static void TestReachSurface_Push( surfaceThreadInfo_t *info, gentity_t *pushEnt ) { + int flags; + int destSurf; + + //Q3MAP we will need to calculate movedir the same way the game dll does + + destSurf = FindDestination_Push( info, pushEnt, &flags ); + if ( destSurf == -1 ) { + gi.Printf( "pusher at %s never hit ground?\n", vtos( info->sSurf.surface->origin ) ); + } + else if ( destSurf != info->sSurf.number ) { + info->tSurf.number = destSurf; + info->tSurf.surface = &surface[destSurf]; + info->tSurf.edgeActive = qfalse; + EdgeUpdate( info, qtrue, info->sSurf.surface->origin, flags ); + EdgeClose( info ); + gi.Printf( "pusher at %s ", vtos( info->sSurf.surface->origin ) ); + gi.Printf( "hits surface at %s ", vtos( info->tSurf.surface->origin ) ); + gi.Printf( "(%i,%i)-(%i,%i)\n", (int)info->tSurf.surface->absmin[0], (int)info->tSurf.surface->absmin[1], (int)info->tSurf.surface->absmax[0], (int)info->tSurf.surface->absmax[1] ); + } + else { + gi.Printf( WARNING "bad pusher at %s\n", vtos( info->sSurf.surface->origin ) ); + } +} + + +static void TestReachSurface_Teleport( surfaceThreadInfo_t *info, gentity_t *teleportEnt ) { + int flags; + int destSurf; + + destSurf = FindDestination_Teleport( info, teleportEnt, &flags ); + if ( destSurf != -1 ) { + info->tSurf.number = destSurf; + info->tSurf.surface = &surface[destSurf]; + info->tSurf.edgeActive = qfalse; + EdgeUpdate( info, qtrue, info->sSurf.surface->origin, flags ); + EdgeClose( info ); + } +} + + +static void CreatePlatNeighbor( surfaceThreadInfo_t *info ) { +#if 0 + nneighbor_t *n; + gentity_t *ent; + + n = &info->sSurf.neighbor[info->sSurf.neighborCount]; + ent = &g_entities[info->tSurf.surface->parm]; + + n->surfaceNum = info->tSurf.number; + + n->absmin[0] = info->sSurf.surface->absmin[0] + 8; + n->absmin[1] = info->sSurf.surface->absmin[1] + 8; + + n->absmax[0] = info->sSurf.surface->absmax[0] - 8; + n->absmax[1] = info->sSurf.surface->absmax[1] - 8; + + VectorCopy( info->sSurf.surface->origin, n->origin ); + n->flags = NF_PLAT; + n->cost = ( ( ent->pos2[2] - ent->pos1[2] ) / (float)PLAYER_SPEED ) * 1000.0; + info->sSurf.neighborCount++; +#endif +} + + +static void FindSurfaceNeighbors( int surfaceNum ) { + int n; + int oldCount; + surfaceThreadInfo_t info; + gentity_t *ent; + + memset( &info, 0, sizeof( info ) ); + info.sSurf.number = surfaceNum; + info.sSurf.surface = &surface[surfaceNum]; + info.sSurf.neighborCount = 0; + + //FIXME we must handle special surface cases here - push, teleport + // they don't need to check every other surface, where player will wind + // up is predetermined (roughly at least) + + // teleporter special case + if ( info.sSurf.surface->flags & SF_TELEPORTER ) { + ent = &g_entities[info.sSurf.surface->parm]; + TestReachSurface_Teleport( &info, ent ); + goto updateGlobals; + } + + // trigger_push special case + if ( info.sSurf.surface->flags & SF_PUSH ) { + ent = &g_entities[info.sSurf.surface->parm]; + TestReachSurface_Push( &info, ent ); + goto updateGlobals; + } +#if 0 + // Q3MAP: reverse this + // if this is a PLATHIGH surface, we need to temporarily relink the plat to the high position + if ( info.sSurf.surface->flags & SF_PLATHIGH ) { + ent = &g_entities[info.sSurf.surface->parm]; + VectorCopy( ent->pos2, ent->s.origin ); + VectorCopy( ent->pos2, ent->currentOrigin ); + gi.linkentity( ent ); + } +#endif + for ( n = 0; n < surfaceCount; n++ ) { + if ( n == info.sSurf.number ) { + info.sStats.treject1++; + continue; + } + + info.tSurf.number = n; + info.tSurf.surface = &surface[n]; + + // plat high surfaces are a special case as a target + // only the corresponding plat low should have them as a neighbor + if ( info.tSurf.surface->flags & SF_PLATHIGH ) { + if ( info.sSurf.surface->flags & SF_PLATLOW ) { + CreatePlatNeighbor( &info ); + info.sStats.accept++; + } + continue; + } + + // reject if surf is too high to be reached + if ( ( info.tSurf.surface->origin[2] - info.sSurf.surface->origin[2] ) > MAX_JUMPHEIGHT ) { + info.sStats.treject2++; + continue; + } + + // reject is surf XY range is a subset of our own (meaning it is underneath us and not directly reachable) + if ( ( info.tSurf.surface->absmin[0] >= info.sSurf.surface->absmin[0] ) && ( info.tSurf.surface->absmin[1] >= info.sSurf.surface->absmin[1] ) && + ( info.tSurf.surface->absmax[0] <= info.sSurf.surface->absmax[0] ) && ( info.tSurf.surface->absmax[1] <= info.sSurf.surface->absmax[1] ) ) { + info.sStats.treject3++; + continue; + } + + // reject if surf origin is not in PVS + if ( !gi.inPVSIgnorePortals( info.tSurf.surface->origin, info.sSurf.surface->origin ) ) { + info.sStats.treject4++; + continue; + } + + // see if it's a neighbor + info.sStats.count++; + oldCount = info.sSurf.neighborCount; + TestReachSurface( &info ); + if ( info.sSurf.neighborCount != oldCount ) { + info.sStats.accept++; + } + else { + info.sStats.reject++; + } + } + +#if 0 + // Q3MAP: reverse this + // if this is a PLATHIGH surface, we need to restore the plat to the low position + if ( info.sSurf.surface->flags & SF_PLATHIGH ) { + ent = &g_entities[info.sSurf.surface->parm]; + VectorCopy( ent->pos1, ent->s.origin ); + VectorCopy( ent->pos1, ent->currentOrigin ); + gi.linkentity( ent ); + } +#endif + if ( neighborCount + info.sSurf.neighborCount > MAX_NEIGHBORS ) { + gi.Printf( "MAX_NEIGHBORS exceeded\n" ); + return; + } + +updateGlobals: + // grab the critical section lock to do global variable updates + ThreadLock(); + + // reserve the block of neighbors we need + surface[info.sSurf.number].neighborIndex = neighborCount; + neighborCount += info.sSurf.neighborCount; + + // update global stats + surfStats.count += info.sStats.count; + surfStats.accept += info.sStats.accept; + surfStats.reject += info.sStats.reject; + surfStats.treject1 += info.sStats.treject1; + surfStats.treject2 += info.sStats.treject2; + surfStats.treject3 += info.sStats.treject3; + surfStats.treject4 += info.sStats.treject4; + if ( info.sSurf.neighborCount == 0 ) { + surfStats.zeroNeighbors++; + } + + reachStats.count += info.rStats.count; + reachStats.accept += info.rStats.accept; + reachStats.reject1 += info.rStats.reject1; + reachStats.reject2 += info.rStats.reject2; + reachStats.reject3 += info.rStats.reject3; + reachStats.pmoveCount += info.rStats.pmoveCount; + + // release the lock + ThreadUnlock(); + + // now we can fill in the block of neighbors from our cache + surface[info.sSurf.number].neighborCount = info.sSurf.neighborCount; + if ( info.sSurf.neighborCount ) { + memcpy( &neighbor[surface[info.sSurf.number].neighborIndex], info.sSurf.neighbor, info.sSurf.neighborCount * sizeof( info.sSurf.neighbor[0] ) ); + } + +} + + +static void FindNeighbors( void ) { + int n; + + neighbor = ( nneighbor_t * )gi.TagMalloc ( MAX_NEIGHBORS * sizeof(neighbor[0]), TAG_GAME ); + neighborCount = 0; + + memset( &reachStats, 0, sizeof( reachStats ) ); + memset( &surfStats, 0, sizeof( surfStats ) ); + +// RunThreadsOn( spotIndexCount, qtrue, FindSurfaceNeighbors ); +//#if 0 + for ( n = 0; n < surfaceCount; n++ ) { + gi.DebugPrintf( "FindSurfaceNeighbors %d/%d\n", n, surfaceCount ); + FindSurfaceNeighbors( n ); + } +//#endif + + gi.Printf( " %i neighbors (avg %.2f per surf)\n", neighborCount, (float)neighborCount/(float)surfaceCount ); + gi.Printf( " %i surfaces with 0 neighbors\n", surfStats.zeroNeighbors ); + + gi.Printf( " surface to surface testing stats:\n" ); + gi.Printf( " %i combinations\n", surfaceCount * surfaceCount ); + gi.Printf( " %i trivial rejects (%i %i %i %i)\n", surfStats.treject1 + surfStats.treject2 + surfStats.treject3 + surfStats.treject4, surfStats.treject1, surfStats.treject2, surfStats.treject3, surfStats.treject4 ); + gi.Printf( " %i full tests (%.2f avg per surf)\n", surfStats.count, (float)surfStats.count / (float)surfaceCount ); + gi.Printf( " %i accepted, %i rejected\n", surfStats.accept, surfStats.reject ); + + gi.Printf( " spot to surface testing stats:\n" ); + gi.Printf( " %i tests (%.2f avg per surf)\n", reachStats.count, (float)reachStats.count / (float)surfaceCount ); + gi.Printf( " %i accepted, %i rejected (%i %i %i)\n", reachStats.accept, reachStats.reject1 + reachStats.reject2 + reachStats.reject3, reachStats.reject1, reachStats.reject2, reachStats.reject3 ); + gi.Printf( " %.2f avg pmoves per test\n", (float)reachStats.pmoveCount / (float)reachStats.count ); +} + + +// +// InflateSurfaces +// + +static void InflateSurfaces( void ) { + int n; + + // inflate surfaces by 16 along both axis + // also drop the Z value by mins + for ( n = 0; n < surfaceCount; n++ ) { + surface[n].absmin[0] -= 0; + surface[n].absmin[1] -= 0; + surface[n].absmax[0] += 0; + surface[n].absmax[1] += 0; + surface[n].origin[2] = floor( surface[n].origin[2] + mins[2] ); + } + + // inflate neighbor edges by 16 along the fixed axis + for ( n = 0; n < neighborCount; n++ ) { + if ( neighbor[n].absmin[0] == neighbor[n].absmax[0] ) { + neighbor[n].absmin[0] -= 0; + neighbor[n].absmax[0] += 0; + } + if ( neighbor[n].absmin[1] == neighbor[n].absmax[1] ) { + neighbor[n].absmin[1] -= 0; + neighbor[n].absmax[1] += 0; + } + neighbor[n].origin[2] = floor( neighbor[n].origin[2] + mins[2] ); + } +} + + +// +// CalculateAllRoutes +// + +typedef enum { + nodestate_estimate, + nodestate_final +} nodeState_t; + +typedef struct { + float cost; + nodeState_t state; + int predecessor; +} nodeInfo_t; + +static nodeInfo_t *nodeInfo; + + +static int NeighborIndex( int sourceSurfNum, int destSurfNum ) { + int base; + int n; + + if ( destSurfNum == -1 ) { + return -1; + } + base = surface[sourceSurfNum].neighborIndex; + for ( n = 0; n < surface[sourceSurfNum].neighborCount; n++ ) { + if ( neighbor[base+n].surfaceNum == destSurfNum ) { + return n; + } + } + return -1; +} + + +static nneighbor_t *PathEdge( int sourceSurfNum, int destSurfNum ) { + int base; + int n; + + base = surface[sourceSurfNum].neighborIndex; + for ( n = 0; n < surface[sourceSurfNum].neighborCount; n++ ) { + if ( neighbor[base+n].surfaceNum == destSurfNum ) { + return &neighbor[base+n]; + } + } + return NULL; +} + + +/* +============= +SurfaceDistance + +Returns the cost of moving from sourceSurfNum to targetSurfNum, 0 if there +is no direct path. +============= +*/ + +static float SurfaceDistance( int sourceSurfNum, int destSurfNum ) { + nneighbor_t *n; + + n = PathEdge( sourceSurfNum, destSurfNum ); + if ( n ) { + return n->cost; + } + return 0; +} + + +/* +============= +CalculateRoutes + +Takes the surfaces and neighbors tablea and uses Dijkstra's algorithm to +determine the shortest route from one surface to another. +============= +*/ + +static void CalculateRoutes( int rootSurfaceNum ) { + int n; + int currentNode; + int testNode; + float bestCost; + int bestNode; + float d; + + // initialize the node info + for ( n = 0; n < surfaceCount; n++ ) { + nodeInfo[n].cost = INFINITE; + nodeInfo[n].state = nodestate_estimate; + nodeInfo[n].predecessor = -1; + } + + // prime thing to get the loop started + currentNode = rootSurfaceNum; + nodeInfo[rootSurfaceNum].cost= 0; + + // calculate the shortest path info + // we loop surfaceCount times; a new final node is determined each iteration + n = 0; + while ( currentNode != -1 ) { + + bestCost = INFINITE; + bestNode = -1; + + // test each node + for ( testNode = 0; testNode < surfaceCount; testNode++ ) { + // do not test it against itself + if ( testNode == currentNode ) { + continue; + } + + // leave final nodes alone + if ( nodeInfo[testNode].state == nodestate_final ) { + continue; + } + + if ( surface[testNode].neighborCount == 0 ) { + continue; + } + + // update adjacent nodes + d = SurfaceDistance( currentNode, testNode ); + if ( d != 0 ) { + // see if we can improve the current estimate at the test node + if ( nodeInfo[currentNode].cost + d < nodeInfo[testNode].cost ) + { + nodeInfo[testNode].predecessor = currentNode; + nodeInfo[testNode].cost = nodeInfo[currentNode].cost + d; + } + } + + // see if this is our new best estimate + if ( nodeInfo[testNode].cost < bestCost ) { + bestCost = nodeInfo[testNode].cost; + bestNode = testNode; + } + } + + // mark current node as final and best node as new current node + nodeInfo[currentNode].state = nodestate_final; + currentNode = bestNode; + n++; + } + + // now fill in the route info + for ( n = 0; n < surfaceCount; n++ ) { + if ( n == rootSurfaceNum ) { + route[rootSurfaceNum * surfaceCount + n] = 255; + continue; + } + testNode = n; + while ( ( testNode != -1 ) && ( nodeInfo[testNode].predecessor != rootSurfaceNum ) ) { + testNode = nodeInfo[testNode].predecessor; + } + if ( testNode == -1 ) { + route[rootSurfaceNum * surfaceCount + n] = 255; + continue; + } + route[rootSurfaceNum * surfaceCount + n] = NeighborIndex( rootSurfaceNum, testNode ); + } +} + + +static void CalculateAllRoutes( void ) { + int n; + + route = ( byte * )gi.TagMalloc ( surfaceCount * surfaceCount * sizeof( byte ), TAG_GAME ); + nodeInfo = ( nodeInfo_t * )gi.TagMalloc ( surfaceCount * sizeof( nodeInfo[0] ), TAG_GAME ); + + for ( n = 0; n < surfaceCount; n++ ) { + CalculateRoutes( n ); + } + + gi.TagFree( nodeInfo ); +} + + + +// +// WriteNavigationData +// + +static void WriteNavigationData( void ) { + FILE *f; + int n; + navheader_t outHeader; + nsurface_t outSurface; + nneighbor_t outNeighbor; + str filename; + str osFilename; + + Swap_Init(); + + filename = str( "maps/" ) + level.mapname.c_str() + ".nav"; + gi.Printf( "Writing %s.\n", filename.c_str() ); + osFilename = gi.FS_PrepFileWrite( filename.c_str() ); + f = fopen( osFilename.c_str(), "wb" ); + if ( !f ) + { + gi.Printf( "Open failed.\n" ); + return; + } + + // write version header + outHeader.id = LittleLong( NAVFILE_ID ); + outHeader.version = LittleLong( NAVFILE_VERSION ); + outHeader.surfaceCount = LittleLong( surfaceCount ); + outHeader.neighborCount = LittleLong( neighborCount ); + fwrite( &outHeader, sizeof( outHeader ), 1, f ); + + // write surfaces + for ( n = 0; n < surfaceCount; n++ ) { + outSurface.origin[0] = LittleFloat( surface[n].origin[0] ); + outSurface.origin[1] = LittleFloat( surface[n].origin[1] ); + outSurface.origin[2] = LittleFloat( surface[n].origin[2] ); + + outSurface.absmin[0] = LittleFloat( surface[n].absmin[0] ); + outSurface.absmin[1] = LittleFloat( surface[n].absmin[1] ); + + outSurface.absmax[0] = LittleFloat( surface[n].absmax[0] ); + outSurface.absmax[1] = LittleFloat( surface[n].absmax[1] ); + + outSurface.flags = LittleLong( surface[n].flags ); + outSurface.neighborCount = LittleLong( surface[n].neighborCount ); + outSurface.neighborIndex = LittleLong( surface[n].neighborIndex ); + outSurface.parm = LittleLong( surface[n].parm ); + + fwrite( &outSurface, sizeof( outSurface ), 1, f ); + + gi.Printf( "surface%02i f=%04x n=%i@%i z=%i ", n, surface[n].flags, surface[n].neighborCount, surface[n].neighborIndex, (int)surface[n].origin[2] ); + gi.Printf( "(%i,%i)-(%i,%i)\n", (int)surface[n].absmin[0], (int)surface[n].absmin[1], (int)surface[n].absmax[0], (int)surface[n].absmax[1] ); + } + + // write neighbors + for ( n = 0; n < neighborCount; n++ ) { + outNeighbor.origin[0] = LittleFloat( neighbor[n].origin[0] ); + outNeighbor.origin[1] = LittleFloat( neighbor[n].origin[1] ); + outNeighbor.origin[2] = LittleFloat( neighbor[n].origin[2] ); + + outNeighbor.absmin[0] = LittleFloat( neighbor[n].absmin[0] ); + outNeighbor.absmin[1] = LittleFloat( neighbor[n].absmin[1] ); + + outNeighbor.absmax[0] = LittleFloat( neighbor[n].absmax[0] ); + outNeighbor.absmax[1] = LittleFloat( neighbor[n].absmax[1] ); + + outNeighbor.surfaceNum = LittleLong( neighbor[n].surfaceNum ); + outNeighbor.flags = LittleLong( neighbor[n].flags ); + outNeighbor.cost = LittleLong( neighbor[n].cost ); + outNeighbor.filler = LittleLong( neighbor[n].filler ); + + fwrite( &outNeighbor, sizeof( outNeighbor ), 1, f ); + + gi.Printf( "neighbor%03i f=%04x surface=%02i cost=%f\n", n, neighbor[n].flags, neighbor[n].surfaceNum, neighbor[n].cost ); + } + + // write routes + fwrite( route, surfaceCount * surfaceCount * sizeof( byte ), 1, f ); + + fclose( f ); +} + + +// +// Nav_Gen_f +// + +void Nav_Gen_f( void ) { + int start; + int elapsed; + int i; + gentity_t *ent; + + for( i = 0; i < globals.num_entities; i++ ) + { + ent = &g_entities[i]; + if ( ent->entity && ent->entity->isSubclassOf( Mover ) ) + { + ent->entity->unlink(); + } + } + + // FindSpots + gi.Printf( "FindSpots\n" ); + start = gi.Milliseconds(); + FindSpots(); + elapsed = gi.Milliseconds() - start; + gi.Printf( " %.2f seconds elapsed\n", (float)elapsed / 1000.0 ); + + // FindSurfaces + gi.Printf( "FindSurfaces\n" ); + start = gi.Milliseconds(); + //FindSurfaces(); + FindConvexSurfaces(); + elapsed = gi.Milliseconds() - start; + gi.Printf( " %.2f seconds elapsed\n", (float)elapsed / 1000.0 ); + + // FindNeighbors + gi.Printf( "FindNeighbors\n" ); + start = gi.Milliseconds(); + FindNeighbors(); + elapsed = gi.Milliseconds() - start; + gi.Printf( " %.2f seconds elapsed\n", (float)elapsed / 1000.0 ); + + // InflateSurfaces + gi.Printf( "InflateSurfaces\n" ); + start = gi.Milliseconds(); + InflateSurfaces(); + elapsed = gi.Milliseconds() - start; + gi.Printf( " %.2f seconds elapsed\n", (float)elapsed / 1000.0 ); + + // CalculateAllRoutes + gi.Printf( "CalculateAllRoutes\n" ); + start = gi.Milliseconds(); + CalculateAllRoutes(); + elapsed = gi.Milliseconds() - start; + gi.Printf( " %.2f seconds elapsed\n", (float)elapsed / 1000.0 ); + + // WriteNavigationData + start = gi.Milliseconds(); + WriteNavigationData(); + elapsed = gi.Milliseconds() - start; + gi.Printf( " %.2f seconds elapsed\n", (float)elapsed / 1000.0 ); + + gi.TagFree( route ); + gi.TagFree( neighbor ); + gi.TagFree( surface ); + + for( i = 0; i < globals.num_entities; i++ ) + { + ent = &g_entities[i]; + if ( ent->entity && ent->entity->isSubclassOf( Mover ) ) + { + ent->entity->link(); + } + } +} diff --git a/source/source/fgame/beam.cpp b/source/source/fgame/beam.cpp new file mode 100644 index 0000000..f70cb08 --- /dev/null +++ b/source/source/fgame/beam.cpp @@ -0,0 +1,924 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/beam.cpp $ +// $Revision:: 39 $ +// $Author:: Markd $ +// $Date:: 6/23/00 8:41p $ +// +// Copyright (C) 1999 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/beam.cpp $ +// +// 39 6/23/00 8:41p Markd +// made a lot of changes to different constructors for saved game support +// +// 38 6/23/00 11:49a Markd +// fixed various imagindexes and saved games +// +// 37 5/30/00 2:47p Aldie +// Fix for beam parent +// +// 36 5/30/00 10:59a Aldie +// Added Circle of Protection Powerup +// +// 35 5/24/00 6:05p Markd +// Fixed bug where MAX_MAP_BOUNDS was being used instead of MAP_SIZE +// +// 34 5/01/00 4:19p Steven +// Added some caching stuff to beams. +// +// 33 3/30/00 6:23p Steven +// Fixed life not getting set properly. +// +// 32 3/28/00 5:00p Aldie +// Fix beam parameter +// +// 31 3/28/00 4:25p Aldie +// Some more beam changes for Pat +// +// 30 3/28/00 3:16p Aldie +// Fixed some beam problems for Pat +// +// 29 3/14/00 3:38p Aldie +// Added persist command +// +// 28 2/14/00 7:34p Aldie +// Fixed some beam rendering issues +// +// 27 2/03/00 7:01p Jimdose +// made all hardcoded map bounds use MAX_MAP_BOUNDS +// +// 26 1/31/00 4:35p Steven +// Fixed a bug in CreateBeam. +// +// 25 1/26/00 5:07p Aldie +// Fixed beamdamage +// +// 24 1/22/00 12:42p Jimdose +// got rid of calls to vec3() +// +// 23 1/21/00 8:01p Aldie +// Fixed a warning +// +// 22 1/21/00 5:38p Aldie +// Fix more beam bugs +// +// 21 1/21/00 2:10p Aldie +// Fixed beam endpoint tracking +// +// 20 1/20/00 5:26p Aldie +// Clarified some of the spawnargs +// +// 19 1/15/00 3:57p Markd +// Eliminated multiple "angle" events and replaced them with EV_SetAngle +// +// 18 1/14/00 5:06p Markd +// Removed surface num, tri_num and damage_multiplier from multiple functions +// and events +// +// 17 1/11/00 6:41p Markd +// Removed fulltrace code from the game +// +// 16 1/07/00 8:12p Jimdose +// cleaning up unused code +// +// 15 1/05/00 7:25p Jimdose +// made angle functions all use the same coordinate system +// AngleVectors now returns left instead of right +// no longer need to invert pitch +// +// 14 11/19/99 11:29a Steven +// Added ability to specify the end point of a beam. +// +// 13 10/25/99 6:45p Aldie +// Add noise spawnflag +// +// 12 10/25/99 3:46p Aldie +// Fixed beam spawnflag +// +// 11 10/25/99 3:21p Aldie +// Fixed activate and deactivate +// +// 10 10/22/99 4:28p Aldie +// added some defaults +// +// 9 10/22/99 12:17p Aldie +// fixed defaults +// +// 8 10/21/99 6:19p Markd +// removed torso and head members from entity_state +// +// 7 10/21/99 2:51p Aldie +// Added some more beam functions +// +// 6 10/19/99 4:30p Aldie +// Added wave effect +// +// 5 10/19/99 11:57a Aldie +// Added some more beam features +// +// 4 10/18/99 4:00p Aldie +// Fix for beam endpoints +// +// 3 10/18/99 3:58p Aldie +// Fix for beam endpoints +// +// 2 10/18/99 1:59p Aldie +// Lots of fixes for beams and stuff +// +// DESCRIPTION: +// + +#include "beam.h" +#include "../qcommon/qfiles.h" + +/*****************************************************************************/ +/*QUAKED func_beam (0 0.25 .5) (-8 -8 -8) (8 8 8) START_ON PERSIST WAVE NOISE + +This creates a beam effect from the origin to the target's origin. If no +target is specified, uses angles and projects beam out from there. + +"model" Specifies the model to use as the beam +"overlap" Specifies the amount of overlap each beam link should have. Use this to fill +in the cracks when using electric on beams. (Default is 0) +"minoffset" Minimum amount of electrical variation (Default is 0) +"maxoffset" Maximum amount of electrical variation (Default is 5) +"color" Vector specifiying the red,green, and blue components. (Default is "1 1 1") +"alpha" Alpha of the beam (Default is 1.0) +"damage" Amount of damage the beam inflicts if beam hits someone (Default is 0) +"angles" Sets the angle of the beam if no target is specified. +"life" Sets the life of the beam for use with the persist spawnflag. This is how long a beam will +be displayed. +"numsegments" Number of segments in a beam (Default is 4) +"delay" Delay between beam updates. (i.e. slows the effect of the beam down) +"shader" Set the shader of the beam +"scale" Set the width of the beam + +START_ON - Starts the beam on +PERSIST - Keeps the last few beams around and fades them out over the life of the beam +WAVE - Make the beam follow a sin wave pattern +NOISE - Use a more computationally expensive random effect, but the results are smoother + +If the model field is not set, then a renderer generated beam will be created +using the color, minoffset, maxoffset, scale, and subdivisions fields + +If the targetname is set, it will use the target specified as the endpoint of the beam + +/*****************************************************************************/ + +Event EV_FuncBeam_Activate + ( + "activate", + EV_DEFAULT, + NULL, + NULL, + "Activate the beam" + ); +Event EV_FuncBeam_Deactivate + ( + "deactivate", + EV_DEFAULT, + NULL, + NULL, + "Deactivate the beam" + ); +Event EV_FuncBeam_Diameter + ( + "diameter", + EV_DEFAULT, + "f", + "diameter", + "Set the diameter of the beam" + ); +Event EV_FuncBeam_Maxoffset + ( + "maxoffset", + EV_DEFAULT, + "f", + "max_offset", + "Set the maximum offset the beam can travel above, below, forward or back of it's endpoints" + ); +Event EV_FuncBeam_Minoffset + ( + "minoffset", + EV_DEFAULT, + "f", + "min_offset", + "Set the minimun offset the beam can travel above, below, forward or back of it's endpoints" + ); +Event EV_FuncBeam_Overlap + ( + "overlap", + EV_DEFAULT, + "f", + "beam_overlap", + "Set the amount of overlap the beams have when they are being strung together" + ); +Event EV_FuncBeam_Color + ( + "color", + EV_DEFAULT, + "v[0,1][0,1][0,1]", + "beam_color", + "Set the color of the beam" + ); +Event EV_FuncBeam_SetTarget + ( + "target", + EV_DEFAULT, + "s", + "beam_target", + "Set the target of the beam. The beam will be drawn from the origin\n" + "to the origin of the target entity" + ); +Event EV_FuncBeam_SetEndPoint + ( + "endpoint", + EV_DEFAULT, + "v", + "beam_end_point", + "Set the end point of the beam. The beam will be draw from the origin to\n" + "the end point." + ); +Event EV_FuncBeam_SetLife + ( + "life", + EV_DEFAULT, + "f", + "beam_life", + "Set the amount of time the beam stays on when activated" + ); +Event EV_FuncBeam_Shader + ( + "shader", + EV_DEFAULT, + "s", + "beam_shader", + "Set the shader that the beam will use" + ); +Event EV_FuncBeam_TileShader + ( + "tileshader", + EV_DEFAULT, + "s", + "beam_shader", + "Set the shader that the beam will use. This shader will be tiled." + ); +Event EV_FuncBeam_Segments + ( + "numsegments", + EV_DEFAULT, + "i", + "numsegments", + "Set the number of segments for the beam" + ); +Event EV_FuncBeam_Delay + ( + "delay", + EV_DEFAULT, + "f", + "delay", + "Set the amount of delay on the beam updater" + ); +Event EV_FuncBeam_NumSphereBeams + ( + "numspherebeams", + EV_DEFAULT, + "i", + "num", + "Set the number of beams that will be shot out in a sphere like formation" + ); +Event EV_FuncBeam_SphereRadius + ( + "radius", + EV_DEFAULT, + "f", + "radius", + "Set the starting radius of the beams if this is a beamsphere" + ); +Event EV_FuncBeam_ToggleDelay + ( + "toggledelay", + EV_DEFAULT, + "SF", + "[random] time", + "Causes a beam toggling effect. Sets the time between toggling. If random is specified, The time will be between 0 and time" + ); +Event EV_FuncBeam_FindEndpoint + ( + "findendpoint", + EV_DEFAULT, + NULL, + NULL, + "Find the endpoint of a beam" + ); +Event EV_FuncBeam_UpdateEndpoint + ( + "updateendpoint", + EV_DEFAULT, + NULL, + NULL, + "Update the endpoint of a beam" + ); +Event EV_FuncBeam_UpdateOrigin + ( + "updateorigin", + EV_DEFAULT, + NULL, + NULL, + "Update the origin of a beam" + ); +Event EV_FuncBeam_EndAlpha + ( + "endalpha", + EV_DEFAULT, + "f", + "alpha", + "Set the endpoint alpha value of the beam" + ); +Event EV_FuncBeam_Shoot + ( + "shoot", + EV_DEFAULT, + NULL, + NULL, + "Make the beam cause damage to entities that get in the way" + ); +Event EV_FuncBeam_ShootRadius + ( + "shootradius", + EV_DEFAULT, + "f", + "radius", + "Set the radius of the damage area between beam endpoints" + ); +Event EV_FuncBeam_Persist + ( + "persist", + EV_DEFAULT, + "b", + "bool", + "Set the persist property of the beam" + ); + +CLASS_DECLARATION( ScriptSlave, FuncBeam, "func_beam" ) + { + { &EV_Activate, Activate }, + { &EV_FuncBeam_Activate, Activate }, + { &EV_FuncBeam_Deactivate, Deactivate }, + { &EV_FuncBeam_Maxoffset, SetMaxoffset }, + { &EV_FuncBeam_Minoffset, SetMinoffset }, + { &EV_FuncBeam_Overlap, SetOverlap }, + { &EV_FuncBeam_Color, SetColor }, + { &EV_FuncBeam_SetTarget, SetTarget }, + { &EV_SetAngle, SetAngle }, + { &EV_FuncBeam_Segments, SetSegments }, + { &EV_SetAngles, SetAngles }, + { &EV_FuncBeam_SetEndPoint, SetEndPoint }, + { &EV_Model, SetModel }, + { &EV_Damage, SetDamage }, + { &EV_FuncBeam_SetLife, SetLife }, + { &EV_FuncBeam_Shader, SetBeamShader }, + { &EV_FuncBeam_TileShader, SetBeamTileShader }, + { &EV_FuncBeam_Delay, SetDelay }, + { &EV_FuncBeam_NumSphereBeams, SetNumSphereBeams }, + { &EV_FuncBeam_SphereRadius, SetSphereRadius }, + { &EV_FuncBeam_ToggleDelay, SetToggleDelay }, + { &EV_FuncBeam_ShootRadius, SetShootRadius }, + { &EV_FuncBeam_EndAlpha, SetEndAlpha }, + { &EV_FuncBeam_Persist, SetPersist }, + { &EV_FuncBeam_FindEndpoint, FindEndpoint }, + { &EV_FuncBeam_UpdateEndpoint, UpdateEndpoint }, + { &EV_FuncBeam_UpdateOrigin, UpdateOrigin }, + { &EV_FuncBeam_Shoot, Shoot }, + { NULL, NULL } + }; + +FuncBeam::FuncBeam() + { + setSolidType( SOLID_NOT ); + setOrigin(); + + damage = 0; + life = 0; + shootradius = 0; + use_angles = false; + + edict->s.renderfx |= RF_BEAM; + edict->s.eType = ET_BEAM; // Entity type beam + edict->s.modelindex = 1; // must be non-zero + SetBeamShader( "beamshader" ); + + if ( !LoadingSavegame ) + { + edict->s.alpha = 1; // alpha + edict->s.surfaces[4] = 4; // num segments + + BEAM_PARM_TO_PKT( 1, edict->s.surfaces[0] ); // life + edict->s.bone_angles[0][1] = 5; // Max offset + edict->s.torso_anim = ENTITYNUM_NONE; + BEAM_PARM_TO_PKT( 1, edict->s.surfaces[9] ); // endalpha + + if ( spawnflags & 0x0001 ) // Start On + PostEvent( EV_Activate, EV_POSTSPAWN ); + else + hideModel(); + edict->s.skinNum = 0; + if ( spawnflags & 0x0002 ) + edict->s.skinNum |= BEAM_PERSIST_EFFECT; + if ( spawnflags & 0x0004 ) + edict->s.skinNum |= BEAM_WAVE_EFFECT; + if ( spawnflags & 0x0008 ) + edict->s.skinNum |= BEAM_USE_NOISE; + + // Try to find the endpoint of this beam after everything has been spawned + PostEvent( EV_FuncBeam_FindEndpoint, EV_LINKBEAMS ); + } + } + +void FuncBeam::SetEndAlpha + ( + Event *ev + ) + + { + BEAM_PARM_TO_PKT( ev->GetFloat( 1 ), edict->s.surfaces[9] ); + } + +void FuncBeam::SetToggleDelay + ( + Event *ev + ) + + { + edict->s.skinNum |= BEAM_TOGGLE; + + if ( ev->NumArgs() > 2 ) + { + str arg = ev->GetString( 1 ); + if ( !arg.icmp( "random" ) ) + { + edict->s.skinNum |= BEAM_RANDOM_TOGGLEDELAY; + } + BEAM_PARM_TO_PKT( ev->GetFloat( 2 ), edict->s.surfaces[8] ); + } + else + { + BEAM_PARM_TO_PKT( ev->GetFloat( 1 ), edict->s.surfaces[8] ); + } + } + +void FuncBeam::SetSphereRadius + ( + Event *ev + ) + + { + edict->s.skinNum |= BEAM_SPHERE_EFFECT; + BEAM_PARM_TO_PKT( ev->GetFloat( 1 ), edict->s.surfaces[7] ); + } + +void FuncBeam::SetNumSphereBeams + ( + Event *ev + ) + + { + edict->s.skinNum |= BEAM_SPHERE_EFFECT; + edict->s.surfaces[6] = ev->GetInteger( 1 ); + } + +void FuncBeam::SetAngle + ( + Event *ev + ) + + { + Vector movedir; + + movedir = G_GetMovedir( ev->GetFloat( 1 ) ); + setAngles( movedir.toAngles() ); + } + +void FuncBeam::SetAngles + ( + Event *ev + ) + + { + setAngles( ev->GetVector( 1 ) ); + } + +// Override setAngles to update the endpoint of the beam if it's rotated +void FuncBeam::setAngles + ( + Vector angles + ) + + { + trace_t trace; + Vector endpoint; + + ScriptSlave::setAngles( angles ); + + // If there is no target, then use the angles to determine where to put the + // endpoint + if ( !end ) + { + endpoint = origin + Vector( orientation[0] ) * MAP_SIZE; + + trace = G_Trace( origin, vec_zero, vec_zero, endpoint, this, MASK_SOLID, false, "FuncBeam" ); + + VectorCopy( trace.endpos, edict->s.origin2 ); + + use_angles = true; + } + } + +void FuncBeam::SetEndPoint + ( + Event *ev + ) + + { + trace_t trace; + + end_point = ev->GetVector( 1 ); + + trace = G_Trace( origin, vec_zero, vec_zero, end_point, this, MASK_SOLID, false, "FuncBeam" ); + VectorCopy( trace.endpos, edict->s.origin2 ); + + use_angles = false; + } + +void FuncBeam::SetModel + ( + Event *ev + ) + + { + setModel( ev->GetString( 1 ) ); + edict->s.renderfx &= ~RF_BEAM; + edict->s.eType = ET_BEAM; + edict->s.skinNum |= BEAM_USEMODEL; + } + +void FuncBeam::SetDamage + ( + Event *ev + ) + + { + damage = ev->GetFloat( 1 ); + } + +void FuncBeam::SetLife + ( + Event *ev + ) + + { + BEAM_PARM_TO_PKT( ev->GetFloat( 1 ), edict->s.surfaces[0] ); + } + +void FuncBeam::SetColor + ( + Event *ev + ) + + { + Vector color = ev->GetVector( 1 ); + G_SetConstantLight( &edict->s.constantLight, &color[ 0 ], &color[ 1 ], &color[ 2 ], NULL ); + } + +void FuncBeam::SetSegments + ( + Event *ev + ) + + { + edict->s.surfaces[4] = ev->GetInteger( 1 ); + } + +void FuncBeam::SetBeamShader + ( + str beam_shader + ) + + { + str temp_shader; + + shader = beam_shader; + edict->s.tag_num = gi.imageindex( shader ); + + temp_shader = shader + ".spr"; + CacheResource( temp_shader, this ); + } + +void FuncBeam::SetBeamShader + ( + Event *ev + ) + + { + SetBeamShader( ev->GetString( 1 ) ); + } + +void FuncBeam::SetBeamTileShader + ( + Event *ev + ) + + { + SetBeamShader( ev->GetString( 1 ) ); + edict->s.skinNum |= BEAM_TILESHADER; + } + +void FuncBeam::SetMaxoffset + ( + Event *ev + ) + + { + edict->s.bone_angles[0][1] = ev->GetFloat( 1 ); + } + +void FuncBeam::SetMinoffset + ( + Event *ev + ) + + { + edict->s.bone_angles[0][0] = ev->GetFloat( 1 ); + } + +void FuncBeam::SetOverlap + ( + Event *ev + ) + + { + BEAM_PARM_TO_PKT( ev->GetFloat( 1 ), edict->s.surfaces[3] ); + } + +void FuncBeam::SetDelay + ( + Event *ev + ) + + { + if ( ev->NumArgs() > 2 ) + { + str arg = ev->GetString( 1 ); + if ( !arg.icmp( "random" ) ) + { + edict->s.skinNum |= BEAM_RANDOM_DELAY; + } + BEAM_PARM_TO_PKT( ev->GetFloat( 2 ), edict->s.surfaces[5] ); + } + else + { + BEAM_PARM_TO_PKT( ev->GetFloat( 1 ), edict->s.surfaces[5] ); + } + } + +void FuncBeam::Deactivate + ( + Event *ev + ) + + { + hideModel(); + + // Cancel all of the events to activate + CancelEventsOfType( EV_FuncBeam_Activate ); + CancelEventsOfType( EV_Activate ); + CancelEventsOfType( EV_FuncBeam_UpdateEndpoint ); + CancelEventsOfType( EV_FuncBeam_UpdateOrigin ); + } + +void FuncBeam::SetShootRadius + ( + Event *ev + ) + + { + shootradius = ev->GetFloat( 1 ); + } + +void FuncBeam::SetPersist + ( + Event *ev + ) + + { + qboolean persist = ev->GetBoolean( 1 ); + + if ( persist ) + edict->s.skinNum |= BEAM_PERSIST_EFFECT; + else + edict->s.skinNum &= ~BEAM_PERSIST_EFFECT; + } + +void FuncBeam::Shoot + ( + Event *ev + ) + + { + trace_t trace; + Vector start, end; + + start = edict->s.origin; + end = edict->s.origin2; + + Vector dir( end - start ); + Vector b1( -shootradius, -shootradius, -shootradius ); + Vector b2( shootradius, shootradius, shootradius ); + + trace = G_Trace( start, b1, b2, end, this, MASK_SHOT, false, "FuncBeam::Activate" ); + + if ( trace.ent && trace.ent->entity && trace.ent->entity->takedamage ) + { + // damage the ent + trace.ent->entity->Damage( this, + this, + damage, + trace.endpos, + dir, + trace.plane.normal, + 0, + 0, + MOD_BEAM + ); + } + + PostEvent( EV_FuncBeam_Shoot, 0.1f ); + } + +void FuncBeam::Activate + ( + Event *ev + ) + + { + Vector forward; + trace_t trace; + + showModel(); + + // An entity is targeted + if ( end ) + { + VectorCopy( end->origin, edict->s.origin2 ); + // Post an event so that the beam will update itself every frame + PostEvent( EV_FuncBeam_UpdateEndpoint, FRAMETIME ); + } + else if ( use_angles ) + { + angles.AngleVectors( &forward, NULL, NULL ); + + Vector endpoint( orientation[ 0 ] ); + endpoint *= MAP_SIZE; + + trace = G_Trace( origin, vec_zero, vec_zero, endpoint, this, MASK_SOLID, false, "FuncBeam::Activate" ); + VectorCopy( trace.endpos, edict->s.origin2 ); + } + else + { + trace = G_Trace( origin, vec_zero, vec_zero, end_point, this, MASK_SOLID, false, "FuncBeam::Activate" ); + VectorCopy( trace.endpos, edict->s.origin2 ); + } + + if ( origin_target ) + { + PostEvent( EV_FuncBeam_UpdateOrigin, FRAMETIME ); + } + + if ( damage ) + { + // Shoot beam and cause damage every frame + ProcessEvent( EV_FuncBeam_Shoot ); + } + + // If life is set, then post a deactivate message + if ( life > 0 && !EventPending( EV_FuncBeam_Deactivate ) ) + { + PostEvent( EV_FuncBeam_Deactivate, life ); + return; + } + } + +void FuncBeam::UpdateEndpoint + ( + Event *ev + ) + + { + if ( end ) + { + Event *ev1 = new Event( ev ); + + VectorCopy( end->origin, edict->s.origin2 ); + PostEvent( ev1, FRAMETIME ); + } + } + +void FuncBeam::UpdateOrigin + ( + Event *ev + ) + + { + if ( origin_target ) + { + Event *ev1 = new Event( ev ); + + setOrigin( origin_target->centroid ); + PostEvent( ev1, FRAMETIME ); + } + } + +void FuncBeam::FindEndpoint + ( + Event *ev + ) + + { + if ( target && strlen( target ) ) + { + end = G_FindTarget( NULL, target ); + if ( end ) + { + VectorCopy( end->origin, edict->s.origin2 ); + } + } + } + +FuncBeam *CreateBeam + ( + const char *model, + const char *shader, + Vector start, + Vector end, + int numsegments, + float scale, + float life, + float damage, + Entity *origin_target + ) + + { + FuncBeam *beam; + trace_t trace; + + // set start point + beam = new FuncBeam; + beam->setOrigin( start ); + + if ( origin_target ) + beam->origin_target = origin_target; + + // set endpoint + beam->end_point = end; + trace = G_Trace( start, vec_zero, vec_zero, end, beam, MASK_SOLID, false, "CreateBeam" ); + VectorCopy( trace.endpos, beam->edict->s.origin2 ); + beam->use_angles = false; + + if ( model ) + { + // set the model if we have one + beam->setModel( model ); + beam->edict->s.renderfx &= ~RF_BEAM; + beam->edict->s.eType = ET_BEAM; + beam->edict->s.skinNum |= BEAM_USEMODEL; + } + + if ( shader ) + { + // Set the shader as an image configstring + beam->SetBeamShader( shader ); + } + + // set num segments + beam->edict->s.surfaces[4] = numsegments; + + // set scale + beam->setScale( scale ); + + // set life + BEAM_PARM_TO_PKT( life, beam->edict->s.surfaces[0] ); + beam->life = life; + + // set damage + beam->damage = damage; + + // activate it + beam->ProcessEvent( EV_Activate ); + beam->PostEvent( EV_Remove, life ); + return beam; + } diff --git a/source/source/fgame/beam.h b/source/source/fgame/beam.h new file mode 100644 index 0000000..72962a7 --- /dev/null +++ b/source/source/fgame/beam.h @@ -0,0 +1,164 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/beam.h $ +// $Revision:: 17 $ +// $Author:: Markd $ +// $Date:: 6/23/00 11:49a $ +// +// Copyright (C) 1999 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/beam.h $ +// +// 17 6/23/00 11:49a Markd +// fixed various imagindexes and saved games +// +// 16 6/14/00 2:17p Markd +// fixed compiler warnings for Intel Compiler +// +// 15 5/30/00 10:59a Aldie +// Added Circle of Protection Powerup +// +// 14 5/25/00 7:52p Markd +// 2nd pass save game stuff +// +// 13 5/24/00 3:14p Markd +// first phase of save/load games +// +// 12 3/14/00 4:56p Aldie +// Added persist command +// +// 11 2/14/00 7:34p Aldie +// Fixed some beam rendering issues +// +// 10 1/26/00 5:07p Aldie +// Fixed beamdamage +// +// 9 1/21/00 5:39p Aldie +// Fixed another targeting bug +// +// 8 1/21/00 2:10p Aldie +// Fixed beam endpoint tracking +// +// 7 1/10/00 6:17p Jimdose +// more code cleanup +// +// 6 1/07/00 8:12p Jimdose +// cleaning up unused code +// +// 5 11/19/99 11:28a Steven +// Added ability to specify the end point of a beam. +// +// 4 10/19/99 11:57a Aldie +// Added some more beam features +// +// 3 10/18/99 3:58p Aldie +// Fix for beam endpoints +// +// 2 10/18/99 1:59p Aldie +// Lots of fixes for beams and stuff +// +// DESCRIPTION: +// +#ifndef __BEAM_H__ +#define __BEAM_H__ + +#include "g_local.h" +#include "scriptslave.h" + +extern Event EV_FuncBeam_Activate; +extern Event EV_FuncBeam_Deactivate; +extern Event EV_FuncBeam_Diameter; +extern Event EV_FuncBeam_Maxoffset; +extern Event EV_FuncBeam_Minoffset; +extern Event EV_FuncBeam_Overlap; +extern Event EV_FuncBeam_Color; +extern Event EV_FuncBeam_SetTarget; +extern Event EV_FuncBeam_SetAngle; +extern Event EV_FuncBeam_SetEndPoint; +extern Event EV_FuncBeam_SetLife; +extern Event EV_FuncBeam_Shader; +extern Event EV_FuncBeam_Segments; +extern Event EV_FuncBeam_Delay; +extern Event EV_FuncBeam_NumSphereBeams; +extern Event EV_FuncBeam_SphereRadius; +extern Event EV_FuncBeam_ToggleDelay; +extern Event EV_FuncBeam_FindEndpoint; +extern Event EV_FuncBeam_EndAlpha; + +class FuncBeam : public ScriptSlave + { + protected: + EntityPtr end,origin_target; + float damage; + float life; + Vector end_point; + qboolean use_angles; + float shootradius; + str shader; + + public: + CLASS_PROTOTYPE( FuncBeam ); + + FuncBeam(); + + void SetAngle( Event *ev ); + void SetAngles( Event *ev ); + void SetEndPoint( Event *ev ); + void SetModel( Event *ev ); + void SetDamage( Event *ev ); + void SetOverlap( Event *ev ); + void SetBeamStyle( Event *ev ); + void SetLife( Event *ev ); + void Activate( Event *ev ); + void Deactivate( Event *ev ); + void SetDiameter( Event *ev ); + void SetMaxoffset( Event *ev ); + void SetMinoffset( Event *ev ); + void SetColor( Event *ev ); + void SetSegments( Event *ev ); + void SetBeamShader( str shader ); + void SetBeamShader( Event *ev ); + void SetBeamTileShader( Event *ev ); + void SetDelay( Event *ev ); + void SetToggleDelay( Event *ev ); + void SetSphereRadius( Event *ev ); + void SetNumSphereBeams( Event *ev ); + void SetEndAlpha( Event *ev ); + void SetShootRadius( Event *ev ); + void SetPersist( Event *ev ); + void FindEndpoint( Event *ev ); + void UpdateEndpoint( Event *ev ); + void UpdateOrigin( Event *ev ); + void Shoot( Event *ev ); + + virtual void setAngles( Vector ang ); + virtual void Archive( Archiver &arc ); + + friend FuncBeam *CreateBeam( const char *model, const char *shader, Vector start, Vector end, int numsegments = 4, float scale = 1.0f, float life = 1.0f, float damage = 0.0f, Entity *origin_target=NULL ); + }; + +inline void FuncBeam::Archive + ( + Archiver &arc + ) + { + ScriptSlave::Archive( arc ); + arc.ArchiveSafePointer( &end ); + arc.ArchiveSafePointer( &origin_target ); + arc.ArchiveFloat( &damage ); + arc.ArchiveFloat( &life ); + arc.ArchiveVector( &end_point ); + arc.ArchiveBoolean( &use_angles ); + arc.ArchiveFloat( &shootradius ); + arc.ArchiveString( &shader ); + if ( arc.Loading() ) + { + SetBeamShader( shader ); + } + } + +#endif // __BEAM_H__ diff --git a/source/source/fgame/behavior.cpp b/source/source/fgame/behavior.cpp new file mode 100644 index 0000000..50afd96 --- /dev/null +++ b/source/source/fgame/behavior.cpp @@ -0,0 +1,7898 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/behavior.cpp $ +// $Revision:: 144 $ +// $Author:: Aldie $ +// $Date:: 7/30/00 2:21p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/behavior.cpp $ +// +// 144 7/30/00 2:21p Aldie +// Fixed a problem in TurnTo allowing it to go forever. +// +// 143 7/29/00 1:25p Steven +// Took out teleport sound effects (are in effects now). +// +// 142 7/28/00 9:18p Steven +// Made a couple more fixes to Teleport. +// +// 141 7/28/00 6:56p Steven +// Added in some teleport effects to TeleportToPosition. +// +// 140 7/28/00 1:23p Steven +// Fixed entities origin while being dragged by the tr'angular and made player +// make lots of pain sounds when being eaten by a sucknblaugh. +// +// 139 7/27/00 10:53p Steven +// Made tr'angular do damage over time and made dropping victim much more +// robust. +// +// 138 7/27/00 10:31a Steven +// Added some effects when the spad body is hit by the ShockWater attack. +// +// 137 7/26/00 6:44p Steven +// Added some more animations to not break out of for talk. +// +// 136 7/24/00 8:35p Steven +// Added another animation not to interrupt. +// +// 135 7/23/00 12:27p Steven +// Changed sucknlaugh to pull entities to its centroid instead of its origin +// and fixed some TeleportToPosition problems. +// +// 134 7/22/00 8:36p Steven +// Made ghosts do a little bit more damage. +// +// 133 7/21/00 3:44p Steven +// Fixed burrowattack stuff, improved teleports a lot, and made anything that +// gets digested extinguish fire. +// +// 132 7/20/00 6:22p Steven +// Made jarts hurt anything that will take damage. +// +// 131 7/19/00 5:08p Steven +// Added electric water means of death. +// +// 130 7/18/00 4:26p Steven +// Modified which anims can not be interrupted by talking stuff a little and +// made flyclimb be able to set the speed. +// +// 129 7/17/00 4:42p Steven +// Added some more animations the talk behavior will not interrupt. +// +// 128 7/17/00 2:55p Steven +// Fixed it so Jart attack sets directio and position correctly so it can be +// blocked and made ghosts attackable longer and let players target them +// during this time. +// +// 127 7/16/00 4:36p Steven +// Added new fire means of death. +// +// 126 7/16/00 2:35p Steven +// Improved camera stuff when watching a talking actor. +// +// 125 7/13/00 7:29p Steven +// Made entity go back to solid again after being released from the +// tr'angular. +// +// 124 7/13/00 3:43p Steven +// Added next_think_time to GetCloseToEnemy for simple path finding. +// +// 123 7/12/00 11:26a Steven +// Added another animation that talk will not get out of, added a +// return_to_original_location bool to investigate, and made ghost stay solid +// longer. +// +// 122 7/11/00 7:08p Steven +// Made ghosts a little bit slower and not do as much damage. +// +// 121 7/11/00 9:12a Steven +// Made it so turnto doesn't rely on movedir being correct. +// +// 120 7/07/00 8:06a Steven +// Improved the investigation behavior to always look towards the noise +// position. +// +// 119 7/05/00 2:27p Steven +// Improved fleeing behavior a lot. +// +// 118 7/02/00 5:56p Steven +// Fixed FlyDive a little if hit something in movement and then it has moved +// out of the way when we try the trace. +// +// 117 7/02/00 5:08p Steven +// Made it so anything in the way when a actor teleports to a specific +// location gets telefragged. +// +// 116 7/02/00 2:45p Steven +// Fixed player getting removed when the sucknblaugh eats her. +// +// 115 7/02/00 1:11p Steven +// Changed TeleportToPosition to use named pathnodes instead of hardcoded +// positions. +// +// 114 6/30/00 3:08p Markd +// fixed rise animation issues +// +// 113 6/30/00 10:45a Markd +// added MOVETYPE_STATIONARY and revamped some physics +// +// 112 6/30/00 10:35a Steven +// Added max_pains to Pain behavior. +// +// 111 6/28/00 4:55p Aldie +// Added a MOD +// +// 110 6/26/00 5:50p Markd +// re-did some renderfx commands, fixed anti-sb juice stuff +// +// 109 6/23/00 4:54p Steven +// Removed a chatter function call. +// +// 108 6/21/00 5:28p Steven +// Improved the Digest behavior (fixed range a little, made gibs look better +// when spit out, and made it chew a little longer). +// +// 107 6/21/00 4:22p Steven +// Took out some chatter stuff from the idle behavior and moved the direction +// to fly in the Circle behavior to the args. +// +// 106 6/15/00 6:55p Steven +// Added moving head while talking stuff. +// +// 105 6/14/00 3:50p Markd +// Cleaned up more Intel Compiler warnings +// +// 104 6/13/00 3:06p Steven +// Fixed a problem in the Shock behavior where a beam was being referenced +// after it had been freed. +// +// 103 6/07/00 5:34p Steven +// Made it so actor would only try to return from investigating for so long, +// added TeleportToPosition and Levitate behaviors. +// +// 102 6/06/00 2:36p Steven +// Made GetCloseToEnemy not be able to use_nearest_node. +// +// 101 6/05/00 3:41p Steven +// Adde GotoDeadEnemy. +// +// 100 6/05/00 12:16p Markd +// fixed sound bug +// +// 99 6/03/00 5:23p Steven +// Made digest behavior spit out gibs instead of the dead creature. +// +// 98 6/01/00 5:47p Steven +// Made ghost attack hit a little easier. +// +// 97 5/27/00 2:31p Steven +// Added FlyCloseToPlayer, added a direction to the shock attack, made the +// actor turn immediately towards the enemy after a teleport, and improved the +// ghost attack a little. +// +// 96 5/24/00 4:08p Steven +// Added a forever variable to the HeadWatch behavior. +// +// 95 5/20/00 4:46p Steven +// Improved the Shock behavior. +// +// 94 5/11/00 11:11a Steven +// Improved the shock attack behaviors a little. +// +// 93 5/06/00 3:00p Steven +// Added speed to FlyCloseToEnemy and fixed actor's getting stuck on top of +// the player. +// +// 92 5/05/00 6:23p Steven +// Made it so fire would not cause constant pain in the pain behavior. +// +// 91 5/05/00 2:14p Steven +// Took out one of the sounds in GhostAttack. +// +// 90 5/04/00 4:13p Steven +// Fixed the BurrowAttack not hitting triggers and hard coded the BurrowAttack +// to start at a certain height to prevent height errors. +// +// 89 5/03/00 12:10p Steven +// Made it so the ghost bounces off shields if blocked. +// +// 88 5/03/00 11:27a Steven +// Added some sounds to the ghost attack and added the spooky ghost attack. +// +// 87 5/02/00 5:14p Steven +// Fixed the ghost attack so that MeleeAttack could tell what direction the +// attack was coming from. +// +// 86 5/02/00 3:14p Steven +// Added player watching actors that talk to her. +// +// 85 4/28/00 5:40p Steven +// Added use_last_known_pos to TurnToEnemy and BurrowAttack and made it so the +// burrowattack could hit solid entities as long as it isn't the world. +// +// 84 4/25/00 6:19p Steven +// Made it so the digest attack wouldn't eat stationary sentients and tweaked +// the range a little. +// +// 83 4/25/00 4:21p Steven +// Fixed the ghost spinning in circles around their attack target. +// +// 82 4/25/00 10:53a Steven +// Fixed a place where the ghost would fade all of the way back in. +// +// 81 4/25/00 10:12a Steven +// Lots of improvements to the GhostAttack behavior. +// +// 80 4/24/00 3:12p Steven +// Added allow fail to chase. +// +// 79 4/20/00 3:37p Steven +// Fixed a bug in HeadWatch, was never getting the current_head_angles +// correctly. +// +// 78 4/20/00 11:34a Steven +// Changed a range in the ShockWater behavior. +// +// 77 4/15/00 5:42p Steven +// Made it so the amount of time the sucknblaugh chews on its victim is +// determined by its weight. +// +// 76 4/15/00 3:39p Steven +// Made it so the pain animation will randomly choose between all available +// pain animations not just the first 2. +// +// 75 4/13/00 5:34p Steven +// Added the Teleport behavior and the GhostAttack behavior. +// +// 74 4/12/00 2:39p Steven +// Fixed TorsoTurn turning in circles forever problem (always trying to catch +// up to target). +// +// 73 4/11/00 4:01p Steven +// Added attack_min_height to MeleeAttack. +// +// 72 4/08/00 3:53p Steven +// Made headwatch snap head back to the forward position if lost the entity we +// were watching or if resetting the head and the behavior is stopped, took +// out the walking in PickupEntity, and set the actors animation to idle after +// done throwing an entity. +// +// 71 4/05/00 6:18p Steven +// Added dirt to where the Vymish Mama's burrow legs come out of the ground. +// +// 70 4/04/00 6:55p Steven +// Made it so HeadWatch doesn't snap to forward at end and if it doesn't have +// an entity to watch moves head back to forward position using max_speed. +// +// 69 4/01/00 2:39p Steven +// Made it so actor can fly clockwise or counter-clockwise in FlyCircle. +// +// 68 4/01/00 2:00p Steven +// Added a forever flag to GetCloseToEnemy. +// +// 67 3/31/00 5:32p Steven +// Made some changes to the Digest behavior so that I could get projectils and +// bullets to bounce off of the Sucknblaugh. +// +// 66 3/31/00 4:58p Steven +// Changed TurnToEnemy so that if actor is really close don't bother turning +// any more. +// +// 65 3/30/00 2:03p Steven +// More work on TorsoTurn. +// +// 64 3/28/00 6:49p Steven +// Lots of improvements to TorsoTurn. +// +// 63 3/24/00 6:33p Steven +// Fixed an animation issue, made lots of optimizations to flying behaviors +// and ChooseRandomDirection. +// +// 62 3/20/00 6:08p Steven +// Made sure GetCloseToEnemy gets animdone events (so actor is informed). +// +// 61 3/17/00 11:49a Steven +// Added jumping stuff. +// +// 60 3/14/00 12:06p Steven +// Added walkwatch stuff. +// +// 59 3/11/00 11:36a Steven +// Moved all actor booleans to 1 actor flags variable and made the stopping +// condition for TurnToEnemy a little better. +// +// 58 3/08/00 6:42p Steven +// Worked on the TorsoTurn behavior some more. +// +// 57 3/07/00 5:23p Steven +// Tweaked BurrowAttack a little to not spawn in so many dirt and water +// effects. +// +// 56 3/07/00 11:51a Steven +// Made lots of tweaks to the CircleEnemy behavior. +// +// 55 3/04/00 11:49a Steven +// Improved the FlyCircle, FlyDive, and FlyClimb behaviors. +// +// 54 3/03/00 5:26p Steven +// Added fast_bullet stuff. +// +// 53 3/02/00 11:02a Steven +// Added some tweaks to the digest behavior. +// +// 52 2/26/00 11:22a Steven +// Added partial immobile flag. +// +// 51 2/24/00 7:07p Steven +// Made talk so it would not stand up if already sitting and made it so the +// actor always tries to face whoever its talking to. +// +// 50 2/24/00 5:26p Steven +// Added a max speed parm to head watch and made sure playanim removes any +// anim done events still around when it ends. +// +// 49 2/23/00 5:19p Steven +// Improved the Wander behavior and improved the ChooseRandomDirection +// function. +// +// 48 2/23/00 11:57a Steven +// Moved utility behaviors to actor and improved BurrowAttack attack. +// +// 47 2/21/00 7:00p Steven +// Added a TorsoTurn behavior. +// +// 46 2/21/00 11:09a Steven +// Fixed some TurnTo issues. +// +// 45 2/17/00 5:42p Steven +// Moved NearestNode stuff out of Investigate to Actor. +// +// 44 2/16/00 6:04p Steven +// Tweaked the investigate behavior a lot. +// +// 43 2/16/00 10:43a Steven +// Added a Pain behavior, made an option for FlyWander to make the actor try +// to fly upwards, and improved the Investigate behavior. +// +// 42 2/11/00 6:41p Steven +// Improved headwatch a little and added pickup/throw. +// +// 41 2/09/00 6:48p Steven +// Made it so an actor would stay in talk mode until the player went far +// enough away. +// +// 40 2/07/00 6:45p Steven +// Made it so the FlyCloseToEnemy behavior doesn't choose a new goal so often. +// +// 39 2/04/00 1:55p Steven +// Added the talk behavior. +// +// 38 2/02/00 1:38p Steven +// Added turning animations to TurnTo, added the HeadWatch behavior, cleaned +// up flying code a little more, and improved the Suicide, DragEnemy, and +// ShockWater behaviors. +// +// 37 1/29/00 5:28p Steven +// Improoved the BurrowAttack and DragEnemy behaviors. +// +// 36 1/27/00 2:53p Steven +// Improved a lot of the flying code. +// +// 35 1/26/00 9:51a Steven +// Added a usefult debug message to GotoPathNode. +// +// 34 1/22/00 12:42p Jimdose +// got rid of calls to vec3() +// +// 33 1/21/00 6:45p Steven +// Made flee use chase instead of FollowPath. +// +// 32 1/19/00 7:08p Steven +// Fixed speed of flying creatures and tweaked BurrowAttack behavior a little. +// +// 31 1/19/00 12:11p Steven +// Fixed AimAndShoot behavior and improved the TurnToEnemy and BurrowAttack +// behaviors. +// +// 30 1/14/00 7:36p Steven +// Improved TurnToEnemy behavior a little. +// +// 29 1/14/00 5:06p Markd +// Removed surface num, tri_num and damage_multiplier from multiple functions +// and events +// +// 28 1/14/00 5:02p Steven +// Added gotonextstage and burrowattack behaviors. +// +// 27 1/13/00 7:07p Steven +// Lots and lots of cleanup. +// +// 26 1/07/00 8:12p Jimdose +// cleaning up unused code +// +// 25 1/06/00 11:08p Jimdose +// cleaning up unused code +// +// 24 1/06/00 6:49p Steven +// Cleaned up GetCloseToEnemy. +// +// 23 1/05/00 7:25p Jimdose +// made angle functions all use the same coordinate system +// AngleVectors now returns left instead of right +// no longer need to invert pitch +// +// 22 1/05/00 6:43p Steven +// Fixed the start and end point being backwards in a trace command. +// +// 21 1/05/00 3:07p Jimdose +// fixed inverted pitch in Aim::Evaluate +// +// 20 12/22/99 5:13p Steven +// Fixed some animation issues, some general clean up, and removed +// FemaleLympAttack. +// +// 19 12/17/99 5:51p Steven +// Made some temporary fixes to aiming behaviors and added the following +// behaviors : TurnTowardsEnemy, FlyCircle, FlyDive, and FlyClimb. +// +// 18 12/01/99 3:43p Steven +// Added a land behavior for flying creatures. +// +// 17 11/24/99 11:05a Steven +// More work on flying. +// +// 16 11/19/99 2:05p Steven +// Took out some unused code. +// +// 15 11/19/99 11:33a Steven +// Added new behaviors: CircleEnemy, ShockWater, Shock, and CircleAttack. +// +// 14 11/12/99 6:24p Steven +// Made state flags available to other part entities. +// +// 13 11/10/99 6:11p Steven +// Added the FlyCloseToEnemy behavior. +// +// 12 10/28/99 6:06p Steven +// Improved the drag behavior. +// +// 11 10/27/99 10:27a Steven +// Added GetNearestEnemy behavior and added more to the DragEnemy behavior. +// +// 10 10/19/99 7:52p Markd +// Removed three part model system +// +// 9 10/19/99 7:10p Steven +// Lots of AI work. +// +// 8 10/11/99 7:50p Steven +// Cleanup. +// +// 7 10/01/99 4:52p Markd +// Made Warning level 4 work on all projects +// +// 6 9/29/99 11:52a Markd +// removed some unused enums and variables form shared headers between cgame +// and fgame +// +// 5 9/28/99 7:24p Steven +// Event formatting. +// +// 4 9/22/99 4:47p Markd +// fixed more G_GetEntity, G_FindClass and G_GetNextEntity bugs +// +// 3 9/21/99 7:51p Markd +// Fixed a lot of entitynum_none issues +// +// 2 9/16/99 11:18a Markd +// Continuing merge of code, not functional yet but closer +// +// 1 9/10/99 10:53a Jimdose +// +// 1 9/08/99 3:15p Aldie +// +// 26 9/02/99 11:33p Jimdose +// fixed bug with sucknblaughs targeting +// +// 25 9/02/99 4:22p Steven +// Changed when sucknblaugh is solid and when it is not and fixed some aiming +// issues in AimAndShoot behavior. +// +// 24 9/01/99 8:16p Steven +// Fixed a typo and setting the anim back to idle after the AimAndShoot +// behavior. +// +// 23 8/31/99 9:21p Steven +// Added fall anim to jump behavior and tweaked digest behavior a little. +// +// 22 8/31/99 2:43p Steven +// Fixed some spin behavior bugs. +// +// 21 8/28/99 7:05p Steven +// Made it so the speed of the spinning for the spinner plant was a parameter. +// +// 20 8/28/99 11:42a Steven +// Added some spinning plant stuff. +// +// 19 8/27/99 5:05p Steven +// Worked on digest behavior, added spin, and optimized some of the movement. +// +// 18 8/24/99 11:25a Steven +// Made it so Sucknblaughs don't eat dead creatures. +// +// 17 8/18/99 3:29p Jimdose +// added cylindrical collision detection +// +// 16 8/18/99 3:22p Steven +// Added to Digest behavior. +// +// 15 8/17/99 4:59p Steven +// New digest behavior for the Sucknblaugh plant. +// +// 14 8/16/99 10:29a Steven +// More general work on AI. +// +// 13 8/11/99 7:24p Steven +// Redid the AimAndShoot behavior temporarily. +// +// 12 8/11/99 5:56p Steven +// More general AI work. +// +// 11 8/06/99 6:39p Aldie +// Started removing concept of currentWeapon +// +// 10 8/05/99 9:14a Steven +// New AI stuff. +// +// 9 7/07/99 11:25a Steven +// Added some stuff on the sector pathfinding approach. +// +// +// DESCRIPTION: +// Behaviors used by the AI. +// + +#include "g_local.h" +#include "behavior.h" +#include "actor.h" +#include "doors.h" +#include "object.h" +#include "explosion.h" +#include "weaputils.h" +#include "player.h" + +Event EV_Behavior_Args + ( + "args", + EV_DEFAULT, + "SSSSSS", + "token1 token2 token3 token4 token5 token6", + "Gives the current behavior arguments." + ); +Event EV_Behavior_AnimDone + ( + "animdone", + EV_DEFAULT, + NULL, + NULL, + "Tells the behavior that the current animation is done, " + "it is not meant to be called from script." + ); + +Vector ChooseRandomDirection( Actor &self, Vector previousdir, float *time, int disallowcontentsmask, qboolean usepitch ); + +/**************************************************************************** + + Behavior Class Definition + +****************************************************************************/ + +CLASS_DECLARATION( Listener, Behavior, NULL ) + { + { NULL, NULL } + }; + +Behavior::Behavior() + { + } + +void Behavior::ShowInfo + ( + Actor &self + ) + + { + if ( movegoal ) + { + gi.Printf( "movegoal: ( %f, %f, %f ) - '%s'\n", + movegoal->origin.x, movegoal->origin.y, movegoal->origin.z, movegoal->targetname.c_str() ); + } + else + { + gi.Printf( "movegoal: NULL\n" ); + } + } + +void Behavior::Begin + ( + Actor &self + ) + + { + } + +qboolean Behavior::Evaluate + ( + Actor &self + ) + + { + return false; + } + +void Behavior::End + ( + Actor &self + ) + + { + } + + + +/**************************************************************************** +***************************************************************************** + + General behaviors + +***************************************************************************** +****************************************************************************/ + + + +/**************************************************************************** + + Idle Class Definition + +****************************************************************************/ + +CLASS_DECLARATION( Behavior, Idle, NULL ) + { + { NULL, NULL } + }; + +void Idle::ShowInfo + ( + Actor &self + ) + + { + Behavior::ShowInfo( self ); + + gi.Printf( "\nnexttwitch : %f\n", nexttwitch ); + } + +void Idle::Begin + ( + Actor &self + ) + + { + nexttwitch = level.time + 10 + G_Random( 30 ); + } + +qboolean Idle::Evaluate + ( + Actor &self + ) + + { + if ( self.currentEnemy ) + { + return true; + } + + if ( nexttwitch < level.time ) + { + self.chattime += 10; + self.AddStateFlag( STATE_FLAG_TWITCH ); + return true; + } + else + { + //self.Chatter( "snd_idle", 1 ); + } + + return true; + } + +void Idle::End + ( + Actor &self + ) + + { + } + +/**************************************************************************** + + Pain Class Definition + +****************************************************************************/ + +CLASS_DECLARATION( Behavior, Pain, NULL ) + { + { &EV_Behavior_AnimDone, AnimDone }, + { NULL, NULL } + }; + +void Pain::SetPainAnim + ( + Actor &self, + int new_pain_type, + int new_anim_number + ) + + { + str anim_name; + + // Determine which pain type to play + + if ( new_pain_type == PAIN_SMALL ) + anim_name = "pain_small"; + else + anim_name = "pain"; + + // Try to find the correct anim to play + + anim_name += new_anim_number; + + if ( !self.HasAnim( anim_name.c_str() ) ) + { + if ( new_pain_type == PAIN_SMALL ) + anim_name = "pain_small1"; + else + anim_name = "pain1"; + + pain_anim_number = 1; + } + + anim_done = false; + + // Play the animation if we can + + if ( !self.HasAnim( anim_name.c_str() ) ) + anim_done = true; + else + self.SetAnim( anim_name.c_str(), EV_Actor_NotifyBehavior ); + } + +int Pain::GetNumberOfPainAnims + ( + Actor &self, + int new_pain_type + ) + + { + str anim_name; + str real_anim_name; + int i; + + + // Determine base animation name + + if ( new_pain_type == PAIN_SMALL ) + anim_name = "pain_small"; + else + anim_name = "pain"; + + // Find how many pain animations we have + + for( i = 1 ; i < 10 ; i++ ) + { + real_anim_name = anim_name + i; + + if ( !self.HasAnim( real_anim_name.c_str() ) ) + return( i - 1 ); + } + + return 9; + } + +void Pain::Begin + ( + Actor &self + ) + + { + str anim_name; + int num_pain_anims; + + num_pain_anims = GetNumberOfPainAnims( self, self.pain_type ); + + pain_anim_number = G_Random( num_pain_anims ) + 1; + + // Figure out which type of pain to do + + if ( self.pain_type == PAIN_SMALL ) + SetPainAnim( self, PAIN_SMALL, pain_anim_number ); + else + SetPainAnim( self, PAIN_BIG, pain_anim_number ); + + current_pain_type = self.pain_type; + number_of_pains = 1; + + // Make sure we don't have pain any more + + self.state_flags &= ~STATE_FLAG_SMALL_PAIN; + self.state_flags &= ~STATE_FLAG_IN_PAIN; + + max_pains = G_Random( 4 ) + 4; + } + +void Pain::AnimDone + ( + Event *ev + ) + { + anim_done = true; + } + +qboolean Pain::Evaluate + ( + Actor &self + ) + + { + str anim_name; + + if ( self.state_flags & STATE_FLAG_SMALL_PAIN ) + { + // See if we should play another pain animation + + if ( self.means_of_death != MOD_FIRE && self.means_of_death != MOD_ON_FIRE && self.means_of_death != MOD_FIRE_BLOCKABLE ) + { + if ( self.pain_type == PAIN_SMALL && current_pain_type == PAIN_SMALL && number_of_pains < max_pains ) + { + pain_anim_number++; + + number_of_pains++; + + SetPainAnim( self, PAIN_SMALL, pain_anim_number ); + } + else if ( self.pain_type == PAIN_BIG ) + { + pain_anim_number++; + + current_pain_type = PAIN_BIG; + + SetPainAnim( self, PAIN_BIG, pain_anim_number ); + } + } + + // Reset pain stuff + + self.state_flags &= ~STATE_FLAG_SMALL_PAIN; + self.state_flags &= ~STATE_FLAG_IN_PAIN; + } + + // If the pain animation has finished, then we are done + + if ( anim_done ) + return false; + + return true; + } + +void Pain::End + ( + Actor &self + ) + + { + self.bullet_hits = 0; + } + +/**************************************************************************** + + Watch Class Definition + +****************************************************************************/ + +CLASS_DECLARATION( Behavior, Watch, NULL ) + { + { &EV_Behavior_Args, SetArgs }, + { NULL, NULL } + }; + +Watch::Watch() + { + turn_speed = 360; + } + +void Watch::SetArgs + ( + Event *ev + ) + + { + turn_speed = ev->GetFloat( 1 ); + } + +void Watch::Begin + ( + Actor &self + ) + + { + ent_to_watch = self.currentEnemy; + + old_turn_speed = self.turnspeed; + self.turnspeed = turn_speed; + seek.Begin( self ); + } + +qboolean Watch::Evaluate + ( + Actor &self + ) + + { + Vector dir; + + if ( !ent_to_watch ) + return false; + + if ( self.IsEntityAlive( ent_to_watch ) ) + { + self.angles.AngleVectors( &dir ); + + seek.SetTargetPosition( ent_to_watch->centroid ); + seek.SetTargetVelocity( vec_zero ); + seek.SetPosition( self.centroid ); + seek.SetDir( dir ); + seek.Evaluate( self ); + + self.Accelerate( seek.steeringforce ); + } + + return true; + } + +void Watch::End + ( + Actor &self + ) + + { + self.turnspeed = old_turn_speed; + seek.End( self ); + } + +/**************************************************************************** + + Turn Class Definition + +****************************************************************************/ + +CLASS_DECLARATION( Behavior, Turn, NULL ) + { + { &EV_Behavior_Args, SetArgs }, + { NULL, NULL } + }; + +Turn::Turn() + { + turn_speed = 5; + } + +void Turn::SetArgs + ( + Event *ev + ) + + { + turn_speed = ev->GetFloat( 1 ); + } + +void Turn::Begin + ( + Actor &self + ) + + { + } + +qboolean Turn::Evaluate + ( + Actor &self + ) + + { + self.angles[YAW] += turn_speed; + + self.setAngles( self.angles ); + + return true; + } + +void Turn::End + ( + Actor &self + ) + + { + } + +/**************************************************************************** + + Aim Class Definition + +****************************************************************************/ + +CLASS_DECLARATION( Behavior, Aim, NULL ) + { + { NULL, NULL } + }; + +void Aim::SetTarget + ( + Entity *ent + ) + + { + target = ent; + } + +void Aim::ShowInfo + ( + Actor &self + ) + + { + Behavior::ShowInfo( self ); + + gi.Printf( "\nseek:\n" ); + seek.ShowInfo( self ); + if ( target ) + { + gi.Printf( "\ntarget : #%d '%s'\n", target->entnum, target->targetname.c_str() ); + } + else + { + gi.Printf( "\ntarget : NULL\n" ); + } + } + +void Aim::Begin + ( + Actor &self + ) + + { + seek.Begin( self ); + } + +qboolean Aim::Evaluate + ( + Actor &self + ) + + { + Vector dir; + Vector ang; + Vector pos; + + if ( !target ) + { + return false; + } + + // + // get my gun pos + // + + // Fixme ? + //pos = self.GunPosition(); + //ang = self.MyGunAngles( pos, false ); + pos = self.centroid; + ang = self.angles; + ang.AngleVectors( &dir, NULL, NULL ); + + seek.SetTargetPosition( target->centroid ); + seek.SetTargetVelocity( target->velocity ); + seek.SetPosition( self.centroid ); + seek.SetDir( dir ); + seek.SetMaxSpeed( 1400 + skill->value * 600 ); + seek.Evaluate( self ); + + // Fixme? + /* if ( ( fabs( seek.steeringforce.y ) > 5 ) && ( self.enemyRange > RANGE_MELEE ) ) + { + seek.steeringforce.y *= 2; + } */ + + self.Accelerate( seek.steeringforce ); + if ( seek.steeringforce.y < 0.25f ) + { + // dead on + return false; + } + + return true; + } + +void Aim::End + ( + Actor &self + ) + + { + seek.End( self ); + } + +/**************************************************************************** + + TurnTo Class Definition + +****************************************************************************/ + +CLASS_DECLARATION( Behavior, TurnTo, NULL ) + { + { &EV_Behavior_AnimDone, AnimDone }, + { NULL, NULL } + }; + +TurnTo::TurnTo() + { + dir = Vector( 1, 0, 0 ); + mode = 0; + ent = NULL; + yaw = 0; + anim_done = true; + } + +void TurnTo::SetDirection + ( + float yaw + ) + + { + Vector ang; + + ang = Vector( 0, yaw, 0 ); + this->yaw = anglemod( yaw ); + ang.AngleVectors( &dir, NULL, NULL ); + dir *= 100; + mode = 1; + } + +void TurnTo::SetTarget + ( + Entity *ent + ) + + { + this->ent = ent; + mode = 2; + } + +void TurnTo::AnimDone + ( + Event *ev + ) + + { + anim_done = true; + } + +void TurnTo::ShowInfo + ( + Actor &self + ) + + { + Behavior::ShowInfo( self ); + + gi.Printf( "\nseek:\n" ); + seek.ShowInfo( self ); + + if ( ent ) + { + gi.Printf( "\nent: #%d '%s'\n", ent->entnum, ent->targetname.c_str() ); + } + else + { + gi.Printf( "\nent: NULL\n" ); + } + + gi.Printf( "dir: ( %f, %f, %f )\n", dir.x, dir.y, dir.z ); + gi.Printf( "yaw: %f\n", yaw ); + gi.Printf( "mode: %d\n", mode ); + } + +void TurnTo::Begin + ( + Actor &self + ) + + { + self.SetAnim( "idle" ); + seek.Begin( self ); + } + +qboolean TurnTo::Evaluate + ( + Actor &self + ) + + { + Vector delta; + float ang; + str anim_name; + Vector forward; + + + switch( mode ) + { + case 1 : + ang = angledist( yaw - self.angles.yaw() ); + if ( fabs( ang ) < 1 ) + { + self.Accelerate( Vector( 0, ang, 0 ) ); + + // If turned all the way wait for animation to finish + + if ( anim_done || self.animname == "idle" ) + return false; + else + return true; + } + + seek.SetTargetPosition( self.origin + dir ); + seek.SetTargetVelocity( vec_zero ); + break; + + case 2 : + if ( !ent ) + { + return false; + } + + delta = ent->origin - self.origin; + yaw = delta.toYaw(); + + seek.SetTargetPosition( ent->origin ); + seek.SetTargetVelocity( vec_zero ); + break; + + default : + return false; + } + + seek.SetPosition( self.origin ); + + self.angles.AngleVectors( &forward ); + seek.SetDir( forward ); + //seek.SetDir( self.movedir ); + + seek.SetMaxSpeed( self.movespeed ); + seek.Evaluate( self ); + + if ( seek.steeringforce[YAW] > 1 ) + { + anim_name = "turn_left"; + anim_done = false; + } + else if ( seek.steeringforce[YAW] < -1 ) + { + anim_name = "turn_right"; + anim_done = false; + } + else if ( anim_done ) + { + anim_name = "idle"; + } + else + { + anim_name = self.animname; + } + + if ( gi.Anim_NumForName( self.edict->s.modelindex, anim_name.c_str() ) != -1 ) + { + if ( anim_name != self.animname ) + self.SetAnim( anim_name.c_str(), EV_Actor_NotifyBehavior ); + } + else + { + anim_done = true; + } + + self.Accelerate( seek.steeringforce ); + + return true; + } + +void TurnTo::End + ( + Actor &self + ) + + { + seek.End( self ); + self.SetAnim( "idle" ); + } + +/**************************************************************************** + + HeadWatch Class Definition + +****************************************************************************/ + +CLASS_DECLARATION( Behavior, HeadWatch, NULL ) + { + { &EV_Behavior_Args, SetArgs }, + { NULL, NULL } + }; + +HeadWatch::HeadWatch() + { + max_speed = 10; + forever = true; + } + +void HeadWatch::SetArgs + ( + Event *ev + ) + + { + ent_to_watch = ev->GetEntity( 1 ); + + if ( ev->NumArgs() > 1 ) + max_speed = ev->GetFloat( 2 ); + + if ( ev->NumArgs() > 2 ) + forever = ev->GetBoolean( 3 ); + } + + +void HeadWatch::ShowInfo + ( + Actor &self + ) + + { + Behavior::ShowInfo( self ); + } + +void HeadWatch::Begin + ( + Actor &self + ) + + { + self.SetControllerTag( ACTOR_HEAD_TAG, gi.Tag_NumForName( self.edict->s.modelindex, "Bip01 Head" ) ); + + current_head_angles = self.GetControllerAngles( ACTOR_HEAD_TAG ); + + self.SetActorFlag( ACTOR_FLAG_TURNING_HEAD, true ); + } + +qboolean HeadWatch::Evaluate + ( + Actor &self + ) + + { + Vector dir; + Vector angles; + int tag_num; + Vector tag_pos; + Vector angles_diff; + Vector watch_position; + Actor *act = NULL; + Vector change; + + if ( ent_to_watch ) + { + tag_num = gi.Tag_NumForName( self.edict->s.modelindex, "Bip01 Head" ); + + if ( tag_num < 0 ) + return false; + + self.GetTag( "Bip01 Head", &tag_pos ); + + if ( ent_to_watch->isSubclassOf( Actor ) ) + act = (Actor *)(Entity *)ent_to_watch; + + if ( act && act->watch_offset != vec_zero ) + { + MatrixTransformVector( act->watch_offset, ent_to_watch->orientation, watch_position ); + watch_position += ent_to_watch->origin; + } + else + { + watch_position = ent_to_watch->centroid; + } + + dir = watch_position - tag_pos; + angles = dir.toAngles(); + + angles_diff = angles - self.angles; + } + else + { + angles_diff = vec_zero; + } + + angles_diff[YAW] = AngleNormalize180( angles_diff[YAW] ); + angles_diff[PITCH] = AngleNormalize180( angles_diff[PITCH] ); + + // Make sure we don't turn neck too far + + if ( angles_diff[YAW] < -80 ) + angles_diff[YAW] = -80; + else if ( angles_diff[YAW] > 80 ) + angles_diff[YAW] = 80; + + if ( angles_diff[PITCH] < -45 ) + angles_diff[PITCH] = -45; + else if ( angles_diff[PITCH] > 45 ) + angles_diff[PITCH] = 45; + + angles_diff[ROLL] = 0; + + // Make sure we don't change our head angles too much at once + + change = angles_diff - current_head_angles; + + if ( change[YAW] > max_speed ) + angles_diff[YAW] = current_head_angles[YAW] + max_speed; + else if ( change[YAW] < -max_speed ) + angles_diff[YAW] = current_head_angles[YAW] - max_speed; + + if ( change[PITCH] > max_speed ) + angles_diff[PITCH] = current_head_angles[PITCH] + max_speed; + else if ( change[PITCH] < -max_speed ) + angles_diff[PITCH] = current_head_angles[PITCH] - max_speed; + + self.SetControllerAngles( ACTOR_HEAD_TAG, angles_diff ); + self.real_head_pitch = angles_diff[PITCH]; + + current_head_angles = angles_diff; + + if ( !ent_to_watch && current_head_angles == vec_zero ) + return false; + + if ( !forever && change[YAW] < max_speed && change[YAW] > -max_speed && change[PITCH] < max_speed && change[PITCH] > -max_speed ) + return false; + + return true; + } + +void HeadWatch::End + ( + Actor &self + ) + + { + // Snap head back into position if we have lost our target or we are doing a resethead + + if ( !ent_to_watch ) + { + self.SetControllerAngles( ACTOR_HEAD_TAG, vec_zero ); + self.real_head_pitch = 0; + } + + self.SetActorFlag( ACTOR_FLAG_TURNING_HEAD, false ); + } + +/**************************************************************************** + + TorsoTurn Class Definition + +****************************************************************************/ + +CLASS_DECLARATION( Behavior, TorsoTurn, NULL ) + { + { &EV_Behavior_Args, SetArgs }, + { NULL, NULL } + }; + +void TorsoTurn::SetArgs + ( + Event *ev + ) + + { + turn_towards_enemy = ev->GetInteger( 1 ); + speed = ev->GetFloat( 2 ); + forever = ev->GetInteger( 3 ); + + if ( ev->NumArgs() > 3 ) + tag_name = ev->GetString( 4 ); + + if ( ev->NumArgs() > 4 ) + tolerance = ev->GetFloat( 5 ); + else + tolerance = 0; + } + + +void TorsoTurn::ShowInfo + ( + Actor &self + ) + + { + Behavior::ShowInfo( self ); + } + +void TorsoTurn::Begin + ( + Actor &self + ) + + { + Vector controller_angles; + + self.SetControllerTag( ACTOR_TORSO_TAG, gi.Tag_NumForName( self.edict->s.modelindex, "Bip01 Spine1" ) ); + + controller_angles = self.GetControllerAngles( ACTOR_TORSO_TAG ); + + current_yaw = controller_angles[YAW]; + current_pitch = controller_angles[PITCH]; + } + +qboolean TorsoTurn::Evaluate + ( + Actor &self + ) + + { + Vector dir; + Vector angles; + int tag_num; + float yaw_diff; + float pitch_diff; + Vector new_angles; + float yaw_change; + float pitch_change; + Vector tag_pos; + Vector tag_forward; + Vector tag_angles; + + + tag_num = gi.Tag_NumForName( self.edict->s.modelindex, "Bip01 Spine1" ); + + if ( tag_num < 0 ) + return false; + + // Determine the angle we want to go to + + if ( turn_towards_enemy ) + { + if ( !self.currentEnemy ) + return false; + + if ( tag_name.length() ) + { + self.GetTag( tag_name.c_str(), &tag_pos, &tag_forward ); + tag_angles = tag_forward.toAngles(); + dir = self.currentEnemy->centroid - tag_pos; + } + else + { + dir = self.currentEnemy->centroid - self.centroid; + } + + angles = dir.toAngles(); + + yaw_diff = AngleNormalize180( angles[YAW] - self.angles[YAW] ); + pitch_diff = AngleNormalize180( angles[PITCH] - self.angles[PITCH] ); + } + else + { + yaw_diff = 0; + pitch_diff = 0; + } + + // Determine the angle change + + yaw_change = AngleNormalize180( yaw_diff - current_yaw ); + pitch_change = AngleNormalize180( pitch_diff - current_pitch ); + + if ( tolerance && yaw_change < tolerance && yaw_change > -tolerance && pitch_change < tolerance && pitch_change > -tolerance ) + { + if ( forever ) + return true; + else + return false; + } + + // Make sure we don't change our torso angles too much at once + + if ( yaw_change > speed ) + yaw_diff = current_yaw + speed; + else if ( yaw_change < -speed ) + yaw_diff = current_yaw - speed; + + if ( pitch_change > speed ) + pitch_diff = current_pitch + speed; + else if ( yaw_change < -speed ) + pitch_diff = current_pitch - speed; + + // Determine our new angles + + new_angles[YAW] = yaw_diff; + new_angles[PITCH] = pitch_diff; + new_angles[ROLL] = 0; + + // Make sure we don't turn too far + + //if ( new_angles[YAW] > 120 || new_angles[YAW] < -120 ) + // return false; + + if ( new_angles[PITCH] > 45 || new_angles[PITCH] < -45 ) + return false; + + // Set our new angles + + self.SetControllerAngles( ACTOR_TORSO_TAG, new_angles ); + + current_yaw = yaw_diff; + current_pitch = pitch_diff; + + // See if we are turned the correct direction now + + if ( !forever && (yaw_change < speed) && (yaw_change > -speed) && (pitch_change < speed) && (pitch_change > -speed) ) + return false; + + return true; + } + +void TorsoTurn::End + ( + Actor &self + ) + + { + } + +/**************************************************************************** + + GotoPathNode Class Definition + +****************************************************************************/ + +CLASS_DECLARATION( Behavior, GotoPathNode, NULL ) + { + { &EV_Behavior_AnimDone, AnimDone }, + { &EV_Behavior_Args, SetArgs }, + { NULL, NULL } + }; + +GotoPathNode::GotoPathNode() + { + usevec = false; + movegoal = NULL; + goal = vec_zero; + goalent = NULL; + } + +void GotoPathNode::SetArgs + ( + Event *ev + ) + + { + anim = ev->GetString( 1 ); + + if ( ev->IsVectorAt( 2 ) ) + { + goal = ev->GetVector( 2 ); + usevec = true; + } + else + { + usevec = false; + movegoal = AI_FindNode( ev->GetString( 2 ) ); + if ( !movegoal ) + { + goalent = ev->GetEntity( 2 ); + } + } + + if ( ev->NumArgs() > 2 ) + entity_to_watch = ev->GetEntity( 3 ); + } + +void GotoPathNode::AnimDone + ( + Event *ev + ) + + { + turnto.ProcessEvent( EV_Behavior_AnimDone ); + } + +void GotoPathNode::SetGoal + ( + PathNode *node + ) + + { + usevec = false; + movegoal = node; + } + +void GotoPathNode::ShowInfo + ( + Actor &self + ) + + { + Behavior::ShowInfo( self ); + + gi.Printf( "\nturnto:\n" ); + turnto.ShowInfo( self ); + + gi.Printf( "\nchase:\n" ); + chase.ShowInfo( self ); + + gi.Printf( "\nstate: %d\n", state ); + gi.Printf( "usevec: %d\n", usevec ); + gi.Printf( "time: %f\n", time ); + gi.Printf( "anim: %s\n", anim.c_str() ); + + if ( goalent ) + { + gi.Printf( "\ngoalent: #%d '%s'\n", goalent->entnum, goalent->targetname.c_str() ); + } + else + { + gi.Printf( "\ngoalent: NULL\n" ); + } + + gi.Printf( "goal: ( %f, %f, %f )\n", goal.x, goal.y, goal.z ); + } + +void GotoPathNode::Begin + ( + Actor &self + ) + + { + Event *ev; + + state = 0; + chase.Begin( self ); + turnto.Begin( self ); + if ( goalent ) + { + chase.SetTarget( goalent ); + } + else if ( movegoal ) + { + chase.SetGoal( movegoal ); + } + else + { + chase.SetGoalPos( goal ); + } + + // don't check for new paths as often + chase.SetPathRate( 4 ); + + chase.AllowFail( true ); + + if ( anim.length() ) + { + self.SetAnim( anim ); + } + + // Setup head watch stuff + + head_watch.Begin( self ); + + ev = new Event( EV_Behavior_Args ); + ev->AddEntity( entity_to_watch ); + head_watch.ProcessEvent( ev ); + } + +qboolean GotoPathNode::Evaluate + ( + Actor &self + ) + + { + float yaw; + + if ( !usevec && !goalent && !movegoal ) + { + gi.DPrintf( "GotoPathNode::No goal\n" ); + return false; + } + + if ( entity_to_watch ) + head_watch.Evaluate( self ); + + switch( state ) + { + case 0 : + if ( chase.Evaluate( self ) ) + { + break; + } + + state = 1; + self.SetAnim( "idle" ); + + // cascade down to case 1 + case 1 : + if ( !movegoal ) + { + return false; + } + + if ( movegoal->setangles ) + { + yaw = movegoal->angles.yaw(); + turnto.SetDirection( yaw ); + if ( turnto.Evaluate( self ) ) + { + break; + } + } + + if ( movegoal->animname == "" ) + { + self.SetAnim( "idle" ); + return false; + } + + self.SetAnim( movegoal->animname, EV_Actor_FinishedBehavior ); + state = 2; + break; + + case 2 : + break; + } + + return true; + } + +void GotoPathNode::End + ( + Actor &self + ) + + { + chase.End( self ); + head_watch.End( self ); + } + +/**************************************************************************** + + Flee Class Definition + +****************************************************************************/ + +CLASS_DECLARATION( Behavior, Flee, NULL ) + { + { &EV_Behavior_Args, SetArgs }, + { NULL, NULL } + }; + +void Flee::SetArgs + ( + Event *ev + ) + + { + anim = ev->GetString( 1 ); + } + +void Flee::ShowInfo + ( + Actor &self + ) + + { + Behavior::ShowInfo( self ); + + gi.Printf( "\nchase:\n" ); + chase.ShowInfo( self ); + } + +void Flee::Begin + ( + Actor &self + ) + + { + if ( anim.length() ) + { + self.SetAnim( anim ); + } + + chase.Begin( self ); + FindFleeNode( self ); + } + +void Flee::FindFleeNode + ( + Actor &self + ) + { + int i; + PathNode *start_node; + pathway_t *path; + PathNode *current_node; + int max_nodes_to_look_at; + int nodes_looked_at; + qboolean found; + + + // Get closest node + + start_node = PathManager.NearestNode( self.origin, &self ); + + // Find a random node that is connected to this node + + found = false; + + if ( start_node ) + { + max_nodes_to_look_at = G_Random( 5 ) + 10; + nodes_looked_at = 0; + current_node = start_node; + + while( !found ) + { + nodes_looked_at++; + + if ( nodes_looked_at >= max_nodes_to_look_at && current_node != start_node ) + { + found = true; + flee_node = current_node; + } + + if ( current_node->numChildren == 0 ) + break; + + path = ¤t_node->Child[ (int)G_Random( current_node->numChildren ) ]; + current_node = AI_GetNode( path->node ); + } + } + + if ( !found ) + { + // If still not found, use old method + + for( i = 0; i < 5; i++ ) + { + flee_node = AI_GetNode( ( int )G_Random( ai_maxnode + 1 ) ); + if ( flee_node ) + break; + } + } + } + +qboolean Flee::Evaluate + ( + Actor &self + ) + + { + // Make sure we have somewhere to flee to + + if ( !flee_node ) + return false; + + chase.SetGoal( flee_node ); + + // Make a racket + + self.Chatter( "snd_panic", 3 ); + + // Try to get to flee node + + if ( !chase.Evaluate( self ) ) + { + // See if we are done fleeing + + if ( !self.currentEnemy || !self.CanSee( self.currentEnemy ) ) + { + return false; + } + + // Find a new spot to flee to + + FindFleeNode( self ); + } + + return true; + } + +void Flee::End + ( + Actor &self + ) + + { + chase.End( self ); + } + +/**************************************************************************** + + PlayAnim Class Definition + +****************************************************************************/ + +CLASS_DECLARATION( Behavior, PlayAnim, NULL ) + { + { &EV_Behavior_Args, SetArgs }, + { NULL, NULL } + }; + +void PlayAnim::SetArgs + ( + Event *ev + ) + + { + anim = ev->GetString( 1 ); + } + +void PlayAnim::ShowInfo + ( + Actor &self + ) + + { + Behavior::ShowInfo( self ); + + gi.Printf( "\nanim: %s\n", anim.c_str() ); + } + +void PlayAnim::Begin + ( + Actor &self + ) + + { + if ( anim.length() ) + { + if ( !self.SetAnim( anim, EV_Actor_FinishedBehavior ) ) + { + self.PostEvent( EV_Actor_FinishedBehavior, 0 ); + } + } + } + +qboolean PlayAnim::Evaluate + ( + Actor &self + ) + + { + return true; + } + +void PlayAnim::End + ( + Actor &self + ) + + { + self.RemoveAnimDoneEvent(); + } + +/**************************************************************************** + + Talk Class Definition + +****************************************************************************/ + +#define TALK_MODE_TURN_TO 0 +#define TALK_MODE_TALK 1 +#define TALK_MODE_WAIT 2 +#define TALK_MODE_TURN_BACK 3 + +CLASS_DECLARATION( Behavior, Talk, NULL ) + { + { &EV_Behavior_AnimDone, AnimDone }, + { NULL, NULL } + }; + +void Talk::SetUser + ( + Sentient *user + ) + + { + ent_listening = user; + } + +void Talk::AnimDone + ( + Event *ev + ) + + { + turnto.ProcessEvent( EV_Behavior_AnimDone ); + } + +void Talk::Begin + ( + Actor &self + ) + + { + Vector dir; + Vector angles; + const char *anim_name; + + + anim_name = self.animname; + + if ( strncmp( anim_name, "sit_leanover", 12 ) == 0 ) + { + move_allowed = false; + } + else if ( strncmp( anim_name, "sit", 3 ) == 0 ) + { + move_allowed = false; + self.SetAnim( "sit_talk" ); + } + else if ( strncmp( anim_name, "talk_sit_stunned", 15 ) == 0 ) + { + move_allowed = false; + } + else if ( strncmp( anim_name, "talk_headset", 12 ) == 0 ) + { + move_allowed = true; + } + else if ( strncmp( anim_name, "stand_hypnotized", 16 ) == 0 ) + { + move_allowed = false; + } + else if ( strncmp( anim_name, "talk_hipnotic", 13 ) == 0 ) + { + move_allowed = false; + } + else if ( strncmp( anim_name, "rope", 4 ) == 0 ) + { + move_allowed = false; + } + else + { + move_allowed = true; + self.SetAnim( "talk" ); + } + + mode = TALK_MODE_TURN_TO; + original_yaw = self.angles[YAW]; + + dir = ent_listening->centroid - self.centroid; + angles = dir.toAngles(); + yaw = angles[YAW]; + } + +qboolean Talk::Evaluate + ( + Actor &self + ) + + { + Vector dir; + Vector angles; + Event *event; + + if ( !ent_listening ) + mode = TALK_MODE_TURN_BACK; + + switch( mode ) + { + case TALK_MODE_TURN_TO : + if ( move_allowed ) + { + turnto.SetDirection( yaw ); + + if ( !turnto.Evaluate( self ) ) + { + mode = TALK_MODE_TALK; + self.PlayDialog( ent_listening ); + + event = new Event( EV_Player_WatchActor ); + event->AddEntity( &self ); + ent_listening->PostEvent( event, 0.05 ); + } + } + else + { + mode = TALK_MODE_TALK; + self.PlayDialog( ent_listening ); + + event = new Event( EV_Player_WatchActor ); + event->AddEntity( &self ); + ent_listening->PostEvent( event, 0.05 ); + } + break; + case TALK_MODE_TALK : + + if ( move_allowed ) + { + dir = ent_listening->centroid - self.centroid; + angles = dir.toAngles(); + turnto.SetDirection( angles[YAW] ); + turnto.Evaluate( self ); + } + + if ( !self.GetActorFlag( ACTOR_FLAG_DIALOG_PLAYING ) ) + { + mode = TALK_MODE_WAIT; + self.state_flags &= ~STATE_FLAG_USED; + + // Tell player to stop watching us + + event = new Event( EV_Player_StopWatchingActor ); + event->AddEntity( &self ); + ent_listening->PostEvent( event, 0 ); + + ent_listening->CancelEventsOfType( EV_Player_WatchActor ); + } + break; + case TALK_MODE_WAIT : + + if ( move_allowed ) + { + dir = ent_listening->centroid - self.centroid; + angles = dir.toAngles(); + turnto.SetDirection( angles[YAW] ); + turnto.Evaluate( self ); + } + + if ( !self.WithinDistance( ent_listening, 100 ) ) + mode = TALK_MODE_TURN_BACK; + + if ( self.state_flags & STATE_FLAG_USED ) + { + mode = TALK_MODE_TURN_TO; + + dir = ent_listening->centroid - self.centroid; + angles = dir.toAngles(); + yaw = angles[YAW]; + + self.state_flags &= ~STATE_FLAG_USED; + + event = new Event( EV_Player_WatchActor ); + event->AddEntity( &self ); + ent_listening->PostEvent( event, 0.05 ); + } + break; + case TALK_MODE_TURN_BACK : + if ( move_allowed ) + { + turnto.SetDirection( original_yaw ); + + if ( !turnto.Evaluate( self ) ) + return false; + } + else + { + return false; + } + + break; + } + + return true; + } + +void Talk::End + ( + Actor &self + ) + + { + Event *event; + + event = new Event( EV_Player_StopWatchingActor ); + event->AddEntity( &self ); + ent_listening->PostEvent( event, 0 ); + + ent_listening->CancelEventsOfType( EV_Player_WatchActor ); + } + +/**************************************************************************** + + FindCover Class Definition + +****************************************************************************/ + +CLASS_DECLARATION( Behavior, FindCover, NULL ) + { + { &EV_Behavior_Args, SetArgs }, + { NULL, NULL } + }; + +void FindCover::SetArgs + ( + Event *ev + ) + + { + anim = ev->GetString( 1 ); + + if ( ev->NumArgs() > 1 ) + crouch_anim = ev->GetString( 2 ); + } + +PathNode *FindCover::FindCoverNode + ( + Actor &self + ) + + { + int i; + PathNode *bestnode; + float bestdist; + PathNode *desperatebestnode; + float desperatebestdist; + PathNode *node; + FindCoverPath find; + Path *path; + Vector delta; + float dist; + Vector pos; + + pos = self.origin; + + // greater than ( 8192 * sqr(2) ) ^ 2 -- maximum squared distance + bestdist = 999999999; + bestnode = NULL; + + // greater than ( 8192 * sqr(2) ) ^ 2 -- maximum squared distance + desperatebestdist = 999999999; + desperatebestnode = NULL; + + for( i = 0; i <= ai_maxnode; i++ ) + { + node = AI_GetNode( i ); + if ( node && ( node->nodeflags & ( AI_DUCK | AI_COVER ) ) && + ( ( node->occupiedTime <= level.time ) || ( node->entnum == self.entnum ) ) ) + { + // get the distance squared (faster than getting real distance) + delta = node->origin - pos; + dist = delta * delta; + if ( ( dist < bestdist ) && ( !self.CanSeeEnemyFrom( node->origin ) ||//) )//|| + ( ( node->nodeflags & AI_DUCK ) && !self.CanSeeEnemyFrom( node->origin - Vector( 0, 0, 32 ) ) ) ) ) + { + bestnode = node; + bestdist = dist; + } + else if ( ( dist < desperatebestdist ) && ( desperatebestdist > ( 64 * 64 ) ) ) + { + desperatebestnode = node; + desperatebestdist = dist; + } + } + } + + if ( !bestnode ) + { + bestnode = desperatebestnode; + } + + if ( bestnode ) + { + find.heuristic.self = &self; + find.heuristic.setSize( self.size ); + find.heuristic.entnum = self.entnum; + + path = find.FindPath( self.origin, bestnode->origin ); + if ( path ) + { + node = path->End(); + + // Mark node as occupied for a short time + node->occupiedTime = level.time + 1.5; + node->entnum = self.entnum; + + chase.SetGoal( node ); + chase.SetPath( path ); + + return node; + } + } + + return NULL; + } + +void FindCover::ShowInfo + ( + Actor &self + ) + + { + Behavior::ShowInfo( self ); + + gi.Printf( "\nchase:\n" ); + chase.ShowInfo( self ); + + gi.Printf( "\nstate: %d\n", state ); + gi.Printf( "anim: %s\n", anim.c_str() ); + gi.Printf( "nextsearch: %f\n", nextsearch ); + } + +void FindCover::Begin + ( + Actor &self + ) + + { + if ( !anim.length() ) + { + anim = "run"; + } + + if ( !crouch_anim.length() ) + { + crouch_anim = "crouch_down"; + } + + movegoal = NULL; + state = 0; + } + +qboolean FindCover::Evaluate + ( + Actor &self + ) + + { + if ( !movegoal ) + { + state = 0; + } + + switch( state ) + { + case 0 : + // Checking for cover + chase.Begin( self ); + movegoal = FindCoverNode( self ); + if ( !movegoal ) + { + // Couldn't find any! + return false; + } + + // Found cover, going to it + if ( anim.length() && ( anim != self.animname || self.newanim.length() ) ) + { + self.SetAnim( anim ); + } + + state = 1; + nextsearch = level.time + 1; + + case 1 : + if ( chase.Evaluate( self ) ) + { + if ( nextsearch < level.time ) + { + state = 0; + } + return true; + } + + // Reached cover + if ( self.CanSeeEnemyFrom( self.origin ) ) + { + state = 0; + } + + if ( movegoal->nodeflags & AI_DUCK ) + { + // ducking + self.SetAnim( crouch_anim.c_str() ); + } + else + { + // standing + self.SetAnim( "idle" ); + } + + chase.End( self ); + return false; + break; + } + + return true; + } + +void FindCover::End + ( + Actor &self + ) + + { + chase.End( self ); + } + +/**************************************************************************** + + FindFlee Class Definition + +****************************************************************************/ + +CLASS_DECLARATION( Behavior, FindFlee, NULL ) + { + { &EV_Behavior_Args, SetArgs }, + { NULL, NULL } + }; + +void FindFlee::SetArgs + ( + Event *ev + ) + + { + anim = ev->GetString( 1 ); + } + +PathNode *FindFlee::FindFleeNode + ( + Actor &self + ) + + { + int i; + PathNode *bestnode; + float bestdist; + PathNode *desperatebestnode; + float desperatebestdist; + PathNode *node; + FindFleePath find; + Path *path; + Vector delta; + float dist; + Vector pos; + + pos = self.origin; + + // greater than ( 8192 * sqr(2) ) ^ 2 -- maximum squared distance + bestdist = 999999999; + bestnode = NULL; + + // greater than ( 8192 * sqr(2) ) ^ 2 -- maximum squared distance + desperatebestdist = 999999999; + desperatebestnode = NULL; + + for( i = 0; i <= ai_maxnode; i++ ) + { + node = AI_GetNode( i ); + if ( node && ( node->nodeflags & AI_FLEE ) && + ( ( node->occupiedTime <= level.time ) || ( node->entnum == self.entnum ) ) ) + { + // get the distance squared (faster than getting real distance) + delta = node->origin - pos; + dist = delta * delta; + if ( ( dist < bestdist ) && !self.CanSeeEnemyFrom( node->origin ) ) + { + bestnode = node; + bestdist = dist; + } + else if ( ( dist < desperatebestdist ) && ( desperatebestdist > ( 64 * 64 ) ) ) + { + desperatebestnode = node; + desperatebestdist = dist; + } + } + } + + if ( !bestnode ) + { + bestnode = desperatebestnode; + } + + if ( bestnode ) + { + find.heuristic.self = &self; + find.heuristic.setSize( self.size ); + find.heuristic.entnum = self.entnum; + + path = find.FindPath( self.origin, bestnode->origin ); + if ( path ) + { + node = path->End(); + + // Mark node as occupied for a short time + node->occupiedTime = level.time + 1.5; + node->entnum = self.entnum; + + chase.SetGoal( node ); + chase.SetPath( path ); + + return node; + } + } + + return NULL; + } + +void FindFlee::ShowInfo + ( + Actor &self + ) + + { + Behavior::ShowInfo( self ); + + gi.Printf( "\nchase:\n" ); + chase.ShowInfo( self ); + + gi.Printf( "\nstate: %d\n", state ); + gi.Printf( "anim: %s\n", anim.c_str() ); + gi.Printf( "nextsearch: %f\n", nextsearch ); + } + +void FindFlee::Begin + ( + Actor &self + ) + + { + if ( !anim.length() ) + { + anim = "run"; + } + + movegoal = NULL; + state = 0; + } + +qboolean FindFlee::Evaluate + ( + Actor &self + ) + + { + if ( !movegoal ) + { + state = 0; + } + + switch( state ) + { + case 0 : + // Checking for flee node + chase.Begin( self ); + movegoal = FindFleeNode( self ); + if ( !movegoal ) + { + // Couldn't find any! + return false; + } + + // Found flee node, going to it + if ( anim.length() && ( anim != self.animname || self.newanim.length() ) ) + { + self.SetAnim( anim ); + } + + state = 1; + nextsearch = level.time + 1; + + case 1 : + if ( chase.Evaluate( self ) ) + { + if ( nextsearch < level.time ) + { + state = 0; + } + return true; + } + + // Reached cover + if ( self.CanSeeEnemyFrom( self.origin ) ) + { + state = 0; + } + else + { + // standing + self.SetAnim( "idle" ); + chase.End( self ); + return false; + } + break; + } + + return true; + } + +void FindFlee::End + ( + Actor &self + ) + + { + chase.End( self ); + } + +/**************************************************************************** + + FindEnemy Class Definition + +****************************************************************************/ + +CLASS_DECLARATION( Behavior, FindEnemy, NULL ) + { + { &EV_Behavior_Args, SetArgs }, + { NULL, NULL } + }; + +void FindEnemy::SetArgs + ( + Event *ev + ) + + { + anim = ev->GetString( 1 ); + } + +void FindEnemy::ShowInfo + ( + Actor &self + ) + + { + Behavior::ShowInfo( self ); + + gi.Printf( "\nchase:\n" ); + chase.ShowInfo( self ); + + gi.Printf( "\nstate: %d\n", state ); + gi.Printf( "nextsearch: %f\n", nextsearch ); + gi.Printf( "anim: %s\n", anim.c_str() ); + } + +void FindEnemy::Begin + ( + Actor &self + ) + + { + if ( !anim.length() ) + { + anim = "run"; + } + + movegoal = NULL; + lastSearchNode = NULL; + state = 0; + } + +PathNode *FindEnemy::FindClosestSightNode + ( + Actor &self + ) + + { + int i; + PathNode *bestnode; + float bestdist; + PathNode *node; + Vector delta; + float dist; + Vector pos; + + if ( self.currentEnemy ) + { + pos = self.currentEnemy->origin; + } + else + { + pos = self.origin; + } + + // greater than ( 8192 * sqr(2) ) ^ 2 -- maximum squared distance + bestdist = 999999999; + bestnode = NULL; + + for( i = 0; i <= ai_maxnode; i++ ) + { + node = AI_GetNode( i ); + if ( node && ( ( node->occupiedTime <= level.time ) || ( node->entnum != self.entnum ) ) ) + { + // get the distance squared (faster than getting real distance) + delta = node->origin - pos; + dist = delta * delta; + if ( ( dist < bestdist ) && self.CanSeeFrom( node->origin, self.currentEnemy ) ) + { + bestnode = node; + bestdist = dist; + } + } + } + + return bestnode; + } + +qboolean FindEnemy::Evaluate + ( + Actor &self + ) + + { + if ( !self.currentEnemy ) + { + return false; + } + + if ( nextsearch < level.time ) + { + // check if we should search for the first time + if ( !lastSearchNode ) + { + state = 0; + } + else + { + // search less often if we're far away + nextsearch = self.DistanceTo( self.currentEnemy ) * ( 1.0 / 512.0 ); + if ( nextsearch < 1 ) + { + nextsearch = 1; + } + nextsearch += level.time; + + // don't search again if our enemy hasn't moved very far + if ( !self.currentEnemy->WithinDistance( lastSearchPos, 256 ) ) + { + state = 0; + } + } + } + + switch( state ) + { + case 0 : + // Searching for enemy + chase.Begin( self ); + lastSearchPos = self.currentEnemy->origin; + movegoal = PathManager.NearestNode( lastSearchPos, &self ); + if ( !movegoal ) + { + movegoal = PathManager.NearestNode( lastSearchPos, &self, false ); + } + + lastSearchNode = movegoal; + if ( movegoal ) + { + Path *path; + FindEnemyPath find; + PathNode *from; + + find.heuristic.self = &self; + find.heuristic.setSize( self.size ); + find.heuristic.entnum = self.entnum; + + from = PathManager.NearestNode( self.origin, &self ); + if ( ( from == movegoal ) && ( self.DistanceTo( from->origin ) < 8 ) ) + { + movegoal = NULL; + from = NULL; + } + + if ( from ) + { + path = find.FindPath( from, movegoal ); + if ( path ) + { + chase.SetGoal( movegoal ); + chase.SetPath( path ); + } + else + { + movegoal = NULL; + } + } + } + + if ( !movegoal ) + { + if ( self.CanSee( self.currentEnemy ) || ( !self.currentEnemy->groundentity && !self.waterlevel ) ) + { + chase.SetGoalPos( self.currentEnemy->origin ); + } + else + { + // Couldn't find enemy + // since we can't reach em + // clear out enemy state + self.ClearEnemies(); + return false; + } + } + + // Found enemy, going to it + if ( anim.length() && ( anim != self.animname || self.newanim.length() ) ) + { + self.SetAnim( anim ); + } + + state = 1; + + case 1 : + if ( self.CanShoot( self.currentEnemy, false ) ) + { + // Reached enemy + chase.End( self ); + return false; + } + + if ( !chase.Evaluate( self ) ) + { + state = 0; + nextsearch = 0; + } + break; + } + + return true; + } + +void FindEnemy::End + ( + Actor &self + ) + + { + chase.End( self ); + } + +/**************************************************************************** + + AimAndShoot Class Definition + +****************************************************************************/ + +CLASS_DECLARATION( Behavior, AimAndShoot, NULL ) + { + { &EV_Behavior_Args, SetArgs }, + { &EV_Behavior_AnimDone, AnimDone }, + { NULL, NULL } + }; + +AimAndShoot::AimAndShoot() + { + maxshots = 1; + numshots = 0; + } + +void AimAndShoot::ShowInfo + ( + Actor &self + ) + + { + Behavior::ShowInfo( self ); + + gi.Printf( "\naim:\n" ); + aim.ShowInfo( self ); + + gi.Printf( "\nmode: %d\n", mode ); + gi.Printf( "maxshots: %d\n", maxshots ); + gi.Printf( "numshots: %d\n", numshots ); + gi.Printf( "animdone: %d\n", animdone ); + } + +void AimAndShoot::Begin + ( + Actor &self + ) + + { + enemy_health = 0; + animdone = false; + + if ( aimanim.length() ) + { + self.SetAnim( aimanim.c_str() ); + mode = 0; + } + else + { + self.SetAnim( "idle" ); + mode = 1; + } + } + +void AimAndShoot::SetMaxShots + ( + int num + ) + + { + maxshots = (num>>1) + G_Random( num ); + } + +void AimAndShoot::SetArgs + ( + Event *ev + ) + + { + fireanim = ev->GetString( 1 ); + + if ( ev->NumArgs() > 1 ) + { + maxshots = ev->GetInteger ( 2 ); + } + + if ( ev->NumArgs() > 2 ) + { + aimanim = ev->GetString ( 3 ); + } + } + +void AimAndShoot::AnimDone + ( + Event *ev + ) + + { + animdone = true; + } + +qboolean AimAndShoot::Evaluate + ( + Actor &self + ) + + { + Vector dir; + Vector angles; + + switch( mode ) + { + case 0 : + if ( !self.currentEnemy ) + { + return false; + } + + if ( !self.CanShoot( self.currentEnemy, false ) ) + { + return false; + } + + // start Aiming + animdone = false; + if ( aimanim.length() ) + { + self.SetAnim( aimanim.c_str() ); + } + + // + // save off time, in case we aim for too long + // + aim_time = level.time + 1; + mode = 1; + + case 1 : + // Aiming + if ( aimanim.length() ) + { + if ( !self.currentEnemy ) + { + return false; + } + + // see if we aimed for too long + if ( aim_time < level.time ) + { + return false; + } + + aim.SetTarget( self.currentEnemy ); + + if ( aim.Evaluate( self ) ) + { + break; + } + } + else + { + if ( self.IsEntityAlive( self.currentEnemy ) ) + { + dir = self.currentEnemy->centroid - self.origin; + angles = dir.toAngles(); + + self.angles[YAW] = angles[YAW]; + self.setAngles( self.angles ); + } + } + + // don't go into our firing animation until our weapon is ready, and we are on target + if ( self.currentEnemy && self.CanShoot( self.currentEnemy, true ) ) + { + animdone = false; + self.Chatter( "snd_inmysights", 5 ); + self.SetAnim( fireanim.c_str(), EV_Actor_NotifyBehavior ); + enemy_health = self.currentEnemy->health; + mode = 2; + } + else if ( !self.currentEnemy || self.currentEnemy->deadflag || + ( self.currentEnemy->health <= 0 ) || !self.CanShoot( self.currentEnemy, false ) ) + { + // either our enemy is dead, or we can't shoot the enemy from here + return false; + } + break; + + case 2 : + // Fire + if ( animdone ) + { + aim.SetTarget( self.currentEnemy ); + aim.Evaluate( self ); + + self.times_done++; + + if ( !self.currentEnemy || ( self.currentEnemy->health < enemy_health ) ) + { + self.Chatter( "snd_attacktaunt", 4 ); + } + else + { + self.Chatter( "snd_missed", 7 ); + } + + animdone = false; + numshots++; + + if ( ( numshots >= maxshots ) || !self.currentEnemy || self.currentEnemy->deadflag || + ( self.currentEnemy->health <= 0 ) || !self.CanShoot( self.currentEnemy, false ) ) + { + // either we're out of shots, our enemy is dead, or we can't shoot the enemy from here + + return false; + } + else if ( !self.CanShoot( self.currentEnemy, false ) ) + { + // weapon not ready or not aimed at enemy, so just keep trying to get enemy in our sights + if ( aimanim.length() ) + { + self.SetAnim( aimanim.c_str() ); + } + // + // save off time, in case we aim for too long + // + aim_time = level.time + 1; + mode = 1; + } + else + { + // keep firing + self.SetAnim( fireanim.c_str(), EV_Actor_NotifyBehavior ); + enemy_health = self.currentEnemy->health; + } + } + break; + } + + return true; + } + +void AimAndShoot::End + ( + Actor &self + ) + + { + aim.End( self ); + //self.SetAnim( "idle" ); + } + +/**************************************************************************** + + AimAndMelee Class Definition + +****************************************************************************/ + +CLASS_DECLARATION( Behavior, AimAndMelee, NULL ) + { + { &EV_Behavior_Args, SetArgs }, + { &EV_Behavior_AnimDone, AnimDone }, + { NULL, NULL } + }; + +AimAndMelee::AimAndMelee() + { + maxshots = 1; + anim_name = "melee"; + } + +void AimAndMelee::ShowInfo + ( + Actor &self + ) + + { + Behavior::ShowInfo( self ); + + gi.Printf( "\naim:\n" ); + aim.ShowInfo( self ); + + gi.Printf( "\nmode: %d\n", mode ); + gi.Printf( "maxshots: %d\n", maxshots ); + gi.Printf( "numshots: %d\n", numshots ); + gi.Printf( "animdone: %d\n", animdone ); + } + +void AimAndMelee::Begin + ( + Actor &self + ) + + { + mode = 0; + numshots = 0; + animdone = false; + + self.SetAnim( "idle" ); + } + +void AimAndMelee::SetArgs + ( + Event *ev + ) + + { + anim_name = ev->GetString( 1 ); + + if ( ev->NumArgs() > 1 ) + { + maxshots = ev->GetInteger( 2 ); + } + } + +void AimAndMelee::AnimDone + ( + Event *ev + ) + + { + animdone = true; + } + +qboolean AimAndMelee::Evaluate + ( + Actor &self + ) + + { + Vector dir; + + switch( mode ) + { + case 0 : + if ( !self.currentEnemy ) + { + return false; + } + + if ( self.IsEntityAlive( self.currentEnemy ) ) + { + dir = self.currentEnemy->centroid - self.origin; + self.angles[YAW] = dir.toYaw(); + self.setAngles( self.angles ); + } + + numshots++; + animdone = false; + + // melee + self.SetAnim( anim_name.c_str() , EV_Actor_NotifyBehavior ); + self.Chatter( "snd_attacktaunt", 4 ); + mode = 1; + + case 1 : + // finish up the attack + if ( animdone ) + { + self.times_done++; + if ( numshots >= maxshots ) + { + return false; + } + + mode = 0; + } + break; + } + + return true; + } + +void AimAndMelee::End + ( + Actor &self + ) + + { + aim.End( self ); + } + +/**************************************************************************** + + JumpToPathNode Class Definition + +****************************************************************************/ + +CLASS_DECLARATION( Behavior, JumpToPathNode, NULL ) + { + { &EV_Behavior_Args, SetArgs }, + { NULL, NULL } + }; + +void JumpToPathNode::SetArgs + ( + Event *ev + ) + { + Entity *ent; + + + movegoal = AI_FindNode( ev->GetString( 1 ) ); + + if ( movegoal ) + jump.SetGoal( movegoal->targetname ); + else + { + ent = ev->GetEntity( 1 ); + + if ( ent ) + jump.SetEntity( ent ); + } + + if ( ev->NumArgs() > 1 ) + jump.SetSpeed( ev->GetFloat( 2 ) ); + else + jump.SetSpeed( 200 ); + } + +void JumpToPathNode::Begin + ( + Actor &self + ) + + { + jump.Begin( self ); + } + +qboolean JumpToPathNode::Evaluate + ( + Actor &self + ) + + { + return jump.Evaluate( self ); + } + +void JumpToPathNode::End + ( + Actor &self + ) + + { + jump.End( self ); + } + +/**************************************************************************** + + FlyToPoint Class Definition + +****************************************************************************/ + + +CLASS_DECLARATION( Behavior, FlyToPoint, NULL ) + { + { NULL, NULL } + }; + +FlyToPoint::FlyToPoint() + { + turn_speed = 10.0; + speed = 480.0; + random_allowed = true; + force_goal = false; + } + +void FlyToPoint::SetTurnSpeed( float new_turn_speed ) + { + turn_speed = new_turn_speed; + } + +void FlyToPoint::SetGoalPoint( Vector goal_point ) + { + if ( goal_point != goal ) + avoidtime = 0; + + goal = goal_point; + } + +void FlyToPoint::SetRandomAllowed( qboolean allowed ) + { + random_allowed = allowed; + } + +void FlyToPoint::SetSpeed( float speed_value ) + { + speed = speed_value; + } + +void FlyToPoint::ForceGoal( void ) + { + force_goal = true; + } + +void FlyToPoint::ShowInfo + ( + Actor &self + ) + + { + Behavior::ShowInfo( self ); + } + +void FlyToPoint::Begin + ( + Actor &self + ) + + { + avoidtime = 0; + old_forward_speed = self.forwardspeed; + stuck = 0; + use_temp_goal = false; + } + +qboolean FlyToPoint::Evaluate + ( + Actor &self + ) + + { + trace_t trace; + Vector dir; + Vector ang; + float time; + float length; + float old_yaw; + float old_pitch; + + if ( self.lastmove != STEPMOVE_OK ) + stuck++; + else + stuck = 0; + + if ( stuck > 2 || ( avoidtime <= level.time ) ) + { + time = G_Random( .3 ) + .3; + + use_temp_goal = false; + + if ( !force_goal ) + { + trace = G_Trace( self.origin, self.mins, self.maxs, goal, &self, self.edict->clipmask, false, "FlyToPoint" ); + + if ( trace.fraction < 0.5f || stuck > 2 ) + { + temp_goal = ChooseRandomDirection( self, goal, &time, MASK_WATER, true ); + use_temp_goal = true; + avoidtime = level.time + time; + + stuck = 0; + } + else + { + goal = trace.endpos; + avoidtime = level.time + time; + } + } + else + { + avoidtime = level.time + time; + } + + if ( use_temp_goal ) + dir = temp_goal - self.origin; + else + dir = goal - self.origin; + + length = dir.length(); + dir.normalize(); + ang = dir.toAngles(); + + if ( length > 150 && random_allowed && !use_temp_goal ) + { + ang[YAW] += G_Random( 20 ) - 10.0; + ang[PITCH] += G_Random( 20 ) - 10.0; + } + + target_angle = ang; + + target_angle[YAW] = AngleNormalize360( target_angle[YAW] ); + target_angle[PITCH] = AngleNormalize360( target_angle[PITCH] ); + } + + if ( (self.angles[YAW] != target_angle[YAW]) || (self.angles[PITCH] != target_angle[PITCH]) ) + { + self.forwardspeed = speed * 0.8f; + } + else + { + self.forwardspeed = speed; + } + + old_yaw = self.angles[YAW]; + old_pitch = self.angles[PITCH]; + + ang[YAW] = LerpAngle( self.angles[YAW], target_angle[YAW], turn_speed ); + ang[PITCH] = LerpAngle( self.angles[PITCH], target_angle[PITCH], turn_speed ); + ang[ROLL] = self.angles[ROLL]; + + if ( (AngleDelta( ang[YAW], old_yaw ) > 0) && (ang[ROLL] > 315 || ang[ROLL] <= 45) ) + { + ang[ROLL] -= 5; + } + else if ( (AngleDelta( ang[YAW], old_yaw ) < 0) && (ang[ROLL] < 45 || ang[ROLL] >= 315) ) + { + ang[ROLL] += 5; + } + else if ( AngleDelta( ang[YAW], old_yaw ) == 0 ) + { + if ( ang[ROLL] != 0 ) + { + if ( ang[ROLL] < 180 ) + ang[ROLL] -= 5; + else + ang[ROLL] += 5; + } + } + + ang[YAW] = AngleNormalize360( ang[YAW] ); + ang[PITCH] = AngleNormalize360( ang[PITCH] ); + ang[ROLL] = AngleNormalize360( ang[ROLL] ); + + // Don't get stuck if still turning + + if ( ( AngleDelta( ang[YAW], old_yaw ) > .5 ) || ( AngleDelta( ang[YAW], old_yaw ) < -.5 ) || + ( AngleDelta( ang[PITCH], old_pitch ) > .5 ) || ( AngleDelta( ang[PITCH], old_pitch ) < -.5 ) ) + { + stuck = 0; + } + + self.setAngles( ang ); + + return true; + } + +float FlyToPoint::LerpAngle( float old_angle, float new_angle, float lerp_amount ) + { + float diff; + float abs_diff; + float lerp_angle; + + new_angle = AngleNormalize360( new_angle ); + old_angle = AngleNormalize360( old_angle ); + + diff = new_angle - old_angle; + + if ( diff > 180 ) + { + diff -= 360; + } + + if ( diff < -180 ) + { + diff += 360; + } + + lerp_angle = old_angle; + + abs_diff = diff; + + if ( abs_diff < 0 ) + { + abs_diff = -abs_diff; + } + + if ( abs_diff < lerp_amount ) + { + lerp_amount = abs_diff; + } + + if ( diff < 0 ) + { + lerp_angle -= lerp_amount; + } + else if ( diff > 0 ) + { + lerp_angle += lerp_amount; + } + + lerp_angle = AngleNormalize360( lerp_angle ); + + return lerp_angle; + } + +void FlyToPoint::End + ( + Actor &self + ) + + { + self.forwardspeed = old_forward_speed; + } + +/**************************************************************************** + + FlyCloseToEnemy Class Definition + +****************************************************************************/ + + +CLASS_DECLARATION( Behavior, FlyCloseToEnemy, NULL ) + { + { &EV_Behavior_Args, SetArgs }, + { NULL, NULL } + }; + +FlyCloseToEnemy::FlyCloseToEnemy() + { + speed = 0; + turn_speed = 10.0; + anim = "fly"; + } + +void FlyCloseToEnemy::SetArgs + ( + Event *ev + ) + + { + anim = ev->GetString( 1 ); + + if ( ev->NumArgs() > 1 ) + turn_speed = ev->GetFloat( 2 ); + + if ( ev->NumArgs() > 2 ) + speed = ev->GetFloat( 3 ); + } + +void FlyCloseToEnemy::ShowInfo + ( + Actor &self + ) + + { + Behavior::ShowInfo( self ); + } + +void FlyCloseToEnemy::Begin + ( + Actor &self + ) + + { + if ( anim.length() ) + { + self.SetAnim( anim ); + } + + fly.Begin( self ); + fly.SetTurnSpeed( turn_speed ); + + if ( speed ) + fly.SetSpeed( speed ); + + next_goal_time = 0; + } + +qboolean FlyCloseToEnemy::Evaluate + ( + Actor &self + ) + + { + Vector goal; + + + if ( !self.IsEntityAlive( self.currentEnemy ) ) + return false; + + if ( next_goal_time <= level.time ) + { + goal = self.currentEnemy->centroid; + + goal[0] += G_Random( 30 ) - 15.0; + goal[1] += G_Random( 30 ) - 15.0; + goal[2] += G_Random( 60 ) - 30.0; + + fly.SetGoalPoint( goal ); + + next_goal_time = level.time + .5; + } + + fly.Evaluate( self ); + + return true; + } + +void FlyCloseToEnemy::End + ( + Actor &self + ) + + { + fly.End( self ); + } + +/**************************************************************************** + + FlyCloseToPlayer Class Definition + +****************************************************************************/ + + +CLASS_DECLARATION( Behavior, FlyCloseToPlayer, NULL ) + { + { &EV_Behavior_Args, SetArgs }, + { NULL, NULL } + }; + +FlyCloseToPlayer::FlyCloseToPlayer() + { + speed = 0; + turn_speed = 10.0; + anim = "fly"; + } + +void FlyCloseToPlayer::SetArgs + ( + Event *ev + ) + + { + anim = ev->GetString( 1 ); + + if ( ev->NumArgs() > 1 ) + turn_speed = ev->GetFloat( 2 ); + + if ( ev->NumArgs() > 2 ) + speed = ev->GetFloat( 3 ); + } + +void FlyCloseToPlayer::ShowInfo + ( + Actor &self + ) + + { + Behavior::ShowInfo( self ); + } + +void FlyCloseToPlayer::Begin + ( + Actor &self + ) + + { + if ( anim.length() ) + { + self.SetAnim( anim ); + } + + fly.Begin( self ); + fly.SetTurnSpeed( turn_speed ); + + if ( speed ) + fly.SetSpeed( speed ); + + next_goal_time = 0; + } + +qboolean FlyCloseToPlayer::Evaluate + ( + Actor &self + ) + + { + Vector goal; + Entity *player; + + + player = g_entities[ 0 ].entity; + + + if ( !self.IsEntityAlive( player ) ) + return false; + + if ( next_goal_time <= level.time ) + { + goal = player->centroid; + + goal[0] += G_Random( 30 ) - 15.0; + goal[1] += G_Random( 30 ) - 15.0; + goal[2] += G_Random( 60 ) - 30.0; + + fly.SetGoalPoint( goal ); + + next_goal_time = level.time + .5; + } + + fly.Evaluate( self ); + + return true; + } + +void FlyCloseToPlayer::End + ( + Actor &self + ) + + { + fly.End( self ); + } + +/**************************************************************************** + + FlyWander Class Definition + +****************************************************************************/ + + +CLASS_DECLARATION( Behavior, FlyWander, NULL ) + { + { &EV_Behavior_Args, SetArgs }, + { NULL, NULL } + }; + +FlyWander::FlyWander() + { + turn_speed = 10.0; + anim = "fly"; + change_course_time = 5.0; + speed = 200; + try_to_go_up = false; + } + +void FlyWander::SetArgs + ( + Event *ev + ) + + { + anim = ev->GetString( 1 ); + + if ( ev->NumArgs() > 1 ) + { + speed = ev->GetFloat( 2 ); + } + + if ( ev->NumArgs() > 2 ) + { + turn_speed = ev->GetFloat( 3 ); + } + + if ( ev->NumArgs() > 3 ) + { + change_course_time = ev->GetFloat( 4 ); + } + + if ( ev->NumArgs() > 4 ) + { + try_to_go_up = ev->GetFloat( 5 ); + } + } + +void FlyWander::ShowInfo + ( + Actor &self + ) + + { + Behavior::ShowInfo( self ); + } + +void FlyWander::Begin + ( + Actor &self + ) + + { + next_change_course_time = 0; + + original_z = self.origin.z; + + if ( anim.length() ) + self.SetAnim( anim ); + + fly.Begin( self ); + fly.SetTurnSpeed( turn_speed ); + fly.SetSpeed( speed ); + } + +qboolean FlyWander::Evaluate + ( + Actor &self + ) + + { + trace_t trace; + Vector dir; + float length; + int goal_try; + Vector temp_goal; + float max_dist = 0; + + + dir = goal - self.origin; + length = dir.length(); + + if ( next_change_course_time <= level.time || length < 100 ) //self.lastmove != STEPMOVE_OK ) + { + for( goal_try = 0 ; goal_try < 5 ; goal_try++ ) + { + temp_goal = self.origin; + + temp_goal[0] += G_Random( 10000 ) - 5000.0; + temp_goal[1] += G_Random( 10000 ) - 5000.0; + + if ( try_to_go_up ) + temp_goal[2] += G_Random( 1000 ) - 250.0; + else + temp_goal[2] += G_Random( 100 ) - 50.0; + + trace = G_Trace( self.origin, self.mins, self.maxs, temp_goal, &self, self.edict->clipmask, false, "FlyWander" ); + + temp_goal = trace.endpos; + + dir = temp_goal - self.origin; + length = dir.length(); + + if ( length > max_dist ) + { + max_dist = length; + goal = temp_goal; + + if ( length > 1000 ) + break; + } + } + + fly.SetGoalPoint( goal ); + + next_change_course_time = level.time + change_course_time; + } + + fly.Evaluate( self ); + + return true; + } + +void FlyWander::End + ( + Actor &self + ) + + { + fly.End( self ); + } + +/**************************************************************************** + + FlyCircle Class Definition + +****************************************************************************/ + + +CLASS_DECLARATION( Behavior, FlyCircle, NULL ) + { + { &EV_Behavior_Args, SetArgs }, + { NULL, NULL } + }; + +FlyCircle::FlyCircle() + { + anim = "fly"; + } + +void FlyCircle::SetArgs + ( + Event *ev + ) + + { + anim = ev->GetString( 1 ); + + fly_clockwise = ev->GetBoolean( 2 ); + } + +void FlyCircle::ShowInfo + ( + Actor &self + ) + + { + Behavior::ShowInfo( self ); + } + +void FlyCircle::Begin + ( + Actor &self + ) + + { + original_z = self.origin.z; + + if ( anim.length() ) + { + self.SetAnim( anim ); + } + + fly.Begin( self ); + fly.SetTurnSpeed( 5.0 ); + } + +qboolean FlyCircle::Evaluate + ( + Actor &self + ) + + { + Vector goal; + trace_t trace; + Vector dir; + Vector angle; + Vector left; + qboolean too_far = false; + Vector new_dir; + Vector fly_dir; + + if ( !self.IsEntityAlive( self.currentEnemy ) ) + { + return false; + } + + if ( self.lastmove == STEPMOVE_OK ) + { + fly.SetTurnSpeed( 5.0 ); + + dir = self.currentEnemy->centroid - self.origin; + dir.z = 0; + + if ( dir.length() > (self.origin.z - self.currentEnemy->centroid.z) / 2 ) + { + too_far = true; + } + + angle = dir.toAngles(); + + angle.AngleVectors( NULL, &left, NULL ); + + if ( fly_clockwise ) + fly_dir = left; + else + fly_dir = left * -1; + + dir.normalize(); + + if ( too_far ) + { + new_dir = fly_dir * 0.5 + dir * 0.5; + new_dir.normalize(); + } + else + { + new_dir = fly_dir; + } + + goal = self.origin + new_dir * 200; + + trace = G_Trace( self.origin, self.mins, self.maxs, goal, &self, self.edict->clipmask, false, "FlyCircle" ); + + if ( trace.fraction < 1 ) + { + if ( too_far ) + trace.fraction /= 2; + + new_dir = fly_dir * trace.fraction + dir * (1 - trace.fraction); + new_dir.normalize(); + + goal = self.origin + new_dir * 200; + } + else + { + goal = trace.endpos; + } + + fly.SetGoalPoint( goal ); + } + else + { + fly.SetTurnSpeed( 20.0 ); + } + + fly.Evaluate( self ); + + return true; + } + +void FlyCircle::End + ( + Actor &self + ) + + { + fly.End( self ); + } + +/**************************************************************************** + + FlyDive Class Definition + +****************************************************************************/ + + +CLASS_DECLARATION( Behavior, FlyDive, NULL ) + { + { &EV_Behavior_Args, SetArgs }, + { NULL, NULL } + }; + +FlyDive::FlyDive() + { + anim = "fly"; + speed = 2000; + damage = 10; + } + +void FlyDive::SetArgs + ( + Event *ev + ) + + { + anim = ev->GetString( 1 ); + + if ( ev->NumArgs() > 1 ) + { + speed = ev->GetFloat( 2 ); + } + + if ( ev->NumArgs() > 2 ) + { + damage = ev->GetFloat( 3 ); + } + } + +void FlyDive::ShowInfo + ( + Actor &self + ) + + { + Behavior::ShowInfo( self ); + } + +void FlyDive::Begin + ( + Actor &self + ) + + { + if ( anim.length() ) + self.SetAnim( anim ); + + fly.Begin( self ); + + if ( !self.IsEntityAlive( self.currentEnemy ) ) + { + return; + } + + goal = self.currentEnemy->centroid - self.origin; + goal.normalize(); + goal *= 10000; + goal += self.origin; + + fly.SetGoalPoint( goal ); + + fly.SetTurnSpeed( 100 ); + fly.SetSpeed( speed ); + fly.SetRandomAllowed( false ); + fly.ForceGoal(); + } + +qboolean FlyDive::Evaluate + ( + Actor &self + ) + + { + trace_t trace; + Vector dir; + Entity *hit_entity; + qboolean stuck; + + + if ( !self.IsEntityAlive( self.currentEnemy ) ) + return false; + + if ( self.origin.z < self.currentEnemy->origin.z - 100 ) + return false; + + if ( self.lastmove == STEPMOVE_STUCK || self.lastmove == STEPMOVE_BLOCKED_BY_WATER ) + { + stuck = true; + + dir = self.movedir * 100; + + trace = G_Trace( self.origin, self.mins, self.maxs, self.origin + dir, &self, self.edict->clipmask, false, "FlyDive" ); + + if ( trace.entityNum != ENTITYNUM_NONE ) + { + hit_entity = G_GetEntity( trace.entityNum ); + + // Damage entity hit + //if ( hit_entity->isSubclassOf( Sentient ) ) + if ( hit_entity->takedamage ) + { + //hit_entity->Damage( &self, &self, damage, Vector (0, 0, 0), Vector (0, 0, 0), Vector (0, 0, 0), 0, 0, MOD_CRUSH ); + dir.normalize(); + hit_entity->Damage( &self, &self, damage, self.centroid, dir, vec_zero, 0, 0, MOD_CRUSH ); + self.AddStateFlag( STATE_FLAG_MELEE_HIT ); + stuck = false; + } + } + + // Make sure we really are still stuck + + if ( trace.fraction > 0.05 ) + stuck = false; + + self.angles[PITCH] = 0; + self.setAngles( self.angles ); + + if ( stuck ) + self.AddStateFlag( STATE_FLAG_STUCK ); + + return false; + } + + fly.Evaluate( self ); + + return true; + } + +void FlyDive::End + ( + Actor &self + ) + + { + fly.End( self ); + } + +/**************************************************************************** + + FlyClimb Class Definition + +****************************************************************************/ + + +CLASS_DECLARATION( Behavior, FlyClimb, NULL ) + { + { &EV_Behavior_Args, SetArgs }, + { NULL, NULL } + }; + +FlyClimb::FlyClimb() + { + anim = "fly"; + height = 500; + speed = 0; + } + +void FlyClimb::SetArgs + ( + Event *ev + ) + + { + anim = ev->GetString( 1 ); + + if ( ev->NumArgs() > 1 ) + height = ev->GetFloat( 2 ); + + if ( ev->NumArgs() > 2 ) + speed = ev->GetFloat( 3 ); + } + +void FlyClimb::ShowInfo + ( + Actor &self + ) + + { + Behavior::ShowInfo( self ); + } + +void FlyClimb::Begin + ( + Actor &self + ) + + { + if ( anim.length() ) + { + self.SetAnim( anim ); + } + + fly.Begin( self ); + + if ( self.currentEnemy ) + height = self.currentEnemy->origin.z + height; + else + height = self.origin.z + height; + + goal = self.origin; + goal.z = height; + + fly.SetTurnSpeed( 10 ); + + fly.SetGoalPoint( goal ); + + next_height_check = level.time + 2.0; + last_check_height = self.origin.z; + + if ( speed ) + fly.SetSpeed( speed ); + } + +qboolean FlyClimb::Evaluate + ( + Actor &self + ) + + { + + if ( self.origin.z >= height ) + { + return false; + } + + if ( next_height_check < level.time ) + { + if ( self.origin.z < last_check_height + 25 ) + return false; + + next_height_check = level.time + 2.0; + last_check_height = self.origin.z; + } + + if ( self.lastmove == STEPMOVE_OK ) + fly.SetGoalPoint( goal ); + + fly.Evaluate( self ); + + return true; + } + +void FlyClimb::End + ( + Actor &self + ) + + { + fly.End( self ); + } + +/**************************************************************************** + + Land Class Definition + +****************************************************************************/ + + +CLASS_DECLARATION( Behavior, Land, NULL ) + { + { &EV_Behavior_Args, SetArgs }, + { NULL, NULL } + }; + +Land::Land() + { + anim = "fly"; + } + +void Land::SetArgs + ( + Event *ev + ) + + { + anim = ev->GetString( 1 ); + } + +void Land::ShowInfo + ( + Actor &self + ) + + { + Behavior::ShowInfo( self ); + } + +void Land::Begin + ( + Actor &self + ) + + { + if ( anim.length() ) + { + self.SetAnim( anim ); + } + + self.velocity = "0 0 -20"; + } + +qboolean Land::Evaluate + ( + Actor &self + ) + + { + self.angles[PITCH] = 0; + self.angles[ROLL] = 0; + + self.setAngles( self.angles ); + + self.velocity.z -= 20; + + if ( self.velocity.z < -200 ) + { + self.velocity.z = -200; + } + + return !self.groundentity; + } + +void Land::End + ( + Actor &self + ) + + { + } + +/**************************************************************************** + + Wander Class Definition + +****************************************************************************/ + + +CLASS_DECLARATION( Behavior, Wander, NULL ) + { + { &EV_Behavior_Args, SetArgs }, + { NULL, NULL } + }; + +void Wander::SetArgs + ( + Event *ev + ) + + { + anim = ev->GetString( 1 ); + } + +void Wander::ShowInfo + ( + Actor &self + ) + + { + Behavior::ShowInfo( self ); + + gi.Printf( "\nseek:\n" ); + seek.ShowInfo( self ); + + //gi.Printf( "\navoid:\n" ); + //avoid.ShowInfo( self ); + } + +void Wander::Begin + ( + Actor &self + ) + + { + avoidtime = 0; + avoidvec = vec_zero; + + //avoid.Begin( self ); + seek.Begin( self ); + seek.SetTargetVelocity( vec_zero ); + if ( anim.length() ) + { + self.SetAnim( anim ); + } + } + + +qboolean Wander::Evaluate + ( + Actor &self + ) + + { + if ( ( self.lastmove != STEPMOVE_OK ) || ( avoidtime <= level.time ) ) + { + Vector dir; + Vector ang; + float time; + + time = 5; + //self.Chatter( "snd_idle", 4 ); + avoidvec = ChooseRandomDirection( self, avoidvec, &time, 0, false ); + avoidtime = level.time + time; + } + + if ( self.movespeed != 1 ) + seek.SetMaxSpeed( self.movespeed ); + else + seek.SetMaxSpeed( 100 ); + + seek.SetPosition( self.origin ); + seek.SetDir( self.movedir ); + seek.SetTargetPosition( avoidvec ); + + if ( !seek.Evaluate( self ) ) + { + // we have reached the goal, re-evaluate + avoidtime = 0; + } + + /* avoid.SetMaxSpeed( self.movespeed * 2 ); + avoid.SetPosition( self.origin ); + avoid.SetDir( self.movedir ); + avoid.Evaluate( self ); */ + + //self.Accelerate( seek.steeringforce + avoid.steeringforce ); + + self.Accelerate( seek.steeringforce ); + + return true; + } + +void Wander::End + ( + Actor &self + ) + + { + //avoid.End( self ); + seek.End( self ); + } + +/**************************************************************************** + + GetCloseToEnemy Class Definition + +****************************************************************************/ + +CLASS_DECLARATION( Behavior, GetCloseToEnemy, NULL ) + { + { &EV_Behavior_Args, SetArgs }, + { NULL, NULL } + }; + +void GetCloseToEnemy::SetArgs + ( + Event *ev + ) + + { + anim = ev->GetString( 1 ); + + if ( ev->NumArgs() > 1 ) + forever = ev->GetBoolean( 2 ); + else + forever = true; + } + +void GetCloseToEnemy::ShowInfo + ( + Actor &self + ) + + { + Behavior::ShowInfo( self ); + + gi.Printf( "\nchase:\n" ); + chase.ShowInfo( self ); + } + +void GetCloseToEnemy::Begin + ( + Actor &self + ) + + { + if ( !anim.length() ) + { + anim = "run"; + } + + if ( anim != self.animname || self.newanim.length() ) + { + self.SetAnim( anim, EV_Actor_NotifyBehavior ); + } + + chase.UseNearestNode( false ); + chase.Begin( self ); + wander.Begin( self ); + + next_think_time = 0; + } + +qboolean GetCloseToEnemy::Evaluate + ( + Actor &self + ) + + { + qboolean result; + + if ( !self.currentEnemy ) + return false; + + if ( next_think_time <= level.time ) + { + if ( self.groundentity && self.groundentity->s.number == self.currentEnemy->entnum ) + { + wander.Evaluate( self ); + result = true; + } + else + { + chase.SetTarget( self.currentEnemy ); + + result = chase.Evaluate( self ); + } + + if ( self.GetActorFlag( ACTOR_FLAG_SIMPLE_PATHFINDING ) ) + next_think_time = level.time + 2 * FRAMETIME; + else + next_think_time = 0; + } + else + result = true; + + if ( !forever && !result ) + return false; + + return true; + } + +void GetCloseToEnemy::End + ( + Actor &self + ) + + { + chase.End( self ); + wander.End( self ); + } + +/**************************************************************************** + + GotoDeadEnemy Class Definition + +****************************************************************************/ + +CLASS_DECLARATION( Behavior, GotoDeadEnemy, NULL ) + { + { &EV_Behavior_Args, SetArgs }, + { NULL, NULL } + }; + +void GotoDeadEnemy::SetArgs + ( + Event *ev + ) + + { + anim = ev->GetString( 1 ); + } + +void GotoDeadEnemy::ShowInfo + ( + Actor &self + ) + + { + Behavior::ShowInfo( self ); + + gi.Printf( "\nchase:\n" ); + chase.ShowInfo( self ); + } + +void GotoDeadEnemy::Begin + ( + Actor &self + ) + + { + if ( !anim.length() ) + { + anim = "run"; + } + + if ( anim != self.animname || self.newanim.length() ) + { + self.SetAnim( anim, EV_Actor_NotifyBehavior ); + } + + chase.Begin( self ); + } + +qboolean GotoDeadEnemy::Evaluate + ( + Actor &self + ) + + { + qboolean result; + + if ( !self.currentEnemy ) + return false; + + if ( !self.currentEnemy->deadflag ) + return false; + + chase.SetGoalPos( self.currentEnemy->origin ); + + result = chase.Evaluate( self ); + + if ( !result ) + return false; + + return true; + } + +void GotoDeadEnemy::End + ( + Actor &self + ) + + { + chase.End( self ); + } + +/**************************************************************************** + + Investigate Class Definition + +****************************************************************************/ + +CLASS_DECLARATION( Behavior, Investigate, NULL ) + { + { &EV_Behavior_Args, SetArgs }, + { NULL, NULL } + }; + +#define INVESTIGATE_MODE_INVESTIGATE 0 +#define INVESTIGATE_MODE_TURN1 1 +#define INVESTIGATE_MODE_RETURN 2 +#define INVESTIGATE_MODE_TURN2 3 + +Investigate::Investigate() + { + investigate_time = 10; + anim = "run"; + } + +void Investigate::SetArgs + ( + Event *ev + ) + + { + anim = ev->GetString( 1 ); + + if ( ev->NumArgs() > 1 ) + investigate_time = ev->GetFloat( 2 ); + + if ( ev->NumArgs() > 2 ) + return_to_original_location = ev->GetBoolean( 3 ); + else + return_to_original_location = true; + } + +void Investigate::ShowInfo + ( + Actor &self + ) + + { + Behavior::ShowInfo( self ); + + gi.Printf( "\nchase:\n" ); + chase.ShowInfo( self ); + gi.Printf( "\nanim: %s\n", anim.c_str() ); + gi.Printf( "curioustime: %f\n", curioustime ); + gi.Printf( "goal: ( %f, %f, %f )\n", goal.x, goal.y, goal.z ); + } + +void Investigate::Begin + ( + Actor &self + ) + + { + trace_t trace; + Vector trace_start_pos; + Vector trace_end_pos; + PathNode *goal_node; + Vector delta; + float xydist; + + + // Find the goal position + + trace_start_pos = self.noise_position; + trace_end_pos = trace_start_pos - "0 0 1000"; + + trace = G_Trace( trace_start_pos, vec_zero, vec_zero, trace_end_pos, NULL, MASK_SOLID, false, "Investigate" ); + + goal = trace.endpos; + + // Find the nearest node to our goal + + goal_node = self.NearestNodeInPVS( goal ); + real_goal_position = self.noise_position; + + if ( goal_node ) + goal = goal_node->origin; + + self.SetActorFlag( ACTOR_FLAG_INVESTIGATING, true ); + + // We are only interested for a short period, if we can't get there, lets go back to what we were doing + + curioustime = level.time + investigate_time; + self.Chatter( "snd_investigate", 10 ); + + chase.Begin( self ); + chase.SetGoal( goal_node ); + + turnto.Begin( self ); + + // Don't allow guys to change their anim if we're already close enough to the goal + + delta = goal - self.origin; + delta.z = 0; + + xydist = delta.length(); + + if ( xydist >= 100 && anim.length() ) + { + self.SetAnim( anim ); + } + + mode = INVESTIGATE_MODE_INVESTIGATE; + + start_pos = self.origin; + start_yaw = self.angles[YAW]; + } + +qboolean Investigate::Evaluate + ( + Actor &self + ) + + { + Vector dir; + Vector angles; + Vector delta; + float xydist; + + + switch ( mode ) + { + case INVESTIGATE_MODE_INVESTIGATE : + + // Go to spot where the noise was heard + + if ( !chase.Evaluate( self ) ) + { + mode = INVESTIGATE_MODE_TURN1; + self.SetAnim( "idle" ); + } + + // See if we have investigated long enough + + if ( curioustime < level.time ) + { + mode = INVESTIGATE_MODE_RETURN; + curioustime = level.time + investigate_time * 2; + } + else + { + // See if have gotten close enough to the noise position + + delta = goal - self.origin; + delta.z = 0; + + xydist = delta.length(); + + if ( xydist < 100 ) + { + mode = INVESTIGATE_MODE_TURN1; + self.SetAnim( "idle" ); + } + } + + break; + case INVESTIGATE_MODE_TURN1 : + + // Turn towards the noise position + + dir = real_goal_position - self.origin; + angles = dir.toAngles(); + turnto.SetDirection( angles[YAW] ); + + if ( !turnto.Evaluate( self ) ) + { + mode = INVESTIGATE_MODE_RETURN; + curioustime = level.time + investigate_time * 2; + self.SetAnim( anim ); + } + + break; + case INVESTIGATE_MODE_RETURN : + + if ( !return_to_original_location ) + return false; + + // Return back to our original position + + chase.SetGoalPos( start_pos ); + + if ( !chase.Evaluate( self ) ) + mode = INVESTIGATE_MODE_TURN2; + + if ( curioustime < level.time ) + return false; + + break; + case INVESTIGATE_MODE_TURN2 : + + self.SetAnim( "idle" ); + + // Turn back to our original direction + + turnto.SetDirection( start_yaw ); + if ( !turnto.Evaluate( self ) ) + return false; + + break; + } + + return true; + } + +void Investigate::End + ( + Actor &self + ) + + { + self.SetActorFlag( ACTOR_FLAG_INVESTIGATING, false ); + self.SetActorFlag( ACTOR_FLAG_NOISE_HEARD, false ); + chase.End( self ); + turnto.End( self ); + } + +/**************************************************************************** + + TurnInvestigate Class Definition + +****************************************************************************/ + +CLASS_DECLARATION( Behavior, TurnInvestigate, NULL ) + { + { &EV_Behavior_Args, SetArgs }, + { NULL, NULL } + }; + +void TurnInvestigate::SetArgs + ( + Event *ev + ) + + { + left_anim = ev->GetString( 1 ); + right_anim = ev->GetString( 2 ); + turn_speed = ev->GetFloat( 3 ); + } + +void TurnInvestigate::ShowInfo + ( + Actor &self + ) + + { + Behavior::ShowInfo( self ); + + gi.Printf( "goal: ( %f, %f, %f )\n", goal.x, goal.y, goal.z ); + } + +void TurnInvestigate::Begin + ( + Actor &self + ) + + { + goal = self.noise_position; + self.SetActorFlag( ACTOR_FLAG_INVESTIGATING, true ); + + seek.Begin( self ); + seek.SetTargetPosition( goal ); + + self.SetAnim( "idle" ); + } + +qboolean TurnInvestigate::Evaluate + ( + Actor &self + ) + + { + str turn_anim_name; + Vector dir; + + self.angles.AngleVectors( &dir ); + + seek.SetTargetVelocity( vec_zero ); + seek.SetPosition( self.centroid ); + seek.SetDir( dir ); + seek.Evaluate( self ); + + // See if we have turned all of the way to the noise position + + if ( seek.steeringforce[YAW] < .5 && seek.steeringforce[YAW] > -.5 ) + return false; + + // Make sure we are not turning faster than out turn speed + + if ( seek.steeringforce[YAW] > turn_speed ) + { + seek.steeringforce[YAW] = turn_speed; + } + + if ( seek.steeringforce[YAW] < -turn_speed ) + { + seek.steeringforce[YAW] = -turn_speed; + } + + seek.steeringforce[PITCH] = 0; + seek.steeringforce[ROLL] = 0; + + // Set the correct animation (left or right) + + if ( seek.steeringforce[YAW] > 0 ) + turn_anim_name = left_anim; + else + turn_anim_name = right_anim; + + if ( turn_anim_name != self.animname ) + self.SetAnim( turn_anim_name ); + + // Actually turn here + + self.Accelerate( seek.steeringforce ); + + return true; + } + +void TurnInvestigate::End + ( + Actor &self + ) + + { + self.SetActorFlag( ACTOR_FLAG_INVESTIGATING, false ); + self.SetActorFlag( ACTOR_FLAG_NOISE_HEARD, false ); + seek.End( self ); + } + +/**************************************************************************** + + TurnToEnemy Class Definition + +****************************************************************************/ + +CLASS_DECLARATION( Behavior, TurnToEnemy, NULL ) + { + { &EV_Behavior_Args, SetArgs }, + { &EV_Behavior_AnimDone, AnimDone }, + { NULL, NULL } + }; + +void TurnToEnemy::SetArgs + ( + Event *ev + ) + + { + left_anim = ev->GetString( 1 ); + right_anim = ev->GetString( 2 ); + turn_speed = ev->GetFloat( 3 ); + forever = ev->GetBoolean( 4 ); + + if ( ev->NumArgs() > 4 ) + use_last_known_position = ev->GetBoolean( 5 ); + else + use_last_known_position = false; + } + +void TurnToEnemy::ShowInfo + ( + Actor &self + ) + + { + Behavior::ShowInfo( self ); + } + +void TurnToEnemy::Begin + ( + Actor &self + ) + + { + seek.Begin( self ); + + self.SetAnim( "idle" ); + } + +void TurnToEnemy::AnimDone + ( + Event *ev + ) + + { + anim_done = true; + } + + +qboolean TurnToEnemy::Evaluate + ( + Actor &self + ) + + { + str turn_anim_name; + Vector dir; + + if ( !self.currentEnemy ) + return false; + + self.angles.AngleVectors( &dir ); + + if ( use_last_known_position ) + seek.SetTargetPosition( self.last_known_enemy_pos ); + else + seek.SetTargetPosition( self.currentEnemy->origin ); + + seek.SetTargetVelocity( vec_zero ); + seek.SetPosition( self.centroid ); + seek.SetDir( dir ); + seek.Evaluate( self ); + + // See if we have turned all of the way to the enemy position + + if ( seek.steeringforce[YAW] < .5 && seek.steeringforce[YAW] > -.5 ) + seek.steeringforce[YAW] = 0; + + // Make sure we are not turning faster than out turn speed + + if ( seek.steeringforce[YAW] > turn_speed ) + { + seek.steeringforce[YAW] = turn_speed; + } + + if ( seek.steeringforce[YAW] < -turn_speed ) + { + seek.steeringforce[YAW] = -turn_speed; + } + + seek.steeringforce[PITCH] = 0; + seek.steeringforce[ROLL] = 0; + + // Set the correct animation (left or right) + + if ( seek.steeringforce[YAW] > 0 ) + turn_anim_name = left_anim; + else if ( seek.steeringforce[YAW] < 0 ) + turn_anim_name = right_anim; + else if ( anim_done ) + turn_anim_name = "idle"; + else + turn_anim_name = self.animname.c_str(); + + if ( turn_anim_name != self.animname ) + self.SetAnim( turn_anim_name, EV_Actor_NotifyBehavior ); + + // Actually turn here + + self.Accelerate( seek.steeringforce ); + + // See if we have turned all of the way to the enemy position + + if ( seek.steeringforce[YAW] < turn_speed && seek.steeringforce[YAW] > -turn_speed && !forever ) + return false; + + anim_done = false; + + return true; + } + +void TurnToEnemy::End + ( + Actor &self + ) + + { + seek.End( self ); + } + +/**************************************************************************** + + PickupEntity Class Definition + +****************************************************************************/ + + +CLASS_DECLARATION( Behavior, PickupEntity, NULL ) + { + { &EV_Behavior_Args, SetArgs }, + { &EV_Behavior_AnimDone, AnimDone }, + { NULL, NULL } + }; + +void PickupEntity::SetArgs + ( + Event *ev + ) + + { + ent_to_pickup = ev->GetEntity( 1 ); + pickup_anim_name = ev->GetString( 2 ); + } + +void PickupEntity::Begin + ( + Actor &self + ) + + { + anim_done = false; + self.pickup_ent = ent_to_pickup; + + self.SetAnim( pickup_anim_name.c_str(), EV_Actor_NotifyBehavior ); + } + +void PickupEntity::AnimDone + ( + Event *ev + ) + + { + anim_done = true; + } + + +qboolean PickupEntity::Evaluate + ( + Actor &self + ) + + { + if ( !ent_to_pickup ) + return false; + + if ( anim_done ) + return false; + + return true; + } + +void PickupEntity::End + ( + Actor &self + ) + + { + self.SetAnim( "idle" ); + self.pickup_ent = NULL; + } + +/**************************************************************************** + + ThrowEntity Class Definition + +****************************************************************************/ + +CLASS_DECLARATION( Behavior, ThrowEntity, NULL ) + { + { &EV_Behavior_Args, SetArgs }, + { &EV_Behavior_AnimDone, AnimDone }, + { NULL, NULL } + }; + +void ThrowEntity::SetArgs + ( + Event *ev + ) + + { + throw_anim_name = ev->GetString( 1 ); + } + +void ThrowEntity::Begin + ( + Actor &self + ) + + { + anim_done = false; + self.SetAnim( throw_anim_name, EV_Actor_NotifyBehavior ); + } + +void ThrowEntity::AnimDone + ( + Event *ev + ) + + { + anim_done = true; + } + + +qboolean ThrowEntity::Evaluate + ( + Actor &self + ) + + { + if ( anim_done ) + return false; + + return true; + } + +void ThrowEntity::End + ( + Actor &self + ) + + { + self.SetAnim( "idle" ); + } + + + +/**************************************************************************** +***************************************************************************** + + Behaviors for specific creatures + +***************************************************************************** +****************************************************************************/ + + + +/**************************************************************************** + + BurrowAttack Class Definition + +****************************************************************************/ + +#define BURROW_MODE_MOVING 0 +#define BURROW_MODE_ATTACK 1 + +CLASS_DECLARATION( Behavior, BurrowAttack, NULL ) + { + { NULL, NULL } + }; + +void BurrowAttack::SetArgs + ( + Event *ev + ) + + { + use_last_known_position = ev->GetBoolean( 1 ); + } + +void BurrowAttack::Begin + ( + Actor &self + ) + + { + Vector attack_dir; + Vector start_pos; + Vector end_pos; + trace_t trace; + + if ( self.animname != "idle_down" ) + self.SetAnim( "idle_down" ); + + // Setup our goal point + + if ( self.currentEnemy ) + { + if ( use_last_known_position ) + goal = self.last_known_enemy_pos; + else + goal = self.currentEnemy->origin; + + start_pos = goal + "0 0 10"; + end_pos = start_pos + "0 0 -250"; + + trace = G_Trace( start_pos, vec_zero, vec_zero, end_pos, NULL, MASK_DEADSOLID, false, "BurrowAttack::Begin" ); + + goal = trace.endpos; + } + + // Setup our starting point, a little ways in front of our origin + + attack_dir = goal - self.origin; + + too_close = false; + + if ( attack_dir.length() < 300 ) + too_close = true; + + attack_dir.normalize(); + + attack_origin = self.origin + attack_dir * 100; + + burrow_mode = BURROW_MODE_MOVING; + + stage = self.stage; + + burrow_speed = 80; + + if ( stage == 3 ) + { + attacks_left = 2; + } + else if ( stage == 4 ) + { + attacks_left = 3 + G_Random( 3 ); + burrow_speed = 120; + } + } + +qboolean BurrowAttack::Evaluate + ( + Actor &self + ) + + { + Vector attack_dir; + Vector new_origin; + float total_dist; + Vector start_pos; + Vector end_pos; + Animate *dirt; + trace_t trace; + Vector temp_angles; + int cont; + Vector temp_endpos; + + if ( !self.currentEnemy ) + return false; + + if ( too_close ) + return false; + + switch ( burrow_mode ) + { + case BURROW_MODE_MOVING : + + attack_dir = goal - attack_origin; + total_dist = attack_dir.length(); + attack_dir.normalize(); + + if ( total_dist < burrow_speed ) + { + new_origin = goal; + } + else + { + new_origin = attack_origin + attack_dir * burrow_speed; + total_dist = burrow_speed; + } + + // Spawn in dirt or water + + start_pos = attack_origin + attack_dir + "0 0 10"; + end_pos = start_pos + "0 0 -250"; + + trace = G_Trace( start_pos, vec_zero, vec_zero, end_pos, NULL, MASK_DEADSOLID | MASK_WATER, false, "BurrowAttack" ); + + temp_endpos = trace.endpos; + temp_endpos -= "0 0 5"; + cont = gi.pointcontents( temp_endpos, 0 ); + + dirt = new Animate; + + dirt->setOrigin( trace.endpos ); + + temp_angles = vec_zero; + + if (cont & MASK_WATER) + dirt->setModel( "fx_splashsmall.tik" ); + else + dirt->setModel( "fx_dirtcloud.tik" ); + + dirt->setAngles( temp_angles ); + + dirt->RandomAnimate( "idle" ); + + dirt->PostEvent( EV_Remove, 5 ); + + attack_origin = new_origin; + + if ( attack_origin == goal ) + { + // Got to our goal position, do attack + + if ( stage == 1 ) + { + SpawnArm( self, leg1, attack_origin + " 25 25 0", "attack1", 0 ); + SpawnArm( self, leg2, attack_origin + " 25 -25 0", "attack1", 0 ); + SpawnArm( self, leg3, attack_origin + "-25 25 0", "attack1", 0 ); + SpawnArm( self, leg4, attack_origin + "-25 -25 0", "attack1", 0 ); + } + else if ( stage == 2 ) + { + SpawnArm( self, leg1, attack_origin + " 25 0 0", "attack2", 0 ); + SpawnArm( self, leg2, attack_origin + "-25 25 0", "attack2", 120 ); + SpawnArm( self, leg3, attack_origin + "-25 -25 0", "attack2", 240 ); + } + else + { + SpawnArm( self, leg1, attack_origin, "attack1", 0 ); + } + + burrow_mode = BURROW_MODE_ATTACK; + } + + break; + case BURROW_MODE_ATTACK : + + // Wait until all of the legs are done + + if ( !leg1 && !leg2 && !leg3 && !leg4 ) + { + if ( self.animname != "idle_down" ) + self.SetAnim( "idle_down" ); + + if ( stage == 1 || stage == 2 ) + { + return false; + } + else + { + attacks_left--; + + if ( attacks_left > 0 ) + { + if ( use_last_known_position ) + if ( self.CanReallySee( self.currentEnemy ) ) + goal = self.currentEnemy->origin; + else + return false; + else + goal = self.currentEnemy->origin; + + burrow_mode = BURROW_MODE_MOVING; + } + else + { + return false; + } + } + } + + break; + } + + return true; + } + +void BurrowAttack::SpawnArm + ( + Actor &self, + AnimatePtr &leg, + Vector arm_origin, + const char *anim_name, + float angle + ) + + { + Vector angles; + trace_t trace; + Vector start_pos; + Vector end_pos; + str anim_to_play; + Animate *leg_animate_ptr; + Vector dir; + Animate *dirt; + + + // Find correct spot to spawn + + arm_origin[2] = -575; + + start_pos = arm_origin + "0 0 64"; + end_pos = arm_origin - "0 0 100"; + + //trace = G_Trace( start_pos, Vector(-5, -5, 0), Vector(5, 5, 0), end_pos, NULL, MASK_DEADSOLID, false, "BurrowAttack" ); + trace = G_Trace( start_pos, Vector(-10, -10, 0), Vector(10, 10, 0), end_pos, NULL, MASK_DEADSOLID, false, "BurrowAttack" ); + + arm_origin = trace.endpos; + + // Make sure can spawn here + + end_pos = arm_origin + "0 0 50"; + + trace = G_Trace( arm_origin, Vector(-10, -10, 0), Vector(10, 10, 0), end_pos, NULL, MASK_DEADSOLID, false, "BurrowAttack" ); + + if ( trace.fraction < 1 || trace.startsolid || trace.allsolid ) + { + if ( trace.entityNum == ENTITYNUM_WORLD || !( trace.ent && trace.ent->entity && trace.ent->entity->takedamage ) ) + return; + } + + // Spawn some dirt + + dirt = new Animate; + + dirt->setOrigin( arm_origin ); + dirt->setModel( "fx_dirtcloud.tik" ); + dirt->setAngles( vec_zero ); + dirt->RandomAnimate( "idle" ); + dirt->PostEvent( EV_Remove, 5 ); + + // Spawn leg + + leg = new Animate; + + leg->setModel( "vmama_arm.tik" ); + leg->setOrigin( arm_origin ); + + leg->ProcessPendingEvents(); + + //leg->edict->clipmask = MASK_MONSTERSOLID; + leg->setContents( 0 ); + leg->setSolidType( SOLID_NOT ); + + leg->PostEvent( EV_BecomeNonSolid, 0 ); + + angles = vec_zero; + angles[YAW] = angle; + + leg->setAngles( angles ); + + anim_to_play = anim_name; + + // See if we should get stuck or not + + if ( strcmp( anim_name, "attack1" ) == 0 ) + { + end_pos = arm_origin + "0 0 250"; + + leg_animate_ptr = leg; + + trace = G_Trace( arm_origin, Vector(-5, -5, 0), Vector(5, 5, 0), end_pos, leg_animate_ptr, MASK_DEADSOLID, false, "BurrowAttack" ); + + if ( trace.fraction != 1.0 ) + { + if ( self.animname != "struggle" ) + self.SetAnim( "struggle" ); + + anim_to_play = "getstuck"; + } + } + + // Damage entities in way + + if ( strcmp( anim_name, "attack1" ) == 0 ) + { + start_pos = arm_origin; + end_pos = arm_origin + "0 0 250"; + + dir = Vector ( G_CRandom( 5 ), G_CRandom( 5 ), 10 ); + } + else + { + start_pos = arm_origin + "0 0 10"; + + angles.AngleVectors( &dir ); + + end_pos = start_pos + dir * 250; + } + + leg_animate_ptr = leg; + + MeleeAttack( start_pos, end_pos, 50, &self, MOD_IMPALE, 10, 0, 0, 100 ); + + leg->RandomAnimate( anim_to_play.c_str(), EV_Remove ); + } + +void BurrowAttack::End + ( + Actor &self + ) + + { + } + +/**************************************************************************** + + CircleEnemy Class Definition + +****************************************************************************/ + +CLASS_DECLARATION( Behavior, CircleEnemy, NULL ) + { + { &EV_Behavior_Args, SetArgs }, + { NULL, NULL } + }; + +void CircleEnemy::SetArgs + ( + Event *ev + ) + + { + center_part_name = ev->GetString( 1 ); + } + +void CircleEnemy::Begin + ( + Actor &self + ) + + { + ent_to_circle = self.currentEnemy; + last_angle_change = 0; + } + +float CircleEnemy::GetAngleDiff + ( + Actor &self, + Actor *center_actor, + Vector origin + ) + + { + Vector dir; + Vector enemy_angles; + Vector actor_angles; + float angle_diff; + + dir = ent_to_circle->origin - center_actor->origin; + enemy_angles = dir.toAngles(); + + dir = origin - center_actor->origin; + actor_angles = dir.toAngles(); + + angle_diff = AngleDelta( actor_angles[YAW], enemy_angles[YAW] ); + + return angle_diff; + } + +#define MAX_CIRCLE_ACCELERATION .125 +#define MAX_CIRCLE_VELOCITY 10 + +qboolean CircleEnemy::Evaluate + ( + Actor &self + ) + + { + Vector dir; + Actor *center_actor; + Vector actor_angles; + float angle_diff; + float other_angle_diff; + float abs_angle_diff; + float other_abs_angle_diff = 180; + float angle_change = MAX_CIRCLE_VELOCITY; + float length; + float real_angle_change; + Actor *other; + + + if ( !ent_to_circle ) + return false; + + center_actor = self.FindPartActor( center_part_name.c_str() ); + + if ( !center_actor ) + return false; + + angle_diff = GetAngleDiff( self, center_actor, self.origin ); + + if ( angle_diff < 0 ) + abs_angle_diff = -angle_diff; + else + abs_angle_diff = angle_diff; + + other = self.FindPartActor( self.part_name ); + + if ( other ) + { + other_angle_diff = GetAngleDiff( self, center_actor, other->origin ); + + if ( other_angle_diff < 0 ) + other_abs_angle_diff = -other_angle_diff; + else + other_abs_angle_diff = other_angle_diff; + } + + if ( abs_angle_diff < other_abs_angle_diff ) + { + // Turn towards enemy + + if ( abs_angle_diff < angle_change ) + angle_change = abs_angle_diff; + + if ( angle_diff < 0 ) + real_angle_change = angle_change; + else + real_angle_change = -angle_change; + } + else + { + // Turn away from enemy + + if ( 180 - abs_angle_diff < angle_change ) + angle_change = 180 - abs_angle_diff; + + if ( angle_diff < 0 ) + real_angle_change = -angle_change; + else + real_angle_change = angle_change; + } + + if ( real_angle_change < 1.0 && real_angle_change > -1.0 ) + real_angle_change = 0; + + if ( real_angle_change > 0 ) + { + if ( real_angle_change > last_angle_change + MAX_CIRCLE_ACCELERATION ) + real_angle_change = last_angle_change + MAX_CIRCLE_ACCELERATION; + } + else if ( real_angle_change < 0 ) + { + if ( real_angle_change < last_angle_change - MAX_CIRCLE_ACCELERATION ) + real_angle_change = last_angle_change - MAX_CIRCLE_ACCELERATION; + } + + last_angle_change = real_angle_change; + + dir = self.origin - center_actor->origin; + length = dir.length(); + + actor_angles = dir.toAngles(); + actor_angles[YAW] += real_angle_change; + + // Find new position + + actor_angles.AngleVectors( &dir, NULL, NULL ); + + dir *= length; + dir.z = 0; + + self.setOrigin( center_actor->origin + dir ); + + // Set the actors angle to look at the center + + dir[0] = -dir[0]; + dir[1] = -dir[1]; + dir[2] = -dir[2]; + + self.angles[YAW] = dir.toYaw(); + self.setAngles( self.angles ); + + return true; + } + +void CircleEnemy::End + ( + Actor &self + ) + + { + } + +/**************************************************************************** + + ShockWater Class Definition + +****************************************************************************/ + +CLASS_DECLARATION( Behavior, ShockWater, NULL ) + { + { NULL, NULL } + }; + +ShockWater::ShockWater() + { + left_beam = NULL; + right_beam = NULL; + center_beam = NULL; + already_started = false; + } + +void ShockWater::Begin + ( + Actor &self + ) + + { + } + +qboolean ShockWater::Evaluate + ( + Actor &self + ) + + { + Vector left_tag_orig; + Vector right_tag_orig; + Vector end_pos; + Vector center_point; + Actor *center_actor; + trace_t trace; + Entity *hit_entity; + Vector diff_vect; + float diff; + Vector dir; + + if ( !self.currentEnemy ) + return false; + + if ( self.newanimnum == -1 && !already_started ) + { + // Get tag positions + self.GetTag( "tag_left", &left_tag_orig ); + self.GetTag( "tag_right", &right_tag_orig ); + + // Get end position + end_pos = left_tag_orig + right_tag_orig; + end_pos *= .5; + end_pos[2] -= 120; + + dir = end_pos - self.origin; + dir.z = 0; + dir *= 0.5; + + end_pos += dir; + + // Add the left and right beams + left_beam = CreateBeam( NULL, "emap1", left_tag_orig, end_pos, 10, 1.5f, 0.2f ); + right_beam = CreateBeam( NULL, "emap1", right_tag_orig, end_pos, 10, 1.5f, 0.2f ); + + center_actor = self.FindPartActor( "body" ); + if ( center_actor ) + { + center_point = center_actor->origin; + } + + trace = G_Trace( center_point, vec_zero, vec_zero, end_pos, &self, MASK_SHOT, false, "ShockAttack" ); + if ( trace.fraction < 1.0 && trace.entityNum != center_actor->entnum ) + { + hit_entity = G_GetEntity( trace.entityNum ); + if ( hit_entity ) + { + center_point = hit_entity->origin; + } + } + else + { + // Shock head + center_actor->AddStateFlag( STATE_FLAG_IN_PAIN ); + + center_actor->SpawnEffect( "fx_elecstrike.tik", center_actor->origin ); + center_actor->Sound( "sound/weapons/sword/electric/hitmix2.wav", 0, 1, 500 ); + } + + // create the center beam + center_beam = CreateBeam( NULL, "emap1", end_pos, center_point, 20, 3.0f, 0.2f ); + + // Damage player if in water + if ( center_actor ) + { + diff_vect = self.currentEnemy->origin - center_actor->origin; + diff_vect[2] = 0; + + diff = diff_vect.length(); + //if ( diff < 240 && self.currentEnemy->groundentity ) + if ( diff < 350 && self.currentEnemy->groundentity ) + { + self.currentEnemy->Damage( &self, &self, 10, Vector (0, 0, 0), Vector (0, 0, 0), Vector (0, 0, 0), 0, 0, MOD_ELECTRICWATER ); + } + } + already_started = true; + } + + return true; + } + +void ShockWater::End + ( + Actor &self + ) + + { + delete left_beam; + delete right_beam; + delete center_beam; + } + +/**************************************************************************** + + Shock Class Definition + +****************************************************************************/ + +CLASS_DECLARATION( Behavior, Shock, NULL ) + { + { &EV_Behavior_Args, SetArgs }, + { NULL, NULL } + }; + +Shock::Shock() + { + beam = NULL; + damage = 10; + already_started = false; + random_angle = 0; + } + +void Shock::SetArgs + ( + Event *ev + ) + + { + tag_name = ev->GetString( 1 ); + + if ( ev->NumArgs() > 1 ) + { + damage = ev->GetInteger( 2 ); + } + + if ( ev->NumArgs() > 2 ) + { + random_angle = ev->GetFloat( 3 ); + } + } + +void Shock::Begin + ( + Actor &self + ) + + { + } + +qboolean Shock::Evaluate + ( + Actor &self + ) + + { + Vector tag_orig; + Vector angles; + Vector end_pos; + trace_t trace; + Vector dir; + float yaw_diff; + + + if ( !self.currentEnemy ) + return false; + + if ( self.newanimnum == -1 && !already_started ) + { + // Get tag position + if ( tag_name.length() == 0 ) + { + return false; + } + + self.GetTag( tag_name.c_str(), &tag_orig ); + + // See if the enemy is in front of us + + dir = self.currentEnemy->origin - self.origin; + angles = dir.toAngles(); + + yaw_diff = AngleNormalize180( angles[YAW] - self.angles[YAW] ); + + if ( yaw_diff < 60 && yaw_diff > -60 ) + { + // The enemy is in front of us + + angles[YAW] += G_CRandom( random_angle ); + + angles.AngleVectors( &end_pos, NULL, NULL ); + end_pos *= 500; + end_pos += tag_orig; + end_pos.z -= 100; + } + else + { + // Get end position + angles = self.angles; + + angles[YAW] += G_Random( random_angle ) - random_angle / 2; + angles[PITCH] = 0; + angles[ROLL] = 0; + + angles.AngleVectors( &end_pos, NULL, NULL ); + end_pos *= 500; + end_pos += tag_orig; + end_pos.z -= 100; + } + + trace = G_Trace( tag_orig, Vector (-15, -15, -15), Vector (15, 15, 15), end_pos, &self, MASK_SHOT, false, "ShockAttack" ); + + if ( trace.fraction < 1.0 && trace.entityNum == self.currentEnemy->entnum ) + { + end_pos = self.currentEnemy->centroid; + dir = end_pos - tag_orig; + dir.normalize(); + self.currentEnemy->Damage( &self, &self, damage, vec_zero, dir, vec_zero, 0, 0, MOD_ELECTRIC ); + } + + // Add the beam + beam = CreateBeam( NULL, "emap1", tag_orig, end_pos, 20, 1.5f, 0.2f ); + + already_started = true; + } + else if ( already_started ) + { + self.GetTag( tag_name.c_str(), &tag_orig ); + + if ( beam ) + beam->setOrigin( tag_orig ); + } + + return true; + } + +void Shock::End + ( + Actor &self + ) + + { + if ( beam ) + { + beam->ProcessEvent( EV_Remove ); + beam = NULL; + } + } + +/**************************************************************************** + + CircleAttack Class Definition + +****************************************************************************/ + +CLASS_DECLARATION( Behavior, CircleAttack, NULL ) + { + { &EV_Behavior_Args, SetArgs }, + { NULL, NULL } + }; + +CircleAttack::CircleAttack() + { + } + +void CircleAttack::SetArgs + ( + Event *ev + ) + + { + command = ev->GetString( 1 ); + direction = ev->GetString( 2 ); + } + +Actor *CircleAttack::FindClosestPart + ( + Actor &self, + float angle + ) + { + float closest_diff = 360; + int i; + part_t *part; + Entity *partent; + Actor *partact; + Vector dir; + Vector angles; + float angle_diff; + Actor *closest_part = NULL; + + for( i = 1 ; i <= self.parts.NumObjects(); i++ ) + { + part = &self.parts.ObjectAt( i ); + + partent = part->ent; + partact = ( Actor * )partent; + + if ( partact && partact->part_name == "smallarm" ) + { + dir = partact->origin - self.origin; + angles = dir.toAngles(); + + angle_diff = AngleDelta( angles[ YAW ], angle ); + + if ( angle_diff < 0 ) + { + angle_diff = -angle_diff; + } + + if ( angle_diff < closest_diff ) + { + closest_part = partact; + closest_diff = angle_diff; + } + } + } + + return closest_part; + } + +void CircleAttack::Begin + ( + Actor &self + ) + + { + float random_direction; + Actor *closest_part; + + // Pick which arm to start with + random_direction = G_Random( 360 ); + + closest_part = FindClosestPart( self, random_direction ); + if ( closest_part != NULL ) + { + first_part = closest_part; + current_part = closest_part; + + closest_part->command = command; + next_time = level.time + 0.2f; + } + + current_direction = 1; + + if ( direction == "counterclockwise" ) + { + current_direction = 0; + } + + number_of_attacks = 1; + } + +qboolean CircleAttack::Evaluate + ( + Actor &self + ) + + { + Entity *current_part_entity; + Actor *current_part_actor; + Vector dir; + Vector angles; + Actor *closest_part; + + if ( level.time >= next_time ) + { + current_part_entity = current_part; + current_part_actor = ( Actor * )current_part_entity; + + // Find the next part + + dir = current_part_actor->origin - self.origin; + angles = dir.toAngles(); + + if ( direction == "changing" ) + { + if ( number_of_attacks >= 20 ) + { + return false; + } + + if ( G_Random( 1 ) < .3 ) + { + current_direction = !current_direction; + } + } + + if ( current_direction == 1 ) + { + angles[YAW] -= 360 / 8; + } + else + { + angles[YAW] += 360 / 8; + } + + closest_part = FindClosestPart( self, angles[YAW] ); + + if ( ( closest_part == first_part ) && ( direction != "changing" ) ) + { + return false; + } + + current_part = closest_part; + + closest_part->command = command; + next_time = level.time + 0.2f; + + number_of_attacks++; + } + + return true; + } + +void CircleAttack::End + ( + Actor &self + ) + + { + } + +/**************************************************************************** + + DragEnemy Class Definition + +****************************************************************************/ + +CLASS_DECLARATION( Behavior, DragEnemy, NULL ) + { + { &EV_Behavior_Args, SetArgs }, + { NULL, NULL } + }; + +void DragEnemy::SetArgs + ( + Event *ev + ) + + { + tag_name = ev->GetString( 1 ); + damage = ev->GetInteger( 2 ); + + if ( ev->NumArgs() > 2 ) + drop = ev->GetBoolean( 3 ); + else + drop = false; + } + +void DragEnemy::Begin + ( + Actor &self + ) + + { + Actor *body; + Vector dir; + Vector angles; + + ent_to_drag = self.currentEnemy; + + attached = false; + + if ( damage > 0 && !drop ) + { + ent_to_drag->Damage( &self, &self, damage, vec_zero, vec_zero, vec_zero, 0, 0, MOD_EAT ); + } + + body = self.FindPartActor( "body" ); + + if ( body ) + { + dir = body->origin - self.origin; + angles = dir.toAngles(); + + target_yaw = angles[ YAW ]; + last_turn_time = level.time; + } + else + { + target_yaw = self.angles[ YAW ]; + } + } + +qboolean DragEnemy::Evaluate + ( + Actor &self + ) + + { + Vector orig; + str anim_name; + + if ( ent_to_drag ) + { + if ( drop && damage > 0 ) + { + if ( self.GetTag( tag_name.c_str(), &orig ) ) + { + if ( ent_to_drag->isClient() ) + { + orig[ 2 ] -= 85; + } + else + { + offset[ 2 ] = ( ent_to_drag->absmin[ 2 ] - ent_to_drag->absmax[ 2 ] ) * 0.5f; + + if ( offset[ 2 ] < -40 ) + { + offset[ 2 ] -= 25; + } + orig += offset; + } + + ent_to_drag->setOrigin( orig ); + } + + ent_to_drag->Damage( &self, &self, damage, vec_zero, vec_zero, vec_zero, 0, 0, MOD_EAT ); + } + + if ( ent_to_drag->deadflag ) + return false; + + anim_name = self.AnimName(); + + if ( ( anim_name == "raise" ) && ( self.newanim == "" ) ) + { + if ( !attached ) + { + Event *ev; + + if ( damage > 0 ) + { + if ( ent_to_drag->isClient() ) + { + offset[ 2 ] -= 85; + } + else + { + offset[ 2 ] = ( ent_to_drag->absmin[ 2 ] - ent_to_drag->absmax[ 2 ] ) * 0.5f; + + if ( offset[ 2 ] < -40 ) + { + offset[ 2 ] -= 25; + } + } + + ev = new Event( EV_Attach ); + ev->AddEntity( &self ); + ev->AddString( tag_name.c_str() ); + ev->AddInteger( qfalse ); + ev->AddVector( offset ); + ent_to_drag->ProcessEvent( ev ); + + ent_to_drag->flags |= FL_PARTIAL_IMMOBILE; + } + + attached = true; + } + + if ( target_yaw != self.angles[ YAW ] ) + { + float yaw_diff = target_yaw - self.angles[ YAW ]; + + if ( yaw_diff > 180 ) + { + target_yaw -= 360; + yaw_diff -= 360; + } + + if ( yaw_diff < -180 ) + { + target_yaw += 360; + yaw_diff += 360; + } + + if ( yaw_diff < 0 ) + { + self.angles[ YAW ] -= 90 * (level.time - last_turn_time); + + if ( self.angles[ YAW ] < 0 ) + { + self.angles[ YAW ] += 360; + } + + if ( self.angles[ YAW ] < target_yaw ) + { + self.angles[ YAW ] = target_yaw; + } + + self.setAngles( self.angles ); + } + else if ( yaw_diff > 0 ) + { + self.angles[ YAW ] += 90 * (level.time - last_turn_time); + + if ( self.angles[ YAW ] > 360 ) + { + self.angles[ YAW ] -= 360; + } + + if ( self.angles[ YAW ] > target_yaw ) + { + self.angles[ YAW ] = target_yaw; + } + + self.setAngles( self.angles ); + } + + last_turn_time = level.time; + } + } + } + + return true; + } + +void DragEnemy::End + ( + Actor &self + ) + + { + Vector orig; + Event *ev; + trace_t trace; + + if ( drop || strcmp( self.currentState->getName(), "SUICIDE" ) == 0 ) + { + ent_to_drag->flags &= ~FL_PARTIAL_IMMOBILE; + + ev = new Event( EV_Detach ); + ent_to_drag->ProcessEvent( ev ); + + ent_to_drag->setSolidType( SOLID_BBOX ); + + if ( self.GetTag( tag_name.c_str(), &orig ) ) + { + trace = G_Trace( orig - "0 0 100", ent_to_drag->mins, ent_to_drag->maxs, orig, ent_to_drag, ent_to_drag->edict->clipmask, false, "DragEnemy" ); + + if ( trace.allsolid ) + gi.DPrintf( "Dropping entity into a solid!\n" ); + + ent_to_drag->setOrigin( trace.endpos ); + + /* if ( ent_to_drag->isClient() ) + { + offset[2] = -85; + } + else + { + offset[2] = ( ent_to_drag->absmin[2] - ent_to_drag->absmax[2] ) * 0.5; + + if ( offset[2] < -40 ) + { + offset[2] -= 25; + } + } + + ent_to_drag->setOrigin( orig + offset ); */ + } + } + + ent_to_drag->velocity = "0 0 -20"; + } + +/**************************************************************************** + + Spin Class Definition + +****************************************************************************/ + +CLASS_DECLARATION( Behavior, Spin, NULL ) + { + { &EV_Behavior_Args, SetArgs }, + { NULL, NULL } + }; + +Spin::Spin() + { + speed = 500.0; + } + +void Spin::SetArgs + ( + Event *ev + ) + + { + speed = ev->GetFloat( 1 ); + } + +void Spin::Begin + ( + Actor &self + ) + + { + SpinningPlant *spinningPlant = (SpinningPlant *)&self; + + if ( spinningPlant->spinner_clip ) + { + spinningPlant->spinner_clip->avelocity.y = speed; + } + } + +qboolean Spin::Evaluate + ( + Actor &self + ) + + { + return true; + } + +void Spin::End + ( + Actor &self + ) + + { + SpinningPlant *spinningPlant = ( SpinningPlant * )&self; + + if ( spinningPlant->spinner_clip ) + { + spinningPlant->spinner_clip->avelocity.y = 0; + } + } + +/**************************************************************************** + + Digest Class Definition + +****************************************************************************/ + +CLASS_DECLARATION( Behavior, Digest, NULL ) + { + { &EV_Behavior_AnimDone, AnimDone }, + { NULL, NULL } + }; + + +void Digest::ShowInfo + ( + Actor &self + ) + + { + Behavior::ShowInfo( self ); + } + +void Digest::Begin + ( + Actor &self + ) + + { + float range = 150; + Entity *ent_in_range; + + // Init some stuff + spitting = false; + spit = false; + yuck = false; + + self.SetAnim( "digest" ); + + // Default digest time to current level time + + digest_time = level.time; + + // See if we caught anything + + ent_in_range = findradius( NULL, self.origin, range ); + + while ( ent_in_range ) + { + if ( + ( &self != ent_in_range ) && + ( ent_in_range->movetype != MOVETYPE_NONE ) && + ( ent_in_range->movetype != MOVETYPE_STATIONARY ) && + !(ent_in_range->flags & FL_NOTARGET) && + !ent_in_range->deadflag && + ent_in_range->health > 0 + ) + { + if ( Vector( self.origin - ent_in_range->origin ).length() < range ) + Eat( ent_in_range, self ); + } + + ent_in_range = findradius( ent_in_range, self.origin, range ); + } + + // Make sure to spit out immediately if its yucky + + if ( yuck ) + digest_time = 0; + + // Make sure we are solid will digesting things + + self.setContents( CONTENTS_SOLID ); + self.setSize( "-32 -32 0", "32 32 192" ); + } + +void Digest::Eat + ( + Entity *food, + Actor &self + ) + + { + float mass; + SafePtr food_ptr = food; + + // Hide the caught entity + + food->hideModel(); + food->flags |= FL_IMMOBILE; + + food->origin[0] = self.centroid[0]; + food->origin[1] = self.centroid[1]; + food->origin[2] = self.centroid[2]; + + food->setOrigin( food->origin ); + + // See if we want to eat this or spit out immediately + + if ( food->edict->s.eFlags & EF_ANTISBJUICE ) + yuck = true; + + // Add to the digest time + + mass = food->mass; + + if ( mass < 50 ) + mass = 50; + + if ( mass > 300 ) + mass = 300; + + digest_time += ( mass / 50 ) + 1; + + foodlist.AddObject( food_ptr ); + + // Extinguish fire on this entity if on fire + + food->ProcessEvent( EV_Sentient_StopOnFire ); + + if ( !yuck && food->isSubclassOf( Player ) ) + food->Sound( "snd_longdeath" ); + } + +qboolean Digest::Evaluate + ( + Actor &self + ) + + { + Vector dir; + Entity *food; + int i; + float m; + Vector momentum; + Entity *targetent; + qboolean killed; + + if ( !spitting && digest_time < level.time ) + { + if ( foodlist.NumObjects() > 0 ) + { + // Done digesting, start spitting anim + spitting = true; + anim_done = false; + self.SetAnim( "spit", EV_Actor_NotifyBehavior ); + spit_time = level.time + 0.25; + } + else + { + self.setSize( "-64 -64 0", "64 64 32" ); + self.ProcessEvent( EV_ActorOnlyShootable ); + return false; + } + } + + if ( spitting && !spit && spit_time < level.time) + { + spit = true; + + self.setSize( "-64 -64 0", "64 64 32" ); + self.ProcessEvent( EV_ActorOnlyShootable ); + + // Spit all of the digested entities out + for( i = 1 ; i <= foodlist.NumObjects() ; i++ ) + { + food = foodlist.ObjectAt( i ); + + if ( food != NULL ) + { + killed = false; + + // Only damage the entity if we digested it + if ( !yuck ) + { + food->Damage( &self, &self, 1000, Vector (0, 0, 0), Vector (0, 0, 0), Vector (0, 0, 0), 0, 0, MOD_EAT ); + + if ( food->health <= 0 ) + killed = true; + } + + food->origin[0] = self.centroid[0]; + food->origin[1] = self.centroid[1]; + food->origin[2] = self.centroid[2]; + + if ( food->mass < 50 ) + { + m = 50; + } + else + { + m = food->mass; + } + + if ( killed ) + { + Event *event; + int number_of_gibs; + + // Entity was killed, just spit out some gibs + + food->origin[2] += 60; + + food->setOrigin( food->origin ); + + number_of_gibs = ( ( m - 50 ) / 300 ) * 5 + 2; + + if ( number_of_gibs > 7 ) + number_of_gibs = 7; + + event = new Event( EV_Sentient_SpawnBloodyGibs ); + event->AddInteger( number_of_gibs ); + food->PostEvent( event, 0 ); + + event = new Event( EV_Sentient_SpawnBloodyGibs ); + event->AddInteger( number_of_gibs ); + food->PostEvent( event, 0 ); + + if ( !food->isSubclassOf( Player ) ) + food->PostEvent( EV_Remove, 0 ); + } + else + { + // Entity wasn't killed spit it out + + food->setOrigin( food->origin ); + + food->showModel(); + food->flags ^= FL_IMMOBILE; + + // Spit the entity out + + targetent = NULL; + if ( self.target.length() > 0 ) + { + // Spit the entity to the targeted position + targetent = G_FindTarget( &self, self.target.c_str() ); + } + + if ( targetent ) + { + food->velocity = G_CalculateImpulse( food->origin, targetent->origin, 350, 1 ); + } + else + { + // Spit the entity to a random place + dir[0] = G_Random( 200 ) - 100; + dir[1] = G_Random( 200 ) - 100; + dir[2] = 200; + + dir.normalize(); + + momentum = dir * ( 500.0f * 500 / m ); + food->velocity += momentum; + } + food->VelocityModified(); + } + } + } + } + + if ( spitting && anim_done ) + { + // We are done spitting + return false; + } + + return true; + } + +void Digest::AnimDone + ( + Event *ev + ) + + { + anim_done = true; + } + +void Digest::End + ( + Actor &self + ) + + { + } + +/**************************************************************************** + + Teleport Class Definition + +****************************************************************************/ + +#define TELEPORT_BEHIND 0 +#define TELEPORT_TOLEFT 1 +#define TELEPORT_TORIGHT 2 +#define TELEPORT_INFRONT 3 + +#define TELEPORT_NUMBER_OF_POSITIONS 4 + +CLASS_DECLARATION( Behavior, Teleport, NULL ) + { + { NULL, NULL } + }; + + +void Teleport::ShowInfo + ( + Actor &self + ) + + { + Behavior::ShowInfo( self ); + } + +void Teleport::Begin + ( + Actor &self + ) + + { + + } + +qboolean Teleport::TestPosition + ( + Actor &self, + int test_pos, + Vector &good_position, + qboolean use_enemy_dir + ) + { + Vector test_position; + Vector enemy_angles; + Vector enemy_forward; + Vector enemy_left; + trace_t trace; + + + // Get the position to test + + if ( use_enemy_dir ) + { + // Get the enemy direction info + + enemy_angles = self.currentEnemy->angles; + enemy_angles.AngleVectors( &enemy_forward, &enemy_left ); + + test_position = self.currentEnemy->origin; + + if ( test_pos == TELEPORT_BEHIND ) + test_position -= enemy_forward * 75; + else if ( test_pos == TELEPORT_INFRONT ) + test_position += enemy_forward * 75; + else if ( test_pos == TELEPORT_TOLEFT ) + test_position += enemy_left * 75; + else + test_position -= enemy_left * 75; + } + else + { + test_position = self.currentEnemy->origin; + + if ( test_pos == TELEPORT_BEHIND ) + test_position += "-60 0 0"; + else if ( test_pos == TELEPORT_INFRONT ) + test_position += "60 0 0"; + else if ( test_pos == TELEPORT_TOLEFT ) + test_position += "0 -60 0"; + else + test_position += "0 60 0"; + } + + //test_position += "0 0 16"; + test_position += "0 0 64"; + + // Test to see if we can fit at the new position + + trace = G_Trace( test_position, self.mins, self.maxs, test_position - "0 0 1000", &self, self.edict->clipmask, false, "Teleport::TestPosition" ); + + if ( trace.allsolid || trace.startsolid ) + //if ( trace.allsolid ) + return false; + + // Make sure we can see the enemy from this position + + //if ( !self.CanSeeEnemyFrom( trace.endpos ) ) + if ( !self.IsEntityAlive( self.currentEnemy ) || !self.CanSeeFrom( trace.endpos, self.currentEnemy ) ) + return false; + + // This is a good position + + good_position = trace.endpos; + return true; + } + +qboolean Teleport::Evaluate + ( + Actor &self + ) + + { + int current_position; + float random_number; + Vector teleport_position; + qboolean teleport_position_found; + Vector new_position; + int i; + Vector dir; + Vector angles; + + + // Make sure we stll have an enemy to teleport near + + if ( !self.currentEnemy ) + return false; + + // Default the teleport position to where we are now + + teleport_position = self.origin; + teleport_position_found = false; + + // Determine which position to try first + + random_number = G_Random(); + + if ( random_number < .5 ) + current_position = TELEPORT_BEHIND; + else if ( random_number < .7 ) + current_position = TELEPORT_TOLEFT; + else if ( random_number < .9 ) + current_position = TELEPORT_TORIGHT; + else + current_position = TELEPORT_INFRONT; + + // Try positions + + for( i = 0 ; i < TELEPORT_NUMBER_OF_POSITIONS ; i++ ) + { + // Test this position + + if ( TestPosition( self, current_position, new_position, true ) ) + { + teleport_position = new_position; + teleport_position_found = true; + break; + } + + // Try the next position + + current_position++; + + if ( current_position >= TELEPORT_NUMBER_OF_POSITIONS ) + current_position = 0; + } + + if ( !teleport_position_found ) + { + // Try again with not using the enemies angles + + if ( current_position >= TELEPORT_NUMBER_OF_POSITIONS ) + current_position = 0; + + for( i = 0 ; i < TELEPORT_NUMBER_OF_POSITIONS ; i++ ) + { + // Test this position + + if ( TestPosition( self, current_position, new_position, false ) ) + { + teleport_position = new_position; + teleport_position_found = true; + break; + } + + // Try the next position + + current_position++; + + if ( current_position >= TELEPORT_NUMBER_OF_POSITIONS ) + current_position = 0; + } + } + + // Do teleport stuff + + if ( teleport_position_found ) + { + self.setOrigin( teleport_position ); + self.NoLerpThisFrame(); + + dir = self.currentEnemy->origin - teleport_position; + angles = dir.toAngles(); + + angles[ROLL] = 0; + angles[PITCH] = 0; + + self.setAngles( angles ); + + if ( self.currentEnemy->isSubclassOf( Player ) ) + { + Player *player = (Player *)(Entity *)self.currentEnemy; + + player->RemoveTarget( &self ); + } + } + + return false; + } + +void Teleport::End + ( + Actor &self + ) + + { + } + +/**************************************************************************** + + TeleportToPosition Class Definition + +****************************************************************************/ + + +CLASS_DECLARATION( Behavior, TeleportToPosition, NULL ) + { + { &EV_Behavior_Args, SetArgs }, + { NULL, NULL } + }; + +void TeleportToPosition::ShowInfo + ( + Actor &self + ) + + { + Behavior::ShowInfo( self ); + } + +void TeleportToPosition::SetArgs + ( + Event *ev + ) + + { + teleport_position_name = ev->GetString( 1 ); + number_of_teleport_positions = ev->GetInteger( 2 ); + } + +void TeleportToPosition::Begin + ( + Actor &self + ) + + { + } + +qboolean TeleportToPosition::Evaluate + ( + Actor &self + ) + + { + Vector dir; + Vector angles; + trace_t trace; + str pathnode_name; + PathNode *goal; + Vector teleport_position; + Vector attack_position; + float half_height; + Animate *effect; + + + // Get the pathnode name to teleport to + + pathnode_name = teleport_position_name; + pathnode_name += (int)( G_Random( number_of_teleport_positions ) + 1 ); + + // Find the path node + + goal = AI_FindNode( pathnode_name ); + + if ( !goal ) + { + gi.DPrintf( "Can't find position %s\n", pathnode_name.c_str() ); + return false; + } + + // Set the teleport position + + teleport_position = goal->origin; + + // Kill anything at this position + + half_height = self.maxs.z / 2; + attack_position = teleport_position; + attack_position.z += half_height; + + MeleeAttack( attack_position, attack_position, 10000, &self, MOD_TELEFRAG, self.maxs.x, -half_height, half_height, 0 ); + + // Test to see if we can fit at the new position + + trace = G_Trace( teleport_position + "0 0 64", self.mins, self.maxs, teleport_position - "0 0 128", &self, MASK_PATHSOLID, false, "TeleportToPosition" ); + //trace = G_Trace( teleport_position, self.mins, self.maxs, teleport_position, &self, MASK_PATHSOLID, false, "TeleportToPosition" ); + + if ( trace.allsolid ) + { + gi.DPrintf( "Failed to teleport to %s\n", goal->targetname.c_str() ); + return false; + } + + teleport_position = trace.endpos; + + // Do teleport stuff + + // Spawn in teleport effect at old position + + effect = new Animate; + effect->setModel( "fx_teleport3.tik" ); + effect->setOrigin( self.origin ); + effect->setScale( 2 ); + effect->setSolidType( SOLID_NOT ); + effect->RandomAnimate( "idle", EV_Remove ); + //effect->Sound( "snd_teleport" ); + + // Set new position + + self.setOrigin( teleport_position ); + + // Spawn in teleport effect at new position + + effect = new Animate; + effect->setModel( "fx_teleport3.tik" ); + effect->setOrigin( self.origin ); + effect->setScale( 2 ); + effect->setSolidType( SOLID_NOT ); + effect->RandomAnimate( "idle", EV_Remove ); + //effect->Sound( "snd_teleport" ); + + self.NoLerpThisFrame(); + + if ( self.currentEnemy ) + { + dir = self.currentEnemy->origin - teleport_position; + angles = dir.toAngles(); + + angles[ROLL] = 0; + angles[PITCH] = 0; + + self.setAngles( angles ); + + if ( self.currentEnemy->isSubclassOf( Player ) ) + { + Player *player = (Player *)(Entity *)self.currentEnemy; + + player->RemoveTarget( &self ); + } + } + + return false; + } + +void TeleportToPosition::End + ( + Actor &self + ) + + { + } + +/**************************************************************************** + + GhostAttack Class Definition + +****************************************************************************/ + +#define GHOST_ATTACK_START 0 +#define GHOST_ATTACK_END 1 + +#define GHOST_ATTACK_SPEED 350 + +CLASS_DECLARATION( Behavior, GhostAttack, NULL ) + { + { &EV_Behavior_Args, SetArgs }, + { NULL, NULL } + }; + +void GhostAttack::SetArgs + ( + Event *ev + ) + + { + real_attack = ev->GetBoolean( 1 ); + } + + +void GhostAttack::ShowInfo + ( + Actor &self + ) + + { + Behavior::ShowInfo( self ); + } + +void GhostAttack::Begin + ( + Actor &self + ) + + { + mode = GHOST_ATTACK_START; + + fly.Begin( self ); + fly.SetTurnSpeed( 25 ); + fly.SetRandomAllowed( false ); + fly.SetSpeed( GHOST_ATTACK_SPEED ); + + if ( self.currentEnemy ) + attack_position = self.currentEnemy->centroid; + else + attack_position = self.origin; + + if ( !real_attack ) + { + attack_position[0] += G_CRandom( 300 ); + attack_position[1] += G_CRandom( 300 ); + attack_position[2] += G_Random( 100 ); + } + + fly.SetGoalPoint( attack_position ); + + attack_dir = attack_position - self.origin; + + if ( attack_dir == vec_zero ) + attack_dir = "1 1 0"; + + attack_dir.normalize(); + + self.Sound( "snd_fadein", CHAN_VOICE ); + } + +qboolean GhostAttack::Evaluate + ( + Actor &self + ) + + { + Vector dir; + float dist; + float zdist; + Vector new_pos; + float new_alpha; + float light_radius; + float r, g, b; + qboolean success; + Vector start; + Vector end; + Event *event; + + + if ( !self.currentEnemy ) + return false; + + if ( mode == GHOST_ATTACK_START ) + { + // Move closer to the enemy + + fly.Evaluate( self ); + + // Get the new distance info + + dir = attack_position - self.origin; + + dist = dir.length(); + + zdist = dir.z; + + if ( zdist < 0 ) + zdist = -zdist; + + dir.z = 0; + + // If we are close enough change to shootable_only + + if ( real_attack && dist < 200 ) + { + // Attackable now + + self.setSolidType( SOLID_BBOX ); + self.setContents( CONTENTS_SHOOTABLE_ONLY ); + + event = new Event( EV_Actor_SetTargetable ); + event->AddInteger( 1 ); + self.ProcessEvent( event ); + } + + // If we are close enough damage enemy and goto end mode + + start = self.origin; + end = self.origin + attack_dir * 1; + + if ( real_attack ) + { + success = MeleeAttack( start, end, 7.5, &self, MOD_LIFEDRAIN, 32, 0, 64, 0 ); + self.AddStateFlag( STATE_FLAG_MELEE_HIT ); + } + else + success = false; + + if ( success || dist <= GHOST_ATTACK_SPEED / 40 ) + { + // Attack mode is done go to retreat mode + + if ( self.attack_blocked && self.attack_blocked_time == level.time ) + { + Vector retreat_angles; + + dir = attack_dir * -1; + + retreat_angles = dir.toAngles(); + retreat_angles[YAW] += G_CRandom( 45 ); + retreat_angles[PITCH] += G_CRandom( 30 ); + retreat_angles.AngleVectors( &dir ); + + dir *= 500; + + self.setAngles( retreat_angles ); + } + else + { + dir = attack_dir; + + dir.z = 0; + dir.normalize(); + dir *= 1000; + dir.z = 300; + } + + retreat_position = self.origin + dir; + + fly.SetGoalPoint( retreat_position ); + + mode = GHOST_ATTACK_END; + } + + // Fade in depending on how close we are to attack position + + if ( dist > 400 ) + new_alpha = 0; + else + new_alpha = ( 400 - dist ) / 400; + + if ( new_alpha > 0.4 ) + new_alpha = 0.4; + + r = new_alpha / 0.4; + g = new_alpha / 0.4; + b = new_alpha / 0.4; + + light_radius = 0; + + G_SetConstantLight( &self.edict->s.constantLight, &r, &g, &b, &light_radius ); + + self.setAlpha( new_alpha ); + } + else + { + // Move away from enemy + + fly.Evaluate( self ); + + // Get the new distance info + + dir = attack_position - self.origin; + dist = dir.length(); + + if ( real_attack && dist > 200 ) + { + // Not attackable again + + self.setSolidType( SOLID_NOT ); + self.setContents( 0 ); + + event = new Event( EV_Actor_SetTargetable ); + event->AddInteger( 0 ); + self.ProcessEvent( event ); + } + + // Fade out depending on how far we are from the attack position + + if ( dist > 400 ) + new_alpha = 0; + else + new_alpha = ( 400 - dist ) / 400; + + if ( new_alpha > 0.4 ) + new_alpha = 0.4; + + r = new_alpha / 0.4; + g = new_alpha / 0.4; + b = new_alpha / 0.4; + + light_radius = 0; + + G_SetConstantLight( &self.edict->s.constantLight, &r, &g, &b, &light_radius ); + + self.setAlpha( new_alpha ); + + // See if we are far enough to be done + + if ( new_alpha == 0 ) + return false; + } + return true; + } + +void GhostAttack::End + ( + Actor &self + ) + + { + // Make sure we can't be shot any more + + self.setSolidType( SOLID_NOT ); + self.setContents( 0 ); + + fly.End( self ); + } + +/**************************************************************************** + + Levitate Class Definition + +****************************************************************************/ + +CLASS_DECLARATION( Behavior, Levitate, NULL ) + { + { &EV_Behavior_Args, SetArgs }, + { NULL, NULL } + }; + +void Levitate::SetArgs + ( + Event *ev + ) + + { + distance = ev->GetFloat( 1 ); + speed = ev->GetFloat( 2 ); + } + + +void Levitate::ShowInfo + ( + Actor &self + ) + + { + Behavior::ShowInfo( self ); + } + +void Levitate::Begin + ( + Actor &self + ) + + { + final_z = self.origin.z + distance; + } + +qboolean Levitate::Evaluate + ( + Actor &self + ) + + { + trace_t trace; + Vector start; + Vector end; + + + start = self.origin; + end = self.origin; + + if ( final_z < self.origin.z ) + { + end.z -= speed; + + if ( end.z < final_z ) + end.z = final_z; + } + else + { + end.z += speed; + + if ( end.z > final_z ) + end.z = final_z; + } + + trace = G_Trace( start, self.mins, self.maxs, end, &self, self.edict->clipmask, false, "Levitate" ); + + if ( trace.fraction != 1 ) + return false; + + if ( end.z == final_z ) + return false; + + self.setOrigin( trace.endpos ); + + return true; + } + +void Levitate::End + ( + Actor &self + ) + + { + } + +/**************************************************************************** +***************************************************************************** + + Utility functions + +***************************************************************************** +****************************************************************************/ + + + +Vector ChooseRandomDirection + ( + Actor &self, + Vector previousdir, + float *time, + int disallowcontentsmask, + qboolean usepitch + ) + { + //static float x[ 9 ] = { 0, 22, -22, 45, -45, 0, 22, -22, 45 }; + static float x[ 9 ] = { 0, 22, -22, 0, 22 }; + Vector dir; + Vector ang; + Vector bestdir; + Vector newdir; + Vector step; + Vector endpos; + Vector groundend; + float bestfraction; + trace_t trace; + trace_t groundtrace; + int i; + int k; + int t; + int u; + int contents; + Vector centroid; + float random_yaw; + float movespeed; + + if ( self.movespeed != 1 ) + movespeed = self.movespeed; + else + movespeed = 100; + + centroid = self.centroid - self.origin; + + step = Vector( 0, 0, STEPSIZE ); + bestfraction = -1; + bestdir = self.origin; + + random_yaw = G_Random( 360 ); + + for( i = 0; i <= 8; i++ ) + { + t = random_yaw + i * 45; + + ang.y = self.angles.y + t; + + if ( usepitch ) + { + u = ( int )G_Random( 5 ); + + //for( k = 0; k < 5; k++ ) + for( k = 0; k < 3; k++ ) + { + ang.x = x[ k + u ]; + ang.AngleVectors( &dir, NULL, NULL ); + + dir *= movespeed * (*time); + dir += self.origin; + trace = G_Trace( self.origin, self.mins, self.maxs, dir, &self, self.edict->clipmask, false, "ChooseRandomDirection 1" ); + + if ( !trace.startsolid && !trace.allsolid ) + { + newdir = Vector( trace.endpos ); + + if ( disallowcontentsmask ) + { + contents = gi.pointcontents( ( newdir + centroid ), 0 ); + + if ( contents & disallowcontentsmask ) + continue; + } + + if ( + ( trace.fraction > bestfraction ) && + ( newdir != bestdir ) && + ( newdir != previousdir ) + ) + { + bestdir = newdir; + bestfraction = trace.fraction; + + if ( bestfraction > .9 ) + { + *time *= bestfraction; + + return bestdir; + } + } + } + } + } + else + { + ang.x = 0; + ang.AngleVectors( &dir, NULL, NULL ); + + endpos = self.origin + dir * movespeed * (*time) + step; + + trace = G_Trace( self.origin + step, self.mins, self.maxs, endpos, &self, self.edict->clipmask, false, "ChooseRandomDirection 2" ); + + if ( !trace.startsolid && !trace.allsolid ) + { + newdir = Vector( trace.endpos ); + + if ( disallowcontentsmask ) + { + contents = gi.pointcontents( ( newdir + centroid ), 0 ); + + if ( contents & disallowcontentsmask ) + continue; + } + + if ( + ( trace.fraction > bestfraction ) && + ( newdir != bestdir ) && + ( newdir != previousdir ) + ) + { + groundend = endpos - step * 2; + + groundtrace = G_Trace( endpos, self.mins, self.maxs, groundend, &self, self.edict->clipmask, false, "Chase::ChooseRandomDirection 3" ); + + if ( groundtrace.fraction == 1 ) + trace.fraction /= 2; + + if ( trace.fraction > bestfraction ) + { + bestdir = newdir; + bestfraction = trace.fraction; + + if ( bestfraction > .9 ) + { + *time *= bestfraction; + + return bestdir; + } + } + } + } + } + } + + if ( bestfraction > 0 ) + { + *time *= bestfraction; + } + else + { + *time = 0; + } + + return bestdir; + } diff --git a/source/source/fgame/behavior.h b/source/source/fgame/behavior.h new file mode 100644 index 0000000..44f3820 --- /dev/null +++ b/source/source/fgame/behavior.h @@ -0,0 +1,1887 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/behavior.h $ +// $Revision:: 62 $ +// $Author:: Steven $ +// $Date:: 7/27/00 10:55p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/behavior.h $ +// +// 62 7/27/00 10:55p Steven +// Improved DragEnemy stuff. +// +// 61 7/21/00 3:47p Steven +// Improved teleport a lot. +// +// 60 7/18/00 4:27p Steven +// Added speed to FlyClimb. +// +// 59 7/13/00 3:43p Steven +// Added next_think_time to GetCloseToEnemy for simple path finding. +// +// 58 7/12/00 11:37a Steven +// Added return_to_original_location to investigate. +// +// 57 7/07/00 8:06a Steven +// Improved the investigation behavior to always look towards the noise +// position. +// +// 56 7/05/00 2:28p Steven +// Improved fleeing behavior a lot. +// +// 55 7/02/00 1:11p Steven +// Changed TeleportToPosition to use named pathnodes instead of hardcoded +// positions. +// +// 54 6/30/00 10:35a Steven +// Added max_pains to Pain behavior. +// +// 53 6/22/00 3:45p Markd +// fixed a bunch of saved game issues +// +// 52 6/07/00 5:34p Steven +// Added TeleportToPosition and Levitate. +// +// 51 6/05/00 3:41p Steven +// Adde GotoDeadEnemy. +// +// 50 5/27/00 2:32p Steven +// Added FlyCloseToPlayer. +// +// 49 5/25/00 7:52p Markd +// 2nd pass save game stuff +// +// 48 5/24/00 4:08p Steven +// Added a forever variable to the HeadWatch behavior. +// +// 47 5/24/00 3:14p Markd +// first phase of save/load games +// +// 46 5/20/00 4:47p Steven +// Improved Shock behavior. +// +// 45 5/06/00 3:00p Steven +// Added speed to FlyCloseToEnemy and fixed actor's getting stuck on top of +// the player. +// +// 44 5/03/00 11:27a Steven +// Added some sounds to the ghost attack and added the spooky ghost attack. +// +// 43 4/28/00 5:40p Steven +// Added use_last_known_pos to TurnToEnemy and BurrowAttack. +// +// 42 4/25/00 10:12a Steven +// Lots of improvements to the GhostAttack behavior. +// +// 41 4/15/00 3:39p Steven +// Made it so the pain animation will randomly choose between all available +// pain animations not just the first 2. +// +// 40 4/13/00 5:34p Steven +// Added the Teleport behavior and the GhostAttack behavior. +// +// 39 4/08/00 3:58p Steven +// Took out walking stuff from PickupEntity. +// +// 38 4/01/00 2:39p Steven +// Made it so actor can fly clockwise or counter-clockwise in FlyCircle. +// +// 37 4/01/00 2:00p Steven +// Added a forever flag to GetCloseToEnemy. +// +// 36 3/30/00 2:03p Steven +// More work on TorsoTurn. +// +// 35 3/28/00 6:49p Steven +// Lots of improvements to TorsoTurn. +// +// 34 3/17/00 11:52a Steven +// Added jumping stuff. +// +// 33 3/14/00 12:07p Steven +// Added walkwatch stuff. +// +// 32 3/07/00 11:51a Steven +// Made lots of tweaks to the CircleEnemy behavior. +// +// 31 3/03/00 5:26p Steven +// Fixed up some save stuff. +// +// 30 2/24/00 7:07p Steven +// Made talk so it would not stand up if already sitting and made it so the +// actor always tries to face whoever its talking to. +// +// 29 2/24/00 5:26p Steven +// Added a max speed parm to head watch. +// +// 28 2/23/00 11:57a Steven +// Moved utility behaviors to actor. +// +// 27 2/21/00 7:00p Steven +// Added a TorsoTurn behavior. +// +// 26 2/17/00 5:43p Steven +// Moved NearestNode stuff out of Investigate to Actor. +// +// 25 2/16/00 6:04p Steven +// Tweaked the investigate behavior a lot. +// +// 24 2/16/00 10:43a Steven +// Added a Pain behavior, made an option for FlyWander to make the actor try +// to fly upwards, and improved the Investigate behavior. +// +// 23 2/11/00 6:41p Steven +// Improved headwatch a little and added pickup/throw. +// +// 22 2/07/00 6:45p Steven +// Made it so the FlyCloseToEnemy behavior doesn't choose a new goal so often. +// +// 21 2/04/00 1:55p Steven +// Added the talk behavior. +// +// 20 2/02/00 1:39p Steven +// Added turning animations to TurnTo, added the HeadWatch behavior, and +// cleaned up flying code a little more. +// +// 19 1/29/00 5:28p Steven +// Improved the BurrowAttack and DragEnemy behaviors. +// +// 18 1/27/00 2:54p Steven +// Improved a lot of the flying code. +// +// 17 1/21/00 6:45p Steven +// Made flee use chase instead of FollowPath. +// +// 16 1/19/00 12:12p Steven +// Improved the TurnToEnemy and BurrowAttack behaviors. +// +// 15 1/14/00 5:02p Steven +// Added gotonextstage and burrowattack behaviors. +// +// 14 1/13/00 7:08p Steven +// Lots and lots of cleanup. +// +// 13 1/07/00 8:12p Jimdose +// cleaning up unused code +// +// 12 1/06/00 6:50p Steven +// Cleaned up GetCloseToEnemy. +// +// 11 12/22/99 5:14p Steven +// Fixed some animation issues, some general clean up, and removed +// FemaleLympAttack. +// +// 10 12/17/99 5:51p Steven +// Added the following behaviors : TurnTowardsEnemy, FlyCircle, FlyDive, and +// FlyClimb. +// +// 9 12/01/99 3:43p Steven +// Added a land behavior for flying creatures. +// +// 8 11/24/99 11:05a Steven +// More work on flying. +// +// 7 11/19/99 2:05p Steven +// Made sure all behavior stuff would save correctly. +// +// 6 11/19/99 11:33a Steven +// Added new behaviors: CircleEnemy, ShockWater, Shock, and CircleAttack. +// +// 5 11/10/99 6:11p Steven +// Added the FlyCloseToEnemy behavior. +// +// 4 10/28/99 6:07p Steven +// Improved the drag behavior. +// +// 3 10/27/99 10:29a Steven +// Added GetNearestEnemy behavior and added more to the DragEnemy behavior. +// +// 2 10/19/99 7:11p Steven +// Lots of AI work. +// +// 1 9/10/99 10:53a Jimdose +// +// 1 9/08/99 3:15p Aldie +// +// 10 8/28/99 7:06p Steven +// Added a speed parameter to the spin behavior. +// +// 9 8/28/99 11:46a Steven +// Added some spinning plant stuff. +// +// 8 8/27/99 5:05p Steven +// Worked on digest behavior,and added spin. +// +// 7 8/18/99 3:23p Steven +// Added to Digest behavior. +// +// 6 8/17/99 4:59p Steven +// New digest behavior for the Sucknblaugh plant. +// +// 5 8/11/99 5:57p Steven +// More general AI work. +// +// 4 8/05/99 9:15a Steven +// New AI stuff. +// +// DESCRIPTION: +// Standard class for creating AI behaviors +// + +#ifndef __BEHAVIOR_H__ +#define __BEHAVIOR_H__ + +#include "g_local.h" +#include "entity.h" +#include "path.h" +#include "steering.h" +#include "beam.h" +#include "sentient.h" + +extern Event EV_Behavior_Args; +extern Event EV_Behavior_AnimDone; + +class Actor; + +class Behavior : public Listener + { + protected: + PathNodePtr movegoal; + + public: + CLASS_PROTOTYPE( Behavior ); + + Behavior(); + + virtual void ShowInfo( Actor &self ); + virtual void Begin( Actor &self ); + virtual qboolean Evaluate( Actor &self ); + virtual void End( Actor &self ); + virtual void Archive( Archiver &arc ); + }; + +inline void Behavior::Archive + ( + Archiver &arc + ) + { + Listener::Archive( arc ); + + arc.ArchiveSafePointer( &movegoal ); + } + +typedef SafePtr BehaviorPtr; + +class Idle : public Behavior + { + private: + float nexttwitch; + + public: + CLASS_PROTOTYPE( Idle ); + + void ShowInfo( Actor &self ); + void Begin( Actor &self ); + qboolean Evaluate( Actor &self ); + void End( Actor &self ); + virtual void Archive( Archiver &arc ); + }; + +inline void Idle::Archive + ( + Archiver &arc + ) + { + Behavior::Archive( arc ); + + arc.ArchiveFloat( &nexttwitch ); + } + +class Pain : public Behavior + { + private: + int current_pain_type; + int pain_anim_number; + qboolean anim_done; + int number_of_pains; + int max_pains; + + public: + CLASS_PROTOTYPE( Pain ); + + void AnimDone( Event *ev ); + + void SetPainAnim( Actor &self, int new_pain_type, int new_anim_number ); + int GetNumberOfPainAnims( Actor &self, int new_pain_type ); + void Begin( Actor &self ); + qboolean Evaluate( Actor &self ); + void End( Actor &self ); + virtual void Archive( Archiver &arc ); + }; + +inline void Pain::Archive + ( + Archiver &arc + ) + { + Behavior::Archive( arc ); + + arc.ArchiveInteger( ¤t_pain_type ); + arc.ArchiveInteger( &pain_anim_number ); + arc.ArchiveBoolean( &anim_done ); + arc.ArchiveInteger( &number_of_pains ); + arc.ArchiveInteger( &max_pains ); + } + +class Watch : public Behavior + { + private: + EntityPtr ent_to_watch; + Seek seek; + float turn_speed; + float old_turn_speed; + + public: + CLASS_PROTOTYPE( Watch ); + + Watch(); + void SetArgs( Event *ev ); + void Begin( Actor &self ); + qboolean Evaluate( Actor &self ); + void End( Actor &self ); + virtual void Archive( Archiver &arc ); + }; + +inline void Watch::Archive + ( + Archiver &arc + ) + { + Behavior::Archive( arc ); + + arc.ArchiveSafePointer( &ent_to_watch ); + arc.ArchiveObject( &seek ); + arc.ArchiveFloat( &turn_speed ); + arc.ArchiveFloat( &old_turn_speed ); + } + +class Turn : public Behavior + { + private: + float turn_speed; + + public: + CLASS_PROTOTYPE( Turn ); + + Turn(); + void SetArgs( Event *ev ); + void Begin( Actor &self ); + qboolean Evaluate( Actor &self ); + void End( Actor &self ); + virtual void Archive( Archiver &arc ); + }; + +inline void Turn::Archive + ( + Archiver &arc + ) + { + Behavior::Archive( arc ); + + arc.ArchiveFloat( &turn_speed ); + } + +class CircleEnemy : public Behavior + { + private: + EntityPtr ent_to_circle; + str center_part_name; + float last_angle_change; + + public: + CLASS_PROTOTYPE( CircleEnemy ); + + void SetArgs( Event *ev ); + float GetAngleDiff( Actor &self, Actor *center_actor, Vector origin ); + void Begin( Actor &self ); + qboolean Evaluate( Actor &self ); + void End( Actor &self ); + virtual void Archive( Archiver &arc ); + }; + +inline void CircleEnemy::Archive + ( + Archiver &arc + ) + { + Behavior::Archive( arc ); + + arc.ArchiveSafePointer( &ent_to_circle ); + arc.ArchiveString( ¢er_part_name ); + arc.ArchiveFloat( &last_angle_change ); + } + +class BurrowAttack : public Behavior + { + private: + Vector goal; + Vector attack_origin; + int burrow_mode; + AnimatePtr leg1; + AnimatePtr leg2; + AnimatePtr leg3; + AnimatePtr leg4; + int stage; + int attacks_left; + float burrow_speed; + qboolean too_close; + qboolean use_last_known_position; + public: + CLASS_PROTOTYPE( BurrowAttack ); + + void SetArgs( Event *ev ); + void Begin( Actor &self ); + qboolean Evaluate( Actor &self ); + void End( Actor &self ); + void SpawnArm( Actor &self, AnimatePtr &leg, Vector arm_origin, const char *anim_name, float angle ); + virtual void Archive( Archiver &arc ); + }; + +inline void BurrowAttack::Archive + ( + Archiver &arc + ) + { + Behavior::Archive( arc ); + + arc.ArchiveVector( &goal ); + arc.ArchiveVector( &attack_origin ); + arc.ArchiveInteger( &burrow_mode ); + arc.ArchiveSafePointer( &leg1 ); + arc.ArchiveSafePointer( &leg2 ); + arc.ArchiveSafePointer( &leg3 ); + arc.ArchiveSafePointer( &leg4 ); + arc.ArchiveInteger( &stage ); + arc.ArchiveInteger( &attacks_left ); + arc.ArchiveFloat( &burrow_speed ); + arc.ArchiveBoolean( &too_close ); + arc.ArchiveBoolean( &use_last_known_position ); + } + +class ShockWater : public Behavior + { + private: + EntityPtr left_beam; + EntityPtr right_beam; + EntityPtr center_beam; + qboolean already_started; + + public: + CLASS_PROTOTYPE( ShockWater ); + + ShockWater(); + void Begin( Actor &self ); + qboolean Evaluate( Actor &self ); + void End( Actor &self ); + virtual void Archive( Archiver &arc ); + }; + +inline void ShockWater::Archive + ( + Archiver &arc + ) + { + Behavior::Archive( arc ); + + arc.ArchiveSafePointer( &left_beam ); + arc.ArchiveSafePointer( &right_beam ); + arc.ArchiveSafePointer( ¢er_beam ); + arc.ArchiveBoolean( &already_started ); + } + +class Shock : public Behavior + { + private: + EntityPtr beam; + str tag_name; + float damage; + qboolean already_started; + float random_angle; + public: + CLASS_PROTOTYPE( Shock ); + + Shock(); + void SetArgs( Event *ev ); + void Begin( Actor &self ); + qboolean Evaluate( Actor &self ); + void End( Actor &self ); + virtual void Archive( Archiver &arc ); + }; + +inline void Shock::Archive + ( + Archiver &arc + ) + { + Behavior::Archive( arc ); + + arc.ArchiveSafePointer( &beam ); + arc.ArchiveString( &tag_name ); + arc.ArchiveFloat( &damage ); + arc.ArchiveBoolean( &already_started ); + arc.ArchiveFloat( &random_angle ); + } + +class CircleAttack : public Behavior + { + private: + EntityPtr first_part; + EntityPtr current_part; + str command; + str direction; + float next_time; + int current_direction; + int number_of_attacks; + public: + CLASS_PROTOTYPE( CircleAttack ); + + CircleAttack(); + Actor *FindClosestPart( Actor &self, float angle ); + void SetArgs( Event *ev ); + void Begin( Actor &self ); + qboolean Evaluate( Actor &self ); + void End( Actor &self ); + virtual void Archive( Archiver &arc ); + }; + +inline void CircleAttack::Archive + ( + Archiver &arc + ) + { + Behavior::Archive( arc ); + + arc.ArchiveSafePointer( &first_part ); + arc.ArchiveSafePointer( ¤t_part ); + arc.ArchiveString( &command ); + arc.ArchiveString( &direction ); + arc.ArchiveFloat( &next_time ); + arc.ArchiveInteger( ¤t_direction ); + arc.ArchiveInteger( &number_of_attacks ); + } + +class DragEnemy : public Behavior + { + private: + EntityPtr ent_to_drag; + str tag_name; + int damage; + float target_yaw; + float last_turn_time; + qboolean attached; + Vector offset; + qboolean drop; + public: + CLASS_PROTOTYPE( DragEnemy ); + + void SetArgs( Event *ev ); + void Begin( Actor &self ); + qboolean Evaluate( Actor &self ); + void End( Actor &self ); + virtual void Archive( Archiver &arc ); + }; + +inline void DragEnemy::Archive + ( + Archiver &arc + ) + { + Behavior::Archive( arc ); + + arc.ArchiveSafePointer( &ent_to_drag ); + arc.ArchiveString( &tag_name ); + arc.ArchiveInteger( &damage ); + arc.ArchiveFloat( &target_yaw ); + arc.ArchiveFloat( &last_turn_time ); + arc.ArchiveBoolean( &attached ); + arc.ArchiveVector( &offset ); + arc.ArchiveBoolean( &drop ); + } + +class Spin : public Behavior + { + private: + float speed; + + public: + CLASS_PROTOTYPE( Spin ); + + Spin(); + void Begin( Actor &self ); + qboolean Evaluate( Actor &self ); + void End( Actor &self ); + void SetArgs( Event *ev ); + virtual void Archive( Archiver &arc ); + }; + +inline void Spin::Archive + ( + Archiver &arc + ) + { + Behavior::Archive( arc ); + + arc.ArchiveFloat( &speed ); + } + +class Digest : public Behavior + { + private: + float digest_time; + float spit_time; + Container foodlist; + qboolean anim_done; + qboolean spitting; + qboolean spit; + qboolean yuck; + + void AnimDone( Event *ev ); + + public: + CLASS_PROTOTYPE( Digest ); + + void ShowInfo( Actor &self ); + void Begin( Actor &self ); + qboolean Evaluate( Actor &self ); + void End( Actor &self ); + void Eat( Entity *food, Actor &self ); + virtual void Archive( Archiver &arc ); + }; + +inline void Digest::Archive + ( + Archiver &arc + ) + { + EntityPtr *temp; + int num; + int i; + + Behavior::Archive( arc ); + + arc.ArchiveFloat( &digest_time ); + arc.ArchiveFloat( &spit_time ); + + if ( arc.Loading() ) + { + foodlist.FreeObjectList(); + } + else + { + num = foodlist.NumObjects(); + } + arc.ArchiveInteger( &num ); + if ( arc.Loading() ) + { + foodlist.Resize( num ); + } + for( i = 1; i <= num; i++ ) + { + temp = foodlist.AddressOfObjectAt( i ); + arc.ArchiveSafePointer( temp ); + } + + arc.ArchiveBoolean( &anim_done ); + arc.ArchiveBoolean( &spitting ); + arc.ArchiveBoolean( &spit ); + arc.ArchiveBoolean( &yuck ); + } + +class Aim : public Behavior + { + private: + Seek seek; + EntityPtr target; + + public: + CLASS_PROTOTYPE( Aim ); + + void SetTarget( Entity *ent ); + void ShowInfo( Actor &self ); + void Begin( Actor &self ); + qboolean Evaluate( Actor &self ); + void End( Actor &self ); + virtual void Archive( Archiver &arc ); + }; + +inline void Aim::Archive + ( + Archiver &arc + ) + { + Behavior::Archive( arc ); + + arc.ArchiveObject( &seek ); + arc.ArchiveSafePointer( &target ); + } + +class TurnTo : public Behavior + { + private: + Seek seek; + EntityPtr ent; + Vector dir; + float yaw; + int mode; + qboolean anim_done; + + public: + CLASS_PROTOTYPE( TurnTo ); + + TurnTo(); + void SetDirection( float yaw ); + void SetTarget( Entity *ent ); + void AnimDone( Event *ev ); + void ShowInfo( Actor &self ); + void Begin( Actor &self ); + qboolean Evaluate( Actor &self ); + void End( Actor &self ); + virtual void Archive( Archiver &arc ); + }; + +inline void TurnTo::Archive + ( + Archiver &arc + ) + { + Behavior::Archive( arc ); + + arc.ArchiveObject( &seek ); + arc.ArchiveSafePointer( &ent ); + arc.ArchiveVector( &dir ); + arc.ArchiveFloat( &yaw ); + arc.ArchiveInteger( &mode ); + arc.ArchiveBoolean( &anim_done ); + } + +class PickupEntity : public Behavior + { + private: + str pickup_anim_name; + qboolean anim_done; + EntityPtr ent_to_pickup; + + public: + CLASS_PROTOTYPE( PickupEntity ); + + void SetArgs( Event *ev ); + void AnimDone( Event *ev ); + void Begin( Actor &self ); + qboolean Evaluate( Actor &self ); + void End( Actor &self ); + virtual void Archive( Archiver &arc ); + }; + +inline void PickupEntity::Archive + ( + Archiver &arc + ) + { + Behavior::Archive( arc ); + + arc.ArchiveString( &pickup_anim_name ); + arc.ArchiveBoolean( &anim_done ); + arc.ArchiveSafePointer( &ent_to_pickup ); + } + +class ThrowEntity : public Behavior + { + private: + str throw_anim_name; + qboolean anim_done; + + public: + CLASS_PROTOTYPE( ThrowEntity ); + + void SetArgs( Event *ev ); + void AnimDone( Event *ev ); + void Begin( Actor &self ); + qboolean Evaluate( Actor &self ); + void End( Actor &self ); + virtual void Archive( Archiver &arc ); + }; + +inline void ThrowEntity::Archive + ( + Archiver &arc + ) + { + Behavior::Archive( arc ); + + arc.ArchiveString( &throw_anim_name ); + arc.ArchiveBoolean( &anim_done ); + } + +class HeadWatch : public Behavior + { + private: + EntityPtr ent_to_watch; + Vector current_head_angles; + float max_speed; + qboolean forever; + public: + CLASS_PROTOTYPE( HeadWatch ); + + HeadWatch(); + void SetArgs( Event *ev ); + void ShowInfo( Actor &self ); + void Begin( Actor &self ); + qboolean Evaluate( Actor &self ); + void End( Actor &self ); + virtual void Archive( Archiver &arc ); + }; + +inline void HeadWatch::Archive + ( + Archiver &arc + ) + { + Behavior::Archive( arc ); + + arc.ArchiveSafePointer( &ent_to_watch ); + arc.ArchiveVector( ¤t_head_angles ); + arc.ArchiveFloat( &max_speed ); + arc.ArchiveBoolean( &forever ); + } + +class TorsoTurn : public Behavior + { + private: + int turn_towards_enemy; + float speed; + int forever; + float current_yaw; + float current_pitch; + str tag_name; + float tolerance; + public: + CLASS_PROTOTYPE( TorsoTurn ); + + void SetArgs( Event *ev ); + void ShowInfo( Actor &self ); + void Begin( Actor &self ); + qboolean Evaluate( Actor &self ); + void End( Actor &self ); + virtual void Archive( Archiver &arc ); + }; + +inline void TorsoTurn::Archive + ( + Archiver &arc + ) + { + Behavior::Archive( arc ); + + arc.ArchiveInteger( &turn_towards_enemy ); + arc.ArchiveFloat( &speed ); + arc.ArchiveInteger( &forever ); + arc.ArchiveFloat( ¤t_yaw ); + arc.ArchiveFloat( ¤t_pitch ); + arc.ArchiveString( &tag_name ); + arc.ArchiveFloat( &tolerance ); + } + +class GotoPathNode : public Behavior + { + private: + TurnTo turnto; + Chase chase; + int state; + qboolean usevec; + float time; + str anim; + EntityPtr goalent; + Vector goal; + EntityPtr entity_to_watch; + HeadWatch head_watch; + + public: + CLASS_PROTOTYPE( GotoPathNode ); + + GotoPathNode(); + void SetArgs( Event *ev ); + void SetGoal( PathNode *node ); + void AnimDone( Event *ev ); + void ShowInfo( Actor &self ); + void Begin( Actor &self ); + qboolean Evaluate( Actor &self ); + void End( Actor &self ); + virtual void Archive( Archiver &arc ); + }; + +inline void GotoPathNode::Archive + ( + Archiver &arc + ) + { + Behavior::Archive( arc ); + + arc.ArchiveObject( &turnto ); + arc.ArchiveObject( &chase ); + arc.ArchiveInteger( &state ); + arc.ArchiveBoolean( &usevec ); + arc.ArchiveFloat( &time ); + arc.ArchiveString( &anim ); + arc.ArchiveSafePointer( &goalent ); + arc.ArchiveVector( &goal ); + arc.ArchiveSafePointer( &entity_to_watch ); + arc.ArchiveObject( &head_watch ); + } + +class Flee : public Behavior + { + private: + Chase chase; + str anim; + PathNodePtr flee_node; + + public: + CLASS_PROTOTYPE( Flee ); + + void SetArgs( Event *ev ); + void ShowInfo( Actor &self ); + void Begin( Actor &self ); + void FindFleeNode( Actor &self ); + qboolean Evaluate( Actor &self ); + void End( Actor &self ); + virtual void Archive( Archiver &arc ); + }; + +inline void Flee::Archive + ( + Archiver &arc + ) + { + Behavior::Archive( arc ); + + arc.ArchiveObject( &chase ); + arc.ArchiveString( &anim ); + arc.ArchiveSafePointer( &flee_node ); + } + +class PlayAnim : public Behavior + { + private: + str anim; + + public: + CLASS_PROTOTYPE( PlayAnim ); + + void SetArgs( Event *ev ); + void ShowInfo( Actor &self ); + void Begin( Actor &self ); + qboolean Evaluate( Actor &self ); + void End( Actor &self ); + virtual void Archive( Archiver &arc ); + }; + +inline void PlayAnim::Archive + ( + Archiver &arc + ) + { + Behavior::Archive( arc ); + + arc.ArchiveString( &anim ); + } + +class Talk : public Behavior + { + private: + TurnTo turnto; + SentientPtr ent_listening; + float original_yaw; + float yaw; + int mode; + qboolean move_allowed; + + public: + CLASS_PROTOTYPE( Talk ); + + void SetUser( Sentient *user ); + void AnimDone( Event *ev ); + void Begin( Actor &self ); + qboolean Evaluate( Actor &self ); + void End( Actor &self ); + virtual void Archive( Archiver &arc ); + }; + +inline void Talk::Archive + ( + Archiver &arc + ) + { + Behavior::Archive( arc ); + + arc.ArchiveObject( &turnto ); + arc.ArchiveSafePointer( &ent_listening ); + arc.ArchiveFloat( &original_yaw ); + arc.ArchiveFloat( &yaw ); + arc.ArchiveInteger( &mode ); + arc.ArchiveBoolean( &move_allowed ); + } + +class FindCover : public Behavior + { + private: + str anim; + str crouch_anim; + Chase chase; + int state; + float nextsearch; + + public: + CLASS_PROTOTYPE( FindCover ); + + void SetArgs( Event *ev ); + PathNode *FindCoverNode( Actor &self ); + void ShowInfo( Actor &self ); + void Begin( Actor &self ); + qboolean Evaluate( Actor &self ); + void End( Actor &self ); + virtual void Archive( Archiver &arc ); + }; + +inline void FindCover::Archive + ( + Archiver &arc + ) + { + Behavior::Archive( arc ); + + arc.ArchiveString( &anim ); + arc.ArchiveString( &crouch_anim ); + arc.ArchiveObject( &chase ); + arc.ArchiveInteger( &state ); + arc.ArchiveFloat( &nextsearch ); + } + +class FindFlee : public Behavior + { + private: + str anim; + Chase chase; + int state; + float nextsearch; + + public: + CLASS_PROTOTYPE( FindFlee ); + + void SetArgs( Event *ev ); + PathNode *FindFleeNode( Actor &self ); + void ShowInfo( Actor &self ); + void Begin( Actor &self ); + qboolean Evaluate( Actor &self ); + void End( Actor &self ); + virtual void Archive( Archiver &arc ); + }; + +inline void FindFlee::Archive + ( + Archiver &arc + ) + { + Behavior::Archive( arc ); + + arc.ArchiveString( &anim ); + arc.ArchiveObject( &chase ); + arc.ArchiveInteger( &state ); + arc.ArchiveFloat( &nextsearch ); + } + +class FindEnemy : public Behavior + { + private: + str anim; + Chase chase; + int state; + float nextsearch; + PathNodePtr lastSearchNode; + Vector lastSearchPos; + + public: + CLASS_PROTOTYPE( FindEnemy ); + + PathNode *FindClosestSightNode( Actor &self ); + void SetArgs( Event *ev ); + void ShowInfo( Actor &self ); + void Begin( Actor &self ); + qboolean Evaluate( Actor &self ); + void End( Actor &self ); + virtual void Archive( Archiver &arc ); + }; + +inline void FindEnemy::Archive + ( + Archiver &arc + ) + { + Behavior::Archive( arc ); + + arc.ArchiveString( &anim ); + arc.ArchiveObject( &chase ); + arc.ArchiveInteger( &state ); + arc.ArchiveFloat( &nextsearch ); + arc.ArchiveSafePointer( &lastSearchNode ); + arc.ArchiveVector( &lastSearchPos ); + } + +class AimAndShoot : public Behavior + { + private: + Aim aim; + int mode; + int maxshots; + int numshots; + qboolean animdone; + float enemy_health; + float aim_time; + str animprefix; + str aimanim; + str fireanim; + + public: + CLASS_PROTOTYPE( AimAndShoot ); + + AimAndShoot(); + void SetMaxShots( int num ); + void SetArgs( Event *ev ); + void AnimDone( Event *ev ); + void ShowInfo( Actor &self ); + void Begin( Actor &self ); + qboolean Evaluate( Actor &self ); + void End( Actor &self ); + virtual void Archive( Archiver &arc ); + }; + +inline void AimAndShoot::Archive + ( + Archiver &arc + ) + { + Behavior::Archive( arc ); + + arc.ArchiveObject( &aim ); + arc.ArchiveInteger( &mode ); + arc.ArchiveInteger( &maxshots ); + arc.ArchiveInteger( &numshots ); + arc.ArchiveBoolean( &animdone ); + arc.ArchiveFloat( &enemy_health ); + arc.ArchiveFloat( &aim_time ); + arc.ArchiveString( &animprefix ); + arc.ArchiveString( &aimanim ); + arc.ArchiveString( &fireanim ); + } + +class AimAndMelee : public Behavior + { + private: + Aim aim; + int mode; + int maxshots; + int numshots; + qboolean animdone; + str anim_name; + + public: + CLASS_PROTOTYPE( AimAndMelee ); + + AimAndMelee(); + void SetArgs( Event *ev ); + void AnimDone( Event *ev ); + void ShowInfo( Actor &self ); + void Begin( Actor &self ); + qboolean Evaluate( Actor &self ); + void End( Actor &self ); + virtual void Archive( Archiver &arc ); + }; + +inline void AimAndMelee::Archive + ( + Archiver &arc + ) + { + Behavior::Archive( arc ); + + arc.ArchiveObject( &aim ); + arc.ArchiveInteger( &mode ); + arc.ArchiveInteger( &maxshots ); + arc.ArchiveInteger( &numshots ); + arc.ArchiveBoolean( &animdone ); + arc.ArchiveString( &anim_name ); + } + +class JumpToPathNode : public Behavior + { + private: + Jump jump; + public: + CLASS_PROTOTYPE( JumpToPathNode ); + + void SetArgs( Event *ev ); + void Begin( Actor &self ); + qboolean Evaluate( Actor &self ); + void End( Actor &self ); + virtual void Archive( Archiver &arc ); + }; + +inline void JumpToPathNode::Archive + ( + Archiver &arc + ) + { + Behavior::Archive( arc ); + + arc.ArchiveObject( &jump ); + } + +class FlyToPoint : public Behavior + { + private: + float avoidtime; + Vector target_angle; + float turn_speed; + float speed; + float old_forward_speed; + Vector goal; + qboolean random_allowed; + qboolean force_goal; + int stuck; + Vector temp_goal; + qboolean use_temp_goal; + + public: + CLASS_PROTOTYPE( FlyToPoint ); + + FlyToPoint(); + + void SetTurnSpeed( float new_turn_speed ); + void SetGoalPoint( Vector goal_point ); + void SetRandomAllowed( qboolean allowed ); + void SetSpeed( float speed_value ); + void ForceGoal( void ); + void ShowInfo( Actor &self ); + void Begin( Actor &self ); + qboolean Evaluate( Actor &self ); + float LerpAngle( float old_angle, float new_angle, float lerp_amount ); + void End( Actor &self ); + virtual void Archive( Archiver &arc ); + }; + +inline void FlyToPoint::Archive + ( + Archiver &arc + ) + { + Behavior::Archive( arc ); + + arc.ArchiveFloat( &avoidtime ); + arc.ArchiveVector( &target_angle ); + arc.ArchiveFloat( &turn_speed ); + arc.ArchiveFloat( &speed ); + arc.ArchiveFloat( &old_forward_speed ); + arc.ArchiveVector( &goal ); + arc.ArchiveBoolean( &random_allowed ); + arc.ArchiveBoolean( &force_goal ); + arc.ArchiveInteger( &stuck ); + arc.ArchiveVector( &temp_goal ); + arc.ArchiveBoolean( &use_temp_goal ); + } + +class FlyCloseToEnemy : public Behavior + { + private: + str anim; + float turn_speed; + float speed; + FlyToPoint fly; + float next_goal_time; + + public: + CLASS_PROTOTYPE( FlyCloseToEnemy ); + + FlyCloseToEnemy(); + + void SetArgs( Event *ev ); + void ShowInfo( Actor &self ); + void Begin( Actor &self ); + qboolean Evaluate( Actor &self ); + void End( Actor &self ); + virtual void Archive( Archiver &arc ); + }; + +inline void FlyCloseToEnemy::Archive + ( + Archiver &arc + ) + { + Behavior::Archive( arc ); + + arc.ArchiveString( &anim ); + arc.ArchiveFloat( &turn_speed ); + arc.ArchiveFloat( &speed ); + arc.ArchiveObject( &fly ); + arc.ArchiveFloat( &next_goal_time ); + } + +class FlyCloseToPlayer : public Behavior + { + private: + str anim; + float turn_speed; + float speed; + FlyToPoint fly; + float next_goal_time; + + public: + CLASS_PROTOTYPE( FlyCloseToPlayer ); + + FlyCloseToPlayer(); + + void SetArgs( Event *ev ); + void ShowInfo( Actor &self ); + void Begin( Actor &self ); + qboolean Evaluate( Actor &self ); + void End( Actor &self ); + virtual void Archive( Archiver &arc ); + }; + +inline void FlyCloseToPlayer::Archive + ( + Archiver &arc + ) + { + Behavior::Archive( arc ); + + arc.ArchiveString( &anim ); + arc.ArchiveFloat( &turn_speed ); + arc.ArchiveFloat( &speed ); + arc.ArchiveObject( &fly ); + arc.ArchiveFloat( &next_goal_time ); + } + +class FlyWander : public Behavior + { + private: + str anim; + float turn_speed; + float speed; + FlyToPoint fly; + float change_course_time; + float next_change_course_time; + float original_z; + Vector goal; + qboolean try_to_go_up; + + public: + CLASS_PROTOTYPE( FlyWander ); + + FlyWander(); + + void SetArgs( Event *ev ); + void ShowInfo( Actor &self ); + void Begin( Actor &self ); + qboolean Evaluate( Actor &self ); + void End( Actor &self ); + virtual void Archive( Archiver &arc ); + }; + +inline void FlyWander::Archive + ( + Archiver &arc + ) + { + Behavior::Archive( arc ); + + arc.ArchiveString( &anim ); + arc.ArchiveFloat( &turn_speed ); + arc.ArchiveFloat( &speed ); + arc.ArchiveObject( &fly ); + arc.ArchiveFloat( &change_course_time ); + arc.ArchiveFloat( &next_change_course_time ); + arc.ArchiveFloat( &original_z ); + arc.ArchiveVector( &goal ); + arc.ArchiveBoolean( &try_to_go_up ); + } + +class FlyCircle : public Behavior + { + private: + str anim; + FlyToPoint fly; + float original_z; + qboolean fly_clockwise; + + public: + CLASS_PROTOTYPE( FlyCircle ); + + FlyCircle(); + + void SetArgs( Event *ev ); + void ShowInfo( Actor &self ); + void Begin( Actor &self ); + qboolean Evaluate( Actor &self ); + void End( Actor &self ); + virtual void Archive( Archiver &arc ); + }; + +inline void FlyCircle::Archive + ( + Archiver &arc + ) + { + Behavior::Archive( arc ); + + arc.ArchiveString( &anim ); + arc.ArchiveObject( &fly ); + arc.ArchiveFloat( &original_z ); + arc.ArchiveBoolean( &fly_clockwise ); + } + + +class FlyDive : public Behavior + { + private: + str anim; + FlyToPoint fly; + Vector goal; + float speed; + float old_speed; + float damage; + + public: + CLASS_PROTOTYPE( FlyDive ); + + FlyDive(); + + void SetArgs( Event *ev ); + void ShowInfo( Actor &self ); + void Begin( Actor &self ); + qboolean Evaluate( Actor &self ); + void End( Actor &self ); + virtual void Archive( Archiver &arc ); + }; + +inline void FlyDive::Archive + ( + Archiver &arc + ) + { + Behavior::Archive( arc ); + + arc.ArchiveString( &anim ); + arc.ArchiveObject( &fly ); + arc.ArchiveVector( &goal ); + arc.ArchiveFloat( &speed ); + arc.ArchiveFloat( &old_speed ); + arc.ArchiveFloat( &damage ); + } + +class FlyClimb : public Behavior + { + private: + str anim; + FlyToPoint fly; + Vector goal; + float height; + float speed; + float next_height_check; + float last_check_height; + + public: + CLASS_PROTOTYPE( FlyClimb ); + + FlyClimb(); + + void SetArgs( Event *ev ); + void ShowInfo( Actor &self ); + void Begin( Actor &self ); + qboolean Evaluate( Actor &self ); + void End( Actor &self ); + virtual void Archive( Archiver &arc ); + }; + +inline void FlyClimb::Archive + ( + Archiver &arc + ) + { + Behavior::Archive( arc ); + + arc.ArchiveString( &anim ); + arc.ArchiveObject( &fly ); + arc.ArchiveVector( &goal ); + arc.ArchiveFloat( &height ); + arc.ArchiveFloat( &speed ); + arc.ArchiveFloat( &next_height_check ); + arc.ArchiveFloat( &last_check_height ); + } + +class Land : public Behavior + { + private: + str anim; + + public: + CLASS_PROTOTYPE( Land ); + + Land(); + + void SetArgs( Event *ev ); + void ShowInfo( Actor &self ); + void Begin( Actor &self ); + qboolean Evaluate( Actor &self ); + void End( Actor &self ); + virtual void Archive( Archiver &arc ); + }; + +inline void Land::Archive + ( + Archiver &arc + ) + { + Behavior::Archive( arc ); + + arc.ArchiveString( &anim ); + } + +// Fixme / don't think this works right now + +class Wander : public Behavior + { + private: + Seek seek; + //ObstacleAvoidance avoid; + str anim; + float avoidtime; + Vector avoidvec; + + public: + CLASS_PROTOTYPE( Wander ); + + void SetArgs( Event *ev ); + void ShowInfo( Actor &self ); + void Begin( Actor &self ); + qboolean Evaluate( Actor &self ); + void End( Actor &self ); + virtual void Archive( Archiver &arc ); + }; + +inline void Wander::Archive + ( + Archiver &arc + ) + { + Behavior::Archive( arc ); + + arc.ArchiveObject( &seek ); + //arc.ArchiveObject( &avoid ); + arc.ArchiveString( &anim ); + arc.ArchiveFloat( &avoidtime ); + arc.ArchiveVector( &avoidvec ); + } + +class GetCloseToEnemy : public Behavior + { + private: + str anim; + Chase chase; + Wander wander; + qboolean forever; + float next_think_time; + + public: + CLASS_PROTOTYPE( GetCloseToEnemy ); + + void SetArgs( Event *ev ); + void ShowInfo( Actor &self ); + void Begin( Actor &self ); + qboolean Evaluate( Actor &self ); + void End( Actor &self ); + virtual void Archive( Archiver &arc ); + }; + +inline void GetCloseToEnemy::Archive + ( + Archiver &arc + ) + + { + Behavior::Archive( arc ); + + arc.ArchiveString( &anim ); + arc.ArchiveObject( &chase ); + arc.ArchiveObject( &wander ); + arc.ArchiveBoolean( &forever ); + arc.ArchiveFloat( &next_think_time ); + } + +class GotoDeadEnemy : public Behavior + { + private: + str anim; + Chase chase; + + public: + CLASS_PROTOTYPE( GotoDeadEnemy ); + + void SetArgs( Event *ev ); + void ShowInfo( Actor &self ); + void Begin( Actor &self ); + qboolean Evaluate( Actor &self ); + void End( Actor &self ); + virtual void Archive( Archiver &arc ); + }; + +inline void GotoDeadEnemy::Archive + ( + Archiver &arc + ) + + { + Behavior::Archive( arc ); + + arc.ArchiveString( &anim ); + arc.ArchiveObject( &chase ); + } + +class Investigate : public Behavior + { + private: + Chase chase; + str anim; + Vector goal; + Vector real_goal_position; + float curioustime; + TurnTo turnto; + float investigate_time; + int mode; + Vector start_pos; + float start_yaw; + qboolean return_to_original_location; + + public: + CLASS_PROTOTYPE( Investigate ); + Investigate(); + void SetArgs( Event *ev ); + void ShowInfo( Actor &self ); + void Begin( Actor &self ); + qboolean Evaluate( Actor &self ); + void End( Actor &self ); + virtual void Archive( Archiver &arc ); + }; + +inline void Investigate::Archive + ( + Archiver &arc + ) + { + Behavior::Archive( arc ); + + arc.ArchiveObject( &chase ); + arc.ArchiveString( &anim ); + arc.ArchiveVector( &goal ); + arc.ArchiveVector( &real_goal_position ); + arc.ArchiveFloat( &curioustime ); + arc.ArchiveObject( &turnto ); + arc.ArchiveFloat( &investigate_time ); + arc.ArchiveInteger( &mode ); + arc.ArchiveVector( &start_pos ); + arc.ArchiveFloat( &start_yaw ); + arc.ArchiveBoolean( &return_to_original_location ); + } + + +class TurnInvestigate : public Behavior + { + private: + Seek seek; + str left_anim; + str right_anim; + float turn_speed; + Vector goal; + public: + CLASS_PROTOTYPE( TurnInvestigate ); + + void SetArgs( Event *ev ); + void ShowInfo( Actor &self ); + void Begin( Actor &self ); + qboolean Evaluate( Actor &self ); + void End( Actor &self ); + virtual void Archive( Archiver &arc ); + }; + +inline void TurnInvestigate::Archive + ( + Archiver &arc + ) + { + Behavior::Archive( arc ); + + arc.ArchiveObject( &seek ); + arc.ArchiveString( &left_anim ); + arc.ArchiveString( &right_anim ); + arc.ArchiveFloat( &turn_speed ); + arc.ArchiveVector( &goal ); + } + +class TurnToEnemy : public Behavior + { + private: + Seek seek; + str left_anim; + str right_anim; + float turn_speed; + qboolean forever; + qboolean anim_done; + qboolean use_last_known_position; + public: + CLASS_PROTOTYPE( TurnToEnemy ); + + void SetArgs( Event *ev ); + void AnimDone( Event *ev ); + void ShowInfo( Actor &self ); + void Begin( Actor &self ); + qboolean Evaluate( Actor &self ); + void End( Actor &self ); + virtual void Archive( Archiver &arc ); + }; + +inline void TurnToEnemy::Archive + ( + Archiver &arc + ) + { + Behavior::Archive( arc ); + + arc.ArchiveObject( &seek ); + arc.ArchiveString( &left_anim ); + arc.ArchiveString( &right_anim ); + arc.ArchiveFloat( &turn_speed ); + arc.ArchiveBoolean( &forever ); + arc.ArchiveBoolean( &anim_done ); + arc.ArchiveBoolean( &use_last_known_position ); + } + +class Teleport : public Behavior + { + private: + public: + CLASS_PROTOTYPE( Teleport ); + + void ShowInfo( Actor &self ); + void Begin( Actor &self ); + qboolean TestPosition( Actor &self, int test_pos, Vector &good_position, qboolean use_enemy_dir ); + qboolean Evaluate( Actor &self ); + void End( Actor &self ); + }; + +class TeleportToPosition : public Behavior + { + private: + str teleport_position_name; + int number_of_teleport_positions; + public: + CLASS_PROTOTYPE( TeleportToPosition ); + + void SetArgs( Event *ev ); + void ShowInfo( Actor &self ); + void Begin( Actor &self ); + qboolean TestPosition( Actor &self, int test_pos, Vector &good_position ); + qboolean Evaluate( Actor &self ); + void End( Actor &self ); + virtual void Archive( Archiver &arc ); + }; + +inline void TeleportToPosition::Archive + ( + Archiver &arc + ) + { + Behavior::Archive( arc ); + + arc.ArchiveString( &teleport_position_name ); + arc.ArchiveInteger( &number_of_teleport_positions ); + } + +class GhostAttack : public Behavior + { + private: + int mode; + Vector attack_dir; + Vector attack_position; + Vector retreat_position; + FlyToPoint fly; + qboolean real_attack; + public: + CLASS_PROTOTYPE( GhostAttack ); + + void SetArgs( Event *ev ); + void ShowInfo( Actor &self ); + void Begin( Actor &self ); + qboolean Evaluate( Actor &self ); + void End( Actor &self ); + virtual void Archive( Archiver &arc ); + }; + +inline void GhostAttack::Archive + ( + Archiver &arc + ) + { + Behavior::Archive( arc ); + + arc.ArchiveInteger( &mode ); + arc.ArchiveVector( &attack_dir ); + arc.ArchiveVector( &attack_position ); + arc.ArchiveVector( &retreat_position ); + arc.ArchiveObject( &fly ); + arc.ArchiveBoolean( &real_attack ); + } + +class Levitate : public Behavior + { + private: + float distance; + float speed; + float final_z; + public: + CLASS_PROTOTYPE( Levitate ); + + void SetArgs( Event *ev ); + void ShowInfo( Actor &self ); + void Begin( Actor &self ); + qboolean Evaluate( Actor &self ); + void End( Actor &self ); + virtual void Archive( Archiver &arc ); + }; + +inline void Levitate::Archive + ( + Archiver &arc + ) + { + Behavior::Archive( arc ); + + arc.ArchiveFloat( &distance ); + arc.ArchiveFloat( &speed ); + arc.ArchiveFloat( &final_z ); + } + +#endif /* behavior.h */ diff --git a/source/source/fgame/bg_local.h b/source/source/fgame/bg_local.h new file mode 100644 index 0000000..1f403e0 --- /dev/null +++ b/source/source/fgame/bg_local.h @@ -0,0 +1,98 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/bg_local.h $ +// $Revision:: 4 $ +// $Date:: 6/01/00 7:00p $ +// +// Copyright (C) 1999 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/bg_local.h $ +// +// 4 6/01/00 7:00p Markd +// added partial friciton for slippery surfaces +// +// 3 12/11/99 3:37p Markd +// q3a gold checkin, first time +// +// 2 9/10/99 3:08p Jimdose +// merge +// +// DESCRIPTION: +// bg_local.h -- local definitions for the bg (both games) files +// + +#ifndef __BG_LOCAL_H__ +#define __BG_LOCAL_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#define MIN_WALK_NORMAL 0.7 // can't walk on very steep slopes + +#define STEPSIZE 18 + +#define JUMP_VELOCITY 270 + +#define TIMER_LAND 130 +#define TIMER_GESTURE (34*66+50) + +#define OVERCLIP 1.001 + +// all of the locals will be zeroed before each +// pmove, just to make damn sure we don't have +// any differences when running on client or server +typedef struct { + vec3_t forward, right, up; + float frametime; + + int msec; + + qboolean walking; + qboolean groundPlane; + trace_t groundTrace; + + float impactSpeed; + + vec3_t previous_origin; + vec3_t previous_velocity; + int previous_waterlevel; +} pml_t; + +extern pmove_t *pm; +extern pml_t pml; + +// movement parameters +extern float pm_stopspeed; +extern float pm_duckScale; +extern float pm_swimScale; +extern float pm_wadeScale; + +extern float pm_accelerate; +extern float pm_airaccelerate; +extern float pm_wateraccelerate; +extern float pm_flyaccelerate; + +extern float pm_friction; +extern float pm_waterfriction; +extern float pm_flightfriction; +extern float pm_slipperyfriction; + +extern int c_pmove; + +void PM_ClipVelocity( vec3_t in, vec3_t normal, vec3_t out, float overbounce ); +void PM_AddTouchEnt( int entityNum ); +void PM_AddEvent( int newEvent ); + +qboolean PM_SlideMove( qboolean gravity ); +void PM_StepSlideMove( qboolean gravity ); + +#ifdef __cplusplus + } +#endif + +#endif /* !__BG_LOCAL_H__ */ diff --git a/source/source/fgame/bg_misc.c b/source/source/fgame/bg_misc.c new file mode 100644 index 0000000..0cffc03 --- /dev/null +++ b/source/source/fgame/bg_misc.c @@ -0,0 +1,117 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/bg_misc.c $ +// $Revision:: 8 $ +// $Author:: Markd $ +// $Date:: 10/12/99 2:23p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/bg_misc.c $ +// +// 8 10/12/99 2:23p Markd +// Rewrote camera and player movetype system +// +// 7 10/05/99 6:01p Aldie +// Added headers +// +// DESCRIPTION: +// Misc functions that are used in the client and server game dlls + +// included in both game dll and client + +#include "q_shared.h" +#include "bg_public.h" + +/* +================ +EvaluateTrajectory + +================ +*/ +void EvaluateTrajectory( const trajectory_t *tr, int atTime, vec3_t result ) { + float deltaTime; + float phase; + + switch( tr->trType ) { + case TR_STATIONARY: + case TR_INTERPOLATE: + VectorCopy( tr->trBase, result ); + break; + case TR_LINEAR: + deltaTime = ( atTime - tr->trTime ) * 0.001; // milliseconds to seconds + VectorMA( tr->trBase, deltaTime, tr->trDelta, result ); + break; + case TR_SINE: + deltaTime = ( atTime - tr->trTime ) / (float) tr->trDuration; + phase = sin( deltaTime * M_PI * 2 ); + VectorMA( tr->trBase, phase, tr->trDelta, result ); + break; + case TR_LINEAR_STOP: + if ( atTime > tr->trTime + tr->trDuration ) { + atTime = tr->trTime + tr->trDuration; + } + deltaTime = ( atTime - tr->trTime ) * 0.001; // milliseconds to seconds + if ( deltaTime < 0 ) { + deltaTime = 0; + } + VectorMA( tr->trBase, deltaTime, tr->trDelta, result ); + break; + case TR_GRAVITY: + deltaTime = ( atTime - tr->trTime ) * 0.001; // milliseconds to seconds + VectorMA( tr->trBase, deltaTime, tr->trDelta, result ); + result[2] -= 0.5 * DEFAULT_GRAVITY * deltaTime * deltaTime; // FIXME: local gravity... + break; + default: + Com_Error( ERR_DROP, "EvaluateTrajectory: unknown trType: %i", tr->trType ); + break; + } +} + +/* +================ +EvaluateTrajectoryDelta + +================ +*/ +void EvaluateTrajectoryDelta( const trajectory_t *tr, int atTime, vec3_t result ) { + float deltaTime; + float phase; + + switch( tr->trType ) { + case TR_STATIONARY: + case TR_INTERPOLATE: + VectorClear( result ); + break; + case TR_LINEAR: + VectorCopy( tr->trDelta, result ); + break; + case TR_SINE: + deltaTime = ( atTime - tr->trTime ) / (float) tr->trDuration; + phase = cos( deltaTime * M_PI * 2 ); // derivative of sin = cos + phase *= 0.5; + VectorScale( tr->trDelta, phase, result ); + break; + case TR_LINEAR_STOP: + if ( atTime > tr->trTime + tr->trDuration ) { + VectorClear( result ); + return; + } + VectorCopy( tr->trDelta, result ); + break; + case TR_GRAVITY: + deltaTime = ( atTime - tr->trTime ) * 0.001; // milliseconds to seconds + VectorCopy( tr->trDelta, result ); + result[2] -= DEFAULT_GRAVITY * deltaTime; // FIXME: local gravity... + break; + default: + Com_Error( ERR_DROP, "EvaluateTrajectoryDelta: unknown trType: %i", tr->trTime ); + break; + } +} + + diff --git a/source/source/fgame/bg_pmove.c b/source/source/fgame/bg_pmove.c new file mode 100644 index 0000000..4716499 --- /dev/null +++ b/source/source/fgame/bg_pmove.c @@ -0,0 +1,2558 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/bg_pmove.c $ +// $Revision:: 47 $ +// $Date:: 7/26/00 11:22p $ +// +// Copyright (C) 1999 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/bg_pmove.c $ +// +// 47 7/26/00 11:22p Markd +// changed sampling time in pmove to be 20FPS not 15 +// +// 46 7/25/00 2:41p Markd +// made terminal velocity lethal +// +// 45 7/25/00 12:47p Markd +// Added new player sounds +// +// 44 7/24/00 12:46p Markd +// fixed rope movment +// +// 43 7/16/00 10:28a Markd +// fixed some movement code issues +// +// 42 7/11/00 1:36p Steven +// Tweaked falling values a little. +// +// 41 7/10/00 6:50p Markd +// fixed some issues with water running +// +// 40 6/28/00 3:38p Markd +// Tweaked fatal falling distance +// +// 39 6/26/00 7:14p Markd +// tweaked stuck move code +// +// 38 6/25/00 12:37p Markd +// fixed player getting stuck +// +// 37 6/25/00 11:21a Markd +// fixed slime code for player +// +// 36 6/20/00 3:43p Markd +// fixed walking animations +// +// 35 6/14/00 11:18a Markd +// cleaned up code using Intel compiler +// +// 34 6/06/00 7:41p Markd +// Turned on an extraneous PM_ClipVelocity which was in Q3 +// +// 33 6/06/00 5:02p Markd +// fixed player movement stuff +// +// 32 6/01/00 7:00p Markd +// added partial friciton for slippery surfaces +// +// 31 5/11/00 11:05a Steven +// Added pushing of actors out of the way. +// +// 30 5/06/00 5:25p Markd +// fixed camera and pipe hang issues +// +// 29 4/27/00 11:59a Jimdose +// trying new slidemove +// +// 28 4/15/00 5:40p Markd +// fixed falling damage and getting into and out of water +// +// 27 4/15/00 1:30p Markd +// added check_was_running code so that player does not always stop short +// +// 26 4/07/00 3:00p Markd +// Added legs dangling code for pipehanging +// +// 25 2/24/00 4:16p Jimdose +// moved defines into bg_pulic.h +// +// 24 2/23/00 4:51p Jimdose +// added AddPlane +// +// 23 2/23/00 10:07a Markd +// Fixed slick surface support +// +// 22 2/18/00 4:15p Jimdose +// Pmove_GroundTrace now calls PM_CheckDuck to ensure that the bounding boxes +// are set +// +// 21 2/17/00 4:20p Jimdose +// improved sliding on slopes +// removed auto wall avoidance and replaced it with slide move +// +// 20 2/15/00 8:56p Jimdose +// added move feedback checks for state system +// added wall avoidance code +// +// 19 2/11/00 2:20p Markd +// Added water support to turbo movement +// +// 18 2/11/00 10:35a Markd +// Added faster running when run is held down a sufficient time +// +// 17 1/27/00 11:35a Markd +// Fixed solid/notsolid client side entities +// +// 16 1/25/00 8:07p Jimdose +// changed stepsize to 31 +// +// 15 1/22/00 12:44p Jimdose +// PM_StepMove no clears out the velocity when blocked +// +// 14 1/19/00 10:01p Jimdose +// no longer restrict movement when in air +// +// 13 1/12/00 8:02p Markd +// Fixed msec command for dropping timers in pmove +// +// 12 1/05/00 7:25p Jimdose +// made angle functions all use the same coordinate system +// AngleVectors now returns left instead of right +// no longer need to invert pitch +// +// 11 12/09/99 3:40p Jimdose +// fixed speed going up slopes +// +// 10 12/09/99 11:00a Markd +// merged in latest player movement code and broke jumping, yay! +// +// 9 10/27/99 10:21a Steven +// Added new flag PMF_NO_MOVE. +// +// 8 10/12/99 2:23p Markd +// Rewrote camera and player movetype system +// +// 7 10/08/99 2:09p Markd +// Added PM_LOCKVIEW to changing view while in camera +// +// 6 9/16/99 7:43p Jimdose +// fixed up merge +// +// DESCRIPTION: +// + +#include "q_shared.h" +#include "bg_public.h" + +// all of the locals will be zeroed before each +// pmove, just to make damn sure we don't have +// any differences when running on client or server +typedef struct { + vec3_t forward, left, up; + vec3_t flat_forward, flat_left, flat_up; + float forward_speed, side_speed; + float frametime; + + int msec; + + qboolean walking; + qboolean groundPlane; + trace_t groundTrace; + + float impactSpeed; + + vec3_t previous_origin; + vec3_t previous_velocity; + int previous_waterlevel; +} pml_t; + +pmove_t *pm; +pml_t pml; + +// movement parameters +const float pm_stopspeed = 50; +const float pm_duckScale = 0.25f; +const float pm_swimScale = 0.50f; +const float pm_wadeScale = 0.70f; +const float pm_accelerate = 10; + +const float pm_airaccelerate = 2; +const float pm_wateraccelerate = 6; +const float pm_flyaccelerate = 8; + +const float pm_friction = 6; +const float pm_waterfriction = 1; +const float pm_slipperyfriction = 0.25f; +const float pm_flightfriction = 3; + +int c_pmove = 0; + +void PM_CrashLand( void ); + +/* +=============== +PM_AddTouchEnt +=============== +*/ +void PM_AddTouchEnt + ( + int entityNum + ) + + { + int i; + + if ( entityNum == ENTITYNUM_WORLD ) + { + return; + } + + if ( pm->numtouch == MAXTOUCH ) + { + return; + } + + // see if it is already added + for( i = 0; i < pm->numtouch; i++ ) + { + if ( pm->touchents[ i ] == entityNum ) + { + return; + } + } + + // add it + pm->touchents[ pm->numtouch ] = entityNum; + pm->numtouch++; + } + +/* +================== +PM_ClipVelocity + +Slide off of the impacting surface +================== +*/ +void PM_ClipVelocity + ( + vec3_t in, + vec3_t normal, + vec3_t out, + float overbounce + ) + + { + float backoff; + float change; + int i; + + backoff = DotProduct( in, normal ); + + if ( backoff < 0 ) + { + backoff *= overbounce; + } + else + { + backoff /= overbounce; + } + + for( i = 0; i < 3; i++ ) + { + change = normal[ i ] * backoff; + out[ i ] = in[ i ] - change; + } + } + +/* +================== +PM_SlideMove + +Returns qtrue if the velocity was clipped in some way +================== +*/ +#define MAX_CLIP_PLANES 5 +qboolean PM_SlideMove( qboolean gravity ) { + int bumpcount, numbumps; + vec3_t dir; + float d; + int numplanes; + vec3_t planes[MAX_CLIP_PLANES]; + vec3_t primal_velocity; + vec3_t clipVelocity; + int i, j, k; + trace_t trace; + vec3_t end; + float time_left; + float into; + vec3_t endVelocity; + vec3_t endClipVelocity; + + numbumps = 4; + + VectorCopy (pm->ps->velocity, primal_velocity); + + if ( gravity ) { + VectorCopy( pm->ps->velocity, endVelocity ); + endVelocity[2] -= pm->ps->gravity * pml.frametime; + pm->ps->velocity[2] = ( pm->ps->velocity[2] + endVelocity[2] ) * 0.5; + primal_velocity[2] = endVelocity[2]; + if ( pml.groundPlane ) { + // slide along the ground plane + PM_ClipVelocity (pm->ps->velocity, pml.groundTrace.plane.normal, + pm->ps->velocity, OVERCLIP ); + } + } + + time_left = pml.frametime; + + // never turn against the ground plane + if ( pml.groundPlane ) { + numplanes = 1; + VectorCopy( pml.groundTrace.plane.normal, planes[0] ); + } else { + numplanes = 0; + } + + // never turn against original velocity + VectorNormalize2( pm->ps->velocity, planes[numplanes] ); + numplanes++; + + for ( bumpcount=0 ; bumpcount < numbumps ; bumpcount++ ) { + + // calculate position we are trying to move to + VectorMA( pm->ps->origin, time_left, pm->ps->velocity, end ); + + // see if we can make it there + pm->trace ( &trace, pm->ps->origin, pm->mins, pm->maxs, end, pm->ps->clientNum, pm->tracemask, qtrue ); + + if ( trace.startsolid && trace.entityNum != ENTITYNUM_WORLD ) + { + // stuck in an entity, so try to pretend it's not there + pm->trace ( &trace, pm->ps->origin, pm->mins, pm->maxs, end, trace.entityNum, pm->tracemask, qtrue ); + } + + if (trace.allsolid) { + // entity is completely trapped in another solid + pm->ps->velocity[2] = 0; // don't build up falling damage, but allow sideways acceleration + return qtrue; + } + + if ( pm->trypush && pm->trypush( trace.entityNum, pm->ps->origin, end ) ) + continue; + + if (trace.fraction > 0) { + // actually covered some distance + VectorCopy (trace.endpos, pm->ps->origin); + } + + if (trace.fraction == 1) { + break; // moved the entire distance + } + + if ( ( trace.plane.normal[ 2 ] < MIN_WALK_NORMAL ) && ( trace.plane.normal[ 2 ] > 0 ) ) + { + // treat steep walls as vertical + trace.plane.normal[ 2 ] = 0; + VectorNormalize( trace.plane.normal ); + } + + // save entity for contact + PM_AddTouchEnt( trace.entityNum ); + + time_left -= time_left * trace.fraction; + + if (numplanes >= MAX_CLIP_PLANES) { + // this shouldn't really happen + VectorClear( pm->ps->velocity ); + return qtrue; + } + + // + // if this is the same plane we hit before, nudge velocity + // out along it, which fixes some epsilon issues with + // non-axial planes + // + for ( i = 0 ; i < numplanes ; i++ ) { + if ( DotProduct( trace.plane.normal, planes[i] ) > 0.99 ) { + VectorAdd( trace.plane.normal, pm->ps->velocity, pm->ps->velocity ); + break; + } + } + if ( i < numplanes ) { + continue; + } + VectorCopy (trace.plane.normal, planes[numplanes]); + numplanes++; + + // + // modify velocity so it parallels all of the clip planes + // + + // find a plane that it enters + for ( i = 0 ; i < numplanes ; i++ ) { + into = DotProduct( pm->ps->velocity, planes[i] ); + if ( into >= 0.1 ) { + continue; // move doesn't interact with the plane + } + + // see how hard we are hitting things + if ( -into > pml.impactSpeed ) { + pml.impactSpeed = -into; + } + + // slide along the plane + PM_ClipVelocity (pm->ps->velocity, planes[i], clipVelocity, OVERCLIP ); + + // slide along the plane + PM_ClipVelocity (endVelocity, planes[i], endClipVelocity, OVERCLIP ); + + // see if there is a second plane that the new move enters + for ( j = 0 ; j < numplanes ; j++ ) { + if ( j == i ) { + continue; + } + if ( DotProduct( clipVelocity, planes[j] ) >= 0.1 ) { + continue; // move doesn't interact with the plane + } + + // try clipping the move to the plane + PM_ClipVelocity( clipVelocity, planes[j], clipVelocity, OVERCLIP ); + PM_ClipVelocity( endClipVelocity, planes[j], endClipVelocity, OVERCLIP ); + + // see if it goes back into the first clip plane + if ( DotProduct( clipVelocity, planes[i] ) >= 0 ) { + continue; + } + + // slide the original velocity along the crease + CrossProduct (planes[i], planes[j], dir); + VectorNormalize( dir ); + d = DotProduct( dir, pm->ps->velocity ); + VectorScale( dir, d, clipVelocity ); + + CrossProduct (planes[i], planes[j], dir); + VectorNormalize( dir ); + d = DotProduct( dir, endVelocity ); + VectorScale( dir, d, endClipVelocity ); + + // see if there is a third plane the the new move enters + for ( k = 0 ; k < numplanes ; k++ ) { + if ( k == i || k == j ) { + continue; + } + if ( DotProduct( clipVelocity, planes[k] ) >= 0.1 ) { + continue; // move doesn't interact with the plane + } + + // stop dead at a tripple plane interaction + VectorClear( pm->ps->velocity ); + return qtrue; + } + } + + // if we have fixed all interactions, try another move + VectorCopy( clipVelocity, pm->ps->velocity ); + VectorCopy( endClipVelocity, endVelocity ); + break; + } + } + + if ( gravity ) { + VectorCopy( endVelocity, pm->ps->velocity ); + } + + // don't change velocity if in a timer (FIXME: is this correct?) + if ( pm->ps->pm_time ) { + VectorCopy( primal_velocity, pm->ps->velocity ); + } + + return ( bumpcount != 0 ); +} + +/* +================== +PM_StepSlideMove + +================== +*/ +void PM_StepSlideMove( qboolean gravity ) { + vec3_t start_o, start_v; + trace_t trace; +// float down_dist, up_dist; +// vec3_t delta, delta2; + vec3_t up, down; + + VectorCopy (pm->ps->origin, start_o); + VectorCopy (pm->ps->velocity, start_v); + + if ( PM_SlideMove( gravity ) == 0 ) { + return; // we got exactly where we wanted to go first try + } + + VectorCopy(start_o, down); + down[2] -= STEPSIZE; + pm->trace (&trace, start_o, pm->mins, pm->maxs, down, pm->ps->clientNum, pm->tracemask, qtrue); + VectorSet(up, 0, 0, 1); + // never step up when you still have up velocity + if ( pm->ps->velocity[2] > 0 && (trace.fraction == 1.0 || + DotProduct(trace.plane.normal, up) < 0.7)) { + return; + } + + VectorCopy (start_o, up); + up[2] += STEPSIZE; + + // test the player position if they were a stepheight higher + pm->trace (&trace, up, pm->mins, pm->maxs, up, pm->ps->clientNum, pm->tracemask, qtrue); + if ( trace.allsolid ) { + if ( pm->debugLevel ) { + Com_Printf("%i:bend can't step\n", c_pmove); + } + return; // can't step up + } + + // try slidemove from this position + VectorCopy (up, pm->ps->origin); + VectorCopy (start_v, pm->ps->velocity); + + PM_SlideMove( gravity ); + + // push down the final amount + VectorCopy (pm->ps->origin, down); + down[2] -= STEPSIZE; + pm->trace (&trace, pm->ps->origin, pm->mins, pm->maxs, down, pm->ps->clientNum, pm->tracemask, qtrue ); + if ( !trace.allsolid ) + { + if ( ( trace.fraction < 1.0 ) && trace.plane.normal[ 2 ] < MIN_WALK_NORMAL ) + { + VectorCopy (start_o, pm->ps->origin); + return; + } + } + VectorCopy (trace.endpos, pm->ps->origin); + + if ( trace.fraction < 1.0 ) { + PM_ClipVelocity( pm->ps->velocity, trace.plane.normal, pm->ps->velocity, OVERCLIP ); + } + + // use the step move + pm->stepped = qtrue; + if ( pm->debugLevel ) { + Com_Printf("%i:stepped\n", c_pmove); + } +} + + +/* +================== +PM_Friction + +Handles both ground friction and water friction +================== +*/ +void PM_Friction + ( + void + ) + + { + vec3_t vec; + float *vel; + float speed; + float newspeed; + float control; + float drop; + + vel = pm->ps->velocity; + + VectorCopy( vel, vec ); + if ( pml.walking ) + { + // ignore slope movement + vec[ 2 ] = 0; + } + + speed = VectorLength( vec ); + if ( speed < 1 ) + { + // allow sinking underwater + vel[ 0 ] = 0; + vel[ 1 ] = 0; + + return; + } + + drop = 0; + + // apply ground friction + if ( pml.walking ) + { + // if getting knocked back, no friction + if ( !( pm->ps->pm_flags & PMF_TIME_KNOCKBACK ) ) + { + control = ( speed < pm_stopspeed ) ? pm_stopspeed : speed; + if ( pml.groundTrace.surfaceFlags & SURF_SLICK ) + { + drop += control * pm_slipperyfriction * pml.frametime; + } + else + { + drop += control * pm_friction * pml.frametime; + } + } + } + + // apply water friction + if ( pm->waterlevel ) + { + if ( pm->watertype & CONTENTS_SLIME ) + { + drop += speed * pm_waterfriction * 5 * pm->waterlevel * pml.frametime; + //drop += speed * pm_waterfriction * 2 * pml.frametime; + } + else + { + drop += speed * pm_waterfriction * pm->waterlevel * pml.frametime; + } + } + + // scale the velocity + newspeed = speed - drop; + if ( newspeed < 0 ) + { + newspeed = 0; + } + + newspeed /= speed; + + vel[0] = vel[ 0 ] * newspeed; + vel[1] = vel[ 1 ] * newspeed; + vel[2] = vel[ 2 ] * newspeed; + } + + +/* +============== +PM_Accelerate + +Handles user intended acceleration +============== +*/ +void PM_Accelerate + ( + vec3_t wishdir, + float wishspeed, + float accel + ) + + { + int i; + float addspeed; + float accelspeed; + float currentspeed; + + currentspeed = DotProduct( pm->ps->velocity, wishdir ); + addspeed = wishspeed - currentspeed; + if ( addspeed <= 0 ) + { + return; + } + + accelspeed = accel * pml.frametime * wishspeed; + if ( accelspeed > addspeed ) + { + accelspeed = addspeed; + } + + for( i = 0; i < 3; i++ ) + { + pm->ps->velocity[ i ] += accelspeed * wishdir[ i ]; + } + } + + +/* +============ +PM_CmdScale + +Returns the scale factor to apply to cmd movements +This allows the clients to use axial -127 to 127 values for all directions +without getting a sqrt(2) distortion in speed. +============ +*/ + +float PM_CmdScale + ( + usercmd_t *cmd + ) + + { + int max; + float total; + float scale; + + max = abs( cmd->forwardmove ); + if ( abs( cmd->rightmove ) > max ) + { + max = abs( cmd->rightmove ); + } + + if ( abs( cmd->upmove ) > max ) + { + max = abs( cmd->upmove ); + } + + if ( !max ) + { + return 0; + } + + total = sqrt( cmd->forwardmove * cmd->forwardmove + cmd->rightmove * cmd->rightmove + cmd->upmove * cmd->upmove ); + scale = pm->ps->speed * max / ( 127.0 * total ); + + return scale; + } + +/* +============= +PM_CheckWaterJump +============= +*/ +qboolean PM_CheckWaterJump + ( + void + ) + + { + vec3_t spot; + int cont; + + if ( pm->ps->pm_time ) + { + return qfalse; + } + + // check for water jump + if ( ( pm->waterlevel < 2 ) ) + { + return qfalse; + } + // if we are below the surface and not in slime, return + if ( !( pm->watertype & CONTENTS_SLIME ) && ( pm->waterlevel == 3 ) ) + { + return qfalse; + } + + VectorMA( pm->ps->origin, 80, pml.flat_forward, spot ); + spot[ 2 ] += pm->ps->viewheight - 16 ; + cont = pm->pointcontents( spot, pm->ps->clientNum ); + if ( !( cont & pm->tracemask ) ) + { + return qfalse; + } + + spot[ 2 ] += 48; + cont = pm->pointcontents( spot, pm->ps->clientNum ); + if ( cont ) + { + return qfalse; + } + + // jump out of water + VectorScale( pml.flat_forward, 150, pm->ps->velocity ); + pm->ps->velocity[ 2 ] = 600; + + pm->ps->pm_flags |= PMF_TIME_WATERJUMP; + pm->ps->pm_time = 2000; + + return qtrue; + } + +//============================================================================ + + +/* +=================== +PM_WaterJumpMove + +Flying out of the water +=================== +*/ +void PM_WaterJumpMove + ( + void + ) + + { + // waterjump has no control, but falls + PM_StepSlideMove( !( pm->ps->pm_flags & PMF_NO_GRAVITY ) ); + + pm->ps->velocity[ 2 ] -= pm->ps->gravity * pml.frametime; + if ( pm->ps->velocity[ 2 ] < 0 ) + { + // cancel as soon as we are falling down again + pm->ps->pm_flags &= ~PMF_ALL_TIMES; + pm->ps->pm_time = 0; + } + } + +#define SLIME_SINK_SPEED -10.0f +/* +=================== +PM_WaterMove + +=================== +*/ +void PM_WaterMove + ( + void + ) + + { + int i; + vec3_t wishvel; + float wishspeed; + vec3_t wishdir; + float scale; + + if ( PM_CheckWaterJump() ) + { + PM_WaterJumpMove(); + return; + } + + // + // clamp our speed if we are in slime + // + if ( pm->watertype & CONTENTS_SLIME ) + { + if ( pm->ps->velocity[ 2 ] < SLIME_SINK_SPEED ) + { + pm->ps->velocity[ 2 ] = SLIME_SINK_SPEED; + } + } + + PM_Friction(); + + scale = PM_CmdScale( &pm->cmd ); + + // + // user intentions + // + if ( !scale ) + { + wishvel[ 0 ] = 0; + wishvel[ 1 ] = 0; + if ( pm->watertype & CONTENTS_SLIME ) + { + wishvel[ 2 ] = SLIME_SINK_SPEED; // sink towards bottom + } + else + { + wishvel[ 2 ] = -60; // sink towards bottom + } + } + else + { + for( i = 0; i < 3; i++ ) + { + wishvel[ i ] = scale * pml.flat_forward[ i ] * pm->cmd.forwardmove - scale * pml.flat_left[ i ] * pm->cmd.rightmove; + } + + wishvel[ 2 ] += scale * pm->cmd.upmove; + } + if ( ( pm->watertype & CONTENTS_SLIME ) && ( pm->waterlevel > 2 ) && ( wishvel[ 2 ] < 0 ) ) + { + wishvel[ 2 ] = 0; + } + + VectorCopy( wishvel, wishdir ); + wishspeed = VectorNormalize( wishdir ); + + if ( wishspeed > pm->ps->speed * pm_swimScale ) + { + wishspeed = pm->ps->speed * pm_swimScale; + } + + PM_Accelerate( wishdir, wishspeed, pm_wateraccelerate ); + + PM_SlideMove( qfalse ); + } + +/* +=================== +PM_StuckJumpMove + +Flying out of someplace we were stuck +=================== +*/ +void PM_StuckJumpMove + ( + void + ) + + { + // stuckjump has no control, but falls + PM_StepSlideMove( !( pm->ps->pm_flags & PMF_NO_GRAVITY ) ); + + pm->ps->velocity[ 2 ] -= pm->ps->gravity * pml.frametime; + if ( pm->ps->velocity[ 2 ] < -48 ) + { + // cancel as soon as we are falling at decent clip again + pm->ps->pm_flags &= ~PMF_ALL_TIMES; + pm->ps->pm_time = 0; + } + } + +/* +============= +PM_CheckStuckJump +============= +*/ +#define MAX_XY_VELOCITY 50 +qboolean PM_CheckStuckJump + ( + void + ) + + { + vec3_t diff; + + if ( pm->ps->pm_time ) + { + return qfalse; + } + + if ( pm->waterlevel > 1 ) + { + return qfalse; + } + + VectorSubtract( pm->ps->origin, pml.previous_origin, diff ); + if ( VectorLength( diff ) ) + { + return qfalse; + } + if ( VectorLength( pm->ps->velocity ) < 100 ) + { + return qfalse; + } + + // we have been falling, we haven't moved and our velocity is getting dangerously high + // let's give ourselves a boost straight up and opposite our current velocity + pm->ps->velocity[ 0 ] = -pm->ps->velocity[ 0 ]; + if ( pm->ps->velocity[ 0 ] > MAX_XY_VELOCITY ) + pm->ps->velocity[ 0 ] = MAX_XY_VELOCITY; + else if ( pm->ps->velocity[ 0 ] < -MAX_XY_VELOCITY ) + pm->ps->velocity[ 0 ] = -MAX_XY_VELOCITY; + + pm->ps->velocity[ 1 ] = -pm->ps->velocity[ 1 ]; + if ( pm->ps->velocity[ 1 ] > MAX_XY_VELOCITY ) + pm->ps->velocity[ 1 ] = MAX_XY_VELOCITY; + else if ( pm->ps->velocity[ 1 ] < -MAX_XY_VELOCITY ) + pm->ps->velocity[ 1 ] = -MAX_XY_VELOCITY; + + pm->ps->velocity[ 2 ] = 500; + + pm->ps->pm_flags |= PMF_TIME_STUCKJUMP; + pm->ps->pm_time = 2000; + + return qtrue; + } + +/* +============= +PM_CheckTerminalVelocity +============= +*/ +#define TERMINAL_VELOCITY 1200 +void PM_CheckTerminalVelocity + ( + void + ) + { + float oldspeed; + float speed; + + // + // how fast were we falling + // + oldspeed = -pml.previous_velocity[ 2 ]; + + // + // how fast are we falling + // + speed = -pm->ps->velocity[ 2 ]; + + if ( speed <= 0 ) + { + return; + } + + if ( ( oldspeed <= TERMINAL_VELOCITY ) && ( speed > TERMINAL_VELOCITY ) ) + { + pm->pmoveEvent = EV_TERMINAL_VELOCITY; + } + } + +/* +=================== +PM_AirMove + +=================== +*/ +void PM_AirMove + ( + void + ) + + { + vec3_t wishvel; + float fmove; + float smove; + vec3_t wishdir; + float wishspeed; + float scale; + usercmd_t cmd; + + //PM_Friction(); + + fmove = pm->cmd.forwardmove; + smove = pm->cmd.rightmove; + pm->ps->pm_runtime = 0; + + cmd = pm->cmd; + scale = PM_CmdScale( &cmd ); + + wishvel[ 0 ] = pml.flat_forward[ 0 ] * fmove - pml.flat_left[ 0 ] * smove; + wishvel[ 1 ] = pml.flat_forward[ 1 ] * fmove - pml.flat_left[ 1 ] * smove; + wishvel[ 2 ] = 0; + + VectorCopy( wishvel, wishdir ); + wishspeed = VectorNormalize( wishdir ); + wishspeed *= scale; + + // not on ground, so little effect on velocity + PM_Accelerate( wishdir, wishspeed, pm_airaccelerate ); + + // we may have a ground plane that is very steep, even + // though we don't have a groundentity + // slide along the steep plane + if ( pml.groundPlane ) + { + PM_ClipVelocity( pm->ps->velocity, pml.groundTrace.plane.normal, pm->ps->velocity, OVERCLIP ); + } + + if ( !pml.walking && pml.groundPlane ) + { + vec3_t vel; + + VectorCopy( pm->ps->velocity, vel ); + vel[ 2 ] -= pm->ps->gravity * pml.frametime; + pm->ps->velocity[ 2 ] = ( pm->ps->velocity[ 2 ] + vel[ 2 ] ) * 0.5; + PM_SlideMove( qfalse ); + VectorCopy( vel, pm->ps->velocity ); + } + else + { + PM_SlideMove( !( pm->ps->pm_flags & PMF_NO_GRAVITY ) ); + } + + if ( PM_CheckStuckJump() ) + { + PM_StuckJumpMove(); + } + PM_CheckTerminalVelocity(); + } + +void AddPlane + ( + vec3_t norm, + vec3_t planes[ MAX_CLIP_PLANES ], + int *numplanes + ) + + { + int i; + + if ( *numplanes >= MAX_CLIP_PLANES ) + { + return; + } + + for( i = 0; i < *numplanes; i++ ) + { + if ( VectorCompare( planes[ i ], norm ) ) + { + // don't add the plane twice + return; + } + } + + VectorCopy( norm, planes[ *numplanes ] ); + ( *numplanes )++; + } + +/* +================== +PM_FakkSlideMove + +Returns qtrue if the velocity was clipped in some way +================== +*/ +qboolean PM_FakkSlideMove + ( + void + ) + + { + int bumpcount, numbumps; + vec3_t dir; + float d; + int numplanes; + vec3_t planes[ MAX_CLIP_PLANES ]; + vec3_t clipVelocity; + vec3_t temp; + int i, j, k; + trace_t trace; + vec3_t end; + float time_left; + float into; + + numbumps = 4; + + time_left = pml.frametime; + + // never turn against the ground plane + if ( pml.groundPlane ) + { + numplanes = 1; + VectorCopy( pml.groundTrace.plane.normal, planes[ 0 ] ); + } + else + { + numplanes = 0; + } + + // never turn against original velocity + VectorNormalize2( pm->ps->velocity, temp ); + AddPlane( temp, planes, &numplanes ); + + for( bumpcount = 0; bumpcount < numbumps; bumpcount++ ) + { + // calculate position we are trying to move to + VectorMA( pm->ps->origin, time_left, pm->ps->velocity, end ); + + // see if we can make it there + pm->trace( &trace, pm->ps->origin, pm->mins, pm->maxs, end, pm->ps->clientNum, pm->tracemask, qtrue ); + + if ( trace.allsolid ) + { + // entity is completely trapped in another solid + // don't build up falling damage, but allow sideways acceleration + pm->ps->velocity[ 2 ] = 0; + + if ( pm->debugLevel ) + { + Com_Printf( "All solid, %d planes : ", numplanes ); + for( i = 0; i < numplanes; i++ ) + { + Com_Printf( "(%.2f,%.2f,%.2f) ", planes[ i ][ 0 ], planes[ i ][ 1 ], planes[ i ][ 2 ] ); + } + Com_Printf( "\n" ); + } + + return qtrue; + } + + if ( trace.fraction > 0 ) + { + // actually covered some distance + VectorCopy( trace.endpos, pm->ps->origin ); + } + + if ( trace.fraction == 1 ) + { + // moved the entire distance + break; + } + + // save entity for contact + if ( trace.entityNum != ENTITYNUM_NONE ) + { + PM_AddTouchEnt( trace.entityNum ); + } + + time_left -= time_left * trace.fraction; + + if ( numplanes >= MAX_CLIP_PLANES ) + { + // this shouldn't really happen + VectorClear( pm->ps->velocity ); + + if ( pm->debugLevel ) + { + Com_Printf( "maxplanes, %d planes : ", numplanes ); + for( i = 0; i < numplanes; i++ ) + { + Com_Printf( "(%.2f,%.2f,%.2f) ", planes[ i ][ 0 ], planes[ i ][ 1 ], planes[ i ][ 2 ] ); + } + Com_Printf( "\n" ); + } + return qtrue; + } + + // altering move slightly by the normal reduces the chance that the next move + // will hit the same surface + VectorAdd( pm->ps->velocity, trace.plane.normal, pm->ps->velocity ); + + if ( ( trace.plane.normal[ 2 ] < MIN_WALK_NORMAL ) && ( trace.plane.normal[ 2 ] > 0 ) ) + { + // treat steep walls as vertical + trace.plane.normal[ 2 ] = 0; + VectorNormalize2( trace.plane.normal, temp ); + AddPlane( temp, planes, &numplanes ); + } + else + { + AddPlane( trace.plane.normal, planes, &numplanes ); + } + + // + // modify velocity so it parallels all of the clip planes + // + + // find a plane that it enters + for( i = 0; i < numplanes; i++ ) + { + into = DotProduct( pm->ps->velocity, planes[ i ] ); + if ( into >= 0.1f ) + { + // move doesn't interact with the plane + continue; + } + + // see how hard we are hitting things + if ( -into > pml.impactSpeed ) + { + pml.impactSpeed = -into; + } + + // slide along the plane + PM_ClipVelocity( pm->ps->velocity, planes[ i ], clipVelocity, OVERCLIP ); + + // see if there is a second plane that the new move enters + for ( j = 0; j < numplanes; j++ ) + { + if ( j == i ) + { + continue; + } + + if ( DotProduct( clipVelocity, planes[ j ] ) >= 0.1f ) + { + // move doesn't interact with the plane + continue; + } + + // try clipping the move to the plane + PM_ClipVelocity( clipVelocity, planes[ j ], clipVelocity, OVERCLIP ); + + // see if it goes back into the first clip plane + if ( DotProduct( clipVelocity, planes[ i ] ) >= 0 ) + { + continue; + } + + // slide the original velocity along the crease + CrossProduct( planes[ i ], planes[ j ], dir ); + VectorNormalize( dir ); + d = DotProduct( dir, pm->ps->velocity ); + VectorScale( dir, d, clipVelocity ); + + // see if there is a third plane the the new move enters + for( k = 0; k < numplanes; k++ ) + { + if ( k == i || k == j ) + { + continue; + } + + if ( DotProduct( clipVelocity, planes[ k ] ) >= 0.1f ) + { + // move doesn't interact with the plane + continue; + } + + PM_ClipVelocity( clipVelocity, planes[ k ], clipVelocity, OVERCLIP ); + + if ( ( DotProduct( clipVelocity, planes[ i ] ) >= 0 ) && ( DotProduct( clipVelocity, planes[ j ] ) >= 0 ) ) + { + continue; + } + + // stop dead at a triple plane interaction + if ( pm->debugLevel ) + { + Com_Printf( "Dead stop, %d planes : ", numplanes ); + for( i = 0; i < numplanes; i++ ) + { + Com_Printf( "(%.2f,%.2f,%.2f) ", planes[ i ][ 0 ], planes[ i ][ 1 ], planes[ i ][ 2 ] ); + } + Com_Printf( "\n" ); + } + VectorClear( pm->ps->velocity ); + return qtrue; + } + } + + // if we have fixed all interactions, try another move + VectorCopy( clipVelocity, pm->ps->velocity ); + break; + } + } + + if ( pm->debugLevel ) + { + Com_Printf( "move ok, %d planes : ", numplanes ); + for( i = 0; i < numplanes; i++ ) + { + Com_Printf( "(%.2f,%.2f,%.2f) ", planes[ i ][ 0 ], planes[ i ][ 1 ], planes[ i ][ 2 ] ); + } + Com_Printf( "\n" ); + } + + return ( bumpcount != 0 ); + } + + +void PM_StepMove + ( + void + ) + + { + trace_t trace; + vec3_t up; + vec3_t down; + vec3_t oldvelocity; + vec3_t oldorigin; + vec3_t velocity1; + vec3_t origin1; + + VectorCopy( pm->ps->velocity, oldvelocity ); + VectorCopy( pm->ps->origin, oldorigin ); + +// if ( PM_FakkSlideMove() ) + if ( PM_SlideMove( !( pm->ps->pm_flags & PMF_NO_GRAVITY ) ) ) + { + VectorCopy( pm->ps->velocity, velocity1 ); + VectorCopy( pm->ps->origin, origin1 ); + + VectorCopy( oldvelocity, pm->ps->velocity ); + + VectorCopy( oldorigin, up ); + up[ 2 ] += STEPSIZE; + + //pm->trace( &trace, oldorigin, pm->mins, pm->maxs, up, pm->ps->clientNum, pm->tracemask, qtrue ); + pm->trace( &trace, up, pm->mins, pm->maxs, up, pm->ps->clientNum, pm->tracemask, qtrue ); + VectorCopy( trace.endpos, pm->ps->origin ); + + //PM_FakkSlideMove(); + PM_SlideMove( !( pm->ps->pm_flags & PMF_NO_GRAVITY ) ); + + VectorCopy( pm->ps->origin, down ); + down[ 2 ] = oldorigin[ 2 ]; + + pm->trace( &trace, pm->ps->origin, pm->mins, pm->maxs, down, pm->ps->clientNum, pm->tracemask, qtrue ); + if ( trace.plane.normal[ 2 ] < MIN_WALK_NORMAL ) + { + // use the first move + VectorCopy( velocity1, pm->ps->velocity ); + VectorCopy( origin1, pm->ps->origin ); + } + else + { + VectorCopy( trace.endpos, pm->ps->origin ); + pm->stepped = qtrue; + } + } + } + +static vec3_t min3x3 = { -3, -3, 0 }; +static vec3_t max3x3 = { 3, 3, 8 }; +//static vec3_t base_rightfoot_pos = { 0, -7, 0 }; +//static vec3_t base_leftfoot_pos = { 0, 7, 0 }; +static vec3_t base_rightfoot_pos = { -5.25301, -3.10885, 0 }; +static vec3_t base_leftfoot_pos = { -0.123711, 10.4893, 0 }; + +qboolean PM_FeetOnGround + ( + vec3_t pos + ) + + { + vec3_t start; + vec3_t end; + vec3_t rightfoot; + vec3_t leftfoot; + vec3_t ang; + float mat[ 3 ][ 3 ]; + trace_t trace; + + VectorSet( ang, 0, pm->ps->viewangles[ 1 ], 0 ); + AngleVectors( ang, mat[ 0 ], mat[ 1 ], mat[ 2 ] ); + + MatrixTransformVector( base_rightfoot_pos, mat, rightfoot ); + MatrixTransformVector( base_leftfoot_pos, mat, leftfoot ); + VectorAdd( rightfoot, pos, rightfoot ); + VectorAdd( leftfoot, pos, leftfoot ); + + VectorCopy( rightfoot, start ); + VectorCopy( rightfoot, end ); + end[ 2 ] -= 16.1f; + + pm->trace( &trace, start, min3x3, max3x3, end, pm->ps->clientNum, pm->tracemask, qtrue ); + if ( trace.fraction == 1.0f ) + { + return qfalse; + } + + // try the left foot + VectorCopy( leftfoot, start ); + VectorCopy( leftfoot, end ); + end[ 2 ] -= 16.1f; + + pm->trace( &trace, start, min3x3, max3x3, end, pm->ps->clientNum, pm->tracemask, qtrue ); + if ( trace.fraction == 1.0f ) + { + return qfalse; + } + + return qtrue; + } + +#if 0 +qboolean PM_FindBestFallPos + ( + vec3_t pos, + vec3_t bestdir + ) + + { + trace_t trace; + vec3_t ang; + vec3_t dir; + vec3_t start; + vec3_t end; + vec3_t move; + float best; + float len; + int i; + qboolean set; + float radius; + + set = qfalse; + + radius = pm->maxs[ 0 ] - pm->mins[ 0 ] + 1.0f; + + VectorCopy( pos, start ); + start[ 2 ] -= 16.1f; + + best = 1000.0f; + VectorSet( ang, 0, pm->ps->viewangles[ 1 ], 0 ); + for( i = 0; i < 16; i++, ang[ 1 ] += 22.5f ) + { + AngleVectors( ang, dir, NULL, NULL ); + VectorMA( pos, radius, dir, move ); + + pm->trace( &trace, pos, pm->mins, pm->maxs, move, pm->ps->clientNum, pm->tracemask, qtrue ); + + VectorCopy( trace.endpos, end ); + end[ 2 ] = start[ 2 ]; + + pm->trace( &trace, trace.endpos, pm->mins, pm->maxs, end, pm->ps->clientNum, pm->tracemask, qtrue ); + if ( trace.fraction == 1.0f ) + { + VectorCopy( trace.endpos, end ); + pm->trace( &trace, end, pm->mins, pm->maxs, start, pm->ps->clientNum, pm->tracemask, qtrue ); + VectorSubtract( trace.endpos, start, end ); + end[ 2 ] = 0; + + len = VectorLength( end ); + if ( len && ( len < best ) ) + { + best = len; + VectorScale( end, 1.0f / len, bestdir ); + set = qtrue; + } + } + } + + return set; + } +#else +qboolean PM_FindBestFallPos + ( + vec3_t pos, + vec3_t bestdir + ) + + { + trace_t trace; + vec3_t ang; + vec3_t dir; + vec3_t start; + vec3_t end; + vec3_t move; + int i; + qboolean set; + float radius; + + VectorClear( bestdir ); + + set = qfalse; + + radius = pm->maxs[ 0 ] - pm->mins[ 0 ] + 1.0f; + + VectorCopy( pos, start ); + start[ 2 ] -= 16.1f; + + VectorSet( ang, 0, pm->ps->viewangles[ 1 ], 0 ); + for( i = 0; i < 16; i++, ang[ 1 ] += 22.5f ) + { + AngleVectors( ang, dir, NULL, NULL ); + VectorMA( pos, radius, dir, move ); + + pm->trace( &trace, pos, pm->mins, pm->maxs, move, pm->ps->clientNum, pm->tracemask, qtrue ); + + VectorCopy( trace.endpos, end ); + end[ 2 ] = start[ 2 ]; + + pm->trace( &trace, trace.endpos, pm->mins, pm->maxs, end, pm->ps->clientNum, pm->tracemask, qtrue ); + if ( trace.fraction == 1.0f ) + { + VectorCopy( trace.endpos, end ); + pm->trace( &trace, end, pm->mins, pm->maxs, start, pm->ps->clientNum, pm->tracemask, qtrue ); + + if ( trace.fraction < 1.0f ) + { + VectorAdd( bestdir, trace.plane.normal, bestdir ); + set = qtrue; + } + } + } + + if ( !set || !VectorNormalize( bestdir ) ) + { + return qfalse; + } + + return qtrue; + } +#endif + +void PM_CheckFeet + ( + void + ) + + { + trace_t trace; + vec3_t temp; + + if ( pm->stepped ) + { + pm->ps->feetfalling = 0; + return; + } + + // check if our feet are properly on the ground + if ( pm->ps->walking ) + { + VectorMA( pm->ps->origin, 0.2f, pm->ps->velocity, temp ); //FIXME frametime + temp[ 2 ] = pm->ps->origin[ 2 ] + 2; + if ( PM_FeetOnGround( pm->ps->origin ) || PM_FeetOnGround( temp ) ) + { + pm->ps->feetfalling = 0; + return; + } + + if ( pm->ps->feetfalling > 0 ) + { + pm->ps->feetfalling--; + } + + if ( !pm->ps->feetfalling ) + { + if ( !PM_FindBestFallPos( pm->ps->origin, pm->ps->falldir ) ) + { + return; + } + + pm->ps->feetfalling = 5; + } + + // shove the player a little bit + VectorMA( pm->ps->origin, 2.0f, pm->ps->falldir, temp ); + pm->trace( &trace, pm->ps->origin, pm->mins, pm->maxs, temp, pm->ps->clientNum, pm->tracemask, qtrue ); + if ( trace.fraction == 0 ) + { + pm->ps->feetfalling = 0; + } + else + { + pm->ps->walking = qfalse; + VectorCopy( trace.endpos, pm->ps->origin ); + } + } + } + + +/* +=================== +PM_WalkMove + +=================== +*/ + +void PM_WalkMove + ( + void + ) + + { + int i; + vec3_t wishvel; + float fmove; + float smove; + vec3_t wishdir; + float wishspeed; + float scale; + usercmd_t cmd; + float accelerate; + float waterScale; + + if ( ( pm->waterlevel > 1 ) && DotProduct( pml.forward, pml.groundTrace.plane.normal ) > 0 ) + { + // begin swimming + PM_WaterMove(); + + return; + } + + PM_Friction(); + + fmove = pm->cmd.forwardmove; + smove = pm->cmd.rightmove; + + cmd = pm->cmd; + scale = PM_CmdScale( &cmd ); + + if ( ( pm->cmd.buttons & BUTTON_RUN ) && fmove && !smove ) + { + pm->ps->pm_runtime += pml.msec; + } + else + { + pm->ps->pm_runtime = 0; + } + + // + // only run faster if we have exceeded our running time + // + if ( ( pm->ps->stats[STAT_WATER_LEVEL] >= MINIMUM_WATER_FOR_TURBO ) && ( pm->ps->pm_runtime > WATER_TURBO_TIME ) ) + { + scale *= WATER_TURBO_SPEED; + } + + // project the forward and right directions onto the ground plane + PM_ClipVelocity (pml.flat_forward, pml.groundTrace.plane.normal, pml.flat_forward, OVERCLIP ); + PM_ClipVelocity (pml.flat_left, pml.groundTrace.plane.normal, pml.flat_left, OVERCLIP ); + // + VectorNormalize (pml.flat_forward); + VectorNormalize (pml.flat_left); + + for( i = 0 ; i < 3 ; i++ ) + { + wishvel[ i ] = pml.flat_forward[ i ] * fmove - pml.flat_left[ i ] * smove; + } + + VectorCopy( wishvel, wishdir ); + wishspeed = VectorNormalize( wishdir ); + wishspeed *= scale; + + // clamp the speed lower if ducking + if ( pm->ps->pm_flags & PMF_DUCKED ) + { + if ( wishspeed > pm->ps->speed * pm_duckScale ) + { + wishspeed = pm->ps->speed * pm_duckScale; + } + } + + // clamp the speed lower if wading or walking on the bottom + if ( pm->waterlevel ) + { + waterScale = pm->waterlevel / 3.0; + waterScale = 1.0 - ( 1.0 - pm_swimScale ) * waterScale; + if ( wishspeed > pm->ps->speed * waterScale ) + { + wishspeed = pm->ps->speed * waterScale; + } + } + + // when a player gets hit, they temporarily lose + // full control, which allows them to be moved a bit + if ( ( pml.groundTrace.surfaceFlags & SURF_SLICK ) || pm->ps->pm_flags & PMF_TIME_KNOCKBACK ) + { + accelerate = pm_airaccelerate; + } + else + { + accelerate = pm_accelerate; + } + + PM_Accelerate( wishdir, wishspeed, accelerate ); + + if ( ( pml.groundTrace.surfaceFlags & SURF_SLICK ) || pm->ps->pm_flags & PMF_TIME_KNOCKBACK ) + { + pm->ps->velocity[ 2 ] -= pm->ps->gravity * pml.frametime; + } + + // don't do anything if standing still + if ( !pm->ps->velocity[ 0 ] && !pm->ps->velocity[ 1 ] ) + { + PM_CheckFeet(); + return; + } + + //PM_StepMove(); + PM_StepSlideMove ( !( pm->ps->pm_flags & PMF_NO_GRAVITY ) ); + + + PM_CheckFeet(); + } + +/* +============== +PM_DeadMove +============== +*/ +void PM_DeadMove + ( + void + ) + + { + float forward; + + if ( !pml.walking ) + { + return; + } + + // extra friction + forward = VectorLength( pm->ps->velocity ); + forward -= 20; + if ( forward <= 0 ) + { + VectorClear( pm->ps->velocity ); + } + else + { + VectorNormalize( pm->ps->velocity ); + VectorScale( pm->ps->velocity, forward, pm->ps->velocity ); + } + } + + +/* +=============== +PM_NoclipMove +=============== +*/ +void PM_NoclipMove + ( + void + ) + + { + float speed; + float drop; + float friction; + float control; + float newspeed; + int i; + vec3_t wishvel; + float fmove; + float smove; + vec3_t wishdir; + float wishspeed; + float scale; + + pm->ps->viewheight = DEFAULT_VIEWHEIGHT; + + // friction + + speed = VectorLength( pm->ps->velocity ); + if ( speed < 1 ) + { + VectorCopy( vec3_origin, pm->ps->velocity ); + } + else + { + drop = 0; + + // extra friction + friction = pm_friction * 1.5; + + control = speed < pm_stopspeed ? pm_stopspeed : speed; + drop += control * friction * pml.frametime; + + // scale the velocity + newspeed = speed - drop; + if ( newspeed < 0 ) + { + newspeed = 0; + } + newspeed /= speed; + + VectorScale( pm->ps->velocity, newspeed, pm->ps->velocity ); + } + + // accelerate + // allow the player to move twice as fast in noclip + scale = PM_CmdScale( &pm->cmd ) * 2; + + fmove = pm->cmd.forwardmove; + smove = pm->cmd.rightmove; + pm->ps->pm_runtime = 0; + + for( i = 0; i < 3; i++ ) + { + wishvel[ i ] = pml.flat_forward[ i ] * fmove - pml.flat_left[ i ] * smove; + } + + wishvel[ 2 ] += pm->cmd.upmove; + + VectorCopy( wishvel, wishdir ); + wishspeed = VectorNormalize( wishdir ); + wishspeed *= scale; + + PM_Accelerate( wishdir, wishspeed, pm_accelerate ); + + // move + VectorMA( pm->ps->origin, pml.frametime, pm->ps->velocity, pm->ps->origin ); + } + +//============================================================================ + +/* +============= +PM_CorrectAllSolid +============= +*/ +void PM_CorrectAllSolid + ( + void + ) + + { + if ( pm->debugLevel ) + { + Com_Printf( "%i:allsolid\n", c_pmove ); + } + + // FIXME: jitter around + pm->ps->groundEntityNum = ENTITYNUM_NONE; + pml.groundPlane = qfalse; + pml.walking = qfalse; + } + +/* +============= +PM_GroundTrace +============= +*/ +void PM_GroundTrace + ( + void + ) + + { + vec3_t point; + trace_t trace; + + point[ 0 ] = pm->ps->origin[ 0 ]; + point[ 1 ] = pm->ps->origin[ 1 ]; + point[ 2 ] = pm->ps->origin[ 2 ] - 0.25; + + pm->trace( &trace, pm->ps->origin, pm->mins, pm->maxs, point, pm->ps->clientNum, pm->tracemask, qtrue ); + pml.groundTrace = trace; + pm->ps->groundTrace = trace; + + // do something corrective if the trace starts in a solid... + if ( trace.allsolid ) + { + PM_CorrectAllSolid(); + + pm->ps->walking = pml.walking; + pm->ps->groundPlane = pml.groundPlane; + + return; + } + + // if the trace didn't hit anything, we are in free fall + if ( trace.fraction == 1.0 ) + { + if ( pm->ps->groundEntityNum != ENTITYNUM_NONE ) + { + if ( pm->debugLevel ) + { + Com_Printf( "%i:lift\n", c_pmove ); + } + } + + pm->ps->groundEntityNum = ENTITYNUM_NONE; + pml.groundPlane = qfalse; + pml.walking = qfalse; + + pm->ps->walking = pml.walking; + pm->ps->groundPlane = pml.groundPlane; + + return; + } + + // slopes that are too steep will not be considered onground + if ( trace.plane.normal[ 2 ] < MIN_WALK_NORMAL ) + { + vec3_t oldvel; + float d; + + if ( pm->debugLevel ) + { + Com_Printf( "%i:steep\n", c_pmove ); + } + + // if they can't slide down the slope, let them + // walk (sharp crevices) + VectorCopy( pm->ps->velocity, oldvel ); + VectorSet( pm->ps->velocity, 0, 0, -1 / pml.frametime ); + PM_SlideMove( qfalse ); + + d = VectorLength( pm->ps->velocity ); + VectorCopy( oldvel, pm->ps->velocity ); + + if ( d > ( 0.1f / pml.frametime ) ) + { + pm->ps->groundEntityNum = ENTITYNUM_NONE; + pml.groundPlane = qtrue; + pml.walking = qfalse; + + pm->ps->walking = pml.walking; + pm->ps->groundPlane = pml.groundPlane; + + return; + } + } + + // check if getting thrown off the ground + if ( pm->ps->velocity[ 2 ] > 0 && DotProduct( pm->ps->velocity, trace.plane.normal ) > 10 ) + { + if ( pm->debugLevel ) + { + Com_Printf( "%i:kickoff\n", c_pmove ); + } + + pm->ps->groundEntityNum = ENTITYNUM_NONE; + pml.groundPlane = qfalse; + pml.walking = qfalse; + + pm->ps->walking = pml.walking; + pm->ps->groundPlane = pml.groundPlane; + + return; + } + + pml.groundPlane = qtrue; + pml.walking = qtrue; + + // hitting solid ground will end a waterjump + if ( pm->ps->pm_flags & PMF_TIME_WATERJUMP ) + { + pm->ps->pm_flags &= ~( PMF_TIME_WATERJUMP ); + pm->ps->pm_time = 0; + } + + // hitting solid ground will end a stuckjump + if ( pm->ps->pm_flags & PMF_TIME_STUCKJUMP ) + { + pm->ps->pm_flags &= ~( PMF_TIME_STUCKJUMP ); + pm->ps->pm_time = 0; + } + + if ( pm->ps->groundEntityNum == ENTITYNUM_NONE ) + { + // just hit the ground + if ( pm->debugLevel ) + { + Com_Printf( "%i:Land\n", c_pmove ); + } + + PM_CrashLand(); + } + + pm->ps->groundEntityNum = trace.entityNum; + + //if ( !( pml.groundTrace.surfaceFlags & SURF_SLICK ) ) + pm->ps->velocity[ 2 ] = 0; + + PM_AddTouchEnt( trace.entityNum ); + + pm->ps->walking = pml.walking; + pm->ps->groundPlane = pml.groundPlane; + } + + +/* +============= +PM_SetWaterLevel FIXME: avoid this twice? certainly if not moving +============= +*/ +void PM_SetWaterLevel + ( + void + ) + + { + vec3_t point; + int cont; + int sample1; + int sample2; + + // + // get waterlevel, accounting for ducking + // + pm->waterlevel = 0; + pm->watertype = 0; + + sample2 = pm->ps->viewheight - MINS_Z; + sample1 = sample2 * 3 / 4; + + VectorCopy( pm->ps->origin, point ); + point[ 2 ] += MINS_Z + 1; + cont = pm->pointcontents( point, pm->ps->clientNum ); + if ( cont & MASK_WATER ) + { + pm->watertype = cont; + pm->waterlevel = 1; + + point[ 2 ] = pm->ps->origin[ 2 ] + MINS_Z + sample1; + cont = pm->pointcontents( point, 0 ); + if ( cont & MASK_WATER ) + { + pm->waterlevel = 2; + point[ 2 ] = pm->ps->origin[ 2 ] + MINS_Z + sample2; + cont = pm->pointcontents( point, 0 ); + if ( cont & MASK_WATER ) + { + pm->waterlevel = 3; + } + } + } + } + + +/* +============== +PM_CheckDuck + +Sets mins, maxs, and pm->ps->viewheight +============== +*/ +void PM_CheckDuck + ( + void + ) + + { + pm->mins[ 0 ] = MINS_X; + pm->mins[ 1 ] = MINS_Y; + + pm->maxs[ 0 ] = MAXS_X; + pm->maxs[ 1 ] = MAXS_Y; + + pm->mins[ 2 ] = MINS_Z; + + if ( pm->ps->pm_type == PM_DEAD ) + { + pm->maxs[ 2 ] = DEAD_MINS_Z; + pm->ps->viewheight = DEAD_VIEWHEIGHT; + + return; + } + + if ( pm->ps->pm_flags & PMF_DUCKED ) + { + pm->maxs[ 2 ] = CROUCH_MAXS_Z; + pm->ps->viewheight = CROUCH_VIEWHEIGHT; + } + else if ( pm->ps->pm_flags & PMF_LEGS_LIFTED ) + { + pm->maxs[ 2 ] = MAXS_Z; + pm->mins[ 2 ] = CROUCH_MAXS_Z; + pm->ps->viewheight = DEFAULT_VIEWHEIGHT; + } + else + { + pm->maxs[ 2 ] = MAXS_Z; + pm->ps->viewheight = DEFAULT_VIEWHEIGHT; + } + } + + +//=================================================================== + +/* +================= +PM_CrashLand + +Check for hard landings that generate sound events + + fall from 128: 400 = 160000 + fall from 256: 580 = 336400 + fall from 384: 720 = 518400 + fall from 512: 800 = 640000 + fall from 640: 960 = + + damage = deltavelocity*deltavelocity * 0.0001 + +================= +*/ +void PM_CrashLand + ( + void + ) + + { + float delta; + float dist; + float vel; + float acc; + float t; + float a, b, c, den; + + // calculate the exact velocity on landing + dist = pm->ps->origin[ 2 ] - pml.previous_origin[ 2 ]; + vel = pml.previous_velocity[ 2 ]; + acc = -pm->ps->gravity; + + a = acc / 2; + b = vel; + c = -dist; + + den = b * b - 4 * a * c; + if ( den < 0 ) + { + return; + } + + t = ( -b - sqrt( den ) ) / ( 2 * a ); + + delta = vel + t * acc; + delta = delta * delta * 0.0001; + + // never take falling damage if completely underwater + if ( pm->waterlevel == 3 ) + { + return; + } + + // reduce falling damage if there is standing water + if ( pm->waterlevel == 2 ) + { + delta *= 0.25f; + } + + if ( pm->waterlevel == 1 ) + { + delta *= 0.5f; + } + + if ( delta < 1 ) + { + return; + } + + // SURF_NODAMAGE is used for bounce pads where you don't ever + // want to take damage or play a crunch sound + if ( !( pml.groundTrace.surfaceFlags & SURF_NODAMAGE ) ) + { + if ( delta > 135 ) + { + pm->pmoveEvent = EV_FALL_FATAL; + } + else if ( delta > 95 ) + { + pm->pmoveEvent = EV_FALL_FAR; + } + else if ( delta > 60 ) + { + pm->pmoveEvent = EV_FALL_MEDIUM; + } + else if ( delta > 14 ) + { + pm->pmoveEvent = EV_FALL_SHORT; + } + } + } + +/* +============== +PM_WaterEvents + +Generate sound events for entering and leaving water +============== +*/ +void PM_WaterEvents + ( + void + ) + + { + // FIXME? + // + // if just entered a water volume, play a sound + // + if ( !pml.previous_waterlevel && pm->waterlevel ) + { + pm->pmoveEvent = EV_WATER_TOUCH; + } + + // + // if just completely exited a water volume, play a sound + // + if ( pml.previous_waterlevel && ! pm->waterlevel ) + { + pm->pmoveEvent = EV_WATER_LEAVE; + } + + // + // check for head just going under water + // + if ( ( pml.previous_waterlevel != 3 ) && ( pm->waterlevel == 3 ) ) + { + pm->pmoveEvent = EV_WATER_UNDER; + } + + // + // check for head just coming out of water + // + if ( ( pml.previous_waterlevel == 3 ) && ( pm->waterlevel != 3 ) ) + { + pm->pmoveEvent = EV_WATER_CLEAR; + } + } + +/* +================ +PM_DropTimers +================ +*/ +void PM_DropTimers + ( + void + ) + + { + // drop misc timing counter + if ( pm->ps->pm_time ) + { + if ( pml.msec >= pm->ps->pm_time ) + { + pm->ps->pm_flags &= ~PMF_ALL_TIMES; + pm->ps->pm_time = 0; + } + else + { + pm->ps->pm_time -= pml.msec; + } + } + } + +/* +================ +PM_UpdateViewAngles + +This can be used as another entry point when only the viewangles +are being updated isntead of a full move +================ +*/ +void PM_UpdateViewAngles + ( + playerState_t *ps, + const usercmd_t *cmd + ) + + { + short temp; + int i; + + if ( ps->pm_flags & PMF_FROZEN ) + { + // no view changes at all + return; + } + + if ( ps->stats[ STAT_HEALTH ] <= 0 ) + { + // no view changes at all + return; + } + + // circularly clamp the angles with deltas + for( i = 0; i < 3; i++ ) + { + temp = cmd->angles[ i ] + ps->delta_angles[ i ]; + if ( i == PITCH ) + { + // don't let the player look up or down more than 90 degrees + if ( temp > 16000 ) + { + ps->delta_angles[ i ] = 16000 - cmd->angles[ i ]; + temp = 16000; + } + else if ( temp < -16000 ) + { + ps->delta_angles[ i ] = -16000 - cmd->angles[ i ]; + temp = -16000; + } + } + + ps->viewangles[ i ] = SHORT2ANGLE( temp ); + } + } + +void Pmove_GroundTrace + ( + pmove_t *pmove + ) + + { + memset (&pml, 0, sizeof(pml)); + pml.msec = 1; + pml.frametime = 0.001f; + pm = pmove; + PM_CheckDuck(); + PM_GroundTrace(); + } + + +/* +================ +Pmove + +Can be called by either the server or the client +================ +*/ +void PmoveSingle (pmove_t *pmove) + { + vec3_t tempVec; + qboolean walking; + + pm = pmove; + + // this counter lets us debug movement problems with a journal + // by setting a conditional breakpoint fot the previous frame + c_pmove++; + + // clear results + pm->numtouch = 0; + pm->watertype = 0; + pm->waterlevel = 0; + + if ( pm->ps->stats[STAT_HEALTH] <= 0 ) + { + pm->tracemask &= ~CONTENTS_BODY; // corpses can fly through bodies + } + + // adding fake talk balloons + if ( pmove->cmd.buttons & BUTTON_TALK ) + { + pmove->cmd.buttons = 0; + pmove->cmd.forwardmove = 0; + pmove->cmd.rightmove = 0; + pmove->cmd.upmove = 0; + } + + // clear all pmove local vars + memset (&pml, 0, sizeof(pml)); + + // determine the time + pml.msec = pmove->cmd.serverTime - pm->ps->commandTime; + if ( pml.msec < 1 ) + { + pml.msec = 1; + } + else if ( pml.msec > 200 ) + { + pml.msec = 200; + } + + pm->ps->commandTime = pmove->cmd.serverTime; + + // save old org in case we get stuck + VectorCopy( pm->ps->origin, pml.previous_origin ); + + // save old velocity for crashlanding + VectorCopy( pm->ps->velocity, pml.previous_velocity ); + + pml.frametime = pml.msec * 0.001f; + + // update the viewangles + PM_UpdateViewAngles( pm->ps, &pm->cmd ); + + AngleVectors( pm->ps->viewangles, pml.forward, pml.left, pml.up ); + VectorClear( tempVec ); + tempVec[ YAW ] = pm->ps->viewangles[ YAW ]; + AngleVectors( tempVec, pml.flat_forward, pml.flat_left, pml.flat_up ); + + if ( pm->ps->pm_type >= PM_DEAD ) + { + pm->cmd.forwardmove = 0; + pm->cmd.rightmove = 0; + pm->cmd.upmove = 0; + } + + if ( pm->ps->pm_type == PM_NOCLIP ) + { + PM_NoclipMove (); + PM_DropTimers (); + return; + } + + if ( pm->ps->pm_flags & PMF_FROZEN || pm->ps->pm_flags & PMF_NO_MOVE ) + { + return; // no movement at all + } + + // set watertype, and waterlevel + PM_SetWaterLevel(); + pml.previous_waterlevel = pmove->waterlevel; + + // set mins, maxs, and viewheight + PM_CheckDuck(); + + // set groundentity + PM_GroundTrace(); + + if ( pm->ps->pm_type == PM_DEAD ) + { + PM_DeadMove(); + } + + PM_DropTimers(); + + if ( pm->ps->pm_flags & PMF_TIME_WATERJUMP ) + { + PM_WaterJumpMove(); + } + else if ( pml.walking ) + { + // walking on ground + PM_WalkMove(); + } + else if ( pm->waterlevel > 1 ) + { + // swimming + PM_WaterMove(); + } + else if ( pm->ps->pm_flags & PMF_TIME_STUCKJUMP ) + { + PM_StuckJumpMove(); + } + else + { + // airborne + PM_AirMove(); + } + + walking = pml.walking; + + // set groundentity, watertype, and waterlevel + PM_GroundTrace(); + PM_SetWaterLevel(); + + // don't fall down stairs or do really short falls + if ( !pml.walking && ( walking || ( ( pml.previous_velocity[ 2 ] >= 0 ) && ( pm->ps->velocity[ 2 ] <= 0 ) ) ) ) + { + vec3_t point; + trace_t trace; + + point[ 0 ] = pm->ps->origin[ 0 ]; + point[ 1 ] = pm->ps->origin[ 1 ]; + point[ 2 ] = pm->ps->origin[ 2 ] - STEPSIZE; + + pm->trace( &trace, pm->ps->origin, pm->mins, pm->maxs, point, pm->ps->clientNum, pm->tracemask, qtrue ); + if ( ( trace.fraction < 1.0f ) && ( !trace.allsolid ) ) + { + VectorCopy( trace.endpos, pm->ps->origin ); + + // allow client to smooth out the step + pm->stepped = qtrue; + + // requantify the player's position + PM_GroundTrace(); + PM_SetWaterLevel(); + } + } + + // entering / leaving water splashes + PM_WaterEvents(); + + // snap some parts of playerstate to save network bandwidth + SnapVector( pm->ps->velocity ); + } + +/* +================ +Pmove + +Can be called by either the server or the client +================ +*/ +void Pmove (pmove_t *pmove) { + int finalTime; + + finalTime = pmove->cmd.serverTime; + + if ( finalTime < pmove->ps->commandTime ) { + return; // should not happen + } + + if ( finalTime > pmove->ps->commandTime + 1000 ) { + pmove->ps->commandTime = finalTime - 1000; + } + + // chop the move up if it is too long, to prevent framerate + // dependent behavior + while ( pmove->ps->commandTime != finalTime ) { + int msec; + + msec = finalTime - pmove->ps->commandTime; + + if ( msec > 50 ) { + msec = 50; + } + pmove->cmd.serverTime = pmove->ps->commandTime + msec; + PmoveSingle( pmove ); + } + +} diff --git a/source/source/fgame/bg_public.h b/source/source/fgame/bg_public.h new file mode 100644 index 0000000..97bec6c --- /dev/null +++ b/source/source/fgame/bg_public.h @@ -0,0 +1,783 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/bg_public.h $ +// $Revision:: 109 $ +// $Author:: Steven $ +// $Date:: 7/27/00 10:56p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/bg_public.h $ +// +// 109 7/27/00 10:56p Steven +// Added means of death eat. +// +// 108 7/27/00 3:52p Aldie +// Changed over letterboxing and fades to the game code. They are sent over in +// player stats and fields now. +// +// 107 7/25/00 12:47p Markd +// Added new player sounds +// +// 106 7/24/00 6:46p Steven +// Changed sv_cinematic from a cvar to a player stat. +// +// 105 7/24/00 12:46p Markd +// fixed rope movment +// +// 104 7/23/00 5:02p Markd +// Added boss health stat +// +// 103 7/19/00 8:19p Steven +// Added gas blockable means of death. +// +// 102 7/19/00 5:10p Steven +// Added electric water means of death. +// +// 101 7/16/00 4:39p Steven +// Added a new fire means of death. +// +// 100 7/13/00 12:33p Steven +// Added poison means of death. +// +// 99 7/10/00 11:54p Markd +// added exit level code +// +// 98 7/10/00 6:50p Markd +// fixed some issues with water running +// +// 97 7/02/00 1:11p Steven +// Changed means of death light to lightsword. +// +// 96 7/01/00 12:02p Steven +// Added electricsword and plasmashotgun means of death. +// +// 95 6/28/00 7:55p Aldie +// Added some MOD +// +// 94 6/26/00 5:50p Markd +// re-did some renderfx commands, fixed anti-sb juice stuff +// +// 93 6/25/00 12:38p Markd +// added STUCK_JUMP code +// +// 92 6/14/00 5:43p Steven +// Added plasmabeam means of death. +// +// 91 6/14/00 3:50p Markd +// Cleaned up more Intel Compiler warnings +// +// 90 6/14/00 11:18a Markd +// cleaned up code using Intel compiler +// +// 89 6/13/00 3:42p Steven +// Added gib means of death. +// +// 88 6/08/00 1:45p Steven +// Added means of death light. +// +// 87 6/06/00 2:51p Steven +// Added sting2 means of death. +// +// 86 6/05/00 6:42p Steven +// Added radiation means of death. +// +// 85 6/05/00 2:24p Markd +// Added CONTENTS_CAMERACLIP to MASK_OPAQUE +// +// 84 6/02/00 6:51p Markd +// added better camera look features +// +// 83 5/30/00 10:59a Aldie +// Added Circle of Protection Powerup +// +// 82 5/27/00 8:07p Markd +// Saved games 3rd pass +// +// 81 5/22/00 5:13p Aldie +// First version of soulsucker +// +// 80 5/20/00 5:14p Markd +// Added ITEM special effects +// +// 79 5/15/00 2:19p Aldie +// Added new tempmodel system and added player accumulated pain +// +// 78 5/11/00 11:08a Steven +// Added trypush to player move stuff. +// +// 77 5/10/00 10:25a Steven +// Added firesword means of death. +// +// 76 5/06/00 5:25p Markd +// fixed camera and pipe hang issues +// +// 75 5/05/00 2:17p Steven +// Addec chainsword and on_fire means of death. +// +// 74 5/04/00 12:46p Steven +// Added an axe means of death. +// +// 73 4/27/00 12:05p Steven +// Added crush_every_frame means of death. +// +// 72 4/27/00 11:58a Jimdose +// Changed OVERCLIP constant +// +// 71 4/15/00 5:40p Markd +// fixed falling damage and getting into and out of water +// +// 70 4/15/00 1:30p Markd +// added check_was_running code so that player does not always stop short +// +// 69 4/13/00 5:46p Steven +// Added poo_explosion means of death for Vymish Mama. +// +// 68 4/13/00 3:45p Aldie +// Added more flashbang support. Added damage_type to entities used to specify +// what type of damage they take. +// +// 67 4/12/00 6:57p Steven +// Added lifedrain means of death. +// +// 66 4/10/00 4:10p Markd +// Added CONTENTS_WEAPONCLIP to weapon masks +// +// 65 4/10/00 2:38p Markd +// eliminated the use of bg_public.h in some files +// +// 64 4/10/00 11:16a Markd +// added rope code +// +// 63 4/08/00 9:22a Markd +// Changed MASK_USE to include CONTENTS_BODY +// +// 62 4/07/00 3:00p Markd +// Added legs dangling code for pipehanging +// +// 61 4/06/00 10:59a Markd +// fixed player speed when player has full water +// +// 60 4/05/00 7:13p Aldie +// Lots of inventory functionality changes. +// +// 59 4/04/00 5:26p Markd +// moved static array from header into c file +// +// 58 3/31/00 1:01p Steven +// Added vortex means of death. +// +// 57 3/28/00 1:15p Steven +// Added means of death fire. +// +// 56 3/23/00 12:19p Markd +// increased range of dynamic light radius +// +// 55 3/21/00 5:06p Markd +// Added vehicle MOD +// +// 54 3/20/00 5:00p Aldie +// Fixes for entry and exit commands +// +// 53 3/14/00 3:22p Aldie +// Changed some client side emitter functionality and added func_emitter +// +// 52 3/13/00 11:26a Markd +// increased maximum number of animations +// +// 51 3/07/00 12:11p Steven +// Cleaned up means of death strings. +// +// 50 3/04/00 11:45a Markd +// Added light style support and malloc and free to the cgame +// +// 49 3/03/00 5:26p Steven +// Added MOD_FAST_BULLET means of death. +// +// 48 3/02/00 4:43p Aldie +// Added some ammo functionality for the HUD +// +// 47 2/26/00 12:51p Jimdose +// changed DEAD_VIEWHEIGHT +// +// 46 2/24/00 4:17p Jimdose +// moved some defines from bg_pmove.cpp +// +// 45 2/22/00 11:30a Steven +// Added means of death MOD_BULLET. +// +// 44 2/21/00 7:03p Markd +// Added skyalpha support +// +// 43 2/17/00 4:19p Jimdose +// added prototype for Pmove_GroundTrace +// +// 42 2/15/00 8:58p Jimdose +// added moveresult +// +// 41 2/14/00 5:37p Jimdose +// removed ANIM_BLEND_TORSO +// +// 40 2/12/00 3:24p Jimdose +// renamed ANIM_BLEND_TORSO to ANIM_BLEND +// +// 39 2/10/00 2:56p Markd +// changed FRAME_EXPLICIT mask from 128 to 512. +// +// 38 2/04/00 6:35p Markd +// Made animations dynamically allocated when loaded, fixed up messaging system +// to handle up to 1024 for each animation +// +// 37 1/29/00 2:48p Aldie +// Added impact mark functionality and Decal class +// +// 36 1/27/00 11:35a Markd +// Fixed solid/notsolid client side entities +// +// 35 1/19/00 7:14p Markd +// made camera's clip to all forms of water +// +// 34 1/19/00 6:37p Steven +// Added a MOD_NONE to fix some problems when a means of death is not +// specified. +// +// 33 1/19/00 10:44a Markd +// Cleaned up MOD messages and fixed music starting because of falling damage +// +// 32 1/19/00 10:23a Steven +// Added a sling means of death. +// +// 31 1/15/00 3:57p Markd +// Added MASK_USABLE +// +// 30 1/12/00 8:03p Markd +// Added Camera Cut bit +// +// 29 1/11/00 7:45p Aldie +// added water level +// +// 28 1/06/00 11:08p Jimdose +// cleaning up unused code +// +// 27 1/03/00 5:08p Markd +// put in camera offsets for player and state machine +// +// 26 12/17/99 8:26p Jimdose +// got rid of unused vars and functions +// +// 25 12/11/99 5:51p Markd +// First wave of bug fixes after q3a gold merge +// +// 24 12/11/99 3:37p Markd +// q3a gold checkin, first time +// +// 23 12/03/99 7:02p Aldie +// More ammo joy +// +// 22 12/02/99 6:53p Aldie +// Changed naming conventions from "both" to "dualhanded" Also put in the +// inventory renderer for the hud file +// +// 21 12/01/99 11:26a Aldie +// Couple of fixes for emitters and more ammo stuff +// +// 20 11/22/99 6:46p Aldie +// Started working on ammo changes - will finish after Thanksgiving break +// +// 19 11/10/99 6:08p Steven +// Added the sting means of death. +// +// 18 11/10/99 2:19p Jimdose +// added ANIM_BLEND_TORSO flag +// +// 17 10/29/99 7:16p Aldie +// Updated rope stuff +// +// 16 10/27/99 10:23a Steven +// Added new flag PMF_NO_MOVE and new contents type CONTENTS_SHOOTABLE_ONLY.. +// +// 15 10/19/99 7:52p Markd +// Removed three part model system +// +// 14 10/18/99 1:59p Aldie +// Lots of fixes for beams and stuff +// +// 13 10/12/99 6:56p Markd +// Fixed some player interpolation bugs and also interpolated camera +// +// 12 10/12/99 2:23p Markd +// Rewrote camera and player movetype system +// +// 11 10/08/99 2:11p Markd +// Re-ordered PM_TYPES +// +// 10 10/07/99 3:08p Aldie +// more beam fun +// +// 9 10/06/99 5:37p Jimdose +// updated tag bits to support the number of bones skeletal models can have +// added TAG_NUMBITS +// +// 8 9/30/99 4:37p Aldie +// Added ET_SPRITE +// +// 7 9/29/99 11:52a Markd +// removed some unused enums and variables form shared headers between cgame +// and fgame +// +// 6 9/27/99 5:44p Markd +// began documentation and cleanup phase after merge +// +// 5 9/16/99 12:27p Aldie +// code merge +// +// 4 9/13/99 4:22p Jimdose +// merge +// +// 3 9/10/99 6:51p Aldie +// restored trace function to new calling method +// +// 2 9/10/99 5:24p Aldie +// Merge code +// +// 1 9/10/99 10:53a Jimdose +// +// 2 9/09/99 3:30p Aldie +// Merge +// +// 1 9/08/99 3:15p Aldie +// +// 22 9/01/99 5:46p Aldie +// Fixed some weapon stuff for ECTS +// +// 21 8/31/99 2:45p Steven +// Added sword and plasma means of death. +// +// 20 8/29/99 8:09p Markd +// fixed up monstersolid and camerasolid MASK's +// +// 19 8/18/99 3:28p Jimdose +// added cylindrical collision detection +// +// 18 8/11/99 5:57p Steven +// Added acid means of death. +// +// 17 8/04/99 10:49a Steven +// Added gas as a new means of death. +// +// 16 7/06/99 8:33p Jimdose +// removed unused player code +// added state machine for player animation +// +// DESCRIPTION: +// Definitions shared by both the server game and client game modules + +#ifndef __BG_PUBLIC_H__ +#define __BG_PUBLIC_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +// because games can change separately from the main system version, we need a +// second version that must match between game and cgame +#define GAME_VERSION "fakk-base-1" + +#define DEFAULT_GRAVITY 800 + +// CS_SERVERINFO and CS_SYSTEMINFO and CS_NAME are defined in q_shared.h +#define CS_SOUNDTRACK 8 +#define CS_FOGINFO 9 +#define CS_SKYINFO 10 +#define CS_GAME_VERSION 11 +#define CS_LEVEL_START_TIME 12 // so the timer only shows the current level +#define CS_MODELS 32 +#define CS_SOUNDS (CS_MODELS+MAX_MODELS) +#define CS_IMAGES (CS_SOUNDS+MAX_SOUNDS) +#define CS_LIGHTSTYLES (CS_IMAGES+MAX_IMAGES) +#define CS_PLAYERS (CS_LIGHTSTYLES+MAX_LIGHTSTYLES) +#define CS_ITEMS (CS_PLAYERS+MAX_CLIENTS) // strings for item names +#define CS_AMMO (CS_ITEMS+MAX_ITEMS) // strings for ammo names +#define CS_LOCATIONS (CS_AMMO+MAX_AMMO) +#define CS_MAX (CS_LOCATIONS+MAX_LOCATIONS) + +#if (CS_MAX) > MAX_CONFIGSTRINGS +#error overflow: (CS_MAX) > MAX_CONFIGSTRINGS +#endif + +typedef enum { + GT_FFA, // free for all + GT_TOURNAMENT, // one on one tournament + GT_SINGLE_PLAYER, // single player tournament + + //-- team games go after this -- + + GT_TEAM, // team deathmatch + GT_CTF, // capture the flag + + GT_MAX_GAME_TYPE +} gametype_t; + + +// +// scale to use when evaluating constantLight scale +// +#define CONSTANTLIGHT_RADIUS_SCALE 8 + +/* +=================================================================================== + +PMOVE MODULE + +The pmove code takes a player_state_t and a usercmd_t and generates a new player_state_t +and some other output data. Used for local prediction on the client game and true +movement on the server game. +=================================================================================== +*/ + +#define MAX_CLIP_PLANES 5 +#define MIN_WALK_NORMAL 0.7f // can't walk on very steep slopes + +#define STEPSIZE 31 + +#define MINS_X -15 +#define MINS_Y -15 +#define MAXS_X 15 +#define MAXS_Y 15 + +#define MINS_Z 0 +#define MAXS_Z 96 + +#define DEAD_MINS_Z 32 +#define CROUCH_MAXS_Z 49 +#define DEFAULT_VIEWHEIGHT 90 +#define CROUCH_VIEWHEIGHT 45 +#define DEAD_VIEWHEIGHT 90 + +#define WATER_TURBO_SPEED 1.35f +#define WATER_TURBO_TIME 1200 +#define MINIMUM_RUNNING_TIME 800 +#define MINIMUM_WATER_FOR_TURBO 90 + +#define OVERCLIP 1.001f + +typedef enum { + PM_NORMAL, // normal movement mode + PM_NOCLIP, // noclip movement + PM_DEAD // no acceleration or turning, but free falling +} pmtype_t; + +// entityState_t->event values +// entity events are for effects that take place reletive +// to an existing entities origin. Very network efficient. +typedef enum { + EV_NONE, + + EV_FALL_SHORT, + EV_FALL_MEDIUM, + EV_FALL_FAR, + EV_FALL_FATAL, + EV_TERMINAL_VELOCITY, + + EV_WATER_TOUCH, // foot touches + EV_WATER_LEAVE, // foot leaves + EV_WATER_UNDER, // head touches + EV_WATER_CLEAR, // head leaves + + EV_LAST_PREDICTED // just a marker point + + // events generated by non-players or never predicted +} entity_event_t; + +// pmove->pm_flags +#define PMF_DUCKED ( 1<<0 ) // player is ducked +#define PMF_TIME_LAND ( 1<<1 ) // pm_time is time before rejump +#define PMF_TIME_KNOCKBACK ( 1<<2 ) // pm_time is an air-accelerate only time +#define PMF_TIME_WATERJUMP ( 1<<3 ) // pm_time is waterjump +#define PMF_TIME_TELEPORT ( 1<<4 ) // pm_time is teleport +#define PMF_NO_PREDICTION ( 1<<5 ) // no prediction +#define PMF_FROZEN ( 1<<6 ) // player cannot move or look around +#define PMF_INTERMISSION ( 1<<7 ) // intermission view + +// +// the following flag is required by the server and cannot be changed +// +#define PMF_CAMERA_VIEW ( 1<<8 ) // use camera view instead of ps view + +#define PMF_NO_MOVE ( 1<<9 ) // player cannot move but can still look around +#define PMF_LEGS_LIFTED ( 1<<10 ) // player has pulled up his legs so that he occupies only the top of his bounding box +#define PMF_TIME_STUCKJUMP ( 1<<11 ) // pm_time is stuckjump +#define PMF_LEVELEXIT ( 1<<12 ) // player is near an exit +#define PMF_NO_GRAVITY ( 1<<13 ) // do not apply gravity to the player + +#define PMF_ALL_TIMES (PMF_TIME_WATERJUMP|PMF_TIME_LAND|PMF_TIME_KNOCKBACK|PMF_TIME_TELEPORT|PMF_TIME_STUCKJUMP) + +#define MAXTOUCH 32 + +#define MOVERESULT_NONE 0 // nothing blocking +#define MOVERESULT_TURNED 1 // move blocked, but player turned to avoid it +#define MOVERESULT_BLOCKED 2 // move blocked by slope or wall +#define MOVERESULT_HITWALL 3 // player ran into wall + +typedef struct { + // state (in / out) + playerState_t *ps; + + // command (in) + usercmd_t cmd; + int tracemask; // collide against these types of surfaces + int debugLevel; // if set, diagnostic output will be printed + qboolean noFootsteps; // if the game is setup for no footsteps by the server + + // results (out) + int numtouch; + int touchents[MAXTOUCH]; + + int moveresult; // indicates whether 2the player's movement was blocked and how + + qboolean stepped; // made a non-smooth step that can be + // smoothed on the client side + + int pmoveEvent; // events predicted on client side + vec3_t mins, maxs; // bounding box size + int watertype; + int waterlevel; + + // callbacks to test the world + // these will be different functions during game and cgame + void (*trace)( trace_t *result, const vec3_t start, const vec3_t mins, const vec3_t maxs, const vec3_t end, int passEntityNum, int contentMask, qboolean cylinder ); + int (*pointcontents)( const vec3_t point, int passEntityNum ); + qboolean (*trypush)( int entnum, vec3_t move_origin, vec3_t move_end ); +} pmove_t; + +// if a full pmove isn't done on the client, you can just update the angles +void PM_UpdateViewAngles( playerState_t *ps, const usercmd_t *cmd ); +void Pmove_GroundTrace( pmove_t *pmove ); +void Pmove (pmove_t *pmove); + +//=================================================================================== + +// content masks +#define MASK_ALL (-1) +#define MASK_SOLID (CONTENTS_SOLID) +#define MASK_USABLE (CONTENTS_SOLID|CONTENTS_BODY) +#define MASK_PLAYERSOLID (CONTENTS_SOLID|CONTENTS_PLAYERCLIP|CONTENTS_BODY) +#define MASK_DEADSOLID (CONTENTS_SOLID|CONTENTS_PLAYERCLIP) +#define MASK_MONSTERSOLID (CONTENTS_SOLID|CONTENTS_MONSTERCLIP|CONTENTS_BODY) +#define MASK_WATER (CONTENTS_WATER|CONTENTS_LAVA|CONTENTS_SLIME) +#define MASK_OPAQUE (CONTENTS_SOLID|CONTENTS_SLIME|CONTENTS_LAVA|CONTENTS_CAMERACLIP) +#define MASK_SHOT (CONTENTS_SOLID|CONTENTS_BODY|CONTENTS_CORPSE|CONTENTS_WEAPONCLIP|CONTENTS_SHOOTABLE_ONLY) +#define MASK_PROJECTILE (CONTENTS_SOLID|CONTENTS_BODY|CONTENTS_CORPSE|CONTENTS_WEAPONCLIP|CONTENTS_SHOOTABLE_ONLY) +#define MASK_MELEE (CONTENTS_SOLID|CONTENTS_BODY|CONTENTS_CORPSE|CONTENTS_WEAPONCLIP|CONTENTS_SHOOTABLE_ONLY) +#define MASK_PATHSOLID (CONTENTS_SOLID|CONTENTS_MONSTERCLIP) +#define MASK_CAMERASOLID (CONTENTS_SOLID|CONTENTS_PLAYERCLIP|CONTENTS_CAMERACLIP|CONTENTS_BODY|MASK_WATER) +#define MASK_CURRENT (CONTENTS_CURRENT_0|CONTENTS_CURRENT_90|CONTENTS_CURRENT_180|CONTENTS_CURRENT_270|CONTENTS_CURRENT_UP|CONTENTS_CURRENT_DOWN) + +// player_state->persistant[] indexes +// these fields are the only part of player_state that isn't +// cleared on respawn +typedef enum { + PERS_SCORE, // !!! MUST NOT CHANGE, SERVER AND GAME BOTH REFERENCE !!! + PERS_TEAM +} persEnum_t; + +// entityState_t->eFlags +#define EF_EVENT_BIT1 0x00000001 // toggled every time an event changes +#define EF_EVENT_BIT2 0x00000002 // toggled every time an event changes +#define EF_EVENT_BITS (EF_EVENT_BIT1|EF_EVENT_BIT2) +#define EF_TELEPORT_BIT (1<<2) // toggled every time the origin abruptly changes +#define EF_EVERYFRAME (1<<3) // def commands will be run every client frame +#define EF_ANTISBJUICE (1<<4) // anti sucknblow juice +#define EF_LEFT_TARGETED (1<<5) // this entity is being targeted by the left hand +#define EF_RIGHT_TARGETED (1<<6) // this entity is being targeted by the right hand +#define EF_DONT_PROCESS_COMMANDS (1<<7) // don't process client commands for this entity + +// flip the togglebit every time an animation +// changes so a restart of the same anim can be detected +#define ANIM_TOGGLEBIT (1<<9) +#define ANIM_BLEND (1<<10) +#define ANIM_NUMBITS 11 + +// server side anim bits +#define ANIM_SERVER_EXITCOMMANDS_PROCESSED (1<<12) + +#define ANIM_MASK ( ~( ANIM_TOGGLEBIT | ANIM_BLEND | ANIM_SERVER_EXITCOMMANDS_PROCESSED ) ) + +// if FRAME_EXPLICIT is set, don't auto animate +#define FRAME_EXPLICIT 512 +#define FRAME_MASK ( ~FRAME_EXPLICIT ) + +// +// Tag specific flags +// +#define TAG_NUMBITS 10 // number of bits required to send over network +#define TAG_MASK ( ( 1 << 10 ) - 1 ) + + +// +// Camera Flags +// +#define CF_CAMERA_ANGLES_ABSOLUTE ( 1 << 0 ) +#define CF_CAMERA_ANGLES_IGNORE_PITCH ( 1 << 1 ) +#define CF_CAMERA_ANGLES_IGNORE_YAW ( 1 << 2 ) +#define CF_CAMERA_ANGLES_ALLOWOFFSET ( 1 << 3 ) +#define CF_CAMERA_CUT_BIT ( 1 << 7 ) // this bit gets toggled everytime we do a hard camera cut + +typedef enum { + MOD_NONE, + MOD_DROWN, + MOD_SUICIDE, + MOD_CRUSH, + MOD_CRUSH_EVERY_FRAME, + MOD_TELEFRAG, + MOD_LAVA, + MOD_SLIME, + MOD_FALLING, + MOD_LAST_SELF_INFLICTED, + MOD_EXPLOSION, + MOD_EXPLODEWALL, + MOD_ELECTRIC, + MOD_ELECTRICWATER, + MOD_THROWNOBJECT, + MOD_BEAM, + MOD_ROCKET, + MOD_IMPACT, + MOD_GAS, + MOD_GAS_BLOCKABLE, + MOD_ACID, + MOD_SWORD, + MOD_PLASMA, + MOD_PLASMABEAM, + MOD_PLASMASHOTGUN, + MOD_STING, + MOD_STING2, + MOD_SLING, + MOD_BULLET, + MOD_FAST_BULLET, + MOD_VEHICLE, + MOD_FIRE, + MOD_FIRE_BLOCKABLE, + MOD_VORTEX, + MOD_LIFEDRAIN, + MOD_FLASHBANG, + MOD_POO_EXPLOSION, + MOD_AXE, + MOD_CHAINSWORD, + MOD_ON_FIRE, + MOD_FIRESWORD, + MOD_ELECTRICSWORD, + MOD_CIRCLEOFPROTECTION, + MOD_RADIATION, + MOD_LIGHTSWORD, + MOD_GIB, + MOD_IMPALE, + MOD_UPPERCUT, + MOD_POISON, + MOD_EAT, + + MOD_TOTAL_NUMBER + } meansOfDeath_t; + +// If you add to the enum above go add a string to the means_of_death_strings in g_utils.cpp +extern char means_of_death_strings[ MOD_TOTAL_NUMBER ][ 32 ]; + +//--------------------------------------------------------- + + +// g_dmflags->integer flags + +#define DF_NO_HEALTH (1<<0) +#define DF_NO_POWERUPS (1<<1) +#define DF_WEAPONS_STAY (1<<2) +#define DF_NO_FALLING (1<<3) +#define DF_INSTANT_ITEMS (1<<4) +#define DF_SAME_LEVEL (1<<5) +#define DF_SKINTEAMS (1<<6) +#define DF_MODELTEAMS (1<<7) +#define DF_FRIENDLY_FIRE (1<<8) +#define DF_SPAWN_FARTHEST (1<<9) +#define DF_FORCE_RESPAWN (1<<10) +#define DF_NO_ARMOR (1<<11) +#define DF_FAST_WEAPONS (1<<12) +#define DF_NOEXIT (1<<13) +#define DF_INFINITE_AMMO (1<<14) +#define DF_FIXED_FOV (1<<15) +#define DF_NO_DROP_WEAPONS (1<<16) +#define DF_NO_FOOTSTEPS (1<<17) + +// teamflags->integer flags +#define TF_TEAMPLAY 1 +#define TF_NO_FRIENDLY_FIRE 2 + +// +// entityState_t->eType +// +typedef enum { + ET_MODELANIM, + ET_PLAYER, + ET_ITEM, + ET_GENERAL, + ET_MISSILE, + ET_MOVER, + ET_BEAM, + ET_MULTIBEAM, + ET_SPRITE, + ET_PORTAL, + ET_EVENT_ONLY, + ET_RAIN, + ET_LEAF, + ET_SPEAKER, + ET_PUSH_TRIGGER, + ET_TELEPORT_TRIGGER, + ET_DECAL, + ET_EMITTER, + ET_ROPE, + ET_EVENTS +} entityType_t; + +void EvaluateTrajectory( const trajectory_t *tr, int atTime, vec3_t result ); +void EvaluateTrajectoryDelta( const trajectory_t *tr, int atTime, vec3_t result ); + +// Added for FAKK + +typedef enum + { + STAT_HEALTH, + STAT_DEAD_YAW, // cleared each frame + STAT_AMMO_LEFT, // ammo in current weapon in left hand or primary ammo in 2 handed weapons + STAT_AMMO_RIGHT, // ammo in current weapon in right hand or alternate ammo in 2 handed weapons + STAT_CLIPAMMO_LEFT, // ammo in left weapon clip + STAT_CLIPAMMO_RIGHT, // ammo in right weapon clip + STAT_WATER_LEVEL, + STAT_MAXAMMO_LEFT, // maxammo for left weapon + STAT_MAXAMMO_RIGHT, // maxammo for right weapon + STAT_MAXCLIPAMMO_LEFT, // maxammo in left weapon clip + STAT_MAXCLIPAMMO_RIGHT, // maxammo in right weapon clip + STAT_LAST_PAIN, // Last amount of damage the player took + STAT_ACCUMULATED_PAIN, // Accumulated damage + STAT_BOSSHEALTH, // if we are fighting a boss, how much health he currently has + STAT_CINEMATIC, // This is set when we go into cinematics + STAT_ADDFADE, // This is set when we need to do an addblend for the fade + STAT_LETTERBOX, // This is set to the fraction of the letterbox + STAT_LAST_STAT + } playerstat_t + ; + +#define MAX_LETTERBOX_SIZE 0x7fff + +#define ITEM_NAME_AMMO_LEFT 0 +#define ITEM_NAME_AMMO_RIGHT 1 +#define ITEM_NAME_WEAPON_LEFT 2 +#define ITEM_NAME_WEAPON_RIGHT 3 +#define ITEM_NAME_WEAPON_DUAL 4 + +#ifdef __cplusplus + } +#endif + +#endif // __BG_PUBLIC_H__ + diff --git a/source/source/fgame/bspline.cpp b/source/source/fgame/bspline.cpp new file mode 100644 index 0000000..303ba95 --- /dev/null +++ b/source/source/fgame/bspline.cpp @@ -0,0 +1,1008 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/bspline.cpp $ +// $Revision:: 14 $ +// $Author:: Markd $ +// $Date:: 6/23/00 9:27a $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/bspline.cpp $ +// +// 14 6/23/00 9:27a Markd +// pushed spline path creation till after full spawn +// +// 13 4/05/00 6:16p Markd +// fixed destruction problem +// +// 12 3/15/00 6:54p Markd +// fixed no num_control_points DrawCurve bug +// +// 11 3/15/00 2:04p Markd +// fixed up camera node system and added new debug oriented circle +// +// 10 2/01/00 5:40p Markd +// Fixed Camera cutting issues +// +// 9 1/26/00 9:53a Markd +// Changed FOV command to an fov command +// +// 8 11/09/99 8:08p Markd +// revamped some functions because of changes to camera system +// +// 7 11/05/99 5:55p Markd +// Added user-interface to camera system +// +// 6 11/04/99 10:03a Markd +// complete overhaul of the camera system +// +// 5 10/04/99 10:53a Aldie +// fix warning +// +// 4 9/28/99 7:24p Steven +// Event formatting. +// +// 3 9/22/99 4:47p Markd +// fixed more G_GetEntity, G_FindClass and G_GetNextEntity bugs +// +// 2 9/21/99 7:51p Markd +// Fixed a lot of entitynum_none issues +// +// 1 9/10/99 10:53a Jimdose +// +// 1 9/08/99 3:15p Aldie +// +// 9 9/01/99 9:05p Jimdose +// added setthread event +// +// 8 9/01/99 8:00p Jimdose +// added triggertarget event +// +// DESCRIPTION: +// Uniform non-rational bspline class. +// + +#include "g_local.h" +#include "BSpline.h" + +void BSpline::Set + ( + Vector *control_points_, + int num_control_points_, + splinetype_t type + ) + + { + int i; + + SetType( type ); + + has_orientation = false; + + if ( control_points ) + { + delete [] control_points; + control_points = NULL; + } + + num_control_points = num_control_points_; + if ( num_control_points ) + { + control_points = new BSplineControlPoint[ num_control_points ]; + assert( control_points ); + + for( i = 0; i < num_control_points; i++ ) + { + control_points[ i ].Set( control_points_[ i ] ); + } + } + } + +void BSpline::Set + ( + Vector *control_points_, + Vector *control_orients_, + float *control_speeds_, + int num_control_points_, + splinetype_t type + ) + + { + int i; + + SetType( type ); + + has_orientation = true; + + if ( control_points ) + { + delete [] control_points; + control_points = NULL; + } + + num_control_points = num_control_points_; + if ( num_control_points ) + { + control_points = new BSplineControlPoint[ num_control_points ]; + assert( control_points ); + + for( i = 0; i < num_control_points; i++ ) + { + control_points[ i ].Set( control_points_[ i ], control_orients_[ i ], control_speeds_[ i ] ); + } + } + } + +void BSpline::Clear + ( + void + ) + + { + if( control_points ) + { + delete [] control_points; + control_points = NULL; + } + num_control_points = 0; + has_orientation = false; + } + +inline float BSpline::EvalNormal + ( + float u, + Vector& pos, + Vector& orient + ) + + { + int segment_id; + float B[ 4 ]; + float tmp; + float u_2; + float u_3; + Vector ang; + float roll; + float speed; + + segment_id = ( int )u; + if ( segment_id < 0 ) + { + segment_id = 0; + } + if ( segment_id > num_control_points - 4 ) + { + segment_id = num_control_points - 4; + } + u -= ( float )segment_id; + + u_2 = u * u; + u_3 = u * u_2; + + tmp = 1 - u; + B[ 0 ] = ( tmp * tmp * tmp ) * ( 1.0f / 6.0f ); + B[ 1 ] = ( 3.0f * u_3 - 6.0f * u_2 + 4.0f ) * ( 1.0f / 6.0f ); + B[ 2 ] = ( -3.0f * u_3 + 3.0f * u_2 + 3.0f * u + 1 ) * ( 1.0f / 6.0f ); + B[ 3 ] = u_3 * ( 1.0f / 6.0f ); + + pos = + *control_points[ 0 + segment_id ].GetPosition() * B[ 0 ] + + *control_points[ 1 + segment_id ].GetPosition() * B[ 1 ] + + *control_points[ 2 + segment_id ].GetPosition() * B[ 2 ] + + *control_points[ 3 + segment_id ].GetPosition() * B[ 3 ]; + + ang = + *control_points[ 0 + segment_id ].GetOrientation() * B[ 0 ] + + *control_points[ 1 + segment_id ].GetOrientation() * B[ 1 ] + + *control_points[ 2 + segment_id ].GetOrientation() * B[ 2 ] + + *control_points[ 3 + segment_id ].GetOrientation() * B[ 3 ]; + + roll = + *control_points[ 0 + segment_id ].GetRoll() * B[ 0 ] + + *control_points[ 1 + segment_id ].GetRoll() * B[ 1 ] + + *control_points[ 2 + segment_id ].GetRoll() * B[ 2 ] + + *control_points[ 3 + segment_id ].GetRoll() * B[ 3 ]; + + speed = + *control_points[ 0 + segment_id ].GetSpeed() * B[ 0 ] + + *control_points[ 1 + segment_id ].GetSpeed() * B[ 1 ] + + *control_points[ 2 + segment_id ].GetSpeed() * B[ 2 ] + + *control_points[ 3 + segment_id ].GetSpeed() * B[ 3 ]; + + orient = ang.toAngles(); + orient[ ROLL ] = roll; + + return speed; + } + +inline float BSpline::EvalLoop + ( + float t, + Vector& pos, + Vector& orient + ) + + { + Vector retval; + Vector ang; + float speed; + float roll; + int segment_id; + int next_id; + float B[ 4 ]; + float tmp; + float u; + float u_2; + float u_3; + int i; + int j; + + segment_id = ( int )floor( t ); + u = t - floor( t ); + + segment_id %= num_control_points; + if ( segment_id < 0 ) + { + segment_id += num_control_points; + } + + u_2 = u * u; + u_3 = u * u_2; + + tmp = 1 - u; + B[ 0 ] = ( tmp * tmp * tmp ) * ( 1.0f / 6.0f ); + B[ 1 ] = ( 3.0f * u_3 - 6.0f * u_2 + 4.0f ) * ( 1.0f / 6.0f ); + B[ 2 ] = ( -3.0f * u_3 + 3.0f * u_2 + 3.0f * u + 1 ) * ( 1.0f / 6.0f ); + B[ 3 ] = u_3 * ( 1.0f / 6.0f ); + + speed = 0; + roll = 0; + + for( i = 0, j = segment_id; i < 4; i++, j++ ) + { + if ( j >= num_control_points ) + { + j -= ( num_control_points - loop_control_point ); + } + + retval += *control_points[ j ].GetPosition() * B[ i ]; + ang += *control_points[ j ].GetOrientation() * B[ i ]; + speed += *control_points[ j ].GetSpeed() * B[ i ]; + roll += *control_points[ j ].GetRoll() * B[ i ]; + } + + pos = retval; + + next_id = segment_id + 1; + if ( next_id >= num_control_points ) + { + next_id -= ( num_control_points - loop_control_point ); + } + orient = ang.toAngles(); + orient[ ROLL ] = roll; + + return speed; + } + +inline float BSpline::EvalClamp + ( + float t, + Vector& pos, + Vector& orient + ) + + { + Vector retval; + Vector ang; + int segment_id; + int next_id; + float B[ 4 ]; + float tmp; + float u; + float u_2; + float u_3; + int i; + int j; + float speed; + float roll; + + segment_id = ( int )floor( t ); + u = t - floor( t ); + + u_2 = u * u; + u_3 = u * u_2; + + tmp = 1 - u; + B[ 0 ] = ( tmp * tmp * tmp ) * ( 1.0f / 6.0f ); + B[ 1 ] = ( 3.0f * u_3 - 6.0f * u_2 + 4.0f ) * ( 1.0f / 6.0f ); + B[ 2 ] = ( -3.0f * u_3 + 3.0f * u_2 + 3.0f * u + 1 ) * ( 1.0f / 6.0f ); + B[ 3 ] = u_3 * ( 1.0f / 6.0f ); + + speed = 0; + roll = 0; + for( i = 0; i < 4; i++, segment_id++ ) + { + j = segment_id; + if ( j < 0 ) + { + j = 0; + } + else if ( j >= num_control_points ) + { + j = num_control_points - 1; + } + + retval += *control_points[ j ].GetPosition() * B[ i ]; + ang += *control_points[ j ].GetOrientation() * B[ i ]; + speed += *control_points[ j ].GetSpeed() * B[ i ]; + roll += *control_points[ j ].GetRoll() * B[ i ]; + } + + pos = retval; + + next_id = segment_id + 1; + if ( segment_id < 0 ) + { + segment_id = 0; + } + if ( segment_id >= num_control_points ) + { + segment_id = num_control_points - 1; + } + if ( next_id < 0 ) + { + next_id = 0; + } + if ( next_id >= num_control_points ) + { + next_id = num_control_points - 1; + } + orient = ang.toAngles(); + orient[ ROLL ] = roll; + + return speed; + } + + +Vector BSpline::Eval + ( + float u + ) + + { + Vector pos; + Vector orient; + + switch( curvetype ) + { + default: + case SPLINE_NORMAL : + EvalNormal( u, pos, orient ); + break; + + case SPLINE_CLAMP: + EvalClamp( u, pos, orient ); + break; + + case SPLINE_LOOP: + if ( u < 0 ) + { + EvalClamp( u, pos, orient ); + } + else + { + EvalLoop( u, pos, orient ); + } + break; + } + return pos; + } + +float BSpline::Eval + ( + float u, + Vector &pos, + Vector &orient + ) + + { + switch( curvetype ) + { + default: + case SPLINE_NORMAL : + return EvalNormal( u, pos, orient ); + break; + + case SPLINE_CLAMP: + return EvalClamp( u, pos, orient ); + break; + + case SPLINE_LOOP: + if ( u < 0 ) + { + return EvalClamp( u, pos, orient ); + } + else + { + return EvalLoop( u, pos, orient ); + } + break; + } + } + +void BSpline::DrawControlSegments + ( + void + ) + + { + int i; + + G_BeginLine(); + for( i = 0; i < num_control_points; i++ ) + { + G_Vertex( *control_points[ i ].GetPosition() ); + } + G_EndLine(); + } + +void BSpline::DrawCurve + ( + int num_subdivisions + ) + + { + float u; + float du; + + if ( !num_control_points ) + { + return; + } + + du = 1.0f / ( float )num_subdivisions; + + G_BeginLine(); + for( u = -2.0f; u <= ( float )num_control_points; u += du ) + { + G_Vertex( ( Vector )Eval( u ) ); + } + G_EndLine(); + } + +void BSpline::DrawCurve + ( + Vector offset, + int num_subdivisions + ) + + { + float u; + float du; + + du = 1.0f / ( float )num_subdivisions; + + G_BeginLine(); + for( u = -2.0f; u <= ( float )num_control_points; u += du ) + { + G_Vertex( offset + ( Vector )Eval( u ) ); + } + G_EndLine(); + } + +void BSpline::AppendControlPoint + ( + const Vector& new_control_point + ) + + { + BSplineControlPoint *old_control_points; + int i; + + old_control_points = control_points; + num_control_points++; + + control_points = new BSplineControlPoint[num_control_points]; + assert( control_points ); + + if ( old_control_points ) + { + for( i = 0; i < num_control_points - 1; i++ ) + { + control_points[ i ] = old_control_points[ i ]; + } + delete [] old_control_points; + } + + control_points[ num_control_points - 1 ].Set( new_control_point ); + } + +void BSpline::AppendControlPoint + ( + const Vector& new_control_point, + const float& speed + ) + + { + BSplineControlPoint *old_control_points; + int i; + + old_control_points = control_points; + num_control_points++; + + control_points = new BSplineControlPoint[num_control_points]; + assert( control_points ); + + if ( old_control_points ) + { + for( i = 0; i < num_control_points - 1; i++ ) + { + control_points[ i ] = old_control_points[ i ]; + } + delete [] old_control_points; + } + + control_points[ num_control_points - 1 ].Set( new_control_point, speed ); + } + +void BSpline::AppendControlPoint + ( + const Vector& new_control_point, + const Vector& new_control_orient, + const float& new_control_speed + ) + + { + BSplineControlPoint *old_control_points; + int i; + + has_orientation = true; + + old_control_points = control_points; + num_control_points++; + + control_points = new BSplineControlPoint[num_control_points]; + assert( control_points ); + + if ( old_control_points ) + { + for( i = 0; i < num_control_points - 1; i++ ) + { + control_points[ i ] = old_control_points[ i ]; + } + delete [] old_control_points; + } + + control_points[ num_control_points - 1 ].Set( new_control_point, new_control_orient, new_control_speed ); + } + +void BSpline::SetLoopPoint + ( + const Vector& pos + ) + { + int i; + + for( i = 0; i < num_control_points; i++ ) + { + if ( pos == *control_points[ i ].GetPosition() ) + { + loop_control_point = i; + break; + } + } + } + +int BSpline::PickControlPoint + ( + const Vector& window_point, + float pick_size + ) + + { + int i; + float closest_dist_2; + int closest_index; + float dist_2; + Vector delta; + + closest_index = -1; + closest_dist_2 = 1000000.0f; + for( i = 0; i < num_control_points; i++ ) + { + delta = window_point - *control_points[ i ].GetPosition(); + dist_2 = delta * delta; + if ( dist_2 < closest_dist_2 ) + { + closest_dist_2 = dist_2; + closest_index = i; + } + } + + if ( pick_size * pick_size >= closest_dist_2 ) + { + return closest_index; + } + else + { + return -1; + } + } + +Event EV_SplinePath_Create + ( + "SplinePath_create", + EV_DEFAULT, + NULL, + NULL, + "Creates the spline path from the target list." + ); +Event EV_SplinePath_Loop + ( + "loop", + EV_CONSOLE, + "s", + "loop_name", + "Sets the loop name." + ); +Event EV_SplinePath_Speed + ( + "speed", + EV_DEFAULT, + "f", + "speed", + "Sets the path speed." + ); +Event EV_SplinePath_SetTriggerTarget + ( + "triggertarget", + EV_DEFAULT, + "s", + "target", + "Sets the trigger target." + ); +Event EV_SplinePath_SetThread + ( + "thread", + EV_DEFAULT, + "s", + "thread", + "Sets the thread." + ); +Event EV_SplinePath_SetWatch + ( + "watch", + EV_CONSOLE, + "s", + "watchEntity", + "Sets the entity to watch at this node." + ); + +Event EV_SplinePath_SetFov + ( + "fov", + EV_CONSOLE, + "f", + "cameraFOV", + "Sets the fov at this node." + ); + +Event EV_SplinePath_SetFadeTime + ( + "fadetime", + EV_DEFAULT, + "f", + "fadeTime", + "Sets the fadetime at this node." + ); + +CLASS_DECLARATION( Entity, SplinePath, "info_splinepath" ) + { + { &EV_SplinePath_Create, CreatePath }, + { &EV_SplinePath_Loop, SetLoop }, + { &EV_SplinePath_Speed, SetSpeed }, + { &EV_SplinePath_SetTriggerTarget, SetTriggerTarget }, + { &EV_SplinePath_SetThread, SetThread }, + { &EV_SplinePath_SetWatch, SetWatch }, + { &EV_SplinePath_SetFov, SetFov }, + { &EV_SplinePath_SetFadeTime, SetFadeTime }, + { NULL, NULL } + }; + +SplinePath::SplinePath() + { + owner = this; + next = NULL; + loop = NULL; + speed = 1; + doWatch = false; + watchEnt = ""; + fov = 0; + fadeTime = -1; + + setMoveType( MOVETYPE_NONE ); + setSolidType( SOLID_NOT ); + hideModel(); + + if ( !LoadingSavegame ) + { + PostEvent( EV_SplinePath_Create, FRAMETIME ); + } + } + +SplinePath::~SplinePath() + { + // disconnect from the chain + if ( owner != this ) + { + owner->SetNext( next ); + } + else if ( next ) + { + next->SetPrev( NULL ); + next = NULL; + } + + assert( owner == this ); + assert( next == NULL ); + } + +void SplinePath::SetLoop + ( + Event *ev + ) + + { + loop_name = ev->GetString( 1 ); + } + +void SplinePath::SetSpeed + ( + Event *ev + ) + + { + speed = ev->GetFloat( 1 ); + } + +void SplinePath::SetTriggerTarget + ( + Event *ev + ) + + { + SetTriggerTarget( ev->GetString( 1 ) ); + } + +void SplinePath::SetThread + ( + Event *ev + ) + + { + SetThread( ev->GetString( 1 ) ); + } + +void SplinePath::CreatePath + ( + Event *ev + ) + + { + const char *target; + Entity *ent; + + // Make the path from the targetlist. + target = Target(); + if ( target[ 0 ] ) + { + ent = G_FindTarget( NULL, target ); + if ( ent ) + { + next = ( SplinePath * )ent; + next->owner = this; + } + else + { + gi.Error( ERR_DROP, "SplinePath::CreatePath: target %s not found\n", target ); + } + } + if ( loop_name.length() ) + { + ent = G_FindTarget( NULL, loop_name.c_str() ); + if ( ent ) + { + loop = ( SplinePath * )ent; + } + } + } + +SplinePath *SplinePath::GetNext + ( + void + ) + + { + return next; + } + +SplinePath *SplinePath::GetPrev + ( + void + ) + + { + if ( owner == this ) + { + return NULL; + } + + return owner; + } + +void SplinePath::SetNext + ( + SplinePath *node + ) + + { + if ( next ) + { + // remove ourselves from the chain + next->owner = next; + } + + next = node; + if ( next ) + { + // disconnect next from it's previous node + if ( next->owner != next ) + { + next->owner->next = NULL; + } + next->owner = this; + } + } + +void SplinePath::SetPrev + ( + SplinePath *node + ) + + { + if ( owner != this ) + { + owner->next = NULL; + } + + if ( node && ( node != this ) ) + { + // safely remove the node from its chain + if ( node->next ) + { + node->next->owner = node->next; + } + node->next = this; + owner = node; + } + else + { + owner = this; + } + } + +SplinePath *SplinePath::GetLoop + ( + void + ) + + { + return loop; + } + +void SplinePath::SetWatch + ( + const char *name + ) + + { + if ( watchEnt != name ) + { + watchEnt = name; + if ( watchEnt.length() ) + { + doWatch = true; + } + else + { + doWatch = false; + } + } + } + +void SplinePath::SetWatch + ( + Event *ev + ) + + { + SetWatch( ev->GetString( 1 ) ); + } + + +void SplinePath::NoWatch + ( + void + ) + + { + doWatch = true; + watchEnt = "none"; + } + +str SplinePath::GetWatch + ( + void + ) + + { + return watchEnt; + } + +void SplinePath::SetFov + ( + float newFov + ) + + { + fov = newFov; + } + +void SplinePath::SetFov + ( + Event *ev + ) + + { + fov = ev->GetFloat( 1 ); + } + +float SplinePath::GetFov + ( + void + ) + + { + return fov; + } + +void SplinePath::SetFadeTime + ( + float newFadeTime + ) + + { + fadeTime = newFadeTime; + } + +void SplinePath::SetFadeTime + ( + Event *ev + ) + + { + fadeTime = ev->GetFloat( 1 ); + } + +float SplinePath::GetFadeTime + ( + void + ) + + { + return fadeTime; + } diff --git a/source/source/fgame/bspline.h b/source/source/fgame/bspline.h new file mode 100644 index 0000000..5056676 --- /dev/null +++ b/source/source/fgame/bspline.h @@ -0,0 +1,617 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/bspline.h $ +// $Revision:: 9 $ +// $Author:: Steven $ +// $Date:: 7/26/00 8:37a $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/bspline.h $ +// +// 9 7/26/00 8:37a Steven +// Fixed a bad memory bug. +// +// 8 7/26/00 12:46a Markd +// fixed potential crash bug, I hope +// +// 7 7/25/00 11:32p Aldie +// Made some changes to the memory system and fixed a memory allocation bug in +// Z_TagMalloc. Also changed a lot of classes to subclass from Class. +// +// 6 5/25/00 7:52p Markd +// 2nd pass save game stuff +// +// 5 5/24/00 3:14p Markd +// first phase of save/load games +// +// 4 1/05/00 7:25p Jimdose +// made angle functions all use the same coordinate system +// AngleVectors now returns left instead of right +// no longer need to invert pitch +// +// 3 11/09/99 8:08p Markd +// revamped some functions because of changes to camera system +// +// 2 11/05/99 5:55p Markd +// Added user-interface to camera system +// +// 1 9/10/99 10:53a Jimdose +// +// 1 9/08/99 3:15p Aldie +// +// 10 9/01/99 9:05p Jimdose +// added setthread event +// +// 9 9/01/99 8:00p Jimdose +// added triggertarget event +// +// 8 9/01/99 6:15p Jimdose +// added SetThread and SetTriggerTarget +// +// DESCRIPTION: +// Uniform non-rational bspline class. +// + +#ifndef __BSPLINE_H__ +#define __BSPLINE_H__ + +#include "g_local.h" +#include "Vector.h" + +typedef enum + { + SPLINE_NORMAL, + SPLINE_LOOP, + SPLINE_CLAMP + } splinetype_t; + +class BSplineControlPoint : public Class + { + private: + float roll; + Vector position; + Vector orientation; + float speed; + + public: + BSplineControlPoint(); + BSplineControlPoint( Vector pos, Vector orient, float speed ); + BSplineControlPoint( Vector pos ); + void Clear( void ); + void Set( Vector pos ); + void Set( Vector pos, float speed ); + void Set( Vector pos, Vector orient, float speed ); + void Get( Vector& pos, Vector& orient, float& speed ); + void Get( Vector& pos ); + Vector *GetPosition( void ); + Vector *GetOrientation( void ); + float *GetRoll( void ); + float *GetSpeed( void ); + void operator=( BSplineControlPoint &point ); + virtual void Archive( Archiver &arc ); + }; + +inline void BSplineControlPoint::Archive + ( + Archiver &arc + ) + + { + arc.ArchiveVector( &position ); + arc.ArchiveVector( &orientation ); + arc.ArchiveFloat( &speed ); + arc.ArchiveFloat( &roll ); + } + +inline void BSplineControlPoint::operator= + ( + BSplineControlPoint &point + ) + + { + position = point.position; + orientation = point.orientation; + speed = point.speed; + roll = point.roll; + } + +inline BSplineControlPoint::BSplineControlPoint() + { + roll = 0; + speed = 1; + } + +inline BSplineControlPoint::BSplineControlPoint + ( + Vector pos + ) + + { + speed = 1; + position = pos; + } + +inline BSplineControlPoint::BSplineControlPoint + ( + Vector pos, + Vector orient, + float speed + ) + + { + position = pos; + orient.AngleVectors( &orientation, NULL, NULL ); + roll = orient[ ROLL ]; + if ( roll > 180 ) + { + roll -= 360; + } + if ( roll < -180 ) + { + roll += 360; + } + this->speed = speed; + } + +inline void BSplineControlPoint::Clear + ( + void + ) + + { + roll = 0; + position = "0 0 0"; + vec_zero.AngleVectors( &orientation, NULL, NULL ); + speed = 1.0f; + } + +inline void BSplineControlPoint::Set + ( + Vector pos + ) + + { + speed = 1; + position = pos; + } + +inline void BSplineControlPoint::Set + ( + Vector pos, + float pointspeed + ) + + { + speed = pointspeed; + position = pos; + } + +inline void BSplineControlPoint::Set + ( + Vector pos, + Vector orient, + float speed + ) + + { + position = pos; + orient.AngleVectors( &orientation, NULL, NULL ); + roll = orient[ ROLL ]; + if ( roll > 180 ) + { + roll -= 360; + } + if ( roll < -180 ) + { + roll += 360; + } + this->speed = speed; + } + +inline void BSplineControlPoint::Get + ( + Vector& pos + ) + { + pos = position; + } + +inline Vector *BSplineControlPoint::GetPosition + ( + void + ) + + { + return &position; + } + +inline void BSplineControlPoint::Get + ( + Vector& pos, + Vector& orient, + float& speed + ) + + { + pos = position; + orient = orientation; + speed = this->speed; + } + +inline Vector *BSplineControlPoint::GetOrientation + ( + void + ) + { + return &orientation; + } + +inline float *BSplineControlPoint::GetRoll + ( + void + ) + { + return &roll; + } + +inline float *BSplineControlPoint::GetSpeed + ( + void + ) + { + return &speed; + } + +class BSpline : public Class + { + private: + BSplineControlPoint *control_points; + int num_control_points; + int loop_control_point; + splinetype_t curvetype; + qboolean has_orientation; + + float EvalNormal( float u, Vector &pos, Vector& orient ); + float EvalLoop( float u, Vector &pos, Vector& orient ); + float EvalClamp( float u, Vector &pos, Vector& orient ); + + public: + BSpline(); + ~BSpline(); + BSpline( Vector *control_points_, int num_control_points_, splinetype_t type ); + BSpline( Vector *control_points_, Vector *control_orients_, float *control_speeds_, int num_control_points_, splinetype_t type ); + void operator=( BSpline &spline ); + void SetType( splinetype_t type ); + int GetType( void ); + void Clear( void ); + void Set( Vector *control_points_, int num_control_points_, splinetype_t type ); + void Set( Vector *control_points_, Vector *control_orients_, float *control_speeds_, int num_control_points_, splinetype_t type ); + void AppendControlPoint( const Vector& new_control_point ); + void AppendControlPoint( const Vector& new_control_point, const float& speed ); + void AppendControlPoint( const Vector& new_control_point, const Vector& new_control_orient, const float& speed ); + Vector Eval( float u ); + float Eval( float u, Vector& pos, Vector& orient ); + + void DrawControlSegments( void ); + void DrawCurve( int num_subdivisions ); + void DrawCurve( Vector offset, int num_subdivisions ); + + void SetLoopPoint( const Vector& pos ); + + float EndPoint( void ); + + // return the index of the control point picked or -1 if none. + int PickControlPoint( const Vector& window_point, float pick_size ); + + Vector *GetControlPoint( int id ); + void GetControlPoint( int id, Vector& pos, Vector& orient, float& speed ); + void SetControlPoint( int id, const Vector& new_control_point ); + void SetControlPoint( int id, const Vector& new_control_point, const Vector& new_control_orient, const float& speed ); + virtual void Archive( Archiver &arc ); + }; + +inline BSpline::BSpline() + { + has_orientation = false; + control_points = NULL; + num_control_points = 0; + loop_control_point = 0; + curvetype = SPLINE_NORMAL; + } + +inline BSpline::~BSpline() + { + if ( control_points ) + { + delete [] control_points; + control_points = NULL; + } + } + +inline BSpline::BSpline + ( + Vector *control_points_, + int num_control_points_, + splinetype_t type + ) + + { + has_orientation = false; + control_points = NULL; + num_control_points = 0; + loop_control_point = 0; + curvetype = SPLINE_NORMAL; + + Set( control_points_, num_control_points_, type ); + } + +inline BSpline::BSpline + ( + Vector *control_points_, + Vector *control_orients_, + float *control_speeds_, + int num_control_points_, + splinetype_t type + ) + + { + has_orientation = false; + control_points = NULL; + num_control_points = 0; + loop_control_point = 0; + curvetype = SPLINE_NORMAL; + + Set( control_points_, control_orients_, control_speeds_, num_control_points_, type ); + } + +inline void BSpline::operator= + ( + BSpline &spline + ) + + { + int i; + + Clear(); + num_control_points = spline.num_control_points; + loop_control_point = spline.loop_control_point; + curvetype = spline.curvetype; + has_orientation = spline.has_orientation; + + if ( num_control_points ) + { + control_points = new BSplineControlPoint[num_control_points]; + assert( control_points ); + for ( i = 0; i < num_control_points ; i++ ) + control_points[ i ] = spline.control_points[ i ]; + } + else + { + control_points = NULL; + } + } + +inline void BSpline::SetType + ( + splinetype_t type + ) + + { + curvetype = type; + } + +inline int BSpline::GetType + ( + void + ) + + { + return curvetype; + } + +inline float BSpline::EndPoint + ( + void + ) + + { + return num_control_points; + } + +inline Vector *BSpline::GetControlPoint + ( + int id + ) + + { + assert( id >= 0 ); + assert( id < num_control_points ); + if ( ( id < 0 ) && ( id >= num_control_points ) ) + { + // probably wrong, but if we're in release mode we have no recourse + id = 0; + } + + return control_points[ id ].GetPosition(); + } + +inline void BSpline::GetControlPoint + ( + int id, + Vector& pos, + Vector& orient, + float& speed + ) + + { + assert( id >= 0 ); + assert( id < num_control_points ); + if ( ( id >= 0 ) && ( id < num_control_points ) ) + { + control_points[ id ].Get( pos, orient, speed ); + } + } + +inline void BSpline::SetControlPoint + ( + int id, + const Vector& new_control_point + ) + + { + assert( id >= 0 ); + assert( id < num_control_points ); + if ( ( id >= 0 ) && ( id < num_control_points ) ) + { + control_points[ id ].Set( new_control_point ); + } + } + +inline void BSpline::SetControlPoint + ( + int id, + const Vector& new_control_point, + const Vector& new_control_orient, + const float& speed + ) + + { + assert( id >= 0 ); + assert( id < num_control_points ); + if ( ( id >= 0 ) && ( id < num_control_points ) ) + { + control_points[ id ].Set( new_control_point, new_control_orient, speed ); + } + } + +inline void BSpline::Archive + ( + Archiver &arc + ) + { + int i; + + arc.ArchiveInteger( &num_control_points ); + if ( arc.Loading() ) + { + if ( num_control_points ) + control_points = new BSplineControlPoint[ num_control_points ]; + else + control_points = NULL; + } + + arc.ArchiveInteger( &loop_control_point ); + + i = curvetype; + arc.ArchiveInteger( &i ); + curvetype = ( splinetype_t )i; + + arc.ArchiveBoolean( &has_orientation ); + for( i = 0; i < num_control_points; i++ ) + { + control_points[ i ].Archive( arc ); + } + } + +extern Event EV_SplinePath_Create; +extern Event EV_SplinePath_Loop; +extern Event EV_SplinePath_Speed; + +class SplinePath : public Entity + { + protected: + SplinePath *owner; + SplinePath *next; + SplinePath *loop; + str loop_name; + + void CreatePath( Event *ev ); + void SetLoop( Event *ev ); + void SetSpeed( Event *ev ); + void SetTriggerTarget( Event *ev ); + void SetThread( Event *ev ); + void SetFov( Event *ev ); + void SetWatch( Event *ev ); + void SetFadeTime( Event *ev ); + + public: + float speed; + float fov; + float fadeTime; + qboolean doWatch; + str watchEnt; + str triggertarget; + str thread; + + CLASS_PROTOTYPE( SplinePath ); + + SplinePath(); + ~SplinePath(); + SplinePath *GetNext( void ); + SplinePath *GetPrev( void ); + SplinePath *GetLoop( void ); + void SetFadeTime( float newFadeTime ); + void SetFov( float theFov ); + void SetWatch( const char *name ); + void SetThread( const char *name ); + void SetTriggerTarget( const char *name ); + void NoWatch( void ); + str GetWatch( void ); + float GetFadeTime( void ); + float GetFov( void ); + void SetNext( SplinePath *node ); + void SetPrev( SplinePath *node ); + virtual void Archive( Archiver &arc ); + }; + +typedef SafePtr SplinePathPtr; + +inline void SplinePath::Archive + ( + Archiver &arc + ) + + { + Entity::Archive( arc ); + + arc.ArchiveObjectPointer( ( Class ** )&owner ); + arc.ArchiveObjectPointer( ( Class ** )&next ); + arc.ArchiveObjectPointer( ( Class ** )&loop ); + arc.ArchiveString( &loop_name ); + arc.ArchiveFloat( &speed ); + arc.ArchiveFloat( &fov ); + arc.ArchiveFloat( &fadeTime ); + arc.ArchiveBoolean( &doWatch ); + arc.ArchiveString( &watchEnt ); + arc.ArchiveString( &thread ); + arc.ArchiveString( &triggertarget ); + if ( arc.Loading() ) + { + CancelEventsOfType( EV_SplinePath_Create ); + } + } + +inline void SplinePath::SetThread + ( + const char *name + ) + + { + thread = name; + } + +inline void SplinePath::SetTriggerTarget + ( + const char *name + ) + + { + triggertarget = name; + } + +#endif /* __BSPLINE_H__ */ diff --git a/source/source/fgame/bullet.cpp b/source/source/fgame/bullet.cpp new file mode 100644 index 0000000..944451a --- /dev/null +++ b/source/source/fgame/bullet.cpp @@ -0,0 +1,298 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/bullet.cpp $ +// $Revision:: 1 $ +// $Author:: Jimdose $ +// $Date:: 9/10/99 10:53a $ +// +// Copyright (C) 1997 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/bullet.cpp $ +// +// 1 9/10/99 10:53a Jimdose +// +// 1 9/08/99 3:15p Aldie +// +// 11 8/18/99 3:28p Jimdose +// added cylindrical collision detection +// +// DESCRIPTION: +// Base class for all bullet (hitscan) weapons. Includes definition for shotgun. +// + +#include "g_local.h" +#include "specialfx.h" +#include "misc.h" +#include "bullet.h" +//#include "surface.h" + +CLASS_DECLARATION( Weapon, BulletWeapon, NULL ) + { + { NULL, NULL } + }; + +BulletWeapon::BulletWeapon() + { + modelIndex( "sprites/tracer.spr" ); + modelIndex( "sprites/bullethole.spr" ); + } + +void BulletWeapon::TraceAttack + ( + Vector start, + Vector end, + int damage, + trace_t *trace, + int numricochets, + int kick, + int dflags, + int meansofdeath, + qboolean server_effects + ) + + { + Vector org; + Vector dir; + Vector endpos; + int surfflags; + int surftype; + int timeofs; + Entity *ent; + qboolean ricochet; + + if ( HitSky( trace ) ) + { + return; + } + + ricochet = false; + dir = end - start; + dir.normalize(); + + org = end - dir; + + ent = trace->ent->entity; + + if ( !trace->surface ) + { + surfflags = 0; + surftype = 0; + } + else + { + surfflags = trace->surface->flags; + surftype = SURFACETYPE_FROM_FLAGS( surfflags ); + + if ( surfflags & SURF_RICOCHET ) + ricochet = true; + } + + if ( trace->intersect.valid && ent ) + { + // + // see if the surface has ricochet turned on + // + if ( trace->intersect.surface >= 0 ) + { + int flags; + + flags = gi.Surface_Flags( ent->edict->s.modelindex, trace->intersect.surface ); + /* GAMEFIX + if ( flags & MDL_SURFACE_RICOCHET ) + { + surftype = ( flags >> 8 ) & 0xf; + ricochet = true; + } + */ + } + } + if ( ent ) + { + if ( ent->flags & FL_SPARKS ) + { + // Take care of ricochet effects on the server + if ( server_effects && !ricochet ) + { + timeofs = MAX_RICOCHETS - numricochets; + if ( timeofs > 0xf ) + { + timeofs = 0xf; + } +/* GAMEFIX + gi.WriteByte( svc_temp_entity ); + gi.WriteByte( TE_GUNSHOT ); + gi.WritePosition( org.vec3() ); + gi.WriteDir( trace->plane.normal ); + gi.WriteByte( 0 ); + gi.multicast( org.vec3(), MULTICAST_PVS ); + */ + } + G_BroadcastSound( owner, org ); + } + + if ( ent->takedamage ) + { + if ( trace->intersect.valid ) + { + // We hit a valid group so send in location based damage + ent->Damage( this, + owner, + damage, + trace->endpos, + dir, + trace->plane.normal, + kick, + dflags, + meansofdeath, + trace->intersect.surface, + -1, + trace->intersect.damage_multiplier ); + } + else + { + // We didn't hit any groups, so send in generic damage + ent->Damage( this, + owner, + damage, + trace->endpos, + dir, + trace->plane.normal, + kick, + dflags, + meansofdeath, + -1, + -1, + 1 ); + } + } + } + + if ( ricochet && ( server_effects || ( numricochets < MAX_RICOCHETS ) ) ) + { + timeofs = MAX_RICOCHETS - numricochets; + if ( timeofs > 0xf ) + { + timeofs = 0xf; + } +/* GAMEFIX + gi.WriteByte( svc_temp_entity ); + gi.WriteByte( TE_GUNSHOT ); + gi.WritePosition( org.vec3() ); + gi.WriteDir( trace->plane.normal ); + gi.WriteByte( timeofs ); + gi.multicast( org.vec3(), MULTICAST_PVS ); + */ + } + + if ( + ricochet && + numricochets && + damage + ) + { + dir += Vector( trace->plane.normal ) * 2; + endpos = org + dir * 8192; + + // + // since this is a ricochet, we don't ignore the wewapon owner this time. + // + *trace = G_FullTrace( org, vec_zero, vec_zero, endpos, 5, NULL, MASK_SHOT, false, "BulletWeapon::TraceAttack" ); + if ( trace->fraction != 1.0 ) + { + endpos = trace->endpos; + TraceAttack( org, endpos, damage * 0.8f, trace, numricochets - 1, kick, dflags, meansofdeath, true ); + } + } + } + +void BulletWeapon::FireBullets + ( + int numbullets, + Vector spread, + int mindamage, + int maxdamage, + int dflags, + int meansofdeath, + qboolean server_effects + ) + + { + Vector src; + Vector dir; + Vector end; + trace_t trace; + Vector right; + Vector up; + int i; + + assert( owner ); + if ( !owner ) + { + return; + } + + GetMuzzlePosition( &src, &dir ); + + owner->angles.AngleVectors( NULL, &right, &up ); + + angles = dir.toAngles(); + setAngles( angles ); + + for( i = 0; i < numbullets; i++ ) + { + end = src + + dir * 8192 + + right * G_CRandom() * spread.x + + up * G_CRandom() * spread.y; + + trace = G_FullTrace( src, vec_zero, vec_zero, end, 5, owner, MASK_SHOT, false, "BulletWeapon::FireBullets" ); +#if 0 + Com_Printf("Server OWNER Angles:%0.2f %0.2f %0.2f\n",owner->angles[0],owner->angles[1],owner->angles[2]); + Com_Printf("Server Bullet Angles:%0.2f %0.2f %0.2f\n",angles[0],angles[1],angles[2]); + Com_Printf("Right :%0.2f %0.2f %0.2f\n",right[0],right[1],right[2]); + Com_Printf("Up :%0.2f %0.2f %0.2f\n",up[0],up[1],up[2]); + Com_Printf("Direction :%0.2f %0.2f %0.2f\n",dir[0],dir[1],dir[2]); + Com_Printf("Endpoint :%0.2f %0.2f %0.2f\n",end[0],end[1],end[2]); + Com_Printf("Server Trace Start :%0.2f %0.2f %0.2f\n",src[0],src[1],src[2]); + Com_Printf("Server Trace End :%0.2f %0.2f %0.2f\n",trace.endpos[0],trace.endpos[1],trace.endpos[2]); + Com_Printf("\n"); +#endif + if ( trace.fraction != 1.0 ) + { + TraceAttack( src, trace.endpos, mindamage + (int)G_Random( maxdamage - mindamage + 1 ), &trace, MAX_RICOCHETS, kick, dflags, meansofdeath, server_effects ); + } + } + } + +void BulletWeapon::FireTracer( void ) + { + Entity *tracer; + Vector src,dir,end; + trace_t trace; + + GetMuzzlePosition( &src, &dir ); + end = src + dir * 8192; + trace = G_Trace( src, vec_zero, vec_zero, end, owner, MASK_SHOT, false, "BulletWeapon::FireTracer" ); + + tracer = new Entity; + + tracer->angles = dir.toAngles(); + tracer->angles[ PITCH ] = -tracer->angles[ PITCH ] + 90; + //tracer->angles[PITCH] *= -1; + + tracer->setAngles( tracer->angles ); + + tracer->setMoveType( MOVETYPE_NONE ); + tracer->setSolidType( SOLID_NOT ); + tracer->setModel( "sprites/tracer.spr" ); + tracer->setSize( "0 0 0", "0 0 0" ); + tracer->setOrigin( trace.endpos ); + tracer->edict->s.renderfx &= ~RF_FRAMELERP; + + VectorCopy( src, tracer->edict->s.origin2 ); + tracer->PostEvent(EV_Remove,FRAMETIME); + } \ No newline at end of file diff --git a/source/source/fgame/bullet.h b/source/source/fgame/bullet.h new file mode 100644 index 0000000..0b143f6 --- /dev/null +++ b/source/source/fgame/bullet.h @@ -0,0 +1,45 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/bullet.h $ +// $Revision:: 1 $ +// $Author:: Jimdose $ +// $Date:: 9/10/99 10:53a $ +// +// Copyright (C) 1997 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/bullet.h $ +// +// 1 9/10/99 10:53a Jimdose +// +// 1 9/08/99 3:15p Aldie +// +// DESCRIPTION: +// Base class for all bullet (hitscan) weapons. Includes definition for shotgun. +// + +#ifndef __BULLET_H__ +#define __BULLET_H__ + +#include "g_local.h" +#include "item.h" +#include "weapon.h" + +#define MAX_RICOCHETS 10 + +class BulletWeapon : public Weapon + { + protected: + BulletWeapon(); + virtual void TraceAttack( Vector start, Vector end, int damage, trace_t *trace, int numricochets, int kick, int dflags, int meansofdeath, qboolean server_effects ); + virtual void FireBullets( int numbullets, Vector spread, int mindamage, int maxdamage, int dflags, int meansofdeath, qboolean server_effects ); + virtual void FireTracer( void ); + + public: + CLASS_PROTOTYPE( BulletWeapon ); + }; + +#endif /* BULLET.h */ diff --git a/source/source/fgame/camera.cpp b/source/source/fgame/camera.cpp new file mode 100644 index 0000000..3f9aafc --- /dev/null +++ b/source/source/fgame/camera.cpp @@ -0,0 +1,3829 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/camera.cpp $ +// $Revision:: 55 $ +// $Author:: Markd $ +// $Date:: 7/28/00 1:34a $ +// +// Copyright (C) 1997 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/camera.cpp $ +// +// 55 7/28/00 1:34a Markd +// fixed auto_fov bug +// +// 54 7/27/00 6:31p Markd +// made useAnim's work with doors, added key ability +// +// 53 7/19/00 6:18p Markd +// fixed potential camera fov bug +// +// 52 7/10/00 11:54p Markd +// added exit level code +// +// 51 7/10/00 8:35p Markd +// added camera tracing to orbit +// +// 50 7/07/00 1:45p Aldie +// Fixed a carriage return. +// +// 49 7/04/00 2:25p Markd +// added cool cinematic for new objects +// +// 48 6/29/00 9:27a Markd +// fixed camera with multiple automatic states +// +// 47 6/28/00 12:26p Markd +// fixed scoring on automatic cameras +// +// 46 6/28/00 12:23p Markd +// Added auto_active to cameras +// +// 45 6/23/00 8:41p Markd +// made a lot of changes to different constructors for saved game support +// +// 44 6/21/00 3:22p Markd +// Fixed camera bug +// +// 43 6/21/00 1:49p Markd +// fixed camera bug +// +// 42 6/14/00 3:50p Markd +// Cleaned up more Intel Compiler warnings +// +// 41 6/09/00 7:14p Markd +// fixed additional bind bug with cameras +// +// 40 6/09/00 6:55p Markd +// fixed camera being bound to other objects +// +// 39 5/26/00 7:44p Markd +// 2nd phase save games +// +// 38 5/08/00 5:53p Markd +// changed default start and stop time for auto cameras +// +// 37 5/02/00 10:50a Markd +// fixed camera start problem +// +// 36 5/01/00 7:13p Markd +// fixed camera nodes being executed at the right time +// +// 35 4/29/00 11:45a Markd +// fixed auto camera start and stop times +// +// 34 4/19/00 2:38p Markd +// Added auto_fov support to cameras +// +// 33 4/19/00 12:54p Markd +// put in auto_starttime and auto_stoptime support into auto cameras +// +// 32 4/11/00 2:46p Markd +// Implemented Automatic camera support +// +// 31 3/16/00 11:45a Markd +// fixed a camera iniatialization bug +// +// 30 3/15/00 2:32p Markd +// made the node connects duller +// +// 29 3/15/00 2:09p Markd +// forgot to take out debugging message +// +// 27 3/15/00 2:04p Markd +// fixed up camera node system and added new debug oriented circle +// +// 26 3/13/00 7:24p Jimdose +// put in error for when START_ON is set and no target specified +// +// 25 2/03/00 3:12p Markd +// Fixed up fadetimes for watches and fov and follow +// +// 24 2/01/00 5:40p Markd +// Fixed Camera cutting issues +// +// 23 1/26/00 9:53a Markd +// Changed FOV command to an fov command +// +// 22 1/06/00 4:39p Markd +// fixed tiki file name +// +// 21 1/05/00 7:25p Jimdose +// made angle functions all use the same coordinate system +// AngleVectors now returns left instead of right +// no longer need to invert pitch +// +// 20 12/21/99 4:35p Markd +// separated camera angles into three parts and fixed sliders +// +// 19 12/10/99 12:40p Markd +// fixed thread bug in camera system +// +// 18 12/03/99 9:48a Markd +// put in immediate camera cutting so that it wouldn't look funny +// +// 17 11/15/99 6:23p Markd +// fixed some comments +// +// 16 11/15/99 12:46p Markd +// Added LerpAnglesFromCurrent +// +// 15 11/10/99 1:46p Markd +// Fixed lerping code for watch State +// +// 14 11/09/99 8:30p Markd +// fixed nodes to node and also made sure that saving paths would add that path +// to the pathList +// +// 13 11/09/99 8:06p Markd +// Did a lot of work on the camera system +// +// 12 11/05/99 5:55p Markd +// Added user-interface to camera system +// +// 11 11/04/99 10:38a Markd +// Put in AngleMod on lerped angles to prevent weird interoplation issues +// +// 10 11/04/99 10:03a Markd +// complete overhaul of the camera system +// +// 9 10/29/99 7:04p Markd +// cleaned up some camera stuff +// +// 8 10/27/99 12:19p Markd +// added smooth camera lerping +// +// 7 10/07/99 2:59p Steven +// Event formatting. +// +// 6 10/07/99 11:27a Markd +// made camera fixed size +// +// 5 9/29/99 5:18p Steven +// Event formatting. +// +// 4 9/22/99 4:47p Markd +// fixed more G_GetEntity, G_FindClass and G_GetNextEntity bugs +// +// 3 9/21/99 7:51p Markd +// Fixed a lot of entitynum_none issues +// +// 2 9/16/99 11:18a Markd +// Continuing merge of code, not functional yet but closer +// +// 1 9/10/99 10:53a Jimdose +// +// 1 9/08/99 3:15p Aldie +// +// 26 9/01/99 9:41p Markd +// fixed camera speed +// +// 25 9/01/99 9:06p Jimdose +// fixed bug in DoNodeEvent. passed thread into ExecuteScript instead of +// node->thread +// +// 24 9/01/99 6:15p Jimdose +// added setthread command to camera. Threads are now started when camera +// reaches that node. +// now use triggertarget instead of target to store the name of the entity to +// trigger when camera reaches the node +// +// 23 8/19/99 12:15p Jimdose +// made SetCamera check for NULL before calling isSubclass +// +// 22 8/18/99 3:28p Jimdose +// added cylindrical collision detection +// +// 21 7/06/99 8:33p Jimdose +// removed unused player code +// added state machine for player animation +// +// 20 6/11/99 1:23p Phook +// +// 19 6/11/99 12:58p Phook +// Changed from SINED comments to QUAKED +// +// 18 6/11/99 12:46p Phook +// EClass color changes +// +// DESCRIPTION: +// Camera. Duh. +// + +#include "g_local.h" +#include "entity.h" +#include "trigger.h" +#include "camera.h" +#include "bspline.h" +#include "player.h" +#include "camera.h" + +#define CAMERA_PATHFILE_VERSION 1 + +CameraManager CameraMan; + +void CameraMoveState::Initialize( Camera * camera ) + { + assert( camera ); + pos = camera->origin; + angles = camera->angles; + movedir = vec_zero; + followEnt = NULL; + orbitEnt = NULL; + + followingpath = false; + cameraTime = 0; + lastTime = 0; + newTime = 0; + cameraPath.Clear(); + splinePath = NULL; + currentNode = NULL; + loopNode = NULL; + } + +void CameraWatchState::Initialize( Camera * camera ) + { + assert( camera ); + watchAngles = camera->angles; + watchEnt = NULL; + watchNodes = true; + watchPath = false; + } + +void CameraState::Initialize( Camera * camera ) + { + assert( camera ); + move.Initialize( camera ); + watch.Initialize( camera ); + fov = camera->Fov(); + } + +void CameraMoveState::DoNodeEvents + ( + Camera * camera + ) + + { + SplinePath *node; + Entity *ent; + Event *event; + + assert( camera ); + + node = currentNode; + if ( node ) + { + float fadeTime; + float newFov; + + fadeTime = node->GetFadeTime(); + if ( fadeTime == -1 ) + { + fadeTime = camera->fadeTime; + } + + if ( node->doWatch ) + { + camera->Watch( node->GetWatch(), fadeTime ); + } + + newFov = node->GetFov(); + if ( newFov ) + { + camera->SetFOV( newFov, fadeTime ); + } + + if ( node->thread != "" ) + { + if ( !ExecuteThread( node->thread ) ) + { + gi.Error( ERR_DROP, "Camera could not start thread '%s' from info_splinepath '%s'\n", + node->thread.c_str(), node->targetname.c_str() ); + } + } + + if ( node->triggertarget != "" ) + { + ent = NULL; + do + { + ent = G_FindTarget( ent, node->triggertarget.c_str() ); + if ( !ent ) + { + break; + } + event = new Event( EV_Activate ); + event->AddEntity( camera ); + ent->PostEvent( event, 0 ); + } + while ( 1 ); + } + } + } + +void CameraMoveState::Evaluate + ( + Camera * camera + ) + { + Vector oldpos; + float speed_multiplier; + + assert( camera ); + + oldpos = pos; + // + // check for node events + // we explicitly skip the first node because we process that + // when we begin the follow path command + // + if ( ( lastTime != newTime ) && currentNode ) + { + if ( newTime > 1 ) + { + DoNodeEvents( camera ); + } + currentNode = currentNode->GetNext(); + if ( !currentNode ) + { + currentNode = loopNode; + } + } + lastTime = newTime; + + // + // evaluate position + // + if ( followingpath ) + { + speed_multiplier = cameraPath.Eval( cameraTime, pos, angles ); + + cameraTime += level.fixedframetime * camera->camera_speed * speed_multiplier; + + if ( orbitEnt ) + { + pos += orbitEnt->origin; + if ( camera->orbit_dotrace ) + { + trace_t trace; + Vector start, back; + + start = orbitEnt->origin; + start[ 2 ] += orbitEnt->maxs[ 2 ]; + + back = start - pos; + back.normalize(); + + trace = G_Trace( start, vec_zero, vec_zero, pos, orbitEnt, camera->follow_mask, false, "Camera::EvaluatePosition" ); + + if ( trace.fraction < 1.0f ) + { + pos = trace.endpos; + // step in a bit towards the followEng + pos += back * 16; + } + } + } + } + else + { + if ( followEnt ) + { + trace_t trace; + Vector start, end, ang, back; + + start = followEnt->origin; + start[ 2 ] += followEnt->maxs[ 2 ]; + + if ( camera->follow_yaw_fixed ) + { + ang = vec_zero; + } + else + { + if ( followEnt->isSubclassOf( Player ) ) + { + Entity * ent; + ent = followEnt; + ( ( Player * )ent )->GetPlayerView( NULL, &ang ); + } + else + { + ang = followEnt->angles; + } + } + ang.y += camera->follow_yaw; + ang.AngleVectors( &back, NULL, NULL ); + + end = start - back * camera->follow_dist; + end[ 2 ] += 24; + + trace = G_Trace( start, vec_zero, vec_zero, end, followEnt, camera->follow_mask, false, "Camera::EvaluatePosition - Orbit" ); + + pos = trace.endpos; + // step in a bit towards the followEnt + pos += back * 16; + } + } + + // + // update times for node events + // + newTime = cameraTime + 2.0f; + + if ( newTime < 0 ) + { + newTime = 0; + } + // + // set movedir + // + movedir = pos - oldpos; + } + +void CameraWatchState::Evaluate + ( + Camera * camera, + CameraMoveState * move + ) + { + assert( camera ); + assert( move ); + // + // evaluate orientation + // + if ( watchEnt ) + { + Vector watchPos; + + + watchPos.x = watchEnt->origin.x; + watchPos.y = watchEnt->origin.y; + watchPos.z = watchEnt->absmax.z; + watchPos -= camera->origin; + watchPos.normalize(); + watchAngles = watchPos.toAngles(); + } + else if ( watchNodes ) + { + watchAngles = move->angles; + } + else if ( watchPath ) + { + float length; + Vector delta; + + delta = move->movedir; + length = delta.length(); + if ( length > 0.05f ) + { + delta *= 1.0f / length; + watchAngles = delta.toAngles(); + } + } + watchAngles[ 0 ] = AngleMod( watchAngles[ 0 ] ); + watchAngles[ 1 ] = AngleMod( watchAngles[ 1 ] ); + watchAngles[ 2 ] = AngleMod( watchAngles[ 2 ] ); + } + +void CameraState::Evaluate + ( + Camera * camera + ) + { + move.Evaluate( camera ); + watch.Evaluate( camera, &move ); + } + + +Event EV_Camera_CameraThink + ( + "camera_think", + EV_DEFAULT, + NULL, + NULL, + "Called each frame to allow the camera to adjust its position." + ); +Event EV_Camera_StartMoving + ( + "start", + EV_DEFAULT, + NULL, + NULL, + "Start camera moving." + ); +Event EV_Camera_Pause + ( + "pause", + EV_DEFAULT, + NULL, + NULL, + "Pause the camera." + ); +Event EV_Camera_Continue + ( + "continue", + EV_DEFAULT, + NULL, + NULL, + "Continue the camera movement." + ); +Event EV_Camera_StopMoving + ( "stop", + EV_CONSOLE, + NULL, + NULL, + "Stop the camera movement." + ); +Event EV_Camera_SetSpeed + ( + "speed", + EV_DEFAULT, + "f", + "speed", + "Sets the camera speed." + ); +Event EV_Camera_SetFOV + ( + "fov", + EV_CONSOLE, + "fF", + "fov fadeTime", + "Sets the camera's field of view (fov).\n" + "if fadeTime is specified, camera will fade over that time\n" + "if fov is less than 3, than an auto_fov will be assumed\n" + "the value of fov will be the ratio used for keeping a watch\n" + "entity in the view at the right scale" + ); + +// +// FOLLOW EVENTS +// +Event EV_Camera_Follow + ( + "follow", + EV_DEFAULT, + "eE", + "targetEnt targetWatchEnt", + "Makes the camera follow an entity and optionally watch an entity." + ); +Event EV_Camera_SetFollowDistance + ( + "follow_distance", + EV_DEFAULT, + "f", + "distance", + "Sets the camera follow distance." + ); +Event EV_Camera_SetFollowYaw + ( + "follow_yaw", + EV_DEFAULT, + "f", + "yaw", + "Sets the yaw offset of the camera following an entity." + ); +Event EV_Camera_AbsoluteYaw + ( + "follow_yaw_absolute", + EV_DEFAULT, + NULL, + NULL, + "Makes the follow camera yaw absolute." + ); +Event EV_Camera_RelativeYaw + ( + "follow_yaw_relative", + EV_DEFAULT, + NULL, + NULL, + "Makes the follow camera yaw relative (not absolute)." + ); + +// +// ORBIT Events +// +Event EV_Camera_Orbit + ( + "orbit", + EV_DEFAULT, + "eE", + "targetEnt targetWatchEnt", + "Makes the camera orbit around an entity and optionally watch an entity." + ); +Event EV_Camera_SetOrbitHeight + ( + "orbit_height", + EV_DEFAULT, + "f", + "height", + "Sets the orbit camera's height." + ); + +// +// Watch Events +// +Event EV_Camera_Watch + ( + "watch", + EV_CONSOLE, + "eF", + "watchEnt fadeTime", + "Makes the camera watch an entity.\n" + "if fadeTime is specified, camera will fade over that time" + ); +Event EV_Camera_WatchPath + ( + "watchpath", + EV_CONSOLE, + "F", + "fadeTime", + "Makes the camera look along the path of travel.\n" + "if fadeTime is specified, camera will fade over that time" + ); +Event EV_Camera_WatchNodes + ( + "watchnode", + EV_CONSOLE, + "F", + "fadeTime", + "Makes the camera watch based on what is stored\n" + "in the camera nodes.\n" + "if fadeTime is specified, camera will fade over that time" + ); +Event EV_Camera_NoWatch + ( + "nowatch", + EV_CONSOLE, + "F", + "fadeTime", + "Stop watching an entity or looking along a path.\n" + "Camera is now static as far as orientation.\n" + "if fadeTime is specified, camera will fade over that time" + ); + +// +// Camera positioning events +// +Event EV_Camera_LookAt + ( + "lookat", + EV_DEFAULT, + "e", + "ent", + "Makes the camera look at an entity." + ); +Event EV_Camera_TurnTo + ( + "turnto", + EV_DEFAULT, + "v", + "angle", + "Makes the camera look in the specified direction." + ); +Event EV_Camera_MoveToEntity + ( + "moveto", + EV_DEFAULT, + "e", + "ent", + "Move the camera's position to that of the specified entities." + ); +Event EV_Camera_MoveToPos + ( + "movetopos", + EV_DEFAULT, + "v", + "position", + "Move the camera's position to the specified position." + ); + +// +// Camera Transitioning events +// +Event EV_Camera_FadeTime + ( + "fadetime", + EV_DEFAULT, + "f", + "fadetime", + "Sets the fade time for camera transitioning." + ); +Event EV_Camera_Cut + ( + "cut", + EV_DEFAULT, + NULL, + NULL, + "switch camera states immediately, do not transition" + ); +Event EV_Camera_SetNextCamera + ( + "nextcamera", + EV_DEFAULT, + "s", + "nextCamera", + "Sets the next camera to use." + ); + +Event EV_Camera_SetAutoState + ( + "auto_state", + EV_DEFAULT, + "sSSSSS", + "state1 state2 state3 state4 state5 state6", + "Sets the states the player needs to be in for this camera to activate." + ); + +Event EV_Camera_SetAutoRadius + ( + "auto_radius", + EV_DEFAULT, + "f", + "newRadius", + "Sets the radius of the automatic camera." + ); + +Event EV_Camera_SetAutoActive + ( + "auto_active", + EV_DEFAULT, + "b", + "newActiveState", + "Whether or not the auto camera is active." + ); + +Event EV_Camera_SetAutoStartTime + ( + "auto_starttime", + EV_DEFAULT, + "f", + "newTime", + "Sets how long it takes for the camera to be switched to." + ); + +Event EV_Camera_SetAutoStopTime + ( + "auto_stoptime", + EV_DEFAULT, + "f", + "newTime", + "Sets how long it takes for the camera switch back to the player." + ); + +Event EV_Camera_SetMaximumAutoFOV + ( + "auto_maxfov", + EV_DEFAULT, + "f", + "maxFOV", + "Sets the maximum FOV that should be used when automatically calculating FOV." + ); + +// +// general setup functions +// +Event EV_Camera_SetThread + ( + "setthread", + EV_CONSOLE, + "s", + "thread", + "Sets the thread to use." + ); +Event EV_Camera_SetThread2 + ( + "thread", + EV_DEFAULT, + "s", + "thread", + "Sets the thread to use." + ); + +Event EV_Camera_SetupCamera + ( + "_setupcamera", + EV_DEFAULT, + NULL, + NULL, + "setup the camera, post spawn." + ); + +/*****************************************************************************/ +/* func_camera (0 0.25 0.5) (-8 -8 0) (8 8 16) ORBIT START_ON AUTOMATIC NO_TRACE NO_WATCH LEVEL_EXIT + +Camera used for cinematic sequences. + +"target" points to the target to orbit or follow. If it points to a path, +the camera will follow the path. +"speed" specifies how fast to move on the path or orbit. (default 1). +"fov" specifies fov of camera, default 90. +if fov is less than 3 than an auto-fov feature is assumed. The fov will then +specify the ratio to be used to keep a watched entity zoomed in and on the screen +"follow_yaw" specifies yaw of the follow camera, default 0. +"follow_distance" the distance to follow or orbit if the target is not a path. (default 128). +"orbit_height" specifies height of camera from origin for orbiting, default 128. +"nextcamera" a link to the next camera in a chain of cameras +"thread" a thread label that will be fired when the camera is looked through +"auto_state" if specified, denotes the state the player must be in for the camera to engage +any number of states can be specified and only the first few letters need be specified as well +a state of 'pipe' would mean that any player state that started with 'pipe' would trigger this +camera +"auto_radius" the radius, in which the camera will automatically turn on (default 512) +"auto_starttime" how long it takes for the camera to be switched to (default 0.2) +"auto_stoptime" how long it takes for the camera to switch back to the player (default 0.2) +"auto_maxfov" Sets the maximum FOV that should be used when automatically calculating FOV. (default 90) + +ORBIT tells the camera to create a circular path around the object it points to. +It the camera points to a path, it will loop when it gets to the end of the path. +START_ON causes the camera to be moving as soon as it is spawned. +AUTOMATIC causes the camera to be switched to automatically when the player is within +a certain radius, if "thread" is specified, that thread will be triggered when the camers is activated +NO_TRACE when the camera is in automatic mode, it will try to trace to the player before +switching automatically, this turns off that feature +NO_WATCH if this is an automatic camera, the camera will automatically watch the player +unless this is set, camera's "score" will be affected by how close to the middle of the camera +the player is. +LEVEL_EXIT if the camera is being used, the level exit state will be set + +******************************************************************************/ + +CLASS_DECLARATION( Entity, Camera, "func_camera" ) + { + { &EV_Camera_CameraThink, CameraThink }, + { &EV_Activate, StartMoving }, + { &EV_Camera_StartMoving, StartMoving }, + { &EV_Camera_StopMoving, StopMoving }, + { &EV_Camera_Pause, Pause }, + { &EV_Camera_Continue, Continue }, + { &EV_Camera_SetSpeed, SetSpeed }, + { &EV_Camera_SetFollowDistance,SetFollowDistance }, + { &EV_Camera_SetFollowYaw, SetFollowYaw }, + { &EV_Camera_AbsoluteYaw, AbsoluteYaw }, + { &EV_Camera_RelativeYaw, RelativeYaw }, + { &EV_Camera_SetOrbitHeight, SetOrbitHeight }, + { &EV_Camera_SetFOV, SetFOV }, + { &EV_Camera_Orbit, OrbitEvent }, + { &EV_Camera_Follow, FollowEvent }, + { &EV_Camera_Watch, WatchEvent }, + { &EV_Camera_WatchPath, WatchPathEvent }, + { &EV_Camera_WatchNodes, WatchNodesEvent }, + { &EV_Camera_NoWatch, NoWatchEvent }, + { &EV_Camera_LookAt, LookAt }, + { &EV_Camera_TurnTo, TurnTo }, + { &EV_Camera_MoveToEntity, MoveToEntity }, + { &EV_Camera_MoveToPos, MoveToPos }, + { &EV_Camera_Cut, Cut }, + { &EV_Camera_FadeTime, FadeTime }, + { &EV_Camera_SetNextCamera, SetNextCamera }, + { &EV_Camera_SetThread, SetThread }, + { &EV_Camera_SetThread2, SetThread }, + { &EV_Camera_SetupCamera, SetupCamera }, + { &EV_SetAngles, SetAnglesEvent }, + { &EV_Camera_SetAutoState, SetAutoStateEvent }, + { &EV_Camera_SetAutoRadius, SetAutoRadiusEvent }, + { &EV_Camera_SetAutoStartTime, SetAutoStartTimeEvent }, + { &EV_Camera_SetAutoStopTime, SetAutoStopTimeEvent }, + { &EV_Camera_SetMaximumAutoFOV, SetMaximumAutoFOVEvent }, + { &EV_Camera_SetAutoActive, SetAutoActiveEvent }, + + { NULL, NULL } + }; + +Camera::Camera() + { + Vector ang; + + camera_fov = 90; + camera_speed = 1; + orbit_height = 128; + orbit_dotrace = qtrue; + follow_yaw = 0; + follow_yaw_fixed = false; + follow_dist = 128; + follow_mask = MASK_SOLID; + auto_fov = 0; + automatic_maxFOV = 90; + + watchTime = 0; + followTime = 0; + fovTime = 0; + + fadeTime = 2.0f; + + setSolidType( SOLID_NOT ); + setMoveType( MOVETYPE_NONE ); + + showcamera = sv_showcameras->integer; + if ( showcamera ) + { + setModel( "func_camera.tik" ); + showModel(); + } + else + { + hideModel(); + } + + automatic_active = qtrue; + automatic_radius = 512; + automatic_states.ClearObjectList(); + automatic_startTime = 0.7f; + automatic_stopTime = 0.7f; + + if ( !LoadingSavegame ) + { + PostEvent( EV_Camera_SetupCamera, EV_POSTSPAWN ); + } + } + +void Camera::SetupCamera + ( + Event *ev + ) + + { + currentstate.Initialize( this ); + newstate.Initialize( this ); + + if ( spawnflags & START_ON ) + { + PostEvent( EV_Camera_StartMoving, 0 ); + } + if ( spawnflags & AUTOMATIC ) + { + level.AddAutomaticCamera( this ); + } + } + +qboolean Camera::IsAutomatic + ( + void + ) + { + return ( spawnflags & AUTOMATIC ); + } + +qboolean Camera::IsLevelExit + ( + void + ) + { + return ( spawnflags & LEVEL_EXIT ); + } + +float Camera::CalculateScore + ( + Entity * player, + str state + ) + { + int i; + float range; + float score; + qboolean found; + + if ( !automatic_active ) + { + return 10; + } + + range = Vector( player->origin - origin ).length() / automatic_radius; + // bias the range so that we don't immediately jump out of the camera if we are out of range + range -= 0.1f; + + score = range; + + // + // early exit if our score exceeds 1 + // + if ( score > 1.0f ) + return score; + + // find out if we match a state + found = qfalse; + for( i = 1; i <= automatic_states.NumObjects(); i++ ) + { + str *auto_state; + + auto_state = &automatic_states.ObjectAt( i ); + if ( !state.icmpn( state, auto_state->c_str(), auto_state->length() ) ) + { + found = qtrue; + break; + } + } + + // if we are comparing states and we haven't found a valid one... + if ( automatic_states.NumObjects() && !found ) + { + // if we aren't in the right state, push our score out significantly + score += 2.0f; + return score; + } + + // perform a trace to the player if necessary + if ( !( spawnflags & NO_TRACE ) && !( spawnflags & NO_WATCH ) ) + { + trace_t trace; + + trace = G_Trace( origin, vec_zero, vec_zero, player->centroid, player, follow_mask, false, "Camera::CalculateScore" ); + if ( trace.startsolid || trace.allsolid || trace.fraction < 1.0f ) + { + // if we are blocked, push our score out, but not too much since this may be a temporary thing + if ( trace.startsolid || trace.allsolid ) + { + score += 2.0f; + return score; + } + else + { + score += 1.0f - trace.fraction; + } + } + } + + // perform a dot product test for no watch cameras + if ( spawnflags & NO_WATCH ) + { + trace_t trace; + float limit; + float threshold; + float dot; + Vector dir; + + dir = player->centroid - origin; + dir.normalize(); + dot = dir * orientation[ 0 ]; + + threshold = cos( DEG2RAD( ( camera_fov * 0.25f ) ) ); + if ( dot <= threshold ) + { + limit = cos( DEG2RAD( ( camera_fov * 0.45f ) ) ); + if ( dot <= limit ) + { + // we are outside the viewing cone + score += 2.0f; + return score; + } + else + { + // our score is a scale between the two values + score += ( threshold - dot ) / ( limit ); + } + } + + trace = G_Trace( origin, vec_zero, vec_zero, player->origin, player, follow_mask, false, "Camera::CalculateScore" ); + if ( trace.startsolid || trace.allsolid || trace.fraction < 1.0f ) + { + // if we are blocked, push our score out, but not too much since this may be a temporary thing + if ( trace.startsolid || trace.allsolid ) + { + score += 2.0f; + return score; + } + else + { + score += 1.0f - trace.fraction; + } + } + } + + return score; + } + +float Camera::AutomaticStart + ( + Entity * player + ) + { + if ( !( spawnflags & NO_WATCH ) && player ) + { + Watch( player, 0 ); + Cut( NULL ); + } + + if ( thread.length() ) + { + ExecuteThread( thread ); + } + + return automatic_startTime; + } + +float Camera::AutomaticStop + ( + Entity * player + ) + { + Stop(); + return automatic_stopTime; + } + +void Camera::UpdateStates + ( + void + ) + + { + if ( followTime && watchTime ) + { + newstate.Evaluate( this ); + } + else if ( watchTime ) + { + newstate.watch.Evaluate( this, ¤tstate.move ); + } + else if ( followTime ) + { + newstate.move.Evaluate( this ); + } + currentstate.Evaluate( this ); + } + + +Vector Camera::CalculatePosition + ( + void + ) + + { + int i; + float t; + Vector pos; + + // + // calcualte position + // + if ( followTime ) + { + t = followTime - level.time; + // + // are we still fading? + // + if ( t <= 0 ) + { + // + // if not zero out the fade + // + t = 0; + currentstate.move = newstate.move; + newstate.move.Initialize( this ); + followTime = 0; + pos = currentstate.move.pos; + } + else + { + // + // if we are lerp over followFadeTime + // + t = ( followFadeTime - t ) / followFadeTime; + + for ( i = 0; i < 3; i++ ) + { + pos[ i ] = currentstate.move.pos[ i ] + ( t * ( newstate.move.pos[ i ] - currentstate.move.pos[ i ] ) ); + } + } + } + else + { + pos = currentstate.move.pos; + } + + return pos; + } + + +Vector Camera::CalculateOrientation + ( + void + ) + + { + int i; + float t; + Vector ang; + + // + // calculate orientation + // + if ( watchTime ) + { + t = watchTime - level.time; + // + // are we still fading? + // + if ( t <= 0 ) + { + // + // if not zero out the fade + // + t = 0; + currentstate.watch = newstate.watch; + newstate.watch.Initialize( this ); + watchTime = 0; + ang = currentstate.watch.watchAngles; + } + else + { + t = ( watchFadeTime - t ) / watchFadeTime; + + for ( i=0; i<3; i++ ) + { + ang[ i ] = LerpAngleFromCurrent + ( + currentstate.watch.watchAngles[ i ], + newstate.watch.watchAngles[ i ], + this->angles[ i ], + t + ); + } + /* + warning("", "%.2f a x%.0f y%.0f z%.0f c x%.0f y%.0f z%.0f n x%.0f y%.0f z%.0f\n", + t, + ang[ 0 ], + ang[ 1 ], + ang[ 2 ], + currentstate.watch.watchAngles[ 0 ], + currentstate.watch.watchAngles[ 1 ], + currentstate.watch.watchAngles[ 2 ], + newstate.watch.watchAngles[ 0 ], + newstate.watch.watchAngles[ 1 ], + newstate.watch.watchAngles[ 2 ] + ); + */ + } + } + else + { + ang = currentstate.watch.watchAngles; + } + + return ang; + } + +float Camera::CalculateFov + ( + void + ) + + { + float fov; + float t; + + // + // calculate fov + // + // check if we have an auto_fov + if ( auto_fov > 0 ) + { + if ( currentstate.watch.watchEnt ) + { + float distance; + float size; + float new_fov; + Entity * ent; + + ent = currentstate.watch.watchEnt; + size = ent->maxs[ 2 ] - ent->mins[ 2 ]; + size = ent->edict->radius / 2; + // cap the size + if ( size < 16 ) + size = 16; + distance = Vector( ent->centroid - origin ).length(); + new_fov = RAD2DEG( 2.0f * atan2( size, distance * auto_fov ) ); + if ( new_fov > automatic_maxFOV ) + new_fov = automatic_maxFOV; + else if ( new_fov < 5 ) + new_fov = 5; + return new_fov; + } + else + { + return 90; + } + } + // if we get here, we don't have an auto_fov, or we have an invalid watch target + if ( fovTime ) + { + t = fovTime - level.time; + // + // are we still fading? + // + if ( t <= 0 ) + { + // + // if not zero out the fade + // + t = 0; + currentstate.fov = newstate.fov; + fovTime = 0; + fov = currentstate.fov; + } + else + { + // + // if we are lerp over fovFadeTime + // + t = ( fovFadeTime - t ) / fovFadeTime; + fov = currentstate.fov + ( t * ( newstate.fov - currentstate.fov ) ); + } + } + else + { + fov = currentstate.fov; + } + + return fov; + } + +void Camera::CameraThink + ( + Event *ev + ) + + { + UpdateStates(); + + setOrigin( CalculatePosition() ); + setAngles( CalculateOrientation() ); + camera_fov = CalculateFov(); + + // + // debug info + // + if ( sv_showcameras->integer != showcamera ) + { + showcamera = sv_showcameras->integer; + if ( showcamera ) + { + setModel( "func_camera.tik" ); + showModel(); + } + else + { + hideModel(); + } + } + + if ( sv_showcameras->integer != showcamera ) + { + showcamera = sv_showcameras->integer; + if ( showcamera ) + { + setModel( "func_camera.tik" ); + showModel(); + } + else + { + hideModel(); + } + } + if ( showcamera && currentstate.move.followingpath ) + { + G_Color3f( 1, 1, 0 ); + if ( currentstate.move.orbitEnt ) + { + currentstate.move.cameraPath.DrawCurve( currentstate.move.orbitEnt->origin, 10 ); + } + else + { + currentstate.move.cameraPath.DrawCurve( 10 ); + } + } + + CancelEventsOfType( EV_Camera_CameraThink ); + PostEvent( EV_Camera_CameraThink, FRAMETIME ); + } + +void Camera::LookAt + ( + Event *ev + ) + + { + Vector pos, delta; + Entity * ent; + + ent = ev->GetEntity( 1 ); + + if ( !ent ) + return; + + pos.x = ent->origin.x; + pos.y = ent->origin.y; + pos.z = ent->absmax.z; + delta = pos - origin; + delta.normalize(); + + currentstate.watch.watchAngles = delta.toAngles(); + setAngles( currentstate.watch.watchAngles ); + } + +void Camera::TurnTo + ( + Event *ev + ) + + { + currentstate.watch.watchAngles = ev->GetVector( 1 ); + setAngles( currentstate.watch.watchAngles ); + } + +void Camera::MoveToEntity + ( + Event *ev + ) + + { + Entity * ent; + + ent = ev->GetEntity( 1 ); + if ( ent ) + currentstate.move.pos = ent->origin; + setOrigin( currentstate.move.pos ); + } + +void Camera::MoveToPos + ( + Event *ev + ) + + { + currentstate.move.pos = ev->GetVector( 1 ); + setOrigin( currentstate.move.pos ); + } + +void Camera::Stop + ( + void + ) + + { + if ( followTime ) + { + currentstate.move = newstate.move; + newstate.move.Initialize( this ); + } + if ( watchTime ) + { + currentstate.watch = newstate.watch; + newstate.watch.Initialize( this ); + } + CancelEventsOfType( EV_Camera_CameraThink ); + + watchTime = 0; + followTime = 0; + } + +void Camera::CreateOrbit + ( + Vector pos, + float radius, + Vector &forward, + Vector &left + ) + + { + newstate.move.cameraPath.Clear(); + newstate.move.cameraPath.SetType( SPLINE_LOOP ); + + newstate.move.cameraPath.AppendControlPoint( pos + radius * forward ); + newstate.move.cameraPath.AppendControlPoint( pos + radius * left ); + newstate.move.cameraPath.AppendControlPoint( pos - radius * forward ); + newstate.move.cameraPath.AppendControlPoint( pos - radius * left ); + } + +void Camera::CreatePath + ( + SplinePath *path, + splinetype_t type + ) + + { + SplinePath *node; + SplinePath *loop; + + newstate.move.cameraPath.Clear(); + newstate.move.cameraPath.SetType( type ); + + newstate.move.splinePath = path; + newstate.move.currentNode = path; + newstate.move.loopNode = NULL; + + node = path; + while( node != NULL ) + { + newstate.move.cameraPath.AppendControlPoint( node->origin, node->angles, node->speed ); + loop = node->GetLoop(); + if ( loop && ( type == SPLINE_LOOP ) ) + { + newstate.move.loopNode = loop; + newstate.move.cameraPath.SetLoopPoint( loop->origin ); + } + node = node->GetNext(); + + if ( node == path ) + { + break; + } + } + + if ( ( type == SPLINE_LOOP ) && ( !newstate.move.loopNode ) ) + { + newstate.move.loopNode = path; + } + } + +void Camera::FollowPath + ( + SplinePath *path, + qboolean loop, + Entity * watch + ) + + { + // make sure we process any setup events before continuing + ProcessPendingEvents(); + + Stop(); + if ( loop ) + { + CreatePath( path, SPLINE_LOOP ); + } + else + { + CreatePath( path, SPLINE_CLAMP ); + } + + newstate.move.cameraTime = -2; + newstate.move.lastTime = 0; + newstate.move.newTime = 0; + newstate.move.currentNode = path; + // evaluate the first node events + newstate.move.DoNodeEvents( this ); + + if ( watch ) + { + newstate.watch.watchEnt = watch; + } + else + { + Watch( newstate.move.currentNode->GetWatch(), newstate.move.currentNode->GetFadeTime() ); + } + + followFadeTime = fadeTime; + watchFadeTime = fadeTime; + + newstate.move.followingpath = true; + followTime = level.time + followFadeTime; + watchTime = level.time + watchFadeTime; + + PostEvent( EV_Camera_CameraThink, FRAMETIME ); + } + +void Camera::Orbit + ( + Entity *ent, + float dist, + Entity *watch, + float yaw_offset, + qboolean dotrace + ) + + { + Vector ang, forward, left; + + // make sure we process any setup events before continuing + ProcessPendingEvents(); + + Stop(); + + if ( watch ) + { + ang = watch->angles; + ang.y += yaw_offset; + } + else + { + ang = vec_zero; + ang.y += yaw_offset; + } + ang.AngleVectors( &forward, &left, NULL ); + + orbit_dotrace = dotrace; + + CreateOrbit( Vector( 0, 0, orbit_height ), dist, forward, left ); + newstate.move.cameraTime = -2; + newstate.move.lastTime = 0; + newstate.move.newTime = 0; + + newstate.move.orbitEnt = ent; + + followFadeTime = fadeTime; + watchFadeTime = fadeTime; + + newstate.move.followingpath = true; + followTime = level.time + followFadeTime; + watchTime = level.time + watchFadeTime; + newstate.move.currentNode = NULL; + + if ( watch ) + { + newstate.watch.watchEnt = watch; + } + else + { + newstate.watch.watchEnt = ent; + } + + PostEvent( EV_Camera_CameraThink, FRAMETIME ); + } + +void Camera::FollowEntity + ( + Entity *ent, + float dist, + int mask, + Entity *watch + ) + + { + // make sure we process any setup events before continuing + ProcessPendingEvents(); + + assert( ent ); + + Stop(); + + if ( ent ) + { + newstate.move.followEnt = ent; + newstate.move.followingpath = false; + + followFadeTime = fadeTime; + watchFadeTime = fadeTime; + + newstate.move.cameraTime = -2; + newstate.move.lastTime = 0; + newstate.move.newTime = 0; + newstate.move.currentNode = NULL; + + followTime = level.time + followFadeTime; + watchTime = level.time + watchFadeTime; + if ( watch ) + { + newstate.watch.watchEnt = watch; + } + else + { + newstate.watch.watchEnt = ent; + } + follow_dist = dist; + follow_mask = mask; + PostEvent( EV_Camera_CameraThink, 0 ); + } + } + +void Camera::StartMoving + ( + Event *ev + ) + + { + Entity *targetEnt; + Entity *targetWatchEnt; + Entity *ent; + SplinePath *path; + + if ( ev->NumArgs() > 0 ) + { + targetEnt = ev->GetEntity( 1 ); + } + else + { + targetEnt = NULL; + } + + if ( ev->NumArgs() > 1 ) + { + targetWatchEnt = ev->GetEntity( 2 ); + } + else + { + targetWatchEnt = NULL; + } + + if ( ( spawnflags & START_ON ) && ( !Q_stricmp( Target(), "" ) ) ) + { + gi.Error( ERR_DROP, "Camera '%s' with START_ON selected, but no target specified.", TargetName() ); + } + + if ( !targetEnt ) + { + ent = G_FindTarget( NULL, Target() ); + if ( !ent ) + { + // + // we took this out just because of too many warnings, oh well + //warning("StartMoving", "Can't find target for camera\n" ); + // + // I put it back in as an error. Fuck em! Yeeeeeha! + // + gi.Error( ERR_DROP, "Can't find target '%s' for camera\n", Target() ); + return; + } + } + else + { + ent = targetEnt; + } + + if ( ent->isSubclassOf( SplinePath ) ) + { + path = ( SplinePath * )ent; + FollowPath( path, spawnflags & ORBIT, targetWatchEnt ); + } + else + { + if ( spawnflags & ORBIT ) + { + Orbit( ent, follow_dist, targetWatchEnt ); + } + else + { + FollowEntity( ent, follow_dist, follow_mask, targetWatchEnt ); + } + } + } + +void Camera::SetAutoStateEvent + ( + Event *ev + ) + + { + int i; + + for( i = 1; i <= ev->NumArgs(); i++ ) + { + char *buffer; + char com_token[ MAX_QPATH ]; + char com_buffer[MAX_STRING_CHARS]; + + strcpy( com_buffer, ev->GetString( i ) ); + buffer = com_buffer; + // get the rest of the line + while( 1 ) + { + strcpy( com_token, COM_ParseExt( &buffer, qfalse ) ); + if (!com_token[0]) + break; + + automatic_states.AddUniqueObject( str( com_token ) ); + } + } + } + +void Camera::SetMaximumAutoFOVEvent + ( + Event *ev + ) + + { + automatic_maxFOV = ev->GetFloat( 1 ); + } + +void Camera::SetAutoRadiusEvent + ( + Event *ev + ) + + { + automatic_radius = ev->GetFloat( 1 ); + } + +void Camera::SetAutoActiveEvent + ( + Event *ev + ) + + { + automatic_active = ev->GetBoolean( 1 ); + } + +void Camera::SetAutoStartTimeEvent + ( + Event *ev + ) + + { + automatic_startTime = ev->GetFloat( 1 ); + } + +void Camera::SetAutoStopTimeEvent + ( + Event *ev + ) + + { + automatic_stopTime = ev->GetFloat( 1 ); + } + + +void Camera::StopMoving + ( + Event *ev + ) + + { + Stop(); + } + +void Camera::Pause + ( + Event *ev + ) + + { + CancelEventsOfType( EV_Camera_CameraThink ); + } + +void Camera::Continue + ( + Event *ev + ) + + { + CancelEventsOfType( EV_Camera_CameraThink ); + PostEvent( EV_Camera_CameraThink, 0 ); + } + +void Camera::SetAnglesEvent + ( + Event *ev + ) + + { + Vector ang; + + ang = ev->GetVector( 1 ); + setAngles( ang ); + } + +void Camera::SetSpeed + ( + Event *ev + ) + + { + camera_speed = ev->GetFloat( 1 ); + } + +void Camera::SetFollowDistance + ( + Event *ev + ) + + { + follow_dist = ev->GetFloat( 1 ); + } + +void Camera::SetOrbitHeight + ( + float height + ) + + { + orbit_height = height; + } + +void Camera::SetOrbitHeight + ( + Event *ev + ) + + { + orbit_height = ev->GetFloat( 1 ); + } + +void Camera::SetFollowYaw + ( + Event *ev + ) + + { + follow_yaw = ev->GetFloat( 1 ); + } + +void Camera::AbsoluteYaw + ( + Event *ev + ) + + { + follow_yaw_fixed = true; + } + +void Camera::RelativeYaw + ( + Event *ev + ) + + { + follow_yaw_fixed = false; + } + +void Camera::SetNextCamera + ( + Event *ev + ) + + { + nextCamera = ev->GetString( 1 ); + } + +void Camera::Cut + ( + Event *ev + ) + { + int j; + + if ( followTime ) + { + currentstate.move = newstate.move; + newstate.move.Initialize( this ); + followTime = 0; + } + if ( watchTime ) + { + currentstate.watch = newstate.watch; + newstate.watch.Initialize( this ); + watchTime = 0; + } + if ( fovTime ) + { + currentstate.fov = newstate.fov; + newstate.fov = camera_fov; + fovTime = 0; + } + CancelEventsOfType( EV_Camera_CameraThink ); + ProcessEvent( EV_Camera_CameraThink ); + + // + // let any clients know that this camera has just cut + // + for( j = 0; j < game.maxclients; j++ ) + { + gentity_t *other; + Player *client; + + other = &g_entities[ j ]; + if ( other->inuse && other->client ) + { + client = ( Player * )other->entity; + client->CameraCut( this ); + } + } + } + +void Camera::FadeTime + ( + Event *ev + ) + + { + fadeTime = ev->GetFloat( 1 ); + } + +void Camera::OrbitEvent + ( + Event *ev + ) + + { + Entity *ent; + + spawnflags |= ORBIT; + ent = ev->GetEntity( 1 ); + if ( ent ) + { + Event * event; + + event = new Event( EV_Camera_StartMoving ); + event->AddEntity( ent ); + if ( ev->NumArgs() > 1 ) + { + event->AddEntity( ev->GetEntity( 2 ) ); + } + Stop(); + ProcessEvent( event ); + } + } + +void Camera::FollowEvent + ( + Event *ev + ) + + { + Entity *ent; + + spawnflags &= ~ORBIT; + ent = ev->GetEntity( 1 ); + if ( ent ) + { + Event * event; + + event = new Event( EV_Camera_StartMoving ); + event->AddEntity( ent ); + if ( ev->NumArgs() > 1 ) + { + event->AddEntity( ev->GetEntity( 2 ) ); + } + Stop(); + ProcessEvent( event ); + } + } + +void Camera::SetFOV + ( + Event *ev + ) + + { + float time; + + if ( ev->NumArgs() > 1 ) + { + time = ev->GetFloat( 2 ); + } + else + { + time = fadeTime; + } + + SetFOV( ev->GetFloat( 1 ), time ); + } + +void Camera::WatchEvent + ( + Event *ev + ) + + { + float time; + + if ( ev->NumArgs() > 1 ) + { + time = ev->GetFloat( 2 ); + } + else + { + time = fadeTime; + } + + Watch( ev->GetString( 1 ), time ); + } + +Entity * GetWatchEntity + ( + str watch + ) + + { + const char *name; + Entity * ent; + + // + // if empty just return + // + if ( watch == "" ) + { + return NULL; + } + + // + // ignore all the reserved words + // + if ( + ( watch == "path" ) || + ( watch == "none" ) || + ( watch == "node" ) + ) + { + return NULL; + } + + name = watch.c_str(); + + if ( name[ 0 ] == '*' ) + { + if ( !IsNumeric( &name[ 1 ] ) ) + { + gi.DPrintf( "GetWatchEntity :: Expecting a numeric value but found '%s'.", &name[ 1 ] ); + return NULL; + } + else + { + ent = G_GetEntity( atoi( &name[ 1 ] ) ); + if ( !ent ) + { + gi.DPrintf( "GetWatchEntity :: Entity with targetname of '%s' not found", &name[ 1 ] ); + return NULL; + } + } + } + else if ( name[ 0 ] == '$' ) + { + ent = G_FindTarget( NULL, &name[ 1 ] ); + if ( !ent ) + { + gi.DPrintf( "GetWatchEntity :: Entity with targetname of '%s' not found", &name[ 1 ] ); + return NULL; + } + } + else + { + gi.DPrintf( "GetWatchEntity :: Entity with targetname of '%s' not found", name ); + return NULL; + } + + return ent; + } + +void Camera::Watch + ( + str watch, + float time + ) + + { + // make sure we process any setup events before continuing + ProcessPendingEvents(); + + // + // if empty just return + // + if ( watch == "" ) + return; + + // + // clear out the watch variables + // + watchFadeTime = time; + newstate.watch.watchPath = false; + newstate.watch.watchNodes = false; + newstate.watch.watchEnt = NULL; + watchTime = level.time + watchFadeTime; + // + // really a watchpath command + // + if ( watch == "path" ) + { + newstate.watch.watchPath = true; + } + // + // really a watchnodes command + // + else if ( watch == "node" ) + { + newstate.watch.watchNodes = true; + } + // + // really a watchnodes command + // + else if ( watch == "none" ) + { + // intentionally blank + } + // + // just a normal watch command + // + else + { + Entity * ent = GetWatchEntity( watch ); + newstate.watch.watchEnt = ent; + } + } + +void Camera::Watch + ( + Entity * ent, + float time + ) + + { + // + // clear out the watch variables + // + watchFadeTime = time; + newstate.watch.watchPath = false; + newstate.watch.watchNodes = false; + watchTime = level.time + watchFadeTime; + newstate.watch.watchEnt = ent; + } + + +void Camera::SetFOV + ( + float fov, + float time + ) + + { + // if it is less than 3, then we are setting an auto_fov state + if ( fov < 3 ) + { + auto_fov = fov; + } + else + { + // if we are explicitly setting the fov, turn the auto_fov off + auto_fov = 0; + + fovFadeTime = time; + fovTime = level.time + fovFadeTime; + currentstate.fov = newstate.fov; + newstate.fov = fov; + } + } + +void Camera::WatchPathEvent + ( + Event *ev + ) + + { + if ( ev->NumArgs() > 1 ) + { + watchFadeTime = ev->GetFloat( 2 ); + } + else + { + watchFadeTime = fadeTime; + } + + watchTime = level.time + watchFadeTime; + newstate.watch.watchEnt = NULL; + newstate.watch.watchNodes = false; + newstate.watch.watchPath = true; + } + +void Camera::WatchNodesEvent + ( + Event *ev + ) + + { + if ( ev->NumArgs() > 1 ) + { + watchFadeTime = ev->GetFloat( 2 ); + } + else + { + watchFadeTime = fadeTime; + } + watchTime = level.time + watchFadeTime; + newstate.watch.watchEnt = NULL; + newstate.watch.watchPath = false; + newstate.watch.watchNodes = true; + } + +void Camera::NoWatchEvent + ( + Event *ev + ) + + { + if ( ev->NumArgs() > 1 ) + { + watchFadeTime = ev->GetFloat( 2 ); + } + else + { + watchFadeTime = fadeTime; + } + watchTime = level.time + watchFadeTime; + newstate.watch.watchEnt = NULL; + newstate.watch.watchPath = false; + newstate.watch.watchNodes = false; + } + +void SetCamera + ( + Entity *ent, + float switchTime + ) + + { + int j; + gentity_t *other; + Camera *cam; + Player *client; + + if ( ent && !ent->isSubclassOf( Camera ) ) + { + return; + } + + cam = ( Camera * )ent; + for( j = 0; j < game.maxclients; j++ ) + { + other = &g_entities[ j ]; + if ( other->inuse && other->client ) + { + client = ( Player * )other->entity; + client->SetCamera( cam, switchTime ); + } + } + } + +str &Camera::NextCamera + ( + void + ) + + { + return nextCamera; + } + +void Camera::SetThread + ( + Event *ev + ) + + { + thread = ev->GetString( 1 ); + } + +str &Camera::Thread + ( + void + ) + + { + return thread; + } + +float Camera::Fov + ( + void + ) + + { + return camera_fov; + } + +void Camera::Reset + ( + Vector org, + Vector ang + ) + + { + setOrigin( org ); + setAngles( ang ); + currentstate.Initialize( this ); + newstate.Initialize( this ); + } + +void Camera::bind + ( + Entity *master, + qboolean use_my_angles + ) + + { + Entity::bind( master, use_my_angles ); + + currentstate.move.pos = localorigin; + } + +void Camera::unbind + ( + void + ) + + { + Entity::unbind(); + + currentstate.move.pos = origin; + } + + +/****************************************************************************** + + Camera Manager + +******************************************************************************/ + +Event EV_CameraManager_NewPath + ( + "new", + EV_CONSOLE, + NULL, + NULL, + "Starts a new path." + ); +Event EV_CameraManager_SetPath + ( + "setpath", + EV_CONSOLE, + "e", + "path", + "Sets the new path." + ); +Event EV_CameraManager_SetTargetName + ( + "settargetname", + EV_CONSOLE, + "s", + "targetname", + "Set the targetname." + ); +Event EV_CameraManager_SetTarget + ( + "settarget", + EV_CONSOLE, + "s", + "target", + "Set the trigger target." + ); +Event EV_CameraManager_AddPoint + ( + "add", + EV_CONSOLE, + NULL, + NULL, + "Add a new point to the camera path where the player is standing." + ); +Event EV_CameraManager_DeletePoint + ( + "delete", + EV_CONSOLE, + NULL, + NULL, + "Delete the current path node." + ); +Event EV_CameraManager_MovePlayer + ( + "moveplayer", + EV_CONSOLE, + NULL, + NULL, + "Move the player to the current path node position." + ); +Event EV_CameraManager_ReplacePoint + ( + "replace", + EV_CONSOLE, + NULL, + NULL, + "Replace the current path node position/angle with the player's." + ); +Event EV_CameraManager_NextPoint + ( + "next", + EV_CONSOLE, + NULL, + NULL, + "Go to the next path node." + ); +Event EV_CameraManager_PreviousPoint + ( + "prev", + EV_CONSOLE, + NULL, + NULL, + "Go to the previous path node." + ); +Event EV_CameraManager_ShowPath + ( + "show", + EV_CONSOLE, + "E", + "path", + "Shows the specified path." + ); +Event EV_CameraManager_ShowingPath + ( + "_showing_path", + EV_CONSOLE, + NULL, + NULL, + "Internal event for showing the path." + ); +Event EV_CameraManager_HidePath + ( + "hide", + EV_CONSOLE, + NULL, + NULL, + "Hides the paths." + ); +Event EV_CameraManager_PlayPath + ( + "play", + EV_CONSOLE, + "E", + "path", + "Play the current path or the specified one once." + ); +Event EV_CameraManager_LoopPath + ( + "loop", + EV_CONSOLE, + "E", + "path", + "Loop the current path or the specified one." + ); +Event EV_CameraManager_StopPlayback + ( + "stop", + EV_CONSOLE, + NULL, + NULL, + "Stop the camera playing path." + ); +Event EV_CameraManager_Watch + ( + "watch", + EV_CONSOLE, + "s", + "watch", + "Set the current path node to watch something." + ); +Event EV_CameraManager_NoWatch + ( + "nowatch", + EV_CONSOLE, + NULL, + NULL, + "Set the current path node to watch nothing." + ); +Event EV_CameraManager_Fov + ( + "setfov", + EV_CONSOLE, + "s", + "newFOV", + "Set the fov at the current path node." + ); +Event EV_CameraManager_FadeTime + ( + "setfadetime", + EV_CONSOLE, + "f", + "newFadeTime", + "Set the fadetime of the current path node." + ); +Event EV_CameraManager_Speed + ( + "setspeed", + EV_CONSOLE, + "f", + "speed", + "Set the speed of the camera at the current path node." + ); +Event EV_CameraManager_Save + ( + "save", + EV_CONSOLE, + "s", + "filename", + "Saves the camera path." + ); +Event EV_CameraManager_Load + ( + "load", + EV_CONSOLE, + "s", + "filename", + "Loads a camera path." + ); +Event EV_CameraManager_SaveMap + ( + "savemap", + EV_CONSOLE, + "s", + "filename", + "Saves the camera path to a map file." + ); +Event EV_CameraManager_SetThread + ( + "setthread", + EV_CONSOLE, + "s", + "thread", + "Sets the thread for the current path node." + ); +Event EV_CameraManager_UpdateInput + ( + "updateinput", + EV_CONSOLE, + NULL, + NULL, + "Updates the current node with user interface values." + ); + +Event EV_CameraManager_NextPath + ( + "nextpath", + EV_CONSOLE, + NULL, + NULL, + "Go to the next path." + ); +Event EV_CameraManager_PreviousPath + ( + "prevpath", + EV_CONSOLE, + NULL, + NULL, + "Go to the previous path." + ); + +Event EV_CameraManager_RenamePath + ( + "renamepath", + EV_CONSOLE, + "s", + "newName", + "Rename the path to the new name." + ); + +CLASS_DECLARATION( Listener, CameraManager, NULL ) + { + { &EV_CameraManager_NewPath, NewPath }, + { &EV_CameraManager_SetPath, SetPath }, + { &EV_CameraManager_SetTargetName, SetTargetName }, + { &EV_CameraManager_SetTarget, SetTarget }, + { &EV_CameraManager_SetThread, SetThread }, + { &EV_CameraManager_SetPath, SetPath }, + { &EV_CameraManager_AddPoint, AddPoint }, + { &EV_CameraManager_ReplacePoint, ReplacePoint }, + { &EV_CameraManager_DeletePoint, DeletePoint }, + { &EV_CameraManager_MovePlayer, MovePlayer }, + { &EV_CameraManager_NextPoint, NextPoint }, + { &EV_CameraManager_PreviousPoint, PreviousPoint }, + { &EV_CameraManager_ShowPath, ShowPath }, + { &EV_CameraManager_ShowingPath, ShowingPath }, + { &EV_CameraManager_HidePath, HidePath }, + { &EV_CameraManager_PlayPath, PlayPath }, + { &EV_CameraManager_LoopPath, LoopPath }, + { &EV_CameraManager_StopPlayback, StopPlayback }, + { &EV_CameraManager_Watch, Watch }, + { &EV_CameraManager_NoWatch, NoWatch }, + { &EV_CameraManager_Fov, Fov }, + { &EV_CameraManager_FadeTime, FadeTime }, + { &EV_CameraManager_Speed, Speed }, + { &EV_CameraManager_Save, Save }, + { &EV_CameraManager_Load, Load }, + { &EV_CameraManager_SaveMap, SaveMap }, + { &EV_CameraManager_UpdateInput, UpdateEvent }, + { &EV_CameraManager_NextPath, NextPath }, + { &EV_CameraManager_PreviousPath, PreviousPath }, + { &EV_CameraManager_RenamePath, RenamePath }, + { NULL, NULL } + }; + +Player *CameraManager_GetPlayer + ( + void + ) + + { + assert( g_entities[ 0 ].entity && g_entities[ 0 ].entity->isSubclassOf( Player ) ); + if ( !g_entities[ 0 ].entity || !( g_entities[ 0 ].entity->isSubclassOf( Player ) ) ) + { + gi.Printf( "No player found.\n" ); + return NULL; + } + + return ( Player * )g_entities[ 0 ].entity; + } + +CameraManager::CameraManager() + { + pathList.ClearObjectList(); + path = NULL; + current = NULL; + cameraPath_dirty = qtrue; + speed = 1; + watch = 0; + cam = NULL; + } + +void CameraManager::UpdateUI + ( + void + ) + { + int num; + SplinePath *next; + float temp; + + // + // set path name + // + gi.cvar_set( "cam_filename", pathName ); + if ( current ) + { + + gi.cvar_set( "cam_origin", va( "%.2f %.2f %.2f", current->origin[ 0 ], current->origin[ 1 ], current->origin[ 2 ] ) ); + gi.cvar_set( "cam_angles_yaw", va( "%.1f", current->angles[ YAW ] ) ); + gi.cvar_set( "cam_angles_pitch", va( "%.1f", current->angles[ PITCH ] ) ); + gi.cvar_set( "cam_angles_roll", va( "%.1f", current->angles[ ROLL ] ) ); + gi.cvar_set( "cam_thread", current->thread.c_str() ); + gi.cvar_set( "cam_target", current->triggertarget.c_str() ); + gi.cvar_set( "cam_watch", current->watchEnt.c_str() ); + temp = current->GetFov(); + if ( temp ) + { + gi.cvar_set( "cam_fov", va( "%.1f", temp ) ); + } + else + { + gi.cvar_set( "cam_fov", "Default" ); + } + temp = current->GetFadeTime(); + if ( temp != -1 ) + { + gi.cvar_set( "cam_fadetime", va( "%.2f", temp ) ); + } + else + { + gi.cvar_set( "cam_fadetime", "Default" ); + } + gi.cvar_set( "cam_speed", va( "%.1f", current->speed ) ); + if ( EventPending( EV_CameraManager_ShowingPath ) ) + { + gi.cvar_set( "cam_hiddenstate", "visible" ); + } + else + { + gi.cvar_set( "cam_hiddenstate", "hidden" ); + } + + // + // set node num + // + num = 0; + next = path; + while ( next && ( next != current ) ) + { + next = next->GetNext(); + num++; + } + gi.cvar_set( "cam_nodenum", va( "%d", num ) ); + } + } + +void CameraManager::UpdateEvent + ( + Event *ev + ) + { + Vector tempvec; + cvar_t * cvar; + + if ( !current ) + { + return; + } + + // get origin + cvar = gi.cvar( "cam_origin", "", 0 ); + sscanf( cvar->string, "%f %f %f", &tempvec[ 0 ], &tempvec[ 1 ], &tempvec[ 2 ] ); + current->setOrigin( tempvec ); + + // get angles yaw + cvar = gi.cvar( "cam_angles_yaw", "", 0 ); + current->angles[ YAW ] = cvar->value; + + // get angles pitch + cvar = gi.cvar( "cam_angles_pitch", "", 0 ); + current->angles[ PITCH ] = cvar->value; + + // get angles roll + cvar = gi.cvar( "cam_angles_roll", "", 0 ); + current->angles[ ROLL ] = cvar->value; + + current->setAngles( current->angles ); + + // get thread + cvar = gi.cvar( "cam_thread", "", 0 ); + current->SetThread( cvar->string ); + + // get target + cvar = gi.cvar( "cam_target", "", 0 ); + current->SetTriggerTarget( cvar->string ); + + // get watch + cvar = gi.cvar( "cam_watch", "", 0 ); + current->SetWatch( cvar->string ); + + // get fov + cvar = gi.cvar( "cam_fov", "", 0 ); + current->SetFov( cvar->value ); + + // get fadetime + cvar = gi.cvar( "cam_fadetime", "", 0 ); + current->SetFadeTime( cvar->value ); + + // get speed + cvar = gi.cvar( "cam_speed", "", 0 ); + current->speed = cvar->value; + } + +void CameraManager::SetPathName + ( + str name + ) + + { + pathName = name; + UpdateUI(); + } + +void CameraManager::NewPath + ( + Event *ev + ) + + { + if ( path ) + { + cameraPath_dirty = qtrue; + path = NULL; + current = NULL; + } + SetPathName( "untitled" ); + ShowPath(); + } + +void CameraManager::RenamePath + ( + Event *ev + ) + + { + str name; + + if ( !ev->NumArgs() ) + { + cvar_t * cvar; + + // + // get the path name from the cvar + // + cvar = gi.cvar( "cam_filename", "", 0 ); + if ( cvar->string[ 0 ] ) + { + name = cvar->string; + } + else + { + ev->Error( "Usage: cam renamepath [pathname]" ); + return; + } + } + else + { + name = ev->GetString( 1 ); + } + + if ( pathList.ObjectInList( name ) ) + { + // remove the old name + pathList.RemoveObject( name ); + } + SetPathName( name ); + pathList.AddUniqueObject( name ); + } + +void CameraManager::SetPath + ( + str pathName + ) + + { + Entity * ent; + SplinePath *node; + + ent = G_FindTarget( NULL, pathName ); + + if ( !ent ) + { + warning( "SetPath", "Could not find path named '%s'.", pathName.c_str() ); + return; + } + + if ( !ent->isSubclassOf( SplinePath ) ) + { + warning( "SetPath", "'%s' is not a camera path.", pathName.c_str() ); + return; + } + node = ( SplinePath * )ent; + + SetPathName( pathName ); + cameraPath_dirty = qtrue; + path = node; + current = node; + UpdateUI(); + } + +void CameraManager::SetPath + ( + Event *ev + ) + + { + if ( !ev->NumArgs() ) + { + ev->Error( "Usage: cam setpath [pathname]" ); + return; + } + + SetPath( ev->GetString( 1 ) ); + } + +void CameraManager::SetTargetName + ( + Event *ev + ) + + { + if ( ev->NumArgs() != 1 ) + { + ev->Error( "Usage: cam targetname [name]" ); + return; + } + + if ( !path ) + { + ev->Error( "Camera path not set." ); + return; + } + + path->SetTargetName( ev->GetString( 1 ) ); + UpdateUI(); + } + +void CameraManager::SetTarget + ( + Event *ev + ) + + { + if ( ev->NumArgs() != 1 ) + { + ev->Error( "Usage: cam target [name]" ); + return; + } + + if ( !current ) + { + ev->Error( "Camera path not set." ); + return; + } + + current->SetTriggerTarget( ev->GetString( 1 ) ); + UpdateUI(); + } + +void CameraManager::SetThread + ( + Event *ev + ) + + { + if ( ev->NumArgs() != 1 ) + { + ev->Error( "Usage: cam thread [name]" ); + return; + } + + if ( !current ) + { + ev->Error( "Camera path not set." ); + return; + } + + current->SetThread( ev->GetString( 1 ) ); + UpdateUI(); + } + +void CameraManager::AddPoint + ( + Event *ev + ) + + { + Player *player; + SplinePath *prev; + SplinePath *next; + Vector ang; + Vector pos; + + player = CameraManager_GetPlayer(); + if ( player ) + { + prev = current; + if ( current ) + { + next = current->GetNext(); + } + else + { + next = NULL; + } + + player->GetPlayerView( &pos, &ang ); + + current = new SplinePath; + current->setOrigin( pos ); + current->setAngles( ang ); + current->speed = speed; + current->SetPrev( prev ); + current->SetNext( next ); + + if ( !path ) + { + path = current; + } + + ShowPath(); + } + cameraPath_dirty = qtrue; + UpdateUI(); + } + +void CameraManager::ReplacePoint + ( + Event *ev + ) + + { + Player *player; + Vector ang; + Vector pos; + + player = CameraManager_GetPlayer(); + if ( current && player ) + { + player->GetPlayerView( &pos, &ang ); + + current->setOrigin( pos ); + current->setAngles( ang ); + current->speed = speed; + } + cameraPath_dirty = qtrue; + UpdateUI(); + } + +void CameraManager::DeletePoint + ( + Event *ev + ) + + { + SplinePath *node; + + if ( current ) + { + node = current->GetNext(); + if ( !node ) + { + node = current->GetPrev(); + } + + if ( ( SplinePath * )path == ( SplinePath * )current ) + { + path = current->GetNext(); + } + + delete current; + current = node; + } + cameraPath_dirty = qtrue; + UpdateUI(); + } + +void CameraManager::MovePlayer + ( + Event *ev + ) + + { + Player *player; + Vector pos; + + player = CameraManager_GetPlayer(); + if ( current && player ) + { + player->GetPlayerView( &pos, NULL ); + + player->setOrigin( current->origin - pos + player->origin ); + player->SetViewAngles( current->angles ); + player->SetFov( current->fov ); + } + } + +void CameraManager::NextPoint + ( + Event *ev + ) + + { + SplinePath *next; + + if ( current ) + { + next = current->GetNext(); + if ( next ) + { + current = next; + } + } + UpdateUI(); + } + +void CameraManager::PreviousPoint + ( + Event *ev + ) + + { + SplinePath *prev; + + if ( current ) + { + prev = current->GetPrev(); + if ( prev ) + { + current = prev; + } + } + UpdateUI(); + } + +void CameraManager::NextPath + ( + Event *ev + ) + + { + int index; + + // + // find current path in container of paths + // + index = pathList.IndexOfObject( pathName ); + if ( index < pathList.NumObjects() ) + index++; + + if ( index > 0 ) + { + SetPath( pathList.ObjectAt( index ) ); + UpdateUI(); + } + } + +void CameraManager::PreviousPath + ( + Event *ev + ) + + { + int index; + + // + // find current path in container of paths + // + index = pathList.IndexOfObject( pathName ); + if ( index > 1 ) + index--; + + if ( index > 0 ) + { + SetPath( pathList.ObjectAt( index ) ); + UpdateUI(); + } + } + +void CameraManager::ShowingPath + ( + Event *ev + ) + + { + int count; + SplinePath *node; + SplinePath *prev; + Vector mins( -8, -8, -8 ); + Vector maxs( 8, 8, 8 ); + + prev = NULL; + for( node = path; node != NULL; node = node->GetNext() ) + { + if ( prev ) + { + G_LineStipple( 4, ( unsigned short )( 0xF0F0F0F0 >> ( 7 - ( level.framenum & 7 ) ) ) ); + G_DebugLine( prev->origin, node->origin, 0.4, 0.4, 0.4, 0.1 ); + G_LineStipple( 1, 0xffff ); + } + + if ( current == node ) + { + G_DrawDebugNumber( node->origin + Vector( 0, 0, 20 ), node->speed, 0.5, 0, 1, 0, 1 ); + if ( current->GetFov() ) + G_DrawDebugNumber( node->origin + Vector( 0, 0, 30 ), node->GetFov(), 0.5, 0, 0, 1, 0 ); + G_DebugBBox( node->origin, mins, maxs, 1, 1, 0, 1 ); + } + else + { + G_DebugBBox( node->origin, mins, maxs, 1, 0, 0, 1 ); + } + + // + // draw watch + // + if ( node->doWatch ) + { + Entity *watchEnt; + Vector ang; + Vector delta; + Vector left; + Vector up; + Vector endpoint; + + watchEnt = GetWatchEntity( node->GetWatch() ); + if ( watchEnt ) + { + delta.x = watchEnt->origin.x; + delta.y = watchEnt->origin.y; + delta.z = watchEnt->absmax.z; + delta -= node->origin; + delta.normalize(); + ang = delta.toAngles(); + ang.AngleVectors( NULL, &left, &up ); + + G_LineWidth( 1 ); + endpoint = node->origin + delta * 48; + G_DebugLine( node->origin, endpoint, 0.5, 1, 1, 1 ); + G_DebugLine( endpoint, endpoint + (left * 8) - (delta * 8), 0.5, 1, 1, 1 ); + G_DebugLine( endpoint, endpoint - (left * 8) - (delta * 8), 0.5, 1, 1, 1 ); + G_DebugLine( endpoint, endpoint - (up * 8) - (delta * 8), 0.5, 1, 1, 1 ); + G_DebugLine( endpoint, endpoint + (up * 8) - (delta * 8), 0.5, 1, 1, 1 ); + } + } + + G_LineWidth( 3 ); + G_DebugLine( node->origin, node->origin + Vector( node->orientation[ 0 ] ) * 16, 1, 0, 0, 1 ); + G_DebugLine( node->origin, node->origin + Vector( node->orientation[ 1 ] ) * 16, 0, 1, 0, 1 ); + G_DebugLine( node->origin, node->origin + Vector( node->orientation[ 2 ] ) * 16, 0, 0, 1, 1 ); + G_LineWidth( 1 ); + + prev = node; + } + + if ( cameraPath_dirty ) + { + cameraPath_dirty = qfalse; + cameraPath.Clear(); + cameraPath.SetType( SPLINE_CLAMP ); + + node = path; + while( node != NULL ) + { + cameraPath.AppendControlPoint( node->origin, node->angles, node->speed ); + node = node->GetNext(); + + if ( node == path ) + { + break; + } + } + } + + // draw the curve itself + G_Color3f( 1, 1, 0 ); + cameraPath.DrawCurve( 10 ); + + // draw all the nodes + for( node = path, count = -1; node != NULL; node = node->GetNext(), count++ ) + { + Vector dir, angles; + + dir = cameraPath.Eval( ( float )count - 0.9f ) - cameraPath.Eval( count - 1 ); + angles = dir.toAngles(); + if ( node->doWatch || node->GetFov() || ( node->thread != "" ) || ( node->triggertarget != "" ) ) + { + G_DebugOrientedCircle( cameraPath.Eval( count - 1 ), 5, 0, 1, 1, 1, angles ); + } + else + { + G_DebugOrientedCircle( cameraPath.Eval( count - 1 ), 2, 0, 0, 1, 0.2, angles ); + } + // if we are the first node, we need to skip the count so that we properly go to the next node + if ( count == -1 ) + { + count = 0; + } + } + + + PostEvent( EV_CameraManager_ShowingPath, FRAMETIME ); + } + +void CameraManager::ShowPath + ( + void + ) + + { + CancelEventsOfType( EV_CameraManager_ShowingPath ); + PostEvent( EV_CameraManager_ShowingPath, FRAMETIME ); + UpdateUI(); + } + +void CameraManager::ShowPath + ( + Event *ev + ) + + { + if ( ev->NumArgs() ) + { + SetPath( ev->GetString( 1 ) ); + } + ShowPath(); + } + +void CameraManager::HidePath + ( + Event *ev + ) + + { + CancelEventsOfType( EV_CameraManager_ShowingPath ); + UpdateUI(); + } + +void CameraManager::StopPlayback + ( + Event *ev + ) + + { + if ( cam ) + { + cam->Stop(); + SetCamera( NULL, 0 ); + } + } + +void CameraManager::PlayPath + ( + Event *ev + ) + + { + if ( cam ) + { + SetCamera( NULL, 0 ); + } + + if ( ev->NumArgs() ) + { + SetPath( ev->GetString( 1 ) ); + } + + if ( path ) + { + if ( !cam ) + { + cam = new Camera; + cam->SetTargetName( "_loadedcamera" ); + cam->ProcessPendingEvents(); + } + + cam->Reset( path->origin, path->angles ); + cam->FollowPath( path, false, NULL ); + cam->Cut( NULL ); + SetCamera( cam, 0 ); + } + } + +void CameraManager::LoopPath + ( + Event *ev + ) + + { + if ( cam ) + { + SetCamera( NULL, 0 ); + } + + if ( ev->NumArgs() ) + { + SetPath( ev->GetString( 1 ) ); + } + + if ( path ) + { + if ( !cam ) + { + cam = new Camera; + cam->SetTargetName( "_loadedcamera" ); + cam->ProcessPendingEvents(); + } + + cam->Reset( path->origin, path->angles ); + cam->FollowPath( path, true, NULL ); + cam->Cut( NULL ); + SetCamera( cam, 0 ); + } + } + +void CameraManager::Watch + ( + Event *ev + ) + + { + if ( current ) + { + current->SetWatch( ev->GetString( 1 ) ); + } + UpdateUI(); + } + +void CameraManager::NoWatch + ( + Event *ev + ) + + { + if ( current ) + { + current->NoWatch(); + } + UpdateUI(); + } + +void CameraManager::Fov + ( + Event *ev + ) + + { + if ( current ) + { + current->SetFov( ev->GetFloat( 1 ) ); + } + UpdateUI(); + } + +void CameraManager::FadeTime + ( + Event *ev + ) + + { + if ( current ) + { + current->SetFadeTime( ev->GetFloat( 1 ) ); + } + UpdateUI(); + } + + +void CameraManager::Speed + ( + Event *ev + ) + + { + speed = ev->GetFloat( 1 ); + if ( current ) + { + current->speed = speed; + } + cameraPath_dirty = qtrue; + UpdateUI(); + } + +void CameraManager::SavePath + ( + str pathName + ) + { + SplinePath *node; + str buf; + str filename; + int num; + int index; + + num = 0; + for( node = path; node != NULL; node = node->GetNext() ) + { + num++; + } + + if ( num == 0 ) + { + warning( "CameraManager::SavePath", "Can't save. No points in path." ); + return; + } + + filename = "cams/"; + filename += pathName; + filename += ".cam"; + + path->SetTargetName( pathName ); + + gi.Printf( "Saving camera path to '%s'...\n", filename.c_str() ); + + buf = ""; + buf += va( "//\n" ); + buf += va( "// Camera Path \"%s\", %d Nodes.\n", pathName.c_str(), num ); + buf += va( "//\n" ); + + index = 0; + for( node = path; node != NULL; node = node->GetNext() ) + { + // + // start off the spawn command + // + buf += "spawn SplinePath"; + // + // set the targetname + // + if ( !index ) + { + buf += va( " targetname %s", pathName.c_str() ); + } + else + { + buf += va( " targetname camnode_%s_%d", pathName.c_str(), index ); + } + // + // set the target + // + if ( index < ( num - 1 ) ) + { + buf += va( " target camnode_%s_%d", pathName.c_str(), index + 1 ); + } + // + // set the trigger target + // + if ( node->triggertarget != "" ) + { + buf += va( " triggertarget %s", node->triggertarget.c_str() ); + } + // + // set the thread + // + if ( node->thread != "" ) + { + buf += va( " thread %s", node->thread.c_str() ); + } + // + // set the origin + // + buf += va( " origin \"%.2f %.2f %.2f\"", node->origin.x, node->origin.y, node->origin.z ); + // + // set the angles + // + buf += va( " angles \"%.1f %.1f %.1f\"", AngleMod( node->angles.x ), AngleMod( node->angles.y ), AngleMod( node->angles.z ) ); + // + // set the speed + // + buf += va( " speed %.1f", node->speed ); + // + // set the watch + // + if ( node->doWatch && node->watchEnt != "" ) + { + buf += va( " watch %s", node->watchEnt.c_str() ); + } + // + // set the fov + // + if ( node->GetFov() ) + { + buf += va( " fov %.1f", node->GetFov() ); + } + // + // set the fadetime + // + if ( node->GetFadeTime() ) + { + buf += va( " fadetime %.1f", node->GetFadeTime() ); + } + + buf += "\n"; + index++; + } + buf += "end\n"; + + gi.FS_WriteFile( filename.c_str(), buf.c_str(), buf.length() + 1 ); + gi.Printf( "done.\n" ); + } + +void CameraManager::Save + ( + Event *ev + ) + + { + str filename; + str name; + + if ( ev->NumArgs() != 1 ) + { + cvar_t * cvar; + + // + // get the path name from the cvar + // + cvar = gi.cvar( "cam_filename", "", 0 ); + if ( cvar->string[ 0 ] ) + { + name = cvar->string; + } + else + { + ev->Error( "Usage: cam save [filename]" ); + return; + } + } + else + { + name = ev->GetString( 1 ); + } + SavePath( name ); + pathList.AddUniqueObject( name ); + } + +void CameraManager::Load + ( + Event *ev + ) + + { + ScriptThread * thread; + qboolean show; + str filename; + str name; + + if ( ev->NumArgs() != 1 ) + { + cvar_t * cvar; + + // + // get the path name from the cvar + // + cvar = gi.cvar( "cam_filename", "", 0 ); + if ( cvar->string[ 0 ] ) + { + show = true; + name = cvar->string; + } + else + { + ev->Error( "Usage: cam load [filename]" ); + return; + } + } + else + { + show = false; + name = ev->GetString( 1 ); + } + + if ( pathList.ObjectInList( name ) && show ) + { + gi.Printf( "Camera path '%s' already loaded...\n", name.c_str() ); + return; + } + + filename = "cams/"; + filename += name; + filename += ".cam"; + + gi.Printf( "Loading camera path from '%s'...", filename.c_str() ); + + thread = Director.CreateThread( filename, LEVEL_SCRIPT, NULL ); + if ( thread ) + { + // start right away + thread->StartImmediately(); + pathList.AddUniqueObject( name ); + if ( show ) + { + Event * ev; + + ev = new Event( EV_CameraManager_SetPath ); + ev->AddString( name ); + PostEvent( ev, 0 ); + ShowPath(); + } + gi.Printf( "done.\n" ); + } + else + { + gi.Printf( "failed.\n" ); + } + } + + +void CameraManager::SaveMap + ( + Event *ev + ) + + { + SplinePath *node; + str buf; + str filename; + int num; + int index; + + if ( ev->NumArgs() != 1 ) + { + ev->Error( "Usage: cam savemap [filename]" ); + return; + } + + num = 0; + for( node = path; node != NULL; node = node->GetNext() ) + { + num++; + } + + if ( num == 0 ) + { + ev->Error( "Can't save. No points in path." ); + return; + } + + filename = "cams/"; + filename += ev->GetString( 1 ); + filename += ".map"; + + if ( !path->targetname.length() ) + { + path->SetTargetName( ev->GetString( 1 ) ); + gi.Printf( "Targetname set to '%s'\n", path->targetname.c_str() ); + } + + gi.Printf( "Saving camera path to map '%s'...\n", filename.c_str() ); + + buf = ""; + index = 0; + for( node = path; node != NULL; node = node->GetNext() ) + { + buf += va( "// pathnode %d\n", index ); + buf += "{\n"; + buf += va( "\"classname\" \"info_splinepath\"\n" ); + if ( index < ( num - 1 ) ) + { + buf += va( "\"target\" \"camnode_%s_%d\"\n", ev->GetString( 1 ), index + 1 ); + } + if ( !index ) + { + buf += va( "\"targetname\" \"%s\"\n", ev->GetString( 1 ) ); + } + else + { + buf += va( "\"targetname\" \"camnode_%s_%d\"\n", ev->GetString( 1 ), index ); + } + if ( node->triggertarget != "" ) + { + buf += va( "\"triggertarget\" \"%s\"\n", node->triggertarget.c_str() ); + } + if ( node->thread != "" ) + { + buf += va( "\"thread\" \"%s\"\n", node->thread.c_str() ); + } + buf += va( "\"origin\" \"%d %d %d\"\n", ( int )node->origin.x, ( int )node->origin.y, ( int )node->origin.z ); + buf += va( "\"angles\" \"%d %d %d\"\n", ( int )AngleMod( node->angles.x ), ( int )AngleMod( node->angles.y ), ( int )AngleMod( node->angles.z ) ); + buf += va( "\"speed\" \"%.3f\"\n", node->speed ); + buf += "}\n"; + index++; + } + + gi.FS_WriteFile( filename.c_str(), buf.c_str(), buf.length() + 1 ); + gi.Printf( "done.\n" ); + } + diff --git a/source/source/fgame/camera.h b/source/source/fgame/camera.h new file mode 100644 index 0000000..fa04d9e --- /dev/null +++ b/source/source/fgame/camera.h @@ -0,0 +1,520 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/camera.h $ +// $Revision:: 21 $ +// $Author:: Aldie $ +// $Date:: 7/25/00 11:32p $ +// +// Copyright (C) 1997 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/camera.h $ +// +// 21 7/25/00 11:32p Aldie +// Made some changes to the memory system and fixed a memory allocation bug in +// Z_TagMalloc. Also changed a lot of classes to subclass from Class. +// +// 20 7/10/00 11:54p Markd +// added exit level code +// +// 19 7/10/00 8:35p Markd +// added camera tracing to orbit +// +// 18 7/04/00 2:25p Markd +// added cool cinematic for new objects +// +// 17 6/28/00 12:23p Markd +// Added auto_active to cameras +// +// 16 6/09/00 6:55p Markd +// fixed camera being bound to other objects +// +// 15 5/26/00 7:44p Markd +// 2nd phase save games +// +// 14 5/25/00 7:52p Markd +// 2nd pass save game stuff +// +// 13 5/24/00 3:14p Markd +// first phase of save/load games +// +// 12 4/19/00 2:38p Markd +// Added auto_fov support to cameras +// +// 11 4/19/00 12:54p Markd +// put in auto_starttime and auto_stoptime support into auto cameras +// +// 10 4/11/00 2:46p Markd +// Implemented Automatic camera support +// +// 9 3/16/00 11:45a Markd +// fixed a camera iniatialization bug +// +// 8 3/15/00 2:04p Markd +// fixed up camera node system and added new debug oriented circle +// +// 7 2/03/00 3:12p Markd +// Fixed up fadetimes for watches and fov and follow +// +// 6 11/09/99 8:07p Markd +// Did a lot of work on the camera system +// +// 5 11/05/99 5:55p Markd +// Added user-interface to camera system +// +// 4 11/04/99 10:03a Markd +// complete overhaul of the camera system +// +// 3 10/29/99 7:04p Markd +// cleaned up some camera stuff +// +// 2 10/27/99 12:19p Markd +// added smooth camera lerping +// +// 1 9/10/99 10:53a Jimdose +// +// 1 9/08/99 3:15p Aldie +// +// 10 9/01/99 6:16p Jimdose +// added SetThread +// +// 9 7/06/99 8:33p Jimdose +// removed unused player code +// added state machine for player animation +// +// DESCRIPTION: +// Camera. Duh. +// + +#ifndef __CAMERA_H__ +#define __CAMERA_H__ + +#include "g_local.h" +#include "entity.h" +#include "bspline.h" +#include "container.h" + +#define CAMERA_SWITCHTIME 0.5f + +#define ORBIT ( 1 << 0 ) +#define START_ON ( 1 << 1 ) +#define AUTOMATIC ( 1 << 2 ) +#define NO_TRACE ( 1 << 3 ) +#define NO_WATCH ( 1 << 4 ) +#define LEVEL_EXIT ( 1 << 5 ) + + +extern Event EV_Camera_CameraThink; +extern Event EV_Camera_StartMoving; +extern Event EV_Camera_Pause; +extern Event EV_Camera_Continue; +extern Event EV_Camera_StopMoving; +extern Event EV_Camera_SetSpeed; +extern Event EV_Camera_SetFollowDistance; +extern Event EV_Camera_SetOrbitHeight; +extern Event EV_Camera_SetYaw; +extern Event EV_Camera_AbsoluteYaw; +extern Event EV_Camera_RelativeYaw; +extern Event EV_Camera_SetFOV; +extern Event EV_Camera_Orbit; +extern Event EV_Camera_Follow; +extern Event EV_Camera_Watch; +extern Event EV_Camera_WatchPath; +extern Event EV_Camera_LookAt; +extern Event EV_Camera_TurnTo; +extern Event EV_Camera_MoveToEntity; +extern Event EV_Camera_MoveToPos; +extern Event EV_Camera_NoWatch; +extern Event EV_Camera_FadeTime; +extern Event EV_Camera_Cut; + +class Camera; + +class CameraMoveState : public Class + { + public: + Vector pos; + Vector movedir; // direction of travel + Vector angles; // angles from spline camera + + BSpline cameraPath; + SplinePathPtr splinePath; + SplinePathPtr currentNode; + SplinePathPtr loopNode; + + float cameraTime; + int lastTime; + int newTime; + + qboolean followingpath; + EntityPtr followEnt; + EntityPtr orbitEnt; + + void operator=( CameraMoveState &newstate ); + void Evaluate( Camera * camera ); + void Initialize( Camera * camera ); + void DoNodeEvents( Camera * camera ); + virtual void Archive( Archiver &arc ); + }; + +inline void CameraMoveState::operator= + ( + CameraMoveState &newstate + ) + + { + movedir = newstate.movedir; + pos = newstate.pos; + angles = newstate.angles; + + cameraPath = newstate.cameraPath; + splinePath = newstate.splinePath; + currentNode = newstate.currentNode; + loopNode = newstate.loopNode; + + cameraTime = newstate.cameraTime; + lastTime = newstate.lastTime; + newTime = newstate.newTime; + + followEnt = newstate.followEnt; + orbitEnt = newstate.orbitEnt; + + followingpath = newstate.followingpath; + } + +inline void CameraMoveState::Archive + ( + Archiver &arc + ) + { + arc.ArchiveVector( &movedir ); + arc.ArchiveVector( &pos ); + arc.ArchiveVector( &angles ); + + cameraPath.Archive( arc ); + + arc.ArchiveSafePointer( &splinePath ); + arc.ArchiveSafePointer( ¤tNode ); + arc.ArchiveSafePointer( &loopNode ); + + arc.ArchiveFloat( &cameraTime ); + arc.ArchiveInteger( &lastTime ); + arc.ArchiveInteger( &newTime ); + + arc.ArchiveSafePointer( &followEnt ); + arc.ArchiveSafePointer( &orbitEnt ); + + arc.ArchiveBoolean( &followingpath ); + } + +class CameraWatchState : public Class + { + public: + Vector watchAngles; + + EntityPtr watchEnt; + qboolean watchNodes; + qboolean watchPath; + + void Evaluate( Camera * camera, CameraMoveState * move ); + void Initialize( Camera * camera ); + virtual void Archive( Archiver &arc ); + }; + +inline void CameraWatchState::Archive + ( + Archiver &arc + ) + { + arc.ArchiveVector( &watchAngles ); + arc.ArchiveSafePointer( &watchEnt ); + arc.ArchiveBoolean( &watchNodes ); + arc.ArchiveBoolean( &watchPath ); + } + +class CameraState : public Class + { + public: + CameraMoveState move; + CameraWatchState watch; + float fov; + + void Evaluate( Camera * camera ); + void Initialize( Camera * camera ); + virtual void Archive( Archiver &arc ); + }; + +inline void CameraState::Archive + ( + Archiver &arc + ) + { + move.Archive( arc ); + watch.Archive( arc ); + arc.ArchiveFloat( &fov ); + } + +class Camera : public Entity + { + private: + friend class CameraState; + friend class CameraWatchState; + friend class CameraMoveState; + // + // follow parameters + // + float follow_yaw; + qboolean follow_yaw_fixed; + float follow_dist; + int follow_mask; + + // camera speed + float camera_speed; + // current camera fov + float camera_fov; + // orbit height + float orbit_height; + // orbit_dotrace + qboolean orbit_dotrace; + // whether or not auto calculate fov, a non-zero value means yes + float auto_fov; + + // automatic variables + float automatic_startTime; + float automatic_stopTime; + float automatic_radius; + float automatic_maxFOV; + qboolean automatic_active; + Container automatic_states; + + protected: + CameraState currentstate; + CameraState newstate; + + float watchTime; // if non-zero, camera view is transitioning + float followTime; // if non-zero, camera position is tranisitioning + float fovTime; // if non-zero, fov is being lerped + + float fadeTime; // time to transition over + float fovFadeTime; // time for fov transition + float followFadeTime; // time for fov transition + float watchFadeTime; // time for fov transition + + str nextCamera; + str thread; + + qboolean showcamera; + + void SetupCamera( Event *ev ); + void CameraThink( Event *ev ); + void CreateOrbit( Vector pos, float radius, Vector &forward, Vector &left ); + void CreatePath( SplinePath *path, splinetype_t type ); + void UpdateStates( void ); + Vector CalculatePosition( void ); + Vector CalculateOrientation( void ); + float CalculateFov( void ); + virtual void bind( Entity *master, qboolean use_my_angles = false ); + virtual void unbind( void ); + + public: + CLASS_PROTOTYPE( Camera ); + + Camera(); + void Stop( void ); + void FollowPath( SplinePath *path, qboolean loop, Entity *watch ); + void Orbit( Entity *ent, float dist, Entity *watch, float yaw_offset = 0, qboolean dotrace = qtrue ); + void FollowEntity( Entity *ent, float dist, int mask, Entity *watch = NULL ); + void Watch( str watch, float time ); + void Watch( Entity *ent, float time ); + void SetFOV( float fov, float time ); + + void StartMoving( Event *ev ); + void StopMoving( Event *ev ); + void Pause( Event *ev ); + void Continue( Event *ev ); + void SetAnglesEvent( Event *ev ); + void SetSpeed( Event *ev ); + void SetFollowDistance( Event *ev ); + void SetOrbitHeight( float height ); + void SetOrbitHeight( Event *ev ); + void SetFollowYaw( Event *ev ); + void AbsoluteYaw( Event *ev ); + void RelativeYaw( Event *ev ); + void SetFOV( Event *ev ); + void OrbitEvent( Event *ev ); + void FollowEvent( Event *ev ); + void WatchEvent( Event *ev ); + void WatchPathEvent( Event *ev ); + void WatchNodesEvent( Event *ev ); + void NoWatchEvent( Event *ev ); + void LookAt( Event *ev ); + void MoveToEntity( Event *ev ); + void MoveToPos( Event *ev ); + void Cut( Event *ev ); + void FadeTime( Event *ev ); + void TurnTo( Event *ev ); + void SetNextCamera( Event *ev ); + void SetThread( Event *ev ); + float CalculateScore( Entity * player, str state ); + float AutomaticStart( Entity * player ); + float AutomaticStop( Entity * player ); + qboolean IsAutomatic( void ); + qboolean IsLevelExit( void ); + void SetAutoStateEvent( Event * ev ); + void SetAutoRadiusEvent( Event * ev ); + void SetAutoStartTimeEvent( Event * ev ); + void SetAutoStopTimeEvent( Event * ev ); + void SetMaximumAutoFOVEvent( Event * ev ); + void SetAutoActiveEvent( Event * ev ); + + str &NextCamera( void ); + str &Thread( void ); + float Fov( void ); + + void Reset( Vector org, Vector ang ); + + virtual void Archive( Archiver &arc ); + }; + +inline void Camera::Archive + ( + Archiver &arc + ) + { + Entity::Archive( arc ); + + arc.ArchiveFloat( &follow_yaw ); + arc.ArchiveBoolean( &follow_yaw_fixed ); + arc.ArchiveFloat( &follow_dist ); + arc.ArchiveInteger( &follow_mask ); + + arc.ArchiveFloat( &camera_speed ); + arc.ArchiveFloat( &camera_fov ); + arc.ArchiveFloat( &orbit_height ); + arc.ArchiveBoolean( &orbit_dotrace ); + arc.ArchiveFloat( &auto_fov ); + + arc.ArchiveFloat( &automatic_startTime ); + arc.ArchiveFloat( &automatic_stopTime ); + arc.ArchiveFloat( &automatic_radius ); + arc.ArchiveFloat( &automatic_maxFOV ); + arc.ArchiveBoolean( &automatic_active ); + + automatic_states.Archive( arc ); + + // currentstate + currentstate.Archive( arc ); + // newstate + newstate.Archive( arc ); + + arc.ArchiveFloat( &watchTime ); + arc.ArchiveFloat( &followTime ); + arc.ArchiveFloat( &fovTime ); + arc.ArchiveFloat( &fadeTime ); + arc.ArchiveFloat( &fovFadeTime ); + arc.ArchiveFloat( &followFadeTime ); + arc.ArchiveFloat( &watchFadeTime ); + + arc.ArchiveString( &nextCamera ); + arc.ArchiveString( &thread ); + + arc.ArchiveBoolean( &showcamera ); + + if ( arc.Loading() ) + { + if ( spawnflags & AUTOMATIC ) + { + level.AddAutomaticCamera( this ); + } + } + } + +void SetCamera( Entity *ent, float switchTime ); +Entity * GetWatchEntity( str watch ); + +typedef SafePtr CameraPtr; + +class CameraManager : public Listener + { + protected: + Container pathList; + BSpline cameraPath; + SplinePathPtr path; + SplinePathPtr current; + float speed; + int watch; + str pathName; + CameraPtr cam; + qboolean cameraPath_dirty; + + void NewPath( Event *ev ); + void SetPath( Event *ev ); + void SetTargetName( Event *ev ); + void SetTarget( Event *ev ); + void SetThread( Event *ev ); + void AddPoint( Event *ev ); + void ReplacePoint( Event *ev ); + void DeletePoint( Event *ev ); + void MovePlayer( Event *ev ); + void NextPoint( Event *ev ); + void PreviousPoint( Event *ev ); + void ShowingPath( Event *ev ); + void ShowPath( Event *ev ); + void HidePath( Event *ev ); + void StopPlayback( Event *ev ); + void PlayPath( Event *ev ); + void LoopPath( Event *ev ); + void Watch( Event *ev ); + void NoWatch( Event *ev ); + void Fov( Event *ev ); + void FadeTime( Event *ev ); + void Speed( Event *ev ); + void Save( Event *ev ); + void Load( Event *ev ); + void SaveMap( Event *ev ); + void UpdateEvent( Event *ev ); + void NextPath( Event *ev ); + void PreviousPath( Event *ev ); + void RenamePath( Event *ev ); + + void ShowPath( void ); + void UpdateUI( void ); + void SetPathName( str name ); + void SavePath( str pathName ); + + public: + CLASS_PROTOTYPE( CameraManager ); + + CameraManager(); + void SetPath( str pathName ); + virtual void Archive( Archiver &arc ); + }; + +inline void CameraManager::Archive + ( + Archiver &arc + ) + + { + Listener::Archive( arc ); + + pathList.Archive( arc ); + + // no need to archive the cameraPath + arc.ArchiveSafePointer( &path ); + arc.ArchiveSafePointer( ¤t ); + arc.ArchiveFloat( &speed ); + arc.ArchiveInteger( &watch ); + arc.ArchiveString( &pathName ); + arc.ArchiveSafePointer( &cam ); + + // make sure the cameraPath gets rebuilt + cameraPath_dirty = qtrue; + } + +extern CameraManager CameraMan; + +#endif /* camera.h */ diff --git a/source/source/fgame/characterstate.cpp b/source/source/fgame/characterstate.cpp new file mode 100644 index 0000000..621699a --- /dev/null +++ b/source/source/fgame/characterstate.cpp @@ -0,0 +1,1324 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/characterstate.cpp $ +// $Revision:: 34 $ +// $Date:: 7/25/00 11:32p $ +// +// Copyright (C) 1999 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/characterstate.cpp $ +// +// 34 7/25/00 11:32p Aldie +// Made some changes to the memory system and fixed a memory allocation bug in +// Z_TagMalloc. Also changed a lot of classes to subclass from Class. +// +// 33 7/21/00 1:14a Markd +// fixed fakeplayer again +// +// 32 7/13/00 9:18p Markd +// added behind_nopitch camera type +// +// 31 7/05/00 3:22p Markd +// Added movecontrol_gotcoolobject +// +// 30 6/28/00 3:56p Markd +// added additional camera views +// +// 29 6/28/00 3:12p Steven +// Added CacheStatemap. +// +// 28 6/17/00 3:48p Aldie +// +// 27 6/14/00 3:50p Markd +// Cleaned up more Intel Compiler warnings +// +// 26 6/10/00 1:50p Steven +// Added statemap caching. +// +// 25 6/08/00 9:54a Markd +// added camera behind_fixed +// +// 24 6/04/00 6:52p Markd +// Added camera support to TouchAnim's cleaned up player camera interface +// +// 23 4/29/00 11:28a Markd +// removed old rope code, cleaned up rope interface +// +// 22 4/08/00 3:55p Steven +// Made it so any parameter that has spaces in it addes quotes around the token +// in readCommands. +// +// 21 4/07/00 2:05p Markd +// added MOVETYPE_PIPEHANG +// +// 20 4/07/00 1:53p Aldie +// Fix for process commands on state changes +// +// 19 3/31/00 3:18p Markd +// Added Movetype USEOBJECT +// +// 18 2/25/00 7:27p Markd +// Added useanim_numloop support and fixed useanim_orientation +// +// 17 2/24/00 4:16p Jimdose +// added MOVECONTROL_CROUCH +// +// 16 2/24/00 3:25p Jimdose +// made parsing of cameratype and movetype to be table based +// added check for valid class when parsing behavior. +// +// 15 2/22/00 4:55p Steven +// A small fix to make sure entry and exit commands can take the parameter "" +// and process it correctly. +// +// 14 2/22/00 1:56p Jimdose +// added MOVECONTROL_PUSH +// +// 13 2/17/00 12:00p Aldie +// Added command processing to state system with the addition of entrycommands +// and exitcommands. +// +// 12 2/14/00 5:44p Jimdose +// added MOVECONTROL_LEGS +// changed calls to Q_stricmp to Str::icmp +// +// 11 2/09/00 3:53p Steven +// Made it so the CHANCE conditional doesn't get merged with others. +// +// 10 2/08/00 11:34a Steven +// Added picking up of Shgliek. +// +// 9 2/08/00 12:17a Jimdose +// made rope grabbing controlled by state system +// +// 8 1/28/00 6:21p Jimdose +// added rope movecontrol types +// +// 7 1/22/00 4:05p Jimdose +// added MOVECONTROL_PIPECRAWL and MOVECONTROL_STEPUP +// +// 6 1/17/00 10:20p Jimdose +// Rewrote state system initialization. Made conditionals defined with array. +// Made Evaluate functions early exit +// +// 5 12/14/18 2:43p Jimdose +// added monkeybar movetype +// +// 4 12/10/99 6:10p Jimdose +// added MOVECONTROL_WALLHUG +// +// 3 9/20/99 6:58p Steven +// Cleanup +// +// 2 9/13/99 3:30p Jimdose +// merge +// +// 1 9/10/99 10:53a Jimdose +// +// 1 9/08/99 3:15p Aldie +// +// 16 9/02/99 3:25p Steven +// Reset next times when changing states. +// +// 15 8/31/99 5:47p Jimdose +// fixed bug with frame number conditions +// +// 14 8/28/99 5:22p Steven +// Added a wait time between each conditional check (defaults to 0). +// +// 13 8/16/99 10:30a Steven +// Added a time command to the state machine for AI use. +// +// 12 8/11/99 8:57p Jimdose +// fixed isStatic +// +// 11 8/11/99 7:27p Jimdose +// added hanging movetype +// +// 10 8/10/99 4:44p Steven +// Fixed a bug when getting condition parameters. +// +// 9 8/10/99 4:24p Aldie +// Added parmlist to conditional parameters +// +// 8 8/10/99 3:18p Steven +// Fixed a bug when getting the behavior arguement. +// +// 7 8/10/99 2:45p Steven +// Added parms to state checks and behavior commands from state machine. +// +// 6 8/10/99 10:49a Jimdose +// added MOVECONTROL_ABSOLUTE +// +// 5 8/06/99 6:53p Jimdose +// added ConditionalAnimationFrame +// +// 4 8/05/99 9:14a Steven +// New AI stuff. +// +// 3 7/06/99 8:33p Jimdose +// removed unused player code +// added state machine for player animation +// +// 2 7/01/99 12:25a Jimdose +// debugged code +// +// 1 6/30/99 7:25p Jimdose +// Created file +// +// DESCRIPTION: +// + +#include "characterstate.h" +#include "animate.h" +#include "scriptmaster.h" + +static const char *MoveControl_Names[] = + { + "user", // MOVECONTROL_USER + "legs", // MOVECONTROL_LEGS + "anim", // MOVECONTROL_ANIM + "absolute", // MOVECONTROL_ABSOLUTE + "hanging", // MOVECONTROL_HANGING + "wallhug", // MOVECONTROL_WALLHUG + "monkeybars", // MOVECONTROL_MONKEYBARS + "pipecrawl", // MOVECONTROL_PIPECRAWL + "pipehang", // MOVECONTROL_PIPEHANG + "stepup", // MOVECONTROL_STEPUP + "rope_grab", // MOVECONTROL_ROPE_GRAB + "rope_release", // MOVECONTROL_ROPE_RELEASE + "rope_move", // MOVECONTROL_ROPE_MOVE + "pickupenemy", // MOVECONTROL_PICKUPENEMY + "push", // MOVECONTROL_PUSH + "climbwall", // MOVECONTROL_CLIMBWALL + "useanim", // MOVECONTROL_USEANIM + "crouch", // MOVECONTROL_CROUCH + "loopuseanim", // MOVECONTROL_LOOPUSEANIM + "useobject", // MOVECONTROL_USEOBJECT + "coolobject", // MOVECONTROL_COOLOBJECT + "fakeplayer", // MOVECONTROL_FAKEPLAYER + NULL + }; + +static const char *Camera_Names[] = + { + "topdown", // CAMERA_TOPDOWN + "behind", // CAMERA_BEHIND + "front", // CAMERA_FRONT + "side", // CAMERA_SIDE + "behind_fixed", // CAMERA_BEHIND_FIXED + "side_left", // CAMERA_SIDE_LEFT + "side_right", // CAMERA_SIDE_RIGHT + "behind_nopitch", // CAMERA_BEHIND_NOPITCH + NULL + }; + +Conditional::Conditional + ( + Condition &cond + ) : condition( cond ) + + { + result = false; + previous_result = false; + checked = false; + } + +Expression::Expression() + { + } + +Expression::Expression + ( + Expression &exp + ) + + { + int i; + + value = exp.value; + + for( i = 1; i <= exp.conditions.NumObjects(); i++ ) + { + conditions.AddObject( exp.conditions.ObjectAt( i ) ); + } + } + +Expression::Expression + ( + Script &script, + State &state + ) + + { + str token; + condition_t condition; + int start; + + value = script.GetToken( true ); + + if ( !script.TokenAvailable( false ) || Q_stricmp( script.GetToken( false ), ":" ) ) + { + gi.Error( ERR_DROP, "%s: Expecting ':' on line %d.\n", script.Filename(), script.GetLineNumber() ); + } + + while( script.TokenAvailable( false ) ) + { + token = script.GetToken( true ); + + switch( token[ 0 ] ) + { + case '!' : + condition.test = TC_ISFALSE; + start = 1; + break; + + case '+' : + condition.test = TC_EDGETRUE; + start = 1; + break; + + case '-' : + condition.test = TC_EDGEFALSE; + start = 1; + break; + + default : + condition.test = TC_ISTRUE; + start = 0; + } + + if ( token.length() <= start ) + { + gi.Error( ERR_DROP, "%s: Illegal syntax '%s' on line %d.\n", script.Filename(), &token, script.GetLineNumber() ); + condition.condition_index = 0; + continue; + } + + condition.condition_index = state.addCondition( &token[ start ], script ); + if ( !condition.condition_index ) + { + gi.Error( ERR_DROP, "%s: Unknown condition '%s' on line %d.\n", script.Filename(), &token[ start ], script.GetLineNumber() ); + } + + conditions.AddObject( condition ); + } + } + +bool Expression::getResult + ( + State &state, + Entity &ent, + Container *sent_conditionals + ) + + { + int i; + condition_t *cond; + Conditional *conditional; + + for( i = 1; i <= conditions.NumObjects(); i++ ) + { + cond = &conditions.ObjectAt( i ); + conditional = sent_conditionals->ObjectAt( cond->condition_index ); + + if ( !conditional || !conditional->getResult( cond->test, ent ) ) + { + return false; + } + } + + return true; + } + +void State::readNextState + ( + Script &script + ) + + { + nextState = script.GetToken( false ); + } + +void State::readMoveType + ( + Script &script + ) + + { + str token; + const char **name; + int i; + + token = script.GetToken( false ); + + for( i = 0, name = MoveControl_Names; *name != NULL; name++, i++ ) + { + if ( !token.icmp( *name ) ) + { + break; + } + } + + if ( *name == NULL ) + { + gi.Error( ERR_DROP, "%s: Unknown movetype '%s' on line %d.\n", script.Filename(), token.c_str(), script.GetLineNumber() ); + } + else + { + movetype = ( movecontrol_t )i; + } + } + +qboolean State::setCameraType + ( + str ctype + ) + + { + const char **name; + int i; + + for( i = 0, name = Camera_Names; *name != NULL; name++, i++ ) + { + if ( !ctype.icmp( *name ) ) + { + cameratype = ( cameratype_t )i; + return qtrue; + } + } + return qfalse; + } + + +void State::readCamera + ( + Script &script + ) + + { + str token; + + token = script.GetToken( false ); + + if ( !setCameraType( token ) ) + { + gi.Error( ERR_DROP, "%s: Unknown camera type '%s' on line %d.\n", script.Filename(), token.c_str(), script.GetLineNumber() ); + } + } + +void State::readLegs + ( + Script &script + ) + + { + str token; + + if ( !script.TokenAvailable( true ) || Q_stricmp( script.GetToken( true ), "{" ) ) + { + gi.Error( ERR_DROP, "%s: Expecting '{' on line %d.\n", script.Filename(), script.GetLineNumber() ); + } + + while( script.TokenAvailable( true ) ) + { + token = script.GetToken( true ); + if ( !Q_stricmp( token.c_str(), "}" ) ) + { + break; + } + + script.UnGetToken(); + legAnims.AddObject( Expression( script, *this ) ); + } + } + +void State::readTorso + ( + Script &script + ) + + { + str token; + + if ( !script.TokenAvailable( true ) || Q_stricmp( script.GetToken( true ), "{" ) ) + { + gi.Error( ERR_DROP, "%s: Expecting '{' on line %d.\n", script.Filename(), script.GetLineNumber() ); + } + + while( script.TokenAvailable( true ) ) + { + token = script.GetToken( true ); + if ( !Q_stricmp( token.c_str(), "}" ) ) + { + break; + } + + script.UnGetToken(); + torsoAnims.AddObject( Expression( script, *this ) ); + } + } + +void State::readBehavior + ( + Script &script + ) + + { + str token; + + if ( !script.TokenAvailable( true ) ) + { + gi.Error( ERR_DROP, "%s: Expecting behavior name on line %d.\n", script.Filename(), script.GetLineNumber() ); + } + + behaviorName = script.GetToken( true ); + if ( !getClass( behaviorName ) ) + { + gi.Error( ERR_DROP, "%s: Unknown behavior '%s' on line %d.\n", script.Filename(), behaviorName.c_str(), script.GetLineNumber() ); + } + + // Read in the behavior arguments if there are any + + while ( script.TokenAvailable( false ) && script.AtString( false ) ) + { + token = script.GetToken( false ); + addBehaviorParm( token ); + } + } + +void State::readTime + ( + Script &script + ) + + { + str token; + + + if ( script.TokenAvailable( false ) && script.AtString( false ) ) + { + token = script.GetToken( false ); + minTime = atof( token.c_str() ); + } + + if ( script.TokenAvailable( false ) && script.AtString( false ) ) + { + token = script.GetToken( false ); + maxTime = atof( token.c_str() ); + } + else + { + maxTime = minTime; + } + } + +void State::readStates + ( + Script &script + ) + + { + str token; + + if ( !script.TokenAvailable( true ) || Q_stricmp( script.GetToken( true ), "{" ) ) + { + gi.Error( ERR_DROP, "%s: Expecting '{' on line %d.\n", script.Filename(), script.GetLineNumber() ); + } + + while( script.TokenAvailable( true ) ) + { + token = script.GetToken( true ); + if ( !Q_stricmp( token.c_str(), "}" ) ) + { + break; + } + + script.UnGetToken(); + states.AddObject( Expression( script, *this ) ); + } + } + +void State::ParseAndProcessCommand + ( + str command, + Entity *target + ) + + { + int argc; + const char *argv[ MAX_COMMANDS ]; + char args[ MAX_COMMANDS ][ MAXTOKEN ]; + Script script; + Event *event; + + script.Parse( command, command.length(), "CommandString" ); + + argc = 0; + while( script.TokenAvailable( false ) ) + { + if ( argc >= MAX_COMMANDS ) + { + gi.DPrintf( "State:ParseAndProcessCommand : Line exceeds %d command limit", MAX_COMMANDS ); + script.SkipToEOL(); + break; + } + strcpy( args[ argc ], script.GetToken( false ) ); + argv[ argc ] = args[ argc ]; + argc++; + } + + assert( argc > 0 ); + + if ( argc <= 0 ) + return; + + event = new Event( args[0] ); + event->AddTokens( argc - 1, &argv[ 1 ] ); + target->ProcessEvent( event ); + } + +void State::ProcessEntryCommands + ( + Entity *target + ) + + { + int i,count; + str command; + + assert( target ); + if ( !target ) + { + return; + } + + count = entryCommands.NumObjects(); + for( i = 1; i <= count; i++ ) + { + ParseAndProcessCommand( entryCommands.ObjectAt( i ), target ); + } + } + +void State::ProcessExitCommands + ( + Entity *target + ) + + { + int i,count; + str command; + + assert( target ); + if ( !target ) + { + return; + } + + count = exitCommands.NumObjects(); + for( i = 1; i <= count; i++ ) + { + ParseAndProcessCommand( exitCommands.ObjectAt( i ), target ); + } + } + +void State::readCommands + ( + Script &script, + Container &container + ) + + { + str token; + str command; + + if ( !script.TokenAvailable( true ) || Q_stricmp( script.GetToken( true ), "{" ) ) + { + gi.Error( ERR_DROP, "%s: Expecting '{' on line %d.\n", script.Filename(), script.GetLineNumber() ); + } + + while( script.TokenAvailable( true ) ) + { + while( script.TokenAvailable( false ) ) + { + token = script.GetToken( true ); + if ( !Q_stricmp( token.c_str(), "}" ) ) + { + goto out; + } + if ( token.length() ) + { + if ( strstr( token.c_str(), " " ) == NULL ) + { + command.append( token ); + } + else + { + command.append( "\"" ); + command.append( token ); + command.append( "\"" ); + } + } + else + { + command.append( "\"\"" ); + } + + command.append( " " ); + } + container.AddObject( command ); + command = ""; + } +out: + return; + } + +State *State::Evaluate + ( + Entity &ent, + Container *sent_conditionals + ) + + { + int i; + Expression *exp; + State *state; + int index; + + for( i = 1; i <= condition_indexes.NumObjects(); i++ ) + { + index = condition_indexes.ObjectAt( i ); + sent_conditionals->ObjectAt( index )->clearCheck(); + //conditions.ObjectAt( i )->clearCheck(); + } + + for( i = 1; i <= states.NumObjects(); i++ ) + { + exp = &states.ObjectAt( i ); + if ( exp->getResult( *this, ent, sent_conditionals ) ) + { + state = statemap.FindState( exp->getValue() ); + return state; + } + } + + return this; + } + +const char *State::getLegAnim + ( + Entity &ent, + Container *sent_conditionals + ) + + { + int i; + Expression *exp; + int index; + + for( i = 1; i <= condition_indexes.NumObjects(); i++ ) + { + index = condition_indexes.ObjectAt( i ); + sent_conditionals->ObjectAt( index )->clearCheck(); + //conditions.ObjectAt( i )->clearCheck(); + } + + for( i = 1; i <= legAnims.NumObjects(); i++ ) + { + exp = &legAnims.ObjectAt( i ); + if ( exp->getResult( *this, ent, sent_conditionals ) ) + { + return exp->getValue(); + } + } + + return ""; + } + +const char *State::getTorsoAnim + ( + Entity &ent, + Container *sent_conditionals + ) + + { + int i; + Expression *exp; + int index; + + for( i = 1; i <= condition_indexes.NumObjects(); i++ ) + { + index = condition_indexes.ObjectAt( i ); + sent_conditionals->ObjectAt( index )->clearCheck(); + } + + for( i = 1; i <= torsoAnims.NumObjects(); i++ ) + { + exp = &torsoAnims.ObjectAt( i ); + if ( exp->getResult( *this, ent, sent_conditionals ) ) + { + return exp->getValue(); + } + } + + return ""; + } + +const char *State::getBehaviorName + ( + void + ) + + { + return behaviorName.c_str(); + } + +float State::getMinTime + ( + void + ) + + { + return minTime; + } + +float State::getMaxTime + ( + void + ) + + { + return maxTime; + } + +int State::addCondition + ( + const char *name, + Script &script + ) + + { + Conditional *condition; + Condition *cond; + int index; + + str token; + + condition = NULL; + cond = statemap.getCondition( name ); + if ( !cond ) + { + return NULL; + } + + condition = new Conditional( *cond ); + + // Get the paramaters + while ( script.TokenAvailable( false ) && script.AtString( false ) ) + { + token = script.GetToken( false ); + condition->addParm( token ); + } + + // only add a new conditional if a similar on doesn't exist + index = statemap.findConditional( condition ); + + if ( index ) + { + // delete the one we just made + delete condition; + } + else + { + index = statemap.addConditional( condition ); + } + + condition_indexes.AddUniqueObject( index ); + + return index; + } + +void State::CheckStates + ( + void + ) + + { + const char *value; + int i; + + if ( !statemap.FindState( nextState.c_str() ) ) + { + gi.Error( ERR_DROP, "Unknown next state '%s' referenced in state '%s'.\n", nextState.c_str(), getName() ); + } + + for( i = 1; i <= states.NumObjects(); i++ ) + { + value = states.ObjectAt( i ).getValue(); + if ( !statemap.FindState( value ) ) + { + gi.Error( ERR_DROP, "Unknown state '%s' referenced in state '%s'.\n", value, getName() ); + } + } + } + +void State::GetLegAnims + ( + Container *c + ) + + { + int i,j; + qboolean addobj = true; + + for ( i=1; i<=legAnims.NumObjects(); i++ ) + { + const char *value = legAnims.ObjectAt( i ).getValue(); + addobj = true; + + // Check to see if it's already in there + for ( j=1; j<=c->NumObjects(); j++ ) + { + if ( !stricmp( c->ObjectAt( j ), value ) ) + { + addobj = false; + break; + } + } + if ( addobj ) + c->AddObject( value ); + } + } + +void State::GetTorsoAnims + ( + Container *c + ) + + { + int i,j; + qboolean addobj = true; + + for ( i=1; i<=torsoAnims.NumObjects(); i++ ) + { + const char *value = torsoAnims.ObjectAt( i ).getValue(); + addobj = true; + + // Check to see if it's already in there + for ( j=1; j<=c->NumObjects(); j++ ) + { + if ( !stricmp( c->ObjectAt( j ), value ) ) + { + addobj = false; + break; + } + } + if ( addobj ) + c->AddObject( value ); + } + } + +State::State + ( + const char *statename, + Script &script, + StateMap &map + ) : statemap( map ) + + { + str cmd; + + name = statename; + nextState = statename; + movetype = DEFAULT_MOVETYPE; + cameratype = DEFAULT_CAMERA; + behaviorName = "idle"; + + minTime = -1.0; + maxTime = -1.0; + + if ( !script.TokenAvailable( true ) || Q_stricmp( script.GetToken( true ), "{" ) ) + { + gi.Error( ERR_DROP, "%s: Expecting '{' on line %d.\n", script.Filename(), script.GetLineNumber() ); + } + + while( script.TokenAvailable( true ) ) + { + cmd = script.GetToken( true ); + if ( !cmd.icmp( "nextstate" ) ) + { + readNextState( script ); + } + else if ( !cmd.icmp( "movetype" ) ) + { + readMoveType( script ); + } + else if ( !cmd.icmp( "camera" ) ) + { + readCamera( script ); + } + else if ( !cmd.icmp( "legs" ) ) + { + readLegs( script ); + } + else if ( !cmd.icmp( "torso" ) ) + { + readTorso( script ); + } + else if ( !cmd.icmp( "behavior" ) ) + { + readBehavior( script ); + } + else if ( !cmd.icmp( "time" ) ) + { + readTime( script ); + } + else if ( !cmd.icmp( "states" ) ) + { + readStates( script ); + } + else if ( !cmd.icmp( "entrycommands" ) ) + { + readCommands( script, entryCommands ); + } + else if ( !cmd.icmp( "exitcommands" ) ) + { + readCommands( script, exitCommands ); + } + else if ( !cmd.icmp( "}" ) ) + { + break; + } + else + { + gi.Error( ERR_DROP, "%s: Unknown command '%s' on line %d.\n", script.Filename(), cmd.c_str(), script.GetLineNumber() ); + } + } + } + +StateMap::StateMap + ( + const char *file_name, + Condition *conditions, + Container *conditionals + ) + + { + str cmd; + str statename; + Script script; + State *state; + int i; + + assert( file_name ); + + filename = file_name; + + this->current_conditions = conditions; + + this->current_conditionals = conditionals; + + script.LoadFile( filename ); + + while( script.TokenAvailable( true ) ) + { + cmd = script.GetToken( true ); + if ( !cmd.icmp( "state" ) ) + { + statename = script.GetToken( false ); + if ( FindState( statename.c_str() ) ) + { + gi.Error( ERR_DROP, "%s: Duplicate definition of state '%s' on line %d.\n", filename, statename.c_str(), script.GetLineNumber() ); + } + + // parse the state even if we already have it defined + state = new State( statename.c_str(), script, *this ); + stateList.AddObject( state ); + } + else + { + gi.Error( ERR_DROP, "%s: Unknown command '%s' on line %d.\n", script.Filename(), cmd.c_str(), script.GetLineNumber() ); + } + } + + // Have all the states check themselves to see if they reference any non-existant states. + for( i = 1; i <= stateList.NumObjects(); i++ ) + { + stateList.ObjectAt( i )->CheckStates(); + } + } + +StateMap::~StateMap() + { + int i,num; + + num = stateList.NumObjects(); + for( i=num; i>0; i-- ) + { + delete stateList.ObjectAt( i ); + } + stateList.FreeObjectList(); + } + +Condition *StateMap::getCondition + ( + const char *name + ) + + { + Condition *c; + + if ( current_conditions ) + { + for( c = current_conditions; c->name; c++ ) + { + if ( !strcmp( c->name, name ) ) + { + return c; + } + } + } + + return NULL; + } + +int StateMap::findConditional + ( + Conditional *condition + ) + + { + int i; + int j; + Conditional *c; + bool found; + + + // Check for the one special case where we don't want to merge the conditionals + + if ( strcmp( condition->getName(), "CHANCE" ) == 0 ) + return NULL; + + for( i = 1; i <= current_conditionals->NumObjects(); i++ ) + { + c = current_conditionals->ObjectAt( i ); + if ( ( c->getName() == condition->getName() ) && ( c->numParms() == condition->numParms() ) ) + { + found = true; + for( j = 1; j <= c->numParms(); j++ ) + { + if ( strcmp( c->getParm( j ), condition->getParm( j ) ) ) + { + found = false; + break; + } + } + + if ( found ) + { + return i; + } + } + } + + return 0; + } + +int StateMap::addConditional + ( + Conditional *condition + ) + + { + int index; + index = current_conditionals->AddObject( condition ); + + return index; + } + +Conditional *StateMap::getConditional + ( + const char *name + ) + + { + int i; + Conditional *c; + Condition *condition; + + for( i = 1; i <= current_conditionals->NumObjects(); i++ ) + { + c = current_conditionals->ObjectAt( i ); + if ( !strcmp( c->getName(), name ) ) + { + return c; + } + } + + condition = getCondition( name ); + + c = new Conditional( *condition ); + current_conditionals->AddObject( c ); + + return c; + } + +State *StateMap::FindState + ( + const char *name + ) + + { + int i; + + for( i = 1; i <= stateList.NumObjects(); i++ ) + { + if ( !strcmp( stateList.ObjectAt( i )->getName(), name ) ) + { + return stateList.ObjectAt( i ); + } + } + + return NULL; + } + +// Caching statemaps + +struct cached_statemap_t + { + StateMap *statemap; + Container *conditionals; + }; + +Container cached_statemaps; + +StateMap *GetStatemap + ( + str filename, + Condition *conditions, + Container *conditionals, + qboolean reload, + qboolean cache_only + ) + + { + int i; + int j; + cached_statemap_t *cache = NULL; + cached_statemap_t new_cache; + qboolean found = false; + Conditional *new_conditional; + Conditional *old_conditional; + Condition *cond; + + for( i = 1 ; i <= cached_statemaps.NumObjects() ; i++ ) + { + cache = &cached_statemaps.ObjectAt( i ); + + if ( strcmp( cache->statemap->Filename(), filename.c_str() ) == 0 ) + { + found = true; + break; + } + } + + if ( found && reload ) + { + delete cache->statemap; + delete cache->conditionals; + + cache->conditionals = new Container; + cache->statemap = new StateMap( filename, conditions, cache->conditionals ); + } + + if ( !found ) + { + new_cache.conditionals = new Container; + new_cache.statemap = new StateMap( filename, conditions, new_cache.conditionals ); + + cached_statemaps.AddObject( new_cache ); + + cache = &new_cache; + } + + // Copy conditionals over + + if ( !cache_only ) + { + for( i = 1 ; i <= cache->conditionals->NumObjects() ; i++ ) + { + old_conditional = cache->conditionals->ObjectAt( i ); + + cond = cache->statemap->getCondition( old_conditional->condition.name ); + + new_conditional = new Conditional( *cond ); + + for( j = 1 ; j <= old_conditional->parmList.NumObjects() ; j++ ) + { + new_conditional->parmList.AddObject( old_conditional->parmList.ObjectAt( j ) ); + } + + conditionals->AddObject( new_conditional ); + } + } + + return cache->statemap; + } + +void CacheStatemap + ( + str filename, + Condition *conditions + ) + + { + GetStatemap( filename, conditions, NULL, false, true ); + } + +void StateMap::GetAllAnims + ( + Container *c + ) + + { + int i; + + for( i = 1; i <= stateList.NumObjects(); i++ ) + { + stateList.ObjectAt( i )->GetLegAnims( c ); + stateList.ObjectAt( i )->GetTorsoAnims( c ); + } + } + +void ClearCachedStatemaps + ( + void + ) + + { + int i,j,num2; + cached_statemap_t *cache; + + num2 = cached_statemaps.NumObjects(); + + for( i=num2 ; i>0; i-- ) + { + cache = &cached_statemaps.ObjectAt( i ); + + delete cache->statemap; + + int num = cache->conditionals->NumObjects(); + for ( j=num; j>0; j-- ) + { + Conditional *cond = cache->conditionals->ObjectAt( j ); + delete cond; + } + delete cache->conditionals; + } + + cached_statemaps.FreeObjectList(); + } \ No newline at end of file diff --git a/source/source/fgame/characterstate.h b/source/source/fgame/characterstate.h new file mode 100644 index 0000000..5955352 --- /dev/null +++ b/source/source/fgame/characterstate.h @@ -0,0 +1,543 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/characterstate.h $ +// $Revision:: 29 $ +// $Date:: 7/25/00 11:32p $ +// +// Copyright (C) 1999 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/characterstate.h $ +// +// 29 7/25/00 11:32p Aldie +// Made some changes to the memory system and fixed a memory allocation bug in +// Z_TagMalloc. Also changed a lot of classes to subclass from Class. +// +// 28 7/21/00 1:14a Markd +// fixed fakeplayer again +// +// 27 7/13/00 9:18p Markd +// added behind_nopitch camera type +// +// 26 7/05/00 3:22p Markd +// Added movecontrol_gotcoolobject +// +// 25 6/28/00 3:56p Markd +// added additional camera views +// +// 24 6/28/00 3:12p Steven +// Added CacheStatemap. +// +// 23 6/17/00 3:48p Aldie +// +// 22 6/10/00 1:50p Steven +// Added statemap caching. +// +// 21 6/08/00 9:55a Markd +// added camera_type behind_fixed +// +// 20 6/04/00 6:52p Markd +// Added camera support to TouchAnim's cleaned up player camera interface +// +// 19 4/29/00 11:28a Markd +// removed old rope code, cleaned up rope interface +// +// 18 4/07/00 2:05p Markd +// added MOVETYPE_PIPEHANG +// +// 17 3/31/00 3:18p Markd +// Added Movetype USEOBJECT +// +// 16 2/25/00 7:27p Markd +// Added useanim_numloop support and fixed useanim_orientation +// +// 15 2/24/00 4:16p Jimdose +// added MOVECONTROL_CROUCH +// +// 14 2/24/00 3:25p Jimdose +// made parsing of cameratype and movetype to be table based +// added check for valid class when parsing behavior. +// +// 13 2/22/00 1:56p Jimdose +// added MOVECONTROL_PUSH +// +// 12 2/17/00 12:00p Aldie +// Added command processing to state system with the addition of entrycommands +// and exitcommands. +// +// 11 2/14/00 5:37p Jimdose +// added MOVECONTROL_LEGS +// +// 10 2/08/00 11:34a Steven +// Added picking up of Shgliek. +// +// 9 2/08/00 12:17a Jimdose +// made rope grabbing controlled by state system +// +// 8 1/28/00 6:21p Jimdose +// added rope movecontrol types +// +// 7 1/22/00 4:05p Jimdose +// added MOVECONTROL_PIPECRAWL and MOVECONTROL_STEPUP +// +// 6 1/17/00 10:20p Jimdose +// Rewrote state system initialization. Made conditionals defined with array. +// Made Evaluate functions early exit +// +// 5 1/15/00 4:13p Markd +// Changed MOVETYPE_ABSOLUTE to have collision and no user input of the angles +// +// 4 12/14/18 2:43p Jimdose +// added monkeybar movetype +// +// 3 12/10/99 6:10p Jimdose +// added MOVECONTROL_WALLHUG +// +// 2 9/20/99 6:58p Steven +// Cleanup +// +// 1 9/10/99 10:53a Jimdose +// +// 1 9/08/99 3:15p Aldie +// +// 15 9/02/99 3:26p Steven +// Reset next times when changing states. +// +// 14 8/31/99 5:48p Jimdose +// fixed bug with frame number conditions +// +// 13 8/30/99 11:06a Steven +// Fixed a bug with the new timing stuff. +// +// 12 8/28/99 5:23p Steven +// Added a wait time between each conditional check (defaults to 0). +// +// 11 8/17/99 4:51p Jimdose +// got rid of default parameter on getParm +// added error checking to getParm +// +// 10 8/16/99 10:31a Steven +// Added a time command to the state machine for AI use and moved +// ConditionalParameter back into Conditional. +// +// 9 8/11/99 7:27p Jimdose +// added MOVECONTROL_HANGING +// +// 8 8/10/99 4:23p Aldie +// Added parmlist to conditional parameters +// +// 7 8/10/99 2:45p Steven +// Added parms to state checks and behavior commands from state machine. +// +// 6 8/10/99 10:48a Jimdose +// added MOVECONTROL_ABSOLUTE +// +// 5 8/06/99 6:53p Jimdose +// added ConditionalAnimationFrame +// +// 4 8/05/99 9:16a Steven +// New AI stuff. +// +// 3 7/06/99 8:33p Jimdose +// removed unused player code +// added state machine for player animation +// +// 2 7/01/99 12:25a Jimdose +// debugged code +// +// 1 6/30/99 7:25p Jimdose +// Created file +// +// DESCRIPTION: +// + +#ifndef __CHARACTERSTATE_H__ +#define __CHARACTERSTATE_H__ + +#include "g_local.h" +#include "script.h" + +enum testcondition_t + { + TC_ISTRUE, // no prefix + TC_ISFALSE, // ! + TC_EDGETRUE, // + + TC_EDGEFALSE // - + }; + +enum movecontrol_t + { + MOVECONTROL_USER, // Quake style + MOVECONTROL_LEGS, // Quake style, legs state system active + MOVECONTROL_ANIM, // move based on animation, with full collision testing + MOVECONTROL_ABSOLUTE, // move based on animation, with full collision testing but no turning + MOVECONTROL_HANGING, // move based on animation, with full collision testing, hanging + MOVECONTROL_WALLHUG, // move based on animation, with full collision testing, hanging + MOVECONTROL_MONKEYBARS, // move based on animation, with full collision testing, monkey bars + MOVECONTROL_PIPECRAWL, // move based on animation, with full collision testing, crawling on pipe + MOVECONTROL_PIPEHANG, // move based on animation, with full collision testing, hanging from pipe + MOVECONTROL_STEPUP, + MOVECONTROL_ROPE_GRAB, + MOVECONTROL_ROPE_RELEASE, + MOVECONTROL_ROPE_MOVE, + MOVECONTROL_PICKUPENEMY, + MOVECONTROL_PUSH, + MOVECONTROL_CLIMBWALL, + MOVECONTROL_USEANIM, + MOVECONTROL_CROUCH, + MOVECONTROL_LOOPUSEANIM, + MOVECONTROL_USEOBJECT, + MOVECONTROL_COOLOBJECT, + MOVECONTROL_FAKEPLAYER + }; + +enum cameratype_t + { + CAMERA_TOPDOWN, + CAMERA_BEHIND, + CAMERA_FRONT, + CAMERA_SIDE, + CAMERA_BEHIND_FIXED, + CAMERA_SIDE_LEFT, + CAMERA_SIDE_RIGHT, + CAMERA_BEHIND_NOPITCH + }; + +#define DEFAULT_MOVETYPE MOVECONTROL_LEGS +#define DEFAULT_CAMERA CAMERA_BEHIND + +class Conditional; + +template< class Type > +struct Condition + { + const char *name; + qboolean ( Type::*func )( Conditional &condition ); + }; + +class Conditional : public Class + { + private : + qboolean result; + qboolean previous_result; + bool checked; + + public : + Condition condition; + Container parmList; + + bool getResult( testcondition_t test, Entity &ent ); + const char *getName( void ); + + Conditional( Condition &condition ); + + const char *getParm( int number ); + void addParm( str parm ); + int numParms( void ); + void clearCheck( void ); + }; + +inline void Conditional::addParm + ( + str parm + ) + + { + parmList.AddObject( parm ); + } + +inline const char *Conditional::getParm + ( + int number + ) + + { + if ( ( number < 1 ) || ( number > parmList.NumObjects() ) ) + { + gi.Error( ERR_DROP, "Parm #%d out of range on %s condition\n", number, condition.name ); + } + return parmList.ObjectAt( number ).c_str(); + } + +inline int Conditional::numParms + ( + void + ) + + { + return parmList.NumObjects(); + } + +inline void Conditional::clearCheck + ( + void + ) + + { + checked = false; + } + +inline const char *Conditional::getName + ( + void + ) + + { + return condition.name; + } + +inline bool Conditional::getResult + ( + testcondition_t test, + Entity &ent + ) + + { + if ( condition.func && !checked ) + { + checked = true; + previous_result = result; + + result = ( ent.*condition.func )( *this ); + } + + switch( test ) + { + case TC_ISFALSE : + return !result; + break; + + case TC_EDGETRUE : + return result && !previous_result; + break; + + case TC_EDGEFALSE : + return !result && previous_result; + break; + + case TC_ISTRUE : + default : + return result != qfalse; + } + } + +class State; +class StateMap; + +class Expression : public Class + { + private : + struct condition_t + { + testcondition_t test; + int condition_index; + }; + + str value; + Container conditions; + + public : + Expression(); + Expression( Expression &exp ); + Expression( Script &script, State &state ); + + void operator=( Expression &exp ); + + bool getResult( State &state, Entity &ent, Container *sent_conditionals ); + const char *getValue( void ); + }; + +inline void Expression::operator= + ( + Expression &exp + ) + + { + int i; + + value = exp.value; + + conditions.FreeObjectList(); + for( i = 1; i <= exp.conditions.NumObjects(); i++ ) + { + conditions.AddObject( exp.conditions.ObjectAt( i ) ); + } + } + +inline const char *Expression::getValue + ( + void + ) + + { + return value.c_str(); + } + +class State : public Class + { + private : + Container condition_indexes; + + StateMap &statemap; + + str name; + + str nextState; + movecontrol_t movetype; + cameratype_t cameratype; + + str behaviorName; + Container behaviorParmList; + + float minTime; + float maxTime; + + Container legAnims; + Container torsoAnims; + + Container states; + Container entryCommands; + Container exitCommands; + + void readNextState( Script &script ); + void readMoveType( Script &script ); + void readCamera( Script &script ); + void readLegs( Script &script ); + void readTorso( Script &script ); + void readBehavior( Script &script ); + void readTime( Script &script ); + void readStates( Script &script ); + void readCommands( Script &script, Container &container ); + + void ParseAndProcessCommand( str command, Entity *target ); + + public : + State( const char *name, Script &script, StateMap &map ); + + State *Evaluate( Entity &ent, Container *ent_conditionals ); + int addCondition( const char *name, Script &script ); + void CheckStates( void ); + + const char *getName( void ); + + const char *getLegAnim( Entity &ent, Container *sent_conditionals ); + const char *getTorsoAnim( Entity &ent, Container *sent_conditionals ); + const char *getBehaviorName( void ); + State *getNextState( void ); + movecontrol_t getMoveType( void ); + cameratype_t getCameraType( void ); + qboolean setCameraType( str ctype ); + + const char *getBehaviorParm( int number=1 ); + void addBehaviorParm( str parm ); + int numBehaviorParms( void ); + + float getMinTime( void ); + float getMaxTime( void ); + void ProcessEntryCommands( Entity *target ); + void ProcessExitCommands( Entity *target ); + void GetLegAnims( Container *c ); + void GetTorsoAnims( Container *c ); + }; + +inline void State::addBehaviorParm + ( + str parm + ) + + { + behaviorParmList.AddObject( parm ); + } + +inline const char *State::getBehaviorParm + ( + int number + ) + + { + return behaviorParmList.ObjectAt( number ).c_str(); + } + +inline int State::numBehaviorParms + ( + void + ) + + { + return behaviorParmList.NumObjects(); + } + +class StateMap : public Class + { + private : + Container stateList; + Condition *current_conditions; + Container *current_conditionals; + str filename; + + public : + StateMap( const char *filename, Condition *conditions, Container *conditionals ); + ~StateMap(); + + Condition *getCondition( const char *name ); + int findConditional( Conditional *condition ); + int addConditional( Conditional *condition ); + Conditional *getConditional( const char *name ); + void GetAllAnims( Container *c ); + State *FindState( const char *name ); + const char *Filename(); + }; + +inline const char *StateMap::Filename + ( + void + ) + + { + return filename.c_str(); + } + +inline const char *State::getName + ( + void + ) + + { + return name.c_str(); + } + +inline State *State::getNextState + ( + void + ) + + { + return statemap.FindState( nextState.c_str() ); + } + +inline movecontrol_t State::getMoveType + ( + void + ) + + { + return movetype; + } + +inline cameratype_t State::getCameraType + ( + void + ) + + { + return cameratype; + } + +void ClearCachedStatemaps( void ); +StateMap *GetStatemap( str filename, Condition *conditions, Container *conditionals, qboolean reload, qboolean cache_only = false ); +void CacheStatemap( str filename, Condition *conditions ); + +#endif /* !__CHARACTERSTATE_H__ */ diff --git a/source/source/fgame/class.cpp b/source/source/fgame/class.cpp new file mode 100644 index 0000000..c5c278d --- /dev/null +++ b/source/source/fgame/class.cpp @@ -0,0 +1,1035 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/cgame/class.cpp $ +// $Revision:: 17 $ +// $Author:: Aldie $ +// $Date:: 8/10/00 6:34p $ +// +// Copyright (C) 1997 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/cgame/class.cpp $ +// +// 17 8/10/00 6:34p Aldie +// Added a shutdown method +// +// 16 7/26/00 1:07p Steven +// Made it so in classes new function NULL is returned if we try to allocate 0 +// bytes. +// +// 15 7/07/00 6:57p Markd +// changed default debug printf when starting up event system +// +// 14 5/24/00 3:14p Markd +// first phase of save/load games +// +// 13 4/29/00 3:50p Markd +// added some convenience classes and printed out classID when appropriate +// +// 12 4/29/00 3:26p Markd +// fleshed out the rest of the event/class documentation +// +// 11 4/29/00 11:38a Markd +// changed formatting for dump all classes +// +// 10 4/26/00 7:55p Markd +// Added more documentation code into various systems +// +// 9 4/12/00 6:19p Aldie +// Fixed formatting +// +// 8 3/04/00 11:45a Markd +// Added malloc and free for cgame and client +// +// 7 2/26/00 3:27p Markd +// pre-initialized all memory with known bad value +// +// 6 2/04/00 11:20a Markd +// Added memory leak test code to new and delete operators +// +// 5 1/10/00 5:34p Markd +// Changed Allocation routines for fgame to use the gi.Malloc and gi.Free +// instead of the in game heap +// +// 4 12/15/99 11:45a Markd +// made Event's Classes and also freed up safe pointers at the appropriate +// times +// +// 3 10/05/99 2:03p Markd +// Added warning about files being in multiple projects +// +// 2 9/28/99 4:26p Markd +// merged listener, class and vector between 3 projects +// +// 1 9/10/99 10:53a Jimdose +// +// 1 9/08/99 3:15p Aldie +// +// DESCRIPTION: +// Base class that all classes that are used in conjunction with Sin should +// be based off of. Class gives run-time type information about any class +// derived from it. This is really handy when you have a pointer to an object +// that you need to know if it supports certain behaviour. +// +// WARNING: This file is shared between fgame, cgame and possibly the user interface. +// It is instanced in each one of these directories because of the way that SourceSafe works. +// + +#include +#include +#include + +#if defined( GAME_DLL ) + +#include "g_local.h" + +#elif defined ( CGAME_DLL ) + +#include "cg_local.h" +#include "listener.h" +#include "../qcommon/qcommon.h" + +#else + +#include "listener.h" +#include "../qcommon/qcommon.h" + +#endif + +#include "class.h" +#include "linklist.h" + +int totalmemallocated = 0; +int numclassesallocated = 0; + +static ClassDef *classlist = NULL; + + +ClassDef::ClassDef() + { + this->classname = NULL; + this->classID = NULL; + this->superclass = NULL; + this->responses = NULL, + this->numEvents = 0; + this->responseLookup = NULL; + this->newInstance = NULL; + this->classSize = 0; + this->super = NULL; + this->prev = this; + this->next = this; + } + +ClassDef::ClassDef + ( + const char *classname, + const char *classID, + const char *superclass, + ResponseDef *responses, + void *( *newInstance )( void ), + int classSize + ) + + { + ClassDef *node; + + if ( classlist == NULL ) + { + classlist = new ClassDef; + } + + this->classname = classname; + this->classID = classID; + this->superclass = superclass; + this->responses = responses; + this->numEvents = 0; + this->responseLookup = NULL; + this->newInstance = newInstance; + this->classSize = classSize; + this->super = getClass( superclass ); + + // It's not uncommon for classes to not have a class id, so just set it + // to an empty string so that we're not checking for it all the time. + if ( !classID ) + { + this->classID = ""; + } + + // Check if any subclasses were initialized before their superclass + for( node = classlist->next; node != classlist; node = node->next ) + { + if ( ( node->super == NULL ) && ( !Q_stricmp( node->superclass, this->classname ) ) && + ( Q_stricmp( node->classname, "Class" ) ) ) + { + node->super = this; + } + } + + // Add to front of list + LL_Add( classlist, this, prev, next ); + } + +void ClassDef::Shutdown + ( + void + ) + + { + if ( responseLookup ) + { + delete[] responseLookup; + responseLookup = NULL; + } + } + +ClassDef::~ClassDef() + { + ClassDef *node; + + if ( classlist != this ) + { + LL_Remove( this, prev, next ); + + // Check if any subclasses were initialized before their superclass + for( node = classlist->next; node != classlist; node = node->next ) + { + if ( node->super == this ) + { + node->super = NULL; + } + } + } + else + { + // If the head of the list is deleted before the list is cleared, then we may have problems + assert( this->next == this->prev ); + } + + if ( responseLookup ) + { + delete[] responseLookup; + responseLookup = NULL; + } + } + +void ClassDef::BuildResponseList + ( + void + ) + + { + ClassDef *c; + ResponseDef *r; + int ev; + int i; + qboolean *set; + int num; + + if ( responseLookup ) + { + delete[] responseLookup; + responseLookup = NULL; + } + + num = Event::NumEventCommands(); + responseLookup = ( Response ** )new char[ sizeof( Response * ) * num ]; + memset( responseLookup, 0, sizeof( Response * ) * num ); + + set = new qboolean[ num ]; + memset( set, 0, sizeof( qboolean ) * num ); + + this->numEvents = num; + + for( c = this; c != NULL; c = c->super ) + { + r = c->responses; + if ( r ) + { + for( i = 0; r[ i ].event != NULL; i++ ) + { + ev = ( int )*r[ i ].event; + if ( !set[ ev ] ) + { + set[ ev ] = true; + if ( r[ i ].response ) + { + responseLookup[ ev ] = &r[ i ].response; + } + else + { + responseLookup[ ev ] = NULL; + } + } + } + } + } + + delete[] set; + } + +void BuildEventResponses + ( + void + ) + + { + ClassDef *c; + int amount; + int numclasses; + + amount = 0; + numclasses = 0; + for( c = classlist->next; c != classlist; c = c->next ) + { + c->BuildResponseList(); + + amount += c->numEvents * sizeof( Response * ); + numclasses++; + } + + CLASS_DPrintf( "\n------------------\nEvent system initialized: " + "%d classes %d events %d total memory in response list\n\n", + numclasses, Event::NumEventCommands(), amount ); + } + +ClassDef *getClassForID + ( + const char *name + ) + + { + ClassDef *c; + + for( c = classlist->next; c != classlist; c = c->next ) + { + if ( c->classID && !Q_stricmp( c->classID, name ) ) + { + return c; + } + } + + return NULL; + } + +ClassDef *getClass + ( + const char *name + ) + + { + ClassDef *c; + + for( c = classlist->next; c != classlist; c = c->next ) + { + if ( !Q_stricmp( c->classname, name ) ) + { + return c; + } + } + + return NULL; + } + +ClassDef *getClassList + ( + void + ) + + { + return classlist; + } + +void listAllClasses + ( + void + ) + + { + ClassDef *c; + + for( c = classlist->next; c != classlist; c = c->next ) + { + CLASS_DPrintf( "%s\n", c->classname ); + } + } + +void listInheritanceOrder + ( + const char *classname + ) + + { + ClassDef *cls; + ClassDef *c; + + cls = getClass( classname ); + if ( !cls ) + { + CLASS_DPrintf( "Unknown class: %s\n", classname ); + return; + } + for( c = cls; c != NULL; c = c->super ) + { + CLASS_DPrintf( "%s\n", c->classname ); + } + } + +qboolean checkInheritance + ( + ClassDef *superclass, + ClassDef *subclass + ) + + { + ClassDef *c; + + for( c = subclass; c != NULL; c = c->super ) + { + if ( c == superclass ) + { + return true; + } + } + return false; + } + +qboolean checkInheritance + ( + ClassDef *superclass, + const char *subclass + ) + + { + ClassDef *c; + + c = getClass( subclass ); + if ( c == NULL ) + { + CLASS_DPrintf( "Unknown class: %s\n", subclass ); + return false; + } + return checkInheritance( superclass, c ); + } + +qboolean checkInheritance + ( + const char *superclass, + const char *subclass + ) + + { + ClassDef *c1; + ClassDef *c2; + + c1 = getClass( superclass ); + c2 = getClass( subclass ); + if ( c1 == NULL ) + { + CLASS_DPrintf( "Unknown class: %s\n", superclass ); + return false; + } + if ( c2 == NULL ) + { + CLASS_DPrintf( "Unknown class: %s\n", subclass ); + return false; + } + return checkInheritance( c1, c2 ); + } + +void CLASS_Print( FILE *class_file, const char *fmt, ... ) + { + va_list argptr; + char text[ 1024 ]; + + va_start( argptr, fmt ); + vsprintf( text, fmt, argptr ); + va_end( argptr ); + + if ( class_file ) + fprintf( class_file, text ); + else + CLASS_DPrintf( text ); + } + + +CLASS_DECLARATION( NULL, Class, NULL ) + { + { NULL, NULL } + }; + +#ifdef NDEBUG + +void * Class::operator new( size_t s ) + { + int *p; + + if ( s == 0 ) + return NULL; + + s += sizeof( int ); +#if defined( GAME_DLL ) + p = ( int * )gi.Malloc( s ); +#elif defined( CGAME_DLL ) + p = ( int * )cgi.Malloc( s ); +#else + p = ( int * )Z_TagMalloc( s, TAG_CLIENT ); +#endif + *p = s; + totalmemallocated += s; + numclassesallocated++; + return p + 1; + } + +void Class::operator delete( void *ptr ) + { + int *p; + + p = ( ( int * )ptr ) - 1; + totalmemallocated -= *p; + numclassesallocated--; +#if defined( GAME_DLL ) + gi.Free( p ); +#elif defined( CGAME_DLL ) + cgi.Free( p ); +#else + Z_Free( p ); +#endif + } + +#else + +#ifdef MEMORY_LEAK_TEST +int classindex = 0; +#endif + +void * Class::operator new( size_t s ) + { + int *p; + + s += sizeof( int ) * 3; +#if defined( GAME_DLL ) + p = ( int * )gi.Malloc( s ); +#elif defined( CGAME_DLL ) + p = ( int * )cgi.Malloc( s ); +#else + p = ( int * )Z_TagMalloc( s, TAG_CLIENT ); +#endif + // set memory to a known wrong number + memset( p, 0xaa, s ); +#ifdef MEMORY_LEAK_TEST + p[ 0 ] = classindex++; +#else + p[ 0 ] = 0x12348765; +#endif + *( int * )( ((byte *)p) + s - sizeof( int ) ) = 0x56784321; + p[ 1 ] = s; + totalmemallocated += s; + numclassesallocated++; + return p + 2; + } + +void Class::operator delete( void *ptr ) + { + int *p; + + p = ( ( int * )ptr ) - 2; +#ifndef MEMORY_LEAK_TEST + assert( p[ 0 ] == 0x12348765 ); +#endif + assert( *( int * )( ((byte *)p) + p[ 1 ] - sizeof( int ) ) == 0x56784321 ); + + totalmemallocated -= p[ 1 ]; + numclassesallocated--; +#if defined( GAME_DLL ) + gi.Free( p ); +#elif defined( CGAME_DLL ) + cgi.Free( p ); +#else + Z_Free( p ); +#endif + } + +#endif + +void DisplayMemoryUsage + ( + void + ) + + { + CLASS_Printf( "Classes %-5d Class memory used: %d\n", numclassesallocated, totalmemallocated ); + } + +Class::Class() + { + SafePtrList = NULL; + } + +Class::~Class() + { + ClearSafePointers(); + } + +#ifdef GAME_DLL + +void Class::Archive + ( + Archiver &arc + ) + + { + } + +#endif + +void Class::ClearSafePointers( void ) + { + while( SafePtrList != NULL ) + { + SafePtrList->Clear(); + } + } + + +void Class::warning + ( + const char *function, + const char *fmt, + ... + ) + + { + va_list argptr; + char text[ 1024 ]; + + va_start( argptr, fmt ); + vsprintf( text, fmt, argptr ); + va_end( argptr ); + + if ( getClassID() ) + { + CLASS_DPrintf( "%s::%s : %s\n", getClassID(), function, text ); + } + else + { + CLASS_DPrintf( "%s::%s : %s\n", getClassname(), function, text ); + } + } + +void Class::error + ( + const char *function, + const char *fmt, + ... + ) + + { + va_list argptr; + char text[ 1024 ]; + + va_start( argptr, fmt ); + vsprintf( text, fmt, argptr ); + va_end( argptr ); + + if ( getClassID() ) + { + CLASS_Error( ERR_DROP, "%s::%s : %s\n", getClassID(), function, text ); + } + else + { + CLASS_Error( ERR_DROP, "%s::%s : %s\n", getClassname(), function, text ); + } + } + +qboolean Class::inheritsFrom + ( + const char *name + ) + + { + ClassDef *c; + + c = getClass( name ); + if ( c == NULL ) + { + CLASS_DPrintf( "Unknown class: %s\n", name ); + return false; + } + return checkInheritance( c, classinfo() ); + } + +qboolean Class::isInheritedBy + ( + const char *name + ) + + { + ClassDef *c; + + c = getClass( name ); + if ( c == NULL ) + { + CLASS_DPrintf( "Unknown class: %s\n", name ); + return false; + } + return checkInheritance( classinfo(), c ); + } + +const char *Class::getClassname + ( + void + ) + + { + ClassDef *cls; + + cls = classinfo(); + return cls->classname; + } + +const char *Class::getClassID + ( + void + ) + + { + ClassDef *cls; + + cls = classinfo(); + return cls->classID; + } + +const char *Class::getSuperclass + ( + void + ) + + { + ClassDef *cls; + + cls = classinfo(); + return cls->superclass; + } + +void *Class::newInstance + ( + void + ) + + { + ClassDef *cls; + + cls = classinfo(); + return cls->newInstance(); + } + +#define MAX_INHERITANCE 64 +void ClassEvents + ( + const char *classname, + qboolean print_to_disk + ) + + { + ClassDef *c; + ResponseDef *r; + int ev; + int i, j; + qboolean *set; + int num, orderNum; + Event **events; + byte *order; + FILE *class_file; + str classNames[ MAX_INHERITANCE ]; + str class_filename; + + c = getClass( classname ); + if ( !c ) + { + CLASS_DPrintf( "Unknown class: %s\n", classname ); + return; + } + + class_file = NULL; + + if ( print_to_disk ) + { + class_filename = str ( classname ) + ".txt"; + class_file = fopen( class_filename.c_str(), "w" ); + if ( class_file == NULL ) + return; + } + + num = Event::NumEventCommands(); + + set = new qboolean[ num ]; + memset( set, 0, sizeof( qboolean ) * num ); + + events = new Event *[ num ]; + memset( events, 0, sizeof( Event * ) * num ); + + order = new byte[ num ]; + memset( order, 0, sizeof( byte ) * num ); + + orderNum = 0; + for( ; c != NULL; c = c->super ) + { + if ( orderNum < MAX_INHERITANCE ) + { + classNames[ orderNum ] = c->classname; + } + r = c->responses; + if ( r ) + { + for( i = 0; r[ i ].event != NULL; i++ ) + { + ev = ( int )*r[ i ].event; + if ( !set[ ev ] ) + { + set[ ev ] = true; + + if ( r[ i ].response ) + { + events[ ev ] = r[ i ].event; + order[ ev ] = orderNum; + } + } + } + } + orderNum++; + } + + CLASS_Print( class_file, "********************************************************\n" ); + CLASS_Print( class_file, "********************************************************\n" ); + CLASS_Print( class_file, "* All Events For Class: %s\n", classname ); + CLASS_Print( class_file, "********************************************************\n" ); + CLASS_Print( class_file, "********************************************************\n\n" ); + + for( j = orderNum - 1; j >= 0; j-- ) + { + CLASS_Print( class_file, "\n********************************************************\n" ); + CLASS_Print( class_file, "* Class: %s\n", classNames[ j ].c_str() ); + CLASS_Print( class_file, "********************************************************\n\n" ); + for( i = 1; i < num; i++ ) + { + int index; + + index = Event::MapSortedEventIndex( i ); + if ( events[ index ] && ( order[ index ] == j ) ) + { + Event::PrintEventDocumentation( events[ index ], class_file ); + } + } + } + + if ( class_file != NULL ) + { + CLASS_DPrintf( "Printed class info to file %s\n", class_filename.c_str() ); + fclose( class_file ); + } + + delete[] events; + delete[] order; + delete[] set; + } + +static int dump_numclasses; +static int dump_numevents; +void DumpClass + ( + FILE * class_file, + const char * className + ) + + { + ClassDef *c; + ResponseDef *r; + int ev; + int i; + int num; + Event **events; + + c = getClass( className ); + if ( !c ) + { + return; + } + + num = Event::NumEventCommands(); + + events = new Event *[ num ]; + memset( events, 0, sizeof( Event * ) * num ); + + // gather event responses for this class + r = c->responses; + if ( r ) + { + for( i = 0; r[ i ].event != NULL; i++ ) + { + ev = ( int )*r[ i ].event; + if ( r[ i ].response ) + { + events[ ev ] = r[ i ].event; + } + } + } + + CLASS_Print( class_file, "\n"); + if ( c->classID[ 0 ] ) + { + CLASS_Print( class_file, "

    %s (%s)", c->classname, c->classname, c->classID ); + } + else + { + CLASS_Print( class_file, "

    %s", c->classname, c->classname ); + } + + // print out lineage + for( c = c->super; c != NULL; c = c->super ) + { + CLASS_Print( class_file, " -> %s", c->classname, c->classname ); + } + CLASS_Print( class_file, "

    \n"); + + dump_numclasses++; + + CLASS_Print( class_file, "
    \n"); + for( i = 1; i < num; i++ ) + { + int index; + + index = Event::MapSortedEventIndex( i ); + if ( events[ index ] ) + { + Event::PrintEventDocumentation( events[ index ], class_file, qtrue ); + dump_numevents++; + } + } + CLASS_Print( class_file, "
    \n"); + delete[] events; + } + + +#define MAX_CLASSES 1024 +void DumpAllClasses + ( + void + ) + + { + int i, j, num, smallest; + ClassDef *c; + FILE * class_file; + str class_filename; + str class_title; + str classes[ MAX_CLASSES ]; + +#if defined( GAME_DLL ) + class_filename = "g_allclasses.html"; + class_title = "Game Module"; +#elif defined( CGAME_DLL ) + class_filename = "cg_allclasses.html"; + class_title = "Client Game Module"; +#else + class_filename = "cl_allclasses.html"; + class_title = "Client Module"; +#endif + + class_file = fopen( class_filename.c_str(), "w" ); + if ( class_file == NULL ) + return; + + // construct the HTML header for the document + CLASS_Print( class_file, "\n"); + CLASS_Print( class_file, "\n"); + CLASS_Print( class_file, "%s Classes\n", class_title.c_str() ); + CLASS_Print( class_file, "\n"); + CLASS_Print( class_file, "\n"); + CLASS_Print( class_file, "

    \n"); + CLASS_Print( class_file, "
    %s Classes
    \n", class_title.c_str() ); + CLASS_Print( class_file, "

    \n"); +#if defined( GAME_DLL ) + // + // print out some commonly used classnames + // + CLASS_Print( class_file, "

    " ); + CLASS_Print( class_file, "Actor, " ); + CLASS_Print( class_file, "Animate, " ); + CLASS_Print( class_file, "Entity, " ); + CLASS_Print( class_file, "ScriptSlave, " ); + CLASS_Print( class_file, "ScriptThread, " ); + CLASS_Print( class_file, "Sentient, " ); + CLASS_Print( class_file, "Trigger, " ); + CLASS_Print( class_file, "World" ); + CLASS_Print( class_file, "

    " ); +#endif + + dump_numclasses = 0; + dump_numevents = 0; + + // get all the classes + num = 0; + for( c = classlist->next; c != classlist; c = c->next ) + { + if ( num < MAX_CLASSES ) + { + classes[ num++ ] = c->classname; + } + } + + // go through and process each class from smallest to greatest + for( i = 0; i < num; i++ ) + { + smallest = -1; + for( j = 0; j < num; j++ ) + { + if ( classes[ j ].length() > 1 ) + { + if ( smallest >= 0 ) + { + if ( classes[ j ].icmp( classes[ smallest ] ) < 0 ) + { + smallest = j; + } + } + else + { + smallest = j; + } + } + } + DumpClass( class_file, classes[ smallest ] ); + // delete the name from the list + classes[ smallest ] = ""; + } + + if ( class_file != NULL ) + { + CLASS_Print( class_file, "

    \n"); + CLASS_Print( class_file, "%d %s Classes.
    %d %s Events.\n", dump_numclasses, class_title.c_str(), dump_numevents, class_title.c_str() ); + CLASS_Print( class_file, "

    \n"); + CLASS_Print( class_file, "\n"); + CLASS_Print( class_file, "\n"); + CLASS_DPrintf( "Dumped all classes to file %s\n", class_filename.c_str() ); + fclose( class_file ); + } + + } + + +void ShutdownClasses + ( + void + ) + + { + ClassDef *c; + + for( c = classlist->next; c != classlist; c = c->next ) + { + c->Shutdown(); + } + } diff --git a/source/source/fgame/class.h b/source/source/fgame/class.h new file mode 100644 index 0000000..71f3171 --- /dev/null +++ b/source/source/fgame/class.h @@ -0,0 +1,511 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/client/class.h $ +// $Revision:: 13 $ +// $Author:: Aldie $ +// $Date:: 8/10/00 9:27p $ +// +// Copyright (C) 1997 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/client/class.h $ +// +// 13 8/10/00 9:27p Aldie +// Fixing memory leaks +// +// 12 8/10/00 6:34p Aldie +// Added a shutdown method +// +// 11 6/14/00 12:14p Markd +// more intel compiler bug fixes +// +// 10 6/14/00 11:18a Markd +// cleaned up code using Intel compiler +// +// 9 5/26/00 7:44p Markd +// 2nd phase save games +// +// 8 5/25/00 4:28p Markd +// fixed up archive functions +// +// 7 5/24/00 3:14p Markd +// first phase of save/load games +// +// 6 4/26/00 7:55p Markd +// Added more documentation code into various systems +// +// 5 3/16/00 10:50a Markd +// Fixed some bad syntax in headers that exhibited itself in non-visualc +// compilers +// +// 4 12/15/99 11:45a Markd +// made Event's Classes and also freed up safe pointers at the appropriate +// times +// +// 3 10/05/99 2:03p Markd +// Added warning about files being in multiple projects +// +// 2 9/28/99 4:26p Markd +// merged listener, class and vector between 3 projects +// +// 1 9/10/99 10:53a Jimdose +// +// 1 9/08/99 3:15p Aldie +// +// 6 8/27/99 3:31p Markd +// externed totalmemallocated +// +// DESCRIPTION: +// Base class that all classes that are used in conjunction with Sin should +// be based off of. Class gives run-time type information about any class +// derived from it. This is really handy when you have a pointer to an object +// that you need to know if it supports certain behaviour. +// +// WARNING: This file is shared between fgame, cgame and possibly the user interface. +// It is instanced in each one of these directories because of the way that SourceSafe works. +// + +#ifndef __CLASS_H__ +#define __CLASS_H__ + +#if defined( GAME_DLL ) +// +// game dll specific defines +// +#include "g_local.h" +#include "linklist.h" + +#define CLASS_DPrintf gi.DPrintf +#define CLASS_Printf gi.Printf +#define CLASS_Error gi.Error + +class Archiver; + +#elif defined ( CGAME_DLL ) +// +// cgame dll specific defines +// +#include "../fgame/q_shared.h" +#include "linklist.h" + +#define CLASS_DPrintf cgi.DPrintf +#define CLASS_Printf cgi.Printf +#define CLASS_Error cgi.Error + +#else + +// +// client specific defines +// +#include "../fgame/q_shared.h" +#include "linklist.h" + +#define CLASS_DPrintf Com_DPrintf +#define CLASS_Printf Com_Printf +#define CLASS_Error Com_Error +#endif + +class Class; +class Event; + +typedef void ( Class::*Response )( Event *event ); + +template< class Type > +struct ResponseDef + { + Event *event; + void ( Type::*response )( Event *event ); + }; + +/*********************************************************************** + + ClassDef + +***********************************************************************/ + +class ClassDef + { + public: + const char *classname; + const char *classID; + const char *superclass; + void *( *newInstance )( void ); + int classSize; + ResponseDef *responses; + int numEvents; + Response **responseLookup; + ClassDef *super; + ClassDef *next; + ClassDef *prev; + + ClassDef(); + ~ClassDef(); + ClassDef( const char *classname, const char *classID, const char *superclass, + ResponseDef *responses, void *( *newInstance )( void ), int classSize ); + void BuildResponseList( void ); + void Shutdown( void ); + }; + +/*********************************************************************** + + SafePtr + +***********************************************************************/ + +class SafePtrBase; + +class Class; + +class SafePtrBase + { + private: + void AddReference( Class *ptr ); + void RemoveReference( Class *ptr ); + + protected: + SafePtrBase *prevSafePtr; + SafePtrBase *nextSafePtr; + Class *ptr; + + public: + SafePtrBase(); + virtual ~SafePtrBase(); + void InitSafePtr( Class *newptr ); + Class *Pointer( void ); + void Clear( void ); + }; + +/*********************************************************************** + + Class + +***********************************************************************/ + +#define CLASS_DECLARATION( nameofsuperclass, nameofclass, classid ) \ + ClassDef nameofclass::ClassInfo \ + ( \ + #nameofclass, classid, #nameofsuperclass, \ + ( ResponseDef * )nameofclass::Responses, \ + nameofclass::_newInstance, sizeof( nameofclass ) \ + ); \ + void *nameofclass::_newInstance( void ) \ + { \ + return new nameofclass; \ + } \ + ClassDef *nameofclass::classinfo( void ) \ + { \ + return &( nameofclass::ClassInfo ); \ + } \ + ResponseDef nameofclass::Responses[] = + +#define CLASS_PROTOTYPE( nameofclass ) \ + public: \ + static ClassDef ClassInfo; \ + static void *_newInstance( void ); \ + virtual ClassDef *classinfo( void ); \ + static ResponseDef Responses[] + +class Class + { + private: + SafePtrBase *SafePtrList; + friend class SafePtrBase; + + protected: + void ClearSafePointers( void ); + + public: + CLASS_PROTOTYPE( Class ); + void * operator new( size_t ); + void operator delete( void * ); + + Class(); + virtual ~Class(); + void warning( const char *function, const char *fmt, ... ); + void error( const char *function, const char *fmt, ... ); + qboolean inheritsFrom( ClassDef *c ); + qboolean inheritsFrom( const char *name ); + qboolean isInheritedBy( const char *name ); + qboolean isInheritedBy( ClassDef *c ); + const char *getClassname( void ); + const char *getClassID( void ); + const char *getSuperclass( void ); + void *newInstance( void ); + +#ifdef GAME_DLL + virtual void Archive( Archiver &arc ); +#endif + }; + +void BuildEventResponses( void ); +ClassDef *getClassForID( const char *name ); +ClassDef *getClass( const char *name ); +ClassDef *getClassList( void ); +void listAllClasses( void ); +void listInheritanceOrder( const char *classname ); +qboolean checkInheritance( ClassDef *superclass, ClassDef *subclass ); +qboolean checkInheritance( ClassDef *superclass, const char *subclass ); +qboolean checkInheritance( const char *superclass, const char *subclass ); +void DisplayMemoryUsage( void ); +void ClassEvents( const char *classname, qboolean dump = qfalse ); +void DumpAllClasses( void ); + +inline qboolean Class::inheritsFrom + ( + ClassDef *c + ) + + { + return checkInheritance( c, classinfo() ); + } + +inline qboolean Class::isInheritedBy + ( + ClassDef *c + ) + + { + return checkInheritance( classinfo(), c ); + } + +// The lack of a space between the ")" and "inheritsFrom" is intentional. +// It allows the macro to compile like a function call. However, this +// may cause problems in some compilers (like gcc), so we may have to +// change this to work like a normal macro with the object passed in +// as a parameter to the macro. +#define isSubclassOf( classname )inheritsFrom( &classname::ClassInfo ) +#define isSuperclassOf( classname )isInheritedBy( &classname::ClassInfo ) + +/*********************************************************************** + + SafePtr + +***********************************************************************/ + +inline void SafePtrBase::AddReference + ( + Class *ptr + ) + + { + if ( !ptr->SafePtrList ) + { + ptr->SafePtrList = this; + LL_Reset( this, nextSafePtr, prevSafePtr ); + } + else + { + LL_Add( ptr->SafePtrList, this, nextSafePtr, prevSafePtr ); + } + } + +inline void SafePtrBase::RemoveReference + ( + Class *ptr + ) + + { + if ( ptr->SafePtrList == this ) + { + if ( ptr->SafePtrList->nextSafePtr == this ) + { + ptr->SafePtrList = NULL; + } + else + { + ptr->SafePtrList = nextSafePtr; + LL_Remove( this, nextSafePtr, prevSafePtr ); + } + } + else + { + LL_Remove( this, nextSafePtr, prevSafePtr ); + } + } + +inline void SafePtrBase::Clear + ( + void + ) + + { + if ( ptr ) + { + RemoveReference( ptr ); + ptr = NULL; + } + } + +inline SafePtrBase::SafePtrBase() + { + prevSafePtr = NULL; + nextSafePtr = NULL; + ptr = NULL; + } + +inline SafePtrBase::~SafePtrBase() + { + Clear(); + } + +inline Class * SafePtrBase::Pointer + ( + void + ) + + { + return ptr; + } + +inline void SafePtrBase::InitSafePtr + ( + Class *newptr + ) + + { + if ( ptr != newptr ) + { + if ( ptr ) + { + RemoveReference( ptr ); + } + + ptr = newptr; + if ( ptr == NULL ) + { + return; + } + + AddReference( ptr ); + } + } + +template +class SafePtr : public SafePtrBase + { + public: + SafePtr( T* objptr = 0 ); + SafePtr( const SafePtr& obj ); + + SafePtr& operator=( const SafePtr& obj ); + SafePtr& operator=( T * const obj ); + + friend int operator==( SafePtr a, T *b ); + friend int operator!=( SafePtr a, T *b ); + friend int operator==( T *a, SafePtr b ); + friend int operator!=( T *a, SafePtr b ); + + operator T*() const; + T* operator->() const; + T& operator*() const; + }; + +template +inline SafePtr::SafePtr( T* objptr ) + { + InitSafePtr( objptr ); + } + +template +inline SafePtr::SafePtr( const SafePtr& obj ) + { + InitSafePtr( obj.ptr ); + } + +template +inline SafePtr& SafePtr::operator=( const SafePtr& obj ) + { + InitSafePtr( obj.ptr ); + return *this; + } + +template +inline SafePtr& SafePtr::operator=( T * const obj ) + { + InitSafePtr( obj ); + return *this; + } + +template +inline int operator== + ( + SafePtr a, + T* b + ) + + { + return a.ptr == b; + } + +template +inline int operator!= + ( + SafePtr a, + T* b + ) + + { + return a.ptr != b; + } + +template +inline int operator== + ( + T* a, + SafePtr b + ) + + { + return a == b.ptr; + } + +template +inline int operator!= + ( + T* a, + SafePtr b + ) + + { + return a != b.ptr; + } + +template +inline SafePtr::operator T*() const + { + return ( T * )ptr; + } + +template +inline T* SafePtr::operator->() const + { + return ( T * )ptr; + } + +template +inline T& SafePtr::operator*() const + { + return *( T * )ptr; + } + +typedef SafePtr ClassPtr; + +#ifdef GAME_DLL +#include "archive.h" +#endif + +// used by listener for event allocation +extern int totalmemallocated; + +#ifndef GAME_DLL +extern "C" + { + // interface functions + void ShutdownClasses( void ); + } +#endif + +#endif /* class.h */ diff --git a/source/source/fgame/clusterbomb.cpp b/source/source/fgame/clusterbomb.cpp new file mode 100644 index 0000000..a35aa07 --- /dev/null +++ b/source/source/fgame/clusterbomb.cpp @@ -0,0 +1,143 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/clusterbomb.cpp $ +// $Revision:: 5 $ +// $Author:: Steven $ +// $Date:: 6/29/00 2:03p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/clusterbomb.cpp $ +// +// 5 6/29/00 2:03p Steven +// Improved cluster bombs a little. +// +// 4 6/23/00 8:41p Markd +// made a lot of changes to different constructors for saved game support +// +// 3 6/08/00 6:26p Aldie +// Put in the explode anim +// +// 2 6/07/00 4:16p Aldie +// Added clusterbombs, heatseeking, and drunk +// +// DESCRIPTION: +// Clusterbomb + +#include "clusterbomb.h" + +Event EV_ClusterBomb_Think + ( + "_think", + EV_DEFAULT, + NULL, + NULL, + "Clusterbomb think function" + ); +Event EV_ClusterBomb_ClusterModel + ( + "clustermodel", + EV_DEFAULT, + "s", + "modelname", + "The model of the bombs that are spawned when the main bomb explodes" + ); +Event EV_ClusterBomb_ClusterCount + ( + "clustercount", + EV_DEFAULT, + "i", + "count", + "The number of clusters to spawn" + ); + +CLASS_DECLARATION( Projectile, ClusterBomb, NULL ) + { + { &EV_ClusterBomb_Think, Think }, + { &EV_ClusterBomb_ClusterCount, ClusterCount }, + { &EV_ClusterBomb_ClusterModel, ClusterModel }, + { NULL, NULL } + }; + +ClusterBomb::ClusterBomb + ( + ) + + { + if ( LoadingSavegame ) + { + return; + } + + m_clustercount = 5; + // Make the clusterbomb think each frame + PostEvent( EV_ClusterBomb_Think, level.frametime ); + } + +void ClusterBomb::Think + ( + Event *ev + ) + + { + CancelEventsOfType( EV_ClusterBomb_Think ); + PostEvent( EV_ClusterBomb_Think, level.frametime ); + + // Explode if we start moving down + if ( velocity.z < 0 ) + { + Explode( NULL ); + } + } + +void ClusterBomb::ClusterModel + ( + Event *ev + ) + + { + m_clustermodel = ev->GetString( 1 ); + } + +void ClusterBomb::ClusterCount + ( + Event *ev + ) + + { + m_clustercount = ev->GetInteger( 1 ); + } + +void ClusterBomb::Explode + ( + Event *ev + ) + + { + int i; + Vector dir; + + CancelEventsOfType( EV_ClusterBomb_Think ); + + // Spawn clusters from the point of explosion + for ( i=0; iorigin, dir, this, m_clustermodel, 1.0, velocity.length() ); + } + + velocity = Vector( 0,0,0 ); + setMoveType( MOVETYPE_NONE ); + RandomAnimate( "explode" ); + + PostEvent( EV_Remove, 1 ); + } diff --git a/source/source/fgame/clusterbomb.h b/source/source/fgame/clusterbomb.h new file mode 100644 index 0000000..191ebb0 --- /dev/null +++ b/source/source/fgame/clusterbomb.h @@ -0,0 +1,63 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/clusterbomb.h $ +// $Revision:: 4 $ +// $Author:: Aldie $ +// $Date:: 7/14/00 10:42a $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/clusterbomb.h $ +// +// 4 7/14/00 10:42a Aldie +// Added archive function +// +// 3 6/14/00 3:50p Markd +// Cleaned up more Intel Compiler warnings +// +// 2 6/07/00 4:16p Aldie +// Added clusterbombs, heatseeking, and drunk +// +// DESCRIPTION: +// Clusterbomb + +#ifndef __CLUSTERBOMB_H__ +#define __CLUSTERBOMB_H__ + +#include "weapon.h" +#include "weaputils.h" + +class ClusterBomb : public Projectile + { + private: + str m_clustermodel; + int m_clustercount; + + public: + CLASS_PROTOTYPE( ClusterBomb ); + + ClusterBomb(); + void Explode( Event *ev ); + void Think( Event *ev ); + void ClusterModel( Event *ev ); + void ClusterCount( Event *ev ); + + virtual void Archive( Archiver &arc ); + }; + +inline void ClusterBomb::Archive + ( + Archiver &arc + ) + { + Projectile::Archive( arc ); + + arc.ArchiveInteger( &m_clustercount ); + arc.ArchiveString( &m_clustermodel ); + } + +#endif // __CLUSTERBOMB_H__ diff --git a/source/source/fgame/container.cpp b/source/source/fgame/container.cpp new file mode 100644 index 0000000..1cd829d --- /dev/null +++ b/source/source/fgame/container.cpp @@ -0,0 +1,243 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/cgame/container.cpp $ +// $Revision:: 2 $ +// $Author:: Markd $ +// $Date:: 10/05/99 2:03p $ +// +// Copyright (C) 1997 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/cgame/container.cpp $ +// +// 2 10/05/99 2:03p Markd +// Added warning about files being in multiple projects +// +// 1 9/10/99 10:53a Jimdose +// +// 1 9/08/99 3:15p Aldie +// +// DESCRIPTION: +// Base class for a dynamic array. Allows adding, removing, index of, +// and finding of entries with specified value. Originally created for +// cataloging entities, but pointers to objects that may be removed at +// any time are bad to keep around, so only entity numbers should be +// used in the future. +// +// WARNING: This file is shared between fgame, cgame and possibly the user interface. +// It is instanced in each one of these directories because of the way that SourceSafe works. +// + +#if 0 + +#include "g_local.h" +#include "class.h" +#include "container.h" + +template< class Type > +Container::Container() + { + objlist = NULL; + FreeObjectList(); + } + +template< class Type > +Container::~Container() + { + FreeObjectList(); + } + +template< class Type > +void Container::FreeObjectList + ( + void + ) + + { + if ( objlist ) + { + delete objlist; + } + objlist = NULL; + numobjects = 0; + maxobjects = 0; + } + +template< class Type > +void Container::ClearObjectList + ( + void + ) + + { + if ( objlist ) + { + memset( objlist, 0, maxobjects * sizeof( Type ) ); + } + numobjects = 0; + } + +template< class Type > +int Container::NumObjects + ( + void + ) + + { + return numobjects; + } + +template< class Type > +void Container::Resize + ( + int maxelements + ) + + { + Type *temp; + + if ( !objlist ) + { + maxobjects = maxelements; + objlist = new Type[ maxobjects ]; + memset( objlist, 0, maxobjects * sizeof( Type ) ); + } + else + { + temp = objlist; + maxobjects = maxelements; + if ( maxobjects < numobjects ) + { + maxobjects = numobjects; + } + + objlist = new Type[ maxobjects ]; + memset( objlist, 0, maxobjects * sizeof( Type ) ); + memcpy( objlist, temp, numobjects * sizeof( Type ) ); + delete temp; + } + } + +template< class Type > +void Container::AddObject + ( + Type obj + ) + + { + Type *temp; + + if ( !objlist ) + { + Resize( 10 ); + } + + if ( numobjects == maxobjects ) + { + Resize( maxobjects * 2 ); + } + + objlist[ numobjects++ ] = obj; + } + +template< class Type > +int Container::IndexOfObject + ( + Type obj + ) + + { + int i; + + for( i = 0; i < numobjects; i++ ) + { + if ( objlist[ i ] == obj ) + { + return i + 1; + } + } + + return 0; + } + +template< class Type > +qboolean Container::ObjectInList + ( + Type obj + ) + + { + if ( !IndexOfObject( obj ) ) + { + return false; + } + + return true; + } + +template< class Type > +Type Container::ObjectAt + ( + int index + ) + + { + if ( ( index <= 0 ) || ( index > numobjects ) ) + { + gi.DPrintf( "Container::ObjectAt : index out of range" ); + return 0; + } + + return objlist[ index - 1 ]; + } + +template< class Type > +void Container::RemoveObjectAt + ( + int index + ) + + { + int i; + + if ( !objlist ) + { + gi.DPrintf( "Container::RemoveObjectAt : Empty list" ); + return; + } + + if ( ( index <= 0 ) || ( index > numobjects ) ) + { + gi.DPrintf( "Container::RemoveObjectAt : index out of range" ); + return; + } + + i = index - 1; + memcpy( &objlist[ i ], &objlist[ i + 1 ], ( numobjects - 1 - i ) * sizeof( Type ) ); + memset( &objlist[ numobjects - 1 ], 0, sizeof( Type ) ); + numobjects--; + } + +template< class Type > +void Container::RemoveObject + ( + Type obj + ) + + { + int index; + + index = IndexOfObject( obj ); + if ( !index ) + { + gi.DPrintf( "Container::RemoveObject : Object not in list" ); + return; + } + + RemoveObjectAt( index ); + } + +#endif \ No newline at end of file diff --git a/source/source/fgame/container.h b/source/source/fgame/container.h new file mode 100644 index 0000000..8cc7518 --- /dev/null +++ b/source/source/fgame/container.h @@ -0,0 +1,538 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/container.h $ +// $Revision:: 9 $ +// $Author:: Steven $ +// $Date:: 7/26/00 1:08p $ +// +// Copyright (C) 1997 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/container.h $ +// +// 9 7/26/00 1:08p Steven +// In ClearObjectList make sure we don't have 0 maxelements when creating a new +// array. +// +// 8 7/25/00 2:32p Aldie +// Undo checkout for new operator +// +// 7 7/25/00 2:18p Aldie +// changed the new operator for containers +// +// 6 5/26/00 7:44p Markd +// 2nd phase save games +// +// 5 1/06/00 11:18p Jimdose +// put sort back in +// +// 4 1/06/00 11:08p Jimdose +// cleaning up unused code +// +// 3 10/05/99 2:03p Markd +// Added warning about files being in multiple projects +// +// 2 9/28/99 4:26p Markd +// merged listener, class and vector between 3 projects +// +// 1 9/10/99 10:53a Jimdose +// +// 1 9/08/99 3:15p Aldie +// +// DESCRIPTION: +// Base class for a dynamic array. Allows adding, removing, index of, +// and finding of entries with specified value. NOTE: indices in container +// are 1 based, not 0. This means that loops must check from 1 up to and including +// NumObjects() (ei. for( i = 1; i <= list.NumObjects(); i++ ) ). +// +// FIXME: Someday make this 0 based and update all code to match. +// +// WARNING: This file is shared between fgame, cgame and possibly the user interface. +// It is instanced in each one of these directories because of the way that SourceSafe works. +// + +#ifndef __CONTAINER_H__ +#define __CONTAINER_H__ + +#if defined( GAME_DLL ) +// +// game dll specific defines +// +#include "g_local.h" + +#define CONTAINER_Error gi.Error +#define CONTAINER_DPrintf gi.DPrintf + +#elif defined ( CGAME_DLL ) +// +// cgame dll specific defines +// +#define CONTAINER_Error cgi.Error +#define CONTAINER_DPrintf cgi.DPrintf + +#else + +// +// client specific defines +// +#define CONTAINER_Error Com_Error +#define CONTAINER_DPrintf Com_DPrintf +#endif + +#include + +class Archiver; +template< class Type > +class Container + { + private: + Type *objlist; + int numobjects; + int maxobjects; + + public: + Container(); + ~Container(); + + void FreeObjectList( void ); + void ClearObjectList( void ); + int NumObjects( void ); + void Resize( int maxelements ); + void SetObjectAt( int index, Type& obj ); + int AddObject( Type& obj ); + int AddUniqueObject( Type& obj ); + void AddObjectAt( int index, Type& obj ); + int IndexOfObject( Type& obj ); + qboolean ObjectInList( Type& obj ); + Type& ObjectAt( int index ); + Type *AddressOfObjectAt( int index ); + void RemoveObjectAt( int index ); + void RemoveObject( Type& obj ); + void Sort( int ( __cdecl *compare )( const void *elem1, const void *elem2 ) ); +#if defined( GAME_DLL ) + void Archive( Archiver &arc ); +#endif + }; + +template< class Type > +Container::Container() + { + objlist = NULL; + FreeObjectList(); + } + +template< class Type > +Container::~Container() + { + FreeObjectList(); + } + +template< class Type > +void Container::FreeObjectList + ( + void + ) + + { + if ( objlist ) + { + delete[] objlist; + } + objlist = NULL; + numobjects = 0; + maxobjects = 0; + } + +template< class Type > +void Container::ClearObjectList + ( + void + ) + + { + // only delete the list if we have objects in it + if ( objlist && numobjects ) + { + delete[] objlist; + + if ( maxobjects == 0 ) + { + objlist = NULL; + return; + } + + objlist = new Type[ maxobjects ]; + numobjects = 0; + } + } + +template< class Type > +int Container::NumObjects + ( + void + ) + + { + return numobjects; + } + +template< class Type > +void Container::Resize + ( + int maxelements + ) + + { + Type *temp; + int i; + + assert( maxelements >= 0 ); + + if ( maxelements <= 0 ) + { + FreeObjectList(); + return; + } + + if ( !objlist ) + { + maxobjects = maxelements; + objlist = new Type[ maxobjects ]; + } + else + { + temp = objlist; + maxobjects = maxelements; + if ( maxobjects < numobjects ) + { + maxobjects = numobjects; + } + + objlist = new Type[ maxobjects ]; + for( i = 0; i < numobjects; i++ ) + { + objlist[ i ] = temp[ i ]; + } + delete[] temp; + } + } + +template< class Type > +void Container::SetObjectAt + ( + int index, + Type& obj + ) + + { + if ( ( index <= 0 ) || ( index > numobjects ) ) + { + CONTAINER_Error( ERR_DROP, "Container::SetObjectAt : index out of range" ); + } + + objlist[ index - 1 ] = obj; + } + +template< class Type > +int Container::AddObject + ( + Type& obj + ) + + { + if ( !objlist ) + { + Resize( 10 ); + } + + if ( numobjects == maxobjects ) + { + Resize( maxobjects * 2 ); + } + + objlist[ numobjects ] = obj; + numobjects++; + + return numobjects; + } + +template< class Type > +int Container::AddUniqueObject + ( + Type& obj + ) + + { + int index; + + index = IndexOfObject( obj ); + if ( !index ) + index = AddObject( obj ); + return index; + } + +template< class Type > +void Container::AddObjectAt + ( + int index, + Type& obj + ) + + { + // + // this should only be used when reconstructing a list that has to be identical to the original + // + if ( index > maxobjects ) + { + Resize( index ); + } + if ( index > numobjects ) + { + numobjects = index; + } + SetObjectAt( index, obj ); + } + +template< class Type > +int Container::IndexOfObject + ( + Type& obj + ) + + { + int i; + + for( i = 0; i < numobjects; i++ ) + { + if ( objlist[ i ] == obj ) + { + return i + 1; + } + } + + return 0; + } + +template< class Type > +qboolean Container::ObjectInList + ( + Type& obj + ) + + { + if ( !IndexOfObject( obj ) ) + { + return false; + } + + return true; + } + +template< class Type > +Type& Container::ObjectAt + ( + int index + ) + + { + if ( ( index <= 0 ) || ( index > numobjects ) ) + { + CONTAINER_Error( ERR_DROP, "Container::ObjectAt : index out of range" ); + } + + return objlist[ index - 1 ]; + } + +template< class Type > +Type * Container::AddressOfObjectAt + ( + int index + ) + + { + // + // this should only be used when reconstructing a list that has to be identical to the original + // + if ( index > maxobjects ) + { + CONTAINER_Error( ERR_DROP, "Container::AddressOfObjectAt : index is greater than maxobjects" ); + } + if ( index > numobjects ) + { + numobjects = index; + } + return &objlist[ index - 1 ]; + } + +template< class Type > +void Container::RemoveObjectAt + ( + int index + ) + + { + int i; + + if ( !objlist ) + { + CONTAINER_DPrintf( "Container::RemoveObjectAt : Empty list\n" ); + return; + } + + if ( ( index <= 0 ) || ( index > numobjects ) ) + { + CONTAINER_Error( ERR_DROP, "Container::RemoveObjectAt : index out of range" ); + return; + } + + i = index - 1; + numobjects--; + for( i = index - 1; i < numobjects; i++ ) + { + objlist[ i ] = objlist[ i + 1 ]; + } + } + +template< class Type > +void Container::RemoveObject + ( + Type& obj + ) + + { + int index; + + index = IndexOfObject( obj ); + if ( !index ) + { + CONTAINER_DPrintf( "Container::RemoveObject : Object not in list\n" ); + return; + } + + RemoveObjectAt( index ); + } + +template< class Type > +void Container::Sort + ( + int ( __cdecl *compare )( const void *elem1, const void *elem2 ) + ) + + { + if ( !objlist ) + { + CONTAINER_DPrintf( "Container::Sort : Empty list\n" ); + return; + } + + qsort( ( void * )objlist, ( size_t )numobjects, sizeof( Type ), compare ); + } + +#if 0 +#if defined( GAME_DLL ) + +#include "str.h" +void Container::Archive + ( + Archiver &arc + ) + { + int i, num; + + if ( arc.Loading() ) + { + ClearObjectList(); + arc.ArchiveInteger( &num ); + Resize( num ); + } + else + { + num = numobjects; + arc.ArchiveInteger( &num ); + } + for( i = 1; i <= num; i++ ) + { + arc.ArchiveString( AddressOfObjectAt( i ) ); + } + } + +#include "vector.h" +void Container::Archive + ( + Archiver &arc + ) + { + int i, num; + + if ( arc.Loading() ) + { + ClearObjectList(); + arc.ArchiveInteger( &num ); + Resize( num ); + } + else + { + num = numobjects; + arc.ArchiveInteger( &num ); + } + for( i = 1; i <= num; i++ ) + { + arc.ArchiveVector( AddressOfObjectAt( i ) ); + } + } + +void Container::Archive + ( + Archiver &arc + ) + { + int i, num; + + if ( arc.Loading() ) + { + ClearObjectList(); + arc.ArchiveInteger( &num ); + Resize( num ); + } + else + { + num = numobjects; + arc.ArchiveInteger( &num ); + } + for( i = 1; i <= num; i++ ) + { + arc.ArchiveInteger( AddressOfObjectAt( i ) ); + } + } + +void Container::Archive + ( + Archiver &arc + ) + { + int i, num; + + if ( arc.Loading() ) + { + ClearObjectList(); + arc.ArchiveInteger( &num ); + Resize( num ); + } + else + { + num = numobjects; + arc.ArchiveInteger( &num ); + } + for( i = 1; i <= num; i++ ) + { + arc.ArchiveFloat( AddressOfObjectAt( i ) ); + } + } + +#endif +#endif + +#endif /* container.h */ diff --git a/source/source/fgame/crossbow.cpp b/source/source/fgame/crossbow.cpp new file mode 100644 index 0000000..4689952 --- /dev/null +++ b/source/source/fgame/crossbow.cpp @@ -0,0 +1,93 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/crossbow.cpp $ +// $Revision:: 3 $ +// $Author:: Aldie $ +// $Date:: 4/08/00 2:49p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/crossbow.cpp $ +// +// 3 4/08/00 2:49p Aldie +// New crossbow bolt implementation +// +// 2 4/08/00 11:53a Aldie +// First version +// +// DESCRIPTION: +// Crossbow projectile + +#include "crossbow.h" +#include "decals.h" + +CLASS_DECLARATION( Projectile, CrossbowProjectile, NULL ) + { + { NULL, NULL } + }; + +CrossbowProjectile::CrossbowProjectile + ( + ) + + { + } + +void CrossbowProjectile::DoDecal + ( + void + ) + + { + float scale=1; + + if ( charge_fraction < 0.3 ) + { + scale = .3; + } + else if ( charge_fraction > 0.6 ) + { + scale = 1.5; + } + + if ( impactmarkshader.length() ) + { + Decal *decal = new Decal; + decal->setShader( impactmarkshader ); + decal->setOrigin( level.impact_trace.endpos ); + decal->setDirection( level.impact_trace.plane.normal ); + decal->setOrientation( impactmarkorientation ); + decal->setRadius( impactmarkradius * scale ); + } + } + +void CrossbowProjectile::Explode + ( + Event *ev + ) + + { + Entity *owner; + + // Get the owner of this projectile + owner = G_GetEntity( this->owner ); + + // If the owner's not here, make the world the owner + if ( !owner ) + owner = world; + + // When a crossbow bolt explodes, depending on the charge time it may explode + if ( explosionmodel.length() && charge_fraction > 0.3 ) + { + if ( charge_fraction > 0.6 ) + ExplosionAttack( origin, owner, explosionmodel, Vector( 0,0,0 ), NULL, 1.5 ); + else + ExplosionAttack( origin, owner, explosionmodel, Vector( 0,0,0 ), NULL ); + } + + PostEvent( EV_Remove, 0 ); + } diff --git a/source/source/fgame/crossbow.h b/source/source/fgame/crossbow.h new file mode 100644 index 0000000..b61f2df --- /dev/null +++ b/source/source/fgame/crossbow.h @@ -0,0 +1,46 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/crossbow.h $ +// $Revision:: 4 $ +// $Author:: Markd $ +// $Date:: 6/14/00 3:50p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/crossbow.h $ +// +// 4 6/14/00 3:50p Markd +// Cleaned up more Intel Compiler warnings +// +// 3 4/08/00 2:49p Aldie +// New crossbow bolt implementation +// +// 2 4/08/00 11:53a Aldie +// First version +// +// DESCRIPTION: +// Crossbow projectile + +#ifndef __CROSSBOW_H__ +#define __CROSSBOW_H__ + +#include "weapon.h" +#include "weaputils.h" + +class CrossbowProjectile : public Projectile + { + public: + CLASS_PROTOTYPE( CrossbowProjectile ); + + CrossbowProjectile(); + void Explode( Event *ev ); + void DoDecal( void ); + + }; + +#endif // __CROSSBOW_H__ + diff --git a/source/source/fgame/deadbody.cpp b/source/source/fgame/deadbody.cpp new file mode 100644 index 0000000..3765fcb --- /dev/null +++ b/source/source/fgame/deadbody.cpp @@ -0,0 +1,112 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/deadbody.cpp $ +// $Revision:: 4 $ +// $Author:: Jimdose $ +// $Date:: 12/17/99 6:35p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/deadbody.cpp $ +// +// 4 12/17/99 6:35p Jimdose +// changed spawnarg code +// added Level class for spawning and map control +// got rid of unused or superflous variables +// changed setjmp/longjmp calls to try/throw/catch exception handling +// +// 3 9/16/99 11:18a Markd +// Continuing merge of code, not functional yet but closer +// +// 2 9/13/99 4:22p Jimdose +// merge +// +// 1 9/10/99 10:53a Jimdose +// +// 1 9/08/99 3:15p Aldie +// +// DESCRIPTION: +// Dead body + +#include "deadbody.h" +#include "gibs.h" + +CLASS_DECLARATION( Sentient, Deadbody, "deadbody" ) + { + { &EV_Gib, GibEvent }, + { NULL, NULL } + }; + +void Deadbody::GibEvent + ( + Event *ev + ) + + { + takedamage = DAMAGE_NO; + + if ( sv_gibs->integer && !parentmode->integer ) + { + setSolidType( SOLID_NOT ); + hideModel(); + + CreateGibs( this, health, 1.0f, 3 ); + } + } + +void CopyToBodyQueue + ( + gentity_t *ent + ) + + { + gentity_t *body; + + // grab a body from the queue and cycle to the next one + body = &g_entities[ ( int )maxclients->integer + level.body_queue ]; + level.body_queue = ( level.body_queue + 1 ) % BODY_QUEUE_SIZE; + + gi.unlinkentity( ent ); + gi.unlinkentity( body ); + + body->s = ent->s; + body->s.number = body - g_entities; + body->svflags = ent->svflags; + body->solid = ent->solid; + body->clipmask = ent->clipmask; + body->ownerNum = ent->ownerNum; + body->entity->movetype = ent->entity->movetype; + body->entity->takedamage = DAMAGE_YES; + body->entity->deadflag = DEAD_DEAD; + body->s.renderfx &= ~RF_DONTDRAW; + body->entity->setOrigin( ent->entity->origin ); + body->entity->setSize(ent->mins,ent->maxs); + body->entity->link(); +// body->entity->SetGravityAxis( ent->entity->gravaxis ); + } + +void InitializeBodyQueue + ( + void + ) + + { + int i; + Deadbody *body; + + if ( !LoadingSavegame && deathmatch->integer ) + { + level.body_queue = 0; + for ( i=0; iedict->ownerNum = ENTITYNUM_NONE; + body->edict->s.skinNum = -1; + body->flags |= (FL_DIE_GIBS|FL_BLOOD); + } + } + } \ No newline at end of file diff --git a/source/source/fgame/deadbody.h b/source/source/fgame/deadbody.h new file mode 100644 index 0000000..283b272 --- /dev/null +++ b/source/source/fgame/deadbody.h @@ -0,0 +1,42 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/deadbody.h $ +// $Revision:: 1 $ +// $Author:: Jimdose $ +// $Date:: 9/10/99 10:53a $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/deadbody.h $ +// +// 1 9/10/99 10:53a Jimdose +// +// 1 9/08/99 3:15p Aldie +// +// DESCRIPTION: +// Dead body + +#ifndef __DEADBODY_H__ +#define __DEADBODY_H__ + +#include "g_local.h" +#include "sentient.h" + +#define BODY_QUEUE_SIZE 4 + +void InitializeBodyQueue( void ); +void CopyToBodyQueue( gentity_t *ent ); + +class Deadbody : public Sentient + { + public: + CLASS_PROTOTYPE( Deadbody ); + + virtual void GibEvent( Event *ev ); + }; + +#endif /* deadbody.h */ \ No newline at end of file diff --git a/source/source/fgame/debuglines.cpp b/source/source/fgame/debuglines.cpp new file mode 100644 index 0000000..4f9d0bb --- /dev/null +++ b/source/source/fgame/debuglines.cpp @@ -0,0 +1,793 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/debuglines.cpp $ +// $Revision:: 8 $ +// $Date:: 3/15/00 2:04p $ +// +// Copyright (C) 1999 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/debuglines.cpp $ +// +// 8 3/15/00 2:04p Markd +// fixed up camera node system and added new debug oriented circle +// +// 7 3/03/00 4:17p Markd +// Fixed bug in highlight facet +// +// 6 3/02/00 6:04p Markd +// Added Debug Arrow and DebugHighlightFacet +// +// 5 2/09/00 9:54a Markd +// Made debuglines be malloced from the normal heap rather than the game heap +// so that they don't interfere with the game's memory footprint. +// +// 4 1/22/00 12:42p Jimdose +// got rid of calls to vec3() +// +// 3 1/10/00 5:27p Markd +// Added DeallocDebugLines +// +// 2 1/06/00 11:08p Jimdose +// cleaning up unused code +// +// DESCRIPTION: +// + +#include "debuglines.h" + +#define NUM_CIRCLE_SEGMENTS 24 + +debugline_t *DebugLines = NULL; +Vector currentVertex( 0, 0, 0 ); +Vector vertColor( 1, 1, 1 ); +float vertAlpha = 1; +float vertexIndex = 0; +float linewidth = 1; +unsigned short lineStippleFactor = 1; +unsigned short linePattern = 0xffff; + +void G_InitDebugLines + ( + void + ) + + { + *gi.DebugLines = DebugLines; + *gi.numDebugLines = 0; + + currentVertex = vec_zero; + vertColor = Vector( 1, 1, 1 ); + vertAlpha = 1; + vertexIndex = 0; + + linewidth = 1; + lineStippleFactor = 1; + linePattern = 0xffff; + } + +void G_AllocDebugLines + ( + void + ) + + { + // we do a malloc here so that we don't interfere with the game's memory footprint + DebugLines = ( debugline_t * )malloc( ( int )g_numdebuglines->integer * sizeof( debugline_t ) ); + + G_InitDebugLines(); + } + +void G_DeAllocDebugLines + ( + void + ) + + { + if ( DebugLines ) + { + // we do a free here, because we used malloc above + free( DebugLines ); + DebugLines = NULL; + *gi.DebugLines = DebugLines; + *gi.numDebugLines = 0; + } + } + +void G_DebugLine + ( + Vector start, + Vector end, + float r, + float g, + float b, + float alpha + ) + + { + debugline_t *line; + + if ( !g_numdebuglines ) + { + return; + } + + if ( *gi.numDebugLines >= g_numdebuglines->integer ) + { + gi.DPrintf( "G_DebugLine: Exceeded MAX_DEBUG_LINES\n" ); + return; + } + + line = &DebugLines[ *gi.numDebugLines ]; + ( *gi.numDebugLines )++; + + VectorCopy( start, line->start ); + VectorCopy( end, line->end ); + VectorSet( line->color, r, g, b ); + line->alpha = alpha; + + line->width = linewidth; + line->factor = lineStippleFactor; + line->pattern = linePattern; + } + +void G_LineStipple + ( + int factor, + unsigned short pattern + ) + + { + lineStippleFactor = factor; + linePattern = pattern; + } + +void G_LineWidth + ( + float width + ) + + { + linewidth = width; + } + +void G_Color3f + ( + float r, + float g, + float b + ) + + { + vertColor = Vector( r, g, b ); + } + +void G_Color3v + ( + Vector color + ) + + { + vertColor = color; + } + +void G_Color4f + ( + float r, + float g, + float b, + float alpha + ) + + { + vertColor = Vector( r, g, b ); + vertAlpha = alpha; + } + +void G_Color3vf + ( + Vector color, + float alpha + ) + + { + vertColor = color; + vertAlpha = alpha; + } + +void G_BeginLine + ( + void + ) + + { + currentVertex = vec_zero; + vertexIndex = 0; + } + +void G_Vertex + ( + Vector v + ) + + { + vertexIndex++; + if ( vertexIndex > 1 ) + { + G_DebugLine( currentVertex, v, vertColor[ 0 ], vertColor[ 1 ], vertColor[ 2 ], vertAlpha ); + } + currentVertex = v; + } + +void G_EndLine + ( + void + ) + + { + currentVertex = vec_zero; + vertexIndex = 0; + } + +void G_DebugBBox + ( + Vector org, + Vector mins, + Vector maxs, + float r, + float g, + float b, + float alpha + ) + { + int i; + Vector points[8]; + + /* + ** compute a full bounding box + */ + for ( i = 0; i < 8; i++ ) + { + Vector tmp; + + if ( i & 1 ) + tmp[0] = org[0] + mins[0]; + else + tmp[0] = org[0] + maxs[0]; + + if ( i & 2 ) + tmp[1] = org[1] + mins[1]; + else + tmp[1] = org[1] + maxs[1]; + + if ( i & 4 ) + tmp[2] = org[2] + mins[2]; + else + tmp[2] = org[2] + maxs[2]; + + points[i] = tmp; + } + + G_Color4f( r, g, b, alpha ); + + G_BeginLine(); + G_Vertex( points[0] ); + G_Vertex( points[1] ); + G_Vertex( points[3] ); + G_Vertex( points[2] ); + G_Vertex( points[0] ); + G_EndLine(); + + G_BeginLine(); + G_Vertex( points[4] ); + G_Vertex( points[5] ); + G_Vertex( points[7] ); + G_Vertex( points[6] ); + G_Vertex( points[4] ); + G_EndLine(); + + for ( i = 0; i < 4; i++ ) + { + G_BeginLine(); + G_Vertex( points[i] ); + G_Vertex( points[4 + i] ); + G_EndLine(); + } + } + +// +// LED style digits +// +// ****1*** +// * * 8 == / +// 6 *4 +// * * * +// ****2*** +// * * * +// 7 *--8 5 9 +// ** * **10 +// ****3*** 12** +// 11 + +static int Numbers[ 12 ][ 8 ] = + { + { 1, 3, 4, 5, 6, 7, 0, 0 }, // 0 + { 4, 5, 0, 0, 0, 0, 0, 0 }, // 1 + { 1, 4, 2, 7, 3, 0, 0, 0 }, // 2 + { 1, 4, 2, 5, 3, 0, 0, 0 }, // 3 + { 6, 4, 2, 5, 0, 0, 0, 0 }, // 4 + { 1, 6, 2, 5, 3, 0, 0, 0 }, // 5 + { 1, 6, 2, 5, 7, 3, 0, 0 }, // 6 + { 1, 8, 0, 0, 0, 0, 0, 0 }, // 7 + { 1, 2, 3, 4, 5, 6, 7, 0 }, // 8 + { 1, 6, 4, 2, 5, 3, 0, 0 }, // 9 + { 9, 10, 11, 12, 0, 0, 0, 0 }, // . + { 2, 0, 0, 0, 0, 0, 0, 0 }, // - + }; + +static float Lines[ 13 ][ 4 ] = + { + { 0, 0, 0, 0 }, // Unused + { -4, 8, 4, 8 }, // 1 + { -4, 4, 4, 4 }, // 2 + { -4, 0, 4, 0 }, // 3 + { 4, 8, 4, 4 }, // 4 + { 4, 4, 4, 0 }, // 5 + { -4, 8, -4, 4 }, // 6 + { -4, 4, -4, 0 }, // 7 + { 4, 8, -4, 0 }, // 8 + + { -1, 2, 1, 2 }, // 9 + { 1, 2, 1, 0 }, // 10 + { -1, 0, 1, 0 }, // 11 + { -1, 0, -1, 2 }, // 12 + }; + +void G_DrawDebugNumber + ( + Vector org, + float number, + float scale, + float r, + float g, + float b, + int precision + ) + + { + int i; + int j; + int l; + int num; + Vector up; + Vector left; + Vector pos; + Vector start; + Vector ang; + str text; + Vector delta; + char format[ 20 ]; + + // only draw entity numbers within a certain radius + delta = Vector( g_entities[ 0 ].s.origin ) - org; + if ( ( delta * delta ) > ( 1000 * 1000 ) ) + { + return; + } + + G_Color4f( r, g, b, 1.0 ); + + ang = game.clients[ 0 ].ps.viewangles; + ang.AngleVectors( NULL, &left, &up ); + + up *= scale; + left *= scale; + + if ( precision > 0 ) + { + sprintf( format, "%%.%df", precision ); + text = va( format, number ); + } + else + { + text = va( "%d", ( int )number ); + } + + start = org + ( text.length() - 1 ) * 5 * left; + + for( i = 0; i < text.length(); i++ ) + { + if ( text[ i ] == '.' ) + { + num = 10; + } + else if ( text[ i ] == '-' ) + { + num = 11; + } + else + { + num = text[ i ] - '0'; + } + + for( j = 0; j < 8; j++ ) + { + l = Numbers[ num ][ j ]; + if ( l == 0 ) + { + break; + } + + G_BeginLine(); + + pos = start - Lines[ l ][ 0 ] * left + Lines[ l ][ 1 ] * up; + G_Vertex( pos ); + + pos = start - Lines[ l ][ 2 ] * left + Lines[ l ][ 3 ] * up; + G_Vertex( pos ); + + G_EndLine(); + } + + start -= 10 * left; + } + } + +void G_DebugCircle + ( + Vector org, + float radius, + float r, + float g, + float b, + float alpha, + qboolean horizontal + ) + { + int i; + float ang; + Vector angles; + Vector forward; + Vector left; + Vector pos; + Vector delta; + + // only draw circles within a certain radius + delta = Vector( g_entities[ 0 ].s.origin ) - org; + if ( ( delta * delta ) > ( ( 1000 + radius ) * ( 1000 + radius ) ) ) + { + return; + } + + G_Color4f( r, g, b, alpha ); + + if ( horizontal ) + { + forward = "1 0 0"; + left = "0 -1 0"; + } + else + { + angles = game.clients[ 0 ].ps.viewangles; + angles.AngleVectors( NULL, &left, &forward ); + } + + G_BeginLine(); + for( i = 0; i <= NUM_CIRCLE_SEGMENTS; i++ ) + { + ang = DEG2RAD( i * 360 / NUM_CIRCLE_SEGMENTS ); + pos = org + ( sin( ang ) * radius * forward ) - ( cos( ang ) * radius * left ); + G_Vertex( pos ); + } + G_EndLine(); + } + +void G_DebugOrientedCircle + ( + Vector org, + float radius, + float r, + float g, + float b, + float alpha, + Vector angles + ) + { + int i; + float ang; + Vector forward; + Vector left; + Vector pos; + Vector delta; + + // only draw circles within a certain radius + delta = Vector( g_entities[ 0 ].s.origin ) - org; + if ( ( delta * delta ) > ( ( 1000 + radius ) * ( 1000 + radius ) ) ) + { + return; + } + + G_Color4f( r, g, b, alpha ); + + angles.AngleVectors( NULL, &left, &forward ); + + G_BeginLine(); + for( i = 0; i <= NUM_CIRCLE_SEGMENTS; i++ ) + { + ang = DEG2RAD( i * 360 / NUM_CIRCLE_SEGMENTS ); + pos = org + ( sin( ang ) * radius * forward ) - ( cos( ang ) * radius * left ); + G_Vertex( pos ); + } + G_EndLine(); + + // + // Draw the cross sign + // + G_BeginLine(); + ang = DEG2RAD( 45 * 360 / NUM_CIRCLE_SEGMENTS ); + pos = org + ( sin( ang ) * radius * forward ) - ( cos( ang ) * radius * left ); + G_Vertex( pos ); + ang = DEG2RAD( 225 * 360 / NUM_CIRCLE_SEGMENTS ); + pos = org + ( sin( ang ) * radius * forward ) - ( cos( ang ) * radius * left ); + G_Vertex( pos ); + + G_BeginLine(); + ang = DEG2RAD( 315 * 360 / NUM_CIRCLE_SEGMENTS ); + pos = org + ( sin( ang ) * radius * forward ) - ( cos( ang ) * radius * left ); + G_Vertex( pos ); + ang = DEG2RAD( 135 * 360 / NUM_CIRCLE_SEGMENTS ); + pos = org + ( sin( ang ) * radius * forward ) - ( cos( ang ) * radius * left ); + G_Vertex( pos ); + } + +void G_DebugPyramid + ( + Vector org, + float radius, + float r, + float g, + float b, + float alpha + ) + { + Vector delta; + Vector points[ 4 ]; + + // only draw pyramids within a certain radius + delta = Vector( g_entities[ 0 ].s.origin ) - org; + if ( ( delta * delta ) > ( ( 1000 + radius ) * ( 1000 + radius ) ) ) + { + return; + } + + G_Color4f( r, g, b, alpha ); + + points[ 0 ] = org; + points[ 0 ].z += radius; + + points[ 1 ] = org; + points[ 1 ].z -= radius; + points[ 2 ] = points[ 1 ]; + points[ 3 ] = points[ 1 ]; + + points[ 1 ].x += cos( DEG2RAD( 0 ) ) * radius; + points[ 1 ].y += sin( DEG2RAD( 0 ) ) * radius; + points[ 2 ].x += cos( DEG2RAD( 120 ) ) * radius; + points[ 2 ].y += sin( DEG2RAD( 120 ) ) * radius; + points[ 3 ].x += cos( DEG2RAD( 240 ) ) * radius; + points[ 3 ].y += sin( DEG2RAD( 240 ) ) * radius; + + G_BeginLine(); + G_Vertex( points[ 0 ] ); + G_Vertex( points[ 1 ] ); + G_Vertex( points[ 2 ] ); + G_Vertex( points[ 0 ] ); + G_EndLine(); + + G_BeginLine(); + G_Vertex( points[ 0 ] ); + G_Vertex( points[ 2 ] ); + G_Vertex( points[ 3 ] ); + G_Vertex( points[ 0 ] ); + G_EndLine(); + + G_BeginLine(); + G_Vertex( points[ 0 ] ); + G_Vertex( points[ 3 ] ); + G_Vertex( points[ 1 ] ); + G_Vertex( points[ 0 ] ); + G_EndLine(); + + G_BeginLine(); + G_Vertex( points[ 1 ] ); + G_Vertex( points[ 2 ] ); + G_Vertex( points[ 3 ] ); + G_Vertex( points[ 1 ] ); + G_EndLine(); + } + +void G_DrawCoordSystem + ( + Vector pos, + Vector forward, + Vector right, + Vector up, + int length + ) + + { + if ( g_showaxis->integer ) + { + G_DebugLine( pos, pos + forward * length, 1,0,0,1 ); + G_DebugLine( pos, pos + right * length, 0,1,0,1 ); + G_DebugLine( pos, pos + up * length, 0,0,1,1 ); + } + } + +void G_DrawCSystem + ( + void + ) + + { + Vector pos; + Vector ang; + Vector f; + Vector l; + Vector u; + Vector v; + + pos.x = csys_posx->value; + pos.y = csys_posy->value; + pos.z = csys_posz->value; + + ang.x = csys_x->value; + ang.y = csys_y->value; + ang.z = csys_z->value; + + ang.AngleVectors( &f, &l, &u ); + + G_DebugLine( pos, pos + f * 48, 1.0, 0, 0, 1 ); + G_DebugLine( pos, pos - l * 48, 0, 1.0, 0, 1 ); + G_DebugLine( pos, pos + u * 48, 0, 0, 1.0, 1 ); + } + +void G_DebugArrow + ( + Vector org, + Vector dir, + float length, + float r, + float g, + float b, + float alpha + ) + { + Vector right; + Vector up; + Vector startpoint; + Vector endpoint; + + PerpendicularVector( right, dir ); + up.CrossProduct( right, dir ); + + startpoint = org; + + endpoint = startpoint + dir * length; + length /= 6; + G_DebugLine( startpoint, endpoint, r, g, b, alpha ); + G_DebugLine( endpoint, endpoint - (right * length) - (dir * length), r, g, b, alpha ); + G_DebugLine( endpoint, endpoint + (right * length) - (dir * length), r, g, b, alpha ); + G_DebugLine( endpoint, endpoint - (up * length) - (dir * length), r, g, b, alpha ); + G_DebugLine( endpoint, endpoint + (up * length) - (dir * length), r, g, b, alpha ); + } + +void G_DebugHighlightFacet + ( + Vector org, + Vector mins, + Vector maxs, + facet_t facet, + float r, + float g, + float b, + float alpha + ) + { + int i; + Vector points[8]; + + /* + ** compute a full bounding box + */ + for ( i = 0; i < 8; i++ ) + { + Vector tmp; + + if ( i & 1 ) + tmp[0] = org[0] + mins[0]; + else + tmp[0] = org[0] + maxs[0]; + + if ( i & 2 ) + tmp[1] = org[1] + mins[1]; + else + tmp[1] = org[1] + maxs[1]; + + if ( i & 4 ) + tmp[2] = org[2] + mins[2]; + else + tmp[2] = org[2] + maxs[2]; + + points[i] = tmp; + } + + G_Color4f( r, g, b, alpha ); + + switch( facet ) + { + case north: + G_BeginLine(); + G_Vertex( points[0] ); + G_Vertex( points[5] ); + G_EndLine(); + G_BeginLine(); + G_Vertex( points[1] ); + G_Vertex( points[4] ); + G_EndLine(); + break; + case south: + G_BeginLine(); + G_Vertex( points[2] ); + G_Vertex( points[7] ); + G_EndLine(); + G_BeginLine(); + G_Vertex( points[3] ); + G_Vertex( points[6] ); + G_EndLine(); + break; + case east: + G_BeginLine(); + G_Vertex( points[0] ); + G_Vertex( points[6] ); + G_EndLine(); + G_BeginLine(); + G_Vertex( points[4] ); + G_Vertex( points[2] ); + G_EndLine(); + break; + case west: + G_BeginLine(); + G_Vertex( points[1] ); + G_Vertex( points[7] ); + G_EndLine(); + G_BeginLine(); + G_Vertex( points[5] ); + G_Vertex( points[3] ); + G_EndLine(); + break; + case up: + G_BeginLine(); + G_Vertex( points[0] ); + G_Vertex( points[3] ); + G_EndLine(); + G_BeginLine(); + G_Vertex( points[1] ); + G_Vertex( points[2] ); + G_EndLine(); + break; + case down: + G_BeginLine(); + G_Vertex( points[4] ); + G_Vertex( points[7] ); + G_EndLine(); + G_BeginLine(); + G_Vertex( points[5] ); + G_Vertex( points[6] ); + G_EndLine(); + break; + } + } diff --git a/source/source/fgame/debuglines.h b/source/source/fgame/debuglines.h new file mode 100644 index 0000000..7bcf429 --- /dev/null +++ b/source/source/fgame/debuglines.h @@ -0,0 +1,64 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/debuglines.h $ +// $Revision:: 4 $ +// $Date:: 3/15/00 2:04p $ +// +// Copyright (C) 1999 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/debuglines.h $ +// +// 4 3/15/00 2:04p Markd +// fixed up camera node system and added new debug oriented circle +// +// 3 3/02/00 6:04p Markd +// Added Debug Arrow and DebugHighlightFacet +// +// 2 1/06/00 11:08p Jimdose +// cleaning up unused code +// +// DESCRIPTION: +// + +#ifndef __DEBUGLINES_H__ +#define __DEBUGLINES_H__ + +#include "g_local.h" + +void G_InitDebugLines( void ); +void G_DebugLine( Vector start, Vector end, float r, float g, float b, float alpha ); +void G_LineStipple( int factor, unsigned short pattern ); +void G_LineWidth( float width ); +void G_Color3f( float r, float g, float b ); +void G_Color3v( Vector color ); +void G_Color4f( float r, float g, float b, float alpha ); +void G_Color3vf( Vector color, float alpha ); +void G_BeginLine( void ); +void G_Vertex( Vector v ); +void G_EndLine( void ); +void G_DebugBBox( Vector org, Vector mins, Vector maxs, float r, float g, float b, float alpha ); +void G_DrawDebugNumber( Vector org, float number, float scale, float r, float g, float b, int precision = 0 ); +void G_DebugCircle( Vector org, float radius, float r, float g, float b, float alpha, qboolean horizontal = false ); +void G_DebugOrientedCircle( Vector org, float radius, float r, float g, float b, float alpha, Vector angles ); +void G_DebugPyramid( Vector org, float radius, float r, float g, float b, float alpha ); +void G_DrawCoordSystem( Vector pos, Vector f, Vector r, Vector u, int len ); +void G_DebugArrow( Vector org, Vector dir, float length, float r, float g, float b, float alpha ); +void G_DrawCSystem( void ); + +typedef enum + { + north, + south, + east, + west, + up, + down + } facet_t; + +void G_DebugHighlightFacet( Vector org, Vector mins, Vector maxs, facet_t facet, float r, float g, float b, float alpha ); + +#endif /* !__DEBUGLINES_H__ */ diff --git a/source/source/fgame/decals.cpp b/source/source/fgame/decals.cpp new file mode 100644 index 0000000..6598cff --- /dev/null +++ b/source/source/fgame/decals.cpp @@ -0,0 +1,94 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/decals.cpp $ +// $Revision:: 4 $ +// $Author:: Markd $ +// $Date:: 6/23/00 11:49a $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/decals.cpp $ +// +// 4 6/23/00 11:49a Markd +// fixed various imagindexes and saved games +// +// 3 6/14/00 3:50p Markd +// Cleaned up more Intel Compiler warnings +// +// 2 1/29/00 2:48p Aldie +// Added impact mark functionality and Decal class +// +// DESCRIPTION: +// Decal entities + +#include "decals.h" + + +CLASS_DECLARATION( Entity, Decal, NULL ) + { + { NULL, NULL } + }; + +Decal::Decal + ( + ) + + { + edict->s.eType = ET_DECAL; + edict->s.modelindex = 1; // must be non-zero + PostEvent( EV_Remove, FRAMETIME ); + } + +void Decal::setDirection + ( + Vector dir + ) + + { + edict->s.surfaces[0] = DirToByte( dir ); + } + +void Decal::setShader + ( + str decal_shader + ) + + { + str temp_shader; + + shader = decal_shader; + edict->s.tag_num = gi.imageindex( shader.c_str() ); + + temp_shader = shader + ".spr"; + CacheResource( temp_shader, this ); + } + +void Decal::setOrientation + ( + str deg + ) + + { + Vector ang; + + if ( !deg.icmp( "random" ) ) + ang[2] = random() * 360; + else + ang[2] = atof( deg ); + + setAngles( ang ); + } + +void Decal::setRadius + ( + float rad + ) + + { + edict->s.scale = rad; + } + diff --git a/source/source/fgame/decals.h b/source/source/fgame/decals.h new file mode 100644 index 0000000..dd296ff --- /dev/null +++ b/source/source/fgame/decals.h @@ -0,0 +1,63 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/decals.h $ +// $Revision:: 4 $ +// $Author:: Markd $ +// $Date:: 6/23/00 11:49a $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/decals.h $ +// +// 4 6/23/00 11:49a Markd +// fixed various imagindexes and saved games +// +// 3 6/14/00 3:50p Markd +// Cleaned up more Intel Compiler warnings +// +// 2 1/29/00 2:48p Aldie +// Added impact mark functionality and Decal class +// +// DESCRIPTION: +// Decal entities + +#ifndef __DECAL_H__ +#define __DECAL_H__ + +#include "g_local.h" + +class Decal : public Entity + { + private: + str shader; + + public: + CLASS_PROTOTYPE( Decal ); + + Decal(); + void setDirection( Vector dir ); + void setShader( str shader ); + void setOrientation( str deg ); + void setRadius( float rad ); + virtual void Archive( Archiver &arc ); + }; + +inline void Decal::Archive + ( + Archiver &arc + ) + { + Entity::Archive( arc ); + + arc.ArchiveString( &shader ); + if ( arc.Loading() ) + { + setShader( shader ); + } + } + +#endif // __DECAL_H__ diff --git a/source/source/fgame/doors.cpp b/source/source/fgame/doors.cpp new file mode 100644 index 0000000..a51cc12 --- /dev/null +++ b/source/source/fgame/doors.cpp @@ -0,0 +1,1768 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/doors.cpp $ +// $Revision:: 27 $ +// $Author:: Markd $ +// $Date:: 7/27/00 5:39p $ +// +// Copyright (C) 1997 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/doors.cpp $ +// +// 27 7/27/00 5:39p Markd +// put in doorcompletelyclosed +// +// 25 7/18/00 3:29p Markd +// added better caching for sounds in general +// +// 24 7/18/00 3:03p Markd +// fixed error message +// +// 23 7/17/00 4:43p Steven +// Made doors play locked sound when player uses them if they are locked and +// automatic. +// +// 22 7/15/00 3:00p Steven +// fixed door locked sound playing constantly when it is an auto open door +// +// 21 7/11/00 7:07p Steven +// Made it so actors don't cause door locked sounds and removed a center print. +// +// 20 7/03/00 6:59p Steven +// Setup default locked door sound. +// +// 19 7/01/00 1:25p Markd +// fixed door bug with area portals +// +// 18 6/23/00 8:41p Markd +// made a lot of changes to different constructors for saved game support +// +// 17 6/14/00 3:50p Markd +// Cleaned up more Intel Compiler warnings +// +// 16 6/05/00 11:16a Markd +// fixed doors getting blocked by entities and crashing the game +// +// 15 6/01/00 3:18p Markd +// rewrote giveItem and item management in sentient +// +// 14 3/27/00 4:15p Markd +// updated script_door documentation +// +// 13 1/25/00 10:02a Steven +// Made doors automatically open for actors. +// +// 12 1/15/00 3:57p Markd +// Eliminated multiple "angle" events and replaced them with EV_SetAngle +// +// 11 1/14/00 5:06p Markd +// Removed surface num, tri_num and damage_multiplier from multiple functions +// and events +// +// 10 1/12/00 6:16p Jimdose +// made EV_SlidingDoor_Setup use EV_HIDE +// +// 9 1/06/00 11:08p Jimdose +// cleaning up unused code +// +// 8 12/11/99 6:44p Markd +// second run-through of q3a merge, got the entire project to build without +// errors or warnings +// +// 7 10/14/99 5:08p Markd +// removed a lot of G_GetMoveDir calls from the initialization code +// +// 6 10/13/99 5:03p Markd +// Fixed door bug where multiple linked doors where all adjusting the portal +// state +// +// 5 10/07/99 2:59p Steven +// Event formatting. +// +// 4 9/29/99 5:18p Steven +// Event formatting. +// +// 3 9/22/99 4:47p Markd +// fixed more G_GetEntity, G_FindClass and G_GetNextEntity bugs +// +// 2 9/21/99 7:51p Markd +// Fixed a lot of entitynum_none issues +// +// 1 9/10/99 10:53a Jimdose +// +// 1 9/08/99 3:15p Aldie +// +// 22 8/28/99 11:42a Steven +// Removed global from sound function calls. +// +// 21 8/25/99 12:42p Markd +// Fixed some minor and major scripting bugs +// +// 20 7/08/99 4:28p Markd +// Removed obsolete QUAKED functions +// +// 19 6/11/99 2:20p Phook +// Renamed a few entities +// +// 18 6/11/99 1:23p Phook +// +// 17 6/11/99 12:58p Phook +// Changed from SINED comments to QUAKED +// +// 16 6/11/99 12:46p Phook +// EClass color changes +// +// DESCRIPTION: +// Doors are environment objects that rotate open when activated by triggers +// or when used by the player. +// + +#include "g_local.h" +#include "entity.h" +#include "trigger.h" +#include "mover.h" +#include "doors.h" +#include "sentient.h" +#include "scriptmaster.h" +#include "item.h" +#include "actor.h" +#include "player.h" +#include "g_utils.h" + +Event EV_Door_StopSound + ( + "sound_stop", + EV_DEFAULT, + "s", + "sound_stop", + "Sets the sound to use when the door stops." + ); +Event EV_Door_MoveSound + ( + "sound_move", + EV_DEFAULT, + "s", + "sound_move", + "Sets the sound to use when the door moves." + ); +Event EV_Door_MessageSound + ( + "sound_message", + EV_DEFAULT, + "s", + "sound_message", + "Sets the sound to use when the door displays a message." + ); +Event EV_Door_LockedSound + ( + "sound_locked", + EV_DEFAULT, + "s", + "sound_locked", + "Sets the sound to use when the door is locked." + ); +Event EV_Door_SetWait + ( + "wait", + EV_DEFAULT, + "f", + "wait", + "Sets the amount of time to wait before automatically shutting." + ); +Event EV_Door_SetDmg + ( + "dmg", + EV_DEFAULT, + "i", + "damage", + "Sets the amount of damage the door will do to entities that get stuck in it." + ); +Event EV_Door_TriggerFieldTouched + ( + "door_triggerfield", + EV_DEFAULT, + "e", + "other", + "Is called when a doors trigger field is touched." + ); +Event EV_Door_TryOpen + ( + "tryToOpen", + EV_DEFAULT, + "e", + "other", + "Tries to open the door." + ); +Event EV_Door_Close + ( + "close", + EV_DEFAULT, + NULL, + NULL, + "Closes the door." + ); +Event EV_Door_Open + ( + "open", + EV_DEFAULT, + "e", + "other", + "Opens the door." + ); +Event EV_Door_DoClose + ( + "doclose", + EV_DEFAULT, + NULL, + NULL, + "Closes the door (special doors)." + ); +Event EV_Door_DoOpen + ( + "doopen", + EV_DEFAULT, + "e", + "other", + "Opens the door (special doors)." + ); +Event EV_Door_CloseEnd + ( + "doorclosed", + EV_DEFAULT, + NULL, + NULL, + "Called when the door finishes closing." + ); +Event EV_Door_OpenEnd + ( + "dooropened", + EV_DEFAULT, + NULL, + NULL, + "Called when the door finishes opening." + ); +Event EV_Door_Fire + ( + "toggledoor", + EV_DEFAULT, + "e", + "other", + "Toggles the state of the door (open/close)." + ); +Event EV_Door_Link + ( + "linkdoor", + EV_DEFAULT, + NULL, + NULL, + "Link doors together." + ); +Event EV_Door_SetTime + ( + "time", + EV_DEFAULT, + "f", + "traveltime", + "Sets the time it takes for the door to open an close." + ); +Event EV_Door_Lock + ( + "lock", + EV_DEFAULT, + NULL, + NULL, + "Lock the door." + ); +Event EV_Door_Unlock + ( + "unlock", + EV_DEFAULT, + NULL, + NULL, + "Unlock the door." + ); + +#define DOOR_START_OPEN 1 +#define DOOR_OPEN_DIRECTION 2 +#define DOOR_DONT_LINK 4 +#define DOOR_TOGGLE 32 +#define DOOR_AUTO_OPEN 64 +#define DOOR_TARGETED 128 + +#define STATE_OPEN 1 +#define STATE_OPENING 2 +#define STATE_CLOSING 3 +#define STATE_CLOSED 4 + +/* + +Doors are similar to buttons, but can spawn a fat trigger field around them +to open without a touch, and they link together to form simultanious +double/quad doors. + +Door.master is the master door. If there is only one door, it points to itself. +If multiple doors, all will point to a single one. + +Door.enemy chains from the master door through all doors linked in the chain. + +*/ + +CLASS_DECLARATION( ScriptSlave, Door, "NormalDoor" ) + { + { &EV_Door_StopSound, SetStopSound }, + { &EV_Door_MoveSound, SetMoveSound }, + { &EV_Door_MessageSound, SetMessageSound }, + { &EV_Door_LockedSound, SetLockedSound }, + { &EV_Door_SetWait, SetWait }, + { &EV_Door_SetDmg, SetDmg }, + { &EV_Door_TriggerFieldTouched, FieldTouched }, + { &EV_Trigger_Effect, TryOpen }, + { &EV_Activate, TryOpen }, + { &EV_Door_TryOpen, TryOpen }, + { &EV_Door_Close, Close }, + { &EV_Door_Open, Open }, + { &EV_Door_CloseEnd, CloseEnd }, + { &EV_Door_OpenEnd, OpenEnd }, + { &EV_Door_Fire, DoorFire }, + { &EV_Door_Link, LinkDoors }, + { &EV_Door_SetTime, SetTime }, + { &EV_Use, DoorUse }, + { &EV_Killed, DoorFire }, + { &EV_Blocked, DoorBlocked }, + { &EV_Door_Lock, LockDoor }, + { &EV_Door_Unlock, UnlockDoor }, + { &EV_SetAngle, SetDir }, + { &EV_Touch, NULL }, + { NULL, NULL } + }; + +Door::Door() + { + float t; + const char *text; + + if ( LoadingSavegame ) + { + return; + } + + nextdoor = 0; + trigger = 0; + locked = false; + master = this; + lastblocktime = 0; + diropened = 0; + + dir = G_GetMovedir( 0 ); + t = dir[ 0 ]; + dir[ 0 ] = -dir[ 1 ]; + dir[ 1 ] = t; + + showModel(); + + text = gi.GlobalAlias_FindRandom( "door_stop" ); + if ( text ) + { + SetStopSound( text ); + } + + text = gi.GlobalAlias_FindRandom( "door_moving" ); + if ( text ) + { + SetMoveSound( text ); + } + + text = gi.GlobalAlias_FindRandom( "snd_locked" ); + if ( text ) + { + SetLockedSound( text ); + } + + traveltime = 0.3; + speed = 1.0f / traveltime; + + wait = ( spawnflags & DOOR_TOGGLE ) ? 0 : 3; + dmg = 0; + + setSize( mins, maxs ); + + setOrigin( localorigin ); + + // DOOR_START_OPEN is to allow an entity to be lighted in the closed position + // but spawn in the open position + if ( spawnflags & DOOR_START_OPEN ) + { + state = STATE_OPEN; + PostEvent( EV_Door_Open, EV_POSTSPAWN ); + } + else + { + state = STATE_CLOSED; + } + previous_state = state; + + if ( health ) + { + takedamage = DAMAGE_YES; + } + + // LinkDoors can't be done until all of the doors have been spawned, so + // the sizes can be detected properly. + nextdoor = 0; + PostEvent( EV_Door_Link, EV_LINKDOORS ); + + // Default to work with monsters and players + respondto = TRIGGER_PLAYERS | TRIGGER_MONSTERS; + if ( spawnflags & 8 ) + { + respondto &= ~TRIGGER_PLAYERS; + } + if ( spawnflags & 16 ) + { + respondto &= ~TRIGGER_MONSTERS; + } + + next_locked_time = 0; + } + +void Door::SetDir + ( + Event *ev + ) + + { + float t; + float angle; + + angle = ev->GetFloat( 1 ); + dir = G_GetMovedir( angle ); + t = dir[ 0 ]; + dir[ 0 ] = -dir[ 1 ]; + dir[ 1 ] = t; + } + +void Door::SetStopSound + ( + str sound + ) + + { + sound_stop = sound; + if ( sound_stop.length() > 1 ) + { + CacheResource( sound_stop.c_str(), this ); + } + } + +void Door::SetMoveSound + ( + str sound + ) + + { + sound_move = sound; + if ( sound_move.length() > 1 ) + { + CacheResource( sound_move.c_str(), this ); + } + } + +void Door::SetMessageSound + ( + str sound + ) + + { + sound_message = sound; + if ( sound_message.length() > 1 ) + { + CacheResource( sound_message.c_str(), this ); + } + } + +void Door::SetLockedSound + ( + str sound + ) + + { + sound_locked = sound; + if ( sound_locked.length() > 1 ) + { + CacheResource( sound_locked.c_str(), this ); + } + } + +void Door::SetStopSound + ( + Event *ev + ) + + { + SetStopSound( ev->GetString( 1 ) ); + } + +void Door::SetMoveSound + ( + Event *ev + ) + + { + SetMoveSound( ev->GetString( 1 ) ); + } + +void Door::SetMessageSound + ( + Event *ev + ) + + { + SetMessageSound( ev->GetString( 1 ) ); + } + +void Door::SetLockedSound + ( + Event *ev + ) + + { + SetLockedSound( ev->GetString( 1 ) ); + } + +void Door::SetWait + ( + Event *ev + ) + + { + wait = ev->GetFloat( 1 ); + } + +void Door::SetDmg + ( + Event *ev + ) + + { + dmg = ev->GetInteger( 1 ); + } + +qboolean Door::isOpen + ( + void + ) + + { + return ( state == STATE_OPEN ); + } + +qboolean Door::isCompletelyClosed + ( + void + ) + + { + return ( state == STATE_CLOSED ); + } + +void Door::OpenEnd + ( + Event *ev + ) + + { + if ( sound_stop.length() > 1 ) + { + BroadcastSound(); + Sound( sound_stop, CHAN_VOICE ); + } + else + { + StopSound( CHAN_VOICE ); + } + + previous_state = state; + state = STATE_OPEN; + if ( spawnflags & DOOR_TOGGLE ) + { + // don't close automatically + return; + } + + if ( ( wait > 0 ) && ( master == this ) ) + { + PostEvent( EV_Door_Close, wait ); + } + } + +void Door::CloseEnd + ( + Event *ev + ) + + { + if ( sound_stop.length() > 1 ) + { + BroadcastSound(); + Sound( sound_stop, CHAN_VOICE ); + } + else + { + StopSound( CHAN_VOICE ); + } + + if ( master == this ) + { + gi.AdjustAreaPortalState( this->edict, false ); + } + + previous_state = state; + state = STATE_CLOSED; + } + +void Door::Close + ( + Event *ev + ) + + { + Door *door; + + CancelEventsOfType( EV_Door_Close ); + + previous_state = state; + state = STATE_CLOSING; + + ProcessEvent( EV_Door_DoClose ); + + if ( sound_move.length() > 1 ) + { + BroadcastSound(); + Sound( sound_move, CHAN_VOICE ); + } + if ( master == this ) + { + if ( max_health ) + { + takedamage = DAMAGE_YES; + health = max_health; + } + + // trigger all paired doors + door = ( Door * )G_GetEntity( nextdoor ); + assert( door->isSubclassOf( Door ) ); + while( door && ( door != this ) ) + { + door->ProcessEvent( EV_Door_Close ); + door = ( Door * )G_GetEntity( door->nextdoor ); + assert( door->isSubclassOf( Door ) ); + } + } + } + +void Door::Open + ( + Event *ev + ) + + { + Door *door; + Event *e; + Entity *other; + + if ( ev->NumArgs() < 1 ) + { + ev->Error( "No entity specified to open door. Door may open the wrong way." ); + other = world; + } + else + { + other = ev->GetEntity( 1 ); + } + + if ( state == STATE_OPENING ) + { + // already going up + return; + } + + if ( state == STATE_OPEN ) + { + // reset top wait time + if ( wait > 0 ) + { + CancelEventsOfType( EV_Door_Close ); + PostEvent( EV_Door_Close, wait ); + } + return; + } + + previous_state = state; + state = STATE_OPENING; + + e = new Event( EV_Door_DoOpen ); + e->AddEntity( other ); + ProcessEvent( e ); + + if ( sound_move.length() > 1 ) + { + BroadcastSound(); + Sound( sound_move, CHAN_VOICE ); + } + if ( master == this ) + { + // trigger all paired doors + door = ( Door * )G_GetEntity( nextdoor ); + assert( door->isSubclassOf( Door ) ); + while( door && ( door != this ) ) + { + e = new Event( EV_Door_Open ); + e->AddEntity( other ); + door->ProcessEvent( e ); + door = ( Door * )G_GetEntity( door->nextdoor ); + assert( door->isSubclassOf( Door ) ); + } + + if ( previous_state == STATE_CLOSED ) + { + gi.AdjustAreaPortalState( this->edict, true ); + } + } + } + +void Door::DoorUse + ( + Event *ev + ) + + { + Entity *other; + qboolean respond; + Event *e; + + other = ev->GetEntity( 1 ); + + respond = ( ( ( respondto & TRIGGER_PLAYERS ) && other->isClient() ) || + ( ( respondto & TRIGGER_MONSTERS ) && other->isSubclassOf( Actor ) ) ); + + if ( !respond ) + { + return; + } + + // only allow use when not triggerd by other events + if ( health || ( spawnflags & ( DOOR_AUTO_OPEN | DOOR_TARGETED ) ) ) + { + if ( other->isSubclassOf( Sentient ) && ( state == STATE_CLOSED ) ) + { + if ( health ) + { + gi.SendServerCommand( NULL, "print \"This door is jammed.\"" ); + } + else if ( spawnflags & DOOR_TARGETED ) + { + Sound( "door_triggered", CHAN_VOICE ); + } + } + + if ( spawnflags & DOOR_AUTO_OPEN && locked && other->isSubclassOf( Player ) && sound_locked.length() ) + { + other->Sound( sound_locked, CHAN_VOICE ); + } + + return; + } + + assert( master ); + if ( !master ) + { + // bulletproofing + master = this; + } + + if ( master->state == STATE_CLOSED ) + { + e = new Event( EV_Door_TryOpen ); + e->AddEntity( other ); + master->ProcessEvent( e ); + } + else if ( master->state == STATE_OPEN ) + { + e = new Event( EV_Door_Close ); + e->AddEntity( other ); + master->ProcessEvent( e ); + } + } + +void Door::DoorFire + ( + Event *ev + ) + + { + Event *e; + Entity *other; + + other = ev->GetEntity( 1 ); + + assert( master == this ); + if ( master != this ) + { + gi.Error( ERR_DROP, "DoorFire: master != self" ); + } + + // no more messages + SetMessage( NULL ); + + // reset health in case we were damage triggered + health = max_health; + + // will be reset upon return + takedamage = DAMAGE_NO; + + if ( ( spawnflags & ( DOOR_TOGGLE | DOOR_START_OPEN ) ) && ( state == STATE_OPENING || state == STATE_OPEN ) ) + { + spawnflags &= ~DOOR_START_OPEN; + ProcessEvent( EV_Door_Close ); + } + else + { + e = new Event( EV_Door_Open ); + e->AddEntity( other ); + ProcessEvent( e ); + } + } + +void Door::DoorBlocked + ( + Event *ev + ) + + { + Event *e; + Entity *other; + + assert( master ); + if ( ( master ) && ( master != this ) ) + { + master->ProcessEvent( new Event( ev ) ); + return; + } + + if ( lastblocktime > level.time ) + { + return; + } + + lastblocktime = level.time + 0.3; + + other = ev->GetEntity( 1 ); + + if ( dmg ) + { + other->Damage( this, this, (int)dmg, origin, vec_zero, vec_zero, 0, 0, MOD_CRUSH ); + } + + // + // if we killed him, lets keep on going + // + if ( other->deadflag ) + { + return; + } + + if ( state == STATE_OPENING || state == STATE_OPEN ) + { + spawnflags &= ~DOOR_START_OPEN; + ProcessEvent( EV_Door_Close ); + } + else + { + e = new Event( EV_Door_Open ); + e->AddEntity( other ); + ProcessEvent( e ); + } + } + +void Door::FieldTouched + ( + Event *ev + ) + + { + Entity *other; + + other = ev->GetEntity( 1 ); + + if ( !other ) + return; + + if ( ( state != STATE_OPEN ) && !( spawnflags & DOOR_AUTO_OPEN ) && !other->isSubclassOf( Actor ) ) + return; + + TryOpen( ev ); + } + +qboolean Door::CanBeOpenedBy + ( + Entity *ent + ) + + { + assert( master ); + if ( ( master ) && ( master != this ) ) + { + return master->CanBeOpenedBy( ent ); + } + + if ( !locked && !key.length() ) + { + return true; + } + + if ( ent && ent->isSubclassOf( Sentient ) && ( ( Sentient * )ent )->HasItem( key.c_str() ) ) + { + return true; + } + + return false; + } + +void Door::TryOpen + ( + Event *ev + ) + + { + Entity *other; + Event *event; + + //FIXME + // hack so that doors aren't triggered by guys when game starts. + // have to fix delay that guys go through before setting up their threads + if ( level.time < 0.4 ) + { + return; + } + + other = ev->GetEntity( 1 ); + + assert( master ); + if ( master && ( this != master ) ) + { + event = new Event( EV_Door_TryOpen ); + event->AddEntity( other ); + master->ProcessEvent( event ); + return; + } + + if ( !other || other->deadflag ) + { + return; + } + + if ( locked ) + { + if ( next_locked_time <= level.time ) + { + if ( sound_locked.length() > 1 && !other->isSubclassOf( Actor ) ) + { + other->Sound( sound_locked, CHAN_VOICE ); + } + else if ( other->isSubclassOf( Player ) ) + { + other->Sound( "snd_locked", CHAN_VOICE ); + // gi.centerprintf ( other->edict, "This door is locked." ); + } + } + + // Always increment next locked time + + next_locked_time = level.time + 0.5; + + // locked doors don't open for anyone + return; + } + + if ( !CanBeOpenedBy( other ) ) + { + Item *item; + ClassDef *cls; + + if ( other->isClient() ) + { + cls = getClass( key.c_str() ); + if ( !cls ) + { + gi.DPrintf( "No item named '%s'\n", key.c_str() ); + return; + } + item = ( Item * )cls->newInstance(); + item->CancelEventsOfType( EV_Item_DropToFloor ); + item->CancelEventsOfType( EV_Remove ); + item->ProcessPendingEvents(); + gi.centerprintf ( other->edict, "You need the %s", item->getName() ); + delete item; + } + return; + } + + // once we're opened by an item, we no longer need that item to open the door + key = ""; + + if ( Message().length() ) + { + gi.centerprintf( other->edict, Message().c_str() ); + Sound( sound_message, CHAN_VOICE ); + } + + event = new Event( EV_Door_Fire ); + event->AddEntity( other ); + ProcessEvent( event ); + } + +void Door::SpawnTriggerField + ( + Vector fmins, + Vector fmaxs + ) + + { + TouchField *trig; + Vector min; + Vector max; + + min = fmins - "60 60 8"; + max = fmaxs + "60 60 8"; + + trig = new TouchField; + trig->Setup( this, EV_Door_TriggerFieldTouched, min, max, respondto ); + + trigger = trig->entnum; + } + +qboolean Door::DoorTouches + ( + Door *e1 + ) + + { + if ( e1->absmin.x > absmax.x ) + { + return false; + } + if ( e1->absmin.y > absmax.y ) + { + return false; + } + if ( e1->absmin.z > absmax.z ) + { + return false; + } + if ( e1->absmax.x < absmin.x ) + { + return false; + } + if ( e1->absmax.y < absmin.y ) + { + return false; + } + if ( e1->absmax.z < absmin.z ) + { + return false; + } + + return true; + } + +void Door::LinkDoors + ( + Event *ev + ) + + { + Entity *entptr; + Door *ent; + Door *next; + Vector cmins; + Vector cmaxs; + int i; + + setSolidType( SOLID_BSP ); + setMoveType( MOVETYPE_PUSH ); + + if ( nextdoor ) + { + // already linked by another door + return; + } + + // master doors own themselves + master = this; + + if ( spawnflags & DOOR_DONT_LINK ) + { + // don't want to link this door + nextdoor = entnum; + return; + } + + cmins = absmin; + cmaxs = absmax; + + ent = this; + for( entptr = this; entptr; entptr = G_FindClass( entptr, getClassID() ) ) + { + next = ( Door * )entptr; + if ( !ent->DoorTouches( next ) ) + { + continue; + } + + if ( next->nextdoor ) + { + error( "cross connected doors. Targetname = %s entity %d\n", TargetName(), entnum ); + } + + ent->nextdoor = next->entnum; + ent = next; + + for( i = 0; i < 3; i++ ) + { + if ( ent->absmin[ i ] < cmins[ i ] ) + { + cmins[ i ] = ent->absmin[ i ]; + } + if ( ent->absmax[ i ] > cmaxs[ i ] ) + { + cmaxs[ i ] = ent->absmax[ i ]; + } + } + + // set master door + ent->master = this; + + if ( ent->health ) + { + health = ent->health; + } + + if ( ent->Targeted() ) + { + if ( !Targeted() ) + { + SetTargetName( ent->TargetName() ); + } + else if ( strcmp( TargetName(), ent->TargetName() ) ) + { + // not a critical error, but let them know about it. + gi.DPrintf( "cross connected doors\n" ); + + ent->SetTargetName( TargetName() ); + } + } + + if ( ent->Message().length() ) + { + if ( Message().length() && !strcmp( Message().c_str(), ent->Message().c_str() ) ) + { + // not a critical error, but let them know about it. + gi.DPrintf( "Different messages on linked doors. Targetname = %s", TargetName() ); + } + + // only master should have a message + SetMessage( ent->Message().c_str() ); + ent->SetMessage( NULL ); + } + } + + // make the chain a loop + ent->nextdoor = entnum; + + // open up any portals we control + if ( spawnflags & DOOR_START_OPEN ) + { + gi.AdjustAreaPortalState( this->edict, true ); + } + + // shootable or targeted doors don't need a trigger + if ( health || ( spawnflags & DOOR_TARGETED ) ) + { + // Don't let the player trigger the door + return; + } + + // Don't spawn trigger field when set to toggle + if ( !( spawnflags & DOOR_TOGGLE ) ) + { + SpawnTriggerField( cmins, cmaxs ); + } + } + +void Door::SetTime + ( + Event *ev + ) + + { + traveltime = ev->GetFloat( 1 ); + if ( traveltime < FRAMETIME ) + { + traveltime = FRAMETIME; + } + + speed = 1.0f / traveltime; + } + +void Door::LockDoor + ( + Event *ev + ) + + { + locked = true; + } + +void Door::UnlockDoor + ( + Event *ev + ) + + { + locked = false; + } + +/*****************************************************************************/ +/*QUAKED func_rotatingdoor (0 0.25 0.5) ? START_OPEN OPEN_DIRECTION DOOR_DONT_LINK NOT_PLAYERS NOT_MONSTERS TOGGLE AUTO_OPEN TARGETED +if two doors touch, they are assumed to be connected and operate as a unit. + +TOGGLE causes the door to wait in both the start and end states for a trigger event. +DOOR_DONT_LINK is for when you have two doors that are touching but you want to operate independently. + +START_OPEN causes the door to move to its destination when spawned, and operate in reverse. It is used to temporarily or permanently close off an area when triggered (not usefull for touch or takedamage doors). +OPEN_DIRECTION indicates which direction to open when START_OPEN is set. +AUTO_OPEN causes the door to open when a player is near instead of waiting for the player to use the door. +TARGETED door is only operational from triggers or script + +"message" is printed when the door is touched if it is a trigger door and it hasn't been fired yet +"openangle" how wide to open the door +"angle" determines the opening direction. point toward the middle of the door (away from the hinge) +"targetname" if set, no touch field will be spawned and a remote button or trigger field activates the door. +"health" if set, door must be shot open +"time" move time (0.3 default) +"wait" wait before returning (3 default, -1 = never return) +"dmg" damage to inflict when blocked (0 default) +"key" The item needed to open this door (default nothing) + +"sound_stop" Specify the sound that plays when the door stops moving (default global door_stop) +"sound_move" Specify the sound that plays when the door opens or closes (default global door_moving) +"sound_message" Specify the sound that plays when the door displays a message +"sound_locked" Specify the sound that plays when the door is locked + +******************************************************************************/ + +Event EV_RotatingDoor_OpenAngle + ( + "openangle", + EV_DEFAULT, + "f", + "open_angle", + "Sets the open angle of the door." + ); + +CLASS_DECLARATION( Door, RotatingDoor, "func_rotatingdoor" ) + { + { &EV_Door_DoClose, DoClose }, + { &EV_Door_DoOpen, DoOpen }, + { &EV_RotatingDoor_OpenAngle, OpenAngle }, + { NULL, NULL } + }; + +void RotatingDoor::DoOpen + ( + Event *ev + ) + + { + Vector ang; + + if ( previous_state == STATE_CLOSED ) + { + if ( ev->NumArgs() > 0 ) + { + Entity *other; + Vector p; + + other = ev->GetEntity( 1 ); + p = other->origin - origin; + p.z = 0; + diropened = dir * p; + } + else + { + diropened = 0 - init_door_direction; + } + } + + if ( diropened < 0 ) + { + ang = startangle + Vector( 0, angle, 0 ); + } + else + { + ang = startangle - Vector( 0, angle, 0 ); + } + + MoveTo( origin, ang, fabs( speed*angle ), EV_Door_OpenEnd ); + } + +void RotatingDoor::DoClose + ( + Event *ev + ) + + { + MoveTo( origin, startangle, fabs( speed*angle ), EV_Door_CloseEnd ); + } + +void RotatingDoor::OpenAngle + ( + Event *ev + ) + + { + angle = ev->GetFloat( 1 ); + } + +RotatingDoor::RotatingDoor() + { + if ( LoadingSavegame ) + { + return; + } + startangle = angles; + + angle = 90; + + init_door_direction = (spawnflags & DOOR_OPEN_DIRECTION); + } + +/*****************************************************************************/ +/*QUAKED func_door (0 0.25 0.5) ? START_OPEN x DOOR_DONT_LINK NOT_PLAYERS NOT_MONSTERS TOGGLE AUTO_OPEN TARGETED +if two doors touch, they are assumed to be connected and operate as a unit. + +TOGGLE causes the door to wait in both the start and end states for a trigger event. +DOOR_DONT_LINK is for when you have two doors that are touching but you want to operate independently. + +START_OPEN causes the door to move to its destination when spawned, and operate in reverse. It is used to temporarily or permanently close off an area when triggered (not usefull for touch or takedamage doors). +OPEN_DIRECTION indicates which direction to open when START_OPEN is set. +AUTO_OPEN causes the door to open when a player is near instead of waiting for the player to use the door. +TARGETED door is only operational from triggers or script + +"message" is printed when the door is touched if it is a trigger door and it hasn't been fired yet +"angle" determines the opening direction. point toward the middle of the door (away from the hinge) +"targetname" if set, no touch field will be spawned and a remote button or trigger field activates the door. +"health" if set, door must be shot open +"speed" move speed (100 default) +"time" move time (1/speed default, overides speed) +"wait" wait before returning (3 default, -1 = never return) +"lip" lip remaining at end of move (8 default) +"dmg" damage to inflict when blocked (0 default) +"key" The item needed to open this door (default nothing) + +"sound_stop" Specify the sound that plays when the door stops moving (default global door_stop) +"sound_move" Specify the sound that plays when the door opens or closes (default global door_moving) +"sound_message" Specify the sound that plays when the door displays a message +"sound_locked" Specify the sound that plays when the door is locked + +******************************************************************************/ + +Event EV_SlidingDoor_Setup + ( + "setup", + EV_HIDE, + NULL, + NULL, + "Sets up the sliding door." + ); +Event EV_SlidingDoor_SetLip + ( + "lip", + EV_DEFAULT, + "f", + "lip", + "Sets the lip of the sliding door." + ); +Event EV_SlidingDoor_SetSpeed + ( + "speed", + EV_DEFAULT, + "f", + "speed", + "Sets the speed of the sliding door." + ); + +CLASS_DECLARATION( Door, SlidingDoor, "func_door" ) + { + { &EV_Door_DoClose, DoClose }, + { &EV_Door_DoOpen, DoOpen }, + { &EV_SlidingDoor_Setup, Setup }, + { &EV_SlidingDoor_SetLip, SetLip }, + { &EV_SlidingDoor_SetSpeed, SetSpeed }, + { &EV_SetAngle, SetMoveDir }, + { NULL, NULL } + }; + +void SlidingDoor::SetMoveDir + ( + Event *ev + ) + + { + float t; + float angle; + + angle = ev->GetFloat( 1 ); + movedir = G_GetMovedir( angle ); + dir = movedir; + t = dir[ 0 ]; + dir[ 0 ] = -dir[ 1 ]; + dir[ 1 ] = t; + } + +void SlidingDoor::DoOpen + ( + Event *ev + ) + + { + MoveTo( pos2, angles, speed*totalmove, EV_Door_OpenEnd ); + } + +void SlidingDoor::DoClose + ( + Event *ev + ) + + { + MoveTo( pos1, angles, speed*totalmove, EV_Door_CloseEnd ); + } + +void SlidingDoor::SetLip + ( + Event *ev + ) + + { + lip = ev->GetFloat( 1 ); + CancelEventsOfType( EV_SlidingDoor_Setup ); + PostEvent( EV_SlidingDoor_Setup, EV_POSTSPAWN ); + } + +void SlidingDoor::SetSpeed + ( + Event *ev + ) + + { + basespeed = ev->GetFloat( 1 ); + CancelEventsOfType( EV_SlidingDoor_Setup ); + PostEvent( EV_SlidingDoor_Setup, EV_POSTSPAWN ); + } + +void SlidingDoor::Setup + ( + Event *ev + ) + + { + totalmove = fabs( movedir * size ) - lip; + pos1 = origin; + pos2 = pos1 + movedir * totalmove; + + if ( basespeed ) + { + speed = basespeed / totalmove; + } + } + +SlidingDoor::SlidingDoor() + { + if ( LoadingSavegame ) + { + return; + } + lip = 8; + basespeed = 0; + movedir = G_GetMovedir( 0 ); + + PostEvent( EV_SlidingDoor_Setup, EV_POSTSPAWN ); + } + +/*****************************************************************************/ +/*QUAKED script_door (0 0.5 1) ? START_OPEN x DOOR_DONT_LINK NOT_PLAYERS NOT_MONSTERS TOGGLE AUTO_OPEN TARGETED +if two doors touch, they are assumed to be connected and operate as a unit. + +TOGGLE causes the door to wait in both the start and end states for a trigger event. +DOOR_DONT_LINK is for when you have two doors that are touching but you want to operate independently. + +START_OPEN causes the door to move to its destination when spawned, and operate in reverse. It is used to temporarily or permanently close off an area when triggered (not usefull for touch or takedamage doors). +OPEN_DIRECTION indicates which direction to open when START_OPEN is set. +AUTO_OPEN causes the door to open when a player is near instead of waiting for the player to use the door. +TARGETED door is only operational from triggers or script + +"message" is printed when the door is touched if it is a trigger door and it hasn't been fired yet +"angle" determines the opening direction. point toward the middle of the door (away from the hinge) +"targetname" if set, no touch field will be spawned and a remote button or trigger field activates the door. +"health" if set, door must be shot open +"speed" move speed (100 default) +"time" move time (1/speed default, overides speed) +"wait" wait before returning (3 default, -1 = never return) +"dmg" damage to inflict when blocked (0 default) +"key" The item needed to open this door (default nothing) +"initthread" code to execute to setup the door (optional) +"openthread" code to execute when opening the door (required) + The openthread should send the "dooropened" event to the door, when it is completely open +"closethread" code to execute when closing the door (required) + The closethread should send the "doorclosed" event to the door, when it is completely closed + +"sound_stop" Specify the sound that plays when the door stops moving (default global door_stop) +"sound_move" Specify the sound that plays when the door opens or closes (default global door_moving) +"sound_message" Specify the sound that plays when the door displays a message +"sound_locked" Specify the sound that plays when the door is locked + +******************************************************************************/ + +Event EV_ScriptDoor_DoInit + ( + "doinit", + EV_DEFAULT, + NULL, + NULL, + "Sets up the script door." + ); +Event EV_ScriptDoor_SetOpenThread + ( + "openthread", + EV_DEFAULT, + "s", + "openthread", + "Set the thread to run when the door is opened (required)." + ); +Event EV_ScriptDoor_SetCloseThread + ( + "closethread", + EV_DEFAULT, + "s", + "closethread", + "Set the thread to run when the door is closed (required)." + ); +Event EV_ScriptDoor_SetInitThread + ( + "initthread", + EV_DEFAULT, + "s", + "initthread", + "Set the thread to run when the door is initialized (optional)." + ); + +CLASS_DECLARATION( Door, ScriptDoor, "script_door" ) + { + { &EV_ScriptDoor_DoInit, DoInit }, + { &EV_Door_DoClose, DoClose }, + { &EV_Door_DoOpen, DoOpen }, + { &EV_ScriptDoor_SetInitThread, SetInitThread }, + { &EV_ScriptDoor_SetOpenThread, SetOpenThread }, + { &EV_ScriptDoor_SetCloseThread, SetCloseThread }, + { &EV_SetAngle, SetMoveDir }, + { NULL, NULL } + }; + +void ScriptDoor::SetMoveDir + ( + Event *ev + ) + + { + float t; + float angle; + + angle = ev->GetFloat( 1 ); + movedir = G_GetMovedir( angle ); + dir = movedir; + t = dir[ 0 ]; + dir[ 0 ] = -dir[ 1 ]; + dir[ 1 ] = t; + } + +void ScriptDoor::SetOpenThread + ( + Event *ev + ) + { + openthreadname = ev->GetString( 1 ); + } + +void ScriptDoor::SetCloseThread + ( + Event *ev + ) + { + closethreadname = ev->GetString( 1 ); + } + +void ScriptDoor::DoInit + ( + Event *ev + ) + { + const char * label = NULL; + GameScript * s; + const char * tname; + + startorigin = origin; + doorsize = fabs( movedir * size ); + + // + // see if we have an openthread + // + if ( !openthreadname.length() ) + { + warning( "ScriptDoor", "No openthread defined for door at %.2f %.2f %.2f", origin[0], origin[1], origin[2] ); + } + + // + // see if we have an closethread + // + if ( !closethreadname.length() ) + { + warning( "ScriptDoor", "No closethread defined for door at %.2f %.2f %.2f", origin[0], origin[1], origin[2] ); + } + + s = ScriptLib.GetScript( ScriptLib.GetGameScript() ); + if ( !s ) + { + warning( "DoInit", "Null game script" ); + return; + } + + if ( initthreadname.length() ) + label = initthreadname.c_str(); + + doorthread = Director.CreateThread( s, label, MODEL_SCRIPT ); + if ( !doorthread ) + { + warning( "DoInit", "Could not allocate thread." ); + return; + } + doorthread->Vars()->SetVariable( "self", this ); + tname = TargetName(); + if ( tname && tname[ 0 ] ) + { + str name; + name = "$" + str( tname ); + doorthread->Vars()->SetVariable( "targetname", name.c_str() ); + } + doorthread->Vars()->SetVariable( "startorigin", startorigin ); + doorthread->Vars()->SetVariable( "startangles", startangle ); + doorthread->Vars()->SetVariable( "movedir", movedir ); + doorthread->Vars()->SetVariable( "doorsize", doorsize ); + if ( initthreadname.length() ) + { + // start right away + doorthread->StartImmediately(); + } + } + +void ScriptDoor::DoOpen + ( + Event *ev + ) + + { + if ( !doorthread ) + { + warning( "DoOpen", "No Thread allocated." ); + return; + } + else + { + if ( !doorthread->Goto( openthreadname.c_str() ) ) + { + warning( "DoOpen", "Could not goto %s", openthreadname.c_str() ); + return; + } + } + + if ( previous_state == STATE_CLOSED ) + { + diropened = 0; + if ( ev->NumArgs() > 0 ) + { + Entity *other; + Vector p; + + other = ev->GetEntity( 1 ); + p = other->origin - origin; + p.z = 0; + diropened = dir * p; + } + } + doorthread->Vars()->SetVariable( "origin", origin ); + doorthread->Vars()->SetVariable( "opendot", diropened ); + doorthread->Start( 0 ); + } + +void ScriptDoor::DoClose + ( + Event *ev + ) + { + if ( !doorthread ) + { + warning( "DoClose", "No Thread allocated." ); + return; + } + else + { + if ( !doorthread->Goto( closethreadname.c_str() ) ) + { + warning( "DoOpen", "Could not goto %s", closethreadname.c_str() ); + } + } + doorthread->Vars()->SetVariable( "origin", origin ); + doorthread->Start( 0 ); + } + +void ScriptDoor::SetInitThread + ( + Event *ev + ) + + { + initthreadname = ev->GetString( 1 ); + } + +ScriptDoor::ScriptDoor() + { + if ( LoadingSavegame ) + { + return; + } + startangle = angles; + + // + // clear out the sounds if necessary + // scripted doors typically have their own sounds + // + sound_stop = ""; + sound_move = ""; + + movedir = G_GetMovedir( 0 ); + + PostEvent( EV_ScriptDoor_DoInit, EV_POSTSPAWN ); + } diff --git a/source/source/fgame/doors.h b/source/source/fgame/doors.h new file mode 100644 index 0000000..1f65a36 --- /dev/null +++ b/source/source/fgame/doors.h @@ -0,0 +1,266 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/doors.h $ +// $Revision:: 7 $ +// $Author:: Markd $ +// $Date:: 7/27/00 5:39p $ +// +// Copyright (C) 1997 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/doors.h $ +// +// 7 7/27/00 5:39p Markd +// put in doorcompletelyclosed +// +// 6 7/15/00 3:00p Steven +// fixed door locked sound playing constantly when it is an auto open door +// +// 5 6/23/00 8:41p Markd +// made a lot of changes to different constructors for saved game support +// +// 4 5/25/00 7:52p Markd +// 2nd pass save game stuff +// +// 3 5/24/00 3:14p Markd +// first phase of save/load games +// +// 2 10/14/99 5:08p Markd +// removed a lot of G_GetMoveDir calls from the initialization code +// +// 1 9/10/99 10:53a Jimdose +// +// 1 9/08/99 3:15p Aldie +// +// DESCRIPTION: +// Doors are environment objects that slide open when activated by triggers +// or when used by the player. +// + +#ifndef __DOORS_H__ +#define __DOORS_H__ + +#include "g_local.h" +#include "entity.h" +#include "trigger.h" +#include "scriptslave.h" + +extern Event EV_Door_TryOpen; +extern Event EV_Door_GoDown; +extern Event EV_Door_GoUp; +extern Event EV_Door_HitBottom; +extern Event EV_Door_HitTop; +extern Event EV_Door_Fire; +extern Event EV_Door_Link; +extern Event EV_Door_SetSpeed; +extern Event EV_Door_Lock; +extern Event EV_Door_Unlock; + +class Door; + +typedef SafePtr DoorPtr; + +class Door : public ScriptSlave + { + protected: + str sound_stop; + str sound_move; + str sound_message; + str sound_locked; + float lastblocktime; + float angle; + Vector dir; + float diropened; + int state; + int previous_state; + int trigger; + int nextdoor; + DoorPtr master; + float next_locked_time; + + void SetDir( Event *ev ); + void OpenEnd( Event *ev ); + void CloseEnd( Event *ev ); + void Close( Event *ev ); + void Open( Event *ev ); + void DoorUse( Event *ev ); + void DoorFire( Event *ev ); + void DoorBlocked( Event *ev ); + void FieldTouched( Event *ev ); + void TryOpen( Event *ev ); + void SpawnTriggerField( Vector fmins, Vector fmaxs ); + qboolean DoorTouches( Door *e1 ); + void LinkDoors( Event *ev ); + void SetTime( Event *ev ); + void LockDoor( Event *ev ); + void UnlockDoor( Event *ev ); + void SetStopSound( str sound ); + void SetStopSound( Event *ev ); + void SetMoveSound( str sound ); + void SetMoveSound( Event *ev ); + void SetMessageSound( str sound ); + void SetMessageSound( Event *ev ); + void SetLockedSound( str sound ); + void SetLockedSound( Event *ev ); + void SetWait( Event *ev ); + void SetDmg( Event *ev ); + + public: + CLASS_PROTOTYPE( Door ); + + qboolean locked; + + Door(); + qboolean isOpen( void ); + qboolean isCompletelyClosed( void ); + qboolean CanBeOpenedBy( Entity *ent ); + virtual void Archive( Archiver &arc ); + }; + +inline void Door::Archive + ( + Archiver &arc + ) + { + ScriptSlave::Archive( arc ); + + arc.ArchiveString( &sound_stop ); + arc.ArchiveString( &sound_move ); + arc.ArchiveString( &sound_message ); + arc.ArchiveString( &sound_locked ); + if ( arc.Loading() ) + { + SetStopSound( sound_stop ); + SetMoveSound( sound_move ); + SetMessageSound( sound_message ); + SetLockedSound( sound_locked ); + } + arc.ArchiveFloat( &lastblocktime ); + arc.ArchiveFloat( &angle ); + arc.ArchiveVector( &dir ); + arc.ArchiveFloat( &diropened ); + arc.ArchiveInteger( &state ); + arc.ArchiveInteger( &previous_state ); + arc.ArchiveInteger( &trigger ); + arc.ArchiveInteger( &nextdoor ); + arc.ArchiveSafePointer( &master ); + arc.ArchiveBoolean( &locked ); + arc.ArchiveFloat( &next_locked_time ); + } + +class RotatingDoor : public Door + { + protected: + float angle; + Vector startangle; + int init_door_direction; + + public: + CLASS_PROTOTYPE( RotatingDoor ); + + void DoOpen( Event *ev ); + void DoClose( Event *ev ); + void OpenAngle( Event *ev ); + virtual void Archive( Archiver &arc ); + + RotatingDoor(); + }; + +inline void RotatingDoor::Archive + ( + Archiver &arc + ) + { + Door::Archive( arc ); + + arc.ArchiveFloat( &angle ); + arc.ArchiveVector( &startangle ); + arc.ArchiveInteger( &init_door_direction ); + } + +class SlidingDoor : public Door + { + protected: + float totalmove; + float lip; + Vector pos1; + Vector pos2; + float basespeed; + Vector movedir; + + public: + CLASS_PROTOTYPE( SlidingDoor ); + + void SetMoveDir( Event *ev ); + void Setup( Event *ev ); + void SetLip( Event *ev ); + void SetSpeed( Event *ev ); + void DoOpen( Event *ev ); + void DoClose( Event *ev ); + virtual void Archive( Archiver &arc ); + + SlidingDoor(); + }; + +inline void SlidingDoor::Archive + ( + Archiver &arc + ) + { + Door::Archive( arc ); + + arc.ArchiveFloat( &totalmove ); + arc.ArchiveFloat( &lip ); + arc.ArchiveVector( &pos1 ); + arc.ArchiveVector( &pos2 ); + arc.ArchiveVector( &movedir ); + arc.ArchiveFloat( &basespeed ); + } + +class ScriptDoor : public Door + { + protected: + ThreadPtr doorthread; + str initthreadname; + str openthreadname; + str closethreadname; + float doorsize; + Vector startangle; + Vector startorigin; + Vector movedir; + + public: + CLASS_PROTOTYPE( ScriptDoor ); + + void SetMoveDir( Event *ev ); + void DoInit( Event *ev ); + void DoOpen( Event *ev ); + void DoClose( Event *ev ); + void SetOpenThread( Event *ev ); + void SetCloseThread( Event *ev ); + void SetInitThread( Event *ev ); + virtual void Archive( Archiver &arc ); + ScriptDoor(); + }; + +inline void ScriptDoor::Archive + ( + Archiver &arc + ) + { + Door::Archive( arc ); + + arc.ArchiveSafePointer( &doorthread ); + arc.ArchiveString( &initthreadname ); + arc.ArchiveString( &openthreadname ); + arc.ArchiveString( &closethreadname ); + arc.ArchiveFloat( &doorsize ); + arc.ArchiveVector( &startangle ); + arc.ArchiveVector( &startorigin ); + arc.ArchiveVector( &movedir ); + } + +#endif /* doors.h */ diff --git a/source/source/fgame/earthquake.cpp b/source/source/fgame/earthquake.cpp new file mode 100644 index 0000000..c91e481 --- /dev/null +++ b/source/source/fgame/earthquake.cpp @@ -0,0 +1,258 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/earthquake.cpp $ +// $Revision:: 9 $ +// $Author:: Markd $ +// $Date:: 7/18/00 3:29p $ +// +// Copyright (C) 1997 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/earthquake.cpp $ +// +// 9 7/18/00 3:29p Markd +// added better caching for sounds in general +// +// 8 6/23/00 8:41p Markd +// made a lot of changes to different constructors for saved game support +// +// 7 6/14/00 3:50p Markd +// Cleaned up more Intel Compiler warnings +// +// 6 4/30/00 2:46p Markd +// fixed earthquake screwups +// +// 5 3/21/00 5:05p Markd +// improved earthquakes a lot with a visual effect +// +// 4 12/11/99 6:44p Markd +// second run-through of q3a merge, got the entire project to build without +// errors or warnings +// +// 3 11/02/99 5:45p Steven +// Added level wide sound stuff. +// +// 2 9/29/99 5:18p Steven +// Event formatting. +// +// 1 9/10/99 10:53a Jimdose +// +// 1 9/08/99 3:15p Aldie +// +// 13 8/28/99 11:43a Steven +// Removed global from sound function calls. +// +// 12 6/11/99 1:23p Phook +// +// 11 6/11/99 12:58p Phook +// Changed from SINED comments to QUAKED +// +// 10 6/11/99 12:46p Phook +// EClass color changes +// +// DESCRIPTION: +// Earthquake trigger causes a localized earthquake when triggered. +// The earthquake effect is visible to the user as the shaking of his screen. +// +#include "earthquake.h" + +#define EARTHQUAKE_NO_RAMPUP ( 1 << 0 ) +#define EARTHQUAKE_NO_RAMPDOWN ( 1 << 1 ) +/*****************************************************************************/ +/*QUAKED func_earthquake (0 0.25 0.5) (-8 -8 -8) (8 8 8) NO_RAMPUP NO_RAMPDOWN + Causes an earthquake +"duration" is the duration of the earthquake. Default is 0.8 seconds. +"magnitude" severity of the quake. Default 1.0 +******************************************************************************/ + +Event EV_Earthquake_Deactivate + ( + "earthquake_deactivate", + EV_DEFAULT, + NULL, + NULL, + "Stops the earthquake." + ); +Event EV_Earthquake_SetDuration + ( + "duration", + EV_DEFAULT, + "f", + "duration", + "Sets the duration of the earthquake." + ); + +Event EV_Earthquake_SetMagnitude + ( + "magnitude", + EV_DEFAULT, + "f", + "theMagnitude", + "Sets the magnitude of the earthquake." + ); + +Event EV_Earthquake_Think + ( + "_earthquake_think", + EV_DEFAULT, + NULL, + NULL, + "think function for the earthquake." + ); + +CLASS_DECLARATION( Trigger, Earthquake, "func_earthquake" ) + { + { &EV_Touch, NULL }, + { &EV_Trigger_Effect, Activate }, + { &EV_Earthquake_Deactivate, Deactivate }, + { &EV_Earthquake_SetDuration, SetDuration }, + { &EV_Earthquake_SetMagnitude, SetMagnitude }, + { &EV_Earthquake_Think, ThinkEvent }, + { NULL, NULL } + }; + +Earthquake::Earthquake + ( + void + ) + + { + // cache in the quake sound + CacheResource( "snd_earthquake", this ); + + if ( LoadingSavegame ) + { + return; + } + + duration = 0.8f; + magnitude = 1.0f; + quakeactive = false; + + // make sure it gets sent to the client + edict->svflags &= ~SVF_NOCLIENT; + } + +void Earthquake::SetDuration + ( + Event *ev + ) + + { + duration = ev->GetFloat( 1 ); + } + +void Earthquake::SetMagnitude + ( + Event *ev + ) + + { + magnitude = ev->GetFloat( 1 ); + } + +void Earthquake::Activate + ( + Event *ev + ) + + { + float newtime; + + starttime = level.time; + newtime = duration + level.time; + if ( newtime > level.earthquake ) + { + level.earthquake = newtime; + level.earthquake_magnitude = magnitude; + } + quakeactive = true; + LoopSound( "snd_earthquake", DEFAULT_VOL, LEVEL_WIDE_MIN_DIST ); + + PostEvent( EV_Earthquake_Deactivate,duration); + PostEvent( EV_Earthquake_Think, 0 ); + } + +void Earthquake::ThinkEvent + ( + Event *ev + ) + + { + float timedelta; + + if ( !quakeactive ) + { + return; + } + + timedelta = level.time - starttime; + + // we are in the first half of the earthquake + if ( timedelta < ( duration * 0.5f ) ) + { + if ( !( spawnflags & EARTHQUAKE_NO_RAMPUP ) ) + { + float rampuptime; + + rampuptime = starttime + ( duration * 0.33f ); + if ( level.time < rampuptime ) + { + float scale; + + scale = ( timedelta ) / ( duration * 0.33f ); + level.earthquake_magnitude = magnitude * scale; + edict->s.loopSoundVolume = scale; + } + else + { + level.earthquake_magnitude = magnitude; + edict->s.loopSoundVolume = 1.0f; + } + } + } + // we are in the second half of the earthquake + else + { + if ( !( spawnflags & EARTHQUAKE_NO_RAMPDOWN ) ) + { + float rampdowntime; + + rampdowntime = starttime + ( duration * 0.66f ); + if ( level.time > rampdowntime ) + { + float scale; + + scale = 1.0f - ( ( level.time - rampdowntime ) / ( duration * 0.33f ) ); + level.earthquake_magnitude = magnitude * scale; + edict->s.loopSoundVolume = scale; + } + else + { + level.earthquake_magnitude = magnitude; + edict->s.loopSoundVolume = 1.0f; + } + } + } + + CancelEventsOfType( EV_Earthquake_Think ); + PostEvent( EV_Earthquake_Think, FRAMETIME ); + } + + +void Earthquake::Deactivate + ( + Event *ev + ) + + { + quakeactive = false; + level.earthquake = 0; + level.earthquake_magnitude = 0; + StopLoopSound(); + // make sure to stop thinking + CancelEventsOfType( EV_Earthquake_Think ); + } diff --git a/source/source/fgame/earthquake.h b/source/source/fgame/earthquake.h new file mode 100644 index 0000000..12f9a52 --- /dev/null +++ b/source/source/fgame/earthquake.h @@ -0,0 +1,82 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/earthquake.h $ +// $Revision:: 6 $ +// $Author:: Markd $ +// $Date:: 6/14/00 3:50p $ +// +// Copyright (C) 1997 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/earthquake.h $ +// +// 6 6/14/00 3:50p Markd +// Cleaned up more Intel Compiler warnings +// +// 5 6/14/00 2:17p Markd +// fixed compiler warnings for Intel Compiler +// +// 4 5/25/00 7:52p Markd +// 2nd pass save game stuff +// +// 3 5/24/00 3:14p Markd +// first phase of save/load games +// +// 2 3/21/00 5:05p Markd +// improved earthquakes a lot with a visual effect +// +// 1 9/10/99 10:53a Jimdose +// +// 1 9/08/99 3:15p Aldie +// +// DESCRIPTION: +// Earthquake trigger causes a localized earthquake when triggered. +// The earthquake effect is visible to the user as the shaking of his screen. +// + +#ifndef __EARTHQUAKE_H__ +#define __EARTHQUAKE_H__ + +#include "g_local.h" +#include "trigger.h" + +#define EARTHQUAKE_STRENGTH 50 + +class Earthquake : public Trigger + { + protected: + float starttime; + qboolean quakeactive; + float magnitude; + float duration; + + public: + CLASS_PROTOTYPE( Earthquake ); + + Earthquake(); + void Activate( Event *ev ); + void Deactivate( Event *ev ); + void SetDuration( Event *ev ); + void SetMagnitude( Event *ev ); + void ThinkEvent( Event *ev ); + qboolean EarthquakeActive() { return quakeactive; }; + virtual void Archive( Archiver &arc ); + }; + +inline void Earthquake::Archive + ( + Archiver &arc + ) + { + Trigger::Archive( arc ); + + arc.ArchiveFloat( &starttime ); + arc.ArchiveBoolean( &quakeactive ); + arc.ArchiveFloat( &magnitude ); + arc.ArchiveFloat( &duration ); + } + +#endif /* Earthquake.h */ diff --git a/source/source/fgame/edenwater.cpp b/source/source/fgame/edenwater.cpp new file mode 100644 index 0000000..801e577 --- /dev/null +++ b/source/source/fgame/edenwater.cpp @@ -0,0 +1,106 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/edenwater.cpp $ +// $Revision:: 12 $ +// $Author:: Markd $ +// $Date:: 7/14/00 11:45p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/edenwater.cpp $ +// +// 12 7/14/00 11:45p Markd +// Added ambient sounds to func_supllywater +// +// 11 7/11/00 11:13a Markd +// Took space out of EdenWater item name +// +// 10 7/01/00 4:10p Markd +// fixed edenwater pickup stuff +// +// 9 6/27/00 5:59p Markd +// got rid of unused variable +// +// 8 6/27/00 5:45p Steven +// Made it so water is not picked up if player already has 100. +// +// 7 4/06/00 3:47p Markd +// added blue shift to water pickup +// +// 6 4/06/00 11:44a Aldie +// Fix for water so it's not put into the player's inventory +// +// 5 1/26/00 3:33p Aldie +// Change Amount to getAmount. Added some 'listinventory' command. Added give +// all cheat to execute the script in global/giveall.txt +// +// 4 1/25/00 4:11p Aldie +// Fix the amount to use the internal variable +// +// 3 1/18/00 3:27p Aldie +// Changed startamount to 1 +// +// 2 1/18/00 3:11p Aldie +// First version of edenwater +// +// DESCRIPTION: +// Eden water pickupable item + +#include "edenwater.h" +#include "player.h" + +CLASS_DECLARATION( Item, EdenWater, "item_edenwater" ) + { + { &EV_Item_Pickup, PickupEdenWater }, + { NULL, NULL } + }; + +EdenWater::EdenWater + ( + ) + + { + setName( "EdenWater" ); + setAmount( 1 ); + } + +void EdenWater::PickupEdenWater + ( + Event *ev + ) + + { + Player *player; + Entity *other; + str realname; + + other = ev->GetEntity( 1 ); + + if ( !other || !other->isSubclassOf( Player ) ) + { + return; + } + + player = ( Player * )other; + + if ( player->GetWaterPower() >= 100 ) + return; + + player->SetWaterPower( player->GetWaterPower() + this->amount ); + + realname = GetRandomAlias( "snd_pickup" ); + if ( realname.length() > 1 ) + player->Sound( realname, CHAN_ITEM ); + + PostEvent( EV_Remove, 0 ); + + // fire off any pickup_thread's + if ( pickup_thread.length() ) + { + ExecuteThread( pickup_thread ); + } + } diff --git a/source/source/fgame/edenwater.h b/source/source/fgame/edenwater.h new file mode 100644 index 0000000..1bb2f9c --- /dev/null +++ b/source/source/fgame/edenwater.h @@ -0,0 +1,40 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/edenwater.h $ +// $Revision:: 2 $ +// $Author:: Aldie $ +// $Date:: 1/18/00 3:11p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/edenwater.h $ +// +// 2 1/18/00 3:11p Aldie +// First version of edenwater +// +// DESCRIPTION: +// EdenWater header file + + +#ifndef __EDENWATER_H__ +#define __EDENWATER_H__ + +#include "g_local.h" +#include "item.h" +#include "sentient.h" +#include "item.h" + +class EdenWater : public Item + { + public: + CLASS_PROTOTYPE( EdenWater ); + + EdenWater(); + virtual void PickupEdenWater( Event *ev ); + }; + +#endif /* edenwater.h */ diff --git a/source/source/fgame/entity.cpp b/source/source/fgame/entity.cpp new file mode 100644 index 0000000..a105d4a --- /dev/null +++ b/source/source/fgame/entity.cpp @@ -0,0 +1,5211 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/entity.cpp $ +// $Revision:: 130 $ +// $Author:: Markd $ +// $Date:: 8/09/00 1:51p $ +// +// Copyright (C) 1997 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/entity.cpp $ +// +// 130 8/09/00 1:51p Markd +// bullet proofed detachallchildren fix +// +// 129 8/08/00 3:00p Aldie +// Fix for detachallchildren +// +// 128 29.07.00 10:51p Jimdose +// added radius2 to gentity_t +// +// 127 7/26/00 6:18p Aldie +// Fix for detachallchildren +// +// 126 7/24/00 10:38a Markd +// fixed solid bsp bug +// +// 125 7/23/00 1:47p Aldie +// Added detach all children command +// +// 124 7/19/00 9:52p Aldie +// Put ET_EVENTS back in. They will get sent over once, and should get +// processed once on the client. +// +// 123 7/17/00 5:09p Markd +// added sendonce flag to svflags +// +// 122 7/11/00 8:55p Aldie +// Added in an autoaim flag +// +// 121 7/10/00 11:54p Markd +// added exit level code +// +// 120 6/30/00 3:08p Markd +// fixed rise animation issues +// +// 119 6/30/00 10:45a Markd +// added MOVETYPE_STATIONARY and revamped some physics +// +// 118 6/27/00 5:45p Steven +// Changed HurtEvent to come from the centroid instead of the origin. +// +// 117 6/26/00 5:50p Markd +// re-did some renderfx commands, fixed anti-sb juice stuff +// +// 116 6/26/00 2:41p Markd +// put in more world protection for targetname +// +// 115 6/26/00 2:39p Markd +// made sure that world would not be re-targeted +// +// 114 6/24/00 7:39p Aldie +// Fixed attachmodel event to handle a failed attach return value and delete +// the object that was created. +// +// 113 6/19/00 5:55p Aldie +// Added support for invisible models that are lit only by negative intensity +// lights +// +// 112 6/14/00 3:50p Markd +// Cleaned up more Intel Compiler warnings +// +// 111 6/10/00 2:39p Markd +// fixed typo in event documentation +// +// 110 6/10/00 1:41p Markd +// Added scriptshader alias for shader +// +// 109 6/09/00 2:25p Steven +// Work to get bound entites to always get sent over if the entity they are +// bound to is. +// +// 108 6/08/00 8:34p Markd +// fixed localorigin problem +// +// 107 6/07/00 5:36p Markd +// fixed radius calcualtion for BSP objects +// +// 106 6/05/00 2:22p Markd +// fixed viewspawn issue +// +// 105 6/04/00 3:48p Markd +// Added precise shadows to certain characters +// +// 104 6/03/00 5:45p Markd +// fixed some more savegame issues +// +// 103 6/03/00 5:23p Markd +// fixed bug in saved games, made items have playersolid as their default +// clipmask +// +// 102 6/01/00 2:01p Steven +// Made it so you can turn look at me stuff on and off. +// +// 101 5/31/00 5:33p Steven +// Added look at me stuff. +// +// 100 5/31/00 10:24a Markd +// changed LoadingServer to LoadingSavegame +// +// 99 5/29/00 1:16p Markd +// 3rd round of saved games +// +// 98 5/24/00 6:05p Markd +// Fixed bug where MAX_MAP_BOUNDS was being used instead of MAP_SIZE +// +// 97 5/10/00 10:31a Steven +// Added com_blood stuff. +// +// 96 5/07/00 5:00p Markd +// Fixed ProcessInitCommands bug +// +// 95 5/05/00 2:15p Steven +// Only removed an attached model if the model names match if a model name is +// passed in. +// +// 94 5/04/00 2:21p Markd +// Added godmode support to flags +// +// 93 4/20/00 5:44p Steven +// Added offset to attachmodel. +// +// 92 4/20/00 9:23a Markd +// Fixed CanDamage function to be more forgiving for bmodels +// +// 91 4/19/00 5:48p Markd +// put in world targetname bulletproofing +// +// 90 4/15/00 5:43p Steven +// Made damage fractioanl again. +// +// 89 4/15/00 5:18p Aldie +// Added stun events and fixed yet another bug with Ammo and AutoPutaway +// +// 88 4/15/00 1:30p Steven +// Made it so the direction in HurtEvent is normalized. +// +// 87 4/14/00 1:40p Steven +// Added direction to hurt. +// +// 86 4/13/00 4:58p Steven +// Changed the string name of an event so that it didn't conflict with another +// one in actor. +// +// 85 4/13/00 3:45p Aldie +// Added more flashbang support. Added damage_type to entities used to specify +// what type of damage they take. +// +// 84 4/11/00 5:43p Steven +// Sinking into ground work. +// +// 83 4/10/00 6:49p Steven +// Added bind_use_my_angles so that a bound entity could use its angles for +// its local offset or its bindmaster. +// +// 82 4/10/00 11:57a Steven +// Moved process init commands to happen before EV_POSTSPAWN. +// +// 81 4/05/00 3:54p Markd +// made lightRadius work with settings from the editor +// +// 80 4/01/00 3:55p Markd +// Added FL_TOUCH_TRIGGERS support +// +// 79 3/31/00 6:23p Markd +// fixed usage of local orientation copy when edict->s.mat would work fine +// +// 78 3/31/00 6:07p Markd +// fixed matrix/orientation bug in entity +// +// 77 3/28/00 10:05a Steven +// Fixed one of the event documentations. +// +// 76 3/23/00 10:44a Markd +// fixed fade command, it wasn't setting the final alpha value +// +// 75 3/21/00 5:06p Markd +// added vehicle support +// +// 74 3/20/00 3:01p Markd +// added more functionality to falling rock +// +// 73 3/17/00 12:29p Steven +// Added means of death parameter to HurtEvent. +// +// 72 3/15/00 4:09p Aldie +// Fixed a bug with using weapons, and added some ability to force a state in +// the player +// +// 71 3/14/00 5:08p Aldie +// Fixed event mismatch +// +// 70 3/14/00 4:56p Aldie +// Added new script damage command +// +// 69 3/04/00 5:05p Steven +// Added a skipent to CanDamage and made Explosion pass in an owner to +// ExplosionAttack. +// +// 68 3/04/00 11:48a Markd +// Added light style support +// +// 67 3/01/00 10:58a Jimdose +// added TriggerEvent +// +// 66 2/21/00 4:39p Markd +// Added fade command to entity +// +// 65 2/21/00 3:33p Steven +// Added a GetControllerAngles function. +// +// 64 2/18/00 6:41p Markd +// Added crossblend support to surfaces +// +// 63 2/18/00 6:21p Aldie +// Added yet another parm to attachmodel... we need to find a better way to fix +// that. +// +// 62 2/17/00 8:07p Aldie +// Put in a fix for fading models +// +// 61 2/17/00 6:33p Aldie +// Added even more parms to attachmodel +// +// 60 2/07/00 3:59p Steven +// Fixed dead monsters not always falling to the ground. +// +// 59 2/03/00 7:01p Jimdose +// made all hardcoded map bounds use MAX_MAP_BOUNDS +// +// 58 1/31/00 3:56p Aldie +// working on the auto aim / tracking code +// +// 57 1/29/00 5:27p Steven +// Fixed children not using entity numbers correctly (weren't using +// ENTITYNUM_NONE). +// +// 56 1/27/00 12:15p Markd +// added fullbright support and minlight support to all lighting functions +// +// 55 1/27/00 11:35a Markd +// Fixed solid/notsolid client side entities +// +// 54 1/22/00 2:54p Markd +// fixed sprite problem where sprites were incorrectly set to ET_MODELANIM +// instead of ET_SPRITE +// +// 53 1/22/00 1:43p Markd +// Fixed attached entity bug +// +// 52 1/22/00 12:42p Jimdose +// got rid of calls to vec3() +// +// 51 1/20/00 7:05p Jimdose +// removed angmod +// +// 50 1/19/00 9:01p Steven +// Added fade support to the attachmodel command. +// +// 49 1/19/00 7:59p Markd +// Rewrote Surface Model Event and also added changeoutfit command to player +// +// 48 1/19/00 7:09p Steven +// Added a removeattachedmodel event. +// +// 47 1/15/00 3:57p Markd +// Eliminated multiple "angle" events and replaced them with EV_SetAngle +// +// 46 1/14/00 5:06p Markd +// Removed surface num, tri_num and damage_multiplier from multiple functions +// and events +// +// 45 1/13/00 7:08p Steven +// Made a SetControllerAngles event so I could post them in the future. +// +// 44 1/12/00 6:17p Jimdose +// fixed spawnflags--added spawnflags to level +// +// 43 1/10/00 6:17p Jimdose +// more code cleanup +// +// 42 1/06/00 7:00p Steven +// Made it so the surface command would recognize * notation. +// +// 41 1/05/00 7:25p Jimdose +// made angle functions all use the same coordinate system +// AngleVectors now returns left instead of right +// no longer need to invert pitch +// +// 40 12/20/99 11:41a Markd +// Fixed a music trigger issue +// +// 39 12/17/99 8:26p Jimdose +// got rid of unused vars and functions +// +// 38 12/17/99 6:35p Jimdose +// changed spawnarg code +// added Level class for spawning and map control +// got rid of unused or superflous variables +// changed setjmp/longjmp calls to try/throw/catch exception handling +// +// 37 12/14/18 2:42p Jimdose +// moved blood_model to Sentient +// +// 36 12/02/99 6:57p Jimdose +// removed classname variable from Entity +// +// 35 11/12/99 6:52p Markd +// fixed up sound manager saving and loading +// +// 34 11/02/99 6:12p Steven +// Always send original position of sound even if attached to entity. +// +// 33 11/02/99 5:44p Steven +// Added level wide sound stuff. +// +// 32 11/01/99 4:00p Jimdose +// added SetControllerAngles and SetControllerTag +// +// 31 10/28/99 6:07p Steven +// Added a use_angles flag and an offset to the entity attach stuff. +// +// 30 10/25/99 6:39p Markd +// removed size and other unused variables, added radius and centroid to both +// server and game code +// +// 29 10/22/99 11:02a Markd +// fixed fadein command again! +// +// 28 10/21/99 5:24p Aldie +// Removed scaling from fade +// +// 27 10/21/99 2:19p Markd +// Changed range to use ..., fixed fadein and fadeout some more +// +// 26 10/21/99 1:55p Markd +// added more functionality to fadein and fadeout +// +// 25 10/21/99 10:57a Markd +// Added fade in and fixed suppresion of _events. +// +// 24 10/19/99 7:52p Markd +// Removed three part model system +// +// 23 10/14/99 11:05a Aldie +// Make attached models Animate instead of Entity +// +// 22 10/11/99 3:10p Steven +// Event documentation cleanup. +// +// 21 10/08/99 2:12p Markd +// Made entities default to ET_GENERAL, ET_MODELANIm if tiki and ET_SPRITE if +// sprite +// +// 20 10/07/99 12:45p Aldie +// initialized the owner num to the ENTITYNUM_NONE +// +// 19 10/06/99 7:25p Markd +// removed TIMESTAMP, time and fixed make_static bug +// +// 18 10/03/99 4:38p Markd +// Fixed ?Out command +// +// 17 10/02/99 6:51p Markd +// Put in backend work for event documentation and fixed a lot of event +// documentation bugs +// +// 16 10/01/99 4:52p Markd +// Made Warning level 4 work on all projects +// +// 15 10/01/99 2:42p Markd +// moved all the binding code back into Entity from Mover +// +// 14 9/30/99 4:38p Aldie +// Fix for sprites +// +// 13 9/29/99 7:43p Markd +// Made items behave better when dropping to floor +// +// 12 9/28/99 10:06a Markd +// somehow forgot to checkin some changes +// +// 11 9/28/99 9:51a Markd +// fixed default flags +// +// 10 9/27/99 5:44p Markd +// began documentation and cleanup phase after merge +// +// 9 9/20/99 11:43a Markd +// added currentOrigin and currentAngles support to setOrigin and setAngles +// +// 8 9/17/99 5:32p Jimdose +// added TR_LERP +// +// 7 9/17/99 4:54p Aldie +// Fix for parent +// +// 6 9/16/99 7:43p Jimdose +// added check for NULL child in destructor +// +// 5 9/16/99 4:47p Jimdose +// removed SpawnParticles +// +// 4 9/16/99 3:18p Markd +// fixed some entity number screwups +// +// 3 9/16/99 11:18a Markd +// Continuing merge of code, not functional yet but closer +// +// 2 9/13/99 3:27p Aldie +// code merge +// +// 1 9/10/99 10:53a Jimdose +// +// 1 9/08/99 3:15p Aldie +// +// 74 9/02/99 7:43p Markd +// Cached blood model +// +// 73 9/02/99 5:41p Markd +// made CacheResource utility functions changed code every where else +// +// 72 9/02/99 4:35p Markd +// Added Color Offset support for sentients +// +// 71 9/02/99 3:06p Markd +// Fixed speakers, precaching of models and appending "models" and +// automatically caching in projectiles. +// +// 70 9/02/99 2:33p Markd +// Added cache ability to entities +// +// 69 9/02/99 10:49a Steven +// Added a life parameter to the attachmodel command. +// +// 68 9/01/99 6:46p Markd +// made attached models MOVETYPE_NONE +// +// 67 9/01/99 12:02p Steven +// Added blood spurts. +// +// 66 8/31/99 2:44p Steven +// Added a detach_at_death flag to models and fixed explosion origins. +// +// 65 8/30/99 3:25p Steven +// Added an event to kill all of an entities attachments. +// +// 64 8/30/99 2:36p Steven +// Added support for aliases, volume, and minimum distance for loop sounds. +// +// 63 8/28/99 7:46p Markd +// added broadcast to any entity that is a portal sky origin +// +// 62 8/28/99 11:43a Steven +// Removed global from sound function calls. +// +// 61 8/25/99 9:01p Markd +// working on RF_ stuff and local color for entities on client +// +// 60 8/24/99 11:51a Aldie +// Added viewlensflare command +// +// 59 8/24/99 11:26a Steven +// Reworked sound stuff to use global alias, then tiki alias, and then the +// literal. +// +// 58 8/19/99 6:59p Markd +// removed the old tiki_cmd structure, now tiki_cmd_t is passed into the tiki +// functions +// +// 57 8/18/99 3:28p Jimdose +// added cylindrical collision detection +// +// 56 8/17/99 4:49p Markd +// Fixed offset shader effect +// +// 55 8/09/99 11:44a Markd +// Added timestamps for translation and rotation +// +// 54 8/09/99 11:36a Steven +// Explosions can now be based off of tags now instead of just the entities +// origin. +// +// 53 8/06/99 8:00p Markd +// Added shader modifiable from script +// +// 52 8/06/99 3:35p Markd +// Cleaned up cgame, added shader commands and shader manipulation support +// +// 51 7/30/99 6:45p Aldie +// Added explosion command +// +// 50 7/30/99 4:49p Steven +// Added a stationary command to entities and a gas explode flag. +// +// 49 7/23/99 3:27p Aldie +// +// 48 7/08/99 4:58p Markd +// Added scale ability to attachmodel events +// +// 47 7/06/99 8:33p Jimdose +// removed unused player code +// added state machine for player animation +// +// 46 6/16/99 3:52p Aldie +// Make sure sprites entity type get set properly +// +// DESCRIPTION: +// Base class for all enities that are controlled by Sin. If you have any +// object that should be called on a periodic basis and it is not an entity, +// then you have to have an dummy entity that calls it. +// +// An entity in Sin is any object that is not part of the world. Any non-world +// object that is visible in Sin is an entity, although it is not required that +// all entities be visible to the player. Some objects are basically just virtual +// constructs that act as an instigator of certain actions, for example, some +// triggers are invisible and cannot be touched, but when activated by other +// objects can cause things to happen. +// +// All entities are capable of receiving messages from Sin or from other entities. +// Messages received by an entity may be ignored, passed on to their superclass, +// or acted upon by the entity itself. The programmer must decide on the proper +// action for the entity to take to any message. There will be many messages +// that are completely irrelevant to an entity and should be ignored. Some messages +// may require certain states to exist and if they are received by an entity when +// it these states don't exist may indicate a logic error on the part of the +// programmer or map designer and should be reported as warnings (if the problem is +// not severe enough for the game to be halted) or as errors (if the problem should +// not be ignored at any cost). +// + +#include "entity.h" +#include "worldspawn.h" +#include "scriptmaster.h" +#include "sentient.h" +#include "misc.h" +#include "specialfx.h" +#include "object.h" +#include "player.h" +#include "weaputils.h" +#include "soundman.h" +#include "../qcommon/qfiles.h" + +// Player events +Event EV_ClientMove + ( + "client_move", + EV_DEFAULT, + NULL, + NULL, + "The movement packet from the client is processed by this event." + ); +Event EV_ClientEndFrame + ( + "client_endframe", + EV_DEFAULT, + NULL, + NULL, + "Called at the end of each frame for each client." + ); + +// Generic entity events +Event EV_Classname + ( + "classname" , + EV_DEFAULT, + "s", + "nameOfClass", + "Determines what class to use for this entity,\n" + "this is pre-processed from the BSP at the start\n" + "of the level." + ); +Event EV_SpawnFlags + ( + "spawnflags", + EV_DEFAULT, + "i", + "flags", + "spawnflags from the BSP, these are set inside the editor" + ); +Event EV_SetTeam + ( + "team", + EV_DEFAULT, + "s", + "moveTeam", + "used to make multiple entities move together." + ); +Event EV_Trigger + ( + "trigger", + EV_DEFAULT, + "s", + "name", + "Trigger the specified target or entity." + ); +Event EV_Activate + ( + "doActivate", + EV_DEFAULT, + "e", + "activatingEntity", + "General trigger event for all entities" + ); +Event EV_Use + ( + "doUse", + EV_DEFAULT, + "e", + "activatingEntity", + "sent to entity when it is used by another entity" + ); + +Event EV_FadeNoRemove + ( + "fade", + EV_DEFAULT, + "F[0,]F[0,1]", + "fadetime target_alpha", + "Fade the entity's alpha, reducing it by 0.03\n" + "every FRAMETIME, until it has faded out, does not remove the entity" + ); + +Event EV_FadeOut + ( + "_fadeout", + EV_DEFAULT, + NULL, + NULL, + "Fade the entity's alpha and scale out, reducing it by 0.03\n" + "every FRAMETIME, until it has faded out, removes the entity\n" + "Once the entity has been completely faded, the entity is removed." + ); + +Event EV_Fade + ( + "fadeout", + EV_DEFAULT, + "F[0,]F[0,1]", + "fadetime target_alpha", + "Fade the entity's alpha and scale out, reducing it by 0.03\n" + "every FRAMETIME, until it has faded out. If fadetime or\n" + "target_alpha are defined, they will override the defaults.\n" + "Once the entity has been completely faded, the entity is removed." + ); +Event EV_FadeIn + ( + "fadein", + EV_DEFAULT, + "F[0,]F[0,1]", + "fadetime target_alpha", + "Fade the entity's alpha and scale in, increasing it by 0.03\n" + "every FRAMETIME, until it has faded completely in to 1.0.\n" + "If fadetime or target_alpha are defined, they will override\n" + "the default values." + ); + Event EV_Killed + ( + "killed", + EV_DEFAULT, + "eiei", + "attacker damage inflictor meansofdeath", + "event which is sent to an entity once it as been killed" + ); +Event EV_GotKill + ( + "gotkill" , + EV_DEFAULT, + "eieib", + "victim damage inflictor meansofdeath gib", + "event sent to attacker when an entity dies" + ); +Event EV_Pain + ( + "pain", + EV_DEFAULT, + "iei", + "damage attacker meansofdeath", + "used to inflict pain to an entity" + ); +Event EV_Damage + ( + "_damage", + EV_DEFAULT, + "ieevvviii", + "damage inflictor attacker position direction normal knockback damageflags meansofdeath", + "general damage event used by all entities" + ); +Event EV_Stun + ( + "_stun", + EV_DEFAULT, + "f", + "time", + "Stun this entity for the specified time" + ); +Event EV_Kill + ( + "kill", + EV_CONSOLE, + NULL, + NULL, + "console based command to kill yourself if stuck." + ); +Event EV_Gib + ( + "gib", + EV_DEFAULT, + "iIFS", + "number power scale gibmodel", + "causes entity to spawn a number of gibs" + ); +Event EV_Hurt + ( + "hurt", + EV_DEFAULT, + "iSV", + "damage means_of_death direction", + "Inflicts damage if the entity is damageable. If the number of damage\n" + "points specified in the command argument is greater or equal than the\n" + "entity's current health, it will be killed or destroyed." + ); + +Event EV_TakeDamage + ( + "takedamage", + EV_DEFAULT, + NULL, + NULL, + "makes entity take damage." + ); +Event EV_NoDamage + ( + "nodamage", + EV_DEFAULT, + NULL, + NULL, + "entity does not take damage." + ); + +Event EV_Stationary + ( + "stationary", + EV_DEFAULT, + NULL, + NULL, + "entity does not move, causes no physics to be run on it." + ); + +// Physics events +Event EV_MoveDone + ( + "movedone", + EV_DEFAULT, + "e", + "finishedEntity", + "Sent to commanding thread when done with move ." + ); +Event EV_Touch + ( + "doTouch", + EV_DEFAULT, + "e", + "touchingEntity", + "sent to entity when touched." + ); +Event EV_Blocked + ( + "doBlocked", + EV_DEFAULT, + "e", + "obstacle", + "sent to entity when blocked." + ); +Event EV_UseBoundingBox + ( + "usebbox", + EV_DEFAULT, + NULL, + NULL, + "do not perform perfect collision, use bounding box instead." + ); +Event EV_Gravity + ( + "gravity", + EV_DEFAULT, + "f", + "gravityValue", + "Change the gravity on this entity" + ); +Event EV_Stop + ( + "stopped", + EV_DEFAULT, + NULL, + NULL, + "sent when entity has stopped bouncing for MOVETYPE_TOSS." + ); + +Event EV_ProcessInitCommands + ( + "processinit", + EV_DEFAULT, + "i", + "modelIndex", + "process the init section of this entity, this is an internal command,\n" + "it is not meant to be called from script." + ); +Event EV_Attach + ( + "attach", + EV_DEFAULT, + "esI", + "parent tagname use_angles", + "attach this entity to the parent's legs tag called tagname" + ); +Event EV_AttachModel + ( + "attachmodel", + EV_DEFAULT, + "ssFSBFFFFV", + "modelname tagname scale targetname detach_at_death removetime fadeintime fadeoutdelay fadetime offset", + "attach a entity with modelname to this entity to tag called tagname.\n" + "scale - scale of attached entities\n" + "targetname - targetname for attached entities\n" + "detach_at_death - when entity dies, should this model be detached.\n" + "removetime - when the entity should be removed, if not specified, never.\n" + "fadeintime - time to fade the model in over.\n" + "fadeoutdelay - time to wait until we fade the attached model out\n" + "fadeoutspeed - time the model fades out over\n" + "offset - vector offset for the model from the specified tag" + ); +Event EV_RemoveAttachedModel + ( + "removeattachedmodel", + EV_DEFAULT, + "s", + "tagname", + "Removes the model attached to this entity at the specified tag." + ); +Event EV_Detach + ( + "detach", + EV_DEFAULT, + NULL, + NULL, + "detach this entity from its parent." + ); + +// script stuff +Event EV_Model + ( + "model", + EV_DEFAULT, + "e", + "modelName", + "set the model to modelName." + ); +Event EV_Hide + ( + "hide", + EV_DEFAULT, + NULL, + NULL, + "hide the entity, opposite of show." + ); +Event EV_Show + ( + "show", + EV_DEFAULT, + NULL, + NULL, + "show the entity, opposite of hide." + ); +Event EV_BecomeSolid + ( + "solid", + EV_DEFAULT, + NULL, + NULL, + "make solid." + ); +Event EV_BecomeNonSolid + ( + "notsolid", + EV_DEFAULT, + NULL, + NULL, + "make non-solid." + ); +Event EV_Ghost + ( + "ghost", + EV_DEFAULT, + NULL, + NULL, + "make non-solid but still send to client regardless of hide status." + ); +Event EV_TouchTriggers + ( + "touchtriggers", + EV_DEFAULT, + NULL, + NULL, + "this entity should touch triggers." + ); + + +Event EV_Sound + ( + "playsound", + EV_DEFAULT, + "sIFS", + "soundName channel volume min_distance", + "play a sound coming from this entity.\n" + "default channel, CHAN_BODY." + ); +Event EV_StopSound + ( + "stopsound", + EV_DEFAULT, + "I", + "channel", + "stop the current sound on the specified channel.\n" + "default channel, CHAN_BODY." + ); +Event EV_Bind + ( + "bind", + EV_DEFAULT, + "e", + "parent", + "bind this entity to the specified entity." + ); +Event EV_Unbind + ( + "unbind", + EV_DEFAULT, + NULL, + NULL, + "unbind this entity." + ); +Event EV_JoinTeam + ( + "joinTeam", + EV_DEFAULT, + "e", + "teamMember", + "join a bind team." + ); +Event EV_QuitTeam + ( + "quitTeam", + EV_DEFAULT, + NULL, + NULL, + "quit the current bind team" + ); +Event EV_SetHealth + ( + "health", + EV_CHEAT, + "i", + "newHealth", + "set the health of the entity to newHealth" + ); +Event EV_SetScale + ( + "scale", + EV_DEFAULT, + "f", + "newScale", + "set the scale of the entity" + ); +Event EV_SetSize + ( + "setsize", + EV_DEFAULT, + "vv", + "mins maxs", + "Set the bounding box of the entity to mins and maxs." + ); +Event EV_SetMins + ( + "_setmins", + EV_DEFAULT, + "v", + "mins", + "Set the mins of the bounding box of the entity to mins." + ); +Event EV_SetMaxs + ( + "_setmaxs", + EV_DEFAULT, + "v", + "maxs", + "Set the maxs of the bounding box of the entity to maxs." + ); +Event EV_SetAlpha + ( + "alpha", + EV_DEFAULT, + "f", + "newAlpha", + "Set the alpha of the entity to alpha." + ); +Event EV_SetOrigin + ( + "origin", + EV_DEFAULT, + "v", + "newOrigin", + "Set the origin of the entity to newOrigin." + ); +Event EV_SetTargetName + ( + "targetname", + EV_DEFAULT, + "s", + "targetName", + "set the targetname of the entity to targetName." + ); +Event EV_SetTarget + ( + "target", + EV_DEFAULT, + "s", + "targetname_to_target", + "target another entity with targetname_to_target." + ); +Event EV_SetKillTarget + ( + "killtarget", + EV_DEFAULT, + "s", + "targetName", + "when dying kill entities with this targetName." + ); +Event EV_SetAngles + ( + "angles", + EV_DEFAULT, + "v[0,360][0,360][0,360]", + "newAngles", + "set the angles of the entity to newAngles." + ); +Event EV_SetAngle + ( + "angle", + EV_DEFAULT, + "f", + "newAngle", + "set the angles of the entity using just one value.\n" + "Sets the yaw of the entity or an up and down\n" + "direction if newAngle is [0-359] or -1 or -2" + ); +Event EV_RegisterAlias + ( + "alias", + EV_CACHE, + "ssSSSSSS", + "alias realname parameter1 parameter2 parameter3 parameter4 parameter5 paramater6", + "create an alias for the given realname\n" + "Valid parameters are as follows:\n" + "global - all instances act as one\n" + "stop - once used, don't use again\n" + "timeout [seconds] - once used wait [seconds] until using again\n" + "maxuse [times] - can only be used [times] times.\n" + "weight [weight] - random weighting" + ); +Event EV_RegisterAliasAndCache + ( + "aliascache", + EV_CACHE, + "ssSSSSSS", + "alias realname parameter1 parameter2 parameter3 parameter4 parameter5 paramater6", + "create an alias for the given realname and cache the resource\n" + "Valid parameters are as follows:\n" + "global - all instances act as one\n" + "stop - once used, don't use again\n" + "timeout [seconds] - once used wait [seconds] until using again\n" + "maxuse [times] - can only be used [times] times.\n" + "weight [weight] - random weighting" + ); +Event EV_Cache + ( + "cache", + EV_CACHE, + "s", + "resourceName", + "pre-cache the given resource." + ); +Event EV_SetMass + ( + "mass", + EV_DEFAULT, + "f", + "massAmount", + "set the mass of this entity." + ); + +Event EV_LoopSound + ( + "loopsound", + EV_DEFAULT, + "sFS", + "soundName volume minimum_distance", + "play a looped-sound with a certain volume and minimum_distance\n" + "which is attached to the current entity." + ); +Event EV_StopLoopSound + ( + "stoploopsound", + EV_DEFAULT, + NULL, + NULL, + "Stop the looped-sound on this entity." + ); + +Event EV_SurfaceModelEvent + ( + "surface", + EV_DEFAULT, + "sSSSSSS", + "surfaceName parameter1 parameter2 parameter3 parameter4 parameter5 parameter6", + "change a legs surface parameter for the given surface.\n" + "+ sets the flag, - clears the flag\n" + "Valid surface commands are:\n" + "skin1 - set the skin1 offset bit\n" + "skin2 - set the skin2 offset bit\n" + "nodraw - don't draw this surface" + ); +// AI sound events +Event EV_BroadcastSound + ( + "soundevent", + EV_DEFAULT, + "F", + "soundRadius", + "Let the AI know that this entity made a sound,\n" + "radius determines how far the sound reaches." + ); +Event EV_HeardSound + ( + "heardsound", + EV_DEFAULT, + "ev", + "noisyEntity noisyLocation", + "sent to entities when another makes a sound, not for script use\n" + ); + +// Conditionals +Event EV_IfSkill + ( + "ifskill", + EV_DEFAULT, + "isSSSSS", + "skillLevel command argument1 argument2 argument3 argument4 argument5", + "if the current skill level is skillLevel than execute command" + ); + +// Lighting +Event EV_SetLight + ( + "light", + EV_DEFAULT, + "ffff", + "red green blue radius", + "Create a dynmaic light on this entity." + ); + +Event EV_LightOn + ( + "lightOn", + EV_DEFAULT, + NULL, + NULL, + "Turn the configured dynmaic light on this entity on." + ); +Event EV_LightOff + ( + "lightOff", + EV_DEFAULT, + NULL, + NULL, + "Turn the configured dynamic light on this entity off." + ); +Event EV_LightStyle + ( + "lightStyle", + EV_DEFAULT, + "i", + "lightStyleIndex", + "What light style to use for this dynamic light on this entity." + ); +Event EV_LightRed + ( + "lightRed", + EV_DEFAULT, + "f", + "red", + "Set the red component of the dynmaic light on this entity." + ); +Event EV_LightGreen + ( + "lightGreen", + EV_DEFAULT, + "f", + "red", + "Set the red component of the dynmaic light on this entity." + ); +Event EV_LightBlue + ( + "lightBlue", + EV_DEFAULT, + "f", + "red", + "Set the red component of the dynmaic light on this entity." + ); +Event EV_LightRadius + ( + "lightRadius", + EV_DEFAULT, + "f", + "red", + "Set the red component of the dynmaic light on this entity." + ); + +// Entity flag specific +Event EV_EntityFlags + ( + "flags", + EV_DEFAULT, + "SSSSSS", + "parameter1 parameter2 parameter3 parameter4 parameter5 parameter6", + "Change the current entity flags.\n" + "Valid flags are as follows:\n" + "+ sets a flag, - clears a flag\n" + "blood - should it bleed\n" + "explode - should it explode when dead\n" + "die_gibs - should it spawn gibs when dead\n" + "god - makes the entity invincible\n" + ); +Event EV_EntityRenderEffects + ( + "rendereffects", + EV_DEFAULT, + "SSSSSS", + "parameter1 parameter2 parameter3 parameter4 parameter5 parameter6", + "Change the current render effects flags.\n" + "Valid flags are as follows:\n" + "+ sets a flag, - clears a flag\n" + "dontdraw - send the entity to the client, but don't draw\n" + "betterlighting - do sphere based vertex lighting on the entity\n" + "lensflare - add a lens glow to the entity at its origin\n" + "viewlensflare - add a view dependent lens glow to the entity at its origin\n" + "lightoffset - use the dynamic color values as a light offset to the model\n" + "skyorigin - this entity is the portal sky origin\n" + "minlight - this entity always has some lighting on it\n" + "fullbright - this entity is always fully lit\n" + "additivedynamiclight - the dynamic light should have an additive effect\n" + "lightstyledynamiclight - the dynamic light uses a light style, use the\n" + "'lightstyle' command to set the index of the light style to be used" + ); +Event EV_EntityEffects + ( + "effects", + EV_DEFAULT, + "SSSSSS", + "parameter1 parameter2 parameter3 parameter4 parameter5 parameter6", + "Change the current entity effects flags.\n" + "Valid flags are as follows:\n" + "+ sets a flag, - clears a flag\n" + "antisbjuice - anti sucknblow juice" + "everyframe - process commands every time entity is rendered" + ); +Event EV_EntitySVFlags + ( + "svflags", + EV_DEFAULT, + "SSSSSS", + "parameter1 parameter2 parameter3 parameter4 parameter5 parameter6", + "Change the current server flags.\n" + "Valid flags are as follows:\n" + "+ sets a flag, - clears a flag\n" + "broadcast - always send this entity to the client" + ); + +// Special Effects +Event EV_Censor + ( + "censor", + EV_DEFAULT, + NULL, + NULL, + "used to ban certain contact when in parentmode\n" + ); +Event EV_Explosion + ( + "explosionattack", + EV_DEFAULT, + "sS", + "explosionModel tagName", + "Spawn an explosion optionally from a specific tag" + ); + +Event EV_ShaderEvent + ( + "shader", + EV_DEFAULT, + "sfF", + "shaderCommand argument1 argument2", + "change a specific shader parameter for the entity.\n" + "Valid shader commands are:\n" + "translation [trans_x] [trans_y] - change the texture translation\n" + "offset [offset_x] [offset_y] - change the texture offset\n" + "rotation [rot_speed] - change the texture rotation speed\n" + "frame [frame_num] - change the animated texture frame\n" + "wavebase [base] - change the base parameter of the wave function\n" + "waveamp [amp] - change the amp parameter of the wave function\n" + "wavebase [phase] - change the phase parameter of the wave function\n" + "wavefreq [freq] - change the frequency parameter of the wave function\n" + ); + +Event EV_ScriptShaderEvent + ( + "scriptshader", + EV_DEFAULT, + "sfF", + "shaderCommand argument1 argument2", + "alias for shader command, change a specific shader parameter for the entity.\n" + "Valid shader commands are:\n" + "translation [trans_x] [trans_y] - change the texture translation\n" + "offset [offset_x] [offset_y] - change the texture offset\n" + "rotation [rot_speed] - change the texture rotation speed\n" + "frame [frame_num] - change the animated texture frame\n" + "wavebase [base] - change the base parameter of the wave function\n" + "waveamp [amp] - change the amp parameter of the wave function\n" + "wavebase [phase] - change the phase parameter of the wave function\n" + "wavefreq [freq] - change the frequency parameter of the wave function\n" + ); + +Event EV_KillAttach + ( + "killattach", + EV_DEFAULT, + NULL, + NULL, + "kill all the attached entities." + ); +Event EV_DropToFloor + ( + "droptofloor", + EV_DEFAULT, + "F", + "maxRange", + "drops the entity to the ground, if maxRange is not specified 8192 is used." + ); +Event EV_AddToSoundManager + ( + "_addtosoundmanager", + EV_DEFAULT, + NULL, + NULL, + "adds the current entity to the sound manager." + ); +Event EV_SetControllerAngles + ( + "setcontrollerangles", + EV_DEFAULT, + "iv", + "num angles", + "Sets the control angles for the specified bone." + ); +Event EV_DeathSinkStart + ( + "deathsinkstart", + EV_DEFAULT, + NULL, + NULL, + "Makes the entity sink into the ground and then get removed (this starts it)." + ); +Event EV_DeathSink + ( + "deathsinkeachframe", + EV_DEFAULT, + NULL, + NULL, + "Makes the entity sink into the ground and then get removed (this gets called each frame)." + ); +Event EV_DamageType + ( + "damage_type", + EV_DEFAULT, + "s", + "meansofdeathstring", + "Set the type of damage that this entity can take" + ); +Event EV_LookAtMe + ( + "lookatme", + EV_DEFAULT, + NULL, + NULL, + "Makes the player look at this object if close." + ); +Event EV_DetachAllChildren + ( + "detachallchildren", + EV_DEFAULT, + NULL, + NULL, + "Detach all the children from the entity." + ); + +CLASS_DECLARATION( Listener, Entity, NULL ) + { + { &EV_Damage, DamageEvent }, + { &EV_DamageType, DamageType }, + { &EV_Kill, Kill }, + { &EV_FadeNoRemove, FadeNoRemove }, + { &EV_FadeOut, FadeOut }, + { &EV_FadeIn, FadeIn }, + { &EV_Fade, Fade }, + { &EV_Hide, EventHideModel }, + { &EV_Show, EventShowModel }, + { &EV_BecomeSolid, BecomeSolid }, + { &EV_BecomeNonSolid, BecomeNonSolid }, + { &EV_Ghost, Ghost }, + { &EV_TouchTriggers, TouchTriggersEvent }, + { &EV_Sound, Sound }, + { &EV_StopSound, StopSound }, + { &EV_SetHealth, SetHealth }, + { &EV_SetSize, SetSize }, + { &EV_SetMins, SetMins }, + { &EV_SetMaxs, SetMaxs }, + { &EV_SetScale, SetScale }, + { &EV_SetAlpha, SetAlpha }, + { &EV_SetOrigin, SetOrigin }, + { &EV_SetTargetName, SetTargetName }, + { &EV_SetTarget, SetTarget }, + { &EV_SetKillTarget, SetKillTarget }, + { &EV_SetAngles, SetAngles }, + { &EV_SetAngle, SetAngleEvent }, + { &EV_SetMass, SetMassEvent }, + { &EV_RegisterAlias, RegisterAlias }, + { &EV_RegisterAliasAndCache, RegisterAliasAndCache }, + { &EV_Cache, Cache }, + { &EV_LoopSound, LoopSound }, + { &EV_StopLoopSound, StopLoopSound }, + { &EV_Model, SetModelEvent }, + { &EV_SetLight, SetLight }, + { &EV_LightOn, LightOn }, + { &EV_LightOff, LightOff }, + { &EV_LightRed, LightRed }, + { &EV_LightGreen, LightGreen }, + { &EV_LightBlue, LightBlue }, + { &EV_LightRadius, LightRadius }, + { &EV_LightStyle, LightStyle }, + { &EV_EntityFlags, Flags }, + { &EV_EntityEffects, Effects }, + { &EV_EntitySVFlags, SVFlags }, + { &EV_EntityRenderEffects, RenderEffects }, + { &EV_BroadcastSound, BroadcastSound }, + { &EV_SurfaceModelEvent, SurfaceModelEvent }, + { &EV_ProcessInitCommands, ProcessInitCommandsEvent }, + { &EV_Attach, AttachEvent }, + { &EV_AttachModel, AttachModelEvent }, + { &EV_RemoveAttachedModel, RemoveAttachedModelEvent }, + { &EV_Detach, DetachEvent }, + { &EV_TakeDamage, TakeDamageEvent }, + { &EV_NoDamage, NoDamageEvent }, + { &EV_Gravity, Gravity }, + { &EV_UseBoundingBox, UseBoundingBoxEvent }, + { &EV_Hurt, HurtEvent }, + { &EV_IfSkill, IfSkillEvent }, + { &EV_Classname, ClassnameEvent }, + { &EV_SpawnFlags, SpawnFlagsEvent }, + { &EV_SetTeam, SetTeamEvent }, + { &EV_Trigger, TriggerEvent }, + { &EV_Censor, Censor }, + { &EV_Stationary, StationaryEvent }, + { &EV_Explosion, Explosion }, + { &EV_ShaderEvent, Shader }, + { &EV_ScriptShaderEvent, Shader }, + { &EV_KillAttach, KillAttach }, + { &EV_DropToFloor, DropToFloorEvent }, + { &EV_Bind, BindEvent }, + { &EV_Unbind, EventUnbind }, + { &EV_JoinTeam, JoinTeam }, + { &EV_QuitTeam, EventQuitTeam }, + { &EV_AddToSoundManager, AddToSoundManager }, + { &EV_SetControllerAngles, SetControllerAngles }, + { &EV_DeathSinkStart, DeathSinkStart }, + { &EV_DeathSink, DeathSink }, + { &EV_LookAtMe, LookAtMe }, + { &EV_DetachAllChildren, DetachAllChildren }, + { NULL, NULL } + }; + +Entity::Entity() + { + int i; + + edict = level.AllocEdict( this ); + client = edict->client; + entnum = edict->s.number; + + // spawning variables + spawnflags = level.spawnflags; + level.spawnflags = 0; + + // rendering variables + setAlpha( 1.0f ); + setScale( 1.0f ); + + // physics variables + move_time = 0; + total_delta = "0 0 0"; + mass = 0; + gravity = 1.0; + groundentity = NULL; + groundcontents = 0; + velocity = vec_zero; + avelocity = vec_zero; + edict->clipmask = MASK_SOLID; + + // team variables + teamchain = NULL; + teammaster = NULL; + + // bind variables + bindmaster = NULL; + edict->s.bindparent = ENTITYNUM_NONE; + + // this is an generic entity + edict->s.eType = ET_GENERAL; + + setContents( 0 ); + + edict->s.parent = ENTITYNUM_NONE; + edict->s.pos.trType = TR_LERP; + edict->ownerNum = ENTITYNUM_NONE; + + // model binding variables + numchildren = 0; + + for( i = 0 ; i < MAX_MODEL_CHILDREN ; i++ ) + children[i] = ENTITYNUM_NONE; + + setOrigin( vec_zero ); + origin.copyTo( edict->s.origin2 ); + + setAngles( vec_zero ); + + setMoveType( MOVETYPE_NONE ); + setSolidType( SOLID_NOT ); + + // Character state + health = 0; + max_health = 0; + deadflag = DEAD_NO; + flags = 0; + + // underwater variables + watertype = 0; + waterlevel = 0; + + // Pain and damage variables + takedamage = DAMAGE_NO; + enemy = NULL; + pain_finished = 0; + damage_debounce_time = 0; + damage_type = -1; + + detach_at_death = qtrue; + + // Surface variables + numsurfaces = 0; + + // Light variables + lightRadius = 0; + + look_at_me = false; + } + +Entity::~Entity() + { + Container bindlist; + Entity *ent; + int num; + int i; + + // unbind any entities that are bound to me + // can't unbind within this loop, so make an array + // and unbind them outside of it. + num = 0; + for( ent = teamchain; ent; ent = ent->teamchain ) + { + if ( ent->bindmaster == this ) + { + bindlist.AddObject( ent ); + } + } + + num = bindlist.NumObjects(); + for( i = 1; i <= num; i++ ) + { + bindlist.ObjectAt( i )->unbind(); + } + + bindlist.FreeObjectList(); + + unbind(); + quitTeam(); + + detach(); + + // + // go through and set our children + // + num = numchildren; + for( i = 0; ( i < MAX_MODEL_CHILDREN ) && num; i++ ) + { + if ( children[ i ] == ENTITYNUM_NONE ) + { + continue; + } + ent = G_GetEntity( children[ i ] ); + if ( ent ) + { + ent->PostEvent( EV_Remove, 0 ); + } + num--; + } + + if ( targetname.length() && world ) + { + world->RemoveTargetEntity( targetname, this ); + } + + level.FreeEdict( edict ); + } + +void Entity::SetEntNum + ( + int num + ) + + { + if ( edict ) + { + level.FreeEdict( edict ); + } + + level.spawn_entnum = num; + level.AllocEdict( this ); + client = edict->client; + entnum = edict->s.number; + } + +void Entity::ClassnameEvent + ( + Event *ev + ) + + { + strncpy( edict->entname, ev->GetString( 1 ), sizeof( edict->entname ) - 1 ); + } + +void Entity::SpawnFlagsEvent + ( + Event *ev + ) + + { + // spawning variables + spawnflags = ev->GetInteger( 1 ); + if ( spawnflags & SPAWNFLAG_DETAIL ) + { + edict->s.renderfx |= RF_DETAIL; + } + } + +void Entity::SetTarget + ( + const char *text + ) + + { + if ( text ) + { + target = text; + } + else + { + target = ""; + } + } + +void Entity::SetTargetName + ( + const char *text + ) + + { + if ( targetname.length() && world ) + { + world->RemoveTargetEntity( targetname, this ); + } + + if ( text ) + { + if ( text[ 0 ] == '$' ) + text++; + targetname = text; + } + else + { + targetname = ""; + } + + if ( targetname.length() && world ) + { + // + // make sure we don't re-targetname the world entity + // + if ( + ( this != world ) || + ( targetname == str( "world" ) ) + ) + { + world->AddTargetEntity( targetname, this ); + } + else + { + // this is bad + assert( 0 ); + gi.DPrintf( "world was re-targeted with targetname %s\n", targetname.c_str() ); + targetname = "world"; + } + + } + } + +void Entity::SetKillTarget + ( + const char *text + ) + + { + if ( text ) + { + killtarget = text; + } + else + { + killtarget = ""; + } + } + +void Entity::setModel + ( + const char *mdl + ) + + { + str temp; + + if ( LoadingSavegame && ( this == world ) ) + { + // don't set model on the world + return; + } + + if ( !mdl ) + { + mdl = ""; + } + + // Prepend 'models/' to make things easier + temp = ""; + if ( ( strlen( mdl ) > 0 ) && !strchr( mdl, '*' ) && strnicmp( "models/", mdl, 7 ) && !strstr( mdl, ".spr" ) ) + { + temp = "models/"; + } + temp += mdl; + + // we use a temp string so that if model was passed into here, we don't + // accidentally free up the string that we're using in the process. + model = temp; + + gi.setmodel( edict, model.c_str() ); + + if ( gi.IsModel( edict->s.modelindex ) ) + { + Event *ev; + + numsurfaces = gi.NumSurfaces( edict->s.modelindex ); + + if ( !LoadingSavegame ) + { + CancelEventsOfType( EV_ProcessInitCommands ); + + ev = new Event( EV_ProcessInitCommands ); + ev->AddInteger( edict->s.modelindex ); + PostEvent( ev, EV_PROCESS_INIT ); + } + else + { + ProcessInitCommands( edict->s.modelindex, qtrue ); + } + } + else if ( strstr( mdl, ".spr" ) ) + { + edict->s.eType = ET_SPRITE; + } + + // Sanity check to see if we're expecting a B-Model + assert( !( ( edict->solid == SOLID_BSP ) && !edict->s.modelindex ) ); + if ( ( edict->solid == SOLID_BSP ) && !edict->s.modelindex ) + { + const char *name; + + name = getClassID(); + if ( !name ) + { + name = getClassname(); + } + gi.DPrintf( "%s with SOLID_BSP and no model - '%s'(%d)\n", name, targetname.c_str(), entnum ); + + // Make it non-solid so that the collision code doesn't kick us out. + setSolidType( SOLID_NOT ); + } + + mins = edict->mins; + maxs = edict->maxs; + size = maxs - mins; + edict->radius = size.length() * 0.5f; + edict->radius2 = edict->radius * edict->radius; + + // + // see if we have a mins and maxs set for this model + // + //FIXME + //We only did this on startup, but with the spawnargs as events it would have to + //be here. Do we still need this? It may cause strange effects. + if ( gi.IsModel( edict->s.modelindex ) && !mins.length() && !maxs.length() ) + { + vec3_t tempmins, tempmaxs; + gi.CalculateBounds( edict->s.modelindex, edict->s.scale, tempmins, tempmaxs ); + setSize( tempmins, tempmaxs ); + } + } + +void Entity::ProcessInitCommands + ( + int index, + qboolean cache + ) + + { + tiki_cmd_t cmds; + + if ( LoadingSavegame && !cache ) + { + // Don't process init commands when loading a savegame since + // it will cause items to be added to inventories unnecessarily. + // All variables affected by the init commands will be set + // by the unarchive functions. + // + // we do want to process the cache commands though regardless + return; + } + + if ( gi.InitCommands( index, &cmds ) ) + { + int i, j, savedindex; + Event *event; + + // because the model has not necessarily been spawned yet, we need to set + // this entity to have this index so that precaches go where they are supposed + // to, this should have no bad effects, since we are only doing it in the + // cache phase of spawning + if ( index != edict->s.modelindex ) + { + savedindex = edict->s.modelindex; + edict->s.modelindex = index; + } + else + { + savedindex = -1; + } + for( i = 0; i < cmds.num_cmds; i++ ) + { + event = new Event( cmds.cmds[ i ].args[ 0 ] ); + if ( !cache || ( event->GetFlags() & EV_CACHE ) ) + { + for( j = 1; j < cmds.cmds[ i ].num_args; j++ ) + { + event->AddToken( cmds.cmds[ i ].args[ j ] ); + } + ProcessEvent( event ); + } + else + { + delete event; + } + } + // restore the modelindex, see above + if ( savedindex != -1 ) + { + edict->s.modelindex = savedindex; + } + } + } + +void Entity::ProcessInitCommandsEvent + ( + Event *ev + ) + + { + int index; + + index = ev->GetInteger( 1 ); + ProcessInitCommands( index, qfalse ); + } + +void Entity::EventHideModel + ( + Event *ev + ) + + { + hideModel(); + } + +void Entity::EventShowModel + ( + Event *ev + ) + + { + showModel(); + } + +void Entity::SetTeamEvent + ( + Event *ev + ) + + { + moveteam = ev->GetString( 1 ); + } + +void Entity::TriggerEvent + ( + Event *ev + ) + + { + const char *name; + Event *event; + Entity *ent; + TargetList *tlist; + int i; + int num; + + name = ev->GetString( 1 ); + + // Check for object commands + if ( name && name[ 0 ] == '$' ) + { + tlist = world->GetTargetList( str( name + 1 ) ); + num = tlist->list.NumObjects(); + for ( i = 1; i <= num; i++ ) + { + ent = tlist->list.ObjectAt( i ); + + assert( ent ); + + event = new Event( EV_Activate ); + event->SetSource( ev->GetSource() ); + event->SetThread( ev->GetThread() ); + event->SetLineNumber( ev->GetLineNumber() ); + event->AddEntity( this ); + ent->ProcessEvent( event ); + } + } + else if ( name[ 0 ] == '*' ) // Check for entnum commands + { + if ( !IsNumeric( &name[ 1 ] ) ) + { + ev->Error( "Expecting numeric value for * command, but found '%s'\n", &name[ 1 ] ); + } + else + { + ent = G_GetEntity( atoi( &name[ 1 ] ) ); + if ( ent ) + { + event = new Event( EV_Activate ); + event->SetSource( ev->GetSource() ); + event->SetThread( ev->GetThread() ); + event->SetLineNumber( ev->GetLineNumber() ); + event->AddEntity( this ); + ent->ProcessEvent( event ); + } + else + { + ev->Error( "Entity not found for * command\n" ); + } + } + return; + } + else + { + ev->Error( "Invalid entity reference '%s'.\n", name ); + } + } + +void Entity::setAlpha + ( + float alpha + ) + + { + if ( alpha > 1.0f ) + { + alpha = 1.0f; + } + if ( alpha < 0 ) + { + alpha = 0; + } + edict->s.alpha = alpha; + } + +void Entity::setScale + ( + float scale + ) + + { + edict->s.scale = scale; + } + +void Entity::setSolidType + ( + solid_t type + ) + + { + if ( + ( !LoadingSavegame ) && + ( type == SOLID_BSP ) && + ( this != world ) && + ( + !model.length() || + ( + ( model[ 0 ] != '*' ) && + ( !strstr( model.c_str(), ".bsp" ) ) + ) + ) + ) + { + error( "setSolidType", "SOLID_BSP entity at x%.2f y%.2f z%.2f with no BSP model", origin[ 0 ], origin[ 1 ], origin[ 2 ] ); + } + edict->solid = type; + + // + // set the appropriate contents type + if ( edict->solid == SOLID_BBOX ) + { + if ( !getContents() ) + setContents( CONTENTS_SOLID ); + } + else if ( edict->solid == SOLID_NOT ) + { + if ( getContents() == CONTENTS_SOLID ) + setContents( 0 ); + } + else if ( edict->solid == SOLID_BSP ) + { + if ( !getContents() ) + setContents( CONTENTS_SOLID ); + } + + link(); + + edict->svflags &= ~SVF_NOCLIENT; + if ( hidden() ) + { + edict->svflags |= SVF_NOCLIENT; + } + } + +void Entity::setSize + ( + Vector min, + Vector max + ) + + { + Vector delta; + + if ( flags & FL_ROTATEDBOUNDS ) + { + vec3_t tempmins, tempmaxs; + + // + // rotate the mins and maxs for the model + // + min.copyTo( tempmins ); + max.copyTo( tempmaxs ); + + CalculateRotatedBounds2( edict->s.mat, tempmins, tempmaxs ); + + mins = Vector( tempmins ); + maxs = Vector( tempmaxs ); + size = max - min; + + mins.copyTo( edict->mins ); + maxs.copyTo( edict->maxs ); + edict->radius = size.length() * 0.5; + edict->radius2 = edict->radius * edict->radius; + } + else + { + if ( ( min == edict->mins ) && ( max == edict->maxs ) ) + { + return; + } + + mins = min; + maxs = max; + size = max - min; + + mins.copyTo( edict->mins ); + maxs.copyTo( edict->maxs ); + + // + // get the full mins and maxs for this model + // + if ( gi.IsModel( edict->s.modelindex ) ) + { + vec3_t fullmins, fullmaxs; + Vector delta; + + gi.CalculateBounds( edict->s.modelindex, edict->s.scale, fullmins, fullmaxs ); + + delta = Vector( fullmaxs ) - Vector( fullmins ); + edict->radius = delta.length() * 0.5; + edict->radius2 = edict->radius * edict->radius; + } + else + { + edict->radius = size.length() * 0.5; + edict->radius2 = edict->radius * edict->radius; + } + } + + link(); + } + +Vector Entity::getLocalVector + ( + Vector vec + ) + + { + Vector pos; + + pos[ 0 ] = vec * orientation[ 0 ]; + pos[ 1 ] = vec * orientation[ 1 ]; + pos[ 2 ] = vec * orientation[ 2 ]; + + return pos; + } + +void Entity::link + ( + void + ) + + { + gi.linkentity( edict ); + absmin = edict->absmin; + absmax = edict->absmax; + centroid = ( absmin + absmax ) * 0.5; + centroid.copyTo( edict->centroid ); + + // If this has a parent, then set the areanum the same + // as the parent's + if ( edict->s.parent != ENTITYNUM_NONE ) + { + edict->areanum = g_entities[ edict->s.parent ].areanum; + } + } + +void Entity::addOrigin + ( + Vector add + ) + + { + setOrigin( localorigin + add ); + } + +void Entity::setOrigin + ( + void + ) + + { + setOrigin( localorigin ); + } + +void Entity::setOrigin + ( + Vector org + ) + + { + Entity * ent; + int i,num; + + if ( bindmaster ) + { + localorigin = org; + + if ( bind_use_my_angles ) + MatrixTransformVector( localorigin, orientation, origin ); + else + MatrixTransformVector( localorigin, bindmaster->orientation, origin ); + + origin += bindmaster->origin; + origin.copyTo( edict->s.netorigin ); + } + // If entity has a parent, then set the origin as the + // centroid of the parent, and set edict->s.netorigin + // as the local origin of the entity which will be used + // to position this entity on the client. + else if ( edict->s.parent != ENTITYNUM_NONE ) + { + VectorClear( edict->s.netorigin ); + ent = ( Entity * )G_GetEntity( edict->s.parent ); + + ent->GetTag( edict->s.tag_num & TAG_MASK, &origin ); + + origin += edict->s.attach_offset; + + localorigin = vec_zero; + } + else + { + origin = org; + localorigin = org; + origin.copyTo( edict->s.netorigin ); + } + + origin.copyTo( edict->s.origin ); + origin.copyTo( edict->currentOrigin ); + + link(); + +#if 0 + if ( this->isClient() ) + { + i = CurrentAnim(); + j = CurrentFrame(); + + G_DrawCoordSystem( origin, orientation[0], orientation[1], orientation[2], 30 ); + gi.Printf( "%s:legs anim:%s frame %i\n", this->getClassname(), gi.Anim_NameForNum( edict->s.modelindex, i ), j ); + } +#endif + + + // + // go through and set our children + // + num = numchildren; + for( i = 0; ( i < MAX_MODEL_CHILDREN ) && num; i++ ) + { + if ( children[ i ] == ENTITYNUM_NONE ) + { + continue; + } + ent = ( Entity * )G_GetEntity( children[ i ] ); + ent->setOrigin(); + num--; + } + } + +void Entity::GetRawTag + ( + int tagnum, + orientation_t * orient + ) + + { + int anim; + int frame; + + anim = CurrentAnim(); + frame = CurrentFrame(); + + *orient = gi.Tag_Orientation( edict->s.modelindex, anim, frame, tagnum & TAG_MASK, edict->s.scale, edict->s.bone_tag, edict->s.bone_quat ); + } + +qboolean Entity::GetRawTag + ( + const char *name, + orientation_t * orient + ) + { + int tagnum; + + tagnum = gi.Tag_NumForName( edict->s.modelindex, name ); + + if ( tagnum < 0 ) + return false; + + GetRawTag( tagnum, orient ); + return true; + } + +void Entity::GetTag + ( + int tagnum, + orientation_t * orient + ) + + { + orientation_t or; + int i; + + GetRawTag( tagnum, &or ); + + VectorCopy( origin, orient->origin ); + + for ( i = 0 ; i < 3 ; i++ ) + { + VectorMA( orient->origin, or.origin[i], orientation[i], orient->origin ); + } + MatrixMultiply( or.axis, orientation, orient->axis ); + } + +qboolean Entity::GetTag + ( + const char *name, + orientation_t * orient + ) + { + int tagnum; + + tagnum = gi.Tag_NumForName( edict->s.modelindex, name ); + + if ( tagnum < 0 ) + return false; + + GetTag( tagnum, orient ); + return true; + } + +void Entity::GetTag + ( + int tagnum, + Vector *pos, + Vector *forward, + Vector *left, + Vector *up + ) + + { + orientation_t or; + + GetTag( tagnum, &or ); + + if ( pos ) + { + *pos = Vector( or.origin ); + } + if ( forward ) + { + *forward = Vector( or.axis[ 0 ] ); + } + if ( left ) + { + *left = Vector( or.axis[ 1 ] ); + } + if ( up ) + { + *up = Vector( or.axis[ 2 ] ); + } + } + +qboolean Entity::GetTag + ( + const char *name, + Vector *pos, + Vector *forward, + Vector *left, + Vector *up + ) + + { + int tagnum; + + tagnum = gi.Tag_NumForName( edict->s.modelindex, name ); + + if ( tagnum < 0 ) + return false; + + GetTag( tagnum, pos, forward, left, up ); + return true; + } + +void Entity::addAngles + ( + Vector add + ) + + { + if ( bindmaster ) + { + setAngles( localangles + add ); + } + else + { + setAngles( angles + add ); + } + } + +void Entity::setAngles + ( + void + ) + + { + if ( bindmaster ) + { + setAngles( localangles ); + } + else + { + setAngles( angles ); + } + } + + +void Entity::setAngles + ( + Vector ang + ) + + { + Entity * ent; + int num,i; + + angles[ 0 ] = AngleMod( ang[ 0 ] ); + angles[ 1 ] = AngleMod( ang[ 1 ] ); + angles[ 2 ] = AngleMod( ang[ 2 ] ); + + localangles = angles; + if ( bindmaster ) + { + float mat[3][3]; + AnglesToAxis( localangles, mat ); + R_ConcatRotations( mat, bindmaster->orientation, orientation ); + MatrixToEulerAngles( orientation, angles ); + } + else + { + AnglesToAxis( angles, orientation ); + } + + angles.copyTo( edict->s.netangles ); + angles.copyTo( edict->s.angles ); + angles.copyTo( edict->currentAngles ); + // Fill the edicts matrix + VectorCopy( orientation[ 0 ], edict->s.mat[ 0 ] ); + VectorCopy( orientation[ 1 ], edict->s.mat[ 1 ] ); + VectorCopy( orientation[ 2 ], edict->s.mat[ 2 ] ); + + // + // go through and set our children + // + num = numchildren; + for (i=0;(i < MAX_MODEL_CHILDREN) && num;i++) + { + if ( children[i] == ENTITYNUM_NONE ) + continue; + ent = ( Entity * )G_GetEntity( children[i] ); + ent->setAngles(); + num--; + } + } + +qboolean Entity::droptofloor + ( + float maxfall + ) + + { + trace_t trace; + Vector end; + Vector start; + + start = origin + Vector( "0 0 1" ); + end = origin; + end[ 2 ]-= maxfall; + + trace = G_Trace( start, mins, maxs, end, this, edict->clipmask, false, "Entity::droptofloor" ); + if ( trace.fraction == 1 || trace.startsolid || trace.allsolid || !trace.ent ) + { + groundentity = world->edict; + return false; + } + + setOrigin( trace.endpos ); + + groundentity = trace.ent; + + return true; + } + +void Entity::DamageType + ( + Event *ev + ) + + { + str damage; + damage = ev->GetString( 1 ); + if ( damage == "all" ) + { + damage_type = -1; + } + else + { + damage_type = MOD_string_to_int( damage ); + } + } + +void Entity::Damage + ( + Entity *inflictor, + Entity *attacker, + float damage, + Vector position, + Vector direction, + Vector normal, + int knockback, + int dflags, + int meansofdeath + ) + + { + Event *ev; + + // if our damage types do not match, return + if ( !MOD_matches( meansofdeath, damage_type ) ) + { + return; + } + + if ( !attacker ) + { + attacker = world; + } + if ( !inflictor ) + { + inflictor = world; + } + + ev = new Event( EV_Damage ); + ev->AddFloat( damage ); + ev->AddEntity ( inflictor ); + ev->AddEntity ( attacker ); + ev->AddVector ( position ); + ev->AddVector ( direction ); + ev->AddVector ( normal ); + ev->AddInteger( knockback ); + ev->AddInteger( dflags ); + ev->AddInteger( meansofdeath ); + ProcessEvent ( ev ); + } + +void Entity::DamageEvent + ( + Event *ev + ) + + { + Entity *inflictor; + Entity *attacker; + int damage; + Vector dir; + Vector momentum; + Event *event; + float m; + + if ( ( takedamage == DAMAGE_NO ) || ( movetype == MOVETYPE_NOCLIP ) ) + { + return; + } + + damage = ev->GetInteger( 1 ); + inflictor = ev->GetEntity( 2 ); + attacker = ev->GetEntity( 3 ); + + // figure momentum add + if ( ( inflictor != world ) && + ( movetype != MOVETYPE_NONE ) && + ( movetype != MOVETYPE_STATIONARY ) && + ( movetype != MOVETYPE_BOUNCE ) && + ( movetype != MOVETYPE_PUSH ) && + ( movetype != MOVETYPE_STOP ) ) + { + dir = origin - ( inflictor->origin + ( inflictor->mins + inflictor->maxs ) * 0.5 ); + dir.normalize(); + + if ( mass < 50) + { + m = 50; + } + else + { + m = mass; + } + + momentum = dir * damage * ( 1700.0 / m ); + velocity += momentum; + } + + // check for godmode or invincibility + if ( flags & FL_GODMODE ) + { + return; + } + + // team play damage avoidance + //if ( ( global->teamplay == 1 ) && ( edict->team > 0 ) && ( edict->team == attacker->edict->team ) ) + // { + // return; + // } + + if ( !deathmatch->integer && isSubclassOf( Player ) ) + { + damage *= 0.15; + } + + if ( deadflag ) + { + // Check for gib. + if ( inflictor->isSubclassOf( Projectile ) ) + { + Event *gibEv; + + health -= damage; + + gibEv = new Event( EV_Gib ); + gibEv->AddEntity( this ); + gibEv->AddFloat( health ); + ProcessEvent( gibEv ); + } + return; + } + + // do the damage + health -= damage; + if ( health <= 0 ) + { + if ( attacker ) + { + event = new Event( EV_GotKill ); + event->AddEntity( this ); + event->AddInteger( damage ); + event->AddEntity( inflictor ); + event->AddInteger( ev->GetInteger( 9 ) ); + event->AddInteger( 0 ); + attacker->ProcessEvent( event ); + } + + event = new Event( EV_Killed ); + event->AddEntity( attacker ); + event->AddInteger( damage ); + event->AddEntity( inflictor ); + ProcessEvent( event ); + return; + } + + event = new Event( EV_Pain ); + event->AddFloat( damage ); + event->AddEntity( attacker ); + ProcessEvent( event ); + } + +void Entity::Stun + ( + float time + ) + + { + Event *ev = new Event( EV_Stun ); + ev->AddFloat( time ); + ProcessEvent( ev ); + } + +/* +============ +CanDamage + +Returns true if the inflictor can directly damage the target. Used for +explosions and melee attacks. +============ +*/ +qboolean Entity::CanDamage + ( + Entity *target, + Entity *skip_ent + ) + + { + trace_t trace; + Vector pos; + Entity *skip_entity; + + if ( skip_ent ) + skip_entity = skip_ent; + else + skip_entity = this; + + trace = G_Trace( origin, vec_origin, vec_origin, target->centroid, skip_entity, MASK_SHOT, false, "Entity::CanDamage 1" ); + if ( trace.fraction == 1 || trace.ent == target->edict ) + { + return true; + } + pos = target->centroid + Vector( 15, 15, 0 ); + trace = G_Trace( origin, vec_origin, vec_origin, pos, skip_entity, MASK_SHOT, false, "Entity::CanDamage 3" ); + if ( trace.fraction == 1 || trace.ent == target->edict ) + { + return true; + } + pos = target->centroid + Vector( -15, 15, 0 ); + trace = G_Trace( origin, vec_zero, vec_zero, pos, skip_entity, MASK_SHOT, false, "Entity::CanDamage 4" ); + if ( trace.fraction == 1 || trace.ent == target->edict ) + { + return true; + } + pos = target->centroid + Vector( 15, -15, 0 ); + trace = G_Trace( origin, vec_zero, vec_zero, pos, skip_entity, MASK_SHOT, false, "Entity::CanDamage 5" ); + if ( trace.fraction == 1 || trace.ent == target->edict ) + { + return true; + } + pos = target->centroid + Vector( -15, -15, 0 ); + trace = G_Trace( origin, vec_zero, vec_zero, pos, skip_entity, MASK_SHOT, false, "Entity::CanDamage 6" ); + if ( trace.fraction == 1 || trace.ent == target->edict ) + { + return true; + } + + return false; + } + +qboolean Entity::IsTouching + ( + Entity *e1 + ) + + { + if ( e1->absmin.x > absmax.x ) + { + return false; + } + if ( e1->absmin.y > absmax.y ) + { + return false; + } + if ( e1->absmin.z > absmax.z ) + { + return false; + } + if ( e1->absmax.x < absmin.x ) + { + return false; + } + if ( e1->absmax.y < absmin.y ) + { + return false; + } + if ( e1->absmax.z < absmin.z ) + { + return false; + } + + return true; + } + +void Entity::FadeNoRemove + ( + Event *ev + ) + + { + float rate; + float target; + float myalpha; + + if ( ev->NumArgs() > 1 ) + { + target = ev->GetFloat( 2 ); + } + else + { + target = 0; + } + + if ( ev->NumArgs() > 0 ) + { + rate = ev->GetFloat( 1 ); + assert( rate ); + if ( rate > 0 ) + rate = FRAMETIME / rate; + } + else + { + rate = 0.03; + } + + myalpha = edict->s.alpha; + myalpha -= rate; + + if ( myalpha < target ) + myalpha = target; + + setAlpha( myalpha ); + + if ( myalpha > target ) + { + PostEvent( *ev, FRAMETIME ); + } + + G_SetConstantLight( &edict->s.constantLight, &myalpha, &myalpha, &myalpha, 0 ); + } + +void Entity::FadeOut + ( + Event *ev + ) + + { + float myscale; + float myalpha; + + myscale = edict->s.scale; + myscale -= 0.03f; + myalpha = edict->s.alpha; + myalpha -= 0.03f; + if ( myscale < 0 ) + myscale = 0; + if ( myalpha < 0 ) + myalpha = 0; + + if ( myscale <= 0 && myalpha <= 0 ) + { + PostEvent( EV_Remove, 0 ); + } + else + { + PostEvent( *ev, FRAMETIME ); + } + + setScale( myscale ); + setAlpha( myalpha ); + } + +void Entity::FadeIn + ( + Event *ev + ) + + { + float rate; + float target; + float myalpha; + + if ( ev->NumArgs() > 1 ) + { + target = ev->GetFloat( 2 ); + } + else + { + target = 1; + } + + if ( ev->NumArgs() > 0 ) + { + rate = ev->GetFloat( 1 ); + assert( rate ); + if ( rate > 0 ) + rate = FRAMETIME / rate; + } + else + { + rate = 0.03; + } + + + myalpha = edict->s.alpha; + myalpha += rate; + + if ( myalpha > target ) + myalpha = target; + + if ( myalpha < target ) + { + PostEvent( *ev, FRAMETIME ); + } + setAlpha( myalpha ); + } + +void Entity::Fade + ( + Event *ev + ) + + { + float rate; + float target; + float myalpha; + + if ( ev->NumArgs() > 1 ) + { + target = ev->GetFloat( 2 ); + } + else + { + target = 0; + } + + if ( ev->NumArgs() > 0 ) + { + rate = ev->GetFloat( 1 ); + assert( rate ); + if ( rate > 0 ) + rate = FRAMETIME / rate; + } + else + { + rate = 0.03; + } + + myalpha = edict->s.alpha; + myalpha -= rate; + + if ( myalpha <= 0 ) + { + PostEvent( EV_Remove, 0 ); + return; + } + + if ( myalpha < target ) + myalpha = target; + + if ( myalpha > target ) + { + PostEvent( *ev, FRAMETIME ); + } + + setAlpha( myalpha ); + G_SetConstantLight( &edict->s.constantLight, &myalpha, &myalpha, &myalpha, 0 ); + } + +void Entity::SetMassEvent + ( + Event *ev + ) + + { + mass = ev->GetFloat( 1 ); + } + +void Entity::CheckGround + ( + void + ) + + { + Vector point; + trace_t trace; + + if ( flags & ( FL_SWIM | FL_FLY ) ) + { + return; + } + + if ( velocity.z > 100 ) + { + groundentity = NULL; + return; + } + + // if the hull point one-quarter unit down is solid the entity is on ground + point = origin; + point.z -= 0.25; + trace = G_Trace( origin, mins, maxs, point, this, edict->clipmask, false, "Entity::CheckGround" ); + + // check steepness + if ( ( trace.plane.normal[ 2 ] <= 0.7 ) && !trace.startsolid ) + { + groundentity = NULL; + return; + } + + groundentity = trace.ent; + groundplane = trace.plane; + groundcontents = trace.contents; + + if ( !trace.startsolid && !trace.allsolid ) + { + setOrigin( trace.endpos ); + velocity.z = 0; + } + } + +void Entity::BecomeSolid + ( + Event *ev + ) + + { + if ( ( model.length() ) && ( ( model[ 0 ] == '*' ) || ( strstr( model.c_str(), ".bsp" ) ) ) ) + { + setSolidType( SOLID_BSP ); + } + else + { + setSolidType( SOLID_BBOX ); + } + } + +void Entity::BecomeNonSolid + ( + Event *ev + ) + + { + setSolidType( SOLID_NOT ); + } + +void Entity::Ghost + ( + Event *ev + ) + + { + // Make not solid, but send still send over whether it is hidden or not + setSolidType( SOLID_NOT ); + edict->svflags &= ~SVF_NOCLIENT; + } + +void Entity::LoopSound + ( + Event *ev + ) + + { + str sound_name; + float volume = DEFAULT_VOL; + float min_dist = DEFAULT_MIN_DIST; + str min_dist_string; + + + if (ev->NumArgs() < 1) + return; + + // Get parameters + + sound_name = ev->GetString( 1 ); + + if ( ev->NumArgs() > 1 ) + volume = ev->GetFloat( 2 ); + + if ( ev->NumArgs() > 2 ) + { + min_dist_string = ev->GetString( 3 ); + + if ( min_dist_string == LEVEL_WIDE_STRING ) + min_dist = LEVEL_WIDE_MIN_DIST; + else + min_dist = ev->GetFloat( 3 ); + } + + // Add this sound to loop + + LoopSound( sound_name.c_str(), volume, min_dist ); + } + +void Entity::LoopSound( str sound_name, float volume, float min_dist ) + { + const char *name = NULL; + str random_alias; + + + // Get the real sound to be played + + if ( sound_name.length() > 0 ) + { + // Get the real sound to play + + name = gi.GlobalAlias_FindRandom( sound_name.c_str() ); + + if ( !name ) + { + random_alias = GetRandomAlias( sound_name ).c_str(); + + if ( random_alias.length() > 0 ) + name = random_alias.c_str(); + } + + if ( !name ) + name = sound_name.c_str(); + + // Add the looping sound to the entity + + edict->s.loopSound = gi.soundindex( name ); + edict->s.loopSoundVolume = volume; + edict->s.loopSoundMinDist = min_dist; + } + } + +void Entity::StopLoopSound( Event *ev ) + { + StopLoopSound(); + } + +void Entity::StopLoopSound( void ) + { + edict->s.loopSound = 0; + } + +void Entity::Sound( Event *ev ) + { + str sound_name; + float volume; + int channel; + float min_dist; + int i; + str min_dist_string; + + + // Set defaults + + volume = DEFAULT_VOL; + min_dist = DEFAULT_MIN_DIST; + channel = CHAN_BODY; + + // Get sound parameters + + for ( i = 1 ; i <= ev->NumArgs() ; i++ ) + { + switch (i-1) + { + case 0: + sound_name = ev->GetString( i ); + break; + case 1: + channel = ev->GetInteger( i ); + break; + case 2: + volume = ev->GetFloat( i ); + break; + case 3: + min_dist_string = ev->GetString( i ); + + if ( min_dist_string == LEVEL_WIDE_STRING ) + min_dist = LEVEL_WIDE_MIN_DIST; + else + min_dist = ev->GetFloat( i ); + break; + default: + break; + } + } + + Sound( sound_name, channel, volume, min_dist, NULL ); + } + +void Entity::StopSound + ( + Event *ev + ) + + { + if (ev->NumArgs() < 1) + StopSound( CHAN_BODY ); + else + StopSound( ev->GetInteger( 1 ) ); + } + +void Entity::StopSound + ( + int channel + ) + + { + gi.StopSound( entnum, channel ); + } + +void Entity::SetLight + ( + Event *ev + ) + + { + float r, g, b; + + if ( ev->NumArgs() == 1 ) + { + Vector tmp; + + tmp = ev->GetVector( 1 ); + r = tmp.x; + g = tmp.y; + b = tmp.z; + } + else + { + r = ev->GetFloat( 1 ); + g = ev->GetFloat( 2 ); + b = ev->GetFloat( 3 ); + lightRadius = ev->GetFloat( 4 ); + } + + G_SetConstantLight( &edict->s.constantLight, &r, &g, &b, &lightRadius ); + } + +void Entity::LightOn + ( + Event *ev + ) + + { + G_SetConstantLight( &edict->s.constantLight, NULL, NULL, NULL, &lightRadius ); + } + +void Entity::LightOff + ( + Event *ev + ) + + { + float radius = 0; + + G_SetConstantLight( &edict->s.constantLight, NULL, NULL, NULL, &radius ); + } + +void Entity::LightRed + ( + Event *ev + ) + + { + float r; + + r = ev->GetFloat( 1 ); + G_SetConstantLight( &edict->s.constantLight, &r, NULL, NULL, NULL ); + } + +void Entity::LightGreen + ( + Event *ev + ) + + { + float g; + + g = ev->GetFloat( 1 ); + G_SetConstantLight( &edict->s.constantLight, NULL, &g, NULL, NULL ); + } + +void Entity::LightBlue + ( + Event *ev + ) + + { + float b; + + b = ev->GetFloat( 1 ); + G_SetConstantLight( &edict->s.constantLight, NULL, NULL, &b, NULL ); + } + +void Entity::LightRadius + ( + Event *ev + ) + + { + lightRadius = ev->GetFloat( 1 ); + G_SetConstantLight( &edict->s.constantLight, NULL, NULL, NULL, &lightRadius ); + } + +void Entity::LightStyle + ( + Event *ev + ) + + { + int style; + + style = ev->GetInteger( 1 ); + G_SetConstantLight( &edict->s.constantLight, NULL, NULL, NULL, NULL, &style ); + } + +void Entity::SetHealth + ( + Event *ev + ) + + { + health = ev->GetFloat( 1 ); + max_health = health; + } + +void Entity::SetSize + ( + Event *ev + ) + + { + Vector min, max; + + min = ev->GetVector( 1 ); + max = ev->GetVector( 2 ); + setSize( min, max ); + } + +void Entity::SetMins + ( + Event *ev + ) + + { + Vector min; + + min = ev->GetVector( 1 ); + setSize( min, maxs ); + } + +void Entity::SetMaxs + ( + Event *ev + ) + + { + Vector max; + + max = ev->GetVector( 1 ); + setSize( mins, max ); + } + +void Entity::SetScale + ( + Event *ev + ) + + { + setScale( ev->GetFloat( 1 ) ); + } + +void Entity::SetAlpha + ( + Event *ev + ) + + { + setAlpha( ev->GetFloat( 1 ) ); + } + +void Entity::SetOrigin + ( + Event *ev + ) + + { + setOrigin( ev->GetVector( 1 ) ); + } + +void Entity::SetTargetName + ( + Event *ev + ) + + { + SetTargetName( ev->GetString( 1 ) ); + } + +void Entity::SetTarget + ( + Event *ev + ) + + { + SetTarget( ev->GetString( 1 ) ); + } + +void Entity::SetKillTarget + ( + Event *ev + ) + + { + SetKillTarget( ev->GetString( 1 ) ); + } + +void Entity::SetAngles + ( + Event *ev + ) + + { + setAngles( ev->GetVector( 1 ) ); + } + +Vector Entity::GetControllerAngles + ( + int num + ) + + { + Vector controller_angles; + + assert( ( num >= 0 ) && ( num < NUM_BONE_CONTROLLERS ) ); + + if ( ( num < 0 ) || ( num >= NUM_BONE_CONTROLLERS ) ) + { + error( "GetControllerAngles", "Bone controller index out of range (%d)\n", num ); + return vec_zero; + } + + controller_angles = edict->s.bone_angles[ num ]; + + return controller_angles; + } + +void Entity::SetControllerAngles + ( + int num, + vec3_t angles + ) + + { + assert( ( num >= 0 ) && ( num < NUM_BONE_CONTROLLERS ) ); + + if ( ( num < 0 ) || ( num >= NUM_BONE_CONTROLLERS ) ) + { + error( "SetControllerAngles", "Bone controller index out of range (%d)\n", num ); + return; + } + + VectorCopy( angles, edict->s.bone_angles[ num ] ); + EulerToQuat( edict->s.bone_angles[ num ], edict->s.bone_quat[ num ] ); + } + +void Entity::SetControllerAngles + ( + Event *ev + ) + + { + int num; + Vector angles; + + if ( ev->NumArgs() < 2 ) + return; + + num = ev->GetInteger( 1 ); + angles = ev->GetVector( 2 ); + + SetControllerAngles( num, angles ); + } + +void Entity::SetControllerTag + ( + int num, + int tag_num + ) + + { + assert( ( num >= 0 ) && ( num < NUM_BONE_CONTROLLERS ) ); + + if ( ( num < 0 ) || ( num >= NUM_BONE_CONTROLLERS ) ) + { + error( "SetControllerTag", "Bone controller index out of range (%d)\n", num ); + return; + } + + edict->s.bone_tag[ num ] = tag_num; + } + +void Entity::RegisterAlias + ( + Event *ev + ) + + { + char parameters[100]; + int i; + + // Get the parameters for this alias command + + parameters[0] = 0; + + for( i = 3 ; i <= ev->NumArgs() ; i++ ) + { + strcat( parameters, ev->GetString( i ) ); + strcat( parameters, " "); + } + + gi.Alias_Add( edict->s.modelindex, ev->GetString( 1 ), ev->GetString( 2 ), parameters ); + } + +void Entity::Cache + ( + Event *ev + ) + + { + CacheResource( ev->GetString( 1 ), this ); + } + +void Entity::RegisterAliasAndCache + ( + Event *ev + ) + + { + RegisterAlias(ev); + + CacheResource( ev->GetString( 2 ), this ); + } + +void Entity::Sound + ( + str sound_name, + int channel, + float volume, + float min_dist, + Vector *sound_origin + ) + { + const char *name = NULL; + vec3_t org; + str random_alias; + + + if ( sound_name.length() > 0 ) + { + // Get the real sound to play + + name = gi.GlobalAlias_FindRandom( sound_name.c_str() ); + + if ( !name ) + { + random_alias = GetRandomAlias( sound_name ).c_str(); + + if ( random_alias.length() > 0 ) + name = random_alias.c_str(); + } + + if ( !name ) + name = sound_name.c_str(); + + // Play the sound + + if ( name != NULL ) + { + if ( sound_origin != NULL) + { + sound_origin->copyTo( org ); + entnum = ENTITYNUM_NONE; + } + else + { + VectorCopy( edict->s.origin, org ); + } + + gi.Sound( &org, entnum, channel, name, volume, min_dist ); + } + } + else + { + warning( "Sound", "Null sample pointer" ); + } + } + +qboolean Entity::attach + ( + int parent_entity_num, + int tag_num, + qboolean use_angles, + Vector offset + ) + + { + int i; + Entity * parent; + + if ( entnum == parent_entity_num ) + { + warning("attach","Trying to attach to oneself." ); + return false; + } + + if ( edict->s.parent != ENTITYNUM_NONE ) + detach(); + + // + // make sure this is a modelanim entity so that the attach works properly + // + if ( edict->s.eType == ET_GENERAL ) + { + edict->s.eType = ET_MODELANIM; + } + + // + // get the parent + // + parent = ( Entity * )G_GetEntity( parent_entity_num ); + + if (parent->numchildren < MAX_MODEL_CHILDREN) + { + // + // find a free spot in the parent + // + for ( i=0; i < MAX_MODEL_CHILDREN; i++ ) + if ( parent->children[i] == ENTITYNUM_NONE ) + { + break; + } + edict->s.parent = parent_entity_num; + setSolidType( SOLID_NOT ); + parent->children[i] = entnum; + parent->numchildren++; + edict->s.tag_num = tag_num; + edict->s.attach_use_angles = use_angles; + offset.copyTo( edict->s.attach_offset ); + setOrigin(); + return true; + } + return false; + } + +void Entity::KillAttach + ( + Event *ev + ) + + { + int i; + Entity *child = NULL; + + + // Kill all of this entities children + + for ( i = 0 ; i < MAX_MODEL_CHILDREN; i++ ) + { + if ( children[i] != ENTITYNUM_NONE ) + { + // Remove child + child = ( Entity * )G_GetEntity( children[i] ); + + if ( child ) + child->ProcessEvent( EV_Remove ); + + // Remove child from this entity + children[i] = ENTITYNUM_NONE; + } + } + + numchildren = 0; + } + +void Entity::detach + ( + void + ) + + { + int i; + int num; + Entity * parent; + + if ( edict->s.parent == ENTITYNUM_NONE ) + return; + + parent = ( Entity * )G_GetEntity( edict->s.parent ); + if (!parent) + return; + for ( i=0,num = parent->numchildren; i < MAX_MODEL_CHILDREN; i++ ) + { + if ( parent->children[i] == ENTITYNUM_NONE ) + { + continue; + } + if (parent->children[i] == entnum) + { + parent->children[i] = ENTITYNUM_NONE; + parent->numchildren--; + break; + } + num--; + if (!num) + break; + } + edict->s.parent = ENTITYNUM_NONE; + setOrigin( origin ); + } + +void Entity::Flags( Event *ev ) + { + const char *flag; + int mask; + int action; + int i; + + for ( i = 1; i <= ev->NumArgs(); i++ ) + { + action = FLAG_IGNORE; + flag = ev->GetString( i ); + switch( flag[0] ) + { + case '+': + action = FLAG_ADD; + flag++; + break; + case '-': + action = FLAG_CLEAR; + flag++; + break; + default: + ev->Error( "Entity::Flags", "First character is not '+' or '-', assuming '+'\n" ); + action = FLAG_ADD; + break; + } + + // + // WARNING: please change the Event decleration, + // to match this function, if flags are added or + // deleted the event must be updated. + // + if ( !stricmp( flag, "blood" ) ) + mask = FL_BLOOD; + else if ( !stricmp( flag, "explode" ) ) + mask = FL_DIE_EXPLODE; + else if ( !stricmp( flag, "die_gibs" ) ) + mask = FL_DIE_GIBS; + else if ( !stricmp( flag, "autoaim" ) ) + mask = FL_AUTOAIM; + else if ( !stricmp( flag, "god" ) ) + mask = FL_GODMODE; + else + { + mask = 0; + action = FLAG_IGNORE; + ev->Error( "Unknown flag '%s'", flag ); + } + switch (action) + { + case FLAG_ADD: + flags |= mask; + break; + case FLAG_CLEAR: + flags &= ~mask; + break; + case FLAG_IGNORE: + break; + } + } + if ( !com_blood->integer ) + { + if ( flags & (FL_BLOOD|FL_DIE_GIBS) ) + { + flags &= ~FL_BLOOD; + flags &= ~FL_DIE_GIBS; + } + } + } + + +void Entity::Effects( Event *ev ) + { + const char *flag; + int mask=0; + int action; + int i; + + for ( i = 1; i <= ev->NumArgs(); i++ ) + { + action = 0; + flag = ev->GetString( i ); + switch( flag[0] ) + { + case '+': + action = FLAG_ADD; + flag++; + break; + case '-': + action = FLAG_CLEAR; + flag++; + break; + default: + ev->Error( "Entity::Effects", "First character is not '+' or '-', assuming '+'\n" ); + action = FLAG_ADD; + break; + } + + // + // WARNING: please change the Event decleration, + // to match this function, if flags are added or + // deleted the event must be updated. + // + if ( !stricmp( flag, "everyframe" ) ) + mask = EF_EVERYFRAME; + if ( !stricmp( flag, "antisbjuice" ) ) + mask = EF_ANTISBJUICE; + else + { + action = FLAG_IGNORE; + ev->Error( "Unknown token %s.", flag ); + } + + switch (action) + { + case FLAG_ADD: + edict->s.eFlags |= mask; + break; + case FLAG_CLEAR: + edict->s.eFlags &= ~mask; + break; + case FLAG_IGNORE: + break; + } + } + } + +void Entity::RenderEffects( Event *ev ) + { + const char *flag; + int mask=0; + int action; + int i; + + for ( i = 1; i <= ev->NumArgs(); i++ ) + { + action = 0; + flag = ev->GetString( i ); + switch( flag[0] ) + { + case '+': + action = FLAG_ADD; + flag++; + break; + case '-': + action = FLAG_CLEAR; + flag++; + break; + default: + ev->Error( "Entity::RenderEffects", "First character is not '+' or '-', assuming '+'\n" ); + action = FLAG_ADD; + break; + } + + // + // WARNING: please change the Event decleration, + // to match this function, if flags are added or + // deleted the event must be updated. + // + if ( !stricmp( flag, "dontdraw" ) ) + mask = RF_DONTDRAW; + else if ( !stricmp( flag, "betterlighting" ) ) + mask = RF_EXTRALIGHT; + else if ( !stricmp ( flag, "lensflare" ) ) + mask = RF_LENSFLARE; + else if ( !stricmp ( flag, "viewlensflare" ) ) + mask = RF_VIEWLENSFLARE; + else if ( !stricmp ( flag, "lightoffset" ) ) + mask = RF_LIGHTOFFSET; + else if ( !stricmp( flag, "skyorigin" ) ) + mask = RF_SKYORIGIN; + else if ( !stricmp( flag, "fullbright" ) ) + mask = RF_FULLBRIGHT; + else if ( !stricmp( flag, "minlight" ) ) + mask = RF_MINLIGHT; + else if ( !stricmp( flag, "additivedynamiclight" ) ) + mask = RF_ADDITIVE_DLIGHT; + else if ( !stricmp( flag, "lightstyledynamiclight" ) ) + mask = RF_LIGHTSTYLE_DLIGHT; + else if ( !stricmp( flag, "shadow" ) ) + mask = RF_SHADOW; + else if ( !stricmp( flag, "preciseshadow" ) ) + mask = RF_SHADOW_PRECISE; + else if ( !stricmp( flag, "invisible" ) ) + mask = RF_INVISIBLE; + else + { + action = FLAG_IGNORE; + ev->Error( "Unknown token %s.", flag ); + } + + switch (action) + { + case FLAG_ADD: + edict->s.renderfx |= mask; + break; + case FLAG_CLEAR: + edict->s.renderfx &= ~mask; + break; + case FLAG_IGNORE: + break; + } + } + } + +void Entity::SVFlags + ( + Event *ev + ) + + { + const char *flag; + int mask=0; + int action; + int i; + + for ( i = 1; i <= ev->NumArgs(); i++ ) + { + action = 0; + flag = ev->GetString( i ); + switch( flag[0] ) + { + case '+': + action = FLAG_ADD; + flag++; + break; + case '-': + action = FLAG_CLEAR; + flag++; + break; + default: + ev->Error( "Entity::SVFlags", "First character is not '+' or '-', assuming '+'\n" ); + action = FLAG_ADD; + break; + } + + // + // WARNING: please change the Event decleration, + // to match this function, if flags are added or + // deleted the event must be updated. + // + if ( !stricmp( flag, "broadcast" ) ) + mask = SVF_BROADCAST; + else if ( !stricmp( flag, "sendonce" ) ) + mask = SVF_SENDONCE; + else + { + action = FLAG_IGNORE; + ev->Error( "Unknown token %s.", flag ); + } + + switch (action) + { + case FLAG_ADD: + edict->svflags |= mask; + break; + case FLAG_CLEAR: + edict->svflags &= ~mask; + break; + case FLAG_IGNORE: + break; + } + } + + if ( edict->svflags & SVF_SENDONCE ) + { + // Turn this entity into an event if the SENDONCE flag is sent + edict->s.eType = ET_EVENTS; + } + } + +void Entity::BroadcastSound + ( + float rad + ) + + { + if ( !( this->flags & FL_NOTARGET ) ) + { + G_BroadcastSound( this, centroid, rad ); + } + } + +void Entity::BroadcastSound + ( + Event *ev + ) + + { + float rad; + + if ( !( this->flags & FL_NOTARGET ) ) + { + rad = ev->NumArgs() < 1 ? SOUND_RADIUS : ev->GetFloat( 1 ); + BroadcastSound( rad ); + } + } + +void Entity::Think + ( + void + ) + + { + } + +void Entity::SetWaterType + ( + void + ) + + { + qboolean isinwater; + + watertype = gi.pointcontents( origin, 0 ); + isinwater = watertype & MASK_WATER; + + if ( isinwater ) + { + waterlevel = 1; + } + else + { + waterlevel = 0; + } + } + +void Entity::DamageSkin + ( + trace_t * trace, + float damage + ) + + { + /* FIXME : Do we need damage skins? + int surface; + + // FIXME handle different bodyparts + surface = trace->intersect.surface; + if ( !edict->s.surfaces[ surface ] ) + { + edict->s.surfaces[ surface ]++; + } + */ + } + +void Entity::Kill + ( + Event *ev + ) + + { + health = 0; + Damage( this, this, 10, origin, vec_zero, vec_zero, 0, 0, MOD_SUICIDE ); + } + + +void Entity::SurfaceCommand + ( + const char * surf_name, + const char * token + ) + + { + const char * current_surface_name; + int surface_num; + int mask; + int action; + qboolean do_all = false; + qboolean mult = false; + + + if ( surf_name[ strlen( surf_name ) - 1 ] == '*' ) + { + mult = true; + surface_num = 0; + } + else if ( str( surf_name ) != str( "all" ) ) + { + surface_num = gi.Surface_NameToNum( edict->s.modelindex, surf_name ); + + if (surface_num < 0) + { + warning( "SurfaceCommand", "group %s not found.", surf_name ); + return; + } + } + else + { + surface_num = 0; + do_all = true; + } + + action = 0; + switch( token[0] ) + { + case '+': + action = FLAG_ADD; + token++; + break; + case '-': + action = FLAG_CLEAR; + token++; + break; + default: + warning( "Entity::SurfaceModelEvent", "First character is not '+' or '-', assuming '+'\n" ); + action = FLAG_ADD; + break; + } + // + // WARNING: please change the Event decleration, + // to match this function, if flags are added or + // deleted the event must be updated. + // + if (!strcmpi( token, "skin1")) + { + mask = MDL_SURFACE_SKINOFFSET_BIT0; + } + else if (!strcmpi (token, "skin2")) + { + mask = MDL_SURFACE_SKINOFFSET_BIT1; + } + else if (!strcmpi (token, "nodraw")) + { + mask = MDL_SURFACE_NODRAW; + } + else if (!strcmpi (token, "crossfade")) + { + mask = MDL_SURFACE_CROSSFADE_SKINS; + } + else + { + mask = 0; + warning( "SurfaceCommand", "Unknown token %s.", token ); + action = FLAG_IGNORE; + } + for( ; surface_num < numsurfaces ; surface_num++ ) + { + if ( mult ) + { + current_surface_name = gi.Surface_NumToName( edict->s.modelindex, surface_num ); + + if ( Q_stricmpn( current_surface_name, surf_name, strlen( surf_name ) - 1) != 0 ) + continue; + } + + switch (action) + { + case FLAG_ADD: + edict->s.surfaces[ surface_num ] |= mask; + break; + case FLAG_CLEAR: + edict->s.surfaces[ surface_num ] &= ~mask; + break; + case FLAG_IGNORE: + break; + } + + if ( !do_all && !mult ) + break; + } + } + +void Entity::SurfaceModelEvent + ( + Event *ev + ) + + { + const char * surf_name; + const char * token; + int i; + + surf_name = ev->GetString( 1 ); + + for ( i = 2; i <= ev->NumArgs() ; i++ ) + { + token = ev->GetString( i ); + SurfaceCommand( surf_name, token ); + } + } + +void Entity::AttachEvent + ( + Event * ev + ) + { + Entity * parent; + const char * bone; + int tagnum; + qboolean use_angles = qtrue; + Vector offset; + + parent = ev->GetEntity( 1 ); + bone = ev->GetString( 2 ); + + if ( ev->NumArgs() > 2 ) + use_angles = ev->GetInteger( 3 ); + + if ( ev->NumArgs() > 3 ) + offset = ev->GetVector( 4 ); + + if ( !parent ) + return; + + tagnum = gi.Tag_NumForName( parent->edict->s.modelindex, bone ); + if ( tagnum >= 0 ) + { + attach( parent->entnum, tagnum, use_angles, offset ); + } + else + { + warning( "AttachEvent", "Tag %s not found", bone ); + } + } + +void Entity::AttachModelEvent + ( + Event * ev + ) + { + Entity * obj; + const char * bone; + str modelname; + int tagnum; + float remove_time,fade_time,fade_delay; + Vector offset; + + obj = new Animate; + + modelname = ev->GetString( 1 ); + bone = ev->GetString( 2 ); + if ( ev->NumArgs() > 2 ) + { + obj->setScale( ev->GetFloat( 3 ) ); + } + if ( ev->NumArgs() > 3 ) + { + obj->SetTargetName( ev->GetString( 4 ) ); + } + + if ( ev->NumArgs() > 4 ) + obj->detach_at_death = ev->GetInteger( 5 ); + + if ( ev->NumArgs() > 5 ) + { + remove_time = ev->GetFloat( 6 ); + + if ( remove_time != -1 ) + { + Event *remove_event = new Event( EV_Remove ); + obj->PostEvent( remove_event, remove_time ); + } + } + + if ( ev->NumArgs() > 6 ) + { + Event *fade_event; + + fade_time = ev->GetFloat( 7 ); + + if ( fade_time != -1 ) + { + obj->setAlpha( 0 ); + + fade_event = new Event( EV_FadeIn ); + fade_event->AddFloat( fade_time ); + obj->PostEvent( fade_event, 0 ); + } + } + + if ( ev->NumArgs() > 7 ) + { + Event *fade_event; + + fade_delay = ev->GetFloat( 8 ); + + if ( fade_delay != -1 ) + { + if ( ev->NumArgs() > 8 ) + fade_time = ev->GetFloat( 9 ); + else + fade_time = 0; + + fade_event = new Event( EV_Fade ); + + if ( fade_time ) + fade_event->AddFloat( fade_time ); + + obj->PostEvent( fade_event, fade_delay ); + } + } + + if ( ev->NumArgs() > 9 ) + offset = ev->GetVector( 10 ); + + obj->setModel( modelname ); + + tagnum = gi.Tag_NumForName( edict->s.modelindex, bone ); + if ( tagnum >= 0 ) + { + if ( !obj->attach( this->entnum, tagnum, true, offset ) ) + { + //warning( "AttachModelEvent", "Could not attach model %s", modelname.c_str() ); + delete obj; + return; + } + } + else + { + warning( "AttachModelEvent", "Tag %s not found", bone ); + } + } + +void Entity::RemoveAttachedModelEvent + ( + Event *ev + ) + { + const char *tag_name; + int tag_num; + int num; + int i; + Entity *ent; + float fade_rate = 0; + Event *fade_event; + str model_name; + + tag_name = ev->GetString( 1 ); + tag_num = gi.Tag_NumForName( edict->s.modelindex, tag_name ); + + if ( ev->NumArgs() > 1 ) + fade_rate = ev->GetFloat( 2 ); + + if ( ev->NumArgs() > 2 ) + model_name = ev->GetString( 3 ); + + if ( tag_num >= 0 ) + { + num = numchildren; + + for ( i = 0 ; (i < MAX_MODEL_CHILDREN) && num ; i++ ) + { + if ( children[i] == ENTITYNUM_NONE ) + continue; + + ent = ( Entity * )G_GetEntity( children[i] ); + + if ( ent->edict->s.tag_num == tag_num ) + { + if ( !model_name.length() || model_name == ent->model ) + { + if ( fade_rate ) + { + fade_event = new Event( EV_Fade ); + fade_event->AddFloat( fade_rate ); + fade_event->AddFloat( 0 ); + ent->PostEvent( fade_event, 0 ); + } + + ent->PostEvent( EV_Remove, fade_rate ); + } + } + + num--; + } + } + } + +void Entity::DetachEvent + ( + Event * ev + ) + + { + if ( edict->s.parent == ENTITYNUM_NONE ) + { + return; + } + detach(); + } + +void Entity::TakeDamageEvent + ( + Event * ev + ) + { + takedamage = DAMAGE_YES; + } + +void Entity::NoDamageEvent + ( + Event * ev + ) + { + takedamage = DAMAGE_NO; + } + +void Entity::Gravity + ( + Event *ev + ) + + { + gravity = ev->GetFloat( 1 ); + } + +void Entity::UseBoundingBoxEvent + ( + Event *ev + ) + { + edict->svflags |= SVF_USEBBOX; + } + +void Entity::HurtEvent + ( + Event *ev + ) + { + Vector normal; + float dmg; + int means_of_death; + Vector direction; + + if ( ev->NumArgs() < 1 ) + { + dmg = 50; + } + else + { + dmg = ev->GetFloat( 1 ); + } + + if ( ev->NumArgs() > 1 ) + means_of_death = MOD_string_to_int( ev->GetString( 2 ) ); + else + means_of_death = MOD_CRUSH; + + if ( ev->NumArgs() > 2 ) + { + direction = ev->GetVector( 3 ); + direction.normalize(); + } + else + { + direction = vec_zero; + } + + normal = Vector( orientation[ 0 ] ); + Damage( world, world, dmg, centroid, direction, normal, dmg, 0, means_of_death ); + } + +void Entity::IfSkillEvent + ( + Event *ev + ) + + { + float skilllevel; + + skilllevel = ev->GetFloat( 1 ); + + if ( skill->value == skilllevel ) + { + int argc; + int numargs; + Event *event; + int i; + + numargs = ev->NumArgs(); + argc = numargs - 2 + 1; + + event = new Event( ev->GetToken( 2 ) ); + + for( i = 1; i < argc; i++ ) + { + event->AddToken( ev->GetToken( 2 + i ) ); + } + ProcessEvent( event ); + } + } + +void Entity::Censor + ( + Event *ev + ) + + { + Vector delta; + float oldsize; + float newsize; + + if ( com_blood->integer ) + return; + + oldsize = size.length(); + setSolidType( SOLID_NOT ); + setModel( "censored.tik" ); + gi.CalculateBounds( edict->s.modelindex, 1, mins, maxs ); + delta = maxs - mins; + newsize = delta.length(); + edict->s.scale = oldsize / newsize; + mins *= edict->s.scale; + maxs *= edict->s.scale; + setSize( mins, maxs ); + setOrigin(); + } + +void Entity::StationaryEvent + ( + Event *ev + ) + + { + setMoveType( MOVETYPE_STATIONARY ); + } + +void Entity::Explosion + ( + Event *ev + ) + + { + str expmodel; + str tag_name; + //orientation_t orient; + Vector explosion_origin; + + expmodel = ev->GetString( 1 ); + explosion_origin = origin; + + if ( ev->NumArgs() > 1 ) + { + tag_name = ev->GetString( 2 ); + + //if ( GetRawTag( tag_name.c_str(), &orient, legs ) ) + // VectorAdd( orient.origin, origin, explosion_origin ); + + GetTag( tag_name.c_str(), &explosion_origin ); + } + + ExplosionAttack( explosion_origin, this, expmodel ); + } + +void Entity::Shader + ( + Event *ev + ) + + { + const char * token; + + if ( gi.IsModel( edict->s.modelindex ) ) + { + ev->Error( "shader event being called on TIKI model\n" ); + } + // + // get sub shader command + // + token = ev->GetString( 1 ); + + // + // WARNING: please change the Event decleration, + // to match this function, if flags are added or + // deleted the event must be updated. + // + if (!strcmpi( token, "translation")) + { + float x, y; + + x = ev->GetFloat( 2 ); + y = ev->GetFloat( 3 ); + TRANSLATION_TO_PKT( x, edict->s.tag_num ); + TRANSLATION_TO_PKT( y, edict->s.skinNum ); + } + else if (!strcmpi( token, "offset")) + { + float x, y; + + x = ev->GetFloat( 2 ); + y = ev->GetFloat( 3 ); + OFFSET_TO_PKT( x, edict->s.tag_num ); + OFFSET_TO_PKT( y, edict->s.skinNum ); + } + else if (!strcmpi (token, "rotation")) + { + float rot; + + rot = ev->GetFloat( 2 ); + ROTATE_TO_PKT( rot, edict->s.tag_num ); + } + else if (!strcmpi (token, "frame")) + { + edict->s.frame = ev->GetInteger( 2 ); + } + else if (!strcmpi (token, "wavebase")) + { + float base; + + base = ev->GetFloat( 2 ); + BASE_TO_PKT( base, edict->s.surfaces[ 0 ] ); + } + else if (!strcmpi (token, "waveamp")) + { + float amp; + + amp = ev->GetFloat( 2 ); + AMPLITUDE_TO_PKT( amp, edict->s.surfaces[ 1 ] ); + } + else if (!strcmpi (token, "wavephase")) + { + float phase; + + phase = ev->GetFloat( 2 ); + PHASE_TO_PKT( phase, edict->s.surfaces[ 2 ] ); + } + else if (!strcmpi (token, "wavefreq")) + { + float freq; + + freq = ev->GetFloat( 2 ); + FREQUENCY_TO_PKT( freq, edict->s.surfaces[ 3 ] ); + } + } + +void Entity::DropToFloorEvent + ( + Event *ev + ) + + { + float range; + + if ( ev->NumArgs() > 0 ) + { + range = ev->GetFloat( 1 ); + } + else + { + range = MAP_SIZE; + } + if ( !droptofloor( range ) ) + { + } + } + + +//************************************************************************* +// +// BIND code +// +//************************************************************************* + +qboolean Entity::isBoundTo + ( + Entity *master + ) + + { + Entity *ent; + + for( ent = bindmaster; ent != NULL; ent = ent->bindmaster ) + { + if ( ent == master ) + { + return true; + } + } + + return false; + } + +void Entity::bind + ( + Entity *master, + qboolean use_my_angles + ) + + { + float mat[ 3 ][ 3 ]; + float local[ 3 ][ 3 ]; + Vector ang; + + assert( master ); + if ( !master ) + { + warning( "bind", "Null master entity" ); + return; + } + + if ( master == this ) + { + warning( "bind", "Trying to bind to oneself." ); + return; + } + + // unbind myself from my master + unbind(); + + bindmaster = master; + edict->s.bindparent = master->entnum; + bind_use_my_angles = use_my_angles; + + // We are now separated from our previous team and are either + // an individual, or have a team of our own. Now we can join + // the new bindmaster's team. Bindmaster must be set before + // joining the team, or we will be placed in the wrong position + // on the team. + joinTeam( master ); + + // calculate local angles + TransposeMatrix( bindmaster->orientation, mat ); + R_ConcatRotations( mat, orientation, local ); + MatrixToEulerAngles( local, ang ); + setAngles( ang ); + + setOrigin( getParentVector( localorigin - bindmaster->origin ) ); + + return; + } + +void Entity::unbind + ( + void + ) + + { + Entity *prev; + Entity *next; + Entity *last; + Entity *ent; + + if ( !bindmaster ) + { + return; + } + + //bindmaster = NULL; + + // Check this GAMEFIX - should it be origin? + localorigin = Vector( edict->s.origin ); + localangles = Vector( edict->s.angles ); + + if ( !teammaster ) + { + bindmaster = NULL; + edict->s.bindparent = ENTITYNUM_NONE; + //Teammaster already has been freed + return; + } + + // We're still part of a team, so that means I have to extricate myself + // and any entities that are bound to me from the old team. + // Find the node previous to me in the team + prev = teammaster; + + for( ent = teammaster->teamchain; ent && ( ent != this ); ent = ent->teamchain ) + { + prev = ent; + } + + // If ent is not pointing to me, then something is very wrong. + assert( ent ); + if ( !ent ) + { + error( "unbind", "corrupt team chain\n" ); + } + + // Find the last node in my team that is bound to me. + // Also find the first node not bound to me, if one exists. + last = this; + for( next = teamchain; next != NULL; next = next->teamchain ) + { + if ( !next->isBoundTo( this ) ) + { + break; + } + + // Tell them I'm now the teammaster + next->teammaster = this; + last = next; + } + + // disconnect the last member of our team from the old team + last->teamchain = NULL; + + // connect up the previous member of the old team to the node that + // follow the last node bound to me (if one exists). + if ( teammaster != this ) + { + prev->teamchain = next; + if ( !next && ( teammaster == prev ) ) + { + prev->teammaster = NULL; + } + } + else if ( next ) + { + // If we were the teammaster, then the nodes that were not bound to me are now + // a disconnected chain. Make them into their own team. + for( ent = next; ent->teamchain != NULL; ent = ent->teamchain ) + { + ent->teammaster = next; + } + next->teammaster = next; + next->flags &= ~FL_TEAMSLAVE; + } + + // If we don't have anyone on our team, then clear the team variables. + if ( teamchain ) + { + // make myself my own team + teammaster = this; + } + else + { + // no longer a team + teammaster = NULL; + } + + flags &= ~FL_TEAMSLAVE; + bindmaster = NULL; + edict->s.bindparent = ENTITYNUM_NONE; + } + +void Entity::EventUnbind + ( + Event *ev + ) + + { + unbind(); + } + +void Entity::BindEvent + ( + Event *ev + ) + + { + Entity *ent; + + ent = ev->GetEntity( 1 ); + if ( ent ) + { + bind( ent ); + } + } + + +Vector Entity::getParentVector + ( + Vector vec + ) + + { + Vector pos; + + if ( !bindmaster ) + { + return vec; + } + + pos[ 0 ] = vec * bindmaster->orientation[ 0 ]; + pos[ 1 ] = vec * bindmaster->orientation[ 1 ]; + pos[ 2 ] = vec * bindmaster->orientation[ 2 ]; + + return pos; + } + +// +// Team methods +// + +void Entity::joinTeam + ( + Entity *teammember + ) + + { + Entity *ent; + Entity *master; + Entity *prev; + Entity *next; + + if ( teammaster && ( teammaster != this ) ) + { + quitTeam(); + } + + assert( teammember ); + if ( !teammember ) + { + warning( "joinTeam", "Null entity" ); + return; + } + + master = teammember->teammaster; + if ( !master ) + { + master = teammember; + teammember->teammaster = teammember; + teammember->teamchain = this; + + // make anyone who's bound to me part of the new team + for( ent = teamchain; ent != NULL; ent = ent->teamchain ) + { + ent->teammaster = master; + } + } + else + { + // skip past the chain members bound to the entity we're teaming up with + prev = teammember; + next = teammember->teamchain; + if ( bindmaster ) + { + // if we have a bindmaster, joing after any entities bound to the entity + // we're joining + while( next && (( Entity *)next)->isBoundTo( teammember ) ) + { + prev = next; + next = next->teamchain; + } + } + else + { + // if we're not bound to someone, then put us at the end of the team + while( next ) + { + prev = next; + next = next->teamchain; + } + } + + // make anyone who's bound to me part of the new team and + // also find the last member of my team + for( ent = this; ent->teamchain != NULL; ent = ent->teamchain ) + { + ent->teamchain->teammaster = master; + } + + prev->teamchain = this; + ent->teamchain = next; + } + + teammaster = master; + flags |= FL_TEAMSLAVE; + } + +void Entity::quitTeam + ( + void + ) + + { + Entity *ent; + + if ( !teammaster ) + { + return; + } + + if ( teammaster == this ) + { + if ( !teamchain->teamchain ) + { + teamchain->teammaster = NULL; + } + else + { + // make next teammate the teammaster + for( ent = teamchain; ent; ent = ent->teamchain ) + { + ent->teammaster = teamchain; + } + } + + teamchain->flags &= ~FL_TEAMSLAVE; + } + else + { + assert( flags & FL_TEAMSLAVE ); + assert( teammaster->teamchain ); + + ent = teammaster; + while( ent->teamchain != this ) + { + // this should never happen + assert( ent->teamchain ); + + ent = ent->teamchain; + } + + ent->teamchain = teamchain; + + if ( !teammaster->teamchain ) + { + teammaster->teammaster = NULL; + } + } + + teammaster = NULL; + teamchain = NULL; + flags &= ~FL_TEAMSLAVE; + } + +void Entity::EventQuitTeam + ( + Event *ev + ) + + { + quitTeam(); + } + + +void Entity::JoinTeam + ( + Event *ev + ) + + { + Entity *ent; + + ent = ev->GetEntity( 1 ); + if ( ent ) + { + joinTeam( ent ); + } + } + +void Entity::AddToSoundManager + ( + Event *ev + ) + + { + SoundMan.AddEntity( this ); + } + +inline qboolean Entity::HitSky + ( + trace_t *trace + ) + + { + assert( trace ); + if ( trace->surfaceFlags & SURF_SKY ) + { + return true; + } + return false; + } + +qboolean Entity::HitSky + ( + void + ) + + { + return HitSky( &level.impact_trace ); + } + +void Entity::SetAngleEvent + ( + Event *ev + ) + { + Vector movedir; + + movedir = G_GetMovedir( ev->GetFloat( 1 ) ); + setAngles( movedir.toAngles() ); + } + +void Entity::NoLerpThisFrame + ( + void + ) + { + edict->s.eFlags ^= EF_TELEPORT_BIT; + } + +void Entity::Postthink + ( + void + ) + + { + } + +void Entity::TouchTriggersEvent + ( + Event *ev + ) + { + flags |= FL_TOUCH_TRIGGERS; + } + +void Entity::DeathSinkStart + ( + Event *ev + ) + { + float time; + + // Stop the sink when we can't be seen anymore + + if ( maxs[2] >= 0 && maxs[2] < 200 ) + time = maxs[2] / 20; + else + time = 1; + + PostEvent( EV_Remove, time ); + + // Start the sinking + + ProcessEvent( EV_DeathSink ); + } + +void Entity::DeathSink + ( + Event *ev + ) + { + // Sink just a little + + origin[2] -= 1; + setOrigin( origin ); + + // Make sure the sink happens again next frame + + PostEvent( EV_DeathSink, FRAMETIME ); + } + +void Entity::LookAtMe + ( + Event *ev + ) + { + if ( ev->NumArgs() > 0 ) + look_at_me = ev->GetBoolean( 1 ); + else + look_at_me = true; + } + +void Entity::VelocityModified + ( + void + ) + { + } + +void Entity::DetachAllChildren + ( + Event *ev + ) + + { + int i; + + for (i=0;iPostEvent( EV_Remove, 0 ); + } + } + } diff --git a/source/source/fgame/entity.h b/source/source/fgame/entity.h new file mode 100644 index 0000000..ff78388 --- /dev/null +++ b/source/source/fgame/entity.h @@ -0,0 +1,1189 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/entity.h $ +// $Revision:: 59 $ +// $Author:: Markd $ +// $Date:: 7/25/00 8:00a $ +// +// Copyright (C) 1997 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/entity.h $ +// +// 59 7/25/00 8:00a Markd +// Added GLobal_FindRandomAlias to alias code +// +// 58 7/23/00 1:47p Aldie +// Added detach all children command +// +// 57 7/21/00 3:47p Steven +// Made showModel a virtual function. +// +// 56 7/11/00 8:55p Aldie +// Added in an autoaim flag +// +// 55 6/30/00 3:08p Markd +// fixed rise animation issues +// +// 54 6/26/00 5:50p Markd +// re-did some renderfx commands, fixed anti-sb juice stuff +// +// 53 6/23/00 8:41p Markd +// made a lot of changes to different constructors for saved game support +// +// 52 6/14/00 11:18a Markd +// cleaned up code using Intel compiler +// +// 51 6/09/00 6:55p Markd +// fixed camera being bound to other objects +// +// 50 5/31/00 5:34p Steven +// Added look at me stuff. +// +// 49 5/27/00 2:56p Markd +// Save games 2nd pass +// +// 48 5/26/00 7:44p Markd +// 2nd phase save games +// +// 47 5/24/00 3:14p Markd +// first phase of save/load games +// +// 46 5/05/00 2:18p Steven +// Made EV_RemoveAttachedModel visible to other classes. +// +// 45 4/15/00 5:43p Steven +// Made damage fractioanl again. +// +// 44 4/15/00 5:18p Aldie +// Added stun events and fixed yet another bug with Ammo and AutoPutaway +// +// 43 4/13/00 3:45p Aldie +// Added more flashbang support. Added damage_type to entities used to specify +// what type of damage they take. +// +// 42 4/11/00 5:43p Steven +// Sinking into ground work. +// +// 41 4/10/00 6:49p Steven +// Added bind_use_my_angles so that a bound entity could use its angles for +// its local offset or its bindmaster. +// +// 40 4/01/00 3:55p Markd +// Added FL_TOUCH_TRIGGERS support +// +// 39 4/01/00 3:45p Markd +// added FL_TOUCH_TRIGGERS flag and implementation +// +// 38 3/21/00 5:06p Markd +// added vehicle support +// +// 37 3/20/00 3:01p Markd +// added more functionality to falling rock +// +// 36 3/16/00 10:50a Markd +// Fixed some bad syntax in headers that exhibited itself in non-visualc +// compilers +// +// 35 3/15/00 5:52p Aldie +// Added pushsound to func_pushobject and removed a printf. +// +// 34 3/15/00 4:09p Aldie +// Fixed a bug with using weapons, and added some ability to force a state in +// the player +// +// 33 3/14/00 4:56p Aldie +// Added new script damage command +// +// 32 3/04/00 5:05p Steven +// Added a skipent to CanDamage. +// +// 31 3/04/00 11:48a Markd +// Added light style support +// +// 30 3/01/00 10:58a Jimdose +// added TriggerEvent +// +// 29 2/26/00 12:59p Jimdose +// externed EV_Kill +// +// 28 2/26/00 11:23a Steven +// Added partial immobile flag. +// +// 27 2/21/00 4:39p Markd +// Added fade command to entity +// +// 26 2/21/00 3:33p Steven +// Added a GetControllerAngles function. +// +// 25 1/31/00 3:56p Aldie +// working on the auto aim / tracking code +// +// 24 1/19/00 7:59p Markd +// Rewrote Surface Model Event and also added changeoutfit command to player +// +// 23 1/19/00 7:09p Steven +// Added a removeattachedmodel event. +// +// 22 1/15/00 3:57p Markd +// Eliminated multiple "angle" events and replaced them with EV_SetAngle +// +// 21 1/14/00 5:06p Markd +// Removed surface num, tri_num and damage_multiplier from multiple functions +// and events +// +// 20 1/13/00 7:08p Steven +// Made a SetControllerAngles event so I could post them in the future. +// +// 19 1/10/00 6:17p Jimdose +// more code cleanup +// +// 18 1/05/00 7:25p Jimdose +// made angle functions all use the same coordinate system +// AngleVectors now returns left instead of right +// no longer need to invert pitch +// +// 17 12/17/99 8:26p Jimdose +// got rid of unused vars and functions +// +// 16 12/17/99 6:35p Jimdose +// changed spawnarg code +// added Level class for spawning and map control +// got rid of unused or superflous variables +// changed setjmp/longjmp calls to try/throw/catch exception handling +// +// 15 12/14/18 2:43p Jimdose +// moved blood_model to Sentient +// +// 14 12/02/99 6:57p Jimdose +// removed classname variable from Entity +// +// 13 11/19/99 2:27p Steven +// Made sure all entity stuff would save correctly. +// +// 12 11/18/99 6:26p Steven +// Fixed some tag stuff because CurrentAnim and CurrentFrame had different +// paramters in Entity and Animate which made the virtual stuff not work +// properly. +// +// 11 11/12/99 6:52p Markd +// fixed up sound manager saving and loading +// +// 10 11/01/99 4:01p Jimdose +// added SetControllerAngles and SetControllerTag +// +// 9 10/28/99 6:08p Steven +// Added a use_angles flag and an offset to the entity attach stuff. +// +// 8 10/25/99 6:39p Markd +// removed size and other unused variables, added radius and centroid to both +// server and game code +// +// 7 10/21/99 10:58a Markd +// Added fadein +// +// 6 10/19/99 7:52p Markd +// Removed three part model system +// +// 5 10/01/99 2:42p Markd +// moved all the binding code back into Entity from Mover +// +// 4 9/29/99 7:43p Markd +// Made items behave better when dropping to floor +// +// 3 9/27/99 5:44p Markd +// began documentation and cleanup phase after merge +// +// 2 9/16/99 4:50p Jimdose +// removed unused code +// +// 1 9/10/99 10:53a Jimdose +// +// 1 9/08/99 3:15p Aldie +// +// 42 9/02/99 5:41p Markd +// made CacheResource utility functions changed code every where else +// +// 41 9/02/99 2:33p Markd +// Added cache ability to entities +// +// 40 9/01/99 8:21p Steven +// Fixed a typo. +// +// 39 9/01/99 12:03p Steven +// Added blood spurts. +// +// 38 8/31/99 2:46p Steven +// Added detach_at_death flag for attached models. +// +// 37 8/30/99 3:25p Steven +// Added an event to kill all of an entities attachments. +// +// 36 8/30/99 2:37p Steven +// Added support for volume and minimum distance for loop sounds. +// +// 35 8/28/99 11:46a Steven +// Removed global from sound function calls. +// +// 34 8/27/99 5:07p Steven +// Added anti Sucknblaugh juice powerup. +// +// 33 8/25/99 9:01p Markd +// working on RF_ stuff and local color for entities on client +// +// 32 8/17/99 4:59p Steven +// Added new immobile flag. +// +// 31 8/06/99 3:35p Markd +// Cleaned up cgame, added shader commands and shader manipulation support +// +// 30 7/30/99 6:45p Aldie +// Added explosion command +// +// 29 7/30/99 4:49p Steven +// Added a stationary command to entities and a gas explode flag. +// +// 28 7/06/99 8:33p Jimdose +// removed unused player code +// added state machine for player animation +// +// DESCRIPTION: +// Base class for all enities that are controlled by Sin. If you have any +// object that should be called on a periodic basis and it is not an entity, +// then you have to have an dummy entity that calls it. +// +// An entity in Sin is any object that is not part of the world. Any non-world +// object that is visible in Sin is an entity, although it is not required that +// all entities be visible to the player. Some objects are basically just virtual +// constructs that act as an instigator of certain actions, for example, some +// triggers are invisible and cannot be touched, but when activated by other +// objects can cause things to happen. +// +// All entities are capable of receiving messages from Sin or from other entities. +// Messages received by an entity may be ignored, passed on to their superclass, +// or acted upon by the entity itself. The programmer must decide on the proper +// action for the entity to take to any message. There will be many messages +// that are completely irrelevant to an entity and should be ignored. Some messages +// may require certain states to exist and if they are received by an entity when +// it these states don't exist may indicate a logic error on the part of the +// programmer or map designer and should be reported as warnings (if the problem is +// not severe enough for the game to be halted) or as errors (if the problem should +// not be ignored at any cost). +// + +#ifndef __ENTITY_H__ +#define __ENTITY_H__ + +#include "g_local.h" +#include "class.h" +#include "vector.h" +#include "script.h" +#include "listener.h" + + +// modification flags +#define FLAG_IGNORE 0 +#define FLAG_CLEAR 1 +#define FLAG_ADD 2 + +typedef enum + { + DAMAGE_NO, + DAMAGE_YES, // will take damage if hit + DAMAGE_AIM // auto targeting recognizes this + } damage_t; + +typedef enum + { + legs, + torso, + all + } bodypart_t; + +//deadflag +#define DEAD_NO 0 +#define DEAD_DYING 1 +#define DEAD_DEAD 2 +#define DEAD_RESPAWNABLE 3 + +// flags +#define FL_FLY (1<<0) +#define FL_SWIM (1<<1) // implied immunity to drowining +#define FL_INWATER (1<<2) +#define FL_GODMODE (1<<3) +#define FL_NOTARGET (1<<4) +#define FL_PARTIALGROUND (1<<5) // not all corners are valid +#define FL_TEAMSLAVE (1<<6) // not the first on the team +#define FL_NO_KNOCKBACK (1<<7) +#define FL_THINK (1<<8) +#define FL_BLOOD (1<<9) // when hit, it should bleed. +#define FL_DIE_GIBS (1<<10) // when it dies, it should gib +#define FL_DIE_EXPLODE (1<<11) // when it dies, it will explode +#define FL_ROTATEDBOUNDS (1<<12) // model uses rotated mins and maxs +#define FL_DONTSAVE (1<<13) // don't add to the savegame +#define FL_IMMOBILE (1<<14) // entity has been immobolized somehow +#define FL_PARTIAL_IMMOBILE (1<<15) // entity has been immobolized somehow +#define FL_POSTTHINK (1<<17) // call a think function after the physics have been run +#define FL_TOUCH_TRIGGERS (1<<18) // should this entity touch triggers +#define FL_AUTOAIM (1<<19) // Autoaim on this entity + + +// damage flags +#define DAMAGE_RADIUS 0x00000001 // damage was indirect +#define DAMAGE_NO_ARMOR 0x00000002 // armour does not protect from this damage +#define DAMAGE_ENERGY 0x00000004 // damage is from an energy based weapon +#define DAMAGE_NO_KNOCKBACK 0x00000008 // do not affect velocity, just view angles +#define DAMAGE_BULLET 0x00000010 // damage is from a bullet (used for ricochets) +#define DAMAGE_NO_PROTECTION 0x00000020 // armor, shields, invulnerability, and godmode have no effect +#define DAMAGE_NO_SKILL 0x00000040 // damage is not affected by skill level + +extern Event EV_ClientMove; +extern Event EV_ClientEndFrame; + +// Generic entity events +extern Event EV_Classname; +extern Event EV_Activate; +extern Event EV_Use; +extern Event EV_FadeNoRemove; +extern Event EV_FadeOut; +extern Event EV_FadeIn; +extern Event EV_Fade; +extern Event EV_Killed; +extern Event EV_GotKill; +extern Event EV_Pain; +extern Event EV_Damage; +extern Event EV_Stun; +extern Event EV_Gib; +extern Event EV_Kill; +extern Event EV_DeathSinkStart; + +// Physics events +extern Event EV_MoveDone; +extern Event EV_Touch; +extern Event EV_Blocked; +extern Event EV_Attach; +extern Event EV_AttachModel; +extern Event EV_RemoveAttachedModel; +extern Event EV_Detach; +extern Event EV_UseBoundingBox; + +// Animation events +extern Event EV_NewAnim; +extern Event EV_LastFrame; +extern Event EV_TakeDamage; +extern Event EV_NoDamage; + +// script stuff +extern Event EV_Model; +extern Event EV_Hide; +extern Event EV_Show; +extern Event EV_BecomeSolid; +extern Event EV_BecomeNonSolid; +extern Event EV_Sound; +extern Event EV_StopSound; +extern Event EV_Bind; +extern Event EV_Unbind; +extern Event EV_JoinTeam; +extern Event EV_QuitTeam; +extern Event EV_SetHealth; +extern Event EV_SetSize; +extern Event EV_SetAlpha; +extern Event EV_SetOrigin; +extern Event EV_SetTargetName; +extern Event EV_SetTarget; +extern Event EV_SetKillTarget; +extern Event EV_SetAngles; +extern Event EV_SetAngle; +extern Event EV_RegisterAlias; +extern Event EV_Anim; +extern Event EV_StartAnimating; +extern Event EV_SurfaceModelEvent; +extern Event EV_ProcessInitCommands; +extern Event EV_Stop; +extern Event EV_StopLoopSound; +extern Event EV_SetControllerAngles; + +// dir is 1 +// power is 2 +// minsize is 3 +// maxsize is 4 +// percentage is 5 +// thickness 6 +// entity is 7 +// origin 8 + +// AI sound events +extern Event EV_BroadcastSound; +extern Event EV_HeardSound; +extern Event EV_Hurt; +extern Event EV_IfSkill; + + +// Define ScriptMaster +class ScriptMaster; + +// +// Spawn args +// +// "spawnflags" +// "alpha" default 1.0 +// "model" +// "origin" +// "targetname" +// "target" +// +#define MAX_MODEL_CHILDREN 8 + +class Entity; + +typedef SafePtr EntityPtr; + +class Entity : public Listener + { + public: + CLASS_PROTOTYPE( Entity ); + + // spawning variables + int entnum; + gentity_t *edict; + gclient_t *client; + int spawnflags; + + // standard variables + str model; + + // physics variables + float move_time; // how much time total_delta will take + Vector total_delta; // total unprocessed movement + Vector mins; + Vector maxs; + Vector absmin; + Vector absmax; + Vector centroid; + Vector velocity; + Vector avelocity; + Vector origin; + Vector angles; + Vector size; + int movetype; + int mass; + float gravity; // per entity gravity multiplier (1.0 is normal) + float orientation[3][3]; + + gentity_t *groundentity; + cplane_t groundplane; + int groundcontents; + + // Model Binding variables + int numchildren; + int children[MAX_MODEL_CHILDREN]; + + // Surface variables + int numsurfaces; + + // Light variables + float lightRadius; + + // Team variables + str moveteam; + Entity *teamchain; + Entity *teammaster; + + // Binding variables + Entity *bindmaster; + qboolean bind_use_my_angles; + Vector localorigin; + Vector localangles; + + // targeting variables + str target; + str targetname; + str killtarget; + + // Character state + float health; + float max_health; + int deadflag; + int flags; + + // underwater variables + int watertype; + int waterlevel; + + // Pain and damage variables + damage_t takedamage; + EntityPtr enemy; + float pain_finished; + float damage_debounce_time; + int damage_type; + + qboolean detach_at_death; + + qboolean look_at_me; + + Entity(); + virtual ~Entity(); + + void SetEntNum( int num ); + void ClassnameEvent( Event *ev ); + void SpawnFlagsEvent( Event *ev ); + + qboolean DistanceTo( Vector pos ); + qboolean DistanceTo( Entity *ent ); + qboolean WithinDistance( Vector pos, float dist ); + qboolean WithinDistance( Entity *ent, float dist ); + + const char *Target( void ); + void SetTarget( const char *target ); + qboolean Targeted( void ); + const char *TargetName( void ); + void SetTargetName( const char *target ); + void SetKillTarget( const char *killtarget ); + const char *KillTarget( void ); + + virtual void setModel( const char *model ); + void setModel( str &mdl ); + void SetModelEvent( Event *ev ); + void SetTeamEvent( Event *ev ); + virtual void TriggerEvent( Event *ev ); + void hideModel( void ); + void EventHideModel( Event *ev ); + virtual void showModel( void ); + void EventShowModel( Event *ev ); + qboolean hidden( void ); + void ProcessInitCommandsEvent( Event *ev ); + void ProcessInitCommands( int index, qboolean cache = qfalse ); + + void setAlpha( float alpha ); + float alpha( void ); + + void setMoveType( int type ); + int getMoveType( void ); + + void setSolidType( solid_t type ); + int getSolidType( void ); + + virtual Vector getParentVector( Vector vec ); + Vector getLocalVector( Vector vec ); + + virtual void setSize( Vector min, Vector max ); + virtual void setOrigin( Vector org ); + virtual void setOrigin( void ); + virtual void addOrigin( Vector org ); + + void GetRawTag( int tagnum, orientation_t * orient ); + qboolean GetRawTag( const char * tagname, orientation_t * orient ); + + void GetTag( int tagnum, orientation_t * orient ); + qboolean GetTag( const char *name, orientation_t * orient ); + void GetTag( int tagnum, Vector *pos, Vector *forward = NULL, Vector *left = NULL, Vector *up = NULL ); + qboolean GetTag( const char *name, Vector *pos, Vector *forward = NULL, Vector *left = NULL, Vector *up = NULL ); + + virtual int CurrentFrame( bodypart_t part = legs ); + virtual int CurrentAnim( bodypart_t part = legs ); + + virtual void setAngles( Vector ang ); + virtual void setAngles( void ); + void SetOrigin( Event *ev ); + + Vector GetControllerAngles( int num ); + void SetControllerAngles( int num, vec3_t angles ); + void SetControllerAngles( Event *ev ); + void SetControllerTag( int num, int tag_num ); + + void link( void ); + void unlink( void ); + + void setContents( int type ); + int getContents( void ); + void setScale( float scale ); + + qboolean droptofloor( float maxfall ); + qboolean isClient( void ); + + virtual void SetDeltaAngles( void ); + virtual void DamageEvent( Event *event ); + void Damage( Entity *inflictor, + Entity *attacker, + float damage, + Vector position, + Vector direction, + Vector normal, + int knockback, + int flags, + int meansofdeath ); + void Stun( float time ); + + void DamageType( Event *ev ); + virtual qboolean CanDamage( Entity *target, Entity *skip_ent = NULL ); + + qboolean IsTouching( Entity *e1 ); + + void FadeNoRemove( Event *ev ); + void FadeOut( Event *ev ); + void FadeIn( Event *ev ); + void Fade( Event *ev ); + + virtual void CheckGround( void ); + virtual qboolean HitSky( trace_t *trace ); + virtual qboolean HitSky( void ); + + void BecomeSolid( Event *ev ); + void BecomeNonSolid( Event *ev ); + void SetHealth( Event *ev ); + void SetSize( Event *ev ); + void SetMins( Event *ev ); + void SetMaxs( Event *ev ); + void SetScale( Event *ev ); + void SetAlpha( Event *ev ); + void SetTargetName( Event *ev ); + void SetTarget( Event *ev ); + void SetKillTarget( Event *ev ); + void SetAngles( Event *ev ); + void SetAngleEvent( Event *ev ); + void TouchTriggersEvent( Event *ev ); + + str GetRandomAlias( str name ); + void SetWaterType( void ); + + // model binding functions + qboolean attach( int parent_entity_num, int tag_num, qboolean use_angles = qtrue, Vector attach_offset = "0 0 0"); + void detach( void ); + + void RegisterAlias( Event *ev ); + void RegisterAliasAndCache( Event *ev ); + void Cache( Event *ev ); + + qboolean GlobalAliasExists( const char *name ); + qboolean AliasExists( const char *name ); + + void Sound( Event *ev ); + virtual void Sound( str sound_name, int channel = CHAN_BODY, float volume = -1.0, + float min_dist = -1.0, Vector *origin = NULL ); + void StopSound( int channel ); + void StopSound( Event *ev ); + void LoopSound( Event *ev ); + void LoopSound( str sound_name, float volume = -1.0, float min_dist = -1.0 ); + void StopLoopSound( Event *ev ); + void StopLoopSound( void ); + + void SetLight(Event *ev); + void LightOn(Event *ev); + void LightOff(Event *ev); + void LightRed(Event *ev); + void LightGreen(Event *ev); + void LightBlue(Event *ev); + void LightRadius(Event *ev); + void LightStyle(Event *ev); + void Flags( Event *ev ); + void Effects( Event *ev ); + void RenderEffects( Event *ev ); + void SVFlags( Event *ev ); + + void BroadcastSound( float pos = SOUND_RADIUS ); + void BroadcastSound( Event *ev ); + void Kill( Event *ev ); + void SurfaceModelEvent( Event *ev ); + void SurfaceCommand( const char * surf_name, const char * token ); + + virtual void Postthink( void ); + virtual void Think( void ); + void DamageSkin( trace_t * trace, float damage ); + + void AttachEvent( Event *ev ); + void AttachModelEvent( Event *ev ); + void RemoveAttachedModelEvent( Event *ev ); + void DetachEvent( Event *ev ); + void TakeDamageEvent( Event *ev ); + void NoDamageEvent( Event *ev ); + void Gravity( Event *ev ); + void GiveOxygen( float time ); + void UseBoundingBoxEvent( Event *ev ); + void HurtEvent( Event *ev ); + void IfSkillEvent( Event *ev ); + void SetMassEvent( Event *ev ); + void Censor( Event *ev ); + void Ghost( Event *ev ); + + void StationaryEvent( Event *ev ); + void Explosion( Event *ev ); + + void Shader( Event *ev ); + + void KillAttach( Event *ev ); + void SetBloodModel( Event *ev ); + + void DropToFloorEvent( Event *ev ); + + // Binding methods + void joinTeam( Entity *teammember ); + void quitTeam( void ); + qboolean isBoundTo( Entity *master ); + virtual void bind( Entity *master, qboolean use_my_angles=false ); + virtual void unbind( void ); + + void JoinTeam( Event *ev ); + void EventQuitTeam( Event *ev ); + void BindEvent( Event *ev ); + void EventUnbind( Event *ev ); + void AddToSoundManager( Event *ev ); + void NoLerpThisFrame( void ); + + virtual void addAngles( Vector add ); + + void DeathSinkStart( Event *ev ); + void DeathSink( Event *ev ); + + void LookAtMe( Event *ev ); + void DetachAllChildren( Event *ev ); + + virtual void VelocityModified( void ); + virtual void Archive( Archiver &arc ); + }; + +inline int Entity::getSolidType + ( + void + ) + + { + return edict->solid; + } + + +inline qboolean Entity::DistanceTo + ( + Vector pos + ) + + { + Vector delta; + + delta = origin - pos; + return delta.length(); + } + +inline qboolean Entity::DistanceTo + ( + Entity *ent + ) + + { + Vector delta; + + assert( ent ); + + if ( !ent ) + { + // "Infinite" distance + return 999999; + } + + delta = origin - ent->origin; + return delta.length(); + } + +inline qboolean Entity::WithinDistance + ( + Vector pos, + float dist + ) + + { + Vector delta; + + delta = origin - pos; + + // check squared distance + return ( ( delta * delta ) < ( dist * dist ) ); + } + +inline qboolean Entity::WithinDistance + ( + Entity *ent, + float dist + ) + + { + Vector delta; + + assert( ent ); + + if ( !ent ) + { + return false; + } + + delta = origin - ent->origin; + + // check squared distance + return ( ( delta * delta ) < ( dist * dist ) ); + } + +inline const char *Entity::Target + ( + void + ) + + { + return target.c_str(); + } + +inline qboolean Entity::Targeted + ( + void + ) + + { + if ( !targetname.length() ) + { + return false; + } + return true; + } + +inline const char *Entity::TargetName + ( + void + ) + + { + return targetname.c_str(); + } + +inline const char * Entity::KillTarget + ( + void + ) + + { + return killtarget.c_str(); + } + +inline qboolean Entity::hidden + ( + void + ) + + { + if ( edict->s.renderfx & RF_DONTDRAW ) + { + return true; + } + return false; + } + +inline void Entity::setModel + ( + str &mdl + ) + + { + setModel( mdl.c_str() ); + } + +inline void Entity::SetModelEvent + ( + Event *ev + ) + + { + setModel( ev->GetString( 1 ) ); + } + +inline void Entity::hideModel + ( + void + ) + + { + edict->s.renderfx |= RF_DONTDRAW; + if ( getSolidType() <= SOLID_TRIGGER ) + { + edict->svflags |= SVF_NOCLIENT; + } + } + +inline void Entity::showModel + ( + void + ) + + { + edict->s.renderfx &= ~RF_DONTDRAW; + edict->svflags &= ~SVF_NOCLIENT; + } + +inline float Entity::alpha + ( + void + ) + + { + return edict->s.alpha; + } + +inline void Entity::setMoveType + ( + int type + ) + + { + movetype = type; + } + +inline int Entity::getMoveType + ( + void + ) + + { + return movetype; + } + +inline void Entity::unlink + ( + void + ) + + { + gi.unlinkentity( edict ); + } + +inline void Entity::setContents + ( + int type + ) + + { + edict->contents = type; + } + +inline int Entity::getContents + ( + void + ) + + { + return edict->contents; + } + +inline qboolean Entity::isClient + ( + void + ) + + { + if ( client ) + { + return true; + } + return false; + } + +inline void Entity::SetDeltaAngles + ( + void + ) + + { + int i; + + if ( client ) + { + for( i = 0; i < 3; i++ ) + { + client->ps.delta_angles[ i ] = ANGLE2SHORT( client->ps.viewangles[ i ] ); + } + } + } + +inline qboolean Entity::GlobalAliasExists + ( + const char *name + ) + + { + assert( name ); + + return ( gi.GlobalAlias_FindRandom( name ) != NULL ); + } + +inline qboolean Entity::AliasExists + ( + const char *name + ) + + { + assert( name ); + + return ( gi.Alias_FindRandom( edict->s.modelindex, name ) != NULL ); + } + +inline str Entity::GetRandomAlias + ( + str name + ) + + { + str realname; + const char *s; + + s = gi.Alias_FindRandom( edict->s.modelindex, name.c_str() ); + if ( s ) + { + realname = s; + } + else + { + s = gi.GlobalAlias_FindRandom( name.c_str() ); + if ( s ) + { + realname = s; + } + } + + return realname; + } + +inline int Entity::CurrentFrame + ( + bodypart_t part + ) + + { + part = part; + return 0; + } + +inline int Entity::CurrentAnim + ( + bodypart_t part + ) + + { + part = part; + return 0; + } + +inline void Entity::Archive + ( + Archiver &arc + ) + + { + int tempInt; + + Listener::Archive( arc ); + + G_ArchiveEdict( arc, edict ); + + arc.ArchiveInteger( &spawnflags ); + + arc.ArchiveString( &model ); + if ( arc.Loading() && model.length() ) + { + setModel( model ); + } + + arc.ArchiveFloat( &move_time ); + arc.ArchiveVector( &total_delta ); + arc.ArchiveVector( &mins ); + arc.ArchiveVector( &maxs ); + arc.ArchiveVector( &absmin ); + arc.ArchiveVector( &absmax ); + arc.ArchiveVector( ¢roid ); + arc.ArchiveVector( &velocity ); + arc.ArchiveVector( &avelocity ); + arc.ArchiveVector( &origin ); + arc.ArchiveVector( &angles ); + arc.ArchiveVector( &size ); + arc.ArchiveInteger( &movetype ); + arc.ArchiveInteger( &mass ); + arc.ArchiveFloat( &gravity ); + arc.ArchiveRaw( orientation, sizeof( orientation ) ); + + if ( arc.Saving() ) + { + if ( groundentity ) + { + tempInt = groundentity - g_entities; + } + else + { + tempInt = -1; + } + } + + arc.ArchiveInteger( &tempInt ); + + if ( arc.Loading() ) + { + if ( tempInt == -1 ) + { + groundentity = NULL; + } + else + { + groundentity = &g_entities[ tempInt ]; + } + } + + arc.ArchiveRaw( &groundplane, sizeof( groundplane ) ); + arc.ArchiveInteger( &groundcontents ); + + arc.ArchiveInteger( &numchildren ); + arc.ArchiveRaw( children, sizeof( children ) ); + + arc.ArchiveInteger( &numsurfaces ); + + arc.ArchiveFloat( &lightRadius ); + + arc.ArchiveString( &moveteam ); + arc.ArchiveObjectPointer( ( Class ** )&teamchain ); + arc.ArchiveObjectPointer( ( Class ** )&teammaster ); + + arc.ArchiveObjectPointer( ( Class ** )&bindmaster ); + arc.ArchiveBoolean( &bind_use_my_angles ); + arc.ArchiveVector( &localorigin ); + arc.ArchiveVector( &localangles ); + + arc.ArchiveString( &target ); + arc.ArchiveString( &targetname ); + // add to target list to rebuild targetlists + arc.ArchiveString( &killtarget ); + + if ( arc.Loading() ) + { + // reset target stuff + SetTargetName( targetname.c_str() ); + SetTarget( target.c_str() ); + } + + arc.ArchiveFloat( &health ); + arc.ArchiveFloat( &max_health ); + arc.ArchiveInteger( &deadflag ); + arc.ArchiveInteger( &flags ); + + arc.ArchiveInteger( &watertype ); + arc.ArchiveInteger( &waterlevel ); + + ArchiveEnum( takedamage, damage_t ); + + arc.ArchiveSafePointer( &enemy ); + arc.ArchiveFloat( &pain_finished ); + arc.ArchiveFloat( &damage_debounce_time ); + arc.ArchiveInteger( &damage_type ); + + arc.ArchiveBoolean( &detach_at_death ); + + arc.ArchiveBoolean( &look_at_me ); + } + +#include "worldspawn.h" + +#endif + diff --git a/source/source/fgame/events.h b/source/source/fgame/events.h new file mode 100644 index 0000000..658928a --- /dev/null +++ b/source/source/fgame/events.h @@ -0,0 +1,70 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/events.h $ +// $Revision:: 1 $ +// $Author:: Jimdose $ +// $Date:: 9/10/99 10:53a $ +// +// Copyright (C) 1997 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/events.h $ +// +// 1 9/10/99 10:53a Jimdose +// +// 1 9/08/99 3:15p Aldie +// +// DESCRIPTION: +// Event definitions for communication between Sin and DLL's +// + +#ifndef __EVENTS_H__ +#define __EVENTS_H__ + +#if 1 +typedef int event_t; + +enum + { + EVENT_DEFAULT_MINEVENT = 1, + + // Player events + EVENT_CLIENTCONNECT = EVENT_DEFAULT_MINEVENT, + EVENT_CLIENTDISCONNECT, + EVENT_CLIENTKILL, + EVENT_CLIENTMOVE, + EVENT_CLIENTENDFRAME, + EVENT_SETNEWPARMS, + EVENT_SETCHANGEPARMS, + EVENT_PRETHINK, + EVENT_POSTTHINK, + + // Generic entity events + EVENT_SPAWN, + EVENT_REMOVE, + EVENT_PRECACHE, + EVENT_THINK, + EVENT_ACTIVATE, + EVENT_USE, + EVENT_FOOTSTEP, + + // Physics events + EVENT_MOVEDONE, + EVENT_TOUCH, + EVENT_BLOCKED, + + // Animation events + EVENT_ANIM_FRAME, + EVENT_ANIM_NEWANIM, + EVENT_ANIM_LASTFRAME, + + // For subclass events + EVENT_DEFAULT_MAXEVENT + }; + +#endif + +#endif /* events.h */ diff --git a/source/source/fgame/explosion.cpp b/source/source/fgame/explosion.cpp new file mode 100644 index 0000000..f0eeceb --- /dev/null +++ b/source/source/fgame/explosion.cpp @@ -0,0 +1,768 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/explosion.cpp $ +// $Revision:: 24 $ +// $Author:: Steven $ +// $Date:: 7/22/00 5:53p $ +// +// Copyright (C) 1997 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/explosion.cpp $ +// +// 24 7/22/00 5:53p Steven +// Made it so a remove event is only posted if explosions have a life set. +// +// 23 7/16/00 2:10p Markd +// fixed multi use func_explodeobjects +// +// 22 7/16/00 12:44p Markd +// fixed multi-use func_explodeobjects +// +// 21 7/06/00 3:26p Markd +// added rock to func_explodeobject +// +// 20 6/27/00 5:46p Steven +// Added some CacheResource calls to make sure explosions are cached correctly. +// +// 19 6/23/00 8:41p Markd +// made a lot of changes to different constructors for saved game support +// +// 18 6/14/00 3:50p Markd +// Cleaned up more Intel Compiler warnings +// +// 17 5/27/00 3:32p Markd +// 2nd pass save games +// +// 16 4/21/00 3:01p Markd +// fixed up explode_object explosions +// +// 15 4/18/00 5:57p Markd +// fixed multi arg support for debris models +// +// 14 4/18/00 4:20p Markd +// added random scale ability to func_explodeobject and func_multiexploder +// +// 13 4/18/00 4:01p Markd +// fixed up explosions +// +// 12 2/07/00 4:21p Markd +// Added "thread" to quaked sections for better documentation +// +// 11 2/03/00 9:33a Markd +// added VISIBLE flag to func_multi_exploder and func_explodeobject +// +// 10 2/02/00 7:18p Markd +// fixed some commented out code +// +// 9 2/02/00 7:14p Markd +// Added func_explodeobject and TossObject +// +// 8 2/01/00 5:41p Markd +// Made Multi-Exploder multi-use +// +// 7 1/12/00 6:16p Jimdose +// rewrote CreateExplosion +// +// 6 1/06/00 11:08p Jimdose +// cleaning up unused code +// +// 5 11/12/99 11:47a Markd +// Added sound manager support and retro-fitted TriggerSpeaker and TriggerMusic +// to work with everything +// +// 4 11/01/99 6:11p Steven +// Changed some old attenuation stuff to min dist stuff. +// +// 3 9/29/99 5:18p Steven +// Event formatting. +// +// 2 9/16/99 11:18a Markd +// Continuing merge of code, not functional yet but closer +// +// 1 9/10/99 10:53a Jimdose +// +// 1 9/08/99 3:15p Aldie +// +// 20 8/28/99 11:44a Steven +// Removed global from sound function calls. +// +// 19 8/18/99 3:28p Jimdose +// added cylindrical collision detection +// +// 18 8/03/99 3:37p Aldie +// Removed some old explosion stuff +// +// 17 7/30/99 6:24p Aldie +// Updated weapons and utils to use new methods +// +// 16 7/30/99 3:00p Steven +// New temporary stuff for gas explosions. +// +// 15 6/11/99 1:23p Phook +// +// 14 6/11/99 12:58p Phook +// Changed from SINED comments to QUAKED +// +// 13 6/11/99 12:46p Phook +// EClass color changes +// +// DESCRIPTION: +// Standard explosion object that is spawned by other entites and not map designers. +// Explosion is used by many of the weapons for the blast effect, but is also used +// by the Exploder and MultiExploder triggers. These triggers create one or more +// explosions each time they are activated. +// + +#include "g_local.h" +#include "entity.h" +#include "trigger.h" +#include "explosion.h" +#include "weaputils.h" + +#define MULTI_USE (1<<0) +#define RANDOM_TIME (1<<1) +#define VISIBLE (1<<2) +#define RANDOM_SCALE (1<<3) +#define NO_EXPLOSIONS (1<<4) + +Event EV_Exploder_SetDmg + ( + "dmg", + EV_DEFAULT, + "i", + "damage", + "Sets the damage the explosion does." + ); +Event EV_Exploder_SetDuration + ( + "duration", + EV_DEFAULT, + "f", + "duration", + "Sets the duration of the explosion." + ); +Event EV_Exploder_SetWait + ( + "wait", + EV_DEFAULT, + "f", + "explodewait", + "Sets the wait time of the explosion." + ); +Event EV_Exploder_SetRandom + ( + "random", + EV_DEFAULT, + "f", + "randomness", + "Sets the randomness value of the explosion." + ); + +void CreateExplosion + ( + Vector pos, + float damage, + Entity *inflictor, + Entity *attacker, + Entity *ignore, + const char *explosionModel, + float scale + ) + + { + Explosion *explosion; + Event *ev; + + assert( inflictor ); + + if ( !inflictor ) + { + return; + } + + if ( !attacker ) + { + attacker = world; + } + + if ( !explosionModel ) + { + explosionModel = "fx_explosion.tik"; + } + + explosion = new Explosion; + + // Create a new explosion entity and set it off + explosion->setModel( explosionModel ); + + explosion->setSolidType( SOLID_NOT ); + explosion->CancelEventsOfType( EV_ProcessInitCommands ); + explosion->ProcessInitCommands( explosion->edict->s.modelindex ); + + explosion->owner = attacker->entnum; + explosion->edict->ownerNum = attacker->entnum; + explosion->setMoveType( MOVETYPE_FLYMISSILE ); + explosion->edict->clipmask = MASK_PROJECTILE; + explosion->setSize( explosion->mins, explosion->maxs ); + explosion->setOrigin( pos ); + explosion->origin.copyTo( explosion->edict->s.origin2 ); + + if ( explosion->dlight_radius ) + { + G_SetConstantLight( &explosion->edict->s.constantLight, + &explosion->dlight_color[0], + &explosion->dlight_color[1], + &explosion->dlight_color[2], + &explosion->dlight_radius + ); + } + + explosion->BroadcastSound(); + + explosion->RandomAnimate( "idle", EV_StopAnimating ); + RadiusDamage( inflictor, attacker, damage, ignore, MOD_EXPLOSION ); + + if ( explosion->life ) + { + ev = new Event( EV_Remove ); + explosion->PostEvent( ev, explosion->life ); + } + } + + +/*****************************************************************************/ +/*QUAKED func_exploder (0 0.25 0.5) (0 0 0) (8 8 8) + + Spawns an explosion when triggered. Triggers any targets. + + "dmg" specifies how much damage to cause. Default indicates 120. + "key" The item needed to activate this. (default nothing) + "thread" name of thread to trigger. This can be in a different script file as well\ +by using the '::' notation. +******************************************************************************/ + +CLASS_DECLARATION( Trigger, Exploder, "func_exploder" ) + { + { &EV_Touch, NULL }, + { &EV_Trigger_Effect, MakeExplosion }, + { &EV_Exploder_SetDmg, SetDmg }, + { NULL, NULL } + }; + +void Exploder::MakeExplosion + ( + Event *ev + ) + + { + CreateExplosion + ( + origin, + damage, + this, + ev->GetEntity( 1 ), + this + ); + } + +Exploder::Exploder() + { + damage = 120; + respondto = TRIGGER_PLAYERS | TRIGGER_MONSTERS | TRIGGER_PROJECTILES; + } + +void Exploder::SetDmg + ( + Event *ev + ) + + { + damage = ev->GetInteger( 1 ); + if ( damage < 0 ) + { + damage = 0; + } + } + +/*****************************************************************************/ +/*QUAKED func_multi_exploder (0 0.25 0.5) ? MULTI_USE RANDOM_TIME VISIBLE RANDOM_SCALE + + Spawns an explosion when triggered. Triggers any targets. + size of brush determines where explosions will occur. + + "dmg" specifies how much damage to cause from each explosion. (Default 120) + "delay" delay before exploding (Default 0 seconds) + "duration" how long to explode for (Default 1 second) + "wait" time between each explosion (default 0.25 seconds) + "random" random factor (default 0.25) + "key" The item needed to activate this. (default nothing) + "thread" name of thread to trigger. This can be in a different script file as well\ +by using the '::' notation. + "health" makes the object damageable + "scale" set the maximum size for spawned debris and explosions. + + MULTI_USE allows the func_multi_exploder to be used more than once + RANDOM_TIME adjusts the wait between each explosion by the random factor + VISIBLE allows you to make the trigger visible + RANDOM_SCALE scale explosions randomly. size will be between 0.25 and 1 times scale + +******************************************************************************/ + +CLASS_DECLARATION( Trigger, MultiExploder, "func_multi_exploder" ) + { + { &EV_Touch, NULL }, + { &EV_Trigger_Effect, MakeExplosion }, + { &EV_Exploder_SetDmg, SetDmg }, + { &EV_Exploder_SetDuration, SetDuration }, + { &EV_Exploder_SetWait, SetWait }, + { &EV_Exploder_SetRandom, SetRandom }, + { NULL, NULL } + }; + +void MultiExploder::MakeExplosion + ( + Event *ev + ) + + { + Vector pos; + float t, scale; + Entity *other; + Event *event; + + other = ev->GetEntity( 1 ); + + // make sure other is valid + if ( !other ) + { + other = world; + } + + // prevent the trigger from triggering again + trigger_time = -1; + + if ( !explode_time ) + { + hideModel(); + explode_time = level.time + duration; + } + + if ( spawnflags & RANDOM_TIME ) + { + t = explodewait * ( 1 + G_CRandom( randomness ) ); + } + else + { + t = explodewait; + } + + event = new Event( EV_Trigger_Effect ); + event->AddEntity( other ); + PostEvent( event, t ); + + if ( level.time > explode_time ) + { + if ( spawnflags & MULTI_USE ) + { + // + // reset the trigger in a half second + // + trigger_time = level.time + 0.5f; + explode_time = 0; + CancelEventsOfType( EV_Trigger_Effect ); + // + // reset health if necessary + // + health = max_health; + return; + } + else + { + PostEvent( EV_Remove, 0 ); + return; + } + } + + pos[ 0 ] = absmin[ 0 ] + G_Random( absmax[ 0 ] - absmin[ 0 ] ); + pos[ 1 ] = absmin[ 1 ] + G_Random( absmax[ 1 ] - absmin[ 1 ] ); + pos[ 2 ] = absmin[ 2 ] + G_Random( absmax[ 2 ] - absmin[ 2 ] ); + + if ( spawnflags & RANDOM_SCALE ) + { + scale = edict->s.scale * 0.25f; + scale += G_Random( 3 * scale ); + } + else + { + scale = 1.0f; + } + + CreateExplosion + ( + pos, + damage, + this, + other, + this, + NULL, + scale + ); + } + +MultiExploder::MultiExploder() + { + if ( LoadingSavegame ) + { + return; + } + + damage = 120; + duration = 1.0; + explodewait = 0.25; + randomness = 0.25; + explode_time = 0; + + if ( spawnflags & VISIBLE ) + { + PostEvent( EV_Show, EV_POSTSPAWN ); + } + else + { + PostEvent( EV_Hide, EV_POSTSPAWN ); + } + + // So that we don't get deleted after we're triggered + count = -1; + + respondto = TRIGGER_PLAYERS | TRIGGER_MONSTERS | TRIGGER_PROJECTILES; + } + +void MultiExploder::SetDmg + ( + Event *ev + ) + + { + damage = ev->GetInteger( 1 ); + if ( damage < 0 ) + { + damage = 0; + } + } + +void MultiExploder::SetDuration + ( + Event *ev + ) + + { + duration = ev->GetFloat( 1 ); + } + +void MultiExploder::SetWait + ( + Event *ev + ) + + { + explodewait = ev->GetFloat( 1 ); + } + +void MultiExploder::SetRandom + ( + Event *ev + ) + + { + randomness = ev->GetFloat( 1 ); + } + + +#define METAL_DEBRIS (1<<5) +#define ROCK_DEBRIS (1<<6) +#define NOTSOLID (1<<7) + +/*****************************************************************************/ +/*QUAKED func_explodeobject (0 0.25 0.5) ? MULTI_USE RANDOM_TIME VISIBLE RANDOM_SCALE NO_EXPLOSIONS METAL_DEBRIS ROCK_DEBRIS NOTSOLID + + Spawns different kinds of debris when triggered. Triggers any targets. + size of brush determines where explosions and debris will be spawned. + + "dmg" specifies how much damage to cause from each explosion. (Default 120) + "delay" delay before exploding (Default 0 seconds) + "duration" how long to explode for (Default 1 second) + "wait" time between each explosion (default 0.25 seconds) + "random" random factor (default 0.25) + "health" if specified, object must be damaged to trigger + "key" The item needed to activate this. (default nothing) + "severity" how violent the debris should be ejected from the object( default 1.0 ) + "debrismodel" What kind of debris to spawn (default nothing) + "amount" how much debris to spawn for each explosion (default 4) + "thread" name of thread to trigger. This can be in a different script file as well\ +by using the '::' notation. + "health" makes the object damageable + "scale" set the maximum size for spawned debris and explosions + + MULTI_USE allows the func_explodeobject to be used more than once + RANDOM_TIME adjusts the wait between each explosion by the random factor + VISIBLE allows you to make the trigger visible + RANDOM_SCALE scale explosions and debris randomly. size will be between 0.25 and 1 times scale + NO_EXPLOSIONS, if checked no explosions will be created + METAL_DEBRIS automatically spawn metal debris, no need for debrismodel to be set + ROCK_DEBRIS automatically spawn rock debris, no need for debrismodel to be set + NOTSOLID debris is not solid + + other valid tiki files include: + + obj_debris_glass1-4.tik + obj_debris_wood1-4.tik + +******************************************************************************/ + +Event EV_ExplodeObject_SetSeverity + ( + "severity", + EV_DEFAULT, + "f", + "newSeverity", + "How violently the debris should be ejected." + ); + +Event EV_ExplodeObject_SetDebrisModel + ( + "debrismodel", + EV_DEFAULT, + "s", + "debrisModel", + "What kind of debris to spawn when triggered." + ); + +Event EV_ExplodeObject_SetDebrisAmount + ( + "amount", + EV_DEFAULT, + "i", + "amountOfDebris", + "How much debris to spawn each time." + ); + + +CLASS_DECLARATION( MultiExploder, ExplodeObject, "func_explodeobject" ) + { + { &EV_Touch, NULL }, + { &EV_Trigger_Effect, MakeExplosion }, + { &EV_ExplodeObject_SetSeverity, SetSeverity }, + { &EV_ExplodeObject_SetDebrisModel, SetDebrisModel }, + { &EV_ExplodeObject_SetDebrisAmount, SetDebrisAmount }, + { NULL, NULL } + }; + +void ExplodeObject::SetDebrisModel + ( + Event *ev + ) + + { + char string[ 1024 ]; + const char *ptr; + + // there could be multiple space delimited models, so we need to search for the spaces. + strcpy( string, ev->GetString( 1 ) ); + ptr = strtok( string, " " ); + while ( ptr ) + { + debrismodels.AddUniqueObject( str( ptr ) ); + CacheResource( ptr, this ); + ptr = strtok( NULL, " " ); + } + } + +void ExplodeObject::SetSeverity + ( + Event *ev + ) + + { + severity = ev->GetFloat( 1 ); + } + +void ExplodeObject::SetDebrisAmount + ( + Event *ev + ) + + { + debrisamount = ev->GetInteger( 1 ); + } + +void ExplodeObject::MakeExplosion + ( + Event *ev + ) + + { + Vector pos; + float t, scale; + Entity *other; + Event *event; + + other = ev->GetEntity( 1 ); + + // make sure other is valid + if ( !other ) + { + other = world; + } + + // prevent the trigger from triggering again + trigger_time = -1; + + if ( !explode_time ) + { + setSolidType( SOLID_NOT ); + hideModel(); + explode_time = level.time + duration; + } + + if ( spawnflags & RANDOM_TIME ) + { + t = explodewait * ( 1 + G_CRandom( randomness ) ); + } + else + { + t = explodewait; + } + + event = new Event( EV_Trigger_Effect ); + event->AddEntity( other ); + PostEvent( event, t ); + + if ( level.time > explode_time ) + { + if ( spawnflags & MULTI_USE ) + { + // + // reset the trigger in a half second + // + trigger_time = level.time + 0.5f; + explode_time = 0; + CancelEventsOfType( EV_Trigger_Effect ); + // + // reset health if necessary + // + health = max_health; + if ( health ) + { + setSolidType( SOLID_BBOX ); + } + if ( spawnflags & VISIBLE ) + { + PostEvent( EV_Show, 0.5f ); + } + return; + } + else + { + PostEvent( EV_Remove, 0 ); + return; + } + } + + pos[ 0 ] = absmin[ 0 ] + G_Random( absmax[ 0 ] - absmin[ 0 ] ); + pos[ 1 ] = absmin[ 1 ] + G_Random( absmax[ 1 ] - absmin[ 1 ] ); + pos[ 2 ] = absmin[ 2 ] + G_Random( absmax[ 2 ] - absmin[ 2 ] ); + + if ( spawnflags & RANDOM_SCALE ) + { + scale = edict->s.scale * 0.25f; + scale += G_Random( 3 * scale ); + } + else + { + scale = 1.0f; + } + + if ( !( spawnflags & NO_EXPLOSIONS ) ) + { + CreateExplosion + ( + pos, + damage, + this, + other, + this, + NULL, + scale + ); + } + if ( debrismodels.NumObjects() ) + { + TossObject *to; + int i; + for ( i = 0; i < debrisamount; i++ ) + { + int num; + + if ( spawnflags & RANDOM_SCALE ) + { + scale = edict->s.scale * 0.25f; + scale += G_Random( 3 * scale ); + } + else + { + scale = 1.0f; + } + + num = G_Random( debrismodels.NumObjects() ) + 1; + to = new TossObject( debrismodels.ObjectAt( num ) ); + to->setScale( scale ); + to->setOrigin( pos ); + to->SetVelocity( severity ); + if ( spawnflags & NOTSOLID ) + { + to->setSolidType( SOLID_NOT ); + } + pos[ 0 ] = absmin[ 0 ] + G_Random( absmax[ 0 ] - absmin[ 0 ] ); + pos[ 1 ] = absmin[ 1 ] + G_Random( absmax[ 1 ] - absmin[ 1 ] ); + pos[ 2 ] = absmin[ 2 ] + G_Random( absmax[ 2 ] - absmin[ 2 ] ); + } + } + + } + +ExplodeObject::ExplodeObject() + { + if ( !LoadingSavegame ) + { + duration = 1; + explodewait = 0.25f; + severity = 1.0f; + debrismodels.ClearObjectList(); + debrisamount = 2; + if ( spawnflags & METAL_DEBRIS ) + { + debrismodels.AddUniqueObject( str( "obj_debris_metal1.tik" ) ); + debrismodels.AddUniqueObject( str( "obj_debris_metal2.tik" ) ); + debrismodels.AddUniqueObject( str( "obj_debris_metal3.tik" ) ); + CacheResource( "obj_debris_metal1.tik", this ); + CacheResource( "obj_debris_metal2.tik", this ); + CacheResource( "obj_debris_metal3.tik", this ); + } + else if ( spawnflags & ROCK_DEBRIS ) + { + debrismodels.AddUniqueObject( str( "obj_debris_rock1.tik" ) ); + debrismodels.AddUniqueObject( str( "obj_debris_rock2.tik" ) ); + debrismodels.AddUniqueObject( str( "obj_debris_rock3.tik" ) ); + debrismodels.AddUniqueObject( str( "obj_debris_rock4.tik" ) ); + CacheResource( "obj_debris_rock1.tik", this ); + CacheResource( "obj_debris_rock2.tik", this ); + CacheResource( "obj_debris_rock3.tik", this ); + CacheResource( "obj_debris_rock4.tik", this ); + } + } + } + diff --git a/source/source/fgame/explosion.h b/source/source/fgame/explosion.h new file mode 100644 index 0000000..01b87aa --- /dev/null +++ b/source/source/fgame/explosion.h @@ -0,0 +1,172 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/explosion.h $ +// $Revision:: 10 $ +// $Author:: Markd $ +// $Date:: 6/14/00 2:17p $ +// +// Copyright (C) 1997 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/explosion.h $ +// +// 10 6/14/00 2:17p Markd +// fixed compiler warnings for Intel Compiler +// +// 9 5/26/00 7:44p Markd +// 2nd phase save games +// +// 8 5/24/00 3:14p Markd +// first phase of save/load games +// +// 7 4/18/00 4:20p Markd +// added random scale ability to func_explodeobject and func_multiexploder +// +// 6 4/18/00 4:01p Markd +// fixed up explosions +// +// 5 2/02/00 7:14p Markd +// Added func_explodeobject and TossObject +// +// 4 1/12/00 6:13p Jimdose +// added base_velocity and random_velocity +// rewrote CreateExplosion +// +// 3 1/06/00 11:08p Jimdose +// cleaning up unused code +// +// 2 11/01/99 6:12p Steven +// Changed some old attenuation stuff to min dist stuff. +// +// 1 9/10/99 10:53a Jimdose +// +// 1 9/08/99 3:16p Aldie +// +// 6 7/30/99 6:24p Aldie +// Updated weapons and utils to use new methods +// +// 5 7/30/99 3:00p Steven +// New temporary stuff for gas explosions. +// +// DESCRIPTION: +// Standard explosion object that is spawned by other entites and not map designers. +// Explosion is used by many of the weapons for the blast effect, but is also used +// by the Exploder and MultiExploder triggers. These triggers create one or more +// explosions each time they are activated. +// + +#ifndef __EXPLOSION_H__ +#define __EXPLOSION_H__ + +#include "g_local.h" +#include "entity.h" +#include "trigger.h" + +class Exploder : public Trigger + { + private: + int damage; + + void MakeExplosion( Event *ev ); + void SetDmg( Event *ev ); + + public: + CLASS_PROTOTYPE( Exploder ); + + Exploder(); + virtual void Archive( Archiver &arc ); + }; + +inline void Exploder::Archive + ( + Archiver &arc + ) + + { + Trigger::Archive( arc ); + + arc.ArchiveInteger( &damage ); + } + +class MultiExploder : public Trigger + { + protected: + float explodewait; + float explode_time; + float duration; + int damage; + float randomness; + + void MakeExplosion( Event *ev ); + void SetDmg( Event *ev ); + void SetDuration( Event *ev ); + void SetWait( Event *ev ); + void SetRandom( Event *ev ); + + public: + CLASS_PROTOTYPE( MultiExploder ); + + MultiExploder(); + virtual void Archive( Archiver &arc ); + }; + +inline void MultiExploder::Archive + ( + Archiver &arc + ) + { + Trigger::Archive( arc ); + + arc.ArchiveFloat( &explodewait ); + arc.ArchiveFloat( &explode_time ); + arc.ArchiveFloat( &duration ); + arc.ArchiveInteger( &damage ); + arc.ArchiveFloat( &randomness ); + } + +void CreateExplosion + ( + Vector pos, + float damage = 120, + Entity *inflictor = NULL, + Entity *attacker = NULL, + Entity *ignore = NULL, + const char *explosionModel = NULL, + float scale = 1.0f + ); + +class ExplodeObject : public MultiExploder + { + private: + Container debrismodels; + int debrisamount; + float severity; + + void SetDebrisModel( Event *ev ); + void SetSeverity( Event *ev ); + void SetDebrisAmount( Event *ev ); + void MakeExplosion( Event *ev ); + + public: + CLASS_PROTOTYPE( ExplodeObject ); + + ExplodeObject(); + virtual void Archive( Archiver &arc ); + }; + +inline void ExplodeObject::Archive + ( + Archiver &arc + ) + { + MultiExploder::Archive( arc ); + + arc.ArchiveFloat( &severity ); + arc.ArchiveInteger( &debrisamount ); + debrismodels.Archive( arc ); + } + +#endif /* explosion.h */ diff --git a/source/source/fgame/fgame.dsp b/source/source/fgame/fgame.dsp new file mode 100644 index 0000000..32ea101 --- /dev/null +++ b/source/source/fgame/fgame.dsp @@ -0,0 +1,756 @@ +# Microsoft Developer Studio Project File - Name="fgame" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=fgame - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "fgame.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "fgame.mak" CFG="fgame - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "fgame - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "fgame - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName ""$/fakk2_code/fakk2_new/fgame", FYHAAAAA" +# PROP Scc_LocalPath "." +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "fgame - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "./Release" +# PROP Intermediate_Dir "./Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "FGAME_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MT /W3 /GX /Zi /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "FGAME_EXPORTS" /D "GAME_DLL" /FR /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 +# ADD LINK32 kernel32.lib user32.lib winmm.lib /nologo /dll /map /machine:I386 /out:"../Release/fgamex86.dll" +# SUBTRACT LINK32 /debug + +!ELSEIF "$(CFG)" == "fgame - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "../Debug" +# PROP Intermediate_Dir "./Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "FGAME_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MTd /W4 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "FGAME_EXPORTS" /D "GAME_DLL" /FR /YX /FD /GZ /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib winmm.lib /nologo /dll /debug /machine:I386 /out:"../Debug/fgamex86.dll" /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "fgame - Win32 Release" +# Name "fgame - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\actor.cpp +# End Source File +# Begin Source File + +SOURCE=.\ammo.cpp +# End Source File +# Begin Source File + +SOURCE=.\animate.cpp +# End Source File +# Begin Source File + +SOURCE=.\archive.cpp +# End Source File +# Begin Source File + +SOURCE=.\armor.cpp +# End Source File +# Begin Source File + +SOURCE=.\beam.cpp +# End Source File +# Begin Source File + +SOURCE=.\behavior.cpp +# End Source File +# Begin Source File + +SOURCE=.\bg_misc.c +# End Source File +# Begin Source File + +SOURCE=.\bg_pmove.c +# End Source File +# Begin Source File + +SOURCE=.\bspline.cpp +# End Source File +# Begin Source File + +SOURCE=.\camera.cpp +# End Source File +# Begin Source File + +SOURCE=.\characterstate.cpp +# End Source File +# Begin Source File + +SOURCE=.\class.cpp +# End Source File +# Begin Source File + +SOURCE=.\clusterbomb.cpp +# End Source File +# Begin Source File + +SOURCE=.\crossbow.cpp +# End Source File +# Begin Source File + +SOURCE=.\debuglines.cpp +# End Source File +# Begin Source File + +SOURCE=.\decals.cpp +# End Source File +# Begin Source File + +SOURCE=.\doors.cpp +# End Source File +# Begin Source File + +SOURCE=.\earthquake.cpp +# End Source File +# Begin Source File + +SOURCE=.\edenwater.cpp +# End Source File +# Begin Source File + +SOURCE=.\entity.cpp +# End Source File +# Begin Source File + +SOURCE=.\explosion.cpp +# End Source File +# Begin Source File + +SOURCE=.\flamethrower.cpp +# End Source File +# Begin Source File + +SOURCE=.\flashbang.cpp +# End Source File +# Begin Source File + +SOURCE=.\g_main.cpp +# End Source File +# Begin Source File + +SOURCE=.\g_phys.cpp +# End Source File +# Begin Source File + +SOURCE=.\g_spawn.cpp +# End Source File +# Begin Source File + +SOURCE=.\g_utils.cpp +# End Source File +# Begin Source File + +SOURCE=.\game.cpp +# End Source File +# Begin Source File + +SOURCE=.\game.def +# End Source File +# Begin Source File + +SOURCE=.\gamecmds.cpp +# End Source File +# Begin Source File + +SOURCE=.\gamecvars.cpp +# End Source File +# Begin Source File + +SOURCE=.\gamescript.cpp +# End Source File +# Begin Source File + +SOURCE=.\gibs.cpp +# End Source File +# Begin Source File + +SOURCE=.\goo.cpp +# End Source File +# Begin Source File + +SOURCE=.\gravpath.cpp +# End Source File +# Begin Source File + +SOURCE=.\health.cpp +# End Source File +# Begin Source File + +SOURCE=.\hornofconjuring.cpp +# End Source File +# Begin Source File + +SOURCE=.\inventoryitem.cpp +# End Source File +# Begin Source File + +SOURCE=.\ipfilter.cpp +# End Source File +# Begin Source File + +SOURCE=.\item.cpp +# End Source File +# Begin Source File + +SOURCE=.\level.cpp +# End Source File +# Begin Source File + +SOURCE=.\light.cpp +# End Source File +# Begin Source File + +SOURCE=.\listener.cpp +# End Source File +# Begin Source File + +SOURCE=.\misc.cpp +# End Source File +# Begin Source File + +SOURCE=.\mover.cpp +# End Source File +# Begin Source File + +SOURCE=.\nature.cpp +# End Source File +# Begin Source File + +SOURCE=.\navigate.cpp +# End Source File +# Begin Source File + +SOURCE=.\object.cpp +# End Source File +# Begin Source File + +SOURCE=.\path.cpp +# End Source File +# Begin Source File + +SOURCE=.\player.cpp +# End Source File +# Begin Source File + +SOURCE=.\player_combat.cpp +# End Source File +# Begin Source File + +SOURCE=.\player_util.cpp +# End Source File +# Begin Source File + +SOURCE=.\PlayerStart.cpp +# End Source File +# Begin Source File + +SOURCE=.\portal.cpp +# End Source File +# Begin Source File + +SOURCE=.\powerups.cpp +# End Source File +# Begin Source File + +SOURCE=.\q_math.c +# End Source File +# Begin Source File + +SOURCE=.\q_mathsys.c +# End Source File +# Begin Source File + +SOURCE=.\q_shared.c +# End Source File +# Begin Source File + +SOURCE=.\rope.cpp +# End Source File +# Begin Source File + +SOURCE=.\script.cpp +# End Source File +# Begin Source File + +SOURCE=.\scriptmaster.cpp +# End Source File +# Begin Source File + +SOURCE=.\scriptslave.cpp +# End Source File +# Begin Source File + +SOURCE=.\scriptvariable.cpp +# End Source File +# Begin Source File + +SOURCE=.\sentient.cpp +# End Source File +# Begin Source File + +SOURCE=.\shield.cpp +# End Source File +# Begin Source File + +SOURCE=.\soulsucker.cpp +# End Source File +# Begin Source File + +SOURCE=.\soundman.cpp +# End Source File +# Begin Source File + +SOURCE=.\spawners.cpp +# End Source File +# Begin Source File + +SOURCE=.\specialfx.cpp +# End Source File +# Begin Source File + +SOURCE=.\steering.cpp +# End Source File +# Begin Source File + +SOURCE=.\str.cpp +# End Source File +# Begin Source File + +SOURCE=.\sword.cpp +# End Source File +# Begin Source File + +SOURCE=.\trigger.cpp +# End Source File +# Begin Source File + +SOURCE=.\vehicle.cpp +# End Source File +# Begin Source File + +SOURCE=.\viewthing.cpp +# End Source File +# Begin Source File + +SOURCE=.\weapon.cpp +# End Source File +# Begin Source File + +SOURCE=.\weaputils.cpp +# End Source File +# Begin Source File + +SOURCE=..\win32\win_bounds.cpp +# End Source File +# Begin Source File + +SOURCE=.\worldspawn.cpp +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\actor.h +# End Source File +# Begin Source File + +SOURCE=.\ammo.h +# End Source File +# Begin Source File + +SOURCE=.\animate.h +# End Source File +# Begin Source File + +SOURCE=.\archive.h +# End Source File +# Begin Source File + +SOURCE=.\armor.h +# End Source File +# Begin Source File + +SOURCE=.\beam.h +# End Source File +# Begin Source File + +SOURCE=.\behavior.h +# End Source File +# Begin Source File + +SOURCE=.\bg_local.h +# End Source File +# Begin Source File + +SOURCE=.\bg_public.h +# End Source File +# Begin Source File + +SOURCE=.\bspline.h +# End Source File +# Begin Source File + +SOURCE=.\camera.h +# End Source File +# Begin Source File + +SOURCE=.\characterstate.h +# End Source File +# Begin Source File + +SOURCE=.\class.h +# End Source File +# Begin Source File + +SOURCE=.\clusterbomb.h +# End Source File +# Begin Source File + +SOURCE=.\container.h +# End Source File +# Begin Source File + +SOURCE=.\crossbow.h +# End Source File +# Begin Source File + +SOURCE=.\debuglines.h +# End Source File +# Begin Source File + +SOURCE=.\decals.h +# End Source File +# Begin Source File + +SOURCE=.\doors.h +# End Source File +# Begin Source File + +SOURCE=.\earthquake.h +# End Source File +# Begin Source File + +SOURCE=.\edenwater.h +# End Source File +# Begin Source File + +SOURCE=.\entity.h +# End Source File +# Begin Source File + +SOURCE=.\explosion.h +# End Source File +# Begin Source File + +SOURCE=.\flamethrower.h +# End Source File +# Begin Source File + +SOURCE=.\flashbang.h +# End Source File +# Begin Source File + +SOURCE=.\g_local.h +# End Source File +# Begin Source File + +SOURCE=.\g_main.h +# End Source File +# Begin Source File + +SOURCE=.\g_phys.h +# End Source File +# Begin Source File + +SOURCE=.\g_public.h +# End Source File +# Begin Source File + +SOURCE=.\g_spawn.h +# End Source File +# Begin Source File + +SOURCE=.\g_utils.h +# End Source File +# Begin Source File + +SOURCE=.\game.h +# End Source File +# Begin Source File + +SOURCE=.\gamecmds.h +# End Source File +# Begin Source File + +SOURCE=.\gamecvars.h +# End Source File +# Begin Source File + +SOURCE=.\gamescript.h +# End Source File +# Begin Source File + +SOURCE=.\gibs.h +# End Source File +# Begin Source File + +SOURCE=.\goo.h +# End Source File +# Begin Source File + +SOURCE=.\gravpath.h +# End Source File +# Begin Source File + +SOURCE=.\health.h +# End Source File +# Begin Source File + +SOURCE=.\hornofconjuring.h +# End Source File +# Begin Source File + +SOURCE=.\inventoryitem.h +# End Source File +# Begin Source File + +SOURCE=.\ipfilter.h +# End Source File +# Begin Source File + +SOURCE=.\item.h +# End Source File +# Begin Source File + +SOURCE=.\level.h +# End Source File +# Begin Source File + +SOURCE=.\light.h +# End Source File +# Begin Source File + +SOURCE=.\Linklist.h +# End Source File +# Begin Source File + +SOURCE=.\listener.h +# End Source File +# Begin Source File + +SOURCE=.\misc.h +# End Source File +# Begin Source File + +SOURCE=.\mover.h +# End Source File +# Begin Source File + +SOURCE=.\nature.h +# End Source File +# Begin Source File + +SOURCE=.\navigate.h +# End Source File +# Begin Source File + +SOURCE=.\object.h +# End Source File +# Begin Source File + +SOURCE=.\path.h +# End Source File +# Begin Source File + +SOURCE=.\player.h +# End Source File +# Begin Source File + +SOURCE=.\PlayerStart.h +# End Source File +# Begin Source File + +SOURCE=.\portal.h +# End Source File +# Begin Source File + +SOURCE=.\powerups.h +# End Source File +# Begin Source File + +SOURCE=.\q_shared.h +# End Source File +# Begin Source File + +SOURCE=.\queue.h +# End Source File +# Begin Source File + +SOURCE=.\rope.h +# End Source File +# Begin Source File + +SOURCE=.\script.h +# End Source File +# Begin Source File + +SOURCE=.\scriptmaster.h +# End Source File +# Begin Source File + +SOURCE=.\scriptslave.h +# End Source File +# Begin Source File + +SOURCE=.\scriptvariable.h +# End Source File +# Begin Source File + +SOURCE=.\sentient.h +# End Source File +# Begin Source File + +SOURCE=.\shield.h +# End Source File +# Begin Source File + +SOURCE=.\soulsucker.h +# End Source File +# Begin Source File + +SOURCE=.\soundman.h +# End Source File +# Begin Source File + +SOURCE=.\spawners.h +# End Source File +# Begin Source File + +SOURCE=.\specialfx.h +# End Source File +# Begin Source File + +SOURCE=.\stack.h +# End Source File +# Begin Source File + +SOURCE=.\steering.h +# End Source File +# Begin Source File + +SOURCE=.\str.h +# End Source File +# Begin Source File + +SOURCE=.\surfaceflags.h +# End Source File +# Begin Source File + +SOURCE=.\sword.h +# End Source File +# Begin Source File + +SOURCE=.\trigger.h +# End Source File +# Begin Source File + +SOURCE=.\umap.h +# End Source File +# Begin Source File + +SOURCE=.\vector.h +# End Source File +# Begin Source File + +SOURCE=.\vehicle.h +# End Source File +# Begin Source File + +SOURCE=.\viewthing.h +# End Source File +# Begin Source File + +SOURCE=.\weapon.h +# End Source File +# Begin Source File + +SOURCE=.\weaputils.h +# End Source File +# Begin Source File + +SOURCE=.\worldspawn.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/source/source/fgame/fgame.dsw b/source/source/fgame/fgame.dsw new file mode 100644 index 0000000..4988e95 --- /dev/null +++ b/source/source/fgame/fgame.dsw @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "fgame"=.\fgame.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/source/source/fgame/fists.cpp b/source/source/fgame/fists.cpp new file mode 100644 index 0000000..c1e8837 --- /dev/null +++ b/source/source/fgame/fists.cpp @@ -0,0 +1,175 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/fists.cpp $ +// $Revision:: 1 $ +// $Author:: Jimdose $ +// $Date:: 9/10/99 10:53a $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/fists.cpp $ +// +// 1 9/10/99 10:53a Jimdose +// +// 1 9/08/99 3:16p Aldie +// +// 9 8/28/99 11:44a Steven +// Removed global from sound function calls. +// +// 8 8/18/99 3:28p Jimdose +// added cylindrical collision detection +// +// DESCRIPTION: +// Normal Hands +// + +#include "g_local.h" +#include "fists.h" +#include "misc.h" +#include "specialfx.h" +//#include "surface.h" + +CLASS_DECLARATION( Weapon, Fists, NULL ) + { + { &EV_Weapon_Shoot, Shoot }, + { NULL, NULL } + }; + +Fists::Fists() + { + SetModels( NULL, "view_punch.def" ); + SetAmmo( NULL, 0, 0 ); + SetRank( 10, 10 ); + strike_reach = 64; + strike_damage = 20; + SetMaxRange( strike_reach ); + SetType( WEAPON_MELEE ); + kick = 40; + meansofdeath = MOD_FISTS; + } + +void Fists::Shoot( Event * ev ) + { + trace_t trace; + Vector start; + Vector end; + float damage; + Vector org; + Vector dir; + int surfflags; + int surftype; + + assert( owner ); + if ( !owner ) + { + return; + } + + NextAttack( 1 ); + + damage = G_Random(strike_damage)+strike_damage; + + GetMuzzlePosition( &start, &dir ); + end = start + dir * strike_reach; + + trace = G_FullTrace( start, vec_zero, vec_zero, end, 64, owner, MASK_PROJECTILE, false, "Fists::Shoot" ); + + if ( !trace.surface ) + { + surfflags = 0; + surftype = 0; + } + else + { + surfflags = trace.surface->flags; + surftype = SURFACETYPE_FROM_FLAGS( surfflags ); +// surfaceManager.DamageSurface( &trace, damage, owner ); + } + dir = Vector(trace.endpos) - start; + dir.normalize(); + + org = Vector(trace.endpos) - dir; + + if ( (trace.fraction < 1.0f) ) + { + if ( trace.ent->entity && trace.ent->entity->takedamage ) + { + if ( trace.ent->entity->flags & FL_BLOOD ) + { + if ( ( meansofdeath == MOD_MUTANTHANDS ) || ( trace.ent->entity->health < -500 ) ) + { + owner->Sound( "impact_goryimpact" ); + } + else + { + owner->Sound( "impact_bodyimpact" ); + } + SpawnBlood( org, trace.plane.normal, damage ); + } + else + { +/* GAMEFIX + gi.WriteByte( svc_temp_entity ); + gi.WriteByte( TE_STRIKE ); + gi.WritePosition( org.vec3() ); + gi.WriteDir( trace.plane.normal ); + gi.WriteByte( 120 ); + gi.WriteByte( surftype ); + gi.multicast( org.vec3(), MULTICAST_PVS ); + */ + } + if ( trace.intersect.valid ) + { + // take the ground out so that the kick works + trace.ent->entity->groundentity = NULL; + + // We hit a valid surface so send in location based damage + trace.ent->entity->Damage( this, + owner, + damage, + trace.endpos, + dir, + trace.plane.normal, + kick, + 0, + meansofdeath, + trace.intersect.surface, + -1, + 1 ); + //trace.intersect.damage_multiplier ); + } + else + { + // We didn't hit any surfaces, so send in generic damage + trace.ent->entity->Damage( this, + owner, + damage, + trace.endpos, + dir, + trace.plane.normal, + kick, + 0, + meansofdeath, + -1, + -1, + 1 ); + } + } + else + { +/* GAMEFIX + gi.WriteByte( svc_temp_entity ); + gi.WriteByte( TE_STRIKE ); + gi.WritePosition( org.vec3() ); + gi.WriteDir( trace.plane.normal ); + gi.WriteByte( 120 ); + gi.WriteByte( surftype ); + gi.multicast( org.vec3(), MULTICAST_PVS ); + */ + } + } + } diff --git a/source/source/fgame/fists.h b/source/source/fgame/fists.h new file mode 100644 index 0000000..8574ddd --- /dev/null +++ b/source/source/fgame/fists.h @@ -0,0 +1,70 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/fists.h $ +// $Revision:: 1 $ +// $Author:: Jimdose $ +// $Date:: 9/10/99 10:53a $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/fists.h $ +// +// 1 9/10/99 10:53a Jimdose +// +// 1 9/08/99 3:16p Aldie +// +// DESCRIPTION: +// Mutant Hands +// + +#ifndef __FISTS_H__ +#define __FISTS_H__ + +#include "g_local.h" +#include "item.h" +#include "weapon.h" + +class Fists : public Weapon + { + public: + float strike_reach; + float strike_damage; + int meansofdeath; + + CLASS_PROTOTYPE( Fists ); + + Fists::Fists(); + virtual void Shoot( Event *ev ); + virtual void Archive( Archiver &arc ); + virtual void Unarchive( Archiver &arc ); + }; + +inline void Fists::Archive + ( + Archiver &arc + ) + { + Weapon::Archive( arc ); + + arc.WriteFloat( strike_reach ); + arc.WriteFloat( strike_damage ); + arc.WriteInteger( meansofdeath ); + } + +inline void Fists::Unarchive + ( + Archiver &arc + ) + { + Weapon::Unarchive( arc ); + + arc.ReadFloat( &strike_reach ); + arc.ReadFloat( &strike_damage ); + arc.ReadInteger( &meansofdeath ); + } + +#endif /* Fists.h */ diff --git a/source/source/fgame/flamethrower.cpp b/source/source/fgame/flamethrower.cpp new file mode 100644 index 0000000..2a557e1 --- /dev/null +++ b/source/source/fgame/flamethrower.cpp @@ -0,0 +1,108 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/flamethrower.cpp $ +// $Revision:: 6 $ +// $Author:: Markd $ +// $Date:: 6/23/00 8:41p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/flamethrower.cpp $ +// +// 6 6/23/00 8:41p Markd +// made a lot of changes to different constructors for saved game support +// +// 5 6/14/00 3:50p Markd +// Cleaned up more Intel Compiler warnings +// +// 4 5/06/00 2:06p Steven +// Fixed a precendence bug. +// +// 3 5/05/00 5:17p Aldie +// comment +// +// 2 5/05/00 5:17p Aldie +// Flamethrower +// +// DESCRIPTION: +// Flamethrower weapon + +#include "flamethrower.h" + +CLASS_DECLARATION( Weapon, Flamethrower, NULL ) + { + { NULL, NULL } + }; + +Flamethrower::Flamethrower + ( + ) + + { + // Attach the gasoline model to the flamethrower + Event *ev; + + if ( LoadingSavegame ) + { + return; + } + + ev = new Event ( EV_AttachModel ); + ev->AddString( "weapon_flamethrowergas.tik" ); + ev->AddString( "tag_gas" ); + + PostEvent( ev, FRAMETIME ); + + m_gas = NULL; + } + +void Flamethrower::Shoot + ( + Event *ev + ) + + { + firemode_t mode = FIRE_PRIMARY; + + if ( ev->NumArgs() > 0 ) + { + mode = WeaponModeNameToNum( ev->GetString( 1 ) ); + + if ( mode == FIRE_ERROR ) + return; + } + + // Find a pointer to the gas + if ( !m_gas ) + { + if ( numchildren == 1 ) + { + m_gas = ( Animate * )G_GetEntity( children[ 0 ] ); + m_gas->RandomAnimate( "gas" ); + m_gas->StopAnimating(); + m_gas->SetFrame( 0 ); + } + } + // Check the ammo level and see if we need to adjust the gas animation + + if ( owner && m_gas ) + { + int amount = owner->AmmoCount( ammo_type[mode] ); + int maxamount = owner->MaxAmmoCount( ammo_type[mode] ); + float percentage = 1.0f - ( ( float )amount / ( float )maxamount ); + int numframes = m_gas->NumFrames(); + + m_gas->SetFrame( percentage * ( numframes - 1 ) ); + + if ( percentage >= 1 ) + m_gas->hideModel(); + else + m_gas->showModel(); + } + + Weapon::Shoot( ev ); + } diff --git a/source/source/fgame/flamethrower.h b/source/source/fgame/flamethrower.h new file mode 100644 index 0000000..936f5ce --- /dev/null +++ b/source/source/fgame/flamethrower.h @@ -0,0 +1,63 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/flamethrower.h $ +// $Revision:: 6 $ +// $Author:: Markd $ +// $Date:: 6/14/00 3:50p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/flamethrower.h $ +// +// 6 6/14/00 3:50p Markd +// Cleaned up more Intel Compiler warnings +// +// 5 5/26/00 7:44p Markd +// 2nd phase save games +// +// 4 5/24/00 3:14p Markd +// first phase of save/load games +// +// 3 5/05/00 5:18p Aldie +// comment +// +// 2 5/05/00 5:17p Aldie +// Flamethrower +// +// DESCRIPTION: +// Flamethrower weapon + +#ifndef __FLAMETHROWER_H__ +#define __FLAMETHROWER_H__ + +#include "weapon.h" +#include "weaputils.h" + +class Flamethrower : public Weapon + { + private: + Animate *m_gas; + + public: + CLASS_PROTOTYPE( Flamethrower ); + + Flamethrower(); + virtual void Shoot( Event *ev ); + virtual void Archive( Archiver &arc ); + }; + +inline void Flamethrower::Archive + ( + Archiver &arc + ) + { + Weapon::Archive( arc ); + + arc.ArchiveObjectPointer( ( Class ** )&m_gas ); + } + +#endif // __FLAMETHROWER_H__ diff --git a/source/source/fgame/flashbang.cpp b/source/source/fgame/flashbang.cpp new file mode 100644 index 0000000..d28faf5 --- /dev/null +++ b/source/source/fgame/flashbang.cpp @@ -0,0 +1,174 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/flashbang.cpp $ +// $Revision:: 9 $ +// $Author:: Steven $ +// $Date:: 7/28/00 9:27a $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/flashbang.cpp $ +// +// 9 7/28/00 9:27a Steven +// Made it so flashbang projectiles actually animate correctly. +// +// 8 7/20/00 2:17p Aldie +// Fix for firing the flashbang +// +// 7 7/17/00 3:26p Aldie +// Fix for flashbangs, changed detail variable, and added forcetorsostate +// +// 6 4/15/00 5:18p Aldie +// Added stun events and fixed yet another bug with Ammo and AutoPutaway +// +// 5 4/14/00 6:05p Aldie +// Added some more flashbang functions +// +// 4 4/13/00 3:45p Aldie +// Added more flashbang support. Added damage_type to entities used to specify +// what type of damage they take. +// +// 3 4/07/00 6:00p Aldie +// Added flashing and fixed radius damage for explosions +// +// 2 4/07/00 4:01p Aldie +// First version +// +// DESCRIPTION: +// Flashbang weapon + +#include "flashbang.h" + +Event EV_FlashbangProjectile_StunTime + ( + "stuntime", + EV_DEFAULT, + "f", + "time", + "Amount of time to stun the target" + ); +Event EV_FlashbangProjectile_StunRadius + ( + "stunradius", + EV_DEFAULT, + "f", + "radius", + "Radius of the stun effect" + ); + +CLASS_DECLARATION( Projectile, FlashbangProjectile, NULL ) + { + { &EV_FlashbangProjectile_StunTime, StunTime }, + { &EV_FlashbangProjectile_StunRadius, StunRadius }, + { NULL, NULL } + }; + +FlashbangProjectile::FlashbangProjectile + ( + ) + + { + } + +void FlashbangProjectile::StunTime + ( + Event *ev + ) + + { + stunTime = ev->GetFloat( 1 ); + } + +void FlashbangProjectile::StunRadius + ( + Event *ev + ) + + { + stunRadius = ev->GetFloat( 1 ); + } + +void FlashbangProjectile::Explode + ( + Event *ev + ) + + { + Entity *owner; + + // Get the owner of this projectile + owner = G_GetEntity( this->owner ); + + // If the owner's not here, make the world the owner + if ( !owner ) + owner = world; + + // When a flashbang explodes, it whites the screen and does some damage + if ( explosionmodel.length() ) + { + ExplosionAttack( origin, owner, explosionmodel, Vector( 0,0,0 ), NULL ); + StunAttack( origin, owner, this, this->stunRadius, this->stunTime, NULL ); + } + + PostEvent( EV_Remove, 0 ); + } + + +CLASS_DECLARATION( Weapon, Flashbang, NULL ) + { + { NULL, NULL } + }; + +Flashbang::Flashbang + ( + ) + + { + } + +void Flashbang::SpecialFireProjectile + ( + Vector pos, + Vector forward, + Vector right, + Vector up, + Entity *owner, + str projectileModel, + float charge_fraction + ) + + { + // Do a trace forward to see if a solid is hit + Vector norm,angles; + FlashbangProjectile *fb; + Event *ev; + + fb = new FlashbangProjectile; + fb->setModel( projectileModel ); + fb->CancelEventsOfType( EV_ProcessInitCommands ); + fb->ProcessInitCommands( fb->edict->s.modelindex ); + fb->setMoveType( MOVETYPE_NONE ); + + fb->owner = owner->entnum; + fb->edict->ownerNum = owner->entnum; + + // Explode the flashbang after it's life expires + ev = new Event( EV_Projectile_Explode ); + fb->PostEvent( ev, fb->life ); + + // Spawn a flashbang at the player's feet. + Vector org = owner->origin + Vector( 0,0,32 ); + Vector end = org + ( forward * 32 ); + trace_t trace = G_Trace( org, vec_zero, vec_zero, end, owner, MASK_SOLID, qfalse, "Flashbang::SpecialFireProjectile" ); + + fb->setOrigin( trace.endpos ); + fb->setAngles( Vector( 0, owner->angles[1] + 180, 0 ) ); + fb->droptofloor( 64 ); + fb->RandomAnimate( "idle" ); + } + + diff --git a/source/source/fgame/flashbang.h b/source/source/fgame/flashbang.h new file mode 100644 index 0000000..c42316c --- /dev/null +++ b/source/source/fgame/flashbang.h @@ -0,0 +1,85 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/flashbang.h $ +// $Revision:: 6 $ +// $Author:: Markd $ +// $Date:: 5/26/00 7:44p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/flashbang.h $ +// +// 6 5/26/00 7:44p Markd +// 2nd phase save games +// +// 5 5/24/00 3:14p Markd +// first phase of save/load games +// +// 4 4/15/00 5:18p Aldie +// Added stun events and fixed yet another bug with Ammo and AutoPutaway +// +// 3 4/07/00 6:00p Aldie +// Added flashing and fixed radius damage for explosions +// +// 2 4/07/00 4:01p Aldie +// First version +// +// DESCRIPTION: +// Flashbang weapon + +#ifndef __FLASHBANG_H__ +#define __FLASHBANG_H__ + +#include "weapon.h" +#include "weaputils.h" + +class Flashbang : public Weapon + { + public: + CLASS_PROTOTYPE( Flashbang ); + + Flashbang(); + + virtual void SpecialFireProjectile( Vector pos, + Vector forward, + Vector right, + Vector up, + Entity *owner, + str projectileModel, + float charge_fraction + ); + + }; + +class FlashbangProjectile : public Projectile + { + private: + float stunRadius; + float stunTime; + + public: + CLASS_PROTOTYPE( FlashbangProjectile ); + + FlashbangProjectile(); + virtual void Explode( Event *ev ); + void StunTime( Event *ev ); + void StunRadius( Event *ev ); + virtual void Archive( Archiver &arc ); + }; + +inline void FlashbangProjectile::Archive + ( + Archiver &arc + ) + { + Projectile::Archive( arc ); + + arc.ArchiveFloat( &stunRadius ); + arc.ArchiveFloat( &stunTime ); + } + +#endif // __FLASHBANG_H__ diff --git a/source/source/fgame/g_local.h b/source/source/fgame/g_local.h new file mode 100644 index 0000000..72cce66 --- /dev/null +++ b/source/source/fgame/g_local.h @@ -0,0 +1,219 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/g_local.h $ +// $Revision:: 18 $ +// $Author:: Jimdose $ +// $Date:: 29.07.00 10:52p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/g_local.h $ +// +// 18 29.07.00 10:52p Jimdose +// moved radius2 out of server section of gentity_s +// +// 17 29.07.00 10:51p Jimdose +// added radius2 to gentity_t +// +// 16 6/14/00 11:18a Markd +// cleaned up code using Intel compiler +// +// 15 6/01/00 3:18p Markd +// rewrote giveItem and item management in sentient +// +// 14 4/10/00 11:57a Steven +// Moved process init commands to happen before EV_POSTSPAWN. +// +// 13 2/11/00 7:25p Aldie +// Fixed some rope setup problems and fixed some reloading issues with loop +// fire weapons +// +// 12 1/19/00 10:22a Steven +// Increased the sound radius so monsters could hear sounds from a reasonable +// distance. +// +// 11 1/10/00 5:30p Markd +// Removed old TAG_GAME +// +// 10 1/06/00 11:08p Jimdose +// cleaning up unused code +// +// 9 12/17/99 6:35p Jimdose +// changed spawnarg code +// added Level class for spawning and map control +// got rid of unused or superflous variables +// changed setjmp/longjmp calls to try/throw/catch exception handling +// +// 8 12/11/99 3:37p Markd +// q3a gold checkin, first time +// +// 7 10/25/99 6:39p Markd +// removed size and other unused variables, added radius and centroid to both +// server and game code +// +// 6 10/18/99 3:58p Aldie +// Fix for beam endpoints +// +// 5 10/07/99 9:57a Markd +// made fov come out of playerstate not cvar, got rid of timestamp +// +// 4 10/01/99 2:42p Markd +// moved all the binding code back into Entity from Mover +// +// 3 9/16/99 4:50p Jimdose +// removed unused variables +// +// 2 9/13/99 3:30p Jimdose +// merge +// +// 1 9/10/99 10:53a Jimdose +// +// 1 9/08/99 3:16p Aldie +// +// 16 7/07/99 11:26a Steven +// Added some stuff on the sector pathfinding approach. +// +// DESCRIPTION: +// local definitions for game module +// + +#ifndef __G_LOCAL_H__ +#define __G_LOCAL_H__ + +#include "q_shared.h" + +// define GAME_INCLUDE so that game.h does not define the +// short, server-visible gclient_t and gentity_t structures, +// because we define the full size ones in this file +#define GAME_INCLUDE +#include "g_public.h" +#include "bg_public.h" +#include "container.h" +#include "str.h" + +// the "gameversion" client command will print this plus compile date +#define GAMEVERSION "fakk2" + +// times for posting events +// Even though negative times technically don't make sense, the effect is to +// sort events that take place at the start of a map so that they are executed +// in the proper order. For example, spawnargs must occur before any script +// commands take place, while unused entities must be removed before the spawnargs +// are parsed. + +#define EV_REMOVE -11 // remove any unused entities before spawnargs are parsed +#define EV_SPAWNARG -10 // for spawn args passed in by the bsp file +#define EV_LINKDOORS -9 // for finding out which doors are linked together +#define EV_LINKBEAMS -9 // for finding out the endpoints of beams +#define EV_SETUP_ROPEPIECE -8 +#define EV_SETUP_ROPEBASE -7 +#define EV_PROCESS_INIT -6 + +#define EV_POSTSPAWN -1 // for any processing that must occur after all objects are spawned + +#define SOUND_RADIUS 1500 // Sound travel distance for AI + +#define random() ((rand () & 0x7fff) / ((float)0x7fff)) +#define crandom() (2.0 * (random() - 0.5)) + +// predefine Entity so that we can add it to gentity_t without any errors +class Entity; + +// client data that stays across multiple level loads +typedef struct + { + char userinfo[MAX_INFO_STRING]; + char netname[16]; + + // values saved and restored from edicts when changing levels + int health; + int max_health; + + } client_persistant_t; + +// this structure is cleared on each PutClientInServer(), +// except for 'client->pers' +typedef struct gclient_s + { + // known to server + playerState_t ps; // communicated by server to clients + int ping; + + // private to game + client_persistant_t pers; + vec3_t cmd_angles; // angles sent over in the last command + } gclient_t; + +struct gentity_s + { + entityState_t s; // communicated by server to clients + struct gclient_s *client; // NULL if not a player + qboolean inuse; + qboolean linked; // qfalse if not in any good cluster + int linkcount; + + int svflags; // SVF_NOCLIENT, SVF_BROADCAST, etc + + qboolean bmodel; // if false, assume an explicit mins / maxs bounding box + // only set by gi.SetBrushModel + vec3_t mins, maxs; + int contents; // CONTENTS_TRIGGER, CONTENTS_SOLID, CONTENTS_BODY, etc + // a non-solid entity should set to 0 + + vec3_t absmin, absmax; // derived from mins/maxs and origin + rotation + + float radius; // radius of object + vec3_t centroid; // centroid, to be used with radius + int areanum; // areanum needs to be seen inside the game as well + + // currentOrigin will be used for all collision detection and world linking. + // it will not necessarily be the same as the trajectory evaluation for the current + // time, because each entity must be moved one at a time after time is advanced + // to avoid simultanious collision issues + vec3_t currentOrigin; + vec3_t currentAngles; + + int ownerNum; // objects never interact with their owners, to + // prevent player missiles from immediately + // colliding with their owner + + solid_t solid; // Added for FAKK2 + + // DO NOT MODIFY ANYTHING ABOVE THIS, THE SERVER + // EXPECTS THE FIELDS IN THAT ORDER! + + //================================ + + Entity *entity; + float freetime; // svs.time when the object was freed + float spawntime; // svs.time when the object was spawned + + float radius2; // squared radius of object. Used in findradius in g_utils.cpp + + char entname[ 64 ]; + + // GAMEFIX Moved some of the old fields here for the game code. These + // might still be needed or might not :-) + int clipmask; + + gentity_t *next; + gentity_t *prev; + }; + +#include "vector.h" +#include "linklist.h" +#include "class.h" +#include "game.h" +#include "g_main.h" +#include "listener.h" +#include "g_utils.h" +#include "g_spawn.h" +#include "g_phys.h" +#include "debuglines.h" + +#endif // __G_LOCAL_H__ + diff --git a/source/source/fgame/g_main.cpp b/source/source/fgame/g_main.cpp new file mode 100644 index 0000000..d585ca8 --- /dev/null +++ b/source/source/fgame/g_main.cpp @@ -0,0 +1,1989 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/g_main.cpp $ +// $Revision:: 89 $ +// $Author:: Markd $ +// $Date:: 8/08/00 8:34p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/g_main.cpp $ +// +// 89 8/08/00 8:34p Markd +// increased error messages to handle 4k instead of 1024 +// +// 88 7/31/00 1:32a Markd +// added some debugging information +// +// 87 7/29/00 3:13p Markd +// made sure pointers were valid in G_ClientUserinfoChanged +// +// 86 7/28/00 10:07p Markd +// Added archive lightStyles +// +// 85 7/27/00 11:43p Aldie +// Removed statement I accidentally added +// +// 84 7/27/00 10:54p Steven +// Bumped up savegame version. +// +// 83 7/27/00 9:43p Aldie +// Changed dialog for invalid save games +// +// 82 7/27/00 3:03p Markd +// return false on LevelArchiveValid if file doesn't exist +// +// 81 7/27/00 2:05a Markd +// increased savegame_version +// +// 80 7/25/00 9:25p Steven +// Bumped up savegame version. +// +// 79 7/23/00 6:03p Markd +// added fadeout and fadesound to dieing and level change +// +// 78 7/22/00 1:18p Steven +// Bumped up savegame version. +// +// 77 7/19/00 9:20p Steven +// Made the proc Loaded get called for each player after everything has been +// loaded so that some things can be set up correctly. +// +// 76 7/18/00 4:26p Steven +// Bumped up savegame version. +// +// 75 7/17/00 12:36a Markd +// Made sure to close the log file when exiting a level or shutting down a +// server +// +// 74 7/16/00 10:47a Steven +// Bumped up savegame version. +// +// 73 7/15/00 12:49p Steven +// Bumped up savegame version. +// +// 72 7/13/00 8:47p Markd +// reset savegame version and persistant version +// +// 71 7/13/00 3:44p Steven +// Bumped up savegame version. +// +// 70 7/12/00 11:38a Steven +// Bumped up savegame and persistant version. +// +// 69 7/11/00 8:02a Steven +// In G_ClientDisconnect made sure to check that ent is not NULL. +// +// 68 7/10/00 6:34p Aldie +// Added SVF_SENDONCE flag +// +// 67 7/10/00 6:26p Steven +// Bumped up savegame version. +// +// 66 7/09/00 1:43p Markd +// Changed center print for game saved +// +// 65 7/07/00 6:36p Steven +// Bumped up savegame version. +// +// 64 7/06/00 7:48p Markd +// Added LevelArchiveValid function +// +// 63 7/06/00 1:25p Steven +// Bimped savegame version. +// +// 62 7/05/00 9:55p Markd +// Increased savegame and persistant version +// +// 61 7/05/00 7:35p Steven +// Bumped the PERSISTANT_VERSION up. +// +// 60 7/05/00 6:15p Steven +// Bumped up savegame version. +// +// 59 7/01/00 6:07p Steven +// Bumped savegame version. +// +// 58 6/27/00 5:48p Steven +// Bumped savegame version. +// +// 57 6/23/00 8:27p Markd +// increased save game version +// +// 56 6/23/00 11:49a Markd +// fixed various imagindexes and saved games +// +// 55 6/23/00 10:47a Markd +// fixed loading of out of date savegame files +// +// 54 6/22/00 3:45p Markd +// bumped savegame version +// +// 53 6/20/00 7:01p Steven +// Bumped savegame version. +// +// 52 6/19/00 4:13p Markd +// fixed load/save bug with targetnames +// +// 51 6/17/00 11:57a Steven +// Bumped up the savegame version. +// +// 50 6/15/00 8:04p Markd +// Added CleanupGame +// +// 49 6/13/00 3:57p Markd +// Added centerprint message when saving the game +// +// 48 6/13/00 3:44p Steven +// Added alias saving stuff. +// +// 47 6/10/00 4:23p Markd +// rewrote map restarting and loading out of date save games +// +// 46 6/02/00 4:43p Markd +// changed Persistant data to use separate persistant version number instead of +// GAME_API_VERSION number +// +// 45 6/02/00 4:24p Markd +// cleaned up archive functions +// +// 44 6/02/00 2:01p Markd +// Fixed client persistant data issues +// +// 43 5/31/00 3:50p Markd +// fixed precaching issue +// +// 42 5/30/00 7:06p Markd +// saved games 4th pass +// +// 41 5/29/00 1:16p Markd +// 3rd round of saved games +// +// 40 5/26/00 2:24p Aldie +// Added waitforplayer commands so we can use it for cinematics when waiting +// for player to finish holstering +// +// 39 5/25/00 4:28p Markd +// fixed up archive functions +// +// 38 5/16/00 4:11p Markd +// fixed precision on total number of traces +// +// 37 2/26/00 12:58p Jimdose +// added level.restart +// +// 36 2/16/00 6:55p Markd +// increment time at the end of a frame so that player stuff will work properly +// +// 35 2/01/00 4:11p Markd +// Added Frame bounding box support +// +// 34 1/25/00 6:06p Markd +// Put in fix for player movement +// +// 33 1/25/00 4:43p Markd +// cleaned up main routine so that level.settime would be used properly +// +// 32 1/19/00 4:20p Aldie +// Fix for level.fixedframetime +// +// 31 1/15/00 1:39p Markd +// Fixed old command in G_ExitLevel +// +// 30 1/13/00 5:19p Jimdose +// removed clearsavegames +// +// 29 1/10/00 5:27p Markd +// Added DeAllocGameData +// +// 28 1/06/00 11:08p Jimdose +// cleaning up unused code +// +// 27 1/05/00 7:25p Jimdose +// made angle functions all use the same coordinate system +// AngleVectors now returns left instead of right +// no longer need to invert pitch +// +// 26 12/17/99 6:35p Jimdose +// changed spawnarg code +// added Level class for spawning and map control +// got rid of unused or superflous variables +// changed setjmp/longjmp calls to try/throw/catch exception handling +// +// 25 12/11/99 3:37p Markd +// q3a gold checkin, first time +// +// 24 12/10/99 11:52a Aldie +// Adjusted player angles a bit +// +// 23 12/09/99 3:32p Aldie +// Removed a line where player origin was being multiplied by 0.125 +// +// 22 12/01/99 11:26a Aldie +// Couple of fixes for emitters and more ammo stuff +// +// 21 11/12/99 11:47a Markd +// Added sound manager support and retro-fitted TriggerSpeaker and TriggerMusic +// to work with everything +// +// 20 11/04/99 10:03a Markd +// complete overhaul of the camera system +// +// 19 10/27/99 12:19p Markd +// added smooth camera lerping +// +// 18 10/26/99 5:27p Aldie +// Fix for gravpaths +// +// 17 10/25/99 6:39p Markd +// removed size and other unused variables, added radius and centroid to both +// server and game code +// +// 16 10/12/99 2:23p Markd +// Rewrote camera and player movetype system +// +// 15 10/06/99 3:09p Steven +// Added dumpevents command. +// +// 14 10/05/99 5:03p Markd +// Removed un-used game function ClientPredict +// +// 13 10/02/99 6:51p Markd +// Put in backend work for event documentation and fixed a lot of event +// documentation bugs +// +// 12 10/01/99 6:31p Markd +// added commands hidden inside fgame so that they would show up for command +// completion +// +// 11 9/29/99 11:52a Markd +// removed some unused enums and variables form shared headers between cgame +// and fgame +// +// 10 9/28/99 4:26p Markd +// merged listener, class and vector between 3 projects +// +// 9 9/22/99 4:47p Markd +// fixed more G_GetEntity, G_FindClass and G_GetNextEntity bugs +// +// 8 9/21/99 7:51p Markd +// Fixed a lot of entitynum_none issues +// +// 7 9/16/99 4:48p Jimdose +// removed unused code and variables +// rewrote G_ClientConnect for merge +// +// 6 9/16/99 11:18a Markd +// Continuing merge of code, not functional yet but closer +// +// 5 9/15/99 6:57p Aldie +// Update to get game working +// +// 4 9/13/99 4:22p Jimdose +// merge +// +// 3 9/13/99 3:30p Jimdose +// merge +// +// 2 9/10/99 5:45p Jimdose +// merge +// +// 1 9/10/99 10:53a Jimdose +// +// 1 9/08/99 3:16p Aldie +// +// 29 8/28/99 3:23p Markd +// got rid of bulletholes and blood splats +// +// 28 8/27/99 8:25p Markd +// added pengingevents and fixed some event holes +// +// 27 8/19/99 6:18p Markd +// took out con_clearfade stuff from g_main, to be replaced later on with +// proper level restarting +// +// 26 7/07/99 11:25a Steven +// Added some stuff on the sector pathfinding approach. +// +// 25 6/23/99 3:57p Markd +// Added viewthing support +// +// DESCRIPTION: +// + +#define SAVEGAME_VERSION 8 +#define PERSISTANT_VERSION 1 + +#include "g_local.h" +#include "g_utils.h" +#include "gamecmds.h" +#include "Entity.h" +#include "vector.h" +#include "scriptmaster.h" +#include "navigate.h" +#include "player.h" +#include "gravpath.h" +#include "camera.h" +#include "level.h" +#include "viewthing.h" +#include "ipfilter.h" +#include "../qcommon/alias.h" + +Vector vec_origin = "0 0 0"; +Vector vec_zero = "0 0 0"; + +qboolean LoadingSavegame = false; +qboolean LoadingServer = false; +game_import_t gi; +game_export_t globals; + +gentity_t *g_entities = NULL; +gentity_t active_edicts; +gentity_t free_edicts; + +int sv_numtraces; + +usercmd_t *current_ucmd; + +void ( *ServerError )( int level, const char *fmt, ... ); + +/* +=============== +G_Error + +Abort the server with a game error +=============== +*/ +void G_Error + ( + int level, + const char *fmt, + ... + ) + + { + va_list argptr; + char error[ 4096 ]; + + va_start( argptr, fmt ); + vsprintf( error, fmt, argptr ); + va_end( argptr ); + + assert( 0 ); + + throw error; + } + +/* +=============== +G_ExitWithError + +Calls the server's error function with the last error that occurred. +Should only be called after an exception. +=============== +*/ +void G_ExitWithError + ( + const char *error + ) + + { + static char G_ErrorMessage[ 4096 ]; + + //ServerError( ERR_DROP, error ); + + Q_strncpyz( G_ErrorMessage, error, sizeof( G_ErrorMessage ) ); + + globals.error_message = G_ErrorMessage; + } + +/* +================= +G_CleanupGame + +Frees up resources from current level +================= +*/ +void G_CleanupGame + ( + void + ) + + { + try + { + gi.DPrintf ("==== CleanupGame ====\n"); + + level.CleanUp(); + } + + catch( const char *error ) + { + G_ExitWithError( error ); + } + } + +/* +================= +G_ShutdownGame + +Frees up any resources +================= +*/ +void G_ShutdownGame + ( + void + ) + + { + try + { + gi.DPrintf ("==== ShutdownGame ====\n"); + + // close the player log file if necessary + ClosePlayerLogFile(); + + level.CleanUp(); + + L_ShutdownEvents(); + + // destroy the game data + G_DeAllocGameData(); + } + + catch( const char *error ) + { + G_ExitWithError( error ); + } + } + +/* +============ +G_InitGame + +This will be called when the dll is first loaded, which +only happens when a new game is begun +============ +*/ +void G_InitGame + ( + int startTime, + int randomSeed + ) + + { + gi.DPrintf ("==== InitGame ====\n"); + + // Install our own error handler, since we can't + // call the EXE's handler from within a C++ class + ServerError = gi.Error; + gi.Error = G_Error; + + // If we get an error, call the server's error function + try + { + srand( randomSeed ); + + // setup all the cvars the game needs + CVAR_Init(); + + // initialize the game variables + gameVars.ClearList(); + + level.fixedframetime = ( 1.0f / sv_fps->value ); + level.startTime = startTime; + + G_InitConsoleCommands(); + L_InitEvents(); + + sv_numtraces = 0; + + // setup ViewMaster + Viewmodel.Init(); + + game.maxentities = maxentities->integer; + if (maxclients->integer * 8 > game.maxentities) + { + game.maxentities = maxclients->integer * 8; + } + game.maxclients = maxclients->integer; + + G_AllocGameData(); + } + + catch( const char *error ) + { + G_ExitWithError( error ); + } + } + +void G_AllocGameData + ( + void + ) + + { + int i; + + // de-allocate from previous level + G_DeAllocGameData(); + + // Initialize debug lines + G_AllocDebugLines(); + + // initialize all entities for this game + game.maxentities = maxentities->integer; + g_entities = ( gentity_t * )gi.Malloc (game.maxentities * sizeof(g_entities[0]) ); + + // clear out the entities + memset( g_entities, 0, sizeof( g_entities[ 0 ] ) * game.maxentities ); + globals.gentities = g_entities; + globals.max_entities = game.maxentities; + + // Add all the edicts to the free list + LL_Reset( &free_edicts, next, prev ); + LL_Reset( &active_edicts, next, prev ); + for( i = 0; i < game.maxentities; i++ ) + { + LL_Add( &free_edicts, &g_entities[ i ], next, prev ); + } + + // initialize all clients for this game + game.clients = ( gclient_t * )gi.Malloc( game.maxclients * sizeof( game.clients[ 0 ] ) ); + memset( game.clients, 0, game.maxclients * sizeof( game.clients[ 0 ] ) ); + for( i = 0; i < game.maxclients; i++ ) + { + // set client fields on player ents + g_entities[ i ].client = game.clients + i; + + G_InitClientPersistant (&game.clients[i]); + } + globals.num_entities = game.maxclients; + + // Tell the server about our data + gi.LocateGameData( g_entities, globals.num_entities, sizeof( gentity_t ), &game.clients[0].ps, sizeof( game.clients[0] ) ); + } + +void G_DeAllocGameData + ( + void + ) + + { + // Initialize debug lines + G_DeAllocDebugLines(); + + // free up the entities + if ( g_entities ) + { + gi.Free( g_entities ); + g_entities = NULL; + } + + // free up the clients + if ( game.clients ) + { + gi.Free( game.clients ); + game.clients = NULL; + } + } + +void G_SpawnEntities + ( + const char *mapname, + const char *entities, + int levelTime + ) + + { + try + { + level.NewMap( mapname, entities, levelTime ); + } + + catch( const char *error ) + { + G_ExitWithError( error ); + } + } + +void G_ArchivePersistantData + ( + Archiver &arc + ) + { + gentity_t *ed; + int i; + + for( i = 0; i < game.maxclients; i++ ) + { + Entity *ent; + + ed = &g_entities[ i ]; + if ( !ed->inuse || !ed->entity ) + continue; + + ent = ed->entity; + if ( !ent->isSubclassOf( Player ) ) + continue; + ( ( Player * )ent )->ArchivePersistantData( arc ); + } + } + +qboolean G_ArchivePersistant + ( + const char *name, + qboolean loading + ) + + { + int version; + Archiver arc; + + if ( loading ) + { + if ( !arc.Read( name, qfalse ) ) + { + return qfalse; + } + + arc.ArchiveInteger( &version ); + if ( version < PERSISTANT_VERSION ) + { + gi.Printf( "Persistant data from an older version (%d) of FAKK2.\n", version ); + arc.Close(); + return qfalse; + } + else if ( version > PERSISTANT_VERSION ) + { + gi.DPrintf( "Persistnat data from newer version %d of FAKK2.\n", version ); + arc.Close(); + return qfalse; + } + } + else + { + arc.Create( name ); + + version = PERSISTANT_VERSION; + arc.ArchiveInteger( &version ); + } + + + arc.ArchiveObject( &gameVars ); + G_ArchivePersistantData( arc ); + + arc.Close(); + return qtrue; + } + + +qboolean G_ReadPersistant + ( + const char *name + ) + + { + try + { + return G_ArchivePersistant( name, qtrue ); + } + + catch( const char *error ) + { + G_ExitWithError( error ); + } + return qfalse; + } + +/* +============ +G_WritePersistant + +This will be called whenever the game goes to a new level, + +A single player death will automatically restore from the +last save position. +============ +*/ + +void G_WritePersistant + ( + const char *name + ) + + { + try + { + G_ArchivePersistant( name, qfalse ); + } + + catch( const char *error ) + { + G_ExitWithError( error ); + } + } + + +/* +================= +LevelArchiveValid +================= +*/ +qboolean LevelArchiveValid + ( + Archiver &arc + ) + { + int version; + int savegame_version; + + // read the version number + arc.ArchiveInteger( &version ); + arc.ArchiveInteger( &savegame_version ); + + if ( version < GAME_API_VERSION ) + { + gi.Printf( "Savegame from an older version (%d) of FAKK 2.\n", version ); + return qfalse; + } + else if ( version > GAME_API_VERSION ) + { + gi.Printf( "Savegame from version %d of FAKK 2.\n", version ); + return qfalse; + } + + if ( savegame_version < SAVEGAME_VERSION ) + { + gi.Printf( "Savegame from an older version (%d) of FAKK 2.\n", version ); + return qfalse; + } + else if ( savegame_version > SAVEGAME_VERSION ) + { + gi.Printf( "Savegame from version %d of Sin.\n", version ); + return qfalse; + } + return qtrue; + } + + +void ArchiveAliases + ( + Archiver &arc + ) + + { + int i; + byte another; + AliasList_t *alias_list; + AliasListNode_t *alias_node; + AliasActorNode_t *actor_node; + str alias_name; + str model_name; + const char *name; + int model_index; + int actor_number; + int number_of_times_played; + byte been_played_this_loop; + int last_time_played; + + + if ( arc.Saving() ) + { + for( i = 0 ; i < MAX_MODELS ; i++ ) + { + alias_list = (AliasList_t *)gi.Alias_GetList( i ); + + if ( alias_list ) + alias_node = alias_list->data_list; + else + alias_node = NULL; + + if ( alias_node ) + { + name = gi.NameForNum( i ); + + if ( name ) + { + another = true; + arc.ArchiveByte( &another ); + + model_name = name; + arc.ArchiveString( &model_name ); + + // Go through all aliases in this model + + while ( alias_node ) + { + another = true; + arc.ArchiveByte( &another ); + + alias_name = alias_node->alias_name; + + arc.ArchiveString( &alias_name ); + + arc.ArchiveInteger( &alias_node->number_of_times_played ); + arc.ArchiveByte( &alias_node->been_played_this_loop ); + arc.ArchiveInteger( &alias_node->last_time_played ); + + actor_node = alias_node->actor_list; + + // Go through actor info + + while ( actor_node ) + { + another = true; + arc.ArchiveByte( &another ); + + arc.ArchiveInteger( &actor_node->actor_number ); + arc.ArchiveInteger( &actor_node->number_of_times_played ); + arc.ArchiveByte( &actor_node->been_played_this_loop ); + arc.ArchiveInteger( &actor_node->last_time_played ); + + actor_node = actor_node->next; + } + + another = false; + arc.ArchiveByte( &another ); + + alias_node = alias_node->next; + } + + another = false; + arc.ArchiveByte( &another ); + } + } + } + + another = false; + arc.ArchiveByte( &another ); + } + else + { + arc.ArchiveByte( &another ); + + while( another ) + { + arc.ArchiveString( &model_name ); + + model_index = gi.modelindex( model_name.c_str() ); + + arc.ArchiveByte( &another ); + + while( another ) + { + // Read in aliases + + arc.ArchiveString( &alias_name ); + arc.ArchiveInteger( &number_of_times_played ); + arc.ArchiveByte( &been_played_this_loop ); + arc.ArchiveInteger( &last_time_played ); + + gi.Alias_UpdateDialog( model_index, alias_name.c_str(), number_of_times_played, been_played_this_loop, last_time_played ); + + arc.ArchiveByte( &another ); + + while( another ) + { + // Read in actor infos + + arc.ArchiveInteger( &actor_number ); + arc.ArchiveInteger( &number_of_times_played ); + arc.ArchiveByte( &been_played_this_loop ); + arc.ArchiveInteger( &last_time_played ); + + gi.Alias_AddActorDialog( model_index, alias_name.c_str(), actor_number, number_of_times_played, been_played_this_loop, last_time_played ); + + arc.ArchiveByte( &another ); + } + + arc.ArchiveByte( &another ); + } + + arc.ArchiveByte( &another ); + } + } + } + + +/* +================= +G_ArchiveLevel + +================= +*/ +qboolean G_ArchiveLevel + ( + const char *filename, + qboolean autosave, + qboolean loading + ) + + { + try + { + int i; + int num; + Archiver arc; + gentity_t *edict; + + + if ( loading ) + { + LoadingSavegame = true; + LoadingServer = true; + + // Get rid of anything left over from the last level + level.CleanUp(); + + arc.Read( filename ); + + if ( !LevelArchiveValid( arc ) ) + { + arc.Close(); + return qfalse; + } + + // Read in the pending events. These are read in first in case + // later objects need to post events. + L_UnarchiveEvents( arc ); + } + else + { + int temp; + + if ( autosave ) + { + for( i = 0; i < game.maxclients; i++ ) + { + edict = &g_entities[ i ]; + if ( !edict->inuse && !edict->entity ) + { + continue; + } + + delete edict->entity; + } + } + + arc.Create( filename ); + + // write out the version number + temp = GAME_API_VERSION; + arc.ArchiveInteger( &temp ); + temp = SAVEGAME_VERSION; + arc.ArchiveInteger( &temp ); + + // Write out the pending events. These are written first in case + // later objects need to post events when reading the archive. + L_ArchiveEvents( arc ); + } + // archive the game object + arc.ArchiveObject( &game ); + + // archive the game variables + arc.ArchiveObject( &gameVars ); + + // archive Level + arc.ArchiveObject( &level ); + + if ( arc.Loading() ) + { + // Set up for a new map + PathManager.Init( level.mapname.c_str() ); + } + + // archive script librarian + arc.ArchiveObject( &ScriptLib ); + + // archive gravity paths + arc.ArchiveObject( &gravPathManager ); + + // archive camera paths + arc.ArchiveObject( &CameraMan ); + + // archive paths + arc.ArchiveObject( &PathManager ); + + // archive script controller + arc.ArchiveObject( &Director ); + + // archive lightstyles + arc.ArchiveObject( &lightStyles ); + + if ( arc.Saving() ) + { + // count the entities + num = 0; + for( i = 0; i < globals.num_entities; i++ ) + { + edict = &g_entities[ i ]; + if ( edict->inuse && edict->entity && !( edict->entity->flags & FL_DONTSAVE ) ) + { + num++; + } + } + } + + // archive all the entities + arc.ArchiveInteger( &globals.num_entities ); + arc.ArchiveInteger( &num ); + + if ( arc.Saving() ) + { + // write out the world + arc.ArchiveObject( world ); + + for( i = 0; i < globals.num_entities; i++ ) + { + edict = &g_entities[ i ]; + if ( !edict->inuse || !edict->entity || ( edict->entity->flags & FL_DONTSAVE ) ) + { + continue; + } + + arc.ArchiveObject( edict->entity ); + } + } + else + { + // Tell the server about our data + gi.LocateGameData( g_entities, globals.num_entities, sizeof( gentity_t ), &game.clients[0].ps, sizeof( game.clients[0] ) ); + + // read in the world + arc.ReadObject(); + + for( i = 0; i < num; i++ ) + { + arc.ReadObject(); + } + } + + ArchiveAliases( arc ); + + arc.Close(); + + if ( arc.Loading() ) + { + LoadingSavegame = false; + + // call the precache scripts + level.Precache(); + } + else + { + gi.centerprintf( &g_entities[ 0 ], "@textures/menu/gamesaved" ); + } + + if ( arc.Loading() ) + { + // Make sure all code that needs to setup the player after they have been loaded is run + + for( i = 0; i < game.maxclients; i++ ) + { + edict = &g_entities[ i ]; + + if ( edict->inuse && edict->entity ) + { + Player *player = (Player *)edict->entity; + player->Loaded(); + } + } + } + + return qtrue; + } + + catch( const char *error ) + { + G_ExitWithError( error ); + } + return qfalse; + } + +/* +================= +G_WriteLevel + +================= +*/ +void G_WriteLevel + ( + const char *filename, + qboolean autosave + ) + + { + game.autosaved = autosave; + G_ArchiveLevel( filename, autosave, qfalse ); + game.autosaved = false; + } + +/* +================= +G_ReadLevel + +SpawnEntities will already have been called on the +level the same way it was when the level was saved. + +That is necessary to get the baselines set up identically. + +The server will have cleared all of the world links before +calling ReadLevel. + +No clients are connected yet. +================= +*/ +qboolean G_ReadLevel + ( + const char *filename + ) + + { + qboolean status; + + status = G_ArchiveLevel( filename, qfalse, qtrue ); + // if the level load failed make sure that these variables are not set + if ( !status ) + { + LoadingSavegame = false; + LoadingServer = false; + } + return status; + } + +/* +================= +G_LevelArchiveValid +================= +*/ +qboolean G_LevelArchiveValid + ( + const char *filename + ) + { + try + { + qboolean ret; + + Archiver arc; + + if ( !arc.Read( filename ) ) + { + return qfalse; + } + + ret = LevelArchiveValid( arc ); + + arc.Close(); + + return ret; + } + + catch( const char *error ) + { + G_ExitWithError( error ); + return qfalse; + } + } + + +/* +================= +GetGameAPI + +Returns a pointer to the structure with all entry points +and global variables +================= +*/ +game_export_t *GetGameAPI + ( + game_import_t *import + ) + + { + gi = *import; + + globals.apiversion = GAME_API_VERSION; + globals.Init = G_InitGame; + globals.Shutdown = G_ShutdownGame; + globals.Cleanup = G_CleanupGame; + globals.SpawnEntities = G_SpawnEntities; + + globals.WritePersistant = G_WritePersistant; + globals.ReadPersistant = G_ReadPersistant; + globals.WriteLevel = G_WriteLevel; + globals.ReadLevel = G_ReadLevel; + globals.LevelArchiveValid = G_LevelArchiveValid; + + globals.ClientThink = G_ClientThink; + globals.ClientConnect = G_ClientConnect; + globals.ClientUserinfoChanged = G_ClientUserinfoChanged; + globals.ClientDisconnect = G_ClientDisconnect; + globals.ClientBegin = G_ClientBegin; + globals.ClientCommand = G_ClientCommand; + + globals.ConsoleCommand = G_ConsoleCommand; + globals.RunFrame = G_RunFrame; + + globals.gentitySize = sizeof(gentity_t); + globals.error_message = NULL; + + return &globals; + } + +/* +================= +G_ClientEndServerFrames +================= +*/ +void G_ClientEndServerFrames + ( + void + ) + + { + int i; + gentity_t *ent; + + // calc the player views now that all pushing + // and damage has been added + for( i = 0; i < maxclients->integer; i++ ) + { + ent = g_entities + i; + if ( !ent->inuse || !ent->client || !ent->entity ) + { + continue; + } + + ent->entity->ProcessEvent( EV_ClientEndFrame ); + } + } + +void G_MoveClientToIntermission + ( + Entity *ent + ) + + { + } + +void G_BeginIntermission + ( + const char *map + ) + + { + gentity_t *client; + Entity *ent; + Entity *path; + int i; + Event *event; + + assert( map ); + if ( !map ) + { + gi.DPrintf( "G_BeginIntermission : Null map name\n" ); + return; + } + + if ( level.intermissiontime ) + { + // already activated + return; + } + + if ( deathmatch->integer ) + { + level.intermissiontime = level.time + 5.0f; + } + else + { + level.intermissiontime = level.time + 1.0f; + G_FadeOut( 1 ); + G_FadeSound( 1 ); + } + + level.nextmap = map; + + // find an intermission spot + ent = G_FindClass( NULL, "info_player_intermission" ); + + // Only do the camera stuff if the node exists. + if ( ent ) + { + SetCamera( ent, CAMERA_SWITCHTIME ); + event = new Event( EV_Camera_Orbit ); + + // Find the end node + path = G_FindTarget( NULL, "endnode1" ); + if ( path ) + { + event->AddEntity( path ); + ent->ProcessEvent( event ); + event = new Event( EV_Camera_Cut ); + ent->ProcessEvent( event ); + } + } + + // Display scores for all the clients + for( i = 0; i < maxclients->integer; i++ ) + { + client = g_entities + i; + if ( !client->inuse ) + { + continue; + } + + ent = G_GetEntity( client->s.number ); + G_MoveClientToIntermission( ent ); + } + + // tell the script that the player's not ready so that if we return to this map, + // we can do something about it. + Director.PlayerNotReady(); + } + +/* +============= +G_ExitLevel +============= +*/ +void G_ExitLevel + ( + void + ) + + { + char command[ 256 ]; + int j; + gentity_t *ent; + + // close the player log file if necessary + ClosePlayerLogFile(); + + // kill the sounds + Com_sprintf( command, sizeof( command ), "stopsound\n" ); + gi.SendConsoleCommand( command ); + + Com_sprintf( command, sizeof( command ), "gamemap \"%s\"\n", level.nextmap.c_str() ); + gi.SendConsoleCommand( command ); + + level.nextmap = ""; + + level.exitintermission = 0; + level.intermissiontime = 0; + + // Tell all the client that the level is done + for( j = 0; j < game.maxclients; j++ ) + { + ent = &g_entities[ j ]; + if ( !ent->inuse || !ent->entity ) + { + continue; + } + + ent->entity->ProcessEvent( EV_Player_EndLevel ); + } + + G_ClientEndServerFrames(); + + // tell the script that the player's not ready so that if we return to this map, + // we can do something about it. + Director.PlayerNotReady(); + } + +/* +================ +G_RunFrame + +Advances the world by 0.1 seconds +================ +*/ +void G_RunFrame + ( + int levelTime, + int frameTime + ) + + { + gentity_t *edict; + Entity *ent; + int num; + qboolean showentnums; + int start; + int end; + + try + { + if ( level.restart ) + { + level.Restart(); + } +#if 0 + { + int i, num; + + num = 0; + edict = g_entities; + for ( i = maxclients->integer; i < globals.num_entities; i++, edict++ ) + { + // the first couple seconds of server time can involve a lot of + // freeing and allocating, so relax the replacement policy + if ( + edict->inuse + ) + { + num++; + } + } + + Com_Printf( "num_entities = %d\n", num ); + } +#endif + + level.setTime( levelTime, frameTime ); + + if ( g_showmem->integer ) + { + DisplayMemoryUsage(); + } + + // exit intermissions + if ( level.exitintermission ) + { + G_ExitLevel(); + return; + } + + path_checksthisframe = 0; + + // Reset debug lines + G_InitDebugLines(); + + // testing coordinate system + if ( csys_draw->integer ) + { + G_DrawCSystem(); + } + + PathManager.ShowNodes(); + + // don't show entnums during deathmatch + showentnums = ( sv_showentnums->integer && ( !deathmatch->integer || sv_cheats->integer ) ); + + // Wake up any monsters in the area + AI_TargetPlayer(); + + // Process most of the events before the physics are run + // so that we can affect the physics immediately + L_ProcessPendingEvents(); + + // + // treat each object in turn + // + for( edict = active_edicts.next, num = 0; edict != &active_edicts; edict = level.next_edict, num++ ) + { + assert( edict ); + assert( edict->inuse ); + assert( edict->entity ); + + level.next_edict = edict->next; + + // Paranoia - It's a way of life + assert( num <= MAX_GENTITIES ); + if ( num > MAX_GENTITIES ) + { + gi.DPrintf( "Possible infinite loop in G_RunFrame.\n"); + break; + } + + ent = edict->entity; + if ( g_timeents->integer ) + { + start = gi.Milliseconds(); + G_RunEntity( ent ); + end = gi.Milliseconds(); + + if ( g_timeents->value <= ( end - start ) ) + { + gi.DebugPrintf( "%d: '%s'(%d) : %d\n", level.framenum, ent->targetname.c_str(), ent->entnum, end - start ); + } + } + else + { + G_RunEntity( ent ); + } + + if ( ( edict->svflags & SVF_SENDONCE ) && ( edict->svflags & SVF_SENT ) ) + { + // Entity has been sent once, and is marked as such, then remove it + ent->PostEvent( EV_Remove, 0 ); + } + + if ( showentnums ) + { + G_DrawDebugNumber( ent->origin + Vector( 0, 0, ent->maxs.z + 2 ), ent->entnum, 2, 1, 1, 0 ); + } + } + + // Process any pending events that got posted during the physics code. + L_ProcessPendingEvents(); + + // build the playerstate_t structures for all players + G_ClientEndServerFrames(); + + // see if we should draw the bounding boxes + G_ClientDrawBoundingBoxes(); + + // show how many traces the game code is doing + if ( sv_traceinfo->integer ) + { + if ( sv_traceinfo->integer == 3 ) + { + gi.DebugPrintf( "%0.2f : Total traces %d\n", level.time, sv_numtraces ); + } + else + { + gi.DPrintf( "%0.2f : Total traces %d\n", level.time, sv_numtraces ); + } + } + + // reset out count of the number of game traces + sv_numtraces = 0; + + level.framenum++; + + // we increment time so that events that occurr before we think again are automatically on the next frame + levelTime += frameTime; + level.setTime( levelTime, frameTime ); + } + + catch( const char *error ) + { + G_ExitWithError( error ); + } + } + +void G_ClientThink + ( + gentity_t *ent, + usercmd_t *ucmd + ) + + { + try + { + if ( ent->entity ) + { + current_ucmd = ucmd; + ent->entity->ProcessEvent( EV_ClientMove ); + current_ucmd = NULL; + } + } + + catch( const char *error ) + { + G_ExitWithError( error ); + } + } + +/* +=========== +G_ClientBegin + +called when a client has finished connecting, and is ready +to be placed into the game. This will happen every level load. +============ +*/ +void G_ClientBegin + ( + gentity_t *ent, + usercmd_t *cmd + ) + + { + try + { + if ( ent->inuse && ent->entity ) + { + // the client has cleared the client side viewangles upon + // connecting to the server, which is different than the + // state when the game is saved, so we need to compensate + // with deltaangles + ent->entity->SetDeltaAngles(); + } + else + { + Player *player; + + // a spawn point will completely reinitialize the entity + level.spawn_entnum = ent->s.number; + player = new Player; + } + + if ( level.intermissiontime && ent->entity ) + { + G_MoveClientToIntermission( ent->entity ); + } + else + { + // send effect if in a multiplayer game + if ( game.maxclients > 1 ) + { + gi.Printf ( "%s entered the game\n", ent->client->pers.netname ); + } + } + + // make sure all view stuff is valid + if ( ent->entity ) + { + ent->entity->ProcessEvent( EV_ClientEndFrame ); + + if ( !Director.PlayerReady() ) + { + // let any threads waiting on us know they can go ahead + Director.PlayerSpawned(); + } + } + } + + catch( const char *error ) + { + G_ExitWithError( error ); + } + } + +/* +=========== +G_ClientUserInfoChanged + +called whenever the player updates a userinfo variable. + +The game can override any of the settings in place +(forcing skins or names, etc) before copying it off. +============ +*/ +void G_ClientUserinfoChanged + ( + gentity_t *ent, + const char *userinfo + ) + + { + const char *s; + int playernum; + Player *player; + float fov; + Event *ev; + + try + { + if ( !ent ) + { + assert( 0 ); + return; + } + + player = ( Player * )ent->entity; + + if ( !player ) + { + assert( 0 ); + return; + } + + // set name + s = Info_ValueForKey( userinfo, "name" ); + if ( !s ) + { + assert( 0 ); + return; + } + strncpy( ent->client->pers.netname, s, sizeof( ent->client->pers.netname ) - 1 ); + + // send over a subset of the userinfo keys so other clients can + // print scoreboards, display models, and play custom sounds + playernum = ent - g_entities; + gi.setConfigstring( CS_PLAYERS + playernum, va( "name\\%s", ent->client->pers.netname ) ); + + // Fov + if ( player ) + { + fov = atof( Info_ValueForKey( userinfo, "fov" ) ); + if ( fov < 1 ) + { + fov = 90; + } + else if ( fov > 160 ) + { + fov = 160; + } + ev = new Event( EV_Player_Fov ); + ev->AddFloat( fov ); + player->ProcessEvent( ev ); + } + + // save off the userinfo in case we want to check something later + strncpy( ent->client->pers.userinfo, userinfo, sizeof( ent->client->pers.userinfo ) - 1 ); + } + + catch( const char *error ) + { + G_ExitWithError( error ); + } + } + +/* +=========== +ClientConnect + +Called when a player begins connecting to the server. +Called again for every map change or tournement restart. + +The session information will be valid after exit. + +Return NULL if the client should be allowed, otherwise return +a string with the reason for denial. + +Otherwise, the client will be sent the current gamestate +and will eventually get to ClientBegin. + +firstTime will be qtrue the very first time a client connects +to the server machine, but qfalse on map changes and tournement +restarts. +============ +*/ +char *G_ClientConnect + ( + int clientNum, + qboolean firstTime + ) + + { + const char *value; + gentity_t *ent; + char userinfo[ MAX_INFO_STRING ]; + gclient_t *client; + + try + { + ent = &g_entities[ clientNum ]; + gi.getUserinfo( clientNum, userinfo, sizeof( userinfo ) ); + + // check to see if they are on the banned IP list + value = Info_ValueForKey( userinfo, "ip" ); + if ( SV_FilterPacket( value ) ) + { + return "Banned IP"; + } + + // check for a password + value = Info_ValueForKey( userinfo, "password" ); + if ( strcmp( password->string, value ) != 0 ) + { + return "Invalid password"; + } + + // they can connect + ent->client = game.clients + clientNum; + client = ent->client; + + // read or initialize the session data + // if there is already a body waiting for us (a loadgame), just + // take it, otherwise spawn one from scratch + if ( firstTime ) + { + memset( client, 0, sizeof( *client ) ); + + // clear the respawning variables + if ( !game.autosaved ) + { + G_InitClientPersistant( client ); + } + } + + G_ClientUserinfoChanged( ent, userinfo ); + + if ( firstTime && game.maxclients > 1 ) + { + gi.Printf( "%s connected\n", ent->client->pers.netname ); + } + + LoadingServer = false; + } + + catch( const char *error ) + { + G_ExitWithError( error ); + } + + return NULL; + } + +/* +=========== +G_ClientDisconnect + +called when a player drops from the server + +============ +*/ +void G_ClientDisconnect + ( + gentity_t *ent + ) + + { + try + { + if ( !ent || ( !ent->client ) || ( !ent->entity ) ) + { + return; + } + + delete ent->entity; + ent->entity = NULL; + } + + catch( const char *error ) + { + G_ExitWithError( error ); + } + } + +/* +================= +G_ClientDrawBoundingBoxes +================= +*/ +void G_ClientDrawBoundingBoxes + ( + void + ) + + { + gentity_t *edict; + Entity *ent; + Vector eye; + + // don't show bboxes during deathmatch + if ( ( !g_showgravpath->integer && !sv_showbboxes->integer ) || ( deathmatch->integer && !sv_cheats->integer ) ) + { + return; + } + + if ( sv_showbboxes->integer ) + { + edict = g_entities; + ent = edict->entity; + if ( ent ) + { + eye = ent->origin; + ent = findradius( NULL, eye, 1000 ); + while( ent ) + { + switch ((int)sv_showbboxes->integer) + { + case 1: + if ( ent->edict != edict && ent->edict->s.solid) + { + G_DebugBBox( ent->origin, ent->mins, ent->maxs, 1, 1, 0, 1 ); + } + break; + case 2: + if ( ent->edict != edict && ent->edict->s.solid) + { + G_DebugBBox( vec_zero, ent->edict->absmin, ent->edict->absmax, 1, 0, 1, 1 ); + } + break; + case 3: + if ( ent->edict->s.modelindex && !(ent->edict->s.renderfx & RF_DONTDRAW) ) + G_DebugBBox( ent->origin, ent->mins, ent->maxs, 1, 1, 0, 1 ); + break; + case 4: + G_DebugBBox( ent->origin, ent->mins, ent->maxs, 1, 1, 0, 1 ); + break; + case 5: + default: + if ( ent->isSubclassOf( Animate ) && gi.IsModel( ent->edict->s.modelindex ) ) + { + Animate * anim; + vec3_t mins, maxs; + + anim = ( Animate * )ent; + gi.Frame_Bounds( ent->edict->s.modelindex, anim->CurrentAnim(), anim->CurrentFrame(), ent->edict->s.scale, mins, maxs ); + G_DebugBBox( ent->origin, mins, maxs, 0, 1, 0, 1 ); + } + else + { + G_DebugBBox( ent->origin, ent->mins, ent->maxs, 1, 1, 0, 1 ); + } + break; + } + ent = findradius( ent, eye, 1000 ); + } + } + } + + if ( g_showgravpath->integer ) + { + // Draw the gravity node paths + gravPathManager.DrawGravPaths(); + } + } + +//====================================================================== + +#ifndef GAME_HARD_LINKED +// this is only here so the functions in q_shared.c and q_shwin.c can link +void Com_Error ( int level, const char *error, ... ) { + va_list argptr; + char text[4096]; + + va_start (argptr, error); + vsprintf (text, error, argptr); + va_end (argptr); + + gi.Error( level, "%s", text); +} + +void Sys_Error + ( + const char *error, + ... + ) + + { + va_list argptr; + char text[4096]; + + va_start (argptr, error); + vsprintf (text, error, argptr); + va_end (argptr); + + gi.Error (ERR_FATAL, "%s", text); + } + +void Com_Printf + ( + const char *msg, + ... + ) + + { + va_list argptr; + char text[4096]; + + va_start (argptr, msg); + vsprintf (text, msg, argptr); + va_end (argptr); + + gi.DPrintf ("%s", text); + } + +#endif diff --git a/source/source/fgame/g_main.h b/source/source/fgame/g_main.h new file mode 100644 index 0000000..e8b8f95 --- /dev/null +++ b/source/source/fgame/g_main.h @@ -0,0 +1,142 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/g_main.h $ +// $Revision:: 16 $ +// $Author:: Markd $ +// $Date:: 7/17/00 12:36a $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/g_main.h $ +// +// 16 7/17/00 12:36a Markd +// Made sure to close the log file when exiting a level or shutting down a +// server +// +// 15 7/06/00 7:48p Markd +// Added LevelArchiveValid function +// +// 14 6/15/00 8:04p Markd +// Added CleanupGame +// +// 13 6/14/00 2:17p Markd +// fixed compiler warnings for Intel Compiler +// +// 12 6/14/00 11:18a Markd +// cleaned up code using Intel compiler +// +// 11 6/10/00 4:23p Markd +// rewrote map restarting and loading out of date save games +// +// 10 6/02/00 4:26p Markd +// renamed ReadGame functions to ReadPersistant +// +// 9 1/10/00 5:33p Markd +// Added DeallocGameData +// +// 8 1/06/00 11:08p Jimdose +// cleaning up unused code +// +// 7 12/17/99 6:35p Jimdose +// changed spawnarg code +// added Level class for spawning and map control +// got rid of unused or superflous variables +// changed setjmp/longjmp calls to try/throw/catch exception handling +// +// 6 12/11/99 3:37p Markd +// q3a gold checkin, first time +// +// 5 12/10/99 11:52a Aldie +// Adjusted player angles a bit +// +// 4 12/01/99 11:26a Aldie +// Couple of fixes for emitters and more ammo stuff +// +// 3 10/05/99 5:03p Markd +// Removed un-used game function ClientPredict +// +// 2 9/16/99 4:50p Jimdose +// removed unused variables +// changed G_ClientConnect +// +// 1 9/10/99 10:53a Jimdose +// +// 1 9/08/99 3:16p Aldie +// +// 7 8/28/99 3:24p Markd +// got rid of maxbulletholes and max bloodsplats +// +// DESCRIPTION: +// Global header file for g_main.cpp +// + +#ifndef __G_MAIN_H__ +#define __G_MAIN_H__ + +#include "g_local.h" +#include "gamecvars.h" +#include "level.h" + +extern Vector vec_origin; +extern Vector vec_zero; + +extern qboolean LoadingSavegame; +extern qboolean LoadingServer; + +extern game_import_t gi; +extern game_export_t globals; + +extern gentity_t *g_entities; +extern gentity_t active_edicts; +extern gentity_t free_edicts; + +extern int sv_numtraces; + +extern usercmd_t *current_ucmd; + +#define DM_FLAG( flag ) ( deathmatch->integer && ( ( int )dmflags->integer & ( flag ) ) ) + +void G_BeginIntermission( const char *map ); +void G_MoveClientToIntermission( Entity *client ); +void G_WriteClient( Archiver &arc, gclient_t *client ); +void G_AllocGameData( void ); +void G_DeAllocGameData( void ); +void G_ClientDrawBoundingBoxes( void ); + +void G_ExitWithError( const char *error ); + +extern "C" { + void G_SpawnEntities( const char *mapname, const char *entities, int time ); + void G_ClientEndServerFrames( void ); + void G_ClientThink( gentity_t *ent, usercmd_t *cmd ); + char *G_ClientConnect( int clientNum, qboolean firstTime ); + void G_ClientUserinfoChanged( gentity_t *ent, const char *userinfo ); + void G_ClientDisconnect( gentity_t *ent ); + void G_ClientBegin( gentity_t *ent, usercmd_t *cmd ); + void G_WritePersistant( const char *filename ); + qboolean G_ReadPersistant( const char *filename ); + void G_WriteLevel( const char *filename, qboolean autosave ); + qboolean G_ReadLevel( const char *filename ); + qboolean G_LevelArchiveValid( const char *filename ); + void G_InitGame( int startTime, int randomSeed ); + void G_ShutdownGame( void ); + void G_CleanupGame( void ); + void G_RunFrame( int levelTime, int frametime ); + void G_ServerCommand( void ); + void G_ClientThink( gentity_t *ent, usercmd_t *ucmd ); + } + +void ClosePlayerLogFile( void ); + +qboolean SV_FilterPacket( const char *from ); +void SVCmd_AddIP_f( void ); +void SVCmd_RemoveIP_f( void ); +void SVCmd_ListIP_f( void ); +void SVCmd_WriteIP_f( void ); + +#endif /* g_main.h */ + diff --git a/source/source/fgame/g_phys.cpp b/source/source/fgame/g_phys.cpp new file mode 100644 index 0000000..b9ac8f1 --- /dev/null +++ b/source/source/fgame/g_phys.cpp @@ -0,0 +1,1673 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/g_phys.cpp $ +// $Revision:: 33 $ +// $Author:: Markd $ +// $Date:: 6/30/00 10:45a $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/g_phys.cpp $ +// +// 33 6/30/00 10:45a Markd +// added MOVETYPE_STATIONARY and revamped some physics +// +// 32 6/26/00 3:32p Markd +// changed aliases for entering and leaving water +// +// 31 6/17/00 4:04p Steven +// Fixed a bug in G_Impact that wasn't allowing entities with +// CONTENTS_SHOOTABLE_ONLY from hitting things. +// +// 30 6/16/00 7:37p Markd +// fixed some physics code +// +// 29 6/16/00 6:50p Steven +// Made G_Push not block when running into shootable only things. +// +// 28 6/14/00 3:50p Markd +// Cleaned up more Intel Compiler warnings +// +// 27 4/29/00 11:28a Markd +// removed old rope code, cleaned up rope interface +// +// 26 4/24/00 6:20p Markd +// removed touch code for gibs and movetype_bounce since it was unnecessary +// +// 25 4/21/00 3:01p Markd +// Added EV_Touch support to gibs and bounce physics +// +// 24 4/10/00 11:17a Markd +// added new rope code +// +// 23 4/01/00 3:55p Markd +// Added FL_TOUCH_TRIGGERS support +// +// 22 4/01/00 3:45p Markd +// added FL_TOUCH_TRIGGERS flag and implementation +// +// 21 3/23/00 6:22p Aldie +// Added a continue for moving not solid objects +// +// 20 3/21/00 5:06p Markd +// added vehicle support +// +// 19 3/17/00 3:59p Steven +// G_Push now ignores entities with a content type of CONTENTS_CORPSE. +// +// 18 2/26/00 11:22a Steven +// Added partial immobile flag. +// +// 17 2/09/00 10:38a Steven +// Made G_Physics_Step actually use the actor's clipmask. +// +// 16 1/29/00 12:33p Jimdose +// G_Impact no longer sends touch events to world +// Removed ImpactDamage +// +// 15 1/22/00 12:42p Jimdose +// got rid of calls to vec3() +// +// 14 1/12/00 4:31p Steven +// Added new movetype MOVETYPE_GIB. +// +// 13 1/05/00 3:07p Jimdose +// changed call to AnglesToMat to AnglesToAxis +// +// 12 1/05/00 1:49p Steven +// Stop entities from spinning after they bounce on the ground (doing this so +// gibs will land correctly). +// +// 11 12/17/99 8:26p Jimdose +// got rid of unused vars and functions +// +// 10 12/01/99 3:44p Steven +// Changed the mask of dead actors to MASK_DEADSOLID from MASK_MONSTERSOLID. +// +// 9 10/28/99 10:42a Aldie +// Added rope functions +// +// 8 10/27/99 10:28a Steven +// Stopped running physics on an entity that has been immobilized. +// +// 7 10/22/99 3:29p Jimdose +// added G_FixEntityPosition +// added better entity pushing that doesn't get stuck as often +// +// 6 10/14/99 5:08p Markd +// removed a lot of G_GetMoveDir calls from the initialization code +// +// 5 10/06/99 12:35p Markd +// Removed Mover casts and fixed Push bug +// +// 4 9/17/99 4:54p Aldie +// Fix for parent +// +// 3 9/16/99 4:48p Jimdose +// removed unused code +// +// 2 9/16/99 11:18a Markd +// Continuing merge of code, not functional yet but closer +// +// 1 9/10/99 10:53a Jimdose +// +// 1 9/08/99 3:16p Aldie +// +// 21 9/01/99 6:48p Markd +// added no physics for entities that are attached to others +// +// 20 8/28/99 6:44p Jimdose +// clients now get their view rotated when pushed by rotating objects +// +// 19 8/28/99 11:44a Steven +// Removed global from sound function calls. +// +// 18 8/18/99 3:28p Jimdose +// added cylindrical collision detection +// +// 17 7/06/99 8:33p Jimdose +// removed unused player code +// added state machine for player animation +// +// DESCRIPTION: +// + +#include "g_local.h" +#include "animate.h" +#include "sentient.h" +#include "actor.h" +#include "rope.h" + +/* + + +pushmove objects do not obey gravity, and do not interact with each other or trigger fields, but block normal movement and push normal objects when they move. + +onground is set for toss objects when they come to a complete rest. it is set for steping or walking objects + +doors, plats, etc are SOLID_BSP, and MOVETYPE_PUSH +bonus items are SOLID_TRIGGER touch, and MOVETYPE_TOSS +corpses are SOLID_NOT and MOVETYPE_TOSS +crates are SOLID_BBOX and MOVETYPE_TOSS +walking monsters are SOLID_SLIDEBOX and MOVETYPE_STEP +flying/floating monsters are SOLID_SLIDEBOX and MOVETYPE_FLY + +solid_edge items only clip against bsp models. + +*/ + +typedef struct + { + Entity *ent; + Vector localorigin; + Vector origin; + Vector localangles; + Vector angles; + float deltayaw; + } pushed_t; + +pushed_t pushed[ MAX_GENTITIES ]; +pushed_t *pushed_p; + +Entity *obstacle; + +/* +============ +G_FixEntityPosition + +============ +*/ +Entity *G_FixEntityPosition + ( + Entity *ent + ) + + { + int mask; + trace_t trace; + Vector start; + + mask = ent->edict->clipmask; + if ( !mask ) + { + mask = MASK_SOLID; + } + + start = ent->origin; + start.z += 8; + if ( ent->client ) + { + trace = G_Trace( start, ent->mins, ent->maxs, ent->origin, ent, mask, true, "G_TestEntityPosition1" ); + } + else + { + trace = G_Trace( start, ent->mins, ent->maxs, ent->origin, ent, mask, false, "G_TestEntityPosition2" ); + } + + if ( trace.startsolid ) + { + //return g_entities->entity; + assert( trace.ent ); + assert( trace.ent->entity ); + return trace.ent->entity; + } + + ent->setOrigin( trace.endpos ); + + return NULL; + } + + +/* +============ +G_TestEntityPosition + +============ +*/ +Entity *G_TestEntityPosition + ( + Entity *ent + ) + + { + int mask; + trace_t trace; + + mask = ent->edict->clipmask; + if ( !mask ) + mask = MASK_SOLID; + + if ( ent->client ) + { + trace = G_Trace( ent->origin, ent->mins, ent->maxs, ent->origin, ent, mask, true, "G_TestEntityPosition1" ); + } + else + { + trace = G_Trace( ent->origin, ent->mins, ent->maxs, ent->origin, ent, mask, false, "G_TestEntityPosition2" ); + } + + if ( trace.startsolid ) + { + //return g_entities->entity; + assert( trace.ent ); + assert( trace.ent->entity ); + return trace.ent->entity; + } + + return NULL; + } + + +/* +================ +G_CheckVelocity +================ +*/ +void G_CheckVelocity + ( + Entity *ent + ) + + { + int i; + + // + // bound velocity + // + for( i = 0; i < 3; i++ ) + { + if ( ent->velocity[ i ] > sv_maxvelocity->value ) + { + ent->velocity[ i ] = sv_maxvelocity->value; + } + else if ( ent->velocity[ i ] < -sv_maxvelocity->value ) + { + ent->velocity[ i ] = -sv_maxvelocity->value; + } + } + } + +/* +================== +G_Impact + +Two entities have touched, so run their touch functions +================== +*/ +void G_Impact + ( + Entity *e1, + trace_t *trace + ) + + { + gentity_t *e2; + Event *ev; + + e2 = trace->ent; + + level.impact_trace = *trace; + + // touch anything, including the world + if ( e1->edict->solid != SOLID_NOT ) + { + ev = new Event( EV_Touch ); + ev->AddEntity( e2->entity ); + e1->ProcessEvent( ev ); + } + + // entity could have been removed, so check if he's in use before sending the event + if ( + e2->entity && + ( e2->solid != SOLID_NOT ) && + ( !( e2->contents & CONTENTS_SHOOTABLE_ONLY ) ) && + ( e2->entity != world ) + ) + { + ev = new Event( EV_Touch ); + ev->AddEntity( e1 ); + e2->entity->ProcessEvent( ev ); + } + + memset( &level.impact_trace, 0, sizeof( level.impact_trace ) ); + } + +/* +================== +G_ClipVelocity + +Slide off of the impacting object +returns the blocked flags (1 = floor, 2 = step / wall) +================== +*/ +#define STOP_EPSILON 0.1 + +int G_ClipVelocity + ( + Vector& in, + Vector& normal, + Vector& out, + float overbounce + ) + + { + int i; + int blocked; + float backoff; + + blocked = 0; + + if ( normal[ 2 ] > 0 ) + { + // floor + blocked |= 1; + } + if ( !normal[ 2 ] ) + { + // step + blocked |= 2; + } + + backoff = ( in * normal ) * overbounce; + + out = in - normal * backoff; + for( i = 0; i < 3; i++ ) + { + if ( out[ i ] > -STOP_EPSILON && out[ i ] < STOP_EPSILON ) + { + out[ i ] = 0; + } + } + + return blocked; + } + + +/* +============ +G_FlyMove + +The basic solid body movement clip that slides along multiple planes +Returns the clipflags if the velocity was modified (hit something solid) +1 = floor +2 = wall / step +4 = dead stop +============ +*/ +#define MAX_CLIP_PLANES 5 + +int G_FlyMove + ( + Entity *ent, + Vector basevel, + float time, + int mask + ) + + { + Entity *hit; + gentity_t *edict; + int bumpcount, numbumps; + Vector dir; + float d; + int numplanes; + vec3_t planes[ MAX_CLIP_PLANES ]; + Vector primal_velocity, original_velocity, new_velocity; + int i, j; + trace_t trace; + Vector end; + float time_left; + int blocked; +#if 0 + Vector move; + Vector v; +#endif + + edict = ent->edict; + + numbumps = 4; + + blocked = 0; + original_velocity = ent->velocity; + primal_velocity = ent->velocity; + numplanes = 0; + +#if 1 + time_left = time; +#else + time_left = 1.0;//time; + + v = ent->total_delta; + v[ 1 ] = -v[ 1 ]; // sigh... + MatrixTransformVector( v, ent->orientation, move ); + move += ent->velocity * time; + ent->total_delta = vec_zero; +#endif + + ent->groundentity = NULL; + for( bumpcount = 0; bumpcount < numbumps; bumpcount++ ) + { +#if 1 + end = ent->origin + time_left * ( ent->velocity + basevel ); +#else + end = ent->origin + time_left * move; +#endif + + trace = G_Trace( ent->origin, ent->mins, ent->maxs, end, ent, mask, false, "G_FlyMove" ); + + if ( + ( trace.allsolid ) || + ( + ( trace.startsolid ) && + ( ent->movetype == MOVETYPE_VEHICLE ) + ) + ) + { + // entity is trapped in another solid + ent->velocity = vec_zero; + return 3; + } + + if ( trace.fraction > 0 ) + { + // actually covered some distance + ent->setOrigin( trace.endpos ); + original_velocity = ent->velocity; + numplanes = 0; + } + + if ( trace.fraction == 1 ) + { + // moved the entire distance + break; + } + + assert( trace.ent ); + hit = trace.ent->entity; + + if ( trace.plane.normal[ 2 ] > 0.7 ) + { + // floor + blocked |= 1; + if ( hit->getSolidType() == SOLID_BSP ) + { + ent->groundentity = hit->edict; + ent->groundplane = trace.plane; + ent->groundcontents = trace.contents; + } + } + + if ( !trace.plane.normal[ 2 ] ) + { + // step + blocked |= 2; + } + + // + // run the impact function + // + G_Impact( ent, &trace ); + if ( !edict->inuse ) + { + break; // removed by the impact function + } + + time_left -= time_left * trace.fraction; + + // cliped to another plane + if ( numplanes >= MAX_CLIP_PLANES ) + { + // this shouldn't really happen + ent->velocity = vec_zero; + return 3; + } + + VectorCopy( trace.plane.normal, planes[ numplanes ] ); + numplanes++; + + // + // modify original_velocity so it parallels all of the clip planes + // + for( i = 0; i < numplanes; i++ ) + { + G_ClipVelocity( original_velocity, Vector( planes[ i ] ), new_velocity, 1.01 ); + for( j = 0; j < numplanes; j++ ) + { + if ( j != i ) + { + if ( ( new_velocity * planes[ j ] ) < 0 ) + { + // not ok + break; + } + } + } + + if ( j == numplanes ) + { + break; + } + } + + if ( i != numplanes ) + { + // go along this plane + ent->velocity = new_velocity; + } + else + { + // go along the crease + if ( numplanes != 2 ) + { + ent->velocity = vec_zero; + return 7; + } + CrossProduct( planes[ 0 ], planes[ 1 ], dir ); + d = dir * ent->velocity; + ent->velocity = dir * d; + } + + // + // if original velocity is against the original velocity, stop dead + // to avoid tiny occilations in sloping corners + // + if ( ( ent->velocity * primal_velocity ) <= 0 ) + { + ent->velocity = vec_zero; + return blocked; + } + } + + return blocked; + } + + +/* +============ +G_AddGravity + +============ +*/ +void G_AddGravity + ( + Entity *ent + ) + + { + float grav; + + if ( ent->waterlevel > 2 ) + { + grav = ent->gravity * 60 * level.frametime; + } + else + { + grav = ent->gravity * sv_gravity->value * level.frametime; + } + + ent->velocity[ 2 ] -= grav; + } + +/* +=============================================================================== + +PUSHMOVE + +=============================================================================== +*/ + +/* +============ +G_PushEntity + +Does not change the entities velocity at all +============ +*/ +trace_t G_PushEntity + ( + Entity *ent, + Vector push + ) + + { + trace_t trace; + Vector start; + Vector end; + int mask; + gentity_t *edict; + + start = ent->origin; + end = start + push; + +retry: + if ( ent->edict->clipmask ) + { + mask = ent->edict->clipmask; + } + else + { + mask = MASK_SOLID; + } + + trace = G_Trace( start, ent->mins, ent->maxs, end, ent, mask, false, "G_PushEntity" ); + + edict = ent->edict; + + ent->setOrigin( trace.endpos ); + + if ( trace.fraction != 1.0 ) + { + G_Impact( ent, &trace ); + + // if the pushed entity went away and the pusher is still there + if ( ( !trace.ent || !trace.ent->inuse ) && edict->inuse ) + { + // move the pusher back and try again + ent->setOrigin( start ); + goto retry; + } + } + + if ( edict && ( edict != ent->edict ) ) + { + if ( ent->flags & FL_TOUCH_TRIGGERS ) + { + G_TouchTriggers( ent ); + } + } + + return trace; + } + +/* +============ +G_SlideEntity +============ +*/ +trace_t G_SlideEntity + ( + Entity *ent, + Vector push + ) + + { + trace_t trace; + Vector start; + Vector end; + int mask; + + start = ent->origin; + end = start + push; + + if ( ent->edict->clipmask ) + { + mask = ent->edict->clipmask; + } + else + { + mask = MASK_SOLID; + } + + trace = G_Trace( start, ent->mins, ent->maxs, end, ent, mask, false, "G_SlideEntity" ); + + ent->setOrigin( trace.endpos ); + + return trace; + } + + +/* +================ +G_SnapPosition + +================ +*/ +/* +qboolean G_SnapPosition + ( + Entity *ent + ) + + { + int x, y, z; + Vector offset( 0, -1, 1 ); + Vector base; + + base = ent->origin; + for ( z = 0; z < 3; z++ ) + { + ent->origin.z = base.z + offset[ z ]; + for ( y = 0; y < 3; y++ ) + { + ent->origin.y = base.y + offset[ y ]; + for ( x = 0; x < 3; x++ ) + { + ent->origin.x = base.x + offset[ x ]; + if ( G_TestEntityPosition( ent ) ) + { + ent->origin.x += offset[ x ]; + ent->origin.y += offset[ y ]; + ent->origin.z += offset[ z ]; + ent->setOrigin( ent->origin ); + return true; + } + } + } + } + + // can't find a good position, so put him back. + ent->origin = base; + + return false; + } +*/ + +/* +============ +G_Push + +Objects need to be moved back on a failed push, +otherwise riders would continue to slide. +============ +*/ +qboolean G_Push + ( + Entity *pusher, + Vector pushermove, + Vector pusheramove + ) + + { + Entity *check, *block; + gentity_t *edict; + Vector move, amove; + Vector mins, maxs; + Vector save; + pushed_t *p; + Vector org, org2, move2; + Vector norm; + float mat[ 3 ][ 3 ]; + pushed_t *pusher_p; + float radius; +#if 1 + int i, num; + int touch[ MAX_GENTITIES ]; +#else + gentity_t *next; +#endif + + // save the pusher's original position + pusher_p = pushed_p; + pushed_p->ent = pusher; + pushed_p->localorigin = pusher->localorigin; + pushed_p->origin = pusher->origin; + pushed_p->localangles = pusher->localangles; + pushed_p->angles = pusher->angles; + + if ( pusher->client ) + { + pushed_p->deltayaw = pusher->client->ps.delta_angles[ YAW ]; + } + + pushed_p++; + + if ( pushed_p >= &pushed[ MAX_GENTITIES ] ) + { + gi.Error( ERR_FATAL, "Pushed too many entities." ); + } + + // move the pusher to it's final position + pusher->addAngles( pusheramove ); + pusher->addOrigin( pushermove ); + + if ( pusher->edict->solid == SOLID_NOT ) + { + // Doesn't push anything + return true; + } + + // change the move to worldspace + move = pusher->origin - pusher_p->origin; + amove = pusher->angles - pusher_p->angles; + + // we need this for pushing things later + AnglesToAxis( amove, mat ); + + // find the bounding box + mins = pusher->absmin; + maxs = pusher->absmax; + +#if 1 + num = gi.AreaEntities( mins, maxs, touch, MAX_GENTITIES ); + for( i = 0; i < num; i++ ) + { + edict = &g_entities[ touch[ i ] ]; + assert( edict ); + assert( edict->inuse ); + assert( edict->entity ); + check = edict->entity; + + if ( check->movetype == MOVETYPE_PUSH || + check->movetype == MOVETYPE_STOP || + check->movetype == MOVETYPE_NONE || + check->movetype == MOVETYPE_NOCLIP ) + { + continue; + } +#else + // see if any solid entities are inside the final position + for( edict = active_edicts.next; edict != &active_edicts; edict = next ) + { + assert( edict ); + assert( edict->inuse ); + assert( edict->entity ); + + next = edict->next; + check = edict->entity; + + if ( check->movetype == MOVETYPE_PUSH || + check->movetype == MOVETYPE_STOP || + check->movetype == MOVETYPE_NONE || + check->movetype == MOVETYPE_NOCLIP ) + { + continue; + } +#endif + + if ( check->edict->contents == CONTENTS_SHOOTABLE_ONLY || check->edict->contents == CONTENTS_CORPSE ) + continue; + + // if the entity is standing on the pusher, it will definitely be moved + if ( check->groundentity != pusher->edict ) + { + // Only move triggers and non-solid objects if they're sitting on a moving object + if ( check->edict->solid == SOLID_TRIGGER || check->edict->solid == SOLID_NOT ) + { + continue; + } + + // see if the ent needs to be tested + if ( check->absmin[ 0 ] >= maxs[ 0 ] || + check->absmin[ 1 ] >= maxs[ 1 ] || + check->absmin[ 2 ] >= maxs[ 2 ] || + check->absmax[ 0 ] <= mins[ 0 ] || + check->absmax[ 1 ] <= mins[ 1 ] || + check->absmax[ 2 ] <= mins[ 2 ] ) + { + continue; + } + + // see if the ent's bbox is inside the pusher's final position + if ( !G_TestEntityPosition( check ) ) + { + continue; + } + } + + if ( + ( pusher->movetype == MOVETYPE_PUSH ) || + ( check->groundentity == pusher->edict ) + ) + { + pushed_p->localorigin = check->localorigin; + pushed_p->localangles = check->localangles; + // move this entity + pushed_p->ent = check; + pushed_p->origin = check->origin; + pushed_p->angles = check->angles; + pushed_p++; + + if ( pushed_p >= &pushed[ MAX_GENTITIES ] ) + { + gi.Error( ERR_FATAL, "Pushed too many entities." ); + } + + // save off the origin + save = check->localorigin; + + // try moving the contacted entity + move2 = move; + + // FIXME: doesn't rotate monsters? + if ( check->client ) + { + check->client->ps.delta_angles[YAW] += ANGLE2SHORT( amove[ YAW ] ); + } + + // get the radius of the entity + if ( check->size.x > check->size.z ) + { + radius = check->size.z * 0.5; + } + else + { + radius = check->size.x * 0.5; + } + + // figure movement due to the pusher's amove + org = check->origin - pusher->origin; + org.z += radius; + + MatrixTransformVector( org, mat, org2 ); + + move2 += org2 - org; + + //FIXME + // We should probably do a flymove here so that we slide against other objects + check->addOrigin( check->getParentVector( move2 ) ); + + // may have pushed them off an edge + if ( check->groundentity != pusher->edict ) + { + check->groundentity = NULL; + } + + block = G_TestEntityPosition( check ); + if ( block ) + { + block = G_FixEntityPosition( check ); + } + if ( !block ) + { + // pushed ok + check->link(); + + // impact? + continue; + } + + // try to snap it to a good position + /* + if ( G_SnapPosition( check ) ) + { + // snapped ok. we don't have to link since G_SnapPosition does it for us. + continue; + } + */ + + // if it is ok to leave in the old position, do it + // this is only relevent for riding entities, not pushed + // FIXME: this doesn't acount for rotation + check->setOrigin( save ); + block = G_TestEntityPosition( check ); + if ( !block ) + { + pushed_p--; + continue; + } + } + + if ( check->edict->solid == SOLID_NOT ) + continue; + + // save off the obstacle so we can call the block function + obstacle = check; + + // move back any entities we already moved + // go backwards, so if the same entity was pushed + // twice, it goes back to the original position + for( p = pushed_p - 1; p >= pushed; p-- ) + { + p->ent->angles = p->angles; + p->ent->origin = p->origin; + + p->ent->localangles = p->localangles; + p->ent->localorigin = p->localorigin; + + if ( p->ent->client ) + { + p->ent->client->ps.delta_angles[ YAW ] = p->deltayaw; + } + } + + // Only "really" move it in order so that the bound coordinate system is correct + for( p = pushed; p < pushed_p; p++ ) + { + p->ent->setAngles(); + p->ent->setOrigin(); + } + + return false; + } + + //FIXME: is there a better way to handle this? + // see if anything we moved has touched a trigger + for( p = pushed_p - 1; p >= pushed; p-- ) + { + if ( p->ent->flags & FL_TOUCH_TRIGGERS ) + { + G_TouchTriggers( p->ent ); + } + } + + return true; + } + +/* +================ +G_PushMove +================ +*/ +qboolean G_PushMove + ( + Entity *ent, + Vector move, + Vector amove + ) + + { + Entity *part; + Vector m, a; + Event *ev; + + m = move; + a = amove; + + pushed_p = pushed; + for( part = ent; part; part = part->teamchain ) + { + if ( !G_Push( part, m, a ) ) + { + // move was blocked + // call the pusher's "blocked" function + // otherwise, just stay in place until the obstacle is gone + ev = new Event( EV_Blocked ); + ev->AddEntity( obstacle ); + part->ProcessEvent( ev ); + return false; + } + + m = vec_zero; + a = vec_zero; + } + + return true; + } + +/* +================ +G_Physics_Pusher + +Bmodel objects don't interact with each other, but +push all box objects +================ +*/ +void G_Physics_Pusher + ( + Entity *ent + ) + + { + Vector move, amove; + Entity *part, *mv; + Event *ev; + + // team slaves are only moved by their captains + if ( ent->flags & FL_TEAMSLAVE ) + { + return; + } + + // Check if anyone on the team is moving + for( part = ent; part; part = part->teamchain ) + { + if ( part->velocity != vec_zero || part->avelocity != vec_zero ) + { + break; + } + } + + // make sure all team slaves can move before commiting + // any moves or calling any think functions + // if the move is blocked, all moved objects will be backed out + pushed_p = pushed; + while( part ) + { + move = part->velocity * level.frametime; + amove = part->avelocity * level.frametime; + + if ( !G_Push( part, move, amove ) ) + { + // move was blocked + break; + } + + part = part->teamchain; + } + + if ( part ) + { + // the move failed, bump all movedone times + for( mv = ent; mv; mv = mv->teamchain ) + { + mv->PostponeEvent( EV_MoveDone, FRAMETIME ); + } + + // if the pusher has a "blocked" function, call it + // otherwise, just stay in place until the obstacle is gone + ev = new Event( EV_Blocked ); + ev->AddEntity( obstacle ); + part->ProcessEvent( ev ); + } + } + +//================================================================== + +/* +============= +G_Physics_Noclip + +A moving object that doesn't obey physics +============= +*/ +void G_Physics_Noclip + ( + Entity *ent + ) + + { + ent->angles += ent->avelocity * level.frametime; + ent->origin += ent->velocity * level.frametime; + ent->link(); + } + +/* +============================================================================== + +TOSS / BOUNCE + +============================================================================== +*/ + +/* +============= +G_Physics_Toss + +Toss, bounce, and fly movement. When onground, do nothing. +============= +*/ +void G_Physics_Toss + ( + Entity *ent + ) + + { + trace_t trace; + Vector move; + float backoff; + Entity *slave; + qboolean wasinwater; + qboolean isinwater; + Vector origin2; + Vector basevel; + gentity_t *edict; + qboolean onconveyor; + + // if not a team captain, so movement will be handled elsewhere + if ( ent->flags & FL_TEAMSLAVE ) + { + return; + } + + if ( ent->velocity[ 2 ] > 0 ) + { + ent->groundentity = NULL; + } + + // check for the groundentity going away + if ( ent->groundentity && !ent->groundentity->inuse ) + { + ent->groundentity = NULL; + } + + onconveyor = ( basevel != vec_zero ); + + // if onground, return without moving + if ( ent->groundentity && !onconveyor && ( ent->movetype != MOVETYPE_VEHICLE ) ) + { + if ( ent->avelocity.length() ) + { + // move angles + ent->setAngles( ent->angles + ent->avelocity * level.frametime ); + } + ent->velocity = vec_zero; + return; + } + + origin2 = ent->origin; + + G_CheckVelocity( ent ); + + // add gravity + if ( !onconveyor && ent->movetype != MOVETYPE_FLY && ent->movetype != MOVETYPE_FLYMISSILE ) + { + G_AddGravity( ent ); + } + + // move angles + ent->setAngles( ent->angles + ent->avelocity * level.frametime ); + + // move origin + move = ( ent->velocity + basevel ) * level.frametime; + + edict = ent->edict; + if ( ent->movetype == MOVETYPE_VEHICLE ) + { + int mask; + + if ( ent->edict->clipmask ) + { + mask = ent->edict->clipmask; + } + else + { + mask = MASK_MONSTERSOLID; + } + G_FlyMove( ent, basevel, FRAMETIME, mask ); + if ( ent->flags & FL_TOUCH_TRIGGERS ) + { + G_TouchTriggers( ent ); + } + return; + } + else + { + trace = G_PushEntity( ent, move ); + } + + if ( (trace.fraction == 0) && (ent->movetype == MOVETYPE_SLIDE) ) + { + // Check for slide by removing the downward velocity + Vector slide; + + slide[ 0 ] = move[ 0 ] * 0.7f; + slide[ 1 ] = move[ 1 ] * 0.7f; + slide[ 2 ] = 0; + G_PushEntity( ent, slide ); + } + + if ( !edict->inuse ) + { + return; + } + + if ( trace.fraction < 1 ) + { + if ( ent->movetype == MOVETYPE_BOUNCE || ent->movetype == MOVETYPE_GIB ) + { + backoff = 1.5; + } + else + { + backoff = 1; + } + + G_ClipVelocity( ent->velocity, Vector( trace.plane.normal ), ent->velocity, backoff ); + + // stop if on ground + if ( trace.plane.normal[ 2 ] > 0.7 ) + { + if (( ent->velocity[ 2 ] < 60 || (ent->movetype != MOVETYPE_BOUNCE && ent->movetype != MOVETYPE_GIB) ) && + (ent->movetype != MOVETYPE_SLIDE)) + { + ent->groundentity = trace.ent; + ent->groundplane = trace.plane; + ent->groundcontents = trace.contents; + ent->velocity = vec_zero; + ent->avelocity = vec_zero; + ent->ProcessEvent( EV_Stop ); + } + else if ( ent->movetype == MOVETYPE_GIB ) + { + // Stop spinning after we bounce on the ground + ent->avelocity = vec_zero; + } + } + } + + if ( ( move[ 2 ] == 0 ) && onconveyor ) + { + // Check if we still have a ground + ent->CheckGround(); + } + + // check for water transition + wasinwater = ( ent->watertype & MASK_WATER ); + ent->watertype = gi.pointcontents( ent->origin, 0 ); + isinwater = ent->watertype & MASK_WATER; + + if ( isinwater ) + { + ent->waterlevel = 1; + } + else + { + ent->waterlevel = 0; + } + + if ( ( edict->spawntime < ( level.time - FRAMETIME ) ) && ( ent->mass > 0 ) ) + { + if ( !wasinwater && isinwater ) + { + ent->Sound( "impact_watersplash", CHAN_BODY, DEFAULT_VOL, DEFAULT_MIN_DIST, &origin2 ); + } + else if ( wasinwater && !isinwater ) + { + ent->Sound( "impact_leavewater", CHAN_BODY, DEFAULT_VOL, DEFAULT_MIN_DIST, &origin2 ); + } + } + + // GAMEFIX - Is this necessary? + // move teamslaves + for( slave = ent->teamchain; slave; slave = slave->teamchain ) + { + slave->setOrigin( slave->localorigin ); + slave->setAngles( slave->localangles ); + } + + if ( ent->flags & FL_TOUCH_TRIGGERS ) + { + G_TouchTriggers( ent ); + } + } + +/* +=============================================================================== + +STEPPING MOVEMENT + +=============================================================================== +*/ + +void G_AddRotationalFriction + ( + Entity *ent + ) + + { + int n; + float adjustment; + + ent->angles += level.frametime * ent->avelocity; + adjustment = level.frametime * sv_stopspeed->value * sv_friction->value; + for( n = 0; n < 3; n++ ) + { + if ( ent->avelocity[ n ] > 0) + { + ent->avelocity[ n ] -= adjustment; + if ( ent->avelocity[ n ] < 0 ) + { + ent->avelocity[ n ] = 0; + } + } + else + { + ent->avelocity[ n ] += adjustment; + if ( ent->avelocity[ n ] > 0 ) + { + ent->avelocity[ n ] = 0; + } + } + } + } + +/* +============= +G_CheckWater + +============= +*/ + +void G_CheckWater + ( + Entity *ent + ) + + { + if ( ent->isSubclassOf( Actor ) ) + { + ( ( Actor * )ent )->CheckWater(); + } + else + { + ent->watertype = gi.pointcontents( ent->origin, 0 ); + if ( ent->watertype & MASK_WATER ) + { + ent->waterlevel = 1; + } + else + { + ent->waterlevel = 0; + } + } + } + +/* +============= +G_Physics_Step + +Monsters freefall when they don't have a ground entity, otherwise +all movement is done with discrete steps. + +This is also used for objects that have become still on the ground, but +will fall if the floor is pulled out from under them. +FIXME: is this true? +============= +*/ + +void G_Physics_Step + ( + Entity *ent + ) + + { + qboolean wasonground; + qboolean hitsound = false; + Vector vel; + float speed, newspeed, control; + float friction; + int mask; + Vector basevel; + + // airborn monsters should always check for ground + if ( !ent->groundentity ) + { + ent->CheckGround(); + } + + if ( ent->groundentity ) + { + wasonground = true; + } + else + { + wasonground = false; + } + + G_CheckVelocity( ent ); + + if ( ent->avelocity != vec_zero ) + { + G_AddRotationalFriction( ent ); + } + + // add gravity except: + // flying monsters + // swimming monsters who are in the water + if ( !wasonground ) + { + if ( !( ent->flags & FL_FLY ) ) + { + if ( !( ( ent->flags & FL_SWIM ) && ( ent->waterlevel > 2 ) ) ) + { + if ( ent->velocity[ 2 ] < sv_gravity->value * ent->gravity * -0.1 ) + { + hitsound = true; + } + + // Testing water gravity. If this doesn't work, just restore the uncommented lines + //if ( ent->waterlevel == 0 ) + //{ + G_AddGravity( ent ); + //} + } + } + } + + // friction for flying monsters that have been given vertical velocity + if ( ( ent->flags & FL_FLY ) && ( ent->velocity.z != 0 ) ) + { + speed = fabs( ent->velocity.z ); + control = speed < sv_stopspeed->value ? sv_stopspeed->value : speed; + friction = sv_friction->value / 3; + newspeed = speed - ( level.frametime * control * friction ); + if ( newspeed < 0 ) + { + newspeed = 0; + } + newspeed /= speed; + ent->velocity.z *= newspeed; + } + + // friction for flying monsters that have been given vertical velocity + if ( ( ent->flags & FL_SWIM ) && ( ent->velocity.z != 0 ) ) + { + speed = fabs( ent->velocity.z ); + control = speed < sv_stopspeed->value ? sv_stopspeed->value : speed; + newspeed = speed - ( level.frametime * control * sv_waterfriction->value * ent->waterlevel ); + if ( newspeed < 0 ) + { + newspeed = 0; + } + newspeed /= speed; + ent->velocity.z *= newspeed; + } + + if ( ent->velocity != vec_zero ) + { + // apply friction + // let dead monsters who aren't completely onground slide + if ( ( wasonground ) || ( ent->flags & ( FL_SWIM | FL_FLY ) ) ) + { + if ( !( ent->health <= 0.0 && !M_CheckBottom( ent ) ) ) + { + vel = ent->velocity; + vel.z = 0; + speed = vel.length(); + if ( speed ) + { + friction = sv_friction->value; + + control = speed < sv_stopspeed->value ? sv_stopspeed->value : speed; + newspeed = speed - level.frametime * control * friction; + + if ( newspeed < 0 ) + { + newspeed = 0; + } + + newspeed /= speed; + + ent->velocity.x *= newspeed; + ent->velocity.y *= newspeed; + } + } + } + } + + if ( ( basevel != vec_zero ) || ( ent->velocity != vec_zero ) || ( ent->total_delta != vec_zero ) ) + { + if ( ent->edict->svflags & SVF_MONSTER ) + { + mask = ent->edict->clipmask; + } + else + { + mask = MASK_SOLID; + } + + G_FlyMove( ent, basevel, level.frametime, mask ); + + ent->link(); + + G_CheckWater( ent ); + if ( ent->flags & FL_TOUCH_TRIGGERS ) + { + G_TouchTriggers( ent ); + } + + if ( ent->groundentity && !wasonground && hitsound ) + { + ent->Sound( "impact_softland", CHAN_BODY, 0.5f ); + } + } + } + +//============================================================================ + +/* +================ +G_RunEntity + +================ +*/ +void G_RunEntity + ( + Entity *ent + ) + + { + gentity_t *edict; + + edict = ent->edict; + + if ( edict->inuse && ( ent->flags & FL_THINK ) ) + { + ent->Think(); + } + + // only run physics if in use and not bound and not immobilized + if ( edict->inuse && ( edict->s.parent == ENTITYNUM_NONE ) && !(ent->flags & FL_IMMOBILE) && !(ent->flags & FL_PARTIAL_IMMOBILE) ) + { + switch ( ( int )ent->movetype ) + { + case MOVETYPE_PUSH: + case MOVETYPE_STOP: + G_Physics_Pusher( ent ); + break; + case MOVETYPE_NONE: + case MOVETYPE_STATIONARY: + case MOVETYPE_WALK: + break; + case MOVETYPE_NOCLIP: + G_Physics_Noclip( ent ); + break; + case MOVETYPE_STEP: + G_Physics_Step( ent ); + break; + case MOVETYPE_TOSS: + case MOVETYPE_BOUNCE: + case MOVETYPE_GIB: + case MOVETYPE_FLY: + case MOVETYPE_FLYMISSILE: + case MOVETYPE_SLIDE: + case MOVETYPE_VEHICLE: + G_Physics_Toss( ent ); + break; + case MOVETYPE_ROPE: + G_Physics_Rope(((RopePiece *)ent)); + break; + default: + gi.Error( ERR_DROP, "G_Physics: bad movetype %i", ( int )ent->movetype ); + } + } + if ( ( edict->inuse ) && ( ent->flags & FL_POSTTHINK ) ) + { + ent->Postthink(); + } + } + diff --git a/source/source/fgame/g_phys.h b/source/source/fgame/g_phys.h new file mode 100644 index 0000000..906a9c3 --- /dev/null +++ b/source/source/fgame/g_phys.h @@ -0,0 +1,93 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/g_phys.h $ +// $Revision:: 10 $ +// $Author:: Markd $ +// $Date:: 6/30/00 10:45a $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/g_phys.h $ +// +// 10 6/30/00 10:45a Markd +// added MOVETYPE_STATIONARY and revamped some physics +// +// 9 6/14/00 11:18a Markd +// cleaned up code using Intel compiler +// +// 8 3/21/00 5:06p Markd +// added vehicle support +// +// 7 2/24/00 4:17p Jimdose +// removed duplicate definition of STEPSIZE +// +// 6 1/29/00 12:32p Jimdose +// removed MOVETYPE_HURL +// +// 5 1/21/00 6:47p Steven +// Added a STEPMOVE_BLOCKED_BY_DOOR for AI pathfinding. +// +// 4 1/12/00 4:31p Steven +// Added new movetype MOVETYPE_GIB. +// +// 3 12/17/99 8:26p Jimdose +// got rid of unused vars and functions +// +// 2 10/28/99 10:42a Aldie +// Added rope functions +// +// 1 9/10/99 10:54a Jimdose +// +// 1 9/08/99 3:16p Aldie +// +// DESCRIPTION: +// Global header file for g_phys.cpp +// + +#ifndef __G_PHYS_H__ +#define __G_PHYS_H__ + +#include "g_local.h" +#include "entity.h" + +typedef enum + { + STEPMOVE_OK, + STEPMOVE_BLOCKED_BY_ENTITY, + STEPMOVE_BLOCKED_BY_WORLD, + STEPMOVE_BLOCKED_BY_WATER, + STEPMOVE_BLOCKED_BY_FALL, + STEPMOVE_BLOCKED_BY_DOOR, + STEPMOVE_STUCK + } stepmoveresult_t; + +// movetype values +typedef enum + { + MOVETYPE_NONE, // never moves + MOVETYPE_STATIONARY, // never moves but does collide agains push objects + MOVETYPE_NOCLIP, // origin and angles change with no interaction + MOVETYPE_PUSH, // no clip to world, push on box contact + MOVETYPE_STOP, // no clip to world, stops on box contact + MOVETYPE_WALK, // gravity + MOVETYPE_STEP, // gravity, special edge handling + MOVETYPE_FLY, + MOVETYPE_TOSS, // gravity + MOVETYPE_FLYMISSILE, // extra size to monsters + MOVETYPE_BOUNCE, + MOVETYPE_SLIDE, + MOVETYPE_ROPE, + MOVETYPE_GIB, + MOVETYPE_VEHICLE + } movetype_t; + +void G_RunEntity( Entity *ent ); +void G_Impact( Entity *e1, trace_t *trace ); +qboolean G_PushMove( Entity *pusher, Vector move, Vector amove ); +void G_CheckWater( Entity *ent ); + +#endif /* g_phys.h */ diff --git a/source/source/fgame/g_public.h b/source/source/fgame/g_public.h new file mode 100644 index 0000000..a926418 --- /dev/null +++ b/source/source/fgame/g_public.h @@ -0,0 +1,529 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/g_public.h $ +// $Revision:: 42 $ +// $Author:: Aldie $ +// $Date:: 7/16/00 2:09p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/g_public.h $ +// +// 42 7/16/00 2:09p Aldie +// Changed some of the player logging +// +// 41 7/14/00 8:21p Aldie +// Added logstats +// +// 40 7/10/00 6:33p Aldie +// Added SVF_SENDONCE flag and water power for swiping determination +// +// 39 7/06/00 7:48p Markd +// Added LevelArchiveValid function +// +// 38 6/16/00 5:14p Aldie +// Added locational printing (print anywhere on the screen) +// +// 37 6/15/00 8:04p Markd +// Added CleanupGame +// +// 36 6/14/00 11:18a Markd +// cleaned up code using Intel compiler +// +// 35 6/13/00 3:46p Steven +// Added saving alias stuff. +// +// 34 6/10/00 4:23p Markd +// rewrote map restarting and loading out of date save games +// +// 33 6/05/00 3:11p Markd +// fixed HasCommands calls in server +// +// 32 6/02/00 4:26p Markd +// renamed ReadGame functions to ReadPersistant +// +// 31 5/27/00 8:07p Markd +// Saved games 3rd pass +// +// 30 5/11/00 11:13a Steven +// Added pointbrushnum. +// +// 29 3/31/00 11:51a Markd +// Added SetSkyPortal method +// +// 28 3/04/00 11:48a Markd +// Added light style support +// +// 27 2/14/00 5:38p Jimdose +// added uselegs to Tag_OrientationEx +// +// 26 2/01/00 4:11p Markd +// Added Frame bounding box support +// +// 25 1/27/00 11:35a Markd +// Fixed solid/notsolid client side entities +// +// 24 1/22/00 5:08p Steven +// Added ClipToEntity to exported interface. +// +// 23 1/20/00 6:57p Markd +// removed get_lip functions and merged them with SoundLength and +// SoundAmplitudes +// +// 22 1/20/00 5:20p Markd +// Added skin support into the game +// +// 21 1/19/00 8:50p Jimdose +// added Anim_AbsolueDelta +// +// 20 1/11/00 7:29p Jimdose +// added Tag_OrientationEx +// +// 19 1/10/00 5:33p Markd +// Cleaned up memory allocation routines +// +// 18 12/17/99 6:35p Jimdose +// changed spawnarg code +// added Level class for spawning and map control +// got rid of unused or superflous variables +// changed setjmp/longjmp calls to try/throw/catch exception handling +// +// 17 12/11/99 3:37p Markd +// q3a gold checkin, first time +// +// 16 12/06/99 6:41p Jimdose +// removed fulltrace, cvar_forceset, and Surface_DamageMultiplier +// +// 15 11/01/99 4:01p Jimdose +// made tags work with bone controllers +// +// 14 10/25/99 6:39p Markd +// removed size and other unused variables, added radius and centroid to both +// server and game code +// +// 13 10/19/99 7:52p Markd +// Removed three part model system +// +// 12 10/05/99 5:03p Markd +// Removed un-used game function ClientPredict +// +// 11 10/05/99 2:05p Markd +// Added SVF_SENDPVS which forces an entity to be checked by the PVS for +// sending and not trivially rejected because of lack of modelindex or sound +// +// 10 10/01/99 6:31p Markd +// added commands hidden inside fgame so that they would show up for command +// completion +// +// 9 9/28/99 4:26p Markd +// merged listener, class and vector between 3 projects +// +// 8 9/20/99 4:50p Markd +// fixed memory allocation for snapshot entities, put in farplane culling on +// entities being sent over the net +// +// 7 9/16/99 4:51p Jimdose +// changed ClientConnect +// added setUserInfo and getUserInfo +// +// 6 9/15/99 6:57p Aldie +// Update to get game working +// +// 5 9/14/99 2:38p Aldie +// code merge +// +// 4 9/13/99 6:18p Aldie +// code merge +// +// 3 9/13/99 4:22p Jimdose +// merge +// +// 2 9/13/99 3:27p Aldie +// code merge +// +// 1 9/10/99 10:54a Jimdose +// +// 1 9/08/99 3:16p Aldie +// +// 27 8/19/99 6:59p Markd +// removed the old tiki_cmd structure, now tiki_cmd_t is passed into the tiki +// functions +// +// 26 8/18/99 3:28p Jimdose +// added cylindrical collision detection +// +// 25 8/17/99 5:08p Markd +// Changed all FS_ReadFile's to FS_ReadFileEx's in game code +// +// 24 7/30/99 7:53p Markd +// Added jumping ability to the player +// +// 23 7/29/99 11:41a Markd +// Added precache and global support +// +// 22 7/07/99 11:26a Steven +// Added some stuff on the sector pathfinding approach. +// +// DESCRIPTION: +// Game module information visible to server + + +#ifndef __G_PUBLIC_H__ +#define __G_PUBLIC_H__ + +#define GAME_API_VERSION 4 + +#define FRAMETIME ( level.fixedframetime ) + +// entity->svFlags +// the server does not know how to interpret most of the values +// in entityStates (level eType), so the game must explicitly flag +// special server behaviors +#define SVF_NOCLIENT (1<<0) // don't send entity to clients, even if it has effects +#define SVF_BOT (1<<1) +#define SVF_BROADCAST (1<<2) // send to all connected clients +#define SVF_PORTAL (1<<3) // merge a second pvs at origin2 into snapshots +#define SVF_SENDPVS (1<<4) // even though it doesn't have a sound or modelindex, still run it through the pvs +#define SVF_USE_CURRENT_ORIGIN (1<<5) // entity->currentOrigin instead of entity->s.origin + // for link position (missiles and movers) +#define SVF_DEADMONSTER (1<<6) // treat as CONTENTS_DEADMONSTER for collision +#define SVF_MONSTER (1<<7) // treat as CONTENTS_MONSTER for collision +#define SVF_USEBBOX (1<<9) // do not perform perfect collision use the bbox instead +#define SVF_ONLYPARENT (1<<10) // only send this entity to its parent +#define SVF_HIDEOWNER (1<<11) // hide the owner of the client +#define SVF_MONSTERCLIP (1<<12) // treat as CONTENTS_MONSTERCLIP for collision +#define SVF_PLAYERCLIP (1<<13) // treat as CONTENTS_PLAYERCLIP for collision +#define SVF_SENDONCE (1<<14) // Send this entity over the network at least one time +#define SVF_SENT (1<<15) // This flag is set when the entity has been sent over at least one time + +typedef enum + { + SOLID_NOT, // no interaction with other objects + SOLID_TRIGGER, // only touch when inside, after moving + SOLID_BBOX, // touch on edge + SOLID_BSP // bsp clip, touch on edge + } solid_t; + +//=============================================================== + +typedef struct gentity_s gentity_t; +typedef struct gclient_s gclient_t; + +#ifndef GAME_INCLUDE + +// the server needs to know enough information to handle collision and snapshot generation + +struct gentity_s + { + entityState_t s; // communicated by server to clients + struct playerState_s *client; + qboolean inuse; + qboolean linked; // qfalse if not in any good cluster + int linkcount; + + int svFlags; // SVF_NOCLIENT, SVF_BROADCAST, etc + + qboolean bmodel; // if false, assume an explicit mins / maxs bounding box + // only set by gi.SetBrushModel + vec3_t mins, maxs; + int contents; // CONTENTS_TRIGGER, CONTENTS_SOLID, CONTENTS_BODY, etc + // a non-solid entity should set to 0 + + vec3_t absmin, absmax; // derived from mins/maxs and origin + rotation + + float radius; // radius of object + vec3_t centroid; // centroid, to be used with radius + int areanum; // areanum needs to be seen inside the game as well + + // currentOrigin will be used for all collision detection and world linking. + // it will not necessarily be the same as the trajectory evaluation for the current + // time, because each entity must be moved one at a time after time is advanced + // to avoid simultanious collision issues + vec3_t currentOrigin; + vec3_t currentAngles; + + // when a trace call is made and passEntityNum != ENTITYNUM_NONE, + // an ent will be excluded from testing if: + // ent->s.number == passEntityNum (don't interact with self) + // ent->s.ownerNum = passEntityNum (don't interact with your own missiles) + // entity[ent->s.ownerNum].ownerNum = passEntityNum (don't interact with other missiles from owner) + int ownerNum; + //gentity_t *owner; // objects never interact with their owners, to + // prevent player missiles from immediately + // colliding with their owner + + solid_t solid; + // the game dll can add anything it wants after + // this point in the structure + }; + +#endif // GAME_INCLUDE + +//=============================================================== + +// +// functions provided by the main engine +// +typedef struct + { + //============== general Quake services ================== + + // print message on the local console + void (*Printf)( const char *fmt, ... ); + void (*DPrintf)( const char *fmt, ... ); + void (*DebugPrintf)( const char *fmt, ... ); + + // abort the game + void (*Error)( int errorLevel, const char *fmt, ... ); + + // get current time for profiling reasons this should NOT be used for any game related tasks, + // because it is not journaled + int (*Milliseconds)( void ); + + // managed memory allocation + void *(*Malloc)( int size ); + void (*Free)( void *block ); + + // console variable interaction + cvar_t *(*cvar)( const char *var_name, const char *value, int flags ); + void (*cvar_set)( const char *var_name, const char *value ); + + // ClientCommand and ServerCommand parameter access + int (*argc)( void ); + char *(*argv)( int n ); + const char *(*args)(void); + void (*AddCommand)( const char *cmd ); + + // the returned buffer may be part of a larger pak file, or a discrete file from anywhere in the quake search path + // a -1 return means the file does not exist NULL can be passed for buf to just determine existance + int (*FS_ReadFile)( const char *name, void **buf, qboolean quiet ); + void (*FS_FreeFile)( void *buf ); + void (*FS_WriteFile)( const char *qpath, const void *buffer, int size ); + fileHandle_t (*FS_FOpenFileWrite)( const char *qpath ); + fileHandle_t (*FS_FOpenFileAppend)( const char *filename ); + + char * (*FS_PrepFileWrite)( const char *filename ); + int (*FS_Write)( const void *buffer, int len, fileHandle_t f ); + int (*FS_Read)( void *buffer, int len, fileHandle_t f ); + void (*FS_FCloseFile)( fileHandle_t f ); + int (*FS_FTell)( fileHandle_t f ); + int (*FS_FSeek)( fileHandle_t f, long offset, int origin ); + void (*FS_Flush)( fileHandle_t f ); + + const char * (*GetArchiveFileName)( const char *filename, const char *extension ); + // add commands to the console as if they were typed in for map changing, etc + void (*SendConsoleCommand)( const char *text ); + void (*DebugGraph)( float value, int color ); + + //=========== server specific functionality ============= + + // SendServerCommand reliably sends a command string to be interpreted by the given + // client. If ent is NULL, it will be sent to all clients + void (*SendServerCommand)( int clientnum, const char *fmt, ... ); + + // config strings hold all the index strings, the lightstyles, and misc data like the cdtrack. + // All of the current configstrings are sent to clients when they connect, and + // changes are sent to all connected clients. + void (*setConfigstring)( int index, const char *val ); + char * (*getConfigstring)( int index ); + + void (*setUserinfo)( int index, const char *val ); + void (*getUserinfo)( int index, char *buffer, int bufferSize ); + + // sets mins and maxs based on the brushmodel name + void (*SetBrushModel)( gentity_t *ent, const char *name ); + + // collision detection + void (*trace)( trace_t *result, const vec3_t start, const vec3_t mins, const vec3_t maxs, const vec3_t end, int passEntityNum, int contentmask, qboolean cylinder ); + int (*pointcontents)( const vec3_t point, int passEntityNum ); + int (*pointbrushnum)( const vec3_t point, int passEntityNum ); + qboolean (*inPVS)( vec3_t p1, vec3_t p2 ); + qboolean (*inPVSIgnorePortals)( vec3_t p1, vec3_t p2 ); + void (*AdjustAreaPortalState)( gentity_t *ent, qboolean open ); + qboolean (*AreasConnected)( int area1, int area2 ); + + // an entity will never be sent to a client or used for collision + // if it is not passed to linkentity. If the size, position, or + // solidity changes, it must be relinked. + void (*linkentity)( gentity_t *ent ); + void (*unlinkentity)( gentity_t *ent ); // call before removing an interactive entity + + // EntitiesInBox will perform exact checking to bmodels, as well as bounding box + // intersection tests to other models + int (*AreaEntities)( vec3_t mins, vec3_t maxs, int *list, int maxcount ); + void (*ClipToEntity)( trace_t *trace, const vec3_t start, const vec3_t mins, const vec3_t maxs, const vec3_t end, int entityNum, int contentmask ); + + + int (*imageindex)( const char *name ); + int (*itemindex)( const char *name ); + int (*soundindex)( const char *name ); + int (*modelindex)( const char *name ); + + void (*SetLightStyle)( int i, const char *data ); + + const char *(*GameDir)( void ); + + // + // MODEL UTILITY FUNCTIONS + // + qboolean (*IsModel)( int index ); + void (*setmodel)( gentity_t *ent, const char *name ); + + // DEF SPECIFIC STUFF + int (*NumAnims)( int modelindex ); + int (*NumSkins)( int modelindex ); + int (*NumSurfaces)( int modelindex ); + int (*NumTags)( int modelindex ); + qboolean (*InitCommands)( int modelindex, tiki_cmd_t * tiki_cmd ); + void (*CalculateBounds)( int modelindex, float scale, vec3_t mins, vec3_t maxs ); + + // ANIM SPECIFIC STUFF + const char * (*Anim_NameForNum)( int modelindex, int animnum ); + int (*Anim_NumForName)( int modelindex, const char * name ); + int (*Anim_Random)( int modelindex, const char * name ); + int (*Anim_NumFrames)( int modelindex, int animnum ); + float (*Anim_Time)( int modelindex, int animnum ); + void (*Anim_Delta)( int modelindex, int animnum, vec3_t delta ); + void (*Anim_AbsoluteDelta)( int modelindex, int animnum, vec3_t delta ); + int (*Anim_Flags)( int modelindex, int animnum ); + qboolean (*Anim_HasCommands) ( int modelindex, int animnum ); + + // FRAME SPECIFIC STUFF + qboolean (*Frame_Commands)( int modelindex, int animnum, int framenum, tiki_cmd_t * tiki_cmd ); + void (*Frame_Delta)( int modelindex, int animnum, int framenum, vec3_t delta ); + float (*Frame_Time)( int modelindex, int animnum, int framenum ); + void (*Frame_Bounds)( int modelindex, int animnum, int framenum, float scale, vec3_t mins, vec3_t maxs ); + + // SURFACE SPECIFIC STUFF + int (*Surface_NameToNum)( int modelindex, const char * name ); + const char * (*Surface_NumToName)( int modelindex, int num ); + int (*Surface_Flags)( int modelindex, int num ); + int (*Surface_NumSkins)( int modelindex, int num ); + + // TAG SPECIFIC STUFF + int (*Tag_NumForName)( int modelindex, const char * name ); + const char * (*Tag_NameForNum)( int modelindex, int num ); + orientation_t (*Tag_Orientation)( int modelindex, int anim, int frame, int num, float scale, int *bone_tag, vec4_t *bone_quat ); + orientation_t (*Tag_OrientationEx)( int modelindex, int anim, int frame, int num, float scale, int *bone_tag, vec4_t *bone_quat, + int crossblend_anim, int crossblend_frame, float crossblend_lerp, qboolean uselegs, qboolean usetorso, int torso_anim, int torso_frame, + int torso_crossblend_anim, int torso_crossblend_frame, float torso_crossblend_lerp ); + + qboolean (*Alias_Add)( int modelindex, const char * alias, const char * name, const char *parameters ); + const char * (*Alias_FindRandom)( int modelindex, const char * alias ); + void (*Alias_Dump)( int modelindex ); + void (*Alias_Clear)( int modelindex ); + const char * (*Alias_FindDialog)( int modelindex, const char * alias, int random, int entity_number ); + void *(*Alias_GetList)( int modelindex ); + void (*Alias_UpdateDialog)( int model_index, const char *alias, int number_of_times_played, byte been_played_this_loop, int last_time_played ); + void (*Alias_AddActorDialog)( int model_index, const char *alias, int actor_number, int number_of_times_played, byte been_played_this_loop, int last_time_played ); + + + const char * (*NameForNum)( int modelindex ); + + // GLOBAL ALIAS SYSTEM + qboolean (*GlobalAlias_Add)( const char * alias, const char * name, const char *parameters ); + const char * (*GlobalAlias_FindRandom)( const char * alias ); + void (*GlobalAlias_Dump)( void ); + void (*GlobalAlias_Clear)( void ); + + void (*centerprintf)( gentity_t *ent, const char *fmt, ...); + void (*locationprintf)( gentity_t *ent, int x, int y, const char *fmt, ...); + + // Sound + void (*Sound)( vec3_t *org, int entnum, int channel, const char *sound_name, float volume, float attenuation ); + void (*StopSound)( int entnum, int channel ); + float (*SoundLength) ( const char *path ); + byte *(*SoundAmplitudes)( const char * name, int *number_of_amplitudes ); + + + unsigned short (*CalcCRC)(const unsigned char *start, int count); + + debugline_t **DebugLines; + int *numDebugLines; + + void (*LocateGameData)( gentity_t *gEnts, int numGEntities, int sizeofGEntity_t, + playerState_t *clients, int sizeofGameClient ); + + void (*SetFarPlane)( int farplane ); + void (*SetSkyPortal)( qboolean skyportal ); + + } game_import_t; + +// +// functions exported by the game subsystem +// +typedef struct { + int apiversion; + + // the init function will only be called when a game starts, + // not each time a level is loaded. Persistant data for clients + // and the server can be allocated in init + void (*Init) ( int startTime, int randomSeed); + void (*Shutdown) (void); + void (*Cleanup) (void); + + // each new level entered will cause a call to SpawnEntities + void (*SpawnEntities) (const char *mapname, const char *entstring, int levelTime); + + // return NULL if the client is allowed to connect, otherwise return + // a text string with the reason for denial + char *(*ClientConnect)( int clientNum, qboolean firstTime ); + + void (*ClientBegin)( gentity_t *ent, usercmd_t *cmd ); + void (*ClientUserinfoChanged)( gentity_t *ent, const char *userinfo ); + void (*ClientDisconnect)( gentity_t *ent ); + void (*ClientCommand)( gentity_t *ent ); + void (*ClientThink)( gentity_t *ent, usercmd_t *cmd ); + + void (*BotBegin)( gentity_t *ent ); + void (*BotThink)( gentity_t *ent, int msec ); + + void (*PrepFrame)( void ); + void (*RunFrame)( int levelTime, int frameTime ); + + // ConsoleCommand will be called when a command has been issued + // that is not recognized as a builtin function. + // The game can issue gi.argc() / gi.argv() commands to get the command + // and parameters. Return qfalse if the game doesn't recognize it as a command. + qboolean (*ConsoleCommand)( void ); + + // Read/Write Persistant is for storing persistant cross level information + // about the world state and the clients. + // WriteGame is called every time a level is exited. + // ReadGame is called every time a level is entered. + void (*WritePersistant)( const char *filename ); + qboolean (*ReadPersistant)( const char *filename ); + + // ReadLevel is called after the default map information has been + // loaded with SpawnEntities, so any stored client spawn spots will + // be used when the clients reconnect. + void (*WriteLevel)( const char *filename, qboolean autosave ); + qboolean (*ReadLevel)( const char *filename ); + qboolean (*LevelArchiveValid)( const char *filename ); + + // + // global variables shared between game and server + // + + // The gentities array is allocated in the game dll so it + // can vary in size from one game to another. + // + // The size will be fixed when ge->Init() is called + // the server can't just use pointer arithmetic on gentities, because the + // server's sizeof(struct gentity_s) doesn't equal gentitySize + struct gentity_s *gentities; + int gentitySize; + int num_entities; // current number, <= max_entities + int max_entities; + + const char *error_message; +} game_export_t; + +game_export_t *GetGameApi (game_import_t *import); + +#endif // __G_PUBLIC_H__ + diff --git a/source/source/fgame/g_spawn.cpp b/source/source/fgame/g_spawn.cpp new file mode 100644 index 0000000..8e2d44c --- /dev/null +++ b/source/source/fgame/g_spawn.cpp @@ -0,0 +1,606 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/g_spawn.cpp $ +// $Revision:: 22 $ +// $Author:: Markd $ +// $Date:: 7/27/00 9:52p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/g_spawn.cpp $ +// +// 22 7/27/00 9:52p Markd +// Added FindClass function +// +// 21 6/14/00 4:06p Markd +// fixed two typos +// +// 20 6/14/00 3:50p Markd +// Cleaned up more Intel Compiler warnings +// +// 19 5/26/00 7:44p Markd +// 2nd phase save games +// +// 18 5/24/00 3:14p Markd +// first phase of save/load games +// +// 17 1/26/00 7:00p Markd +// fixed imbedded labels in entity scripts +// +// 16 1/10/00 5:28p Markd +// inhibited all lights from spawning +// +// 15 1/07/00 6:34p Steven +// Don't spawn an actor if the model is not found. +// +// 14 12/17/99 6:35p Jimdose +// changed spawnarg code +// added Level class for spawning and map control +// got rid of unused or superflous variables +// changed setjmp/longjmp calls to try/throw/catch exception handling +// +// 13 12/06/99 6:39p Jimdose +// changed call to cvar_forceset to cvar_set +// +// 12 10/06/99 7:26p Markd +// simplified makestatic code +// +// 11 10/06/99 7:25p Markd +// removed TIMESTAMP, time and fixed make_static bug +// +// 10 10/06/99 7:04p Markd +// Added make_static support +// +// 9 10/06/99 6:25p Markd +// put in MAKE_STATIC support into spawn code +// +// 8 10/04/99 10:47a Markd +// Fixed assertions which were actually errors +// +// 7 10/01/99 4:52p Markd +// Made Warning level 4 work on all projects +// +// 6 9/29/99 11:52a Markd +// removed some unused enums and variables form shared headers between cgame +// and fgame +// +// 5 9/28/99 4:26p Markd +// merged listener, class and vector between 3 projects +// +// 4 9/16/99 4:48p Jimdose +// removed unused code +// +// 3 9/16/99 11:18a Markd +// Continuing merge of code, not functional yet but closer +// +// 2 9/15/99 6:57p Aldie +// Update to get game working +// +// 1 9/10/99 10:54a Jimdose +// +// 1 9/08/99 3:16p Aldie +// +// 20 8/30/99 8:09p Markd +// made bad classname a developer 2 bug +// +// 19 8/28/99 3:42p Jimdose +// changed some doubles to floats +// +// 18 8/25/99 12:42p Markd +// Fixed some minor and major scripting bugs +// +// 17 8/19/99 6:59p Markd +// removed the old tiki_cmd structure, now tiki_cmd_t is passed into the tiki +// functions +// +// 16 8/17/99 3:20p Markd +// Fixed spawn issues with "script" key-value pair +// +// 15 8/02/99 11:19a Markd +// plugged potential empty line script bug +// +// 14 8/02/99 10:52a Markd +// Put in \n delimiters into initialization script +// +// 13 7/29/99 11:41a Markd +// Added precache and global support +// +// 12 6/18/99 6:00p Markd +// Added Script Initialization for most objects +// +// DESCRIPTION: +// + +#include "g_local.h" +#include "class.h" +#include "Entity.h" +#include "g_spawn.h" +#include "navigate.h" +#include "player.h" +#include "gravpath.h" +#include "object.h" + +CLASS_DECLARATION( Class, SpawnArgs, NULL ) + { + { NULL, NULL } + }; + +SpawnArgs::SpawnArgs() + { + } + +SpawnArgs::SpawnArgs + ( + SpawnArgs &otherlist + ) + + { + int num; + int i; + + num = otherlist.NumArgs(); + keyList.Resize( num ); + valueList.Resize( num ); + for( i = 1; i <= num; i++ ) + { + keyList.AddObject( otherlist.keyList.ObjectAt( i ) ); + valueList.AddObject( otherlist.valueList.ObjectAt( i ) ); + } + } + +void SpawnArgs::Clear + ( + void + ) + + { + keyList.FreeObjectList(); + valueList.FreeObjectList(); + } + +/* +==================== +Parse + +Parses spawnflags out of the given string, returning the new position. +Clears out any previous args. +==================== +*/ +const char *SpawnArgs::Parse + ( + const char *data + ) + + { + str keyname; + const char *com_token; + + Clear(); + + // parse the opening brace + com_token = COM_Parse( &data ); + if ( !data ) + { + return NULL; + } + + if ( com_token[ 0 ] != '{' ) + { + gi.Error( ERR_DROP, "SpawnArgs::Parse : found %s when expecting {", com_token ); + } + + // go through all the dictionary pairs + while( 1 ) + { + // parse key + com_token = COM_Parse( &data ); + if ( com_token[ 0 ] == '}' ) + { + break; + } + + if ( !data ) + { + gi.Error( ERR_DROP, "SpawnArgs::Parse : EOF without closing brace" ); + } + + keyname = com_token; + + // parse value + com_token = COM_Parse( &data ); + if ( !data ) + { + gi.Error( ERR_DROP, "SpawnArgs::Parse : EOF without closing brace" ); + } + + if ( com_token[ 0 ] == '}' ) + { + gi.Error( ERR_DROP, "SpawnArgs::Parse : closing brace without data" ); + } + + // keynames with a leading underscore are used for utility comments, + // and are immediately discarded by Fakk + if ( keyname[ 0 ] == '_' ) + { + continue; + } + + setArg( keyname.c_str(), com_token ); + } + + return data; + } + +const char *SpawnArgs::getArg + ( + const char *key, + const char *defaultValue + ) + + { + int i; + int num; + + num = keyList.NumObjects(); + for( i = 1; i <= num; i++ ) + { + if ( keyList.ObjectAt( i ) == key ) + { + return valueList.ObjectAt( i ); + } + } + + return defaultValue; + } + +void SpawnArgs::setArg + ( + const char *key, + const char *value + ) + + { + int i; + int num; + + num = keyList.NumObjects(); + for( i = 1; i <= num; i++ ) + { + if ( keyList.ObjectAt( i ) == key ) + { + valueList.ObjectAt( i ) = value; + return; + } + } + + keyList.AddObject( str( key ) ); + valueList.AddObject( str( value ) ); + } + +void SpawnArgs::operator= + ( + SpawnArgs &otherlist + ) + + { + int num; + int i; + + Clear(); + + num = otherlist.NumArgs(); + keyList.Resize( num ); + valueList.Resize( num ); + + for( i = 1; i <= num; i++ ) + { + keyList.AddObject( otherlist.keyList.ObjectAt( i ) ); + valueList.AddObject( otherlist.valueList.ObjectAt( i ) ); + } + } + +int SpawnArgs::NumArgs + ( + void + ) + + { + return keyList.NumObjects(); + } + +const char *SpawnArgs::getKey + ( + int index + ) + + { + return keyList.ObjectAt( index + 1 ); + } + +const char *SpawnArgs::getValue + ( + int index + ) + + { + return valueList.ObjectAt( index + 1 ); + } + +void SpawnArgs::Archive + ( + Archiver &arc + ) + + { + Class::Archive( arc ); + + keyList.Archive( arc ); + valueList.Archive( arc ); + } + +/* +=============== +getClass + +Finds the spawn function for the entity and returns ClassDef * +=============== +*/ + +ClassDef *SpawnArgs::getClassDef + ( + qboolean *tikiWasStatic + ) + + { + const char *classname; + ClassDef *cls = NULL; + + classname = getArg( "classname" ); + + if ( tikiWasStatic ) + { + *tikiWasStatic = qfalse; + } + + // + // check normal spawn functions + // see if the class name is stored within the model + // + if ( classname ) + { + // + // explicitly inhibit lights + // + if ( !strcmpi( classname, "light" ) ) + { + // + // HACK HACK HACK + // hack to suppress a warning message + // + if ( tikiWasStatic ) + { + *tikiWasStatic = qtrue; + } + return NULL; + } + + cls = getClassForID( classname ); + if ( !cls ) + { + cls = getClass( classname ); + } + } + + if ( !cls ) + { + const char *model; + + // + // get Object in case we cannot find an alternative + // + cls = &Object::ClassInfo; + model = getArg( "model" ); + if ( model ) + { + tiki_cmd_t cmds; + int modelindex; + int i; + + // + // get handle to def file + // + if ( ( strlen( model ) >= 3 ) && ( !strcmpi( &model[ strlen(model) - 3 ], "tik" ) ) ) + { + modelindex = modelIndex( model ); + + if ( modelindex == -1 ) + return NULL; + + if ( gi.IsModel( modelindex ) ) + { + const char * s; + + s = getArg( "make_static" ); + if ( s && atoi( s ) ) + { + // + // if make_static then we don't want to spawn + // + if ( tikiWasStatic ) + { + *tikiWasStatic = qtrue; + } + + return NULL; + } + + if ( gi.InitCommands( modelindex, &cmds ) ) + { + for( i = 0; i < cmds.num_cmds; i++ ) + { + if ( !strcmpi( cmds.cmds[ i ].args[ 0 ], "classname" ) ) + { + cls = getClass( cmds.cmds[ i ].args[ 1 ] ); + break; + } + } + if ( i == cmds.num_cmds ) + { + if ( developer->integer == 2 ) + gi.DPrintf( "Classname %s used, but 'classname' was not found in Initialization commands, using Object.\n", classname ); + } + } + else + gi.DPrintf( "Classname %s used, but TIKI had no Initialization commands, using Object.\n", classname ); + } + else + gi.DPrintf( "Classname %s used, but TIKI was not valid, using Object.\n", classname ); + } + else + gi.DPrintf( "Classname %s used, but model was not a TIKI, using Object.\n", classname ); + } + else + { + gi.DPrintf( "Classname %s' used, but no model was set, using Object.\n", classname ); + } + } + + return cls; + } + +/* +=============== +Spawn + +Finds the spawn function for the entity and calls it. +Returns pointer to Entity +=============== +*/ + +Entity *SpawnArgs::Spawn + ( + void + ) + + { + str classname; + ClassDef *cls; + Entity *obj; + Event *ev; + int i; + qboolean tikiWasStatic; // used to determine if entity was intentionally suppressed + + classname = getArg( "classname", "Unspecified" ); + cls = getClassDef( &tikiWasStatic ); + if ( !cls ) + { + if ( !tikiWasStatic ) + { + gi.DPrintf( "%s doesn't have a spawn function\n", classname.c_str() ); + } + + return NULL; + } + + obj = ( Entity * )cls->newInstance(); + + // post spawnarg events + for( i = 0; i < NumArgs(); i++ ) + { + // if it is the "script" key, execute the script commands individually + if ( !Q_stricmp( getKey( i ), "script" ) ) + { + char *ptr; + char * token; + + ptr = const_cast< char * >( getValue( i ) ); + while ( 1 ) + { + token = COM_ParseExt( &ptr, qtrue ); + if ( !token[ 0 ] ) + break; + if ( strchr( token, ':' ) ) + { + gi.DPrintf( "Label %s imbedded inside editor script for %s.\n", token, classname.c_str() ); + } + else + { + ev = new Event( token ); + while ( 1 ) + { + token = COM_ParseExt( &ptr, qfalse ); + if ( !token[ 0 ] ) + break; + ev->AddToken( token ); + } + obj->PostEvent( ev, EV_SPAWNARG ); + } + } + } + else + { + ev = new Event( getKey( i ) ); + ev->AddToken( getValue( i ) ); + obj->PostEvent( ev, EV_SPAWNARG ); + } + } + + if ( !obj ) + { + gi.DPrintf( "%s failed on newInstance\n", classname.c_str() ); + return NULL; + } + + return obj; + } + +/* +============== +G_InitClientPersistant + +This is only called when the game first initializes in single player, +but is called after each death and level change in deathmatch +============== +*/ +void G_InitClientPersistant + ( + gclient_t *client + ) + + { + memset( &client->pers, 0, sizeof( client->pers ) ); + } + + +ClassDef *FindClass + ( + const char *name, + qboolean *isModel + ) + + { + ClassDef *cls; + + *isModel = qfalse; + + // first lets see if it is a registered class name + cls = getClass( name ); + if ( !cls ) + { + SpawnArgs args; + + // if that didn't work lets try to resolve it as a model + args.setArg( "model", name ); + + cls = args.getClassDef(); + if ( cls ) + { + *isModel = qtrue; + } + } + return cls; + } diff --git a/source/source/fgame/g_spawn.h b/source/source/fgame/g_spawn.h new file mode 100644 index 0000000..94e14ea --- /dev/null +++ b/source/source/fgame/g_spawn.h @@ -0,0 +1,88 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/g_spawn.h $ +// $Revision:: 5 $ +// $Author:: Markd $ +// $Date:: 7/27/00 9:52p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/g_spawn.h $ +// +// 5 7/27/00 9:52p Markd +// Added FindClass function +// +// 4 6/14/00 11:18a Markd +// cleaned up code using Intel compiler +// +// 3 5/24/00 3:14p Markd +// first phase of save/load games +// +// 2 12/17/99 6:35p Jimdose +// changed spawnarg code +// added Level class for spawning and map control +// got rid of unused or superflous variables +// changed setjmp/longjmp calls to try/throw/catch exception handling +// +// 1 9/10/99 10:54a Jimdose +// +// 1 9/08/99 3:16p Aldie +// +// 7 8/28/99 3:42p Jimdose +// changed some doubles to floats +// +// DESCRIPTION: +// + +#ifndef __G_SPAWN_H__ +#define __G_SPAWN_H__ + +#include "entity.h" + +// spawnflags +// these are set with checkboxes on each entity in the map editor +#define SPAWNFLAG_NOT_EASY 0x00000100 +#define SPAWNFLAG_NOT_MEDIUM 0x00000200 +#define SPAWNFLAG_NOT_HARD 0x00000400 +#define SPAWNFLAG_NOT_DEATHMATCH 0x00000800 +#define SPAWNFLAG_DEVELOPMENT 0x00002000 +#define SPAWNFLAG_DETAIL 0x00004000 + +class SpawnArgs : public Class + { + private: + Container keyList; + Container valueList; + + public: + CLASS_PROTOTYPE( SpawnArgs ); + + SpawnArgs(); + SpawnArgs( SpawnArgs &arglist ); + + void Clear( void ); + + const char *Parse( const char *data ); + const char *getArg( const char *key, const char *defaultValue = NULL ); + void setArg( const char *key, const char *value ); + + int NumArgs( void ); + const char *getKey( int index ); + const char *getValue( int index ); + void operator=( SpawnArgs &a ); + + ClassDef *getClassDef( qboolean *tikiWasStatic = NULL ); + Entity *Spawn( void ); + + virtual void Archive( Archiver &arc ); + }; + +void G_InitClientPersistant( gclient_t *client ); +ClassDef *FindClass( const char *name, qboolean *isModel ); + +#endif + diff --git a/source/source/fgame/g_utils.cpp b/source/source/fgame/g_utils.cpp new file mode 100644 index 0000000..50cf50e --- /dev/null +++ b/source/source/fgame/g_utils.cpp @@ -0,0 +1,2440 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/g_utils.cpp $ +// $Revision:: 93 $ +// $Author:: Steven $ +// $Date:: 8/10/00 4:01p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/g_utils.cpp $ +// +// 93 8/10/00 4:01p Steven +// Fixed some case sensitive stuff in CacheResource. +// +// 92 8/04/00 3:54p Markd +// Added StartCinematic and StopCinematic +// +// 91 7/29/00 11:51p Aldie +// Added back in G_ClearFade +// +// 90 29.07.00 11:40p Jimdose +// fixed bug in findradius +// +// 88 29.07.00 10:51p Jimdose +// added radius2 to gentity_t +// +// 87 7/29/00 4:00p Aldie +// Added autofadein for skipping cinematics +// +// 86 7/28/00 6:57p Steven +// Made CloneEntity process init commands again and added some player died +// stuff. +// +// 85 7/28/00 1:10a Markd +// canceled init commands on fakeplayered julie +// +// 84 7/27/00 10:54p Steven +// Added means of death eat. +// +// 83 7/27/00 9:43p Aldie +// Changed dialog for invalid save games +// +// 82 7/24/00 5:55p Markd +// added back in centerprint on mission failed +// +// 81 7/23/00 6:03p Markd +// added fadeout and fadesound to dieing and level change +// +// 80 7/19/00 8:19p Steven +// Added gas blockable means of death. +// +// 79 7/19/00 5:08p Steven +// Added electric water means of death. +// +// 78 7/18/00 3:29p Markd +// added better caching for sounds in general +// +// 77 7/17/00 2:55p Steven +// Fixed mission failed graphic. +// +// 76 7/16/00 4:37p Steven +// Added new fire means of death. +// +// 75 7/15/00 12:52p Markd +// added mission failure code +// +// 74 7/13/00 12:30p Steven +// Added poison means of death, changed G_TraceEntities to find all entities at +// once instead of 1 at a time, and optimized broadcast sound. +// +// 73 7/11/00 8:03a Steven +// Fixed MOD_matches to return true when damage_type == all (-1) not the +// opposite. +// +// 72 7/11/00 12:01a Markd +// Added light sword as valid MOD_SWORD damage +// +// 71 7/10/00 11:54p Markd +// added exit level code +// +// 70 7/07/00 6:36p Steven +// Added mission failed stuff. +// +// 69 7/02/00 6:46p Markd +// added spawn thread to PlayerStart +// +// 68 7/02/00 1:11p Steven +// Changed means of death light to lightsword. +// +// 67 7/01/00 12:01p Steven +// Added electricsword and plasmashotgun means of death. +// +// 66 6/29/00 2:06p Steven +// Added caching of statemaps to CacheResource. +// +// 65 6/28/00 7:55p Aldie +// Added a MOD +// +// 64 6/17/00 11:55a Steven +// Fixed looping sounds in save games. +// +// 63 6/14/00 5:43p Steven +// Added plasmabeam means of death. +// +// 62 6/14/00 3:50p Markd +// Cleaned up more Intel Compiler warnings +// +// 61 6/13/00 6:46p Aldie +// Added some damage debug info. Added an ignoreEnt for explosion events +// +// 60 6/13/00 3:45p Steven +// Added a gib means of death. +// +// 59 6/08/00 1:45p Steven +// Added means of death light. +// +// 58 6/06/00 2:37p Steven +// Added sting2 means of death. +// +// 57 6/05/00 6:42p Steven +// Added radiation means of death. +// +// 56 6/05/00 3:29p Aldie +// Added flickering to waterstats +// +// 55 6/03/00 3:46p Aldie +// Added in g_debugtargets for debugging targetnames and targets +// +// 54 5/31/00 10:19a Markd +// 4th pass saved games +// +// 53 5/30/00 10:59a Aldie +// Added Circle of Protection Powerup +// +// 52 5/27/00 2:56p Markd +// Save games 2nd pass +// +// 51 5/25/00 4:28p Markd +// fixed up archive functions +// +// 50 5/22/00 5:13p Aldie +// First version of soulsucker +// +// 49 5/16/00 4:12p Markd +// increased level time precision on g_Showtrace +// +// 48 5/10/00 10:31a Steven +// Added means of death firesword. +// +// 47 5/05/00 2:15p Steven +// Added chainsword and on_fire means of death. +// +// 46 5/04/00 12:46p Steven +// Added an axe means of death. +// +// 45 4/27/00 12:04p Steven +// Added crush_every_frame means of death. +// +// 44 4/18/00 12:27p Markd +// added radius support to findradius +// +// 43 4/15/00 4:24p Markd +// Fixed player turning +// +// 42 4/10/00 1:20p Markd +// Fixed typo +// +// 41 4/05/00 3:51p Markd +// added label checking for scripts +// +// 40 3/23/00 12:19p Markd +// increased range of dynamic light radius +// +// 39 3/15/00 4:09p Aldie +// Fixed a bug with using weapons, and added some ability to force a state in +// the player +// +// 38 3/04/00 2:02p Markd +// fixed constantLight problem +// +// 37 3/04/00 11:48a Markd +// Added light style support +// +// 36 3/03/00 4:42p Markd +// added in debugging messages for music and reverb +// +// 35 2/29/00 5:51p Jimdose +// added alternate spawnpoint support +// +// 34 2/23/00 6:21p Aldie +// More inventory changes +// +// 33 2/17/00 6:26p Aldie +// Fixed naming conventions for weapon hand and also added various attachtotag +// functionality for weapons that attach to different tags depending on which +// hand they are wielded in. +// +// 32 1/22/00 5:09p Steven +// Added a trace entities function. +// +// 31 1/22/00 1:44p Markd +// Fixed attached entity bug +// +// 30 1/22/00 12:42p Jimdose +// got rid of calls to vec3() +// +// 29 1/14/00 5:06p Markd +// Removed surface num, tri_num and damage_multiplier from multiple functions +// and events +// +// 28 1/11/00 6:41p Markd +// Removed fulltrace code from the game +// +// 27 1/06/00 11:08p Jimdose +// cleaning up unused code +// +// 26 1/05/00 7:25p Jimdose +// made angle functions all use the same coordinate system +// AngleVectors now returns left instead of right +// no longer need to invert pitch +// +// 25 12/17/99 8:26p Jimdose +// got rid of unused vars and functions +// +// 24 12/17/99 6:35p Jimdose +// changed spawnarg code +// added Level class for spawning and map control +// got rid of unused or superflous variables +// changed setjmp/longjmp calls to try/throw/catch exception handling +// +// 23 12/02/99 6:58p Markd +// fixed attached entity bug with cloning entities +// +// 22 11/12/99 11:21a Markd +// Added Debug Circles and DebugPyramids +// +// 21 11/09/99 8:05p Markd +// Fixed ArchiveEdict function +// +// 20 11/01/99 4:00p Jimdose +// initialized quaternion values on bone controllers +// +// 19 10/29/99 6:46p Jimdose +// added bone controllers +// +// 18 10/29/99 2:18p Markd +// don't copy over the eflags +// +// 17 10/28/99 6:33p Markd +// Added fakeplayer ability, also added CloneEntity +// +// 16 10/25/99 6:39p Markd +// removed size and other unused variables, added radius and centroid to both +// server and game code +// +// 15 10/14/99 5:08p Markd +// removed a lot of G_GetMoveDir calls from the initialization code +// +// 14 10/13/99 4:47p Steven +// Fixed BroadcastSound. +// +// 13 10/12/99 2:23p Markd +// Rewrote camera and player movetype system +// +// 12 10/05/99 2:28p Markd +// fixed all assignment within conditional warnings +// +// 11 10/01/99 2:42p Markd +// moved all the binding code back into Entity from Mover +// +// 10 9/28/99 5:15p Markd +// Fixed more merge bugs with sharing class, vector and listener between three +// modules +// +// 9 9/28/99 4:26p Markd +// merged listener, class and vector between 3 projects +// +// 8 9/23/99 12:38p Markd +// fixed a lot of renderer startup warnings, errors and bugs +// +// 7 9/22/99 4:47p Markd +// fixed more G_GetEntity, G_FindClass and G_GetNextEntity bugs +// +// 6 9/21/99 7:51p Markd +// Fixed a lot of entitynum_none issues +// +// 5 9/16/99 11:18a Markd +// Continuing merge of code, not functional yet but closer +// +// 4 9/15/99 6:57p Aldie +// Update to get game working +// +// 3 9/13/99 4:22p Jimdose +// merge +// +// 2 9/13/99 3:27p Aldie +// code merge +// +// 1 9/10/99 10:54a Jimdose +// +// 1 9/08/99 3:16p Aldie +// +// 28 9/02/99 5:41p Markd +// made CacheResource utility functions changed code every where else +// +// 27 9/01/99 4:21p Jimdose +// fixed bug in findclientsinradius where passing in a NULL entity crashes +// +// 26 8/30/99 2:36p Steven +// Added support for volume and minimum distance for loop sounds. +// +// 25 8/28/99 3:22p Markd +// initialize r_constantlight to 1, 1, 1 +// +// 24 8/25/99 12:42p Markd +// Fixed some minor and major scripting bugs +// +// 23 8/18/99 3:28p Jimdose +// added cylindrical collision detection +// +// 22 8/17/99 5:08p Markd +// Changed all FS_ReadFile's to FS_ReadFileEx's in game code +// +// 21 7/29/99 5:33p Markd +// Fixed weird compiler bug +// +// 20 7/29/99 11:41a Markd +// Added precache and global support +// +// DESCRIPTION: +// + +#include "g_local.h" +#include "g_utils.h" +#include "ctype.h" +#include "worldspawn.h" +#include "scriptmaster.h" +#include "player.h" +#include "PlayerStart.h" + +char means_of_death_strings[ MOD_TOTAL_NUMBER ][ 32 ] = + { + "none", + "drown", + "suicide", + "crush", + "crush_every_frame", + "telefrag", + "lava", + "slime", + "falling", + "last_self_inflicted", + "explosion", + "explodewall", + "electric", + "electricwater", + "thrownobject", + "beam", + "rocket", + "impact", + "gas", + "gas_blockable", + "acid", + "sword", + "plasma", + "plasmabeam", + "plasmashotgun", + "sting", + "sting2", + "sling", + "bullet", + "fast_bullet", + "vehicle", + "fire", + "fire_blockable", + "vortex", + "lifedrain", + "flashbang", + "poo_explosion", + "axe", + "chainsword", + "on_fire", + "firesword", + "electricsword", + "circleofprotection", + "radiation", + "lightsword", + "gib", + "impale", + "uppercut", + "poison", + "eat" + }; + +int MOD_string_to_int( str immune_string ) + { + int i; + + for ( i = 0 ; i < MOD_TOTAL_NUMBER ; i++ ) + { + if ( !immune_string.icmp( means_of_death_strings[ i ] ) ) + return i; + } + + gi.DPrintf( "Unknown means of death - %s\n", immune_string.c_str() ); + return -1; + } + +qboolean MOD_matches + ( + int incoming_damage, + int damage_type + ) + { + if ( damage_type == -1 ) + { + return qtrue; + } + + // special case the sword + if ( damage_type == MOD_SWORD ) + { + if ( + ( incoming_damage == MOD_SWORD ) || + ( incoming_damage == MOD_ELECTRICSWORD ) || + ( incoming_damage == MOD_LIGHTSWORD ) || + ( incoming_damage == MOD_FIRESWORD ) + ) + { + return qtrue; + } + } + else if ( damage_type == incoming_damage ) + { + return qtrue; + } + + return qfalse; + } + +/* +============ +G_TouchTriggers + +============ +*/ +void G_TouchTriggers + ( + Entity *ent + ) + + { + int i; + int num; + int touch[ MAX_GENTITIES ]; + gentity_t *hit; + Event *ev; + + // dead things don't activate triggers! + if ( ( ent->client || ( ent->edict->svflags & SVF_MONSTER ) ) && ( ent->health <= 0 ) ) + { + return; + } + + num = gi.AreaEntities( ent->absmin, ent->absmax, touch, MAX_GENTITIES ); + + // be careful, it is possible to have an entity in this + // list removed before we get to it (killtriggered) + for( i = 0; i < num; i++ ) + { + hit = &g_entities[ touch[ i ] ]; + if ( !hit->inuse || ( hit->entity == ent ) || ( hit->solid != SOLID_TRIGGER ) ) + { + continue; + } + + assert( hit->entity ); + + // FIXME + // should we post the events on the list with zero time + ev = new Event( EV_Touch ); + ev->AddEntity( ent ); + hit->entity->ProcessEvent( ev ); + } + } + +/* +============ +G_TouchSolids + +Call after linking a new trigger in during gameplay +to force all entities it covers to immediately touch it +============ +*/ +void G_TouchSolids + ( + Entity *ent + ) + + { + int i; + int num; + int touch[ MAX_GENTITIES ]; + gentity_t *hit; + Event *ev; + + num = gi.AreaEntities( ent->absmin, ent->absmax, touch, MAX_GENTITIES ); + + // be careful, it is possible to have an entity in this + // list removed before we get to it (killtriggered) + for( i = 0; i < num; i++ ) + { + hit = &g_entities[ touch[ i ] ]; + if ( !hit->inuse ) + { + continue; + } + + assert( hit->entity ); + + //FIXME + // should we post the events so that we don't have to worry about any entities going away + ev = new Event( EV_Touch ); + ev->AddEntity( ent ); + hit->entity->ProcessEvent( ev ); + } + } + +void G_ShowTrace + ( + trace_t *trace, + gentity_t *passent, + const char *reason + ) + + { + str text; + str pass; + str hit; + + assert( reason ); + assert( trace ); + + if ( passent ) + { + pass = va( "'%s'(%d)", passent->entname, passent->s.number ); + } + else + { + pass = "NULL"; + } + + if ( trace->ent ) + { + hit = va( "'%s'(%d)", trace->ent->entname, trace->ent->s.number ); + } + else + { + hit = "NULL"; + } + + text = va( "%0.2f : Pass %s Frac %f Hit %s : '%s'\n", + level.time, pass.c_str(), trace->fraction, hit.c_str(), reason ? reason : "" ); + + if ( sv_traceinfo->integer == 3 ) + { + gi.DebugPrintf( text.c_str() ); + } + else + { + gi.DPrintf( "%s", text.c_str() ); + } + } + +void G_CalcBoundsOfMove + ( + Vector &start, + Vector &end, + Vector &mins, + Vector &maxs, + Vector *minbounds, + Vector *maxbounds + ) + + { + Vector bmin; + Vector bmax; + + ClearBounds( bmin, bmax ); + AddPointToBounds( start, bmin, bmax ); + AddPointToBounds( end, bmin, bmax ); + bmin += mins; + bmax += maxs; + + if ( minbounds ) + { + *minbounds = bmin; + } + + if ( maxbounds ) + { + *maxbounds = bmax; + } + } + +trace_t G_Trace + ( + vec3_t start, + vec3_t mins, + vec3_t maxs, + vec3_t end, + gentity_t *passent, + int contentmask, + qboolean cylinder, + const char *reason + ) + + { + int entnum; + trace_t trace; + + if ( passent ) + { + entnum = passent->s.number; + } + else + { + entnum = ENTITYNUM_NONE; + } + + gi.trace( &trace, start, mins, maxs, end, entnum, contentmask, cylinder ); + + if ( trace.entityNum == ENTITYNUM_NONE ) + { + trace.ent = NULL; + } + else + { + trace.ent = &g_entities[ trace.entityNum ]; + } + + if ( sv_traceinfo->integer > 1 ) + { + G_ShowTrace( &trace, passent, reason ); + } + sv_numtraces++; + + if ( sv_drawtrace->integer ) + { + G_DebugLine( Vector( start ), Vector( end ), 1, 1, 0, 1 ); + } + + return trace; + } + +trace_t G_Trace + ( + Vector &start, + Vector &mins, + Vector &maxs, + Vector &end, + Entity *passent, + int contentmask, + qboolean cylinder, + const char *reason + ) + + { + gentity_t *ent; + int entnum; + trace_t trace; + + assert( reason ); + + if ( passent == NULL ) + { + ent = NULL; + entnum = ENTITYNUM_NONE; + } + else + { + ent = passent->edict; + entnum = ent->s.number; + } + + gi.trace( &trace, start, mins, maxs, end, entnum, contentmask, cylinder ); + + if ( trace.entityNum == ENTITYNUM_NONE ) + { + trace.ent = NULL; + } + else + { + trace.ent = &g_entities[ trace.entityNum ]; + } + + if ( sv_traceinfo->integer > 1 ) + { + G_ShowTrace( &trace, ent, reason ); + } + + sv_numtraces++; + + if ( sv_drawtrace->integer ) + { + G_DebugLine( start, end, 1, 1, 0, 1 ); + } + + return trace; + } + +void G_TraceEntities + ( + Vector &start, + Vector &mins, + Vector &maxs, + Vector &end, + Container*victimlist, + int contentmask + ) + + { + trace_t trace; + vec3_t boxmins; + vec3_t boxmaxs; + int num; + int touchlist[MAX_GENTITIES]; + gentity_t *touch; + int i; + + + // Find the bounding box + + for ( i=0 ; i<3 ; i++ ) + { + if ( end[i] > start[i] ) + { + boxmins[i] = start[i] + mins[i] - 1; + boxmaxs[i] = end[i] + maxs[i] + 1; + } + else + { + boxmins[i] = end[i] + mins[i] - 1; + boxmaxs[i] = start[i] + maxs[i] + 1; + } + } + + // Find the list of entites + + num = gi.AreaEntities( boxmins, boxmaxs, touchlist, MAX_GENTITIES ); + + for ( i=0 ; isolid == SOLID_NOT) + continue; + if (touch->solid == SOLID_TRIGGER) + continue; + + gi.ClipToEntity( &trace, start, mins, maxs, end, touchlist[i], contentmask ); + + if ( trace.entityNum == touchlist[i] ) + victimlist->AddObject( touch->entity ); + } + } + +/* +======================================================================= + + SelectSpawnPoint + +======================================================================= +*/ + +/* +================ +PlayersRangeFromSpot + +Returns the distance to the nearest player from the given spot +================ +*/ +float PlayersRangeFromSpot + ( + Entity *spot + ) + + { + Entity *player; + float bestplayerdistance; + Vector v; + int n; + float playerdistance; + + bestplayerdistance = 9999999; + for( n = 0; n < maxclients->integer; n++ ) + { + if ( !g_entities[ n ].inuse || !g_entities[ n ].entity ) + { + continue; + } + + player = g_entities[ n ].entity; + if ( player->health <= 0 ) + { + continue; + } + + v = spot->origin - player->origin; + playerdistance = v.length(); + + if ( playerdistance < bestplayerdistance ) + { + bestplayerdistance = playerdistance; + } + } + + return bestplayerdistance; + } + +/* +================ +SelectRandomDeathmatchSpawnPoint + +go to a random point, but NOT the two points closest +to other players +================ +*/ +Entity *SelectRandomDeathmatchSpawnPoint + ( + void + ) + + { + Entity *spot, *spot1, *spot2; + int count = 0; + int selection; + float range, range1, range2; + + spot = NULL; + range1 = range2 = 99999; + spot1 = spot2 = NULL; + + for( spot = G_FindClass( spot, "info_player_deathmatch" ); spot ; spot = G_FindClass( spot, "info_player_deathmatch" ) ) + { + count++; + range = PlayersRangeFromSpot( spot ); + if ( range < range1 ) + { + range1 = range; + spot1 = spot; + } + else if (range < range2) + { + range2 = range; + spot2 = spot; + } + } + + if ( !count ) + { + return NULL; + } + + if ( count <= 2 ) + { + spot1 = spot2 = NULL; + } + else + { + count -= 2; + } + + selection = rand() % count; + + spot = NULL; + do + { + spot = G_FindClass( spot, "info_player_deathmatch" ); + + // if there are no more, break out + if ( !spot ) + break; + + if ( spot == spot1 || spot == spot2 ) + { + selection++; + } + } + while( selection-- ); + + return spot; + } + +/* +================ +SelectFarthestDeathmatchSpawnPoint + +================ +*/ +Entity *SelectFarthestDeathmatchSpawnPoint + ( + void + ) + + { + Entity *bestspot; + float bestdistance; + float bestplayerdistance; + Entity *spot; + + spot = NULL; + bestspot = NULL; + bestdistance = 0; + for( spot = G_FindClass( spot, "info_player_deathmatch" ); spot ; spot = G_FindClass( spot, "info_player_deathmatch" ) ) + { + bestplayerdistance = PlayersRangeFromSpot( spot ); + if ( bestplayerdistance > bestdistance ) + { + bestspot = spot; + bestdistance = bestplayerdistance; + } + } + + if ( bestspot ) + { + return bestspot; + } + + // if there is a player just spawned on each and every start spot + // we have no choice to turn one into a telefrag meltdown + spot = G_FindClass( NULL, "info_player_deathmatch" ); + + return spot; + } + +Entity *SelectDeathmatchSpawnPoint + ( + void + ) + + { + if ( DM_FLAG( DF_SPAWN_FARTHEST ) ) + { + return SelectFarthestDeathmatchSpawnPoint(); + } + else + { + return SelectRandomDeathmatchSpawnPoint(); + } + } + +/* +=========== +SelectSpawnPoint + +Chooses a player start, deathmatch start, etc +============ +*/ +void SelectSpawnPoint + ( + Vector &org, + Vector &ang, + str &thread + ) + + { + Entity *spot = NULL; + + if ( deathmatch->integer ) + { + spot = SelectDeathmatchSpawnPoint(); + } + + // find a single player start spot + if ( !spot ) + { + while( ( spot = G_FindClass( spot, "info_player_start" ) ) != NULL ) + { + if ( level.spawnpoint.icmp( spot->TargetName() ) == 0 ) + { + break; + } + } + + if ( !spot && !level.spawnpoint.length() ) + { + // there wasn't a spawnpoint without a target, so use any + spot = G_FindClass( NULL, "info_player_start" ); + } + + if ( !spot ) + { + gi.Error( ERR_DROP, "No player spawn position named '%s'. Can't spawn player.\n", level.spawnpoint.c_str() ); + } + } + + org = spot->origin; + ang = spot->angles; + // + // see if we have a thread + // + if ( spot->isSubclassOf( PlayerStart ) ) + { + thread = ( ( PlayerStart * )spot )->getThread(); + } + } + + +/* +============= +M_CheckBottom + +Returns false if any part of the bottom of the entity is off an edge that +is not a staircase. + +============= +*/ +int c_yes, c_no; + +qboolean M_CheckBottom + ( + Entity *ent + ) + + { + Vector mins, maxs, start, stop; + trace_t trace; + int x, y; + float mid, bottom; + + mins = ent->origin + ent->mins * 0.5; + maxs = ent->origin + ent->maxs * 0.5; + + // if all of the points under the corners are solid world, don't bother + // with the tougher checks + // the corners must be within 16 of the midpoint + start[ 2 ] = mins[ 2 ] - 1; + + for( x = 0; x <= 1; x++ ) + { + for( y = 0; y <= 1; y++ ) + { + start[ 0 ] = x ? maxs[ 0 ] : mins[ 0 ]; + start[ 1 ] = y ? maxs[ 1 ] : mins[ 1 ]; + if ( gi.pointcontents( start, 0 ) != CONTENTS_SOLID ) + { + goto realcheck; + } + } + } + + c_yes++; + return true; // we got out easy + +realcheck: + + c_no++; + + // + // check it for real... + // + start[ 2 ] = mins[ 2 ]; + + // the midpoint must be within 16 of the bottom + start[ 0 ] = stop[ 0 ] = ( mins[ 0 ] + maxs[ 0 ] ) * 0.5; + start[ 1 ] = stop[ 1 ] = ( mins[ 1 ] + maxs[ 1 ] ) * 0.5; + stop[ 2 ] = start[ 2 ] - 3 * STEPSIZE;//2 * STEPSIZE; + + trace = G_Trace( start, vec_zero, vec_zero, stop, ent, MASK_MONSTERSOLID, false, "M_CheckBottom 1" ); + + if ( trace.fraction == 1.0 ) + { + return false; + } + + mid = bottom = trace.endpos[ 2 ]; + + // the corners must be within 16 of the midpoint + for( x = 0; x <= 1; x++ ) + { + for( y = 0; y <= 1; y++ ) + { + start[ 0 ] = stop[ 0 ] = x ? maxs[ 0 ] : mins[ 0 ]; + start[ 1 ] = stop[ 1 ] = y ? maxs[ 1 ] : mins[ 1 ]; + + trace = G_Trace( start, vec_zero, vec_zero, stop, ent, MASK_MONSTERSOLID, false, "M_CheckBottom 2" ); + + if ( trace.fraction != 1.0 && trace.endpos[ 2 ] > bottom ) + { + bottom = trace.endpos[ 2 ]; + } + + if ( trace.fraction == 1.0 || mid - trace.endpos[ 2 ] > STEPSIZE ) + { + return false; + } + } + } + + c_yes++; + return true; + } + +Entity * G_FindClass + ( + Entity * ent, + const char *classname + ) + + { + int entnum; + gentity_t *from; + + if ( ent ) + { + entnum = ent->entnum; + } + else + { + entnum = -1; + } + + for ( from = &g_entities[ entnum + 1 ]; from < &g_entities[ globals.num_entities ] ; from++ ) + { + if ( !from->inuse ) + { + continue; + } + if ( !Q_stricmp ( from->entity->getClassID(), classname ) ) + { + return from->entity; + } + } + + return NULL; + } + +Entity * G_FindTarget + ( + Entity * ent, + const char *name + ) + + { + Entity *next; + + if ( name && name[ 0 ] ) + { + next = world->GetNextEntity( str( name ), ent ); + if ( next ) + { + return next; + } + } + + return NULL; + } + +Entity *G_NextEntity + ( + Entity *ent + ) + + { + gentity_t *from; + + if ( !g_entities ) + { + return NULL; + } + + if ( !ent ) + { + from = g_entities; + } + else + { + from = ent->edict + 1; + } + + if ( !from ) + { + return NULL; + } + + for ( ; from < &g_entities[ globals.num_entities ] ; from++ ) + { + if ( !from->inuse || !from->entity ) + { + continue; + } + + return from->entity; + } + + return NULL; + } + +// +// QuakeEd only writes a single float for angles (bad idea), so up and down are +// just constant angles. +// +Vector G_GetMovedir + ( + float angle + ) + + { + if ( angle == -1 ) + { + return Vector( 0, 0, 1 ); + } + else if ( angle == -2 ) + { + return Vector( 0, 0, -1 ); + } + + angle *= ( M_PI * 2 / 360 ); + return Vector( cos( angle ), sin( angle ), 0 ); + } + +/* +================= +KillBox + +Kills all entities that would touch the proposed new positioning +of ent. Ent should be unlinked before calling this! +================= +*/ +qboolean KillBox + ( + Entity *ent + ) + + { + int i; + int num; + int touch[ MAX_GENTITIES ]; + gentity_t *hit; + Vector min; + Vector max; + int fail; + + fail = 0; + + min = ent->origin + ent->mins; + max = ent->origin + ent->maxs; + + num = gi.AreaEntities( min, max, touch, MAX_GENTITIES ); + + for( i = 0; i < num; i++ ) + { + hit = &g_entities[ touch[ i ] ]; + + if ( !hit->inuse || ( hit->entity == ent ) || !hit->entity || ( hit->entity == world ) || ( !hit->entity->edict->solid ) ) + { + continue; + } + + hit->entity->Damage( ent, ent, hit->entity->health + 100000, ent->origin, vec_zero, vec_zero, + 0, DAMAGE_NO_PROTECTION, MOD_TELEFRAG ); + + // + // if we didn't kill it, fail + // + if ( hit->entity->getSolidType() != SOLID_NOT ) + { + fail++; + } + } + + // + // all clear + // + return !fail; + } + +qboolean IsNumeric + ( + const char *str + ) + + { + int len; + int i; + qboolean dot; + + if ( *str == '-' ) + { + str++; + } + + dot = false; + len = strlen( str ); + for( i = 0; i < len; i++ ) + { + if ( !isdigit( str[ i ] ) ) + { + if ( ( str[ i ] == '.' ) && !dot ) + { + dot = true; + continue; + } + return false; + } + } + + return true; + } + +/* +================= +findradius + +Returns entities that have origins within a spherical area + +findradius (org, radius) +================= +*/ +Entity *findradius + ( + Entity *startent, + Vector org, + float rad + ) + + { + Vector eorg; + gentity_t *from; + float r2, distance; + + if ( !startent ) + { + from = active_edicts.next; + } + else + { + from = startent->edict->next; + } + + assert( from ); + if ( !from ) + { + return NULL; + } + + assert( ( from == &active_edicts ) || ( from->inuse ) ); + + // square the radius so that we don't have to do a square root + r2 = rad * rad; + + for( ; from != &active_edicts; from = from->next ) + { + assert( from->inuse ); + assert( from->entity ); + + eorg = org - from->entity->centroid; + + // dot product returns length squared + distance = eorg * eorg; + + if ( distance <= r2 ) + { + return from->entity; + } + else + { + // subtract the object's own radius from this distance + distance -= from->radius2; + if ( distance <= r2 ) + { + return from->entity; + } + } + } + + return NULL; + } + +/* +================= +findclientinradius + +Returns clients that have origins within a spherical area + +findclientinradius (org, radius) +================= +*/ +Entity *findclientsinradius + ( + Entity *startent, + Vector org, + float rad + ) + + { + Vector eorg; + gentity_t *ed; + float r2; + int i; + + // square the radius so that we don't have to do a square root + r2 = rad * rad; + + if ( !startent ) + { + i = 0; + } + else + { + i = startent->entnum + 1; + } + + for( ; i < game.maxclients; i++ ) + { + ed = &g_entities[ i ]; + + if ( !ed->inuse || !ed->entity ) + { + continue; + } + + eorg = org - ed->entity->centroid; + + // dot product returns length squared + if ( ( eorg * eorg ) <= r2 ) + { + return ed->entity; + } + } + + return NULL; + } + +Vector G_CalculateImpulse + ( + Vector start, + Vector end, + float speed, + float gravity + ) + + { + float traveltime, vertical_speed; + Vector dir, xydir, velocity; + + dir = end - start; + xydir = dir; + xydir.z = 0; + traveltime = xydir.length() / speed; + vertical_speed = ( dir.z / traveltime ) + ( 0.5f * gravity * sv_gravity->value * traveltime ); + xydir.normalize(); + + velocity = speed * xydir; + velocity.z = vertical_speed; + return velocity; + } + +Vector G_PredictPosition + ( + Vector start, + Vector target, + Vector targetvelocity, + float speed + ) + + { + Vector projected; + float traveltime; + Vector dir, xydir; + + dir = target - start; + xydir = dir; + xydir.z = 0; + traveltime = xydir.length() / speed; + projected = target + ( targetvelocity * traveltime ); + + return projected; + } + +char *ClientTeam + ( + gentity_t *ent + ) + + { + static char value[512]; + + value[0] = 0; + + if (!ent->client) + return value; + + if ( DM_FLAG( DF_MODELTEAMS ) ) + COM_StripExtension( Info_ValueForKey( ent->client->pers.userinfo, "model" ), value ); + else if ( DM_FLAG( DF_SKINTEAMS ) ) + COM_StripExtension( Info_ValueForKey( ent->client->pers.userinfo, "skin" ), value ); + + return( value ); + } + + +qboolean OnSameTeam + ( + Entity *ent1, + Entity *ent2 + ) + + { + char ent1Team [512]; + char ent2Team [512]; + + if ( !DM_FLAG( DF_MODELTEAMS | DF_SKINTEAMS ) ) + return false; + + strcpy (ent1Team, ClientTeam (ent1->edict)); + strcpy (ent2Team, ClientTeam (ent2->edict)); + + if ( !strcmp( ent1Team, ent2Team ) ) + return true; + + return false; + } + +/* +============== +G_LoadAndExecScript + +Like the man says... +============== +*/ +qboolean G_LoadAndExecScript + ( + const char *filename, + const char *label, + qboolean quiet + ) + + { + ScriptThread *pThread; + + if ( gi.FS_ReadFile( filename, NULL, quiet ) != -1 ) + { + if ( Director.labelExists( filename, label ) ) + { + pThread = Director.CreateThread( filename, LEVEL_SCRIPT, label ); + if ( pThread ) + { + // start right away + pThread->StartImmediately(); + return qtrue; + } + else + { + gi.DPrintf( "G_LoadAndExecScript : %s could not create thread.\n", filename ); + return qfalse; + } + } + else + { + if ( !quiet ) + { + gi.DPrintf( "G_LoadAndExecScript : label %s does not exist in %s.\n", label, filename ); + } + return qfalse; + } + } + + return qfalse; + } + +ScriptThread * ExecuteThread + ( + str thread_name, + qboolean start + ) + { + GameScript * s; + + if ( thread_name.length() ) + { + ScriptThread * pThread; + + s = ScriptLib.GetScript( ScriptLib.GetGameScript() ); + if ( !s ) + { + gi.DPrintf( "StartThread::Null game script\n" ); + return false; + } + pThread = Director.CreateThread( s, thread_name.c_str() ); + if ( pThread ) + { + if ( start ) + { + // start right away + pThread->StartImmediately(); + } + } + else + { + gi.DPrintf( "StartThread::unable to go to %s\n", thread_name.c_str() ); + return NULL; + } + return pThread; + } + return NULL; + } + +/* +============== +G_ArchiveEdict +============== +*/ +void G_ArchiveEdict + ( + Archiver &arc, + gentity_t *edict + ) + + { + int i; + str tempStr; + + assert( edict ); + + // + // this is written funny because it is used for both saving and loading + // + + if ( edict->client ) + { + arc.ArchiveRaw( edict->client, sizeof( *edict->client ) ); + } + + arc.ArchiveInteger( &edict->s.eType ); + arc.ArchiveInteger( &edict->s.eFlags ); + + arc.ArchiveVec3( edict->s.netorigin ); + arc.ArchiveVec3( edict->s.origin ); + arc.ArchiveVec3( edict->s.origin2 ); + arc.ArchiveVec3( edict->s.netangles ); + arc.ArchiveVec3( edict->s.angles ); + + arc.ArchiveInteger( &edict->s.constantLight ); + + if ( arc.Saving() ) + { + if ( edict->s.loopSound ) + tempStr = gi.getConfigstring( CS_SOUNDS + edict->s.loopSound ); + else + tempStr = ""; + + arc.ArchiveString( &tempStr ); + } + else + { + arc.ArchiveString( &tempStr ); + + if ( tempStr.length() ) + edict->s.loopSound = gi.soundindex( tempStr.c_str() ); + else + edict->s.loopSound = 0; + } + + arc.ArchiveFloat( &edict->s.loopSoundVolume ); + arc.ArchiveFloat( &edict->s.loopSoundMinDist ); + + arc.ArchiveInteger( &edict->s.parent ); + arc.ArchiveInteger( &edict->s.tag_num ); + arc.ArchiveBoolean( &edict->s.attach_use_angles ); + arc.ArchiveVec3( edict->s.attach_offset ); + + arc.ArchiveInteger( &edict->s.modelindex ); + arc.ArchiveInteger( &edict->s.skinNum ); + arc.ArchiveInteger( &edict->s.anim ); + arc.ArchiveInteger( &edict->s.frame ); + + arc.ArchiveInteger( &edict->s.crossblend_time ); + + arc.ArchiveInteger( &edict->s.torso_anim ); + arc.ArchiveInteger( &edict->s.torso_frame ); + arc.ArchiveInteger( &edict->s.torso_crossblend_time ); + + for( i = 0; i < NUM_BONE_CONTROLLERS; i++ ) + { + arc.ArchiveInteger( &edict->s.bone_tag[ i ] ); + arc.ArchiveVec3( edict->s.bone_angles[ i ] ); + arc.ArchiveVec4( edict->s.bone_quat[ i ] ); + } + + arc.ArchiveRaw( &edict->s.surfaces, sizeof( edict->s.surfaces ) ); + + arc.ArchiveInteger( &edict->s.clientNum ); + arc.ArchiveInteger( &edict->s.groundEntityNum ); + arc.ArchiveInteger( &edict->s.solid ); + + arc.ArchiveFloat( &edict->s.scale ); + arc.ArchiveFloat( &edict->s.alpha ); + arc.ArchiveInteger( &edict->s.renderfx ); + arc.ArchiveVec4( edict->s.quat ); + arc.ArchiveRaw( &edict->s.mat, sizeof( edict->s.mat ) ); + + arc.ArchiveInteger( &edict->svflags ); + + arc.ArchiveVec3( edict->mins ); + arc.ArchiveVec3( edict->maxs ); + arc.ArchiveInteger( &edict->contents ); + arc.ArchiveVec3( edict->absmin ); + arc.ArchiveVec3( edict->absmax ); + arc.ArchiveFloat( &edict->radius ); + if ( !arc.Saving() ) { + edict->radius2 = edict->radius * edict->radius; + } + + arc.ArchiveVec3( edict->centroid ); + + arc.ArchiveVec3( edict->currentOrigin ); + arc.ArchiveVec3( edict->currentAngles ); + + arc.ArchiveInteger( &edict->ownerNum ); + ArchiveEnum( edict->solid, solid_t ); + arc.ArchiveFloat( &edict->freetime ); + arc.ArchiveFloat( &edict->spawntime ); + + tempStr = str( edict->entname ); + arc.ArchiveString( &tempStr ); + strncpy( edict->entname, tempStr.c_str(), sizeof( edict->entname ) - 1 ); + + arc.ArchiveInteger( &edict->clipmask ); + + if ( arc.Loading() ) + { + gi.linkentity( edict ); + } + } + +/* +========================================================================= + +model / sound configstring indexes + +========================================================================= +*/ + +/* +======================= +G_FindConfigstringIndex +======================= +*/ +int G_FindConfigstringIndex( char *name, int start, int max, qboolean create ) + { + int i; + char *s; + + if ( !name || !name[0] ) + { + return 0; + } + + for ( i=1 ; is.pos.trBase ); + ent->s.pos.trType = TR_STATIONARY; + ent->s.pos.trTime = 0; + ent->s.pos.trDuration = 0; + VectorClear( ent->s.pos.trDelta ); + + VectorCopy( org, ent->currentOrigin ); + VectorCopy( org, ent->s.origin ); + } + +/* +=============== +G_SetConstantLight + +Sets the encoded constant light parameter for entities +=============== +*/ +void G_SetConstantLight + ( + int * constantlight, + float * red, + float * green, + float * blue, + float * radius, + int * lightStyle + ) + + { + int ir, ig, ib, iradius; + + if ( !constantlight ) + return; + + ir = (*constantlight) & 255; + ig = ( (*constantlight) >> 8 ) & 255; + ib = ( (*constantlight) >> 16 ) & 255; + iradius = ( (*constantlight) >> 24 ) & 255; + + if ( red ) + { + ir = *red * 255; + if ( ir > 255 ) + ir = 255; + } + + if ( green ) + { + ig = *green * 255; + if ( ig > 255 ) + ig = 255; + } + + if ( blue ) + { + ib = *blue * 255; + if ( ib > 255 ) + ib = 255; + } + + if ( radius ) + { + iradius = *radius / CONSTANTLIGHT_RADIUS_SCALE; + if ( iradius > 255 ) + iradius = 255; + } + + if ( lightStyle ) + { + ir = *lightStyle; + if ( ir > 255 ) + ir = 255; + } + *constantlight = ( ir ) + ( ig << 8 ) + ( ib << 16 ) + ( iradius << 24 ); + } + +// +// caching commands +// +int modelIndex + ( + const char *mdl + ) + { + str name; + + assert( mdl ); + + if ( !mdl ) + { + return 0; + } + + // Prepend 'models/' to make things easier + if ( !strchr( mdl, '*' ) && !strchr( mdl, '\\' ) && !strchr( mdl, '/' ) ) + { + name = "models/"; + } + + name += mdl; + + return gi.modelindex( name.c_str() ); + } + + +void CacheResource + ( + const char * stuff, + Entity * ent + ) + + { + str real_stuff; + + if ( !stuff ) + return; + + if ( !strchr( stuff, '.' ) ) + { + // must be a global alias + stuff = gi.GlobalAlias_FindRandom( stuff ); + if ( !stuff ) + { + return; + } + } + + real_stuff = stuff; + real_stuff.tolower(); + + if ( strstr( real_stuff.c_str(), ".wav" ) ) + { + gi.soundindex( real_stuff.c_str() ); + } + else if ( strstr( real_stuff.c_str(), ".mp3" ) ) + { + gi.soundindex( real_stuff.c_str() ); + } + else if ( strstr( real_stuff.c_str(), ".tik" ) ) + { + int index; + + index = modelIndex( real_stuff.c_str() ); + + if ( index > 0 && ent ) + ent->ProcessInitCommands( index, qtrue ); + } + else if ( strstr( real_stuff.c_str(), ".spr" ) ) + { + gi.modelindex( real_stuff.c_str() ); + } + else if ( strstr( real_stuff.c_str(), ".st" ) ) + { + if ( strncmp( real_stuff.c_str(), "ai/", 3 ) == 0 ) + { + Actor *actor = new Actor; + CacheStatemap( stuff, ( Condition * )actor->Conditions ); + delete actor; + } + } + } + +void ChangeMusic + ( + const char *current, + const char *fallback, + qboolean force + ) + { + int j; + gentity_t *other; + + if ( current || fallback ) + { + for( j = 0; j < game.maxclients; j++ ) + { + other = &g_entities[ j ]; + if ( other->inuse && other->client ) + { + Player *client; + + client = ( Player * )other->entity; + client->ChangeMusic( current, fallback, force ); + } + } + if ( current && fallback ) + { + gi.DPrintf( "music set to %s with fallback %s\n", current, fallback ); + } + } + } + +void ChangeMusicVolume + ( + float volume, + float fade_time + ) + { + int j; + gentity_t *other; + + for( j = 0; j < game.maxclients; j++ ) + { + other = &g_entities[ j ]; + if ( other->inuse && other->client ) + { + Player *client; + + client = ( Player * )other->entity; + client->ChangeMusicVolume( volume, fade_time ); + } + } + gi.DPrintf( "music volume set to %.2f, fade time %.2f\n", volume, fade_time ); + } + +void RestoreMusicVolume + ( + float fade_time + ) + { + int j; + gentity_t *other; + + for( j = 0; j < game.maxclients; j++ ) + { + other = &g_entities[ j ]; + if ( other->inuse && other->client ) + { + Player *client; + + client = ( Player * )other->entity; + client->RestoreMusicVolume( fade_time ); + } + } + } + +void ChangeSoundtrack + ( + const char * soundtrack + ) + + { + level.saved_soundtrack = level.current_soundtrack; + level.current_soundtrack = soundtrack; + + gi.setConfigstring( CS_SOUNDTRACK, soundtrack ); + gi.DPrintf( "soundtrack switched to %s.\n", soundtrack ); + } + +void RestoreSoundtrack + ( + void + ) + + { + if ( level.saved_soundtrack.length() ) + { + level.current_soundtrack = level.saved_soundtrack; + level.saved_soundtrack = ""; + gi.setConfigstring( CS_SOUNDTRACK, level.current_soundtrack.c_str() ); + gi.DPrintf( "soundtrack restored %s.\n", level.current_soundtrack.c_str() ); + } + } + +void G_BroadcastSound + ( + Entity *soundent, + Vector origin, + float radius + ) + + { + Sentient *ent; + Vector delta; + Event *ev; + str name; + float r2; + float dist2; + int i; + int n; +#if 0 + int count; + + count = 0; +#endif + + assert( soundent ); + if ( soundent && !( soundent->flags & FL_NOTARGET ) ) + { + r2 = radius * radius; + n = SentientList.NumObjects(); + for( i = 1; i <= n; i++ ) + { + ent = SentientList.ObjectAt( i ); + if ( ( ent == soundent ) || ent->deadflag ) + { + continue; + } + + if ( ent->isSubclassOf( Actor ) ) + { + Actor *act = (Actor *)ent; + + if ( !act->IgnoreSounds() ) + { + delta = origin - ent->centroid; + + // dot product returns length squared + dist2 = delta * delta; + if ( + ( dist2 <= r2 ) && + ( + ( soundent->edict->areanum == ent->edict->areanum ) || + ( gi.AreasConnected( soundent->edict->areanum, ent->edict->areanum ) ) + ) + ) + + { + ev = new Event( EV_HeardSound ); + ev->AddEntity( soundent ); + ev->AddVector( origin ); + ent->PostEvent( ev, 0 ); +#if 0 + count++; +#endif + } + } + } + } + +#if 0 + gi.DPrintf( "Broadcast event %s to %d entities\n", ev->getName(), count ); +#endif + } + } + +void CloneEntity + ( + Entity * dest, + Entity * src + ) + { + int i, num; + + dest->setModel( src->model ); + // don't process our init commands + //dest->CancelEventsOfType( EV_ProcessInitCommands ); + dest->setOrigin( src->origin ); + dest->setAngles( src->angles ); + dest->setScale( src->edict->s.scale ); + dest->setAlpha( src->edict->s.alpha ); + dest->health = src->health; + // copy the surfaces + memcpy( dest->edict->s.surfaces, src->edict->s.surfaces, sizeof( src->edict->s.surfaces ) ); + dest->edict->s.constantLight = src->edict->s.constantLight; + //dest->edict->s.eFlags = src->edict->s.eFlags; + dest->edict->s.renderfx = src->edict->s.renderfx; + dest->edict->s.anim = src->edict->s.anim; + dest->edict->s.frame = src->edict->s.frame; + + num = src->numchildren; + for( i = 0; ( i < MAX_MODEL_CHILDREN ) && num; i++ ) + { + Entity * clone; + Entity * child; + + // duplicate the children + if ( !src->children[ i ] ) + { + continue; + } + child = G_GetEntity( src->children[ i ] ); + if ( child ) + { + clone = new Animate; + CloneEntity( clone, child ); + clone->attach( dest->entnum, child->edict->s.tag_num ); + } + num--; + } + dest->ProcessPendingEvents(); + } + +weaponhand_t WeaponHandNameToNum + ( + str side + ) + + { + if ( !side.length() ) + { + gi.DPrintf( "WeaponHandNameToNum : Weapon hand not specified\n" ); + return WEAPON_ERROR; + } + + if ( !side.icmp( "righthand" ) || !side.icmp( "right" ) ) + { + return WEAPON_RIGHT; + } + else if ( !side.icmp( "lefthand" ) || !side.icmp( "left" ) ) + { + return WEAPON_LEFT; + } + else if ( !side.icmp( "dualhand" ) || !side.icmp( "dual" ) ) + { + return WEAPON_DUAL; + } + else + { + return (weaponhand_t)atoi( side ); + } + } + +const char *WeaponHandNumToName + ( + weaponhand_t hand + ) + + { + switch( hand ) + { + case WEAPON_RIGHT: + return "righthand"; + case WEAPON_LEFT: + return "lefthand"; + case WEAPON_DUAL: + return "dualhand"; + case WEAPON_ANY: + return "anyhand"; + default: + return "Invalid Hand"; + } + } + +firemode_t WeaponModeNameToNum + ( + str mode + ) + + { + if ( !mode.length() ) + { + gi.DPrintf( "WeaponModeNameToNum : Weapon mode not specified\n" ); + return FIRE_ERROR; + } + + if ( !mode.icmp( "primary" ) ) + { + return FIRE_PRIMARY; + } + + if ( !mode.icmp( "alternate" ) ) + { + return FIRE_ALTERNATE; + } + else + { + return (firemode_t)atoi( mode ); + } + } + +void G_DebugTargets + ( + Entity *e, + str from + ) + + { + gi.DPrintf( "DEBUGTARGETS:%s ", from.c_str() ); + + if ( e->TargetName() && strlen( e->TargetName() ) ) + { + gi.DPrintf( "Targetname=\"%s\"\n", e->TargetName() ); + } + else + { + gi.DPrintf( "Targetname=\"None\"\n" ); + } + + if ( e->Target() && strlen( e->Target() ) ) + { + gi.DPrintf( "Target=\"%s\"\n", e->Target() ); + } + else + { + gi.DPrintf( "Target=\"None\"\n" ); + } + } + +void G_DebugDamage + ( + float damage, + Entity *victim, + Entity *attacker, + Entity *inflictor + ) + + { + gi.DPrintf( "Victim:%s Attacker:%s Inflictor:%s Damage:%f\n", victim->getClassname(), attacker->getClassname(), inflictor->getClassname(), damage ); + } + +void G_FadeOut + ( + float delaytime + ) + { + // Fade the screen out + level.m_fade_color = Vector( 0,0,0 ); + level.m_fade_alpha = 1.0f; + level.m_fade_time = delaytime; + level.m_fade_time_start = delaytime; + level.m_fade_type = fadeout; + level.m_fade_style = alphablend; + } + +void G_AutoFadeIn + ( + void + ) + + { + level.m_fade_time_start = 1; + level.m_fade_time = 1; + level.m_fade_color[0] = 0; + level.m_fade_color[1] = 0; + level.m_fade_color[2] = 0; + level.m_fade_alpha = 1; + level.m_fade_type = fadein; + level.m_fade_style = alphablend; + } + +void G_ClearFade + ( + void + ) + + { + level.m_fade_time = -1; + level.m_fade_type = fadein; + } + +void G_FadeSound + ( + float delaytime + ) + { + float time; + + // Fade the screen out + time = delaytime * 1000; + gi.SendServerCommand( NULL, va( "fadesound %0.2f", time ) ); + } + +// +// restarts the game after delaytime +// +void G_PlayerDied + ( + float delaytime + ) + { + int i; + + if ( level.died_already ) + return; + + level.died_already = true; + + // Restart the level soon + + for( i = 0; i < game.maxclients; i++ ) + { + if ( g_entities[ i ].inuse ) + { + if ( g_entities[ i ].entity ) + { + g_entities[ i ].entity->PostEvent( EV_Player_Respawn, delaytime ); + } + } + } + + G_FadeOut( delaytime ); + G_FadeSound( delaytime ); + } + +void G_MissionFailed + ( + void + ) + + { + // Make the music system play the failure music for this level + ChangeMusic( "failure", "normal", true ); + + G_PlayerDied( 3 ); + + // tell the player they f'd up + gi.centerprintf( &g_entities[ 0 ], "@textures/menu/mission.tga" ); + + level.mission_failed = true; + } + +void G_StartCinematic + ( + void + ) + + { + level.cinematic = true; + gi.cvar_set( "sv_cinematic", "1" ); + } + +void G_StopCinematic + ( + void + ) + + { + // clear out the skip thread + world->skipthread = ""; + level.cinematic = false; + gi.cvar_set( "sv_cinematic", "0" ); + } + diff --git a/source/source/fgame/g_utils.h b/source/source/fgame/g_utils.h new file mode 100644 index 0000000..e295b92 --- /dev/null +++ b/source/source/fgame/g_utils.h @@ -0,0 +1,403 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/g_utils.h $ +// $Revision:: 31 $ +// $Author:: Markd $ +// $Date:: 8/04/00 3:54p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/g_utils.h $ +// +// 31 8/04/00 3:54p Markd +// Added StartCinematic and StopCinematic +// +// 30 7/29/00 11:23p Aldie +// Added g_clearfade +// +// 29 7/29/00 4:00p Aldie +// Added autofadein for skipping cinematics +// +// 28 7/23/00 6:03p Markd +// added fadeout and fadesound to dieing and level change +// +// 27 7/13/00 12:33p Steven +// Improved G_TraceEntities. +// +// 26 7/10/00 11:54p Markd +// added exit level code +// +// 25 7/07/00 6:35p Steven +// Added mission failed stuff. +// +// 24 7/02/00 6:46p Markd +// added spawn thread to PlayerStart +// +// 23 6/14/00 11:18a Markd +// cleaned up code using Intel compiler +// +// 22 6/13/00 6:46p Aldie +// Added some damage debug info. Added an ignoreEnt for explosion events +// +// 21 6/03/00 3:46p Aldie +// Added in g_debugtargets for debugging targetnames and targets +// +// 20 6/01/00 7:02p Markd +// removed activeWeapon variable +// +// 19 5/25/00 4:28p Markd +// fixed up archive functions +// +// 18 4/15/00 4:24p Markd +// Fixed player turning +// +// 17 3/04/00 11:48a Markd +// Added light style support +// +// 16 2/23/00 6:21p Aldie +// More inventory changes +// +// 15 2/17/00 6:26p Aldie +// Fixed naming conventions for weapon hand and also added various attachtotag +// functionality for weapons that attach to different tags depending on which +// hand they are wielded in. +// +// 14 1/22/00 5:07p Steven +// Added a trace entites function. +// +// 13 1/20/00 7:11p Jimdose +// removed angmod +// +// 12 1/11/00 6:41p Markd +// Removed fulltrace code from the game +// +// 11 1/10/00 5:34p Markd +// Added DeAllocateDebugLines +// +// 10 1/06/00 11:08p Jimdose +// cleaning up unused code +// +// 9 12/17/99 8:27p Jimdose +// got rid of unused vars and functions +// +// 8 12/17/99 6:35p Jimdose +// changed spawnarg code +// added Level class for spawning and map control +// got rid of unused or superflous variables +// changed setjmp/longjmp calls to try/throw/catch exception handling +// +// 7 11/12/99 11:21a Markd +// Added Debug Circles and DebugPyramids +// +// 6 10/28/99 6:33p Markd +// Added fakeplayer ability, also added CloneEntity +// +// 5 10/14/99 5:08p Markd +// removed a lot of G_GetMoveDir calls from the initialization code +// +// 4 9/28/99 5:15p Markd +// Fixed more merge bugs with sharing class, vector and listener between three +// modules +// +// 3 9/28/99 4:26p Markd +// merged listener, class and vector between 3 projects +// +// 2 9/22/99 4:47p Markd +// fixed more G_GetEntity, G_FindClass and G_GetNextEntity bugs +// +// 1 9/10/99 10:54a Jimdose +// +// 1 9/08/99 3:16p Aldie +// +// 13 9/02/99 5:41p Markd +// made CacheResource utility functions changed code every where else +// +// 12 8/18/99 3:28p Jimdose +// added cylindrical collision detection +// +// 11 7/29/99 11:41a Markd +// Added precache and global support +// +// DESCRIPTION: +// + +#ifndef __G_UTILS_H__ +#define __G_UTILS_H__ + +class Archiver; + +void G_ArchiveEdict( Archiver &arc, gentity_t *edict ); + +#include "entity.h" + +void G_AllocDebugLines( void ); +void G_DeAllocDebugLines( void ); + +void G_TouchTriggers (Entity *ent); +void G_TouchSolids (Entity *ent); + +Entity *G_FindClass( Entity *ent, const char *classname ); +Entity *G_NextEntity( Entity *ent ); + +void G_CalcBoundsOfMove( Vector &start, Vector &end, Vector &mins, Vector &maxs, Vector *minbounds, Vector *maxbounds ); + +void G_ShowTrace( trace_t *trace, gentity_t *passent, const char *reason ); +trace_t G_Trace( Vector &start, Vector &mins, Vector &maxs, Vector &end, Entity *passent, int contentmask, qboolean cylindrical, const char *reason ); +trace_t G_Trace( vec3_t start, vec3_t mins, vec3_t maxs, vec3_t end, gentity_t *passent, int contentmask, qboolean cylindrical, const char *reason ); +void G_TraceEntities( Vector &start, Vector &mins, Vector &maxs, Vector &end, Container*victimlist, int contentmask ); + +void SelectSpawnPoint( Vector &org, Vector &angles, str &thread ); + +Entity *G_FindTarget( Entity *ent, const char *name ); +Entity *G_NextEntity( Entity *ent ); + +qboolean M_CheckBottom( Entity *ent ); + +Vector G_GetMovedir( float angle ); +qboolean KillBox( Entity *ent ); +qboolean IsNumeric( const char *str ); + +Entity *findradius( Entity *startent, Vector org, float rad ); +Entity *findclientsinradius( Entity *startent, Vector org, float rad ); + +Vector G_CalculateImpulse( Vector start, Vector end, float speed, float gravity ); +Vector G_PredictPosition( Vector start, Vector target, Vector targetvelocity, float speed ); + +qboolean G_LoadAndExecScript( const char *filename, const char *label = NULL, qboolean quiet = qfalse ); +ScriptThread *ExecuteThread( str thread_name, qboolean start = true ); + +int MOD_string_to_int( str immune_string ); +qboolean MOD_matches( int incoming_damage, int damage_type ); + +void G_MissionFailed( void ); +void G_FadeOut( float delaytime ); +void G_FadeSound( float delaytime ); +void G_PlayerDied( float delaytime ); +void G_AutoFadeIn( void ); +void G_ClearFade( void ); +void G_StartCinematic( void ); +void G_StopCinematic( void ); + +// copy the entity exactly including all its children +void CloneEntity( Entity * dest, Entity * src ); + +qboolean OnSameTeam( Entity *ent1, Entity *ent2 ); + +// +// caching commands +// +void CacheResource( const char * stuff, Entity * ent = NULL ); +int modelIndex( const char *mdl ); + +void G_SetTrajectory( gentity_t *ent, vec3_t org ); +void G_SetConstantLight + ( + int * constantlight, + float * red, + float * green, + float * blue, + float * radius, + int * lightstyle = NULL + ); + +void ChangeMusic + ( + const char *current, + const char *fallback, + qboolean force + ); + +void ChangeMusicVolume + ( + float volume, + float fade_time + ); + +void RestoreMusicVolume + ( + float fade_time + ); + +void ChangeSoundtrack + ( + const char * soundtrack + ); + +void RestoreSoundtrack + ( + void + ); + +void G_BroadcastSound( Entity *ent, Vector origin, float radius = SOUND_RADIUS ); + +//================================================================== +// +// Inline functions +// +//================================================================== + +/* +================= +G_GetEntity + +Takes an index to an entity and returns pointer to it. +================= +*/ + +inline Entity *G_GetEntity + ( + int entnum + ) + + { + if ( ( entnum < 0 ) || ( entnum >= globals.max_entities ) ) + { + gi.Error( ERR_DROP, "G_GetEntity: %d out of valid range.", entnum ); + } + + return ( Entity * )g_entities[ entnum ].entity; + } + +/* +================= +G_Random + +Returns a number from 0<= num < 1 + +random() +================= +*/ + +inline float G_Random + ( + void + ) + + { + return ( ( float )( rand() & 0x7fff ) ) / ( ( float )0x8000 ); + } + +/* +================= +G_Random + +Returns a number from 0 <= num < n + +random() +================= +*/ + +inline float G_Random + ( + float n + ) + + { + return G_Random() * n; + } + +/* +================= +G_CRandom + +Returns a number from -1 <= num < 1 + +crandom() +================= +*/ + +inline float G_CRandom + ( + void + ) + + { + return G_Random( 2 ) - 1; + } + +/* +================= +G_CRandom + +Returns a number from -n <= num < n + +crandom() +================= +*/ + +inline float G_CRandom + ( + float n + ) + + { + return G_CRandom() * n; + } + +/* +================= +G_FixSlashes + +Converts all backslashes in a string to forward slashes. +Used to make filenames consistant. +================= +*/ + +inline str G_FixSlashes + ( + const char *filename + ) + + { + int i; + int len; + str text; + + if ( filename ) + { + // Convert all forward slashes to back slashes + text = filename; + len = text.length(); + for( i = 0; i < len; i++ ) + { + if ( text[ i ] == '\\' ) + { + text[ i ] = '/'; + } + } + } + + return text; + } + +typedef enum + { + WEAPON_RIGHT, + WEAPON_LEFT, + WEAPON_DUAL, + WEAPON_ANY, + WEAPON_ERROR + } weaponhand_t; + +#define NUM_ACTIVE_WEAPONS WEAPON_ANY + +typedef enum + { + FIRE_PRIMARY, + FIRE_ALTERNATE, + MAX_FIREMODES, + FIRE_ERROR + } firemode_t; + +firemode_t WeaponModeNameToNum( str mode ); +const char *WeaponHandNumToName( weaponhand_t hand ); +weaponhand_t WeaponHandNameToNum( str side ); +void G_DebugTargets( Entity *e, str from ); +void G_DebugDamage( float damage, Entity *victim, Entity *attacker, Entity *inflictor ); + +#endif /* g_utils.h */ + diff --git a/source/source/fgame/game.cpp b/source/source/fgame/game.cpp new file mode 100644 index 0000000..304dd1d --- /dev/null +++ b/source/source/fgame/game.cpp @@ -0,0 +1,78 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/game.cpp $ +// $Revision:: 5 $ +// $Date:: 5/25/00 7:52p $ +// +// Copyright (C) 1999 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/game.cpp $ +// +// 5 5/25/00 7:52p Markd +// 2nd pass save game stuff +// +// 4 5/24/00 3:14p Markd +// first phase of save/load games +// +// 3 1/10/00 5:29p Markd +// fixed bug in unarchiving game and archiving game where logic was inverted +// +// 2 1/06/00 11:08p Jimdose +// cleaning up unused code +// +// DESCRIPTION: +// + +#include "game.h" + +Game game; + +CLASS_DECLARATION( Class, Game, NULL ) + { + { NULL, NULL } + }; + +void Game::Init + ( + void + ) + + { + clients = NULL; + + autosaved = false; + + maxentities = 0; + maxclients = 0; + } + +void Game::Archive + ( + Archiver &arc + ) + + { + int i; + + Class::Archive( arc ); + + arc.ArchiveBoolean( &autosaved ); + + arc.ArchiveInteger( &maxentities ); + arc.ArchiveInteger( &maxclients ); + + if ( arc.Loading() ) + { + G_AllocGameData(); + } + + for( i = 0; i < maxclients; i++ ) + { + arc.ArchiveRaw( &clients[ i ], sizeof( gclient_t ) ); + } + } + diff --git a/source/source/fgame/game.def b/source/source/fgame/game.def new file mode 100644 index 0000000..df4958f --- /dev/null +++ b/source/source/fgame/game.def @@ -0,0 +1,2 @@ +EXPORTS + GetGameAPI diff --git a/source/source/fgame/game.h b/source/source/fgame/game.h new file mode 100644 index 0000000..b772fd8 --- /dev/null +++ b/source/source/fgame/game.h @@ -0,0 +1,56 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/game.h $ +// $Revision:: 3 $ +// $Date:: 5/24/00 3:14p $ +// +// Copyright (C) 1999 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/game.h $ +// +// 3 5/24/00 3:14p Markd +// first phase of save/load games +// +// 2 1/06/00 11:08p Jimdose +// cleaning up unused code +// +// DESCRIPTION: +// + +#ifndef __GAME_H__ +#define __GAME_H__ + +#include "g_local.h" +#include "class.h" + +// +// this structure is left intact through an entire game +// it should be initialized at dll load time, and read/written to +// the server.ssv file for savegames +// + +class Game : public Class + { + public: + CLASS_PROTOTYPE( Game ); + + gclient_t *clients; // [maxclients] + qboolean autosaved; + + // store latched cvars here that we want to get at often + int maxclients; + int maxentities; + + Game() { Init(); } + + void Init( void ); + virtual void Archive( Archiver &arc ); + }; + +extern Game game; + +#endif /* !__GAME_H__ */ diff --git a/source/source/fgame/gamecmds.cpp b/source/source/fgame/gamecmds.cpp new file mode 100644 index 0000000..90179c1 --- /dev/null +++ b/source/source/fgame/gamecmds.cpp @@ -0,0 +1,644 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/gamecmds.cpp $ +// $Revision:: 8 $ +// $Date:: 7/10/00 9:27p $ +// +// Copyright (C) 1999 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/gamecmds.cpp $ +// +// 8 7/10/00 9:27p Markd +// added ammo variables for how much ammo the player has. Added levelvars and +// gamevars commands +// +// 7 6/10/00 4:23p Markd +// rewrote map restarting and loading out of date save games +// +// 6 4/26/00 7:55p Markd +// Added more documentation code into various systems +// +// 5 2/17/00 4:18p Jimdose +// added checks in G_ClientCommand for NULL ent being passed in +// +// 4 1/28/00 5:43p Markd +// Added script command to the game +// +// 3 1/22/00 2:04p Markd +// Added "kill" to registered commands +// +// 2 1/06/00 11:10p Jimdose +// cleaning up unused code +// +// DESCRIPTION: +// + +#include "gamecmds.h" +#include "g_local.h" +#include "camera.h" +#include "viewthing.h" +#include "soundman.h" +#include "navigate.h" + +typedef struct + { + const char *command; + qboolean ( *func )( gentity_t *ent ); + qboolean allclients; + } consolecmd_t; + +consolecmd_t G_ConsoleCmds[] = + { + // command name function available in multiplayer? + { "say", G_SayCmd, qtrue }, + { "eventlist", G_EventListCmd, qfalse }, + { "pendingevents", G_PendingEventsCmd, qfalse }, + { "eventhelp", G_EventHelpCmd, qfalse }, + { "dumpevents", G_DumpEventsCmd, qfalse }, + { "classevents", G_ClassEventsCmd, qfalse }, + { "dumpclassevents", G_DumpClassEventsCmd,qfalse }, + { "dumpallclasses", G_DumpAllClassesCmd, qfalse }, + { "classlist", G_ClassListCmd, qfalse }, + { "classtree", G_ClassTreeCmd, qfalse }, + { "cam", G_CameraCmd, qfalse }, + { "snd", G_SoundCmd, qfalse }, + { "showvar", G_ShowVarCmd, qfalse }, + { "script", G_ScriptCmd, qfalse }, + { "levelvars", G_LevelVarsCmd, qfalse }, + { "gamevars", G_GameVarsCmd, qfalse }, + { NULL, NULL, NULL } + }; + +void G_InitConsoleCommands + ( + void + ) + + { + consolecmd_t *cmds; + + // + // the game server will interpret these commands, which will be automatically + // forwarded to the server after they are not recognized locally + // + gi.AddCommand( "give" ); + gi.AddCommand( "god" ); + gi.AddCommand( "notarget" ); + gi.AddCommand( "noclip" ); + gi.AddCommand( "kill" ); + gi.AddCommand( "script" ); + + for( cmds = G_ConsoleCmds; cmds->command != NULL; cmds++ ) + { + gi.AddCommand( cmds->command ); + } + } + +qboolean G_ConsoleCommand + ( + void + ) + + { + gentity_t *ent; + qboolean result; + + result = qfalse; + try + { + ent = &g_entities[ 0 ]; + result = G_ProcessClientCommand( ent ); + } + + catch( const char *error ) + { + G_ExitWithError( error ); + } + + return result; + } + +void G_ClientCommand + ( + gentity_t *ent + ) + + { + try + { + if ( ent && !G_ProcessClientCommand( ent ) ) + { + // anything that doesn't match a command will be a chat + G_Say( ent, false, true ); + } + } + + catch( const char *error ) + { + G_ExitWithError( error ); + } + } + +qboolean G_ProcessClientCommand + ( + gentity_t *ent + ) + + { + const char *cmd; + consolecmd_t *cmds; + int i; + int n; + Event *ev; + + if ( !ent || !ent->client || !ent->entity ) + { + // not fully in game yet + return qfalse; + } + + cmd = gi.argv( 0 ); + for( cmds = G_ConsoleCmds; cmds->command != NULL; cmds++ ) + { + // if we have multiple clients and this command isn't allowed by multiple clients, skip it + if ( ( game.maxclients > 1 ) && ( !cmds->allclients ) ) + { + continue; + } + + if ( !Q_stricmp( cmd, cmds->command ) ) + { + return cmds->func( ent ); + } + } + + if ( Event::Exists( cmd ) ) + { + ev = new Event( cmd ); + ev->SetSource( EV_FROM_CONSOLE ); + ev->SetConsoleEdict( ent ); + + n = gi.argc(); + for( i = 1; i < n; i++ ) + { + ev->AddToken( gi.argv( i ) ); + } + + if ( !Q_stricmpn( cmd, "ai_", 2 ) ) + { + return PathManager.ProcessEvent( ev ); + } + else if ( !Q_stricmpn( cmd, "view", 4 ) ) + { + return Viewmodel.ProcessEvent( ev ); + } + else + { + return ent->entity->ProcessEvent( ev ); + } + } + + return qfalse; + } + +/* +================== +Cmd_Say_f +================== +*/ +void G_Say + ( + gentity_t *ent, + qboolean team, + qboolean arg0 + ) + + { + int j; + gentity_t *other; + const char *p; + char text[ 2048 ]; + + if ( gi.argc() < 2 && !arg0 ) + { + return; + } + + if ( !ent->entity ) + { + // just in case we're not joined yet. + team = false; + } + + if ( !DM_FLAG( DF_MODELTEAMS | DF_SKINTEAMS ) ) + { + team = false; + } + + if ( team ) + { + Com_sprintf( text, sizeof( text ), "(%s): ", ent->client->pers.netname ); + } + else + { + Com_sprintf( text, sizeof( text ), "%s: ", ent->client->pers.netname ); + } + + if ( arg0 ) + { + strcat( text, gi.argv( 0 ) ); + strcat( text, " " ); + strcat( text, gi.args() ); + } + else + { + p = gi.args(); + + if ( *p == '"' ) + { + p++; + strcat( text, p ); + text[ strlen( text ) - 1 ] = 0; + } + else + { + strcat( text, p ); + } + } + + // don't let text be too long for malicious reasons + if ( strlen( text ) > 150 ) + { + text[ 150 ] = 0; + } + + strcat( text, "\n" ); + + if ( dedicated->integer ) + { + gi.SendServerCommand( NULL, "print \"%s\"", text ); + } + + for( j = 0; j < game.maxclients; j++ ) + { + other = &g_entities[ j ]; + if ( !other->inuse || !other->client || !other->entity ) + { + continue; + } + + if ( team ) + { + if ( !OnSameTeam( ent->entity, other->entity ) ) + { + continue; + } + } + + gi.SendServerCommand( NULL, "print \"%s\"", text ); + } + } + +qboolean G_CameraCmd + ( + gentity_t *ent + ) + + { + Event *ev; + const char *cmd; + int i; + int n; + + n = gi.argc(); + if ( !n ) + { + gi.Printf( "Usage: cam [command] [arg 1]...[arg n]\n" ); + return qtrue; + } + + cmd = gi.argv( 1 ); + if ( Event::Exists( cmd ) ) + { + ev = new Event( cmd ); + ev->SetSource( EV_FROM_CONSOLE ); + ev->SetConsoleEdict( NULL ); + + for( i = 2; i < n; i++ ) + { + ev->AddToken( gi.argv( i ) ); + } + + CameraMan.ProcessEvent( ev ); + } + else + { + gi.Printf( "Unknown camera command '%s'.\n", cmd ); + } + + return qtrue; + } + +qboolean G_SoundCmd + ( + gentity_t *ent + ) + + { + Event *ev; + const char *cmd; + int i; + int n; + + n = gi.argc(); + if ( !n ) + { + gi.Printf( "Usage: snd [command] [arg 1]...[arg n]\n" ); + return qtrue; + } + + cmd = gi.argv( 1 ); + if ( Event::Exists( cmd ) ) + { + ev = new Event( cmd ); + ev->SetSource( EV_FROM_CONSOLE ); + ev->SetConsoleEdict( NULL ); + + for( i = 2; i < n; i++ ) + { + ev->AddToken( gi.argv( i ) ); + } + + SoundMan.ProcessEvent( ev ); + } + else + { + gi.Printf( "Unknown sound command '%s'.\n", cmd ); + } + + return qtrue; + } + +qboolean G_SayCmd + ( + gentity_t *ent + ) + + { + G_Say( ent, false, false ); + + return qtrue; + } + +qboolean G_EventListCmd + ( + gentity_t *ent + ) + + { + const char *mask; + + mask = NULL; + if ( gi.argc() > 1 ) + { + mask = gi.argv( 1 ); + } + + Event::ListCommands( mask ); + + return qtrue; + } + +qboolean G_PendingEventsCmd + ( + gentity_t *ent + ) + + { + const char *mask; + + mask = NULL; + if ( gi.argc() > 1 ) + { + mask = gi.argv( 1 ); + } + + Event::PendingEvents( mask ); + + return qtrue; + } + +qboolean G_EventHelpCmd + ( + gentity_t *ent + ) + + { + const char *mask; + + mask = NULL; + if ( gi.argc() > 1 ) + { + mask = gi.argv( 1 ); + } + + Event::ListDocumentation( mask, false ); + + return qtrue; + } + +qboolean G_DumpEventsCmd + ( + gentity_t *ent + ) + + { + const char *mask; + + mask = NULL; + if ( gi.argc() > 1 ) + { + mask = gi.argv( 1 ); + } + + Event::ListDocumentation( mask, true ); + + return qtrue; + } + +qboolean G_ClassEventsCmd + ( + gentity_t *ent + ) + + { + const char *className; + + className = NULL; + if ( gi.argc() < 2 ) + { + gi.Printf( "Usage: classevents [className]\n" ); + className = gi.argv( 1 ); + } + else + { + className = gi.argv( 1 ); + ClassEvents( className ); + } + return qtrue; + } + +qboolean G_DumpClassEventsCmd + ( + gentity_t *ent + ) + + { + const char *className; + + className = NULL; + if ( gi.argc() < 2 ) + { + gi.Printf( "Usage: dumpclassevents [className]\n" ); + className = gi.argv( 1 ); + } + else + { + className = gi.argv( 1 ); + ClassEvents( className, qtrue ); + } + return qtrue; + } + +qboolean G_DumpAllClassesCmd + ( + gentity_t *ent + ) + + { + DumpAllClasses(); + return qtrue; + } + +qboolean G_ClassListCmd + ( + gentity_t *ent + ) + + { + listAllClasses(); + + return qtrue; + } + +qboolean G_ClassTreeCmd + ( + gentity_t *ent + ) + + { + if ( gi.argc() > 1 ) + { + listInheritanceOrder( gi.argv( 1 ) ); + } + else + { + gi.SendServerCommand( ent - g_entities, "print \"Syntax: classtree [classname].\n\"" ); + } + + return qtrue; + } + +qboolean G_ShowVarCmd + ( + gentity_t *ent + ) + + { + ScriptVariable *var; + + var = Director.GetExistingVariable( gi.argv( 1 ) ); + if ( var ) + { + gi.SendServerCommand( ent - g_entities, "print \"%s = '%s'\n\"", gi.argv( 1 ), var->stringValue() ); + } + else + { + gi.SendServerCommand( ent - g_entities, "print \"Variable '%s' does not exist.\"", gi.argv( 1 ) ); + } + + return qtrue; + } + +qboolean G_ScriptCmd + ( + gentity_t *ent + ) + + { + int i, argc; + const char *argv[ 32 ]; + char args[ 32 ][ 64 ]; + + argc = 0; + for( i = 1; i < gi.argc(); i++ ) + { + if ( argc < 32 ) + { + strncpy( args[ argc ], gi.argv( i ), 64 ); + argv[ argc ] = args[ argc ]; + argc++; + } + } + if ( argc > 0 ) + { + level.consoleThread->ProcessCommand( argc, argv ); + } + + return qtrue; + } + +void PrintVariableList + ( + ScriptVariableList * list + ) + { + ScriptVariable *var; + int i; + + for( i = 1; i <= list->NumVariables(); i++ ) + { + var = list->GetVariable( i ); + gi.Printf( "%s = %s\n", var->getName(), var->stringValue() ); + } + gi.Printf( "%d variables\n", list->NumVariables() ); + } + +qboolean G_LevelVarsCmd + ( + gentity_t *ent + ) + + { + gi.Printf( "Level Variables\n" ); + PrintVariableList( &levelVars ); + + return qtrue; + } + +qboolean G_GameVarsCmd + ( + gentity_t *ent + ) + + { + gi.Printf( "Game Variables\n" ); + PrintVariableList( &gameVars ); + + return qtrue; + } + diff --git a/source/source/fgame/gamecmds.h b/source/source/fgame/gamecmds.h new file mode 100644 index 0000000..4a18ea6 --- /dev/null +++ b/source/source/fgame/gamecmds.h @@ -0,0 +1,62 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/gamecmds.h $ +// $Revision:: 5 $ +// $Date:: 7/10/00 9:27p $ +// +// Copyright (C) 1999 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/gamecmds.h $ +// +// 5 7/10/00 9:27p Markd +// added ammo variables for how much ammo the player has. Added levelvars and +// gamevars commands +// +// 4 4/26/00 7:55p Markd +// Added more documentation code into various systems +// +// 3 1/28/00 5:43p Markd +// Added script command to the game +// +// 2 1/06/00 11:10p Jimdose +// cleaning up unused code +// +// DESCRIPTION: +// + +#ifndef __GAMECMDS_H__ +#define __GAMECMDS_H__ + +#include "g_local.h" + +extern "C" void G_ClientCommand( gentity_t *ent ); +extern "C" qboolean G_ConsoleCommand( void ); + +void G_InitConsoleCommands( void ); + +qboolean G_ProcessClientCommand( gentity_t *ent ); + +void G_Say( gentity_t *ent, qboolean team, qboolean arg0 ); +qboolean G_CameraCmd( gentity_t *ent ); +qboolean G_SoundCmd( gentity_t *ent ); +qboolean G_SayCmd( gentity_t *ent ); +qboolean G_EventListCmd( gentity_t *ent ); +qboolean G_PendingEventsCmd( gentity_t *ent ); +qboolean G_EventHelpCmd( gentity_t *ent ); +qboolean G_DumpEventsCmd( gentity_t *ent ); +qboolean G_ClassEventsCmd( gentity_t *ent ); +qboolean G_DumpClassEventsCmd( gentity_t *ent ); +qboolean G_DumpAllClassesCmd( gentity_t *ent ); +qboolean G_ClassListCmd( gentity_t *ent ); +qboolean G_ClassTreeCmd( gentity_t *ent ); +qboolean G_ShowVarCmd( gentity_t *ent ); +qboolean G_RestartCmd( gentity_t *ent ); +qboolean G_ScriptCmd( gentity_t *ent ); +qboolean G_LevelVarsCmd( gentity_t *ent ); +qboolean G_GameVarsCmd( gentity_t *ent ); + +#endif /* !__GAMECMDS_H__ */ \ No newline at end of file diff --git a/source/source/fgame/gamecvars.cpp b/source/source/fgame/gamecvars.cpp new file mode 100644 index 0000000..da45097 --- /dev/null +++ b/source/source/fgame/gamecvars.cpp @@ -0,0 +1,250 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/gamecvars.cpp $ +// $Revision:: 29 $ +// $Date:: 7/27/00 4:16p $ +// +// Copyright (C) 1999 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/gamecvars.cpp $ +// +// 29 7/27/00 4:16p Aldie +// Changed logstats to 0 +// +// 28 7/23/00 5:02p Markd +// made boss health a non-cvar +// +// 27 7/22/00 3:01p Steven +// Added boss health bar stuff. +// +// 26 7/21/00 2:31p Markd +// changed default value of "detail" +// +// 25 7/17/00 3:40p Steven +// Removed sv_gore stuff. +// +// 24 7/17/00 3:26p Aldie +// Fix for flashbangs, changed detail variable, and added forcetorsostate +// +// 23 7/14/00 10:04p Aldie +// Added g_logstats cvar +// +// 22 7/14/00 9:52p Markd +// added global volume dampener on ambient sound effects for cinematics +// +// 21 7/13/00 10:19p Aldie +// Increased default of g_crosshair_maxscale +// +// 20 7/12/00 6:34p Aldie +// Added in crosshair scaling for long distances +// +// 19 7/05/00 7:22p Markd +// +// 18 7/05/00 7:00p Markd +// Changed julie's model to julie_flightsuit.tik +// +// 17 6/13/00 6:46p Aldie +// Added some damage debug info. Added an ignoreEnt for explosion events +// +// 16 6/03/00 3:46p Aldie +// Added in g_debugtargets for debugging targetnames and targets +// +// 15 5/10/00 10:32a Steven +// Added com_blood stuff and removed parentmode and sv_gibs. +// +// 14 5/08/00 3:19p Aldie +// Added initial crosshair work +// +// 13 4/30/00 4:41p Markd +// fixed turning speeed when running +// +// 12 4/15/00 4:24p Markd +// Fixed player turning +// +// 11 3/18/00 3:55p Markd +// working on player turning +// +// 10 3/15/00 2:04p Markd +// fixed up camera node system and added new debug oriented circle +// +// 9 3/14/00 5:12p Markd +// removed unused cvars +// +// 8 3/06/00 8:07p Markd +// cleaned up unused cvar's +// +// 7 2/09/00 8:02p Aldie +// Added loopfire weapons +// +// 6 2/01/00 8:13p Aldie +// More autoaim work +// +// 5 1/19/00 7:46p Aldie +// Fixed func_spawns of various types and removed some unused misc classes +// +// 4 1/19/00 9:51a Markd +// Changed Player model back to julie +// +// 3 1/18/00 7:49p Jimdose +// changed player model +// +// 2 1/06/00 11:08p Jimdose +// cleaning up unused code +// +// DESCRIPTION: +// Definitions for any cvars used by the game. +// + +#include "gamecvars.h" + +cvar_t *developer; +cvar_t *deathmatch; +cvar_t *dmflags; +cvar_t *skill; +cvar_t *fraglimit; +cvar_t *timelimit; +cvar_t *password; +cvar_t *filterban; +cvar_t *flood_msgs; +cvar_t *flood_persecond; +cvar_t *flood_waitdelay; +cvar_t *maxclients; +cvar_t *maxentities; +cvar_t *nomonsters; +cvar_t *precache; +cvar_t *dedicated; +cvar_t *detail; +cvar_t *com_blood; +cvar_t *whereami; + +cvar_t *bosshealth; + +cvar_t *sv_maxvelocity; +cvar_t *sv_gravity; +cvar_t *sv_rollspeed; +cvar_t *sv_rollangle; +cvar_t *sv_cheats; +cvar_t *sv_showbboxes; +cvar_t *sv_showcameras; +cvar_t *sv_showentnums; +cvar_t *sv_stopspeed; +cvar_t *sv_friction; +cvar_t *sv_waterfriction; +cvar_t *sv_waterspeed; +cvar_t *sv_traceinfo; +cvar_t *sv_drawtrace; +cvar_t *sv_fps; +cvar_t *sv_cinematic; + +cvar_t *csys_posx; +cvar_t *csys_posy; +cvar_t *csys_posz; +cvar_t *csys_x; +cvar_t *csys_y; +cvar_t *csys_z; +cvar_t *csys_draw; + +cvar_t *g_showmem; +cvar_t *g_timeents; +cvar_t *g_showaxis; +cvar_t *g_showgravpath; +cvar_t *g_showplayerstate; +cvar_t *g_showplayeranim; +cvar_t *g_legswingspeed; +cvar_t *g_legclampangle; +cvar_t *g_legclamptolerance; +cvar_t *g_legtolerance; +cvar_t *g_numdebuglines; +cvar_t *g_playermodel; +cvar_t *g_statefile; +cvar_t *g_showbullettrace; +cvar_t *s_debugmusic; +cvar_t *g_showautoaim; +cvar_t *g_crosshair; +cvar_t *g_crosshair_maxscale; +cvar_t *g_debugtargets; +cvar_t *g_debugdamage; +cvar_t *g_logstats; + +void CVAR_Init + ( + void + ) + + { + developer = gi.cvar( "developer", "0", 0 ); + precache = gi.cvar( "sv_precache", "1", 0 ); + dedicated = gi.cvar( "dedicated", "0", CVAR_INIT ); + deathmatch = gi.cvar( "deathmatch", "0", CVAR_SERVERINFO|CVAR_LATCH ); + skill = gi.cvar( "skill", "1", CVAR_SERVERINFO|CVAR_LATCH ); + maxclients = gi.cvar( "sv_maxclients", "1", 0 ); + maxentities = gi.cvar( "maxentities", "1024", CVAR_LATCH ); + password = gi.cvar( "password", "", CVAR_USERINFO ); + filterban = gi.cvar( "filterban", "1", 0 ); + dmflags = gi.cvar( "dmflags", "0", CVAR_SERVERINFO ); + fraglimit = gi.cvar( "fraglimit", "0", CVAR_SERVERINFO ); + timelimit = gi.cvar( "timelimit", "0", CVAR_SERVERINFO ); + nomonsters = gi.cvar( "nomonsters", "0", CVAR_SERVERINFO ); + flood_msgs = gi.cvar( "flood_msgs", "4", 0 ); + flood_persecond = gi.cvar( "flood_persecond", "4", 0 ); + flood_waitdelay = gi.cvar( "flood_waitdelay", "10", 0 ); + detail = gi.cvar( "detail", "1", CVAR_ARCHIVE ); + com_blood = gi.cvar( "com_blood", "1", CVAR_USERINFO|CVAR_SERVERINFO|CVAR_ARCHIVE ); + whereami = gi.cvar( "whereami", "0", 0 ); + + bosshealth = gi.cvar( "bosshealth", "0", 0 ); + + sv_rollspeed = gi.cvar( "sv_rollspeed", "200", 0 ); + sv_rollangle = gi.cvar( "sv_rollangle", "2", 0 ); + sv_maxvelocity = gi.cvar( "sv_maxvelocity", "2000", 0 ); + sv_gravity = gi.cvar( "sv_gravity", "800", 0 ); + sv_traceinfo = gi.cvar( "sv_traceinfo", "0", 0 ); + sv_drawtrace = gi.cvar( "sv_drawtrace", "0", 0 ); + sv_showbboxes = gi.cvar( "sv_showbboxes", "0", 0 ); + sv_showcameras = gi.cvar( "sv_showcameras", "0", 0 ); + sv_showentnums = gi.cvar( "sv_showentnums", "0", 0 ); + sv_friction = gi.cvar( "sv_friction", "4", CVAR_SERVERINFO ); + sv_stopspeed = gi.cvar( "sv_stopspeed", "100", CVAR_SERVERINFO ); + sv_waterfriction = gi.cvar( "sv_waterfriction", "1", CVAR_SERVERINFO ); + sv_waterspeed = gi.cvar( "sv_waterspeed", "400", CVAR_SERVERINFO ); + sv_cheats = gi.cvar( "cheats", "0", CVAR_SERVERINFO|CVAR_LATCH ); + sv_fps = gi.cvar( "sv_fps", "20", CVAR_SERVERINFO ); + sv_cinematic = gi.cvar( "sv_cinematic", "0", CVAR_SERVERINFO|CVAR_ROM ); + + g_showmem = gi.cvar( "g_showmem", "0", 0 ); + g_timeents = gi.cvar( "g_timeents", "0", 0 ); + g_showaxis = gi.cvar( "g_showaxis", "0", 0 ); + g_showgravpath = gi.cvar( "g_drawgravpath", "0", 0 ); + g_showplayerstate = gi.cvar( "g_showplayerstate", "0", 0 ); + g_showplayeranim = gi.cvar( "g_showplayeranim", "0", 0 ); + g_showbullettrace = gi.cvar( "g_showbullettrace", "0", 0 ); + + g_legswingspeed = gi.cvar( "g_legswingspeed", "200", 0 ); + g_legclampangle = gi.cvar( "g_legclampangle", "90", 0 ); + g_legclamptolerance = gi.cvar( "g_legclamptolerance", "100", 0 ); + g_legtolerance = gi.cvar( "g_legtolerance", "40", 0 ); + + g_numdebuglines = gi.cvar( "g_numdebuglines", "4096", CVAR_LATCH ); + g_playermodel = gi.cvar( "g_playermodel", "julie", 0 ); + g_statefile = gi.cvar( "g_statefile", "global/julie", 0 ); + g_showautoaim = gi.cvar( "g_showautoaim", "0", 0 ); + g_crosshair = gi.cvar( "g_crosshair", "1", CVAR_ARCHIVE ); + g_crosshair_maxscale = gi.cvar( "g_crosshair_maxscale", "8", CVAR_ARCHIVE ); + g_debugtargets = gi.cvar( "g_debugtargets", "0", 0 ); + g_debugdamage = gi.cvar( "g_debugdamage", "0", 0 ); + g_logstats = gi.cvar( "g_logstats", "0", 0 ); + + csys_posx = gi.cvar( "csys_posx", "0", 0 ); + csys_posy = gi.cvar( "csys_posy", "0", 0 ); + csys_posz = gi.cvar( "csys_posz", "0", 0 ); + csys_x = gi.cvar( "csys_x", "0", 0 ); + csys_y = gi.cvar( "csys_y", "0", 0 ); + csys_z = gi.cvar( "csys_z", "0", 0 ); + csys_draw = gi.cvar( "csys_draw", "0", 0 ); + + s_debugmusic = gi.cvar( "s_debugmusic", "0", 0 ); + } diff --git a/source/source/fgame/gamecvars.h b/source/source/fgame/gamecvars.h new file mode 100644 index 0000000..434cf40 --- /dev/null +++ b/source/source/fgame/gamecvars.h @@ -0,0 +1,141 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/gamecvars.h $ +// $Revision:: 17 $ +// $Date:: 7/22/00 3:02p $ +// +// Copyright (C) 1999 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/gamecvars.h $ +// +// 17 7/22/00 3:02p Steven +// Added boss health bar stuff. +// +// 16 7/17/00 3:40p Steven +// Removed sv_gore stuff. +// +// 15 7/17/00 3:26p Aldie +// Fix for flashbangs, changed detail variable, and added forcetorsostate +// +// 14 7/14/00 10:04p Aldie +// Added g_logstats cvar +// +// 13 7/14/00 9:52p Markd +// added global volume dampener on ambient sound effects for cinematics +// +// 12 7/12/00 6:34p Aldie +// Added in crosshair scaling for long distances +// +// 11 6/13/00 6:46p Aldie +// Added some damage debug info. Added an ignoreEnt for explosion events +// +// 10 6/03/00 3:46p Aldie +// Added in g_debugtargets for debugging targetnames and targets +// +// 9 5/10/00 10:37a Steven +// Added com_blood. +// +// 8 5/08/00 3:19p Aldie +// Added initial crosshair work +// +// 7 3/15/00 2:04p Markd +// fixed up camera node system and added new debug oriented circle +// +// 6 3/06/00 8:07p Markd +// cleaned up unused cvar's +// +// 5 2/09/00 8:02p Aldie +// Added loopfire weapons +// +// 4 2/01/00 8:13p Aldie +// More autoaim work +// +// 3 1/19/00 7:46p Aldie +// Fixed func_spawns of various types and removed some unused misc classes +// +// 2 1/06/00 11:08p Jimdose +// cleaning up unused code +// +// DESCRIPTION: +// + +#ifndef __GAMECVARS_H__ +#define __GAMECVARS_H__ + +#include "g_local.h" + +extern cvar_t *developer; +extern cvar_t *deathmatch; +extern cvar_t *dmflags; +extern cvar_t *skill; +extern cvar_t *fraglimit; +extern cvar_t *timelimit; +extern cvar_t *password; +extern cvar_t *filterban; +extern cvar_t *flood_msgs; +extern cvar_t *flood_persecond; +extern cvar_t *flood_waitdelay; +extern cvar_t *maxclients; +extern cvar_t *maxentities; +extern cvar_t *nomonsters; +extern cvar_t *precache; +extern cvar_t *dedicated; +extern cvar_t *detail; +extern cvar_t *com_blood; +extern cvar_t *whereami; +extern cvar_t *bosshealth; + +extern cvar_t *sv_maxvelocity; +extern cvar_t *sv_gravity; +extern cvar_t *sv_rollspeed; +extern cvar_t *sv_rollangle; +extern cvar_t *sv_cheats; +extern cvar_t *sv_showbboxes; +extern cvar_t *sv_showcameras; +extern cvar_t *sv_showentnums; +extern cvar_t *sv_stopspeed; +extern cvar_t *sv_friction; +extern cvar_t *sv_waterfriction; +extern cvar_t *sv_waterspeed; +extern cvar_t *sv_traceinfo; +extern cvar_t *sv_drawtrace; +extern cvar_t *sv_fps; +extern cvar_t *sv_cinematic; + +extern cvar_t *csys_posx; +extern cvar_t *csys_posy; +extern cvar_t *csys_posz; +extern cvar_t *csys_x; +extern cvar_t *csys_y; +extern cvar_t *csys_z; +extern cvar_t *csys_draw; + +extern cvar_t *g_showmem; +extern cvar_t *g_timeents; +extern cvar_t *g_showaxis; +extern cvar_t *g_showgravpath; +extern cvar_t *g_showplayerstate; +extern cvar_t *g_showplayeranim; +extern cvar_t *g_showbullettrace; +extern cvar_t *g_legswingspeed; +extern cvar_t *g_legclampangle; +extern cvar_t *g_legclamptolerance; +extern cvar_t *g_legtolerance; +extern cvar_t *g_numdebuglines; +extern cvar_t *g_playermodel; +extern cvar_t *g_statefile; +extern cvar_t *g_showautoaim; +extern cvar_t *g_crosshair; +extern cvar_t *g_crosshair_maxscale; +extern cvar_t *g_debugtargets; +extern cvar_t *g_debugdamage; +extern cvar_t *s_debugmusic; +extern cvar_t *g_logstats; + +void CVAR_Init( void ); + +#endif /* !__GAMECVARS_H__ */ diff --git a/source/source/fgame/gamescript.cpp b/source/source/fgame/gamescript.cpp new file mode 100644 index 0000000..c57b0ff --- /dev/null +++ b/source/source/fgame/gamescript.cpp @@ -0,0 +1,543 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/gamescript.cpp $ +// $Revision:: 6 $ +// $Author:: Markd $ +// $Date:: 7/07/00 4:27p $ +// +// Copyright (C) 1997 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/gamescript.cpp $ +// +// 6 7/07/00 4:27p Markd +// made it so single : do not count as labels +// +// 5 4/24/00 12:09p Markd +// Fixed script loading issues for when no path is specified +// +// 4 4/05/00 3:51p Markd +// added label checking for scripts +// +// 3 2/22/00 2:23p Jimdose +// GetScript now checks if the name passed in is empty before calling +// FS_ReadFile. Fixes getting kicked out of game when there is no script and a +// trigger tries to start a thread +// +// 2 10/01/99 4:52p Markd +// Made Warning level 4 work on all projects +// +// 1 9/10/99 10:54a Jimdose +// +// 1 9/08/99 3:16p Aldie +// +// 6 8/17/99 5:08p Markd +// Changed all FS_ReadFile's to FS_ReadFileEx's in game code +// +// DESCRIPTION: +// Subclass of script that preprocesses labels +// + +#include "g_local.h" +#include "script.h" +#include "gamescript.h" + +ScriptLibrarian ScriptLib; + +CLASS_DECLARATION( Class, GameScriptMarker, NULL ) + { + { NULL, NULL } + }; + +CLASS_DECLARATION( Class, ScriptLibrarian, NULL ) + { + { NULL, NULL } + }; + +ScriptLibrarian::~ScriptLibrarian() + { + int i; + int num; + + num = scripts.NumObjects(); + for( i = 1; i <= num; i++ ) + { + delete scripts.ObjectAt( i ); + } + } + +void ScriptLibrarian::CloseScripts + ( + void + ) + + { + int i; + int num; + GameScript *scr; + + // Clear out the game and dialog scripts + SetGameScript( "" ); + SetDialogScript( "" ); + + num = scripts.NumObjects(); + for( i = num; i > 0; i-- ) + { + scr = scripts.ObjectAt( i ); + scripts.RemoveObjectAt( i ); + delete scr; + } + } + +void ScriptLibrarian::SetDialogScript + ( + str scriptname + ) + { + dialog_script = scriptname; + } + +void ScriptLibrarian::SetGameScript + ( + str scriptname + ) + { + game_script = scriptname; + } + +const char *ScriptLibrarian::GetGameScript + ( + void + ) + { + return game_script.c_str(); + } + +GameScript *ScriptLibrarian::FindScript + ( + const char *name + ) + + { + int i; + int num; + GameScript *scr; + str n; + + // Convert all forward slashes to back slashes + n = G_FixSlashes( name ); + + num = scripts.NumObjects(); + for( i = 1; i <= num; i++ ) + { + scr = scripts.ObjectAt( i ); + + if ( scr->Filename() == n ) + { + return scr; + } + } + + return NULL; + } + +GameScript *ScriptLibrarian::GetScript + ( + const char *name + ) + + { + GameScript *scr; + str n; + + n = G_FixSlashes( name ); + if ( !n.length() ) + { + return NULL; + } + + + // see if we have an absolute path specified, + // if we don't use the same path as the map file + if ( !strchr( n.c_str(), '/' ) ) + { + int i; + str mapname; + + mapname = "maps/"; + mapname += level.mapname; + for( i = mapname.length() - 1; i >= 0; i-- ) + { + if ( mapname[ i ] == '/' ) + { + // skip back over the '/' + i++; + mapname[ i ] = 0; + break; + } + } + mapname += n; + // copy it back into the write string + n = mapname; + } + + scr = FindScript( n.c_str() ); + if ( !scr && ( gi.FS_ReadFile( n.c_str(), NULL, qfalse ) != -1 ) ) + { + scr = new GameScript(); + scr->LoadFile( n.c_str() ); + scripts.AddObject( scr ); + } + + return scr; + } + +qboolean ScriptLibrarian::Goto + ( + GameScript *scr, + const char *name + ) + + { + const char *p; + GameScript *s; + str n; + + p = strstr( name, "::" ); + if ( !p ) + { + return scr->Goto( name ); + } + else + { + n = str( name, 0, p - name ); + if ( n == str( "dialog" ) ) + { + n = dialog_script; + } + s = GetScript( n.c_str() ); + if ( !s ) + { + return false; + } + + p += 2; + if ( s->labelExists( p ) ) + { + scr->SetSourceScript( s ); + return scr->Goto( p ); + } + } + + return false; + } + +qboolean ScriptLibrarian::labelExists + ( + GameScript *scr, + const char *name + ) + + { + const char *p; + GameScript *s; + str n; + + // if we got passed a NULL than that means just run the script so of course it exists + if ( !name ) + { + return qtrue; + } + + p = strstr( name, "::" ); + if ( !p ) + { + return scr->labelExists( name ); + } + else + { + n = str( name, 0, p - name ); + if ( n == str( "dialog" ) ) + { + n = dialog_script; + } + s = GetScript( n.c_str() ); + if ( !s ) + { + return false; + } + + p += 2; + return s->labelExists( p ); + } + } + +CLASS_DECLARATION( Script, GameScript, NULL ) + { + { NULL, NULL } + }; + +GameScript::GameScript() + { + sourcescript = this; + labelList = NULL; + crc = 0; + } + +GameScript::GameScript + ( + GameScript *scr + ) + + { + crc = 0; + labelList = NULL; + SetSourceScript( scr ); + } + +GameScript::~GameScript() + { + Close(); + } + +void GameScript::Close + ( + void + ) + + { + FreeLabels(); + Script::Close(); + sourcescript = this; + crc = 0; + } + +void GameScript::SetSourceScript + ( + GameScript *scr + ) + + { + if ( scr != this ) + { + Close(); + + sourcescript = scr->sourcescript; + crc = sourcescript->crc; + Parse( scr->buffer, scr->length, scr->Filename() ); + } + } + +void GameScript::FreeLabels + ( + void + ) + + { + int i; + int num; + + if ( labelList ) + { + num = labelList->NumObjects(); + for( i = 1; i <= num; i++ ) + { + delete labelList->ObjectAt( i ); + } + + delete labelList; + } + + labelList = NULL; + } + +void GameScript::LoadFile + ( + const char *name + ) + + { + str n; + + // Convert all forward slashes to back slashes + n = G_FixSlashes( name ); + + sourcescript = this; + Script::LoadFile( n.c_str() ); + FindLabels(); + + crc = gi.CalcCRC( (const unsigned char *)buffer, length ); + } + +void GameScript::FindLabels + ( + void + ) + + { + scriptmarker_t mark; + const char *tok; + script_label_t *label; + int len; + + FreeLabels(); + + labelList = new Container; + + MarkPosition( &mark ); + + Reset(); + + while( TokenAvailable( true ) ) + { + tok = GetToken( true ); + // see if it is a label + if ( tok ) + { + len = strlen( tok ); + if ( ( len > 1 ) && tok[ len - 1 ] == ':' ) + { + if ( !labelExists( tok ) ) + { + label = new script_label_t; + MarkPosition( &label->pos ); + label->labelname = tok; + labelList->AddObject( label ); + } + else + { + warning( "FindLabels", "Duplicate labels %s\n", tok ); + } + } + } + } + + RestorePosition( &mark ); + } + +qboolean GameScript::labelExists + ( + const char *name + ) + + { + str labelname; + script_label_t *label; + int i; + int num; + + // if we got passed a NULL than that means just run the script so of course it exists + if ( !name ) + { + return qtrue; + } + + if ( !sourcescript->labelList ) + { + return false; + } + + labelname = name; + if ( !labelname.length() ) + { + return false; + } + + if ( labelname[ labelname.length() - 1 ] != ':' ) + { + labelname += ":"; + } + + num = sourcescript->labelList->NumObjects(); + for( i = 1; i <= num; i++ ) + { + label = sourcescript->labelList->ObjectAt( i ); + if ( labelname == label->labelname ) + { + return true; + } + } + + return false; + } + +qboolean GameScript::Goto + ( + const char *name + ) + + { + str labelname; + script_label_t *label; + int i; + int num; + + if ( !sourcescript->labelList ) + { + return false; + } + + labelname = name; + if ( !labelname.length() ) + { + return false; + } + + if ( labelname[ labelname.length() - 1 ] != ':' ) + { + labelname += ":"; + } + + num = sourcescript->labelList->NumObjects(); + for( i = 1; i <= num; i++ ) + { + label = sourcescript->labelList->ObjectAt( i ); + if ( labelname == label->labelname ) + { + RestorePosition( &label->pos ); + return true; + } + } + + return false; + } + +void GameScript::Mark + ( + GameScriptMarker *mark + ) + + { + assert( mark ); + assert( sourcescript ); + + mark->filename = sourcescript->Filename(); + MarkPosition( &mark->scriptmarker ); + } + +void GameScript::Restore + ( + GameScriptMarker *mark + ) + + { + // If we change this function, we must update the unarchive function as well + GameScript *scr; + + assert( mark ); + + scr = ScriptLib.FindScript( mark->filename.c_str() ); + if ( scr ) + { + SetSourceScript( scr ); + } + else + { + LoadFile( mark->filename.c_str() ); + } + + RestorePosition( &mark->scriptmarker ); + } diff --git a/source/source/fgame/gamescript.h b/source/source/fgame/gamescript.h new file mode 100644 index 0000000..4bad35d --- /dev/null +++ b/source/source/fgame/gamescript.h @@ -0,0 +1,204 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/gamescript.h $ +// $Revision:: 3 $ +// $Author:: Markd $ +// $Date:: 5/26/00 7:44p $ +// +// Copyright (C) 1997 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/gamescript.h $ +// +// 3 5/26/00 7:44p Markd +// 2nd phase save games +// +// 2 5/24/00 3:14p Markd +// first phase of save/load games +// +// 1 9/10/99 10:54a Jimdose +// +// 1 9/08/99 3:16p Aldie +// +// DESCRIPTION: +// Subclass of script that preprocesses labels +// + +#ifndef __GAMESCRIPT_H__ +#define __GAMESCRIPT_H__ + +#include "class.h" +#include "script.h" + +typedef struct + { + scriptmarker_t pos; + str labelname; + } script_label_t; + +class GameScript; + +class GameScriptMarker : public Class + { + public: + CLASS_PROTOTYPE( GameScriptMarker ); + + str filename; + scriptmarker_t scriptmarker; + virtual void Archive( Archiver &arc ); + }; + +inline void GameScriptMarker::Archive + ( + Archiver &arc + ) + + { + // Game scripts are unique in that we don't call our superclass to archive it's data. + // Instead, we only read enough info to then initialize the script ourselves. + arc.ArchiveString( &filename ); + arc.ArchiveBoolean( &scriptmarker.tokenready ); + arc.ArchiveInteger( &scriptmarker.offset ); + arc.ArchiveInteger( &scriptmarker.line ); + arc.ArchiveRaw( scriptmarker.token, sizeof( scriptmarker.token ) ); + } + +class GameScript : public Script + { + protected: + Container *labelList; + GameScript *sourcescript; + unsigned crc; + + public: + CLASS_PROTOTYPE( GameScript ); + + GameScript(); + GameScript( GameScript *scr ); + ~GameScript(); + void Close( void ); + void SetSourceScript( GameScript *scr ); + void LoadFile( const char *filename ); + + void Mark( GameScriptMarker *mark ); + void Restore( GameScriptMarker *mark ); + + void FreeLabels( void ); + void FindLabels( void ); + qboolean labelExists( const char *name ); + qboolean Goto( const char *name ); + virtual void Archive( Archiver &arc ); + }; + +class ScriptLibrarian : public Class + { + protected: + Container scripts; + str dialog_script; + str game_script; + + public: + CLASS_PROTOTYPE( ScriptLibrarian ); + + ~ScriptLibrarian(); + + void CloseScripts( void ); + void SetDialogScript( str scriptname ); + void SetGameScript( str scriptname ); + const char *GetGameScript( void ); + GameScript *FindScript( const char *name ); + GameScript *GetScript( const char *name ); + qboolean Goto( GameScript *scr, const char *name ); + qboolean labelExists( GameScript *scr, const char *name ); + virtual void Archive( Archiver &arc ); + }; + +inline void ScriptLibrarian::Archive + ( + Archiver &arc + ) + { + GameScript * scr; + int i, num; + + Class::Archive( arc ); + + if ( arc.Loading() ) + { + scripts.FreeObjectList(); + } + else + { + num = scripts.NumObjects(); + } + arc.ArchiveInteger( &num ); + + for ( i = 1; i <= num; i++ ) + { + if ( arc.Saving() ) + { + scr = scripts.ObjectAt( i ); + } + else + { + scr = new GameScript; + } + arc.ArchiveObject( scr ); + if ( arc.Loading() ) + { + scripts.AddObject( scr ); + } + } + arc.ArchiveString( &dialog_script ); + arc.ArchiveString( &game_script ); + } + +extern ScriptLibrarian ScriptLib; + +inline void GameScript::Archive + ( + Archiver &arc + ) + + { + // Game scripts are unique in that we don't call our superclass to archive it's data. + // Instead, we only read enough info to then initialize the script ourselves. + GameScriptMarker mark; + + if ( arc.Saving() ) + { + arc.ArchiveUnsigned( &crc ); + Mark( &mark ); + arc.ArchiveObject( &mark ); + } + else + { + unsigned filecrc; + GameScript *scr; + + arc.ArchiveUnsigned( &filecrc ); + arc.ArchiveObject( &mark ); + scr = ScriptLib.FindScript( mark.filename.c_str() ); + if ( scr ) + { + SetSourceScript( scr ); + } + else + { + LoadFile( mark.filename.c_str() ); + } + + // Error out if CRCs have changed + if ( filecrc != crc ) + { + gi.Error( ERR_DROP, "File '%s' has changed from when this savegame was written. Load cancelled.\n", filename.c_str() ); + } + + RestorePosition( &mark.scriptmarker ); + } + } + +#endif diff --git a/source/source/fgame/gibs.cpp b/source/source/fgame/gibs.cpp new file mode 100644 index 0000000..22cedae --- /dev/null +++ b/source/source/fgame/gibs.cpp @@ -0,0 +1,390 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/gibs.cpp $ +// $Revision:: 25 $ +// $Author:: Steven $ +// $Date:: 8/10/00 5:45p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/gibs.cpp $ +// +// 25 8/10/00 5:45p Steven +// Fixed a way for blood to stay around forever on gibs. +// +// 24 7/25/00 10:43a Steven +// Made snd_decap louder, +// +// 23 7/17/00 3:40p Steven +// Removed sv_gore stuff. +// +// 22 6/23/00 8:41p Markd +// made a lot of changes to different constructors for saved game support +// +// 21 6/22/00 5:33p Steven +// Fixed the amount of time gib blood spurts stay around. +// +// 20 6/19/00 4:53p Steven +// Added next_bleed_time to make gibs not bleed as much. +// +// 19 6/14/00 3:50p Markd +// Cleaned up more Intel Compiler warnings +// +// 18 4/15/00 11:50a Steven +// Took out default blood names. +// +// 17 4/14/00 10:36a Steven +// Added blood splat size to gibs. +// +// 16 4/08/00 3:56p Steven +// Made it so gibs could be damaged and would spurt blood. +// +// 15 4/04/00 6:54p Steven +// Added random radius to the blood splats. +// +// 14 4/01/00 1:20p Steven +// Some clean up. +// +// 13 3/31/00 1:02p Steven +// Fixed a bug in the bloodsplats. +// +// 12 3/30/00 2:04p Steven +// Added blood splats back in. +// +// 11 3/22/00 10:36a Steven +// Made blood optional in gibs (started using blood_trail variable). +// +// 10 3/02/00 6:40p Steven +// Made which blood model to use a parameter to gib. +// +// 9 1/20/00 6:54p Aldie +// Removed bloodsplats until we do them the right way +// +// 8 1/12/00 4:31p Steven +// Added new movetype MOVETYPE_GIB. +// +// 7 1/06/00 7:00p Steven +// Made it so gibs did not have to have a model. +// +// 6 1/06/00 4:39p Markd +// fixed tiki file name +// +// 5 1/05/00 6:44p Steven +// Fixed gib blood splats (their origin was being miscalculated). +// +// 4 9/29/99 5:18p Steven +// Event formatting. +// +// 3 9/27/99 5:44p Markd +// began documentation and cleanup phase after merge +// +// 2 9/16/99 11:18a Markd +// Continuing merge of code, not functional yet but closer +// +// 1 9/10/99 10:54a Jimdose +// +// 1 9/08/99 3:16p Aldie +// +// 14 9/01/99 8:17p Steven +// Changed gibs to use bspurt2.tik. +// +// 13 8/28/99 11:44a Steven +// Removed global from sound function calls. +// +// DESCRIPTION: +// Gibs - nuff said + +#include "gibs.h" +#include "decals.h" + +Event EV_ThrowGib + ( + "throwgib", + EV_DEFAULT, + "eif", + "ent velocity scale", + "Throw a gib." + ); + +CLASS_DECLARATION( Mover, Gib, "gib" ) + { + { &EV_ThrowGib, Throw }, + { &EV_Touch, Splat }, + { &EV_Stop, Stop }, + { &EV_Damage, Damage }, + { NULL, NULL } + }; + +Gib::Gib + ( + str name, + qboolean blood_trail, + str bloodtrailname, + str bloodspurtname, + str bloodsplatname, + float bloodsplatsize, + float pitch + ) + + { + setSize("0 0 0", "0 0 0"); + + if ( name.length() ) + setModel( name.c_str() ); + + setMoveType( MOVETYPE_GIB ); + setSolidType( SOLID_BBOX ); + takedamage = DAMAGE_YES; + sprayed = false; + fadesplat = true; + scale = 2.0f; + + next_bleed_time = 0; + + final_pitch = pitch; + + if ( blood_trail ) + { + // Make a blood emitter and bind it to the head + blood = new Mover; + + if ( bloodtrailname.length() ) + blood->setModel( bloodtrailname.c_str() ); + + blood->setMoveType( MOVETYPE_BOUNCE ); + blood->setSolidType( SOLID_NOT ); + blood->bind( this ); + + // Save the blood spurt name + + if ( bloodspurtname.length() ) + blood_spurt_name = bloodspurtname; + + // Save the blood splat name + + if ( bloodsplatname.length() ) + blood_splat_name = bloodsplatname; + + blood_splat_size = bloodsplatsize; + } + else + { + blood = NULL; + } + + Sound( "snd_decap", CHAN_BODY, 1, 300 ); + } + +Gib::~Gib() + { + if ( blood ) + blood->PostEvent( EV_Remove, 0 ); + blood = NULL; + } + +Gib::Gib() + { + if ( LoadingSavegame ) + { + return; + } + + setSize("0 0 0", "0 0 0"); + setModel("gib1.def"); + setMoveType( MOVETYPE_GIB ); + setSolidType( SOLID_BBOX ); + sprayed = 0; + fadesplat = true; + scale = 2.0f; + } + +void Gib::Stop + ( + Event *ev + ) + + { + //setSolidType( SOLID_NOT ); + if ( blood ) + blood->PostEvent( EV_Remove, 0 ); + blood = NULL; + } + +void Gib::Splat + ( + Event *ev + ) + + { + if ( deathmatch->integer ) + return; + + if ( sprayed > 3 ) + { + //setSolidType(SOLID_NOT); + return; + } + + sprayed++; + scale -= 0.2; + + // Stop spinning / force to final pitch + + avelocity = vec_zero; + + if ( final_pitch != NO_FINAL_PITCH ) + { + angles[PITCH] = final_pitch; + setAngles( angles ); + } + + SprayBlood( origin ); + Sound( "snd_gibhit" ); + } + +void Gib::Damage + ( + Event *ev + ) + + { + Vector direction; + Entity *blood; + Vector dir; + + if ( next_bleed_time > level.time ) + return; + + direction = ev->GetVector ( 5 ); + + // Spawn a blood spurt + + if ( blood_spurt_name.length() > 0 ) + { + blood = new Animate; + blood->setModel( blood_spurt_name.c_str() ); + + dir[0] = -direction[0]; + dir[1] = -direction[1]; + dir[2] = -direction[2]; + + blood->angles = dir.toAngles(); + blood->setAngles( blood->angles ); + + blood->setOrigin( centroid ); + blood->origin.copyTo( blood->edict->s.origin2 ); + blood->setSolidType( SOLID_NOT ); + + blood->PostEvent( EV_Remove, 1 ); + + next_bleed_time = level.time + 0.5; + } + } + +void Gib::SprayBlood + ( + Vector start + ) + + { + Vector norm; + trace_t trace; + Vector trace_end; + + trace_end = velocity; + trace_end.normalize(); + trace_end *= 1000; + trace_end += start; + + trace = G_Trace( start, vec_zero, vec_zero, trace_end, this, MASK_SOLID, false, "Gib::SprayBlood" ); + + if ( HitSky( &level.impact_trace ) || ( !level.impact_trace.ent ) || ( level.impact_trace.ent->solid != SOLID_BSP ) ) + { + return; + } + + // Do a bloodsplat + if ( blood_splat_name.length() ) + { + Decal *decal = new Decal; + decal->setShader( blood_splat_name ); + decal->setOrigin( Vector( trace.endpos ) + ( Vector( level.impact_trace.plane.normal ) * 0.2 ) ); + decal->setDirection( level.impact_trace.plane.normal ); + decal->setOrientation( "random" ); + decal->setRadius( blood_splat_size + G_Random( blood_splat_size ) ); + } + } + +void Gib::ClipGibVelocity + ( + void + ) + + { + if (velocity[0] < -400) + velocity[0] = -400; + else if (velocity[0] > 400) + velocity[0] = 400; + if (velocity[1] < -400) + velocity[1] = -400; + else if (velocity[1] > 400) + velocity[1] = 400; + if (velocity[2] < 200) + velocity[2] = 200; // always some upwards + else if (velocity[2] > 600) + velocity[2] = 600; +} + +void Gib::SetVelocity + ( + float damage + ) + + { + velocity[0] = 100.0 * crandom(); + velocity[1] = 100.0 * crandom(); + velocity[2] = 200.0 + 100.0 * random(); + + avelocity = Vector( G_Random( 600 ), G_Random( 600 ), G_Random( 600 ) ); + + if ( ( damage < -150 ) && ( G_Random() > 0.95f ) ) + velocity *= 2.0f; + else if ( damage < -100 ) + velocity *= 1.5f; + + ClipGibVelocity(); + } + +void Gib::Throw + ( + Event *ev + ) + + { + Entity *ent; + + ent = ev->GetEntity(1); + setOrigin(ent->centroid); + origin.copyTo(edict->s.origin2); + SetVelocity(ev->GetInteger(2)); + edict->s.scale = ev->GetFloat(3); + PostEvent(EV_FadeOut, 10 + G_Random(5)); + } + + +void CreateGibs + ( + Entity * ent, + float damage, + float scale, + int num, + const char * modelname + ) + + { + + } diff --git a/source/source/fgame/gibs.h b/source/source/fgame/gibs.h new file mode 100644 index 0000000..46db302 --- /dev/null +++ b/source/source/fgame/gibs.h @@ -0,0 +1,120 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/gibs.h $ +// $Revision:: 11 $ +// $Author:: Steven $ +// $Date:: 8/10/00 5:45p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/gibs.h $ +// +// 11 8/10/00 5:45p Steven +// Fixed a way for blood to stay around forever on gibs. +// +// 10 6/19/00 4:53p Steven +// Added next_bleed_time to make gibs not bleed as much. +// +// 9 6/14/00 3:50p Markd +// Cleaned up more Intel Compiler warnings +// +// 8 5/26/00 7:44p Markd +// 2nd phase save games +// +// 7 5/24/00 3:14p Markd +// first phase of save/load games +// +// 6 4/14/00 10:36a Steven +// Added blood splat size to gibs. +// +// 5 4/08/00 3:59p Steven +// Added damage event and blood spurt name. +// +// 4 4/01/00 1:20p Steven +// Some clean up. +// +// 3 3/30/00 2:04p Steven +// Added blood splats back in. +// +// 2 3/02/00 6:40p Steven +// Made which blood model to use a parameter to gib. +// +// 1 9/10/99 10:54a Jimdose +// +// 1 9/08/99 3:16p Aldie +// +// DESCRIPTION: +// Gibs - nuff said + +#ifndef __GIBS_H__ +#define __GIBS_H__ + +#include "g_local.h" +#include "mover.h" + +#define NO_FINAL_PITCH -1000 + +class Gib : public Mover + { + private: + int sprayed; + float scale; + Mover *blood; + str blood_splat_name; + float blood_splat_size; + str blood_spurt_name; + float final_pitch; + float next_bleed_time; + public: + CLASS_PROTOTYPE( Gib ); + + qboolean fadesplat; + Gib(); + ~Gib(); + Gib( str name, qboolean blood_trail, str bloodtrailname="", str bloodspurtname="", str bloodsplatname="", + float blood_splat_size = 8, float pitch=NO_FINAL_PITCH ); + void SetVelocity( float health ); + void SprayBlood( Vector start ); + void Throw( Event *ev ); + void Splat( Event *ev ); + void Stop( Event *ev ); + void Damage( Event *ev ); + void ClipGibVelocity( void ); + virtual void Archive( Archiver &arc ); + }; + +inline void Gib::Archive + ( + Archiver &arc + ) + { + Entity::Archive( arc ); + + arc.ArchiveBoolean( &sprayed ); + arc.ArchiveFloat( &scale ); + arc.ArchiveObjectPointer( ( Class ** )&blood ); + arc.ArchiveString( &blood_splat_name ); + arc.ArchiveFloat( &blood_splat_size ); + arc.ArchiveString( &blood_spurt_name ); + arc.ArchiveFloat( &final_pitch ); + arc.ArchiveBoolean( &fadesplat ); + arc.ArchiveFloat( &next_bleed_time ); + } + + +void CreateGibs + ( + Entity * ent, + float damage = -50, + float scale = 1.0f, + int num = 1, + const char * modelname = NULL + ); + +extern Event EV_ThrowGib; + +#endif // gibs.h diff --git a/source/source/fgame/goo.cpp b/source/source/fgame/goo.cpp new file mode 100644 index 0000000..4ee28a7 --- /dev/null +++ b/source/source/fgame/goo.cpp @@ -0,0 +1,278 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/goo.cpp $ +// $Revision:: 7 $ +// $Author:: Markd $ +// $Date:: 7/31/00 1:33a $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/goo.cpp $ +// +// 7 7/31/00 1:33a Markd +// fixed crash bug for goo +// +// 6 7/20/00 9:30p Aldie +// Tweak +// +// 5 7/20/00 6:21p Aldie +// More fixes to goo +// +// 4 7/20/00 3:46p Aldie +// Lots of fixes to the goo projectile +// +// 3 6/08/00 3:56p Aldie +// Fixed a comment +// +// 2 6/08/00 3:55p Aldie +// Added goo +// +// DESCRIPTION: +// Goo Gun Projectile + +#include "goo.h" + +Event EV_GooDebris_Prethink + ( + "_prethink", + EV_DEFAULT, + NULL, + NULL, + "Think function for the debris" + ); + +CLASS_DECLARATION( Projectile, GooDebris, NULL ) + { + { &EV_GooDebris_Prethink, Prethink }, + { &EV_Touch, Touch }, + { NULL, NULL } + }; + +GooDebris::GooDebris + ( + ) + + { + nexttouch = 0; + } + +void GooDebris::Prethink + ( + Event *ev + ) + + { + if ( ( velocity.length() < 30 ) && ( CurrentAnim() == gi.Anim_NumForName( edict->s.modelindex, "idle" ) ) ) + { + velocity = Vector( 0,0,0 ); + RandomAnimate( "splat" ); + } + + if ( ( level.time - this->edict->spawntime ) > 5 ) + { + edict->s.scale *= 0.95; + } + + if ( edict->s.scale < 0.1 ) + { + PostEvent( EV_Remove, 0 ); + } + else + { + Event *ev1 = new Event( ev ); + PostEvent( ev1, level.frametime ); + } + } + +void GooDebris::Touch + ( + Event *ev + ) + + { + Entity *other; + Entity *owner; + Vector ang; + + other = ev->GetEntity( 1 ); + + if ( other == world ) + { + vectoangles( level.impact_trace.plane.normal, ang ); + setAngles( ang ); + } + + if ( level.time < nexttouch ) + { + return; + } + + nexttouch = level.time + 0.5; + + if ( !other->isSubclassOf( Sentient ) ) + { + return; + } + + owner = G_GetEntity( this->owner ); + + if ( !owner ) + { + owner = world; + } + + if ( !other ) + { + return; + } + + other->Damage( this, owner, damage, origin, Vector( 0,0,0 ), Vector( 0,0,0 ), 0, 0, meansofdeath ); + } + +Event EV_Goo_DebrisModel + ( + "debrismodel", + EV_DEFAULT, + "s", + "modelname", + "Model name for the debris that is spawned on explosion" + ); +Event EV_Goo_DebrisCount + ( + "debriscount", + EV_DEFAULT, + "i", + "count", + "Number of pieces of debris to spawn" + ); + +CLASS_DECLARATION( Projectile, GooProjectile, NULL ) + { + { &EV_Goo_DebrisModel, SetDebrisModel }, + { &EV_Goo_DebrisCount, SetDebrisCount }, + { NULL, NULL } + }; + +GooProjectile::GooProjectile + ( + ) + + { + m_debrismodel = "fx_goo_debris.tik"; + m_debriscount = 3; + } + +void GooProjectile::SetDebrisModel + ( + Event *ev + ) + + { + m_debrismodel = ev->GetString( 1 ); + } + +void GooProjectile::SetDebrisCount + ( + Event *ev + ) + + { + m_debriscount = ev->GetInteger( 1 ); + } + +void GooProjectile::Explode + ( + Event *ev + ) + + { + int i; + Entity *owner; + Entity *ignoreEnt=NULL; + + if ( ev->NumArgs() == 1 ) + ignoreEnt = ev->GetEntity( 1 ); + + // Get the owner of this projectile + owner = G_GetEntity( this->owner ); + + // If the owner's not here, make the world the owner + if ( !owner ) + owner = world; + + takedamage = DAMAGE_NO; + + // Spawn an explosion model + if ( explosionmodel.length() ) + { + // Move the projectile back off the surface a bit so we can see + // explosion effects. + Vector dir, v; + v = velocity; + v.normalize(); + dir = v; + v = origin - v * 36; + setOrigin( v ); + + ExplosionAttack( v, owner, explosionmodel, dir, ignoreEnt ); + } + + CancelEventsOfType( EV_Projectile_UpdateBeam ); + + // Kill the beam + if ( m_beam ) + { + m_beam->ProcessEvent( EV_Remove ); + m_beam = NULL; + } + + // When the goo hits something, spawn debris + for ( i=0; iorigin, dir, this, m_debrismodel, 1.0 ); + + if ( !proj ) + { + warning( "GooProjectile::Explode", "Could not create debris projectile" ); + return; + } + + proj->owner = ENTITYNUM_WORLD; + proj->setSolidType( SOLID_TRIGGER ); + proj->avelocity = Vector( G_CRandom( 360 ), G_CRandom( 360 ), G_CRandom( 360 ) ); + proj->setSize( Vector( -16,-16,0 ) * proj->edict->s.scale, Vector( 16,16,32 ) * proj->edict->s.scale ); + proj->setMoveType( MOVETYPE_TOSS ); + proj->PostEvent( EV_GooDebris_Prethink, level.frametime ); + } + + // Change to the splat + if ( level.impact_trace.ent && ( level.impact_trace.ent->solid == SOLID_BSP ) ) + { + GooDebris *p; + Vector ang; + p = new GooDebris; + vectoangles( level.impact_trace.plane.normal, ang ); + p->setAngles( ang ); + p->setModel( this->model ); + p->ProcessInitCommands( p->edict->s.modelindex ); + p->setSize( Vector( -16,-16,0 ) * p->edict->s.scale, Vector( 16,16,32 ) * p->edict->s.scale ); + p->setOrigin( this->origin ); + p->velocity = Vector( 0,0,0 ); + p->setMoveType( MOVETYPE_FLY ); + p->setSolidType( SOLID_TRIGGER ); + p->RandomAnimate( "splat" ); + p->owner = this->owner; + p->PostEvent( EV_GooDebris_Prethink, level.frametime ); // shrink out + } + } + diff --git a/source/source/fgame/goo.h b/source/source/fgame/goo.h new file mode 100644 index 0000000..ca35b72 --- /dev/null +++ b/source/source/fgame/goo.h @@ -0,0 +1,89 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/goo.h $ +// $Revision:: 5 $ +// $Author:: Aldie $ +// $Date:: 7/20/00 6:21p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/goo.h $ +// +// 5 7/20/00 6:21p Aldie +// More fixes to goo +// +// 4 7/20/00 3:46p Aldie +// Lots of fixes to the goo projectile +// +// 3 6/08/00 3:56p Aldie +// Fixed a comment +// +// 2 6/08/00 3:55p Aldie +// Added goo +// +// DESCRIPTION: +// Goo Gun Projectile + +#ifndef __GOO_H__ +#define __GOO_H__ + +#include "weapon.h" +#include "weaputils.h" + +class GooProjectile : public Projectile + { + private: + str m_debrismodel; + int m_debriscount; + + public: + CLASS_PROTOTYPE( GooProjectile ); + + GooProjectile(); + void Explode( Event *ev ); + void SetDebrisModel( Event *ev ); + void SetDebrisCount( Event *ev ); + void Archive( Archiver &arc ); + }; + +void GooProjectile::Archive + ( + Archiver &arc + ) + + { + Projectile::Archive( arc ); + arc.ArchiveString( &m_debrismodel ); + arc.ArchiveInteger( &m_debriscount ); + } + + +class GooDebris : public Projectile + { + private: + float nexttouch; + + public: + CLASS_PROTOTYPE( GooDebris ); + + GooDebris(); + void Touch( Event *ev ); + void Prethink( Event *ev ); + void Archive( Archiver &arc ); + }; + +void GooDebris::Archive + ( + Archiver &arc + ) + + { + Projectile::Archive( arc ); + arc.ArchiveFloat( &nexttouch ); + } + +#endif // __GOO_H__ \ No newline at end of file diff --git a/source/source/fgame/gravpath.cpp b/source/source/fgame/gravpath.cpp new file mode 100644 index 0000000..261ce15 --- /dev/null +++ b/source/source/fgame/gravpath.cpp @@ -0,0 +1,836 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/gravpath.cpp $ +// $Revision:: 14 $ +// $Author:: Steven $ +// $Date:: 7/21/00 8:36p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/gravpath.cpp $ +// +// 14 7/21/00 8:36p Steven +// Got gravpaths working fairly well. +// +// 13 7/08/00 6:07p Steven +// Added a PULL_UPWARDS spawn flag to gravpaths. +// +// 12 7/06/00 12:58p Steven +// Changed gravpaths to pull you parallel to the path not towards it. +// +// 11 6/23/00 8:41p Markd +// made a lot of changes to different constructors for saved game support +// +// 10 6/14/00 2:17p Markd +// fixed compiler warnings for Intel Compiler +// +// 9 1/22/00 12:42p Jimdose +// got rid of calls to vec3() +// +// 8 1/06/00 11:08p Jimdose +// cleaning up unused code +// +// 7 12/07/99 10:33a Jimdose +// made CalculateGravityPull early exit when there are no gravpaths +// +// 6 10/26/99 5:27p Aldie +// Fix for gravpaths +// +// 5 10/04/99 10:53a Aldie +// fix warning +// +// 4 9/29/99 5:18p Steven +// Event formatting. +// +// 3 9/22/99 4:47p Markd +// fixed more G_GetEntity, G_FindClass and G_GetNextEntity bugs +// +// 2 9/21/99 7:51p Markd +// Fixed a lot of entitynum_none issues +// +// 1 9/10/99 10:54a Jimdose +// +// 1 9/08/99 3:16p Aldie +// +// 10 8/18/99 3:28p Jimdose +// added cylindrical collision detection +// +// 9 6/11/99 1:23p Phook +// +// 8 6/11/99 12:58p Phook +// Changed from SINED comments to QUAKED +// +// DESCRIPTION: +// Gravity path - Used for underwater currents and wells. + +#include "g_local.h" +#include "entity.h" +#include "gravpath.h" +#include "container.h" +#include "navigate.h" +#include "misc.h" +#include "player.h" + +GravPathManager gravPathManager; + +CLASS_DECLARATION( Class, GravPathManager, NULL ) + { + { NULL,NULL } + }; + +GravPathManager::~GravPathManager() + { + Reset(); + } + +void GravPathManager::Reset( void ) + { + while( pathList.NumObjects() > 0 ) + { + delete ( GravPath * )pathList.ObjectAt( 1 ); + } + + pathList.FreeObjectList(); + } + +void GravPathManager::AddPath(GravPath *p) + { + pathList.AddObject( p ); + } + +void GravPathManager::RemovePath(GravPath *p) + { + pathList.RemoveObject( p ); + } + +void GravPathManager::DrawGravPaths + ( + void + ) + + { + int i; + int num = pathList.NumObjects(); + + for( i = 1; i <= num; i++ ) + { + GravPath *p = ( GravPath * )pathList.ObjectAt( i ); + + p->DrawPath( 1,0,0 ); + } + } + +Vector GravPathManager::CalculateGravityPull(Entity &ent, Vector pos, qboolean *force, float *max_speed) + { + int i,num; + GravPath *p; + GravPathNode *node; + Vector point; + Vector newpoint; + Vector dir; + float bestdist = 99999; + float dist; + float speed; + float radius; + Vector velocity; + int bestpath = 0; + int entity_contents, grav_contents; + + num = pathList.NumObjects(); + if ( !num ) + { + return vec_zero; + } + + entity_contents = gi.pointcontents( ent.origin, 0 ); + + for( i = 1; i <= num; i++ ) + { + p = ( GravPath * )pathList.ObjectAt( i ); + + if ( !p ) + continue; + + // Check to see if path is active + node = p->GetNode( 1 ); + if ( !node || !node->active ) + continue; + + // Check to see if the contents are the same + grav_contents = gi.pointcontents( node->origin, 0 ); + + // If grav node is in water, make sure ent is too. + if ( ( grav_contents & CONTENTS_WATER ) && !( entity_contents & CONTENTS_WATER ) ) + continue; + + // Test to see if we are in this path's bounding box + if ( (pos.x < p->maxs.x) && (pos.y < p->maxs.y) && (pos.z < p->maxs.z) && + (pos.x > p->mins.x) && (pos.y > p->mins.y) && (pos.z > p->mins.z) ) + { + point = p->ClosestPointOnPath(pos, ent, &dist, &speed, &radius); + + // If the closest distance on the path is greater than the radius, then + // do not consider this path. + + if (dist > radius) + { + continue; + } + else if (dist < bestdist) + { + bestpath = i; + bestdist = dist; + } + } + } + + if (!bestpath) + { + return vec_zero; + } + + p = ( GravPath * )pathList.ObjectAt( bestpath ); + if ( !p ) + return velocity; + *force = p->force; + dist = p->DistanceAlongPath(pos, &speed); + newpoint = p->PointAtDistance( pos, dist + speed, ent.isSubclassOf( Player ), max_speed ); + dir = newpoint-pos; + dir.normalize(); + velocity = dir * speed; + + //velocity *= .75; + return velocity; + } + +/*****************************************************************************/ +/*QUAKED info_grav_pathnode (0 0 .5) (-16 -16 0) (16 16 32) HEADNODE FORCE PULL_UPWARDS + "radius" Radius of the effect of the pull (Default is 256) + "speed" Speed of the pull (Use negative for a repulsion) (Default is 100) + + Set HEADNODE to signify the head of the path. + Set FORCE if you want un-fightable gravity ( i.e. can't go backwards ) + Set PULL_UPWARDS if you want the gravnodes to pull you upwards also +******************************************************************************/ + +#define PULL_UPWARDS ( 1 << 2 ) + +Event EV_GravPath_Create + ( + "gravpath_create", + EV_DEFAULT, + NULL, + NULL, + "Create the grav path." + ); +Event EV_GravPath_Activate + ( + "activate", + EV_DEFAULT, + NULL, + NULL, + "Activate the grav path." + ); +Event EV_GravPath_Deactivate + ( + "deactivate", + EV_DEFAULT, + NULL, + NULL, + "Deactivate the grav path." + ); +Event EV_GravPath_SetSpeed + ( + "speed", + EV_DEFAULT, + "f", + "speed", + "Set the speed of the grav path." + ); +Event EV_GravPath_SetMaxSpeed + ( + "maxspeed", + EV_DEFAULT, + "f", + "maxspeed", + "Set the max speed of the grav path." + ); +Event EV_GravPath_SetRadius + ( + "radius", + EV_DEFAULT, + "f", + "radius", + "Set the radius of the grav path." + ); + +CLASS_DECLARATION( Entity, GravPathNode, "info_grav_pathnode" ) + { + { &EV_GravPath_Create, CreatePath }, + { &EV_GravPath_Activate, Activate }, + { &EV_GravPath_Deactivate, Deactivate }, + { &EV_GravPath_SetSpeed, SetSpeed }, + { &EV_GravPath_SetMaxSpeed, SetMaxSpeed }, + { &EV_GravPath_SetRadius, SetRadius }, + { NULL, NULL } + }; + +GravPathNode::GravPathNode() + { + if ( LoadingSavegame ) + { + // all data will be setup by the archive function + return; + } + + setMoveType( MOVETYPE_NONE ); + setSolidType( SOLID_NOT ); + hideModel(); + + speed = 100.0f; + max_speed = 200.0f; + radius = 256.0f; + headnode = spawnflags & 1; + active = true; + + // This is the head of a new path, post an event to create the path + if ( headnode ) + { + PostEvent( EV_GravPath_Create, 0 ); + } + } + +void GravPathNode::SetSpeed + ( + Event *ev + ) + + { + speed = ev->GetFloat( 1 ); + } + +void GravPathNode::SetMaxSpeed + ( + Event *ev + ) + + { + max_speed = ev->GetFloat( 1 ); + } + +void GravPathNode::SetRadius + ( + Event *ev + ) + + { + radius = ev->GetFloat( 1 ); + } + +float GravPathNode::Speed + ( + void + ) + + { + if ( active ) + return speed; + else + return 0; + } + +float GravPathNode::MaxSpeed + ( + void + ) + + { + return max_speed; + } + +void GravPathNode::Activate + ( + Event *ev + ) + + { + GravPathNode *node; + Entity *ent; + const char *target; + + active = true; + node = this; + // Go through the entire path and activate it + target = node->Target(); + while (target[0]) + { + ent = G_FindTarget( NULL, target ); + if ( ent ) + { + node = (GravPathNode *)ent; + assert( node ); + node->active = true; + } + else + { + gi.Error( ERR_DROP, "GravPathNode::CreatePath: target %s not found\n",target); + } + target = node->Target(); + } + } + +void GravPathNode::Deactivate(Event *ev) + { + GravPathNode *node; + Entity *ent; + const char *target; + + active = false; + node = this; + // Go through the entire path and activate it + target = node->Target(); + while (target[0]) + { + ent = G_FindTarget( NULL, target); + if ( ent ) + { + node = (GravPathNode *)ent; + assert( node ); + node->active = false; + } + else + { + gi.Error( ERR_DROP, "GravPathNode::CreatePath: target %s not found\n",target); + } + target = node->Target(); + } + } + +void GravPathNode::CreatePath(Event *ev) + { + const char *target; + GravPath *path = new GravPath; + GravPathNode *node; + Entity *ent; + + ClearBounds( path->mins, path->maxs ); + + // This node is the head of a path, create a new path in the path manager. + // and add it in, then add all of it's children in the path. + node = this; + path->AddNode(node); + path->force = spawnflags & 2; + + // Make the path from the targetlist. + target = node->Target(); + while (target[0]) + { + ent = G_FindTarget( NULL, target ); + if ( ent ) + { + node = (GravPathNode *)ent; + assert( node ); + path->AddNode(node); + } + else + { + gi.Error( ERR_DROP, "GravPathNode::CreatePath: target %s not found\n",target); + } + target = node->Target(); + } + + // Set the origin. + path->origin = path->mins + path->maxs; + path->origin *= 0.5f; + } + +CLASS_DECLARATION( Listener, GravPath, NULL ) + { + { NULL, NULL } + }; + +GravPath::GravPath() + { + pathlength = 0; + from = NULL; + to = NULL; + nextnode = 1; + + if ( !LoadingSavegame ) + { + gravPathManager.AddPath(this); + } + } + +GravPath::~GravPath() + { + pathlength = 0; + from = NULL; + to = NULL; + nextnode = 1; + gravPathManager.RemovePath(this); + } + +void GravPath::Clear + ( + void + ) + + { + nextnode = 1; + pathlength = 0; + from = NULL; + to = NULL; + pathlist.FreeObjectList(); + } + +void GravPath::Reset + ( + void + ) + + { + nextnode = 1; + } + +GravPathNode *GravPath::Start + ( + void + ) + + { + return from; + } + +GravPathNode *GravPath::End + ( + void + ) + + { + return to; + } + +void GravPath::AddNode + ( + GravPathNode *node + ) + + { + int num; + Vector r,addp; + + if ( !from ) + { + from = node; + } + + to = node; + pathlist.AddObject( GravPathNodePtr( node ) ); + + num = NumNodes(); + if ( num > 1 ) + { + pathlength += ( node->origin - GetNode( num )->origin ).length(); + } + + r.setXYZ(node->Radius(),node->Radius(),node->Radius()); + addp = node->origin + r; + AddPointToBounds(addp,mins,maxs); + addp = node->origin - r; + AddPointToBounds(addp,mins,maxs); + } + +GravPathNode *GravPath::GetNode + ( + int num + ) + + { + return pathlist.ObjectAt( num ); + } + +GravPathNode *GravPath::NextNode + ( + void + ) + + { + if ( nextnode <= NumNodes() ) + { + return pathlist.ObjectAt( nextnode++ ); + } + return NULL; + } + +Vector GravPath::ClosestPointOnPath + ( + Vector pos, + Entity &ent, + float *ret_dist, + float *speed, + float *radius + ) + + { + GravPathNode *s; + GravPathNode *e; + int num; + int i; + float bestdist; + Vector bestpoint; + float dist; + float segmentlength; + Vector delta; + Vector p1; + Vector p2; + Vector p3; + float t; + trace_t trace; + + num = NumNodes(); + s = GetNode( 1 ); + trace = G_Trace( pos, ent.mins, ent.maxs, s->origin, &ent, MASK_PLAYERSOLID, false, "GravPath::ClosestPointOnPath 1" ); + bestpoint = s->origin; + delta = bestpoint - pos; + bestdist = delta.length(); + *speed = s->Speed(); + *radius = s->Radius(); + + for( i = 2; i <= num; i++ ) + { + e = GetNode( i ); + + // check if we're closest to the endpoint + delta = e->origin - pos; + dist = delta.length(); + + if ( dist < bestdist ) + { + trace = G_Trace( pos, ent.mins, ent.maxs, e->origin, &ent, MASK_PLAYERSOLID, false, "GravPath::ClosestPointOnPath 2" ); + bestdist = dist; + bestpoint = e->origin; + *speed = e->Speed(); + *radius = e->Radius(); + } + + // check if we're closest to the segment + p1 = e->origin - s->origin; + segmentlength = p1.length(); + p1 *= 1 / segmentlength; + p2 = pos - s->origin; + + t = p1 * p2; + if ( ( t > 0 ) && ( t < segmentlength ) ) + { + p3 = ( p1 * t ) + s->origin; + + delta = p3 - pos; + dist = delta.length(); + if ( dist < bestdist ) + { + trace = G_Trace( pos, ent.mins, ent.maxs, p3, &ent, MASK_PLAYERSOLID, false, "GravPath::ClosestPointOnPath 3" ); + bestdist = dist; + bestpoint = p3; + *speed = (e->Speed() * t) + (s->Speed() * (1.0f - t)); + *radius = (e->Radius() * t) + (s->Radius() * (1.0f - t)); + } + } + + s = e; + } + *ret_dist = bestdist; + return bestpoint; + } + +float GravPath::DistanceAlongPath + ( + Vector pos, + float *speed + ) + + { + GravPathNode *s; + GravPathNode *e; + int num; + int i; + float bestdist; + float dist; + float segmentlength; + Vector delta; + Vector segment; + Vector p1; + Vector p2; + Vector p3; + float t; + float pathdist; + float bestdistalongpath; + float oosl; + pathdist = 0; + + num = NumNodes(); + s = GetNode( 1 ); + delta = s->origin - pos; + bestdist = delta.length(); + bestdistalongpath = 0; + *speed = s->Speed(); + + for( i = 2; i <= num; i++ ) + { + e = GetNode( i ); + + segment = e->origin - s->origin; + segmentlength = segment.length(); + + // check if we're closest to the endpoint + delta = e->origin - pos; + dist = delta.length(); + + if ( dist < bestdist ) + { + bestdist = dist; + bestdistalongpath = pathdist + segmentlength; + *speed = e->Speed(); + } + + // check if we're closest to the segment + oosl = ( 1 / segmentlength ); + p1 = segment * oosl; + p1.normalize(); + p2 = pos - s->origin; + + t = p1 * p2; + if ( ( t > 0 ) && ( t < segmentlength ) ) + { + p3 = ( p1 * t ) + s->origin; + + delta = p3 - pos; + dist = delta.length(); + if ( dist < bestdist ) + { + bestdist = dist; + bestdistalongpath = pathdist + t; + + t *= oosl; + *speed = (e->Speed() * t) + (s->Speed() * (1.0f - t)); + } + } + + s = e; + pathdist += segmentlength; + } + + return bestdistalongpath; + } + +Vector GravPath::PointAtDistance + ( + Vector pos, + float dist, + qboolean is_player, + float *max_speed + ) + + { + GravPathNode *s; + GravPathNode *e; + int num; + int i; + Vector delta; + Vector p1; + float t; + float pathdist; + float segmentlength; + + num = NumNodes(); + s = GetNode( 1 ); + pathdist = 0; + + for( i = 2; i <= num; i++ ) + { + e = GetNode( i ); + + delta = e->origin - s->origin; + segmentlength = delta.length(); + + if ( ( pathdist + segmentlength ) > dist ) + { + t = dist - pathdist; + + p1 = delta * ( t / segmentlength ); +// return p1 + s->origin; + + if ( e->spawnflags & PULL_UPWARDS && is_player ) + p1.z = p1.length() / 2; + + *max_speed = e->MaxSpeed(); + + return p1 + pos; + } + + s = e; + pathdist += segmentlength; + } + + *max_speed = s->MaxSpeed(); + + // cap it off at start or end of path + return s->origin; + } + +void GravPath::DrawPath + ( + float r, + float g, + float b + ) + + { + Vector s; + Vector e; + Vector offset; + GravPathNode *node; + int num; + int i; + + num = NumNodes(); + node = GetNode( 1 ); + s = node->origin; + G_DebugBBox( s, Vector(8,8,8), Vector(-8,-8,-8), 0,1,0,1 ); + offset = Vector( r, g, b ) * 4 + Vector( 0, 0, 0 ); + offset = Vector(0, 0, 0); + + for( i = 2; i <= num; i++ ) + { + node = GetNode( i ); + e = node->origin; + + G_DebugLine( s + offset, e + offset, r, g, b, 1 ); + G_DebugBBox( e, Vector(8,8,8), Vector(-8,-8,-8), 0,1,0,1 ); + s = e; + } + + G_DebugBBox(origin,mins-origin,maxs-origin,1,0,0,1); + } + +int GravPath::NumNodes + ( + void + ) + + { + return pathlist.NumObjects(); + } + +float GravPath::Length + ( + void + ) + + { + return pathlength; + } diff --git a/source/source/fgame/gravpath.h b/source/source/fgame/gravpath.h new file mode 100644 index 0000000..433cd33 --- /dev/null +++ b/source/source/fgame/gravpath.h @@ -0,0 +1,222 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/gravpath.h $ +// $Revision:: 7 $ +// $Author:: Steven $ +// $Date:: 7/21/00 8:36p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/gravpath.h $ +// +// 7 7/21/00 8:36p Steven +// Got gravpaths working fairly well. +// +// 6 7/06/00 12:58p Steven +// Changed gravpaths to pull you parallel to the path not towards it. +// +// 5 6/22/00 3:45p Markd +// fixed a bunch of saved game issues +// +// 4 5/26/00 7:44p Markd +// 2nd phase save games +// +// 3 5/24/00 3:14p Markd +// first phase of save/load games +// +// 2 10/26/99 5:28p Aldie +// Fix for gravpaths +// +// 1 9/10/99 10:54a Jimdose +// +// 1 9/08/99 3:16p Aldie +// +// DESCRIPTION: +// Gravity path - Used for underwater currents and wells. + +#ifndef __GRAVPATH_H__ +#define __GRAVPATH_H__ + +#include "g_local.h" +#include "class.h" +#include "container.h" + + +class GravPathNode : public Entity + { + private: + float speed; + float radius; + qboolean headnode; + float max_speed; + + public: + qboolean active; + + CLASS_PROTOTYPE(GravPathNode); + GravPathNode(); + void SetSpeed( Event *ev ); + void SetMaxSpeed( Event *ev ); + void SetRadius( Event *ev ); + void CreatePath( Event *ev ); + void Activate( Event *ev ); + void Deactivate( Event *ev ); + float Speed( void ); + float MaxSpeed( void ); + float Radius( void ) { return radius; }; + virtual void Archive( Archiver &arc ); + }; + +inline void GravPathNode::Archive + ( + Archiver &arc + ) + { + Entity::Archive( arc ); + + arc.ArchiveFloat( &speed ); + arc.ArchiveFloat( &radius ); + arc.ArchiveBoolean( &headnode ); + arc.ArchiveBoolean( &active ); + arc.ArchiveFloat( &max_speed ); + } + +typedef SafePtr GravPathNodePtr; + +class GravPath : public Listener + { + private: + Container pathlist; + float pathlength; + + GravPathNodePtr from; + GravPathNodePtr to; + int nextnode; + + public: + CLASS_PROTOTYPE( GravPath ); + + GravPath(); + ~GravPath(); + void Clear(void); + void Reset(void); + void AddNode(GravPathNode *node); + GravPathNode *GetNode(int num); + GravPathNode *NextNode(void); + Vector ClosestPointOnPath(Vector pos, Entity &ent,float *bestdist,float *speed,float *radius); + float DistanceAlongPath(Vector pos, float *speed); + Vector PointAtDistance( Vector pos, float dist, qboolean is_player, float *max_distance ); + void DrawPath(float r, float g, float b); + int NumNodes(void); + float Length(void); + GravPathNode *Start(void); + GravPathNode *End(void); + virtual void Archive( Archiver &arc ); + + Vector mins; + Vector maxs; + Vector origin; + qboolean force; + }; + +inline void GravPath::Archive + ( + Archiver &arc + ) + + { + GravPathNodePtr *tempPtr; + int i, num; + + Listener::Archive( arc ); + + if ( arc.Loading() ) + { + Reset(); + } + else + { + num = pathlist.NumObjects(); + } + arc.ArchiveInteger( &num ); + if ( arc.Loading() ) + { + pathlist.Resize( num ); + } + + for ( i = 1; i <= num; i++ ) + { + tempPtr = pathlist.AddressOfObjectAt( i ); + arc.ArchiveSafePointer( tempPtr ); + } + + arc.ArchiveFloat( &pathlength ); + arc.ArchiveSafePointer( &from ); + arc.ArchiveSafePointer( &to ); + arc.ArchiveInteger( &nextnode ); + arc.ArchiveVector( &mins ); + arc.ArchiveVector( &maxs ); + arc.ArchiveVector( &origin ); + arc.ArchiveBoolean( &force ); + } + +class GravPathManager : public Class + { + private: + Container pathList; + + public: + CLASS_PROTOTYPE( GravPathManager ); + ~GravPathManager(); + void Reset( void ); + void AddPath(GravPath *p); + void RemovePath(GravPath *p); + Vector CalculateGravityPull(Entity &ent, Vector position, qboolean *force, float *max_speed); + void DrawGravPaths( void ); + virtual void Archive( Archiver &arc ); + }; + +inline void GravPathManager::Archive + ( + Archiver &arc + ) + { + GravPath * ptr; + int i, num; + + Class::Archive( arc ); + + if ( arc.Saving() ) + { + num = pathList.NumObjects(); + } + else + { + Reset(); + } + arc.ArchiveInteger( &num ); + for ( i = 1; i <= num; i++ ) + { + if ( arc.Saving() ) + { + ptr = pathList.ObjectAt( i ); + } + else + { + ptr = new GravPath; + } + arc.ArchiveObject( ptr ); + if ( arc.Loading() ) + { + pathList.AddObject( ptr ); + } + } + } + +extern GravPathManager gravPathManager; + +#endif /* gravpath.h */ diff --git a/source/source/fgame/health.cpp b/source/source/fgame/health.cpp new file mode 100644 index 0000000..14c7339 --- /dev/null +++ b/source/source/fgame/health.cpp @@ -0,0 +1,393 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/health.cpp $ +// $Revision:: 22 $ +// $Author:: Steven $ +// $Date:: 7/23/00 7:22p $ +// +// Copyright (C) 1997 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/health.cpp $ +// +// 22 7/23/00 7:22p Steven +// Fixed a couple sounds. +// +// 21 7/22/00 8:35p Steven +// Fixed the health and water vial use sounds. +// +// 20 7/22/00 11:17a Steven +// Make health that falls from a healthplant give the same amount of health. +// +// 19 7/13/00 7:28p Steven +// Fixed some targetname stuff. +// +// 18 7/13/00 4:13p Steven +// Made fruit that is knocked off of the healthplants have a targetname = +// parent targetname + "_spawned". +// +// 17 7/13/00 12:30p Steven +// Made it so using a health item puts out fires on your body. +// +// 16 7/10/00 6:50p Markd +// fixed some issues with water running +// +// 15 7/10/00 5:09p Markd +// forgot to include player +// +// 14 7/10/00 5:07p Markd +// Added WaterInventoryItem +// +// 13 6/27/00 5:47p Steven +// Made it so player's health will not go above 100 and health items will not +// be picked up if player already has 100 health. +// +// 12 6/24/00 11:20a Steven +// Made health plants be able to be shot be any projectile. Everything but a +// sling just knocks it straight down. +// +// 11 6/05/00 11:48a Steven +// Fixed a crash in healthplant::touch. +// +// 10 5/25/00 9:59a Steven +// Made it so when a health vial is used a special effect surrounds player and +// made it so if no fall velocity is set for a health plant the fruit falls +// towards the player. +// +// 9 5/23/00 10:19a Steven +// Added healthplant. +// +// 8 4/12/00 10:01a Markd +// removed unused variables +// +// 7 4/11/00 5:31p Markd +// reworked pickup code +// +// 6 4/05/00 8:50p Markd +// got rid of damage skin support +// +// 5 4/04/00 3:28p Aldie +// Fix use code for health inventory item +// +// 4 3/13/00 5:18p Aldie +// Made some changes for usable inventory item stuff +// +// 3 1/26/00 3:33p Aldie +// Change Amount to getAmount. Added some 'listinventory' command. Added give +// all cheat to execute the script in global/giveall.txt +// +// 2 1/06/00 11:30p Jimdose +// removed unused health items +// +// 1 9/10/99 10:54a Jimdose +// +// 1 9/08/99 3:16p Aldie +// +// 6 8/28/99 2:41p Steven +// Took out some old references to def files. +// +// DESCRIPTION: +// Health powerup +// + +#include "g_local.h" +#include "item.h" +#include "inventoryitem.h" +#include "sentient.h" +#include "health.h" +#include "weaputils.h" +#include "player.h" + +CLASS_DECLARATION( InventoryItem, HealthInventoryItem, "" ) + { + { &EV_InventoryItem_Use, Use }, + { NULL, NULL } + }; + + +void HealthInventoryItem::Use + ( + Event *ev + ) + + { + Entity *other; + Sentient *sen; + Event *event; + str sound_name; + + + other = ev->GetEntity( 1 ); + if ( !other || !other->isSubclassOf( Sentient ) ) + { + return; + } + + sen = ( Sentient * )other; + sen->health += amount; + + if ( sen->health > sen->max_health ) + { + sen->health = sen->max_health; + } + + // If we are on fire stop it + + sen->ProcessEvent( EV_Sentient_StopOnFire ); + + // Spawn special effect around sentient + + sound_name = GetRandomAlias( "snd_use" ); + + if ( sound_name ) + other->Sound( sound_name.c_str(), 0 ); + + event = new Event( EV_AttachModel ); + event->AddString( "models/fx_tikifx2.tik" ); + event->AddString( "Bip01 Spine" ); + // set scale + event->AddFloat( 1 ); + // set targetname + event->AddString( "regen" ); + // set detach_at_death + event->AddInteger( 1 ); + // set remove_time + event->AddFloat( 2 ); + other->ProcessEvent( event ); + + PostEvent( EV_Remove, 0 ); + } + +CLASS_DECLARATION( InventoryItem, WaterInventoryItem, "" ) + { + { &EV_InventoryItem_Use, Use }, + { NULL, NULL } + }; + + +void WaterInventoryItem::Use + ( + Event *ev + ) + + { + Event *event; + Entity *other; + str sound_name; + + other = ev->GetEntity( 1 ); + if ( !other || !other->isSubclassOf( Player ) ) + { + return; + } + + sound_name = GetRandomAlias( "snd_use" ); + + if ( sound_name ) + other->Sound( sound_name.c_str(), 0 ); + + ( ( Player * )other )->SetWaterPower( amount ); + + event = new Event( EV_AttachModel ); + event->AddString( "models/fx_watervial.tik" ); + event->AddString( "Bip01 Spine" ); + // set scale + event->AddFloat( 1 ); + // set targetname + event->AddString( "regen" ); + // set detach_at_death + event->AddInteger( 1 ); + // set remove_time + event->AddFloat( 2 ); + other->ProcessEvent( event ); + + PostEvent( EV_Remove, 0 ); + } + + +CLASS_DECLARATION( Item, Health, "health_020" ) + { + { &EV_Item_Pickup, PickupHealth }, + { NULL, NULL } + }; + +Health::Health() + { + if ( DM_FLAG( DF_NO_HEALTH ) ) + { + PostEvent( EV_Remove, EV_REMOVE ); + return; + } + + setAmount( 20 ); + } + +void Health::PickupHealth + ( + Event *ev + ) + + { + Sentient *sen; + Entity *other; + + other = ev->GetEntity( 1 ); + if ( !other || !other->isSubclassOf( Sentient ) ) + { + return; + } + + sen = ( Sentient * )other; + + if ( sen->health >= sen->max_health ) + return; + + if ( !ItemPickup( other, qfalse ) ) + { + return; + } + + sen->health += amount; + + if ( sen->health > sen->max_health ) + { + sen->health = sen->max_health; + } + + // If we are on fire stop it + + sen->ProcessEvent( EV_Sentient_StopOnFire ); + } + +Event EV_HealthPlant_SetFallVelocity + ( + "fallvelocity", + EV_DEFAULT, + "v", + "fall_velocity", + "Sets the fall velocity for this health plant." + ); + +CLASS_DECLARATION( Health, HealthPlant, NULL ) + { + { &EV_Trigger_Effect, Touch }, + { &EV_HealthPlant_SetFallVelocity, SetFallVelocity }, + { NULL, NULL } + }; + +HealthPlant::HealthPlant() + { + respondto = (TRIGGER_PLAYERS | TRIGGER_PROJECTILES); + edict->s.eType = ET_MODELANIM; + } + +void HealthPlant::Touch + ( + Event *ev + ) + + { + Entity *other; + Event *e; + + if ( owner ) + { + // Don't respond to trigger events after item is picked up. + // we really don't need to see this. + //gi.DPrintf( "%s with targetname of %s was triggered unexpectedly.\n", getClassID(), TargetName() ); + return; + } + + other = ev->GetEntity( 1 ); + + if ( !other ) + return; + + if ( other->isSubclassOf( Projectile ) ) + { + Projectile *proj = (Projectile *)other; + + if ( proj->meansofdeath == MOD_SLING ) + Hit( proj->velocity, false ); + else + Hit( proj->velocity, true ); + } + else + { + e = new Event( EV_Item_Pickup ); + e->AddEntity( other ); + ProcessEvent( e ); + } + } + +void HealthPlant::SetFallVelocity + ( + Event *ev + ) + + { + fall_velocity = ev->GetVector( 1 ); + } + +void HealthPlant::Hit + ( + Vector velocity, + qboolean fall_straight_down + ) + + { + Health *health; + Vector orig; + + // Spawn in a health fruit + + health = new Health; + + health->setModel( "item_healthfruit1.tik" ); + + GetTag( "tag_healthfruit1", &orig ); + + health->setOrigin( orig ); + + health->ProcessPendingEvents(); + + health->PlaceItem(); + health->setOrigin( orig ); + + health->setAmount( amount ); + + // Make new health fruit have the same target name of the healthplant with "_spawned" on the end + + health->targetname = targetname; + health->targetname += "_spawned"; + + health->SetTargetName( health->targetname ); + + if ( fall_straight_down ) + { + health->velocity = vec_zero; + } + else if ( fall_velocity != vec_zero ) + { + health->velocity = fall_velocity; + } + else + { + health->velocity = velocity * -1; + health->velocity.z = 0; + health->velocity.normalize(); + health->velocity *= 150; + health->velocity.z = 200; + } + + setSolidType( SOLID_NOT ); + + RandomAnimate( "pickup", EV_Item_PickupDone ); + + if ( Respawnable() ) + PostEvent( EV_Item_Respawn, RespawnTime() ); + } + diff --git a/source/source/fgame/health.h b/source/source/fgame/health.h new file mode 100644 index 0000000..c789d60 --- /dev/null +++ b/source/source/fgame/health.h @@ -0,0 +1,110 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/health.h $ +// $Revision:: 10 $ +// $Author:: Markd $ +// $Date:: 7/10/00 5:09p $ +// +// Copyright (C) 1997 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/health.h $ +// +// 10 7/10/00 5:09p Markd +// Added waterInventoryItem +// +// 9 6/24/00 7:02p Steven +// Added fall_straight_down parm to hit in healthplant. +// +// 8 6/14/00 2:17p Markd +// fixed compiler warnings for Intel Compiler +// +// 7 5/26/00 7:44p Markd +// 2nd phase save games +// +// 6 5/25/00 10:01a Steven +// Added velociity to the hit proc. +// +// 5 5/24/00 3:14p Markd +// first phase of save/load games +// +// 4 5/23/00 10:19a Steven +// Added healthplant. +// +// 3 3/13/00 5:18p Aldie +// Made some changes for usable inventory item stuff +// +// 2 1/06/00 11:30p Jimdose +// removed unused health items +// +// 1 9/10/99 10:54a Jimdose +// +// 1 9/08/99 3:16p Aldie +// +// DESCRIPTION: +// Health powerup +// + +#ifndef __HEALTH_H__ +#define __HEALTH_H__ + +#include "g_local.h" +#include "item.h" +#include "sentient.h" +#include "item.h" + +class Health : public Item + { + public: + CLASS_PROTOTYPE( Health ); + + Health(); + virtual void PickupHealth( Event *ev ); + }; + +class HealthPlant : public Health + { + public: + Vector fall_velocity; + + CLASS_PROTOTYPE( HealthPlant ); + + HealthPlant(); + void Hit( Vector velocity, qboolean fall_straight_down ); + void SetFallVelocity( Event *ev ); + void Touch( Event *ev ); + virtual void Archive( Archiver &arc ); + }; + +inline void HealthPlant::Archive + ( + Archiver &arc + ) + { + Health::Archive( arc ); + + arc.ArchiveVector( &fall_velocity ); + } + +class HealthInventoryItem : public Item + { + public: + CLASS_PROTOTYPE( HealthInventoryItem ); + + void Use( Event *ev ); + + }; + +class WaterInventoryItem : public Item + { + public: + CLASS_PROTOTYPE( WaterInventoryItem ); + + void Use( Event *ev ); + + }; + +#endif /* health.h */ diff --git a/source/source/fgame/hornofconjuring.cpp b/source/source/fgame/hornofconjuring.cpp new file mode 100644 index 0000000..a614f9b --- /dev/null +++ b/source/source/fgame/hornofconjuring.cpp @@ -0,0 +1,84 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/hornofconjuring.cpp $ +// $Revision:: 4 $ +// $Author:: Markd $ +// $Date:: 6/14/00 2:17p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/hornofconjuring.cpp $ +// +// 4 6/14/00 2:17p Markd +// fixed compiler warnings for Intel Compiler +// +// 3 5/31/00 2:47p Aldie +// Added first vymish +// +// 2 5/30/00 7:33p Aldie +// First version +// +// DESCRIPTION: +// Horn of Conjuring Weapon + +#include "hornofconjuring.h" + +CLASS_DECLARATION( Weapon, HornOfConjuring, NULL ) + { + { NULL, NULL } + }; + +HornOfConjuring::HornOfConjuring + ( + ) + + { + } + +void HornOfConjuring::Shoot + ( + Event *ev + ) + + { + firemode_t mode = FIRE_PRIMARY; + Vector pos,forward,right,up; + + if ( ev->NumArgs() > 0 ) + { + mode = WeaponModeNameToNum( ev->GetString( 1 ) ); + + if ( mode == FIRE_ERROR ) + return; + } + + if ( !MuzzleClear() ) + { + RandomAnimate( "clear", NULL ); + weaponstate = WEAPON_READY; + return; + } + + GetMuzzlePosition( &pos, &forward, &right, &up ); + + ActorPtr actor; + actor = new Actor; + actor->setModel( "vymish_conjured.tik" ); + actor->setOrigin( pos ); + + m_creatureList.AddObject( actor ); + + if ( !quiet ) + { + if ( next_noise_time <= level.time ) + { + BroadcastSound(); + next_noise_time = level.time + 1; + } + } + } + diff --git a/source/source/fgame/hornofconjuring.h b/source/source/fgame/hornofconjuring.h new file mode 100644 index 0000000..47e9f2e --- /dev/null +++ b/source/source/fgame/hornofconjuring.h @@ -0,0 +1,46 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/hornofconjuring.h $ +// $Revision:: 3 $ +// $Author:: Aldie $ +// $Date:: 5/31/00 3:02p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/hornofconjuring.h $ +// +// 3 5/31/00 3:02p Aldie +// Added vymish +// +// 2 5/30/00 7:33p Aldie +// First version +// +// DESCRIPTION: +// Horn of Conjruing Weapon + +#ifndef __HORNOFCONJURING_H__ +#define __HORNOFCONJURING_H__ + +#include "weapon.h" +#include "weaputils.h" +#include "actor.h" + +typedef SafePtr ActorPtr; + +class HornOfConjuring : public Weapon + { + private: + Container m_creatureList; + + public: + CLASS_PROTOTYPE( HornOfConjuring ); + + HornOfConjuring(); + virtual void Shoot( Event *ev ); + }; + +#endif // __HORNOFCONJURING_H__ diff --git a/source/source/fgame/inventoryitem.cpp b/source/source/fgame/inventoryitem.cpp new file mode 100644 index 0000000..68d2ee9 --- /dev/null +++ b/source/source/fgame/inventoryitem.cpp @@ -0,0 +1,149 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/inventoryitem.cpp $ +// $Revision:: 7 $ +// $Author:: Steven $ +// $Date:: 7/01/00 7:02p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/inventoryitem.cpp $ +// +// 7 7/01/00 7:02p Steven +// Fixed the antisucknblaugh name so it would match the classname. +// +// 6 6/26/00 5:50p Markd +// re-did some renderfx commands, fixed anti-sb juice stuff +// +// 5 6/24/00 11:19a Steven +// Made the anti sucknblaugh juice item set its item name. +// +// 4 6/23/00 8:41p Markd +// made a lot of changes to different constructors for saved game support +// +// 3 6/14/00 3:50p Markd +// Cleaned up more Intel Compiler warnings +// +// 2 9/29/99 5:18p Steven +// Event formatting. +// +// 1 9/10/99 10:54a Jimdose +// +// 1 9/08/99 3:16p Aldie +// +// 6 9/01/99 8:17p Steven +// Fixed some typos. +// +// 5 8/27/99 5:06p Steven +// Added anit Sucknblaugh juice powerup. +// +// DESCRIPTION: +// Inventory items + +#include "inventoryitem.h" + +Event EV_InventoryItem_Use + ( + "useinvitem", + EV_DEFAULT, + NULL, + NULL, + "Use this inventory item." + ); + +CLASS_DECLARATION( Item, InventoryItem, NULL ) + { + { &EV_InventoryItem_Use, UseEvent }, + { NULL, NULL } + }; + +InventoryItem::InventoryItem + ( + ) + + { + if ( LoadingSavegame ) + { + return; + } + + // All powerups are inventory items + if ( DM_FLAG( DF_NO_POWERUPS ) ) + { + PostEvent( EV_Remove, EV_REMOVE ); + return; + } + } + +void InventoryItem::UseEvent + ( + Event *ev + ) + + { + } + +Event EV_AntiSBJuice_Wearoff + ( + "antiSBjuice_wearoff", + EV_DEFAULT, + NULL, + NULL, + "Is called when the effect wears off." + ); + +CLASS_DECLARATION( InventoryItem, AntiSBJuice, "AntiSBJuice" ) + { + { &EV_AntiSBJuice_Wearoff, Wearoff }, + { &EV_Use, UseEvent }, + { NULL, NULL } + }; + +AntiSBJuice::AntiSBJuice + ( + ) + + { + PostEvent( EV_Use, 0 ); + item_name = "AntiSBJuice"; + } + +void AntiSBJuice::UseEvent + ( + Event *ev + ) + { + if ( !owner ) + { + CancelPendingEvents(); + PostEvent( EV_Remove, 0 ); + return; + } + + owner->edict->s.eFlags |= EF_ANTISBJUICE; + + PostEvent( EV_AntiSBJuice_Wearoff, 30.0 ); + } + +void AntiSBJuice::Wearoff + ( + Event *ev + ) + + { + if ( !owner ) + { + CancelPendingEvents(); + PostEvent( EV_Remove, 0 ); + return; + } + + owner->edict->s.eFlags &= ~EF_ANTISBJUICE; + + CancelPendingEvents(); + PostEvent( EV_Remove, 0 ); + } diff --git a/source/source/fgame/inventoryitem.h b/source/source/fgame/inventoryitem.h new file mode 100644 index 0000000..f4ff842 --- /dev/null +++ b/source/source/fgame/inventoryitem.h @@ -0,0 +1,56 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/inventoryitem.h $ +// $Revision:: 2 $ +// $Author:: Markd $ +// $Date:: 6/14/00 3:50p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/inventoryitem.h $ +// +// 2 6/14/00 3:50p Markd +// Cleaned up more Intel Compiler warnings +// +// 1 9/10/99 10:54a Jimdose +// +// 1 9/08/99 3:16p Aldie +// +// 4 8/27/99 5:06p Steven +// Added anti Sucknblaugh juice powerup. +// +// DESCRIPTION: +// Items that are visible in the player's inventory + + +#ifndef __INVITEM_H__ +#define __INVITEM_H__ + +#include "item.h" + +class InventoryItem : public Item + { + public: + CLASS_PROTOTYPE( InventoryItem ); + + InventoryItem(); + virtual void UseEvent( Event *ev ); + }; + +extern Event EV_InventoryItem_Use; + +class AntiSBJuice : public InventoryItem + { + public: + CLASS_PROTOTYPE( AntiSBJuice ); + AntiSBJuice(); + void Wearoff( Event *ev ); + void UseEvent( Event *ev ); + }; + + +#endif /* inventoryitem.h */ diff --git a/source/source/fgame/ipfilter.cpp b/source/source/fgame/ipfilter.cpp new file mode 100644 index 0000000..05a0a60 --- /dev/null +++ b/source/source/fgame/ipfilter.cpp @@ -0,0 +1,356 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/ipfilter.cpp $ +// $Revision:: 2 $ +// $Date:: 1/06/00 11:10p $ +// +// Copyright (C) 1999 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/ipfilter.cpp $ +// +// 2 1/06/00 11:10p Jimdose +// cleaning up unused code +// +// DESCRIPTION: +// PACKET FILTERING +// +// You can add or remove addresses from the filter list with: +// +// addip +// removeip +// +// The ip address is specified in dot format, and any unspecified digits will match +// any value, so you can specify an entire class C network with "addip 192.246.40". +// +// Removeip will only remove an address specified exactly the same way. You cannot +// addip a subnet, then removeip a single host. +// +// listip +// Prints the current list of filters. +// +// writeip +// Dumps "addip " commands to listip.cfg so it can be execed at a later date. +// The filter lists are not saved and restored by default, because I beleive it would +// cause too much confusion. +// +// filterban <0 or 1> +// +// If 1 (the default), then ip addresses matching the current list will be prohibited +// from entering the game. This is the default setting. +// +// If 0, then only addresses matching the list will be allowed. This lets you easily +// set up a private game, or a game that only allows players from your local network. +// + +#include "ipfilter.h" +#include "g_local.h" + +typedef struct + { + unsigned mask; + unsigned compare; + } ipfilter_t; + +#define MAX_IPFILTERS 1024 + +ipfilter_t ipfilters[ MAX_IPFILTERS ]; +int numipfilters; + +/* +================= +StringToFilter +================= +*/ +static qboolean StringToFilter + ( + const char *s, + ipfilter_t *f + ) + + { + char num[ 128 ]; + int i; + int j; + byte b[ 4 ]; + byte m[ 4 ]; + + for( i = 0; i < 4; i++ ) + { + b[ i ] = 0; + m[ i ] = 0; + } + + for( i = 0; i < 4; i++ ) + { + if ( *s < '0' || *s > '9' ) + { + gi.SendServerCommand( NULL, "print \"Bad filter address: %s\n\"", s ); + return false; + } + + j = 0; + while( *s >= '0' && *s <= '9' ) + { + num[ j++ ] = *s++; + } + + num[ j ] = 0; + b[ i ] = atoi( num ); + if ( b[ i ] != 0 ) + { + m[ i ] = 255; + } + + if ( !*s ) + { + break; + } + + s++; + } + + f->mask = *( unsigned * )m; + f->compare = *( unsigned * )b; + + return true; + } + +/* +================= +SV_FilterPacket +================= +*/ +qboolean SV_FilterPacket + ( + const char *from + ) + + { + int i; + unsigned in; + byte m[ 4 ]; + const char *p; + + i = 0; + p = from; + while( *p && i < 4 ) + { + m[ i ] = 0; + while( *p >= '0' && *p <= '9' ) + { + m[ i ] = m[ i ] * 10 + ( *p - '0' ); + p++; + } + + if ( !*p || *p == ':' ) + { + break; + } + + i++; + p++; + } + + in = *( unsigned * )m; + for( i = 0; i < numipfilters; i++ ) + { + if ( ( in & ipfilters[ i ].mask ) == ipfilters[ i ].compare ) + { + return ( int )filterban->integer; + } + } + + return !( int )filterban->integer; + } + + +/* +================= +SV_AddIP_f +================= +*/ +void SVCmd_AddIP_f + ( + void + ) + + { + int i; + + if ( gi.argc() < 3 ) + { + gi.SendServerCommand( NULL, "print \"Usage: addip \n\"" ); + return; + } + + for( i = 0; i < numipfilters; i++ ) + { + if ( ipfilters[ i ].compare == 0xffffffff ) + { + // free spot + break; + } + } + + if ( i == numipfilters ) + { + if ( numipfilters == MAX_IPFILTERS ) + { + gi.SendServerCommand( NULL, "print \"IP filter list is full\n\"" ); + return; + } + numipfilters++; + } + + if ( !StringToFilter( gi.argv( 2 ), &ipfilters[ i ] ) ) + { + ipfilters[ i ].compare = 0xffffffff; + } + } + +/* +================= +SV_RemoveIP_f +================= +*/ +void SVCmd_RemoveIP_f + ( + void + ) + + { + ipfilter_t f; + int i; + int j; + + if ( gi.argc() < 3 ) + { + gi.SendServerCommand( NULL, "print \"Usage: sv removeip \n\"" ); + return; + } + + if ( !StringToFilter( gi.argv( 2 ), &f ) ) + { + return; + } + + for( i = 0; i < numipfilters; i++ ) + { + if ( ( ipfilters[ i ].mask == f.mask ) && ( ipfilters[ i ].compare == f.compare ) ) + { + for ( j = i + 1; j < numipfilters; j++ ) + { + ipfilters[ j - 1 ] = ipfilters[ j ]; + } + + numipfilters--; + gi.SendServerCommand( NULL, "print \"Removed.\n\"" ); + return; + } + } + + gi.SendServerCommand( NULL, "print \"Didn't find %s.\n\"", gi.argv( 2 ) ); + } + +/* +================= +SV_ListIP_f +================= +*/ +void SVCmd_ListIP_f + ( + void + ) + + { + int i; + byte b[ 4 ]; + + gi.SendServerCommand( NULL, "print \"Filter list:\n\"", gi.argv( 2 ) ); + for( i = 0; i < numipfilters; i++ ) + { + *( unsigned * )b = ipfilters[ i ].compare; + gi.SendServerCommand( NULL, "print \"%3i.%3i.%3i.%3i\n\"", b[ 0 ], b[ 1 ], b[ 2 ], b[ 3 ] ); + } + } + +/* +================= +SV_WriteIP_f +================= +*/ +void SVCmd_WriteIP_f + ( + void + ) + + { + FILE *f; + char name[ MAX_OSPATH ]; + byte b[ 4 ]; + int i; + + sprintf( name, "%s/listip.cfg", GAMEVERSION ); + gi.SendServerCommand( NULL, "print \"Writing %s.\n\"", name ); + + f = fopen( name, "wb" ); + if ( !f ) + { + gi.SendServerCommand( NULL, "print \"Couldn't open %s.\n\"", name ); + return; + } + + fprintf( f, "set filterban %d\n", ( int )filterban->integer ); + + for( i = 0; i < numipfilters; i++ ) + { + *( unsigned * )b = ipfilters[ i ].compare; + fprintf( f, "sv addip %i.%i.%i.%i\n", b[ 0 ], b[ 1 ], b[ 2 ], b[ 3 ] ); + } + + fclose( f ); + } + +/* +================= +G_ServerCommand + +G_ServerCommand will be called when an "sv" command is issued. +The game can issue gi.argc() / gi.argv() commands to get the rest +of the parameters +================= +*/ +void G_ServerCommand + ( + void + ) + + { + const char *cmd; + + cmd = gi.argv(1); + if ( Q_stricmp( cmd, "addip" ) == 0 ) + { + SVCmd_AddIP_f(); + } + else if ( Q_stricmp( cmd, "removeip" ) == 0 ) + { + SVCmd_RemoveIP_f(); + } + else if ( Q_stricmp( cmd, "listip" ) == 0 ) + { + SVCmd_ListIP_f(); + } + else if ( Q_stricmp( cmd, "writeip" ) == 0 ) + { + SVCmd_WriteIP_f(); + } + else + { + gi.SendServerCommand( NULL, "print \"Unknown server command %s.\n\"", cmd ); + } + } diff --git a/source/source/fgame/ipfilter.h b/source/source/fgame/ipfilter.h new file mode 100644 index 0000000..3139240 --- /dev/null +++ b/source/source/fgame/ipfilter.h @@ -0,0 +1,28 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/ipfilter.h $ +// $Revision:: 2 $ +// $Date:: 1/06/00 11:10p $ +// +// Copyright (C) 1999 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/ipfilter.h $ +// +// 2 1/06/00 11:10p Jimdose +// cleaning up unused code +// +// DESCRIPTION: +// + +#ifndef __IPFILTER_H__ +#define __IPFILTER_H__ + +#include "g_local.h" + +qboolean SV_FilterPacket( const char *from ); + +#endif /* !__IPFILTER_H__ */ diff --git a/source/source/fgame/item.cpp b/source/source/fgame/item.cpp new file mode 100644 index 0000000..0fcc32d --- /dev/null +++ b/source/source/fgame/item.cpp @@ -0,0 +1,1068 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/item.cpp $ +// $Revision:: 31 $ +// $Author:: Steven $ +// $Date:: 7/19/00 5:08p $ +// +// Copyright (C) 1997 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/item.cpp $ +// +// 31 7/19/00 5:08p Steven +// Added some caching stuff for cool item. +// +// 30 7/16/00 10:44a Steven +// Added has_been_looked_at stuff. +// +// 29 7/10/00 8:09p Markd +// fixed cool item pickup problems +// +// 28 7/04/00 6:45p Markd +// enhanced cool item features +// +// 27 7/04/00 2:25p Markd +// added cool cinematic for new objects +// +// 26 6/26/00 12:21p Steven +// Printing out better info on stuck warning. +// +// 25 6/23/00 8:41p Markd +// made a lot of changes to different constructors for saved game support +// +// 24 6/17/00 12:05p Steven +// Made it so the player would not look at items that have been picked up and +// not yet respawned. +// +// 23 6/03/00 5:23p Markd +// fixed bug in saved games, made items have playersolid as their default +// clipmask +// +// 22 6/01/00 3:18p Markd +// rewrote giveItem and item management in sentient +// +// 21 5/31/00 5:32p Steven +// Marked these as things for Julie to look at. +// +// 20 5/30/00 7:06p Markd +// saved games 4th pass +// +// 19 5/27/00 5:06p Steven +// Added a GetOwner function. +// +// 18 5/25/00 9:59a Steven +// Fixed some item name stuff. +// +// 17 5/20/00 5:14p Markd +// Added ITEM special effects +// +// 16 5/07/00 5:00p Markd +// fixed weapon pickup code +// +// 15 4/11/00 5:32p Markd +// reworked PickupItem code +// +// 14 4/06/00 12:14p Aldie +// Added a default name to Item +// +// 13 4/01/00 2:03p Markd +// overrode use of EV_SetAngle event from trigger +// +// 12 3/27/00 4:47p Markd +// added pickup_thread capability to all items +// +// 11 3/13/00 5:18p Aldie +// Made some changes for usable inventory item stuff +// +// 10 1/26/00 3:33p Aldie +// Change Amount to getAmount. Added some 'listinventory' command. Added give +// all cheat to execute the script in global/giveall.txt +// +// 9 1/15/00 3:57p Markd +// Eliminated multiple "angle" events and replaced them with EV_SetAngle +// +// 8 12/17/99 6:35p Jimdose +// changed spawnarg code +// added Level class for spawning and map control +// got rid of unused or superflous variables +// changed setjmp/longjmp calls to try/throw/catch exception handling +// +// 7 12/03/99 7:02p Aldie +// More ammo joy +// +// 6 12/02/99 6:53p Aldie +// Changed naming conventions from "both" to "dualhanded" Also put in the +// inventory renderer for the hud file +// +// 5 12/01/99 4:56p Markd +// fixed some reference versus pointer issues with RandomAnimate and NewAnim +// +// 4 9/29/99 7:43p Markd +// Made items behave better when dropping to floor +// +// 3 9/29/99 5:17p Steven +// Event formatting. +// +// 2 9/27/99 5:44p Markd +// began documentation and cleanup phase after merge +// +// 1 9/10/99 10:54a Jimdose +// +// 1 9/08/99 3:16p Aldie +// +// 15 9/02/99 6:44p Jimdose +// removed message when owned item is triggered +// +// 14 8/28/99 6:40p Steven +// Added more pickup animation and respawn animation stuff. +// +// 13 8/28/99 11:44a Steven +// Removed global from sound function calls. +// +// 12 8/27/99 5:07p Steven +// General item work. +// +// DESCRIPTION: +// Base class for respawnable, carryable objects. +// + +#include "g_local.h" +#include "entity.h" +#include "trigger.h" +#include "item.h" +#include "inventoryitem.h" +#include "scriptmaster.h" +#include "health.h" + +Event EV_Item_Pickup + ( + "item_pickup", + EV_DEFAULT, + "e", + "item", + "Pickup the specified item." + ); +Event EV_Item_DropToFloor + ( + "item_droptofloor", + EV_DEFAULT, + NULL, + NULL, + "Drops the item to the ground." + ); +Event EV_Item_Respawn + ( + "respawn", + EV_DEFAULT, + NULL, + NULL, + "Respawns the item." + ); +Event EV_Item_SetRespawn + ( + "set_respawn", + EV_DEFAULT, + "i", + "respawn", + "Turns respawn on or off." + ); +Event EV_Item_SetRespawnTime + ( + "set_respawn_time", + EV_DEFAULT, + "f", + "respawn_time", + "Sets the respawn time." + ); +Event EV_Item_SetAmount + ( + "amount", + EV_DEFAULT, + "i", + "amount", + "Sets the amount of the item." + ); +Event EV_Item_SetMaxAmount + ( + "maxamount", + EV_DEFAULT, + "i", + "max_amount", + "Sets the max amount of the item." + ); +Event EV_Item_SetItemName + ( + "name", + EV_DEFAULT, + "s", + "item_name", + "Sets the item name." + ); +Event EV_Item_RespawnSound + ( + "respawnsound", + EV_DEFAULT, + NULL, + NULL, + "Turns on the respawn sound for this item." + ); +Event EV_Item_DialogNeeded + ( + "dialogneeded", + EV_DEFAULT, + "s", + "dialog_needed", + "Sets the dialog needed string." + ); +Event EV_Item_NoRemove + ( + "no_remove", + EV_DEFAULT, + NULL, + NULL, + "Makes it so the item is not removed from the world when it is picked up." + ); +Event EV_Item_RespawnDone + ( + "respawn_done", + EV_DEFAULT, + NULL, + NULL, + "Called when the item respawn is done." + ); +Event EV_Item_PickupDone + ( + "pickup_done", + EV_DEFAULT, + NULL, + NULL, + "Called when the item pickup is done." + ); + +Event EV_Item_SetPickupThread + ( + "pickup_thread", + EV_DEFAULT, + "s", + "labelName", + "A thread that is called when an item is picked up." + ); + +Event EV_Item_CoolItem + ( + "coolitem", + EV_DEFAULT, + "SS", + "dialog anim_to_play", + "Specify that this is a cool item when we pick it up for the first time.\n" + "If dialog is specified, than the dialog will be played during the pickup.\n" + "If anim_to_play is specified, than the specified anim will be played after\n" + "the initial cinematic." + ); + +Event EV_Item_ForceCoolItem + ( + "forcecoolitem", + EV_DEFAULT, + "SS", + "dialog anim_to_play", + "Specify that this is a cool item when we pick it up regardless of whether or not we have it.\n" + "If dialog is specified, than the dialog will be played during the pickup.\n" + "If anim_to_play is specified, than the specified anim will be played after\n" + "the initial cinematic." + ); + +CLASS_DECLARATION( Trigger, Item, NULL ) + { + { &EV_Trigger_Effect, ItemTouch }, + { &EV_Item_DropToFloor, DropToFloor }, + { &EV_Item_Respawn, Respawn }, + { &EV_Item_SetAmount, SetAmountEvent }, + { &EV_Item_SetMaxAmount, SetMaxAmount }, + { &EV_Item_SetItemName, SetItemName }, + { &EV_Item_Pickup, Pickup }, + { &EV_Use, TriggerStuff }, + { &EV_Item_RespawnSound, RespawnSound }, + { &EV_Item_DialogNeeded, DialogNeeded }, + { &EV_Item_NoRemove, SetNoRemove }, + { &EV_Item_RespawnDone, RespawnDone }, + { &EV_Item_PickupDone, PickupDone }, + { &EV_Item_SetRespawn, setRespawn }, + { &EV_Item_SetRespawnTime, setRespawnTime }, + { &EV_Item_SetPickupThread, SetPickupThread }, + { &EV_Item_CoolItem, CoolItemEvent }, + { &EV_Item_ForceCoolItem, ForceCoolItemEvent }, + { &EV_Stop, Landed }, + { &EV_SetAngle, SetAngleEvent }, + { NULL, NULL } + }; + +Item::Item() + { + str fullname; + + if ( LoadingSavegame ) + { + return; + } + + setSolidType( SOLID_NOT ); + + // Set default respawn behavior + // Derived classes should use setRespawn + // if they want to override the default behavior + setRespawn( deathmatch->integer ? true : false ); + setRespawnTime( 20 ); + + // + // we want the bounds of this model auto-rotated + // + flags |= FL_ROTATEDBOUNDS; + + // + // set a minimum mins and maxs for the model + // + if ( size.length() < 10 ) + { + mins = "-10 -10 0"; + maxs = "10 10 20"; + } + + // + // reset the mins and maxs to pickup the FL_ROTATEDBOUNDS flag + // + setSize( mins, maxs ); + + if ( !LoadingSavegame ) + { + // Items can't be immediately dropped to floor, because they might + // be on an entity that hasn't spawned yet. + PostEvent( EV_Item_DropToFloor, EV_POSTSPAWN ); + } + + respondto = TRIGGER_PLAYERS; + + // items should collide with everything that the player does + edict->clipmask = MASK_PLAYERSOLID; + + item_index = 0; + maximum_amount = 1; + playrespawn = false; + + // this is an item entity + edict->s.eType = ET_ITEM; + + amount = 1; + no_remove = false; + setName( "Unknown Item" ); + + look_at_me = true; + coolitem = qfalse; + coolitemforced = qfalse; + + has_been_looked_at = false; + } + +Item::~Item() + { + if ( owner ) + { + owner->RemoveItem( this ); + owner = NULL; + } + } + +void Item::SetNoRemove + ( + Event *ev + ) + { + no_remove = true; + } + +/* +============ +PlaceItem + +Puts an item back in the world +============ +*/ +void Item::PlaceItem + ( + void + ) + + { + setSolidType( SOLID_TRIGGER ); + setMoveType( MOVETYPE_TOSS ); + showModel(); + + groundentity = NULL; + } + +/* +============ +DropToFloor + +plants the object on the floor +============ +*/ +void Item::DropToFloor + ( + Event *ev + ) + + { + str fullname; + Vector save; + + PlaceItem(); + + addOrigin( "0 0 1" ); + + save = origin; + if ( !droptofloor( 8192 ) ) + { + gi.DPrintf( "%s (%d) stuck in world at '%5.1f %5.1f %5.1f'\n", + getClassID(), entnum, origin.x, origin.y, origin.z ); + setOrigin( save ); + setMoveType( MOVETYPE_NONE ); + } + else + { + setMoveType( MOVETYPE_NONE ); + } + // + // if the our global variable doesn't exist, lets zero it out + // + fullname = str( "playeritem_" ) + getName(); + if ( !gameVars.VariableExists( fullname.c_str() ) ) + { + gameVars.SetVariable( fullname.c_str(), 0 ); + } + + if ( !levelVars.VariableExists( fullname.c_str() ) ) + { + levelVars.SetVariable( fullname.c_str(), 0 ); + } + + } + +qboolean Item::Drop + ( + void + ) + + { + if ( !owner ) + { + return false; + } + + setOrigin( owner->origin + "0 0 40" ); + + // drop the item + PlaceItem(); + velocity = owner->velocity * 0.5 + Vector( G_CRandom( 50 ), G_CRandom( 50 ), 100 ); + setAngles( owner->angles ); + avelocity = Vector( 0, G_CRandom( 360 ), 0 ); + + trigger_time = level.time + 1; + + if ( owner->isClient() ) + { + spawnflags |= DROPPED_PLAYER_ITEM; + } + else + { + spawnflags |= DROPPED_ITEM; + } + + // Remove this from the owner's item list + owner->RemoveItem( this ); + owner = NULL; + + return true; + } + + +void Item::ItemTouch + ( + Event *ev + ) + + { + Entity *other; + Event *e; + + if ( owner ) + { + // Don't respond to trigger events after item is picked up. + // we really don't need to see this. + //gi.DPrintf( "%s with targetname of %s was triggered unexpectedly.\n", getClassID(), TargetName() ); + return; + } + + other = ev->GetEntity( 1 ); + + e = new Event( EV_Item_Pickup ); + e->AddEntity( other ); + ProcessEvent( e ); + } + +void Item::SetOwner + ( + Sentient *ent + ) + + { + assert( ent ); + if ( !ent ) + { + // return to avoid any buggy behaviour + return; + } + + owner = ent; + setRespawn( false ); + + setSolidType( SOLID_NOT ); + hideModel(); + CancelEventsOfType( EV_Touch ); + CancelEventsOfType( EV_Item_DropToFloor ); + CancelEventsOfType( EV_Remove ); +// ItemPickup( ent ); + } + +Sentient *Item::GetOwner + ( + void + ) + + { + return owner; + } + +Item * Item::ItemPickup + ( + Entity *other, + qboolean add_to_inventory + ) + + { + Sentient * sent; + Item * item = NULL; + str realname; + + if ( !Pickupable( other ) ) + { + return NULL; + } + + sent = ( Sentient * )other; + + if ( add_to_inventory ) + { + item = sent->giveItem( model, getAmount() ); + + if ( !item ) + return NULL; + } + else + { + item = this; + } + + // + // make sure to copy over the coolness factor :) + // + item->coolitem = coolitem; + item->cool_dialog = cool_dialog; + item->cool_anim = cool_anim; + item->coolitemforced = coolitemforced; + + // + // let our sent know they received it + // we put this here so we can transfer information from the original item we picked up + // + sent->ReceivedItem( item ); + + realname = GetRandomAlias( "snd_pickup" ); + if ( realname.length() > 1 ) + sent->Sound( realname, CHAN_ITEM ); + + if ( !Removable() ) + { + // leave the item for others to pickup + return item; + } + + look_at_me = false; + + CancelEventsOfType( EV_Item_DropToFloor ); + CancelEventsOfType( EV_Item_Respawn ); + CancelEventsOfType( EV_FadeOut ); + + setSolidType( SOLID_NOT ); + + if ( HasAnim( "pickup" ) ) + RandomAnimate( "pickup", EV_Item_PickupDone ); + else + { + if ( !no_remove ) + { + hideModel(); + + if ( !Respawnable() ) + PostEvent( EV_Remove, FRAMETIME ); + } + } + + if ( Respawnable() ) + PostEvent( EV_Item_Respawn, RespawnTime() ); + + // fire off any pickup_thread's + if ( pickup_thread.length() ) + { + ExecuteThread( pickup_thread ); + } + + + if ( item && DM_FLAG( DF_INSTANT_ITEMS ) ) + { + Event *ev; + + ev = new Event( EV_InventoryItem_Use ); + ev->AddEntity( other ); + + item->ProcessEvent( ev ); + } + + return item; + } + +void Item::Respawn + ( + Event *ev + ) + + { + showModel(); + + // allow it to be touched again + setSolidType( SOLID_TRIGGER ); + + // play respawn sound + if ( playrespawn ) + { + Sound( "snd_itemspawn" ); + } + + setOrigin(); + + if ( HasAnim( "respawn" ) ) + RandomAnimate( "respawn", EV_Item_RespawnDone ); + + look_at_me = true; + has_been_looked_at = false; + } + +void Item::setRespawn + ( + Event *ev + ) + + { + if ( ev->NumArgs() < 1 ) + return; + + setRespawn( ev->GetInteger( 1 ) ); + } + +void Item::setRespawnTime + ( + Event *ev + ) + + { + if ( ev->NumArgs() < 1 ) + return; + + setRespawnTime( ev->GetFloat( 1 ) ); + } + +void Item::RespawnDone + ( + Event *ev + ) + + { + RandomAnimate( "idle" ); + } + +void Item::PickupDone + ( + Event *ev + ) + + { + if ( !no_remove ) + { + hideModel(); + + if ( !Respawnable() ) + PostEvent( EV_Remove, FRAMETIME ); + } + else + { + if ( HasAnim( "pickup_idle" ) ) + RandomAnimate( "pickup_idle" ); + else + RandomAnimate( "pickup" ); + } + } + +void Item::setRespawn + ( + qboolean flag + ) + + { + respawnable = flag; + } + +qboolean Item::Respawnable + ( + void + ) + + { + return respawnable; + } + +void Item::setRespawnTime + ( + float time + ) + + { + respawntime = time; + } + +float Item::RespawnTime + ( + void + ) + + { + return respawntime; + } + +int Item::getAmount + ( + void + ) + + { + return amount; + } + +int Item::MaxAmount + ( + void + ) + + { + return maximum_amount; + } + +qboolean Item::Pickupable + ( + Entity *other + ) + + { + if ( !other->isSubclassOf( Sentient ) ) + { + return false; + } + else + { + Sentient * sent; + Item * item; + + sent = ( Sentient * )other; + + item = sent->FindItem( getName() ); + + if ( item && ( item->getAmount() >= item->MaxAmount() ) ) + { + return false; + } + + // If deathmatch and already in a powerup, don't pickup anymore when DF_INSTANT_ITEMS is on + if ( DM_FLAG( DF_INSTANT_ITEMS ) && + this->isSubclassOf( InventoryItem ) && + sent->PowerupActive() + ) + { + return false; + } + } + return true; + } + +void Item::Pickup + ( + Event * ev + ) + + { + ItemPickup( ev->GetEntity( 1 ) ); + } + +void Item::setName + ( + const char *i + ) + + { + item_name = i; + item_index = gi.itemindex( i ); + strcpy( edict->entname, i ); + } + +str Item::getName + ( + void + ) + + { + return( item_name ); + } + +int Item::getIndex + ( + void + ) + + { + return item_index; + } + +void Item::setAmount + ( + int startamount + ) + + { + amount = startamount; + if ( amount >= MaxAmount() ) + { + SetMax( amount ); + } + } + +void Item::SetMax + ( + int maxamount + ) + + { + maximum_amount = maxamount; + } + +void Item::SetAmountEvent + ( + Event *ev + ) + + { + setAmount( ev->GetInteger( 1 ) ); + } + +void Item::SetMaxAmount + ( + Event *ev + ) + + { + SetMax( ev->GetInteger( 1 ) ); + } + +void Item::SetItemName + ( + Event *ev + ) + + { + setName( ev->GetString( 1 ) ); + } + +void Item::Add + ( + int num + ) + + { + amount += num; + if ( amount >= MaxAmount() ) + amount = MaxAmount(); + } + +void Item::Remove + ( + int num + ) + { + amount -= num; + if (amount < 0) + amount = 0; + } + + +qboolean Item::Use + ( + int num + ) + + { + if ( num > amount ) + { + return false; + } + + amount -= num; + return true; + } + +qboolean Item::Removable + ( + void + ) + + { + return true; + } + +void Item::RespawnSound + ( + Event *ev + ) + + { + playrespawn = true; + } + +void Item::DialogNeeded + ( + Event *ev + ) + + { + // + // if this item is needed for a trigger, play this dialog + // + dialog_needed = ev->GetString( 1 ); + } + +str Item::GetDialogNeeded + ( + void + ) + + { + return dialog_needed; + } + +// +// once item has landed on the floor, go to movetype none +// +void Item::Landed + ( + Event *ev + ) + { + if ( groundentity && ( groundentity->entity != world ) ) + { + warning( "Item::Landed", "Item %d has landed on an entity that might move\n", entnum ); + } + setMoveType( MOVETYPE_NONE ); + } + +void Item::SetPickupThread + ( + Event *ev + ) + + { + pickup_thread = ev->GetString( 1 ); + } + +void Item::SetCoolItem + ( + qboolean cool, + str &dialog, + str &anim + ) + { + coolitem = cool; + cool_dialog = dialog; + if ( cool_dialog.length() ) + { + CacheResource( cool_dialog, this ); + } + + CacheResource( "models/fx_coolitem.tik", this ); + CacheResource( "models/fx_coolitem_reverse.tik", this ); + + cool_anim = anim; + } + +void Item::CoolItemEvent + ( + Event *ev + ) + + { + qboolean cool; + str dialog, anim; + + cool = qtrue; + if ( ev->NumArgs() > 0 ) + { + dialog = ev->GetString( 1 ); + } + if ( ev->NumArgs() > 1 ) + { + anim = ev->GetString( 2 ); + } + SetCoolItem( cool, dialog, anim ); + } + +void Item::ForceCoolItemEvent + ( + Event *ev + ) + + { + coolitemforced = qtrue; + CoolItemEvent( ev ); + } + +qboolean Item::IsItemCool + ( + str * dialog, + str * anim, + qboolean * forced + ) + { + *dialog = cool_dialog; + *anim = cool_anim; + *forced = coolitemforced; + return coolitem; + } diff --git a/source/source/fgame/item.h b/source/source/fgame/item.h new file mode 100644 index 0000000..e637a48 --- /dev/null +++ b/source/source/fgame/item.h @@ -0,0 +1,217 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/item.h $ +// $Revision:: 20 $ +// $Author:: Steven $ +// $Date:: 7/16/00 10:46a $ +// +// Copyright (C) 1997 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/item.h $ +// +// 20 7/16/00 10:46a Steven +// Added has_been_looked_at stuff. +// +// 19 7/10/00 8:09p Markd +// fixed cool item pickup problems +// +// 18 7/04/00 6:45p Markd +// enhanced cool item features +// +// 17 7/04/00 2:25p Markd +// added cool cinematic for new objects +// +// 16 6/14/00 2:17p Markd +// fixed compiler warnings for Intel Compiler +// +// 15 6/01/00 3:18p Markd +// rewrote giveItem and item management in sentient +// +// 14 5/30/00 7:06p Markd +// saved games 4th pass +// +// 13 5/27/00 5:06p Steven +// Added a GetOwner function. +// +// 12 5/26/00 7:44p Markd +// 2nd phase save games +// +// 11 5/24/00 3:14p Markd +// first phase of save/load games +// +// 10 5/23/00 10:19a Steven +// Made EV_Item_PickupDone visible externally. +// +// 9 4/11/00 5:32p Markd +// reworked PickupItem code +// +// 8 3/27/00 4:47p Markd +// added pickup_thread capability to all items +// +// 7 3/13/00 5:18p Aldie +// Made some changes for usable inventory item stuff +// +// 6 1/26/00 3:33p Aldie +// Change Amount to getAmount. Added some 'listinventory' command. Added give +// all cheat to execute the script in global/giveall.txt +// +// 5 1/15/00 3:57p Markd +// Eliminated multiple "angle" events and replaced them with EV_SetAngle +// +// 4 12/17/99 6:35p Jimdose +// changed spawnarg code +// added Level class for spawning and map control +// got rid of unused or superflous variables +// changed setjmp/longjmp calls to try/throw/catch exception handling +// +// 3 12/02/99 6:53p Aldie +// Changed naming conventions from "both" to "dualhanded" Also put in the +// inventory renderer for the hud file +// +// 2 9/29/99 7:43p Markd +// Made items behave better when dropping to floor +// +// 1 9/10/99 10:54a Jimdose +// +// 1 9/08/99 3:16p Aldie +// +// 5 8/27/99 5:07p Steven +// General item work. +// +// DESCRIPTION: +// Base class for respawnable, carryable objects. +// + +#ifndef __ITEM_H__ +#define __ITEM_H__ + +#include "g_local.h" +#include "entity.h" +#include "trigger.h" +#include "sentient.h" + +extern Event EV_Item_Pickup; +extern Event EV_Item_DropToFloor; +extern Event EV_Item_Respawn; +extern Event EV_Item_SetAmount; +extern Event EV_Item_SetMaxAmount; +extern Event EV_Item_RespawnSound; +extern Event EV_Item_DialogNeeded; +extern Event EV_Item_PickupDone; + +#define DROPPED_ITEM 0x00008000 +#define DROPPED_PLAYER_ITEM 0x00010000 + +class Item : public Trigger + { + protected: + SentientPtr owner; + qboolean respawnable; + qboolean playrespawn; + qboolean coolitem; + qboolean coolitemforced; + str cool_dialog; + str cool_anim; + float respawntime; + str dialog_needed; + int item_index; + str item_name; + int maximum_amount; + int amount; + str pickup_thread; + + qboolean no_remove; + + void ItemTouch( Event *ev ); + + public: + + qboolean has_been_looked_at; + + CLASS_PROTOTYPE( Item ); + + Item(); + ~Item(); + virtual void PlaceItem( void ); + virtual void SetOwner( Sentient *ent ); + virtual Sentient* GetOwner( void ); + void SetNoRemove( Event *ev ); + virtual void DropToFloor( Event *ev ); + virtual Item *ItemPickup( Entity *other, qboolean add_to_inventory = qtrue ); + virtual void Respawn( Event *ev ); + virtual void setRespawn( qboolean flag ); + void setRespawn( Event *ev ); + virtual qboolean Respawnable( void ); + virtual void setRespawnTime( float time ); + void setRespawnTime( Event *ev ); + virtual float RespawnTime( void ); + void RespawnDone( Event *ev ); + void PickupDone( Event *ev ); + virtual int GetItemIndex( void ) { return item_index; }; + virtual int getAmount( void ); + virtual void setAmount( int startamount ); + + virtual int MaxAmount( void ); + virtual qboolean Pickupable( Entity *other ); + + virtual void setName( const char *i ); + virtual str getName( void ); + virtual int getIndex( void ); + virtual void SetAmountEvent( Event *ev ); + virtual void SetMaxAmount( Event *ev ); + virtual void SetItemName( Event *ev ); + virtual void SetPickupThread( Event *ev ); + + virtual void SetMax( int maxamount ); + virtual void Add( int num ); + virtual void Remove( int num ); + virtual qboolean Use( int amount ); + virtual qboolean Removable( void ); + virtual void Pickup( Event *ev ); + virtual qboolean Drop( void ); + virtual void RespawnSound( Event *ev ); + virtual void DialogNeeded( Event *ev ); + virtual str GetDialogNeeded( void ); + void Landed( Event *ev ); + void CoolItemEvent( Event *ev ); + void ForceCoolItemEvent( Event *ev ); + qboolean IsItemCool( str * dialog, str * anim, qboolean *force ); + void SetCoolItem( qboolean cool, str &dialog, str &anim ); + virtual void Archive( Archiver &arc ); + }; + +inline void Item::Archive + ( + Archiver &arc + ) + { + Trigger::Archive( arc ); + + arc.ArchiveSafePointer( &owner ); + arc.ArchiveBoolean( &respawnable ); + arc.ArchiveBoolean( &playrespawn ); + arc.ArchiveBoolean( &coolitem ); + arc.ArchiveBoolean( &coolitemforced ); + arc.ArchiveString( &cool_dialog ); + arc.ArchiveString( &cool_anim ); + arc.ArchiveFloat( &respawntime ); + arc.ArchiveString( &dialog_needed ); + arc.ArchiveString( &item_name ); + if ( arc.Loading() ) + { + setName( item_name.c_str() ); + } + arc.ArchiveInteger( &maximum_amount ); + arc.ArchiveInteger( &amount ); + arc.ArchiveString( &pickup_thread ); + arc.ArchiveBoolean( &no_remove ); + + arc.ArchiveBoolean( &has_been_looked_at ); + } + + +#endif /* item.h */ diff --git a/source/source/fgame/level.cpp b/source/source/fgame/level.cpp new file mode 100644 index 0000000..81f202b --- /dev/null +++ b/source/source/fgame/level.cpp @@ -0,0 +1,1022 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/level.cpp $ +// $Revision:: 37 $ +// $Date:: 8/11/00 2:34p $ +// +// Copyright (C) 1999 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/level.cpp $ +// +// 37 8/11/00 2:34p Markd +// Added pre-release demo specific code +// +// 36 7/30/00 2:55p Markd +// initialized more variables on cleanup +// +// 35 7/28/00 6:57p Steven +// Added some player died stuff. +// +// 34 7/27/00 3:52p Aldie +// Changed over letterboxing and fades to the game code. They are sent over in +// player stats and fields now. +// +// 33 7/25/00 11:32p Aldie +// Made some changes to the memory system and fixed a memory allocation bug in +// Z_TagMalloc. Also changed a lot of classes to subclass from Class. +// +// 32 7/23/00 7:58p Steven +// Fixed some boss health stuff. +// +// 31 7/23/00 2:35p Markd +// added precache support +// +// 30 7/21/00 10:44p Aldie +// Added a carriage return to the restart command +// +// 29 7/21/00 2:32p Markd +// changed default value of detail +// +// 28 7/17/00 3:26p Aldie +// Fix for flashbangs, changed detail variable, and added forcetorsostate +// +// 27 7/16/00 11:09p Markd +// fixed potential va bugs +// +// 26 7/10/00 11:54p Markd +// added exit level code +// +// 25 7/07/00 6:34p Steven +// Added mission failed stuff. +// +// 24 7/04/00 2:25p Markd +// added cool cinematic for new objects +// +// 23 6/28/00 3:26p Steven +// Added level wide ai_on. +// +// 22 6/24/00 1:06p Steven +// Fixed some soundtrack problems. +// +// 21 6/23/00 8:41p Markd +// made a lot of changes to different constructors for saved game support +// +// 20 6/10/00 4:23p Markd +// rewrote map restarting and loading out of date save games +// +// 19 6/10/00 1:50p Steven +// Added statemap caching. +// +// 18 6/02/00 2:01p Markd +// Fixed client persistant data issues +// +// 17 5/29/00 1:16p Markd +// 3rd round of saved games +// +// 16 5/26/00 7:44p Markd +// 2nd phase save games +// +// 15 5/24/00 3:14p Markd +// first phase of save/load games +// +// 14 4/11/00 2:46p Markd +// Implemented Automatic camera support +// +// 13 3/21/00 5:05p Markd +// improved earthquakes a lot with a visual effect +// +// 12 2/29/00 5:51p Jimdose +// added alternate spawnpoint support +// +// 11 2/26/00 12:58p Jimdose +// added PlayerRestart +// +// 10 2/15/00 5:17p Aldie +// Increased eventlimit and also added a count to print out the number of +// entities spawned +// +// 9 2/04/00 11:18a Markd +// Fixed memory leak with AI_PathNodes +// +// 8 1/28/00 5:43p Markd +// Added script command to the game +// +// 7 1/19/00 5:15p Aldie +// Fix for fixedframetime +// +// 6 1/13/00 5:19p Jimdose +// removed clearsavegames +// +// 5 1/12/00 6:14p Jimdose +// added spawnflags to level +// +// 4 1/10/00 12:42p Markd +// fixed entity spawing at the beginng of a map +// +// 3 1/06/00 11:08p Jimdose +// cleaning up unused code +// +// 2 12/17/99 7:32p Markd +// made various warnings developer 2 instead of developer 1 +// +// 1 12/17/99 6:33p Jimdose +// +// DESCRIPTION: +// + +#include "level.h" +#include "scriptmaster.h" +#include "navigate.h" +#include "gravpath.h" +#include "g_spawn.h" +#include "player.h" +#include "characterstate.h" + +Level level; + +CLASS_DECLARATION( Class, Level, NULL ) + { + { NULL, NULL } + }; + +Level::Level() + { + Init(); + } + +void Level::Init + ( + void + ) + + { + spawn_entnum = -1; + + restart = qfalse;; + + framenum = 0; + time = 0; + frametime = 0; + + level_name = ""; + mapname = ""; + spawnpoint = ""; + nextmap = ""; + + playerfrozen = false; + intermissiontime = 0; + exitintermission = 0; + + next_edict = NULL; + + total_secrets = 0; + found_secrets = 0; + + memset( &impact_trace, 0, sizeof( impact_trace ) ); + + earthquake = 0; + + cinematic = false; + ai_on = true; + + mission_failed = false; + died_already = false; + near_exit = false; + + water_color = vec_zero; + lava_color = vec_zero; + water_alpha = lava_alpha = 0; + + saved_soundtrack = ""; + current_soundtrack = ""; + + consoleThread = NULL; + + // clear out automatic cameras + automatic_cameras.ClearObjectList(); + + // init level script variables + levelVars.ClearList(); + + m_fade_time_start = 0; + m_fade_time = -1; + m_fade_color = vec_zero; + m_fade_alpha = 0; + m_fade_style = additive; + m_fade_type = fadein; + m_letterbox_fraction = 0; + m_letterbox_time = -1; + m_letterbox_time_start = 0; + m_letterbox_dir = letterbox_out; + } + +void Level::CleanUp + ( + void + ) + + { + ClearCachedStatemaps(); + + PathManager.SavePaths(); + + assert( active_edicts.next ); + assert( active_edicts.next->prev == &active_edicts ); + assert( active_edicts.prev ); + assert( active_edicts.prev->next == &active_edicts ); + assert( free_edicts.next ); + assert( free_edicts.next->prev == &free_edicts ); + assert( free_edicts.prev ); + assert( free_edicts.prev->next == &free_edicts ); + + while( active_edicts.next != &active_edicts ) + { + assert( active_edicts.next != &free_edicts ); + assert( active_edicts.prev != &free_edicts ); + + assert( active_edicts.next ); + assert( active_edicts.next->prev == &active_edicts ); + assert( active_edicts.prev ); + assert( active_edicts.prev->next == &active_edicts ); + assert( free_edicts.next ); + assert( free_edicts.next->prev == &free_edicts ); + assert( free_edicts.prev ); + assert( free_edicts.prev->next == &free_edicts ); + + if ( active_edicts.next->entity ) + { + delete active_edicts.next->entity; + } + else + { + FreeEdict( active_edicts.next ); + } + } + earthquake = 0; + + cinematic = false; + ai_on = true; + + mission_failed = false; + died_already = false; + near_exit = false; + + globals.num_entities = game.maxclients + 1; + + // clear up all AI node information + AI_ResetNodes(); + + // Reset the gravity paths + gravPathManager.Reset(); + + if ( consoleThread ) + { + Director.KillThread( consoleThread->ThreadNum() ); + consoleThread = NULL; + } + + // close all the scripts + Director.CloseScript(); + + // invalidate player readiness + Director.PlayerNotReady(); + + // clear out automatic cameras + automatic_cameras.ClearObjectList(); + + // clear out level script variables + levelVars.ClearList(); + + // Clear out parm vars + parmVars.ClearList(); + + // initialize the game variables + // these get restored by the persistant data, so we can safely clear them here + gameVars.ClearList(); + + // clearout any waiting events + L_ClearEventList(); + + ResetEdicts(); + + // Reset the boss health cvar + + gi.cvar_set( "bosshealth", "0" ); + } + +/* +============== +ResetEdicts +============== +*/ +void Level::ResetEdicts + ( + void + ) + + { + int i; + + memset( g_entities, 0, game.maxentities * sizeof( g_entities[ 0 ] ) ); + + // Add all the edicts to the free list + LL_Reset( &free_edicts, next, prev ); + LL_Reset( &active_edicts, next, prev ); + for( i = 0; i < game.maxentities; i++ ) + { + LL_Add( &free_edicts, &g_entities[ i ], next, prev ); + } + + for( i = 0; i < game.maxclients; i++ ) + { + // set client fields on player ents + g_entities[ i ].client = game.clients + i; + + G_InitClientPersistant (&game.clients[i]); + } + + globals.num_entities = game.maxclients; + } + +/* +============== +Start + +Does all post-spawning setup. This is NOT called for savegames. +============== +*/ +void Level::Start + ( + void + ) + + { + ScriptThread *gamescript; + const char *scriptname; + + // initialize secrets + levelVars.SetVariable( "total_secrets", total_secrets ); + levelVars.SetVariable( "found_secrets", found_secrets ); + + FindTeams(); + + // call the precache scripts + Precache(); + + // + // create the console thread + // + consoleThread = Director.CreateThread( CONSOLE_SCRIPT ); + + // + // start executing the game script + // + scriptname = ScriptLib.GetGameScript(); + if ( scriptname && scriptname[ 0 ] ) + { + gamescript = Director.CreateThread( scriptname, LEVEL_SCRIPT ); + if ( gamescript ) + { + // start at the end of this frame + gamescript->Start( 0 ); + } + } + } + +qboolean Level::inhibitEntity + ( + int spawnflags + ) + + { + if ( !developer->integer && ( spawnflags & SPAWNFLAG_DEVELOPMENT ) ) + { + return qtrue; + } + + if ( !detail->integer && ( spawnflags & SPAWNFLAG_DETAIL ) ) + { + return qtrue; + } + + if ( deathmatch->integer ) + { + if ( spawnflags & SPAWNFLAG_NOT_DEATHMATCH ) + { + return qtrue; + } + + return qfalse; + } + + switch( skill->integer ) + { + case 0 : + return ( spawnflags & SPAWNFLAG_NOT_EASY ) != 0; + break; + + case 1 : + return ( spawnflags & SPAWNFLAG_NOT_MEDIUM ) != 0; + break; + + case 2 : + case 3 : + return ( spawnflags & SPAWNFLAG_NOT_HARD ); + break; + } + + return qfalse; + } + +void Level::setSkill + ( + int value + ) + + { + int skill_level; + + skill_level = floor( value ); + skill_level = bound( skill_level, 0, 3 ); + + gi.cvar_set( "skill", va( "%d", skill_level ) ); + + gameVars.SetVariable( "skill", skill_level ); + } + +void Level::setTime + ( + int levelTime, + int frameTime + ) + + { + inttime = levelTime; + fixedframetime = 1.0f / sv_fps->value; + time = ( ( float )levelTime / 1000.0f ); + frametime = ( ( float )frameTime / 1000.0f ); + } + +/* +============== +SpawnEntities + +Creates a server's entity / program execution context by +parsing textual entity definitions out of an ent file. +============== +*/ +void Level::SpawnEntities + ( + const char *themapname, + const char *entities, + int levelTime + ) + + { + int inhibit,count=0; + const char *value; + SpawnArgs args; + char *spawnpos; + + // Init the level variables + Init(); + + spawnpos = strchr( themapname, '$' ); + if ( spawnpos ) + { + mapname = str( themapname, 0, spawnpos - themapname ); + spawnpoint = spawnpos + 1; + } + else + { + mapname = themapname; + spawnpoint = ""; + } + + // set up time so functions still have valid times + setTime( levelTime, 1000 / 20 ); + + if ( !LoadingServer ) + { + // Get rid of anything left over from the last level + CleanUp(); + + // Set up for a new map + PathManager.Init( mapname ); + } + + setSkill( skill->integer ); + + // reset out count of the number of game traces + sv_numtraces = 0; + + // parse world + entities = args.Parse( entities ); + spawn_entnum = ENTITYNUM_WORLD; + args.Spawn(); + + // parse ents + inhibit = 0; + for( entities = args.Parse( entities ); entities != NULL; entities = args.Parse( entities ) ) + { + // remove things (except the world) from different skill levels or deathmatch + spawnflags = 0; + value = args.getArg( "spawnflags" ); + if ( value ) + { + spawnflags = atoi( value ); + if ( inhibitEntity( spawnflags ) ) + { + inhibit++; + continue; + } + } + + args.Spawn(); + count++; + } + + gi.DPrintf( "%i entities spawned\n", count ); + gi.DPrintf( "%i entities inhibited\n", inhibit ); + + // Process the spawn events + L_ProcessPendingEvents(); + + if ( !LoadingServer || game.autosaved ) + { + Start(); + } + + // + // if this is a single player game, spawn the single player in now + // this allows us to read persistant data into the player before the client + // is completely ready + // + if ( game.maxclients == 1 ) + { + spawn_entnum = 0; + new Player; + } + } + +void Level::NewMap + ( + const char *mapname, + const char *entities, + int levelTime + ) + + { + current_map = mapname; + current_entities = entities; + + SpawnEntities( current_map, current_entities, levelTime ); + } + +void Level::Restart + ( + void + ) + + { + SpawnEntities( current_map, current_entities, inttime ); + + L_ProcessPendingEvents(); + + G_ClientConnect( 0, qtrue ); + G_ClientBegin( &g_entities[ 0 ], NULL ); + } + +void Level::PlayerRestart + ( + void + ) + + { + // we need to restart through the server code + gi.SendConsoleCommand( "restart\n" ); + //restart = qtrue; + level.mission_failed = false; + } + +void Level::Archive + ( + Archiver &arc + ) + + { + Class::Archive( arc ); + + arc.ArchiveInteger( &framenum ); + arc.ArchiveInteger( &inttime ); + arc.ArchiveFloat( &time ); + arc.ArchiveFloat( &frametime ); + arc.ArchiveFloat( &fixedframetime ); + arc.ArchiveInteger( &startTime ); + + arc.ArchiveString( &level_name ); + arc.ArchiveString( &mapname ); + arc.ArchiveString( &spawnpoint ); + arc.ArchiveString( &nextmap ); + + arc.ArchiveBoolean( &restart ); + + arc.ArchiveBoolean( &playerfrozen ); + arc.ArchiveFloat( &intermissiontime ); + arc.ArchiveInteger( &exitintermission ); + + arc.ArchiveInteger( &total_secrets ); + arc.ArchiveInteger( &found_secrets ); + + arc.ArchiveFloat( &earthquake ); + arc.ArchiveFloat( &earthquake_magnitude ); + + arc.ArchiveBoolean( &cinematic ); + arc.ArchiveBoolean( &ai_on ); + + arc.ArchiveBoolean( &mission_failed ); + arc.ArchiveBoolean( &died_already ); + + arc.ArchiveVector( &water_color ); + arc.ArchiveVector( &lava_color ); + arc.ArchiveFloat( &water_alpha ); + arc.ArchiveFloat( &lava_alpha ); + + arc.ArchiveString( &saved_soundtrack ); + arc.ArchiveString( ¤t_soundtrack ); + + arc.ArchiveVector( &m_fade_color ); + arc.ArchiveFloat( &m_fade_alpha ); + arc.ArchiveFloat( &m_fade_time ); + arc.ArchiveFloat( & m_fade_time_start ); + arc.ArchiveInteger( (int *)&m_fade_style ); + arc.ArchiveInteger( (int *)&m_fade_type ); + + arc.ArchiveFloat( &m_letterbox_fraction ); + arc.ArchiveFloat( &m_letterbox_time ); + arc.ArchiveFloat( &m_letterbox_time_start ); + arc.ArchiveInteger( (int *)&m_letterbox_dir ); + + if ( arc.Loading() ) + { + str temp_soundtrack; + + // Change the sound track to the one just loaded + + temp_soundtrack = saved_soundtrack; + ChangeSoundtrack( current_soundtrack.c_str() ); + saved_soundtrack = temp_soundtrack; + + // + // create the console thread + // + consoleThread = Director.CreateThread( CONSOLE_SCRIPT ); + // not archived since we can't save mid-frame + next_edict = NULL; + // not archived since we can't save mid-frame + memset( &impact_trace, 0, sizeof( impact_trace ) ); + } + } + +/* +============== +Precache + +Calls precache scripts +============== +*/ +void Level::Precache + ( + void + ) + + { + str filename; + const char *scriptname; + int i; + + // + // load in global0-9.scr + // + for( i = 0; i < 100; i++ ) + { + filename = va( "global/global%i.scr", i ); + if ( !G_LoadAndExecScript( filename.c_str(), NULL, qtrue ) ) + { + break; + } + } + + // + // load in precache0-9.scr + // + if ( precache->integer ) + { + for( i = 0; i < 100; i++ ) + { +#ifdef PRE_RELEASE_DEMO + filename = va( "global/precache_demo%i.scr", i ); +#else + filename = va( "global/precache%i.scr", i ); +#endif + if ( !G_LoadAndExecScript( filename.c_str(), NULL, qtrue ) ) + { + break; + } + } + } + + // + // load in players0-9.scr + // + for( i = 0; i< 100; i++ ) + { + filename = va( "global/players%i.scr", i ); + if ( !G_LoadAndExecScript( filename.c_str(), NULL, qtrue ) ) + { + break; + } + } + + // + // load in universal_script.scr + // + G_LoadAndExecScript( "global/universal_script.scr", "precache:", qtrue ); + + // + // precache for the game script + // + scriptname = ScriptLib.GetGameScript(); + if ( scriptname && scriptname[ 0 ] ) + { + char stripped[ MAX_QPATH ]; + char precache_script[ MAX_QPATH ]; + + COM_StripExtension( scriptname, stripped ); + Com_sprintf( precache_script, sizeof( precache_script ), "%s_precache.scr", stripped ); + G_LoadAndExecScript( precache_script, "precache:" ); + + // also try to call the preache in the normal script itself + G_LoadAndExecScript( scriptname, "precache:", qtrue ); + } + } + +/* +================ +FindTeams + +Chain together all entities with a matching team field. + +All but the first will have the FL_TEAMSLAVE flag set. +All but the last will have the teamchain field set to the next one +================ +*/ +void Level::FindTeams + ( + void + ) + + { + gentity_t *e; + gentity_t *e2; + gentity_t *next; + gentity_t *next2; + Entity *chain; + Entity *ent; + Entity *ent2; + int c; + int c2; + + c = 0; + c2 = 0; + + for( e = active_edicts.next; e != &active_edicts; e = next ) + { + assert( e ); + assert( e->inuse ); + assert( e->entity ); + + next = e->next; + + ent = e->entity; + if ( !ent->moveteam.length() ) + { + continue; + } + + if ( ent->flags & FL_TEAMSLAVE ) + { + continue; + } + + chain = ent; + ent->teammaster = ent; + c++; + c2++; + for( e2 = next; e2 != &active_edicts; e2 = next2 ) + { + assert( e2 ); + assert( e2->inuse ); + assert( e2->entity ); + + next2 = e2->next; + + ent2 = e2->entity; + if ( !ent2->moveteam.length() ) + { + continue; + } + + if ( ent2->flags & FL_TEAMSLAVE ) + { + continue; + } + + if ( ent->moveteam == ent2->moveteam ) + { + c2++; + chain->teamchain = ent2; + ent2->teammaster = ent; + chain = ent2; + ent2->flags |= FL_TEAMSLAVE; + } + } + } + + gi.DPrintf( "%i teams with %i entities\n", c, c2 ); + } + +/* +================= +AllocEdict + +Either finds a free edict, or allocates a new one. +Try to avoid reusing an entity that was recently freed, because it +can cause the client to think the entity morphed into something else +instead of being removed and recreated, which can cause interpolated +angles and bad trails. +================= +*/ +gentity_t *Level::AllocEdict + ( + Entity *ent + ) + + { + int i; + gentity_t *edict; + + if ( spawn_entnum >= 0 ) + { + edict = &g_entities[ spawn_entnum ]; + spawn_entnum = -1; + + assert( !edict->inuse && !edict->entity ); + + // free up the entity pointer in case we took one that still exists + if ( edict->inuse && edict->entity ) + { + delete edict->entity; + } + } + else + { + edict = &g_entities[ maxclients->integer ]; + for ( i = maxclients->integer; i < globals.num_entities; i++, edict++ ) + { + // the first couple seconds of server time can involve a lot of + // freeing and allocating, so relax the replacement policy + if ( + !edict->inuse && + ( + ( edict->freetime < ( 2 + startTime ) ) || + ( time - edict->freetime > 0.5 ) + ) + ) + { + break; + } + } + + // allow two spots for none and world + if ( i == game.maxentities - 2 ) + { + gi.Error( ERR_DROP, "Level::AllocEdict: no free edicts" ); + } + } + + assert( edict->next ); + assert( edict->prev ); + LL_Remove( edict, next, prev ); + InitEdict( edict ); + assert( active_edicts.next ); + assert( active_edicts.prev ); + LL_Add( &active_edicts, edict, next, prev ); + assert( edict->next ); + assert( edict->prev ); + + assert( edict->next != &free_edicts ); + assert( edict->prev != &free_edicts ); + + // Tell the server about our data since we just spawned something + if ( ( edict->s.number < ENTITYNUM_WORLD ) && ( globals.num_entities <= edict->s.number ) ) + { + globals.num_entities = edict->s.number + 1; + gi.LocateGameData( g_entities, globals.num_entities, sizeof( gentity_t ), &game.clients[ 0 ].ps, sizeof( game.clients[ 0 ] ) ); + } + + edict->entity = ent; + + return edict; + } + +/* +================= +FreeEdict + +Marks the edict as free +================= +*/ +void Level::FreeEdict + ( + gentity_t *ed + ) + + { + gclient_t *client; + + assert( ed != &free_edicts ); + + // unlink from world + gi.unlinkentity ( ed ); + + assert( ed->next ); + assert( ed->prev ); + + if ( next_edict == ed ) + { + next_edict = ed->next; + } + + LL_Remove( ed, next, prev ); + + assert( ed->next == ed ); + assert( ed->prev == ed ); + assert( free_edicts.next ); + assert( free_edicts.prev ); + + client = ed->client; + memset( ed, 0, sizeof( *ed ) ); + ed->client = client; + ed->freetime = time; + ed->inuse = false; + ed->s.number = ed - g_entities; + + assert( free_edicts.next ); + assert( free_edicts.prev ); + + LL_Add( &free_edicts, ed, next, prev ); + + assert( ed->next ); + assert( ed->prev ); + } + +void Level::InitEdict + ( + gentity_t *e + ) + + { + int i; + + e->inuse = true; + e->s.number = e - g_entities; + + // make sure a default scale gets set + e->s.scale = 1.0f; + // make sure the default constantlight gets set, initalize to r 1.0, g 1.0, b 1.0, r 0 + e->s.constantLight = 0xffffff; + e->s.renderfx |= RF_FRAMELERP; + e->spawntime = time; + e->s.frame = 0; + + for( i = 0; i < NUM_BONE_CONTROLLERS; i++ ) + { + e->s.bone_tag[ i ] = -1; + VectorClear( e->s.bone_angles[ i ] ); + EulerToQuat( e->s.bone_angles[ i ], e->s.bone_quat[ i ] ); + } + } + +void Level::AddAutomaticCamera + ( + Camera *cam + ) + + { + automatic_cameras.AddUniqueObject( cam ); + } diff --git a/source/source/fgame/level.h b/source/source/fgame/level.h new file mode 100644 index 0000000..ae32b4e --- /dev/null +++ b/source/source/fgame/level.h @@ -0,0 +1,190 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/level.h $ +// $Revision:: 15 $ +// $Date:: 7/28/00 6:59p $ +// +// Copyright (C) 1999 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/level.h $ +// +// 15 7/28/00 6:59p Steven +// Added some player died stuff. +// +// 14 7/27/00 3:52p Aldie +// Changed over letterboxing and fades to the game code. They are sent over in +// player stats and fields now. +// +// 13 7/10/00 11:54p Markd +// added exit level code +// +// 12 7/07/00 6:35p Steven +// Added mission failed stuff. +// +// 11 6/28/00 3:27p Steven +// Added level wide ai_on. +// +// 10 5/24/00 3:14p Markd +// first phase of save/load games +// +// 9 4/11/00 2:46p Markd +// Implemented Automatic camera support +// +// 8 3/21/00 5:05p Markd +// improved earthquakes a lot with a visual effect +// +// 7 2/29/00 5:51p Jimdose +// added alternate spawnpoint support +// +// 6 2/26/00 12:58p Jimdose +// added PlayerRestart +// +// 5 1/28/00 5:43p Markd +// Added script command to the game +// +// 4 1/13/00 5:19p Jimdose +// removed clearsavegames +// +// 3 1/12/00 6:14p Jimdose +// added spawnflags to Level +// +// 2 1/06/00 11:08p Jimdose +// cleaning up unused code +// +// 1 12/17/99 6:33p Jimdose +// +// DESCRIPTION: +// + +#ifndef __LEVEL_H__ +#define __LEVEL_H__ + +#include "g_local.h" +#include "container.h" + +class ScriptThread; +class Camera; +// +// this structure is cleared as each map is entered +// it is read/written to the level.sav file for savegames +// +enum fadetype_t { fadein, fadeout }; +enum fadestyle_t { alphablend, additive }; +enum letterboxdir_t { letterbox_in, letterbox_out }; + +class Level : public Class + { + public: + const char *current_map; + const char *current_entities; + + int spawn_entnum; + int spawnflags; + + int framenum; + int inttime; // level time in millisecond integer form + float time; + float frametime; + float fixedframetime; // preset frame time based on sv_fps + int startTime; // level.time the map was started + + str level_name; // the descriptive name (Outer Base, etc) + str mapname; // the server name (base1, etc) + str spawnpoint; // targetname of spawnpoint + str nextmap; // go here when fraglimit is hit + + qboolean restart; // set true when game loop should restart + + // used for cinematics + qboolean playerfrozen; + + // intermission state + float intermissiontime; // time the intermission was started + int exitintermission; + + gentity_s *next_edict; // Used to keep track of the next edict to process in G_RunFrame + + int total_secrets; + int found_secrets; + + // FIXME - remove this later when it is passed in the event. + trace_t impact_trace; + + float earthquake; + float earthquake_magnitude; + + qboolean cinematic; + + qboolean ai_on; + + qboolean mission_failed; + qboolean died_already; + + qboolean near_exit; + + // Blending color for water, light volumes,lava + Vector water_color; + Vector lava_color; + float water_alpha; + float lava_alpha; + + str current_soundtrack; + str saved_soundtrack; + + ScriptThread *consoleThread; + + Vector m_fade_color; + float m_fade_alpha; + float m_fade_time; + float m_fade_time_start; + fadetype_t m_fade_type; + fadestyle_t m_fade_style; + + float m_letterbox_fraction; + float m_letterbox_time; + float m_letterbox_time_start; + letterboxdir_t m_letterbox_dir; + + // + // list of automatic_cameras on the level + // + Container automatic_cameras; + + + + CLASS_PROTOTYPE( Level ); + + Level(); + + void Init( void ); + void CleanUp( void ); + + void ResetEdicts( void ); + gentity_t *AllocEdict( Entity *ent ); + void FreeEdict( gentity_t *ed ); + void InitEdict( gentity_t *e ); + + void Start( void ); + void Restart( void ); + void PlayerRestart( void ); + void Precache( void ); + void FindTeams( void ); + + void SpawnEntities( const char *mapname, const char *entities, int levelTime ); + void NewMap( const char *mapname, const char *entities, int levelTime ); + + qboolean inhibitEntity( int spawnflags ); + void setSkill( int value ); + void setTime( int levelTime, int frameTime ); + void AddAutomaticCamera( Camera * cam ); + + virtual void Archive( Archiver &arc ); + }; + +extern Level level; + +#endif /* !__LEVEL_H__ */ diff --git a/source/source/fgame/light.cpp b/source/source/fgame/light.cpp new file mode 100644 index 0000000..da9fbc2 --- /dev/null +++ b/source/source/fgame/light.cpp @@ -0,0 +1,170 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/light.cpp $ +// $Revision:: 7 $ +// $Author:: Markd $ +// $Date:: 6/14/00 3:50p $ +// +// Copyright (C) 1997 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/light.cpp $ +// +// 7 6/14/00 3:50p Markd +// Cleaned up more Intel Compiler warnings +// +// 6 10/18/99 7:14p Markd +// Fixed fulcrum stuff +// +// 5 10/11/99 1:08p Markd +// Added angles and spot_angle support to lights +// +// 4 10/05/99 8:05p Markd +// Forgot to add light handling behavior +// +// 3 10/05/99 7:58p Markd +// Rewrote light documentation +// +// 2 9/29/99 5:18p Steven +// Event formatting. +// +// 1 9/10/99 10:54a Jimdose +// +// 1 9/08/99 3:16p Aldie +// +// 9 7/08/99 4:28p Markd +// Removed obsolete QUAKED functions +// +// 8 6/11/99 1:23p Phook +// +// 7 6/11/99 12:58p Phook +// Changed from SINED comments to QUAKED +// +// 6 6/11/99 12:46p Phook +// EClass color changes +// +// DESCRIPTION: +// Classes for creating and controlling lights. +// + +#include "g_local.h" +#include "entity.h" +#include "trigger.h" +#include "light.h" +#include "scriptmaster.h" + +/*****************************************************************************/ +/*QUAKED light (0.75 0.5 0) (-8 -8 -8) (8 8 8) LINEAR NO_ENTITIES ENTITY_TRACE + +Non-displayed light. If it targets another entity it will become a spot light +if "LINEAR" is set, it will be a linear light +if "NO_ENTITIES" is set, this light will only effect the world, not entities +if "ENTITY_TRACE" is set, a trace is done betwee the light and the entity.\ +The light is only added if the trace is clear + +"no_entity_light" - this light will not effect entities, just the world +"light" - the intensity of the light, default 300 +"color" - the color of the light +"falloff" - if linear, specify the linear falloff (defaults to 1) +"radius" - make this a spot light of the given radius +"angles" - make this a spot light centered on angles +"spot_angle" - if this is a spot light, what angle to use (default 45) +"entity_trace" - trace between the entity and the light + +******************************************************************************/ + +Event EV_Light_SetLight + ( + "light", + EV_DEFAULT, + NULL, + NULL, + "Set the intensity of the light" + ); + +Event EV_Light_SetColor + ( + "color", + EV_DEFAULT, + NULL, + NULL, + "" + ); + +Event EV_Light_SetFalloff + ( + "falloff", + EV_HIDE, + NULL, + NULL, + "" + ); + +Event EV_Light_SetRadius + ( + "falloff", + EV_HIDE, + NULL, + NULL, + "" + ); + +Event EV_Light_SpotDir + ( + "spot_dir", + EV_HIDE, + NULL, + NULL, + "" + ); + +Event EV_Light_SpotRadiusByDistance + ( + "spot_radiusbydistance", + EV_HIDE, + NULL, + NULL, + "" + ); + +Event EV_Light_NoEntityLight + ( + "no_entity_light", + EV_HIDE, + NULL, + NULL, + "" + ); + +Event EV_Light_EntityTrace + ( + "entity_trace", + EV_HIDE, + NULL, + NULL, + "" + ); + +Event EV_Light_SpotAngle + ( + "spot_angle", + EV_HIDE, + NULL, + NULL, + "" + ); + +CLASS_DECLARATION( Entity, Light, "light" ) + { + { &EV_Light_SetLight, NULL }, + { NULL, NULL } + }; + +Light::Light() + { + PostEvent( EV_Remove, 0 ); + } + diff --git a/source/source/fgame/light.h b/source/source/fgame/light.h new file mode 100644 index 0000000..94eacbd --- /dev/null +++ b/source/source/fgame/light.h @@ -0,0 +1,41 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/light.h $ +// $Revision:: 2 $ +// $Author:: Markd $ +// $Date:: 10/05/99 7:58p $ +// +// Copyright (C) 1997 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/light.h $ +// +// 2 10/05/99 7:58p Markd +// Rewrote light documentation +// +// 1 9/10/99 10:54a Jimdose +// +// 1 9/08/99 3:16p Aldie +// +// DESCRIPTION: +// Classes for creating and controlling lights. +// + +#ifndef __LIGHT_H__ +#define __LIGHT_H__ + +#include "g_local.h" +#include "entity.h" + +class Light : public Entity + { + public: + CLASS_PROTOTYPE( Light ); + + Light(); + }; + +#endif /* light.h */ diff --git a/source/source/fgame/linklist.h b/source/source/fgame/linklist.h new file mode 100644 index 0000000..dc46b5c --- /dev/null +++ b/source/source/fgame/linklist.h @@ -0,0 +1,129 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/Linklist.h $ +// $Revision:: 3 $ +// $Author:: Markd $ +// $Date:: 6/14/00 11:18a $ +// +// Copyright (C) 1997 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/Linklist.h $ +// +// 3 6/14/00 11:18a Markd +// cleaned up code using Intel compiler +// +// 2 10/05/99 2:03p Markd +// Added warning about files being in multiple projects +// +// 1 9/10/99 10:54a Jimdose +// +// 1 9/08/99 3:16p Aldie +// +// DESCRIPTION: +// +// WARNING: This file is shared between fgame, cgame and possibly the user interface. +// It is instanced in each one of these directories because of the way that SourceSafe works. +// + +#ifndef __linklist_h +#define __linklist_h +#ifdef __cplusplus +extern "C" { +#endif + + +#define NewNode(type) ((type *)Z_Malloc(sizeof(type))) + +#define LL_New(rootnode,type,next,prev) \ + { \ + (rootnode) = NewNode(type); \ + (rootnode)->prev = (rootnode); \ + (rootnode)->next = (rootnode); \ + } + +#define LL_Add(rootnode, newnode, next, prev) \ + { \ + (newnode)->next = (rootnode); \ + (newnode)->prev = (rootnode)->prev; \ + (rootnode)->prev->next = (newnode); \ + (rootnode)->prev = (newnode); \ + } +//MED +#define LL_AddFirst(rootnode, newnode, next, prev) \ + { \ + (newnode)->prev = (rootnode); \ + (newnode)->next = (rootnode)->next; \ + (rootnode)->next->prev = (newnode); \ + (rootnode)->next = (newnode); \ + } + +#define LL_Transfer(oldroot,newroot,next,prev) \ + { \ + if (oldroot->prev != oldroot) \ + { \ + oldroot->prev->next = newroot; \ + oldroot->next->prev = newroot->prev; \ + newroot->prev->next = oldroot->next; \ + newroot->prev = oldroot->prev; \ + oldroot->next = oldroot; \ + oldroot->prev = oldroot; \ + } \ + } + +#define LL_Reverse(root,type,next,prev) \ + { \ + type *newend,*trav,*tprev; \ + \ + newend = root->next; \ + for(trav = root->prev; trav != newend; trav = tprev) \ + { \ + tprev = trav->prev; \ + LL_Move(trav,newend,next,prev); \ + } \ + } + + +#define LL_Remove(node,next,prev) \ + { \ + node->prev->next = node->next; \ + node->next->prev = node->prev; \ + node->next = node; \ + node->prev = node; \ + } + +#define LL_SortedInsertion(rootnode,insertnode,next,prev,type,sortparm) \ + { \ + type *hoya; \ + \ + hoya = rootnode->next; \ + while((hoya != rootnode) && (insertnode->sortparm > hoya->sortparm)) \ + { \ + hoya = hoya->next; \ + } \ + LL_Add(hoya,insertnode,next,prev); \ + } + +#define LL_Move(node,newroot,next,prev) \ + { \ + LL_Remove(node,next,prev); \ + LL_Add(newroot,node,next,prev); \ + } + +#define LL_Empty(list,next,prev) \ + ( \ + ((list)->next == (list)) && \ + ((list)->prev == (list)) \ + ) + +#define LL_Free(list) Z_Free(list) +#define LL_Reset(list,next,prev) (list)->next = (list)->prev = (list) + +#ifdef __cplusplus +} + +#endif +#endif diff --git a/source/source/fgame/listener.cpp b/source/source/fgame/listener.cpp new file mode 100644 index 0000000..e485689 --- /dev/null +++ b/source/source/fgame/listener.cpp @@ -0,0 +1,3435 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/listener.cpp $ +// $Revision:: 61 $ +// $Author:: Aldie $ +// $Date:: 8/10/00 7:38p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/listener.cpp $ +// +// 61 8/10/00 7:38p Aldie +// Working on cleaning stuff +// +// 60 8/10/00 7:34p Aldie +// +// 59 8/10/00 7:21p Aldie +// Added some cleanup to events +// +// 58 8/10/00 7:04p Aldie +// Changed a string allocation +// +// 57 7/14/00 11:30a Markd +// changed initial number of allocated events +// +// 56 7/13/00 12:31p Steven +// Check to see if event is equal to EV_Remove before trying to use it to print +// out info on it. +// +// 55 7/03/00 2:12p Steven +// fixed a crash bug in EventVar::GetVector +// +// 54 6/27/00 2:35p Markd +// allowed vectors to be set to entities to get their origins +// +// 53 6/23/00 9:12p Markd +// fixed some loading of events at spawn time +// +// 52 6/22/00 3:45p Markd +// fixed a bunch of saved game issues +// +// 51 6/14/00 12:14p Markd +// more intel compiler bug fixes +// +// 50 6/06/00 10:57a Steven +// Fixed a compiler issue with g_timeevents change. +// +// 49 6/06/00 10:38a Steven +// Improved g_timeevents. +// +// 48 5/27/00 8:07p Markd +// Saved games 3rd pass +// +// 47 5/26/00 7:44p Markd +// 2nd phase save games +// +// 46 5/25/00 4:28p Markd +// fixed up archive functions +// +// 45 5/24/00 3:14p Markd +// first phase of save/load games +// +// 44 4/29/00 3:26p Markd +// fleshed out the rest of the event/class documentation +// +// 43 4/26/00 7:55p Markd +// Added more documentation code into various systems +// +// 42 4/08/00 3:57p Steven +// Made it so in EventVar( Entity *ent ) if ent was NULL it would save the +// entnum as ENTITYNUM_NONE instead of 0. +// +// 41 3/16/00 7:04p Markd +// Increased number of events allocated at startup +// +// 40 3/06/00 8:07p Markd +// cleaned up unused cvar's +// +// 39 2/24/00 3:16p Jimdose +// changed asserts when Event is unknown into dprintfs +// +// 38 2/23/00 10:07a Markd +// fixed center print and event system crash +// +// 37 2/15/00 5:17p Aldie +// Increased eventlimit and also added a count to print out the number of +// entities spawned +// +// 36 1/06/00 11:10p Jimdose +// cleaning up unused code +// +// 35 12/15/99 3:26p Markd +// fixed listener up a bit, but deleting events instead of realDeallocating +// them right away. +// +// 34 12/15/99 2:08p Markd +// undid test from before +// +// 33 12/15/99 12:11p Markd +// testing undoing my fix +// +// 32 12/15/99 11:45a Markd +// made Event's Classes and also freed up safe pointers at the appropriate +// times +// +// 31 12/13/99 11:14a Markd +// Incremental checkin +// +// 30 12/11/99 5:51p Markd +// First wave of bug fixes after q3a gold merge +// +// 29 12/11/99 3:37p Markd +// q3a gold checkin, first time +// +// 28 10/21/99 2:19p Markd +// Changed range to use ..., fixed fadein and fadeout some more +// +// 27 10/21/99 10:57a Markd +// fixed suppression of _events +// +// 26 10/20/99 7:04p Markd +// suppress commands starting with '_' +// +// 25 10/18/99 2:54p Aldie +// Upped the number of client events +// +// 24 10/11/99 12:01p Steven +// Added some more tabing support when printing out event documentation. +// +// 23 10/11/99 10:05a Markd +// Added some tabbing support to event documentation +// +// 22 10/09/99 6:04p Markd +// changed up documentation a bit +// +// 21 10/07/99 7:14p Aldie +// More beam stuff +// +// 20 10/07/99 3:03p Steven +// Added a new event constructor that only takes a const char * as a parm. +// +// 19 10/06/99 3:09p Steven +// Added dumpevents command. +// +// 18 10/05/99 2:03p Markd +// Added warning about files being in multiple projects +// +// 17 10/03/99 4:50p Markd +// removed str& constructor from listener +// +// 16 10/02/99 6:51p Markd +// Put in backend work for event documentation and fixed a lot of event +// documentation bugs +// +// 15 10/01/99 3:50p Markd +// fixed some level 4 warnings +// +// 14 9/30/99 10:50a Markd +// put in different warning printing depending on which module is used +// +// 13 9/29/99 7:43p Markd +// Made items behave better when dropping to floor +// +// 12 9/29/99 3:36p Steven +// Event formatting. +// +// 11 9/28/99 7:15p Morbid +// +// 10 9/28/99 5:31p Markd +// Successfully merged class.h, listener.h and vector.h into all three modules, +// cgame, fgame and client +// +// 9 9/28/99 5:15p Markd +// Fixed more merge bugs with sharing class, vector and listener between three +// modules +// +// 8 9/28/99 4:26p Markd +// merged listener, class and vector between 3 projects +// +// 7 9/28/99 10:12a Markd +// fixed some event issues +// +// 6 9/27/99 5:44p Markd +// began documentation and cleanup phase after merge +// +// 5 9/22/99 4:48p Markd +// fixed more G_GetEntity, G_FindClass and G_GetNextEntity bugs +// +// 4 9/21/99 7:51p Markd +// Fixed a lot of entitynum_none issues +// +// 3 9/15/99 6:57p Aldie +// Update to get game working +// +// 2 9/10/99 5:45p Jimdose +// merge +// +// 1 9/10/99 10:54a Jimdose +// +// 1 9/08/99 3:16p Aldie +// +// 17 9/02/99 2:33p Markd +// Added cache ability to entities +// +// 16 8/28/99 3:33p Jimdose +// Added EventVar +// All event args now have type information and use lazy evaluation +// +// 15 8/27/99 8:25p Markd +// added pengingevents and fixed some event holes +// +// 14 8/27/99 3:30p Markd +// put in event caching system so that events are reused +// +// 13 8/19/99 12:16p Jimdose +// added event stats +// added lru check to FindEvent +// +// DESCRIPTION: +// +// WARNING: This file is shared between fgame, cgame and possibly the user interface. +// It is instanced in each one of these directories because of the way that SourceSafe works. +// + +#include "listener.h" + +#if defined( GAME_DLL ) + +#include "scriptvariable.h" +#include "worldspawn.h" +#include "scriptmaster.h" + +#elif defined( CGAME_DLL ) + +#elif defined( UI_LIB ) + +#else + +#include "client.h" + +#endif + +Event EV_Remove + ( + "immediateremove", + EV_DEFAULT, + NULL, + NULL, + "Removes this listener immediately." + ); +Event EV_ScriptRemove + ( + "remove", + EV_DEFAULT, + NULL, + NULL, + "Removes this listener the next time events are processed." + ); + +extern "C" + { + int numEvents = 0; + int numFreeEvents = 0; + } + +cvar_t *g_showevents; +cvar_t *g_eventlimit; +cvar_t *g_timeevents; +cvar_t *g_watch; +cvar_t *g_eventstats; + +Event FreeEventHead; +Event *FreeEvents = &FreeEventHead; +Event EventQueueHead; +Event *EventQueue = &EventQueueHead; +Event ActiveEventHead; +Event *ActiveEvents = &ActiveEventHead; + +Container *Event::commandList = NULL; +Container *Event::flagList = NULL; +Container *Event::sortedList = NULL; +Container *Event::eventDefList = NULL; +qboolean Event::dirtylist = false; + +int Event::numfinds; +int Event::numfirstsearch; +int Event::numcompares; +int Event::lastevent; +bool Event::EventSystemStarted; + +int Event_totalmemallocated; + +Event NullEvent; + +void EV_Print( FILE *event_file, const char *fmt, ... ) + { + va_list argptr; + char text[ 1024 ]; + + va_start( argptr, fmt ); + vsprintf( text, fmt, argptr ); + va_end( argptr ); + + if ( event_file ) + fprintf( event_file, text ); + else + EVENT_Printf( text ); + } + +EventVar::EventVar + ( + const char *text + ) + + { + assert( text ); + if ( !text ) + { + text = ""; + } + + dirtyFlags = DIRTY_ALL & ~DIRTY_STRING; + stringValue = text; +#ifdef GAME_DLL + type = Director.isVarGroup( text ) ? IS_SCRIPTVARIABLE : IS_STRING; +#else + type = IS_STRING; +#endif + } + +EventVar::EventVar + ( + str &text + ) + + { + dirtyFlags = DIRTY_ALL & ~DIRTY_STRING; + stringValue = text; +#ifdef GAME_DLL + type = Director.isVarGroup( text.c_str() ) ? IS_SCRIPTVARIABLE : IS_STRING; +#else + type = IS_STRING; +#endif + } + +#ifdef GAME_DLL + +EventVar::EventVar + ( + Entity *ent + ) + + { + type = IS_ENTITY; + dirtyFlags = DIRTY_ALL & ~DIRTY_INTEGER; + if ( ent ) + { + intValue = ent->entnum; + } + else + { + intValue = ENTITYNUM_NONE; + } + } + +void EventVar::Archive + ( + Archiver &arc + ) + + { + arc.ArchiveShort( &type ); + arc.ArchiveShort( &dirtyFlags ); + arc.ArchiveString( &stringValue ); + arc.ArchiveVector( &vectorValue ); + arc.ArchiveInteger( &intValue ); + arc.ArchiveFloat( &floatValue ); + } + +#endif + +const char *EventVar::GetToken + ( + Event &ev + ) + + { + if ( dirtyFlags & DIRTY_STRING ) + { + switch( type ) + { + case IS_VECTOR : + stringValue = va( "(%f %f %f)", vectorValue.x, vectorValue.y, vectorValue.z ); + break; + + case IS_INTEGER : + stringValue = va( "%d", intValue ); + break; + + case IS_FLOAT : + stringValue = va( "%f", floatValue ); + break; + + case IS_ENTITY : + stringValue = va( "*%d", intValue ); + break; + } + + dirtyFlags &= ~DIRTY_STRING; + } + + return stringValue.c_str(); + } + +const char *EventVar::GetString + ( + Event &ev + ) + + { + if ( dirtyFlags & DIRTY_STRING ) + { + switch( type ) + { + case IS_VECTOR : + stringValue = va( "(%f %f %f)", vectorValue.x, vectorValue.y, vectorValue.z ); + break; + + case IS_INTEGER : + stringValue = va( "%d", intValue ); + break; + + case IS_FLOAT : + stringValue = va( "%f", floatValue ); + break; + + case IS_ENTITY : + stringValue = va( "*%d", intValue ); + break; + } + + dirtyFlags &= ~DIRTY_STRING; + } + +#ifdef GAME_DLL + if ( type == IS_SCRIPTVARIABLE ) + { + ScriptVariable *var; + + var = Director.GetExistingVariable( stringValue.c_str() ); + if ( var ) + { + return var->stringValue(); + } + else + { + ev.Error( "Variable %s does not exist.", stringValue.c_str() ); + return ""; + } + } +#endif + + return stringValue.c_str(); + } + +int EventVar::GetInteger + ( + Event &ev + ) + + { + if ( dirtyFlags & DIRTY_INTEGER ) + { + switch( type ) + { + case IS_STRING : + intValue = atoi( stringValue.c_str() ); + break; + + case IS_VECTOR : + intValue = 0; + break; + + case IS_FLOAT : + intValue = int( floatValue ); + break; + + case IS_SCRIPTVARIABLE : +#ifdef GAME_DLL + ScriptVariable *var; + + var = Director.GetExistingVariable( stringValue.c_str() ); + if ( var ) + { + if ( !::IsNumeric( var->stringValue() ) ) + { + ev.Error( "Variable %s contains non-numeric value '%s'", stringValue.c_str(), + var->stringValue() ); + } + + // don't change the dirty flag since the variable may change in the future + return var->intValue(); + } + else + { + ev.Error( "Variable %s does not exist.", stringValue.c_str() ); + // don't change the dirty flag since the variable may exist in the future + //FIXME + // someday, missing variable names should be an error... + return 0; + } +#endif + break; + } + + dirtyFlags &= ~DIRTY_INTEGER; + } + + return intValue; + } + +float EventVar::GetFloat + ( + Event &ev + ) + + { + if ( dirtyFlags & DIRTY_FLOAT ) + { + switch( type ) + { + case IS_STRING : + floatValue = atof( stringValue.c_str() ); + break; + + case IS_VECTOR : + floatValue = 0; + break; + + case IS_ENTITY : + case IS_INTEGER : + floatValue = float( intValue ); + break; + + case IS_SCRIPTVARIABLE : +#ifdef GAME_DLL + ScriptVariable *var; + + var = Director.GetExistingVariable( stringValue.c_str() ); + if ( var ) + { + if ( !::IsNumeric( var->stringValue() ) ) + { + ev.Error( "Variable %s contains non-numeric value '%s'", stringValue.c_str(), + var->stringValue() ); + } + + // don't change the dirty flag since the variable may change in the future + return var->floatValue(); + } + else + { + ev.Error( "Variable %s does not exist.", stringValue.c_str() ); + // don't change the dirty flag since the variable may exist in the future + //FIXME + // someday, missing variable names should be an error... + return 0.0f; + } +#endif + break; + } + + dirtyFlags &= ~DIRTY_FLOAT; + } + + return floatValue; + } + +Vector EventVar::GetVector + ( + Event &ev + ) + + { + if ( dirtyFlags & DIRTY_VECTOR ) + { + switch( type ) + { + case IS_STRING : + const char *text; + + text = stringValue.c_str(); + if ( text[ 0 ] == '(' ) + { + vectorValue = &text[ 1 ]; + } +#ifdef GAME_DLL + // is it an entity + else if ( text[ 0 ] == '$' ) + { + Entity * ent; + + // allow console users to not use '$' + ent = G_FindTarget( NULL, &text[ 1 ] ); + + if ( ent ) + { + vectorValue = ent->origin; + } + else + { + vectorValue = vec_zero; + } + } +#endif + else + { + vectorValue = text; + } + break; + + case IS_FLOAT : + case IS_INTEGER : + vectorValue = vec_zero; + break; + case IS_ENTITY : +#ifdef GAME_DLL + { + Entity * ent; + + ent = G_GetEntity( intValue ); + if ( ent ) + { + vectorValue = ent->origin; + } + else + { + vectorValue = vec_zero; + } + } +#else + vectorValue = vec_zero; +#endif + break; + + case IS_SCRIPTVARIABLE : +#ifdef GAME_DLL + ScriptVariable *var; + + var = Director.GetExistingVariable( stringValue.c_str() ); + if ( !var ) + { + ev.Error( "Variable %s does not exist.", stringValue.c_str() ); + return vec_zero; + } + + // don't change the dirty flag since the variable may change in the future + return var->vectorValue(); +#endif + break; + } + + dirtyFlags &= ~DIRTY_VECTOR; + } + + return vectorValue; + } + +#ifdef GAME_DLL +Entity *EventVar::GetEntity + ( + Event &ev + ) + + { + if ( dirtyFlags & DIRTY_INTEGER ) + { + switch( type ) + { + case IS_VECTOR : + intValue = 0; + break; + + case IS_FLOAT : + intValue = int( floatValue ); + break; + + case IS_SCRIPTVARIABLE : + case IS_STRING : + const char *name; + int t; + + t = 0; + if ( type == IS_STRING ) + { + name = stringValue.c_str(); + if ( ev.GetSource() == EV_FROM_CONSOLE ) + { + Entity * ent; + + // allow console users to not use '$' + ent = G_FindTarget( NULL, name ); + intValue = ent->entnum; + break; + } + } + else + { + ScriptVariable *var; + + var = Director.GetExistingVariable( stringValue.c_str() ); + if ( !var ) + { + ev.Error( "Variable %s does not exist.", stringValue.c_str() ); + return NULL; + } + + name = var->stringValue(); + } + + if ( name[ 0 ] == '$' ) + { + Entity * ent; + + ent = G_FindTarget( NULL, &name[ 1 ] ); + if ( !ent ) + { + ev.Error( "Entity with targetname of '%s' not found", &name[ 1 ] ); + + return NULL; + } + else + { + t = ent->entnum; + } + } + else + { + if ( name[ 0 ] != '*' ) + { + if ( ev.GetSource() == EV_FROM_CONSOLE ) + { + ev.Error( "Entity with targetname of '%s' not found", name ); + } + else + { + ev.Error( "Expecting a '*'-prefixed entity number but found '%s'.", name ); + } + + return NULL; + } + + if ( !::IsNumeric( &name[ 1 ] ) ) + { + ev.Error( "Expecting a numeric value but found '%s'.", &name[ 1 ] ); + + return NULL; + } + else + { + t = atoi( &name[ 1 ] ); + } + } + + if ( type == IS_STRING ) + { + intValue = t; + } + else + { + if ( ( t < 0 ) || ( t > game.maxentities ) ) + { + ev.Error( "%d out of valid range for entity.", t ); + return NULL; + } + + // don't change the dirty flag since the variable may change in the future + return G_GetEntity( t ); + } + break; + } + + dirtyFlags &= ~DIRTY_INTEGER; + } + + if ( ( intValue < 0 ) || ( intValue > game.maxentities ) ) + { + ev.Error( "%d out of valid range for entity.", intValue ); + return NULL; + } + + return G_GetEntity( intValue ); + } + +ScriptVariable *EventVar::GetVariable + ( + Event &ev + ) + + { + if ( type != IS_SCRIPTVARIABLE ) + { + return NULL; + } + + return Director.GetExistingVariable( stringValue.c_str() ); + } +#else + +qboolean IsNumeric + ( + const char *str + ) + + { + int len; + int i; + qboolean dot; + + if ( *str == '-' ) + { + str++; + } + + dot = qfalse; + len = strlen( str ); + for( i = 0; i < len; i++ ) + { + if ( !isdigit( str[ i ] ) ) + { + if ( ( str[ i ] == '.' ) && !dot ) + { + dot = qtrue; + continue; + } + return qfalse; + } + } + + return qtrue; + } + +#endif + +qboolean EventVar::IsVector + ( + Event &ev + ) + + { + switch( type ) + { + case IS_VECTOR : + return true; + break; + + case IS_STRING : + if ( stringValue.c_str()[ 0 ] == '(' ) + { + return true; + } + break; + + case IS_SCRIPTVARIABLE : +#ifdef GAME_DLL + ScriptVariable *var; + + var = Director.GetExistingVariable( stringValue.c_str() ); + if ( var && ( var->stringValue()[ 0 ] == '(' ) ) + { + return true; + } +#endif + break; + } + + return false; + } + +qboolean EventVar::IsNumeric + ( + Event &ev + ) + + { + switch( type ) + { + case IS_STRING : + return ::IsNumeric( stringValue.c_str() ); + break; + +#ifdef GAME_DLL + case IS_SCRIPTVARIABLE : + ScriptVariable *var; + + var = Director.GetExistingVariable( stringValue.c_str() ); + if ( var ) + { + return ::IsNumeric( var->stringValue() ); + } + break; +#endif + + case IS_FLOAT : + case IS_INTEGER : + return true; + break; + } + + return false; + } + +//=========================================================================== +// EventArgDef +//=========================================================================== + +void EventArgDef::Setup + ( + const char *eventName, + const char *argName, + const char *argType, + const char *argRange + ) + { + char scratch[ 256 ]; + const char *ptr; + char *tokptr; + const char *endptr; + int index; + + // set name + name = argName; + + // set optionality + if ( isupper( argType[ 0 ] ) ) + { + optional = qtrue; + } + else + { + optional = qfalse; + } + + // grab the ranges + index = 0; + memset( minRangeDefault, qtrue, sizeof( minRangeDefault ) ); + memset( minRange, 0, sizeof( minRange ) ); + memset( maxRangeDefault, qtrue, sizeof( maxRangeDefault ) ); + memset( maxRange, 0, sizeof( maxRange ) ); + + if ( argRange && argRange[ 0 ] ) + { + ptr = argRange; + while( 1 ) + { + // find opening '[' + tokptr = strchr( ptr, '[' ); + if ( !tokptr ) + { + break; + } + // find closing ']' + endptr = strchr( tokptr, ']' ); + if ( !endptr ) + { + assert( 0 ); + EVENT_DPrintf( "Argument defintion %s, no matching ']' found for range spec in event %s.\n", name, eventName ); + break; + } + // point to the next range + ptr = endptr; + // skip the '[' + tokptr++; + // copy off the range spec + // skip the ']' + strncpy( scratch, tokptr, endptr - tokptr ); + // terminate the range + scratch[ endptr - tokptr ] = 0; + // see if there is one or two parameters here + tokptr = strchr( scratch, ',' ); + if ( !tokptr ) + { + // just one parameter + minRange[ index >> 1 ] = atof( scratch ); + minRangeDefault[ index >> 1 ] = qfalse; + index++; + // skip the second parameter + index++; + } + else if ( tokptr == scratch ) + { + // just second parameter + // skip the first paremeter + index++; + tokptr++; + maxRange[ index >> 1 ] = atof( scratch ); + maxRangeDefault[ index >> 1 ] = qfalse; + index++; + } + else + { + qboolean second; + // one or two parameters + // see if there is anything behind the ',' + if ( strlen( scratch ) > ( tokptr - scratch + 1) ) + second = qtrue; + else + second = qfalse; + // zero out the ',' + *tokptr = 0; + minRange[ index >> 1 ] = atof( scratch ); + minRangeDefault[ index >> 1 ] = qfalse; + index++; + // skip over the nul character + tokptr++; + if ( second ) + { + maxRange[ index >> 1 ] = atof( tokptr ); + maxRangeDefault[ index >> 1 ] = qfalse; + } + index++; + } + } + } + + // figure out the type of variable it is + switch( tolower( argType[ 0 ] ) ) + { + case 'e': + type = IS_ENTITY; + break; + case 'v': + type = IS_VECTOR; + break; + case 'i': + type = IS_INTEGER; + break; + case 'f': + type = IS_FLOAT; + break; + case 's': + type = IS_STRING; + break; + case 'b': + type = IS_BOOLEAN; + break; + } + } + +void EventArgDef::PrintRange + ( + FILE *event_file + ) + { + qboolean integer; + qboolean single; + int numRanges; + int i; + + single = qfalse; + integer = qtrue; + numRanges = 1; + switch( type ) + { + case IS_VECTOR: + integer = qfalse; + numRanges = 3; + break; + case IS_FLOAT: + integer = qfalse; + break; + case IS_STRING: + single = qtrue; + break; + } + for( i = 0; i < numRanges; i++ ) + { + if ( single ) + { + if ( !minRangeDefault[ i ] ) + { + if ( integer ) + { + EV_Print( event_file, "<%d>", ( int )minRange[ i ] ); + } + else + { + EV_Print( event_file, "<%.2f>", minRange[ i ] ); + } + } + } + else + { + // both non-default + if ( !minRangeDefault[ i ] && !maxRangeDefault[ i ] ) + { + if ( integer ) + { + EV_Print( event_file, "<%d...%d>", ( int )minRange[ i ], ( int )maxRange[ i ] ); + } + else + { + EV_Print( event_file, "<%.2f...%.2f>", minRange[ i ], maxRange[ i ] ); + } + } + // max default + else if ( !minRangeDefault[ i ] && maxRangeDefault[ i ] ) + { + if ( integer ) + { + EV_Print( event_file, "<%d...max_integer>", ( int )minRange[ i ] ); + } + else + { + EV_Print( event_file, "<%.2f...max_float>", minRange[ i ] ); + } + } + // min default + else if ( minRangeDefault[ i ] && !maxRangeDefault[ i ] ) + { + if ( integer ) + { + EV_Print( event_file, "", ( int )maxRange[ i ] ); + } + else + { + EV_Print( event_file, "", maxRange[ i ] ); + } + } + } + } + } + +void EventArgDef::PrintArgument + ( + FILE *event_file + ) + { + if ( optional ) + { + EV_Print( event_file, "[ " ); + } + switch( type ) + { + case IS_ENTITY: + EV_Print( event_file, "Entity " ); + break; + case IS_VECTOR: + EV_Print( event_file, "Vector " ); + break; + case IS_INTEGER: + EV_Print( event_file, "Integer " ); + break; + case IS_FLOAT: + EV_Print( event_file, "Float " ); + break; + case IS_STRING: + EV_Print( event_file, "String " ); + break; + case IS_BOOLEAN: + EV_Print( event_file, "Boolean " ); + break; + } + EV_Print( event_file, "%s", name.c_str() ); + + // print the range of the argument + PrintRange( event_file ); + + if ( optional ) + { + EV_Print( event_file, " ]" ); + } + } + + +//=========================================================================== +// EventCode +//=========================================================================== + +CLASS_DECLARATION( Class, Event, NULL ) + { + { NULL, NULL } + }; + +// Free Event Management routines +static Event *RealAllocateEvent + ( + void + ) + { + Event *event; + + event = ( Event * )::new char[ sizeof( Event ) ]; + Event_totalmemallocated += sizeof( Event ); + + return event; + } + +static void RealDeallocateEvent + ( + Event * event + ) + { + ::delete[]( ( void * )event ); + Event_totalmemallocated -= sizeof( Event ); + } + +void * Event::operator new( size_t s ) + { + Event * newevent; + + assert( sizeof( Event ) == s ); + + // if the list is empty create a new one + if ( LL_Empty( FreeEvents, next, prev ) ) + { + // this is here to let us know that it is happening + assert( 0 ); + newevent = RealAllocateEvent(); + } + else + { + newevent = FreeEvents->next; + LL_Remove( newevent, next, prev ); + numFreeEvents--; + } + + // add it to the active list of events + LL_Add( ActiveEvents, newevent, next, prev ); + + newevent->time = EVENT_time; + newevent->flags = 0; + + return newevent; + } + +void Event::operator delete( void *ptr ) + { + Event * event; + + event = ( Event * )ptr; + + // clear out any safe pointers we have setup + event->ClearSafePointers(); + + LL_Remove( event, next, prev ); + LL_Add( FreeEvents, event, next, prev ); + numFreeEvents++; + } + +#if defined( GAME_DLL ) +#define INITIALLY_ALLOCATED_EVENTS 4500 +#elif defined ( CGAME_DLL ) +#define INITIALLY_ALLOCATED_EVENTS 512 +#elif defined ( UI_LIB ) +#define INITIALLY_ALLOCATED_EVENTS 192 +#else +#define INITIALLY_ALLOCATED_EVENTS 192 +#endif + +void Event::InitializeEventLists + ( + void + ) + { + Event * newevent; + int i; + + numEvents = 0; + numFreeEvents = 0; + // + // initialize lists + // + LL_Reset( FreeEvents, next, prev ); + LL_Reset( EventQueue, next, prev ); + LL_Reset( ActiveEvents, next, prev ); + + // + // allocate the initial allottment of events + // + for( i = 0; i < INITIALLY_ALLOCATED_EVENTS; i++ ) + { + newevent = RealAllocateEvent(); + LL_Add( FreeEvents, newevent, next, prev ); + numFreeEvents++; + } + } + +void Event::ShutdownEventLists + ( + void + ) + { + Event *event, *next; + + // free queued events + for( event = EventQueue->next; event != EventQueue; event = next ) + { + next = event->next; + delete event; + } + // free active events + for( event = ActiveEvents->next; event != ActiveEvents; event = next ) + { + next = event->next; + delete event; + } + // free free events + for( event = FreeEvents->next; event != FreeEvents; event = next ) + { + next = event->next; + RealDeallocateEvent( event ); + } + + assert( Event_totalmemallocated == 0 ); + + numEvents = 0; + numFreeEvents = 0; + + // + // initialize lists + // + LL_Reset( FreeEvents, next, prev ); + LL_Reset( EventQueue, next, prev ); + LL_Reset( ActiveEvents, next, prev ); + } + +int Event::NumEventCommands + ( + void + ) + + { + if ( commandList ) + { + // Add 1 since container gives the inclusive number of objects + return commandList->NumObjects() + 1; + } + + return 0; + } + +int Event::compareEvents + ( + const void *arg1, + const void *arg2 + ) + + { + int ev1; + int ev2; + + ev1 = *( int * )arg1; + ev2 = *( int * )arg2; + + return stricmp( commandList->ObjectAt( ev1 )->c_str(), commandList->ObjectAt( ev2 )->c_str() ); + } + +void Event::SortEventList + ( + void + ) + + { + dirtylist = false; + + if ( sortedList && commandList ) + { + qsort( ( void * )sortedList->AddressOfObjectAt( 1 ), + ( size_t )sortedList->NumObjects(), + sizeof( int ), compareEvents ); + } + } + +inline int Event::FindEvent + ( + const char *name + ) + + { + int eventnum; + int index; + int l; + int r; + int diff; + + assert( name ); + if ( !name ) + { + return 0; + } + + if ( !commandList ) + { + return 0; + } + + if ( dirtylist ) + { + SortEventList(); + } + + numfinds++; + numcompares++; + if ( lastevent && !stricmp( name, commandList->ObjectAt( lastevent )->c_str() ) ) + { + numfirstsearch++; + return lastevent; + } + + l = 1; + r = sortedList->NumObjects(); + while( r >= l ) + { + index = ( l + r ) >> 1; + eventnum = sortedList->ObjectAt( index ); + diff = stricmp( name, commandList->ObjectAt( eventnum )->c_str() ); + numcompares++; + if ( diff < 0 ) + { + r = index - 1; + } + else if ( diff > 0 ) + { + l = index + 1; + } + else + { + lastevent = eventnum; + return eventnum; + } + } + + return 0; + } + +int Event::MapSortedEventIndex + ( + int index + ) + { + return sortedList->ObjectAt( index ); + } + + +int Event::FindEvent + ( + str &name + ) + + { + return FindEvent( name.c_str() ); + } + +void Event::ListCommands + ( + const char *mask + ) + + { + str name; + int flags; + int eventnum; + int num; + int i; + int n; + int l; + int p; + int hidden; + str text; + + if ( !commandList ) + { + EVENT_DPrintf( "No events.\n" ); + return; + } + + if ( dirtylist ) + { + SortEventList(); + } + + l = 0; + if ( mask ) + { + l = strlen( mask ); + } + + hidden = 0; + num = 0; + n = sortedList->NumObjects(); + for( i = 1; i <= n; i++ ) + { + eventnum = sortedList->ObjectAt( i ); + name = commandList->ObjectAt( eventnum )->c_str(); + flags = flagList->ObjectAt( eventnum ); + + if ( flags & EV_HIDE ) + { + hidden++; + continue; + } + + if ( mask && Q_stricmpn( name.c_str(), mask, l ) ) + { + continue; + } + + num++; + + text = " "; + p = 0; + if ( flags & EV_CONSOLE ) + { + text[ p++ ] = '*'; + } + if ( flags & EV_CHEAT ) + { + text[ p++ ] = 'C'; + } + if ( flags & EV_CACHE ) + { + text[ p++ ] = '%'; + } + + EVENT_Printf( "%4d : %s%s\n", eventnum, text.c_str(), name.c_str() ); + } + + EVENT_Printf( "\n* = console command.\nC = cheat command.\n% = cache command.\n\n" + "Printed %d of %d total commands.\n", num, n - hidden ); + + if ( developer->integer && hidden ) + { + EVENT_Printf( "Suppressed %d commands.\n", hidden ); + } + } + +#ifdef GAME_DLL + +void Event::PrintEvent + ( + Event * event + ) + { + int i; + int n; + Listener * obj; + str text; + + obj = event->GetSourceObject(); + + text = va( "%6.1f:%1d: %s", event->time, event->flags, obj->getClassname() ); + if ( obj->isSubclassOf( Entity ) ) + { + text += va( " (*%d) ", ( ( Entity * )obj )->entnum ); + if ( ( ( Entity * )obj )->Targeted() ) + { + text += va( "'%s'", ( ( Entity * )obj )->TargetName() ); + } + } + else if ( obj->isSubclassOf( ScriptThread ) ) + { + text += va( " #%d:'%s'", ( ( ScriptThread * )obj )->ThreadNum(), ( ( ScriptThread * )obj )->ThreadName() ); + } + else if ( obj->isSubclassOf( ScriptVariable ) ) + { + text += va( " '%s'", ( ( ScriptVariable * )obj )->getName() ); + } + + switch( event->GetSource() ) + { + default : + case EV_FROM_CODE : + text += " : Code :"; + break; + + case EV_FROM_SCRIPT : + assert( event->GetThread() ); + if ( event->GetThread() ) + { + text += va( " : %s(%d) :", event->GetThread()->Filename(), event->info.linenumber ); + } + else + { + text += " : NULL :"; + } + break; + + case EV_FROM_CONSOLE : + text += " : Console :"; + break; + } + + text += event->getName().c_str(); + n = event->NumArgs(); + for( i = 1; i <= n; i++ ) + { + text += va( " %s", event->GetToken( i ) ); + } + + text += "\n"; + + if ( !g_watch->integer || ( obj->isSubclassOf( Entity ) && ( g_watch->integer == ( ( Entity * )obj )->entnum ) ) ) + { + if ( g_showevents->integer == 2 ) + { + EVENT_DebugPrintf( text.c_str() ); + } + else + { + EVENT_DPrintf( "%s", text.c_str() ); + } + } + } + +#else + +void Event::PrintEvent + ( + Event * event + ) + { + int i; + int n; + str text; + + + text = va( "%6.1f:%1d ", event->time, event->flags ); + + switch( event->GetSource() ) + { + default : + case EV_FROM_CODE : + text += " : Code :"; + break; + + case EV_FROM_CONSOLE : + text += " : Console :"; + break; + } + + text += event->getName().c_str(); + n = event->NumArgs(); + for( i = 1; i <= n; i++ ) + { + text += va( " %s", event->GetToken( i ) ); + } + + text += "\n"; + + if ( g_showevents->integer == 2 ) + { + EVENT_DebugPrintf( text.c_str() ); + } + else + { + EVENT_DPrintf( text.c_str() ); + } + } + +#endif + +void Event::PendingEvents + ( + const char *mask + ) + + { + Event *event; + int l, num; + + l = 0; + if ( mask ) + { + l = strlen( mask ); + } + + assert( EventQueue ); + assert( EventQueue->next ); + assert( EventQueue->prev ); + + num = 0; + event = EventQueue->next; + while( event != EventQueue ) + { + assert( event ); + assert( event->m_sourceobject ); + + if ( !mask || !Q_stricmpn( event->getName().c_str(), mask, l ) ) + { + num++; + Event::PrintEvent( event ); + } + + event = event->next; + } + EVENT_Printf( "%d pending events as of %.2f\n", num, EVENT_time ); + } + +void Event::PrintDocumentation + ( + FILE *event_file, + qboolean html + ) + + { + int i; + int p; + str text; + + if ( !html ) + { + text = " "; + p = 0; + + if ( flags & EV_CONSOLE ) + { + text[ p++ ] = '*'; + } + if ( flags & EV_CHEAT ) + { + text[ p++ ] = 'C'; + } + if ( flags & EV_CACHE ) + { + text[ p++ ] = '%'; + } + } + + if ( html ) + { + EV_Print( event_file, "\n

    %s", name ); + } + else + { + if ( text[ 0 ] != ' ' ) + { + EV_Print( event_file, "\n%s:%s", text.c_str(), name ); + } + else + { + EV_Print( event_file, "\n%s %s", text.c_str(), name ); + } + } + + if ( definition ) + { + if ( html ) + { + EV_Print( event_file, "( " ); + } + else + { + EV_Print( event_file, "( " ); + } + for( i = 1; i <= definition->NumObjects(); i++ ) + { + definition->ObjectAt( i ).PrintArgument( event_file ); + if ( i < definition->NumObjects() ) + { + EV_Print( event_file, ", " ); + } + } + if ( html ) + { + EV_Print( event_file, " )
    \n" ); + } + else + { + EV_Print( event_file, " )\n" ); + } + } + else + { + if ( html ) + { + EV_Print( event_file, "
    \n" ); + } + else + { + EV_Print( event_file, "\n" ); + } + } + if ( documentation ) + { + char new_doc[1024]; + int old_index; + int new_index = 0; + + for ( old_index = 0 ; old_index < strlen ( documentation ) ; old_index++ ) + { + if ( documentation[old_index] == '\n' ) + { + if ( html ) + { + new_doc[new_index ] = '<'; + new_doc[new_index + 1] = 'B'; + new_doc[new_index + 2] = 'R'; + new_doc[new_index + 3] = '>'; + new_doc[new_index + 4] = '\n'; + new_index += 5; + } + else + { + new_doc[new_index ] = '\n'; + new_doc[new_index + 1] = '\t'; + new_doc[new_index + 2] = '\t'; + new_index += 3; + } + } + else + { + new_doc[new_index] = documentation[old_index]; + new_index++; + } + + } + + new_doc[new_index] = 0; + + if ( html ) + { +// EV_Print( event_file, "

    %s
    \n", new_doc ); + EV_Print( event_file, "
      %s
    \n", new_doc ); + } + else + { + EV_Print( event_file, "\t\t- %s\n", new_doc ); + } + } + } + +void Event::PrintEventDocumentation + ( + Event * ePtr, + FILE *event_file, + qboolean html + ) + + { + int flags; + + flags = ePtr->GetFlags(); + + if ( flags & EV_HIDE ) + { + return; + } + + // purposely suppressed + if ( ePtr->name[ 0 ] == '_' ) + { + return; + } + + ePtr->PrintDocumentation( event_file, html ); + } + + +void Event::ListDocumentation + ( + const char *mask, + qboolean print_to_disk + ) + + { + Event * ePtr; + int num; + int i; + int n; + int l; + int flags; + int hidden; + str name; + str text; + FILE *event_file = NULL; + str event_filename; + + if ( !eventDefList ) + { + EVENT_DPrintf( "No events.\n" ); + return; + } + + if ( print_to_disk ) + { + if ( !mask || !mask[0] ) + event_filename = EVENT_FILENAME; + else + event_filename = str ( mask ) + ".txt"; + + event_file = fopen( event_filename.c_str(), "w" ); + + if ( event_file == NULL ) + return; + } + + l = 0; + if ( mask ) + { + l = strlen( mask ); + } + + + EV_Print( event_file, "\nCommand Documentation\n" ); + EV_Print( event_file, "=====================\n" ); + + hidden = 0; + num = 0; + n = eventDefList->NumObjects(); + for( i = 1; i <= n; i++ ) + { + ePtr = eventDefList->ObjectAt( i ); + flags = ePtr->GetFlags(); + name = ePtr->getName(); + + if ( flags & EV_HIDE ) + { + hidden++; + continue; + } + + if ( mask && Q_stricmpn( name, mask, l ) ) + { + continue; + } + + num++; + + ePtr->PrintDocumentation( event_file ); + } + + + EV_Print( event_file, "\n* = console command.\nC = cheat command.\n% = cache command.\n\n" + "Printed %d of %d total commands.\n", num, n - hidden ); + + if ( developer->integer && hidden ) + { + EV_Print( event_file, "Suppressed %d commands.\n", hidden ); + } + + if ( event_file != NULL ) + { + EVENT_Printf( "Printed event info to file %s\n", event_filename.c_str() ); + fclose( event_file ); + } + } + + +void Event::initCommandList + ( + void + ) + + { + int flags; + str *n; + + flags = 0; + commandList = new Container; + + n = new str( "NULL" ); + NullEvent.eventnum = commandList->AddObject( n ); + + flagList = new Container; + flagList->AddObject( flags ); + + sortedList = new Container; + sortedList->AddObject( NullEvent.eventnum ); + + eventDefList = new Container; + + dirtylist = false; + + NullEvent.data = NULL; + NullEvent.info.inuse = 0; + NullEvent.info.source = EV_FROM_CODE; + NullEvent.info.flags = 0; + NullEvent.info.linenumber = 0; + } + +Event::Event() + { + info.inuse = 0; + info.source = EV_FROM_CODE; + info.flags = 0; + info.linenumber = 0; + threadnum = -1; + eventnum = 0; + data = NULL; + definition = NULL; + name = NULL; + documentation = NULL; + } + +Event::Event + ( + int num + ) + + { + if ( !commandList ) + { + initCommandList(); + } + + assert( ( num > 0 ) && num <= commandList->NumObjects() ); + + if ( ( num <= 0 ) || ( num > commandList->NumObjects() ) ) + { + EVENT_DPrintf( "Event %d out of range.\n", num ); + num = 0; + name = NULL; + info.flags = 0; + } + else + { + name = commandList->ObjectAt( num )->c_str(); + info.flags = flagList->ObjectAt( num ); + } + + eventnum = num; + data = NULL; + definition = NULL; + documentation = NULL; + info.inuse = 0; + info.source = EV_FROM_CODE; + info.linenumber = 0; + threadnum = -1; + } + +Event::Event + ( + Event &ev + ) + + { + int num; + int i; + + eventnum = ( int )ev; + assert( ( eventnum > 0 ) && eventnum <= commandList->NumObjects() ); + data = NULL; + definition = NULL; + documentation = NULL; + + name = commandList->ObjectAt( eventnum )->c_str(); + info.inuse = 0; + info.source = ev.info.source; + info.flags = ev.info.flags; + info.linenumber = ev.info.linenumber; + threadnum = ev.threadnum; + + if ( ev.data ) + { + num = ev.data->NumObjects(); + + data = new Container; + data->Resize( num ); + + for( i = 1; i <= num; i++ ) + { + data->AddObject( ev.data->ObjectAt( i ) ); + } + } + } + +Event::Event + ( + Event *ev + ) + + { + int num; + int i; + + assert( ev ); + if ( !ev ) + { + EVENT_Error( ERR_DROP, "NULL Event\n" ); + } + + eventnum = ( int )*ev; + assert( ( eventnum > 0 ) && eventnum <= commandList->NumObjects() ); + data = NULL; + definition = NULL; + documentation = NULL; + name = commandList->ObjectAt( eventnum )->c_str(); + info.inuse = 0; + info.source = ev->info.source; + info.flags = ev->info.flags; + info.linenumber = ev->info.linenumber; + threadnum = ev->threadnum; + if ( ev->data ) + { + num = ev->data->NumObjects(); + + data = new Container; + data->Resize( num ); + + for( i = 1; i <= num; i++ ) + { + data->AddObject( ev->data->ObjectAt( i ) ); + } + } + } + +Event::Event + ( + const char *command, + int flags, + const char *theFormatspec, + const char *theArgument_names, + const char *theDocumentation + ) + + { + str *t; + + if ( !commandList ) + { + initCommandList(); + } + + eventnum = FindEvent( command ); + if ( !eventnum ) + { + t = new str( command ); + eventnum = commandList->AddObject( t ); + // check for default flags + if ( flags == EV_DEFAULT ) + { + flags = 0; + } + flagList->AddObject( ( int )flags ); + sortedList->AddObject( eventnum ); + dirtylist = true; + } + + // Use the name stored in the command list in case the string passed in + // is not in static memory. + name = commandList->ObjectAt( eventnum )->c_str(); + + data = NULL; + info.inuse = 0; + info.source = EV_FROM_CODE; + info.linenumber = 0; + threadnum = -1; + formatspec = theFormatspec; + argument_names = theArgument_names; + documentation = theDocumentation; + definition = NULL; + + // If flags have changed, let the user know. It's probably a development bug. + int &flagobj = flagList->ObjectAt( eventnum ); + + // check for default flags + if ( flags == EV_DEFAULT ) + { + flags = flagobj; + } + + assert( flags == flagobj ); + if ( flags != flagobj ) + { + // Flags not equal. Use combined value. + flagobj |= flags; + } + + info.flags = flagobj; + + // add it to the list for Documentation + // suppress it if it starts with '_' + if ( documentation && ( command[ 0 ] != '_' ) ) + { + eventDefList->AddObject( ( Event * )this ); + } + else + { + // purposely suppressed + if ( command[ 0 ] != '_' ) + { + // empty documentation! + assert( 0 ); + } + } + } + +Event::Event + ( + const char *command + ) + + { + if ( !commandList ) + { + initCommandList(); + } + + eventnum = FindEvent( command ); + if ( !eventnum ) + { + EVENT_DPrintf( "Event '%s' does not exist.\n", command ); + name = NULL; + info.flags = 0; + } + else + { + name = commandList->ObjectAt( eventnum )->c_str(); + info.flags = flagList->ObjectAt( eventnum ); + } + + data = NULL; + definition = NULL; + documentation = NULL; + info.inuse = 0; + info.source = EV_FROM_CODE; + info.linenumber = 0; + threadnum = -1; + } + +Event::Event + ( + str &command + ) + + { + if ( !commandList ) + { + initCommandList(); + } + + eventnum = FindEvent( command ); + if ( !eventnum ) + { + EVENT_DPrintf( "Event '%s' does not exist.\n", command.c_str() ); + name = NULL; + info.flags = 0; + } + else + { + name = commandList->ObjectAt( eventnum )->c_str(); + info.flags = flagList->ObjectAt( eventnum ); + } + + data = NULL; + definition = NULL; + documentation = NULL; + info.inuse = 0; + info.source = EV_FROM_CODE; + info.linenumber = 0; + threadnum = -1; + } + +Event::~Event() + { + if ( data ) + { + delete data; + data = NULL; + } + if ( definition ) + { + delete definition; + definition = NULL; + } + } + +void Event::SetupDocumentation + ( + void + ) + + { + // setup documentation + if ( formatspec ) + { + if ( argument_names ) + { + char argumentNames[ 256 ]; + str argSpec; + str rangeSpec; + str argName; + EventArgDef argDef; + const char *namePtr; + const char *specPtr; + int specLength, index; + Container argNames; + + specLength = strlen( formatspec ); + specPtr = formatspec; + // + // store off all the names + // + strcpy( argumentNames, argument_names ); + namePtr = strtok( argumentNames, " " ); + while ( namePtr != NULL ) + { + argNames.AddObject( str( namePtr ) ); + namePtr = strtok( NULL, " " ); + } + // + // create the definition container + // + definition = new Container; + definition->Resize( argNames.NumObjects() ); + index = 0; + // go throught he formatspec + while( specLength ) + { + // clear the rangeSpec + rangeSpec = ""; + // get the argSpec + argSpec = ""; + argSpec += *specPtr; + specPtr++; + specLength--; + // see if there is a range specified + while ( *specPtr == '[' ) + { + // add in all the characters until NULL or ']' + while( specLength && ( *specPtr != ']' ) ) + { + rangeSpec += *specPtr; + specPtr++; + specLength--; + } + if ( specLength && *specPtr == ']' ) + { + rangeSpec += *specPtr; + specPtr++; + specLength--; + } + } + if ( index < argNames.NumObjects() ) + { + argName = argNames.ObjectAt( index + 1 ); + argDef.Setup( name, argName, argSpec, rangeSpec ); + definition->AddObject( argDef ); + } + else + { + assert( 0 ); + Error( "More format specifiers than argument names for event %s\n", name ); + } + index++; + } + if ( index < argNames.NumObjects() ) + { + assert( 0 ); + Error( "More argument names than format specifiers for event %s\n", name ); + } + } + } + } + +void Event::DeleteDocumentation + ( + void + ) + + { + // setup documentation + if ( formatspec ) + { + if ( argument_names ) + { + definition->FreeObjectList(); + delete definition; + definition = NULL; + } + } + } + +#ifdef GAME_DLL + +void Event::SetThread + ( + ScriptThread *thread + ) + + { + if ( thread ) + { + threadnum = thread->ThreadNum(); + } + else + { + threadnum = -1; + } + } + +ScriptThread *Event::GetThread + ( + void + ) + + { + if ( threadnum != -1 ) + { + return Director.GetThread( threadnum ); + } + + return NULL; + } +#endif + +void Event::Error + ( + const char *fmt, + ... + ) + + { + va_list argptr; + char text[ 1024 ]; + + va_start( argptr, fmt ); + vsprintf( text, fmt, argptr ); + va_end( argptr ); + + switch( GetSource() ) + { + default : + case EV_FROM_CODE : +#if defined( GAME_DLL ) + EVENT_DPrintf( "Game: '%s' : %s\n", getName().c_str(), text ); +#elif defined( CGAME_DLL ) + EVENT_DPrintf( "CGame: '%s' : %s\n", getName().c_str(), text ); +#elif defined( UI_LIB ) + EVENT_DPrintf( "UI_Lib: '%s' : %s\n", getName().c_str(), text ); +#else + EVENT_DPrintf( "Client: '%s' : %s\n", getName().c_str(), text ); +#endif + break; +#ifdef GAME_DLL + case EV_FROM_SCRIPT : + { + ScriptThread *thread = GetThread(); + const char *filename = "Dead script"; + if ( thread ) + { + filename = thread->Filename(); + } + EVENT_DPrintf( "%s(%d): '%s' :\n%s\n", filename, info.linenumber, getName().c_str(), text ); + } + break; + + case EV_FROM_CONSOLE : + gi.SendServerCommand( GetConsoleEdict()-g_entities, "print \"Console: '%s' : %s\n\"", getName().c_str(), text ); + break; +#endif + } + } + +qboolean Event::IsVectorAt + ( + int pos + ) + + { + if ( !data || ( pos < 1 ) || ( data->NumObjects() < pos ) ) + { + Error( "Index %d out of range.", pos ); + return false; + } + + return data->ObjectAt( pos ).IsVector( *this ); + } + +#ifdef GAME_DLL +qboolean Event::IsEntityAt + ( + int pos + ) + + { + if ( !data || ( pos < 1 ) || ( data->NumObjects() < pos ) ) + { + Error( "Index %d out of range.", pos ); + return false; + } + + return data->ObjectAt( pos ).GetEntity( *this ) != NULL; + } +#endif + +qboolean Event::IsNumericAt + ( + int pos + ) + + { + if ( !data || ( pos < 1 ) || ( data->NumObjects() < pos ) ) + { + Error( "Index %d out of range.", pos ); + return false; + } + + return data->ObjectAt( pos ).IsNumeric( *this ); + } + +#ifdef GAME_DLL +void Event::Archive + ( + Archiver &arc + ) + + { + str name; + int num; + int i; + EventVar var; + + if ( arc.Saving() ) + { + name = getName(); + } + arc.ArchiveString( &name ); + if ( arc.Loading() ) + { + if ( data ) + { + delete data; + data = NULL; + } + *this = Event( name ); + } + + arc.ArchiveRaw( &info, sizeof( info ) ); + arc.ArchiveInteger( &threadnum ); + arc.ArchiveShort( &anim_number ); + arc.ArchiveShort( &anim_frame ); + arc.ArchiveSafePointer( &m_sourceobject ); + arc.ArchiveFloat( &time ); + arc.ArchiveInteger( &flags ); + + if ( arc.Saving() ) + { + if ( !data ) + { + num = 0; + } + else + { + num = data->NumObjects(); + } + } + arc.ArchiveInteger( &num ); + if ( arc.Loading() && num ) + { + data = new Container; + data->Resize( num ); + } + + for( i = 1; i <= num; i++ ) + { + if ( arc.Saving() ) + { + var = data->ObjectAt( i ); + } + var.Archive( arc ); + if ( arc.Loading() ) + { + data->AddObject( var ); + } + } + } +#endif + +CLASS_DECLARATION( Class, Listener, NULL ) + { + { &EV_Remove, Listener::Remove }, + { &EV_ScriptRemove, Listener::ScriptRemove }, + { NULL, NULL } + }; + +void Listener::Remove + ( + Event *e + ) + + { + delete this; + } + +void Listener::ScriptRemove + ( + Event *e + ) + + { + // Forces the remove to be done at a safe time + PostEvent( EV_Remove, 0 ); + } + +qboolean Listener::ValidEvent + ( + Event &e + ) + + { + ClassDef *c; + int ev; + + ev = ( int )e; + + c = this->classinfo(); + assert( ( ev >= 0 ) && ( ev < c->numEvents ) ); + if ( ( ev < 0 ) || ( ev >= c->numEvents ) ) + { + warning( "ValidEvent", "Event '%s' out of response range for class '%s'. " + "Event probably invalid or allocated late.\n", e.getName().c_str(), getClassname() ); + return false; + } + + return ( c->responseLookup[ ev ] != NULL ); + } + +qboolean Listener::ValidEvent + ( + const char *name + ) + + { + ClassDef *c; + int ev; + + ev = Event::FindEvent( name ); + + c = this->classinfo(); + assert( ( ev >= 0 ) && ( ev < c->numEvents ) ); + if ( ( ev < 0 ) || ( ev >= c->numEvents ) ) + { + warning( "ValidEvent", "Event '%s' out of response range for class '%s'. " + "Event probably invalid or allocated late.\n", name, getClassname() ); + return false; + } + + return ( c->responseLookup[ ev ] != NULL ); + } + +qboolean Listener::EventPending + ( + Event &ev + ) + + { + Event *event; + int eventnum; + + assert( EventQueue ); + assert( EventQueue->next ); + + event = EventQueue->next; + + eventnum = ( int )ev; + while( event != EventQueue ) + { + if ( ( event->m_sourceobject == this ) && ( (int)*event == eventnum ) ) + { + return true; + } + event = event->next; + } + + return false; + } + +inline qboolean Listener::CheckEventFlags + ( + Event *event + ) + + { +#ifdef GAME_DLL + // Special handling of console events + if ( event->GetSource() == EV_FROM_CONSOLE ) + { + if ( !( event->info.flags & (EV_CONSOLE|EV_CHEAT) ) ) + { + if ( isSubclassOf( Entity ) ) + { + Entity *ent; + + ent = ( Entity * )this; + gi.SendServerCommand( ent->edict-g_entities, "print \"Command not available from console.\n\"" ); + } + + // don't process + return false; + } + + // don't allow console cheats during deathmatch unless the server says it's ok. + if ( ( event->info.flags & EV_CHEAT ) && deathmatch->integer && !sv_cheats->integer ) + { + if ( isSubclassOf( Entity ) ) + { + Entity *ent; + + ent = ( Entity * )this; + gi.SendServerCommand( ent->edict-g_entities, "print \"You must run the server with '+set cheats 1' to enable this command.\n\"" ); + } + + // don't process + return false; + } + } +#endif + + // ok to process + return true; + } + +qboolean Listener::ProcessEvent + ( + Event *event + ) + + { + ClassDef *c; + int ev; + + if ( !Event::EventSystemStarted ) + { + assert( 0 ); + return false; + } + + // make sure the event has only been used once + if ( event->info.inuse ) + { + EVENT_Error( ERR_DROP, "ProcessEvent : Event '%s' has already been posted.\n", event->getName().c_str() ); + } + + if ( g_showevents->integer ) + { + Listener *obj; + + obj = event->GetSourceObject(); + if ( !obj ) + { + event->SetSourceObject( this ); + } + Event::PrintEvent( event ); + } + + ev = ( int )*event; + c = this->classinfo(); + if ( ev >= c->numEvents ) + { + event->Error( "Event out of response range for class '%s'. Event probably invalid or allocated late.\n", getClassname() ); + return false; + } + + if ( c->responseLookup[ ev ] ) + { + int start; + int end; + + event->info.inuse++; + + if ( !g_timeevents->integer ) + { + // only process the event if we allow it + if ( CheckEventFlags( event ) ) + { + ( this->**c->responseLookup[ ev ] )( event ); + } + } + else + { + start = EVENT_realtime; + + // only process the event if we allow it + if ( CheckEventFlags( event ) ) + { + ( this->**c->responseLookup[ ev ] )( event ); + } + + end = EVENT_realtime; + + if ( end - start >= g_timeevents->integer ) + { +#ifdef GAME_DLL + if ( event != EV_Remove && this->isSubclassOf( Entity ) ) + { + Entity *ent = (Entity *)this; + + EVENT_DebugPrintf( "(%d) ", ent->entnum ); + } +#endif + + EVENT_DebugPrintf( "'%s' : %d\n", event->getName().c_str(), end - start ); + } + } + + // Prevent an event from being freed twice, in case it's been re-used + event->info.inuse--; + if ( !event->info.inuse ) + { + delete event; + } + else + { + EVENT_Error( ERR_DROP, "ProcessEvent : Event '%s' is still in use after being processed.\n", event->getName().c_str() ); + } + + return true; + } + + if ( !event->info.inuse ) + { + delete event; + } + else + { + EVENT_Error( ERR_DROP, "ProcessEvent : Event '%s' is still in use after being processed.\n", event->getName().c_str() ); + } + + return false; + } + +void Listener::PostEvent + ( + Event *ev, + float time, + int flags + ) + + { + int evnum; + ClassDef *c; + Event *event; + +#ifdef GAME_DLL + if ( LoadingSavegame ) + { + // while technically not bad, if we got here we have an event that is being posted while loading which is a bad thing + assert( 0 ); + if ( !ev->info.inuse ) + { + delete ev; + } + else + { + EVENT_Error( ERR_DROP, "PostEvent : Event '%s' is still in use during loading.\n", ev->getName().c_str() ); + } + + return; + } +#endif + + if ( !Event::EventSystemStarted ) + { + assert( 0 ); + return; + } + + evnum = ( int )*ev; + c = this->classinfo(); + if ( evnum >= c->numEvents ) + { + ev->Error( "Event out of response range for class '%s'. Event probably invalid or allocated late.\n", getClassname() ); + return; + } + + if ( !c->responseLookup[ evnum ] ) + { + // we don't need it so lets delete it + delete ev; + return; + } + + LL_Remove( ev, next, prev ); + + ev->SetSourceObject( this ); + ev->time = EVENT_time + time; + ev->flags = flags; + + event = EventQueue->next; + while( ( event != EventQueue ) && ( ev->time >= event->time ) ) + { + event = event->next; + } + + LL_Add( event, ev, next, prev ); + numEvents++; + } + +qboolean Listener::PostponeEvent + ( + Event &ev, + float time + ) + + { + Event *event; + Event *node; + int eventnum; + + assert( EventQueue ); + assert( EventQueue->next ); + + eventnum = ( int )ev; + + event = EventQueue->next; + while( event != EventQueue ) + { + if ( ( event->GetSourceObject() == this ) && ( ( int )*event == eventnum ) ) + { + event->time += time; + + node = event->next; + while( ( node != EventQueue ) && ( event->time >= node->time ) ) + { + node = node->next; + } + + LL_Remove( event, next, prev ); + LL_Add( node, event, next, prev ); + + return true; + } + event = event->next; + } + + return false; + } + +void Listener::CancelEventsOfType + ( + Event *ev + ) + + { + Event *event; + Event *next; + int eventnum; + + assert( EventQueue ); + assert( EventQueue->next ); + + event = EventQueue->next; + + eventnum = (int)*ev; + while( event != EventQueue ) + { + next = event->next; + if ( ( event->GetSourceObject() == this ) && ( (int)*event == eventnum ) ) + { + LL_Remove( event, next, prev ); + numEvents--; + delete event; + } + event = next; + } + } + +void Listener::CancelFlaggedEvents + ( + int flags + ) + + { + Event *event; + Event *next; + + assert( EventQueue ); + assert( EventQueue->next ); + + event = EventQueue->next; + + while( event != EventQueue ) + { + next = event->next; + if ( ( event->GetSourceObject() == this ) && ( event->flags & flags ) ) + { + LL_Remove( event, next, prev ); + numEvents--; + delete event; + } + event = next; + } + } + + +void Listener::CancelPendingEvents + ( + void + ) + + { + Event *event; + Event *next; + + assert( EventQueue ); + assert( EventQueue->next ); + + event = EventQueue->next; + + while( event != EventQueue ) + { + next = event->next; + if ( event->GetSourceObject() == this ) + { + LL_Remove( event, next, prev ); + numEvents--; + delete event; + } + event = next; + } + } + +qboolean Listener::ProcessPendingEvents + ( + void + ) + + { + Event *event; + qboolean processedEvents; + float t; + + assert( EventQueue ); + assert( EventQueue->next ); + assert( EventQueue->prev ); + + processedEvents = false; + + t = EVENT_time + 0.001; + + event = EventQueue->next; + while( event != EventQueue ) + { + Listener * obj; + + assert( event ); + + obj = event->GetSourceObject(); + + if ( event->time > t ) + { + break; + } + + if ( obj != this ) + { + // traverse normally + event = event->next; + } + else + { + // the event is removed from its list and temporarily added to the active list + LL_Remove( event, next, prev ); + numEvents--; + LL_Add( ActiveEvents, event, next, prev ); + + + // ProcessEvent will dispose of this event when it is done + obj->ProcessEvent( event ); + + // start over, since can't guarantee that we didn't process any previous or following events + event = EventQueue->next; + + processedEvents = true; + } + } + + return processedEvents; + } + +Listener::~Listener() + { + if ( Event::EventSystemStarted ) + CancelPendingEvents(); + } + +void L_ClearEventList + ( + void + ) + + { + Event *event; + + // go through active and event queue lists + while( !LL_Empty( EventQueue, next, prev ) ) + { + event = EventQueue->next; + numEvents--; + LL_Remove( event, next, prev ); + delete event; + } + + while( !LL_Empty( ActiveEvents, next, prev ) ) + { + event = ActiveEvents->next; + LL_Remove( event, next, prev ); + delete event; + } + + numEvents = 0; + } + +void L_ProcessPendingEvents + ( + void + ) + + { + Event *event; + float t; + int num; + int maxevents; + + assert( EventQueue ); + assert( EventQueue->next ); + assert( EventQueue->prev ); + + maxevents = ( int )g_eventlimit->integer; + + num = 0; + t = EVENT_time + 0.001; + while( !LL_Empty( EventQueue, next, prev ) ) + { + Listener * obj; + + event = EventQueue->next; + + assert( event ); + + obj = event->GetSourceObject(); + + assert( obj ); + + if ( event->time > t ) + { + break; + } + + // the event is removed from its list and temporarily added to the active list + LL_Remove( event, next, prev ); + numEvents--; + LL_Add( ActiveEvents, event, next, prev ); + + + // ProcessEvent will dispose of this event when it is done + obj->ProcessEvent( event ); + + // Don't allow ourselves to stay in here too long. An abnormally high number + // of events being processed is evidence of an infinite loop of events. + num++; + if ( num > maxevents ) + { + EVENT_Printf( "Event overflow. Possible infinite loop in script. " + "Enable g_showevents to trace. Aborting frame.\n" ); + break; + } + } + + if ( g_eventstats->integer ) + { + if ( g_eventstats->integer == 1 ) + { + EVENT_Printf( "finds %d, searches %d, num first search %d, avg %f\n", + Event::numfinds, Event::numcompares, Event::numfirstsearch, + ( float )Event::numcompares / ( float )Event::numfinds ); + } + else if ( g_eventstats->integer == 2 ) + { + EVENT_Printf( "pending %5d free %5d active+pending %4d\n", + numEvents, numFreeEvents, numFreeEvents + numEvents ); + } + } + } + +#ifdef GAME_DLL + +void Event::SetConsoleEdict + ( + gentity_t *consoleedict + ) + + { + // linenumber does double duty in the case of the console commands + if ( consoleedict ) + { + info.linenumber = consoleedict->s.number; + } + else + { + // default to player 1 + info.linenumber = 0; + } + } + +gentity_t *Event::GetConsoleEdict + ( + void + ) + + { + // linenumber does double duty in the case of the console commands + if ( ( info.source != EV_FROM_CONSOLE ) || ( info.linenumber < 0 ) || ( info.linenumber >= game.maxclients ) ) + { + // default to player 1 for release + return &g_entities[ 0 ]; + } + + return &g_entities[ info.linenumber ]; + } + +void L_ArchiveEvents + ( + Archiver &arc + ) + + { + Event *event; + int num; + + assert( EventQueue ); + assert( EventQueue->next ); + assert( EventQueue->prev ); + + num = 0; + for( event = EventQueue->next; event != EventQueue; event = event->next ) + { + Listener * obj; + + assert( event ); + + obj = event->GetSourceObject(); + + assert( obj ); + + if ( obj->isSubclassOf( Entity ) && + ( ( ( Entity * )obj )->flags & FL_DONTSAVE ) ) + { + continue; + } + + num++; + } + + arc.ArchiveInteger( &num ); + for( event = EventQueue->next; event != EventQueue; event = event->next ) + { + Listener * obj; + + assert( event ); + + obj = event->GetSourceObject(); + + assert( obj ); + + if ( obj->isSubclassOf( Entity ) && + ( ( ( Entity * )obj )->flags & FL_DONTSAVE ) ) + { + continue; + } + + arc.ArchiveEvent( event ); + arc.ArchiveFloat( &event->time ); + arc.ArchiveInteger( &event->flags ); + } + } + +void L_UnarchiveEvents + ( + Archiver &arc + ) + + { + Event *e; + int i; + + // the FreeEvents list would already be allocated at this point + // clear out any events that may exist + L_ClearEventList(); + + arc.ArchiveInteger( &numEvents ); + for( i = 0; i < numEvents; i++ ) + { + e = new Event(); + LL_Remove( e, next, prev ); + arc.ArchiveEvent( e ); + arc.ArchiveFloat( &e->time ); + arc.ArchiveInteger( &e->flags ); + + LL_Add( EventQueue, e, next, prev ); + } + } +#endif + +void Event::InitializeDocumentation + ( + void + ) + { + Event * ePtr; + int i; + + for( i = 1; i <= eventDefList->NumObjects(); i++ ) + { + ePtr = eventDefList->ObjectAt( i ); + ePtr->SetupDocumentation(); + } + } + +void Event::ShutdownDocumentation + ( + void + ) + { + Event * ePtr; + int i; + + for( i = 1; i <= eventDefList->NumObjects(); i++ ) + { + ePtr = eventDefList->ObjectAt( i ); + ePtr->DeleteDocumentation(); + } + } + + +void L_InitEvents + ( + void + ) + + { + if ( Event::EventSystemStarted ) + { + assert( 0 ); + L_ShutdownEvents(); + } + + Event::lastevent = 0; + Event::numfinds = 0; + Event::numcompares = 0; + Event::numfirstsearch = 0; + Event_totalmemallocated = 0; + +#if defined( GAME_DLL ) + g_showevents = gi.cvar ( "g_showevents", "0", 0 ); + g_eventlimit = gi.cvar ( "g_eventlimit", "5000", 0 ); + g_timeevents = gi.cvar ( "g_timeevents", "0", 0 ); + g_watch = gi.cvar ( "g_watch", "0", 0 ); + g_eventstats = gi.cvar ( "g_eventstats", "0", 0 ); +#elif defined( CGAME_DLL ) + g_showevents = cgi.Cvar_Get ( "cg_showevents", "0", 0 ); + g_eventlimit = cgi.Cvar_Get ( "cg_eventlimit", "500", 0 ); + g_timeevents = cgi.Cvar_Get ( "cg_timeevents", "0", 0 ); + g_eventstats = cgi.Cvar_Get ( "cg_eventstats", "0", 0 ); +#else + g_showevents = Cvar_Get ( "cl_showevents", "0", 0 ); + g_eventlimit = Cvar_Get ( "cl_eventlimit", "500", 0 ); + g_timeevents = Cvar_Get ( "cl_timeevents", "0", 0 ); + g_eventstats = Cvar_Get ( "cl_eventstats", "0", 0 ); +#endif + + BuildEventResponses(); + + Event::InitializeEventLists(); + + L_ClearEventList(); + + // setup the documentation on all the events + Event::InitializeDocumentation(); + + // Sort the list before we go on since we won't be adding any more events + Event::SortEventList(); + + // the event system has started + Event::EventSystemStarted = true; + } + +void L_ShutdownEvents + ( + void + ) + + { + int i; + + if ( !Event::EventSystemStarted ) + return; + + Event::ShutdownEventLists(); + + // deletes all the documentation + Event::ShutdownDocumentation(); + + if ( Event::commandList ) + { + for ( i=Event::commandList->NumObjects(); i>0; i-- ) + { + str *s; + + s = Event::commandList->ObjectAt( i ); + assert( s ); + if ( s ) + delete s; + } + delete Event::commandList; + Event::commandList = NULL; + } + + if ( Event::eventDefList ) + { + delete Event::eventDefList; + Event::eventDefList = NULL; + } + + if ( Event::flagList ) + { + delete Event::flagList; + Event::flagList = NULL; + } + + if ( Event::sortedList ) + { + delete Event::sortedList; + Event::sortedList = NULL; + } + + // say it is now shutdown + Event::EventSystemStarted = false; + } diff --git a/source/source/fgame/listener.h b/source/source/fgame/listener.h new file mode 100644 index 0000000..481ffb2 --- /dev/null +++ b/source/source/fgame/listener.h @@ -0,0 +1,1208 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/listener.h $ +// $Revision:: 36 $ +// $Author:: Aldie $ +// $Date:: 7/25/00 11:32p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/listener.h $ +// +// 36 7/25/00 11:32p Aldie +// Made some changes to the memory system and fixed a memory allocation bug in +// Z_TagMalloc. Also changed a lot of classes to subclass from Class. +// +// 35 6/22/00 6:34p Markd +// fixed =operator assignment bug +// +// 34 6/22/00 3:45p Markd +// fixed a bunch of saved game issues +// +// 33 6/14/00 11:18a Markd +// cleaned up code using Intel compiler +// +// 32 5/30/00 7:06p Markd +// saved games 4th pass +// +// 31 5/24/00 3:14p Markd +// first phase of save/load games +// +// 30 4/29/00 3:26p Markd +// fleshed out the rest of the event/class documentation +// +// 29 4/26/00 7:55p Markd +// Added more documentation code into various systems +// +// 28 4/13/00 7:04p Aldie +// Fixed bug for animation events where the anim was greater than 255. Added +// animframe and animnumber to Event. +// +// 27 3/16/00 10:50a Markd +// Fixed some bad syntax in headers that exhibited itself in non-visualc +// compilers +// +// 26 1/06/00 11:10p Jimdose +// cleaning up unused code +// +// 25 12/15/99 11:45a Markd +// made Event's Classes and also freed up safe pointers at the appropriate +// times +// +// 24 12/11/99 5:51p Markd +// First wave of bug fixes after q3a gold merge +// +// 23 12/11/99 3:37p Markd +// q3a gold checkin, first time +// +// 22 11/11/99 3:54p Jimdose +// added EVENT_TORSO_ANIM +// +// 21 10/19/99 7:52p Markd +// Removed three part model system +// +// 20 10/12/99 11:09a Morbid +// UI merge back to FAKK +// +// 19 10/07/99 3:02p Steven +// Removed defaults for event constructor and added a new event constructor +// that only takes a const char * as a parm. +// +// 18 10/06/99 3:09p Steven +// Added dumpevents command. +// +// 17 10/05/99 2:03p Markd +// Added warning about files being in multiple projects +// +// 16 10/03/99 4:50p Markd +// removed str& constructor from listener +// +// 15 10/02/99 6:51p Markd +// Put in backend work for event documentation and fixed a lot of event +// documentation bugs +// +// 14 10/01/99 4:52p Markd +// Made Warning level 4 work on all projects +// +// 13 10/01/99 3:49p Markd +// fixed some level 4 warnings +// +// 12 9/29/99 3:10p Markd +// fixed listener problems +// +// 11 9/29/99 2:49p Morbid +// +// 10 9/28/99 7:13p Markd +// moved __LISTENER define up to the top of the file +// +// 9 9/28/99 5:31p Markd +// Successfully merged class.h, listener.h and vector.h into all three modules, +// cgame, fgame and client +// +// 8 9/28/99 5:15p Markd +// Fixed more merge bugs with sharing class, vector and listener between three +// modules +// +// 7 9/28/99 4:26p Markd +// merged listener, class and vector between 3 projects +// +// 6 9/28/99 10:12a Markd +// fixed some event issues +// +// 5 9/27/99 5:44p Markd +// began documentation and cleanup phase after merge +// +// 4 9/16/99 7:48p Jimdose +// made SetConsoleEdict use 0 based players +// +// 3 9/16/99 7:48p Jimdose +// fixed GetConsoleEdict to use 0 based players +// +// 2 9/16/99 11:18a Markd +// Continuing merge of code, not functional yet but closer +// +// 1 9/10/99 10:54a Jimdose +// +// 1 9/08/99 3:16p Aldie +// +// 14 9/02/99 2:33p Markd +// Added cache ability to entities +// +// 13 8/28/99 3:34p Jimdose +// Added EventVar +// All event args now have type information and use lazy evaluation +// +// 12 8/27/99 8:25p Markd +// added pengingevents and fixed some event holes +// +// 11 8/27/99 3:30p Markd +// put in event caching system so that events are reused +// +// 10 8/19/99 12:16p Jimdose +// added event stats +// added lru check to FindEvent +// +// 9 8/09/99 5:07p Aldie +// More changes to accomodate weapons system +// +// DESCRIPTION: +// +// WARNING: This file is shared between fgame, cgame and possibly the user interface. +// It is instanced in each one of these directories because of the way that SourceSafe works. +// + +// +// this has to be placed in front of the __LISTENER_H__ +// if it is not, listener.cpp will not compile +// +#if defined( GAME_DLL ) +// +// game dll specific defines +// +#include "g_local.h" + +#endif + +#ifndef __LISTENER_H__ +#define __LISTENER_H__ + +#if defined( GAME_DLL ) +// +// game dll specific defines +// +#define EVENT_DebugPrintf gi.DebugPrintf +#define EVENT_DPrintf gi.DPrintf +#define EVENT_Printf gi.Printf +#define EVENT_time level.time +#define EVENT_realtime gi.Milliseconds() +#define EVENT_Error gi.Error + +#define EVENT_FILENAME "events.txt" + +class Entity; +class ScriptVariable; +class ScriptThread; +class Archiver; + +#elif defined ( CGAME_DLL ) +// +// cgame dll specific defines +// +#include "cg_local.h" +#include "vector.h" +#include "str.h" +#include "../qcommon/qcommon.h" + +#define EVENT_DebugPrintf cgi.DebugPrintf +#define EVENT_DPrintf cgi.Printf +#define EVENT_Printf cgi.Printf +#define EVENT_time ( ( ( float )cg.time / 1000.0f ) ) +#define EVENT_realtime cgi.Milliseconds() +#define EVENT_Error cgi.Error + +#define EVENT_FILENAME "cg_events.txt" + +#elif defined ( UI_LIB ) + +#include "../fgame/q_shared.h" +#include "vector.h" +#include "str.h" +#include "../qcommon/qcommon.h" +#include "ui_local.h" + +#define EVENT_DebugPrintf Com_DebugPrintf +#define EVENT_DPrintf Com_Printf +#define EVENT_Printf Com_Printf +#define EVENT_time ( ( ( float )cls.realtime / 1000.0f ) ) +#define EVENT_realtime Sys_Milliseconds() +#define EVENT_Error Com_Error + +#define EVENT_FILENAME "ui_events.txt" + +#else + +// +// client specific defines +// +#include "../fgame/q_shared.h" +#include "vector.h" +#include "str.h" +#include "../qcommon/qcommon.h" + +#define EVENT_DebugPrintf Com_DebugPrintf +#define EVENT_DPrintf Com_Printf +#define EVENT_Printf Com_Printf +#define EVENT_time ( ( ( float )cls.realtime / 1000.0f ) ) +#define EVENT_realtime Sys_Milliseconds() +#define EVENT_Error Com_Error + +#define EVENT_FILENAME "cl_events.txt" +#endif + +#include "class.h" +#include "container.h" + +typedef enum + { + EV_FROM_CODE, + EV_FROM_CONSOLE, + EV_FROM_SCRIPT, + EV_FROM_ANIMATION + } eventsource_t; + +// Posted Event Flags +#define EVENT_LEGS_ANIM (1<<0) // this event is associated with an animation for the legs +#define EVENT_TORSO_ANIM (1<<1) // this event is associated with an animation for the torso +#define EVENT_DIALOG_ANIM (1<<2) // this event is associated with an animation for dialog lip syncing + + +// Event flags +#define EV_CONSOLE (1<<0) // Allow entry from console +#define EV_CHEAT (1<<1) // Only allow entry from console if cheats are enabled +#define EV_HIDE (1<<2) // Hide from eventlist +#define EV_CACHE (1<<3) // This event is used to cache data in + +#define EV_DEFAULT -1 // default flags + +#define INUSE_BITS 2 +#define MAX_EVENT_USE ( ( 1 << INUSE_BITS ) - 1 ) + +typedef enum + { + IS_STRING, + IS_VECTOR, + IS_BOOLEAN, + IS_INTEGER, + IS_FLOAT, + IS_ENTITY, + IS_SCRIPTVARIABLE + } vartype; + +#define DIRTY_STRING ( 1 << 0 ) +#define DIRTY_VECTOR ( 1 << 1 ) +#define DIRTY_INTEGER ( 1 << 2 ) +#define DIRTY_FLOAT ( 1 << 3 ) + +#define DIRTY_ALL ( 0x7fff ) + +class EventVar : public Class + { + private: + short type; + short dirtyFlags; + str stringValue; + Vector vectorValue; + int intValue; + float floatValue; + + public: + + EventVar() + { + type = IS_INTEGER; + dirtyFlags = DIRTY_ALL; + intValue = 0; + floatValue = 0; + }; + + EventVar( EventVar &ev ) + { + type = ev.type; + dirtyFlags = ev.dirtyFlags; + intValue = ev.intValue; + floatValue = ev.floatValue; + }; + + EventVar( const char *text ); + EventVar( str &text ); + + EventVar( int val ) + { + type = IS_INTEGER; + dirtyFlags = DIRTY_ALL & ~DIRTY_INTEGER; + intValue = val; + }; + + EventVar( float val ) + { + type = IS_FLOAT; + dirtyFlags = DIRTY_ALL & ~DIRTY_FLOAT; + floatValue = val; + }; + + EventVar( Vector &vec ) + { + type = IS_VECTOR; + dirtyFlags = DIRTY_ALL & ~DIRTY_VECTOR; + vectorValue = vec; + }; + +#ifdef GAME_DLL + EventVar( Entity *ent ); +#endif + + const char *GetToken( Event &ev ); + const char *GetString( Event &ev ); + qboolean GetBoolean( Event &ev ); + int GetInteger( Event &ev ); + float GetFloat( Event &ev ); + Vector GetVector( Event &ev ); +#ifdef GAME_DLL + Entity *GetEntity( Event &ev ); + ScriptVariable *GetVariable( Event &ev ); +#endif + + qboolean IsVector( Event &ev ); + qboolean IsNumeric( Event &ev ); + +#ifdef GAME_DLL + void Archive( Archiver &arc ); +#endif + }; + + +class EventArgDef : public Class + { + private: + int type; + str name; + float minRange[ 3 ]; + qboolean minRangeDefault[ 3 ]; + float maxRange[ 3 ]; + qboolean maxRangeDefault[ 3 ]; + qboolean optional; + public: + + EventArgDef() + { + type = IS_INTEGER; + //name = "undefined"; + optional = qfalse; + }; + void Setup( const char * eventName, const char *argName, const char *argType, const char *argRange ); + void PrintArgument( FILE *event_file = NULL ); + void PrintRange( FILE *event_file = NULL ); +#if 0 +#ifdef GAME_DLL + void Archive( Archiver &arc ); +#endif +#endif + }; + + + +#ifndef GAME_DLL +extern "C" + { + // interface functions + void L_ProcessPendingEvents( void ); + void L_ClearEventList( void ); + void L_InitEvents( void ); + void L_ShutdownEvents( void ); + } +#endif + + +class Listener; +typedef SafePtr ListenerPtr; + + +class Event : public Class + { + private: + friend class Listener; + + typedef struct EventInfo + { + unsigned inuse : INUSE_BITS; // must change MAX_EVENT_USE to reflect maximum number stored here + unsigned source : 2; + unsigned flags : 9; + unsigned linenumber : 19; // linenumber does double duty in the case of the console commands + } EventInfo_t; + + int eventnum; + EventInfo info; + const char *name; + const char *formatspec; + const char *argument_names; + const char *documentation; + Container *data; + Container *definition; + int threadnum; + short anim_number; + short anim_frame; + SafePtr m_sourceobject; + + //Listener *obj; + float time; + int flags; + + Event( int num ); + static void initCommandList( void ); + static void InitializeEventLists( void ); + static void ShutdownEventLists( void ); + static void InitializeDocumentation( void ); + static void ShutdownDocumentation( void ); + + static int numfinds; + static int numfirstsearch; + static int numcompares; + static int lastevent; + static bool EventSystemStarted; + + friend void L_ProcessPendingEvents( void ); + friend void L_ClearEventList( void ); + friend void L_InitEvents( void ); + friend void L_ShutdownEvents( void ); + +#ifdef GAME_DLL + friend void L_ArchiveEvents( Archiver &arc ); + friend void L_UnarchiveEvents( Archiver &arc ); + +#endif + + static Container *commandList; + static Container *flagList; + static Container *sortedList; + static Container *eventDefList; + static qboolean dirtylist; + + static int compareEvents( const void *arg1, const void *arg2 ); + static void SortEventList( void ); + static int FindEvent( const char *name ); + static int FindEvent( str &name ); + static void PrintEvent( Event *ev ); + + public: + CLASS_PROTOTYPE( Event ); + + Event *next; // next event in the list, used for event recycling + Event *prev; // previous event int the list, used for event recycling + + void * operator new( size_t ); + void operator delete( void * ); + + static int NumEventCommands( void ); + static void ListCommands( const char *mask = NULL ); + static void ListDocumentation( const char *mask, qboolean print_to_file = qfalse ); + static void PendingEvents( const char *mask = NULL ); + static void PrintEventDocumentation( Event * event, FILE *event_file = NULL, qboolean html = qfalse ); + static int MapSortedEventIndex( int index ); + + Event(); + Event( Event &ev ); + Event( Event *ev ); + Event + ( + const char *command, + int flags, + const char *formatspec, + const char *argument_names, + const char *documentation + ); + Event( const char *command ); + Event( str &command ); + ~Event(); + + void SetupDocumentation( void ); + void DeleteDocumentation( void ); + void PrintDocumentation( FILE *event_file = NULL, qboolean html = qfalse ); + + str getName( void ); + + void SetSource( eventsource_t source ); + void SetLineNumber( int linenumber ); + void SetSourceObject( Listener *source ); + Listener *GetSourceObject( void ); + SafePtr *GetSourceObjectPointer( void ); + + eventsource_t GetSource( void ); + int GetLineNumber( void ); + int GetAnimationNumber( void ); + int GetAnimationFrame( void ); + void SetAnimationNumber( int anim ); + void SetAnimationFrame( int frame ); + + int GetFlags( void ); + + void Error( const char *fmt, ... ); + + static Event Find( const char *command ); + static qboolean Exists( const char *command ); + static Event Find( str &command ); + + Event& printInfo(void); + + friend bool operator==( const Event &a, const Event &b ); + friend bool operator!=( const Event &a, const Event &b ); + void operator=( const Event &ev ); + + operator int(); + operator const char *(); + + int NumArgs( void ); + + qboolean IsVectorAt( int pos ); + qboolean IsEntityAt( int pos ); + qboolean IsNumericAt( int pos ); + + const char *GetToken( int pos ); + const char *GetString( int pos ); + int GetInteger( int pos ); + float GetFloat( int pos ); + Vector GetVector( int pos ); + bool GetBoolean( int pos ); + + void AddToken( const char *text ); + void AddTokens( int argc, const char **argv ); + void AddString( const char *text ); + void AddString( str &text ); + void AddInteger( int val ); + void AddFloat( float val ); + void AddVector( Vector &vec ); + +#ifdef GAME_DLL + void AddEntity( Entity *ent ); + Entity *GetEntity( int pos ); + ScriptVariable *GetVariable( int pos ); + void SetThread( ScriptThread *thread ); + ScriptThread *GetThread( void ); + void SetConsoleEdict( gentity_t *consoleedict ); + gentity_t *GetConsoleEdict( void ); + + virtual void Archive( Archiver &arc ); +#endif + }; + +extern Event NullEvent; +extern Event EV_Remove; + +class Listener; + +class Listener : public Class + { + private: + void ScriptRemove( Event *e ); + + protected: + qboolean CheckEventFlags( Event *event ); + + public: + CLASS_PROTOTYPE( Listener ); + + ~Listener(); + void Remove( Event *e ); + qboolean ValidEvent( Event &e ); + qboolean ValidEvent( const char *name ); + qboolean EventPending( Event &ev ); + qboolean ProcessEvent( Event *event ); + qboolean ProcessEvent( Event &event ); + void PostEvent( Event *event, float time, int flags = 0 ); + void PostEvent( Event &event, float time, int flags = 0 ); + qboolean PostponeEvent( Event &event, float time ); + qboolean PostponeEvent( Event *event, float time ); + void CancelEventsOfType( Event *event ); + void CancelEventsOfType( Event &event ); + void CancelFlaggedEvents( int flags ); + void CancelPendingEvents( void ); + qboolean ProcessPendingEvents( void ); + }; + +inline void Event::SetSourceObject + ( + Listener *source + ) + + { + m_sourceobject = source; + } + +inline Listener *Event::GetSourceObject + ( + void + ) + + { + return m_sourceobject; + } + +inline SafePtr *Event::GetSourceObjectPointer + ( + void + ) + + { + return &m_sourceobject; + } + +inline qboolean Event::Exists + ( + const char *command + ) + + { + int num; + str c; + + if ( !commandList ) + { + initCommandList(); + } + + c = command; + num = FindEvent( c ); + if ( num ) + { + return true; + } + + return false; + } + + +inline Event Event::Find + ( + const char *command + ) + + { + int num; + str c; + + if ( !commandList ) + { + initCommandList(); + } + + c = command; + num = FindEvent( c ); + if ( num ) + { + Event ev( num ); + return ev; + } + + return NullEvent; + } + +inline Event Event::Find + ( + str &command + ) + + { + int num; + + if ( !commandList ) + { + initCommandList(); + } + + num = FindEvent( command ); + if ( num ) + { + Event ev( num ); + return ev; + } + + return NullEvent; + } + +inline void Event::SetSource + ( + eventsource_t source + ) + + { + info.source = ( unsigned )source; + } + +inline void Event::SetLineNumber + ( + int linenumber + ) + + { + info.linenumber = linenumber; + } + +inline eventsource_t Event::GetSource + ( + void + ) + + { + return ( eventsource_t )info.source; + } + +inline int Event::GetAnimationNumber + ( + void + ) + + { + return anim_number; + } + +inline int Event::GetAnimationFrame + ( + void + ) + + { + return anim_frame; + } + +inline void Event::SetAnimationNumber + ( + int anim + ) + + { + anim_number = anim; + } + +inline void Event::SetAnimationFrame + ( + int frame + ) + + { + anim_frame = frame; + } + +inline int Event::GetLineNumber + ( + void + ) + + { + // linenumber does double duty in the case of the console commands + if ( info.source == EV_FROM_SCRIPT ) + { + return info.linenumber; + } + + return 0; + } + +inline int Event::GetFlags + ( + void + ) + + { + return info.flags; + } + +inline str Event::getName + ( + void + ) + + { + assert( name || !eventnum ); + + if ( !name ) + { + return "NULL"; + } + + return name; + } + +inline Event& Event::printInfo + ( + void + ) + + { + EVENT_DPrintf( "event '%s' is number %d\n", getName().c_str(), eventnum ); + + return *this; + } + +inline bool operator== + ( + const Event &a, + const Event &b + ) + + { + return a.eventnum == b.eventnum; + } + +inline bool operator!= + ( + const Event &a, + const Event &b + ) + + { + return a.eventnum != b.eventnum; + } + +inline void Event::operator= + ( + const Event &ev + ) + { + eventnum = ev.eventnum; + info = ev.info; + if ( ev.data ) + { + int i; + + data = new Container; + data->Resize( ev.data->NumObjects() ); + for( i = 1; i < ev.data->NumObjects(); i++ ) + { + data->AddObject( ev.data->ObjectAt( i ) ); + } + } + name = ev.name; + definition = NULL; + threadnum = ev.threadnum; + anim_number = ev.anim_number; + anim_frame = ev.anim_frame; + m_sourceobject = ev.m_sourceobject; + time = ev.time; + flags = ev.flags; + } + + +inline Event::operator int() + { + return eventnum; + } + +inline Event::operator const char *() + { + return getName().c_str(); + } + +inline int Event::NumArgs + ( + void + ) + + { + if ( !data ) + { + return 0; + } + + return ( data->NumObjects() ); + } + +#ifdef GAME_DLL +inline void Event::AddEntity + ( + Entity *ent + ) + + { + if ( !data ) + { + data = new Container; + data->Resize( 1 ); + } + + + EventVar var( ent ); + data->AddObject( var ); + } +#endif + +inline void Event::AddToken + ( + const char *text + ) + + { + if ( !data ) + { + data = new Container; + data->Resize( 1 ); + } + + EventVar var( text ); + data->AddObject( var ); + } + +inline void Event::AddTokens + ( + int argc, + const char **argv + ) + + { + int i; + + if ( !data ) + { + data = new Container; + data->Resize( argc ); + } + + for( i = 0; i < argc; i++ ) + { + assert( argv[ i ] ); + EventVar var( argv[ i ] ); + data->AddObject( var ); + } + } + +inline void Event::AddString + ( + const char *text + ) + + { + if ( !data ) + { + data = new Container; + data->Resize( 1 ); + } + + EventVar var( text ); + data->AddObject( var ); + } + +inline void Event::AddString + ( + str &text + ) + + { + if ( !data ) + { + data = new Container; + data->Resize( 1 ); + } + + EventVar var( text ); + data->AddObject( var ); + } + +inline void Event::AddInteger + ( + int val + ) + + { + if ( !data ) + { + data = new Container; + data->Resize( 1 ); + } + + EventVar var( val ); + data->AddObject( var ); + } + +inline void Event::AddFloat + ( + float val + ) + + { + if ( !data ) + { + data = new Container; + data->Resize( 1 ); + } + + EventVar var( val ); + data->AddObject( var ); + } + +inline void Event::AddVector + ( + Vector &vec + ) + + { + if ( !data ) + { + data = new Container; + data->Resize( 1 ); + } + + EventVar var( vec ); + data->AddObject( var ); + } + +inline const char *Event::GetToken + ( + int pos + ) + + { + if ( !data || ( pos < 1 ) || ( data->NumObjects() < pos ) ) + { + Error( "Index %d out of range.", pos ); + return ""; + } + + return data->ObjectAt( pos ).GetToken( *this ); + } + +inline const char *Event::GetString + ( + int pos + ) + + { + if ( !data || ( pos < 1 ) || ( data->NumObjects() < pos ) ) + { + Error( "Index %d out of range.", pos ); + return ""; + } + + return data->ObjectAt( pos ).GetString( *this ); + } + +inline int Event::GetInteger + ( + int pos + ) + + { + if ( !data || ( pos < 1 ) || ( data->NumObjects() < pos ) ) + { + Error( "Index %d out of range.", pos ); + return 0; + } + + return data->ObjectAt( pos ).GetInteger( *this ); + } + +inline float Event::GetFloat + ( + int pos + ) + + { + if ( !data || ( pos < 1 ) || ( data->NumObjects() < pos ) ) + { + Error( "Index %d out of range.", pos ); + return 0; + } + + return data->ObjectAt( pos ).GetFloat( *this ); + } + +inline Vector Event::GetVector + ( + int pos + ) + + { + if ( !data || ( pos < 1 ) || ( data->NumObjects() < pos ) ) + { + Error( "Index %d out of range.", pos ); + return vec_zero; + } + + return data->ObjectAt( pos ).GetVector( *this ); + } + +inline bool Event::GetBoolean + ( + int pos + ) + + { + int val; + + val = this->GetInteger( pos ); + + return ( val != 0 ) ? true : false; + } + +#ifdef GAME_DLL + +inline Entity *Event::GetEntity + ( + int pos + ) + + { + if ( !data || ( pos < 1 ) || ( data->NumObjects() < pos ) ) + { + Error( "Index %d out of range.", pos ); + return NULL; + } + + return data->ObjectAt( pos ).GetEntity( *this ); + } + +inline ScriptVariable *Event::GetVariable + ( + int pos + ) + + { + if ( !data || ( pos < 1 ) || ( data->NumObjects() < pos ) ) + { + Error( "Index %d out of range.", pos ); + return NULL; + } + + return data->ObjectAt( pos ).GetVariable( *this ); + } + +#endif + +inline qboolean Listener::ProcessEvent + ( + Event &event + ) + + { + Event *ev; + + ev = new Event( event ); + return ProcessEvent( ev ); + } + +inline void Listener::PostEvent + ( + Event &event, + float time, + int flags + ) + + { + Event *ev; + + ev = new Event( event ); + PostEvent( ev, time, flags ); + } + +inline qboolean Listener::PostponeEvent + ( + Event *event, + float time + ) + + { + return PostponeEvent( *event, time ); + } + +inline void Listener::CancelEventsOfType + ( + Event &event + ) + + { + CancelEventsOfType( &event ); + } + +#endif + diff --git a/source/source/fgame/misc.cpp b/source/source/fgame/misc.cpp new file mode 100644 index 0000000..5bacc89 --- /dev/null +++ b/source/source/fgame/misc.cpp @@ -0,0 +1,3757 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/misc.cpp $ +// $Revision:: 100 $ +// $Author:: Markd $ +// $Date:: 7/30/00 6:27p $ +// +// Copyright (C) 1997 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/misc.cpp $ +// +// 100 7/30/00 6:27p Markd +// changed default animation from push to stand_use +// +// 98 7/30/00 2:54p Markd +// made horizontalpipe and monkeybars notsolid for the camera +// +// 97 7/29/00 1:26p Steven +// Took out teleport sounds (are in the effect now). +// +// 96 7/27/00 9:52p Markd +// got keyed triggers to work correctly +// +// 95 7/27/00 6:31p Markd +// made useAnim's work with doors, added key ability +// +// 92 7/25/00 10:37p Markd +// fallingrocks have default bounce sounds now +// +// 91 7/24/00 11:57p Markd +// fixed edenwater sounds +// +// 90 7/21/00 12:34p Markd +// increased default code from 60 degrees to 90 +// +// 89 7/19/00 5:08p Steven +// Added some caching stuff for teleporters. +// +// 88 7/18/00 3:29p Markd +// added better caching for sounds in general +// +// 87 7/17/00 4:58p Markd +// fixed useobjects and skins +// +// 86 7/16/00 5:34p Aldie +// Fix effect for teleporters. +// +// 85 7/14/00 11:45p Markd +// Added ambient sounds to func_supllywater +// +// 84 7/14/00 5:59p Steven +// Added another good sound to the teleporter. +// +// 83 7/11/00 9:28p Markd +// Added MaxWater event to func_watersupply +// +// 82 7/11/00 7:08p Steven +// Made teleport stuff cooler. +// +// 81 7/10/00 11:54p Markd +// added exit level code +// +// 80 7/10/00 5:09p Markd +// changed water supply so that it would only give up to 50 percent water +// +// 79 7/08/00 7:09p Steven +// Made teleport sound not get played if no_effects spawnflag is set. +// +// 78 7/07/00 6:38p Steven +// Forgot to put in QUAKED comment. +// +// 77 7/07/00 4:32p Steven +// Teleporter stuff : no_effects flag, warp sentient to middle of teleporter +// and fixed some teleporting multiple times problems. +// +// 76 7/06/00 9:54p Markd +// simplified code +// +// 75 7/06/00 6:25p Steven +// Added new teleport stuff. +// +// 74 7/03/00 6:59p Steven +// Setup default pushobject sound, improved pushobject loop sounds a little, +// and setup a default falling rock sound. +// +// 73 6/28/00 4:17p Markd +// fixed small UseAnim bug +// +// 72 6/28/00 3:41p Markd +// added better documentation +// +// 71 6/25/00 3:10p Markd +// Tweaked TouchAnim's so that they would not multi-trigger +// +// 70 6/25/00 2:51p Markd +// made use objects easier to use +// +// 69 6/23/00 8:41p Markd +// made a lot of changes to different constructors for saved game support +// +// 68 6/14/00 4:13p Markd +// +// 67 6/14/00 3:50p Markd +// Cleaned up more Intel Compiler warnings +// +// 66 6/13/00 6:41p Markd +// Fixed pushing and pulling of objects +// +// 65 6/09/00 7:36p Markd +// Added activate and deactive to useobjects +// +// 64 6/09/00 2:05p Markd +// bullet proofed falling rock code +// +// 63 6/09/00 11:54a Markd +// fixed falling rock code again... +// +// 62 6/07/00 5:37p Markd +// got rid of debugging stuff +// +// 61 6/07/00 5:36p Markd +// fixed falling rock code +// +// 60 6/04/00 6:52p Markd +// Added camera support to TouchAnim's cleaned up player camera interface +// +// 59 6/04/00 6:16p Markd +// Added TouchAnim support +// +// 58 5/31/00 5:32p Steven +// Marked use objects as things for Julie to look at. +// +// 57 5/03/00 11:46a Markd +// Made PushObjects trigger stuff +// +// 56 5/03/00 10:00a Markd +// automatically kill toss objects after a preset amount of time if they don't +// come to rest +// +// 55 4/30/00 2:46p Markd +// allowed falling rocks to trigger threads at waypoints +// +// 54 4/24/00 6:20p Markd +// fixed toss objects so that they would be solid when falling +// +// 53 4/21/00 6:16p Markd +// Fixed bounce sound stuff +// +// 52 4/21/00 3:00p Markd +// fixed up TossObjects so that they would work properly +// +// 51 4/19/00 9:25a Markd +// added bouncesound to falling rock code +// +// 50 4/18/00 11:44a Markd +// Added NO_RANDOMNESS flag to falling rock code +// +// 49 4/06/00 6:18p Markd +// made UseObjects and UseAnim's not climable +// +// 48 4/06/00 5:45p Aldie +// Added func_supplywater +// +// 47 4/05/00 12:20p Markd +// added damage type +// +// 46 4/04/00 5:30p Markd +// Removed sounds from UseObject +// +// 45 3/31/00 6:07p Markd +// improved the functionality of UseObjects +// +// 44 3/31/00 3:26p Markd +// Removed options from func_useobject +// +// 43 3/31/00 3:19p Markd +// Added UseObject functionality +// +// 42 3/29/00 4:21p Markd +// Made falling rocks take into account their local gravity variable +// +// 41 3/27/00 3:45p Markd +// Hooked up UseAnim state info into the game +// +// 40 3/21/00 5:05p Markd +// Added state variable to func_useanim_destination +// +// 39 3/20/00 3:01p Markd +// added more functionality to falling rock +// +// 38 3/18/00 2:43p Aldie +// Changed some func_spawn functionality +// +// 37 3/16/00 10:20a Markd +// fixed useanim firing its targets before the animation was completed +// +// 36 3/15/00 5:52p Aldie +// Added pushsound to func_pushobject and removed a printf. +// +// 35 3/13/00 7:46p Jimdose +// added fallingrock +// +// 34 3/01/00 10:59a Jimdose +// UseAnim now sends the entity that used it as the activator instead of itself +// when triggering targets +// +// 33 2/26/00 9:51a Markd +// forgot to reset num_loops back to 1 +// +// 32 2/25/00 7:27p Markd +// Added useanim_numloop support and fixed useanim_orientation +// +// 31 2/24/00 3:17p Jimdose +// made UseAnims solid on client when not touchable +// added canBeUsed to UseAnim +// added canPush to PushObject +// +// 30 2/22/00 6:57p Jimdose +// pushobjects now do damage when blocked +// push objects are now solid_bsp +// +// 29 2/22/00 1:57p Jimdose +// added PushObject +// +// 28 2/14/00 5:43p Jimdose +// initialized dir in MonkeyBars and HorizontalPipe +// +// 27 2/02/00 7:14p Markd +// Added func_explodeobject and TossObject +// +// 26 1/31/00 4:26p Jimdose +// added dir variable to monkeybar and horizontalpipe +// +// 25 1/27/00 11:35a Markd +// Fixed solid/notsolid client side entities +// +// 24 1/22/00 12:42p Jimdose +// got rid of calls to vec3() +// added func_horizontalpipe +// +// 23 1/20/00 6:54p Aldie +// Removed bloodsplats until we do them the right way +// +// 22 1/19/00 7:46p Aldie +// Fixed func_spawns of various types and removed some unused misc classes +// +// 21 1/19/00 5:16p Markd +// Added thread and triggertarget to UseAnim +// +// 20 1/18/00 2:38p Markd +// Made UseAnim not multi-trigger by default +// +// 19 1/15/00 3:57p Markd +// Eliminated multiple "angle" events and replaced them with EV_SetAngle +// +// 18 1/15/00 1:36p Markd +// Added UseAnim and TouchUseAnim functionality to Player and game +// +// 17 1/14/00 5:07p Markd +// Removed surface num, tri_num and damage_multiplier from multiple functions +// and events +// +// 16 1/12/00 8:17p Markd +// Fixed teleporter code so that the camera cut occurred properly +// +// 15 1/12/00 6:15p Jimdose +// added base_velocity and random_velocity +// rewrote CreateExplosion +// +// 14 1/06/00 11:08p Jimdose +// cleaning up unused code +// +// 13 12/17/99 6:35p Jimdose +// changed spawnarg code +// added Level class for spawning and map control +// got rid of unused or superflous variables +// changed setjmp/longjmp calls to try/throw/catch exception handling +// +// 12 12/14/18 2:44p Jimdose +// added func_monkeybar +// +// 11 11/23/99 6:09p Markd +// fixed spawning entities which wouldn't fall automatically +// +// 10 11/08/99 10:43a Phook +// changed the color of func_group +// +// 9 11/04/99 10:03a Markd +// complete overhaul of the camera system +// +// 8 10/14/99 5:08p Markd +// removed a lot of G_GetMoveDir calls from the initialization code +// +// 7 10/07/99 3:00p Steven +// Event formatting. +// +// 6 9/29/99 5:18p Steven +// Event formatting. +// +// 5 9/23/99 7:30p Markd +// Added misc_model support and fixed shadows +// +// 4 9/22/99 4:48p Markd +// fixed more G_GetEntity, G_FindClass and G_GetNextEntity bugs +// +// 3 9/21/99 7:51p Markd +// Fixed a lot of entitynum_none issues +// +// 2 9/16/99 11:18a Markd +// Continuing merge of code, not functional yet but closer +// +// 1 9/10/99 10:54a Jimdose +// +// 1 9/08/99 3:16p Aldie +// +// 28 8/29/99 4:48p Markd +// Added back detail entity +// +// 27 8/28/99 3:26p Markd +// got rid of sv_maxbloodsplats +// +// 26 8/28/99 11:45a Steven +// Removed global from sound function calls. +// +// 25 8/18/99 3:28p Jimdose +// added cylindrical collision detection +// +// 24 7/08/99 4:56p Markd +// removed areaportal.h includes +// +// 23 7/08/99 4:28p Markd +// Removed obsolete QUAKED functions +// +// 22 6/11/99 2:20p Phook +// Renamed a few entities +// +// 21 6/11/99 1:23p Phook +// +// 20 6/11/99 12:58p Phook +// Changed from SINED comments to QUAKED +// +// 19 6/11/99 12:46p Phook +// EClass color changes +// +// DESCRIPTION: +// Basically the big stew pot of the DLLs, or maybe a garbage bin, whichever +// metaphore you prefer. This really should be cleaned up. Anyway, this +// should contain utility functions that could be used by any entity. +// Right now it contains everything from entities that could be in their +// own file to my mother's pot roast recipes. +// + +#include "g_local.h" +#include "entity.h" +#include "trigger.h" +#include "explosion.h" +#include "misc.h" +#include "navigate.h" +#include "specialfx.h" +#include "player.h" +#include "g_utils.h" +#include "weaputils.h" + +/*****************************************************************************/ +/*QUAKED detail (0.5 0 1.0) ? + +Used to fake detail brushes, convenient for grouping + +******************************************************************************/ + +/*****************************************************************************/ +/*QUAKED func_group (0.5 0.5 0.5) ? + +Used to group brushes together just for editor convenience. + +******************************************************************************/ + +/*****************************************************************************/ +/*QUAKED func_remove (0.75 0.75 0.75) ? + +Used for lighting and such + +******************************************************************************/ + +CLASS_DECLARATION( Entity, FuncRemove, "func_remove" ) + { + { NULL, NULL } + }; + +FuncRemove::FuncRemove() + { + PostEvent( EV_Remove, EV_REMOVE ); + } + +/*****************************************************************************/ +/*QUAKED misc_model (1 0.5 1) (0 0 0) (0 0 0) +"model" arbitrary .tik file to display +******************************************************************************/ + +CLASS_DECLARATION( Entity, MiscModel, "misc_model" ) + { + { NULL, NULL } + }; + +MiscModel::MiscModel() + { + PostEvent( EV_Remove, EV_REMOVE ); + } + + +/*****************************************************************************/ +/*QUAKED info_null (0 0.5 0) (-4 -4 -4) (4 4 4) + +Used as a positional target for spotlights, etc. + +******************************************************************************/ + +CLASS_DECLARATION( Entity, InfoNull, "info_null" ) + { + { NULL, NULL } + }; + +InfoNull::InfoNull() + { + PostEvent( EV_Remove, EV_REMOVE ); + } + +/*****************************************************************************/ +/*QUAKED info_notnull (0 0.5 0) (-4 -4 -4) (4 4 4) + +Used as a positional target for lightning. + +******************************************************************************/ + +CLASS_DECLARATION( Entity, InfoNotNull, "info_notnull" ) + { + { NULL, NULL } + }; + + + +/*****************************************************************************/ +/*QUAKED func_explodingwall (0 0.25 0.5) ? RANDOMANGLES LANDSHATTER NOT_PLAYERS MONSTERS PROJECTILES INVISIBLE ACCUMALATIVE TWOSTAGE + +Blows up on activation or when attacked + +"explosions" number of explosions to spawn ( default 1 ) +"land_angles" The angles you want this piece to\ + orient to when it lands on the ground +"land_radius" The distance of the ground the piece\ + should be when on the ground ( default 16 ) +"anglespeed" Speed at which pieces rotate ( default 100 ) \ + if RANDOMANGLES ( default is 600 ) +"key" The item needed to activate this. (default nothing) +"base_velocity" The speed that the debris will have when triggered. (default 0 0 280) +"random_velocity" The variation of the velocity. x & y will be from -n < X,Y < n and z is 0 <= Z < n. (default 140 140 140) + + +IF RANDOMANGLES is set, object randomly spins while in the air. +IF LANDSHATTER is set, object shatters when it hits the ground. +IF TWOSTAGE is set, object can be shattered once it lands on the ground. +IF ACCUMALATIVE is set, damage is accumlative not threshold +IF INVISIBLE is set, these are invisible and not solid until triggered +If NOT_PLAYERS is set, the trigger does not respond to players +If MONSTERS is set, the trigger will respond to monsters +If PROJECTILES is set, the trigger will respond to projectiles (rockets, grenades, etc.) + +******************************************************************************/ +#define RANDOMANGLES ( 1 << 0 ) +#define LANDSHATTER ( 1 << 1 ) +#define INVISIBLE ( 1 << 5 ) +#define ACCUMULATIVE ( 1 << 6 ) +#define TWOSTAGE ( 1 << 7 ) + +Event EV_ExplodingWall_StopRotating + ( + "stoprotating", + EV_DEFAULT, + NULL, + NULL, + "Stop rotating the wall." + ); +Event EV_ExplodingWall_OnGround + ( + "checkonground", + EV_DEFAULT, + NULL, + NULL, + "Check if exploding wall is on ground." + ); +Event EV_ExplodingWall_AngleSpeed + ( + "anglespeed", + EV_DEFAULT, + "f", + "speed", + "Set the angle speed." + ); +Event EV_ExplodingWall_LandRadius + ( + "land_radius", + EV_DEFAULT, + "f", + "radius", + "Set the land radius." + ); +Event EV_ExplodingWall_LandAngles + ( + "land_angles", + EV_DEFAULT, + "v", + "angles", + "Set the land angles." + ); +Event EV_ExplodingWall_BaseVelocity + ( + "base_velocity", + EV_DEFAULT, + "v", + "velocity", + "Set the base velocity." + ); +Event EV_ExplodingWall_RandomVelocity + ( + "random_velocity", + EV_DEFAULT, + "v", + "velocity", + "Set the amount of random variation of the base velocity." + ); +Event EV_ExplodingWall_SetDmg + ( + "dmg", + EV_DEFAULT, + "i", + "dmg", + "Set the damage from the exploding wall." + ); +Event EV_ExplodingWall_SetExplosions + ( + "explosions", + EV_DEFAULT, + "i", + "explosions", + "Set the number of explosions." + ); +Event EV_ExplodingWall_Setup + ( + "setup", + EV_HIDE, + NULL, + NULL, + "Initializes the exploding wall." + ); + +CLASS_DECLARATION( Trigger, ExplodingWall, "func_explodingwall" ) + { + { &EV_ExplodingWall_Setup, Setup }, + { &EV_Trigger_Effect, Explode }, + { &EV_Damage, DamageEvent }, + { &EV_Touch, TouchFunc }, + { &EV_ExplodingWall_StopRotating, StopRotating }, + { &EV_ExplodingWall_OnGround, CheckOnGround }, + { &EV_ExplodingWall_AngleSpeed, AngleSpeed }, + { &EV_ExplodingWall_LandRadius, LandRadius }, + { &EV_ExplodingWall_LandAngles, LandAngles }, + { &EV_ExplodingWall_BaseVelocity, BaseVelocity }, + { &EV_ExplodingWall_RandomVelocity, RandomVelocity }, + { &EV_ExplodingWall_SetDmg, SetDmg }, + { &EV_ExplodingWall_SetExplosions, SetExplosions }, + { NULL, NULL } + }; + +void ExplodingWall::AngleSpeed + ( + Event *ev + ) + + { + angle_speed = ev->GetFloat( 1 ); + } + +void ExplodingWall::LandRadius + ( + Event *ev + ) + + { + land_radius = ev->GetFloat( 1 ); + } + +void ExplodingWall::LandAngles + ( + Event *ev + ) + + { + land_angles = ev->GetVector( 1 ); + } + +void ExplodingWall::BaseVelocity + ( + Event *ev + ) + + { + base_velocity = ev->GetVector( 1 ); + } + +void ExplodingWall::RandomVelocity + ( + Event *ev + ) + + { + random_velocity = ev->GetVector( 1 ); + } + +void ExplodingWall::SetDmg + ( + Event *ev + ) + + { + dmg = ev->GetInteger( 1 ); + } + +void ExplodingWall::SetExplosions + ( + Event *ev + ) + + { + explosions = ev->GetInteger( 1 ); + } + +void ExplodingWall::Explode + ( + Event *ev + ) + + { + Entity *other; + Vector pos; + Vector mins, maxs; + int i; + + if ( spawnflags & INVISIBLE ) + { + showModel(); + setSolidType( SOLID_BSP ); + takedamage = DAMAGE_YES; + } + + if ( takedamage == DAMAGE_NO ) + { + return; + } + + other = ev->GetEntity( 1 ); + + health = 0; + takedamage = DAMAGE_NO; + + // Create explosions + for( i = 0; i < explosions; i++ ) + { + pos[ 0 ] = absmin[ 0 ] + G_Random( size[ 0 ] ); + pos[ 1 ] = absmin[ 1 ] + G_Random( size[ 1 ] ); + pos[ 2 ] = absmin[ 2 ] + G_Random( size[ 2 ] ); + + CreateExplosion( pos, dmg, this, other, this ); + } + + // throw itself + state = 1; + on_ground = false; + PostEvent( EV_ExplodingWall_OnGround, FRAMETIME ); + + velocity.x = base_velocity.x + G_CRandom( random_velocity.x ); + velocity.y = base_velocity.y + G_CRandom( random_velocity.y ); + velocity.z = base_velocity.z + G_Random( random_velocity.z ); + + setMoveType( MOVETYPE_BOUNCE ); + setSolidType( SOLID_BBOX ); + if ( spawnflags & RANDOMANGLES ) + { + avelocity[ 0 ] = G_Random( angle_speed ); + avelocity[ 1 ] = G_Random( angle_speed ); + avelocity[ 2 ] = G_Random( angle_speed ); + } + else + { + Vector delta; + float most; + float time; + int t; + + delta = land_angles - angles; + if ( delta[ 0 ] > 180 ) + delta[ 0 ] -= 360; + if ( delta[ 0 ] < -180 ) + delta[ 0 ] += 360; + if ( delta[ 1 ] > 180 ) + delta[ 1 ] -= 360; + if ( delta[ 1 ] < -180 ) + delta[ 1 ] += 360; + if ( delta[ 2 ] > 180 ) + delta[ 2 ] -= 360; + if ( delta[ 2 ] < -180 ) + delta[ 2 ] += 360; + most = MaxValue( delta ); + if ( !angle_speed ) + angle_speed = 1; + t = 10 * most / angle_speed; + time = (float)t / 10; + delta = delta * (1.0/time); + avelocity = delta; + PostEvent( EV_ExplodingWall_StopRotating, time ); + state = 2; + } + + ActivateTargets( ev ); + + if ( land_radius > 0 ) + { + mins[0] = mins[1] = mins[2] = -land_radius; + maxs[0] = maxs[1] = maxs[2] = land_radius; + setSize( mins, maxs ); + } + + attack_finished = 0; + } + +void ExplodingWall::DamageEvent + ( + Event *ev + ) + + { + Event *event; + Entity *inflictor; + Entity *attacker; + int damage; + + if ( takedamage == DAMAGE_NO ) + { + return; + } + + if ( on_ground ) + { + GroundDamage( ev ); + return; + } + + damage = ev->GetInteger( 1 ); + inflictor = ev->GetEntity( 2 ); + attacker = ev->GetEntity( 3 ); + + if ( spawnflags & ACCUMULATIVE ) + { + health -= damage; + if ( health > 0 ) + return; + } + else + { + if ( damage < health ) + { + return; + } + } + + event = new Event( EV_Activate ); + event->AddEntity( attacker ); + ProcessEvent( event ); + } + +void ExplodingWall::GroundDamage + ( + Event *ev + ) + + { + Entity *inflictor; + Entity *attacker; + Vector pos; + int damage; + + if ( takedamage == DAMAGE_NO ) + { + return; + } + + damage = ev->GetInteger( 1 ); + inflictor = ev->GetEntity( 2 ); + attacker = ev->GetEntity( 3 ); + + if ( spawnflags & ACCUMULATIVE ) + { + health -= damage; + if ( health > 0 ) + return; + } + else + { + if ( damage < health ) + { + return; + } + } + + if ( explosions ) + { + pos[ 0 ] = absmin[ 0 ] + G_Random( size[ 0 ] ); + pos[ 1 ] = absmin[ 1 ] + G_Random( size[ 1 ] ); + pos[ 2 ] = absmin[ 2 ] + G_Random( size[ 2 ] ); + + CreateExplosion( pos, damage, this, attacker, this ); + } + takedamage = DAMAGE_NO; + hideModel(); + BroadcastSound(); + PostEvent( EV_Remove, 0 ); + } + +void ExplodingWall::SetupSecondStage + ( + void + ) + + { + health = max_health; + takedamage = DAMAGE_YES; + } + +void ExplodingWall::StopRotating + ( + Event *ev + ) + + { + avelocity = vec_zero; + setAngles( land_angles ); + if ( spawnflags & TWOSTAGE ) + SetupSecondStage(); + } + +void ExplodingWall::CheckOnGround + ( + Event *ev + ) + + { + if ( ( velocity == vec_zero ) && groundentity ) + { + Vector delta; + float most; + float time; + int t; + + delta = land_angles - angles; + if ( delta.length() > 1 ) + { + if ( delta[ 0 ] > 180 ) + delta[ 0 ] -= 360; + if ( delta[ 0 ] < -180 ) + delta[ 0 ] += 360; + if ( delta[ 1 ] > 180 ) + delta[ 1 ] -= 360; + if ( delta[ 1 ] < -180 ) + delta[ 1 ] += 360; + if ( delta[ 2 ] > 180 ) + delta[ 2 ] -= 360; + if ( delta[ 2 ] < -180 ) + delta[ 2 ] += 360; + most = MaxValue( delta ); + if ( angle_speed > 3 ) + t = 10.0f * most / ( angle_speed / 3 ); + else + t = 10.0f * most; + time = (float)t / 10; + delta = delta * (1.0/time); + avelocity = delta; + PostEvent( EV_ExplodingWall_StopRotating, time ); + } + state = 2; + setSize( orig_mins, orig_maxs ); + on_ground = true; + } + else + PostEvent( ev, FRAMETIME ); + } + +void ExplodingWall::TouchFunc + ( + Event *ev + ) + + { + Entity *other; + + if ( ( velocity == vec_zero ) || ( level.time < attack_finished ) ) + { + return; + } + + other = ev->GetEntity( 1 ); + + if ( ( spawnflags & LANDSHATTER ) && ( other == world ) ) + { + Vector pos; + + takedamage = DAMAGE_NO; + + if ( explosions ) + { + pos[ 0 ] = absmin[ 0 ] + G_Random( size[ 0 ] ); + pos[ 1 ] = absmin[ 1 ] + G_Random( size[ 1 ] ); + pos[ 2 ] = absmin[ 2 ] + G_Random( size[ 2 ] ); + + CreateExplosion( pos, dmg, this, other, this ); + } + hideModel(); + BroadcastSound(); + PostEvent( EV_Remove, 0 ); + return; + } + + if ( other->takedamage ) + { + other->Damage( this, activator, dmg, origin, vec_zero, vec_zero, 20, 0, MOD_EXPLODEWALL ); + Sound( "debris_generic", CHAN_WEAPON ); + attack_finished = level.time + FRAMETIME; + } + } + +void ExplodingWall::Setup + ( + Event *ev + ) + + { + if ( spawnflags & INVISIBLE ) + { + if ( Targeted() ) + takedamage = DAMAGE_YES; + else + takedamage = DAMAGE_NO; + hideModel(); + setSolidType( SOLID_NOT ); + } + else + { + showModel(); + setSolidType( SOLID_BSP ); + takedamage = DAMAGE_YES; + } + + setMoveType( MOVETYPE_PUSH ); + setOrigin(); + } + +ExplodingWall::ExplodingWall() + { + if ( LoadingSavegame ) + { + return; + } + + health = 60; + max_health = health; + on_ground = false; + + state = 0; + angle_speed = ( spawnflags & RANDOMANGLES ) ? 600 : 100; + land_radius = 16; + dmg = 10; + explosions = 1; + + base_velocity = Vector( 0, 0, 280 ); + random_velocity = Vector( 140, 140, 140 ); + + orig_mins = mins; + orig_maxs = maxs; + + respondto = spawnflags ^ TRIGGER_PLAYERS; + + PostEvent( EV_ExplodingWall_Setup, EV_POSTSPAWN ); + } + +/*****************************************************************************/ +/*QUAKED trigger_teleport (0.5 0.5 0.5) ? VISIBLE x NOT_PLAYERS NOT_MONSTERS NOT_PROJECTILES NO_EFFECTS + +Touching this entity will teleport players to the targeted object. + +"key" The item needed to activate this. (default nothing) + +"teleportthread" The thread that is run when the player is teleported + +If NOT_PLAYERS is set, the teleporter does not teleport players +If NOT_MONSTERS is set, the teleporter does not teleport monsters +If NOT_PROJECTILES is set, the teleporter does not teleport projectiles (rockets, grenades, etc.) +If NO_EFFECTS is set, the special effect will not happen and the teleport will be instant + +******************************************************************************/ + +#define NO_EFFECTS ( 1 << 5 ) + +Event EV_Teleporter_Teleport + ( + "teleport", + EV_HIDE, + "e", + "entity", + "Teleports the entity to destination." + ); + +Event EV_Teleporter_StopTeleport + ( + "stopteleport", + EV_HIDE, + "e", + "entity", + "Releases the entity at the end of the teleport." + ); + +Event EV_Teleporter_SetThread + ( + "teleportthread", + EV_HIDE, + "s", + "thread_name", + "Sets the thread to run when the player is teleported." + ); + +CLASS_DECLARATION( Trigger, Teleporter, "trigger_teleport" ) + { + { &EV_Trigger_Effect, StartTeleport }, + { &EV_Teleporter_Teleport, Teleport }, + { &EV_Teleporter_StopTeleport, StopTeleport }, + { &EV_Teleporter_SetThread, SetThread }, + { NULL, NULL } + }; + +void Teleporter::SetThread + ( + Event *ev + ) + { + teleport_thread = ev->GetString( 1 ); + } + +void Teleporter::StartTeleport + ( + Event *ev + ) + { + Animate *fx; + Entity *other; + Event *event; + qboolean is_sentient; + Vector new_position; + + + if ( in_use ) + return; + + in_use = true; + + other = ev->GetEntity( 1 ); + + if ( !other ) + return; + + if ( spawnflags & NO_EFFECTS ) + { + event = new Event( EV_Teleporter_Teleport ); + event->AddEntity( other ); + ProcessEvent( event ); + return; + } + + if ( other->isSubclassOf( Sentient ) ) + is_sentient = true; + else + is_sentient = false; + + if ( is_sentient ) + { + new_position = origin; + new_position.z += mins.z; + other->setOrigin( new_position ); + other->NoLerpThisFrame(); + } + + // Create the teleport special effect + + fx = new Animate; + fx->setOrigin( other->origin ); + + if ( is_sentient ) + { + fx->setModel( "fx_bigteleport.tik" ); + //fx->Sound( "sound/environment/electric/singles/dimming.wav" ); + } + else + { + fx->setModel( "fx_teleport2.tik" ); + } + + fx->RandomAnimate( "idle", EV_Remove ); + + if ( is_sentient ) + { + // Freeze the entity that went into the teleporter + + other->flags |= FL_IMMOBILE; + other->takedamage = DAMAGE_NO; + } + + // Make the entity teleport + + event = new Event( EV_Teleporter_Teleport ); + event->AddEntity( other ); + + if ( is_sentient ) + PostEvent( event, 4 ); + else + PostEvent( event, 0 ); + + if ( is_sentient ) + { + other->PostEvent( EV_Hide, 2 ); + + /* if ( !( spawnflags & NO_EFFECTS ) ) + { + event = new Event( EV_Sound ); + event->AddString( "snd_teleport" ); + other->PostEvent( event, 2 ); + } */ + } + } + +void Teleporter::Teleport + ( + Event *ev + ) + + { + Entity *dest; + int i; + Entity *other; + Vector mid; + Animate *fx; + Event *event; + + other = ev->GetEntity( 1 ); + + if ( !other || ( other == world ) ) + return; + + dest = G_FindTarget( NULL, Target() ); + if ( !dest ) + { + warning( "Teleport", "Couldn't find destination\n" ); + return; + } + + assert( dest ); + + // unlink to make sure it can't possibly interfere with KillBox + other->unlink(); + + if ( other->isSubclassOf( Sentient ) ) + { + PathManager.Teleport( other, other->origin, dest->origin ); + other->origin = dest->origin + Vector( 0, 0, 1 ); + other->velocity = vec_zero; + } + else + { + mid = ( absmax - absmin ) * 0.5; + other->origin = dest->origin + Vector( 0, 0, 1 ); + other->origin += mid; + } + + // set angles + other->setAngles( dest->angles ); + + if ( other->client ) + { + client = other->client; + + // clear the velocity and hold them in place briefly + client->ps.pm_time = 100; + client->ps.pm_flags |= PMF_TIME_TELEPORT; + + // cut the camera on the client + ( ( Player * )other )->CameraCut(); + + for( i = 0; i < 3; i++ ) + { + client->ps.delta_angles[ i ] = ANGLE2SHORT( dest->angles[ i ] - client->cmd_angles[ i ] ); + } + + VectorCopy( angles, client->ps.viewangles ); + } + + if ( dest->isSubclassOf( TeleporterDestination ) ) + { + float len; + + len = other->velocity.length(); + // + // give them a bit of a push + // + if ( len < 400 ) + len = 400; + other->velocity = ( ( TeleporterDestination * )dest )->movedir * len; + } + + // kill anything at the destination + KillBox( other ); + + other->setOrigin( other->origin ); + other->origin.copyTo( other->edict->s.origin2 ); + + // Run the teleport thread if set + + if ( teleport_thread.length() && other->isSubclassOf( Player ) ) + { + if ( !ExecuteThread( teleport_thread.c_str() ) ) + warning( "RunThread", "could not process thread" ); + } + + // Skip effects if no_effects set + + if ( spawnflags & NO_EFFECTS ) + { + Event *event = new Event( EV_Teleporter_StopTeleport ); + event->AddEntity( other ); + ProcessEvent( event ); + return; + } + + // Spawn in effect + + fx = new Animate; + + fx->setOrigin( other->origin ); + + if ( other->isSubclassOf( Sentient ) ) + { + fx->setModel( "fx_bigteleport.tik" ); + //fx->Sound( "sound/environment/electric/singles/dimming.wav" ); + } + else + { + fx->setModel( "fx_teleport2.tik" ); + } + + fx->RandomAnimate( "idle", EV_Remove ); + + event = new Event( EV_Teleporter_StopTeleport ); + event->AddEntity( other ); + + if ( other->isSubclassOf( Sentient ) ) + PostEvent( event, 1.75 ); + else + PostEvent( event, FRAMETIME ); + } + +void Teleporter::StopTeleport + ( + Event *ev + ) + + { + Entity *other; + + other = ev->GetEntity( 1 ); + + if ( other->isSubclassOf( Sentient ) ) + { + other->flags &= ~FL_IMMOBILE; + other->takedamage = DAMAGE_AIM; + other->showModel(); + } + + //if ( !( spawnflags & NO_EFFECTS ) ) + // other->Sound( "snd_teleport" ); + + in_use = false; + } + +Teleporter::Teleporter() + { + if ( LoadingSavegame ) + { + return; + } + + if ( spawnflags & 1 ) + { + PostEvent( EV_Show, EV_POSTSPAWN ); + } + + //respondto = spawnflags ^ ( TRIGGER_PLAYERS | TRIGGER_MONSTERS | TRIGGER_PROJECTILES ); + respondto = spawnflags ^ ( TRIGGER_PLAYERS ); + + in_use = false; + + // Cache all needed stuff + + if ( !( spawnflags & NO_EFFECTS ) ) + { + CacheResource( "models/fx_bigteleport.tik", this ); + //CacheResource( "sound/environment/electric/singles/dimming.wav", this ); + CacheResource( "fx_teleport2.tik", this ); + //CacheResource( "snd_teleport", this ); + } + } + +/*****************************************************************************/ +/*QUAKED func_teleportdest (0 0.25 0.5) (-32 -32 0) (32 32 8) + +Point trigger_teleport at these. + +******************************************************************************/ + +CLASS_DECLARATION( Entity, TeleporterDestination, "func_teleportdest" ) + { + { &EV_SetAngle, SetMoveDir }, + { NULL, NULL } + }; + +TeleporterDestination::TeleporterDestination() + { + movedir = G_GetMovedir( 0 ); + } + +void TeleporterDestination::SetMoveDir + ( + Event *ev + ) + { + float angle; + + angle = ev->GetFloat( 1 ); + movedir = G_GetMovedir( angle ); + setAngles( movedir.toAngles() ); + } + +/*****************************************************************************/ +/*QUAKED func_useanim (0 0.5 0) ? VISIBLE TOUCHABLE CONTINUOUS + +This object allows you to place the player into a specific animation for the +purposes of using an object within the world. + +This object should point at a func_useanimdest which contains specific +information about how the player is supposed to be posed. + +"count" - how many times this should trigger (default -1, infinite) +"thread" - thread to fire when used +"triggertarget" - what to trigger when used. +"delay" - how long it takes to be re-triggered ( default 3 seconds ) +"key" - item needed to activate this + +VISIBLE - if this is checked the trigger itself will be visible +TOUCHABLE - if this is set we can activate the trigger by standing in it. +CONTINUOUS - if this is checked the thing will re-trigger continously, otherwise +it waits until the player has left the trigger field. + +******************************************************************************/ + +Event EV_UseAnim_Reset + ( + "_reset", + EV_HIDE, + NULL, + NULL, + "Reset's the Use Anim after it has no longer been touched." + ); + +Event EV_UseAnim_Thread + ( + "thread", + EV_DEFAULT, + "s", + "label", + "Sets which thread to use when this UseAnim is triggered." + ); + +Event EV_UseAnim_Count + ( + "count", + EV_DEFAULT, + "i", + "newCount", + "Sets how many times the UseAnim can be triggered." + ); + +Event EV_UseAnim_TriggerTarget + ( + "triggertarget", + EV_DEFAULT, + "s", + "targetname", + "Sets what should be triggered, when this UseAnim is triggered." + ); + +Event EV_UseAnim_SetAnim + ( + "anim", + EV_DEFAULT, + "s", + "animName", + "set the animation to use for player." + ); + +Event EV_UseAnim_SetKey + ( + "key", + EV_DEFAULT, + "s", + "keyName", + "set the key needed to make this UseAnim function." + ); + + +Event EV_UseAnim_SetState + ( + "state", + EV_CHEAT, + "s", + "stateName", + "set the state to use for the player." + ); + +Event EV_UseAnim_SetCamera + ( + "camera", + EV_DEFAULT, + "s", + "cameraPosition", + "set the camera to use when in this animation.\n" + "topdown, behind, front, side, behind_fixed, side_left, side_right" + ); + +Event EV_UseAnim_SetNumLoops + ( + "num_loops", + EV_DEFAULT, + "i", + "loopCount", + "set the number of times to loop an animation per use." + ); + +Event EV_UseAnim_SetDelay + ( + "delay", + EV_DEFAULT, + "f", + "delayTime", + "how long it takes for the UseAnim to be retriggered once you leave it." + ); + + +CLASS_DECLARATION( Entity, UseAnim, "func_useanim" ) + { + { &EV_Use, NULL }, + { &EV_Touch, Touched }, + { &EV_UseAnim_Reset, Reset }, + { &EV_UseAnim_Thread, SetThread }, + { &EV_UseAnim_TriggerTarget, SetTriggerTarget }, + { &EV_UseAnim_Count, SetCount }, + { &EV_UseAnim_SetAnim, SetAnim }, + { &EV_UseAnim_SetState, SetState }, + { &EV_UseAnim_SetKey, SetKey }, + { &EV_UseAnim_SetNumLoops, SetNumLoops }, + { &EV_UseAnim_SetCamera, SetCamera }, + { NULL, NULL } + }; + +UseAnim::UseAnim() + { + if ( LoadingSavegame ) + { + return; + } + + setMoveType( MOVETYPE_NONE ); + + anim = "stand_use"; + num_loops = 1; + hideModel(); + + // + // make it not solid unless we want it touchable + // + if ( !( spawnflags & 2 ) ) + { + setSolidType( SOLID_BBOX ); + setContents( CONTENTS_BODY ); + } + else + { + setSolidType( SOLID_TRIGGER ); + edict->svflags |= SVF_NOCLIENT; + } + + // by default this can activated infinitely + count = -1; + // clear out the triggertarget + triggertarget = ""; + // clear out the thread + thread = ""; + // set the default delay + delay = 3; + // initialize the last time the door was triggered + last_active_time = -delay; + // initially its not active + active = 0; + // set the default camera to be side view + camera = "behind"; + // + // only make it visible if so desired + // + if ( spawnflags & 1 ) + { + PostEvent( EV_Show, EV_POSTSPAWN ); + } + } + +void UseAnim::Touched + ( + Event *ev + ) + + { + Entity *other; + + if ( active && ( !( spawnflags & 4 ) ) ) + { + CancelEventsOfType( EV_UseAnim_Reset ); + PostEvent( EV_UseAnim_Reset, 0.25f ); + return; + } + + // don't retrigger to soon + if ( level.time < last_active_time ) + return; + + other = ev->GetEntity( 1 ); + if ( other->isSubclassOf( Player ) ) + { + ( ( Player * ) other )->TouchedUseAnim( this ); + } + } + +bool UseAnim::canBeUsed + ( + Entity * activator + ) + + { + Entity *dest; + + // if this is no longer usable, return false + if ( !count ) + { + return false; + } + + // don't retrigger to soon + if ( level.time < last_active_time ) + { + return false; + } + + if ( key.length() ) + { + if ( !activator->isSubclassOf( Sentient ) ) + { + return false; + } + if ( !( ( (Sentient *)activator )->HasItem( key.c_str() ) ) ) + { + qboolean setModel; + Item *item; + ClassDef *cls; + str dialog; + + cls = FindClass( key.c_str(), &setModel ); + if ( !cls || !checkInheritance( "Item", cls->classname ) ) + { + gi.DPrintf( "No item named '%s'\n", key.c_str() ); + return true; + } + item = ( Item * )cls->newInstance(); + if ( setModel ) + { + item->setModel( key.c_str() ); + } + item->CancelEventsOfType( EV_Item_DropToFloor ); + item->CancelEventsOfType( EV_Remove ); + item->ProcessPendingEvents(); + dialog = item->GetDialogNeeded(); + if ( dialog.length() > 0 ) + { + activator->Sound( dialog ); + } + else + { + gi.centerprintf ( activator->edict, "You need the %s", item->getName() ); + } + delete item; + + // don't retrigger for 5 seconds + last_active_time = level.time + 5; + return false; + } + else + { + return qtrue; + } + } + + if ( isSubclassOf( TouchAnim ) ) + { + return true; + } + + dest = G_FindTarget( NULL, Target() ); + if ( !dest || !dest->isSubclassOf( UseAnimDestination ) ) + { + warning( "UseAnim", "Couldn't find destination\n" ); + return false; + } + + return true; + } + +bool UseAnim::GetInformation + ( + Entity *activator, + Vector *org, + Vector *angles, + str *animation, + int *loopcount, + str *state, + str *camera + ) + + { + Entity *dest; + UseAnimDestination *uadest; + + // if this is no longer usable, return false + if ( !count ) + { + return false; + } + + dest = G_FindTarget( NULL, Target() ); + + if ( !dest || !dest->isSubclassOf( UseAnimDestination ) ) + { + // grab the information from this entity instead + // set the destination origin + *org = origin; + // set the destination angles + *angles = this->angles; + // set the desination animation + *animation = anim; + // set the number of loops + *loopcount = num_loops; + // get the state if necessary + *state = this->state; + // set the camera + *camera = this->camera; + } + else + { + uadest = ( UseAnimDestination * )dest; + + // set the destination origin + *org = uadest->origin; + // set the destination angles + *angles = uadest->angles; + // set the desination animation + *animation = uadest->GetAnim(); + // set the number of loops + *loopcount = uadest->GetNumLoops(); + // get the state if necessary + *state = uadest->GetState(); + // set the camera + *camera = this->camera; + } + + + // make this guy active + active = qtrue; + + // if this is a TouchAnim see if it is linked to another TouchAnim + if ( isSubclassOf( TouchAnim ) ) + { + dest = NULL; + do { + dest = G_FindTarget( dest, Target() ); + if ( dest ) + { + if ( dest->isSubclassOf( UseAnim ) ) + { + // make our linked UseAnim's active as well + ( ( UseAnim * )dest )->active = qtrue; + } + } + else + { + break; + } + } + while( 1 ); + } + // + // decrement the use + // + if ( count > 0 ) + { + count--; + } + + return true; + } + +void UseAnim::TriggerTargets + ( + Entity *activator + ) + + { + // + // fire off our trigger target if appropriate + // + if ( triggertarget.length() ) + { + Event *event; + Entity *ent; + + ent = NULL; + do + { + ent = G_FindTarget( ent, triggertarget.c_str() ); + if ( !ent ) + { + break; + } + event = new Event( EV_Activate ); + event->AddEntity( activator ); + ent->PostEvent( event, 0 ); + } + while ( 1 ); + } + + // + // fire off a thread if necessary + // + if ( thread.length() ) + { + if ( !ExecuteThread( thread ) ) + { + warning( "TriggerTargets", "Null game script" ); + } + } + } + +void UseAnim::Reset + ( + Event *ev + ) + + { + // + // find out if our triggertarget is of type door and only reset if the door is closed + // + if ( triggertarget.length() ) + { + Entity *ent; + + ent = NULL; + do + { + ent = G_FindTarget( ent, triggertarget.c_str() ); + if ( !ent ) + { + break; + } + if ( ent->isSubclassOf( Door ) ) + { + if ( !( ( Door * )ent )->isCompletelyClosed() ) + { + CancelEventsOfType( EV_UseAnim_Reset ); + PostEvent( EV_UseAnim_Reset, 0.25f ); + // + // wait for a little bit + // + return; + } + } + } + while ( 1 ); + } + + active = qfalse; + last_active_time = level.time + delay; + + // if this is a TouchAnim see if it is linked to another TouchAnim + if ( isSubclassOf( TouchAnim ) ) + { + Entity *dest; + + dest = NULL; + do { + dest = G_FindTarget( dest, Target() ); + if ( dest ) + { + if ( dest->isSubclassOf( UseAnim ) ) + { + // make our linked UseAnim's reset as well + ( ( UseAnim * )dest )->active = qfalse; + ( ( UseAnim * )dest )->last_active_time = level.time + delay; + } + } + else + { + break; + } + } + while( 1 ); + } + } + +void UseAnim::SetThread + ( + Event *ev + ) + + { + thread = ev->GetString( 1 ); + } + +void UseAnim::SetDelay + ( + Event *ev + ) + + { + delay = ev->GetFloat( 1 ); + } + +void UseAnim::SetTriggerTarget + ( + Event *ev + ) + + { + triggertarget = ev->GetString( 1 ); + } + +void UseAnim::SetCount + ( + Event *ev + ) + + { + count = ev->GetInteger( 1 ); + } + +void UseAnim::SetAnim + ( + Event *ev + ) + { + anim = ev->GetString( 1 ); + } + +void UseAnim::SetState + ( + Event *ev + ) + { + state = ev->GetString( 1 ); + } + +void UseAnim::SetKey + ( + Event *ev + ) + { + key = ev->GetString( 1 ); + } + +void UseAnim::SetCamera + ( + Event *ev + ) + { + camera = ev->GetString( 1 ); + } + +void UseAnim::SetNumLoops + ( + Event *ev + ) + { + num_loops = ev->GetInteger( 1 ); + } + + +CLASS_DECLARATION( UseAnim, TouchAnim, "func_touchanim" ) + { + { NULL, NULL } + }; + +TouchAnim::TouchAnim() + { + if ( LoadingSavegame ) + { + return; + } + + spawnflags |= 2; + + if ( spawnflags & 8 ) + { + setSize( "-32 -32 0", "32 32 96" ); + } + else + { + setSize( "-16 -16 0", "16 16 96" ); + } + + setSolidType( SOLID_TRIGGER ); + edict->svflags |= SVF_NOCLIENT; + } + +/*****************************************************************************/ +/* func_useanimdest (0 0.25 0.5) (0 0 0) (0 0 0) + +Point func_useanim's at these. + +The player will be lerped to this position and this orientation +and placed into the specified animation + +"anim" specifies the animation that the player should be in. +"state" instead of an animation, sets a state the player should go into +"camera" camera position to use when player is in animation +"num_loops" number of animation loops to play. + + +******************************************************************************/ + +CLASS_DECLARATION( Entity, UseAnimDestination, "func_useanimdest" ) + { + { &EV_UseAnim_SetAnim, SetAnim }, + { &EV_UseAnim_SetState, SetState }, + { &EV_UseAnim_SetNumLoops, SetNumLoops }, + { NULL, NULL } + }; + +UseAnimDestination::UseAnimDestination() + { + if ( LoadingSavegame ) + { + // Archive function will setup all necessary data + return; + } + // + // default animation to use + // + anim = "stand_use"; + num_loops = 1; + setSolidType( SOLID_NOT ); + hideModel(); + } + +void UseAnimDestination::SetAnim + ( + Event *ev + ) + { + anim = ev->GetString( 1 ); + } + +void UseAnimDestination::SetState + ( + Event *ev + ) + { + state = ev->GetString( 1 ); + } + +str UseAnimDestination::GetAnim + ( + void + ) + { + return anim; + } + +str UseAnimDestination::GetState + ( + void + ) + { + return state; + } + +void UseAnimDestination::SetNumLoops + ( + Event *ev + ) + { + num_loops = ev->GetInteger( 1 ); + } + +int UseAnimDestination::GetNumLoops + ( + void + ) + { + return num_loops; + } + +Event EV_UseObject_MoveThread + ( + "move_thread", + EV_DEFAULT, + "s", + "label", + "Sets which move thread to use when this UseObject has finshed looping." + ); + +Event EV_UseObject_StopThread + ( + "stop_thread", + EV_DEFAULT, + "s", + "label", + "Sets which stop thread to use when this UseObject is finished." + ); + +Event EV_UseObject_ResetThread + ( + "reset_thread", + EV_DEFAULT, + "s", + "label", + "Sets which thread to call when resetting." + ); + +Event EV_UseObject_Count + ( + "count", + EV_DEFAULT, + "i", + "newCount", + "Sets how many times the UseObject can be triggered." + ); + +Event EV_UseObject_Cone + ( + "cone", + EV_DEFAULT, + "f", + "newCone", + "Sets the cone in angles of where the Useobject can be used." + ); + +Event EV_UseObject_Offset + ( + "offset", + EV_DEFAULT, + "v", + "newOffset", + "Sets the offset to use for this UseObject." + ); + +Event EV_UseObject_YawOffset + ( + "yaw_offset", + EV_DEFAULT, + "f", + "newYawOffset", + "Sets the yaw offset to use for this UseObject." + ); + +Event EV_UseObject_State + ( + "state", + EV_DEFAULT, + "s", + "newState", + "Sets the state to use for this UseObject." + ); + +Event EV_UseObject_StateBackwards + ( + "state_backwards", + EV_DEFAULT, + "s", + "newState", + "Sets the backward state to use for this UseObject." + ); + +Event EV_UseObject_TriggerTarget + ( + "triggertarget", + EV_DEFAULT, + "s", + "targetname", + "Sets what should be triggered, when this UseObject is triggered." + ); + +Event EV_UseObject_ResetTime + ( + "reset_time", + EV_DEFAULT, + "f", + "newResetTime", + "Sets the time it takes for the UseObject to reset itself." + ); + +Event EV_UseObject_DamageType + ( + "damage_type", + EV_DEFAULT, + "s", + "newDamageType", + "Sets what kind of damage is needed to activate the trigger." + ); + +Event EV_UseObject_Reset + ( + "_useobject_reset", + EV_DEFAULT, + NULL, + NULL, + "Resets the useobject to the start state after a certain amount of time." + ); + +Event EV_UseObject_Resetting + ( + "_useobject_resetting", + EV_DEFAULT, + NULL, + NULL, + "Intermediate function for useobject reset." + ); + +Event EV_UseObject_DamageTriggered + ( + "_useobject_damagetriggered", + EV_DEFAULT, + "e", + "activator", + "Intermediate function for when the useobject was triggered by damage." + ); + +Event EV_UseObject_Activate + ( + "activate", + EV_DEFAULT, + NULL, + NULL, + "Allow the useobject to be used." + ); + +Event EV_UseObject_Deactivate + ( + "deactivate", + EV_DEFAULT, + NULL, + NULL, + "Do not allow the useobject to be used." + ); + +Event EV_UseObject_UseMaterial + ( + "usematerial", + EV_DEFAULT, + "s", + "nameOfUseMaterial", + "the name of the material that glows when active." + ); + +Event EV_UseObject_SetActiveState + ( + "_setactivestate", + EV_DEFAULT, + NULL, + NULL, + "event that sets up the proper skin for the useobject." + ); + + + +#define MULTI_STATE ( 1 << 0 ) + +/*****************************************************************************/ +/*QUAKED func_useobject (0 0.5 0) ? MULTI-STATE + +Allows you to setup a special object that places the player into a specific state +sequence. Primarily used for levers and cranks. + +Object starts out in the "start" animation, when used the following occurs: + +It is determined whether or not the player is in the right position to activate +the object, if it is, the player is moved to the exact offset and angle specified +by "offset" and "yaw_offset". The right position is determined by a dot product +with "offset" and "yaw_offset". The "cone" parameter controls the cone in which the +object can be triggered. Once the player is in the right position, the player is placed +into "state" and the "move" animation is played. Once the player animation ends, the +"move_thread" will be called. If the use button is continued to be held down and count +is not finite, the animation will be continued to be played until the use key is held +down. Once the use key is let go, the "stop" animation will be played on the lever and +the "stop_thread" will be called. + +"activate" - turns the useobject on +"deactivate" - turns the useobject off +"offset" - vector offset of where the player should stand +"state" - state to go into when used +"state_backwards" - what state to use when reversing the object +"yaw_offset" - what direction the player should be facing when using the object +"cone" - the cone in which the object can be used +"count" - how many times this should trigger (default -1, infinite) +"move_thread" - thread that is fired when the object has cycled one animation +"stop_thread" - thread that is fired when the object has finished animating +"reset_thread" - thread that is fired when the object is resetting itself +"reset_time" - the time it takes for the object to reset, (default 0, it doesn't) +"triggertarget" - target to trigger when finished animating, if reset_time is set, target +will be fired again when resetting +"damage_type" - if set, can be triggered by using a weapon to activate it. If set to "all", +any damage will activate it. + +MULTI-STATE - the object has two different states and must be used each time to set the state +when multi state is active, the reset_thread is called instead of stop_thread. All UseObjects +have two states on and off. When reset_time is set, the object will automatically return to the +off state after a preset amount of time. When multi-state is set this must be done manually. + +******************************************************************************/ + +CLASS_DECLARATION( Animate, UseObject, "func_useobject" ) + { + { &EV_Use, NULL }, + { &EV_UseObject_MoveThread, SetMoveThread }, + { &EV_UseObject_StopThread, SetStopThread }, + { &EV_UseObject_ResetThread, SetResetThread }, + { &EV_UseObject_TriggerTarget, SetTriggerTarget }, + { &EV_UseObject_Offset, SetOffset }, + { &EV_UseObject_YawOffset, SetYawOffset }, + { &EV_UseObject_Count, SetCount }, + { &EV_UseObject_Cone, SetCone }, + { &EV_UseObject_State, SetState }, + { &EV_UseObject_StateBackwards, SetBackwardsState }, + { &EV_UseObject_ResetTime, SetResetTime }, + { &EV_UseObject_Reset, Reset }, + { &EV_UseObject_DamageType, DamageType }, + { &EV_UseObject_Resetting, Resetting }, + { &EV_UseObject_DamageTriggered, DamageTriggered }, + { &EV_Damage, DamageFunc }, + { &EV_UseObject_Activate, ActivateEvent }, + { &EV_UseObject_Deactivate, DeactivateEvent }, + { &EV_UseObject_UseMaterial, UseMaterialEvent }, + { &EV_UseObject_SetActiveState, SetActiveState }, + { NULL, NULL } + }; + +UseObject::UseObject() + { + Event * e; + + if ( LoadingSavegame ) + { + // Archive function will setup all necessary data + return; + } + + setMoveType( MOVETYPE_NONE ); + setSolidType( SOLID_BBOX ); + setContents( CONTENTS_BODY ); + + // make sure the bounds get rotated with the object + flags |= FL_ROTATEDBOUNDS; + // by default this can activated infinitely + count = -1; + // clear out the triggertarget + triggertarget = ""; + // clear out the move thread + move_thread = ""; + // clear out the stop thread + stop_thread = ""; + // clear out the reset thread + reset_thread = ""; + // clear out the damage type, by default useobjects do not respond to damage + damage_type = MOD_NONE; + // turn on damage taking ability + takedamage = DAMAGE_YES; + // give it some health + health = 100; + // set the default yaw offset + yaw_offset = 0; + // set the cone + cone = cos( DEG2RAD( 90 ) ); + // set the state + state = ""; + // set the backwards state + state_backwards = ""; + // clear out the reset_time + reset_time = 0; + // clear out the object state + objectState = 0; + // the useobject is active by default + active = qtrue; + + // start off in the start animation + e = new Event( EV_Anim ); + e->AddString( "start" ); + PostEvent( e, 0 ); + PostEvent( EV_Show, 0 ); + // setup our skins once we are spawned + PostEvent( EV_UseObject_SetActiveState, 0 ); + + look_at_me = true; + } + +void UseObject::SetActiveState + ( + Event *ev + ) + { + if ( !useMaterial.length() ) + { + return; + } + + if ( active && count ) + { + SurfaceCommand( useMaterial.c_str(), "+skin1" ); + } + else + { + SurfaceCommand( useMaterial.c_str(), "-skin1" ); + } + if ( objectState ) + { + SurfaceCommand( useMaterial.c_str(), "+skin2" ); + } + else + { + SurfaceCommand( useMaterial.c_str(), "-skin2" ); + } + } + +void UseObject::SetMoveThread + ( + Event *ev + ) + + { + move_thread = ev->GetString( 1 ); + } + +void UseObject::SetStopThread + ( + Event *ev + ) + + { + stop_thread = ev->GetString( 1 ); + } + +void UseObject::SetResetThread + ( + Event *ev + ) + + { + reset_thread = ev->GetString( 1 ); + } + +void UseObject::ActivateEvent + ( + Event *ev + ) + + { + active = qtrue; + PostEvent( EV_UseObject_SetActiveState, 0 ); + } + +void UseObject::DeactivateEvent + ( + Event *ev + ) + + { + active = qfalse; + PostEvent( EV_UseObject_SetActiveState, 0 ); + } + +void UseObject::SetTriggerTarget + ( + Event *ev + ) + + { + triggertarget = ev->GetString( 1 ); + } + +void UseObject::SetOffset + ( + Event *ev + ) + + { + offset = ev->GetVector( 1 ); + } + +void UseObject::SetYawOffset + ( + Event *ev + ) + + { + yaw_offset = ev->GetFloat( 1 ); + } + +void UseObject::SetCount + ( + Event *ev + ) + + { + count = ev->GetInteger( 1 ); + } + +void UseObject::SetCone + ( + Event *ev + ) + + { + cone = cos( DEG2RAD( ev->GetFloat( 1 ) ) ); + } + +void UseObject::SetState + ( + Event *ev + ) + + { + state = ev->GetString( 1 ); + } + +void UseObject::SetBackwardsState + ( + Event *ev + ) + + { + state_backwards = ev->GetString( 1 ); + } + +void UseObject::UseMaterialEvent + ( + Event *ev + ) + + { + useMaterial = ev->GetString( 1 ); + } + +void UseObject::SetResetTime + ( + Event *ev + ) + + { + reset_time = ev->GetFloat( 1 ); + } + +void UseObject::Reset + ( + Event *ev + ) + + { + RandomAnimate( "move_backward", EV_UseObject_Resetting ); + } + +void UseObject::Resetting + ( + Event *ev + ) + + { + SetActiveState( NULL ); + RandomAnimate( "start" ); + + // reset the count + count = 1; + + // + // fire off our trigger target if appropriate + // + if ( triggertarget.length() ) + { + Event *event; + Entity *ent; + + ent = NULL; + do + { + ent = G_FindTarget( ent, triggertarget.c_str() ); + if ( !ent ) + { + break; + } + event = new Event( EV_Activate ); + event->AddEntity( this ); + ent->PostEvent( event, 0 ); + } + while ( 1 ); + } + + // + // fire off a thread if necessary + // + if ( reset_thread.length() ) + { + if ( !ExecuteThread( reset_thread ) ) + { + warning( "Resetting", "Null game script" ); + } + } + } + +bool UseObject::canBeUsed + ( + Vector org, + Vector dir + ) + + { + float dot; + Vector forward; + Vector diff; + Vector ang; + + // see if it is active + if ( !active ) + { + return false; + } + + // if this is no longer usable, return false + if ( !count ) + { + return false; + } + + // convert our yawoffset to a vector + ang = vec_zero; + ang[ YAW ] = angles[ YAW ] + yaw_offset; + ang.AngleVectors( &forward ); + dot = forward * dir; + if ( dot < cone ) + { + return false; + } + +/* + // convert our offset to a vector in worldspace + forward = getLocalVector( offset ); + forward.normalize(); + diff = org - origin; +// diff = origin - org; + diff.normalize(); + dot = forward * dir; + if ( dot < cone ) + { + return false; + } +*/ + + return true; + } + +void UseObject::DamageFunc + ( + Event *ev + ) + + { + Event *e; + Entity *attacker; + int mod; + + // if this is no longer usable, return false + if ( !count ) + { + return; + } + + // what kind of damage hit us + mod = ev->GetInteger( 9 ); + + // if we don't respond to any kind of damage, and our damage types do not match, return + if ( !MOD_matches( mod, damage_type ) ) + { + return; + } + + // get the attacker + attacker = ev->GetEntity( 3 ); + + // + // decrement the use + // + if ( count > 0 ) + { + count--; + } + // setup our damage triggered event + e = new Event( EV_UseObject_DamageTriggered ); + // add our attacker + e->AddEntity( attacker ); + // start up the object with our special event + Start( e ); + } + +void UseObject::DamageTriggered + ( + Event * ev + ) + + { + // grab the attacker from our event + Stop( ev->GetEntity( 1 ) ); + } + +void UseObject::Setup + ( + Entity *activator, + Vector *org, + Vector *ang, + str *newstate + ) + + { + if ( ( spawnflags & MULTI_STATE ) && objectState ) + { + *newstate = state_backwards; + } + else + { + *newstate = state; + } + + // convert our offset to a vector in worldspace + MatrixTransformVector( offset, orientation, *org ); + *org += origin; + + *ang = angles; + ang->y += yaw_offset; + + // + // decrement the use + // + if ( count > 0 ) + { + count--; + } + } + +void UseObject::Start + ( + Event * ev + ) + + { + // + // fire off the move_thread + // + if ( move_thread.length() ) + { + if ( !ExecuteThread( move_thread ) ) + { + warning( "Start", "Null game script" ); + } + } + + if ( ( spawnflags & MULTI_STATE ) && objectState ) + { + RandomAnimate( "move_backward", ev ); + } + else + { + RandomAnimate( "move", ev ); + } + SetActiveState( NULL ); + } + +bool UseObject::Loop + ( + void + ) + + { + if ( !count ) + return qfalse; + + return qtrue; + } + +void UseObject::Stop + ( + Entity *activator + ) + + { + if ( ( spawnflags & MULTI_STATE ) && objectState ) + { + RandomAnimate( "start" ); + } + else + { + RandomAnimate( "stop" ); + } + + // + // fire off our trigger target if appropriate + // + if ( triggertarget.length() ) + { + Event *event; + Entity *ent; + + ent = NULL; + do + { + ent = G_FindTarget( ent, triggertarget.c_str() ); + if ( !ent ) + { + break; + } + event = new Event( EV_Activate ); + event->AddEntity( activator ); + ent->PostEvent( event, 0 ); + } + while ( 1 ); + } + + // + // fire off a thread if necessary + // + if ( ( spawnflags & MULTI_STATE ) && objectState ) + { + if ( reset_thread.length() ) + { + if ( !ExecuteThread( reset_thread ) ) + { + warning( "Stop", "Null game script" ); + } + } + } + else + { + if ( stop_thread.length() ) + { + if ( !ExecuteThread( stop_thread ) ) + { + warning( "Stop", "Null game script" ); + } + } + } + + // toggle the state + objectState ^= 1; + + if ( reset_time ) + { + count = 0; + PostEvent( EV_UseObject_Reset, reset_time ); + } + + SetActiveState( NULL ); + } + +/*****************************************************************************/ +/*QUAKED info_waypoint (0 0.5 0) (-8 -8 -8) (8 8 8) + +Used as a positioning device for objects + +******************************************************************************/ + +CLASS_DECLARATION( Mover, Waypoint, "info_waypoint" ) + { + { NULL, NULL } + }; + + +/*****************************************************************************/ +/*QUAKED func_monkeybars (0.75 0.75 0.75) ? + +Monkey bars + +******************************************************************************/ + +CLASS_DECLARATION( Entity, MonkeyBars, "func_monkeybars" ) + { + { &EV_SetAngle, SetAngleEvent }, + { NULL, NULL } + }; + +MonkeyBars::MonkeyBars() + { + if ( LoadingSavegame ) + { + // Archive function will setup all necessary data + return; + } + setMoveType( MOVETYPE_NONE ); + setContents( CONTENTS_SHOOTABLE_ONLY | MASK_SOLID ); + PostEvent( EV_BecomeSolid, 0 ); + dir = 0; + } + +void MonkeyBars::SetAngleEvent + ( + Event *ev + ) + + { + dir = ev->GetFloat( 1 ); + } + +/*****************************************************************************/ +/*QUAKED func_horizontalpipe (0.75 0.75 0.75) ? + +Horizontal pipe that play can crawl upside down on. + +******************************************************************************/ + +CLASS_DECLARATION( Entity, HorizontalPipe, "func_horizontalpipe" ) + { + { &EV_SetAngle, SetAngleEvent }, + { NULL, NULL } + }; + +HorizontalPipe::HorizontalPipe() + { + if ( LoadingSavegame ) + { + // Archive function will setup all necessary data + return; + } + setMoveType( MOVETYPE_NONE ); + setContents( CONTENTS_SHOOTABLE_ONLY | MASK_SOLID ); + PostEvent( EV_BecomeSolid, 0 ); + dir = 0; + } + +void HorizontalPipe::SetAngleEvent + ( + Event *ev + ) + + { + dir = ev->GetFloat( 1 ); + } + +/*****************************************************************************/ +// TossObject +/*****************************************************************************/ + +Event EV_TossObject_SetBounceSound + ( + "bouncesound", + EV_DEFAULT, + "s", + "sound", + "When bouncing, what sound to play on impact" + ); + +Event EV_TossObject_SetBounceSoundChance + ( + "bouncesoundchance", + EV_DEFAULT, + "f[0,1]", + "chance", + "When bouncing, the chance that the bounce sound will be played" + ); + +CLASS_DECLARATION( Animate, TossObject, "TossObject" ) + { + { &EV_Touch, Touch }, + { &EV_Stop, Stop }, + { &EV_TossObject_SetBounceSound, SetBounceSound }, + { &EV_TossObject_SetBounceSoundChance, SetBounceSoundChance }, + { NULL, NULL } + }; + +TossObject::TossObject() + { + if ( LoadingSavegame ) + { + // Archive function will setup all necessary data + return; + } + setMoveType( MOVETYPE_GIB ); + setSolidType( SOLID_NOT ); + bouncesound = ""; + bouncesoundchance = 1.0f; + } + +TossObject::TossObject( str model ) + { + setMoveType( MOVETYPE_GIB ); + setSolidType( SOLID_NOT ); + bouncesound = ""; + bouncesoundchance = 1.0f; + setModel( model ); + } + +void TossObject::SetBounceSound + ( + str bounce + ) + + { + bouncesound = bounce; + } + +void TossObject::SetBounceSound + ( + Event *ev + ) + + { + bouncesound = ev->GetString( 1 ); + } + +void TossObject::SetBounceSoundChance + ( + float chance + ) + + { + bouncesoundchance = chance; + } + +void TossObject::SetBounceSoundChance + ( + Event *ev + ) + + { + bouncesoundchance = ev->GetFloat( 1 ); + } + +void TossObject::Stop + ( + Event *ev + ) + + { + setMoveType( MOVETYPE_NONE ); + setSolidType( SOLID_NOT ); + // cancel the previous fade out command + CancelEventsOfType( EV_FadeOut ); + PostEvent( EV_FadeOut, 7 + G_Random( 5 ) ); + setAngles( "0 0 0" ); + RandomAnimate( "landed" ); + } + +void TossObject::Touch + ( + Event *ev + ) + + { + Entity * ent; + + ent = ev->GetEntity( 1 ); + + // only touch the world + if ( !ent || ( ent != world ) ) + { + return; + } + // + // every time we bounce try to go back to our nominal angles + // + setAngles( angles * 0.5f ); + + if ( bouncesound.length() ) + { + if ( G_Random( 1 ) < bouncesoundchance ) + { + Sound( bouncesound ); + } + } + } + +void TossObject::SetVelocity + ( + float severity + ) + + { + setSolidType( SOLID_BBOX ); + velocity[0] = 100.0 * crandom(); + velocity[1] = 100.0 * crandom(); + velocity[2] = 200.0 + 100.0 * random(); + + avelocity = Vector( G_Random( 600 ), G_Random( 600 ), G_Random( 600 ) ); + + velocity *= severity; + + if (velocity[0] < -400) + velocity[0] = -400; + else if (velocity[0] > 400) + velocity[0] = 400; + if (velocity[1] < -400) + velocity[1] = -400; + else if (velocity[1] > 400) + velocity[1] = 400; + if (velocity[2] < 200) + velocity[2] = 200; // always some upwards + else if (velocity[2] > 600) + velocity[2] = 600; + RandomAnimate( "idle" ); + // we give it 8 seconds to fall, if not it will get faded out + PostEvent( EV_FadeOut, 8 ); + } + +/*****************************************************************************/ +/*QUAKED func_pushobject (0.75 0.75 0.75) ? + +Pushable object + +"dmg" how much damage to cause when blocked. (default 2) +"pushsound" Sound to play when object is pushed (default is none) + +******************************************************************************/ + +Event EV_PushObject_Start + ( + "start", + EV_DEFAULT, + NULL, + NULL, + "Sets up the pushobject." + ); + +Event EV_PushObject_SetDamage + ( + "dmg", + EV_DEFAULT, + "i", + "damage", + "Set the damage." + ); + +Event EV_PushObject_SetPushSound + ( + "pushsound", + EV_DEFAULT, + "s", + "sound", + "Set the pushing sound" + ); + +CLASS_DECLARATION( Entity, PushObject, "func_pushobject" ) + { + { &EV_PushObject_Start, Start }, + { &EV_Blocked, BlockFunc }, + { &EV_PushObject_SetDamage, SetDamage }, + { &EV_PushObject_SetPushSound, SetPushSound }, + { NULL, NULL } + }; + +PushObject::PushObject() + { + if ( LoadingSavegame ) + { + // Archive function will setup all necessary data + return; + } + dmg = 2; + attack_finished = 0; + + pushsound = "object_slide"; + + PostEvent( EV_PushObject_Start, EV_POSTSPAWN ); + } + +void PushObject::SetPushSound + ( + Event *ev + ) + + { + pushsound = ev->GetString( 1 ); + } + +void PushObject::Start + ( + Event *ev + ) + + { + // make sure that this touches triggers + flags |= FL_TOUCH_TRIGGERS; + edict->clipmask = MASK_SOLID; + setSolidType( SOLID_BSP ); + setMoveType( MOVETYPE_PUSH ); + + // fix the bounding box so that the object isn't stuck in the ground + setSize( mins + Vector( 1, 1, 2 ), maxs - Vector( 1, 1, 1 ) ); + } + +qboolean PushObject::canPush + ( + Vector dir + ) + + { + trace_t trace; + + Vector end( origin.x + dir.x, origin.y + dir.y, origin.z ); + + trace = G_Trace( origin, mins, maxs, end, this, MASK_DEADSOLID, false, "PushObject::Push" ); + return ( !trace.startsolid && ( trace.fraction == 1.0f ) ); + } + +qboolean PushObject::Push + ( + Entity *pusher, + Vector move + ) + + { + trace_t trace; + + if ( pushsound.length() ) + { + if ( !edict->s.loopSound ) + { + LoopSound( pushsound ); + PostEvent( EV_StopLoopSound, level.frametime * 5 ); + } + } + + Vector end( origin.x + move.x, origin.y + move.y, origin.z ); + + trace = G_Trace( origin, mins, maxs, end, this, MASK_DEADSOLID, false, "PushObject::Push" ); + if ( !trace.startsolid && ( trace.fraction > 0 ) ) + { + owner = pusher; + + G_PushMove( this, trace.endpos - origin, vec_zero ); + + if ( edict->s.loopSound ) + PostponeEvent( EV_StopLoopSound, level.frametime ); + + return qtrue; + } + + return qfalse; + } + +Entity *PushObject::getOwner + ( + void + ) + + { + return ( Entity * )owner; + } + +void PushObject::BlockFunc + ( + Event *ev + ) + + { + Entity *other; + + if ( ( dmg != 0 ) && ( level.time >= attack_finished ) ) + { + attack_finished = level.time + 0.5f; + other = ev->GetEntity( 1 ); + if ( other != owner ) + { + other->Damage( this, this, dmg, origin, vec_zero, vec_zero, 0, 0, MOD_CRUSH ); + } + } + } + +void PushObject::SetDamage + ( + Event *ev + ) + + { + dmg = ev->GetInteger( 1 ); + } + +#define SPAWN_AUTO_RESET ( 1 << 0 ) +#define NO_RANDOMNESS ( 1 << 1 ) +#define REMOVE_ON_GROUND ( 1 << 2 ) +/*****************************************************************************/ +/*QUAKED func_fallingrock (0.75 0.75 0.75) ? AUTO_RESET NO_RANDOMNESS REMOVE_ON_GROUND + +Creates a rock that, when triggered, begins falling and bounces along a path +specified by targetname. Use info_waypoint for the path. + +"targetname" the path to follow. +"dmg" how much damage to cause creatures it hits (default 20). +"speed" how fast to move (default 200). +"wait" how long to wait before falling when triggered (default 0). +"noise" sound to play when rock touches the world + +AUTO_RESET - when done falling, automatically return to the start +NO_RANDOMNESS - don't use any randomness when making the rocks fall +REMOVE_ON_GROUND - remove the rocks when done + +******************************************************************************/ + +Event EV_FallingRock_Bounce + ( + "bounce", + EV_DEFAULT, + NULL, + NULL, + "sent to entity when touched." + ); + +Event EV_FallingRock_Rotate + ( + "rotate", + EV_DEFAULT, + NULL, + NULL, + "rotates the falling rock." + ); + +Event EV_FallingRock_SetWait + ( + "wait", + EV_DEFAULT, + "f", + "wait", + "How long to wait before rock starts falling." + ); + +Event EV_FallingRock_Start + ( + "start", + EV_DEFAULT, + NULL, + NULL, + "Starts rock falling." + ); + +Event EV_FallingRock_SetDmg + ( + "dmg", + EV_DEFAULT, + "i", + "dmg", + "Set the damage from the rock." + ); + +Event EV_FallingRock_SetSpeed + ( + "speed", + EV_DEFAULT, + "f", + "speed", + "Set the speed that the rock moves at." + ); + +Event EV_FallingRock_SetBounceSound + ( + "noise", + EV_DEFAULT, + "s", + "sound", + "Set the sound to play when the rock bounces" + ); + +CLASS_DECLARATION( Entity, FallingRock, "func_fallingrock" ) + { + { &EV_Activate, Activate }, + { &EV_Touch, Touch }, + { &EV_FallingRock_Bounce, Bounce }, + { &EV_FallingRock_Rotate, Rotate }, + { &EV_FallingRock_Start, StartFalling }, + { &EV_FallingRock_SetWait, SetWait }, + { &EV_FallingRock_SetSpeed, SetSpeed }, + { &EV_FallingRock_SetDmg, SetDmg }, + { &EV_FallingRock_SetBounceSound, SetBounceSound }, + { NULL, NULL } + }; + +FallingRock::FallingRock() + { + if ( LoadingSavegame ) + { + // Archive function will setup all necessary data + return; + } + active = 0; + current = NULL; + setMoveType( MOVETYPE_NONE ); + wait = 0; + dmg = 20; + speed = 200; + activator = NULL; + attack_finished = 0; + + SetBounceSound( "impact_rock" ); + } + +Entity *FallingRock::SetNextBounceDir + ( + void + ) + + { + Entity *ent; + + if ( !current->target.length() ) + { + return NULL; + } + + ent = G_FindTarget( NULL, current->target.c_str() ); + if ( !ent ) + { + gi.Error( ERR_DROP, "FallingRock :: Entity with targetname of '%s' not found", current->target.c_str() ); + } + + bounce_dir = ent->origin - current->origin; + bounce_dir.normalize(); + + return ent; + } + + +void FallingRock::NextBounce + ( + void + ) + + { + float time; + float distance; + Vector delta, xydelta; + float xy_speed; + float vertical_speed; + + delta = current->origin - origin; + xydelta = delta; + xydelta.z = 0; + xy_speed = speed; + + distance = xydelta.normalize(); + + time = distance / xy_speed; + + if ( !( spawnflags & NO_RANDOMNESS ) ) + { + if ( time > 1.0f ) + { + time = 0.75f + G_Random( 1 ); + } + + if ( time < 0.4f ) + { + time = 0.4f; + } + } + + vertical_speed = ( delta.z / time ) + ( 0.5f * gravity * sv_gravity->value * time ); + if ( vertical_speed < 0 ) + { + vertical_speed = 0; + } + + velocity = xydelta * xy_speed; + velocity.z = vertical_speed; + + Vector ang( 0, vectoyaw( delta ), 0 ); + ang.AngleVectors( NULL, &rotateaxis ); + + // make sure it leaves the ground + groundentity = NULL; + } + +void FallingRock::Rotate + ( + Event *ev + ) + + { + float mat[ 3 ][ 3 ]; + float ang; + + ang = 360.0f * FRAMETIME; + RotatePointAroundVector( mat[ 0 ], rotateaxis, orientation[ 0 ], ang ); + RotatePointAroundVector( mat[ 1 ], rotateaxis, orientation[ 1 ], ang ); + RotatePointAroundVector( mat[ 2 ], rotateaxis, orientation[ 2 ], ang ); + MatrixToEulerAngles( mat, angles ); + setAngles( angles ); + + if ( velocity != vec_zero ) + { + PostEvent( EV_FallingRock_Rotate, FRAMETIME ); + } + } + +void FallingRock::SetWait + ( + Event *ev + ) + + { + wait = ev->GetFloat( 1 ); + } + +void FallingRock::SetSpeed + ( + Event *ev + ) + + { + speed = ev->GetFloat( 1 ); + } + +void FallingRock::SetDmg + ( + Event *ev + ) + + { + dmg = ev->GetInteger( 1 ); + } + +void FallingRock::SetBounceSound + ( + str sound + ) + + { + bouncesound = sound; + // cache the sound in + CacheResource( bouncesound.c_str(), this ); + } + +void FallingRock::SetBounceSound + ( + Event *ev + ) + + { + SetBounceSound( ev->GetString( 1 ) ); + } + +void FallingRock::Activate + ( + Event *ev + ) + + { + if ( active == 1 ) + return; + + if ( ( active == 2 ) && ( spawnflags & SPAWN_AUTO_RESET ) ) + { + current = NULL; + activator = NULL; + setMoveType( MOVETYPE_NONE ); + NoLerpThisFrame(); + setOrigin( start_origin ); + } + + activator = ev->GetEntity( 1 ); + + if ( wait ) + { + PostEvent( EV_FallingRock_Start, wait ); + } + else + { + ProcessEvent( EV_FallingRock_Start ); + } + } + +void FallingRock::StartFalling + ( + Event *ev + ) + + { + if ( current ) + { + return; + } + + if ( !active ) + { + start_origin = origin; + } + + active = 1; + setMoveType( MOVETYPE_BOUNCE ); + setSolidType( SOLID_BBOX ); + PostEvent( EV_FallingRock_Rotate, FRAMETIME ); + edict->clipmask = MASK_SOLID|CONTENTS_BODY; + + last_bounce_origin = origin; + current = this; + current = SetNextBounceDir(); + if ( current ) + { + NextBounce(); + } + } + +void FallingRock::Touch + ( + Event *ev + ) + + { + Entity *other; + + other = ev->GetEntity( 1 ); + + if ( other != world ) + { + if ( ( velocity != vec_zero ) && ( other->takedamage ) && ( level.time >= attack_finished ) ) + { + other->Damage( this, activator, dmg, origin, vec_zero, vec_zero, 20, 0, MOD_THROWNOBJECT ); + attack_finished = level.time + FRAMETIME; + } + } + + if ( !current || ( other != world ) ) + { + return; + } + if ( bouncesound.length() ) + { + Vector delta( origin - last_bounce_origin ); + + if ( delta.length() > 8 ) + { + last_bounce_origin = origin; + Sound( bouncesound.c_str(), CHAN_VOICE ); + } + } + + // we have to wait to set the velocity since the physics code + // will modify it when we return. + PostEvent( EV_FallingRock_Bounce, 0 ); + } + +void FallingRock::Bounce + ( + Event *ev + ) + + { + Vector delta; + + if ( !current ) + { + return; + } + + do + { + // check if we've passed the waypoint + delta = origin - current->origin; + if ( ( delta * bounce_dir ) >= ( -2 * edict->radius ) ) + { + // call any threads on the current waypoint + if ( current->isSubclassOf( Trigger ) ) + { + current->ProcessEvent( EV_Trigger_StartThread ); + } + current = SetNextBounceDir(); + if ( !current ) + { + velocity = vec_zero; + if ( spawnflags & SPAWN_AUTO_RESET ) + { + active = 2; + } + else if ( spawnflags & REMOVE_ON_GROUND ) + { + PostEvent( EV_Remove, 0 ); + } + break; + } + } + else + { + NextBounce(); + break; + } + } + while( 1 ); + } + + + +/*****************************************************************************/ +/*QUAKED func_supplywater (0.75 0.75 0.75) ? x x NOT_PLAYERS MONSTERS PROJECTILES + +Creates a trigger than when touched gives the player water over a continuous time + +"wait" - how long to wait before re-triggering ( default 0.1 seconds ) +"amount" - how much water to give player on each trigger ( default 1 unit ) +"maxwater" - what the maximum amount of water this supply should charge the player to ( default 50 ) + +If NOT_PLAYERS is set, the trigger does not respond to players +If MONSTERS is set, the trigger will respond to monsters +If PROJECTILES is set, the trigger will respond to projectiles (rockets, grenades, etc.) + +******************************************************************************/ + +Event EV_SupplyWater_MaxWater + ( + "maxwater", + EV_DEFAULT, + "f", + "wait", + "How long to wait before rock starts falling." + ); + +Event EV_SupplyWater_ChargeOff + ( + "_chargeoff", + EV_DEFAULT, + NULL, + NULL, + "Turn charging sound off and ambient sound back on." + ); + +CLASS_DECLARATION( Trigger, SupplyWater, "func_supplywater" ) + { + { &EV_Trigger_Effect, Activate }, + { &EV_SupplyWater_MaxWater, MaxWater }, + { &EV_SupplyWater_ChargeOff, ChargeOff }, + { NULL, NULL } + }; + +SupplyWater::SupplyWater + ( + ) + + { + str realname; + + if ( LoadingSavegame ) + { + // Archive function will setup all necessary data + return; + } + wait = 0.1f; + amount = 1; + maxwater = 50; + + // + // turn our sound on once we spawn + // + PostEvent( EV_SupplyWater_ChargeOff, FRAMETIME ); + + // + // this is here so that it gets sent over for the ambients + // + PostEvent( EV_Show, EV_POSTSPAWN ); + } + +void SupplyWater::MaxWater + ( + Event *ev + ) + + { + maxwater = ev->GetInteger( 1 ); + } + +void SupplyWater::ChargeOff + ( + Event *ev + ) + + { + LoopSound( "snd_edenwater_ambient" ); + } + +void SupplyWater::Activate + ( + Event *ev + ) + + { + Entity *ent; + + ent = ev->GetEntity( 1 ); + + if ( ent->isSubclassOf( Player ) ) + { + Player *player = ( Player * )ent; + + if ( player->GetWaterPower() < maxwater ) + { + player->SetWaterPower( player->GetWaterPower() + this->amount ); + if ( EventPending( EV_SupplyWater_ChargeOff ) ) + { + CancelEventsOfType( EV_SupplyWater_ChargeOff ); + } + else + { + LoopSound( "snd_edenwater_charge" ); + } + PostEvent( EV_SupplyWater_ChargeOff, wait * 2 ); + } + } + } + + diff --git a/source/source/fgame/misc.h b/source/source/fgame/misc.h new file mode 100644 index 0000000..8674b7b --- /dev/null +++ b/source/source/fgame/misc.h @@ -0,0 +1,710 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/misc.h $ +// $Revision:: 50 $ +// $Author:: Markd $ +// $Date:: 7/27/00 6:31p $ +// +// Copyright (C) 1997 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/misc.h $ +// +// 50 7/27/00 6:31p Markd +// made useAnim's work with doors, added key ability +// +// 49 7/17/00 4:58p Markd +// fixed useobjects and skins +// +// 48 7/14/00 11:45p Markd +// Added ambient sounds to func_supllywater +// +// 47 7/11/00 9:28p Markd +// Added MaxWater event to func_watersupply +// +// 46 7/10/00 11:54p Markd +// added exit level code +// +// 45 7/07/00 4:32p Steven +// Teleporter stuff : no_effects flag, warp sentient to middle of teleporter +// and fixed some teleporting multiple times problems. +// +// 44 7/06/00 6:25p Steven +// Added new teleport stuff. +// +// 43 6/28/00 4:17p Markd +// fixed small UseAnim bug +// +// 42 6/23/00 8:41p Markd +// made a lot of changes to different constructors for saved game support +// +// 41 6/09/00 7:36p Markd +// Added activate and deactive to useobjects +// +// 40 6/07/00 5:36p Markd +// fixed falling rock code +// +// 39 6/04/00 6:52p Markd +// Added camera support to TouchAnim's cleaned up player camera interface +// +// 38 6/04/00 6:16p Markd +// Added TouchAnim support +// +// 37 5/26/00 7:44p Markd +// 2nd phase save games +// +// 36 5/24/00 3:14p Markd +// first phase of save/load games +// +// 35 4/21/00 6:16p Markd +// Fixed bounce sound stuff +// +// 34 4/19/00 9:25a Markd +// added bouncesound to falling rock code +// +// 33 4/06/00 5:45p Aldie +// Added func_supplywater +// +// 32 4/05/00 12:20p Markd +// added damage type +// +// 31 4/04/00 5:30p Markd +// Removed sounds from UseObject +// +// 30 3/31/00 6:07p Markd +// improved the functionality of UseObjects +// +// 29 3/31/00 3:19p Markd +// Added UseObject functionality +// +// 28 3/27/00 4:16p Markd +// added state to the UseAnim headers +// +// 27 3/21/00 5:05p Markd +// Added state variable to func_useanim_destination +// +// 26 3/20/00 3:01p Markd +// added more functionality to falling rock +// +// 25 3/18/00 2:43p Aldie +// Changed some func_spawn functionality +// +// 24 3/16/00 10:20a Markd +// fixed useanim firing its targets before the animation was completed +// +// 23 3/15/00 5:52p Aldie +// Added pushsound to func_pushobject and removed a printf. +// +// 22 3/13/00 7:46p Jimdose +// added fallingrock +// +// 21 3/01/00 11:25a Jimdose +// UseAnim now sends the entity that used it as the activator instead of itself +// when triggering targets +// +// 20 2/25/00 7:27p Markd +// Added useanim_numloop support and fixed useanim_orientation +// +// 19 2/24/00 3:17p Jimdose +// added canBeUsed to UseAnim +// added canPush to PushObject +// +// 18 2/22/00 6:57p Jimdose +// pushobjects now do damage when blocked +// push objects are now solid_bsp +// +// 17 2/22/00 1:57p Jimdose +// added PushObject +// +// 16 2/02/00 7:14p Markd +// Added func_explodeobject and TossObject +// +// 15 1/31/00 4:25p Jimdose +// added dir variable to monkeybar and horizontalpipe +// +// 14 1/22/00 12:42p Jimdose +// added HorizontalPipe +// +// 13 1/20/00 6:54p Aldie +// Removed bloodsplats until we do them the right way +// +// 12 1/19/00 7:46p Aldie +// Fixed func_spawns of various types and removed some unused misc classes +// +// 11 1/19/00 5:16p Markd +// Added thread and triggertarget to UseAnim +// +// 10 1/18/00 2:38p Markd +// Made UseAnim not multi-trigger by default +// +// 9 1/15/00 3:57p Markd +// Eliminated multiple "angle" events and replaced them with EV_SetAngle +// +// 8 1/15/00 1:36p Markd +// Added UseAnim and TouchUseAnim functionality to Player and game +// +// 7 1/12/00 6:13p Jimdose +// added base_velocity and random_velocity +// +// 6 1/06/00 11:08p Jimdose +// cleaning up unused code +// +// 5 12/14/18 2:44p Jimdose +// added func_monkeybar +// +// 4 11/04/99 10:03a Markd +// complete overhaul of the camera system +// +// 3 10/14/99 5:08p Markd +// removed a lot of G_GetMoveDir calls from the initialization code +// +// 2 9/23/99 7:30p Markd +// Added misc_model support and fixed shadows +// +// 1 9/10/99 10:54a Jimdose +// +// 1 9/08/99 3:16p Aldie +// +// 7 7/08/99 4:28p Markd +// Removed obsolete QUAKED functions +// +// DESCRIPTION: +// Basically the big stew pot of the DLLs, or maybe a garbage bin, whichever +// metaphore you prefer. This really should be cleaned up. Anyway, this +// should contain utility functions that could be used by any entity. +// Right now it contains everything from entities that could be in their +// own file to my mother pot roast recipes. +// + +#ifndef __MISC_H__ +#define __MISC_H__ + +#include "g_local.h" +#include "entity.h" +#include "mover.h" +#include "animate.h" + +class InfoNull : public Entity + { + public: + CLASS_PROTOTYPE( InfoNull ); + + InfoNull(); + }; + +class FuncRemove : public Entity + { + public: + CLASS_PROTOTYPE( FuncRemove ); + + FuncRemove(); + }; + +class MiscModel : public Entity + { + public: + CLASS_PROTOTYPE( MiscModel ); + + MiscModel(); + }; + +class InfoNotNull : public Entity + { + public: + CLASS_PROTOTYPE( InfoNotNull ); + }; + +class ExplodingWall : public Trigger + { + protected: + int dmg; + int explosions; + float attack_finished; + Vector land_angles; + float land_radius; + float angle_speed; + int state; + Vector base_velocity; + Vector random_velocity; + Vector orig_mins, orig_maxs; + qboolean on_ground; + + public: + CLASS_PROTOTYPE( ExplodingWall ); + + ExplodingWall(); + void Setup( Event *ev ); + void AngleSpeed( Event *ev ); + void LandRadius( Event *ev ); + void LandAngles( Event *ev ); + void BaseVelocity( Event *ev ); + void RandomVelocity( Event *ev ); + void SetDmg( Event *ev ); + void SetExplosions( Event *ev ); + void SetupSecondStage( void ); + void Explode( Event *ev ); + void DamageEvent( Event *ev ); + void GroundDamage( Event *ev ); + void TouchFunc( Event *ev ); + void StopRotating( Event *ev ); + void CheckOnGround( Event *ev ); + void Archive( Archiver &arc ); + }; + +inline void ExplodingWall::Archive + ( + Archiver &arc + ) + { + Trigger::Archive( arc ); + + arc.ArchiveInteger( &dmg ); + arc.ArchiveInteger( &explosions ); + arc.ArchiveFloat( &attack_finished ); + arc.ArchiveVector( &land_angles ); + arc.ArchiveFloat( &land_radius ); + arc.ArchiveFloat( &angle_speed ); + arc.ArchiveInteger( &state ); + arc.ArchiveVector( &base_velocity ); + arc.ArchiveVector( &random_velocity ); + arc.ArchiveVector( &orig_mins ); + arc.ArchiveVector( &orig_maxs ); + arc.ArchiveBoolean( &on_ground ); + } + + +class Teleporter : public Trigger + { + public: + str teleport_thread; + qboolean in_use; + + CLASS_PROTOTYPE( Teleporter ); + + Teleporter(); + virtual void StartTeleport( Event *ev ); + virtual void Teleport( Event *ev ); + virtual void StopTeleport( Event *ev ); + void SetThread( Event *ev ); + virtual void Archive( Archiver &arc ); + }; + +inline void Teleporter::Archive + ( + Archiver &arc + ) + { + Trigger::Archive( arc ); + + arc.ArchiveString( &teleport_thread ); + arc.ArchiveBoolean( &in_use ); + } + +class TeleporterDestination : public Entity + { + public: + Vector movedir; + + CLASS_PROTOTYPE( TeleporterDestination ); + + TeleporterDestination(); + void SetMoveDir( Event *ev ); + virtual void Archive( Archiver &arc ); + }; + +inline void TeleporterDestination::Archive + ( + Archiver &arc + ) + { + Entity::Archive( arc ); + + arc.ArchiveVector( &movedir ); + } + +class UseAnim : public Entity + { + public: + int count; + qboolean active; + str thread; + str triggertarget; + int num_loops; + str state; + str camera; + str anim; + str key; + float delay; + float last_active_time; + + CLASS_PROTOTYPE( UseAnim ); + + UseAnim(); + virtual void Touched( Event *ev ); + void Reset( Event *ev ); + void SetThread( Event * ev ); + void SetTriggerTarget( Event * ev ); + void SetCount( Event * ev ); + void SetAnim( Event *ev ); + void SetState( Event *ev ); + void SetKey( Event *ev ); + void SetCamera( Event *ev ); + void SetNumLoops( Event *ev ); + void SetDelay( Event *ev ); + bool canBeUsed( Entity *activator ); + bool GetInformation( Entity *activator, Vector * org, Vector * angles, str * animatoin, int * loopcount, str * state, str * camera ); + void TriggerTargets( Entity *activator ); + virtual void Archive( Archiver &arc ); + }; + +inline void UseAnim::Archive + ( + Archiver &arc + ) + { + Entity::Archive( arc ); + + arc.ArchiveInteger( &count ); + arc.ArchiveBoolean( &active ); + arc.ArchiveString( &thread ); + arc.ArchiveString( &triggertarget ); + arc.ArchiveInteger( &num_loops ); + arc.ArchiveString( &state ); + arc.ArchiveString( &camera ); + arc.ArchiveString( &anim ); + arc.ArchiveString( &key ); + arc.ArchiveFloat( &delay ); + arc.ArchiveFloat( &last_active_time ); + } + +class TouchAnim : public UseAnim + { + public: + + CLASS_PROTOTYPE( TouchAnim ); + + TouchAnim(); + }; + + +class UseAnimDestination : public Entity + { + public: + int num_loops; + str state; + str anim; + + CLASS_PROTOTYPE( UseAnimDestination ); + + UseAnimDestination(); + void SetAnim( Event *ev ); + void SetState( Event *ev ); + void SetNumLoops( Event *ev ); + int GetNumLoops( void ); + str GetAnim( void ); + str GetState( void ); + virtual void Archive( Archiver &arc ); + }; + +inline void UseAnimDestination::Archive + ( + Archiver &arc + ) + { + Entity::Archive( arc ); + + arc.ArchiveInteger( &num_loops ); + arc.ArchiveString( &state ); + arc.ArchiveString( &anim ); + } + +class UseObject : public Animate + { + public: + str move_thread; + str stop_thread; + str reset_thread; + str triggertarget; + Vector offset; + float yaw_offset; + int count; + float cone; + str state; + str state_backwards; + str useMaterial; + int objectState; + float reset_time; + qboolean active; + + CLASS_PROTOTYPE( UseObject ); + + UseObject(); + void SetMoveThread( Event * ev ); + void SetStopThread( Event * ev ); + void SetResetThread( Event * ev ); + void SetTriggerTarget( Event * ev ); + void SetOffset( Event * ev ); + void SetYawOffset( Event * ev ); + void SetCount( Event * ev ); + void SetCone( Event * ev ); + void SetState( Event * ev ); + void SetBackwardsState( Event * ev ); + void SetResetTime( Event * ev ); + void Reset( Event * ev ); + void Resetting( Event * ev ); + void DamageTriggered( Event * ev ); + void DamageFunc( Event * ev ); + bool canBeUsed( Vector org, Vector dir ); + void Setup( Entity *activator, Vector *org, Vector *ang, str *newstate ); + void Start( Event * ev = NULL ); + bool Loop( void ); + void SetActiveState( Event *ev ); + void Stop( Entity *activator ); + void ActivateEvent( Event *ev ); + void DeactivateEvent( Event *ev ); + void UseMaterialEvent( Event *ev ); + virtual void Archive( Archiver &arc ); + }; + +inline void UseObject::Archive + ( + Archiver &arc + ) + { + Animate::Archive( arc ); + + arc.ArchiveString( &move_thread ); + arc.ArchiveString( &stop_thread ); + arc.ArchiveString( &reset_thread ); + arc.ArchiveString( &triggertarget ); + arc.ArchiveVector( &offset ); + arc.ArchiveFloat( &yaw_offset ); + arc.ArchiveInteger( &count ); + arc.ArchiveFloat( &cone ); + arc.ArchiveString( &state ); + arc.ArchiveString( &state_backwards ); + arc.ArchiveString( &useMaterial ); + arc.ArchiveInteger( &objectState ); + arc.ArchiveFloat( &reset_time ); + arc.ArchiveBoolean( &active ); + } + + +class Waypoint : public Mover + { + public: + CLASS_PROTOTYPE( Waypoint ); + }; + +class MonkeyBars : public Entity + { + public: + float dir; + + CLASS_PROTOTYPE( MonkeyBars ); + + MonkeyBars(); + void SetAngleEvent( Event *ev ); + + virtual void Archive( Archiver &arc ); + }; + +inline void MonkeyBars::Archive + ( + Archiver &arc + ) + + { + Entity::Archive( arc ); + + arc.ArchiveFloat( &dir ); + } + +class HorizontalPipe : public Entity + { + public: + float dir; + + CLASS_PROTOTYPE( HorizontalPipe ); + + HorizontalPipe(); + void SetAngleEvent( Event *ev ); + + virtual void Archive( Archiver &arc ); + }; + +inline void HorizontalPipe::Archive + ( + Archiver &arc + ) + + { + Entity::Archive( arc ); + + arc.ArchiveFloat( &dir ); + } + +class TossObject : public Animate + { + private: + str bouncesound; + float bouncesoundchance; + void Stop( Event *ev ); + void Touch( Event *ev ); + void SetBounceSound( Event *ev ); + void SetBounceSoundChance( Event *ev ); + public: + CLASS_PROTOTYPE( TossObject ); + + TossObject(); + TossObject( str modelname ); + void SetBounceSound( str bounce ); + void SetBounceSoundChance( float chance ); + void SetVelocity( float severity ); + virtual void Archive( Archiver &arc ); + }; + +inline void TossObject::Archive + ( + Archiver &arc + ) + + { + Animate::Archive( arc ); + + arc.ArchiveString( &bouncesound ); + arc.ArchiveFloat( &bouncesoundchance ); + } + + +class PushObject : public Entity + { + private: + EntityPtr owner; + float attack_finished; + int dmg; + str pushsound; + + public: + CLASS_PROTOTYPE( PushObject ); + + PushObject(); + void Start( Event *ev ); + void SetDamage( Event *ev ); + void BlockFunc( Event *ev ); + void SetPushSound( Event *ev ); + qboolean Push( Entity *pusher, Vector move ); + qboolean canPush( Vector dir ); + + Entity *getOwner( void ); + + virtual void Archive( Archiver &arc ); + }; + +inline void PushObject::Archive + ( + Archiver &arc + ) + { + Entity::Archive( arc ); + + arc.ArchiveSafePointer( &owner ); + arc.ArchiveFloat( &attack_finished ); + arc.ArchiveInteger( &dmg ); + arc.ArchiveString( &pushsound ); + } + +class FallingRock : public Entity + { + private: + int active; + Vector start_origin; + Vector last_bounce_origin; + Entity *current; + Entity *activator; + Vector bounce_dir; + Vector rotateaxis; + float attack_finished; + float wait; + float speed; + int dmg; + str bouncesound; + + void Touch( Event *ev ); + void Bounce( Event *ev ); + void Rotate( Event *ev ); + void Activate( Event *ev ); + void NextBounce( void ); + void StartFalling( Event *ev ); + void SetWait( Event *ev ); + void SetSpeed( Event *ev ); + void SetDmg( Event *ev ); + Entity *SetNextBounceDir( void ); + void SetBounceSound( str sound ); + void SetBounceSound( Event *ev ); + virtual void Archive( Archiver &arc ); + + public: + CLASS_PROTOTYPE( FallingRock ); + + FallingRock(); + }; + +inline void FallingRock::Archive + ( + Archiver &arc + ) + + { + Entity::Archive( arc ); + + arc.ArchiveInteger( &active ); + arc.ArchiveVector( &start_origin ); + arc.ArchiveVector( &last_bounce_origin ); + arc.ArchiveObjectPointer( ( Class ** )¤t ); + arc.ArchiveObjectPointer( ( Class ** )&activator ); + arc.ArchiveVector( &bounce_dir ); + arc.ArchiveVector( &rotateaxis ); + arc.ArchiveFloat( &attack_finished ); + arc.ArchiveFloat( &wait ); + arc.ArchiveFloat( &speed ); + arc.ArchiveInteger( &dmg ); + arc.ArchiveString( &bouncesound ); + if ( arc.Loading() ) + { + SetBounceSound( bouncesound ); + } + } + + +class SupplyWater : public Trigger + { + private: + int maxwater; + int amount; + public: + CLASS_PROTOTYPE( SupplyWater ); + + SupplyWater(); + void Activate( Event *ev ); + void MaxWater( Event *ev ); + void ChargeOff( Event *ev ); + virtual void Archive( Archiver &arc ); + }; + +inline void SupplyWater::Archive + ( + Archiver &arc + ) + + { + Trigger::Archive( arc ); + + arc.ArchiveInteger( &amount ); + arc.ArchiveInteger( &maxwater ); + } + +#endif /* misc.h */ diff --git a/source/source/fgame/mover.cpp b/source/source/fgame/mover.cpp new file mode 100644 index 0000000..4e78a2d --- /dev/null +++ b/source/source/fgame/mover.cpp @@ -0,0 +1,309 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/mover.cpp $ +// $Revision:: 7 $ +// $Author:: Markd $ +// $Date:: 5/31/00 10:38a $ +// +// Copyright (C) 1997 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/mover.cpp $ +// +// 7 5/31/00 10:38a Markd +// fixed initialization bug +// +// 6 5/30/00 7:06p Markd +// saved games 4th pass +// +// 5 10/01/99 2:42p Markd +// moved all the binding code back into Entity from Mover +// +// 4 9/20/99 11:43a Markd +// added currentOrigin and currentAngles support to setOrigin and setAngles +// +// 3 9/17/99 5:32p Jimdose +// added TR_LERP +// +// 2 9/13/99 3:27p Aldie +// code merge +// +// 1 9/10/99 10:54a Jimdose +// +// 1 9/08/99 3:16p Aldie +// +// 14 6/07/99 12:25p Jimdose +// setAngles now properly updates viewangles when bound +// +// DESCRIPTION: +// Base class for any object that needs to move to specific locations over a +// period of time. This class is kept separate from most entities to keep +// class size down for objects that don't need such behavior. +// + +#include "g_local.h" +#include "entity.h" +#include "trigger.h" +#include "mover.h" + +#define MOVE_ANGLES 1 +#define MOVE_ORIGIN 2 + +CLASS_DECLARATION( Trigger, Mover, "mover" ) + { + { &EV_MoveDone, MoveDone }, + { NULL, NULL } + }; + + +Mover::Mover() + { + edict->s.pos.trType = TR_LERP; + endevent = NULL; + } + +Mover::~Mover() + { + } + +void Mover::MoveDone + ( + Event *ev + ) + + { + Event * event; + Vector move; + Vector amove; + + // zero out the movement + if ( moveflags & MOVE_ANGLES ) + { + avelocity = vec_zero; + amove = angledest - localangles; + } + else + { + amove = vec_zero; + } + + if ( moveflags & MOVE_ORIGIN ) + { + velocity = vec_zero; + move = finaldest - localorigin; + } + else + { + move = vec_zero; + } + + if ( !G_PushMove( this, move, amove ) ) + { + // Delay finish till we can move into the final position + PostEvent( EV_MoveDone, FRAMETIME ); + return; + } + + // + // After moving, set origin to exact final destination + // + if ( moveflags & MOVE_ORIGIN ) + { + setOrigin( finaldest ); + } + + if ( moveflags & MOVE_ANGLES ) + { + localangles = angledest; + + if ( ( localangles.x >= 360 ) || ( localangles.x < 0 ) ) + { + localangles.x -= ( (int)localangles.x / 360 ) * 360; + } + if ( ( localangles.y >= 360 ) || ( localangles.y < 0 ) ) + { + localangles.y -= ( (int)localangles.y / 360 ) * 360; + } + if ( ( localangles.z >= 360 ) || ( localangles.z < 0 ) ) + { + localangles.z -= ( (int)localangles.z / 360 ) * 360; + } + } + + event = endevent; + endevent = NULL; + ProcessEvent( event ); + } + +/* +============= +MoveTo + +calculate self.velocity and self.nextthink to reach dest from +self.origin traveling at speed +=============== +*/ +void Mover::MoveTo + ( + Vector tdest, + Vector angdest, + float tspeed, + Event &event + ) + + { + Vector vdestdelta; + Vector angdestdelta; + float len; + float traveltime; + + assert( tspeed >= 0 ); + + if ( !tspeed ) + { + error( "MoveTo", "No speed is defined!" ); + } + + if ( tspeed < 0 ) + { + error( "MoveTo", "Speed is negative!" ); + } + + // Cancel previous moves + CancelEventsOfType( EV_MoveDone ); + + moveflags = 0; + + if ( endevent ) + { + delete endevent; + } + endevent = new Event( event ); + + finaldest = tdest; + angledest = angdest; + + if ( finaldest != localorigin ) + { + moveflags |= MOVE_ORIGIN; + } + if ( angledest != localangles ) + { + moveflags |= MOVE_ANGLES; + } + + if ( !moveflags ) + { + // stop the object from moving + velocity = vec_zero; + avelocity = vec_zero; + + // post the event so we don't wait forever + PostEvent( EV_MoveDone, FRAMETIME ); + return; + } + + // set destdelta to the vector needed to move + vdestdelta = tdest - localorigin; + angdestdelta = angdest - localangles; + + if ( tdest == localorigin ) + { + // calculate length of vector based on angles + len = angdestdelta.length(); + } + else + { + // calculate length of vector based on distance + len = vdestdelta.length(); + } + + // divide by speed to get time to reach dest + traveltime = len / tspeed; + + // Quantize to FRAMETIME +// E3 HACK +// traveltime *= ( 1 / FRAMETIME ); +// traveltime = ( float )( (int)traveltime ) * FRAMETIME; + if ( traveltime < FRAMETIME ) + { + traveltime = FRAMETIME; + vdestdelta = vec_zero; + angdestdelta = vec_zero; + } + + // scale the destdelta vector by the time spent traveling to get velocity + if ( moveflags & MOVE_ORIGIN ) + { + velocity = vdestdelta * ( 1 / traveltime ); + } + + if ( moveflags & MOVE_ANGLES ) + { + avelocity = angdestdelta * ( 1 / traveltime ); + } + + PostEvent( EV_MoveDone, traveltime ); + } + +/* +============= +LinearInterpolate +=============== +*/ +void Mover::LinearInterpolate + ( + Vector tdest, + Vector angdest, + float time, + Event &event + ) + + { + Vector vdestdelta; + Vector angdestdelta; + float t; + + if ( endevent ) + { + delete endevent; + } + endevent = new Event( event ); + finaldest = tdest; + angledest = angdest; + + // Cancel previous moves + CancelEventsOfType( EV_MoveDone ); + + // Quantize to FRAMETIME +//E3 HACK +// time *= ( 1 / FRAMETIME ); +// time = ( float )( (int)time ) * FRAMETIME; + if ( time < FRAMETIME ) + { + time = FRAMETIME; + } + + moveflags = 0; + t = 1 / time; + // scale the destdelta vector by the time spent traveling to get velocity + if ( finaldest != localorigin ) + { + vdestdelta = tdest - localorigin; + velocity = vdestdelta * t; + moveflags |= MOVE_ORIGIN; + } + + if ( angledest != localangles ) + { + angdestdelta = angdest - localangles; + avelocity = angdestdelta * t; + moveflags |= MOVE_ANGLES; + } + + PostEvent( EV_MoveDone, time ); + } + diff --git a/source/source/fgame/mover.h b/source/source/fgame/mover.h new file mode 100644 index 0000000..83324f7 --- /dev/null +++ b/source/source/fgame/mover.h @@ -0,0 +1,80 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/mover.h $ +// $Revision:: 6 $ +// $Author:: Markd $ +// $Date:: 6/14/00 2:17p $ +// +// Copyright (C) 1997 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/mover.h $ +// +// 6 6/14/00 2:17p Markd +// fixed compiler warnings for Intel Compiler +// +// 5 5/30/00 7:06p Markd +// saved games 4th pass +// +// 4 5/27/00 2:56p Markd +// Save games 2nd pass +// +// 3 5/24/00 3:14p Markd +// first phase of save/load games +// +// 2 10/01/99 2:42p Markd +// moved all the binding code back into Entity from Mover +// +// 1 9/10/99 10:54a Jimdose +// +// 1 9/08/99 3:16p Aldie +// +// DESCRIPTION: +// Base class for any object that needs to move to specific locations over a +// period of time. This class is kept separate from most entities to keep +// class size down for objects that don't need such behavior. +// + +#ifndef __MOVER_H__ +#define __MOVER_H__ + +#include "g_local.h" +#include "entity.h" +#include "trigger.h" + +class Mover : public Trigger + { + private: + Vector finaldest; + Vector angledest; + Event *endevent; + int moveflags; + + public: + CLASS_PROTOTYPE( Mover ); + + Mover(); + virtual ~Mover(); + void MoveDone( Event *ev ); + void MoveTo( Vector tdest, Vector angdest, float tspeed, Event &event ); + void LinearInterpolate( Vector tdest, Vector angdest, float time, Event &event ); + virtual void Archive( Archiver &arc ); + }; + +inline void Mover::Archive + ( + Archiver &arc + ) + { + Trigger::Archive( arc ); + + arc.ArchiveVector( &finaldest ); + arc.ArchiveVector( &angledest ); + arc.ArchiveEventPointer( &endevent ); + arc.ArchiveInteger( &moveflags ); + } + +#endif diff --git a/source/source/fgame/nature.cpp b/source/source/fgame/nature.cpp new file mode 100644 index 0000000..ff1cbd9 --- /dev/null +++ b/source/source/fgame/nature.cpp @@ -0,0 +1,153 @@ +#include "nature.h" + +/*****************************************************************************/ +/*QUAKED func_emitter (0 0.25 0.5) ? + +"emitter" - Name of emitter to use. +******************************************************************************/ +Event EV_Emitter_EmitterName + ( + "emitter", + EV_DEFAULT, + "s", + "name", + "Emitter to use" + ); + +CLASS_DECLARATION( Entity, Emitter, "func_emitter" ) + { + { &EV_Emitter_EmitterName, EmitterName }, + }; + +Emitter::Emitter + ( + ) + + { + edict->s.eType = ET_EMITTER; + } + +void Emitter::setEmitter + ( + str name + ) + + { + emitterName = name; + edict->s.tag_num = gi.imageindex( emitterName ); + } + +void Emitter::EmitterName + ( + Event *ev + ) + + { + setEmitter( ev->GetString( 1 ) ); + } + +/*****************************************************************************/ +/*QUAKED func_rain (0 0.25 0.5) ? + +This creates a raining effect in the brush + +"emitter" - Name of emitter to use for the rain. +******************************************************************************/ + +CLASS_DECLARATION( Entity, Rain, "func_rain" ) + { + { NULL, NULL } + }; + + +Rain::Rain + ( + ) + + { + if ( LoadingSavegame ) + { + // Archive function will setup all necessary data + return; + } + setSolidType( SOLID_NOT ); + edict->s.eType = ET_RAIN; + setRainName( "defaultrain" ); + } + +void Rain::setRainName + ( + str name + ) + + { + rainName = name; + edict->s.tag_num = gi.imageindex( rainName ); + } + + +/*****************************************************************************/ +/* Plant Puffdaddy */ +/*****************************************************************************/ + +Event EV_PuffDaddy_Idle + ( + "idle", + EV_DEFAULT, + NULL, + NULL, + "Animates the puff daddy." + ); + +CLASS_DECLARATION( Animate, PuffDaddy, "plant_puffdaddy" ) + { + { &EV_Touch, Touch }, + { &EV_PuffDaddy_Idle, Idle }, + { NULL, NULL } + }; + +void PuffDaddy::Idle + ( + Event *ev + ) + + { + RandomAnimate( "idle" ); + } + +void PuffDaddy::Touch + ( + Event *ev + ) + + { + Entity *other; + + other = ev->GetEntity( 1 ); + + if ( !other->inheritsFrom( "Sentient" ) ) + return; + + RandomAnimate( "touch", EV_PuffDaddy_Idle ); + //SetFrame( 0 ); + + SurfaceCommand( "puffdaddy", "+nodraw" ); + setSolidType( SOLID_NOT ); + } + +PuffDaddy::PuffDaddy + ( + ) + + { + if ( LoadingSavegame ) + { + // Archive function will setup all necessary data + return; + } + setSolidType( SOLID_TRIGGER ); + edict->s.eType = ET_MODELANIM; + setModel( "plant_puffdaddy.tik" ); + PostEvent( EV_Show, 0 ); + //showModel(); + } diff --git a/source/source/fgame/nature.h b/source/source/fgame/nature.h new file mode 100644 index 0000000..80774d5 --- /dev/null +++ b/source/source/fgame/nature.h @@ -0,0 +1,67 @@ +#include "g_local.h" +#include "trigger.h" + +class Emitter : public Entity + { + private: + str emitterName; + void setEmitter( str name ); + void EmitterName( Event *ev ); + public: + CLASS_PROTOTYPE( Emitter ); + Emitter(); + virtual void Archive( Archiver &arc ); + }; + +inline void Emitter::Archive + ( + Archiver &arc + ) + { + Entity::Archive( arc ); + + arc.ArchiveString( &emitterName ); + if ( arc.Loading() ) + { + setEmitter( emitterName ); + } + } + + +class Rain : public Emitter + { + private: + str rainName; + void setRainName( str name ); + public: + CLASS_PROTOTYPE( Rain ); + Rain(); + virtual void Archive( Archiver &arc ); + }; + +inline void Rain::Archive + ( + Archiver &arc + ) + { + Entity::Archive( arc ); + + arc.ArchiveString( &rainName ); + if ( arc.Loading() ) + { + setRainName( rainName ); + } + } + + +class PuffDaddy : public Animate + { + private: + void Touch( Event *ev ); + void Idle( Event *ev ); + + public: + CLASS_PROTOTYPE( PuffDaddy ); + PuffDaddy(); + }; + diff --git a/source/source/fgame/navigate.cpp b/source/source/fgame/navigate.cpp new file mode 100644 index 0000000..19a27bd --- /dev/null +++ b/source/source/fgame/navigate.cpp @@ -0,0 +1,2673 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/navigate.cpp $ +// $Revision:: 28 $ +// $Author:: Steven $ +// $Date:: 7/05/00 2:30p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/navigate.cpp $ +// +// 28 7/05/00 2:30p Steven +// Took out pvs check to draw ai routes because can't see routes in water +// (distance cull is good enough) and added a warning if you target a node to +// itself. +// +// 27 6/27/00 5:47p Steven +// Took out some water restrictions on path connecting. +// +// 26 6/26/00 4:51p Steven +// Fixed some save/load game issues. +// +// 25 6/23/00 9:12p Markd +// fixed some loading of events at spawn time +// +// 24 6/14/00 3:50p Markd +// Cleaned up more Intel Compiler warnings +// +// 23 5/27/00 8:07p Markd +// Saved games 3rd pass +// +// 22 5/25/00 4:27p Markd +// rewrote archive functions +// +// 21 5/24/00 3:14p Markd +// first phase of save/load games +// +// 20 3/17/00 11:52a Steven +// Added jumping stuff. +// +// 19 3/06/00 8:12p Markd +// removed unused cvar +// +// 18 3/03/00 12:06p Steven +// Removed an annoying assert. +// +// 17 2/25/00 11:07a Steven +// Made ai_showroutes cull out nodes that are farther than the new cvar +// ai_showroutes_distance. +// +// 16 2/04/00 6:38p Markd +// Only print out the "." when loading in an archive +// +// 15 2/04/00 1:29p Markd +// Added checksum to ai path nodes. It auto saves on exit now and will +// automatically re-build nodes as needed +// +// 14 2/04/00 11:18a Markd +// Fixed memory leak with AI_PathNodes +// +// 13 1/26/00 7:18p Markd +// put in creating path indicator +// +// 12 1/25/00 6:32p Steven +// Fixed some path node stuff. +// +// 11 1/22/00 12:42p Jimdose +// got rid of calls to vec3() +// +// 10 1/15/00 3:57p Markd +// Eliminated multiple "angle" events and replaced them with EV_SetAngle +// +// 9 12/09/99 3:33p Aldie +// Removed a line where the player's origin was being multiplied by 0.125 +// +// 8 10/02/99 6:51p Markd +// Put in backend work for event documentation and fixed a lot of event +// documentation bugs +// +// 7 10/01/99 6:31p Markd +// added commands hidden inside fgame so that they would show up for command +// completion +// +// 6 10/01/99 4:52p Markd +// Made Warning level 4 work on all projects +// +// 5 9/29/99 5:18p Steven +// Event formatting. +// +// 4 9/27/99 5:45p Markd +// began documentation and cleanup phase after merge +// +// 3 9/16/99 11:18a Markd +// Continuing merge of code, not functional yet but closer +// +// 2 9/15/99 6:57p Aldie +// Update to get game working +// +// 1 9/10/99 10:54a Jimdose +// +// 1 9/08/99 3:16p Aldie +// +// 14 8/18/99 3:28p Jimdose +// added cylindrical collision detection +// +// 13 8/17/99 5:08p Markd +// Changed all FS_ReadFile's to FS_ReadFileEx's in game code +// +// 12 6/11/99 1:23p Phook +// +// 11 6/11/99 12:58p Phook +// Changed from SINED comments to QUAKED +// +// DESCRIPTION: +// C++ implementation of the A* search algorithm. +// + +#include "g_local.h" +#include "navigate.h" +#include "path.h" +#include "misc.h" +#include "doors.h" + +#define PATHFILE_VERSION 6 + +Event EV_AI_SavePaths + ( + "ai_savepaths", + EV_CHEAT, + NULL, + NULL, + "Saves the path nodes under the default name." + ); +Event EV_AI_SaveNodes + ( + "ai_save", + EV_CHEAT, + "s", + "filename", + "Save path nodes." + ); +Event EV_AI_LoadNodes + ( + "ai_load", + EV_CHEAT, + "s", + "filename", + "Loads path nodes." + ); +Event EV_AI_ClearNodes + ( + "ai_clearnodes", + EV_CHEAT, + NULL, + NULL, + "Clears all of the path nodes." + ); +Event EV_AI_RecalcPaths + ( + "ai_recalcpaths", + EV_CHEAT, + "i", + "nodenum", + "Update the specified node." + ); +Event EV_AI_CalcPath + ( + "ai_calcpath", + EV_CHEAT, + "ii", + "nodenum1 nodenum2", + "Calculate path from node1 to node2." + ); +Event EV_AI_DisconnectPath + ( + "ai_disconnectpath", + EV_CHEAT, + "ii", + "nodenum1 nodenum2", + "Disconnect path between node1 and node2." + ); +Event EV_AI_SetNodeFlags + ( + "ai_setflags", + EV_CHEAT, + "iSSSSSS", + "nodenum token1 token2 token3 token4 token5 token6", + "Set the flags for the specified node." + ); + +cvar_t *ai_createnodes = NULL; +cvar_t *ai_debugpath; +cvar_t *ai_debuginfo; +cvar_t *ai_showroutes; +cvar_t *ai_showroutes_distance; +cvar_t *ai_shownodenums; +cvar_t *ai_timepaths; + +static Entity *IgnoreObjects[ MAX_GENTITIES ]; +static int NumIgnoreObjects; + +static PathNode *pathnodes[ MAX_PATHNODES ]; +static qboolean pathnodesinitialized = false; +static qboolean loadingarchive = false; +static qboolean pathnodescalculated = false; +int ai_maxnode; + +#define MASK_PATHSOLID (CONTENTS_SOLID|CONTENTS_MONSTERCLIP) + +PathSearch PathManager; + +int path_checksthisframe; + +PathNode *AI_FindNode + ( + const char *name + ) + + { + int i; + + if ( !name ) + { + return NULL; + } + + if ( name[ 0 ] == '!' ) + { + name++; + return AI_GetNode( atof( name ) ); + } + + if ( name[ 0 ] == '$' ) + { + name++; + } + + for( i = 0; i <= ai_maxnode; i++ ) + { + if ( pathnodes[ i ] && ( pathnodes[ i ]->TargetName() == name ) ) + { + return pathnodes[ i ]; + } + } + + return NULL; + } + +PathNode *AI_GetNode + ( + int num + ) + + { + if ( ( num < 0 ) || ( num > MAX_PATHNODES ) ) + { + assert( false ); + return NULL; + } + + return pathnodes[ num ]; + } + +void AI_AddNode + ( + PathNode *node + ) + + { + int i; + + assert( node ); + + for( i = 0; i < MAX_PATHNODES; i++ ) + { + if ( pathnodes[ i ] == NULL ) + { + break; + } + } + + if ( i < MAX_PATHNODES ) + { + if ( i > ai_maxnode ) + { + ai_maxnode = i; + } + pathnodes[ i ] = node; + node->nodenum = i; + return; + } + + gi.Error( ERR_DROP, "Exceeded MAX_PATHNODES!\n" ); + } + +void AI_RemoveNode + ( + PathNode *node + ) + + { + assert( node ); + if ( ( node->nodenum < 0 ) || ( node->nodenum > ai_maxnode ) ) + { + assert( false ); + gi.Error( ERR_DROP, "Corrupt pathnode!\n" ); + } + + // If the nodenum is 0, the node was probably removed during initialization + // otherwise, it's a bug. + assert( ( pathnodes[ node->nodenum ] == node ) || ( node->nodenum == 0 ) ); + if ( pathnodes[ node->nodenum ] == node ) + { + pathnodes[ node->nodenum ] = NULL; + } + } + +void AI_ResetNodes + ( + void + ) + + { + int i; + + if ( !pathnodesinitialized ) + { + memset( pathnodes, 0, sizeof( pathnodes ) ); + pathnodesinitialized = true; + } + else + { + for( i = 0; i < MAX_PATHNODES; i++ ) + { + if ( pathnodes[ i ] ) + { + delete pathnodes[ i ]; + } + } + } + + ai_maxnode = 0; + } + +/*****************************************************************************/ +/*QUAKED info_pathnode (1 0 0) (-24 -24 0) (24 24 32) FLEE DUCK COVER DOOR JUMP LADDER + +FLEE marks the node as a safe place to flee to. Actor will be removed when it reaches a flee node and is not visible to a player. + +DUCK marks the node as a good place to duck behind during weapon fire. + +COVER marks the node as a good place to hide behind during weapon fire. + +DOOR marks the node as a door node. If an adjacent node has DOOR marked as well, the actor will only use the path if the door in between them is unlocked. + +JUMP marks the node as one to jump from when going to the node specified by target. +"target" the pathnode to jump to. + +******************************************************************************/ + +Event EV_Path_FindChildren + ( + "findchildren", + EV_DEFAULT, + NULL, + NULL, + "Adds this node to the path manager." + ); +Event EV_Path_FindEntities + ( + "findentities", + EV_DEFAULT, + NULL, + NULL, + "Finds doors." + ); +Event EV_Path_SetNodeFlags + ( + "spawnflags", + EV_DEFAULT, + "i", + "node_flags", + "Sets the path nodes flags." + ); +Event EV_Path_SetOriginEvent + ( + "origin", + EV_DEFAULT, + "v", + "origin", + "Sets the path node's origin." + ); +Event EV_Path_SetAngles + ( + "angles", + EV_DEFAULT, + "v", + "angles", + "Sets the path node's angles." + ); +Event EV_Path_SetAnim + ( + "anim", + EV_DEFAULT, + "s", + "animname", + "Sets the animname used for this path node." + ); +Event EV_Path_SetTargetname + ( + "targetname", + EV_DEFAULT, + "s", + "targetname", + "Sets the target name for this path node." + ); +Event EV_Path_SetTarget + ( + "target", + EV_DEFAULT, + "s", + "target", + "Sets the target for this path node." + ); + +CLASS_DECLARATION( Listener, PathNode, "info_pathnode" ) + { + { &EV_Path_FindChildren, FindChildren }, + { &EV_Path_FindEntities, FindEntities }, + { &EV_Path_SetNodeFlags, SetNodeFlags }, + { &EV_Path_SetOriginEvent, SetOriginEvent }, + { &EV_SetAngle, SetAngle }, + { &EV_Path_SetAngles, SetAngles }, + { &EV_Path_SetAnim, SetAnim }, + { &EV_Path_SetTargetname, SetTargetname }, + { &EV_Path_SetTarget, SetTarget }, + { NULL, NULL } + }; + +static Vector pathNodesChecksum; +static int numLoadNodes = 0; +static int numNodes = 0; +static PathNode *NodeList = NULL; + +PathNode::PathNode() + { + numLoadNodes++; + nodenum = 0; + if ( !loadingarchive ) + { + // our archive function will take care of this stuff + AI_AddNode( this ); + PostEvent( EV_Path_FindChildren, 0 ); + } + + occupiedTime = 0; + + nodeflags = 0; + setangles = false; + drawtime = 0; + contents = 0; + + occupiedTime = 0; + entnum = 0; + + // crouch hieght + setSize( "-24 -24 0", "24 24 40" ); + + f = 0; + h = 0; + g = 0; + + gridX = 0; + gridY = 0; + inlist = NOT_IN_LIST; + + // reject is used to indicate that a node is unfit for ending on during a search + reject = false; + + numChildren = 0; + + Parent = NULL; + NextNode = NULL; + } + +PathNode::~PathNode() + { + PathManager.RemoveNode( this ); + + AI_RemoveNode( this ); + } + +void PathNode::SetNodeFlags + ( + Event *ev + ) + + { + nodeflags = ev->GetInteger( 1 ); + } + +void PathNode::SetOriginEvent + ( + Event *ev + ) + + { + setOrigin( ev->GetVector( 1 ) ); + pathNodesChecksum += origin; + } + +void PathNode::SetAngle + ( + Event *ev + ) + + { + Vector movedir; + setangles = true; + + movedir = G_GetMovedir( ev->GetFloat( 1 ) ); + setAngles( movedir.toAngles() ); + } + +void PathNode::SetAngles + ( + Event *ev + ) + + { + setangles = true; + setAngles( ev->GetVector( 1 ) ); + } + +void PathNode::SetAnim + ( + Event *ev + ) + + { + animname = ev->GetString( 1 ); + } + +void PathNode::SetTargetname + ( + Event *ev + ) + + { + targetname = ev->GetString( 1 ); + } + +void PathNode::SetTarget + ( + Event *ev + ) + + { + target = ev->GetString( 1 ); + } + +str &PathNode::TargetName + ( + void + ) + + { + return targetname; + } + +void PathNode::setAngles + ( + Vector ang + ) + + { + angles = ang; + } + +void PathNode::setOrigin + ( + Vector org + ) + + { + origin = org; + contents = gi.pointcontents( origin, 0 ); + } + +void PathNode::setSize + ( + Vector min, + Vector max + ) + + { + mins = min; + maxs = max; + } + +void PathNode::Setup + ( + Vector pos + ) + + { + CancelEventsOfType( EV_Path_FindChildren ); + + setOrigin( pos ); + + ProcessEvent( EV_Path_FindChildren ); + } + +void PathNode::Archive + ( + Archiver &arc + ) + + { + int i; + + Listener::Archive( arc ); + + arc.ArchiveInteger( &nodenum ); + if ( arc.Loading() ) + { + assert( nodenum <= MAX_PATHNODES ); + if ( nodenum > MAX_PATHNODES ) + { + arc.FileError( "Node exceeds max path nodes" ); + } + } + arc.ArchiveInteger( &nodeflags ); + arc.ArchiveVector( &origin ); + arc.ArchiveVector( &angles ); + if ( arc.Loading() ) + { + setOrigin( origin ); + setAngles( angles ); + } + + arc.ArchiveBoolean( &setangles ); + arc.ArchiveString( &target ); + arc.ArchiveString( &targetname ); + arc.ArchiveString( &animname ); + + arc.ArchiveFloat( &occupiedTime ); + arc.ArchiveInteger( &entnum ); + + if ( arc.Loading() && !LoadingSavegame ) + { + occupiedTime = 0; + entnum = 0; + } + + arc.ArchiveInteger( &numChildren ); + if ( arc.Loading() ) + { + assert( numChildren <= NUM_PATHSPERNODE ); + if ( numChildren > NUM_PATHSPERNODE ) + { + arc.FileError( "Exceeded num paths per node" ); + } + } + for( i = 0; i < numChildren; i++ ) + { + arc.ArchiveShort( &Child[ i ].node ); + arc.ArchiveShort( &Child[ i ].moveCost ); + arc.ArchiveRaw( Child[ i ].maxheight, sizeof( Child[ i ].maxheight ) ); + arc.ArchiveInteger( &Child[ i ].door ); + } + + if ( arc.Loading() ) + { + if ( !LoadingSavegame ) + { + // Fixup the doors + PostEvent( EV_Path_FindEntities, 0 ); + } + pathnodes[ nodenum ] = this; + if ( ai_maxnode < nodenum ) + { + ai_maxnode = nodenum; + } + PathManager.AddNode( this ); + } + } + +void PathNode::FindEntities + ( + Event *ev + ) + + { + int i; + Door *door; + PathNode *node; + + for( i = 0; i < numChildren; i++ ) + { + if ( Child[ i ].door ) + { + node = AI_GetNode( Child[ i ].node ); + + assert( node ); + + door = CheckDoor( node->origin ); + if ( door ) + { + Child[ i ].door = door->entnum; + } + else + { + Child[ i ].door = 0; + } + } + } + } + +void RestoreEnts + ( + void + ) + + { + int i; + + for( i = 0; i < NumIgnoreObjects; i++ ) + { + IgnoreObjects[ i ]->link(); + } + } + +qboolean PathNode::TestMove + ( + Entity *ent, + Vector start, + Vector end, + Vector &min, + Vector &max, + qboolean allowdoors, + qboolean fulltest + ) + + { + // NOTE: TestMove may allow wide paths to succeed when they shouldn't since it + // may place the lower node above obstacles that actors can't step over. + // Since any path that's wide enough for large boxes must also allow + // thinner boxes to go through, you must ignore the results of TestMove + // when thinner checks have already failed. + trace_t trace; + Vector end_trace; + Vector pos; + Vector dir; + float t; + float dist; + + // By requiring that paths have STEPSIZE headroom above the path, we simplify the test + // to see if an actor can move to a node down to a simple trace. By stepping up the start + // and end points, we account for the actor's ability to step up any geometry lower than + // STEPSIZE in height. + start.z += STEPSIZE; + end.z += STEPSIZE; + + // Check the move + trace = G_Trace( start, min, max, end, ent, MASK_PATHSOLID, false, "PathNode::TestMove 1" ); + if ( trace.startsolid || ( trace.fraction != 1 ) ) + { + // No direct path available. The actor will most likely not be able to move through here. + return false; + } + + if ( !fulltest ) + { + // Since we're not doing a full test (full tests are only done when we're connecting nodes to save time), + // we test to see if the midpoint of the move would only cause a change in height of STEPSIZE + // from the predicted height. This prevents most cases where a dropoff lies between a actor and a node. + Vector pos; + + // Since we start and end are already STEPSIZE above the ground, we have to check twice STEPSIZE below + // the midpoint to see if the midpoint is on the ground. + dir = end - start; + pos = start + dir * 0.5; + end_trace = pos; + end_trace.z -= STEPSIZE * 2; + + // Check that the midpos is onground. This may fail on ok moves, but a true test would be too slow + // to do in real time. Also, we may miss cases where a dropoff exists before or after the midpoint. + // Once the actor is close enough to the drop off, it will discover the fall and hopefully try + // another route. + trace = G_Trace( pos, min, max, end_trace, ent, MASK_PATHSOLID, false, "PathNode::TestMove 2" ); + if ( trace.startsolid || ( trace.fraction == 1 ) ) + { + // We're not on the ground, so there's a good posibility that we can't make this move without falling. + return false; + } + } + else //if ( !( contents & MASK_WATER ) ) + { + // When we're creating the paths during load time, we do a much more exhaustive test to see if the + // path is valid. This test takes a bounding box and moves it 8 units at a time closer to the goal, + // testing the ground after each move. The test involves checking whether we will fall more than + // STEPSIZE to the ground (since we've raised the start and end points STEPSIZE above the ground, + // we must actually test 2 * STEPSIZE down to see if we're on the ground). After each test, we set + // the new height of the box to be STEPSIZE above the ground. Each move closer to the goal is only + // done horizontally to simulate how the actors normally move. This method ensures that any actor + // wider than 8 units in X and Y will be able to move from start to end. + // + // NOTE: This may allow wide paths to succeed when they shouldn't since it + // may place the lower node above obstacles that actors can't step over. + // Since any path that's wide enough for large boxes must also allow + // thinner boxes to go through, you must ignore the results of TestMove + // when thinner checks have already failed. + + dir = end - start; + dir.z = 0; + dist = dir.length(); + dir *= 1 / dist; + + // check the entire move + pos = start; + for( t = 0; t < dist; t += 8 ) + { + // Move the box to our position along the path and make our downward trace vector + end_trace.x = pos.x = start.x + t * dir.x; + end_trace.y = pos.y = start.y + t * dir.y; + end_trace.z = pos.z - STEPSIZE * 2; + + // check the ground + trace = G_Trace( pos, min, max, end_trace, ent, MASK_PATHSOLID, false, "PathNode::TestMove 3" ); + if ( trace.startsolid || ( trace.fraction == 1 ) ) + { + // Either we're stuck in something solid, or we would fall farther than STEPSIZE to the ground, + // so the path is not acceptable. + return false; + } + + // move the box to STEPSIZE above the ground. + pos.z = trace.endpos[ 2 ] + STEPSIZE; + } + } + + return true; + } + +qboolean PathNode::CheckMove + ( + Entity *ent, + Vector pos, + Vector &min, + Vector &max, + qboolean allowdoors, + qboolean fulltest + ) + + { + // Since we need to support actors of variable widths, we need to do some special checks when a potential + // path goes up or down stairs. Placed pathnodes are only 16x16 in width, so when they are dropped to the + // ground, they may end in a position where a larger box would not fit. Making the pathnodes larger + // would make it hard to place paths where smaller actors could go, and making paths of various sizes would + // be overkill (more work for the level designer, or a lot of redundant data). The solution is to treat + // paths with verticle movement differently than paths that are purely horizontal. For horizontal moves, + // a simple trace STEPSIZE above the ground will be sufficient to prove that we can travel from one node + // to another, in either direction. For moves that have some change in height, we can check that we have + // a clear path by tracing horizontally from the higher node to a point where larger bounding box actors + // could then move at a slope downward to the lower node. This fixes the problem where path points that + // are larger than the depth of a step would have to intersect with the step in order to get the center + // of the box on solid ground. If you're still confused, well, tough. :) Think about the problem of + // larger bounding boxes going up stairs for a bit and you should see the problem. You can also read + // section 8.4, "Translating a Convex Polygon", from Computational Geometry in C (O'Rourke) (a f'ing + // great book, BTW) for information on similar problems (which is also a good explanation of how + // Quake's collision detection works). + trace_t trace; + int height; + + height = ( int )fabs( pos.z - origin.z ); + // Check if the path is strictly horizontal + if ( !height ) + { + // We do two traces for the strictly horizontal test. One normal, and one STEPSIZE + // above. The normal trace is needed because most doors in the game aren't tall enough + // to allow actors to trace STEPSIZE above the ground. This means that failed horizontal + // tests require two traces. Annoying. + trace = G_Trace( origin, min, max, pos, ent, MASK_PATHSOLID, false, "PathNode::CheckMove 1" ); + if ( !trace.startsolid && ( trace.fraction == 1 ) ) + { + return true; + } + + // Do the step test + return TestMove( ent, pos, origin, min, max, allowdoors, fulltest ); + } + + Vector size; + float width; + + size = max - min; + width = max( size.x, size.y ); + + // if our bounding box is smaller than that of the pathnode, we can do the standard trace. + if ( width <= 32 ) + { + return TestMove( ent, pos, origin, min, max, allowdoors, fulltest ); + } + + Vector start; + Vector end; + Vector delta; + float radius; + float len; + + // We calculate the radius of the smallest cylinder that would contain the bounding box. + // In some cases, this would make the first horizontal move longer than it needs to be, but + // that shouldn't be a problem. + + // multiply the width by 1/2 the square root of 2 to get radius + radius = width * 1.415 * 0.5; + + // Make sure that our starting position is the higher node since it doesn't matter which + // direction the move is in. + if ( pos.z < origin.z ) + { + start = origin; + end = pos; + } + else + { + start = pos; + end = origin; + } + + // If the distance between the two points is less than the radius of the bounding box, + // then we only have to do the horizontal test since larger bounding boxes would not fall. + delta = end - start; + len = delta.length(); + if ( len <= radius ) + { + end.z = start.z; + return TestMove( ent, start, end, min, max, allowdoors, fulltest ); + } + + Vector mid; + + // normalize delta and multiply by radius (saving a few multiplies by combining into one). + delta *= radius / len; + + mid = start; + mid.x += delta.x; + mid.y += delta.y; + + // Check the horizontal move + if ( !TestMove( ent, start, mid, min, max, allowdoors, fulltest ) ) + { + return false; + } + + // Calculate our new endpoint + end.z -= delta.z; + + // Check our new sloping move + return TestMove( ent, mid, end, min, max, allowdoors, fulltest ); + } + +Door *PathNode::CheckDoor + ( + Vector pos + ) + + { + trace_t trace; + Entity *ent; + + trace = G_Trace( origin, vec_zero, vec_zero, pos, NULL, MASK_PATHSOLID, false, "PathNode::CheckDoor" ); + + if ( trace.ent ) + { + ent = trace.ent->entity; + } + else + { + ent = NULL; + } + if ( ent && ent->isSubclassOf( Door ) ) + { + return ( Door * )ent; + } + + return NULL; + } + +qboolean PathNode::CheckMove + ( + Vector pos, + Vector min, + Vector max + ) + + { + return true; + } + +qboolean PathNode::CheckPath + ( + PathNode *node, + Vector min, + Vector max, + qboolean fulltest + ) + + { + Vector delta; + qboolean allowdoors; + qboolean result; + + delta = node->origin - origin; + delta[ 2 ] = 0; + if ( delta.length() >= PATHMAP_CELLSIZE ) + { + return false; + } + + allowdoors = ( nodeflags & AI_DOOR ) && ( node->nodeflags & AI_DOOR ); + + result = CheckMove( NULL, node->origin, min, max, allowdoors, fulltest ); + RestoreEnts(); + + return result; + } + +qboolean PathNode::ClearPathTo + ( + PathNode *node, + byte maxheight[ NUM_WIDTH_VALUES ], + qboolean fulltest + ) + + { + int i; + int width; + int height; + int bottom; + int top; + Vector min; + Vector max; + Vector bmin; + Vector bmax; + qboolean path; + int touch[ MAX_GENTITIES ]; + Entity *ent; + int num; + + path = false; + for( i = 0; i < NUM_WIDTH_VALUES; i++ ) + { + maxheight[ i ] = 0; + } + + width = NUM_WIDTH_VALUES * WIDTH_STEP * 0.5; + min = Vector( -width, -width, 0 ); + max = Vector( width, width, MAX_HEIGHT ); + G_CalcBoundsOfMove( origin, node->origin, min, max, &bmin, &bmax ); + + num = gi.AreaEntities( bmin, bmax, touch, MAX_GENTITIES ); + //num = gi.BoxEdicts( bmin, bmax, touch, MAX_GENTITIES, AREA_SOLID ); + for( i = 0; i < num; i++ ) + { + ent = g_entities[ touch[ i ] ].entity; + if ( ent && ent->isSubclassOf( Door ) ) + { + ent->unlink(); + } + } + + for( i = 0; i < NUM_WIDTH_VALUES; i++ ) + { + width = ( i + 1 ) * WIDTH_STEP * 0.5; + + min.x = min.y = -width; + max.x = max.y = width; + + // Perform a binary search to find the height of the path. Neat, eh? :) + bottom = 0; + top = MAX_HEIGHT; + while( top >= bottom ) + { + height = ( ( bottom + top + 3 ) >> 1 ) & ~0x3; + if ( !height ) + { + break; + } + + max.z = ( float )height; + if ( !CheckPath( node, min, max, fulltest ) ) + { + top = height - 4; + } + else + { + bottom = height + 4; + maxheight[ i ] = height; + } + } + + if ( !maxheight[ i ] ) + { + // If no paths were available at this width, don't allow any wider paths. + // CheckPath uses TestMove which may allow wide paths to succeed when they + // shouldn't since it may place the lower node above obstacles that actors + // can't step over. Since any path that's wide enough for large boxes must + // also allow thinner boxes to go through, this check avoids the hole in + // TestMove's functioning. + break; + } + + path = true; + } + + // Restore the doors + for( i = 0; i < num; i++ ) + { + ent = g_entities[ touch[ i ] ].entity; + if ( ent && ent->isSubclassOf( Door ) ) + { + ent->link(); + } + } + + return path; + } + +qboolean PathNode::LadderTo + ( + PathNode *node, + byte maxheight[ NUM_WIDTH_VALUES ] + ) + + { + int i; + int j; + int m; + int width; + Vector min; + Vector max; + qboolean path; + + trace_t trace; + + if ( !( nodeflags & AI_LADDER ) || !( node->nodeflags & AI_LADDER ) ) + { + return false; + } + + if ( ( origin.x != node->origin.x ) || ( origin.y != node->origin.y ) ) + { + return false; + } + + path = false; + + for( i = 0; i < NUM_WIDTH_VALUES; i++ ) + { + width = ( i + 1 ) * WIDTH_STEP * 0.5; + min = Vector( -width, -width, 12 ); + max = Vector( width, width, 40 ); + + trace = G_Trace( origin, min, max, node->origin, NULL, MASK_PATHSOLID, false, "PathNode::LadderTo 1" ); + if ( ( trace.fraction != 1 ) || trace.startsolid ) + { + maxheight[ i ] = 0; + continue; + } + + path = true; + + m = 40; + for( j = 48; j < MAX_HEIGHT; j+= 8 ) + { + max.z = j; + trace = G_Trace( origin, min, max, node->origin, NULL, MASK_PATHSOLID, false, "PathNode::LadderTo 2" ); + if ( ( trace.fraction != 1 ) || trace.startsolid ) + { + break; + } + + m = j; + } + + maxheight[ i ] = m; + } + + return path; + } + +qboolean PathNode::ConnectedTo + ( + PathNode *node + ) + + { + int i; + + for( i = 0; i < numChildren; i++ ) + { + if ( Child[ i ].node == node->nodenum ) + { + return true; + } + } + + return false; + } + +void PathNode::ConnectTo + ( + PathNode *node, + byte maxheight[ NUM_WIDTH_VALUES ], + float cost, + Door *door + ) + + { + int i; + + if ( ( numChildren < NUM_PATHSPERNODE ) && ( node != this ) ) + { + Child[ numChildren ].node = node->nodenum; + for( i = 0; i < NUM_WIDTH_VALUES; i++ ) + { + Child[ numChildren ].maxheight[ i ] = maxheight[ i ]; + } + Child[ numChildren ].moveCost = ( int )cost; + Child[ numChildren ].door = door ? door->entnum : 0; + numChildren++; + } + else + { + warning( "ConnectTo", "Child overflow" ); + } + } + +void PathNode::ConnectTo + ( + PathNode *node, + byte maxheight[ NUM_WIDTH_VALUES ] + ) + + { + Vector delta; + Door *door; + + door = CheckDoor( node->origin ); + delta = node->origin - origin; + ConnectTo( node, maxheight, delta.length(), door ); + } + +void PathNode::Disconnect + ( + PathNode *node + ) + + { + int i; + + for( i = 0; i < numChildren; i++ ) + { + if ( Child[ i ].node == node->nodenum ) + { + break; + } + } + + // Should never happen, but let it slide after release + assert( i != numChildren ); + if ( i == numChildren ) + { + return; + } + + numChildren--; + + // Since we're not worried about the order of the nodes, just + // move the last node into the slot occupied by the removed node. + Child[ i ] = Child[ numChildren ]; + Child[ numChildren ].node = 0; + Child[ numChildren ].moveCost = 0; + } + +void PathNode::FindChildren + ( + Event *ev + ) + + { + trace_t trace; + Vector end; + Vector start; + + pathnodescalculated = true; + + origin.x = ( ( int )( origin.x * 0.125 ) ) * 8; + origin.y = ( ( int )( origin.y * 0.125 ) ) * 8; + setOrigin( origin ); + + //if ( !( contents & MASK_WATER ) ) + { + start = origin + "0 0 1"; + end = origin; + end[ 2 ] -= 256; + + trace = G_Trace( start, mins, maxs, end, NULL, MASK_PATHSOLID, false, "PathNode::FindChildren" ); + if ( trace.fraction != 1 && !trace.allsolid ) + { + setOrigin( trace.endpos ); + } + } + + PathManager.AddNode( this ); + } + +void PathNode::DrawConnections + ( + void + ) + + { + int i; + pathway_t *path; + PathNode *node; + + for( i = 0; i < numChildren; i++ ) + { + path = &Child[ i ]; + node = AI_GetNode( path->node ); + + G_DebugLine( origin + "0 0 24", node->origin + "0 0 24", 0.7, 0.7, 0, 1 ); + } + } + +void DrawAllConnections + ( + void + ) + + { + int i; + pathway_t *path; + PathNode *node; + PathNode *n; + Vector down; + Vector up; + Vector dir; + Vector p1; + Vector p2; + Vector p3; + Vector playerorigin; + qboolean showroutes; + qboolean shownums; + qboolean draw; + int maxheight; + int pathnum; + + showroutes = ( ai_showroutes->integer != 0 ); + shownums = ( ai_shownodenums->integer != 0 ); + + if ( ai_showroutes->integer == 1 || ai_showroutes->integer == 0 ) + { + pathnum = ( 32 / WIDTH_STEP ) - 1; + } + else + { + pathnum = ( ( ( int )ai_showroutes->integer ) / WIDTH_STEP ) - 1; + } + + if ( ( pathnum < 0 ) || ( pathnum >= MAX_WIDTH ) ) + { + gi.Printf( "ai_showroutes: Value out of range\n" ); + gi.cvar_set( "ai_showroutes", "0" ); + return; + } + + // Figure out where the camera is + + if ( !g_entities[ 0 ].client ) + return; + + playerorigin.x = g_entities[ 0 ].client->ps.origin[ 0 ]; + playerorigin.y = g_entities[ 0 ].client->ps.origin[ 1 ]; + playerorigin.z = g_entities[ 0 ].client->ps.origin[ 2 ]; + + playerorigin[ 2 ] += g_entities[ 0 ].client->ps.viewheight; + + for( node = NodeList; node != NULL; node = node->chain ) + { + /* if ( !gi.inPVS( playerorigin, node->origin ) ) + { + continue; + } */ + + if ( Vector( node->origin - playerorigin ).length() > ai_showroutes_distance->integer ) + { + continue; + } + + if ( shownums ) + { + G_DrawDebugNumber( node->origin + Vector( 0, 0, 14 ), node->nodenum, 1.5, 1, 1, 0 ); + } + + draw = false; + for( i = 0; i < node->numChildren; i++ ) + { + path = &node->Child[ i ]; + n = AI_GetNode( path->node ); + + maxheight = path->maxheight[ pathnum ]; + if ( maxheight == 0 ) + { + continue; + } + + draw = true; + + if ( !showroutes ) + { + continue; + } + + // don't draw the path if it's already been drawn by the destination node + if ( n->drawtime < level.time || !n->ConnectedTo( node ) ) + { + down.z = 2; + up.z = maxheight; + + if ( n->nodeflags & AI_JUMP && node->nodeflags & AI_JUMP ) + { + // These are jump nodes draw, them in blue instead of green + G_DebugLine( node->origin + down, n->origin + down, 0, 0, 1, 1 ); + G_DebugLine( n->origin + down, n->origin + up, 0, 0, 1, 1 ); + G_DebugLine( node->origin + up, n->origin + up, 0, 0, 1, 1 ); + G_DebugLine( node->origin + up, node->origin + down, 0, 0, 1, 1 ); + } + else + { + G_DebugLine( node->origin + down, n->origin + down, 0, 1, 0, 1 ); + G_DebugLine( n->origin + down, n->origin + up, 0, 1, 0, 1 ); + G_DebugLine( node->origin + up, n->origin + up, 0, 1, 0, 1 ); + G_DebugLine( node->origin + up, node->origin + down, 0, 1, 0, 1 ); + } + } + + // draw an arrow for the direction + dir.x = n->origin.x - node->origin.x; + dir.y = n->origin.y - node->origin.y; + dir.normalize(); + + p1 = node->origin; + p1.z += maxheight * 0.5; + p2 = dir * 8; + p3 = p1 + p2 * 2; + + G_DebugLine( p1, p3, 0, 1, 0, 1 ); + + p2.z += 8; + G_DebugLine( p3, p3 - p2, 0, 1, 0, 1 ); + + p2.z -= 16; + G_DebugLine( p3, p3 - p2, 0, 1, 0, 1 ); + } + + if ( !draw ) + { + // Put a little X where the node is to show that it had no connections + p1 = node->origin; + p1.z += 2; + + p2 = Vector( 12, 12, 0 ); + G_DebugLine( p1 - p2, p1 + p2, 1, 0, 0, 1 ); + + p2.x = -12; + G_DebugLine( p1 - p2, p1 + p2, 1, 0, 0, 1 ); + } + + node->drawtime = level.time; + } + } + +MapCell::MapCell() + { + Init(); + } + +MapCell::~MapCell() + { + Init(); + } + +void MapCell::Init + ( + void + ) + + { + numnodes = 0; + memset( nodes, 0, sizeof( nodes ) ); + } + +qboolean MapCell::AddNode + ( + PathNode *node + ) + + { + if ( numnodes >= PATHMAP_NODES ) + { + return false; + } + + nodes[ numnodes ] = ( short )node->nodenum; + numnodes++; + + return true; + } + +qboolean MapCell::RemoveNode + ( + PathNode *node + ) + + { + int i; + int num; + + num = node->nodenum; + for( i = 0; i < numnodes; i++ ) + { + if ( num == ( int )nodes[ i ] ) + { + break; + } + } + + if ( i >= numnodes ) + { + return false; + } + + numnodes--; + + // Since we're not worried about the order of the nodes, just + // move the last node into the slot occupied by the removed node. + nodes[ i ] = nodes[ numnodes ]; + nodes[ numnodes ] = 0; + + return true; + } + +PathNode *MapCell::GetNode + ( + int index + ) + + { + assert( index >= 0 ); + assert( index < numnodes ); + if ( index >= numnodes ) + { + return NULL; + } + + return AI_GetNode( nodes[ index ] ); + } + +int MapCell::NumNodes + ( + void + ) + + { + return numnodes; + } + +/* All + work and no play + makes Jim a dull boy. All + work and no play makes Jim a + dull boy. All work and no play + makes Jim a dull boy. All work and no + play makes Jim a dull boy. All work and + no play makes Jim a dull boy. All work and + no play makes Jim a dull boy. All work and no + play makes Jim a dull boy. All work and no play + makes Jim a dull boy. All work and no play makes + Jim a dull boy. All work and no play makes Jim a + dull boy. All work and no play makes Jim a dull boy. + All work and no play makes Jim a dull boy. All work + and no play makes Jim a dull boy. All work and no play + makes Jim a dull boy. All work and no play makes Jim a + dull boy. All work and no play makes Jim a dull boy. All + work and no play makes Jim a dull boy. All work and no + play makes Jim a dull boy. All work and no play makes Jim + a dull boy. All work and no play makes Jim a dull boy. + All work and no play makes Jim a dull boy. All work and + no play makes Jim a dull boy. All work and no play makes + Jim a dull boy. All work and no play makes Jim a dull + boy. All work and no play makes Jim a dull boy. All work + and no play makes Jim a dull boy. All work and no play + makes Jim a dull boy. All work and no play makes Jim a + dull boy. All work and no play makes Jim a dull boy. All + work and no play makes Jim a dull boy. All work and no + play makes Jim a dull boy. All work and no play makes + Jim a dull boy. All work and no play makes Jim a dull + boy. All work and no play makes Jim a dull boy. All + work and no play makes Jim a dull boy. All work and + no play makes Jim a dull boy. All work and no + play makes Jim a dull boy. All work and no play + makes Jim a dull boy. All work and no play + makes Jim a dull boy. All work and no play + makes Jim a dull boy. All work and no + play makes Jim a dull boy. All work + and no play makes Jim a dull boy. + All work and no play makes + Jim a dull boy. All work + and no play makes + Jim a +*/ + +CLASS_DECLARATION( Class, PathSearch, NULL ) + { + { &EV_AI_SavePaths, SavePathsEvent }, + { &EV_AI_LoadNodes, LoadNodes }, + { &EV_AI_SaveNodes, SaveNodes }, + { &EV_AI_ClearNodes, ClearNodes }, + { &EV_AI_SetNodeFlags, SetNodeFlagsEvent }, + { &EV_AI_RecalcPaths, RecalcPathsEvent }, + { &EV_AI_CalcPath, CalcPathEvent }, + { &EV_AI_DisconnectPath, DisconnectPathEvent }, + + { NULL, NULL } + }; + + +PathSearch::PathSearch() + { + AI_ResetNodes(); + } + +PathSearch::~PathSearch() + { + AI_ResetNodes(); + } + +void PathSearch::AddToGrid + ( + PathNode *node, + int x, + int y + ) + + { + PathNode *node2; + MapCell *cell; + int numnodes; + int i; + int j; + byte maxheight[ NUM_WIDTH_VALUES ]; + + cell = GetNodesInCell( x, y ); + if ( !cell ) + { + return; + } + + if ( !cell->AddNode( node ) ) + { + warning( "AddToGrid", "Node overflow at ( %d, %d )\n", x, y ); + return; + } + + if ( !loadingarchive ) + { + // + // explicitly link up the targets and their destinations + // + if ( node->nodeflags & AI_JUMP ) + { + if ( node->target.length() > 1 ) + { + node2 = AI_FindNode( node->target.c_str() ); + if ( node2 && !node->ConnectedTo( node2 ) ) + { + for( j = 0; j < NUM_WIDTH_VALUES; j++ ) + { + maxheight[ j ] = MAX_HEIGHT; + } + + if ( node != node2 ) + node->ConnectTo( node2, maxheight ); + else + gi.DPrintf( "Can't connect pathnode to itself (%s)", node->target.c_str() ); + } + } + } + + // Connect the node to its neighbors + numnodes = cell->NumNodes(); + for( i = 0; i < numnodes; i++ ) + { + node2 = ( PathNode * )cell->GetNode( i ); + if ( node2 == node ) + { + continue; + } + + if ( ( node->numChildren < NUM_PATHSPERNODE ) && !node->ConnectedTo( node2 ) ) + { + if ( node->ClearPathTo( node2, maxheight ) || node->LadderTo( node2, maxheight ) ) + { + node->ConnectTo( node2, maxheight ); + } + } + + if ( ( node2->numChildren < NUM_PATHSPERNODE ) && !node2->ConnectedTo( node ) ) + { + if ( node2->ClearPathTo( node, maxheight ) || node2->LadderTo( node, maxheight ) ) + { + node2->ConnectTo( node, maxheight ); + } + } + } + } + } + +qboolean PathSearch::RemoveFromGrid + ( + PathNode *node, + int x, + int y + ) + + { + MapCell *cell; + PathNode *node2; + int numnodes; + int i; + + cell = GetNodesInCell( x, y ); + if ( !cell || !cell->RemoveNode( node ) ) + { + return false; + } + + // Disconnect the node from all nodes in the cell + numnodes = cell->NumNodes(); + for( i = 0; i < numnodes; i++ ) + { + node2 = ( PathNode * )cell->GetNode( i ); + if ( node2->ConnectedTo( node ) ) + { + node2->Disconnect( node ); + } + } + + return true; + } + +int PathSearch::NodeCoordinate + ( + float coord + ) + + { + return ( ( int )coord + MAX_MAP_BOUNDS - ( PATHMAP_CELLSIZE / 2 ) ) / PATHMAP_CELLSIZE; + } + +int PathSearch::GridCoordinate + ( + float coord + ) + + { + return ( ( int )coord + MAX_MAP_BOUNDS ) / PATHMAP_CELLSIZE; + } + +void PathSearch::AddNode + ( + PathNode *node + ) + + { + int x; + int y; + + assert( node ); + + if ( !loadingarchive ) + { + gi.DPrintf( "." ); + } + + numNodes++; + + if ( NodeList == NULL ) + { + NodeList = node; + node->chain = NULL; + } + else + { + node->chain = NodeList; + NodeList = node; + } + + x = NodeCoordinate( node->origin[ 0 ] ); + y = NodeCoordinate( node->origin[ 1 ] ); + + AddToGrid( node, x, y ); + AddToGrid( node, x + 1, y ); + AddToGrid( node, x, y + 1 ); + AddToGrid( node, x + 1, y + 1 ); + + node->gridX = x; + node->gridY = y; + } + +void PathSearch::RemoveNode + ( + PathNode *node + ) + + { + int x; + int y; + PathNode *n; + PathNode *p; + + assert( node ); + + x = node->gridX; + y = node->gridY; + + RemoveFromGrid( node, x, y ); + RemoveFromGrid( node, x + 1, y ); + RemoveFromGrid( node, x, y + 1 ); + RemoveFromGrid( node, x + 1, y + 1 ); + + p = NULL; + for( n = NodeList; n != node; p = n, n = n->chain ) + { + if ( !n ) + { + // Not in list. + return; + } + } + + if ( p ) + { + p->chain = n->chain; + } + else + { + NodeList = n->chain; + } + + n->chain = NULL; + numNodes--; + } + +void PathSearch::UpdateNode + ( + PathNode *node + ) + + { + int x; + int y; + int mx; + int my; + + assert( node ); + + x = NodeCoordinate( node->origin[ 0 ] ); + y = NodeCoordinate( node->origin[ 1 ] ); + + mx = node->gridX; + my = node->gridY; + + RemoveFromGrid( node, mx, my ); + RemoveFromGrid( node, mx + 1, my ); + RemoveFromGrid( node, mx, my + 1 ); + RemoveFromGrid( node, mx + 1, my + 1 ); + + node->numChildren = 0; + + AddToGrid( node, x, y ); + AddToGrid( node, x + 1, y ); + AddToGrid( node, x, y + 1 ); + AddToGrid( node, x + 1, y + 1 ); + + node->gridX = x; + node->gridY = y; + } + +MapCell *PathSearch::GetNodesInCell + ( + int x, + int y + ) + + { + if ( ( x < 0 ) || ( x >= PATHMAP_GRIDSIZE ) || ( y < 0 ) || ( y >= PATHMAP_GRIDSIZE ) ) + { + return NULL; + } + + return &PathMap[ x ][ y ]; + } + +MapCell *PathSearch::GetNodesInCell + ( + Vector pos + ) + + { + int x; + int y; + + x = GridCoordinate( pos[ 0 ] ); + y = GridCoordinate( pos[ 1 ] ); + + return GetNodesInCell( x, y ); + } + +PathNode *PathSearch::NearestNode + ( + Vector pos, + Entity *ent, + qboolean usebbox + ) + + { + Vector delta; + PathNode *node; + PathNode *bestnode; + float bestdist; + float dist; + int n; + int i; + MapCell *cell; + Vector min; + Vector max; + + cell = GetNodesInCell( pos ); + if ( !cell ) + { + return NULL; + } + + if ( ent && usebbox ) + { + min = ent->mins; + max = ent->maxs; + } + else + { + min = Vector( -16, -16, 12 ); + max = Vector( 16, 16, 40 ); + } + + n = cell->NumNodes(); + + if ( ai_debugpath->integer ) + { + gi.DPrintf( "NearestNode: Checking %d nodes\n", n ); + } + + bestnode = NULL; + bestdist = 999999999; // greater than ( 8192 * sqr(2) ) ^ 2 -- maximum squared distance + for( i = 0; i < n; i++ ) + { + node = ( PathNode * )cell->GetNode( i ); + if ( !node ) + { + continue; + } + + delta = node->origin - pos; + + // get the distance squared (faster than getting real distance) + dist = delta * delta; + if ( ( dist < bestdist ) && node->CheckMove( ent, pos, min, max, false, false ) ) + { + bestnode = node; + bestdist = dist; + + // if we're close enough, early exit + if ( dist < 16 ) + { + break; + } + } + } + + return bestnode; + } + +void PathSearch::Teleport + ( + Entity *teleportee, + Vector from, + Vector to + ) + + { + PathNode *node1; + PathNode *node2; + byte maxheight[ NUM_WIDTH_VALUES ]; + int j; + + if ( ai_createnodes->integer ) + { + node1 = new PathNode; + node1->Setup( from ); + + node2 = new PathNode; + node2->Setup( to ); + + // FIXME + // shouldn't hard-code width and height + for( j = 0; j < NUM_WIDTH_VALUES; j++ ) + { + maxheight[ j ] = 72; + } + + // connect with 0 cost + node1->ConnectTo( node2, maxheight, 0 ); + } + } + +void PathSearch::ShowNodes + ( + void + ) + + { + if ( ai_showroutes->integer || ai_shownodenums->integer ) + { + DrawAllConnections(); + } + } + +int PathSearch::NumNodes + ( + void + ) + + { + return numNodes; + } + +int PathSearch::NumLoadNodes + ( + void + ) + + { + return numLoadNodes; + } + +void PathSearch::Checksum + ( + Vector &checksum + ) + + { + checksum = pathNodesChecksum; + } + +void PathSearch::Archive + ( + Archiver &arc + ) + + { + int i; + int num; + + if ( arc.Saving() ) + { + PathNode *node; + + num = 0; + for( i = 0; i < MAX_PATHNODES; i++ ) + { + node = AI_GetNode( i ); + if ( node ) + { + num++; + } + } + arc.ArchiveInteger( &num ); + for( i = 0; i < MAX_PATHNODES; i++ ) + { + node = AI_GetNode( i ); + if ( node ) + { + arc.ArchiveObject( node ); + } + } + + if ( ai_debuginfo->integer ) + { + gi.DPrintf( "Wrote %d path nodes\n", num ); + } + } + else + { + int x; + int y; + + numNodes = 0; + NodeList = NULL; + loadingarchive = true; + + // Get rid of the nodes that were spawned by the map + AI_ResetNodes(); + + // Init the grid + for( x = 0; x < PATHMAP_GRIDSIZE; x++ ) + { + for( y = 0; y < PATHMAP_GRIDSIZE; y++ ) + { + PathMap[ x ][ y ].Init(); + } + } + + arc.ArchiveInteger( &num ); + + assert( num <= MAX_PATHNODES ); + if ( num > MAX_PATHNODES ) + { + arc.FileError( "Exceeded max path nodes" ); + } + + for( i = 0; i < num; i++ ) + { + arc.ReadObject(); + } + + if ( ai_debuginfo && ai_debuginfo->integer ) + { + gi.DPrintf( "Path nodes loaded: %d\n", NumNodes() ); + } + + loadingarchive = false; + } + } + +void PathSearch::ClearNodes + ( + Event *ev + ) + + { + PathNode *node; + int i; + int num; + + num = 0; + for( i = 0; i < MAX_PATHNODES; i++ ) + { + node = AI_GetNode( i ); + if ( node ) + { + node->PostEvent( EV_Remove, 0 ); + num++; + } + } + + if ( ai_debuginfo->integer ) + { + gi.DPrintf( "Deleted %d path nodes\n", num ); + } + } + +void PathSearch::SetNodeFlagsEvent + ( + Event *ev + ) + + { + const char * token; + int i, argnum; + int mask; + int action; + int nodenum; + PathNode *node; + + nodenum = ev->GetInteger( 1 ); + node = AI_GetNode( nodenum ); + + if ( !node ) + { + ev->Error( "Node not found." ); + return; + } + + argnum = 2; + for ( i = argnum; i <= ev->NumArgs() ; i++ ) + { + token = ev->GetString( i ); + action = 0; + switch( token[0] ) + { + case '+': + action = FLAG_ADD; + token++; + break; + case '-': + action = FLAG_CLEAR; + token++; + break; + default: + ev->Error( "PathSearch::SetNodeFlagsEvent", "First character is not '+' or '-', assuming '+'\n" ); + action = FLAG_ADD; + break; + break; + } + + if (!strcmpi( token, "flee")) + { + mask = AI_FLEE; + } + else if (!strcmpi (token, "duck")) + { + mask = AI_DUCK; + } + else if (!strcmpi (token, "cover")) + { + mask = AI_COVER; + } + else if (!strcmpi (token, "door")) + { + mask = AI_DOOR; + } + else if (!strcmpi (token, "jump")) + { + mask = AI_JUMP; + } + else if (!strcmpi (token, "ladder")) + { + mask = AI_LADDER; + } + else if (!strcmpi (token, "action")) + { + mask = AI_ACTION; + } + else + { + mask = 0; + action = FLAG_IGNORE; + ev->Error( "Unknown token %s.", token ); + } + + switch (action) + { + case FLAG_ADD: + node->nodeflags |= mask; + break; + + case FLAG_CLEAR: + node->nodeflags &= ~mask; + break; + + case FLAG_IGNORE: + break; + } + } + } + +void PathSearch::CalcPathEvent + ( + Event *ev + ) + + { + int nodenum; + PathNode *node; + PathNode *node2; + int j; + byte maxheight[ NUM_WIDTH_VALUES ]; + + nodenum = ev->GetInteger( 1 ); + node = AI_GetNode( nodenum ); + + nodenum = ev->GetInteger( 2 ); + node2 = AI_GetNode( nodenum ); + + if ( !node || !node2 ) + { + ev->Error( "Node not found." ); + return; + } + + if ( ( node->numChildren < NUM_PATHSPERNODE ) && !node->ConnectedTo( node2 ) ) + { + if ( node->ClearPathTo( node2, maxheight, false ) || node->LadderTo( node2, maxheight ) ) + { + node->ConnectTo( node2, maxheight ); + } + else if ( ( node->nodeflags & AI_JUMP ) && ( node->target == node2->targetname ) ) + { + //FIXME + // don't hardcode size + for( j = 0; j < NUM_WIDTH_VALUES; j++ ) + { + maxheight[ j ] = MAX_HEIGHT; + } + node->ConnectTo( node2, maxheight ); + } + } + + if ( ( node2->numChildren < NUM_PATHSPERNODE ) && !node2->ConnectedTo( node ) ) + { + if ( node2->ClearPathTo( node, maxheight, false ) || node2->LadderTo( node, maxheight ) ) + { + node2->ConnectTo( node, maxheight ); + } + else if ( ( node2->nodeflags & AI_JUMP ) && ( node2->target == node->targetname ) ) + { + //FIXME + // don't hardcode size + for( j = 0; j < NUM_WIDTH_VALUES; j++ ) + { + maxheight[ j ] = MAX_HEIGHT; + } + node2->ConnectTo( node, maxheight ); + } + } + } + +void PathSearch::DisconnectPathEvent + ( + Event *ev + ) + + { + int nodenum; + PathNode *node; + PathNode *node2; + + nodenum = ev->GetInteger( 1 ); + node = AI_GetNode( nodenum ); + + nodenum = ev->GetInteger( 2 ); + node2 = AI_GetNode( nodenum ); + + if ( !node || !node2 ) + { + ev->Error( "Node not found." ); + return; + } + + if ( node->ConnectedTo( node2 ) ) + { + node->Disconnect( node2 ); + } + + if ( node2->ConnectedTo( node ) ) + { + node2->Disconnect( node ); + } + } + +void PathSearch::RecalcPathsEvent + ( + Event *ev + ) + + { + int nodenum; + PathNode *node; + + nodenum = ev->GetInteger( 1 ); + node = AI_GetNode( nodenum ); + if ( node ) + { + UpdateNode( node ); + } + else + { + ev->Error( "Node not found." ); + } + } + +qboolean PathSearch::ArchiveNodes + ( + str name, + qboolean save + ) + + { + Archiver arc; + qboolean success; + + if ( save ) + { + Vector checksum; + int tempInt; + + arc.Create( name ); + tempInt = PATHFILE_VERSION; + arc.ArchiveInteger( &tempInt ); + tempInt = NumNodes(); + arc.ArchiveInteger( &tempInt ); + Checksum( checksum ); + arc.ArchiveVector( &checksum ); + arc.ArchiveObject( this ); + success = qtrue; + } + else + { + int version; + + success = qfalse; + arc.Read( name, qfalse ); + arc.ArchiveInteger( &version ); + if ( version == PATHFILE_VERSION ) + { + int numnodes, file_numnodes; + Vector checksum, file_checksum; + + // get current values + numnodes = NumLoadNodes(); + Checksum( checksum ); + + // get file values + arc.ArchiveInteger( &file_numnodes ); + arc.ArchiveVector( &file_checksum ); + if ( + ( numnodes == file_numnodes ) && + ( checksum == file_checksum ) + ) + { + arc.ArchiveObject( this ); + if ( arc.NoErrors() ) + { + success = qtrue; + } + } + else + { + gi.Printf( "Pathnodes have changed, rebuilding.\n" ); + } + } + else + { + gi.Printf( "Expecting version %d path file. Path file is version %d.", PATHFILE_VERSION, version ); + } + + } + arc.Close(); + return success; + } + +void PathSearch::SaveNodes + ( + Event *ev + ) + + { + str name; + + if ( ev->NumArgs() != 1 ) + { + gi.Printf( "Usage: ai_save [filename]\n" ); + return; + } + + name = ev->GetString( 1 ); + + gi.Printf( "Archiving\n" ); + + ArchiveNodes( name, qtrue ); + + gi.Printf( "done.\n" ); + pathnodescalculated = false; + } + +void PathSearch::LoadNodes + ( + Event *ev + ) + + { + Archiver arc; + str name; + bool rebuild; + + if ( ev->NumArgs() != 1 ) + { + gi.Printf( "Usage: ai_load [filename]\n" ); + return; + } + + gi.Printf( "Loading nodes...\n" ); + + name = ev->GetString( 1 ); + + rebuild = !ArchiveNodes( name, qfalse ); + + if ( rebuild ) + { + // Only replace the file if this event was called from our init function (as opposed to the user + // calling us from the console) + if ( ( ev->GetSource() == EV_FROM_CODE ) ) + { + gi.Printf( "Replacing file.\n\n" ); + + // At this point, the nodes are still scheduled to find their neighbors, because we posted this event + // before we the nodes were spawned. Post the event with 0 delay so that it gets processed after all + // the nodes find their neighbors. + PostEvent( EV_AI_SavePaths, 0 ); + } + else + { + // otherwise, just let them know that the path file needs to be replaced. + gi.Printf( "Type 'ai_savepaths' at the console to replace the current path file.\n" ); + } + + // Print out something fairly obvious + gi.DPrintf( "***********************************\n" + "***********************************\n" + "\n" + "Creating paths...\n" + "\n" + "***********************************\n" + "***********************************\n" ); + } + } + +void PathSearch::SavePaths + ( + void + ) + + { + str filename; + Event *ev; + + if ( loadingarchive ) + { + // force it to zero since we probably had an error + gi.cvar_set( "ai_createnodes", "0" ); + } + + if ( + !loadingarchive && + ( + ( ai_createnodes && ai_createnodes->integer ) || + ( pathnodescalculated ) + ) + ) + { + filename = "maps/"; + filename += level.mapname; + filename += ".pth"; + + gi.DPrintf( "\nSaving path nodes to '%s'\n", filename.c_str() ); + + ev = new Event( EV_AI_SaveNodes ); + ev->AddString( filename ); + ProcessEvent( ev ); + } + } + +void PathSearch::SavePathsEvent + ( + Event *ev + ) + + { + str temp; + + temp = ai_createnodes->string; + gi.cvar_set( "ai_createnodes", "1" ); + + SavePaths(); + + gi.cvar_set( "ai_createnodes", temp.c_str() ); + } + +void PathSearch::Init + ( + const char *mapname + ) + + { + int x; + int y; + str filename; + Event *ev; + + pathNodesChecksum = vec_zero; + pathnodescalculated = false; + + gi.AddCommand( "ai_savepaths" ); + gi.AddCommand( "ai_save" ); + gi.AddCommand( "ai_load" ); + gi.AddCommand( "ai_clearnodes" ); + gi.AddCommand( "ai_recalcpaths" ); + ai_createnodes = gi.cvar ("ai_createnodes", "0", 0); + ai_debugpath = gi.cvar ("ai_debugpath", "0", 0); + ai_debuginfo = gi.cvar ("ai_debuginfo", "0", 0); + ai_showroutes = gi.cvar ("ai_showroutes", "0", 0); + ai_showroutes_distance = gi.cvar ("ai_showroutes_distance", "1000", 0); + ai_shownodenums = gi.cvar ("ai_shownodenums", "0", 0); + ai_timepaths = gi.cvar ("ai_timepaths", "0", 0); + + numLoadNodes = 0; + numNodes = 0; + NodeList = NULL; + loadingarchive = false; + + // Get rid of the nodes that were spawned by the map + AI_ResetNodes(); + + // Init the grid + for( x = 0; x < PATHMAP_GRIDSIZE; x++ ) + { + for( y = 0; y < PATHMAP_GRIDSIZE; y++ ) + { + PathMap[ x ][ y ].Init(); + } + } + + if ( LoadingSavegame ) + { + // no need to go further here + return; + } + + if ( mapname ) + { + filename = "maps/"; + filename += mapname; + filename += ".pth"; + if ( gi.FS_ReadFile( filename.c_str(), NULL, qtrue ) != -1 ) + { + ev = new Event( EV_AI_LoadNodes ); + ev->AddString( filename ); + + // This can't happen until the world is spawned + PostEvent( ev, 0 ); + } + else + { + // Print out something fairly obvious + gi.DPrintf( "***********************************\n" + "***********************************\n" + "\n" + "No paths found. Creating paths...\n" + "\n" + "***********************************\n" + "***********************************\n" ); + } + } + } + diff --git a/source/source/fgame/navigate.h b/source/source/fgame/navigate.h new file mode 100644 index 0000000..72f1d7b --- /dev/null +++ b/source/source/fgame/navigate.h @@ -0,0 +1,841 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/navigate.h $ +// $Revision:: 14 $ +// $Author:: Aldie $ +// $Date:: 7/25/00 11:32p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/navigate.h $ +// +// 14 7/25/00 11:32p Aldie +// Made some changes to the memory system and fixed a memory allocation bug in +// Z_TagMalloc. Also changed a lot of classes to subclass from Class. +// +// 13 6/14/00 2:17p Markd +// fixed compiler warnings for Intel Compiler +// +// 12 5/25/00 4:27p Markd +// rewrote archive functions +// +// 11 5/24/00 3:14p Markd +// first phase of save/load games +// +// 10 3/17/00 11:53a Steven +// Added jumping stuff. +// +// 9 3/06/00 8:12p Markd +// removed unused cvar +// +// 8 2/04/00 1:29p Markd +// Added checksum to ai path nodes. It auto saves on exit now and will +// automatically re-build nodes as needed +// +// 7 2/04/00 11:18a Markd +// Fixed memory leak with AI_PathNodes +// +// 6 1/25/00 6:33p Steven +// Fixed some path node stuff. +// +// 5 1/06/00 11:08p Jimdose +// cleaning up unused code +// +// 4 10/01/99 6:31p Markd +// added commands hidden inside fgame so that they would show up for command +// completion +// +// 3 10/01/99 4:52p Markd +// Made Warning level 4 work on all projects +// +// 2 9/28/99 5:15p Markd +// Fixed more merge bugs with sharing class, vector and listener between three +// modules +// +// 1 9/10/99 10:54a Jimdose +// +// 1 9/08/99 3:16p Aldie +// +// 9 7/07/99 11:26a Steven +// Added some stuff on the sector pathfinding approach. +// +// DESCRIPTION: +// Potentially could be an C++ implementation of the A* search algorithm, but +// is currently unfinished. +// + +#ifndef __NAVIGATE_H__ +#define __NAVIGATE_H__ + +#include "g_local.h" +#include "class.h" +#include "entity.h" +#include "stack.h" +#include "container.h" +#include "doors.h" +#include "../qcommon/qfiles.h" + + +extern Event EV_AI_SavePaths; +extern Event EV_AI_SaveNodes; +extern Event EV_AI_LoadNodes; +extern Event EV_AI_ClearNodes; +extern Event EV_AI_RecalcPaths; +extern Event EV_AI_CalcPath; +extern Event EV_AI_DisconnectPath; + +extern cvar_t *ai_createnodes; +extern cvar_t *ai_shownodes; +extern cvar_t *ai_debugpath; +extern cvar_t *ai_debuginfo; +extern cvar_t *ai_showroutes; +extern cvar_t *ai_timepaths; + +extern int ai_maxnode; + +#define MAX_PATHCHECKSPERFRAME 4 + +extern int path_checksthisframe; + +#define MAX_PATH_LENGTH 128 // should be more than plenty +#define NUM_PATHSPERNODE 16 + +class Path; +class PathNode; + +#define NUM_WIDTH_VALUES 16 +#define WIDTH_STEP 8 +#define MAX_WIDTH ( WIDTH_STEP * NUM_WIDTH_VALUES ) +#define MAX_HEIGHT 128 + +#define CHECK_PATH( path, width, height ) \ + ( ( ( ( width ) >= MAX_WIDTH ) || ( ( width ) < 0 ) ) ? false : \ + ( ( int )( path )->maxheight[ ( ( width ) / WIDTH_STEP ) - 1 ] < ( int )( height ) ) ) + +typedef struct + { + short node; + short moveCost; + byte maxheight[ NUM_WIDTH_VALUES ]; + int door; + } pathway_t; + +typedef enum { NOT_IN_LIST, IN_OPEN, IN_CLOSED } pathlist_t; + +#define AI_FLEE 1 +#define AI_DUCK 2 +#define AI_COVER 4 +#define AI_DOOR 8 +#define AI_JUMP 16 +#define AI_LADDER 32 +#define AI_ACTION 64 + +void DrawAllConnections( void ); + +class PathNode : public Listener + { + public: + PathNode *chain; + pathway_t Child[ NUM_PATHSPERNODE ]; // these are the real connections between nodex + int numChildren; + + // These variables are all used during the search + int f; + int h; + int g; + + int gridX; + int gridY; + + float drawtime; + float occupiedTime; + int entnum; + + pathlist_t inlist; + + // reject is used to indicate that a node is unfit for ending on during a search + qboolean reject; + + PathNode *Parent; + + // For the open and closed lists + PathNode *NextNode; + + int nodeflags; + + friend class PathSearch; + friend void DrawAllConnections( void ); + + private : + qboolean TestMove( Entity *ent, Vector start, Vector end, Vector &min, Vector &max, qboolean allowdoors = false, qboolean fulltest = false ); + + qboolean ConnectedTo( PathNode *node ); + void ConnectTo( PathNode *node, byte maxheight[ NUM_WIDTH_VALUES ], float cost, Door *door = NULL ); + void ConnectTo( PathNode *node, byte maxheight[ NUM_WIDTH_VALUES ] ); + void Disconnect( PathNode *node ); + + void FindChildren( Event *ev ); + void FindEntities( Event *ev ); + void SetNodeFlags( Event *ev ); + void SetOriginEvent( Event *ev ); + void SetAngle( Event *ev ); + void SetAngles( Event *ev ); + void SetAnim( Event *ev ); + void SetTargetname( Event *ev ); + void SetTarget( Event *ev ); + + public: + CLASS_PROTOTYPE( PathNode ); + + int contents; + Vector origin; + Vector angles; + Vector mins; + Vector maxs; + str targetname; + str target; + + int nodenum; + + qboolean setangles; + str animname; + + PathNode(); + ~PathNode(); + + void Setup( Vector pos ); + void setAngles( Vector ang ); + void setOrigin( Vector org ); + void setSize( Vector min, Vector max ); + str &TargetName( void ); + virtual void Archive( Archiver &arc ); + + qboolean CheckPath( PathNode *node, Vector min, Vector max, qboolean fulltest = true ); + Door *CheckDoor( Vector pos ); + + qboolean CheckMove( Entity *ent, Vector pos, Vector &min, Vector &max, qboolean allowdoors = false, qboolean fulltest = false ); + qboolean CheckMove( Vector pos, Vector min, Vector max ); + qboolean ClearPathTo( PathNode *node, byte maxheight[ NUM_WIDTH_VALUES ], qboolean fulltest = true ); + qboolean LadderTo( PathNode *node, byte maxheight[ NUM_WIDTH_VALUES ] ); + void DrawConnections( void ); + }; + +typedef SafePtr PathNodePtr; + +#define PATHMAP_CELLSIZE 256 +#define PATHMAP_GRIDSIZE ( MAX_MAP_BOUNDS * 2 / PATHMAP_CELLSIZE ) + +#define PATHMAP_NODES 126 // 128 - sizeof( int ) / sizeof( short ) + +class MapCell : public Class + { + private : + int numnodes; + short nodes[ PATHMAP_NODES ]; + + public : + MapCell(); + ~MapCell(); + void Init( void ); + qboolean AddNode( PathNode *node ); + qboolean RemoveNode( PathNode *node ); + PathNode *GetNode( int index ); + int NumNodes( void ); + }; + +class PathSearch : public Listener + { + private: + MapCell PathMap[ PATHMAP_GRIDSIZE ][ PATHMAP_GRIDSIZE ]; + + void AddToGrid( PathNode *node, int x, int y ); + qboolean RemoveFromGrid( PathNode *node, int x, int y ); + int NodeCoordinate( float coord ); + int GridCoordinate( float coord ); + void ClearNodes( Event *ev ); + void LoadNodes( Event *ev ); + void SaveNodes( Event *ev ); + qboolean ArchiveNodes( str name, qboolean save ); + void SavePathsEvent( Event *ev ); + void SetNodeFlagsEvent( Event *ev ); + void RecalcPathsEvent( Event *ev ); + void CalcPathEvent( Event *ev ); + void DisconnectPathEvent( Event *ev ); + + public: + CLASS_PROTOTYPE( PathSearch ); + + PathSearch(); + ~PathSearch(); + void Archive( Archiver &arc ); + void AddNode( PathNode *node ); + void RemoveNode( PathNode *node ); + void UpdateNode( PathNode *node ); + MapCell *GetNodesInCell( int x, int y ); + MapCell *GetNodesInCell( Vector pos ); + PathNode *NearestNode( Vector pos, Entity *ent = NULL, qboolean usebbox = true ); + void Teleport( Entity *teleportee, Vector from, Vector to ); + void ShowNodes( void ); + int NumNodes( void ); + int NumLoadNodes( void ); + void Checksum( Vector &checksum ); + void SavePaths( void ); + void Init( const char *mapname ); + }; + +extern PathSearch PathManager; + +#define MAX_PATHNODES 2048 + +PathNode *AI_FindNode( const char *name ); +PathNode *AI_GetNode( int num ); +void AI_AddNode( PathNode *node ); +void AI_RemoveNode( PathNode *node ); +void AI_ResetNodes( void ); + +#include "path.h" + +template +class PathFinder : public Class + { + private: + Stack stack; + PathNode *OPEN; + PathNode *CLOSED; + PathNode *endnode; + + void ClearPath( void ); + void ClearOPEN( void ); + void ClearCLOSED( void ); + PathNode *ReturnBestNode( void ); + void GenerateSuccessors( PathNode *BestNode ); + void Insert( PathNode *Successor ); + void PropagateDown( PathNode *Old ); + Path *CreatePath( PathNode *startnode ); + + public: + Heuristic heuristic; + + PathFinder(); + ~PathFinder(); + Path *FindPath( PathNode *from, PathNode *to ); + Path *FindPath( Vector start, Vector end ); + }; + +template +PathFinder::PathFinder() + { + OPEN = NULL; + CLOSED = NULL; + } + +template +PathFinder::~PathFinder() + { + ClearPath(); + } + +template +void PathFinder::ClearOPEN + ( + void + ) + + { + PathNode *node; + + while( OPEN ) + { + node = OPEN; + OPEN = node->NextNode; + + node->inlist = NOT_IN_LIST; + node->NextNode = NULL; + node->Parent = NULL; + + // reject is used to indicate that a node is unfit for ending on during a search + node->reject = false; + } + } + +template +void PathFinder::ClearCLOSED + ( + void + ) + + { + PathNode *node; + + while( CLOSED ) + { + node = CLOSED; + CLOSED = node->NextNode; + + node->inlist = NOT_IN_LIST; + node->NextNode = NULL; + node->Parent = NULL; + + // reject is used to indicate that a node is unfit for ending on during a search + node->reject = false; + } + } + +template +void PathFinder::ClearPath + ( + void + ) + + { + stack.Clear(); + ClearOPEN(); + ClearCLOSED(); + } + +template +Path *PathFinder::FindPath + ( + PathNode *from, + PathNode *to + ) + + { + Path *path; + PathNode *node; + int start = 0; + int end; + qboolean checktime; + + checktime = false; + if ( ai_timepaths->integer ) + { + start = gi.Milliseconds(); + checktime = true; + } + + OPEN = NULL; + CLOSED = NULL; + + endnode = to; + + // Should always be NULL at this point + assert( !from->NextNode ); + + // make Open List point to first node + OPEN = from; + from->g = 0; + from->h = heuristic.dist( from, endnode ); + from->NextNode = NULL; + + node = ReturnBestNode(); + while( node && !heuristic.done( node, endnode ) ) + { + GenerateSuccessors( node ); + node = ReturnBestNode(); + } + + if ( !node ) + { + path = NULL; + if ( ai_debugpath->integer ) + { + gi.DPrintf( "Search failed--no path found.\n" ); + } + } + else + { + path = CreatePath( node ); + } + + ClearPath(); + + if ( checktime ) + { + end = gi.Milliseconds(); + if ( ai_timepaths->integer <= ( end - start ) ) + { + gi.DebugPrintf( "%d: ent #%d : %d\n", level.framenum, heuristic.entnum, end - start ); + } + } + + return path; + } + +template +Path *PathFinder::FindPath + ( + Vector start, + Vector end + ) + + { + PathNode *from; + PathNode *to; + Entity *ent; + + ent = G_GetEntity( heuristic.entnum ); + from = PathManager.NearestNode( start, ent ); + to = PathManager.NearestNode( end, ent ); + + if ( !from ) + { + if ( ai_debugpath->integer ) + { + gi.DPrintf( "Search failed--couldn't find closest source.\n" ); + } + return NULL; + } + + if ( !from || !to ) + { + if ( ai_debugpath->integer ) + { + gi.DPrintf( "Search failed--couldn't find closest destination.\n" ); + } + return NULL; + } + + return FindPath( from, to ); + } + +template +Path *PathFinder::CreatePath + ( + PathNode *startnode + ) + + { + PathNode *node; + Path *p; + int i; + int n; + PathNode *reverse[ MAX_PATH_LENGTH ]; + + // unfortunately, the list goes goes from end to start, so we have to reverse it + for( node = startnode, n = 0; ( node != NULL ) && ( n < MAX_PATH_LENGTH ); node = node->Parent, n++ ) + { + assert( n < MAX_PATH_LENGTH ); + reverse[ n ] = node; + } + + p = new Path( n ); + for( i = n - 1; i >= 0; i-- ) + { + p->AddNode( reverse[ i ] ); + } + + if ( ai_debugpath->integer ) + { + gi.DPrintf( "%d nodes in path\n", n ); + gi.DPrintf( "%d nodes allocated\n", PathManager.NumNodes() ); + } + + return p; + } + +template +PathNode *PathFinder::ReturnBestNode + ( + void + ) + + { + PathNode *bestnode; + + if ( !OPEN ) + { + // No more nodes on OPEN + return NULL; + } + + // Pick node with lowest f, in this case it's the first node in list + // because we sort the OPEN list wrt lowest f. Call it BESTNODE. + + bestnode = OPEN; // point to first node on OPEN + OPEN = bestnode->NextNode; // Make OPEN point to nextnode or NULL. + + // Next take BESTNODE (or temp in this case) and put it on CLOSED + bestnode->NextNode = CLOSED; + CLOSED = bestnode; + + bestnode->inlist = IN_CLOSED; + + return( bestnode ); + } + +template +void PathFinder::GenerateSuccessors + ( + PathNode *BestNode + ) + + { + int i; + int g; // total path cost - as stored in the linked lists. + PathNode *node; + pathway_t *path; + + for( i = 0; i < BestNode->numChildren; i++ ) + { + path = &BestNode->Child[ i ]; + node = AI_GetNode( path->node ); + + // g(Successor)=g(BestNode)+cost of getting from BestNode to Successor + g = BestNode->g + heuristic.cost( BestNode, i ); + + switch( node->inlist ) + { + case NOT_IN_LIST : + // Only allow this if it's valid + if ( heuristic.validpath( BestNode, i ) ) + { + node->Parent = BestNode; + node->g = g; + node->h = heuristic.dist( node, endnode ); + node->f = g + node->h; + + // Insert Successor on OPEN list wrt f + Insert( node ); + } + break; + + case IN_OPEN : + // if our new g value is < node's then reset node's parent to point to BestNode + if ( g < node->g ) + { + node->Parent = BestNode; + node->g = g; + node->f = g + node->h; + } + break; + + case IN_CLOSED : + // if our new g value is < Old's then reset Old's parent to point to BestNode + if ( g < node->g ) + { + node->Parent = BestNode; + node->g = g; + node->f = g + node->h; + + // Since we changed the g value of Old, we need + // to propagate this new value downwards, i.e. + // do a Depth-First traversal of the tree! + PropagateDown( node ); + } + break; + + default : + // shouldn't happen, but try to catch it during debugging phase + assert( NULL ); + gi.Error( ERR_DROP, "Corrupted path node" ); + break; + } + } + } + +template +void PathFinder::Insert + ( + PathNode *node + ) + + { + PathNode *prev; + PathNode *next; + int f; + + node->inlist = IN_OPEN; + f = node->f; + + // special case for if the list is empty, or it should go at head of list (lowest f) + if ( ( OPEN == NULL ) || ( f < OPEN->f ) ) + { + node->NextNode = OPEN; + OPEN = node; + return; + } + + // do sorted insertion into OPEN list in order of ascending f + prev = OPEN; + next = OPEN->NextNode; + while( ( next != NULL ) && ( next->f < f ) ) + { + prev = next; + next = next->NextNode; + } + + // insert it between the two nodes + node->NextNode = next; + prev->NextNode = node; + } + +template +void PathFinder::PropagateDown + ( + PathNode *node + ) + + { + int c; + unsigned g; + unsigned movecost; + PathNode *child; + PathNode *parent; + pathway_t *path; + int n; + + g = node->g; + n = node->numChildren; + for( c = 0; c < n; c++ ) + { + path = &node->Child[ c ]; + child = AI_GetNode( path->node ); + + movecost = g + heuristic.cost( node, c ); + if ( movecost < child->g ) + { + child->g = movecost; + child->f = child->g + child->h; + child->Parent = node; + + // reset parent to new path. + // Now the Child's branch need to be + // checked out. Remember the new cost must be propagated down. + stack.Push( child ); + } + } + + while( !stack.Empty() ) + { + parent = stack.Pop(); + n = parent->numChildren; + for( c = 0; c < n; c++ ) + { + path = &parent->Child[ c ]; + child = AI_GetNode( path->node ); + + // we stop the propagation when the g value of the child is equal or better than + // the cost we're propagating + movecost = parent->g + path->moveCost; + if ( movecost < child->g ) + { + child->g = movecost; + child->f = child->g + child->h; + child->Parent = parent; + stack.Push( child ); + } + } + } + } + +class StandardMovement : public Class + { + public: + int minwidth; + int minheight; + int entnum; + qboolean can_jump; + + inline void setSize + ( + Vector size + ) + + { + minwidth = max( size.x, size.y ); + minheight = size.z; + } + + inline int dist + ( + PathNode *node, + PathNode *end + ) + + { + Vector delta; + int d1; + int d2; + int d3; + int h; + + delta = node->origin - end->origin; + d1 = abs( ( int )delta[ 0 ] ); + d2 = abs( ( int )delta[ 1 ] ); + d3 = abs( ( int )delta[ 2 ] ); + h = max( d1, d2 ); + h = max( d3, h ); + + return h; + } + + inline qboolean validpath + ( + PathNode *node, + int i + ) + + { + pathway_t *path; + PathNode *n; + + path = &node->Child[ i ]; + + if ( CHECK_PATH( path, minwidth, minheight ) ) + { + return false; + } + + if ( path->door ) + { + Door *door; + + door = ( Door * )G_GetEntity( path->door ); + if ( !door->CanBeOpenedBy( G_GetEntity( entnum ) ) ) + { + return false; + } + } + + n = AI_GetNode( path->node ); + + if ( node->nodeflags & AI_JUMP && n->nodeflags & AI_JUMP && !can_jump ) + return false; + + if ( n && ( n->occupiedTime > level.time ) && ( n->entnum != entnum ) ) + { + return false; + } + + return true; + } + + inline int cost + ( + PathNode *node, + int i + ) + + { + return node->Child[ i ].moveCost; + } + + inline qboolean done + ( + PathNode *node, + PathNode *end + ) + + { + return node == end; + } + }; + +typedef PathFinder StandardMovePath; + +#endif /* navigate.h */ diff --git a/source/source/fgame/object.cpp b/source/source/fgame/object.cpp new file mode 100644 index 0000000..841f3e3 --- /dev/null +++ b/source/source/fgame/object.cpp @@ -0,0 +1,493 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/object.cpp $ +// $Revision:: 15 $ +// $Author:: Markd $ +// $Date:: 7/03/00 7:56p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/object.cpp $ +// +// 15 7/03/00 7:56p Markd +// fixed setup and anim events +// +// 14 6/23/00 8:41p Markd +// made a lot of changes to different constructors for saved game support +// +// 13 6/14/00 3:50p Markd +// Cleaned up more Intel Compiler warnings +// +// 12 5/10/00 10:32a Steven +// Added com_blood stuff. +// +// 11 1/27/00 11:35a Markd +// Fixed solid/notsolid client side entities +// +// 10 1/15/00 3:57p Markd +// Eliminated multiple "angle" events and replaced them with EV_SetAngle +// +// 9 1/14/00 5:07p Markd +// Removed surface num, tri_num and damage_multiplier from multiple functions +// and events +// +// 8 1/12/00 6:12p Jimdose +// rewrote CreateExplosion +// +// 7 1/05/00 7:25p Jimdose +// made angle functions all use the same coordinate system +// AngleVectors now returns left instead of right +// no longer need to invert pitch +// +// 6 10/21/99 5:24p Aldie +// Changed Object::Setup to use Anim_Random +// +// 5 9/29/99 5:18p Steven +// Event formatting. +// +// 4 9/22/99 4:48p Markd +// fixed more G_GetEntity, G_FindClass and G_GetNextEntity bugs +// +// 3 9/21/99 7:51p Markd +// Fixed a lot of entitynum_none issues +// +// 2 9/13/99 4:22p Jimdose +// merge +// +// 1 9/10/99 10:54a Jimdose +// +// 1 9/08/99 3:16p Aldie +// +// 15 8/26/99 5:57p Markd +// Re-added fx_sprite support +// +// 14 6/11/99 1:23p Phook +// +// 13 6/11/99 12:58p Phook +// Changed from SINED comments to QUAKED +// +// 12 6/11/99 12:46p Phook +// EClass color changes +// +// DESCRIPTION: +// + + +#include "g_local.h" +#include "object.h" +#include "sentient.h" +#include "misc.h" +#include "explosion.h" +#include "gibs.h" +#include "specialfx.h" + +Event EV_Object_Setup + ( + "_setup", + EV_DEFAULT, + NULL, + NULL, + "Sets up an object." + ); +Event EV_Object_SetAnim + ( + "anim", + EV_DEFAULT, + "s", + "animname", + "Sets up the object with the specified animname." + ); + +Event EV_Object_Shootable + ( + "shootable", + EV_DEFAULT, + NULL, + NULL, + "Make the object shootable but not necessarily solid to the player." + ); + +CLASS_DECLARATION( Animate, Object, "object" ) + { + { &EV_Killed, Killed }, + { &EV_Object_Setup, Setup }, + { &EV_Object_SetAnim, SetAnim }, + { &EV_Object_Shootable, MakeShootable }, + { NULL, NULL } + }; + +Object::Object() + { + if ( LoadingSavegame ) + { + // Archive function will setup all necessary data + return; + } + // + // all objects default to not solid + // + setSolidType( SOLID_NOT ); + + health = 0; + + takedamage = ( spawnflags & 2 ) ? DAMAGE_NO : DAMAGE_YES; + + // + // we want the bounds of this model auto-rotated + // + flags |= FL_ROTATEDBOUNDS; + + if ( !com_blood->integer ) + { + flags &= ~FL_BLOOD; + flags &= ~FL_DIE_GIBS; + } + + PostEvent( EV_Object_Setup, EV_POSTSPAWN ); + } + +void Object::SetAnim + ( + Event *ev + ) + + { + int animnum; + + if ( ( ev->NumArgs() >= 1 ) && gi.IsModel( edict->s.modelindex ) ) + { + animnum = gi.Anim_Random( edict->s.modelindex, ev->GetString( 1 ) ); + if ( animnum >= 0 ) + { + NewAnim( animnum ); + } + } + } + + +void Object::Setup + ( + Event *ev + ) + + { + if ( !health ) + { + health = ( maxs - mins ).length(); + max_health = health; + } + } + +void Object::MakeShootable + ( + Event *ev + ) + + { + setContents( CONTENTS_SHOOTABLE_ONLY ); + link(); + } + +void Object::Killed(Event *ev) + { + Entity * ent; + Entity * attacker; + Vector dir; + Event * event; + const char * name; + + takedamage = DAMAGE_NO; + setSolidType( SOLID_NOT ); + hideModel(); + + attacker = ev->GetEntity( 1 ); + + if (flags & FL_DIE_EXPLODE) + { + CreateExplosion( origin, 50, this, this, this ); + } + + if (flags & FL_DIE_GIBS) + { + setSolidType( SOLID_NOT ); + hideModel(); + + CreateGibs( this, -150, edict->s.scale, 3 ); + } + +// +// kill the killtargets +// + name = KillTarget(); + if ( name && strcmp( name, "" ) ) + { + ent = NULL; + do + { + ent = G_FindTarget( ent, name ); + if ( !ent ) + { + break; + } + ent->PostEvent( EV_Remove, 0 ); + } + while ( 1 ); + } + +// +// fire targets +// + name = Target(); + if ( name && strcmp( name, "" ) ) + { + ent = NULL; + do + { + ent = G_FindTarget( ent, name ); + if ( !ent ) + { + break; + } + event = new Event( EV_Activate ); + event->AddEntity( attacker ); + ent->ProcessEvent( event ); + } + while ( 1 ); + } + + PostEvent( EV_Remove, 0 ); + } + +/*****************************************************************************/ +/*QUAKED func_throwobject (0 0.25 0.5) (-16 -16 0) (16 16 32) + +This is an object you can pickup and throw at people +******************************************************************************/ + +Event EV_ThrowObject_Pickup + ( + "pickup", + EV_DEFAULT, + "es", + "entity tag_name", + "Picks up this throw object and attaches it to the entity." + ); +Event EV_ThrowObject_Throw + ( + "throw", + EV_DEFAULT, + "efeF", + "owner speed targetent grav", + "Throw this throw object." + ); +Event EV_ThrowObject_PickupOffset + ( + "pickupoffset", + EV_DEFAULT, + "v", + "pickup_offset", + "Sets the pickup_offset." + ); +Event EV_ThrowObject_ThrowSound + ( + "throwsound", + EV_DEFAULT, + "s", + "throw_sound", + "Sets the sound to play when object is thrown." + ); + +CLASS_DECLARATION( Object, ThrowObject, "func_throwobject" ) + { + { &EV_Touch, Touch }, + { &EV_ThrowObject_Pickup, Pickup }, + { &EV_ThrowObject_Throw, Throw }, + { &EV_ThrowObject_PickupOffset, PickupOffset }, + { &EV_ThrowObject_ThrowSound, ThrowSound }, + { NULL, NULL } + }; + +ThrowObject::ThrowObject() + { + if ( LoadingSavegame ) + { + // Archive function will setup all necessary data + return; + } + pickup_offset = vec_zero; + } + +void ThrowObject::PickupOffset + ( + Event *ev + ) + { + pickup_offset = edict->s.scale * ev->GetVector( 1 ); + } + +void ThrowObject::ThrowSound + ( + Event *ev + ) + { + throw_sound = ev->GetString( 1 ); + } + +void ThrowObject::Touch + ( + Event *ev + ) + + { + Entity *other; + + if ( movetype != MOVETYPE_BOUNCE ) + { + return; + } + + other = ev->GetEntity( 1 ); + assert( other ); + + if ( other->isSubclassOf( Teleporter ) ) + { + return; + } + + if ( other->entnum == owner ) + { + return; + } + + if ( throw_sound.length() ) + { + StopLoopSound(); + } + + if ( other->takedamage ) + { + other->Damage( this, G_GetEntity( owner ), size.length() * velocity.length() / 400, origin, velocity, + level.impact_trace.plane.normal, 32, 0, MOD_THROWNOBJECT ); + } + + Damage( this, this, max_health, origin, velocity, level.impact_trace.plane.normal, 32, 0, MOD_THROWNOBJECT ); + } + +void ThrowObject::Throw + ( + Event *ev + ) + + { + Entity *owner; + Sentient *targetent; + float speed; + float traveltime; + float vertical_speed; + Vector target; + Vector dir; + float grav; + Vector xydir; + Event *e; + + owner = ev->GetEntity( 1 ); + assert( owner ); + + if ( !owner ) + { + return; + } + + speed = ev->GetFloat( 2 ); + if ( !speed ) + { + speed = 1; + } + + targetent = ( Sentient * )ev->GetEntity( 3 ); + assert( targetent ); + if (!targetent) + { + return; + } + + if ( ev->NumArgs() == 4 ) + { + grav = ev->GetFloat( 4 ); + } + else + { + grav = 1; + } + + e = new Event( EV_Detach ); + ProcessEvent( e ); + + this->owner = owner->entnum; + edict->ownerNum = owner->entnum; + + gravity = grav; + + target = targetent->origin; + target.z += targetent->viewheight; + + setMoveType( MOVETYPE_BOUNCE ); + setSolidType( SOLID_BBOX ); + edict->clipmask = MASK_PROJECTILE; + + dir = target - origin; + xydir = dir; + xydir.z = 0; + traveltime = xydir.length() / speed; + vertical_speed = ( dir.z / traveltime ) + ( 0.5f * gravity * sv_gravity->value * traveltime ); + xydir.normalize(); + + // setup ambient flying sound + if ( throw_sound.length() ) + { + LoopSound( throw_sound.c_str() ); + } + + velocity = speed * xydir; + velocity.z = vertical_speed; + + angles = velocity.toAngles(); + setAngles( angles ); + + avelocity.x = crandom() * 200; + avelocity.y = crandom() * 200; + takedamage = DAMAGE_YES; + } + +void ThrowObject::Pickup + ( + Event *ev + ) + + { + Entity * ent; + Event * e; + str bone; + + ent = ev->GetEntity( 1 ); + + assert( ent ); + if ( !ent ) + { + return; + } + bone = ev->GetString( 2 ); + + setOrigin( pickup_offset ); + + e = new Event( EV_Attach ); + e->AddEntity( ent ); + e->AddString( bone ); + ProcessEvent( e ); + + edict->s.renderfx &= ~RF_FRAMELERP; + } diff --git a/source/source/fgame/object.h b/source/source/fgame/object.h new file mode 100644 index 0000000..462789e --- /dev/null +++ b/source/source/fgame/object.h @@ -0,0 +1,91 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/object.h $ +// $Revision:: 5 $ +// $Author:: Markd $ +// $Date:: 6/14/00 3:50p $ +// +// Copyright (C) 1997 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/object.h $ +// +// 5 6/14/00 3:50p Markd +// Cleaned up more Intel Compiler warnings +// +// 4 5/27/00 2:56p Markd +// Save games 2nd pass +// +// 3 5/24/00 3:14p Markd +// first phase of save/load games +// +// 2 1/27/00 11:35a Markd +// Fixed solid/notsolid client side entities +// +// 1 9/10/99 10:54a Jimdose +// +// 1 9/08/99 3:16p Aldie +// +// 5 8/26/99 5:57p Markd +// Re-added fx_sprite support +// +// DESCRIPTION: +// Object class +// + +#ifndef __OBJECT_H__ +#define __OBJECT_H__ + +#include "g_local.h" +#include "animate.h" +#include "specialfx.h" + +class Object : public Animate + { + public: + CLASS_PROTOTYPE( Object ); + + Object(); + void Killed( Event *ev ); + void SetAngle( Event *ev ); + void Setup( Event *ev ); + void SetAnim( Event *ev ); + void MakeShootable( Event *ev ); + }; + +extern Event EV_ThrowObject_Pickup; +extern Event EV_ThrowObject_Throw; + +class ThrowObject : public Object + { + private: + int owner; + Vector pickup_offset; + str throw_sound; + public: + CLASS_PROTOTYPE( ThrowObject ); + ThrowObject(); + void Touch(Event *ev); + void Throw( Event * ev ); + void Pickup( Event * ev ); + void PickupOffset( Event * ev ); + void ThrowSound( Event * ev ); + virtual void Archive( Archiver &arc ); + }; + +inline void ThrowObject::Archive + ( + Archiver &arc + ) + { + Object::Archive( arc ); + + arc.ArchiveInteger( &owner ); + arc.ArchiveVector( &pickup_offset ); + arc.ArchiveString( &throw_sound ); + } + +#endif /* object.h */ diff --git a/source/source/fgame/path.cpp b/source/source/fgame/path.cpp new file mode 100644 index 0000000..70bd5c3 --- /dev/null +++ b/source/source/fgame/path.cpp @@ -0,0 +1,469 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/path.cpp $ +// $Revision:: 2 $ +// $Author:: Markd $ +// $Date:: 6/14/00 3:50p $ +// +// Copyright (C) 1997 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/path.cpp $ +// +// 2 6/14/00 3:50p Markd +// Cleaned up more Intel Compiler warnings +// +// 1 9/10/99 10:54a Jimdose +// +// 1 9/08/99 3:16p Aldie +// +// DESCRIPTION: +// + +#include "g_local.h" +#include "entity.h" +#include "path.h" +#include "container.h" +#include "navigate.h" +#include "misc.h" + +CLASS_DECLARATION( Class, Path, NULL ) + { + { NULL, NULL } + }; + +Path::Path() + { + pathlength = 0; + from = NULL; + to = NULL; + nextnode = 1; + } + +Path::Path + ( + int numnodes + ) + + { + pathlength = 0; + from = NULL; + to = NULL; + nextnode = 1; + pathlist.Resize( numnodes ); + dirToNextNode.Resize( numnodes ); + distanceToNextNode.Resize( numnodes ); + } + +void Path::Clear + ( + void + ) + + { + nextnode = 1; + pathlength = 0; + from = NULL; + to = NULL; + pathlist.FreeObjectList(); + dirToNextNode.FreeObjectList(); + distanceToNextNode.FreeObjectList(); + } + +void Path::Reset + ( + void + ) + + { + nextnode = 1; + } + +PathNode *Path::Start + ( + void + ) + + { + return from; + } + +PathNode *Path::End + ( + void + ) + + { + return to; + } + +void Path::AddNode + ( + PathNode *node + ) + + { + Vector dir; + float len; + int num; + + if ( !from ) + { + from = node; + } + + to = node; + pathlist.AddObject( PathNodePtr( node ) ); + + len = 0; + distanceToNextNode.AddObject( len ); + dirToNextNode.AddObject( vec_zero ); + + num = NumNodes(); + if ( num > 1 ) + { + dir = node->origin - GetNode( num - 1 )->origin; + len = dir.length(); + dir *= 1 / len; + + distanceToNextNode.SetObjectAt( num - 1, len ); + dirToNextNode.SetObjectAt( num - 1, dir ); + + pathlength += len; + } + } + +PathNode *Path::GetNode + ( + int num + ) + + { + PathNode *node; + + node = pathlist.ObjectAt( num ); + assert( node != NULL ); + if ( node == NULL ) + { + error( "GetNode", "Null pointer in node list\n" ); + } + + return node; + } + +PathNode *Path::NextNode + ( + void + ) + + { + if ( nextnode <= NumNodes() ) + { + return pathlist.ObjectAt( nextnode++ ); + } + return NULL; + } + +PathNode *Path::NextNode + ( + PathNode *node + ) + + { + int i; + int num; + PathNode *n; + + num = NumNodes(); + + // NOTE: We specifically DON'T check the last object (hence the i < num instead + // of the usual i <= num, so don't go doing something stupid like trying to fix + // this without keeping this in mind!! :) + for( i = 1; i < num; i++ ) + { + n = pathlist.ObjectAt( i ); + if ( n == node ) + { + // Since we only check up to num - 1, it's ok to do this. + // We do this since the last node in the list has no next node (duh!). + return pathlist.ObjectAt( i + 1 ); + } + } + + return NULL; + } + +Vector Path::ClosestPointOnPath + ( + Vector pos + ) + + { + PathNode *s; + PathNode *e; + int num; + int i; + float bestdist; + Vector bestpoint; + float dist; + float segmentlength; + Vector delta; + Vector p1; + Vector p2; + Vector p3; + float t; + + num = NumNodes(); + s = GetNode( 1 ); + + bestpoint = s->origin; + delta = bestpoint - pos; + bestdist = delta * delta; + + for( i = 2; i <= num; i++ ) + { + e = GetNode( i ); + + // check if we're closest to the endpoint + delta = e->origin - pos; + dist = delta * delta; + + if ( dist < bestdist ) + { + bestdist = dist; + bestpoint = e->origin; + } + + // check if we're closest to the segment + segmentlength = distanceToNextNode.ObjectAt( i - 1 ); + p1 = dirToNextNode.ObjectAt( i - 1 ); + p2 = pos - s->origin; + + t = p1 * p2; + if ( ( t > 0 ) && ( t < segmentlength ) ) + { + p3 = ( p1 * t ) + s->origin; + + delta = p3 - pos; + dist = delta * delta; + if ( dist < bestdist ) + { + bestdist = dist; + bestpoint = p3; + } + } + + s = e; + } + + return bestpoint; + } + +float Path::DistanceAlongPath + ( + Vector pos + ) + + { + PathNode *s; + PathNode *e; + int num; + int i; + float bestdist; + float dist; + float segmentlength; + Vector delta; + Vector p1; + Vector p2; + Vector p3; + float t; + float pathdist; + float bestdistalongpath; + + pathdist = 0; + + num = NumNodes(); + s = GetNode( 1 ); + delta = s->origin - pos; + bestdist = delta * delta; + bestdistalongpath = 0; + + for( i = 2; i <= num; i++ ) + { + e = GetNode( i ); + + segmentlength = distanceToNextNode.ObjectAt( i - 1 ); + + // check if we're closest to the endpoint + delta = e->origin - pos; + dist = delta * delta; + + if ( dist < bestdist ) + { + bestdist = dist; + bestdistalongpath = pathdist + segmentlength; + } + + // check if we're closest to the segment + p1 = dirToNextNode.ObjectAt( i - 1 ); + p2 = pos - s->origin; + + t = p1 * p2; + if ( ( t > 0 ) && ( t < segmentlength ) ) + { + p3 = ( p1 * t ) + s->origin; + + delta = p3 - pos; + dist = delta * delta; + if ( dist < bestdist ) + { + bestdist = dist; + bestdistalongpath = pathdist + t; + } + } + + s = e; + + pathdist += segmentlength; + } + + return bestdistalongpath; + } + +Vector Path::PointAtDistance + ( + float dist + ) + + { + PathNode *s; + PathNode *e; + int num; + int i; + float t; + float pathdist; + float segmentlength; + + num = NumNodes(); + s = GetNode( 1 ); + pathdist = 0; + + for( i = 2; i <= num; i++ ) + { + e = GetNode( i ); + + segmentlength = distanceToNextNode.ObjectAt( i - 1 ); + if ( ( pathdist + segmentlength ) > dist ) + { + t = dist - pathdist; + return s->origin + dirToNextNode.ObjectAt( i - 1 ) * t; + } + + s = e; + pathdist += segmentlength; + } + + // cap it off at start or end of path + return s->origin; + } + +PathNode *Path::NextNode + ( + float dist + ) + + { + PathNode *s; + PathNode *e; + int num; + int i; + float pathdist; + float segmentlength; + + num = NumNodes(); + s = GetNode( 1 ); + pathdist = 0; + + for( i = 2; i <= num; i++ ) + { + e = GetNode( i ); + + segmentlength = distanceToNextNode.ObjectAt( i - 1 ); + if ( ( pathdist + segmentlength ) > dist ) + { + return e; + } + + s = e; + pathdist += segmentlength; + } + + // cap it off at start or end of path + return s; + } + +void Path::DrawPath + ( + float r, + float g, + float b, + float time + ) + + { + Vector s; + Vector e; + Vector offset; + PathNode *node; + int num; + int i; + + num = NumNodes(); + + if ( ai_debugpath->integer ) + { + gi.DPrintf( "numnodes %d, len %d, nodes %d :", PathManager.NumNodes(), ( int )Length(), num ); + for( i = 1; i <= num; i++ ) + { + node = GetNode( i ); + gi.DPrintf( " %d", node->nodenum ); + } + + gi.DPrintf( "\n" ); + } + + node = GetNode( 1 ); + s = node->origin; + + offset = Vector( r, g, b ) * 4 + Vector( 0, 0, 20 ); + for( i = 2; i <= num; i++ ) + { + node = GetNode( i ); + e = node->origin; + + G_DebugLine( s + offset, e + offset, r, g, b, 1 ); + s = e; + } + } + +int Path::NumNodes + ( + void + ) + + { + return pathlist.NumObjects(); + } + +float Path::Length + ( + void + ) + + { + return pathlength; + } + diff --git a/source/source/fgame/path.h b/source/source/fgame/path.h new file mode 100644 index 0000000..547f35a --- /dev/null +++ b/source/source/fgame/path.h @@ -0,0 +1,119 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/path.h $ +// $Revision:: 5 $ +// $Author:: Steven $ +// $Date:: 6/26/00 4:53p $ +// +// Copyright (C) 1997 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/path.h $ +// +// 5 6/26/00 4:53p Steven +// Fixed some save/load game issues. +// +// 4 6/14/00 2:17p Markd +// fixed compiler warnings for Intel Compiler +// +// 3 5/27/00 2:56p Markd +// Save games 2nd pass +// +// 2 5/24/00 3:14p Markd +// first phase of save/load games +// +// 1 9/10/99 10:54a Jimdose +// +// 1 9/08/99 3:16p Aldie +// +// DESCRIPTION: +// + +#ifndef __PATH_H__ +#define __PATH_H__ + +#include "g_local.h" +#include "class.h" +#include "container.h" +#include "navigate.h" + +class Path : public Class + { + private: + Container pathlist; + Container distanceToNextNode; + Container dirToNextNode; + float pathlength; + PathNodePtr from; + PathNodePtr to; + int nextnode; + + public: + CLASS_PROTOTYPE( Path ); + + Path(); + Path( int numnodes ); + void Clear( void ); + void Reset( void ); + void AddNode( PathNode *node ); + PathNode *GetNode( int num ); + PathNode *NextNode( void ); + PathNode *NextNode( PathNode *node ); + Vector ClosestPointOnPath( Vector pos ); + float DistanceAlongPath( Vector pos ); + Vector PointAtDistance( float dist ); + PathNode *NextNode( float dist ); + void DrawPath( float r, float g, float b, float time ); + int NumNodes( void ); + float Length( void ); + PathNode *Start( void ); + PathNode *End( void ); + virtual void Archive( Archiver &arc ); + }; + +inline void Path::Archive + ( + Archiver &arc + ) + { + PathNodePtr node; + int i, num; + + Class::Archive( arc ); + + if ( arc.Saving() ) + { + num = pathlist.NumObjects(); + } + arc.ArchiveInteger( &num ); + if ( arc.Loading() ) + { + pathlist.FreeObjectList(); + if ( num ) + pathlist.Resize( num ); + distanceToNextNode.FreeObjectList(); + dirToNextNode.FreeObjectList(); + } + for ( i = 1; i <= num; i++ ) + { + if ( arc.Loading() ) + pathlist.AddObject( node ); + + arc.ArchiveSafePointer( pathlist.AddressOfObjectAt( i ) ); + } + + distanceToNextNode.Archive( arc ); + dirToNextNode.Archive( arc ); + + arc.ArchiveFloat( &pathlength ); + arc.ArchiveSafePointer( &from ); + arc.ArchiveSafePointer( &to ); + arc.ArchiveInteger( &nextnode ); + } + +typedef SafePtr PathPtr; + +#endif /* path.h */ diff --git a/source/source/fgame/player.cpp b/source/source/fgame/player.cpp new file mode 100644 index 0000000..2bbf234 --- /dev/null +++ b/source/source/fgame/player.cpp @@ -0,0 +1,11381 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/player.cpp $ +// $Revision:: 392 $ +// $Author:: Markd $ +// $Date:: 8/11/00 7:47p $ +// +// Copyright (C) 1997 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/player.cpp $ +// +// 392 8/11/00 7:47p Markd +// changed a forcemenu from main to demomain for demo +// +// 391 8/04/00 6:06p Markd +// added BeginCinematic and EndCinematic to coolitem code +// +// 389 7/30/00 2:55p Markd +// initialized outfit_level on cleanup +// +// 388 7/30/00 2:48a Aldie +// Added a fudge factor to wall hang +// +// 387 7/29/00 9:05p Aldie +// Fixed armor order +// +// 386 7/29/00 3:59p Aldie +// Fix some fade stuff +// +// 385 7/29/00 2:28p Aldie +// Added a nosound weapon check +// +// 384 7/29/00 12:57p Aldie +// Fixed some ammo check stuff +// +// 383 7/29/00 12:54a Aldie +// Put a couple more checks in checkcanhang +// +// 382 7/28/00 11:59p Aldie +// Added forcemenu +// +// 381 7/28/00 6:58p Steven +// Made crosshairs get hidden when in cinematics. +// +// 380 7/28/00 1:14p Aldie +// Made crosshair collide with the water +// +// 379 7/28/00 1:10a Markd +// fixed outfit bug +// +// 378 7/27/00 11:23p Aldie +// Added a loadstatetable to the archiveperstdata +// +// 377 7/27/00 9:43p Aldie +// Changed dialog for invalid save games +// +// 376 7/27/00 5:16p Markd +// fixed legsstate and torsostate bugs, made canbeUsed pass int the activator +// +// 375 7/27/00 3:52p Aldie +// Changed over letterboxing and fades to the game code. They are sent over in +// player stats and fields now. +// +// 374 7/27/00 1:54a Markd +// changed g_playermodel to be more responsive +// +// 373 7/26/00 6:06p Steven +// Added some reseting of weapon game vars. +// +// 372 7/25/00 11:32p Aldie +// Made some changes to the memory system and fixed a memory allocation bug in +// Z_TagMalloc. Also changed a lot of classes to subclass from Class. +// +// 371 7/25/00 2:41p Markd +// made terminal velocity lethal +// +// 370 7/25/00 12:47p Markd +// Added new player sounds +// +// 369 7/24/00 6:54p Steven +// Changed sv_cinematic from a cvar to a player stat and added actor_camera to +// this also. +// +// 368 7/24/00 6:16p Aldie +// Pushmenu loadsave on death +// +// 367 7/24/00 12:46p Markd +// fixed rope movment +// +// 366 7/23/00 7:58p Steven +// Fixed some boss health stuff. +// +// 365 7/23/00 6:03p Markd +// added fadeout and fadesound to dieing and level change +// +// 364 7/23/00 5:02p Markd +// added boss health +// +// 363 7/22/00 8:37p Steven +// Fixed a prediction thing and added a sound effect to the electric spawn +// effect. +// +// 362 7/22/00 12:52a Markd +// Added can_hang check +// +// 361 7/21/00 10:49p Aldie +// Fixed an animstate problem when dying. +// +// 360 7/21/00 8:36p Steven +// Got gravpaths working fairly well. +// +// 359 7/21/00 3:45p Steven +// Made player have its own showmodel (event & proc) so we could do extra +// commands when the player is shown, fixed throwing evil shglieks, and fixed a +// knockdown bug. +// +// 358 7/21/00 1:14a Markd +// fixed fakeplayer....again +// +// 357 7/19/00 8:46p Markd +// added checkgroundentity +// +// 356 7/19/00 8:19p Steven +// Made it so you wouldn't go to actor camera if already in another camera. +// +// 355 7/19/00 7:26p Markd +// fixed weapons holstered code +// +// 354 7/19/00 5:09p Steven +// Don't do pain event if no damage taken, added electric water means of death, +// and added a loaded proc called after load is done. +// +// 353 7/19/00 3:12p Markd +// Fixed monkey bar problem +// +// 352 7/19/00 11:07a Markd +// changed weapons_active to WeaponsOut +// +// 351 7/18/00 5:19p Markd +// added weapons_active boolean +// +// 350 7/18/00 5:01p Markd +// fixed monkeybar climbing +// +// 349 7/18/00 4:25p Markd +// rewrote holstering code +// +// 348 7/18/00 1:24p Markd +// changed FakePlayer so that it now works like it used to +// +// 347 7/18/00 12:19p Aldie +// Fixed a bug with checkblocked timer +// +// 346 7/17/00 9:51p Aldie +// Added skipcinematic command which is access by pressing the ESC key +// +// 345 7/17/00 7:45p Markd +// made fakeplayer work better +// +// 344 7/17/00 5:26p Aldie +// Fix for fakeplayer to droptofloor +// +// 343 7/17/00 4:42p Aldie +// Removed a print +// +// 342 7/17/00 4:19p Aldie +// Changed to using v_angle instead of torsoangles for some aiming stuff. +// +// 341 7/17/00 3:26p Aldie +// Fix for flashbangs, changed detail variable, and added forcetorsostate +// +// 340 7/17/00 2:56p Steven +// Made it so the player doesn't turn her head as far when looking at things. +// +// 339 7/17/00 11:57a Aldie +// Changed some methods for checking weapons for attack +// +// 338 7/16/00 3:08p Aldie +// Added some holster functions for firing and getting the weapons out. +// +// 337 7/16/00 2:09p Aldie +// Changed some of the player logging +// +// 336 7/16/00 10:46a Steven +// Improved head target stuff. +// +// 335 7/15/00 3:52p Steven +// Only release the shgliek in a throw if he is not in a solid. +// +// 334 7/15/00 2:26p Steven +// Made noclip movement much slower if walking. +// +// 333 7/15/00 1:34p Aldie +// Added takepain command. Allows control for taking pain or not. +// +// 332 7/15/00 1:06p Aldie +// Added specialmove stuff for weapons so we can do special movement with some +// dualhanded weapons +// +// 331 7/15/00 1:36a Markd +// fixed cool item issues +// +// 330 7/14/00 11:45p Markd +// Added ambient sounds to func_supllywater +// +// 329 7/14/00 10:04p Aldie +// Added g_logstats cvar +// +// 328 7/14/00 9:46p Aldie +// Changed the way logstats start up +// +// 327 7/14/00 8:21p Aldie +// Added logstats +// +// 326 7/14/00 5:36p Markd +// took out hand offsets and fixed rolling coming out of cinematics +// +// 325 7/13/00 11:10p Markd +// fixed bug in waitforstate, added waitforstate to legs as well as torso +// +// 324 7/13/00 10:30p Markd +// fixed potential crash bug +// +// 323 7/13/00 9:18p Markd +// added behind_nopitch camera type +// +// 322 7/13/00 8:44p Markd +// fixed prediction on moving platforms +// +// 321 7/13/00 6:24p Markd +// fixed hanging off slanted edges +// +// 320 7/13/00 4:54p Steven +// Made sure the pitch and roll of a thrown shgliek is 0. +// +// 319 7/13/00 4:13p Steven +// Fixed problem with give all cheat and made it so the fakeplayer can't die. +// +// 318 7/13/00 3:19p Markd +// Turned off prediction when standing on non-world brushes +// +// 317 7/12/00 6:34p Aldie +// Added in crosshair scaling for long distances +// +// 316 7/12/00 5:36p Markd +// fixed ammo reporting to support bullets in clip +// +// 315 7/12/00 3:46p Aldie +// Put in a fix for movecontrol_anim where the origin will not get set after a +// pmove +// +// 314 7/12/00 2:54p Markd +// SetWaterPower on initialization +// +// 313 7/12/00 2:10p Markd +// fixed water level hud problem +// +// 312 7/12/00 11:27a Steven +// Changed water to a float. +// +// 311 7/12/00 12:35a Markd +// made player invulnerable during cool item cinematic +// +// 310 7/11/00 9:32p Markd +// Took out water flashing effect +// +// 309 7/11/00 9:28p Markd +// added level.playeritem_edenwater +// +// 308 7/11/00 7:09p Steven +// Made getting knocked onto the ground hurt the player if blow was blocked. +// +// 307 7/11/00 3:11p Aldie +// Testing a fix for ::Killed by not stopping the animation and not cancelling +// the pending events. +// +// 306 7/10/00 11:58p Markd +// fixed level exit issues +// +// 305 7/10/00 11:54p Markd +// added exit level code +// +// 304 7/10/00 9:27p Markd +// added ammo variables for how much ammo the player has. Added levelvars and +// gamevars commands +// +// 303 7/10/00 8:09p Markd +// fixed cool item pickup problems +// +// 302 7/10/00 6:50p Markd +// fixed some issues with water running +// +// 301 7/10/00 5:12p Markd +// made it so that waitForState supports partial names for waitforstate +// Changed archiving of persistant data +// +// 300 7/10/00 10:41a Markd +// added waitforstate +// +// 299 7/07/00 6:34p Steven +// Fixed checkblocked when immobile. +// +// 298 7/07/00 7:32a Steven +// Made it so the player won't not thing she is blocked if immobilized. +// +// 297 7/06/00 7:17p Aldie +// Added in HAS_ARMORPIECE state command +// +// 296 7/06/00 4:51p Markd +// clamped server time on commands so no future packets will be processed +// +// 295 7/06/00 3:37p Markd +// made it so when hurt, the camera is not turned off +// +// 294 7/05/00 9:19p Markd +// tweaked armor stuff +// +// 293 7/05/00 7:36p Steven +// Added more outfit stuff and added it to the saved PersistantData. +// +// 292 7/05/00 6:14p Steven +// Change minimum water needed for turbo speed to 90 and added a damage +// multiplier for combos. +// +// 291 7/05/00 4:17p Markd +// fixed cool item stuff +// +// 290 7/04/00 6:45p Markd +// enhanced cool item features +// +// 289 7/04/00 2:47p Markd +// added ai off to the cool item cinematics +// +// 288 7/04/00 2:25p Markd +// added cool cinematic for new objects +// +// 287 7/03/00 7:00p Steven +// Made throwing of the Shgliek based on the player's torso angles instead of +// her regular angles. +// +// 286 7/03/00 10:23a Steven +// Added some knockback/knockdown stuff. +// +// 285 7/02/00 6:46p Markd +// added spawn thread to PlayerStart +// +// 284 7/01/00 6:55p Markd +// made fakeplayer think +// +// 283 6/30/00 3:11p Markd +// fixed player rise issues +// +// 282 6/29/00 9:32a Markd +// added camera_side_left and side_right support +// +// 281 6/28/00 7:56p Aldie +// Added some pain stuff for use with death. +// +// 280 6/27/00 2:48p Aldie +// Changed some weapon aiming stuff again. Aimed shots are automatically +// determined now. +// +// 279 6/26/00 8:21p Markd +// fixed player hanging off the side of horizontal pipes +// +// 278 6/26/00 7:16p Markd +// tweaked player walking off ledges +// +// 277 6/26/00 5:50p Markd +// re-did some renderfx commands, fixed anti-sb juice stuff +// +// 276 6/26/00 9:42a Steven +// Made it so the player won't target things after being killed. +// +// 275 6/25/00 2:51p Markd +// made use objects easier to use +// +// 274 6/25/00 12:37p Markd +// fixed player getting stuck +// +// 273 6/25/00 11:21a Markd +// fixed slime code for player +// +// 272 6/23/00 8:34p Markd +// fixed player music issues +// +// 271 6/22/00 8:04p Markd +// bullet proofed crosshair usage +// +// 270 6/22/00 12:23p Markd +// must be able to push objects 8 units when pushing them +// +// 269 6/17/00 11:09a Markd +// made it so that julie will not try to grab ledges that are moving +// +// 268 6/16/00 11:28a Aldie +// Added a ground check to 'rise' to see if we are really rising above the +// ground +// +// 267 6/15/00 5:50p Aldie +// Added rise checks +// +// 266 6/15/00 3:54p Aldie +// Took out the legturn command. We don't really need it. +// +// 265 6/15/00 2:54p Aldie +// Fix for the leg turning issue +// +// 264 6/14/00 5:40p Aldie +// Added state ammo check for weapon in hand/mode +// +// 263 6/14/00 3:50p Markd +// Cleaned up more Intel Compiler warnings +// +// 262 6/13/00 6:41p Markd +// Fixed pushing and pulling of objects +// +// 261 6/10/00 1:50p Steven +// Added statemap caching. +// +// 260 6/08/00 9:55a Markd +// added camera_type behind_fixed +// +// 259 6/06/00 7:33p Aldie +// Fix for putting away weapons when crouching and fix for dualhanded weapon +// being out when 2 weapons are being wielded at once. +// +// 258 6/06/00 5:20p Markd +// placed some assertions into infite state stuff +// +// 257 6/06/00 5:02p Markd +// fixed player movement stuff +// +// 256 6/06/00 3:23p Steven +// Now force a shgliek into AI mode if picked up. +// +// 255 6/06/00 3:24p Aldie +// Fix for dead check +// +// 254 6/06/00 12:19p Markd +// working on player movement +// +// 253 6/05/00 6:31p Aldie +// Sped up water power effect and removed cleartorsoanim from the noclip +// resetting +// +// 252 6/05/00 5:03p Aldie +// clear oldstats +// +// 251 6/05/00 3:41p Steven +// Made player not solid when killed. +// +// 250 6/05/00 3:33p Markd +// Fixed sound bug +// +// 249 6/05/00 3:29p Aldie +// Added flickering to waterstats +// +// 248 6/04/00 6:52p Markd +// Added camera support to TouchAnim's cleaned up player camera interface +// +// 247 6/04/00 3:49p Markd +// Added precise shadows to certain characters +// +// 246 6/03/00 6:58p Markd +// don't swing legs when purely strafing +// +// 245 6/03/00 3:14p Aldie +// Added damage effects to player and sentient +// +// 244 6/02/00 6:51p Markd +// added better camera look features +// +// 243 6/02/00 2:01p Markd +// Fixed client persistant data issues +// +// 242 6/01/00 7:02p Markd +// removed activeWeapon variable +// +// 241 6/01/00 3:18p Markd +// rewrote giveItem and item management in sentient +// +// 240 6/01/00 2:47p Aldie +// Change crosshair distance and checkdeath +// +// 239 5/31/00 5:05p Aldie +// New aiming method +// +// 238 5/31/00 10:24a Markd +// Changed LoadingServer to LoadingSavegame +// +// 237 5/30/00 6:54p Aldie +// Added a muzzle clear check +// +// 236 5/30/00 5:06p Aldie +// Added large shield to prevent knockdowns +// +// 235 5/30/00 4:42p Aldie +// Added direction support and knockdown support to player +// +// 234 5/29/00 1:16p Markd +// 3rd round of saved games +// +// 233 5/27/00 5:27p Markd +// zeroed out skipthread once executed +// +// 232 5/27/00 5:14p Steven +// Added player head watch stuff. +// +// 231 5/27/00 9:49a Steven +// Added RemoveTarget stuff. +// +// 230 5/26/00 7:47p Aldie +// Added directonal damage to pain +// +// 229 5/26/00 6:31p Aldie +// Added alternate fire to soulsucker and bug fix to AmmoAvailable() +// +// 228 5/26/00 4:12p Aldie +// Fix another holster bug (crash) +// +// 227 5/26/00 3:41p Aldie +// Fix for holstering in cinematic +// +// 226 5/26/00 2:24p Aldie +// Added waitforplayer commands so we can use it for cinematics when waiting +// for player to finish holstering +// +// 225 5/25/00 4:15p Aldie +// Added weapon holstering while crouching +// +// 224 5/25/00 9:59a Steven +// Fixed picking up of the Shgliek. +// +// 223 5/24/00 6:51p Aldie +// Made some code a little clearer for debugging +// +// 222 5/24/00 3:46p Steven +// Made the player's splash a variable size based on the player's velocity. +// +// 221 5/20/00 6:03p Aldie +// Fixed stat bug +// +// 220 5/20/00 2:12p Steven +// Made it so if the player stands on an actor it will try to push the actor +// downwards. +// +// 219 5/18/00 3:20p Markd +// added damage feedback +// +// 218 5/17/00 7:38p Markd +// moved player into position when starting to push objects +// +// 217 5/16/00 6:25p Markd +// Don't do monkeybar and pipe traces unless the player is on the ground +// +// 216 5/15/00 2:19p Aldie +// Added new tempmodel system and added player accumulated pain +// +// 215 5/11/00 11:12a Steven +// Added pushing actors out of the way and added a splash effect when the +// player lands in water. +// +// 214 5/10/00 10:32a Steven +// Added com_blood stuff. +// +// 213 5/08/00 10:55p Markd +// fixed water_power jumping +// +// 212 5/08/00 6:15p Markd +// put in camera cut choice for state based camera types +// +// 211 5/08/00 6:00p Aldie +// Comment out some debug stuff +// +// 210 5/08/00 3:19p Aldie +// Added initial crosshair work +// +// 209 5/06/00 5:25p Markd +// fixed camera and pipe hang issues +// +// 208 5/06/00 3:15p Markd +// Fixed pipehanging +// +// 207 5/06/00 2:10p Aldie +// Removed a comment +// +// 206 5/06/00 1:28p Aldie +// Changed weapon fire check +// +// 205 5/06/00 11:52a Markd +// fixed player orientation problems +// +// 204 5/05/00 7:38p Aldie +// Fix dual weapon stats +// +// 203 5/04/00 10:25p Markd +// fixed player orienation issues again +// +// 202 5/04/00 5:01p Markd +// fixed player orientation problems +// +// 201 5/02/00 6:42p Steven +// Made the fakeplayer a step size shorter to fix some collision issues. +// +// 200 5/02/00 6:27p Markd +// Fixed checkstate so that it would do a string comparison only up to the +// number of letters in statename and not an exact comparison +// +// 199 5/02/00 3:14p Steven +// Added player watching actors that talk to her. +// +// 198 5/01/00 2:45p Steven +// Added some action level stuff. +// +// 197 5/01/00 11:31a Markd +// Added SetWaterPower to Player +// +// 196 4/30/00 4:42p Markd +// Fixed player turning +// +// 195 4/29/00 11:28a Markd +// removed old rope code, cleaned up rope interface +// +// 194 4/28/00 3:07p Steven +// Got rid of dropping items on death for now. +// +// 193 4/26/00 5:25p Aldie +// Changes to weapons to avoid having to specify the classname +// +// 192 4/26/00 5:19p Aldie +// Changed from entname to item_name for weapon checking code +// +// 191 4/24/00 7:22p Markd +// fixed some uninitialized variables +// +// 190 4/24/00 7:07p Aldie +// Removed old code to try and fix inconsistency between legs and torso for +// firing when moving and standing. It's all done in the state machine now. +// +// 189 4/19/00 12:54p Markd +// put in auto_starttime and auto_stoptime support into auto cameras +// +// 188 4/15/00 5:40p Markd +// fixed falling damage and getting into and out of water +// +// 187 4/15/00 4:24p Markd +// Fixed player turning +// +// 186 4/15/00 1:48p Steven +// Made it so the player doesn't cast a shadow when we are using the +// fakeplayer. +// +// 185 4/15/00 1:30p Markd +// added check_was_running code so that player does not always stop short +// +// 184 4/15/00 9:53a Markd +// fixed player climbing ladder code +// +// 183 4/14/00 6:04p Aldie +// Added checksolidforward to state system +// +// 182 4/13/00 5:31p Steven +// Added a checkshgliekdead check and set have_shgliek to false always when +// throwing not just when the shgliek is found and thrown. +// +// 181 4/11/00 2:46p Markd +// Implemented Automatic camera support +// +// 180 4/10/00 1:43p Markd +// changed rope user interface +// +// 179 4/10/00 11:17a Markd +// Added new rope code +// +// 178 4/07/00 6:00p Aldie +// Added flashing and fixed radius damage for explosions +// +// 177 4/07/00 3:00p Markd +// Added legs dangling code for pipehanging +// +// 176 4/07/00 2:05p Markd +// added MOVETYPE_PIPEHANG +// +// 175 4/07/00 1:24p Markd +// fixed wall climbing issues +// +// 174 4/07/00 10:17a Markd +// fixed shgliek pickup and weapon holstering +// +// 173 4/06/00 6:02p Markd +// changed UseAnim animation from torso to legs +// +// 172 4/06/00 2:52p Markd +// commented out setting orientation based off of v_angle +// +// 171 4/06/00 10:59a Markd +// fixed player speed when player has full water +// +// 170 4/05/00 8:50p Markd +// got rid of damage skin support +// +// 169 4/05/00 8:41p Markd +// Added water_level conditional +// +// 168 4/05/00 7:13p Aldie +// Lots of inventory functionality changes. +// +// 167 4/04/00 3:28p Aldie +// Fix use code for inventory items +// +// 166 4/04/00 11:02a Markd +// put in checkcanclimb and feet checks +// +// 165 4/03/00 3:45p Markd +// fixed timescale bug with movement +// +// 164 3/31/00 6:21p Markd +// took out absolute origin set in StartUseObject +// +// 163 3/31/00 3:19p Markd +// Added UseObject functionality +// +// 162 3/28/00 1:47p Markd +// fixed standing jump +// +// 161 3/27/00 3:45p Markd +// Hooked up UseAnim state info into the game +// +// 160 3/24/00 2:12p Steven +// Fixed an issue with grabbing of ledges. +// +// 159 3/22/00 2:04p Aldie +// Added holster command +// +// 158 3/21/00 6:08p Markd +// Added invehicle check +// +// 157 3/21/00 5:05p Markd +// +// 156 3/21/00 2:31p Aldie +// Changed checkattackleft and right +// +// 155 3/20/00 6:09p Steven +// Added SetMouthAngle. +// +// 154 3/18/00 3:55p Markd +// working on player turning +// +// 153 3/18/00 2:42p Markd +// added facing up and down slopes +// +// 152 3/17/00 6:37p Markd +// Added chance conditional +// +// 151 3/16/00 3:35p Aldie +// Added checkpain state back instead of forcing it +// +// 150 3/16/00 10:20a Markd +// fixed useanim firing its targets before the animation was completed +// +// 149 3/15/00 4:09p Aldie +// Fixed a bug with using weapons, and added some ability to force a state in +// the player +// +// 148 3/13/00 5:18p Aldie +// Made some changes for usable inventory item stuff +// +// 147 3/07/00 6:38p Steven +// Fixed up some angle stuff when throwing the shgliek. +// +// 146 3/06/00 8:17p Markd +// converted certain events from EV_CONSOLE to EV_CHEAT +// +// 145 3/04/00 1:54p Aldie +// Changed UpdateStats +// +// 144 3/04/00 12:29p Jimdose +// separated feet checks into their own functions +// +// 143 3/02/00 11:12a Markd +// Added additional SetReverb function +// +// 142 3/02/00 10:47a Steven +// Changed reverb interface and set players health to 0 after dying to prevent +// negative health being shown. +// +// 141 3/01/00 8:44p Jimdose +// added turning for monkey bars +// made move checks provide pass/fail results +// added checks for feet and falling when both feet aren't on the ground +// +// 140 3/01/00 10:59a Jimdose +// UseAnim now sends the entity that used it as the activator instead of itself +// when triggering targets +// +// 139 2/28/00 6:51p Jimdose +// added checks for running into walls +// +// 138 2/28/00 6:33p Aldie +// Added more advanced pain state checks +// +// 137 2/26/00 7:09p Jimdose +// added better movement checks for pipecrawl, monkey bars +// added checks to prevent player from going into walk or run animation while +// move is blocked +// fixed setting step height when stepping up +// +// 136 2/26/00 2:26p Steven +// Fixed a spot where something was comparing an entnum to 0 instead of +// ENTITYNUM_NONE. +// +// 135 2/26/00 12:59p Jimdose +// made player respawning work +// +// 134 2/26/00 11:50a Jimdose +// added slope checks +// +// 133 2/26/00 11:22a Steven +// Added partial immobile flag. +// +// 132 2/25/00 7:27p Markd +// Added useanim_numloop support and fixed useanim_orientation +// +// 131 2/25/00 5:02p Aldie +// Changed some reloading and put in a fix for the animation problem with the +// firing of the weapons +// +// 130 2/24/00 7:26p Aldie +// Added dual wielding +// +// 129 2/24/00 4:20p Jimdose +// added ladder movement +// merged some redundant variables +// made UseAnim have a movetype +// changed bounding box when crouched +// +// 128 2/23/00 5:25p Aldie +// clarified checkuseweapon state check +// +// 127 2/23/00 3:19p Aldie +// Added more inventory functionality with the player +// +// 126 2/22/00 6:56p Jimdose +// fixed double jumping +// fixed climbing on monsters +// no longer forward and back move on ropes +// +// 125 2/22/00 1:57p Jimdose +// added pushobjects +// +// 124 2/17/00 6:26p Aldie +// Fixed naming conventions for weapon hand and also added various attachtotag +// functionality for weapons that attach to different tags depending on which +// hand they are wielded in. +// +// 123 2/17/00 4:18p Jimdose +// made statemap_Legs and statemap_Torso part of player instead of global +// removed redundant physics variables +// made CheckGround use the one from bg_pmove +// onground now checks if player can walk, instead of if player has a +// groundentity +// +// 122 2/17/00 12:00p Aldie +// Added command processing to state system with the addition of entrycommands +// and exitcommands. +// +// 121 2/16/00 4:01p Aldie +// Added shield functionality +// +// 120 2/15/00 9:14p Jimdose +// fixed wall avoidance +// +// 119 2/15/00 8:57p Jimdose +// added move feedback checks for state system +// added wall avoidance code +// +// 118 2/14/00 7:34p Aldie +// Fixed some auto targeting issues +// +// 117 2/14/00 6:36p Markd +// added code to player to setup bootlights and faster/longer running based on +// water level +// +// 116 2/14/00 5:47p Jimdose +// state system now uses leg state only for MOVECONTROL_LEGS +// torso state is now the controlling state +// +// 115 2/10/00 11:25a Markd +// Added bootlights glowing code +// +// 114 2/09/00 8:02p Aldie +// Added loopfire weapons +// +// 113 2/09/00 12:40p Steven +// Made checkhasweapon take into account dual handed weapons also. +// +// 112 2/08/00 9:53p Jimdose +// player now gets set to proper anim at startup +// +// 111 2/08/00 6:35p Aldie +// Added more blocking code to player and sentient +// +// 110 2/08/00 11:33a Steven +// Added picking up of Shgliek. +// +// 109 2/08/00 12:17a Jimdose +// made rope grabbing controlled by state system +// +// 108 2/07/00 7:38p Aldie +// Fixed swiping, also various weapons fixes for sword and for sling +// +// 107 2/04/00 7:28p Aldie +// Combat code - blocking and combos +// +// 106 2/04/00 3:11p Aldie +// Changed sword attack method for water usage +// +// 105 2/03/00 2:56p Aldie +// Sword and water coding +// +// 104 2/02/00 7:08p Aldie +// Added new sword code and water damage +// +// 103 2/02/00 4:28p Aldie +// Added some new state checks for combo help +// +// 102 2/02/00 8:54a Markd +// Set targetname player +// +// 101 2/01/00 8:13p Aldie +// More autoaim work +// +// 100 2/01/00 6:20p Markd +// put in checks for immobile flag or playerfrozen when checking if we can fire +// +// 99 2/01/00 5:28p Aldie +// More updates for auto aiming +// +// 98 1/31/00 7:56p Aldie +// Added some new states and improved arm tracking +// +// 97 1/31/00 4:25p Jimdose +// added dir variable to monkeybar and horizontalpipe +// +// 96 1/31/00 3:56p Aldie +// working on the auto aim / tracking code +// +// 95 1/29/00 6:17p Aldie +// Fixed some problems when state doesn't exist. +// +// 94 1/29/00 11:27a Jimdose +// made ropes work with state system +// +// 93 1/26/00 5:06p Aldie +// Changed .txt to .scr for giveall script +// +// 92 1/26/00 3:33p Aldie +// Change Amount to getAmount. Added some 'listinventory' command. Added give +// all cheat to execute the script in global/giveall.txt +// +// 91 1/26/00 9:53a Markd +// Changed FOV command to an fov command +// +// 90 1/25/00 8:06p Jimdose +// added hardimpact checks +// improved wall hug checks +// fixed side jump angle +// +// 89 1/25/00 3:39p Markd +// added noclip check in evaluate state +// +// 88 1/24/00 6:55p Steven +// Added reverb stuff. +// +// 87 1/24/00 2:56p Markd +// Moved CheckMoveFlags into non-noclip clause +// +// 86 1/24/00 2:50p Jimdose +// added rope checks +// +// 85 1/22/00 4:04p Jimdose +// added pipe crawl and stepping up +// got rid of vec3() calls +// +// 84 1/20/00 7:10p Jimdose +// added checkcanwallhug +// fixed grabbing onto ledges +// added movecontrol +// only call start movement code when movecontrol changes +// fixed UseAnim null pointer bug +// +// 83 1/20/00 10:45a Markd +// removed bootlights from being turned on and off +// +// 82 1/19/00 10:02p Jimdose +// added airspeed +// +// 81 1/19/00 7:59p Markd +// Rewrote Surface Model Event and also added changeoutfit command to player +// +// 80 1/19/00 10:44a Markd +// Cleaned up MOD messages and fixed music starting because of falling damage +// +// 79 1/18/00 6:49p Aldie +// Removed readtofire calls out of the state checking +// +// 78 1/18/00 6:37p Jimdose +// adjusted hang position +// +// 77 1/18/00 2:59p Markd +// Removed unused code +// +// 76 1/17/00 10:20p Jimdose +// Rewrote state system initialization. Made conditionals defined with array. +// Made Evaluate functions early exit +// +// 75 1/16/00 5:43p Aldie +// Made weapon tag vars +// +// 74 1/15/00 4:13p Markd +// Changed MOVETYPE_ABSOLUTE to have collision and not have user control of the +// angles +// +// 73 1/15/00 3:57p Markd +// Eliminated multiple "angle" events and replaced them with EV_SetAngle +// +// 72 1/15/00 1:36p Markd +// Added UseAnim and TouchUseAnim functionality to Player and game +// +// 71 1/15/00 9:29a Markd +// rename tag_weapon to tag_weapon_right +// +// 70 1/14/00 5:07p Markd +// Removed surface num, tri_num and damage_multiplier from multiple functions +// and events +// +// 69 1/13/00 5:19p Jimdose +// removed lightvolume stuff +// +// 68 1/13/00 4:55p Aldie +// Changed crossbow weap +// +// 67 1/12/00 8:04p Markd +// changed the way camera_flags were cleared out on the client +// +// 66 1/12/00 3:17p Aldie +// Added some water functionality +// +// 65 1/10/00 6:17p Jimdose +// more code cleanup +// +// 64 1/10/00 10:30a Jimdose +// removed unused code +// +// 63 1/06/00 11:08p Jimdose +// cleaning up unused code +// +// 62 1/06/00 4:58p Markd +// changed the camera angle for topdown +// +// 61 1/06/00 4:39p Markd +// fixed tiki file name +// +// 60 1/06/00 11:54a Jimdose +// Converted AngleVectors from forward,right,up to forward,left,up and also +// fixed functionality of vectoangles function. Made all cooridinate systems +// identical. +// +// 59 1/03/00 5:08p Markd +// put in camera offsets for player and state machine +// +// 58 12/20/99 6:51p Steven +// Moved jumpxy to sentient. +// +// 57 12/20/99 6:37p Markd +// Made camera cutting work properly +// +// 56 12/17/99 8:27p Jimdose +// got rid of unused vars and functions +// +// 55 12/17/99 6:35p Jimdose +// changed spawnarg code +// added Level class for spawning and map control +// got rid of unused or superflous variables +// changed setjmp/longjmp calls to try/throw/catch exception handling +// +// 54 12/14/18 2:44p Jimdose +// added monkey bar movement +// +// 53 12/13/99 10:17a Markd +// Fixed merge bug +// +// 52 12/13/99 10:14a Aldie +// Temp update for bug fixing due to merge +// +// 51 12/10/99 6:13p Jimdose +// added movement check functions +// unified redundant yaw based orientation calculations +// added wall hug movetype +// +// 50 12/10/99 11:52a Aldie +// Adjusted player angles a bit +// +// 49 12/10/99 11:17a Jimdose +// got rid of unused movement functions +// fixed pulling up from hang +// +// 48 12/09/99 7:38p Jimdose +// improved grabbing and hanging onto walls +// +// 47 12/09/99 3:41p Jimdose +// fixed direction when jumping +// torso anim no longer gets stuck when coming out of noclip +// +// 46 12/09/99 2:31p Aldie +// Head tracking +// +// 45 12/08/99 7:00p Aldie +// Busting up player a bit and wrote some head tracking code +// +// 44 12/03/99 7:02p Aldie +// More ammo joy +// +// 43 12/03/99 9:46a Markd +// fixed a camera lerping bug +// +// 42 12/02/99 6:53p Aldie +// Changed naming conventions from "both" to "dualhanded" Also put in the +// inventory renderer for the hud file +// +// 41 12/01/99 4:56p Markd +// fixed some reference versus pointer issues with RandomAnimate and NewAnim +// +// 40 12/01/99 3:18p Aldie +// Fix for noclip bug where we should be in idle for noclipping +// +// 39 12/01/99 11:26a Aldie +// Couple of fixes for emitters and more ammo stuff +// +// 38 11/29/99 6:52p Aldie +// Fix 2 handed weapon bug +// +// 37 11/29/99 6:32p Aldie +// Lots of changes for ammo system +// +// 36 11/22/99 6:46p Aldie +// Started working on ammo changes - will finish after Thanksgiving break +// +// 35 11/19/99 6:33p Aldie +// Removed debug print +// +// 34 11/19/99 5:45p Aldie +// Update for primary and alternate fire weapons. Removed PRIMARY and SECONDAY +// mode weapons of Sin, removed SILENCED properties, and changed ammo types to +// use the new system. Still need to fix ammo checking for weapons. +// +// 33 11/15/99 11:55a Aldie +// Added rope archiver +// +// 32 11/11/99 5:29p Jimdose +// removed debugging print +// +// 31 11/11/99 5:25p Jimdose +// added separate torso animation +// +// 30 11/09/99 8:05p Markd +// Added SetViewAngles and also made a SetFOV function +// +// 29 11/09/99 5:12p Aldie +// Added ajustanglesforattack +// +// 28 11/05/99 7:30p Aldie +// Angles Adjustment +// +// 27 11/04/99 10:03a Markd +// complete overhaul of the camera system +// +// 26 11/02/99 2:21p Aldie +// Rope stuff +// +// 25 11/01/99 4:00p Jimdose +// added SetControllerAngles and SetControllerTag +// +// 24 10/29/99 6:48p Jimdose +// added bone controllers +// moved torso and head angle calculation from cg_player.c +// +// 23 10/28/99 6:33p Markd +// Added fakeplayer ability, also added CloneEntity +// +// 22 10/28/99 4:01p Aldie +// Fix rope init +// +// 21 10/28/99 11:54a Aldie +// Some more rope stuff +// +// 20 10/28/99 10:42a Aldie +// Added rope functions +// +// 19 10/27/99 12:19p Markd +// added smooth camera lerping +// +// 18 10/27/99 10:29a Steven +// Added new flag PMF_NO_MOVE. +// +// 17 10/19/99 7:53p Markd +// eliminated 3 part model system +// +// 16 10/18/99 6:10p Jimdose +// got rid of separate state machine for torso and legs +// now use skeletal model for player +// +// 15 10/12/99 2:23p Markd +// Rewrote camera and player movetype system +// +// 14 10/08/99 2:13p Markd +// Made player default to ET_PLAYER type and fixed up some PM_LOCKVIEW issues +// +// 13 10/05/99 4:43p Jimdose +// no longer evaluate state while noclipping +// +// 12 10/05/99 4:32p Jimdose +// fixed out of bounds problem in SetAnim when part is all +// go into stand animation when noclipping +// +// 11 10/01/99 4:52p Markd +// Made Warning level 4 work on all projects +// +// 10 9/30/99 5:24p Steven +// Event formatting. +// +// 9 9/17/99 6:31p Jimdose +// changed checks on groundEntityNum +// +// 8 9/17/99 3:40p Jimdose +// fixed jerkiness in player movement +// +// 7 9/16/99 7:44p Jimdose +// PM_SPECTATOR changed to PM_NOCLIP +// +// 6 9/16/99 4:46p Markd +// more merging +// +// 5 9/16/99 11:18a Markd +// Continuing merge of code, not functional yet but closer +// +// 4 9/15/99 6:57p Aldie +// Update to get game working +// +// 3 9/13/99 4:22p Jimdose +// merge +// +// 2 9/13/99 3:27p Aldie +// code merge +// +// 1 9/10/99 10:54a Jimdose +// +// 1 9/08/99 3:16p Aldie +// +// 104 9/02/99 9:15p Jimdose +// fixed player shimmy left/right on hangs +// +// 103 9/02/99 7:33p Jimdose +// fixed bool to int warning +// +// 102 9/02/99 7:29p Jimdose +// added checks for doors +// +// 101 9/02/99 6:59p Markd +// put in anti_sucknblow support +// +// 100 9/02/99 4:39p Jimdose +// only get hurt when damage > 15 +// +// 99 9/02/99 1:53p Markd +// Added CheckWater to ClientMove +// +// 98 9/01/99 8:09p Markd +// Made slime hurt you +// +// 97 9/01/99 7:54p Jimdose +// fixed canfall checks on player clips +// hardcoded speed when in water +// +// 96 9/01/99 1:44p Jimdose +// made DoUse a script called event +// removed CheckButtons +// disabled obstacle avoidance +// +// 95 9/01/99 12:03p Steven +// Modified sword damage again. +// +// 94 9/01/99 10:29a Aldie +// Added holstering. +// +// 93 8/31/99 8:28p Markd +// fixed noclip +// +// 92 8/31/99 8:23p Steven +// Made it easier to hit with the sword and made the sword do less damage. +// +// 91 8/31/99 7:40p Jimdose +// added check for if she has a weapon +// added movement speed based on animation +// +// 90 8/31/99 10:15a Aldie +// Removed a debug line +// +// 89 8/30/99 10:26p Jimdose +// added check for jump flip +// +// 88 8/30/99 8:58p Aldie +// Fix for sword attack +// +// 87 8/30/99 1:02p Aldie +// Removed a debugline +// +// 86 8/30/99 10:10a Jimdose +// added check in obstacle avoidance to avoid steering away from floor polys +// +// 85 8/27/99 5:05p Markd +// Changed Start( -1 ) to StartImmediately, changed InitInventory. +// +// 84 8/27/99 4:49p Jimdose +// separated state machine into two, one for torso, one for legs +// +// 83 8/23/99 10:16a Jimdose +// added better falling checks +// added 3 part models +// +// 82 8/19/99 3:02p Jimdose +// added steering away from newarly parallel walls +// removed con_clearfade +// +// 81 8/19/99 12:01p Aldie +// Added in firing time checks +// +// 80 8/19/99 11:23a Jimdose +// working on turning away from walls +// +// 79 8/18/99 4:15p Jimdose +// added conditionals for health, death, and pain +// +// 78 8/18/99 3:28p Jimdose +// added cylindrical collision detection +// +// 77 8/17/99 4:52p Jimdose +// added oldorigin +// added various checks for physics +// added JumpXY +// +// 76 8/16/99 10:31a Steven +// Moved ConditionalParameter back into Conditional. +// +// 75 8/12/99 8:04p Jimdose +// working on climbing stuff +// +// 74 8/12/99 12:11p Jimdose +// added g_statefile cvar +// +// 73 8/11/99 10:07p Jimdose +// fixed bug where pmove_t struct wasn't initialized +// +// 72 8/11/99 9:59p Markd +// Added sword to inventory +// +// 71 8/11/99 7:58p Jimdose +// preliminary climbing code in +// +// 70 8/11/99 7:35p Aldie +// Added hand checking to weapons +// +// 69 8/11/99 6:00p Aldie +// Removed a printf +// +// 68 8/11/99 5:43p Aldie +// Fix bug with weapon changing states +// +// 67 8/11/99 11:51a Aldie +// Added giveweapon cheat and fixed weapon changing bug +// +// 66 8/10/99 6:46p Aldie +// Added some better condition logic +// +// 65 8/10/99 11:36a Aldie +// Update of the weapons system +// +// 64 8/10/99 10:52a Jimdose +// started working on climbing +// +// 63 8/06/99 6:52p Jimdose +// changed format of state machine callback functions +// +// 62 8/06/99 6:39p Aldie +// Started moving over to new weapons system +// +// 61 8/04/99 6:02p Jimdose +// now respond to the movetype command from the state machine +// +// 60 8/03/99 3:36p Aldie +// Made the crossbow the default weapon +// +// 59 7/30/99 7:53p Markd +// Added jumping ability to the player +// +// 58 7/29/99 5:33p Markd +// Fixed weird compiler bug +// +// 57 7/23/99 3:27p Aldie +// +// 56 7/19/99 7:55p Markd +// removed unused leftsword, lefttorch, torch loadings +// +// 55 7/07/99 4:06p Jimdose +// changed julie2.st to julie.st +// +// 54 7/07/99 2:53p Jimdose +// added new keys for controlling the player +// added ResetState and LoadState +// +// 53 7/06/99 8:53p Jimdose +// only trace down stepsize from move when on ground +// +// 52 7/06/99 8:33p Jimdose +// removed unused player code +// added state machine for player animation +// +// 51 6/25/99 5:24p Markd +// changed the player animations and movement speed +// +// DESCRIPTION: +// Class definition of the player. +// +#include "g_local.h" +#include "entity.h" +#include "player.h" +#include "worldspawn.h" +#include "weapon.h" +#include "trigger.h" +#include "scriptmaster.h" +#include "path.h" +#include "navigate.h" +#include "misc.h" +#include "earthquake.h" +#include "gravpath.h" +#include "armor.h" +#include "inventoryitem.h" +#include "gibs.h" +#include "actor.h" +#include "object.h" +#include "characterstate.h" +#include "rope.h" +#include "weaputils.h" + +//Forward +//Back +//TurnRight +//TurnLeft +//Moveleft (strafe) +//Moveright (strafe) +//Moveup (Jump) +//Movedown (Duck) +//Action (Use) +//Sneak (Toggle or Momentary) +//Speed/Walk (Toggle or Momentary) +//Fire Left hand +//Fire Right hand + +#define SLOPE_45_MIN 0.7071f +#define SLOPE_45_MAX 0.831f +#define SLOPE_22_MIN SLOPE_45_MAX +#define SLOPE_22_MAX 0.95f + +#define MIN_Z -999999 +#define PUSH_OBJECT_DISTANCE 16.0f + +#define R_ARM_NAME "Bip01 R UpperArm" +#define L_ARM_NAME "Bip01 L UpperArm" + +const Vector power_color( 0.0, 1.0, 0.0 ); +const Vector acolor( 1.0, 1.0, 1.0 ); +const Vector bcolor( 1.0, 0.0, 0.0 ); + +static Vector min_box_8x8( -4, -4, -4 ); +static Vector max_box_8x8( 4, 4, 4 ); +static Vector min4x4( -4, -4, 0 ); +static Vector max4x4x0( 4, 4, 0 ); +static Vector max4x4x8( 4, 4, 8 ); + +qboolean TryPush( int entnum, vec3_t move_origin, vec3_t move_end ); + +Event EV_Player_DumpState + ( + "state", + EV_CHEAT, + NULL, + NULL, + "Dumps the player's state to the console." + ); +Event EV_Player_ForceTorsoState + ( + "forcetorsostate", + EV_DEFAULT, + "s", + "torsostate", + "Force the player's torso to a certain state" + ); +Event EV_Player_GiveAllCheat + ( + "wuss", + EV_CHEAT, + NULL, + NULL, + "Gives player all weapons." + ); +Event EV_Player_EndLevel + ( + "endlevel", + EV_DEFAULT, + NULL, + NULL, + "Called when the player gets to the end of the level." + ); +Event EV_Player_DevGodCheat + ( + "god", + EV_CHEAT, + "I", + "god_mode", + "Sets the god mode cheat or toggles it." + ); +Event EV_Player_DevNoTargetCheat + ( + "notarget", + EV_CHEAT, + NULL, + NULL, + "Toggles the notarget cheat." + ); +Event EV_Player_DevNoClipCheat + ( + "noclip", + EV_CHEAT, + NULL, + NULL, + "Toggles the noclip cheat." + ); +Event EV_Player_PrevItem + ( + "invprev", + EV_CONSOLE, + NULL, + NULL, + "Cycle to player's previous item." + ); +Event EV_Player_NextItem + ( + "invnext", + EV_CONSOLE, + NULL, + NULL, + "Cycle to player's next item." + ); +Event EV_Player_GiveCheat + ( + "give", + EV_CHEAT, + "sI", + "name amount", + "Gives the player the specified thing (weapon, ammo, item, etc.) and optionally the amount." + ); +Event EV_Player_GiveWeaponCheat + ( + "giveweapon", + EV_CHEAT, + "s", + "weapon_name", + "Gives the player the specified weapon." + ); +Event EV_Player_UseItem + ( + "use", + EV_CONSOLE, + "sI", + "name weapon_hand", + "Use the specified weapon in the hand choosen (optional)." + ); +Event EV_Player_GameVersion + ( + "gameversion", + EV_CONSOLE, + NULL, + NULL, + "Prints the game version." + ); +Event EV_Player_Fov + ( + "fov", + EV_CONSOLE, + "F", + "fov", + "Sets the fov." + ); +Event EV_Player_Dead + ( + "dead", + EV_DEFAULT, + NULL, + NULL, + "Called when the player is dead." + ); +Event EV_Player_SpawnEntity + ( + "spawn", + EV_CHEAT, + "sSSSSSSSS", + "entityname keyname1 value1 keyname2 value2 keyname3 value3 keyname4 value4", + "Spawns an entity." + ); +Event EV_Player_SpawnActor + ( + "actor", + EV_CHEAT, + "sSSSSSSSS", + "modelname keyname1 value1 keyname2 value2 keyname3 value3 keyname4 value4", + "Spawns an actor." + ); +Event EV_Player_Respawn + ( + "respawn", + EV_DEFAULT, + NULL, + NULL, + "Respawns the player." + ); +Event EV_Player_TestThread + ( + "testthread", + EV_CHEAT, + "sS", + "scriptfile label", + "Starts the named thread at label if provided." + ); +Event EV_Player_PowerupTimer + ( + "poweruptimer", + EV_DEFAULT, + "ii", + "poweruptimer poweruptype", + "Sets the powerup timer and powerup type." + ); +Event EV_Player_UpdatePowerupTimer + ( + "updatepoweruptime", + EV_DEFAULT, + NULL, + NULL, + "Called once a second to decrement powerup time." + ); +Event EV_Player_ResetState + ( + "resetstate", + EV_CHEAT, + NULL, + NULL, + "Reset the player's state table." + ); +Event EV_Player_WhatIs + ( + "whatis", + EV_CHEAT, + "i", + "entity_number", + "Prints info on the specified entity." + ); +Event EV_Player_ActorInfo + ( + "actorinfo", + EV_CHEAT, + "i", + "actor_number", + "Prints info on the specified actor." + ); +Event EV_Player_KillEnt + ( + "killent", + EV_CHEAT, + "i", + "entity_number", + "Kills the specified entity." + ); +Event EV_Player_KillClass + ( + "killclass", + EV_CHEAT, + "sI", + "classname except_entity_number", + "Kills all of the entities in the specified class." + ); +Event EV_Player_RemoveEnt + ( + "removeent", + EV_CHEAT, + "i", + "entity_number", + "Removes the specified entity." + ); +Event EV_Player_RemoveClass + ( + "removeclass", + EV_CHEAT, + "sI", + "classname except_entity_number", + "Removes all of the entities in the specified class." + ); +Event EV_Player_ActivateNewWeapon + ( + "activatenewweapon", + EV_DEFAULT, + NULL, + NULL, + "Active the new weapon specified by useWeapon." + ); +Event EV_Player_DeactivateWeapon + ( + "deactivateweapon", + EV_DEFAULT, + "s", + "side", + "Deactivate the weapon in the specified hand." + ); +Event EV_Player_Jump + ( + "jump", + EV_DEFAULT, + "f", + "height", + "Makes the player jump." + ); +Event EV_Player_SwordAttack + ( + "swordattack", + EV_DEFAULT, + "s", + "hand", + "Makes the player attack with the sword in the specified sword." + ); +Event EV_Player_SwipeOn + ( + "swipeon", + EV_DEFAULT, + NULL, + NULL, + "Turn on the sword swiping for the weapon in the specified hand" + ); +Event EV_Player_SwipeOff + ( + "swipeoff", + EV_DEFAULT, + NULL, + NULL, + "Turn off the sword swiping for the weapon in the specified hand" + ); +Event EV_Player_AnimLoop_Torso + ( + "animloop_torso", + EV_DEFAULT, + NULL, + NULL, + "Called when the torso animation has finished." + ); +Event EV_Player_AnimLoop_Legs + ( + "animloop_legs", + EV_DEFAULT, + NULL, + NULL, + "Called when the legs animation has finished." + ); +Event EV_Player_DoUse + ( + "usestuff", + EV_DEFAULT, + NULL, + NULL, + "Makes the player try to use whatever is in front of her." + ); +Event EV_Player_SetHeadTarget + ( + "headtarget", + EV_CONSOLE, + NULL, + NULL, + "Sets the Makes the player try to use whatever is in front of her." + ); +Event EV_Player_ChangeOutfit + ( + "changeoutfit", + EV_CONSOLE, + "i", + "outfit_stage", + "Change the outfit to the specified stage." + ); +Event EV_Player_ListInventory + ( + "listinventory", + EV_CONSOLE, + NULL, + NULL, + "List of the player's inventory." + ); +Event EV_Player_PickupShgliek + ( + "pickup", + EV_DEFAULT, + NULL, + NULL, + "Picks up a shgliek." + ); +Event EV_Player_ThrowShgliek + ( + "throw", + EV_DEFAULT, + NULL, + NULL, + "Throws a shgliek." + ); +Event EV_Player_ClearLeftArmTarget + ( + "clearleftarmtarget", + EV_DEFAULT, + NULL, + NULL, + "Clears the left arm target of the player" + ); +Event EV_Player_ClearRightArmTarget + ( + "clearrightarmtarget", + EV_DEFAULT, + NULL, + NULL, + "Clears the right arm target of the player" + ); +Event EV_Player_ActivateShield + ( + "activateshield", + EV_DEFAULT, + NULL, + NULL, + "Activates the player's shield" + ); +Event EV_Player_DeactivateShield + ( + "deactivateshield", + EV_DEFAULT, + NULL, + NULL, + "Deactivates the player's shield" + ); +Event EV_Player_AdjustTorso + ( + "adjust_torso", + EV_DEFAULT, + "b", + "boolean", + "Turn or off the torso adjustment" + ); +Event EV_Player_DualWield + ( + "dualwield", + EV_CONSOLE, + "ss", + "weaponleft weaponright", + "Dual wield the specified weapons" + ); +Event EV_Player_UseDualWield + ( + "usedualwield", + EV_CONSOLE, + NULL, + NULL, + "Use the weapons that are on the dual wield list" + ); +Event EV_Player_EvaluateTorsoAnim + ( + "evaluatetorsoanim", + EV_CONSOLE, + NULL, + NULL, + "Evaluate the torso anim for possible changes" + ); +Event EV_Player_StepUp + ( + "stepup", + EV_DEFAULT, + NULL, + NULL, + "Causes player to step up" + ); +Event EV_Player_Turn + ( + "turn", + EV_DEFAULT, + "f", + "yawangle", + "Causes player to turn the specified amount." + ); +Event EV_Player_TurnUpdate + ( + "turnupdate", + EV_DEFAULT, + "ff", + "yaw timeleft", + "Causes player to turn the specified amount." + ); +Event EV_Player_TurnLegs + ( + "turnlegs", + EV_DEFAULT, + "f", + "yawangle", + "Turns the players legs instantly by the specified amount." + ); +Event EV_Player_NextPainTime + ( + "nextpaintime", + EV_DEFAULT, + "f", + "seconds", + "Set the next time the player experiences pain (Current time + seconds specified)." + ); + +Event EV_Player_FinishUseAnim + ( + "finishuseanim", + EV_DEFAULT, + NULL, + NULL, + "Fires off all targets associated with a particular useanim." + ); +Event EV_Player_Holster + ( + "holster", + EV_CONSOLE, + NULL, + NULL, + "Holsters all wielded weapons, or unholsters previously put away weapons" + ); +Event EV_Player_SafeHolster + ( + "safeholster", + EV_CONSOLE, + "b", + "putaway", + "Holsters all wielded weapons, or unholsters previously put away weapons\n" + "preserves state, so it will not holster or unholster unless necessary" + ); +Event EV_Player_StartUseObject + ( + "startuseobject", + EV_DEFAULT, + NULL, + NULL, + "starts up the useobject's animations." + ); +Event EV_Player_FinishUseObject + ( + "finishuseobject", + EV_DEFAULT, + NULL, + NULL, + "Fires off all targets associated with a particular useobject." + ); +Event EV_Player_SetWaterPower + ( + "waterpower", + EV_DEFAULT, + NULL, + NULL, + "Sets the eden water level of the player." + ); +Event EV_Player_WatchActor + ( + "watchactor", + EV_DEFAULT, + "e", + "actor_to_watch", + "Makes the player's camera watch the specified actor." + ); +Event EV_Player_StopWatchingActor + ( + "stopwatchingactor", + EV_DEFAULT, + "e", + "actor_to_stop_watching", + "Makes the player's camera stop watching the specified actor." + ); +Event EV_Player_PutawayWeapon + ( + "putawayweapon", + EV_DEFAULT, + "s", + "whichHand", + "Put away or deactivate the current weapon, whichHand can be left, right or dual." + ); +Event EV_Player_Weapon + ( + "weaponcommand", + EV_DEFAULT, + "sSSSSSSS", + "hand arg1 arg2 arg3 arg4 arg5 arg6 arg7", + "Pass the args to the active weapon in the specified hand" + ); +Event EV_Player_Done + ( + "playerdone", + EV_DEFAULT, + NULL, + NULL, + "Clears the waitForPlayer script command, allowing threads to run" + ); +Event EV_Player_ActivateDualWeapons + ( + "activatedualweapons", + EV_DEFAULT, + NULL, + NULL, + "Activates 2 weapons at once" + ); + +Event EV_Player_StartCoolItem + ( + "startcoolitem", + EV_DEFAULT, + NULL, + NULL, + "Player is starting to show off the cool item" + ); + +Event EV_Player_StopCoolItem + ( + "stopcoolitem", + EV_DEFAULT, + NULL, + NULL, + "Player is starting to show off the cool item" + ); + +Event EV_Player_ShowCoolItem + ( + "showcoolitem", + EV_DEFAULT, + NULL, + NULL, + "Player is showing the cool item, actually display it" + ); + +Event EV_Player_HideCoolItem + ( + "hidecoolitem", + EV_DEFAULT, + NULL, + NULL, + "Player is finished showing the cool item, now hide it" + ); +Event EV_Player_SetDamageMultiplier + ( + "damage_multiplier", + EV_DEFAULT, + "f", + "damage_multiplier", + "Sets the current damage multiplier" + ); +Event EV_Player_WaitForState + ( + "waitForState", + EV_DEFAULT, + "s", + "stateToWaitFor", + "When set, the player will clear waitforplayer when this state is hit\n" + "in the legs or torso." + ); +Event EV_Player_LogStats + ( + "logstats", + EV_CHEAT, + "b", + "state", + "Turn on/off the debugging playlog" + ); +Event EV_Player_TakePain + ( + "takepain", + EV_DEFAULT, + "b", + "bool", + "Set whether or not to take pain" + ); +Event EV_Player_SkipCinematic + ( + "skipcinematic", + EV_CONSOLE, + NULL, + NULL, + "Skip the current cinematic" + ); +Event EV_Player_ResetHaveItem + ( + "resethaveitem", + EV_CONSOLE, + "s", + "weapon_name", + "Resets the game var that keeps track that we have gotten this weapon" + ); + + +/* +============================================================================== + +PLAYER + +============================================================================== +*/ + +CLASS_DECLARATION( Sentient, Player, "player" ) + { + { &EV_ClientMove, ClientThink }, + { &EV_ClientEndFrame, EndFrame }, + { &EV_Vehicle_Enter, EnterVehicle }, + { &EV_Vehicle_Exit, ExitVehicle }, + { &EV_Player_EndLevel, EndLevel }, + { &EV_Player_UseItem, EventUseItem }, + { &EV_Player_GiveCheat, GiveCheat }, + { &EV_Player_GiveWeaponCheat, GiveWeaponCheat }, + { &EV_Player_GiveAllCheat, GiveAllCheat }, + { &EV_Player_DevGodCheat, GodCheat }, + { &EV_Player_DevNoTargetCheat, NoTargetCheat }, + { &EV_Player_DevNoClipCheat, NoclipCheat }, + { &EV_Player_GameVersion, GameVersion }, + { &EV_Player_DumpState, DumpState }, + { &EV_Player_ForceTorsoState, ForceTorsoState }, + { &EV_Player_Fov, Fov }, + { &EV_Kill, Kill }, + { &EV_Player_Dead, Dead }, + { &EV_Player_SpawnEntity, SpawnEntity }, + { &EV_Player_SpawnActor, SpawnActor }, + { &EV_Player_Respawn, Respawn }, + { &EV_Player_DoUse, DoUse }, + { &EV_Pain, Pain }, + { &EV_Killed, Killed }, + { &EV_Gib, GibEvent }, + { &EV_GotKill, GotKill }, + { &EV_Player_TestThread, TestThread }, + { &EV_Player_PowerupTimer, SetPowerupTimer }, + { &EV_Player_UpdatePowerupTimer, UpdatePowerupTimer }, + { &EV_Player_ResetState, ResetState }, + { &EV_Player_WhatIs, WhatIs }, + { &EV_Player_ActorInfo, ActorInfo }, + { &EV_Player_KillEnt, KillEnt }, + { &EV_Player_RemoveEnt, RemoveEnt }, + { &EV_Player_KillClass, KillClass }, + { &EV_Player_RemoveClass, RemoveClass }, + { &EV_Player_AnimLoop_Legs, EndAnim_Legs }, + { &EV_Player_AnimLoop_Torso, EndAnim_Torso }, + { &EV_Player_Jump, Jump }, + { &EV_Sentient_JumpXY, JumpXY }, + { &EV_Player_ActivateNewWeapon, ActivateNewWeapon }, + { &EV_Player_DeactivateWeapon, DeactivateWeapon }, + { &EV_Player_SwordAttack, SwordAttackEvent }, + { &EV_Player_SwipeOn, SwipeOn }, + { &EV_Player_SwipeOff, SwipeOff }, + { &EV_Player_SetHeadTarget, SetHeadTarget }, + { &EV_Player_ChangeOutfit, ChangeOutfit }, + { &EV_Player_ListInventory, ListInventoryEvent }, + { &EV_Player_PickupShgliek, PickupShgliek }, + { &EV_Player_ThrowShgliek, ThrowShgliek }, + { &EV_Player_ClearLeftArmTarget, ClearLeftArmTarget }, + { &EV_Player_ClearRightArmTarget, ClearRightArmTarget }, + { &EV_Player_ActivateShield, ActivateShield }, + { &EV_Player_DeactivateShield, DeactivateShield }, + { &EV_Player_AdjustTorso, AdjustTorso }, + { &EV_Player_DualWield, DualWield }, + { &EV_Player_UseDualWield, UseDualWield }, + { &EV_Player_EvaluateTorsoAnim, EvaluateTorsoAnim }, + { &EV_Player_NextPainTime, NextPainTime }, + { &EV_Player_StepUp, StepUp }, + { &EV_Player_Turn, Turn }, + { &EV_Player_TurnUpdate, TurnUpdate }, + { &EV_Player_TurnLegs, TurnLegs }, + { &EV_Player_FinishUseAnim, FinishUseAnim }, + { &EV_Sentient_SetMouthAngle, SetMouthAngle }, + { &EV_Player_Holster, HolsterToggle }, + { &EV_Player_SafeHolster, Holster }, + { &EV_Player_StartUseObject, StartUseObject }, + { &EV_Player_FinishUseObject, FinishUseObject }, + { &EV_Player_SetWaterPower, SetWaterPower }, + { &EV_Player_WatchActor, WatchActor }, + { &EV_Player_StopWatchingActor, StopWatchingActor }, + { &EV_Player_PutawayWeapon, PutawayWeapon }, + { &EV_Player_Weapon, WeaponCommand }, + { &EV_Player_Done, PlayerDone }, + { &EV_Player_ActivateDualWeapons, ActivateDualWeapons }, + { &EV_Player_StartCoolItem, StartCoolItem }, + { &EV_Player_StopCoolItem, StopCoolItem }, + { &EV_Player_ShowCoolItem, ShowCoolItem }, + { &EV_Player_HideCoolItem, HideCoolItem }, + { &EV_Player_SetDamageMultiplier, SetDamageMultiplier }, + { &EV_Player_WaitForState, WaitForState }, + { &EV_Player_LogStats, LogStats }, + { &EV_Player_TakePain, SetTakePain }, + { &EV_Player_SkipCinematic, SkipCinematic }, + { &EV_Player_ResetHaveItem, ResetHaveItem }, + { &EV_Show, PlayerShowModel }, + { NULL, NULL } + }; + +qboolean Player::checkturnleft + ( + Conditional &condition + ) + + { + float yaw; + + yaw = SHORT2ANGLE( last_ucmd.angles[ YAW ] + client->ps.delta_angles[ YAW ] ); + + return ( angledist( old_v_angle[ YAW ] - yaw ) < -8.0f ); + } + +qboolean Player::checkturnright + ( + Conditional &condition + ) + + { + float yaw; + + yaw = SHORT2ANGLE( last_ucmd.angles[ YAW ] + client->ps.delta_angles[ YAW ] ); + + return ( angledist( old_v_angle[ YAW ] - yaw ) > 8.0f ); + } + +qboolean Player::checkforward + ( + Conditional &condition + ) + + { + return last_ucmd.forwardmove > 0; + } + +qboolean Player::checkbackward + ( + Conditional &condition + ) + + { + return last_ucmd.forwardmove < 0; + } + +qboolean Player::checkstrafeleft + ( + Conditional &condition + ) + + { + return last_ucmd.rightmove < 0; + } + +qboolean Player::checkstraferight + ( + Conditional &condition + ) + + { + return last_ucmd.rightmove > 0; + } + +qboolean Player::checkrise + ( + Conditional &condition + ) + + { + if ( ( do_rise ) && ( velocity.z > 32 ) ) + { + return true; + } + do_rise = qfalse; + + return false; + } + +qboolean Player::checkjump + ( + Conditional &condition + ) + + { + return last_ucmd.upmove > 0; + } + +qboolean Player::checkcrouch + ( + Conditional &condition + ) + + { + // If the crouch_flag is set, then return true and clear the flag + if ( crouch_flag ) + { + crouch_flag = false; + return true; + } + else if ( last_ucmd.upmove < 0 ) // check for downward movement + { + if ( client->ps.walking ) + { + // Player has a weapon, so we can't crouch yet + // and we must putaway the weapons first. The crouch_flag is + // set so we can allow the state machine to crouch after + // the weapons have been put away + if ( WeaponsOut() ) + { + SafeHolster( qtrue ); + crouch_flag = true; + return false; + } + else // no weapons + { + return true; + } + } + else // No weapons out, or not on the ground, and moving down + { + return true; + } + } + + return false; + } + +qboolean Player::checkjumpflip + ( + Conditional &condition + ) + + { + return velocity.z < ( sv_gravity->value * 0.5f ); + } + +qboolean Player::checkanimdone_legs + ( + Conditional &condition + ) + + { + return animdone_Legs; + } + +qboolean Player::checkanimdone_torso + ( + Conditional &condition + ) + + { + return animdone_Torso; + } + + +qboolean Player::checkattackleft + ( + Conditional &condition + ) + + { + if ( level.playerfrozen || ( flags & FL_IMMOBILE ) ) + { + return false; + } + + if ( last_ucmd.buttons & BUTTON_ATTACKLEFT ) + { + Weapon *weapon; + + last_attack_button = BUTTON_ATTACKLEFT; + + weapon = GetActiveWeapon( WEAPON_LEFT ); + if ( weapon ) + { + return true; + } + + weapon = GetActiveWeapon( WEAPON_RIGHT ); + if ( weapon ) + { + return true; + } + + weapon = GetActiveWeapon( WEAPON_DUAL ); + if ( weapon ) + { + return true; + } + + // No ammo + return false; + } + else + { + return false; + } + } + +qboolean Player::checkattackbuttonleft + ( + Conditional &condition + ) + + { + if ( level.playerfrozen || ( flags & FL_IMMOBILE ) ) + { + return false; + } + + return ( last_ucmd.buttons & BUTTON_ATTACKLEFT ); + } + + +qboolean Player::checkattackright + ( + Conditional &condition + ) + + { + if ( level.playerfrozen || ( flags & FL_IMMOBILE ) ) + { + return false; + } + + if ( last_ucmd.buttons & BUTTON_ATTACKRIGHT ) + { + Weapon *weapon; + + last_attack_button = BUTTON_ATTACKRIGHT; + + weapon = GetActiveWeapon( WEAPON_RIGHT ); + if ( weapon ) + { + return true; + } + + weapon = GetActiveWeapon( WEAPON_LEFT ); + if ( weapon ) + { + return true; + } + + weapon = GetActiveWeapon( WEAPON_DUAL ); + if ( weapon ) + { + return true; + } + + // No ammo + return false; + } + else + { + return false; + } + } + +qboolean Player::checkattackbuttonright + ( + Conditional &condition + ) + + { + if ( level.playerfrozen || ( flags & FL_IMMOBILE ) ) + { + return false; + } + + return ( last_ucmd.buttons & BUTTON_ATTACKRIGHT ); + } + +qboolean Player::checksneak + ( + Conditional &condition + ) + + { + return ( last_ucmd.buttons & BUTTON_SNEAK ) != 0; + } + +qboolean Player::checkrun + ( + Conditional &condition + ) + + { + return ( last_ucmd.buttons & BUTTON_RUN ) != 0; + } + +qboolean Player::checkwasrunning + ( + Conditional &condition + ) + + { + return ( pm_lastruntime > MINIMUM_RUNNING_TIME ); + } + +qboolean Player::checkholsterweapon + ( + Conditional &condition + ) + + { + return ( last_ucmd.buttons & BUTTON_HOLSTERWEAPON ) != 0; + } + +qboolean Player::checkuse + ( + Conditional &condition + ) + + { + return ( last_ucmd.buttons & BUTTON_USE ) != 0; + } + +qboolean Player::checkcanmoveleft + ( + Conditional &condition + ) + + { + if ( condition.numParms() ) + { + return move_left_dist >= atof( condition.getParm( 1 ) ); + } + + return move_left_dist > 1.0f; + } + +qboolean Player::checkcanturn + ( + Conditional &condition + ) + + { + float yaw; + Vector oldang( v_angle ); + qboolean result; + + yaw = atof( condition.getParm( 1 ) ); + + v_angle[ YAW ] = ( int )( anglemod( v_angle[ YAW ] + yaw ) / 22.5f ) * 22.5f; + SetViewAngles( v_angle ); + + result = CheckMove( vec_zero ); + + SetViewAngles( oldang ); + + return result; + } + +qboolean Player::checkcanmoveright + ( + Conditional &condition + ) + + { + if ( condition.numParms() ) + { + return move_right_dist >= atof( condition.getParm( 1 ) ); + } + + return move_right_dist > 1.0f; + } + +qboolean Player::checkcanmovebackward + ( + Conditional &condition + ) + + { + if ( condition.numParms() ) + { + return move_backward_dist >= atof( condition.getParm( 1 ) ); + } + + return move_backward_dist > 1.0f; + } + +qboolean Player::checkcanmoveforward + ( + Conditional &condition + ) + + { + if ( condition.numParms() ) + { + return move_forward_dist >= atof( condition.getParm( 1 ) ); + } + + return move_forward_dist > 1.0f; + } + +qboolean Player::checkcanwallhug + ( + Conditional &condition + ) + + { + trace_t trace; + Vector start( origin.x, origin.y, origin.z + 4 ); + Vector end( start - yaw_forward * 15.0f ); + + while( end.z < absmax.z - 4.0f ) + { + trace = G_Trace( start, min_box_8x8, max_box_8x8, end, this, MASK_DEADSOLID, true, "checkcanwallhug" ); + if ( ( trace.fraction == 1.0f ) || ( trace.ent->entity->getSolidType() != SOLID_BSP ) ) + { + return false; + } + + start.z += 16.0f; + end.z += 16.0f; + } + + return true; + } + +qboolean Player::checkblocked + ( + Conditional &condition + ) + + { + int test_moveresult; + + test_moveresult = moveresult; + + if ( flags & FL_IMMOBILE ) + test_moveresult = MOVERESULT_BLOCKED; + + if ( condition.numParms() ) + { + return test_moveresult >= atoi( condition.getParm( 1 ) ); + } + + return test_moveresult >= MOVERESULT_BLOCKED; + } + +qboolean Player::checkhangatwall + ( + Conditional &condition + ) + + { + trace_t trace; + + Vector end( centroid + yaw_forward * 16.0f ); + + trace = G_Trace( centroid, Vector( mins.x, mins.y, -8 ), Vector( maxs.x, maxs.y, 8 ), + end, this, MASK_DEADSOLID, true, "Player::checkhangatwall" ); + return ( trace.fraction < 0.7f ); + } + +qboolean Player::checkcanhang + ( + Conditional &condition + ) + + { + trace_t trace; + + Vector end( origin + yaw_forward * 16.0f ); + + trace = G_Trace( origin, mins, maxs, end, this, MASK_DEADSOLID, true, "Player::checkcanhang" ); + if ( trace.ent && trace.ent->entity ) + { + if ( + ( trace.ent->entity->velocity.length() ) || + ( trace.ent->entity->avelocity.length() ) + ) + { + return qfalse; + } + } + + if ( ledgeheight_right == MIN_Z ) + return qfalse; + + if ( ledgeheight_left == MIN_Z ) + return qfalse; + + if ( !trace.ent ) + return qfalse; + + return qtrue; + } + + +qboolean Player::checkcanhangleft + ( + Conditional &condition + ) + + { + trace_t trace; + + Vector move( origin.x + 26 * yaw_left.x, origin.y + 26 * yaw_left.y, origin.z ); + + trace = G_Trace( origin, mins, maxs, move, this, MASK_DEADSOLID, true, "Player::checkcanhangleft" ); + if ( trace.fraction < 1.0f ) + { + return false; + } + + Vector lefthand( lefthand_pos + move - origin ); + Vector end( lefthand + yaw_forward * 8.0f ); + + lefthand.z -= 4; + end.z -= 4; + + trace = G_Trace( lefthand, vec_zero, vec_zero, end, this, MASK_DEADSOLID, true, "Player::checkcanhangleft" ); + return ( trace.startsolid ) || ( trace.fraction < 1.0f ); + } + +qboolean Player::checkcanhangright + ( + Conditional &condition + ) + + { + trace_t trace; + + Vector move( origin.x - 26 * yaw_left.x, origin.y - 26 * yaw_left.y, origin.z ); + + trace = G_Trace( origin, mins, maxs, move, this, MASK_DEADSOLID, true, "Player::checkcanhangright" ); + if ( trace.fraction < 1.0f ) + { + return false; + } + + Vector righthand( righthand_pos + move - origin ); + Vector end( righthand + yaw_forward * 8.0f ); + + righthand.z -= 4; + end.z -= 4; + + trace = G_Trace( righthand, vec_zero, vec_zero, end, this, MASK_DEADSOLID, true, "Player::checkcanhangright" ); + return ( trace.startsolid ) || ( trace.fraction < 1.0f ); + } + +qboolean Player::checktouchrope + ( + Conditional &condition + ) + + { + return ( rope_touch != NULL ); + } + +qboolean Player::checkonrope + ( + Conditional &condition + ) + + { + return ( rope_grabbed != NULL ); + } + +qboolean Player::checkcanclimbrope + ( + Conditional &condition + ) + + { + if ( rope_grabbed ) + { + return ( rope_grabbed->CanClimb( atof( condition.getParm( 1 ) ) ) ); + } + return false; + } + +qboolean Player::checkonground + ( + Conditional &condition + ) + + { + return client->ps.walking; + } + +qboolean Player::check22degreeslope + ( + Conditional &condition + ) + + { + if ( client->ps.walking && client->ps.groundPlane && ( client->ps.groundTrace.plane.normal[ 2 ] < SLOPE_22_MAX ) && + ( client->ps.groundTrace.plane.normal[ 2 ] >= SLOPE_22_MIN ) ) + { + return qtrue; + } + + return qfalse; + } + +qboolean Player::check45degreeslope + ( + Conditional &condition + ) + + { + if ( client->ps.walking && client->ps.groundPlane && ( client->ps.groundTrace.plane.normal[ 2 ] < SLOPE_45_MAX ) && + ( client->ps.groundTrace.plane.normal[ 2 ] >= SLOPE_45_MIN ) ) + { + return qtrue; + } + + return qfalse; + } + +qboolean Player::checkrightleghigh + ( + Conditional &condition + ) + + { + float groundyaw; + float yawdelta; + int which; + + groundyaw = ( int )vectoyaw( client->ps.groundTrace.plane.normal ); + yawdelta = anglemod( v_angle.y - groundyaw ); + which = ( ( int )yawdelta + 45 ) / 90; + + return ( which == 3 ); + } + +qboolean Player::checkleftleghigh + ( + Conditional &condition + ) + + { + float groundyaw; + float yawdelta; + int which; + + groundyaw = ( int )vectoyaw( client->ps.groundTrace.plane.normal ); + yawdelta = anglemod( v_angle.y - groundyaw ); + which = ( ( int )yawdelta + 45 ) / 90; + + return ( which == 1 ); + } + +qboolean Player::checkfacingupslope + ( + Conditional &condition + ) + + { + float groundyaw; + float yawdelta; + int which; + + groundyaw = ( int )vectoyaw( client->ps.groundTrace.plane.normal ); + yawdelta = anglemod( v_angle.y - groundyaw ); + which = ( ( int )yawdelta + 45 ) / 90; + + return ( which == 2 ); + } + +qboolean Player::checkfacingdownslope + ( + Conditional &condition + ) + + { + float groundyaw; + float yawdelta; + int which; + + groundyaw = ( int )vectoyaw( client->ps.groundTrace.plane.normal ); + yawdelta = anglemod( v_angle.y - groundyaw ); + which = ( ( int )yawdelta + 45 ) / 90; + + return ( ( which == 0 ) || ( which == 4 ) ); + } + +qboolean Player::checkfalling + ( + Conditional &condition + ) + + { + return falling; + } + +qboolean Player::checkgroundentity + ( + Conditional &condition + ) + + { + return ( groundentity != NULL ); + } + +qboolean Player::checkhardimpact + ( + Conditional &condition + ) + + { + return hardimpact; + } + +qboolean Player::checkcanfall + ( + Conditional &condition + ) + + { + return canfall; + } + +qboolean Player::checkatdoor + ( + Conditional &condition + ) + + { + // Check if the player is at a door + return ( atobject && atobject->isSubclassOf( Door ) ); + } + +qboolean Player::checkatshgliek + ( + Conditional &condition + ) + + { + Vector start; + Vector end; + trace_t trace; + + // See if there are any Shglieks in front of us + + start = origin + Vector( 0, 0, 32 ); + end = start + yaw_forward * 64.0f; + trace = G_Trace( start, mins, maxs, end, this, MASK_PLAYERSOLID, true, "checkatshgliek" ); + + if ( trace.ent && trace.ent->entity && ( trace.ent->entity != world ) && trace.ent->entity->isSubclassOf( Actor ) ) + { + Actor *act = (Actor *)trace.ent->entity; + + if ( act->name == "Shgliek" ) + return true; + } + + return false; + } + +qboolean Player::checkhaveshgliek + ( + Conditional &condition + ) + + { + return have_shgliek; + } + +qboolean Player::checkshgliekdead + ( + Conditional &condition + ) + + { + int i; + Entity *child; + Actor *act; + + + for ( i=0; i < MAX_MODEL_CHILDREN; i++ ) + { + if ( children[i] == ENTITYNUM_NONE ) + { + continue; + } + + child = ( Entity * )G_GetEntity( children[i] ); + + if ( child->isSubclassOf( Actor ) ) + { + act = (Actor *)child; + + if ( ( act->name == "Partially Evil Shgliek" ) || ( act->name == "Evil Shgliek" ) ) + return true; + + if ( act->name == "Shgliek" ) + { + if ( act->deadflag ) + return true; + else + return false; + } + } + } + + return true; + } + +qboolean Player::checkatuseanim + ( + Conditional &condition + ) + + { + // Check if the player is at a useanim + if ( atobject && atobject->isSubclassOf( UseAnim ) ) + { + return ( ( UseAnim * )( Entity * )atobject )->canBeUsed( this ); + } + + return false; + } + +qboolean Player::checktouchuseanim + ( + Conditional &condition + ) + + { + if ( toucheduseanim ) + { + return ( ( UseAnim * )( Entity * )toucheduseanim )->canBeUsed( this ); + } + + return qfalse; + } + +qboolean Player::checkuseanimfinished + ( + Conditional &condition + ) + + { + return ( useanim_numloops <= 0 ); + } + +qboolean Player::checkatuseobject + ( + Conditional &condition + ) + + { + // Check if the player is at a useanim + if ( atobject && atobject->isSubclassOf( UseObject ) ) + { + return ( ( UseObject * )( Entity * )atobject )->canBeUsed( origin, yaw_forward ); + } + + return false; + } + +qboolean Player::checkloopuseobject + ( + Conditional &condition + ) + + { + // Check if the player is at a useanim + if ( useitem_in_use && useitem_in_use->isSubclassOf( UseObject ) ) + { + return ( ( UseObject * )( Entity * )useitem_in_use )->Loop(); + } + + return false; + } + +qboolean Player::checkcangrabledge + ( + Conditional &condition + ) + + { + float old_hang_pullup_distance; + float hang_pullup_distance; + float deltaleft; + float deltaright; + bool hangleft; + bool hangright; + + if ( ( ledgeheight_left <= MIN_Z ) || ( ledgeheight_right <= MIN_Z ) ) + { + return false; + } + + if ( groundentity ) + { + deltaleft = ledgeheight_left - origin.z - 128.0f; + deltaright = ledgeheight_right - origin.z - 128.0f; + + return ( Q_fabs( deltaleft ) < 1.1f ) && ( Q_fabs( deltaright ) < 1.1f ); + } + +#define WALL_FUDGE_FACTOR 5 + hang_pullup_distance = lefthand_pos.z; + old_hang_pullup_distance = hang_pullup_distance - origin.z + oldorigin.z; + if ( hang_pullup_distance > old_hang_pullup_distance ) + { + hangleft = ( hang_pullup_distance >= ledgeheight_left ) && ( ledgeheight_left+WALL_FUDGE_FACTOR >= old_hang_pullup_distance ); + } + else + { + hangleft = ( old_hang_pullup_distance >= ledgeheight_left ) && ( ledgeheight_left+WALL_FUDGE_FACTOR >= hang_pullup_distance ); + } + + hang_pullup_distance = righthand_pos.z; + old_hang_pullup_distance = hang_pullup_distance - origin.z + oldorigin.z; + if ( hang_pullup_distance > old_hang_pullup_distance ) + { + hangright = ( hang_pullup_distance >= ledgeheight_right ) && ( ledgeheight_right+WALL_FUDGE_FACTOR >= old_hang_pullup_distance ); + } + else + { + hangright = ( old_hang_pullup_distance >= ledgeheight_right ) && ( ledgeheight_right+WALL_FUDGE_FACTOR >= hang_pullup_distance ); + } + + return hangleft && hangright; + } + +qboolean Player::checkledgeheight + ( + Conditional &condition + ) + + { + float deltaleft; + float deltaright; + float minclimbheight; + float maxclimbheight; + + if ( ( ledgeheight_left <= MIN_Z ) || ( ledgeheight_right <= MIN_Z ) ) + { + return false; + } + + if ( condition.numParms() != 2 ) + { + error( "checkledgeheight", "CAN_CLIMB requires 2 parameters.\n" ); + } + + minclimbheight = atof( condition.getParm( 1 ) ); + maxclimbheight = atof( condition.getParm( 2 ) ); + + deltaleft = Q_fabs( ledgeheight_left - origin.z ); + deltaright = Q_fabs( ledgeheight_right - origin.z ); + + if ( Q_fabs( deltaright - deltaleft ) < 1.1f ) + { + deltaright = max( deltaleft, deltaright ); + deltaleft = deltaright; + } + + return ( deltaleft > minclimbheight ) && ( deltaleft <= maxclimbheight ) && + ( deltaright > minclimbheight ) && ( deltaright <= maxclimbheight ); + } + +qboolean Player::checkcangrabpipe + ( + Conditional &condition + ) + + { + return horizontalpipe != NULL; + } + +qboolean Player::checkcangrabmonkeybar + ( + Conditional &condition + ) + + { + float old_hang_pullup_distance; + float hang_pullup_distance; + float deltaleft; + float deltaright; + bool hangleft; + bool hangright; + + if ( ( monkeybar_left <= MIN_Z ) || ( monkeybar_right <= MIN_Z ) ) + { + return false; + } + + if ( groundentity ) + { + deltaleft = monkeybar_left - origin.z - 128.0f; + deltaright = monkeybar_right - origin.z - 128.0f; + + return ( Q_fabs( deltaleft ) < 1.0f ) && ( Q_fabs( deltaright ) < 1.0f ); + } + + hang_pullup_distance = lefthand_pos.z; + old_hang_pullup_distance = hang_pullup_distance - origin.z + oldorigin.z; + if ( hang_pullup_distance > old_hang_pullup_distance ) + { + hangleft = ( hang_pullup_distance >= monkeybar_left ) && ( monkeybar_left >= old_hang_pullup_distance ); + } + else + { + hangleft = ( old_hang_pullup_distance >= monkeybar_left ) && ( monkeybar_left >= hang_pullup_distance ); + } + + hang_pullup_distance = righthand_pos.z; + old_hang_pullup_distance = hang_pullup_distance - origin.z + oldorigin.z; + if ( hang_pullup_distance > old_hang_pullup_distance ) + { + hangright = ( hang_pullup_distance >= monkeybar_right ) && ( monkeybar_right >= old_hang_pullup_distance ); + } + else + { + hangright = ( old_hang_pullup_distance >= monkeybar_right ) && ( monkeybar_right >= hang_pullup_distance ); + } + + return hangleft && hangright; + } + +qboolean Player::checkcanpullup + ( + Conditional &condition + ) + + { + trace_t trace; + + Vector start( origin.x, origin.y, max( ledgeheight_left, ledgeheight_right ) ); + Vector end( start + yaw_forward * 16.0f ); + + trace = G_Trace( origin, mins, maxs, start, this, MASK_DEADSOLID, true, "Player::checkcanpullup" ); + if ( trace.fraction < 1.0f ) + { + return false; + } + + trace = G_Trace( start, mins, maxs, end, this, MASK_DEADSOLID, true, "Player::checkcanpullup" ); + return trace.fraction == 1.0f; + } + +qboolean Player::checkdead + ( + Conditional &condition + ) + + { + return ( deadflag ); + } + +qboolean Player::checkhealth + ( + Conditional &condition + ) + + { + return health < atoi( condition.getParm( 1 ) ); + } + +qboolean Player::checkpain + ( + Conditional &condition + ) + + { + return ( pain != 0 || knockdown != 0 ); + } + +qboolean Player::checkknockdown + ( + Conditional &condition + ) + + { + if ( knockdown ) + { + knockdown = false; + return true; + } + else + { + return false; + } + } + +qboolean Player::checkpaintype + ( + Conditional &condition + ) + + { + if ( pain_type == MOD_string_to_int( condition.getParm( 1 ) ) ) + { + return qtrue; + } + else + { + return qfalse; + } + } + +qboolean Player::checkpaindirection + ( + Conditional &condition + ) + + { + if ( pain_dir == Pain_string_to_int( condition.getParm( 1 ) ) ) + { + return qtrue; + } + else + { + return qfalse; + } + } + +qboolean Player::checkaccumulatedpain + ( + Conditional &condition + ) + + { + float threshold = atof( condition.getParm( 1 ) ); + + if ( accumulated_pain >= threshold ) + { + accumulated_pain = 0; // zero out accumulation + return true; + } + else + { + return false; + } + } + +qboolean Player::checkpainthreshold + ( + Conditional &condition + ) + + { + float threshold = atof( condition.getParm( 1 ) ); + + if ( ( pain >= threshold ) && ( level.time > nextpaintime ) ) + { + accumulated_pain = 0; // zero out accumulation since we are going into a pain anim right now + return true; + } + else + { + return false; + } + } + +qboolean Player::checklegsstate + ( + Conditional &condition + ) + + { + if ( currentState_Legs ) + { + str current = currentState_Legs->getName(); + str compare = condition.getParm( 1 ); + + if ( current == compare ) + { + return true; + } + } + + return false; + } + +qboolean Player::checktorsostate + ( + Conditional &condition + ) + + { + if ( currentState_Torso ) + { + str current = currentState_Torso->getName(); + str compare = condition.getParm( 1 ); + + if ( current == compare ) + { + return true; + } + } + + return false; + } + +qboolean Player::checkhasweapon + ( + Conditional &condition + ) + + { + return WeaponsOut(); + } + +qboolean Player::checknewweapon + ( + Conditional &condition + ) + + { + Weapon * weapon; + + weapon = GetNewActiveWeapon(); + + if ( weapon ) + return true; + else + return false; + } + +// Check to see if a weapon has been raised +qboolean Player::checkuseweapon + ( + Conditional &condition + ) + + { + const char *weaponName; + const char *parm; + + weaponhand_t hand; + Weapon *weap; + + weap = GetNewActiveWeapon(); + parm = condition.getParm( 1 ); + + if ( !str::icmp( parm, "ERROR" ) ) + { + if ( weap ) + warning( "Player::checkuseweapon", "%s does not have a valid RAISE_WEAPON state\n", weap->item_name ); + else + warning( "Player::checkuseweapon", "New Active weapon does not exist\n" ); + + ClearNewActiveWeapon(); + return qtrue; + } + + hand = WeaponHandNameToNum( parm ); + + if ( hand == WEAPON_ERROR ) + return false; + + weaponName = condition.getParm( 2 ); + + if ( + ( weap != NULL ) && + ( GetNewActiveWeaponHand() == hand ) && + ( !stricmp( weap->item_name, weaponName ) ) + ) + { + return true; + } + else + { + return false; + } + } + +// Checks to see if any weapon is active in the specified hand +qboolean Player::checkanyweaponactive + ( + Conditional &condition + ) + + { + weaponhand_t hand; + Weapon *weap; + + hand = WeaponHandNameToNum( condition.getParm( 1 ) ); + + if ( hand == WEAPON_ERROR ) + return false; + + weap = GetActiveWeapon( hand ); + return ( weap != NULL ); + } + +// Checks to see if any weapon is active in the specified hand +qboolean Player::checkweaponhasammo + ( + Conditional &condition + ) + + { + weaponhand_t hand; + Weapon *weap; + firemode_t mode = FIRE_PRIMARY; + + hand = WeaponHandNameToNum( condition.getParm( 1 ) ); + + if ( condition.numParms() > 1 ) + mode = WeaponModeNameToNum( condition.getParm( 2 ) ); + + if ( hand == WEAPON_ERROR ) + return false; + + weap = GetActiveWeapon( hand ); + + if ( !weap ) + return false; + else + return ( weap->HasAmmo( mode ) ); + } + +qboolean Player::checkmuzzleclear + ( + Conditional &condition + ) + + { + weaponhand_t hand; + + hand = WeaponHandNameToNum( condition.getParm( 1 ) ); + + if ( hand == WEAPON_ERROR ) + return false; + + Weapon *weapon = GetActiveWeapon( hand ); + return ( weapon && weapon->MuzzleClear() ); + } + +// Checks to see if weapon is active +qboolean Player::checkweaponactive + ( + Conditional &condition + ) + + { + const char *weaponName; + weaponhand_t hand; + + weaponName = condition.getParm( 2 ); + hand = WeaponHandNameToNum( condition.getParm( 1 ) ); + + if ( hand == WEAPON_ERROR ) + return false; + + Weapon *weapon = GetActiveWeapon( hand ); + + return ( weapon && !strcmp( weaponName, weapon->item_name ) ); + } + +qboolean Player::checkdualweaponreadytofire + ( + Conditional &condition + ) + + { + firemode_t mode = FIRE_PRIMARY; + str weaponName="None"; + Weapon *weapon = GetActiveWeapon( WEAPON_DUAL ); + qboolean ready; + + mode = WeaponModeNameToNum( condition.getParm( 1 ) ); + + if ( condition.numParms() > 1 ) + weaponName = condition.getParm( 2 ); + + // Weapon there check + if ( !weapon ) + return qfalse; + + // Name check + if ( condition.numParms() > 1 ) + { + if ( strcmp( weaponName, weapon->item_name ) ) + { + return qfalse; + } + } + + // Ammo check + ready = weapon->ReadyToFire( mode ); + return( ready ); + } + +// Checks to see if weapon is active and ready to fire +qboolean Player::checkweaponreadytofire + ( + Conditional &condition + ) + + { + firemode_t mode = FIRE_PRIMARY; + str weaponName="None"; + weaponhand_t hand; + qboolean ready; + + if ( level.playerfrozen || ( flags & FL_IMMOBILE ) ) + { + return false; + } + + hand = WeaponHandNameToNum( condition.getParm( 1 ) ); + + if ( hand == WEAPON_DUAL ) + { + gi.DPrintf( "This check should only be used for single handed weapons\n" ); + return false; + } + + if ( condition.numParms() > 1 ) + weaponName = condition.getParm( 2 ); + + if ( hand == WEAPON_ERROR ) + return false; + + Weapon *weapon = GetActiveWeapon( hand ); + + // Weapon there check + if ( !weapon ) + return qfalse; + + // Name check + if ( condition.numParms() > 1 ) + { + if ( strcmp( weaponName, weapon->item_name ) ) + { + return qfalse; + } + } + + // Ammo check + ready = weapon->ReadyToFire( mode ); + return( ready ); + } + +qboolean Player::checkweaponreadytofire_nosound + ( + Conditional &condition + ) + + { + firemode_t mode = FIRE_PRIMARY; + str weaponName="None"; + weaponhand_t hand; + qboolean ready; + + if ( level.playerfrozen || ( flags & FL_IMMOBILE ) ) + { + return false; + } + + hand = WeaponHandNameToNum( condition.getParm( 1 ) ); + + if ( hand == WEAPON_DUAL ) + { + gi.DPrintf( "This check should only be used for single handed weapons\n" ); + return false; + } + + if ( condition.numParms() > 1 ) + weaponName = condition.getParm( 2 ); + + if ( hand == WEAPON_ERROR ) + return false; + + Weapon *weapon = GetActiveWeapon( hand ); + + // Weapon there check + if ( !weapon ) + return qfalse; + + // Name check + if ( condition.numParms() > 1 ) + { + if ( strcmp( weaponName, weapon->item_name ) ) + { + return qfalse; + } + } + + // Ammo check + ready = weapon->ReadyToFire( mode, qfalse ); + return( ready ); + } + +// Check to see if any of the active weapons need to be put away +qboolean Player::checkputawayleft + ( + Conditional &condition + ) + + { + Weapon *weapon = GetActiveWeapon( WEAPON_LEFT ); + + return weapon && weapon->GetPutaway(); + } + +qboolean Player::checkputawayright + ( + Conditional &condition + ) + + { + Weapon *weapon = GetActiveWeapon( WEAPON_RIGHT ); + + return weapon && weapon->GetPutaway(); + } + +qboolean Player::checkputawayboth + ( + Conditional &condition + ) + + { + Weapon *weapon = GetActiveWeapon( WEAPON_DUAL ); + + return weapon && weapon->GetPutaway(); + } + +qboolean Player::checktargetacquired + ( + Conditional &condition + ) + + { + str side = condition.getParm( 1 ); + + if ( !side.icmp( "left" ) ) + { + return ( left_arm_target != NULL ); + } + else if ( !side.icmp( "right" ) ) + { + return ( right_arm_target != NULL ); + } + else if ( !side.icmp( "both" ) ) + { + return ( ( left_arm_target != NULL ) && ( right_arm_target != NULL ) ); + } + else if ( !side.icmp( "any" ) ) + { + return ( ( left_arm_target != NULL ) || ( right_arm_target != NULL ) ); + } + else + { + return false; + } + } + +qboolean Player::returntrue + ( + Conditional &condition + ) + + { + return true; + } + +qboolean Player::checkstatename + ( + Conditional &condition + ) + + { + str part = condition.getParm( 1 ); + str statename = condition.getParm( 2 ); + + if ( currentState_Legs && !part.icmp( "legs" ) ) + { + return ( !statename.icmpn( currentState_Legs->getName(), statename.length() ) ); + } + else if ( !part.icmp( "torso" ) ) + { + return ( !statename.icmpn( currentState_Torso->getName(), statename.length() ) ); + } + + return false; + } + +qboolean Player::checkattackblocked + ( + Conditional &condition + ) + + { + if ( attack_blocked ) + { + attack_blocked = qfalse; + return true; + } + else + { + return false; + } + } + +qboolean Player::checkblockdelay + ( + Conditional &condition + ) + + { + float t = atof ( condition.getParm( 1 ) ); + return ( level.time > ( attack_blocked_time + t ) ); + } + +qboolean Player::checkpush + ( + Conditional &condition + ) + + { + // Check if the player is at a pushobject + if ( atobject && atobject->isSubclassOf( PushObject ) && ( atobject_dist < ( PUSH_OBJECT_DISTANCE + 15.0f ) ) ) + { + Vector dir; + + dir = atobject_dir * 8.0f; + return ( ( PushObject * )( Entity * )atobject )->canPush( dir ); + } + + return qfalse; + } + +qboolean Player::checkpull + ( + Conditional &condition + ) + + { + // Check if the player is at a pushobject + if ( atobject && atobject->isSubclassOf( PushObject ) && ( atobject_dist < ( PUSH_OBJECT_DISTANCE + 15.0f ) ) ) + { + Vector dir; + + dir = atobject_dir * -64.0f; + return ( ( PushObject * )( Entity * )atobject )->canPush( dir ); + } + + return qfalse; + } + +#define LADDER_HAND_HEIGHT ( MAXS_X - MINS_X ) + +qboolean Player::checkladder + ( + Conditional &condition + ) + + { + trace_t trace; + float hands_fraction; + Vector newmins; + Vector end( origin + yaw_forward * 20.0f ); + + // the bounding box is made skinnier to account for the hands + newmins = mins; + newmins.z = MAXS_Z - LADDER_HAND_HEIGHT; + + trace = G_Trace( origin, newmins, maxs, end, this, MASK_SOLID, true, "checkladder" ); + if ( ( trace.fraction == 1.0f ) || !( trace.surfaceFlags & SURF_LADDER ) ) + { + return qfalse; + } + hands_fraction = trace.fraction; + + // check for the body + trace = G_Trace( origin, mins, maxs, end, this, MASK_SOLID, true, "checkladder" ); + + // if our body does not go as far as our hands, we aren't at a ladder + if ( trace.fraction < hands_fraction ) + { + return qfalse; + } + + return qtrue; + } + +qboolean Player::checkcanclimbladder + ( + Conditional &condition + ) + + { + trace_t trace; + Vector newmins; + Vector vec; + Vector start( origin ); + int i; + + for ( i = 0; i < 3; i++ ) + { + vec[ i ] = atof ( condition.getParm( i + 1 ) ); + } + start += vec[ 0 ] * yaw_forward; + start += vec[ 1 ] * yaw_left; + start.z += vec[ 2 ]; + + Vector end( start + yaw_forward * 20.0f ); + + // check the normal bounding box first and trace to that position + trace = G_Trace( origin, mins, maxs, start, this, MASK_SOLID, true, "checkcanclimbladder" ); + if ( ( trace.fraction != 1.0f ) || ( trace.startsolid ) || ( trace.allsolid ) ) + { + return qfalse; + } + + // the bounding box is made skinnier to account for the hands + newmins = mins; + newmins.z = MAXS_Z - LADDER_HAND_HEIGHT; + + trace = G_Trace( start, newmins, maxs, end, this, MASK_SOLID, true, "checkcanclimbladder" ); + if ( ( trace.fraction == 1.0f ) || !( trace.surfaceFlags & SURF_LADDER ) ) + { + return qfalse; + } + + return qtrue; + } + + +qboolean Player::checkfeetatladder + ( + Conditional &condition + ) + + { + trace_t trace; + Vector newmins, newmaxs; + Vector end( origin + yaw_forward * 20.0f ); + + // the bounding box is made skinnier to account for the feet + newmaxs.x = MAXS_X / 2; + newmaxs.y = MAXS_Y / 2; + // just underneath the feet + newmaxs.z = 28; + newmins.x = MINS_X / 2; + newmins.y = MINS_Y / 2; + newmins.z = 0; + trace = G_Trace( origin, newmins, newmaxs, end, this, MASK_SOLID, true, "checkfeetatladder" ); + if ( ( trace.fraction == 1.0f ) || !( trace.surfaceFlags & SURF_LADDER ) ) + { + return qfalse; + } + + return qtrue; + } + + +qboolean Player::checkcanstand + ( + Conditional &condition + ) + + { + Vector newmins( mins ); + Vector newmaxs( maxs ); + trace_t trace; + + newmins[ 2 ] = MINS_Z; + newmaxs[ 2 ] = MAXS_Z; + + trace = G_Trace( origin, newmins, newmaxs, origin, this, MASK_PLAYERSOLID, true, "checkcanstand" ); + if ( trace.startsolid ) + { + return qfalse; + } + + return qtrue; + } + +qboolean Player::checkspecialmove + ( + Conditional &condition + ) + + { + weaponhand_t hand; + + hand = WeaponHandNameToNum( condition.getParm( 1 ) ); + + if ( hand == WEAPON_ERROR ) + return false; + + Weapon *weapon = GetActiveWeapon( hand ); + + if ( !weapon ) + return qtrue; + else + return weapon->GetSpecialMove(); + } + +qboolean Player::checkdualwield + ( + Conditional &condition + ) + + { + // Only start the dual wield state if dual wield is set and the hands have no weapons + + return ( dual_wield_active ); + } + +qboolean Player::checkdualweapons + ( + Conditional &condition + ) + + { + int i,j; + + for ( i=1; i<=condition.numParms(); i++ ) + { + str weaponName; + weaponName = condition.getParm( i ); + + for ( j=1; j<=dual_wield_weaponlist.NumObjects(); j++ ) + { + DualWieldWeapon *dw; + dw = dual_wield_weaponlist.ObjectAt( j ); + + if ( dw->name == weaponName ) + { + goto out; + } + } + return false; +out: + ; + } + + return true; + } + +qboolean Player::checkchance + ( + Conditional &condition + ) + + { + float percent_chance; + + percent_chance = atof( condition.getParm( 1 ) ); + + return ( G_Random() < percent_chance ); + } + +qboolean Player::checkturnedleft + ( + Conditional &condition + ) + + { + return yawing_left; + } + + +qboolean Player::checkturnedright + ( + Conditional &condition + ) + + { + return yawing_right; + } + +qboolean Player::checkinvehicle + ( + Conditional &condition + ) + + { + return ( vehicle != NULL ); + } + +qboolean Player::checkwaterlevel + ( + Conditional &condition + ) + + { + return ( water_power >= atof( condition.getParm( 1 ) ) ); + } + +qboolean Player::checkpickupenemy + ( + Conditional &condition + ) + + { + return pickup_enemy; + } + +qboolean Player::checksolidforward + ( + Conditional &condition + ) + + { + // Trace out forward to see if there is a solid ahead + float dist = atof( condition.getParm( 1 ) ); + Vector end( centroid + yaw_forward * dist ); + + trace_t trace = G_Trace( centroid, Vector( mins.x, mins.y, -8 ), Vector( maxs.x, maxs.y, 8 ), + end, this, MASK_SOLID, true, "Player::checksolidforward" ); + + return ( trace.fraction < 0.7f ); + } + +qboolean Player::checkcoolitem + ( + Conditional &condition + ) + + { + return ( cool_item != NULL ); + } + +qboolean Player::checkarmorpiece + ( + Conditional &condition + ) + + { + str piece = condition.getParm( 1 ); + + if ( !stricmp( piece, "Arm" ) ) + { + if ( outfit_level >= 2 ) + return true; + } + else if ( !stricmp( piece, "Knee" ) ) + { + if ( outfit_level >= 3 ) + return true; + } + else if ( !stricmp( piece, "Shoulder" ) ) + { + if ( outfit_level >= 4 ) + return true; + } + + return false; + } + +qboolean Player::checkweaponsholstered + ( + Conditional &condition + ) + + { + + if ( + ( holsteredWeapons[WEAPON_DUAL] ) || + ( holsteredWeapons[WEAPON_LEFT] ) || + ( holsteredWeapons[WEAPON_RIGHT] ) + ) + { + return qtrue; + } + else + { + return qfalse; + } + } + +qboolean Player::checkfakeplayeractive + ( + Conditional &condition + ) + + { + return fakePlayer_active; + } + +Condition Player::Conditions[] = + { + { "default", returntrue }, + { "SNEAK", checksneak }, + { "RUN", checkrun }, + { "WAS_RUNNING", checkwasrunning }, + { "HOLSTERWEAPON", checkholsterweapon }, + { "USE", checkuse }, + { "LEFT", checkturnleft }, + { "RIGHT", checkturnright }, + { "FORWARD", checkforward }, + { "BACKWARD", checkbackward }, + { "STRAFE_LEFT", checkstrafeleft }, + { "STRAFE_RIGHT", checkstraferight }, + { "JUMP", checkjump }, + { "RISE", checkrise }, + { "CROUCH", checkcrouch }, + { "DO_JUMP_FLIP", checkjumpflip }, + { "ANIMDONE_LEGS", checkanimdone_legs }, + { "ANIMDONE_TORSO", checkanimdone_torso }, + { "CAN_TURN", checkcanturn }, + { "CAN_MOVE_LEFT", checkcanmoveleft }, + { "CAN_MOVE_RIGHT", checkcanmoveright }, + { "CAN_MOVE_BACKWARD", checkcanmovebackward }, + { "CAN_MOVE_FORWARD", checkcanmoveforward }, + { "CAN_WALL_HUG", checkcanwallhug }, + { "BLOCKED", checkblocked }, + { "HANG_ATWALL", checkhangatwall }, + { "TOUCHED_ROPE", checktouchrope }, + { "ONROPE", checkonrope }, + { "CAN_CLIMB_ROPE", checkcanclimbrope }, + { "ONGROUND", checkonground }, + { "SLOPE_22", check22degreeslope }, + { "SLOPE_45", check45degreeslope }, + { "RIGHT_LEG_HIGH", checkrightleghigh }, + { "LEFT_LEG_HIGH", checkleftleghigh }, + { "CAN_HANG_LEFT", checkcanhangleft }, + { "CAN_HANG_RIGHT", checkcanhangright }, + { "CAN_HANG", checkcanhang }, + { "CAN_FALL", checkcanfall }, + { "AT_DOOR", checkatdoor }, + { "AT_SHGLIEK", checkatshgliek }, + { "HAVE_SHGLIEK", checkhaveshgliek }, + { "SHGLIEK_DEAD", checkshgliekdead }, + { "FALLING", checkfalling }, + { "HARD_IMPACT", checkhardimpact }, + { "CAN_GRAB_LEDGE", checkcangrabledge }, + { "LEDGE_HEIGHT", checkledgeheight }, + { "CAN_GRAB_PIPE", checkcangrabpipe }, + { "CAN_GRAB_MONKEYBARS", checkcangrabmonkeybar }, + { "CAN_PULLUP", checkcanpullup }, + { "KILLED", checkdead }, + { "HEALTH", checkhealth }, + { "PAIN", checkpain }, + { "PAIN_TYPE", checkpaintype }, + { "PAIN_DIRECTION", checkpaindirection }, + { "PAIN_THRESHOLD", checkpainthreshold }, + { "PAIN_ACCUMULATED", checkaccumulatedpain }, + { "KNOCKDOWN", checkknockdown }, + { "LEGS", checklegsstate }, + { "TORSO", checktorsostate }, + { "AT_USEANIM", checkatuseanim }, + { "TOUCHEDUSEANIM", checktouchuseanim }, + { "FINISHEDUSEANIM", checkuseanimfinished }, + { "AT_USEOBJECT", checkatuseobject }, + { "LOOP_USEOBJECT", checkloopuseobject }, + { "CAN_PUSH", checkpush }, + { "CAN_PULL", checkpull }, + { "AT_LADDER", checkladder }, + { "FEET_AT_LADDER", checkfeetatladder }, + { "CAN_CLIMB_LADDER", checkcanclimbladder }, + { "CAN_STAND", checkcanstand }, + { "CHANCE", checkchance }, + { "FACING_UP_SLOPE", checkfacingupslope }, + { "FACING_DOWN_SLOPE", checkfacingdownslope }, + { "TURNED_LEFT", checkturnedleft }, + { "TURNED_RIGHT", checkturnedright }, + { "IN_VEHICLE", checkinvehicle }, + { "WATER_LEVEL", checkwaterlevel }, + { "PICKUP_ENEMY", checkpickupenemy }, + { "SOLID_FORWARD", checksolidforward }, + { "GOT_COOL_ITEM", checkcoolitem }, + { "GROUNDENTITY", checkgroundentity }, + { "FAKEPLAYERACTIVE", checkfakeplayeractive }, + + // Weapon conditions + { "ATTACKLEFT", checkattackleft }, // Checks to see if there is an active weapon as well as the button being pressed + { "ATTACKRIGHT", checkattackright }, // Checks to see if there is an active weapon as well as the button being pressed + { "ATTACKLEFTBUTTON", checkattackbuttonleft }, // Checks to see if the left attack button is pressed + { "ATTACKRIGHTBUTTON", checkattackbuttonright },// Checks to see if the right attack button is pressed + { "HAS_WEAPON", checkhasweapon }, + { "NEW_WEAPON", checknewweapon }, + { "IS_NEW_WEAPON", checkuseweapon }, + { "IS_WEAPON_ACTIVE", checkweaponactive }, + { "IS_WEAPON_READY_TO_FIRE", checkweaponreadytofire }, + { "IS_WEAPON_READY_TO_FIRE_NOSOUND", checkweaponreadytofire_nosound }, + { "IS_DUALWEAPON_READY_TO_FIRE", checkdualweaponreadytofire }, + { "PUTAWAYLEFT", checkputawayleft }, + { "PUTAWAYRIGHT", checkputawayright }, + { "PUTAWAYBOTH", checkputawayboth }, + { "TARGET_ACQUIRED", checktargetacquired }, + { "ANY_WEAPON_ACTIVE", checkanyweaponactive }, + { "ATTACK_BLOCKED", checkattackblocked }, + { "STATE_ACTIVE", checkstatename }, + { "BLOCK_DELAY", checkblockdelay }, + { "DUALWIELD", checkdualwield }, + { "DUALWIELDWEAPONS", checkdualweapons }, + { "MUZZLE_CLEAR", checkmuzzleclear }, + { "HAS_AMMO", checkweaponhasammo }, + { "HAS_ARMORPIECE", checkarmorpiece }, + { "SPECIALMOVE", checkspecialmove }, + { "WEAPONS_HOLSTERED", checkweaponsholstered }, + { NULL, NULL }, + }; + +movecontrolfunc_t Player::MoveStartFuncs[] = + { + NULL, // MOVECONTROL_USER, // Quake style + NULL, // MOVECONTROL_LEGS, // Quake style, legs state system active + NULL, // MOVECONTROL_ANIM, // move based on animation, with full collision testing + NULL, // MOVECONTROL_ABSOLUTE, // move based on animation, with full collision testing but no turning + StartHang, // MOVECONTROL_HANGING, // move based on animation, with full collision testing, hanging + NULL, // MOVECONTROL_WALLHUG, // move based on animation, with full collision testing, hanging + StartMonkeyBars, // MOVECONTROL_MONKEYBARS, // move based on animation, with full collision testing, monkey bars + StartPipeCrawl, // MOVECONTROL_PIPECRAWL, // move based on animation, with full collision testing, crawling on pipe + StartPipeCrawl, // MOVECONTROL_PIPEHANG, // move based on animation, with full collision testing, hanging from pipe + StartStepUp, // MOVECONTROL_STEPUP, + RopeGrab, // MOVECONTROL_ROPE_GRAB + RopeRelease, // MOVECONTROL_ROPE_RELEASE + NULL, // MOVECONTROL_ROPE_MOVE + StartPickup, // MOVECONTROL_PICKUPENEMY + StartPush, // MOVECONTROL_PUSH + StartClimbWall, // MOVECONTROL_CLIMBWALL + StartUseAnim, // MOVECONTROL_USEANIM + NULL, // MOVECONTROL_CROUCH + StartLoopUseAnim, // MOVECONTROL_LOOPUSEANIM + SetupUseObject, // MOVECONTROL_USEOBJECT + StartCoolItemAnim, // MOVECONTROL_COOLOBJECT + StartFakePlayer, // MOVECONTROL_FAKEPLAYER + }; + +Player::Player() + { + // + // set the entity type + // + edict->s.eType = ET_PLAYER; + respawn_time = -1; + statemap_Legs = NULL; + statemap_Torso = NULL; + camera = NULL; + atobject = NULL; + atobject_dist = 0; + toucheduseanim = NULL; + useitem_in_use = NULL; + horizontalpipe = NULL; + damage_blood = 0; + damage_count = 0; + damage_from = vec_zero; + damage_alpha = 0; + last_attack_button = 0; + attack_blocked = qfalse; + shield_active = qfalse; + crouch_flag = qfalse; + ledgeheight_left = 0; + ledgeheight_right = 0; + monkeybar_left = 0; + monkeybar_right = 0; + monkeybar_dir = 0; + canfall = false; + move_left_dist = 0; + move_right_dist = 0; + move_backward_dist = 0; + move_forward_dist = 0; + moveresult = MOVERESULT_NONE; + animspeed = 0; + airspeed = 200; + vehicle = NULL; + action_level = 0; + have_shgliek = false; + pickup_enemy = false; + adjust_torso = qfalse; + dual_wield_active = qfalse; + cool_item = NULL; + weapons_holstered_by_code = qfalse; + actor_camera = NULL; + cool_camera = NULL; + damage_multiplier = 1; + take_pain = true; + look_at_time = 0; + outfit_level = 0; + fakePlayer_active = qfalse; + + memset( oldstats, 0, sizeof( oldstats ) ); + + // make sure that we are not overflowing the stats for players + assert( STAT_LAST_STAT <= MAX_STATS ); + + fov = atof( Info_ValueForKey( client->pers.userinfo, "fov" ) ); + if ( fov < 1 ) + { + fov = 90; + } + else if ( fov > 160 ) + { + fov = 160; + } + + if ( !LoadingSavegame ) + { + crosshair = new Entity; + crosshair->setModel( "crosshair.spr" ); + crosshair->setSolidType( SOLID_NOT ); + crosshair->setMoveType( MOVETYPE_NONE ); + crosshair->takedamage = DAMAGE_NO; + crosshair->hideModel(); + } + + // + // set targetnameplayer + // + SetTargetName( "player" ); + + Init(); + + SetOutfit( 0 ); + } + +Player::~Player() + { + int i,num; + Conditional *cond; + + edict->s.modelindex = 0; + + num = legs_conditionals.NumObjects(); + for ( i=num; i>0; i-- ) + { + cond = legs_conditionals.ObjectAt( i ); + delete cond; + } + + num = torso_conditionals.NumObjects(); + for ( i=num; i>0; i-- ) + { + cond = torso_conditionals.ObjectAt( i ); + delete cond; + } + + legs_conditionals.FreeObjectList(); + torso_conditionals.FreeObjectList(); + } + +static qboolean logfile_started = qfalse; + +void Player::Init + ( + void + ) + + { + InitClient(); + InitPhysics(); + InitPowerups(); + InitWorldEffects(); + InitSound(); + InitView(); + InitState(); + InitEdict(); + InitModel(); + InitWeapons(); + InitInventory(); + InitHealth(); + InitWaterPower(); + + LoadStateTable(); + + if ( !LoadingSavegame ) + { + ChooseSpawnPoint(); + } + + // make sure we put the player back into the world + link(); + logfile_started = qfalse; + } + +void Player::InitEdict + ( + void + ) + + { + // entity state stuff + setSolidType( SOLID_BBOX ); + setMoveType( MOVETYPE_WALK ); + setSize( Vector( -16, -16, 0 ), Vector( 16, 16, STAND_HEIGHT ) ); + edict->clipmask = MASK_PLAYERSOLID; + edict->svflags &= ~SVF_DEADMONSTER; + edict->svflags &= ~SVF_HIDEOWNER; + edict->ownerNum = ENTITYNUM_NONE; + + // clear entity state values + edict->s.eFlags = 0; + edict->s.frame = 0; + + // players have precise shadows + edict->s.renderfx |= RF_SHADOW_PRECISE; + } + +void Player::InitSound + ( + void + ) + + { + // + // reset the music + // + client->ps.current_music_mood = mood_normal; + client->ps.fallback_music_mood = mood_normal; + ChangeMusic( "normal", "normal", false ); + + client->ps.music_volume = 1.0; + client->ps.music_volume_fade_time = 0.0; + ChangeMusicVolume( 1.0, 0.0 ); + + music_forced = false; + + // Reset the reverb stuff + + client->ps.reverb_type = eax_generic; + client->ps.reverb_level = 0; + SetReverb( client->ps.reverb_type, client->ps.reverb_level ); + } + +void Player::InitClient + ( + void + ) + + { + client_persistant_t saved; + + // deathmatch wipes most client data every spawn + if ( deathmatch->integer ) + { + char userinfo[ MAX_INFO_STRING ]; + + memcpy( userinfo, client->pers.userinfo, sizeof( userinfo ) ); + G_InitClientPersistant( client ); + G_ClientUserinfoChanged( edict, userinfo ); + } + + // clear everything but the persistant data and fov + saved = client->pers; + memset( client, 0, sizeof( *client ) ); + client->pers = saved; + + client->ps.clientNum = client - game.clients; + } + +void Player::InitState + ( + void + ) + + { + gibbed = false; + pain = 0; + accumulated_pain = 0; + nextpaintime = 0; + knockdown = false; + pain_dir = PAIN_NONE; + pain_type = MOD_NONE; + crouch_flag = false; + takedamage = DAMAGE_AIM; + deadflag = DEAD_NO; + flags &= ~FL_NO_KNOCKBACK; + flags |= ( FL_BLOOD | FL_DIE_GIBS ); + + if ( !com_blood->integer ) + { + flags &= ~FL_BLOOD; + flags &= ~FL_DIE_GIBS; + } + } + + +void Player::InitWaterPower + ( + void + ) + + { + water_power = 50; + max_water_power = 100; + SetWaterPower( water_power ); + } + +void Player::InitHealth + ( + void + ) + + { + // Don't do anything if we're loading a server game. + // This is either a loadgame or a restart + if ( LoadingSavegame ) + { + return; + } + + // reset the health values + health = 100; + max_health = 100; + } + +void Player::InitModel + ( + void + ) + + { + orientation_t orient; + int anim; + int tagnum; + + setModel( str( g_playermodel->string ) + ".tik" ); + + SetControllerTag( HEAD_TAG, gi.Tag_NumForName( edict->s.modelindex, "Bip01 Head" ) ); + SetControllerTag( TORSO_TAG, gi.Tag_NumForName( edict->s.modelindex, "Bip01 Spine1" ) ); + SetControllerTag( R_ARM_TAG, gi.Tag_NumForName( edict->s.modelindex, R_ARM_NAME ) ); + SetControllerTag( L_ARM_TAG, gi.Tag_NumForName( edict->s.modelindex, L_ARM_NAME ) ); + SetControllerTag( MOUTH_TAG, gi.Tag_NumForName( edict->s.modelindex, "tag_mouth" ) ); + + anim = gi.Anim_NumForName( edict->s.modelindex, "hang_idle" ); + + tagnum = gi.Tag_NumForName( edict->s.modelindex, "tag_weapon_right" ) & TAG_MASK; + orient = gi.Tag_Orientation( edict->s.modelindex, anim, 0, tagnum, 1.0f, NULL, NULL ); + base_righthand_pos = orient.origin; + + tagnum = gi.Tag_NumForName( edict->s.modelindex, "tag_weapon_left" ) & TAG_MASK; + orient = gi.Tag_Orientation( edict->s.modelindex, anim, 0, tagnum, 1.0f, NULL, NULL ); + base_lefthand_pos = orient.origin; + + anim = gi.Anim_NumForName( edict->s.modelindex, "stand_idle" ); + + tagnum = gi.Tag_NumForName( edict->s.modelindex, "Bip01 R Foot" ) & TAG_MASK; + orient = gi.Tag_Orientation( edict->s.modelindex, anim, 0, tagnum, 1.0f, NULL, NULL ); + base_rightfoot_pos = orient.origin; + base_rightfoot_pos.z = 0; + + tagnum = gi.Tag_NumForName( edict->s.modelindex, "Bip01 L Foot" ) & TAG_MASK; + orient = gi.Tag_Orientation( edict->s.modelindex, anim, 0, tagnum, 1.0f, NULL, NULL ); + base_leftfoot_pos = orient.origin; + base_leftfoot_pos.z = 0; + + showModel(); + + yawing_left = qfalse; + yawing_right = qfalse; + } + +void Player::InitPhysics + ( + void + ) + + { + // Physics stuff + oldvelocity = vec_zero; + velocity = vec_zero; + old_v_angle = v_angle; + gravity = 1.0; + falling = false; + hardimpact = false; + mass = 200; + rope_touch = NULL; + rope_grabbed = NULL; + memset( &last_ucmd, 0, sizeof( last_ucmd ) ); + } + +void Player::InitPowerups + ( + void + ) + + { + // powerups + poweruptimer = 0; + poweruptype = 0; + } + +void Player::InitWorldEffects + ( + void + ) + + { + // world effects + next_drown_time = 0; + next_painsound_time = 0; + air_finished = level.time + 20; + old_waterlevel = 0; + drown_damage = 0; + } + +void Player::InitWeapons + ( + void + ) + + { + // Don't do anything if we're loading a server game. + // This is either a loadgame or a restart + if ( LoadingSavegame ) + { + return; + } + + + } + +void Player::InitInventory + ( + void + ) + + { + } + +void Player::InitView + ( + void + ) + + { + // view stuff + camera = NULL; + v_angle = vec_zero; + SetViewAngles( v_angle ); + viewheight = STAND_EYE_HEIGHT; + + head_target = NULL; + left_arm_target = NULL; + right_arm_target = NULL; + + // blend stuff + damage_blend = vec_zero; + } + +void Player::ChooseSpawnPoint + ( + void + ) + + { + str thread; + + // set up the player's spawn location + SelectSpawnPoint( origin, angles, thread ); + setOrigin( origin + "0 0 1" ); + origin.copyTo( edict->s.origin2 ); + edict->s.renderfx |= RF_FRAMELERP; + + KillBox( this ); + + setAngles( angles ); + SetViewAngles( angles ); + + if ( thread.length() ) + { + ExecuteThread( thread ); + } + } + +void Player::EndLevel + ( + Event *ev + ) + + { + InitPowerups(); + if ( health > max_health ) + { + health = max_health; + } + + if ( health < 1 ) + { + health = 1; + } + } + +void Player::Respawn + ( + Event *ev + ) + + { + if ( deathmatch->integer ) + { + assert ( deadflag == DEAD_DEAD ); + + respawn_time = level.time; + + Init(); + + // hold in place briefly + client->ps.pm_time = 50; + client->ps.pm_flags |= PMF_TIME_TELEPORT; + + return; + } + else + { +#ifdef PRE_RELEASE_DEMO + gi.SendConsoleCommand( "forcemenu demomain; forcemenu loadsave\n" ); +#else + gi.SendConsoleCommand( "forcemenu main; forcemenu loadsave\n" ); +#endif + logfile_started = qfalse; + } + } + +void Player::SetDeltaAngles + ( + void + ) + + { + int i; + + // Use v_angle since we may be in a camera + for( i = 0; i < 3; i++ ) + { + client->ps.delta_angles[ i ] = ANGLE2SHORT( v_angle[ i ] ); + } + } + +void Player::Obituary + ( + Entity *attacker, + Entity *inflictor, + int meansofdeath + ) + + { + if ( !deathmatch->integer ) + { + return; + } + } + +void Player::Dead + ( + Event *ev + ) + + { + deadflag = DEAD_DEAD; + + // stop animating + StopAnimating( legs ); + + // + // drop anything that might be attached to us + // + + // FIXME : re-enable and fix dropping issues for deathmatch? + /* if ( numchildren ) + { + Entity * child; + int i; + // + // detach all our children + // + for ( i=0; i < MAX_MODEL_CHILDREN; i++ ) + { + if ( children[i] != ENTITYNUM_NONE ) + { + child = ( Entity * )G_GetEntity( children[ i ] ); + child->ProcessEvent( EV_Detach ); + } + } + } */ + } + +void Player::Killed + ( + Event *ev + ) + + { + Entity *attacker; + Entity *inflictor; + int meansofdeath; + + attacker = ev->GetEntity( 1 ); + inflictor = ev->GetEntity( 3 ); + meansofdeath = ev->GetInteger( 4 ); + + pain_type = (meansOfDeath_t)meansofdeath; + + if ( attacker && inflictor ) + Obituary( attacker, inflictor, meansofdeath ); + + + deadflag = DEAD_DYING; + + respawn_time = level.time + 1.0; + + edict->clipmask = MASK_DEADSOLID; + edict->svflags |= SVF_DEADMONSTER; + + setContents( CONTENTS_CORPSE ); + + setMoveType( MOVETYPE_NONE ); + + angles.x = 0; + angles.z = 0; + setAngles( angles ); + + // + // change music + // + ChangeMusic( "failure", "normal", true ); + + health = 0; + + // Stop targeting monsters + + if ( left_arm_target ) + { + left_arm_target->edict->s.eFlags &= ~EF_LEFT_TARGETED; + left_arm_target = NULL; + } + + if ( right_arm_target ) + { + right_arm_target->edict->s.eFlags &= ~EF_RIGHT_TARGETED; + right_arm_target = NULL; + } + + // Post a dead event just in case + PostEvent( EV_Player_Dead, 2 ); + } + +void Player::Pain + ( + Event *ev + ) + + { + float damage,yawdiff; + Entity *attacker; + int meansofdeath; + Vector dir,pos,attack_angle; + + damage = ev->GetFloat( 1 ); + attacker = ev->GetEntity( 2 ); + meansofdeath = ev->GetInteger( 3 ); + pos = ev->GetVector( 4 ); + dir = ev->GetVector( 5 ); + + if ( !damage && !knockdown ) + return; + + client->ps.stats[ STAT_LAST_PAIN ] = damage; + + // Determine direction + attack_angle = dir.toAngles(); + yawdiff = torsoAngles[YAW] - attack_angle[YAW] + 180; + yawdiff = AngleNormalize180( yawdiff ); + + if ( yawdiff > -45 && yawdiff < 45 ) + pain_dir = PAIN_FRONT; + else if ( yawdiff < -45 && yawdiff > -135 ) + pain_dir = PAIN_LEFT; + else if ( yawdiff > 45 && yawdiff < 135 ) + pain_dir = PAIN_RIGHT; + else + pain_dir = PAIN_REAR; + + // accumulate pain for animation purposes + if ( take_pain ) + { + accumulated_pain += damage; + } + + // Spawn off any damage effect if we get hit with a certain type of damage + SpawnDamageEffect( (meansOfDeath_t)meansofdeath ); + + pain_type = (meansOfDeath_t)meansofdeath; + + // Only set the regular pain level if enough time since last pain has passed + if ( ( level.time > nextpaintime ) && take_pain ) + { + pain = damage; + } + + if ( meansofdeath > MOD_LAST_SELF_INFLICTED ) + { + // increase action level of game as we're getting hurt + IncreaseActionLevel( damage ); + } + + // add to the damage inflicted on a player this frame + // the total will be turned into screen blends and view angle kicks + // at the end of the frame + damage_blood += damage; + damage_from += ev->GetVector( 5 ) * damage; + } + +void Player::DoUse + ( + Event *ev + ) + + { + int i; + int num; + int touch[ MAX_GENTITIES ]; + gentity_t *hit; + Event *event; + Vector min; + Vector max; + Vector offset; + trace_t trace; + Vector start; + Vector end; + float t; + + // if we are in a vehicle, we want to use the vehicle always + if ( vehicle ) + { + event = new Event( EV_Use ); + event->AddEntity( this ); + vehicle->ProcessEvent( event ); + return; + } + + start = origin; + start.z += viewheight; + end = start + yaw_forward * 64.0f; + + trace = G_Trace( start, vec_zero, vec_zero, end, this, MASK_USABLE, true, "Player::DoUse" ); + + t = 64 * trace.fraction - maxs[ 0 ]; + if ( t < 0 ) + { + t = 0; + } + + offset = yaw_forward * t; + + min = start + offset + "-16 -16 -16"; + max = start + offset + "16 16 16"; + + num = gi.AreaEntities( min, max, touch, MAX_GENTITIES ); + + // be careful, it is possible to have an entity in this + // list removed before we get to it (killtriggered) + for( i = 0; i < num; i++ ) + { + hit = &g_entities[ touch[ i ] ]; + if ( !hit->inuse ) + { + continue; + } + + assert( hit->entity ); + + event = new Event( EV_Use ); + event->AddEntity( this ); + hit->entity->ProcessEvent( event ); + } + } + +void Player::TouchStuff + ( + pmove_t *pm + ) + + { + gentity_t *other; + Event *event; + int i; + int j; + + // + // clear out any conditionals that are controlled by touching + // + toucheduseanim = NULL; + + if ( getMoveType() != MOVETYPE_NOCLIP ) + { + G_TouchTriggers( this ); + } + + // touch other objects + for( i = 0; i < pm->numtouch; i++ ) + { + other = &g_entities[ pm->touchents[ i ] ]; + + for( j = 0; j < i ; j++ ) + { + gentity_t *ge = &g_entities[ j ]; + + if ( ge == other ) + break; + } + + if ( j != i ) + { + // duplicated + continue; + } + + // Don't bother touching the world + if ( ( !other->entity ) || ( other->entity == world ) ) + { + continue; + } + + event = new Event( EV_Touch ); + event->AddEntity( this ); + other->entity->ProcessEvent( event ); + + event = new Event( EV_Touch ); + event->AddEntity( other->entity ); + ProcessEvent( event ); + } + } + +void Player::GetMoveInfo + ( + pmove_t *pm + ) + + { + moveresult = pm->moveresult; + + if ( !deadflag ) + { + v_angle[ 0 ] = pm->ps->viewangles[ 0 ]; + v_angle[ 1 ] = pm->ps->viewangles[ 1 ]; + v_angle[ 2 ] = pm->ps->viewangles[ 2 ]; + + if ( moveresult == MOVERESULT_TURNED ) + { + angles.y = v_angle[ 1 ]; + setAngles( angles ); + SetViewAngles( angles ); + } + } + + setOrigin( Vector( pm->ps->origin[ 0 ], pm->ps->origin[ 1 ], pm->ps->origin[ 2 ] ) ); + velocity = Vector( pm->ps->velocity[ 0 ], pm->ps->velocity[ 1 ], pm->ps->velocity[ 2 ] ); + + if ( client->ps.pm_flags & PMF_FROZEN || client->ps.pm_flags & PMF_NO_MOVE ) + { + velocity = vec_zero; + } + else + { + setSize( pm->mins, pm->maxs ); + + viewheight = pm->ps->viewheight; + } + + // water type and level is set in the predicted code + waterlevel = pm->waterlevel; + watertype = pm->watertype; + + // Set the ground entity + groundentity = NULL; + if ( pm->ps->groundEntityNum != ENTITYNUM_NONE ) + { + groundentity = &g_entities[ pm->ps->groundEntityNum ]; + airspeed = 200; + } + } + +void Player::SetMoveInfo + ( + pmove_t *pm, + usercmd_t *ucmd + ) + + { + Vector move; + + // set up for pmove + memset( pm, 0, sizeof( pmove_t ) ); + + velocity.copyTo( client->ps.velocity ); + + pm->ps = &client->ps; + + if ( ucmd ) + { + pm->cmd = *ucmd; + } + + pm->tracemask = MASK_PLAYERSOLID; + pm->trace = gi.trace; + pm->pointcontents = gi.pointcontents; + pm->trypush = TryPush; + + pm->ps->origin[ 0 ] = origin.x; + pm->ps->origin[ 1 ] = origin.y; + pm->ps->origin[ 2 ] = origin.z; + + pm->ps->velocity[ 0 ] = velocity.x; + pm->ps->velocity[ 1 ] = velocity.y; + pm->ps->velocity[ 2 ] = velocity.z; + + // save off pm_runtime + if ( pm->ps->pm_runtime ) + pm_lastruntime = pm->ps->pm_runtime; + } + +pmtype_t Player::GetMovePlayerMoveType + ( + void + ) + + { + if ( getMoveType() == MOVETYPE_NOCLIP ) + { + return PM_NOCLIP; + } + else if ( deadflag ) + { + return PM_DEAD; + } + else + { + return PM_NORMAL; + } + } + +void Player::CheckGround + ( + void + ) + + { + pmove_t pm; + + SetMoveInfo( &pm, current_ucmd ); + Pmove_GroundTrace( &pm ); + GetMoveInfo( &pm ); + } + +qboolean Player::MonkeyBarMove + ( + Vector &move, + Vector *endpos + ) + + { + Vector up; + Vector down; + trace_t trace; + + Vector start( origin ); + Vector end( origin + move ); + + trace = G_Trace( start, mins, maxs, end, this, MASK_PLAYERSOLID, true, "MonkeyBarMove" ); + if ( trace.startsolid ) + { + if ( endpos ) + { + *endpos = origin; + } + return qfalse; + } + + Vector pos( trace.endpos ); + + // + // check if the right hand will still be on the monkey bars + // + end = righthand_pos + yaw_left * 4.0f - origin + pos; + start.x = end.x; + start.y = end.y; + start.z = absmax.z; + + trace = G_Trace( start, Vector( -4, -4, 0 ), Vector( 4, 4, 2 ), end, this, MASK_PLAYERSOLID, false, "MonkeyBarMove" ); + if ( trace.startsolid || ( trace.fraction >= 1.0f ) || !trace.ent || !trace.ent->entity->isSubclassOf( MonkeyBars ) ) + { + if ( endpos ) + { + *endpos = origin; + } + return qfalse; + } + + // + // check if the left hand will still be on the monkey bars + // + end = lefthand_pos - yaw_left * 4.0f - origin + pos; + start.x = end.x; + start.y = end.y; + start.z = absmax.z; + + trace = G_Trace( start, Vector( -4, -4, 0 ), Vector( 4, 4, 2 ), end, this, MASK_PLAYERSOLID, false, "MonkeyBarMove" ); + if ( trace.startsolid || ( trace.fraction >= 1.0f ) || !trace.ent || !trace.ent->entity->isSubclassOf( MonkeyBars ) ) + { + if ( endpos ) + { + *endpos = origin; + } + return qfalse; + } + + if ( endpos ) + { + *endpos = pos; + } + + return qtrue; + } + +qboolean Player::PipeMove + ( + Vector &move, + Vector *endpos + ) + + { + Vector up; + Vector down; + trace_t trace; + + Vector start( origin ); + Vector end( origin + move ); + + trace = G_Trace( start, mins, maxs, end, this, MASK_PLAYERSOLID, true, "PipeMove" ); + if ( trace.startsolid ) + { + if ( endpos ) + { + *endpos = origin; + } + return qfalse; + } + + Vector pos( trace.endpos ); + + end.x = pos.x; + end.y = pos.y; + + end.z = righthand_pos.z + 1 - maxs.z; + + trace = G_Trace( pos, mins, maxs, end, this, MASK_DEADSOLID, true, "PipeMove" ); + if ( ( trace.fraction < 1.0f ) && trace.ent && trace.ent->entity->isSubclassOf( HorizontalPipe ) ) + { + if ( endpos ) + { + *endpos = pos; + } + + return qtrue; + } + + if ( endpos ) + { + *endpos = origin; + } + + return qfalse; + } + +qboolean Player::AnimMove + ( + Vector &move, + Vector *endpos + ) + + { + Vector up; + Vector down; + trace_t trace; + int mask; + Vector start( origin ); + Vector end( origin + move ); + + mask = MASK_PLAYERSOLID; + + // test the player position if they were a stepheight higher + trace = G_Trace( start, mins, maxs, end, this, mask, true, "AnimMove" ); + if ( trace.fraction < 1 ) + { + if ( ( movecontrol == MOVECONTROL_HANGING ) || ( movecontrol == MOVECONTROL_CLIMBWALL ) ) + { + up = origin; + up.z += move.z; + trace = G_Trace( origin, mins, maxs, up, this, mask, true, "AnimMove" ); + if ( trace.fraction < 1 ) + { + if ( endpos ) + { + *endpos = origin; + } + return qfalse; + } + + origin = trace.endpos; + end = origin; + end.x += move.x; + end.y += move.y; + + trace = G_Trace( origin, mins, maxs, end, this, mask, true, "AnimMove" ); + if ( endpos ) + { + *endpos = trace.endpos; + } + + return ( trace.fraction > 0 ); + } + else + { + return TestMove( move, endpos ); + } + } + else + { + if ( endpos ) + { + *endpos = trace.endpos; + } + + return qtrue; + } + } + +qboolean Player::TestMove + ( + Vector &move, + Vector *endpos + ) + + { + trace_t trace; + Vector pos( origin + move ); + + trace = G_Trace( origin, mins, maxs, pos, this, MASK_PLAYERSOLID, true, "TestMove" ); + if ( trace.allsolid ) + { + // player is completely trapped in another solid + if ( endpos ) + { + *endpos = origin; + } + return qfalse; + } + + if ( trace.fraction < 1.0f ) + { + Vector up( origin ); + up.z += STEPSIZE; + + trace = G_Trace( origin, mins, maxs, up, this, MASK_PLAYERSOLID, true, "TestMove" ); + if ( trace.fraction == 0.0f ) + { + if ( endpos ) + { + *endpos = origin; + } + return qfalse; + } + + Vector temp( trace.endpos ); + Vector end( temp + move ); + + trace = G_Trace( temp, mins, maxs, end, this, MASK_PLAYERSOLID, true, "TestMove" ); + if ( trace.fraction == 0.0f ) + { + if ( endpos ) + { + *endpos = origin; + } + return qfalse; + } + + temp = trace.endpos; + + Vector down( trace.endpos ); + down.z = origin.z; + + trace = G_Trace( temp, mins, maxs, down, this, MASK_PLAYERSOLID, true, "TestMove" ); + } + + if ( endpos ) + { + *endpos = trace.endpos; + } + + return qtrue; + } + +qboolean Player::RopeMove + ( + Vector &move, + Vector *endpos + ) + + { + if ( rope_grabbed ) + { + if ( rope_grabbed->CanClimb( move.z ) ) + { + rope_grabbed->Climb( move.z ); + *endpos = origin; + return qtrue; + } + } + return qfalse; + } + +float Player::TestMoveDist + ( + Vector &move + ) + + { + Vector endpos; + + TestMove( move, &endpos ); + endpos -= origin; + + return endpos.length(); + } + + +void Player::CheckMoveFlags + ( + void + ) + + { + trace_t trace; + Vector start; + Vector end; + float startz; + float oldsp; + Vector olddir( oldvelocity.x, oldvelocity.y, 0 ); + + MatrixTransformVector( base_righthand_pos, orientation, righthand_pos ); + MatrixTransformVector( base_lefthand_pos, orientation, lefthand_pos ); + MatrixTransformVector( base_rightfoot_pos, orientation, rightfoot_pos ); + MatrixTransformVector( base_leftfoot_pos, orientation, leftfoot_pos ); + righthand_pos += origin; + lefthand_pos += origin; + rightfoot_pos += origin; + leftfoot_pos += origin; + + if ( !client->ps.walking ) + { + // + // if we're not on a pole, check if there's a pole we can grab + // + if ( + ( movecontrol != MOVECONTROL_PIPECRAWL ) && + ( movecontrol != MOVECONTROL_PIPEHANG ) + ) + { + end.x = origin.x; + end.y = origin.y; + end.z = righthand_pos.z + 1 - maxs.z; + trace = G_Trace( origin, mins, maxs, end, this, MASK_DEADSOLID, false, "CheckMoveFlags" ); + if ( ( trace.fraction < 1.0f ) && trace.ent && trace.ent->entity->isSubclassOf( HorizontalPipe ) ) + { + horizontalpipe = trace.ent->entity; + } + else + { + horizontalpipe = NULL; + } + } + + // + // get the right hand monkey bar height + // + end = righthand_pos + yaw_left * 4.0f; + start.x = end.x; + start.y = end.y; + start.z = absmax.z; + + monkeybar_dir = v_angle.y; + + trace = G_Trace( start, min4x4, max4x4x0, end, this, MASK_DEADSOLID, false, "CheckMoveFlags" ); + if ( !trace.startsolid && ( trace.fraction < 1.0f ) && trace.ent && trace.ent->entity->isSubclassOf( MonkeyBars ) ) + { + monkeybar_right = end.z + ( start.z - end.z ) * ( 1.0f - trace.fraction ); + monkeybar_dir = ( ( MonkeyBars * )trace.ent->entity )->dir; + } + else + { + monkeybar_right = MIN_Z; + } + + // + // get the left hand monkey bar height + // + end = lefthand_pos - yaw_left * 4.0f; + start.x = end.x; + start.y = end.y; + start.z = absmax.z; + + trace = G_Trace( start, min4x4, max4x4x0, end, this, MASK_DEADSOLID, false, "CheckMoveFlags" ); + if ( !trace.startsolid && ( trace.fraction < 1.0f ) && trace.ent && trace.ent->entity->isSubclassOf( MonkeyBars ) ) + { + monkeybar_left = end.z + ( start.z - end.z ) * ( 1.0f - trace.fraction ); + } + else + { + monkeybar_left = MIN_Z; + } + } + else + { + horizontalpipe = NULL; + monkeybar_left = MIN_Z; + monkeybar_right = MIN_Z; + } + + // trace up to see if the player's hands are not in a solid + end.x = origin.x; + end.y = origin.y; + end.z = origin.z + 208; + trace = G_Trace( origin, min4x4, max4x4x8, end, this, MASK_DEADSOLID, false, "CheckMoveFlags" ); + startz = trace.endpos[ 2 ]; + + // + // get the right hand ledge height for grabbing ledges + // + end = righthand_pos + yaw_left * 4.0f; // + yaw_forward * 4.0f; + end.z = origin.z; + start.x = end.x; + start.y = end.y; + start.z = startz; + + trace = G_Trace( start, min4x4, max4x4x8, end, this, MASK_DEADSOLID, false, "CheckMoveFlags" ); + ledgeheight_right = end.z + ( start.z - end.z ) * ( 1.0f - trace.fraction ); + + if ( trace.fraction == 1 ) + ledgeheight_right = MIN_Z; + + if ( trace.startsolid ) + { + start.z = ledgeheight_right; + trace = G_Trace( start, min4x4, max4x4x8, start, this, MASK_DEADSOLID, false, "CheckMoveFlags" ); + if ( trace.startsolid ) + { + ledgeheight_right = MIN_Z; + } + } + + if ( + ( ledgeheight_right != MIN_Z ) && + trace.ent && + ( + trace.ent->entity->isSubclassOf( HorizontalPipe ) || + ( trace.ent->entity->velocity.length() > 0 ) || + ( trace.ent->entity->avelocity.length() > 0 ) + ) + ) + { + ledgeheight_right = MIN_Z; + } + if ( + ( ledgeheight_right != MIN_Z ) && + ( trace.plane.normal[ 2 ] < 0.707 ) + ) + { + ledgeheight_right = MIN_Z; + } + + // + // get the left hand ledge height for grabbing ledges + // + end = lefthand_pos - yaw_left * 4.0f; // + yaw_forward * 4.0f; + end.z = origin.z; + start.x = end.x; + start.y = end.y; + start.z = startz; + + trace = G_Trace( start, min4x4, max4x4x8, end, this, MASK_DEADSOLID, false, "CheckMoveFlags" ); + ledgeheight_left = end.z + ( start.z - end.z ) * ( 1.0f - trace.fraction ); + + if ( trace.fraction == 1 ) + ledgeheight_left = MIN_Z; + + if ( trace.startsolid ) + { + start.z = ledgeheight_left; + trace = G_Trace( start, min4x4, max4x4x8, start, this, MASK_DEADSOLID, false, "CheckMoveFlags" ); + if ( trace.startsolid ) + { + ledgeheight_left = MIN_Z; + } + } + + if ( + ( ledgeheight_left != MIN_Z ) && + trace.ent && + ( + trace.ent->entity->isSubclassOf( HorizontalPipe ) || + ( trace.ent->entity->velocity.length() > 0 ) + ) + ) + { + ledgeheight_left = MIN_Z; + } + + if ( + ( ledgeheight_left != MIN_Z ) && + ( trace.plane.normal[ 2 ] < 0.707 ) + ) + { + ledgeheight_left = MIN_Z; + } + + // + // Check if moving forward will cause the player to fall + // + start = origin + yaw_forward * 52.0f; + end = start; + end.z -= STEPSIZE * 2; + + trace = G_Trace( start, mins, maxs, end, this, MASK_PLAYERSOLID, true, "CheckMoveFlags" ); + canfall = !( trace.fraction < 1.0f ); + + if ( !groundentity && ( velocity.z < 0 ) ) + { + falling = true; + hardimpact = false; + } + else + { + hardimpact = ( oldvelocity.z < -400.0f ); + falling = false; + } + + // check for running into walls + oldsp = VectorNormalize( olddir ); + if ( ( oldsp > 250.0f ) && ( velocity * olddir < 5.0f ) ) + { + moveresult = MOVERESULT_HITWALL; + } + + // + // Check if the player is at a door, pushobject, or useanim + // + start = origin; + end = start + yaw_forward * 64.0f; + trace = G_Trace( start, mins, maxs, end, this, MASK_USABLE, true, "CheckMoveFlags" ); + + if ( trace.ent && trace.ent->entity && ( trace.ent->entity != world ) ) + { + atobject = trace.ent->entity; + atobject_dist = trace.fraction * 64.0f; + atobject_dir.setXYZ( -trace.plane.normal[ 0 ], -trace.plane.normal[ 1 ], -trace.plane.normal[ 2 ] ); + } + else + { + atobject = NULL; + } + + // + // get the distances the player can move left, right, forward, and back + // + if ( ( movecontrol == MOVECONTROL_USER ) || ( movecontrol == MOVECONTROL_LEGS ) ) + { + move_left_dist = TestMoveDist( yaw_left * 128.0f ); + move_right_dist = TestMoveDist( yaw_left * -128.0f ); + move_backward_dist = TestMoveDist( yaw_forward * -128.0f ); + move_forward_dist = TestMoveDist( yaw_forward * 128.0f ); + } + else + { + move_left_dist = CheckMoveDist( yaw_left * 2.0f ); + move_right_dist = CheckMoveDist( yaw_left * -2.0f ); + move_backward_dist = CheckMoveDist( yaw_forward * -2.0f ); + move_forward_dist = CheckMoveDist( yaw_forward * 2.0f ); + } + } + +qboolean Player::CheckMove + ( + Vector &move, + Vector *endpos + ) + + { + switch( movecontrol ) + { + case MOVECONTROL_MONKEYBARS : + return MonkeyBarMove( move, endpos ); + break; + + case MOVECONTROL_PIPECRAWL : + case MOVECONTROL_PIPEHANG : + return PipeMove( move, endpos ); + break; + + case MOVECONTROL_ROPE_MOVE : + return RopeMove( move, endpos ); + break; + + default : + return AnimMove( move, endpos ); + break; + } + } + +float Player::CheckMoveDist + ( + Vector &move + ) + + { + Vector endpos; + + CheckMove( move, &endpos ); + endpos -= origin; + + return endpos.length(); + } + +void Player::ClientMove + ( + usercmd_t *ucmd + ) + + { + pmove_t pm; + Vector move; + + oldorigin = origin; + + client->ps.pm_type = GetMovePlayerMoveType(); + + // set move flags + client->ps.pm_flags &= ~( PMF_FROZEN | PMF_NO_PREDICTION | PMF_NO_MOVE | PMF_DUCKED | PMF_LEGS_LIFTED | PMF_NO_GRAVITY ); + + if ( level.playerfrozen ) + { + client->ps.pm_flags |= PMF_FROZEN; + } + + if ( flags & FL_IMMOBILE || flags & FL_PARTIAL_IMMOBILE ) + { + client->ps.pm_flags |= PMF_NO_MOVE; + client->ps.pm_flags |= PMF_NO_PREDICTION; + } + + switch( movecontrol ) + { + case MOVECONTROL_USER : + case MOVECONTROL_LEGS : + // FIXME, should be done properly, but not enough time + // turn off prediction when standing on platforms that are moving + if ( groundentity && ( groundentity->entity ) && + ( ( groundentity->entity->velocity.length() ) || ( groundentity->entity->avelocity.length() ) ) ) + { + // + // we kill the delta, so we don't move twice as fast + // + total_delta = vec_zero; + client->ps.pm_flags |= PMF_NO_PREDICTION; + } + break; + + case MOVECONTROL_ANIM : + case MOVECONTROL_ABSOLUTE : + case MOVECONTROL_HANGING : + case MOVECONTROL_STEPUP : + case MOVECONTROL_MONKEYBARS : + case MOVECONTROL_WALLHUG : + case MOVECONTROL_ROPE_RELEASE : + case MOVECONTROL_PICKUPENEMY : + case MOVECONTROL_PUSH : + case MOVECONTROL_CLIMBWALL : + case MOVECONTROL_PIPEHANG : + client->ps.pm_flags |= PMF_NO_PREDICTION; + break; + + case MOVECONTROL_PIPECRAWL : + client->ps.pm_flags |= PMF_NO_PREDICTION | PMF_LEGS_LIFTED; + break; + + case MOVECONTROL_CROUCH : + client->ps.pm_flags |= PMF_NO_PREDICTION | PMF_DUCKED; + break; + + default: + client->ps.pm_flags |= PMF_NO_PREDICTION; + } + + // No prediction on a rope + if ( rope_grabbed ) + { + client->ps.pm_flags |= PMF_NO_PREDICTION | PMF_NO_GRAVITY; + } + + if ( !groundentity ) + { + client->ps.speed = airspeed; + } + else if ( getMoveType() == MOVETYPE_NOCLIP || ( waterlevel > 1 ) ) + { + client->ps.speed = 200; + } + else + { + client->ps.speed = animspeed; + } + + if ( getMoveType() == MOVETYPE_NOCLIP ) + { + if ( last_ucmd.buttons & BUTTON_RUN ) + client->ps.speed = 200; + else + client->ps.speed = 50; + } + + if ( + client->ps.feetfalling && + ( !rope_grabbed ) && + ( waterlevel < 2 ) && + !( client->ps.pm_time ) + ) + { + ucmd->forwardmove = 0; + ucmd->rightmove = 0; + } + if ( fakePlayer_active ) + { + ucmd->forwardmove = 0; + ucmd->rightmove = 0; + ucmd->upmove = 0; + } + + client->ps.gravity = sv_gravity->value * gravity; + + // FIXME + // do this a better way + if ( ( movecontrol != MOVECONTROL_HANGING ) && ( movecontrol != MOVECONTROL_ABSOLUTE ) && + ( movecontrol != MOVECONTROL_WALLHUG ) && ( movecontrol != MOVECONTROL_MONKEYBARS ) && + ( movecontrol != MOVECONTROL_PIPECRAWL ) && ( movecontrol != MOVECONTROL_STEPUP ) && + ( movecontrol != MOVECONTROL_PIPEHANG ) && + ( movecontrol != MOVECONTROL_PUSH ) && ( movecontrol != MOVECONTROL_CLIMBWALL ) ) + { + Vector oldpos( origin ); + qboolean standing; + + CheckGround(); + + //FIXME + // There's probably a better way to do this + // this assumes we are moving less than 5 units per second or about 3 inches per second + if ( client->ps.walking && ( getMoveType() != MOVETYPE_NOCLIP ) && ( velocity == vec_zero ) && ( animspeed < 5 ) ) + { + // pretend that we can really move + client->ps.speed = 200; + + standing = qtrue; + + Vector oldvel( velocity ); + + SetMoveInfo( &pm, ucmd ); + Pmove( &pm ); + GetMoveInfo( &pm ); + + client->ps.speed = animspeed; + + // save off origin + velocity = oldvel; + VectorCopy( velocity, client->ps.velocity ); + } + else + { + standing = qfalse; + + SetMoveInfo( &pm, ucmd ); + Pmove( &pm ); + GetMoveInfo( &pm ); + } + + ProcessPmoveEvents( pm.pmoveEvent ); + + // if we're not moving, set the blocked flag in case the user is trying to move + if ( ( ucmd->forwardmove || ucmd->rightmove ) && ( ( oldpos - origin ).length() < 0.01f ) ) + { + moveresult = MOVERESULT_BLOCKED; + } + if ( standing && client->ps.walking && !client->ps.feetfalling ) + { + setOrigin( oldpos ); + VectorCopy( origin, client->ps.origin ); + } + } + else + { + //FIXME + // should collect objects to touch against + memset( &pm, 0, sizeof( pmove_t ) ); + + // keep the command time up to date or else the next PMove we run will try to catch up + client->ps.commandTime = ucmd->serverTime; + + velocity = vec_zero; + } + + if ( movecontrol == MOVECONTROL_WALLHUG ) + { + trace_t trace; + + Vector end( origin - yaw_forward * 18.0f ); + + trace = G_Trace( origin, mins, maxs, end, this, MASK_DEADSOLID, true, "ClientMove" ); + if ( !trace.allsolid && ( trace.fraction < 1.0f ) ) + { + v_angle.y = Vector( trace.plane.normal ).toYaw(); + angles.y = v_angle.y; + setAngles( angles ); + setOrigin( ( yaw_forward * 0.1f ) + trace.endpos ); + } + } + + if ( ( getMoveType() == MOVETYPE_NOCLIP ) || !( client->ps.pm_flags & PMF_NO_PREDICTION ) ) + { + total_delta = vec_zero; + } + else + { + if ( ( movecontrol == MOVECONTROL_ABSOLUTE ) || ( movecontrol == MOVECONTROL_HANGING ) || + ( movecontrol == MOVECONTROL_WALLHUG ) || ( movecontrol == MOVECONTROL_STEPUP ) || ( movecontrol == MOVECONTROL_CLIMBWALL ) ) + { + velocity = vec_zero; + } + + if ( total_delta != vec_zero ) + { + MatrixTransformVector( total_delta, orientation, move ); + if ( ( movecontrol == MOVECONTROL_PUSH ) && atobject && atobject->isSubclassOf( PushObject ) ) + { + ( ( PushObject * )( Entity * )atobject )->Push( this, move ); + // move the player right up to the object + StartPush(); + } + else + { + CheckMove( move, &origin ); + setOrigin( origin ); + CheckGround(); + } + } + } + + total_delta = vec_zero; + + TouchStuff( &pm ); + + if ( ( whereami->integer ) && ( origin != oldorigin ) ) + { + gi.DPrintf( "x %8.2f y%8.2f z %8.2f area %2d\n", origin[ 0 ], origin[ 1 ], origin[ 2 ], edict->areanum ); + } + } + +/* +============== +ClientThink + +This will be called once for each client frame, which will +usually be a couple times for each server frame. +============== +*/ +void Player::ClientThink + ( + Event *ev + ) + + { + // sanity check the command time to prevent speedup cheating + if ( current_ucmd->serverTime > level.inttime ) + { + // + // we don't want any future commands, these could be from the previous game + // + return; + } + + if ( current_ucmd->serverTime < level.inttime - 1000 ) + { + current_ucmd->serverTime = level.inttime - 1000; + } + + if ( ( current_ucmd->serverTime - client->ps.commandTime ) < 1 ) + { + return; + } + + last_ucmd = *current_ucmd; + new_buttons = current_ucmd->buttons & ~buttons; + buttons = current_ucmd->buttons; + + if ( level.intermissiontime ) + { + client->ps.pm_flags |= PMF_FROZEN; + + // can exit intermission after five seconds + if ( level.time > level.intermissiontime ) + { + if ( deathmatch->integer ) + { + if ( new_buttons & BUTTON_ANY ) + { + level.exitintermission = true; + } + } + else + { + level.exitintermission = true; + } + } + + // Save cmd angles so that we can get delta angle movements next frame + client->cmd_angles[ 0 ] = SHORT2ANGLE( current_ucmd->angles[ 0 ] ); + client->cmd_angles[ 1 ] = SHORT2ANGLE( current_ucmd->angles[ 1 ] ); + client->cmd_angles[ 2 ] = SHORT2ANGLE( current_ucmd->angles[ 2 ] ); + + return; + } + + moveresult = MOVERESULT_NONE; + + if ( !vehicle || !vehicle->Drive( current_ucmd ) ) + { + ClientMove( current_ucmd ); + } + + // only evaluate the state when not noclipping + if ( getMoveType() == MOVETYPE_NOCLIP ) + { + // force the stand animation if were in noclip + SetAnim( "idle", all ); + } + else + { + // set flags for state machine + CheckMoveFlags(); + EvaluateState(); + + if ( groundentity && groundentity->entity && groundentity->entity->isSubclassOf( Actor ) ) + { + Event *event = new Event( EV_Actor_Push ); + event->AddVector( Vector( 0, 0, -10 ) ); + groundentity->entity->PostEvent( event, 0 ); + } + } + + oldvelocity = velocity; + old_v_angle = v_angle; + + // clear out rope_touch flag after evalutating the state + rope_touch = NULL; + + // If we're dying, check for respawn + if ( ( deadflag == DEAD_DEAD && ( level.time > respawn_time ) ) ) + { + // wait for any button just going down + if ( new_buttons || ( DM_FLAG( DF_FORCE_RESPAWN ) ) ) + { + G_PlayerDied( 1 ); + } + } + + // Save cmd angles so that we can get delta angle movements next frame + client->cmd_angles[ 0 ] = SHORT2ANGLE( current_ucmd->angles[ 0 ] ); + client->cmd_angles[ 1 ] = SHORT2ANGLE( current_ucmd->angles[ 1 ] ); + client->cmd_angles[ 2 ] = SHORT2ANGLE( current_ucmd->angles[ 2 ] ); + + if ( g_logstats->integer ) + { + if ( !logfile_started ) + { + ProcessEvent( EV_Player_LogStats ); + logfile_started = qtrue; + } + } + } + +void Player::LoadStateTable + ( + void + ) + + { + statemap_Legs = NULL; + statemap_Torso = NULL; + + legs_conditionals.FreeObjectList(); + torso_conditionals.FreeObjectList(); + + statemap_Legs = GetStatemap( str( g_statefile->string ) + "_Legs.st", ( Condition * )Conditions, &legs_conditionals, true ); + statemap_Torso = GetStatemap( str( g_statefile->string ) + "_Torso.st", ( Condition * )Conditions, &torso_conditionals, true ); + + animdone_Legs = false; + animdone_Torso = false; + + movecontrol = MOVECONTROL_USER; + + currentState_Legs = statemap_Legs->FindState( "STAND" ); + currentState_Torso = statemap_Torso->FindState( "STAND" ); + + str legsAnim( currentState_Legs->getLegAnim( *this, &legs_conditionals ) ); + if ( legsAnim == "" ) + { + partAnim[ legs ] = ""; + ClearLegsAnim(); + } + else if ( legsAnim != "none" ) + { + SetAnim( legsAnim, legs ); + } + + str torsoAnim( currentState_Torso->getTorsoAnim( *this, &torso_conditionals ) ); + if ( torsoAnim == "" ) + { + partAnim[ torso ] = ""; + ClearTorsoAnim(); + } + else if ( torsoAnim != "none" ) + { + SetAnim( torsoAnim.c_str(), torso ); + } + + movecontrol = currentState_Legs->getMoveType(); + if ( ( movecontrol < ( sizeof( MoveStartFuncs ) / sizeof( MoveStartFuncs[ 0 ] ) ) ) && ( MoveStartFuncs[ movecontrol ] ) ) + { + ( this->*MoveStartFuncs[ movecontrol ] )(); + } + + SetViewAngles( v_angle ); + } + +void Player::ResetState + ( + Event *ev + ) + + { + if ( rope_grabbed ) + { + rope_grabbed->Release( this ); + } + + movecontrol = MOVECONTROL_USER; + LoadStateTable(); + } + +void Player::StartHang + ( + void + ) + + { + Vector hand; + trace_t trace; + float ang; + float ledgeheight; + + if ( ( ledgeheight_right <= MIN_Z ) || ( ledgeheight_left <= MIN_Z ) ) + { + return; + } + + ledgeheight = max( ledgeheight_left, ledgeheight_right ); + + hand = righthand_pos - origin; + if ( ledgeheight > origin.z ) + { + origin.z = ledgeheight - hand.z - 1.0f; + } + + Vector start( origin.x, origin.y, hand.z - 2.0f + origin.z ); + Vector end( start + yaw_forward * 24.0f ); + + start -= yaw_forward * 8.0f; + + trace = G_Trace( start, min_box_8x8, max_box_8x8, end, this, MASK_DEADSOLID, true, "StartHang" ); + if ( trace.fraction == 1.0f ) + { + return; + } + + ang = vectoyaw( trace.plane.normal ) - 180; + + end = origin + yaw_forward * 8.0f; + start = origin - yaw_forward * 1.0f; + trace = G_Trace( start, mins, maxs, end, this, MASK_DEADSOLID, true, "StartHang" ); + if ( trace.fraction == 1.0f ) + { + return; + } + + v_angle.y = ang; + SetViewAngles( v_angle ); + angles.y = ang; + setAngles( angles ); + setOrigin( trace.endpos - yaw_forward * 0.4f ); + } + +void Player::StartPickup + ( + void + ) + + { + Vector start; + Vector end; + trace_t trace; + Actor *act; + Vector dir; + Vector new_angles; + + if ( WeaponsOut() ) + { + if ( !pickup_enemy ) + { + // put away our weapons + SafeHolster( qtrue ); + pickup_enemy = true; + } + return; + } + + pickup_enemy = false; + + start = origin + Vector( 0, 0, 32 ); + end = start + yaw_forward * 64.0f; + trace = G_Trace( start, vec_zero, vec_zero, end, this, MASK_PLAYERSOLID, true, "StartPickup" ); + + if ( trace.ent && trace.ent->entity && ( trace.ent->entity != world ) && trace.ent->entity->isSubclassOf( Actor ) ) + { + act = (Actor *)trace.ent->entity; + + if ( act->name == "Shgliek" ) + { + // Make sure are turned towards Shgliek + dir = act->centroid - centroid; + new_angles = dir.toAngles(); + + angles[YAW] = new_angles[YAW]; + + setAngles( angles ); + SetViewAngles( angles ); + } + } + } + +void Player::StartPush + ( + void + ) + + { + trace_t trace; + Vector end( origin + yaw_forward * 64.0f ); + + trace = G_Trace( origin, mins, maxs, end, this, MASK_SOLID, true, "StartPush" ); + if ( trace.fraction == 1.0f ) + { + return; + } + v_angle.y = vectoyaw( trace.plane.normal ) - 180; + SetViewAngles( v_angle ); + + setOrigin( trace.endpos - yaw_forward * 0.4f ); + } + +void Player::StartClimbWall + ( + void + ) + + { + trace_t trace; + Vector end( origin + yaw_forward * 20.0f ); + + trace = G_Trace( origin, mins, maxs, end, this, MASK_SOLID, true, "StartClimbWall" ); + if ( ( trace.fraction == 1.0f ) || !( trace.surfaceFlags & SURF_LADDER ) ) + { + return; + } + + v_angle.y = vectoyaw( trace.plane.normal ) - 180; + SetViewAngles( v_angle ); + + setOrigin( trace.endpos - yaw_forward * 0.4f ); + } + +void Player::StartUseAnim + ( + void + ) + + { + UseAnim *ua; + Vector neworg; + Vector newangles; + str newanim; + str state; + str camera; + trace_t trace; + + if ( toucheduseanim ) + { + ua = ( UseAnim * )( Entity * )toucheduseanim; + } + else if ( atobject ) + { + ua = ( UseAnim * )( Entity * )atobject; + } + else + { + return; + } + + useitem_in_use = ua; + toucheduseanim = NULL; + atobject = NULL; + + if ( ua->GetInformation( this, &neworg, &newangles, &newanim, &useanim_numloops, &state, &camera ) ) + { + trace = G_Trace( origin, mins, maxs, neworg, this, MASK_PLAYERSOLID, true, "StartUseAnim" ); + if ( trace.startsolid || ( trace.fraction < 1.0f ) ) + { + gi.DPrintf( "Move to UseAnim was blocked.\n" ); + } + + if ( !trace.startsolid ) + { + setOrigin( trace.endpos ); + } + + setAngles( newangles ); + v_angle.y = newangles.y; + SetViewAngles( v_angle ); + + movecontrol = MOVECONTROL_ABSOLUTE; + + if ( state.length() ) + { + State * newState; + + newState = statemap_Torso->FindState( state ); + if ( newState ) + { + EvaluateState( newState ); + } + else + { + gi.DPrintf( "Could not find state %s on UseAnim\n", state.c_str() ); + } + } + else + { + if ( currentState_Torso ) + { + if ( camera.length() ) + { + currentState_Torso->setCameraType( camera ); + } + else + { + currentState_Torso->setCameraType( "behind" ); + } + } + SetAnim( newanim, legs ); + } + } + } + +void Player::StartLoopUseAnim + ( + void + ) + + { + useanim_numloops--; + } + +void Player::FinishUseAnim + ( + Event *ev + ) + + { + UseAnim *ua; + + if ( !useitem_in_use ) + return; + + ua = ( UseAnim * )( Entity * )useitem_in_use; + ua->TriggerTargets( this ); + useitem_in_use = NULL; + } + +void Player::SetupUseObject + ( + void + ) + + { + UseObject *uo; + Vector neworg; + Vector newangles; + str state; + trace_t trace; + + if ( atobject ) + { + uo = ( UseObject * )( Entity * )atobject; + } + else + { + return; + } + + useitem_in_use = uo; + + uo->Setup( this, &neworg, &newangles, &state ); + { + trace = G_Trace( neworg, mins, maxs, neworg, this, MASK_PLAYERSOLID, true, "SetupUseObject - 1" ); + if ( trace.startsolid || trace.allsolid ) + { + trace = G_Trace( origin, mins, maxs, neworg, this, MASK_PLAYERSOLID, true, "SetupUseObject - 2" ); + if ( trace.startsolid || ( trace.fraction < 1.0f ) ) + { + gi.DPrintf( "Move to UseObject was blocked.\n" ); + } + } + + if ( !trace.startsolid ) + { + setOrigin( trace.endpos ); + } + + setAngles( newangles ); + v_angle.y = newangles.y; + SetViewAngles( v_angle ); + + movecontrol = MOVECONTROL_ABSOLUTE; + + if ( state.length() ) + { + State * newState; + + newState = statemap_Torso->FindState( state ); + if ( newState ) + { + EvaluateState( newState ); + } + else + { + gi.DPrintf( "Could not find state %s on UseObject\n", state.c_str() ); + } + } + } + } + +void Player::StartUseObject + ( + Event *ev + ) + + { + UseObject *uo; + + if ( !useitem_in_use ) + return; + + uo = ( UseObject * )( Entity * )useitem_in_use; + uo->Start(); + } + +void Player::FinishUseObject + ( + Event *ev + ) + + { + UseObject *uo; + + if ( !useitem_in_use ) + return; + + uo = ( UseObject * )( Entity * )useitem_in_use; + uo->Stop( this ); + useitem_in_use = NULL; + } + +void Player::PickupShgliek + ( + Event *ev + ) + + { + Vector start; + Vector end; + trace_t trace; + Actor *act; + int tag_num; + + start = origin + Vector( 0, 0, 32 ); + end = start + yaw_forward * 64.0f; + trace = G_Trace( start, mins, maxs, end, this, MASK_PLAYERSOLID, true, "PickupShgliek" ); + + if ( trace.ent && trace.ent->entity && ( trace.ent->entity != world ) && trace.ent->entity->isSubclassOf( Actor ) ) + { + act = (Actor *)trace.ent->entity; + + if ( act->name == "Shgliek" ) + { + // Pickup the Shgliek + + tag_num = gi.Tag_NumForName( edict->s.modelindex, "TAG_WEAPON_RIGHT" ); + act->setAngles( Vector( 0, 0, 0 ) ); + act->attach( entnum, tag_num ); + act->SetAnim( "neckhold" ); + act->StartMode( ACTOR_MODE_AI ); + have_shgliek = true; + } + } + } + +void Player::ThrowShgliek + ( + Event *ev + ) + + { + int i; + int num; + Entity *child; + Actor *act; + int tag_num; + Vector pos; + Vector forward; + Vector shgliek_angles; + Vector torso_angles; + trace_t trace; + + + have_shgliek = false; + + for ( i=0,num = numchildren; i < MAX_MODEL_CHILDREN; i++ ) + { + if ( children[i] == ENTITYNUM_NONE ) + { + continue; + } + + child = ( Entity * )G_GetEntity( children[i] ); + + if ( child->isSubclassOf( Actor ) ) + { + act = (Actor *)child; + + if ( ( act->name == "Shgliek" ) || ( act->name == "Partially Evil Shgliek" ) || ( act->name == "Evil Shgliek" ) ) + { + // Make sure it is not in a solid right now + + trace = G_Trace( act->origin, act->mins, act->maxs, act->origin, this, MASK_MONSTERSOLID, false, "throwshgliek" ); + + if ( !trace.startsolid && !trace.allsolid ) + { + act->detach(); + + // Make it so the shgliek will not get stuck on the player when thrown + + act->setSolidType( SOLID_BBOX ); + + // Make the Shgliek face the same way as the player + + torso_angles = GetTorsoAngles(); + + torso_angles[PITCH] = 0; + torso_angles[ROLL] = 0; + + act->setAngles( torso_angles ); + + // Throw the shgliek a little ways + + act->groundentity = NULL; + + tag_num = gi.Tag_NumForName( edict->s.modelindex, "TAG_WEAPON_RIGHT" ); + GetTag( tag_num, &pos, &forward ); + + shgliek_angles = forward.toAngles(); + + shgliek_angles[YAW] = torso_angles[YAW]; + + shgliek_angles.AngleVectors( &forward ); + + act->velocity = forward * 500; + } + else + { + have_shgliek = true; + } + } + } + + num--; + + if ( !num ) + break; + } + } + +void Player::StartPipeCrawl + ( + void + ) + + { + trace_t trace; + float ang; + float dist; + Vector pos; + float horizang; + + if ( !horizontalpipe ) + { + return; + } + + // + // make sure the correct pm_flags get set for the CheckGround call + // + if ( movecontrol == MOVECONTROL_PIPECRAWL ) + { + client->ps.pm_flags |= PMF_NO_PREDICTION | PMF_LEGS_LIFTED; + } + + // + // this ensures that our boudning boxes are correct + // + CheckGround(); + + Vector end( origin.x, origin.y, righthand_pos.z + 1 - maxs.z ); + + trace = G_Trace( origin, mins, maxs, end, this, MASK_DEADSOLID, true, "StartPipeCrawl" ); + setOrigin( trace.endpos ); + + horizang = ( ( HorizontalPipe * )( Entity * )horizontalpipe )->dir; + ang = AngleSubtract( v_angle.y, horizang ); + if ( Q_fabs( ang ) > 90.0f ) + { + v_angle.y = horizang + 180.0f; + } + else + { + v_angle.y = horizang; + } + + SetViewAngles( v_angle ); + + pos = origin - horizontalpipe->centroid; + dist = pos * yaw_left; + + setOrigin( origin - yaw_left * dist ); + } + +void Player::StartMonkeyBars + ( + void + ) + + { + trace_t trace; + Vector oldang( v_angle ); + + if ( monkeybar_right <= MIN_Z ) + { + return; + } + + Vector end( origin.x, origin.y, monkeybar_right - ( righthand_pos.z - origin.z ) ); + + trace = G_Trace( origin, mins, maxs, end, this, MASK_DEADSOLID, true, "StartMonkeyBars" ); + setOrigin( trace.endpos ); + + //v_angle[ YAW ] = monkeybar_dir; + v_angle[ YAW ] = ( int )( anglemod( v_angle[ YAW ] + 45.0f ) / 90.0f ) * 90.0f; + SetViewAngles( v_angle ); + + if ( !CheckMove( vec_zero ) ) + { + SetViewAngles( oldang ); + } + } + +void Player::StartStepUp + ( + void + ) + + { + Vector delta; + Vector end( origin + yaw_forward * 24.0f ); + trace_t trace; + + gi.Anim_Delta( edict->s.modelindex, edict->s.anim & ANIM_MASK, delta ); + animheight = delta.z + origin.z; + + trace = G_Trace( origin, mins, maxs, end, this, MASK_DEADSOLID, true, "StartStepUp" ); + + v_angle.y = vectoyaw( trace.plane.normal ) - 180; + SetViewAngles( v_angle ); + setOrigin( trace.endpos ); + } + +void Player::StepUp + ( + Event *ev + ) + + { + float ledgeheight; + trace_t trace; + + ledgeheight = max( ledgeheight_left, ledgeheight_right ); + if ( ledgeheight > animheight ) + { + Vector end( origin ); + + end.z += ledgeheight - animheight; + trace = G_Trace( origin, mins, maxs, end, this, MASK_DEADSOLID, true, "StartStepUp" ); + setOrigin( trace.endpos ); + } + } + +void Player::Turn + ( + Event *ev + ) + + { + float yaw; + Vector oldang( v_angle ); + + yaw = ev->GetFloat( 1 ); + + v_angle[ YAW ] = ( int )( anglemod( v_angle[ YAW ] ) / 22.5f ) * 22.5f; + SetViewAngles( v_angle ); + + if ( !CheckMove( vec_zero ) ) + { + SetViewAngles( oldang ); + return; + } + + CancelEventsOfType( EV_Player_TurnUpdate ); + + ev = new Event( EV_Player_TurnUpdate ); + ev->AddFloat( yaw / 5.0f ); + ev->AddFloat( 0.5f ); + ProcessEvent( ev ); + } + +void Player::TurnUpdate + ( + Event *ev + ) + + { + float yaw; + float timeleft; + Vector oldang( v_angle ); + + yaw = ev->GetFloat( 1 ); + timeleft = ev->GetFloat( 2 ); + timeleft -= 0.1f; + + if ( timeleft > 0 ) + { + ev = new Event( EV_Player_TurnUpdate ); + ev->AddFloat( yaw ); + ev->AddFloat( timeleft ); + PostEvent( ev, 0.1f ); + + v_angle[ YAW ] += yaw; + SetViewAngles( v_angle ); + } + else + { + v_angle[ YAW ] = ( int )( anglemod( v_angle[ YAW ] ) / 22.5f ) * 22.5f; + SetViewAngles( v_angle ); + } + + if ( !CheckMove( vec_zero ) ) + { + SetViewAngles( oldang ); + } + } + +void Player::TurnLegs + ( + Event *ev + ) + + { + float yaw; + + yaw = ev->GetFloat( 1 ); + + angles[ YAW ] += yaw; + setAngles( angles ); + } + +void Player::RopeRelease + ( + void + ) + + { + if ( rope_grabbed ) + { + rope_grabbed->Release( this ); + } + + movecontrol = MOVECONTROL_USER; + } + +void Player::RopeGrab + ( + void + ) + + { + if ( rope_touch && !rope_grabbed ) + { + // pass in origin offset + rope_touch->Grab( this, 28 + maxs.z - mins.z ); + } + + rope_touch = NULL; + movecontrol = MOVECONTROL_USER; + } + + +void Player::EvaluateState + ( + State *forceTorso, + State *forceLegs + ) + + { + int count; + State *laststate_Legs; + State *laststate_Torso; + State *startstate_Legs; + State *startstate_Torso; + movecontrol_t move; + + if ( getMoveType() == MOVETYPE_NOCLIP ) + { + return; + } + + // Evaluate the current state. + // When the state changes, we reevaluate the state so that if the + // conditions aren't met in the new state, we don't play one frame of + // the animation for that state before going to the next state. + startstate_Torso = laststate_Torso = currentState_Torso; + count = 0; + do + { + // since we could get into an infinite loop here, do a check + // to make sure we don't. + count++; + if ( count > 10 ) + { + gi.DPrintf( "Possible infinite loop in state '%s'\n", currentState_Torso->getName() ); + assert( 0 ); + if ( count > 20 ) + { + gi.Error( ERR_DROP, "Stopping due to possible infinite state loop\n" ); + break; + } + } + + laststate_Torso = currentState_Torso; + + if ( forceTorso ) + currentState_Torso = forceTorso; + else + currentState_Torso = currentState_Torso->Evaluate( *this, &torso_conditionals ); + + animdone_Torso = false; + if ( movecontrol != MOVECONTROL_LEGS ) + { + animdone_Legs = false; + } + if ( laststate_Torso != currentState_Torso ) + { + // Process exit commands of the last state + laststate_Torso->ProcessExitCommands( this ); + + // Process entry commands of the new state + currentState_Torso->ProcessEntryCommands( this ); + + if ( waitForState.length() && ( !waitForState.icmpn( currentState_Torso->getName(), waitForState.length() ) ) ) + { + waitForState = ""; + PlayerDone( NULL ); + } + + move = currentState_Torso->getMoveType(); + + str legsAnim( currentState_Torso->getLegAnim( *this, &torso_conditionals ) ); + str torsoAnim( currentState_Torso->getTorsoAnim( *this, &torso_conditionals ) ); + + if ( legsAnim != "" ) + { + animdone_Legs = false; + SetAnim( legsAnim, legs ); + } + else if ( move == MOVECONTROL_LEGS ) + { + if ( !currentState_Legs ) + { + animdone_Legs = false; + currentState_Legs = statemap_Legs->FindState( "STAND" ); + + legsAnim = currentState_Legs->getLegAnim( *this, &legs_conditionals ); + if ( legsAnim == "" ) + { + partAnim[ legs ] = ""; + ClearLegsAnim(); + } + else if ( legsAnim != "none" ) + { + SetAnim( legsAnim, legs ); + } + } + } + else + { + partAnim[ legs ] = ""; + ClearLegsAnim(); + } + + if ( torsoAnim == "" ) + { + partAnim[ torso ] = ""; + ClearTorsoAnim(); + } + else if ( torsoAnim != "none" ) + { + SetAnim( torsoAnim.c_str(), torso ); + } + + if ( movecontrol != move ) + { + movecontrol = move; + if ( ( move < ( sizeof( MoveStartFuncs ) / sizeof( MoveStartFuncs[ 0 ] ) ) ) && ( MoveStartFuncs[ move ] ) ) + { + ( this->*MoveStartFuncs[ move ] )(); + } + } + + SetViewAngles( v_angle ); + } + } + while( laststate_Torso != currentState_Torso ); + + // Evaluate the current state. + // When the state changes, we reevaluate the state so that if the + // conditions aren't met in the new state, we don't play one frame of + // the animation for that state before going to the next state. + startstate_Legs = laststate_Legs = currentState_Legs; + if ( movecontrol == MOVECONTROL_LEGS ) + { + count = 0; + do + { + // since we could get into an infinite loop here, do a check + // to make sure we don't. + count++; + if ( count > 10 ) + { + gi.DPrintf( "Possible infinite loop in state '%s'\n", currentState_Legs->getName() ); + assert( 0 ); + if ( count > 20 ) + { + gi.Error( ERR_DROP, "Stopping due to possible infinite state loop\n" ); + break; + } + } + + if ( !currentState_Legs ) + { + currentState_Legs = statemap_Legs->FindState( "STAND" ); + } + + laststate_Legs = currentState_Legs; + + if ( forceLegs ) + currentState_Legs = forceLegs; + else + currentState_Legs = currentState_Legs->Evaluate( *this, &legs_conditionals ); + + animdone_Legs = false; + if ( laststate_Legs != currentState_Legs ) + { + // Process exit commands of the last state + laststate_Legs->ProcessExitCommands( this ); + + // Process entry commands of the new state + currentState_Legs->ProcessEntryCommands( this ); + + if ( waitForState.length() && ( !waitForState.icmpn( currentState_Legs->getName(), waitForState.length() ) ) ) + { + waitForState = ""; + PlayerDone( NULL ); + } + + str legsAnim( currentState_Legs->getLegAnim( *this, &legs_conditionals ) ); + if ( legsAnim == "" ) + { + partAnim[ legs ] = ""; + ClearLegsAnim(); + } + else if ( legsAnim != "none" ) + { + SetAnim( legsAnim, legs ); + } + } + } + while( laststate_Legs != currentState_Legs ); + } + else + { + currentState_Legs = NULL; + } + + if ( g_showplayeranim->integer ) + { + if ( last_leg_anim_name != AnimName( legs ) ) + { + gi.DPrintf( "Legs change from %s to %s\n", last_leg_anim_name.c_str(), AnimName( legs ) ); + last_leg_anim_name = AnimName( legs ); + } + + if ( last_torso_anim_name != AnimName( torso ) ) + { + gi.DPrintf( "Torso change from %s to %s\n", last_torso_anim_name.c_str(), AnimName( torso ) ); + last_torso_anim_name = AnimName( torso ); + } + } + + if ( g_showplayerstate->integer ) + { + if ( startstate_Legs != currentState_Legs ) + { + gi.DPrintf( "Legs change from %s to %s\n", + startstate_Legs ? startstate_Legs->getName() : "NULL", + currentState_Legs ? currentState_Legs->getName() : "NULL" ); + } + + if ( startstate_Torso != currentState_Torso ) + { + gi.DPrintf( "Torso change from %s to %s\n", + startstate_Torso ? startstate_Torso->getName() : "NULL", + currentState_Torso ? currentState_Torso->getName() : "NULL" ); + } + } + + // This is so we don't remember pain when we change to a state that has a PAIN condition + pain = 0; + // Every second drop accumulated pain by 1 + if ( ( float )( int )( level.time ) == level.time ) + { + accumulated_pain -= 1; + if ( accumulated_pain < 0 ) + accumulated_pain = 0; + } + } + +void Player::EventUseItem + ( + Event *ev + ) + + { + const char *name; + weaponhand_t hand = WEAPON_RIGHT; + + if ( deadflag ) + { + return; + } + + name = ev->GetString( 1 ); + + Item *item = ( Item * )FindItem( name ); + + if ( item && item->isSubclassOf( InventoryItem ) ) + { + InventoryItem *ii = ( InventoryItem * )item; + Event *ev1; + + ev1 = new Event( EV_InventoryItem_Use ); + ev1->AddEntity( this ); + ii->ProcessEvent( ev1 ); + } + else if ( ev->NumArgs() > 1 ) + { + hand = WeaponHandNameToNum( ev->GetString( 2 ) ); + useWeapon( name, hand ); + } + } + +void Player::GiveWeaponCheat + ( + Event *ev + ) + + { + giveItem( ev->GetString( 1 ) ); + } + +void Player::GiveCheat + ( + Event *ev + ) + + { + str name; + + if ( deadflag ) + { + return; + } + + name = ev->GetString( 1 ); + + if ( !name.icmp( "all" ) ) + { + GiveAllCheat( ev ); + return; + } + EventGiveItem( ev ); + } + +void Player::GiveAllCheat + ( + Event *ev + ) + + { + char *buffer; + char *buf; + char com_token[MAX_STRING_CHARS]; + + if ( deadflag ) + { + return; + } + + if ( gi.FS_ReadFile( "global/giveall.scr", ( void ** )&buf, qtrue ) != -1 ) + { + buffer = buf; + while ( 1 ) + { + strcpy( com_token, COM_ParseExt( &buffer, qtrue ) ); + + if (!com_token[0]) + break; + + // Create the event + ev = new Event( com_token ); + + // get the rest of the line + while( 1 ) + { + strcpy( com_token, COM_ParseExt( &buffer, qfalse ) ); + if (!com_token[0]) + break; + + ev->AddToken( com_token ); + } + + this->ProcessEvent( ev ); + } + gi.FS_FreeFile( buf ); + } + } + +void Player::GodCheat + ( + Event *ev + ) + + { + const char *msg; + + if ( ev->NumArgs() > 0 ) + { + if ( ev->GetInteger( 1 ) ) + { + flags |= FL_GODMODE; + } + else + { + flags &= ~FL_GODMODE; + } + } + else + { + flags ^= FL_GODMODE; + } + + if ( ev->GetSource() == EV_FROM_CONSOLE ) + { + if ( !( flags & FL_GODMODE ) ) + { + msg = "godmode OFF\n"; + } + else + { + msg = "godmode ON\n"; + } + + gi.SendServerCommand( edict-g_entities, "print \"%s\"", msg ); + } + } + +void Player::Kill + ( + Event *ev + ) + + { + if ( ( level.time - respawn_time ) < 5 ) + { + return; + } + + flags &= ~FL_GODMODE; + health = 1; + Damage( this, this, 10, origin, vec_zero, vec_zero, 0, DAMAGE_NO_PROTECTION, MOD_SUICIDE ); + } + +void Player::NoTargetCheat + ( + Event *ev + ) + + { + const char *msg; + + flags ^= FL_NOTARGET; + if ( !( flags & FL_NOTARGET ) ) + { + msg = "notarget OFF\n"; + } + else + { + msg = "notarget ON\n"; + } + + gi.SendServerCommand( edict-g_entities, "print \"%s\"", msg ); + } + +void Player::NoclipCheat + ( + Event *ev + ) + + { + const char *msg; + + if ( vehicle ) + { + msg = "Must exit vehicle first\n"; + } + else if ( getMoveType() == MOVETYPE_NOCLIP ) + { + setMoveType( MOVETYPE_WALK ); + msg = "noclip OFF\n"; + + // reset the state machine so that her animations are correct + ResetState( NULL ); + } + else + { + if ( rope_grabbed ) + { + rope_grabbed->Release( this ); + } + + client->ps.feetfalling = false; + movecontrol = MOVECONTROL_USER; + + setMoveType( MOVETYPE_NOCLIP ); + msg = "noclip ON\n"; + } + + gi.SendServerCommand( edict-g_entities, "print \"%s\"", msg ); + } + +void Player::GameVersion + ( + Event *ev + ) + + { + gi.SendServerCommand( edict-g_entities, "print \"%s : %s\n\"", GAMEVERSION, __DATE__ ); + } + +void Player::SetFov + ( + float newFov + ) + + { + fov = newFov; + + if ( ( fov < 90 ) && DM_FLAG( DF_FIXED_FOV ) ) + { + fov = 90; + return; + } + + if ( fov < 1 ) + { + fov = 90; + } + else if ( fov > 160 ) + { + fov = 160; + } + } + +void Player::Fov + ( + Event *ev + ) + + { + if ( ev->NumArgs() < 1 ) + { + gi.SendServerCommand( edict-g_entities, "print \"Fov = %d\n\"", fov ); + return; + } + + SetFov( ev->GetFloat( 1 ) ); + } + +/* +=============== +CalcRoll + +=============== +*/ +float Player::CalcRoll + ( + void + ) + + { + float sign; + float side; + float value; + Vector l; + + angles.AngleVectors( NULL, &l, NULL ); + side = velocity * l; + sign = side < 0 ? 4 : -4; + side = fabs( side ); + + value = sv_rollangle->value; + + if ( side < sv_rollspeed->value ) + { + side = side * value / sv_rollspeed->value; + } + else + { + side = value; + } + + return side * sign; + } + +void Player::GravityNodes + ( + void + ) + + { + Vector grav; + Vector gravnorm; + Vector velnorm; + float dot; + qboolean force; + float max_speed; + Vector new_velocity; + + // + // Check for gravity pulling points + // + + // no pull during waterjumps + if ( client->ps.pm_flags & PMF_TIME_WATERJUMP ) + { + return; + } + + grav = gravPathManager.CalculateGravityPull( *this, origin, &force, &max_speed ); + + // Check for unfightable gravity. + if ( force && grav != vec_zero ) + { + velnorm = velocity; + velnorm.normalize(); + + gravnorm = grav; + gravnorm.normalize(); + + dot = gravnorm.x * velnorm.x + gravnorm.y * velnorm.y + gravnorm.z * velnorm.z; + + // This prevents the player from trying to swim upstream + if ( dot < 0 ) + { + float tempdot; + Vector tempvec; + + tempdot = 0.2f - dot; + tempvec = velocity * tempdot; + velocity = velocity - tempvec; + } + } + + if ( grav != vec_zero ) + { + new_velocity = velocity + grav; + + if ( new_velocity.length() < velocity.length() ) + { + // Is slowing down, defintely need to apply grav + velocity = new_velocity; + } + else if ( velocity.length() < max_speed ) + { + // Applay grav + + velocity = new_velocity; + + // Make sure we aren't making the player go too fast + + if ( velocity.length() > max_speed ) + { + velocity.normalize(); + velocity *= max_speed; + } + } + else + { + // Going too fast but still want to pull the player up if any z velocity in grav + + grav.x = 0; + grav.y = 0; + + velocity = velocity + grav; + } + } + } + +// +// PMove Events +// +void Player::ProcessPmoveEvents + ( + int event + ) + + { + float damage; + + switch( event ) + { + case EV_NONE: + break; + case EV_FALL_SHORT: + break; + case EV_FALL_MEDIUM: + case EV_FALL_FAR: + case EV_FALL_FATAL: + if ( event == EV_FALL_FATAL ) + { + damage = 1000; + } + else if ( event == EV_FALL_FAR ) + { + damage = 20; + } + else + { + damage = 5; + } + if ( !DM_FLAG( DF_NO_FALLING ) ) + { + Damage( world, world, ( int )damage, origin, vec_zero, vec_zero, 0, DAMAGE_NO_ARMOR, MOD_FALLING ); + } + break; + case EV_TERMINAL_VELOCITY: + Sound( "snd_fall", CHAN_VOICE ); + break; + + case EV_WATER_TOUCH: // foot touches + if ( watertype & CONTENTS_LAVA ) + { + Sound( "snd_burn", CHAN_LOCAL ); + } + else + { + Animate *water; + trace_t trace; + Vector start; + float scale; + + Sound( "impact_playersplash", CHAN_AUTO ); + + // Find the correct place to put the splash + + start = origin + Vector(0, 0, 90); + trace = G_Trace( start, vec_zero, vec_zero, origin, NULL, MASK_WATER, false, "ProcessPmoveEvents" ); + + // Figure out a good scale for the splash + + scale = 1 + ( velocity[2] + 400 ) / -1500; + + if ( scale < 1 ) + scale = 1; + else if ( scale > 1.5 ) + scale = 1.5; + + // Spawn in a water splash + + water = new Animate; + + water->setOrigin( trace.endpos ); + water->setModel( "fx_splashsmall.tik" ); + water->setScale( scale ); + water->RandomAnimate( "idle" ); + water->PostEvent( EV_Remove, 5 ); + + } + break; + case EV_WATER_LEAVE: // foot leaves + Sound( "impact_playerleavewater", CHAN_AUTO ); + break; + case EV_WATER_UNDER: // head touches + Sound( "impact_playersubmerge", CHAN_AUTO ); + break; + case EV_WATER_CLEAR: // head leaves + Sound( "snd_gasp", CHAN_LOCAL ); + break; + } + } + +/* +============= +WorldEffects +============= +*/ +void Player::WorldEffects + ( + void + ) + + { + if ( deadflag == DEAD_DEAD ) + { + // if we are dead, no world effects + return; + } + + if ( movetype == MOVETYPE_NOCLIP ) + { + // don't need air + air_finished = level.time + 20; + return; + } + + // + // Check for earthquakes + // + if ( groundentity && ( level.earthquake > level.time ) ) + { +// velocity[ 0 ] += G_CRandom( EARTHQUAKE_STRENGTH * level.earthquake_magnitude ); +// velocity[ 1 ] += G_CRandom( EARTHQUAKE_STRENGTH * level.earthquake_magnitude ); +// velocity[ 2 ] += G_Random( EARTHQUAKE_STRENGTH * 1.5f * level.earthquake_magnitude ); + } + // + // check for on fire + // + if ( on_fire ) + { + if ( next_painsound_time < level.time ) + { + next_painsound_time = level.time + 4; + Sound( "snd_onfire", CHAN_LOCAL ); + } + } + + // + // check for lava + // + if ( watertype & CONTENTS_LAVA ) + { + if ( next_drown_time < level.time ) + { + next_drown_time = level.time + 0.2f; + Damage( world, world, 10 * waterlevel, origin, vec_zero, vec_zero, 0, DAMAGE_NO_ARMOR, MOD_LAVA ); + } + if ( next_painsound_time < level.time ) + { + next_painsound_time = level.time + 3; + Sound( "snd_burned", CHAN_LOCAL ); + } + } + + // + // check for slime + // + if ( watertype & CONTENTS_SLIME ) + { + if ( next_drown_time < level.time ) + { + next_drown_time = level.time + 0.4f; + Damage( world, world, 7 * waterlevel, origin, vec_zero, vec_zero, 0, DAMAGE_NO_ARMOR, MOD_SLIME ); + } + if ( next_painsound_time < level.time ) + { + next_painsound_time = level.time + 5; + Sound( "snd_burned", CHAN_LOCAL ); + } + } + + // + // check for drowning + // + if ( waterlevel == 3 ) + { + // if out of air, start drowning + if ( ( air_finished < level.time ) && !( flags & FL_GODMODE ) ) + { + // drown! + if ( next_drown_time < level.time && health > 0 ) + { + next_drown_time = level.time + 1; + + // take more damage the longer underwater + drown_damage += 2; + if ( drown_damage > 15 ) + { + drown_damage = 15; + } + + // play a gurp sound instead of a normal pain sound + if ( health <= drown_damage ) + { + Sound( "snd_drown", CHAN_LOCAL ); + BroadcastSound(); + } + else if ( rand() & 1 ) + { + Sound( "snd_choke", CHAN_LOCAL ); + BroadcastSound(); + } + else + { + Sound( "snd_choke", CHAN_LOCAL ); + BroadcastSound(); + } + + Damage( world, world, drown_damage, origin, vec_zero, vec_zero, 0, DAMAGE_NO_ARMOR, MOD_DROWN ); + } + } + } + else + { + air_finished = level.time + 20; + drown_damage = 2; + } + + // If on a rope, increase gravity on the player +// if ( rope_grabbed ) +// { +// velocity.z += -1250 * level.frametime; +// } + + GravityNodes(); + + old_waterlevel = waterlevel; + } + +/* +============= +AddBlend +============= +*/ +void Player::AddBlend + ( + float r, + float g, + float b, + float a + ) + + { + float a2; + float a3; + + if ( a <= 0 ) + { + return; + } + + // new total alpha + a2 = blend[ 3 ] + ( 1 - blend[ 3 ] ) * a; + + // fraction of color from old + a3 = blend[ 3 ] / a2; + + blend[ 0 ] = blend[ 0 ] * a3 + r * ( 1 - a3 ); + blend[ 1 ] = blend[ 1 ] * a3 + g * ( 1 - a3 ); + blend[ 2 ] = blend[ 2 ] * a3 + b * ( 1 - a3 ); + blend[ 3 ] = a2; + } + +/* +============= +CalcBlend +============= +*/ +void Player::CalcBlend + ( + void + ) + + { + int contents; + Vector vieworg; + + client->ps.stats[STAT_ADDFADE] =0; + blend[ 0 ] = blend[ 1 ] = blend[ 2 ] = blend[ 3 ] = 0; + + // add for contents + vieworg = origin; + vieworg[ 2 ] += viewheight; + + contents = gi.pointcontents( vieworg, 0 ); + + if ( contents & CONTENTS_SOLID ) + { + // Outside of world + //AddBlend( 0.8, 0.5, 0.0, 0.2 ); + } + else if ( contents & CONTENTS_LAVA ) + { + AddBlend( level.lava_color[0], level.lava_color[1], level.lava_color[2], level.lava_alpha ); + } + else if ( contents & CONTENTS_WATER ) + { + AddBlend( level.water_color[0], level.water_color[1], level.water_color[2], level.water_alpha ); + } + + // add for damage + if ( damage_alpha > 0 ) + { + AddBlend( damage_blend[ 0 ], damage_blend[ 1 ], damage_blend[ 2 ], damage_alpha ); + + // drop the damage value + damage_alpha -= 0.06; + if ( damage_alpha < 0 ) + { + damage_alpha = 0; + } + client->ps.blend[0] = blend[0]; + client->ps.blend[1] = blend[1]; + client->ps.blend[2] = blend[2]; + client->ps.blend[3] = blend[3]; + } + + // Do the cinematic fading + float alpha=1; + + level.m_fade_time -= level.frametime; + + // Return if we are completely faded in + if ( ( level.m_fade_time <= 0 ) && ( level.m_fade_type == fadein ) ) + { + client->ps.blend[3] = 0 + damage_alpha; + return; + } + + // If we are faded out, and another fade out is coming in, then don't bother + if ( ( level.m_fade_time_start > 0 ) && ( level.m_fade_type == fadeout ) ) + { + if ( client->ps.blend[3] >= 1 ) + return; + } + + if ( level.m_fade_time_start > 0 ) + alpha = level.m_fade_time / level.m_fade_time_start; + + if ( level.m_fade_type == fadeout ) + alpha = 1.0f - alpha; + + if ( alpha < 0 ) + alpha = 0; + + if ( alpha > 1 ) + alpha = 1; + + if ( level.m_fade_style == additive ) + { + client->ps.blend[0] = level.m_fade_color[0] * level.m_fade_alpha * alpha; + client->ps.blend[1] = level.m_fade_color[1] * level.m_fade_alpha * alpha; + client->ps.blend[2] = level.m_fade_color[2] * level.m_fade_alpha * alpha; + client->ps.blend[3] = level.m_fade_alpha * alpha; + client->ps.stats[STAT_ADDFADE] = 1; + } + else + { + client->ps.blend[0] = level.m_fade_color[0]; + client->ps.blend[1] = level.m_fade_color[1]; + client->ps.blend[2] = level.m_fade_color[2]; + client->ps.blend[3] = level.m_fade_alpha * alpha; + client->ps.stats[STAT_ADDFADE] = 0; + } + } + +/* +=============== +P_DamageFeedback + +Handles color blends and view kicks +=============== +*/ + +void Player::DamageFeedback + ( + void + ) + + { + float realcount; + float count; + + // if we are dead, don't setup any feedback + if ( health <= 0 ) + { + damage_count = 0; + damage_blood = 0; + damage_alpha = 0; + VectorClear( damage_angles ); + return; + } + +#define DAMAGE_MAX_PITCH_SCALE 0.3f +#define DAMAGE_MAX_YAW_SCALE 0.3f + + if ( damage_blood > damage_count ) + { + float pitch_delta; + float yaw_delta; + + damage_angles = damage_from.toAngles(); + pitch_delta = AngleDelta( angles.x, damage_angles.x ) / 90.0f; + yaw_delta = AngleDelta( angles.y, damage_angles.y ) / 90.0f; + + if ( pitch_delta > DAMAGE_MAX_PITCH_SCALE ) + pitch_delta = DAMAGE_MAX_PITCH_SCALE; + else if ( pitch_delta < -DAMAGE_MAX_PITCH_SCALE ) + pitch_delta = -DAMAGE_MAX_PITCH_SCALE; + + if ( yaw_delta > DAMAGE_MAX_YAW_SCALE ) + yaw_delta = DAMAGE_MAX_YAW_SCALE; + else if ( yaw_delta < -DAMAGE_MAX_YAW_SCALE ) + yaw_delta = -DAMAGE_MAX_YAW_SCALE; + + damage_angles[ PITCH ] = pitch_delta; + damage_angles[ ROLL ] = yaw_delta; + damage_count = damage_blood * 2.0f; + } + + if ( damage_count ) + { + // decay damage_count over time + damage_count *= 0.90f; + if ( damage_count < 0.1f ) + damage_count = 0; + + } + + // total points of damage shot at the player this frame + if ( !damage_blood ) + { + // didn't take any damage + return; + } + + count = damage_blood; + realcount = count; + if ( count < 10 ) + { + // always make a visible effect + count = 10; + } + + // the total alpha of the blend is always proportional to count + if ( damage_alpha < 0 ) + { + damage_alpha = 0; + } + + damage_alpha += count * 0.001; + if ( damage_alpha < 0.2 ) + { + damage_alpha = 0.2; + } + if ( damage_alpha > 0.6 ) + { + // don't go too saturated + damage_alpha = 0.6; + } + + // the color of the blend will vary based on how much was absorbed + // by different armors + damage_blend = vec_zero; + if ( damage_blood ) + { + damage_blend += ( damage_blood / realcount ) * bcolor; + } + + // + // clear totals + // + damage_blood = 0; + } + +void Player::GetPlayerView + ( + Vector *pos, + Vector *angle + ) + + { + if ( pos ) + { + *pos = origin; + pos->z += viewheight; + } + + if ( angle ) + { + *angle = Vector( client->ps.viewangles ); + } + } + +void Player::SetPlayerView + ( + Camera *camera, + Vector position, + float cameraoffset, + Vector ang, + Vector vel, + float camerablend[ 4 ], + float camerafov + ) + + { + client->ps.viewangles[ 0 ] = ang[ 0 ]; + client->ps.viewangles[ 1 ] = ang[ 1 ]; + client->ps.viewangles[ 2 ] = ang[ 2 ]; + + client->ps.viewheight = cameraoffset; + + client->ps.origin[ 0 ] = position[ 0 ]; + client->ps.origin[ 1 ] = position[ 1 ]; + client->ps.origin[ 2 ] = position[ 2 ]; + + client->ps.velocity[ 0 ] = vel[ 0 ]; + client->ps.velocity[ 1 ] = vel[ 1 ]; + client->ps.velocity[ 2 ] = vel[ 2 ]; + + /* + client->ps.blend[ 0 ] = camerablend[ 0 ]; + client->ps.blend[ 1 ] = camerablend[ 1 ]; + client->ps.blend[ 2 ] = camerablend[ 2 ]; + client->ps.blend[ 3 ] = camerablend[ 3 ]; + */ + + client->ps.fov = camerafov; + + if ( camera ) + { + client->ps.camera_angles[ 0 ] = camera->angles[ 0 ]; + client->ps.camera_angles[ 1 ] = camera->angles[ 1 ]; + client->ps.camera_angles[ 2 ] = camera->angles[ 2 ]; + + client->ps.camera_origin[ 0 ] = camera->origin[ 0 ]; + client->ps.camera_origin[ 1 ] = camera->origin[ 1 ]; + client->ps.camera_origin[ 2 ] = camera->origin[ 2 ]; + client->ps.pm_flags |= PMF_CAMERA_VIEW; + + // + // clear out the flags, but preserve the CF_CAMERA_CUT_BIT + // + client->ps.camera_flags = client->ps.camera_flags & CF_CAMERA_CUT_BIT; + } + else + { + client->ps.pm_flags &= ~PMF_CAMERA_VIEW; + // + // make sure the third person camera is setup correctly. + // + + if ( getMoveType() != MOVETYPE_NOCLIP ) + { + qboolean do_cut; + int camera_type; + + camera_type = currentState_Torso->getCameraType(); + if ( last_camera_type != camera_type ) + { + // + // clear out the flags, but preserve the CF_CAMERA_CUT_BIT + // + client->ps.camera_flags = client->ps.camera_flags & CF_CAMERA_CUT_BIT; + do_cut = qtrue; + switch( camera_type ) + { + case CAMERA_TOPDOWN: + client->ps.camera_flags |= CF_CAMERA_ANGLES_IGNORE_PITCH; + client->ps.camera_offset[ PITCH ] = -75; + client->ps.camera_flags |= CF_CAMERA_ANGLES_ALLOWOFFSET; + do_cut = qfalse; + break; + case CAMERA_FRONT: + client->ps.camera_flags |= CF_CAMERA_ANGLES_IGNORE_PITCH; + client->ps.camera_flags |= CF_CAMERA_ANGLES_ALLOWOFFSET; + client->ps.camera_offset[ YAW ] = 180; + client->ps.camera_offset[ PITCH ] = 0; + break; + case CAMERA_SIDE: + client->ps.camera_flags |= CF_CAMERA_ANGLES_IGNORE_PITCH; + client->ps.camera_flags |= CF_CAMERA_ANGLES_ALLOWOFFSET; + // randomly invert the YAW + if ( G_Random( 1 ) > 0.5f ) + { + client->ps.camera_offset[ YAW ] = -90; + } + else + { + client->ps.camera_offset[ YAW ] = 90; + } + client->ps.camera_offset[ PITCH ] = 0; + break; + case CAMERA_SIDE_LEFT: + client->ps.camera_flags |= CF_CAMERA_ANGLES_IGNORE_PITCH; + client->ps.camera_flags |= CF_CAMERA_ANGLES_ALLOWOFFSET; + client->ps.camera_offset[ YAW ] = 90; + client->ps.camera_offset[ PITCH ] = 0; + break; + case CAMERA_SIDE_RIGHT: + client->ps.camera_flags |= CF_CAMERA_ANGLES_IGNORE_PITCH; + client->ps.camera_flags |= CF_CAMERA_ANGLES_ALLOWOFFSET; + client->ps.camera_offset[ YAW ] = -90; + client->ps.camera_offset[ PITCH ] = 0; + break; + case CAMERA_BEHIND_FIXED: + do_cut = qfalse; + client->ps.camera_offset[ YAW ] = 0; + client->ps.camera_offset[ PITCH ] = 0; + client->ps.camera_flags |= CF_CAMERA_ANGLES_ALLOWOFFSET; + break; + case CAMERA_BEHIND_NOPITCH: + do_cut = qfalse; + client->ps.camera_flags |= CF_CAMERA_ANGLES_IGNORE_PITCH; + client->ps.camera_offset[ YAW ] = 0; + client->ps.camera_offset[ PITCH ] = 0; + break; + case CAMERA_BEHIND: + do_cut = qfalse; + client->ps.camera_offset[ YAW ] = 0; + client->ps.camera_offset[ PITCH ] = 0; + break; + default: + do_cut = qfalse; + client->ps.camera_offset[ YAW ] = 0; + client->ps.camera_offset[ PITCH ] = 0; + break; + } + last_camera_type = camera_type; + if ( do_cut ) + CameraCut(); + } + } + + // + // these are explicitly not cleared so that when the client lerps it still has the last + // camera position for reference. Additionally this causes no extra hits to the network + // traffic. + // + //VectorClear( client->ps.camera_angles ); + //VectorClear( client->ps.camera_origin ); + } + +#define EARTHQUAKE_SCREENSHAKE_PITCH 2 +#define EARTHQUAKE_SCREENSHAKE_YAW 2 +#define EARTHQUAKE_SCREENSHAKE_ROLL 3 + + if ( level.earthquake > level.time ) + { + client->ps.damage_angles[ PITCH ] = G_CRandom() * level.earthquake_magnitude * EARTHQUAKE_SCREENSHAKE_PITCH; + client->ps.damage_angles[ YAW ] = G_CRandom() * level.earthquake_magnitude * EARTHQUAKE_SCREENSHAKE_YAW; + client->ps.damage_angles[ ROLL ] = G_CRandom() * level.earthquake_magnitude * EARTHQUAKE_SCREENSHAKE_ROLL; + } + else if ( damage_count ) + { + client->ps.damage_angles[ PITCH ] = damage_angles[ PITCH ] * damage_count; + client->ps.damage_angles[ ROLL ] = damage_angles[ ROLL ] * damage_count; + } + else + { + VectorClear( client->ps.damage_angles ); + } + } + +void Player::SetupView + ( + void + ) + + { + // if we currently are not in a camera or the camera we are looking through is automatic, evaluate our camera choices + + if ( actor_to_watch || actor_camera ) + { + Vector dir; + Vector watch_angles; + float dist = 0; + Vector focal_point; + Vector left; + trace_t trace; + qboolean delete_actor_camera = false; + Vector camera_mins; + Vector camera_maxs; + + if ( actor_to_watch ) + { + dir = actor_to_watch->origin - origin; + dist = dir.length(); + } + + // See if we still want to watch this actor + + if ( !actor_to_watch || dist > 150 || actor_to_watch->deadflag ) + { + delete_actor_camera = true; + } + else + { + // Create the camera if we don't have one yet + + if ( !actor_camera ) + { + actor_camera = new Camera(); + + if ( G_Random() < .5 ) + { + actor_camera_right = true; + starting_actor_camera_right = true; + } + else + { + actor_camera_right = false; + starting_actor_camera_right = false; + } + } + + // Setup the new position of the actor camera + + // Go a little above the view height + + actor_camera->origin = origin; + actor_camera->origin[2] += DEFAULT_VIEWHEIGHT + 10; + + // Find the focal point ( either the actor's watch offset or top of the bounding box) + + if ( actor_to_watch->watch_offset != vec_zero ) + { + MatrixTransformVector( actor_to_watch->watch_offset, actor_to_watch->orientation, focal_point ); + focal_point += actor_to_watch->origin; + } + else + { + focal_point = actor_to_watch->origin; + focal_point[2] = actor_to_watch->maxs[2]; + } + + // Shift the camera back just a little + + dir = focal_point - actor_camera->origin; + dir.normalize(); + actor_camera->origin -= dir * 15; + + // Shift the camera a little to the left or right + + watch_angles = dir.toAngles(); + watch_angles.AngleVectors( NULL, &left ); + + if ( actor_camera_right ) + actor_camera->origin -= left * 15; + else + actor_camera->origin += left * 15; + + // Make sure this camera position is ok + + camera_mins = "-5 -5 -5"; + camera_maxs = "5 5 5"; + + trace = G_Trace( actor_camera->origin, camera_mins, camera_maxs, actor_camera->origin, actor_camera, MASK_DEADSOLID, false, "SetupView" ); + + if ( trace.startsolid ) + { + // Try other side + + if ( actor_camera_right == starting_actor_camera_right ) + { + if ( actor_camera_right ) + actor_camera->origin += left * 30; + else + actor_camera->origin -= left * 30; + + actor_camera_right = !actor_camera_right; + + trace = G_Trace( actor_camera->origin, camera_mins, camera_maxs, actor_camera->origin, actor_camera, MASK_DEADSOLID, false, "SetupView2" ); + + if ( trace.startsolid ) + { + // Both spots have failed stop doing actor camera + delete_actor_camera = true; + } + } + else + { + // Both spots have failed stop doing actor camera + delete_actor_camera = true; + } + } + + if ( !delete_actor_camera ) + { + // Set the camera's position + + actor_camera->setOrigin( actor_camera->origin ); + + // Set the camera's angles + + dir = focal_point - actor_camera->origin; + watch_angles = dir.toAngles(); + actor_camera->setAngles( watch_angles ); + + // Set this as our camera + + SetCamera( actor_camera, .5 ); + } + } + + if ( delete_actor_camera ) + { + // Get rid of this camera + + actor_to_watch = NULL; + + if ( actor_camera ) + { + delete actor_camera; + actor_camera = NULL; + SetCamera( NULL, .5 ); + } + } + } + else if ( ( level.automatic_cameras.NumObjects() > 0 ) && ( !camera || camera->IsAutomatic() ) ) + { + int i; + float score, bestScore; + Camera *cam, *bestCamera; + + bestScore = 999; + bestCamera = NULL; + for( i = 1; i <= level.automatic_cameras.NumObjects(); i++ ) + { + cam = level.automatic_cameras.ObjectAt( i ); + score = cam->CalculateScore( this, currentState_Torso->getName() ); + // if this is our current camera, scale down the score a bit to favor it. + if ( cam == camera ) + { + score *= 0.9f; + } + + if ( score < bestScore ) + { + bestScore = score; + bestCamera = cam; + } + } + if ( bestScore <= 1.0f ) + { + // we have a camera to switch to + if ( bestCamera != camera ) + { + float time; + + if ( camera ) + { + camera->AutomaticStop( this ); + } + time = bestCamera->AutomaticStart( this ); + SetCamera( bestCamera, time ); + } + } + else + { + // we don't have a camera to switch to + if ( camera ) + { + float time; + + time = camera->AutomaticStop( this ); + SetCamera( NULL, time ); + } + } + } + // If there is no camera, use the player's view + if ( !camera ) + { + SetPlayerView( NULL, origin, viewheight, v_angle, velocity, blend, fov ); + } + else + { + SetPlayerView( camera, origin, viewheight, v_angle, velocity, blend, camera->Fov() ); + } + } + +/* +================== +SwingAngles +================== +*/ +void Player::SwingAngles + ( + float destination, + float swingTolerance, + float clampTolerance, + float speed, + float *angle, + qboolean *swinging + ) + + { + float swing; + float move; + float scale; + + if ( !*swinging ) + { + // see if a swing should be started + swing = AngleSubtract( *angle, destination ); + if ( swing > swingTolerance || swing < -swingTolerance ) + { + *swinging = qtrue; + // we intentionally return so that we can start the animation before turning + return; + } + } + + if ( !*swinging ) + { + return; + } + + // modify the speed depending on the delta + // so it doesn't seem so linear + swing = AngleSubtract( destination, *angle ); + scale = fabs( swing ); + +#if 0 + if ( scale < swingTolerance * 0.5 ) + { + scale = 0.5; + } + else if ( scale < swingTolerance ) + { + scale = 1.0; + } + else + { + scale = 2.0; + } +#else + scale = 1.0f; +#endif + + // swing towards the destination angle + if ( swing >= 0 ) + { + move = level.frametime * scale * speed; + if ( move >= swing ) + { + move = swing; + *swinging = qfalse; + } + + *angle = AngleMod( *angle + move ); + } + else if ( swing < 0 ) + { + move = level.frametime * scale * -speed; + if ( move <= swing ) + { + move = swing; + *swinging = qfalse; + } + *angle = AngleMod( *angle + move ); + } + + // clamp to no more than tolerance + swing = AngleSubtract( destination, *angle ); + if ( swing > clampTolerance ) + { + *angle = AngleMod( destination - ( clampTolerance - 1 ) ); + } + else if ( swing < -clampTolerance ) + { + *angle = AngleMod( destination + ( clampTolerance - 1 ) ); + } + } + +void Player::SetHeadTarget + ( + Event *ev + ) + + { + str ht = ev->GetString( 1 ); + + head_target = G_FindTarget( 0, ht ); + } + +qboolean Player::GetTagPositionAndOrientation + ( + int tagnum, + orientation_t *new_or + ) + + { + int i; + orientation_t tag_or; + vec3_t axis[3]; + + tag_or = gi.Tag_OrientationEx( edict->s.modelindex, + CurrentAnim( legs ), + CurrentFrame( legs ), + tagnum & TAG_MASK, + edict->s.scale, + edict->s.bone_tag, + edict->s.bone_quat, + 0, + 0, + 1.0f, + ( edict->s.anim & ANIM_BLEND ) != 0, + ( edict->s.torso_anim & ANIM_BLEND ) != 0, + CurrentAnim( torso ), + CurrentFrame( torso ), + 0, + 0, + 1.0f + ); + + AnglesToAxis( angles, axis ); + VectorCopy( origin, new_or->origin ); + + for ( i=0; i<3; i++ ) + VectorMA( new_or->origin, tag_or.origin[i], axis[i], new_or->origin ); + + MatrixMultiply( tag_or.axis, axis, new_or->axis ); + return true; + } + +qboolean Player::GetTagPositionAndOrientation + ( + str tagname, + orientation_t *new_or + ) + + { + int tagnum; + + tagnum = gi.Tag_NumForName( edict->s.modelindex, tagname ); + + if ( tagnum < 0 ) + { + warning( "Player::GetTagPositionAndOrientation", "Could not find tag \"%s\"", tagname.c_str() ); + return false; + } + + return GetTagPositionAndOrientation( tagnum, new_or ); + } + +Vector Player::GetAngleToTarget + ( + Entity *ent, + str tag, + float yawclamp, + float pitchclamp, + Vector baseangles + ) + + { + assert( ent ); + + if ( ent ) + { + Vector delta,angs; + orientation_t tag_or; + + int tagnum = gi.Tag_NumForName( edict->s.modelindex, tag.c_str() ); + + if ( tagnum < 0 ) + return Vector( 0,0,0 ); + + GetTagPositionAndOrientation( tagnum, &tag_or ); + + delta = ent->centroid - tag_or.origin; + delta.normalize(); + + angs = delta.toAngles(); + + AnglesSubtract( angs, baseangles, angs ); + + angs[PITCH] = AngleNormalize180( angs[PITCH] ); + angs[YAW] = AngleNormalize180( angs[YAW] ); + + if ( angs[PITCH] > pitchclamp ) + angs[PITCH] = pitchclamp; + else if ( angs[PITCH] < -pitchclamp ) + angs[PITCH] = -pitchclamp; + + if ( angs[YAW] > yawclamp ) + angs[YAW] = yawclamp; + else if ( angs[YAW] < -yawclamp ) + angs[YAW] = -yawclamp; + + return angs; + } + else + { + return Vector( 0,0,0 ); + } + } + +void Player::DebugWeaponTags + ( + int controller_tag, + Weapon *weapon, + str weapon_tagname + ) + + { + int i; + orientation_t bone_or, tag_weapon_or, barrel_or, final_barrel_or; + + GetTagPositionAndOrientation( edict->s.bone_tag[controller_tag], &bone_or ); + //G_DrawCoordSystem( Vector( bone_or.origin ), Vector( bone_or.axis[0] ), Vector( bone_or.axis[1] ), Vector( bone_or.axis[2] ), 20 ); + + GetTagPositionAndOrientation( gi.Tag_NumForName( edict->s.modelindex, weapon_tagname ), &tag_weapon_or ); + //G_DrawCoordSystem( Vector( tag_weapon_or.origin ), Vector( tag_weapon_or.axis[0] ), Vector( tag_weapon_or.axis[1] ), Vector( tag_weapon_or.axis[2] ), 40 ); + + weapon->GetRawTag( "tag_barrel", &barrel_or ); + VectorCopy( tag_weapon_or.origin, final_barrel_or.origin ); + + for ( i = 0 ; i < 3 ; i++ ) + VectorMA( final_barrel_or.origin, barrel_or.origin[i], tag_weapon_or.axis[i], final_barrel_or.origin ); + + MatrixMultiply( barrel_or.axis, tag_weapon_or.axis, final_barrel_or.axis ); + //G_DrawCoordSystem( Vector( final_barrel_or.origin ), Vector( final_barrel_or.axis[0] ), Vector( final_barrel_or.axis[1] ), Vector( final_barrel_or.axis[2] ), 80 ); + + if ( g_crosshair->integer ) + { + trace_t trace; + Vector start,end,ang,dir,delta; + vec3_t mat[3]; + + AnglesToAxis( v_angle, mat ); + + dir = mat[0]; + start = final_barrel_or.origin; + end = start + ( dir * MAX_MAP_BOUNDS ); + + G_DrawCoordSystem( start, Vector( mat[0] ), Vector( mat[1] ), Vector( mat[2] ), 80 ); + + trace = G_Trace( start, vec_zero, vec_zero, end, this, MASK_PROJECTILE|MASK_WATER, qfalse, "Crosshair" ); + crosshair->setOrigin( trace.endpos ); + + delta = trace.endpos - start; + float length = delta.length(); + float scale = g_crosshair_maxscale->value * length / MAX_MAP_BOUNDS; + + if ( scale < 1 ) + scale = 1; + + crosshair->setScale( scale ); + + if ( trace.ent ) + { + vectoangles( trace.plane.normal, ang ); + } + else + { + vectoangles( dir, ang ); + } + + crosshair->setAngles( ang ); + } + } + +Vector Player::CalcArmTracking + ( + int controller_tag, + str weapon_tagname, + Vector baseAngles, + Entity *target, + Weapon *weapon + ) + + { + Vector forward, delta, angs; + orientation_t bone_or, tag_weapon_or, barrel_or, final_barrel_or; + int i; + + assert( target ); + + if ( !target ) + { + warning( "Player::CalcArmTracking", "NULL target for Arm Tracking." ); + return Vector( 0,0,0 ); + } + + GetTagPositionAndOrientation( edict->s.bone_tag[controller_tag], &bone_or ); + + if ( g_showautoaim->integer ) + G_DebugLine( bone_or.origin, bone_or.origin + Vector( bone_or.axis[0] ) * 200, 1,1,1,1 ); + + GetTagPositionAndOrientation( gi.Tag_NumForName( edict->s.modelindex, weapon_tagname ), &tag_weapon_or ); + + if ( g_showautoaim->integer ) + G_DebugLine( tag_weapon_or.origin, tag_weapon_or.origin + Vector( tag_weapon_or.axis[0] ) * 50, 1,0,0,1 ); + + if ( !weapon->GetRawTag( "tag_barrel", &barrel_or ) ) + { + warning( "Player::CalcArmTracking", "Could not find tag_barrel." ); + return Vector( 0,0,0 ); + } + + VectorCopy( tag_weapon_or.origin, final_barrel_or.origin ); + + for ( i = 0 ; i < 3 ; i++ ) + VectorMA( final_barrel_or.origin, barrel_or.origin[i], tag_weapon_or.axis[i], final_barrel_or.origin ); + + MatrixMultiply( barrel_or.axis, tag_weapon_or.axis, final_barrel_or.axis ); + + delta = target->centroid - final_barrel_or.origin; + delta.normalize(); + + angs = delta.toAngles(); + AnglesSubtract( angs, torsoAngles, angs ); + + if ( g_showautoaim->integer ) + G_DebugLine( final_barrel_or.origin, final_barrel_or.origin + Vector( final_barrel_or.axis[0] ) * 50, 0,0,1,1 ); + if ( g_showautoaim->integer ) + G_DebugLine( final_barrel_or.origin, target->centroid, 0,1,0,1 ); + + return angs; + } + + +void Player::AcquireTarget + ( + void + ) + + { + Weapon *weapon; + Vector offset; + vec3_t mat[3]; + Entity *new_target; + + AnglesToAxis( headAngles, mat ); + + if ( left_arm_target ) + { + left_arm_target->edict->s.eFlags &= ~EF_LEFT_TARGETED; + } + + if ( right_arm_target ) + { + right_arm_target->edict->s.eFlags &= ~EF_RIGHT_TARGETED; + } + + // Find a left hand target if the left hand weapon is an auto aim + weapon = GetActiveWeapon( WEAPON_LEFT ); + + if ( weapon && weapon->autoaim ) + { + offset = Vector( mat[1] ) * 25; + + if ( left_arm_target ) + { + new_target = FindEnemyInFOVFromTagWithOffset( 60, weapon->GetMaxRange(), L_ARM_NAME, offset ); + } + else + { + new_target = FindEnemyInFOVFromTagWithOffset( 40, weapon->GetMaxRange(), L_ARM_NAME, offset ); + } + + if ( new_target ) + { + left_arm_target = new_target; + left_arm_target->edict->s.eFlags |= EF_LEFT_TARGETED; + CancelEventsOfType( EV_Player_ClearLeftArmTarget ); + } + else + PostEvent( EV_Player_ClearLeftArmTarget, 1.0f ); + } + else + { + PostEvent( EV_Player_ClearLeftArmTarget, 1.0f ); + } + + // Find a right hand target ( might be the same one ) + weapon = GetActiveWeapon( WEAPON_RIGHT ); + + if ( weapon && weapon->autoaim ) + { + offset = Vector( mat[1] ) * -25; + + if ( right_arm_target ) + { + new_target = FindEnemyInFOVFromTagWithOffset( 60, weapon->GetMaxRange(), R_ARM_NAME, offset ); + } + else + { + new_target = FindEnemyInFOVFromTagWithOffset( 40, weapon->GetMaxRange(), R_ARM_NAME, offset ); + } + + if ( new_target ) + { + right_arm_target = new_target; + right_arm_target->edict->s.eFlags |= EF_RIGHT_TARGETED; + CancelEventsOfType( EV_Player_ClearRightArmTarget ); + } + else + { + PostEvent( EV_Player_ClearRightArmTarget, 1.0f ); + } + } + else + { + PostEvent( EV_Player_ClearRightArmTarget, 1.0f ); + } + } + +void Player::RemoveTarget + ( + Entity *ent_to_remove + ) + + { + if ( left_arm_target == ent_to_remove ) + { + left_arm_target->edict->s.eFlags &= ~EF_LEFT_TARGETED; + left_arm_target = NULL; + } + + if ( right_arm_target == ent_to_remove) + { + right_arm_target->edict->s.eFlags &= ~EF_RIGHT_TARGETED; + right_arm_target = NULL; + } + } + +void Player::AutoAim + ( + void + ) + + { + Weapon *weapon; + Vector newAimAngles; + + + if ( deadflag ) + return; + + // Check for targets in the FOV + AcquireTarget(); + + // Update Crosshair + weapon = GetActiveWeapon( WEAPON_DUAL ); + if ( crosshair ) + { + if ( g_crosshair->integer ) + { + if ( weapon && weapon->crosshair && !level.cinematic ) + { + // Update the position of the crosshair based on the attachment of the weapon + if ( weapon->dual_attachToTag == "tag_weapon_right" ) + DebugWeaponTags( R_ARM_TAG, weapon, "tag_weapon_right" ); + else + DebugWeaponTags( L_ARM_TAG, weapon, "tag_weapon_left" ); + + crosshair->showModel(); + } + else + { + crosshair->hideModel(); + } + } + else + { + crosshair->hideModel(); + } + } + + // Check for auto targeting on right side + weapon = GetActiveWeapon( WEAPON_RIGHT ); + + if ( weapon ) + { + DebugWeaponTags( R_ARM_TAG, weapon, "tag_weapon_right" ); + weapon->SetAimTarget( NULL ); + } + + if ( weapon && weapon->autoaim && right_arm_target ) + { + weapon->SetAimTarget( right_arm_target ); + + newAimAngles = CalcArmTracking( R_ARM_TAG, "tag_weapon_right", torsoAngles, right_arm_target, weapon ); + + // Clamp newAimAngles + if ( newAimAngles[YAW] > 30 ) + newAimAngles[YAW] = 30; + if ( newAimAngles[YAW] < -30 ) + newAimAngles[YAW] = -30; + if ( newAimAngles[PITCH] > 30 ) + newAimAngles[PITCH] = 30; + if ( newAimAngles[PITCH] < -30 ) + newAimAngles[PITCH] = -30; + + rightArmAimAngles[PITCH] = LerpAngle( rightArmAimAngles[PITCH], newAimAngles[PITCH], 0.5f ); + rightArmAimAngles[YAW] = LerpAngle( rightArmAimAngles[YAW], newAimAngles[YAW], 0.5f ); + } + else + { + rightArmAimAngles[PITCH] = LerpAngle( rightArmAimAngles[PITCH], 0, 0.5f ); + rightArmAimAngles[YAW] = LerpAngle( rightArmAimAngles[YAW], 0, 0.5f ); + } + + SetControllerAngles( R_ARM_TAG, rightArmAimAngles ); + + // Check for auto targeting on left side + weapon = GetActiveWeapon( WEAPON_LEFT ); + + if ( weapon ) + { + DebugWeaponTags( L_ARM_TAG, weapon, "tag_weapon_left" ); + weapon->SetAimTarget( NULL ); + } + + if ( weapon && weapon->autoaim && left_arm_target ) + { + weapon->SetAimTarget( left_arm_target ); + + newAimAngles = CalcArmTracking( L_ARM_TAG, "tag_weapon_left", torsoAngles, left_arm_target, weapon ); + // Clamp newAimAngles + if ( newAimAngles[YAW] > 30 ) + newAimAngles[YAW] = 30; + if ( newAimAngles[YAW] < -30 ) + newAimAngles[YAW] = -30; + if ( newAimAngles[PITCH] > 30 ) + newAimAngles[PITCH] = 30; + if ( newAimAngles[PITCH] < -30 ) + newAimAngles[PITCH] = -30; + + leftArmAimAngles[PITCH] = LerpAngle( leftArmAimAngles[PITCH], newAimAngles[PITCH], 0.5f ); + leftArmAimAngles[YAW] = LerpAngle( leftArmAimAngles[YAW], newAimAngles[YAW], 0.5f ); + } + else + { + leftArmAimAngles[PITCH] = LerpAngle( leftArmAimAngles[PITCH], 0, 0.5f ); + leftArmAimAngles[YAW] = LerpAngle( leftArmAimAngles[YAW], 0, 0.5f ); + } + + SetControllerAngles( L_ARM_TAG, leftArmAimAngles ); + } + +/* +=============== +PlayerAngles +=============== +*/ +void Player::PlayerAngles + ( + void + ) + + { + float deltayaw; + Vector moveangles; + float speed; + float yawAngle; + float speedscale; + vec3_t temp; + Vector dir; + Vector newAimAngles; + + // Adjust the angles of the player for attacking an enemy + // AdjustAnglesForAttack(); + + if ( gi.Anim_Flags( edict->s.modelindex, CurrentAnim( legs ) ) & MDL_ANIM_DEFAULT_ANGLES ) + { + SetControllerAngles( HEAD_TAG, vec_zero ); + SetControllerAngles( TORSO_TAG, vec_zero ); + setAngles( Vector( 0, v_angle.y, 0 ) ); + AutoAim(); + return; + } + + // set the head and torso directly + headAngles.setXYZ( v_angle.x, AngleMod( v_angle.y ), v_angle.z ); + torsoAngles.setXYZ( v_angle.x, AngleMod( v_angle.y ), v_angle.z ); + + dir = Vector( velocity.x, velocity.y, 0 ); + speed = VectorNormalize( dir ); + + // If moving, angle the legs toward the direction we are moving + if ( ( speed > 32 ) && groundentity && last_ucmd.forwardmove ) + { + speedscale = 3; + yawing = qtrue; // always center + deltayaw = AngleSubtract( dir.toYaw(), headAngles[ YAW ] ); + } + else + { + speedscale = 1; + deltayaw = 0; + } + + // --------- yaw ------------- + // Clamp to g_legclampangle + if ( fabs( deltayaw ) > 90 ) + deltayaw = AngleSubtract( deltayaw, 180 ); + + if ( deltayaw > g_legclampangle->value ) + deltayaw = g_legclampangle->value; + else if ( deltayaw < -g_legclampangle->value ) + deltayaw = -g_legclampangle->value; + + yawAngle = headAngles[ YAW ] + deltayaw; + + yawing_left = qfalse; + yawing_right = qfalse; + + if ( client->ps.walking && client->ps.groundPlane && ( movecontrol == MOVECONTROL_LEGS ) && + !last_ucmd.forwardmove && !last_ucmd.rightmove && ( client->ps.groundTrace.plane.normal[ 2 ] < SLOPE_22_MAX ) ) + { + float groundyaw; + float yawdelta; + + groundyaw = ( int )vectoyaw( client->ps.groundTrace.plane.normal ); + yawdelta = anglemod( v_angle.y - groundyaw ); + yawdelta = ( ( ( int )yawdelta + 45 ) / 90 ) * 90.0f; + angles.y = groundyaw + yawdelta; + } + else + { + // if purely strafing, don't swing the legs + if ( client->ps.walking && last_ucmd.rightmove && !last_ucmd.forwardmove ) + { + setAngles( Vector( 0, v_angle.y, 0 ) ); + } + else + { + SwingAngles( yawAngle, g_legtolerance->value, g_legclamptolerance->value, g_legswingspeed->value * speedscale, &angles[ YAW ], &yawing ); + if ( yawing ) + { + float swing; + swing = AngleSubtract( yawAngle, angles[ YAW ] ); + if ( swing > 0 ) + { + yawing_left = qtrue; + } + else + { + yawing_right = qtrue; + } + } + } + } + + // --------- pitch ------------- + + // only show a fraction of the pitch angle in the torso + if ( headAngles[ PITCH ] > 180 ) + { + torsoAngles[PITCH] = ( -360 + headAngles[ PITCH ] ) * 0.75; + } + else + { + torsoAngles[PITCH] = headAngles[ PITCH ] * 0.75; + } + + AcquireHeadTarget(); + + // Adjust head and torso angles for the target if needed + if ( head_target ) + { + //newAimAngles = GetAngleToTarget( head_target, "Bip01 Head", 60, 45, torsoAngles ); + newAimAngles = GetAngleToTarget( head_target, "Bip01 Head", 40, 30, torsoAngles ); + + headAimAngles[PITCH] = LerpAngle( headAimAngles[PITCH], newAimAngles[PITCH], 0.25f ); + headAimAngles[YAW] = LerpAngle( headAimAngles[YAW], newAimAngles[YAW], 0.25f ); + + torsoAimAngles[PITCH] = LerpAngle( torsoAimAngles[PITCH], 0, 0.5f ); + torsoAimAngles[YAW] = LerpAngle( torsoAimAngles[YAW], 0, 0.5f ); + } + else // Otherwise return to them to 0 + { + headAimAngles[PITCH] = LerpAngle( headAimAngles[PITCH], 0, 0.5f ); + headAimAngles[YAW] = LerpAngle( headAimAngles[YAW], 0, 0.1f ); + + torsoAimAngles[PITCH] = LerpAngle( torsoAimAngles[PITCH], 0, 0.5f ); + torsoAimAngles[YAW] = LerpAngle( torsoAimAngles[YAW], 0, 0.5f ); + } + + // pull the head angles back out of the hierarchial chain + AnglesSubtract( headAngles, torsoAngles, temp ); + + // Add in the aim angles for the head + VectorAdd( temp, headAimAngles, temp ); + + // Update the head controller + SetControllerAngles( HEAD_TAG, temp ); + + // pull the torso angles back out of the hierarchial chain + AnglesSubtract( torsoAngles, angles, temp ); + + // Add in the aim angles for the torso + VectorAdd( temp, torsoAimAngles, temp ); + + // Update the torso controller + SetControllerAngles( TORSO_TAG, temp ); + + // Auto aim for the arms + AutoAim(); + + // Set the rest (legs) + setAngles( angles ); + +// warning( "PlayerAngles", "head %.2f torso %.2f legs %.2f\n", headAngles.y, torsoAngles.y, angles.y ); + } + +void Player::FinishMove + ( + void + ) + + { + // + // If the origin or velocity have changed since ClientThink(), + // update the pmove values. This will happen when the client + // is pushed by a bmodel or kicked by an explosion. + // + // If it wasn't updated here, the view position would lag a frame + // behind the body position when pushed -- "sinking into plats" + // + if ( !( client->ps.pm_flags & PMF_FROZEN ) && !( client->ps.pm_flags & PMF_NO_MOVE )) + { + origin.copyTo( client->ps.origin ); + velocity.copyTo( client->ps.velocity ); + } + + if ( !( client->ps.pm_flags & PMF_FROZEN ) ) + { + PlayerAngles(); + } + + // burn from lava, etc + WorldEffects(); + + // determine the view offsets + DamageFeedback(); + CalcBlend(); + } + +void Player::StatCount + ( + int index, + int count + ) + + { + // If stat is going up + if ( oldstats[index] < count ) + { + oldstats[index] += count * level.frametime * 4; + + // Clamp + if ( oldstats[index] > count ) + { + oldstats[index] = count; + } + + client->ps.stats[index] = oldstats[index]; + } + else + { + client->ps.stats[index] = count; + } + } + +void Player::UpdateStats + ( + void + ) + + { + int i,count; + + // + // Health + // + if ( ( health < 1 ) && ( health > 0 ) ) + { + client->ps.stats[ STAT_HEALTH ] = 1; + } + else + { + client->ps.stats[ STAT_HEALTH ] = health; + } + + // + // if we just got full water or lost it, update our boots + // + if ( water_power >= MINIMUM_WATER_FOR_TURBO && client->ps.stats[STAT_WATER_LEVEL] < MINIMUM_WATER_FOR_TURBO ) + { + SurfaceCommand( "bootlights", "+skin1" ); + } + else if ( water_power < MINIMUM_WATER_FOR_TURBO && client->ps.stats[STAT_WATER_LEVEL] >= MINIMUM_WATER_FOR_TURBO ) + { + SurfaceCommand( "bootlights", "-skin1" ); + } + + client->ps.stats[ STAT_WATER_LEVEL ] = water_power; + //StatCount( STAT_WATER_LEVEL, water_power ); + + /* + if ( oldstats[STAT_WATER_LEVEL] != water_power ) + { + client->ps.stats[STAT_WATER_LEVEL] = 0; + oldstats[STAT_WATER_LEVEL] = water_power; + } + else + { + client->ps.stats[STAT_WATER_LEVEL] = water_power; + } + */ + + Weapon *leftweapon = GetActiveWeapon( WEAPON_LEFT ); + Weapon *rightweapon = GetActiveWeapon( WEAPON_RIGHT ); + Weapon *dualweapon = GetActiveWeapon( WEAPON_DUAL ); + + client->ps.stats[STAT_AMMO_LEFT] = 0; + client->ps.stats[STAT_AMMO_RIGHT] = 0; + client->ps.stats[STAT_CLIPAMMO_LEFT] = 0; + client->ps.stats[STAT_CLIPAMMO_RIGHT] = 0; + client->ps.stats[STAT_MAXAMMO_LEFT] = 0; + client->ps.stats[STAT_MAXAMMO_RIGHT] = 0; + client->ps.stats[STAT_MAXCLIPAMMO_LEFT] = 0; + client->ps.stats[STAT_MAXCLIPAMMO_RIGHT] = 0; + + client->ps.stats[ STAT_ACCUMULATED_PAIN] = accumulated_pain; + + client->ps.activeItems[ ITEM_NAME_AMMO_LEFT ] = -1; + client->ps.activeItems[ ITEM_NAME_AMMO_RIGHT ] = -1; + client->ps.activeItems[ ITEM_NAME_WEAPON_LEFT ] = -1; + client->ps.activeItems[ ITEM_NAME_WEAPON_RIGHT ] = -1; + client->ps.activeItems[ ITEM_NAME_WEAPON_DUAL ] = -1; + + + if ( leftweapon ) + { + client->ps.stats[STAT_AMMO_LEFT] = AmmoCount( leftweapon->GetAmmoType( FIRE_PRIMARY ) ); + client->ps.stats[STAT_MAXAMMO_LEFT] = MaxAmmoCount( leftweapon->GetAmmoType( FIRE_PRIMARY ) ); + client->ps.stats[STAT_CLIPAMMO_LEFT] = leftweapon->ClipAmmo( FIRE_PRIMARY ); + client->ps.stats[STAT_MAXCLIPAMMO_LEFT] = leftweapon->GetClipSize( FIRE_PRIMARY ); + client->ps.activeItems[ITEM_NAME_AMMO_LEFT] = AmmoIndex( leftweapon->GetAmmoType( FIRE_PRIMARY ) ); + client->ps.activeItems[ITEM_NAME_WEAPON_LEFT] = leftweapon->getIndex(); + } + if ( rightweapon ) + { + client->ps.stats[STAT_AMMO_RIGHT] = AmmoCount( rightweapon->GetAmmoType( FIRE_PRIMARY ) ); + client->ps.stats[STAT_MAXAMMO_RIGHT] = MaxAmmoCount( rightweapon->GetAmmoType( FIRE_PRIMARY ) ); + client->ps.stats[STAT_CLIPAMMO_RIGHT] = rightweapon->ClipAmmo( FIRE_PRIMARY ); + client->ps.stats[STAT_MAXCLIPAMMO_RIGHT] = rightweapon->GetClipSize( FIRE_PRIMARY ); + client->ps.activeItems[ITEM_NAME_AMMO_RIGHT] = AmmoIndex( rightweapon->GetAmmoType( FIRE_PRIMARY ) ); + client->ps.activeItems[ITEM_NAME_WEAPON_RIGHT] = rightweapon->getIndex(); + } + if ( dualweapon ) + { + // Left is PRIMARY + client->ps.stats[STAT_AMMO_LEFT] = AmmoCount( dualweapon->GetAmmoType( FIRE_PRIMARY ) ); + client->ps.stats[STAT_MAXAMMO_LEFT] = MaxAmmoCount( dualweapon->GetAmmoType( FIRE_PRIMARY ) ); + client->ps.stats[STAT_CLIPAMMO_LEFT] = dualweapon->ClipAmmo( FIRE_PRIMARY ); + client->ps.activeItems[ITEM_NAME_AMMO_LEFT] = AmmoIndex( dualweapon->GetAmmoType( FIRE_PRIMARY ) ); + // Right is AlTERNATE + client->ps.stats[STAT_AMMO_RIGHT] = AmmoCount( dualweapon->GetAmmoType( FIRE_ALTERNATE ) ); + client->ps.stats[STAT_MAXAMMO_RIGHT] = MaxAmmoCount( dualweapon->GetAmmoType( FIRE_ALTERNATE ) ); + client->ps.stats[STAT_CLIPAMMO_RIGHT] = dualweapon->ClipAmmo( FIRE_ALTERNATE ); + client->ps.activeItems[ITEM_NAME_AMMO_RIGHT] = AmmoIndex( dualweapon->GetAmmoType( FIRE_ALTERNATE ) ); + + client->ps.activeItems[ITEM_NAME_WEAPON_DUAL] = dualweapon->getIndex(); + } + + // + // set boss health + // + client->ps.stats[ STAT_BOSSHEALTH ] = bosshealth->value * 100.0f; + + if ( bosshealth->value * 100.0f > 0 && client->ps.stats[ STAT_BOSSHEALTH ] == 0 ) + client->ps.stats[ STAT_BOSSHEALTH ] = 1; + + // Set cinematic stuff + + client->ps.stats[ STAT_CINEMATIC ] = 0; + + if ( level.cinematic ) + client->ps.stats[ STAT_CINEMATIC ] = (1<<0); + + if ( actor_camera ) + client->ps.stats[ STAT_CINEMATIC ] += (1<<1); + + // Go through all the player's weapons and send over the indexes of the names + memset( client->ps.inventory_name_index, 0, sizeof( client->ps.inventory_name_index ) ); + + count = inventory.NumObjects(); + + assert( count < MAX_INVENTORY ); + if ( count > MAX_INVENTORY ) + { + gi.Error( ERR_DROP, "Player::UpdateStats : Exceeded MAX_ITEMS\n" ); + } + + for ( i=1; i<=count; i++ ) + { + int entnum = inventory.ObjectAt( i ); + Item *item = ( Item * )G_GetEntity( entnum ); + + if ( item ) + client->ps.inventory_name_index[i-1] = item->getIndex(); + } + + // Go through all the player's ammo and send over the names/amounts + memset( client->ps.ammo_amount, 0, sizeof( client->ps.ammo_amount ) ); + + count = ammo_inventory.NumObjects(); + + assert( count < MAX_AMMO ); + if ( count > MAX_AMMO ) + { + gi.Error( ERR_DROP, "Player::UpdateStats : Exceeded MAX_AMMO\n" ); + } + + for ( i=1; i<=count; i++ ) + { + Ammo *ammo = ammo_inventory.ObjectAt( i ); + + if ( ammo ) + { + client->ps.ammo_amount[i-1] = ammo->getAmount(); + client->ps.max_ammo_amount[i-1] = ammo->getMaxAmount(); + client->ps.ammo_name_index[i-1] = ammo->getIndex(); + } + } + + // Do letterbox + + // Check for letterbox fully out + if ( ( level.m_letterbox_time <= 0 ) && ( level.m_letterbox_dir == letterbox_in ) ) + { + client->ps.stats[STAT_LETTERBOX] = level.m_letterbox_fraction * MAX_LETTERBOX_SIZE; + return; + } + else if ( ( level.m_letterbox_time <= 0 ) && ( level.m_letterbox_dir == letterbox_out ) ) + { + client->ps.stats[STAT_LETTERBOX] = 0; + return; + } + + float frac; + + level.m_letterbox_time -= level.frametime; + + frac = level.m_letterbox_time / level.m_letterbox_time_start; + + if ( frac > 1 ) + frac = 1; + if ( frac < 0 ) + frac = 0; + + if ( level.m_letterbox_dir == letterbox_in ) + frac = 1.0f - frac; + + client->ps.stats[STAT_LETTERBOX] = ( frac * level.m_letterbox_fraction ) * MAX_LETTERBOX_SIZE; + } + +void Player::UpdateMusic + ( + void + ) + { + if ( music_forced ) + { + client->ps.current_music_mood = music_current_mood; + client->ps.fallback_music_mood = music_fallback_mood; + } + else if ( action_level > 30 ) + { + client->ps.current_music_mood = mood_action; + client->ps.fallback_music_mood = mood_normal; + } + else if ( action_level < 15 ) + { + client->ps.current_music_mood = music_current_mood; + client->ps.fallback_music_mood = music_fallback_mood; + } + + if (action_level > 0) + { + action_level -= level.fixedframetime * 2.0f; + if ( action_level > 80 ) + { + action_level = 80; + } + } + else + { + action_level = 0; + } + + // + // set the music + // naturally decay the action level + // + if ( s_debugmusic->integer ) + { + gi.DPrintf( "%s's action_level = %4.2f\n", client->pers.netname, action_level ); + } + + // Copy music volume and fade time to player state + client->ps.music_volume = music_current_volume; + client->ps.music_volume_fade_time = music_volume_fade_time; + } + +void Player::SetReverb + ( + int type, + float level + ) + + { + reverb_type = type; + reverb_level = level; + } + +void Player::SetReverb + ( + str type, + float level + ) + + { + reverb_type = EAXMode_NameToNum( type ); + reverb_level = level; + } + +void Player::SetReverb + ( + Event *ev + ) + { + if ( ev->NumArgs() < 2 ) + return; + + SetReverb( ev->GetInteger( 1 ), ev->GetFloat( 2 ) ); + } + +void Player::UpdateReverb + ( + void + ) + { + client->ps.reverb_type = reverb_type; + client->ps.reverb_level = reverb_level; + } + +void Player::EndAnim_Legs + ( + Event *ev + ) + + { + animdone_Legs = true; + SetAnimDoneEvent( EV_Player_AnimLoop_Legs, legs ); + EvaluateState(); + } + +void Player::EndAnim_Torso + ( + Event *ev + ) + + { + animdone_Torso = true; + SetAnimDoneEvent( EV_Player_AnimLoop_Torso, torso ); + EvaluateState(); + } + +void Player::SetAnim + ( + const char *anim, + bodypart_t part + ) + + { + assert( anim ); + + if ( ( part != all ) && ( partAnim[ part ] == anim ) ) + { + return; + } + + if ( ( part == all ) && ( partAnim[ legs ] == anim ) && ( partAnim[ torso ] == anim ) ) + { + return; + } + + if ( getMoveType() == MOVETYPE_NOCLIP ) + { + anim = "idle"; + } + + if ( part != all ) + { + partAnim[ part ] = anim; + } + else + { + partAnim[ legs ] = anim; + partAnim[ torso ] = anim; + } + + switch( part ) + { + default : + case all : + RandomAnimate( anim, EV_Player_AnimLoop_Legs, part ); + break; + + case legs : + RandomAnimate( anim, EV_Player_AnimLoop_Legs, part ); + break; + + case torso : + RandomAnimate( anim, EV_Player_AnimLoop_Torso, part ); + break; + } + + if ( ( part == legs ) || ( part == all ) ) + { + Vector animmove; + float time; + float len; + + time = gi.Anim_Time( edict->s.modelindex, CurrentAnim() ); + gi.Anim_Delta( edict->s.modelindex, CurrentAnim(), animmove ); + len = animmove.length(); + if ( len == 0 || time == 0 ) + { + animspeed = 0; + } + else + { + animspeed = len / time; + } + } + } + +void Player::UpdateSword + ( + Sword *sword + ) + + { + if ( GetWaterPower() >= sword->GetWaterRequired() ) + { + sword->SetPowerOn(); + } + else + { + sword->SetPowerOff(); + } + } + +void Player::CheckReloadWeapons + ( + void + ) + + { + Weapon *weap; + + weap = GetActiveWeapon( WEAPON_LEFT ); + if ( weap ) + { + weap->CheckReload( FIRE_PRIMARY ); + } + + weap = GetActiveWeapon( WEAPON_RIGHT ); + if ( weap ) + { + weap->CheckReload( FIRE_PRIMARY ); + } + + weap = GetActiveWeapon( WEAPON_DUAL ); + if ( weap ) + { + weap->CheckReload( FIRE_PRIMARY ); + weap->CheckReload( FIRE_ALTERNATE ); + } + } + +void Player::UpdateWeapons + ( + void + ) + + { + // Check for ammo reload and sword power + Weapon *weap; + Sword *sword; + + weap = GetActiveWeapon( WEAPON_LEFT ); + if ( weap ) + { + if ( weap->isSubclassOf( Sword ) ) + { + sword = ( Sword * )weap; + UpdateSword( sword ); + } + } + + weap = GetActiveWeapon( WEAPON_RIGHT ); + if ( weap ) + { + if ( weap->isSubclassOf( Sword ) ) + { + sword = ( Sword * )weap; + UpdateSword( sword ); + } + } + + weap = GetActiveWeapon( WEAPON_DUAL ); + if ( weap ) + { + if ( weap->isSubclassOf( Sword ) ) + { + sword = ( Sword * )weap; + UpdateSword( sword ); + } + } + } + +void Player::UpdateMisc + ( + void + ) + + { + // + // clear out the level exit flag + // + client->ps.pm_flags &= ~PMF_LEVELEXIT; + + // + // see if our camera is the level exit camera + // + if ( camera && camera->IsLevelExit() ) + { + client->ps.pm_flags |= PMF_LEVELEXIT; + } + else if ( level.near_exit ) + { + client->ps.pm_flags |= PMF_LEVELEXIT; + } + // + // do anything special for level exits + // + if ( client->ps.pm_flags & PMF_LEVELEXIT ) + { + // + // change music + // + if ( music_current_mood != mood_success ) + { + ChangeMusic( "success", "normal", false ); + } + } + } + +/* +================= +EndFrame + +Called for each player at the end of the server frame +and right after spawning +================= +*/ +void Player::EndFrame + ( + Event *ev + ) + + { + FinishMove(); + CheckReloadWeapons(); + UpdateStats(); + UpdateMusic(); + UpdateReverb(); + UpdateMisc(); + SetupView(); + } + +void Player::GibEvent + ( + Event *ev + ) + + { + qboolean hidemodel; + + hidemodel = !ev->GetInteger( 1 ); + + if ( com_blood->integer ) + { + if ( hidemodel ) + { + gibbed = true; + takedamage = DAMAGE_NO; + setSolidType( SOLID_NOT ); + hideModel(); + } + + CreateGibs( this, health, 0.75f, 3 ); + } + } + +void Player::GotKill + ( + Event *ev + ) + + { +/* + Entity *victim; + Entity *inflictor; + float damage; + int meansofdeath; + qboolean gibbed; + + if ( deathmatch->integer ) + { + return; + } + + victim = ev->GetEntity( 1 ); + damage = ev->GetInteger( 2 ); + inflictor = ev->GetEntity( 3 ); + meansofdeath = ev->GetInteger( 4 ); + gibbed = ev->GetInteger( 5 ); +*/ + } + +void Player::SetPowerupTimer + ( + Event *ev + ) + + { + Event *event; + + poweruptimer = ev->GetInteger( 1 ); + poweruptype = ev->GetInteger( 2 ); + event = new Event( EV_Player_UpdatePowerupTimer ); + PostEvent ( event, 1 ); + } + +void Player::UpdatePowerupTimer + ( + Event *ev + ) + + { + poweruptimer -= 1; + if ( poweruptimer > 0 ) + { + PostEvent( ev, 1 ); + } + else + { + poweruptype = 0; + } + } + +void Player::ChangeMusic + ( + const char * current, + const char * fallback, + qboolean force + ) + + { + int current_mood_num; + int fallback_mood_num; + + music_forced = force; + if ( str( current ) == "normal" ) + { + music_forced = false; + } + // + // we no longer let any music be forced + // + music_forced = false; + + // zero out action_level so that we do get a change + // + action_level = 0; + + if ( current ) + { + current_mood_num = MusicMood_NameToNum( current ); + if ( current_mood_num < 0 ) + { + gi.DPrintf( "current music mood %s not found", current ); + } + else + { + music_current_mood = current_mood_num; + } + } + + if ( fallback ) + { + fallback_mood_num = MusicMood_NameToNum( fallback ); + if ( fallback_mood_num < 0 ) + { + gi.DPrintf( "fallback music mood %s not found", fallback ); + fallback = NULL; + } + else + { + music_fallback_mood = fallback_mood_num; + } + } + } + +void Player::ChangeMusicVolume + ( + float volume, + float fade_time + ) + + { + music_volume_fade_time = fade_time; + music_saved_volume = music_current_volume; + music_current_volume = volume; + } + +void Player::RestoreMusicVolume + ( + float fade_time + ) + + { + music_volume_fade_time = fade_time; + music_current_volume = music_saved_volume; + music_saved_volume = -1.0; + } + +void Player::GiveOxygen + ( + float time + ) + + { + air_finished = level.time + time; + } + +void Player::Jump + ( + Event *ev + ) + + { + float maxheight; + + maxheight = ev->GetFloat( 1 ); + + if ( maxheight > 16 ) + { + // v^2 = 2ad + velocity[ 2 ] += sqrt( 2 * sv_gravity->integer * maxheight ); + + // make sure the player leaves the ground + client->ps.walking = qfalse; + } + } + +void Player::JumpXY + ( + Event *ev + ) + + { + float forwardmove; + float sidemove; + float distance; + float time; + float speed; + + forwardmove = ev->GetFloat( 1 ); + sidemove = ev->GetFloat( 2 ); + speed = ev->GetFloat( 3 ); + + if ( water_power >= MINIMUM_WATER_FOR_TURBO ) + { + if ( pm_lastruntime > WATER_TURBO_TIME ) + { + forwardmove *= WATER_TURBO_SPEED; + //speed *= WATER_TURBO_SPEED; + } + } + + velocity = yaw_forward * forwardmove - yaw_left * sidemove; + distance = velocity.length(); + velocity *= speed / distance; + time = distance / speed; + velocity[ 2 ] = sv_gravity->integer * time * 0.5f; + + airspeed = distance; + + // make sure the player leaves the ground + client->ps.walking = qfalse; + } + +void Player::StartFakePlayer + ( + void + ) + { + Actor * fake; + + // + // if we don't have a fakePlayer active, no need to check + // + if ( !fakePlayer_active ) + { + return; + } + + fakePlayer_active = qfalse; + + fakePlayer = new Actor; + + if ( !fakePlayer ) + return; + + fake = fakePlayer; + + CloneEntity( fake, this ); + + fake->SetTargetName( "fakeplayer" ); + fake->ProcessEvent( EV_Actor_AIOff ); + + // make sure it thinks so that it can fall when necessary + fake->flags |= FL_THINK; + + // Make the fake player a stepsize shorter to prevent some collision issues + + fake->maxs[2] -= STEPSIZE; + fake->setSize( mins, maxs ); + + fake->takedamage = DAMAGE_NO; + + // hide the player + this->hideModel(); + this->ProcessEvent( EV_Sentient_TurnOffShadow ); + // + // immobolize the player + // + this->flags |= FL_IMMOBILE; + // make the player not solid + setSolidType( SOLID_NOT ); + + // let the scripts now we are ready + PostEvent( EV_Player_Done, 0 ); + } + +void Player::FakePlayer + ( + qboolean holster + ) + { + // + // make sure we don't have one already + // + if ( fakePlayer ) + { + return; + } + + fakePlayer_active = qtrue; + + // if we are in the holster state, wait until next frame + // if we aren't process immediately + if ( !holster ) + { + StartFakePlayer(); + } + else + { + if ( WeaponsOut() ) + { + SafeHolster( qtrue ); + } + } + } + +void Player::RemoveFakePlayer + ( + void + ) + { + Actor * fake; + + // + // make sure we have one + // + if ( !fakePlayer ) + { + return; + } + fake = fakePlayer; + + // + // warp the real player to the fakeplayer location + // + this->setOrigin( fake->origin ); + this->setAngles( fake->angles ); + this->SetViewAngles( fake->angles ); + // show the player + this->showModel(); + this->ProcessEvent( EV_Sentient_TurnOnShadow ); + // allow the player to move + this->flags &= ~FL_IMMOBILE; + // make the player solid + setSolidType( SOLID_BBOX ); + // remove the fake + fake->PostEvent ( EV_Remove, 0.f ); + // null out the fake player + fakePlayer = NULL; + SafeHolster( qfalse ); + } + +void Player::SetViewAngles + ( + Vector newViewangles + ) + + { + // set the delta angle + client->ps.delta_angles[0] = ANGLE2SHORT( newViewangles.x - client->cmd_angles[0] ); + client->ps.delta_angles[1] = ANGLE2SHORT( newViewangles.y - client->cmd_angles[1] ); + client->ps.delta_angles[2] = ANGLE2SHORT( newViewangles.z - client->cmd_angles[2] ); + + v_angle = newViewangles; + + // get the pitch and roll from our leg angles + newViewangles.x = angles.x; + newViewangles.z = angles.z; + AnglesToMat( newViewangles, orientation ); + yaw_forward = orientation[ 0 ]; + yaw_left = orientation[ 1 ]; + + MatrixTransformVector( base_righthand_pos, orientation, righthand_pos ); + MatrixTransformVector( base_lefthand_pos, orientation, lefthand_pos ); + MatrixTransformVector( base_rightfoot_pos, orientation, rightfoot_pos ); + MatrixTransformVector( base_leftfoot_pos, orientation, leftfoot_pos ); + righthand_pos += origin; + lefthand_pos += origin; + rightfoot_pos += origin; + leftfoot_pos += origin; + } + +void Player::DumpState + ( + Event *ev + ) + + { + gi.DPrintf( "Legs: %s Torso: %s\n", currentState_Legs ? currentState_Legs->getName() : "NULL", currentState_Torso->getName() ); + } + +void Player::ForceTorsoState + ( + Event *ev + ) + + { + State *ts = statemap_Torso->FindState( ev->GetString( 1 ) ); + EvaluateState( ts ); + } + +float Player::GetWaterPower + ( + void + ) + + { + return water_power; + } + +void Player::SetWaterPower + ( + float w + ) + + { + float diff; + + ScriptVariable * var; + + + // Clamp the water + if ( w < 0 ) + w = 0; + + if ( w > max_water_power ) + w = max_water_power; + + diff = w - water_power; + water_power = w; + + // shift the player because they picked up the water + diff *= 16.0f / 100.0f; + if ( diff > 1.0f ) + diff = 1.0f; + else if ( diff < 0 ) + diff = 0; + + if ( diff > 0 ) + { + SetOffsetColor( 0, 0, diff, diff * 2 ); + } + + // + // set our level variables + // + var = levelVars.GetVariable( "playerammo_edenwater" ); + if ( !var ) + { + levelVars.SetVariable( "playerammo_edenwater", water_power ); + } + else + { + var->setIntValue( water_power ); + } + + oldstats[STAT_WATER_LEVEL] = 0; + UpdateWeapons(); + } + +void Player::TouchedUseAnim + ( + Entity * ent + ) + { + toucheduseanim = ent; + } + +void Player::ChangeOutfit + ( + Event *ev + ) + { + int stage = ev->GetInteger( 1 ); + + SetOutfit( stage ); + } + +void Player::SetOutfit + ( + int stage + ) + { + // cancel any pending outfit changes + CancelEventsOfType( EV_Player_ChangeOutfit ); + + outfit_level = stage; + + SurfaceCommand( "armpad*", "+nodraw" ); + SurfaceCommand( "holster*", "+nodraw" ); + SurfaceCommand( "pouch", "+nodraw" ); + SurfaceCommand( "kneepad*", "+nodraw" ); + SurfaceCommand( "shoulderpad*", "+nodraw" ); + SurfaceCommand( "glasses", "+nodraw" ); + switch( stage ) + { + case 5: + SurfaceCommand( "glasses", "-nodraw" ); + case 4: + SurfaceCommand( "shoulderpad*", "-nodraw" ); + case 3: + SurfaceCommand( "kneepad*", "-nodraw" ); + case 2: + SurfaceCommand( "armpad*", "-nodraw" ); + case 1: + SurfaceCommand( "holster*", "-nodraw" ); + SurfaceCommand( "pouch", "-nodraw" ); + case 0: + break; + } + } + +int Player::GetOutfit + ( + void + ) + { + return outfit_level; + } + +void Player::ClearLeftArmTarget + ( + Event *ev + ) + + { + left_arm_target = NULL; + } + +void Player::ClearRightArmTarget + ( + Event *ev + ) + + { + right_arm_target = NULL; + } + +void Player::AdjustTorso + ( + Event *ev + ) + + { + adjust_torso = ev->GetBoolean( 1 ); + } + +void Player::UseDualWield + ( + Event *ev + ) + + { + // This is triggered by the state machine. + // If there is a weapon in the dual wield list, use it, then remove it from the list. + if ( dual_wield_weaponlist.NumObjects() ) + { + DualWieldWeapon *dw; + + dw = dual_wield_weaponlist.ObjectAt( 1 ); + + useWeapon( dw->name, dw->hand ); + dual_wield_weaponlist.RemoveObjectAt( 1 ); + delete dw; + } + else + { + dual_wield_active = qfalse; // We are done wielding all the weapons + } + } + +void Player::DualWield + ( + Event *ev + ) + + { + str leftweap, rightweap; + Weapon *leftactweap, *rightactweap, *dualactweap; + + leftweap = ev->GetString( 1 ); + rightweap = ev->GetString( 2 ); + + // Set the putaway flags on any active weapons + leftactweap = GetActiveWeapon( WEAPON_LEFT ); + rightactweap = GetActiveWeapon( WEAPON_RIGHT ); + dualactweap = GetActiveWeapon( WEAPON_DUAL ); + + // Check for any dual handed weapon being out, and mark it for putaway + if ( dualactweap ) + { + dualactweap->SetPutAway( qtrue ); + } + + // if the left and right weapons are already out, then holster them both + if ( + ( leftactweap && !leftweap.icmp( leftactweap->getName() ) ) && + ( rightactweap && !rightweap.icmp( rightactweap->getName() ) ) + ) + { + leftactweap->SetPutAway( qtrue ); + rightactweap->SetPutAway( qtrue ); + return; + } + + DualWieldWeapon *dualweap; + + // Putaway the old weapons, and add the new ones to the dual_wield list + if ( !leftactweap ) + { + dualweap = new DualWieldWeapon; + dualweap->name = leftweap; + dualweap->hand = WEAPON_LEFT; + dual_wield_weaponlist.AddObject( dualweap ); + } + else if ( leftweap.icmp( leftactweap->getName() ) ) + { + leftactweap->SetPutAway( qtrue ); + + dualweap = new DualWieldWeapon; + dualweap->name = leftweap; + dualweap->hand = WEAPON_LEFT; + dual_wield_weaponlist.AddObject( dualweap ); + } + + if ( !rightactweap ) + { + dualweap = new DualWieldWeapon; + dualweap->name = rightweap; + dualweap->hand = WEAPON_RIGHT; + dual_wield_weaponlist.AddObject( dualweap ); + } + else if ( rightweap.icmp( rightactweap->getName() ) ) + { + rightactweap->SetPutAway( qtrue ); + + dualweap = new DualWieldWeapon; + dualweap->name = rightweap; + dualweap->hand = WEAPON_RIGHT; + dual_wield_weaponlist.AddObject( dualweap ); + } + + dual_wield_active = qtrue; + } + +void Player::EvaluateTorsoAnim + ( + Event *ev + ) + + { + str torsoAnim( currentState_Torso->getTorsoAnim( *this, &torso_conditionals ) ); + + if ( torsoAnim == "" ) + { + partAnim[ torso ] = ""; + ClearTorsoAnim(); + } + else if ( torsoAnim != "none" ) + { + SetAnim( torsoAnim.c_str(), torso ); + } + } + +void Player::NextPainTime + ( + Event *ev + ) + + { + nextpaintime = level.time + ev->GetFloat( 1 ); + pain_type = MOD_NONE; + pain = 0; + } + +void Player::SetMouthAngle + ( + Event *ev + ) + + { + int tag_num; + float angle_percent; + Vector mouth_angles; + + + angle_percent = ev->GetFloat( 1 ); + + if ( angle_percent < 0 ) + angle_percent = 0; + + if ( angle_percent > 1 ) + angle_percent = 1; + + tag_num = gi.Tag_NumForName( edict->s.modelindex, "tag_mouth" ); + + if ( tag_num != -1 ) + { + SetControllerTag( MOUTH_TAG, tag_num ); + + mouth_angles = vec_zero; + mouth_angles[PITCH] = max_mouth_angle * angle_percent; + + SetControllerAngles( MOUTH_TAG, mouth_angles ); + } + } + +void Player::EnterVehicle + ( + Event *ev + ) + + { + Entity *ent; + + ent = ev->GetEntity( 1 ); + if ( ent && ent->isSubclassOf( Vehicle ) ) + { + flags |= FL_PARTIAL_IMMOBILE; + viewheight = STAND_EYE_HEIGHT; + velocity = vec_zero; + vehicle = ( Vehicle * )ent; + if ( vehicle->IsDrivable() ) + setMoveType( MOVETYPE_VEHICLE ); + else + setMoveType( MOVETYPE_NOCLIP ); + } + } + +void Player::ExitVehicle + ( + Event *ev + ) + + { + flags &= ~FL_PARTIAL_IMMOBILE; + setMoveType( MOVETYPE_WALK ); + vehicle = NULL; + } + +qboolean Player::WeaponsOut + ( + void + ) + + { + return ( GetActiveWeapon( WEAPON_LEFT ) || GetActiveWeapon( WEAPON_RIGHT ) || GetActiveWeapon( WEAPON_DUAL ) ); + } + +void Player::Holster + ( + qboolean putaway + ) + + { + Weapon *leftWeap, *rightWeap, *dualWeap; + + leftWeap = GetActiveWeapon( WEAPON_LEFT ); + rightWeap = GetActiveWeapon( WEAPON_RIGHT ); + dualWeap = GetActiveWeapon( WEAPON_DUAL ); + + // Holster + if ( leftWeap || rightWeap || dualWeap ) + { + if ( putaway ) + { + if ( leftWeap ) + { + leftWeap->SetPutAway( qtrue ); + holsteredWeapons[WEAPON_LEFT] = leftWeap; + } + if ( rightWeap ) + { + rightWeap->SetPutAway( qtrue ); + holsteredWeapons[WEAPON_RIGHT] = rightWeap; + } + if ( dualWeap ) + { + dualWeap->SetPutAway( qtrue ); + holsteredWeapons[WEAPON_DUAL] = dualWeap; + } + + // Set a level var so the script can know if the player is going to holster + levelVars.SetVariable( "holster_active", 1 ); + } + } + else + { + if ( !putaway ) + { + // Unholster + if ( holsteredWeapons[WEAPON_DUAL] ) + { + useWeapon( holsteredWeapons[WEAPON_DUAL], WEAPON_DUAL ); + } + else if ( holsteredWeapons[WEAPON_LEFT] && holsteredWeapons[WEAPON_RIGHT] ) + { + Event *ev1; + + ev1 = new Event( EV_Player_DualWield ); + ev1->AddString( holsteredWeapons[WEAPON_LEFT]->getName() ); + ev1->AddString( holsteredWeapons[WEAPON_RIGHT]->getName() ); + ProcessEvent( ev1 ); + } + else if ( holsteredWeapons[WEAPON_RIGHT] ) + { + useWeapon( holsteredWeapons[WEAPON_RIGHT], WEAPON_RIGHT ); + } + else if ( holsteredWeapons[WEAPON_LEFT] ) + { + useWeapon( holsteredWeapons[WEAPON_LEFT], WEAPON_LEFT ); + } + + holsteredWeapons[WEAPON_LEFT] = NULL; + holsteredWeapons[WEAPON_RIGHT] = NULL; + holsteredWeapons[WEAPON_DUAL] = NULL; + // Set a level var to let the script know there is no holstering + levelVars.SetVariable( "holster_active", 0 ); + } + } + } + +void Player::SafeHolster + ( + qboolean putaway + ) + { + if ( WeaponsOut() ) + { + if ( putaway ) + { + weapons_holstered_by_code = qtrue; + Holster( qtrue ); + } + } + else + { + if ( putaway ) + { + if ( !fakePlayer_active ) + { + WeaponsHolstered(); + } + } + else + { + if ( weapons_holstered_by_code ) + { + weapons_holstered_by_code = qfalse; + Holster( qfalse ); + } + } + } + } + +void Player::WeaponsNotHolstered + ( + void + ) + { + } + +void Player::WeaponsHolstered + ( + void + ) + { + } + +void Player::HolsterToggle + ( + Event *ev + ) + + { + if ( WeaponsOut() ) + { + Holster( qtrue ); + } + else + { + Holster( qfalse ); + } + } + +void Player::Holster + ( + Event *ev + ) + + { + SafeHolster( ev->GetBoolean( 1 ) ); + } + +void Player::GrabRope + ( + Entity * ent + ) + { + rope_grabbed = ( Rope * )ent; + } + +void Player::TouchRope + ( + Entity * ent + ) + { + rope_touch = ( Rope * )ent; + } + +qboolean Player::OnRope + ( + void + ) + { + return ( rope_grabbed != NULL ); + } + +void Player::SetWaterPower + ( + Event *ev + ) + + { + SetWaterPower( ev->GetInteger( 1 ) ); + } + +void Player::IncreaseActionLevel + ( + float action_level_increase + ) + { + action_level += action_level_increase; + } + +void Player::WatchActor + ( + Event *ev + ) + + { + if ( camera || currentState_Torso->getCameraType() != CAMERA_BEHIND ) + return; + + actor_to_watch = (Actor *)ev->GetEntity( 1 ); + } + +void Player::StopWatchingActor + ( + Event *ev + ) + + { + Actor *old_actor; + + old_actor = (Actor *)ev->GetEntity( 1 ); + + if ( old_actor == actor_to_watch ) + actor_to_watch = NULL; + } + +void Player::setAngles + ( + Vector ang + ) + + { + // set the angles normally + Entity::setAngles( ang ); + + // set the orientation based off of the current view, also update our yaw_forward and yaw_left + ang[ YAW ] = v_angle[ YAW ]; + AnglesToMat( ang, orientation ); + yaw_forward = orientation[ 0 ]; + yaw_left = orientation[ 1 ]; + } + +void Player::WeaponCommand + ( + Event *ev + ) + + { + weaponhand_t hand; + Weapon *weap; + int i; + + if ( ev->NumArgs() < 2 ) + return; + + hand = WeaponHandNameToNum( ev->GetString( 1 ) ); + weap = GetActiveWeapon( hand ); + + if ( !weap ) + return; + + Event *e; + e = new Event( ev->GetToken( 2 ) ); + + for( i=3; i<=ev->NumArgs(); i++ ) + e->AddToken( ev->GetToken( i ) ); + + weap->ProcessEvent( e ); + } + +qboolean TryPush + ( + int entnum, + vec3_t move_origin, + vec3_t move_end + ) + + { + Actor *act; + Vector dir; + Vector dir2; + Entity *ent; + + if ( entnum == ENTITYNUM_NONE ) + return false; + + ent = G_GetEntity( entnum ); + + if ( ent->isSubclassOf( Actor ) ) + { + act = (Actor *) ent; + + dir = act->origin - move_origin; + dir.z = 0; + dir.normalize(); + + dir2 = move_end; + dir2 -= move_origin; + + if ( act->flags & FL_FLY ) + { + dir *= dir2.length() / 2; + + if ( act->Push( dir ) ) + return true; + } + else + { + dir *= dir2.length(); + + Event *event = new Event( EV_Actor_Push ); + event->AddVector( dir ); + act->PostEvent( event, 0 ); + } + } + + return false; + } + +void Player::PlayerDone + ( + Event *ev + ) + + { + // This is used to let scripts know that the player is done doing something + + // let any threads waiting on us know they can go ahead + Director.PlayerSpawned(); + } + +painDirection_t Player::Pain_string_to_int + ( + str pain + ) + + { + if ( !pain.icmp( pain, "Front" ) ) + return PAIN_FRONT; + else if ( !pain.icmp( pain, "Left" ) ) + return PAIN_LEFT; + else if ( !pain.icmp( pain, "Right" ) ) + return PAIN_RIGHT; + else if ( !pain.icmp( pain, "Rear" ) ) + return PAIN_REAR; + else + return PAIN_NONE; + } + +void Player::ArchivePersistantData + ( + Archiver &arc + ) + + { + int i; + str model_name; + + Sentient::ArchivePersistantData( arc ); + + arc.ArchiveFloat( &water_power ); + arc.ArchiveFloat( &max_water_power ); + + arc.ArchiveInteger( &outfit_level ); + + model_name = g_playermodel->string; + + arc.ArchiveString( &model_name ); + + if ( arc.Loading() ) + { + // set the cvar + gi.cvar_set( "g_playermodel", model_name.c_str() ); + + model_name += ".tik"; + setModel( model_name.c_str() ); + + Event *event = new Event( EV_Player_ChangeOutfit ); + event->AddInteger( outfit_level ); + PostEvent( event, FRAMETIME * 3 ); + } + + for( i = 0; i < MAX_ACTIVE_WEAPONS; i++ ) + { + str name; + if ( arc.Saving() ) + { + if ( holsteredWeapons[ i ] ) + { + name = holsteredWeapons[ i ]->getName(); + } + else + { + name = "none"; + } + } + arc.ArchiveString( &name ); + if ( arc.Loading() ) + { + if ( name != "none" ) + { + holsteredWeapons[ i ] = ( Weapon * )FindItem( name ); + } + } + } + UpdateWeapons(); + // Force a re-evaluation of the player's state + LoadStateTable(); + } + +void Player::SpawnDamageEffect + ( + meansOfDeath_t mod + ) + + { + switch ( mod ) + { + case MOD_ELECTRIC: + case MOD_ELECTRICWATER: + { + SpawnEffect( "fx_elecstrike.tik", origin ); + Sound( "sound/weapons/sword/electric/hitmix2.wav", 0 ); + } + default: + { + } + } + } + +void Player::ActivateDualWeapons + ( + Event *ev + ) + + { + int i; + + for ( i=dual_wield_weaponlist.NumObjects(); i>=1; i-- ) + { + DualWieldWeapon *dw; + Weapon *weapon; + + dw = dual_wield_weaponlist.ObjectAt( i ); + + weapon = ( Weapon * )FindItem( dw->name ); + + // Check to see if player has the weapon + if ( !weapon ) + { + warning( "Player::ActivateDualWeapons", "Player does not have weapon %s", dw->name ); + return; + } + + ChangeWeapon( weapon, dw->hand ); + dual_wield_weaponlist.RemoveObjectAt( i ); + delete dw; + } + + // Check for water and ammo + UpdateWeapons(); + + // Clear out the newActiveWeapon + ClearNewActiveWeapon(); + + // Clear out the holstered weapons + holsteredWeapons[WEAPON_LEFT] = NULL; + holsteredWeapons[WEAPON_RIGHT] = NULL; + holsteredWeapons[WEAPON_DUAL] = NULL; + + // let the player know that our weapons are not holstered + WeaponsNotHolstered(); + } + +void Player::VelocityModified + ( + void + ) + { + if ( velocity.z > 32 ) + { + do_rise = qtrue; + } + } + +int Player::GetKnockback + ( + int original_knockback, + qboolean blocked + ) + { + int new_knockback; + + new_knockback = original_knockback; + + // If blocked, absorb some of the knockback + + if ( blocked ) + { + if ( LargeShieldActive() ) + new_knockback -= 150; + else + new_knockback -= 50; + } + + // See if we still have enough knockback to knock the player down + + if ( new_knockback >= 200 && take_pain ) + { + knockdown = true; + + if ( blocked ) + { + float damage; + + damage = new_knockback / 50; + + if ( damage > 10 ) + damage = 10; + + Damage( world, world, damage, origin, vec_zero, vec_zero, 0, DAMAGE_NO_ARMOR, MOD_CRUSH ); + } + } + + // Make sure knockback is still at least 0 + + if ( new_knockback < 0 ) + new_knockback = 0; + + return new_knockback; + } + +void Player::ResetHaveItem + ( + Event *ev + ) + { + str fullname; + ScriptVariable * var; + + fullname = str( "playeritem_" ) + ev->GetString( 1 ); + + var = gameVars.GetVariable( fullname.c_str() ); + + if ( var ) + var->setIntValue( 0 ); + } + +void Player::ReceivedItem + ( + Item * item + ) + { + qboolean forced; + qboolean first; + str fullname; + str dialog; + str anim; + ScriptVariable * var; + + // + // set our global game variables + // + + fullname = str( "playeritem_" ) + item->getName(); + + first = qtrue; + + var = gameVars.GetVariable( fullname.c_str() ); + if ( !var ) + { + gameVars.SetVariable( fullname.c_str(), 1 ); + } + else + { + int amount; + + amount = var->intValue() + 1; + var->setIntValue( amount ); + // + // if we just received it, let the player know + // + if ( amount > 1 ) + { + first = qfalse; + } + } + + var = levelVars.GetVariable( fullname.c_str() ); + if ( !var ) + { + levelVars.SetVariable( fullname.c_str(), 1 ); + } + else + { + int amount; + + amount = var->intValue() + 1; + var->setIntValue( amount ); + } + + if ( item->IsItemCool( &dialog, &anim, &forced ) ) + { + if ( first || forced ) + { + cool_item = item; + cool_dialog = dialog; + cool_anim = anim; + } + } + } + +void Player::RemovedItem + ( + Item * item + ) + { + str fullname; + ScriptVariable * var; + + // + // set our global game variables if client + // + + fullname = str( "playeritem_" ) + item->getName(); + + var = levelVars.GetVariable( fullname.c_str() ); + if ( var ) + { + int amount; + + amount = var->intValue() - 1; + if ( amount < 0 ) + amount = 0; + var->setIntValue( amount ); + } + + var = gameVars.GetVariable( fullname.c_str() ); + if ( var ) + { + int amount; + + amount = var->intValue() - 1; + if ( amount < 0 ) + amount = 0; + var->setIntValue( amount ); + } + } + +void Player::AmmoAmountChanged + ( + Ammo * ammo, + int ammo_in_clip + ) + { + str fullname; + ScriptVariable * var; + + // + // set our level variables + // + fullname = str( "playerammo_" ) + ammo->getName(); + + var = levelVars.GetVariable( fullname.c_str() ); + if ( !var ) + { + levelVars.SetVariable( fullname.c_str(), ammo->getAmount() + ammo_in_clip ); + } + else + { + var->setIntValue( ammo->getAmount() + ammo_in_clip ); + } + } + + +void Player::StartCoolItem + ( + Event *ev + ) + { + // turn off ai off during the cinematic + level.ai_on = qfalse; + // make sure we don't take damage during this time + takedamage = DAMAGE_NO; + // freeze the player + level.playerfrozen = qtrue; + // turn on cinematic mode + G_StartCinematic(); + + assert( ( Camera * )cool_camera == NULL ); + // start playing the success music + if ( music_current_mood != mood_success ) + { + ChangeMusic( "success", MusicMood_NumToName( music_current_mood ), qfalse ); + } + + // create an orbit cam + cool_camera = new Camera(); + cool_camera->SetOrbitHeight( 150 ); + cool_camera->Orbit( this, 200, this, -90 ); + cool_camera->Cut( NULL ); + SetCamera( cool_camera, 1 ); + } + +void Player::ShowCoolItem + ( + Event *ev + ) + { + Animate * fx; + Vector org; + + org = origin; + org.z += 128; + + fx = new Animate; + + fx->setOrigin( org ); + fx->setModel( "fx_coolitem.tik" ); + fx->RandomAnimate( "idle" ); + fx->PostEvent( EV_Remove, 1 ); + + if ( cool_item ) + { + cool_item->setOrigin( org ); + cool_item->PostEvent( EV_Show, 0.1f ); + // place a lens flare on the object + cool_item->edict->s.renderfx |= RF_VIEWLENSFLARE; + + if ( cool_dialog.length() ) + { + Sound( cool_dialog, CHAN_DIALOG ); + } + } + } + +void Player::HideCoolItem + ( + Event *ev + ) + { + Animate * fx; + Vector org; + + org = origin; + org.z += 128; + + fx = new Animate; + + fx->setOrigin( org ); + fx->setModel( "fx_coolitem_reverse.tik" ); + fx->RandomAnimate( "idle" ); + fx->PostEvent( EV_Remove, 1 ); + + if ( cool_item ) + { + Event * event; + + cool_item->PostEvent( EV_Hide, 1.0f ); + + event = new Event( EV_SetOrigin ); + event->AddVector( vec_zero ); + cool_item->PostEvent( event, 1.0f ); + // remove the lens flare on the object + cool_item->edict->s.renderfx &= ~RF_VIEWLENSFLARE; + } + } + +void Player::StartCoolItemAnim + ( + void + ) + { + movecontrol = MOVECONTROL_ABSOLUTE; + + if ( cool_item && cool_anim.length() ) + { + SetAnim( cool_anim, legs ); + // clear out anim till next time + cool_anim = ""; + } + } + +void Player::StopCoolItem + ( + Event *ev + ) + { + if ( cool_item && cool_anim.length() ) + { + State * newState; + + newState = statemap_Torso->FindState( "DO_COOL_ITEM_ANIM" ); + if ( newState ) + { + currentState_Torso = newState; + return; + } + } + + // turn ai back on + level.ai_on = qtrue; + + // turn damage back on + takedamage = DAMAGE_AIM; + + // unfreeze the player + level.playerfrozen = qfalse; + + // turn off cinematic mode + G_StopCinematic(); + + cool_item = NULL; + + // delete our camera + if ( cool_camera ) + { + SetCamera( NULL, 1 ); + delete cool_camera; + cool_camera = NULL; + } + } + +void Player::WaitForState + ( + Event *ev + ) + { + waitForState = ev->GetString( 1 ); + } + + +void Player::SetDamageMultiplier + ( + Event *ev + ) + { + damage_multiplier = ev->GetFloat( 1 ); + } + +void Player::SetTakePain + ( + Event *ev + ) + + { + take_pain = ev->GetBoolean( 1 ); + } + +void Player::Loaded + ( + void + ) + + { + UpdateWeapons(); + } + +void Player::PlayerShowModel + ( + Event *ev + ) + + { + Entity::showModel(); + UpdateWeapons(); + } + +void Player::showModel + ( + void + ) + + { + Entity::showModel(); + UpdateWeapons(); + } diff --git a/source/source/fgame/player.h b/source/source/fgame/player.h new file mode 100644 index 0000000..36b6bd5 --- /dev/null +++ b/source/source/fgame/player.h @@ -0,0 +1,1682 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/player.h $ +// $Revision:: 174 $ +// $Author:: Aldie $ +// $Date:: 7/29/00 2:28p $ +// +// Copyright (C) 1997 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source is may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/player.h $ +// +// 174 7/29/00 2:28p Aldie +// Added a nosound weapon check +// +// 173 7/26/00 6:06p Steven +// Added some reseting of weapon game vars. +// +// 172 7/25/00 11:32p Aldie +// Made some changes to the memory system and fixed a memory allocation bug in +// Z_TagMalloc. Also changed a lot of classes to subclass from Class. +// +// 171 7/25/00 12:47p Markd +// Added new player sounds +// +// 170 7/23/00 8:49p Aldie +// Added some safety nets to the weapon code in sentient and player +// +// 169 7/22/00 12:52a Markd +// Added can_hang check +// +// 168 7/21/00 3:47p Steven +// Added some showmodel stuff. +// +// 167 7/21/00 1:14a Markd +// fixed fakeplayer again +// +// 166 7/19/00 8:46p Markd +// added checkgroundentity +// +// 165 7/19/00 7:26p Markd +// fixed weapons holstered code +// +// 164 7/19/00 5:10p Steven +// Added Loaded proc, gets called after a loadgame is finished so the player +// can process stuff. +// +// 163 7/19/00 11:02a Markd +// removed weapons_active +// +// 162 7/18/00 5:19p Markd +// added weapons_active boolean +// +// 161 7/18/00 4:25p Markd +// rewrote holstering code +// +// 160 7/17/00 9:51p Aldie +// Added skipcinematic command which is access by pressing the ESC key +// +// 159 7/17/00 7:45p Markd +// made fakeplayer work better +// +// 158 7/17/00 4:19p Aldie +// Changed to using v_angle instead of torsoangles for some aiming stuff. +// +// 157 7/17/00 3:26p Aldie +// Fix for flashbangs, changed detail variable, and added forcetorsostate +// +// 156 7/17/00 11:57a Aldie +// Changed some methods for checking weapons for attack +// +// 155 7/16/00 3:08p Aldie +// Added some holster functions for firing and getting the weapons out. +// +// 154 7/16/00 2:09p Aldie +// Changed some of the player logging +// +// 153 7/16/00 10:46a Steven +// Improved head target stuff. +// +// 152 7/15/00 1:34p Aldie +// Added takepain command. Allows control for taking pain or not. +// +// 151 7/15/00 1:06p Aldie +// Added specialmove stuff for weapons so we can do special movement with some +// dualhanded weapons +// +// 150 7/14/00 8:21p Aldie +// Added logstats +// +// 149 7/12/00 5:36p Markd +// fixed ammo reporting to support bullets in clip +// +// 148 7/12/00 11:27a Steven +// Changed water to a float. +// +// 147 7/10/00 11:54p Markd +// added exit level code +// +// 146 7/10/00 9:27p Markd +// added ammo variables for how much ammo the player has. Added levelvars and +// gamevars commands +// +// 145 7/10/00 8:09p Markd +// fixed cool item pickup problems +// +// 144 7/10/00 10:41a Markd +// added waitforstate +// +// 143 7/06/00 7:17p Aldie +// Added in HAS_ARMORPIECE state command +// +// 142 7/05/00 7:37p Steven +// Added more outfit stuff and added it to the saved PersistantData. +// +// 141 7/05/00 6:15p Steven +// Added a damage multiplier for combos. +// +// 140 7/05/00 4:17p Markd +// fixed cool item stuff +// +// 139 7/04/00 6:45p Markd +// enhanced cool item features +// +// 138 7/04/00 2:25p Markd +// added cool cinematic for new objects +// +// 137 7/03/00 10:23a Steven +// Added some knockback/knockdown stuff. +// +// 136 6/30/00 3:08p Markd +// fixed rise animation issues +// +// 135 6/25/00 11:21a Markd +// fixed slime code for player +// +// 134 6/20/00 7:55p Markd +// fixed camera position when game is being loaded +// +// 133 6/17/00 3:48p Aldie +// +// 132 6/15/00 5:50p Aldie +// Added rise checks +// +// 131 6/15/00 3:54p Aldie +// Took out the legturn command. We don't really need it. +// +// 130 6/15/00 2:54p Aldie +// Fix for the leg turning issue +// +// 129 6/14/00 5:40p Aldie +// Added state ammo check for weapon in hand/mode +// +// 128 6/14/00 2:17p Markd +// fixed compiler warnings for Intel Compiler +// +// 127 6/13/00 6:41p Markd +// Fixed pushing and pulling of objects +// +// 126 6/10/00 1:50p Steven +// Added statemap caching. +// +// 125 6/06/00 12:19p Markd +// working on player movement +// +// 124 6/05/00 3:29p Aldie +// Added flickering to waterstats +// +// 123 6/03/00 3:14p Aldie +// Added damage effects to player and sentient +// +// 122 6/02/00 2:01p Markd +// Fixed client persistant data issues +// +// 121 6/01/00 7:02p Markd +// removed activeWeapon variable +// +// 120 5/31/00 5:06p Aldie +// New aiming method +// +// 119 5/30/00 6:54p Aldie +// Added a muzzle clear check +// +// 118 5/30/00 5:06p Aldie +// Added large shield to prevent knockdowns +// +// 117 5/30/00 4:42p Aldie +// Added direction support and knockdown support to player +// +// 116 5/27/00 5:14p Steven +// Added player head watch stuff. +// +// 115 5/27/00 2:56p Markd +// Save games 2nd pass +// +// 114 5/27/00 9:49a Steven +// Added RemoveTarget stuff. +// +// 113 5/26/00 2:24p Aldie +// Added waitforplayer commands so we can use it for cinematics when waiting +// for player to finish holstering +// +// 112 5/25/00 4:15p Aldie +// Added weapon holstering while crouching +// +// 111 5/24/00 3:14p Markd +// first phase of save/load games +// +// 110 5/15/00 2:19p Aldie +// Added new tempmodel system and added player accumulated pain +// +// 109 5/08/00 3:20p Aldie +// Added initial crosshair work +// +// 108 5/06/00 5:25p Markd +// fixed camera and pipe hang issues +// +// 107 5/04/00 4:59p Markd +// Added setAngles and putawayweapons +// +// 106 5/02/00 3:15p Steven +// Added player watching actors that talk to her. +// +// 105 5/01/00 2:47p Steven +// Added IncreaseActionLevel. +// +// 104 5/01/00 11:31a Markd +// Added SetWaterPower to Player +// +// 103 4/29/00 11:28a Markd +// removed old rope code, cleaned up rope interface +// +// 102 4/24/00 7:07p Aldie +// Removed old code to try and fix inconsistency between legs and torso for +// firing when moving and standing. It's all done in the state machine now. +// +// 101 4/15/00 5:40p Markd +// fixed falling damage and getting into and out of water +// +// 100 4/15/00 1:30p Markd +// added check_was_running code so that player does not always stop short +// +// 99 4/14/00 6:04p Aldie +// Added checksolidforward to state system +// +// 98 4/13/00 5:31p Steven +// Added a checkshgliekdead check +// +// 97 4/10/00 11:18a Markd +// Added new rope code +// +// 96 4/07/00 10:17a Markd +// fixed shgliek pickup and weapon holstering +// +// 95 4/05/00 8:41p Markd +// Added water_level conditional +// +// 94 4/04/00 11:02a Markd +// put in checkcanclimb and feet checks +// +// 93 4/03/00 4:21p Steven +// Changed right_arm_target and left_arm_target to EntityPtrs. +// +// 92 3/31/00 3:19p Markd +// Added UseObject functionality +// +// 91 3/22/00 2:05p Aldie +// Added holster command +// +// 90 3/21/00 6:08p Markd +// Added invehicle check +// +// 89 3/21/00 5:05p Markd +// Added DamageFeedback and vehicle support +// +// 88 3/20/00 6:09p Steven +// Added SetMouthAngle. +// +// 87 3/18/00 3:55p Markd +// working on player turning +// +// 86 3/18/00 2:42p Markd +// added facing up and down slopes +// +// 85 3/17/00 6:37p Markd +// Added chance conditional +// +// 84 3/16/00 3:35p Aldie +// Added checkpain state back instead of forcing it +// +// 83 3/16/00 10:20a Markd +// fixed useanim firing its targets before the animation was completed +// +// 82 3/15/00 4:09p Aldie +// Fixed a bug with using weapons, and added some ability to force a state in +// the player +// +// 81 3/13/00 5:18p Aldie +// Made some changes for usable inventory item stuff +// +// 80 3/04/00 12:29p Jimdose +// separated feet checks into their own functions +// +// 79 3/02/00 11:12a Markd +// Added additional SetReverb function +// +// 78 3/02/00 10:48a Steven +// Changed reverb interface. +// +// 77 3/01/00 8:44p Jimdose +// added turning for monkey bars +// made move checks provide pass/fail results +// added checks for feet and falling when both feet aren't on the ground +// +// 76 2/28/00 6:33p Aldie +// Added more advanced pain state checks +// +// 75 2/26/00 7:09p Jimdose +// added better movement checks for pipecrawl, monkey bars +// added checks to prevent player from going into walk or run animation while +// move is blocked +// fixed setting step height when stepping up +// +// 74 2/26/00 11:50a Jimdose +// added slope checks +// +// 73 2/25/00 7:27p Markd +// Added useanim_numloop support and fixed useanim_orientation +// +// 72 2/25/00 5:02p Aldie +// Changed some reloading and put in a fix for the animation problem with the +// firing of the weapons +// +// 71 2/24/00 7:26p Aldie +// Added dual wielding +// +// 70 2/24/00 4:18p Jimdose +// removed some unused variables +// added ladder movement +// +// 69 2/23/00 5:27p Aldie +// Changed return value of function +// +// 68 2/22/00 1:57p Jimdose +// added pushobjects +// +// 67 2/17/00 6:26p Aldie +// Fixed naming conventions for weapon hand and also added various attachtotag +// functionality for weapons that attach to different tags depending on which +// hand they are wielded in. +// +// 66 2/17/00 4:16p Jimdose +// made statemap_Legs and statemap_Torso part of player instead of global +// removed redundant physics variables +// +// 65 2/16/00 4:01p Aldie +// Added shield functionality +// +// 64 2/15/00 8:57p Jimdose +// changed blocked to moveresult +// +// 63 2/14/00 7:34p Aldie +// Fixed some autotargeting issues +// +// 62 2/14/00 5:41p Jimdose +// got rid of unneeded debugging variables +// +// 61 2/09/00 8:02p Aldie +// Added loopfire weapons +// +// 60 2/08/00 6:35p Aldie +// Added more blocking code to player and sentient +// +// 59 2/08/00 11:34a Steven +// Added picking up of Shgliek. +// +// 58 2/08/00 12:17a Jimdose +// made rope grabbing controlled by state system +// +// 57 2/07/00 7:38p Aldie +// Fixed swiping, also various weapons fixes for sword and for sling +// +// 56 2/04/00 7:28p Aldie +// Combat code - blocking and combos +// +// 55 2/04/00 3:11p Aldie +// Changed sword attack method for water usage +// +// 54 2/03/00 2:56p Aldie +// Sword and water coding +// +// 53 2/02/00 4:28p Aldie +// Added some new state checks for combo help +// +// 52 2/01/00 5:40p Markd +// Fixed Camera cutting issues +// +// 51 2/01/00 5:28p Aldie +// More updates for auto aiming +// +// 50 1/31/00 7:56p Aldie +// Added some new states and improved arm tracking +// +// 49 1/31/00 6:03p Jimdose +// added rope_touch +// +// 48 1/31/00 3:56p Aldie +// working on the auto aim / tracking code +// +// 47 1/29/00 6:17p Aldie +// Fixed some problems when state doesn't exist. +// +// 46 1/29/00 11:27a Jimdose +// made ropes work with state system +// +// 45 1/26/00 3:33p Aldie +// Change Amount to getAmount. Added some 'listinventory' command. Added give +// all cheat to execute the script in global/giveall.txt +// +// 44 1/25/00 8:06p Jimdose +// added hardimpact +// +// 43 1/24/00 6:56p Steven +// Added reverb stuff. +// +// 42 1/24/00 2:50p Jimdose +// added rope checks +// +// 41 1/22/00 4:05p Jimdose +// added pipe crawl and step up +// +// 40 1/20/00 7:11p Jimdose +// added checkcanwallhug +// added movecontrol +// +// 39 1/19/00 10:02p Jimdose +// added airspeed +// +// 38 1/19/00 7:59p Markd +// Rewrote Surface Model Event and also added changeoutfit command to player +// +// 37 1/17/00 10:20p Jimdose +// Rewrote state system initialization. Made conditionals defined with array. +// Made Evaluate functions early exit +// +// 36 1/16/00 5:43p Aldie +// Made weapon tag vars +// +// 35 1/15/00 3:57p Markd +// Eliminated multiple "angle" events and replaced them with EV_SetAngle +// +// 34 1/15/00 1:36p Markd +// Added UseAnim and TouchUseAnim functionality to Player and game +// +// 33 1/14/00 5:07p Markd +// Removed surface num, tri_num and damage_multiplier from multiple functions +// and events +// +// 32 1/12/00 8:06p Markd +// Added CameraCut function +// +// 31 1/12/00 3:17p Aldie +// Added some water functionality +// +// 30 1/10/00 10:30a Jimdose +// removed unused code +// +// 29 1/06/00 11:08p Jimdose +// cleaning up unused code +// +// 28 1/05/00 7:25p Jimdose +// made angle functions all use the same coordinate system +// AngleVectors now returns left instead of right +// no longer need to invert pitch +// +// 27 12/20/99 6:51p Steven +// Moved jumpxy to sentient. +// +// 26 12/20/99 6:37p Markd +// Made camera cutting work properly +// +// 25 12/17/99 8:27p Jimdose +// got rid of unused vars and functions +// +// 24 12/17/99 6:35p Jimdose +// changed spawnarg code +// added Level class for spawning and map control +// got rid of unused or superflous variables +// changed setjmp/longjmp calls to try/throw/catch exception handling +// +// 23 12/14/18 2:44p Jimdose +// added monkey bar movement +// +// 22 12/13/99 10:14a Aldie +// Temp update for bug fixing due to merge +// +// 21 12/10/99 6:11p Jimdose +// added movement check functions +// +// 20 12/10/99 2:54p Aldie +// Added L and R ARM tags +// +// 19 12/10/99 11:17a Jimdose +// got rid of unused movement functions +// +// 18 12/09/99 7:38p Jimdose +// improved grabbing and hanging onto walls +// +// 17 12/08/99 7:00p Aldie +// Wrote some head tracking code +// +// 16 12/01/99 11:26a Aldie +// Couple of fixes for emitters and more ammo stuff +// +// 15 11/29/99 6:32p Aldie +// Lots of changes for ammo system +// +// 14 11/19/99 5:45p Aldie +// Update for primary and alternate fire weapons. Removed PRIMARY and SECONDAY +// mode weapons of Sin, removed SILENCED properties, and changed ammo types to +// use the new system. Still need to fix ammo checking for weapons. +// +// 13 11/11/99 5:25p Jimdose +// added separate torso animation +// +// 12 11/09/99 8:05p Markd +// Added SetViewAngles and also made a SetFOV function +// +// 11 11/05/99 7:31p Aldie +// Angles adjustment +// +// 10 10/29/99 7:21p Aldie +// Rope stuff +// +// 9 10/29/99 6:49p Jimdose +// added SwingAngles and PlayerAngles +// +// 8 10/28/99 6:33p Markd +// Added fakeplayer ability, also added CloneEntity +// +// 7 10/28/99 11:55a Aldie +// Rope stuff +// +// 6 10/28/99 10:42a Aldie +// Added rope functions +// +// 5 10/27/99 12:19p Markd +// added smooth camera lerping +// +// 4 10/19/99 7:53p Markd +// Eliminated 3 part model system +// +// 3 10/18/99 6:10p Jimdose +// got rid of separate state machine for torso and legs +// now use skeletal model for player +// +// 2 10/12/99 2:23p Markd +// Rewrote camera and player movetype system +// +// 1 9/10/99 10:54a Jimdose +// +// 1 9/08/99 3:16p Aldie +// +// 32 9/02/99 7:29p Jimdose +// added checks for doors +// +// 31 9/02/99 4:39p Jimdose +// only get hurt when damage > 15 +// +// 30 9/01/99 1:44p Jimdose +// made DoUse a script called event +// removed CheckButtons +// +// 29 8/31/99 7:40p Jimdose +// added check for if she has a weapon +// added movement speed based on animation +// +// 28 8/30/99 10:26p Jimdose +// added check for jump flip +// +// 27 8/27/99 4:49p Jimdose +// separated state machine into two, one for torso, one for legs +// +// 26 8/23/99 10:16a Jimdose +// added better falling checks +// +// 25 8/18/99 4:15p Jimdose +// added conditionals for health, death, and pain +// +// 24 8/17/99 4:52p Jimdose +// added oldorigin +// added various checks for physics +// added JumpXY +// +// 23 8/12/99 8:04p Jimdose +// working on climbing stuff +// +// 22 8/11/99 7:58p Jimdose +// preliminary climbing code in +// +// 21 8/11/99 11:52a Aldie +// Added giveweapon cheat +// +// 20 8/10/99 6:46p Aldie +// Added some better condition logic and sword attack +// +// 19 8/10/99 11:36a Aldie +// Update of the weapons system +// +// 18 8/10/99 10:48a Jimdose +// added hang_pullup_distance and blocked +// +// 17 8/06/99 6:40p Aldie +// Started moving over to new weapons system +// +// 16 7/30/99 7:53p Markd +// Added jumping ability to the player +// +// 15 7/07/99 2:53p Jimdose +// added ResetState and LoadStateTable +// +// 14 7/06/99 8:33p Jimdose +// removed unused player code +// added state machine for player animation +// +// DESCRIPTION: +// Class definition of the player. +// + +#ifndef __PLAYER_H__ +#define __PLAYER_H__ + +#include "g_local.h" +#include "vector.h" +#include "entity.h" +#include "weapon.h" +#include "sentient.h" +#include "navigate.h" +#include "misc.h" +#include "bspline.h" +#include "camera.h" +#include "specialfx.h" +#include "characterstate.h" +#include "actor.h" +#include "sword.h" +#include "vehicle.h" +#include "rope.h" + +extern Event EV_Player_EndLevel; +extern Event EV_Player_GiveCheat; +extern Event EV_Player_GodCheat; +extern Event EV_Player_NoTargetCheat; +extern Event EV_Player_NoClipCheat; +extern Event EV_Player_GameVersion; +extern Event EV_Player_Fov; +extern Event EV_Player_WhatIs; +extern Event EV_Player_Respawn; +extern Event EV_Player_WatchActor; +extern Event EV_Player_StopWatchingActor; +extern Event EV_Player_DoStats; + +#define HEAD_TAG 0 +#define TORSO_TAG 1 +#define L_ARM_TAG 2 +#define R_ARM_TAG 3 +#define MOUTH_TAG 4 + +enum painDirection_t + { + PAIN_NONE, + PAIN_FRONT, + PAIN_LEFT, + PAIN_RIGHT, + PAIN_REAR + }; + +typedef void ( Player::*movecontrolfunc_t )( void ); + +class ActiveWeapon : public Class + { + public: + WeaponPtr weapon; + weaponhand_t hand; + ActiveWeapon(); + void Archive( Archiver &arc ); + }; + +inline ActiveWeapon::ActiveWeapon + ( + ) + + { + weapon = NULL; + hand = WEAPON_ERROR; + } + +inline void ActiveWeapon::Archive + ( + Archiver &arc + ) + + { + arc.ArchiveObjectPointer( ( Class ** )&weapon ); + ArchiveEnum( hand, weaponhand_t ); + } + +class DualWieldWeapon : public Class + { + public: + str name; + weaponhand_t hand; + void Archive( Archiver &arc ); + }; + +inline void DualWieldWeapon::Archive + ( + Archiver &arc + ) + + { + arc.ArchiveString( &name ); + ArchiveEnum( hand, weaponhand_t ); + } + + +class Player : public Sentient + { + private: + static Condition Conditions[]; + static movecontrolfunc_t MoveStartFuncs[]; + + StateMap *statemap_Legs; + StateMap *statemap_Torso; + + State *currentState_Legs; + State *currentState_Torso; + str last_torso_anim_name; + str last_leg_anim_name; + movecontrol_t movecontrol; + int last_camera_type; + + EntityPtr crosshair; + ActiveWeapon newActiveWeapon; + EntityPtr head_target; + float look_at_time; + EntityPtr right_arm_target; + EntityPtr left_arm_target; + qboolean shield_active; + qboolean crouch_flag; + + qboolean dual_wield_active; + Container dual_wield_weaponlist; + + WeaponPtr holsteredWeapons[MAX_ACTIVE_WEAPONS]; + + str partAnim[ 3 ]; + + bool animdone_Legs; + bool animdone_Torso; + + Vector oldvelocity; + Vector old_v_angle; + Vector oldorigin; + float animspeed; + float airspeed; + + // blend + float blend[ 4 ]; // rgba full screen effect + float fov; // horizontal field of view + + friend class Camera; + friend class Vehicle; + + // vehicle stuff + VehiclePtr vehicle; + + // aiming direction + Vector v_angle; + + int buttons; + int new_buttons; + float respawn_time; + + float water_power; + float max_water_power; + + int last_attack_button; + + // Rope + Rope *rope_grabbed; + Rope *rope_touch; + + // damage blend + float damage_blood; + float damage_alpha; + Vector damage_blend; + Vector damage_from; // the direciton of incoming damage + Vector damage_angles; // the damage angle adjustment that should be applied to the player + float damage_count; // incoming damage which is decayed over time + + float bonus_alpha; + + float next_drown_time; // how long until we drown again + float next_painsound_time; // when we should make a pain sound again + float air_finished; + + int old_waterlevel; + int drown_damage; + + str waitForState; // if not null, than player will clear waitforplayer when this state is hit + CameraPtr camera; + CameraPtr actor_camera; + CameraPtr cool_camera; + ActorPtr actor_to_watch; + qboolean actor_camera_right; + qboolean starting_actor_camera_right; + + // music stuff + + float action_level; + + int music_current_mood; + int music_fallback_mood; + + float music_current_volume; + float music_saved_volume; + float music_volume_fade_time; + + int reverb_type; + float reverb_level; + + qboolean gibbed; + float pain; + painDirection_t pain_dir; + meansOfDeath_t pain_type; + bool take_pain; + float accumulated_pain; + int nextpaintime; + bool knockdown; + + bool canfall; + bool falling; + int feetfalling; + Vector falldir; + + bool hardimpact; + + qboolean music_forced; + + usercmd_t last_ucmd; + + // movement variables + Vector base_righthand_pos; + Vector base_lefthand_pos; + Vector righthand_pos; + Vector lefthand_pos; + + Vector base_rightfoot_pos; + Vector base_leftfoot_pos; + Vector rightfoot_pos; + Vector leftfoot_pos; + + int pm_lastruntime; // the last runtime before Pmove + + float animheight; + + Vector yaw_forward; + Vector yaw_left; + + EntityPtr atobject; + float atobject_dist; + Vector atobject_dir; + + bool pickup_enemy; // set to true when we want to pickup our enemy but are still waiting to put + // away our weapons + bool have_shgliek; + EntityPtr toucheduseanim; + int useanim_numloops; // number of times to loop the animation + EntityPtr useitem_in_use; // used so that we can trigger targets after the useitem is finished + EntityPtr cool_item; // we picked up a cool item and are waiting to show it off + str cool_dialog; // dialog to play when we get it + str cool_anim; // anim to play after the cinematic + + float ledgeheight_left; + float ledgeheight_right; + float monkeybar_left; + float monkeybar_right; + float monkeybar_dir; + EntityPtr horizontalpipe; + float move_left_dist; + float move_right_dist; + float move_backward_dist; + float move_forward_dist; + int moveresult; + qboolean do_rise; // whether or not the player should go into the rise animation + qboolean weapons_holstered_by_code; // whether or not we initiated a holstering for a specific animation + + // leg angles + qboolean yawing; + qboolean yawing_left; + qboolean yawing_right; + qboolean adjust_torso; + + Vector torsoAngles; + Vector headAngles; + Vector headAimAngles; + Vector torsoAimAngles; + Vector rightArmAimAngles; + Vector leftArmAimAngles; + + int oldstats[MAX_STATS]; + + float damage_multiplier; + + int outfit_level; + + // dummyPlayer stuff + qboolean fakePlayer_active; + SafePtr fakePlayer; + + Container legs_conditionals; + Container torso_conditionals; + + public: + qboolean returntrue( Conditional &condition ); + qboolean checkturnleft( Conditional &condition ); + qboolean checkturnright( Conditional &condition ); + qboolean checkforward( Conditional &condition ); + qboolean checkbackward( Conditional &condition ); + qboolean checkstrafeleft( Conditional &condition ); + qboolean checkstraferight( Conditional &condition ); + qboolean checkjump( Conditional &condition ); + qboolean checkcrouch( Conditional &condition ); + qboolean checkjumpflip( Conditional &condition ); + qboolean checkanimdone_legs( Conditional &condition ); + qboolean checkanimdone_torso( Conditional &condition ); + qboolean checkattackleft( Conditional &condition ); + qboolean checkattackright( Conditional &condition ); + qboolean checkattackbuttonleft( Conditional &condition ); + qboolean checkattackbuttonright( Conditional &condition ); + qboolean checksneak( Conditional &condition ); + qboolean checkrun( Conditional &condition ); + qboolean checkwasrunning( Conditional &condition ); + qboolean checkholsterweapon( Conditional &condition ); + qboolean checkuse( Conditional &condition ); + qboolean checkcanturn( Conditional &condition ); + qboolean checkcanmoveright( Conditional &condition ); + qboolean checkcanmoveleft( Conditional &condition ); + qboolean checkcanmovebackward( Conditional &condition ); + qboolean checkcanmoveforward( Conditional &condition ); + qboolean checkcanwallhug( Conditional &condition ); + qboolean checkblocked( Conditional &condition ); + qboolean checkhangatwall( Conditional &condition ); + qboolean checktouchrope( Conditional &condition ); + qboolean checkcanclimbrope( Conditional &condition ); + qboolean checkonrope( Conditional &condition ); + qboolean checkonground( Conditional &condition ); + qboolean check22degreeslope( Conditional &condition ); + qboolean check45degreeslope( Conditional &condition ); + qboolean checkrightleghigh( Conditional &condition ); + qboolean checkleftleghigh( Conditional &condition ); + qboolean checkcanhang( Conditional &condition ); + qboolean checkcanhangleft( Conditional &condition ); + qboolean checkcanhangright( Conditional &condition ); + qboolean checkcanfall( Conditional &condition ); + qboolean checkatdoor( Conditional &condition ); + qboolean checkatshgliek( Conditional &condition ); + qboolean checkhaveshgliek( Conditional &condition ); + qboolean checkshgliekdead( Conditional &condition ); + qboolean checkfalling( Conditional &condition ); + qboolean checkgroundentity( Conditional &condition ); + qboolean checkhardimpact( Conditional &condition ); + qboolean checkcangrabledge( Conditional &condition ); + qboolean checkledgeheight( Conditional &condition ); + qboolean checkcangrabpipe( Conditional &condition ); + qboolean checkcangrabmonkeybar( Conditional &condition ); + qboolean checkcanpullup( Conditional &condition ); + qboolean checkdead( Conditional &condition ); + qboolean checkhealth( Conditional &condition ); + qboolean checkpain( Conditional &condition ); + qboolean checkpaindirection( Conditional &condition ); + qboolean checkaccumulatedpain( Conditional &condition ); + qboolean checkpaintype( Conditional &condition ); + qboolean checkpainthreshold( Conditional &condition ); + qboolean checkknockdown( Conditional &condition ); + qboolean checklegsstate( Conditional &condition ); + qboolean checktorsostate( Conditional &condition ); + qboolean checkatuseanim( Conditional &condition ); + qboolean checktouchuseanim( Conditional &condition ); + qboolean checkatuseobject( Conditional &condition ); + qboolean checkloopuseobject( Conditional &condition ); + qboolean checkuseweaponleft( Conditional &condition ); + qboolean checknewweapon( Conditional &condition ); + qboolean checkuseweapon( Conditional &condition ); + qboolean checkhasweapon( Conditional &condition ); + qboolean checkweaponactive( Conditional &condition ); + qboolean checkweaponreadytofire( Conditional &condition ); + qboolean checkweaponreadytofire_nosound( Conditional &condition ); + qboolean checkmuzzleclear( Conditional &condition ); + qboolean checkputawayleft( Conditional &condition ); + qboolean checkputawayright( Conditional &condition ); + qboolean checkputawayboth( Conditional &condition ); + qboolean checktargetacquired( Conditional &condition ); + qboolean checkanyweaponactive( Conditional &condition ); + qboolean checkstatename( Conditional &condition ); + qboolean checkattackblocked( Conditional &condition ); + qboolean checkblockdelay( Conditional &condition ); + qboolean checkcanstand( Conditional &condition ); + qboolean checkpush( Conditional &condition ); + qboolean checkpull( Conditional &condition ); + qboolean checkladder( Conditional &condition ); + qboolean checkfeetatladder( Conditional &condition ); + qboolean checkcanclimbladder( Conditional &condition ); + qboolean checkdualwield( Conditional &condition ); + qboolean checkdualweapons( Conditional &condition ); + qboolean checkuseanimfinished( Conditional &condition ); + qboolean checkchance( Conditional &condition ); + qboolean checkfacingupslope( Conditional &condition ); + qboolean checkfacingdownslope( Conditional &condition ); + qboolean checkturnedleft( Conditional &condition ); + qboolean checkturnedright( Conditional &condition ); + qboolean checkinvehicle( Conditional &condition ); + qboolean checkwaterlevel( Conditional &condition ); + qboolean checkpickupenemy( Conditional &condition ); + qboolean checksolidforward( Conditional &condition ); + qboolean checkholstercomplete( Conditional &condition ); + qboolean checkweaponhasammo( Conditional &condition ); + qboolean checkrise( Conditional &condition ); + qboolean checkcoolitem( Conditional &condition ); + qboolean checkarmorpiece( Conditional &condition ); + qboolean checkspecialmove( Conditional &condition ); + qboolean checkweaponsholstered( Conditional &condition ); + qboolean checkdualweaponreadytofire( Conditional &condition ); + qboolean checkfakeplayeractive( Conditional &condition ); + qboolean checkfakeplayerholster( Conditional &condition ); + + // movecontrol functions + void StartHang( void ); + void StartPipeCrawl( void ); + void StartMonkeyBars( void ); + void StartStepUp( void ); + void RopeGrab( void ); + void RopeRelease( void ); + void StartPickup( void ); + void StartPush( void ); + void StartClimbWall( void ); + void StartUseAnim( void ); + void StartLoopUseAnim( void ); + void SetupUseObject( void ); + + void StartUseObject( Event *ev ); + void FinishUseObject( Event *ev ); + void FinishUseAnim( Event *ev ); + void PickupShgliek( Event *ev ); + void ThrowShgliek( Event *ev ); + void StepUp( Event *ev ); + void Turn( Event *ev ); + void TurnUpdate( Event *ev ); + void TurnLegs( Event *ev ); + + CLASS_PROTOTYPE( Player ); + + Player(); + ~Player(); + void Init( void ); + + void InitSound( void ); + void InitEdict( void ); + void InitClient( void ); + void InitPhysics( void ); + void InitPowerups( void ); + void InitWorldEffects( void ); + void InitWeapons( void ); + void InitView( void ); + void InitModel( void ); + void InitState( void ); + void InitHealth( void ); + void InitWaterPower( void ); + void InitInventory( void ); + void ChooseSpawnPoint( void ); + + void EndLevel( Event *ev ); + void Respawn( Event *ev ); + + void SetDeltaAngles( void ); + virtual void setAngles( Vector ang ); + + void DoUse( Event *ev ); + void Obituary( Entity *attacker, Entity *inflictor, int meansofdeath ); + void Killed( Event *ev ); + void Dead( Event *ev ); + void Pain( Event *ev ); + + void TouchStuff( pmove_t *pm ); + + void GetMoveInfo( pmove_t *pm ); + void SetMoveInfo( pmove_t *pm, usercmd_t *ucmd ); + pmtype_t GetMovePlayerMoveType( void ); + void ClientMove( usercmd_t *ucmd ); +// qboolean feetOnGround( Vector pos ); +// Vector findBestFallPos( Vector pos ); +// void CheckFeet( void ); + void CheckMoveFlags( void ); + void ClientThink( Event *ev ); + + void LoadStateTable( void ); + void ResetState( Event *ev ); + void EvaluateState( State *forceTorso=NULL, State *forceLegs=NULL ); + + void CheckGround( void ); + void UpdateViewAngles( usercmd_t *cmd ); + qboolean AnimMove( Vector &move, Vector *endpos = NULL ); + qboolean TestMove( Vector &pos, Vector *endpos = NULL ); + qboolean PipeMove( Vector &move, Vector *endpos = NULL ); + qboolean MonkeyBarMove( Vector &move, Vector *endpos = NULL ); + qboolean CheckMove( Vector &move, Vector *endpos = NULL ); + qboolean RopeMove( Vector &move, Vector *endpos = NULL ); + + float CheckMoveDist( Vector &delta ); + float TestMoveDist( Vector &pos ); + + void EndAnim_Legs( Event *ev ); + void EndAnim_Torso( Event *ev ); + void SetAnim( const char *anim, bodypart_t part = legs ); + + void EventUseItem( Event *ev ); + void TouchedUseAnim( Entity * ent ); + + void GiveCheat( Event *ev ); + void GiveWeaponCheat( Event *ev ); + void GiveAllCheat( Event *ev ); + void GodCheat( Event *ev ); + void NoTargetCheat( Event *ev ); + void NoclipCheat( Event *ev ); + void Kill( Event *ev ); + void GibEvent( Event *ev ); + void SpawnEntity( Event *ev ); + void SpawnActor( Event *ev ); + void ListInventoryEvent( Event *ev ); + + void GameVersion( Event *ev ); + void Fov( Event *ev ); + + void GetPlayerView( Vector *pos, Vector *angle ); + + float CalcRoll( void ); + void WorldEffects( void ); + void AddBlend( float r, float g, float b, float a ); + void CalcBlend( void ); + void DamageFeedback( void ); + + void UpdateStats( void ); + void StatCount( int index, int count ); + void UpdateMusic( void ); + void UpdateWeapons( void ); + void UpdateSword( Sword *sword ); + void UpdateReverb( void ); + void UpdateMisc( void ); + + void SetReverb( str type, float level ); + void SetReverb( int type, float level ); + void SetReverb( Event *ev ); + + void SetWaterPower( float water ); + float GetWaterPower( void ); + + Camera *CurrentCamera( void ); + void SetCamera( Camera *ent, float switchTime ); + void CameraCut( void ); + void CameraCut( Camera *ent ); + + void SetPlayerView( Camera * camera, Vector position, float cameraoffset, Vector ang, Vector vel, float camerablend[ 4 ], float camerafov ); + void SetupView( void ); + + void ProcessPmoveEvents( int event ); + + void SwingAngles( float destination, float swingTolerance, float clampTolerance, float speed, float *angle, qboolean *swinging ); + void PlayerAngles( void ); + void FinishMove( void ); + void EndFrame( Event *ev ); + + void TestThread( Event *ev ); + void useWeapon( const char *weaponname, weaponhand_t hand ); + void useWeapon( Weapon *weapon, weaponhand_t hand ); + + void GotKill( Event *ev ); + void SetPowerupTimer( Event *ev ); + void UpdatePowerupTimer( Event *ev ); + + void WhatIs( Event *ev ); + void ActorInfo( Event *ev ); + void Taunt( Event *ev ); + + void ChangeMusic( const char * current, const char * fallback, qboolean force ); + void ChangeMusicVolume( float volume , float fade_time); + void RestoreMusicVolume( float fade_time ); + + void GravityNodes( void ); + void Archive( Archiver &arc ); + void ArchivePersistantData( Archiver &arc ); + + void GiveOxygen( float time ); + + void KillEnt( Event *ev ); + void RemoveEnt( Event *ev ); + void KillClass( Event *ev ); + void RemoveClass( Event *ev ); + + void Jump( Event *ev ); + void JumpXY( Event *ev ); + + void ActivateNewWeapon( Event *ev ); + void ActivateDualWeapons( Event *ev ); + void DeactivateWeapon( Event *ev ); + void PutawayWeapon( Event *ev ); + void SwordAttackEvent( Event *ev ); + void ActivateShield( Event *ev ); + void DeactivateShield( Event *ev ); + qboolean ShieldActive( void ); + qboolean LargeShieldActive( void ); + + void StartFakePlayer( void ); + void FakePlayer( qboolean holster ); + void RemoveFakePlayer( void ); + void SetViewAngles( Vector angles ); + void SetFov( float newFov ); + + bool IsNewActiveWeapon( void ); + Weapon *GetNewActiveWeapon( void ); + weaponhand_t GetNewActiveWeaponHand( void ); + void ClearNewActiveWeapon( void ); + + void AdjustAnglesForAttack( void ); + Entity *FindEnemyInFOV( float fov, float maxdist ); + Entity *FindEnemyInFOVFromTagWithOffset( float fov, float maxdist, str tagname, Vector offset ); + void DumpState( Event *ev ); + void ForceTorsoState( Event *ev ); + + void SetHeadTarget( Event *ev ); + Vector GetAngleToTarget( Entity *ent, str tag, float yawclamp, float pitchclamp, Vector baseangles ); + + void AutoAim( void ); + void AcquireTarget( void ); + void RemoveTarget( Entity *ent_to_remove ); + void AcquireHeadTarget( void ); + Vector CalcArmTracking( int controller_tag, str weapon_tagname, Vector baseAngles, Entity *target, Weapon *weapon ); + + void ChangeOutfit( Event *ev ); + void SetOutfit( int stage ); + int GetOutfit( void ); + void SetCurrentCombo( Event *ev ); + + qboolean GetTagPositionAndOrientation( str tagname, orientation_t *new_or ); + qboolean GetTagPositionAndOrientation( int tagnum, orientation_t *new_or ); + + void DebugWeaponTags( int controller_tag, Weapon *weapon, str weapon_tagname ); + void SwipeOn( Event *ev ); + void SwipeOff( Event *ev ); + void ClearLeftArmTarget( Event *ev ); + void ClearRightArmTarget( Event *ev ); + void AdjustTorso( Event *ev ); + void UseDualWield( Event *ev ); + void DualWield( Event *ev ); + void EvaluateTorsoAnim( Event *ev ); + void CheckReloadWeapons( void ); + void NextPainTime( Event *ev ); + void SetTakePain( Event *ev ); + + void SetMouthAngle( Event *ev ); + + void EnterVehicle( Event *ev ); + void ExitVehicle( Event *ev ); + void Holster( Event *ev ); + void HolsterToggle( Event *ev ); + void SetWaterPower( Event *ev ); + + // rope stuff + void GrabRope( Entity * rope ); + qboolean OnRope( void ); + void TouchRope( Entity * rope ); + + void IncreaseActionLevel( float action_level_increase ); + + void WatchActor( Event *ev ); + void StopWatchingActor( Event *ev ); + void WeaponCommand( Event *ev ); + void PlayerDone( Event *ev ); + painDirection_t Pain_string_to_int( str pain ); + inline Vector GetTorsoAngles( void ) { return torsoAngles; }; + inline Vector GetVAngles( void ){ return v_angle; } + void SpawnDamageEffect( meansOfDeath_t mod ); + virtual void GetStateAnims( Container *c ); + virtual void VelocityModified( void ); + int GetKnockback( int original_knockback, qboolean blocked ); + virtual void ReceivedItem( Item * item ); + virtual void RemovedItem( Item * item ); + virtual void AmmoAmountChanged( Ammo * ammo, int inclip = 0 ); + qboolean WeaponsOut( void ); + void Holster( qboolean putaway ); + void SafeHolster( qboolean putaway ); + + void StartCoolItem( Event *ev ); + void StartCoolItemAnim( void ); + void ShowCoolItem( Event *ev ); + void HideCoolItem( Event *ev ); + void StopCoolItem( Event *ev ); + void WaitForState( Event *ev ); + void SkipCinematic( Event *ev ); + void SetDamageMultiplier( Event *ev ); + void LogStats( Event *ev ); + void WeaponsHolstered( void ); + void WeaponsNotHolstered( void ); + void Loaded( void ); + void PlayerShowModel( Event *ev ); + virtual void showModel( void ); + void ResetHaveItem( Event *ev ); + }; + +inline bool Player::IsNewActiveWeapon + ( + void + ) + + { + return ( newActiveWeapon.weapon != NULL ); + } + +inline weaponhand_t Player::GetNewActiveWeaponHand + ( + void + ) + + { + return newActiveWeapon.hand; + } + +inline Weapon *Player::GetNewActiveWeapon + ( + void + ) + + { + return newActiveWeapon.weapon; + } + +inline void Player::ClearNewActiveWeapon + ( + void + ) + + { + newActiveWeapon.weapon = NULL; + newActiveWeapon.hand = WEAPON_ERROR; + } + +inline void Player::Archive + ( + Archiver &arc + ) + + { + str tempStr; + int i; + int num; + DualWieldWeapon *tempDualWeapon; + + Sentient::Archive( arc ); + + // make sure we have the state machine loaded up + if ( arc.Loading() ) + { + LoadStateTable(); + } + + if ( arc.Saving() ) + { + if ( currentState_Legs ) + { + tempStr = currentState_Legs->getName(); + } + else + { + tempStr = "NULL"; + } + arc.ArchiveString( &tempStr ); + + if ( currentState_Torso ) + { + tempStr = currentState_Torso->getName(); + } + else + { + tempStr = "NULL"; + } + arc.ArchiveString( &tempStr ); + } + else + { + arc.ArchiveString( &tempStr ); + if ( tempStr != "NULL" ) + { + currentState_Legs = statemap_Legs->FindState( tempStr ); + } + else + { + currentState_Legs = NULL; + } + arc.ArchiveString( &tempStr ); + if ( tempStr != "NULL" ) + { + currentState_Torso = statemap_Torso->FindState( tempStr ); + } + else + { + currentState_Torso = NULL; + } + } + arc.ArchiveString( &last_torso_anim_name ); + arc.ArchiveString( &last_leg_anim_name ); + + ArchiveEnum( movecontrol, movecontrol_t ); + + arc.ArchiveInteger( &last_camera_type ); + if ( arc.Loading() ) + { + // make sure the camera gets reset + last_camera_type = -1; + } + + arc.ArchiveSafePointer( &crosshair ); + + newActiveWeapon.Archive( arc ); + + arc.ArchiveSafePointer( &head_target ); + arc.ArchiveFloat( &look_at_time ); + + arc.ArchiveSafePointer( &right_arm_target ); + arc.ArchiveSafePointer( &left_arm_target ); + arc.ArchiveBoolean( &shield_active ); + arc.ArchiveBoolean( &crouch_flag ); + + arc.ArchiveBoolean( &dual_wield_active ); + + if ( arc.Saving() ) + { + num = dual_wield_weaponlist.NumObjects(); + } + else + { + dual_wield_weaponlist.ClearObjectList(); + } + arc.ArchiveInteger( &num ); + for( i = 1; i <= num; i++ ) + { + if ( arc.Saving() ) + { + tempDualWeapon = dual_wield_weaponlist.ObjectAt( i ); + } + else + { + tempDualWeapon = new DualWieldWeapon; + dual_wield_weaponlist.AddObject( tempDualWeapon ); + } + tempDualWeapon->Archive( arc ); + } + for( i = 0; i < MAX_ACTIVE_WEAPONS; i++ ) + { + arc.ArchiveSafePointer( &holsteredWeapons[ i ] ); + } + arc.ArchiveString( &partAnim[ 0 ] ); + arc.ArchiveString( &partAnim[ 1 ] ); + arc.ArchiveString( &partAnim[ 2 ] ); + + arc.ArchiveBool( &animdone_Legs ); + arc.ArchiveBool( &animdone_Torso ); + + arc.ArchiveVector( &oldvelocity ); + arc.ArchiveVector( &old_v_angle ); + arc.ArchiveVector( &oldorigin ); + arc.ArchiveFloat( &animspeed ); + arc.ArchiveFloat( &airspeed ); + + arc.ArchiveRaw( blend, sizeof( blend ) ); + arc.ArchiveFloat( &fov ); + + arc.ArchiveSafePointer( &vehicle ); + arc.ArchiveVector( &v_angle ); + + arc.ArchiveInteger( &buttons ); + arc.ArchiveInteger( &new_buttons ); + arc.ArchiveFloat( &respawn_time ); + + arc.ArchiveFloat( &water_power ); + arc.ArchiveFloat( &max_water_power ); + + arc.ArchiveInteger( &last_attack_button ); + + arc.ArchiveObjectPointer( ( Class ** )&rope_grabbed ); + arc.ArchiveObjectPointer( ( Class ** )&rope_touch ); + + arc.ArchiveFloat( &damage_blood ); + arc.ArchiveFloat( &damage_alpha ); + arc.ArchiveVector( &damage_blend ); + arc.ArchiveVector( &damage_from ); + arc.ArchiveVector( &damage_angles ); + arc.ArchiveFloat( &damage_count ); + + arc.ArchiveFloat( &bonus_alpha ); + + arc.ArchiveFloat( &next_drown_time ); + arc.ArchiveFloat( &next_painsound_time ); + arc.ArchiveFloat( &air_finished ); + + arc.ArchiveInteger( &old_waterlevel ); + arc.ArchiveInteger( &drown_damage ); + + arc.ArchiveSafePointer( &camera ); + arc.ArchiveSafePointer( &actor_camera ); + arc.ArchiveSafePointer( &cool_camera ); + arc.ArchiveSafePointer( &actor_to_watch ); + arc.ArchiveBoolean( &actor_camera_right ); + arc.ArchiveBoolean( &starting_actor_camera_right ); + + arc.ArchiveFloat( &action_level ); + arc.ArchiveInteger( &music_current_mood ); + arc.ArchiveInteger( &music_fallback_mood ); + + arc.ArchiveFloat( &music_current_volume ); + arc.ArchiveFloat( &music_saved_volume ); + arc.ArchiveFloat( &music_volume_fade_time ); + + arc.ArchiveInteger( &reverb_type ); + arc.ArchiveFloat( &reverb_level ); + + arc.ArchiveBoolean( &gibbed ); + arc.ArchiveFloat( &pain ); + + ArchiveEnum( pain_dir, painDirection_t ); + ArchiveEnum( pain_type, meansOfDeath_t ); + arc.ArchiveBool( &take_pain ); + + arc.ArchiveFloat( &accumulated_pain ); + arc.ArchiveInteger( &nextpaintime ); + + arc.ArchiveBool( &knockdown ); + arc.ArchiveBool( &canfall ); + arc.ArchiveBool( &falling ); + arc.ArchiveInteger( &feetfalling ); + arc.ArchiveVector( &falldir ); + + arc.ArchiveBool( &hardimpact ); + + arc.ArchiveBoolean( &music_forced ); + + arc.ArchiveRaw( &last_ucmd, sizeof( last_ucmd ) ); + + arc.ArchiveVector( &base_righthand_pos ); + arc.ArchiveVector( &base_lefthand_pos ); + arc.ArchiveVector( &righthand_pos ); + arc.ArchiveVector( &lefthand_pos ); + + arc.ArchiveVector( &base_rightfoot_pos ); + arc.ArchiveVector( &base_leftfoot_pos ); + arc.ArchiveVector( &rightfoot_pos ); + arc.ArchiveVector( &leftfoot_pos ); + + arc.ArchiveInteger( &pm_lastruntime ); + arc.ArchiveFloat( &animheight ); + + arc.ArchiveVector( &yaw_forward ); + arc.ArchiveVector( &yaw_left ); + + arc.ArchiveSafePointer( &atobject ); + arc.ArchiveFloat( &atobject_dist ); + arc.ArchiveVector( &atobject_dir ); + + arc.ArchiveBool( &pickup_enemy ); + arc.ArchiveBool( &have_shgliek ); + + arc.ArchiveSafePointer( &toucheduseanim ); + arc.ArchiveInteger( &useanim_numloops ); + arc.ArchiveSafePointer( &useitem_in_use ); + arc.ArchiveSafePointer( &cool_item ); + arc.ArchiveString( &cool_anim ); + arc.ArchiveString( &cool_dialog ); + + arc.ArchiveFloat( &ledgeheight_left ); + arc.ArchiveFloat( &ledgeheight_right ); + arc.ArchiveFloat( &monkeybar_left ); + arc.ArchiveFloat( &monkeybar_right ); + arc.ArchiveFloat( &monkeybar_dir ); + + arc.ArchiveSafePointer( &horizontalpipe ); + arc.ArchiveFloat( &move_left_dist ); + arc.ArchiveFloat( &move_right_dist ); + arc.ArchiveFloat( &move_backward_dist ); + arc.ArchiveFloat( &move_forward_dist ); + arc.ArchiveInteger( &moveresult ); + + arc.ArchiveBoolean( &do_rise ); + arc.ArchiveBoolean( &weapons_holstered_by_code ); + arc.ArchiveBoolean( &yawing ); + arc.ArchiveBoolean( &yawing_left ); + arc.ArchiveBoolean( &yawing_right ); + arc.ArchiveBoolean( &adjust_torso ); + + arc.ArchiveVector( &torsoAngles ); + arc.ArchiveVector( &headAngles ); + arc.ArchiveVector( &headAimAngles ); + arc.ArchiveVector( &torsoAimAngles ); + arc.ArchiveVector( &rightArmAimAngles ); + arc.ArchiveVector( &leftArmAimAngles ); + + arc.ArchiveFloat( &damage_multiplier ); + + arc.ArchiveInteger( &outfit_level ); + + arc.ArchiveBoolean( &fakePlayer_active ); + + arc.ArchiveSafePointer( &fakePlayer ); + + if ( arc.Loading() ) + { + UpdateWeapons(); + } + } + +inline Camera *Player::CurrentCamera + ( + void + ) + + { + return camera; + } + +inline void Player::CameraCut + ( + void + ) + + { + // + // toggle the camera cut bit + // + client->ps.camera_flags = + ( ( client->ps.camera_flags & CF_CAMERA_CUT_BIT ) ^ CF_CAMERA_CUT_BIT ) | + ( client->ps.camera_flags & ~CF_CAMERA_CUT_BIT ); + } + +inline void Player::CameraCut + ( + Camera * ent + ) + + { + if ( ent == camera ) + { + // if the camera we are currently looking through cut, than toggle the cut bits + CameraCut(); + } + } + +inline void Player::SetCamera + ( + Camera *ent, + float switchTime + ) + + { + camera = ent; + client->ps.camera_time = switchTime; + if ( switchTime <= 0.0f ) + { + CameraCut(); + } + } + +#endif /* player.h */ diff --git a/source/source/fgame/player_combat.cpp b/source/source/fgame/player_combat.cpp new file mode 100644 index 0000000..20d8b57 --- /dev/null +++ b/source/source/fgame/player_combat.cpp @@ -0,0 +1,916 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/player_combat.cpp $ +// $Revision:: 60 $ +// $Author:: Aldie $ +// $Date:: 7/29/00 9:06p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/player_combat.cpp $ +// +// 60 7/29/00 9:06p Aldie +// Added water check to swipeoff +// +// 59 7/29/00 12:55p Aldie +// Added null checks to swipes +// +// 58 7/24/00 12:16p Steven +// Added a smaller distance to look at non-actors and fixed not finding a +// target. +// +// 57 7/23/00 8:49p Aldie +// Added some safety nets to the weapon code in sentient and player +// +// 56 7/18/00 4:25p Markd +// rewrote holstering code +// +// 55 7/16/00 4:37p Steven +// Moved action level stuff to actor pain and killed. +// +// 54 7/16/00 10:46a Steven +// Improved head target stuff. +// +// 53 7/11/00 8:55p Aldie +// Added in an autoaim flag +// +// 52 7/10/00 7:16p Aldie +// Fixed weapon swipes for new water required method +// +// 51 7/10/00 6:33p Aldie +// Added SVF_SENDONCE flag and water power for swiping determination +// +// 50 7/05/00 6:14p Steven +// Added a damage multiplier for combos. +// +// 49 6/28/00 7:56p Aldie +// Added some pain stuff for use with death. +// +// 48 6/14/00 3:50p Markd +// Cleaned up more Intel Compiler warnings +// +// 47 6/08/00 3:03p Steven +// Added a decent priority sceme to player head watch stuff. +// +// 46 6/03/00 10:08a Steven +// Made it so player will not look at actors that are bound or attached to +// something. +// +// 45 6/01/00 7:02p Markd +// removed activeWeapon variable +// +// 44 6/01/00 3:18p Markd +// rewrote giveItem and item management in sentient +// +// 43 5/31/00 5:33p Steven +// Added look at me flag and changed masks used in FindClosestEntityInRadius +// from SHOT to OPAQUE. +// +// 42 5/30/00 5:06p Aldie +// Added large shield to prevent knockdowns +// +// 41 5/27/00 5:14p Steven +// Added player head watch stuff. +// +// 40 5/27/00 2:31p Steven +// Added actor targetable stuff. +// +// 39 5/26/00 2:24p Aldie +// Added waitforplayer commands so we can use it for cinematics when waiting +// for player to finish holstering +// +// 38 5/06/00 10:40a Steven +// Made it so there is action level and means of death variables for each +// weapon mode. +// +// 37 5/05/00 6:04p Steven +// Made melee weapons increment the player's action level. +// +// 36 5/04/00 4:47p Markd +// Added PutawayWeapon event +// +// 35 5/02/00 7:29p Aldie +// Fix a crash bug +// +// 34 4/28/00 5:14p Aldie +// Fixed some warning messages +// +// 33 4/15/00 1:43p Aldie +// Added usenoammo command for a weapon that cannot be used when it has no ammo +// +// 32 4/07/00 10:17a Markd +// fixed shgliek pickup and weapon holstering +// +// 31 3/22/00 2:05p Aldie +// Added holster command +// +// 30 3/15/00 5:52p Aldie +// Added pushsound to func_pushobject and removed a printf. +// +// 29 3/15/00 4:09p Aldie +// Fixed a bug with using weapons, and added some ability to force a state in +// the player +// +// 28 2/24/00 4:18p Jimdose +// removed some unused variables and functions +// +// 27 2/23/00 6:21p Aldie +// More inventory changes +// +// 26 2/18/00 6:28p Aldie +// Removed some prints +// +// 25 2/17/00 6:26p Aldie +// Fixed naming conventions for weapon hand and also added various attachtotag +// functionality for weapons that attach to different tags depending on which +// hand they are wielded in. +// +// 24 2/17/00 12:00p Aldie +// Added command processing to state system with the addition of entrycommands +// and exitcommands. +// +// 23 2/16/00 4:01p Aldie +// Added shield functionality +// +// 22 2/10/00 8:05p Aldie +// Added trace to enemyinfov +// +// 21 2/09/00 8:02p Aldie +// Added loopfire weapons +// +// 20 2/09/00 5:26p Aldie +// Fix for FindClosestEnemyInRadius +// +// 19 2/08/00 11:57a Aldie +// Added in enemy check to the FindClosestEnemyInRadius +// +// 18 2/07/00 7:38p Aldie +// Fixed swiping, also various weapons fixes for sword and for sling +// +// 17 2/04/00 3:11p Aldie +// Changed sword attack method for water usage +// +// 16 2/03/00 2:56p Aldie +// Sword and water coding +// +// 15 2/02/00 7:08p Aldie +// Added new sword code and water damage +// +// 14 2/01/00 6:27p Aldie +// Removed debug line +// +// 13 2/01/00 5:28p Aldie +// More updates for auto aiming +// +// 12 1/29/00 6:17p Aldie +// Fixed some problems when state doesn't exist. +// +// 11 1/29/00 9:33a Markd +// added logic for 2 handed weapons +// +// 10 1/22/00 12:42p Jimdose +// got rid of calls to vec3() +// +// 9 1/16/00 5:43p Aldie +// Made weapon tag vars +// +// 8 1/15/00 9:29a Markd +// rename tag_weapon to tag_weapon_right +// +// 7 1/05/00 7:25p Jimdose +// made angle functions all use the same coordinate system +// AngleVectors now returns left instead of right +// no longer need to invert pitch +// +// 6 12/17/99 8:27p Jimdose +// got rid of unused vars and functions +// +// 5 12/16/99 5:03p Aldie +// Fix for find enemyinfov +// +// 4 12/13/99 10:14a Aldie +// Temp update for bug fixing due to merge +// +// 3 12/09/99 2:31p Aldie +// Head tracking +// +// 2 12/08/99 7:00p Aldie +// Busting up player a bit and wrote some head tracking code +// +// DESCRIPTION: +// Player combat system and combat utility functions +// + +#include "player.h" +#include "sword.h" +#include "weaputils.h" + +static Entity *FindClosestEntityInRadius + ( + Vector origin, + Vector forward, + float fov, + float maxdist + ) + + { + float dist,dot; + float fovdot = cos( fov * 0.5 * M_PI / 180.0 ); + Entity *ent; + Entity *bestent=NULL; + int bestdist = 999999; + qboolean valid_entity; + + // Find closest enemy in radius + ent = findradius( NULL, origin, maxdist ); + + while( ent ) + { + valid_entity = false; + + if ( ent->flags & FL_AUTOAIM ) + { + valid_entity = true; + } + else if ( ent->isSubclassOf( Actor ) && !ent->deadflag ) + { + Actor *actor = ( Actor * )ent; + + if ( actor->actortype == IS_ENEMY && actor->CanTarget() && !actor->bindmaster && actor->edict->s.parent == ENTITYNUM_NONE ) + valid_entity = true; + } + + if ( valid_entity ) + { + // Check to see if the enemy is closest to us + Vector delta = ( ent->centroid ) - origin; + + dist = delta.length(); + + if ( dist < bestdist ) + { + delta.normalize(); + + // It's close, now check to see if it's in our FOV. + dot = DotProduct( forward, delta ); + + if ( dot > fovdot ) + { + trace_t trace; + // Do a trace to see if we can get to it + trace = G_Trace( origin, + vec_zero, + vec_zero, + ent->centroid, + NULL, + MASK_OPAQUE, + false, + "FindClosestEntityInRadius" ); + + if ( ( trace.ent && trace.entityNum == ent->entnum ) || ( trace.fraction == 1 ) ) + { + // dir = delta; + bestent = ent; + bestdist = dist; + } + } + } + } + ent = findradius( ent, origin, maxdist ); + } + return bestent; + } + +static Entity *FindHeadTarget + ( + Vector origin, + Vector forward, + float fov, + float maxdist + ) + + { + float dist,dot; + float fovdot = cos( fov * 0.5 * M_PI / 180.0 ); + Entity *ent; + Entity *bestent=NULL; + int bestdist = 999999; + qboolean valid_entity; + qboolean higher_priority; + + // Find closest enemy in radius + ent = findradius( NULL, origin, maxdist ); + + while( ent ) + { + valid_entity = false; + + if ( ent->isSubclassOf( Actor ) && !ent->deadflag ) + { + Actor *actor = ( Actor * )ent; + + if ( actor->actortype == IS_ENEMY && actor->CanTarget() && !actor->bindmaster && actor->edict->s.parent == ENTITYNUM_NONE ) + valid_entity = true; + } + + if ( !valid_entity ) + { + if ( ent->look_at_me ) + { + if ( ent->isSubclassOf( Item ) ) + { + Item *item = (Item *)ent; + + if ( !item->GetOwner() ) + valid_entity = true; + + if ( item->has_been_looked_at ) + valid_entity = false; + } + else + valid_entity = true; + } + } + + if ( valid_entity ) + { + Actor *bestact = NULL; + Actor *act = NULL; + + // Check to see if the enemy is closest to us + Vector delta = ( ent->centroid ) - origin; + + dist = delta.length(); + + higher_priority = false; + + if ( bestent && bestent->isSubclassOf( Actor ) ) + bestact = (Actor *)bestent; + + if ( ent->isSubclassOf( Actor ) ) + act = (Actor *)ent; + + if ( !ent->isSubclassOf( Actor ) && ( dist > 650 ) ) + higher_priority = false; + else if ( !bestent ) + higher_priority = true; + else if ( ent->isSubclassOf( Actor ) && act->actortype == IS_ENEMY && + bestent->isSubclassOf( Actor ) && bestact->actortype == IS_ENEMY && dist < bestdist ) + higher_priority = true; + else if ( bestent->isSubclassOf( Actor ) && bestact->actortype == IS_ENEMY && + ( bestdist < dist || bestdist < 750 ) ) + higher_priority = false; + else if ( ent->isSubclassOf( Actor ) && act->actortype == IS_ENEMY && + ( dist < bestdist || dist < 750 ) ) + higher_priority = true; + else if ( ent->isSubclassOf( Item ) && bestent->isSubclassOf( Item ) && dist < bestdist ) + higher_priority = true; + else if ( bestent->isSubclassOf( Item ) && ( bestdist < dist || bestdist < 250 ) ) + higher_priority = false; + else if ( ent->isSubclassOf( Item ) && ( dist < bestdist || dist < 250 ) ) + higher_priority = true; + else if ( dist < bestdist ) + higher_priority = true; + + if ( higher_priority ) + { + delta.normalize(); + + // It's close, now check to see if it's in our FOV. Use the v_angle to determine it + dot = DotProduct( forward, delta ); + + if ( dot > fovdot ) + { + trace_t trace; + // Do a trace to see if we can get to it + trace = G_Trace( origin, + vec_zero, + vec_zero, + ent->centroid, + NULL, + MASK_OPAQUE, + false, + "FindClosestEntityInRadius" ); + + if ( ( trace.ent && trace.entityNum == ent->entnum ) || ( trace.fraction == 1 ) ) + { + // dir = delta; + bestent = ent; + bestdist = dist; + } + } + } + } + ent = findradius( ent, origin, maxdist ); + } + return bestent; + } + +Entity *Player::FindEnemyInFOVFromTagWithOffset + ( + float fov, + float maxdist, + str tagname, + Vector offset + ) + + { + vec3_t mat[3]; + orientation_t tag_or; + + GetTagPositionAndOrientation( gi.Tag_NumForName( edict->s.modelindex, tagname ), &tag_or ); + + AnglesToAxis( torsoAngles, mat ); + + //G_DebugLine( tag_or.origin + offset, tag_or.origin + offset + Vector( mat[0] ) * 100, 1,1,1,1 ); + + return FindClosestEntityInRadius( tag_or.origin + offset, mat[0], fov, maxdist ); + } + +//==================== +//FindEnemyInFOV +//Returns entity if an enemy is in the player's FOV +//==================== +Entity *Player::FindEnemyInFOV + ( + float fov, + float maxdist + ) + + { + vec3_t mat[3]; + + AnglesToAxis( headAngles, mat ); + return FindClosestEntityInRadius( this->centroid, mat[0], fov, maxdist ); + } + +//==================== +//AdjustAnglesForAttack +//Adjust the player angles toward an enemy if they are attacking it +//==================== +void Player::AdjustAnglesForAttack + ( + void + ) + + { + /* + Vector dir; + Vector newAngles; + Vector moveToAngles; + + if ( FindEnemyInFOV( 180, 1000 ) ) + { + G_DrawCoordSystem( origin, dir,dir,dir,100 ); + + if ( buttons & ( BUTTON_ATTACKRIGHT|BUTTON_ATTACKLEFT ) ) + { + // Adjust for a percentage of the total + float deltayaw = AngleSubtract( dir.toYaw(), v_angle[YAW] ); + + if ( fabs( deltayaw ) > 5 ) + { + v_angle[YAW] += deltayaw * 0.1f; + client->ps.delta_angles[YAW] += ANGLE2SHORT( deltayaw * 0.1f ); + } + } + } + */ + } + +//==================== +//ActivateNewWeapon +//==================== +void Player::ActivateNewWeapon + ( + Event *ev + ) + + { + // Change the weapon to the currently active weapon as specified by useWeapon + ChangeWeapon( newActiveWeapon.weapon, newActiveWeapon.hand ); + + // Check for water and ammo + UpdateWeapons(); + + // Clear out the newActiveWeapon + ClearNewActiveWeapon(); + + // Clear out the holstered weapons + holsteredWeapons[WEAPON_LEFT] = NULL; + holsteredWeapons[WEAPON_RIGHT] = NULL; + holsteredWeapons[WEAPON_DUAL] = NULL; + + // let the player know that our weapons are not holstered + WeaponsNotHolstered(); + } + +//==================== +//DeactivateWeapon +//==================== +void Player::DeactivateWeapon + ( + Event *ev + ) + + { + // Deactivate the weapon + weaponhand_t hand; + str side; + + side = ev->GetString( 1 ); + + hand = WeaponHandNameToNum( side ); + + if ( hand == WEAPON_ERROR ) + return; + + Sentient::DeactivateWeapon( hand ); + + if ( !GetActiveWeapon( WEAPON_LEFT ) && !GetActiveWeapon( WEAPON_RIGHT ) && !GetActiveWeapon( WEAPON_DUAL ) ) + { + // let the player know our weapons are holstered + WeaponsHolstered(); + } + } + +//==================== +//PutawayWeapon +//==================== +void Player::PutawayWeapon + ( + Event *ev + ) + + { + Weapon * weapon; + weaponhand_t hand; + str side; + + side = ev->GetString( 1 ); + + hand = WeaponHandNameToNum( side ); + + if ( hand == WEAPON_ERROR ) + return; + + weapon = GetActiveWeapon( hand ); + + if ( weapon->isSubclassOf( Weapon ) ) + { + weapon->RandomAnimate( "putaway" ); + } + } + + +//==================== +//useWeapon +//==================== +void Player::useWeapon + ( + const char *weaponname, + weaponhand_t hand + ) + + { + Weapon *weapon; + + weapon = ( Weapon * )FindItem( weaponname ); + + // Check to see if player has the weapon + if ( !weapon ) + { + warning( "Player::useWeapon", "Player does not have weapon %s", weaponname ); + return; + } + + useWeapon( weapon, hand ); + } + +void Player::useWeapon + ( + Weapon *weapon, + weaponhand_t hand + ) + + { + Weapon * activeWeapon; + + if ( !weapon ) + { + warning( "Player::useWeapon", "Null weapon used.\n" ); + return; + } + + // Check to see if we are already in the process of using a new weapon. + if ( newActiveWeapon.weapon ) + { + return; + } + + // Check to see if weapon has ammo and if useNoAmmo is allowed + if ( !weapon->HasAmmo( FIRE_PRIMARY ) && !weapon->HasAmmo( FIRE_ALTERNATE ) && !weapon->GetUseNoAmmo() ) + { + Sound( "snd_noammo" ); + return; + } + + // Check to see if the hand is allowed to have that weapon + + // WEAPON_ANY can be used in WEAPON_LEFT or WEAPON_RIGHT but not as a WEAPON_DUAL, so check for that first + if ( ( hand == WEAPON_DUAL ) && ( weapon->GetHand() != hand ) ) + { + warning( "Player::useWeapon", "Weapon %s is not allowed in %s", weapon->getName().c_str(), WeaponHandNumToName( hand ) ); + return; + } + else if ( ( weapon->GetHand() != WEAPON_ANY ) && ( weapon->GetHand() != hand ) ) + { + warning( "Player::useWeapon", "Weapon %s is not allowed in %s", weapon->getName().c_str(), WeaponHandNumToName( hand ) ); + return; + } + + // If the weapon we are wielding is a WEAPON_DUAL, then put away the left and right ones + if ( weapon->GetHand() == WEAPON_DUAL ) + { + activeWeapon = GetActiveWeapon( WEAPON_LEFT ); + if ( activeWeapon ) + activeWeapon->PutAway(); + activeWeapon = GetActiveWeapon( WEAPON_RIGHT ); + if ( activeWeapon ) + activeWeapon->PutAway(); + } + + // Check to see if a WEAPON_DUAL is being used and put it away if needed + activeWeapon = GetActiveWeapon( WEAPON_DUAL ); + + if ( activeWeapon ) + { + activeWeapon->PutAway(); + // we just want to put the dual handed weapon away + if ( activeWeapon == weapon ) + { + return; + } + } + + // Now get the active weapon in the specified hand + activeWeapon = GetActiveWeapon( hand ); + + // Check to see if this weapon is already being used in this hand and just put it away and return + if ( activeWeapon == weapon ) + { + // Set the putaway flag to true. The state machine will then play the correct animation to put away the active weapon + activeWeapon->PutAway(); + return; + } + + // If activeWeapon is set, and it's not == weapon then put away this weapon + if ( activeWeapon ) + { + // Set the putaway flag to true. The state machine will then play the correct animation to put away the active weapon + activeWeapon->PutAway(); + } + + // Check to see if this weapon is being used in a different hand and put it away as well (if it's in a different hand) + if ( IsActiveWeapon( weapon ) ) + { + weapon->PutAway(); + } + + // Set the newActiveWeapon as the weapon specified, the state machine will play the appropriate animation and + // trigger when to attach it to the player model. + newActiveWeapon.weapon = weapon; + newActiveWeapon.hand = hand; + } + +//==================== +//SwordAttackEvent +//==================== +void Player::SwordAttackEvent + ( + Event *ev + ) + + { + Weapon *weapon; + weaponhand_t hand; + + Vector pos, forward, end; + + // Project a ray from the centroid out + end = this->centroid + Vector( orientation[0] ) * 96; + + hand = WeaponHandNameToNum( ev->GetString( 1 ) ); + + if ( hand == WEAPON_ERROR ) + return; + + weapon = GetActiveWeapon( hand ); + + if ( weapon && weapon->isSubclassOf( Sword ) ) + { + Sword *sword = ( Sword * )weapon; + + SwordAttack( this->centroid, end, sword, this, damage_multiplier ); + } + } + +//==================== +//SwipeOn +//==================== +void Player::SwipeOn + ( + Event *ev + ) + + { + Weapon *weapon; + weaponhand_t hand; + int water_required=0; + + hand = WeaponHandNameToNum( ev->GetString( 1 ) ); + + if ( hand == WEAPON_ERROR ) + return; + + weapon = GetActiveWeapon( hand ); + if ( weapon && weapon->isSubclassOf( Sword ) ) + { + Sword *sword = ( Sword * )weapon; + + water_required = sword->GetWaterRequired(); + } + + if ( weapon && ( water_power >= water_required ) ) + { + weapon->RandomAnimate( "swipeon", NULL ); + } + } + +//==================== +//SwipeOff +//==================== +void Player::SwipeOff + ( + Event *ev + ) + + { + Weapon *weapon; + weaponhand_t hand; + int water_required=0; + + hand = WeaponHandNameToNum( ev->GetString( 1 ) ); + + if ( hand == WEAPON_ERROR ) + return; + + weapon = GetActiveWeapon( hand ); + if ( weapon && weapon->isSubclassOf( Sword ) ) + { + Sword *sword = ( Sword * )weapon; + + water_required = sword->GetWaterRequired(); + } + + if ( weapon && ( water_power >= water_required ) ) + { + weapon->RandomAnimate( "swipeoff", NULL ); + } + } + +//==================== +//ActivateShield +//==================== +void Player::ActivateShield + ( + Event *ev + ) + + { + shield_active = qtrue; + } + +//==================== +//DeactivateShield +//==================== +void Player::DeactivateShield + ( + Event *ev + ) + + { + shield_active = qfalse; + } + +//==================== +//ShieldActive +//==================== +qboolean Player::ShieldActive + ( + void + ) + + { + return shield_active; + } + +//==================== +//LargeShieldActive +//==================== +qboolean Player::LargeShieldActive + ( + void + ) + + { + Weapon *weapon; + qboolean large_shield_active=false; + + weapon = GetActiveWeapon( WEAPON_LEFT ); + if ( weapon && !str::icmp( weapon->item_name, "LargeShield" ) ) + large_shield_active = true; + + return shield_active && large_shield_active; + } + + + +void Player::AcquireHeadTarget + ( + void + ) + + { + vec3_t mat[3]; + Entity *new_head_target; + Entity *ent; + Item *item; + + // Find a good target + + if ( left_arm_target ) + head_target = left_arm_target; + else if ( right_arm_target ) + head_target = right_arm_target; + else + { + AnglesToAxis( headAngles, mat ); + + // Make sure not to look at items too long + + if ( look_at_time <= level.time && head_target && head_target->isSubclassOf( Item ) ) + { + item = (Item *)(Entity *)head_target; + item->has_been_looked_at = true; + } + + // Get the new head target + new_head_target = FindHeadTarget( this->centroid, mat[0], 160, 1000 ); + + if ( !new_head_target ) + { + head_target = NULL; + return; + } + + if ( new_head_target != head_target ) + { + // If we were looking at an item and are not now, mark it as has been looked at + + if ( head_target && head_target->isSubclassOf( Item ) ) + { + item = (Item *)(Entity *)head_target; + item->has_been_looked_at = true; + } + + // Set up new head target + + head_target = new_head_target; + + look_at_time = level.time + 5; + + // Mark items near this one as looked at + + if ( head_target && head_target->isSubclassOf( Item ) ) + { + ent = findradius( NULL, head_target->origin, 50 ); + + while( ent ) + { + if ( ent != head_target && ent->isSubclassOf( Item ) ) + { + item = (Item *)ent; + item->has_been_looked_at = true; + } + + ent = findradius( ent, head_target->origin, 50 ); + } + } + } + } + } diff --git a/source/source/fgame/player_util.cpp b/source/source/fgame/player_util.cpp new file mode 100644 index 0000000..f2424c4 --- /dev/null +++ b/source/source/fgame/player_util.cpp @@ -0,0 +1,687 @@ +//----------------------------------------------------------------------------- +// +// $Logfile:: /fakk2_code/fakk2_new/fgame/player_util.cpp $ +// $Revision:: 20 $ +// $Author:: Aldie $ +// $Date:: 7/29/00 11:23p $ +// +// Copyright (C) 1998 by Ritual Entertainment, Inc. +// All rights reserved. +// +// This source may not be distributed and/or modified without +// expressly written permission by Ritual Entertainment, Inc. +// +// $Log:: /fakk2_code/fakk2_new/fgame/player_util.cpp $ +// +// 20 7/29/00 11:23p Aldie +// Changed to clearfade in SkipCinematic +// +// 19 7/29/00 4:00p Aldie +// Added autofadein for skipping cinematics +// +// 18 7/17/00 9:51p Aldie +// Added skipcinematic command which is access by pressing the ESC key +// +// 17 7/17/00 2:56p Steven +// Fixed a crash with the logfile stuff. +// +// 16 7/17/00 12:36a Markd +// Made sure to close the log file when exiting a level or shutting down a +// server +// +// 15 7/16/00 2:09p Aldie +// Changed some of the player logging +// +// 14 7/14/00 8:21p Aldie +// Added logstats +// +// 13 7/01/00 6:37p Markd +// added areanum to whatis +// +// 12 6/17/00 3:48p Aldie +// +// 11 2/08/00 6:24p Markd +// Added angles printout to whatis +// +// 10 1/29/00 3:35p Markd +// Added contents to whatis command +// +// 9 1/26/00 3:33p Aldie +// Change Amount to getAmount. Added some 'listinventory' command. Added give +// all cheat to execute the script in global/giveall.txt +// +// 8 1/15/00 3:57p Markd +// Eliminated multiple "angle" events and replaced them with EV_SetAngle +// +// 7 1/14/00 5:07p Markd +// Removed surface num, tri_num and damage_multiplier from multiple functions +// and events +// +// 6 1/11/00 5:53p Steven +// Passed a char * into error function instead of a str. +// +// 5 1/07/00 8:12p Jimdose +// cleaning up unused code +// +// 4 1/05/00 7:25p Jimdose +// made angle functions all use the same coordinate system +// AngleVectors now returns left instead of right +// no longer need to invert pitch +// +// 3 12/17/99 6:35p Jimdose +// changed spawnarg code +// added Level class for spawning and map control +// got rid of unused or superflous variables +// changed setjmp/longjmp calls to try/throw/catch exception handling +// +// 2 12/08/99 7:00p Aldie +// Busting up player a bit and wrote some head tracking code +// +// DESCRIPTION: +// This file is used to hold the utility functions that are issued by the +// player at the console. Most of these are developer commands + +#include "player.h" +#include "object.h" + +//==================== +//Player::ActorInfo +//==================== +void Player::ActorInfo + ( + Event *ev + ) + + { + int num; + Entity *ent; + + if ( ev->NumArgs() != 1 ) + { + gi.SendServerCommand( edict-g_entities, "print \"Usage: actorinfo \n\"" ); + return; + } + + num = ev->GetInteger( 1 ); + if ( ( num < 0 ) || ( num >= globals.max_entities ) ) + { + gi.SendServerCommand( edict-g_entities, "print \"Value out of range. Possible values range from 0 to %d.\n\"", globals.max_entities ); + return; + } + + ent = G_GetEntity( num ); + if ( !ent || !ent->isSubclassOf( Actor ) ) + { + gi.SendServerCommand( edict-g_entities, "print \"Entity not an Actor.\n\"" ); + } + else + { + ( ( Actor * )ent )->ShowInfo(); + } + } + +//==================== +//Player::WhatIs +//==================== +void Player::WhatIs + ( + Event *ev + ) + + { + int num; + Entity *ent; + + if ( ev->NumArgs() != 1 ) + { + gi.SendServerCommand( edict-g_entities, "print \"Usage: whatis \n\"" ); + return; + } + + num = ev->GetInteger( 1 ); + if ( ( num < 0 ) || ( num >= globals.max_entities ) ) + { + gi.SendServerCommand( edict-g_entities, "print \"Value out of range. Possible values range from 0 to %d.\n\"", globals.max_entities ); + return; + } + + ent = G_GetEntity( num ); + if ( !ent ) + { + gi.SendServerCommand( edict-g_entities, "print \"Entity not in use.\n\"", globals.max_entities ); + } + else + { + const char * animname; + + animname = NULL; + if ( gi.IsModel( ent->edict->s.modelindex ) ) + { + animname = gi.Anim_NameForNum( ent->edict->s.modelindex, ent->edict->s.anim & ANIM_MASK ); + } + + if ( !animname ) + { + animname = "( N/A )"; + } + + gi.SendServerCommand( edict-g_entities, "print \"" + "Entity # : %d\n" + "Class ID : %s\n" + "Classname : %s\n" + "Targetname : %s\n" + "Modelname : %s\n" + "Animname : %s\n" + "Origin : ( %f, %f, %f )\n" + "Angles : ( %f, %f, %f )\n" + "Bounds : Mins( %.2f, %.2f, %.2f ) Maxs( %.2f, %.2f, %.2f )\n" + "Velocity : ( %f, %f, %f )\n" + "SVFLAGS : %x\n" + "Movetype : %i\n" + "Solidtype : %i\n" + "Contents : %x\n" + "Areanum : %i\n" + "Parent : %i\n" + "Health : %.1f\n" + "Max Health : %.1f\n" + "Edict Owner: %i\n\"", + num, + ent->getClassID(), + ent->getClassname(), + ent->TargetName(), + ent->model.c_str(), + animname, + ent->origin.x, ent->origin.y, ent->origin.z, + ent->angles.x, ent->angles.y, ent->angles.z, + ent->mins.x, ent->mins.y, ent->mins.z, ent->maxs.x, ent->maxs.y, ent->maxs.z, + ent->velocity.x, ent->velocity.y, ent->velocity.z, + ent->edict->svflags, + ent->movetype, + ent->edict->solid, + ent->edict->contents, + ent->edict->areanum, + ent->edict->s.parent, + ent->health, + ent->max_health, + ent->edict->ownerNum + ); + } + } + +//==================== +//Player::KillEnt +//==================== +void Player::KillEnt + ( + Event * ev + ) + + { + int num; + Entity *ent; + + if ( ev->NumArgs() != 1 ) + { + gi.SendServerCommand( edict-g_entities, "print \"Usage: killent \n\"" ); + return; + } + + num = ev->GetInteger( 1 ); + if ( ( num < 0 ) || ( num >= globals.max_entities ) ) + { + gi.SendServerCommand( edict-g_entities, "print \"Value out of range. Possible values range from 0 to %d.\n\"", globals.max_entities ); + return; + } + + ent = G_GetEntity( num ); + ent->Damage( world, world, ent->max_health + 25, origin, vec_zero, vec_zero, 0, 0, 0 ); + } + +//==================== +//Player::RemoveEnt +//==================== +void Player::RemoveEnt + ( + Event * ev + ) + + { + int num; + Entity *ent; + + if ( ev->NumArgs() != 1 ) + { + gi.SendServerCommand( edict-g_entities, "print \"Usage: removeent \n\"" ); + return; + } + + num = ev->GetInteger( 1 ); + if ( ( num < 0 ) || ( num >= globals.max_entities ) ) + { + gi.SendServerCommand( edict-g_entities, "print \"Value out of range. Possible values range from 0 to %d.\n\"", globals.max_entities ); + return; + } + + ent = G_GetEntity( num ); + ent->PostEvent( Event( EV_Remove ), 0 ); + } + +//==================== +//Player::KillClass +//==================== +void Player::KillClass + ( + Event * ev + ) + + { + int except; + str classname; + gentity_t * from; + Entity *ent; + + if ( ev->NumArgs() < 1 ) + { + gi.SendServerCommand( edict-g_entities, "print \"Usage: killclass [except entity number]\n\"" ); + return; + } + + classname = ev->GetString( 1 ); + + except = 0; + if ( ev->NumArgs() == 2 ) + { + except = ev->GetInteger( 1 ); + } + + for ( from = this->edict + 1; from < &g_entities[ globals.num_entities ]; from++ ) + { + if ( !from->inuse ) + { + continue; + } + + assert( from->entity ); + + ent = from->entity; + + if ( ent->entnum == except ) + { + continue; + } + + if ( ent->inheritsFrom( classname.c_str() ) ) + { + ent->Damage( world, world, ent->max_health + 25, origin, vec_zero, vec_zero, 0, 0, 0 ); + } + } + } + +//==================== +//Player::RemoveClass +//==================== +void Player::RemoveClass + ( + Event * ev + ) + + { + int except; + str classname; + gentity_t * from; + Entity *ent; + + if ( ev->NumArgs() < 1 ) + { + gi.SendServerCommand( edict-g_entities, "print \"Usage: removeclass [except entity number]\n\"" ); + return; + } + + classname = ev->GetString( 1 ); + + except = 0; + if ( ev->NumArgs() == 2 ) + { + except = ev->GetInteger( 1 ); + } + + for ( from = this->edict + 1; from < &g_entities[ globals.num_entities ]; from++ ) + { + if ( !from->inuse ) + { + continue; + } + + assert( from->entity ); + + ent = from->entity; + + if ( ent->entnum == except ) + continue; + + if ( ent->inheritsFrom( classname.c_str() ) ) + { + ent->PostEvent( Event( EV_Remove ), 0 ); + } + } + } + +//==================== +//Player::TestThread +//==================== +void Player::TestThread + ( + Event *ev + ) + + { + const char *scriptfile; + const char *label = NULL; + ScriptThread * thread; + + if ( ev->NumArgs() < 1 ) + { + gi.SendServerCommand( edict-g_entities, "print \"Syntax: testthread scriptfile

    6jFRasCv!JeHYfx5*bb`@ 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 z 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¥a@_h3Cpx=U)^5 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

  • fTTns(asl1VbH(u0#Hf0@lon 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 M32MgiI4GX~2P>+^y#N3J literal 0 HcmV?d00001 diff --git a/bin/max2plugins/uvout.dle b/bin/max2plugins/uvout.dle new file mode 100644 index 0000000000000000000000000000000000000000..131e58a9e8c311b53c02b779eb1252f250df3a26 GIT binary patch literal 102470 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℞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 literal 0 HcmV?d00001 diff --git a/bin/max3plugins/animout.dle b/bin/max3plugins/animout.dle new file mode 100644 index 0000000000000000000000000000000000000000..74b3118e46fa72beb0db0829303032beb949f724 GIT binary patch literal 110666 zcmeI44Om;pneRs+5|RibyCzK&r%@8CaZ;~WAS4hnv9M8tQ*ZG6+i;5EY`u zxuM08X{{XVxx}@5({9?@H%`~x&8A6{-Njue7k@N3t+O{@d#{t=+ib6!D+-%+6Y7wb z=IsBSBZ0ue#BHB_vfWqDGjrz5yz|aGzjF1L19Fb0l zc{lxNo_PAI7jEv?Rlaa@tv}FVY7Ygsg}kk%25(ziFl^fDGle?aOo292`8{h*t-(g$ zvYec&7bjFdb%XiLd-r};NrpX5cPYQddAP}~T);8=b7jiAINs#DCvkMi{P*s?TX_lj z`+XZ^KGi3=?9XZCmiwv__3u%}kY5vM@RQ8U9(mkCRO+q}e-+CtPL{nX=G}Y^@`MK+ zG!Y#keql#sOaw|L(!`B^$)o5&ipucIkTFi=dGe^84m9b+lTa@_da;M(w&=x?NhPwP z7Pad&6SnBYqLl2plI1me(NFqk`7I0ky22=X;w}i0ebiTJ=Trp~tXdXo^oG4cd?6e8 zutCbuG3DoiyDZbh#ON#Nb$ddNjwwIL4J-?2f-hW&0`y(#>q#RQ>IgMJL^1&zDc5(A zoNHOg*Aj%_!x%0BR#NW3MRF@q%0DK+1egF5U;<2l2`~XBzyz4Ue`*4!={J1sVj+gh za0@kTFd_Q*0z|h^-tTbtJ6u5pk7OZQb2FlixXT(2Q{Go7b?=Rc+_;?^c2N!IClUP} z?iPn%`WT`KDqVjIqP;gEY9*1~)J6kEkAED|?IgF0YN({|CzR@?QbE;jplaWs=-^d| zj$VW4@2Rz0DEc-TR7}wcvhQ)+A`gF)w4A#YQ7)zKrOvpi)FbtgeHZ2GU>= z-nkahSyFnKTDz50{Ude%eNz84>HD7iKs(Hm6vT8ieAEkk5l5k(7#_*se$(`ke>e}^=G zf`n@c;=j`A9k4}?Do1~U1nQL0$f#@Wy7h6mwW#0xUzA^b{zOVYC(DnV{%NK$zWR5n zI!#EHm!p2PYC@@+h+jXUs)~DJP%PS_Ga@lf7<#A4lbk8NT+)Qe_UE*3@eZ9a{)6An zVc)$FkoGN3-|jT~(4W6a_Gih5lfNMKXGh-D^$vs$AW|J)jcFJ;sh@;#Tz`rAG_8H& zBin@`Z~taS&on}*^78rI4B)c7A~8Ph?5KM@(mgK186#Krx1dKOS^a(-v`Xm=o2I{g zQgqTqE~~s}j{5uND4#Mlefx8j`!06zRQuCWkmZx}BmQSIHB6QtIYskh)%!C>X|mk! z`nWL0zl)_7zA$5ulFpu-AJm?v@A{deo@y`6w?#7rQgl&rru_F{p!ENfU_I%QlQ^fz z&*D$bs{b$U62``ZU?Dt>Q8OJQqaNvG=bQEM)3|`3lTmkk&^;jwyW=99qg2J?pBPuw zsQcW=m4ohcRHC@gMctziQ}I*Wqe|6SV>E|K(hbIpzRm1kf4ev7%99;R?SH@N>ZIQ3 z<(1m}@ZXU2PY(Z)u7ZkK)mU78PgOliRd&1#HY@Jz^af4S-*f5qX}nfz%2L;d+i~T+ zy!9brZ?o>835%X$RC4I3?zLoKKwv6zsYT1h}6B6*nwbW@N&OCoH zS>eux(0FzH`xjI-a?)TONDnN{7+xw1e0Pq%2!GIq==bk(?k;*Gk=pG544v8S++BA- zsyWj?fT5fsndtLL*=IxVK<=(g64U$p=MWo$<&n}jNSbnE{|hHGbRMLlNyza-*OMz` z54y)7Dn_otbch_&MXSb?x-n-S$#!>G2M(M^0^l2z99jLJvvwY%L8^w-v7cw{JWeMy zsYB$L-j4ram>r9SG3Tn)yiu)J&BDK%viDPVO|ww*YT+HjJLJS1b7oOfow-_*WRz_C zk2K1c@_%on#bce2p^d&PDI1w||h1^izqTJ;=Gp5&256(`9}6fjsFv zFL(YqY4pD;9lstGy4CX~9-$nho7x=|XCstMQ-*-eZ+(Aal|wm>&7F;by39KnE8_*$trc@ivB^V7>c&w!l^9Gh*r}UGMU*pO?wi~me;aQV(88^X6sSu zwT;;$3zfR~;7UDpK*9Ccl})MP0-Dss6vbd#n|Ugp^^U5V>5aWoH5%0o|3ARR@M=yA z7s}Ke4FfLSSUP;du`{I$ASWsvd2*_N6=n9(5YE2gx%Bk@4__+Rr_&&S^{H9kOzXcV zeqtfbV}rj3`OPA+5Xb*U%T4+w+-*X-+XRMPTYht6UqcOC9WZ?Alv`GfOCKJGefQLGPCTI1Jm#Wk&Wf;Mx>OPvvyx(T`PQFe9mQuljx2=+%t>HgQh z91YRvs(Itm9;`tVk?sl6xmeAcK#r1)Yi(Q>={;n>--H_RpN-1x62|yLwJ+Oqp*?B} zQ?0sLr_>p+430_7MyJ~t&hfiQbFb8ViF*y2T#|n|)(5DJVYbo|On42m;f=+JYjylq zT&A#V#j@>5pq8$ER_o4(>Pw>i$SB>P%Gyt9Cc}zmeGHw$6sU8K{wUR0jSPF$Kbg}Iu-k-wv6 z)w}_1^geXw(yU&RcVa)Qz@2-$FqL*bLovB~I8RH@M>==cZ(-lCfi9XkLzoWL{w?Ip z`|pD=Mm(`^i}ljE$3HB$Ddc1ow5wP1DsfQqmSAsQqgB)drz*y%VzvL5R1y9-t>W1% z3o5=QH-p$lon5rpzkwQ`uEQ8h=om?-BWc-aI?Md=X;sMaFobHJ2Uc4LhOYwvxcAO~ zrb|*Z)(%S}&rqxjFVGShxx0Qrd`1y9e$PUk1=cv}s*&7MsR3!;w?n*C`b(q#PBpYD^3_66Nb)hda=Z>5YG}u@I@CY#$^J9$T1;f~VxQ&m{ZSA1E^S~gB z=dx(;D*W`Mk0vm#kOn0~F{%r+5?xHrCQtnBIIXGrSgep7T*;Gn$r*`Ve_t_8sBGFQ z%EqGmTOgHac;){`!{^n!KA5VUQl9(fd+$qUNfZ~QDJH*A^2np2`zxU7AZ0{*E0I+5 z_CQax*Mj65GS)mo$sxap#x@{d$t$Gv{!K{72cch^c|$jDXwVsd_U46?y70n5IT;DT zU=~RWvCwspT6FeOi}%gb)(2;d8vXJofxZ%z{fiMLFK&ZbBu^@|CBZ3ey)Q>v>y*}h z*_5m}hMAtMs7R&J9IcxaJ7s6PC!0BtA}y_YgrpJ-<-(QwgHzF%i#ltgqR4YPtu*%s z=c9kSobvZm{OSE96WzZQ@f*DqpRqj*gp2FrZnF;8Rzq}UO4aPypii#f*pEFz>vp8{9AeRF8qA^uJR7?aD!@i# zA67T4vuYl`4mPHasbMzt+Vf@FzxFp`b((oKNIb8W<UyHB53?_C)BKa#Z#hft&$b#)pRcrj((2iRii7kujOdx+{TInAGne>j{l`_$HRJik zjB>mmZ=}aAvl^II{vxX;m&a-SpBᖌJ8eAd5l(fDjc$1gcPs+q2rs+k^asb+f1 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 literal 0 HcmV?d00001 diff --git a/bin/max3plugins/animout.ilk b/bin/max3plugins/animout.ilk new file mode 100644 index 0000000000000000000000000000000000000000..c6d28faa32107f382639e3196b6a296932b9709f GIT binary patch literal 111856 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